From 29a2ac2e7a23d92c87fd4315c4e383571e3980cd Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 1 Aug 2020 00:39:17 +0200 Subject: [PATCH] remove vendor --- .gitignore | 3 +- vendor/autoload.php | 7 - vendor/bin/pdepend | 1 - vendor/bin/phan | 1 - vendor/bin/phan_client | 1 - vendor/bin/php-cs-fixer | 1 - vendor/bin/phpcbf | 1 - vendor/bin/phpcs | 1 - vendor/bin/phpmd | 1 - vendor/bin/phpstan | 1 - vendor/bin/phpstan.phar | 1 - vendor/bin/phpunit | 1 - vendor/bin/tocheckstyle | 1 - vendor/composer/ClassLoader.php | 445 - vendor/composer/LICENSE | 21 - vendor/composer/autoload_classmap.php | 745 - vendor/composer/autoload_files.php | 22 - vendor/composer/autoload_namespaces.php | 11 - vendor/composer/autoload_psr4.php | 44 - vendor/composer/autoload_real.php | 73 - vendor/composer/autoload_static.php | 1001 - vendor/composer/installed.json | 3832 ---- vendor/composer/semver/CHANGELOG.md | 78 - vendor/composer/semver/LICENSE | 19 - vendor/composer/semver/README.md | 70 - vendor/composer/semver/composer.json | 57 - vendor/composer/semver/src/Comparator.php | 111 - .../src/Constraint/AbstractConstraint.php | 63 - .../semver/src/Constraint/Constraint.php | 215 - .../src/Constraint/ConstraintInterface.php | 32 - .../semver/src/Constraint/EmptyConstraint.php | 59 - .../semver/src/Constraint/MultiConstraint.php | 120 - vendor/composer/semver/src/Semver.php | 127 - vendor/composer/semver/src/VersionParser.php | 545 - vendor/composer/xdebug-handler/CHANGELOG.md | 74 - vendor/composer/xdebug-handler/LICENSE | 21 - vendor/composer/xdebug-handler/README.md | 289 - vendor/composer/xdebug-handler/composer.json | 40 - .../composer/xdebug-handler/src/PhpConfig.php | 73 - .../composer/xdebug-handler/src/Process.php | 181 - vendor/composer/xdebug-handler/src/Status.php | 163 - .../xdebug-handler/src/XdebugHandler.php | 572 - .../annotations/.doctrine-project.json | 40 - vendor/doctrine/annotations/CHANGELOG.md | 162 - vendor/doctrine/annotations/LICENSE | 19 - vendor/doctrine/annotations/README.md | 17 - vendor/doctrine/annotations/composer.json | 44 - .../annotations/docs/en/annotations.rst | 271 - .../doctrine/annotations/docs/en/custom.rst | 353 - vendor/doctrine/annotations/docs/en/index.rst | 97 - .../doctrine/annotations/docs/en/sidebar.rst | 6 - .../Common/Annotations/Annotation.php | 79 - .../Annotations/Annotation/Attribute.php | 47 - .../Annotations/Annotation/Attributes.php | 37 - .../Common/Annotations/Annotation/Enum.php | 84 - .../Annotation/IgnoreAnnotation.php | 54 - .../Annotations/Annotation/Required.php | 33 - .../Common/Annotations/Annotation/Target.php | 107 - .../Annotations/AnnotationException.php | 197 - .../Common/Annotations/AnnotationReader.php | 418 - .../Common/Annotations/AnnotationRegistry.php | 180 - .../Common/Annotations/CachedReader.php | 278 - .../Doctrine/Common/Annotations/DocLexer.php | 147 - .../Doctrine/Common/Annotations/DocParser.php | 1221 -- .../Common/Annotations/FileCacheReader.php | 290 - .../Common/Annotations/IndexedReader.php | 119 - .../Doctrine/Common/Annotations/PhpParser.php | 91 - .../Doctrine/Common/Annotations/Reader.php | 89 - .../Annotations/SimpleAnnotationReader.php | 127 - .../Common/Annotations/TokenParser.php | 194 - .../doctrine/annotations/phpbench.json.dist | 4 - vendor/doctrine/annotations/phpstan.neon | 14 - .../instantiator/.doctrine-project.json | 26 - .../doctrine/instantiator/.github/FUNDING.yml | 3 - vendor/doctrine/instantiator/CONTRIBUTING.md | 35 - vendor/doctrine/instantiator/LICENSE | 19 - vendor/doctrine/instantiator/README.md | 39 - vendor/doctrine/instantiator/composer.json | 52 - .../doctrine/instantiator/docs/en/index.rst | 68 - .../doctrine/instantiator/docs/en/sidebar.rst | 4 - vendor/doctrine/instantiator/phpbench.json | 4 - vendor/doctrine/instantiator/phpcs.xml.dist | 35 - .../doctrine/instantiator/phpstan.neon.dist | 19 - .../Exception/ExceptionInterface.php | 12 - .../Exception/InvalidArgumentException.php | 37 - .../Exception/UnexpectedValueException.php | 48 - .../Doctrine/Instantiator/Instantiator.php | 203 - .../Instantiator/InstantiatorInterface.php | 20 - vendor/doctrine/lexer/LICENSE | 19 - vendor/doctrine/lexer/README.md | 9 - vendor/doctrine/lexer/composer.json | 41 - .../Doctrine/Common/Lexer/AbstractLexer.php | 328 - .../advanced-json-rpc/.travis.yml | 43 - vendor/felixfbecker/advanced-json-rpc/LICENSE | 15 - .../advanced-json-rpc/composer.json | 32 - .../advanced-json-rpc/lib/Dispatcher.php | 172 - .../advanced-json-rpc/lib/Error.php | 38 - .../advanced-json-rpc/lib/ErrorCode.php | 48 - .../advanced-json-rpc/lib/ErrorResponse.php | 40 - .../advanced-json-rpc/lib/Message.php | 52 - .../advanced-json-rpc/lib/Notification.php | 56 - .../advanced-json-rpc/lib/Request.php | 63 - .../advanced-json-rpc/lib/Response.php | 40 - .../advanced-json-rpc/lib/SuccessResponse.php | 40 - vendor/friendsofphp/php-cs-fixer/CHANGELOG.md | 3249 --- .../friendsofphp/php-cs-fixer/CONTRIBUTING.md | 43 - vendor/friendsofphp/php-cs-fixer/LICENSE | 20 - vendor/friendsofphp/php-cs-fixer/README.rst | 2203 -- vendor/friendsofphp/php-cs-fixer/UPGRADE.md | 184 - .../php-cs-fixer/ci-integration.sh | 8 - .../friendsofphp/php-cs-fixer/composer.json | 83 - .../php-cs-fixer/doc/COOKBOOK-FIXERS.md | 530 - .../php-cs-fixer/doc/checkstyle.xsd | 44 - .../php-cs-fixer/doc/junit-10.xsd | 135 - .../friendsofphp/php-cs-fixer/doc/schema.json | 47 - vendor/friendsofphp/php-cs-fixer/doc/xml.xsd | 83 - vendor/friendsofphp/php-cs-fixer/php-cs-fixer | 99 - .../src/AbstractAlignFixerHelper.php | 122 - .../src/AbstractDoctrineAnnotationFixer.php | 221 - .../php-cs-fixer/src/AbstractFixer.php | 227 - .../src/AbstractFopenFlagFixer.php | 127 - .../src/AbstractFunctionReferenceFixer.php | 67 - .../src/AbstractLinesBeforeNamespaceFixer.php | 110 - .../src/AbstractNoUselessElseFixer.php | 207 - .../src/AbstractPhpdocTypesFixer.php | 135 - .../php-cs-fixer/src/AbstractProxyFixer.php | 122 - .../src/AbstractPsrAutoloadingFixer.php | 87 - .../php-cs-fixer/src/Cache/Cache.php | 138 - .../php-cs-fixer/src/Cache/CacheInterface.php | 56 - .../src/Cache/CacheManagerInterface.php | 35 - .../php-cs-fixer/src/Cache/Directory.php | 53 - .../src/Cache/DirectoryInterface.php | 26 - .../src/Cache/FileCacheManager.php | 122 - .../php-cs-fixer/src/Cache/FileHandler.php | 99 - .../src/Cache/FileHandlerInterface.php | 33 - .../src/Cache/NullCacheManager.php | 30 - .../php-cs-fixer/src/Cache/Signature.php | 110 - .../src/Cache/SignatureInterface.php | 53 - .../friendsofphp/php-cs-fixer/src/Config.php | 280 - .../php-cs-fixer/src/ConfigInterface.php | 194 - .../InvalidConfigurationException.php | 40 - .../InvalidFixerConfigurationException.php | 54 - ...validForEnvFixerConfigurationException.php | 22 - .../RequiredFixerConfigurationException.php | 22 - .../php-cs-fixer/src/Console/Application.php | 122 - .../src/Console/Command/DescribeCommand.php | 415 - .../Command/DescribeNameNotFoundException.php | 59 - .../src/Console/Command/FixCommand.php | 270 - .../FixCommandExitStatusCalculator.php | 58 - .../src/Console/Command/HelpCommand.php | 637 - .../src/Console/Command/ReadmeCommand.php | 279 - .../src/Console/Command/SelfUpdateCommand.php | 177 - .../src/Console/ConfigurationResolver.php | 941 - .../src/Console/Output/ErrorOutput.php | 154 - .../src/Console/Output/NullOutput.php | 23 - .../src/Console/Output/ProcessOutput.php | 145 - .../Console/Output/ProcessOutputInterface.php | 21 - .../src/Console/SelfUpdate/GithubClient.php | 52 - .../SelfUpdate/GithubClientInterface.php | 24 - .../Console/SelfUpdate/NewVersionChecker.php | 114 - .../SelfUpdate/NewVersionCheckerInterface.php | 46 - .../src/Console/WarningsDetector.php | 74 - .../src/Differ/DiffConsoleFormatter.php | 102 - .../src/Differ/DifferInterface.php | 31 - .../php-cs-fixer/src/Differ/FullDiffer.php | 48 - .../php-cs-fixer/src/Differ/NullDiffer.php | 27 - .../src/Differ/SebastianBergmannDiffer.php | 39 - .../Differ/SebastianBergmannShortDiffer.php | 39 - .../php-cs-fixer/src/Differ/UnifiedDiffer.php | 43 - .../php-cs-fixer/src/DocBlock/Annotation.php | 323 - .../php-cs-fixer/src/DocBlock/DocBlock.php | 269 - .../php-cs-fixer/src/DocBlock/Line.php | 144 - .../src/DocBlock/ShortDescription.php | 65 - .../php-cs-fixer/src/DocBlock/Tag.php | 111 - .../src/DocBlock/TagComparator.php | 57 - .../src/Doctrine/Annotation/Token.php | 99 - .../src/Doctrine/Annotation/Tokens.php | 377 - .../php-cs-fixer/src/Error/Error.php | 118 - .../php-cs-fixer/src/Error/ErrorsManager.php | 79 - .../php-cs-fixer/src/Event/Event.php | 29 - .../php-cs-fixer/src/FileReader.php | 87 - .../php-cs-fixer/src/FileRemoval.php | 80 - .../friendsofphp/php-cs-fixer/src/Finder.php | 35 - .../Fixer/Alias/BacktickToShellExecFixer.php | 145 - .../src/Fixer/Alias/EregToPregFixer.php | 184 - .../src/Fixer/Alias/MbStrFunctionsFixer.php | 130 - .../src/Fixer/Alias/NoAliasFunctionsFixer.php | 227 - .../src/Fixer/Alias/NoMixedEchoPrintFixer.php | 162 - .../Fixer/Alias/PowToExponentiationFixer.php | 211 - .../Fixer/Alias/RandomApiMigrationFixer.php | 167 - .../src/Fixer/Alias/SetTypeToCastFixer.php | 249 - .../Fixer/ArrayNotation/ArraySyntaxFixer.php | 149 - ...tilineWhitespaceAroundDoubleArrowFixer.php | 86 - .../NoTrailingCommaInSinglelineArrayFixer.php | 89 - .../NoWhitespaceBeforeCommaInArrayFixer.php | 152 - .../NormalizeIndexBraceFixer.php | 59 - .../TrailingCommaInMultilineArrayFixer.php | 147 - .../ArrayNotation/TrimArraySpacesFixer.php | 103 - .../WhitespaceAfterCommaInArrayFixer.php | 104 - .../src/Fixer/Basic/BracesFixer.php | 1070 - .../src/Fixer/Basic/EncodingFixer.php | 94 - .../Basic/NonPrintableCharacterFixer.php | 180 - .../src/Fixer/Basic/Psr0Fixer.php | 171 - .../src/Fixer/Basic/Psr4Fixer.php | 100 - .../src/Fixer/Casing/ConstantCaseFixer.php | 146 - .../Fixer/Casing/LowercaseConstantsFixer.php | 60 - .../Fixer/Casing/LowercaseKeywordsFixer.php | 75 - .../Casing/LowercaseStaticReferenceFixer.php | 105 - .../Fixer/Casing/MagicConstantCasingFixer.php | 98 - .../Fixer/Casing/MagicMethodCasingFixer.php | 228 - .../Casing/NativeFunctionCasingFixer.php | 117 - ...tiveFunctionTypeDeclarationCasingFixer.php | 177 - .../Fixer/CastNotation/CastSpacesFixer.php | 129 - .../Fixer/CastNotation/LowercaseCastFixer.php | 95 - .../ModernizeTypesCastingFixer.php | 159 - .../CastNotation/NoShortBoolCastFixer.php | 106 - .../Fixer/CastNotation/NoUnsetCastFixer.php | 90 - .../CastNotation/ShortScalarCastFixer.php | 86 - .../ClassAttributesSeparationFixer.php | 392 - .../ClassNotation/ClassDefinitionFixer.php | 436 - .../Fixer/ClassNotation/FinalClassFixer.php | 60 - .../ClassNotation/FinalInternalClassFixer.php | 214 - ...FinalPublicMethodForAbstractClassFixer.php | 168 - .../ClassNotation/FinalStaticAccessFixer.php | 154 - .../ClassNotation/MethodSeparationFixer.php | 84 - .../NoBlankLinesAfterClassOpeningFixer.php | 101 - .../NoNullPropertyInitializationFixer.php | 98 - .../ClassNotation/NoPhp4ConstructorFixer.php | 390 - .../NoUnneededFinalMethodFixer.php | 143 - .../OrderedClassElementsFixer.php | 500 - .../ClassNotation/OrderedInterfacesFixer.php | 231 - .../ClassNotation/ProtectedToPrivateFixer.php | 140 - .../Fixer/ClassNotation/SelfAccessorFixer.php | 191 - .../ClassNotation/SelfStaticAccessorFixer.php | 206 - .../SingleClassElementPerStatementFixer.php | 242 - .../SingleTraitInsertPerStatementFixer.php | 119 - .../ClassNotation/VisibilityRequiredFixer.php | 202 - .../ClassUsage/DateTimeImmutableFixer.php | 162 - .../Fixer/Comment/CommentToPhpdocFixer.php | 232 - .../Fixer/Comment/HashToSlashCommentFixer.php | 58 - .../src/Fixer/Comment/HeaderCommentFixer.php | 452 - .../MultilineCommentOpeningClosingFixer.php | 95 - .../src/Fixer/Comment/NoEmptyCommentFixer.php | 173 - .../NoTrailingWhitespaceInCommentFixer.php | 85 - .../Comment/SingleLineCommentStyleFixer.php | 168 - .../src/Fixer/ConfigurableFixerInterface.php | 51 - .../ConfigurationDefinitionFixerInterface.php | 28 - .../NativeConstantInvocationFixer.php | 284 - .../Fixer/ControlStructure/ElseifFixer.php | 102 - .../Fixer/ControlStructure/IncludeFixer.php | 153 - .../NoAlternativeSyntaxFixer.php | 227 - .../ControlStructure/NoBreakCommentFixer.php | 369 - .../NoSuperfluousElseifFixer.php | 113 - .../NoTrailingCommaInListCallFixer.php | 74 - .../NoUnneededControlParenthesesFixer.php | 189 - .../NoUnneededCurlyBracesFixer.php | 177 - .../ControlStructure/NoUselessElseFixer.php | 127 - .../SwitchCaseSemicolonToColonFixer.php | 113 - .../ControlStructure/SwitchCaseSpaceFixer.php | 92 - .../Fixer/ControlStructure/YodaStyleFixer.php | 750 - .../src/Fixer/DefinedFixerInterface.php | 29 - .../src/Fixer/DeprecatedFixerInterface.php | 26 - ...DoctrineAnnotationArrayAssignmentFixer.php | 104 - .../DoctrineAnnotationBracesFixer.php | 123 - .../DoctrineAnnotationIndentationFixer.php | 199 - .../DoctrineAnnotationSpacesFixer.php | 349 - .../php-cs-fixer/src/Fixer/FixerInterface.php | 77 - .../CombineNestedDirnameFixer.php | 234 - .../FunctionNotation/FopenFlagOrderFixer.php | 130 - .../FunctionNotation/FopenFlagsFixer.php | 114 - .../FunctionDeclarationFixer.php | 217 - .../FunctionTypehintSpaceFixer.php | 94 - .../FunctionNotation/ImplodeCallFixer.php | 150 - .../MethodArgumentSpaceFixer.php | 511 - .../NativeFunctionInvocationFixer.php | 424 - .../NoSpacesAfterFunctionNameFixer.php | 184 - ...NoUnreachableDefaultArgumentValueFixer.php | 218 - ...ypeDeclarationForDefaultNullValueFixer.php | 151 - .../PhpdocToParamTypeFixer.php | 420 - .../PhpdocToReturnTypeFixer.php | 378 - .../ReturnTypeDeclarationFixer.php | 133 - .../FunctionNotation/SingleLineThrowFixer.php | 149 - .../FunctionNotation/StaticLambdaFixer.php | 149 - .../FunctionNotation/VoidReturnFixer.php | 259 - .../Import/FullyQualifiedStrictTypesFixer.php | 178 - .../Import/GlobalNamespaceImportFixer.php | 751 - .../Import/NoLeadingImportSlashFixer.php | 99 - .../src/Fixer/Import/NoUnusedImportsFixer.php | 277 - .../src/Fixer/Import/OrderedImportsFixer.php | 534 - .../Import/SingleImportPerStatementFixer.php | 252 - .../Import/SingleLineAfterImportsFixer.php | 158 - .../ClassKeywordRemoveFixer.php | 248 - .../CombineConsecutiveIssetsFixer.php | 172 - .../CombineConsecutiveUnsetsFixer.php | 191 - .../DeclareEqualNormalizeFixer.php | 140 - .../LanguageConstruct/DirConstantFixer.php | 131 - .../ErrorSuppressionFixer.php | 175 - .../ExplicitIndirectVariableFixer.php | 91 - .../FunctionToConstantFixer.php | 320 - .../Fixer/LanguageConstruct/IsNullFixer.php | 203 - .../NoUnsetOnPropertyFixer.php | 231 - .../SilencedDeprecationErrorFixer.php | 55 - .../Fixer/ListNotation/ListSyntaxFixer.php | 149 - .../BlankLineAfterNamespaceFixer.php | 144 - .../NoBlankLinesBeforeNamespaceFixer.php | 73 - .../NoLeadingNamespaceWhitespaceFixer.php | 101 - .../SingleBlankLineBeforeNamespaceFixer.php | 70 - .../Fixer/Naming/NoHomoglyphNamesFixer.php | 244 - .../Operator/AlignDoubleArrowFixerHelper.php | 151 - .../Fixer/Operator/AlignEqualsFixerHelper.php | 78 - .../Operator/BinaryOperatorSpacesFixer.php | 833 - .../src/Fixer/Operator/ConcatSpaceFixer.php | 161 - .../Fixer/Operator/IncrementStyleFixer.php | 217 - .../Fixer/Operator/LogicalOperatorsFixer.php | 76 - .../src/Fixer/Operator/NewWithBracesFixer.php | 150 - .../Operator/NotOperatorWithSpaceFixer.php | 81 - .../NotOperatorWithSuccessorSpaceFixer.php | 79 - .../ObjectOperatorWithoutWhitespaceFixer.php | 67 - .../src/Fixer/Operator/PreIncrementFixer.php | 56 - .../Operator/StandardizeIncrementFixer.php | 167 - .../Operator/StandardizeNotEqualsFixer.php | 66 - .../Operator/TernaryOperatorSpacesFixer.php | 121 - .../Operator/TernaryToNullCoalescingFixer.php | 215 - .../Operator/UnaryOperatorSpacesFixer.php | 78 - .../PhpTag/BlankLineAfterOpeningTagFixer.php | 98 - .../src/Fixer/PhpTag/FullOpeningTagFixer.php | 131 - .../PhpTag/LinebreakAfterOpeningTagFixer.php | 73 - .../src/Fixer/PhpTag/NoClosingTagFixer.php | 69 - .../src/Fixer/PhpTag/NoShortEchoTagFixer.php | 80 - .../Fixer/PhpUnit/PhpUnitConstructFixer.php | 218 - .../PhpUnit/PhpUnitDedicateAssertFixer.php | 443 - ...PhpUnitDedicateAssertInternalTypeFixer.php | 200 - .../Fixer/PhpUnit/PhpUnitExpectationFixer.php | 282 - .../PhpUnit/PhpUnitFqcnAnnotationFixer.php | 104 - .../PhpUnit/PhpUnitInternalClassFixer.php | 234 - .../PhpUnit/PhpUnitMethodCasingFixer.php | 278 - .../src/Fixer/PhpUnit/PhpUnitMockFixer.php | 150 - .../PhpUnitMockShortWillReturnFixer.php | 145 - .../Fixer/PhpUnit/PhpUnitNamespacedFixer.php | 225 - .../PhpUnitNoExpectationAnnotationFixer.php | 302 - .../PhpUnit/PhpUnitOrderedCoversFixer.php | 107 - .../PhpUnitSetUpTearDownVisibilityFixer.php | 140 - .../Fixer/PhpUnit/PhpUnitSizeClassFixer.php | 270 - .../src/Fixer/PhpUnit/PhpUnitStrictFixer.php | 154 - .../Fixer/PhpUnit/PhpUnitTargetVersion.php | 61 - .../PhpUnit/PhpUnitTestAnnotationFixer.php | 533 - .../PhpUnitTestCaseStaticMethodCallsFixer.php | 474 - .../PhpUnitTestClassRequiresCoversFixer.php | 150 - .../Phpdoc/AlignMultilineCommentFixer.php | 171 - .../GeneralPhpdocAnnotationRemoveFixer.php | 130 - .../Phpdoc/NoBlankLinesAfterPhpdocFixer.php | 113 - .../src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php | 71 - .../Phpdoc/NoSuperfluousPhpdocTagsFixer.php | 506 - .../PhpdocAddMissingParamAnnotationFixer.php | 278 - .../src/Fixer/Phpdoc/PhpdocAlignFixer.php | 434 - .../PhpdocAnnotationWithoutDotFixer.php | 132 - .../src/Fixer/Phpdoc/PhpdocIndentFixer.php | 139 - .../src/Fixer/Phpdoc/PhpdocInlineTagFixer.php | 107 - .../src/Fixer/Phpdoc/PhpdocLineSpanFixer.php | 168 - .../src/Fixer/Phpdoc/PhpdocNoAccessFixer.php | 70 - .../Fixer/Phpdoc/PhpdocNoAliasTagFixer.php | 178 - .../Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php | 123 - .../src/Fixer/Phpdoc/PhpdocNoPackageFixer.php | 70 - .../Phpdoc/PhpdocNoUselessInheritdocFixer.php | 190 - .../src/Fixer/Phpdoc/PhpdocOrderFixer.php | 171 - .../Phpdoc/PhpdocReturnSelfReferenceFixer.php | 228 - .../src/Fixer/Phpdoc/PhpdocScalarFixer.php | 125 - .../Fixer/Phpdoc/PhpdocSeparationFixer.php | 172 - .../PhpdocSingleLineVarSpacingFixer.php | 108 - .../src/Fixer/Phpdoc/PhpdocSummaryFixer.php | 104 - .../src/Fixer/Phpdoc/PhpdocToCommentFixer.php | 97 - ...rimConsecutiveBlankLineSeparationFixer.php | 217 - .../src/Fixer/Phpdoc/PhpdocTrimFixer.php | 129 - .../src/Fixer/Phpdoc/PhpdocTypesFixer.php | 163 - .../Fixer/Phpdoc/PhpdocTypesOrderFixer.php | 223 - .../PhpdocVarAnnotationCorrectOrderFixer.php | 78 - .../Phpdoc/PhpdocVarWithoutNameFixer.php | 151 - .../BlankLineBeforeReturnFixer.php | 71 - .../ReturnNotation/NoUselessReturnFixer.php | 112 - .../ReturnNotation/ReturnAssignmentFixer.php | 374 - .../SimplifiedNullReturnFixer.php | 170 - ...ltilineWhitespaceBeforeSemicolonsFixer.php | 304 - .../Fixer/Semicolon/NoEmptyStatementFixer.php | 162 - ...ltilineWhitespaceBeforeSemicolonsFixer.php | 68 - ...glelineWhitespaceBeforeSemicolonsFixer.php | 75 - .../SemicolonAfterInstructionFixer.php | 63 - .../Semicolon/SpaceAfterSemicolonFixer.php | 145 - .../Fixer/Strict/DeclareStrictTypesFixer.php | 152 - .../Fixer/Strict/StrictComparisonFixer.php | 86 - .../src/Fixer/Strict/StrictParamFixer.php | 164 - .../EscapeImplicitBackslashesFixer.php | 167 - .../ExplicitStringVariableFixer.php | 172 - .../StringNotation/HeredocToNowdocFixer.php | 115 - .../StringNotation/NoBinaryStringFixer.php | 65 - .../SimpleToComplexStringVariableFixer.php | 113 - .../Fixer/StringNotation/SingleQuoteFixer.php | 116 - .../StringNotation/StringLineEndingFixer.php | 85 - .../Whitespace/ArrayIndentationFixer.php | 400 - .../BlankLineBeforeStatementFixer.php | 367 - .../CompactNullableTypehintFixer.php | 79 - .../Whitespace/HeredocIndentationFixer.php | 167 - .../Fixer/Whitespace/IndentationTypeFixer.php | 163 - .../src/Fixer/Whitespace/LineEndingFixer.php | 102 - .../MethodChainingIndentationFixer.php | 202 - .../Whitespace/NoExtraBlankLinesFixer.php | 484 - .../NoExtraConsecutiveBlankLinesFixer.php | 73 - .../Whitespace/NoSpacesAroundOffsetFixer.php | 107 - .../NoSpacesInsideParenthesisFixer.php | 110 - .../Whitespace/NoTrailingWhitespaceFixer.php | 114 - .../NoWhitespaceInBlankLineFixer.php | 103 - .../Whitespace/SingleBlankLineAtEofFixer.php | 73 - .../Fixer/WhitespacesAwareFixerInterface.php | 23 - .../FixerConfiguration/AliasedFixerOption.php | 103 - .../AliasedFixerOptionBuilder.php | 94 - .../FixerConfiguration/AllowedValueSubset.php | 53 - .../DeprecatedFixerOption.php | 99 - .../DeprecatedFixerOptionInterface.php | 21 - .../FixerConfigurationResolver.php | 128 - .../FixerConfigurationResolverInterface.php | 28 - .../FixerConfigurationResolverRootless.php | 99 - .../src/FixerConfiguration/FixerOption.php | 172 - .../FixerConfiguration/FixerOptionBuilder.php | 145 - .../FixerOptionInterface.php | 53 - .../InvalidOptionsForEnvException.php | 24 - .../src/FixerDefinition/CodeSample.php | 54 - .../FixerDefinition/CodeSampleInterface.php | 29 - .../FileSpecificCodeSample.php | 67 - .../FileSpecificCodeSampleInterface.php | 26 - .../src/FixerDefinition/FixerDefinition.php | 93 - .../FixerDefinitionInterface.php | 55 - .../VersionSpecificCodeSample.php | 65 - .../VersionSpecificCodeSampleInterface.php | 26 - .../FixerDefinition/VersionSpecification.php | 75 - .../VersionSpecificationInterface.php | 26 - .../php-cs-fixer/src/FixerFactory.php | 254 - .../src/FixerFileProcessedEvent.php | 59 - .../php-cs-fixer/src/FixerNameValidator.php | 36 - .../Indicator/PhpUnitTestCaseIndicator.php | 75 - .../php-cs-fixer/src/Linter/CachingLinter.php | 72 - .../php-cs-fixer/src/Linter/Linter.php | 64 - .../src/Linter/LinterInterface.php | 44 - .../src/Linter/LintingException.php | 20 - .../src/Linter/LintingResultInterface.php | 24 - .../php-cs-fixer/src/Linter/ProcessLinter.php | 149 - .../Linter/ProcessLinterProcessBuilder.php | 50 - .../src/Linter/ProcessLintingResult.php | 59 - .../src/Linter/TokenizerLinter.php | 70 - .../src/Linter/TokenizerLintingResult.php | 45 - .../src/Linter/UnavailableLinterException.php | 22 - .../php-cs-fixer/src/PharChecker.php | 39 - .../php-cs-fixer/src/PharCheckerInterface.php | 26 - vendor/friendsofphp/php-cs-fixer/src/Preg.php | 233 - .../php-cs-fixer/src/PregException.php | 24 - .../src/Report/CheckstyleReporter.php | 74 - .../src/Report/GitlabReporter.php | 60 - .../php-cs-fixer/src/Report/JsonReporter.php | 71 - .../php-cs-fixer/src/Report/JunitReporter.php | 141 - .../php-cs-fixer/src/Report/ReportSummary.php | 122 - .../src/Report/ReporterFactory.php | 100 - .../src/Report/ReporterInterface.php | 31 - .../php-cs-fixer/src/Report/TextReporter.php | 108 - .../php-cs-fixer/src/Report/XmlReporter.php | 140 - .../friendsofphp/php-cs-fixer/src/RuleSet.php | 534 - .../php-cs-fixer/src/RuleSetInterface.php | 59 - .../src/Runner/FileCachingLintingIterator.php | 80 - .../src/Runner/FileFilterIterator.php | 122 - .../src/Runner/FileLintingIterator.php | 68 - .../php-cs-fixer/src/Runner/Runner.php | 307 - .../php-cs-fixer/src/StdinFileInfo.php | 172 - .../src/Test/AbstractFixerTestCase.php | 36 - .../src/Test/AbstractIntegrationTestCase.php | 36 - .../src/Test/AccessibleObject.php | 93 - .../php-cs-fixer/src/Test/IntegrationCase.php | 136 - .../src/Tokenizer/AbstractTransformer.php | 42 - .../Analyzer/Analysis/ArgumentAnalysis.php | 108 - .../Analyzer/Analysis/NamespaceAnalysis.php | 127 - .../Analysis/NamespaceUseAnalysis.php | 147 - .../Analysis/StartEndTokenAwareAnalysis.php | 30 - .../Analyzer/Analysis/TypeAnalysis.php | 125 - .../Tokenizer/Analyzer/ArgumentsAnalyzer.php | 140 - .../src/Tokenizer/Analyzer/BlocksAnalyzer.php | 67 - .../src/Tokenizer/Analyzer/ClassyAnalyzer.php | 82 - .../Tokenizer/Analyzer/CommentsAnalyzer.php | 314 - .../Tokenizer/Analyzer/FunctionsAnalyzer.php | 262 - .../Analyzer/NamespaceUsesAnalyzer.php | 105 - .../Tokenizer/Analyzer/NamespacesAnalyzer.php | 71 - .../php-cs-fixer/src/Tokenizer/CT.php | 95 - .../php-cs-fixer/src/Tokenizer/CodeHasher.php | 38 - .../NamespacedStringTokenGenerator.php | 43 - .../Resolver/TypeShortNameResolver.php | 94 - .../php-cs-fixer/src/Tokenizer/Token.php | 618 - .../php-cs-fixer/src/Tokenizer/Tokens.php | 1453 -- .../src/Tokenizer/TokensAnalyzer.php | 743 - .../Transformer/ArrayTypehintTransformer.php | 61 - .../BraceClassInstantiationTransformer.php | 88 - .../Transformer/ClassConstantTransformer.php | 64 - .../Transformer/CurlyBraceTransformer.php | 221 - .../Transformer/ImportTransformer.php | 67 - .../NamespaceOperatorTransformer.php | 61 - .../Transformer/NullableTypeTransformer.php | 70 - .../Transformer/ReturnRefTransformer.php | 62 - .../Transformer/SquareBraceTransformer.php | 196 - .../TypeAlternationTransformer.php | 86 - .../Transformer/TypeColonTransformer.php | 88 - .../Tokenizer/Transformer/UseTransformer.php | 110 - .../WhitespacyCommentTransformer.php | 71 - .../src/Tokenizer/TransformerInterface.php | 72 - .../src/Tokenizer/Transformers.php | 113 - .../php-cs-fixer/src/ToolInfo.php | 111 - .../php-cs-fixer/src/ToolInfoInterface.php | 31 - .../friendsofphp/php-cs-fixer/src/Utils.php | 185 - .../src/WhitespacesFixerConfig.php | 56 - .../php-cs-fixer/src/WordMatcher.php | 57 - .../tests/Test/AbstractFixerTestCase.php | 259 - .../Test/AbstractIntegrationCaseFactory.php | 254 - .../Test/AbstractIntegrationTestCase.php | 402 - .../tests/Test/Assert/AssertTokensTrait.php | 48 - .../tests/Test/IntegrationCase.php | 153 - .../tests/Test/IntegrationCaseFactory.php | 22 - .../Test/IntegrationCaseFactoryInterface.php | 28 - .../Test/InternalIntegrationCaseFactory.php | 35 - .../tests/Test/IsIdenticalConstraint.php | 56 - .../php-cs-fixer/tests/TestCase.php | 49 - vendor/johnkary/phpunit-speedtrap/.gitignore | 3 - vendor/johnkary/phpunit-speedtrap/.travis.yml | 41 - .../johnkary/phpunit-speedtrap/CHANGELOG.md | 41 - vendor/johnkary/phpunit-speedtrap/LICENSE | 20 - vendor/johnkary/phpunit-speedtrap/README.md | 92 - vendor/johnkary/phpunit-speedtrap/UPGRADE.md | 38 - .../johnkary/phpunit-speedtrap/composer.json | 37 - .../phpunit-speedtrap/phpunit.xml.dist | 44 - .../src/SpeedTrapListener.php | 229 - .../tests/ExceptionalTest.php | 27 - .../phpunit-speedtrap/tests/SomeSlowTest.php | 87 - .../microsoft/tolerant-php-parser/LICENSE.txt | 17 - .../tolerant-php-parser/ThirdPartyNotices.txt | 22 - .../tolerant-php-parser/composer.json | 21 - .../tolerant-php-parser/phpstan.neon | 9 - .../src/CharacterCodes.php | 116 - .../tolerant-php-parser/src/ClassLike.php | 12 - .../tolerant-php-parser/src/Diagnostic.php | 28 - .../src/DiagnosticKind.php | 12 - .../src/DiagnosticsProvider.php | 109 - .../src/FilePositionMap.php | 142 - .../tolerant-php-parser/src/FunctionLike.php | 13 - .../src/LineCharacterPosition.php | 17 - .../tolerant-php-parser/src/MissingToken.php | 20 - .../src/NamespacedNameInterface.php | 11 - .../src/NamespacedNameTrait.php | 50 - .../tolerant-php-parser/src/Node.php | 697 - .../src/Node/AnonymousFunctionUseClause.php | 32 - .../src/Node/ArrayElement.php | 32 - .../src/Node/CaseStatementNode.php | 28 - .../src/Node/CatchClause.php | 43 - .../src/Node/ClassBaseClause.php | 23 - .../src/Node/ClassConstDeclaration.php | 32 - .../src/Node/ClassInterfaceClause.php | 23 - .../src/Node/ClassMembersNode.php | 27 - .../src/Node/ConstElement.php | 39 - .../src/Node/DeclareDirective.php | 25 - .../src/Node/DefaultStatementNode.php | 25 - .../src/Node/DelimitedList.php | 51 - .../DelimitedList/ArgumentExpressionList.php | 12 - .../Node/DelimitedList/ArrayElementList.php | 12 - .../Node/DelimitedList/ConstElementList.php | 12 - .../src/Node/DelimitedList/ExpressionList.php | 12 - .../Node/DelimitedList/ListExpressionList.php | 12 - .../DelimitedList/NamespaceUseClauseList.php | 12 - .../NamespaceUseGroupClauseList.php | 12 - .../ParameterDeclarationList.php | 12 - .../Node/DelimitedList/QualifiedNameList.php | 12 - .../Node/DelimitedList/QualifiedNameParts.php | 12 - .../DelimitedList/StaticVariableNameList.php | 12 - .../TraitSelectOrAliasClauseList.php | 12 - .../DelimitedList/UseVariableNameList.php | 12 - .../Node/DelimitedList/VariableNameList.php | 12 - .../src/Node/ElseClauseNode.php | 25 - .../src/Node/ElseIfClauseNode.php | 34 - .../src/Node/Expression.php | 12 - .../AnonymousFunctionCreationExpression.php | 45 - .../Node/Expression/ArgumentExpression.php | 27 - .../Expression/ArrayCreationExpression.php | 33 - .../Node/Expression/AssignmentExpression.php | 32 - .../src/Node/Expression/BinaryExpression.php | 28 - .../src/Node/Expression/BracedExpression.php | 27 - .../src/Node/Expression/CallExpression.php | 32 - .../src/Node/Expression/CastExpression.php | 31 - .../src/Node/Expression/CloneExpression.php | 24 - .../src/Node/Expression/EchoExpression.php | 34 - .../Expression/EmptyIntrinsicExpression.php | 32 - .../Expression/ErrorControlExpression.php | 23 - .../Expression/EvalIntrinsicExpression.php | 32 - .../Expression/ExitIntrinsicExpression.php | 32 - .../Expression/IssetIntrinsicExpression.php | 33 - .../Expression/ListIntrinsicExpression.php | 33 - .../Expression/MemberAccessExpression.php | 28 - .../Expression/ObjectCreationExpression.php | 53 - .../Expression/ParenthesizedExpression.php | 28 - .../Expression/PostfixUpdateExpression.php | 23 - .../Expression/PrefixUpdateExpression.php | 23 - .../Expression/PrintIntrinsicExpression.php | 24 - .../ScopedPropertyAccessExpression.php | 29 - .../Expression/ScriptInclusionExpression.php | 22 - .../Node/Expression/SubscriptExpression.php | 32 - .../src/Node/Expression/TernaryExpression.php | 36 - .../src/Node/Expression/UnaryExpression.php | 18 - .../src/Node/Expression/UnaryOpExpression.php | 23 - .../Expression/UnsetIntrinsicExpression.php | 33 - .../src/Node/Expression/Variable.php | 33 - .../src/Node/Expression/YieldExpression.php | 21 - .../src/Node/FinallyClause.php | 22 - .../src/Node/ForeachKey.php | 22 - .../src/Node/ForeachValue.php | 22 - .../src/Node/FunctionBody.php | 15 - .../src/Node/FunctionHeader.php | 24 - .../src/Node/FunctionReturnType.php | 18 - .../src/Node/FunctionUseClause.php | 12 - .../src/Node/InterfaceBaseClause.php | 23 - .../src/Node/InterfaceMembers.php | 27 - .../src/Node/MethodDeclaration.php | 76 - .../src/Node/MissingMemberDeclaration.php | 28 - .../src/Node/NamespaceAliasingClause.php | 22 - .../src/Node/NamespaceUseClause.php | 32 - .../src/Node/NamespaceUseGroupClause.php | 26 - .../src/Node/NumericLiteral.php | 18 - .../src/Node/Parameter.php | 51 - .../src/Node/PropertyDeclaration.php | 49 - .../src/Node/QualifiedName.php | 190 - .../src/Node/RelativeSpecifier.php | 23 - .../src/Node/ReservedWord.php | 18 - .../src/Node/SourceFileNode.php | 26 - .../Statement/BreakOrContinueStatement.php | 78 - .../src/Node/Statement/ClassDeclaration.php | 51 - .../Node/Statement/CompoundStatementNode.php | 28 - .../src/Node/Statement/ConstDeclaration.php | 28 - .../src/Node/Statement/DeclareStatement.php | 41 - .../src/Node/Statement/DoStatement.php | 38 - .../src/Node/Statement/EmptyStatement.php | 19 - .../Node/Statement/ExpressionStatement.php | 23 - .../src/Node/Statement/ForStatement.php | 53 - .../src/Node/Statement/ForeachStatement.php | 52 - .../Node/Statement/FunctionDeclaration.php | 42 - .../Statement/FunctionStaticDeclaration.php | 29 - .../src/Node/Statement/GlobalDeclaration.php | 29 - .../src/Node/Statement/GotoStatement.php | 25 - .../src/Node/Statement/IfStatementNode.php | 49 - .../src/Node/Statement/InlineHtml.php | 41 - .../Node/Statement/InterfaceDeclaration.php | 42 - .../Node/Statement/NamedLabelStatement.php | 25 - .../Node/Statement/NamespaceDefinition.php | 30 - .../Statement/NamespaceUseDeclaration.php | 55 - .../src/Node/Statement/ReturnStatement.php | 26 - .../Node/Statement/SwitchStatementNode.php | 48 - .../src/Node/Statement/ThrowStatement.php | 26 - .../src/Node/Statement/TraitDeclaration.php | 37 - .../src/Node/Statement/TryStatement.php | 30 - .../src/Node/Statement/WhileStatement.php | 41 - .../src/Node/StatementNode.php | 12 - .../src/Node/StaticVariableDeclaration.php | 28 - .../src/Node/StringLiteral.php | 42 - .../src/Node/TraitMembers.php | 27 - .../src/Node/TraitSelectOrAliasClause.php | 47 - .../src/Node/TraitUseClause.php | 35 - .../src/Node/UseVariableName.php | 30 - .../tolerant-php-parser/src/ParseContext.php | 23 - .../tolerant-php-parser/src/Parser.php | 3419 ---- .../tolerant-php-parser/src/PhpTokenizer.php | 304 - .../src/PositionUtilities.php | 46 - .../tolerant-php-parser/src/Range.php | 17 - .../tolerant-php-parser/src/ResolvedName.php | 44 - .../tolerant-php-parser/src/SkippedToken.php | 20 - .../tolerant-php-parser/src/TextEdit.php | 53 - .../tolerant-php-parser/src/Token.php | 134 - .../tolerant-php-parser/src/TokenKind.php | 213 - .../src/TokenStreamProviderFactory.php | 14 - .../src/TokenStreamProviderInterface.php | 19 - .../src/TokenStringMaps.php | 183 - .../tolerant-php-parser/src/bootstrap.php | 12 - vendor/myclabs/deep-copy/.github/FUNDING.yml | 12 - vendor/myclabs/deep-copy/LICENSE | 20 - vendor/myclabs/deep-copy/README.md | 375 - vendor/myclabs/deep-copy/composer.json | 38 - .../deep-copy/src/DeepCopy/DeepCopy.php | 298 - .../src/DeepCopy/Exception/CloneException.php | 9 - .../DeepCopy/Exception/PropertyException.php | 9 - .../Doctrine/DoctrineCollectionFilter.php | 33 - .../DoctrineEmptyCollectionFilter.php | 28 - .../Filter/Doctrine/DoctrineProxyFilter.php | 22 - .../deep-copy/src/DeepCopy/Filter/Filter.php | 18 - .../src/DeepCopy/Filter/KeepFilter.php | 16 - .../src/DeepCopy/Filter/ReplaceFilter.php | 39 - .../src/DeepCopy/Filter/SetNullFilter.php | 24 - .../Matcher/Doctrine/DoctrineProxyMatcher.php | 22 - .../src/DeepCopy/Matcher/Matcher.php | 14 - .../src/DeepCopy/Matcher/PropertyMatcher.php | 39 - .../DeepCopy/Matcher/PropertyNameMatcher.php | 32 - .../DeepCopy/Matcher/PropertyTypeMatcher.php | 46 - .../DeepCopy/Reflection/ReflectionHelper.php | 78 - .../TypeFilter/Date/DateIntervalFilter.php | 33 - .../src/DeepCopy/TypeFilter/ReplaceFilter.php | 30 - .../DeepCopy/TypeFilter/ShallowCopyFilter.php | 17 - .../TypeFilter/Spl/ArrayObjectFilter.php | 36 - .../TypeFilter/Spl/SplDoublyLinkedList.php | 10 - .../Spl/SplDoublyLinkedListFilter.php | 51 - .../src/DeepCopy/TypeFilter/TypeFilter.php | 13 - .../src/DeepCopy/TypeMatcher/TypeMatcher.php | 29 - .../deep-copy/src/DeepCopy/deep_copy.php | 20 - vendor/netresearch/jsonmapper/LICENSE | 47 - vendor/netresearch/jsonmapper/composer.json | 31 - .../netresearch/jsonmapper/contributing.rst | 13 - .../netresearch/jsonmapper/src/JsonMapper.php | 829 - .../jsonmapper/src/JsonMapper/Exception.php | 26 - vendor/paragonie/random_compat/LICENSE | 22 - vendor/paragonie/random_compat/build-phar.sh | 5 - vendor/paragonie/random_compat/composer.json | 34 - .../dist/random_compat.phar.pubkey | 5 - .../dist/random_compat.phar.pubkey.asc | 11 - vendor/paragonie/random_compat/lib/random.php | 32 - .../random_compat/other/build_phar.php | 57 - .../random_compat/psalm-autoload.php | 9 - vendor/paragonie/random_compat/psalm.xml | 19 - vendor/pdepend/pdepend/CHANGELOG.md | 661 - vendor/pdepend/pdepend/LICENSE | 29 - vendor/pdepend/pdepend/README.md | 15 - vendor/pdepend/pdepend/build.properties | 19 - vendor/pdepend/pdepend/composer.json | 33 - vendor/pdepend/pdepend/phpcs.xml.dist | 18 - vendor/pdepend/pdepend/src/bin/pdepend | 72 - vendor/pdepend/pdepend/src/bin/pdepend.bat | 46 - vendor/pdepend/pdepend/src/bin/pdepend.php | 67 - .../src/main/php/PDepend/Application.php | 198 - .../main/php/PDepend/DbusUI/ResultPrinter.php | 202 - .../Compiler/ProcessListenerPass.php | 69 - .../DependencyInjection/Configuration.php | 120 - .../PDepend/DependencyInjection/Extension.php | 136 - .../DependencyInjection/ExtensionManager.php | 93 - .../DependencyInjection/PdependExtension.php | 128 - .../DependencyInjection/TreeBuilder.php | 103 - .../pdepend/src/main/php/PDepend/Engine.php | 726 - .../php/PDepend/Input/CompositeFilter.php | 89 - .../php/PDepend/Input/ExcludePathFilter.php | 123 - .../php/PDepend/Input/ExtensionFilter.php | 88 - .../src/main/php/PDepend/Input/Filter.php | 61 - .../src/main/php/PDepend/Input/Iterator.php | 121 - .../php/PDepend/Metrics/AbstractAnalyzer.php | 147 - .../Metrics/AbstractCachingAnalyzer.php | 145 - .../php/PDepend/Metrics/AggregateAnalyzer.php | 69 - .../src/main/php/PDepend/Metrics/Analyzer.php | 96 - .../Analyzer/ClassDependencyAnalyzer.php | 343 - .../Metrics/Analyzer/ClassLevelAnalyzer.php | 409 - .../Metrics/Analyzer/CodeRankAnalyzer.php | 235 - .../CodeRankAnalyzer/CodeRankStrategyI.php | 61 - .../CodeRankAnalyzer/InheritanceStrategy.php | 150 - .../CodeRankAnalyzer/MethodStrategy.php | 148 - .../CodeRankAnalyzer/PropertyStrategy.php | 130 - .../CodeRankAnalyzer/StrategyFactory.php | 125 - .../Metrics/Analyzer/CohesionAnalyzer.php | 155 - .../Metrics/Analyzer/CouplingAnalyzer.php | 453 - .../Metrics/Analyzer/CrapIndexAnalyzer.php | 271 - .../Analyzer/CyclomaticComplexityAnalyzer.php | 464 - .../Metrics/Analyzer/DependencyAnalyzer.php | 492 - .../Metrics/Analyzer/HalsteadAnalyzer.php | 401 - .../Metrics/Analyzer/HierarchyAnalyzer.php | 317 - .../Metrics/Analyzer/InheritanceAnalyzer.php | 362 - .../Analyzer/MaintainabilityIndexAnalyzer.php | 201 - .../Analyzer/NPathComplexityAnalyzer.php | 571 - .../Metrics/Analyzer/NodeCountAnalyzer.php | 328 - .../Metrics/Analyzer/NodeLocAnalyzer.php | 487 - .../PDepend/Metrics/AnalyzerCacheAware.php | 66 - .../php/PDepend/Metrics/AnalyzerFactory.php | 88 - .../PDepend/Metrics/AnalyzerFilterAware.php | 56 - .../php/PDepend/Metrics/AnalyzerIterator.php | 75 - .../php/PDepend/Metrics/AnalyzerListener.php | 71 - .../php/PDepend/Metrics/AnalyzerNodeAware.php | 72 - .../PDepend/Metrics/AnalyzerProjectAware.php | 70 - .../src/main/php/PDepend/ProcessListener.php | 120 - .../php/PDepend/Report/CodeAwareGenerator.php | 62 - .../php/PDepend/Report/Dependencies/Xml.php | 351 - .../php/PDepend/Report/FileAwareGenerator.php | 61 - .../main/php/PDepend/Report/Jdepend/Chart.php | 253 - .../main/php/PDepend/Report/Jdepend/Xml.php | 373 - .../main/php/PDepend/Report/Jdepend/chart.svg | 587 - .../PDepend/Report/NoLogOutputException.php | 66 - .../php/PDepend/Report/Overview/Pyramid.php | 333 - .../php/PDepend/Report/Overview/pyramid.svg | 769 - .../php/PDepend/Report/ReportGenerator.php | 79 - .../PDepend/Report/ReportGeneratorFactory.php | 118 - .../main/php/PDepend/Report/Summary/Xml.php | 449 - .../Source/AST/ASTAllocationExpression.php | 83 - .../PDepend/Source/AST/ASTAnonymousClass.php | 327 - .../php/PDepend/Source/AST/ASTArguments.php | 81 - .../main/php/PDepend/Source/AST/ASTArray.php | 78 - .../PDepend/Source/AST/ASTArrayElement.php | 112 - .../Source/AST/ASTArrayIndexExpression.php | 80 - .../php/PDepend/Source/AST/ASTArtifact.php | 77 - .../PDepend/Source/AST/ASTArtifactList.php | 228 - .../AST/ASTArtifactList/ArtifactFilter.php | 63 - .../CollectionArtifactFilter.php | 120 - .../ASTArtifactList/NullArtifactFilter.php | 66 - .../ASTArtifactList/PackageArtifactFilter.php | 102 - .../Source/AST/ASTAssignmentExpression.php | 68 - .../Source/AST/ASTBooleanAndExpression.php | 70 - .../Source/AST/ASTBooleanOrExpression.php | 70 - .../PDepend/Source/AST/ASTBreakStatement.php | 83 - .../php/PDepend/Source/AST/ASTCallable.php | 57 - .../PDepend/Source/AST/ASTCastExpression.php | 181 - .../PDepend/Source/AST/ASTCatchStatement.php | 67 - .../main/php/PDepend/Source/AST/ASTClass.php | 214 - .../PDepend/Source/AST/ASTClassFqnPostfix.php | 81 - ...InterfaceRecursiveInheritanceException.php | 71 - .../AST/ASTClassOrInterfaceReference.php | 126 - .../ASTClassOrInterfaceReferenceIterator.php | 89 - .../PDepend/Source/AST/ASTClassReference.php | 83 - .../PDepend/Source/AST/ASTCloneExpression.php | 69 - .../php/PDepend/Source/AST/ASTClosure.php | 158 - .../php/PDepend/Source/AST/ASTComment.php | 68 - .../PDepend/Source/AST/ASTCompilationUnit.php | 384 - .../ASTCompilationUnitNotFoundException.php | 71 - .../Source/AST/ASTCompoundExpression.php | 84 - .../Source/AST/ASTCompoundVariable.php | 80 - .../Source/AST/ASTConditionalExpression.php | 76 - .../php/PDepend/Source/AST/ASTConstant.php | 70 - .../Source/AST/ASTConstantDeclarator.php | 136 - .../Source/AST/ASTConstantDefinition.php | 163 - .../PDepend/Source/AST/ASTConstantPostfix.php | 75 - .../Source/AST/ASTContinueStatement.php | 83 - .../Source/AST/ASTDeclareStatement.php | 130 - .../Source/AST/ASTDoWhileStatement.php | 69 - .../PDepend/Source/AST/ASTEchoStatement.php | 69 - .../PDepend/Source/AST/ASTElseIfStatement.php | 84 - .../PDepend/Source/AST/ASTEvalExpression.php | 69 - .../PDepend/Source/AST/ASTExitExpression.php | 69 - .../php/PDepend/Source/AST/ASTExpression.php | 69 - .../Source/AST/ASTFieldDeclaration.php | 205 - .../Source/AST/ASTFinallyStatement.php | 67 - .../php/PDepend/Source/AST/ASTForInit.php | 73 - .../PDepend/Source/AST/ASTForStatement.php | 69 - .../php/PDepend/Source/AST/ASTForUpdate.php | 75 - .../Source/AST/ASTForeachStatement.php | 69 - .../PDepend/Source/AST/ASTFormalParameter.php | 155 - .../Source/AST/ASTFormalParameters.php | 87 - .../php/PDepend/Source/AST/ASTFunction.php | 176 - .../PDepend/Source/AST/ASTFunctionPostfix.php | 79 - .../PDepend/Source/AST/ASTGlobalStatement.php | 69 - .../PDepend/Source/AST/ASTGotoStatement.php | 69 - .../php/PDepend/Source/AST/ASTHeredoc.php | 87 - .../php/PDepend/Source/AST/ASTIdentifier.php | 70 - .../php/PDepend/Source/AST/ASTIfStatement.php | 81 - .../Source/AST/ASTIncludeExpression.php | 108 - .../PDepend/Source/AST/ASTIndexExpression.php | 55 - .../Source/AST/ASTInstanceOfExpression.php | 69 - .../php/PDepend/Source/AST/ASTInterface.php | 145 - .../php/PDepend/Source/AST/ASTInvocation.php | 55 - .../PDepend/Source/AST/ASTIssetExpression.php | 70 - .../PDepend/Source/AST/ASTLabelStatement.php | 69 - .../PDepend/Source/AST/ASTListExpression.php | 69 - .../php/PDepend/Source/AST/ASTLiteral.php | 69 - .../Source/AST/ASTLogicalAndExpression.php | 69 - .../Source/AST/ASTLogicalOrExpression.php | 69 - .../Source/AST/ASTLogicalXorExpression.php | 69 - .../Source/AST/ASTMemberPrimaryPrefix.php | 99 - .../main/php/PDepend/Source/AST/ASTMethod.php | 234 - .../PDepend/Source/AST/ASTMethodPostfix.php | 79 - .../php/PDepend/Source/AST/ASTNamespace.php | 322 - .../main/php/PDepend/Source/AST/ASTNode.php | 182 - .../php/PDepend/Source/AST/ASTParameter.php | 393 - .../PDepend/Source/AST/ASTParentReference.php | 130 - .../Source/AST/ASTPostfixExpression.php | 69 - .../Source/AST/ASTPreDecrementExpression.php | 69 - .../Source/AST/ASTPreIncrementExpression.php | 69 - .../PDepend/Source/AST/ASTPrintExpression.php | 76 - .../php/PDepend/Source/AST/ASTProperty.php | 366 - .../PDepend/Source/AST/ASTPropertyPostfix.php | 83 - .../Source/AST/ASTRequireExpression.php | 108 - .../PDepend/Source/AST/ASTReturnStatement.php | 83 - .../php/PDepend/Source/AST/ASTScalarType.php | 80 - .../main/php/PDepend/Source/AST/ASTScope.php | 69 - .../PDepend/Source/AST/ASTScopeStatement.php | 69 - .../PDepend/Source/AST/ASTSelfReference.php | 148 - .../Source/AST/ASTShiftLeftExpression.php | 83 - .../Source/AST/ASTShiftRightExpression.php | 83 - .../php/PDepend/Source/AST/ASTStatement.php | 69 - .../PDepend/Source/AST/ASTStaticReference.php | 86 - .../AST/ASTStaticVariableDeclaration.php | 83 - .../main/php/PDepend/Source/AST/ASTString.php | 81 - .../Source/AST/ASTStringIndexExpression.php | 75 - .../php/PDepend/Source/AST/ASTSwitchLabel.php | 109 - .../PDepend/Source/AST/ASTSwitchStatement.php | 67 - .../PDepend/Source/AST/ASTThrowStatement.php | 69 - .../main/php/PDepend/Source/AST/ASTTrait.php | 123 - .../PDepend/Source/AST/ASTTraitAdaptation.php | 69 - .../Source/AST/ASTTraitAdaptationAlias.php | 140 - .../AST/ASTTraitAdaptationPrecedence.php | 69 - .../AST/ASTTraitMethodCollisionException.php | 43 - .../PDepend/Source/AST/ASTTraitReference.php | 83 - .../Source/AST/ASTTraitUseStatement.php | 215 - .../PDepend/Source/AST/ASTTryStatement.php | 69 - .../main/php/PDepend/Source/AST/ASTType.php | 91 - .../php/PDepend/Source/AST/ASTTypeArray.php | 94 - .../PDepend/Source/AST/ASTTypeCallable.php | 81 - .../PDepend/Source/AST/ASTTypeIterable.php | 94 - .../PDepend/Source/AST/ASTUnaryExpression.php | 83 - .../PDepend/Source/AST/ASTUnsetStatement.php | 69 - .../main/php/PDepend/Source/AST/ASTValue.php | 107 - .../php/PDepend/Source/AST/ASTVariable.php | 87 - .../Source/AST/ASTVariableDeclarator.php | 114 - .../Source/AST/ASTVariableVariable.php | 83 - .../PDepend/Source/AST/ASTWhileStatement.php | 69 - .../PDepend/Source/AST/ASTYieldStatement.php | 83 - .../Source/AST/AbstractASTArtifact.php | 256 - .../Source/AST/AbstractASTCallable.php | 523 - .../AST/AbstractASTClassOrInterface.php | 367 - .../PDepend/Source/AST/AbstractASTNode.php | 471 - .../PDepend/Source/AST/AbstractASTType.php | 527 - .../src/main/php/PDepend/Source/AST/State.php | 92 - .../Source/ASTVisitor/ASTVisitListener.php | 208 - .../PDepend/Source/ASTVisitor/ASTVisitor.php | 167 - .../ASTVisitor/AbstractASTVisitListener.php | 284 - .../Source/ASTVisitor/AbstractASTVisitor.php | 523 - .../php/PDepend/Source/Builder/Builder.php | 1254 -- .../PDepend/Source/Builder/BuilderContext.php | 121 - .../BuilderContext/GlobalBuilderContext.php | 174 - .../Source/Language/PHP/AbstractPHPParser.php | 7178 ------- .../Source/Language/PHP/PHPBuilder.php | 2397 --- .../Source/Language/PHP/PHPParserGeneric.php | 168 - .../Language/PHP/PHPParserVersion53.php | 103 - .../Language/PHP/PHPParserVersion54.php | 298 - .../Language/PHP/PHPParserVersion55.php | 75 - .../Language/PHP/PHPParserVersion56.php | 424 - .../Language/PHP/PHPParserVersion70.php | 583 - .../Language/PHP/PHPParserVersion71.php | 242 - .../Language/PHP/PHPParserVersion72.php | 55 - .../Language/PHP/PHPParserVersion73.php | 55 - .../Language/PHP/PHPParserVersion74.php | 134 - .../Language/PHP/PHPTokenizerInternal.php | 954 - .../Source/Parser/InvalidStateException.php | 73 - .../Source/Parser/MissingValueException.php | 78 - .../Source/Parser/NoActiveScopeException.php | 58 - .../PDepend/Source/Parser/ParserException.php | 53 - .../php/PDepend/Source/Parser/SymbolTable.php | 175 - .../PDepend/Source/Parser/TokenException.php | 55 - .../php/PDepend/Source/Parser/TokenStack.php | 120 - .../Source/Parser/TokenStreamEndException.php | 70 - .../Parser/UnexpectedTokenException.php | 73 - .../Source/Tokenizer/FullTokenizer.php | 61 - .../php/PDepend/Source/Tokenizer/Token.php | 114 - .../PDepend/Source/Tokenizer/Tokenizer.php | 127 - .../php/PDepend/Source/Tokenizer/Tokens.php | 889 - .../src/main/php/PDepend/TextUI/Command.php | 646 - .../main/php/PDepend/TextUI/ResultPrinter.php | 231 - .../src/main/php/PDepend/TextUI/Runner.php | 347 - .../php/PDepend/Util/Cache/CacheDriver.php | 110 - .../php/PDepend/Util/Cache/CacheFactory.php | 148 - .../Cache/Driver/File/FileCacheDirectory.php | 226 - .../Driver/File/FileCacheGarbageCollector.php | 146 - .../Util/Cache/Driver/FileCacheDriver.php | 298 - .../Util/Cache/Driver/MemoryCacheDriver.php | 213 - .../main/php/PDepend/Util/Configuration.php | 128 - .../PDepend/Util/ConfigurationInstance.php | 80 - .../PDepend/Util/Coverage/CloverReport.php | 151 - .../php/PDepend/Util/Coverage/Factory.php | 93 - .../main/php/PDepend/Util/Coverage/Report.php | 62 - .../src/main/php/PDepend/Util/FileUtil.php | 98 - .../src/main/php/PDepend/Util/IdBuilder.php | 168 - .../main/php/PDepend/Util/ImageConvert.php | 180 - .../pdepend/src/main/php/PDepend/Util/Log.php | 110 - .../src/main/php/PDepend/Util/MathUtil.php | 87 - .../src/main/php/PDepend/Util/Type.php | 407 - .../src/main/php/PDepend/Util/Utf8Util.php | 73 - .../src/main/php/PDepend/Util/Workarounds.php | 90 - .../main/resources/schema/configuration.xsd | 46 - .../pdepend/src/main/resources/services.xml | 123 - vendor/phan/phan/.phan/bin/mkfilelist | 17 - vendor/phan/phan/.phan/bin/phan | 40 - vendor/phan/phan/.phan/config.php | 487 - .../phan/phan/.phan/internal_stubs/README.md | 4 - .../phan/.phan/internal_stubs/ast.phan_php | 210 - .../phan/.phan/internal_stubs/ctype.phan_php | 17 - .../.phan/internal_stubs/igbinary.phan_php | 8 - .../phan/.phan/internal_stubs/pcntl.phan_php | 143 - .../phan/.phan/internal_stubs/posix.phan_php | 69 - .../.phan/internal_stubs/readline.phan_php | 19 - .../.phan/internal_stubs/sysvmsg.phan_php | 18 - .../.phan/internal_stubs/sysvsem.phan_php | 10 - .../.phan/internal_stubs/sysvshm.phan_php | 13 - .../phan/.phan/internal_stubs/xdebug.phan_php | 53 - .../phan/.phan/plugins/AlwaysReturnPlugin.php | 165 - vendor/phan/phan/.phan/plugins/DemoPlugin.php | 236 - .../phan/.phan/plugins/DollarDollarPlugin.php | 78 - .../.phan/plugins/DuplicateArrayKeyPlugin.php | 305 - .../plugins/DuplicateExpressionPlugin.php | 380 - .../phan/.phan/plugins/FFIAnalysisPlugin.php | 154 - .../phan/.phan/plugins/HasPHPDocPlugin.php | 273 - .../plugins/InvalidVariableIssetPlugin.php | 100 - .../InvokePHPNativeSyntaxCheckPlugin.php | 367 - .../phan/.phan/plugins/NoAssertPlugin.php | 85 - .../.phan/plugins/NonBoolBranchPlugin.php | 83 - .../plugins/NonBoolInLogicalArithPlugin.php | 93 - .../plugins/NotFullyQualifiedUsagePlugin.php | 204 - .../NotFullyQualifiedUsagePlugin/fixers.php | 92 - .../plugins/NumericalComparisonPlugin.php | 87 - .../.phan/plugins/PHPUnitAssertionPlugin.php | 234 - .../plugins/PHPUnitNotDeadCodePlugin.php | 156 - .../.phan/plugins/PhanSelfCheckPlugin.php | 273 - .../plugins/PossiblyStaticMethodPlugin.php | 251 - .../.phan/plugins/PregRegexCheckerPlugin.php | 293 - .../.phan/plugins/PrintfCheckerPlugin.php | 737 - vendor/phan/phan/.phan/plugins/README.md | 367 - .../phan/.phan/plugins/SleepCheckerPlugin.php | 247 - .../plugins/SuspiciousParamOrderPlugin.php | 334 - .../plugins/UnknownElementTypePlugin.php | 228 - .../.phan/plugins/UnreachableCodePlugin.php | 119 - .../.phan/plugins/UnusedSuppressionPlugin.php | 299 - .../.phan/plugins/UseReturnValuePlugin.php | 1079 - .../phan/.phan/plugins/WhitespacePlugin.php | 91 - .../.phan/plugins/WhitespacePlugin/fixers.php | 120 - vendor/phan/phan/.phan/stubs/README.md | 2 - vendor/phan/phan/CODE_OF_CONDUCT.md | 34 - vendor/phan/phan/DCO.txt | 37 - vendor/phan/phan/LICENSE | 31 - vendor/phan/phan/LICENSE.LANGUAGE_SERVER | 20 - vendor/phan/phan/LICENSE.PHPSTORM_STUBS | 5 - vendor/phan/phan/LICENSE.PHP_PARSER | 34 - vendor/phan/phan/MAINTAINERS.md | 14 - vendor/phan/phan/NEWS.md | 2312 --- vendor/phan/phan/README.md | 275 - vendor/phan/phan/composer.json | 52 - vendor/phan/phan/composer.lock | 2219 --- vendor/phan/phan/phan | 2 - vendor/phan/phan/phan_client | 579 - vendor/phan/phan/prep | 2 - vendor/phan/phan/src/Phan/AST/ASTHasher.php | 69 - vendor/phan/phan/src/Phan/AST/ASTReverter.php | 196 - .../phan/phan/src/Phan/AST/ASTSimplifier.php | 827 - .../phan/src/Phan/AST/AnalysisVisitor.php | 124 - vendor/phan/phan/src/Phan/AST/ContextNode.php | 2344 --- vendor/phan/phan/src/Phan/AST/Parser.php | 274 - .../phan/src/Phan/AST/PhanAnnotationAdder.php | 217 - .../InvalidNodeException.php | 15 - .../AST/TolerantASTConverter/NodeDumper.php | 161 - .../AST/TolerantASTConverter/NodeUtils.php | 62 - .../TolerantASTConverter/ParseException.php | 32 - .../AST/TolerantASTConverter/ParseResult.php | 28 - .../AST/TolerantASTConverter/StringUtil.php | 199 - .../TolerantASTConverter.php | 3030 --- .../TolerantASTConverterWithNodeMapping.php | 442 - .../AST/TolerantASTConverter/ast_shim.php | 285 - .../phan/src/Phan/AST/UnionTypeVisitor.php | 3140 --- .../phan/src/Phan/AST/Visitor/Element.php | 381 - .../phan/src/Phan/AST/Visitor/FlagVisitor.php | 366 - .../AST/Visitor/FlagVisitorImplementation.php | 384 - .../phan/src/Phan/AST/Visitor/KindVisitor.php | 463 - .../AST/Visitor/KindVisitorImplementation.php | 493 - vendor/phan/phan/src/Phan/Analysis.php | 586 - .../Phan/Analysis/AbstractMethodAnalyzer.php | 59 - .../phan/src/Phan/Analysis/Analyzable.php | 153 - .../phan/src/Phan/Analysis/ArgumentType.php | 884 - .../AssignOperatorAnalysisVisitor.php | 566 - .../Analysis/AssignOperatorFlagVisitor.php | 375 - .../src/Phan/Analysis/AssignmentVisitor.php | 1330 -- .../Analysis/BinaryOperatorFlagVisitor.php | 880 - .../Phan/Analysis/BlockExitStatusChecker.php | 651 - .../Analysis/ClassInheritanceAnalyzer.php | 170 - .../src/Phan/Analysis/CompositionAnalyzer.php | 111 - .../src/Phan/Analysis/ConditionVisitor.php | 1073 - .../ConditionVisitor/BinaryCondition.php | 40 - .../ConditionVisitor/ComparisonCondition.php | 55 - .../ConditionVisitor/HasTypeCondition.php | 78 - .../ConditionVisitor/IdenticalCondition.php | 61 - .../ConditionVisitor/NotEqualsCondition.php | 71 - .../ConditionVisitor/NotHasTypeCondition.php | 76 - .../NotIdenticalCondition.php | 62 - .../Analysis/ConditionVisitorInterface.php | 93 - .../Phan/Analysis/ConditionVisitorUtil.php | 1064 - .../src/Phan/Analysis/ContextMergeVisitor.php | 389 - .../Phan/Analysis/DuplicateClassAnalyzer.php | 80 - .../Analysis/DuplicateFunctionAnalyzer.php | 75 - .../phan/src/Phan/Analysis/GotoAnalyzer.php | 69 - .../Phan/Analysis/NegatedConditionVisitor.php | 1012 - .../Phan/Analysis/ParameterTypesAnalyzer.php | 1231 -- .../ParentConstructorCalledAnalyzer.php | 70 - .../Analysis/PostOrderAnalysisVisitor.php | 3798 ---- .../Phan/Analysis/PreOrderAnalysisVisitor.php | 883 - .../Phan/Analysis/PropertyTypesAnalyzer.php | 85 - .../src/Phan/Analysis/ReachabilityChecker.php | 303 - .../Phan/Analysis/ReferenceCountsAnalyzer.php | 520 - .../phan/src/Phan/Analysis/RegexAnalyzer.php | 130 - .../phan/src/Phan/Analysis/ScopeVisitor.php | 322 - .../src/Phan/Analysis/ThrowsTypesAnalyzer.php | 148 - .../phan/src/Phan/BlockAnalysisVisitor.php | 1685 -- vendor/phan/phan/src/Phan/Bootstrap.php | 254 - vendor/phan/phan/src/Phan/CLI.php | 1789 -- vendor/phan/phan/src/Phan/CodeBase.php | 2078 -- .../phan/phan/src/Phan/CodeBase/ClassMap.php | 134 - .../phan/src/Phan/CodeBase/UndoTracker.php | 221 - vendor/phan/phan/src/Phan/Config.php | 1355 -- .../src/Phan/Config/InitializedSettings.php | 33 - .../phan/phan/src/Phan/Config/Initializer.php | 593 - vendor/phan/phan/src/Phan/Daemon.php | 270 - .../phan/src/Phan/Daemon/ExitException.php | 15 - vendor/phan/phan/src/Phan/Daemon/Request.php | 736 - .../Daemon/Transport/CapturerResponder.php | 53 - .../src/Phan/Daemon/Transport/Responder.php | 25 - .../Phan/Daemon/Transport/StreamResponder.php | 87 - vendor/phan/phan/src/Phan/Debug.php | 431 - .../phan/phan/src/Phan/Debug/Breakpoint.php | 47 - .../phan/src/Phan/Debug/DebugUnionType.php | 43 - vendor/phan/phan/src/Phan/Debug/Frame.php | 143 - .../src/Phan/Exception/CodeBaseException.php | 55 - .../Phan/Exception/EmptyFQSENException.php | 10 - .../src/Phan/Exception/FQSENException.php | 38 - .../Phan/Exception/InvalidFQSENException.php | 10 - .../src/Phan/Exception/IssueException.php | 65 - .../phan/src/Phan/Exception/NodeException.php | 49 - .../Exception/RecursionDepthException.php | 12 - .../Phan/Exception/UnanalyzableException.php | 10 - .../src/Phan/Exception/UsageException.php | 33 - vendor/phan/phan/src/Phan/ForkPool.php | 277 - vendor/phan/phan/src/Phan/Issue.php | 4250 ---- .../phan/phan/src/Phan/IssueFixSuggester.php | 636 - vendor/phan/phan/src/Phan/IssueInstance.php | 205 - .../src/Phan/Language/AnnotatedUnionType.php | 129 - .../phan/phan/src/Phan/Language/Context.php | 915 - .../Language/Element/AddressableElement.php | 339 - .../Element/AddressableElementInterface.php | 173 - .../Language/Element/ClassAliasRecord.php | 32 - .../Phan/Language/Element/ClassConstant.php | 183 - .../Phan/Language/Element/ClassElement.php | 299 - .../phan/src/Phan/Language/Element/Clazz.php | 3259 --- .../Language/Element/ClosedScopeElement.php | 36 - .../src/Phan/Language/Element/Comment.php | 684 - .../Language/Element/Comment/Assertion.php | 36 - .../Phan/Language/Element/Comment/Builder.php | 1294 -- .../Phan/Language/Element/Comment/Method.php | 167 - .../Language/Element/Comment/NullComment.php | 43 - .../Language/Element/Comment/Parameter.php | 200 - .../Language/Element/Comment/Property.php | 108 - .../Element/Comment/ReturnComment.php | 57 - .../Language/Element/ConstantInterface.php | 39 - .../Phan/Language/Element/ConstantTrait.php | 73 - .../Element/ElementFutureUnionType.php | 94 - .../phan/src/Phan/Language/Element/Flags.php | 100 - .../phan/src/Phan/Language/Element/Func.php | 484 - .../Phan/Language/Element/FunctionFactory.php | 261 - .../Language/Element/FunctionInterface.php | 448 - .../Phan/Language/Element/FunctionTrait.php | 1740 -- .../Phan/Language/Element/GlobalConstant.php | 129 - .../Language/Element/MarkupDescription.php | 498 - .../phan/src/Phan/Language/Element/Method.php | 938 - .../src/Phan/Language/Element/Parameter.php | 629 - .../Element/PassByReferenceVariable.php | 127 - .../src/Phan/Language/Element/Property.php | 413 - .../Language/Element/TraitAdaptations.php | 43 - .../Language/Element/TraitAliasSource.php | 57 - .../Phan/Language/Element/TypedElement.php | 376 - .../Element/TypedElementInterface.php | 40 - .../Element/UnaddressableTypedElement.php | 226 - .../src/Phan/Language/Element/Variable.php | 245 - .../Language/Element/VariadicParameter.php | 148 - .../phan/src/Phan/Language/ElementContext.php | 49 - .../phan/src/Phan/Language/EmptyUnionType.php | 1289 -- vendor/phan/phan/src/Phan/Language/FQSEN.php | 68 - .../src/Phan/Language/FQSEN/AbstractFQSEN.php | 124 - .../src/Phan/Language/FQSEN/Alternatives.php | 94 - .../FQSEN/FullyQualifiedClassConstantName.php | 21 - .../FQSEN/FullyQualifiedClassElement.php | 266 - .../FQSEN/FullyQualifiedClassName.php | 114 - .../FQSEN/FullyQualifiedConstantName.php | 12 - .../FQSEN/FullyQualifiedFunctionLikeName.php | 15 - .../FQSEN/FullyQualifiedFunctionName.php | 118 - .../FullyQualifiedGlobalConstantName.php | 30 - .../FullyQualifiedGlobalStructuralElement.php | 403 - .../FQSEN/FullyQualifiedMethodName.php | 80 - .../FQSEN/FullyQualifiedPropertyName.php | 10 - .../phan/phan/src/Phan/Language/FileRef.php | 193 - .../src/Phan/Language/FutureUnionType.php | 82 - .../Internal/ClassDocumentationMap.php | 1243 -- .../Internal/ConstantDocumentationMap.php | 3097 --- .../Language/Internal/DynamicPropertyMap.php | 14 - .../Internal/FunctionDocumentationMap.php | 16360 --------------- .../Internal/FunctionSignatureMap.php | 16606 ---------------- .../FunctionSignatureMap_php70_delta.php | 209 - .../FunctionSignatureMap_php71_delta.php | 51 - .../FunctionSignatureMap_php72_delta.php | 151 - .../FunctionSignatureMap_php73_delta.php | 59 - .../FunctionSignatureMap_php74_delta.php | 40 - .../FunctionSignatureMap_php80_delta.php | 24 - .../Internal/PropertyDocumentationMap.php | 573 - .../Phan/Language/Internal/PropertyMap.php | 422 - .../src/Phan/Language/NamespaceMapEntry.php | 72 - vendor/phan/phan/src/Phan/Language/Scope.php | 426 - .../src/Phan/Language/Scope/BranchScope.php | 84 - .../src/Phan/Language/Scope/ClassScope.php | 83 - .../src/Phan/Language/Scope/ClosedScope.php | 12 - .../src/Phan/Language/Scope/ClosureScope.php | 72 - .../Phan/Language/Scope/FunctionLikeScope.php | 90 - .../src/Phan/Language/Scope/GlobalScope.php | 197 - .../src/Phan/Language/Scope/PropertyScope.php | 78 - .../src/Phan/Language/Scope/TemplateScope.php | 29 - vendor/phan/phan/src/Phan/Language/Type.php | 3242 --- .../src/Phan/Language/Type/ArrayShapeType.php | 868 - .../phan/src/Phan/Language/Type/ArrayType.php | 227 - .../phan/src/Phan/Language/Type/BoolType.php | 98 - .../Language/Type/CallableDeclarationType.php | 40 - .../Phan/Language/Type/CallableInterface.php | 12 - .../Phan/Language/Type/CallableStringType.php | 56 - .../src/Phan/Language/Type/CallableType.php | 41 - .../Phan/Language/Type/ClassStringType.php | 109 - .../Type/ClosureDeclarationParameter.php | 190 - .../Language/Type/ClosureDeclarationType.php | 32 - .../src/Phan/Language/Type/ClosureType.php | 186 - .../phan/src/Phan/Language/Type/FalseType.php | 93 - .../phan/src/Phan/Language/Type/FloatType.php | 25 - .../Type/FunctionLikeDeclarationType.php | 950 - .../Language/Type/GenericArrayInterface.php | 14 - .../Type/GenericArrayTemplateKeyType.php | 81 - .../Phan/Language/Type/GenericArrayType.php | 709 - .../Language/Type/GenericIterableType.php | 177 - .../Language/Type/GenericMultiArrayType.php | 258 - .../phan/src/Phan/Language/Type/IntType.php | 26 - .../src/Phan/Language/Type/IterableType.php | 36 - .../src/Phan/Language/Type/LiteralIntType.php | 200 - .../Phan/Language/Type/LiteralStringType.php | 326 - .../Language/Type/LiteralTypeInterface.php | 13 - .../phan/src/Phan/Language/Type/MixedType.php | 99 - .../phan/src/Phan/Language/Type/MultiType.php | 17 - .../src/Phan/Language/Type/NativeType.php | 308 - .../phan/src/Phan/Language/Type/NullType.php | 206 - .../src/Phan/Language/Type/ObjectType.php | 51 - .../src/Phan/Language/Type/ResourceType.php | 22 - .../src/Phan/Language/Type/ScalarRawType.php | 35 - .../src/Phan/Language/Type/ScalarType.php | 161 - .../phan/src/Phan/Language/Type/SelfType.php | 117 - .../Phan/Language/Type/StaticOrSelfType.php | 19 - .../src/Phan/Language/Type/StaticType.php | 120 - .../src/Phan/Language/Type/StringType.php | 61 - .../src/Phan/Language/Type/TemplateType.php | 174 - .../phan/src/Phan/Language/Type/TrueType.php | 83 - .../phan/src/Phan/Language/Type/VoidType.php | 32 - .../phan/phan/src/Phan/Language/UnionType.php | 3846 ---- .../src/Phan/Language/UnionTypeBuilder.php | 88 - .../LanguageServer/Client/TextDocument.php | 44 - .../src/Phan/LanguageServer/ClientHandler.php | 95 - .../Phan/LanguageServer/CompletionRequest.php | 214 - .../LanguageServer/CompletionResolver.php | 400 - .../LanguageServer/DefinitionResolver.php | 473 - .../src/Phan/LanguageServer/FileMapping.php | 96 - .../LanguageServer/GoToDefinitionRequest.php | 429 - .../src/Phan/LanguageServer/IdGenerator.php | 28 - .../Phan/LanguageServer/LanguageClient.php | 25 - .../Phan/LanguageServer/LanguageServer.php | 1007 - .../phan/src/Phan/LanguageServer/Logger.php | 117 - .../Phan/LanguageServer/NodeInfoRequest.php | 76 - .../Protocol/ClientCapabilities.php | 34 - .../Protocol/CompletionContext.php | 33 - .../Protocol/CompletionItem.php | 114 - .../Protocol/CompletionItemKind.php | 30 - .../Protocol/CompletionList.php | 37 - .../Protocol/CompletionOptions.php | 27 - .../Protocol/CompletionTriggerKind.php | 26 - .../LanguageServer/Protocol/Diagnostic.php | 74 - .../Protocol/DiagnosticSeverity.php | 32 - .../Protocol/FileChangeType.php | 29 - .../LanguageServer/Protocol/FileEvent.php | 37 - .../Phan/LanguageServer/Protocol/Hover.php | 41 - .../Protocol/InitializeResult.php | 27 - .../Phan/LanguageServer/Protocol/Location.php | 53 - .../LanguageServer/Protocol/MarkupContent.php | 64 - .../Phan/LanguageServer/Protocol/Message.php | 71 - .../Phan/LanguageServer/Protocol/Position.php | 94 - .../Phan/LanguageServer/Protocol/Range.php | 70 - .../LanguageServer/Protocol/SaveOptions.php | 19 - .../Protocol/ServerCapabilities.php | 138 - .../TextDocumentContentChangeEvent.php | 38 - .../Protocol/TextDocumentIdentifier.php | 26 - .../Protocol/TextDocumentItem.php | 46 - .../Protocol/TextDocumentSyncKind.php | 31 - .../Protocol/TextDocumentSyncOptions.php | 47 - .../VersionedTextDocumentIdentifier.php | 19 - .../Phan/LanguageServer/ProtocolReader.php | 24 - .../LanguageServer/ProtocolStreamReader.php | 142 - .../LanguageServer/ProtocolStreamWriter.php | 91 - .../Phan/LanguageServer/ProtocolWriter.php | 21 - .../LanguageServer/Server/TextDocument.php | 284 - .../Phan/LanguageServer/Server/Workspace.php | 93 - .../phan/src/Phan/LanguageServer/Utils.php | 93 - vendor/phan/phan/src/Phan/Library/Cache.php | 26 - .../phan/src/Phan/Library/ConversionSpec.php | 132 - .../phan/phan/src/Phan/Library/DiskCache.php | 117 - .../phan/phan/src/Phan/Library/FileCache.php | 118 - .../phan/src/Phan/Library/FileCacheEntry.php | 18 - vendor/phan/phan/src/Phan/Library/Hasher.php | 21 - .../src/Phan/Library/Hasher/Consistent.php | 108 - .../src/Phan/Library/Hasher/Sequential.php | 41 - vendor/phan/phan/src/Phan/Library/Map.php | 126 - vendor/phan/phan/src/Phan/Library/None.php | 57 - vendor/phan/phan/src/Phan/Library/Option.php | 40 - vendor/phan/phan/src/Phan/Library/Paths.php | 62 - vendor/phan/phan/src/Phan/Library/RAII.php | 46 - .../src/Phan/Library/RegexKeyExtractor.php | 217 - vendor/phan/phan/src/Phan/Library/Set.php | 249 - vendor/phan/phan/src/Phan/Library/Some.php | 62 - .../phan/src/Phan/Library/StderrLogger.php | 27 - .../phan/phan/src/Phan/Library/StringUtil.php | 66 - vendor/phan/phan/src/Phan/Library/Tuple.php | 27 - vendor/phan/phan/src/Phan/Library/Tuple1.php | 48 - vendor/phan/phan/src/Phan/Library/Tuple2.php | 49 - vendor/phan/phan/src/Phan/Library/Tuple3.php | 58 - vendor/phan/phan/src/Phan/Library/Tuple4.php | 66 - vendor/phan/phan/src/Phan/Library/Tuple5.php | 74 - vendor/phan/phan/src/Phan/Memoize.php | 101 - vendor/phan/phan/src/Phan/Ordering.php | 164 - .../Phan/Output/BufferedPrinterInterface.php | 15 - .../Output/Collector/BufferingCollector.php | 105 - .../Collector/ParallelChildCollector.php | 141 - .../Collector/ParallelParentCollector.php | 159 - .../phan/phan/src/Phan/Output/Colorizing.php | 207 - .../phan/src/Phan/Output/Filter/AnyFilter.php | 22 - .../Output/Filter/CategoryIssueFilter.php | 35 - .../Phan/Output/Filter/ChainedIssueFilter.php | 46 - .../Phan/Output/Filter/FileIssueFilter.php | 37 - .../Output/Filter/MinimumSeverityFilter.php | 37 - .../Output/IgnoredFilesFilterInterface.php | 16 - .../Phan/Output/IssueCollectorInterface.php | 41 - .../src/Phan/Output/IssueFilterInterface.php | 17 - .../src/Phan/Output/IssuePrinterInterface.php | 29 - .../src/Phan/Output/Printer/CSVPrinter.php | 73 - .../Phan/Output/Printer/CheckstylePrinter.php | 104 - .../Output/Printer/CodeClimatePrinter.php | 85 - .../Phan/Output/Printer/FilteringPrinter.php | 79 - .../src/Phan/Output/Printer/JSONPrinter.php | 72 - .../Phan/Output/Printer/PlainTextPrinter.php | 81 - .../src/Phan/Output/Printer/PylintPrinter.php | 69 - .../phan/src/Phan/Output/PrinterFactory.php | 60 - .../phan/phan/src/Phan/Parse/ParseVisitor.php | 1529 -- vendor/phan/phan/src/Phan/Phan.php | 712 - .../phan/src/Phan/Plugin/ClosuresForKind.php | 87 - .../phan/src/Phan/Plugin/ConfigPluginSet.php | 1148 -- .../ArrayReturnTypeOverridePlugin.php | 464 - .../Internal/BuiltinSuppressionPlugin.php | 236 - .../Plugin/Internal/CallableParamPlugin.php | 214 - .../ClosureReturnTypeOverridePlugin.php | 334 - .../Phan/Plugin/Internal/CompactPlugin.php | 89 - .../DependentReturnTypeOverridePlugin.php | 338 - .../Phan/Plugin/Internal/DumpPHPDocPlugin.php | 226 - ...endedDependentReturnTypeOverridePlugin.php | 169 - .../Plugin/Internal/IssueFixingPlugin.php | 34 - .../IssueFixingPlugin/FileContents.php | 160 - .../Internal/IssueFixingPlugin/FileEdit.php | 46 - .../IssueFixingPlugin/FileEditSet.php | 21 - .../Internal/IssueFixingPlugin/IssueFixer.php | 354 - .../Plugin/Internal/MethodSearcherPlugin.php | 339 - .../Internal/MethodSearcherPluginLoader.php | 5 - .../Phan/Plugin/Internal/MiscParamPlugin.php | 806 - .../Plugin/Internal/NodeSelectionPlugin.php | 77 - .../Plugin/Internal/RequireExistsPlugin.php | 141 - .../Plugin/Internal/StringFunctionPlugin.php | 212 - .../Plugin/Internal/ThrowAnalyzerPlugin.php | 335 - .../VariableTracker/VariableGraph.php | 208 - .../VariableTrackerVisitor.php | 825 - .../VariableTrackingBranchScope.php | 80 - .../VariableTrackingLoopScope.php | 60 - .../VariableTracker/VariableTrackingScope.php | 310 - .../Plugin/Internal/VariableTrackerPlugin.php | 424 - vendor/phan/phan/src/Phan/PluginV2.php | 127 - .../PluginV2/AfterAnalyzeFileCapability.php | 34 - .../Phan/PluginV2/AnalyzeClassCapability.php | 29 - .../AnalyzeFunctionCallCapability.php | 22 - .../PluginV2/AnalyzeFunctionCapability.php | 29 - .../Phan/PluginV2/AnalyzeMethodCapability.php | 29 - .../PluginV2/AnalyzePropertyCapability.php | 30 - .../Phan/PluginV2/AutomaticFixCapability.php | 24 - .../Phan/PluginV2/BeforeAnalyzeCapability.php | 24 - .../PluginV2/BeforeAnalyzeFileCapability.php | 34 - .../PluginV2/FinalizeProcessCapability.php | 25 - ...ndleLazyLoadInternalFunctionCapability.php | 29 - .../phan/src/Phan/PluginV2/IssueEmitter.php | 95 - .../PluginAwareBaseAnalysisVisitor.php | 106 - .../PluginAwarePostAnalysisVisitor.php | 30 - .../PluginAwarePreAnalysisVisitor.php | 30 - .../PluginV2/PostAnalyzeNodeCapability.php | 30 - .../PluginV2/PreAnalyzeNodeCapability.php | 29 - .../PluginV2/ReturnTypeOverrideCapability.php | 23 - .../PluginV2/StopParamAnalysisException.php | 14 - .../Phan/PluginV2/SuppressionCapability.php | 77 - vendor/phan/phan/src/Phan/Prep.php | 74 - vendor/phan/phan/src/Phan/Profile.php | 104 - vendor/phan/phan/src/Phan/README.md | 175 - vendor/phan/phan/src/Phan/Suggestion.php | 70 - vendor/phan/phan/src/codebase.php | 41 - vendor/phan/phan/src/phan.php | 39 - vendor/phan/phan/src/prep.php | 40 - vendor/phan/phan/src/requirements.php | 21 - vendor/phan/phan/src/spl_object_id.php | 60 - vendor/phan/phan/test | 5 - vendor/phan/phan/tocheckstyle | 51 - vendor/phan/phan/tool/README.md | 1 - vendor/phan/phan/tool/dump_markdown_preview | 25 - .../phan/tool/make_ctags_for_phan_project | 39 - vendor/phan/phan/tool/make_stubs | 267 - vendor/phan/phan/tool/phoogle | 38 - vendor/phar-io/manifest/.gitignore | 7 - vendor/phar-io/manifest/.php_cs | 67 - vendor/phar-io/manifest/.travis.yml | 33 - vendor/phar-io/manifest/LICENSE | 31 - vendor/phar-io/manifest/README.md | 30 - vendor/phar-io/manifest/build.xml | 50 - vendor/phar-io/manifest/composer.json | 42 - vendor/phar-io/manifest/composer.lock | 69 - .../phar-io/manifest/examples/example-01.php | 23 - vendor/phar-io/manifest/phive.xml | 4 - vendor/phar-io/manifest/phpunit.xml | 20 - .../manifest/src/ManifestDocumentMapper.php | 193 - .../phar-io/manifest/src/ManifestLoader.php | 66 - .../manifest/src/ManifestSerializer.php | 163 - .../manifest/src/exceptions/Exception.php | 14 - .../InvalidApplicationNameException.php | 16 - .../src/exceptions/InvalidEmailException.php | 14 - .../src/exceptions/InvalidUrlException.php | 14 - .../exceptions/ManifestDocumentException.php | 6 - .../ManifestDocumentMapperException.php | 6 - .../exceptions/ManifestElementException.php | 6 - .../exceptions/ManifestLoaderException.php | 6 - .../manifest/src/values/Application.php | 20 - .../manifest/src/values/ApplicationName.php | 65 - vendor/phar-io/manifest/src/values/Author.php | 57 - .../manifest/src/values/AuthorCollection.php | 43 - .../src/values/AuthorCollectionIterator.php | 56 - .../manifest/src/values/BundledComponent.php | 48 - .../src/values/BundledComponentCollection.php | 43 - .../BundledComponentCollectionIterator.php | 56 - .../src/values/CopyrightInformation.php | 42 - vendor/phar-io/manifest/src/values/Email.php | 47 - .../phar-io/manifest/src/values/Extension.php | 75 - .../phar-io/manifest/src/values/Library.php | 20 - .../phar-io/manifest/src/values/License.php | 42 - .../phar-io/manifest/src/values/Manifest.php | 138 - .../src/values/PhpExtensionRequirement.php | 32 - .../src/values/PhpVersionRequirement.php | 31 - .../manifest/src/values/Requirement.php | 14 - .../src/values/RequirementCollection.php | 43 - .../values/RequirementCollectionIterator.php | 56 - vendor/phar-io/manifest/src/values/Type.php | 60 - vendor/phar-io/manifest/src/values/Url.php | 47 - .../manifest/src/xml/AuthorElement.php | 21 - .../src/xml/AuthorElementCollection.php | 19 - .../manifest/src/xml/BundlesElement.php | 19 - .../manifest/src/xml/ComponentElement.php | 21 - .../src/xml/ComponentElementCollection.php | 19 - .../manifest/src/xml/ContainsElement.php | 31 - .../manifest/src/xml/CopyrightElement.php | 25 - .../manifest/src/xml/ElementCollection.php | 58 - .../phar-io/manifest/src/xml/ExtElement.php | 17 - .../manifest/src/xml/ExtElementCollection.php | 20 - .../manifest/src/xml/ExtensionElement.php | 21 - .../manifest/src/xml/LicenseElement.php | 21 - .../manifest/src/xml/ManifestDocument.php | 118 - .../xml/ManifestDocumentLoadingException.php | 48 - .../manifest/src/xml/ManifestElement.php | 100 - .../phar-io/manifest/src/xml/PhpElement.php | 27 - .../manifest/src/xml/RequiresElement.php | 19 - .../tests/ManifestDocumentMapperTest.php | 110 - .../manifest/tests/ManifestLoaderTest.php | 83 - .../manifest/tests/ManifestSerializerTest.php | 114 - .../manifest/tests/_fixture/custom.xml | 10 - .../_fixture/extension-invalidcompatible.xml | 13 - .../manifest/tests/_fixture/extension.xml | 13 - .../tests/_fixture/invalidversion.xml | 11 - .../_fixture/invalidversionconstraint.xml | 11 - .../manifest/tests/_fixture/library.xml | 11 - .../manifest/tests/_fixture/manifest.xml | 11 - .../manifest/tests/_fixture/phpunit-5.6.5.xml | 46 - .../phar-io/manifest/tests/_fixture/test.phar | Bin 7165 -> 0 bytes .../ManifestDocumentLoadingExceptionTest.php | 19 - .../tests/values/ApplicationNameTest.php | 57 - .../manifest/tests/values/ApplicationTest.php | 44 - .../tests/values/AuthorCollectionTest.php | 62 - .../manifest/tests/values/AuthorTest.php | 45 - .../values/BundledComponentCollectionTest.php | 63 - .../tests/values/BundledComponentTest.php | 42 - .../tests/values/CopyrightInformationTest.php | 62 - .../manifest/tests/values/EmailTest.php | 35 - .../manifest/tests/values/ExtensionTest.php | 109 - .../manifest/tests/values/LibraryTest.php | 44 - .../manifest/tests/values/LicenseTest.php | 41 - .../manifest/tests/values/ManifestTest.php | 187 - .../values/PhpExtensionRequirementTest.php | 26 - .../values/PhpVersionRequirementTest.php | 38 - .../values/RequirementCollectionTest.php | 63 - .../phar-io/manifest/tests/values/UrlTest.php | 35 - .../tests/xml/AuthorElementCollectionTest.php | 18 - .../manifest/tests/xml/AuthorElementTest.php | 25 - .../manifest/tests/xml/BundlesElementTest.php | 41 - .../xml/ComponentElementCollectionTest.php | 18 - .../tests/xml/ComponentElementTest.php | 25 - .../tests/xml/ContainsElementTest.php | 63 - .../tests/xml/CopyrightElementTest.php | 52 - .../tests/xml/ExtElementCollectionTest.php | 19 - .../manifest/tests/xml/ExtElementTest.php | 21 - .../tests/xml/ExtensionElementTest.php | 25 - .../manifest/tests/xml/LicenseElementTest.php | 25 - .../tests/xml/ManifestDocumentTest.php | 110 - .../manifest/tests/xml/PhpElementTest.php | 48 - .../tests/xml/RequiresElementTest.php | 37 - vendor/phar-io/version/.gitignore | 7 - vendor/phar-io/version/.php_cs | 67 - vendor/phar-io/version/.travis.yml | 33 - vendor/phar-io/version/CHANGELOG.md | 44 - vendor/phar-io/version/LICENSE | 31 - vendor/phar-io/version/README.md | 61 - vendor/phar-io/version/build.xml | 41 - vendor/phar-io/version/composer.json | 34 - vendor/phar-io/version/phive.xml | 5 - vendor/phar-io/version/phpunit.xml | 19 - .../phar-io/version/src/PreReleaseSuffix.php | 95 - vendor/phar-io/version/src/Version.php | 175 - .../version/src/VersionConstraintParser.php | 122 - .../version/src/VersionConstraintValue.php | 123 - vendor/phar-io/version/src/VersionNumber.php | 41 - .../constraints/AbstractVersionConstraint.php | 32 - .../constraints/AndVersionConstraintGroup.php | 43 - .../src/constraints/AnyVersionConstraint.php | 29 - .../constraints/ExactVersionConstraint.php | 22 - .../GreaterThanOrEqualToVersionConstraint.php | 38 - .../constraints/OrVersionConstraintGroup.php | 43 - ...SpecificMajorAndMinorVersionConstraint.php | 48 - .../SpecificMajorVersionConstraint.php | 37 - .../src/constraints/VersionConstraint.php | 26 - .../version/src/exceptions/Exception.php | 14 - .../InvalidPreReleaseSuffixException.php | 7 - .../exceptions/InvalidVersionException.php | 6 - .../UnsupportedVersionConstraintException.php | 14 - .../VersionConstraintParserTest.php | 146 - .../Unit/AbstractVersionConstraintTest.php | 25 - .../Unit/AndVersionConstraintGroupTest.php | 52 - .../tests/Unit/AnyVersionConstraintTest.php | 41 - .../tests/Unit/ExactVersionConstraintTest.php | 58 - ...aterThanOrEqualToVersionConstraintTest.php | 47 - .../Unit/OrVersionConstraintGroupTest.php | 65 - .../tests/Unit/PreReleaseSuffixTest.php | 46 - ...ificMajorAndMinorVersionConstraintTest.php | 45 - .../SpecificMajorVersionConstraintTest.php | 44 - .../version/tests/Unit/VersionTest.php | 113 - vendor/php-cs-fixer/diff/ChangeLog.md | 7 - vendor/php-cs-fixer/diff/LICENSE | 5 - vendor/php-cs-fixer/diff/LICENSE_DIFF | 31 - vendor/php-cs-fixer/diff/LICENSE_GECKO | 19 - vendor/php-cs-fixer/diff/README.md | 13 - vendor/php-cs-fixer/diff/composer.json | 41 - .../ConfigurationException.php | 36 - .../UnifiedDiffOutputBuilder.php | 295 - vendor/php-cs-fixer/diff/src/v1_4/Chunk.php | 103 - vendor/php-cs-fixer/diff/src/v1_4/Diff.php | 73 - vendor/php-cs-fixer/diff/src/v1_4/Differ.php | 399 - .../src/v1_4/LCS/LongestCommonSubsequence.php | 27 - ...LongestCommonSubsequenceImplementation.php | 95 - ...LongestCommonSubsequenceImplementation.php | 74 - vendor/php-cs-fixer/diff/src/v1_4/Line.php | 54 - vendor/php-cs-fixer/diff/src/v1_4/Parser.php | 110 - vendor/php-cs-fixer/diff/src/v2_0/Chunk.php | 78 - vendor/php-cs-fixer/diff/src/v2_0/Diff.php | 67 - vendor/php-cs-fixer/diff/src/v2_0/Differ.php | 321 - .../diff/src/v2_0/Exception/Exception.php | 15 - .../Exception/InvalidArgumentException.php | 15 - vendor/php-cs-fixer/diff/src/v2_0/Line.php | 44 - .../LongestCommonSubsequenceCalculator.php | 24 - ...ientLongestCommonSubsequenceCalculator.php | 81 - .../Output/AbstractChunkOutputBuilder.php | 56 - .../src/v2_0/Output/DiffOnlyOutputBuilder.php | 63 - .../Output/DiffOutputBuilderInterface.php | 19 - .../v2_0/Output/UnifiedDiffOutputBuilder.php | 165 - vendor/php-cs-fixer/diff/src/v2_0/Parser.php | 106 - ...ientLongestCommonSubsequenceCalculator.php | 66 - vendor/php-cs-fixer/diff/src/v3_0/Chunk.php | 78 - vendor/php-cs-fixer/diff/src/v3_0/Diff.php | 67 - vendor/php-cs-fixer/diff/src/v3_0/Differ.php | 329 - .../v3_0/Exception/ConfigurationException.php | 40 - .../diff/src/v3_0/Exception/Exception.php | 15 - .../Exception/InvalidArgumentException.php | 15 - vendor/php-cs-fixer/diff/src/v3_0/Line.php | 44 - .../LongestCommonSubsequenceCalculator.php | 24 - ...ientLongestCommonSubsequenceCalculator.php | 81 - .../Output/AbstractChunkOutputBuilder.php | 56 - .../src/v3_0/Output/DiffOnlyOutputBuilder.php | 66 - .../Output/DiffOutputBuilderInterface.php | 20 - .../Output/StrictUnifiedDiffOutputBuilder.php | 315 - .../v3_0/Output/UnifiedDiffOutputBuilder.php | 259 - vendor/php-cs-fixer/diff/src/v3_0/Parser.php | 106 - ...ientLongestCommonSubsequenceCalculator.php | 66 - .../reflection-common/.github/dependabot.yml | 7 - .../.github/workflows/push.yml | 223 - .../phpdocumentor/reflection-common/LICENSE | 22 - .../phpdocumentor/reflection-common/README.md | 11 - .../reflection-common/composer.json | 28 - .../reflection-common/src/Element.php | 30 - .../reflection-common/src/File.php | 35 - .../reflection-common/src/Fqsen.php | 89 - .../reflection-common/src/Location.php | 53 - .../reflection-common/src/Project.php | 25 - .../reflection-common/src/ProjectFactory.php | 28 - .../phpdocumentor/reflection-docblock/LICENSE | 21 - .../reflection-docblock/README.md | 75 - .../reflection-docblock/composer.json | 41 - .../reflection-docblock/src/DocBlock.php | 204 - .../src/DocBlock/Description.php | 114 - .../src/DocBlock/DescriptionFactory.php | 181 - .../src/DocBlock/ExampleFinder.php | 157 - .../src/DocBlock/Serializer.php | 151 - .../src/DocBlock/StandardTagFactory.php | 347 - .../reflection-docblock/src/DocBlock/Tag.php | 32 - .../src/DocBlock/TagFactory.php | 84 - .../src/DocBlock/Tags/Author.php | 92 - .../src/DocBlock/Tags/BaseTag.php | 53 - .../src/DocBlock/Tags/Covers.php | 78 - .../src/DocBlock/Tags/Deprecated.php | 100 - .../src/DocBlock/Tags/Example.php | 179 - .../DocBlock/Tags/Factory/StaticMethod.php | 25 - .../src/DocBlock/Tags/Formatter.php | 24 - .../Tags/Formatter/AlignFormatter.php | 49 - .../Tags/Formatter/PassthroughFormatter.php | 29 - .../src/DocBlock/Tags/Generic.php | 82 - .../src/DocBlock/Tags/InvalidTag.php | 133 - .../src/DocBlock/Tags/Link.php | 71 - .../src/DocBlock/Tags/Method.php | 265 - .../src/DocBlock/Tags/Param.php | 128 - .../src/DocBlock/Tags/Property.php | 104 - .../src/DocBlock/Tags/PropertyRead.php | 104 - .../src/DocBlock/Tags/PropertyWrite.php | 104 - .../src/DocBlock/Tags/Reference/Fqsen.php | 38 - .../src/DocBlock/Tags/Reference/Reference.php | 22 - .../src/DocBlock/Tags/Reference/Url.php | 36 - .../src/DocBlock/Tags/Return_.php | 56 - .../src/DocBlock/Tags/See.php | 83 - .../src/DocBlock/Tags/Since.php | 94 - .../src/DocBlock/Tags/Source.php | 103 - .../src/DocBlock/Tags/TagWithType.php | 65 - .../src/DocBlock/Tags/Throws.php | 56 - .../src/DocBlock/Tags/Uses.php | 78 - .../src/DocBlock/Tags/Var_.php | 105 - .../src/DocBlock/Tags/Version.php | 98 - .../src/DocBlockFactory.php | 286 - .../src/DocBlockFactoryInterface.php | 23 - vendor/phpdocumentor/type-resolver/LICENSE | 21 - vendor/phpdocumentor/type-resolver/README.md | 177 - .../phpdocumentor/type-resolver/composer.json | 34 - .../phpdocumentor/type-resolver/composer.lock | 71 - .../phpdocumentor/type-resolver/phpbench.json | 10 - .../type-resolver/src/FqsenResolver.php | 79 - .../phpdocumentor/type-resolver/src/Type.php | 25 - .../type-resolver/src/TypeResolver.php | 543 - .../type-resolver/src/Types/AbstractList.php | 83 - .../src/Types/AggregatedType.php | 124 - .../type-resolver/src/Types/Array_.php | 29 - .../type-resolver/src/Types/Boolean.php | 32 - .../type-resolver/src/Types/Callable_.php | 32 - .../type-resolver/src/Types/ClassString.php | 56 - .../type-resolver/src/Types/Collection.php | 68 - .../type-resolver/src/Types/Compound.php | 38 - .../type-resolver/src/Types/Context.php | 97 - .../src/Types/ContextFactory.php | 394 - .../type-resolver/src/Types/Expression.php | 51 - .../type-resolver/src/Types/False_.php | 29 - .../type-resolver/src/Types/Float_.php | 32 - .../type-resolver/src/Types/Integer.php | 32 - .../type-resolver/src/Types/Intersection.php | 37 - .../type-resolver/src/Types/Iterable_.php | 38 - .../type-resolver/src/Types/Mixed_.php | 32 - .../type-resolver/src/Types/Null_.php | 32 - .../type-resolver/src/Types/Nullable.php | 51 - .../type-resolver/src/Types/Object_.php | 68 - .../type-resolver/src/Types/Parent_.php | 34 - .../type-resolver/src/Types/Resource_.php | 32 - .../type-resolver/src/Types/Scalar.php | 32 - .../type-resolver/src/Types/Self_.php | 34 - .../type-resolver/src/Types/Static_.php | 39 - .../type-resolver/src/Types/String_.php | 32 - .../type-resolver/src/Types/This.php | 35 - .../type-resolver/src/Types/True_.php | 29 - .../type-resolver/src/Types/Void_.php | 35 - vendor/phpmd/phpmd/.mailmap | 4 - vendor/phpmd/phpmd/.scrutinizer.yml | 13 - vendor/phpmd/phpmd/.stickler.yml | 8 - vendor/phpmd/phpmd/AUTHORS.rst | 38 - vendor/phpmd/phpmd/CHANGELOG | 790 - vendor/phpmd/phpmd/CONTRIBUTING.md | 47 - vendor/phpmd/phpmd/LICENSE | 29 - vendor/phpmd/phpmd/README.rst | 204 - vendor/phpmd/phpmd/apigen.neon | 18 - vendor/phpmd/phpmd/build.properties | 22 - vendor/phpmd/phpmd/composer.json | 64 - vendor/phpmd/phpmd/src/bin/phpmd | 145 - vendor/phpmd/phpmd/src/bin/phpmd.bat | 22 - .../phpmd/phpmd/src/conf/phar_bootstrap.stub | 37 - .../phpmd/src/main/php/PHPMD/AbstractNode.php | 276 - .../src/main/php/PHPMD/AbstractRenderer.php | 83 - .../phpmd/src/main/php/PHPMD/AbstractRule.php | 399 - .../src/main/php/PHPMD/AbstractWriter.php | 32 - .../phpmd/src/main/php/PHPMD/Node/ASTNode.php | 122 - .../php/PHPMD/Node/AbstractCallableNode.php | 46 - .../src/main/php/PHPMD/Node/AbstractNode.php | 48 - .../main/php/PHPMD/Node/AbstractTypeNode.php | 115 - .../src/main/php/PHPMD/Node/Annotation.php | 87 - .../src/main/php/PHPMD/Node/Annotations.php | 72 - .../src/main/php/PHPMD/Node/ClassNode.php | 41 - .../src/main/php/PHPMD/Node/FunctionNode.php | 68 - .../src/main/php/PHPMD/Node/InterfaceNode.php | 36 - .../src/main/php/PHPMD/Node/MethodNode.php | 159 - .../src/main/php/PHPMD/Node/TraitNode.php | 36 - .../phpmd/phpmd/src/main/php/PHPMD/PHPMD.php | 209 - .../phpmd/phpmd/src/main/php/PHPMD/Parser.php | 280 - .../src/main/php/PHPMD/ParserFactory.php | 156 - .../src/main/php/PHPMD/ProcessingError.php | 89 - .../main/php/PHPMD/Renderer/AnsiRenderer.php | 144 - .../main/php/PHPMD/Renderer/HTMLRenderer.php | 156 - .../main/php/PHPMD/Renderer/JSONRenderer.php | 129 - .../main/php/PHPMD/Renderer/TextRenderer.php | 57 - .../main/php/PHPMD/Renderer/XMLRenderer.php | 129 - .../phpmd/phpmd/src/main/php/PHPMD/Report.php | 175 - .../phpmd/phpmd/src/main/php/PHPMD/Rule.php | 211 - .../php/PHPMD/Rule/AbstractLocalVariable.php | 166 - .../src/main/php/PHPMD/Rule/ClassAware.php | 25 - .../Rule/CleanCode/BooleanArgumentFlag.php | 57 - .../Rule/CleanCode/DuplicatedArrayKey.php | 137 - .../PHPMD/Rule/CleanCode/ElseExpression.php | 83 - .../Rule/CleanCode/IfStatementAssignment.php | 131 - .../PHPMD/Rule/CleanCode/MissingImport.php | 75 - .../php/PHPMD/Rule/CleanCode/StaticAccess.php | 100 - .../Rule/CleanCode/UndefinedVariable.php | 255 - .../Rule/Controversial/CamelCaseClassName.php | 51 - .../Controversial/CamelCaseMethodName.php | 86 - .../Controversial/CamelCaseParameterName.php | 53 - .../Controversial/CamelCasePropertyName.php | 61 - .../Controversial/CamelCaseVariableName.php | 77 - .../PHPMD/Rule/Controversial/Superglobals.php | 66 - .../php/PHPMD/Rule/CyclomaticComplexity.php | 54 - .../Rule/Design/CountInLoopExpression.php | 167 - .../Rule/Design/CouplingBetweenObjects.php | 45 - .../PHPMD/Rule/Design/DepthOfInheritance.php | 61 - .../Rule/Design/DevelopmentCodeFragment.php | 84 - .../php/PHPMD/Rule/Design/EmptyCatchBlock.php | 49 - .../php/PHPMD/Rule/Design/EvalExpression.php | 43 - .../php/PHPMD/Rule/Design/ExitExpression.php | 43 - .../php/PHPMD/Rule/Design/GotoStatement.php | 45 - .../main/php/PHPMD/Rule/Design/LongClass.php | 54 - .../main/php/PHPMD/Rule/Design/LongMethod.php | 64 - .../PHPMD/Rule/Design/LongParameterList.php | 55 - .../php/PHPMD/Rule/Design/NpathComplexity.php | 56 - .../PHPMD/Rule/Design/NumberOfChildren.php | 52 - .../php/PHPMD/Rule/Design/TooManyFields.php | 53 - .../php/PHPMD/Rule/Design/TooManyMethods.php | 84 - .../Rule/Design/TooManyPublicMethods.php | 84 - .../PHPMD/Rule/Design/WeightedMethodCount.php | 48 - .../php/PHPMD/Rule/ExcessivePublicCount.php | 53 - .../src/main/php/PHPMD/Rule/FunctionAware.php | 25 - .../main/php/PHPMD/Rule/InterfaceAware.php | 25 - .../src/main/php/PHPMD/Rule/MethodAware.php | 25 - .../Rule/Naming/BooleanGetMethodName.php | 98 - .../Rule/Naming/ConstantNamingConventions.php | 46 - .../ConstructorWithNameAsEnclosingClass.php | 56 - .../php/PHPMD/Rule/Naming/LongVariable.php | 172 - .../php/PHPMD/Rule/Naming/ShortMethodName.php | 76 - .../php/PHPMD/Rule/Naming/ShortVariable.php | 230 - .../php/PHPMD/Rule/UnusedFormalParameter.php | 250 - .../php/PHPMD/Rule/UnusedLocalVariable.php | 262 - .../php/PHPMD/Rule/UnusedPrivateField.php | 208 - .../php/PHPMD/Rule/UnusedPrivateMethod.php | 134 - .../PHPMD/RuleClassFileNotFoundException.php | 35 - .../php/PHPMD/RuleClassNotFoundException.php | 34 - .../phpmd/src/main/php/PHPMD/RuleSet.php | 267 - .../src/main/php/PHPMD/RuleSetFactory.php | 579 - .../php/PHPMD/RuleSetNotFoundException.php | 34 - .../src/main/php/PHPMD/RuleViolation.php | 208 - .../src/main/php/PHPMD/TextUI/Command.php | 152 - .../php/PHPMD/TextUI/CommandLineOptions.php | 572 - .../main/php/PHPMD/Writer/StreamWriter.php | 78 - .../src/main/resources/rulesets/cleancode.xml | 204 - .../src/main/resources/rulesets/codesize.xml | 420 - .../main/resources/rulesets/controversial.xml | 158 - .../src/main/resources/rulesets/design.xml | 289 - .../src/main/resources/rulesets/naming.xml | 363 - .../main/resources/rulesets/unusedcode.xml | 106 - vendor/phpspec/prophecy/CHANGES.md | 260 - vendor/phpspec/prophecy/LICENSE | 23 - vendor/phpspec/prophecy/README.md | 402 - vendor/phpspec/prophecy/composer.json | 50 - .../prophecy/src/Prophecy/Argument.php | 212 - .../Prophecy/Argument/ArgumentsWildcard.php | 101 - .../Prophecy/Argument/Token/AnyValueToken.php | 52 - .../Argument/Token/AnyValuesToken.php | 52 - .../Argument/Token/ApproximateValueToken.php | 55 - .../Argument/Token/ArrayCountToken.php | 86 - .../Argument/Token/ArrayEntryToken.php | 143 - .../Argument/Token/ArrayEveryEntryToken.php | 82 - .../Prophecy/Argument/Token/CallbackToken.php | 75 - .../Argument/Token/ExactValueToken.php | 118 - .../Argument/Token/IdenticalValueToken.php | 74 - .../Argument/Token/LogicalAndToken.php | 80 - .../Argument/Token/LogicalNotToken.php | 73 - .../Argument/Token/ObjectStateToken.php | 104 - .../Argument/Token/StringContainsToken.php | 67 - .../Argument/Token/TokenInterface.php | 43 - .../src/Prophecy/Argument/Token/TypeToken.php | 76 - .../prophecy/src/Prophecy/Call/Call.php | 162 - .../prophecy/src/Prophecy/Call/CallCenter.php | 240 - .../Prophecy/Comparator/ClosureComparator.php | 44 - .../src/Prophecy/Comparator/Factory.php | 47 - .../Comparator/ProphecyComparator.php | 28 - .../src/Prophecy/Doubler/CachedDoubler.php | 66 - .../ClassPatch/ClassPatchInterface.php | 48 - .../ClassPatch/DisableConstructorPatch.php | 76 - .../Doubler/ClassPatch/HhvmExceptionPatch.php | 63 - .../Doubler/ClassPatch/KeywordPatch.php | 68 - .../Doubler/ClassPatch/MagicCallPatch.php | 94 - .../ClassPatch/ProphecySubjectPatch.php | 111 - .../ReflectionClassNewInstancePatch.php | 57 - .../Doubler/ClassPatch/SplFileInfoPatch.php | 123 - .../Doubler/ClassPatch/ThrowablePatch.php | 95 - .../Doubler/ClassPatch/TraversablePatch.php | 83 - .../src/Prophecy/Doubler/DoubleInterface.php | 22 - .../prophecy/src/Prophecy/Doubler/Doubler.php | 146 - .../Doubler/Generator/ClassCodeGenerator.php | 117 - .../Doubler/Generator/ClassCreator.php | 67 - .../Doubler/Generator/ClassMirror.php | 253 - .../Doubler/Generator/Node/ArgumentNode.php | 102 - .../Doubler/Generator/Node/ClassNode.php | 169 - .../Doubler/Generator/Node/MethodNode.php | 198 - .../Doubler/Generator/ReflectionInterface.php | 22 - .../Doubler/Generator/TypeHintReference.php | 41 - .../src/Prophecy/Doubler/LazyDouble.php | 127 - .../src/Prophecy/Doubler/NameGenerator.php | 52 - .../Call/UnexpectedCallException.php | 40 - .../Doubler/ClassCreatorException.php | 31 - .../Doubler/ClassMirrorException.php | 31 - .../Doubler/ClassNotFoundException.php | 33 - .../Exception/Doubler/DoubleException.php | 18 - .../Exception/Doubler/DoublerException.php | 18 - .../Doubler/InterfaceNotFoundException.php | 20 - .../Doubler/MethodNotExtendableException.php | 41 - .../Doubler/MethodNotFoundException.php | 60 - .../Doubler/ReturnByReferenceException.php | 41 - .../src/Prophecy/Exception/Exception.php | 26 - .../Exception/InvalidArgumentException.php | 16 - .../Prediction/AggregateException.php | 51 - .../Prediction/FailedPredictionException.php | 24 - .../Exception/Prediction/NoCallsException.php | 18 - .../Prediction/PredictionException.php | 18 - .../UnexpectedCallsCountException.php | 31 - .../Prediction/UnexpectedCallsException.php | 32 - .../Prophecy/MethodProphecyException.php | 34 - .../Prophecy/ObjectProphecyException.php | 34 - .../Exception/Prophecy/ProphecyException.php | 18 - .../ClassAndInterfaceTagRetriever.php | 69 - .../PhpDocumentor/ClassTagRetriever.php | 60 - .../PhpDocumentor/LegacyClassTagRetriever.php | 35 - .../MethodTagRetrieverInterface.php | 30 - .../Prophecy/Prediction/CallPrediction.php | 86 - .../Prediction/CallTimesPrediction.php | 107 - .../Prediction/CallbackPrediction.php | 65 - .../Prophecy/Prediction/NoCallsPrediction.php | 68 - .../Prediction/PredictionInterface.php | 37 - .../src/Prophecy/Promise/CallbackPromise.php | 66 - .../src/Prophecy/Promise/PromiseInterface.php | 35 - .../Promise/ReturnArgumentPromise.php | 61 - .../src/Prophecy/Promise/ReturnPromise.php | 55 - .../src/Prophecy/Promise/ThrowPromise.php | 100 - .../src/Prophecy/Prophecy/MethodProphecy.php | 517 - .../src/Prophecy/Prophecy/ObjectProphecy.php | 286 - .../Prophecy/Prophecy/ProphecyInterface.php | 27 - .../Prophecy/ProphecySubjectInterface.php | 34 - .../src/Prophecy/Prophecy/Revealer.php | 44 - .../Prophecy/Prophecy/RevealerInterface.php | 29 - .../phpspec/prophecy/src/Prophecy/Prophet.php | 138 - .../prophecy/src/Prophecy/Util/ExportUtil.php | 210 - .../prophecy/src/Prophecy/Util/StringUtil.php | 99 - vendor/phpstan/phpstan/.gitattributes | 10 - vendor/phpstan/phpstan/.gitignore | 9 - vendor/phpstan/phpstan/LICENSE | 21 - vendor/phpstan/phpstan/README.md | 64 - vendor/phpstan/phpstan/bootstrap.php | 43 - vendor/phpstan/phpstan/composer.json | 23 - vendor/phpstan/phpstan/conf/bleedingEdge.neon | 2 - vendor/phpstan/phpstan/phpstan | Bin 15695091 -> 0 bytes vendor/phpstan/phpstan/phpstan.phar | Bin 15695091 -> 0 bytes vendor/phpstan/phpstan/phpstan.phar.asc | 17 - .../phpunit/php-code-coverage/.gitattributes | 11 - vendor/phpunit/php-code-coverage/.gitignore | 7 - vendor/phpunit/php-code-coverage/ChangeLog.md | 158 - vendor/phpunit/php-code-coverage/LICENSE | 33 - vendor/phpunit/php-code-coverage/README.md | 45 - .../phpunit/php-code-coverage/composer.json | 65 - .../php-code-coverage/src/CodeCoverage.php | 1006 - .../php-code-coverage/src/Directory.php | 30 - .../php-code-coverage/src/Driver/Driver.php | 47 - .../php-code-coverage/src/Driver/PCOV.php | 43 - .../php-code-coverage/src/Driver/PHPDBG.php | 94 - .../php-code-coverage/src/Driver/Xdebug.php | 110 - .../CoveredCodeNotExecutedException.php | 17 - .../DirectoryCouldNotBeCreatedException.php | 14 - .../src/Exception/Exception.php | 17 - .../Exception/InvalidArgumentException.php | 36 - .../MissingCoversAnnotationException.php | 17 - .../src/Exception/RuntimeException.php | 14 - .../UnintentionallyCoveredCodeException.php | 44 - .../phpunit/php-code-coverage/src/Filter.php | 174 - .../src/Node/AbstractNode.php | 363 - .../php-code-coverage/src/Node/Builder.php | 227 - .../php-code-coverage/src/Node/Directory.php | 427 - .../php-code-coverage/src/Node/File.php | 615 - .../php-code-coverage/src/Node/Iterator.php | 89 - .../php-code-coverage/src/Percentage.php | 61 - .../php-code-coverage/src/Report/Clover.php | 254 - .../php-code-coverage/src/Report/Crap4j.php | 151 - .../src/Report/Html/Facade.php | 148 - .../src/Report/Html/Renderer.php | 280 - .../src/Report/Html/Renderer/Dashboard.php | 282 - .../src/Report/Html/Renderer/Directory.php | 99 - .../src/Report/Html/Renderer/File.php | 520 - .../Renderer/Template/coverage_bar.html.dist | 5 - .../Renderer/Template/css/bootstrap.min.css | 7 - .../Html/Renderer/Template/css/custom.css | 0 .../Html/Renderer/Template/css/nv.d3.min.css | 1 - .../Html/Renderer/Template/css/octicons.css | 5 - .../Html/Renderer/Template/css/style.css | 122 - .../Renderer/Template/dashboard.html.dist | 281 - .../Renderer/Template/directory.html.dist | 60 - .../Template/directory_item.html.dist | 13 - .../Html/Renderer/Template/file.html.dist | 72 - .../Renderer/Template/file_item.html.dist | 14 - .../Renderer/Template/icons/file-code.svg | 1 - .../Template/icons/file-directory.svg | 1 - .../Renderer/Template/js/bootstrap.min.js | 7 - .../Html/Renderer/Template/js/d3.min.js | 5 - .../Report/Html/Renderer/Template/js/file.js | 62 - .../Html/Renderer/Template/js/jquery.min.js | 2 - .../Html/Renderer/Template/js/nv.d3.min.js | 8 - .../Html/Renderer/Template/js/popper.min.js | 5 - .../Renderer/Template/method_item.html.dist | 11 - .../php-code-coverage/src/Report/PHP.php | 58 - .../php-code-coverage/src/Report/Text.php | 279 - .../src/Report/Xml/BuildInformation.php | 81 - .../src/Report/Xml/Coverage.php | 69 - .../src/Report/Xml/Directory.php | 14 - .../src/Report/Xml/Facade.php | 282 - .../php-code-coverage/src/Report/Xml/File.php | 81 - .../src/Report/Xml/Method.php | 56 - .../php-code-coverage/src/Report/Xml/Node.php | 87 - .../src/Report/Xml/Project.php | 85 - .../src/Report/Xml/Report.php | 92 - .../src/Report/Xml/Source.php | 38 - .../src/Report/Xml/Tests.php | 46 - .../src/Report/Xml/Totals.php | 140 - .../php-code-coverage/src/Report/Xml/Unit.php | 95 - .../phpunit/php-code-coverage/src/Version.php | 30 - .../phpunit/php-file-iterator/.gitattributes | 11 - vendor/phpunit/php-file-iterator/.gitignore | 6 - vendor/phpunit/php-file-iterator/ChangeLog.md | 105 - vendor/phpunit/php-file-iterator/LICENSE | 33 - vendor/phpunit/php-file-iterator/README.md | 14 - .../phpunit/php-file-iterator/composer.json | 45 - .../phpunit/php-file-iterator/src/Facade.php | 115 - .../phpunit/php-file-iterator/src/Factory.php | 91 - .../php-file-iterator/src/Iterator.php | 119 - vendor/phpunit/php-invoker/.gitattributes | 11 - vendor/phpunit/php-invoker/.gitignore | 6 - vendor/phpunit/php-invoker/ChangeLog.md | 34 - vendor/phpunit/php-invoker/LICENSE | 33 - vendor/phpunit/php-invoker/README.md | 18 - vendor/phpunit/php-invoker/composer.json | 51 - vendor/phpunit/php-invoker/src/Invoker.php | 75 - .../php-invoker/src/exceptions/Exception.php | 16 - ...cessControlExtensionNotLoadedException.php | 16 - .../src/exceptions/TimeoutException.php | 16 - .../phpunit/php-text-template/.gitattributes | 11 - vendor/phpunit/php-text-template/.gitignore | 5 - vendor/phpunit/php-text-template/ChangeLog.md | 29 - vendor/phpunit/php-text-template/LICENSE | 33 - vendor/phpunit/php-text-template/README.md | 12 - .../phpunit/php-text-template/composer.json | 43 - .../php-text-template/src/Template.php | 107 - .../src/exceptions/Exception.php | 14 - .../exceptions/InvalidArgumentException.php | 14 - .../src/exceptions/RuntimeException.php | 16 - vendor/phpunit/php-timer/.gitattributes | 11 - vendor/phpunit/php-timer/.gitignore | 6 - vendor/phpunit/php-timer/ChangeLog.md | 124 - vendor/phpunit/php-timer/LICENSE | 33 - vendor/phpunit/php-timer/README.md | 104 - vendor/phpunit/php-timer/composer.json | 45 - vendor/phpunit/php-timer/src/Duration.php | 109 - .../php-timer/src/ResourceUsageFormatter.php | 73 - vendor/phpunit/php-timer/src/Timer.php | 40 - .../php-timer/src/exceptions/Exception.php | 14 - .../src/exceptions/NoActiveTimerException.php | 16 - ...nceStartOfRequestNotAvailableException.php | 16 - .../phpunit/php-token-stream/.gitattributes | 12 - vendor/phpunit/php-token-stream/.gitignore | 7 - vendor/phpunit/php-token-stream/ChangeLog.md | 85 - vendor/phpunit/php-token-stream/LICENSE | 33 - vendor/phpunit/php-token-stream/README.md | 18 - vendor/phpunit/php-token-stream/composer.json | 42 - vendor/phpunit/php-token-stream/src/Token.php | 1360 -- .../php-token-stream/src/Token/Stream.php | 661 - .../src/Token/Stream/CachingFactory.php | 45 - .../php-token-stream/src/Token/Util.php | 18 - vendor/phpunit/phpunit/.phpstorm.meta.php | 45 - vendor/phpunit/phpunit/ChangeLog-8.5.md | 88 - vendor/phpunit/phpunit/ChangeLog-9.2.md | 65 - vendor/phpunit/phpunit/LICENSE | 33 - vendor/phpunit/phpunit/README.md | 41 - vendor/phpunit/phpunit/composer.json | 93 - vendor/phpunit/phpunit/phpunit | 61 - vendor/phpunit/phpunit/phpunit.xsd | 317 - vendor/phpunit/phpunit/src/Exception.php | 17 - .../phpunit/phpunit/src/Framework/Assert.php | 2726 --- .../src/Framework/Assert/Functions.php | 2306 --- .../src/Framework/Constraint/ArrayHasKey.php | 80 - .../src/Framework/Constraint/Callback.php | 45 - .../Constraint/ClassHasAttribute.php | 86 - .../Constraint/ClassHasStaticAttribute.php | 59 - .../src/Framework/Constraint/Constraint.php | 155 - .../src/Framework/Constraint/Count.php | 129 - .../Framework/Constraint/DirectoryExists.php | 53 - .../src/Framework/Constraint/Exception.php | 79 - .../Framework/Constraint/ExceptionCode.php | 61 - .../Framework/Constraint/ExceptionMessage.php | 71 - .../ExceptionMessageRegularExpression.php | 69 - .../src/Framework/Constraint/FileExists.php | 53 - .../src/Framework/Constraint/GreaterThan.php | 51 - .../src/Framework/Constraint/IsAnything.php | 51 - .../src/Framework/Constraint/IsEmpty.php | 63 - .../src/Framework/Constraint/IsEqual.php | 140 - .../Constraint/IsEqualCanonicalizing.php | 101 - .../Constraint/IsEqualIgnoringCase.php | 101 - .../Framework/Constraint/IsEqualWithDelta.php | 95 - .../src/Framework/Constraint/IsFalse.php | 35 - .../src/Framework/Constraint/IsFinite.php | 35 - .../src/Framework/Constraint/IsIdentical.php | 140 - .../src/Framework/Constraint/IsInfinite.php | 35 - .../src/Framework/Constraint/IsInstanceOf.php | 86 - .../src/Framework/Constraint/IsJson.php | 73 - .../src/Framework/Constraint/IsNan.php | 35 - .../src/Framework/Constraint/IsNull.php | 35 - .../src/Framework/Constraint/IsReadable.php | 53 - .../src/Framework/Constraint/IsTrue.php | 35 - .../src/Framework/Constraint/IsType.php | 202 - .../src/Framework/Constraint/IsWritable.php | 53 - .../src/Framework/Constraint/JsonMatches.php | 107 - .../JsonMatchesErrorMessageProvider.php | 64 - .../src/Framework/Constraint/LessThan.php | 51 - .../src/Framework/Constraint/LogicalAnd.php | 120 - .../src/Framework/Constraint/LogicalNot.php | 167 - .../src/Framework/Constraint/LogicalOr.php | 116 - .../src/Framework/Constraint/LogicalXor.php | 123 - .../Constraint/ObjectHasAttribute.php | 30 - .../Constraint/RegularExpression.php | 54 - .../src/Framework/Constraint/SameSize.php | 18 - .../Framework/Constraint/StringContains.php | 86 - .../Framework/Constraint/StringEndsWith.php | 46 - .../StringMatchesFormatDescription.php | 99 - .../Framework/Constraint/StringStartsWith.php | 52 - .../Constraint/TraversableContains.php | 61 - .../Constraint/TraversableContainsEqual.php | 39 - .../TraversableContainsIdentical.php | 38 - .../Constraint/TraversableContainsOnly.php | 91 - .../src/Framework/DataProviderTestSuite.php | 61 - .../src/Framework/Error/Deprecated.php | 17 - .../phpunit/src/Framework/Error/Error.php | 26 - .../phpunit/src/Framework/Error/Notice.php | 17 - .../phpunit/src/Framework/Error/Warning.php | 17 - .../Exception/AssertionFailedError.php | 24 - .../Exception/CodeCoverageException.php | 17 - .../CoveredCodeNotExecutedException.php | 17 - .../src/Framework/Exception/Exception.php | 77 - .../Exception/ExpectationFailedException.php | 41 - .../Exception/IncompleteTestError.php | 17 - .../Exception/InvalidArgumentException.php | 37 - .../InvalidCoversTargetException.php | 17 - .../InvalidDataProviderException.php | 17 - .../MissingCoversAnnotationException.php | 17 - .../Exception/NoChildTestSuiteException.php | 17 - .../src/Framework/Exception/OutputError.php | 17 - .../Exception/PHPTAssertionFailedError.php | 32 - .../Framework/Exception/RiskyTestError.php | 17 - .../Framework/Exception/SkippedTestError.php | 17 - .../Exception/SkippedTestSuiteError.php | 17 - .../Framework/Exception/SyntheticError.php | 61 - .../Exception/SyntheticSkippedError.php | 17 - .../UnintentionallyCoveredCodeError.php | 17 - .../src/Framework/Exception/Warning.php | 24 - .../src/Framework/ExceptionWrapper.php | 117 - .../phpunit/src/Framework/IncompleteTest.php | 17 - .../src/Framework/IncompleteTestCase.php | 71 - .../InvalidParameterGroupException.php | 17 - .../src/Framework/MockObject/Api/Api.php | 97 - .../src/Framework/MockObject/Api/Method.php | 28 - .../MockObject/Api/MockedCloneMethod.php | 21 - .../MockObject/Api/UnmockedCloneMethod.php | 23 - .../Framework/MockObject/Builder/Identity.php | 25 - .../MockObject/Builder/InvocationMocker.php | 288 - .../MockObject/Builder/InvocationStubber.php | 61 - .../Framework/MockObject/Builder/Match.php | 26 - .../MockObject/Builder/MethodNameMatch.php | 26 - .../MockObject/Builder/ParametersMatch.php | 48 - .../src/Framework/MockObject/Builder/Stub.php | 24 - .../MockObject/ConfigurableMethod.php | 53 - .../Exception/BadMethodCallException.php | 17 - ...ableMethodsAlreadyInitializedException.php | 17 - .../MockObject/Exception/Exception.php | 17 - .../IncompatibleReturnValueException.php | 17 - .../MockObject/Exception/RuntimeException.php | 17 - .../src/Framework/MockObject/Generator.php | 940 - .../MockObject/Generator/deprecation.tpl | 2 - .../MockObject/Generator/mocked_class.tpl | 6 - .../MockObject/Generator/mocked_method.tpl | 22 - .../Generator/mocked_method_void.tpl | 20 - .../Generator/mocked_static_method.tpl | 5 - .../MockObject/Generator/proxied_method.tpl | 22 - .../Generator/proxied_method_void.tpl | 22 - .../MockObject/Generator/trait_class.tpl | 6 - .../MockObject/Generator/wsdl_class.tpl | 9 - .../MockObject/Generator/wsdl_method.tpl | 4 - .../src/Framework/MockObject/Invocation.php | 201 - .../MockObject/InvocationHandler.php | 191 - .../src/Framework/MockObject/Matcher.php | 274 - .../MockObject/MethodNameConstraint.php | 45 - .../src/Framework/MockObject/MockBuilder.php | 506 - .../src/Framework/MockObject/MockClass.php | 60 - .../src/Framework/MockObject/MockMethod.php | 335 - .../Framework/MockObject/MockMethodSet.php | 41 - .../src/Framework/MockObject/MockObject.php | 25 - .../src/Framework/MockObject/MockTrait.php | 46 - .../src/Framework/MockObject/MockType.php | 18 - .../MockObject/Rule/AnyInvokedCount.php | 36 - .../MockObject/Rule/AnyParameters.php | 31 - .../MockObject/Rule/ConsecutiveParameters.php | 132 - .../MockObject/Rule/InvocationOrder.php | 46 - .../MockObject/Rule/InvokedAtIndex.php | 71 - .../MockObject/Rule/InvokedAtLeastCount.php | 64 - .../MockObject/Rule/InvokedAtLeastOnce.php | 50 - .../MockObject/Rule/InvokedAtMostCount.php | 64 - .../MockObject/Rule/InvokedCount.php | 101 - .../Framework/MockObject/Rule/MethodName.php | 63 - .../Framework/MockObject/Rule/Parameters.php | 156 - .../MockObject/Rule/ParametersRule.php | 25 - .../phpunit/src/Framework/MockObject/Stub.php | 24 - .../MockObject/Stub/ConsecutiveCalls.php | 55 - .../Framework/MockObject/Stub/Exception.php | 44 - .../MockObject/Stub/ReturnArgument.php | 40 - .../MockObject/Stub/ReturnCallback.php | 54 - .../MockObject/Stub/ReturnReference.php | 44 - .../Framework/MockObject/Stub/ReturnSelf.php | 32 - .../Framework/MockObject/Stub/ReturnStub.php | 44 - .../MockObject/Stub/ReturnValueMap.php | 50 - .../src/Framework/MockObject/Stub/Stub.php | 27 - .../src/Framework/MockObject/Verifiable.php | 26 - .../phpunit/src/Framework/SelfDescribing.php | 21 - .../phpunit/src/Framework/SkippedTest.php | 17 - .../phpunit/src/Framework/SkippedTestCase.php | 71 - vendor/phpunit/phpunit/src/Framework/Test.php | 21 - .../phpunit/src/Framework/TestBuilder.php | 232 - .../phpunit/src/Framework/TestCase.php | 2433 --- .../phpunit/src/Framework/TestFailure.php | 151 - .../phpunit/src/Framework/TestListener.php | 82 - .../TestListenerDefaultImplementation.php | 56 - .../phpunit/src/Framework/TestResult.php | 1241 -- .../phpunit/src/Framework/TestSuite.php | 829 - .../src/Framework/TestSuiteIterator.php | 79 - .../phpunit/src/Framework/WarningTestCase.php | 73 - .../phpunit/src/Runner/BaseTestRunner.php | 156 - .../src/Runner/DefaultTestResultCache.php | 217 - .../phpunit/phpunit/src/Runner/Exception.php | 17 - .../Filter/ExcludeGroupFilterIterator.php | 21 - .../phpunit/src/Runner/Filter/Factory.php | 55 - .../src/Runner/Filter/GroupFilterIterator.php | 52 - .../Filter/IncludeGroupFilterIterator.php | 21 - .../src/Runner/Filter/NameFilterIterator.php | 124 - .../Runner/Hook/AfterIncompleteTestHook.php | 15 - .../src/Runner/Hook/AfterLastTestHook.php | 15 - .../src/Runner/Hook/AfterRiskyTestHook.php | 15 - .../src/Runner/Hook/AfterSkippedTestHook.php | 15 - .../Runner/Hook/AfterSuccessfulTestHook.php | 15 - .../src/Runner/Hook/AfterTestErrorHook.php | 15 - .../src/Runner/Hook/AfterTestFailureHook.php | 15 - .../phpunit/src/Runner/Hook/AfterTestHook.php | 21 - .../src/Runner/Hook/AfterTestWarningHook.php | 15 - .../src/Runner/Hook/BeforeFirstTestHook.php | 15 - .../src/Runner/Hook/BeforeTestHook.php | 15 - .../phpunit/phpunit/src/Runner/Hook/Hook.php | 14 - .../phpunit/src/Runner/Hook/TestHook.php | 14 - .../src/Runner/Hook/TestListenerAdapter.php | 140 - .../src/Runner/NullTestResultCache.php | 42 - .../phpunit/src/Runner/PhptTestCase.php | 758 - .../src/Runner/ResultCacheExtension.php | 107 - .../src/Runner/StandardTestSuiteLoader.php | 112 - .../phpunit/src/Runner/TestResultCache.php | 28 - .../phpunit/src/Runner/TestSuiteLoader.php | 22 - .../phpunit/src/Runner/TestSuiteSorter.php | 434 - vendor/phpunit/phpunit/src/Runner/Version.php | 57 - .../src/TextUI/Arguments/Arguments.php | 1686 -- .../src/TextUI/Arguments/ArgumentsBuilder.php | 817 - .../src/TextUI/Arguments/ArgumentsMapper.php | 334 - .../src/TextUI/Arguments/Exception.php | 17 - vendor/phpunit/phpunit/src/TextUI/Command.php | 740 - .../TextUI/Configuration/Configuration.php | 153 - .../src/TextUI/Configuration/Exception.php | 17 - .../Configuration/Filesystem/Directory.php | 32 - .../Filesystem/DirectoryCollection.php | 58 - .../DirectoryCollectionIterator.php | 61 - .../TextUI/Configuration/Filesystem/File.php | 32 - .../Filesystem/FileCollection.php | 58 - .../Filesystem/FileCollectionIterator.php | 61 - .../TextUI/Configuration/Filter/Filter.php | 92 - .../Configuration/Filter/FilterDirectory.php | 65 - .../Filter/FilterDirectoryCollection.php | 53 - .../FilterDirectoryCollectionIterator.php | 61 - .../Configuration/Filter/FilterFile.php | 32 - .../Filter/FilterFileCollection.php | 53 - .../Filter/FilterFileCollectionIterator.php | 61 - .../src/TextUI/Configuration/Generator.php | 64 - .../src/TextUI/Configuration/Group/Group.php | 32 - .../Configuration/Group/GroupCollection.php | 67 - .../Group/GroupCollectionIterator.php | 61 - .../src/TextUI/Configuration/Group/Groups.php | 53 - .../src/TextUI/Configuration/Loader.php | 911 - .../Logging/CodeCoverage/Clover.php | 34 - .../Logging/CodeCoverage/Crap4j.php | 45 - .../Logging/CodeCoverage/Html.php | 56 - .../Logging/CodeCoverage/Php.php | 34 - .../Logging/CodeCoverage/Text.php | 56 - .../Logging/CodeCoverage/Xml.php | 34 - .../TextUI/Configuration/Logging/Junit.php | 34 - .../TextUI/Configuration/Logging/Logging.php | 272 - .../Configuration/Logging/PlainText.php | 34 - .../TextUI/Configuration/Logging/TeamCity.php | 34 - .../Configuration/Logging/TestDox/Html.php | 34 - .../Configuration/Logging/TestDox/Text.php | 34 - .../Configuration/Logging/TestDox/Xml.php | 34 - .../src/TextUI/Configuration/PHP/Constant.php | 43 - .../Configuration/PHP/ConstantCollection.php | 53 - .../PHP/ConstantCollectionIterator.php | 61 - .../TextUI/Configuration/PHP/IniSetting.php | 43 - .../PHP/IniSettingCollection.php | 53 - .../PHP/IniSettingCollectionIterator.php | 61 - .../src/TextUI/Configuration/PHP/Php.php | 142 - .../TextUI/Configuration/PHP/PhpHandler.php | 115 - .../src/TextUI/Configuration/PHP/Variable.php | 54 - .../Configuration/PHP/VariableCollection.php | 53 - .../PHP/VariableCollectionIterator.php | 61 - .../Configuration/PHPUnit/Extension.php | 71 - .../PHPUnit/ExtensionCollection.php | 48 - .../PHPUnit/ExtensionCollectionIterator.php | 61 - .../PHPUnit/ExtensionHandler.php | 97 - .../TextUI/Configuration/PHPUnit/PHPUnit.php | 714 - .../src/TextUI/Configuration/Registry.php | 52 - .../Configuration/TestSuite/TestDirectory.php | 78 - .../TestSuite/TestDirectoryCollection.php | 58 - .../TestDirectoryCollectionIterator.php | 61 - .../Configuration/TestSuite/TestFile.php | 56 - .../TestSuite/TestFileCollection.php | 58 - .../TestSuite/TestFileCollectionIterator.php | 61 - .../Configuration/TestSuite/TestSuite.php | 65 - .../TestSuite/TestSuiteCollection.php | 58 - .../TestSuite/TestSuiteCollectionIterator.php | 61 - .../TestSuite/TestSuiteMapper.php | 73 - .../src/TextUI/DefaultResultPrinter.php | 575 - .../phpunit/phpunit/src/TextUI/Exception.php | 17 - vendor/phpunit/phpunit/src/TextUI/Help.php | 248 - .../phpunit/src/TextUI/ResultPrinter.php | 20 - .../phpunit/phpunit/src/TextUI/TestRunner.php | 1203 -- .../phpunit/src/Util/Annotation/DocBlock.php | 514 - .../phpunit/src/Util/Annotation/Registry.php | 89 - vendor/phpunit/phpunit/src/Util/Blacklist.php | 231 - vendor/phpunit/phpunit/src/Util/Color.php | 143 - .../phpunit/phpunit/src/Util/ErrorHandler.php | 145 - vendor/phpunit/phpunit/src/Util/Exception.php | 17 - .../phpunit/phpunit/src/Util/FileLoader.php | 74 - .../phpunit/phpunit/src/Util/Filesystem.php | 35 - vendor/phpunit/phpunit/src/Util/Filter.php | 110 - vendor/phpunit/phpunit/src/Util/Getopt.php | 179 - .../phpunit/phpunit/src/Util/GlobalState.php | 177 - .../src/Util/InvalidDataSetException.php | 17 - vendor/phpunit/phpunit/src/Util/Json.php | 88 - vendor/phpunit/phpunit/src/Util/Log/JUnit.php | 422 - .../phpunit/phpunit/src/Util/Log/TeamCity.php | 375 - .../src/Util/PHP/AbstractPhpProcess.php | 397 - .../src/Util/PHP/DefaultPhpProcess.php | 219 - .../src/Util/PHP/Template/PhptTestCase.tpl | 40 - .../src/Util/PHP/Template/TestCaseClass.tpl | 112 - .../src/Util/PHP/Template/TestCaseMethod.tpl | 115 - .../src/Util/PHP/WindowsPhpProcess.php | 50 - vendor/phpunit/phpunit/src/Util/Printer.php | 97 - .../phpunit/src/Util/RegularExpression.php | 28 - vendor/phpunit/phpunit/src/Util/Test.php | 715 - .../src/Util/TestDox/CliTestDoxPrinter.php | 367 - .../src/Util/TestDox/HtmlResultPrinter.php | 137 - .../src/Util/TestDox/NamePrettifier.php | 291 - .../src/Util/TestDox/ResultPrinter.php | 339 - .../src/Util/TestDox/TestDoxPrinter.php | 378 - .../src/Util/TestDox/TextResultPrinter.php | 52 - .../src/Util/TestDox/XmlResultPrinter.php | 246 - .../phpunit/src/Util/TextTestListRenderer.php | 49 - vendor/phpunit/phpunit/src/Util/Type.php | 50 - .../src/Util/VersionComparisonOperator.php | 54 - .../src/Util/XdebugFilterScriptGenerator.php | 71 - vendor/phpunit/phpunit/src/Util/Xml.php | 288 - .../phpunit/src/Util/XmlTestListRenderer.php | 85 - vendor/psr/container/.gitignore | 3 - vendor/psr/container/LICENSE | 21 - vendor/psr/container/README.md | 5 - vendor/psr/container/composer.json | 27 - .../src/ContainerExceptionInterface.php | 13 - .../psr/container/src/ContainerInterface.php | 37 - .../src/NotFoundExceptionInterface.php | 13 - vendor/psr/log/LICENSE | 19 - vendor/psr/log/Psr/Log/AbstractLogger.php | 128 - .../log/Psr/Log/InvalidArgumentException.php | 7 - vendor/psr/log/Psr/Log/LogLevel.php | 18 - .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 - vendor/psr/log/Psr/Log/LoggerAwareTrait.php | 26 - vendor/psr/log/Psr/Log/LoggerInterface.php | 125 - vendor/psr/log/Psr/Log/LoggerTrait.php | 142 - vendor/psr/log/Psr/Log/NullLogger.php | 30 - vendor/psr/log/Psr/Log/Test/DummyTest.php | 18 - .../log/Psr/Log/Test/LoggerInterfaceTest.php | 138 - vendor/psr/log/Psr/Log/Test/TestLogger.php | 147 - vendor/psr/log/README.md | 58 - vendor/psr/log/composer.json | 26 - vendor/sabre/event/.php_cs.dist | 12 - vendor/sabre/event/LICENSE | 27 - vendor/sabre/event/bin/.empty | 0 vendor/sabre/event/composer.json | 50 - vendor/sabre/event/lib/Emitter.php | 19 - vendor/sabre/event/lib/EmitterInterface.php | 78 - vendor/sabre/event/lib/EmitterTrait.php | 178 - vendor/sabre/event/lib/EventEmitter.php | 20 - vendor/sabre/event/lib/Loop/Loop.php | 341 - vendor/sabre/event/lib/Loop/functions.php | 143 - vendor/sabre/event/lib/Promise.php | 258 - vendor/sabre/event/lib/Promise/functions.php | 128 - .../lib/PromiseAlreadyResolvedException.php | 17 - vendor/sabre/event/lib/Version.php | 20 - vendor/sabre/event/lib/WildcardEmitter.php | 36 - .../sabre/event/lib/WildcardEmitterTrait.php | 233 - vendor/sabre/event/lib/coroutine.php | 119 - vendor/sabre/event/phpstan.neon | 2 - .../code-unit-reverse-lookup/.gitattributes | 11 - .../code-unit-reverse-lookup/.gitignore | 6 - .../code-unit-reverse-lookup/ChangeLog.md | 31 - .../code-unit-reverse-lookup/LICENSE | 33 - .../code-unit-reverse-lookup/README.md | 20 - .../code-unit-reverse-lookup/composer.json | 36 - .../code-unit-reverse-lookup/src/Wizard.php | 125 - vendor/sebastian/code-unit/.gitattributes | 11 - vendor/sebastian/code-unit/.gitignore | 6 - vendor/sebastian/code-unit/ChangeLog.md | 44 - vendor/sebastian/code-unit/LICENSE | 33 - vendor/sebastian/code-unit/README.md | 17 - vendor/sebastian/code-unit/composer.json | 50 - vendor/sebastian/code-unit/infection.json | 22 - .../code-unit/src/ClassMethodUnit.php | 24 - vendor/sebastian/code-unit/src/ClassUnit.php | 24 - vendor/sebastian/code-unit/src/CodeUnit.php | 445 - .../code-unit/src/CodeUnitCollection.php | 84 - .../src/CodeUnitCollectionIterator.php | 55 - .../sebastian/code-unit/src/FunctionUnit.php | 24 - .../code-unit/src/InterfaceMethodUnit.php | 24 - .../sebastian/code-unit/src/InterfaceUnit.php | 24 - vendor/sebastian/code-unit/src/Mapper.php | 285 - .../code-unit/src/TraitMethodUnit.php | 24 - vendor/sebastian/code-unit/src/TraitUnit.php | 24 - .../code-unit/src/exceptions/Exception.php | 14 - .../exceptions/InvalidCodeUnitException.php | 16 - .../src/exceptions/NoTraitException.php | 16 - .../src/exceptions/ReflectionException.php | 16 - vendor/sebastian/comparator/.gitattributes | 11 - vendor/sebastian/comparator/.gitignore | 7 - vendor/sebastian/comparator/ChangeLog.md | 87 - vendor/sebastian/comparator/LICENSE | 33 - vendor/sebastian/comparator/README.md | 41 - vendor/sebastian/comparator/composer.json | 57 - .../comparator/src/ArrayComparator.php | 141 - .../sebastian/comparator/src/Comparator.php | 61 - .../comparator/src/ComparisonFailure.php | 129 - .../comparator/src/DOMNodeComparator.php | 88 - .../comparator/src/DateTimeComparator.php | 95 - .../comparator/src/DoubleComparator.php | 59 - .../comparator/src/ExceptionComparator.php | 54 - vendor/sebastian/comparator/src/Factory.php | 142 - .../comparator/src/MockObjectComparator.php | 48 - .../comparator/src/NumericComparator.php | 86 - .../comparator/src/ObjectComparator.php | 112 - .../comparator/src/ResourceComparator.php | 54 - .../comparator/src/ScalarComparator.php | 98 - .../src/SplObjectStorageComparator.php | 71 - .../comparator/src/TypeComparator.php | 62 - .../comparator/src/exceptions/Exception.php | 14 - .../src/exceptions/RuntimeException.php | 14 - vendor/sebastian/diff/.gitattributes | 11 - vendor/sebastian/diff/.gitignore | 7 - vendor/sebastian/diff/ChangeLog.md | 74 - vendor/sebastian/diff/LICENSE | 33 - vendor/sebastian/diff/README.md | 202 - vendor/sebastian/diff/composer.json | 47 - vendor/sebastian/diff/src/Chunk.php | 89 - vendor/sebastian/diff/src/Diff.php | 64 - vendor/sebastian/diff/src/Differ.php | 327 - .../src/Exception/ConfigurationException.php | 38 - .../diff/src/Exception/Exception.php | 14 - .../Exception/InvalidArgumentException.php | 14 - vendor/sebastian/diff/src/Line.php | 45 - .../LongestCommonSubsequenceCalculator.php | 18 - ...ientLongestCommonSubsequenceCalculator.php | 88 - .../src/Output/AbstractChunkOutputBuilder.php | 52 - .../diff/src/Output/DiffOnlyOutputBuilder.php | 72 - .../src/Output/DiffOutputBuilderInterface.php | 19 - .../Output/StrictUnifiedDiffOutputBuilder.php | 338 - .../src/Output/UnifiedDiffOutputBuilder.php | 272 - vendor/sebastian/diff/src/Parser.php | 110 - ...ientLongestCommonSubsequenceCalculator.php | 70 - vendor/sebastian/environment/.gitattributes | 12 - vendor/sebastian/environment/.gitignore | 7 - vendor/sebastian/environment/ChangeLog.md | 162 - vendor/sebastian/environment/LICENSE | 33 - vendor/sebastian/environment/README.md | 22 - vendor/sebastian/environment/composer.json | 40 - vendor/sebastian/environment/src/Console.php | 189 - .../environment/src/OperatingSystem.php | 53 - vendor/sebastian/environment/src/Runtime.php | 317 - vendor/sebastian/exporter/.gitattributes | 11 - vendor/sebastian/exporter/.gitignore | 7 - vendor/sebastian/exporter/ChangeLog.md | 36 - vendor/sebastian/exporter/LICENSE | 33 - vendor/sebastian/exporter/README.md | 174 - vendor/sebastian/exporter/composer.json | 56 - vendor/sebastian/exporter/src/Exporter.php | 325 - vendor/sebastian/global-state/.gitattributes | 4 - .../global-state/.github/FUNDING.yml | 1 - vendor/sebastian/global-state/.gitignore | 6 - vendor/sebastian/global-state/.php_cs.dist | 197 - vendor/sebastian/global-state/.travis.yml | 19 - vendor/sebastian/global-state/ChangeLog.md | 23 - vendor/sebastian/global-state/LICENSE | 33 - vendor/sebastian/global-state/README.md | 16 - vendor/sebastian/global-state/build.xml | 31 - vendor/sebastian/global-state/composer.json | 51 - vendor/sebastian/global-state/phive.xml | 5 - vendor/sebastian/global-state/phpunit.xml | 27 - vendor/sebastian/global-state/psalm.xml | 55 - .../sebastian/global-state/src/Blacklist.php | 118 - .../global-state/src/CodeExporter.php | 91 - .../sebastian/global-state/src/Restorer.php | 132 - .../sebastian/global-state/src/Snapshot.php | 415 - .../global-state/src/exceptions/Exception.php | 14 - .../src/exceptions/RuntimeException.php | 14 - .../global-state/tests/BlacklistTest.php | 117 - .../global-state/tests/CodeExporterTest.php | 74 - .../global-state/tests/RestorerTest.php | 68 - .../global-state/tests/SnapshotTest.php | 167 - .../tests/_fixture/BlacklistedChildClass.php | 14 - .../tests/_fixture/BlacklistedClass.php | 15 - .../tests/_fixture/BlacklistedImplementor.php | 15 - .../tests/_fixture/BlacklistedInterface.php | 14 - .../tests/_fixture/SnapshotClass.php | 35 - .../tests/_fixture/SnapshotDomDocument.php | 16 - .../tests/_fixture/SnapshotFunctions.php | 14 - .../tests/_fixture/SnapshotTrait.php | 14 - .../object-enumerator/.gitattributes | 10 - vendor/sebastian/object-enumerator/.gitignore | 6 - .../sebastian/object-enumerator/ChangeLog.md | 74 - vendor/sebastian/object-enumerator/LICENSE | 33 - vendor/sebastian/object-enumerator/README.md | 20 - .../sebastian/object-enumerator/composer.json | 40 - .../sebastian/object-enumerator/phpunit.xml | 20 - .../object-enumerator/src/Enumerator.php | 88 - .../object-enumerator/src/Exception.php | 14 - .../src/InvalidArgumentException.php | 14 - .../sebastian/object-reflector/.gitattributes | 11 - vendor/sebastian/object-reflector/.gitignore | 6 - .../sebastian/object-reflector/ChangeLog.md | 41 - vendor/sebastian/object-reflector/LICENSE | 33 - vendor/sebastian/object-reflector/README.md | 20 - .../sebastian/object-reflector/composer.json | 41 - .../object-reflector/src/Exception.php | 14 - .../src/InvalidArgumentException.php | 14 - .../object-reflector/src/ObjectReflector.php | 51 - .../recursion-context/.gitattributes | 11 - vendor/sebastian/recursion-context/.gitignore | 5 - .../sebastian/recursion-context/ChangeLog.md | 18 - vendor/sebastian/recursion-context/LICENSE | 33 - vendor/sebastian/recursion-context/README.md | 18 - .../sebastian/recursion-context/composer.json | 44 - .../recursion-context/src/Context.php | 178 - .../recursion-context/src/Exception.php | 14 - .../src/InvalidArgumentException.php | 14 - .../resource-operations/.gitattributes | 7 - .../sebastian/resource-operations/.gitignore | 6 - .../resource-operations/ChangeLog.md | 47 - vendor/sebastian/resource-operations/LICENSE | 33 - .../sebastian/resource-operations/README.md | 14 - .../resource-operations/build/generate.php | 65 - .../resource-operations/composer.json | 37 - .../src/ResourceOperations.php | 2232 --- vendor/sebastian/type/.gitattributes | 11 - vendor/sebastian/type/.gitignore | 6 - vendor/sebastian/type/ChangeLog.md | 83 - vendor/sebastian/type/LICENSE | 33 - vendor/sebastian/type/README.md | 20 - vendor/sebastian/type/composer.json | 49 - vendor/sebastian/type/src/CallableType.php | 197 - .../sebastian/type/src/GenericObjectType.php | 46 - vendor/sebastian/type/src/IterableType.php | 76 - vendor/sebastian/type/src/MixedType.php | 33 - vendor/sebastian/type/src/NullType.php | 43 - vendor/sebastian/type/src/ObjectType.php | 66 - .../sebastian/type/src/ReflectionMapper.php | 85 - vendor/sebastian/type/src/SimpleType.php | 88 - vendor/sebastian/type/src/Type.php | 94 - vendor/sebastian/type/src/TypeName.php | 113 - vendor/sebastian/type/src/UnionType.php | 115 - vendor/sebastian/type/src/UnknownType.php | 43 - vendor/sebastian/type/src/VoidType.php | 28 - .../type/src/exception/Exception.php | 14 - .../type/src/exception/RuntimeException.php | 14 - vendor/sebastian/version/.gitattributes | 4 - vendor/sebastian/version/.gitignore | 2 - vendor/sebastian/version/LICENSE | 33 - vendor/sebastian/version/README.md | 43 - vendor/sebastian/version/composer.json | 37 - vendor/sebastian/version/src/Version.php | 97 - vendor/squizlabs/php_codesniffer/.cspell.json | 72 - .../squizlabs/php_codesniffer/.gitattributes | 5 - vendor/squizlabs/php_codesniffer/.gitignore | 6 - .../squizlabs/php_codesniffer/CONTRIBUTING.md | 13 - .../php_codesniffer/CodeSniffer.conf.dist | 9 - vendor/squizlabs/php_codesniffer/README.md | 130 - vendor/squizlabs/php_codesniffer/autoload.php | 300 - vendor/squizlabs/php_codesniffer/bin/phpcbf | 19 - .../squizlabs/php_codesniffer/bin/phpcbf.bat | 12 - vendor/squizlabs/php_codesniffer/bin/phpcs | 19 - .../squizlabs/php_codesniffer/bin/phpcs.bat | 12 - .../squizlabs/php_codesniffer/composer.json | 40 - vendor/squizlabs/php_codesniffer/licence.txt | 24 - .../squizlabs/php_codesniffer/phpcs.xml.dist | 149 - vendor/squizlabs/php_codesniffer/phpcs.xsd | 136 - vendor/squizlabs/php_codesniffer/phpstan.neon | 16 - .../ValidatePEAR/ValidatePEARPackageXML.php | 362 - .../php_codesniffer/scripts/build-phar.php | 96 - .../scripts/validate-pear-package.php | 19 - .../squizlabs/php_codesniffer/src/Config.php | 1703 -- .../src/Exceptions/DeepExitException.php | 18 - .../src/Exceptions/RuntimeException.php | 15 - .../src/Exceptions/TokenizerException.php | 15 - .../php_codesniffer/src/Files/DummyFile.php | 82 - .../php_codesniffer/src/Files/File.php | 2636 --- .../php_codesniffer/src/Files/FileList.php | 248 - .../php_codesniffer/src/Files/LocalFile.php | 218 - .../src/Filters/ExactMatch.php | 108 - .../php_codesniffer/src/Filters/Filter.php | 282 - .../src/Filters/GitModified.php | 66 - .../php_codesniffer/src/Filters/GitStaged.php | 68 - .../squizlabs/php_codesniffer/src/Fixer.php | 798 - .../src/Generators/Generator.php | 117 - .../php_codesniffer/src/Generators/HTML.php | 270 - .../src/Generators/Markdown.php | 161 - .../php_codesniffer/src/Generators/Text.php | 253 - .../php_codesniffer/src/Reporter.php | 423 - .../php_codesniffer/src/Reports/Cbf.php | 250 - .../src/Reports/Checkstyle.php | 109 - .../php_codesniffer/src/Reports/Code.php | 362 - .../php_codesniffer/src/Reports/Csv.php | 91 - .../php_codesniffer/src/Reports/Diff.php | 130 - .../php_codesniffer/src/Reports/Emacs.php | 90 - .../php_codesniffer/src/Reports/Full.php | 231 - .../php_codesniffer/src/Reports/Gitblame.php | 91 - .../php_codesniffer/src/Reports/Hgblame.php | 110 - .../php_codesniffer/src/Reports/Info.php | 172 - .../php_codesniffer/src/Reports/Json.php | 106 - .../php_codesniffer/src/Reports/Junit.php | 131 - .../src/Reports/Notifysend.php | 241 - .../php_codesniffer/src/Reports/Report.php | 64 - .../php_codesniffer/src/Reports/Source.php | 336 - .../php_codesniffer/src/Reports/Summary.php | 183 - .../php_codesniffer/src/Reports/Svnblame.php | 73 - .../src/Reports/VersionControl.php | 376 - .../php_codesniffer/src/Reports/Xml.php | 126 - .../squizlabs/php_codesniffer/src/Ruleset.php | 1383 -- .../squizlabs/php_codesniffer/src/Runner.php | 886 - .../src/Sniffs/AbstractArraySniff.php | 172 - .../src/Sniffs/AbstractPatternSniff.php | 936 - .../src/Sniffs/AbstractScopeSniff.php | 191 - .../src/Sniffs/AbstractVariableSniff.php | 230 - .../php_codesniffer/src/Sniffs/Sniff.php | 80 - .../DisallowLongArraySyntaxStandard.xml | 23 - .../DisallowShortArraySyntaxStandard.xml | 23 - .../Classes/DuplicateClassNameStandard.xml | 27 - .../Classes/OpeningBraceSameLineStandard.xml | 28 - .../AssignmentInConditionStandard.xml | 23 - .../CodeAnalysis/EmptyStatementStandard.xml | 23 - .../ForLoopShouldBeWhileLoopStandard.xml | 23 - .../ForLoopWithTestFunctionCallStandard.xml | 24 - .../JumbledIncrementerStandard.xml | 25 - .../UnconditionalIfStatementStandard.xml | 39 - .../UnnecessaryFinalModifierStandard.xml | 29 - .../UnusedFunctionParameterStandard.xml | 25 - .../UselessOverridingMethodStandard.xml | 32 - .../Generic/Docs/Commenting/FixmeStandard.xml | 25 - .../Generic/Docs/Commenting/TodoStandard.xml | 25 - .../DisallowYodaConditionsStandard.xml | 23 - .../InlineControlStructureStandard.xml | 22 - .../Generic/Docs/Debug/CSSLintStandard.xml | 19 - .../Docs/Debug/ClosureLinterStandard.xml | 19 - .../Generic/Docs/Debug/JSHintStandard.xml | 19 - .../Docs/Files/ByteOrderMarkStandard.xml | 7 - .../Docs/Files/EndFileNewlineStandard.xml | 7 - .../Docs/Files/EndFileNoNewlineStandard.xml | 7 - .../Docs/Files/ExecutableFileStandard.xml | 7 - .../Generic/Docs/Files/InlineHTMLStandard.xml | 24 - .../Docs/Files/LineEndingsStandard.xml | 7 - .../Generic/Docs/Files/LineLengthStandard.xml | 7 - .../Docs/Files/LowercasedFilenameStandard.xml | 7 - .../Docs/Files/OneClassPerFileStandard.xml | 29 - .../Files/OneInterfacePerFileStandard.xml | 29 - .../OneObjectStructurePerFileStandard.xml | 29 - .../Docs/Files/OneTraitPerFileStandard.xml | 29 - .../DisallowMultipleStatementsStandard.xml | 20 - .../MultipleStatementAlignmentStandard.xml | 56 - .../Formatting/NoSpaceAfterCastStandard.xml | 19 - .../Formatting/SpaceAfterCastStandard.xml | 19 - .../Docs/Formatting/SpaceAfterNotStandard.xml | 25 - .../CallTimePassByReferenceStandard.xml | 31 - .../FunctionCallArgumentSpacingStandard.xml | 39 - .../OpeningFunctionBraceBsdAllmanStandard.xml | 24 - ...gFunctionBraceKernighanRitchieStandard.xml | 24 - .../Metrics/CyclomaticComplexityStandard.xml | 7 - .../Docs/Metrics/NestingLevelStandard.xml | 7 - .../CamelCapsFunctionNameStandard.xml | 23 - .../ConstructorNameStandard.xml | 29 - .../UpperCaseConstantNameStandard.xml | 29 - .../Docs/PHP/BacktickOperatorStandard.xml | 7 - .../CharacterBeforePHPOpeningTagStandard.xml | 22 - .../Docs/PHP/ClosingPHPTagStandard.xml | 22 - .../Docs/PHP/DeprecatedFunctionsStandard.xml | 19 - .../DisallowAlternativePHPTagsStandard.xml | 7 - .../DisallowRequestSuperglobalStandard.xml | 7 - .../Docs/PHP/DisallowShortOpenTagStandard.xml | 7 - .../Docs/PHP/DiscourageGotoStandard.xml | 7 - .../Docs/PHP/ForbiddenFunctionsStandard.xml | 19 - .../Docs/PHP/LowerCaseConstantStandard.xml | 23 - .../Docs/PHP/LowerCaseKeywordStandard.xml | 19 - .../Docs/PHP/LowerCaseTypeStandard.xml | 38 - .../Docs/PHP/NoSilencedErrorsStandard.xml | 23 - .../Generic/Docs/PHP/SAPIUsageStandard.xml | 23 - .../Docs/PHP/UpperCaseConstantStandard.xml | 23 - .../UnnecessaryStringConcatStandard.xml | 19 - .../SubversionPropertiesStandard.xml | 7 - .../ArbitraryParenthesesSpacingStandard.xml | 26 - .../DisallowSpaceIndentStandard.xml | 7 - .../WhiteSpace/DisallowTabIndentStandard.xml | 7 - .../Docs/WhiteSpace/ScopeIndentStandard.xml | 23 - .../SpreadOperatorSpacingAfterStandard.xml | 34 - .../Sniffs/Arrays/ArrayIndentSniff.php | 143 - .../Arrays/DisallowLongArraySyntaxSniff.php | 78 - .../Arrays/DisallowShortArraySyntaxSniff.php | 61 - .../Classes/DuplicateClassNameSniff.php | 117 - .../Classes/OpeningBraceSameLineSniff.php | 123 - .../AssignmentInConditionSniff.php | 170 - .../CodeAnalysis/EmptyPHPStatementSniff.php | 162 - .../CodeAnalysis/EmptyStatementSniff.php | 96 - .../ForLoopShouldBeWhileLoopSniff.php | 91 - .../ForLoopWithTestFunctionCallSniff.php | 101 - .../CodeAnalysis/JumbledIncrementerSniff.php | 134 - .../UnconditionalIfStatementSniff.php | 93 - .../UnnecessaryFinalModifierSniff.php | 85 - .../UnusedFunctionParameterSniff.php | 236 - .../UselessOverridingMethodSniff.php | 161 - .../Sniffs/Commenting/DocCommentSniff.php | 353 - .../Generic/Sniffs/Commenting/FixmeSniff.php | 78 - .../Generic/Sniffs/Commenting/TodoSniff.php | 77 - .../DisallowYodaConditionsSniff.php | 188 - .../InlineControlStructureSniff.php | 371 - .../Generic/Sniffs/Debug/CSSLintSniff.php | 95 - .../Sniffs/Debug/ClosureLinterSniff.php | 116 - .../Generic/Sniffs/Debug/ESLintSniff.php | 112 - .../Generic/Sniffs/Debug/JSHintSniff.php | 94 - .../Sniffs/Files/ByteOrderMarkSniff.php | 80 - .../Sniffs/Files/EndFileNewlineSniff.php | 81 - .../Sniffs/Files/EndFileNoNewlineSniff.php | 88 - .../Sniffs/Files/ExecutableFileSniff.php | 59 - .../Generic/Sniffs/Files/InlineHTMLSniff.php | 79 - .../Generic/Sniffs/Files/LineEndingsSniff.php | 145 - .../Generic/Sniffs/Files/LineLengthSniff.php | 201 - .../Sniffs/Files/LowercasedFilenameSniff.php | 67 - .../Sniffs/Files/OneClassPerFileSniff.php | 51 - .../Sniffs/Files/OneInterfacePerFileSniff.php | 51 - .../Files/OneObjectStructurePerFileSniff.php | 55 - .../Sniffs/Files/OneTraitPerFileSniff.php | 51 - .../DisallowMultipleStatementsSniff.php | 103 - .../MultipleStatementAlignmentSniff.php | 403 - .../Formatting/NoSpaceAfterCastSniff.php | 61 - .../Sniffs/Formatting/SpaceAfterCastSniff.php | 153 - .../Sniffs/Formatting/SpaceAfterNotSniff.php | 135 - .../Formatting/SpaceBeforeCastSniff.php | 73 - .../CallTimePassByReferenceSniff.php | 141 - .../FunctionCallArgumentSpacingSniff.php | 185 - .../OpeningFunctionBraceBsdAllmanSniff.php | 213 - ...ningFunctionBraceKernighanRitchieSniff.php | 184 - .../Metrics/CyclomaticComplexitySniff.php | 113 - .../Sniffs/Metrics/NestingLevelSniff.php | 100 - .../CamelCapsFunctionNameSniff.php | 221 - .../ConstructorNameSniff.php | 158 - .../UpperCaseConstantNameSniff.php | 140 - .../Sniffs/PHP/BacktickOperatorSniff.php | 48 - .../PHP/CharacterBeforePHPOpeningTagSniff.php | 86 - .../Generic/Sniffs/PHP/ClosingPHPTagSniff.php | 51 - .../Sniffs/PHP/DeprecatedFunctionsSniff.php | 73 - .../PHP/DisallowAlternativePHPTagsSniff.php | 253 - .../PHP/DisallowRequestSuperglobalSniff.php | 54 - .../Sniffs/PHP/DisallowShortOpenTagSniff.php | 168 - .../Sniffs/PHP/DiscourageGotoSniff.php | 50 - .../Sniffs/PHP/ForbiddenFunctionsSniff.php | 239 - .../Sniffs/PHP/LowerCaseConstantSniff.php | 83 - .../Sniffs/PHP/LowerCaseKeywordSniff.php | 142 - .../Generic/Sniffs/PHP/LowerCaseTypeSniff.php | 162 - .../Sniffs/PHP/NoSilencedErrorsSniff.php | 77 - .../Sniffs/PHP/RequireStrictTypesSniff.php | 69 - .../Generic/Sniffs/PHP/SAPIUsageSniff.php | 66 - .../Generic/Sniffs/PHP/SyntaxSniff.php | 71 - .../Sniffs/PHP/UpperCaseConstantSniff.php | 73 - .../Strings/UnnecessaryStringConcatSniff.php | 125 - .../VersionControl/GitMergeConflictSniff.php | 225 - .../SubversionPropertiesSniff.php | 186 - .../ArbitraryParenthesesSpacingSniff.php | 239 - .../WhiteSpace/DisallowSpaceIndentSniff.php | 217 - .../WhiteSpace/DisallowTabIndentSniff.php | 187 - .../IncrementDecrementSpacingSniff.php | 170 - .../LanguageConstructSpacingSniff.php | 146 - .../Sniffs/WhiteSpace/ScopeIndentSniff.php | 1527 -- .../SpreadOperatorSpacingAfterSniff.php | 146 - .../Tests/Arrays/ArrayIndentUnitTest.inc | 72 - .../Arrays/ArrayIndentUnitTest.inc.fixed | 73 - .../Tests/Arrays/ArrayIndentUnitTest.php | 62 - .../DisallowLongArraySyntaxUnitTest.1.inc | 28 - ...isallowLongArraySyntaxUnitTest.1.inc.fixed | 28 - .../DisallowLongArraySyntaxUnitTest.2.inc | 17 - ...isallowLongArraySyntaxUnitTest.2.inc.fixed | 17 - .../DisallowLongArraySyntaxUnitTest.php | 67 - .../DisallowShortArraySyntaxUnitTest.inc | 12 - ...DisallowShortArraySyntaxUnitTest.inc.fixed | 12 - .../DisallowShortArraySyntaxUnitTest.php | 53 - .../Classes/DuplicateClassNameUnitTest.1.inc | 11 - .../Classes/DuplicateClassNameUnitTest.2.inc | 5 - .../Classes/DuplicateClassNameUnitTest.3.inc | 10 - .../Classes/DuplicateClassNameUnitTest.4.inc | 5 - .../Classes/DuplicateClassNameUnitTest.5.inc | 8 - .../Classes/DuplicateClassNameUnitTest.6.inc | 12 - .../Classes/DuplicateClassNameUnitTest.php | 77 - .../Classes/OpeningBraceSameLineUnitTest.inc | 91 - .../OpeningBraceSameLineUnitTest.inc.fixed | 91 - .../Classes/OpeningBraceSameLineUnitTest.php | 61 - .../AssignmentInConditionUnitTest.inc | 93 - .../AssignmentInConditionUnitTest.php | 82 - .../EmptyPHPStatementUnitTest.inc | 81 - .../EmptyPHPStatementUnitTest.inc.fixed | 75 - .../EmptyPHPStatementUnitTest.php | 68 - .../CodeAnalysis/EmptyStatementUnitTest.inc | 72 - .../CodeAnalysis/EmptyStatementUnitTest.php | 62 - .../ForLoopShouldBeWhileLoopUnitTest.inc | 13 - .../ForLoopShouldBeWhileLoopUnitTest.php | 51 - .../ForLoopWithTestFunctionCallUnitTest.inc | 15 - .../ForLoopWithTestFunctionCallUnitTest.php | 51 - .../JumbledIncrementerUnitTest.inc | 25 - .../JumbledIncrementerUnitTest.php | 52 - .../UnconditionalIfStatementUnitTest.inc | 13 - .../UnconditionalIfStatementUnitTest.php | 52 - .../UnnecessaryFinalModifierUnitTest.inc | 29 - .../UnnecessaryFinalModifierUnitTest.php | 53 - .../UnusedFunctionParameterUnitTest.inc | 125 - .../UnusedFunctionParameterUnitTest.php | 58 - .../UselessOverridingMethodUnitTest.inc | 25 - .../UselessOverridingMethodUnitTest.php | 51 - .../Tests/Commenting/DocCommentUnitTest.inc | 252 - .../Commenting/DocCommentUnitTest.inc.fixed | 257 - .../Tests/Commenting/DocCommentUnitTest.js | 250 - .../Commenting/DocCommentUnitTest.js.fixed | 255 - .../Tests/Commenting/DocCommentUnitTest.php | 111 - .../Tests/Commenting/FixmeUnitTest.inc | 23 - .../Generic/Tests/Commenting/FixmeUnitTest.js | 23 - .../Tests/Commenting/FixmeUnitTest.php | 62 - .../Generic/Tests/Commenting/TodoUnitTest.inc | 23 - .../Generic/Tests/Commenting/TodoUnitTest.js | 23 - .../Generic/Tests/Commenting/TodoUnitTest.php | 61 - .../DisallowYodaConditionsUnitTest.inc | 166 - .../DisallowYodaConditionsUnitTest.php | 82 - .../InlineControlStructureUnitTest.1.inc | 255 - ...InlineControlStructureUnitTest.1.inc.fixed | 288 - .../InlineControlStructureUnitTest.2.inc | 8 - .../InlineControlStructureUnitTest.3.inc | 4 - .../InlineControlStructureUnitTest.4.inc | 5 - .../InlineControlStructureUnitTest.5.inc | 4 - .../InlineControlStructureUnitTest.6.inc | 6 - .../InlineControlStructureUnitTest.7.inc | 16 - .../InlineControlStructureUnitTest.js | 31 - .../InlineControlStructureUnitTest.js.fixed | 39 - .../InlineControlStructureUnitTest.php | 110 - .../Generic/Tests/Debug/CSSLintUnitTest.css | 6 - .../Generic/Tests/Debug/CSSLintUnitTest.php | 70 - .../Tests/Debug/ClosureLinterUnitTest.js | 6 - .../Tests/Debug/ClosureLinterUnitTest.php | 69 - .../Generic/Tests/Debug/ESLintUnitTest.js | 1 - .../Generic/Tests/Debug/ESLintUnitTest.php | 113 - .../Generic/Tests/Debug/JSHintUnitTest.js | 3 - .../Generic/Tests/Debug/JSHintUnitTest.php | 67 - .../Tests/Files/ByteOrderMarkUnitTest.inc | 3 - .../Tests/Files/ByteOrderMarkUnitTest.php | 48 - .../Tests/Files/EndFileNewlineUnitTest.1.css | 3 - .../Tests/Files/EndFileNewlineUnitTest.1.inc | 3 - .../Tests/Files/EndFileNewlineUnitTest.1.js | 3 - .../Tests/Files/EndFileNewlineUnitTest.2.css | 2 - .../Tests/Files/EndFileNewlineUnitTest.2.inc | 2 - .../Tests/Files/EndFileNewlineUnitTest.2.js | 2 - .../Tests/Files/EndFileNewlineUnitTest.3.css | 2 - .../Files/EndFileNewlineUnitTest.3.css.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.3.inc | 2 - .../Files/EndFileNewlineUnitTest.3.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.3.js | 2 - .../Files/EndFileNewlineUnitTest.3.js.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.4.inc | 2 - .../Files/EndFileNewlineUnitTest.4.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.5.inc | 2 - .../Tests/Files/EndFileNewlineUnitTest.php | 60 - .../Files/EndFileNoNewlineUnitTest.1.css | 3 - .../EndFileNoNewlineUnitTest.1.css.fixed | 2 - .../Files/EndFileNoNewlineUnitTest.1.inc | 3 - .../EndFileNoNewlineUnitTest.1.inc.fixed | 2 - .../Tests/Files/EndFileNoNewlineUnitTest.1.js | 3 - .../Files/EndFileNoNewlineUnitTest.1.js.fixed | 2 - .../Files/EndFileNoNewlineUnitTest.2.css | 2 - .../EndFileNoNewlineUnitTest.2.css.fixed | 2 - .../Files/EndFileNoNewlineUnitTest.2.inc | 3 - .../EndFileNoNewlineUnitTest.2.inc.fixed | 3 - .../Tests/Files/EndFileNoNewlineUnitTest.2.js | 2 - .../Files/EndFileNoNewlineUnitTest.2.js.fixed | 2 - .../Files/EndFileNoNewlineUnitTest.3.css | 2 - .../Files/EndFileNoNewlineUnitTest.3.inc | 2 - .../Tests/Files/EndFileNoNewlineUnitTest.3.js | 2 - .../Files/EndFileNoNewlineUnitTest.4.inc | 3 - .../Files/EndFileNoNewlineUnitTest.5.inc | 2 - .../Files/EndFileNoNewlineUnitTest.6.inc | 2 - .../EndFileNoNewlineUnitTest.6.inc.fixed | 2 - .../Files/EndFileNoNewlineUnitTest.7.inc | 6 - .../Tests/Files/EndFileNoNewlineUnitTest.php | 64 - .../Tests/Files/ExecutableFileUnitTest.1.inc | 1 - .../Tests/Files/ExecutableFileUnitTest.2.inc | 1 - .../Tests/Files/ExecutableFileUnitTest.php | 72 - .../Tests/Files/InlineHTMLUnitTest.1.inc | 3 - .../Tests/Files/InlineHTMLUnitTest.2.inc | 3 - .../Tests/Files/InlineHTMLUnitTest.3.inc | 6 - .../Tests/Files/InlineHTMLUnitTest.4.inc | 3 - .../Tests/Files/InlineHTMLUnitTest.5.inc | 3 - .../Tests/Files/InlineHTMLUnitTest.6.inc | 2 - .../Tests/Files/InlineHTMLUnitTest.7.inc | 2 - .../Tests/Files/InlineHTMLUnitTest.php | 65 - .../Tests/Files/LineEndingsUnitTest.css | 3 - .../Tests/Files/LineEndingsUnitTest.css.fixed | 3 - .../Tests/Files/LineEndingsUnitTest.inc | 18 - .../Tests/Files/LineEndingsUnitTest.inc.fixed | 18 - .../Tests/Files/LineEndingsUnitTest.js | 2 - .../Tests/Files/LineEndingsUnitTest.js.fixed | 2 - .../Tests/Files/LineEndingsUnitTest.php | 63 - .../Tests/Files/LineLengthUnitTest.1.inc | 84 - .../Tests/Files/LineLengthUnitTest.2.inc | 7 - .../Tests/Files/LineLengthUnitTest.3.inc | 16 - .../Tests/Files/LineLengthUnitTest.4.inc | 16 - .../Tests/Files/LineLengthUnitTest.php | 111 - .../Files/LowercasedFilenameUnitTest.inc | 7 - .../Files/LowercasedFilenameUnitTest.php | 48 - .../Tests/Files/OneClassPerFileUnitTest.inc | 13 - .../Tests/Files/OneClassPerFileUnitTest.php | 51 - .../Files/OneInterfacePerFileUnitTest.inc | 13 - .../Files/OneInterfacePerFileUnitTest.php | 51 - .../OneObjectStructurePerFileUnitTest.inc | 21 - .../OneObjectStructurePerFileUnitTest.php | 53 - .../Tests/Files/OneTraitPerFileUnitTest.inc | 17 - .../Tests/Files/OneTraitPerFileUnitTest.php | 51 - .../DisallowMultipleStatementsUnitTest.inc | 16 - ...sallowMultipleStatementsUnitTest.inc.fixed | 21 - .../DisallowMultipleStatementsUnitTest.php | 54 - .../MultipleStatementAlignmentUnitTest.inc | 408 - ...ltipleStatementAlignmentUnitTest.inc.fixed | 408 - .../MultipleStatementAlignmentUnitTest.js | 118 - ...ultipleStatementAlignmentUnitTest.js.fixed | 118 - .../MultipleStatementAlignmentUnitTest.php | 156 - .../Formatting/NoSpaceAfterCastUnitTest.inc | 51 - .../NoSpaceAfterCastUnitTest.inc.fixed | 51 - .../Formatting/NoSpaceAfterCastUnitTest.php | 72 - .../Formatting/SpaceAfterCastUnitTest.inc | 95 - .../SpaceAfterCastUnitTest.inc.fixed | 92 - .../Formatting/SpaceAfterCastUnitTest.php | 87 - .../Formatting/SpaceAfterNotUnitTest.inc | 86 - .../SpaceAfterNotUnitTest.inc.fixed | 83 - .../Tests/Formatting/SpaceAfterNotUnitTest.js | 5 - .../Formatting/SpaceAfterNotUnitTest.js.fixed | 5 - .../Formatting/SpaceAfterNotUnitTest.php | 91 - .../Formatting/SpaceBeforeCastUnitTest.inc | 65 - .../SpaceBeforeCastUnitTest.inc.fixed | 65 - .../Formatting/SpaceBeforeCastUnitTest.php | 78 - .../CallTimePassByReferenceUnitTest.inc | 39 - .../CallTimePassByReferenceUnitTest.php | 55 - .../FunctionCallArgumentSpacingUnitTest.inc | 151 - ...ctionCallArgumentSpacingUnitTest.inc.fixed | 151 - .../FunctionCallArgumentSpacingUnitTest.php | 75 - .../OpeningFunctionBraceBsdAllmanUnitTest.inc | 238 - ...ngFunctionBraceBsdAllmanUnitTest.inc.fixed | 258 - .../OpeningFunctionBraceBsdAllmanUnitTest.php | 81 - ...gFunctionBraceKernighanRitchieUnitTest.inc | 210 - ...ionBraceKernighanRitchieUnitTest.inc.fixed | 198 - ...gFunctionBraceKernighanRitchieUnitTest.php | 75 - .../Metrics/CyclomaticComplexityUnitTest.inc | 160 - .../Metrics/CyclomaticComplexityUnitTest.php | 51 - .../Tests/Metrics/NestingLevelUnitTest.inc | 102 - .../Tests/Metrics/NestingLevelUnitTest.php | 51 - .../CamelCapsFunctionNameUnitTest.inc | 167 - .../CamelCapsFunctionNameUnitTest.php | 88 - .../ConstructorNameUnitTest.inc | 97 - .../ConstructorNameUnitTest.php | 54 - .../UpperCaseConstantNameUnitTest.inc | 31 - .../UpperCaseConstantNameUnitTest.php | 56 - .../Tests/PHP/BacktickOperatorUnitTest.inc | 2 - .../Tests/PHP/BacktickOperatorUnitTest.php | 48 - ...CharacterBeforePHPOpeningTagUnitTest.1.inc | 9 - ...CharacterBeforePHPOpeningTagUnitTest.2.inc | 4 - ...CharacterBeforePHPOpeningTagUnitTest.3.inc | 3 - .../CharacterBeforePHPOpeningTagUnitTest.php | 57 - .../Tests/PHP/ClosingPHPTagUnitTest.inc | 10 - .../Tests/PHP/ClosingPHPTagUnitTest.php | 48 - .../Tests/PHP/DeprecatedFunctionsUnitTest.inc | 4 - .../Tests/PHP/DeprecatedFunctionsUnitTest.php | 58 - .../DisallowAlternativePHPTagsUnitTest.1.inc | 14 - ...llowAlternativePHPTagsUnitTest.1.inc.fixed | 14 - .../DisallowAlternativePHPTagsUnitTest.2.inc | 6 - ...llowAlternativePHPTagsUnitTest.2.inc.fixed | 6 - .../DisallowAlternativePHPTagsUnitTest.3.inc | 7 - .../DisallowAlternativePHPTagsUnitTest.php | 105 - .../DisallowRequestSuperglobalUnitTest.inc | 16 - .../DisallowRequestSuperglobalUnitTest.php | 51 - .../PHP/DisallowShortOpenTagUnitTest.1.inc | 11 - .../DisallowShortOpenTagUnitTest.1.inc.fixed | 11 - .../PHP/DisallowShortOpenTagUnitTest.2.inc | 8 - .../DisallowShortOpenTagUnitTest.2.inc.fixed | 8 - .../PHP/DisallowShortOpenTagUnitTest.3.inc | 16 - .../PHP/DisallowShortOpenTagUnitTest.php | 103 - .../Tests/PHP/DiscourageGotoUnitTest.inc | 18 - .../Tests/PHP/DiscourageGotoUnitTest.php | 53 - .../Tests/PHP/ForbiddenFunctionsUnitTest.inc | 57 - .../Tests/PHP/ForbiddenFunctionsUnitTest.php | 54 - .../Tests/PHP/LowerCaseConstantUnitTest.inc | 83 - .../PHP/LowerCaseConstantUnitTest.inc.fixed | 83 - .../Tests/PHP/LowerCaseConstantUnitTest.js | 14 - .../PHP/LowerCaseConstantUnitTest.js.fixed | 14 - .../Tests/PHP/LowerCaseConstantUnitTest.php | 84 - .../Tests/PHP/LowerCaseKeywordUnitTest.inc | 33 - .../PHP/LowerCaseKeywordUnitTest.inc.fixed | 33 - .../Tests/PHP/LowerCaseKeywordUnitTest.php | 61 - .../Tests/PHP/LowerCaseTypeUnitTest.inc | 47 - .../Tests/PHP/LowerCaseTypeUnitTest.inc.fixed | 47 - .../Tests/PHP/LowerCaseTypeUnitTest.php | 68 - .../Tests/PHP/NoSilencedErrorsUnitTest.inc | 9 - .../Tests/PHP/NoSilencedErrorsUnitTest.php | 48 - .../PHP/RequireStrictTypesUnitTest.1.inc | 8 - .../PHP/RequireStrictTypesUnitTest.2.inc | 2 - .../Tests/PHP/RequireStrictTypesUnitTest.php | 56 - .../Generic/Tests/PHP/SAPIUsageUnitTest.inc | 4 - .../Generic/Tests/PHP/SAPIUsageUnitTest.php | 48 - .../Generic/Tests/PHP/SyntaxUnitTest.inc | 4 - .../Generic/Tests/PHP/SyntaxUnitTest.php | 49 - .../Tests/PHP/UpperCaseConstantUnitTest.inc | 81 - .../PHP/UpperCaseConstantUnitTest.inc.fixed | 81 - .../Tests/PHP/UpperCaseConstantUnitTest.php | 63 - .../UnnecessaryStringConcatUnitTest.inc | 21 - .../UnnecessaryStringConcatUnitTest.js | 15 - .../UnnecessaryStringConcatUnitTest.php | 73 - .../GitMergeConflictUnitTest.1.css | 35 - .../GitMergeConflictUnitTest.1.inc | 61 - .../GitMergeConflictUnitTest.2.css | 32 - .../GitMergeConflictUnitTest.2.inc | 31 - .../GitMergeConflictUnitTest.3.inc | 43 - .../GitMergeConflictUnitTest.4.inc | 71 - .../GitMergeConflictUnitTest.5.inc | 34 - .../GitMergeConflictUnitTest.6.inc | 34 - .../GitMergeConflictUnitTest.js | 33 - .../GitMergeConflictUnitTest.php | 160 - .../SubversionPropertiesUnitTest.inc | 3 - .../SubversionPropertiesUnitTest.php | 61 - .../ArbitraryParenthesesSpacingUnitTest.inc | 165 - ...itraryParenthesesSpacingUnitTest.inc.fixed | 153 - .../ArbitraryParenthesesSpacingUnitTest.php | 85 - .../DisallowSpaceIndentUnitTest.1.inc | 118 - .../DisallowSpaceIndentUnitTest.1.inc.fixed | 118 - .../DisallowSpaceIndentUnitTest.2.inc | 118 - .../DisallowSpaceIndentUnitTest.2.inc.fixed | 118 - .../DisallowSpaceIndentUnitTest.css | 4 - .../DisallowSpaceIndentUnitTest.css.fixed | 4 - .../WhiteSpace/DisallowSpaceIndentUnitTest.js | 9 - .../DisallowSpaceIndentUnitTest.js.fixed | 9 - .../DisallowSpaceIndentUnitTest.php | 118 - .../WhiteSpace/DisallowTabIndentUnitTest.css | 5 - .../DisallowTabIndentUnitTest.css.fixed | 5 - .../WhiteSpace/DisallowTabIndentUnitTest.inc | 93 - .../DisallowTabIndentUnitTest.inc.fixed | 93 - .../WhiteSpace/DisallowTabIndentUnitTest.js | 9 - .../DisallowTabIndentUnitTest.js.fixed | 9 - .../WhiteSpace/DisallowTabIndentUnitTest.php | 123 - .../IncrementDecrementSpacingUnitTest.inc | 17 - ...ncrementDecrementSpacingUnitTest.inc.fixed | 16 - .../IncrementDecrementSpacingUnitTest.js | 17 - ...IncrementDecrementSpacingUnitTest.js.fixed | 16 - .../IncrementDecrementSpacingUnitTest.php | 66 - .../LanguageConstructSpacingUnitTest.inc | 79 - ...LanguageConstructSpacingUnitTest.inc.fixed | 73 - .../LanguageConstructSpacingUnitTest.php | 74 - .../WhiteSpace/ScopeIndentUnitTest.1.inc | 1476 -- .../ScopeIndentUnitTest.1.inc.fixed | 1476 -- .../Tests/WhiteSpace/ScopeIndentUnitTest.1.js | 239 - .../WhiteSpace/ScopeIndentUnitTest.1.js.fixed | 239 - .../WhiteSpace/ScopeIndentUnitTest.2.inc | 1476 -- .../ScopeIndentUnitTest.2.inc.fixed | 1476 -- .../WhiteSpace/ScopeIndentUnitTest.3.inc | 28 - .../ScopeIndentUnitTest.3.inc.fixed | 28 - .../WhiteSpace/ScopeIndentUnitTest.4.inc | 6 - .../Tests/WhiteSpace/ScopeIndentUnitTest.php | 205 - .../SpreadOperatorSpacingAfterUnitTest.inc | 73 - ...readOperatorSpacingAfterUnitTest.inc.fixed | 68 - .../SpreadOperatorSpacingAfterUnitTest.php | 58 - .../src/Standards/Generic/ruleset.xml | 4 - .../Sniffs/CSS/BrowserSpecificStylesSniff.php | 87 - .../Channels/DisallowSelfActionsSniff.php | 125 - .../Sniffs/Channels/IncludeOwnSystemSniff.php | 98 - .../Sniffs/Channels/IncludeSystemSniff.php | 314 - .../Sniffs/Channels/UnusedSystemSniff.php | 141 - .../Commenting/FunctionCommentSniff.php | 84 - .../MySource/Sniffs/Debug/DebugCodeSniff.php | 55 - .../Sniffs/Debug/FirebugConsoleSniff.php | 64 - .../Sniffs/Objects/AssignThisSniff.php | 81 - .../Objects/CreateWidgetTypeCallbackSniff.php | 218 - .../Sniffs/Objects/DisallowNewWidgetSniff.php | 59 - .../Sniffs/PHP/AjaxNullComparisonSniff.php | 103 - .../Sniffs/PHP/EvalObjectFactorySniff.php | 114 - .../Sniffs/PHP/GetRequestDataSniff.php | 106 - .../Sniffs/PHP/ReturnFunctionValueSniff.php | 63 - .../Sniffs/Strings/JoinStringsSniff.php | 76 - .../CSS/BrowserSpecificStylesUnitTest.css | 13 - .../CSS/BrowserSpecificStylesUnitTest.php | 48 - .../Channels/DisallowSelfActionsUnitTest.inc | 51 - .../Channels/DisallowSelfActionsUnitTest.php | 53 - .../Tests/Channels/IncludeSystemUnitTest.inc | 112 - .../Tests/Channels/IncludeSystemUnitTest.php | 60 - .../Tests/Channels/UnusedSystemUnitTest.inc | 67 - .../Tests/Channels/UnusedSystemUnitTest.php | 55 - .../Commenting/FunctionCommentUnitTest.inc | 101 - .../Commenting/FunctionCommentUnitTest.php | 54 - .../Tests/Debug/DebugCodeUnitTest.inc | 4 - .../Tests/Debug/DebugCodeUnitTest.php | 51 - .../Tests/Debug/FirebugConsoleUnitTest.js | 8 - .../Tests/Debug/FirebugConsoleUnitTest.php | 61 - .../Tests/Objects/AssignThisUnitTest.js | 20 - .../Tests/Objects/AssignThisUnitTest.php | 58 - .../CreateWidgetTypeCallbackUnitTest.js | 186 - .../CreateWidgetTypeCallbackUnitTest.php | 59 - .../Objects/DisallowNewWidgetUnitTest.inc | 6 - .../Objects/DisallowNewWidgetUnitTest.php | 48 - .../Tests/PHP/AjaxNullComparisonUnitTest.inc | 182 - .../Tests/PHP/AjaxNullComparisonUnitTest.php | 55 - .../Tests/PHP/EvalObjectFactoryUnitTest.inc | 26 - .../Tests/PHP/EvalObjectFactoryUnitTest.php | 52 - .../Tests/PHP/GetRequestDataUnitTest.inc | 30 - .../Tests/PHP/GetRequestDataUnitTest.php | 56 - .../Tests/PHP/ReturnFunctionValueUnitTest.inc | 9 - .../Tests/PHP/ReturnFunctionValueUnitTest.php | 52 - .../Tests/Strings/JoinStringsUnitTest.js | 18 - .../Tests/Strings/JoinStringsUnitTest.php | 62 - .../src/Standards/MySource/ruleset.xml | 18 - .../Docs/Classes/ClassDeclarationStandard.xml | 22 - .../Docs/Commenting/ClassCommentStandard.xml | 177 - .../Docs/Commenting/FileCommentStandard.xml | 286 - .../Commenting/FunctionCommentStandard.xml | 230 - .../Docs/Commenting/InlineCommentStandard.xml | 19 - .../ControlSignatureStandard.xml | 36 - .../MultiLineConditionStandard.xml | 60 - .../PEAR/Docs/Files/IncludingFileStandard.xml | 24 - .../PEAR/Docs/Files/LineLengthStandard.xml | 7 - .../MultiLineAssignmentStandard.xml | 35 - .../FunctionCallSignatureStandard.xml | 19 - .../Functions/FunctionDeclarationStandard.xml | 41 - .../Functions/ValidDefaultValueStandard.xml | 25 - .../ValidClassNameStandard.xml | 23 - .../ValidFunctionNameStandard.xml | 23 - .../ValidVariableNameStandard.xml | 29 - .../ObjectOperatorIndentStandard.xml | 39 - .../WhiteSpace/ScopeClosingBraceStandard.xml | 23 - .../Docs/WhiteSpace/ScopeIndentStandard.xml | 29 - .../Sniffs/Classes/ClassDeclarationSniff.php | 149 - .../Sniffs/Commenting/ClassCommentSniff.php | 104 - .../Sniffs/Commenting/FileCommentSniff.php | 569 - .../Commenting/FunctionCommentSniff.php | 472 - .../Sniffs/Commenting/InlineCommentSniff.php | 68 - .../ControlSignatureSniff.php | 47 - .../MultiLineConditionSniff.php | 283 - .../PEAR/Sniffs/Files/IncludingFileSniff.php | 136 - .../Formatting/MultiLineAssignmentSniff.php | 106 - .../Functions/FunctionCallSignatureSniff.php | 627 - .../Functions/FunctionDeclarationSniff.php | 511 - .../Functions/ValidDefaultValueSniff.php | 78 - .../NamingConventions/ValidClassNameSniff.php | 97 - .../ValidFunctionNameSniff.php | 282 - .../ValidVariableNameSniff.php | 103 - .../WhiteSpace/ObjectOperatorIndentSniff.php | 194 - .../WhiteSpace/ScopeClosingBraceSniff.php | 179 - .../Sniffs/WhiteSpace/ScopeIndentSniff.php | 24 - .../Classes/ClassDeclarationUnitTest.1.inc | 112 - .../ClassDeclarationUnitTest.1.inc.fixed | 121 - .../Classes/ClassDeclarationUnitTest.2.inc | 11 - .../Classes/ClassDeclarationUnitTest.php | 94 - .../Tests/Commenting/ClassCommentUnitTest.inc | 120 - .../Tests/Commenting/ClassCommentUnitTest.php | 70 - .../Tests/Commenting/FileCommentUnitTest.inc | 53 - .../Tests/Commenting/FileCommentUnitTest.php | 69 - .../Commenting/FunctionCommentUnitTest.inc | 383 - .../FunctionCommentUnitTest.inc.fixed | 383 - .../Commenting/FunctionCommentUnitTest.php | 91 - .../Commenting/InlineCommentUnitTest.inc | 29 - .../InlineCommentUnitTest.inc.fixed | 29 - .../Commenting/InlineCommentUnitTest.php | 55 - .../ControlSignatureUnitTest.inc | 159 - .../ControlSignatureUnitTest.php | 71 - .../MultiLineConditionUnitTest.inc | 251 - .../MultiLineConditionUnitTest.inc.fixed | 247 - .../MultiLineConditionUnitTest.js | 251 - .../MultiLineConditionUnitTest.js.fixed | 247 - .../MultiLineConditionUnitTest.php | 91 - .../Tests/Files/IncludingFileUnitTest.inc | 99 - .../Files/IncludingFileUnitTest.inc.fixed | 99 - .../Tests/Files/IncludingFileUnitTest.php | 67 - .../MultiLineAssignmentUnitTest.inc | 22 - .../MultiLineAssignmentUnitTest.php | 52 - .../FunctionCallSignatureUnitTest.inc | 524 - .../FunctionCallSignatureUnitTest.inc.fixed | 536 - .../FunctionCallSignatureUnitTest.js | 80 - .../FunctionCallSignatureUnitTest.js.fixed | 84 - .../FunctionCallSignatureUnitTest.php | 148 - .../Functions/FunctionDeclarationUnitTest.inc | 316 - .../FunctionDeclarationUnitTest.inc.fixed | 314 - .../Functions/FunctionDeclarationUnitTest.js | 59 - .../FunctionDeclarationUnitTest.js.fixed | 60 - .../Functions/FunctionDeclarationUnitTest.php | 121 - .../Functions/ValidDefaultValueUnitTest.inc | 104 - .../Functions/ValidDefaultValueUnitTest.php | 58 - .../ValidClassNameUnitTest.inc | 68 - .../ValidClassNameUnitTest.php | 67 - .../ValidFunctionNameUnitTest.inc | 222 - .../ValidFunctionNameUnitTest.php | 145 - .../ValidVariableNameUnitTest.inc | 101 - .../ValidVariableNameUnitTest.php | 56 - .../ObjectOperatorIndentUnitTest.inc | 112 - .../ObjectOperatorIndentUnitTest.inc.fixed | 112 - .../ObjectOperatorIndentUnitTest.php | 67 - .../WhiteSpace/ScopeClosingBraceUnitTest.inc | 146 - .../ScopeClosingBraceUnitTest.inc.fixed | 150 - .../WhiteSpace/ScopeClosingBraceUnitTest.php | 63 - .../Tests/WhiteSpace/ScopeIndentUnitTest.inc | 314 - .../Tests/WhiteSpace/ScopeIndentUnitTest.php | 66 - .../src/Standards/PEAR/ruleset.xml | 41 - .../Docs/Classes/ClassDeclarationStandard.xml | 48 - .../PSR1/Docs/Files/SideEffectsStandard.xml | 27 - .../Methods/CamelCapsMethodNameStandard.xml | 29 - .../Sniffs/Classes/ClassDeclarationSniff.php | 74 - .../PSR1/Sniffs/Files/SideEffectsSniff.php | 287 - .../Methods/CamelCapsMethodNameSniff.php | 91 - .../Classes/ClassDeclarationUnitTest.1.inc | 3 - .../Classes/ClassDeclarationUnitTest.2.inc | 4 - .../Classes/ClassDeclarationUnitTest.php | 57 - .../Tests/Files/SideEffectsUnitTest.1.inc | 72 - .../Tests/Files/SideEffectsUnitTest.10.inc | 8 - .../Tests/Files/SideEffectsUnitTest.11.inc | 11 - .../Tests/Files/SideEffectsUnitTest.12.inc | 8 - .../Tests/Files/SideEffectsUnitTest.2.inc | 24 - .../Tests/Files/SideEffectsUnitTest.3.inc | 6 - .../Tests/Files/SideEffectsUnitTest.4.inc | 10 - .../Tests/Files/SideEffectsUnitTest.5.inc | 2 - .../Tests/Files/SideEffectsUnitTest.6.inc | 9 - .../Tests/Files/SideEffectsUnitTest.7.inc | 8 - .../Tests/Files/SideEffectsUnitTest.8.inc | 8 - .../Tests/Files/SideEffectsUnitTest.9.inc | 8 - .../PSR1/Tests/Files/SideEffectsUnitTest.php | 78 - .../Methods/CamelCapsMethodNameUnitTest.inc | 81 - .../Methods/CamelCapsMethodNameUnitTest.php | 59 - .../src/Standards/PSR1/ruleset.xml | 47 - .../Classes/ClassInstantiationStandard.xml | 19 - .../NullableTypeDeclarationStandard.xml | 45 - .../ShortFormTypeKeywordsStandard.xml | 19 - .../CompoundNamespaceDepthStandard.xml | 28 - .../Operators/OperatorSpacingStandard.xml | 27 - .../Classes/AnonClassDeclarationSniff.php | 242 - .../Classes/ClassInstantiationSniff.php | 100 - .../Sniffs/Classes/ClosingBraceSniff.php | 66 - .../BooleanOperatorPlacementSniff.php | 199 - .../ControlStructureSpacingSniff.php | 191 - .../Sniffs/Files/DeclareStatementSniff.php | 256 - .../PSR12/Sniffs/Files/FileHeaderSniff.php | 404 - .../Sniffs/Files/ImportStatementSniff.php | 77 - .../PSR12/Sniffs/Files/OpenTagSniff.php | 73 - .../NullableTypeDeclarationSniff.php | 90 - .../Functions/ReturnTypeDeclarationSniff.php | 110 - .../Keywords/ShortFormTypeKeywordsSniff.php | 75 - .../CompoundNamespaceDepthSniff.php | 80 - .../Sniffs/Operators/OperatorSpacingSniff.php | 112 - .../Properties/ConstantVisibilitySniff.php | 61 - .../Sniffs/Traits/UseDeclarationSniff.php | 700 - .../Classes/AnonClassDeclarationUnitTest.inc | 84 - .../AnonClassDeclarationUnitTest.inc.fixed | 86 - .../Classes/AnonClassDeclarationUnitTest.php | 71 - .../Classes/ClassInstantiationUnitTest.inc | 34 - .../ClassInstantiationUnitTest.inc.fixed | 34 - .../Classes/ClassInstantiationUnitTest.php | 64 - .../Tests/Classes/ClosingBraceUnitTest.inc | 47 - .../Tests/Classes/ClosingBraceUnitTest.php | 54 - .../BooleanOperatorPlacementUnitTest.inc | 110 - ...BooleanOperatorPlacementUnitTest.inc.fixed | 120 - .../BooleanOperatorPlacementUnitTest.php | 58 - .../ControlStructureSpacingUnitTest.inc | 86 - .../ControlStructureSpacingUnitTest.inc.fixed | 87 - .../ControlStructureSpacingUnitTest.php | 64 - .../Tests/Files/DeclareStatementUnitTest.inc | 50 - .../Files/DeclareStatementUnitTest.inc.fixed | 54 - .../Tests/Files/DeclareStatementUnitTest.php | 72 - .../Tests/Files/FileHeaderUnitTest.1.inc | 29 - .../Tests/Files/FileHeaderUnitTest.10.inc | 4 - .../Files/FileHeaderUnitTest.10.inc.fixed | 5 - .../Tests/Files/FileHeaderUnitTest.11.inc | 21 - .../Files/FileHeaderUnitTest.11.inc.fixed | 22 - .../Tests/Files/FileHeaderUnitTest.12.inc | 17 - .../Files/FileHeaderUnitTest.12.inc.fixed | 18 - .../Tests/Files/FileHeaderUnitTest.13.inc | 24 - .../Tests/Files/FileHeaderUnitTest.14.inc | 7 - .../Tests/Files/FileHeaderUnitTest.15.inc | 5 - .../Tests/Files/FileHeaderUnitTest.2.inc | 33 - .../Files/FileHeaderUnitTest.2.inc.fixed | 29 - .../Tests/Files/FileHeaderUnitTest.3.inc | 27 - .../Tests/Files/FileHeaderUnitTest.4.inc | 15 - .../Files/FileHeaderUnitTest.4.inc.fixed | 19 - .../Tests/Files/FileHeaderUnitTest.5.inc | 18 - .../Tests/Files/FileHeaderUnitTest.6.inc | 13 - .../Tests/Files/FileHeaderUnitTest.7.inc | 2 - .../Files/FileHeaderUnitTest.7.inc.fixed | 3 - .../Tests/Files/FileHeaderUnitTest.8.inc | 5 - .../Tests/Files/FileHeaderUnitTest.9.inc | 7 - .../PSR12/Tests/Files/FileHeaderUnitTest.php | 82 - .../Tests/Files/ImportStatementUnitTest.inc | 19 - .../Files/ImportStatementUnitTest.inc.fixed | 19 - .../Tests/Files/ImportStatementUnitTest.php | 52 - .../PSR12/Tests/Files/OpenTagUnitTest.1.inc | 3 - .../PSR12/Tests/Files/OpenTagUnitTest.2.inc | 1 - .../Tests/Files/OpenTagUnitTest.2.inc.fixed | 2 - .../PSR12/Tests/Files/OpenTagUnitTest.3.inc | 3 - .../PSR12/Tests/Files/OpenTagUnitTest.4.inc | 2 - .../PSR12/Tests/Files/OpenTagUnitTest.5.inc | 1 - .../PSR12/Tests/Files/OpenTagUnitTest.php | 55 - .../NullableTypeDeclarationUnitTest.inc | 84 - .../NullableTypeDeclarationUnitTest.inc.fixed | 82 - .../NullableTypeDeclarationUnitTest.php | 63 - .../ReturnTypeDeclarationUnitTest.inc | 64 - .../ReturnTypeDeclarationUnitTest.inc.fixed | 60 - .../ReturnTypeDeclarationUnitTest.php | 61 - .../ShortFormTypeKeywordsUnitTest.inc | 14 - .../ShortFormTypeKeywordsUnitTest.inc.fixed | 14 - .../ShortFormTypeKeywordsUnitTest.php | 54 - .../CompoundNamespaceDepthUnitTest.inc | 31 - .../CompoundNamespaceDepthUnitTest.php | 52 - .../Operators/OperatorSpacingUnitTest.inc | 58 - .../OperatorSpacingUnitTest.inc.fixed | 58 - .../Operators/OperatorSpacingUnitTest.php | 69 - .../Properties/ConstantVisibilityUnitTest.inc | 7 - .../Properties/ConstantVisibilityUnitTest.php | 48 - .../Tests/Traits/UseDeclarationUnitTest.inc | 209 - .../Traits/UseDeclarationUnitTest.inc.fixed | 203 - .../Tests/Traits/UseDeclarationUnitTest.php | 70 - .../src/Standards/PSR12/ruleset.xml | 350 - .../Docs/Classes/ClassDeclarationStandard.xml | 23 - .../Classes/PropertyDeclarationStandard.xml | 81 - .../ControlStructureSpacingStandard.xml | 23 - .../ElseIfDeclarationStandard.xml | 27 - .../SwitchDeclarationStandard.xml | 104 - .../Docs/Files/EndFileNewlineStandard.xml | 7 - .../Methods/MethodDeclarationStandard.xml | 51 - .../NamespaceDeclarationStandard.xml | 22 - .../Namespaces/UseDeclarationStandard.xml | 57 - .../Sniffs/Classes/ClassDeclarationSniff.php | 528 - .../Classes/PropertyDeclarationSniff.php | 184 - .../ControlStructureSpacingSniff.php | 141 - .../ElseIfDeclarationSniff.php | 72 - .../SwitchDeclarationSniff.php | 318 - .../PSR2/Sniffs/Files/ClosingTagSniff.php | 88 - .../PSR2/Sniffs/Files/EndFileNewlineSniff.php | 104 - .../Methods/FunctionCallSignatureSniff.php | 79 - .../Methods/FunctionClosingBraceSniff.php | 91 - .../Sniffs/Methods/MethodDeclarationSniff.php | 162 - .../Namespaces/NamespaceDeclarationSniff.php | 93 - .../Sniffs/Namespaces/UseDeclarationSniff.php | 293 - .../Classes/ClassDeclarationUnitTest.inc | 241 - .../ClassDeclarationUnitTest.inc.fixed | 234 - .../Classes/ClassDeclarationUnitTest.php | 86 - .../Classes/PropertyDeclarationUnitTest.inc | 73 - .../PropertyDeclarationUnitTest.inc.fixed | 70 - .../Classes/PropertyDeclarationUnitTest.php | 74 - .../ControlStructureSpacingUnitTest.inc | 70 - .../ControlStructureSpacingUnitTest.inc.fixed | 69 - .../ControlStructureSpacingUnitTest.php | 59 - .../ElseIfDeclarationUnitTest.inc | 17 - .../ElseIfDeclarationUnitTest.inc.fixed | 17 - .../ElseIfDeclarationUnitTest.php | 51 - .../SwitchDeclarationUnitTest.inc | 273 - .../SwitchDeclarationUnitTest.inc.fixed | 276 - .../SwitchDeclarationUnitTest.php | 70 - .../PSR2/Tests/Files/ClosingTagUnitTest.1.inc | 12 - .../Files/ClosingTagUnitTest.1.inc.fixed | 12 - .../PSR2/Tests/Files/ClosingTagUnitTest.2.inc | 3 - .../PSR2/Tests/Files/ClosingTagUnitTest.3.inc | 7 - .../PSR2/Tests/Files/ClosingTagUnitTest.4.inc | 1 - .../Files/ClosingTagUnitTest.4.inc.fixed | 1 - .../PSR2/Tests/Files/ClosingTagUnitTest.5.inc | 1 - .../Files/ClosingTagUnitTest.5.inc.fixed | 1 - .../PSR2/Tests/Files/ClosingTagUnitTest.6.inc | 5 - .../Files/ClosingTagUnitTest.6.inc.fixed | 5 - .../PSR2/Tests/Files/ClosingTagUnitTest.php | 63 - .../Tests/Files/EndFileNewlineUnitTest.1.inc | 3 - .../Files/EndFileNewlineUnitTest.1.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.10.inc | 3 - .../Files/EndFileNewlineUnitTest.10.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.2.inc | 2 - .../Tests/Files/EndFileNewlineUnitTest.3.inc | 2 - .../Files/EndFileNewlineUnitTest.3.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.4.inc | 4 - .../Tests/Files/EndFileNewlineUnitTest.5.inc | 6 - .../Tests/Files/EndFileNewlineUnitTest.6.inc | 2 - .../Files/EndFileNewlineUnitTest.6.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.7.inc | 11 - .../Files/EndFileNewlineUnitTest.7.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.8.inc | 2 - .../Tests/Files/EndFileNewlineUnitTest.9.inc | 2 - .../Files/EndFileNewlineUnitTest.9.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.php | 62 - .../Methods/FunctionCallSignatureUnitTest.inc | 244 - .../FunctionCallSignatureUnitTest.inc.fixed | 257 - .../Methods/FunctionCallSignatureUnitTest.php | 90 - .../Methods/FunctionClosingBraceUnitTest.inc | 70 - .../FunctionClosingBraceUnitTest.inc.fixed | 61 - .../Methods/FunctionClosingBraceUnitTest.php | 55 - .../Methods/MethodDeclarationUnitTest.inc | 66 - .../MethodDeclarationUnitTest.inc.fixed | 66 - .../Methods/MethodDeclarationUnitTest.php | 69 - .../NamespaceDeclarationUnitTest.inc | 22 - .../NamespaceDeclarationUnitTest.inc.fixed | 24 - .../NamespaceDeclarationUnitTest.php | 53 - .../Namespaces/UseDeclarationUnitTest.1.inc | 38 - .../Namespaces/UseDeclarationUnitTest.10.inc | 8 - .../UseDeclarationUnitTest.10.inc.fixed | 9 - .../Namespaces/UseDeclarationUnitTest.11.inc | 2 - .../UseDeclarationUnitTest.11.inc.fixed | 4 - .../Namespaces/UseDeclarationUnitTest.12.inc | 9 - .../UseDeclarationUnitTest.12.inc.fixed | 11 - .../Namespaces/UseDeclarationUnitTest.13.inc | 10 - .../UseDeclarationUnitTest.13.inc.fixed | 11 - .../Namespaces/UseDeclarationUnitTest.14.inc | 8 - .../UseDeclarationUnitTest.14.inc.fixed | 9 - .../Namespaces/UseDeclarationUnitTest.15.inc | 10 - .../Namespaces/UseDeclarationUnitTest.16.inc | 11 - .../UseDeclarationUnitTest.16.inc.fixed | 9 - .../Namespaces/UseDeclarationUnitTest.17.inc | 3 - .../Namespaces/UseDeclarationUnitTest.2.inc | 17 - .../UseDeclarationUnitTest.2.inc.fixed | 19 - .../Namespaces/UseDeclarationUnitTest.3.inc | 16 - .../UseDeclarationUnitTest.3.inc.fixed | 16 - .../Namespaces/UseDeclarationUnitTest.4.inc | 4 - .../Namespaces/UseDeclarationUnitTest.5.inc | 47 - .../UseDeclarationUnitTest.5.inc.fixed | 56 - .../Namespaces/UseDeclarationUnitTest.6.inc | 1 - .../Namespaces/UseDeclarationUnitTest.7.inc | 1 - .../Namespaces/UseDeclarationUnitTest.8.inc | 8 - .../Namespaces/UseDeclarationUnitTest.9.inc | 8 - .../Namespaces/UseDeclarationUnitTest.php | 94 - .../src/Standards/PSR2/ruleset.xml | 218 - .../Arrays/ArrayBracketSpacingStandard.xml | 19 - .../Docs/Arrays/ArrayDeclarationStandard.xml | 117 - .../LowercaseClassKeywordsStandard.xml | 23 - .../Classes/SelfMemberReferenceStandard.xml | 63 - .../DocCommentAlignmentStandard.xml | 39 - .../FunctionCommentThrowTagStandard.xml | 32 - .../ForEachLoopDeclarationStandard.xml | 39 - .../ForLoopDeclarationStandard.xml | 55 - .../LowercaseDeclarationStandard.xml | 23 - .../FunctionDuplicateArgumentStandard.xml | 23 - .../LowercaseFunctionKeywordsStandard.xml | 25 - .../Docs/Scope/StaticThisUsageStandard.xml | 31 - .../Docs/Strings/EchoedStringsStandard.xml | 19 - .../Docs/WhiteSpace/CastSpacingStandard.xml | 19 - .../FunctionOpeningBraceStandard.xml | 41 - .../LanguageConstructSpacingStandard.xml | 19 - .../ObjectOperatorSpacingStandard.xml | 19 - .../ScopeKeywordSpacingStandard.xml | 23 - .../WhiteSpace/SemicolonSpacingStandard.xml | 19 - .../Arrays/ArrayBracketSpacingSniff.php | 95 - .../Sniffs/Arrays/ArrayDeclarationSniff.php | 877 - .../ClassDefinitionClosingBraceSpaceSniff.php | 134 - .../CSS/ClassDefinitionNameSpacingSniff.php | 111 - .../ClassDefinitionOpeningBraceSpaceSniff.php | 176 - .../Squiz/Sniffs/CSS/ColonSpacingSniff.php | 107 - .../Sniffs/CSS/ColourDefinitionSniff.php | 88 - .../DisallowMultipleStyleDefinitionsSniff.php | 71 - .../CSS/DuplicateClassDefinitionSniff.php | 116 - .../CSS/DuplicateStyleDefinitionSniff.php | 88 - .../Sniffs/CSS/EmptyClassDefinitionSniff.php | 61 - .../Sniffs/CSS/EmptyStyleDefinitionSniff.php | 64 - .../Squiz/Sniffs/CSS/ForbiddenStylesSniff.php | 177 - .../Squiz/Sniffs/CSS/IndentationSniff.php | 150 - .../CSS/LowercaseStyleDefinitionSniff.php | 97 - .../Squiz/Sniffs/CSS/MissingColonSniff.php | 91 - .../Squiz/Sniffs/CSS/NamedColoursSniff.php | 93 - .../Squiz/Sniffs/CSS/OpacitySniff.php | 101 - .../Sniffs/CSS/SemicolonSpacingSniff.php | 103 - .../Squiz/Sniffs/CSS/ShorthandSizeSniff.php | 181 - .../Sniffs/Classes/ClassDeclarationSniff.php | 206 - .../Sniffs/Classes/ClassFileNameSniff.php | 69 - .../Sniffs/Classes/DuplicatePropertySniff.php | 82 - .../Classes/LowercaseClassKeywordsSniff.php | 72 - .../Classes/SelfMemberReferenceSniff.php | 240 - .../Sniffs/Classes/ValidClassNameSniff.php | 86 - .../Sniffs/Commenting/BlockCommentSniff.php | 388 - .../Sniffs/Commenting/ClassCommentSniff.php | 87 - .../ClosingDeclarationCommentSniff.php | 129 - .../Commenting/DocCommentAlignmentSniff.php | 158 - .../Commenting/EmptyCatchCommentSniff.php | 55 - .../Sniffs/Commenting/FileCommentSniff.php | 214 - .../Commenting/FunctionCommentSniff.php | 698 - .../FunctionCommentThrowTagSniff.php | 233 - .../Sniffs/Commenting/InlineCommentSniff.php | 343 - .../LongConditionClosingCommentSniff.php | 206 - .../Commenting/PostStatementCommentSniff.php | 120 - .../Commenting/VariableCommentSniff.php | 178 - .../ControlSignatureSniff.php | 324 - .../ElseIfDeclarationSniff.php | 51 - .../ForEachLoopDeclarationSniff.php | 236 - .../ForLoopDeclarationSniff.php | 316 - .../InlineIfDeclarationSniff.php | 155 - .../LowercaseDeclarationSniff.php | 74 - .../SwitchDeclarationSniff.php | 304 - .../Squiz/Sniffs/Debug/JSLintSniff.php | 85 - .../Sniffs/Debug/JavaScriptLintSniff.php | 88 - .../Squiz/Sniffs/Files/FileExtensionSniff.php | 68 - .../Formatting/OperatorBracketSniff.php | 385 - ...unctionDeclarationArgumentSpacingSniff.php | 392 - .../Functions/FunctionDeclarationSniff.php | 34 - .../FunctionDuplicateArgumentSniff.php | 64 - .../Sniffs/Functions/GlobalFunctionSniff.php | 61 - .../LowercaseFunctionKeywordsSniff.php | 69 - .../MultiLineFunctionDeclarationSniff.php | 258 - .../ValidFunctionNameSniff.php | 54 - .../ValidVariableNameSniff.php | 178 - .../DisallowObjectStringIndexSniff.php | 85 - .../Objects/ObjectInstantiationSniff.php | 67 - .../Sniffs/Objects/ObjectMemberCommaSniff.php | 64 - .../ComparisonOperatorUsageSniff.php | 235 - .../IncrementDecrementUsageSniff.php | 224 - .../Operators/ValidLogicalOperatorsSniff.php | 67 - .../Sniffs/PHP/CommentedOutCodeSniff.php | 288 - .../PHP/DisallowBooleanStatementSniff.php | 59 - .../PHP/DisallowComparisonAssignmentSniff.php | 108 - .../Sniffs/PHP/DisallowInlineIfSniff.php | 57 - .../PHP/DisallowMultipleAssignmentsSniff.php | 184 - .../PHP/DisallowSizeFunctionsInLoopsSniff.php | 114 - .../Sniffs/PHP/DiscouragedFunctionsSniff.php | 38 - .../Squiz/Sniffs/PHP/EmbeddedPhpSniff.php | 402 - .../Standards/Squiz/Sniffs/PHP/EvalSniff.php | 48 - .../Squiz/Sniffs/PHP/GlobalKeywordSniff.php | 53 - .../Squiz/Sniffs/PHP/HeredocSniff.php | 51 - .../Squiz/Sniffs/PHP/InnerFunctionsSniff.php | 68 - .../Sniffs/PHP/LowercasePHPFunctionsSniff.php | 160 - .../Sniffs/PHP/NonExecutableCodeSniff.php | 273 - .../Sniffs/Scope/MemberVarScopeSniff.php | 77 - .../Squiz/Sniffs/Scope/MethodScopeSniff.php | 92 - .../Sniffs/Scope/StaticThisUsageSniff.php | 107 - .../Strings/ConcatenationSpacingSniff.php | 160 - .../Sniffs/Strings/DoubleQuoteUsageSniff.php | 144 - .../Sniffs/Strings/EchoedStringsSniff.php | 88 - .../Sniffs/WhiteSpace/CastSpacingSniff.php | 65 - .../ControlStructureSpacingSniff.php | 347 - .../FunctionClosingBraceSpaceSniff.php | 164 - .../FunctionOpeningBraceSpaceSniff.php | 98 - .../WhiteSpace/FunctionSpacingSniff.php | 353 - .../LanguageConstructSpacingSniff.php | 89 - .../LogicalOperatorSpacingSniff.php | 102 - .../WhiteSpace/MemberVarSpacingSniff.php | 219 - .../WhiteSpace/ObjectOperatorSpacingSniff.php | 166 - .../WhiteSpace/OperatorSpacingSniff.php | 386 - .../WhiteSpace/PropertyLabelSpacingSniff.php | 79 - .../WhiteSpace/ScopeClosingBraceSniff.php | 105 - .../WhiteSpace/ScopeKeywordSpacingSniff.php | 125 - .../WhiteSpace/SemicolonSpacingSniff.php | 116 - .../WhiteSpace/SuperfluousWhitespaceSniff.php | 264 - .../Arrays/ArrayBracketSpacingUnitTest.inc | 31 - .../ArrayBracketSpacingUnitTest.inc.fixed | 31 - .../Arrays/ArrayBracketSpacingUnitTest.php | 57 - .../Arrays/ArrayDeclarationUnitTest.1.inc | 453 - .../ArrayDeclarationUnitTest.1.inc.fixed | 489 - .../Arrays/ArrayDeclarationUnitTest.2.inc | 442 - .../ArrayDeclarationUnitTest.2.inc.fixed | 476 - .../Tests/Arrays/ArrayDeclarationUnitTest.php | 230 - ...assDefinitionClosingBraceSpaceUnitTest.css | 81 - ...initionClosingBraceSpaceUnitTest.css.fixed | 85 - ...assDefinitionClosingBraceSpaceUnitTest.php | 60 - .../ClassDefinitionNameSpacingUnitTest.css | 66 - .../ClassDefinitionNameSpacingUnitTest.php | 51 - ...assDefinitionOpeningBraceSpaceUnitTest.css | 108 - ...initionOpeningBraceSpaceUnitTest.css.fixed | 106 - ...assDefinitionOpeningBraceSpaceUnitTest.php | 64 - .../Squiz/Tests/CSS/ColonSpacingUnitTest.css | 42 - .../Tests/CSS/ColonSpacingUnitTest.css.fixed | 40 - .../Squiz/Tests/CSS/ColonSpacingUnitTest.php | 60 - .../Tests/CSS/ColourDefinitionUnitTest.css | 16 - .../CSS/ColourDefinitionUnitTest.css.fixed | 16 - .../Tests/CSS/ColourDefinitionUnitTest.php | 52 - ...sallowMultipleStyleDefinitionsUnitTest.css | 17 - ...MultipleStyleDefinitionsUnitTest.css.fixed | 27 - ...sallowMultipleStyleDefinitionsUnitTest.php | 54 - .../CSS/DuplicateClassDefinitionUnitTest.css | 103 - .../CSS/DuplicateClassDefinitionUnitTest.php | 54 - .../CSS/DuplicateStyleDefinitionUnitTest.css | 27 - .../CSS/DuplicateStyleDefinitionUnitTest.php | 48 - .../CSS/EmptyClassDefinitionUnitTest.css | 15 - .../CSS/EmptyClassDefinitionUnitTest.php | 54 - .../CSS/EmptyStyleDefinitionUnitTest.css | 11 - .../CSS/EmptyStyleDefinitionUnitTest.php | 53 - .../Tests/CSS/ForbiddenStylesUnitTest.css | 18 - .../CSS/ForbiddenStylesUnitTest.css.fixed | 18 - .../Tests/CSS/ForbiddenStylesUnitTest.php | 57 - .../Squiz/Tests/CSS/IndentationUnitTest.1.css | 79 - .../Tests/CSS/IndentationUnitTest.1.css.fixed | 73 - .../Squiz/Tests/CSS/IndentationUnitTest.2.css | 3 - .../Squiz/Tests/CSS/IndentationUnitTest.php | 75 - .../CSS/LowercaseStyleDefinitionUnitTest.css | 14 - .../CSS/LowercaseStyleDefinitionUnitTest.php | 53 - .../Squiz/Tests/CSS/MissingColonUnitTest.css | 21 - .../Squiz/Tests/CSS/MissingColonUnitTest.php | 53 - .../Squiz/Tests/CSS/NamedColoursUnitTest.css | 25 - .../Squiz/Tests/CSS/NamedColoursUnitTest.php | 54 - .../Squiz/Tests/CSS/OpacityUnitTest.css | 35 - .../Squiz/Tests/CSS/OpacityUnitTest.css.fixed | 35 - .../Squiz/Tests/CSS/OpacityUnitTest.php | 60 - .../Tests/CSS/SemicolonSpacingUnitTest.css | 61 - .../CSS/SemicolonSpacingUnitTest.css.fixed | 58 - .../Tests/CSS/SemicolonSpacingUnitTest.php | 58 - .../Squiz/Tests/CSS/ShorthandSizeUnitTest.css | 45 - .../Tests/CSS/ShorthandSizeUnitTest.css.fixed | 41 - .../Squiz/Tests/CSS/ShorthandSizeUnitTest.php | 59 - .../Classes/ClassDeclarationUnitTest.inc | 121 - .../ClassDeclarationUnitTest.inc.fixed | 132 - .../Classes/ClassDeclarationUnitTest.php | 84 - .../Tests/Classes/ClassFileNameUnitTest.inc | 37 - .../Tests/Classes/ClassFileNameUnitTest.php | 70 - .../Classes/DuplicatePropertyUnitTest.js | 45 - .../Classes/DuplicatePropertyUnitTest.php | 52 - .../LowercaseClassKeywordsUnitTest.inc | 13 - .../LowercaseClassKeywordsUnitTest.inc.fixed | 13 - .../LowercaseClassKeywordsUnitTest.php | 58 - .../Classes/SelfMemberReferenceUnitTest.inc | 174 - .../SelfMemberReferenceUnitTest.inc.fixed | 162 - .../Classes/SelfMemberReferenceUnitTest.php | 64 - .../Tests/Classes/ValidClassNameUnitTest.inc | 147 - .../Tests/Classes/ValidClassNameUnitTest.php | 70 - .../Tests/Commenting/BlockCommentUnitTest.inc | 258 - .../Commenting/BlockCommentUnitTest.inc.fixed | 260 - .../Tests/Commenting/BlockCommentUnitTest.php | 102 - .../Tests/Commenting/ClassCommentUnitTest.inc | 125 - .../Tests/Commenting/ClassCommentUnitTest.php | 59 - .../ClosingDeclarationCommentUnitTest.inc | 82 - .../ClosingDeclarationCommentUnitTest.php | 57 - .../DocCommentAlignmentUnitTest.inc | 83 - .../DocCommentAlignmentUnitTest.inc.fixed | 83 - .../Commenting/DocCommentAlignmentUnitTest.js | 76 - .../DocCommentAlignmentUnitTest.js.fixed | 76 - .../DocCommentAlignmentUnitTest.php | 70 - .../Commenting/EmptyCatchCommentUnitTest.inc | 55 - .../Commenting/EmptyCatchCommentUnitTest.php | 55 - .../Commenting/FileCommentUnitTest.1.inc | 43 - .../FileCommentUnitTest.1.inc.fixed | 43 - .../Tests/Commenting/FileCommentUnitTest.1.js | 40 - .../Commenting/FileCommentUnitTest.1.js.fixed | 40 - .../Commenting/FileCommentUnitTest.2.inc | 11 - .../Tests/Commenting/FileCommentUnitTest.2.js | 10 - .../Commenting/FileCommentUnitTest.3.inc | 9 - .../Commenting/FileCommentUnitTest.4.inc | 3 - .../Commenting/FileCommentUnitTest.5.inc | 4 - .../Commenting/FileCommentUnitTest.6.inc | 12 - .../Tests/Commenting/FileCommentUnitTest.php | 74 - .../FunctionCommentThrowTagUnitTest.inc | 511 - .../FunctionCommentThrowTagUnitTest.php | 60 - .../Commenting/FunctionCommentUnitTest.inc | 1002 - .../FunctionCommentUnitTest.inc.fixed | 1002 - .../Commenting/FunctionCommentUnitTest.php | 165 - .../Commenting/InlineCommentUnitTest.inc | 159 - .../InlineCommentUnitTest.inc.fixed | 152 - .../Tests/Commenting/InlineCommentUnitTest.js | 129 - .../Commenting/InlineCommentUnitTest.js.fixed | 125 - .../Commenting/InlineCommentUnitTest.php | 91 - .../LongConditionClosingCommentUnitTest.inc | 962 - ...gConditionClosingCommentUnitTest.inc.fixed | 962 - .../LongConditionClosingCommentUnitTest.js | 444 - ...ngConditionClosingCommentUnitTest.js.fixed | 444 - .../LongConditionClosingCommentUnitTest.php | 100 - .../PostStatementCommentUnitTest.1.js | 36 - .../PostStatementCommentUnitTest.1.js.fixed | 39 - .../PostStatementCommentUnitTest.2.js | 2 - .../PostStatementCommentUnitTest.inc | 48 - .../PostStatementCommentUnitTest.inc.fixed | 52 - .../PostStatementCommentUnitTest.php | 68 - .../Commenting/VariableCommentUnitTest.inc | 365 - .../VariableCommentUnitTest.inc.fixed | 365 - .../Commenting/VariableCommentUnitTest.php | 81 - .../ControlSignatureUnitTest.inc | 304 - .../ControlSignatureUnitTest.inc.fixed | 307 - .../ControlSignatureUnitTest.js | 135 - .../ControlSignatureUnitTest.js.fixed | 141 - .../ControlSignatureUnitTest.php | 101 - .../ElseIfDeclarationUnitTest.inc | 14 - .../ElseIfDeclarationUnitTest.inc.fixed | 14 - .../ElseIfDeclarationUnitTest.php | 51 - .../ForEachLoopDeclarationUnitTest.inc | 36 - .../ForEachLoopDeclarationUnitTest.inc.fixed | 36 - .../ForEachLoopDeclarationUnitTest.php | 56 - .../ForLoopDeclarationUnitTest.inc | 129 - .../ForLoopDeclarationUnitTest.inc.fixed | 95 - .../ForLoopDeclarationUnitTest.js | 125 - .../ForLoopDeclarationUnitTest.js.fixed | 91 - .../ForLoopDeclarationUnitTest.php | 132 - .../InlineIfDeclarationUnitTest.inc | 48 - .../InlineIfDeclarationUnitTest.inc.fixed | 48 - .../InlineIfDeclarationUnitTest.php | 75 - .../LowercaseDeclarationUnitTest.inc | 22 - .../LowercaseDeclarationUnitTest.inc.fixed | 22 - .../LowercaseDeclarationUnitTest.php | 60 - .../SwitchDeclarationUnitTest.inc | 333 - .../SwitchDeclarationUnitTest.js | 287 - .../SwitchDeclarationUnitTest.php | 152 - .../Squiz/Tests/Debug/JSLintUnitTest.js | 2 - .../Squiz/Tests/Debug/JSLintUnitTest.php | 69 - .../Tests/Debug/JavaScriptLintUnitTest.js | 2 - .../Tests/Debug/JavaScriptLintUnitTest.php | 66 - .../Tests/Files/FileExtensionUnitTest.1.inc | 3 - .../Tests/Files/FileExtensionUnitTest.2.inc | 3 - .../Tests/Files/FileExtensionUnitTest.3.inc | 3 - .../Tests/Files/FileExtensionUnitTest.4.inc | 3 - .../Tests/Files/FileExtensionUnitTest.php | 55 - .../Formatting/OperatorBracketUnitTest.inc | 172 - .../OperatorBracketUnitTest.inc.fixed | 172 - .../Formatting/OperatorBracketUnitTest.js | 118 - .../OperatorBracketUnitTest.js.fixed | 118 - .../Formatting/OperatorBracketUnitTest.php | 111 - ...tionDeclarationArgumentSpacingUnitTest.inc | 111 - ...clarationArgumentSpacingUnitTest.inc.fixed | 111 - ...tionDeclarationArgumentSpacingUnitTest.php | 86 - .../Functions/FunctionDeclarationUnitTest.inc | 75 - .../Functions/FunctionDeclarationUnitTest.php | 51 - .../FunctionDuplicateArgumentUnitTest.inc | 6 - .../FunctionDuplicateArgumentUnitTest.php | 52 - .../Functions/GlobalFunctionUnitTest.inc | 17 - .../Functions/GlobalFunctionUnitTest.php | 48 - .../LowercaseFunctionKeywordsUnitTest.inc | 28 - ...owercaseFunctionKeywordsUnitTest.inc.fixed | 28 - .../LowercaseFunctionKeywordsUnitTest.php | 58 - .../MultiLineFunctionDeclarationUnitTest.inc | 199 - ...iLineFunctionDeclarationUnitTest.inc.fixed | 211 - .../MultiLineFunctionDeclarationUnitTest.js | 73 - ...tiLineFunctionDeclarationUnitTest.js.fixed | 81 - .../MultiLineFunctionDeclarationUnitTest.php | 99 - .../ValidFunctionNameUnitTest.inc | 27 - .../ValidFunctionNameUnitTest.php | 59 - .../ValidVariableNameUnitTest.inc | 144 - .../ValidVariableNameUnitTest.php | 85 - .../DisallowObjectStringIndexUnitTest.js | 37 - .../DisallowObjectStringIndexUnitTest.php | 59 - .../Objects/ObjectInstantiationUnitTest.inc | 17 - .../Objects/ObjectInstantiationUnitTest.php | 51 - .../Objects/ObjectMemberCommaUnitTest.js | 47 - .../ObjectMemberCommaUnitTest.js.fixed | 47 - .../Objects/ObjectMemberCommaUnitTest.php | 53 - .../ComparisonOperatorUsageUnitTest.inc | 138 - .../ComparisonOperatorUsageUnitTest.js | 71 - .../ComparisonOperatorUsageUnitTest.php | 101 - .../IncrementDecrementUsageUnitTest.inc | 40 - .../IncrementDecrementUsageUnitTest.php | 58 - .../ValidLogicalOperatorsUnitTest.inc | 28 - .../ValidLogicalOperatorsUnitTest.php | 52 - .../Tests/PHP/CommentedOutCodeUnitTest.css | 23 - .../Tests/PHP/CommentedOutCodeUnitTest.inc | 158 - .../Tests/PHP/CommentedOutCodeUnitTest.php | 77 - .../PHP/DisallowBooleanStatementUnitTest.inc | 27 - .../PHP/DisallowBooleanStatementUnitTest.php | 53 - .../DisallowComparisonAssignmentUnitTest.inc | 64 - .../DisallowComparisonAssignmentUnitTest.php | 59 - .../Tests/PHP/DisallowInlineIfUnitTest.inc | 18 - .../Tests/PHP/DisallowInlineIfUnitTest.js | 2 - .../Tests/PHP/DisallowInlineIfUnitTest.php | 63 - .../DisallowMultipleAssignmentsUnitTest.inc | 77 - .../DisallowMultipleAssignmentsUnitTest.php | 56 - .../DisallowSizeFunctionsInLoopsUnitTest.inc | 58 - .../DisallowSizeFunctionsInLoopsUnitTest.js | 13 - .../DisallowSizeFunctionsInLoopsUnitTest.php | 73 - .../PHP/DiscouragedFunctionsUnitTest.inc | 5 - .../PHP/DiscouragedFunctionsUnitTest.php | 52 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.inc | 119 - .../Tests/PHP/EmbeddedPhpUnitTest.inc.fixed | 119 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.php | 78 - .../Squiz/Tests/PHP/EvalUnitTest.inc | 5 - .../Squiz/Tests/PHP/EvalUnitTest.php | 51 - .../Squiz/Tests/PHP/GlobalKeywordUnitTest.inc | 13 - .../Squiz/Tests/PHP/GlobalKeywordUnitTest.php | 51 - .../Squiz/Tests/PHP/HeredocUnitTest.inc | 27 - .../Squiz/Tests/PHP/HeredocUnitTest.php | 51 - .../Tests/PHP/InnerFunctionsUnitTest.inc | 50 - .../Tests/PHP/InnerFunctionsUnitTest.php | 51 - .../PHP/LowercasePHPFunctionsUnitTest.inc | 41 - .../LowercasePHPFunctionsUnitTest.inc.fixed | 41 - .../PHP/LowercasePHPFunctionsUnitTest.php | 55 - .../Tests/PHP/NonExecutableCodeUnitTest.1.inc | 298 - .../Tests/PHP/NonExecutableCodeUnitTest.2.inc | 55 - .../Tests/PHP/NonExecutableCodeUnitTest.php | 97 - .../Tests/Scope/MemberVarScopeUnitTest.inc | 72 - .../Tests/Scope/MemberVarScopeUnitTest.php | 57 - .../Squiz/Tests/Scope/MethodScopeUnitTest.inc | 42 - .../Squiz/Tests/Scope/MethodScopeUnitTest.php | 52 - .../Tests/Scope/StaticThisUsageUnitTest.inc | 78 - .../Tests/Scope/StaticThisUsageUnitTest.php | 57 - .../Strings/ConcatenationSpacingUnitTest.inc | 49 - .../ConcatenationSpacingUnitTest.inc.fixed | 47 - .../Strings/ConcatenationSpacingUnitTest.php | 66 - .../Strings/DoubleQuoteUsageUnitTest.inc | 37 - .../DoubleQuoteUsageUnitTest.inc.fixed | 37 - .../Strings/DoubleQuoteUsageUnitTest.php | 62 - .../Tests/Strings/EchoedStringsUnitTest.inc | 13 - .../Strings/EchoedStringsUnitTest.inc.fixed | 13 - .../Tests/Strings/EchoedStringsUnitTest.php | 55 - .../Tests/WhiteSpace/CastSpacingUnitTest.inc | 9 - .../WhiteSpace/CastSpacingUnitTest.inc.fixed | 9 - .../Tests/WhiteSpace/CastSpacingUnitTest.php | 54 - .../ControlStructureSpacingUnitTest.inc | 253 - .../ControlStructureSpacingUnitTest.inc.fixed | 246 - .../ControlStructureSpacingUnitTest.js | 93 - .../ControlStructureSpacingUnitTest.js.fixed | 93 - .../ControlStructureSpacingUnitTest.php | 100 - .../FunctionClosingBraceSpaceUnitTest.inc | 39 - ...unctionClosingBraceSpaceUnitTest.inc.fixed | 45 - .../FunctionClosingBraceSpaceUnitTest.js | 132 - ...FunctionClosingBraceSpaceUnitTest.js.fixed | 133 - .../FunctionClosingBraceSpaceUnitTest.php | 76 - .../FunctionOpeningBraceSpaceUnitTest.inc | 54 - ...unctionOpeningBraceSpaceUnitTest.inc.fixed | 49 - .../FunctionOpeningBraceSpaceUnitTest.js | 115 - ...FunctionOpeningBraceSpaceUnitTest.js.fixed | 109 - .../FunctionOpeningBraceSpaceUnitTest.php | 68 - .../WhiteSpace/FunctionSpacingUnitTest.1.inc | 545 - .../FunctionSpacingUnitTest.1.inc.fixed | 629 - .../WhiteSpace/FunctionSpacingUnitTest.2.inc | 5 - .../FunctionSpacingUnitTest.2.inc.fixed | 7 - .../WhiteSpace/FunctionSpacingUnitTest.3.inc | 10 - .../FunctionSpacingUnitTest.3.inc.fixed | 7 - .../WhiteSpace/FunctionSpacingUnitTest.4.inc | 7 - .../WhiteSpace/FunctionSpacingUnitTest.5.inc | 8 - .../FunctionSpacingUnitTest.5.inc.fixed | 10 - .../WhiteSpace/FunctionSpacingUnitTest.6.inc | 13 - .../FunctionSpacingUnitTest.6.inc.fixed | 10 - .../WhiteSpace/FunctionSpacingUnitTest.7.inc | 10 - .../WhiteSpace/FunctionSpacingUnitTest.php | 129 - .../LanguageConstructSpacingUnitTest.inc | 43 - ...LanguageConstructSpacingUnitTest.inc.fixed | 41 - .../LanguageConstructSpacingUnitTest.php | 60 - .../LogicalOperatorSpacingUnitTest.inc | 19 - .../LogicalOperatorSpacingUnitTest.inc.fixed | 19 - .../LogicalOperatorSpacingUnitTest.js | 19 - .../LogicalOperatorSpacingUnitTest.js.fixed | 19 - .../LogicalOperatorSpacingUnitTest.php | 56 - .../WhiteSpace/MemberVarSpacingUnitTest.inc | 334 - .../MemberVarSpacingUnitTest.inc.fixed | 321 - .../WhiteSpace/MemberVarSpacingUnitTest.php | 80 - .../ObjectOperatorSpacingUnitTest.inc | 48 - .../ObjectOperatorSpacingUnitTest.inc.fixed | 44 - .../ObjectOperatorSpacingUnitTest.php | 66 - .../WhiteSpace/OperatorSpacingUnitTest.inc | 467 - .../OperatorSpacingUnitTest.inc.fixed | 461 - .../WhiteSpace/OperatorSpacingUnitTest.js | 103 - .../OperatorSpacingUnitTest.js.fixed | 97 - .../WhiteSpace/OperatorSpacingUnitTest.php | 170 - .../PropertyLabelSpacingUnitTest.js | 40 - .../PropertyLabelSpacingUnitTest.js.fixed | 39 - .../PropertyLabelSpacingUnitTest.php | 55 - .../WhiteSpace/ScopeClosingBraceUnitTest.inc | 109 - .../ScopeClosingBraceUnitTest.inc.fixed | 110 - .../WhiteSpace/ScopeClosingBraceUnitTest.php | 54 - .../ScopeKeywordSpacingUnitTest.inc | 84 - .../ScopeKeywordSpacingUnitTest.inc.fixed | 79 - .../ScopeKeywordSpacingUnitTest.php | 61 - .../WhiteSpace/SemicolonSpacingUnitTest.inc | 42 - .../SemicolonSpacingUnitTest.inc.fixed | 41 - .../WhiteSpace/SemicolonSpacingUnitTest.js | 25 - .../SemicolonSpacingUnitTest.js.fixed | 25 - .../WhiteSpace/SemicolonSpacingUnitTest.php | 83 - .../SuperfluousWhitespaceUnitTest.1.css | 25 - .../SuperfluousWhitespaceUnitTest.1.css.fixed | 23 - .../SuperfluousWhitespaceUnitTest.1.inc | 74 - .../SuperfluousWhitespaceUnitTest.1.inc.fixed | 68 - .../SuperfluousWhitespaceUnitTest.1.js | 56 - .../SuperfluousWhitespaceUnitTest.1.js.fixed | 50 - .../SuperfluousWhitespaceUnitTest.2.css | 3 - .../SuperfluousWhitespaceUnitTest.2.css.fixed | 3 - .../SuperfluousWhitespaceUnitTest.2.inc | 9 - .../SuperfluousWhitespaceUnitTest.2.inc.fixed | 7 - .../SuperfluousWhitespaceUnitTest.2.js | 1 - .../SuperfluousWhitespaceUnitTest.2.js.fixed | 1 - .../SuperfluousWhitespaceUnitTest.3.css | 3 - .../SuperfluousWhitespaceUnitTest.3.css.fixed | 3 - .../SuperfluousWhitespaceUnitTest.3.inc | 14 - .../SuperfluousWhitespaceUnitTest.3.inc.fixed | 5 - .../SuperfluousWhitespaceUnitTest.3.js | 1 - .../SuperfluousWhitespaceUnitTest.3.js.fixed | 1 - .../SuperfluousWhitespaceUnitTest.4.inc | 4 - .../SuperfluousWhitespaceUnitTest.4.inc.fixed | 4 - .../SuperfluousWhitespaceUnitTest.5.inc | 5 - .../SuperfluousWhitespaceUnitTest.5.inc.fixed | 4 - .../SuperfluousWhitespaceUnitTest.php | 113 - .../src/Standards/Squiz/ruleset.xml | 132 - .../Zend/Docs/Debug/CodeAnalyzerStandard.xml | 25 - .../Zend/Docs/Files/ClosingTagStandard.xml | 22 - .../ValidVariableNameStandard.xml | 37 - .../Zend/Sniffs/Debug/CodeAnalyzerSniff.php | 97 - .../Zend/Sniffs/Files/ClosingTagSniff.php | 79 - .../ValidVariableNameSniff.php | 194 - .../Zend/Tests/Debug/CodeAnalyzerUnitTest.inc | 6 - .../Zend/Tests/Debug/CodeAnalyzerUnitTest.php | 66 - .../Zend/Tests/Files/ClosingTagUnitTest.1.inc | 12 - .../Files/ClosingTagUnitTest.1.inc.fixed | 12 - .../Zend/Tests/Files/ClosingTagUnitTest.2.inc | 3 - .../Zend/Tests/Files/ClosingTagUnitTest.3.inc | 1 - .../Files/ClosingTagUnitTest.3.inc.fixed | 1 - .../Zend/Tests/Files/ClosingTagUnitTest.4.inc | 1 - .../Files/ClosingTagUnitTest.4.inc.fixed | 1 - .../Zend/Tests/Files/ClosingTagUnitTest.5.inc | 1 - .../Files/ClosingTagUnitTest.5.inc.fixed | 1 - .../Zend/Tests/Files/ClosingTagUnitTest.6.inc | 3 - .../Files/ClosingTagUnitTest.6.inc.fixed | 3 - .../Zend/Tests/Files/ClosingTagUnitTest.7.inc | 1 - .../Files/ClosingTagUnitTest.7.inc.fixed | 1 - .../Zend/Tests/Files/ClosingTagUnitTest.php | 65 - .../ValidVariableNameUnitTest.inc | 118 - .../ValidVariableNameUnitTest.php | 93 - .../src/Standards/Zend/ruleset.xml | 32 - .../php_codesniffer/src/Tokenizers/CSS.php | 537 - .../src/Tokenizers/Comment.php | 277 - .../php_codesniffer/src/Tokenizers/JS.php | 1256 -- .../php_codesniffer/src/Tokenizers/PHP.php | 2409 --- .../src/Tokenizers/Tokenizer.php | 1702 -- .../php_codesniffer/src/Util/Cache.php | 346 - .../php_codesniffer/src/Util/Common.php | 520 - .../php_codesniffer/src/Util/Standards.php | 334 - .../php_codesniffer/src/Util/Timing.php | 86 - .../php_codesniffer/src/Util/Tokens.php | 656 - .../php_codesniffer/tests/AllTests.php | 67 - .../tests/Core/AbstractMethodUnitTest.php | 140 - .../php_codesniffer/tests/Core/AllTests.php | 63 - .../tests/Core/ErrorSuppressionTest.php | 1265 -- .../Core/File/FindEndOfStatementTest.inc | 55 - .../Core/File/FindEndOfStatementTest.php | 257 - .../Core/File/FindExtendedClassNameTest.inc | 37 - .../Core/File/FindExtendedClassNameTest.php | 93 - .../FindImplementedInterfaceNamesTest.inc | 26 - .../FindImplementedInterfaceNamesTest.php | 89 - .../Core/File/GetMemberPropertiesTest.inc | 181 - .../Core/File/GetMemberPropertiesTest.php | 524 - .../Core/File/GetMethodParametersTest.inc | 33 - .../Core/File/GetMethodParametersTest.php | 295 - .../Core/File/GetMethodPropertiesTest.inc | 68 - .../Core/File/GetMethodPropertiesTest.php | 404 - .../tests/Core/File/IsReferenceTest.inc | 141 - .../tests/Core/File/IsReferenceTest.php | 236 - .../tests/Core/Filters/Filter/AcceptTest.php | 150 - .../tests/Core/Filters/Filter/AcceptTest.xml | 16 - .../tests/Core/IsCamelCapsTest.php | 135 - .../RuleInclusionAbsoluteLinuxTest.php | 118 - .../RuleInclusionAbsoluteLinuxTest.xml | 11 - .../RuleInclusionAbsoluteWindowsTest.php | 119 - .../RuleInclusionAbsoluteWindowsTest.xml | 11 - .../Ruleset/RuleInclusionTest-include.xml | 10 - .../tests/Core/Ruleset/RuleInclusionTest.php | 297 - .../tests/Core/Ruleset/RuleInclusionTest.xml | 46 - .../Core/Sniffs/AbstractArraySniffTest.inc | 51 - .../Core/Sniffs/AbstractArraySniffTest.php | 290 - .../Sniffs/AbstractArraySniffTestable.php | 65 - .../AnonClassParenthesisOwnerTest.inc | 19 - .../AnonClassParenthesisOwnerTest.php | 144 - .../Core/Tokenizer/BackfillFnTokenTest.inc | 124 - .../Core/Tokenizer/BackfillFnTokenTest.php | 685 - .../BackfillNumericSeparatorTest.inc | 82 - .../BackfillNumericSeparatorTest.php | 380 - .../php_codesniffer/tests/FileList.php | 94 - .../tests/Standards/AbstractSniffUnitTest.php | 450 - .../tests/Standards/AllSniffs.php | 123 - .../php_codesniffer/tests/TestSuite.php | 35 - .../php_codesniffer/tests/TestSuite7.php | 35 - .../php_codesniffer/tests/bootstrap.php | 84 - vendor/symfony/config/CHANGELOG.md | 124 - vendor/symfony/config/ConfigCache.php | 62 - vendor/symfony/config/ConfigCacheFactory.php | 47 - .../config/ConfigCacheFactoryInterface.php | 32 - .../symfony/config/ConfigCacheInterface.php | 49 - .../symfony/config/Definition/ArrayNode.php | 407 - vendor/symfony/config/Definition/BaseNode.php | 591 - .../symfony/config/Definition/BooleanNode.php | 55 - .../Builder/ArrayNodeDefinition.php | 549 - .../Builder/BooleanNodeDefinition.php | 53 - .../Builder/BuilderAwareInterface.php | 25 - .../Definition/Builder/EnumNodeDefinition.php | 56 - .../config/Definition/Builder/ExprBuilder.php | 246 - .../Builder/FloatNodeDefinition.php | 32 - .../Builder/IntegerNodeDefinition.php | 32 - .../Definition/Builder/MergeBuilder.php | 63 - .../config/Definition/Builder/NodeBuilder.php | 219 - .../Definition/Builder/NodeDefinition.php | 383 - .../Builder/NodeParentInterface.php | 21 - .../Builder/NormalizationBuilder.php | 60 - .../Builder/NumericNodeDefinition.php | 73 - .../Builder/ParentNodeDefinitionInterface.php | 51 - .../Builder/ScalarNodeDefinition.php | 32 - .../config/Definition/Builder/TreeBuilder.php | 63 - .../Definition/Builder/ValidationBuilder.php | 44 - .../Builder/VariableNodeDefinition.php | 68 - .../Definition/ConfigurationInterface.php | 27 - .../Definition/Dumper/XmlReferenceDumper.php | 303 - .../Definition/Dumper/YamlReferenceDumper.php | 243 - vendor/symfony/config/Definition/EnumNode.php | 62 - .../Exception/DuplicateKeyException.php | 22 - .../config/Definition/Exception/Exception.php | 21 - .../Exception/ForbiddenOverwriteException.php | 22 - .../InvalidConfigurationException.php | 47 - .../Exception/InvalidDefinitionException.php | 21 - .../Exception/InvalidTypeException.php | 21 - .../Exception/UnsetKeyException.php | 22 - .../symfony/config/Definition/FloatNode.php | 51 - .../symfony/config/Definition/IntegerNode.php | 46 - .../config/Definition/NodeInterface.php | 100 - .../symfony/config/Definition/NumericNode.php | 64 - .../symfony/config/Definition/Processor.php | 95 - .../Definition/PrototypeNodeInterface.php | 25 - .../config/Definition/PrototypedArrayNode.php | 365 - .../symfony/config/Definition/ScalarNode.php | 67 - .../config/Definition/VariableNode.php | 142 - ...LoaderImportCircularReferenceException.php | 27 - .../FileLocatorFileNotFoundException.php | 34 - .../config/Exception/LoaderLoadException.php | 109 - vendor/symfony/config/FileLocator.php | 94 - .../symfony/config/FileLocatorInterface.php | 34 - vendor/symfony/config/LICENSE | 19 - .../config/Loader/DelegatingLoader.php | 50 - vendor/symfony/config/Loader/FileLoader.php | 179 - .../symfony/config/Loader/GlobFileLoader.php | 36 - vendor/symfony/config/Loader/Loader.php | 78 - .../symfony/config/Loader/LoaderInterface.php | 50 - .../symfony/config/Loader/LoaderResolver.php | 68 - .../config/Loader/LoaderResolverInterface.php | 30 - vendor/symfony/config/README.md | 15 - .../Resource/ClassExistenceResource.php | 238 - .../config/Resource/ComposerResource.php | 70 - .../config/Resource/DirectoryResource.php | 106 - .../config/Resource/FileExistenceResource.php | 62 - .../symfony/config/Resource/FileResource.php | 67 - .../symfony/config/Resource/GlobResource.php | 230 - .../Resource/ReflectionClassResource.php | 226 - .../config/Resource/ResourceInterface.php | 33 - .../Resource/SelfCheckingResourceChecker.php | 36 - .../SelfCheckingResourceInterface.php | 30 - .../config/ResourceCheckerConfigCache.php | 188 - .../ResourceCheckerConfigCacheFactory.php | 44 - .../config/ResourceCheckerInterface.php | 45 - .../Util/Exception/InvalidXmlException.php | 21 - .../Util/Exception/XmlParsingException.php | 21 - vendor/symfony/config/Util/XmlUtils.php | 278 - vendor/symfony/config/composer.json | 50 - vendor/symfony/console/Application.php | 1269 -- vendor/symfony/console/CHANGELOG.md | 162 - vendor/symfony/console/Command/Command.php | 660 - .../symfony/console/Command/HelpCommand.php | 83 - .../symfony/console/Command/ListCommand.php | 89 - .../symfony/console/Command/LockableTrait.php | 69 - .../CommandLoader/CommandLoaderInterface.php | 46 - .../CommandLoader/ContainerCommandLoader.php | 63 - .../CommandLoader/FactoryCommandLoader.php | 62 - vendor/symfony/console/ConsoleEvents.php | 47 - .../AddConsoleCommandPass.php | 98 - .../Descriptor/ApplicationDescription.php | 143 - .../symfony/console/Descriptor/Descriptor.php | 107 - .../Descriptor/DescriptorInterface.php | 29 - .../console/Descriptor/JsonDescriptor.php | 156 - .../console/Descriptor/MarkdownDescriptor.php | 182 - .../console/Descriptor/TextDescriptor.php | 342 - .../console/Descriptor/XmlDescriptor.php | 231 - .../console/Event/ConsoleCommandEvent.php | 62 - .../console/Event/ConsoleErrorEvent.php | 58 - vendor/symfony/console/Event/ConsoleEvent.php | 67 - .../console/Event/ConsoleTerminateEvent.php | 55 - .../console/EventListener/ErrorListener.php | 95 - .../Exception/CommandNotFoundException.php | 43 - .../console/Exception/ExceptionInterface.php | 21 - .../Exception/InvalidArgumentException.php | 19 - .../Exception/InvalidOptionException.php | 21 - .../console/Exception/LogicException.php | 19 - .../Exception/MissingInputException.php | 21 - .../Exception/NamespaceNotFoundException.php | 21 - .../console/Exception/RuntimeException.php | 19 - .../console/Formatter/OutputFormatter.php | 277 - .../Formatter/OutputFormatterInterface.php | 70 - .../Formatter/OutputFormatterStyle.php | 196 - .../OutputFormatterStyleInterface.php | 62 - .../Formatter/OutputFormatterStyleStack.php | 110 - .../WrappableOutputFormatterInterface.php | 25 - .../console/Helper/DebugFormatterHelper.php | 122 - .../console/Helper/DescriptorHelper.php | 91 - vendor/symfony/console/Helper/Dumper.php | 64 - .../console/Helper/FormatterHelper.php | 102 - vendor/symfony/console/Helper/Helper.php | 138 - .../console/Helper/HelperInterface.php | 39 - vendor/symfony/console/Helper/HelperSet.php | 107 - .../console/Helper/InputAwareHelper.php | 33 - .../symfony/console/Helper/ProcessHelper.php | 154 - vendor/symfony/console/Helper/ProgressBar.php | 592 - .../console/Helper/ProgressIndicator.php | 266 - .../symfony/console/Helper/QuestionHelper.php | 506 - .../console/Helper/SymfonyQuestionHelper.php | 96 - vendor/symfony/console/Helper/Table.php | 848 - vendor/symfony/console/Helper/TableCell.php | 68 - vendor/symfony/console/Helper/TableRows.php | 32 - .../symfony/console/Helper/TableSeparator.php | 25 - vendor/symfony/console/Helper/TableStyle.php | 458 - vendor/symfony/console/Input/ArgvInput.php | 352 - vendor/symfony/console/Input/ArrayInput.php | 202 - vendor/symfony/console/Input/Input.php | 203 - .../symfony/console/Input/InputArgument.php | 129 - .../console/Input/InputAwareInterface.php | 26 - .../symfony/console/Input/InputDefinition.php | 400 - .../symfony/console/Input/InputInterface.php | 163 - vendor/symfony/console/Input/InputOption.php | 208 - .../Input/StreamableInputInterface.php | 37 - vendor/symfony/console/Input/StringInput.php | 68 - vendor/symfony/console/LICENSE | 19 - .../symfony/console/Logger/ConsoleLogger.php | 126 - .../symfony/console/Output/BufferedOutput.php | 45 - .../symfony/console/Output/ConsoleOutput.php | 159 - .../console/Output/ConsoleOutputInterface.php | 32 - .../console/Output/ConsoleSectionOutput.php | 143 - vendor/symfony/console/Output/NullOutput.php | 123 - vendor/symfony/console/Output/Output.php | 177 - .../console/Output/OutputInterface.php | 114 - .../symfony/console/Output/StreamOutput.php | 125 - .../console/Question/ChoiceQuestion.php | 188 - .../console/Question/ConfirmationQuestion.php | 57 - vendor/symfony/console/Question/Question.php | 289 - vendor/symfony/console/README.md | 20 - .../console/Resources/bin/hiddeninput.exe | Bin 9216 -> 0 bytes vendor/symfony/console/Style/OutputStyle.php | 155 - .../symfony/console/Style/StyleInterface.php | 153 - vendor/symfony/console/Style/SymfonyStyle.php | 504 - vendor/symfony/console/Terminal.php | 174 - .../console/Tester/ApplicationTester.php | 70 - .../symfony/console/Tester/CommandTester.php | 78 - vendor/symfony/console/Tester/TesterTrait.php | 180 - vendor/symfony/console/composer.json | 61 - vendor/symfony/dependency-injection/Alias.php | 167 - .../Argument/AbstractArgument.php | 41 - .../Argument/ArgumentInterface.php | 27 - .../Argument/BoundArgument.php | 62 - .../Argument/IteratorArgument.php | 22 - .../Argument/ReferenceSetArgumentTrait.php | 54 - .../Argument/RewindableGenerator.php | 46 - .../Argument/ServiceClosureArgument.php | 50 - .../Argument/ServiceLocator.php | 50 - .../Argument/ServiceLocatorArgument.php | 44 - .../Argument/TaggedIteratorArgument.php | 73 - .../symfony/dependency-injection/CHANGELOG.md | 271 - .../dependency-injection/ChildDefinition.php | 107 - .../Compiler/AbstractRecursivePass.php | 223 - .../AliasDeprecatedPublicServicesPass.php | 72 - .../Compiler/AnalyzeServiceReferencesPass.php | 184 - .../Compiler/AutoAliasServicePass.php | 41 - .../Compiler/AutowirePass.php | 475 - .../Compiler/AutowireRequiredMethodsPass.php | 100 - .../AutowireRequiredPropertiesPass.php | 64 - .../Compiler/CheckArgumentsValidityPass.php | 87 - .../Compiler/CheckCircularReferencesPass.php | 78 - .../Compiler/CheckDefinitionValidityPass.php | 90 - ...xceptionOnInvalidReferenceBehaviorPass.php | 88 - .../Compiler/CheckReferenceValidityPass.php | 43 - .../Compiler/CheckTypeDeclarationsPass.php | 301 - .../Compiler/Compiler.php | 116 - .../Compiler/CompilerPassInterface.php | 27 - .../Compiler/DecoratorServicePass.php | 119 - .../Compiler/DefinitionErrorExceptionPass.php | 56 - .../Compiler/ExtensionCompilerPass.php | 37 - .../Compiler/InlineServiceDefinitionsPass.php | 217 - .../MergeExtensionConfigurationPass.php | 224 - .../Compiler/PassConfig.php | 271 - .../Compiler/PriorityTaggedServiceTrait.php | 167 - .../Compiler/RegisterEnvVarProcessorsPass.php | 75 - .../Compiler/RegisterReverseContainerPass.php | 66 - .../RegisterServiceSubscribersPass.php | 122 - .../RemoveAbstractDefinitionsPass.php | 33 - .../Compiler/RemovePrivateAliasesPass.php | 39 - .../Compiler/RemoveUnusedDefinitionsPass.php | 90 - .../ReplaceAliasByActualDefinitionPass.php | 94 - .../Compiler/ResolveBindingsPass.php | 239 - .../Compiler/ResolveChildDefinitionsPass.php | 196 - .../Compiler/ResolveClassPass.php | 40 - .../Compiler/ResolveDecoratorStackPass.php | 127 - .../Compiler/ResolveEnvPlaceholdersPass.php | 44 - .../Compiler/ResolveFactoryClassPass.php | 38 - .../Compiler/ResolveHotPathPass.php | 86 - .../ResolveInstanceofConditionalsPass.php | 167 - .../Compiler/ResolveInvalidReferencesPass.php | 136 - .../Compiler/ResolveNamedArgumentsPass.php | 127 - .../Compiler/ResolveNoPreloadPass.php | 100 - .../ResolveParameterPlaceHoldersPass.php | 98 - .../Compiler/ResolvePrivatesPass.php | 40 - .../ResolveReferencesToAliasesPass.php | 81 - .../ResolveServiceSubscribersPass.php | 52 - .../ResolveTaggedIteratorArgumentPass.php | 38 - .../Compiler/ServiceLocatorTagPass.php | 135 - .../Compiler/ServiceReferenceGraph.php | 98 - .../Compiler/ServiceReferenceGraphEdge.php | 99 - .../Compiler/ServiceReferenceGraphNode.php | 118 - .../Compiler/ValidateEnvPlaceholdersPass.php | 107 - .../Config/ContainerParametersResource.php | 50 - .../ContainerParametersResourceChecker.php | 52 - .../dependency-injection/Container.php | 453 - .../ContainerAwareInterface.php | 25 - .../ContainerAwareTrait.php | 30 - .../dependency-injection/ContainerBuilder.php | 1616 -- .../ContainerInterface.php | 96 - .../dependency-injection/Definition.php | 924 - .../dependency-injection/Dumper/Dumper.php | 29 - .../Dumper/DumperInterface.php | 27 - .../Dumper/GraphvizDumper.php | 252 - .../dependency-injection/Dumper/PhpDumper.php | 2184 -- .../dependency-injection/Dumper/Preloader.php | 126 - .../dependency-injection/Dumper/XmlDumper.php | 389 - .../Dumper/YamlDumper.php | 367 - .../EnvVarLoaderInterface.php | 25 - .../dependency-injection/EnvVarProcessor.php | 295 - .../EnvVarProcessorInterface.php | 40 - .../Exception/AutowiringFailedException.php | 72 - .../Exception/BadMethodCallException.php | 19 - .../Exception/EnvNotFoundException.php | 21 - .../Exception/EnvParameterException.php | 25 - .../Exception/ExceptionInterface.php | 24 - .../Exception/InvalidArgumentException.php | 21 - .../InvalidParameterTypeException.php | 30 - .../Exception/LogicException.php | 19 - .../Exception/OutOfBoundsException.php | 19 - .../ParameterCircularReferenceException.php | 34 - .../Exception/ParameterNotFoundException.php | 100 - .../Exception/RuntimeException.php | 21 - .../ServiceCircularReferenceException.php | 41 - .../Exception/ServiceNotFoundException.php | 67 - .../ExpressionLanguage.php | 40 - .../ExpressionLanguageProvider.php | 50 - .../ConfigurationExtensionInterface.php | 30 - .../Extension/Extension.php | 139 - .../Extension/ExtensionInterface.php | 52 - .../Extension/PrependExtensionInterface.php | 22 - vendor/symfony/dependency-injection/LICENSE | 19 - .../Instantiator/InstantiatorInterface.php | 34 - .../Instantiator/RealServiceInstantiator.php | 33 - .../LazyProxy/PhpDumper/DumperInterface.php | 43 - .../LazyProxy/PhpDumper/NullDumper.php | 48 - .../LazyProxy/ProxyHelper.php | 66 - .../Loader/ClosureLoader.php | 48 - .../Configurator/AbstractConfigurator.php | 96 - .../AbstractServiceConfigurator.php | 105 - .../Loader/Configurator/AliasConfigurator.php | 31 - .../Configurator/ContainerConfigurator.php | 167 - .../Configurator/DefaultsConfigurator.php | 69 - .../InlineServiceConfigurator.php | 43 - .../Configurator/InstanceofConfigurator.php | 49 - .../Configurator/ParametersConfigurator.php | 51 - .../Configurator/PrototypeConfigurator.php | 87 - .../Configurator/ReferenceConfigurator.php | 69 - .../Configurator/ServiceConfigurator.php | 66 - .../Configurator/ServicesConfigurator.php | 180 - .../Configurator/Traits/AbstractTrait.php | 28 - .../Configurator/Traits/ArgumentTrait.php | 42 - .../Traits/AutoconfigureTrait.php | 31 - .../Configurator/Traits/AutowireTrait.php | 27 - .../Loader/Configurator/Traits/BindTrait.php | 47 - .../Loader/Configurator/Traits/CallTrait.php | 35 - .../Loader/Configurator/Traits/ClassTrait.php | 27 - .../Configurator/Traits/ConfiguratorTrait.php | 29 - .../Configurator/Traits/DecorateTrait.php | 34 - .../Configurator/Traits/DeprecateTrait.php | 48 - .../Configurator/Traits/FactoryTrait.php | 37 - .../Loader/Configurator/Traits/FileTrait.php | 27 - .../Loader/Configurator/Traits/LazyTrait.php | 32 - .../Configurator/Traits/ParentTrait.php | 46 - .../Configurator/Traits/PropertyTrait.php | 27 - .../Configurator/Traits/PublicTrait.php | 35 - .../Loader/Configurator/Traits/ShareTrait.php | 27 - .../Configurator/Traits/SyntheticTrait.php | 28 - .../Loader/Configurator/Traits/TagTrait.php | 39 - .../Loader/DirectoryLoader.php | 54 - .../Loader/FileLoader.php | 225 - .../Loader/GlobFileLoader.php | 40 - .../Loader/IniFileLoader.php | 97 - .../Loader/PhpFileLoader.php | 80 - .../Loader/XmlFileLoader.php | 718 - .../Loader/YamlFileLoader.php | 935 - .../schema/dic/services/services-1.0.xsd | 330 - .../dependency-injection/Parameter.php | 35 - .../ParameterBag/ContainerBag.php | 51 - .../ParameterBag/ContainerBagInterface.php | 57 - .../EnvPlaceholderParameterBag.php | 154 - .../ParameterBag/FrozenParameterBag.php | 68 - .../ParameterBag/ParameterBag.php | 286 - .../ParameterBag/ParameterBagInterface.php | 108 - vendor/symfony/dependency-injection/README.md | 14 - .../dependency-injection/Reference.php | 47 - .../dependency-injection/ReverseContainer.php | 81 - .../dependency-injection/ServiceLocator.php | 145 - .../TaggedContainerInterface.php | 29 - .../dependency-injection/TypedReference.php | 46 - .../symfony/dependency-injection/Variable.php | 43 - .../dependency-injection/composer.json | 59 - .../symfony/deprecation-contracts/.gitignore | 3 - .../deprecation-contracts/CHANGELOG.md | 5 - vendor/symfony/deprecation-contracts/LICENSE | 19 - .../symfony/deprecation-contracts/README.md | 26 - .../deprecation-contracts/composer.json | 35 - .../deprecation-contracts/function.php | 27 - .../event-dispatcher-contracts/.gitignore | 3 - .../event-dispatcher-contracts/Event.php | 96 - .../EventDispatcherInterface.php | 58 - .../event-dispatcher-contracts/LICENSE | 19 - .../event-dispatcher-contracts/README.md | 9 - .../event-dispatcher-contracts/composer.json | 38 - vendor/symfony/event-dispatcher/CHANGELOG.md | 67 - .../Debug/TraceableEventDispatcher.php | 407 - .../TraceableEventDispatcherInterface.php | 42 - .../Debug/WrappedListener.php | 136 - .../AddEventAliasesPass.php | 42 - .../RegisterListenersPass.php | 178 - vendor/symfony/event-dispatcher/Event.php | 38 - .../event-dispatcher/EventDispatcher.php | 314 - .../EventDispatcherInterface.php | 82 - .../EventSubscriberInterface.php | 49 - .../symfony/event-dispatcher/GenericEvent.php | 175 - .../ImmutableEventDispatcher.php | 102 - vendor/symfony/event-dispatcher/LICENSE | 19 - .../LegacyEventDispatcherProxy.php | 147 - .../event-dispatcher/LegacyEventProxy.php | 62 - vendor/symfony/event-dispatcher/README.md | 15 - vendor/symfony/event-dispatcher/composer.json | 54 - vendor/symfony/filesystem/CHANGELOG.md | 76 - .../Exception/ExceptionInterface.php | 21 - .../Exception/FileNotFoundException.php | 34 - .../filesystem/Exception/IOException.php | 39 - .../Exception/IOExceptionInterface.php | 27 - .../Exception/InvalidArgumentException.php | 19 - vendor/symfony/filesystem/Filesystem.php | 739 - vendor/symfony/filesystem/LICENSE | 19 - vendor/symfony/filesystem/README.md | 13 - vendor/symfony/filesystem/composer.json | 34 - vendor/symfony/finder/CHANGELOG.md | 79 - .../symfony/finder/Comparator/Comparator.php | 91 - .../finder/Comparator/DateComparator.php | 51 - .../finder/Comparator/NumberComparator.php | 79 - .../Exception/AccessDeniedException.php | 19 - .../Exception/DirectoryNotFoundException.php | 19 - vendor/symfony/finder/Finder.php | 797 - vendor/symfony/finder/Gitignore.php | 105 - vendor/symfony/finder/Glob.php | 111 - .../finder/Iterator/CustomFilterIterator.php | 61 - .../Iterator/DateRangeFilterIterator.php | 58 - .../Iterator/DepthRangeFilterIterator.php | 45 - .../ExcludeDirectoryFilterIterator.php | 87 - .../Iterator/FileTypeFilterIterator.php | 53 - .../Iterator/FilecontentFilterIterator.php | 58 - .../Iterator/FilenameFilterIterator.php | 47 - .../Iterator/MultiplePcreFilterIterator.php | 106 - .../finder/Iterator/PathFilterIterator.php | 56 - .../Iterator/RecursiveDirectoryIterator.php | 144 - .../Iterator/SizeRangeFilterIterator.php | 57 - .../finder/Iterator/SortableIterator.php | 101 - vendor/symfony/finder/LICENSE | 19 - vendor/symfony/finder/README.md | 14 - vendor/symfony/finder/SplFileInfo.php | 85 - vendor/symfony/finder/composer.json | 33 - vendor/symfony/options-resolver/CHANGELOG.md | 76 - .../Debug/OptionsResolverIntrospector.php | 120 - .../Exception/AccessException.php | 22 - .../Exception/ExceptionInterface.php | 21 - .../Exception/InvalidArgumentException.php | 21 - .../Exception/InvalidOptionsException.php | 23 - .../Exception/MissingOptionsException.php | 23 - .../Exception/NoConfigurationException.php | 26 - .../Exception/NoSuchOptionException.php | 26 - .../Exception/OptionDefinitionException.php | 21 - .../Exception/UndefinedOptionsException.php | 24 - vendor/symfony/options-resolver/LICENSE | 19 - .../options-resolver/OptionConfigurator.php | 143 - vendor/symfony/options-resolver/Options.php | 22 - .../options-resolver/OptionsResolver.php | 1293 -- vendor/symfony/options-resolver/README.md | 15 - vendor/symfony/options-resolver/composer.json | 35 - vendor/symfony/polyfill-ctype/Ctype.php | 227 - vendor/symfony/polyfill-ctype/LICENSE | 19 - vendor/symfony/polyfill-ctype/README.md | 12 - vendor/symfony/polyfill-ctype/bootstrap.php | 46 - vendor/symfony/polyfill-ctype/composer.json | 38 - vendor/symfony/polyfill-mbstring/LICENSE | 19 - vendor/symfony/polyfill-mbstring/Mbstring.php | 847 - vendor/symfony/polyfill-mbstring/README.md | 13 - .../Resources/unidata/lowerCase.php | 1397 -- .../Resources/unidata/titleCaseRegexp.php | 5 - .../Resources/unidata/upperCase.php | 1414 -- .../symfony/polyfill-mbstring/bootstrap.php | 141 - .../symfony/polyfill-mbstring/composer.json | 38 - vendor/symfony/polyfill-php70/LICENSE | 19 - vendor/symfony/polyfill-php70/Php70.php | 74 - vendor/symfony/polyfill-php70/README.md | 28 - .../Resources/stubs/ArithmeticError.php | 5 - .../Resources/stubs/AssertionError.php | 5 - .../Resources/stubs/DivisionByZeroError.php | 5 - .../polyfill-php70/Resources/stubs/Error.php | 5 - .../Resources/stubs/ParseError.php | 5 - ...SessionUpdateTimestampHandlerInterface.php | 23 - .../Resources/stubs/TypeError.php | 5 - vendor/symfony/polyfill-php70/bootstrap.php | 30 - vendor/symfony/polyfill-php70/composer.json | 37 - vendor/symfony/polyfill-php72/LICENSE | 19 - vendor/symfony/polyfill-php72/Php72.php | 217 - vendor/symfony/polyfill-php72/README.md | 28 - vendor/symfony/polyfill-php72/bootstrap.php | 57 - vendor/symfony/polyfill-php72/composer.json | 35 - vendor/symfony/polyfill-php73/LICENSE | 19 - vendor/symfony/polyfill-php73/Php73.php | 43 - vendor/symfony/polyfill-php73/README.md | 18 - .../Resources/stubs/JsonException.php | 14 - vendor/symfony/polyfill-php73/bootstrap.php | 31 - vendor/symfony/polyfill-php73/composer.json | 36 - vendor/symfony/polyfill-php80/LICENSE | 19 - vendor/symfony/polyfill-php80/Php80.php | 105 - vendor/symfony/polyfill-php80/README.md | 24 - .../Resources/stubs/Stringable.php | 9 - .../Resources/stubs/UnhandledMatchError.php | 5 - .../Resources/stubs/ValueError.php | 5 - vendor/symfony/polyfill-php80/bootstrap.php | 42 - vendor/symfony/polyfill-php80/composer.json | 40 - vendor/symfony/process/CHANGELOG.md | 109 - .../process/Exception/ExceptionInterface.php | 21 - .../Exception/InvalidArgumentException.php | 21 - .../process/Exception/LogicException.php | 21 - .../Exception/ProcessFailedException.php | 54 - .../Exception/ProcessSignaledException.php | 41 - .../Exception/ProcessTimedOutException.php | 69 - .../process/Exception/RuntimeException.php | 21 - vendor/symfony/process/ExecutableFinder.php | 86 - vendor/symfony/process/InputStream.php | 93 - vendor/symfony/process/LICENSE | 19 - .../symfony/process/PhpExecutableFinder.php | 99 - vendor/symfony/process/PhpProcess.php | 72 - .../symfony/process/Pipes/AbstractPipes.php | 178 - .../symfony/process/Pipes/PipesInterface.php | 61 - vendor/symfony/process/Pipes/UnixPipes.php | 153 - vendor/symfony/process/Pipes/WindowsPipes.php | 194 - vendor/symfony/process/Process.php | 1636 -- vendor/symfony/process/ProcessUtils.php | 69 - vendor/symfony/process/README.md | 13 - vendor/symfony/process/composer.json | 34 - vendor/symfony/service-contracts/.gitignore | 3 - vendor/symfony/service-contracts/CHANGELOG.md | 5 - vendor/symfony/service-contracts/LICENSE | 19 - vendor/symfony/service-contracts/README.md | 9 - .../service-contracts/ResetInterface.php | 30 - .../service-contracts/ServiceLocatorTrait.php | 126 - .../ServiceProviderInterface.php | 36 - .../ServiceSubscriberInterface.php | 53 - .../ServiceSubscriberTrait.php | 63 - .../Test/ServiceLocatorTest.php | 92 - .../symfony/service-contracts/composer.json | 38 - vendor/symfony/stopwatch/CHANGELOG.md | 19 - vendor/symfony/stopwatch/LICENSE | 19 - vendor/symfony/stopwatch/README.md | 13 - vendor/symfony/stopwatch/Section.php | 185 - vendor/symfony/stopwatch/Stopwatch.php | 166 - vendor/symfony/stopwatch/StopwatchEvent.php | 246 - vendor/symfony/stopwatch/StopwatchPeriod.php | 76 - vendor/symfony/stopwatch/composer.json | 34 - vendor/theseer/tokenizer/.php_cs.dist | 213 - vendor/theseer/tokenizer/CHANGELOG.md | 63 - vendor/theseer/tokenizer/LICENSE | 30 - vendor/theseer/tokenizer/README.md | 49 - vendor/theseer/tokenizer/composer.json | 27 - vendor/theseer/tokenizer/src/Exception.php | 5 - vendor/theseer/tokenizer/src/NamespaceUri.php | 25 - .../tokenizer/src/NamespaceUriException.php | 5 - vendor/theseer/tokenizer/src/Token.php | 35 - .../theseer/tokenizer/src/TokenCollection.php | 93 - .../src/TokenCollectionException.php | 5 - vendor/theseer/tokenizer/src/Tokenizer.php | 137 - .../theseer/tokenizer/src/XMLSerializer.php | 79 - vendor/webmozart/assert/.editorconfig | 12 - vendor/webmozart/assert/CHANGELOG.md | 175 - vendor/webmozart/assert/LICENSE | 20 - vendor/webmozart/assert/README.md | 283 - vendor/webmozart/assert/composer.json | 38 - vendor/webmozart/assert/psalm.xml | 14 - vendor/webmozart/assert/src/Assert.php | 2048 -- vendor/webmozart/assert/src/Mixin.php | 1971 -- 4428 files changed, 2 insertions(+), 616313 deletions(-) delete mode 100644 vendor/autoload.php delete mode 120000 vendor/bin/pdepend delete mode 120000 vendor/bin/phan delete mode 120000 vendor/bin/phan_client delete mode 120000 vendor/bin/php-cs-fixer delete mode 120000 vendor/bin/phpcbf delete mode 120000 vendor/bin/phpcs delete mode 120000 vendor/bin/phpmd delete mode 120000 vendor/bin/phpstan delete mode 120000 vendor/bin/phpstan.phar delete mode 120000 vendor/bin/phpunit delete mode 120000 vendor/bin/tocheckstyle delete mode 100644 vendor/composer/ClassLoader.php delete mode 100644 vendor/composer/LICENSE delete mode 100644 vendor/composer/autoload_classmap.php delete mode 100644 vendor/composer/autoload_files.php delete mode 100644 vendor/composer/autoload_namespaces.php delete mode 100644 vendor/composer/autoload_psr4.php delete mode 100644 vendor/composer/autoload_real.php delete mode 100644 vendor/composer/autoload_static.php delete mode 100644 vendor/composer/installed.json delete mode 100644 vendor/composer/semver/CHANGELOG.md delete mode 100644 vendor/composer/semver/LICENSE delete mode 100644 vendor/composer/semver/README.md delete mode 100644 vendor/composer/semver/composer.json delete mode 100644 vendor/composer/semver/src/Comparator.php delete mode 100644 vendor/composer/semver/src/Constraint/AbstractConstraint.php delete mode 100644 vendor/composer/semver/src/Constraint/Constraint.php delete mode 100644 vendor/composer/semver/src/Constraint/ConstraintInterface.php delete mode 100644 vendor/composer/semver/src/Constraint/EmptyConstraint.php delete mode 100644 vendor/composer/semver/src/Constraint/MultiConstraint.php delete mode 100644 vendor/composer/semver/src/Semver.php delete mode 100644 vendor/composer/semver/src/VersionParser.php delete mode 100644 vendor/composer/xdebug-handler/CHANGELOG.md delete mode 100644 vendor/composer/xdebug-handler/LICENSE delete mode 100644 vendor/composer/xdebug-handler/README.md delete mode 100644 vendor/composer/xdebug-handler/composer.json delete mode 100644 vendor/composer/xdebug-handler/src/PhpConfig.php delete mode 100644 vendor/composer/xdebug-handler/src/Process.php delete mode 100644 vendor/composer/xdebug-handler/src/Status.php delete mode 100644 vendor/composer/xdebug-handler/src/XdebugHandler.php delete mode 100644 vendor/doctrine/annotations/.doctrine-project.json delete mode 100644 vendor/doctrine/annotations/CHANGELOG.md delete mode 100644 vendor/doctrine/annotations/LICENSE delete mode 100644 vendor/doctrine/annotations/README.md delete mode 100644 vendor/doctrine/annotations/composer.json delete mode 100644 vendor/doctrine/annotations/docs/en/annotations.rst delete mode 100644 vendor/doctrine/annotations/docs/en/custom.rst delete mode 100644 vendor/doctrine/annotations/docs/en/index.rst delete mode 100644 vendor/doctrine/annotations/docs/en/sidebar.rst delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php delete mode 100644 vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php delete mode 100644 vendor/doctrine/annotations/phpbench.json.dist delete mode 100644 vendor/doctrine/annotations/phpstan.neon delete mode 100644 vendor/doctrine/instantiator/.doctrine-project.json delete mode 100644 vendor/doctrine/instantiator/.github/FUNDING.yml delete mode 100644 vendor/doctrine/instantiator/CONTRIBUTING.md delete mode 100644 vendor/doctrine/instantiator/LICENSE delete mode 100644 vendor/doctrine/instantiator/README.md delete mode 100644 vendor/doctrine/instantiator/composer.json delete mode 100644 vendor/doctrine/instantiator/docs/en/index.rst delete mode 100644 vendor/doctrine/instantiator/docs/en/sidebar.rst delete mode 100644 vendor/doctrine/instantiator/phpbench.json delete mode 100644 vendor/doctrine/instantiator/phpcs.xml.dist delete mode 100644 vendor/doctrine/instantiator/phpstan.neon.dist delete mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php delete mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php delete mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php delete mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php delete mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php delete mode 100644 vendor/doctrine/lexer/LICENSE delete mode 100644 vendor/doctrine/lexer/README.md delete mode 100644 vendor/doctrine/lexer/composer.json delete mode 100644 vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/.travis.yml delete mode 100644 vendor/felixfbecker/advanced-json-rpc/LICENSE delete mode 100644 vendor/felixfbecker/advanced-json-rpc/composer.json delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Error.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/ErrorResponse.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Message.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Notification.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Request.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/Response.php delete mode 100644 vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/CHANGELOG.md delete mode 100644 vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md delete mode 100644 vendor/friendsofphp/php-cs-fixer/LICENSE delete mode 100644 vendor/friendsofphp/php-cs-fixer/README.rst delete mode 100644 vendor/friendsofphp/php-cs-fixer/UPGRADE.md delete mode 100644 vendor/friendsofphp/php-cs-fixer/ci-integration.sh delete mode 100644 vendor/friendsofphp/php-cs-fixer/composer.json delete mode 100644 vendor/friendsofphp/php-cs-fixer/doc/COOKBOOK-FIXERS.md delete mode 100644 vendor/friendsofphp/php-cs-fixer/doc/checkstyle.xsd delete mode 100644 vendor/friendsofphp/php-cs-fixer/doc/junit-10.xsd delete mode 100644 vendor/friendsofphp/php-cs-fixer/doc/schema.json delete mode 100644 vendor/friendsofphp/php-cs-fixer/doc/xml.xsd delete mode 100755 vendor/friendsofphp/php-cs-fixer/php-cs-fixer delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/AbstractAlignFixerHelper.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/AbstractFopenFlagFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/AbstractLinesBeforeNamespaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/AbstractPsrAutoloadingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Cache/CacheInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Cache/DirectoryInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandlerInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Cache/SignatureInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Config.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidConfigurationException.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidForEnvFixerConfigurationException.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/RequiredFixerConfigurationException.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Application.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeNameNotFoundException.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Command/HelpCommand.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Command/ReadmeCommand.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Output/NullOutput.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutput.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutputInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionCheckerInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Differ/DifferInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Differ/NullDiffer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Differ/SebastianBergmannDiffer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Differ/SebastianBergmannShortDiffer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Differ/UnifiedDiffer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/DocBlock/Tag.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Error/Error.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Event/Event.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FileReader.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Finder.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoMultilineWhitespaceAroundDoubleArrowFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoTrailingCommaInSinglelineArrayFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrailingCommaInMultilineArrayFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrimArraySpacesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/WhitespaceAfterCommaInArrayFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/EncodingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/Psr0Fixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/Psr4Fixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseConstantsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionCasingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionTypeDeclarationCasingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/LowercaseCastFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ModernizeTypesCastingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoShortBoolCastFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoUnsetCastFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ShortScalarCastFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalStaticAccessFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/MethodSeparationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoNullPropertyInitializationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfStaticAccessorFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassUsage/DateTimeImmutableFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HashToSlashCommentFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoTrailingWhitespaceInCommentFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurationDefinitionFixerInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ElseifFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/IncludeFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoSuperfluousElseifFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoTrailingCommaInListCallFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUselessElseFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSemicolonToColonFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSpaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/DefinedFixerInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FixerInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionTypehintSpaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/SingleLineThrowFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/StaticLambdaFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoLeadingImportSlashFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleLineAfterImportsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DirConstantFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/IsNullFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SilencedDeprecationErrorFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLineAfterNamespaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoBlankLinesBeforeNamespaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoLeadingNamespaceWhitespaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/SingleBlankLineBeforeNamespaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Naming/NoHomoglyphNamesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/AlignDoubleArrowFixerHelper.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/AlignEqualsFixerHelper.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LogicalOperatorsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSpaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSuccessorSpaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/PreIncrementFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeIncrementFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeNotEqualsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/LinebreakAfterOpeningTagFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoShortEchoTagFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitOrderedCoversFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoBlankLinesAfterPhpdocFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocLineSpanFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoPackageFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSingleLineVarSpacingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/BlankLineBeforeReturnFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/NoUselessReturnFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/ReturnAssignmentFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoEmptyStatementFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoMultilineWhitespaceBeforeSemicolonsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoSinglelineWhitespaceBeforeSemicolonsFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SemicolonAfterInstructionFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictComparisonFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoBinaryStringFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLineEndingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/ArrayIndentationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/CompactNullableTypehintFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/LineEndingFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraConsecutiveBlankLinesFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesInsideParenthesisFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SingleBlankLineAtEofFixer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/WhitespacesAwareFixerInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOptionInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverRootless.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/InvalidOptionsForEnvException.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSampleInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSampleInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinitionInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSampleInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificationInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/FixerNameValidator.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Linter/LinterInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Linter/LintingException.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Linter/LintingResultInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Linter/UnavailableLinterException.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/PharChecker.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/PharCheckerInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Preg.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/PregException.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Report/CheckstyleReporter.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Report/GitlabReporter.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Report/JsonReporter.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Report/JunitReporter.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Report/ReportSummary.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Report/ReporterFactory.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Report/ReporterInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Report/TextReporter.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Report/XmlReporter.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/RuleSet.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/RuleSetInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Test/AbstractFixerTestCase.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Test/AbstractIntegrationTestCase.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Test/AccessibleObject.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Test/IntegrationCase.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ArgumentsAnalyzer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Generator/NamespacedStringTokenGenerator.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Resolver/TypeShortNameResolver.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ArrayTypehintTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceClassInstantiationTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ClassConstantTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/CurlyBraceTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ImportTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamespaceOperatorTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NullableTypeTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ReturnRefTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/SquareBraceTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeAlternationTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeColonTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/UseTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/WhitespacyCommentTransformer.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TransformerInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformers.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Utils.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractFixerTestCase.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationCaseFactory.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationTestCase.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/tests/Test/Assert/AssertTokensTrait.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCase.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactory.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactoryInterface.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/tests/Test/InternalIntegrationCaseFactory.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/tests/Test/IsIdenticalConstraint.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/tests/TestCase.php delete mode 100644 vendor/johnkary/phpunit-speedtrap/.gitignore delete mode 100644 vendor/johnkary/phpunit-speedtrap/.travis.yml delete mode 100644 vendor/johnkary/phpunit-speedtrap/CHANGELOG.md delete mode 100644 vendor/johnkary/phpunit-speedtrap/LICENSE delete mode 100644 vendor/johnkary/phpunit-speedtrap/README.md delete mode 100644 vendor/johnkary/phpunit-speedtrap/UPGRADE.md delete mode 100644 vendor/johnkary/phpunit-speedtrap/composer.json delete mode 100644 vendor/johnkary/phpunit-speedtrap/phpunit.xml.dist delete mode 100644 vendor/johnkary/phpunit-speedtrap/src/SpeedTrapListener.php delete mode 100644 vendor/johnkary/phpunit-speedtrap/tests/ExceptionalTest.php delete mode 100644 vendor/johnkary/phpunit-speedtrap/tests/SomeSlowTest.php delete mode 100644 vendor/microsoft/tolerant-php-parser/LICENSE.txt delete mode 100644 vendor/microsoft/tolerant-php-parser/ThirdPartyNotices.txt delete mode 100644 vendor/microsoft/tolerant-php-parser/composer.json delete mode 100644 vendor/microsoft/tolerant-php-parser/phpstan.neon delete mode 100644 vendor/microsoft/tolerant-php-parser/src/CharacterCodes.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/ClassLike.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Diagnostic.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/DiagnosticKind.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/DiagnosticsProvider.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/FilePositionMap.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/FunctionLike.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/LineCharacterPosition.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/MissingToken.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/NamespacedNameInterface.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/NamespacedNameTrait.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/AnonymousFunctionUseClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/ArrayElement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/CaseStatementNode.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/CatchClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/ClassBaseClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/ClassConstDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/ClassInterfaceClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/ClassMembersNode.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/ConstElement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DeclareDirective.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DefaultStatementNode.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ArgumentExpressionList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ArrayElementList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ConstElementList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ExpressionList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ListExpressionList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/NamespaceUseClauseList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/NamespaceUseGroupClauseList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ParameterDeclarationList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/QualifiedNameList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/QualifiedNameParts.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/StaticVariableNameList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/TraitSelectOrAliasClauseList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/UseVariableNameList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/VariableNameList.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/ElseClauseNode.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/ElseIfClauseNode.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/AnonymousFunctionCreationExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/ArgumentExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/ArrayCreationExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/AssignmentExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/BinaryExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/BracedExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/CallExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/CastExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/CloneExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/EchoExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/EmptyIntrinsicExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/ErrorControlExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/EvalIntrinsicExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/ExitIntrinsicExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/IssetIntrinsicExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/ListIntrinsicExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/MemberAccessExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/ObjectCreationExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/ParenthesizedExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/PostfixUpdateExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/PrefixUpdateExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/PrintIntrinsicExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/ScopedPropertyAccessExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/ScriptInclusionExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/SubscriptExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/TernaryExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnaryExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnaryOpExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnsetIntrinsicExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/Variable.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Expression/YieldExpression.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/FinallyClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/ForeachKey.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/ForeachValue.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/FunctionBody.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/FunctionHeader.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/FunctionReturnType.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/FunctionUseClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/InterfaceBaseClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/InterfaceMembers.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/MethodDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/MissingMemberDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/NamespaceAliasingClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/NamespaceUseClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/NamespaceUseGroupClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/NumericLiteral.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Parameter.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/PropertyDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/QualifiedName.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/RelativeSpecifier.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/ReservedWord.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/SourceFileNode.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/BreakOrContinueStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/ClassDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/CompoundStatementNode.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/ConstDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/DeclareStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/DoStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/EmptyStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/ExpressionStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/ForStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/ForeachStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/FunctionDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/FunctionStaticDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/GlobalDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/GotoStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/IfStatementNode.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/InlineHtml.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/InterfaceDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamedLabelStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamespaceDefinition.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamespaceUseDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/ReturnStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/SwitchStatementNode.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/ThrowStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/TraitDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/TryStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/Statement/WhileStatement.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/StatementNode.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/StaticVariableDeclaration.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/StringLiteral.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/TraitMembers.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/TraitSelectOrAliasClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/TraitUseClause.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Node/UseVariableName.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/ParseContext.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Parser.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/PhpTokenizer.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/PositionUtilities.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Range.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/ResolvedName.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/SkippedToken.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/TextEdit.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/Token.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/TokenKind.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/TokenStreamProviderFactory.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/TokenStreamProviderInterface.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/TokenStringMaps.php delete mode 100644 vendor/microsoft/tolerant-php-parser/src/bootstrap.php delete mode 100644 vendor/myclabs/deep-copy/.github/FUNDING.yml delete mode 100644 vendor/myclabs/deep-copy/LICENSE delete mode 100644 vendor/myclabs/deep-copy/README.md delete mode 100644 vendor/myclabs/deep-copy/composer.json delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php delete mode 100644 vendor/netresearch/jsonmapper/LICENSE delete mode 100644 vendor/netresearch/jsonmapper/composer.json delete mode 100644 vendor/netresearch/jsonmapper/contributing.rst delete mode 100644 vendor/netresearch/jsonmapper/src/JsonMapper.php delete mode 100644 vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php delete mode 100644 vendor/paragonie/random_compat/LICENSE delete mode 100755 vendor/paragonie/random_compat/build-phar.sh delete mode 100644 vendor/paragonie/random_compat/composer.json delete mode 100644 vendor/paragonie/random_compat/dist/random_compat.phar.pubkey delete mode 100644 vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc delete mode 100644 vendor/paragonie/random_compat/lib/random.php delete mode 100644 vendor/paragonie/random_compat/other/build_phar.php delete mode 100644 vendor/paragonie/random_compat/psalm-autoload.php delete mode 100644 vendor/paragonie/random_compat/psalm.xml delete mode 100644 vendor/pdepend/pdepend/CHANGELOG.md delete mode 100644 vendor/pdepend/pdepend/LICENSE delete mode 100644 vendor/pdepend/pdepend/README.md delete mode 100644 vendor/pdepend/pdepend/build.properties delete mode 100644 vendor/pdepend/pdepend/composer.json delete mode 100644 vendor/pdepend/pdepend/phpcs.xml.dist delete mode 100755 vendor/pdepend/pdepend/src/bin/pdepend delete mode 100644 vendor/pdepend/pdepend/src/bin/pdepend.bat delete mode 100755 vendor/pdepend/pdepend/src/bin/pdepend.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Application.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/DbusUI/ResultPrinter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Compiler/ProcessListenerPass.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Configuration.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Extension.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/ExtensionManager.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/PdependExtension.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/TreeBuilder.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Engine.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Input/CompositeFilter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Input/ExcludePathFilter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Input/ExtensionFilter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Input/Filter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Input/Iterator.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AbstractAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AbstractCachingAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AggregateAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/ClassDependencyAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/ClassLevelAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/CodeRankStrategyI.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/InheritanceStrategy.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/MethodStrategy.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/PropertyStrategy.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/StrategyFactory.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CohesionAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CouplingAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CrapIndexAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CyclomaticComplexityAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/DependencyAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/HalsteadAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/HierarchyAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/InheritanceAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/MaintainabilityIndexAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NPathComplexityAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NodeCountAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NodeLocAnalyzer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerCacheAware.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerFactory.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerFilterAware.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerIterator.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerListener.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerNodeAware.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerProjectAware.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/ProcessListener.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/CodeAwareGenerator.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/Dependencies/Xml.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/FileAwareGenerator.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/Chart.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/Xml.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/chart.svg delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/NoLogOutputException.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/Overview/Pyramid.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/Overview/pyramid.svg delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/ReportGenerator.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/ReportGeneratorFactory.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Report/Summary/Xml.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAllocationExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAnonymousClass.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArguments.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArray.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArrayElement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArrayIndexExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifact.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/ArtifactFilter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/CollectionArtifactFilter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/NullArtifactFilter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/PackageArtifactFilter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAssignmentExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBooleanAndExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBooleanOrExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBreakStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCallable.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCastExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCatchStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClass.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassFqnPostfix.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceRecursiveInheritanceException.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceReference.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceReferenceIterator.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassReference.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCloneExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClosure.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTComment.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompilationUnit.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompilationUnitNotFoundException.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompoundExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompoundVariable.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConditionalExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstant.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantDeclarator.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantDefinition.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantPostfix.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTContinueStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTDeclareStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTDoWhileStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTEchoStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTElseIfStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTEvalExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTExitExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFieldDeclaration.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFinallyStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForInit.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForUpdate.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForeachStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFormalParameter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFormalParameters.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFunction.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFunctionPostfix.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTGlobalStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTGotoStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTHeredoc.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIdentifier.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIfStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIncludeExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIndexExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInstanceOfExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInterface.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInvocation.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIssetExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLabelStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTListExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLiteral.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalAndExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalOrExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalXorExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMemberPrimaryPrefix.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMethod.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMethodPostfix.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTNamespace.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTNode.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTParameter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTParentReference.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPostfixExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPreDecrementExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPreIncrementExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPrintExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTProperty.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPropertyPostfix.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTRequireExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTReturnStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScalarType.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScope.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScopeStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSelfReference.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTShiftLeftExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTShiftRightExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStaticReference.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStaticVariableDeclaration.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTString.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStringIndexExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSwitchLabel.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSwitchStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTThrowStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTrait.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptation.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptationAlias.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptationPrecedence.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitMethodCollisionException.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitReference.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitUseStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTryStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTType.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeArray.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeCallable.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeIterable.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTUnaryExpression.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTUnsetStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTValue.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariable.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariableDeclarator.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariableVariable.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTWhileStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTYieldStatement.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTArtifact.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTCallable.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTClassOrInterface.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTNode.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTType.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/State.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/ASTVisitListener.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/ASTVisitor.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/AbstractASTVisitListener.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/AbstractASTVisitor.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/Builder.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/BuilderContext.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/BuilderContext/GlobalBuilderContext.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPBuilder.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserGeneric.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion53.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion54.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion55.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion56.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion70.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion71.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion72.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion73.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion74.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPTokenizerInternal.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/InvalidStateException.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/MissingValueException.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/NoActiveScopeException.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/ParserException.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/SymbolTable.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenException.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenStack.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenStreamEndException.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/UnexpectedTokenException.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/FullTokenizer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Token.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Tokenizer.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Tokens.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/Command.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/ResultPrinter.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/Runner.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/CacheDriver.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/CacheFactory.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/File/FileCacheDirectory.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/File/FileCacheGarbageCollector.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/FileCacheDriver.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/MemoryCacheDriver.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Configuration.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/ConfigurationInstance.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/CloverReport.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/Factory.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/Report.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/FileUtil.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/IdBuilder.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/ImageConvert.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Log.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/MathUtil.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Type.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Utf8Util.php delete mode 100644 vendor/pdepend/pdepend/src/main/php/PDepend/Util/Workarounds.php delete mode 100644 vendor/pdepend/pdepend/src/main/resources/schema/configuration.xsd delete mode 100644 vendor/pdepend/pdepend/src/main/resources/services.xml delete mode 100755 vendor/phan/phan/.phan/bin/mkfilelist delete mode 100755 vendor/phan/phan/.phan/bin/phan delete mode 100644 vendor/phan/phan/.phan/config.php delete mode 100644 vendor/phan/phan/.phan/internal_stubs/README.md delete mode 100644 vendor/phan/phan/.phan/internal_stubs/ast.phan_php delete mode 100644 vendor/phan/phan/.phan/internal_stubs/ctype.phan_php delete mode 100644 vendor/phan/phan/.phan/internal_stubs/igbinary.phan_php delete mode 100644 vendor/phan/phan/.phan/internal_stubs/pcntl.phan_php delete mode 100644 vendor/phan/phan/.phan/internal_stubs/posix.phan_php delete mode 100644 vendor/phan/phan/.phan/internal_stubs/readline.phan_php delete mode 100644 vendor/phan/phan/.phan/internal_stubs/sysvmsg.phan_php delete mode 100644 vendor/phan/phan/.phan/internal_stubs/sysvsem.phan_php delete mode 100644 vendor/phan/phan/.phan/internal_stubs/sysvshm.phan_php delete mode 100644 vendor/phan/phan/.phan/internal_stubs/xdebug.phan_php delete mode 100644 vendor/phan/phan/.phan/plugins/AlwaysReturnPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/DemoPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/DollarDollarPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/DuplicateArrayKeyPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/DuplicateExpressionPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/FFIAnalysisPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/HasPHPDocPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/InvalidVariableIssetPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/InvokePHPNativeSyntaxCheckPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/NoAssertPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/NonBoolBranchPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/NonBoolInLogicalArithPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/NotFullyQualifiedUsagePlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/NotFullyQualifiedUsagePlugin/fixers.php delete mode 100644 vendor/phan/phan/.phan/plugins/NumericalComparisonPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/PHPUnitAssertionPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/PHPUnitNotDeadCodePlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/PhanSelfCheckPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/PossiblyStaticMethodPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/PregRegexCheckerPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/PrintfCheckerPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/README.md delete mode 100644 vendor/phan/phan/.phan/plugins/SleepCheckerPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/SuspiciousParamOrderPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/UnknownElementTypePlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/UnreachableCodePlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/UnusedSuppressionPlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/UseReturnValuePlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/WhitespacePlugin.php delete mode 100644 vendor/phan/phan/.phan/plugins/WhitespacePlugin/fixers.php delete mode 100644 vendor/phan/phan/.phan/stubs/README.md delete mode 100644 vendor/phan/phan/CODE_OF_CONDUCT.md delete mode 100644 vendor/phan/phan/DCO.txt delete mode 100644 vendor/phan/phan/LICENSE delete mode 100644 vendor/phan/phan/LICENSE.LANGUAGE_SERVER delete mode 100644 vendor/phan/phan/LICENSE.PHPSTORM_STUBS delete mode 100644 vendor/phan/phan/LICENSE.PHP_PARSER delete mode 100644 vendor/phan/phan/MAINTAINERS.md delete mode 100644 vendor/phan/phan/NEWS.md delete mode 100644 vendor/phan/phan/README.md delete mode 100644 vendor/phan/phan/composer.json delete mode 100644 vendor/phan/phan/composer.lock delete mode 100755 vendor/phan/phan/phan delete mode 100755 vendor/phan/phan/phan_client delete mode 100755 vendor/phan/phan/prep delete mode 100644 vendor/phan/phan/src/Phan/AST/ASTHasher.php delete mode 100644 vendor/phan/phan/src/Phan/AST/ASTReverter.php delete mode 100644 vendor/phan/phan/src/Phan/AST/ASTSimplifier.php delete mode 100644 vendor/phan/phan/src/Phan/AST/AnalysisVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/AST/ContextNode.php delete mode 100644 vendor/phan/phan/src/Phan/AST/Parser.php delete mode 100644 vendor/phan/phan/src/Phan/AST/PhanAnnotationAdder.php delete mode 100644 vendor/phan/phan/src/Phan/AST/TolerantASTConverter/InvalidNodeException.php delete mode 100644 vendor/phan/phan/src/Phan/AST/TolerantASTConverter/NodeDumper.php delete mode 100644 vendor/phan/phan/src/Phan/AST/TolerantASTConverter/NodeUtils.php delete mode 100644 vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ParseException.php delete mode 100644 vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ParseResult.php delete mode 100644 vendor/phan/phan/src/Phan/AST/TolerantASTConverter/StringUtil.php delete mode 100644 vendor/phan/phan/src/Phan/AST/TolerantASTConverter/TolerantASTConverter.php delete mode 100644 vendor/phan/phan/src/Phan/AST/TolerantASTConverter/TolerantASTConverterWithNodeMapping.php delete mode 100644 vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ast_shim.php delete mode 100644 vendor/phan/phan/src/Phan/AST/UnionTypeVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/AST/Visitor/Element.php delete mode 100644 vendor/phan/phan/src/Phan/AST/Visitor/FlagVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/AST/Visitor/FlagVisitorImplementation.php delete mode 100644 vendor/phan/phan/src/Phan/AST/Visitor/KindVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/AST/Visitor/KindVisitorImplementation.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/AbstractMethodAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/Analyzable.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ArgumentType.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/AssignOperatorAnalysisVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/AssignOperatorFlagVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/AssignmentVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/BinaryOperatorFlagVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/BlockExitStatusChecker.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ClassInheritanceAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/CompositionAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ConditionVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/BinaryCondition.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/ComparisonCondition.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/HasTypeCondition.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/IdenticalCondition.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotEqualsCondition.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotHasTypeCondition.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotIdenticalCondition.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ConditionVisitorInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ConditionVisitorUtil.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ContextMergeVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/DuplicateClassAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/DuplicateFunctionAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/GotoAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/NegatedConditionVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ParameterTypesAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ParentConstructorCalledAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/PostOrderAnalysisVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/PreOrderAnalysisVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/PropertyTypesAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ReachabilityChecker.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ReferenceCountsAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/RegexAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ScopeVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Analysis/ThrowsTypesAnalyzer.php delete mode 100644 vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Bootstrap.php delete mode 100644 vendor/phan/phan/src/Phan/CLI.php delete mode 100644 vendor/phan/phan/src/Phan/CodeBase.php delete mode 100644 vendor/phan/phan/src/Phan/CodeBase/ClassMap.php delete mode 100644 vendor/phan/phan/src/Phan/CodeBase/UndoTracker.php delete mode 100644 vendor/phan/phan/src/Phan/Config.php delete mode 100644 vendor/phan/phan/src/Phan/Config/InitializedSettings.php delete mode 100644 vendor/phan/phan/src/Phan/Config/Initializer.php delete mode 100644 vendor/phan/phan/src/Phan/Daemon.php delete mode 100644 vendor/phan/phan/src/Phan/Daemon/ExitException.php delete mode 100644 vendor/phan/phan/src/Phan/Daemon/Request.php delete mode 100644 vendor/phan/phan/src/Phan/Daemon/Transport/CapturerResponder.php delete mode 100644 vendor/phan/phan/src/Phan/Daemon/Transport/Responder.php delete mode 100644 vendor/phan/phan/src/Phan/Daemon/Transport/StreamResponder.php delete mode 100644 vendor/phan/phan/src/Phan/Debug.php delete mode 100644 vendor/phan/phan/src/Phan/Debug/Breakpoint.php delete mode 100644 vendor/phan/phan/src/Phan/Debug/DebugUnionType.php delete mode 100644 vendor/phan/phan/src/Phan/Debug/Frame.php delete mode 100644 vendor/phan/phan/src/Phan/Exception/CodeBaseException.php delete mode 100644 vendor/phan/phan/src/Phan/Exception/EmptyFQSENException.php delete mode 100644 vendor/phan/phan/src/Phan/Exception/FQSENException.php delete mode 100644 vendor/phan/phan/src/Phan/Exception/InvalidFQSENException.php delete mode 100644 vendor/phan/phan/src/Phan/Exception/IssueException.php delete mode 100644 vendor/phan/phan/src/Phan/Exception/NodeException.php delete mode 100644 vendor/phan/phan/src/Phan/Exception/RecursionDepthException.php delete mode 100644 vendor/phan/phan/src/Phan/Exception/UnanalyzableException.php delete mode 100644 vendor/phan/phan/src/Phan/Exception/UsageException.php delete mode 100644 vendor/phan/phan/src/Phan/ForkPool.php delete mode 100644 vendor/phan/phan/src/Phan/Issue.php delete mode 100644 vendor/phan/phan/src/Phan/IssueFixSuggester.php delete mode 100644 vendor/phan/phan/src/Phan/IssueInstance.php delete mode 100644 vendor/phan/phan/src/Phan/Language/AnnotatedUnionType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Context.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/AddressableElement.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/AddressableElementInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/ClassAliasRecord.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/ClassConstant.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/ClassElement.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Clazz.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/ClosedScopeElement.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Comment.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Comment/Assertion.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Comment/Builder.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Comment/Method.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Comment/NullComment.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Comment/Parameter.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Comment/Property.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Comment/ReturnComment.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/ConstantInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/ConstantTrait.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/ElementFutureUnionType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Flags.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Func.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/FunctionFactory.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/FunctionInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/FunctionTrait.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/GlobalConstant.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/MarkupDescription.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Method.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Parameter.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/PassByReferenceVariable.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Property.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/TraitAdaptations.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/TraitAliasSource.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/TypedElement.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/TypedElementInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/UnaddressableTypedElement.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/Variable.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Element/VariadicParameter.php delete mode 100644 vendor/phan/phan/src/Phan/Language/ElementContext.php delete mode 100644 vendor/phan/phan/src/Phan/Language/EmptyUnionType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/AbstractFQSEN.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/Alternatives.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassConstantName.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassElement.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassName.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedConstantName.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedFunctionLikeName.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedFunctionName.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedGlobalConstantName.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedGlobalStructuralElement.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedMethodName.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedPropertyName.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FileRef.php delete mode 100644 vendor/phan/phan/src/Phan/Language/FutureUnionType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/ClassDocumentationMap.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/ConstantDocumentationMap.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/DynamicPropertyMap.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/FunctionDocumentationMap.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php70_delta.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php71_delta.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php72_delta.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php73_delta.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php74_delta.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php80_delta.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/PropertyDocumentationMap.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Internal/PropertyMap.php delete mode 100644 vendor/phan/phan/src/Phan/Language/NamespaceMapEntry.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Scope.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Scope/BranchScope.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Scope/ClassScope.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Scope/ClosedScope.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Scope/ClosureScope.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Scope/FunctionLikeScope.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Scope/GlobalScope.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Scope/PropertyScope.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Scope/TemplateScope.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/ArrayShapeType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/ArrayType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/BoolType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/CallableDeclarationType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/CallableInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/CallableStringType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/CallableType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/ClassStringType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/ClosureDeclarationParameter.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/ClosureDeclarationType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/ClosureType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/FalseType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/FloatType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/FunctionLikeDeclarationType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/GenericArrayInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/GenericArrayTemplateKeyType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/GenericArrayType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/GenericIterableType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/GenericMultiArrayType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/IntType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/IterableType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/LiteralIntType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/LiteralStringType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/LiteralTypeInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/MixedType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/MultiType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/NativeType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/NullType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/ObjectType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/ResourceType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/ScalarRawType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/ScalarType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/SelfType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/StaticOrSelfType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/StaticType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/StringType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/TemplateType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/TrueType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/Type/VoidType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/UnionType.php delete mode 100644 vendor/phan/phan/src/Phan/Language/UnionTypeBuilder.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Client/TextDocument.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/ClientHandler.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/CompletionRequest.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/CompletionResolver.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/DefinitionResolver.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/FileMapping.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/GoToDefinitionRequest.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/IdGenerator.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/LanguageClient.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/LanguageServer.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Logger.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/NodeInfoRequest.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/ClientCapabilities.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionContext.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionItem.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionItemKind.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionList.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionOptions.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionTriggerKind.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/Diagnostic.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/DiagnosticSeverity.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/FileChangeType.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/FileEvent.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/Hover.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/InitializeResult.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/Location.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/MarkupContent.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/Message.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/Position.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/Range.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/SaveOptions.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/ServerCapabilities.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentContentChangeEvent.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentIdentifier.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentItem.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentSyncKind.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentSyncOptions.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Protocol/VersionedTextDocumentIdentifier.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/ProtocolReader.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/ProtocolStreamReader.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/ProtocolStreamWriter.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/ProtocolWriter.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Server/TextDocument.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Server/Workspace.php delete mode 100644 vendor/phan/phan/src/Phan/LanguageServer/Utils.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Cache.php delete mode 100644 vendor/phan/phan/src/Phan/Library/ConversionSpec.php delete mode 100644 vendor/phan/phan/src/Phan/Library/DiskCache.php delete mode 100644 vendor/phan/phan/src/Phan/Library/FileCache.php delete mode 100644 vendor/phan/phan/src/Phan/Library/FileCacheEntry.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Hasher.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Hasher/Consistent.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Hasher/Sequential.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Map.php delete mode 100644 vendor/phan/phan/src/Phan/Library/None.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Option.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Paths.php delete mode 100644 vendor/phan/phan/src/Phan/Library/RAII.php delete mode 100644 vendor/phan/phan/src/Phan/Library/RegexKeyExtractor.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Set.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Some.php delete mode 100644 vendor/phan/phan/src/Phan/Library/StderrLogger.php delete mode 100644 vendor/phan/phan/src/Phan/Library/StringUtil.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Tuple.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Tuple1.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Tuple2.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Tuple3.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Tuple4.php delete mode 100644 vendor/phan/phan/src/Phan/Library/Tuple5.php delete mode 100644 vendor/phan/phan/src/Phan/Memoize.php delete mode 100644 vendor/phan/phan/src/Phan/Ordering.php delete mode 100644 vendor/phan/phan/src/Phan/Output/BufferedPrinterInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Collector/BufferingCollector.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Collector/ParallelChildCollector.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Collector/ParallelParentCollector.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Colorizing.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Filter/AnyFilter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Filter/CategoryIssueFilter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Filter/ChainedIssueFilter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Filter/FileIssueFilter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Filter/MinimumSeverityFilter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/IgnoredFilesFilterInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Output/IssueCollectorInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Output/IssueFilterInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Output/IssuePrinterInterface.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Printer/CSVPrinter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Printer/CheckstylePrinter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Printer/CodeClimatePrinter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Printer/FilteringPrinter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Printer/JSONPrinter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Printer/PlainTextPrinter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/Printer/PylintPrinter.php delete mode 100644 vendor/phan/phan/src/Phan/Output/PrinterFactory.php delete mode 100644 vendor/phan/phan/src/Phan/Parse/ParseVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Phan.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/ClosuresForKind.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/ConfigPluginSet.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/ArrayReturnTypeOverridePlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/BuiltinSuppressionPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/CallableParamPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/ClosureReturnTypeOverridePlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/CompactPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/DependentReturnTypeOverridePlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/DumpPHPDocPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/ExtendedDependentReturnTypeOverridePlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileContents.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileEdit.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileEditSet.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/IssueFixer.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/MethodSearcherPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/MethodSearcherPluginLoader.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/MiscParamPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/NodeSelectionPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/RequireExistsPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/StringFunctionPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/ThrowAnalyzerPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableGraph.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackerVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingBranchScope.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingLoopScope.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingScope.php delete mode 100644 vendor/phan/phan/src/Phan/Plugin/Internal/VariableTrackerPlugin.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/AfterAnalyzeFileCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/AnalyzeClassCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/AnalyzeFunctionCallCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/AnalyzeFunctionCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/AnalyzeMethodCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/AnalyzePropertyCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/AutomaticFixCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/BeforeAnalyzeCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/BeforeAnalyzeFileCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/FinalizeProcessCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/HandleLazyLoadInternalFunctionCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/IssueEmitter.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/PluginAwareBaseAnalysisVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/PluginAwarePostAnalysisVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/PluginAwarePreAnalysisVisitor.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/PostAnalyzeNodeCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/PreAnalyzeNodeCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/ReturnTypeOverrideCapability.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/StopParamAnalysisException.php delete mode 100644 vendor/phan/phan/src/Phan/PluginV2/SuppressionCapability.php delete mode 100644 vendor/phan/phan/src/Phan/Prep.php delete mode 100644 vendor/phan/phan/src/Phan/Profile.php delete mode 100644 vendor/phan/phan/src/Phan/README.md delete mode 100644 vendor/phan/phan/src/Phan/Suggestion.php delete mode 100644 vendor/phan/phan/src/codebase.php delete mode 100644 vendor/phan/phan/src/phan.php delete mode 100644 vendor/phan/phan/src/prep.php delete mode 100644 vendor/phan/phan/src/requirements.php delete mode 100644 vendor/phan/phan/src/spl_object_id.php delete mode 100755 vendor/phan/phan/test delete mode 100755 vendor/phan/phan/tocheckstyle delete mode 100644 vendor/phan/phan/tool/README.md delete mode 100755 vendor/phan/phan/tool/dump_markdown_preview delete mode 100755 vendor/phan/phan/tool/make_ctags_for_phan_project delete mode 100755 vendor/phan/phan/tool/make_stubs delete mode 100755 vendor/phan/phan/tool/phoogle delete mode 100644 vendor/phar-io/manifest/.gitignore delete mode 100644 vendor/phar-io/manifest/.php_cs delete mode 100644 vendor/phar-io/manifest/.travis.yml delete mode 100644 vendor/phar-io/manifest/LICENSE delete mode 100644 vendor/phar-io/manifest/README.md delete mode 100644 vendor/phar-io/manifest/build.xml delete mode 100644 vendor/phar-io/manifest/composer.json delete mode 100644 vendor/phar-io/manifest/composer.lock delete mode 100644 vendor/phar-io/manifest/examples/example-01.php delete mode 100644 vendor/phar-io/manifest/phive.xml delete mode 100644 vendor/phar-io/manifest/phpunit.xml delete mode 100644 vendor/phar-io/manifest/src/ManifestDocumentMapper.php delete mode 100644 vendor/phar-io/manifest/src/ManifestLoader.php delete mode 100644 vendor/phar-io/manifest/src/ManifestSerializer.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/Exception.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestElementException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php delete mode 100644 vendor/phar-io/manifest/src/values/Application.php delete mode 100644 vendor/phar-io/manifest/src/values/ApplicationName.php delete mode 100644 vendor/phar-io/manifest/src/values/Author.php delete mode 100644 vendor/phar-io/manifest/src/values/AuthorCollection.php delete mode 100644 vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php delete mode 100644 vendor/phar-io/manifest/src/values/BundledComponent.php delete mode 100644 vendor/phar-io/manifest/src/values/BundledComponentCollection.php delete mode 100644 vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php delete mode 100644 vendor/phar-io/manifest/src/values/CopyrightInformation.php delete mode 100644 vendor/phar-io/manifest/src/values/Email.php delete mode 100644 vendor/phar-io/manifest/src/values/Extension.php delete mode 100644 vendor/phar-io/manifest/src/values/Library.php delete mode 100644 vendor/phar-io/manifest/src/values/License.php delete mode 100644 vendor/phar-io/manifest/src/values/Manifest.php delete mode 100644 vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php delete mode 100644 vendor/phar-io/manifest/src/values/PhpVersionRequirement.php delete mode 100644 vendor/phar-io/manifest/src/values/Requirement.php delete mode 100644 vendor/phar-io/manifest/src/values/RequirementCollection.php delete mode 100644 vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php delete mode 100644 vendor/phar-io/manifest/src/values/Type.php delete mode 100644 vendor/phar-io/manifest/src/values/Url.php delete mode 100644 vendor/phar-io/manifest/src/xml/AuthorElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/AuthorElementCollection.php delete mode 100644 vendor/phar-io/manifest/src/xml/BundlesElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/ComponentElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/ComponentElementCollection.php delete mode 100644 vendor/phar-io/manifest/src/xml/ContainsElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/CopyrightElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/ElementCollection.php delete mode 100644 vendor/phar-io/manifest/src/xml/ExtElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/ExtElementCollection.php delete mode 100644 vendor/phar-io/manifest/src/xml/ExtensionElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/LicenseElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/ManifestDocument.php delete mode 100644 vendor/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php delete mode 100644 vendor/phar-io/manifest/src/xml/ManifestElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/PhpElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/RequiresElement.php delete mode 100644 vendor/phar-io/manifest/tests/ManifestDocumentMapperTest.php delete mode 100644 vendor/phar-io/manifest/tests/ManifestLoaderTest.php delete mode 100644 vendor/phar-io/manifest/tests/ManifestSerializerTest.php delete mode 100644 vendor/phar-io/manifest/tests/_fixture/custom.xml delete mode 100644 vendor/phar-io/manifest/tests/_fixture/extension-invalidcompatible.xml delete mode 100644 vendor/phar-io/manifest/tests/_fixture/extension.xml delete mode 100644 vendor/phar-io/manifest/tests/_fixture/invalidversion.xml delete mode 100644 vendor/phar-io/manifest/tests/_fixture/invalidversionconstraint.xml delete mode 100644 vendor/phar-io/manifest/tests/_fixture/library.xml delete mode 100644 vendor/phar-io/manifest/tests/_fixture/manifest.xml delete mode 100644 vendor/phar-io/manifest/tests/_fixture/phpunit-5.6.5.xml delete mode 100644 vendor/phar-io/manifest/tests/_fixture/test.phar delete mode 100644 vendor/phar-io/manifest/tests/exceptions/ManifestDocumentLoadingExceptionTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/ApplicationNameTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/ApplicationTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/AuthorCollectionTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/AuthorTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/BundledComponentCollectionTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/BundledComponentTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/CopyrightInformationTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/EmailTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/ExtensionTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/LibraryTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/LicenseTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/ManifestTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/PhpExtensionRequirementTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/PhpVersionRequirementTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/RequirementCollectionTest.php delete mode 100644 vendor/phar-io/manifest/tests/values/UrlTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/AuthorElementCollectionTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/AuthorElementTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/BundlesElementTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/ComponentElementCollectionTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/ComponentElementTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/ContainsElementTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/CopyrightElementTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/ExtElementCollectionTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/ExtElementTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/ExtensionElementTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/LicenseElementTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/ManifestDocumentTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/PhpElementTest.php delete mode 100644 vendor/phar-io/manifest/tests/xml/RequiresElementTest.php delete mode 100644 vendor/phar-io/version/.gitignore delete mode 100644 vendor/phar-io/version/.php_cs delete mode 100644 vendor/phar-io/version/.travis.yml delete mode 100644 vendor/phar-io/version/CHANGELOG.md delete mode 100644 vendor/phar-io/version/LICENSE delete mode 100644 vendor/phar-io/version/README.md delete mode 100644 vendor/phar-io/version/build.xml delete mode 100644 vendor/phar-io/version/composer.json delete mode 100644 vendor/phar-io/version/phive.xml delete mode 100644 vendor/phar-io/version/phpunit.xml delete mode 100644 vendor/phar-io/version/src/PreReleaseSuffix.php delete mode 100644 vendor/phar-io/version/src/Version.php delete mode 100644 vendor/phar-io/version/src/VersionConstraintParser.php delete mode 100644 vendor/phar-io/version/src/VersionConstraintValue.php delete mode 100644 vendor/phar-io/version/src/VersionNumber.php delete mode 100644 vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php delete mode 100644 vendor/phar-io/version/src/constraints/AnyVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/ExactVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php delete mode 100644 vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/VersionConstraint.php delete mode 100644 vendor/phar-io/version/src/exceptions/Exception.php delete mode 100644 vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php delete mode 100644 vendor/phar-io/version/src/exceptions/InvalidVersionException.php delete mode 100644 vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php delete mode 100644 vendor/phar-io/version/tests/Integration/VersionConstraintParserTest.php delete mode 100644 vendor/phar-io/version/tests/Unit/AbstractVersionConstraintTest.php delete mode 100644 vendor/phar-io/version/tests/Unit/AndVersionConstraintGroupTest.php delete mode 100644 vendor/phar-io/version/tests/Unit/AnyVersionConstraintTest.php delete mode 100644 vendor/phar-io/version/tests/Unit/ExactVersionConstraintTest.php delete mode 100644 vendor/phar-io/version/tests/Unit/GreaterThanOrEqualToVersionConstraintTest.php delete mode 100644 vendor/phar-io/version/tests/Unit/OrVersionConstraintGroupTest.php delete mode 100644 vendor/phar-io/version/tests/Unit/PreReleaseSuffixTest.php delete mode 100644 vendor/phar-io/version/tests/Unit/SpecificMajorAndMinorVersionConstraintTest.php delete mode 100644 vendor/phar-io/version/tests/Unit/SpecificMajorVersionConstraintTest.php delete mode 100644 vendor/phar-io/version/tests/Unit/VersionTest.php delete mode 100644 vendor/php-cs-fixer/diff/ChangeLog.md delete mode 100644 vendor/php-cs-fixer/diff/LICENSE delete mode 100644 vendor/php-cs-fixer/diff/LICENSE_DIFF delete mode 100644 vendor/php-cs-fixer/diff/LICENSE_GECKO delete mode 100644 vendor/php-cs-fixer/diff/README.md delete mode 100644 vendor/php-cs-fixer/diff/composer.json delete mode 100644 vendor/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/ConfigurationException.php delete mode 100644 vendor/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/UnifiedDiffOutputBuilder.php delete mode 100644 vendor/php-cs-fixer/diff/src/v1_4/Chunk.php delete mode 100644 vendor/php-cs-fixer/diff/src/v1_4/Diff.php delete mode 100644 vendor/php-cs-fixer/diff/src/v1_4/Differ.php delete mode 100644 vendor/php-cs-fixer/diff/src/v1_4/LCS/LongestCommonSubsequence.php delete mode 100644 vendor/php-cs-fixer/diff/src/v1_4/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php delete mode 100644 vendor/php-cs-fixer/diff/src/v1_4/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php delete mode 100644 vendor/php-cs-fixer/diff/src/v1_4/Line.php delete mode 100644 vendor/php-cs-fixer/diff/src/v1_4/Parser.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/Chunk.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/Diff.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/Differ.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/Exception/Exception.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/Exception/InvalidArgumentException.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/Line.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/LongestCommonSubsequenceCalculator.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/MemoryEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/Output/AbstractChunkOutputBuilder.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/Output/DiffOnlyOutputBuilder.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/Output/DiffOutputBuilderInterface.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/Output/UnifiedDiffOutputBuilder.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/Parser.php delete mode 100644 vendor/php-cs-fixer/diff/src/v2_0/TimeEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Chunk.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Diff.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Differ.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Exception/ConfigurationException.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Exception/Exception.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Exception/InvalidArgumentException.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Line.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/LongestCommonSubsequenceCalculator.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/MemoryEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Output/AbstractChunkOutputBuilder.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Output/DiffOnlyOutputBuilder.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Output/DiffOutputBuilderInterface.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Output/StrictUnifiedDiffOutputBuilder.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Output/UnifiedDiffOutputBuilder.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/Parser.php delete mode 100644 vendor/php-cs-fixer/diff/src/v3_0/TimeEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 vendor/phpdocumentor/reflection-common/.github/dependabot.yml delete mode 100644 vendor/phpdocumentor/reflection-common/.github/workflows/push.yml delete mode 100644 vendor/phpdocumentor/reflection-common/LICENSE delete mode 100644 vendor/phpdocumentor/reflection-common/README.md delete mode 100644 vendor/phpdocumentor/reflection-common/composer.json delete mode 100644 vendor/phpdocumentor/reflection-common/src/Element.php delete mode 100644 vendor/phpdocumentor/reflection-common/src/File.php delete mode 100644 vendor/phpdocumentor/reflection-common/src/Fqsen.php delete mode 100644 vendor/phpdocumentor/reflection-common/src/Location.php delete mode 100644 vendor/phpdocumentor/reflection-common/src/Project.php delete mode 100644 vendor/phpdocumentor/reflection-common/src/ProjectFactory.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/LICENSE delete mode 100644 vendor/phpdocumentor/reflection-docblock/README.md delete mode 100644 vendor/phpdocumentor/reflection-docblock/composer.json delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php delete mode 100644 vendor/phpdocumentor/type-resolver/LICENSE delete mode 100644 vendor/phpdocumentor/type-resolver/README.md delete mode 100644 vendor/phpdocumentor/type-resolver/composer.json delete mode 100644 vendor/phpdocumentor/type-resolver/composer.lock delete mode 100644 vendor/phpdocumentor/type-resolver/phpbench.json delete mode 100644 vendor/phpdocumentor/type-resolver/src/FqsenResolver.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Type.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/TypeResolver.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Array_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Boolean.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Callable_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ClassString.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Collection.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Compound.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Context.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Expression.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/False_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Float_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Integer.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Intersection.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Null_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Nullable.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Object_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Parent_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Resource_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Scalar.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Self_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Static_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/String_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/This.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/True_.php delete mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Void_.php delete mode 100644 vendor/phpmd/phpmd/.mailmap delete mode 100644 vendor/phpmd/phpmd/.scrutinizer.yml delete mode 100644 vendor/phpmd/phpmd/.stickler.yml delete mode 100644 vendor/phpmd/phpmd/AUTHORS.rst delete mode 100644 vendor/phpmd/phpmd/CHANGELOG delete mode 100644 vendor/phpmd/phpmd/CONTRIBUTING.md delete mode 100644 vendor/phpmd/phpmd/LICENSE delete mode 100644 vendor/phpmd/phpmd/README.rst delete mode 100644 vendor/phpmd/phpmd/apigen.neon delete mode 100644 vendor/phpmd/phpmd/build.properties delete mode 100644 vendor/phpmd/phpmd/composer.json delete mode 100755 vendor/phpmd/phpmd/src/bin/phpmd delete mode 100644 vendor/phpmd/phpmd/src/bin/phpmd.bat delete mode 100644 vendor/phpmd/phpmd/src/conf/phar_bootstrap.stub delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractNode.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractRenderer.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractRule.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractWriter.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Node/ASTNode.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractCallableNode.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractNode.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractTypeNode.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Node/Annotation.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Node/Annotations.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Node/ClassNode.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Node/FunctionNode.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Node/InterfaceNode.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Node/MethodNode.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Node/TraitNode.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/PHPMD.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Parser.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/ParserFactory.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/ProcessingError.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/AnsiRenderer.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/HTMLRenderer.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/JSONRenderer.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/TextRenderer.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/XMLRenderer.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Report.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/AbstractLocalVariable.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/ClassAware.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/BooleanArgumentFlag.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/DuplicatedArrayKey.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/ElseExpression.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/IfStatementAssignment.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/MissingImport.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/StaticAccess.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/UndefinedVariable.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseClassName.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseMethodName.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseParameterName.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCasePropertyName.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseVariableName.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/Superglobals.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CyclomaticComplexity.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/CountInLoopExpression.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/CouplingBetweenObjects.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/DepthOfInheritance.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/DevelopmentCodeFragment.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/EmptyCatchBlock.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/EvalExpression.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/ExitExpression.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/GotoStatement.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongClass.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongMethod.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongParameterList.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/NpathComplexity.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/NumberOfChildren.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyFields.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyMethods.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyPublicMethods.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/WeightedMethodCount.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/ExcessivePublicCount.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/FunctionAware.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/InterfaceAware.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/MethodAware.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/BooleanGetMethodName.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ConstantNamingConventions.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ConstructorWithNameAsEnclosingClass.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/LongVariable.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ShortMethodName.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ShortVariable.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedFormalParameter.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedLocalVariable.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedPrivateField.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedPrivateMethod.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/RuleClassFileNotFoundException.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/RuleClassNotFoundException.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSet.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSetFactory.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSetNotFoundException.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/RuleViolation.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/Command.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/CommandLineOptions.php delete mode 100644 vendor/phpmd/phpmd/src/main/php/PHPMD/Writer/StreamWriter.php delete mode 100644 vendor/phpmd/phpmd/src/main/resources/rulesets/cleancode.xml delete mode 100644 vendor/phpmd/phpmd/src/main/resources/rulesets/codesize.xml delete mode 100644 vendor/phpmd/phpmd/src/main/resources/rulesets/controversial.xml delete mode 100644 vendor/phpmd/phpmd/src/main/resources/rulesets/design.xml delete mode 100644 vendor/phpmd/phpmd/src/main/resources/rulesets/naming.xml delete mode 100644 vendor/phpmd/phpmd/src/main/resources/rulesets/unusedcode.xml delete mode 100644 vendor/phpspec/prophecy/CHANGES.md delete mode 100644 vendor/phpspec/prophecy/LICENSE delete mode 100644 vendor/phpspec/prophecy/README.md delete mode 100644 vendor/phpspec/prophecy/composer.json delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Call/Call.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophet.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php delete mode 100644 vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php delete mode 100644 vendor/phpstan/phpstan/.gitattributes delete mode 100644 vendor/phpstan/phpstan/.gitignore delete mode 100644 vendor/phpstan/phpstan/LICENSE delete mode 100644 vendor/phpstan/phpstan/README.md delete mode 100644 vendor/phpstan/phpstan/bootstrap.php delete mode 100644 vendor/phpstan/phpstan/composer.json delete mode 100644 vendor/phpstan/phpstan/conf/bleedingEdge.neon delete mode 100755 vendor/phpstan/phpstan/phpstan delete mode 100755 vendor/phpstan/phpstan/phpstan.phar delete mode 100644 vendor/phpstan/phpstan/phpstan.phar.asc delete mode 100644 vendor/phpunit/php-code-coverage/.gitattributes delete mode 100644 vendor/phpunit/php-code-coverage/.gitignore delete mode 100644 vendor/phpunit/php-code-coverage/ChangeLog.md delete mode 100644 vendor/phpunit/php-code-coverage/LICENSE delete mode 100644 vendor/phpunit/php-code-coverage/README.md delete mode 100644 vendor/phpunit/php-code-coverage/composer.json delete mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Directory.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Driver/Driver.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Driver/PCOV.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Driver/PHPDBG.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Driver/Xdebug.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/Exception.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/RuntimeException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Filter.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Node/Builder.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Node/Directory.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Node/File.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Node/Iterator.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Percentage.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Clover.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Crap4j.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/custom.css delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/d3.min.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/nv.d3.min.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/PHP.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Text.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/File.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Version.php delete mode 100644 vendor/phpunit/php-file-iterator/.gitattributes delete mode 100644 vendor/phpunit/php-file-iterator/.gitignore delete mode 100644 vendor/phpunit/php-file-iterator/ChangeLog.md delete mode 100644 vendor/phpunit/php-file-iterator/LICENSE delete mode 100644 vendor/phpunit/php-file-iterator/README.md delete mode 100644 vendor/phpunit/php-file-iterator/composer.json delete mode 100644 vendor/phpunit/php-file-iterator/src/Facade.php delete mode 100644 vendor/phpunit/php-file-iterator/src/Factory.php delete mode 100644 vendor/phpunit/php-file-iterator/src/Iterator.php delete mode 100644 vendor/phpunit/php-invoker/.gitattributes delete mode 100644 vendor/phpunit/php-invoker/.gitignore delete mode 100644 vendor/phpunit/php-invoker/ChangeLog.md delete mode 100644 vendor/phpunit/php-invoker/LICENSE delete mode 100644 vendor/phpunit/php-invoker/README.md delete mode 100644 vendor/phpunit/php-invoker/composer.json delete mode 100644 vendor/phpunit/php-invoker/src/Invoker.php delete mode 100644 vendor/phpunit/php-invoker/src/exceptions/Exception.php delete mode 100644 vendor/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php delete mode 100644 vendor/phpunit/php-invoker/src/exceptions/TimeoutException.php delete mode 100644 vendor/phpunit/php-text-template/.gitattributes delete mode 100644 vendor/phpunit/php-text-template/.gitignore delete mode 100644 vendor/phpunit/php-text-template/ChangeLog.md delete mode 100644 vendor/phpunit/php-text-template/LICENSE delete mode 100644 vendor/phpunit/php-text-template/README.md delete mode 100644 vendor/phpunit/php-text-template/composer.json delete mode 100644 vendor/phpunit/php-text-template/src/Template.php delete mode 100644 vendor/phpunit/php-text-template/src/exceptions/Exception.php delete mode 100644 vendor/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php delete mode 100644 vendor/phpunit/php-text-template/src/exceptions/RuntimeException.php delete mode 100644 vendor/phpunit/php-timer/.gitattributes delete mode 100644 vendor/phpunit/php-timer/.gitignore delete mode 100644 vendor/phpunit/php-timer/ChangeLog.md delete mode 100644 vendor/phpunit/php-timer/LICENSE delete mode 100644 vendor/phpunit/php-timer/README.md delete mode 100644 vendor/phpunit/php-timer/composer.json delete mode 100644 vendor/phpunit/php-timer/src/Duration.php delete mode 100644 vendor/phpunit/php-timer/src/ResourceUsageFormatter.php delete mode 100644 vendor/phpunit/php-timer/src/Timer.php delete mode 100644 vendor/phpunit/php-timer/src/exceptions/Exception.php delete mode 100644 vendor/phpunit/php-timer/src/exceptions/NoActiveTimerException.php delete mode 100644 vendor/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php delete mode 100644 vendor/phpunit/php-token-stream/.gitattributes delete mode 100644 vendor/phpunit/php-token-stream/.gitignore delete mode 100644 vendor/phpunit/php-token-stream/ChangeLog.md delete mode 100644 vendor/phpunit/php-token-stream/LICENSE delete mode 100644 vendor/phpunit/php-token-stream/README.md delete mode 100644 vendor/phpunit/php-token-stream/composer.json delete mode 100644 vendor/phpunit/php-token-stream/src/Token.php delete mode 100644 vendor/phpunit/php-token-stream/src/Token/Stream.php delete mode 100644 vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php delete mode 100644 vendor/phpunit/php-token-stream/src/Token/Util.php delete mode 100644 vendor/phpunit/phpunit/.phpstorm.meta.php delete mode 100644 vendor/phpunit/phpunit/ChangeLog-8.5.md delete mode 100644 vendor/phpunit/phpunit/ChangeLog-9.2.md delete mode 100644 vendor/phpunit/phpunit/LICENSE delete mode 100644 vendor/phpunit/phpunit/README.md delete mode 100644 vendor/phpunit/phpunit/composer.json delete mode 100755 vendor/phpunit/phpunit/phpunit delete mode 100644 vendor/phpunit/phpunit/phpunit.xsd delete mode 100644 vendor/phpunit/phpunit/src/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Assert.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Assert/Functions.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Count.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/FileExists.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsEqualCanonicalizing.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsEqualIgnoringCase.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsEqualWithDelta.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsFalse.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsFinite.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsJson.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsNan.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsNull.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsReadable.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsTrue.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsType.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsWritable.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/LessThan.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/SameSize.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringContains.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Error/Deprecated.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Error/Error.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Error/Notice.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Error/Warning.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/OutputError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/SyntheticError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Warning.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/IncompleteTest.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/deprecation.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_class.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method_void.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_static_method.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method_void.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/trait_class.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_class.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_method.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockTrait.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockType.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Verifiable.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/SelfDescribing.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/SkippedTest.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Test.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestCase.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestFailure.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestListener.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestResult.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestSuite.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/WarningTestCase.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/Factory.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/Hook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/TestHook.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/NullTestResultCache.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/PhptTestCase.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResultCache.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Version.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Arguments/Arguments.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Arguments/ArgumentsBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Arguments/ArgumentsMapper.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Arguments/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Configuration.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filesystem/Directory.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filesystem/DirectoryCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filesystem/DirectoryCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filesystem/File.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filesystem/FileCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filesystem/FileCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filter/Filter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterDirectory.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterDirectoryCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterDirectoryCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterFile.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterFileCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterFileCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Generator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Group/Group.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Group/GroupCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Group/GroupCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Group/Groups.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Loader.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Clover.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Crap4j.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Html.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Php.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Text.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Xml.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/Junit.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/Logging.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/PlainText.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/TeamCity.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/TestDox/Html.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/TestDox/Text.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Logging/TestDox/Xml.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHP/Constant.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHP/ConstantCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHP/ConstantCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHP/IniSetting.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHP/IniSettingCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHP/IniSettingCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHP/Php.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHP/PhpHandler.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHP/Variable.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHP/VariableCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHP/VariableCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/Extension.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/ExtensionCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/ExtensionCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/ExtensionHandler.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/PHPUnit.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Registry.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestDirectory.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestDirectoryCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestDirectoryCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestFile.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestFileCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestFileCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuite.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuiteCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuiteCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuiteMapper.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Help.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/TestRunner.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Annotation/Registry.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Blacklist.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Color.php delete mode 100644 vendor/phpunit/phpunit/src/Util/ErrorHandler.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Util/FileLoader.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Filesystem.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Filter.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Getopt.php delete mode 100644 vendor/phpunit/phpunit/src/Util/GlobalState.php delete mode 100644 vendor/phpunit/phpunit/src/Util/InvalidDataSetException.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Json.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Log/JUnit.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Log/TeamCity.php delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Printer.php delete mode 100644 vendor/phpunit/phpunit/src/Util/RegularExpression.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Test.php delete mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php delete mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/Util/TextTestListRenderer.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Type.php delete mode 100644 vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php delete mode 100644 vendor/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Xml.php delete mode 100644 vendor/phpunit/phpunit/src/Util/XmlTestListRenderer.php delete mode 100644 vendor/psr/container/.gitignore delete mode 100644 vendor/psr/container/LICENSE delete mode 100644 vendor/psr/container/README.md delete mode 100644 vendor/psr/container/composer.json delete mode 100644 vendor/psr/container/src/ContainerExceptionInterface.php delete mode 100644 vendor/psr/container/src/ContainerInterface.php delete mode 100644 vendor/psr/container/src/NotFoundExceptionInterface.php delete mode 100644 vendor/psr/log/LICENSE delete mode 100644 vendor/psr/log/Psr/Log/AbstractLogger.php delete mode 100644 vendor/psr/log/Psr/Log/InvalidArgumentException.php delete mode 100644 vendor/psr/log/Psr/Log/LogLevel.php delete mode 100644 vendor/psr/log/Psr/Log/LoggerAwareInterface.php delete mode 100644 vendor/psr/log/Psr/Log/LoggerAwareTrait.php delete mode 100644 vendor/psr/log/Psr/Log/LoggerInterface.php delete mode 100644 vendor/psr/log/Psr/Log/LoggerTrait.php delete mode 100644 vendor/psr/log/Psr/Log/NullLogger.php delete mode 100644 vendor/psr/log/Psr/Log/Test/DummyTest.php delete mode 100644 vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php delete mode 100644 vendor/psr/log/Psr/Log/Test/TestLogger.php delete mode 100644 vendor/psr/log/README.md delete mode 100644 vendor/psr/log/composer.json delete mode 100644 vendor/sabre/event/.php_cs.dist delete mode 100644 vendor/sabre/event/LICENSE delete mode 100644 vendor/sabre/event/bin/.empty delete mode 100644 vendor/sabre/event/composer.json delete mode 100644 vendor/sabre/event/lib/Emitter.php delete mode 100644 vendor/sabre/event/lib/EmitterInterface.php delete mode 100644 vendor/sabre/event/lib/EmitterTrait.php delete mode 100644 vendor/sabre/event/lib/EventEmitter.php delete mode 100644 vendor/sabre/event/lib/Loop/Loop.php delete mode 100644 vendor/sabre/event/lib/Loop/functions.php delete mode 100644 vendor/sabre/event/lib/Promise.php delete mode 100644 vendor/sabre/event/lib/Promise/functions.php delete mode 100644 vendor/sabre/event/lib/PromiseAlreadyResolvedException.php delete mode 100644 vendor/sabre/event/lib/Version.php delete mode 100644 vendor/sabre/event/lib/WildcardEmitter.php delete mode 100644 vendor/sabre/event/lib/WildcardEmitterTrait.php delete mode 100644 vendor/sabre/event/lib/coroutine.php delete mode 100644 vendor/sabre/event/phpstan.neon delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/.gitattributes delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/.gitignore delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/LICENSE delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/README.md delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/composer.json delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php delete mode 100644 vendor/sebastian/code-unit/.gitattributes delete mode 100644 vendor/sebastian/code-unit/.gitignore delete mode 100644 vendor/sebastian/code-unit/ChangeLog.md delete mode 100644 vendor/sebastian/code-unit/LICENSE delete mode 100644 vendor/sebastian/code-unit/README.md delete mode 100644 vendor/sebastian/code-unit/composer.json delete mode 100644 vendor/sebastian/code-unit/infection.json delete mode 100644 vendor/sebastian/code-unit/src/ClassMethodUnit.php delete mode 100644 vendor/sebastian/code-unit/src/ClassUnit.php delete mode 100644 vendor/sebastian/code-unit/src/CodeUnit.php delete mode 100644 vendor/sebastian/code-unit/src/CodeUnitCollection.php delete mode 100644 vendor/sebastian/code-unit/src/CodeUnitCollectionIterator.php delete mode 100644 vendor/sebastian/code-unit/src/FunctionUnit.php delete mode 100644 vendor/sebastian/code-unit/src/InterfaceMethodUnit.php delete mode 100644 vendor/sebastian/code-unit/src/InterfaceUnit.php delete mode 100644 vendor/sebastian/code-unit/src/Mapper.php delete mode 100644 vendor/sebastian/code-unit/src/TraitMethodUnit.php delete mode 100644 vendor/sebastian/code-unit/src/TraitUnit.php delete mode 100644 vendor/sebastian/code-unit/src/exceptions/Exception.php delete mode 100644 vendor/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php delete mode 100644 vendor/sebastian/code-unit/src/exceptions/NoTraitException.php delete mode 100644 vendor/sebastian/code-unit/src/exceptions/ReflectionException.php delete mode 100644 vendor/sebastian/comparator/.gitattributes delete mode 100644 vendor/sebastian/comparator/.gitignore delete mode 100644 vendor/sebastian/comparator/ChangeLog.md delete mode 100644 vendor/sebastian/comparator/LICENSE delete mode 100644 vendor/sebastian/comparator/README.md delete mode 100644 vendor/sebastian/comparator/composer.json delete mode 100644 vendor/sebastian/comparator/src/ArrayComparator.php delete mode 100644 vendor/sebastian/comparator/src/Comparator.php delete mode 100644 vendor/sebastian/comparator/src/ComparisonFailure.php delete mode 100644 vendor/sebastian/comparator/src/DOMNodeComparator.php delete mode 100644 vendor/sebastian/comparator/src/DateTimeComparator.php delete mode 100644 vendor/sebastian/comparator/src/DoubleComparator.php delete mode 100644 vendor/sebastian/comparator/src/ExceptionComparator.php delete mode 100644 vendor/sebastian/comparator/src/Factory.php delete mode 100644 vendor/sebastian/comparator/src/MockObjectComparator.php delete mode 100644 vendor/sebastian/comparator/src/NumericComparator.php delete mode 100644 vendor/sebastian/comparator/src/ObjectComparator.php delete mode 100644 vendor/sebastian/comparator/src/ResourceComparator.php delete mode 100644 vendor/sebastian/comparator/src/ScalarComparator.php delete mode 100644 vendor/sebastian/comparator/src/SplObjectStorageComparator.php delete mode 100644 vendor/sebastian/comparator/src/TypeComparator.php delete mode 100644 vendor/sebastian/comparator/src/exceptions/Exception.php delete mode 100644 vendor/sebastian/comparator/src/exceptions/RuntimeException.php delete mode 100644 vendor/sebastian/diff/.gitattributes delete mode 100644 vendor/sebastian/diff/.gitignore delete mode 100644 vendor/sebastian/diff/ChangeLog.md delete mode 100644 vendor/sebastian/diff/LICENSE delete mode 100644 vendor/sebastian/diff/README.md delete mode 100644 vendor/sebastian/diff/composer.json delete mode 100644 vendor/sebastian/diff/src/Chunk.php delete mode 100644 vendor/sebastian/diff/src/Diff.php delete mode 100644 vendor/sebastian/diff/src/Differ.php delete mode 100644 vendor/sebastian/diff/src/Exception/ConfigurationException.php delete mode 100644 vendor/sebastian/diff/src/Exception/Exception.php delete mode 100644 vendor/sebastian/diff/src/Exception/InvalidArgumentException.php delete mode 100644 vendor/sebastian/diff/src/Line.php delete mode 100644 vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php delete mode 100644 vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php delete mode 100644 vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Parser.php delete mode 100644 vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 vendor/sebastian/environment/.gitattributes delete mode 100644 vendor/sebastian/environment/.gitignore delete mode 100644 vendor/sebastian/environment/ChangeLog.md delete mode 100644 vendor/sebastian/environment/LICENSE delete mode 100644 vendor/sebastian/environment/README.md delete mode 100644 vendor/sebastian/environment/composer.json delete mode 100644 vendor/sebastian/environment/src/Console.php delete mode 100644 vendor/sebastian/environment/src/OperatingSystem.php delete mode 100644 vendor/sebastian/environment/src/Runtime.php delete mode 100644 vendor/sebastian/exporter/.gitattributes delete mode 100644 vendor/sebastian/exporter/.gitignore delete mode 100644 vendor/sebastian/exporter/ChangeLog.md delete mode 100644 vendor/sebastian/exporter/LICENSE delete mode 100644 vendor/sebastian/exporter/README.md delete mode 100644 vendor/sebastian/exporter/composer.json delete mode 100644 vendor/sebastian/exporter/src/Exporter.php delete mode 100644 vendor/sebastian/global-state/.gitattributes delete mode 100644 vendor/sebastian/global-state/.github/FUNDING.yml delete mode 100644 vendor/sebastian/global-state/.gitignore delete mode 100644 vendor/sebastian/global-state/.php_cs.dist delete mode 100644 vendor/sebastian/global-state/.travis.yml delete mode 100644 vendor/sebastian/global-state/ChangeLog.md delete mode 100644 vendor/sebastian/global-state/LICENSE delete mode 100644 vendor/sebastian/global-state/README.md delete mode 100644 vendor/sebastian/global-state/build.xml delete mode 100644 vendor/sebastian/global-state/composer.json delete mode 100644 vendor/sebastian/global-state/phive.xml delete mode 100644 vendor/sebastian/global-state/phpunit.xml delete mode 100644 vendor/sebastian/global-state/psalm.xml delete mode 100644 vendor/sebastian/global-state/src/Blacklist.php delete mode 100644 vendor/sebastian/global-state/src/CodeExporter.php delete mode 100644 vendor/sebastian/global-state/src/Restorer.php delete mode 100644 vendor/sebastian/global-state/src/Snapshot.php delete mode 100644 vendor/sebastian/global-state/src/exceptions/Exception.php delete mode 100644 vendor/sebastian/global-state/src/exceptions/RuntimeException.php delete mode 100644 vendor/sebastian/global-state/tests/BlacklistTest.php delete mode 100644 vendor/sebastian/global-state/tests/CodeExporterTest.php delete mode 100644 vendor/sebastian/global-state/tests/RestorerTest.php delete mode 100644 vendor/sebastian/global-state/tests/SnapshotTest.php delete mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedChildClass.php delete mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedClass.php delete mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedImplementor.php delete mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedInterface.php delete mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotClass.php delete mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotDomDocument.php delete mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotFunctions.php delete mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotTrait.php delete mode 100644 vendor/sebastian/object-enumerator/.gitattributes delete mode 100644 vendor/sebastian/object-enumerator/.gitignore delete mode 100644 vendor/sebastian/object-enumerator/ChangeLog.md delete mode 100644 vendor/sebastian/object-enumerator/LICENSE delete mode 100644 vendor/sebastian/object-enumerator/README.md delete mode 100644 vendor/sebastian/object-enumerator/composer.json delete mode 100644 vendor/sebastian/object-enumerator/phpunit.xml delete mode 100644 vendor/sebastian/object-enumerator/src/Enumerator.php delete mode 100644 vendor/sebastian/object-enumerator/src/Exception.php delete mode 100644 vendor/sebastian/object-enumerator/src/InvalidArgumentException.php delete mode 100644 vendor/sebastian/object-reflector/.gitattributes delete mode 100644 vendor/sebastian/object-reflector/.gitignore delete mode 100644 vendor/sebastian/object-reflector/ChangeLog.md delete mode 100644 vendor/sebastian/object-reflector/LICENSE delete mode 100644 vendor/sebastian/object-reflector/README.md delete mode 100644 vendor/sebastian/object-reflector/composer.json delete mode 100644 vendor/sebastian/object-reflector/src/Exception.php delete mode 100644 vendor/sebastian/object-reflector/src/InvalidArgumentException.php delete mode 100644 vendor/sebastian/object-reflector/src/ObjectReflector.php delete mode 100644 vendor/sebastian/recursion-context/.gitattributes delete mode 100644 vendor/sebastian/recursion-context/.gitignore delete mode 100644 vendor/sebastian/recursion-context/ChangeLog.md delete mode 100644 vendor/sebastian/recursion-context/LICENSE delete mode 100644 vendor/sebastian/recursion-context/README.md delete mode 100644 vendor/sebastian/recursion-context/composer.json delete mode 100644 vendor/sebastian/recursion-context/src/Context.php delete mode 100644 vendor/sebastian/recursion-context/src/Exception.php delete mode 100644 vendor/sebastian/recursion-context/src/InvalidArgumentException.php delete mode 100644 vendor/sebastian/resource-operations/.gitattributes delete mode 100644 vendor/sebastian/resource-operations/.gitignore delete mode 100644 vendor/sebastian/resource-operations/ChangeLog.md delete mode 100644 vendor/sebastian/resource-operations/LICENSE delete mode 100644 vendor/sebastian/resource-operations/README.md delete mode 100755 vendor/sebastian/resource-operations/build/generate.php delete mode 100644 vendor/sebastian/resource-operations/composer.json delete mode 100644 vendor/sebastian/resource-operations/src/ResourceOperations.php delete mode 100644 vendor/sebastian/type/.gitattributes delete mode 100644 vendor/sebastian/type/.gitignore delete mode 100644 vendor/sebastian/type/ChangeLog.md delete mode 100644 vendor/sebastian/type/LICENSE delete mode 100644 vendor/sebastian/type/README.md delete mode 100644 vendor/sebastian/type/composer.json delete mode 100644 vendor/sebastian/type/src/CallableType.php delete mode 100644 vendor/sebastian/type/src/GenericObjectType.php delete mode 100644 vendor/sebastian/type/src/IterableType.php delete mode 100644 vendor/sebastian/type/src/MixedType.php delete mode 100644 vendor/sebastian/type/src/NullType.php delete mode 100644 vendor/sebastian/type/src/ObjectType.php delete mode 100644 vendor/sebastian/type/src/ReflectionMapper.php delete mode 100644 vendor/sebastian/type/src/SimpleType.php delete mode 100644 vendor/sebastian/type/src/Type.php delete mode 100644 vendor/sebastian/type/src/TypeName.php delete mode 100644 vendor/sebastian/type/src/UnionType.php delete mode 100644 vendor/sebastian/type/src/UnknownType.php delete mode 100644 vendor/sebastian/type/src/VoidType.php delete mode 100644 vendor/sebastian/type/src/exception/Exception.php delete mode 100644 vendor/sebastian/type/src/exception/RuntimeException.php delete mode 100644 vendor/sebastian/version/.gitattributes delete mode 100644 vendor/sebastian/version/.gitignore delete mode 100644 vendor/sebastian/version/LICENSE delete mode 100644 vendor/sebastian/version/README.md delete mode 100644 vendor/sebastian/version/composer.json delete mode 100644 vendor/sebastian/version/src/Version.php delete mode 100644 vendor/squizlabs/php_codesniffer/.cspell.json delete mode 100644 vendor/squizlabs/php_codesniffer/.gitattributes delete mode 100644 vendor/squizlabs/php_codesniffer/.gitignore delete mode 100644 vendor/squizlabs/php_codesniffer/CONTRIBUTING.md delete mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer.conf.dist delete mode 100644 vendor/squizlabs/php_codesniffer/README.md delete mode 100644 vendor/squizlabs/php_codesniffer/autoload.php delete mode 100755 vendor/squizlabs/php_codesniffer/bin/phpcbf delete mode 100644 vendor/squizlabs/php_codesniffer/bin/phpcbf.bat delete mode 100755 vendor/squizlabs/php_codesniffer/bin/phpcs delete mode 100755 vendor/squizlabs/php_codesniffer/bin/phpcs.bat delete mode 100644 vendor/squizlabs/php_codesniffer/composer.json delete mode 100644 vendor/squizlabs/php_codesniffer/licence.txt delete mode 100644 vendor/squizlabs/php_codesniffer/phpcs.xml.dist delete mode 100644 vendor/squizlabs/php_codesniffer/phpcs.xsd delete mode 100644 vendor/squizlabs/php_codesniffer/phpstan.neon delete mode 100644 vendor/squizlabs/php_codesniffer/scripts/ValidatePEAR/ValidatePEARPackageXML.php delete mode 100644 vendor/squizlabs/php_codesniffer/scripts/build-phar.php delete mode 100644 vendor/squizlabs/php_codesniffer/scripts/validate-pear-package.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Config.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Exceptions/DeepExitException.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Exceptions/RuntimeException.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Exceptions/TokenizerException.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Files/DummyFile.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Files/File.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Files/FileList.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Files/LocalFile.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Filters/ExactMatch.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Filters/Filter.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Filters/GitModified.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Filters/GitStaged.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Fixer.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Generators/Generator.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Generators/HTML.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Generators/Markdown.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Generators/Text.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reporter.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Cbf.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Checkstyle.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Code.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Csv.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Diff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Emacs.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Full.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Gitblame.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Hgblame.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Info.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Json.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Junit.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Notifysend.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Report.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Source.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Summary.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Svnblame.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/VersionControl.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Xml.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Ruleset.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Runner.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractArraySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractPatternSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractScopeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractVariableSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Sniffs/Sniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowLongArraySyntaxStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowShortArraySyntaxStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/OpeningBraceSameLineStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/AssignmentInConditionStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyStatementStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopShouldBeWhileLoopStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopWithTestFunctionCallStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/JumbledIncrementerStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnconditionalIfStatementStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnnecessaryFinalModifierStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnusedFunctionParameterStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UselessOverridingMethodStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/FixmeStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/TodoStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/DisallowYodaConditionsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/InlineControlStructureStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/CSSLintStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/ClosureLinterStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/JSHintStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ByteOrderMarkStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNewlineStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNoNewlineStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ExecutableFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/InlineHTMLStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineEndingsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineLengthStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LowercasedFilenameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneClassPerFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneInterfacePerFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneObjectStructurePerFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneTraitPerFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/DisallowMultipleStatementsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/MultipleStatementAlignmentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/NoSpaceAfterCastStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterCastStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterNotStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/CallTimePassByReferenceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/FunctionCallArgumentSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceBsdAllmanStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceKernighanRitchieStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/CyclomaticComplexityStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/NestingLevelStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/CamelCapsFunctionNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/ConstructorNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/UpperCaseConstantNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/BacktickOperatorStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/CharacterBeforePHPOpeningTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ClosingPHPTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DeprecatedFunctionsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowAlternativePHPTagsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowRequestSuperglobalStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowShortOpenTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DiscourageGotoStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ForbiddenFunctionsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseConstantStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseKeywordStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseTypeStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/NoSilencedErrorsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SAPIUsageStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/UpperCaseConstantStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryStringConcatStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/VersionControl/SubversionPropertiesStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ArbitraryParenthesesSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowSpaceIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowTabIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ScopeIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/SpreadOperatorSpacingAfterStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/ArrayIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/OpeningBraceSameLineSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/AssignmentInConditionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyPHPStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/DocCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/FixmeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/DisallowYodaConditionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/CSSLintSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ClosureLinterSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ESLintSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/JSHintSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ByteOrderMarkSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNewlineSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNoNewlineSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ExecutableFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/InlineHTMLSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineEndingsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineLengthSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LowercasedFilenameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneClassPerFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneInterfacePerFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneObjectStructurePerFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneTraitPerFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceBeforeCastSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/CamelCapsFunctionNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/ConstructorNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/BacktickOperatorSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/ClosingPHPTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowAlternativePHPTagsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowRequestSuperglobalSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowShortOpenTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DiscourageGotoSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/ForbiddenFunctionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/LowerCaseConstantSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/LowerCaseKeywordSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/LowerCaseTypeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/NoSilencedErrorsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/RequireStrictTypesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/SAPIUsageSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/SyntaxSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/UpperCaseConstantSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Strings/UnnecessaryStringConcatSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/VersionControl/GitMergeConflictSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/VersionControl/SubversionPropertiesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/ArbitraryParenthesesSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/DisallowSpaceIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/IncrementDecrementSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/ScopeIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/SpreadOperatorSpacingAfterSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/ArrayIndentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/ArrayIndentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/ArrayIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowLongArraySyntaxUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowLongArraySyntaxUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowLongArraySyntaxUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowLongArraySyntaxUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowLongArraySyntaxUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowShortArraySyntaxUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowShortArraySyntaxUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowShortArraySyntaxUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/OpeningBraceSameLineUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/OpeningBraceSameLineUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/OpeningBraceSameLineUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/AssignmentInConditionUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/AssignmentInConditionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyPHPStatementUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyPHPStatementUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyPHPStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyStatementUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopShouldBeWhileLoopUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopShouldBeWhileLoopUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopWithTestFunctionCallUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopWithTestFunctionCallUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/JumbledIncrementerUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/JumbledIncrementerUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnconditionalIfStatementUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnconditionalIfStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnnecessaryFinalModifierUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnnecessaryFinalModifierUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnusedFunctionParameterUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnusedFunctionParameterUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UselessOverridingMethodUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UselessOverridingMethodUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/FixmeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/FixmeUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/FixmeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/TodoUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/TodoUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/TodoUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/DisallowYodaConditionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/DisallowYodaConditionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/CSSLintUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/CSSLintUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/ClosureLinterUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/ClosureLinterUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/ESLintUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/ESLintUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/JSHintUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/JSHintUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ByteOrderMarkUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ByteOrderMarkUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.1.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.2.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.3.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.3.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.6.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.1.inc delete mode 100755 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineLengthUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineLengthUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineLengthUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineLengthUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineLengthUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LowercasedFilenameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LowercasedFilenameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneClassPerFileUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneClassPerFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneInterfacePerFileUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneInterfacePerFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneObjectStructurePerFileUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneObjectStructurePerFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneTraitPerFileUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneTraitPerFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/DisallowMultipleStatementsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/DisallowMultipleStatementsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/DisallowMultipleStatementsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/MultipleStatementAlignmentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/MultipleStatementAlignmentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/MultipleStatementAlignmentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/MultipleStatementAlignmentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/MultipleStatementAlignmentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/NoSpaceAfterCastUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/NoSpaceAfterCastUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/NoSpaceAfterCastUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterCastUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterCastUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterCastUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterNotUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterNotUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterNotUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterNotUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterNotUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceBeforeCastUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceBeforeCastUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceBeforeCastUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/CallTimePassByReferenceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/CallTimePassByReferenceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/FunctionCallArgumentSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/FunctionCallArgumentSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/FunctionCallArgumentSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceBsdAllmanUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceBsdAllmanUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceBsdAllmanUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceKernighanRitchieUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceKernighanRitchieUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceKernighanRitchieUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/CyclomaticComplexityUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/CyclomaticComplexityUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/NestingLevelUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/NestingLevelUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/CamelCapsFunctionNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/CamelCapsFunctionNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/ConstructorNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/ConstructorNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/UpperCaseConstantNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/UpperCaseConstantNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/BacktickOperatorUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/BacktickOperatorUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/CharacterBeforePHPOpeningTagUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/CharacterBeforePHPOpeningTagUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/CharacterBeforePHPOpeningTagUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/CharacterBeforePHPOpeningTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ClosingPHPTagUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ClosingPHPTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DeprecatedFunctionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DeprecatedFunctionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DiscourageGotoUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DiscourageGotoUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/SubversionPropertiesUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/SubversionPropertiesUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/CSS/BrowserSpecificStylesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/DisallowSelfActionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeOwnSystemSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeSystemSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/UnusedSystemSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Commenting/FunctionCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/DebugCodeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/FirebugConsoleSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/AssignThisSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/CreateWidgetTypeCallbackSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/DisallowNewWidgetSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/AjaxNullComparisonSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/GetRequestDataSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/ReturnFunctionValueSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Strings/JoinStringsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Classes/ClassDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/ClassCommentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FileCommentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FunctionCommentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/InlineCommentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/ControlSignatureStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/MultiLineConditionStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/IncludingFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/LineLengthStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Formatting/MultiLineAssignmentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionCallSignatureStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/ValidDefaultValueStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidClassNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidFunctionNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidVariableNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ObjectOperatorIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeClosingBraceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Classes/ClassDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FunctionCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/InlineCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Files/IncludingFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Formatting/MultiLineAssignmentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/ValidDefaultValueSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidClassNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidFunctionNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidVariableNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidClassNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidClassNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidFunctionNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidFunctionNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeIndentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Classes/ClassDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Files/SideEffectsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Methods/CamelCapsMethodNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.11.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.12.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Methods/CamelCapsMethodNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Methods/CamelCapsMethodNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClassInstantiationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/NullableTypeDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Keywords/ShortFormTypeKeywordsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Namespaces/CompoundNamespaceDepthStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Operators/OperatorSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/AnonClassDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClassInstantiationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClosingBraceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/BooleanOperatorPlacementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/ControlStructureSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/DeclareStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/FileHeaderSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/ImportStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/OpenTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/NullableTypeDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/ReturnTypeDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Keywords/ShortFormTypeKeywordsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Namespaces/CompoundNamespaceDepthSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Operators/OperatorSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Properties/ConstantVisibilitySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Traits/UseDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.10.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.11.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.11.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.12.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.12.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.13.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.14.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.15.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.7.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Namespaces/CompoundNamespaceDepthUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Namespaces/CompoundNamespaceDepthUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Properties/ConstantVisibilityUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Properties/ConstantVisibilityUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/ClassDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/PropertyDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ControlStructureSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ElseIfDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/SwitchDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/EndFileNewlineStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/MethodDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/NamespaceDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/UseDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/PropertyDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ControlStructureSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ElseIfDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.6.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.10.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.6.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.7.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.9.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.10.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.11.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.11.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.12.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.12.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.13.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.13.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.14.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.14.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.15.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.16.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.16.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.17.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayBracketSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/LowercaseClassKeywordsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/SelfMemberReferenceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/DocCommentAlignmentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/FunctionCommentThrowTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForEachLoopDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForLoopDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/LowercaseDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/FunctionDuplicateArgumentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/LowercaseFunctionKeywordsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Scope/StaticThisUsageStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Strings/EchoedStringsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/CastSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionOpeningBraceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeKeywordSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SemicolonSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColonSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColourDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateStyleDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ForbiddenStylesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/IndentationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/MissingColonSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/NamedColoursSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/OpacitySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/SemicolonSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ShorthandSizeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassFileNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/DuplicatePropertySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/LowercaseClassKeywordsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ValidClassNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClosingDeclarationCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/EmptyCatchCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/LongConditionClosingCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/PostStatementCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/VariableCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ElseIfDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/LowercaseDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/SwitchDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JSLintSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JavaScriptLintSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Files/FileExtensionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Formatting/OperatorBracketSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDuplicateArgumentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/GlobalFunctionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/LowercaseFunctionKeywordsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/DisallowObjectStringIndexSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectInstantiationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectMemberCommaSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ValidLogicalOperatorsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowBooleanStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowComparisonAssignmentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowInlineIfSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowMultipleAssignmentsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowSizeFunctionsInLoopsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DiscouragedFunctionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EmbeddedPhpSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EvalSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/GlobalKeywordSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/HeredocSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MemberVarScopeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MethodScopeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/StaticThisUsageSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/ConcatenationSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/DoubleQuoteUsageSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/EchoedStringsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/CastSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LogicalOperatorSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SemicolonSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.2.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClassCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClassCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/InnerFunctionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/InnerFunctionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MemberVarScopeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MemberVarScopeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MethodScopeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MethodScopeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.6.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Debug/CodeAnalyzerStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Files/ClosingTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/NamingConventions/ValidVariableNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Debug/CodeAnalyzerSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Files/ClosingTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/NamingConventions/ValidVariableNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.7.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Tokenizers/CSS.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Tokenizers/Comment.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Tokenizers/JS.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Tokenizers/PHP.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Tokenizers/Tokenizer.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/Cache.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/Common.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/Standards.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/Timing.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/Tokens.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/AllTests.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/AbstractMethodUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/AllTests.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/ErrorSuppressionTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/FindEndOfStatementTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/FindEndOfStatementTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/FindExtendedClassNameTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/FindExtendedClassNameTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/FindImplementedInterfaceNamesTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/FindImplementedInterfaceNamesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/GetMemberPropertiesTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/GetMemberPropertiesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodParametersTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodParametersTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodPropertiesTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodPropertiesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/IsReferenceTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/File/IsReferenceTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/IsCamelCapsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest-include.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTestable.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/AnonClassParenthesisOwnerTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/AnonClassParenthesisOwnerTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillFnTokenTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillFnTokenTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillNumericSeparatorTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillNumericSeparatorTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/FileList.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Standards/AbstractSniffUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Standards/AllSniffs.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/TestSuite.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/TestSuite7.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/bootstrap.php delete mode 100644 vendor/symfony/config/CHANGELOG.md delete mode 100644 vendor/symfony/config/ConfigCache.php delete mode 100644 vendor/symfony/config/ConfigCacheFactory.php delete mode 100644 vendor/symfony/config/ConfigCacheFactoryInterface.php delete mode 100644 vendor/symfony/config/ConfigCacheInterface.php delete mode 100644 vendor/symfony/config/Definition/ArrayNode.php delete mode 100644 vendor/symfony/config/Definition/BaseNode.php delete mode 100644 vendor/symfony/config/Definition/BooleanNode.php delete mode 100644 vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php delete mode 100644 vendor/symfony/config/Definition/Builder/BooleanNodeDefinition.php delete mode 100644 vendor/symfony/config/Definition/Builder/BuilderAwareInterface.php delete mode 100644 vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php delete mode 100644 vendor/symfony/config/Definition/Builder/ExprBuilder.php delete mode 100644 vendor/symfony/config/Definition/Builder/FloatNodeDefinition.php delete mode 100644 vendor/symfony/config/Definition/Builder/IntegerNodeDefinition.php delete mode 100644 vendor/symfony/config/Definition/Builder/MergeBuilder.php delete mode 100644 vendor/symfony/config/Definition/Builder/NodeBuilder.php delete mode 100644 vendor/symfony/config/Definition/Builder/NodeDefinition.php delete mode 100644 vendor/symfony/config/Definition/Builder/NodeParentInterface.php delete mode 100644 vendor/symfony/config/Definition/Builder/NormalizationBuilder.php delete mode 100644 vendor/symfony/config/Definition/Builder/NumericNodeDefinition.php delete mode 100644 vendor/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php delete mode 100644 vendor/symfony/config/Definition/Builder/ScalarNodeDefinition.php delete mode 100644 vendor/symfony/config/Definition/Builder/TreeBuilder.php delete mode 100644 vendor/symfony/config/Definition/Builder/ValidationBuilder.php delete mode 100644 vendor/symfony/config/Definition/Builder/VariableNodeDefinition.php delete mode 100644 vendor/symfony/config/Definition/ConfigurationInterface.php delete mode 100644 vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php delete mode 100644 vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php delete mode 100644 vendor/symfony/config/Definition/EnumNode.php delete mode 100644 vendor/symfony/config/Definition/Exception/DuplicateKeyException.php delete mode 100644 vendor/symfony/config/Definition/Exception/Exception.php delete mode 100644 vendor/symfony/config/Definition/Exception/ForbiddenOverwriteException.php delete mode 100644 vendor/symfony/config/Definition/Exception/InvalidConfigurationException.php delete mode 100644 vendor/symfony/config/Definition/Exception/InvalidDefinitionException.php delete mode 100644 vendor/symfony/config/Definition/Exception/InvalidTypeException.php delete mode 100644 vendor/symfony/config/Definition/Exception/UnsetKeyException.php delete mode 100644 vendor/symfony/config/Definition/FloatNode.php delete mode 100644 vendor/symfony/config/Definition/IntegerNode.php delete mode 100644 vendor/symfony/config/Definition/NodeInterface.php delete mode 100644 vendor/symfony/config/Definition/NumericNode.php delete mode 100644 vendor/symfony/config/Definition/Processor.php delete mode 100644 vendor/symfony/config/Definition/PrototypeNodeInterface.php delete mode 100644 vendor/symfony/config/Definition/PrototypedArrayNode.php delete mode 100644 vendor/symfony/config/Definition/ScalarNode.php delete mode 100644 vendor/symfony/config/Definition/VariableNode.php delete mode 100644 vendor/symfony/config/Exception/FileLoaderImportCircularReferenceException.php delete mode 100644 vendor/symfony/config/Exception/FileLocatorFileNotFoundException.php delete mode 100644 vendor/symfony/config/Exception/LoaderLoadException.php delete mode 100644 vendor/symfony/config/FileLocator.php delete mode 100644 vendor/symfony/config/FileLocatorInterface.php delete mode 100644 vendor/symfony/config/LICENSE delete mode 100644 vendor/symfony/config/Loader/DelegatingLoader.php delete mode 100644 vendor/symfony/config/Loader/FileLoader.php delete mode 100644 vendor/symfony/config/Loader/GlobFileLoader.php delete mode 100644 vendor/symfony/config/Loader/Loader.php delete mode 100644 vendor/symfony/config/Loader/LoaderInterface.php delete mode 100644 vendor/symfony/config/Loader/LoaderResolver.php delete mode 100644 vendor/symfony/config/Loader/LoaderResolverInterface.php delete mode 100644 vendor/symfony/config/README.md delete mode 100644 vendor/symfony/config/Resource/ClassExistenceResource.php delete mode 100644 vendor/symfony/config/Resource/ComposerResource.php delete mode 100644 vendor/symfony/config/Resource/DirectoryResource.php delete mode 100644 vendor/symfony/config/Resource/FileExistenceResource.php delete mode 100644 vendor/symfony/config/Resource/FileResource.php delete mode 100644 vendor/symfony/config/Resource/GlobResource.php delete mode 100644 vendor/symfony/config/Resource/ReflectionClassResource.php delete mode 100644 vendor/symfony/config/Resource/ResourceInterface.php delete mode 100644 vendor/symfony/config/Resource/SelfCheckingResourceChecker.php delete mode 100644 vendor/symfony/config/Resource/SelfCheckingResourceInterface.php delete mode 100644 vendor/symfony/config/ResourceCheckerConfigCache.php delete mode 100644 vendor/symfony/config/ResourceCheckerConfigCacheFactory.php delete mode 100644 vendor/symfony/config/ResourceCheckerInterface.php delete mode 100644 vendor/symfony/config/Util/Exception/InvalidXmlException.php delete mode 100644 vendor/symfony/config/Util/Exception/XmlParsingException.php delete mode 100644 vendor/symfony/config/Util/XmlUtils.php delete mode 100644 vendor/symfony/config/composer.json delete mode 100644 vendor/symfony/console/Application.php delete mode 100644 vendor/symfony/console/CHANGELOG.md delete mode 100644 vendor/symfony/console/Command/Command.php delete mode 100644 vendor/symfony/console/Command/HelpCommand.php delete mode 100644 vendor/symfony/console/Command/ListCommand.php delete mode 100644 vendor/symfony/console/Command/LockableTrait.php delete mode 100644 vendor/symfony/console/CommandLoader/CommandLoaderInterface.php delete mode 100644 vendor/symfony/console/CommandLoader/ContainerCommandLoader.php delete mode 100644 vendor/symfony/console/CommandLoader/FactoryCommandLoader.php delete mode 100644 vendor/symfony/console/ConsoleEvents.php delete mode 100644 vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php delete mode 100644 vendor/symfony/console/Descriptor/ApplicationDescription.php delete mode 100644 vendor/symfony/console/Descriptor/Descriptor.php delete mode 100644 vendor/symfony/console/Descriptor/DescriptorInterface.php delete mode 100644 vendor/symfony/console/Descriptor/JsonDescriptor.php delete mode 100644 vendor/symfony/console/Descriptor/MarkdownDescriptor.php delete mode 100644 vendor/symfony/console/Descriptor/TextDescriptor.php delete mode 100644 vendor/symfony/console/Descriptor/XmlDescriptor.php delete mode 100644 vendor/symfony/console/Event/ConsoleCommandEvent.php delete mode 100644 vendor/symfony/console/Event/ConsoleErrorEvent.php delete mode 100644 vendor/symfony/console/Event/ConsoleEvent.php delete mode 100644 vendor/symfony/console/Event/ConsoleTerminateEvent.php delete mode 100644 vendor/symfony/console/EventListener/ErrorListener.php delete mode 100644 vendor/symfony/console/Exception/CommandNotFoundException.php delete mode 100644 vendor/symfony/console/Exception/ExceptionInterface.php delete mode 100644 vendor/symfony/console/Exception/InvalidArgumentException.php delete mode 100644 vendor/symfony/console/Exception/InvalidOptionException.php delete mode 100644 vendor/symfony/console/Exception/LogicException.php delete mode 100644 vendor/symfony/console/Exception/MissingInputException.php delete mode 100644 vendor/symfony/console/Exception/NamespaceNotFoundException.php delete mode 100644 vendor/symfony/console/Exception/RuntimeException.php delete mode 100644 vendor/symfony/console/Formatter/OutputFormatter.php delete mode 100644 vendor/symfony/console/Formatter/OutputFormatterInterface.php delete mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyle.php delete mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php delete mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyleStack.php delete mode 100644 vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php delete mode 100644 vendor/symfony/console/Helper/DebugFormatterHelper.php delete mode 100644 vendor/symfony/console/Helper/DescriptorHelper.php delete mode 100644 vendor/symfony/console/Helper/Dumper.php delete mode 100644 vendor/symfony/console/Helper/FormatterHelper.php delete mode 100644 vendor/symfony/console/Helper/Helper.php delete mode 100644 vendor/symfony/console/Helper/HelperInterface.php delete mode 100644 vendor/symfony/console/Helper/HelperSet.php delete mode 100644 vendor/symfony/console/Helper/InputAwareHelper.php delete mode 100644 vendor/symfony/console/Helper/ProcessHelper.php delete mode 100644 vendor/symfony/console/Helper/ProgressBar.php delete mode 100644 vendor/symfony/console/Helper/ProgressIndicator.php delete mode 100644 vendor/symfony/console/Helper/QuestionHelper.php delete mode 100644 vendor/symfony/console/Helper/SymfonyQuestionHelper.php delete mode 100644 vendor/symfony/console/Helper/Table.php delete mode 100644 vendor/symfony/console/Helper/TableCell.php delete mode 100644 vendor/symfony/console/Helper/TableRows.php delete mode 100644 vendor/symfony/console/Helper/TableSeparator.php delete mode 100644 vendor/symfony/console/Helper/TableStyle.php delete mode 100644 vendor/symfony/console/Input/ArgvInput.php delete mode 100644 vendor/symfony/console/Input/ArrayInput.php delete mode 100644 vendor/symfony/console/Input/Input.php delete mode 100644 vendor/symfony/console/Input/InputArgument.php delete mode 100644 vendor/symfony/console/Input/InputAwareInterface.php delete mode 100644 vendor/symfony/console/Input/InputDefinition.php delete mode 100644 vendor/symfony/console/Input/InputInterface.php delete mode 100644 vendor/symfony/console/Input/InputOption.php delete mode 100644 vendor/symfony/console/Input/StreamableInputInterface.php delete mode 100644 vendor/symfony/console/Input/StringInput.php delete mode 100644 vendor/symfony/console/LICENSE delete mode 100644 vendor/symfony/console/Logger/ConsoleLogger.php delete mode 100644 vendor/symfony/console/Output/BufferedOutput.php delete mode 100644 vendor/symfony/console/Output/ConsoleOutput.php delete mode 100644 vendor/symfony/console/Output/ConsoleOutputInterface.php delete mode 100644 vendor/symfony/console/Output/ConsoleSectionOutput.php delete mode 100644 vendor/symfony/console/Output/NullOutput.php delete mode 100644 vendor/symfony/console/Output/Output.php delete mode 100644 vendor/symfony/console/Output/OutputInterface.php delete mode 100644 vendor/symfony/console/Output/StreamOutput.php delete mode 100644 vendor/symfony/console/Question/ChoiceQuestion.php delete mode 100644 vendor/symfony/console/Question/ConfirmationQuestion.php delete mode 100644 vendor/symfony/console/Question/Question.php delete mode 100644 vendor/symfony/console/README.md delete mode 100644 vendor/symfony/console/Resources/bin/hiddeninput.exe delete mode 100644 vendor/symfony/console/Style/OutputStyle.php delete mode 100644 vendor/symfony/console/Style/StyleInterface.php delete mode 100644 vendor/symfony/console/Style/SymfonyStyle.php delete mode 100644 vendor/symfony/console/Terminal.php delete mode 100644 vendor/symfony/console/Tester/ApplicationTester.php delete mode 100644 vendor/symfony/console/Tester/CommandTester.php delete mode 100644 vendor/symfony/console/Tester/TesterTrait.php delete mode 100644 vendor/symfony/console/composer.json delete mode 100644 vendor/symfony/dependency-injection/Alias.php delete mode 100644 vendor/symfony/dependency-injection/Argument/AbstractArgument.php delete mode 100644 vendor/symfony/dependency-injection/Argument/ArgumentInterface.php delete mode 100644 vendor/symfony/dependency-injection/Argument/BoundArgument.php delete mode 100644 vendor/symfony/dependency-injection/Argument/IteratorArgument.php delete mode 100644 vendor/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php delete mode 100644 vendor/symfony/dependency-injection/Argument/RewindableGenerator.php delete mode 100644 vendor/symfony/dependency-injection/Argument/ServiceClosureArgument.php delete mode 100644 vendor/symfony/dependency-injection/Argument/ServiceLocator.php delete mode 100644 vendor/symfony/dependency-injection/Argument/ServiceLocatorArgument.php delete mode 100644 vendor/symfony/dependency-injection/Argument/TaggedIteratorArgument.php delete mode 100644 vendor/symfony/dependency-injection/CHANGELOG.md delete mode 100644 vendor/symfony/dependency-injection/ChildDefinition.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/AutowirePass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/Compiler.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/CompilerPassInterface.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/PassConfig.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveBindingsPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveClassPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveHotPathPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolvePrivatesPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php delete mode 100644 vendor/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php delete mode 100644 vendor/symfony/dependency-injection/Config/ContainerParametersResource.php delete mode 100644 vendor/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php delete mode 100644 vendor/symfony/dependency-injection/Container.php delete mode 100644 vendor/symfony/dependency-injection/ContainerAwareInterface.php delete mode 100644 vendor/symfony/dependency-injection/ContainerAwareTrait.php delete mode 100644 vendor/symfony/dependency-injection/ContainerBuilder.php delete mode 100644 vendor/symfony/dependency-injection/ContainerInterface.php delete mode 100644 vendor/symfony/dependency-injection/Definition.php delete mode 100644 vendor/symfony/dependency-injection/Dumper/Dumper.php delete mode 100644 vendor/symfony/dependency-injection/Dumper/DumperInterface.php delete mode 100644 vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php delete mode 100644 vendor/symfony/dependency-injection/Dumper/PhpDumper.php delete mode 100644 vendor/symfony/dependency-injection/Dumper/Preloader.php delete mode 100644 vendor/symfony/dependency-injection/Dumper/XmlDumper.php delete mode 100644 vendor/symfony/dependency-injection/Dumper/YamlDumper.php delete mode 100644 vendor/symfony/dependency-injection/EnvVarLoaderInterface.php delete mode 100644 vendor/symfony/dependency-injection/EnvVarProcessor.php delete mode 100644 vendor/symfony/dependency-injection/EnvVarProcessorInterface.php delete mode 100644 vendor/symfony/dependency-injection/Exception/AutowiringFailedException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/BadMethodCallException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/EnvNotFoundException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/EnvParameterException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/ExceptionInterface.php delete mode 100644 vendor/symfony/dependency-injection/Exception/InvalidArgumentException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/InvalidParameterTypeException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/LogicException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/OutOfBoundsException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/ParameterNotFoundException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/RuntimeException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php delete mode 100644 vendor/symfony/dependency-injection/Exception/ServiceNotFoundException.php delete mode 100644 vendor/symfony/dependency-injection/ExpressionLanguage.php delete mode 100644 vendor/symfony/dependency-injection/ExpressionLanguageProvider.php delete mode 100644 vendor/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.php delete mode 100644 vendor/symfony/dependency-injection/Extension/Extension.php delete mode 100644 vendor/symfony/dependency-injection/Extension/ExtensionInterface.php delete mode 100644 vendor/symfony/dependency-injection/Extension/PrependExtensionInterface.php delete mode 100644 vendor/symfony/dependency-injection/LICENSE delete mode 100644 vendor/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php delete mode 100644 vendor/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php delete mode 100644 vendor/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php delete mode 100644 vendor/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php delete mode 100644 vendor/symfony/dependency-injection/LazyProxy/ProxyHelper.php delete mode 100644 vendor/symfony/dependency-injection/Loader/ClosureLoader.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/PrototypeConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/ReferenceConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/ServiceConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/ServicesConfigurator.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/AbstractTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/ArgumentTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/AutoconfigureTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/AutowireTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/BindTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/CallTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/ClassTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/ConfiguratorTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/DecorateTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/DeprecateTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/FactoryTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/FileTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/LazyTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/ParentTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/PropertyTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/PublicTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/ShareTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/SyntheticTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/Configurator/Traits/TagTrait.php delete mode 100644 vendor/symfony/dependency-injection/Loader/DirectoryLoader.php delete mode 100644 vendor/symfony/dependency-injection/Loader/FileLoader.php delete mode 100644 vendor/symfony/dependency-injection/Loader/GlobFileLoader.php delete mode 100644 vendor/symfony/dependency-injection/Loader/IniFileLoader.php delete mode 100644 vendor/symfony/dependency-injection/Loader/PhpFileLoader.php delete mode 100644 vendor/symfony/dependency-injection/Loader/XmlFileLoader.php delete mode 100644 vendor/symfony/dependency-injection/Loader/YamlFileLoader.php delete mode 100644 vendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsd delete mode 100644 vendor/symfony/dependency-injection/Parameter.php delete mode 100644 vendor/symfony/dependency-injection/ParameterBag/ContainerBag.php delete mode 100644 vendor/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php delete mode 100644 vendor/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php delete mode 100644 vendor/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php delete mode 100644 vendor/symfony/dependency-injection/ParameterBag/ParameterBag.php delete mode 100644 vendor/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php delete mode 100644 vendor/symfony/dependency-injection/README.md delete mode 100644 vendor/symfony/dependency-injection/Reference.php delete mode 100644 vendor/symfony/dependency-injection/ReverseContainer.php delete mode 100644 vendor/symfony/dependency-injection/ServiceLocator.php delete mode 100644 vendor/symfony/dependency-injection/TaggedContainerInterface.php delete mode 100644 vendor/symfony/dependency-injection/TypedReference.php delete mode 100644 vendor/symfony/dependency-injection/Variable.php delete mode 100644 vendor/symfony/dependency-injection/composer.json delete mode 100644 vendor/symfony/deprecation-contracts/.gitignore delete mode 100644 vendor/symfony/deprecation-contracts/CHANGELOG.md delete mode 100644 vendor/symfony/deprecation-contracts/LICENSE delete mode 100644 vendor/symfony/deprecation-contracts/README.md delete mode 100644 vendor/symfony/deprecation-contracts/composer.json delete mode 100644 vendor/symfony/deprecation-contracts/function.php delete mode 100644 vendor/symfony/event-dispatcher-contracts/.gitignore delete mode 100644 vendor/symfony/event-dispatcher-contracts/Event.php delete mode 100644 vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php delete mode 100644 vendor/symfony/event-dispatcher-contracts/LICENSE delete mode 100644 vendor/symfony/event-dispatcher-contracts/README.md delete mode 100644 vendor/symfony/event-dispatcher-contracts/composer.json delete mode 100644 vendor/symfony/event-dispatcher/CHANGELOG.md delete mode 100644 vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php delete mode 100644 vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php delete mode 100644 vendor/symfony/event-dispatcher/Debug/WrappedListener.php delete mode 100644 vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php delete mode 100644 vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php delete mode 100644 vendor/symfony/event-dispatcher/Event.php delete mode 100644 vendor/symfony/event-dispatcher/EventDispatcher.php delete mode 100644 vendor/symfony/event-dispatcher/EventDispatcherInterface.php delete mode 100644 vendor/symfony/event-dispatcher/EventSubscriberInterface.php delete mode 100644 vendor/symfony/event-dispatcher/GenericEvent.php delete mode 100644 vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php delete mode 100644 vendor/symfony/event-dispatcher/LICENSE delete mode 100644 vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php delete mode 100644 vendor/symfony/event-dispatcher/LegacyEventProxy.php delete mode 100644 vendor/symfony/event-dispatcher/README.md delete mode 100644 vendor/symfony/event-dispatcher/composer.json delete mode 100644 vendor/symfony/filesystem/CHANGELOG.md delete mode 100644 vendor/symfony/filesystem/Exception/ExceptionInterface.php delete mode 100644 vendor/symfony/filesystem/Exception/FileNotFoundException.php delete mode 100644 vendor/symfony/filesystem/Exception/IOException.php delete mode 100644 vendor/symfony/filesystem/Exception/IOExceptionInterface.php delete mode 100644 vendor/symfony/filesystem/Exception/InvalidArgumentException.php delete mode 100644 vendor/symfony/filesystem/Filesystem.php delete mode 100644 vendor/symfony/filesystem/LICENSE delete mode 100644 vendor/symfony/filesystem/README.md delete mode 100644 vendor/symfony/filesystem/composer.json delete mode 100644 vendor/symfony/finder/CHANGELOG.md delete mode 100644 vendor/symfony/finder/Comparator/Comparator.php delete mode 100644 vendor/symfony/finder/Comparator/DateComparator.php delete mode 100644 vendor/symfony/finder/Comparator/NumberComparator.php delete mode 100644 vendor/symfony/finder/Exception/AccessDeniedException.php delete mode 100644 vendor/symfony/finder/Exception/DirectoryNotFoundException.php delete mode 100644 vendor/symfony/finder/Finder.php delete mode 100644 vendor/symfony/finder/Gitignore.php delete mode 100644 vendor/symfony/finder/Glob.php delete mode 100644 vendor/symfony/finder/Iterator/CustomFilterIterator.php delete mode 100644 vendor/symfony/finder/Iterator/DateRangeFilterIterator.php delete mode 100644 vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php delete mode 100644 vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php delete mode 100644 vendor/symfony/finder/Iterator/FileTypeFilterIterator.php delete mode 100644 vendor/symfony/finder/Iterator/FilecontentFilterIterator.php delete mode 100644 vendor/symfony/finder/Iterator/FilenameFilterIterator.php delete mode 100644 vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php delete mode 100644 vendor/symfony/finder/Iterator/PathFilterIterator.php delete mode 100644 vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php delete mode 100644 vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php delete mode 100644 vendor/symfony/finder/Iterator/SortableIterator.php delete mode 100644 vendor/symfony/finder/LICENSE delete mode 100644 vendor/symfony/finder/README.md delete mode 100644 vendor/symfony/finder/SplFileInfo.php delete mode 100644 vendor/symfony/finder/composer.json delete mode 100644 vendor/symfony/options-resolver/CHANGELOG.md delete mode 100644 vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php delete mode 100644 vendor/symfony/options-resolver/Exception/AccessException.php delete mode 100644 vendor/symfony/options-resolver/Exception/ExceptionInterface.php delete mode 100644 vendor/symfony/options-resolver/Exception/InvalidArgumentException.php delete mode 100644 vendor/symfony/options-resolver/Exception/InvalidOptionsException.php delete mode 100644 vendor/symfony/options-resolver/Exception/MissingOptionsException.php delete mode 100644 vendor/symfony/options-resolver/Exception/NoConfigurationException.php delete mode 100644 vendor/symfony/options-resolver/Exception/NoSuchOptionException.php delete mode 100644 vendor/symfony/options-resolver/Exception/OptionDefinitionException.php delete mode 100644 vendor/symfony/options-resolver/Exception/UndefinedOptionsException.php delete mode 100644 vendor/symfony/options-resolver/LICENSE delete mode 100644 vendor/symfony/options-resolver/OptionConfigurator.php delete mode 100644 vendor/symfony/options-resolver/Options.php delete mode 100644 vendor/symfony/options-resolver/OptionsResolver.php delete mode 100644 vendor/symfony/options-resolver/README.md delete mode 100644 vendor/symfony/options-resolver/composer.json delete mode 100644 vendor/symfony/polyfill-ctype/Ctype.php delete mode 100644 vendor/symfony/polyfill-ctype/LICENSE delete mode 100644 vendor/symfony/polyfill-ctype/README.md delete mode 100644 vendor/symfony/polyfill-ctype/bootstrap.php delete mode 100644 vendor/symfony/polyfill-ctype/composer.json delete mode 100644 vendor/symfony/polyfill-mbstring/LICENSE delete mode 100644 vendor/symfony/polyfill-mbstring/Mbstring.php delete mode 100644 vendor/symfony/polyfill-mbstring/README.md delete mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php delete mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php delete mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php delete mode 100644 vendor/symfony/polyfill-mbstring/bootstrap.php delete mode 100644 vendor/symfony/polyfill-mbstring/composer.json delete mode 100644 vendor/symfony/polyfill-php70/LICENSE delete mode 100644 vendor/symfony/polyfill-php70/Php70.php delete mode 100644 vendor/symfony/polyfill-php70/README.md delete mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php delete mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/AssertionError.php delete mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php delete mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/Error.php delete mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/ParseError.php delete mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php delete mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/TypeError.php delete mode 100644 vendor/symfony/polyfill-php70/bootstrap.php delete mode 100644 vendor/symfony/polyfill-php70/composer.json delete mode 100644 vendor/symfony/polyfill-php72/LICENSE delete mode 100644 vendor/symfony/polyfill-php72/Php72.php delete mode 100644 vendor/symfony/polyfill-php72/README.md delete mode 100644 vendor/symfony/polyfill-php72/bootstrap.php delete mode 100644 vendor/symfony/polyfill-php72/composer.json delete mode 100644 vendor/symfony/polyfill-php73/LICENSE delete mode 100644 vendor/symfony/polyfill-php73/Php73.php delete mode 100644 vendor/symfony/polyfill-php73/README.md delete mode 100644 vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php delete mode 100644 vendor/symfony/polyfill-php73/bootstrap.php delete mode 100644 vendor/symfony/polyfill-php73/composer.json delete mode 100644 vendor/symfony/polyfill-php80/LICENSE delete mode 100644 vendor/symfony/polyfill-php80/Php80.php delete mode 100644 vendor/symfony/polyfill-php80/README.md delete mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php delete mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php delete mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php delete mode 100644 vendor/symfony/polyfill-php80/bootstrap.php delete mode 100644 vendor/symfony/polyfill-php80/composer.json delete mode 100644 vendor/symfony/process/CHANGELOG.md delete mode 100644 vendor/symfony/process/Exception/ExceptionInterface.php delete mode 100644 vendor/symfony/process/Exception/InvalidArgumentException.php delete mode 100644 vendor/symfony/process/Exception/LogicException.php delete mode 100644 vendor/symfony/process/Exception/ProcessFailedException.php delete mode 100644 vendor/symfony/process/Exception/ProcessSignaledException.php delete mode 100644 vendor/symfony/process/Exception/ProcessTimedOutException.php delete mode 100644 vendor/symfony/process/Exception/RuntimeException.php delete mode 100644 vendor/symfony/process/ExecutableFinder.php delete mode 100644 vendor/symfony/process/InputStream.php delete mode 100644 vendor/symfony/process/LICENSE delete mode 100644 vendor/symfony/process/PhpExecutableFinder.php delete mode 100644 vendor/symfony/process/PhpProcess.php delete mode 100644 vendor/symfony/process/Pipes/AbstractPipes.php delete mode 100644 vendor/symfony/process/Pipes/PipesInterface.php delete mode 100644 vendor/symfony/process/Pipes/UnixPipes.php delete mode 100644 vendor/symfony/process/Pipes/WindowsPipes.php delete mode 100644 vendor/symfony/process/Process.php delete mode 100644 vendor/symfony/process/ProcessUtils.php delete mode 100644 vendor/symfony/process/README.md delete mode 100644 vendor/symfony/process/composer.json delete mode 100644 vendor/symfony/service-contracts/.gitignore delete mode 100644 vendor/symfony/service-contracts/CHANGELOG.md delete mode 100644 vendor/symfony/service-contracts/LICENSE delete mode 100644 vendor/symfony/service-contracts/README.md delete mode 100644 vendor/symfony/service-contracts/ResetInterface.php delete mode 100644 vendor/symfony/service-contracts/ServiceLocatorTrait.php delete mode 100644 vendor/symfony/service-contracts/ServiceProviderInterface.php delete mode 100644 vendor/symfony/service-contracts/ServiceSubscriberInterface.php delete mode 100644 vendor/symfony/service-contracts/ServiceSubscriberTrait.php delete mode 100644 vendor/symfony/service-contracts/Test/ServiceLocatorTest.php delete mode 100644 vendor/symfony/service-contracts/composer.json delete mode 100644 vendor/symfony/stopwatch/CHANGELOG.md delete mode 100644 vendor/symfony/stopwatch/LICENSE delete mode 100644 vendor/symfony/stopwatch/README.md delete mode 100644 vendor/symfony/stopwatch/Section.php delete mode 100644 vendor/symfony/stopwatch/Stopwatch.php delete mode 100644 vendor/symfony/stopwatch/StopwatchEvent.php delete mode 100644 vendor/symfony/stopwatch/StopwatchPeriod.php delete mode 100644 vendor/symfony/stopwatch/composer.json delete mode 100644 vendor/theseer/tokenizer/.php_cs.dist delete mode 100644 vendor/theseer/tokenizer/CHANGELOG.md delete mode 100644 vendor/theseer/tokenizer/LICENSE delete mode 100644 vendor/theseer/tokenizer/README.md delete mode 100644 vendor/theseer/tokenizer/composer.json delete mode 100644 vendor/theseer/tokenizer/src/Exception.php delete mode 100644 vendor/theseer/tokenizer/src/NamespaceUri.php delete mode 100644 vendor/theseer/tokenizer/src/NamespaceUriException.php delete mode 100644 vendor/theseer/tokenizer/src/Token.php delete mode 100644 vendor/theseer/tokenizer/src/TokenCollection.php delete mode 100644 vendor/theseer/tokenizer/src/TokenCollectionException.php delete mode 100644 vendor/theseer/tokenizer/src/Tokenizer.php delete mode 100644 vendor/theseer/tokenizer/src/XMLSerializer.php delete mode 100644 vendor/webmozart/assert/.editorconfig delete mode 100644 vendor/webmozart/assert/CHANGELOG.md delete mode 100644 vendor/webmozart/assert/LICENSE delete mode 100644 vendor/webmozart/assert/README.md delete mode 100644 vendor/webmozart/assert/composer.json delete mode 100644 vendor/webmozart/assert/psalm.xml delete mode 100644 vendor/webmozart/assert/src/Assert.php delete mode 100644 vendor/webmozart/assert/src/Mixin.php diff --git a/.gitignore b/.gitignore index 49be51d..e51de69 100755 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -*SearchCommands.phpvendor +*SearchCommands.php +vendor diff --git a/vendor/autoload.php b/vendor/autoload.php deleted file mode 100644 index 19aba9a..0000000 --- a/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - private $classMapAuthoritative = false; - private $missingClasses = array(); - private $apcuPrefix; - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE deleted file mode 100644 index f27399a..0000000 --- a/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php deleted file mode 100644 index 3b45da8..0000000 --- a/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,745 +0,0 @@ - $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php', - 'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php', - 'DivisionByZeroError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php', - 'Error' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/Error.php', - 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', - 'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', - 'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', - 'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', - 'PHPUnit\\Framework\\CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', - 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', - 'PHPUnit\\Framework\\Constraint\\Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', - 'PHPUnit\\Framework\\Constraint\\ClassHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', - 'PHPUnit\\Framework\\Constraint\\ClassHasStaticAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', - 'PHPUnit\\Framework\\Constraint\\Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', - 'PHPUnit\\Framework\\Constraint\\Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Count.php', - 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php', - 'PHPUnit\\Framework\\Constraint\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessage' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessageRegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', - 'PHPUnit\\Framework\\Constraint\\GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', - 'PHPUnit\\Framework\\Constraint\\IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', - 'PHPUnit\\Framework\\Constraint\\IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', - 'PHPUnit\\Framework\\Constraint\\IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualCanonicalizing' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqualCanonicalizing.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualIgnoringCase' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqualIgnoringCase.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualWithDelta' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqualWithDelta.php', - 'PHPUnit\\Framework\\Constraint\\IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', - 'PHPUnit\\Framework\\Constraint\\IsFinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php', - 'PHPUnit\\Framework\\Constraint\\IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\IsInfinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php', - 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', - 'PHPUnit\\Framework\\Constraint\\IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', - 'PHPUnit\\Framework\\Constraint\\IsNan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php', - 'PHPUnit\\Framework\\Constraint\\IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', - 'PHPUnit\\Framework\\Constraint\\IsReadable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php', - 'PHPUnit\\Framework\\Constraint\\IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', - 'PHPUnit\\Framework\\Constraint\\IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', - 'PHPUnit\\Framework\\Constraint\\IsWritable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php', - 'PHPUnit\\Framework\\Constraint\\JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', - 'PHPUnit\\Framework\\Constraint\\JsonMatchesErrorMessageProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php', - 'PHPUnit\\Framework\\Constraint\\LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', - 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php', - 'PHPUnit\\Framework\\Constraint\\LogicalNot' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php', - 'PHPUnit\\Framework\\Constraint\\LogicalOr' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php', - 'PHPUnit\\Framework\\Constraint\\LogicalXor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php', - 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', - 'PHPUnit\\Framework\\Constraint\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', - 'PHPUnit\\Framework\\Constraint\\StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', - 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', - 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php', - 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', - 'PHPUnit\\Framework\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php', - 'PHPUnit\\Framework\\DataProviderTestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', - 'PHPUnit\\Framework\\Error\\Deprecated' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', - 'PHPUnit\\Framework\\Error\\Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Error.php', - 'PHPUnit\\Framework\\Error\\Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Notice.php', - 'PHPUnit\\Framework\\Error\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Warning.php', - 'PHPUnit\\Framework\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Exception.php', - 'PHPUnit\\Framework\\ExceptionWrapper' => $vendorDir . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', - 'PHPUnit\\Framework\\ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', - 'PHPUnit\\Framework\\IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTest.php', - 'PHPUnit\\Framework\\IncompleteTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', - 'PHPUnit\\Framework\\IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php', - 'PHPUnit\\Framework\\InvalidArgumentException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', - 'PHPUnit\\Framework\\InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', - 'PHPUnit\\Framework\\InvalidDataProviderException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', - 'PHPUnit\\Framework\\InvalidParameterGroupException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php', - 'PHPUnit\\Framework\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php', - 'PHPUnit\\Framework\\MockObject\\Api' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/Api.php', - 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', - 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', - 'PHPUnit\\Framework\\MockObject\\ConfigurableMethodsAlreadyInitializedException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php', - 'PHPUnit\\Framework\\MockObject\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Generator' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', - 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', - 'PHPUnit\\Framework\\MockObject\\Invocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invocation.php', - 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php', - 'PHPUnit\\Framework\\MockObject\\Matcher' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', - 'PHPUnit\\Framework\\MockObject\\Method' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/Method.php', - 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php', - 'PHPUnit\\Framework\\MockObject\\MockBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', - 'PHPUnit\\Framework\\MockObject\\MockClass' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockClass.php', - 'PHPUnit\\Framework\\MockObject\\MockMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockMethod.php', - 'PHPUnit\\Framework\\MockObject\\MockMethodSet' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php', - 'PHPUnit\\Framework\\MockObject\\MockObject' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', - 'PHPUnit\\Framework\\MockObject\\MockTrait' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockTrait.php', - 'PHPUnit\\Framework\\MockObject\\MockType' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockType.php', - 'PHPUnit\\Framework\\MockObject\\MockedCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtIndex' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php', - 'PHPUnit\\Framework\\MockObject\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', - 'PHPUnit\\Framework\\MockObject\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php', - 'PHPUnit\\Framework\\MockObject\\UnmockedCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\Verifiable' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', - 'PHPUnit\\Framework\\NoChildTestSuiteException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', - 'PHPUnit\\Framework\\OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/OutputError.php', - 'PHPUnit\\Framework\\PHPTAssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php', - 'PHPUnit\\Framework\\RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php', - 'PHPUnit\\Framework\\SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php', - 'PHPUnit\\Framework\\SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTest.php', - 'PHPUnit\\Framework\\SkippedTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', - 'PHPUnit\\Framework\\SkippedTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php', - 'PHPUnit\\Framework\\SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php', - 'PHPUnit\\Framework\\SyntheticError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SyntheticError.php', - 'PHPUnit\\Framework\\SyntheticSkippedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php', - 'PHPUnit\\Framework\\Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php', - 'PHPUnit\\Framework\\TestBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/TestBuilder.php', - 'PHPUnit\\Framework\\TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php', - 'PHPUnit\\Framework\\TestFailure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestFailure.php', - 'PHPUnit\\Framework\\TestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListener.php', - 'PHPUnit\\Framework\\TestListenerDefaultImplementation' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php', - 'PHPUnit\\Framework\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Framework/TestResult.php', - 'PHPUnit\\Framework\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php', - 'PHPUnit\\Framework\\TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', - 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php', - 'PHPUnit\\Framework\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Warning.php', - 'PHPUnit\\Framework\\WarningTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/WarningTestCase.php', - 'PHPUnit\\Runner\\AfterIncompleteTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', - 'PHPUnit\\Runner\\AfterLastTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', - 'PHPUnit\\Runner\\AfterRiskyTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', - 'PHPUnit\\Runner\\AfterSkippedTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', - 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', - 'PHPUnit\\Runner\\AfterTestErrorHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', - 'PHPUnit\\Runner\\AfterTestFailureHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', - 'PHPUnit\\Runner\\AfterTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php', - 'PHPUnit\\Runner\\AfterTestWarningHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', - 'PHPUnit\\Runner\\BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', - 'PHPUnit\\Runner\\BeforeFirstTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', - 'PHPUnit\\Runner\\BeforeTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', - 'PHPUnit\\Runner\\DefaultTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/DefaultTestResultCache.php', - 'PHPUnit\\Runner\\Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php', - 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', - 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', - 'PHPUnit\\Runner\\Hook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/Hook.php', - 'PHPUnit\\Runner\\NullTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/NullTestResultCache.php', - 'PHPUnit\\Runner\\PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Runner/PhptTestCase.php', - 'PHPUnit\\Runner\\ResultCacheExtension' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', - 'PHPUnit\\Runner\\StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', - 'PHPUnit\\Runner\\TestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', - 'PHPUnit\\Runner\\TestListenerAdapter' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', - 'PHPUnit\\Runner\\TestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResultCache.php', - 'PHPUnit\\Runner\\TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', - 'PHPUnit\\Runner\\TestSuiteSorter' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', - 'PHPUnit\\Runner\\Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', - 'PHPUnit\\TextUI\\Arguments\\Arguments' => $vendorDir . '/phpunit/phpunit/src/TextUI/Arguments/Arguments.php', - 'PHPUnit\\TextUI\\Arguments\\ArgumentsBuilder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Arguments/ArgumentsBuilder.php', - 'PHPUnit\\TextUI\\Arguments\\ArgumentsMapper' => $vendorDir . '/phpunit/phpunit/src/TextUI/Arguments/ArgumentsMapper.php', - 'PHPUnit\\TextUI\\Arguments\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Arguments/Exception.php', - 'PHPUnit\\TextUI\\Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php', - 'PHPUnit\\TextUI\\Configuration\\Configuration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Configuration.php', - 'PHPUnit\\TextUI\\Configuration\\Constant' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHP/Constant.php', - 'PHPUnit\\TextUI\\Configuration\\ConstantCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHP/ConstantCollection.php', - 'PHPUnit\\TextUI\\Configuration\\ConstantCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHP/ConstantCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Directory' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/Directory.php', - 'PHPUnit\\TextUI\\Configuration\\DirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/DirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\DirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/DirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception.php', - 'PHPUnit\\TextUI\\Configuration\\Extension' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/Extension.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/ExtensionCollection.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/ExtensionCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionHandler' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/ExtensionHandler.php', - 'PHPUnit\\TextUI\\Configuration\\File' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/File.php', - 'PHPUnit\\TextUI\\Configuration\\FileCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/FileCollection.php', - 'PHPUnit\\TextUI\\Configuration\\FileCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/FileCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Filter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filter/Filter.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectory' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterDirectory.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterDirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterDirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\FilterFile' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterFile.php', - 'PHPUnit\\TextUI\\Configuration\\FilterFileCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterFileCollection.php', - 'PHPUnit\\TextUI\\Configuration\\FilterFileCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterFileCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Generator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Generator.php', - 'PHPUnit\\TextUI\\Configuration\\Group' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Group/Group.php', - 'PHPUnit\\TextUI\\Configuration\\GroupCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Group/GroupCollection.php', - 'PHPUnit\\TextUI\\Configuration\\GroupCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Group/GroupCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Groups' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Group/Groups.php', - 'PHPUnit\\TextUI\\Configuration\\IniSetting' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHP/IniSetting.php', - 'PHPUnit\\TextUI\\Configuration\\IniSettingCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHP/IniSettingCollection.php', - 'PHPUnit\\TextUI\\Configuration\\IniSettingCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHP/IniSettingCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Loader' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Loader.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Clover' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Clover.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Crap4j' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Crap4j.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Html' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Html.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Php' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Php.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Text' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Text.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Xml' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Xml.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\Junit' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/Junit.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\Logging' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/Logging.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\PlainText' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/PlainText.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\TeamCity' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/TeamCity.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\TestDox\\Html' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/TestDox/Html.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\TestDox\\Text' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/TestDox/Text.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\TestDox\\Xml' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Logging/TestDox/Xml.php', - 'PHPUnit\\TextUI\\Configuration\\PHPUnit' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/PHPUnit.php', - 'PHPUnit\\TextUI\\Configuration\\Php' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHP/Php.php', - 'PHPUnit\\TextUI\\Configuration\\PhpHandler' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHP/PhpHandler.php', - 'PHPUnit\\TextUI\\Configuration\\Registry' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Registry.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectory' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestDirectory.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestDirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestDirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\TestFile' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestFile.php', - 'PHPUnit\\TextUI\\Configuration\\TestFileCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestFileCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestFileCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestFileCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuite.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuiteCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuiteCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteMapper' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuiteMapper.php', - 'PHPUnit\\TextUI\\Configuration\\Variable' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHP/Variable.php', - 'PHPUnit\\TextUI\\Configuration\\VariableCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHP/VariableCollection.php', - 'PHPUnit\\TextUI\\Configuration\\VariableCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PHP/VariableCollectionIterator.php', - 'PHPUnit\\TextUI\\DefaultResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php', - 'PHPUnit\\TextUI\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception.php', - 'PHPUnit\\TextUI\\Help' => $vendorDir . '/phpunit/phpunit/src/TextUI/Help.php', - 'PHPUnit\\TextUI\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', - 'PHPUnit\\TextUI\\TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php', - 'PHPUnit\\Util\\Annotation\\DocBlock' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', - 'PHPUnit\\Util\\Annotation\\Registry' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/Registry.php', - 'PHPUnit\\Util\\Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php', - 'PHPUnit\\Util\\Color' => $vendorDir . '/phpunit/phpunit/src/Util/Color.php', - 'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', - 'PHPUnit\\Util\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Exception.php', - 'PHPUnit\\Util\\FileLoader' => $vendorDir . '/phpunit/phpunit/src/Util/FileLoader.php', - 'PHPUnit\\Util\\Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', - 'PHPUnit\\Util\\Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', - 'PHPUnit\\Util\\Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php', - 'PHPUnit\\Util\\GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php', - 'PHPUnit\\Util\\InvalidDataSetException' => $vendorDir . '/phpunit/phpunit/src/Util/InvalidDataSetException.php', - 'PHPUnit\\Util\\Json' => $vendorDir . '/phpunit/phpunit/src/Util/Json.php', - 'PHPUnit\\Util\\Log\\JUnit' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JUnit.php', - 'PHPUnit\\Util\\Log\\TeamCity' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TeamCity.php', - 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', - 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', - 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', - 'PHPUnit\\Util\\Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php', - 'PHPUnit\\Util\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Util/RegularExpression.php', - 'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', - 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', - 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', - 'PHPUnit\\Util\\TestDox\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\TestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php', - 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', - 'PHPUnit\\Util\\TextTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', - 'PHPUnit\\Util\\Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php', - 'PHPUnit\\Util\\VersionComparisonOperator' => $vendorDir . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', - 'PHPUnit\\Util\\XdebugFilterScriptGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php', - 'PHPUnit\\Util\\Xml' => $vendorDir . '/phpunit/phpunit/src/Util/Xml.php', - 'PHPUnit\\Util\\XmlTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', - 'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ABSTRACT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AMPERSAND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AND_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOLEAN_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOL_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BREAK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CALLABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CARET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CASE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CATCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS_NAME_CONSTANT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLONE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COALESCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COALESCE_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONTINUE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CURLY_OPEN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DEC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DEFAULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIV' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIV_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOC_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOLLAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_QUOTES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELLIPSIS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELSE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELSEIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EMPTY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENCAPSED_AND_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDDECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDFOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDFOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXTENDS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FINAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FINALLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FUNC_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GLOBAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GOTO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INLINE_HTML' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INSTANCEOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INSTEADOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INTERFACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ISSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_GREATER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_NOT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_XOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_METHOD_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MINUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MINUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MOD_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MUL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NAMESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_TAG_WITH_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PERCENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PIPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PLUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PLUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_POW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_POW_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PRINT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PRIVATE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PROTECTED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PUBLIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_QUESTION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_REQUIRE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_START_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STATIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php', - 'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', - 'PHP_Token_THROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TILDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_USE_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Util' => $vendorDir . '/phpunit/php-token-stream/src/Token/Util.php', - 'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'ParseError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ParseError.php', - 'PharIo\\Manifest\\Application' => $vendorDir . '/phar-io/manifest/src/values/Application.php', - 'PharIo\\Manifest\\ApplicationName' => $vendorDir . '/phar-io/manifest/src/values/ApplicationName.php', - 'PharIo\\Manifest\\Author' => $vendorDir . '/phar-io/manifest/src/values/Author.php', - 'PharIo\\Manifest\\AuthorCollection' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollection.php', - 'PharIo\\Manifest\\AuthorCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', - 'PharIo\\Manifest\\AuthorElement' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElement.php', - 'PharIo\\Manifest\\AuthorElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElementCollection.php', - 'PharIo\\Manifest\\BundledComponent' => $vendorDir . '/phar-io/manifest/src/values/BundledComponent.php', - 'PharIo\\Manifest\\BundledComponentCollection' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollection.php', - 'PharIo\\Manifest\\BundledComponentCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', - 'PharIo\\Manifest\\BundlesElement' => $vendorDir . '/phar-io/manifest/src/xml/BundlesElement.php', - 'PharIo\\Manifest\\ComponentElement' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElement.php', - 'PharIo\\Manifest\\ComponentElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElementCollection.php', - 'PharIo\\Manifest\\ContainsElement' => $vendorDir . '/phar-io/manifest/src/xml/ContainsElement.php', - 'PharIo\\Manifest\\CopyrightElement' => $vendorDir . '/phar-io/manifest/src/xml/CopyrightElement.php', - 'PharIo\\Manifest\\CopyrightInformation' => $vendorDir . '/phar-io/manifest/src/values/CopyrightInformation.php', - 'PharIo\\Manifest\\ElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ElementCollection.php', - 'PharIo\\Manifest\\Email' => $vendorDir . '/phar-io/manifest/src/values/Email.php', - 'PharIo\\Manifest\\Exception' => $vendorDir . '/phar-io/manifest/src/exceptions/Exception.php', - 'PharIo\\Manifest\\ExtElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtElement.php', - 'PharIo\\Manifest\\ExtElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ExtElementCollection.php', - 'PharIo\\Manifest\\Extension' => $vendorDir . '/phar-io/manifest/src/values/Extension.php', - 'PharIo\\Manifest\\ExtensionElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtensionElement.php', - 'PharIo\\Manifest\\InvalidApplicationNameException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', - 'PharIo\\Manifest\\InvalidEmailException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', - 'PharIo\\Manifest\\InvalidUrlException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', - 'PharIo\\Manifest\\Library' => $vendorDir . '/phar-io/manifest/src/values/Library.php', - 'PharIo\\Manifest\\License' => $vendorDir . '/phar-io/manifest/src/values/License.php', - 'PharIo\\Manifest\\LicenseElement' => $vendorDir . '/phar-io/manifest/src/xml/LicenseElement.php', - 'PharIo\\Manifest\\Manifest' => $vendorDir . '/phar-io/manifest/src/values/Manifest.php', - 'PharIo\\Manifest\\ManifestDocument' => $vendorDir . '/phar-io/manifest/src/xml/ManifestDocument.php', - 'PharIo\\Manifest\\ManifestDocumentException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', - 'PharIo\\Manifest\\ManifestDocumentLoadingException' => $vendorDir . '/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php', - 'PharIo\\Manifest\\ManifestDocumentMapper' => $vendorDir . '/phar-io/manifest/src/ManifestDocumentMapper.php', - 'PharIo\\Manifest\\ManifestDocumentMapperException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', - 'PharIo\\Manifest\\ManifestElement' => $vendorDir . '/phar-io/manifest/src/xml/ManifestElement.php', - 'PharIo\\Manifest\\ManifestElementException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestElementException.php', - 'PharIo\\Manifest\\ManifestLoader' => $vendorDir . '/phar-io/manifest/src/ManifestLoader.php', - 'PharIo\\Manifest\\ManifestLoaderException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', - 'PharIo\\Manifest\\ManifestSerializer' => $vendorDir . '/phar-io/manifest/src/ManifestSerializer.php', - 'PharIo\\Manifest\\PhpElement' => $vendorDir . '/phar-io/manifest/src/xml/PhpElement.php', - 'PharIo\\Manifest\\PhpExtensionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', - 'PharIo\\Manifest\\PhpVersionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpVersionRequirement.php', - 'PharIo\\Manifest\\Requirement' => $vendorDir . '/phar-io/manifest/src/values/Requirement.php', - 'PharIo\\Manifest\\RequirementCollection' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollection.php', - 'PharIo\\Manifest\\RequirementCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', - 'PharIo\\Manifest\\RequiresElement' => $vendorDir . '/phar-io/manifest/src/xml/RequiresElement.php', - 'PharIo\\Manifest\\Type' => $vendorDir . '/phar-io/manifest/src/values/Type.php', - 'PharIo\\Manifest\\Url' => $vendorDir . '/phar-io/manifest/src/values/Url.php', - 'PharIo\\Version\\AbstractVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', - 'PharIo\\Version\\AndVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', - 'PharIo\\Version\\AnyVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AnyVersionConstraint.php', - 'PharIo\\Version\\ExactVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/ExactVersionConstraint.php', - 'PharIo\\Version\\Exception' => $vendorDir . '/phar-io/version/src/exceptions/Exception.php', - 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', - 'PharIo\\Version\\InvalidPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', - 'PharIo\\Version\\InvalidVersionException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidVersionException.php', - 'PharIo\\Version\\OrVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', - 'PharIo\\Version\\PreReleaseSuffix' => $vendorDir . '/phar-io/version/src/PreReleaseSuffix.php', - 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', - 'PharIo\\Version\\SpecificMajorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', - 'PharIo\\Version\\UnsupportedVersionConstraintException' => $vendorDir . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', - 'PharIo\\Version\\Version' => $vendorDir . '/phar-io/version/src/Version.php', - 'PharIo\\Version\\VersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/VersionConstraint.php', - 'PharIo\\Version\\VersionConstraintParser' => $vendorDir . '/phar-io/version/src/VersionConstraintParser.php', - 'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php', - 'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php', - 'PhpCsFixer\\Diff\\GeckoPackages\\DiffOutputBuilder\\ConfigurationException' => $vendorDir . '/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/ConfigurationException.php', - 'PhpCsFixer\\Diff\\GeckoPackages\\DiffOutputBuilder\\UnifiedDiffOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/UnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\v1_4\\Chunk' => $vendorDir . '/php-cs-fixer/diff/src/v1_4/Chunk.php', - 'PhpCsFixer\\Diff\\v1_4\\Diff' => $vendorDir . '/php-cs-fixer/diff/src/v1_4/Diff.php', - 'PhpCsFixer\\Diff\\v1_4\\Differ' => $vendorDir . '/php-cs-fixer/diff/src/v1_4/Differ.php', - 'PhpCsFixer\\Diff\\v1_4\\LCS\\LongestCommonSubsequence' => $vendorDir . '/php-cs-fixer/diff/src/v1_4/LCS/LongestCommonSubsequence.php', - 'PhpCsFixer\\Diff\\v1_4\\LCS\\MemoryEfficientImplementation' => $vendorDir . '/php-cs-fixer/diff/src/v1_4/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php', - 'PhpCsFixer\\Diff\\v1_4\\LCS\\TimeEfficientImplementation' => $vendorDir . '/php-cs-fixer/diff/src/v1_4/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php', - 'PhpCsFixer\\Diff\\v1_4\\Line' => $vendorDir . '/php-cs-fixer/diff/src/v1_4/Line.php', - 'PhpCsFixer\\Diff\\v1_4\\Parser' => $vendorDir . '/php-cs-fixer/diff/src/v1_4/Parser.php', - 'PhpCsFixer\\Diff\\v2_0\\Chunk' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/Chunk.php', - 'PhpCsFixer\\Diff\\v2_0\\Diff' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/Diff.php', - 'PhpCsFixer\\Diff\\v2_0\\Differ' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/Differ.php', - 'PhpCsFixer\\Diff\\v2_0\\Exception' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/Exception/Exception.php', - 'PhpCsFixer\\Diff\\v2_0\\InvalidArgumentException' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/Exception/InvalidArgumentException.php', - 'PhpCsFixer\\Diff\\v2_0\\Line' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/Line.php', - 'PhpCsFixer\\Diff\\v2_0\\LongestCommonSubsequenceCalculator' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/LongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\v2_0\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\v2_0\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/Output/AbstractChunkOutputBuilder.php', - 'PhpCsFixer\\Diff\\v2_0\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/Output/DiffOnlyOutputBuilder.php', - 'PhpCsFixer\\Diff\\v2_0\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/Output/DiffOutputBuilderInterface.php', - 'PhpCsFixer\\Diff\\v2_0\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/Output/UnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\v2_0\\Parser' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/Parser.php', - 'PhpCsFixer\\Diff\\v2_0\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/php-cs-fixer/diff/src/v2_0/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\v3_0\\Chunk' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Chunk.php', - 'PhpCsFixer\\Diff\\v3_0\\ConfigurationException' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Exception/ConfigurationException.php', - 'PhpCsFixer\\Diff\\v3_0\\Diff' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Diff.php', - 'PhpCsFixer\\Diff\\v3_0\\Differ' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Differ.php', - 'PhpCsFixer\\Diff\\v3_0\\Exception' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Exception/Exception.php', - 'PhpCsFixer\\Diff\\v3_0\\InvalidArgumentException' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Exception/InvalidArgumentException.php', - 'PhpCsFixer\\Diff\\v3_0\\Line' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Line.php', - 'PhpCsFixer\\Diff\\v3_0\\LongestCommonSubsequenceCalculator' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/LongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\v3_0\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\v3_0\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Output/AbstractChunkOutputBuilder.php', - 'PhpCsFixer\\Diff\\v3_0\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Output/DiffOnlyOutputBuilder.php', - 'PhpCsFixer\\Diff\\v3_0\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Output/DiffOutputBuilderInterface.php', - 'PhpCsFixer\\Diff\\v3_0\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Output/StrictUnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\v3_0\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Output/UnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\v3_0\\Parser' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/Parser.php', - 'PhpCsFixer\\Diff\\v3_0\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/php-cs-fixer/diff/src/v3_0/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Tests\\TestCase' => $vendorDir . '/friendsofphp/php-cs-fixer/tests/TestCase.php', - 'PhpCsFixer\\Tests\\Test\\AbstractFixerTestCase' => $vendorDir . '/friendsofphp/php-cs-fixer/tests/Test/AbstractFixerTestCase.php', - 'PhpCsFixer\\Tests\\Test\\AbstractIntegrationCaseFactory' => $vendorDir . '/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationCaseFactory.php', - 'PhpCsFixer\\Tests\\Test\\AbstractIntegrationTestCase' => $vendorDir . '/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationTestCase.php', - 'PhpCsFixer\\Tests\\Test\\Assert\\AssertTokensTrait' => $vendorDir . '/friendsofphp/php-cs-fixer/tests/Test/Assert/AssertTokensTrait.php', - 'PhpCsFixer\\Tests\\Test\\IntegrationCase' => $vendorDir . '/friendsofphp/php-cs-fixer/tests/Test/IntegrationCase.php', - 'PhpCsFixer\\Tests\\Test\\IntegrationCaseFactory' => $vendorDir . '/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactory.php', - 'PhpCsFixer\\Tests\\Test\\IntegrationCaseFactoryInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactoryInterface.php', - 'PhpCsFixer\\Tests\\Test\\InternalIntegrationCaseFactory' => $vendorDir . '/friendsofphp/php-cs-fixer/tests/Test/InternalIntegrationCaseFactory.php', - 'PhpCsFixer\\Tests\\Test\\IsIdenticalConstraint' => $vendorDir . '/friendsofphp/php-cs-fixer/tests/Test/IsIdenticalConstraint.php', - 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', - 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', - 'SebastianBergmann\\CodeCoverage\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Directory.php', - 'SebastianBergmann\\CodeCoverage\\DirectoryCouldNotBeCreatedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PCOV' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PCOV.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', - 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php', - 'SebastianBergmann\\CodeCoverage\\Filter' => $vendorDir . '/phpunit/php-code-coverage/src/Filter.php', - 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php', - 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => $vendorDir . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Builder.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Node\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Node/File.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Iterator.php', - 'SebastianBergmann\\CodeCoverage\\Percentage' => $vendorDir . '/phpunit/php-code-coverage/src/Percentage.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Clover.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Crap4j.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', - 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => $vendorDir . '/phpunit/php-code-coverage/src/Report/PHP.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Text.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', - 'SebastianBergmann\\CodeCoverage\\RuntimeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php', - 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', - 'SebastianBergmann\\CodeCoverage\\Version' => $vendorDir . '/phpunit/php-code-coverage/src/Version.php', - 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => $vendorDir . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', - 'SebastianBergmann\\CodeUnit\\ClassMethodUnit' => $vendorDir . '/sebastian/code-unit/src/ClassMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\ClassUnit' => $vendorDir . '/sebastian/code-unit/src/ClassUnit.php', - 'SebastianBergmann\\CodeUnit\\CodeUnit' => $vendorDir . '/sebastian/code-unit/src/CodeUnit.php', - 'SebastianBergmann\\CodeUnit\\CodeUnitCollection' => $vendorDir . '/sebastian/code-unit/src/CodeUnitCollection.php', - 'SebastianBergmann\\CodeUnit\\CodeUnitCollectionIterator' => $vendorDir . '/sebastian/code-unit/src/CodeUnitCollectionIterator.php', - 'SebastianBergmann\\CodeUnit\\Exception' => $vendorDir . '/sebastian/code-unit/src/exceptions/Exception.php', - 'SebastianBergmann\\CodeUnit\\FunctionUnit' => $vendorDir . '/sebastian/code-unit/src/FunctionUnit.php', - 'SebastianBergmann\\CodeUnit\\InterfaceMethodUnit' => $vendorDir . '/sebastian/code-unit/src/InterfaceMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\InterfaceUnit' => $vendorDir . '/sebastian/code-unit/src/InterfaceUnit.php', - 'SebastianBergmann\\CodeUnit\\InvalidCodeUnitException' => $vendorDir . '/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php', - 'SebastianBergmann\\CodeUnit\\Mapper' => $vendorDir . '/sebastian/code-unit/src/Mapper.php', - 'SebastianBergmann\\CodeUnit\\NoTraitException' => $vendorDir . '/sebastian/code-unit/src/exceptions/NoTraitException.php', - 'SebastianBergmann\\CodeUnit\\ReflectionException' => $vendorDir . '/sebastian/code-unit/src/exceptions/ReflectionException.php', - 'SebastianBergmann\\CodeUnit\\TraitMethodUnit' => $vendorDir . '/sebastian/code-unit/src/TraitMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\TraitUnit' => $vendorDir . '/sebastian/code-unit/src/TraitUnit.php', - 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php', - 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php', - 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php', - 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php', - 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php', - 'SebastianBergmann\\Comparator\\DoubleComparator' => $vendorDir . '/sebastian/comparator/src/DoubleComparator.php', - 'SebastianBergmann\\Comparator\\Exception' => $vendorDir . '/sebastian/comparator/src/exceptions/Exception.php', - 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php', - 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php', - 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php', - 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php', - 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php', - 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php', - 'SebastianBergmann\\Comparator\\RuntimeException' => $vendorDir . '/sebastian/comparator/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php', - 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', - 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', - 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', - 'SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', - 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', - 'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', - 'SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', - 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', - 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php', - 'SebastianBergmann\\Environment\\OperatingSystem' => $vendorDir . '/sebastian/environment/src/OperatingSystem.php', - 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', - 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', - 'SebastianBergmann\\FileIterator\\Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php', - 'SebastianBergmann\\FileIterator\\Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php', - 'SebastianBergmann\\FileIterator\\Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php', - 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php', - 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php', - 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/exceptions/Exception.php', - 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php', - 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php', - 'SebastianBergmann\\Invoker\\Exception' => $vendorDir . '/phpunit/php-invoker/src/exceptions/Exception.php', - 'SebastianBergmann\\Invoker\\Invoker' => $vendorDir . '/phpunit/php-invoker/src/Invoker.php', - 'SebastianBergmann\\Invoker\\ProcessControlExtensionNotLoadedException' => $vendorDir . '/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php', - 'SebastianBergmann\\Invoker\\TimeoutException' => $vendorDir . '/phpunit/php-invoker/src/exceptions/TimeoutException.php', - 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => $vendorDir . '/sebastian/object-enumerator/src/Enumerator.php', - 'SebastianBergmann\\ObjectEnumerator\\Exception' => $vendorDir . '/sebastian/object-enumerator/src/Exception.php', - 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => $vendorDir . '/sebastian/object-enumerator/src/InvalidArgumentException.php', - 'SebastianBergmann\\ObjectReflector\\Exception' => $vendorDir . '/sebastian/object-reflector/src/Exception.php', - 'SebastianBergmann\\ObjectReflector\\InvalidArgumentException' => $vendorDir . '/sebastian/object-reflector/src/InvalidArgumentException.php', - 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => $vendorDir . '/sebastian/object-reflector/src/ObjectReflector.php', - 'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php', - 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php', - 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php', - 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php', - 'SebastianBergmann\\Template\\Exception' => $vendorDir . '/phpunit/php-text-template/src/exceptions/Exception.php', - 'SebastianBergmann\\Template\\InvalidArgumentException' => $vendorDir . '/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php', - 'SebastianBergmann\\Template\\RuntimeException' => $vendorDir . '/phpunit/php-text-template/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\Template\\Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php', - 'SebastianBergmann\\Timer\\Duration' => $vendorDir . '/phpunit/php-timer/src/Duration.php', - 'SebastianBergmann\\Timer\\Exception' => $vendorDir . '/phpunit/php-timer/src/exceptions/Exception.php', - 'SebastianBergmann\\Timer\\NoActiveTimerException' => $vendorDir . '/phpunit/php-timer/src/exceptions/NoActiveTimerException.php', - 'SebastianBergmann\\Timer\\ResourceUsageFormatter' => $vendorDir . '/phpunit/php-timer/src/ResourceUsageFormatter.php', - 'SebastianBergmann\\Timer\\TimeSinceStartOfRequestNotAvailableException' => $vendorDir . '/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php', - 'SebastianBergmann\\Timer\\Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', - 'SebastianBergmann\\Type\\CallableType' => $vendorDir . '/sebastian/type/src/CallableType.php', - 'SebastianBergmann\\Type\\Exception' => $vendorDir . '/sebastian/type/src/exception/Exception.php', - 'SebastianBergmann\\Type\\GenericObjectType' => $vendorDir . '/sebastian/type/src/GenericObjectType.php', - 'SebastianBergmann\\Type\\IterableType' => $vendorDir . '/sebastian/type/src/IterableType.php', - 'SebastianBergmann\\Type\\MixedType' => $vendorDir . '/sebastian/type/src/MixedType.php', - 'SebastianBergmann\\Type\\NullType' => $vendorDir . '/sebastian/type/src/NullType.php', - 'SebastianBergmann\\Type\\ObjectType' => $vendorDir . '/sebastian/type/src/ObjectType.php', - 'SebastianBergmann\\Type\\ReflectionMapper' => $vendorDir . '/sebastian/type/src/ReflectionMapper.php', - 'SebastianBergmann\\Type\\RuntimeException' => $vendorDir . '/sebastian/type/src/exception/RuntimeException.php', - 'SebastianBergmann\\Type\\SimpleType' => $vendorDir . '/sebastian/type/src/SimpleType.php', - 'SebastianBergmann\\Type\\Type' => $vendorDir . '/sebastian/type/src/Type.php', - 'SebastianBergmann\\Type\\TypeName' => $vendorDir . '/sebastian/type/src/TypeName.php', - 'SebastianBergmann\\Type\\UnionType' => $vendorDir . '/sebastian/type/src/UnionType.php', - 'SebastianBergmann\\Type\\UnknownType' => $vendorDir . '/sebastian/type/src/UnknownType.php', - 'SebastianBergmann\\Type\\VoidType' => $vendorDir . '/sebastian/type/src/VoidType.php', - 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', - 'SessionUpdateTimestampHandlerInterface' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php', - 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', - 'TheSeer\\Tokenizer\\Exception' => $vendorDir . '/theseer/tokenizer/src/Exception.php', - 'TheSeer\\Tokenizer\\NamespaceUri' => $vendorDir . '/theseer/tokenizer/src/NamespaceUri.php', - 'TheSeer\\Tokenizer\\NamespaceUriException' => $vendorDir . '/theseer/tokenizer/src/NamespaceUriException.php', - 'TheSeer\\Tokenizer\\Token' => $vendorDir . '/theseer/tokenizer/src/Token.php', - 'TheSeer\\Tokenizer\\TokenCollection' => $vendorDir . '/theseer/tokenizer/src/TokenCollection.php', - 'TheSeer\\Tokenizer\\TokenCollectionException' => $vendorDir . '/theseer/tokenizer/src/TokenCollectionException.php', - 'TheSeer\\Tokenizer\\Tokenizer' => $vendorDir . '/theseer/tokenizer/src/Tokenizer.php', - 'TheSeer\\Tokenizer\\XMLSerializer' => $vendorDir . '/theseer/tokenizer/src/XMLSerializer.php', - 'TypeError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/TypeError.php', - 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', - 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', -); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php deleted file mode 100644 index 586ea58..0000000 --- a/vendor/composer/autoload_files.php +++ /dev/null @@ -1,22 +0,0 @@ - $vendorDir . '/phpunit/phpunit/src/Framework/Assert/Functions.php', - 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', - '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', - '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', - '9b38cf48e83f5d8f60375221cd213eee' => $vendorDir . '/phpstan/phpstan/bootstrap.php', - '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', - '023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php', - '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', - '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', - '2b9d0f43f9552984cfa82fee95491826' => $vendorDir . '/sabre/event/lib/coroutine.php', - 'd81bab31d3feb45bfe2f283ea3c8fdf7' => $vendorDir . '/sabre/event/lib/Loop/functions.php', - 'a1cce3d26cc15c00fcd0b3354bd72c88' => $vendorDir . '/sabre/event/lib/Promise/functions.php', -); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php deleted file mode 100644 index 557ca41..0000000 --- a/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,11 +0,0 @@ - array($vendorDir . '/phpmd/phpmd/src/main/php'), - 'JsonMapper' => array($vendorDir . '/netresearch/jsonmapper/src'), -); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php deleted file mode 100644 index 6830f0d..0000000 --- a/vendor/composer/autoload_psr4.php +++ /dev/null @@ -1,44 +0,0 @@ - array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'), - 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), - 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), - 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), - 'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'), - 'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'), - 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), - 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), - 'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), - 'Symfony\\Contracts\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'), - 'Symfony\\Component\\Stopwatch\\' => array($vendorDir . '/symfony/stopwatch'), - 'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), - 'Symfony\\Component\\OptionsResolver\\' => array($vendorDir . '/symfony/options-resolver'), - 'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), - 'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), - 'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'), - 'Symfony\\Component\\DependencyInjection\\' => array($vendorDir . '/symfony/dependency-injection'), - 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), - 'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'), - 'Sabre\\Event\\' => array($vendorDir . '/sabre/event/lib'), - 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), - 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), - 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'), - 'PhpCsFixer\\' => array($vendorDir . '/friendsofphp/php-cs-fixer/src'), - 'Phan\\' => array($vendorDir . '/phan/phan/src/Phan'), - 'PDepend\\' => array($vendorDir . '/pdepend/pdepend/src/main/php/PDepend'), - 'Microsoft\\PhpParser\\' => array($vendorDir . '/microsoft/tolerant-php-parser/src'), - 'JohnKary\\PHPUnit\\Listener\\' => array($vendorDir . '/johnkary/phpunit-speedtrap/src'), - 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'), - 'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer'), - 'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations'), - 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), - 'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), - 'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), - 'AdvancedJsonRpc\\' => array($vendorDir . '/felixfbecker/advanced-json-rpc/lib'), -); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php deleted file mode 100644 index c02490f..0000000 --- a/vendor/composer/autoload_real.php +++ /dev/null @@ -1,73 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInitee58877227c549dfffd147d2e06361be::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - if ($useStaticLoader) { - $includeFiles = Composer\Autoload\ComposerStaticInitee58877227c549dfffd147d2e06361be::$files; - } else { - $includeFiles = require __DIR__ . '/autoload_files.php'; - } - foreach ($includeFiles as $fileIdentifier => $file) { - composerRequireee58877227c549dfffd147d2e06361be($fileIdentifier, $file); - } - - return $loader; - } -} - -function composerRequireee58877227c549dfffd147d2e06361be($fileIdentifier, $file) -{ - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - require $file; - - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - } -} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php deleted file mode 100644 index bf598e7..0000000 --- a/vendor/composer/autoload_static.php +++ /dev/null @@ -1,1001 +0,0 @@ - __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert/Functions.php', - 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', - '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', - '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', - '9b38cf48e83f5d8f60375221cd213eee' => __DIR__ . '/..' . '/phpstan/phpstan/bootstrap.php', - '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', - '023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php', - '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', - '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', - '2b9d0f43f9552984cfa82fee95491826' => __DIR__ . '/..' . '/sabre/event/lib/coroutine.php', - 'd81bab31d3feb45bfe2f283ea3c8fdf7' => __DIR__ . '/..' . '/sabre/event/lib/Loop/functions.php', - 'a1cce3d26cc15c00fcd0b3354bd72c88' => __DIR__ . '/..' . '/sabre/event/lib/Promise/functions.php', - ); - - public static $prefixLengthsPsr4 = array ( - 'p' => - array ( - 'phpDocumentor\\Reflection\\' => 25, - ), - 'W' => - array ( - 'Webmozart\\Assert\\' => 17, - ), - 'S' => - array ( - 'Symfony\\Polyfill\\Php80\\' => 23, - 'Symfony\\Polyfill\\Php73\\' => 23, - 'Symfony\\Polyfill\\Php72\\' => 23, - 'Symfony\\Polyfill\\Php70\\' => 23, - 'Symfony\\Polyfill\\Mbstring\\' => 26, - 'Symfony\\Polyfill\\Ctype\\' => 23, - 'Symfony\\Contracts\\Service\\' => 26, - 'Symfony\\Contracts\\EventDispatcher\\' => 34, - 'Symfony\\Component\\Stopwatch\\' => 28, - 'Symfony\\Component\\Process\\' => 26, - 'Symfony\\Component\\OptionsResolver\\' => 34, - 'Symfony\\Component\\Finder\\' => 25, - 'Symfony\\Component\\Filesystem\\' => 29, - 'Symfony\\Component\\EventDispatcher\\' => 34, - 'Symfony\\Component\\DependencyInjection\\' => 38, - 'Symfony\\Component\\Console\\' => 26, - 'Symfony\\Component\\Config\\' => 25, - 'Sabre\\Event\\' => 12, - ), - 'P' => - array ( - 'Psr\\Log\\' => 8, - 'Psr\\Container\\' => 14, - 'Prophecy\\' => 9, - 'PhpCsFixer\\' => 11, - 'Phan\\' => 5, - 'PDepend\\' => 8, - ), - 'M' => - array ( - 'Microsoft\\PhpParser\\' => 20, - ), - 'J' => - array ( - 'JohnKary\\PHPUnit\\Listener\\' => 26, - ), - 'D' => - array ( - 'Doctrine\\Instantiator\\' => 22, - 'Doctrine\\Common\\Lexer\\' => 22, - 'Doctrine\\Common\\Annotations\\' => 28, - 'DeepCopy\\' => 9, - ), - 'C' => - array ( - 'Composer\\XdebugHandler\\' => 23, - 'Composer\\Semver\\' => 16, - ), - 'A' => - array ( - 'AdvancedJsonRpc\\' => 16, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'phpDocumentor\\Reflection\\' => - array ( - 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src', - 1 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', - 2 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src', - ), - 'Webmozart\\Assert\\' => - array ( - 0 => __DIR__ . '/..' . '/webmozart/assert/src', - ), - 'Symfony\\Polyfill\\Php80\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', - ), - 'Symfony\\Polyfill\\Php73\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php73', - ), - 'Symfony\\Polyfill\\Php72\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php72', - ), - 'Symfony\\Polyfill\\Php70\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php70', - ), - 'Symfony\\Polyfill\\Mbstring\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', - ), - 'Symfony\\Polyfill\\Ctype\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', - ), - 'Symfony\\Contracts\\Service\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/service-contracts', - ), - 'Symfony\\Contracts\\EventDispatcher\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts', - ), - 'Symfony\\Component\\Stopwatch\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/stopwatch', - ), - 'Symfony\\Component\\Process\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/process', - ), - 'Symfony\\Component\\OptionsResolver\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/options-resolver', - ), - 'Symfony\\Component\\Finder\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/finder', - ), - 'Symfony\\Component\\Filesystem\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/filesystem', - ), - 'Symfony\\Component\\EventDispatcher\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/event-dispatcher', - ), - 'Symfony\\Component\\DependencyInjection\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/dependency-injection', - ), - 'Symfony\\Component\\Console\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/console', - ), - 'Symfony\\Component\\Config\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/config', - ), - 'Sabre\\Event\\' => - array ( - 0 => __DIR__ . '/..' . '/sabre/event/lib', - ), - 'Psr\\Log\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', - ), - 'Psr\\Container\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/container/src', - ), - 'Prophecy\\' => - array ( - 0 => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy', - ), - 'PhpCsFixer\\' => - array ( - 0 => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src', - ), - 'Phan\\' => - array ( - 0 => __DIR__ . '/..' . '/phan/phan/src/Phan', - ), - 'PDepend\\' => - array ( - 0 => __DIR__ . '/..' . '/pdepend/pdepend/src/main/php/PDepend', - ), - 'Microsoft\\PhpParser\\' => - array ( - 0 => __DIR__ . '/..' . '/microsoft/tolerant-php-parser/src', - ), - 'JohnKary\\PHPUnit\\Listener\\' => - array ( - 0 => __DIR__ . '/..' . '/johnkary/phpunit-speedtrap/src', - ), - 'Doctrine\\Instantiator\\' => - array ( - 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator', - ), - 'Doctrine\\Common\\Lexer\\' => - array ( - 0 => __DIR__ . '/..' . '/doctrine/lexer/lib/Doctrine/Common/Lexer', - ), - 'Doctrine\\Common\\Annotations\\' => - array ( - 0 => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations', - ), - 'DeepCopy\\' => - array ( - 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', - ), - 'Composer\\XdebugHandler\\' => - array ( - 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', - ), - 'Composer\\Semver\\' => - array ( - 0 => __DIR__ . '/..' . '/composer/semver/src', - ), - 'AdvancedJsonRpc\\' => - array ( - 0 => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib', - ), - ); - - public static $prefixesPsr0 = array ( - 'P' => - array ( - 'PHPMD\\' => - array ( - 0 => __DIR__ . '/..' . '/phpmd/phpmd/src/main/php', - ), - ), - 'J' => - array ( - 'JsonMapper' => - array ( - 0 => __DIR__ . '/..' . '/netresearch/jsonmapper/src', - ), - ), - ); - - public static $classMap = array ( - 'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php', - 'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php', - 'DivisionByZeroError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php', - 'Error' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/Error.php', - 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', - 'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php', - 'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php', - 'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', - 'PHPUnit\\Framework\\CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', - 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', - 'PHPUnit\\Framework\\Constraint\\Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', - 'PHPUnit\\Framework\\Constraint\\ClassHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', - 'PHPUnit\\Framework\\Constraint\\ClassHasStaticAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', - 'PHPUnit\\Framework\\Constraint\\Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', - 'PHPUnit\\Framework\\Constraint\\Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Count.php', - 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php', - 'PHPUnit\\Framework\\Constraint\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessageRegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', - 'PHPUnit\\Framework\\Constraint\\GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', - 'PHPUnit\\Framework\\Constraint\\IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', - 'PHPUnit\\Framework\\Constraint\\IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', - 'PHPUnit\\Framework\\Constraint\\IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualCanonicalizing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqualCanonicalizing.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualIgnoringCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqualIgnoringCase.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualWithDelta' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqualWithDelta.php', - 'PHPUnit\\Framework\\Constraint\\IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', - 'PHPUnit\\Framework\\Constraint\\IsFinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php', - 'PHPUnit\\Framework\\Constraint\\IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\IsInfinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php', - 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', - 'PHPUnit\\Framework\\Constraint\\IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', - 'PHPUnit\\Framework\\Constraint\\IsNan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php', - 'PHPUnit\\Framework\\Constraint\\IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', - 'PHPUnit\\Framework\\Constraint\\IsReadable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php', - 'PHPUnit\\Framework\\Constraint\\IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', - 'PHPUnit\\Framework\\Constraint\\IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', - 'PHPUnit\\Framework\\Constraint\\IsWritable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php', - 'PHPUnit\\Framework\\Constraint\\JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', - 'PHPUnit\\Framework\\Constraint\\JsonMatchesErrorMessageProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php', - 'PHPUnit\\Framework\\Constraint\\LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', - 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php', - 'PHPUnit\\Framework\\Constraint\\LogicalNot' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php', - 'PHPUnit\\Framework\\Constraint\\LogicalOr' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php', - 'PHPUnit\\Framework\\Constraint\\LogicalXor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php', - 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', - 'PHPUnit\\Framework\\Constraint\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', - 'PHPUnit\\Framework\\Constraint\\StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', - 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', - 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php', - 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', - 'PHPUnit\\Framework\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php', - 'PHPUnit\\Framework\\DataProviderTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', - 'PHPUnit\\Framework\\Error\\Deprecated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', - 'PHPUnit\\Framework\\Error\\Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Error.php', - 'PHPUnit\\Framework\\Error\\Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Notice.php', - 'PHPUnit\\Framework\\Error\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Warning.php', - 'PHPUnit\\Framework\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Exception.php', - 'PHPUnit\\Framework\\ExceptionWrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', - 'PHPUnit\\Framework\\ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', - 'PHPUnit\\Framework\\IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTest.php', - 'PHPUnit\\Framework\\IncompleteTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', - 'PHPUnit\\Framework\\IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php', - 'PHPUnit\\Framework\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', - 'PHPUnit\\Framework\\InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', - 'PHPUnit\\Framework\\InvalidDataProviderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', - 'PHPUnit\\Framework\\InvalidParameterGroupException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php', - 'PHPUnit\\Framework\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php', - 'PHPUnit\\Framework\\MockObject\\Api' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/Api.php', - 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', - 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', - 'PHPUnit\\Framework\\MockObject\\ConfigurableMethodsAlreadyInitializedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php', - 'PHPUnit\\Framework\\MockObject\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', - 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', - 'PHPUnit\\Framework\\MockObject\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invocation.php', - 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php', - 'PHPUnit\\Framework\\MockObject\\Matcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', - 'PHPUnit\\Framework\\MockObject\\Method' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/Method.php', - 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php', - 'PHPUnit\\Framework\\MockObject\\MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', - 'PHPUnit\\Framework\\MockObject\\MockClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockClass.php', - 'PHPUnit\\Framework\\MockObject\\MockMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockMethod.php', - 'PHPUnit\\Framework\\MockObject\\MockMethodSet' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php', - 'PHPUnit\\Framework\\MockObject\\MockObject' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', - 'PHPUnit\\Framework\\MockObject\\MockTrait' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockTrait.php', - 'PHPUnit\\Framework\\MockObject\\MockType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockType.php', - 'PHPUnit\\Framework\\MockObject\\MockedCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php', - 'PHPUnit\\Framework\\MockObject\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', - 'PHPUnit\\Framework\\MockObject\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php', - 'PHPUnit\\Framework\\MockObject\\UnmockedCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', - 'PHPUnit\\Framework\\NoChildTestSuiteException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', - 'PHPUnit\\Framework\\OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/OutputError.php', - 'PHPUnit\\Framework\\PHPTAssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php', - 'PHPUnit\\Framework\\RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php', - 'PHPUnit\\Framework\\SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php', - 'PHPUnit\\Framework\\SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTest.php', - 'PHPUnit\\Framework\\SkippedTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', - 'PHPUnit\\Framework\\SkippedTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php', - 'PHPUnit\\Framework\\SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php', - 'PHPUnit\\Framework\\SyntheticError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SyntheticError.php', - 'PHPUnit\\Framework\\SyntheticSkippedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php', - 'PHPUnit\\Framework\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php', - 'PHPUnit\\Framework\\TestBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestBuilder.php', - 'PHPUnit\\Framework\\TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php', - 'PHPUnit\\Framework\\TestFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestFailure.php', - 'PHPUnit\\Framework\\TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListener.php', - 'PHPUnit\\Framework\\TestListenerDefaultImplementation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php', - 'PHPUnit\\Framework\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestResult.php', - 'PHPUnit\\Framework\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php', - 'PHPUnit\\Framework\\TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', - 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php', - 'PHPUnit\\Framework\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Warning.php', - 'PHPUnit\\Framework\\WarningTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/WarningTestCase.php', - 'PHPUnit\\Runner\\AfterIncompleteTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', - 'PHPUnit\\Runner\\AfterLastTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', - 'PHPUnit\\Runner\\AfterRiskyTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', - 'PHPUnit\\Runner\\AfterSkippedTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', - 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', - 'PHPUnit\\Runner\\AfterTestErrorHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', - 'PHPUnit\\Runner\\AfterTestFailureHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', - 'PHPUnit\\Runner\\AfterTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php', - 'PHPUnit\\Runner\\AfterTestWarningHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', - 'PHPUnit\\Runner\\BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', - 'PHPUnit\\Runner\\BeforeFirstTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', - 'PHPUnit\\Runner\\BeforeTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', - 'PHPUnit\\Runner\\DefaultTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/DefaultTestResultCache.php', - 'PHPUnit\\Runner\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php', - 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php', - 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', - 'PHPUnit\\Runner\\Hook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/Hook.php', - 'PHPUnit\\Runner\\NullTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/NullTestResultCache.php', - 'PHPUnit\\Runner\\PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/PhptTestCase.php', - 'PHPUnit\\Runner\\ResultCacheExtension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', - 'PHPUnit\\Runner\\StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', - 'PHPUnit\\Runner\\TestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', - 'PHPUnit\\Runner\\TestListenerAdapter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', - 'PHPUnit\\Runner\\TestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResultCache.php', - 'PHPUnit\\Runner\\TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', - 'PHPUnit\\Runner\\TestSuiteSorter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', - 'PHPUnit\\Runner\\Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php', - 'PHPUnit\\TextUI\\Arguments\\Arguments' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Arguments/Arguments.php', - 'PHPUnit\\TextUI\\Arguments\\ArgumentsBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Arguments/ArgumentsBuilder.php', - 'PHPUnit\\TextUI\\Arguments\\ArgumentsMapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Arguments/ArgumentsMapper.php', - 'PHPUnit\\TextUI\\Arguments\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Arguments/Exception.php', - 'PHPUnit\\TextUI\\Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php', - 'PHPUnit\\TextUI\\Configuration\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Configuration.php', - 'PHPUnit\\TextUI\\Configuration\\Constant' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHP/Constant.php', - 'PHPUnit\\TextUI\\Configuration\\ConstantCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHP/ConstantCollection.php', - 'PHPUnit\\TextUI\\Configuration\\ConstantCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHP/ConstantCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Directory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/Directory.php', - 'PHPUnit\\TextUI\\Configuration\\DirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/DirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\DirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/DirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception.php', - 'PHPUnit\\TextUI\\Configuration\\Extension' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/Extension.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/ExtensionCollection.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/ExtensionCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/ExtensionHandler.php', - 'PHPUnit\\TextUI\\Configuration\\File' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/File.php', - 'PHPUnit\\TextUI\\Configuration\\FileCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/FileCollection.php', - 'PHPUnit\\TextUI\\Configuration\\FileCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filesystem/FileCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filter/Filter.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterDirectory.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterDirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterDirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\FilterFile' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterFile.php', - 'PHPUnit\\TextUI\\Configuration\\FilterFileCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterFileCollection.php', - 'PHPUnit\\TextUI\\Configuration\\FilterFileCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Filter/FilterFileCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Generator.php', - 'PHPUnit\\TextUI\\Configuration\\Group' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Group/Group.php', - 'PHPUnit\\TextUI\\Configuration\\GroupCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Group/GroupCollection.php', - 'PHPUnit\\TextUI\\Configuration\\GroupCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Group/GroupCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Groups' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Group/Groups.php', - 'PHPUnit\\TextUI\\Configuration\\IniSetting' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHP/IniSetting.php', - 'PHPUnit\\TextUI\\Configuration\\IniSettingCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHP/IniSettingCollection.php', - 'PHPUnit\\TextUI\\Configuration\\IniSettingCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHP/IniSettingCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Loader' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Loader.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Clover' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Clover.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Crap4j' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Crap4j.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Html' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Html.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Php' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Php.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Text.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\CodeCoverage\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/CodeCoverage/Xml.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\Junit' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/Junit.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\Logging' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/Logging.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\PlainText' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/PlainText.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/TeamCity.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\TestDox\\Html' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/TestDox/Html.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\TestDox\\Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/TestDox/Text.php', - 'PHPUnit\\TextUI\\Configuration\\Logging\\TestDox\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Logging/TestDox/Xml.php', - 'PHPUnit\\TextUI\\Configuration\\PHPUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHPUnit/PHPUnit.php', - 'PHPUnit\\TextUI\\Configuration\\Php' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHP/Php.php', - 'PHPUnit\\TextUI\\Configuration\\PhpHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHP/PhpHandler.php', - 'PHPUnit\\TextUI\\Configuration\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Registry.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestDirectory.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestDirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestDirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\TestFile' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestFile.php', - 'PHPUnit\\TextUI\\Configuration\\TestFileCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestFileCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestFileCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestFileCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuite.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuiteCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuiteCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteMapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuite/TestSuiteMapper.php', - 'PHPUnit\\TextUI\\Configuration\\Variable' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHP/Variable.php', - 'PHPUnit\\TextUI\\Configuration\\VariableCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHP/VariableCollection.php', - 'PHPUnit\\TextUI\\Configuration\\VariableCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PHP/VariableCollectionIterator.php', - 'PHPUnit\\TextUI\\DefaultResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php', - 'PHPUnit\\TextUI\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception.php', - 'PHPUnit\\TextUI\\Help' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Help.php', - 'PHPUnit\\TextUI\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', - 'PHPUnit\\TextUI\\TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php', - 'PHPUnit\\Util\\Annotation\\DocBlock' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', - 'PHPUnit\\Util\\Annotation\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/Registry.php', - 'PHPUnit\\Util\\Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php', - 'PHPUnit\\Util\\Color' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Color.php', - 'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php', - 'PHPUnit\\Util\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception.php', - 'PHPUnit\\Util\\FileLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/FileLoader.php', - 'PHPUnit\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php', - 'PHPUnit\\Util\\Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php', - 'PHPUnit\\Util\\Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php', - 'PHPUnit\\Util\\GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php', - 'PHPUnit\\Util\\InvalidDataSetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/InvalidDataSetException.php', - 'PHPUnit\\Util\\Json' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Json.php', - 'PHPUnit\\Util\\Log\\JUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JUnit.php', - 'PHPUnit\\Util\\Log\\TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TeamCity.php', - 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', - 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', - 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', - 'PHPUnit\\Util\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php', - 'PHPUnit\\Util\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/RegularExpression.php', - 'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', - 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', - 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', - 'PHPUnit\\Util\\TestDox\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\TestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php', - 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', - 'PHPUnit\\Util\\TextTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', - 'PHPUnit\\Util\\Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php', - 'PHPUnit\\Util\\VersionComparisonOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', - 'PHPUnit\\Util\\XdebugFilterScriptGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php', - 'PHPUnit\\Util\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml.php', - 'PHPUnit\\Util\\XmlTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', - 'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ABSTRACT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AMPERSAND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AND_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOLEAN_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOL_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BREAK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CALLABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CARET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CASE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CATCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS_NAME_CONSTANT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLONE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COALESCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COALESCE_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONTINUE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CURLY_OPEN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DEC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DEFAULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIV' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIV_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOC_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOLLAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_QUOTES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELLIPSIS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELSE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELSEIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EMPTY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENCAPSED_AND_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDDECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDFOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDFOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXTENDS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FINAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FINALLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FUNC_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GLOBAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GOTO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INLINE_HTML' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INSTANCEOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INSTEADOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INTERFACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ISSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_GREATER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_NOT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_XOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_METHOD_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MINUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MINUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MOD_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MUL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NAMESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_TAG_WITH_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PERCENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PIPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PLUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PLUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_POW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_POW_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PRINT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PRIVATE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PROTECTED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PUBLIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_QUESTION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_REQUIRE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_START_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STATIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php', - 'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', - 'PHP_Token_THROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TILDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_USE_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Util' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Util.php', - 'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'ParseError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ParseError.php', - 'PharIo\\Manifest\\Application' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Application.php', - 'PharIo\\Manifest\\ApplicationName' => __DIR__ . '/..' . '/phar-io/manifest/src/values/ApplicationName.php', - 'PharIo\\Manifest\\Author' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Author.php', - 'PharIo\\Manifest\\AuthorCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollection.php', - 'PharIo\\Manifest\\AuthorCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', - 'PharIo\\Manifest\\AuthorElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElement.php', - 'PharIo\\Manifest\\AuthorElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElementCollection.php', - 'PharIo\\Manifest\\BundledComponent' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponent.php', - 'PharIo\\Manifest\\BundledComponentCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollection.php', - 'PharIo\\Manifest\\BundledComponentCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', - 'PharIo\\Manifest\\BundlesElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/BundlesElement.php', - 'PharIo\\Manifest\\ComponentElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElement.php', - 'PharIo\\Manifest\\ComponentElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElementCollection.php', - 'PharIo\\Manifest\\ContainsElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ContainsElement.php', - 'PharIo\\Manifest\\CopyrightElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/CopyrightElement.php', - 'PharIo\\Manifest\\CopyrightInformation' => __DIR__ . '/..' . '/phar-io/manifest/src/values/CopyrightInformation.php', - 'PharIo\\Manifest\\ElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ElementCollection.php', - 'PharIo\\Manifest\\Email' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Email.php', - 'PharIo\\Manifest\\Exception' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/Exception.php', - 'PharIo\\Manifest\\ExtElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElement.php', - 'PharIo\\Manifest\\ExtElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElementCollection.php', - 'PharIo\\Manifest\\Extension' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Extension.php', - 'PharIo\\Manifest\\ExtensionElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtensionElement.php', - 'PharIo\\Manifest\\InvalidApplicationNameException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', - 'PharIo\\Manifest\\InvalidEmailException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', - 'PharIo\\Manifest\\InvalidUrlException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', - 'PharIo\\Manifest\\Library' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Library.php', - 'PharIo\\Manifest\\License' => __DIR__ . '/..' . '/phar-io/manifest/src/values/License.php', - 'PharIo\\Manifest\\LicenseElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/LicenseElement.php', - 'PharIo\\Manifest\\Manifest' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Manifest.php', - 'PharIo\\Manifest\\ManifestDocument' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestDocument.php', - 'PharIo\\Manifest\\ManifestDocumentException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', - 'PharIo\\Manifest\\ManifestDocumentLoadingException' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php', - 'PharIo\\Manifest\\ManifestDocumentMapper' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestDocumentMapper.php', - 'PharIo\\Manifest\\ManifestDocumentMapperException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', - 'PharIo\\Manifest\\ManifestElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestElement.php', - 'PharIo\\Manifest\\ManifestElementException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestElementException.php', - 'PharIo\\Manifest\\ManifestLoader' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestLoader.php', - 'PharIo\\Manifest\\ManifestLoaderException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', - 'PharIo\\Manifest\\ManifestSerializer' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestSerializer.php', - 'PharIo\\Manifest\\PhpElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/PhpElement.php', - 'PharIo\\Manifest\\PhpExtensionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', - 'PharIo\\Manifest\\PhpVersionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpVersionRequirement.php', - 'PharIo\\Manifest\\Requirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Requirement.php', - 'PharIo\\Manifest\\RequirementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollection.php', - 'PharIo\\Manifest\\RequirementCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', - 'PharIo\\Manifest\\RequiresElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/RequiresElement.php', - 'PharIo\\Manifest\\Type' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Type.php', - 'PharIo\\Manifest\\Url' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Url.php', - 'PharIo\\Version\\AbstractVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', - 'PharIo\\Version\\AndVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', - 'PharIo\\Version\\AnyVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AnyVersionConstraint.php', - 'PharIo\\Version\\ExactVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/ExactVersionConstraint.php', - 'PharIo\\Version\\Exception' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/Exception.php', - 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', - 'PharIo\\Version\\InvalidPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', - 'PharIo\\Version\\InvalidVersionException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidVersionException.php', - 'PharIo\\Version\\OrVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', - 'PharIo\\Version\\PreReleaseSuffix' => __DIR__ . '/..' . '/phar-io/version/src/PreReleaseSuffix.php', - 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', - 'PharIo\\Version\\SpecificMajorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', - 'PharIo\\Version\\UnsupportedVersionConstraintException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', - 'PharIo\\Version\\Version' => __DIR__ . '/..' . '/phar-io/version/src/Version.php', - 'PharIo\\Version\\VersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/VersionConstraint.php', - 'PharIo\\Version\\VersionConstraintParser' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintParser.php', - 'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php', - 'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php', - 'PhpCsFixer\\Diff\\GeckoPackages\\DiffOutputBuilder\\ConfigurationException' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/ConfigurationException.php', - 'PhpCsFixer\\Diff\\GeckoPackages\\DiffOutputBuilder\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/UnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\v1_4\\Chunk' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v1_4/Chunk.php', - 'PhpCsFixer\\Diff\\v1_4\\Diff' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v1_4/Diff.php', - 'PhpCsFixer\\Diff\\v1_4\\Differ' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v1_4/Differ.php', - 'PhpCsFixer\\Diff\\v1_4\\LCS\\LongestCommonSubsequence' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v1_4/LCS/LongestCommonSubsequence.php', - 'PhpCsFixer\\Diff\\v1_4\\LCS\\MemoryEfficientImplementation' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v1_4/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php', - 'PhpCsFixer\\Diff\\v1_4\\LCS\\TimeEfficientImplementation' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v1_4/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php', - 'PhpCsFixer\\Diff\\v1_4\\Line' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v1_4/Line.php', - 'PhpCsFixer\\Diff\\v1_4\\Parser' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v1_4/Parser.php', - 'PhpCsFixer\\Diff\\v2_0\\Chunk' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/Chunk.php', - 'PhpCsFixer\\Diff\\v2_0\\Diff' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/Diff.php', - 'PhpCsFixer\\Diff\\v2_0\\Differ' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/Differ.php', - 'PhpCsFixer\\Diff\\v2_0\\Exception' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/Exception/Exception.php', - 'PhpCsFixer\\Diff\\v2_0\\InvalidArgumentException' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/Exception/InvalidArgumentException.php', - 'PhpCsFixer\\Diff\\v2_0\\Line' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/Line.php', - 'PhpCsFixer\\Diff\\v2_0\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/LongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\v2_0\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\v2_0\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/Output/AbstractChunkOutputBuilder.php', - 'PhpCsFixer\\Diff\\v2_0\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/Output/DiffOnlyOutputBuilder.php', - 'PhpCsFixer\\Diff\\v2_0\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/Output/DiffOutputBuilderInterface.php', - 'PhpCsFixer\\Diff\\v2_0\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/Output/UnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\v2_0\\Parser' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/Parser.php', - 'PhpCsFixer\\Diff\\v2_0\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v2_0/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\v3_0\\Chunk' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Chunk.php', - 'PhpCsFixer\\Diff\\v3_0\\ConfigurationException' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Exception/ConfigurationException.php', - 'PhpCsFixer\\Diff\\v3_0\\Diff' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Diff.php', - 'PhpCsFixer\\Diff\\v3_0\\Differ' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Differ.php', - 'PhpCsFixer\\Diff\\v3_0\\Exception' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Exception/Exception.php', - 'PhpCsFixer\\Diff\\v3_0\\InvalidArgumentException' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Exception/InvalidArgumentException.php', - 'PhpCsFixer\\Diff\\v3_0\\Line' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Line.php', - 'PhpCsFixer\\Diff\\v3_0\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/LongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\v3_0\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\v3_0\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Output/AbstractChunkOutputBuilder.php', - 'PhpCsFixer\\Diff\\v3_0\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Output/DiffOnlyOutputBuilder.php', - 'PhpCsFixer\\Diff\\v3_0\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Output/DiffOutputBuilderInterface.php', - 'PhpCsFixer\\Diff\\v3_0\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Output/StrictUnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\v3_0\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Output/UnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\v3_0\\Parser' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/Parser.php', - 'PhpCsFixer\\Diff\\v3_0\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/v3_0/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Tests\\TestCase' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/tests/TestCase.php', - 'PhpCsFixer\\Tests\\Test\\AbstractFixerTestCase' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/tests/Test/AbstractFixerTestCase.php', - 'PhpCsFixer\\Tests\\Test\\AbstractIntegrationCaseFactory' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationCaseFactory.php', - 'PhpCsFixer\\Tests\\Test\\AbstractIntegrationTestCase' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationTestCase.php', - 'PhpCsFixer\\Tests\\Test\\Assert\\AssertTokensTrait' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/tests/Test/Assert/AssertTokensTrait.php', - 'PhpCsFixer\\Tests\\Test\\IntegrationCase' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/tests/Test/IntegrationCase.php', - 'PhpCsFixer\\Tests\\Test\\IntegrationCaseFactory' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactory.php', - 'PhpCsFixer\\Tests\\Test\\IntegrationCaseFactoryInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactoryInterface.php', - 'PhpCsFixer\\Tests\\Test\\InternalIntegrationCaseFactory' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/tests/Test/InternalIntegrationCaseFactory.php', - 'PhpCsFixer\\Tests\\Test\\IsIdenticalConstraint' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/tests/Test/IsIdenticalConstraint.php', - 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', - 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', - 'SebastianBergmann\\CodeCoverage\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Directory.php', - 'SebastianBergmann\\CodeCoverage\\DirectoryCouldNotBeCreatedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PCOV' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PCOV.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', - 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php', - 'SebastianBergmann\\CodeCoverage\\Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Filter.php', - 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php', - 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Builder.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Node\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/File.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Iterator.php', - 'SebastianBergmann\\CodeCoverage\\Percentage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Percentage.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Clover.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Crap4j.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', - 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/PHP.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Text.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', - 'SebastianBergmann\\CodeCoverage\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php', - 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', - 'SebastianBergmann\\CodeCoverage\\Version' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Version.php', - 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => __DIR__ . '/..' . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', - 'SebastianBergmann\\CodeUnit\\ClassMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/ClassMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\ClassUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/ClassUnit.php', - 'SebastianBergmann\\CodeUnit\\CodeUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnit.php', - 'SebastianBergmann\\CodeUnit\\CodeUnitCollection' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnitCollection.php', - 'SebastianBergmann\\CodeUnit\\CodeUnitCollectionIterator' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnitCollectionIterator.php', - 'SebastianBergmann\\CodeUnit\\Exception' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/Exception.php', - 'SebastianBergmann\\CodeUnit\\FunctionUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/FunctionUnit.php', - 'SebastianBergmann\\CodeUnit\\InterfaceMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/InterfaceMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\InterfaceUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/InterfaceUnit.php', - 'SebastianBergmann\\CodeUnit\\InvalidCodeUnitException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php', - 'SebastianBergmann\\CodeUnit\\Mapper' => __DIR__ . '/..' . '/sebastian/code-unit/src/Mapper.php', - 'SebastianBergmann\\CodeUnit\\NoTraitException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/NoTraitException.php', - 'SebastianBergmann\\CodeUnit\\ReflectionException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/ReflectionException.php', - 'SebastianBergmann\\CodeUnit\\TraitMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/TraitMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\TraitUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/TraitUnit.php', - 'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php', - 'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php', - 'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php', - 'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php', - 'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php', - 'SebastianBergmann\\Comparator\\DoubleComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DoubleComparator.php', - 'SebastianBergmann\\Comparator\\Exception' => __DIR__ . '/..' . '/sebastian/comparator/src/exceptions/Exception.php', - 'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php', - 'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php', - 'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php', - 'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php', - 'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php', - 'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php', - 'SebastianBergmann\\Comparator\\RuntimeException' => __DIR__ . '/..' . '/sebastian/comparator/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php', - 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php', - 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php', - 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', - 'SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', - 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', - 'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', - 'SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', - 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', - 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php', - 'SebastianBergmann\\Environment\\OperatingSystem' => __DIR__ . '/..' . '/sebastian/environment/src/OperatingSystem.php', - 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php', - 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php', - 'SebastianBergmann\\FileIterator\\Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php', - 'SebastianBergmann\\FileIterator\\Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php', - 'SebastianBergmann\\FileIterator\\Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php', - 'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php', - 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php', - 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/Exception.php', - 'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php', - 'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php', - 'SebastianBergmann\\Invoker\\Exception' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/Exception.php', - 'SebastianBergmann\\Invoker\\Invoker' => __DIR__ . '/..' . '/phpunit/php-invoker/src/Invoker.php', - 'SebastianBergmann\\Invoker\\ProcessControlExtensionNotLoadedException' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php', - 'SebastianBergmann\\Invoker\\TimeoutException' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/TimeoutException.php', - 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Enumerator.php', - 'SebastianBergmann\\ObjectEnumerator\\Exception' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Exception.php', - 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/InvalidArgumentException.php', - 'SebastianBergmann\\ObjectReflector\\Exception' => __DIR__ . '/..' . '/sebastian/object-reflector/src/Exception.php', - 'SebastianBergmann\\ObjectReflector\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-reflector/src/InvalidArgumentException.php', - 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => __DIR__ . '/..' . '/sebastian/object-reflector/src/ObjectReflector.php', - 'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php', - 'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php', - 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php', - 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php', - 'SebastianBergmann\\Template\\Exception' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/Exception.php', - 'SebastianBergmann\\Template\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php', - 'SebastianBergmann\\Template\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\Template\\Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php', - 'SebastianBergmann\\Timer\\Duration' => __DIR__ . '/..' . '/phpunit/php-timer/src/Duration.php', - 'SebastianBergmann\\Timer\\Exception' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/Exception.php', - 'SebastianBergmann\\Timer\\NoActiveTimerException' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/NoActiveTimerException.php', - 'SebastianBergmann\\Timer\\ResourceUsageFormatter' => __DIR__ . '/..' . '/phpunit/php-timer/src/ResourceUsageFormatter.php', - 'SebastianBergmann\\Timer\\TimeSinceStartOfRequestNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php', - 'SebastianBergmann\\Timer\\Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', - 'SebastianBergmann\\Type\\CallableType' => __DIR__ . '/..' . '/sebastian/type/src/CallableType.php', - 'SebastianBergmann\\Type\\Exception' => __DIR__ . '/..' . '/sebastian/type/src/exception/Exception.php', - 'SebastianBergmann\\Type\\GenericObjectType' => __DIR__ . '/..' . '/sebastian/type/src/GenericObjectType.php', - 'SebastianBergmann\\Type\\IterableType' => __DIR__ . '/..' . '/sebastian/type/src/IterableType.php', - 'SebastianBergmann\\Type\\MixedType' => __DIR__ . '/..' . '/sebastian/type/src/MixedType.php', - 'SebastianBergmann\\Type\\NullType' => __DIR__ . '/..' . '/sebastian/type/src/NullType.php', - 'SebastianBergmann\\Type\\ObjectType' => __DIR__ . '/..' . '/sebastian/type/src/ObjectType.php', - 'SebastianBergmann\\Type\\ReflectionMapper' => __DIR__ . '/..' . '/sebastian/type/src/ReflectionMapper.php', - 'SebastianBergmann\\Type\\RuntimeException' => __DIR__ . '/..' . '/sebastian/type/src/exception/RuntimeException.php', - 'SebastianBergmann\\Type\\SimpleType' => __DIR__ . '/..' . '/sebastian/type/src/SimpleType.php', - 'SebastianBergmann\\Type\\Type' => __DIR__ . '/..' . '/sebastian/type/src/Type.php', - 'SebastianBergmann\\Type\\TypeName' => __DIR__ . '/..' . '/sebastian/type/src/TypeName.php', - 'SebastianBergmann\\Type\\UnionType' => __DIR__ . '/..' . '/sebastian/type/src/UnionType.php', - 'SebastianBergmann\\Type\\UnknownType' => __DIR__ . '/..' . '/sebastian/type/src/UnknownType.php', - 'SebastianBergmann\\Type\\VoidType' => __DIR__ . '/..' . '/sebastian/type/src/VoidType.php', - 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php', - 'SessionUpdateTimestampHandlerInterface' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php', - 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', - 'TheSeer\\Tokenizer\\Exception' => __DIR__ . '/..' . '/theseer/tokenizer/src/Exception.php', - 'TheSeer\\Tokenizer\\NamespaceUri' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUri.php', - 'TheSeer\\Tokenizer\\NamespaceUriException' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUriException.php', - 'TheSeer\\Tokenizer\\Token' => __DIR__ . '/..' . '/theseer/tokenizer/src/Token.php', - 'TheSeer\\Tokenizer\\TokenCollection' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollection.php', - 'TheSeer\\Tokenizer\\TokenCollectionException' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollectionException.php', - 'TheSeer\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/theseer/tokenizer/src/Tokenizer.php', - 'TheSeer\\Tokenizer\\XMLSerializer' => __DIR__ . '/..' . '/theseer/tokenizer/src/XMLSerializer.php', - 'TypeError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/TypeError.php', - 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', - 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInitee58877227c549dfffd147d2e06361be::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInitee58877227c549dfffd147d2e06361be::$prefixDirsPsr4; - $loader->prefixesPsr0 = ComposerStaticInitee58877227c549dfffd147d2e06361be::$prefixesPsr0; - $loader->classMap = ComposerStaticInitee58877227c549dfffd147d2e06361be::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json deleted file mode 100644 index ae23847..0000000 --- a/vendor/composer/installed.json +++ /dev/null @@ -1,3832 +0,0 @@ -[ - { - "name": "composer/semver", - "version": "1.5.1", - "version_normalized": "1.5.1.0", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de", - "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5" - }, - "time": "2020-01-13T12:06:48+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ] - }, - { - "name": "composer/xdebug-handler", - "version": "1.4.2", - "version_normalized": "1.4.2.0", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51", - "reference": "fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" - }, - "time": "2020-06-04T11:16:35+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ] - }, - { - "name": "doctrine/annotations", - "version": "1.10.3", - "version_normalized": "1.10.3.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/5db60a4969eba0e0c197a19c077780aadbc43c5d", - "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/cache": "1.*", - "phpunit/phpunit": "^7.5" - }, - "time": "2020-05-25T17:24:27+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "docblock", - "parser" - ] - }, - { - "name": "doctrine/instantiator", - "version": "1.3.1", - "version_normalized": "1.3.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" - }, - "time": "2020-05-29T17:27:14+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ] - }, - { - "name": "doctrine/lexer", - "version": "1.2.1", - "version_normalized": "1.2.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "time": "2020-05-25T17:44:05+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ] - }, - { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.1.1", - "version_normalized": "3.1.1.0", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "0ed363f8de17d284d479ec813c9ad3f6834b5c40" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/0ed363f8de17d284d479ec813c9ad3f6834b5c40", - "reference": "0ed363f8de17d284d479ec813c9ad3f6834b5c40", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0", - "php": ">=7.0", - "phpdocumentor/reflection-docblock": "^4.0.0 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0.0" - }, - "time": "2020-03-11T15:21:41+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation" - }, - { - "name": "friendsofphp/php-cs-fixer", - "version": "v2.16.4", - "version_normalized": "2.16.4.0", - "source": { - "type": "git", - "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "1023c3458137ab052f6ff1e09621a721bfdeca13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/1023c3458137ab052f6ff1e09621a721bfdeca13", - "reference": "1023c3458137ab052f6ff1e09621a721bfdeca13", - "shasum": "" - }, - "require": { - "composer/semver": "^1.4", - "composer/xdebug-handler": "^1.2", - "doctrine/annotations": "^1.2", - "ext-json": "*", - "ext-tokenizer": "*", - "php": "^5.6 || ^7.0", - "php-cs-fixer/diff": "^1.3", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0", - "symfony/event-dispatcher": "^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^3.0 || ^4.0 || ^5.0", - "symfony/options-resolver": "^3.0 || ^4.0 || ^5.0", - "symfony/polyfill-php70": "^1.0", - "symfony/polyfill-php72": "^1.4", - "symfony/process": "^3.0 || ^4.0 || ^5.0", - "symfony/stopwatch": "^3.0 || ^4.0 || ^5.0" - }, - "require-dev": { - "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0", - "justinrainbow/json-schema": "^5.0", - "keradus/cli-executor": "^1.2", - "mikey179/vfsstream": "^1.6", - "php-coveralls/php-coveralls": "^2.1", - "php-cs-fixer/accessible-object": "^1.0", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.1", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.1", - "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.1", - "phpunitgoodpractices/traits": "^1.8", - "symfony/phpunit-bridge": "^5.1", - "symfony/yaml": "^3.0 || ^4.0 || ^5.0" - }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters.", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", - "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." - }, - "time": "2020-06-27T23:57:46+00:00", - "bin": [ - "php-cs-fixer" - ], - "type": "application", - "installation-source": "dist", - "autoload": { - "psr-4": { - "PhpCsFixer\\": "src/" - }, - "classmap": [ - "tests/Test/AbstractFixerTestCase.php", - "tests/Test/AbstractIntegrationCaseFactory.php", - "tests/Test/AbstractIntegrationTestCase.php", - "tests/Test/Assert/AssertTokensTrait.php", - "tests/Test/IntegrationCase.php", - "tests/Test/IntegrationCaseFactory.php", - "tests/Test/IntegrationCaseFactoryInterface.php", - "tests/Test/InternalIntegrationCaseFactory.php", - "tests/Test/IsIdenticalConstraint.php", - "tests/TestCase.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" - } - ], - "description": "A tool to automatically fix PHP code style" - }, - { - "name": "johnkary/phpunit-speedtrap", - "version": "v3.2.0", - "version_normalized": "3.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/johnkary/phpunit-speedtrap.git", - "reference": "8c0e149b80c6e86c33315f05699512678655c158" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/johnkary/phpunit-speedtrap/zipball/8c0e149b80c6e86c33315f05699512678655c158", - "reference": "8c0e149b80c6e86c33315f05699512678655c158", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "time": "2020-02-12T16:19:51+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "JohnKary\\PHPUnit\\Listener\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Kary", - "email": "john@johnkary.net" - } - ], - "description": "Find and report on slow tests in your PHPUnit test suite", - "homepage": "https://github.com/johnkary/phpunit-speedtrap", - "keywords": [ - "phpunit", - "profile", - "slow" - ] - }, - { - "name": "microsoft/tolerant-php-parser", - "version": "v0.0.17", - "version_normalized": "0.0.17.0", - "source": { - "type": "git", - "url": "https://github.com/Microsoft/tolerant-php-parser.git", - "reference": "89386de8dec9c004c8ea832692e236c92f34b542" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Microsoft/tolerant-php-parser/zipball/89386de8dec9c004c8ea832692e236c92f34b542", - "reference": "89386de8dec9c004c8ea832692e236c92f34b542", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.4" - }, - "time": "2019-03-09T19:24:59+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Microsoft\\PhpParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rob Lourens", - "email": "roblou@microsoft.com" - } - ], - "description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios" - }, - { - "name": "myclabs/deep-copy", - "version": "1.10.1", - "version_normalized": "1.10.1.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "time": "2020-06-29T13:22:24+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ] - }, - { - "name": "netresearch/jsonmapper", - "version": "v2.1.0", - "version_normalized": "2.1.0.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/e0f1e33a71587aca81be5cffbb9746510e1fe04e", - "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.6" - }, - "require-dev": { - "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4 || ~7.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "time": "2020-04-16T18:48:43+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.99", - "version_normalized": "9.99.99.0", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "shasum": "" - }, - "require": { - "php": "^7" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "time": "2018-07-02T15:55:56+00:00", - "type": "library", - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ] - }, - { - "name": "pdepend/pdepend", - "version": "2.8.0", - "version_normalized": "2.8.0.0", - "source": { - "type": "git", - "url": "https://github.com/pdepend/pdepend.git", - "reference": "c64472f8e76ca858c79ad9a4cf1e2734b3f8cc38" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/c64472f8e76ca858c79ad9a4cf1e2734b3f8cc38", - "reference": "c64472f8e76ca858c79ad9a4cf1e2734b3f8cc38", - "shasum": "" - }, - "require": { - "php": ">=5.3.7", - "symfony/config": "^2.3.0|^3|^4|^5", - "symfony/dependency-injection": "^2.3.0|^3|^4|^5", - "symfony/filesystem": "^2.3.0|^3|^4|^5" - }, - "require-dev": { - "easy-doc/easy-doc": "0.0.0 || ^1.2.3", - "gregwar/rst": "^1.0", - "phpunit/phpunit": "^4.8.35|^5.7", - "squizlabs/php_codesniffer": "^2.0.0" - }, - "time": "2020-06-20T10:53:13+00:00", - "bin": [ - "src/bin/pdepend" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "PDepend\\": "src/main/php/PDepend" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Official version of pdepend to be handled with Composer" - }, - { - "name": "phan/phan", - "version": "1.3.5", - "version_normalized": "1.3.5.0", - "source": { - "type": "git", - "url": "https://github.com/phan/phan.git", - "reference": "f872949b366d84bd9ce79d8b0ea991edbe258377" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phan/phan/zipball/f872949b366d84bd9ce79d8b0ea991edbe258377", - "reference": "f872949b366d84bd9ce79d8b0ea991edbe258377", - "shasum": "" - }, - "require": { - "composer/semver": "^1.4", - "composer/xdebug-handler": "^1.3.2", - "ext-filter": "*", - "ext-json": "*", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "microsoft/tolerant-php-parser": "0.0.17", - "php": "^7.0.0", - "sabre/event": "^5.0", - "symfony/console": "^2.3|^3.0|~4.0", - "symfony/polyfill-mbstring": "^1.11.0" - }, - "require-dev": { - "brianium/paratest": "^1.1", - "phpunit/phpunit": "^6.3.0" - }, - "suggest": { - "ext-ast": "Needed for parsing ASTs (unless --use-fallback-parser is used). 1.0.1+ is recommended, php-ast ^0.1.5|^1.0.0 is needed.", - "ext-igbinary": "Improves performance of polyfill when ext-ast is unavailable", - "ext-tokenizer": "Needed for non-AST support and file/line-based suppressions." - }, - "time": "2019-05-23T00:25:02+00:00", - "bin": [ - "phan", - "phan_client", - "tocheckstyle" - ], - "type": "project", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Phan\\": "src/Phan" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rasmus Lerdorf" - }, - { - "name": "Andrew S. Morrison" - }, - { - "name": "Tyson Andre" - } - ], - "description": "A static analyzer for PHP", - "keywords": [ - "analyzer", - "php", - "static" - ] - }, - { - "name": "phar-io/manifest", - "version": "1.0.3", - "version_normalized": "1.0.3.0", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^2.0", - "php": "^5.6 || ^7.0" - }, - "time": "2018-07-08T19:23:20+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)" - }, - { - "name": "phar-io/version", - "version": "2.0.1", - "version_normalized": "2.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "time": "2018-07-08T19:19:57+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints" - }, - { - "name": "php-cs-fixer/diff", - "version": "v1.3.0", - "version_normalized": "1.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/PHP-CS-Fixer/diff.git", - "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/78bb099e9c16361126c86ce82ec4405ebab8e756", - "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.23 || ^6.4.3", - "symfony/process": "^3.3" - }, - "time": "2018-02-15T16:58:55+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "SpacePossum" - } - ], - "description": "sebastian/diff v2 backport support for PHP5.6", - "homepage": "https://github.com/PHP-CS-Fixer", - "keywords": [ - "diff" - ] - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "version_normalized": "2.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "time": "2020-06-27T09:03:43+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ] - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.0", - "version_normalized": "5.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "3170448f5769fe19f456173d833734e0ff1b84df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/3170448f5769fe19f456173d833734e0ff1b84df", - "reference": "3170448f5769fe19f456173d833734e0ff1b84df", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "time": "2020-07-20T20:05:34+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock." - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.3.0", - "version_normalized": "1.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "e878a14a65245fbe78f8080eba03b47c3b705651" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e878a14a65245fbe78f8080eba03b47c3b705651", - "reference": "e878a14a65245fbe78f8080eba03b47c3b705651", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*" - }, - "time": "2020-06-27T10:12:23+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names" - }, - { - "name": "phpmd/phpmd", - "version": "2.8.2", - "version_normalized": "2.8.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpmd/phpmd.git", - "reference": "714629ed782537f638fe23c4346637659b779a77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/714629ed782537f638fe23c4346637659b779a77", - "reference": "714629ed782537f638fe23c4346637659b779a77", - "shasum": "" - }, - "require": { - "composer/xdebug-handler": "^1.0", - "ext-xml": "*", - "pdepend/pdepend": "^2.7.1", - "php": ">=5.3.9" - }, - "require-dev": { - "easy-doc/easy-doc": "0.0.0 || ^1.3.2", - "gregwar/rst": "^1.0", - "mikey179/vfsstream": "^1.6.4", - "phpunit/phpunit": "^4.8.36 || ^5.7.27", - "squizlabs/php_codesniffer": "^2.0" - }, - "time": "2020-02-16T20:15:50+00:00", - "bin": [ - "src/bin/phpmd" - ], - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "PHPMD\\": "src/main/php" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Manuel Pichler", - "email": "github@manuel-pichler.de", - "homepage": "https://github.com/manuelpichler", - "role": "Project Founder" - }, - { - "name": "Marc Würth", - "email": "ravage@bluewin.ch", - "homepage": "https://github.com/ravage84", - "role": "Project Maintainer" - }, - { - "name": "Other contributors", - "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", - "role": "Contributors" - } - ], - "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", - "homepage": "https://phpmd.org/", - "keywords": [ - "mess detection", - "mess detector", - "pdepend", - "phpmd", - "pmd" - ] - }, - { - "name": "phpspec/prophecy", - "version": "1.11.1", - "version_normalized": "1.11.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b20034be5efcdab4fb60ca3a29cba2949aead160", - "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2", - "phpdocumentor/reflection-docblock": "^5.0", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0" - }, - "time": "2020-07-08T12:44:21+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ] - }, - { - "name": "phpstan/phpstan", - "version": "0.12.34", - "version_normalized": "0.12.34.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "ad75388d71fb0b4a954f71a852fd989915a51cb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ad75388d71fb0b4a954f71a852fd989915a51cb7", - "reference": "ad75388d71fb0b4a954f71a852fd989915a51cb7", - "shasum": "" - }, - "require": { - "php": "^7.1|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "time": "2020-07-30T15:31:10+00:00", - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.12-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool" - }, - { - "name": "phpunit/php-code-coverage", - "version": "8.0.2", - "version_normalized": "8.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ca6647ffddd2add025ab3f21644a441d7c146cdc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca6647ffddd2add025ab3f21644a441d7c146cdc", - "reference": "ca6647ffddd2add025ab3f21644a441d7c146cdc", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^7.3", - "phpunit/php-file-iterator": "^3.0", - "phpunit/php-text-template": "^2.0", - "phpunit/php-token-stream": "^4.0", - "sebastian/code-unit-reverse-lookup": "^2.0", - "sebastian/environment": "^5.0", - "sebastian/version": "^3.0", - "theseer/tokenizer": "^1.1.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" - }, - "time": "2020-05-23T08:02:54+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "8.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ] - }, - { - "name": "phpunit/php-file-iterator", - "version": "3.0.4", - "version_normalized": "3.0.4.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "25fefc5b19835ca653877fe081644a3f8c1d915e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/25fefc5b19835ca653877fe081644a3f8c1d915e", - "reference": "25fefc5b19835ca653877fe081644a3f8c1d915e", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "time": "2020-07-11T05:18:21+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ] - }, - { - "name": "phpunit/php-invoker", - "version": "3.0.2", - "version_normalized": "3.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f6eedfed1085dd1f4c599629459a0277d25f9a66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f6eedfed1085dd1f4c599629459a0277d25f9a66", - "reference": "f6eedfed1085dd1f4c599629459a0277d25f9a66", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^9.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "time": "2020-06-26T11:53:53+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ] - }, - { - "name": "phpunit/php-text-template", - "version": "2.0.2", - "version_normalized": "2.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "6ff9c8ea4d3212b88fcf74e25e516e2c51c99324" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/6ff9c8ea4d3212b88fcf74e25e516e2c51c99324", - "reference": "6ff9c8ea4d3212b88fcf74e25e516e2c51c99324", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "time": "2020-06-26T11:55:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ] - }, - { - "name": "phpunit/php-timer", - "version": "5.0.1", - "version_normalized": "5.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "cc49734779cbb302bf51a44297dab8c4bbf941e7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/cc49734779cbb302bf51a44297dab8c4bbf941e7", - "reference": "cc49734779cbb302bf51a44297dab8c4bbf941e7", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.2" - }, - "time": "2020-06-26T11:58:13+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ] - }, - { - "name": "phpunit/php-token-stream", - "version": "4.0.3", - "version_normalized": "4.0.3.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "5672711b6b07b14d5ab694e700c62eeb82fcf374" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/5672711b6b07b14d5ab694e700c62eeb82fcf374", - "reference": "5672711b6b07b14d5ab694e700c62eeb82fcf374", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "time": "2020-06-27T06:36:25+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ] - }, - { - "name": "phpunit/phpunit", - "version": "9.2.6", - "version_normalized": "9.2.6.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1c6a9e4312e209e659f1fce3ce88dd197c2448f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c6a9e4312e209e659f1fce3ce88dd197c2448f6", - "reference": "1c6a9e4312e209e659f1fce3ce88dd197c2448f6", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.9.5", - "phar-io/manifest": "^1.0.3", - "phar-io/version": "^2.0.1", - "php": "^7.3", - "phpspec/prophecy": "^1.10.3", - "phpunit/php-code-coverage": "^8.0.2", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-invoker": "^3.0.2", - "phpunit/php-text-template": "^2.0.2", - "phpunit/php-timer": "^5.0.1", - "sebastian/code-unit": "^1.0.5", - "sebastian/comparator": "^4.0.3", - "sebastian/diff": "^4.0.1", - "sebastian/environment": "^5.1.2", - "sebastian/exporter": "^4.0.2", - "sebastian/global-state": "^4.0", - "sebastian/object-enumerator": "^4.0.2", - "sebastian/resource-operations": "^3.0.2", - "sebastian/type": "^2.1.1", - "sebastian/version": "^3.0.1" - }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" - }, - "time": "2020-07-13T17:55:55+00:00", - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ], - "files": [ - "src/Framework/Assert/Functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ] - }, - { - "name": "psr/container", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2017-02-14T16:28:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ] - }, - { - "name": "psr/log", - "version": "1.1.3", - "version_normalized": "1.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2020-03-23T09:12:05+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ] - }, - { - "name": "sabre/event", - "version": "5.1.0", - "version_normalized": "5.1.0.0", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/event.git", - "reference": "d00a17507af0e7544cfe17096372f5d733e3b276" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/event/zipball/d00a17507af0e7544cfe17096372f5d733e3b276", - "reference": "d00a17507af0e7544cfe17096372f5d733e3b276", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.16.1", - "phpunit/phpunit": "^7 || ^8" - }, - "time": "2020-01-31T18:52:29+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Sabre\\Event\\": "lib/" - }, - "files": [ - "lib/coroutine.php", - "lib/Loop/functions.php", - "lib/Promise/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" - } - ], - "description": "sabre/event is a library for lightweight event-based programming", - "homepage": "http://sabre.io/event/", - "keywords": [ - "EventEmitter", - "async", - "coroutine", - "eventloop", - "events", - "hooks", - "plugin", - "promise", - "reactor", - "signal" - ] - }, - { - "name": "sebastian/code-unit", - "version": "1.0.5", - "version_normalized": "1.0.5.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "c1e2df332c905079980b119c4db103117e5e5c90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/c1e2df332c905079980b119c4db103117e5e5c90", - "reference": "c1e2df332c905079980b119c4db103117e5e5c90", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "time": "2020-06-26T12:50:45+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.2", - "version_normalized": "2.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ee51f9bb0c6d8a43337055db3120829fa14da819" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ee51f9bb0c6d8a43337055db3120829fa14da819", - "reference": "ee51f9bb0c6d8a43337055db3120829fa14da819", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "time": "2020-06-26T12:04:00+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/" - }, - { - "name": "sebastian/comparator", - "version": "4.0.3", - "version_normalized": "4.0.3.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f", - "reference": "dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "time": "2020-06-26T12:05:46+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ] - }, - { - "name": "sebastian/diff", - "version": "4.0.2", - "version_normalized": "4.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113", - "reference": "1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0", - "symfony/process": "^4.2 || ^5" - }, - "time": "2020-06-30T04:46:02+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ] - }, - { - "name": "sebastian/environment", - "version": "5.1.2", - "version_normalized": "5.1.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2", - "reference": "0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "suggest": { - "ext-posix": "*" - }, - "time": "2020-06-26T12:07:24+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ] - }, - { - "name": "sebastian/exporter", - "version": "4.0.2", - "version_normalized": "4.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "571d721db4aec847a0e59690b954af33ebf9f023" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/571d721db4aec847a0e59690b954af33ebf9f023", - "reference": "571d721db4aec847a0e59690b954af33ebf9f023", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.2" - }, - "time": "2020-06-26T12:08:55+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ] - }, - { - "name": "sebastian/global-state", - "version": "4.0.0", - "version_normalized": "4.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bdb1e7c79e592b8c82cb1699be3c8743119b8a72", - "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72", - "shasum": "" - }, - "require": { - "php": "^7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^9.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "time": "2020-02-07T06:11:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ] - }, - { - "name": "sebastian/object-enumerator", - "version": "4.0.2", - "version_normalized": "4.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "074fed2d0a6d08e1677dd8ce9d32aecb384917b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/074fed2d0a6d08e1677dd8ce9d32aecb384917b8", - "reference": "074fed2d0a6d08e1677dd8ce9d32aecb384917b8", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "time": "2020-06-26T12:11:32+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/" - }, - { - "name": "sebastian/object-reflector", - "version": "2.0.2", - "version_normalized": "2.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "127a46f6b057441b201253526f81d5406d6c7840" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/127a46f6b057441b201253526f81d5406d6c7840", - "reference": "127a46f6b057441b201253526f81d5406d6c7840", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "time": "2020-06-26T12:12:55+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/" - }, - { - "name": "sebastian/recursion-context", - "version": "4.0.2", - "version_normalized": "4.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "062231bf61d2b9448c4fa5a7643b5e1829c11d63" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/062231bf61d2b9448c4fa5a7643b5e1829c11d63", - "reference": "062231bf61d2b9448c4fa5a7643b5e1829c11d63", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "time": "2020-06-26T12:14:17+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.2", - "version_normalized": "3.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0653718a5a629b065e91f774595267f8dc32e213" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0653718a5a629b065e91f774595267f8dc32e213", - "reference": "0653718a5a629b065e91f774595267f8dc32e213", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "time": "2020-06-26T12:16:22+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations" - }, - { - "name": "sebastian/type", - "version": "2.2.1", - "version_normalized": "2.2.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "86991e2b33446cd96e648c18bcdb1e95afb2c05a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/86991e2b33446cd96e648c18bcdb1e95afb2c05a", - "reference": "86991e2b33446cd96e648c18bcdb1e95afb2c05a", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.2" - }, - "time": "2020-07-05T08:31:53+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type" - }, - { - "name": "sebastian/version", - "version": "3.0.1", - "version_normalized": "3.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "626586115d0ed31cb71483be55beb759b5af5a3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/626586115d0ed31cb71483be55beb759b5af5a3c", - "reference": "626586115d0ed31cb71483be55beb759b5af5a3c", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "time": "2020-06-26T12:18:43+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.5.5", - "version_normalized": "3.5.5.0", - "source": { - "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/73e2e7f57d958e7228fce50dc0c61f58f017f9f6", - "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "time": "2020-04-17T01:09:41+00:00", - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards" - ] - }, - { - "name": "symfony/config", - "version": "v5.1.3", - "version_normalized": "5.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "cf63f0613a6c6918e96db39c07a43b01e19a0773" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/cf63f0613a6c6918e96db39c07a43b01e19a0773", - "reference": "cf63f0613a6c6918e96db39c07a43b01e19a0773", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/finder": "<4.4" - }, - "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^4.4|^5.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "time": "2020-07-15T10:53:22+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Config Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/console", - "version": "v4.4.11", - "version_normalized": "4.4.11.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "55d07021da933dd0d633ffdab6f45d5b230c7e02" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/55d07021da933dd0d633ffdab6f45d5b230c7e02", - "reference": "55d07021da933dd0d633ffdab6f45d5b230c7e02", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", - "symfony/lock": "<4.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "time": "2020-07-06T13:18:39+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/dependency-injection", - "version": "v5.1.3", - "version_normalized": "5.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "c45c3f26d2ae7c5239e5ad420b0c2717dbbc0bcb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/c45c3f26d2ae7c5239e5ad420b0c2717dbbc0bcb", - "reference": "c45c3f26d2ae7c5239e5ad420b0c2717dbbc0bcb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1.6|^2" - }, - "conflict": { - "symfony/config": "<5.1", - "symfony/finder": "<4.4", - "symfony/proxy-manager-bridge": "<4.4", - "symfony/yaml": "<4.4" - }, - "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0" - }, - "require-dev": { - "symfony/config": "^5.1", - "symfony/expression-language": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" - }, - "time": "2020-07-23T08:36:24+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DependencyInjection Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.1.3", - "version_normalized": "2.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5e20b83385a77593259c9f8beb2c43cd03b2ac14", - "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2020-06-06T08:49:21+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/event-dispatcher", - "version": "v4.4.11", - "version_normalized": "4.4.11.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "6140fc7047dafc5abbe84ba16a34a86c0b0229b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/6140fc7047dafc5abbe84ba16a34a86c0b0229b8", - "reference": "6140fc7047dafc5abbe84ba16a34a86c0b0229b8", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1" - }, - "conflict": { - "symfony/dependency-injection": "<3.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "time": "2020-06-18T17:59:13+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.9", - "version_normalized": "1.1.9.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "suggest": { - "psr/event-dispatcher": "", - "symfony/event-dispatcher-implementation": "" - }, - "time": "2020-07-06T13:19:58+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ] - }, - { - "name": "symfony/filesystem", - "version": "v5.1.3", - "version_normalized": "5.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "6e4320f06d5f2cce0d96530162491f4465179157" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/6e4320f06d5f2cce0d96530162491f4465179157", - "reference": "6e4320f06d5f2cce0d96530162491f4465179157", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" - }, - "time": "2020-05-30T20:35:19+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/finder", - "version": "v5.1.3", - "version_normalized": "5.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/4298870062bfc667cb78d2b379be4bf5dec5f187", - "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "time": "2020-05-20T17:43:50+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/options-resolver", - "version": "v5.1.3", - "version_normalized": "5.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "9ff59517938f88d90b6e65311fef08faa640f681" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/9ff59517938f88d90b6e65311fef08faa640f681", - "reference": "9ff59517938f88d90b6e65311fef08faa640f681", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15" - }, - "time": "2020-07-12T12:58:00+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony OptionsResolver Component", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ] - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.18.0", - "version_normalized": "1.18.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "time": "2020-07-14T12:35:20+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ] - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.18.0", - "version_normalized": "1.18.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", - "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "time": "2020-07-14T12:35:20+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ] - }, - { - "name": "symfony/polyfill-php70", - "version": "v1.18.0", - "version_normalized": "1.18.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", - "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", - "shasum": "" - }, - "require": { - "paragonie/random_compat": "~1.0|~2.0|~9.99", - "php": ">=5.3.3" - }, - "time": "2020-07-14T12:35:20+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ] - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.18.0", - "version_normalized": "1.18.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "639447d008615574653fb3bc60d1986d7172eaae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/639447d008615574653fb3bc60d1986d7172eaae", - "reference": "639447d008615574653fb3bc60d1986d7172eaae", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "time": "2020-07-14T12:35:20+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ] - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.18.0", - "version_normalized": "1.18.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", - "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "time": "2020-07-14T12:35:20+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ] - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.18.0", - "version_normalized": "1.18.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", - "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", - "shasum": "" - }, - "require": { - "php": ">=7.0.8" - }, - "time": "2020-07-14T12:35:20+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ] - }, - { - "name": "symfony/process", - "version": "v5.1.3", - "version_normalized": "5.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "1864216226af21eb76d9477f691e7cbf198e0402" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/1864216226af21eb76d9477f691e7cbf198e0402", - "reference": "1864216226af21eb76d9477f691e7cbf198e0402", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" - }, - "time": "2020-07-23T08:36:24+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/service-contracts", - "version": "v2.1.3", - "version_normalized": "2.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/58c7475e5457c5492c26cc740cc0ad7464be9442", - "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "time": "2020-07-06T13:23:11+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ] - }, - { - "name": "symfony/stopwatch", - "version": "v5.1.3", - "version_normalized": "5.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0f7c58cf81dbb5dd67d423a89d577524a2ec0323", - "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" - }, - "time": "2020-05-20T17:43:50+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Stopwatch Component", - "homepage": "https://symfony.com" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.0", - "version_normalized": "1.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "time": "2020-07-12T23:59:07+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats" - }, - { - "name": "webmozart/assert", - "version": "1.9.1", - "version_normalized": "1.9.1.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" - }, - "time": "2020-07-08T17:02:28+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ] - } -] diff --git a/vendor/composer/semver/CHANGELOG.md b/vendor/composer/semver/CHANGELOG.md deleted file mode 100644 index ee0c2ef..0000000 --- a/vendor/composer/semver/CHANGELOG.md +++ /dev/null @@ -1,78 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/). - -### [1.5.1] 2020-01-13 - - * Fixed: Parsing of aliased version was not validating the alias to be a valid version - -### [1.5.0] 2019-03-19 - - * Added: some support for date versions (e.g. 201903) in `~` operator - * Fixed: support for stabilities in `~` operator was inconsistent - -### [1.4.2] 2016-08-30 - - * Fixed: collapsing of complex constraints lead to buggy constraints - -### [1.4.1] 2016-06-02 - - * Changed: branch-like requirements no longer strip build metadata - [composer/semver#38](https://github.com/composer/semver/pull/38). - -### [1.4.0] 2016-03-30 - - * Added: getters on MultiConstraint - [composer/semver#35](https://github.com/composer/semver/pull/35). - -### [1.3.0] 2016-02-25 - - * Fixed: stability parsing - [composer/composer#1234](https://github.com/composer/composer/issues/4889). - * Changed: collapse contiguous constraints when possible. - -### [1.2.0] 2015-11-10 - - * Changed: allow multiple numerical identifiers in 'pre-release' version part. - * Changed: add more 'v' prefix support. - -### [1.1.0] 2015-11-03 - - * Changed: dropped redundant `test` namespace. - * Changed: minor adjustment in datetime parsing normalization. - * Changed: `ConstraintInterface` relaxed, setPrettyString is not required anymore. - * Changed: `AbstractConstraint` marked deprecated, will be removed in 2.0. - * Changed: `Constraint` is now extensible. - -### [1.0.0] 2015-09-21 - - * Break: `VersionConstraint` renamed to `Constraint`. - * Break: `SpecificConstraint` renamed to `AbstractConstraint`. - * Break: `LinkConstraintInterface` renamed to `ConstraintInterface`. - * Break: `VersionParser::parseNameVersionPairs` was removed. - * Changed: `VersionParser::parseConstraints` allows (but ignores) build metadata now. - * Changed: `VersionParser::parseConstraints` allows (but ignores) prefixing numeric versions with a 'v' now. - * Changed: Fixed namespace(s) of test files. - * Changed: `Comparator::compare` no longer throws `InvalidArgumentException`. - * Changed: `Constraint` now throws `InvalidArgumentException`. - -### [0.1.0] 2015-07-23 - - * Added: `Composer\Semver\Comparator`, various methods to compare versions. - * Added: various documents such as README.md, LICENSE, etc. - * Added: configuration files for Git, Travis, php-cs-fixer, phpunit. - * Break: the following namespaces were renamed: - - Namespace: `Composer\Package\Version` -> `Composer\Semver` - - Namespace: `Composer\Package\LinkConstraint` -> `Composer\Semver\Constraint` - - Namespace: `Composer\Test\Package\Version` -> `Composer\Test\Semver` - - Namespace: `Composer\Test\Package\LinkConstraint` -> `Composer\Test\Semver\Constraint` - * Changed: code style using php-cs-fixer. - -[1.5.1]: https://github.com/composer/semver/compare/1.5.0...1.5.1 -[1.5.0]: https://github.com/composer/semver/compare/1.4.2...1.5.0 -[1.4.2]: https://github.com/composer/semver/compare/1.4.1...1.4.2 -[1.4.1]: https://github.com/composer/semver/compare/1.4.0...1.4.1 -[1.4.0]: https://github.com/composer/semver/compare/1.3.0...1.4.0 -[1.3.0]: https://github.com/composer/semver/compare/1.2.0...1.3.0 -[1.2.0]: https://github.com/composer/semver/compare/1.1.0...1.2.0 -[1.1.0]: https://github.com/composer/semver/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/composer/semver/compare/0.1.0...1.0.0 -[0.1.0]: https://github.com/composer/semver/compare/5e0b9a4da...0.1.0 diff --git a/vendor/composer/semver/LICENSE b/vendor/composer/semver/LICENSE deleted file mode 100644 index 4669758..0000000 --- a/vendor/composer/semver/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2015 Composer - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/composer/semver/README.md b/vendor/composer/semver/README.md deleted file mode 100644 index 143daa0..0000000 --- a/vendor/composer/semver/README.md +++ /dev/null @@ -1,70 +0,0 @@ -composer/semver -=============== - -Semver library that offers utilities, version constraint parsing and validation. - -Originally written as part of [composer/composer](https://github.com/composer/composer), -now extracted and made available as a stand-alone library. - -[![Build Status](https://travis-ci.org/composer/semver.svg?branch=master)](https://travis-ci.org/composer/semver) - - -Installation ------------- - -Install the latest version with: - -```bash -$ composer require composer/semver -``` - - -Requirements ------------- - -* PHP 5.3.2 is required but using the latest version of PHP is highly recommended. - - -Version Comparison ------------------- - -For details on how versions are compared, refer to the [Versions](https://getcomposer.org/doc/articles/versions.md) -article in the documentation section of the [getcomposer.org](https://getcomposer.org) website. - - -Basic usage ------------ - -### Comparator - -The `Composer\Semver\Comparator` class provides the following methods for comparing versions: - -* greaterThan($v1, $v2) -* greaterThanOrEqualTo($v1, $v2) -* lessThan($v1, $v2) -* lessThanOrEqualTo($v1, $v2) -* equalTo($v1, $v2) -* notEqualTo($v1, $v2) - -Each function takes two version strings as arguments. For example: - -```php -use Composer\Semver\Comparator; - -Comparator::greaterThan('1.25.0', '1.24.0'); // 1.25.0 > 1.24.0 -``` - -### Semver - -The `Composer\Semver\Semver` class provides the following methods: - -* satisfies($version, $constraints) -* satisfiedBy(array $versions, $constraint) -* sort($versions) -* rsort($versions) - - -License -------- - -composer/semver is licensed under the MIT License, see the LICENSE file for details. diff --git a/vendor/composer/semver/composer.json b/vendor/composer/semver/composer.json deleted file mode 100644 index 981e7d1..0000000 --- a/vendor/composer/semver/composer.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "composer/semver", - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "type": "library", - "license": "MIT", - "keywords": [ - "semver", - "semantic", - "versioning", - "validation" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues" - }, - "require": { - "php": "^5.3.2 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5" - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "Composer\\Semver\\": "tests" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "scripts": { - "test": "phpunit" - } -} diff --git a/vendor/composer/semver/src/Comparator.php b/vendor/composer/semver/src/Comparator.php deleted file mode 100644 index a9d758f..0000000 --- a/vendor/composer/semver/src/Comparator.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; - -class Comparator -{ - /** - * Evaluates the expression: $version1 > $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function greaterThan($version1, $version2) - { - return self::compare($version1, '>', $version2); - } - - /** - * Evaluates the expression: $version1 >= $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function greaterThanOrEqualTo($version1, $version2) - { - return self::compare($version1, '>=', $version2); - } - - /** - * Evaluates the expression: $version1 < $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function lessThan($version1, $version2) - { - return self::compare($version1, '<', $version2); - } - - /** - * Evaluates the expression: $version1 <= $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function lessThanOrEqualTo($version1, $version2) - { - return self::compare($version1, '<=', $version2); - } - - /** - * Evaluates the expression: $version1 == $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function equalTo($version1, $version2) - { - return self::compare($version1, '==', $version2); - } - - /** - * Evaluates the expression: $version1 != $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function notEqualTo($version1, $version2) - { - return self::compare($version1, '!=', $version2); - } - - /** - * Evaluates the expression: $version1 $operator $version2. - * - * @param string $version1 - * @param string $operator - * @param string $version2 - * - * @return bool - */ - public static function compare($version1, $operator, $version2) - { - $constraint = new Constraint($operator, $version2); - - return $constraint->matches(new Constraint('==', $version1)); - } -} diff --git a/vendor/composer/semver/src/Constraint/AbstractConstraint.php b/vendor/composer/semver/src/Constraint/AbstractConstraint.php deleted file mode 100644 index 7b5270f..0000000 --- a/vendor/composer/semver/src/Constraint/AbstractConstraint.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -trigger_error('The ' . __NAMESPACE__ . '\AbstractConstraint abstract class is deprecated, there is no replacement for it, it will be removed in the next major version.', E_USER_DEPRECATED); - -/** - * Base constraint class. - */ -abstract class AbstractConstraint implements ConstraintInterface -{ - /** @var string */ - protected $prettyString; - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - if ($provider instanceof $this) { - // see note at bottom of this class declaration - return $this->matchSpecific($provider); - } - - // turn matching around to find a match - return $provider->matches($this); - } - - /** - * @param string $prettyString - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * @return string - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return $this->__toString(); - } - - // implementations must implement a method of this format: - // not declared abstract here because type hinting violates parameter coherence (TODO right word?) - // public function matchSpecific( $provider); -} diff --git a/vendor/composer/semver/src/Constraint/Constraint.php b/vendor/composer/semver/src/Constraint/Constraint.php deleted file mode 100644 index c8c90f0..0000000 --- a/vendor/composer/semver/src/Constraint/Constraint.php +++ /dev/null @@ -1,215 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * Defines a constraint. - */ -class Constraint implements ConstraintInterface -{ - /* operator integer values */ - const OP_EQ = 0; - const OP_LT = 1; - const OP_LE = 2; - const OP_GT = 3; - const OP_GE = 4; - const OP_NE = 5; - - /** - * Operator to integer translation table. - * - * @var array - */ - private static $transOpStr = array( - '=' => self::OP_EQ, - '==' => self::OP_EQ, - '<' => self::OP_LT, - '<=' => self::OP_LE, - '>' => self::OP_GT, - '>=' => self::OP_GE, - '<>' => self::OP_NE, - '!=' => self::OP_NE, - ); - - /** - * Integer to operator translation table. - * - * @var array - */ - private static $transOpInt = array( - self::OP_EQ => '==', - self::OP_LT => '<', - self::OP_LE => '<=', - self::OP_GT => '>', - self::OP_GE => '>=', - self::OP_NE => '!=', - ); - - /** @var string */ - protected $operator; - - /** @var string */ - protected $version; - - /** @var string */ - protected $prettyString; - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - if ($provider instanceof $this) { - return $this->matchSpecific($provider); - } - - // turn matching around to find a match - return $provider->matches($this); - } - - /** - * @param string $prettyString - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * @return string - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return $this->__toString(); - } - - /** - * Get all supported comparison operators. - * - * @return array - */ - public static function getSupportedOperators() - { - return array_keys(self::$transOpStr); - } - - /** - * Sets operator and version to compare with. - * - * @param string $operator - * @param string $version - * - * @throws \InvalidArgumentException if invalid operator is given. - */ - public function __construct($operator, $version) - { - if (!isset(self::$transOpStr[$operator])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid operator "%s" given, expected one of: %s', - $operator, - implode(', ', self::getSupportedOperators()) - )); - } - - $this->operator = self::$transOpStr[$operator]; - $this->version = $version; - } - - /** - * @param string $a - * @param string $b - * @param string $operator - * @param bool $compareBranches - * - * @throws \InvalidArgumentException if invalid operator is given. - * - * @return bool - */ - public function versionCompare($a, $b, $operator, $compareBranches = false) - { - if (!isset(self::$transOpStr[$operator])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid operator "%s" given, expected one of: %s', - $operator, - implode(', ', self::getSupportedOperators()) - )); - } - - $aIsBranch = 'dev-' === substr($a, 0, 4); - $bIsBranch = 'dev-' === substr($b, 0, 4); - - if ($aIsBranch && $bIsBranch) { - return $operator === '==' && $a === $b; - } - - // when branches are not comparable, we make sure dev branches never match anything - if (!$compareBranches && ($aIsBranch || $bIsBranch)) { - return false; - } - - return version_compare($a, $b, $operator); - } - - /** - * @param Constraint $provider - * @param bool $compareBranches - * - * @return bool - */ - public function matchSpecific(Constraint $provider, $compareBranches = false) - { - $noEqualOp = str_replace('=', '', self::$transOpInt[$this->operator]); - $providerNoEqualOp = str_replace('=', '', self::$transOpInt[$provider->operator]); - - $isEqualOp = self::OP_EQ === $this->operator; - $isNonEqualOp = self::OP_NE === $this->operator; - $isProviderEqualOp = self::OP_EQ === $provider->operator; - $isProviderNonEqualOp = self::OP_NE === $provider->operator; - - // '!=' operator is match when other operator is not '==' operator or version is not match - // these kinds of comparisons always have a solution - if ($isNonEqualOp || $isProviderNonEqualOp) { - return (!$isEqualOp && !$isProviderEqualOp) - || $this->versionCompare($provider->version, $this->version, '!=', $compareBranches); - } - - // an example for the condition is <= 2.0 & < 1.0 - // these kinds of comparisons always have a solution - if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) { - return true; - } - - if ($this->versionCompare($provider->version, $this->version, self::$transOpInt[$this->operator], $compareBranches)) { - // special case, e.g. require >= 1.0 and provide < 1.0 - // 1.0 >= 1.0 but 1.0 is outside of the provided interval - return !($provider->version === $this->version - && self::$transOpInt[$provider->operator] === $providerNoEqualOp - && self::$transOpInt[$this->operator] !== $noEqualOp); - } - - return false; - } - - /** - * @return string - */ - public function __toString() - { - return self::$transOpInt[$this->operator] . ' ' . $this->version; - } -} diff --git a/vendor/composer/semver/src/Constraint/ConstraintInterface.php b/vendor/composer/semver/src/Constraint/ConstraintInterface.php deleted file mode 100644 index 7cb13b6..0000000 --- a/vendor/composer/semver/src/Constraint/ConstraintInterface.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -interface ConstraintInterface -{ - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider); - - /** - * @return string - */ - public function getPrettyString(); - - /** - * @return string - */ - public function __toString(); -} diff --git a/vendor/composer/semver/src/Constraint/EmptyConstraint.php b/vendor/composer/semver/src/Constraint/EmptyConstraint.php deleted file mode 100644 index cb89cd2..0000000 --- a/vendor/composer/semver/src/Constraint/EmptyConstraint.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * Defines the absence of a constraint. - */ -class EmptyConstraint implements ConstraintInterface -{ - /** @var string */ - protected $prettyString; - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - return true; - } - - /** - * @param $prettyString - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * @return string - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return (string) $this; - } - - /** - * @return string - */ - public function __toString() - { - return '[]'; - } -} diff --git a/vendor/composer/semver/src/Constraint/MultiConstraint.php b/vendor/composer/semver/src/Constraint/MultiConstraint.php deleted file mode 100644 index f8a60e4..0000000 --- a/vendor/composer/semver/src/Constraint/MultiConstraint.php +++ /dev/null @@ -1,120 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * Defines a conjunctive or disjunctive set of constraints. - */ -class MultiConstraint implements ConstraintInterface -{ - /** @var ConstraintInterface[] */ - protected $constraints; - - /** @var string */ - protected $prettyString; - - /** @var bool */ - protected $conjunctive; - - /** - * @param ConstraintInterface[] $constraints A set of constraints - * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive - */ - public function __construct(array $constraints, $conjunctive = true) - { - $this->constraints = $constraints; - $this->conjunctive = $conjunctive; - } - - /** - * @return ConstraintInterface[] - */ - public function getConstraints() - { - return $this->constraints; - } - - /** - * @return bool - */ - public function isConjunctive() - { - return $this->conjunctive; - } - - /** - * @return bool - */ - public function isDisjunctive() - { - return !$this->conjunctive; - } - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - if (false === $this->conjunctive) { - foreach ($this->constraints as $constraint) { - if ($constraint->matches($provider)) { - return true; - } - } - - return false; - } - - foreach ($this->constraints as $constraint) { - if (!$constraint->matches($provider)) { - return false; - } - } - - return true; - } - - /** - * @param string $prettyString - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * @return string - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return (string) $this; - } - - /** - * @return string - */ - public function __toString() - { - $constraints = array(); - foreach ($this->constraints as $constraint) { - $constraints[] = (string) $constraint; - } - - return '[' . implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']'; - } -} diff --git a/vendor/composer/semver/src/Semver.php b/vendor/composer/semver/src/Semver.php deleted file mode 100644 index 3ab2b68..0000000 --- a/vendor/composer/semver/src/Semver.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; - -class Semver -{ - const SORT_ASC = 1; - const SORT_DESC = -1; - - /** @var VersionParser */ - private static $versionParser; - - /** - * Determine if given version satisfies given constraints. - * - * @param string $version - * @param string $constraints - * - * @return bool - */ - public static function satisfies($version, $constraints) - { - if (null === self::$versionParser) { - self::$versionParser = new VersionParser(); - } - - $versionParser = self::$versionParser; - $provider = new Constraint('==', $versionParser->normalize($version)); - $parsedConstraints = $versionParser->parseConstraints($constraints); - - return $parsedConstraints->matches($provider); - } - - /** - * Return all versions that satisfy given constraints. - * - * @param array $versions - * @param string $constraints - * - * @return array - */ - public static function satisfiedBy(array $versions, $constraints) - { - $versions = array_filter($versions, function ($version) use ($constraints) { - return Semver::satisfies($version, $constraints); - }); - - return array_values($versions); - } - - /** - * Sort given array of versions. - * - * @param array $versions - * - * @return array - */ - public static function sort(array $versions) - { - return self::usort($versions, self::SORT_ASC); - } - - /** - * Sort given array of versions in reverse. - * - * @param array $versions - * - * @return array - */ - public static function rsort(array $versions) - { - return self::usort($versions, self::SORT_DESC); - } - - /** - * @param array $versions - * @param int $direction - * - * @return array - */ - private static function usort(array $versions, $direction) - { - if (null === self::$versionParser) { - self::$versionParser = new VersionParser(); - } - - $versionParser = self::$versionParser; - $normalized = array(); - - // Normalize outside of usort() scope for minor performance increase. - // Creates an array of arrays: [[normalized, key], ...] - foreach ($versions as $key => $version) { - $normalized[] = array($versionParser->normalize($version), $key); - } - - usort($normalized, function (array $left, array $right) use ($direction) { - if ($left[0] === $right[0]) { - return 0; - } - - if (Comparator::lessThan($left[0], $right[0])) { - return -$direction; - } - - return $direction; - }); - - // Recreate input array, using the original indexes which are now in sorted order. - $sorted = array(); - foreach ($normalized as $item) { - $sorted[] = $versions[$item[1]]; - } - - return $sorted; - } -} diff --git a/vendor/composer/semver/src/VersionParser.php b/vendor/composer/semver/src/VersionParser.php deleted file mode 100644 index 9a7d0db..0000000 --- a/vendor/composer/semver/src/VersionParser.php +++ /dev/null @@ -1,545 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\ConstraintInterface; -use Composer\Semver\Constraint\EmptyConstraint; -use Composer\Semver\Constraint\MultiConstraint; -use Composer\Semver\Constraint\Constraint; - -/** - * Version parser. - * - * @author Jordi Boggiano - */ -class VersionParser -{ - /** - * Regex to match pre-release data (sort of). - * - * Due to backwards compatibility: - * - Instead of enforcing hyphen, an underscore, dot or nothing at all are also accepted. - * - Only stabilities as recognized by Composer are allowed to precede a numerical identifier. - * - Numerical-only pre-release identifiers are not supported, see tests. - * - * |--------------| - * [major].[minor].[patch] -[pre-release] +[build-metadata] - * - * @var string - */ - private static $modifierRegex = '[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)((?:[.-]?\d+)*+)?)?([.-]?dev)?'; - - /** @var array */ - private static $stabilities = array('stable', 'RC', 'beta', 'alpha', 'dev'); - - /** - * Returns the stability of a version. - * - * @param string $version - * - * @return string - */ - public static function parseStability($version) - { - $version = preg_replace('{#.+$}i', '', $version); - - if (strpos($version, 'dev-') === 0 || '-dev' === substr($version, -4)) { - return 'dev'; - } - - preg_match('{' . self::$modifierRegex . '(?:\+.*)?$}i', strtolower($version), $match); - - if (!empty($match[3])) { - return 'dev'; - } - - if (!empty($match[1])) { - if ('beta' === $match[1] || 'b' === $match[1]) { - return 'beta'; - } - if ('alpha' === $match[1] || 'a' === $match[1]) { - return 'alpha'; - } - if ('rc' === $match[1]) { - return 'RC'; - } - } - - return 'stable'; - } - - /** - * @param string $stability - * - * @return string - */ - public static function normalizeStability($stability) - { - $stability = strtolower($stability); - - return $stability === 'rc' ? 'RC' : $stability; - } - - /** - * Normalizes a version string to be able to perform comparisons on it. - * - * @param string $version - * @param string $fullVersion optional complete version string to give more context - * - * @throws \UnexpectedValueException - * - * @return string - */ - public function normalize($version, $fullVersion = null) - { - $version = trim($version); - if (null === $fullVersion) { - $fullVersion = $version; - } - - // strip off aliasing - if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $version, $match)) { - // verify that the alias is a version without constraint - $this->normalize($match[2]); - - $version = $match[1]; - } - - // match master-like branches - if (preg_match('{^(?:dev-)?(?:master|trunk|default)$}i', $version)) { - return '9999999-dev'; - } - - // if requirement is branch-like, use full name - if (stripos($version, 'dev-') === 0) { - return 'dev-' . substr($version, 4); - } - - // strip off build metadata - if (preg_match('{^([^,\s+]++)\+[^\s]++$}', $version, $match)) { - $version = $match[1]; - } - - // match classical versioning - if (preg_match('{^v?(\d{1,5})(\.\d++)?(\.\d++)?(\.\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) { - $version = $matches[1] - . (!empty($matches[2]) ? $matches[2] : '.0') - . (!empty($matches[3]) ? $matches[3] : '.0') - . (!empty($matches[4]) ? $matches[4] : '.0'); - $index = 5; - // match date(time) based versioning - } elseif (preg_match('{^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3})?)' . self::$modifierRegex . '$}i', $version, $matches)) { - $version = preg_replace('{\D}', '.', $matches[1]); - $index = 2; - } - - // add version modifiers if a version was matched - if (isset($index)) { - if (!empty($matches[$index])) { - if ('stable' === $matches[$index]) { - return $version; - } - $version .= '-' . $this->expandStability($matches[$index]) . (!empty($matches[$index + 1]) ? ltrim($matches[$index + 1], '.-') : ''); - } - - if (!empty($matches[$index + 2])) { - $version .= '-dev'; - } - - return $version; - } - - // match dev branches - if (preg_match('{(.*?)[.-]?dev$}i', $version, $match)) { - try { - return $this->normalizeBranch($match[1]); - } catch (\Exception $e) { - } - } - - $extraMessage = ''; - if (preg_match('{ +as +' . preg_quote($version) . '$}', $fullVersion)) { - $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version'; - } elseif (preg_match('{^' . preg_quote($version) . ' +as +}', $fullVersion)) { - $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-'; - } - - throw new \UnexpectedValueException('Invalid version string "' . $version . '"' . $extraMessage); - } - - /** - * Extract numeric prefix from alias, if it is in numeric format, suitable for version comparison. - * - * @param string $branch Branch name (e.g. 2.1.x-dev) - * - * @return string|false Numeric prefix if present (e.g. 2.1.) or false - */ - public function parseNumericAliasPrefix($branch) - { - if (preg_match('{^(?P(\d++\\.)*\d++)(?:\.x)?-dev$}i', $branch, $matches)) { - return $matches['version'] . '.'; - } - - return false; - } - - /** - * Normalizes a branch name to be able to perform comparisons on it. - * - * @param string $name - * - * @return string - */ - public function normalizeBranch($name) - { - $name = trim($name); - - if (in_array($name, array('master', 'trunk', 'default'))) { - return $this->normalize($name); - } - - if (preg_match('{^v?(\d++)(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?$}i', $name, $matches)) { - $version = ''; - for ($i = 1; $i < 5; ++$i) { - $version .= isset($matches[$i]) ? str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x'; - } - - return str_replace('x', '9999999', $version) . '-dev'; - } - - return 'dev-' . $name; - } - - /** - * Parses a constraint string into MultiConstraint and/or Constraint objects. - * - * @param string $constraints - * - * @return ConstraintInterface - */ - public function parseConstraints($constraints) - { - $prettyConstraint = $constraints; - - if (preg_match('{^([^,\s]*?)@(' . implode('|', self::$stabilities) . ')$}i', $constraints, $match)) { - $constraints = empty($match[1]) ? '*' : $match[1]; - } - - if (preg_match('{^(dev-[^,\s@]+?|[^,\s@]+?\.x-dev)#.+$}i', $constraints, $match)) { - $constraints = $match[1]; - } - - $orConstraints = preg_split('{\s*\|\|?\s*}', trim($constraints)); - $orGroups = array(); - - foreach ($orConstraints as $constraints) { - $andConstraints = preg_split('{(?< ,]) *(? 1) { - $constraintObjects = array(); - foreach ($andConstraints as $constraint) { - foreach ($this->parseConstraint($constraint) as $parsedConstraint) { - $constraintObjects[] = $parsedConstraint; - } - } - } else { - $constraintObjects = $this->parseConstraint($andConstraints[0]); - } - - if (1 === count($constraintObjects)) { - $constraint = $constraintObjects[0]; - } else { - $constraint = new MultiConstraint($constraintObjects); - } - - $orGroups[] = $constraint; - } - - if (1 === count($orGroups)) { - $constraint = $orGroups[0]; - } elseif (2 === count($orGroups) - // parse the two OR groups and if they are contiguous we collapse - // them into one constraint - && $orGroups[0] instanceof MultiConstraint - && $orGroups[1] instanceof MultiConstraint - && 2 === count($orGroups[0]->getConstraints()) - && 2 === count($orGroups[1]->getConstraints()) - && ($a = (string) $orGroups[0]) - && strpos($a, '[>=') === 0 && (false !== ($posA = strpos($a, '<', 4))) - && ($b = (string) $orGroups[1]) - && strpos($b, '[>=') === 0 && (false !== ($posB = strpos($b, '<', 4))) - && substr($a, $posA + 2, -1) === substr($b, 4, $posB - 5) - ) { - $constraint = new MultiConstraint(array( - new Constraint('>=', substr($a, 4, $posA - 5)), - new Constraint('<', substr($b, $posB + 2, -1)), - )); - } else { - $constraint = new MultiConstraint($orGroups, false); - } - - $constraint->setPrettyString($prettyConstraint); - - return $constraint; - } - - /** - * @param string $constraint - * - * @throws \UnexpectedValueException - * - * @return array - */ - private function parseConstraint($constraint) - { - if (preg_match('{^([^,\s]+?)@(' . implode('|', self::$stabilities) . ')$}i', $constraint, $match)) { - $constraint = $match[1]; - if ($match[2] !== 'stable') { - $stabilityModifier = $match[2]; - } - } - - if (preg_match('{^v?[xX*](\.[xX*])*$}i', $constraint)) { - return array(new EmptyConstraint()); - } - - $versionRegex = 'v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.(\d++))?' . self::$modifierRegex . '(?:\+[^\s]+)?'; - - // Tilde Range - // - // Like wildcard constraints, unsuffixed tilde constraints say that they must be greater than the previous - // version, to ensure that unstable instances of the current version are allowed. However, if a stability - // suffix is added to the constraint, then a >= match on the current version is used instead. - if (preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) { - if (strpos($constraint, '~>') === 0) { - throw new \UnexpectedValueException( - 'Could not parse version constraint ' . $constraint . ': ' . - 'Invalid operator "~>", you probably meant to use the "~" operator' - ); - } - - // Work out which position in the version we are operating at - if (isset($matches[4]) && '' !== $matches[4] && null !== $matches[4]) { - $position = 4; - } elseif (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { - $position = 3; - } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { - $position = 2; - } else { - $position = 1; - } - - // Calculate the stability suffix - $stabilitySuffix = ''; - if (empty($matches[5]) && empty($matches[7])) { - $stabilitySuffix .= '-dev'; - } - - $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1)); - $lowerBound = new Constraint('>=', $lowVersion); - - // For upper bound, we increment the position of one more significance, - // but highPosition = 0 would be illegal - $highPosition = max(1, $position - 1); - $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev'; - $upperBound = new Constraint('<', $highVersion); - - return array( - $lowerBound, - $upperBound, - ); - } - - // Caret Range - // - // Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple. - // In other words, this allows patch and minor updates for versions 1.0.0 and above, patch updates for - // versions 0.X >=0.1.0, and no updates for versions 0.0.X - if (preg_match('{^\^' . $versionRegex . '($)}i', $constraint, $matches)) { - // Work out which position in the version we are operating at - if ('0' !== $matches[1] || '' === $matches[2] || null === $matches[2]) { - $position = 1; - } elseif ('0' !== $matches[2] || '' === $matches[3] || null === $matches[3]) { - $position = 2; - } else { - $position = 3; - } - - // Calculate the stability suffix - $stabilitySuffix = ''; - if (empty($matches[5]) && empty($matches[7])) { - $stabilitySuffix .= '-dev'; - } - - $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1)); - $lowerBound = new Constraint('>=', $lowVersion); - - // For upper bound, we increment the position of one more significance, - // but highPosition = 0 would be illegal - $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; - $upperBound = new Constraint('<', $highVersion); - - return array( - $lowerBound, - $upperBound, - ); - } - - // X Range - // - // Any of X, x, or * may be used to "stand in" for one of the numeric values in the [major, minor, patch] tuple. - // A partial version range is treated as an X-Range, so the special character is in fact optional. - if (preg_match('{^v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.[xX*])++$}', $constraint, $matches)) { - if (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { - $position = 3; - } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { - $position = 2; - } else { - $position = 1; - } - - $lowVersion = $this->manipulateVersionString($matches, $position) . '-dev'; - $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; - - if ($lowVersion === '0.0.0.0-dev') { - return array(new Constraint('<', $highVersion)); - } - - return array( - new Constraint('>=', $lowVersion), - new Constraint('<', $highVersion), - ); - } - - // Hyphen Range - // - // Specifies an inclusive set. If a partial version is provided as the first version in the inclusive range, - // then the missing pieces are replaced with zeroes. If a partial version is provided as the second version in - // the inclusive range, then all versions that start with the supplied parts of the tuple are accepted, but - // nothing that would be greater than the provided tuple parts. - if (preg_match('{^(?P' . $versionRegex . ') +- +(?P' . $versionRegex . ')($)}i', $constraint, $matches)) { - // Calculate the stability suffix - $lowStabilitySuffix = ''; - if (empty($matches[6]) && empty($matches[8])) { - $lowStabilitySuffix = '-dev'; - } - - $lowVersion = $this->normalize($matches['from']); - $lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix); - - $empty = function ($x) { - return ($x === 0 || $x === '0') ? false : empty($x); - }; - - if ((!$empty($matches[11]) && !$empty($matches[12])) || !empty($matches[14]) || !empty($matches[16])) { - $highVersion = $this->normalize($matches['to']); - $upperBound = new Constraint('<=', $highVersion); - } else { - $highMatch = array('', $matches[10], $matches[11], $matches[12], $matches[13]); - $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[11]) ? 1 : 2, 1) . '-dev'; - $upperBound = new Constraint('<', $highVersion); - } - - return array( - $lowerBound, - $upperBound, - ); - } - - // Basic Comparators - if (preg_match('{^(<>|!=|>=?|<=?|==?)?\s*(.*)}', $constraint, $matches)) { - try { - $version = $this->normalize($matches[2]); - - if (!empty($stabilityModifier) && self::parseStability($version) === 'stable') { - $version .= '-' . $stabilityModifier; - } elseif ('<' === $matches[1] || '>=' === $matches[1]) { - if (!preg_match('/-' . self::$modifierRegex . '$/', strtolower($matches[2]))) { - if (strpos($matches[2], 'dev-') !== 0) { - $version .= '-dev'; - } - } - } - - return array(new Constraint($matches[1] ?: '=', $version)); - } catch (\Exception $e) { - } - } - - $message = 'Could not parse version constraint ' . $constraint; - if (isset($e)) { - $message .= ': ' . $e->getMessage(); - } - - throw new \UnexpectedValueException($message); - } - - /** - * Increment, decrement, or simply pad a version number. - * - * Support function for {@link parseConstraint()} - * - * @param array $matches Array with version parts in array indexes 1,2,3,4 - * @param int $position 1,2,3,4 - which segment of the version to increment/decrement - * @param int $increment - * @param string $pad The string to pad version parts after $position - * - * @return string The new version - */ - private function manipulateVersionString($matches, $position, $increment = 0, $pad = '0') - { - for ($i = 4; $i > 0; --$i) { - if ($i > $position) { - $matches[$i] = $pad; - } elseif ($i === $position && $increment) { - $matches[$i] += $increment; - // If $matches[$i] was 0, carry the decrement - if ($matches[$i] < 0) { - $matches[$i] = $pad; - --$position; - - // Return null on a carry overflow - if ($i === 1) { - return null; - } - } - } - } - - return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4]; - } - - /** - * Expand shorthand stability string to long version. - * - * @param string $stability - * - * @return string - */ - private function expandStability($stability) - { - $stability = strtolower($stability); - - switch ($stability) { - case 'a': - return 'alpha'; - case 'b': - return 'beta'; - case 'p': - case 'pl': - return 'patch'; - case 'rc': - return 'RC'; - default: - return $stability; - } - } -} diff --git a/vendor/composer/xdebug-handler/CHANGELOG.md b/vendor/composer/xdebug-handler/CHANGELOG.md deleted file mode 100644 index 17dfc3f..0000000 --- a/vendor/composer/xdebug-handler/CHANGELOG.md +++ /dev/null @@ -1,74 +0,0 @@ -## [Unreleased] - -## [1.4.2] - 2020-06-04 - * Fixed: ignore SIGINTs to let the restarted process handle them. - -## [1.4.1] - 2020-03-01 - * Fixed: restart fails if an ini file is empty. - -## [1.4.0] - 2019-11-06 - * Added: support for `NO_COLOR` environment variable: https://no-color.org - * Added: color support for Hyper terminal: https://github.com/zeit/hyper - * Fixed: correct capitalization of Xdebug (apparently). - * Fixed: improved handling for uopz extension. - -## [1.3.3] - 2019-05-27 - * Fixed: add environment changes to `$_ENV` if it is being used. - -## [1.3.2] - 2019-01-28 - * Fixed: exit call being blocked by uopz extension, resulting in application code running twice. - -## [1.3.1] - 2018-11-29 - * Fixed: fail restart if `passthru` has been disabled in `disable_functions`. - * Fixed: fail restart if an ini file cannot be opened, otherwise settings will be missing. - -## [1.3.0] - 2018-08-31 - * Added: `setPersistent` method to use environment variables for the restart. - * Fixed: improved debugging by writing output to stderr. - * Fixed: no restart when `php_ini_scanned_files` is not functional and is needed. - -## [1.2.1] - 2018-08-23 - * Fixed: fatal error with apc, when using `apc.mmap_file_mask`. - -## [1.2.0] - 2018-08-16 - * Added: debug information using `XDEBUG_HANDLER_DEBUG`. - * Added: fluent interface for setters. - * Added: `PhpConfig` helper class for calling PHP sub-processes. - * Added: `PHPRC` original value to restart stettings, for use in a restarted process. - * Changed: internal procedure to disable ini-scanning, using `-n` command-line option. - * Fixed: replaced `escapeshellarg` usage to avoid locale problems. - * Fixed: improved color-option handling to respect double-dash delimiter. - * Fixed: color-option handling regression from main script changes. - * Fixed: improved handling when checking main script. - * Fixed: handling for standard input, that never actually did anything. - * Fixed: fatal error when ctype extension is not available. - -## [1.1.0] - 2018-04-11 - * Added: `getRestartSettings` method for calling PHP processes in a restarted process. - * Added: API definition and @internal class annotations. - * Added: protected `requiresRestart` method for extending classes. - * Added: `setMainScript` method for applications that change the working directory. - * Changed: private `tmpIni` variable to protected for extending classes. - * Fixed: environment variables not available in $_SERVER when restored in the restart. - * Fixed: relative path problems caused by Phar::interceptFileFuncs. - * Fixed: incorrect handling when script file cannot be found. - -## [1.0.0] - 2018-03-08 - * Added: PSR3 logging for optional status output. - * Added: existing ini settings are merged to catch command-line overrides. - * Added: code, tests and other artefacts to decouple from Composer. - * Break: the following class was renamed: - - `Composer\XdebugHandler` -> `Composer\XdebugHandler\XdebugHandler` - -[Unreleased]: https://github.com/composer/xdebug-handler/compare/1.4.2...HEAD -[1.4.2]: https://github.com/composer/xdebug-handler/compare/1.4.1...1.4.2 -[1.4.1]: https://github.com/composer/xdebug-handler/compare/1.4.0...1.4.1 -[1.4.0]: https://github.com/composer/xdebug-handler/compare/1.3.3...1.4.0 -[1.3.3]: https://github.com/composer/xdebug-handler/compare/1.3.2...1.3.3 -[1.3.2]: https://github.com/composer/xdebug-handler/compare/1.3.1...1.3.2 -[1.3.1]: https://github.com/composer/xdebug-handler/compare/1.3.0...1.3.1 -[1.3.0]: https://github.com/composer/xdebug-handler/compare/1.2.1...1.3.0 -[1.2.1]: https://github.com/composer/xdebug-handler/compare/1.2.0...1.2.1 -[1.2.0]: https://github.com/composer/xdebug-handler/compare/1.1.0...1.2.0 -[1.1.0]: https://github.com/composer/xdebug-handler/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/composer/xdebug-handler/compare/d66f0d15cb57...1.0.0 diff --git a/vendor/composer/xdebug-handler/LICENSE b/vendor/composer/xdebug-handler/LICENSE deleted file mode 100644 index 963618a..0000000 --- a/vendor/composer/xdebug-handler/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Composer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/composer/xdebug-handler/README.md b/vendor/composer/xdebug-handler/README.md deleted file mode 100644 index c23b7a0..0000000 --- a/vendor/composer/xdebug-handler/README.md +++ /dev/null @@ -1,289 +0,0 @@ -# composer/xdebug-handler - -[![packagist](https://img.shields.io/packagist/v/composer/xdebug-handler.svg)](https://packagist.org/packages/composer/xdebug-handler) -[![linux build](https://img.shields.io/travis/composer/xdebug-handler/master.svg?label=linux+build)](https://travis-ci.org/composer/xdebug-handler) -[![windows build](https://img.shields.io/appveyor/ci/Seldaek/xdebug-handler/master.svg?label=windows+build)](https://ci.appveyor.com/project/Seldaek/xdebug-handler) -![license](https://img.shields.io/github/license/composer/xdebug-handler.svg) -![php](https://img.shields.io/packagist/php-v/composer/xdebug-handler.svg?colorB=8892BF&label=php) - -Restart a CLI process without loading the Xdebug extension. - -Originally written as part of [composer/composer](https://github.com/composer/composer), -now extracted and made available as a stand-alone library. - -## Installation - -Install the latest version with: - -```bash -$ composer require composer/xdebug-handler -``` - -## Requirements - -* PHP 5.3.2 minimum, although functionality is disabled below PHP 5.4.0. Using the latest PHP version is highly recommended. - -## Basic Usage -```php -use Composer\XdebugHandler\XdebugHandler; - -$xdebug = new XdebugHandler('myapp'); -$xdebug->check(); -unset($xdebug); -``` - -The constructor takes two parameters: - -#### _$envPrefix_ -This is used to create distinct environment variables and is upper-cased and prepended to default base values. The above example enables the use of: - -- `MYAPP_ALLOW_XDEBUG=1` to override automatic restart and allow Xdebug -- `MYAPP_ORIGINAL_INIS` to obtain ini file locations in a restarted process - -#### _$colorOption_ -This optional value is added to the restart command-line and is needed to force color output in a piped child process. Only long-options are supported, for example `--ansi` or `--colors=always` etc. - -If the original command-line contains an argument that pattern matches this value (for example `--no-ansi`, `--colors=never`) then _$colorOption_ is ignored. - -If the pattern match ends with `=auto` (for example `--colors=auto`), the argument is replaced by _$colorOption_. Otherwise it is added at either the end of the command-line, or preceding the first double-dash `--` delimiter. - -## Advanced Usage - -* [How it works](#how-it-works) -* [Limitations](#limitations) -* [Helper methods](#helper-methods) -* [Setter methods](#setter-methods) -* [Process configuration](#process-configuration) -* [Troubleshooting](#troubleshooting) -* [Extending the library](#extending-the-library) - -### How it works - -A temporary ini file is created from the loaded (and scanned) ini files, with any references to the Xdebug extension commented out. Current ini settings are merged, so that most ini settings made on the command-line or by the application are included (see [Limitations](#limitations)) - -* `MYAPP_ALLOW_XDEBUG` is set with internal data to flag and use in the restart. -* The command-line and environment are [configured](#process-configuration) for the restart. -* The application is restarted in a new process using `passthru`. - * The restart settings are stored in the environment. - * `MYAPP_ALLOW_XDEBUG` is unset. - * The application runs and exits. -* The main process exits with the exit code from the restarted process. - -### Limitations -There are a few things to be aware of when running inside a restarted process. - -* Extensions set on the command-line will not be loaded. -* Ini file locations will be reported as per the restart - see [getAllIniFiles()](#getallinifiles). -* Php sub-processes may be loaded with Xdebug enabled - see [Process configuration](#process-configuration). -* On Windows `sapi_windows_set_ctrl_handler` handlers will not receive CTRL events. - -### Helper methods -These static methods provide information from the current process, regardless of whether it has been restarted or not. - -#### _getAllIniFiles()_ -Returns an array of the original ini file locations. Use this instead of calling `php_ini_loaded_file` and `php_ini_scanned_files`, which will report the wrong values in a restarted process. - -```php -use Composer\XdebugHandler\XdebugHandler; - -$files = XdebugHandler::getAllIniFiles(); - -# $files[0] always exists, it could be an empty string -$loadedIni = array_shift($files); -$scannedInis = $files; -``` - -These locations are also available in the `MYAPP_ORIGINAL_INIS` environment variable. This is a path-separated string comprising the location returned from `php_ini_loaded_file`, which could be empty, followed by locations parsed from calling `php_ini_scanned_files`. - -#### _getRestartSettings()_ -Returns an array of settings that can be used with PHP [sub-processes](#sub-processes), or null if the process was not restarted. - -```php -use Composer\XdebugHandler\XdebugHandler; - -$settings = XdebugHandler::getRestartSettings(); -/** - * $settings: array (if the current process was restarted, - * or called with the settings from a previous restart), or null - * - * 'tmpIni' => the temporary ini file used in the restart (string) - * 'scannedInis' => if there were any scanned inis (bool) - * 'scanDir' => the original PHP_INI_SCAN_DIR value (false|string) - * 'phprc' => the original PHPRC value (false|string) - * 'inis' => the original inis from getAllIniFiles (array) - * 'skipped' => the skipped version from getSkippedVersion (string) - */ -``` - -#### _getSkippedVersion()_ -Returns the Xdebug version string that was skipped by the restart, or an empty value if there was no restart (or Xdebug is still loaded, perhaps by an extending class restarting for a reason other than removing Xdebug). - -```php -use Composer\XdebugHandler\XdebugHandler; - -$version = XdebugHandler::getSkippedVersion(); -# $version: '2.6.0' (for example), or an empty string -``` - -### Setter methods -These methods implement a fluent interface and must be called before the main `check()` method. - -#### _setLogger($logger)_ -Enables the output of status messages to an external PSR3 logger. All messages are reported with either `DEBUG` or `WARNING` log levels. For example (showing the level and message): - -``` -// Restart overridden -DEBUG Checking MYAPP_ALLOW_XDEBUG -DEBUG The Xdebug extension is loaded (2.5.0) -DEBUG No restart (MYAPP_ALLOW_XDEBUG=1) - -// Failed restart -DEBUG Checking MYAPP_ALLOW_XDEBUG -DEBUG The Xdebug extension is loaded (2.5.0) -WARNING No restart (Unable to create temp ini file at: ...) -``` - -Status messages can also be output with `XDEBUG_HANDLER_DEBUG`. See [Troubleshooting](#troubleshooting). - -#### _setMainScript($script)_ -Sets the location of the main script to run in the restart. This is only needed in more esoteric use-cases, or if the `argv[0]` location is inaccessible. The script name `--` is supported for standard input. - -#### _setPersistent()_ -Configures the restart using [persistent settings](#persistent-settings), so that Xdebug is not loaded in any sub-process. - -Use this method if your application invokes one or more PHP sub-process and the Xdebug extension is not needed. This avoids the overhead of implementing specific [sub-process](#sub-processes) strategies. - -Alternatively, this method can be used to set up a default _Xdebug-free_ environment which can be changed if a sub-process requires Xdebug, then restored afterwards: - -```php -function SubProcessWithXdebug() -{ - $phpConfig = new Composer\XdebugHandler\PhpConfig(); - - # Set the environment to the original configuration - $phpConfig->useOriginal(); - - # run the process with Xdebug loaded - ... - - # Restore Xdebug-free environment - $phpConfig->usePersistent(); -} -``` - -### Process configuration -The library offers two strategies to invoke a new PHP process without loading Xdebug, using either _standard_ or _persistent_ settings. Note that this is only important if the application calls a PHP sub-process. - -#### Standard settings -Uses command-line options to remove Xdebug from the new process only. - -* The -n option is added to the command-line. This tells PHP not to scan for additional inis. -* The temporary ini is added to the command-line with the -c option. - ->_If the new process calls a PHP sub-process, Xdebug will be loaded in that sub-process (unless it implements xdebug-handler, in which case there will be another restart)._ - -This is the default strategy used in the restart. - -#### Persistent settings -Uses environment variables to remove Xdebug from the new process and persist these settings to any sub-process. - -* `PHP_INI_SCAN_DIR` is set to an empty string. This tells PHP not to scan for additional inis. -* `PHPRC` is set to the temporary ini. - ->_If the new process calls a PHP sub-process, Xdebug will not be loaded in that sub-process._ - -This strategy can be used in the restart by calling [setPersistent()](#setpersistent). - -#### Sub-processes -The `PhpConfig` helper class makes it easy to invoke a PHP sub-process (with or without Xdebug loaded), regardless of whether there has been a restart. - -Each of its methods returns an array of PHP options (to add to the command-line) and sets up the environment for the required strategy. The [getRestartSettings()](#getrestartsettings) method is used internally. - -* `useOriginal()` - Xdebug will be loaded in the new process. -* `useStandard()` - Xdebug will **not** be loaded in the new process - see [standard settings](#standard-settings). -* `userPersistent()` - Xdebug will **not** be loaded in the new process - see [persistent settings](#persistent-settings) - -If there was no restart, an empty options array is returned and the environment is not changed. - -```php -use Composer\XdebugHandler\PhpConfig; - -$config = new PhpConfig; - -$options = $config->useOriginal(); -# $options: empty array -# environment: PHPRC and PHP_INI_SCAN_DIR set to original values - -$options = $config->useStandard(); -# $options: [-n, -c, tmpIni] -# environment: PHPRC and PHP_INI_SCAN_DIR set to original values - -$options = $config->usePersistent(); -# $options: empty array -# environment: PHPRC=tmpIni, PHP_INI_SCAN_DIR='' -``` - -### Troubleshooting -The following environment settings can be used to troubleshoot unexpected behavior: - -* `XDEBUG_HANDLER_DEBUG=1` Outputs status messages to `STDERR`, if it is defined, irrespective of any PSR3 logger. Each message is prefixed `xdebug-handler[pid]`, where pid is the process identifier. - -* `XDEBUG_HANDLER_DEBUG=2` As above, but additionally saves the temporary ini file and reports its location in a status message. - -### Extending the library -The API is defined by classes and their accessible elements that are not annotated as @internal. The main class has two protected methods that can be overridden to provide additional functionality: - -#### _requiresRestart($isLoaded)_ -By default the process will restart if Xdebug is loaded. Extending this method allows an application to decide, by returning a boolean (or equivalent) value. It is only called if `MYAPP_ALLOW_XDEBUG` is empty, so it will not be called in the restarted process (where this variable contains internal data), or if the restart has been overridden. - -Note that the [setMainScript()](#setmainscriptscript) and [setPersistent()](#setpersistent) setters can be used here, if required. - -#### _restart($command)_ -An application can extend this to modify the temporary ini file, its location given in the `tmpIni` property. New settings can be safely appended to the end of the data, which is `PHP_EOL` terminated. - -Note that the `$command` parameter is the escaped command-line string that will be used for the new process and must be treated accordingly. - -Remember to finish with `parent::restart($command)`. - -#### Example -This example demonstrates two ways to extend basic functionality: - -* To avoid the overhead of spinning up a new process, the restart is skipped if a simple help command is requested. - -* The application needs write-access to phar files, so it will force a restart if `phar.readonly` is set (regardless of whether Xdebug is loaded) and change this value in the temporary ini file. - -```php -use Composer\XdebugHandler\XdebugHandler; -use MyApp\Command; - -class MyRestarter extends XdebugHandler -{ - private $required; - - protected function requiresRestart($isLoaded) - { - if (Command::isHelp()) { - # No need to disable Xdebug for this - return false; - } - - $this->required = (bool) ini_get('phar.readonly'); - return $isLoaded || $this->required; - } - - protected function restart($command) - { - if ($this->required) { - # Add required ini setting to tmpIni - $content = file_get_contents($this->tmpIni); - $content .= 'phar.readonly=0'.PHP_EOL; - file_put_contents($this->tmpIni, $content); - } - - parent::restart($command); - } -} -``` - -## License -composer/xdebug-handler is licensed under the MIT License, see the LICENSE file for details. diff --git a/vendor/composer/xdebug-handler/composer.json b/vendor/composer/xdebug-handler/composer.json deleted file mode 100644 index ea40a2f..0000000 --- a/vendor/composer/xdebug-handler/composer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "composer/xdebug-handler", - "description": "Restarts a process without Xdebug.", - "type": "library", - "license": "MIT", - "keywords": [ - "xdebug", - "performance" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" - }, - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "Composer\\XdebugHandler\\": "tests" - } - }, - "scripts": { - "test": "phpunit" - } -} diff --git a/vendor/composer/xdebug-handler/src/PhpConfig.php b/vendor/composer/xdebug-handler/src/PhpConfig.php deleted file mode 100644 index 5535eca..0000000 --- a/vendor/composer/xdebug-handler/src/PhpConfig.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\XdebugHandler; - -/** - * @author John Stevenson - */ -class PhpConfig -{ - /** - * Use the original PHP configuration - * - * @return array PHP cli options - */ - public function useOriginal() - { - $this->getDataAndReset(); - return array(); - } - - /** - * Use standard restart settings - * - * @return array PHP cli options - */ - public function useStandard() - { - if ($data = $this->getDataAndReset()) { - return array('-n', '-c', $data['tmpIni']); - } - - return array(); - } - - /** - * Use environment variables to persist settings - * - * @return array PHP cli options - */ - public function usePersistent() - { - if ($data = $this->getDataAndReset()) { - Process::setEnv('PHPRC', $data['tmpIni']); - Process::setEnv('PHP_INI_SCAN_DIR', ''); - } - - return array(); - } - - /** - * Returns restart data if available and resets the environment - * - * @return array|null - */ - private function getDataAndReset() - { - if ($data = XdebugHandler::getRestartSettings()) { - Process::setEnv('PHPRC', $data['phprc']); - Process::setEnv('PHP_INI_SCAN_DIR', $data['scanDir']); - } - - return $data; - } -} diff --git a/vendor/composer/xdebug-handler/src/Process.php b/vendor/composer/xdebug-handler/src/Process.php deleted file mode 100644 index eb2ad2b..0000000 --- a/vendor/composer/xdebug-handler/src/Process.php +++ /dev/null @@ -1,181 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\XdebugHandler; - -/** - * Provides utility functions to prepare a child process command-line and set - * environment variables in that process. - * - * @author John Stevenson - * @internal - */ -class Process -{ - /** - * Returns an array of parameters, including a color option if required - * - * A color option is needed because child process output is piped. - * - * @param array $args The script parameters - * @param string $colorOption The long option to force color output - * - * @return array - */ - public static function addColorOption(array $args, $colorOption) - { - if (!$colorOption - || in_array($colorOption, $args) - || !preg_match('/^--([a-z]+$)|(^--[a-z]+=)/', $colorOption, $matches)) { - return $args; - } - - if (isset($matches[2])) { - // Handle --color(s)= options - if (false !== ($index = array_search($matches[2].'auto', $args))) { - $args[$index] = $colorOption; - return $args; - } elseif (preg_grep('/^'.$matches[2].'/', $args)) { - return $args; - } - } elseif (in_array('--no-'.$matches[1], $args)) { - return $args; - } - - // Check for NO_COLOR variable (https://no-color.org/) - if (false !== getenv('NO_COLOR')) { - return $args; - } - - if (false !== ($index = array_search('--', $args))) { - // Position option before double-dash delimiter - array_splice($args, $index, 0, $colorOption); - } else { - $args[] = $colorOption; - } - - return $args; - } - - /** - * Escapes a string to be used as a shell argument. - * - * From https://github.com/johnstevenson/winbox-args - * MIT Licensed (c) John Stevenson - * - * @param string $arg The argument to be escaped - * @param bool $meta Additionally escape cmd.exe meta characters - * @param bool $module The argument is the module to invoke - * - * @return string The escaped argument - */ - public static function escape($arg, $meta = true, $module = false) - { - if (!defined('PHP_WINDOWS_VERSION_BUILD')) { - return "'".str_replace("'", "'\\''", $arg)."'"; - } - - $quote = strpbrk($arg, " \t") !== false || $arg === ''; - - $arg = preg_replace('/(\\\\*)"/', '$1$1\\"', $arg, -1, $dquotes); - - if ($meta) { - $meta = $dquotes || preg_match('/%[^%]+%/', $arg); - - if (!$meta) { - $quote = $quote || strpbrk($arg, '^&|<>()') !== false; - } elseif ($module && !$dquotes && $quote) { - $meta = false; - } - } - - if ($quote) { - $arg = '"'.preg_replace('/(\\\\*)$/', '$1$1', $arg).'"'; - } - - if ($meta) { - $arg = preg_replace('/(["^&|<>()%])/', '^$1', $arg); - } - - return $arg; - } - - /** - * Returns true if the output stream supports colors - * - * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo - * terminals via named pipes, so we can only check the environment. - * - * @param mixed $output A valid CLI output stream - * - * @return bool - */ - public static function supportsColor($output) - { - if ('Hyper' === getenv('TERM_PROGRAM')) { - return true; - } - - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - return (function_exists('sapi_windows_vt100_support') - && sapi_windows_vt100_support($output)) - || false !== getenv('ANSICON') - || 'ON' === getenv('ConEmuANSI') - || 'xterm' === getenv('TERM'); - } - - if (function_exists('stream_isatty')) { - return stream_isatty($output); - } - - if (function_exists('posix_isatty')) { - return posix_isatty($output); - } - - $stat = fstat($output); - // Check if formatted mode is S_IFCHR - return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; - } - - /** - * Makes putenv environment changes available in $_SERVER and $_ENV - * - * @param string $name - * @param string|false $value A false value unsets the variable - * - * @return bool Whether the environment variable was set - */ - public static function setEnv($name, $value = false) - { - $unset = false === $value; - - if (!putenv($unset ? $name : $name.'='.$value)) { - return false; - } - - if ($unset) { - unset($_SERVER[$name]); - } else { - $_SERVER[$name] = $value; - } - - // Update $_ENV if it is being used - if (false !== stripos((string) ini_get('variables_order'), 'E')) { - if ($unset) { - unset($_ENV[$name]); - } else { - $_ENV[$name] = $value; - } - } - - return true; - } -} diff --git a/vendor/composer/xdebug-handler/src/Status.php b/vendor/composer/xdebug-handler/src/Status.php deleted file mode 100644 index e714b1c..0000000 --- a/vendor/composer/xdebug-handler/src/Status.php +++ /dev/null @@ -1,163 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\XdebugHandler; - -use Psr\Log\LoggerInterface; -use Psr\Log\LogLevel; - -/** - * @author John Stevenson - * @internal - */ -class Status -{ - const ENV_RESTART = 'XDEBUG_HANDLER_RESTART'; - const CHECK = 'Check'; - const ERROR = 'Error'; - const INFO = 'Info'; - const NORESTART = 'NoRestart'; - const RESTART = 'Restart'; - const RESTARTING = 'Restarting'; - const RESTARTED = 'Restarted'; - - private $debug; - private $envAllowXdebug; - private $loaded; - private $logger; - private $time; - - /** - * Constructor - * - * @param string $envAllowXdebug Prefixed _ALLOW_XDEBUG name - * @param bool $debug Whether debug output is required - */ - public function __construct($envAllowXdebug, $debug) - { - $start = getenv(self::ENV_RESTART); - Process::setEnv(self::ENV_RESTART); - $this->time = $start ? round((microtime(true) - $start) * 1000) : 0; - - $this->envAllowXdebug = $envAllowXdebug; - $this->debug = $debug && defined('STDERR'); - } - - /** - * @param LoggerInterface $logger - */ - public function setLogger(LoggerInterface $logger) - { - $this->logger = $logger; - } - - /** - * Calls a handler method to report a message - * - * @param string $op The handler constant - * @param null|string $data Data required by the handler - */ - public function report($op, $data) - { - if ($this->logger || $this->debug) { - call_user_func(array($this, 'report'.$op), $data); - } - } - - /** - * Outputs a status message - * - * @param string $text - * @param string $level - */ - private function output($text, $level = null) - { - if ($this->logger) { - $this->logger->log($level ?: LogLevel::DEBUG, $text); - } - - if ($this->debug) { - fwrite(STDERR, sprintf('xdebug-handler[%d] %s', getmypid(), $text.PHP_EOL)); - } - } - - private function reportCheck($loaded) - { - $this->loaded = $loaded; - $this->output('Checking '.$this->envAllowXdebug); - } - - private function reportError($error) - { - $this->output(sprintf('No restart (%s)', $error), LogLevel::WARNING); - } - - private function reportInfo($info) - { - $this->output($info); - } - - private function reportNoRestart() - { - $this->output($this->getLoadedMessage()); - - if ($this->loaded) { - $text = sprintf('No restart (%s)', $this->getEnvAllow()); - if (!getenv($this->envAllowXdebug)) { - $text .= ' Allowed by application'; - } - $this->output($text); - } - } - - private function reportRestart() - { - $this->output($this->getLoadedMessage()); - Process::setEnv(self::ENV_RESTART, (string) microtime(true)); - } - - private function reportRestarted() - { - $loaded = $this->getLoadedMessage(); - $text = sprintf('Restarted (%d ms). %s', $this->time, $loaded); - $level = $this->loaded ? LogLevel::WARNING : null; - $this->output($text, $level); - } - - private function reportRestarting($command) - { - $text = sprintf('Process restarting (%s)', $this->getEnvAllow()); - $this->output($text); - $text = 'Running '.$command; - $this->output($text); - } - - /** - * Returns the _ALLOW_XDEBUG environment variable as name=value - * - * @return string - */ - private function getEnvAllow() - { - return $this->envAllowXdebug.'='.getenv($this->envAllowXdebug); - } - - /** - * Returns the Xdebug status and version - * - * @return string - */ - private function getLoadedMessage() - { - $loaded = $this->loaded ? sprintf('loaded (%s)', $this->loaded) : 'not loaded'; - return 'The Xdebug extension is '.$loaded; - } -} diff --git a/vendor/composer/xdebug-handler/src/XdebugHandler.php b/vendor/composer/xdebug-handler/src/XdebugHandler.php deleted file mode 100644 index cd5776c..0000000 --- a/vendor/composer/xdebug-handler/src/XdebugHandler.php +++ /dev/null @@ -1,572 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\XdebugHandler; - -use Psr\Log\LoggerInterface; - -/** - * @author John Stevenson - */ -class XdebugHandler -{ - const SUFFIX_ALLOW = '_ALLOW_XDEBUG'; - const SUFFIX_INIS = '_ORIGINAL_INIS'; - const RESTART_ID = 'internal'; - const RESTART_SETTINGS = 'XDEBUG_HANDLER_SETTINGS'; - const DEBUG = 'XDEBUG_HANDLER_DEBUG'; - - /** @var string|null */ - protected $tmpIni; - - private static $inRestart; - private static $name; - private static $skipped; - - private $cli; - private $colorOption; - private $debug; - private $envAllowXdebug; - private $envOriginalInis; - private $loaded; - private $persistent; - private $script; - /** @var Status|null */ - private $statusWriter; - - /** - * Constructor - * - * The $envPrefix is used to create distinct environment variables. It is - * uppercased and prepended to the default base values. For example 'myapp' - * would result in MYAPP_ALLOW_XDEBUG and MYAPP_ORIGINAL_INIS. - * - * @param string $envPrefix Value used in environment variables - * @param string $colorOption Command-line long option to force color output - * @throws \RuntimeException If a parameter is invalid - */ - public function __construct($envPrefix, $colorOption = '') - { - if (!is_string($envPrefix) || empty($envPrefix) || !is_string($colorOption)) { - throw new \RuntimeException('Invalid constructor parameter'); - } - - self::$name = strtoupper($envPrefix); - $this->envAllowXdebug = self::$name.self::SUFFIX_ALLOW; - $this->envOriginalInis = self::$name.self::SUFFIX_INIS; - - $this->colorOption = $colorOption; - - if (extension_loaded('xdebug')) { - $ext = new \ReflectionExtension('xdebug'); - $this->loaded = $ext->getVersion() ?: 'unknown'; - } - - if ($this->cli = PHP_SAPI === 'cli') { - $this->debug = getenv(self::DEBUG); - } - - $this->statusWriter = new Status($this->envAllowXdebug, (bool) $this->debug); - } - - /** - * Activates status message output to a PSR3 logger - * - * @param LoggerInterface $logger - * - * @return $this - */ - public function setLogger(LoggerInterface $logger) - { - $this->statusWriter->setLogger($logger); - return $this; - } - - /** - * Sets the main script location if it cannot be called from argv - * - * @param string $script - * - * @return $this - */ - public function setMainScript($script) - { - $this->script = $script; - return $this; - } - - /** - * Persist the settings to keep Xdebug out of sub-processes - * - * @return $this - */ - public function setPersistent() - { - $this->persistent = true; - return $this; - } - - /** - * Checks if Xdebug is loaded and the process needs to be restarted - * - * This behaviour can be disabled by setting the MYAPP_ALLOW_XDEBUG - * environment variable to 1. This variable is used internally so that - * the restarted process is created only once. - */ - public function check() - { - $this->notify(Status::CHECK, $this->loaded); - $envArgs = explode('|', (string) getenv($this->envAllowXdebug)); - - if (empty($envArgs[0]) && $this->requiresRestart((bool) $this->loaded)) { - // Restart required - $this->notify(Status::RESTART); - - if ($this->prepareRestart()) { - $command = $this->getCommand(); - $this->notify(Status::RESTARTING, $command); - $this->restart($command); - } - return; - } - - if (self::RESTART_ID === $envArgs[0] && count($envArgs) === 5) { - // Restarting, so unset environment variable and use saved values - $this->notify(Status::RESTARTED); - - Process::setEnv($this->envAllowXdebug); - self::$inRestart = true; - - if (!$this->loaded) { - // Skipped version is only set if Xdebug is not loaded - self::$skipped = $envArgs[1]; - } - - // Put restart settings in the environment - $this->setEnvRestartSettings($envArgs); - return; - } - - $this->notify(Status::NORESTART); - - if ($settings = self::getRestartSettings()) { - // Called with existing settings, so sync our settings - $this->syncSettings($settings); - } - } - - /** - * Returns an array of php.ini locations with at least one entry - * - * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files. - * The loaded ini location is the first entry and may be empty. - * - * @return array - */ - public static function getAllIniFiles() - { - if (!empty(self::$name)) { - $env = getenv(self::$name.self::SUFFIX_INIS); - - if (false !== $env) { - return explode(PATH_SEPARATOR, $env); - } - } - - $paths = array((string) php_ini_loaded_file()); - - if ($scanned = php_ini_scanned_files()) { - $paths = array_merge($paths, array_map('trim', explode(',', $scanned))); - } - - return $paths; - } - - /** - * Returns an array of restart settings or null - * - * Settings will be available if the current process was restarted, or - * called with the settings from an existing restart. - * - * @return array|null - */ - public static function getRestartSettings() - { - $envArgs = explode('|', (string) getenv(self::RESTART_SETTINGS)); - - if (count($envArgs) !== 6 - || (!self::$inRestart && php_ini_loaded_file() !== $envArgs[0])) { - return; - } - - return array( - 'tmpIni' => $envArgs[0], - 'scannedInis' => (bool) $envArgs[1], - 'scanDir' => '*' === $envArgs[2] ? false : $envArgs[2], - 'phprc' => '*' === $envArgs[3] ? false : $envArgs[3], - 'inis' => explode(PATH_SEPARATOR, $envArgs[4]), - 'skipped' => $envArgs[5], - ); - } - - /** - * Returns the Xdebug version that triggered a successful restart - * - * @return string - */ - public static function getSkippedVersion() - { - return (string) self::$skipped; - } - - /** - * Returns true if Xdebug is loaded, or as directed by an extending class - * - * @param bool $isLoaded Whether Xdebug is loaded - * - * @return bool - */ - protected function requiresRestart($isLoaded) - { - return $isLoaded; - } - - /** - * Allows an extending class to access the tmpIni - * - * @param string $command - */ - protected function restart($command) - { - $this->doRestart($command); - } - - /** - * Executes the restarted command then deletes the tmp ini - * - * @param string $command - */ - private function doRestart($command) - { - // Ignore SIGINTs here so the child process can handle them. To replicate this - // on Windows we would need to use proc_open (PHP 7.4+) rather than passthru. - if (function_exists('pcntl_async_signals') && function_exists('pcntl_signal')) { - pcntl_async_signals(true); - pcntl_signal(SIGINT, SIG_IGN); - } - - passthru($command, $exitCode); - $this->notify(Status::INFO, 'Restarted process exited '.$exitCode); - - if ($this->debug === '2') { - $this->notify(Status::INFO, 'Temp ini saved: '.$this->tmpIni); - } else { - @unlink($this->tmpIni); - } - - exit($exitCode); - } - - /** - * Returns true if everything was written for the restart - * - * If any of the following fails (however unlikely) we must return false to - * stop potential recursion: - * - tmp ini file creation - * - environment variable creation - * - * @return bool - */ - private function prepareRestart() - { - $error = ''; - $iniFiles = self::getAllIniFiles(); - $scannedInis = count($iniFiles) > 1; - $tmpDir = sys_get_temp_dir(); - - if (!$this->cli) { - $error = 'Unsupported SAPI: '.PHP_SAPI; - } elseif (!defined('PHP_BINARY')) { - $error = 'PHP version is too old: '.PHP_VERSION; - } elseif (!$this->checkConfiguration($info)) { - $error = $info; - } elseif (!$this->checkScanDirConfig()) { - $error = 'PHP version does not report scanned inis: '.PHP_VERSION; - } elseif (!$this->checkMainScript()) { - $error = 'Unable to access main script: '.$this->script; - } elseif (!$this->writeTmpIni($iniFiles, $tmpDir, $error)) { - $error = $error ?: 'Unable to create temp ini file at: '.$tmpDir; - } elseif (!$this->setEnvironment($scannedInis, $iniFiles)) { - $error = 'Unable to set environment variables'; - } - - if ($error) { - $this->notify(Status::ERROR, $error); - } - - return empty($error); - } - - /** - * Returns true if the tmp ini file was written - * - * @param array $iniFiles All ini files used in the current process - * @param string $tmpDir The system temporary directory - * @param string $error Set by method if ini file cannot be read - * - * @return bool - */ - private function writeTmpIni(array $iniFiles, $tmpDir, &$error) - { - if (!$this->tmpIni = @tempnam($tmpDir, '')) { - return false; - } - - // $iniFiles has at least one item and it may be empty - if (empty($iniFiles[0])) { - array_shift($iniFiles); - } - - $content = ''; - $regex = '/^\s*(zend_extension\s*=.*xdebug.*)$/mi'; - - foreach ($iniFiles as $file) { - // Check for inaccessible ini files - if (($data = @file_get_contents($file)) === false) { - $error = 'Unable to read ini: '.$file; - return false; - } - $content .= preg_replace($regex, ';$1', $data).PHP_EOL; - } - - // Merge loaded settings into our ini content, if it is valid - if ($config = parse_ini_string($content)) { - $loaded = ini_get_all(null, false); - $content .= $this->mergeLoadedConfig($loaded, $config); - } - - // Work-around for https://bugs.php.net/bug.php?id=75932 - $content .= 'opcache.enable_cli=0'.PHP_EOL; - - return @file_put_contents($this->tmpIni, $content); - } - - /** - * Returns the restart command line - * - * @return string - */ - private function getCommand() - { - $php = array(PHP_BINARY); - $args = array_slice($_SERVER['argv'], 1); - - if (!$this->persistent) { - // Use command-line options - array_push($php, '-n', '-c', $this->tmpIni); - } - - if (defined('STDOUT') && Process::supportsColor(STDOUT)) { - $args = Process::addColorOption($args, $this->colorOption); - } - - $args = array_merge($php, array($this->script), $args); - - $cmd = Process::escape(array_shift($args), true, true); - foreach ($args as $arg) { - $cmd .= ' '.Process::escape($arg); - } - - return $cmd; - } - - /** - * Returns true if the restart environment variables were set - * - * No need to update $_SERVER since this is set in the restarted process. - * - * @param bool $scannedInis Whether there were scanned ini files - * @param array $iniFiles All ini files used in the current process - * - * @return bool - */ - private function setEnvironment($scannedInis, array $iniFiles) - { - $scanDir = getenv('PHP_INI_SCAN_DIR'); - $phprc = getenv('PHPRC'); - - // Make original inis available to restarted process - if (!putenv($this->envOriginalInis.'='.implode(PATH_SEPARATOR, $iniFiles))) { - return false; - } - - if ($this->persistent) { - // Use the environment to persist the settings - if (!putenv('PHP_INI_SCAN_DIR=') || !putenv('PHPRC='.$this->tmpIni)) { - return false; - } - } - - // Flag restarted process and save values for it to use - $envArgs = array( - self::RESTART_ID, - $this->loaded, - (int) $scannedInis, - false === $scanDir ? '*' : $scanDir, - false === $phprc ? '*' : $phprc, - ); - - return putenv($this->envAllowXdebug.'='.implode('|', $envArgs)); - } - - /** - * Logs status messages - * - * @param string $op Status handler constant - * @param null|string $data Optional data - */ - private function notify($op, $data = null) - { - $this->statusWriter->report($op, $data); - } - - /** - * Returns default, changed and command-line ini settings - * - * @param array $loadedConfig All current ini settings - * @param array $iniConfig Settings from user ini files - * - * @return string - */ - private function mergeLoadedConfig(array $loadedConfig, array $iniConfig) - { - $content = ''; - - foreach ($loadedConfig as $name => $value) { - // Value will either be null, string or array (HHVM only) - if (!is_string($value) - || strpos($name, 'xdebug') === 0 - || $name === 'apc.mmap_file_mask') { - continue; - } - - if (!isset($iniConfig[$name]) || $iniConfig[$name] !== $value) { - // Double-quote escape each value - $content .= $name.'="'.addcslashes($value, '\\"').'"'.PHP_EOL; - } - } - - return $content; - } - - /** - * Returns true if the script name can be used - * - * @return bool - */ - private function checkMainScript() - { - if (null !== $this->script) { - // Allow an application to set -- for standard input - return file_exists($this->script) || '--' === $this->script; - } - - if (file_exists($this->script = $_SERVER['argv'][0])) { - return true; - } - - // Use a backtrace to resolve Phar and chdir issues - $options = PHP_VERSION_ID >= 50306 ? DEBUG_BACKTRACE_IGNORE_ARGS : false; - $trace = debug_backtrace($options); - - if (($main = end($trace)) && isset($main['file'])) { - return file_exists($this->script = $main['file']); - } - - return false; - } - - /** - * Adds restart settings to the environment - * - * @param string $envArgs - */ - private function setEnvRestartSettings($envArgs) - { - $settings = array( - php_ini_loaded_file(), - $envArgs[2], - $envArgs[3], - $envArgs[4], - getenv($this->envOriginalInis), - self::$skipped, - ); - - Process::setEnv(self::RESTART_SETTINGS, implode('|', $settings)); - } - - /** - * Syncs settings and the environment if called with existing settings - * - * @param array $settings - */ - private function syncSettings(array $settings) - { - if (false === getenv($this->envOriginalInis)) { - // Called by another app, so make original inis available - Process::setEnv($this->envOriginalInis, implode(PATH_SEPARATOR, $settings['inis'])); - } - - self::$skipped = $settings['skipped']; - $this->notify(Status::INFO, 'Process called with existing restart settings'); - } - - /** - * Returns true if there are scanned inis and PHP is able to report them - * - * php_ini_scanned_files will fail when PHP_CONFIG_FILE_SCAN_DIR is empty. - * Fixed in 7.1.13 and 7.2.1 - * - * @return bool - */ - private function checkScanDirConfig() - { - return !(getenv('PHP_INI_SCAN_DIR') - && !PHP_CONFIG_FILE_SCAN_DIR - && (PHP_VERSION_ID < 70113 - || PHP_VERSION_ID === 70200)); - } - - /** - * Returns true if there are no known configuration issues - * - * @param string $info Set by method - */ - private function checkConfiguration(&$info) - { - if (false !== strpos(ini_get('disable_functions'), 'passthru')) { - $info = 'passthru function is disabled'; - return false; - } - - if (extension_loaded('uopz') && !ini_get('uopz.disable')) { - // uopz works at opcode level and disables exit calls - if (function_exists('uopz_allow_exit')) { - @uopz_allow_exit(true); - } else { - $info = 'uopz extension is not compatible'; - return false; - } - } - - return true; - } -} diff --git a/vendor/doctrine/annotations/.doctrine-project.json b/vendor/doctrine/annotations/.doctrine-project.json deleted file mode 100644 index 25d4708..0000000 --- a/vendor/doctrine/annotations/.doctrine-project.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "active": true, - "name": "Annotations", - "slug": "annotations", - "docsSlug": "doctrine-annotations", - "versions": [ - { - "name": "1.9", - "branchName": "1.9", - "slug": "1.9", - "aliases": [ - "latest" - ], - "upcoming": true - }, - { - "name": "1.8", - "branchName": "1.8", - "slug": "1.8", - "current": true, - "aliases": [ - "current", - "stable" - ], - "maintained": true - }, - { - "name": "1.7", - "branchName": "1.7", - "slug": "1.7", - "maintained": false - }, - { - "name": "1.6", - "branchName": "1.6", - "slug": "1.6", - "maintained": false - } - ] -} diff --git a/vendor/doctrine/annotations/CHANGELOG.md b/vendor/doctrine/annotations/CHANGELOG.md deleted file mode 100644 index 0b0ba1a..0000000 --- a/vendor/doctrine/annotations/CHANGELOG.md +++ /dev/null @@ -1,162 +0,0 @@ -## Changelog - -### 1.6.1 - -This release fixes an issue in which annotations such as `@foo-bar` -and `@foo-` were incorrectly recognised as valid, and both erroneously -parsed as `@foo`. - -Any annotation with `@name-*` format will now silently be ignored, -allowing vendor-specific annotations to be prefixed with the tool -name. - -Total issues resolved: **3** - -- [165: Update the composer branch alias](https://github.com/doctrine/annotations/pull/165) thanks to @mikeSimonson -- [209: Change Annotation::value typehint to mixed](https://github.com/doctrine/annotations/pull/209) thanks to @malarzm -- [257: Skip parsing annotations containing dashes, such as `@Foo-bar`, or `@Foo-`](https://github.com/doctrine/annotations/pull/257) thanks to @Ocramius - -### 1.6.0 - -This release brings a new endpoint that make sure that you can't shoot yourself in the foot by calling ```registerLoader``` multiple times and a few tests improvements. - -Total issues resolved: **7** - -- [145: Memory leak in AnnotationRegistry::registerLoader() when called multiple times](https://github.com/doctrine/annotations/issues/145) thanks to @TriAnMan -- [146: Import error on @experimental Annotation](https://github.com/doctrine/annotations/issues/146) thanks to @aturki -- [147: Ignoring @experimental annotation used by Symfony 3.3 CacheAdapter](https://github.com/doctrine/annotations/pull/147) thanks to @aturki -- [151: Remove duplicate code in `DCOM58Test`](https://github.com/doctrine/annotations/pull/151) thanks to @tuanphpvn -- [161: Prevent loading class_exists multiple times](https://github.com/doctrine/annotations/pull/161) thanks to @jrjohnson -- [162: Add registerUniqueLoader to AnnotationRegistry](https://github.com/doctrine/annotations/pull/162) thanks to @jrjohnson -- [163: Use assertDirectoryExists and assertDirectoryNotExists](https://github.com/doctrine/annotations/pull/163) thanks to @carusogabriel - -Thanks to everyone involved in this release. - -### 1.5.0 - -This release increments the minimum supported PHP version to 7.1.0. - -Also, HHVM official support has been dropped. - -Some noticeable performance improvements to annotation autoloading -have been applied, making failed annotation autoloading less heavy -on the filesystem access. - -- [133: Add @throws annotation in AnnotationReader#__construct()](https://github.com/doctrine/annotations/issues/133) thanks to @SenseException -- [134: Require PHP 7.1, drop HHVM support](https://github.com/doctrine/annotations/issues/134) thanks to @lcobucci -- [135: Prevent the same loader from being registered twice](https://github.com/doctrine/annotations/issues/135) thanks to @jrjohnson -- [137: #135 optimise multiple class load attempts in AnnotationRegistry](https://github.com/doctrine/annotations/issues/137) thanks to @Ocramius - - -### 1.4.0 - -This release fix an issue were some annotations could be not loaded if the namespace in the use statement started with a backslash. -It also update the tests and drop the support for php 5.X - -- [115: Missing annotations with the latest composer version](https://github.com/doctrine/annotations/issues/115) thanks to @pascalporedda -- [120: Missing annotations with the latest composer version](https://github.com/doctrine/annotations/pull/120) thanks to @gnat42 -- [121: Adding a more detailed explanation of the test](https://github.com/doctrine/annotations/pull/121) thanks to @mikeSimonson -- [101: Test annotation parameters containing space](https://github.com/doctrine/annotations/pull/101) thanks to @mikeSimonson -- [111: Cleanup: move to correct phpunit assertions](https://github.com/doctrine/annotations/pull/111) thanks to @Ocramius -- [112: Removes support for PHP 5.x](https://github.com/doctrine/annotations/pull/112) thanks to @railto -- [113: bumped phpunit version to 5.7](https://github.com/doctrine/annotations/pull/113) thanks to @gabbydgab -- [114: Enhancement: Use SVG Travis build badge](https://github.com/doctrine/annotations/pull/114) thanks to @localheinz -- [118: Integrating PHPStan](https://github.com/doctrine/annotations/pull/118) thanks to @ondrejmirtes - -### 1.3.1 - 2016-12-30 - -This release fixes an issue with ignored annotations that were already -autoloaded, causing the `SimpleAnnotationReader` to pick them up -anyway. [#110](https://github.com/doctrine/annotations/pull/110) - -Additionally, an issue was fixed in the `CachedReader`, which was -not correctly checking the freshness of cached annotations when -traits were defined on a class. [#105](https://github.com/doctrine/annotations/pull/105) - -Total issues resolved: **2** - -- [105: Return single max timestamp](https://github.com/doctrine/annotations/pull/105) -- [110: setIgnoreNotImportedAnnotations(true) didn’t work for existing classes](https://github.com/doctrine/annotations/pull/110) - -### 1.3.0 - -This release introduces a PHP version bump. `doctrine/annotations` now requires PHP -5.6 or later to be installed. - -A series of additional improvements have been introduced: - - * support for PHP 7 "grouped use statements" - * support for ignoring entire namespace names - via `Doctrine\Common\Annotations\AnnotationReader::addGlobalIgnoredNamespace()` and - `Doctrine\Common\Annotations\DocParser::setIgnoredAnnotationNamespaces()`. This will - allow you to ignore annotations from namespaces that you cannot autoload - * testing all parent classes and interfaces when checking if the annotation cache - in the `CachedReader` is fresh - * simplifying the cache keys used by the `CachedReader`: keys are no longer artificially - namespaced, since `Doctrine\Common\Cache` already supports that - * corrected parsing of multibyte strings when `mbstring.func_overload` is enabled - * corrected parsing of annotations when `"\t"` is put before the first annotation - in a docblock - * allow skipping non-imported annotations when a custom `DocParser` is passed to - the `AnnotationReader` constructor - -Total issues resolved: **15** - -- [45: DocParser can now ignore whole namespaces](https://github.com/doctrine/annotations/pull/45) -- [57: Switch to the docker-based infrastructure on Travis](https://github.com/doctrine/annotations/pull/57) -- [59: opcache.load_comments has been removed from PHP 7](https://github.com/doctrine/annotations/pull/59) -- [62: [CachedReader\ Test traits and parent class to see if cache is fresh](https://github.com/doctrine/annotations/pull/62) -- [65: Remove cache salt making key unnecessarily long](https://github.com/doctrine/annotations/pull/65) -- [66: Fix of incorrect parsing multibyte strings](https://github.com/doctrine/annotations/pull/66) -- [68: Annotations that are indented by tab are not processed.](https://github.com/doctrine/annotations/issues/68) -- [69: Support for Group Use Statements](https://github.com/doctrine/annotations/pull/69) -- [70: Allow tab character before first annotation in DocBlock](https://github.com/doctrine/annotations/pull/70) -- [74: Ignore not registered annotations fix](https://github.com/doctrine/annotations/pull/74) -- [92: Added tests for AnnotationRegistry class.](https://github.com/doctrine/annotations/pull/92) -- [96: Fix/#62 check trait and parent class ttl in annotations](https://github.com/doctrine/annotations/pull/96) -- [97: Feature - #45 - allow ignoring entire namespaces](https://github.com/doctrine/annotations/pull/97) -- [98: Enhancement/#65 remove cache salt from cached reader](https://github.com/doctrine/annotations/pull/98) -- [99: Fix - #70 - allow tab character before first annotation in docblock](https://github.com/doctrine/annotations/pull/99) - -### 1.2.4 - -Total issues resolved: **1** - -- [51: FileCacheReader::saveCacheFile::unlink fix](https://github.com/doctrine/annotations/pull/51) - -### 1.2.3 - -Total issues resolved: [**2**](https://github.com/doctrine/annotations/milestones/v1.2.3) - -- [49: #46 - applying correct `chmod()` to generated cache file](https://github.com/doctrine/annotations/pull/49) -- [50: Hotfix: match escaped quotes (revert #44)](https://github.com/doctrine/annotations/pull/50) - -### 1.2.2 - -Total issues resolved: **4** - -- [43: Exclude files from distribution with .gitattributes](https://github.com/doctrine/annotations/pull/43) -- [44: Update DocLexer.php](https://github.com/doctrine/annotations/pull/44) -- [46: A plain "file_put_contents" can cause havoc](https://github.com/doctrine/annotations/pull/46) -- [48: Deprecating the `FileCacheReader` in 1.2.2: will be removed in 2.0.0](https://github.com/doctrine/annotations/pull/48) - -### 1.2.1 - -Total issues resolved: **4** - -- [38: fixes doctrine/common#326](https://github.com/doctrine/annotations/pull/38) -- [39: Remove superfluous NS](https://github.com/doctrine/annotations/pull/39) -- [41: Warn if load_comments is not enabled.](https://github.com/doctrine/annotations/pull/41) -- [42: Clean up unused uses](https://github.com/doctrine/annotations/pull/42) - -### 1.2.0 - - * HHVM support - * Allowing dangling comma in annotations - * Excluded annotations are no longer autoloaded - * Importing namespaces also in traits - * Added support for `::class` 5.5-style constant, works also in 5.3 and 5.4 - -### 1.1.0 - - * Add Exception when ZendOptimizer+ or Opcache is configured to drop comments diff --git a/vendor/doctrine/annotations/LICENSE b/vendor/doctrine/annotations/LICENSE deleted file mode 100644 index 5e781fc..0000000 --- a/vendor/doctrine/annotations/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2006-2013 Doctrine Project - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/doctrine/annotations/README.md b/vendor/doctrine/annotations/README.md deleted file mode 100644 index a53b91f..0000000 --- a/vendor/doctrine/annotations/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Doctrine Annotations - -[![Build Status](https://travis-ci.org/doctrine/annotations.svg?branch=master)](https://travis-ci.org/doctrine/annotations) -[![Dependency Status](https://www.versioneye.com/package/php--doctrine--annotations/badge.png)](https://www.versioneye.com/package/php--doctrine--annotations) -[![Reference Status](https://www.versioneye.com/php/doctrine:annotations/reference_badge.svg)](https://www.versioneye.com/php/doctrine:annotations/references) -[![Total Downloads](https://poser.pugx.org/doctrine/annotations/downloads.png)](https://packagist.org/packages/doctrine/annotations) -[![Latest Stable Version](https://poser.pugx.org/doctrine/annotations/v/stable.png)](https://packagist.org/packages/doctrine/annotations) - -Docblock Annotations Parser library (extracted from [Doctrine Common](https://github.com/doctrine/common)). - -## Documentation - -See the [doctrine-project website](https://www.doctrine-project.org/projects/doctrine-annotations/en/latest/index.html). - -## Changelog - -See [CHANGELOG.md](CHANGELOG.md). diff --git a/vendor/doctrine/annotations/composer.json b/vendor/doctrine/annotations/composer.json deleted file mode 100644 index 040e717..0000000 --- a/vendor/doctrine/annotations/composer.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "doctrine/annotations", - "type": "library", - "description": "Docblock Annotations Parser", - "keywords": ["annotations", "docblock", "parser"], - "homepage": "http://www.doctrine-project.org", - "license": "MIT", - "authors": [ - {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, - {"name": "Roman Borschel", "email": "roman@code-factory.org"}, - {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, - {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, - {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} - ], - "require": { - "php": "^7.1 || ^8.0", - "ext-tokenizer": "*", - "doctrine/lexer": "1.*" - }, - "require-dev": { - "doctrine/cache": "1.*", - "phpunit/phpunit": "^7.5" - }, - "config": { - "sort-packages": true - }, - "autoload": { - "psr-4": { "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } - }, - "autoload-dev": { - "psr-4": { - "Doctrine\\Performance\\Common\\Annotations\\": "tests/Doctrine/Performance/Common/Annotations", - "Doctrine\\Tests\\Common\\Annotations\\": "tests/Doctrine/Tests/Common/Annotations" - }, - "files": [ - "tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - } -} diff --git a/vendor/doctrine/annotations/docs/en/annotations.rst b/vendor/doctrine/annotations/docs/en/annotations.rst deleted file mode 100644 index 1984dba..0000000 --- a/vendor/doctrine/annotations/docs/en/annotations.rst +++ /dev/null @@ -1,271 +0,0 @@ -Handling Annotations -==================== - -There are several different approaches to handling annotations in PHP. -Doctrine Annotations maps docblock annotations to PHP classes. Because -not all docblock annotations are used for metadata purposes a filter is -applied to ignore or skip classes that are not Doctrine annotations. - -Take a look at the following code snippet: - -.. code-block:: php - - namespace MyProject\Entities; - - use Doctrine\ORM\Mapping AS ORM; - use Symfony\Component\Validation\Constraints AS Assert; - - /** - * @author Benjamin Eberlei - * @ORM\Entity - * @MyProject\Annotations\Foobarable - */ - class User - { - /** - * @ORM\Id @ORM\Column @ORM\GeneratedValue - * @dummy - * @var int - */ - private $id; - - /** - * @ORM\Column(type="string") - * @Assert\NotEmpty - * @Assert\Email - * @var string - */ - private $email; - } - -In this snippet you can see a variety of different docblock annotations: - -- Documentation annotations such as ``@var`` and ``@author``. These - annotations are on a blacklist and never considered for throwing an - exception due to wrongly used annotations. -- Annotations imported through use statements. The statement ``use - Doctrine\ORM\Mapping AS ORM`` makes all classes under that namespace - available as ``@ORM\ClassName``. Same goes for the import of - ``@Assert``. -- The ``@dummy`` annotation. It is not a documentation annotation and - not blacklisted. For Doctrine Annotations it is not entirely clear how - to handle this annotation. Depending on the configuration an exception - (unknown annotation) will be thrown when parsing this annotation. -- The fully qualified annotation ``@MyProject\Annotations\Foobarable``. - This is transformed directly into the given class name. - -How are these annotations loaded? From looking at the code you could -guess that the ORM Mapping, Assert Validation and the fully qualified -annotation can just be loaded using -the defined PHP autoloaders. This is not the case however: For error -handling reasons every check for class existence inside the -``AnnotationReader`` sets the second parameter $autoload -of ``class_exists($name, $autoload)`` to false. To work flawlessly the -``AnnotationReader`` requires silent autoloaders which many autoloaders are -not. Silent autoloading is NOT part of the `PSR-0 specification -`_ -for autoloading. - -This is why Doctrine Annotations uses its own autoloading mechanism -through a global registry. If you are wondering about the annotation -registry being global, there is no other way to solve the architectural -problems of autoloading annotation classes in a straightforward fashion. -Additionally if you think about PHP autoloading then you recognize it is -a global as well. - -To anticipate the configuration section, making the above PHP class work -with Doctrine Annotations requires this setup: - -.. code-block:: php - - use Doctrine\Common\Annotations\AnnotationReader; - use Doctrine\Common\Annotations\AnnotationRegistry; - - AnnotationRegistry::registerFile("/path/to/doctrine/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php"); - AnnotationRegistry::registerAutoloadNamespace("Symfony\Component\Validator\Constraint", "/path/to/symfony/src"); - AnnotationRegistry::registerAutoloadNamespace("MyProject\Annotations", "/path/to/myproject/src"); - - $reader = new AnnotationReader(); - AnnotationReader::addGlobalIgnoredName('dummy'); - -The second block with the annotation registry calls registers all the -three different annotation namespaces that are used. -Doctrine Annotations saves all its annotations in a single file, that is -why ``AnnotationRegistry#registerFile`` is used in contrast to -``AnnotationRegistry#registerAutoloadNamespace`` which creates a PSR-0 -compatible loading mechanism for class to file names. - -In the third block, we create the actual ``AnnotationReader`` instance. -Note that we also add ``dummy`` to the global list of ignored -annotations for which we do not throw exceptions. Setting this is -necessary in our example case, otherwise ``@dummy`` would trigger an -exception to be thrown during the parsing of the docblock of -``MyProject\Entities\User#id``. - -Setup and Configuration ------------------------ - -To use the annotations library is simple, you just need to create a new -``AnnotationReader`` instance: - -.. code-block:: php - - $reader = new \Doctrine\Common\Annotations\AnnotationReader(); - -This creates a simple annotation reader with no caching other than in -memory (in php arrays). Since parsing docblocks can be expensive you -should cache this process by using a caching reader. - -You can use a file caching reader, but please note it is deprecated to -do so: - -.. code-block:: php - - use Doctrine\Common\Annotations\FileCacheReader; - use Doctrine\Common\Annotations\AnnotationReader; - - $reader = new FileCacheReader( - new AnnotationReader(), - "/path/to/cache", - $debug = true - ); - -If you set the ``debug`` flag to ``true`` the cache reader will check -for changes in the original files, which is very important during -development. If you don't set it to ``true`` you have to delete the -directory to clear the cache. This gives faster performance, however -should only be used in production, because of its inconvenience during -development. - -You can also use one of the ``Doctrine\Common\Cache\Cache`` cache -implementations to cache the annotations: - -.. code-block:: php - - use Doctrine\Common\Annotations\AnnotationReader; - use Doctrine\Common\Annotations\CachedReader; - use Doctrine\Common\Cache\ApcCache; - - $reader = new CachedReader( - new AnnotationReader(), - new ApcCache(), - $debug = true - ); - -The ``debug`` flag is used here as well to invalidate the cache files -when the PHP class with annotations changed and should be used during -development. - -.. warning :: - - The ``AnnotationReader`` works and caches under the - assumption that all annotations of a doc-block are processed at - once. That means that annotation classes that do not exist and - aren't loaded and cannot be autoloaded (using the - AnnotationRegistry) would never be visible and not accessible if a - cache is used unless the cache is cleared and the annotations - requested again, this time with all annotations defined. - -By default the annotation reader returns a list of annotations with -numeric indexes. If you want your annotations to be indexed by their -class name you can wrap the reader in an ``IndexedReader``: - -.. code-block:: php - - use Doctrine\Common\Annotations\AnnotationReader; - use Doctrine\Common\Annotations\IndexedReader; - - $reader = new IndexedReader(new AnnotationReader()); - -.. warning:: - - You should never wrap the indexed reader inside a cached reader, - only the other way around. This way you can re-use the cache with - indexed or numeric keys, otherwise your code may experience failures - due to caching in a numerical or indexed format. - -Registering Annotations -~~~~~~~~~~~~~~~~~~~~~~~ - -As explained in the introduction, Doctrine Annotations uses its own -autoloading mechanism to determine if a given annotation has a -corresponding PHP class that can be autoloaded. For annotation -autoloading you have to configure the -``Doctrine\Common\Annotations\AnnotationRegistry``. There are three -different mechanisms to configure annotation autoloading: - -- Calling ``AnnotationRegistry#registerFile($file)`` to register a file - that contains one or more annotation classes. -- Calling ``AnnotationRegistry#registerNamespace($namespace, $dirs = - null)`` to register that the given namespace contains annotations and - that their base directory is located at the given $dirs or in the - include path if ``NULL`` is passed. The given directories should *NOT* - be the directory where classes of the namespace are in, but the base - directory of the root namespace. The AnnotationRegistry uses a - namespace to directory separator approach to resolve the correct path. -- Calling ``AnnotationRegistry#registerLoader($callable)`` to register - an autoloader callback. The callback accepts the class as first and - only parameter and has to return ``true`` if the corresponding file - was found and included. - -.. note:: - - Loaders have to fail silently, if a class is not found even if it - matches for example the namespace prefix of that loader. Never is a - loader to throw a warning or exception if the loading failed - otherwise parsing doc block annotations will become a huge pain. - -A sample loader callback could look like: - -.. code-block:: php - - use Doctrine\Common\Annotations\AnnotationRegistry; - use Symfony\Component\ClassLoader\UniversalClassLoader; - - AnnotationRegistry::registerLoader(function($class) { - $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; - - if (file_exists("/my/base/path/" . $file)) { - // file_exists() makes sure that the loader fails silently - require "/my/base/path/" . $file; - } - }); - - $loader = new UniversalClassLoader(); - AnnotationRegistry::registerLoader(array($loader, "loadClass")); - - -Ignoring missing exceptions -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -By default an exception is thrown from the ``AnnotationReader`` if an -annotation was found that: - -- is not part of the blacklist of ignored "documentation annotations"; -- was not imported through a use statement; -- is not a fully qualified class that exists. - -You can disable this behavior for specific names if your docblocks do -not follow strict requirements: - -.. code-block:: php - - $reader = new \Doctrine\Common\Annotations\AnnotationReader(); - AnnotationReader::addGlobalIgnoredName('foo'); - -PHP Imports -~~~~~~~~~~~ - -By default the annotation reader parses the use-statement of a php file -to gain access to the import rules and register them for the annotation -processing. Only if you are using PHP Imports can you validate the -correct usage of annotations and throw exceptions if you misspelled an -annotation. This mechanism is enabled by default. - -To ease the upgrade path, we still allow you to disable this mechanism. -Note however that we will remove this in future versions: - -.. code-block:: php - - $reader = new \Doctrine\Common\Annotations\AnnotationReader(); - $reader->setEnabledPhpImports(false); diff --git a/vendor/doctrine/annotations/docs/en/custom.rst b/vendor/doctrine/annotations/docs/en/custom.rst deleted file mode 100644 index e589a54..0000000 --- a/vendor/doctrine/annotations/docs/en/custom.rst +++ /dev/null @@ -1,353 +0,0 @@ -Custom Annotation Classes -========================= - -If you want to define your own annotations, you just have to group them -in a namespace and register this namespace in the ``AnnotationRegistry``. -Annotation classes have to contain a class-level docblock with the text -``@Annotation``: - -.. code-block:: php - - namespace MyCompany\Annotations; - - /** @Annotation */ - class Bar - { - // some code - } - -Inject annotation values ------------------------- - -The annotation parser checks if the annotation constructor has arguments, -if so then it will pass the value array, otherwise it will try to inject -values into public properties directly: - - -.. code-block:: php - - namespace MyCompany\Annotations; - - /** - * @Annotation - * - * Some Annotation using a constructor - */ - class Bar - { - private $foo; - - public function __construct(array $values) - { - $this->foo = $values['foo']; - } - } - - /** - * @Annotation - * - * Some Annotation without a constructor - */ - class Foo - { - public $bar; - } - -Annotation Target ------------------ - -``@Target`` indicates the kinds of class elements to which an annotation -type is applicable. Then you could define one or more targets: - -- ``CLASS`` Allowed in class docblocks -- ``PROPERTY`` Allowed in property docblocks -- ``METHOD`` Allowed in the method docblocks -- ``ALL`` Allowed in class, property and method docblocks -- ``ANNOTATION`` Allowed inside other annotations - -If the annotations is not allowed in the current context, an -``AnnotationException`` is thrown. - -.. code-block:: php - - namespace MyCompany\Annotations; - - /** - * @Annotation - * @Target({"METHOD","PROPERTY"}) - */ - class Bar - { - // some code - } - - /** - * @Annotation - * @Target("CLASS") - */ - class Foo - { - // some code - } - -Attribute types ---------------- - -The annotation parser checks the given parameters using the phpdoc -annotation ``@var``, The data type could be validated using the ``@var`` -annotation on the annotation properties or using the ``@Attributes`` and -``@Attribute`` annotations. - -If the data type does not match you get an ``AnnotationException`` - -.. code-block:: php - - namespace MyCompany\Annotations; - - /** - * @Annotation - * @Target({"METHOD","PROPERTY"}) - */ - class Bar - { - /** @var mixed */ - public $mixed; - - /** @var boolean */ - public $boolean; - - /** @var bool */ - public $bool; - - /** @var float */ - public $float; - - /** @var string */ - public $string; - - /** @var integer */ - public $integer; - - /** @var array */ - public $array; - - /** @var SomeAnnotationClass */ - public $annotation; - - /** @var array */ - public $arrayOfIntegers; - - /** @var array */ - public $arrayOfAnnotations; - } - - /** - * @Annotation - * @Target({"METHOD","PROPERTY"}) - * @Attributes({ - * @Attribute("stringProperty", type = "string"), - * @Attribute("annotProperty", type = "SomeAnnotationClass"), - * }) - */ - class Foo - { - public function __construct(array $values) - { - $this->stringProperty = $values['stringProperty']; - $this->annotProperty = $values['annotProperty']; - } - - // some code - } - -Annotation Required -------------------- - -``@Required`` indicates that the field must be specified when the -annotation is used. If it is not used you get an ``AnnotationException`` -stating that this value can not be null. - -Declaring a required field: - -.. code-block:: php - - /** - * @Annotation - * @Target("ALL") - */ - class Foo - { - /** @Required */ - public $requiredField; - } - -Usage: - -.. code-block:: php - - /** @Foo(requiredField="value") */ - public $direction; // Valid - - /** @Foo */ - public $direction; // Required field missing, throws an AnnotationException - - -Enumerated values ------------------ - -- An annotation property marked with ``@Enum`` is a field that accepts a - fixed set of scalar values. -- You should use ``@Enum`` fields any time you need to represent fixed - values. -- The annotation parser checks the given value and throws an - ``AnnotationException`` if the value does not match. - - -Declaring an enumerated property: - -.. code-block:: php - - /** - * @Annotation - * @Target("ALL") - */ - class Direction - { - /** - * @Enum({"NORTH", "SOUTH", "EAST", "WEST"}) - */ - public $value; - } - -Annotation usage: - -.. code-block:: php - - /** @Direction("NORTH") */ - public $direction; // Valid value - - /** @Direction("NORTHEAST") */ - public $direction; // Invalid value, throws an AnnotationException - - -Constants ---------- - -The use of constants and class constants is available on the annotations -parser. - -The following usages are allowed: - -.. code-block:: php - - namespace MyCompany\Entity; - - use MyCompany\Annotations\Foo; - use MyCompany\Annotations\Bar; - use MyCompany\Entity\SomeClass; - - /** - * @Foo(PHP_EOL) - * @Bar(Bar::FOO) - * @Foo({SomeClass::FOO, SomeClass::BAR}) - * @Bar({SomeClass::FOO_KEY = SomeClass::BAR_VALUE}) - */ - class User - { - } - - -Be careful with constants and the cache ! - -.. note:: - - The cached reader will not re-evaluate each time an annotation is - loaded from cache. When a constant is changed the cache must be - cleaned. - - -Usage ------ - -Using the library API is simple. Using the annotations described in the -previous section, you can now annotate other classes with your -annotations: - -.. code-block:: php - - namespace MyCompany\Entity; - - use MyCompany\Annotations\Foo; - use MyCompany\Annotations\Bar; - - /** - * @Foo(bar="foo") - * @Bar(foo="bar") - */ - class User - { - } - -Now we can write a script to get the annotations above: - -.. code-block:: php - - $reflClass = new ReflectionClass('MyCompany\Entity\User'); - $classAnnotations = $reader->getClassAnnotations($reflClass); - - foreach ($classAnnotations AS $annot) { - if ($annot instanceof \MyCompany\Annotations\Foo) { - echo $annot->bar; // prints "foo"; - } else if ($annot instanceof \MyCompany\Annotations\Bar) { - echo $annot->foo; // prints "bar"; - } - } - -You have a complete API for retrieving annotation class instances from a -class, property or method docblock: - - -Reader API -~~~~~~~~~~ - -Access all annotations of a class -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getClassAnnotations(\ReflectionClass $class); - -Access one annotation of a class -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getClassAnnotation(\ReflectionClass $class, $annotationName); - -Access all annotations of a method -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getMethodAnnotations(\ReflectionMethod $method); - -Access one annotation of a method -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getMethodAnnotation(\ReflectionMethod $method, $annotationName); - -Access all annotations of a property -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getPropertyAnnotations(\ReflectionProperty $property); - -Access one annotation of a property -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); diff --git a/vendor/doctrine/annotations/docs/en/index.rst b/vendor/doctrine/annotations/docs/en/index.rst deleted file mode 100644 index 3b3368c..0000000 --- a/vendor/doctrine/annotations/docs/en/index.rst +++ /dev/null @@ -1,97 +0,0 @@ -Introduction -============ - -Doctrine Annotations allows to implement custom annotation -functionality for PHP classes. - -.. code-block:: php - - class Foo - { - /** - * @MyAnnotation(myProperty="value") - */ - private $bar; - } - -Annotations aren't implemented in PHP itself which is why this component -offers a way to use the PHP doc-blocks as a place for the well known -annotation syntax using the ``@`` char. - -Annotations in Doctrine are used for the ORM configuration to build the -class mapping, but it can be used in other projects for other purposes -too. - -Installation -============ - -You can install the Annotation component with composer: - -.. code-block:: - -   $ composer require doctrine/annotations - -Create an annotation class -========================== - -An annotation class is a representation of the later used annotation -configuration in classes. The annotation class of the previous example -looks like this: - -.. code-block:: php - - /** - * @Annotation - */ - final class MyAnnotation - { - public $myProperty; - } - -The annotation class is declared as an annotation by ``@Annotation``. - -:ref:`Read more about custom annotations. ` - -Reading annotations -=================== - -The access to the annotations happens by reflection of the class -containing them. There are multiple reader-classes implementing the -``Doctrine\Common\Annotations\Reader`` interface, that can access the -annotations of a class. A common one is -``Doctrine\Common\Annotations\AnnotationReader``: - -.. code-block:: php - - use Doctrine\Common\Annotations\AnnotationReader; - use Doctrine\Common\Annotations\AnnotationRegistry; - - // Deprecated and will be removed in 2.0 but currently needed - AnnotationRegistry::registerLoader('class_exists'); - - $reflectionClass = new ReflectionClass(Foo::class); - $property = $reflectionClass->getProperty('bar'); - - $reader = new AnnotationReader(); - $myAnnotation = $reader->getPropertyAnnotation($property, MyAnnotation::class); - - echo $myAnnotation->myProperty; // result: "value" - -Note that ``AnnotationRegistry::registerLoader('class_exists')`` only works -if you already have an autoloader configured (i.e. composer autoloader). -Otherwise, :ref:`please take a look to the other annotation autoload mechanisms `. - -A reader has multiple methods to access the annotations of a class. - -:ref:`Read more about handling annotations. ` - -IDE Support ------------ - -Some IDEs already provide support for annotations: - -- Eclipse via the `Symfony2 Plugin `_ -- PHPStorm via the `PHP Annotations Plugin `_ or the `Symfony2 Plugin `_ - -.. _Read more about handling annotations.: annotations -.. _Read more about custom annotations.: custom diff --git a/vendor/doctrine/annotations/docs/en/sidebar.rst b/vendor/doctrine/annotations/docs/en/sidebar.rst deleted file mode 100644 index 6f5d13c..0000000 --- a/vendor/doctrine/annotations/docs/en/sidebar.rst +++ /dev/null @@ -1,6 +0,0 @@ -.. toctree:: - :depth: 3 - - index - annotations - custom diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php deleted file mode 100644 index a79a0f8..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Annotations class. - * - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class Annotation -{ - /** - * Value property. Common among all derived classes. - * - * @var string - */ - public $value; - - /** - * Constructor. - * - * @param array $data Key-value for properties to be defined in this class. - */ - public final function __construct(array $data) - { - foreach ($data as $key => $value) { - $this->$key = $value; - } - } - - /** - * Error handler for unknown property accessor in Annotation class. - * - * @param string $name Unknown property name. - * - * @throws \BadMethodCallException - */ - public function __get($name) - { - throw new \BadMethodCallException( - sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) - ); - } - - /** - * Error handler for unknown property mutator in Annotation class. - * - * @param string $name Unknown property name. - * @param mixed $value Property value. - * - * @throws \BadMethodCallException - */ - public function __set($name, $value) - { - throw new \BadMethodCallException( - sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) - ); - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php deleted file mode 100644 index dbef6df..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations\Annotation; - -/** - * Annotation that can be used to signal to the parser - * to check the attribute type during the parsing process. - * - * @author Fabio B. Silva - * - * @Annotation - */ -final class Attribute -{ - /** - * @var string - */ - public $name; - - /** - * @var string - */ - public $type; - - /** - * @var boolean - */ - public $required = false; -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php deleted file mode 100644 index 53134e3..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php +++ /dev/null @@ -1,37 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations\Annotation; - -/** - * Annotation that can be used to signal to the parser - * to check the types of all declared attributes during the parsing process. - * - * @author Fabio B. Silva - * - * @Annotation - */ -final class Attributes -{ - /** - * @var array - */ - public $value; -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php deleted file mode 100644 index 82f6241..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php +++ /dev/null @@ -1,84 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations\Annotation; - -/** - * Annotation that can be used to signal to the parser - * to check the available values during the parsing process. - * - * @since 2.4 - * @author Fabio B. Silva - * - * @Annotation - * @Attributes({ - * @Attribute("value", required = true, type = "array"), - * @Attribute("literal", required = false, type = "array") - * }) - */ -final class Enum -{ - /** - * @var array - */ - public $value; - - /** - * Literal target declaration. - * - * @var array - */ - public $literal; - - /** - * Annotation constructor. - * - * @param array $values - * - * @throws \InvalidArgumentException - */ - public function __construct(array $values) - { - if ( ! isset($values['literal'])) { - $values['literal'] = []; - } - - foreach ($values['value'] as $var) { - if( ! is_scalar($var)) { - throw new \InvalidArgumentException(sprintf( - '@Enum supports only scalar values "%s" given.', - is_object($var) ? get_class($var) : gettype($var) - )); - } - } - - foreach ($values['literal'] as $key => $var) { - if( ! in_array($key, $values['value'])) { - throw new \InvalidArgumentException(sprintf( - 'Undefined enumerator value "%s" for literal "%s".', - $key , $var - )); - } - } - - $this->value = $values['value']; - $this->literal = $values['literal']; - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php deleted file mode 100644 index 85ec3d6..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations\Annotation; - -/** - * Annotation that can be used to signal to the parser to ignore specific - * annotations during the parsing process. - * - * @Annotation - * @author Johannes M. Schmitt - */ -final class IgnoreAnnotation -{ - /** - * @var array - */ - public $names; - - /** - * Constructor. - * - * @param array $values - * - * @throws \RuntimeException - */ - public function __construct(array $values) - { - if (is_string($values['value'])) { - $values['value'] = [$values['value']]; - } - if (!is_array($values['value'])) { - throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); - } - - $this->names = $values['value']; - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php deleted file mode 100644 index d67f960..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php +++ /dev/null @@ -1,33 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations\Annotation; - -/** - * Annotation that can be used to signal to the parser - * to check if that attribute is required during the parsing process. - * - * @author Fabio B. Silva - * - * @Annotation - */ -final class Required -{ -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php deleted file mode 100644 index a52972b..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php +++ /dev/null @@ -1,107 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations\Annotation; - -/** - * Annotation that can be used to signal to the parser - * to check the annotation target during the parsing process. - * - * @author Fabio B. Silva - * - * @Annotation - */ -final class Target -{ - const TARGET_CLASS = 1; - const TARGET_METHOD = 2; - const TARGET_PROPERTY = 4; - const TARGET_ANNOTATION = 8; - const TARGET_ALL = 15; - - /** - * @var array - */ - private static $map = [ - 'ALL' => self::TARGET_ALL, - 'CLASS' => self::TARGET_CLASS, - 'METHOD' => self::TARGET_METHOD, - 'PROPERTY' => self::TARGET_PROPERTY, - 'ANNOTATION' => self::TARGET_ANNOTATION, - ]; - - /** - * @var array - */ - public $value; - - /** - * Targets as bitmask. - * - * @var integer - */ - public $targets; - - /** - * Literal target declaration. - * - * @var integer - */ - public $literal; - - /** - * Annotation constructor. - * - * @param array $values - * - * @throws \InvalidArgumentException - */ - public function __construct(array $values) - { - if (!isset($values['value'])){ - $values['value'] = null; - } - if (is_string($values['value'])){ - $values['value'] = [$values['value']]; - } - if (!is_array($values['value'])){ - throw new \InvalidArgumentException( - sprintf('@Target expects either a string value, or an array of strings, "%s" given.', - is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) - ) - ); - } - - $bitmask = 0; - foreach ($values['value'] as $literal) { - if(!isset(self::$map[$literal])){ - throw new \InvalidArgumentException( - sprintf('Invalid Target "%s". Available targets: [%s]', - $literal, implode(', ', array_keys(self::$map))) - ); - } - $bitmask |= self::$map[$literal]; - } - - $this->targets = $bitmask; - $this->value = $values['value']; - $this->literal = implode(', ', $this->value); - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php deleted file mode 100644 index d06fe66..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php +++ /dev/null @@ -1,197 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Description of AnnotationException - * - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - */ -class AnnotationException extends \Exception -{ - /** - * Creates a new AnnotationException describing a Syntax error. - * - * @param string $message Exception message - * - * @return AnnotationException - */ - public static function syntaxError($message) - { - return new self('[Syntax Error] ' . $message); - } - - /** - * Creates a new AnnotationException describing a Semantical error. - * - * @param string $message Exception message - * - * @return AnnotationException - */ - public static function semanticalError($message) - { - return new self('[Semantical Error] ' . $message); - } - - /** - * Creates a new AnnotationException describing an error which occurred during - * the creation of the annotation. - * - * @since 2.2 - * - * @param string $message - * - * @return AnnotationException - */ - public static function creationError($message) - { - return new self('[Creation Error] ' . $message); - } - - /** - * Creates a new AnnotationException describing a type error. - * - * @since 1.1 - * - * @param string $message - * - * @return AnnotationException - */ - public static function typeError($message) - { - return new self('[Type Error] ' . $message); - } - - /** - * Creates a new AnnotationException describing a constant semantical error. - * - * @since 2.3 - * - * @param string $identifier - * @param string $context - * - * @return AnnotationException - */ - public static function semanticalErrorConstants($identifier, $context = null) - { - return self::semanticalError(sprintf( - "Couldn't find constant %s%s.", - $identifier, - $context ? ', ' . $context : '' - )); - } - - /** - * Creates a new AnnotationException describing an type error of an attribute. - * - * @since 2.2 - * - * @param string $attributeName - * @param string $annotationName - * @param string $context - * @param string $expected - * @param mixed $actual - * - * @return AnnotationException - */ - public static function attributeTypeError($attributeName, $annotationName, $context, $expected, $actual) - { - return self::typeError(sprintf( - 'Attribute "%s" of @%s declared on %s expects %s, but got %s.', - $attributeName, - $annotationName, - $context, - $expected, - is_object($actual) ? 'an instance of ' . get_class($actual) : gettype($actual) - )); - } - - /** - * Creates a new AnnotationException describing an required error of an attribute. - * - * @since 2.2 - * - * @param string $attributeName - * @param string $annotationName - * @param string $context - * @param string $expected - * - * @return AnnotationException - */ - public static function requiredError($attributeName, $annotationName, $context, $expected) - { - return self::typeError(sprintf( - 'Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', - $attributeName, - $annotationName, - $context, - $expected - )); - } - - /** - * Creates a new AnnotationException describing a invalid enummerator. - * - * @since 2.4 - * - * @param string $attributeName - * @param string $annotationName - * @param string $context - * @param array $available - * @param mixed $given - * - * @return AnnotationException - */ - public static function enumeratorError($attributeName, $annotationName, $context, $available, $given) - { - return new self(sprintf( - '[Enum Error] Attribute "%s" of @%s declared on %s accept only [%s], but got %s.', - $attributeName, - $annotationName, - $context, - implode(', ', $available), - is_object($given) ? get_class($given) : $given - )); - } - - /** - * @return AnnotationException - */ - public static function optimizerPlusSaveComments() - { - return new self( - "You have to enable opcache.save_comments=1 or zend_optimizerplus.save_comments=1." - ); - } - - /** - * @return AnnotationException - */ - public static function optimizerPlusLoadComments() - { - return new self( - "You have to enable opcache.load_comments=1 or zend_optimizerplus.load_comments=1." - ); - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php deleted file mode 100644 index 8811c29..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php +++ /dev/null @@ -1,418 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; -use Doctrine\Common\Annotations\Annotation\Target; -use ReflectionClass; -use ReflectionMethod; -use ReflectionProperty; - -/** - * A reader for docblock annotations. - * - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Johannes M. Schmitt - */ -class AnnotationReader implements Reader -{ - /** - * Global map for imports. - * - * @var array - */ - private static $globalImports = [ - 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', - ]; - - /** - * A list with annotations that are not causing exceptions when not resolved to an annotation class. - * - * The names are case sensitive. - * - * @var array - */ - private static $globalIgnoredNames = [ - // Annotation tags - 'Annotation' => true, 'Attribute' => true, 'Attributes' => true, - /* Can we enable this? 'Enum' => true, */ - 'Required' => true, - 'Target' => true, - // Widely used tags (but not existent in phpdoc) - 'fix' => true , 'fixme' => true, - 'override' => true, - // PHPDocumentor 1 tags - 'abstract'=> true, 'access'=> true, - 'code' => true, - 'deprec'=> true, - 'endcode' => true, 'exception'=> true, - 'final'=> true, - 'ingroup' => true, 'inheritdoc'=> true, 'inheritDoc'=> true, - 'magic' => true, - 'name'=> true, - 'toc' => true, 'tutorial'=> true, - 'private' => true, - 'static'=> true, 'staticvar'=> true, 'staticVar'=> true, - 'throw' => true, - // PHPDocumentor 2 tags. - 'api' => true, 'author'=> true, - 'category'=> true, 'copyright'=> true, - 'deprecated'=> true, - 'example'=> true, - 'filesource'=> true, - 'global'=> true, - 'ignore'=> true, /* Can we enable this? 'index' => true, */ 'internal'=> true, - 'license'=> true, 'link'=> true, - 'method' => true, - 'package'=> true, 'param'=> true, 'property' => true, 'property-read' => true, 'property-write' => true, - 'return'=> true, - 'see'=> true, 'since'=> true, 'source' => true, 'subpackage'=> true, - 'throws'=> true, 'todo'=> true, 'TODO'=> true, - 'usedby'=> true, 'uses' => true, - 'var'=> true, 'version'=> true, - // PHPUnit tags - 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, - // PHPCheckStyle - 'SuppressWarnings' => true, - // PHPStorm - 'noinspection' => true, - // PEAR - 'package_version' => true, - // PlantUML - 'startuml' => true, 'enduml' => true, - // Symfony 3.3 Cache Adapter - 'experimental' => true, - // Slevomat Coding Standard - 'phpcsSuppress' => true, - // PHP CodeSniffer - 'codingStandardsIgnoreStart' => true, - 'codingStandardsIgnoreEnd' => true, - // PHPStan - 'template' => true, 'implements' => true, 'extends' => true, 'use' => true, - ]; - - /** - * A list with annotations that are not causing exceptions when not resolved to an annotation class. - * - * The names are case sensitive. - * - * @var array - */ - private static $globalIgnoredNamespaces = []; - - /** - * Add a new annotation to the globally ignored annotation names with regard to exception handling. - * - * @param string $name - */ - static public function addGlobalIgnoredName($name) - { - self::$globalIgnoredNames[$name] = true; - } - - /** - * Add a new annotation to the globally ignored annotation namespaces with regard to exception handling. - * - * @param string $namespace - */ - static public function addGlobalIgnoredNamespace($namespace) - { - self::$globalIgnoredNamespaces[$namespace] = true; - } - - /** - * Annotations parser. - * - * @var \Doctrine\Common\Annotations\DocParser - */ - private $parser; - - /** - * Annotations parser used to collect parsing metadata. - * - * @var \Doctrine\Common\Annotations\DocParser - */ - private $preParser; - - /** - * PHP parser used to collect imports. - * - * @var \Doctrine\Common\Annotations\PhpParser - */ - private $phpParser; - - /** - * In-memory cache mechanism to store imported annotations per class. - * - * @var array - */ - private $imports = []; - - /** - * In-memory cache mechanism to store ignored annotations per class. - * - * @var array - */ - private $ignoredAnnotationNames = []; - - /** - * Constructor. - * - * Initializes a new AnnotationReader. - * - * @param DocParser $parser - * - * @throws AnnotationException - */ - public function __construct(DocParser $parser = null) - { - if (extension_loaded('Zend Optimizer+') && (ini_get('zend_optimizerplus.save_comments') === "0" || ini_get('opcache.save_comments') === "0")) { - throw AnnotationException::optimizerPlusSaveComments(); - } - - if (extension_loaded('Zend OPcache') && ini_get('opcache.save_comments') == 0) { - throw AnnotationException::optimizerPlusSaveComments(); - } - - // Make sure that the IgnoreAnnotation annotation is loaded - class_exists(IgnoreAnnotation::class); - - $this->parser = $parser ?: new DocParser(); - - $this->preParser = new DocParser; - - $this->preParser->setImports(self::$globalImports); - $this->preParser->setIgnoreNotImportedAnnotations(true); - $this->preParser->setIgnoredAnnotationNames(self::$globalIgnoredNames); - - $this->phpParser = new PhpParser; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotations(ReflectionClass $class) - { - $this->parser->setTarget(Target::TARGET_CLASS); - $this->parser->setImports($this->getClassImports($class)); - $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); - $this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces); - - return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotation(ReflectionClass $class, $annotationName) - { - $annotations = $this->getClassAnnotations($class); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotations(ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - $context = 'property ' . $class->getName() . "::\$" . $property->getName(); - - $this->parser->setTarget(Target::TARGET_PROPERTY); - $this->parser->setImports($this->getPropertyImports($property)); - $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); - $this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces); - - return $this->parser->parse($property->getDocComment(), $context); - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) - { - $annotations = $this->getPropertyAnnotations($property); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotations(ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; - - $this->parser->setTarget(Target::TARGET_METHOD); - $this->parser->setImports($this->getMethodImports($method)); - $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); - $this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces); - - return $this->parser->parse($method->getDocComment(), $context); - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotation(ReflectionMethod $method, $annotationName) - { - $annotations = $this->getMethodAnnotations($method); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * Returns the ignored annotations for the given class. - * - * @param \ReflectionClass $class - * - * @return array - */ - private function getIgnoredAnnotationNames(ReflectionClass $class) - { - $name = $class->getName(); - if (isset($this->ignoredAnnotationNames[$name])) { - return $this->ignoredAnnotationNames[$name]; - } - - $this->collectParsingMetadata($class); - - return $this->ignoredAnnotationNames[$name]; - } - - /** - * Retrieves imports. - * - * @param \ReflectionClass $class - * - * @return array - */ - private function getClassImports(ReflectionClass $class) - { - $name = $class->getName(); - if (isset($this->imports[$name])) { - return $this->imports[$name]; - } - - $this->collectParsingMetadata($class); - - return $this->imports[$name]; - } - - /** - * Retrieves imports for methods. - * - * @param \ReflectionMethod $method - * - * @return array - */ - private function getMethodImports(ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - $classImports = $this->getClassImports($class); - - $traitImports = []; - - foreach ($class->getTraits() as $trait) { - if ($trait->hasMethod($method->getName()) - && $trait->getFileName() === $method->getFileName() - ) { - $traitImports = array_merge($traitImports, $this->phpParser->parseClass($trait)); - } - } - - return array_merge($classImports, $traitImports); - } - - /** - * Retrieves imports for properties. - * - * @param \ReflectionProperty $property - * - * @return array - */ - private function getPropertyImports(ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - $classImports = $this->getClassImports($class); - - $traitImports = []; - - foreach ($class->getTraits() as $trait) { - if ($trait->hasProperty($property->getName())) { - $traitImports = array_merge($traitImports, $this->phpParser->parseClass($trait)); - } - } - - return array_merge($classImports, $traitImports); - } - - /** - * Collects parsing metadata for a given class. - * - * @param \ReflectionClass $class - */ - private function collectParsingMetadata(ReflectionClass $class) - { - $ignoredAnnotationNames = self::$globalIgnoredNames; - $annotations = $this->preParser->parse($class->getDocComment(), 'class ' . $class->name); - - foreach ($annotations as $annotation) { - if ($annotation instanceof IgnoreAnnotation) { - foreach ($annotation->names AS $annot) { - $ignoredAnnotationNames[$annot] = true; - } - } - } - - $name = $class->getName(); - - $this->imports[$name] = array_merge( - self::$globalImports, - $this->phpParser->parseClass($class), - ['__NAMESPACE__' => $class->getNamespaceName()] - ); - - $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php deleted file mode 100644 index ceb7eb7..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php +++ /dev/null @@ -1,180 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -final class AnnotationRegistry -{ - /** - * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. - * - * Contains the namespace as key and an array of directories as value. If the value is NULL - * the include path is used for checking for the corresponding file. - * - * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. - * - * @var string[][]|string[]|null[] - */ - static private $autoloadNamespaces = []; - - /** - * A map of autoloader callables. - * - * @var callable[] - */ - static private $loaders = []; - - /** - * An array of classes which cannot be found - * - * @var null[] indexed by class name - */ - static private $failedToAutoload = []; - - /** - * Whenever registerFile() was used. Disables use of standard autoloader. - * - * @var bool - */ - static private $registerFileUsed = false; - - public static function reset() : void - { - self::$autoloadNamespaces = []; - self::$loaders = []; - self::$failedToAutoload = []; - self::$registerFileUsed = false; - } - - /** - * Registers file. - * - * @deprecated This method is deprecated and will be removed in doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. - */ - public static function registerFile(string $file) : void - { - self::$registerFileUsed = true; - - require_once $file; - } - - /** - * Adds a namespace with one or many directories to look for files or null for the include path. - * - * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. - * - * @param string $namespace - * @param string|array|null $dirs - * - * @deprecated This method is deprecated and will be removed in doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. - */ - public static function registerAutoloadNamespace(string $namespace, $dirs = null) : void - { - self::$autoloadNamespaces[$namespace] = $dirs; - } - - /** - * Registers multiple namespaces. - * - * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. - * - * @param string[][]|string[]|null[] $namespaces indexed by namespace name - * - * @deprecated This method is deprecated and will be removed in doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. - */ - public static function registerAutoloadNamespaces(array $namespaces) : void - { - self::$autoloadNamespaces = \array_merge(self::$autoloadNamespaces, $namespaces); - } - - /** - * Registers an autoloading callable for annotations, much like spl_autoload_register(). - * - * NOTE: These class loaders HAVE to be silent when a class was not found! - * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. - * - * @deprecated This method is deprecated and will be removed in doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. - */ - public static function registerLoader(callable $callable) : void - { - // Reset our static cache now that we have a new loader to work with - self::$failedToAutoload = []; - self::$loaders[] = $callable; - } - - /** - * Registers an autoloading callable for annotations, if it is not already registered - * - * @deprecated This method is deprecated and will be removed in doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. - */ - public static function registerUniqueLoader(callable $callable) : void - { - if ( ! in_array($callable, self::$loaders, true) ) { - self::registerLoader($callable); - } - } - - /** - * Autoloads an annotation class silently. - */ - public static function loadAnnotationClass(string $class) : bool - { - if (\class_exists($class, false)) { - return true; - } - - if (\array_key_exists($class, self::$failedToAutoload)) { - return false; - } - - foreach (self::$autoloadNamespaces AS $namespace => $dirs) { - if (\strpos($class, $namespace) === 0) { - $file = \str_replace('\\', \DIRECTORY_SEPARATOR, $class) . '.php'; - - if ($dirs === null) { - if ($path = stream_resolve_include_path($file)) { - require $path; - return true; - } - } else { - foreach((array) $dirs AS $dir) { - if (is_file($dir . \DIRECTORY_SEPARATOR . $file)) { - require $dir . \DIRECTORY_SEPARATOR . $file; - return true; - } - } - } - } - } - - foreach (self::$loaders AS $loader) { - if ($loader($class) === true) { - return true; - } - } - - if (self::$loaders === [] && self::$autoloadNamespaces === [] && self::$registerFileUsed === false && \class_exists($class)) { - return true; - } - - self::$failedToAutoload[$class] = null; - - return false; - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php deleted file mode 100644 index 8ed16f1..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php +++ /dev/null @@ -1,278 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use Doctrine\Common\Cache\Cache; -use ReflectionClass; - -/** - * A cache aware annotation reader. - * - * @author Johannes M. Schmitt - * @author Benjamin Eberlei - */ -final class CachedReader implements Reader -{ - /** - * @var Reader - */ - private $delegate; - - /** - * @var Cache - */ - private $cache; - - /** - * @var boolean - */ - private $debug; - - /** - * @var array - */ - private $loadedAnnotations = []; - - /** - * @var int[] - */ - private $loadedFilemtimes = []; - - /** - * @param bool $debug - */ - public function __construct(Reader $reader, Cache $cache, $debug = false) - { - $this->delegate = $reader; - $this->cache = $cache; - $this->debug = (boolean) $debug; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotations(ReflectionClass $class) - { - $cacheKey = $class->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { - $annots = $this->delegate->getClassAnnotations($class); - $this->saveToCache($cacheKey, $annots); - } - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotation(ReflectionClass $class, $annotationName) - { - foreach ($this->getClassAnnotations($class) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotations(\ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - $cacheKey = $class->getName().'$'.$property->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { - $annots = $this->delegate->getPropertyAnnotations($property); - $this->saveToCache($cacheKey, $annots); - } - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) - { - foreach ($this->getPropertyAnnotations($property) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotations(\ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - $cacheKey = $class->getName().'#'.$method->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { - $annots = $this->delegate->getMethodAnnotations($method); - $this->saveToCache($cacheKey, $annots); - } - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) - { - foreach ($this->getMethodAnnotations($method) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * Clears loaded annotations. - * - * @return void - */ - public function clearLoadedAnnotations() - { - $this->loadedAnnotations = []; - $this->loadedFilemtimes = []; - } - - /** - * Fetches a value from the cache. - * - * @param string $cacheKey The cache key. - * - * @return mixed The cached value or false when the value is not in cache. - */ - private function fetchFromCache($cacheKey, ReflectionClass $class) - { - if (($data = $this->cache->fetch($cacheKey)) !== false) { - if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { - return $data; - } - } - - return false; - } - - /** - * Saves a value to the cache. - * - * @param string $cacheKey The cache key. - * @param mixed $value The value. - * - * @return void - */ - private function saveToCache($cacheKey, $value) - { - $this->cache->save($cacheKey, $value); - if ($this->debug) { - $this->cache->save('[C]'.$cacheKey, time()); - } - } - - /** - * Checks if the cache is fresh. - * - * @param string $cacheKey - * - * @return boolean - */ - private function isCacheFresh($cacheKey, ReflectionClass $class) - { - $lastModification = $this->getLastModification($class); - if ($lastModification === 0) { - return true; - } - - return $this->cache->fetch('[C]'.$cacheKey) >= $lastModification; - } - - /** - * Returns the time the class was last modified, testing traits and parents - * - * @return int - */ - private function getLastModification(ReflectionClass $class) - { - $filename = $class->getFileName(); - - if (isset($this->loadedFilemtimes[$filename])) { - return $this->loadedFilemtimes[$filename]; - } - - $parent = $class->getParentClass(); - - $lastModification = max(array_merge( - [$filename ? filemtime($filename) : 0], - array_map([$this, 'getTraitLastModificationTime'], $class->getTraits()), - array_map([$this, 'getLastModification'], $class->getInterfaces()), - $parent ? [$this->getLastModification($parent)] : [] - )); - - assert($lastModification !== false); - - return $this->loadedFilemtimes[$filename] = $lastModification; - } - - /** - * @return int - */ - private function getTraitLastModificationTime(ReflectionClass $reflectionTrait) - { - $fileName = $reflectionTrait->getFileName(); - - if (isset($this->loadedFilemtimes[$fileName])) { - return $this->loadedFilemtimes[$fileName]; - } - - $lastModificationTime = max(array_merge( - [$fileName ? filemtime($fileName) : 0], - array_map([$this, 'getTraitLastModificationTime'], $reflectionTrait->getTraits()) - )); - - assert($lastModificationTime !== false); - - return $this->loadedFilemtimes[$fileName] = $lastModificationTime; - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php deleted file mode 100644 index 8182f6c..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php +++ /dev/null @@ -1,147 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use Doctrine\Common\Lexer\AbstractLexer; - -/** - * Simple lexer for docblock annotations. - * - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Johannes M. Schmitt - */ -final class DocLexer extends AbstractLexer -{ - const T_NONE = 1; - const T_INTEGER = 2; - const T_STRING = 3; - const T_FLOAT = 4; - - // All tokens that are also identifiers should be >= 100 - const T_IDENTIFIER = 100; - const T_AT = 101; - const T_CLOSE_CURLY_BRACES = 102; - const T_CLOSE_PARENTHESIS = 103; - const T_COMMA = 104; - const T_EQUALS = 105; - const T_FALSE = 106; - const T_NAMESPACE_SEPARATOR = 107; - const T_OPEN_CURLY_BRACES = 108; - const T_OPEN_PARENTHESIS = 109; - const T_TRUE = 110; - const T_NULL = 111; - const T_COLON = 112; - const T_MINUS = 113; - - /** - * @var array - */ - protected $noCase = [ - '@' => self::T_AT, - ',' => self::T_COMMA, - '(' => self::T_OPEN_PARENTHESIS, - ')' => self::T_CLOSE_PARENTHESIS, - '{' => self::T_OPEN_CURLY_BRACES, - '}' => self::T_CLOSE_CURLY_BRACES, - '=' => self::T_EQUALS, - ':' => self::T_COLON, - '-' => self::T_MINUS, - '\\' => self::T_NAMESPACE_SEPARATOR - ]; - - /** - * @var array - */ - protected $withCase = [ - 'true' => self::T_TRUE, - 'false' => self::T_FALSE, - 'null' => self::T_NULL - ]; - - /** - * Whether the next token starts immediately, or if there were - * non-captured symbols before that - */ - public function nextTokenIsAdjacent() : bool - { - return $this->token === null - || ($this->lookahead !== null - && ($this->lookahead['position'] - $this->token['position']) === strlen($this->token['value'])); - } - - /** - * {@inheritdoc} - */ - protected function getCatchablePatterns() - { - return [ - '[a-z_\\\][a-z0-9_\:\\\]*[a-z_][a-z0-9_]*', - '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', - '"(?:""|[^"])*+"', - ]; - } - - /** - * {@inheritdoc} - */ - protected function getNonCatchablePatterns() - { - return ['\s+', '\*+', '(.)']; - } - - /** - * {@inheritdoc} - */ - protected function getType(&$value) - { - $type = self::T_NONE; - - if ($value[0] === '"') { - $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); - - return self::T_STRING; - } - - if (isset($this->noCase[$value])) { - return $this->noCase[$value]; - } - - if ($value[0] === '_' || $value[0] === '\\' || ctype_alpha($value[0])) { - return self::T_IDENTIFIER; - } - - $lowerValue = strtolower($value); - - if (isset($this->withCase[$lowerValue])) { - return $this->withCase[$lowerValue]; - } - - // Checking numeric value - if (is_numeric($value)) { - return (strpos($value, '.') !== false || stripos($value, 'e') !== false) - ? self::T_FLOAT : self::T_INTEGER; - } - - return $type; - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php deleted file mode 100644 index 741149a..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php +++ /dev/null @@ -1,1221 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use Doctrine\Common\Annotations\Annotation\Attribute; -use ReflectionClass; -use Doctrine\Common\Annotations\Annotation\Enum; -use Doctrine\Common\Annotations\Annotation\Target; -use Doctrine\Common\Annotations\Annotation\Attributes; - -/** - * A parser for docblock annotations. - * - * It is strongly discouraged to change the default annotation parsing process. - * - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Johannes M. Schmitt - * @author Fabio B. Silva - */ -final class DocParser -{ - /** - * An array of all valid tokens for a class name. - * - * @var array - */ - private static $classIdentifiers = [ - DocLexer::T_IDENTIFIER, - DocLexer::T_TRUE, - DocLexer::T_FALSE, - DocLexer::T_NULL - ]; - - /** - * The lexer. - * - * @var \Doctrine\Common\Annotations\DocLexer - */ - private $lexer; - - /** - * Current target context. - * - * @var integer - */ - private $target; - - /** - * Doc parser used to collect annotation target. - * - * @var \Doctrine\Common\Annotations\DocParser - */ - private static $metadataParser; - - /** - * Flag to control if the current annotation is nested or not. - * - * @var boolean - */ - private $isNestedAnnotation = false; - - /** - * Hashmap containing all use-statements that are to be used when parsing - * the given doc block. - * - * @var array - */ - private $imports = []; - - /** - * This hashmap is used internally to cache results of class_exists() - * look-ups. - * - * @var array - */ - private $classExists = []; - - /** - * Whether annotations that have not been imported should be ignored. - * - * @var boolean - */ - private $ignoreNotImportedAnnotations = false; - - /** - * An array of default namespaces if operating in simple mode. - * - * @var string[] - */ - private $namespaces = []; - - /** - * A list with annotations that are not causing exceptions when not resolved to an annotation class. - * - * The names must be the raw names as used in the class, not the fully qualified - * class names. - * - * @var bool[] indexed by annotation name - */ - private $ignoredAnnotationNames = []; - - /** - * A list with annotations in namespaced format - * that are not causing exceptions when not resolved to an annotation class. - * - * @var bool[] indexed by namespace name - */ - private $ignoredAnnotationNamespaces = []; - - /** - * @var string - */ - private $context = ''; - - /** - * Hash-map for caching annotation metadata. - * - * @var array - */ - private static $annotationMetadata = [ - 'Doctrine\Common\Annotations\Annotation\Target' => [ - 'is_annotation' => true, - 'has_constructor' => true, - 'properties' => [], - 'targets_literal' => 'ANNOTATION_CLASS', - 'targets' => Target::TARGET_CLASS, - 'default_property' => 'value', - 'attribute_types' => [ - 'value' => [ - 'required' => false, - 'type' =>'array', - 'array_type'=>'string', - 'value' =>'array' - ] - ], - ], - 'Doctrine\Common\Annotations\Annotation\Attribute' => [ - 'is_annotation' => true, - 'has_constructor' => false, - 'targets_literal' => 'ANNOTATION_ANNOTATION', - 'targets' => Target::TARGET_ANNOTATION, - 'default_property' => 'name', - 'properties' => [ - 'name' => 'name', - 'type' => 'type', - 'required' => 'required' - ], - 'attribute_types' => [ - 'value' => [ - 'required' => true, - 'type' =>'string', - 'value' =>'string' - ], - 'type' => [ - 'required' =>true, - 'type' =>'string', - 'value' =>'string' - ], - 'required' => [ - 'required' =>false, - 'type' =>'boolean', - 'value' =>'boolean' - ] - ], - ], - 'Doctrine\Common\Annotations\Annotation\Attributes' => [ - 'is_annotation' => true, - 'has_constructor' => false, - 'targets_literal' => 'ANNOTATION_CLASS', - 'targets' => Target::TARGET_CLASS, - 'default_property' => 'value', - 'properties' => [ - 'value' => 'value' - ], - 'attribute_types' => [ - 'value' => [ - 'type' =>'array', - 'required' =>true, - 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', - 'value' =>'array' - ] - ], - ], - 'Doctrine\Common\Annotations\Annotation\Enum' => [ - 'is_annotation' => true, - 'has_constructor' => true, - 'targets_literal' => 'ANNOTATION_PROPERTY', - 'targets' => Target::TARGET_PROPERTY, - 'default_property' => 'value', - 'properties' => [ - 'value' => 'value' - ], - 'attribute_types' => [ - 'value' => [ - 'type' => 'array', - 'required' => true, - ], - 'literal' => [ - 'type' => 'array', - 'required' => false, - ], - ], - ], - ]; - - /** - * Hash-map for handle types declaration. - * - * @var array - */ - private static $typeMap = [ - 'float' => 'double', - 'bool' => 'boolean', - // allow uppercase Boolean in honor of George Boole - 'Boolean' => 'boolean', - 'int' => 'integer', - ]; - - /** - * Constructs a new DocParser. - */ - public function __construct() - { - $this->lexer = new DocLexer; - } - - /** - * Sets the annotation names that are ignored during the parsing process. - * - * The names are supposed to be the raw names as used in the class, not the - * fully qualified class names. - * - * @param bool[] $names indexed by annotation name - * - * @return void - */ - public function setIgnoredAnnotationNames(array $names) - { - $this->ignoredAnnotationNames = $names; - } - - /** - * Sets the annotation namespaces that are ignored during the parsing process. - * - * @param bool[] $ignoredAnnotationNamespaces indexed by annotation namespace name - * - * @return void - */ - public function setIgnoredAnnotationNamespaces($ignoredAnnotationNamespaces) - { - $this->ignoredAnnotationNamespaces = $ignoredAnnotationNamespaces; - } - - /** - * Sets ignore on not-imported annotations. - * - * @param boolean $bool - * - * @return void - */ - public function setIgnoreNotImportedAnnotations($bool) - { - $this->ignoreNotImportedAnnotations = (boolean) $bool; - } - - /** - * Sets the default namespaces. - * - * @param string $namespace - * - * @return void - * - * @throws \RuntimeException - */ - public function addNamespace($namespace) - { - if ($this->imports) { - throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); - } - - $this->namespaces[] = $namespace; - } - - /** - * Sets the imports. - * - * @param array $imports - * - * @return void - * - * @throws \RuntimeException - */ - public function setImports(array $imports) - { - if ($this->namespaces) { - throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); - } - - $this->imports = $imports; - } - - /** - * Sets current target context as bitmask. - * - * @param integer $target - * - * @return void - */ - public function setTarget($target) - { - $this->target = $target; - } - - /** - * Parses the given docblock string for annotations. - * - * @param string $input The docblock string to parse. - * @param string $context The parsing context. - * - * @return array Array of annotations. If no annotations are found, an empty array is returned. - */ - public function parse($input, $context = '') - { - $pos = $this->findInitialTokenPosition($input); - if ($pos === null) { - return []; - } - - $this->context = $context; - - $this->lexer->setInput(trim(substr($input, $pos), '* /')); - $this->lexer->moveNext(); - - return $this->Annotations(); - } - - /** - * Finds the first valid annotation - * - * @param string $input The docblock string to parse - * - * @return int|null - */ - private function findInitialTokenPosition($input) - { - $pos = 0; - - // search for first valid annotation - while (($pos = strpos($input, '@', $pos)) !== false) { - $preceding = substr($input, $pos - 1, 1); - - // if the @ is preceded by a space, a tab or * it is valid - if ($pos === 0 || $preceding === ' ' || $preceding === '*' || $preceding === "\t") { - return $pos; - } - - $pos++; - } - - return null; - } - - /** - * Attempts to match the given token with the current lookahead token. - * If they match, updates the lookahead token; otherwise raises a syntax error. - * - * @param integer $token Type of token. - * - * @return boolean True if tokens match; false otherwise. - */ - private function match($token) - { - if ( ! $this->lexer->isNextToken($token) ) { - $this->syntaxError($this->lexer->getLiteral($token)); - } - - return $this->lexer->moveNext(); - } - - /** - * Attempts to match the current lookahead token with any of the given tokens. - * - * If any of them matches, this method updates the lookahead token; otherwise - * a syntax error is raised. - * - * @param array $tokens - * - * @return boolean - */ - private function matchAny(array $tokens) - { - if ( ! $this->lexer->isNextTokenAny($tokens)) { - $this->syntaxError(implode(' or ', array_map([$this->lexer, 'getLiteral'], $tokens))); - } - - return $this->lexer->moveNext(); - } - - /** - * Generates a new syntax error. - * - * @param string $expected Expected string. - * @param array|null $token Optional token. - * - * @return void - * - * @throws AnnotationException - */ - private function syntaxError($expected, $token = null) - { - if ($token === null) { - $token = $this->lexer->lookahead; - } - - $message = sprintf('Expected %s, got ', $expected); - $message .= ($this->lexer->lookahead === null) - ? 'end of string' - : sprintf("'%s' at position %s", $token['value'], $token['position']); - - if (strlen($this->context)) { - $message .= ' in ' . $this->context; - } - - $message .= '.'; - - throw AnnotationException::syntaxError($message); - } - - /** - * Attempts to check if a class exists or not. This never goes through the PHP autoloading mechanism - * but uses the {@link AnnotationRegistry} to load classes. - * - * @param string $fqcn - * - * @return boolean - */ - private function classExists($fqcn) - { - if (isset($this->classExists[$fqcn])) { - return $this->classExists[$fqcn]; - } - - // first check if the class already exists, maybe loaded through another AnnotationReader - if (class_exists($fqcn, false)) { - return $this->classExists[$fqcn] = true; - } - - // final check, does this class exist? - return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); - } - - /** - * Collects parsing metadata for a given annotation class - * - * @param string $name The annotation name - * - * @return void - */ - private function collectAnnotationMetadata($name) - { - if (self::$metadataParser === null) { - self::$metadataParser = new self(); - - self::$metadataParser->setIgnoreNotImportedAnnotations(true); - self::$metadataParser->setIgnoredAnnotationNames($this->ignoredAnnotationNames); - self::$metadataParser->setImports([ - 'enum' => 'Doctrine\Common\Annotations\Annotation\Enum', - 'target' => 'Doctrine\Common\Annotations\Annotation\Target', - 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', - 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' - ]); - - // Make sure that annotations from metadata are loaded - class_exists(Enum::class); - class_exists(Target::class); - class_exists(Attribute::class); - class_exists(Attributes::class); - } - - $class = new \ReflectionClass($name); - $docComment = $class->getDocComment(); - - // Sets default values for annotation metadata - $metadata = [ - 'default_property' => null, - 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, - 'properties' => [], - 'property_types' => [], - 'attribute_types' => [], - 'targets_literal' => null, - 'targets' => Target::TARGET_ALL, - 'is_annotation' => false !== strpos($docComment, '@Annotation'), - ]; - - // verify that the class is really meant to be an annotation - if ($metadata['is_annotation']) { - self::$metadataParser->setTarget(Target::TARGET_CLASS); - - foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { - if ($annotation instanceof Target) { - $metadata['targets'] = $annotation->targets; - $metadata['targets_literal'] = $annotation->literal; - - continue; - } - - if ($annotation instanceof Attributes) { - foreach ($annotation->value as $attribute) { - $this->collectAttributeTypeMetadata($metadata, $attribute); - } - } - } - - // if not has a constructor will inject values into public properties - if (false === $metadata['has_constructor']) { - // collect all public properties - foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { - $metadata['properties'][$property->name] = $property->name; - - if (false === ($propertyComment = $property->getDocComment())) { - continue; - } - - $attribute = new Attribute(); - - $attribute->required = (false !== strpos($propertyComment, '@Required')); - $attribute->name = $property->name; - $attribute->type = (false !== strpos($propertyComment, '@var') && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) - ? $matches[1] - : 'mixed'; - - $this->collectAttributeTypeMetadata($metadata, $attribute); - - // checks if the property has @Enum - if (false !== strpos($propertyComment, '@Enum')) { - $context = 'property ' . $class->name . "::\$" . $property->name; - - self::$metadataParser->setTarget(Target::TARGET_PROPERTY); - - foreach (self::$metadataParser->parse($propertyComment, $context) as $annotation) { - if ( ! $annotation instanceof Enum) { - continue; - } - - $metadata['enum'][$property->name]['value'] = $annotation->value; - $metadata['enum'][$property->name]['literal'] = ( ! empty($annotation->literal)) - ? $annotation->literal - : $annotation->value; - } - } - } - - // choose the first property as default property - $metadata['default_property'] = reset($metadata['properties']); - } - } - - self::$annotationMetadata[$name] = $metadata; - } - - /** - * Collects parsing metadata for a given attribute. - * - * @param array $metadata - * @param Attribute $attribute - * - * @return void - */ - private function collectAttributeTypeMetadata(&$metadata, Attribute $attribute) - { - // handle internal type declaration - $type = self::$typeMap[$attribute->type] ?? $attribute->type; - - // handle the case if the property type is mixed - if ('mixed' === $type) { - return; - } - - // Evaluate type - switch (true) { - // Checks if the property has array - case (false !== $pos = strpos($type, '<')): - $arrayType = substr($type, $pos + 1, -1); - $type = 'array'; - - if (isset(self::$typeMap[$arrayType])) { - $arrayType = self::$typeMap[$arrayType]; - } - - $metadata['attribute_types'][$attribute->name]['array_type'] = $arrayType; - break; - - // Checks if the property has type[] - case (false !== $pos = strrpos($type, '[')): - $arrayType = substr($type, 0, $pos); - $type = 'array'; - - if (isset(self::$typeMap[$arrayType])) { - $arrayType = self::$typeMap[$arrayType]; - } - - $metadata['attribute_types'][$attribute->name]['array_type'] = $arrayType; - break; - } - - $metadata['attribute_types'][$attribute->name]['type'] = $type; - $metadata['attribute_types'][$attribute->name]['value'] = $attribute->type; - $metadata['attribute_types'][$attribute->name]['required'] = $attribute->required; - } - - /** - * Annotations ::= Annotation {[ "*" ]* [Annotation]}* - * - * @return array - */ - private function Annotations() - { - $annotations = []; - - while (null !== $this->lexer->lookahead) { - if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { - $this->lexer->moveNext(); - continue; - } - - // make sure the @ is preceded by non-catchable pattern - if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { - $this->lexer->moveNext(); - continue; - } - - // make sure the @ is followed by either a namespace separator, or - // an identifier token - if ((null === $peek = $this->lexer->glimpse()) - || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) - || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { - $this->lexer->moveNext(); - continue; - } - - $this->isNestedAnnotation = false; - if (false !== $annot = $this->Annotation()) { - $annotations[] = $annot; - } - } - - return $annotations; - } - - /** - * Annotation ::= "@" AnnotationName MethodCall - * AnnotationName ::= QualifiedName | SimpleName - * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName - * NameSpacePart ::= identifier | null | false | true - * SimpleName ::= identifier | null | false | true - * - * @return mixed False if it is not a valid annotation. - * - * @throws AnnotationException - */ - private function Annotation() - { - $this->match(DocLexer::T_AT); - - // check if we have an annotation - $name = $this->Identifier(); - - if ($this->lexer->isNextToken(DocLexer::T_MINUS) - && $this->lexer->nextTokenIsAdjacent() - ) { - // Annotations with dashes, such as "@foo-" or "@foo-bar", are to be discarded - return false; - } - - // only process names which are not fully qualified, yet - // fully qualified names must start with a \ - $originalName = $name; - - if ('\\' !== $name[0]) { - $pos = strpos($name, '\\'); - $alias = (false === $pos)? $name : substr($name, 0, $pos); - $found = false; - $loweredAlias = strtolower($alias); - - if ($this->namespaces) { - foreach ($this->namespaces as $namespace) { - if ($this->classExists($namespace.'\\'.$name)) { - $name = $namespace.'\\'.$name; - $found = true; - break; - } - } - } elseif (isset($this->imports[$loweredAlias])) { - $namespace = ltrim($this->imports[$loweredAlias], '\\'); - $name = (false !== $pos) - ? $namespace . substr($name, $pos) - : $namespace; - $found = $this->classExists($name); - } elseif ( ! isset($this->ignoredAnnotationNames[$name]) - && isset($this->imports['__NAMESPACE__']) - && $this->classExists($this->imports['__NAMESPACE__'] . '\\' . $name) - ) { - $name = $this->imports['__NAMESPACE__'].'\\'.$name; - $found = true; - } elseif (! isset($this->ignoredAnnotationNames[$name]) && $this->classExists($name)) { - $found = true; - } - - if ( ! $found) { - if ($this->isIgnoredAnnotation($name)) { - return false; - } - - throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); - } - } - - $name = ltrim($name,'\\'); - - if ( ! $this->classExists($name)) { - throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); - } - - // at this point, $name contains the fully qualified class name of the - // annotation, and it is also guaranteed that this class exists, and - // that it is loaded - - - // collects the metadata annotation only if there is not yet - if ( ! isset(self::$annotationMetadata[$name])) { - $this->collectAnnotationMetadata($name); - } - - // verify that the class is really meant to be an annotation and not just any ordinary class - if (self::$annotationMetadata[$name]['is_annotation'] === false) { - if ($this->isIgnoredAnnotation($originalName) || $this->isIgnoredAnnotation($name)) { - return false; - } - - throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); - } - - //if target is nested annotation - $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; - - // Next will be nested - $this->isNestedAnnotation = true; - - //if annotation does not support current target - if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { - throw AnnotationException::semanticalError( - sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', - $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) - ); - } - - $values = $this->MethodCall(); - - if (isset(self::$annotationMetadata[$name]['enum'])) { - // checks all declared attributes - foreach (self::$annotationMetadata[$name]['enum'] as $property => $enum) { - // checks if the attribute is a valid enumerator - if (isset($values[$property]) && ! in_array($values[$property], $enum['value'])) { - throw AnnotationException::enumeratorError($property, $name, $this->context, $enum['literal'], $values[$property]); - } - } - } - - // checks all declared attributes - foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { - if ($property === self::$annotationMetadata[$name]['default_property'] - && !isset($values[$property]) && isset($values['value'])) { - $property = 'value'; - } - - // handle a not given attribute or null value - if (!isset($values[$property])) { - if ($type['required']) { - throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); - } - - continue; - } - - if ($type['type'] === 'array') { - // handle the case of a single value - if ( ! is_array($values[$property])) { - $values[$property] = [$values[$property]]; - } - - // checks if the attribute has array type declaration, such as "array" - if (isset($type['array_type'])) { - foreach ($values[$property] as $item) { - if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { - throw AnnotationException::attributeTypeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); - } - } - } - } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { - throw AnnotationException::attributeTypeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); - } - } - - // check if the annotation expects values via the constructor, - // or directly injected into public properties - if (self::$annotationMetadata[$name]['has_constructor'] === true) { - return new $name($values); - } - - $instance = new $name(); - - foreach ($values as $property => $value) { - if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { - if ('value' !== $property) { - throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); - } - - // handle the case if the property has no annotations - if ( ! $property = self::$annotationMetadata[$name]['default_property']) { - throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); - } - } - - $instance->{$property} = $value; - } - - return $instance; - } - - /** - * MethodCall ::= ["(" [Values] ")"] - * - * @return array - */ - private function MethodCall() - { - $values = []; - - if ( ! $this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { - return $values; - } - - $this->match(DocLexer::T_OPEN_PARENTHESIS); - - if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { - $values = $this->Values(); - } - - $this->match(DocLexer::T_CLOSE_PARENTHESIS); - - return $values; - } - - /** - * Values ::= Array | Value {"," Value}* [","] - * - * @return array - */ - private function Values() - { - $values = [$this->Value()]; - - while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { - $this->match(DocLexer::T_COMMA); - - if ($this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { - break; - } - - $token = $this->lexer->lookahead; - $value = $this->Value(); - - if ( ! is_object($value) && ! is_array($value)) { - $this->syntaxError('Value', $token); - } - - $values[] = $value; - } - - foreach ($values as $k => $value) { - if (is_object($value) && $value instanceof \stdClass) { - $values[$value->name] = $value->value; - } else if ( ! isset($values['value'])){ - $values['value'] = $value; - } else { - if ( ! is_array($values['value'])) { - $values['value'] = [$values['value']]; - } - - $values['value'][] = $value; - } - - unset($values[$k]); - } - - return $values; - } - - /** - * Constant ::= integer | string | float | boolean - * - * @return mixed - * - * @throws AnnotationException - */ - private function Constant() - { - $identifier = $this->Identifier(); - - if ( ! defined($identifier) && false !== strpos($identifier, '::') && '\\' !== $identifier[0]) { - list($className, $const) = explode('::', $identifier); - - $pos = strpos($className, '\\'); - $alias = (false === $pos) ? $className : substr($className, 0, $pos); - $found = false; - $loweredAlias = strtolower($alias); - - switch (true) { - case !empty ($this->namespaces): - foreach ($this->namespaces as $ns) { - if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) { - $className = $ns.'\\'.$className; - $found = true; - break; - } - } - break; - - case isset($this->imports[$loweredAlias]): - $found = true; - $className = (false !== $pos) - ? $this->imports[$loweredAlias] . substr($className, $pos) - : $this->imports[$loweredAlias]; - break; - - default: - if(isset($this->imports['__NAMESPACE__'])) { - $ns = $this->imports['__NAMESPACE__']; - - if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) { - $className = $ns.'\\'.$className; - $found = true; - } - } - break; - } - - if ($found) { - $identifier = $className . '::' . $const; - } - } - - /** - * Checks if identifier ends with ::class and remove the leading backslash if it exists. - */ - if ($this->identifierEndsWithClassConstant($identifier) && ! $this->identifierStartsWithBackslash($identifier)) { - return substr($identifier, 0, $this->getClassConstantPositionInIdentifier($identifier)); - } - if ($this->identifierEndsWithClassConstant($identifier) && $this->identifierStartsWithBackslash($identifier)) { - return substr($identifier, 1, $this->getClassConstantPositionInIdentifier($identifier) - 1); - } - - if (!defined($identifier)) { - throw AnnotationException::semanticalErrorConstants($identifier, $this->context); - } - - return constant($identifier); - } - - private function identifierStartsWithBackslash(string $identifier) : bool - { - return '\\' === $identifier[0]; - } - - private function identifierEndsWithClassConstant(string $identifier) : bool - { - return $this->getClassConstantPositionInIdentifier($identifier) === strlen($identifier) - strlen('::class'); - } - - /** - * @return int|false - */ - private function getClassConstantPositionInIdentifier(string $identifier) - { - return stripos($identifier, '::class'); - } - - /** - * Identifier ::= string - * - * @return string - */ - private function Identifier() - { - // check if we have an annotation - if ( ! $this->lexer->isNextTokenAny(self::$classIdentifiers)) { - $this->syntaxError('namespace separator or identifier'); - } - - $this->lexer->moveNext(); - - $className = $this->lexer->token['value']; - - while ( - null !== $this->lexer->lookahead && - $this->lexer->lookahead['position'] === ($this->lexer->token['position'] + strlen($this->lexer->token['value'])) && - $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR) - ) { - $this->match(DocLexer::T_NAMESPACE_SEPARATOR); - $this->matchAny(self::$classIdentifiers); - - $className .= '\\' . $this->lexer->token['value']; - } - - return $className; - } - - /** - * Value ::= PlainValue | FieldAssignment - * - * @return mixed - */ - private function Value() - { - $peek = $this->lexer->glimpse(); - - if (DocLexer::T_EQUALS === $peek['type']) { - return $this->FieldAssignment(); - } - - return $this->PlainValue(); - } - - /** - * PlainValue ::= integer | string | float | boolean | Array | Annotation - * - * @return mixed - */ - private function PlainValue() - { - if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { - return $this->Arrayx(); - } - - if ($this->lexer->isNextToken(DocLexer::T_AT)) { - return $this->Annotation(); - } - - if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) { - return $this->Constant(); - } - - switch ($this->lexer->lookahead['type']) { - case DocLexer::T_STRING: - $this->match(DocLexer::T_STRING); - return $this->lexer->token['value']; - - case DocLexer::T_INTEGER: - $this->match(DocLexer::T_INTEGER); - return (int)$this->lexer->token['value']; - - case DocLexer::T_FLOAT: - $this->match(DocLexer::T_FLOAT); - return (float)$this->lexer->token['value']; - - case DocLexer::T_TRUE: - $this->match(DocLexer::T_TRUE); - return true; - - case DocLexer::T_FALSE: - $this->match(DocLexer::T_FALSE); - return false; - - case DocLexer::T_NULL: - $this->match(DocLexer::T_NULL); - return null; - - default: - $this->syntaxError('PlainValue'); - } - } - - /** - * FieldAssignment ::= FieldName "=" PlainValue - * FieldName ::= identifier - * - * @return \stdClass - */ - private function FieldAssignment() - { - $this->match(DocLexer::T_IDENTIFIER); - $fieldName = $this->lexer->token['value']; - - $this->match(DocLexer::T_EQUALS); - - $item = new \stdClass(); - $item->name = $fieldName; - $item->value = $this->PlainValue(); - - return $item; - } - - /** - * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" - * - * @return array - */ - private function Arrayx() - { - $array = $values = []; - - $this->match(DocLexer::T_OPEN_CURLY_BRACES); - - // If the array is empty, stop parsing and return. - if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { - $this->match(DocLexer::T_CLOSE_CURLY_BRACES); - - return $array; - } - - $values[] = $this->ArrayEntry(); - - while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { - $this->match(DocLexer::T_COMMA); - - // optional trailing comma - if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { - break; - } - - $values[] = $this->ArrayEntry(); - } - - $this->match(DocLexer::T_CLOSE_CURLY_BRACES); - - foreach ($values as $value) { - list ($key, $val) = $value; - - if ($key !== null) { - $array[$key] = $val; - } else { - $array[] = $val; - } - } - - return $array; - } - - /** - * ArrayEntry ::= Value | KeyValuePair - * KeyValuePair ::= Key ("=" | ":") PlainValue | Constant - * Key ::= string | integer | Constant - * - * @return array - */ - private function ArrayEntry() - { - $peek = $this->lexer->glimpse(); - - if (DocLexer::T_EQUALS === $peek['type'] - || DocLexer::T_COLON === $peek['type']) { - - if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) { - $key = $this->Constant(); - } else { - $this->matchAny([DocLexer::T_INTEGER, DocLexer::T_STRING]); - $key = $this->lexer->token['value']; - } - - $this->matchAny([DocLexer::T_EQUALS, DocLexer::T_COLON]); - - return [$key, $this->PlainValue()]; - } - - return [null, $this->Value()]; - } - - /** - * Checks whether the given $name matches any ignored annotation name or namespace - * - * @param string $name - * - * @return bool - */ - private function isIgnoredAnnotation($name) - { - if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { - return true; - } - - foreach (array_keys($this->ignoredAnnotationNamespaces) as $ignoredAnnotationNamespace) { - $ignoredAnnotationNamespace = rtrim($ignoredAnnotationNamespace, '\\') . '\\'; - - if (0 === stripos(rtrim($name, '\\') . '\\', $ignoredAnnotationNamespace)) { - return true; - } - } - - return false; - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php deleted file mode 100644 index 40141af..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php +++ /dev/null @@ -1,290 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * File cache reader for annotations. - * - * @author Johannes M. Schmitt - * @author Benjamin Eberlei - * - * @deprecated the FileCacheReader is deprecated and will be removed - * in version 2.0.0 of doctrine/annotations. Please use the - * {@see \Doctrine\Common\Annotations\CachedReader} instead. - */ -class FileCacheReader implements Reader -{ - /** - * @var Reader - */ - private $reader; - - /** - * @var string - */ - private $dir; - - /** - * @var bool - */ - private $debug; - - /** - * @var array - */ - private $loadedAnnotations = []; - - /** - * @var array - */ - private $classNameHashes = []; - - /** - * @var int - */ - private $umask; - - /** - * Constructor. - * - * @param Reader $reader - * @param string $cacheDir - * @param boolean $debug - * - * @throws \InvalidArgumentException - */ - public function __construct(Reader $reader, $cacheDir, $debug = false, $umask = 0002) - { - if ( ! is_int($umask)) { - throw new \InvalidArgumentException(sprintf( - 'The parameter umask must be an integer, was: %s', - gettype($umask) - )); - } - - $this->reader = $reader; - $this->umask = $umask; - - if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777 & (~$this->umask), true)) { - throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); - } - - $this->dir = rtrim($cacheDir, '\\/'); - $this->debug = $debug; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotations(\ReflectionClass $class) - { - if ( ! isset($this->classNameHashes[$class->name])) { - $this->classNameHashes[$class->name] = sha1($class->name); - } - $key = $this->classNameHashes[$class->name]; - - if (isset($this->loadedAnnotations[$key])) { - return $this->loadedAnnotations[$key]; - } - - $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; - if (!is_file($path)) { - $annot = $this->reader->getClassAnnotations($class); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - if ($this->debug - && (false !== $filename = $class->getFileName()) - && filemtime($path) < filemtime($filename)) { - @unlink($path); - - $annot = $this->reader->getClassAnnotations($class); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - return $this->loadedAnnotations[$key] = include $path; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotations(\ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - if ( ! isset($this->classNameHashes[$class->name])) { - $this->classNameHashes[$class->name] = sha1($class->name); - } - $key = $this->classNameHashes[$class->name].'$'.$property->getName(); - - if (isset($this->loadedAnnotations[$key])) { - return $this->loadedAnnotations[$key]; - } - - $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; - if (!is_file($path)) { - $annot = $this->reader->getPropertyAnnotations($property); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - if ($this->debug - && (false !== $filename = $class->getFilename()) - && filemtime($path) < filemtime($filename)) { - @unlink($path); - - $annot = $this->reader->getPropertyAnnotations($property); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - return $this->loadedAnnotations[$key] = include $path; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotations(\ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - if ( ! isset($this->classNameHashes[$class->name])) { - $this->classNameHashes[$class->name] = sha1($class->name); - } - $key = $this->classNameHashes[$class->name].'#'.$method->getName(); - - if (isset($this->loadedAnnotations[$key])) { - return $this->loadedAnnotations[$key]; - } - - $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; - if (!is_file($path)) { - $annot = $this->reader->getMethodAnnotations($method); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - if ($this->debug - && (false !== $filename = $class->getFilename()) - && filemtime($path) < filemtime($filename)) { - @unlink($path); - - $annot = $this->reader->getMethodAnnotations($method); - $this->saveCacheFile($path, $annot); - return $this->loadedAnnotations[$key] = $annot; - } - - return $this->loadedAnnotations[$key] = include $path; - } - - /** - * Saves the cache file. - * - * @param string $path - * @param mixed $data - * - * @return void - */ - private function saveCacheFile($path, $data) - { - if (!is_writable($this->dir)) { - throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $this->dir)); - } - - $tempfile = tempnam($this->dir, uniqid('', true)); - - if (false === $tempfile) { - throw new \RuntimeException(sprintf('Unable to create tempfile in directory: %s', $this->dir)); - } - - @chmod($tempfile, 0666 & (~$this->umask)); - - $written = file_put_contents($tempfile, 'umask)); - - if (false === rename($tempfile, $path)) { - @unlink($tempfile); - throw new \RuntimeException(sprintf('Unable to rename %s to %s', $tempfile, $path)); - } - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotation(\ReflectionClass $class, $annotationName) - { - $annotations = $this->getClassAnnotations($class); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) - { - $annotations = $this->getMethodAnnotations($method); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) - { - $annotations = $this->getPropertyAnnotations($property); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * Clears loaded annotations. - * - * @return void - */ - public function clearLoadedAnnotations() - { - $this->loadedAnnotations = []; - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php deleted file mode 100644 index 4e8c3c8..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php +++ /dev/null @@ -1,119 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Allows the reader to be used in-place of Doctrine's reader. - * - * @author Johannes M. Schmitt - */ -class IndexedReader implements Reader -{ - /** - * @var Reader - */ - private $delegate; - - /** - * Constructor. - * - * @param Reader $reader - */ - public function __construct(Reader $reader) - { - $this->delegate = $reader; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotations(\ReflectionClass $class) - { - $annotations = []; - foreach ($this->delegate->getClassAnnotations($class) as $annot) { - $annotations[get_class($annot)] = $annot; - } - - return $annotations; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotation(\ReflectionClass $class, $annotation) - { - return $this->delegate->getClassAnnotation($class, $annotation); - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotations(\ReflectionMethod $method) - { - $annotations = []; - foreach ($this->delegate->getMethodAnnotations($method) as $annot) { - $annotations[get_class($annot)] = $annot; - } - - return $annotations; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotation(\ReflectionMethod $method, $annotation) - { - return $this->delegate->getMethodAnnotation($method, $annotation); - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotations(\ReflectionProperty $property) - { - $annotations = []; - foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { - $annotations[get_class($annot)] = $annot; - } - - return $annotations; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) - { - return $this->delegate->getPropertyAnnotation($property, $annotation); - } - - /** - * Proxies all methods to the delegate. - * - * @param string $method - * @param array $args - * - * @return mixed - */ - public function __call($method, $args) - { - return call_user_func_array([$this->delegate, $method], $args); - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php deleted file mode 100644 index ec87181..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php +++ /dev/null @@ -1,91 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -use SplFileObject; - -/** - * Parses a file for namespaces/use/class declarations. - * - * @author Fabien Potencier - * @author Christian Kaps - */ -final class PhpParser -{ - /** - * Parses a class. - * - * @param \ReflectionClass $class A ReflectionClass object. - * - * @return array A list with use statements in the form (Alias => FQN). - */ - public function parseClass(\ReflectionClass $class) - { - if (method_exists($class, 'getUseStatements')) { - return $class->getUseStatements(); - } - - if (false === $filename = $class->getFileName()) { - return []; - } - - $content = $this->getFileContent($filename, $class->getStartLine()); - - if (null === $content) { - return []; - } - - $namespace = preg_quote($class->getNamespaceName()); - $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); - $tokenizer = new TokenParser('parseUseStatements($class->getNamespaceName()); - - return $statements; - } - - /** - * Gets the content of the file right up to the given line number. - * - * @param string $filename The name of the file to load. - * @param integer $lineNumber The number of lines to read from file. - * - * @return string|null The content of the file or null if the file does not exist. - */ - private function getFileContent($filename, $lineNumber) - { - if ( ! is_file($filename)) { - return null; - } - - $content = ''; - $lineCnt = 0; - $file = new SplFileObject($filename); - while (!$file->eof()) { - if ($lineCnt++ == $lineNumber) { - break; - } - - $content .= $file->fgets(); - } - - return $content; - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php deleted file mode 100644 index 4774f87..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php +++ /dev/null @@ -1,89 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Interface for annotation readers. - * - * @author Johannes M. Schmitt - */ -interface Reader -{ - /** - * Gets the annotations applied to a class. - * - * @param \ReflectionClass $class The ReflectionClass of the class from which - * the class annotations should be read. - * - * @return array An array of Annotations. - */ - function getClassAnnotations(\ReflectionClass $class); - - /** - * Gets a class annotation. - * - * @param \ReflectionClass $class The ReflectionClass of the class from which - * the class annotations should be read. - * @param string $annotationName The name of the annotation. - * - * @return object|null The Annotation or NULL, if the requested annotation does not exist. - */ - function getClassAnnotation(\ReflectionClass $class, $annotationName); - - /** - * Gets the annotations applied to a method. - * - * @param \ReflectionMethod $method The ReflectionMethod of the method from which - * the annotations should be read. - * - * @return array An array of Annotations. - */ - function getMethodAnnotations(\ReflectionMethod $method); - - /** - * Gets a method annotation. - * - * @param \ReflectionMethod $method The ReflectionMethod to read the annotations from. - * @param string $annotationName The name of the annotation. - * - * @return object|null The Annotation or NULL, if the requested annotation does not exist. - */ - function getMethodAnnotation(\ReflectionMethod $method, $annotationName); - - /** - * Gets the annotations applied to a property. - * - * @param \ReflectionProperty $property The ReflectionProperty of the property - * from which the annotations should be read. - * - * @return array An array of Annotations. - */ - function getPropertyAnnotations(\ReflectionProperty $property); - - /** - * Gets a property annotation. - * - * @param \ReflectionProperty $property The ReflectionProperty to read the annotations from. - * @param string $annotationName The name of the annotation. - * - * @return object|null The Annotation or NULL, if the requested annotation does not exist. - */ - function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php deleted file mode 100644 index d4757ee..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php +++ /dev/null @@ -1,127 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Simple Annotation Reader. - * - * This annotation reader is intended to be used in projects where you have - * full-control over all annotations that are available. - * - * @since 2.2 - * @author Johannes M. Schmitt - * @author Fabio B. Silva - */ -class SimpleAnnotationReader implements Reader -{ - /** - * @var DocParser - */ - private $parser; - - /** - * Constructor. - * - * Initializes a new SimpleAnnotationReader. - */ - public function __construct() - { - $this->parser = new DocParser(); - $this->parser->setIgnoreNotImportedAnnotations(true); - } - - /** - * Adds a namespace in which we will look for annotations. - * - * @param string $namespace - * - * @return void - */ - public function addNamespace($namespace) - { - $this->parser->addNamespace($namespace); - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotations(\ReflectionClass $class) - { - return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotations(\ReflectionMethod $method) - { - return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotations(\ReflectionProperty $property) - { - return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotation(\ReflectionClass $class, $annotationName) - { - foreach ($this->getClassAnnotations($class) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) - { - foreach ($this->getMethodAnnotations($method) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) - { - foreach ($this->getPropertyAnnotations($property) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } -} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php deleted file mode 100644 index 03d9320..0000000 --- a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php +++ /dev/null @@ -1,194 +0,0 @@ -. - */ - -namespace Doctrine\Common\Annotations; - -/** - * Parses a file for namespaces/use/class declarations. - * - * @author Fabien Potencier - * @author Christian Kaps - */ -class TokenParser -{ - /** - * The token list. - * - * @var array - */ - private $tokens; - - /** - * The number of tokens. - * - * @var int - */ - private $numTokens; - - /** - * The current array pointer. - * - * @var int - */ - private $pointer = 0; - - /** - * @param string $contents - */ - public function __construct($contents) - { - $this->tokens = token_get_all($contents); - - // The PHP parser sets internal compiler globals for certain things. Annoyingly, the last docblock comment it - // saw gets stored in doc_comment. When it comes to compile the next thing to be include()d this stored - // doc_comment becomes owned by the first thing the compiler sees in the file that it considers might have a - // docblock. If the first thing in the file is a class without a doc block this would cause calls to - // getDocBlock() on said class to return our long lost doc_comment. Argh. - // To workaround, cause the parser to parse an empty docblock. Sure getDocBlock() will return this, but at least - // it's harmless to us. - token_get_all("numTokens = count($this->tokens); - } - - /** - * Gets the next non whitespace and non comment token. - * - * @param boolean $docCommentIsComment If TRUE then a doc comment is considered a comment and skipped. - * If FALSE then only whitespace and normal comments are skipped. - * - * @return array|null The token if exists, null otherwise. - */ - public function next($docCommentIsComment = TRUE) - { - for ($i = $this->pointer; $i < $this->numTokens; $i++) { - $this->pointer++; - if ($this->tokens[$i][0] === T_WHITESPACE || - $this->tokens[$i][0] === T_COMMENT || - ($docCommentIsComment && $this->tokens[$i][0] === T_DOC_COMMENT)) { - - continue; - } - - return $this->tokens[$i]; - } - - return null; - } - - /** - * Parses a single use statement. - * - * @return array A list with all found class names for a use statement. - */ - public function parseUseStatement() - { - - $groupRoot = ''; - $class = ''; - $alias = ''; - $statements = []; - $explicitAlias = false; - while (($token = $this->next())) { - $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; - if (!$explicitAlias && $isNameToken) { - $class .= $token[1]; - $alias = $token[1]; - } else if ($explicitAlias && $isNameToken) { - $alias .= $token[1]; - } else if ($token[0] === T_AS) { - $explicitAlias = true; - $alias = ''; - } else if ($token === ',') { - $statements[strtolower($alias)] = $groupRoot . $class; - $class = ''; - $alias = ''; - $explicitAlias = false; - } else if ($token === ';') { - $statements[strtolower($alias)] = $groupRoot . $class; - break; - } else if ($token === '{' ) { - $groupRoot = $class; - $class = ''; - } else if ($token === '}' ) { - continue; - } else { - break; - } - } - - return $statements; - } - - /** - * Gets all use statements. - * - * @param string $namespaceName The namespace name of the reflected class. - * - * @return array A list with all found use statements. - */ - public function parseUseStatements($namespaceName) - { - $statements = []; - while (($token = $this->next())) { - if ($token[0] === T_USE) { - $statements = array_merge($statements, $this->parseUseStatement()); - continue; - } - if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { - continue; - } - - // Get fresh array for new namespace. This is to prevent the parser to collect the use statements - // for a previous namespace with the same name. This is the case if a namespace is defined twice - // or if a namespace with the same name is commented out. - $statements = []; - } - - return $statements; - } - - /** - * Gets the namespace. - * - * @return string The found namespace. - */ - public function parseNamespace() - { - $name = ''; - while (($token = $this->next()) && ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR)) { - $name .= $token[1]; - } - - return $name; - } - - /** - * Gets the class name. - * - * @return string The found class name. - */ - public function parseClass() - { - // Namespaces and class names are tokenized the same: T_STRINGs - // separated by T_NS_SEPARATOR so we can use one function to provide - // both. - return $this->parseNamespace(); - } -} diff --git a/vendor/doctrine/annotations/phpbench.json.dist b/vendor/doctrine/annotations/phpbench.json.dist deleted file mode 100644 index 35edde9..0000000 --- a/vendor/doctrine/annotations/phpbench.json.dist +++ /dev/null @@ -1,4 +0,0 @@ -{ - "bootstrap": "tests/Doctrine/Performance/Common/bootstrap.php", - "path": "tests/Doctrine/Performance/Common/Annotations" -} diff --git a/vendor/doctrine/annotations/phpstan.neon b/vendor/doctrine/annotations/phpstan.neon deleted file mode 100644 index bac7f83..0000000 --- a/vendor/doctrine/annotations/phpstan.neon +++ /dev/null @@ -1,14 +0,0 @@ -parameters: - autoload_files: - - %currentWorkingDirectory%/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php - excludes_analyse: - - %currentWorkingDirectory%/tests/*/Fixtures/* - - %currentWorkingDirectory%/tests/Doctrine/Tests/Common/Annotations/ReservedKeywordsClasses.php - - %currentWorkingDirectory%/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php - - %currentWorkingDirectory%/tests/Doctrine/Tests/DoctrineTestCase.php - polluteScopeWithLoopInitialAssignments: true - ignoreErrors: - - '#Class Doctrine_Tests_Common_Annotations_Fixtures_ClassNoNamespaceNoComment not found#' - - '#Instantiated class Doctrine_Tests_Common_Annotations_Fixtures_ClassNoNamespaceNoComment not found#' - - '#Property Doctrine\\Tests\\Common\\Annotations\\DummyClassNonAnnotationProblem::\$foo has unknown class#' - - '#Call to an undefined method ReflectionClass::getUseStatements\(\)#' diff --git a/vendor/doctrine/instantiator/.doctrine-project.json b/vendor/doctrine/instantiator/.doctrine-project.json deleted file mode 100644 index 4fe86ee..0000000 --- a/vendor/doctrine/instantiator/.doctrine-project.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "active": true, - "name": "Instantiator", - "slug": "instantiator", - "docsSlug": "doctrine-instantiator", - "codePath": "/src", - "versions": [ - { - "name": "1.1", - "branchName": "master", - "slug": "latest", - "aliases": [ - "current", - "stable" - ], - "maintained": true, - "current": true - }, - { - "name": "1.0", - "branchName": "1.0.x", - "slug": "1.0" - } - ] -} - diff --git a/vendor/doctrine/instantiator/.github/FUNDING.yml b/vendor/doctrine/instantiator/.github/FUNDING.yml deleted file mode 100644 index 9a35064..0000000 --- a/vendor/doctrine/instantiator/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -patreon: phpdoctrine -tidelift: packagist/doctrine%2Finstantiator -custom: https://www.doctrine-project.org/sponsorship.html diff --git a/vendor/doctrine/instantiator/CONTRIBUTING.md b/vendor/doctrine/instantiator/CONTRIBUTING.md deleted file mode 100644 index c1a2c42..0000000 --- a/vendor/doctrine/instantiator/CONTRIBUTING.md +++ /dev/null @@ -1,35 +0,0 @@ -# Contributing - - * Follow the [Doctrine Coding Standard](https://github.com/doctrine/coding-standard) - * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php) - * Any contribution must provide tests for additional introduced conditions - * Any un-confirmed issue needs a failing test case before being accepted - * Pull requests must be sent from a new hotfix/feature branch, not from `master`. - -## Installation - -To install the project and run the tests, you need to clone it first: - -```sh -$ git clone git://github.com/doctrine/instantiator.git -``` - -You will then need to run a composer installation: - -```sh -$ cd Instantiator -$ curl -s https://getcomposer.org/installer | php -$ php composer.phar update -``` - -## Testing - -The PHPUnit version to be used is the one installed as a dev- dependency via composer: - -```sh -$ ./vendor/bin/phpunit -``` - -Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement -won't be merged. - diff --git a/vendor/doctrine/instantiator/LICENSE b/vendor/doctrine/instantiator/LICENSE deleted file mode 100644 index 4d983d1..0000000 --- a/vendor/doctrine/instantiator/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2014 Doctrine Project - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/doctrine/instantiator/README.md b/vendor/doctrine/instantiator/README.md deleted file mode 100644 index eff5a0c..0000000 --- a/vendor/doctrine/instantiator/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Instantiator - -This library provides a way of avoiding usage of constructors when instantiating PHP classes. - -[![Build Status](https://travis-ci.org/doctrine/instantiator.svg?branch=master)](https://travis-ci.org/doctrine/instantiator) -[![Code Coverage](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master) -[![Dependency Status](https://www.versioneye.com/package/php--doctrine--instantiator/badge.svg)](https://www.versioneye.com/package/php--doctrine--instantiator) - -[![Latest Stable Version](https://poser.pugx.org/doctrine/instantiator/v/stable.png)](https://packagist.org/packages/doctrine/instantiator) -[![Latest Unstable Version](https://poser.pugx.org/doctrine/instantiator/v/unstable.png)](https://packagist.org/packages/doctrine/instantiator) - -## Installation - -The suggested installation method is via [composer](https://getcomposer.org/): - -```sh -php composer.phar require "doctrine/instantiator:~1.0.3" -``` - -## Usage - -The instantiator is able to create new instances of any class without using the constructor or any API of the class -itself: - -```php -$instantiator = new \Doctrine\Instantiator\Instantiator(); - -$instance = $instantiator->instantiate(\My\ClassName\Here::class); -``` - -## Contributing - -Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out! - -## Credits - -This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which -has been donated to the doctrine organization, and which is now deprecated in favour of this package. diff --git a/vendor/doctrine/instantiator/composer.json b/vendor/doctrine/instantiator/composer.json deleted file mode 100644 index a84baa7..0000000 --- a/vendor/doctrine/instantiator/composer.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "doctrine/instantiator", - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "type": "library", - "license": "MIT", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "instantiate", - "constructor" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "config": { - "platform": { - "php": "7.1.27" - } - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "ext-phar": "*", - "ext-pdo": "*", - "doctrine/coding-standard": "^6.0", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "autoload-dev": { - "psr-0": { - "DoctrineTest\\InstantiatorPerformance\\": "tests", - "DoctrineTest\\InstantiatorTest\\": "tests", - "DoctrineTest\\InstantiatorTestAsset\\": "tests" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - } -} diff --git a/vendor/doctrine/instantiator/docs/en/index.rst b/vendor/doctrine/instantiator/docs/en/index.rst deleted file mode 100644 index 0c85da0..0000000 --- a/vendor/doctrine/instantiator/docs/en/index.rst +++ /dev/null @@ -1,68 +0,0 @@ -Introduction -============ - -This library provides a way of avoiding usage of constructors when instantiating PHP classes. - -Installation -============ - -The suggested installation method is via `composer`_: - -.. code-block:: console - - $ composer require doctrine/instantiator - -Usage -===== - -The instantiator is able to create new instances of any class without -using the constructor or any API of the class itself: - -.. code-block:: php - - instantiate(User::class); - -Contributing -============ - -- Follow the `Doctrine Coding Standard`_ -- The project will follow strict `object calisthenics`_ -- Any contribution must provide tests for additional introduced - conditions -- Any un-confirmed issue needs a failing test case before being - accepted -- Pull requests must be sent from a new hotfix/feature branch, not from - ``master``. - -Testing -======= - -The PHPUnit version to be used is the one installed as a dev- dependency -via composer: - -.. code-block:: console - - $ ./vendor/bin/phpunit - -Accepted coverage for new contributions is 80%. Any contribution not -satisfying this requirement won’t be merged. - -Credits -======= - -This library was migrated from `ocramius/instantiator`_, which has been -donated to the doctrine organization, and which is now deprecated in -favour of this package. - -.. _composer: https://getcomposer.org/ -.. _CONTRIBUTING.md: CONTRIBUTING.md -.. _ocramius/instantiator: https://github.com/Ocramius/Instantiator -.. _Doctrine Coding Standard: https://github.com/doctrine/coding-standard -.. _object calisthenics: http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php diff --git a/vendor/doctrine/instantiator/docs/en/sidebar.rst b/vendor/doctrine/instantiator/docs/en/sidebar.rst deleted file mode 100644 index 0c36479..0000000 --- a/vendor/doctrine/instantiator/docs/en/sidebar.rst +++ /dev/null @@ -1,4 +0,0 @@ -.. toctree:: - :depth: 3 - - index diff --git a/vendor/doctrine/instantiator/phpbench.json b/vendor/doctrine/instantiator/phpbench.json deleted file mode 100644 index fce5dd6..0000000 --- a/vendor/doctrine/instantiator/phpbench.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "bootstrap": "vendor/autoload.php", - "path": "tests/DoctrineTest/InstantiatorPerformance" -} diff --git a/vendor/doctrine/instantiator/phpcs.xml.dist b/vendor/doctrine/instantiator/phpcs.xml.dist deleted file mode 100644 index 1fcac4a..0000000 --- a/vendor/doctrine/instantiator/phpcs.xml.dist +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - src - tests - - - - - - - - - - tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php - - - - src/Doctrine/Instantiator/Exception/UnexpectedValueException.php - src/Doctrine/Instantiator/Exception/InvalidArgumentException.php - - - - src/Doctrine/Instantiator/Exception/ExceptionInterface.php - src/Doctrine/Instantiator/InstantiatorInterface.php - - diff --git a/vendor/doctrine/instantiator/phpstan.neon.dist b/vendor/doctrine/instantiator/phpstan.neon.dist deleted file mode 100644 index ecc38ef..0000000 --- a/vendor/doctrine/instantiator/phpstan.neon.dist +++ /dev/null @@ -1,19 +0,0 @@ -includes: - - vendor/phpstan/phpstan-phpunit/extension.neon - - vendor/phpstan/phpstan-phpunit/rules.neon - -parameters: - level: max - paths: - - src - - tests - - ignoreErrors: - - - message: '#::__construct\(\) does not call parent constructor from#' - path: '*/tests/DoctrineTest/InstantiatorTestAsset/*.php' - - # dynamic properties confuse static analysis - - - message: '#Access to an undefined property object::\$foo\.#' - path: '*/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php' diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php deleted file mode 100644 index e6a5195..0000000 --- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php +++ /dev/null @@ -1,12 +0,0 @@ -= 50400 && trait_exists($className)) { - return new self(sprintf('The provided type "%s" is a trait, and can not be instantiated', $className)); - } - - return new self(sprintf('The provided class "%s" does not exist', $className)); - } - - public static function fromAbstractClass(ReflectionClass $reflectionClass) : self - { - return new self(sprintf( - 'The provided class "%s" is abstract, and can not be instantiated', - $reflectionClass->getName() - )); - } -} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php deleted file mode 100644 index d946731..0000000 --- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php +++ /dev/null @@ -1,48 +0,0 @@ -getName() - ), - 0, - $exception - ); - } - - public static function fromUncleanUnSerialization( - ReflectionClass $reflectionClass, - string $errorString, - int $errorCode, - string $errorFile, - int $errorLine - ) : self { - return new self( - sprintf( - 'Could not produce an instance of "%s" via un-serialization, since an error was triggered ' - . 'in file "%s" at line "%d"', - $reflectionClass->getName(), - $errorFile, - $errorLine - ), - 0, - new Exception($errorString, $errorCode) - ); - } -} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php deleted file mode 100644 index 9c67862..0000000 --- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php +++ /dev/null @@ -1,203 +0,0 @@ -buildAndCacheFromFactory($className); - } - - /** - * Builds the requested object and caches it in static properties for performance - * - * @return object - */ - private function buildAndCacheFromFactory(string $className) - { - $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className); - $instance = $factory(); - - if ($this->isSafeToClone(new ReflectionClass($instance))) { - self::$cachedCloneables[$className] = clone $instance; - } - - return $instance; - } - - /** - * Builds a callable capable of instantiating the given $className without - * invoking its constructor. - * - * @throws InvalidArgumentException - * @throws UnexpectedValueException - * @throws ReflectionException - */ - private function buildFactory(string $className) : callable - { - $reflectionClass = $this->getReflectionClass($className); - - if ($this->isInstantiableViaReflection($reflectionClass)) { - return [$reflectionClass, 'newInstanceWithoutConstructor']; - } - - $serializedString = sprintf( - '%s:%d:"%s":0:{}', - is_subclass_of($className, Serializable::class) ? self::SERIALIZATION_FORMAT_USE_UNSERIALIZER : self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER, - strlen($className), - $className - ); - - $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString); - - return static function () use ($serializedString) { - return unserialize($serializedString); - }; - } - - /** - * @throws InvalidArgumentException - * @throws ReflectionException - */ - private function getReflectionClass(string $className) : ReflectionClass - { - if (! class_exists($className)) { - throw InvalidArgumentException::fromNonExistingClass($className); - } - - $reflection = new ReflectionClass($className); - - if ($reflection->isAbstract()) { - throw InvalidArgumentException::fromAbstractClass($reflection); - } - - return $reflection; - } - - /** - * @throws UnexpectedValueException - */ - private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, string $serializedString) : void - { - set_error_handler(static function (int $code, string $message, string $file, int $line) use ($reflectionClass, &$error) : bool { - $error = UnexpectedValueException::fromUncleanUnSerialization( - $reflectionClass, - $message, - $code, - $file, - $line - ); - - return true; - }); - - try { - $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString); - } finally { - restore_error_handler(); - } - - if ($error) { - throw $error; - } - } - - /** - * @throws UnexpectedValueException - */ - private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, string $serializedString) : void - { - try { - unserialize($serializedString); - } catch (Exception $exception) { - throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception); - } - } - - private function isInstantiableViaReflection(ReflectionClass $reflectionClass) : bool - { - return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal()); - } - - /** - * Verifies whether the given class is to be considered internal - */ - private function hasInternalAncestors(ReflectionClass $reflectionClass) : bool - { - do { - if ($reflectionClass->isInternal()) { - return true; - } - - $reflectionClass = $reflectionClass->getParentClass(); - } while ($reflectionClass); - - return false; - } - - /** - * Checks if a class is cloneable - * - * Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects. - */ - private function isSafeToClone(ReflectionClass $reflection) : bool - { - return $reflection->isCloneable() - && ! $reflection->hasMethod('__clone') - && ! $reflection->isSubclassOf(ArrayIterator::class); - } -} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php deleted file mode 100644 index 95299f4..0000000 --- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php +++ /dev/null @@ -1,20 +0,0 @@ -input = $input; - $this->tokens = []; - - $this->reset(); - $this->scan($input); - } - - /** - * Resets the lexer. - * - * @return void - */ - public function reset() - { - $this->lookahead = null; - $this->token = null; - $this->peek = 0; - $this->position = 0; - } - - /** - * Resets the peek pointer to 0. - * - * @return void - */ - public function resetPeek() - { - $this->peek = 0; - } - - /** - * Resets the lexer position on the input to the given position. - * - * @param int $position Position to place the lexical scanner. - * - * @return void - */ - public function resetPosition($position = 0) - { - $this->position = $position; - } - - /** - * Retrieve the original lexer's input until a given position. - * - * @param int $position - * - * @return string - */ - public function getInputUntilPosition($position) - { - return substr($this->input, 0, $position); - } - - /** - * Checks whether a given token matches the current lookahead. - * - * @param int|string $token - * - * @return bool - */ - public function isNextToken($token) - { - return $this->lookahead !== null && $this->lookahead['type'] === $token; - } - - /** - * Checks whether any of the given tokens matches the current lookahead. - * - * @param array $tokens - * - * @return bool - */ - public function isNextTokenAny(array $tokens) - { - return $this->lookahead !== null && in_array($this->lookahead['type'], $tokens, true); - } - - /** - * Moves to the next token in the input string. - * - * @return bool - */ - public function moveNext() - { - $this->peek = 0; - $this->token = $this->lookahead; - $this->lookahead = isset($this->tokens[$this->position]) - ? $this->tokens[$this->position++] : null; - - return $this->lookahead !== null; - } - - /** - * Tells the lexer to skip input tokens until it sees a token with the given value. - * - * @param string $type The token type to skip until. - * - * @return void - */ - public function skipUntil($type) - { - while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { - $this->moveNext(); - } - } - - /** - * Checks if given value is identical to the given token. - * - * @param mixed $value - * @param int|string $token - * - * @return bool - */ - public function isA($value, $token) - { - return $this->getType($value) === $token; - } - - /** - * Moves the lookahead token forward. - * - * @return array|null The next token or NULL if there are no more tokens ahead. - */ - public function peek() - { - if (isset($this->tokens[$this->position + $this->peek])) { - return $this->tokens[$this->position + $this->peek++]; - } - - return null; - } - - /** - * Peeks at the next token, returns it and immediately resets the peek. - * - * @return array|null The next token or NULL if there are no more tokens ahead. - */ - public function glimpse() - { - $peek = $this->peek(); - $this->peek = 0; - - return $peek; - } - - /** - * Scans the input string for tokens. - * - * @param string $input A query string. - * - * @return void - */ - protected function scan($input) - { - if (! isset($this->regex)) { - $this->regex = sprintf( - '/(%s)|%s/%s', - implode(')|(', $this->getCatchablePatterns()), - implode('|', $this->getNonCatchablePatterns()), - $this->getModifiers() - ); - } - - $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; - $matches = preg_split($this->regex, $input, -1, $flags); - - if ($matches === false) { - // Work around https://bugs.php.net/78122 - $matches = [[$input, 0]]; - } - - foreach ($matches as $match) { - // Must remain before 'value' assignment since it can change content - $type = $this->getType($match[0]); - - $this->tokens[] = [ - 'value' => $match[0], - 'type' => $type, - 'position' => $match[1], - ]; - } - } - - /** - * Gets the literal for a given token. - * - * @param int|string $token - * - * @return int|string - */ - public function getLiteral($token) - { - $className = static::class; - $reflClass = new ReflectionClass($className); - $constants = $reflClass->getConstants(); - - foreach ($constants as $name => $value) { - if ($value === $token) { - return $className . '::' . $name; - } - } - - return $token; - } - - /** - * Regex modifiers - * - * @return string - */ - protected function getModifiers() - { - return 'iu'; - } - - /** - * Lexical catchable patterns. - * - * @return array - */ - abstract protected function getCatchablePatterns(); - - /** - * Lexical non-catchable patterns. - * - * @return array - */ - abstract protected function getNonCatchablePatterns(); - - /** - * Retrieve token type. Also processes the token value if necessary. - * - * @param string $value - * - * @return int|string|null - */ - abstract protected function getType(&$value); -} diff --git a/vendor/felixfbecker/advanced-json-rpc/.travis.yml b/vendor/felixfbecker/advanced-json-rpc/.travis.yml deleted file mode 100644 index 3fb59a1..0000000 --- a/vendor/felixfbecker/advanced-json-rpc/.travis.yml +++ /dev/null @@ -1,43 +0,0 @@ -language: php - -php: - - '7.0' - - '7.2' - -env: - global: - - FORCE_COLOR=1 - -cache: - directories: - - $HOME/.composer/cache - - $HOME/.npm - -install: - - composer install --prefer-dist - -script: - - vendor/bin/phpunit --coverage-clover=coverage.xml --whitelist lib --bootstrap vendor/autoload.php tests - -after_success: - - bash <(curl -s https://codecov.io/bash) - -jobs: - include: - - stage: release - language: node_js - node_js: '8' - install: - - npm ci - script: - - npm run semantic-release - after_success: false - -stages: - - test - - name: release - if: branch = master AND type = push AND fork = false - -branches: - except: - - /^v\d+\.\d+\.\d+$/ diff --git a/vendor/felixfbecker/advanced-json-rpc/LICENSE b/vendor/felixfbecker/advanced-json-rpc/LICENSE deleted file mode 100644 index fc35417..0000000 --- a/vendor/felixfbecker/advanced-json-rpc/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2016, Felix Frederick Becker - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/felixfbecker/advanced-json-rpc/composer.json b/vendor/felixfbecker/advanced-json-rpc/composer.json deleted file mode 100644 index a7e1d7b..0000000 --- a/vendor/felixfbecker/advanced-json-rpc/composer.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "felixfbecker/advanced-json-rpc", - "description": "A more advanced JSONRPC implementation", - "type": "library", - "license": "ISC", - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "autoload-dev": { - "psr-4": { - "AdvancedJsonRpc\\Tests\\": "tests/" - } - }, - "require": { - "php": ">=7.0", - "netresearch/jsonmapper": "^1.0 || ^2.0", - "phpdocumentor/reflection-docblock": "^4.0.0 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0.0" - }, - "minimum-stability": "dev", - "prefer-stable": true -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php b/vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php deleted file mode 100644 index a2ad10f..0000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php +++ /dev/null @@ -1,172 +0,0 @@ - ReflectionMethod[] - * - * @var ReflectionMethod - */ - private $methods; - - /** - * @var \phpDocumentor\Reflection\DocBlockFactory - */ - private $docBlockFactory; - - /** - * @var \phpDocumentor\Reflection\Types\ContextFactory - */ - private $contextFactory; - - /** - * @param object $target The target object that should receive the method calls - * @param string $delimiter A delimiter for method calls on properties, for example someProperty->someMethod - */ - public function __construct($target, $delimiter = '->') - { - $this->target = $target; - $this->delimiter = $delimiter; - $this->docBlockFactory = DocBlockFactory::createInstance(); - $this->contextFactory = new Types\ContextFactory(); - $this->mapper = new JsonMapper(); - } - - /** - * Calls the appropriate method handler for an incoming Message - * - * @param string|object $msg The incoming message - * @return mixed - */ - public function dispatch($msg) - { - if (is_string($msg)) { - $msg = json_decode($msg); - if (json_last_error() !== JSON_ERROR_NONE) { - throw new Error(json_last_error_msg(), ErrorCode::PARSE_ERROR); - } - } - // Find out the object and function that should be called - $obj = $this->target; - $parts = explode($this->delimiter, $msg->method); - // The function to call is always the last part of the method - $fn = array_pop($parts); - // For namespaced methods like textDocument/didOpen, call the didOpen method on the $textDocument property - // For simple methods like initialize, shutdown, exit, this loop will simply not be entered and $obj will be - // the target - foreach ($parts as $part) { - if (!isset($obj->$part)) { - throw new Error("Method {$msg->method} is not implemented", ErrorCode::METHOD_NOT_FOUND); - } - $obj = $obj->$part; - } - if (!isset($this->methods[$msg->method])) { - try { - $method = new ReflectionMethod($obj, $fn); - $this->methods[$msg->method] = $method; - } catch (ReflectionException $e) { - throw new Error($e->getMessage(), ErrorCode::METHOD_NOT_FOUND, null, $e); - } - } - $method = $this->methods[$msg->method]; - $parameters = $method->getParameters(); - if ($method->getDocComment()) { - $docBlock = $this->docBlockFactory->create( - $method->getDocComment(), - $this->contextFactory->createFromReflector($method->getDeclaringClass()) - ); - $paramTags = $docBlock->getTagsByName('param'); - } - $args = []; - if (isset($msg->params)) { - // Find out the position - if (is_array($msg->params)) { - $args = $msg->params; - } else if (is_object($msg->params)) { - foreach ($parameters as $pos => $parameter) { - $value = null; - foreach(get_object_vars($msg->params) as $key => $val) { - if ($parameter->name === $key) { - $value = $val; - break; - } - } - $args[$pos] = $value; - } - } else { - throw new Error('Params must be structured or omitted', ErrorCode::INVALID_REQUEST); - } - foreach ($args as $position => $value) { - try { - // If the type is structured (array or object), map it with JsonMapper - if (is_object($value)) { - // Does the parameter have a type hint? - $param = $parameters[$position]; - if ($param->hasType()) { - $paramType = $param->getType(); - if ($paramType instanceof ReflectionNamedType) { - // We have object data to map and want the class name. - // This should not include the `?` if the type was nullable. - $class = $paramType->getName(); - } else { - // Fallback for php 7.0, which is still supported (and doesn't have nullable). - $class = (string)$paramType; - } - $value = $this->mapper->map($value, new $class()); - } - } else if (is_array($value) && isset($docBlock)) { - // Get the array type from the DocBlock - $type = $paramTags[$position]->getType(); - // For union types, use the first one that is a class array (often it is SomeClass[]|null) - if ($type instanceof Types\Compound) { - for ($i = 0; $t = $type->get($i); $i++) { - if ( - $t instanceof Types\Array_ - && $t->getValueType() instanceof Types\Object_ - && (string)$t->getValueType() !== 'object' - ) { - $class = (string)$t->getValueType()->getFqsen(); - $value = $this->mapper->mapArray($value, [], $class); - break; - } - } - } else if ($type instanceof Types\Array_) { - $class = (string)$type->getValueType()->getFqsen(); - $value = $this->mapper->mapArray($value, [], $class); - } else { - throw new Error('Type is not matching @param tag', ErrorCode::INVALID_PARAMS); - } - } - } catch (JsonMapper_Exception $e) { - throw new Error($e->getMessage(), ErrorCode::INVALID_PARAMS, null, $e); - } - $args[$position] = $value; - } - } - ksort($args); - $result = $obj->$fn(...$args); - return $result; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Error.php b/vendor/felixfbecker/advanced-json-rpc/lib/Error.php deleted file mode 100644 index b280191..0000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Error.php +++ /dev/null @@ -1,38 +0,0 @@ -data = $data; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php b/vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php deleted file mode 100644 index f0ef479..0000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php +++ /dev/null @@ -1,48 +0,0 @@ -id) && isset($msg->error); - } - - /** - * @param int|string $id - * @param \AdvancedJsonRpc\Error $error - */ - public function __construct($id, Error $error) - { - parent::__construct($id); - $this->error = $error; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Message.php b/vendor/felixfbecker/advanced-json-rpc/lib/Message.php deleted file mode 100644 index e2231dc..0000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Message.php +++ /dev/null @@ -1,52 +0,0 @@ -method, $decoded->params ?? null); - } else if (Request::isRequest($decoded)) { - $obj = new Request($decoded->id, $decoded->method, $decoded->params ?? null); - } else if (SuccessResponse::isSuccessResponse($decoded)) { - $obj = new SuccessResponse($decoded->id, $decoded->result); - } else if (ErrorResponse::isErrorResponse($decoded)) { - $obj = new ErrorResponse($decoded->id, new Error($decoded->error->message, $decoded->error->code, $decoded->error->data ?? null)); - } else { - throw new Error('Invalid message', ErrorCode::INVALID_REQUEST); - } - return $obj; - } - - public function __toString(): string - { - $encoded = json_encode($this); - if ($encoded === false) { - throw new Error(json_last_error_msg(), ErrorCode::INTERNAL_ERROR); - } - return $encoded; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Notification.php b/vendor/felixfbecker/advanced-json-rpc/lib/Notification.php deleted file mode 100644 index 3440164..0000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Notification.php +++ /dev/null @@ -1,56 +0,0 @@ -method); - } - - /** - * @param string $method - * @param mixed $params - */ - public function __construct(string $method, $params = null) - { - $this->method = $method; - $this->params = $params; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Request.php b/vendor/felixfbecker/advanced-json-rpc/lib/Request.php deleted file mode 100644 index 1429008..0000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Request.php +++ /dev/null @@ -1,63 +0,0 @@ -method); - } - - /** - * @param string|int $id - * @param string $method - * @param object|array $params - */ - public function __construct($id, string $method, $params = null) - { - $this->id = $id; - $this->method = $method; - $this->params = $params; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/Response.php b/vendor/felixfbecker/advanced-json-rpc/lib/Response.php deleted file mode 100644 index a871eea..0000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/Response.php +++ /dev/null @@ -1,40 +0,0 @@ -error)); - } - - /** - * @param int|string $id - * @param mixed $result - * @param ResponseError $error - */ - public function __construct($id) - { - $this->id = $id; - } -} diff --git a/vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php b/vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php deleted file mode 100644 index 222fd46..0000000 --- a/vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php +++ /dev/null @@ -1,40 +0,0 @@ -result = $result; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/CHANGELOG.md b/vendor/friendsofphp/php-cs-fixer/CHANGELOG.md deleted file mode 100644 index 43f7789..0000000 --- a/vendor/friendsofphp/php-cs-fixer/CHANGELOG.md +++ /dev/null @@ -1,3249 +0,0 @@ -CHANGELOG for PHP CS Fixer -========================== - -This file contains changelogs for stable releases only. - -Changelog for v2.16.4 ---------------------- - -* bug #3893 Fix handling /** and */ on the same line as the first and/or last annotation (dmvdbrugge) -* bug #4919 PhpUnitTestAnnotationFixer - fix function starting with "test" and having lowercase letter after (kubawerlos) -* bug #4929 YodaStyleFixer - handling equals empty array (kubawerlos) -* bug #4934 YodaStyleFixer - fix for conditions weird are (kubawerlos) -* bug #4958 OrderedImportsFixer - fix for trailing comma in group (kubawerlos) -* bug #4959 BlankLineBeforeStatementFixer - handle comment case (SpacePossum) -* bug #4962 MethodArgumentSpaceFixer - must run after MethodChainingIndentationFixer (kubawerlos) -* bug #4963 PhpdocToReturnTypeFixer - fix for breaking PHP syntax for type having reserved name (kubawerlos, Slamdunk) -* bug #4978 ArrayIndentationFixer - must run after MethodArgumentSpaceFixer (kubawerlos) -* bug #4994 FinalInternalClassFixer - must run before ProtectedToPrivateFixer (kubawerlos) -* bug #4996 NoEmptyCommentFixer - handle multiline comments (kubawerlos) -* bug #4999 BlankLineBeforeStatementFixer - better comment handling (SpacePossum) -* bug #5009 NoEmptyCommentFixer - better handle comments sequence (kubawerlos) -* bug #5010 SimplifiedNullReturnFixer - must run before VoidReturnFixer (kubawerlos) -* bug #5011 SingleClassElementPerStatementFixer - must run before ClassAttributesSeparationFixer (kubawerlos) -* bug #5012 StrictParamFixer - must run before NativeFunctionInvocationFixer (kubawerlos) -* bug #5014 PhpdocToParamTypeFixer - fix for void as param (kubawerlos) -* bug #5018 PhpdocScalarFixer - fix for comment with Windows line endings (kubawerlos) -* bug #5029 SingleLineAfterImportsFixer - fix for line after import already added using CRLF (kubawerlos) -* minor #4904 Increase PHPStan level to 8 with strict rules (julienfalque) -* minor #4920 Enhancement: Use DocBlock itself to make it multi-line (localheinz) -* minor #4930 DX: ensure PhpUnitNamespacedFixer handles all classes (kubawerlos) -* minor #4931 DX: add test to ensure each target version in PhpUnitTargetVersion has its set in RuleSet (kubawerlos) -* minor #4932 DX: Travis CI config - fix warnings and infos (kubawerlos) -* minor #4940 Reject empty path (julienfalque) -* minor #4944 Fix grammar (julienfalque) -* minor #4946 Allow "const" option on PHP <7.1 (julienfalque) -* minor #4948 Added describe command to readme (david, 8ctopus) -* minor #4949 Fixed build readme on Windows fails if using Git Bash (Mintty) (8ctopus) -* minor #4954 Config - Trim path (julienfalque) -* minor #4957 DX: Check trailing spaces in project files only (ktomk) -* minor #4961 Assert all project source files are monolithic. (SpacePossum) -* minor #4964 Fix PHPStan baseline (julienfalque) -* minor #4965 Fix PHPStan baseline (julienfalque) -* minor #4973 DX: test "isRisky" method in fixer tests, not as auto review (kubawerlos) -* minor #4974 Minor: Fix typo (ktomk) -* minor #4975 Revert PHPStan level to 5 (julienfalque) -* minor #4976 Add instructions for PHPStan (julienfalque) -* minor #4980 Introduce new issue templates (julienfalque) -* minor #4981 Prevent error in CTTest::testConstants (for PHP8) (guilliamxavier) -* minor #4982 Remove PHIVE (kubawerlos) -* minor #4985 Fix tests with Symfony 5.1 (julienfalque) -* minor #4987 PhpdocAnnotationWithoutDotFixer - handle unicode characters using mb_* (SpacePossum) -* minor #5008 Enhancement: Social justification applied (gbyrka-fingo) -* minor #5023 Fix issue templates (kubawerlos) -* minor #5024 DX: add missing non-default code samples (kubawerlos) - -Changelog for v2.16.3 ---------------------- - -* bug #4915 Fix handling property PHPDocs with unsupported type (julienfalque) -* minor #4916 Fix AppVeyor build (julienfalque) -* minor #4917 CircleCI - Bump xcode to 11.4 (GrahamCampbell) -* minor #4918 DX: do not fix ".phpt" files by default (kubawerlos) - -Changelog for v2.16.2 ---------------------- - -* bug #3820 Braces - (re)indenting comment issues (SpacePossum) -* bug #3911 PhpdocVarWithoutNameFixer - fix for properties only (dmvdbrugge) -* bug #4601 ClassKeywordRemoveFixer - Fix for namespace (yassine-ah, kubawerlos) -* bug #4630 FullyQualifiedStrictTypesFixer - Ignore partial class names which look like FQCNs (localheinz, SpacePossum) -* bug #4661 ExplicitStringVariableFixer - variables pair if one is already explicit (kubawerlos) -* bug #4675 NonPrintableCharacterFixer - fix for backslash and quotes when changing to escape sequences (kubawerlos) -* bug #4678 TokensAnalyzer::isConstantInvocation - fix for importing multiple classes with single "use" (kubawerlos) -* bug #4682 Fix handling array type declaration in properties (julienfalque) -* bug #4685 Improve Symfony 5 compatibility (keradus) -* bug #4688 TokensAnalyzer::isConstantInvocation - Fix detection for fully qualified return type (julienfalque) -* bug #4689 DeclareStrictTypesFixer - fix for "strict_types" set to "0" (kubawerlos) -* bug #4690 PhpdocVarAnnotationCorrectOrderFixer - fix for multiline `@var` without type (kubawerlos) -* bug #4710 SingleTraitInsertPerStatement - fix formatting for multiline "use" (kubawerlos) -* bug #4711 Ensure that files from "tests" directory in release are autoloaded (kubawerlos) -* bug #4749 TokensAnalyze::isUnaryPredecessorOperator fix for CT::T_ARRAY_INDEX_C… (SpacePossum) -* bug #4759 Add more priority cases (SpacePossum) -* bug #4761 NoSuperfluousElseifFixer - handle single line (SpacePossum) -* bug #4783 NoSuperfluousPhpdocTagsFixer - fix for really big PHPDoc (kubawerlos, mvorisek) -* bug #4787 NoUnneededFinalMethodFixer - Mark as risky (SpacePossum) -* bug #4795 OrderedClassElementsFixer - Fix (SpacePossum) -* bug #4801 GlobalNamespaceImportFixer - fix docblock handling (gharlan) -* bug #4804 TokensAnalyzer::isUnarySuccessorOperator fix for array curly braces (SpacePossum) -* bug #4807 IncrementStyleFixer - handle after ")" (SpacePossum) -* bug #4808 Modernize types casting fixer array curly (SpacePossum) -* bug #4809 Fix "braces" and "method_argument_space" priority (julienfalque) -* bug #4813 BracesFixer - fix invalid code generation on alternative syntax (SpacePossum) -* bug #4822 fix 2 bugs in phpdoc_line_span (lmichelin) -* bug #4823 ReturnAssignmentFixer - repeat fix (SpacePossum) -* bug #4824 NoUnusedImportsFixer - SingleLineAfterImportsFixer - fix priority (SpacePossum) -* bug #4825 GlobalNamespaceImportFixer - do not import global into global (SpacePossum) -* bug #4829 YodaStyleFixer - fix precedence for T_MOD_EQUAL and T_COALESCE_EQUAL (SpacePossum) -* bug #4830 TernaryToNullCoalescingFixer - handle yield from (SpacePossum) -* bug #4835 Remove duplicate "function_to_constant" from RuleSet (SpacePossum) -* bug #4840 LineEndingFixer - T_CLOSE_TAG support, StringLineEndingFixer - T_INLI… (SpacePossum) -* bug #4846 FunctionsAnalyzer - better isGlobalFunctionCall detection (SpacePossum) -* bug #4852 Priority issues (SpacePossum) -* bug #4870 HeaderCommentFixer - do not remove class docs (gharlan) -* bug #4871 NoExtraBlankLinesFixer - handle cases on same line (SpacePossum) -* bug #4895 Fix conflict between header_comment and declare_strict_types (BackEndTea, julienfalque) -* bug #4911 PhpdocSeparationFixer - fix regression with lack of next line (keradus) -* feature #4742 FunctionToConstantFixer - get_class($this) support (SpacePossum) -* minor #4377 CommentsAnalyzer - fix for declare before header comment (kubawerlos) -* minor #4636 DX: do not check for PHPDBG when collecting coverage (kubawerlos) -* minor #4644 Docs: add info about "-vv..." (voku) -* minor #4691 Run Travis CI on stable PHP 7.4 (kubawerlos) -* minor #4693 Increase Travis CI Git clone depth (julienfalque) -* minor #4699 LineEndingFixer - handle "\r\r\n" (kubawerlos) -* minor #4703 NoSuperfluousPhpdocTagsFixer,PhpdocAddMissingParamAnnotationFixer - p… (SpacePossum) -* minor #4707 Fix typos (TysonAndre) -* minor #4712 NoBlankLinesAfterPhpdocFixer — Do not strip newline between docblock and use statements (mollierobbert) -* minor #4715 Enhancement: Install ergebnis/composer-normalize via Phive (localheinz) -* minor #4722 Fix Circle CI build (julienfalque) -* minor #4724 DX: Simplify installing PCOV (kubawerlos) -* minor #4736 NoUnusedImportsFixer - do not match variable name as import (SpacePossum) -* minor #4746 NoSuperfluousPhpdocTagsFixer - Remove for typed properties (PHP 7.4) (ruudk) -* minor #4753 Do not apply any text/.git filters to fixtures (mvorisek) -* minor #4757 Test $expected is used before $input (SpacePossum) -* minor #4758 Autoreview the PHPDoc of *Fixer::getPriority based on the priority map (SpacePossum) -* minor #4765 Add test on some return types (SpacePossum) -* minor #4766 Remove false test skip (SpacePossum) -* minor #4767 Remove useless priority comments (kubawerlos) -* minor #4769 DX: add missing priority tests (kubawerlos) -* minor #4772 NoUnneededFinalMethodFixer - update description (kubawerlos) -* minor #4774 DX: simplify Utils::camelCaseToUnderscore (kubawerlos) -* minor #4781 NoUnneededCurlyBracesFixer - handle namespaces (SpacePossum) -* minor #4784 Travis CI - Use multiple keyservers (ktomk) -* minor #4785 Improve static analysis (enumag) -* minor #4788 Configurable fixers code sample (SpacePossum) -* minor #4791 Increase PHPStan level to 3 (julienfalque) -* minor #4797 clean ups (SpacePossum) -* minor #4803 FinalClassFixer - Doctrine\ORM\Mapping as ORM alias should not be required (localheinz) -* minor #4839 2.15 - clean ups (SpacePossum) -* minor #4842 ReturnAssignmentFixer - Support more cases (julienfalque) -* minor #4843 NoSuperfluousPhpdocTagsFixer - fix typo in option description (OndraM) -* minor #4844 Same requirements for descriptions (SpacePossum) -* minor #4849 Increase PHPStan level to 5 (julienfalque) -* minor #4850 Fix phpstan (SpacePossum) -* minor #4857 Fixed the unit tests (GrahamCampbell) -* minor #4865 Use latest xcode image (GrahamCampbell) -* minor #4892 CombineNestedDirnameFixer - Add space after comma (julienfalque) -* minor #4894 DX: PhpdocToParamTypeFixer - improve typing (keradus) -* minor #4898 FixerTest - yield the data in AutoReview (Nyholm) -* minor #4899 Fix exception message format for fabbot.io (SpacePossum) -* minor #4905 Support composer v2 installed.json files (GrahamCampbell) -* minor #4906 CI: use Composer stable release for AppVeyor (kubawerlos) -* minor #4909 DX: HeaderCommentFixer - use non-aliased version of option name in code (keradus) -* minor #4912 CI: Fix AppVeyor integration (keradus) - -Changelog for v2.16.1 ---------------------- - -* bug #4476 FunctionsAnalyzer - add "isTheSameClassCall" for correct verifying of function calls (kubawerlos) -* bug #4605 PhpdocToParamTypeFixer - cover more cases (keradus, julienfalque) -* bug #4626 FinalPublicMethodForAbstractClassFixer - Do not attempt to mark abstract public methods as final (localheinz) -* bug #4632 NullableTypeDeclarationForDefaultNullValueFixer - fix for not lowercase "null" (kubawerlos) -* bug #4638 Ensure compatibility with PHP 7.4 (julienfalque) -* bug #4641 Add typed properties test to VisibilityRequiredFixerTest (GawainLynch, julienfalque) -* bug #4654 ArrayIndentationFixer - Fix array indentation for multiline values (julienfalque) -* bug #4660 TokensAnalyzer::isConstantInvocation - fix for extending multiple interfaces (kubawerlos) -* bug #4668 TokensAnalyzer::isConstantInvocation - fix for interface method return type (kubawerlos) -* minor #4608 Allow Symfony 5 components (l-vo) -* minor #4622 Disallow PHP 7.4 failures on Travis CI (julienfalque) -* minor #4623 README - Mark up as code (localheinz) -* minor #4637 PHP 7.4 integration test (GawainLynch, julienfalque) -* minor #4643 DX: Update .gitattributes and move ci-integration.sh to root of the project (kubawerlos, keradus) -* minor #4645 Check PHP extensions on runtime (kubawerlos) -* minor #4655 Improve docs - README (mvorisek) -* minor #4662 DX: generate headers in README.rst (kubawerlos) -* minor #4669 Enable execution under PHP 7.4 (keradus) -* minor #4670 TravisTest - rewrite tests to allow last supported by tool PHP version to be snapshot (keradus) -* minor #4671 TravisTest - rewrite tests to allow last supported by tool PHP version to be snapshot (keradus) - -Changelog for v2.16.0 ---------------------- - -* feature #3810 PhpdocLineSpanFixer - Introduction (BackEndTea) -* feature #3928 Add FinalPublicMethodForAbstractClassFixer (Slamdunk) -* feature #4000 FinalStaticAccessFixer - Introduction (ntzm) -* feature #4275 Issue #4274: Let lowercase_constants directive to be configurable. (drupol) -* feature #4355 GlobalNamespaceImportFixer - Introduction (gharlan) -* feature #4358 SelfStaticAccessorFixer - Introduction (SpacePossum) -* feature #4385 CommentToPhpdocFixer - allow to ignore tags (kubawerlos) -* feature #4401 Add NullableTypeDeclarationForDefaultNullValueFixer (HypeMC) -* feature #4452 Add SingleLineThrowFixer (kubawerlos) -* feature #4500 NoSuperfluousPhpdocTags - Add remove_inheritdoc option (julienfalque) -* feature #4505 NoSuperfluousPhpdocTagsFixer - allow params that aren't on the signature (azjezz) -* feature #4531 PhpdocAlignFixer - add "property-read" and "property-write" to allowed tags (kubawerlos) -* feature #4583 Phpdoc to param type fixer rebase (jg-development) -* minor #4033 Raise deprecation warnings on usage of deprecated aliases (ntzm) -* minor #4423 DX: update branch alias (keradus) -* minor #4537 SelfStaticAccessor - extend itests (keradus) -* minor #4607 Configure no_superfluous_phpdoc_tags for Symfony (keradus) -* minor #4618 DX: fix usage of deprecated options (0x450x6c) -* minor #4619 Fix PHP 7.3 strict mode warnings (keradus) -* minor #4621 Add single_line_throw to Symfony ruleset (keradus) - -Changelog for v2.15.8 ---------------------- - -* bug #3893 Fix handling /** and */ on the same line as the first and/or last annotation (dmvdbrugge) -* bug #4919 PhpUnitTestAnnotationFixer - fix function starting with "test" and having lowercase letter after (kubawerlos) -* bug #4929 YodaStyleFixer - handling equals empty array (kubawerlos) -* bug #4934 YodaStyleFixer - fix for conditions weird are (kubawerlos) -* bug #4958 OrderedImportsFixer - fix for trailing comma in group (kubawerlos) -* bug #4959 BlankLineBeforeStatementFixer - handle comment case (SpacePossum) -* bug #4962 MethodArgumentSpaceFixer - must run after MethodChainingIndentationFixer (kubawerlos) -* bug #4963 PhpdocToReturnTypeFixer - fix for breaking PHP syntax for type having reserved name (kubawerlos, Slamdunk) -* bug #4978 ArrayIndentationFixer - must run after MethodArgumentSpaceFixer (kubawerlos) -* bug #4994 FinalInternalClassFixer - must run before ProtectedToPrivateFixer (kubawerlos) -* bug #4996 NoEmptyCommentFixer - handle multiline comments (kubawerlos) -* bug #4999 BlankLineBeforeStatementFixer - better comment handling (SpacePossum) -* bug #5009 NoEmptyCommentFixer - better handle comments sequence (kubawerlos) -* bug #5010 SimplifiedNullReturnFixer - must run before VoidReturnFixer (kubawerlos) -* bug #5011 SingleClassElementPerStatementFixer - must run before ClassAttributesSeparationFixer (kubawerlos) -* bug #5012 StrictParamFixer - must run before NativeFunctionInvocationFixer (kubawerlos) -* bug #5029 SingleLineAfterImportsFixer - fix for line after import already added using CRLF (kubawerlos) -* minor #4904 Increase PHPStan level to 8 with strict rules (julienfalque) -* minor #4930 DX: ensure PhpUnitNamespacedFixer handles all classes (kubawerlos) -* minor #4931 DX: add test to ensure each target version in PhpUnitTargetVersion has its set in RuleSet (kubawerlos) -* minor #4932 DX: Travis CI config - fix warnings and infos (kubawerlos) -* minor #4940 Reject empty path (julienfalque) -* minor #4944 Fix grammar (julienfalque) -* minor #4946 Allow "const" option on PHP <7.1 (julienfalque) -* minor #4948 Added describe command to readme (david, 8ctopus) -* minor #4949 Fixed build readme on Windows fails if using Git Bash (Mintty) (8ctopus) -* minor #4954 Config - Trim path (julienfalque) -* minor #4957 DX: Check trailing spaces in project files only (ktomk) -* minor #4961 Assert all project source files are monolithic. (SpacePossum) -* minor #4964 Fix PHPStan baseline (julienfalque) -* minor #4973 DX: test "isRisky" method in fixer tests, not as auto review (kubawerlos) -* minor #4974 Minor: Fix typo (ktomk) -* minor #4975 Revert PHPStan level to 5 (julienfalque) -* minor #4976 Add instructions for PHPStan (julienfalque) -* minor #4980 Introduce new issue templates (julienfalque) -* minor #4981 Prevent error in CTTest::testConstants (for PHP8) (guilliamxavier) -* minor #4982 Remove PHIVE (kubawerlos) -* minor #4985 Fix tests with Symfony 5.1 (julienfalque) -* minor #4987 PhpdocAnnotationWithoutDotFixer - handle unicode characters using mb_* (SpacePossum) -* minor #5008 Enhancement: Social justification applied (gbyrka-fingo) -* minor #5023 Fix issue templates (kubawerlos) -* minor #5024 DX: add missing non-default code samples (kubawerlos) - -Changelog for v2.15.7 ---------------------- - -* bug #4915 Fix handling property PHPDocs with unsupported type (julienfalque) -* minor #4916 Fix AppVeyor build (julienfalque) -* minor #4917 CircleCI - Bump xcode to 11.4 (GrahamCampbell) -* minor #4918 DX: do not fix ".phpt" files by default (kubawerlos) - -Changelog for v2.15.6 ---------------------- - -* bug #3820 Braces - (re)indenting comment issues (SpacePossum) -* bug #3911 PhpdocVarWithoutNameFixer - fix for properties only (dmvdbrugge) -* bug #4601 ClassKeywordRemoveFixer - Fix for namespace (yassine-ah, kubawerlos) -* bug #4630 FullyQualifiedStrictTypesFixer - Ignore partial class names which look like FQCNs (localheinz, SpacePossum) -* bug #4661 ExplicitStringVariableFixer - variables pair if one is already explicit (kubawerlos) -* bug #4675 NonPrintableCharacterFixer - fix for backslash and quotes when changing to escape sequences (kubawerlos) -* bug #4678 TokensAnalyzer::isConstantInvocation - fix for importing multiple classes with single "use" (kubawerlos) -* bug #4682 Fix handling array type declaration in properties (julienfalque) -* bug #4685 Improve Symfony 5 compatibility (keradus) -* bug #4688 TokensAnalyzer::isConstantInvocation - Fix detection for fully qualified return type (julienfalque) -* bug #4689 DeclareStrictTypesFixer - fix for "strict_types" set to "0" (kubawerlos) -* bug #4690 PhpdocVarAnnotationCorrectOrderFixer - fix for multiline `@var` without type (kubawerlos) -* bug #4710 SingleTraitInsertPerStatement - fix formatting for multiline "use" (kubawerlos) -* bug #4711 Ensure that files from "tests" directory in release are autoloaded (kubawerlos) -* bug #4749 TokensAnalyze::isUnaryPredecessorOperator fix for CT::T_ARRAY_INDEX_C… (SpacePossum) -* bug #4759 Add more priority cases (SpacePossum) -* bug #4761 NoSuperfluousElseifFixer - handle single line (SpacePossum) -* bug #4783 NoSuperfluousPhpdocTagsFixer - fix for really big PHPDoc (kubawerlos, mvorisek) -* bug #4787 NoUnneededFinalMethodFixer - Mark as risky (SpacePossum) -* bug #4795 OrderedClassElementsFixer - Fix (SpacePossum) -* bug #4804 TokensAnalyzer::isUnarySuccessorOperator fix for array curly braces (SpacePossum) -* bug #4807 IncrementStyleFixer - handle after ")" (SpacePossum) -* bug #4808 Modernize types casting fixer array curly (SpacePossum) -* bug #4809 Fix "braces" and "method_argument_space" priority (julienfalque) -* bug #4813 BracesFixer - fix invalid code generation on alternative syntax (SpacePossum) -* bug #4823 ReturnAssignmentFixer - repeat fix (SpacePossum) -* bug #4824 NoUnusedImportsFixer - SingleLineAfterImportsFixer - fix priority (SpacePossum) -* bug #4829 YodaStyleFixer - fix precedence for T_MOD_EQUAL and T_COALESCE_EQUAL (SpacePossum) -* bug #4830 TernaryToNullCoalescingFixer - handle yield from (SpacePossum) -* bug #4835 Remove duplicate "function_to_constant" from RuleSet (SpacePossum) -* bug #4840 LineEndingFixer - T_CLOSE_TAG support, StringLineEndingFixer - T_INLI… (SpacePossum) -* bug #4846 FunctionsAnalyzer - better isGlobalFunctionCall detection (SpacePossum) -* bug #4852 Priority issues (SpacePossum) -* bug #4870 HeaderCommentFixer - do not remove class docs (gharlan) -* bug #4871 NoExtraBlankLinesFixer - handle cases on same line (SpacePossum) -* bug #4895 Fix conflict between header_comment and declare_strict_types (BackEndTea, julienfalque) -* bug #4911 PhpdocSeparationFixer - fix regression with lack of next line (keradus) -* feature #4742 FunctionToConstantFixer - get_class($this) support (SpacePossum) -* minor #4377 CommentsAnalyzer - fix for declare before header comment (kubawerlos) -* minor #4636 DX: do not check for PHPDBG when collecting coverage (kubawerlos) -* minor #4644 Docs: add info about "-vv..." (voku) -* minor #4691 Run Travis CI on stable PHP 7.4 (kubawerlos) -* minor #4693 Increase Travis CI Git clone depth (julienfalque) -* minor #4699 LineEndingFixer - handle "\r\r\n" (kubawerlos) -* minor #4703 NoSuperfluousPhpdocTagsFixer,PhpdocAddMissingParamAnnotationFixer - p… (SpacePossum) -* minor #4707 Fix typos (TysonAndre) -* minor #4712 NoBlankLinesAfterPhpdocFixer — Do not strip newline between docblock and use statements (mollierobbert) -* minor #4715 Enhancement: Install ergebnis/composer-normalize via Phive (localheinz) -* minor #4722 Fix Circle CI build (julienfalque) -* minor #4724 DX: Simplify installing PCOV (kubawerlos) -* minor #4736 NoUnusedImportsFixer - do not match variable name as import (SpacePossum) -* minor #4746 NoSuperfluousPhpdocTagsFixer - Remove for typed properties (PHP 7.4) (ruudk) -* minor #4753 Do not apply any text/.git filters to fixtures (mvorisek) -* minor #4757 Test $expected is used before $input (SpacePossum) -* minor #4758 Autoreview the PHPDoc of *Fixer::getPriority based on the priority map (SpacePossum) -* minor #4765 Add test on some return types (SpacePossum) -* minor #4766 Remove false test skip (SpacePossum) -* minor #4767 Remove useless priority comments (kubawerlos) -* minor #4769 DX: add missing priority tests (kubawerlos) -* minor #4772 NoUnneededFinalMethodFixer - update description (kubawerlos) -* minor #4774 DX: simplify Utils::camelCaseToUnderscore (kubawerlos) -* minor #4781 NoUnneededCurlyBracesFixer - handle namespaces (SpacePossum) -* minor #4784 Travis CI - Use multiple keyservers (ktomk) -* minor #4785 Improve static analysis (enumag) -* minor #4788 Configurable fixers code sample (SpacePossum) -* minor #4791 Increase PHPStan level to 3 (julienfalque) -* minor #4797 clean ups (SpacePossum) -* minor #4803 FinalClassFixer - Doctrine\ORM\Mapping as ORM alias should not be required (localheinz) -* minor #4839 2.15 - clean ups (SpacePossum) -* minor #4842 ReturnAssignmentFixer - Support more cases (julienfalque) -* minor #4844 Same requirements for descriptions (SpacePossum) -* minor #4849 Increase PHPStan level to 5 (julienfalque) -* minor #4857 Fixed the unit tests (GrahamCampbell) -* minor #4865 Use latest xcode image (GrahamCampbell) -* minor #4892 CombineNestedDirnameFixer - Add space after comma (julienfalque) -* minor #4898 FixerTest - yield the data in AutoReview (Nyholm) -* minor #4899 Fix exception message format for fabbot.io (SpacePossum) -* minor #4905 Support composer v2 installed.json files (GrahamCampbell) -* minor #4906 CI: use Composer stable release for AppVeyor (kubawerlos) -* minor #4909 DX: HeaderCommentFixer - use non-aliased version of option name in code (keradus) -* minor #4912 CI: Fix AppVeyor integration (keradus) - -Changelog for v2.15.5 ---------------------- - -* bug #4476 FunctionsAnalyzer - add "isTheSameClassCall" for correct verifying of function calls (kubawerlos) -* bug #4641 Add typed properties test to VisibilityRequiredFixerTest (GawainLynch, julienfalque) -* bug #4654 ArrayIndentationFixer - Fix array indentation for multiline values (julienfalque) -* bug #4660 TokensAnalyzer::isConstantInvocation - fix for extending multiple interfaces (kubawerlos) -* bug #4668 TokensAnalyzer::isConstantInvocation - fix for interface method return type (kubawerlos) -* minor #4608 Allow Symfony 5 components (l-vo) -* minor #4622 Disallow PHP 7.4 failures on Travis CI (julienfalque) -* minor #4637 PHP 7.4 integration test (GawainLynch, julienfalque) -* minor #4643 DX: Update .gitattributes and move ci-integration.sh to root of the project (kubawerlos, keradus) -* minor #4645 Check PHP extensions on runtime (kubawerlos) -* minor #4655 Improve docs - README (mvorisek) -* minor #4662 DX: generate headers in README.rst (kubawerlos) -* minor #4669 Enable execution under PHP 7.4 (keradus) -* minor #4671 TravisTest - rewrite tests to allow last supported by tool PHP version to be snapshot (keradus) - -Changelog for v2.15.4 ---------------------- - -* bug #4183 IndentationTypeFixer - fix handling 2 spaces indent (kubawerlos) -* bug #4406 NoSuperfluousElseifFixer - fix invalid escape sequence in character class (remicollet, SpacePossum) -* bug #4416 NoUnusedImports - Fix imports detected as used in namespaces (julienfalque, SpacePossum) -* bug #4518 PhpUnitNoExpectationAnnotationFixer - fix handling expect empty exception message (ktomk) -* bug #4548 HeredocIndentationFixer - remove whitespace in empty lines (gharlan) -* bug #4556 ClassKeywordRemoveFixer - fix for self,static and parent keywords (kubawerlos) -* bug #4572 TokensAnalyzer - handle nested anonymous classes (SpacePossum) -* bug #4573 CombineConsecutiveIssetsFixer - fix stop based on precedence (SpacePossum) -* bug #4577 Fix command exit code on lint error after fixing fix. (SpacePossum) -* bug #4581 FunctionsAnalyzer: fix for comment in type (kubawerlos) -* bug #4586 BracesFixer - handle dynamic static method call (SpacePossum) -* bug #4594 Braces - fix both single line comment styles (SpacePossum) -* bug #4609 PhpdocTypesOrderFixer - Prevent unexpected default value change (laurent35240) -* minor #4458 Add PHPStan (julienfalque) -* minor #4479 IncludeFixer - remove braces when the statement is wrapped in block (kubawerlos) -* minor #4490 Allow running if installed as project specific (ticktackk) -* minor #4517 Verify PCRE pattern before use (ktomk) -* minor #4521 Remove superfluous leading backslash, closes 4520 (ktomk) -* minor #4532 DX: ensure data providers are used (kubawerlos) -* minor #4534 Redo PHP7.4 - Add "str_split" => "mb_str_split" mapping (keradus, Slamdunk) -* minor #4536 DX: use PHIVE for dev tools (keradus) -* minor #4538 Docs: update Cookbook (keradus) -* minor #4541 Enhancement: Use default name property to configure command names (localheinz) -* minor #4546 DX: removing unnecessary variable initialization (kubawerlos) -* minor #4549 DX: use ::class whenever possible (keradus, kubawerlos) -* minor #4550 DX: travis_retry for dev-tools install (ktomk, keradus) -* minor #4559 Allow 7.4snapshot to fail due to a bug on it (kubawerlos) -* minor #4563 GitlabReporter - fix report output (mjanser) -* minor #4564 Move readme-update command to Section 3 (iwasherefirst2) -* minor #4566 Update symfony ruleset (gharlan) -* minor #4570 Command::execute() should always return an integer (derrabus) -* minor #4580 Add suport for true/false return type hints. (SpacePossum) -* minor #4584 Increase PHPStan level to 1 (julienfalque) -* minor #4585 Fix deprecation notices (julienfalque) -* minor #4587 Output details - Explain why a file was skipped (SpacePossum) -* minor #4588 Fix STDIN test when path is one level deep (julienfalque) -* minor #4589 PhpdocToReturnType - Add support for Foo[][] (SpacePossum) -* minor #4593 Ensure compatibility with PHP 7.4 typed properties (julienfalque) -* minor #4595 Import cannot be used after `::` so can be removed (SpacePossum) -* minor #4596 Ensure compatibility with PHP 7.4 numeric literal separator (julienfalque) -* minor #4597 Fix PHP 7.4 deprecation notices (julienfalque) -* minor #4600 Ensure compatibility with PHP 7.4 arrow functions (julienfalque) -* minor #4602 Ensure compatibility with PHP 7.4 spread operator in array expression (julienfalque) -* minor #4603 Ensure compatibility with PHP 7.4 null coalescing assignment operator (julienfalque) -* minor #4606 Configure no_superfluous_phpdoc_tags for Symfony (keradus) -* minor #4610 Travis CI - Update known files list (julienfalque) -* minor #4615 Remove workaround for dev-tools install reg. Phive (ktomk) - -Changelog for v2.15.3 ---------------------- - -* bug #4533 Revert PHP7.4 - Add "str_split" => "mb_str_split" mapping (keradus) -* minor #4264 DX: AutoReview - ensure Travis handle all needed PHP versions (keradus) -* minor #4524 MethodArgumentSpaceFixerTest - make explicit configuration to prevent fail on configuration change (keradus) - -Changelog for v2.15.2 ---------------------- - -* bug #4132 BlankLineAfterNamespaceFixer - do not remove indent, handle comments (kubawerlos) -* bug #4384 MethodArgumentSpaceFixer - fix for on_multiline:ensure_fully_multiline with trailing comma in function call (kubawerlos) -* bug #4404 FileLintingIterator - fix current value on end/invalid (SpacePossum) -* bug #4421 FunctionTypehintSpaceFixer - Ensure single space between type declaration and parameter (localheinz) -* bug #4436 MethodArgumentSpaceFixer - handle misplaced ) (keradus) -* bug #4439 NoLeadingImportSlashFixer - Add space if needed (SpacePossum) -* bug #4440 SimpleToComplexStringVariableFixer - Fix $ bug (dmvdbrugge) -* bug #4453 Fix preg_match error on 7.4snapshot (kubawerlos) -* bug #4461 IsNullFixer - fix null coalescing operator handling (linniksa) -* bug #4467 ToolInfo - fix access to reference without checking existence (black-silence) -* bug #4472 Fix non-static closure unbinding this on PHP 7.4 (kelunik) -* minor #3726 Use Box 3 to build the PHAR (theofidry, keradus) -* minor #4412 PHP 7.4 - Tests for support (SpacePossum) -* minor #4431 DX: test that default config is not passed in RuleSet (kubawerlos) -* minor #4433 DX: test to ensure @PHPUnitMigration rule sets are correctly defined (kubawerlos) -* minor #4445 DX: static call of markTestSkippedOrFail (kubawerlos) -* minor #4463 Add apostrophe to possessive "team's" (ChandlerSwift) -* minor #4471 ReadmeCommandTest - use CommandTester (kubawerlos) -* minor #4477 DX: control names of public methods in test's classes (kubawerlos) -* minor #4483 NewWithBracesFixer - Fix object operator and curly brace open cases (SpacePossum) -* minor #4484 fix typos in README (Sven Ludwig) -* minor #4494 DX: Fix shell script syntax in order to fix Travis builds (drupol) -* minor #4516 DX: Lock binary SCA tools versions (keradus) - -Changelog for v2.15.1 ---------------------- - -* bug #4418 PhpUnitNamespacedFixer - properly translate classes which do not follow translation pattern (ktomk) -* bug #4419 PhpUnitTestCaseStaticMethodCallsFixer - skip anonymous classes and lambda (SpacePossum) -* bug #4420 MethodArgumentSpaceFixer - PHP7.3 trailing commas in function calls (SpacePossum) -* minor #4345 Travis: PHP 7.4 isn't allowed to fail anymore (Slamdunk) -* minor #4403 LowercaseStaticReferenceFixer - Fix invalid PHP version in example (HypeMC) -* minor #4424 DX: cleanup of composer.json - no need for branch-alias (keradus) -* minor #4425 DX: assertions are static, adjust custom assertions (keradus) -* minor #4426 DX: handle deprecations of symfony/event-dispatcher:4.3 (keradus) -* minor #4427 DX: stop using reserved T_FN in code samples (keradus) -* minor #4428 DX: update dev-tools (keradus) -* minor #4429 DX: MethodArgumentSpaceFixerTest - fix hidden merge conflict (keradus) - -Changelog for v2.15.0 ---------------------- - -* feature #3927 Add FinalClassFixer (Slamdunk) -* feature #3939 Add PhpUnitSizeClassFixer (Jefersson Nathan) -* feature #3942 SimpleToComplexStringVariableFixer - Introduction (dmvdbrugge, SpacePossum) -* feature #4113 OrderedInterfacesFixer - Introduction (dmvdbrugge) -* feature #4121 SingleTraitInsertPerStatementFixer - Introduction (SpacePossum) -* feature #4126 NativeFunctionTypeDeclarationCasingFixer - Introduction (SpacePossum) -* feature #4167 PhpUnitMockShortWillReturnFixer - Introduction (michadam-pearson) -* feature #4191 [7.3] NoWhitespaceBeforeCommaInArrayFixer - fix comma after heredoc-end (gharlan) -* feature #4288 Add Gitlab Reporter (hco) -* feature #4328 Add PhpUnitDedicateAssertInternalTypeFixer (Slamdunk) -* feature #4341 [7.3] TrailingCommaInMultilineArrayFixer - fix comma after heredoc-end (gharlan) -* feature #4342 [7.3] MethodArgumentSpaceFixer - fix comma after heredoc-end (gharlan) -* minor #4112 NoSuperfluousPhpdocTagsFixer - Add missing code sample, groom tests (keradus, SpacePossum) -* minor #4360 Add gitlab as output format in the README/help doc. (SpacePossum) -* minor #4386 Add PhpUnitMockShortWillReturnFixer to @Symfony:risky rule set (kubawerlos) -* minor #4398 New ruleset "@PHP73Migration" (gharlan) -* minor #4399 Fix 2.15 line (keradus) - -Changelog for v2.14.6 ---------------------- - -* bug #4533 Revert PHP7.4 - Add "str_split" => "mb_str_split" mapping (keradus) -* minor #4264 DX: AutoReview - ensure Travis handle all needed PHP versions (keradus) -* minor #4524 MethodArgumentSpaceFixerTest - make explicit configuration to prevent fail on configuration change (keradus) - -Changelog for v2.14.5 ---------------------- - -* bug #4132 BlankLineAfterNamespaceFixer - do not remove indent, handle comments (kubawerlos) -* bug #4384 MethodArgumentSpaceFixer - fix for on_multiline:ensure_fully_multiline with trailing comma in function call (kubawerlos) -* bug #4404 FileLintingIterator - fix current value on end/invalid (SpacePossum) -* bug #4421 FunctionTypehintSpaceFixer - Ensure single space between type declaration and parameter (localheinz) -* bug #4436 MethodArgumentSpaceFixer - handle misplaced ) (keradus) -* bug #4439 NoLeadingImportSlashFixer - Add space if needed (SpacePossum) -* bug #4453 Fix preg_match error on 7.4snapshot (kubawerlos) -* bug #4461 IsNullFixer - fix null coalescing operator handling (linniksa) -* bug #4467 ToolInfo - fix access to reference without checking existence (black-silence) -* bug #4472 Fix non-static closure unbinding this on PHP 7.4 (kelunik) -* minor #3726 Use Box 3 to build the PHAR (theofidry, keradus) -* minor #4412 PHP 7.4 - Tests for support (SpacePossum) -* minor #4431 DX: test that default config is not passed in RuleSet (kubawerlos) -* minor #4433 DX: test to ensure @PHPUnitMigration rule sets are correctly defined (kubawerlos) -* minor #4445 DX: static call of markTestSkippedOrFail (kubawerlos) -* minor #4463 Add apostrophe to possessive "team's" (ChandlerSwift) -* minor #4471 ReadmeCommandTest - use CommandTester (kubawerlos) -* minor #4477 DX: control names of public methods in test's classes (kubawerlos) -* minor #4483 NewWithBracesFixer - Fix object operator and curly brace open cases (SpacePossum) -* minor #4484 fix typos in README (Sven Ludwig) -* minor #4494 DX: Fix shell script syntax in order to fix Travis builds (drupol) -* minor #4516 DX: Lock binary SCA tools versions (keradus) - -Changelog for v2.14.4 ---------------------- - -* bug #4418 PhpUnitNamespacedFixer - properly translate classes which do not follow translation pattern (ktomk) -* bug #4419 PhpUnitTestCaseStaticMethodCallsFixer - skip anonymous classes and lambda (SpacePossum) -* bug #4420 MethodArgumentSpaceFixer - PHP7.3 trailing commas in function calls (SpacePossum) -* minor #4345 Travis: PHP 7.4 isn't allowed to fail anymore (Slamdunk) -* minor #4403 LowercaseStaticReferenceFixer - Fix invalid PHP version in example (HypeMC) -* minor #4425 DX: assertions are static, adjust custom assertions (keradus) -* minor #4426 DX: handle deprecations of symfony/event-dispatcher:4.3 (keradus) -* minor #4427 DX: stop using reserved T_FN in code samples (keradus) -* minor #4428 DX: update dev-tools (keradus) - -Changelog for v2.14.3 ---------------------- - -* bug #4298 NoTrailingWhitespaceInCommentFixer - fix for non-Unix line separators (kubawerlos) -* bug #4303 FullyQualifiedStrictTypesFixer - Fix the short type detection when a question mark (nullable) is prefixing it. (drupol) -* bug #4313 SelfAccessorFixer - fix for part qualified class name (kubawerlos, SpacePossum) -* bug #4314 PhpUnitTestCaseStaticMethodCallsFixer - fix for having property with name as method to update (kubawerlos, SpacePossum) -* bug #4316 NoUnsetCastFixer - Test for higher-precedence operators (SpacePossum) -* bug #4327 TokensAnalyzer - add concat operator to list of binary operators (SpacePossum) -* bug #4335 Cache - add indent and line ending to cache signature (dmvdbrugge) -* bug #4344 VoidReturnFixer - handle yield from (SpacePossum) -* bug #4346 BracesFixer - Do not pull close tag onto same line as a comment (SpacePossum) -* bug #4350 StrictParamFixer - Don't detect functions in use statements (bolmstedt) -* bug #4357 Fix short list syntax detection. (SpacePossum) -* bug #4365 Fix output escaping of diff for text format when line is not changed (SpacePossum) -* bug #4370 PhpUnitConstructFixer - Fix handle different casing (SpacePossum) -* bug #4379 ExplicitStringVariableFixer - add test case for variable as an array key (kubawerlos, Slamdunk) -* feature #4337 PhpUnitTestCaseStaticMethodCallsFixer - prepare for PHPUnit 8 (kubawerlos) -* minor #3799 DX: php_unit_test_case_static_method_calls - use default config (keradus) -* minor #4103 NoExtraBlankLinesFixer - fix candidate detection (SpacePossum) -* minor #4245 LineEndingFixer - BracesFixer - Priority (dmvdbrugge) -* minor #4325 Use lowercase mikey179/vfsStream in composer.json (lolli42) -* minor #4336 Collect coverage with PCOV (kubawerlos) -* minor #4338 Fix wording (kmvan, kubawerlos) -* minor #4339 Change BracesFixer to avoid indenting PHP inline braces (alecgeatches) -* minor #4340 Travis: build against 7.4snapshot instead of nightly (Slamdunk) -* minor #4351 code grooming (SpacePossum) -* minor #4353 Add more priority tests (SpacePossum) -* minor #4364 DX: MethodChainingIndentationFixer - remove unneccesary loop (Sijun Zhu) -* minor #4366 Unset the auxillary variable $a (GrahamCampbell) -* minor #4368 Fixed TypeShortNameResolverTest::testResolver (GrahamCampbell) -* minor #4380 PHP7.4 - Add "str_split" => "mb_str_split" mapping. (SpacePossum) -* minor #4381 PHP7.4 - Add support for magic methods (un)serialize. (SpacePossum) -* minor #4393 DX: add missing explicit return types (kubawerlos) - -Changelog for v2.14.2 ---------------------- - -* minor #4306 DX: Drop HHVM conflict on Composer level to help Composer with HHVM compatibility, we still prevent HHVM on runtime (keradus) - -Changelog for v2.14.1 ---------------------- - -* bug #4240 ModernizeTypesCastingFixer - fix for operators with higher precedence (kubawerlos) -* bug #4254 PhpUnitDedicateAssertFixer - fix for count with additional operations (kubawerlos) -* bug #4260 Psr0Fixer and Psr4Fixer - fix for multiple classes in file with anonymous class (kubawerlos) -* bug #4262 FixCommand - fix help (keradus) -* bug #4276 MethodChainingIndentationFixer, ArrayIndentationFixer - Fix priority issue (dmvdbrugge) -* bug #4280 MethodArgumentSpaceFixer - Fix method argument alignment (Billz95) -* bug #4286 IncrementStyleFixer - fix for static statement (kubawerlos) -* bug #4291 ArrayIndentationFixer - Fix indentation after trailing spaces (julienfalque, keradus) -* bug #4292 NoSuperfluousPhpdocTagsFixer - Make null only type not considered superfluous (julienfalque) -* minor #4204 DX: Tokens - do not unregister/register found tokens when collection is not changing (kubawerlos) -* minor #4235 DX: more specific @param types (kubawerlos) -* minor #4263 DX: AppVeyor - bump PHP version (keradus) -* minor #4293 Add official support for PHP 7.3 (keradus) -* minor #4295 DX: MethodArgumentSpaceFixerTest - fix edge case for handling different line ending when only expected code is provided (keradus) -* minor #4296 DX: cleanup testing with fixer config (keradus) -* minor #4299 NativeFunctionInvocationFixer - add array_key_exists (deguif, keradus) -* minor #4300 DX: cleanup testing with fixer config (keradus) - -Changelog for v2.14.0 ---------------------- - -* bug #4220 NativeFunctionInvocationFixer - namespaced strict to remove backslash (kubawerlos) -* feature #3881 Add PhpdocVarAnnotationCorrectOrderFixer (kubawerlos) -* feature #3915 Add HeredocIndentationFixer (gharlan) -* feature #4002 NoSuperfluousPhpdocTagsFixer - Allow `mixed` in superfluous PHPDoc by configuration (MortalFlesh) -* feature #4030 Add get_required_files and user_error aliases (ntzm) -* feature #4043 NativeFunctionInvocationFixer - add option to remove redundant backslashes (kubawerlos) -* feature #4102 Add NoUnsetCastFixer (SpacePossum) -* minor #4025 Add phpdoc_types_order rule to Symfony's ruleset (carusogabriel) -* minor #4213 [7.3] PHP7.3 integration tests (SpacePossum) -* minor #4233 Add official support for PHP 7.3 (keradus) - -Changelog for v2.13.3 ---------------------- - -* bug #4216 Psr4Fixer - fix for multiple classy elements in file (keradus, kubawerlos) -* bug #4217 Psr0Fixer - class with anonymous class (kubawerlos) -* bug #4219 NativeFunctionCasingFixer - handle T_RETURN_REF (kubawerlos) -* bug #4224 FunctionToConstantFixer - handle T_RETURN_REF (SpacePossum) -* bug #4229 IsNullFixer - fix parenthesis not closed (guilliamxavier) -* minor #4193 [7.3] CombineNestedDirnameFixer - support PHP 7.3 (kubawerlos) -* minor #4198 [7.3] PowToExponentiationFixer - adding to PHP7.3 integration test (kubawerlos) -* minor #4199 [7.3] MethodChainingIndentationFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4200 [7.3] ModernizeTypesCastingFixer - support PHP 7.3 (kubawerlos) -* minor #4201 [7.3] MultilineWhitespaceBeforeSemicolonsFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4202 [7.3] ErrorSuppressionFixer - support PHP 7.3 (kubawerlos) -* minor #4205 DX: PhpdocAlignFixer - refactor to use DocBlock (kubawerlos) -* minor #4206 DX: enable multiline_whitespace_before_semicolons (keradus) -* minor #4207 [7.3] RandomApiMigrationFixerTest - tests for 7.3 (SpacePossum) -* minor #4208 [7.3] NativeFunctionCasingFixerTest - tests for 7.3 (SpacePossum) -* minor #4209 [7.3] PhpUnitStrictFixerTest - tests for 7.3 (SpacePossum) -* minor #4210 [7.3] PhpUnitConstructFixer - add test for PHP 7.3 (kubawerlos) -* minor #4211 [7.3] PhpUnitDedicateAssertFixer - support PHP 7.3 (kubawerlos) -* minor #4214 [7.3] NoUnsetOnPropertyFixerTest - tests for 7.3 (SpacePossum) -* minor #4222 [7.3] PhpUnitExpectationFixer - support PHP 7.3 (kubawerlos) -* minor #4223 [7.3] PhpUnitMockFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4230 [7.3] IsNullFixer - fix trailing comma (guilliamxavier) -* minor #4232 DX: remove Utils::splitLines (kubawerlos) -* minor #4234 [7.3] Test that "LITERAL instanceof X" is valid (guilliamxavier) - -Changelog for v2.13.2 ---------------------- - -* bug #3968 SelfAccessorFixer - support FQCN (kubawerlos) -* bug #3974 Psr4Fixer - class with anonymous class (kubawerlos) -* bug #3987 Run HeaderCommentFixer after NoBlankLinesAfterPhpdocFixer (StanAngeloff) -* bug #4009 TypeAlternationTransformer - Fix pipes in function call with constants being classified incorrectly (ntzm, SpacePossum) -* bug #4022 NoUnsetOnPropertyFixer - refactor and bugfixes (kubawerlos) -* bug #4036 ExplicitStringVariableFixer - fixes for backticks and for 2 variables next to each other (kubawerlos, Slamdunk) -* bug #4038 CommentToPhpdocFixer - handling nested PHPDoc (kubawerlos) -* bug #4064 Ignore invalid mode strings, add option to remove the "b" flag. (SpacePossum) -* bug #4071 DX: do not insert Token when calling removeLeadingWhitespace/removeTrailingWhitespace from Tokens (kubawerlos) -* bug #4073 IsNullFixer - fix function detection (kubawerlos) -* bug #4074 FileFilterIterator - do not filter out files that need fixing (SpacePossum) -* bug #4076 EregToPregFixer - fix function detection (kubawerlos) -* bug #4084 MethodChainingIndentation - fix priority with Braces (dmvdbrugge) -* bug #4099 HeaderCommentFixer - throw exception on invalid header configuration (SpacePossum) -* bug #4100 PhpdocAddMissingParamAnnotationFixer - Handle variable number of arguments and pass by reference cases (SpacePossum) -* bug #4101 ReturnAssignmentFixer - do not touch invalid code (SpacePossum) -* bug #4104 Change transformers order, fixing untransformed T_USE (dmvdbrugge) -* bug #4107 Preg::split - fix for non-UTF8 subject (ostrolucky, kubawerlos) -* bug #4109 NoBlankLines*: fix removing lines consisting only of spaces (kubawerlos, keradus) -* bug #4114 VisibilityRequiredFixer - don't remove comments (kubawerlos) -* bug #4116 OrderedImportsFixer - fix sorting without any grouping (SpacePossum) -* bug #4119 PhpUnitNoExpectationAnnotationFixer - fix extracting content from annotation (kubawerlos) -* bug #4127 LowercaseConstantsFixer - Fix case with properties using constants as their name (srathbone) -* bug #4134 [7.3] SquareBraceTransformer - nested array destructuring not handled correctly (SpacePossum) -* bug #4153 PhpUnitFqcnAnnotationFixer - handle only PhpUnit classes (kubawerlos) -* bug #4169 DirConstantFixer - Fixes for PHP7.3 syntax (SpacePossum) -* bug #4181 MultilineCommentOpeningClosingFixer - fix handling empty comment (kubawerlos) -* bug #4186 Tokens - fix removal of leading/trailing whitespace with empty token in collection (kubawerlos) -* minor #3436 Add a handful of integration tests (BackEndTea) -* minor #3774 PhpUnitTestClassRequiresCoversFixer - Remove unneeded loop and use phpunit indicator class (BackEndTea, SpacePossum) -* minor #3778 DX: Throw an exception if FileReader::read fails (ntzm) -* minor #3916 New ruleset "@PhpCsFixer" (gharlan) -* minor #4007 Fixes cookbook for fixers (greeflas) -* minor #4031 Correct FixerOptionBuilder::getOption return type (ntzm) -* minor #4046 Token - Added fast isset() path to token->equals() (staabm) -* minor #4047 Token - inline $other->getPrototype() to speedup equals() (staabm, keradus) -* minor #4048 Tokens - inlined extractTokenKind() call on the hot path (staabm) -* minor #4069 DX: Add dev-tools directory to gitattributes as export-ignore (alexmanno) -* minor #4070 Docs: Add link to a VS Code extension in readme (jakebathman) -* minor #4077 DX: cleanup - NoAliasFunctionsFixer - use FunctionsAnalyzer (kubawerlos) -* minor #4088 Add Travis test with strict types (kubawerlos) -* minor #4091 Adjust misleading sentence in CONTRIBUTING.md (ostrolucky) -* minor #4092 UseTransformer - simplify/optimize (SpacePossum) -* minor #4095 DX: Use ::class (keradus) -* minor #4096 DX: fixing typo (kubawerlos) -* minor #4097 DX: namespace casing (kubawerlos) -* minor #4110 Enhancement: Update localheinz/composer-normalize (localheinz) -* minor #4115 Changes for upcoming Travis' infra migration (sergeyklay) -* minor #4122 DX: AppVeyor - Update Composer download link (SpacePossum) -* minor #4128 DX: cleanup - AbstractFunctionReferenceFixer - use FunctionsAnalyzer (SpacePossum, kubawerlos) -* minor #4129 Fix: Symfony 4.2 deprecations (kubawerlos) -* minor #4139 DX: Fix CircleCI (kubawerlos) -* minor #4142 [7.3] NoAliasFunctionsFixer - mbregex_encoding' => 'mb_regex_encoding (SpacePossum) -* minor #4143 PhpUnitTestCaseStaticMethodCallsFixer - Add PHPUnit 7.5 new assertions (Slamdunk) -* minor #4149 [7.3] ArgumentsAnalyzer - PHP7.3 support (SpacePossum) -* minor #4161 DX: CI - show packages installed via Composer (keradus) -* minor #4162 DX: Drop symfony/lts (keradus) -* minor #4166 DX: do not use AbstractFunctionReferenceFixer when no need to (kubawerlos) -* minor #4168 DX: FopenFlagsFixer - remove useless proxy method (SpacePossum) -* minor #4171 Fix CircleCI cache (kubawerlos) -* minor #4173 [7.3] PowToExponentiationFixer - add support for PHP7.3 (SpacePossum) -* minor #4175 Fixing typo (kubawerlos) -* minor #4177 CI: Check that tag is matching version of PHP CS Fixer during deployment (keradus) -* minor #4180 Fixing typo (kubawerlos) -* minor #4182 DX: update php-cs-fixer file style (kubawerlos) -* minor #4185 [7.3] ImplodeCallFixer - add tests for PHP7.3 (kubawerlos) -* minor #4187 [7.3] IsNullFixer - support PHP 7.3 (kubawerlos) -* minor #4188 DX: cleanup (keradus) -* minor #4189 Travis - add PHP 7.3 job (keradus) -* minor #4190 Travis CI - fix config (kubawerlos) -* minor #4192 [7.3] MagicMethodCasingFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4194 [7.3] NativeFunctionInvocationFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4195 [7.3] SetTypeToCastFixer - support PHP 7.3 (kubawerlos) -* minor #4196 Update website (keradus) -* minor #4197 [7.3] StrictParamFixer - support PHP 7.3 (kubawerlos) - -Changelog for v2.13.1 ---------------------- - -* bug #3977 NoSuperfluousPhpdocTagsFixer - Fix handling of description with variable (julienfalque) -* bug #4027 PhpdocAnnotationWithoutDotFixer - add failing cases (keradus) -* bug #4028 PhpdocNoEmptyReturnFixer - handle single line PHPDoc (kubawerlos) -* bug #4034 PhpUnitTestCaseIndicator - handle anonymous class (kubawerlos) -* bug #4037 NativeFunctionInvocationFixer - fix function detection (kubawerlos) -* feature #4019 PhpdocTypesFixer - allow for configuration (keradus) -* minor #3980 Clarifies allow-risky usage (josephzidell) -* minor #4016 Bump console component due to it's bug (keradus) -* minor #4023 Enhancement: Update localheinz/composer-normalize (localheinz) -* minor #4049 use parent::offset*() methods when moving items around in insertAt() (staabm) - -Changelog for v2.13.0 ---------------------- - -* feature #3739 Add MagicMethodCasingFixer (SpacePossum) -* feature #3812 Add FopenFlagOrderFixer & FopenFlagsFixer (SpacePossum) -* feature #3826 Add CombineNestedDirnameFixer (gharlan) -* feature #3833 BinaryOperatorSpacesFixer - Add "no space" fix strategy (SpacePossum) -* feature #3841 NoAliasFunctionsFixer - add opt in option for ext-mbstring aliasses (SpacePossum) -* feature #3876 NativeConstantInvocationFixer - add the scope option (stof, keradus) -* feature #3886 Add PhpUnitMethodCasingFixer (Slamdunk) -* feature #3907 Add ImplodeCallFixer (kubawerlos) -* feature #3914 NoUnreachableDefaultArgumentValueFixer - remove `null` for nullable typehints (gharlan, keradus) -* minor #3813 PhpUnitDedicateAssertFixer - fix "sizeOf" same as "count". (SpacePossum) -* minor #3873 Add the native_function_invocation fixer in the Symfony:risky ruleset (stof) -* minor #3979 DX: enable php_unit_method_casing (keradus) - -Changelog for v2.12.12 ----------------------- - -* bug #4533 Revert PHP7.4 - Add "str_split" => "mb_str_split" mapping (keradus) -* minor #4264 DX: AutoReview - ensure Travis handle all needed PHP versions (keradus) -* minor #4524 MethodArgumentSpaceFixerTest - make explicit configuration to prevent fail on configuration change (keradus) - -Changelog for v2.12.11 ----------------------- - -* bug #4132 BlankLineAfterNamespaceFixer - do not remove indent, handle comments (kubawerlos) -* bug #4384 MethodArgumentSpaceFixer - fix for on_multiline:ensure_fully_multiline with trailing comma in function call (kubawerlos) -* bug #4404 FileLintingIterator - fix current value on end/invalid (SpacePossum) -* bug #4421 FunctionTypehintSpaceFixer - Ensure single space between type declaration and parameter (localheinz) -* bug #4436 MethodArgumentSpaceFixer - handle misplaced ) (keradus) -* bug #4439 NoLeadingImportSlashFixer - Add space if needed (SpacePossum) -* bug #4453 Fix preg_match error on 7.4snapshot (kubawerlos) -* bug #4461 IsNullFixer - fix null coalescing operator handling (linniksa) -* bug #4467 ToolInfo - fix access to reference without checking existence (black-silence) -* bug #4472 Fix non-static closure unbinding this on PHP 7.4 (kelunik) -* minor #3726 Use Box 3 to build the PHAR (theofidry, keradus) -* minor #4412 PHP 7.4 - Tests for support (SpacePossum) -* minor #4431 DX: test that default config is not passed in RuleSet (kubawerlos) -* minor #4433 DX: test to ensure @PHPUnitMigration rule sets are correctly defined (kubawerlos) -* minor #4445 DX: static call of markTestSkippedOrFail (kubawerlos) -* minor #4463 Add apostrophe to possessive "team's" (ChandlerSwift) -* minor #4471 ReadmeCommandTest - use CommandTester (kubawerlos) -* minor #4477 DX: control names of public methods in test's classes (kubawerlos) -* minor #4483 NewWithBracesFixer - Fix object operator and curly brace open cases (SpacePossum) -* minor #4484 fix typos in README (Sven Ludwig) -* minor #4494 DX: Fix shell script syntax in order to fix Travis builds (drupol) -* minor #4516 DX: Lock binary SCA tools versions (keradus) - -Changelog for v2.12.10 ----------------------- - -* bug #4418 PhpUnitNamespacedFixer - properly translate classes which do not follow translation pattern (ktomk) -* bug #4419 PhpUnitTestCaseStaticMethodCallsFixer - skip anonymous classes and lambda (SpacePossum) -* bug #4420 MethodArgumentSpaceFixer - PHP7.3 trailing commas in function calls (SpacePossum) -* minor #4345 Travis: PHP 7.4 isn't allowed to fail anymore (Slamdunk) -* minor #4403 LowercaseStaticReferenceFixer - Fix invalid PHP version in example (HypeMC) -* minor #4425 DX: assertions are static, adjust custom assertions (keradus) -* minor #4426 DX: handle deprecations of symfony/event-dispatcher:4.3 (keradus) -* minor #4427 DX: stop using reserved T_FN in code samples (keradus) - -Changelog for v2.12.9 ---------------------- - -* bug #4298 NoTrailingWhitespaceInCommentFixer - fix for non-Unix line separators (kubawerlos) -* bug #4303 FullyQualifiedStrictTypesFixer - Fix the short type detection when a question mark (nullable) is prefixing it. (drupol) -* bug #4313 SelfAccessorFixer - fix for part qualified class name (kubawerlos, SpacePossum) -* bug #4314 PhpUnitTestCaseStaticMethodCallsFixer - fix for having property with name as method to update (kubawerlos, SpacePossum) -* bug #4327 TokensAnalyzer - add concat operator to list of binary operators (SpacePossum) -* bug #4335 Cache - add indent and line ending to cache signature (dmvdbrugge) -* bug #4344 VoidReturnFixer - handle yield from (SpacePossum) -* bug #4346 BracesFixer - Do not pull close tag onto same line as a comment (SpacePossum) -* bug #4350 StrictParamFixer - Don't detect functions in use statements (bolmstedt) -* bug #4357 Fix short list syntax detection. (SpacePossum) -* bug #4365 Fix output escaping of diff for text format when line is not changed (SpacePossum) -* bug #4370 PhpUnitConstructFixer - Fix handle different casing (SpacePossum) -* bug #4379 ExplicitStringVariableFixer - add test case for variable as an array key (kubawerlos, Slamdunk) -* feature #4337 PhpUnitTestCaseStaticMethodCallsFixer - prepare for PHPUnit 8 (kubawerlos) -* minor #3799 DX: php_unit_test_case_static_method_calls - use default config (keradus) -* minor #4103 NoExtraBlankLinesFixer - fix candidate detection (SpacePossum) -* minor #4245 LineEndingFixer - BracesFixer - Priority (dmvdbrugge) -* minor #4325 Use lowercase mikey179/vfsStream in composer.json (lolli42) -* minor #4336 Collect coverage with PCOV (kubawerlos) -* minor #4338 Fix wording (kmvan, kubawerlos) -* minor #4339 Change BracesFixer to avoid indenting PHP inline braces (alecgeatches) -* minor #4340 Travis: build against 7.4snapshot instead of nightly (Slamdunk) -* minor #4351 code grooming (SpacePossum) -* minor #4353 Add more priority tests (SpacePossum) -* minor #4364 DX: MethodChainingIndentationFixer - remove unneccesary loop (Sijun Zhu) -* minor #4366 Unset the auxillary variable $a (GrahamCampbell) -* minor #4368 Fixed TypeShortNameResolverTest::testResolver (GrahamCampbell) -* minor #4380 PHP7.4 - Add "str_split" => "mb_str_split" mapping. (SpacePossum) -* minor #4393 DX: add missing explicit return types (kubawerlos) - -Changelog for v2.12.8 ---------------------- - -* minor #4306 DX: Drop HHVM conflict on Composer level to help Composer with HHVM compatibility, we still prevent HHVM on runtime (keradus) - -Changelog for v2.12.7 ---------------------- - -* bug #4240 ModernizeTypesCastingFixer - fix for operators with higher precedence (kubawerlos) -* bug #4254 PhpUnitDedicateAssertFixer - fix for count with additional operations (kubawerlos) -* bug #4260 Psr0Fixer and Psr4Fixer - fix for multiple classes in file with anonymous class (kubawerlos) -* bug #4262 FixCommand - fix help (keradus) -* bug #4276 MethodChainingIndentationFixer, ArrayIndentationFixer - Fix priority issue (dmvdbrugge) -* bug #4280 MethodArgumentSpaceFixer - Fix method argument alignment (Billz95) -* bug #4286 IncrementStyleFixer - fix for static statement (kubawerlos) -* bug #4291 ArrayIndentationFixer - Fix indentation after trailing spaces (julienfalque, keradus) -* bug #4292 NoSuperfluousPhpdocTagsFixer - Make null only type not considered superfluous (julienfalque) -* minor #4204 DX: Tokens - do not unregister/register found tokens when collection is not changing (kubawerlos) -* minor #4235 DX: more specific @param types (kubawerlos) -* minor #4263 DX: AppVeyor - bump PHP version (keradus) -* minor #4293 Add official support for PHP 7.3 (keradus) -* minor #4295 DX: MethodArgumentSpaceFixerTest - fix edge case for handling different line ending when only expected code is provided (keradus) -* minor #4296 DX: cleanup testing with fixer config (keradus) -* minor #4299 NativeFunctionInvocationFixer - add array_key_exists (deguif, keradus) - -Changelog for v2.12.6 ---------------------- - -* bug #4216 Psr4Fixer - fix for multiple classy elements in file (keradus, kubawerlos) -* bug #4217 Psr0Fixer - class with anonymous class (kubawerlos) -* bug #4219 NativeFunctionCasingFixer - handle T_RETURN_REF (kubawerlos) -* bug #4224 FunctionToConstantFixer - handle T_RETURN_REF (SpacePossum) -* bug #4229 IsNullFixer - fix parenthesis not closed (guilliamxavier) -* minor #4198 [7.3] PowToExponentiationFixer - adding to PHP7.3 integration test (kubawerlos) -* minor #4199 [7.3] MethodChainingIndentationFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4200 [7.3] ModernizeTypesCastingFixer - support PHP 7.3 (kubawerlos) -* minor #4201 [7.3] MultilineWhitespaceBeforeSemicolonsFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4202 [7.3] ErrorSuppressionFixer - support PHP 7.3 (kubawerlos) -* minor #4205 DX: PhpdocAlignFixer - refactor to use DocBlock (kubawerlos) -* minor #4206 DX: enable multiline_whitespace_before_semicolons (keradus) -* minor #4207 [7.3] RandomApiMigrationFixerTest - tests for 7.3 (SpacePossum) -* minor #4208 [7.3] NativeFunctionCasingFixerTest - tests for 7.3 (SpacePossum) -* minor #4209 [7.3] PhpUnitStrictFixerTest - tests for 7.3 (SpacePossum) -* minor #4210 [7.3] PhpUnitConstructFixer - add test for PHP 7.3 (kubawerlos) -* minor #4211 [7.3] PhpUnitDedicateAssertFixer - support PHP 7.3 (kubawerlos) -* minor #4214 [7.3] NoUnsetOnPropertyFixerTest - tests for 7.3 (SpacePossum) -* minor #4222 [7.3] PhpUnitExpectationFixer - support PHP 7.3 (kubawerlos) -* minor #4223 [7.3] PhpUnitMockFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4230 [7.3] IsNullFixer - fix trailing comma (guilliamxavier) -* minor #4232 DX: remove Utils::splitLines (kubawerlos) -* minor #4234 [7.3] Test that "LITERAL instanceof X" is valid (guilliamxavier) - -Changelog for v2.12.5 ---------------------- - -* bug #3968 SelfAccessorFixer - support FQCN (kubawerlos) -* bug #3974 Psr4Fixer - class with anonymous class (kubawerlos) -* bug #3987 Run HeaderCommentFixer after NoBlankLinesAfterPhpdocFixer (StanAngeloff) -* bug #4009 TypeAlternationTransformer - Fix pipes in function call with constants being classified incorrectly (ntzm, SpacePossum) -* bug #4022 NoUnsetOnPropertyFixer - refactor and bugfixes (kubawerlos) -* bug #4036 ExplicitStringVariableFixer - fixes for backticks and for 2 variables next to each other (kubawerlos, Slamdunk) -* bug #4038 CommentToPhpdocFixer - handling nested PHPDoc (kubawerlos) -* bug #4071 DX: do not insert Token when calling removeLeadingWhitespace/removeTrailingWhitespace from Tokens (kubawerlos) -* bug #4073 IsNullFixer - fix function detection (kubawerlos) -* bug #4074 FileFilterIterator - do not filter out files that need fixing (SpacePossum) -* bug #4076 EregToPregFixer - fix function detection (kubawerlos) -* bug #4084 MethodChainingIndentation - fix priority with Braces (dmvdbrugge) -* bug #4099 HeaderCommentFixer - throw exception on invalid header configuration (SpacePossum) -* bug #4100 PhpdocAddMissingParamAnnotationFixer - Handle variable number of arguments and pass by reference cases (SpacePossum) -* bug #4101 ReturnAssignmentFixer - do not touch invalid code (SpacePossum) -* bug #4104 Change transformers order, fixing untransformed T_USE (dmvdbrugge) -* bug #4107 Preg::split - fix for non-UTF8 subject (ostrolucky, kubawerlos) -* bug #4109 NoBlankLines*: fix removing lines consisting only of spaces (kubawerlos, keradus) -* bug #4114 VisibilityRequiredFixer - don't remove comments (kubawerlos) -* bug #4116 OrderedImportsFixer - fix sorting without any grouping (SpacePossum) -* bug #4119 PhpUnitNoExpectationAnnotationFixer - fix extracting content from annotation (kubawerlos) -* bug #4127 LowercaseConstantsFixer - Fix case with properties using constants as their name (srathbone) -* bug #4134 [7.3] SquareBraceTransformer - nested array destructuring not handled correctly (SpacePossum) -* bug #4153 PhpUnitFqcnAnnotationFixer - handle only PhpUnit classes (kubawerlos) -* bug #4169 DirConstantFixer - Fixes for PHP7.3 syntax (SpacePossum) -* bug #4181 MultilineCommentOpeningClosingFixer - fix handling empty comment (kubawerlos) -* bug #4186 Tokens - fix removal of leading/trailing whitespace with empty token in collection (kubawerlos) -* minor #3436 Add a handful of integration tests (BackEndTea) -* minor #3774 PhpUnitTestClassRequiresCoversFixer - Remove unneeded loop and use phpunit indicator class (BackEndTea, SpacePossum) -* minor #3778 DX: Throw an exception if FileReader::read fails (ntzm) -* minor #3916 New ruleset "@PhpCsFixer" (gharlan) -* minor #4007 Fixes cookbook for fixers (greeflas) -* minor #4031 Correct FixerOptionBuilder::getOption return type (ntzm) -* minor #4046 Token - Added fast isset() path to token->equals() (staabm) -* minor #4047 Token - inline $other->getPrototype() to speedup equals() (staabm, keradus) -* minor #4048 Tokens - inlined extractTokenKind() call on the hot path (staabm) -* minor #4069 DX: Add dev-tools directory to gitattributes as export-ignore (alexmanno) -* minor #4070 Docs: Add link to a VS Code extension in readme (jakebathman) -* minor #4077 DX: cleanup - NoAliasFunctionsFixer - use FunctionsAnalyzer (kubawerlos) -* minor #4088 Add Travis test with strict types (kubawerlos) -* minor #4091 Adjust misleading sentence in CONTRIBUTING.md (ostrolucky) -* minor #4092 UseTransformer - simplify/optimize (SpacePossum) -* minor #4095 DX: Use ::class (keradus) -* minor #4097 DX: namespace casing (kubawerlos) -* minor #4110 Enhancement: Update localheinz/composer-normalize (localheinz) -* minor #4115 Changes for upcoming Travis' infra migration (sergeyklay) -* minor #4122 DX: AppVeyor - Update Composer download link (SpacePossum) -* minor #4128 DX: cleanup - AbstractFunctionReferenceFixer - use FunctionsAnalyzer (SpacePossum, kubawerlos) -* minor #4129 Fix: Symfony 4.2 deprecations (kubawerlos) -* minor #4139 DX: Fix CircleCI (kubawerlos) -* minor #4143 PhpUnitTestCaseStaticMethodCallsFixer - Add PHPUnit 7.5 new assertions (Slamdunk) -* minor #4149 [7.3] ArgumentsAnalyzer - PHP7.3 support (SpacePossum) -* minor #4161 DX: CI - show packages installed via Composer (keradus) -* minor #4162 DX: Drop symfony/lts (keradus) -* minor #4166 DX: do not use AbstractFunctionReferenceFixer when no need to (kubawerlos) -* minor #4171 Fix CircleCI cache (kubawerlos) -* minor #4173 [7.3] PowToExponentiationFixer - add support for PHP7.3 (SpacePossum) -* minor #4175 Fixing typo (kubawerlos) -* minor #4177 CI: Check that tag is matching version of PHP CS Fixer during deployment (keradus) -* minor #4182 DX: update php-cs-fixer file style (kubawerlos) -* minor #4187 [7.3] IsNullFixer - support PHP 7.3 (kubawerlos) -* minor #4188 DX: cleanup (keradus) -* minor #4189 Travis - add PHP 7.3 job (keradus) -* minor #4190 Travis CI - fix config (kubawerlos) -* minor #4194 [7.3] NativeFunctionInvocationFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4195 [7.3] SetTypeToCastFixer - support PHP 7.3 (kubawerlos) -* minor #4196 Update website (keradus) -* minor #4197 [7.3] StrictParamFixer - support PHP 7.3 (kubawerlos) - -Changelog for v2.12.4 ---------------------- - -* bug #3977 NoSuperfluousPhpdocTagsFixer - Fix handling of description with variable (julienfalque) -* bug #4027 PhpdocAnnotationWithoutDotFixer - add failing cases (keradus) -* bug #4028 PhpdocNoEmptyReturnFixer - handle single line PHPDoc (kubawerlos) -* bug #4034 PhpUnitTestCaseIndicator - handle anonymous class (kubawerlos) -* bug #4037 NativeFunctionInvocationFixer - fix function detection (kubawerlos) -* feature #4019 PhpdocTypesFixer - allow for configuration (keradus) -* minor #3980 Clarifies allow-risky usage (josephzidell) -* minor #4016 Bump console component due to it's bug (keradus) -* minor #4023 Enhancement: Update localheinz/composer-normalize (localheinz) -* minor #4049 use parent::offset*() methods when moving items around in insertAt() (staabm) - -Changelog for v2.12.3 ---------------------- - -* bug #3867 PhpdocAnnotationWithoutDotFixer - Handle trailing whitespaces (kubawerlos) -* bug #3884 NoSuperfluousPhpdocTagsFixer - handle null in every position (dmvdbrugge, julienfalque) -* bug #3885 AlignMultilineCommentFixer - ArrayIndentationFixer - Priority (dmvdbrugge) -* bug #3887 ArrayIndentFixer - Don't indent empty lines (dmvdbrugge) -* bug #3888 NoExtraBlankLinesFixer - remove blank lines after open tag (kubawerlos) -* bug #3890 StrictParamFixer - make it case-insensitive (kubawerlos) -* bug #3895 FunctionsAnalyzer - false positive for constant and function definition (kubawerlos) -* bug #3908 StrictParamFixer - fix edge case (kubawerlos) -* bug #3910 FunctionsAnalyzer - fix isGlobalFunctionCall (gharlan) -* bug #3912 FullyQualifiedStrictTypesFixer - NoSuperfluousPhpdocTagsFixer - adjust priority (dmvdbrugge) -* bug #3913 TokensAnalyzer - fix isConstantInvocation (gharlan, keradus) -* bug #3921 TypeAnalysis - Fix iterable not being detected as a reserved type (ntzm) -* bug #3924 FullyQualifiedStrictTypesFixer - space bug (dmvdbrugge) -* bug #3937 LowercaseStaticReferenceFixer - Fix "Parent" word in namespace (kubawerlos) -* bug #3944 ExplicitStringVariableFixer - fix array handling (gharlan) -* bug #3951 NoSuperfluousPhpdocTagsFixer - do not call strtolower with null (SpacePossum) -* bug #3954 NoSuperfluousPhpdocTagsFixer - Index invalid or out of range (kubawerlos) -* bug #3957 NoTrailingWhitespaceFixer - trim space after opening tag (kubawerlos) -* minor #3798 DX: enable native_function_invocation (keradus) -* minor #3882 PhpdocAnnotationWithoutDotFixer - Handle empty line in comment (kubawerlos) -* minor #3889 DX: Cleanup - remove unused variables (kubawerlos, SpacePossum) -* minor #3891 PhpdocNoEmptyReturnFixer - account for null[] (dmvdbrugge) -* minor #3892 PhpdocNoEmptyReturnFixer - fix docs (keradus) -* minor #3897 DX: FunctionsAnalyzer - simplifying return expression (kubawerlos) -* minor #3903 DX: cleanup - remove special treatment for PHP <5.6 (kubawerlos) -* minor #3905 DX: Upgrade composer-require-checker to stable version (keradus) -* minor #3919 Simplify single uses of Token::isGivenKind (ntzm) -* minor #3920 Docs: Fix typo (ntzm) -* minor #3940 DX: fix phpdoc parameter type (malukenho) -* minor #3948 DX: cleanup - remove redundant @param annotations (kubawerlos) -* minor #3950 Circle CI v2 yml (siad007) -* minor #3952 DX: AbstractFixerTestCase - drop testing method already provided by trait (keradus) -* minor #3973 Bump xdebug-handler (keradus) - -Changelog for v2.12.2 ---------------------- - -* bug #3823 NativeConstantInvocationFixer - better constant detection (gharlan, SpacePossum, keradus) -* bug #3832 "yield from" as keyword (SpacePossum) -* bug #3835 Fix priority between PHPDoc return type fixers (julienfalque, keradus) -* bug #3839 MethodArgumentSpaceFixer - add empty line incorrectly (SpacePossum) -* bug #3866 SpaceAfterSemicolonFixer - loop over all tokens (SpacePossum) -* minor #3817 Update integrations tests (SpacePossum) -* minor #3829 Fix typos in changelog (mnabialek) -* minor #3848 Add install/update instructions for PHIVE to the README (SpacePossum) -* minor #3877 NamespacesAnalyzer - Optimize performance (stof) -* minor #3878 NativeFunctionInvocationFixer - use the NamespacesAnalyzer to remove duplicated code (stof) - -Changelog for v2.12.1 ---------------------- - -* bug #3808 LowercaseStaticReferenceFixer - Fix constants handling (kubawerlos, keradus) -* bug #3815 NoSuperfluousPhpdocTagsFixer - support array/callable type hints (gharlan) -* minor #3824 DX: Support PHPUnit 7.2 (keradus) -* minor #3825 UX: Provide full diff for code samples (keradus) - -Changelog for v2.12.0 ---------------------- - -* feature #2577 Add LogicalOperatorsFixer (hkdobrev, keradus) -* feature #3060 Add ErrorSuppressionFixer (kubawerlos) -* feature #3127 Add NativeConstantInvocationFixer (Slamdunk, keradus) -* feature #3223 NativeFunctionInvocationFixer - add namespace scope and include sets (SpacePossum) -* feature #3453 PhpdocAlignFixer - add align option (robert.ahmerov) -* feature #3476 Add PhpUnitTestCaseStaticMethodCallsFixer (Slamdunk, keradus) -* feature #3524 MethodArgumentSpaceFixer - Add ensure_single_line option (julienfalque, keradus) -* feature #3534 MultilineWhitespaceBeforeSemicolonsFixer - support static calls (ntzm) -* feature #3585 Add ReturnAssignmentFixer (SpacePossum, keradus) -* feature #3640 Add PhpdocToReturnTypeFixer (Slamdunk, keradus) -* feature #3691 Add PhpdocTrimAfterDescriptionFixer (nobuf, keradus) -* feature #3698 YodaStyleFixer - Add always_move_variable option (julienfalque, SpacePossum) -* feature #3709 Add SetTypeToCastFixer (SpacePossum) -* feature #3724 BlankLineBeforeStatementFixer - Add case and default as options (dmvdbrugge) -* feature #3734 Add NoSuperfluousPhpdocTagsFixer (julienfalque) -* feature #3735 Add LowercaseStaticReferenceFixer (kubawerlos, SpacePossum) -* feature #3737 Add NoUnsetOnPropertyFixer (BackEndTea, SpacePossum) -* feature #3745 Add PhpUnitInternalClassFixer (BackEndTea, SpacePossum, keradus) -* feature #3766 Add NoBinaryStringFixer (ntzm, SpacePossum, keradus) -* feature #3780 ShortScalarCastFixer - Change binary cast to string cast as well (ntzm) -* feature #3785 PhpUnitDedicateAssertFixer - fix to assertCount too (SpacePossum) -* feature #3802 Convert PhpdocTrimAfterDescriptionFixer into PhpdocTrimConsecutiveBlankLineSeparationFixer (keradus) -* minor #3738 ReturnAssignmentFixer description update (kubawerlos) -* minor #3761 Application: when run with FUTURE_MODE, error_reporting(-1) is done in entry file instead (keradus) -* minor #3772 DX: use PhpUnitTestCaseIndicator->isPhpUnitClass to discover PHPUnit classes (keradus) -* minor #3783 CI: Split COLLECT_COVERAGE job (keradus) -* minor #3789 DX: ProjectCodeTest.testThatDataProvidersAreCorrectlyNamed - performance optimization (keradus) -* minor #3791 DX: Fix collecting code coverage (keradus) -* minor #3792 DX: Upgrade DX deps (keradus) -* minor #3797 DX: ProjectCodeTest - shall not depends on xdebug/phpdbg anymore (keradus, SpacePossum) -* minor #3800 Symfony:risky ruleset: include set_type_to_cast rule (keradus) -* minor #3801 NativeFunctionInvocationFixer - fix buggy config validation (keradus, SpacePossum) - -Changelog for v2.11.2 ---------------------- - -* bug #3233 PhpdocAlignFixer - Fix linebreak inconsistency (SpacePossum, keradus) -* bug #3445 Rewrite NoUnusedImportsFixer (kubawerlos, julienfalque) -* bug #3528 MethodChainingIndentationFixer - nested params bugfix (Slamdunk) -* bug #3547 MultilineWhitespaceBeforeSemicolonsFixer - chained call for a return fix (egircys, keradus) -* bug #3597 DeclareStrictTypesFixer - fix bug of removing line (kubawerlos, keradus) -* bug #3605 DoctrineAnnotationIndentationFixer - Fix indentation with mixed lines (julienfalque) -* bug #3606 PhpdocToCommentFixer - allow multiple ( (SpacePossum) -* bug #3614 Refactor PhpdocToCommentFixer - extract checking to CommentsAnalyzer (kubawerlos) -* bug #3668 Rewrite NoUnusedImportsFixer (kubawerlos, julienfalque) -* bug #3670 PhpdocTypesOrderFixer - Fix ordering of nested generics (julienfalque) -* bug #3671 ArrayIndentationFixer - Fix indentation in HTML (julienfalque) -* bug #3673 PhpdocScalarFixer - Add "types" option (julienfalque, keradus) -* bug #3674 YodaStyleFixer - Fix variable detection for multidimensional arrays (julienfalque, SpacePossum) -* bug #3684 PhpUnitStrictFixer - Do not fix if not correct # of arguments are used (SpacePossum) -* bug #3708 EspaceImplicitBackslashesFixer - Fix escaping multiple backslashes (julienfalque) -* bug #3715 SingleImportPerStatementFixer - Fix handling whitespace before opening brace (julienfalque) -* bug #3731 PhpdocIndentFixer - crash fix (SpacePossum) -* bug #3755 YodaStyleFixer - handle space between var name and index (SpacePossum) -* bug #3765 Fix binary-prefixed double-quoted strings to single quotes (ntzm) -* bug #3770 Handle binary flags in heredoc_to_nowdoc (ntzm) -* bug #3776 ExplicitStringVariableFixer - handle binary strings (ntzm) -* bug #3777 EscapeImplicitBackslashesFixer - handle binary strings (ntzm) -* bug #3790 ProcessLinter - don't execute external process without timeout! It can freeze! (keradus) -* minor #3188 AppVeyor - add PHP 7.x (keradus, julienfalque) -* minor #3451 Update findPHPUnit functions (BackEndTea, SpacePossum, keradus) -* minor #3548 Make shell scripts POSIX-compatible (EvgenyOrekhov, keradus) -* minor #3568 New Autoreview: Correct option casing (ntzm) -* minor #3578 Add interface for deprecated options (julienfalque, keradus) -* minor #3590 Use XdebugHandler to avoid perormance penalty (AJenbo, keradus) -* minor #3607 PhpdocVarWithoutNameFixer - update sample with @ type (SpacePossum) -* minor #3617 Tests stability patches (Tom Klingenberg, keradus) -* minor #3622 Docs: Update descriptions (localheinz) -* minor #3627 Fix tests execution under phpdbg (keradus) -* minor #3629 ProjectFixerConfigurationTest - test rules are sorted (SpacePossum) -* minor #3639 DX: use benefits of symfony/force-lowest (keradus) -* minor #3641 Update check_trailing_spaces script with upstream (keradus) -* minor #3646 Extract SameStringsConstraint and XmlMatchesXsdConstraint (keradus) -* minor #3647 DX: Add CachingLinter for tests (keradus) -* minor #3649 Update check_trailing_spaces script with upstream (keradus) -* minor #3652 CiIntegrationTest - run tests with POSIX sh, not Bash (keradus) -* minor #3656 DX: Clean ups (SpacePossum) -* minor #3657 update phpunitgoodpractices/traits (SpacePossum, keradus) -* minor #3658 DX: Clean ups (SpacePossum) -* minor #3660 Fix do not rely on order of fixing in CiIntegrationTest (kubawerlos) -* minor #3661 Fix: covers annotation for NoAlternativeSyntaxFixerTest (kubawerlos) -* minor #3662 DX: Add Smoke/InstallViaComposerTest (keradus) -* minor #3663 DX: During deployment, run all smoke tests and don't allow to skip phar-related ones (keradus) -* minor #3665 CircleCI fix (kubawerlos) -* minor #3666 Use "set -eu" in shell scripts (EvgenyOrekhov) -* minor #3669 Document possible values for subset options (julienfalque, keradus) -* minor #3672 Remove SameStringsConstraint and XmlMatchesXsdConstraint (keradus) -* minor #3676 RunnerTest - workaround for failing Symfony v2.8.37 (kubawerlos) -* minor #3680 DX: Tokens - removeLeadingWhitespace and removeTrailingWhitespace must act in same way (SpacePossum) -* minor #3686 README.rst - Format all code-like strings in fixer descriptions (ntzm, keradus) -* minor #3692 DX: Optimize tests (julienfalque) -* minor #3700 README.rst - Format all code-like strings in fixer description (ntzm) -* minor #3701 Use correct casing for "PHPDoc" (ntzm) -* minor #3703 DX: InstallViaComposerTest - groom naming (keradus) -* minor #3704 DX: Tokens - fix naming (keradus) -* minor #3706 Update homebrew installation instructions (ntzm) -* minor #3713 Use HTTPS whenever possible (fabpot) -* minor #3723 Extend tests coverage (ntzm) -* minor #3733 Disable Composer optimized autoloader by default (julienfalque) -* minor #3748 PhpUnitStrictFixer - extend risky note (jnvsor) -* minor #3749 Make sure PHPUnit is cased correctly in fixers descriptions (kubawerlos) -* minor #3768 Improve deprecation messages (julienfalque, SpacePossum) -* minor #3773 AbstractFixerWithAliasedOptionsTestCase - don't export (keradus) -* minor #3775 Add tests for binary strings in string_line_ending (ntzm) -* minor #3779 Misc fixes (ntzm, keradus) -* minor #3796 DX: StdinTest - do not assume name of folder, into which project was cloned (keradus) -* minor #3803 NoEmptyPhpdocFixer/PhpdocAddMissingParamAnnotationFixer - missing priority test (SpacePossum, keradus) -* minor #3804 Cleanup: remove useless constructor comment (kubawerlos) -* minor #3805 Cleanup: add missing @param type (kubawerlos, keradus) - -Changelog for v2.11.1 ---------------------- - -* bug #3626 ArrayIndentationFixer: priority bug with BinaryOperatorSpacesFixer and MethodChainingIndentationFixer (Slamdunk) -* bug #3632 DateTimeImmutableFixer bug with adding tokens while iterating over them (kubawerlos) -* minor #3478 PhpUnitDedicateAssertFixer: handle static calls (Slamdunk) -* minor #3618 DateTimeImmutableFixer - grooming (keradus) - -Changelog for v2.11.0 ---------------------- - -* feature #3135 Add ArrayIndentationFixer (julienfalque) -* feature #3235 Implement StandardizeIncrementFixer (ntzm, SpacePossum) -* feature #3260 Add DateTimeImmutableFixer (kubawerlos) -* feature #3276 Transform Fully Qualified parameters and return types to short version (veewee, keradus) -* feature #3299 SingleQuoteFixer - fix single quote char (Slamdunk) -* feature #3340 Verbose LintingException after fixing (Slamdunk) -* feature #3423 FunctionToConstantFixer - add fix "get_called_class" option (SpacePossum) -* feature #3434 Add PhpUnitSetUpTearDownVisibilityFixer (BackEndTea, SpacePossum) -* feature #3442 Add CommentToPhpdocFixer (kubawerlos, keradus) -* feature #3448 OrderedClassElementsFixer - added sortAlgorithm option (meridius) -* feature #3454 Add StringLineEndingFixer (iluuu1994, SpacePossum, keradus, julienfalque) -* feature #3477 PhpUnitStrictFixer: handle static calls (Slamdunk) -* feature #3479 PhpUnitConstructFixer: handle static calls (Slamdunk) -* feature #3507 Add PhpUnitOrderedCoversFixer (Slamdunk) -* feature #3545 Add the 'none' sort algorithm to OrderedImportsFixer (EvgenyOrekhov) -* feature #3588 Add NoAlternativeSyntaxFixer (eddmash, keradus) -* minor #3414 DescribeCommand: add fixer class when verbose (Slamdunk) -* minor #3432 ConfigurationDefinitionFixerInterface - fix deprecation notice (keradus) -* minor #3527 Deprecate last param of Tokens::findBlockEnd (ntzm, keradus) -* minor #3539 Update UnifiedDiffOutputBuilder from gecko-packages/gecko-diff-output-builder usage after it was incorporated into sebastian/diff (keradus) -* minor #3549 DescribeCommand - use our Differ wrapper class, not external one directly (keradus) -* minor #3592 Support PHPUnit 7 (keradus) -* minor #3619 Travis - extend additional files list (keradus) - -Changelog for v2.10.5 ---------------------- - -* bug #3344 Fix method chaining indentation in HTML (julienfalque) -* bug #3594 ElseifFixer - Bug with alternative syntax (kubawerlos) -* bug #3600 StrictParamFixer - Fix issue when functions are imported (ntzm, keradus) -* minor #3589 FixerFactoryTest - add missing test (SpacePossum, keradus) -* minor #3610 make phar extension optional (Tom Klingenberg, keradus) -* minor #3612 Travis - allow for hhvm failures (keradus) -* minor #3615 Detect fabbot.io (julienfalque, keradus) -* minor #3616 FixerFactoryTest - Don't rely on autovivification (keradus) -* minor #3621 FixerFactoryTest - apply CS (keradus) - -Changelog for v2.10.4 ---------------------- - -* bug #3446 Add PregWrapper (kubawerlos) -* bug #3464 IncludeFixer - fix incorrect order of fixing (kubawerlos, SpacePossum) -* bug #3496 Bug in Tokens::removeLeadingWhitespace (kubawerlos, SpacePossum, keradus) -* bug #3557 AbstractDoctrineAnnotationFixer: edge case bugfix (Slamdunk) -* bug #3574 GeneralPhpdocAnnotationRemoveFixer - remove PHPDoc if no content is left (SpacePossum) -* minor #3563 DX add missing covers annotations (keradus) -* minor #3564 Use ::class keyword when possible (keradus) -* minor #3565 Use EventDispatcherInterface instead of EventDispatcher when possible (keradus) -* minor #3566 Update PHPUnitGoodPractices\Traits (keradus) -* minor #3572 DX: allow for more phpunit-speedtrap versions to support more PHPUnit versions (keradus) -* minor #3576 Fix Doctrine Annotation test cases merging (julienfalque) -* minor #3577 DoctrineAnnotationArrayAssignmentFixer - Add test case (julienfalque) - -Changelog for v2.10.3 ---------------------- - -* bug #3504 NoBlankLinesAfterPhpdocFixer - allow blank line before declare statement (julienfalque) -* bug #3522 Remove LOCK_EX (SpacePossum) -* bug #3560 SelfAccessorFixer is risky (Slamdunk) -* minor #3435 Add tests for general_phpdoc_annotation_remove (BackEndTea) -* minor #3484 Create Tokens::findBlockStart (ntzm) -* minor #3512 Add missing array typehints (ntzm) -* minor #3513 Making AppVeyor happy (kubawerlos) -* minor #3516 Use null|type instead of ?type in PHPDocs (ntzm) -* minor #3518 FixerFactoryTest - Test each priority test file is listed as test (SpacePossum) -* minor #3519 Fix typo (SpacePossum) -* minor #3520 Fix typos: ran vs. run (SpacePossum) -* minor #3521 Use HTTPS (carusogabriel) -* minor #3526 Remove gecko dependency (SpacePossum, keradus, julienfalque) -* minor #3531 Backport PHPMD to LTS version to ease maintainability (keradus) -* minor #3532 Implement Tokens::findOppositeBlockEdge (ntzm) -* minor #3533 DX: SCA - drop src/Resources exclusion (keradus) -* minor #3538 Don't use third parameter of Tokens::findBlockStart (ntzm) -* minor #3542 Enhancement: Run composer-normalize on Travis CI (localheinz, keradus) -* minor #3550 AutoReview\FixerFactoryTest - fix missing priority test, mark not fully valid test as incomplete (keradus) -* minor #3555 DX: composer.json - drop branch-alias, branch is already following the version (keradus) -* minor #3556 DX: Add AutoReview/ComposerTest (keradus) -* minor #3559 Don't expose new files under Test namespace (keradus) -* minor #3561 PHPUnit5 - add in place missing compat layer for PHPUnit6 (keradus) - -Changelog for v2.10.2 ---------------------- - -* bug #3502 Fix missing file in export (keradus) - -Changelog for v2.10.1 ---------------------- - -* bug #3265 YodaFixer - fix problems of block statements followed by ternary statements (weareoutman, keradus, SpacePossum) -* bug #3367 NoUnusedImportsFixer - fix comment handling (SpacePossum, keradus) -* bug #3438 PhpUnitTestAnnotationFixer: Do not prepend with test if method is test() (localheinz, SpacePossum) -* bug #3455 NoEmptyCommentFixer - comment block detection for line ending different than LF (kubawerlos, SpacePossum) -* bug #3458 SilencedDeprecationErrorFixer - fix edge cases (kubawerlos) -* bug #3466 no_whitespace_in_blank_line and no_blank_lines_after_phpdoc fixers bug (kubawerlos, keradus) -* bug #3472 YodaStyleFixer - do not un-Yoda if right side is assignment (SpacePossum, keradus) -* bug #3492 PhpdocScalarFixer - Add callback pesudo-type to callable type (carusogabriel) -* minor #3354 Added missing types to the PhpdocTypesFixer (GrahamCampbell) -* minor #3406 Fix for escaping in README (kubawerlos) -* minor #3430 Fix integration test (SpacePossum) -* minor #3431 Add missing tests (SpacePossum) -* minor #3440 Add a handful of integration tests (BackEndTea) -* minor #3443 ConfigurableFixerInterface - not deprecated but TODO (SpacePossum) -* minor #3444 IntegrationTest - ensure tests in priority dir are priority tests indeed (keradus) -* minor #3494 Add missing PHPDoc param type (ntzm) -* minor #3495 Swap @var type and element (ntzm) -* minor #3498 NoUnusedImportsFixer - fix deprecation (keradus) - -Changelog for v2.10.0 ---------------------- - -* feature #3290 Add PhpdocOpeningClosingFixer (Slamdunk, keradus) -* feature #3327 Add MultilineWhitespaceBeforeSemicolonsFixer (egircys, keradus) -* feature #3351 PhuUnit: migrate getMock to createPartialMock when arguments count is 2 (Slamdunk) -* feature #3362 Add BacktickToShellExecFixer (Slamdunk) -* minor #3285 PHPUnit - use protective traits (keradus) -* minor #3329 ConfigurationResolver - detect deprecated fixers (keradus, SpacePossum) -* minor #3343 Tokens - improve block end lookup (keradus) -* minor #3360 Adjust Symfony ruleset (keradus) -* minor #3361 no_extra_consecutive_blank_lines - rename to no_extra_blank_lines (with BC layer) (keradus) -* minor #3363 progress-type - name main option value 'dots' (keradus) -* minor #3404 Deprecate "use_yoda_style" in IsNullFixer (kubawerlos, keradus) -* minor #3418 ConfigurableFixerInterface, ConfigurationDefinitionFixerInterface - update deprecations (keradus) -* minor #3419 Dont use deprecated fixer in itest (keradus) - -Changelog for v2.9.3 --------------------- - -* bug #3502 Fix missing file in export (keradus) - -Changelog for v2.9.2 --------------------- - -* bug #3265 YodaFixer - fix problems of block statements followed by ternary statements (weareoutman, keradus, SpacePossum) -* bug #3367 NoUnusedImportsFixer - fix comment handling (SpacePossum, keradus) -* bug #3438 PhpUnitTestAnnotationFixer: Do not prepend with test if method is test() (localheinz, SpacePossum) -* bug #3455 NoEmptyCommentFixer - comment block detection for line ending different than LF (kubawerlos, SpacePossum) -* bug #3458 SilencedDeprecationErrorFixer - fix edge cases (kubawerlos) -* bug #3466 no_whitespace_in_blank_line and no_blank_lines_after_phpdoc fixers bug (kubawerlos, keradus) -* bug #3472 YodaStyleFixer - do not un-Yoda if right side is assignment (SpacePossum, keradus) -* minor #3354 Added missing types to the PhpdocTypesFixer (GrahamCampbell) -* minor #3406 Fix for escaping in README (kubawerlos) -* minor #3430 Fix integration test (SpacePossum) -* minor #3431 Add missing tests (SpacePossum) -* minor #3440 Add a handful of integration tests (BackEndTea) -* minor #3444 IntegrationTest - ensure tests in priority dir are priority tests indeed (keradus) -* minor #3494 Add missing PHPDoc param type (ntzm) -* minor #3495 Swap @var type and element (ntzm) -* minor #3498 NoUnusedImportsFixer - fix deprecation (keradus) - -Changelog for v2.9.1 --------------------- - -* bug #3298 DiffConsoleFormatter - fix output escaping. (SpacePossum) -* bug #3312 PhpUnitTestAnnotationFixer: Only remove prefix if it really is a prefix (localheinz) -* bug #3318 SingleLineCommentStyleFixer - fix closing tag inside comment causes an error (kubawerlos) -* bug #3334 ExplicitStringVariableFixer: handle parsed array and object (Slamdunk) -* bug #3337 BracesFixer: nowdoc bug on template files (Slamdunk) -* bug #3349 Fix stdin handling and add tests for it (keradus) -* bug #3350 PhpUnitNoExpectationAnnotationFixer - fix handling of multiline expectedExceptionMessage annotation (Slamdunk) -* bug #3352 FunctionToConstantFixer - bugfix for get_class with leading backslash (kubawerlos) -* bug #3359 BracesFixer - handle comment for content outside of given block (keradus) -* bug #3371 IsNullFixer must be run before YodaStyleFixer (kubawerlos) -* bug #3373 PhpdocAlignFixer - Fix removing of everything after @ when there is a space after the @ (ntzm) -* bug #3415 FileFilterIterator - input checks and utests (SpacePossum, keradus) -* bug #3420 SingleLineCommentStyleFixer - fix 'strpos() expects parameter 1 to be string, boolean given' (keradus, SpacePossum) -* bug #3428 Fix archive analysing (keradus) -* bug #3429 Fix archive analysing (keradus) -* minor #3137 PHPUnit - use common base class (keradus) -* minor #3311 FinalInternalClassFixer - fix typo (localheinz) -* minor #3328 Remove duplicated space in exceptions (keradus) -* minor #3342 PhpUnitDedicateAssertFixer - Remove unexistent method is_boolean (carusogabriel) -* minor #3345 StdinFileInfo - fix __toString (keradus) -* minor #3346 StdinFileInfo - drop getContents (keradus) -* minor #3347 DX: reapply newest CS (keradus) -* minor #3365 COOKBOOK-FIXERS.md - update to provide definition instead of description (keradus) -* minor #3370 AbstractFixer - FQCN in in exceptions (Slamdunk) -* minor #3372 ProjectCodeTest - fix comment (keradus) -* minor #3393 Method call typos (Slamdunk, keradus) -* minor #3402 Always provide delimiter to `preg_quote` calls (ntzm) -* minor #3403 Remove unused import (ntzm) -* minor #3405 Fix `fopen` mode (ntzm) -* minor #3407 CombineConsecutiveIssetsFixer - Improve description (kubawerlos) -* minor #3408 Improving fixers descriptions (kubawerlos) -* minor #3409 move itests from misc to priority (keradus) -* minor #3411 Better type hinting for AbstractFixerTestCase::$fixer (kubawerlos) -* minor #3412 Convert `strtolower` inside `strpos` to just `stripos` (ntzm) -* minor #3421 DX: Use ::class (keradus) -* minor #3424 AbstractFixerTest: fix expectException arguments (Slamdunk, keradus) -* minor #3425 FixerFactoryTest - test that priority pair fixers have itest (keradus, SpacePossum) -* minor #3427 ConfigurationResolver: fix @return annotation (Slamdunk) - -Changelog for v2.9.0 --------------------- - -* feature #3063 Method chaining indentation fixer (boliev, julienfalque) -* feature #3076 Add ExplicitStringVariableFixer (Slamdunk, keradus) -* feature #3098 MethodSeparationFixer - add class elements separation options (SpacePossum, keradus) -* feature #3155 Add EscapeImplicitBackslashesFixer (Slamdunk) -* feature #3164 Add ExplicitIndirectVariableFixer (Slamdunk, keradus) -* feature #3183 FinalInternalClassFixer introduction (keradus, SpacePossum) -* feature #3187 StaticLambdaFixer - introduction (SpacePossum, keradus) -* feature #3209 PhpdocAlignFixer - Make @method alignable (ntzm) -* feature #3275 Add PhpUnitTestAnnotationFixer (BackEndTea, keradus) - -Changelog for v2.8.4 --------------------- - -* bug #3281 SelfAccessorFixer - stop modifying traits (kubawerlos) -* minor #3195 Add self-update command test (julienfalque) -* minor #3287 FileCacheManagerTest - drop duplicated line (keradus) -* minor #3292 PHPUnit - set memory limit (veewee) -* minor #3306 Token - better input validation (keradus) -* minor #3310 Upgrade PHP Coveralls (keradus) - -Changelog for v2.8.3 --------------------- - -* bug #3173 SimplifiedNullReturnFixer - handle nullable return types (Slamdunk) -* bug #3268 PhpUnitNoExpectationAnnotationFixer - add case with backslashes (keradus, Slamdunk) -* bug #3272 PhpdocTrimFixer - unicode support (SpacePossum) - -Changelog for v2.8.2 --------------------- - -* bug #3225 PhpdocTrimFixer - Fix handling of lines without leading asterisk (julienfalque) -* bug #3241 NoExtraConsecutiveBlankLinesFixer - do not crash on ^M LF only (SpacePossum) -* bug #3242 PhpUnitNoExpectationAnnotationFixer - fix ' handling (keradus) -* bug #3243 PhpUnitExpectationFixer - don't create ->expectExceptionMessage(null) (keradus) -* bug #3244 PhpUnitNoExpectationAnnotationFixer - expectation extracted from annotation shall be separated from rest of code with one blank line (keradus) -* bug #3259 PhpUnitNamespacedFixer - fix isCandidate to not rely on class declaration (keradus) -* bug #3261 PhpUnitNamespacedFixer - properly fix next usage of already fixed class (keradus) -* bug #3262 ToolInfo - support installation by branch as well (keradus) -* bug #3263 NoBreakCommentFixer - Fix handling comment text with PCRE characters (julienfalque) -* bug #3266 PhpUnitConstructFixer - multiple asserts bug (kubawerlos) -* minor #3239 Improve contributing guide and issue template (julienfalque) -* minor #3246 Make ToolInfo methods non-static (julienfalque) -* minor #3249 PhpUnitNoExpectationAnnotationFixerTest - fix hidden conflict (keradus) -* minor #3250 Travis: fail early, spare resources, save the Earth (Slamdunk, keradus) -* minor #3251 Create Title for config file docs section (IanEdington) -* minor #3254 AutoReview/FixerFactoryTest::testFixersPriority: verbose assertion message (Slamdunk) -* minor #3255 IntegrationTest: output exception stack trace (Slamdunk) -* minor #3257 README.rst - Fixed bullet list formatting (moebrowne) - -Changelog for v2.8.1 --------------------- - -* bug #3199 TokensAnalyzer - getClassyElements (SpacePossum) -* bug #3208 BracesFixer - Fix for instantiation in control structures (julienfalque, SpacePossum) -* bug #3215 BinaryOperatorSpacesFixer - Fix spaces around multiple exception catching (|) (ntzm) -* bug #3216 AbstractLinesBeforeNamespaceFixer - add min. and max. option, not only single target count (SpacePossum) -* bug #3217 TokenizerLinter - fix lack of linting when code is cached (SpacePossum, keradus) -* minor #3200 Skip slow test when Xdebug is loaded (julienfalque) -* minor #3211 Use udiff format in CI (julienfalque) -* minor #3212 Handle rulesets unknown to fabbot.io (julienfalque) -* minor #3219 Normalise references to GitHub in docs (ntzm) -* minor #3226 Remove unused imports (ntzm) -* minor #3231 Fix typos (ntzm) -* minor #3234 Simplify Cache\Signature::equals (ntzm) -* minor #3237 UnconfigurableFixer - use only LF (keradus) -* minor #3238 AbstractFixerTest - fix @cover annotation (keradus) - -Changelog for v2.8.0 --------------------- - -* feature #3065 Add IncrementStyleFixer (kubawerlos) -* feature #3119 Feature checkstyle reporter (K-Phoen) -* feature #3162 Add udiff as diff format (SpacePossum, keradus) -* feature #3170 Add CompactNullableTypehintFixer (jfcherng) -* feature #3189 Add PHP_CS_FIXER_FUTURE_MODE env (keradus) -* feature #3201 Add PHPUnit Migration rulesets and fixers (keradus) -* minor #3149 AbstractProxyFixer - Support multiple proxied fixers (julienfalque) -* minor #3160 Add DeprecatedFixerInterface (kubawerlos) -* minor #3185 IndentationTypeFixerTest - clean up (SpacePossum, keradus) -* minor #3198 Cleanup: add test that there is no deprecated fixer in rule set (kubawerlos) - -Changelog for v2.7.5 --------------------- - -* bug #3225 PhpdocTrimFixer - Fix handling of lines without leading asterisk (julienfalque) -* bug #3241 NoExtraConsecutiveBlankLinesFixer - do not crash on ^M LF only (SpacePossum) -* bug #3262 ToolInfo - support installation by branch as well (keradus) -* bug #3263 NoBreakCommentFixer - Fix handling comment text with PCRE characters (julienfalque) -* bug #3266 PhpUnitConstructFixer - multiple asserts bug (kubawerlos) -* minor #3239 Improve contributing guide and issue template (julienfalque) -* minor #3246 Make ToolInfo methods non-static (julienfalque) -* minor #3250 Travis: fail early, spare resources, save the Earth (Slamdunk, keradus) -* minor #3251 Create Title for config file docs section (IanEdington) -* minor #3254 AutoReview/FixerFactoryTest::testFixersPriority: verbose assertion message (Slamdunk) -* minor #3255 IntegrationTest: output exception stack trace (Slamdunk) - -Changelog for v2.7.4 --------------------- - -* bug #3199 TokensAnalyzer - getClassyElements (SpacePossum) -* bug #3208 BracesFixer - Fix for instantiation in control structures (julienfalque, SpacePossum) -* bug #3215 BinaryOperatorSpacesFixer - Fix spaces around multiple exception catching (|) (ntzm) -* bug #3216 AbstractLinesBeforeNamespaceFixer - add min. and max. option, not only single target count (SpacePossum) -* bug #3217 TokenizerLinter - fix lack of linting when code is cached (SpacePossum, keradus) -* minor #3200 Skip slow test when Xdebug is loaded (julienfalque) -* minor #3219 Normalise references to GitHub in docs (ntzm) -* minor #3226 Remove unused imports (ntzm) -* minor #3231 Fix typos (ntzm) -* minor #3234 Simplify Cache\Signature::equals (ntzm) -* minor #3237 UnconfigurableFixer - use only LF (keradus) -* minor #3238 AbstractFixerTest - fix @cover annotation (keradus) - -Changelog for v2.7.3 --------------------- - -* bug #3114 SelfAccessorFixer - Fix type declarations replacement (julienfalque) - -Changelog for v2.7.2 --------------------- - -* bug #3062 BraceClassInstantiationTransformer - Fix instantiation inside method call braces case (julienfalque, keradus) -* bug #3083 SingleBlankLineBeforeNamespaceFixer - Fix handling namespace right after opening tag (mlocati) -* bug #3109 SwitchCaseSemicolonToColonFixer - Fix bug with nested constructs (SpacePossum) -* bug #3117 Multibyte character in array key makes alignment incorect (kubawerlos) -* bug #3123 Cache - File permissions (SpacePossum) -* bug #3138 NoHomoglyphNamesFixer - fix crash on non-ascii but not mapped either (SpacePossum) -* bug #3172 IndentationTypeFixer - do not touch whitespace that is not indentation (SpacePossum) -* bug #3176 NoMultilineWhitespaceBeforeSemicolonsFixer - SpaceAfterSemicolonFixer - priority fix (SpacePossum) -* bug #3193 TokensAnalyzer::getClassyElements - sort result before returning (SpacePossum) -* bug #3196 SelfUpdateCommand - fix exit status when can't determine newest version (julienfalque) -* minor #3107 ConfigurationResolver - improve error message when rule is not found (SpacePossum) -* minor #3113 Add WordMatcher (keradus) -* minor #3128 README: remove deprecated rule from CLI examples (chteuchteu) -* minor #3133 Unify Reporter tests (keradus) -* minor #3134 Allow Symfony 4 (keradus, garak) -* minor #3136 PHPUnit - call hooks from parent class as well (keradus) -* minor #3141 Unify description of deprecated fixer (kubawerlos) -* minor #3144 PhpUnitDedicateAssertFixer - Sort map and array by function name (localheinz) -* minor #3145 misc - Typo (localheinz) -* minor #3150 Fix CircleCI (julienfalque) -* minor #3151 Update gitattributes to ignore next file (keradus) -* minor #3156 Update php-coveralls (keradus) -* minor #3166 README - add link to new gitter channel. (SpacePossum) -* minor #3174 Update UPGRADE.md (vitek-rostislav) -* minor #3180 Fix usage of static variables (kubawerlos) -* minor #3182 Add support for PHPUnit 6, drop PHPUnit 4 (keradus) -* minor #3184 Code grooming - sort content of arrays (keradus) -* minor #3191 Travis - add nightly build to allow_failures due to Travis issues (keradus) -* minor #3197 DX groom CS (keradus) - -Changelog for v2.7.1 --------------------- - -* bug #3115 NoUnneededFinalMethodFixer - fix edge case (Slamdunk) - -Changelog for v2.7.0 --------------------- - -* feature #2573 BinaryOperatorSpaces reworked (SpacePossum, keradus) -* feature #3073 SpaceAfterSemicolonFixer - Add option to remove space in empty for expressions (julienfalque) -* feature #3089 NoAliasFunctionsFixer - add imap aliases (Slamdunk) -* feature #3093 NoUnneededFinalMethodFixer - Remove final keyword from private methods (localheinz, keradus) -* minor #3068 Symfony:risky ruleset - add no_homoglyph_names (keradus) -* minor #3074 [IO] Replace Diff with fork version (SpacePossum) - -Changelog for v2.6.1 --------------------- - -* bug #3052 Fix false positive warning about paths overridden by provided as command arguments (kubawerlos) -* bug #3053 CombineConsecutiveIssetsFixer - fix priority (SpacePossum) -* bug #3058 IsNullFixer - fix whitespace handling (roukmoute) -* bug #3069 MethodArgumentSpaceFixer - new test case (keradus) -* bug #3072 IsNullFixer - fix non_yoda_style edge case (keradus) -* bug #3088 Drop dedicated Phar stub (keradus) -* bug #3100 NativeFunctionInvocationFixer - Fix test if previous token is already namespace separator (SpacePossum) -* bug #3104 DoctrineAnnotationIndentationFixer - Fix str_repeat() error (julienfalque) -* minor #3038 Support PHP 7.2 (SpacePossum, keradus) -* minor #3064 Fix couple of typos (KKSzymanowski) -* minor #3070 YodaStyleFixer - Clarify configuration parameters (SteveJobzniak) -* minor #3078 ConfigurationResolver - hide context while including config file (keradus) -* minor #3080 Direct function call instead of by string (kubawerlos) -* minor #3085 CiIntegrationTest - skip when no git is available (keradus) -* minor #3087 phar-stub.php - allow PHP 7.2 (keradus) -* minor #3092 .travis.yml - fix matrix for PHP 7.1 (keradus) -* minor #3094 NoUnneededFinalMethodFixer - Add test cases (julienfalque) -* minor #3111 DoctrineAnnotationIndentationFixer - Restore test case (julienfalque) - -Changelog for v2.6.0 --------------------- - -* bug #3039 YodaStyleFixer - Fix echo case (SpacePossum, keradus) -* feature #2446 Add YodaStyleFixer (SpacePossum) -* feature #2940 Add NoHomoglyphNamesFixer (mcfedr, keradus) -* feature #3012 Add CombineConsecutiveIssetsFixer (SpacePossum) -* minor #3037 Update SF rule set (SpacePossum) - -Changelog for v2.5.1 --------------------- - -* bug #3002 Bugfix braces (mnabialek) -* bug #3010 Fix handling of Github releases (julienfalque, keradus) -* bug #3015 Fix exception arguments (julienfalque) -* bug #3016 Verify phar file (keradus) -* bug #3021 Risky rules cleanup (kubawerlos) -* bug #3023 RandomApiMigrationFixer - "rand();" to "random_int(0, getrandmax());" fixing (SpacePossum) -* bug #3024 ConfigurationResolver - Handle empty "rules" value (SpacePossum, keradus) -* bug #3031 IndentationTypeFixer - fix handling tabs in indented comments (keradus) -* minor #2999 Notice when paths from config file are overridden by command arguments (julienfalque, keradus) -* minor #3007 Add PHP 7.2 to Travis build matrix (Jean85) -* minor #3009 CiIntegrationTest - run local (SpacePossum) -* minor #3013 Adjust phpunit configuration (localheinz) -* minor #3017 Fix: Risky tests (localheinz) -* minor #3018 Fix: Make sure that data providers are named correctly (localheinz, keradus) -* minor #3032 .php_cs.dist - handling UnexpectedValueException (keradus) -* minor #3033 Use ::class (keradus) -* minor #3034 Follow newest CS (keradus) -* minor #3036 Drop not existing Standalone group from PHPUnit configuration and duplicated internal tags (keradus) -* minor #3042 Update gitter address (keradus) - -Changelog for v2.5.0 --------------------- - -* feature #2770 DoctrineAnnotationSpaces - split assignments options (julienfalque) -* feature #2843 Add estimating-max progress output type (julienfalque) -* feature #2885 Add NoSuperfluousElseifFixer (julienfalque) -* feature #2929 Add NoUnneededCurlyBracesFixer (SpacePossum) -* feature #2944 FunctionToConstantFixer - handle get_class() -> __CLASS__ as well (SpacePossum) -* feature #2953 BlankLineBeforeStatementFixer - Add more statements (localheinz, keradus) -* feature #2972 Add NoUnneededFinalMethodFixer (Slamdunk, keradus) -* feature #2992 Add Doctrine Annotation ruleset (julienfalque) -* minor #2926 Token::getNameForId (SpacePossum) - -Changelog for v2.4.2 --------------------- - -* bug #3002 Bugfix braces (mnabialek) -* bug #3010 Fix handling of Github releases (julienfalque, keradus) -* bug #3015 Fix exception arguments (julienfalque) -* bug #3016 Verify phar file (keradus) -* bug #3021 Risky rules cleanup (kubawerlos) -* bug #3023 RandomApiMigrationFixer - "rand();" to "random_int(0, getrandmax());" fixing (SpacePossum) -* bug #3024 ConfigurationResolver - Handle empty "rules" value (SpacePossum, keradus) -* bug #3031 IndentationTypeFixer - fix handling tabs in indented comments (keradus) -* minor #2999 Notice when paths from config file are overridden by command arguments (julienfalque, keradus) -* minor #3007 Add PHP 7.2 to Travis build matrix (Jean85) -* minor #3009 CiIntegrationTest - run local (SpacePossum) -* minor #3013 Adjust phpunit configuration (localheinz) -* minor #3017 Fix: Risky tests (localheinz) -* minor #3018 Fix: Make sure that data providers are named correctly (localheinz, keradus) -* minor #3032 .php_cs.dist - handling UnexpectedValueException (keradus) -* minor #3033 Use ::class (keradus) -* minor #3034 Follow newest CS (keradus) -* minor #3036 Drop not existing Standalone group from PHPUnit configuration and duplicated internal tags (keradus) -* minor #3042 Update gitter address (keradus) - -Changelog for v2.4.1 --------------------- - -* bug #2925 Improve CI integration suggestion (julienfalque) -* bug #2928 TokensAnalyzer::getClassyElements - Anonymous class support (SpacePossum) -* bug #2931 Psr0Fixer, Psr4Fixer - ignore "new class" syntax (dg, keradus) -* bug #2934 Config - fix handling rule without value (keradus, SpacePossum) -* bug #2939 NoUnusedImportsFixer - Fix extra blank line (julienfalque) -* bug #2941 PHP 7.2 - Group imports with trailing comma support (SpacePossum, julienfalque) -* bug #2954 NoBreakCommentFixer - Disable case sensitivity (julienfalque) -* bug #2959 MethodArgumentSpaceFixer - Skip body of fixed function (greg0ire) -* bug #2984 AlignMultilineCommentFixer - handle uni code (SpacePossum) -* bug #2987 Fix incorrect indentation of comments in `braces` fixer (rob006) -* minor #2924 Add missing Token deprecations (julienfalque) -* minor #2927 WhiteSpaceConfig - update message copy and more strict tests (SpacePossum, keradus) -* minor #2930 Trigger website build (keradus) -* minor #2932 Integrate CircleCI (keradus, aidantwoods) -* minor #2933 ProcessLinterTest - Ensure Windows test only runs on Windows, add a Mac test execution (aidantwoods) -* minor #2935 special handling of fabbot.io service if it's using too old PHP CS Fixer version (keradus) -* minor #2937 Travis: execute 5.3 job on precise (keradus) -* minor #2938 Tests fix configuration of project (SpacePossum, keradus) -* minor #2943 FunctionToConstantFixer - test with diff. arguments than fixable (SpacePossum) -* minor #2945 BlankLineBeforeStatementFixerTest - Fix covered class (julienfalque) -* minor #2946 Detect extra old installations (keradus) -* minor #2947 Test suggested CI integration (keradus) -* minor #2951 AccessibleObject - remove most of usage (keradus) -* minor #2952 BlankLineBeforeStatementFixer - Reference fixer instead of test class (localheinz) -* minor #2955 Travis - stop using old TASK_SCA residue (keradus) -* minor #2968 AssertTokensTrait - don't use AccessibleObject (keradus) -* minor #2969 Shrink down AccessibleObject usage (keradus) -* minor #2982 TrailingCommaInMultilineArrayFixer - simplify isMultilineArray condition (TomasVotruba) -* minor #2989 CiIntegrationTest - fix min supported PHP versions (keradus) - -Changelog for v2.4.0 --------------------- - -* bug #2880 NoBreakCommentFixer - fix edge case (julienfalque) -* bug #2900 VoidReturnFixer - handle functions containing anonymous functions/classes (bendavies, keradus) -* bug #2902 Fix test classes constructor (julienfalque) -* feature #2384 Add BlankLineBeforeStatementFixer (localheinz, keradus, SpacePossum) -* feature #2440 MethodArgumentSpaceFixer - add ensure_fully_multiline option (greg0ire) -* feature #2649 PhpdocAlignFixer - make fixer configurable (ntzm) -* feature #2664 Add DoctrineAnnotationArrayAssignmentFixer (julienfalque) -* feature #2667 Add NoBreakCommentFixer (julienfalque) -* feature #2684 BracesFixer - new options for braces position after control structures and anonymous constructs (aidantwoods, keradus) -* feature #2701 NoExtraConsecutiveBlankLinesFixer - Add more configuration options related to switch statements (SpacePossum) -* feature #2740 Add VoidReturnFixer (mrmark) -* feature #2765 DoctrineAnnotationIndentationFixer - add option to indent mixed lines (julienfalque) -* feature #2815 NonPrintableCharacterFixer - Add option to replace with escape sequences (julienfalque, keradus) -* feature #2822 Add NoNullPropertyInitializationFixer (ntzm, julienfalque, SpacePossum) -* feature #2825 Add PhpdocTypesOrderFixer (julienfalque, keradus) -* feature #2856 CastSpacesFixer - add space option (kubawerlos, keradus) -* feature #2857 Add AlignMultilineCommentFixer (Slamdunk, keradus) -* feature #2866 Add SingleLineCommentStyleFixer, deprecate HashToSlashCommentFixer (Slamdunk, keradus) -* minor #2773 Travis - use stages (keradus) -* minor #2794 Drop HHVM support (keradus, julienfalque) -* minor #2801 ProjectCodeTest - Fix typo in deprecation message (SpacePossum) -* minor #2818 Token become immutable, performance optimizations (keradus) -* minor #2877 Fix PHPMD report (julienfalque) -* minor #2894 NonPrintableCharacterFixer - fix handling required PHP version on PHPUnit 4.x (keradus) -* minor #2921 InvalidForEnvFixerConfigurationException - fix handling in tests on 2.4 line (keradus) - -Changelog for v2.3.3 --------------------- - -* bug #2807 NoUselessElseFixer - Fix detection of conditional block (SpacePossum) -* bug #2809 Phar release - fix readme generation (SpacePossum, keradus) -* bug #2827 MethodArgumentSpaceFixer - Always remove trailing spaces (julienfalque) -* bug #2835 SelfAcessorFixer - class property fix (mnabialek) -* bug #2848 PhpdocIndentFixer - fix edge case with inline phpdoc (keradus) -* bug #2849 BracesFixer - Fix indentation issues with comments (julienfalque) -* bug #2851 Tokens - ensureWhitespaceAtIndex (GrahamCampbell, SpacePossum) -* bug #2854 NoLeadingImportSlashFixer - Removing leading slash from import even when in global space (kubawerlos) -* bug #2858 Support generic types (keradus) -* bug #2869 Fix handling required configuration (keradus) -* bug #2881 NoUnusedImportsFixer - Bug when trying to insert empty token (GrahamCampbell, keradus) -* bug #2882 DocBlock\Annotation - Fix parsing of collections with multiple key types (julienfalque) -* bug #2886 NoSpacesInsideParenthesisFixer - Do not remove whitespace if next token is comment (SpacePossum) -* bug #2888 SingleImportPerStatementFixer - Add support for function and const (SpacePossum) -* bug #2901 Add missing files to archive files (keradus) -* bug #2914 HeredocToNowdocFixer - works with CRLF line ending (dg) -* bug #2920 RuleSet - Update deprecated configuration of fixers (SpacePossum, keradus) -* minor #1531 Update docs for few generic types (keradus) -* minor #2793 COOKBOOK-FIXERS.md - update to current version, fix links (keradus) -* minor #2812 ProcessLinter - compatibility with Symfony 3.3 (keradus) -* minor #2816 Tokenizer - better docs and validation (keradus) -* minor #2817 Tokenizer - use future-compatible interface (keradus) -* minor #2819 Fix benchmark (keradus) -* minor #2820 MagicConstantCasingFixer - Remove defined check (SpacePossum) -* minor #2823 Tokenizer - use future-compatible interface (keradus) -* minor #2824 code grooming (keradus) -* minor #2826 Exceptions - provide utests (localheinz) -* minor #2828 Enhancement: Reference phpunit.xsd from phpunit.xml.dist (localheinz) -* minor #2830 Differs - add tests (localheinz) -* minor #2832 Fix: Use all the columns (localheinz) -* minor #2833 Doctrine\Annotation\Token - provide utests (localheinz) -* minor #2839 Use PHP 7.2 polyfill instead of xml one (keradus) -* minor #2842 Move null to first position in PHPDoc types (julienfalque) -* minor #2850 ReadmeCommandTest - Prevent diff output (julienfalque) -* minor #2859 Fixed typo and dead code removal (GrahamCampbell) -* minor #2863 FileSpecificCodeSample - add tests (localheinz) -* minor #2864 WhitespacesAwareFixerInterface clean up (Slamdunk) -* minor #2865 AutoReview\FixerTest - test configuration samples (SpacePossum, keradus) -* minor #2867 VersionSpecification - Fix copy-paste typo (SpacePossum) -* minor #2870 Tokens - ensureWhitespaceAtIndex - Clear tokens before compare. (SpacePossum) -* minor #2874 LineTest - fix typo (keradus) -* minor #2875 HelpCommand - recursive layout fix (SpacePossum) -* minor #2883 DescribeCommand - Show which sample uses the default configuration (SpacePossum) -* minor #2887 Housekeeping - Strict whitespace checks (SpacePossum) -* minor #2895 ProjectCodeTest - check that classes in no-tests exception exist (keradus) -* minor #2896 Move testing related classes from src to tests (keradus) -* minor #2904 Reapply CS (keradus) -* minor #2910 PhpdocAnnotationWithoutDotFixer - Restrict lowercasing (oschwald) -* minor #2913 Tests - tweaks (SpacePossum, keradus) -* minor #2916 FixerFactory - drop return in sortFixers(), never used (TomasVotruba) - -Changelog for v2.3.2 --------------------- - -* bug #2682 DoctrineAnnotationIndentationFixer - fix handling nested annotations (edhgoose, julienfalque) -* bug #2700 Fix Doctrine Annotation end detection (julienfalque) -* bug #2715 OrderedImportsFixer - handle indented groups (pilgerone) -* bug #2732 HeaderCommentFixer - fix handling blank lines (s7b4) -* bug #2745 Fix Doctrine Annotation newlines (julienfalque) -* bug #2752 FixCommand - fix typo in warning message (mnapoli) -* bug #2757 GeckoPHPUnit is not dev dependency (keradus) -* bug #2759 Update gitattributes (SpacePossum) -* bug #2763 Fix describe command with PSR-0 fixer (julienfalque) -* bug #2768 Tokens::ensureWhitespaceAtIndex - clean up comment check, add check for T_OPEN (SpacePossum) -* bug #2783 Tokens::ensureWhitespaceAtIndex - Fix handling line endings (SpacePossum) -* minor #2304 DX: use PHPMD (keradus) -* minor #2663 Use colors for keywords in commands output (julienfalque, keradus) -* minor #2706 Update README (SpacePossum) -* minor #2714 README.rst - fix wrong value in example (mleko) -* minor #2718 Remove old Symfony exception message expectation (julienfalque) -* minor #2721 Update phpstorm article link to a fresh blog post (valeryan) -* minor #2725 Use method chaining for configuration definitions (julienfalque) -* minor #2727 PHPUnit - use speedtrap (keradus) -* minor #2728 SelfUpdateCommand - verify that it's possible to replace current file (keradus) -* minor #2729 DescribeCommand - add decorated output test (julienfalque) -* minor #2731 BracesFixer - properly pass config in utest dataProvider (keradus) -* minor #2738 Upgrade tests to use new, namespaced PHPUnit TestCase class (keradus) -* minor #2742 Code cleanup (GrahamCampbell, keradus) -* minor #2743 Fixing example and description for GeneralPhpdocAnnotationRemoveFixer (kubawerlos) -* minor #2744 AbstractDoctrineAnnotationFixerTestCase - split fixers test cases (julienfalque) -* minor #2755 Fix compatibility with PHPUnit 5.4.x (keradus) -* minor #2758 Readme - improve CI integration guidelines (keradus) -* minor #2769 Psr0Fixer - remove duplicated example (julienfalque) -* minor #2774 AssertTokens Trait (keradus) -* minor #2775 NoExtraConsecutiveBlankLinesFixer - remove duplicate code sample. (SpacePossum) -* minor #2778 AutoReview - watch that code samples are unique (keradus) -* minor #2787 Add warnings about missing dom ext and require json ext (keradus) -* minor #2792 Use composer-require-checker (keradus) -* minor #2796 Update .gitattributes (SpacePossum) -* minor #2797 Update .gitattributes (SpacePossum) -* minor #2800 PhpdocTypesFixerTest - Fix typo in covers annotation (SpacePossum) - -Changelog for v2.3.1 --------------------- - -Port of v2.2.3. - -* bug #2724 Revert #2554 Add short diff. output format (keradus) - -Changelog for v2.3.0 --------------------- - -* feature #2450 Add ListSyntaxFixer (SpacePossum) -* feature #2708 Add PhpUnitTestClassRequiresCoversFixer (keradus) -* minor #2568 Require PHP 5.6+ (keradus) -* minor #2672 Bump symfony/* deps (keradus) - -Changelog for v2.2.20 ---------------------- - -* bug #3233 PhpdocAlignFixer - Fix linebreak inconsistency (SpacePossum, keradus) -* bug #3445 Rewrite NoUnusedImportsFixer (kubawerlos, julienfalque) -* bug #3597 DeclareStrictTypesFixer - fix bug of removing line (kubawerlos, keradus) -* bug #3605 DoctrineAnnotationIndentationFixer - Fix indentation with mixed lines (julienfalque) -* bug #3606 PhpdocToCommentFixer - allow multiple ( (SpacePossum) -* bug #3684 PhpUnitStrictFixer - Do not fix if not correct # of arguments are used (SpacePossum) -* bug #3715 SingleImportPerStatementFixer - Fix handling whitespace before opening brace (julienfalque) -* bug #3731 PhpdocIndentFixer - crash fix (SpacePossum) -* bug #3765 Fix binary-prefixed double-quoted strings to single quotes (ntzm) -* bug #3770 Handle binary flags in heredoc_to_nowdoc (ntzm) -* bug #3790 ProcessLinter - don't execute external process without timeout! It can freeze! (keradus) -* minor #3548 Make shell scripts POSIX-compatible (EvgenyOrekhov, keradus) -* minor #3568 New Autoreview: Correct option casing (ntzm) -* minor #3590 Use XdebugHandler to avoid performance penalty (AJenbo, keradus) -* minor #3607 PhpdocVarWithoutNameFixer - update sample with @ type (SpacePossum) -* minor #3617 Tests stability patches (Tom Klingenberg, keradus) -* minor #3627 Fix tests execution under phpdbg (keradus) -* minor #3629 ProjectFixerConfigurationTest - test rules are sorted (SpacePossum) -* minor #3639 DX: use benefits of symfony/force-lowest (keradus) -* minor #3641 Update check_trailing_spaces script with upstream (keradus) -* minor #3646 Extract SameStringsConstraint and XmlMatchesXsdConstraint (keradus) -* minor #3647 DX: Add CachingLinter for tests (keradus) -* minor #3649 Update check_trailing_spaces script with upstream (keradus) -* minor #3652 CiIntegrationTest - run tests with POSIX sh, not Bash (keradus) -* minor #3656 DX: Clean ups (SpacePossum) -* minor #3660 Fix do not rely on order of fixing in CiIntegrationTest (kubawerlos) -* minor #3662 DX: Add Smoke/InstallViaComposerTest (keradus) -* minor #3663 DX: During deployment, run all smoke tests and don't allow to skip phar-related ones (keradus) -* minor #3665 CircleCI fix (kubawerlos) -* minor #3666 Use "set -eu" in shell scripts (EvgenyOrekhov) -* minor #3669 Document possible values for subset options (julienfalque, keradus) -* minor #3676 RunnerTest - workaround for failing Symfony v2.8.37 (kubawerlos) -* minor #3680 DX: Tokens - removeLeadingWhitespace and removeTrailingWhitespace must act in same way (SpacePossum) -* minor #3686 README.rst - Format all code-like strings in fixer descriptions (ntzm, keradus) -* minor #3692 DX: Optimize tests (julienfalque) -* minor #3701 Use correct casing for "PHPDoc" (ntzm) -* minor #3703 DX: InstallViaComposerTets - groom naming (keradus) -* minor #3704 DX: Tokens - fix naming (keradus) -* minor #3706 Update homebrew installation instructions (ntzm) -* minor #3713 Use HTTPS whenever possible (fabpot) -* minor #3723 Extend tests coverage (ntzm) -* minor #3733 Disable Composer optimized autoloader by default (julienfalque) -* minor #3748 PhpUnitStrictFixer - extend risky note (jnvsor) -* minor #3749 Make sure PHPUnit is cased correctly in fixers descriptions (kubawerlos) -* minor #3773 AbstractFixerWithAliasedOptionsTestCase - don't export (keradus) -* minor #3796 DX: StdinTest - do not assume name of folder, into which project was cloned (keradus) -* minor #3803 NoEmptyPhpdocFixer/PhpdocAddMissingParamAnnotationFixer - missing priority test (SpacePossum, keradus) -* minor #3804 Cleanup: remove useless constructor comment (kubawerlos) - -Changelog for v2.2.19 ---------------------- - -* bug #3594 ElseifFixer - Bug with alternative syntax (kubawerlos) -* bug #3600 StrictParamFixer - Fix issue when functions are imported (ntzm, keradus) -* minor #3589 FixerFactoryTest - add missing test (SpacePossum, keradus) -* minor #3610 make phar extension optional (Tom Klingenberg, keradus) -* minor #3612 Travis - allow for hhvm failures (keradus) -* minor #3615 Detect fabbot.io (julienfalque, keradus) -* minor #3616 FixerFactoryTest - Don't rely on autovivification (keradus) - -Changelog for v2.2.18 ---------------------- - -* bug #3446 Add PregWrapper (kubawerlos) -* bug #3464 IncludeFixer - fix incorrect order of fixing (kubawerlos, SpacePossum) -* bug #3496 Bug in Tokens::removeLeadingWhitespace (kubawerlos, SpacePossum, keradus) -* bug #3557 AbstractDoctrineAnnotationFixer: edge case bugfix (Slamdunk) -* bug #3574 GeneralPhpdocAnnotationRemoveFixer - remove PHPDoc if no content is left (SpacePossum) -* minor #3563 DX add missing covers annotations (keradus) -* minor #3565 Use EventDispatcherInterface instead of EventDispatcher when possible (keradus) -* minor #3572 DX: allow for more phpunit-speedtrap versions to support more PHPUnit versions (keradus) -* minor #3576 Fix Doctrine Annotation test cases merging (julienfalque) - -Changelog for v2.2.17 ---------------------- - -* bug #3504 NoBlankLinesAfterPhpdocFixer - allow blank line before declare statement (julienfalque) -* bug #3522 Remove LOCK_EX (SpacePossum) -* bug #3560 SelfAccessorFixer is risky (Slamdunk) -* minor #3435 Add tests for general_phpdoc_annotation_remove (BackEndTea) -* minor #3484 Create Tokens::findBlockStart (ntzm) -* minor #3512 Add missing array typehints (ntzm) -* minor #3516 Use null|type instead of ?type in PHPDocs (ntzm) -* minor #3518 FixerFactoryTest - Test each priority test file is listed as test (SpacePossum) -* minor #3520 Fix typos: ran vs. run (SpacePossum) -* minor #3521 Use HTTPS (carusogabriel) -* minor #3526 Remove gecko dependency (SpacePossum, keradus, julienfalque) -* minor #3531 Backport PHPMD to LTS version to ease maintainability (keradus) -* minor #3532 Implement Tokens::findOppositeBlockEdge (ntzm) -* minor #3533 DX: SCA - drop src/Resources exclusion (keradus) -* minor #3538 Don't use third parameter of Tokens::findBlockStart (ntzm) -* minor #3542 Enhancement: Run composer-normalize on Travis CI (localheinz, keradus) -* minor #3555 DX: composer.json - drop branch-alias, branch is already following the version (keradus) -* minor #3556 DX: Add AutoReview/ComposerTest (keradus) -* minor #3559 Don't expose new files under Test namespace (keradus) - -Changelog for v2.2.16 ---------------------- - -* bug #3502 Fix missing file in export (keradus) - -Changelog for v2.2.15 ---------------------- - -* bug #3367 NoUnusedImportsFixer - fix comment handling (SpacePossum, keradus) -* bug #3455 NoEmptyCommentFixer - comment block detection for line ending different than LF (kubawerlos, SpacePossum) -* bug #3458 SilencedDeprecationErrorFixer - fix edge cases (kubawerlos) -* bug #3466 no_whitespace_in_blank_line and no_blank_lines_after_phpdoc fixers bug (kubawerlos, keradus) -* minor #3354 Added missing types to the PhpdocTypesFixer (GrahamCampbell) -* minor #3406 Fix for escaping in README (kubawerlos) -* minor #3431 Add missing tests (SpacePossum) -* minor #3440 Add a handful of integration tests (BackEndTea) -* minor #3444 IntegrationTest - ensure tests in priority dir are priority tests indeed (keradus) -* minor #3494 Add missing PHPDoc param type (ntzm) -* minor #3495 Swap @var type and element (ntzm) -* minor #3498 NoUnusedImportsFixer - fix deprecation (keradus) - -Changelog for v2.2.14 ---------------------- - -* bug #3298 DiffConsoleFormatter - fix output escaping. (SpacePossum) -* bug #3337 BracesFixer: nowdoc bug on template files (Slamdunk) -* bug #3349 Fix stdin handling and add tests for it (keradus) -* bug #3359 BracesFixer - handle comment for content outside of given block (keradus) -* bug #3415 FileFilterIterator - input checks and utests (SpacePossum, keradus) -* bug #3429 Fix archive analysing (keradus) -* minor #3137 PHPUnit - use common base class (keradus) -* minor #3342 PhpUnitDedicateAssertFixer - Remove unexistent method is_boolean (carusogabriel) -* minor #3345 StdinFileInfo - fix `__toString` (keradus) -* minor #3346 StdinFileInfo - drop getContents (keradus) -* minor #3347 DX: reapply newest CS (keradus) -* minor #3365 COOKBOOK-FIXERS.md - update to provide definition instead of description (keradus) -* minor #3370 AbstractFixer - FQCN in in exceptions (Slamdunk) -* minor #3372 ProjectCodeTest - fix comment (keradus) -* minor #3402 Always provide delimiter to `preg_quote` calls (ntzm) -* minor #3403 Remove unused import (ntzm) -* minor #3405 Fix `fopen` mode (ntzm) -* minor #3408 Improving fixers descriptions (kubawerlos) -* minor #3409 move itests from misc to priority (keradus) -* minor #3411 Better type hinting for AbstractFixerTestCase::$fixer (kubawerlos) -* minor #3412 Convert `strtolower` inside `strpos` to just `stripos` (ntzm) -* minor #3425 FixerFactoryTest - test that priority pair fixers have itest (keradus, SpacePossum) -* minor #3427 ConfigurationResolver: fix @return annotation (Slamdunk) - -Changelog for v2.2.13 ---------------------- - -* bug #3281 SelfAccessorFixer - stop modifying traits (kubawerlos) -* minor #3195 Add self-update command test (julienfalque) -* minor #3292 PHPUnit - set memory limit (veewee) -* minor #3306 Token - better input validation (keradus) - -Changelog for v2.2.12 ---------------------- - -* bug #3173 SimplifiedNullReturnFixer - handle nullable return types (Slamdunk) -* bug #3272 PhpdocTrimFixer - unicode support (SpacePossum) - -Changelog for v2.2.11 ---------------------- - -* bug #3225 PhpdocTrimFixer - Fix handling of lines without leading asterisk (julienfalque) -* bug #3262 ToolInfo - support installation by branch as well (keradus) -* bug #3266 PhpUnitConstructFixer - multiple asserts bug (kubawerlos) -* minor #3239 Improve contributing guide and issue template (julienfalque) -* minor #3246 Make ToolInfo methods non-static (julienfalque) -* minor #3250 Travis: fail early, spare resources, save the Earth (Slamdunk, keradus) -* minor #3251 Create Title for config file docs section (IanEdington) -* minor #3254 AutoReview/FixerFactoryTest::testFixersPriority: verbose assertion message (Slamdunk) - -Changelog for v2.2.10 ---------------------- - -* bug #3199 TokensAnalyzer - getClassyElements (SpacePossum) -* bug #3208 BracesFixer - Fix for instantiation in control structures (julienfalque, SpacePossum) -* bug #3215 BinaryOperatorSpacesFixer - Fix spaces around multiple exception catching (|) (ntzm) -* bug #3216 AbstractLinesBeforeNamespaceFixer - add min. and max. option, not only single target count (SpacePossum) -* bug #3217 TokenizerLinter - fix lack of linting when code is cached (SpacePossum, keradus) -* minor #3200 Skip slow test when Xdebug is loaded (julienfalque) -* minor #3219 Normalise references to GitHub in docs (ntzm) -* minor #3226 Remove unused imports (ntzm) -* minor #3231 Fix typos (ntzm) -* minor #3234 Simplify Cache\Signature::equals (ntzm) -* minor #3237 UnconfigurableFixer - use only LF (keradus) -* minor #3238 AbstractFixerTest - fix @cover annotation (keradus) - -Changelog for v2.2.9 --------------------- - -* bug #3062 BraceClassInstantiationTransformer - Fix instantiation inside method call braces case (julienfalque, keradus) -* bug #3083 SingleBlankLineBeforeNamespaceFixer - Fix handling namespace right after opening tag (mlocati) -* bug #3109 SwitchCaseSemicolonToColonFixer - Fix bug with nested constructs (SpacePossum) -* bug #3123 Cache - File permissions (SpacePossum) -* bug #3172 IndentationTypeFixer - do not touch whitespace that is not indentation (SpacePossum) -* bug #3176 NoMultilineWhitespaceBeforeSemicolonsFixer - SpaceAfterSemicolonFixer - priority fix (SpacePossum) -* bug #3193 TokensAnalyzer::getClassyElements - sort result before returning (SpacePossum) -* bug #3196 SelfUpdateCommand - fix exit status when can't determine newest version (julienfalque) -* minor #3107 ConfigurationResolver - improve error message when rule is not found (SpacePossum) -* minor #3113 Add WordMatcher (keradus) -* minor #3133 Unify Reporter tests (keradus) -* minor #3134 Allow Symfony 4 (keradus, garak) -* minor #3136 PHPUnit - call hooks from parent class as well (keradus) -* minor #3145 misc - Typo (localheinz) -* minor #3150 Fix CircleCI (julienfalque) -* minor #3151 Update gitattributes to ignore next file (keradus) -* minor #3156 Update php-coveralls (keradus) -* minor #3166 README - add link to new gitter channel. (SpacePossum) -* minor #3174 Update UPGRADE.md (vitek-rostislav) -* minor #3180 Fix usage of static variables (kubawerlos) -* minor #3184 Code grooming - sort content of arrays (keradus) -* minor #3191 Travis - add nightly build to allow_failures due to Travis issues (keradus) -* minor #3197 DX groom CS (keradus) - -Changelog for v2.2.8 --------------------- - -* bug #3052 Fix false positive warning about paths overridden by provided as command arguments (kubawerlos) -* bug #3058 IsNullFixer - fix whitespace handling (roukmoute) -* bug #3072 IsNullFixer - fix non_yoda_style edge case (keradus) -* bug #3088 Drop dedicated Phar stub (keradus) -* bug #3100 NativeFunctionInvocationFixer - Fix test if previous token is already namespace separator (SpacePossum) -* bug #3104 DoctrineAnnotationIndentationFixer - Fix str_repeat() error (julienfalque) -* minor #3038 Support PHP 7.2 (SpacePossum, keradus) -* minor #3064 Fix couple of typos (KKSzymanowski) -* minor #3078 ConfigurationResolver - hide context while including config file (keradus) -* minor #3080 Direct function call instead of by string (kubawerlos) -* minor #3085 CiIntegrationTest - skip when no git is available (keradus) -* minor #3087 phar-stub.php - allow PHP 7.2 (keradus) - -Changelog for v2.2.7 --------------------- - -* bug #3002 Bugfix braces (mnabialek) -* bug #3010 Fix handling of Github releases (julienfalque, keradus) -* bug #3015 Fix exception arguments (julienfalque) -* bug #3016 Verify phar file (keradus) -* bug #3021 Risky rules cleanup (kubawerlos) -* bug #3023 RandomApiMigrationFixer - "rand();" to "random_int(0, getrandmax());" fixing (SpacePossum) -* bug #3024 ConfigurationResolver - Handle empty "rules" value (SpacePossum, keradus) -* bug #3031 IndentationTypeFixer - fix handling tabs in indented comments (keradus) -* minor #2999 Notice when paths from config file are overridden by command arguments (julienfalque, keradus) -* minor #3007 Add PHP 7.2 to Travis build matrix (Jean85) -* minor #3009 CiIntegrationTest - run local (SpacePossum) -* minor #3013 Adjust phpunit configuration (localheinz) -* minor #3017 Fix: Risky tests (localheinz) -* minor #3018 Fix: Make sure that data providers are named correctly (localheinz, keradus) -* minor #3032 .php_cs.dist - handling UnexpectedValueException (keradus) -* minor #3034 Follow newest CS (keradus) -* minor #3036 Drop not existing Standalone group from PHPUnit configuration and duplicated internal tags (keradus) -* minor #3042 Update gitter address (keradus) - -Changelog for v2.2.6 --------------------- - -* bug #2925 Improve CI integration suggestion (julienfalque) -* bug #2928 TokensAnalyzer::getClassyElements - Anonymous class support (SpacePossum) -* bug #2931 Psr0Fixer, Psr4Fixer - ignore "new class" syntax (dg, keradus) -* bug #2934 Config - fix handling rule without value (keradus, SpacePossum) -* bug #2939 NoUnusedImportsFixer - Fix extra blank line (julienfalque) -* bug #2941 PHP 7.2 - Group imports with trailing comma support (SpacePossum, julienfalque) -* bug #2987 Fix incorrect indentation of comments in `braces` fixer (rob006) -* minor #2927 WhiteSpaceConfig - update message copy and more strict tests (SpacePossum, keradus) -* minor #2930 Trigger website build (keradus) -* minor #2932 Integrate CircleCI (keradus, aidantwoods) -* minor #2933 ProcessLinterTest - Ensure Windows test only runs on Windows, add a Mac test execution (aidantwoods) -* minor #2935 special handling of fabbot.io service if it's using too old PHP CS Fixer version (keradus) -* minor #2937 Travis: execute 5.3 job on precise (keradus) -* minor #2938 Tests fix configuration of project (SpacePossum, keradus) -* minor #2943 FunctionToConstantFixer - test with diff. arguments than fixable (SpacePossum) -* minor #2946 Detect extra old installations (keradus) -* minor #2947 Test suggested CI integration (keradus) -* minor #2951 AccessibleObject - remove most of usage (keradus) -* minor #2969 Shrink down AccessibleObject usage (keradus) -* minor #2982 TrailingCommaInMultilineArrayFixer - simplify isMultilineArray condition (TomasVotruba) - -Changelog for v2.2.5 --------------------- - -* bug #2807 NoUselessElseFixer - Fix detection of conditional block (SpacePossum) -* bug #2809 Phar release - fix readme generation (SpacePossum, keradus) -* bug #2827 MethodArgumentSpaceFixer - Always remove trailing spaces (julienfalque) -* bug #2835 SelfAcessorFixer - class property fix (mnabialek) -* bug #2848 PhpdocIndentFixer - fix edge case with inline phpdoc (keradus) -* bug #2849 BracesFixer - Fix indentation issues with comments (julienfalque) -* bug #2851 Tokens - ensureWhitespaceAtIndex (GrahamCampbell, SpacePossum) -* bug #2854 NoLeadingImportSlashFixer - Removing leading slash from import even when in global space (kubawerlos) -* bug #2858 Support generic types (keradus) -* bug #2869 Fix handling required configuration (keradus) -* bug #2881 NoUnusedImportsFixer - Bug when trying to insert empty token (GrahamCampbell, keradus) -* bug #2882 DocBlock\Annotation - Fix parsing of collections with multiple key types (julienfalque) -* bug #2886 NoSpacesInsideParenthesisFixer - Do not remove whitespace if next token is comment (SpacePossum) -* bug #2888 SingleImportPerStatementFixer - Add support for function and const (SpacePossum) -* bug #2901 Add missing files to archive files (keradus) -* bug #2914 HeredocToNowdocFixer - works with CRLF line ending (dg) -* bug #2920 RuleSet - Update deprecated configuration of fixers (SpacePossum, keradus) -* minor #1531 Update docs for few generic types (keradus) -* minor #2793 COOKBOOK-FIXERS.md - update to current version, fix links (keradus) -* minor #2812 ProcessLinter - compatibility with Symfony 3.3 (keradus) -* minor #2816 Tokenizer - better docs and validation (keradus) -* minor #2817 Tokenizer - use future-compatible interface (keradus) -* minor #2819 Fix benchmark (keradus) -* minor #2824 code grooming (keradus) -* minor #2826 Exceptions - provide utests (localheinz) -* minor #2828 Enhancement: Reference phpunit.xsd from phpunit.xml.dist (localheinz) -* minor #2830 Differs - add tests (localheinz) -* minor #2832 Fix: Use all the columns (localheinz) -* minor #2833 Doctrine\Annotation\Token - provide utests (localheinz) -* minor #2839 Use PHP 7.2 polyfill instead of xml one (keradus) -* minor #2842 Move null to first position in PHPDoc types (julienfalque) -* minor #2850 ReadmeCommandTest - Prevent diff output (julienfalque) -* minor #2859 Fixed typo and dead code removal (GrahamCampbell) -* minor #2863 FileSpecificCodeSample - add tests (localheinz) -* minor #2864 WhitespacesAwareFixerInterface clean up (Slamdunk) -* minor #2865 AutoReview\FixerTest - test configuration samples (SpacePossum, keradus) -* minor #2867 VersionSpecification - Fix copy-paste typo (SpacePossum) -* minor #2874 LineTest - fix typo (keradus) -* minor #2875 HelpCommand - recursive layout fix (SpacePossum) -* minor #2883 DescribeCommand - Show which sample uses the default configuration (SpacePossum) -* minor #2887 Housekeeping - Strict whitespace checks (SpacePossum) -* minor #2895 ProjectCodeTest - check that classes in no-tests exception exist (keradus) -* minor #2896 Move testing related classes from src to tests (keradus) -* minor #2904 Reapply CS (keradus) -* minor #2910 PhpdocAnnotationWithoutDotFixer - Restrict lowercasing (oschwald) -* minor #2913 Tests - tweaks (SpacePossum, keradus) -* minor #2916 FixerFactory - drop return in sortFixers(), never used (TomasVotruba) - -Changelog for v2.2.4 --------------------- - -* bug #2682 DoctrineAnnotationIndentationFixer - fix handling nested annotations (edhgoose, julienfalque) -* bug #2700 Fix Doctrine Annotation end detection (julienfalque) -* bug #2715 OrderedImportsFixer - handle indented groups (pilgerone) -* bug #2732 HeaderCommentFixer - fix handling blank lines (s7b4) -* bug #2745 Fix Doctrine Annotation newlines (julienfalque) -* bug #2752 FixCommand - fix typo in warning message (mnapoli) -* bug #2757 GeckoPHPUnit is not dev dependency (keradus) -* bug #2759 Update gitattributes (SpacePossum) -* bug #2763 Fix describe command with PSR-0 fixer (julienfalque) -* bug #2768 Tokens::ensureWhitespaceAtIndex - clean up comment check, add check for T_OPEN (SpacePossum) -* bug #2783 Tokens::ensureWhitespaceAtIndex - Fix handling line endings (SpacePossum) -* minor #2663 Use colors for keywords in commands output (julienfalque, keradus) -* minor #2706 Update README (SpacePossum) -* minor #2714 README.rst - fix wrong value in example (mleko) -* minor #2721 Update phpstorm article link to a fresh blog post (valeryan) -* minor #2727 PHPUnit - use speedtrap (keradus) -* minor #2728 SelfUpdateCommand - verify that it's possible to replace current file (keradus) -* minor #2729 DescribeCommand - add decorated output test (julienfalque) -* minor #2731 BracesFixer - properly pass config in utest dataProvider (keradus) -* minor #2738 Upgrade tests to use new, namespaced PHPUnit TestCase class (keradus) -* minor #2743 Fixing example and description for GeneralPhpdocAnnotationRemoveFixer (kubawerlos) -* minor #2744 AbstractDoctrineAnnotationFixerTestCase - split fixers test cases (julienfalque) -* minor #2755 Fix compatibility with PHPUnit 5.4.x (keradus) -* minor #2758 Readme - improve CI integration guidelines (keradus) -* minor #2769 Psr0Fixer - remove duplicated example (julienfalque) -* minor #2775 NoExtraConsecutiveBlankLinesFixer - remove duplicate code sample. (SpacePossum) -* minor #2778 AutoReview - watch that code samples are unique (keradus) -* minor #2787 Add warnings about missing dom ext and require json ext (keradus) -* minor #2792 Use composer-require-checker (keradus) -* minor #2796 Update .gitattributes (SpacePossum) -* minor #2800 PhpdocTypesFixerTest - Fix typo in covers annotation (SpacePossum) - -Changelog for v2.2.3 --------------------- - -* bug #2724 Revert #2554 Add short diff. output format (keradus) - -Changelog for v2.2.2 --------------------- - -Warning, this release breaks BC due to introduction of: -* minor #2554 Add short diff. output format (SpacePossum, keradus) -That PR was reverted in v2.2.3, which should be used instead of v2.2.2. - -* bug #2545 RuleSet - change resolvement (SpacePossum) -* bug #2686 Commands readme and describe - fix rare casing when not displaying some possible options of configuration (keradus) -* bug #2711 FixCommand - fix diff optional value handling (keradus) -* minor #2688 AppVeyor - Remove github oauth (keradus) -* minor #2703 Clean ups - No mixed annotations (SpacePossum) -* minor #2704 Create PHP70Migration:risky ruleset (keradus) -* minor #2707 Deprecate other than "yes" or "no" for input options (SpacePossum) -* minor #2709 code grooming (keradus) -* minor #2710 Travis - run more rules on TASK_SCA (keradus) - -Changelog for v2.2.1 --------------------- - -* bug #2621 Tokenizer - fix edge cases with empty code, registered found tokens and code hash (SpacePossum, keradus) -* bug #2674 SemicolonAfterInstructionFixer - Fix case where block ends with an opening curly brace (ntzm) -* bug #2675 ProcessOutputTest - update tests to pass on newest Symfony components under Windows (keradus) -* minor #2651 Fix UPGRADE.md table syntax so it works in GitHub (ntzm, keradus) -* minor #2665 Travis - Improve trailing spaces detection (julienfalque) -* minor #2666 TransformersTest - move test to auto-review group (keradus) -* minor #2668 add covers annotation (keradus) -* minor #2669 TokensTest - grooming (SpacePossum) -* minor #2670 AbstractFixer: use applyFix instead of fix (Slamdunk) -* minor #2677 README: Correct progressbar option support (Laurens St�tzel) - -Changelog for v2.2.0 --------------------- - -* bug #2640 NoExtraConsecutiveBlankLinesFixer - Fix single indent characters not working (ntzm) -* feature #2220 Doctrine annotation fixers (julienfalque) -* feature #2431 MethodArgumentSpaceFixer: allow to retain multiple spaces after comma (Slamdunk) -* feature #2459 BracesFixer - Add option for keeping opening brackets on the same line (jtojnar, SpacePossum) -* feature #2486 Add FunctionToConstantFixer (SpacePossum, keradus) -* feature #2505 FunctionDeclarationFixer - Make space after anonymous function configurable (jtojnar, keradus) -* feature #2509 FullOpeningTagFixer - Ensure opening PHP tag is lowercase (jtojnar) -* feature #2532 FixCommand - add stop-on-violation option (keradus) -* feature #2591 Improve process output (julienfalque) -* feature #2603 Add InvisibleSymbols Fixer (ivan1986, keradus) -* feature #2642 Add MagicConstantCasingFixer (ntzm) -* feature #2657 PhpdocToCommentFixer - Allow phpdoc for language constructs (ceeram, SpacePossum) -* minor #2500 Configuration resolver (julienfalque, SpacePossum, keradus) -* minor #2566 Show more details on errors and exceptions. (SpacePossum, julienfalque) -* minor #2597 HHVM - bump required version to 3.18 (keradus) -* minor #2606 FixCommand - fix missing comment close tag (keradus) -* minor #2623 OrderedClassElementsFixer - remove dead code (SpacePossum) -* minor #2625 Update Symfony and Symfony:risky rulesets (keradus) -* minor #2626 TernaryToNullCoalescingFixer - adjust ruleset membership and description (keradus) -* minor #2635 ProjectCodeTest - watch that all classes have dedicated tests (keradus) -* minor #2647 DescribeCommandTest - remove deprecated code usage (julienfalque) -* minor #2648 Move non-code covering tests to AutoReview subnamespace (keradus) -* minor #2652 NoSpacesAroundOffsetFixerTest - fix deprecation (keradus) -* minor #2656 Code grooming (keradus) -* minor #2659 Travis - speed up preparation for phar building (keradus) -* minor #2660 Fixed typo in suggest for ext-mbstring (pascal-hofmann) -* minor #2661 NonPrintableCharacterFixer - include into Symfony:risky ruleset (keradus) - -Changelog for v2.1.3 --------------------- - -* bug #2358 Cache - Deal with signature encoding (keradus, GrahamCampbell) -* bug #2475 Add shorthand array destructing support (SpacePossum, keradus) -* bug #2595 NoUnusedImportsFixer - Fix import usage detection with properties (julienfalque) -* bug #2605 PhpdocAddMissingParamAnnotationFixer, PhpdocOrderFixer - fix priority issue (SpacePossum) -* bug #2607 Fixers - better comments handling (SpacePossum) -* bug #2612 BracesFixer - Fix early bracket close for do-while loop inside an if without brackets (felixgomez) -* bug #2614 Ensure that '*Fixer::fix()' won't crash when running on non-candidate collection (keradus) -* bug #2630 HeaderCommentFixer - Fix trailing whitespace not removed after AliasFunctionsFixer (kalessil) -* feature #1275 Added PhpdocInlineTagFixer (SpacePossum, keradus) -* feature #1292 Added MethodSeparationFixer (SpacePossum) -* feature #1383 Introduce rules and sets (keradus) -* feature #1416 Mark fixers as risky (keradus) -* feature #1440 Made AbstractFixerTestCase and AbstractIntegrationTestCase public (keradus) -* feature #1489 Added Psr4Fixer (GrahamCampbell) -* feature #1497 ExtraEmptyLinesFixer - allow to remove empty blank lines after configured tags (SpacePossum) -* feature #1529 Added PhpdocPropertyFixer, refactored Tag and Annotation (GrahamCampbell) -* feature #1628 Added OrderedClassElementsFixer (gharlan) -* feature #1742 path argument is used to create an intersection with existing finder (keradus, gharlan) -* feature #1779 Added GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocAnnotationRenameFixer (keradus) -* feature #1811 Added NoSpacesInsideOfssetFixer (phansys) -* feature #1819 Added DirConstantFixer, ModernizeTypesCastingFixer, RandomApiMigrationFixer (kalessil, SpacePossum, keradus) -* feature #1825 Added junit format (ekho) -* feature #1862 FixerFactory - Do not allow conflicting fixers (SpacePossum) -* feature #1888 Cache refactoring, better cache handling in dry-run mode (localheinz) -* feature #1889 Added SingleClassElementPerStatementFixer (phansys, SpacePossum) -* feature #1903 FixCommand - allow to pass multiple path argument (keradus) -* feature #1913 Introduce path-mode CLI option (keradus) -* feature #1949 Added DeclareStrictTypesFixer, introduce options for HeaderCommentFixer (Seldaek, SpacePossum, keradus) -* feature #1955 Introduce CT_ARRAY_INDEX_CURLY_BRACE_OPEN and CT_ARRAY_INDEX_CURLY_BRACE_CLOSE (keradus) -* feature #1958 Added NormalizeIndexBraceFixer (keradus) -* feature #2069 Add semicolon after instruction fixer (SpacePossum) -* feature #2089 Add `no_spaces_around_offset` fixer (phansys) -* feature #2179 BinaryOperatorSpacesFixer - add (un)align configuration options (SpacePossum) -* feature #2192 Add PowToExponentiationFixer (SpacePossum, keradus) -* feature #2207 Added ReturnTypeDeclarationFixer (keradus) -* feature #2213 VisibilityRequiredFixer - Add support for class const visibility added in PHP7.1. (SpacePossum) -* feature #2221 Add support for user-defined whitespaces (keradus) -* feature #2244 Config cleanup (keradus, SpacePossum) -* feature #2247 PhpdocAnnotationWithoutDotFixer - support more cases (keradus) -* feature #2289 Add PhpdocAddMissingParamAnnotationFixer (keradus) -* feature #2331 Add DescribeCommand (keradus, SpacePossum) -* feature #2332 New colours of diff on console (keradus) -* feature #829 add support for .php_cs.dist file (keradus) -* feature #998 MethodArgumentSpaceFixer - enhance, now only one space after comma (trilopin, keradus) -* minor #1007 Simplify Transformers (keradus) -* minor #1050 Make Config's setDir() fluent like the rest of methods (gonzaloserrano) -* minor #1062 Added NamespaceOperatorTransformer (gharlan) -* minor #1078 Exit status should be 0 if there are no errors (gharlan) -* minor #1101 CS: fix project itself (localheinz) -* minor #1102 Enhancement: List errors occurred before, during and after fixing (localheinz) -* minor #1105 Token::isStructureAlternativeEnd - remove unused method (keradus) -* minor #1106 readme grooming (SpacePossum, keradus) -* minor #1115 Fixer - simplify flow (keradus) -* minor #1118 Process output refactor (SpacePossum) -* minor #1132 Linter - public methods should be first (keradus) -* minor #1134 Token::isWhitespace - simplify interface (keradus) -* minor #1140 FixerInterface - check if fixer should be applied by isCandidate method (keradus) -* minor #1146 Linter - detect executable (keradus) -* minor #1156 deleted old ConfigurationResolver class (keradus) -* minor #1160 Grammar fix to README (Falkirks) -* minor #1174 DefaultFinder - boost performance by not filtering when files array is empty (keradus) -* minor #1179 Exit with non-zero if invalid files were detected prior to fixing (localheinz) -* minor #1186 Finder - do not search for .xml and .yml files (keradus) -* minor #1206 BracesFixer::getClassyTokens - remove duplicated method (keradus) -* minor #1222 Made fixers final (GrahamCampbell) -* minor #1229 Tokens - Fix PHPDoc (SpacePossum) -* minor #1241 More details on exceptions. (SpacePossum) -* minor #1263 Made internal classes final (GrahamCampbell) -* minor #1272 Readme - Add spaces around PHP-CS-Fixer headers (Soullivaneuh) -* minor #1283 Error - Fixed type phpdoc (GrahamCampbell) -* minor #1284 Token - Fix PHPDoc (SpacePossum) -* minor #1314 Added missing internal annotations (keradus) -* minor #1329 Psr0Fixer - move to contrib level (gharlan) -* minor #1340 Clean ups (SpacePossum) -* minor #1341 Linter - throw exception when write fails (SpacePossum) -* minor #1348 Linter - Prefer error output when throwing a linting exception (GrahamCampbell) -* minor #1350 Add "phpt" as a valid extension (henriquemoody) -* minor #1376 Add time and memory to XML report (junichi11) -* minor #1387 Made all test classes final (keradus) -* minor #1388 Made all tests internal (keradus) -* minor #1390 Added ProjectCodeTest that tests if all classes inside tests are internal and final or abstract (keradus) -* minor #1391 Fixer::getLevelAsString is no longer static (keradus) -* minor #1392 Add report to XML report as the root node (junichi11) -* minor #1394 Stop mixing level from config file and fixers from CLI arg when one of fixers has dash (keradus) -* minor #1426 MethodSeparationFixer - Fix spacing around comments (SpacePossum, keradus) -* minor #1432 Fixer check on factory (Soullivaneuh) -* minor #1434 Add Test\AccessibleObject class (keradus) -* minor #1442 FixerFactory - disallow to register multiple fixers with same name (keradus) -* minor #1477 rename PhpdocShortDescriptionFixer into PhpdocSummaryFixer (keradus) -* minor #1481 Fix running the tests (keradus) -* minor #1482 move AbstractTransformerTestBase class outside Tests dir (keradus) -* minor #1530 Added missing internal annotation (GrahamCampbell) -* minor #1534 Clean ups (SpacePossum) -* minor #1536 Typo fix (fabpot) -* minor #1555 Fixed indentation in composer.json (GrahamCampbell) -* minor #1558 [2.0] Cleanup the tags property in the abstract phpdoc types fixer (GrahamCampbell) -* minor #1567 PrintToEchoFixer - add to symfony rule set (gharlan) -* minor #1607 performance improvement (gharlan) -* minor #1621 Switch to PSR-4 (keradus) -* minor #1631 Configuration exceptions exception cases on master. (SpacePossum) -* minor #1646 Remove non-default Config/Finder classes (keradus) -* minor #1648 Fixer - avoid extra calls to getFileRelativePathname (GrahamCampbell) -* minor #1649 Consider the php version when caching (GrahamCampbell) -* minor #1652 Rename namespace "Symfony\CS" to "PhpCsFixer" (gharlan) -* minor #1666 new Runner, ProcessOutputInterface, DifferInterface and ResultInterface (keradus) -* minor #1674 Config - add addCustomFixers method (PedroTroller) -* minor #1677 Enhance tests (keradus) -* minor #1695 Rename Fixers (keradus) -* minor #1702 Upgrade guide (keradus) -* minor #1707 ExtraEmptyLinesFixer - fix configure docs (keradus) -* minor #1712 NoExtraConsecutiveBlankLinesFixer - Remove blankline after curly brace open (SpacePossum) -* minor #1718 CLI: rename --config-file argument (keradus) -* minor #1722 Renamed not_operators_with_space to not_operator_with_space (GrahamCampbell) -* minor #1728 PhpdocNoSimplifiedNullReturnFixer - rename back to PhpdocNoEmptyReturnFixer (keradus) -* minor #1729 Renamed whitespacy_lines to no_whitespace_in_blank_lines (GrahamCampbell) -* minor #1731 FixCommand - value for config option is required (keradus) -* minor #1732 move fixer classes from level subdirs to thematic subdirs (gharlan, keradus) -* minor #1733 ConfigurationResolver - look for .php_cs file in cwd as well (keradus) -* minor #1737 RuleSet/FixerFactory - sort arrays content (keradus) -* minor #1751 FixerInterface::configure - method should always override configuration, not patch it (keradus) -* minor #1752 Remove unused code (keradus) -* minor #1756 Finder - clean up code (keradus) -* minor #1757 Psr0Fixer - change way of configuring the fixer (keradus) -* minor #1762 Remove ConfigInterface::getDir, ConfigInterface::setDir, Finder::setDir and whole FinderInterface (keradus) -* minor #1764 Remove ConfigAwareInterface (keradus) -* minor #1780 AbstractFixer - throw error on configuring non-configurable Fixer (keradus) -* minor #1782 rename fixers (gharlan) -* minor #1815 NoSpacesInsideParenthesisFixer - simplify implementation (keradus) -* minor #1821 Ensure that PhpUnitDedicateAssertFixer runs after NoAliasFunctionsFixer, clean up NoEmptyCommentFixer (SpacePossum) -* minor #1824 Reporting extracted to separate classes (ekho, keradus, SpacePossum) -* minor #1826 Fixer - remove measuring fixing time per file (keradus) -* minor #1843 FileFilterIterator - add missing import (GrahamCampbell) -* minor #1845 FileCacheManager - Allow linting to determine the cache state too (GrahamCampbell) -* minor #1846 FileFilterIterator - Corrected an iterator typehint (GrahamCampbell) -* minor #1848 DocBlock - Remove some old unused phpdoc tags (GrahamCampbell) -* minor #1856 NoDuplicateSemicolonsFixer - Remove overcomplete fixer (SpacePossum) -* minor #1861 Fix: Ofsset should be Offset (localheinz) -* minor #1867 Print non-report output to stdErr (SpacePossum, keradus) -* minor #1873 Enhancement: Show path to cache file if it exists (localheinz) -* minor #1875 renamed Composer package (fabpot) -* minor #1882 Runner - Handle throwables too (GrahamCampbell) -* minor #1886 PhpdocScalarFixer - Fix lowercase str to string too (GrahamCampbell) -* minor #1940 README.rst - update CI example (keradus) -* minor #1947 SCA, CS, add more tests (SpacePossum, keradus) -* minor #1954 tests - stop using deprecated method (sebastianbergmann) -* minor #1962 TextDiffTest - tests should not produce cache file (keradus) -* minor #1973 Introduce fast PHP7 based linter (keradus) -* minor #1999 Runner - No need to determine relative file name twice (localheinz) -* minor #2002 FileCacheManagerTest - Adjust name of test and variable (localheinz) -* minor #2010 NoExtraConsecutiveBlankLinesFixer - SF rule set, add 'extra' (SpacePossum) -* minor #2013 no_whitespace_in_blank_lines -> no_whitespace_in_blank_line (SpacePossum) -* minor #2024 AbstractFixerTestCase - check if there is no duplicated Token instance inside Tokens collection (keradus) -* minor #2031 COOKBOOK-FIXERS.md - update calling doTest method (keradus) -* minor #2032 code grooming (keradus) -* minor #2068 Code grooming (keradus) -* minor #2073 DeclareStrictTypesFixer - Remove fix CS fix logic from fixer. (SpacePossum) -* minor #2088 TokenizerLintingResult - expose line number of parsing error (keradus) -* minor #2093 Tokens - add block type BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE (SpacePossum) -* minor #2095 Transformers - add required PHP version (keradus) -* minor #2096 Introduce CT for PHP7 (keradus) -* minor #2119 Create @Symfony:risky ruleset (keradus) -* minor #2163 ClassKeywordRemoveFixerTest - Fix tests (SpacePossum) -* minor #2180 FixCommand - don't refer to renamed rules (keradus) -* minor #2181 Disallow to disable linter (keradus) -* minor #2194 semicolon_after_instruction,no_unneeded_control_parentheses prio issue (SpacePossum) -* minor #2199 make fixers less risky (SpacePossum) -* minor #2206 Add PHP70Migration ruleset (keradus) -* minor #2217 SelfUpdateCommand - Print version of update fixer (SpacePossum) -* minor #2223 update integration test format (keradus) -* minor #2227 Stop polluting global namespace with CT (keradus) -* minor #2237 DX: extend integration tests for PSR2 and Symfony rulesets (keradus) -* minor #2240 Make some objects immutable (keradus) -* minor #2251 ProtectedToPrivateFixer - fix priority, fix comments with new fixer names (SpacePossum) -* minor #2252 ClassDefinitionFixer - Set configuration of the fixer in the RuleSet of SF. (SpacePossum) -* minor #2257 extend Symfony_whitespaces itest (keradus) -* minor #2258 README.rst - indicate configurable rules (keradus) -* minor #2267 RuleSet - validate set (keradus) -* minor #2268 Use strict parameters for PHP functions (keradus) -* minor #2273 fixed typo (fabpot) -* minor #2274 ShortArraySyntaxFixer/LongArraySyntaxFixer - Merge conflicting fixers (SpacePossum) -* minor #2275 Clean ups (SpacePossum) -* minor #2278 Concat*Fixer - unify concat fixers (SpacePossum, keradus) -* minor #2279 Use Prophecy (keradus) -* minor #2284 Code grooming (SpacePossum) -* minor #2285 IntegrationCase is now aware about RuleSet but not Fixers (keradus, SpacePossum) -* minor #2286 Phpdoc*Fixer - unify rename fixers (SpacePossum, keradus) -* minor #2288 FixerInterface::configure(null) reset fixer to use default configuration (keradus) -* minor #2291 Make fixers ready to use directly after creation (keradus) -* minor #2295 Code grooming (keradus) -* minor #2296 ProjectCodeTest - make test part of regular testsuite, not standalone one (keradus) -* minor #2298 ConfigurationResolver - grooming (SpacePossum) -* minor #2300 Simplify rule set (SpacePossum, keradus) -* minor #2306 DeclareStrictTypesFixer - do not move tokens (SpacePossum) -* minor #2312 RuleSet - sort rules (localheinz) -* minor #2313 DX: provide doctyping for tests (keradus) -* minor #2317 Add utests (keradus) -* minor #2318 *TestCase - Reduce visibility of setUp() (localheinz) -* minor #2319 Code grooming (keradus) -* minor #2322 DX: use whitemessy aware assertion (keradus) -* minor #2324 Echo|Print*Fixer - unify printing fixers (SpacePossum, keradus) -* minor #2337 Normalize rule naming (keradus) -* minor #2338 Drop hacks for unsupported HHVM (keradus) -* minor #2339 Add some Fixer descriptions (SpacePossum, keradus) -* minor #2343 PowToExponentiationFixer - allow to run on 5.6.0 as well (keradus) -* minor #767 Add @internal tag (keradus) -* minor #807 Tokens::isMethodNameIsMagic - remove unused method (keradus) -* minor #809 Split Tokens into Tokens and TokensAnalyzer (keradus) -* minor #844 Renamed phpdoc_params to phpdoc_align (GrahamCampbell) -* minor #854 Change default level to PSR2 (keradus) -* minor #873 Config - using cache by default (keradus) -* minor #902 change FixerInterface (keradus) -* minor #911 remove Token::$line (keradus) -* minor #914 All Transformer classes should be named with Transformer as suffix (keradus) -* minor #915 add UseTransformer (keradus) -* minor #916 add ArraySquareBraceTransformer (keradus) -* minor #917 clean up Transformer tests (keradus) -* minor #919 CurlyBraceTransformer - one transformer to handle all curly braces transformations (keradus) -* minor #928 remove Token::getLine (keradus) -* minor #929 add WhitespacyCommentTransformer (keradus) -* minor #937 fix docs/typehinting in few classes (keradus) -* minor #958 FileCacheManager - remove code for BC support (keradus) -* minor #979 Improve Tokens::clearEmptyTokens performance (keradus) -* minor #981 Tokens - code grooming (keradus) -* minor #988 Fixers - no need to search for tokens of given kind in extra loop (keradus) -* minor #989 No need for loop in Token::equals (keradus) - -Changelog for v1.13.3 ---------------------- - -* minor #3042 Update gitter address (keradus) - -Changelog for v1.13.2 ---------------------- - -* minor #2946 Detect extra old installations (keradus) - -Changelog for v1.13.1 ---------------------- - -* minor #2342 Application - adjust test to not depend on symfony/console version (keradus) -* minor #2344 AppVeyor: enforce PHP version (keradus) - -Changelog for v1.13.0 ---------------------- - -* bug #2303 ClassDefinitionFixer - Anonymous classes fixing (SpacePossum) -* feature #2208 Added fixer for PHPUnit's @expectedException annotation (ro0NL) -* feature #2249 Added ProtectedToPrivateFixer (Slamdunk, SpacePossum) -* feature #2264 SelfUpdateCommand - Do not update to next major version by default (SpacePossum) -* feature #2328 ClassDefinitionFixer - Anonymous classes format by PSR12 (SpacePossum) -* feature #2333 PhpUnitFqcnAnnotationFixer - support more annotations (keradus) -* minor #2256 EmptyReturnFixer - it's now risky fixer due to null vs void (keradus) -* minor #2281 Add issue template (SpacePossum) -* minor #2307 Update .editorconfig (SpacePossum) -* minor #2310 CI: update AppVeyor to use newest PHP, silence the composer (keradus) -* minor #2315 Token - Deprecate getLine() (SpacePossum) -* minor #2320 Clear up status code on 1.x (SpacePossum) - -Changelog for v1.12.4 ---------------------- - -* bug #2235 OrderedImportsFixer - PHP 7 group imports support (SpacePossum) -* minor #2276 Tokens cleanup (keradus) -* minor #2277 Remove trailing spaces (keradus) -* minor #2294 Improve Travis configuration (keradus) -* minor #2297 Use phpdbg instead of xdebug (keradus) -* minor #2299 Travis: proper xdebug disabling (keradus) -* minor #2301 Travis: update platform adjusting (keradus) - -Changelog for v1.12.3 ---------------------- - -* bug #2155 ClassDefinitionFixer - overhaul (SpacePossum) -* bug #2187 MultipleUseFixer - Fix handling comments (SpacePossum) -* bug #2209 LinefeedFixer - Fix in a safe way (SpacePossum) -* bug #2228 NoEmptyLinesAfterPhpdocs, SingleBlankLineBeforeNamespace - Fix priority (SpacePossum) -* bug #2230 FunctionDeclarationFixer - Fix T_USE case (SpacePossum) -* bug #2232 Add a test for style of varaible decalration : var (daiglej) -* bug #2246 Fix itest requirements (keradus) -* minor #2238 .gitattributes - specified line endings (keradus) -* minor #2239 IntegrationCase - no longer internal (keradus) - -Changelog for v1.12.2 ---------------------- - -* bug #2191 PhpdocToCommentFixer - fix false positive for docblock of variable (keradus) -* bug #2193 UnneededControlParenthesesFixer - Fix more return cases. (SpacePossum) -* bug #2198 FileCacheManager - fix exception message and undefined property (j0k3r) -* minor #2170 Add dollar sign prefix for consistency (bcremer) -* minor #2190 .travis.yml - improve Travis speed for tags (keradus) -* minor #2196 PhpdocTypesFixer - support iterable type (GrahamCampbell) -* minor #2197 Update cookbook and readme (g105b, SpacePossum) -* minor #2203 README.rst - change formatting (ro0NL) -* minor #2204 FixCommand - clean unused var (keradus) -* minor #2205 Add integration test for iterable type (keradus) - -Changelog for v1.12.1 ---------------------- - -* bug #2144 Remove temporary files not deleted by destructor on failure (adawolfa) -* bug #2150 SelfUpdateCommand: resolve symlink (julienfalque) -* bug #2162 Fix issue where an exception is thrown if the cache file exists but is empty. (ikari7789) -* bug #2164 OperatorsSpacesFixer - Do not unalign double arrow and equals operators (SpacePossum) -* bug #2167 Rewrite file removal (keradus) -* minor #2152 Code cleanup (keradus) -* minor #2154 ShutdownFileRemoval - Fixed file header (GrahamCampbell) - -Changelog for v1.12.0 ---------------------- - -* feature #1493 Added MethodArgumentDefaultValueFixer (lmanzke) -* feature #1495 BracesFixer - added support for declare (EspadaV8) -* feature #1518 Added ClassDefinitionFixer (SpacePossum) -* feature #1543 [PSR-2] Switch case space fixer (Soullivaneuh) -* feature #1577 Added SpacesAfterSemicolonFixer (SpacePossum) -* feature #1580 Added HeredocToNowdocFixer (gharlan) -* feature #1581 UnneededControlParenthesesFixer - add "break" and "continue" support (gharlan) -* feature #1610 HashToSlashCommentFixer - Add (SpacePossum) -* feature #1613 ScalarCastFixer - LowerCaseCastFixer - Add (SpacePossum) -* feature #1659 NativeFunctionCasingFixer - Add (SpacePossum) -* feature #1661 SwitchCaseSemicolonToColonFixer - Add (SpacePossum) -* feature #1662 Added CombineConsecutiveUnsetsFixer (SpacePossum) -* feature #1671 Added NoEmptyStatementFixer (SpacePossum) -* feature #1705 Added NoUselessReturnFixer (SpacePossum, keradus) -* feature #1735 Added NoTrailingWhitespaceInCommentFixer (keradus) -* feature #1750 Add PhpdocSingleLineVarSpacingFixer (SpacePossum) -* feature #1765 Added NoEmptyPhpdocFixer (SpacePossum) -* feature #1773 Add NoUselessElseFixer (gharlan, SpacePossum) -* feature #1786 Added NoEmptyCommentFixer (SpacePossum) -* feature #1792 Add PhpUnitDedicateAssertFixer. (SpacePossum) -* feature #1894 BracesFixer - correctly fix indents of anonymous functions/classes (gharlan) -* feature #1985 Added ClassKeywordRemoveFixer (Soullivaneuh) -* feature #2020 Added PhpdocAnnotationWithoutDotFixer (keradus) -* feature #2067 Added DeclareEqualNormalizeFixer (keradus) -* feature #2078 Added SilencedDeprecationErrorFixer (HeahDude) -* feature #2082 Added MbStrFunctionsFixer (Slamdunk) -* bug #1657 SwitchCaseSpaceFixer - Fix spacing between 'case' and semicolon (SpacePossum) -* bug #1684 SpacesAfterSemicolonFixer - fix loops handling (SpacePossum, keradus) -* bug #1700 Fixer - resolve import conflict (keradus) -* bug #1836 NoUselessReturnFixer - Do not remove return if last statement in short if statement (SpacePossum) -* bug #1879 HeredocToNowdocFixer - Handle space in heredoc token (SpacePossum) -* bug #1896 FixCommand - Fix escaping of diff output (SpacePossum) -* bug #2034 IncludeFixer - fix support for close tag (SpacePossum) -* bug #2040 PhpdocAnnotationWithoutDotFixer - fix crash on odd character (keradus) -* bug #2041 DefaultFinder should implement FinderInterface (keradus) -* bug #2050 PhpdocAnnotationWithoutDotFixer - handle ellipsis (keradus) -* bug #2051 NativeFunctionCasingFixer - call to constructor with default NS of class with name matching native function name fix (SpacePossum) -* minor #1538 Added possibility to lint tests (gharlan) -* minor #1569 Add sample to get a specific version of the fixer (Soullivaneuh) -* minor #1571 Enhance integration tests (keradus) -* minor #1578 Code grooming (keradus) -* minor #1583 Travis - update matrix (keradus) -* minor #1585 Code grooming - Improve utests code coverage (SpacePossum) -* minor #1586 Add configuration exception classes and exit codes (SpacePossum) -* minor #1594 Fix invalid PHP code samples in utests (SpacePossum) -* minor #1597 MethodArgumentDefaultValueFixer - refactoring and fix closures with "use" clause (gharlan) -* minor #1600 Added more integration tests (SpacePossum, keradus) -* minor #1605 integration tests - swap EXPECT and INPUT (optional INPUT) (gharlan) -* minor #1608 Travis - change matrix order for faster results (gharlan) -* minor #1609 CONTRIBUTING.md - Don't rebase always on master (SpacePossum) -* minor #1616 IncludeFixer - fix and test more cases (SpacePossum) -* minor #1622 AbstractIntegratationTest - fix linting test cases (gharlan) -* minor #1624 fix invalid code in test cases (gharlan) -* minor #1625 Travis - switch to trusty (keradus) -* minor #1627 FixCommand - fix output (keradus) -* minor #1630 Pass along the exception code. (SpacePossum) -* minor #1632 Php Inspections (EA Extended): SCA for 1.12 (kalessil) -* minor #1633 Fix CS for project itself (keradus) -* minor #1634 Backport some minor changes from 2.x line (keradus) -* minor #1637 update PHP Coveralls (keradus) -* minor #1639 Revert "Travis - set dist to trusty" (keradus) -* minor #1641 AppVeyor/Travis - use GITHUB_OAUTH_TOKEN (keradus) -* minor #1642 AppVeyor - install dev deps as well (keradus) -* minor #1647 Deprecate non-default Configs and Finders (keradus) -* minor #1654 Split output to stderr and stdout (SpacePossum) -* minor #1660 update phpunit version (gharlan) -* minor #1663 DuplicateSemicolonFixer - Remove duplicate semicolons even if there are comments between those (SpacePossum) -* minor #1664 IncludeFixer - Add missing test case (SpacePossum) -* minor #1668 Code grooming (keradus) -* minor #1669 NativeFunctionCasingFixer - move to Symfony level (keradus) -* minor #1670 Backport Finder and Config classes from 2.x line (keradus) -* minor #1682 ElseifFixer - handle comments (SpacePossum) -* minor #1689 AbstractIntegrationTest - no need for single-char group and docs grooming (keradus) -* minor #1690 Integration tests - allow to not check priority, introduce IntegrationCase (keradus) -* minor #1701 Fixer - Renamed import alias (GrahamCampbell) -* minor #1708 Update composer.json requirements (keradus) -* minor #1734 Travis: Turn on linting (keradus) -* minor #1736 Integration tests - don't check priority for tests using short_tag fixer (keradus) -* minor #1739 NoTrailingWhitespaceInCommentFixer - move to PSR2 level (keradus) -* minor #1763 Deprecate ConfigInterface::getDir, ConfigInterface::setDir, Finder::setDir (keradus) -* minor #1777 NoTrailingWhitespaceInCommentFixer - fix parent class (keradus) -* minor #1816 PhpUnitDedicateAssertFixer - configuration is not required anymore (keradus) -* minor #1849 DocBlock - The category tag should be together with package (GrahamCampbell) -* minor #1870 Update README.rst (glensc) -* minor #1880 FixCommand - fix stdErr detection (SpacePossum) -* minor #1881 NoEmptyStatementFixer - handle anonymous classes correctly (gharlan) -* minor #1906 .php_cs - use no_useless_else rule (keradus) -* minor #1915 NoEmptyComment - move to Symfony level (SpacePossum) -* minor #1917 BracesFixer - fixed comment handling (gharlan) -* minor #1919 EmptyReturnFixer - move fixer outside of Symfony level (keradus) -* minor #2036 OrderedUseFixer - adjust tests (keradus) -* minor #2056 Travis - run nightly PHP (keradus) -* minor #2061 UnusedUseFixer and LineAfterNamespace - add new integration test (keradus) -* minor #2097 Add lambda tests for 7.0 and 7.1 (SpacePossum) -* minor #2111 .travis.yml - rename PHP 7.1 env (keradus) -* minor #2112 Fix 1.12 line (keradus) -* minor #2118 SilencedDeprecationErrorFixer - adjust level (keradus) -* minor #2132 composer.json - rename package name (keradus) -* minor #2133 Apply ordered_class_elements rule (keradus) -* minor #2138 composer.json - disallow to run on PHP 7.2+ (keradus) - -Changelog for v1.11.8 ---------------------- - -* bug #2143 ReadmeCommand - fix running command on phar file (keradus) -* minor #2129 Add .gitattributes to remove unneeded files (Slamdunk) -* minor #2141 Move phar building to PHP 5.6 job as newest box.phar is no longer working on 5.3 (keradus) - -Changelog for v1.11.7 ---------------------- - -* bug #2108 ShortArraySyntaxFixer, TernarySpacesFixer, UnalignEqualsFixer - fix priority bug (SpacePossum) -* bug #2092 ConcatWithoutSpacesFixer, OperatorsSpacesFixer - fix too many spaces, fix incorrect fixing of lines with comments (SpacePossum) - -Changelog for v1.11.6 ---------------------- - -* bug #2086 Braces - fix bug with comment in method prototype (keradus) -* bug #2077 SingleLineAfterImportsFixer - Do not remove lines between use cases (SpacePossum) -* bug #2079 TernarySpacesFixer - Remove multiple spaces (SpacePossum) -* bug #2087 Fixer - handle PHP7 Errors as well (keradus) -* bug #2072 LowercaseKeywordsFixer - handle CT_CLASS_CONSTANT (tgabi333) -* bug #2066 LineAfterNamespaceFixer - Handle close tag (SpacePossum) -* bug #2057 LineAfterNamespaceFixer - adding too much extra lines where namespace is last statement (keradus) -* bug #2059 OperatorsSpacesFixer - handle declare statement (keradus) -* bug #2060 UnusedUseFixer - fix handling whitespaces around removed import (keradus) -* minor #2071 ShortEchoTagFixer - allow to run tests on PHP 5.3 (keradus) - -Changelog for v1.11.5 ---------------------- - -* bug #2012 Properly build phar file for lowest supported PHP version (keradus) -* bug #2037 BracesFixer - add support for anonymous classes (keradus) -* bug #1989 Add support for PHP 7 namespaces (SpacePossum) -* bug #2019 Fixing newlines added after curly brace string index access (jaydiablo) -* bug #1840 [Bug] BracesFixer - Do add a line before close tag (SpacePossum) -* bug #1994 EchoToPrintFixer - Fix T_OPEN_TAG_WITH_ECHO on hhvm (keradus) -* bug #1970 Tokens - handle semi-reserved PHP 7 keywords (keradus) -* minor #2017 PHP7 integration tests (keradus) -* minor #1465 Bump supported HHVM version, improve ShortEchoTagFixer on HHVM (keradus) -* minor #1995 Rely on own phpunit, not one from CI service (keradus) - -Changelog for v1.11.4 ---------------------- - -* bug #1956 SelfUpdateCommand - don't update to non-stable version (keradus) -* bug #1963 Fix not wanted unneeded_control_parentheses fixer for clone (Soullivaneuh) -* bug #1960 Fix invalid test cases (keradus) -* bug #1939 BracesFixer - fix handling comment around control token (keradus) -* minor #1927 NewWithBracesFixer - remove invalid testcase (keradus) - -Changelog for v1.11.3 ---------------------- - -* bug #1868 NewWithBracesFixer - fix handling more neighbor tokens (keradus) -* bug #1893 BracesFixer - handle comments inside lambda function prototype (keradus) -* bug #1806 SelfAccessorFixer - skip anonymous classes (gharlan) -* bug #1813 BlanklineAfterOpenTagFixer, NoBlankLinesBeforeNamespaceFixer - fix priority (SpacePossum) -* minor #1807 Tokens - simplify isLambda() (gharlan) - -Changelog for v1.11.2 ---------------------- - -* bug #1776 EofEndingFixer - new line on end line comment is allowed (Slamdunk) -* bug #1775 FileCacheManager - ignore corrupted serialized data (keradus) -* bug #1769 FunctionDeclarationFixer - fix more cases (keradus) -* bug #1747 Fixer - Fix ordering of fixer when both level and custom fixers are used (SpacePossum) -* bug #1744 Fixer - fix rare situation when file was visited twice (keradus) -* bug #1710 LowercaseConstantFixer - Fix comment cases. (SpacePossum) -* bug #1711 FunctioncallSpaceFixer - do not touch function declarations. (SpacePossum) -* minor #1798 LintManager - meaningful tempnam (Slamdunk) -* minor #1759 UniqueFileIterator - performance improvement (GrahamCampbell) -* minor #1745 appveyor - fix build (keradus) - -Changelog for v1.11.1 ---------------------- - -* bug #1680 NewWithBracesFixer - End tags (SpacePossum) -* bug #1685 EmptyReturnFixer - Make independent of LowercaseConstantsFixer (SpacePossum) -* bug #1640 IntegrationTest - fix directory separator (keradus) -* bug #1595 ShortTagFixer - fix priority (keradus) -* bug #1576 SpacesBeforeSemicolonFixer - do not remove space before semicolon if that space is after a semicolon (SpacePossum) -* bug #1570 UnneededControlParenthesesFixer - fix test samples (keradus) -* minor #1653 Update license year (gharlan) - -Changelog for v1.11 -------------------- - -* feature #1550 Added UnneededControlParenthesesFixer (Soullivaneuh, keradus) -* feature #1532 Added ShortBoolCastFixer (SpacePossum) -* feature #1523 Added EchoToPrintFixer and PrintToEchoFixer (Soullivaneuh) -* feature #1552 Warn when running with xdebug extension (SpacePossum) -* feature #1484 Added ArrayElementNoSpaceBeforeCommaFixer and ArrayElementWhiteSpaceAfterCommaFixer (amarczuk) -* feature #1449 PhpUnitConstructFixer - Fix more use cases (SpacePossum) -* feature #1382 Added PhpdocTypesFixer (GrahamCampbell) -* feature #1384 Add integration tests (SpacePossum) -* feature #1349 Added FunctionTypehintSpaceFixer (keradus) -* minor #1562 Fix invalid PHP code samples in utests (SpacePossum) -* minor #1560 Fixed project name in xdebug warning (gharlan) -* minor #1545 Fix invalid PHP code samples in utests (SpacePossum) -* minor #1554 Alphabetically sort entries in .gitignore (GrahamCampbell) -* minor #1527 Refactor the way types work on annotations (GrahamCampbell) -* minor #1546 Update coding guide in cookbook (keradus) -* minor #1526 Support more annotations when fixing types in phpdoc (GrahamCampbell) -* minor #1535 clean ups (SpacePossum) -* minor #1510 Added Symfony 3.0 support (Ener-Getick) -* minor #1520 Code grooming (keradus) -* minor #1515 Support property, property-read and property-write tags (GrahamCampbell) -* minor #1488 Added more inline phpdoc tests (GrahamCampbell) -* minor #1496 Add docblock to AbstractFixerTestBase::makeTest (lmanzke) -* minor #1467 PhpdocShortDescriptionFixer - add support for Japanese sentence-ending characters (fritz-c) -* minor #1453 remove calling array_keys in foreach loops (keradus) -* minor #1448 Code grooming (keradus) -* minor #1437 Added import fixers integration test (GrahamCampbell) -* minor #1433 phpunit.xml.dist - disable gc (keradus) -* minor #1427 Change arounded to surrounded in README.rst (36degrees) -* minor #1420 AlignDoubleArrowFixer, AlignEqualsFixer - add integration tests (keradus) -* minor #1423 appveyor.yml - do not cache C:\tools, its internal forAppVeyor (keradus) -* minor #1400 appveyor.yml - add file (keradus) -* minor #1396 AbstractPhpdocTypesFixer - instance method should be called on instance (keradus) -* minor #1395 code grooming (keradus) -* minor #1393 boost .travis.yml file (keradus) -* minor #1372 Don't allow PHP 7 to fail (GrahamCampbell) -* minor #1332 PhpUnitConstructFixer - fix more functions (keradus) -* minor #1339 CONTRIBUTING.md - add link to PSR-5 (keradus) -* minor #1346 Core grooming (SpacePossum) -* minor #1328 Tokens: added typehint for Iterator elements (gharlan) - -Changelog for v1.10.3 ---------------------- - -* bug #1559 WhitespacyLinesFixer - fix bug cases (SpacePossum, keradus) -* bug #1541 Psr0Fixer - Ignore filenames that are a reserved keyword or predefined constant (SpacePossum) -* bug #1537 Psr0Fixer - ignore file without name or with name started by digit (keradus) -* bug #1516 FixCommand - fix wrong message for dry-run (SpacePossum) -* bug #1486 ExtraEmptyLinesFixer - Remove extra lines after comment lines too (SpacePossum) -* bug #1503 Psr0Fixer - fix case with comments lying around (GrahamCampbell) -* bug #1474 PhpdocToCommentFixer - fix not properly fixing for block right after namespace (GrahamCampbell) -* bug #1478 BracesFixer - do not remove empty lines after class opening (keradus) -* bug #1468 Add missing ConfigInterface::getHideProgress() (Eugene Leonovich, rybakit) -* bug #1466 Fix bad indent on align double arrow fixer (Soullivaneuh, keradus) -* bug #1479 Tokens - fix detection of short array (keradus) - -Changelog for v1.10.2 ---------------------- - -* bug #1461 PhpUnitConstructFixer - fix case when first argument is an expression (keradus) -* bug #1460 AlignDoubleArrowFixer - fix handling of nested arrays (Soullivaneuh, keradus) - -Changelog for v1.10.1 ---------------------- - -* bug #1424 Fixed the import fixer priorities (GrahamCampbell) -* bug #1444 OrderedUseFixer - fix next case (keradus) -* bug #1441 BracesFixer - fix next case (keradus) -* bug #1422 AlignDoubleArrowFixer - fix handling of nested array (SpacePossum) -* bug #1425 PhpdocInlineTagFixerTest - fix case when met inalid PHPDoc (keradus) -* bug #1419 AlignDoubleArrowFixer, AlignEqualsFixer - fix priorities (keradus) -* bug #1415 BlanklineAfterOpenTagFixer - Do not add a line break if there is one already. (SpacePossum) -* bug #1410 PhpdocIndentFixer - Fix for open tag (SpacePossum) -* bug #1401 PhpdocVarWithoutNameFixer - Fixed the var without name fixer for inline docs (keradus, GrahamCampbell) -* bug #1369 Fix not well-formed XML output (junichi11) -* bug #1356 Psr0Fixer - disallow run on StdinFileInfo (keradus) - -Changelog for v1.10 -------------------- - -* feature #1306 Added LogicalNotOperatorsWithSuccessorSpaceFixer (phansys) -* feature #1286 Added PhpUnitConstructFixer (keradus) -* feature #1316 Added PhpdocInlineTagFixer (SpacePossum, keradus) -* feature #1303 Added LogicalNotOperatorsWithSpacesFixer (phansys) -* feature #1279 Added PhpUnitStrictFixer (keradus) -* feature #1267 SingleQuoteFixer fix more use cases (SpacePossum) -* minor #1319 PhpUnitConstructFixer - fix performance and add to local .php_cs (keradus) -* minor #1280 Fix non-utf characters in docs (keradus) -* minor #1274 Cookbook - No change auto-test note (Soullivaneuh) - -Changelog for v1.9.3 --------------------- - -* bug #1327 DocBlock\Tag - keep the case of tags (GrahamCampbell) - -Changelog for v1.9.2 --------------------- - -* bug #1313 AlignDoubleArrowFixer - fix aligning after UTF8 chars (keradus) -* bug #1296 PhpdocScalarFixer - fix property annotation too (GrahamCampbell) -* bug #1299 WhitespacyLinesFixer - spaces on next valid line must not be fixed (Slamdunk) - -Changelog for v1.9.1 --------------------- - -* bug #1288 TrimArraySpacesFixer - fix moving first comment (keradus) -* bug #1287 PhpdocParamsFixer - now works on any indentation level (keradus) -* bug #1278 Travis - fix PHP7 build (keradus) -* bug #1277 WhitespacyLinesFixer - stop changing non-whitespacy tokens (SpacePossum, SamBurns-awin, keradus) -* bug #1224 TrailingSpacesFixer - stop changing non-whitespacy tokens (SpacePossum, SamBurns-awin, keradus) -* bug #1266 FunctionCallSpaceFixer - better detection of function call (funivan) -* bug #1255 make sure some phpdoc fixers are run in right order (SpacePossum) - -Changelog for v1.9 ------------------- - -* feature #1097 Added ShortEchoTagFixer (vinkla) -* minor #1238 Fixed error handler to respect current error_reporting (JanJakes) -* minor #1234 Add class to exception message, use sprintf for exceptions (SpacePossum) -* minor #1210 set custom error handler for application run (keradus) -* minor #1214 Tokens::isMonolithicPhp - enhance performance (keradus) -* minor #1207 Update code documentation (keradus) -* minor #1202 Update IDE tool urls (keradus) -* minor #1195 PreIncrementFixer - move to Symfony level (gharlan) - -Changelog for v1.8.1 --------------------- - -* bug #1193 EofEndingFixer - do not add an empty line at EOF if the PHP tags have been closed (SpacePossum) -* bug #1209 PhpdocParamsFixer - fix corrupting following custom annotation (keradus) -* bug #1205 BracesFixer - fix missing indentation fixes for class level (keradus) -* bug #1204 Tag - fix treating complex tag as simple PhpDoc tag (keradus) -* bug #1198 Tokens - fixed unary/binary operator check for type-hinted reference arguments (gharlan) -* bug #1201 Php4ConstructorFixer - fix invalid handling of subnamespaces (gharlan) -* minor #1221 Add more tests (SpacePossum) -* minor #1216 Tokens - Add unit test for array detection (SpacePossum) - -Changelog for v1.8 ------------------- - -* feature #1168 Added UnalignEqualsFixer (keradus) -* feature #1167 Added UnalignDoubleArrowFixer (keradus) -* bug #1169 ToolInfo - Fix way to find script dir (sp-ian-monge) -* minor #1181 composer.json - Update description (SpacePossum) -* minor #1180 create Tokens::overrideAt method (keradus) - -Changelog for v1.7.1 --------------------- - -* bug #1165 BracesFixer - fix bug when comment is a first statement in control structure without braces (keradus) - -Changelog for v1.7 ------------------- - -* feature #1113 Added PreIncrementFixer (gharlan) -* feature #1144 Added PhpdocNoAccessFixer (GrahamCampbell) -* feature #1116 Added SelfAccessorFixer (gharlan) -* feature #1064 OperatorsSpacesFixer enhancements (gharlan) -* bug #1151 Prevent token collection corruption by fixers (stof, keradus) -* bug #1152 LintManager - fix handling of temporary file (keradus) -* bug #1139 NamespaceNoLeadingWhitespaceFixer - remove need for ctype extension (keradus) -* bug #1117 Tokens - fix iterator used with foreach by reference (keradus) -* minor #1148 code grooming (keradus) -* minor #1142 We are actually PSR-4, not PSR-0 (GrahamCampbell) -* minor #1131 Phpdocs and typos (SpacePossum) -* minor #1069 state min HHVM version (keradus) -* minor #1129 [DX] Help developers choose the right branch (SpacePossum) -* minor #1138 PhpClosingTagFixer - simplify flow, no need for loop (keradus) -* minor #1123 Reference mismatches fixed, SCA (kalessil) -* minor #1109 SingleQuoteFixer - made fixer more accurate (gharlan) -* minor #1110 code grooming (kalessil) - -Changelog for v1.6.2 --------------------- - -* bug #1149 UnusedUseFixer - must be run before LineAfterNamespaceFixer, fix token collection corruption (keradus) -* minor #1145 AbstractLinesBeforeNamespaceFixer - fix docs for fixLinesBeforeNamespace (GrahamCampbell) - -Changelog for v1.6.1 --------------------- - -* bug #1108 UnusedUseFixer - fix false positive when name is used as part of another namespace (gharlan) -* bug #1114 Fixed PhpdocParamsFixer with malformed doc block (gharlan) -* minor #1135 PhpdocTrimFixer - fix doc typo (localheinz) -* minor #1093 Travis - test lowest dependencies (boekkooi) - -Changelog for v1.6 ------------------- - -* feature #1089 Added NewlineAfterOpenTagFixer and BlanklineAfterOpenTagFixer (ceeram, keradus) -* feature #1090 Added TrimArraySpacesFixer (jaredh159, keradus) -* feature #1058 Added SingleQuoteFixer (gharlan) -* feature #1059 Added LongArraySyntaxFixer (gharlan) -* feature #1037 Added PhpdocScalarFixer (GrahamCampbell, keradus) -* feature #1028 Add ListCommasFixer (keradus) -* bug #1047 Utils::camelCaseToUnderscore - fix regexp (odin-delrio) -* minor #1073 ShortTagFixer enhancement (gharlan) -* minor #1079 Use LongArraySyntaxFixer for this repo (gharlan) -* minor #1070 Tokens::isMonolithicPhp - remove unused T_CLOSE_TAG search (keradus) -* minor #1049 OrderedUseFixer - grooming (keradus) - -Changelog for v1.5.2 --------------------- - -* bug #1025 Fixer - ignore symlinks (kix) -* bug #1071 Psr0Fixer - fix bug for fixing file with long extension like .class.php (keradus) -* bug #1080 ShortTagFixer - fix false positive (gharlan) -* bug #1066 Php4ConstructorFixer - fix causing infinite recursion (mbeccati) -* bug #1056 VisibilityFixer - fix T_VAR with multiple props (localheinz, keradus) -* bug #1065 Php4ConstructorFixer - fix detection of a PHP4 parent constructor variant (mbeccati) -* bug #1060 Tokens::isShortArray: tests and bugfixes (gharlan) -* bug #1057 unused_use: fix false positive when name is only used as variable name (gharlan) - -Changelog for v1.5.1 --------------------- - -* bug #1054 VisibilityFixer - fix var with array value assigned (localheinz, keradus) -* bug #1048 MultilineArrayTrailingCommaFixer, SingleArrayNoTrailingCommaFixer - using heredoc inside array not cousing to treat it as multiline array (keradus) -* bug #1043 PhpdocToCommentFixer - also check other control structures, besides foreach (ceeram) -* bug #1045 OrderedUseFixer - fix namespace order for trailing digits (rusitschka) -* bug #1035 PhpdocToCommentFixer - Add static as valid keyword for structural element (ceeram) -* bug #1020 BracesFixer - fix missing braces for nested if elseif else (malengrin) -* minor #1036 Added php7 to travis build (fonsecas72) -* minor #1026 Fix typo in ShortArraySyntaxFixer (tommygnr) -* minor #1024 code grooming (keradus) - -Changelog for v1.5 ------------------- - -* feature #887 Added More Phpdoc Fixers (GrahamCampbell, keradus) -* feature #1002 Add HeaderCommentFixer (ajgarlag) -* feature #974 Add EregToPregFixer (mbeccati) -* feature #970 Added Php4ConstructorFixer (mbeccati) -* feature #997 Add PhpdocToCommentFixer (ceeram, keradus) -* feature #932 Add NoBlankLinesAfterClassOpeningFixer (ceeram) -* feature #879 Add SingleBlankLineBeforeNamespaceFixer and NoBlankLinesBeforeNamespaceFixer (GrahamCampbell) -* feature #860 Add single_line_after_imports fixer (ceeram) -* minor #1014 Fixed a few file headers (GrahamCampbell) -* minor #1011 Fix HHVM as it works different than PHP (keradus) -* minor #1010 Fix invalid UTF-8 char in docs (ajgarlag) -* minor #1003 Fix header comment in php files (ajgarlag) -* minor #1005 Add Utils::calculateBitmask method (keradus) -* minor #973 Add Tokens::findSequence (mbeccati) -* minor #991 Longer explanation of how to use blacklist (bmitch, networkscraper) -* minor #972 Add case sensitive option to the tokenizer (mbeccati) -* minor #986 Add benchmark script (dericofilho) -* minor #985 Fix typo in COOKBOOK-FIXERS.md (mattleff) -* minor #978 Token - fix docs (keradus) -* minor #957 Fix Fixers methods order (GrahamCampbell) -* minor #944 Enable caching of composer downloads on Travis (stof) -* minor #941 EncodingFixer - enhance tests (keradus) -* minor #938 Psr0Fixer - remove unneded assignment (keradus) -* minor #936 FixerTest - test description consistency (keradus) -* minor #933 NoEmptyLinesAfterPhpdocsFixer - remove unneeded code, clarify description (ceeram) -* minor #934 StdinFileInfo::getFilename - Replace phpdoc with normal comment and add back empty line before return (ceeram) -* minor #927 Exclude the resources folder from coverage reports (GrahamCampbell) -* minor #926 Update Token::isGivenKind phpdoc (GrahamCampbell) -* minor #925 Improved AbstractFixerTestBase (GrahamCampbell) -* minor #922 AbstractFixerTestBase::makeTest - test if input is different than expected (keradus) -* minor #904 Refactoring Utils (GrahamCampbell) -* minor #901 Improved Readme Formatting (GrahamCampbell) -* minor #898 Tokens::getImportUseIndexes - simplify function (keradus) -* minor #897 phpunit.xml.dist - split testsuite (keradus) - -Changelog for v1.4.2 --------------------- - -* bug #994 Fix detecting of short arrays (keradus) -* bug #995 DuplicateSemicolonFixer - ignore duplicated semicolons inside T_FOR (keradus) - -Changelog for v1.4.1 --------------------- - -* bug #990 MultilineArrayTrailingCommaFixer - fix case with short array on return (keradus) -* bug #975 NoEmptyLinesAfterPhpdocsFixer - fix only when documentation documents sth (keradus) -* bug #976 PhpdocIndentFixer - fix error when there is a comment between docblock and next meaningful token (keradus, ceeram) - -Changelog for v1.4 ------------------- - -* feature #841 PhpdocParamsFixer: added aligning var/type annotations (GrahamCampbell) -* bug #965 Fix detection of lambda function that returns a reference (keradus) -* bug #962 PhpdocIndentFixer - fix bug when documentation is on the end of braces block (keradus) -* bug #961 Fixer - fix handling of empty file (keradus) -* bug #960 IncludeFixer - fix bug when include is part of condition statement (keradus) -* bug #954 AlignDoubleArrowFixer - fix new buggy case (keradus) -* bug #955 ParenthesisFixer - fix case with list call with trailing comma (keradus) -* bug #950 Tokens::isLambda - fix detection near comments (keradus) -* bug #951 Tokens::getImportUseIndexes - fix detection near comments (keradus) -* bug #949 Tokens::isShortArray - fix detection near comments (keradus) -* bug #948 NewWithBracesFixer - fix case with multidimensional array (keradus) -* bug #945 Skip files containing __halt_compiler() on PHP 5.3 (stof) -* bug #946 BracesFixer - fix typo in exception name (keradus) -* bug #940 Tokens::setCode - apply missing transformation (keradus) -* bug #908 BracesFixer - fix invalide inserting brace for control structure without brace and lambda inside of it (keradus) -* bug #903 NoEmptyLinesAfterPhpdocsFixer - fix bug with Windows style lines (GrahamCampbell) -* bug #895 [PSR-2] Preserve blank line after control structure opening brace (marcaube) -* bug #892 Fixed the double arrow multiline whitespace fixer (GrahamCampbell) -* bug #874 BracesFixer - fix bug of removing empty lines after class' opening { (ceeram) -* bug #868 BracesFixer - fix missing braces when statement is not followed by ; (keradus) -* bug #861 Updated PhpdocParamsFixer not to change line endings (keradus, GrahamCampbell) -* bug #837 FixCommand - stop corrupting xml/json format (keradus) -* bug #846 Made phpdoc_params run after phpdoc_indent (GrahamCampbell) -* bug #834 Correctly handle tab indentation (ceeram) -* bug #822 PhpdocIndentFixer - Ignore inline docblocks (ceeram) -* bug #813 MultilineArrayTrailingCommaFixer - do not move array end to new line (keradus) -* bug #817 LowercaseConstantsFixer - ignore class' constants TRUE/FALSE/NULL (keradus) -* bug #821 JoinFunctionFixer - stop changing declaration method name (ceeram) -* minor #963 State the minimum version of PHPUnit in CONTRIBUTING.md (SpacePossum) -* minor #943 Improve the cookbook to use relative links (stof) -* minor #921 Add changelog file (keradus) -* minor #909 BracesFixerTest - no \n line in \r\n test (keradus) -* minor #864 Added NoEmptyLinesAfterPhpdocsFixer (GrahamCampbell) -* minor #871 Added missing author (GrahamCampbell) -* minor #852 Fixed the coveralls version constraint (GrahamCampbell) -* minor #863 Tweaked testRetainsNewLineCharacters (GrahamCampbell) -* minor #849 Removed old alias (GrahamCampbell) -* minor #843 integer should be int (GrahamCampbell) -* minor #830 Remove whitespace before opening tag (ceeram) -* minor #835 code grooming (keradus) -* minor #828 PhpdocIndentFixerTest - code grooming (keradus) -* minor #827 UnusedUseFixer - code grooming (keradus) -* minor #825 improve code coverage (keradus) -* minor #810 improve code coverage (keradus) -* minor #811 ShortArraySyntaxFixer - remove not needed if statement (keradus) - -Changelog for v1.3 ------------------- - -* feature #790 Add docblock indent fixer (ceeram) -* feature #771 Add JoinFunctionFixer (keradus) -* bug #798 Add DynamicVarBrace Transformer for properly handling ${$foo} syntax (keradus) -* bug #796 LowercaseConstantsFixer - rewrite to handle new test cases (keradus) -* bug #789 T_CASE is not succeeded by parentheses (dericofilho) -* minor #814 Minor improvements to the phpdoc_params fixer (GrahamCampbell) -* minor #815 Minor fixes (GrahamCampbell) -* minor #782 Cookbook on how to make a new fixer (dericofilho) -* minor #806 Fix Tokens::detectBlockType call (keradus) -* minor #758 travis - disable sudo (keradus) -* minor #808 Tokens - remove commented code (keradus) -* minor #802 Address Sensiolabs Insight's warning of code cloning. (dericofilho) -* minor #803 README.rst - fix \` into \`\` (keradus) - -Changelog for v1.2 ------------------- - -* feature #706 Remove lead slash (dericofilho) -* feature #740 Add EmptyReturnFixer (GrahamCampbell) -* bug #775 PhpClosingTagFixer - fix case with T_OPEN_TAG_WITH_ECHO (keradus) -* bug #756 Fix broken cases for AlignDoubleArrowFixer (dericofilho) -* bug #763 MethodArgumentSpaceFixer - fix receiving data in list context with omitted values (keradus) -* bug #759 Fix Tokens::isArrayMultiLine (stof, keradus) -* bug #754 LowercaseKeywordsFixer - __HALT_COMPILER must not be lowercased (keradus) -* bug #753 Fix for double arrow misalignment in deeply nested arrays. (dericofilho) -* bug #752 OrderedUseFixer should be case-insensitive (rusitschka) -* minor #779 Fixed a docblock type (GrahamCampbell) -* minor #765 Typehinting in FileCacheManager, remove unused variable in Tokens (keradus) -* minor #764 SelfUpdateCommand - get local version only if remote version was successfully obtained (keradus) -* minor #761 aling => (keradus) -* minor #757 Some minor code simplify and extra test (keradus) -* minor #713 Download php-cs-fixer.phar without sudo (michaelsauter) -* minor #742 Various Minor Improvements (GrahamCampbell) - -Changelog for v1.1 ------------------- - -* feature #749 remove the --no-progress option (replaced by the standard -v) (fabpot, keradus) -* feature #728 AlignDoubleArrowFixer - standardize whitespace after => (keradus) -* feature #647 Add DoubleArrowMultilineWhitespacesFixer (dericofilho, keradus) -* bug #746 SpacesBeforeSemicolonFixerTest - fix bug with semicolon after comment (keradus) -* bug #741 Fix caching when composer is installed in custom path (cmodijk) -* bug #725 DuplicateSemicolonFixer - fix clearing whitespace after duplicated semicolon (keradus) -* bug #730 Cache busting when fixers list changes (Seldaek) -* bug #722 Fix lint for STDIN-files (ossinkine) -* bug #715 TrailingSpacesFixer - fix bug with french UTF-8 chars (keradus) -* bug #718 Fix package name for composer cache (Seldaek) -* bug #711 correct vendor name (keradus) -* minor #745 Show progress by default and allow to disable it (keradus) -* minor #731 Add a way to disable all default filters and really provide a whitelist (Seldaek) -* minor #737 Extract tool info into new class, self-update command works now only for PHAR version (keradus) -* minor #739 fix fabbot issues (keradus) -* minor #726 update CONTRIBUTING.md for installing dependencies (keradus) -* minor #736 Fix fabbot issues (GrahamCampbell) -* minor #727 Fixed typos (pborreli) -* minor #719 Add update instructions for composer and caching docs (Seldaek) - -Changelog for v1.0 ------------------- - -First stable release. diff --git a/vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md b/vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md deleted file mode 100644 index 605b849..0000000 --- a/vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md +++ /dev/null @@ -1,43 +0,0 @@ -# Contributions Are Welcome! - -If you need any help, don't hesitate to ask the community on [Gitter](https://gitter.im/PHP-CS-Fixer/Lobby). - -## Quick Guide - -* [Fork](https://help.github.com/articles/fork-a-repo/) the repo. -* [Checkout](https://git-scm.com/docs/git-checkout) the branch you want to make changes on: - * If you are fixing a bug or typo, improving tests or for any small tweak: the lowest branch where the changes can be applied. Once your Pull Request is accepted, the changes will get merged up to highest branches. - * `master` in other cases (new feature, deprecation, or backwards compatibility breaking changes). Note that most of the time, `master` represents the next minor release of PHP CS Fixer, so Pull Requests that break backwards compatibility might be postponed. -* Install dependencies: `composer install`. -* Create a new branch, e.g. `feature-foo` or `bugfix-bar`. -* Make changes. -* If you are adding functionality or fixing a bug - add a test! Prefer adding new test cases over modifying existing ones. -* Make sure there is no trailing spaces in code: `./check_trailing_spaces.sh`. -* Regenerate README: `php php-cs-fixer readme > README.rst` (Windows `php.exe php-cs-fixer readme > README.rst`). Do not modify `README.rst` manually! -* Install dev tools: `dev-tools/install.sh` -* Run static analysis using PHPStan: `php -d memory_limit=256M dev-tools/vendor/bin/phpstan analyse` -* Check if tests pass: `vendor/bin/phpunit`. -* Fix project itself: `php php-cs-fixer fix`. - -## Opening a [Pull Request](https://help.github.com/articles/about-pull-requests/) - -You can do some things to increase the chance that your Pull Request is accepted the first time: - -* Submit one Pull Request per fix or feature. -* If your changes are not up to date, [rebase](https://git-scm.com/docs/git-rebase) your branch onto the parent branch. -* Follow the conventions used in the project. -* Remember about tests and documentation. -* Don't bump version. - -## Making New Fixers - -There is a [cookbook](doc/COOKBOOK-FIXERS.md) with basic instructions on how to build a new fixer. Consider reading it -before opening a PR. - -## Project's Standards - -* [PSR-1: Basic Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md) -* [PSR-2: Coding Style Guide](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) -* [PSR-4: Autoloading Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) -* [PSR-5: PHPDoc (draft)](https://github.com/phpDocumentor/fig-standards/blob/master/proposed/phpdoc.md) -* [Symfony Coding Standards](https://symfony.com/doc/current/contributing/code/standards.html) diff --git a/vendor/friendsofphp/php-cs-fixer/LICENSE b/vendor/friendsofphp/php-cs-fixer/LICENSE deleted file mode 100644 index e060f2a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2012-2020 Fabien Potencier - Dariusz Rumiński - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/friendsofphp/php-cs-fixer/README.rst b/vendor/friendsofphp/php-cs-fixer/README.rst deleted file mode 100644 index 1807465..0000000 --- a/vendor/friendsofphp/php-cs-fixer/README.rst +++ /dev/null @@ -1,2203 +0,0 @@ -PHP Coding Standards Fixer -========================== - -The PHP Coding Standards Fixer (PHP CS Fixer) tool fixes your code to follow standards; -whether you want to follow PHP coding standards as defined in the PSR-1, PSR-2, etc., -or other community driven ones like the Symfony one. -You can **also** define your (team's) style through configuration. - -It can modernize your code (like converting the ``pow`` function to the ``**`` operator on PHP 5.6) -and (micro) optimize it. - -If you are already using a linter to identify coding standards problems in your -code, you know that fixing them by hand is tedious, especially on large -projects. This tool does not only detect them, but also fixes them for you. - -The PHP CS Fixer is maintained on GitHub at https://github.com/FriendsOfPHP/PHP-CS-Fixer. -Bug reports and ideas about new features are welcome there. - -You can talk to us at https://gitter.im/PHP-CS-Fixer/Lobby about the project, -configuration, possible improvements, ideas and questions, please visit us! - -Requirements ------------- - -PHP needs to be a minimum version of PHP 5.6.0. - -Installation ------------- - -Locally -~~~~~~~ - -Download the `php-cs-fixer.phar`_ file and store it somewhere on your computer. - -Globally (manual) -~~~~~~~~~~~~~~~~~ - -You can run these commands to easily access latest ``php-cs-fixer`` from anywhere on -your system: - -.. code-block:: bash - - $ wget https://cs.symfony.com/download/php-cs-fixer-v2.phar -O php-cs-fixer - -or with specified version: - -.. code-block:: bash - - $ wget https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v2.16.4/php-cs-fixer.phar -O php-cs-fixer - -or with curl: - -.. code-block:: bash - - $ curl -L https://cs.symfony.com/download/php-cs-fixer-v2.phar -o php-cs-fixer - -then: - -.. code-block:: bash - - $ sudo chmod a+x php-cs-fixer - $ sudo mv php-cs-fixer /usr/local/bin/php-cs-fixer - -Then, just run ``php-cs-fixer``. - -Globally (Composer) -~~~~~~~~~~~~~~~~~~~ - -To install PHP CS Fixer, `install Composer `_ and issue the following command: - -.. code-block:: bash - - $ composer global require friendsofphp/php-cs-fixer - -Then make sure you have the global Composer binaries directory in your ``PATH``. This directory is platform-dependent, see `Composer documentation `_ for details. Example for some Unix systems: - -.. code-block:: bash - - $ export PATH="$PATH:$HOME/.composer/vendor/bin" - -Globally (homebrew) -~~~~~~~~~~~~~~~~~~~ - -.. code-block:: bash - - $ brew install php-cs-fixer - -Locally (PHIVE) -~~~~~~~~~~~~~~~ - -Install `PHIVE `_ and issue the following command: - -.. code-block:: bash - - $ phive install php-cs-fixer # use `--global` for global install - -Update ------- - -Locally -~~~~~~~ - -The ``self-update`` command tries to update ``php-cs-fixer`` itself: - -.. code-block:: bash - - $ php php-cs-fixer.phar self-update - -Globally (manual) -~~~~~~~~~~~~~~~~~ - -You can update ``php-cs-fixer`` through this command: - -.. code-block:: bash - - $ sudo php-cs-fixer self-update - -Globally (Composer) -~~~~~~~~~~~~~~~~~~~ - -You can update ``php-cs-fixer`` through this command: - -.. code-block:: bash - - $ ./composer.phar global update friendsofphp/php-cs-fixer - -Globally (homebrew) -~~~~~~~~~~~~~~~~~~~ - -You can update ``php-cs-fixer`` through this command: - -.. code-block:: bash - - $ brew upgrade php-cs-fixer - -Locally (PHIVE) -~~~~~~~~~~~~~~~ - -.. code-block:: bash - - $ phive update php-cs-fixer - -Usage ------ - -The ``fix`` command tries to fix as much coding standards -problems as possible on a given file or files in a given directory and its subdirectories: - -.. code-block:: bash - - $ php php-cs-fixer.phar fix /path/to/dir - $ php php-cs-fixer.phar fix /path/to/file - -By default ``--path-mode`` is set to ``override``, which means, that if you specify the path to a file or a directory via -command arguments, then the paths provided to a ``Finder`` in config file will be ignored. You can use ``--path-mode=intersection`` -to merge paths from the config file and from the argument: - -.. code-block:: bash - - $ php php-cs-fixer.phar fix --path-mode=intersection /path/to/dir - -The ``--format`` option for the output format. Supported formats are ``txt`` (default one), ``json``, ``xml``, ``checkstyle``, ``junit`` and ``gitlab``. - -NOTE: the output for the following formats are generated in accordance with XML schemas - -* ``junit`` follows the `JUnit xml schema from Jenkins `_ -* ``checkstyle`` follows the common `"checkstyle" xml schema `_ - -The ``--quiet`` Do not output any message. - -The ``--verbose`` option will show the applied rules. When using the ``txt`` format it will also display progress notifications. - -NOTE: if there is an error like "errors reported during linting after fixing", you can use this to be even more verbose for debugging purpose - -* ``--verbose=0`` or no option: normal -* ``--verbose``, ``--verbose=1``, ``-v``: verbose -* ``--verbose=2``, ``-vv``: very verbose -* ``--verbose=3``, ``-vvv``: debug - -The ``--rules`` option limits the rules to apply to the -project: - -.. code-block:: bash - - $ php php-cs-fixer.phar fix /path/to/project --rules=@PSR2 - -By default the PSR1 and PSR2 rules are used. - -The ``--rules`` option lets you choose the exact rules to -apply (the rule names must be separated by a comma): - -.. code-block:: bash - - $ php php-cs-fixer.phar fix /path/to/dir --rules=line_ending,full_opening_tag,indentation_type - -You can also exclude the rules you don't want by placing a dash in front of the rule name, if this is more convenient, -using ``-name_of_fixer``: - -.. code-block:: bash - - $ php php-cs-fixer.phar fix /path/to/dir --rules=-full_opening_tag,-indentation_type - -When using combinations of exact and exclude rules, applying exact rules along with above excluded results: - -.. code-block:: bash - - $ php php-cs-fixer.phar fix /path/to/project --rules=@Symfony,-@PSR1,-blank_line_before_statement,strict_comparison - -Complete configuration for rules can be supplied using a ``json`` formatted string. - -.. code-block:: bash - - $ php php-cs-fixer.phar fix /path/to/project --rules='{"concat_space": {"spacing": "none"}}' - -The ``--dry-run`` flag will run the fixer without making changes to your files. - -The ``--diff`` flag can be used to let the fixer output all the changes it makes. - -The ``--diff-format`` option allows to specify in which format the fixer should output the changes it makes: - -* ``udiff``: unified diff format; -* ``sbd``: Sebastianbergmann/diff format (default when using `--diff` without specifying `diff-format`). - -The ``--allow-risky`` option (pass ``yes`` or ``no``) allows you to set whether risky rules may run. Default value is taken from config file. -A rule is considered risky if it could change code behaviour. By default no risky rules are run. - -The ``--stop-on-violation`` flag stops the execution upon first file that needs to be fixed. - -The ``--show-progress`` option allows you to choose the way process progress is rendered: - -* ``none``: disables progress output; -* ``run-in``: [deprecated] simple single-line progress output; -* ``estimating``: [deprecated] multiline progress output with number of files and percentage on each line. Note that with this option, the files list is evaluated before processing to get the total number of files and then kept in memory to avoid using the file iterator twice. This has an impact on memory usage so using this option is not recommended on very large projects; -* ``estimating-max``: [deprecated] same as ``dots``; -* ``dots``: same as ``estimating`` but using all terminal columns instead of default 80. - -If the option is not provided, it defaults to ``run-in`` unless a config file that disables output is used, in which case it defaults to ``none``. This option has no effect if the verbosity of the command is less than ``verbose``. - -.. code-block:: bash - - $ php php-cs-fixer.phar fix --verbose --show-progress=estimating - -The command can also read from standard input, in which case it won't -automatically fix anything: - -.. code-block:: bash - - $ cat foo.php | php php-cs-fixer.phar fix --diff - - -Finally, if you don't need BC kept on CLI level, you might use `PHP_CS_FIXER_FUTURE_MODE` to start using options that -would be default in next MAJOR release (unified differ, estimating, full-width progress indicator): - -.. code-block:: bash - - $ PHP_CS_FIXER_FUTURE_MODE=1 php php-cs-fixer.phar fix -v --diff - -Rules ------ - -Use the following command to quickly understand what a rule will do to your code: - -.. code-block:: bash - - $ php php-cs-fixer.phar describe align_multiline_comment - -To visualize all the rules that belong to a ruleset: - -.. code-block:: bash - - $ php php-cs-fixer.phar describe @PSR2 - -Choose from the list of available rules: - -* **align_multiline_comment** [@PhpCsFixer] - - Each line of multi-line DocComments must have an asterisk [PSR-5] and - must be aligned with the first one. - - Configuration options: - - - ``comment_type`` (``'all_multiline'``, ``'phpdocs_like'``, ``'phpdocs_only'``): whether - to fix PHPDoc comments only (``phpdocs_only``), any multi-line comment - whose lines all start with an asterisk (``phpdocs_like``) or any - multi-line comment (``all_multiline``); defaults to ``'phpdocs_only'`` - -* **array_indentation** [@PhpCsFixer] - - Each element of an array must be indented exactly once. - -* **array_syntax** [@Symfony, @PhpCsFixer] - - PHP arrays should be declared using the configured syntax. - - Configuration options: - - - ``syntax`` (``'long'``, ``'short'``): whether to use the ``long`` or ``short`` array - syntax; defaults to ``'long'`` - -* **backtick_to_shell_exec** - - Converts backtick operators to ``shell_exec`` calls. - -* **binary_operator_spaces** [@Symfony, @PhpCsFixer] - - Binary operators should be surrounded by space as configured. - - Configuration options: - - - ``align_double_arrow`` (``false``, ``null``, ``true``): whether to apply, remove or - ignore double arrows alignment; defaults to ``false``. DEPRECATED: use - options ``operators`` and ``default`` instead - - ``align_equals`` (``false``, ``null``, ``true``): whether to apply, remove or ignore - equals alignment; defaults to ``false``. DEPRECATED: use options - ``operators`` and ``default`` instead - - ``default`` (``'align'``, ``'align_single_space'``, ``'align_single_space_minimal'``, - ``'no_space'``, ``'single_space'``, ``null``): default fix strategy; defaults to - ``'single_space'`` - - ``operators`` (``array``): dictionary of ``binary operator`` => ``fix strategy`` - values that differ from the default strategy; defaults to ``[]`` - -* **blank_line_after_namespace** [@PSR2, @Symfony, @PhpCsFixer] - - There MUST be one blank line after the namespace declaration. - -* **blank_line_after_opening_tag** [@Symfony, @PhpCsFixer] - - Ensure there is no code on the same line as the PHP open tag and it is - followed by a blank line. - -* **blank_line_before_return** - - An empty line feed should precede a return statement. DEPRECATED: use - ``blank_line_before_statement`` instead. - -* **blank_line_before_statement** [@Symfony, @PhpCsFixer] - - An empty line feed must precede any configured statement. - - Configuration options: - - - ``statements`` (a subset of ``['break', 'case', 'continue', 'declare', - 'default', 'die', 'do', 'exit', 'for', 'foreach', 'goto', 'if', - 'include', 'include_once', 'require', 'require_once', 'return', - 'switch', 'throw', 'try', 'while', 'yield']``): list of statements which - must be preceded by an empty line; defaults to ``['break', 'continue', - 'declare', 'return', 'throw', 'try']`` - -* **braces** [@PSR2, @Symfony, @PhpCsFixer] - - The body of each structure MUST be enclosed by braces. Braces should be - properly placed. Body of braces should be properly indented. - - Configuration options: - - - ``allow_single_line_closure`` (``bool``): whether single line lambda notation - should be allowed; defaults to ``false`` - - ``position_after_anonymous_constructs`` (``'next'``, ``'same'``): whether the - opening brace should be placed on "next" or "same" line after anonymous - constructs (anonymous classes and lambda functions); defaults to ``'same'`` - - ``position_after_control_structures`` (``'next'``, ``'same'``): whether the opening - brace should be placed on "next" or "same" line after control - structures; defaults to ``'same'`` - - ``position_after_functions_and_oop_constructs`` (``'next'``, ``'same'``): whether - the opening brace should be placed on "next" or "same" line after - classy constructs (non-anonymous classes, interfaces, traits, methods - and non-lambda functions); defaults to ``'next'`` - -* **cast_spaces** [@Symfony, @PhpCsFixer] - - A single space or none should be between cast and variable. - - Configuration options: - - - ``space`` (``'none'``, ``'single'``): spacing to apply between cast and variable; - defaults to ``'single'`` - -* **class_attributes_separation** [@Symfony, @PhpCsFixer] - - Class, trait and interface elements must be separated with one blank - line. - - Configuration options: - - - ``elements`` (a subset of ``['const', 'method', 'property']``): list of classy - elements; 'const', 'method', 'property'; defaults to ``['const', - 'method', 'property']`` - -* **class_definition** [@PSR2, @Symfony, @PhpCsFixer] - - Whitespace around the keywords of a class, trait or interfaces - definition should be one space. - - Configuration options: - - - ``multi_line_extends_each_single_line`` (``bool``): whether definitions should - be multiline; defaults to ``false``; DEPRECATED alias: - ``multiLineExtendsEachSingleLine`` - - ``single_item_single_line`` (``bool``): whether definitions should be single - line when including a single item; defaults to ``false``; DEPRECATED alias: - ``singleItemSingleLine`` - - ``single_line`` (``bool``): whether definitions should be single line; defaults - to ``false``; DEPRECATED alias: ``singleLine`` - -* **class_keyword_remove** - - Converts ``::class`` keywords to FQCN strings. - -* **combine_consecutive_issets** [@PhpCsFixer] - - Using ``isset($var) &&`` multiple times should be done in one call. - -* **combine_consecutive_unsets** [@PhpCsFixer] - - Calling ``unset`` on multiple items should be done in one call. - -* **combine_nested_dirname** [@PHP70Migration:risky, @PHP71Migration:risky] - - Replace multiple nested calls of ``dirname`` by only one call with second - ``$level`` parameter. Requires PHP >= 7.0. - - *Risky rule: risky when the function ``dirname`` is overridden.* - -* **comment_to_phpdoc** [@PhpCsFixer:risky] - - Comments with annotation should be docblock when used on structural - elements. - - *Risky rule: risky as new docblocks might mean more, e.g. a Doctrine entity might have a new column in database.* - - Configuration options: - - - ``ignored_tags`` (``array``): list of ignored tags; defaults to ``[]`` - -* **compact_nullable_typehint** [@PhpCsFixer] - - Remove extra spaces in a nullable typehint. - -* **concat_space** [@Symfony, @PhpCsFixer] - - Concatenation should be spaced according configuration. - - Configuration options: - - - ``spacing`` (``'none'``, ``'one'``): spacing to apply around concatenation operator; - defaults to ``'none'`` - -* **constant_case** [@PSR2, @Symfony, @PhpCsFixer] - - The PHP constants ``true``, ``false``, and ``null`` MUST be written using the - correct casing. - - Configuration options: - - - ``case`` (``'lower'``, ``'upper'``): whether to use the ``upper`` or ``lower`` case - syntax; defaults to ``'lower'`` - -* **date_time_immutable** - - Class ``DateTimeImmutable`` should be used instead of ``DateTime``. - - *Risky rule: risky when the code relies on modifying ``DateTime`` objects or if any of the ``date_create*`` functions are overridden.* - -* **declare_equal_normalize** [@Symfony, @PhpCsFixer] - - Equal sign in declare statement should be surrounded by spaces or not - following configuration. - - Configuration options: - - - ``space`` (``'none'``, ``'single'``): spacing to apply around the equal sign; - defaults to ``'none'`` - -* **declare_strict_types** [@PHP70Migration:risky, @PHP71Migration:risky] - - Force strict types declaration in all files. Requires PHP >= 7.0. - - *Risky rule: forcing strict types will stop non strict code from working.* - -* **dir_constant** [@Symfony:risky, @PhpCsFixer:risky] - - Replaces ``dirname(__FILE__)`` expression with equivalent ``__DIR__`` - constant. - - *Risky rule: risky when the function ``dirname`` is overridden.* - -* **doctrine_annotation_array_assignment** [@DoctrineAnnotation] - - Doctrine annotations must use configured operator for assignment in - arrays. - - Configuration options: - - - ``ignored_tags`` (``array``): list of tags that must not be treated as Doctrine - Annotations; defaults to ``['abstract', 'access', 'code', 'deprec', - 'encode', 'exception', 'final', 'ingroup', 'inheritdoc', 'inheritDoc', - 'magic', 'name', 'toc', 'tutorial', 'private', 'static', 'staticvar', - 'staticVar', 'throw', 'api', 'author', 'category', 'copyright', - 'deprecated', 'example', 'filesource', 'global', 'ignore', 'internal', - 'license', 'link', 'method', 'package', 'param', 'property', - 'property-read', 'property-write', 'return', 'see', 'since', 'source', - 'subpackage', 'throws', 'todo', 'TODO', 'usedBy', 'uses', 'var', - 'version', 'after', 'afterClass', 'backupGlobals', - 'backupStaticAttributes', 'before', 'beforeClass', - 'codeCoverageIgnore', 'codeCoverageIgnoreStart', - 'codeCoverageIgnoreEnd', 'covers', 'coversDefaultClass', - 'coversNothing', 'dataProvider', 'depends', 'expectedException', - 'expectedExceptionCode', 'expectedExceptionMessage', - 'expectedExceptionMessageRegExp', 'group', 'large', 'medium', - 'preserveGlobalState', 'requires', 'runTestsInSeparateProcesses', - 'runInSeparateProcess', 'small', 'test', 'testdox', 'ticket', 'uses', - 'SuppressWarnings', 'noinspection', 'package_version', 'enduml', - 'startuml', 'fix', 'FIXME', 'fixme', 'override']`` - - ``operator`` (``':'``, ``'='``): the operator to use; defaults to ``'='`` - -* **doctrine_annotation_braces** [@DoctrineAnnotation] - - Doctrine annotations without arguments must use the configured syntax. - - Configuration options: - - - ``ignored_tags`` (``array``): list of tags that must not be treated as Doctrine - Annotations; defaults to ``['abstract', 'access', 'code', 'deprec', - 'encode', 'exception', 'final', 'ingroup', 'inheritdoc', 'inheritDoc', - 'magic', 'name', 'toc', 'tutorial', 'private', 'static', 'staticvar', - 'staticVar', 'throw', 'api', 'author', 'category', 'copyright', - 'deprecated', 'example', 'filesource', 'global', 'ignore', 'internal', - 'license', 'link', 'method', 'package', 'param', 'property', - 'property-read', 'property-write', 'return', 'see', 'since', 'source', - 'subpackage', 'throws', 'todo', 'TODO', 'usedBy', 'uses', 'var', - 'version', 'after', 'afterClass', 'backupGlobals', - 'backupStaticAttributes', 'before', 'beforeClass', - 'codeCoverageIgnore', 'codeCoverageIgnoreStart', - 'codeCoverageIgnoreEnd', 'covers', 'coversDefaultClass', - 'coversNothing', 'dataProvider', 'depends', 'expectedException', - 'expectedExceptionCode', 'expectedExceptionMessage', - 'expectedExceptionMessageRegExp', 'group', 'large', 'medium', - 'preserveGlobalState', 'requires', 'runTestsInSeparateProcesses', - 'runInSeparateProcess', 'small', 'test', 'testdox', 'ticket', 'uses', - 'SuppressWarnings', 'noinspection', 'package_version', 'enduml', - 'startuml', 'fix', 'FIXME', 'fixme', 'override']`` - - ``syntax`` (``'with_braces'``, ``'without_braces'``): whether to add or remove - braces; defaults to ``'without_braces'`` - -* **doctrine_annotation_indentation** [@DoctrineAnnotation] - - Doctrine annotations must be indented with four spaces. - - Configuration options: - - - ``ignored_tags`` (``array``): list of tags that must not be treated as Doctrine - Annotations; defaults to ``['abstract', 'access', 'code', 'deprec', - 'encode', 'exception', 'final', 'ingroup', 'inheritdoc', 'inheritDoc', - 'magic', 'name', 'toc', 'tutorial', 'private', 'static', 'staticvar', - 'staticVar', 'throw', 'api', 'author', 'category', 'copyright', - 'deprecated', 'example', 'filesource', 'global', 'ignore', 'internal', - 'license', 'link', 'method', 'package', 'param', 'property', - 'property-read', 'property-write', 'return', 'see', 'since', 'source', - 'subpackage', 'throws', 'todo', 'TODO', 'usedBy', 'uses', 'var', - 'version', 'after', 'afterClass', 'backupGlobals', - 'backupStaticAttributes', 'before', 'beforeClass', - 'codeCoverageIgnore', 'codeCoverageIgnoreStart', - 'codeCoverageIgnoreEnd', 'covers', 'coversDefaultClass', - 'coversNothing', 'dataProvider', 'depends', 'expectedException', - 'expectedExceptionCode', 'expectedExceptionMessage', - 'expectedExceptionMessageRegExp', 'group', 'large', 'medium', - 'preserveGlobalState', 'requires', 'runTestsInSeparateProcesses', - 'runInSeparateProcess', 'small', 'test', 'testdox', 'ticket', 'uses', - 'SuppressWarnings', 'noinspection', 'package_version', 'enduml', - 'startuml', 'fix', 'FIXME', 'fixme', 'override']`` - - ``indent_mixed_lines`` (``bool``): whether to indent lines that have content - before closing parenthesis; defaults to ``false`` - -* **doctrine_annotation_spaces** [@DoctrineAnnotation] - - Fixes spaces in Doctrine annotations. - - Configuration options: - - - ``after_argument_assignments`` (``null``, ``bool``): whether to add, remove or - ignore spaces after argument assignment operator; defaults to ``false`` - - ``after_array_assignments_colon`` (``null``, ``bool``): whether to add, remove or - ignore spaces after array assignment ``:`` operator; defaults to ``true`` - - ``after_array_assignments_equals`` (``null``, ``bool``): whether to add, remove or - ignore spaces after array assignment ``=`` operator; defaults to ``true`` - - ``around_argument_assignments`` (``bool``): whether to fix spaces around - argument assignment operator; defaults to ``true``. DEPRECATED: use options - ``before_argument_assignments`` and ``after_argument_assignments`` instead - - ``around_array_assignments`` (``bool``): whether to fix spaces around array - assignment operators; defaults to ``true``. DEPRECATED: use options - ``before_array_assignments_equals``, ``after_array_assignments_equals``, - ``before_array_assignments_colon`` and ``after_array_assignments_colon`` - instead - - ``around_commas`` (``bool``): whether to fix spaces around commas; defaults to - ``true`` - - ``around_parentheses`` (``bool``): whether to fix spaces around parentheses; - defaults to ``true`` - - ``before_argument_assignments`` (``null``, ``bool``): whether to add, remove or - ignore spaces before argument assignment operator; defaults to ``false`` - - ``before_array_assignments_colon`` (``null``, ``bool``): whether to add, remove or - ignore spaces before array ``:`` assignment operator; defaults to ``true`` - - ``before_array_assignments_equals`` (``null``, ``bool``): whether to add, remove or - ignore spaces before array ``=`` assignment operator; defaults to ``true`` - - ``ignored_tags`` (``array``): list of tags that must not be treated as Doctrine - Annotations; defaults to ``['abstract', 'access', 'code', 'deprec', - 'encode', 'exception', 'final', 'ingroup', 'inheritdoc', 'inheritDoc', - 'magic', 'name', 'toc', 'tutorial', 'private', 'static', 'staticvar', - 'staticVar', 'throw', 'api', 'author', 'category', 'copyright', - 'deprecated', 'example', 'filesource', 'global', 'ignore', 'internal', - 'license', 'link', 'method', 'package', 'param', 'property', - 'property-read', 'property-write', 'return', 'see', 'since', 'source', - 'subpackage', 'throws', 'todo', 'TODO', 'usedBy', 'uses', 'var', - 'version', 'after', 'afterClass', 'backupGlobals', - 'backupStaticAttributes', 'before', 'beforeClass', - 'codeCoverageIgnore', 'codeCoverageIgnoreStart', - 'codeCoverageIgnoreEnd', 'covers', 'coversDefaultClass', - 'coversNothing', 'dataProvider', 'depends', 'expectedException', - 'expectedExceptionCode', 'expectedExceptionMessage', - 'expectedExceptionMessageRegExp', 'group', 'large', 'medium', - 'preserveGlobalState', 'requires', 'runTestsInSeparateProcesses', - 'runInSeparateProcess', 'small', 'test', 'testdox', 'ticket', 'uses', - 'SuppressWarnings', 'noinspection', 'package_version', 'enduml', - 'startuml', 'fix', 'FIXME', 'fixme', 'override']`` - -* **elseif** [@PSR2, @Symfony, @PhpCsFixer] - - The keyword ``elseif`` should be used instead of ``else if`` so that all - control keywords look like single words. - -* **encoding** [@PSR1, @PSR2, @Symfony, @PhpCsFixer] - - PHP code MUST use only UTF-8 without BOM (remove BOM). - -* **ereg_to_preg** [@Symfony:risky, @PhpCsFixer:risky] - - Replace deprecated ``ereg`` regular expression functions with ``preg``. - - *Risky rule: risky if the ``ereg`` function is overridden.* - -* **error_suppression** [@Symfony:risky, @PhpCsFixer:risky] - - Error control operator should be added to deprecation notices and/or - removed from other cases. - - *Risky rule: risky because adding/removing ``@`` might cause changes to code behaviour or if ``trigger_error`` function is overridden.* - - Configuration options: - - - ``mute_deprecation_error`` (``bool``): whether to add ``@`` in deprecation - notices; defaults to ``true`` - - ``noise_remaining_usages`` (``bool``): whether to remove ``@`` in remaining - usages; defaults to ``false`` - - ``noise_remaining_usages_exclude`` (``array``): list of global functions to - exclude from removing ``@``; defaults to ``[]`` - -* **escape_implicit_backslashes** [@PhpCsFixer] - - Escape implicit backslashes in strings and heredocs to ease the - understanding of which are special chars interpreted by PHP and which - not. - - Configuration options: - - - ``double_quoted`` (``bool``): whether to fix double-quoted strings; defaults to - ``true`` - - ``heredoc_syntax`` (``bool``): whether to fix heredoc syntax; defaults to ``true`` - - ``single_quoted`` (``bool``): whether to fix single-quoted strings; defaults to - ``false`` - -* **explicit_indirect_variable** [@PhpCsFixer] - - Add curly braces to indirect variables to make them clear to understand. - Requires PHP >= 7.0. - -* **explicit_string_variable** [@PhpCsFixer] - - Converts implicit variables into explicit ones in double-quoted strings - or heredoc syntax. - -* **final_class** - - All classes must be final, except abstract ones and Doctrine entities. - - *Risky rule: risky when subclassing non-abstract classes.* - -* **final_internal_class** [@PhpCsFixer:risky] - - Internal classes should be ``final``. - - *Risky rule: changing classes to ``final`` might cause code execution to break.* - - Configuration options: - - - ``annotation-black-list`` (``array``): class level annotations tags that must be - omitted to fix the class, even if all of the excluded ones are used as - well. (case insensitive); defaults to ``['@final', '@Entity', - '@ORM\\Entity', '@ORM\\Mapping\\Entity', '@Mapping\\Entity']`` - - ``annotation-white-list`` (``array``): class level annotations tags that must be - set in order to fix the class. (case insensitive); defaults to - ``['@internal']`` - - ``consider-absent-docblock-as-internal-class`` (``bool``): should classes - without any DocBlock be fixed to final?; defaults to ``false`` - -* **final_public_method_for_abstract_class** - - All ``public`` methods of ``abstract`` classes should be ``final``. - - *Risky rule: risky when overriding ``public`` methods of ``abstract`` classes.* - -* **final_static_access** - - Converts ``static`` access to ``self`` access in ``final`` classes. - -* **fopen_flag_order** [@Symfony:risky, @PhpCsFixer:risky] - - Order the flags in ``fopen`` calls, ``b`` and ``t`` must be last. - - *Risky rule: risky when the function ``fopen`` is overridden.* - -* **fopen_flags** [@Symfony:risky, @PhpCsFixer:risky] - - The flags in ``fopen`` calls must omit ``t``, and ``b`` must be omitted or - included consistently. - - *Risky rule: risky when the function ``fopen`` is overridden.* - - Configuration options: - - - ``b_mode`` (``bool``): the ``b`` flag must be used (``true``) or omitted (``false``); - defaults to ``true`` - -* **full_opening_tag** [@PSR1, @PSR2, @Symfony, @PhpCsFixer] - - PHP code must use the long ``= 7.3. - -* **heredoc_to_nowdoc** [@PhpCsFixer] - - Convert ``heredoc`` to ``nowdoc`` where possible. - -* **implode_call** [@Symfony:risky, @PhpCsFixer:risky] - - Function ``implode`` must be called with 2 arguments in the documented - order. - - *Risky rule: risky when the function ``implode`` is overridden.* - -* **include** [@Symfony, @PhpCsFixer] - - Include/Require and file path should be divided with a single space. - File path should not be placed under brackets. - -* **increment_style** [@Symfony, @PhpCsFixer] - - Pre- or post-increment and decrement operators should be used if - possible. - - Configuration options: - - - ``style`` (``'post'``, ``'pre'``): whether to use pre- or post-increment and - decrement operators; defaults to ``'pre'`` - -* **indentation_type** [@PSR2, @Symfony, @PhpCsFixer] - - Code MUST use configured indentation type. - -* **is_null** [@Symfony:risky, @PhpCsFixer:risky] - - Replaces ``is_null($var)`` expression with ``null === $var``. - - *Risky rule: risky when the function ``is_null`` is overridden.* - - Configuration options: - - - ``use_yoda_style`` (``bool``): whether Yoda style conditions should be used; - defaults to ``true``. DEPRECATED: use ``yoda_style`` fixer instead - -* **line_ending** [@PSR2, @Symfony, @PhpCsFixer] - - All PHP files must use same line ending. - -* **linebreak_after_opening_tag** - - Ensure there is no code on the same line as the PHP open tag. - -* **list_syntax** - - List (``array`` destructuring) assignment should be declared using the - configured syntax. Requires PHP >= 7.1. - - Configuration options: - - - ``syntax`` (``'long'``, ``'short'``): whether to use the ``long`` or ``short`` ``list`` - syntax; defaults to ``'long'`` - -* **logical_operators** [@PhpCsFixer:risky] - - Use ``&&`` and ``||`` logical operators instead of ``and`` and ``or``. - - *Risky rule: risky, because you must double-check if using and/or with lower precedence was intentional.* - -* **lowercase_cast** [@Symfony, @PhpCsFixer] - - Cast should be written in lower case. - -* **lowercase_constants** - - The PHP constants ``true``, ``false``, and ``null`` MUST be in lower case. - DEPRECATED: use ``constant_case`` instead. - -* **lowercase_keywords** [@PSR2, @Symfony, @PhpCsFixer] - - PHP keywords MUST be in lower case. - -* **lowercase_static_reference** [@Symfony, @PhpCsFixer] - - Class static references ``self``, ``static`` and ``parent`` MUST be in lower - case. - -* **magic_constant_casing** [@Symfony, @PhpCsFixer] - - Magic constants should be referred to using the correct casing. - -* **magic_method_casing** [@Symfony, @PhpCsFixer] - - Magic method definitions and calls must be using the correct casing. - -* **mb_str_functions** - - Replace non multibyte-safe functions with corresponding mb function. - - *Risky rule: risky when any of the functions are overridden.* - -* **method_argument_space** [@PSR2, @Symfony, @PhpCsFixer] - - In method arguments and method call, there MUST NOT be a space before - each comma and there MUST be one space after each comma. Argument lists - MAY be split across multiple lines, where each subsequent line is - indented once. When doing so, the first item in the list MUST be on the - next line, and there MUST be only one argument per line. - - Configuration options: - - - ``after_heredoc`` (``bool``): whether the whitespace between heredoc end and - comma should be removed; defaults to ``false`` - - ``ensure_fully_multiline`` (``bool``): ensure every argument of a multiline - argument list is on its own line; defaults to ``false``. DEPRECATED: use - option ``on_multiline`` instead - - ``keep_multiple_spaces_after_comma`` (``bool``): whether keep multiple spaces - after comma; defaults to ``false`` - - ``on_multiline`` (``'ensure_fully_multiline'``, ``'ensure_single_line'``, ``'ignore'``): - defines how to handle function arguments lists that contain newlines; - defaults to ``'ignore'`` - -* **method_chaining_indentation** [@PhpCsFixer] - - Method chaining MUST be properly indented. Method chaining with - different levels of indentation is not supported. - -* **method_separation** - - Methods must be separated with one blank line. DEPRECATED: use - ``class_attributes_separation`` instead. - -* **modernize_types_casting** [@Symfony:risky, @PhpCsFixer:risky] - - Replaces ``intval``, ``floatval``, ``doubleval``, ``strval`` and ``boolval`` - function calls with according type casting operator. - - *Risky rule: risky if any of the functions ``intval``, ``floatval``, ``doubleval``, ``strval`` or ``boolval`` are overridden.* - -* **multiline_comment_opening_closing** [@PhpCsFixer] - - DocBlocks must start with two asterisks, multiline comments must start - with a single asterisk, after the opening slash. Both must end with a - single asterisk before the closing slash. - -* **multiline_whitespace_before_semicolons** [@PhpCsFixer] - - Forbid multi-line whitespace before the closing semicolon or move the - semicolon to the new line for chained calls. - - Configuration options: - - - ``strategy`` (``'new_line_for_chained_calls'``, ``'no_multi_line'``): forbid - multi-line whitespace or move the semicolon to the new line for chained - calls; defaults to ``'no_multi_line'`` - -* **native_constant_invocation** [@Symfony:risky, @PhpCsFixer:risky] - - Add leading ``\`` before constant invocation of internal constant to speed - up resolving. Constant name match is case-sensitive, except for ``null``, - ``false`` and ``true``. - - *Risky rule: risky when any of the constants are namespaced or overridden.* - - Configuration options: - - - ``exclude`` (``array``): list of constants to ignore; defaults to ``['null', - 'false', 'true']`` - - ``fix_built_in`` (``bool``): whether to fix constants returned by - ``get_defined_constants``. User constants are not accounted in this list - and must be specified in the include one; defaults to ``true`` - - ``include`` (``array``): list of additional constants to fix; defaults to ``[]`` - - ``scope`` (``'all'``, ``'namespaced'``): only fix constant invocations that are made - within a namespace or fix all; defaults to ``'all'`` - -* **native_function_casing** [@Symfony, @PhpCsFixer] - - Function defined by PHP should be called using the correct casing. - -* **native_function_invocation** [@Symfony:risky, @PhpCsFixer:risky] - - Add leading ``\`` before function invocation to speed up resolving. - - *Risky rule: risky when any of the functions are overridden.* - - Configuration options: - - - ``exclude`` (``array``): list of functions to ignore; defaults to ``[]`` - - ``include`` (``array``): list of function names or sets to fix. Defined sets are - ``@internal`` (all native functions), ``@all`` (all global functions) and - ``@compiler_optimized`` (functions that are specially optimized by Zend); - defaults to ``['@internal']`` - - ``scope`` (``'all'``, ``'namespaced'``): only fix function calls that are made - within a namespace or fix all; defaults to ``'all'`` - - ``strict`` (``bool``): whether leading ``\`` of function call not meant to have it - should be removed; defaults to ``false`` - -* **native_function_type_declaration_casing** [@Symfony, @PhpCsFixer] - - Native type hints for functions should use the correct case. - -* **new_with_braces** [@Symfony, @PhpCsFixer] - - All instances created with new keyword must be followed by braces. - -* **no_alias_functions** [@Symfony:risky, @PhpCsFixer:risky] - - Master functions shall be used instead of aliases. - - *Risky rule: risky when any of the alias functions are overridden.* - - Configuration options: - - - ``sets`` (a subset of ``['@internal', '@IMAP', '@mbreg', '@all']``): list of - sets to fix. Defined sets are ``@internal`` (native functions), ``@IMAP`` - (IMAP functions), ``@mbreg`` (from ``ext-mbstring``) ``@all`` (all listed - sets); defaults to ``['@internal', '@IMAP']`` - -* **no_alternative_syntax** [@PhpCsFixer] - - Replace control structure alternative syntax to use braces. - -* **no_binary_string** [@PhpCsFixer] - - There should not be a binary flag before strings. - -* **no_blank_lines_after_class_opening** [@Symfony, @PhpCsFixer] - - There should be no empty lines after class opening brace. - -* **no_blank_lines_after_phpdoc** [@Symfony, @PhpCsFixer] - - There should not be blank lines between docblock and the documented - element. - -* **no_blank_lines_before_namespace** - - There should be no blank lines before a namespace declaration. - -* **no_break_comment** [@PSR2, @Symfony, @PhpCsFixer] - - There must be a comment when fall-through is intentional in a non-empty - case body. - - Configuration options: - - - ``comment_text`` (``string``): the text to use in the added comment and to - detect it; defaults to ``'no break'`` - -* **no_closing_tag** [@PSR2, @Symfony, @PhpCsFixer] - - The closing ``?>`` tag MUST be omitted from files containing only PHP. - -* **no_empty_comment** [@Symfony, @PhpCsFixer] - - There should not be any empty comments. - -* **no_empty_phpdoc** [@Symfony, @PhpCsFixer] - - There should not be empty PHPDoc blocks. - -* **no_empty_statement** [@Symfony, @PhpCsFixer] - - Remove useless semicolon statements. - -* **no_extra_blank_lines** [@Symfony, @PhpCsFixer] - - Removes extra blank lines and/or blank lines following configuration. - - Configuration options: - - - ``tokens`` (a subset of ``['break', 'case', 'continue', 'curly_brace_block', - 'default', 'extra', 'parenthesis_brace_block', 'return', - 'square_brace_block', 'switch', 'throw', 'use', 'useTrait', - 'use_trait']``): list of tokens to fix; defaults to ``['extra']`` - -* **no_extra_consecutive_blank_lines** - - Removes extra blank lines and/or blank lines following configuration. - DEPRECATED: use ``no_extra_blank_lines`` instead. - - Configuration options: - - - ``tokens`` (a subset of ``['break', 'case', 'continue', 'curly_brace_block', - 'default', 'extra', 'parenthesis_brace_block', 'return', - 'square_brace_block', 'switch', 'throw', 'use', 'useTrait', - 'use_trait']``): list of tokens to fix; defaults to ``['extra']`` - -* **no_homoglyph_names** [@Symfony:risky, @PhpCsFixer:risky] - - Replace accidental usage of homoglyphs (non ascii characters) in names. - - *Risky rule: renames classes and cannot rename the files. You might have string references to renamed code (``$$name``).* - -* **no_leading_import_slash** [@Symfony, @PhpCsFixer] - - Remove leading slashes in ``use`` clauses. - -* **no_leading_namespace_whitespace** [@Symfony, @PhpCsFixer] - - The namespace declaration line shouldn't contain leading whitespace. - -* **no_mixed_echo_print** [@Symfony, @PhpCsFixer] - - Either language construct ``print`` or ``echo`` should be used. - - Configuration options: - - - ``use`` (``'echo'``, ``'print'``): the desired language construct; defaults to - ``'echo'`` - -* **no_multiline_whitespace_around_double_arrow** [@Symfony, @PhpCsFixer] - - Operator ``=>`` should not be surrounded by multi-line whitespaces. - -* **no_multiline_whitespace_before_semicolons** - - Multi-line whitespace before closing semicolon are prohibited. - DEPRECATED: use ``multiline_whitespace_before_semicolons`` instead. - -* **no_null_property_initialization** [@PhpCsFixer] - - Properties MUST not be explicitly initialized with ``null`` except when - they have a type declaration (PHP 7.4). - -* **no_php4_constructor** - - Convert PHP4-style constructors to ``__construct``. - - *Risky rule: risky when old style constructor being fixed is overridden or overrides parent one.* - -* **no_short_bool_cast** [@Symfony, @PhpCsFixer] - - Short cast ``bool`` using double exclamation mark should not be used. - -* **no_short_echo_tag** [@PhpCsFixer] - - Replace short-echo ````. - -* **ordered_class_elements** [@PhpCsFixer] - - Orders the elements of classes/interfaces/traits. - - Configuration options: - - - ``order`` (a subset of ``['use_trait', 'public', 'protected', 'private', - 'constant', 'constant_public', 'constant_protected', - 'constant_private', 'property', 'property_static', 'property_public', - 'property_protected', 'property_private', 'property_public_static', - 'property_protected_static', 'property_private_static', 'method', - 'method_static', 'method_public', 'method_protected', 'method_private', - 'method_public_static', 'method_protected_static', - 'method_private_static', 'construct', 'destruct', 'magic', 'phpunit']``): - list of strings defining order of elements; defaults to ``['use_trait', - 'constant_public', 'constant_protected', 'constant_private', - 'property_public', 'property_protected', 'property_private', - 'construct', 'destruct', 'magic', 'phpunit', 'method_public', - 'method_protected', 'method_private']`` - - ``sortAlgorithm`` (``'alpha'``, ``'none'``): how multiple occurrences of same type - statements should be sorted; defaults to ``'none'`` - -* **ordered_imports** [@Symfony, @PhpCsFixer] - - Ordering ``use`` statements. - - Configuration options: - - - ``imports_order`` (``array``, ``null``): defines the order of import types; defaults - to ``null``; DEPRECATED alias: ``importsOrder`` - - ``sort_algorithm`` (``'alpha'``, ``'length'``, ``'none'``): whether the statements - should be sorted alphabetically or by length, or not sorted; defaults - to ``'alpha'``; DEPRECATED alias: ``sortAlgorithm`` - -* **ordered_interfaces** - - Orders the interfaces in an ``implements`` or ``interface extends`` clause. - - *Risky rule: risky for ``implements`` when specifying both an interface and its parent interface, because PHP doesn't break on ``parent, child`` but does on ``child, parent``.* - - Configuration options: - - - ``direction`` (``'ascend'``, ``'descend'``): which direction the interfaces should - be ordered; defaults to ``'ascend'`` - - ``order`` (``'alpha'``, ``'length'``): how the interfaces should be ordered; - defaults to ``'alpha'`` - -* **php_unit_construct** [@Symfony:risky, @PhpCsFixer:risky] - - PHPUnit assertion method calls like ``->assertSame(true, $foo)`` should be - written with dedicated method like ``->assertTrue($foo)``. - - *Risky rule: fixer could be risky if one is overriding PHPUnit's native methods.* - - Configuration options: - - - ``assertions`` (a subset of ``['assertSame', 'assertEquals', - 'assertNotEquals', 'assertNotSame']``): list of assertion methods to fix; - defaults to ``['assertEquals', 'assertSame', 'assertNotEquals', - 'assertNotSame']`` - -* **php_unit_dedicate_assert** [@PHPUnit30Migration:risky, @PHPUnit32Migration:risky, @PHPUnit35Migration:risky, @PHPUnit43Migration:risky, @PHPUnit48Migration:risky, @PHPUnit50Migration:risky, @PHPUnit52Migration:risky, @PHPUnit54Migration:risky, @PHPUnit55Migration:risky, @PHPUnit56Migration:risky, @PHPUnit57Migration:risky, @PHPUnit60Migration:risky, @PHPUnit75Migration:risky] - - PHPUnit assertions like ``assertInternalType``, ``assertFileExists``, should - be used over ``assertTrue``. - - *Risky rule: fixer could be risky if one is overriding PHPUnit's native methods.* - - Configuration options: - - - ``functions`` (a subset of ``['array_key_exists', 'empty', 'file_exists', - 'is_array', 'is_bool', 'is_callable', 'is_double', 'is_float', - 'is_infinite', 'is_int', 'is_integer', 'is_long', 'is_nan', 'is_null', - 'is_numeric', 'is_object', 'is_real', 'is_resource', 'is_scalar', - 'is_string']``, ``null``): list of assertions to fix (overrides ``target``); - defaults to ``null``. DEPRECATED: use option ``target`` instead - - ``target`` (``'3.0'``, ``'3.5'``, ``'5.0'``, ``'5.6'``, ``'newest'``): target version of - PHPUnit; defaults to ``'5.0'`` - -* **php_unit_dedicate_assert_internal_type** [@PHPUnit75Migration:risky] - - PHPUnit assertions like ``assertIsArray`` should be used over - ``assertInternalType``. - - *Risky rule: risky when PHPUnit methods are overridden or when project has PHPUnit incompatibilities.* - - Configuration options: - - - ``target`` (``'7.5'``, ``'newest'``): target version of PHPUnit; defaults to - ``'newest'`` - -* **php_unit_expectation** [@PHPUnit52Migration:risky, @PHPUnit54Migration:risky, @PHPUnit55Migration:risky, @PHPUnit56Migration:risky, @PHPUnit57Migration:risky, @PHPUnit60Migration:risky, @PHPUnit75Migration:risky] - - Usages of ``->setExpectedException*`` methods MUST be replaced by - ``->expectException*`` methods. - - *Risky rule: risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.* - - Configuration options: - - - ``target`` (``'5.2'``, ``'5.6'``, ``'newest'``): target version of PHPUnit; defaults to - ``'newest'`` - -* **php_unit_fqcn_annotation** [@Symfony, @PhpCsFixer] - - PHPUnit annotations should be a FQCNs including a root namespace. - -* **php_unit_internal_class** [@PhpCsFixer] - - All PHPUnit test classes should be marked as internal. - - Configuration options: - - - ``types`` (a subset of ``['normal', 'final', 'abstract']``): what types of - classes to mark as internal; defaults to ``['normal', 'final']`` - -* **php_unit_method_casing** [@PhpCsFixer] - - Enforce camel (or snake) case for PHPUnit test methods, following - configuration. - - Configuration options: - - - ``case`` (``'camel_case'``, ``'snake_case'``): apply camel or snake case to test - methods; defaults to ``'camel_case'`` - -* **php_unit_mock** [@PHPUnit54Migration:risky, @PHPUnit55Migration:risky, @PHPUnit56Migration:risky, @PHPUnit57Migration:risky, @PHPUnit60Migration:risky, @PHPUnit75Migration:risky] - - Usages of ``->getMock`` and - ``->getMockWithoutInvokingTheOriginalConstructor`` methods MUST be - replaced by ``->createMock`` or ``->createPartialMock`` methods. - - *Risky rule: risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.* - - Configuration options: - - - ``target`` (``'5.4'``, ``'5.5'``, ``'newest'``): target version of PHPUnit; defaults to - ``'newest'`` - -* **php_unit_mock_short_will_return** [@Symfony:risky, @PhpCsFixer:risky] - - Usage of PHPUnit's mock e.g. ``->will($this->returnValue(..))`` must be - replaced by its shorter equivalent such as ``->willReturn(...)``. - - *Risky rule: risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.* - -* **php_unit_namespaced** [@PHPUnit48Migration:risky, @PHPUnit50Migration:risky, @PHPUnit52Migration:risky, @PHPUnit54Migration:risky, @PHPUnit55Migration:risky, @PHPUnit56Migration:risky, @PHPUnit57Migration:risky, @PHPUnit60Migration:risky, @PHPUnit75Migration:risky] - - PHPUnit classes MUST be used in namespaced version, e.g. - ``\PHPUnit\Framework\TestCase`` instead of ``\PHPUnit_Framework_TestCase``. - - *Risky rule: risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.* - - Configuration options: - - - ``target`` (``'4.8'``, ``'5.7'``, ``'6.0'``, ``'newest'``): target version of PHPUnit; - defaults to ``'newest'`` - -* **php_unit_no_expectation_annotation** [@PHPUnit32Migration:risky, @PHPUnit35Migration:risky, @PHPUnit43Migration:risky, @PHPUnit48Migration:risky, @PHPUnit50Migration:risky, @PHPUnit52Migration:risky, @PHPUnit54Migration:risky, @PHPUnit55Migration:risky, @PHPUnit56Migration:risky, @PHPUnit57Migration:risky, @PHPUnit60Migration:risky, @PHPUnit75Migration:risky] - - Usages of ``@expectedException*`` annotations MUST be replaced by - ``->setExpectedException*`` methods. - - *Risky rule: risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.* - - Configuration options: - - - ``target`` (``'3.2'``, ``'4.3'``, ``'newest'``): target version of PHPUnit; defaults to - ``'newest'`` - - ``use_class_const`` (``bool``): use ::class notation; defaults to ``true`` - -* **php_unit_ordered_covers** [@PhpCsFixer] - - Order ``@covers`` annotation of PHPUnit tests. - -* **php_unit_set_up_tear_down_visibility** [@PhpCsFixer:risky] - - Changes the visibility of the ``setUp()`` and ``tearDown()`` functions of - PHPUnit to ``protected``, to match the PHPUnit TestCase. - - *Risky rule: this fixer may change functions named ``setUp()`` or ``tearDown()`` outside of PHPUnit tests, when a class is wrongly seen as a PHPUnit test.* - -* **php_unit_size_class** - - All PHPUnit test cases should have ``@small``, ``@medium`` or ``@large`` - annotation to enable run time limits. - - Configuration options: - - - ``group`` (``'large'``, ``'medium'``, ``'small'``): define a specific group to be used - in case no group is already in use; defaults to ``'small'`` - -* **php_unit_strict** [@PhpCsFixer:risky] - - PHPUnit methods like ``assertSame`` should be used instead of - ``assertEquals``. - - *Risky rule: risky when any of the functions are overridden or when testing object equality.* - - Configuration options: - - - ``assertions`` (a subset of ``['assertAttributeEquals', - 'assertAttributeNotEquals', 'assertEquals', 'assertNotEquals']``): list - of assertion methods to fix; defaults to ``['assertAttributeEquals', - 'assertAttributeNotEquals', 'assertEquals', 'assertNotEquals']`` - -* **php_unit_test_annotation** [@PhpCsFixer:risky] - - Adds or removes @test annotations from tests, following configuration. - - *Risky rule: this fixer may change the name of your tests, and could cause incompatibility with abstract classes or interfaces.* - - Configuration options: - - - ``case`` (``'camel'``, ``'snake'``): whether to camel or snake case when adding the - test prefix; defaults to ``'camel'``. DEPRECATED: use - ``php_unit_method_casing`` fixer instead - - ``style`` (``'annotation'``, ``'prefix'``): whether to use the @test annotation or - not; defaults to ``'prefix'`` - -* **php_unit_test_case_static_method_calls** [@PhpCsFixer:risky] - - Calls to ``PHPUnit\Framework\TestCase`` static methods must all be of the - same type, either ``$this->``, ``self::`` or ``static::``. - - *Risky rule: risky when PHPUnit methods are overridden or not accessible, or when project has PHPUnit incompatibilities.* - - Configuration options: - - - ``call_type`` (``'self'``, ``'static'``, ``'this'``): the call type to use for referring - to PHPUnit methods; defaults to ``'static'`` - - ``methods`` (``array``): dictionary of ``method`` => ``call_type`` values that - differ from the default strategy; defaults to ``[]`` - -* **php_unit_test_class_requires_covers** [@PhpCsFixer] - - Adds a default ``@coversNothing`` annotation to PHPUnit test classes that - have no ``@covers*`` annotation. - -* **phpdoc_add_missing_param_annotation** [@PhpCsFixer] - - PHPDoc should contain ``@param`` for all params. - - Configuration options: - - - ``only_untyped`` (``bool``): whether to add missing ``@param`` annotations for - untyped parameters only; defaults to ``true`` - -* **phpdoc_align** [@Symfony, @PhpCsFixer] - - All items of the given phpdoc tags must be either left-aligned or (by - default) aligned vertically. - - Configuration options: - - - ``align`` (``'left'``, ``'vertical'``): align comments; defaults to ``'vertical'`` - - ``tags`` (a subset of ``['param', 'property', 'property-read', - 'property-write', 'return', 'throws', 'type', 'var', 'method']``): the - tags that should be aligned; defaults to ``['param', 'return', 'throws', - 'type', 'var']`` - -* **phpdoc_annotation_without_dot** [@Symfony, @PhpCsFixer] - - PHPDoc annotation descriptions should not be a sentence. - -* **phpdoc_indent** [@Symfony, @PhpCsFixer] - - Docblocks should have the same indentation as the documented subject. - -* **phpdoc_inline_tag** [@Symfony, @PhpCsFixer] - - Fix PHPDoc inline tags, make ``@inheritdoc`` always inline. - -* **phpdoc_line_span** - - Changes doc blocks from single to multi line, or reversed. Works for - class constants, properties and methods only. - - Configuration options: - - - ``const`` (``'multi'``, ``'single'``): whether const blocks should be single or - multi line; defaults to ``'multi'`` - - ``method`` (``'multi'``, ``'single'``): whether method doc blocks should be single - or multi line; defaults to ``'multi'`` - - ``property`` (``'multi'``, ``'single'``): whether property doc blocks should be - single or multi line; defaults to ``'multi'`` - -* **phpdoc_no_access** [@Symfony, @PhpCsFixer] - - ``@access`` annotations should be omitted from PHPDoc. - -* **phpdoc_no_alias_tag** [@Symfony, @PhpCsFixer] - - No alias PHPDoc tags should be used. - - Configuration options: - - - ``replacements`` (``array``): mapping between replaced annotations with new - ones; defaults to ``['property-read' => 'property', 'property-write' => - 'property', 'type' => 'var', 'link' => 'see']`` - -* **phpdoc_no_empty_return** [@PhpCsFixer] - - ``@return void`` and ``@return null`` annotations should be omitted from - PHPDoc. - -* **phpdoc_no_package** [@Symfony, @PhpCsFixer] - - ``@package`` and ``@subpackage`` annotations should be omitted from PHPDoc. - -* **phpdoc_no_useless_inheritdoc** [@Symfony, @PhpCsFixer] - - Classy that does not inherit must not have ``@inheritdoc`` tags. - -* **phpdoc_order** [@PhpCsFixer] - - Annotations in PHPDoc should be ordered so that ``@param`` annotations - come first, then ``@throws`` annotations, then ``@return`` annotations. - -* **phpdoc_return_self_reference** [@Symfony, @PhpCsFixer] - - The type of ``@return`` annotations of methods returning a reference to - itself must the configured one. - - Configuration options: - - - ``replacements`` (``array``): mapping between replaced return types with new - ones; defaults to ``['this' => '$this', '@this' => '$this', '$self' => - 'self', '@self' => 'self', '$static' => 'static', '@static' => - 'static']`` - -* **phpdoc_scalar** [@Symfony, @PhpCsFixer] - - Scalar types should always be written in the same form. ``int`` not - ``integer``, ``bool`` not ``boolean``, ``float`` not ``real`` or ``double``. - - Configuration options: - - - ``types`` (a subset of ``['boolean', 'callback', 'double', 'integer', 'real', - 'str']``): a map of types to fix; defaults to ``['boolean', 'double', - 'integer', 'real', 'str']`` - -* **phpdoc_separation** [@Symfony, @PhpCsFixer] - - Annotations in PHPDoc should be grouped together so that annotations of - the same type immediately follow each other, and annotations of a - different type are separated by a single blank line. - -* **phpdoc_single_line_var_spacing** [@Symfony, @PhpCsFixer] - - Single line ``@var`` PHPDoc should have proper spacing. - -* **phpdoc_summary** [@Symfony, @PhpCsFixer] - - PHPDoc summary should end in either a full stop, exclamation mark, or - question mark. - -* **phpdoc_to_comment** [@Symfony, @PhpCsFixer] - - Docblocks should only be used on structural elements. - -* **phpdoc_to_param_type** - - EXPERIMENTAL: Takes ``@param`` annotations of non-mixed types and adjusts - accordingly the function signature. Requires PHP >= 7.0. - - *Risky rule: this rule is EXPERIMENTAL and [1] is not covered with backward compatibility promise. [2] ``@param`` annotation is mandatory for the fixer to make changes, signatures of methods without it (no docblock, inheritdocs) will not be fixed. [3] Manual actions are required if inherited signatures are not properly documented.* - - Configuration options: - - - ``scalar_types`` (``bool``): fix also scalar types; may have unexpected - behaviour due to PHP bad type coercion system; defaults to ``true`` - -* **phpdoc_to_return_type** - - EXPERIMENTAL: Takes ``@return`` annotation of non-mixed types and adjusts - accordingly the function signature. Requires PHP >= 7.0. - - *Risky rule: this rule is EXPERIMENTAL and [1] is not covered with backward compatibility promise. [2] ``@return`` annotation is mandatory for the fixer to make changes, signatures of methods without it (no docblock, inheritdocs) will not be fixed. [3] Manual actions are required if inherited signatures are not properly documented. [4] ``@inheritdocs`` support is under construction.* - - Configuration options: - - - ``scalar_types`` (``bool``): fix also scalar types; may have unexpected - behaviour due to PHP bad type coercion system; defaults to ``true`` - -* **phpdoc_trim** [@Symfony, @PhpCsFixer] - - PHPDoc should start and end with content, excluding the very first and - last line of the docblocks. - -* **phpdoc_trim_consecutive_blank_line_separation** [@Symfony, @PhpCsFixer] - - Removes extra blank lines after summary and after description in PHPDoc. - -* **phpdoc_types** [@Symfony, @PhpCsFixer] - - The correct case must be used for standard PHP types in PHPDoc. - - Configuration options: - - - ``groups`` (a subset of ``['simple', 'alias', 'meta']``): type groups to fix; - defaults to ``['simple', 'alias', 'meta']`` - -* **phpdoc_types_order** [@Symfony, @PhpCsFixer] - - Sorts PHPDoc types. - - Configuration options: - - - ``null_adjustment`` (``'always_first'``, ``'always_last'``, ``'none'``): forces the - position of ``null`` (overrides ``sort_algorithm``); defaults to - ``'always_first'`` - - ``sort_algorithm`` (``'alpha'``, ``'none'``): the sorting algorithm to apply; - defaults to ``'alpha'`` - -* **phpdoc_var_annotation_correct_order** [@PhpCsFixer] - - ``@var`` and ``@type`` annotations must have type and name in the correct - order. - -* **phpdoc_var_without_name** [@Symfony, @PhpCsFixer] - - ``@var`` and ``@type`` annotations of classy properties should not contain - the name. - -* **pow_to_exponentiation** [@PHP56Migration:risky, @PHP70Migration:risky, @PHP71Migration:risky] - - Converts ``pow`` to the ``**`` operator. - - *Risky rule: risky when the function ``pow`` is overridden.* - -* **pre_increment** - - Pre incrementation/decrementation should be used if possible. - DEPRECATED: use ``increment_style`` instead. - -* **protected_to_private** [@PhpCsFixer] - - Converts ``protected`` variables and methods to ``private`` where possible. - -* **psr0** - - Classes must be in a path that matches their namespace, be at least one - namespace deep and the class name should match the file name. - - *Risky rule: this fixer may change your class name, which will break the code that depends on the old name.* - - Configuration options: - - - ``dir`` (``string``): the directory where the project code is placed; defaults - to ``''`` - -* **psr4** [@Symfony:risky, @PhpCsFixer:risky] - - Class names should match the file name. - - *Risky rule: this fixer may change your class name, which will break the code that depends on the old name.* - -* **random_api_migration** [@PHP70Migration:risky, @PHP71Migration:risky] - - Replaces ``rand``, ``srand``, ``getrandmax`` functions calls with their ``mt_*`` - analogs. - - *Risky rule: risky when the configured functions are overridden.* - - Configuration options: - - - ``replacements`` (``array``): mapping between replaced functions with the new - ones; defaults to ``['getrandmax' => 'mt_getrandmax', 'rand' => - 'mt_rand', 'srand' => 'mt_srand']`` - -* **return_assignment** [@PhpCsFixer] - - Local, dynamic and directly referenced variables should not be assigned - and directly returned by a function or method. - -* **return_type_declaration** [@Symfony, @PhpCsFixer] - - There should be one or no space before colon, and one space after it in - return type declarations, according to configuration. - - Configuration options: - - - ``space_before`` (``'none'``, ``'one'``): spacing to apply before colon; defaults to - ``'none'`` - -* **self_accessor** [@Symfony:risky, @PhpCsFixer:risky] - - Inside class or interface element ``self`` should be preferred to the - class name itself. - - *Risky rule: risky when using dynamic calls like get_called_class() or late static binding.* - -* **self_static_accessor** - - Inside a ``final`` class or anonymous class ``self`` should be preferred to - ``static``. - -* **semicolon_after_instruction** [@Symfony, @PhpCsFixer] - - Instructions must be terminated with a semicolon. - -* **set_type_to_cast** [@Symfony:risky, @PhpCsFixer:risky] - - Cast shall be used, not ``settype``. - - *Risky rule: risky when the ``settype`` function is overridden or when used as the 2nd or 3rd expression in a ``for`` loop .* - -* **short_scalar_cast** [@Symfony, @PhpCsFixer] - - Cast ``(boolean)`` and ``(integer)`` should be written as ``(bool)`` and - ``(int)``, ``(double)`` and ``(real)`` as ``(float)``, ``(binary)`` as - ``(string)``. - -* **silenced_deprecation_error** - - Ensures deprecation notices are silenced. DEPRECATED: use - ``error_suppression`` instead. - - *Risky rule: silencing of deprecation errors might cause changes to code behaviour.* - -* **simple_to_complex_string_variable** [@PhpCsFixer] - - Converts explicit variables in double-quoted strings and heredoc syntax - from simple to complex format (``${`` to ``{$``). - -* **simplified_null_return** - - A return statement wishing to return ``void`` should not return ``null``. - -* **single_blank_line_at_eof** [@PSR2, @Symfony, @PhpCsFixer] - - A PHP file without end tag must always end with a single empty line - feed. - -* **single_blank_line_before_namespace** [@Symfony, @PhpCsFixer] - - There should be exactly one blank line before a namespace declaration. - -* **single_class_element_per_statement** [@PSR2, @Symfony, @PhpCsFixer] - - There MUST NOT be more than one property or constant declared per - statement. - - Configuration options: - - - ``elements`` (a subset of ``['const', 'property']``): list of strings which - element should be modified; defaults to ``['const', 'property']`` - -* **single_import_per_statement** [@PSR2, @Symfony, @PhpCsFixer] - - There MUST be one use keyword per declaration. - -* **single_line_after_imports** [@PSR2, @Symfony, @PhpCsFixer] - - Each namespace use MUST go on its own line and there MUST be one blank - line after the use statements block. - -* **single_line_comment_style** [@Symfony, @PhpCsFixer] - - Single-line comments and multi-line comments with only one line of - actual content should use the ``//`` syntax. - - Configuration options: - - - ``comment_types`` (a subset of ``['asterisk', 'hash']``): list of comment types - to fix; defaults to ``['asterisk', 'hash']`` - -* **single_line_throw** [@Symfony] - - Throwing exception must be done in single line. - -* **single_quote** [@Symfony, @PhpCsFixer] - - Convert double quotes to single quotes for simple strings. - - Configuration options: - - - ``strings_containing_single_quote_chars`` (``bool``): whether to fix - double-quoted strings that contains single-quotes; defaults to ``false`` - -* **single_trait_insert_per_statement** [@Symfony, @PhpCsFixer] - - Each trait ``use`` must be done as single statement. - -* **space_after_semicolon** [@Symfony, @PhpCsFixer] - - Fix whitespace after a semicolon. - - Configuration options: - - - ``remove_in_empty_for_expressions`` (``bool``): whether spaces should be removed - for empty ``for`` expressions; defaults to ``false`` - -* **standardize_increment** [@Symfony, @PhpCsFixer] - - Increment and decrement operators should be used if possible. - -* **standardize_not_equals** [@Symfony, @PhpCsFixer] - - Replace all ``<>`` with ``!=``. - -* **static_lambda** - - Lambdas not (indirect) referencing ``$this`` must be declared ``static``. - - *Risky rule: risky when using ``->bindTo`` on lambdas without referencing to ``$this``.* - -* **strict_comparison** [@PhpCsFixer:risky] - - Comparisons should be strict. - - *Risky rule: changing comparisons to strict might change code behavior.* - -* **strict_param** [@PhpCsFixer:risky] - - Functions should be used with ``$strict`` param set to ``true``. - - *Risky rule: risky when the fixed function is overridden or if the code relies on non-strict usage.* - -* **string_line_ending** [@PhpCsFixer:risky] - - All multi-line strings must use correct line ending. - - *Risky rule: changing the line endings of multi-line strings might affect string comparisons and outputs.* - -* **switch_case_semicolon_to_colon** [@PSR2, @Symfony, @PhpCsFixer] - - A case should be followed by a colon and not a semicolon. - -* **switch_case_space** [@PSR2, @Symfony, @PhpCsFixer] - - Removes extra spaces between colon and case value. - -* **ternary_operator_spaces** [@Symfony, @PhpCsFixer] - - Standardize spaces around ternary operator. - -* **ternary_to_null_coalescing** [@PHP70Migration, @PHP71Migration, @PHP73Migration] - - Use ``null`` coalescing operator ``??`` where possible. Requires PHP >= 7.0. - -* **trailing_comma_in_multiline_array** [@Symfony, @PhpCsFixer] - - PHP multi-line arrays should have a trailing comma. - - Configuration options: - - - ``after_heredoc`` (``bool``): whether a trailing comma should also be placed - after heredoc end; defaults to ``false`` - -* **trim_array_spaces** [@Symfony, @PhpCsFixer] - - Arrays should be formatted like function/method arguments, without - leading or trailing single line space. - -* **unary_operator_spaces** [@Symfony, @PhpCsFixer] - - Unary operators should be placed adjacent to their operands. - -* **visibility_required** [@PSR2, @Symfony, @PhpCsFixer, @PHP71Migration, @PHP73Migration] - - Visibility MUST be declared on all properties and methods; ``abstract`` - and ``final`` MUST be declared before the visibility; ``static`` MUST be - declared after the visibility. - - Configuration options: - - - ``elements`` (a subset of ``['property', 'method', 'const']``): the structural - elements to fix (PHP >= 7.1 required for ``const``); defaults to - ``['property', 'method']`` - -* **void_return** [@PHP71Migration:risky] - - Add ``void`` return type to functions with missing or empty return - statements, but priority is given to ``@return`` annotations. Requires - PHP >= 7.1. - - *Risky rule: modifies the signature of functions.* - -* **whitespace_after_comma_in_array** [@Symfony, @PhpCsFixer] - - In array declaration, there MUST be a whitespace after each comma. - -* **yoda_style** [@Symfony, @PhpCsFixer] - - Write conditions in Yoda style (``true``), non-Yoda style (``false``) or - ignore those conditions (``null``) based on configuration. - - Configuration options: - - - ``always_move_variable`` (``bool``): whether variables should always be on non - assignable side when applying Yoda style; defaults to ``false`` - - ``equal`` (``bool``, ``null``): style for equal (``==``, ``!=``) statements; defaults to - ``true`` - - ``identical`` (``bool``, ``null``): style for identical (``===``, ``!==``) statements; - defaults to ``true`` - - ``less_and_greater`` (``bool``, ``null``): style for less and greater than (``<``, - ``<=``, ``>``, ``>=``) statements; defaults to ``null`` - - -The ``--dry-run`` option displays the files that need to be -fixed but without actually modifying them: - -.. code-block:: bash - - $ php php-cs-fixer.phar fix /path/to/code --dry-run - -Config file ------------ - -Instead of using command line options to customize the rule, you can save the -project configuration in a ``.php_cs.dist`` file in the root directory of your project. -The file must return an instance of `PhpCsFixer\\ConfigInterface `_ -which lets you configure the rules, the files and directories that -need to be analyzed. You may also create ``.php_cs`` file, which is -the local configuration that will be used instead of the project configuration. It -is a good practice to add that file into your ``.gitignore`` file. -With the ``--config`` option you can specify the path to the -``.php_cs`` file. - -The example below will add two rules to the default list of PSR2 set rules: - -.. code-block:: php - - exclude('somedir') - ->notPath('src/Symfony/Component/Translation/Tests/fixtures/resources.php') - ->in(__DIR__) - ; - - return PhpCsFixer\Config::create() - ->setRules([ - '@PSR2' => true, - 'strict_param' => true, - 'array_syntax' => ['syntax' => 'short'], - ]) - ->setFinder($finder) - ; - -**NOTE**: ``exclude`` will work only for directories, so if you need to exclude file, try ``notPath``. -Both ``exclude`` and ``notPath`` methods accept only relative paths to the ones defined with the ``in`` method. - -See `Symfony\\Finder `_ -online documentation for other `Finder` methods. - -You may also use an exclude list for the rules instead of the above shown include approach. -The following example shows how to use all ``Symfony`` rules but the ``full_opening_tag`` rule. - -.. code-block:: php - - exclude('somedir') - ->in(__DIR__) - ; - - return PhpCsFixer\Config::create() - ->setRules([ - '@Symfony' => true, - 'full_opening_tag' => false, - ]) - ->setFinder($finder) - ; - -You may want to use non-linux whitespaces in your project. Then you need to -configure them in your config file. - -.. code-block:: php - - setIndent("\t") - ->setLineEnding("\r\n") - ; - -By using ``--using-cache`` option with ``yes`` or ``no`` you can set if the caching -mechanism should be used. - -Caching -------- - -The caching mechanism is enabled by default. This will speed up further runs by -fixing only files that were modified since the last run. The tool will fix all -files if the tool version has changed or the list of rules has changed. -Cache is supported only for tool downloaded as phar file or installed via -composer. - -Cache can be disabled via ``--using-cache`` option or config file: - -.. code-block:: php - - setUsingCache(false) - ; - -Cache file can be specified via ``--cache-file`` option or config file: - -.. code-block:: php - - setCacheFile(__DIR__.'/.php_cs.cache') - ; - -Using PHP CS Fixer on CI ------------------------- - -Require ``friendsofphp/php-cs-fixer`` as a ``dev`` dependency: - -.. code-block:: bash - - $ ./composer.phar require --dev friendsofphp/php-cs-fixer - -Then, add the following command to your CI: - -.. code-block:: bash - - $ IFS=' - $ ' - $ CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRTUXB "${COMMIT_RANGE}") - $ if ! echo "${CHANGED_FILES}" | grep -qE "^(\\.php_cs(\\.dist)?|composer\\.lock)$"; then EXTRA_ARGS=$(printf -- '--path-mode=intersection\n--\n%s' "${CHANGED_FILES}"); else EXTRA_ARGS=''; fi - $ vendor/bin/php-cs-fixer fix --config=.php_cs.dist -v --dry-run --stop-on-violation --using-cache=no ${EXTRA_ARGS} - -Where ``$COMMIT_RANGE`` is your range of commits, e.g. ``$TRAVIS_COMMIT_RANGE`` or ``HEAD~..HEAD``. - -Exit code ---------- - -Exit code is built using following bit flags: - -* 0 - OK. -* 1 - General error (or PHP minimal requirement not matched). -* 4 - Some files have invalid syntax (only in dry-run mode). -* 8 - Some files need fixing (only in dry-run mode). -* 16 - Configuration error of the application. -* 32 - Configuration error of a Fixer. -* 64 - Exception raised within the application. - -(Applies to exit code of the ``fix`` command only) - -Helpers -------- - -Dedicated plugins exist for: - -* `Atom`_ -* `NetBeans`_ -* `PhpStorm`_ -* `Sublime Text`_ -* `Vim`_ -* `VS Code`_ - -Contribute ----------- - -The tool comes with quite a few built-in fixers, but everyone is more than -welcome to `contribute`_ more of them. - -Fixers -~~~~~~ - -A *fixer* is a class that tries to fix one CS issue (a ``Fixer`` class must -implement ``FixerInterface``). - -Configs -~~~~~~~ - -A *config* knows about the CS rules and the files and directories that must be -scanned by the tool when run in the directory of your project. It is useful for -projects that follow a well-known directory structures (like for Symfony -projects for instance). - -.. _php-cs-fixer.phar: https://cs.symfony.com/download/php-cs-fixer-v2.phar -.. _Atom: https://github.com/Glavin001/atom-beautify -.. _NetBeans: http://plugins.netbeans.org/plugin/49042/php-cs-fixer -.. _PhpStorm: https://medium.com/@valeryan/how-to-configure-phpstorm-to-use-php-cs-fixer-1844991e521f -.. _Sublime Text: https://github.com/benmatselby/sublime-phpcs -.. _Vim: https://github.com/stephpy/vim-php-cs-fixer -.. _VS Code: https://github.com/junstyle/vscode-php-cs-fixer -.. _contribute: https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/master/CONTRIBUTING.md diff --git a/vendor/friendsofphp/php-cs-fixer/UPGRADE.md b/vendor/friendsofphp/php-cs-fixer/UPGRADE.md deleted file mode 100644 index 435d016..0000000 --- a/vendor/friendsofphp/php-cs-fixer/UPGRADE.md +++ /dev/null @@ -1,184 +0,0 @@ -UPGRADE GUIDE FROM 1.x to 2.0 -============================= - -This is guide for upgrade from version 1.x to 2.0 for using the CLI tool. - -Rules and sets --------------- -To configure which fixers should be used you must now set rules and sets instead of fixers and level. This affects both configuration file and CLI arguments. - -Default ruleset was changed from Symfony standard to more generic PSR2. You can still use Symfony standard, which in fact extends PSR2. - -The term of risky fixers was introduced. Risky fixer is a fixer that may change the meaning of code (like `StrictComparisonFixer` fixer, which will change `==` into `===`). No rules that are followed by risky fixers are run by default. You need to explicitly permit risky fixers to run them. - -Default configuration changes ----------------------------- -By default, PSR2 rules are used instead of Symfony rules. -Files that will be fixed are php/phpt/twig instead of php/twig/xml/yml. -Finally, the caching mechanism is enabled by default. - -CLI options ------------ - -| 1.x | 2.0 | Description | Note | -| --------------- | --------------- | ------------------------------------------------------------------------------ | ------------------------------- | -|     | --allow-risky | Are risky fixers allowed                                                 | | -| | --cache-file | The path to the cache file | option was added | -| --config | | Config class codename | option was removed | -| --config-file | --config | The path to a .php_cs file | option was renamed | -| --diff | --diff | Show diff | | -| --dry-run | --dry-run | Run in dry-run mode | | -| --fixers | | Coding standard fixers | option was removed, see --rules | -| --format | --format | Choose format | | -| --level | | Coding standard level | option was removed, see --rules | -| | --path-mode | Should the finder from config be
overridden or intersected with `path` arg | option was added | -| | --rules | Rules to be used | option was added | -| | --using-cache | Does cache should be used | option was added | - - -CLI argument ------------- - -On 2.x line `path` argument is an array, so you may pass multiple paths. - -Intersection path mode makes the `path` argument a mask for finder you have defined in your configuration file. -Only files pointed by both finder and CLI `path` argument will be fixed. - -Exit codes ----------- - -Exit codes for `fix` command have been changed and are build using the following bit flags: - -| 1.x bit | 2.0 bit | Description | Note | -| -------:| -------:| ----------------------------------------------------------- | ---------------------------------------------------------------- | -| 0 | 0 | OK | | -| 1 | 1 | General error (or PHP/HHVM minimal requirement not matched) | no longer used for other states, never combined with other flags | -| | 4 | Some files have invalid syntax | flag was added, works only in dry-run mode | -| | 8 | Some files need fixing | flag was added, works only in dry-run mode | -| 16 | 16 | Configuration error of the application | | -| 32 | 32 | Configuration error of a Fixer | | -| | 64 | Exception within the application | flag was added | - -Namespace ---------- -`Symfony\CS` namespace was renamed into `PhpCsFixer`. - -Config file ------------ -From now you can create new configuration file: `.php_cs.dist`. This file is used if no `.php_cs` file was found. It is recommended to create `.php_cs.dist` file attached in your repository and add `.php_cs` file to `.gitignore` for allowing your contributors to have theirs own configuration file. - -Config and Finder classes -------------------------- -All off `Symfony\CS\Config\*` and `Symfony\CS\Finder\*` classes have been removed, instead use `PhpCsFixer\Config` and `PhpCsFixer\Finder`. - -For that reason you can not set config class by `--config` CLI argument, from now it is used to set configuration file. Therefor the `--config-file` CLI argument is no longer available. - -Renamed rules -------------- - -Old name | New name | Note --------- | -------- | ---- -align_double_arrow | binary_operator_spaces | use configuration ['align_double_arrow' => true] -align_equals | binary_operator_spaces | use configuration ['align_equals' => true] -array_element_no_space_before_comma | no_whitespace_before_comma_in_array -array_element_white_space_after_comma | whitespace_after_comma_in_array -blankline_after_open_tag | blank_line_after_opening_tag -concat_with_spaces | concat_space | use configuration ['spacing' => 'one'] -concat_without_spaces | concat_space | use configuration ['spacing' => 'none'] -double_arrow_multiline_whitespaces | no_multiline_whitespace_around_double_arrow -duplicate_semicolon | no_empty_statement | new one fixes more cases -empty_return | simplified_null_return -echo_to_print | no_mixed_echo_print | use configuration ['use' => 'print'] -eof_ending | single_blank_line_at_eof -extra_empty_lines | no_extra_consecutive_blank_lines -function_call_space | no_spaces_after_function_name -general_phpdoc_annotation_rename | phpdoc_no_alias_tag | use configuration ['property-read' => 'property', 'property-write' => 'property'] -indentation | indentation_type -join_function | no_alias_functions | new one fixes more aliases -line_after_namespace | blank_line_after_namespace -linefeed | line_ending | whitespaces type aware -list_commas | no_trailing_comma_in_list_call -logical_not_operators_with_spaces | not_operator_with_space -logical_not_operators_with_successor_space | not_operator_with_successor_space -long_array_syntax | array_syntax | use configuration ['syntax' => 'long'] -method_argument_default_value | no_unreachable_default_argument_value -multiline_array_trailing_comma | trailing_comma_in_multiline_array -multiline_spaces_before_semicolon | no_multiline_whitespace_before_semicolons -multiple_use | single_import_per_statement -namespace_no_leading_whitespace | no_leading_namespace_whitespace -newline_after_open_tag | linebreak_after_opening_tag -no_empty_lines_after_phpdocs | no_blank_lines_after_phpdoc -object_operator | object_operator_without_whitespace -operators_spaces | binary_operator_spaces -ordered_use | ordered_imports -parenthesis | no_spaces_inside_parenthesis -php4_constructor | no_php4_constructor -php_closing_tag | no_closing_tag -phpdoc_params | phpdoc_align -phpdoc_property | phpdoc_no_alias_tag | use configuration ['type' => 'var'] -phpdoc_short_description | phpdoc_summary -phpdoc_type_to_var | phpdoc_no_alias_tag | use configuration ['type' => 'var'] -phpdoc_var_to_type | phpdoc_no_alias_tag | use configuration ['var' => 'type'] -print_to_echo | no_mixed_echo_print | use configuration ['use' => 'echo'] -remove_leading_slash_use | no_leading_import_slash -remove_lines_between_uses | no_extra_consecutive_blank_lines | use configuration ['use'] -return | blank_line_before_return -short_array_syntax | array_syntax | use configuration ['syntax' => 'short'] -short_bool_cast | no_short_bool_cast -short_echo_tag | no_short_echo_tag -short_tag | full_opening_tag -single_array_no_trailing_comma | no_trailing_comma_in_singleline_array -spaces_after_semicolon | space_after_semicolon -spaces_before_semicolon | no_singleline_whitespace_before_semicolons -spaces_cast | cast_spaces -standardize_not_equal | standardize_not_equals -strict | strict_comparison -ternary_spaces | ternary_operator_spaces -trailing_spaces | no_trailing_whitespace -unalign_double_arrow | binary_operator_spaces | use configuration ['align_double_arrow' => false] -unalign_equals | binary_operator_spaces | use configuration ['align_equals' => false] -unary_operators_spaces | unary_operator_spaces -unneeded_control_parentheses | no_unneeded_control_parentheses -unused_use | no_unused_imports -visibility | visibility_required -whitespacy_lines | no_whitespace_in_blank_line - -Changes to Fixers ------------------ - -Fixer | Note ------ | ---- -psr0 | Fixer no longer takes base dir from `ConfigInterface::getDir`, instead you may configure the fixer with `['dir' => 'my/path']`. - -Custom fixers -------------- - -If you have registered custom fixers in your config file `*.php_cs` using `addCustomFixer()` method... -``` -fixers([ - 'blankline_after_open_tag', - // ... - ]) - ->addCustomFixer(new ShopSys\CodingStandards\CsFixer\MissingButtonTypeFixer()) - ->addCustomFixer(new ShopSys\CodingStandards\CsFixer\OrmJoinColumnRequireNullableFixer()); -``` -...now you have to use `registerCustomFixers()` method instead and enable the custom fixers by their names in the `setRules()` method: -``` -registerCustomFixers([ - new ShopSys\CodingStandards\CsFixer\MissingButtonTypeFixer(), - new ShopSys\CodingStandards\CsFixer\OrmJoinColumnRequireNullableFixer(), - ]) - ->setRules([ - 'blankline_after_open_tag', - 'Shopsys/missing_button_type' => true, - 'Shopsys/orm_join_column_require_nullable' => true, - // ... - ]); - -``` diff --git a/vendor/friendsofphp/php-cs-fixer/ci-integration.sh b/vendor/friendsofphp/php-cs-fixer/ci-integration.sh deleted file mode 100644 index 489c5d2..0000000 --- a/vendor/friendsofphp/php-cs-fixer/ci-integration.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -set -eu - -IFS=' -' -CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRTUXB "${COMMIT_RANGE}") -if ! echo "${CHANGED_FILES}" | grep -qE "^(\\.php_cs(\\.dist)?|composer\\.lock)$"; then EXTRA_ARGS=$(printf -- '--path-mode=intersection\n--\n%s' "${CHANGED_FILES}"); else EXTRA_ARGS=''; fi -vendor/bin/php-cs-fixer fix --config=.php_cs.dist -v --dry-run --stop-on-violation --using-cache=no ${EXTRA_ARGS} diff --git a/vendor/friendsofphp/php-cs-fixer/composer.json b/vendor/friendsofphp/php-cs-fixer/composer.json deleted file mode 100644 index 34a604e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/composer.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "friendsofphp/php-cs-fixer", - "type": "application", - "description": "A tool to automatically fix PHP code style", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" - } - ], - "require": { - "php": "^5.6 || ^7.0", - "ext-json": "*", - "ext-tokenizer": "*", - "composer/semver": "^1.4", - "composer/xdebug-handler": "^1.2", - "doctrine/annotations": "^1.2", - "php-cs-fixer/diff": "^1.3", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0", - "symfony/event-dispatcher": "^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^3.0 || ^4.0 || ^5.0", - "symfony/options-resolver": "^3.0 || ^4.0 || ^5.0", - "symfony/polyfill-php70": "^1.0", - "symfony/polyfill-php72": "^1.4", - "symfony/process": "^3.0 || ^4.0 || ^5.0", - "symfony/stopwatch": "^3.0 || ^4.0 || ^5.0" - }, - "require-dev": { - "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0", - "justinrainbow/json-schema": "^5.0", - "keradus/cli-executor": "^1.2", - "mikey179/vfsstream": "^1.6", - "php-coveralls/php-coveralls": "^2.1", - "php-cs-fixer/accessible-object": "^1.0", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.1", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.1", - "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.1", - "phpunitgoodpractices/traits": "^1.8", - "symfony/phpunit-bridge": "^5.1", - "symfony/yaml": "^3.0 || ^4.0 || ^5.0" - }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters.", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", - "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." - }, - "config": { - "sort-packages": true - }, - "autoload": { - "psr-4": { - "PhpCsFixer\\": "src/" - }, - "classmap": [ - "tests/Test/AbstractFixerTestCase.php", - "tests/Test/AbstractIntegrationCaseFactory.php", - "tests/Test/AbstractIntegrationTestCase.php", - "tests/Test/Assert/AssertTokensTrait.php", - "tests/Test/IntegrationCase.php", - "tests/Test/IntegrationCaseFactory.php", - "tests/Test/IntegrationCaseFactoryInterface.php", - "tests/Test/InternalIntegrationCaseFactory.php", - "tests/Test/IsIdenticalConstraint.php", - "tests/TestCase.php" - ] - }, - "autoload-dev": { - "psr-4": { - "PhpCsFixer\\Tests\\": "tests/" - } - }, - "bin": [ - "php-cs-fixer" - ] -} diff --git a/vendor/friendsofphp/php-cs-fixer/doc/COOKBOOK-FIXERS.md b/vendor/friendsofphp/php-cs-fixer/doc/COOKBOOK-FIXERS.md deleted file mode 100644 index afc627a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/doc/COOKBOOK-FIXERS.md +++ /dev/null @@ -1,530 +0,0 @@ -Cookbook - Making a new Fixer for PHP CS Fixer -============================================== - -You want to make a new fixer to PHP CS Fixer and do not know how to -start. Follow this document and you will be able to do it. - -## Background - -In order to be able to create a new fixer, you need some background. -PHP CS Fixer is a transcompiler which takes valid PHP code and pretty -print valid PHP code. It does all transformations in multiple passes, -a.k.a., multi-pass compiler. - -Therefore, a new fixer is meant to be ideally -[idempotent](https://en.wikipedia.org/wiki/Idempotence#Computer_science_meaning), -or at least atomic in its actions. More on this later. - -All contributions go through a code review process. Do not feel -discouraged - it is meant only to give more people more chance to -contribute, and to detect bugs ([Linus' -Law](https://en.wikipedia.org/wiki/Linus%27s_Law)). - -If possible, try to get acquainted with the public interface for the -[Tokens class](/src/Tokenizer/Tokens.php) -and [Token class](/src/Tokenizer/Token.php) -classes. - -## Assumptions - -* You are familiar with Test Driven Development. -* Forked FriendsOfPHP/PHP-CS-Fixer into your own GitHub Account. -* Cloned your forked repository locally. -* Installed the dependencies of PHP CS Fixer using [Composer](https://getcomposer.org/). -* You have read [`CONTRIBUTING.md`](/CONTRIBUTING.md). - -## Step by step - -For this step-by-step, we are going to create a simple fixer that -removes all comments of the code that are preceded by ';' (semicolon). - -We are calling it `remove_comments` (code name), or, -`RemoveCommentsFixer` (class name). - -### Step 1 - Creating files - -Create a new file in `src/Fixer/Comment/RemoveCommentsFixer.php`. -Put this content inside: -```php - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Your name - */ -final class RemoveCommentsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - // Return a definition of the fixer, it will be used in the README.rst. - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - // Check whether the collection is a candidate for fixing. - // Has to be ultra cheap to execute. - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - // Add the fixing logic of the fixer here. - } -} -``` - -Note how the class and file name match. Also keep in mind that all -fixers must implement `Fixer\FixerInterface`. In this case, the fixer is -inheriting from `AbstractFixer`, which fulfills the interface with some -default behavior. - -Now let us create the test file at -`tests/Fixer/Comment/RemoveCommentsFixerTest.php`. Put this content inside: - -```php - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests\Fixer\Comment; - -use PhpCsFixer\Tests\Test\AbstractFixerTestCase; - -/** - * @author Your name - * - * @internal - * - * @covers \PhpCsFixer\Fixer\Comment\RemoveCommentsFixer - */ -final class RemoveCommentsFixerTest extends AbstractFixerTestCase -{ - /** - * @param string $expected - * @param null|string $input - * - * @dataProvider provideFixCases - */ - public function testFix($expected, $input = null) - { - $this->doTest($expected, $input); - } - - public function provideFixCases() - { - return []; - } -} -``` -### Step 2 - Using tests to define fixers behavior - -Now that the files are created, you can start writing test to define the -behavior of the fixer. You have to do it in two ways: first, ensuring -the fixer changes what it should be changing; second, ensuring that -fixer does not change what is not supposed to change. Thus: - -#### Keeping things as they are: -`tests/Fixer/Comment/RemoveCommentsFixerTest.php`@provideFixCases: -```php - ... - public function provideFixCases() - { - return [ - [' - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests\Fixer\Comment; - -use PhpCsFixer\Tests\Fixer\AbstractFixerTestBase; - -/** - * @author Your name - * - * @internal - */ -final class RemoveCommentsFixerTest extends AbstractFixerTestBase -{ - /** - * @param string $expected - * @param null|string $input - * - * @dataProvider provideFixCases - */ - public function testFix($expected, $input = null) - { - $this->doTest($expected, $input); - } - - public function provideFixCases() - { - return [ - [ - ' README.rst` - -Next, we must filter what type of tokens we want to fix. Here, we are interested in code that contains `T_COMMENT` tokens: -`src/Fixer/Comment/RemoveCommentsFixer.php`: -```php -final class RemoveCommentsFixer extends AbstractFixer -{ - ... - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_COMMENT); - } -} -``` - -For now, let us just make a fixer that applies no modification: -`src/Fixer/Comment/RemoveCommentsFixer.php`: -```php -class RemoveCommentsFixer extends AbstractFixer -{ - ... - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - // no action - } -} -``` - -Run `$ phpunit tests/Fixer/Comment/RemoveCommentsFixerTest.php`. -You are going to see that the tests fails. - -### Break -Now we have pretty much a cradle to work with. A file with a failing -test, and the fixer, that for now does not do anything. - -How do fixers work? In the PHP CS Fixer, they work by iterating through -pieces of codes (each being a Token), and inspecting what exists before -and after that bit and making a decision, usually: - - * Adding code. - * Modifying code. - * Deleting code. - * Ignoring code. - -In our case, we want to find all comments, and foreach (pun intended) -one of them check if they are preceded by a semicolon symbol. - -Now you need to do some reading, because all these symbols obey a list -defined by the PHP compiler. It is the ["List of Parser -Tokens"](https://php.net/manual/en/tokens.php). - -Internally, PHP CS Fixer transforms some of PHP native tokens into custom -tokens through the use of [Transfomers](/src/Tokenizer/Transformer), -they aim to help you reason about the changes you may want to do in the -fixers. - -So we can get to move forward, humor me in believing that comments have -one symbol name: `T_COMMENT`. - -### Step 3 - Implement your solution - continuation. - -We do not want all symbols to be analysed. Only `T_COMMENT`. So let us -iterate the token(s) we are interested in. -`src/Fixer/Comment/RemoveCommentsFixer.php`: -```php -final class RemoveCommentsFixer extends AbstractFixer -{ - ... - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_COMMENT)) { - continue; - } - - // need to figure out what to do here! - } - } -} -``` - -OK, now for each `T_COMMENT`, all we need to do is check if the previous -token is a semicolon. -`src/Fixer/Comment/RemoveCommentsFixer.php`: -```php -final class RemoveCommentsFixer extends AbstractFixer -{ - ... - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_COMMENT)) { - continue; - } - - $prevTokenIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevTokenIndex]; - - if ($prevToken->equals(';')) { - $tokens->clearAt($index); - } - } - } -} -``` - -So the fixer in the end looks like this: -```php - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Your name - */ -final class RemoveCommentsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Removes all comments of the code that are preceded by ";" (semicolon).', // Trailing dot is important. We thrive to use English grammar properly. - [ - new CodeSample( - 'isTokenKindFound(T_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) { - foreach($tokens as $index => $token){ - if (!$token->isGivenKind(T_COMMENT)) { - continue; - } - - $prevTokenIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevTokenIndex]; - - if ($prevToken->equals(';')) { - $tokens->clearAt($index); - } - } - } -} -``` - -### Step 4 - Format, Commit, PR. - -Note that so far, we have not coded adhering to PSR-1/2. This is done on -purpose. For every commit you make, you must use PHP CS Fixer to fix -itself. Thus, on the command line call: - -`$ php php-cs-fixer fix` - -This will fix all the coding style mistakes. - -After the final CS fix, you are ready to commit. Do it. - -Now, go to GitHub and open a Pull Request. - - -### Step 5 - Peer review: it is all about code and community building. - -Congratulations, you have made your first fixer. Be proud. Your work -will be reviewed carefully by PHP CS Fixer community. - -The review usually flows like this: - -1. People will check your code for common mistakes and logical -caveats. Usually, the person building a fixer is blind about some -behavior mistakes of fixers. Expect to write few more tests to cater for -the reviews. -2. People will discuss the relevance of your fixer. If it is -something that goes along with Symfony style standards, or PSR-1/PSR-2 -standards, they will ask you to add it to existing ruleset. -3. People will also discuss whether your fixer is idempotent or not. -If they understand that your fixer must always run before or after a -certain fixer, they will ask you to override a method named -`getPriority()`. Do not be afraid of asking the reviewer for help on how -to do it. -4. People may ask you to rebase your code to unify commits or to get -rid of merge commits. -5. Go to 1 until no actions are needed anymore. - -Your fixer will be incorporated in the next release. - -# Congratulations! You have done it. - - - -## Q&A - -#### Why is not my PR merged yet? - -PHP CS Fixer is used by many people, that expect it to be stable. So -sometimes, few PR are delayed a bit so to avoid cluttering at @dev -channel on composer. - -Other possibility is that reviewers are giving time to other members of -PHP CS Fixer community to partake on the review debates of your fixer. - -In any case, we care a lot about what you do and we want to see it being -part of the application as soon as possible. - -#### Why am I asked to use `getPrevMeaningfulToken()` instead of `getPrevNonWhitespace()`? - -The main difference is that `getPrevNonWhitespace()` ignores only -whitespaces (`T_WHITESPACE`), while `getPrevMeaningfulToken()` ignores -whitespaces and comments. And usually that is what you want. For -example: - -```php -$a->/*comment*/func(); -``` - -If you are inspecting `func()`, and you want to check whether this is -part of an object, if you use `getPrevNonWhitespace()` you are going to -get `/*comment*/`, which might belie your test. On the other hand, if -you use `getPrevMeaningfulToken()`, no matter if you have got a comment -or a whitespace, the returned token will always be `->`. diff --git a/vendor/friendsofphp/php-cs-fixer/doc/checkstyle.xsd b/vendor/friendsofphp/php-cs-fixer/doc/checkstyle.xsd deleted file mode 100644 index 02249fa..0000000 --- a/vendor/friendsofphp/php-cs-fixer/doc/checkstyle.xsd +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vendor/friendsofphp/php-cs-fixer/doc/junit-10.xsd b/vendor/friendsofphp/php-cs-fixer/doc/junit-10.xsd deleted file mode 100644 index 1f41ea3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/doc/junit-10.xsd +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/friendsofphp/php-cs-fixer/doc/schema.json b/vendor/friendsofphp/php-cs-fixer/doc/schema.json deleted file mode 100644 index 15db1e4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/doc/schema.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "type": "object", - "properties": { - "files": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "appliedFixers": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "string" - } - } - }, - "required": [ - "name" - ] - } - }, - "time": { - "type": "object", - "properties": { - "total": { - "type": "number" - } - }, - "required": [ - "total" - ] - }, - "memory": { - "type": "number" - } - }, - "required": [ - "files", - "time", - "memory" - ] -} diff --git a/vendor/friendsofphp/php-cs-fixer/doc/xml.xsd b/vendor/friendsofphp/php-cs-fixer/doc/xml.xsd deleted file mode 100644 index c7159a3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/doc/xml.xsd +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vendor/friendsofphp/php-cs-fixer/php-cs-fixer b/vendor/friendsofphp/php-cs-fixer/php-cs-fixer deleted file mode 100755 index 23c88b3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/php-cs-fixer +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env php - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED); -} - -if (defined('HHVM_VERSION_ID')) { - fwrite(STDERR, "HHVM is not supported.\n"); - - if (getenv('PHP_CS_FIXER_IGNORE_ENV')) { - fwrite(STDERR, "Ignoring environment requirements because `PHP_CS_FIXER_IGNORE_ENV` is set. Execution may be unstable.\n"); - } else { - exit(1); - } -} elseif (!defined('PHP_VERSION_ID') || \PHP_VERSION_ID < 50600 || \PHP_VERSION_ID >= 70500) { - fwrite(STDERR, "PHP needs to be a minimum version of PHP 5.6.0 and maximum version of PHP 7.4.*.\n"); - - if (getenv('PHP_CS_FIXER_IGNORE_ENV')) { - fwrite(STDERR, "Ignoring environment requirements because `PHP_CS_FIXER_IGNORE_ENV` is set. Execution may be unstable.\n"); - } else { - exit(1); - } -} - -foreach (['json', 'tokenizer'] as $extension) { - if (!extension_loaded($extension)) { - fwrite(STDERR, sprintf("PHP extension ext-%s is missing from your system. Install or enable it.\n", $extension)); - - if (getenv('PHP_CS_FIXER_IGNORE_ENV')) { - fwrite(STDERR, "Ignoring environment requirements because `PHP_CS_FIXER_IGNORE_ENV` is set. Execution may be unstable.\n"); - } else { - exit(1); - } - } -} -unset($extension); - -set_error_handler(static function ($severity, $message, $file, $line) { - if ($severity & error_reporting()) { - throw new ErrorException($message, 0, $severity, $file, $line); - } -}); - -$require = true; -if (class_exists('Phar')) { - // Maybe this file is used as phar-stub? Let's try! - try { - Phar::mapPhar('php-cs-fixer.phar'); - require_once 'phar://php-cs-fixer.phar/vendor/autoload.php'; - $require = false; - } catch (PharException $e) { - } -} - -if ($require) { - // OK, it's not, let give Composer autoloader a try! - $possibleFiles = [__DIR__.'/../../autoload.php', __DIR__.'/../autoload.php', __DIR__.'/vendor/autoload.php']; - $file = null; - foreach ($possibleFiles as $possibleFile) { - if (file_exists($possibleFile)) { - $file = $possibleFile; - - break; - } - } - - if (null === $file) { - throw new RuntimeException('Unable to locate autoload.php file.'); - } - - require_once $file; - - unset($possibleFiles, $possibleFile, $file); -} -unset($require); - -use Composer\XdebugHandler\XdebugHandler; -use PhpCsFixer\Console\Application; - -// Restart if xdebug is loaded, unless the environment variable PHP_CS_FIXER_ALLOW_XDEBUG is set. -$xdebug = new XdebugHandler('PHP_CS_FIXER', '--ansi'); -$xdebug->check(); -unset($xdebug); - -$application = new Application(); -$application->run(); - -__HALT_COMPILER(); diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractAlignFixerHelper.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractAlignFixerHelper.php deleted file mode 100644 index a24881e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractAlignFixerHelper.php +++ /dev/null @@ -1,122 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Carlos Cirello - * - * @internal - * - * @deprecated - */ -abstract class AbstractAlignFixerHelper -{ - /** - * @const Placeholder used as anchor for right alignment. - */ - const ALIGNABLE_PLACEHOLDER = "\x2 ALIGNABLE%d \x3"; - - /** - * Keep track of the deepest level ever achieved while - * parsing the code. Used later to replace alignment - * placeholders with spaces. - * - * @var int - */ - protected $deepestLevel = 0; - - public function fix(Tokens $tokens) - { - // This fixer works partially on Tokens and partially on string representation of code. - // During the process of fixing internal state of single Token may be affected by injecting ALIGNABLE_PLACEHOLDER to its content. - // The placeholder will be resolved by `replacePlaceholder` method by removing placeholder or changing it into spaces. - // That way of fixing the code causes disturbances in marking Token as changed - if code is perfectly valid then placeholder - // still be injected and removed, which will cause the `changed` flag to be set. - // To handle that unwanted behavior we work on clone of Tokens collection and then override original collection with fixed collection. - $tokensClone = clone $tokens; - - $this->injectAlignmentPlaceholders($tokensClone, 0, \count($tokens)); - $content = $this->replacePlaceholder($tokensClone); - - $tokens->setCode($content); - } - - /** - * Inject into the text placeholders of candidates of vertical alignment. - * - * @param int $startAt - * @param int $endAt - */ - abstract protected function injectAlignmentPlaceholders(Tokens $tokens, $startAt, $endAt); - - /** - * Look for group of placeholders, and provide vertical alignment. - * - * @return string - */ - protected function replacePlaceholder(Tokens $tokens) - { - $tmpCode = $tokens->generateCode(); - - for ($j = 0; $j <= $this->deepestLevel; ++$j) { - $placeholder = sprintf(self::ALIGNABLE_PLACEHOLDER, $j); - - if (false === strpos($tmpCode, $placeholder)) { - continue; - } - - $lines = explode("\n", $tmpCode); - $linesWithPlaceholder = []; - $blockSize = 0; - - $linesWithPlaceholder[$blockSize] = []; - - foreach ($lines as $index => $line) { - if (substr_count($line, $placeholder) > 0) { - $linesWithPlaceholder[$blockSize][] = $index; - } else { - ++$blockSize; - $linesWithPlaceholder[$blockSize] = []; - } - } - - foreach ($linesWithPlaceholder as $group) { - if (\count($group) < 1) { - continue; - } - - $rightmostSymbol = 0; - foreach ($group as $index) { - $rightmostSymbol = max($rightmostSymbol, strpos(utf8_decode($lines[$index]), $placeholder)); - } - - foreach ($group as $index) { - $line = $lines[$index]; - $currentSymbol = strpos(utf8_decode($line), $placeholder); - $delta = abs($rightmostSymbol - $currentSymbol); - - if ($delta > 0) { - $line = str_replace($placeholder, str_repeat(' ', $delta).$placeholder, $line); - $lines[$index] = $line; - } - } - } - - $tmpCode = str_replace($placeholder, '', implode("\n", $lines)); - } - - return $tmpCode; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php deleted file mode 100644 index 93b1168..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php +++ /dev/null @@ -1,221 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Doctrine\Annotation\Tokens as DoctrineAnnotationTokens; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\Tokenizer\Token as PhpToken; -use PhpCsFixer\Tokenizer\Tokens as PhpTokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @internal - */ -abstract class AbstractDoctrineAnnotationFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @var array - */ - private $classyElements; - - /** - * {@inheritdoc} - */ - public function isCandidate(PhpTokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, PhpTokens $phpTokens) - { - // fetch indexes one time, this is safe as we never add or remove a token during fixing - $analyzer = new TokensAnalyzer($phpTokens); - $this->classyElements = $analyzer->getClassyElements(); - - /** @var PhpToken $docCommentToken */ - foreach ($phpTokens->findGivenKind(T_DOC_COMMENT) as $index => $docCommentToken) { - if (!$this->nextElementAcceptsDoctrineAnnotations($phpTokens, $index)) { - continue; - } - - $tokens = DoctrineAnnotationTokens::createFromDocComment( - $docCommentToken, - $this->configuration['ignored_tags'] - ); - $this->fixAnnotations($tokens); - $phpTokens[$index] = new PhpToken([T_DOC_COMMENT, $tokens->getCode()]); - } - } - - /** - * Fixes Doctrine annotations from the given PHPDoc style comment. - */ - abstract protected function fixAnnotations(DoctrineAnnotationTokens $doctrineAnnotationTokens); - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('ignored_tags', 'List of tags that must not be treated as Doctrine Annotations.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function ($values) { - foreach ($values as $value) { - if (!\is_string($value)) { - return false; - } - } - - return true; - }]) - ->setDefault([ - // PHPDocumentor 1 - 'abstract', - 'access', - 'code', - 'deprec', - 'encode', - 'exception', - 'final', - 'ingroup', - 'inheritdoc', - 'inheritDoc', - 'magic', - 'name', - 'toc', - 'tutorial', - 'private', - 'static', - 'staticvar', - 'staticVar', - 'throw', - - // PHPDocumentor 2 - 'api', - 'author', - 'category', - 'copyright', - 'deprecated', - 'example', - 'filesource', - 'global', - 'ignore', - 'internal', - 'license', - 'link', - 'method', - 'package', - 'param', - 'property', - 'property-read', - 'property-write', - 'return', - 'see', - 'since', - 'source', - 'subpackage', - 'throws', - 'todo', - 'TODO', - 'usedBy', - 'uses', - 'var', - 'version', - - // PHPUnit - 'after', - 'afterClass', - 'backupGlobals', - 'backupStaticAttributes', - 'before', - 'beforeClass', - 'codeCoverageIgnore', - 'codeCoverageIgnoreStart', - 'codeCoverageIgnoreEnd', - 'covers', - 'coversDefaultClass', - 'coversNothing', - 'dataProvider', - 'depends', - 'expectedException', - 'expectedExceptionCode', - 'expectedExceptionMessage', - 'expectedExceptionMessageRegExp', - 'group', - 'large', - 'medium', - 'preserveGlobalState', - 'requires', - 'runTestsInSeparateProcesses', - 'runInSeparateProcess', - 'small', - 'test', - 'testdox', - 'ticket', - 'uses', - - // PHPCheckStyle - 'SuppressWarnings', - - // PHPStorm - 'noinspection', - - // PEAR - 'package_version', - - // PlantUML - 'enduml', - 'startuml', - - // other - 'fix', - 'FIXME', - 'fixme', - 'override', - ]) - ->getOption(), - ]); - } - - /** - * @param int $index - * - * @return bool - */ - private function nextElementAcceptsDoctrineAnnotations(PhpTokens $tokens, $index) - { - do { - $index = $tokens->getNextMeaningfulToken($index); - - if (null === $index) { - return false; - } - } while ($tokens[$index]->isGivenKind([T_ABSTRACT, T_FINAL])); - - if ($tokens[$index]->isClassy()) { - return true; - } - - while ($tokens[$index]->isGivenKind([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_FINAL, T_ABSTRACT])) { - $index = $tokens->getNextMeaningfulToken($index); - } - - return isset($this->classyElements[$index]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php deleted file mode 100644 index b8ae6dd..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php +++ /dev/null @@ -1,227 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\ConfigurationException\InvalidForEnvFixerConfigurationException; -use PhpCsFixer\ConfigurationException\RequiredFixerConfigurationException; -use PhpCsFixer\Console\Application; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\DefinedFixerInterface; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\DeprecatedFixerOption; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; -use PhpCsFixer\FixerConfiguration\InvalidOptionsForEnvException; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Exception\ExceptionInterface; -use Symfony\Component\OptionsResolver\Exception\MissingOptionsException; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -abstract class AbstractFixer implements FixerInterface, DefinedFixerInterface -{ - /** - * @var null|array - */ - protected $configuration; - - /** - * @var WhitespacesFixerConfig - */ - protected $whitespacesConfig; - - /** - * @var null|FixerConfigurationResolverInterface - */ - private $configurationDefinition; - - public function __construct() - { - if ($this instanceof ConfigurableFixerInterface) { - try { - $this->configure([]); - } catch (RequiredFixerConfigurationException $e) { - // ignore - } - } - - if ($this instanceof WhitespacesAwareFixerInterface) { - $this->whitespacesConfig = $this->getDefaultWhitespacesFixerConfig(); - } - } - - final public function fix(\SplFileInfo $file, Tokens $tokens) - { - if ($this instanceof ConfigurableFixerInterface && null === $this->configuration) { - throw new RequiredFixerConfigurationException($this->getName(), 'Configuration is required.'); - } - - if (0 < $tokens->count() && $this->isCandidate($tokens) && $this->supports($file)) { - $this->applyFix($file, $tokens); - } - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - $nameParts = explode('\\', static::class); - $name = substr(end($nameParts), 0, -\strlen('Fixer')); - - return Utils::camelCaseToUnderscore($name); - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function supports(\SplFileInfo $file) - { - return true; - } - - public function configure(array $configuration = null) - { - if (!$this instanceof ConfigurationDefinitionFixerInterface) { - throw new \LogicException('Cannot configure using Abstract parent, child not implementing "PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface".'); - } - - if (null === $configuration) { - $message = 'Passing NULL to set default configuration is deprecated and will not be supported in 3.0, use an empty array instead.'; - - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - throw new \InvalidArgumentException("{$message} This check was performed as `PHP_CS_FIXER_FUTURE_MODE` env var is set."); - } - - @trigger_error($message, E_USER_DEPRECATED); - - $configuration = []; - } - - foreach ($this->getConfigurationDefinition()->getOptions() as $option) { - if (!$option instanceof DeprecatedFixerOption) { - continue; - } - - $name = $option->getName(); - if (\array_key_exists($name, $configuration)) { - $message = sprintf( - 'Option "%s" for rule "%s" is deprecated and will be removed in version %d.0. %s', - $name, - $this->getName(), - Application::getMajorVersion() + 1, - str_replace('`', '"', $option->getDeprecationMessage()) - ); - - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - throw new \InvalidArgumentException("{$message} This check was performed as `PHP_CS_FIXER_FUTURE_MODE` env var is set."); - } - - @trigger_error($message, E_USER_DEPRECATED); - } - } - - try { - $this->configuration = $this->getConfigurationDefinition()->resolve($configuration); - } catch (MissingOptionsException $exception) { - throw new RequiredFixerConfigurationException( - $this->getName(), - sprintf('Missing required configuration: %s', $exception->getMessage()), - $exception - ); - } catch (InvalidOptionsForEnvException $exception) { - throw new InvalidForEnvFixerConfigurationException( - $this->getName(), - sprintf('Invalid configuration for env: %s', $exception->getMessage()), - $exception - ); - } catch (ExceptionInterface $exception) { - throw new InvalidFixerConfigurationException( - $this->getName(), - sprintf('Invalid configuration: %s', $exception->getMessage()), - $exception - ); - } - } - - /** - * {@inheritdoc} - */ - public function getConfigurationDefinition() - { - if (!$this instanceof ConfigurationDefinitionFixerInterface) { - throw new \LogicException('Cannot get configuration definition using Abstract parent, child not implementing "PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface".'); - } - - if (null === $this->configurationDefinition) { - $this->configurationDefinition = $this->createConfigurationDefinition(); - } - - return $this->configurationDefinition; - } - - public function setWhitespacesConfig(WhitespacesFixerConfig $config) - { - if (!$this instanceof WhitespacesAwareFixerInterface) { - throw new \LogicException('Cannot run method for class not implementing "PhpCsFixer\Fixer\WhitespacesAwareFixerInterface".'); - } - - $this->whitespacesConfig = $config; - } - - abstract protected function applyFix(\SplFileInfo $file, Tokens $tokens); - - /** - * @return FixerConfigurationResolverInterface - */ - protected function createConfigurationDefinition() - { - if (!$this instanceof ConfigurationDefinitionFixerInterface) { - throw new \LogicException('Cannot create configuration definition using Abstract parent, child not implementing "PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface".'); - } - - throw new \LogicException('Not implemented.'); - } - - private function getDefaultWhitespacesFixerConfig() - { - static $defaultWhitespacesFixerConfig = null; - - if (null === $defaultWhitespacesFixerConfig) { - $defaultWhitespacesFixerConfig = new WhitespacesFixerConfig(' ', "\n"); - } - - return $defaultWhitespacesFixerConfig; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractFopenFlagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractFopenFlagFixer.php deleted file mode 100644 index 363a76f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractFopenFlagFixer.php +++ /dev/null @@ -1,127 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - * - * @author SpacePossum - */ -abstract class AbstractFopenFlagFixer extends AbstractFunctionReferenceFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAllTokenKindsFound([T_STRING, T_CONSTANT_ENCAPSED_STRING]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - $index = 0; - $end = $tokens->count() - 1; - while (true) { - $candidate = $this->find('fopen', $tokens, $index, $end); - - if (null === $candidate) { - break; - } - - $index = $candidate[1]; // proceed to '(' of `fopen` - - // fetch arguments - $arguments = $argumentsAnalyzer->getArguments( - $tokens, - $index, - $candidate[2] - ); - - $argumentsCount = \count($arguments); // argument count sanity check - - if ($argumentsCount < 2 || $argumentsCount > 4) { - continue; - } - - $argumentStartIndex = array_keys($arguments)[1]; // get second argument index - - $this->fixFopenFlagToken( - $tokens, - $argumentStartIndex, - $arguments[$argumentStartIndex] - ); - } - } - - abstract protected function fixFopenFlagToken(Tokens $tokens, $argumentStartIndex, $argumentEndIndex); - - /** - * @param string $mode - * - * @return bool - */ - protected function isValidModeString($mode) - { - $modeLength = \strlen($mode); - if ($modeLength < 1 || $modeLength > 13) { // 13 === length 'r+w+a+x+c+etb' - return false; - } - - $validFlags = [ - 'a' => true, - 'b' => true, - 'c' => true, - 'e' => true, - 'r' => true, - 't' => true, - 'w' => true, - 'x' => true, - ]; - - if (!isset($validFlags[$mode[0]])) { - return false; - } - - unset($validFlags[$mode[0]]); - - for ($i = 1; $i < $modeLength; ++$i) { - if (isset($validFlags[$mode[$i]])) { - unset($validFlags[$mode[$i]]); - - continue; - } - - if ('+' !== $mode[$i] - || ( - 'a' !== $mode[$i - 1] // 'a+','c+','r+','w+','x+' - && 'c' !== $mode[$i - 1] - && 'r' !== $mode[$i - 1] - && 'w' !== $mode[$i - 1] - && 'x' !== $mode[$i - 1] - ) - ) { - return false; - } - } - - return true; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php deleted file mode 100644 index 430e810..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php +++ /dev/null @@ -1,67 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - * - * @author Vladimir Reznichenko - */ -abstract class AbstractFunctionReferenceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * Looks up Tokens sequence for suitable candidates and delivers boundaries information, - * which can be supplied by other methods in this abstract class. - * - * @param string $functionNameToSearch - * @param int $start - * @param null|int $end - * - * @return null|int[] returns $functionName, $openParenthesis, $closeParenthesis packed into array - */ - protected function find($functionNameToSearch, Tokens $tokens, $start = 0, $end = null) - { - // make interface consistent with findSequence - $end = null === $end ? $tokens->count() : $end; - - // find raw sequence which we can analyse for context - $candidateSequence = [[T_STRING, $functionNameToSearch], '(']; - $matches = $tokens->findSequence($candidateSequence, $start, $end, false); - if (null === $matches) { - // not found, simply return without further attempts - return null; - } - - // translate results for humans - list($functionName, $openParenthesis) = array_keys($matches); - - $functionsAnalyzer = new FunctionsAnalyzer(); - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $functionName)) { - return $this->find($functionNameToSearch, $tokens, $openParenthesis, $end); - } - - return [$functionName, $openParenthesis, $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openParenthesis)]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractLinesBeforeNamespaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractLinesBeforeNamespaceFixer.php deleted file mode 100644 index 2e0faab..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractLinesBeforeNamespaceFixer.php +++ /dev/null @@ -1,110 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * This abstract fixer is responsible for ensuring that a certain number of - * lines prefix a namespace declaration. - * - * @author Graham Campbell - * - * @internal - */ -abstract class AbstractLinesBeforeNamespaceFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * Make sure # of line breaks prefixing namespace is within given range. - * - * @param int $index - * @param int $expectedMin min. # of line breaks - * @param int $expectedMax max. # of line breaks - */ - protected function fixLinesBeforeNamespace(Tokens $tokens, $index, $expectedMin, $expectedMax) - { - // Let's determine the total numbers of new lines before the namespace - // and the opening token - $openingTokenIndex = null; - $precedingNewlines = 0; - $newlineInOpening = false; - $openingToken = null; - for ($i = 1; $i <= 2; ++$i) { - if (isset($tokens[$index - $i])) { - $token = $tokens[$index - $i]; - if ($token->isGivenKind(T_OPEN_TAG)) { - $openingToken = $token; - $openingTokenIndex = $index - $i; - $newlineInOpening = false !== strpos($token->getContent(), "\n"); - if ($newlineInOpening) { - ++$precedingNewlines; - } - - break; - } - if (false === $token->isGivenKind(T_WHITESPACE)) { - break; - } - $precedingNewlines += substr_count($token->getContent(), "\n"); - } - } - - if ($precedingNewlines >= $expectedMin && $precedingNewlines <= $expectedMax) { - return; - } - - $previousIndex = $index - 1; - $previous = $tokens[$previousIndex]; - - if (0 === $expectedMax) { - // Remove all the previous new lines - if ($previous->isWhitespace()) { - $tokens->clearAt($previousIndex); - } - // Remove new lines in opening token - if ($newlineInOpening) { - $tokens[$openingTokenIndex] = new Token([T_OPEN_TAG, rtrim($openingToken->getContent()).' ']); - } - - return; - } - - $lineEnding = $this->whitespacesConfig->getLineEnding(); - $newlinesForWhitespaceToken = $expectedMax; - if (null !== $openingToken) { - // Use the configured line ending for the PHP opening tag - $content = rtrim($openingToken->getContent()); - $newContent = $content.$lineEnding; - $tokens[$openingTokenIndex] = new Token([T_OPEN_TAG, $newContent]); - --$newlinesForWhitespaceToken; - } - if (0 === $newlinesForWhitespaceToken) { - // We have all the needed new lines in the opening tag - if ($previous->isWhitespace()) { - // Let's remove the previous token containing extra new lines - $tokens->clearAt($previousIndex); - } - - return; - } - if ($previous->isWhitespace()) { - // Fix the previous whitespace token - $tokens[$previousIndex] = new Token([T_WHITESPACE, str_repeat($lineEnding, $newlinesForWhitespaceToken).substr($previous->getContent(), strrpos($previous->getContent(), "\n") + 1)]); - } else { - // Add a new whitespace token - $tokens->insertAt($index, new Token([T_WHITESPACE, str_repeat($lineEnding, $newlinesForWhitespaceToken)])); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php deleted file mode 100644 index 947362b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php +++ /dev/null @@ -1,207 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -abstract class AbstractNoUselessElseFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getPriority() - { - // should be run before NoWhitespaceInBlankLineFixer, NoExtraBlankLinesFixer, BracesFixer and after NoEmptyStatementFixer. - return 25; - } - - /** - * @param int $index - * - * @return bool - */ - protected function isSuperfluousElse(Tokens $tokens, $index) - { - $previousBlockStart = $index; - do { - // Check if all 'if', 'else if ' and 'elseif' blocks above this 'else' always end, - // if so this 'else' is overcomplete. - list($previousBlockStart, $previousBlockEnd) = $this->getPreviousBlock($tokens, $previousBlockStart); - - // short 'if' detection - $previous = $previousBlockEnd; - if ($tokens[$previous]->equals('}')) { - $previous = $tokens->getPrevMeaningfulToken($previous); - } - - if ( - !$tokens[$previous]->equals(';') || // 'if' block doesn't end with semicolon, keep 'else' - $tokens[$tokens->getPrevMeaningfulToken($previous)]->equals('{') // empty 'if' block, keep 'else' - ) { - return false; - } - - $candidateIndex = $tokens->getPrevTokenOfKind( - $previous, - [ - ';', - [T_BREAK], - [T_CLOSE_TAG], - [T_CONTINUE], - [T_EXIT], - [T_GOTO], - [T_IF], - [T_RETURN], - [T_THROW], - ] - ); - - if ( - null === $candidateIndex - || $tokens[$candidateIndex]->equalsAny([';', [T_CLOSE_TAG], [T_IF]]) - || $this->isInConditional($tokens, $candidateIndex, $previousBlockStart) - || $this->isInConditionWithoutBraces($tokens, $candidateIndex, $previousBlockStart) - ) { - return false; - } - - // implicit continue, i.e. delete candidate - } while (!$tokens[$previousBlockStart]->isGivenKind(T_IF)); - - return true; - } - - /** - * Return the first and last token index of the previous block. - * - * [0] First is either T_IF, T_ELSE or T_ELSEIF - * [1] Last is either '}' or ';' / T_CLOSE_TAG for short notation blocks - * - * @param int $index T_IF, T_ELSE, T_ELSEIF - * - * @return int[] - */ - private function getPreviousBlock(Tokens $tokens, $index) - { - $close = $previous = $tokens->getPrevMeaningfulToken($index); - // short 'if' detection - if ($tokens[$close]->equals('}')) { - $previous = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $close); - } - - $open = $tokens->getPrevTokenOfKind($previous, [[T_IF], [T_ELSE], [T_ELSEIF]]); - if ($tokens[$open]->isGivenKind(T_IF)) { - $elseCandidate = $tokens->getPrevMeaningfulToken($open); - if ($tokens[$elseCandidate]->isGivenKind(T_ELSE)) { - $open = $elseCandidate; - } - } - - return [$open, $close]; - } - - /** - * @param int $index Index of the token to check - * @param int $lowerLimitIndex Lower limit index. Since the token to check will always be in a conditional we must stop checking at this index - * - * @return bool - */ - private function isInConditional(Tokens $tokens, $index, $lowerLimitIndex) - { - $candidateIndex = $tokens->getPrevTokenOfKind($index, [')', ';', ':']); - if ($tokens[$candidateIndex]->equals(':')) { - return true; - } - - if (!$tokens[$candidateIndex]->equals(')')) { - return false; // token is ';' or close tag - } - - // token is always ')' here. - // If it is part of the condition the token is always in, return false. - // If it is not it is a nested condition so return true - $open = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $candidateIndex); - - return $tokens->getPrevMeaningfulToken($open) > $lowerLimitIndex; - } - - /** - * For internal use only, as it is not perfect. - * - * Returns if the token at given index is part of a if/elseif/else statement - * without {}. Assumes not passing the last `;`/close tag of the statement, not - * out of range index, etc. - * - * @param int $index Index of the token to check - * @param int $lowerLimitIndex - * - * @return bool - */ - private function isInConditionWithoutBraces(Tokens $tokens, $index, $lowerLimitIndex) - { - do { - if ($tokens[$index]->isComment() || $tokens[$index]->isWhitespace()) { - $index = $tokens->getPrevMeaningfulToken($index); - } - - $token = $tokens[$index]; - if ($token->isGivenKind([T_IF, T_ELSEIF, T_ELSE])) { - return true; - } - - if ($token->equals(';')) { - return false; - } - if ($token->equals('{')) { - $index = $tokens->getPrevMeaningfulToken($index); - - // OK if belongs to: for, do, while, foreach - // Not OK if belongs to: if, else, elseif - if ($tokens[$index]->isGivenKind(T_DO)) { - --$index; - - continue; - } - - if (!$tokens[$index]->equals(')')) { - return false; // like `else {` - } - - $index = $tokens->findBlockStart( - Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $index - ); - - $index = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$index]->isGivenKind([T_IF, T_ELSEIF])) { - return false; - } - } elseif ($token->equals(')')) { - $type = Tokens::detectBlockType($token); - $index = $tokens->findBlockStart( - $type['type'], - $index - ); - - $index = $tokens->getPrevMeaningfulToken($index); - } else { - --$index; - } - } while ($index > $lowerLimitIndex); - - return false; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php deleted file mode 100644 index 5042105..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php +++ /dev/null @@ -1,135 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * This abstract fixer provides a base for fixers to fix types in PHPDoc. - * - * @author Graham Campbell - * - * @internal - */ -abstract class AbstractPhpdocTypesFixer extends AbstractFixer -{ - /** - * The annotation tags search inside. - * - * @var string[] - */ - protected $tags; - - /** - * {@inheritdoc} - */ - public function __construct() - { - parent::__construct(); - - $this->tags = Annotation::getTagsWithTypes(); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $annotations = $doc->getAnnotationsOfType($this->tags); - - if (empty($annotations)) { - continue; - } - - foreach ($annotations as $annotation) { - $this->fixTypes($annotation); - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - /** - * Actually normalize the given type. - * - * @param string $type - * - * @return string - */ - abstract protected function normalize($type); - - /** - * Fix the types at the given line. - * - * We must be super careful not to modify parts of words. - * - * This will be nicely handled behind the scenes for us by the annotation class. - */ - private function fixTypes(Annotation $annotation) - { - $types = $annotation->getTypes(); - - $new = $this->normalizeTypes($types); - - if ($types !== $new) { - $annotation->setTypes($new); - } - } - - /** - * @param string[] $types - * - * @return string[] - */ - private function normalizeTypes(array $types) - { - foreach ($types as $index => $type) { - $types[$index] = $this->normalizeType($type); - } - - return $types; - } - - /** - * Prepare the type and normalize it. - * - * @param string $type - * - * @return string - */ - private function normalizeType($type) - { - if ('[]' === substr($type, -2)) { - return $this->normalize(substr($type, 0, -2)).'[]'; - } - - return $this->normalize($type); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php deleted file mode 100644 index b173361..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php +++ /dev/null @@ -1,122 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -abstract class AbstractProxyFixer extends AbstractFixer -{ - /** - * @var array - */ - protected $proxyFixers; - - public function __construct() - { - foreach (Utils::sortFixers($this->createProxyFixers()) as $proxyFixer) { - $this->proxyFixers[$proxyFixer->getName()] = $proxyFixer; - } - - parent::__construct(); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - foreach ($this->proxyFixers as $fixer) { - if ($fixer->isCandidate($tokens)) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - foreach ($this->proxyFixers as $fixer) { - if ($fixer->isRisky()) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - if (\count($this->proxyFixers) > 1) { - throw new \LogicException('You need to override this method to provide the priority of combined fixers.'); - } - - return reset($this->proxyFixers)->getPriority(); - } - - /** - * {@inheritdoc} - */ - public function supports(\SplFileInfo $file) - { - foreach ($this->proxyFixers as $fixer) { - if ($fixer->supports($file)) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function setWhitespacesConfig(WhitespacesFixerConfig $config) - { - parent::setWhitespacesConfig($config); - - foreach ($this->proxyFixers as $fixer) { - if ($fixer instanceof WhitespacesAwareFixerInterface) { - $fixer->setWhitespacesConfig($config); - } - } - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($this->proxyFixers as $fixer) { - $fixer->fix($file, $tokens); - } - } - - /** - * @return FixerInterface[] - */ - abstract protected function createProxyFixers(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractPsrAutoloadingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractPsrAutoloadingFixer.php deleted file mode 100644 index 65f90ea..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractPsrAutoloadingFixer.php +++ /dev/null @@ -1,87 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jordi Boggiano - * @author Dariusz Rumiński - * @author Bram Gotink - * @author Graham Campbell - * - * @internal - */ -abstract class AbstractPsrAutoloadingFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - return -10; - } - - /** - * {@inheritdoc} - */ - public function supports(\SplFileInfo $file) - { - if ($file instanceof StdinFileInfo) { - return false; - } - - $filenameParts = explode('.', $file->getBasename(), 2); - - if ( - // ignore file with extension other than php - (!isset($filenameParts[1]) || 'php' !== $filenameParts[1]) - // ignore file with name that cannot be a class name - || 0 === Preg::match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $filenameParts[0]) - ) { - return false; - } - - try { - $tokens = Tokens::fromCode(sprintf('isKeyword() || $tokens[3]->isMagicConstant()) { - // name can not be a class name - detected by PHP 5.x - return false; - } - } catch (\ParseError $e) { - // name can not be a class name - detected by PHP 7.x - return false; - } - - // ignore stubs/fixtures, since they are typically containing invalid files for various reasons - return !Preg::match('{[/\\\\](stub|fixture)s?[/\\\\]}i', $file->getRealPath()); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php deleted file mode 100644 index a2e7aa7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php +++ /dev/null @@ -1,138 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -final class Cache implements CacheInterface -{ - /** - * @var SignatureInterface - */ - private $signature; - - /** - * @var array - */ - private $hashes = []; - - public function __construct(SignatureInterface $signature) - { - $this->signature = $signature; - } - - public function getSignature() - { - return $this->signature; - } - - public function has($file) - { - return \array_key_exists($file, $this->hashes); - } - - public function get($file) - { - if (!$this->has($file)) { - return null; - } - - return $this->hashes[$file]; - } - - public function set($file, $hash) - { - $this->hashes[$file] = $hash; - } - - public function clear($file) - { - unset($this->hashes[$file]); - } - - public function toJson() - { - $json = json_encode([ - 'php' => $this->getSignature()->getPhpVersion(), - 'version' => $this->getSignature()->getFixerVersion(), - 'indent' => $this->getSignature()->getIndent(), - 'lineEnding' => $this->getSignature()->getLineEnding(), - 'rules' => $this->getSignature()->getRules(), - 'hashes' => $this->hashes, - ]); - - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \UnexpectedValueException(sprintf( - 'Can not encode cache signature to JSON, error: "%s". If you have non-UTF8 chars in your signature, like in license for `header_comment`, consider enabling `ext-mbstring` or install `symfony/polyfill-mbstring`.', - json_last_error_msg() - )); - } - - return $json; - } - - /** - * @param string $json - * - * @throws \InvalidArgumentException - * - * @return Cache - */ - public static function fromJson($json) - { - $data = json_decode($json, true); - - if (null === $data && JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'Value needs to be a valid JSON string, got "%s", error: "%s".', - $json, - json_last_error_msg() - )); - } - - $requiredKeys = [ - 'php', - 'version', - 'indent', - 'lineEnding', - 'rules', - 'hashes', - ]; - - $missingKeys = array_diff_key(array_flip($requiredKeys), $data); - - if (\count($missingKeys)) { - throw new \InvalidArgumentException(sprintf( - 'JSON data is missing keys "%s"', - implode('", "', $missingKeys) - )); - } - - $signature = new Signature( - $data['php'], - $data['version'], - $data['indent'], - $data['lineEnding'], - $data['rules'] - ); - - $cache = new self($signature); - - $cache->hashes = $data['hashes']; - - return $cache; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheInterface.php deleted file mode 100644 index 693b0ee..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheInterface.php +++ /dev/null @@ -1,56 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -interface CacheInterface -{ - /** - * @return SignatureInterface - */ - public function getSignature(); - - /** - * @param string $file - * - * @return bool - */ - public function has($file); - - /** - * @param string $file - * - * @return null|int - */ - public function get($file); - - /** - * @param string $file - * @param int $hash - */ - public function set($file, $hash); - - /** - * @param string $file - */ - public function clear($file); - - /** - * @return string - */ - public function toJson(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php deleted file mode 100644 index daa8bbd..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php +++ /dev/null @@ -1,35 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Cache; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -interface CacheManagerInterface -{ - /** - * @param string $file - * @param string $fileContent - * - * @return bool - */ - public function needFixing($file, $fileContent); - - /** - * @param string $file - * @param string $fileContent - */ - public function setFile($file, $fileContent); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php deleted file mode 100644 index 8c4e771..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php +++ /dev/null @@ -1,53 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Cache; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class Directory implements DirectoryInterface -{ - /** - * @var string - */ - private $directoryName; - - /** - * @param string $directoryName - */ - public function __construct($directoryName) - { - $this->directoryName = $directoryName; - } - - public function getRelativePathTo($file) - { - $file = $this->normalizePath($file); - - if ( - '' === $this->directoryName - || 0 !== stripos($file, $this->directoryName.\DIRECTORY_SEPARATOR) - ) { - return $file; - } - - return substr($file, \strlen($this->directoryName) + 1); - } - - private function normalizePath($path) - { - return str_replace(['\\', '/'], \DIRECTORY_SEPARATOR, $path); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/DirectoryInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/DirectoryInterface.php deleted file mode 100644 index a22582e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/DirectoryInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Cache; - -/** - * @author Dariusz Rumiński - */ -interface DirectoryInterface -{ - /** - * @param string $file - * - * @return string - */ - public function getRelativePathTo($file); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php deleted file mode 100644 index 6d76a88..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php +++ /dev/null @@ -1,122 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Cache; - -/** - * Class supports caching information about state of fixing files. - * - * Cache is supported only for phar version and version installed via composer. - * - * File will be processed by PHP CS Fixer only if any of the following conditions is fulfilled: - * - cache is corrupt - * - fixer version changed - * - rules changed - * - file is new - * - file changed - * - * @author Dariusz Rumiński - * - * @internal - */ -final class FileCacheManager implements CacheManagerInterface -{ - /** - * @var FileHandlerInterface - */ - private $handler; - - /** - * @var SignatureInterface - */ - private $signature; - - /** - * @var CacheInterface - */ - private $cache; - - /** - * @var bool - */ - private $isDryRun; - - /** - * @var DirectoryInterface - */ - private $cacheDirectory; - - /** - * @param bool $isDryRun - */ - public function __construct( - FileHandlerInterface $handler, - SignatureInterface $signature, - $isDryRun = false, - DirectoryInterface $cacheDirectory = null - ) { - $this->handler = $handler; - $this->signature = $signature; - $this->isDryRun = $isDryRun; - $this->cacheDirectory = $cacheDirectory ?: new Directory(''); - - $this->readCache(); - } - - public function __destruct() - { - $this->writeCache(); - } - - public function needFixing($file, $fileContent) - { - $file = $this->cacheDirectory->getRelativePathTo($file); - - return !$this->cache->has($file) || $this->cache->get($file) !== $this->calcHash($fileContent); - } - - public function setFile($file, $fileContent) - { - $file = $this->cacheDirectory->getRelativePathTo($file); - - $hash = $this->calcHash($fileContent); - - if ($this->isDryRun && $this->cache->has($file) && $this->cache->get($file) !== $hash) { - $this->cache->clear($file); - - return; - } - - $this->cache->set($file, $hash); - } - - private function readCache() - { - $cache = $this->handler->read(); - - if (!$cache || !$this->signature->equals($cache->getSignature())) { - $cache = new Cache($this->signature); - } - - $this->cache = $cache; - } - - private function writeCache() - { - $this->handler->write($this->cache); - } - - private function calcHash($content) - { - return crc32($content); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php deleted file mode 100644 index e138a96..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php +++ /dev/null @@ -1,99 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Cache; - -use Symfony\Component\Filesystem\Exception\IOException; - -/** - * @author Andreas Möller - * - * @internal - */ -final class FileHandler implements FileHandlerInterface -{ - /** - * @var string - */ - private $file; - - /** - * @param string $file - */ - public function __construct($file) - { - $this->file = $file; - } - - public function getFile() - { - return $this->file; - } - - public function read() - { - if (!file_exists($this->file)) { - return null; - } - - $content = file_get_contents($this->file); - - try { - $cache = Cache::fromJson($content); - } catch (\InvalidArgumentException $exception) { - return null; - } - - return $cache; - } - - public function write(CacheInterface $cache) - { - $content = $cache->toJson(); - - if (file_exists($this->file)) { - if (is_dir($this->file)) { - throw new IOException( - sprintf('Cannot write cache file "%s" as the location exists as directory.', realpath($this->file)), - 0, - null, - $this->file - ); - } - - if (!is_writable($this->file)) { - throw new IOException( - sprintf('Cannot write to file "%s" as it is not writable.', realpath($this->file)), - 0, - null, - $this->file - ); - } - } else { - @touch($this->file); - @chmod($this->file, 0666); - } - - $bytesWritten = @file_put_contents($this->file, $content); - - if (false === $bytesWritten) { - $error = error_get_last(); - - throw new IOException( - sprintf('Failed to write file "%s", "%s".', $this->file, isset($error['message']) ? $error['message'] : 'no reason available'), - 0, - null, - $this->file - ); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandlerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandlerInterface.php deleted file mode 100644 index 29ff5c9..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandlerInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -interface FileHandlerInterface -{ - /** - * @return string - */ - public function getFile(); - - /** - * @return null|CacheInterface - */ - public function read(); - - public function write(CacheInterface $cache); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php deleted file mode 100644 index 74f3b62..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php +++ /dev/null @@ -1,30 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -final class NullCacheManager implements CacheManagerInterface -{ - public function needFixing($file, $fileContent) - { - return true; - } - - public function setFile($file, $fileContent) - { - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php deleted file mode 100644 index 1af7a3f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php +++ /dev/null @@ -1,110 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -final class Signature implements SignatureInterface -{ - /** - * @var string - */ - private $phpVersion; - - /** - * @var string - */ - private $fixerVersion; - - /** - * @var string - */ - private $indent; - - /** - * @var string - */ - private $lineEnding; - - /** - * @var array - */ - private $rules; - - /** - * @param string $phpVersion - * @param string $fixerVersion - * @param string $indent - * @param string $lineEnding - */ - public function __construct($phpVersion, $fixerVersion, $indent, $lineEnding, array $rules) - { - $this->phpVersion = $phpVersion; - $this->fixerVersion = $fixerVersion; - $this->indent = $indent; - $this->lineEnding = $lineEnding; - $this->rules = self::utf8Encode($rules); - } - - public function getPhpVersion() - { - return $this->phpVersion; - } - - public function getFixerVersion() - { - return $this->fixerVersion; - } - - public function getIndent() - { - return $this->indent; - } - - public function getLineEnding() - { - return $this->lineEnding; - } - - public function getRules() - { - return $this->rules; - } - - public function equals(SignatureInterface $signature) - { - return $this->phpVersion === $signature->getPhpVersion() - && $this->fixerVersion === $signature->getFixerVersion() - && $this->indent === $signature->getIndent() - && $this->lineEnding === $signature->getLineEnding() - && $this->rules === $signature->getRules(); - } - - private static function utf8Encode(array $data) - { - if (!\function_exists('mb_detect_encoding')) { - return $data; - } - - array_walk_recursive($data, static function (&$item) { - if (\is_string($item) && !mb_detect_encoding($item, 'utf-8', true)) { - $item = utf8_encode($item); - } - }); - - return $data; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/SignatureInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/SignatureInterface.php deleted file mode 100644 index 5a7131e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/SignatureInterface.php +++ /dev/null @@ -1,53 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -interface SignatureInterface -{ - /** - * @return string - */ - public function getPhpVersion(); - - /** - * @return string - */ - public function getFixerVersion(); - - /** - * @return string - */ - public function getIndent(); - - /** - * @return string - */ - public function getLineEnding(); - - /** - * @return array - */ - public function getRules(); - - /** - * @param SignatureInterface $signature - * - * @return bool - */ - public function equals(self $signature); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Config.php b/vendor/friendsofphp/php-cs-fixer/src/Config.php deleted file mode 100644 index 83d9a3e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Config.php +++ /dev/null @@ -1,280 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Fixer\FixerInterface; - -/** - * @author Fabien Potencier - * @author Katsuhiro Ogawa - * @author Dariusz Rumiński - */ -class Config implements ConfigInterface -{ - private $cacheFile = '.php_cs.cache'; - private $customFixers = []; - private $finder; - private $format = 'txt'; - private $hideProgress = false; - private $indent = ' '; - private $isRiskyAllowed = false; - private $lineEnding = "\n"; - private $name; - private $phpExecutable; - private $rules = ['@PSR2' => true]; - private $usingCache = true; - - public function __construct($name = 'default') - { - $this->name = $name; - } - - /** - * @return static - */ - public static function create() - { - return new static(); - } - - /** - * {@inheritdoc} - */ - public function getCacheFile() - { - return $this->cacheFile; - } - - /** - * {@inheritdoc} - */ - public function getCustomFixers() - { - return $this->customFixers; - } - - /** - * @return Finder - */ - public function getFinder() - { - if (null === $this->finder) { - $this->finder = new Finder(); - } - - return $this->finder; - } - - /** - * {@inheritdoc} - */ - public function getFormat() - { - return $this->format; - } - - /** - * {@inheritdoc} - */ - public function getHideProgress() - { - return $this->hideProgress; - } - - /** - * {@inheritdoc} - */ - public function getIndent() - { - return $this->indent; - } - - /** - * {@inheritdoc} - */ - public function getLineEnding() - { - return $this->lineEnding; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - /** - * {@inheritdoc} - */ - public function getPhpExecutable() - { - return $this->phpExecutable; - } - - /** - * {@inheritdoc} - */ - public function getRiskyAllowed() - { - return $this->isRiskyAllowed; - } - - /** - * {@inheritdoc} - */ - public function getRules() - { - return $this->rules; - } - - /** - * {@inheritdoc} - */ - public function getUsingCache() - { - return $this->usingCache; - } - - /** - * {@inheritdoc} - */ - public function registerCustomFixers($fixers) - { - if (false === \is_array($fixers) && false === $fixers instanceof \Traversable) { - throw new \InvalidArgumentException(sprintf( - 'Argument must be an array or a Traversable, got "%s".', - \is_object($fixers) ? \get_class($fixers) : \gettype($fixers) - )); - } - - foreach ($fixers as $fixer) { - $this->addCustomFixer($fixer); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setCacheFile($cacheFile) - { - $this->cacheFile = $cacheFile; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setFinder($finder) - { - if (false === \is_array($finder) && false === $finder instanceof \Traversable) { - throw new \InvalidArgumentException(sprintf( - 'Argument must be an array or a Traversable, got "%s".', - \is_object($finder) ? \get_class($finder) : \gettype($finder) - )); - } - - $this->finder = $finder; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setFormat($format) - { - $this->format = $format; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setHideProgress($hideProgress) - { - $this->hideProgress = $hideProgress; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setIndent($indent) - { - $this->indent = $indent; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setLineEnding($lineEnding) - { - $this->lineEnding = $lineEnding; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setPhpExecutable($phpExecutable) - { - $this->phpExecutable = $phpExecutable; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setRiskyAllowed($isRiskyAllowed) - { - $this->isRiskyAllowed = $isRiskyAllowed; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setRules(array $rules) - { - $this->rules = $rules; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setUsingCache($usingCache) - { - $this->usingCache = $usingCache; - - return $this; - } - - private function addCustomFixer(FixerInterface $fixer) - { - $this->customFixers[] = $fixer; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php b/vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php deleted file mode 100644 index 52f8354..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php +++ /dev/null @@ -1,194 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Fixer\FixerInterface; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - */ -interface ConfigInterface -{ - /** - * Returns the path to the cache file. - * - * @return null|string Returns null if not using cache - */ - public function getCacheFile(); - - /** - * Returns the custom fixers to use. - * - * @return FixerInterface[] - */ - public function getCustomFixers(); - - /** - * Returns files to scan. - * - * @return iterable|\Traversable - */ - public function getFinder(); - - /** - * @return string - */ - public function getFormat(); - - /** - * Returns true if progress should be hidden. - * - * @return bool - */ - public function getHideProgress(); - - /** - * @return string - */ - public function getIndent(); - - /** - * @return string - */ - public function getLineEnding(); - - /** - * Returns the name of the configuration. - * - * The name must be all lowercase and without any spaces. - * - * @return string The name of the configuration - */ - public function getName(); - - /** - * Get configured PHP executable, if any. - * - * @return null|string - */ - public function getPhpExecutable(); - - /** - * Check if it is allowed to run risky fixers. - * - * @return bool - */ - public function getRiskyAllowed(); - - /** - * Get rules. - * - * Keys of array are names of fixers/sets, values are true/false. - * - * @return array - */ - public function getRules(); - - /** - * Returns true if caching should be enabled. - * - * @return bool - */ - public function getUsingCache(); - - /** - * Adds a suite of custom fixers. - * - * Name of custom fixer should follow `VendorName/rule_name` convention. - * - * @param FixerInterface[]|iterable|\Traversable $fixers - */ - public function registerCustomFixers($fixers); - - /** - * Sets the path to the cache file. - * - * @param string $cacheFile - * - * @return self - */ - public function setCacheFile($cacheFile); - - /** - * @param iterable|string[]|\Traversable $finder - * - * @return self - */ - public function setFinder($finder); - - /** - * @param string $format - * - * @return self - */ - public function setFormat($format); - - /** - * @param bool $hideProgress - * - * @return self - */ - public function setHideProgress($hideProgress); - - /** - * @param string $indent - * - * @return self - */ - public function setIndent($indent); - - /** - * @param string $lineEnding - * - * @return self - */ - public function setLineEnding($lineEnding); - - /** - * Set PHP executable. - * - * @param null|string $phpExecutable - * - * @return self - */ - public function setPhpExecutable($phpExecutable); - - /** - * Set if it is allowed to run risky fixers. - * - * @param bool $isRiskyAllowed - * - * @return self - */ - public function setRiskyAllowed($isRiskyAllowed); - - /** - * Set rules. - * - * Keys of array are names of fixers or sets. - * Value for set must be bool (turn it on or off). - * Value for fixer may be bool (turn it on or off) or array of configuration - * (turn it on and contains configuration for FixerInterface::configure method). - * - * @return self - */ - public function setRules(array $rules); - - /** - * @param bool $usingCache - * - * @return self - */ - public function setUsingCache($usingCache); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidConfigurationException.php b/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidConfigurationException.php deleted file mode 100644 index 3c4e439..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidConfigurationException.php +++ /dev/null @@ -1,40 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\ConfigurationException; - -use PhpCsFixer\Console\Command\FixCommandExitStatusCalculator; - -/** - * Exceptions of this type are thrown on misconfiguration of the Fixer. - * - * @author SpacePossum - * - * @internal - * @final Only internal extending this class is supported - */ -class InvalidConfigurationException extends \InvalidArgumentException -{ - /** - * @param string $message - * @param null|int $code - * @param null|\Throwable $previous - */ - public function __construct($message, $code = null, $previous = null) - { - parent::__construct( - $message, - null === $code ? FixCommandExitStatusCalculator::EXIT_STATUS_FLAG_HAS_INVALID_CONFIG : $code, - $previous - ); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php b/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php deleted file mode 100644 index b5c3322..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php +++ /dev/null @@ -1,54 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\ConfigurationException; - -use PhpCsFixer\Console\Command\FixCommandExitStatusCalculator; - -/** - * Exception thrown by Fixers on misconfiguration. - * - * @author SpacePossum - * - * @internal - * @final Only internal extending this class is supported - */ -class InvalidFixerConfigurationException extends InvalidConfigurationException -{ - /** - * @var string - */ - private $fixerName; - - /** - * @param string $fixerName - * @param string $message - * @param null|\Throwable $previous - */ - public function __construct($fixerName, $message, $previous = null) - { - parent::__construct( - sprintf('[%s] %s', $fixerName, $message), - FixCommandExitStatusCalculator::EXIT_STATUS_FLAG_HAS_INVALID_FIXER_CONFIG, - $previous - ); - $this->fixerName = $fixerName; - } - - /** - * @return string - */ - public function getFixerName() - { - return $this->fixerName; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidForEnvFixerConfigurationException.php b/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidForEnvFixerConfigurationException.php deleted file mode 100644 index 5cb0efb..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidForEnvFixerConfigurationException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\ConfigurationException; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class InvalidForEnvFixerConfigurationException extends InvalidFixerConfigurationException -{ -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/RequiredFixerConfigurationException.php b/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/RequiredFixerConfigurationException.php deleted file mode 100644 index d7645db..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/RequiredFixerConfigurationException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\ConfigurationException; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class RequiredFixerConfigurationException extends InvalidFixerConfigurationException -{ -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Application.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Application.php deleted file mode 100644 index 697e94f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Application.php +++ /dev/null @@ -1,122 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console; - -use PhpCsFixer\Console\Command\DescribeCommand; -use PhpCsFixer\Console\Command\FixCommand; -use PhpCsFixer\Console\Command\HelpCommand; -use PhpCsFixer\Console\Command\ReadmeCommand; -use PhpCsFixer\Console\Command\SelfUpdateCommand; -use PhpCsFixer\Console\SelfUpdate\GithubClient; -use PhpCsFixer\Console\SelfUpdate\NewVersionChecker; -use PhpCsFixer\PharChecker; -use PhpCsFixer\ToolInfo; -use Symfony\Component\Console\Application as BaseApplication; -use Symfony\Component\Console\Command\ListCommand; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - * - * @internal - */ -final class Application extends BaseApplication -{ - const VERSION = '2.16.4'; - const VERSION_CODENAME = 'Yellow Bird'; - - /** - * @var ToolInfo - */ - private $toolInfo; - - public function __construct() - { - if (!getenv('PHP_CS_FIXER_FUTURE_MODE')) { - error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED); - } - - parent::__construct('PHP CS Fixer', self::VERSION); - - $this->toolInfo = new ToolInfo(); - - $this->add(new DescribeCommand()); - $this->add(new FixCommand($this->toolInfo)); - $this->add(new ReadmeCommand()); - $this->add(new SelfUpdateCommand( - new NewVersionChecker(new GithubClient()), - $this->toolInfo, - new PharChecker() - )); - } - - /** - * @return int - */ - public static function getMajorVersion() - { - return (int) explode('.', self::VERSION)[0]; - } - - /** - * {@inheritdoc} - */ - public function doRun(InputInterface $input, OutputInterface $output) - { - $stdErr = $output instanceof ConsoleOutputInterface - ? $output->getErrorOutput() - : ($input->hasParameterOption('--format', true) && 'txt' !== $input->getParameterOption('--format', null, true) ? null : $output) - ; - if (null !== $stdErr) { - $warningsDetector = new WarningsDetector($this->toolInfo); - $warningsDetector->detectOldVendor(); - $warningsDetector->detectOldMajor(); - foreach ($warningsDetector->getWarnings() as $warning) { - $stdErr->writeln(sprintf($stdErr->isDecorated() ? '%s' : '%s', $warning)); - } - } - - return parent::doRun($input, $output); - } - - /** - * {@inheritdoc} - */ - public function getLongVersion() - { - $version = sprintf( - '%s %s by Fabien Potencier and Dariusz Ruminski', - parent::getLongVersion(), - self::VERSION_CODENAME - ); - - $commit = '@git-commit@'; - - if ('@'.'git-commit@' !== $commit) { - $version .= ' ('.substr($commit, 0, 7).')'; - } - - return $version; - } - - /** - * {@inheritdoc} - */ - protected function getDefaultCommands() - { - return [new HelpCommand(), new ListCommand()]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php deleted file mode 100644 index cedba65..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php +++ /dev/null @@ -1,415 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\Command; - -use PhpCsFixer\Differ\DiffConsoleFormatter; -use PhpCsFixer\Differ\FullDiffer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\DefinedFixerInterface; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\FixerConfiguration\AliasedFixerOption; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\DeprecatedFixerOption; -use PhpCsFixer\FixerDefinition\CodeSampleInterface; -use PhpCsFixer\FixerDefinition\FileSpecificCodeSampleInterface; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSampleInterface; -use PhpCsFixer\FixerFactory; -use PhpCsFixer\Preg; -use PhpCsFixer\RuleSet; -use PhpCsFixer\StdinFileInfo; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Utils; -use PhpCsFixer\WordMatcher; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -final class DescribeCommand extends Command -{ - protected static $defaultName = 'describe'; - - /** - * @var string[] - */ - private $setNames; - - /** - * @var FixerFactory - */ - private $fixerFactory; - - /** - * @var array - */ - private $fixers; - - public function __construct(FixerFactory $fixerFactory = null) - { - parent::__construct(); - - if (null === $fixerFactory) { - $fixerFactory = new FixerFactory(); - $fixerFactory->registerBuiltInFixers(); - } - - $this->fixerFactory = $fixerFactory; - } - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this - ->setDefinition( - [ - new InputArgument('name', InputArgument::REQUIRED, 'Name of rule / set.'), - ] - ) - ->setDescription('Describe rule / ruleset.') - ; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $name = $input->getArgument('name'); - - try { - if ('@' === $name[0]) { - $this->describeSet($output, $name); - - return 0; - } - - $this->describeRule($output, $name); - } catch (DescribeNameNotFoundException $e) { - $matcher = new WordMatcher( - 'set' === $e->getType() ? $this->getSetNames() : array_keys($this->getFixers()) - ); - - $alternative = $matcher->match($name); - - $this->describeList($output, $e->getType()); - - throw new \InvalidArgumentException(sprintf( - '%s "%s" not found.%s', - ucfirst($e->getType()), - $name, - null === $alternative ? '' : ' Did you mean "'.$alternative.'"?' - )); - } - - return 0; - } - - /** - * @param string $name - */ - private function describeRule(OutputInterface $output, $name) - { - $fixers = $this->getFixers(); - - if (!isset($fixers[$name])) { - throw new DescribeNameNotFoundException($name, 'rule'); - } - - /** @var FixerInterface $fixer */ - $fixer = $fixers[$name]; - if ($fixer instanceof DefinedFixerInterface) { - $definition = $fixer->getDefinition(); - } else { - $definition = new FixerDefinition('Description is not available.', []); - } - - $description = $definition->getSummary(); - if ($fixer instanceof DeprecatedFixerInterface) { - $successors = $fixer->getSuccessorsNames(); - $message = [] === $successors - ? 'will be removed on next major version' - : sprintf('use %s instead', Utils::naturalLanguageJoinWithBackticks($successors)); - $message = Preg::replace('/(`.+?`)/', '$1', $message); - $description .= sprintf(' DEPRECATED: %s.', $message); - } - - $output->writeln(sprintf('Description of %s rule.', $name)); - if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) { - $output->writeln(sprintf('Fixer class: %s.', \get_class($fixer))); - } - - $output->writeln($description); - if ($definition->getDescription()) { - $output->writeln($definition->getDescription()); - } - $output->writeln(''); - - if ($fixer->isRisky()) { - $output->writeln('Fixer applying this rule is risky.'); - - if ($definition->getRiskyDescription()) { - $output->writeln($definition->getRiskyDescription()); - } - - $output->writeln(''); - } - - if ($fixer instanceof ConfigurationDefinitionFixerInterface) { - $configurationDefinition = $fixer->getConfigurationDefinition(); - $options = $configurationDefinition->getOptions(); - - $output->writeln(sprintf('Fixer is configurable using following option%s:', 1 === \count($options) ? '' : 's')); - - foreach ($options as $option) { - $line = '* '.OutputFormatter::escape($option->getName()).''; - - $allowed = HelpCommand::getDisplayableAllowedValues($option); - if (null !== $allowed) { - foreach ($allowed as &$value) { - if ($value instanceof AllowedValueSubset) { - $value = 'a subset of '.HelpCommand::toString($value->getAllowedValues()).''; - } else { - $value = ''.HelpCommand::toString($value).''; - } - } - } else { - $allowed = array_map( - static function ($type) { - return ''.$type.''; - }, - $option->getAllowedTypes() - ); - } - - if (null !== $allowed) { - $line .= ' ('.implode(', ', $allowed).')'; - } - - $description = Preg::replace('/(`.+?`)/', '$1', OutputFormatter::escape($option->getDescription())); - $line .= ': '.lcfirst(Preg::replace('/\.$/', '', $description)).'; '; - if ($option->hasDefault()) { - $line .= sprintf( - 'defaults to %s', - HelpCommand::toString($option->getDefault()) - ); - } else { - $line .= 'required'; - } - - if ($option instanceof DeprecatedFixerOption) { - $line .= '. DEPRECATED: '.Preg::replace( - '/(`.+?`)/', - '$1', - OutputFormatter::escape(lcfirst($option->getDeprecationMessage())) - ); - } - if ($option instanceof AliasedFixerOption) { - $line .= '; DEPRECATED alias: '.$option->getAlias().''; - } - - $output->writeln($line); - } - - $output->writeln(''); - } elseif ($fixer instanceof ConfigurableFixerInterface) { - $output->writeln('Fixer is configurable.'); - - if ($definition->getConfigurationDescription()) { - $output->writeln($definition->getConfigurationDescription()); - } - - if ($definition->getDefaultConfiguration()) { - $output->writeln(sprintf('Default configuration: %s.', HelpCommand::toString($definition->getDefaultConfiguration()))); - } - - $output->writeln(''); - } - - /** @var CodeSampleInterface[] $codeSamples */ - $codeSamples = array_filter($definition->getCodeSamples(), static function (CodeSampleInterface $codeSample) { - if ($codeSample instanceof VersionSpecificCodeSampleInterface) { - return $codeSample->isSuitableFor(\PHP_VERSION_ID); - } - - return true; - }); - - if (!\count($codeSamples)) { - $output->writeln([ - 'Fixing examples can not be demonstrated on the current PHP version.', - '', - ]); - } else { - $output->writeln('Fixing examples:'); - - $differ = new FullDiffer(); - $diffFormatter = new DiffConsoleFormatter( - $output->isDecorated(), - sprintf( - ' ---------- begin diff ----------%s%%s%s ----------- end diff -----------', - PHP_EOL, - PHP_EOL - ) - ); - - foreach ($codeSamples as $index => $codeSample) { - $old = $codeSample->getCode(); - $tokens = Tokens::fromCode($old); - - $configuration = $codeSample->getConfiguration(); - - if ($fixer instanceof ConfigurableFixerInterface) { - $fixer->configure(null === $configuration ? [] : $configuration); - } - - $file = $codeSample instanceof FileSpecificCodeSampleInterface - ? $codeSample->getSplFileInfo() - : new StdinFileInfo(); - - $fixer->fix($file, $tokens); - - $diff = $differ->diff($old, $tokens->generateCode()); - - if ($fixer instanceof ConfigurableFixerInterface) { - if (null === $configuration) { - $output->writeln(sprintf(' * Example #%d. Fixing with the default configuration.', $index + 1)); - } else { - $output->writeln(sprintf(' * Example #%d. Fixing with configuration: %s.', $index + 1, HelpCommand::toString($codeSample->getConfiguration()))); - } - } else { - $output->writeln(sprintf(' * Example #%d.', $index + 1)); - } - - $output->writeln($diffFormatter->format($diff, ' %s')); - $output->writeln(''); - } - } - } - - /** - * @param string $name - */ - private function describeSet(OutputInterface $output, $name) - { - if (!\in_array($name, $this->getSetNames(), true)) { - throw new DescribeNameNotFoundException($name, 'set'); - } - - $ruleSet = new RuleSet([$name => true]); - $rules = $ruleSet->getRules(); - ksort($rules); - - $fixers = $this->getFixers(); - - $output->writeln(sprintf('Description of %s set.', $name)); - $output->writeln(''); - - $help = ''; - - foreach ($rules as $rule => $config) { - $fixer = $fixers[$rule]; - - if (!$fixer instanceof DefinedFixerInterface) { - throw new \RuntimeException(sprintf( - 'Cannot describe rule %s, the fixer does not implement %s', - $rule, - DefinedFixerInterface::class - )); - } - - $definition = $fixer->getDefinition(); - $help .= sprintf( - " * %s%s\n | %s\n%s\n", - $rule, - $fixer->isRisky() ? ' risky' : '', - $definition->getSummary(), - true !== $config ? sprintf(" | Configuration: %s\n", HelpCommand::toString($config)) : '' - ); - } - - $output->write($help); - } - - /** - * @return array - */ - private function getFixers() - { - if (null !== $this->fixers) { - return $this->fixers; - } - - $fixers = []; - foreach ($this->fixerFactory->getFixers() as $fixer) { - $fixers[$fixer->getName()] = $fixer; - } - - $this->fixers = $fixers; - ksort($this->fixers); - - return $this->fixers; - } - - /** - * @return string[] - */ - private function getSetNames() - { - if (null !== $this->setNames) { - return $this->setNames; - } - - $set = new RuleSet(); - $this->setNames = $set->getSetDefinitionNames(); - sort($this->setNames); - - return $this->setNames; - } - - /** - * @param string $type 'rule'|'set' - */ - private function describeList(OutputInterface $output, $type) - { - if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE) { - $describe = [ - 'set' => $this->getSetNames(), - 'rules' => $this->getFixers(), - ]; - } elseif ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) { - $describe = 'set' === $type ? ['set' => $this->getSetNames()] : ['rules' => $this->getFixers()]; - } else { - return; - } - - /** @var string[] $items */ - foreach ($describe as $list => $items) { - $output->writeln(sprintf('Defined %s:', $list)); - foreach ($items as $name => $item) { - $output->writeln(sprintf('* %s', \is_string($name) ? $name : $item)); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeNameNotFoundException.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeNameNotFoundException.php deleted file mode 100644 index bfe5c0b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeNameNotFoundException.php +++ /dev/null @@ -1,59 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\Command; - -/** - * @author SpacePossum - * - * @internal - */ -final class DescribeNameNotFoundException extends \InvalidArgumentException -{ - /** - * @var string - */ - private $name; - - /** - * @var string 'rule'|'set' - */ - private $type; - - /** - * @param string $name - * @param string $type - */ - public function __construct($name, $type) - { - $this->name = $name; - $this->type = $type; - - parent::__construct(); - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * @return string - */ - public function getType() - { - return $this->type; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php deleted file mode 100644 index 5e56680..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php +++ /dev/null @@ -1,270 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\Command; - -use PhpCsFixer\Config; -use PhpCsFixer\ConfigInterface; -use PhpCsFixer\Console\ConfigurationResolver; -use PhpCsFixer\Console\Output\ErrorOutput; -use PhpCsFixer\Console\Output\NullOutput; -use PhpCsFixer\Console\Output\ProcessOutput; -use PhpCsFixer\Error\ErrorsManager; -use PhpCsFixer\Report\ReportSummary; -use PhpCsFixer\Runner\Runner; -use PhpCsFixer\ToolInfoInterface; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Terminal; -use Symfony\Component\EventDispatcher\EventDispatcher; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\Stopwatch\Stopwatch; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - * - * @internal - */ -final class FixCommand extends Command -{ - protected static $defaultName = 'fix'; - - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var ErrorsManager - */ - private $errorsManager; - - /** - * @var Stopwatch - */ - private $stopwatch; - - /** - * @var ConfigInterface - */ - private $defaultConfig; - - /** - * @var ToolInfoInterface - */ - private $toolInfo; - - public function __construct(ToolInfoInterface $toolInfo) - { - parent::__construct(); - - $this->defaultConfig = new Config(); - $this->errorsManager = new ErrorsManager(); - $this->eventDispatcher = new EventDispatcher(); - $this->stopwatch = new Stopwatch(); - $this->toolInfo = $toolInfo; - } - - /** - * {@inheritdoc} - * - * Override here to only generate the help copy when used. - */ - public function getHelp() - { - return HelpCommand::getHelpCopy(); - } - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this - ->setDefinition( - [ - new InputArgument('path', InputArgument::IS_ARRAY, 'The path.'), - new InputOption('path-mode', '', InputOption::VALUE_REQUIRED, 'Specify path mode (can be override or intersection).', 'override'), - new InputOption('allow-risky', '', InputOption::VALUE_REQUIRED, 'Are risky fixers allowed (can be yes or no).'), - new InputOption('config', '', InputOption::VALUE_REQUIRED, 'The path to a .php_cs file.'), - new InputOption('dry-run', '', InputOption::VALUE_NONE, 'Only shows which files would have been modified.'), - new InputOption('rules', '', InputOption::VALUE_REQUIRED, 'The rules.'), - new InputOption('using-cache', '', InputOption::VALUE_REQUIRED, 'Does cache should be used (can be yes or no).'), - new InputOption('cache-file', '', InputOption::VALUE_REQUIRED, 'The path to the cache file.'), - new InputOption('diff', '', InputOption::VALUE_NONE, 'Also produce diff for each file.'), - new InputOption('diff-format', '', InputOption::VALUE_REQUIRED, 'Specify diff format.'), - new InputOption('format', '', InputOption::VALUE_REQUIRED, 'To output results in other formats.'), - new InputOption('stop-on-violation', '', InputOption::VALUE_NONE, 'Stop execution on first violation.'), - new InputOption('show-progress', '', InputOption::VALUE_REQUIRED, 'Type of progress indicator (none, run-in, estimating, estimating-max or dots).'), - ] - ) - ->setDescription('Fixes a directory or a file.') - ; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $verbosity = $output->getVerbosity(); - - $passedConfig = $input->getOption('config'); - $passedRules = $input->getOption('rules'); - - $resolver = new ConfigurationResolver( - $this->defaultConfig, - [ - 'allow-risky' => $input->getOption('allow-risky'), - 'config' => $passedConfig, - 'dry-run' => $input->getOption('dry-run'), - 'rules' => $passedRules, - 'path' => $input->getArgument('path'), - 'path-mode' => $input->getOption('path-mode'), - 'using-cache' => $input->getOption('using-cache'), - 'cache-file' => $input->getOption('cache-file'), - 'format' => $input->getOption('format'), - 'diff' => $input->getOption('diff'), - 'diff-format' => $input->getOption('diff-format'), - 'stop-on-violation' => $input->getOption('stop-on-violation'), - 'verbosity' => $verbosity, - 'show-progress' => $input->getOption('show-progress'), - ], - getcwd(), - $this->toolInfo - ); - - $reporter = $resolver->getReporter(); - - $stdErr = $output instanceof ConsoleOutputInterface - ? $output->getErrorOutput() - : ('txt' === $reporter->getFormat() ? $output : null) - ; - - if (null !== $stdErr) { - if (null !== $passedConfig && null !== $passedRules) { - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - throw new \RuntimeException('Passing both `config` and `rules` options is not possible. This check was performed as `PHP_CS_FIXER_FUTURE_MODE` env var is set.'); - } - - $stdErr->writeln([ - sprintf($stdErr->isDecorated() ? '%s' : '%s', 'When passing both "--config" and "--rules" the rules within the configuration file are not used.'), - sprintf($stdErr->isDecorated() ? '%s' : '%s', 'Passing both options is deprecated; version v3.0 PHP-CS-Fixer will exit with a configuration error code.'), - ]); - } - - $configFile = $resolver->getConfigFile(); - $stdErr->writeln(sprintf('Loaded config %s%s.', $resolver->getConfig()->getName(), null === $configFile ? '' : ' from "'.$configFile.'"')); - - if ($resolver->getUsingCache()) { - $cacheFile = $resolver->getCacheFile(); - if (is_file($cacheFile)) { - $stdErr->writeln(sprintf('Using cache file "%s".', $cacheFile)); - } - } - } - - $progressType = $resolver->getProgress(); - $finder = $resolver->getFinder(); - - if (null !== $stdErr && $resolver->configFinderIsOverridden()) { - $stdErr->writeln( - sprintf($stdErr->isDecorated() ? '%s' : '%s', 'Paths from configuration file have been overridden by paths provided as command arguments.') - ); - } - - // @TODO 3.0 remove `run-in` and `estimating` - if ('none' === $progressType || null === $stdErr) { - $progressOutput = new NullOutput(); - } elseif ('run-in' === $progressType) { - $progressOutput = new ProcessOutput($stdErr, $this->eventDispatcher, null, null); - } else { - $finder = new \ArrayIterator(iterator_to_array($finder)); - $progressOutput = new ProcessOutput( - $stdErr, - $this->eventDispatcher, - 'estimating' !== $progressType ? (new Terminal())->getWidth() : null, - \count($finder) - ); - } - - $runner = new Runner( - $finder, - $resolver->getFixers(), - $resolver->getDiffer(), - 'none' !== $progressType ? $this->eventDispatcher : null, - $this->errorsManager, - $resolver->getLinter(), - $resolver->isDryRun(), - $resolver->getCacheManager(), - $resolver->getDirectory(), - $resolver->shouldStopOnViolation() - ); - - $this->stopwatch->start('fixFiles'); - $changed = $runner->fix(); - $this->stopwatch->stop('fixFiles'); - - $progressOutput->printLegend(); - - $fixEvent = $this->stopwatch->getEvent('fixFiles'); - - $reportSummary = new ReportSummary( - $changed, - $fixEvent->getDuration(), - $fixEvent->getMemory(), - OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity(), - $resolver->isDryRun(), - $output->isDecorated() - ); - - $output->isDecorated() - ? $output->write($reporter->generate($reportSummary)) - : $output->write($reporter->generate($reportSummary), false, OutputInterface::OUTPUT_RAW) - ; - - $invalidErrors = $this->errorsManager->getInvalidErrors(); - $exceptionErrors = $this->errorsManager->getExceptionErrors(); - $lintErrors = $this->errorsManager->getLintErrors(); - - if (null !== $stdErr) { - $errorOutput = new ErrorOutput($stdErr); - - if (\count($invalidErrors) > 0) { - $errorOutput->listErrors('linting before fixing', $invalidErrors); - } - - if (\count($exceptionErrors) > 0) { - $errorOutput->listErrors('fixing', $exceptionErrors); - } - - if (\count($lintErrors) > 0) { - $errorOutput->listErrors('linting after fixing', $lintErrors); - } - } - - $exitStatusCalculator = new FixCommandExitStatusCalculator(); - - return $exitStatusCalculator->calculate( - $resolver->isDryRun(), - \count($changed) > 0, - \count($invalidErrors) > 0, - \count($exceptionErrors) > 0, - \count($lintErrors) > 0 - ); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php deleted file mode 100644 index 732ddd9..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php +++ /dev/null @@ -1,58 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\Command; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FixCommandExitStatusCalculator -{ - // Exit status 1 is reserved for environment constraints not matched. - const EXIT_STATUS_FLAG_HAS_INVALID_FILES = 4; - const EXIT_STATUS_FLAG_HAS_CHANGED_FILES = 8; - const EXIT_STATUS_FLAG_HAS_INVALID_CONFIG = 16; - const EXIT_STATUS_FLAG_HAS_INVALID_FIXER_CONFIG = 32; - const EXIT_STATUS_FLAG_EXCEPTION_IN_APP = 64; - - /** - * @param bool $isDryRun - * @param bool $hasChangedFiles - * @param bool $hasInvalidErrors - * @param bool $hasExceptionErrors - * @param bool $hasLintErrorsAfterFixing - * - * @return int - */ - public function calculate($isDryRun, $hasChangedFiles, $hasInvalidErrors, $hasExceptionErrors, $hasLintErrorsAfterFixing) - { - $exitStatus = 0; - - if ($isDryRun) { - if ($hasChangedFiles) { - $exitStatus |= self::EXIT_STATUS_FLAG_HAS_CHANGED_FILES; - } - - if ($hasInvalidErrors) { - $exitStatus |= self::EXIT_STATUS_FLAG_HAS_INVALID_FILES; - } - } - - if ($hasExceptionErrors || $hasLintErrorsAfterFixing) { - $exitStatus |= self::EXIT_STATUS_FLAG_EXCEPTION_IN_APP; - } - - return $exitStatus; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/HelpCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/HelpCommand.php deleted file mode 100644 index ac0d836..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/HelpCommand.php +++ /dev/null @@ -1,637 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\Command; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Console\Application; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\FixerConfiguration\AliasedFixerOption; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\DeprecatedFixerOption; -use PhpCsFixer\FixerConfiguration\FixerOptionInterface; -use PhpCsFixer\FixerFactory; -use PhpCsFixer\Preg; -use PhpCsFixer\RuleSet; -use PhpCsFixer\Utils; -use Symfony\Component\Console\Command\HelpCommand as BaseHelpCommand; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\OutputFormatterStyle; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -final class HelpCommand extends BaseHelpCommand -{ - protected static $defaultName = 'help'; - - /** - * Returns help-copy suitable for console output. - * - * @return string - */ - public static function getHelpCopy() - { - $template = - <<<'EOF' -The %command.name% command tries to fix as much coding standards -problems as possible on a given file or files in a given directory and its subdirectories: - - $ php %command.full_name% /path/to/dir - $ php %command.full_name% /path/to/file - -By default --path-mode is set to ``override``, which means, that if you specify the path to a file or a directory via -command arguments, then the paths provided to a ``Finder`` in config file will be ignored. You can use --path-mode=intersection -to merge paths from the config file and from the argument: - - $ php %command.full_name% --path-mode=intersection /path/to/dir - -The --format option for the output format. Supported formats are ``txt`` (default one), ``json``, ``xml``, ``checkstyle``, ``junit`` and ``gitlab``. - -NOTE: the output for the following formats are generated in accordance with XML schemas - -* ``junit`` follows the `JUnit xml schema from Jenkins `_ -* ``checkstyle`` follows the common `"checkstyle" xml schema `_ - -The --quiet Do not output any message. - -The --verbose option will show the applied rules. When using the ``txt`` format it will also display progress notifications. - -NOTE: if there is an error like "errors reported during linting after fixing", you can use this to be even more verbose for debugging purpose - -* ``--verbose=0`` or no option: normal -* ``--verbose``, ``--verbose=1``, ``-v``: verbose -* ``--verbose=2``, ``-vv``: very verbose -* ``--verbose=3``, ``-vvv``: debug - -The --rules option limits the rules to apply to the -project: - - $ php %command.full_name% /path/to/project --rules=@PSR2 - -By default the PSR1 and PSR2 rules are used. - -The --rules option lets you choose the exact rules to -apply (the rule names must be separated by a comma): - - $ php %command.full_name% /path/to/dir --rules=line_ending,full_opening_tag,indentation_type - -You can also exclude the rules you don't want by placing a dash in front of the rule name, if this is more convenient, -using -name_of_fixer: - - $ php %command.full_name% /path/to/dir --rules=-full_opening_tag,-indentation_type - -When using combinations of exact and exclude rules, applying exact rules along with above excluded results: - - $ php %command.full_name% /path/to/project --rules=@Symfony,-@PSR1,-blank_line_before_statement,strict_comparison - -Complete configuration for rules can be supplied using a ``json`` formatted string. - - $ php %command.full_name% /path/to/project --rules='{"concat_space": {"spacing": "none"}}' - -The --dry-run flag will run the fixer without making changes to your files. - -The --diff flag can be used to let the fixer output all the changes it makes. - -The --diff-format option allows to specify in which format the fixer should output the changes it makes: - -* udiff: unified diff format; -* sbd: Sebastianbergmann/diff format (default when using `--diff` without specifying `diff-format`). - -The --allow-risky option (pass ``yes`` or ``no``) allows you to set whether risky rules may run. Default value is taken from config file. -A rule is considered risky if it could change code behaviour. By default no risky rules are run. - -The --stop-on-violation flag stops the execution upon first file that needs to be fixed. - -The --show-progress option allows you to choose the way process progress is rendered: - -* none: disables progress output; -* run-in: [deprecated] simple single-line progress output; -* estimating: [deprecated] multiline progress output with number of files and percentage on each line. Note that with this option, the files list is evaluated before processing to get the total number of files and then kept in memory to avoid using the file iterator twice. This has an impact on memory usage so using this option is not recommended on very large projects; -* estimating-max: [deprecated] same as dots; -* dots: same as estimating but using all terminal columns instead of default 80. - -If the option is not provided, it defaults to run-in unless a config file that disables output is used, in which case it defaults to none. This option has no effect if the verbosity of the command is less than verbose. - - $ php %command.full_name% --verbose --show-progress=estimating - -The command can also read from standard input, in which case it won't -automatically fix anything: - - $ cat foo.php | php %command.full_name% --diff - - -Finally, if you don't need BC kept on CLI level, you might use `PHP_CS_FIXER_FUTURE_MODE` to start using options that -would be default in next MAJOR release (unified differ, estimating, full-width progress indicator): - - $ PHP_CS_FIXER_FUTURE_MODE=1 php %command.full_name% -v --diff - -Rules ------ - -Use the following command to quickly understand what a rule will do to your code: - - $ php php-cs-fixer.phar describe align_multiline_comment - -To visualize all the rules that belong to a ruleset: - - $ php php-cs-fixer.phar describe @PSR2 - -Choose from the list of available rules: - -%%%FIXERS_DETAILS%%% - -The --dry-run option displays the files that need to be -fixed but without actually modifying them: - - $ php %command.full_name% /path/to/code --dry-run - -Config file ------------ - -Instead of using command line options to customize the rule, you can save the -project configuration in a .php_cs.dist file in the root directory of your project. -The file must return an instance of `PhpCsFixer\ConfigInterface` (%%%CONFIG_INTERFACE_URL%%%) -which lets you configure the rules, the files and directories that -need to be analyzed. You may also create .php_cs file, which is -the local configuration that will be used instead of the project configuration. It -is a good practice to add that file into your .gitignore file. -With the --config option you can specify the path to the -.php_cs file. - -The example below will add two rules to the default list of PSR2 set rules: - - exclude('somedir') - ->notPath('src/Symfony/Component/Translation/Tests/fixtures/resources.php') - ->in(__DIR__) - ; - - return PhpCsFixer\Config::create() - ->setRules([ - '@PSR2' => true, - 'strict_param' => true, - 'array_syntax' => ['syntax' => 'short'], - ]) - ->setFinder($finder) - ; - - ?> - -**NOTE**: ``exclude`` will work only for directories, so if you need to exclude file, try ``notPath``. -Both ``exclude`` and ``notPath`` methods accept only relative paths to the ones defined with the ``in`` method. - -See `Symfony\Finder` (https://symfony.com/doc/current/components/finder.html) -online documentation for other `Finder` methods. - -You may also use an exclude list for the rules instead of the above shown include approach. -The following example shows how to use all ``Symfony`` rules but the ``full_opening_tag`` rule. - - exclude('somedir') - ->in(__DIR__) - ; - - return PhpCsFixer\Config::create() - ->setRules([ - '@Symfony' => true, - 'full_opening_tag' => false, - ]) - ->setFinder($finder) - ; - - ?> - -You may want to use non-linux whitespaces in your project. Then you need to -configure them in your config file. - - setIndent("\t") - ->setLineEnding("\r\n") - ; - - ?> - -By using ``--using-cache`` option with ``yes`` or ``no`` you can set if the caching -mechanism should be used. - -Caching -------- - -The caching mechanism is enabled by default. This will speed up further runs by -fixing only files that were modified since the last run. The tool will fix all -files if the tool version has changed or the list of rules has changed. -Cache is supported only for tool downloaded as phar file or installed via -composer. - -Cache can be disabled via ``--using-cache`` option or config file: - - setUsingCache(false) - ; - - ?> - -Cache file can be specified via ``--cache-file`` option or config file: - - setCacheFile(__DIR__.'/.php_cs.cache') - ; - - ?> - -Using PHP CS Fixer on CI ------------------------- - -Require ``friendsofphp/php-cs-fixer`` as a ``dev`` dependency: - - $ ./composer.phar require --dev friendsofphp/php-cs-fixer - -Then, add the following command to your CI: - -%%%CI_INTEGRATION%%% - -Where ``$COMMIT_RANGE`` is your range of commits, e.g. ``$TRAVIS_COMMIT_RANGE`` or ``HEAD~..HEAD``. - -Exit code ---------- - -Exit code is built using following bit flags: - -* 0 - OK. -* 1 - General error (or PHP minimal requirement not matched). -* 4 - Some files have invalid syntax (only in dry-run mode). -* 8 - Some files need fixing (only in dry-run mode). -* 16 - Configuration error of the application. -* 32 - Configuration error of a Fixer. -* 64 - Exception raised within the application. - -(Applies to exit code of the ``fix`` command only) -EOF - ; - - return strtr($template, [ - '%%%CONFIG_INTERFACE_URL%%%' => sprintf( - 'https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/v%s/src/ConfigInterface.php', - self::getLatestReleaseVersionFromChangeLog() - ), - '%%%CI_INTEGRATION%%%' => implode("\n", array_map( - static function ($line) { return ' $ '.$line; }, - \array_slice(file(__DIR__.'/../../../ci-integration.sh', FILE_IGNORE_NEW_LINES), 3) - )), - '%%%FIXERS_DETAILS%%%' => self::getFixersHelp(), - ]); - } - - /** - * @param mixed $value - * - * @return string - */ - public static function toString($value) - { - if (\is_array($value)) { - // Output modifications: - // - remove new-lines - // - combine multiple whitespaces - // - switch array-syntax to short array-syntax - // - remove whitespace at array opening - // - remove trailing array comma and whitespace at array closing - // - remove numeric array indexes - static $replaces = [ - ['#\r|\n#', '#\s{1,}#', '#array\s*\((.*)\)#s', '#\[\s+#', '#,\s*\]#', '#\d+\s*=>\s*#'], - ['', ' ', '[$1]', '[', ']', ''], - ]; - - $str = var_export($value, true); - do { - $strNew = Preg::replace( - $replaces[0], - $replaces[1], - $str - ); - - if ($strNew === $str) { - break; - } - - $str = $strNew; - } while (true); - } else { - $str = var_export($value, true); - } - - return Preg::replace('/\bNULL\b/', 'null', $str); - } - - /** - * Returns the allowed values of the given option that can be converted to a string. - * - * @return null|array - */ - public static function getDisplayableAllowedValues(FixerOptionInterface $option) - { - $allowed = $option->getAllowedValues(); - - if (null !== $allowed) { - $allowed = array_filter($allowed, static function ($value) { - return !($value instanceof \Closure); - }); - - usort($allowed, static function ($valueA, $valueB) { - if ($valueA instanceof AllowedValueSubset) { - return -1; - } - - if ($valueB instanceof AllowedValueSubset) { - return 1; - } - - return strcasecmp( - self::toString($valueA), - self::toString($valueB) - ); - }); - - if (0 === \count($allowed)) { - $allowed = null; - } - } - - return $allowed; - } - - /** - * @throws \RuntimeException when failing to parse the change log file - * - * @return string - */ - public static function getLatestReleaseVersionFromChangeLog() - { - static $version = null; - - if (null !== $version) { - return $version; - } - - $changelogFile = self::getChangeLogFile(); - if (null === $changelogFile) { - $version = Application::VERSION; - - return $version; - } - - $changelog = @file_get_contents($changelogFile); - if (false === $changelog) { - $error = error_get_last(); - - throw new \RuntimeException(sprintf( - 'Failed to read content of the changelog file "%s".%s', - $changelogFile, - $error ? ' '.$error['message'] : '' - )); - } - - for ($i = Application::getMajorVersion(); $i > 0; --$i) { - if (1 === Preg::match('/Changelog for v('.$i.'.\d+.\d+)/', $changelog, $matches)) { - $version = $matches[1]; - - break; - } - } - - if (null === $version) { - throw new \RuntimeException(sprintf('Failed to parse changelog data of "%s".', $changelogFile)); - } - - return $version; - } - - /** - * {@inheritdoc} - */ - protected function initialize(InputInterface $input, OutputInterface $output) - { - $output->getFormatter()->setStyle('url', new OutputFormatterStyle('blue')); - } - - /** - * @return null|string - */ - private static function getChangeLogFile() - { - $changelogFile = __DIR__.'/../../../CHANGELOG.md'; - - return is_file($changelogFile) ? $changelogFile : null; - } - - /** - * @return string - */ - private static function getFixersHelp() - { - $help = ''; - $fixerFactory = new FixerFactory(); - /** @var AbstractFixer[] $fixers */ - $fixers = $fixerFactory->registerBuiltInFixers()->getFixers(); - - // sort fixers by name - usort( - $fixers, - static function (FixerInterface $a, FixerInterface $b) { - return strcmp($a->getName(), $b->getName()); - } - ); - - $ruleSets = []; - foreach (RuleSet::create()->getSetDefinitionNames() as $setName) { - $ruleSets[$setName] = new RuleSet([$setName => true]); - } - - $getSetsWithRule = static function ($rule) use ($ruleSets) { - $sets = []; - - foreach ($ruleSets as $setName => $ruleSet) { - if ($ruleSet->hasRule($rule)) { - $sets[] = $setName; - } - } - - return $sets; - }; - - $count = \count($fixers) - 1; - foreach ($fixers as $i => $fixer) { - $sets = $getSetsWithRule($fixer->getName()); - - $description = $fixer->getDefinition()->getSummary(); - - if ($fixer instanceof DeprecatedFixerInterface) { - $successors = $fixer->getSuccessorsNames(); - $message = [] === $successors - ? 'will be removed on next major version' - : sprintf('use %s instead', Utils::naturalLanguageJoinWithBackticks($successors)); - $description .= sprintf(' DEPRECATED: %s.', $message); - } - - $description = implode("\n | ", self::wordwrap( - Preg::replace('/(`.+?`)/', '$1', $description), - 72 - )); - - if (!empty($sets)) { - $help .= sprintf(" * %s [%s]\n | %s\n", $fixer->getName(), implode(', ', $sets), $description); - } else { - $help .= sprintf(" * %s\n | %s\n", $fixer->getName(), $description); - } - - if ($fixer->isRisky()) { - $help .= sprintf( - " | *Risky rule: %s.*\n", - Preg::replace( - '/(`.+?`)/', - '$1', - lcfirst(Preg::replace('/\.$/', '', $fixer->getDefinition()->getRiskyDescription())) - ) - ); - } - - if ($fixer instanceof ConfigurationDefinitionFixerInterface) { - $configurationDefinition = $fixer->getConfigurationDefinition(); - $configurationDefinitionOptions = $configurationDefinition->getOptions(); - if (\count($configurationDefinitionOptions)) { - $help .= " |\n | Configuration options:\n"; - - usort( - $configurationDefinitionOptions, - static function (FixerOptionInterface $optionA, FixerOptionInterface $optionB) { - return strcmp($optionA->getName(), $optionB->getName()); - } - ); - - foreach ($configurationDefinitionOptions as $option) { - $line = ''.OutputFormatter::escape($option->getName()).''; - - $allowed = self::getDisplayableAllowedValues($option); - if (null !== $allowed) { - foreach ($allowed as &$value) { - if ($value instanceof AllowedValueSubset) { - $value = 'a subset of '.self::toString($value->getAllowedValues()).''; - } else { - $value = ''.self::toString($value).''; - } - } - } else { - $allowed = array_map( - static function ($type) { - return ''.$type.''; - }, - $option->getAllowedTypes() - ); - } - - if (null !== $allowed) { - $line .= ' ('.implode(', ', $allowed).')'; - } - - $line .= ': '.Preg::replace( - '/(`.+?`)/', - '$1', - lcfirst(Preg::replace('/\.$/', '', OutputFormatter::escape($option->getDescription()))) - ).'; '; - if ($option->hasDefault()) { - $line .= 'defaults to '.self::toString($option->getDefault()).''; - } else { - $line .= 'required'; - } - - if ($option instanceof DeprecatedFixerOption) { - $line .= '. DEPRECATED: '.Preg::replace( - '/(`.+?`)/', - '$1', - lcfirst(Preg::replace('/\.$/', '', OutputFormatter::escape($option->getDeprecationMessage()))) - ); - } - - if ($option instanceof AliasedFixerOption) { - $line .= '; DEPRECATED alias: '.$option->getAlias().''; - } - - foreach (self::wordwrap($line, 72) as $index => $line) { - $help .= (0 === $index ? ' | - ' : ' | ').$line."\n"; - } - } - } - } elseif ($fixer instanceof ConfigurableFixerInterface) { - $help .= " | *Configurable rule.*\n"; - } - - if ($count !== $i) { - $help .= "\n"; - } - } - - // prevent "\" from being rendered as an escaped literal style tag - return Preg::replace('#\\\\()#', '<<$1', $help); - } - - /** - * Wraps a string to the given number of characters, ignoring style tags. - * - * @param string $string - * @param int $width - * - * @return string[] - */ - private static function wordwrap($string, $width) - { - $result = []; - $currentLine = 0; - $lineLength = 0; - foreach (explode(' ', $string) as $word) { - $wordLength = \strlen(Preg::replace('~~', '', $word)); - if (0 !== $lineLength) { - ++$wordLength; // space before word - } - - if ($lineLength + $wordLength > $width) { - ++$currentLine; - $lineLength = 0; - } - - $result[$currentLine][] = $word; - $lineLength += $wordLength; - } - - return array_map(static function ($line) { - return implode(' ', $line); - }, $result); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ReadmeCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ReadmeCommand.php deleted file mode 100644 index 1c8ae66..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ReadmeCommand.php +++ /dev/null @@ -1,279 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\Command; - -use PhpCsFixer\Preg; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - * - * @internal - */ -final class ReadmeCommand extends Command -{ - protected static $defaultName = 'readme'; - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->setDescription('Generates the README content, based on the fix command help.'); - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $header = <<header('PHP Coding Standards Fixer', '=')} - -The PHP Coding Standards Fixer (PHP CS Fixer) tool fixes your code to follow standards; -whether you want to follow PHP coding standards as defined in the PSR-1, PSR-2, etc., -or other community driven ones like the Symfony one. -You can **also** define your (team's) style through configuration. - -It can modernize your code (like converting the ``pow`` function to the ``**`` operator on PHP 5.6) -and (micro) optimize it. - -If you are already using a linter to identify coding standards problems in your -code, you know that fixing them by hand is tedious, especially on large -projects. This tool does not only detect them, but also fixes them for you. - -The PHP CS Fixer is maintained on GitHub at https://github.com/FriendsOfPHP/PHP-CS-Fixer. -Bug reports and ideas about new features are welcome there. - -You can talk to us at https://gitter.im/PHP-CS-Fixer/Lobby about the project, -configuration, possible improvements, ideas and questions, please visit us! - -{$this->header('Requirements', '-')} - -PHP needs to be a minimum version of PHP 5.6.0. - -{$this->header('Installation', '-')} - -{$this->header('Locally', '~')} - -Download the `php-cs-fixer.phar`_ file and store it somewhere on your computer. - -{$this->header('Globally (manual)', '~')} - -You can run these commands to easily access latest ``php-cs-fixer`` from anywhere on -your system: - -.. code-block:: bash - - $ wget %download.url% -O php-cs-fixer - -or with specified version: - -.. code-block:: bash - - $ wget %download.version_url% -O php-cs-fixer - -or with curl: - -.. code-block:: bash - - $ curl -L %download.url% -o php-cs-fixer - -then: - -.. code-block:: bash - - $ sudo chmod a+x php-cs-fixer - $ sudo mv php-cs-fixer /usr/local/bin/php-cs-fixer - -Then, just run ``php-cs-fixer``. - -{$this->header('Globally (Composer)', '~')} - -To install PHP CS Fixer, `install Composer `_ and issue the following command: - -.. code-block:: bash - - $ composer global require friendsofphp/php-cs-fixer - -Then make sure you have the global Composer binaries directory in your ``PATH``. This directory is platform-dependent, see `Composer documentation `_ for details. Example for some Unix systems: - -.. code-block:: bash - - $ export PATH="\$PATH:\$HOME/.composer/vendor/bin" - -{$this->header('Globally (homebrew)', '~')} - -.. code-block:: bash - - $ brew install php-cs-fixer - -{$this->header('Locally (PHIVE)', '~')} - -Install `PHIVE `_ and issue the following command: - -.. code-block:: bash - - $ phive install php-cs-fixer # use `--global` for global install - -{$this->header('Update', '-')} - -{$this->header('Locally', '~')} - -The ``self-update`` command tries to update ``php-cs-fixer`` itself: - -.. code-block:: bash - - $ php php-cs-fixer.phar self-update - -{$this->header('Globally (manual)', '~')} - -You can update ``php-cs-fixer`` through this command: - -.. code-block:: bash - - $ sudo php-cs-fixer self-update - -{$this->header('Globally (Composer)', '~')} - -You can update ``php-cs-fixer`` through this command: - -.. code-block:: bash - - $ ./composer.phar global update friendsofphp/php-cs-fixer - -{$this->header('Globally (homebrew)', '~')} - -You can update ``php-cs-fixer`` through this command: - -.. code-block:: bash - - $ brew upgrade php-cs-fixer - -{$this->header('Locally (PHIVE)', '~')} - -.. code-block:: bash - - $ phive update php-cs-fixer - -{$this->header('Usage', '-')} - -EOF; - - $footer = <<header('Helpers', '-')} - -Dedicated plugins exist for: - -* `Atom`_ -* `NetBeans`_ -* `PhpStorm`_ -* `Sublime Text`_ -* `Vim`_ -* `VS Code`_ - -{$this->header('Contribute', '-')} - -The tool comes with quite a few built-in fixers, but everyone is more than -welcome to `contribute`_ more of them. - -{$this->header('Fixers', '~')} - -A *fixer* is a class that tries to fix one CS issue (a ``Fixer`` class must -implement ``FixerInterface``). - -{$this->header('Configs', '~')} - -A *config* knows about the CS rules and the files and directories that must be -scanned by the tool when run in the directory of your project. It is useful for -projects that follow a well-known directory structures (like for Symfony -projects for instance). - -.. _php-cs-fixer.phar: %download.url% -.. _Atom: https://github.com/Glavin001/atom-beautify -.. _NetBeans: http://plugins.netbeans.org/plugin/49042/php-cs-fixer -.. _PhpStorm: https://medium.com/@valeryan/how-to-configure-phpstorm-to-use-php-cs-fixer-1844991e521f -.. _Sublime Text: https://github.com/benmatselby/sublime-phpcs -.. _Vim: https://github.com/stephpy/vim-php-cs-fixer -.. _VS Code: https://github.com/junstyle/vscode-php-cs-fixer -.. _contribute: https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/master/CONTRIBUTING.md - -EOF; - - $command = $this->getApplication()->get('fix'); - $help = $command->getHelp(); - $help = str_replace('%command.full_name%', 'php-cs-fixer.phar '.$command->getName(), $help); - $help = str_replace('%command.name%', $command->getName(), $help); - $help = Preg::replace('##', '``', $help); - $help = Preg::replace('#`(``.+?``)`#', '$1', $help); - $help = Preg::replace('#^(\s+)``(.+)``$#m', '$1$2', $help); - $help = Preg::replace('#^ \* ``(.+)``(.*?\n)#m', "* **$1**$2\n", $help); - $help = Preg::replace('#^ \\| #m', ' ', $help); - $help = Preg::replace('#^ \\|#m', '', $help); - $help = Preg::replace('#^(?= \\*Risky rule: )#m', "\n", $help); - $help = Preg::replace("#^( Configuration options:\n)( - )#m", "$1\n$2", $help); - $help = Preg::replace("#^\n( +\\$ )#m", "\n.. code-block:: bash\n\n$1", $help); - $help = Preg::replace("#^\n( +<\\?php)#m", "\n.. code-block:: php\n\n$1", $help); - $help = Preg::replaceCallback( - '#^\s*<\?(\w+).*?\?>#ms', - static function ($matches) { - $result = Preg::replace("#^\\.\\. code-block:: bash\n\n#m", '', $matches[0]); - - if ('php' !== $matches[1]) { - $result = Preg::replace("#<\\?{$matches[1]}\\s*#", '', $result); - } - - return Preg::replace("#\n\n +\\?>#", '', $result); - }, - $help - ); - - // Transform links - // In the console output these have the form - // `description` (http://...) - // Make to RST http://www.sphinx-doc.org/en/stable/rest.html#hyperlinks - // `description `_ - - $help = Preg::replaceCallback( - '#`(.+)`\s?\((.+)<\/url>\)#', - static function (array $matches) { - return sprintf('`%s <%s>`_', str_replace('\\', '\\\\', $matches[1]), $matches[2]); - }, - $help - ); - - $help = Preg::replace('#^ #m', ' ', $help); - $help = Preg::replace('#\*\* +\[#', '** [', $help); - - $downloadLatestUrl = sprintf('https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v%s/php-cs-fixer.phar', HelpCommand::getLatestReleaseVersionFromChangeLog()); - $downloadUrl = 'https://cs.symfony.com/download/php-cs-fixer-v2.phar'; - - $header = str_replace('%download.version_url%', $downloadLatestUrl, $header); - $header = str_replace('%download.url%', $downloadUrl, $header); - $footer = str_replace('%download.version_url%', $downloadLatestUrl, $footer); - $footer = str_replace('%download.url%', $downloadUrl, $footer); - - $output->write($header."\n".$help."\n".$footer); - - return 0; - } - - private function header($name, $underline) - { - return $name."\n".str_repeat($underline, \strlen($name)); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php deleted file mode 100644 index de4111b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php +++ /dev/null @@ -1,177 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\Command; - -use PhpCsFixer\Console\SelfUpdate\NewVersionCheckerInterface; -use PhpCsFixer\PharCheckerInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\ToolInfoInterface; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Igor Wiedler - * @author Stephane PY - * @author Grégoire Pineau - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -final class SelfUpdateCommand extends Command -{ - protected static $defaultName = 'self-update'; - - /** - * @var NewVersionCheckerInterface - */ - private $versionChecker; - - /** - * @var ToolInfoInterface - */ - private $toolInfo; - - /** - * @var PharCheckerInterface - */ - private $pharChecker; - - public function __construct( - NewVersionCheckerInterface $versionChecker, - ToolInfoInterface $toolInfo, - PharCheckerInterface $pharChecker - ) { - parent::__construct(); - - $this->versionChecker = $versionChecker; - $this->toolInfo = $toolInfo; - $this->pharChecker = $pharChecker; - } - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this - ->setAliases(['selfupdate']) - ->setDefinition( - [ - new InputOption('--force', '-f', InputOption::VALUE_NONE, 'Force update to next major version if available.'), - ] - ) - ->setDescription('Update php-cs-fixer.phar to the latest stable version.') - ->setHelp( - <<<'EOT' -The %command.name% command replace your php-cs-fixer.phar by the -latest version released on: -https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases - -$ php php-cs-fixer.phar %command.name% - -EOT - ) - ; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - if (!$this->toolInfo->isInstalledAsPhar()) { - $output->writeln('Self-update is available only for PHAR version.'); - - return 1; - } - - $currentVersion = $this->getApplication()->getVersion(); - Preg::match('/^v?(?\d+)\./', $currentVersion, $matches); - $currentMajor = (int) $matches['major']; - - try { - $latestVersion = $this->versionChecker->getLatestVersion(); - $latestVersionOfCurrentMajor = $this->versionChecker->getLatestVersionOfMajor($currentMajor); - } catch (\Exception $exception) { - $output->writeln(sprintf( - 'Unable to determine newest version: %s', - $exception->getMessage() - )); - - return 1; - } - - if (1 !== $this->versionChecker->compareVersions($latestVersion, $currentVersion)) { - $output->writeln('php-cs-fixer is already up to date.'); - - return 0; - } - - $remoteTag = $latestVersion; - - if ( - 0 !== $this->versionChecker->compareVersions($latestVersionOfCurrentMajor, $latestVersion) - && true !== $input->getOption('force') - ) { - $output->writeln(sprintf('A new major version of php-cs-fixer is available (%s)', $latestVersion)); - $output->writeln(sprintf('Before upgrading please read https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/%s/UPGRADE.md', $latestVersion)); - $output->writeln('If you are ready to upgrade run this command with -f'); - $output->writeln('Checking for new minor/patch version...'); - - if (1 !== $this->versionChecker->compareVersions($latestVersionOfCurrentMajor, $currentVersion)) { - $output->writeln('No minor update for php-cs-fixer.'); - - return 0; - } - - $remoteTag = $latestVersionOfCurrentMajor; - } - - $localFilename = realpath($_SERVER['argv'][0]) ?: $_SERVER['argv'][0]; - - if (!is_writable($localFilename)) { - $output->writeln(sprintf('No permission to update %s file.', $localFilename)); - - return 1; - } - - $tempFilename = \dirname($localFilename).'/'.basename($localFilename, '.phar').'-tmp.phar'; - $remoteFilename = $this->toolInfo->getPharDownloadUri($remoteTag); - - if (false === @copy($remoteFilename, $tempFilename)) { - $output->writeln(sprintf('Unable to download new version %s from the server.', $remoteTag)); - - return 1; - } - - chmod($tempFilename, 0777 & ~umask()); - - $pharInvalidityReason = $this->pharChecker->checkFileValidity($tempFilename); - if (null !== $pharInvalidityReason) { - unlink($tempFilename); - $output->writeln(sprintf('The download of %s is corrupt (%s).', $remoteTag, $pharInvalidityReason)); - $output->writeln('Please re-run the self-update command to try again.'); - - return 1; - } - - rename($tempFilename, $localFilename); - - $output->writeln(sprintf('php-cs-fixer updated (%s)', $remoteTag)); - - return 0; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php b/vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php deleted file mode 100644 index 22e38be..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php +++ /dev/null @@ -1,941 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console; - -use PhpCsFixer\Cache\CacheManagerInterface; -use PhpCsFixer\Cache\Directory; -use PhpCsFixer\Cache\DirectoryInterface; -use PhpCsFixer\Cache\FileCacheManager; -use PhpCsFixer\Cache\FileHandler; -use PhpCsFixer\Cache\NullCacheManager; -use PhpCsFixer\Cache\Signature; -use PhpCsFixer\ConfigInterface; -use PhpCsFixer\ConfigurationException\InvalidConfigurationException; -use PhpCsFixer\Differ\DifferInterface; -use PhpCsFixer\Differ\NullDiffer; -use PhpCsFixer\Differ\SebastianBergmannDiffer; -use PhpCsFixer\Differ\UnifiedDiffer; -use PhpCsFixer\Finder; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\FixerFactory; -use PhpCsFixer\Linter\Linter; -use PhpCsFixer\Linter\LinterInterface; -use PhpCsFixer\Report\ReporterFactory; -use PhpCsFixer\Report\ReporterInterface; -use PhpCsFixer\RuleSet; -use PhpCsFixer\StdinFileInfo; -use PhpCsFixer\ToolInfoInterface; -use PhpCsFixer\Utils; -use PhpCsFixer\WhitespacesFixerConfig; -use PhpCsFixer\WordMatcher; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Filesystem\Filesystem; -use Symfony\Component\Finder\Finder as SymfonyFinder; - -/** - * The resolver that resolves configuration to use by command line options and config. - * - * @author Fabien Potencier - * @author Katsuhiro Ogawa - * @author Dariusz Rumiński - * - * @internal - */ -final class ConfigurationResolver -{ - const PATH_MODE_OVERRIDE = 'override'; - const PATH_MODE_INTERSECTION = 'intersection'; - - /** - * @var null|bool - */ - private $allowRisky; - - /** - * @var null|ConfigInterface - */ - private $config; - - /** - * @var null|string - */ - private $configFile; - - /** - * @var string - */ - private $cwd; - - /** - * @var ConfigInterface - */ - private $defaultConfig; - - /** - * @var null|ReporterInterface - */ - private $reporter; - - /** - * @var null|bool - */ - private $isStdIn; - - /** - * @var null|bool - */ - private $isDryRun; - - /** - * @var null|FixerInterface[] - */ - private $fixers; - - /** - * @var null|bool - */ - private $configFinderIsOverridden; - - /** - * @var ToolInfoInterface - */ - private $toolInfo; - - /** - * @var array - */ - private $options = [ - 'allow-risky' => null, - 'cache-file' => null, - 'config' => null, - 'diff' => null, - 'diff-format' => null, - 'dry-run' => null, - 'format' => null, - 'path' => [], - 'path-mode' => self::PATH_MODE_OVERRIDE, - 'rules' => null, - 'show-progress' => null, - 'stop-on-violation' => null, - 'using-cache' => null, - 'verbosity' => null, - ]; - - private $cacheFile; - private $cacheManager; - private $differ; - private $directory; - private $finder; - private $format; - private $linter; - private $path; - private $progress; - private $ruleSet; - private $usingCache; - - /** - * @var FixerFactory - */ - private $fixerFactory; - - /** - * @param string $cwd - */ - public function __construct( - ConfigInterface $config, - array $options, - $cwd, - ToolInfoInterface $toolInfo - ) { - $this->cwd = $cwd; - $this->defaultConfig = $config; - $this->toolInfo = $toolInfo; - - foreach ($options as $name => $value) { - $this->setOption($name, $value); - } - } - - /** - * @return null|string - */ - public function getCacheFile() - { - if (!$this->getUsingCache()) { - return null; - } - - if (null === $this->cacheFile) { - if (null === $this->options['cache-file']) { - $this->cacheFile = $this->getConfig()->getCacheFile(); - } else { - $this->cacheFile = $this->options['cache-file']; - } - } - - return $this->cacheFile; - } - - /** - * @return CacheManagerInterface - */ - public function getCacheManager() - { - if (null === $this->cacheManager) { - if ($this->getUsingCache() && ($this->toolInfo->isInstalledAsPhar() || $this->toolInfo->isInstalledByComposer())) { - $this->cacheManager = new FileCacheManager( - new FileHandler($this->getCacheFile()), - new Signature( - PHP_VERSION, - $this->toolInfo->getVersion(), - $this->getConfig()->getIndent(), - $this->getConfig()->getLineEnding(), - $this->getRules() - ), - $this->isDryRun(), - $this->getDirectory() - ); - } else { - $this->cacheManager = new NullCacheManager(); - } - } - - return $this->cacheManager; - } - - /** - * @return ConfigInterface - */ - public function getConfig() - { - if (null === $this->config) { - foreach ($this->computeConfigFiles() as $configFile) { - if (!file_exists($configFile)) { - continue; - } - - $config = self::separatedContextLessInclude($configFile); - - // verify that the config has an instance of Config - if (!$config instanceof ConfigInterface) { - throw new InvalidConfigurationException(sprintf('The config file: "%s" does not return a "PhpCsFixer\ConfigInterface" instance. Got: "%s".', $configFile, \is_object($config) ? \get_class($config) : \gettype($config))); - } - - $this->config = $config; - $this->configFile = $configFile; - - break; - } - - if (null === $this->config) { - $this->config = $this->defaultConfig; - } - } - - return $this->config; - } - - /** - * @return null|string - */ - public function getConfigFile() - { - if (null === $this->configFile) { - $this->getConfig(); - } - - return $this->configFile; - } - - /** - * @return DifferInterface - */ - public function getDiffer() - { - if (null === $this->differ) { - $mapper = [ - 'null' => static function () { return new NullDiffer(); }, - 'sbd' => static function () { return new SebastianBergmannDiffer(); }, - 'udiff' => static function () { return new UnifiedDiffer(); }, - ]; - - if ($this->options['diff-format']) { - $option = $this->options['diff-format']; - if (!isset($mapper[$option])) { - throw new InvalidConfigurationException(sprintf( - '"diff-format" must be any of "%s", got "%s".', - implode('", "', array_keys($mapper)), - $option - )); - } - } else { - $default = 'sbd'; // @TODO: 3.0 change to udiff as default - - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - $default = 'udiff'; - } - - $option = $this->options['diff'] ? $default : 'null'; - } - - $this->differ = $mapper[$option](); - } - - return $this->differ; - } - - /** - * @return DirectoryInterface - */ - public function getDirectory() - { - if (null === $this->directory) { - $path = $this->getCacheFile(); - if (null === $path) { - $absolutePath = $this->cwd; - } else { - $filesystem = new Filesystem(); - - $absolutePath = $filesystem->isAbsolutePath($path) - ? $path - : $this->cwd.\DIRECTORY_SEPARATOR.$path; - } - - $this->directory = new Directory(\dirname($absolutePath)); - } - - return $this->directory; - } - - /** - * @return FixerInterface[] An array of FixerInterface - */ - public function getFixers() - { - if (null === $this->fixers) { - $this->fixers = $this->createFixerFactory() - ->useRuleSet($this->getRuleSet()) - ->setWhitespacesConfig(new WhitespacesFixerConfig($this->config->getIndent(), $this->config->getLineEnding())) - ->getFixers() - ; - - if (false === $this->getRiskyAllowed()) { - $riskyFixers = array_map( - static function (FixerInterface $fixer) { - return $fixer->getName(); - }, - array_filter( - $this->fixers, - static function (FixerInterface $fixer) { - return $fixer->isRisky(); - } - ) - ); - - if (\count($riskyFixers)) { - throw new InvalidConfigurationException(sprintf('The rules contain risky fixers (%s), but they are not allowed to run. Perhaps you forget to use --allow-risky=yes option?', implode(', ', $riskyFixers))); - } - } - } - - return $this->fixers; - } - - /** - * @return LinterInterface - */ - public function getLinter() - { - if (null === $this->linter) { - $this->linter = new Linter($this->getConfig()->getPhpExecutable()); - } - - return $this->linter; - } - - /** - * Returns path. - * - * @return string[] - */ - public function getPath() - { - if (null === $this->path) { - $filesystem = new Filesystem(); - $cwd = $this->cwd; - - if (1 === \count($this->options['path']) && '-' === $this->options['path'][0]) { - $this->path = $this->options['path']; - } else { - $this->path = array_map( - static function ($rawPath) use ($cwd, $filesystem) { - $path = trim($rawPath); - - if ('' === $path) { - throw new InvalidConfigurationException("Invalid path: \"{$rawPath}\"."); - } - - $absolutePath = $filesystem->isAbsolutePath($path) - ? $path - : $cwd.\DIRECTORY_SEPARATOR.$path; - - if (!file_exists($absolutePath)) { - throw new InvalidConfigurationException(sprintf( - 'The path "%s" is not readable.', - $path - )); - } - - return $absolutePath; - }, - $this->options['path'] - ); - } - } - - return $this->path; - } - - /** - * @throws InvalidConfigurationException - * - * @return string - */ - public function getProgress() - { - if (null === $this->progress) { - if (OutputInterface::VERBOSITY_VERBOSE <= $this->options['verbosity'] && 'txt' === $this->getFormat()) { - $progressType = $this->options['show-progress']; - $progressTypes = ['none', 'run-in', 'estimating', 'estimating-max', 'dots']; - - if (null === $progressType) { - $default = 'run-in'; - - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - $default = 'dots'; - } - - $progressType = $this->getConfig()->getHideProgress() ? 'none' : $default; - } elseif (!\in_array($progressType, $progressTypes, true)) { - throw new InvalidConfigurationException(sprintf( - 'The progress type "%s" is not defined, supported are "%s".', - $progressType, - implode('", "', $progressTypes) - )); - } elseif (\in_array($progressType, ['estimating', 'estimating-max', 'run-in'], true)) { - $message = 'Passing `estimating`, `estimating-max` or `run-in` is deprecated and will not be supported in 3.0, use `none` or `dots` instead.'; - - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - throw new \InvalidArgumentException("{$message} This check was performed as `PHP_CS_FIXER_FUTURE_MODE` env var is set."); - } - - @trigger_error($message, E_USER_DEPRECATED); - } - - $this->progress = $progressType; - } else { - $this->progress = 'none'; - } - } - - return $this->progress; - } - - /** - * @return ReporterInterface - */ - public function getReporter() - { - if (null === $this->reporter) { - $reporterFactory = ReporterFactory::create(); - $reporterFactory->registerBuiltInReporters(); - - $format = $this->getFormat(); - - try { - $this->reporter = $reporterFactory->getReporter($format); - } catch (\UnexpectedValueException $e) { - $formats = $reporterFactory->getFormats(); - sort($formats); - - throw new InvalidConfigurationException(sprintf('The format "%s" is not defined, supported are "%s".', $format, implode('", "', $formats))); - } - } - - return $this->reporter; - } - - /** - * @return bool - */ - public function getRiskyAllowed() - { - if (null === $this->allowRisky) { - if (null === $this->options['allow-risky']) { - $this->allowRisky = $this->getConfig()->getRiskyAllowed(); - } else { - $this->allowRisky = $this->resolveOptionBooleanValue('allow-risky'); - } - } - - return $this->allowRisky; - } - - /** - * Returns rules. - * - * @return array - */ - public function getRules() - { - return $this->getRuleSet()->getRules(); - } - - /** - * @return bool - */ - public function getUsingCache() - { - if (null === $this->usingCache) { - if (null === $this->options['using-cache']) { - $this->usingCache = $this->getConfig()->getUsingCache(); - } else { - $this->usingCache = $this->resolveOptionBooleanValue('using-cache'); - } - } - - return $this->usingCache; - } - - public function getFinder() - { - if (null === $this->finder) { - $this->finder = $this->resolveFinder(); - } - - return $this->finder; - } - - /** - * Returns dry-run flag. - * - * @return bool - */ - public function isDryRun() - { - if (null === $this->isDryRun) { - if ($this->isStdIn()) { - // Can't write to STDIN - $this->isDryRun = true; - } else { - $this->isDryRun = $this->options['dry-run']; - } - } - - return $this->isDryRun; - } - - public function shouldStopOnViolation() - { - return $this->options['stop-on-violation']; - } - - /** - * @return bool - */ - public function configFinderIsOverridden() - { - if (null === $this->configFinderIsOverridden) { - $this->resolveFinder(); - } - - return $this->configFinderIsOverridden; - } - - /** - * Compute file candidates for config file. - * - * @return string[] - */ - private function computeConfigFiles() - { - $configFile = $this->options['config']; - - if (null !== $configFile) { - if (false === file_exists($configFile) || false === is_readable($configFile)) { - throw new InvalidConfigurationException(sprintf('Cannot read config file "%s".', $configFile)); - } - - return [$configFile]; - } - - $path = $this->getPath(); - - if ($this->isStdIn() || 0 === \count($path)) { - $configDir = $this->cwd; - } elseif (1 < \count($path)) { - throw new InvalidConfigurationException('For multiple paths config parameter is required.'); - } elseif (is_file($path[0]) && $dirName = pathinfo($path[0], PATHINFO_DIRNAME)) { - $configDir = $dirName; - } else { - $configDir = $path[0]; - } - - $candidates = [ - $configDir.\DIRECTORY_SEPARATOR.'.php_cs', - $configDir.\DIRECTORY_SEPARATOR.'.php_cs.dist', - ]; - - if ($configDir !== $this->cwd) { - $candidates[] = $this->cwd.\DIRECTORY_SEPARATOR.'.php_cs'; - $candidates[] = $this->cwd.\DIRECTORY_SEPARATOR.'.php_cs.dist'; - } - - return $candidates; - } - - /** - * @return FixerFactory - */ - private function createFixerFactory() - { - if (null === $this->fixerFactory) { - $fixerFactory = new FixerFactory(); - $fixerFactory->registerBuiltInFixers(); - $fixerFactory->registerCustomFixers($this->getConfig()->getCustomFixers()); - - $this->fixerFactory = $fixerFactory; - } - - return $this->fixerFactory; - } - - /** - * @return string - */ - private function getFormat() - { - if (null === $this->format) { - $this->format = null === $this->options['format'] - ? $this->getConfig()->getFormat() - : $this->options['format']; - } - - return $this->format; - } - - private function getRuleSet() - { - if (null === $this->ruleSet) { - $rules = $this->parseRules(); - $this->validateRules($rules); - - $this->ruleSet = new RuleSet($rules); - } - - return $this->ruleSet; - } - - /** - * @return bool - */ - private function isStdIn() - { - if (null === $this->isStdIn) { - $this->isStdIn = 1 === \count($this->options['path']) && '-' === $this->options['path'][0]; - } - - return $this->isStdIn; - } - - /** - * @param iterable $iterable - * - * @return \Traversable - */ - private function iterableToTraversable($iterable) - { - return \is_array($iterable) ? new \ArrayIterator($iterable) : $iterable; - } - - /** - * Compute rules. - * - * @return array - */ - private function parseRules() - { - if (null === $this->options['rules']) { - return $this->getConfig()->getRules(); - } - - $rules = trim($this->options['rules']); - if ('' === $rules) { - throw new InvalidConfigurationException('Empty rules value is not allowed.'); - } - - if ('{' === $rules[0]) { - $rules = json_decode($rules, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new InvalidConfigurationException(sprintf('Invalid JSON rules input: "%s".', json_last_error_msg())); - } - - return $rules; - } - - $rules = []; - - foreach (explode(',', $this->options['rules']) as $rule) { - $rule = trim($rule); - if ('' === $rule) { - throw new InvalidConfigurationException('Empty rule name is not allowed.'); - } - - if ('-' === $rule[0]) { - $rules[substr($rule, 1)] = false; - } else { - $rules[$rule] = true; - } - } - - return $rules; - } - - /** - * @throws InvalidConfigurationException - */ - private function validateRules(array $rules) - { - /** - * Create a ruleset that contains all configured rules, even when they originally have been disabled. - * - * @see RuleSet::resolveSet() - */ - $ruleSet = []; - foreach ($rules as $key => $value) { - if (\is_int($key)) { - throw new InvalidConfigurationException(sprintf('Missing value for "%s" rule/set.', $value)); - } - - $ruleSet[$key] = true; - } - $ruleSet = new RuleSet($ruleSet); - - /** @var string[] $configuredFixers */ - $configuredFixers = array_keys($ruleSet->getRules()); - - $fixers = $this->createFixerFactory()->getFixers(); - - /** @var string[] $availableFixers */ - $availableFixers = array_map(static function (FixerInterface $fixer) { - return $fixer->getName(); - }, $fixers); - - $unknownFixers = array_diff( - $configuredFixers, - $availableFixers - ); - - if (\count($unknownFixers)) { - $matcher = new WordMatcher($availableFixers); - - $message = 'The rules contain unknown fixers: '; - foreach ($unknownFixers as $unknownFixer) { - $alternative = $matcher->match($unknownFixer); - $message .= sprintf( - '"%s"%s, ', - $unknownFixer, - null === $alternative ? '' : ' (did you mean "'.$alternative.'"?)' - ); - } - - throw new InvalidConfigurationException(substr($message, 0, -2).'.'); - } - - foreach ($fixers as $fixer) { - $fixerName = $fixer->getName(); - if (isset($rules[$fixerName]) && $fixer instanceof DeprecatedFixerInterface) { - $successors = $fixer->getSuccessorsNames(); - $messageEnd = [] === $successors - ? sprintf(' and will be removed in version %d.0.', Application::getMajorVersion()) - : sprintf('. Use %s instead.', str_replace('`', '"', Utils::naturalLanguageJoinWithBackticks($successors))); - - $message = "Rule \"{$fixerName}\" is deprecated{$messageEnd}"; - - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - throw new \RuntimeException("{$message} This check was performed as `PHP_CS_FIXER_FUTURE_MODE` env var is set."); - } - - @trigger_error($message, E_USER_DEPRECATED); - } - } - } - - /** - * Apply path on config instance. - */ - private function resolveFinder() - { - $this->configFinderIsOverridden = false; - - if ($this->isStdIn()) { - return new \ArrayIterator([new StdinFileInfo()]); - } - - $modes = [self::PATH_MODE_OVERRIDE, self::PATH_MODE_INTERSECTION]; - - if (!\in_array( - $this->options['path-mode'], - $modes, - true - )) { - throw new InvalidConfigurationException(sprintf( - 'The path-mode "%s" is not defined, supported are "%s".', - $this->options['path-mode'], - implode('", "', $modes) - )); - } - - $isIntersectionPathMode = self::PATH_MODE_INTERSECTION === $this->options['path-mode']; - - $paths = array_filter(array_map( - static function ($path) { - return realpath($path); - }, - $this->getPath() - )); - - if (!\count($paths)) { - if ($isIntersectionPathMode) { - return new \ArrayIterator([]); - } - - return $this->iterableToTraversable($this->getConfig()->getFinder()); - } - - $pathsByType = [ - 'file' => [], - 'dir' => [], - ]; - - foreach ($paths as $path) { - if (is_file($path)) { - $pathsByType['file'][] = $path; - } else { - $pathsByType['dir'][] = $path.\DIRECTORY_SEPARATOR; - } - } - - $nestedFinder = null; - $currentFinder = $this->iterableToTraversable($this->getConfig()->getFinder()); - - try { - $nestedFinder = $currentFinder instanceof \IteratorAggregate ? $currentFinder->getIterator() : $currentFinder; - } catch (\Exception $e) { - } - - if ($isIntersectionPathMode) { - if (null === $nestedFinder) { - throw new InvalidConfigurationException( - 'Cannot create intersection with not-fully defined Finder in configuration file.' - ); - } - - return new \CallbackFilterIterator( - new \IteratorIterator($nestedFinder), - static function (\SplFileInfo $current) use ($pathsByType) { - $currentRealPath = $current->getRealPath(); - - if (\in_array($currentRealPath, $pathsByType['file'], true)) { - return true; - } - - foreach ($pathsByType['dir'] as $path) { - if (0 === strpos($currentRealPath, $path)) { - return true; - } - } - - return false; - } - ); - } - - if (null !== $this->getConfigFile() && null !== $nestedFinder) { - $this->configFinderIsOverridden = true; - } - - if ($currentFinder instanceof SymfonyFinder && null === $nestedFinder) { - // finder from configuration Symfony finder and it is not fully defined, we may fulfill it - return $currentFinder->in($pathsByType['dir'])->append($pathsByType['file']); - } - - return Finder::create()->in($pathsByType['dir'])->append($pathsByType['file']); - } - - /** - * Set option that will be resolved. - * - * @param string $name - * @param mixed $value - */ - private function setOption($name, $value) - { - if (!\array_key_exists($name, $this->options)) { - throw new InvalidConfigurationException(sprintf('Unknown option name: "%s".', $name)); - } - - $this->options[$name] = $value; - } - - /** - * @param string $optionName - * - * @return bool - */ - private function resolveOptionBooleanValue($optionName) - { - $value = $this->options[$optionName]; - if (\is_bool($value)) { - return $value; - } - - if (!\is_string($value)) { - throw new InvalidConfigurationException(sprintf('Expected boolean or string value for option "%s".', $optionName)); - } - - if ('yes' === $value) { - return true; - } - - if ('no' === $value) { - return false; - } - - $message = sprintf('Expected "yes" or "no" for option "%s", other values are deprecated and support will be removed in 3.0. Got "%s", this implicitly set the option to "false".', $optionName, $value); - - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - throw new InvalidConfigurationException("{$message} This check was performed as `PHP_CS_FIXER_FUTURE_MODE` env var is set."); - } - - @trigger_error($message, E_USER_DEPRECATED); - - return false; - } - - private static function separatedContextLessInclude($path) - { - return include $path; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php deleted file mode 100644 index aafd6fe..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php +++ /dev/null @@ -1,154 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\Output; - -use PhpCsFixer\Differ\DiffConsoleFormatter; -use PhpCsFixer\Error\Error; -use PhpCsFixer\Linter\LintingException; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author SpacePossum - * - * @internal - */ -final class ErrorOutput -{ - /** - * @var OutputInterface - */ - private $output; - - /** - * @var bool - */ - private $isDecorated; - - public function __construct(OutputInterface $output) - { - $this->output = $output; - $this->isDecorated = $output->isDecorated(); - } - - /** - * @param string $process - * @param Error[] $errors - */ - public function listErrors($process, array $errors) - { - $this->output->writeln(['', sprintf( - 'Files that were not fixed due to errors reported during %s:', - $process - )]); - - $showDetails = $this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE; - $showTrace = $this->output->getVerbosity() >= OutputInterface::VERBOSITY_DEBUG; - foreach ($errors as $i => $error) { - $this->output->writeln(sprintf('%4d) %s', $i + 1, $error->getFilePath())); - $e = $error->getSource(); - if (!$showDetails || null === $e) { - continue; - } - - $class = sprintf('[%s]', \get_class($e)); - $message = $e->getMessage(); - $code = $e->getCode(); - if (0 !== $code) { - $message .= " ({$code})"; - } - - $length = max(\strlen($class), \strlen($message)); - $lines = [ - '', - $class, - $message, - '', - ]; - - $this->output->writeln(''); - - foreach ($lines as $line) { - if (\strlen($line) < $length) { - $line .= str_repeat(' ', $length - \strlen($line)); - } - - $this->output->writeln(sprintf(' %s ', $this->prepareOutput($line))); - } - - if ($showTrace && !$e instanceof LintingException) { // stack trace of lint exception is of no interest - $this->output->writeln(''); - $stackTrace = $e->getTrace(); - foreach ($stackTrace as $trace) { - if (isset($trace['class'], $trace['function']) && \Symfony\Component\Console\Command\Command::class === $trace['class'] && 'run' === $trace['function']) { - $this->output->writeln(' [ ... ]'); - - break; - } - - $this->outputTrace($trace); - } - } - - if (Error::TYPE_LINT === $error->getType() && 0 < \count($error->getAppliedFixers())) { - $this->output->writeln(''); - $this->output->writeln(sprintf(' Applied fixers: %s', implode(', ', $error->getAppliedFixers()))); - - $diff = $error->getDiff(); - if (!empty($diff)) { - $diffFormatter = new DiffConsoleFormatter( - $this->isDecorated, - sprintf( - ' ---------- begin diff ----------%s%%s%s ----------- end diff -----------', - PHP_EOL, - PHP_EOL - ) - ); - - $this->output->writeln($diffFormatter->format($diff)); - } - } - } - } - - private function outputTrace(array $trace) - { - if (isset($trace['class'], $trace['type'], $trace['function'])) { - $this->output->writeln(sprintf( - ' %s%s%s()', - $this->prepareOutput($trace['class']), - $this->prepareOutput($trace['type']), - $this->prepareOutput($trace['function']) - )); - } elseif (isset($trace['function'])) { - $this->output->writeln(sprintf(' %s()', $this->prepareOutput($trace['function']))); - } - - if (isset($trace['file'])) { - $this->output->writeln(sprintf(' in %s at line %d', $this->prepareOutput($trace['file']), $trace['line'])); - } - } - - /** - * @param string $string - * - * @return string - */ - private function prepareOutput($string) - { - return $this->isDecorated - ? OutputFormatter::escape($string) - : $string - ; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/NullOutput.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/NullOutput.php deleted file mode 100644 index 281388c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/NullOutput.php +++ /dev/null @@ -1,23 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\Output; - -/** - * @internal - */ -final class NullOutput implements ProcessOutputInterface -{ - public function printLegend() - { - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutput.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutput.php deleted file mode 100644 index 61b69b9..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutput.php +++ /dev/null @@ -1,145 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\Output; - -use PhpCsFixer\FixerFileProcessedEvent; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; - -/** - * Output writer to show the process of a FixCommand. - * - * @internal - */ -final class ProcessOutput implements ProcessOutputInterface -{ - /** - * File statuses map. - * - * @var array - */ - private static $eventStatusMap = [ - FixerFileProcessedEvent::STATUS_UNKNOWN => ['symbol' => '?', 'format' => '%s', 'description' => 'unknown'], - FixerFileProcessedEvent::STATUS_INVALID => ['symbol' => 'I', 'format' => '%s', 'description' => 'invalid file syntax (file ignored)'], - FixerFileProcessedEvent::STATUS_SKIPPED => ['symbol' => 'S', 'format' => '%s', 'description' => 'skipped (cached or empty file)'], - FixerFileProcessedEvent::STATUS_NO_CHANGES => ['symbol' => '.', 'format' => '%s', 'description' => 'no changes'], - FixerFileProcessedEvent::STATUS_FIXED => ['symbol' => 'F', 'format' => '%s', 'description' => 'fixed'], - FixerFileProcessedEvent::STATUS_EXCEPTION => ['symbol' => 'E', 'format' => '%s', 'description' => 'error'], - FixerFileProcessedEvent::STATUS_LINT => ['symbol' => 'E', 'format' => '%s', 'description' => 'error'], - ]; - - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var OutputInterface - */ - private $output; - - /** - * @var null|int - */ - private $files; - - /** - * @var int - */ - private $processedFiles = 0; - - /** - * @var null|int - */ - private $symbolsPerLine; - - /** - * @TODO 3.0 make all parameters mandatory (`null` not allowed) - * - * @param null|int $width - * @param null|int $nbFiles - */ - public function __construct(OutputInterface $output, EventDispatcherInterface $dispatcher, $width, $nbFiles) - { - $this->output = $output; - $this->eventDispatcher = $dispatcher; - $this->eventDispatcher->addListener(FixerFileProcessedEvent::NAME, [$this, 'onFixerFileProcessed']); - $this->symbolsPerLine = $width; - - if (null !== $nbFiles) { - $this->files = $nbFiles; - - // max number of characters per line - // - total length x 2 (e.g. " 1 / 123" => 6 digits and padding spaces) - // - 11 (extra spaces, parentheses and percentage characters, e.g. " x / x (100%)") - $this->symbolsPerLine = max(1, ($width ?: 80) - \strlen((string) $this->files) * 2 - 11); - } - } - - public function __destruct() - { - $this->eventDispatcher->removeListener(FixerFileProcessedEvent::NAME, [$this, 'onFixerFileProcessed']); - } - - public function onFixerFileProcessed(FixerFileProcessedEvent $event) - { - if ( - null === $this->files - && null !== $this->symbolsPerLine - && 0 === $this->processedFiles % $this->symbolsPerLine - && 0 !== $this->processedFiles - ) { - $this->output->writeln(''); - } - - $status = self::$eventStatusMap[$event->getStatus()]; - $this->output->write($this->output->isDecorated() ? sprintf($status['format'], $status['symbol']) : $status['symbol']); - - ++$this->processedFiles; - - if (null !== $this->files) { - $symbolsOnCurrentLine = $this->processedFiles % $this->symbolsPerLine; - $isLast = $this->processedFiles === $this->files; - - if (0 === $symbolsOnCurrentLine || $isLast) { - $this->output->write(sprintf( - '%s %'.\strlen((string) $this->files).'d / %d (%3d%%)', - $isLast && 0 !== $symbolsOnCurrentLine ? str_repeat(' ', $this->symbolsPerLine - $symbolsOnCurrentLine) : '', - $this->processedFiles, - $this->files, - round($this->processedFiles / $this->files * 100) - )); - - if (!$isLast) { - $this->output->writeln(''); - } - } - } - } - - public function printLegend() - { - $symbols = []; - - foreach (self::$eventStatusMap as $status) { - $symbol = $status['symbol']; - if ('' === $symbol || isset($symbols[$symbol])) { - continue; - } - - $symbols[$symbol] = sprintf('%s-%s', $this->output->isDecorated() ? sprintf($status['format'], $symbol) : $symbol, $status['description']); - } - - $this->output->write(sprintf("\nLegend: %s\n", implode(', ', $symbols))); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutputInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutputInterface.php deleted file mode 100644 index 2d78382..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutputInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\Output; - -/** - * @internal - */ -interface ProcessOutputInterface -{ - public function printLegend(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php b/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php deleted file mode 100644 index 7cae3ac..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php +++ /dev/null @@ -1,52 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\SelfUpdate; - -/** - * @internal - */ -final class GithubClient implements GithubClientInterface -{ - /** - * {@inheritdoc} - */ - public function getTags() - { - $url = 'https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/tags'; - - $result = @file_get_contents( - $url, - false, - stream_context_create([ - 'http' => [ - 'header' => 'User-Agent: FriendsOfPHP/PHP-CS-Fixer', - ], - ]) - ); - - if (false === $result) { - throw new \RuntimeException(sprintf('Failed to load tags at "%s".', $url)); - } - - $result = json_decode($result, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \RuntimeException(sprintf( - 'Failed to read response from "%s" as JSON: %s.', - $url, - json_last_error_msg() - )); - } - - return $result; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php deleted file mode 100644 index a9671ac..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php +++ /dev/null @@ -1,24 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\SelfUpdate; - -/** - * @internal - */ -interface GithubClientInterface -{ - /** - * @return array - */ - public function getTags(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php b/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php deleted file mode 100644 index 023d6e7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php +++ /dev/null @@ -1,114 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\SelfUpdate; - -use Composer\Semver\Comparator; -use Composer\Semver\Semver; -use Composer\Semver\VersionParser; - -/** - * @internal - */ -final class NewVersionChecker implements NewVersionCheckerInterface -{ - /** - * @var GithubClientInterface - */ - private $githubClient; - - /** - * @var VersionParser - */ - private $versionParser; - - /** - * @var null|string[] - */ - private $availableVersions; - - public function __construct(GithubClientInterface $githubClient) - { - $this->githubClient = $githubClient; - $this->versionParser = new VersionParser(); - } - - /** - * {@inheritdoc} - */ - public function getLatestVersion() - { - $this->retrieveAvailableVersions(); - - return $this->availableVersions[0]; - } - - /** - * {@inheritdoc} - */ - public function getLatestVersionOfMajor($majorVersion) - { - $this->retrieveAvailableVersions(); - - $semverConstraint = '^'.$majorVersion; - - foreach ($this->availableVersions as $availableVersion) { - if (Semver::satisfies($availableVersion, $semverConstraint)) { - return $availableVersion; - } - } - - return null; - } - - /** - * {@inheritdoc} - */ - public function compareVersions($versionA, $versionB) - { - $versionA = $this->versionParser->normalize($versionA); - $versionB = $this->versionParser->normalize($versionB); - - if (Comparator::lessThan($versionA, $versionB)) { - return -1; - } - - if (Comparator::greaterThan($versionA, $versionB)) { - return 1; - } - - return 0; - } - - private function retrieveAvailableVersions() - { - if (null !== $this->availableVersions) { - return; - } - - foreach ($this->githubClient->getTags() as $tag) { - $version = $tag['name']; - - try { - $this->versionParser->normalize($version); - - if ('stable' === VersionParser::parseStability($version)) { - $this->availableVersions[] = $version; - } - } catch (\UnexpectedValueException $exception) { - // not a valid version tag - } - } - - $this->availableVersions = Semver::rsort($this->availableVersions); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionCheckerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionCheckerInterface.php deleted file mode 100644 index b596d58..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionCheckerInterface.php +++ /dev/null @@ -1,46 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console\SelfUpdate; - -/** - * @internal - */ -interface NewVersionCheckerInterface -{ - /** - * Returns the tag of the latest version. - * - * @return string - */ - public function getLatestVersion(); - - /** - * Returns the tag of the latest minor/patch version of the given major version. - * - * @param int $majorVersion - * - * @return null|string - */ - public function getLatestVersionOfMajor($majorVersion); - - /** - * Returns -1, 0, or 1 if the first version is respectively less than, - * equal to, or greater than the second. - * - * @param string $versionA - * @param string $versionB - * - * @return int - */ - public function compareVersions($versionA, $versionB); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php b/vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php deleted file mode 100644 index 3f5d130..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php +++ /dev/null @@ -1,74 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Console; - -use PhpCsFixer\ToolInfo; -use PhpCsFixer\ToolInfoInterface; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class WarningsDetector -{ - /** - * @var ToolInfoInterface - */ - private $toolInfo; - - /** - * @var string[] - */ - private $warnings = []; - - public function __construct(ToolInfoInterface $toolInfo) - { - $this->toolInfo = $toolInfo; - } - - public function detectOldMajor() - { - // @TODO 3.0 to be activated with new MAJOR release - // $this->warnings[] = 'You are running PHP CS Fixer v2, which is not maintained anymore. Please update to v3.'; - } - - public function detectOldVendor() - { - if ($this->toolInfo->isInstalledByComposer()) { - $details = $this->toolInfo->getComposerInstallationDetails(); - if (ToolInfo::COMPOSER_LEGACY_PACKAGE_NAME === $details['name']) { - $this->warnings[] = sprintf( - 'You are running PHP CS Fixer installed with old vendor `%s`. Please update to `%s`.', - ToolInfo::COMPOSER_LEGACY_PACKAGE_NAME, - ToolInfo::COMPOSER_PACKAGE_NAME - ); - } - } - } - - /** - * @return string[] - */ - public function getWarnings() - { - if (!\count($this->warnings)) { - return []; - } - - return array_unique(array_merge( - $this->warnings, - ['If you need help while solving warnings, ask at https://gitter.im/PHP-CS-Fixer, we will help you!'] - )); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php b/vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php deleted file mode 100644 index 831404d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php +++ /dev/null @@ -1,102 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Differ; - -use PhpCsFixer\Preg; -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class DiffConsoleFormatter -{ - /** - * @var bool - */ - private $isDecoratedOutput; - - /** - * @var string - */ - private $template; - - /** - * @param bool $isDecoratedOutput - * @param string $template - */ - public function __construct($isDecoratedOutput, $template = '%s') - { - $this->isDecoratedOutput = $isDecoratedOutput; - $this->template = $template; - } - - /** - * @param string $diff - * @param string $lineTemplate - * - * @return string - */ - public function format($diff, $lineTemplate = '%s') - { - $isDecorated = $this->isDecoratedOutput; - - $template = $isDecorated - ? $this->template - : Preg::replace('/<[^<>]+>/', '', $this->template) - ; - - return sprintf( - $template, - implode( - PHP_EOL, - array_map( - static function ($line) use ($isDecorated, $lineTemplate) { - if ($isDecorated) { - $count = 0; - $line = Preg::replaceCallback( - [ - '/^(\+.*)/', - '/^(\-.*)/', - '/^(@.*)/', - ], - static function ($matches) { - if ('+' === $matches[0][0]) { - $colour = 'green'; - } elseif ('-' === $matches[0][0]) { - $colour = 'red'; - } else { - $colour = 'cyan'; - } - - return sprintf('%s', $colour, OutputFormatter::escape($matches[0]), $colour); - }, - $line, - 1, - $count - ); - - if (0 === $count) { - $line = OutputFormatter::escape($line); - } - } - - return sprintf($lineTemplate, $line); - }, - Preg::split('#\R#u', $diff) - ) - ) - ); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Differ/DifferInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Differ/DifferInterface.php deleted file mode 100644 index e530d26..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Differ/DifferInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Differ; - -/** - * @author Dariusz Rumiński - */ -interface DifferInterface -{ - /** - * Create diff. - * - * @param string $old - * @param string $new - * - * @return string - * - * TODO: on 3.0 pass the file name (if applicable) for which this diff is - */ - public function diff($old, $new); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php b/vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php deleted file mode 100644 index 9dcb7cc..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php +++ /dev/null @@ -1,48 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Differ; - -use PhpCsFixer\Diff\v3_0\Differ; -use PhpCsFixer\Diff\v3_0\Output\StrictUnifiedDiffOutputBuilder; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FullDiffer implements DifferInterface -{ - /** - * @var Differ - */ - private $differ; - - public function __construct() - { - $this->differ = new Differ(new StrictUnifiedDiffOutputBuilder([ - 'collapseRanges' => false, - 'commonLineThreshold' => 100, - 'contextLines' => 100, - 'fromFile' => 'Original', - 'toFile' => 'New', - ])); - } - - /** - * {@inheritdoc} - */ - public function diff($old, $new) - { - return $this->differ->diff($old, $new); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Differ/NullDiffer.php b/vendor/friendsofphp/php-cs-fixer/src/Differ/NullDiffer.php deleted file mode 100644 index 12399c4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Differ/NullDiffer.php +++ /dev/null @@ -1,27 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Differ; - -/** - * @author Dariusz Rumiński - */ -final class NullDiffer implements DifferInterface -{ - /** - * {@inheritdoc} - */ - public function diff($old, $new) - { - return ''; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Differ/SebastianBergmannDiffer.php b/vendor/friendsofphp/php-cs-fixer/src/Differ/SebastianBergmannDiffer.php deleted file mode 100644 index d829dbc..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Differ/SebastianBergmannDiffer.php +++ /dev/null @@ -1,39 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Differ; - -use PhpCsFixer\Diff\v1_4\Differ; - -/** - * @author Dariusz Rumiński - */ -final class SebastianBergmannDiffer implements DifferInterface -{ - /** - * @var Differ - */ - private $differ; - - public function __construct() - { - $this->differ = new Differ(); - } - - /** - * {@inheritdoc} - */ - public function diff($old, $new) - { - return $this->differ->diff($old, $new); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Differ/SebastianBergmannShortDiffer.php b/vendor/friendsofphp/php-cs-fixer/src/Differ/SebastianBergmannShortDiffer.php deleted file mode 100644 index 4c7f2e2..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Differ/SebastianBergmannShortDiffer.php +++ /dev/null @@ -1,39 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Differ; - -use PhpCsFixer\Diff\v1_4\Differ; - -/** - * @author SpacePossum - */ -final class SebastianBergmannShortDiffer implements DifferInterface -{ - /** - * @var Differ - */ - private $differ; - - public function __construct() - { - $this->differ = new Differ("--- Original\n+++ New\n", false); - } - - /** - * {@inheritdoc} - */ - public function diff($old, $new) - { - return $this->differ->diff($old, $new); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Differ/UnifiedDiffer.php b/vendor/friendsofphp/php-cs-fixer/src/Differ/UnifiedDiffer.php deleted file mode 100644 index aa88a64..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Differ/UnifiedDiffer.php +++ /dev/null @@ -1,43 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Differ; - -use PhpCsFixer\Diff\v3_0\Differ; -use PhpCsFixer\Diff\v3_0\Output\StrictUnifiedDiffOutputBuilder; - -/** - * @author SpacePossum - */ -final class UnifiedDiffer implements DifferInterface -{ - /** - * @var Differ - */ - private $differ; - - public function __construct() - { - $this->differ = new Differ(new StrictUnifiedDiffOutputBuilder([ - 'fromFile' => 'Original', - 'toFile' => 'New', - ])); - } - - /** - * {@inheritdoc} - */ - public function diff($old, $new) - { - return $this->differ->diff($old, $new); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php deleted file mode 100644 index d6b5937..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php +++ /dev/null @@ -1,323 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\DocBlock; - -use PhpCsFixer\Preg; - -/** - * This represents an entire annotation from a docblock. - * - * @author Graham Campbell - * @author Dariusz Rumiński - */ -class Annotation -{ - /** - * Regex to match any types, shall be used with `x` modifier. - * - * @internal - */ - const REGEX_TYPES = ' - # is any non-array, non-generic, non-alternated type, eg `int` or `\Foo` - # is array of , eg `int[]` or `\Foo[]` - # is generic collection type, like `array`, `Collection` and more complex like `Collection>` - # is , or type, like `int`, `bool[]` or `Collection` - # is one or more types alternated via `|`, like `int|bool[]|Collection` - (? - (? - (? - (?&simple)(\[\])* - ) - | - (? - [@$?]?[\\\\\w]+ - ) - | - (? - (?&simple) - < - (?:(?&types),\s*)?(?:(?&types)|(?&generic)) - > - ) - ) - (?: - \| - (?:(?&simple)|(?&array)|(?&generic)) - )* - ) - '; - - /** - * All the annotation tag names with types. - * - * @var string[] - */ - private static $tags = [ - 'method', - 'param', - 'property', - 'property-read', - 'property-write', - 'return', - 'throws', - 'type', - 'var', - ]; - - /** - * The lines that make up the annotation. - * - * @var Line[] - */ - private $lines; - - /** - * The position of the first line of the annotation in the docblock. - * - * @var int - */ - private $start; - - /** - * The position of the last line of the annotation in the docblock. - * - * @var int - */ - private $end; - - /** - * The associated tag. - * - * @var null|Tag - */ - private $tag; - - /** - * Lazy loaded, cached types content. - * - * @var null|string - */ - private $typesContent; - - /** - * The cached types. - * - * @var null|string[] - */ - private $types; - - /** - * Create a new line instance. - * - * @param Line[] $lines - */ - public function __construct(array $lines) - { - $this->lines = array_values($lines); - - $keys = array_keys($lines); - - $this->start = $keys[0]; - $this->end = end($keys); - } - - /** - * Get the string representation of object. - * - * @return string - */ - public function __toString() - { - return $this->getContent(); - } - - /** - * Get all the annotation tag names with types. - * - * @return string[] - */ - public static function getTagsWithTypes() - { - return self::$tags; - } - - /** - * Get the start position of this annotation. - * - * @return int - */ - public function getStart() - { - return $this->start; - } - - /** - * Get the end position of this annotation. - * - * @return int - */ - public function getEnd() - { - return $this->end; - } - - /** - * Get the associated tag. - * - * @return Tag - */ - public function getTag() - { - if (null === $this->tag) { - $this->tag = new Tag($this->lines[0]); - } - - return $this->tag; - } - - /** - * Get the types associated with this annotation. - * - * @return string[] - */ - public function getTypes() - { - if (null === $this->types) { - $this->types = []; - - $content = $this->getTypesContent(); - - while ('' !== $content && false !== $content) { - Preg::match( - '{^'.self::REGEX_TYPES.'$}x', - $content, - $matches - ); - - $this->types[] = $matches['type']; - $content = substr($content, \strlen($matches['type']) + 1); - } - } - - return $this->types; - } - - /** - * Set the types associated with this annotation. - * - * @param string[] $types - */ - public function setTypes(array $types) - { - $pattern = '/'.preg_quote($this->getTypesContent(), '/').'/'; - - $this->lines[0]->setContent(Preg::replace($pattern, implode('|', $types), $this->lines[0]->getContent(), 1)); - - $this->clearCache(); - } - - /** - * Get the normalized types associated with this annotation, so they can easily be compared. - * - * @return string[] - */ - public function getNormalizedTypes() - { - $normalized = array_map(static function ($type) { - return strtolower($type); - }, $this->getTypes()); - - sort($normalized); - - return $normalized; - } - - /** - * Remove this annotation by removing all its lines. - */ - public function remove() - { - foreach ($this->lines as $line) { - if ($line->isTheStart() && $line->isTheEnd()) { - // Single line doc block, remove entirely - $line->remove(); - } elseif ($line->isTheStart()) { - // Multi line doc block, but start is on the same line as the first annotation, keep only the start - $content = Preg::replace('#(\s*/\*\*).*#', '$1', $line->getContent()); - - $line->setContent($content); - } elseif ($line->isTheEnd()) { - // Multi line doc block, but end is on the same line as the last annotation, keep only the end - $content = Preg::replace('#(\s*)\S.*(\*/.*)#', '$1$2', $line->getContent()); - - $line->setContent($content); - } else { - // Multi line doc block, neither start nor end on this line, can be removed safely - $line->remove(); - } - } - - $this->clearCache(); - } - - /** - * Get the annotation content. - * - * @return string - */ - public function getContent() - { - return implode('', $this->lines); - } - - public function supportTypes() - { - return \in_array($this->getTag()->getName(), self::$tags, true); - } - - /** - * Get the current types content. - * - * Be careful modifying the underlying line as that won't flush the cache. - * - * @return string - */ - private function getTypesContent() - { - if (null === $this->typesContent) { - $name = $this->getTag()->getName(); - - if (!$this->supportTypes()) { - throw new \RuntimeException('This tag does not support types.'); - } - - $matchingResult = Preg::match( - '{^(?:\s*\*|/\*\*)\s*@'.$name.'\s+'.self::REGEX_TYPES.'(?:[*\h\v].*)?$}sx', - $this->lines[0]->getContent(), - $matches - ); - - $this->typesContent = 1 === $matchingResult - ? $matches['types'] - : ''; - } - - return $this->typesContent; - } - - private function clearCache() - { - $this->types = null; - $this->typesContent = null; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php deleted file mode 100644 index ec3e167..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php +++ /dev/null @@ -1,269 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\DocBlock; - -use PhpCsFixer\Preg; - -/** - * This class represents a docblock. - * - * It internally splits it up into "lines" that we can manipulate. - * - * @author Graham Campbell - */ -class DocBlock -{ - /** - * The array of lines. - * - * @var Line[] - */ - private $lines = []; - - /** - * The array of annotations. - * - * @var null|Annotation[] - */ - private $annotations; - - /** - * Create a new docblock instance. - * - * @param string $content - */ - public function __construct($content) - { - foreach (Preg::split('/([^\n\r]+\R*)/', $content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) as $line) { - $this->lines[] = new Line($line); - } - } - - /** - * Get the string representation of object. - * - * @return string - */ - public function __toString() - { - return $this->getContent(); - } - - /** - * Get this docblock's lines. - * - * @return Line[] - */ - public function getLines() - { - return $this->lines; - } - - /** - * Get a single line. - * - * @param int $pos - * - * @return null|Line - */ - public function getLine($pos) - { - return isset($this->lines[$pos]) ? $this->lines[$pos] : null; - } - - /** - * Get this docblock's annotations. - * - * @return Annotation[] - */ - public function getAnnotations() - { - if (null !== $this->annotations) { - return $this->annotations; - } - - $this->annotations = []; - $total = \count($this->lines); - - for ($index = 0; $index < $total; ++$index) { - if ($this->lines[$index]->containsATag()) { - // get all the lines that make up the annotation - $lines = \array_slice($this->lines, $index, $this->findAnnotationLength($index), true); - $annotation = new Annotation($lines); - // move the index to the end of the annotation to avoid - // checking it again because we know the lines inside the - // current annotation cannot be part of another annotation - $index = $annotation->getEnd(); - // add the current annotation to the list of annotations - $this->annotations[] = $annotation; - } - } - - return $this->annotations; - } - - public function isMultiLine() - { - return 1 !== \count($this->lines); - } - - /** - * Take a one line doc block, and turn it into a multi line doc block. - * - * @param string $indent - * @param string $lineEnd - */ - public function makeMultiLine($indent, $lineEnd) - { - if ($this->isMultiLine()) { - return; - } - - $lineContent = $this->getSingleLineDocBlockEntry($this->lines[0]); - - if ('' === $lineContent) { - $this->lines = [ - new Line('/**'.$lineEnd), - new Line($indent.' *'.$lineEnd), - new Line($indent.' */'), - ]; - - return; - } - - $this->lines = [ - new Line('/**'.$lineEnd), - new Line($indent.' * '.$lineContent.$lineEnd), - new Line($indent.' */'), - ]; - } - - public function makeSingleLine() - { - if (!$this->isMultiLine()) { - return; - } - - $usefulLines = array_filter( - $this->lines, - static function (Line $line) { - return $line->containsUsefulContent(); - } - ); - - if (1 < \count($usefulLines)) { - return; - } - - $lineContent = ''; - if (\count($usefulLines)) { - $lineContent = $this->getSingleLineDocBlockEntry(array_shift($usefulLines)); - } - - $this->lines = [new Line('/** '.$lineContent.' */')]; - } - - /** - * @param int $pos - * - * @return null|Annotation - */ - public function getAnnotation($pos) - { - $annotations = $this->getAnnotations(); - - return isset($annotations[$pos]) ? $annotations[$pos] : null; - } - - /** - * Get specific types of annotations only. - * - * If none exist, we're returning an empty array. - * - * @param string|string[] $types - * - * @return Annotation[] - */ - public function getAnnotationsOfType($types) - { - $annotations = []; - $types = (array) $types; - - foreach ($this->getAnnotations() as $annotation) { - $tag = $annotation->getTag()->getName(); - foreach ($types as $type) { - if ($type === $tag) { - $annotations[] = $annotation; - } - } - } - - return $annotations; - } - - /** - * Get the actual content of this docblock. - * - * @return string - */ - public function getContent() - { - return implode('', $this->lines); - } - - private function findAnnotationLength($start) - { - $index = $start; - - while ($line = $this->getLine(++$index)) { - if ($line->containsATag()) { - // we've 100% reached the end of the description if we get here - break; - } - - if (!$line->containsUsefulContent()) { - // if next line is also non-useful, or contains a tag, then we're done here - $next = $this->getLine($index + 1); - if (null === $next || !$next->containsUsefulContent() || $next->containsATag()) { - break; - } - // otherwise, continue, the annotation must have contained a blank line in its description - } - } - - return $index - $start; - } - - /** - * @return string - */ - private function getSingleLineDocBlockEntry(Line $line) - { - $lineString = $line->getContent(); - - if (0 === \strlen($lineString)) { - return $lineString; - } - - $lineString = str_replace('*/', '', $lineString); - $lineString = trim($lineString); - - if ('/**' === substr($lineString, 0, 3)) { - $lineString = substr($lineString, 3); - } elseif ('*' === substr($lineString, 0, 1)) { - $lineString = substr($lineString, 1); - } - - return trim($lineString); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php deleted file mode 100644 index 3e19861..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php +++ /dev/null @@ -1,144 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\DocBlock; - -use PhpCsFixer\Preg; - -/** - * This represents a line of a docblock. - * - * @author Graham Campbell - */ -class Line -{ - /** - * The content of this line. - * - * @var string - */ - private $content; - - /** - * Create a new line instance. - * - * @param string $content - */ - public function __construct($content) - { - $this->content = $content; - } - - /** - * Get the string representation of object. - * - * @return string - */ - public function __toString() - { - return $this->content; - } - - /** - * Get the content of this line. - * - * @return string - */ - public function getContent() - { - return $this->content; - } - - /** - * Does this line contain useful content? - * - * If the line contains text or tags, then this is true. - * - * @return bool - */ - public function containsUsefulContent() - { - return 0 !== Preg::match('/\\*\s*\S+/', $this->content) && '' !== trim(str_replace(['/', '*'], ' ', $this->content)); - } - - /** - * Does the line contain a tag? - * - * If this is true, then it must be the first line of an annotation. - * - * @return bool - */ - public function containsATag() - { - return 0 !== Preg::match('/\\*\s*@/', $this->content); - } - - /** - * Is the line the start of a docblock? - * - * @return bool - */ - public function isTheStart() - { - return false !== strpos($this->content, '/**'); - } - - /** - * Is the line the end of a docblock? - * - * @return bool - */ - public function isTheEnd() - { - return false !== strpos($this->content, '*/'); - } - - /** - * Set the content of this line. - * - * @param string $content - */ - public function setContent($content) - { - $this->content = $content; - } - - /** - * Remove this line by clearing its contents. - * - * Note that this method technically brakes the internal state of the - * docblock, but is useful when we need to retain the indexes of lines - * during the execution of an algorithm. - */ - public function remove() - { - $this->content = ''; - } - - /** - * Append a blank docblock line to this line's contents. - * - * Note that this method technically brakes the internal state of the - * docblock, but is useful when we need to retain the indexes of lines - * during the execution of an algorithm. - */ - public function addBlank() - { - $matched = Preg::match('/^(\h*\*)[^\r\n]*(\r?\n)$/', $this->content, $matches); - - if (1 !== $matched) { - return; - } - - $this->content .= $matches[1].$matches[2]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php deleted file mode 100644 index e4228ba..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php +++ /dev/null @@ -1,65 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\DocBlock; - -/** - * This class represents a short description (aka summary) of a docblock. - * - * @internal - */ -final class ShortDescription -{ - /** - * The docblock containing the short description. - * - * @var DocBlock - */ - private $doc; - - public function __construct(DocBlock $doc) - { - $this->doc = $doc; - } - - /** - * Get the line index of the line containing the end of the short - * description, if present. - * - * @return null|int - */ - public function getEnd() - { - $reachedContent = false; - - foreach ($this->doc->getLines() as $index => $line) { - // we went past a description, then hit a tag or blank line, so - // the last line of the description must be the one before this one - if ($reachedContent && ($line->containsATag() || !$line->containsUsefulContent())) { - return $index - 1; - } - - // no short description was found - if ($line->containsATag()) { - return null; - } - - // we've reached content, but need to check the next lines too - // in case the short description is multi-line - if ($line->containsUsefulContent()) { - $reachedContent = true; - } - } - - return null; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Tag.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Tag.php deleted file mode 100644 index 9efa00b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Tag.php +++ /dev/null @@ -1,111 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\DocBlock; - -use PhpCsFixer\Preg; - -/** - * This represents a tag, as defined by the proposed PSR PHPDoc standard. - * - * @author Graham Campbell - */ -class Tag -{ - /** - * All the tags defined by the proposed PSR PHPDoc standard. - * - * @var string[] - */ - private static $tags = [ - 'api', 'author', 'category', 'copyright', 'deprecated', 'example', - 'global', 'internal', 'license', 'link', 'method', 'package', 'param', - 'property', 'property-read', 'property-write', 'return', 'see', - 'since', 'subpackage', 'throws', 'todo', 'uses', 'var', 'version', - ]; - - /** - * The line containing the tag. - * - * @var Line - */ - private $line; - - /** - * The cached tag name. - * - * @var null|string - */ - private $name; - - /** - * Create a new tag instance. - */ - public function __construct(Line $line) - { - $this->line = $line; - } - - /** - * Get the tag name. - * - * This may be "param", or "return", etc. - * - * @return string - */ - public function getName() - { - if (null === $this->name) { - Preg::matchAll('/@[a-zA-Z0-9_-]+(?=\s|$)/', $this->line->getContent(), $matches); - - if (isset($matches[0][0])) { - $this->name = ltrim($matches[0][0], '@'); - } else { - $this->name = 'other'; - } - } - - return $this->name; - } - - /** - * Set the tag name. - * - * This will also be persisted to the upstream line and annotation. - * - * @param string $name - */ - public function setName($name) - { - $current = $this->getName(); - - if ('other' === $current) { - throw new \RuntimeException('Cannot set name on unknown tag.'); - } - - $this->line->setContent(Preg::replace("/@{$current}/", "@{$name}", $this->line->getContent(), 1)); - - $this->name = $name; - } - - /** - * Is the tag a known tag? - * - * This is defined by if it exists in the proposed PSR PHPDoc standard. - * - * @return bool - */ - public function valid() - { - return \in_array($this->getName(), self::$tags, true); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php deleted file mode 100644 index 9504e72..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php +++ /dev/null @@ -1,57 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\DocBlock; - -/** - * This class is responsible for comparing tags to see if they should be kept - * together, or kept apart. - * - * @author Graham Campbell - */ -class TagComparator -{ - /** - * Groups of tags that should be allowed to immediately follow each other. - * - * @var array - */ - private static $groups = [ - ['deprecated', 'link', 'see', 'since'], - ['author', 'copyright', 'license'], - ['category', 'package', 'subpackage'], - ['property', 'property-read', 'property-write'], - ]; - - /** - * Should the given tags be kept together, or kept apart? - * - * @return bool - */ - public static function shouldBeTogether(Tag $first, Tag $second) - { - $firstName = $first->getName(); - $secondName = $second->getName(); - - if ($firstName === $secondName) { - return true; - } - - foreach (self::$groups as $group) { - if (\in_array($firstName, $group, true) && \in_array($secondName, $group, true)) { - return true; - } - } - - return false; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php b/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php deleted file mode 100644 index 890b5e4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php +++ /dev/null @@ -1,99 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Doctrine\Annotation; - -use Doctrine\Common\Annotations\DocLexer; - -/** - * A Doctrine annotation token. - * - * @internal - */ -final class Token -{ - /** - * @var int - */ - private $type; - - /** - * @var string - */ - private $content; - - /** - * @param int $type The type - * @param string $content The content - */ - public function __construct($type = DocLexer::T_NONE, $content = '') - { - $this->type = $type; - $this->content = $content; - } - - /** - * @return int - */ - public function getType() - { - return $this->type; - } - - /** - * @param int $type - */ - public function setType($type) - { - $this->type = $type; - } - - /** - * @return string - */ - public function getContent() - { - return $this->content; - } - - /** - * @param string $content - */ - public function setContent($content) - { - $this->content = $content; - } - - /** - * Returns whether the token type is one of the given types. - * - * @param int|int[] $types - * - * @return bool - */ - public function isType($types) - { - if (!\is_array($types)) { - $types = [$types]; - } - - return \in_array($this->getType(), $types, true); - } - - /** - * Overrides the content with an empty string. - */ - public function clear() - { - $this->setContent(''); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php b/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php deleted file mode 100644 index 15dfd0c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php +++ /dev/null @@ -1,377 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Doctrine\Annotation; - -use Doctrine\Common\Annotations\DocLexer; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token as PhpToken; - -/** - * A list of Doctrine annotation tokens. - * - * @internal - */ -final class Tokens extends \SplFixedArray -{ - /** - * @param string[] $ignoredTags - * - * @throws \InvalidArgumentException - * - * @return self - */ - public static function createFromDocComment(PhpToken $input, array $ignoredTags = []) - { - if (!$input->isGivenKind(T_DOC_COMMENT)) { - throw new \InvalidArgumentException('Input must be a T_DOC_COMMENT token.'); - } - - $tokens = new self(); - - $content = $input->getContent(); - $ignoredTextPosition = 0; - $currentPosition = 0; - while (false !== $nextAtPosition = strpos($content, '@', $currentPosition)) { - if (0 !== $nextAtPosition && !Preg::match('/\s/', $content[$nextAtPosition - 1])) { - $currentPosition = $nextAtPosition + 1; - - continue; - } - - $lexer = new DocLexer(); - $lexer->setInput(substr($content, $nextAtPosition)); - - $scannedTokens = []; - $index = 0; - $nbScannedTokensToUse = 0; - $nbScopes = 0; - while (null !== $token = $lexer->peek()) { - if (0 === $index && DocLexer::T_AT !== $token['type']) { - break; - } - - if (1 === $index) { - if (DocLexer::T_IDENTIFIER !== $token['type'] || \in_array($token['value'], $ignoredTags, true)) { - break; - } - - $nbScannedTokensToUse = 2; - } - - if ($index >= 2 && 0 === $nbScopes && !\in_array($token['type'], [DocLexer::T_NONE, DocLexer::T_OPEN_PARENTHESIS], true)) { - break; - } - - $scannedTokens[] = $token; - - if (DocLexer::T_OPEN_PARENTHESIS === $token['type']) { - ++$nbScopes; - } elseif (DocLexer::T_CLOSE_PARENTHESIS === $token['type']) { - if (0 === --$nbScopes) { - $nbScannedTokensToUse = \count($scannedTokens); - - break; - } - } - - ++$index; - } - - if (0 !== $nbScopes) { - break; - } - - if (0 !== $nbScannedTokensToUse) { - $ignoredTextLength = $nextAtPosition - $ignoredTextPosition; - if (0 !== $ignoredTextLength) { - $tokens[] = new Token(DocLexer::T_NONE, substr($content, $ignoredTextPosition, $ignoredTextLength)); - } - - $lastTokenEndIndex = 0; - foreach (\array_slice($scannedTokens, 0, $nbScannedTokensToUse) as $token) { - if (DocLexer::T_STRING === $token['type']) { - $token['value'] = '"'.str_replace('"', '""', $token['value']).'"'; - } - - $missingTextLength = $token['position'] - $lastTokenEndIndex; - if ($missingTextLength > 0) { - $tokens[] = new Token(DocLexer::T_NONE, substr( - $content, - $nextAtPosition + $lastTokenEndIndex, - $missingTextLength - )); - } - - $tokens[] = new Token($token['type'], $token['value']); - $lastTokenEndIndex = $token['position'] + \strlen($token['value']); - } - - $currentPosition = $ignoredTextPosition = $nextAtPosition + $token['position'] + \strlen($token['value']); - } else { - $currentPosition = $nextAtPosition + 1; - } - } - - if ($ignoredTextPosition < \strlen($content)) { - $tokens[] = new Token(DocLexer::T_NONE, substr($content, $ignoredTextPosition)); - } - - return $tokens; - } - - /** - * Returns the index of the closest next token that is neither a comment nor a whitespace token. - * - * @param int $index - * - * @return null|int - */ - public function getNextMeaningfulToken($index) - { - return $this->getMeaningfulTokenSibling($index, 1); - } - - /** - * Returns the index of the closest previous token that is neither a comment nor a whitespace token. - * - * @param int $index - * - * @return null|int - */ - public function getPreviousMeaningfulToken($index) - { - return $this->getMeaningfulTokenSibling($index, -1); - } - - /** - * Returns the index of the closest next token of the given type. - * - * @param string|string[] $type - * @param int $index - * - * @return null|int - */ - public function getNextTokenOfType($type, $index) - { - return $this->getTokenOfTypeSibling($index, $type, 1); - } - - /** - * Returns the index of the closest previous token of the given type. - * - * @param string|string[] $type - * @param int $index - * - * @return null|int - */ - public function getPreviousTokenOfType($type, $index) - { - return $this->getTokenOfTypeSibling($index, $type, -1); - } - - /** - * Returns the index of the last token that is part of the annotation at the given index. - * - * @param int $index - * - * @return null|int - */ - public function getAnnotationEnd($index) - { - $currentIndex = null; - - if (isset($this[$index + 2])) { - if ($this[$index + 2]->isType(DocLexer::T_OPEN_PARENTHESIS)) { - $currentIndex = $index + 2; - } elseif ( - isset($this[$index + 3]) - && $this[$index + 2]->isType(DocLexer::T_NONE) - && $this[$index + 3]->isType(DocLexer::T_OPEN_PARENTHESIS) - && Preg::match('/^(\R\s*\*\s*)*\s*$/', $this[$index + 2]->getContent()) - ) { - $currentIndex = $index + 3; - } - } - - if (null !== $currentIndex) { - $level = 0; - for ($max = \count($this); $currentIndex < $max; ++$currentIndex) { - if ($this[$currentIndex]->isType(DocLexer::T_OPEN_PARENTHESIS)) { - ++$level; - } elseif ($this[$currentIndex]->isType(DocLexer::T_CLOSE_PARENTHESIS)) { - --$level; - } - - if (0 === $level) { - return $currentIndex; - } - } - - return null; - } - - return $index + 1; - } - - /** - * Returns the index of the close brace that matches the open brace at the given index. - * - * @param int $index - * - * @return null|int - */ - public function getArrayEnd($index) - { - $level = 1; - for (++$index, $max = \count($this); $index < $max; ++$index) { - if ($this[$index]->isType(DocLexer::T_OPEN_CURLY_BRACES)) { - ++$level; - } elseif ($this[$index]->isType($index, DocLexer::T_CLOSE_CURLY_BRACES)) { - --$level; - } - - if (0 === $level) { - return $index; - } - } - - return null; - } - - /** - * Returns the code from the tokens. - * - * @return string - */ - public function getCode() - { - $code = ''; - foreach ($this as $token) { - $code .= $token->getContent(); - } - - return $code; - } - - /** - * Inserts a token at the given index. - * - * @param int $index - */ - public function insertAt($index, Token $token) - { - $this->setSize($this->getSize() + 1); - - for ($i = $this->getSize() - 1; $i > $index; --$i) { - $this[$i] = isset($this[$i - 1]) ? $this[$i - 1] : new Token(); - } - - $this[$index] = $token; - } - - /** - * {@inheritdoc} - * - * @throws \InvalidArgumentException - */ - public function offsetSet($index, $token) - { - if (!$token instanceof Token) { - $type = \gettype($token); - if ('object' === $type) { - $type = \get_class($token); - } - - throw new \InvalidArgumentException(sprintf( - 'Token must be an instance of PhpCsFixer\\Doctrine\\Annotation\\Token, %s given.', - $type - )); - } - - if (null === $index) { - $index = \count($this); - $this->setSize($this->getSize() + 1); - } - - parent::offsetSet($index, $token); - } - - /** - * {@inheritdoc} - * - * @throws \OutOfBoundsException - */ - public function offsetUnset($index) - { - if (!isset($this[$index])) { - throw new \OutOfBoundsException(sprintf('Index %s is invalid or does not exist.', $index)); - } - - $max = \count($this) - 1; - while ($index < $max) { - $this[$index] = $this[$index + 1]; - ++$index; - } - - parent::offsetUnset($index); - - $this->setSize($max); - } - - /** - * @param int $index - * @param int $direction - * - * @return null|int - */ - private function getMeaningfulTokenSibling($index, $direction) - { - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - break; - } - - if (!$this[$index]->isType(DocLexer::T_NONE)) { - return $index; - } - } - - return null; - } - - /** - * @param int $index - * @param string|string[] $type - * @param int $direction - * - * @return null|int - */ - private function getTokenOfTypeSibling($index, $type, $direction) - { - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - break; - } - - if ($this[$index]->isType($type)) { - return $index; - } - } - - return null; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Error/Error.php b/vendor/friendsofphp/php-cs-fixer/src/Error/Error.php deleted file mode 100644 index d7aae68..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Error/Error.php +++ /dev/null @@ -1,118 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Error; - -/** - * An abstraction for errors that can occur before and during fixing. - * - * @author Andreas Möller - * - * @internal - */ -final class Error -{ - /** - * Error which has occurred in linting phase, before applying any fixers. - */ - const TYPE_INVALID = 1; - - /** - * Error which has occurred during fixing phase. - */ - const TYPE_EXCEPTION = 2; - - /** - * Error which has occurred in linting phase, after applying any fixers. - */ - const TYPE_LINT = 3; - - /** - * @var int - */ - private $type; - - /** - * @var string - */ - private $filePath; - - /** - * @var null|\Throwable - */ - private $source; - - /** - * @var array - */ - private $appliedFixers; - - /** - * @var null|string - */ - private $diff; - - /** - * @param int $type - * @param string $filePath - * @param null|\Throwable $source - * @param null|string $diff - */ - public function __construct($type, $filePath, $source = null, array $appliedFixers = [], $diff = null) - { - $this->type = $type; - $this->filePath = $filePath; - $this->source = $source; - $this->appliedFixers = $appliedFixers; - $this->diff = $diff; - } - - /** - * @return string - */ - public function getFilePath() - { - return $this->filePath; - } - - /** - * @return null|\Throwable - */ - public function getSource() - { - return $this->source; - } - - /** - * @return int - */ - public function getType() - { - return $this->type; - } - - /** - * @return array - */ - public function getAppliedFixers() - { - return $this->appliedFixers; - } - - /** - * @return null|string - */ - public function getDiff() - { - return $this->diff; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php b/vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php deleted file mode 100644 index a5d0959..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php +++ /dev/null @@ -1,79 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Error; - -/** - * Manager of errors that occur during fixing. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ErrorsManager -{ - /** - * @var Error[] - */ - private $errors = []; - - /** - * Returns errors reported during linting before fixing. - * - * @return Error[] - */ - public function getInvalidErrors() - { - return array_filter($this->errors, static function (Error $error) { - return Error::TYPE_INVALID === $error->getType(); - }); - } - - /** - * Returns errors reported during fixing. - * - * @return Error[] - */ - public function getExceptionErrors() - { - return array_filter($this->errors, static function (Error $error) { - return Error::TYPE_EXCEPTION === $error->getType(); - }); - } - - /** - * Returns errors reported during linting after fixing. - * - * @return Error[] - */ - public function getLintErrors() - { - return array_filter($this->errors, static function (Error $error) { - return Error::TYPE_LINT === $error->getType(); - }); - } - - /** - * Returns true if no errors were reported. - * - * @return bool - */ - public function isEmpty() - { - return empty($this->errors); - } - - public function report(Error $error) - { - $this->errors[] = $error; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Event/Event.php b/vendor/friendsofphp/php-cs-fixer/src/Event/Event.php deleted file mode 100644 index 8131336..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Event/Event.php +++ /dev/null @@ -1,29 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Event; - -use Symfony\Component\EventDispatcher\EventDispatcher; -use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; - -// Since PHP-CS-FIXER is PHP 5.6 compliant we can't always use Symfony Contracts (currently needs PHP ^7.1.3) -// This conditional inheritance will be useless when PHP-CS-FIXER no longer supports PHP versions -// inferior to Symfony/Contracts PHP minimal version -if (is_subclass_of(EventDispatcher::class, EventDispatcherInterface::class)) { - class Event extends \Symfony\Contracts\EventDispatcher\Event - { - } -} else { - class Event extends \Symfony\Component\EventDispatcher\Event - { - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FileReader.php b/vendor/friendsofphp/php-cs-fixer/src/FileReader.php deleted file mode 100644 index 2e4736e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FileReader.php +++ /dev/null @@ -1,87 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * File reader that unify access to regular file and stdin-alike file. - * - * Regular file could be read multiple times with `file_get_contents`, but file provided on stdin can not. - * Consecutive try will provide empty content for stdin-alike file. - * This reader unifies access to them. - * - * @internal - */ -final class FileReader -{ - /** - * @var null|self - */ - private static $instance; - - /** - * @var null|string - */ - private $stdinContent; - - /** - * @return self - */ - public static function createSingleton() - { - if (null === self::$instance) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * @param string $filePath - * - * @return string - */ - public function read($filePath) - { - if ('php://stdin' === $filePath) { - if (null === $this->stdinContent) { - $this->stdinContent = $this->readRaw($filePath); - } - - return $this->stdinContent; - } - - return $this->readRaw($filePath); - } - - /** - * @param string $realPath - * - * @return string - */ - private function readRaw($realPath) - { - $content = @file_get_contents($realPath); - - if (false === $content) { - $error = error_get_last(); - - throw new \RuntimeException(sprintf( - 'Failed to read content from "%s".%s', - $realPath, - $error ? ' '.$error['message'] : '' - )); - } - - return $content; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php b/vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php deleted file mode 100644 index 2ba5988..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php +++ /dev/null @@ -1,80 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * Handles files removal with possibility to remove them on shutdown. - * - * @author Adam Klvač - * @author Dariusz Rumiński - * - * @internal - */ -final class FileRemoval -{ - /** - * List of observed files to be removed. - * - * @var array - */ - private $files = []; - - public function __construct() - { - register_shutdown_function([$this, 'clean']); - } - - public function __destruct() - { - $this->clean(); - } - - /** - * Adds a file to be removed. - * - * @param string $path - */ - public function observe($path) - { - $this->files[$path] = true; - } - - /** - * Removes a file from shutdown removal. - * - * @param string $path - */ - public function delete($path) - { - if (isset($this->files[$path])) { - unset($this->files[$path]); - } - $this->unlink($path); - } - - /** - * Removes attached files. - */ - public function clean() - { - foreach ($this->files as $file => $value) { - $this->unlink($file); - } - $this->files = []; - } - - private function unlink($path) - { - @unlink($path); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Finder.php b/vendor/friendsofphp/php-cs-fixer/src/Finder.php deleted file mode 100644 index ba4fad2..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Finder.php +++ /dev/null @@ -1,35 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use Symfony\Component\Finder\Finder as BaseFinder; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - */ -class Finder extends BaseFinder -{ - public function __construct() - { - parent::__construct(); - - $this - ->files() - ->name('*.php') - ->ignoreDotFiles(true) - ->ignoreVCS(true) - ->exclude('vendor') - ; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php deleted file mode 100644 index 09d63df..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php +++ /dev/null @@ -1,145 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Alias; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class BacktickToShellExecFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound('`'); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Converts backtick operators to `shell_exec` calls.', - [ - new CodeSample( - <<<'EOT' -call()}`; - -EOT - ), - ], - 'Conversion is done only when it is non risky, so when special chars like single-quotes, double-quotes and backticks are not used inside the command.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before EscapeImplicitBackslashesFixer, ExplicitStringVariableFixer. - */ - public function getPriority() - { - return 2; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $backtickStarted = false; - $backtickTokens = []; - for ($index = $tokens->count() - 1; $index > 0; --$index) { - $token = $tokens[$index]; - if (!$token->equals('`')) { - if ($backtickStarted) { - $backtickTokens[$index] = $token; - } - - continue; - } - - $backtickTokens[$index] = $token; - if ($backtickStarted) { - $this->fixBackticks($tokens, $backtickTokens); - $backtickTokens = []; - } - $backtickStarted = !$backtickStarted; - } - } - - /** - * Override backtick code with corresponding double-quoted string. - */ - private function fixBackticks(Tokens $tokens, array $backtickTokens) - { - // Track indexes for final override - ksort($backtickTokens); - $openingBacktickIndex = key($backtickTokens); - end($backtickTokens); - $closingBacktickIndex = key($backtickTokens); - - // Strip enclosing backticks - array_shift($backtickTokens); - array_pop($backtickTokens); - - // Double-quoted strings are parsed differently if they contain - // variables or not, so we need to build the new token array accordingly - $count = \count($backtickTokens); - - $newTokens = [ - new Token([T_STRING, 'shell_exec']), - new Token('('), - ]; - if (1 !== $count) { - $newTokens[] = new Token('"'); - } - foreach ($backtickTokens as $token) { - if (!$token->isGivenKind(T_ENCAPSED_AND_WHITESPACE)) { - $newTokens[] = $token; - - continue; - } - $content = $token->getContent(); - // Escaping special chars depends on the context: too tricky - if (Preg::match('/[`"\']/u', $content)) { - return; - } - - $kind = T_ENCAPSED_AND_WHITESPACE; - if (1 === $count) { - $content = '"'.$content.'"'; - $kind = T_CONSTANT_ENCAPSED_STRING; - } - - $newTokens[] = new Token([$kind, $content]); - } - if (1 !== $count) { - $newTokens[] = new Token('"'); - } - $newTokens[] = new Token(')'); - - $tokens->overrideRange($openingBacktickIndex, $closingBacktickIndex, $newTokens); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php deleted file mode 100644 index 6186c1f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php +++ /dev/null @@ -1,184 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Alias; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\PregException; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Utils; - -/** - * @author Matteo Beccati - */ -final class EregToPregFixer extends AbstractFixer -{ - /** - * @var array the list of the ext/ereg function names, their preg equivalent and the preg modifier(s), if any - * all condensed in an array of arrays - */ - private static $functions = [ - ['ereg', 'preg_match', ''], - ['eregi', 'preg_match', 'i'], - ['ereg_replace', 'preg_replace', ''], - ['eregi_replace', 'preg_replace', 'i'], - ['split', 'preg_split', ''], - ['spliti', 'preg_split', 'i'], - ]; - - /** - * @var array the list of preg delimiters, in order of preference - */ - private static $delimiters = ['/', '#', '!']; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replace deprecated `ereg` regular expression functions with `preg`.', - [new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $end = $tokens->count() - 1; - $functionsAnalyzer = new FunctionsAnalyzer(); - - foreach (self::$functions as $map) { - // the sequence is the function name, followed by "(" and a quoted string - $seq = [[T_STRING, $map[0]], '(', [T_CONSTANT_ENCAPSED_STRING]]; - - $currIndex = 0; - while (null !== $currIndex) { - $match = $tokens->findSequence($seq, $currIndex, $end, false); - - // did we find a match? - if (null === $match) { - break; - } - - // findSequence also returns the tokens, but we're only interested in the indexes, i.e.: - // 0 => function name, - // 1 => bracket "(" - // 2 => quoted string passed as 1st parameter - $match = array_keys($match); - - // advance tokenizer cursor - $currIndex = $match[2]; - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $match[0])) { - continue; - } - - // ensure the first parameter is just a string (e.g. has nothing appended) - $next = $tokens->getNextMeaningfulToken($match[2]); - if (null === $next || !$tokens[$next]->equalsAny([',', ')'])) { - continue; - } - - // convert to PCRE - $regexTokenContent = $tokens[$match[2]]->getContent(); - $string = substr($regexTokenContent, 1, -1); - $quote = $regexTokenContent[0]; - $delim = $this->getBestDelimiter($string); - $preg = $delim.addcslashes($string, $delim).$delim.'D'.$map[2]; - - // check if the preg is valid - if (!$this->checkPreg($preg)) { - continue; - } - - // modify function and argument - $tokens[$match[0]] = new Token([T_STRING, $map[1]]); - $tokens[$match[2]] = new Token([T_CONSTANT_ENCAPSED_STRING, $quote.$preg.$quote]); - } - } - } - - /** - * Check the validity of a PCRE. - * - * @param string $pattern the regular expression - * - * @return bool - */ - private function checkPreg($pattern) - { - try { - Preg::match($pattern, ''); - - return true; - } catch (PregException $e) { - return false; - } - } - - /** - * Get the delimiter that would require the least escaping in a regular expression. - * - * @param string $pattern the regular expression - * - * @return string the preg delimiter - */ - private function getBestDelimiter($pattern) - { - // try do find something that's not used - $delimiters = []; - foreach (self::$delimiters as $k => $d) { - if (false === strpos($pattern, $d)) { - return $d; - } - - $delimiters[$d] = [substr_count($pattern, $d), $k]; - } - - // return the least used delimiter, using the position in the list as a tie breaker - uasort($delimiters, static function ($a, $b) { - if ($a[0] === $b[0]) { - return Utils::cmpInt($a, $b); - } - - return $a[0] < $b[0] ? -1 : 1; - }); - - return key($delimiters); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php deleted file mode 100644 index 8c61cb7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php +++ /dev/null @@ -1,130 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Alias; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class MbStrFunctionsFixer extends AbstractFunctionReferenceFixer -{ - /** - * @var array the list of the string-related function names and their mb_ equivalent - */ - private static $functionsMap = [ - 'str_split' => ['alternativeName' => 'mb_str_split', 'argumentCount' => [1, 2, 3]], - 'stripos' => ['alternativeName' => 'mb_stripos', 'argumentCount' => [2, 3]], - 'stristr' => ['alternativeName' => 'mb_stristr', 'argumentCount' => [2, 3]], - 'strlen' => ['alternativeName' => 'mb_strlen', 'argumentCount' => [1]], - 'strpos' => ['alternativeName' => 'mb_strpos', 'argumentCount' => [2, 3]], - 'strrchr' => ['alternativeName' => 'mb_strrchr', 'argumentCount' => [2]], - 'strripos' => ['alternativeName' => 'mb_strripos', 'argumentCount' => [2, 3]], - 'strrpos' => ['alternativeName' => 'mb_strrpos', 'argumentCount' => [2, 3]], - 'strstr' => ['alternativeName' => 'mb_strstr', 'argumentCount' => [2, 3]], - 'strtolower' => ['alternativeName' => 'mb_strtolower', 'argumentCount' => [1]], - 'strtoupper' => ['alternativeName' => 'mb_strtoupper', 'argumentCount' => [1]], - 'substr' => ['alternativeName' => 'mb_substr', 'argumentCount' => [2, 3]], - 'substr_count' => ['alternativeName' => 'mb_substr_count', 'argumentCount' => [2, 3, 4]], - ]; - - /** - * @var array - */ - private $functions; - - public function __construct() - { - parent::__construct(); - - $this->functions = array_filter( - self::$functionsMap, - static function (array $mapping) { - return \function_exists($mapping['alternativeName']) && (new \ReflectionFunction($mapping['alternativeName']))->isInternal(); - } - ); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replace non multibyte-safe functions with corresponding mb function.', - [ - new CodeSample( - 'isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - foreach ($this->functions as $functionIdentity => $functionReplacement) { - $currIndex = 0; - while (null !== $currIndex) { - // try getting function reference and translate boundaries for humans - $boundaries = $this->find($functionIdentity, $tokens, $currIndex, $tokens->count() - 1); - if (null === $boundaries) { - // next function search, as current one not found - continue 2; - } - - list($functionName, $openParenthesis, $closeParenthesis) = $boundaries; - $count = $argumentsAnalyzer->countArguments($tokens, $openParenthesis, $closeParenthesis); - if (!\in_array($count, $functionReplacement['argumentCount'], true)) { - continue 2; - } - - // analysing cursor shift, so nested calls could be processed - $currIndex = $openParenthesis; - - $tokens[$functionName] = new Token([T_STRING, $functionReplacement['alternativeName']]); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php deleted file mode 100644 index 8fe7ae6..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php +++ /dev/null @@ -1,227 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Alias; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Vladimir Reznichenko - * @author Dariusz Rumiński - */ -final class NoAliasFunctionsFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** @var array stores alias (key) - master (value) functions mapping */ - private $aliases = []; - - /** @var array stores alias (key) - master (value) functions mapping */ - private static $internalSet = [ - 'chop' => 'rtrim', - 'close' => 'closedir', - 'doubleval' => 'floatval', - 'fputs' => 'fwrite', - 'get_required_files' => 'get_included_files', - 'ini_alter' => 'ini_set', - 'is_double' => 'is_float', - 'is_integer' => 'is_int', - 'is_long' => 'is_int', - 'is_real' => 'is_float', - 'is_writeable' => 'is_writable', - 'join' => 'implode', - 'key_exists' => 'array_key_exists', - 'magic_quotes_runtime' => 'set_magic_quotes_runtime', - 'pos' => 'current', - 'show_source' => 'highlight_file', - 'sizeof' => 'count', - 'strchr' => 'strstr', - 'user_error' => 'trigger_error', - ]; - - /** @var array stores alias (key) - master (value) functions mapping */ - private static $imapSet = [ - 'imap_create' => 'imap_createmailbox', - 'imap_fetchtext' => 'imap_body', - 'imap_header' => 'imap_headerinfo', - 'imap_listmailbox' => 'imap_list', - 'imap_listsubscribed' => 'imap_lsub', - 'imap_rename' => 'imap_renamemailbox', - 'imap_scan' => 'imap_listscan', - 'imap_scanmailbox' => 'imap_listscan', - ]; - - /** @var array stores alias (key) - master (value) functions mapping */ - private static $mbregSet = [ - 'mbereg' => 'mb_ereg', - 'mbereg_match' => 'mb_ereg_match', - 'mbereg_replace' => 'mb_ereg_replace', - 'mbereg_search' => 'mb_ereg_search', - 'mbereg_search_getpos' => 'mb_ereg_search_getpos', - 'mbereg_search_getregs' => 'mb_ereg_search_getregs', - 'mbereg_search_init' => 'mb_ereg_search_init', - 'mbereg_search_pos' => 'mb_ereg_search_pos', - 'mbereg_search_regs' => 'mb_ereg_search_regs', - 'mbereg_search_setpos' => 'mb_ereg_search_setpos', - 'mberegi' => 'mb_eregi', - 'mberegi_replace' => 'mb_eregi_replace', - 'mbregex_encoding' => 'mb_regex_encoding', - 'mbsplit' => 'mb_split', - ]; - - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->aliases = []; - foreach ($this->configuration['sets'] as $set) { - if ('@all' === $set) { - $this->aliases = self::$internalSet; - $this->aliases = array_merge($this->aliases, self::$imapSet); - $this->aliases = array_merge($this->aliases, self::$mbregSet); - - break; - } - if ('@internal' === $set) { - $this->aliases = array_merge($this->aliases, self::$internalSet); - } elseif ('@IMAP' === $set) { - $this->aliases = array_merge($this->aliases, self::$imapSet); - } elseif ('@mbreg' === $set) { - $this->aliases = array_merge($this->aliases, self::$mbregSet); - } - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Master functions shall be used instead of aliases.', - [ - new CodeSample( - ' ['@mbreg']] - ), - ], - null, - 'Risky when any of the alias functions are overridden.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before ImplodeCallFixer, PhpUnitDedicateAssertFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - /** @var Token $token */ - foreach ($tokens->findGivenKind(T_STRING) as $index => $token) { - // check mapping hit - $tokenContent = strtolower($token->getContent()); - if (!isset($this->aliases[$tokenContent])) { - continue; - } - - // skip expressions without parameters list - $nextToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - if (!$nextToken->equals('(')) { - continue; - } - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $tokens[$index] = new Token([T_STRING, $this->aliases[$tokenContent]]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $sets = ['@internal', '@IMAP', '@mbreg', '@all']; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('sets', 'List of sets to fix. Defined sets are `@internal` (native functions), `@IMAP` (IMAP functions), `@mbreg` (from `ext-mbstring`) `@all` (all listed sets).')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset($sets)]) - ->setDefault(['@internal', '@IMAP']) - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php deleted file mode 100644 index bf664fd..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php +++ /dev/null @@ -1,162 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Alias; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Sullivan Senechal - * @author SpacePossum - */ -final class NoMixedEchoPrintFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @deprecated will be removed in 3.0 - */ - public static $defaultConfig = ['use' => 'echo']; - - /** - * @var string - */ - private $callBack; - - /** - * @var int T_ECHO or T_PRINT - */ - private $candidateTokenType; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - if ('echo' === $this->configuration['use']) { - $this->candidateTokenType = T_PRINT; - $this->callBack = 'fixPrintToEcho'; - } else { - $this->candidateTokenType = T_ECHO; - $this->callBack = 'fixEchoToPrint'; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Either language construct `print` or `echo` should be used.', - [ - new CodeSample(" 'print']), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after NoShortEchoTagFixer. - */ - public function getPriority() - { - return -10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound($this->candidateTokenType); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $callBack = $this->callBack; - foreach ($tokens as $index => $token) { - if ($token->isGivenKind($this->candidateTokenType)) { - $this->{$callBack}($tokens, $index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('use', 'The desired language construct.')) - ->setAllowedValues(['print', 'echo']) - ->setDefault('echo') - ->getOption(), - ]); - } - - /** - * @param int $index - */ - private function fixEchoToPrint(Tokens $tokens, $index) - { - $nextTokenIndex = $tokens->getNextMeaningfulToken($index); - $endTokenIndex = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); - $canBeConverted = true; - - for ($i = $nextTokenIndex; $i < $endTokenIndex; ++$i) { - if ($tokens[$i]->equalsAny(['(', [CT::T_ARRAY_SQUARE_BRACE_OPEN]])) { - $blockType = Tokens::detectBlockType($tokens[$i]); - $i = $tokens->findBlockEnd($blockType['type'], $i); - } - - if ($tokens[$i]->equals(',')) { - $canBeConverted = false; - - break; - } - } - - if (false === $canBeConverted) { - return; - } - - $tokens[$index] = new Token([T_PRINT, 'print']); - } - - /** - * @param int $index - */ - private function fixPrintToEcho(Tokens $tokens, $index) - { - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - - if (!$prevToken->equalsAny([';', '{', '}', [T_OPEN_TAG]])) { - return; - } - - $tokens[$index] = new Token([T_ECHO, 'echo']); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php deleted file mode 100644 index a83ba87..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php +++ /dev/null @@ -1,211 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Alias; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class PowToExponentiationFixer extends AbstractFunctionReferenceFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - // minimal candidate to fix is seven tokens: pow(x,x); - return $tokens->count() > 7 && $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Converts `pow` to the `**` operator.', - [ - new CodeSample( - "findPowCalls($tokens); - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - $numberOfTokensAdded = 0; - $previousCloseParenthesisIndex = \count($tokens); - foreach (array_reverse($candidates) as $candidate) { - // if in the previous iteration(s) tokens were added to the collection and this is done within the tokens - // indexes of the current candidate than the index of the close ')' of the candidate has moved and so - // the index needs to be updated - if ($previousCloseParenthesisIndex < $candidate[2]) { - $previousCloseParenthesisIndex = $candidate[2]; - $candidate[2] += $numberOfTokensAdded; - } else { - $previousCloseParenthesisIndex = $candidate[2]; - $numberOfTokensAdded = 0; - } - - $arguments = $argumentsAnalyzer->getArguments($tokens, $candidate[1], $candidate[2]); - if (2 !== \count($arguments)) { - continue; - } - - $numberOfTokensAdded += $this->fixPowToExponentiation( - $tokens, - $candidate[0], // functionNameIndex, - $candidate[1], // openParenthesisIndex, - $candidate[2], // closeParenthesisIndex, - $arguments - ); - } - } - - /** - * @return array[] - */ - private function findPowCalls(Tokens $tokens) - { - $candidates = []; - - // Minimal candidate to fix is seven tokens: pow(x,x); - $end = \count($tokens) - 6; - - // First possible location is after the open token: 1 - for ($i = 1; $i < $end; ++$i) { - $candidate = $this->find('pow', $tokens, $i, $end); - if (null === $candidate) { - break; - } - - $i = $candidate[1]; // proceed to openParenthesisIndex - $candidates[] = $candidate; - } - - return $candidates; - } - - /** - * @param int $functionNameIndex - * @param int $openParenthesisIndex - * @param int $closeParenthesisIndex - * @param array $arguments - * - * @return int number of tokens added to the collection - */ - private function fixPowToExponentiation(Tokens $tokens, $functionNameIndex, $openParenthesisIndex, $closeParenthesisIndex, array $arguments) - { - // find the argument separator ',' directly after the last token of the first argument; - // replace it with T_POW '**' - $tokens[$tokens->getNextTokenOfKind(reset($arguments), [','])] = new Token([T_POW, '**']); - - // clean up the function call tokens prt. I - $tokens->clearAt($closeParenthesisIndex); - $previousIndex = $tokens->getPrevMeaningfulToken($closeParenthesisIndex); - if ($tokens[$previousIndex]->equals(',')) { - $tokens->clearAt($previousIndex); // trailing ',' in function call (PHP 7.3) - } - - $added = 0; - // check if the arguments need to be wrapped in parenthesis - foreach (array_reverse($arguments, true) as $argumentStartIndex => $argumentEndIndex) { - if ($this->isParenthesisNeeded($tokens, $argumentStartIndex, $argumentEndIndex)) { - $tokens->insertAt($argumentEndIndex + 1, new Token(')')); - $tokens->insertAt($argumentStartIndex, new Token('(')); - $added += 2; - } - } - - // clean up the function call tokens prt. II - $tokens->clearAt($openParenthesisIndex); - $tokens->clearAt($functionNameIndex); - - $prev = $tokens->getPrevMeaningfulToken($functionNameIndex); - if ($tokens[$prev]->isGivenKind(T_NS_SEPARATOR)) { - $tokens->clearAt($prev); - } - - return $added; - } - - /** - * @param int $argumentStartIndex - * @param int $argumentEndIndex - * - * @return bool - */ - private function isParenthesisNeeded(Tokens $tokens, $argumentStartIndex, $argumentEndIndex) - { - static $allowedKinds = [ - T_DNUMBER, T_LNUMBER, T_VARIABLE, T_STRING, T_OBJECT_OPERATOR, T_CONSTANT_ENCAPSED_STRING, T_DOUBLE_CAST, - T_INT_CAST, T_INC, T_DEC, T_NS_SEPARATOR, T_WHITESPACE, T_DOUBLE_COLON, T_LINE, T_COMMENT, T_DOC_COMMENT, - CT::T_NAMESPACE_OPERATOR, - ]; - - for ($i = $argumentStartIndex; $i <= $argumentEndIndex; ++$i) { - if ($tokens[$i]->isGivenKind($allowedKinds) || $tokens->isEmptyAt($i)) { - continue; - } - - if (null !== $blockType = Tokens::detectBlockType($tokens[$i])) { - $i = $tokens->findBlockEnd($blockType['type'], $i); - - continue; - } - - if ($tokens[$i]->equals('$')) { - $i = $tokens->getNextMeaningfulToken($i); - if ($tokens[$i]->isGivenKind(CT::T_DYNAMIC_VAR_BRACE_OPEN)) { - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_DYNAMIC_VAR_BRACE, $i); - - continue; - } - } - - if ($tokens[$i]->equals('+') && $tokens->getPrevMeaningfulToken($i) < $argumentStartIndex) { - continue; - } - - return true; - } - - return false; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php deleted file mode 100644 index 665948e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php +++ /dev/null @@ -1,167 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Alias; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Vladimir Reznichenko - */ -final class RandomApiMigrationFixer extends AbstractFunctionReferenceFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @var array - */ - private static $argumentCounts = [ - 'getrandmax' => [0], - 'mt_rand' => [1, 2], - 'rand' => [0, 2], - 'srand' => [0, 1], - ]; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - foreach ($this->configuration['replacements'] as $functionName => $replacement) { - $this->configuration['replacements'][$functionName] = [ - 'alternativeName' => $replacement, - 'argumentCount' => self::$argumentCounts[$functionName], - ]; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replaces `rand`, `srand`, `getrandmax` functions calls with their `mt_*` analogs.', - [ - new CodeSample(" ['getrandmax' => 'mt_getrandmax']] - ), - ], - null, - 'Risky when the configured functions are overridden.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - foreach ($this->configuration['replacements'] as $functionIdentity => $functionReplacement) { - if ($functionIdentity === $functionReplacement['alternativeName']) { - continue; - } - - $currIndex = 0; - while (null !== $currIndex) { - // try getting function reference and translate boundaries for humans - $boundaries = $this->find($functionIdentity, $tokens, $currIndex, $tokens->count() - 1); - if (null === $boundaries) { - // next function search, as current one not found - continue 2; - } - - list($functionName, $openParenthesis, $closeParenthesis) = $boundaries; - $count = $argumentsAnalyzer->countArguments($tokens, $openParenthesis, $closeParenthesis); - if (!\in_array($count, $functionReplacement['argumentCount'], true)) { - continue 2; - } - - // analysing cursor shift, so nested calls could be processed - $currIndex = $openParenthesis; - - $tokens[$functionName] = new Token([T_STRING, $functionReplacement['alternativeName']]); - - if (0 === $count && 'random_int' === $functionReplacement['alternativeName']) { - $tokens->insertAt($currIndex + 1, [ - new Token([T_LNUMBER, '0']), - new Token(','), - new Token([T_WHITESPACE, ' ']), - new Token([T_STRING, 'getrandmax']), - new Token('('), - new Token(')'), - ]); - - $currIndex += 6; - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolverRootless('replacements', [ - (new FixerOptionBuilder('replacements', 'Mapping between replaced functions with the new ones.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function ($value) { - foreach ($value as $functionName => $replacement) { - if (!\array_key_exists($functionName, self::$argumentCounts)) { - throw new InvalidOptionsException(sprintf( - 'Function "%s" is not handled by the fixer.', - $functionName - )); - } - - if (!\is_string($replacement)) { - throw new InvalidOptionsException(sprintf( - 'Replacement for function "%s" must be a string, "%s" given.', - $functionName, - \is_object($replacement) ? \get_class($replacement) : \gettype($replacement) - )); - } - } - - return true; - }]) - ->setDefault([ - 'getrandmax' => 'mt_getrandmax', - 'rand' => 'mt_rand', - 'srand' => 'mt_srand', - ]) - ->getOption(), - ], $this->getName()); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php deleted file mode 100644 index 71c2b8f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php +++ /dev/null @@ -1,249 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Alias; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class SetTypeToCastFixer extends AbstractFunctionReferenceFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Cast shall be used, not `settype`.', - [ - new CodeSample( - 'isAllTokenKindsFound([T_CONSTANT_ENCAPSED_STRING, T_STRING, T_VARIABLE]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $map = [ - 'array' => [T_ARRAY_CAST, '(array)'], - 'bool' => [T_BOOL_CAST, '(bool)'], - 'boolean' => [T_BOOL_CAST, '(bool)'], - 'double' => [T_DOUBLE_CAST, '(float)'], - 'float' => [T_DOUBLE_CAST, '(float)'], - 'int' => [T_INT_CAST, '(int)'], - 'integer' => [T_INT_CAST, '(int)'], - 'object' => [T_OBJECT_CAST, '(object)'], - 'string' => [T_STRING_CAST, '(string)'], - // note: `'null' is dealt with later on - ]; - - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - foreach (array_reverse($this->findSettypeCalls($tokens)) as $candidate) { - $functionNameIndex = $candidate[0]; - - $arguments = $argumentsAnalyzer->getArguments($tokens, $candidate[1], $candidate[2]); - if (2 !== \count($arguments)) { - continue; // function must be overridden or used incorrectly - } - - $prev = $tokens->getPrevMeaningfulToken($functionNameIndex); - if (!$tokens[$prev]->isGivenKind(T_OPEN_TAG) && !$tokens[$prev]->equalsAny([';', '{'])) { - continue; // return value of the function is used - } - - reset($arguments); - - // --- Test first argument -------------------- - - $firstArgumentStart = key($arguments); - if ($tokens[$firstArgumentStart]->isComment() || $tokens[$firstArgumentStart]->isWhitespace()) { - $firstArgumentStart = $tokens->getNextMeaningfulToken($firstArgumentStart); - } - - if (!$tokens[$firstArgumentStart]->isGivenKind(T_VARIABLE)) { - continue; // settype only works with variables pass by reference, function must be overridden - } - - $commaIndex = $tokens->getNextMeaningfulToken($firstArgumentStart); - - if (null === $commaIndex || !$tokens[$commaIndex]->equals(',')) { - continue; // first argument is complex statement; function must be overridden - } - - // --- Test second argument ------------------- - - next($arguments); - $secondArgumentStart = key($arguments); - $secondArgumentEnd = $arguments[$secondArgumentStart]; - - if ($tokens[$secondArgumentStart]->isComment() || $tokens[$secondArgumentStart]->isWhitespace()) { - $secondArgumentStart = $tokens->getNextMeaningfulToken($secondArgumentStart); - } - - if ( - !$tokens[$secondArgumentStart]->isGivenKind(T_CONSTANT_ENCAPSED_STRING) - || $tokens->getNextMeaningfulToken($secondArgumentStart) < $secondArgumentEnd - ) { - continue; // second argument is of the wrong type or is a (complex) statement of some sort (function is overridden) - } - - // --- Test type ------------------------------ - - $type = strtolower(trim($tokens[$secondArgumentStart]->getContent(), '"\'"')); - - if ('null' !== $type && !isset($map[$type])) { - continue; // we don't know how to map - } - - // --- Fixing --------------------------------- - - $argumentToken = $tokens[$firstArgumentStart]; - - $this->removeSettypeCall( - $tokens, - $functionNameIndex, - $candidate[1], - $firstArgumentStart, - $commaIndex, - $secondArgumentStart, - $candidate[2] - ); - - if ('null' === $type) { - $this->findSettypeNullCall($tokens, $functionNameIndex, $argumentToken); - } else { - $this->fixSettypeCall($tokens, $functionNameIndex, $argumentToken, new Token($map[$type])); - } - } - } - - private function findSettypeCalls(Tokens $tokens) - { - $candidates = []; - - $end = \count($tokens); - for ($i = 1; $i < $end; ++$i) { - $candidate = $this->find('settype', $tokens, $i, $end); - if (null === $candidate) { - break; - } - - $i = $candidate[1]; // proceed to openParenthesisIndex - $candidates[] = $candidate; - } - - return $candidates; - } - - /** - * @param int $functionNameIndex - * @param int $openParenthesisIndex - * @param int $firstArgumentStart - * @param int $commaIndex - * @param int $secondArgumentStart - * @param int $closeParenthesisIndex - */ - private function removeSettypeCall( - Tokens $tokens, - $functionNameIndex, - $openParenthesisIndex, - $firstArgumentStart, - $commaIndex, - $secondArgumentStart, - $closeParenthesisIndex - ) { - $tokens->clearTokenAndMergeSurroundingWhitespace($closeParenthesisIndex); - $prevIndex = $tokens->getPrevMeaningfulToken($closeParenthesisIndex); - if ($tokens[$prevIndex]->equals(',')) { - $tokens->clearTokenAndMergeSurroundingWhitespace($prevIndex); - } - $tokens->clearTokenAndMergeSurroundingWhitespace($secondArgumentStart); - $tokens->clearTokenAndMergeSurroundingWhitespace($commaIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($firstArgumentStart); - $tokens->clearTokenAndMergeSurroundingWhitespace($openParenthesisIndex); - $tokens->clearAt($functionNameIndex); // we'll be inserting here so no need to merge the space tokens - $tokens->clearEmptyTokens(); - } - - /** - * @param int $functionNameIndex - */ - private function fixSettypeCall( - Tokens $tokens, - $functionNameIndex, - Token $argumentToken, - Token $castToken - ) { - $tokens->insertAt( - $functionNameIndex, - [ - clone $argumentToken, - new Token([T_WHITESPACE, ' ']), - new Token('='), - new Token([T_WHITESPACE, ' ']), - $castToken, - new Token([T_WHITESPACE, ' ']), - clone $argumentToken, - ] - ); - - $tokens->removeTrailingWhitespace($functionNameIndex + 6); // 6 = number of inserted tokens -1 for offset correction - } - - /** - * @param int $functionNameIndex - */ - private function findSettypeNullCall( - Tokens $tokens, - $functionNameIndex, - Token $argumentToken - ) { - $tokens->insertAt( - $functionNameIndex, - [ - clone $argumentToken, - new Token([T_WHITESPACE, ' ']), - new Token('='), - new Token([T_WHITESPACE, ' ']), - new Token([T_STRING, 'null']), - ] - ); - - $tokens->removeTrailingWhitespace($functionNameIndex + 4); // 4 = number of inserted tokens -1 for offset correction - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php deleted file mode 100644 index eaaebf3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php +++ /dev/null @@ -1,149 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gregor Harlan - * @author Sebastiaan Stok - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class ArraySyntaxFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - private $candidateTokenKind; - private $fixCallback; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->resolveCandidateTokenKind(); - $this->resolveFixCallback(); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHP arrays should be declared using the configured syntax.', - [ - new CodeSample( - " 'short'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BinaryOperatorSpacesFixer, TernaryOperatorSpacesFixer. - */ - public function getPriority() - { - return 1; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound($this->candidateTokenKind); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $callback = $this->fixCallback; - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - if ($tokens[$index]->isGivenKind($this->candidateTokenKind)) { - $this->{$callback}($tokens, $index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('syntax', 'Whether to use the `long` or `short` array syntax.')) - ->setAllowedValues(['long', 'short']) - ->setDefault('long') - ->getOption(), - ]); - } - - /** - * @param int $index - */ - private function fixToLongArraySyntax(Tokens $tokens, $index) - { - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index); - - $tokens[$index] = new Token('('); - $tokens[$closeIndex] = new Token(')'); - - $tokens->insertAt($index, new Token([T_ARRAY, 'array'])); - } - - /** - * @param int $index - */ - private function fixToShortArraySyntax(Tokens $tokens, $index) - { - $openIndex = $tokens->getNextTokenOfKind($index, ['(']); - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - - $tokens[$openIndex] = new Token([CT::T_ARRAY_SQUARE_BRACE_OPEN, '[']); - $tokens[$closeIndex] = new Token([CT::T_ARRAY_SQUARE_BRACE_CLOSE, ']']); - - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - - private function resolveFixCallback() - { - $this->fixCallback = sprintf('fixTo%sArraySyntax', ucfirst($this->configuration['syntax'])); - } - - private function resolveCandidateTokenKind() - { - $this->candidateTokenKind = 'long' === $this->configuration['syntax'] ? CT::T_ARRAY_SQUARE_BRACE_OPEN : T_ARRAY; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoMultilineWhitespaceAroundDoubleArrowFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoMultilineWhitespaceAroundDoubleArrowFixer.php deleted file mode 100644 index cd24bf8..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoMultilineWhitespaceAroundDoubleArrowFixer.php +++ /dev/null @@ -1,86 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Carlos Cirello - * @author Dariusz Rumiński - * @author Graham Campbell - */ -final class NoMultilineWhitespaceAroundDoubleArrowFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Operator `=>` should not be surrounded by multi-line whitespaces.', - [new CodeSample(" 2);\n")] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BinaryOperatorSpacesFixer, TrailingCommaInMultilineArrayFixer. - */ - public function getPriority() - { - return 1; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOUBLE_ARROW); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOUBLE_ARROW)) { - continue; - } - - $this->fixWhitespace($tokens, $index - 1); - // do not move anything about if there is a comment following the whitespace - if (!$tokens[$index + 2]->isComment()) { - $this->fixWhitespace($tokens, $index + 1); - } - } - } - - /** - * @param int $index - */ - private function fixWhitespace(Tokens $tokens, $index) - { - $token = $tokens[$index]; - - if ($token->isWhitespace() && !$token->isWhitespace(" \t")) { - $tokens[$index] = new Token([T_WHITESPACE, rtrim($token->getContent()).' ']); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoTrailingCommaInSinglelineArrayFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoTrailingCommaInSinglelineArrayFixer.php deleted file mode 100644 index f2a1017..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoTrailingCommaInSinglelineArrayFixer.php +++ /dev/null @@ -1,89 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Dariusz Rumiński - * @author Sebastiaan Stok - */ -final class NoTrailingCommaInSinglelineArrayFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHP single-line arrays should not have trailing comma.', - [new CodeSample("isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = 0, $c = $tokens->count(); $index < $c; ++$index) { - if ($tokensAnalyzer->isArray($index)) { - $this->fixArray($tokens, $index); - } - } - } - - /** - * @param int $index - */ - private function fixArray(Tokens $tokens, $index) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - if ($tokensAnalyzer->isArrayMultiLine($index)) { - return; - } - - $startIndex = $index; - - if ($tokens[$startIndex]->isGivenKind(T_ARRAY)) { - $startIndex = $tokens->getNextTokenOfKind($startIndex, ['(']); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - } else { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $startIndex); - } - - $beforeEndIndex = $tokens->getPrevMeaningfulToken($endIndex); - $beforeEndToken = $tokens[$beforeEndIndex]; - - if ($beforeEndToken->equals(',')) { - $tokens->removeTrailingWhitespace($beforeEndIndex); - $tokens->clearAt($beforeEndIndex); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php deleted file mode 100644 index 266be3d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php +++ /dev/null @@ -1,152 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerConfiguration\InvalidOptionsForEnvException; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author Adam Marczuk - */ -final class NoWhitespaceBeforeCommaInArrayFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'In array declaration, there MUST NOT be a whitespace before each comma.', - [ - new CodeSample(" true] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if ($tokens[$index]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - $this->fixSpacing($index, $tokens); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('after_heredoc', 'Whether the whitespace between heredoc end and comma should be removed.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->setNormalizer(static function (Options $options, $value) { - if (\PHP_VERSION_ID < 70300 && $value) { - throw new InvalidOptionsForEnvException('"after_heredoc" option can only be enabled with PHP 7.3+.'); - } - - return $value; - }) - ->getOption(), - ]); - } - - /** - * Method to fix spacing in array declaration. - * - * @param int $index - */ - private function fixSpacing($index, Tokens $tokens) - { - if ($tokens[$index]->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $startIndex = $index; - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $startIndex); - } else { - $startIndex = $tokens->getNextTokenOfKind($index, ['(']); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - } - - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - $i = $this->skipNonArrayElements($i, $tokens); - $currentToken = $tokens[$i]; - $prevIndex = $tokens->getPrevNonWhitespace($i - 1); - - if ( - $currentToken->equals(',') && !$tokens[$prevIndex]->isComment() && - ($this->configuration['after_heredoc'] || !$tokens[$prevIndex]->equals([T_END_HEREDOC])) - ) { - $tokens->removeLeadingWhitespace($i); - } - } - } - - /** - * Method to move index over the non-array elements like function calls or function declarations. - * - * @param int $index - * - * @return int New index - */ - private function skipNonArrayElements($index, Tokens $tokens) - { - if ($tokens[$index]->equals('}')) { - return $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - } - - if ($tokens[$index]->equals(')')) { - $startIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - $startIndex = $tokens->getPrevMeaningfulToken($startIndex); - if (!$tokens[$startIndex]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - return $startIndex; - } - } - - return $index; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php deleted file mode 100644 index 733dc23..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php +++ /dev/null @@ -1,59 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class NormalizeIndexBraceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Array index should always be written by using square braces.', - [new CodeSample("isTokenKindFound(CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN)) { - $tokens[$index] = new Token('['); - } elseif ($token->isGivenKind(CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE)) { - $tokens[$index] = new Token(']'); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrailingCommaInMultilineArrayFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrailingCommaInMultilineArrayFixer.php deleted file mode 100644 index 7ab031d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrailingCommaInMultilineArrayFixer.php +++ /dev/null @@ -1,147 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerConfiguration\InvalidOptionsForEnvException; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author Sebastiaan Stok - * @author Dariusz Rumiński - */ -final class TrailingCommaInMultilineArrayFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHP multi-line arrays should have a trailing comma.', - [ - new CodeSample(" true] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after NoMultilineWhitespaceAroundDoubleArrowFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if ($tokensAnalyzer->isArray($index) && $tokensAnalyzer->isArrayMultiLine($index)) { - $this->fixArray($tokens, $index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('after_heredoc', 'Whether a trailing comma should also be placed after heredoc end.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->setNormalizer(static function (Options $options, $value) { - if (\PHP_VERSION_ID < 70300 && $value) { - throw new InvalidOptionsForEnvException('"after_heredoc" option can only be enabled with PHP 7.3+.'); - } - - return $value; - }) - ->getOption(), - ]); - } - - /** - * @param int $index - */ - private function fixArray(Tokens $tokens, $index) - { - $startIndex = $index; - - if ($tokens[$startIndex]->isGivenKind(T_ARRAY)) { - $startIndex = $tokens->getNextTokenOfKind($startIndex, ['(']); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - } else { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $startIndex); - } - - $beforeEndIndex = $tokens->getPrevMeaningfulToken($endIndex); - $beforeEndToken = $tokens[$beforeEndIndex]; - - // if there is some item between braces then add `,` after it - if ( - $startIndex !== $beforeEndIndex && !$beforeEndToken->equals(',') && - ($this->configuration['after_heredoc'] || !$beforeEndToken->isGivenKind(T_END_HEREDOC)) - ) { - $tokens->insertAt($beforeEndIndex + 1, new Token(',')); - - $endToken = $tokens[$endIndex]; - - if (!$endToken->isComment() && !$endToken->isWhitespace()) { - $tokens->ensureWhitespaceAtIndex($endIndex, 1, ' '); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrimArraySpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrimArraySpacesFixer.php deleted file mode 100644 index a5bbc67..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrimArraySpacesFixer.php +++ /dev/null @@ -1,103 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jared Henderson - */ -final class TrimArraySpacesFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Arrays should be formatted like function/method arguments, without leading or trailing single line space.', - [new CodeSample("isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = 0, $c = $tokens->count(); $index < $c; ++$index) { - if ($tokens[$index]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - self::fixArray($tokens, $index); - } - } - } - - /** - * Method to trim leading/trailing whitespace within single line arrays. - * - * @param int $index - */ - private static function fixArray(Tokens $tokens, $index) - { - $startIndex = $index; - - if ($tokens[$startIndex]->isGivenKind(T_ARRAY)) { - $startIndex = $tokens->getNextMeaningfulToken($startIndex); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - } else { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $startIndex); - } - - $nextIndex = $startIndex + 1; - $nextToken = $tokens[$nextIndex]; - $nextNonWhitespaceIndex = $tokens->getNextNonWhitespace($startIndex); - $nextNonWhitespaceToken = $tokens[$nextNonWhitespaceIndex]; - $tokenAfterNextNonWhitespaceToken = $tokens[$nextNonWhitespaceIndex + 1]; - - $prevIndex = $endIndex - 1; - $prevToken = $tokens[$prevIndex]; - $prevNonWhitespaceIndex = $tokens->getPrevNonWhitespace($endIndex); - $prevNonWhitespaceToken = $tokens[$prevNonWhitespaceIndex]; - - if ( - $nextToken->isWhitespace(" \t") - && ( - !$nextNonWhitespaceToken->isComment() - || $nextNonWhitespaceIndex === $prevNonWhitespaceIndex - || $tokenAfterNextNonWhitespaceToken->isWhitespace(" \t") - || '/*' === substr($nextNonWhitespaceToken->getContent(), 0, 2) - ) - ) { - $tokens->clearAt($nextIndex); - } - - if ( - $prevToken->isWhitespace(" \t") - && !$prevNonWhitespaceToken->equals(',') - ) { - $tokens->clearAt($prevIndex); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/WhitespaceAfterCommaInArrayFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/WhitespaceAfterCommaInArrayFixer.php deleted file mode 100644 index bda2e59..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/WhitespaceAfterCommaInArrayFixer.php +++ /dev/null @@ -1,104 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Adam Marczuk - */ -final class WhitespaceAfterCommaInArrayFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'In array declaration, there MUST be a whitespace after each comma.', - [new CodeSample("isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if ($tokens[$index]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - $this->fixSpacing($index, $tokens); - } - } - } - - /** - * Method to fix spacing in array declaration. - * - * @param int $index - */ - private function fixSpacing($index, Tokens $tokens) - { - if ($tokens[$index]->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $startIndex = $index; - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $startIndex); - } else { - $startIndex = $tokens->getNextTokenOfKind($index, ['(']); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - } - - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - $i = $this->skipNonArrayElements($i, $tokens); - if ($tokens[$i]->equals(',') && !$tokens[$i + 1]->isWhitespace()) { - $tokens->insertAt($i + 1, new Token([T_WHITESPACE, ' '])); - } - } - } - - /** - * Method to move index over the non-array elements like function calls or function declarations. - * - * @param int $index - * - * @return int New index - */ - private function skipNonArrayElements($index, Tokens $tokens) - { - if ($tokens[$index]->equals('}')) { - return $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - } - - if ($tokens[$index]->equals(')')) { - $startIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - $startIndex = $tokens->getPrevMeaningfulToken($startIndex); - if (!$tokens[$startIndex]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - return $startIndex; - } - } - - return $index; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php deleted file mode 100644 index 3af7675..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php +++ /dev/null @@ -1,1070 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Basic; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * Fixer for rules defined in PSR2 ¶4.1, ¶4.4, ¶5. - * - * @author Dariusz Rumiński - */ -final class BracesFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @internal - */ - const LINE_NEXT = 'next'; - - /** - * @internal - */ - const LINE_SAME = 'same'; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'The body of each structure MUST be enclosed by braces. Braces should be properly placed. Body of braces should be properly indented.', - [ - new CodeSample( - '= 0; }; -$negative = function ($item) { - return $item < 0; }; -', - ['allow_single_line_closure' => true] - ), - new CodeSample( - ' self::LINE_SAME] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before ArrayIndentationFixer, MethodArgumentSpaceFixer, MethodChainingIndentationFixer. - * Must run after ClassAttributesSeparationFixer, ElseifFixer, LineEndingFixer, MethodSeparationFixer, NoAlternativeSyntaxFixer, NoEmptyStatementFixer, NoUselessElseFixer, SingleTraitInsertPerStatementFixer. - */ - public function getPriority() - { - return -25; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $this->fixCommentBeforeBrace($tokens); - $this->fixMissingControlBraces($tokens); - $this->fixIndents($tokens); - $this->fixControlContinuationBraces($tokens); - $this->fixSpaceAroundToken($tokens); - $this->fixDoWhile($tokens); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('allow_single_line_closure', 'Whether single line lambda notation should be allowed.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('position_after_functions_and_oop_constructs', 'whether the opening brace should be placed on "next" or "same" line after classy constructs (non-anonymous classes, interfaces, traits, methods and non-lambda functions).')) - ->setAllowedValues([self::LINE_NEXT, self::LINE_SAME]) - ->setDefault(self::LINE_NEXT) - ->getOption(), - (new FixerOptionBuilder('position_after_control_structures', 'whether the opening brace should be placed on "next" or "same" line after control structures.')) - ->setAllowedValues([self::LINE_NEXT, self::LINE_SAME]) - ->setDefault(self::LINE_SAME) - ->getOption(), - (new FixerOptionBuilder('position_after_anonymous_constructs', 'whether the opening brace should be placed on "next" or "same" line after anonymous constructs (anonymous classes and lambda functions).')) - ->setAllowedValues([self::LINE_NEXT, self::LINE_SAME]) - ->setDefault(self::LINE_SAME) - ->getOption(), - ]); - } - - private function fixCommentBeforeBrace(Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $controlTokens = $this->getControlTokens(); - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind($controlTokens)) { - $prevIndex = $this->findParenthesisEnd($tokens, $index); - } elseif ( - ($token->isGivenKind(T_FUNCTION) && $tokensAnalyzer->isLambda($index)) || - ($token->isGivenKind(T_CLASS) && $tokensAnalyzer->isAnonymousClass($index)) - ) { - $prevIndex = $tokens->getNextTokenOfKind($index, ['{']); - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - } else { - continue; - } - - $commentIndex = $tokens->getNextNonWhitespace($prevIndex); - $commentToken = $tokens[$commentIndex]; - - if (!$commentToken->isGivenKind(T_COMMENT) || 0 === strpos($commentToken->getContent(), '/*')) { - continue; - } - - $braceIndex = $tokens->getNextMeaningfulToken($commentIndex); - $braceToken = $tokens[$braceIndex]; - - if (!$braceToken->equals('{')) { - continue; - } - - /** @var Token $tokenTmp */ - $tokenTmp = $tokens[$braceIndex]; - - $newBraceIndex = $prevIndex + 1; - for ($i = $braceIndex; $i > $newBraceIndex; --$i) { - // we might be moving one white space next to another, these have to be merged - /** @var Token $previousToken */ - $previousToken = $tokens[$i - 1]; - $tokens[$i] = $previousToken; - if ($tokens[$i]->isWhitespace() && $tokens[$i + 1]->isWhitespace()) { - $tokens[$i] = new Token([T_WHITESPACE, $tokens[$i]->getContent().$tokens[$i + 1]->getContent()]); - $tokens->clearAt($i + 1); - } - } - - $tokens[$newBraceIndex] = $tokenTmp; - $c = $tokens[$braceIndex]->getContent(); - if (substr_count($c, "\n") > 1) { - // left trim till last line break - $tokens[$braceIndex] = new Token([T_WHITESPACE, substr($c, strrpos($c, "\n"))]); - } - } - } - - private function fixControlContinuationBraces(Tokens $tokens) - { - $controlContinuationTokens = $this->getControlContinuationTokens(); - - for ($index = \count($tokens) - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind($controlContinuationTokens)) { - continue; - } - - $prevIndex = $tokens->getPrevNonWhitespace($index); - $prevToken = $tokens[$prevIndex]; - - if (!$prevToken->equals('}')) { - continue; - } - - $tokens->ensureWhitespaceAtIndex( - $index - 1, - 1, - self::LINE_NEXT === $this->configuration['position_after_control_structures'] ? - $this->whitespacesConfig->getLineEnding().$this->detectIndent($tokens, $index) - : ' ' - ); - } - } - - private function fixDoWhile(Tokens $tokens) - { - for ($index = \count($tokens) - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_DO)) { - continue; - } - - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $index); - $startBraceIndex = $tokens->getNextNonWhitespace($parenthesisEndIndex); - $endBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $startBraceIndex); - $nextNonWhitespaceIndex = $tokens->getNextNonWhitespace($endBraceIndex); - $nextNonWhitespaceToken = $tokens[$nextNonWhitespaceIndex]; - - if (!$nextNonWhitespaceToken->isGivenKind(T_WHILE)) { - continue; - } - - $tokens->ensureWhitespaceAtIndex($nextNonWhitespaceIndex - 1, 1, ' '); - } - } - - private function fixIndents(Tokens $tokens) - { - $classyTokens = Token::getClassyTokenKinds(); - $classyAndFunctionTokens = array_merge([T_FUNCTION], $classyTokens); - $controlTokens = $this->getControlTokens(); - $indentTokens = array_filter( - array_merge($classyAndFunctionTokens, $controlTokens), - static function ($item) { - return T_SWITCH !== $item; - } - ); - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = 0, $limit = \count($tokens); $index < $limit; ++$index) { - $token = $tokens[$index]; - - // if token is not a structure element - continue - if (!$token->isGivenKind($indentTokens)) { - continue; - } - - // do not change indent for `while` in `do ... while ...` - if ( - $token->isGivenKind(T_WHILE) - && $tokensAnalyzer->isWhilePartOfDoWhile($index) - ) { - continue; - } - - if ( - $this->configuration['allow_single_line_closure'] - && $token->isGivenKind(T_FUNCTION) - && $tokensAnalyzer->isLambda($index) - ) { - $braceEndIndex = $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_CURLY_BRACE, - $tokens->getNextTokenOfKind($index, ['{']) - ); - - if (!$this->isMultilined($tokens, $index, $braceEndIndex)) { - $index = $braceEndIndex; - - continue; - } - } - - if ($token->isGivenKind($classyAndFunctionTokens)) { - $startBraceIndex = $tokens->getNextTokenOfKind($index, [';', '{']); - $startBraceToken = $tokens[$startBraceIndex]; - } else { - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $index); - $startBraceIndex = $tokens->getNextNonWhitespace($parenthesisEndIndex); - $startBraceToken = $tokens[$startBraceIndex]; - } - - // structure without braces block - nothing to do, e.g. do { } while (true); - if (!$startBraceToken->equals('{')) { - continue; - } - - $nextNonWhitespaceIndex = $tokens->getNextNonWhitespace($startBraceIndex, " \t"); - $nextNonWhitespace = $tokens[$nextNonWhitespaceIndex]; - - /* if CLOSE_TAG is after { on the same line, do not indent. e.g. */ - if ($nextNonWhitespace->isGivenKind(T_CLOSE_TAG)) { - continue; - } - - /* if CLOSE_TAG is after { on the next line and a comment on this line, do not indent. e.g. */ - if ($nextNonWhitespace->isComment() && $tokens[$tokens->getNextMeaningfulToken($nextNonWhitespaceIndex)]->isGivenKind(T_CLOSE_TAG)) { - continue; - } - - $endBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $startBraceIndex); - - $indent = $this->detectIndent($tokens, $index); - - // fix indent near closing brace - $tokens->ensureWhitespaceAtIndex($endBraceIndex - 1, 1, $this->whitespacesConfig->getLineEnding().$indent); - - // fix indent between braces - $lastCommaIndex = $tokens->getPrevTokenOfKind($endBraceIndex - 1, [';', '}']); - - $nestLevel = 1; - for ($nestIndex = $lastCommaIndex; $nestIndex >= $startBraceIndex; --$nestIndex) { - $nestToken = $tokens[$nestIndex]; - - if ($nestToken->equalsAny([')', [CT::T_BRACE_CLASS_INSTANTIATION_CLOSE]])) { - $nestIndex = $tokens->findBlockStart( - $nestToken->equals(')') ? Tokens::BLOCK_TYPE_PARENTHESIS_BRACE : Tokens::BLOCK_TYPE_BRACE_CLASS_INSTANTIATION, - $nestIndex - ); - - continue; - } - - if (1 === $nestLevel) { - // Next token is the beginning of a line that can be indented when - // the current token is a `;`, a `}` or the opening `{` of current - // scope. Current token may also be a comment that follows `;` or - // `}`, in which case indentation will only be fixed if this - // comment is followed by a newline. - $nextLineCanBeIndented = false; - if ($nestToken->equalsAny([';', '}'])) { - $nextLineCanBeIndented = true; - } elseif ($this->isCommentWithFixableIndentation($tokens, $nestIndex)) { - for ($i = $nestIndex; $i > $startBraceIndex; --$i) { - if ($tokens[$i]->equalsAny([';', '}'])) { - $nextLineCanBeIndented = true; - - break; - } - - if (!$tokens[$i]->isWhitespace() && !$tokens[$i]->isComment()) { - break; - } - } - - if ($nextLineCanBeIndented || $i === $startBraceIndex) { - $nextToken = $tokens[$nestIndex + 1]; - $nextLineCanBeIndented = $nextToken->isWhitespace() && 1 === Preg::match('/\R/', $nextToken->getContent()); - } - } - - if (!$nextLineCanBeIndented) { - continue; - } - - $nextNonWhitespaceNestIndex = $tokens->getNextNonWhitespace($nestIndex); - $nextNonWhitespaceNestToken = $tokens[$nextNonWhitespaceNestIndex]; - - if ( - // next Token is not a comment on its own line - !($nextNonWhitespaceNestToken->isComment() && ( - !$tokens[$nextNonWhitespaceNestIndex - 1]->isWhitespace() - || !Preg::match('/\R/', $tokens[$nextNonWhitespaceNestIndex - 1]->getContent()) - )) && - // and it is not a `$foo = function () {};` situation - !($nestToken->equals('}') && $nextNonWhitespaceNestToken->equalsAny([';', ',', ']', [CT::T_ARRAY_SQUARE_BRACE_CLOSE]])) && - // and it is not a `Foo::{bar}()` situation - !($nestToken->equals('}') && $nextNonWhitespaceNestToken->equals('(')) && - // and it is not a `${"a"}->...` and `${"b{$foo}"}->...` situation - !($nestToken->equals('}') && $tokens[$nestIndex - 1]->equalsAny(['"', "'", [T_CONSTANT_ENCAPSED_STRING], [T_VARIABLE]])) && - // and next token is not a closing tag that would break heredoc/nowdoc syntax - !($tokens[$nestIndex - 1]->isGivenKind(T_END_HEREDOC) && $nextNonWhitespaceNestToken->isGivenKind(T_CLOSE_TAG)) - ) { - if ( - ( - self::LINE_NEXT !== $this->configuration['position_after_control_structures'] - && $nextNonWhitespaceNestToken->isGivenKind($this->getControlContinuationTokens()) - && !$tokens[$tokens->getPrevNonWhitespace($nextNonWhitespaceNestIndex)]->isComment() - ) - || $nextNonWhitespaceNestToken->isGivenKind(T_CLOSE_TAG) - || ( - self::LINE_NEXT !== $this->configuration['position_after_control_structures'] - && $nextNonWhitespaceNestToken->isGivenKind(T_WHILE) - && $tokensAnalyzer->isWhilePartOfDoWhile($nextNonWhitespaceNestIndex) - ) - ) { - $whitespace = ' '; - } else { - $nextToken = $tokens[$nestIndex + 1]; - $nextWhitespace = ''; - - if ($nextToken->isWhitespace()) { - $nextWhitespace = rtrim($nextToken->getContent(), " \t"); - - if ('' !== $nextWhitespace) { - $nextWhitespace = Preg::replace( - sprintf('/%s$/', $this->whitespacesConfig->getLineEnding()), - '', - $nextWhitespace, - 1 - ); - } - } - - $whitespace = $nextWhitespace.$this->whitespacesConfig->getLineEnding().$indent; - - if (!$nextNonWhitespaceNestToken->equals('}')) { - $determineIsIndentableBlockContent = static function ($contentIndex) use ($tokens) { - if (!$tokens[$contentIndex]->isComment()) { - return true; - } - - if (!$tokens[$tokens->getPrevMeaningfulToken($contentIndex)]->equals(';')) { - return true; - } - - $nextIndex = $tokens->getNextMeaningfulToken($contentIndex); - - if (!$tokens[$nextIndex]->equals('}')) { - return true; - } - - $nextNextIndex = $tokens->getNextMeaningfulToken($nextIndex); - - if (null === $nextNextIndex) { - return true; - } - - if ($tokens[$nextNextIndex]->equalsAny([ - [T_ELSE], - [T_ELSEIF], - ',', - ])) { - return false; - } - - return true; - }; - - // add extra indent only if current content is not a comment for content outside of current block - if ($determineIsIndentableBlockContent($nestIndex + 2)) { - $whitespace .= $this->whitespacesConfig->getIndent(); - } - } - } - - $this->ensureWhitespaceAtIndexAndIndentMultilineComment($tokens, $nestIndex + 1, $whitespace); - } - } - - if ($nestToken->equals('}')) { - ++$nestLevel; - - continue; - } - - if ($nestToken->equals('{')) { - --$nestLevel; - - continue; - } - } - - // fix indent near opening brace - if (isset($tokens[$startBraceIndex + 2]) && $tokens[$startBraceIndex + 2]->equals('}')) { - $tokens->ensureWhitespaceAtIndex($startBraceIndex + 1, 0, $this->whitespacesConfig->getLineEnding().$indent); - } else { - $nextToken = $tokens[$startBraceIndex + 1]; - $nextNonWhitespaceToken = $tokens[$tokens->getNextNonWhitespace($startBraceIndex)]; - - // set indent only if it is not a case, when comment is following { on same line - if ( - !$nextNonWhitespaceToken->isComment() - || ($nextToken->isWhitespace() && 1 === substr_count($nextToken->getContent(), "\n")) // preserve blank lines - ) { - $this->ensureWhitespaceAtIndexAndIndentMultilineComment( - $tokens, - $startBraceIndex + 1, - $this->whitespacesConfig->getLineEnding().$indent.$this->whitespacesConfig->getIndent() - ); - } - } - - if ($token->isGivenKind($classyTokens) && !$tokensAnalyzer->isAnonymousClass($index)) { - if (self::LINE_SAME === $this->configuration['position_after_functions_and_oop_constructs'] && !$tokens[$tokens->getPrevNonWhitespace($startBraceIndex)]->isComment()) { - $ensuredWhitespace = ' '; - } else { - $ensuredWhitespace = $this->whitespacesConfig->getLineEnding().$indent; - } - - $tokens->ensureWhitespaceAtIndex($startBraceIndex - 1, 1, $ensuredWhitespace); - } elseif ( - $token->isGivenKind(T_FUNCTION) && !$tokensAnalyzer->isLambda($index) - || ( - self::LINE_NEXT === $this->configuration['position_after_control_structures'] && $token->isGivenKind($controlTokens) - || ( - self::LINE_NEXT === $this->configuration['position_after_anonymous_constructs'] - && ( - $token->isGivenKind(T_FUNCTION) && $tokensAnalyzer->isLambda($index) - || $token->isGivenKind(T_CLASS) && $tokensAnalyzer->isAnonymousClass($index) - ) - ) - ) - ) { - $isAnonymousClass = $token->isGivenKind($classyTokens) && $tokensAnalyzer->isAnonymousClass($index); - - $closingParenthesisIndex = $tokens->getPrevTokenOfKind($startBraceIndex, [')']); - if (null === $closingParenthesisIndex && !$isAnonymousClass) { - continue; - } - - if ( - !$isAnonymousClass - && $tokens[$closingParenthesisIndex - 1]->isWhitespace() - && false !== strpos($tokens[$closingParenthesisIndex - 1]->getContent(), "\n") - ) { - if (!$tokens[$startBraceIndex - 2]->isComment()) { - $tokens->ensureWhitespaceAtIndex($startBraceIndex - 1, 1, ' '); - } - } else { - if ( - self::LINE_SAME === $this->configuration['position_after_functions_and_oop_constructs'] - && ( - $token->isGivenKind(T_FUNCTION) && !$tokensAnalyzer->isLambda($index) - || $token->isGivenKind($classyTokens) && !$tokensAnalyzer->isAnonymousClass($index) - ) - && !$tokens[$tokens->getPrevNonWhitespace($startBraceIndex)]->isComment() - ) { - $ensuredWhitespace = ' '; - } else { - $ensuredWhitespace = $this->whitespacesConfig->getLineEnding().$indent; - } - - $tokens->ensureWhitespaceAtIndex($startBraceIndex - 1, 1, $ensuredWhitespace); - } - } else { - $tokens->ensureWhitespaceAtIndex($startBraceIndex - 1, 1, ' '); - } - - // reset loop limit due to collection change - $limit = \count($tokens); - } - } - - private function fixMissingControlBraces(Tokens $tokens) - { - $controlTokens = $this->getControlTokens(); - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind($controlTokens)) { - continue; - } - - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $index); - $nextAfterParenthesisEndIndex = $tokens->getNextMeaningfulToken($parenthesisEndIndex); - $tokenAfterParenthesis = $tokens[$nextAfterParenthesisEndIndex]; - - // if Token after parenthesis is { then we do not need to insert brace, but to fix whitespace before it - if ($tokenAfterParenthesis->equals('{') && self::LINE_SAME === $this->configuration['position_after_control_structures']) { - $tokens->ensureWhitespaceAtIndex($parenthesisEndIndex + 1, 0, ' '); - - continue; - } - - // do not add braces for cases: - // - structure without block, e.g. while ($iter->next()); - // - structure with block, e.g. while ($i) {...}, while ($i) : {...} endwhile; - if ($tokenAfterParenthesis->equalsAny([';', '{', ':'])) { - continue; - } - - // do not add for short 'if' followed by alternative loop, - // for example: if ($a) while ($b): ? > X < ?php endwhile; ? > - if ($tokenAfterParenthesis->isGivenKind([T_FOR, T_FOREACH, T_SWITCH, T_WHILE])) { - $tokenAfterParenthesisBlockEnd = $tokens->findBlockEnd( // go to ')' - Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $tokens->getNextMeaningfulToken($nextAfterParenthesisEndIndex) - ); - - if ($tokens[$tokens->getNextMeaningfulToken($tokenAfterParenthesisBlockEnd)]->equals(':')) { - continue; - } - } - - $statementEndIndex = $this->findStatementEnd($tokens, $parenthesisEndIndex); - - // insert closing brace - $tokens->insertAt($statementEndIndex + 1, [new Token([T_WHITESPACE, ' ']), new Token('}')]); - - // insert missing `;` if needed - if (!$tokens[$statementEndIndex]->equalsAny([';', '}'])) { - $tokens->insertAt($statementEndIndex + 1, new Token(';')); - } - - // insert opening brace - $tokens->insertAt($parenthesisEndIndex + 1, new Token('{')); - $tokens->ensureWhitespaceAtIndex($parenthesisEndIndex + 1, 0, ' '); - } - } - - private function fixSpaceAroundToken(Tokens $tokens) - { - $controlTokens = $this->getControlTokens(); - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - // Declare tokens don't follow the same rules are other control statements - if ($token->isGivenKind(T_DECLARE)) { - $this->fixDeclareStatement($tokens, $index); - } elseif ($token->isGivenKind($controlTokens) || $token->isGivenKind(CT::T_USE_LAMBDA)) { - $nextNonWhitespaceIndex = $tokens->getNextNonWhitespace($index); - - if (!$tokens[$nextNonWhitespaceIndex]->equals(':')) { - $tokens->ensureWhitespaceAtIndex( - $index + 1, - 0, - self::LINE_NEXT === $this->configuration['position_after_control_structures'] && !$tokens[$nextNonWhitespaceIndex]->equals('(') ? - $this->whitespacesConfig->getLineEnding().$this->detectIndent($tokens, $index) - : ' ' - ); - } - - $prevToken = $tokens[$index - 1]; - - if (!$prevToken->isWhitespace() && !$prevToken->isComment() && !$prevToken->isGivenKind(T_OPEN_TAG)) { - $tokens->ensureWhitespaceAtIndex($index - 1, 1, ' '); - } - } - } - } - - /** - * @param int $index - * - * @return string - */ - private function detectIndent(Tokens $tokens, $index) - { - while (true) { - $whitespaceIndex = $tokens->getPrevTokenOfKind($index, [[T_WHITESPACE]]); - - if (null === $whitespaceIndex) { - return ''; - } - - $whitespaceToken = $tokens[$whitespaceIndex]; - - if (false !== strpos($whitespaceToken->getContent(), "\n")) { - break; - } - - $prevToken = $tokens[$whitespaceIndex - 1]; - - if ($prevToken->isGivenKind([T_OPEN_TAG, T_COMMENT]) && "\n" === substr($prevToken->getContent(), -1)) { - break; - } - - $index = $whitespaceIndex; - } - - $explodedContent = explode("\n", $whitespaceToken->getContent()); - - return end($explodedContent); - } - - /** - * @param int $structureTokenIndex - * - * @return int - */ - private function findParenthesisEnd(Tokens $tokens, $structureTokenIndex) - { - $nextIndex = $tokens->getNextMeaningfulToken($structureTokenIndex); - $nextToken = $tokens[$nextIndex]; - - // return if next token is not opening parenthesis - if (!$nextToken->equals('(')) { - return $structureTokenIndex; - } - - return $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $nextIndex); - } - - /** - * @param int $parenthesisEndIndex - * - * @return int - */ - private function findStatementEnd(Tokens $tokens, $parenthesisEndIndex) - { - $nextIndex = $tokens->getNextMeaningfulToken($parenthesisEndIndex); - $nextToken = $tokens[$nextIndex]; - - if (!$nextToken) { - return $parenthesisEndIndex; - } - - if ($nextToken->equals('{')) { - return $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $nextIndex); - } - - if ($nextToken->isGivenKind($this->getControlTokens())) { - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $nextIndex); - - $endIndex = $this->findStatementEnd($tokens, $parenthesisEndIndex); - - if ($nextToken->isGivenKind([T_IF, T_TRY, T_DO])) { - $openingTokenKind = $nextToken->getId(); - - while (true) { - $nextIndex = $tokens->getNextMeaningfulToken($endIndex); - $nextToken = isset($nextIndex) ? $tokens[$nextIndex] : null; - if ($nextToken && $nextToken->isGivenKind($this->getControlContinuationTokensForOpeningToken($openingTokenKind))) { - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $nextIndex); - - $endIndex = $this->findStatementEnd($tokens, $parenthesisEndIndex); - - if ($nextToken->isGivenKind($this->getFinalControlContinuationTokensForOpeningToken($openingTokenKind))) { - return $endIndex; - } - } else { - break; - } - } - } - - return $endIndex; - } - - $index = $parenthesisEndIndex; - - while (true) { - $token = $tokens[++$index]; - - // if there is some block in statement (eg lambda function) we need to skip it - if ($token->equals('{')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if ($token->equals(';')) { - return $index; - } - - if ($token->isGivenKind(T_CLOSE_TAG)) { - return $tokens->getPrevNonWhitespace($index); - } - } - } - - private function getControlTokens() - { - static $tokens = [ - T_DECLARE, - T_DO, - T_ELSE, - T_ELSEIF, - T_FINALLY, - T_FOR, - T_FOREACH, - T_IF, - T_WHILE, - T_TRY, - T_CATCH, - T_SWITCH, - ]; - - return $tokens; - } - - private function getControlContinuationTokens() - { - static $tokens = [ - T_CATCH, - T_ELSE, - T_ELSEIF, - T_FINALLY, - ]; - - return $tokens; - } - - private function getControlContinuationTokensForOpeningToken($openingTokenKind) - { - if (T_IF === $openingTokenKind) { - return [ - T_ELSE, - T_ELSEIF, - ]; - } - - if (T_DO === $openingTokenKind) { - return [T_WHILE]; - } - - if (T_TRY === $openingTokenKind) { - return [ - T_CATCH, - T_FINALLY, - ]; - } - - return []; - } - - private function getFinalControlContinuationTokensForOpeningToken($openingTokenKind) - { - if (T_IF === $openingTokenKind) { - return [T_ELSE]; - } - - if (T_TRY === $openingTokenKind) { - return [T_FINALLY]; - } - - return []; - } - - /** - * @param int $index - */ - private function fixDeclareStatement(Tokens $tokens, $index) - { - $tokens->removeTrailingWhitespace($index); - - $startParenthesisIndex = $tokens->getNextTokenOfKind($index, ['(']); - $tokens->removeTrailingWhitespace($startParenthesisIndex); - - $endParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startParenthesisIndex); - $tokens->removeLeadingWhitespace($endParenthesisIndex); - - $startBraceIndex = $tokens->getNextTokenOfKind($endParenthesisIndex, [';', '{']); - $startBraceToken = $tokens[$startBraceIndex]; - - if ($startBraceToken->equals('{')) { - $this->fixSingleLineWhitespaceForDeclare($tokens, $startBraceIndex); - } - } - - /** - * @param int $startBraceIndex - */ - private function fixSingleLineWhitespaceForDeclare(Tokens $tokens, $startBraceIndex) - { - // fix single-line whitespace before { - // eg: `declare(ticks=1){` => `declare(ticks=1) {` - // eg: `declare(ticks=1) {` => `declare(ticks=1) {` - if ( - !$tokens[$startBraceIndex - 1]->isWhitespace() || - $tokens[$startBraceIndex - 1]->isWhitespace(" \t") - ) { - $tokens->ensureWhitespaceAtIndex($startBraceIndex - 1, 1, ' '); - } - } - - /** - * @param int $index - * @param string $whitespace - */ - private function ensureWhitespaceAtIndexAndIndentMultilineComment(Tokens $tokens, $index, $whitespace) - { - if ($tokens[$index]->isWhitespace()) { - $nextTokenIndex = $tokens->getNextNonWhitespace($index); - } else { - $nextTokenIndex = $index; - } - - $nextToken = $tokens[$nextTokenIndex]; - if ($nextToken->isComment()) { - $previousToken = $tokens[$nextTokenIndex - 1]; - $nextTokenContent = $nextToken->getContent(); - - // do not indent inline comments used to comment out unused code - if ( - $previousToken->isWhitespace() - && 1 === Preg::match('/\R$/', $previousToken->getContent()) - && ( - (0 === strpos($nextTokenContent, '//'.$this->whitespacesConfig->getIndent()) || '//' === $nextTokenContent) - || (0 === strpos($nextTokenContent, '#'.$this->whitespacesConfig->getIndent()) || '#' === $nextTokenContent) - ) - ) { - return; - } - - $tokens[$nextTokenIndex] = new Token([ - $nextToken->getId(), - Preg::replace( - '/(\R)'.$this->detectIndent($tokens, $nextTokenIndex).'(\h*\S+.*)/', - '$1'.Preg::replace('/^.*\R(\h*)$/s', '$1', $whitespace).'$2', - $nextToken->getContent() - ), - ]); - } - - $tokens->ensureWhitespaceAtIndex($index, 0, $whitespace); - } - - /** - * @param int $startParenthesisIndex - * @param int $endParenthesisIndex - * - * @return bool - */ - private function isMultilined(Tokens $tokens, $startParenthesisIndex, $endParenthesisIndex) - { - for ($i = $startParenthesisIndex; $i < $endParenthesisIndex; ++$i) { - if (false !== strpos($tokens[$i]->getContent(), "\n")) { - return true; - } - } - - return false; - } - - /** - * Returns whether the token at given index is a comment whose indentation - * can be fixed. - * - * Indentation of a comment is not changed when the comment is part of a - * multi-line message whose lines are all single-line comments and at least - * one line has meaningful content. - * - * @param int $index - * - * @return bool - */ - private function isCommentWithFixableIndentation(Tokens $tokens, $index) - { - if (!$tokens[$index]->isComment()) { - return false; - } - - if (0 === strpos($tokens[$index]->getContent(), '/*')) { - return true; - } - - $firstCommentIndex = $index; - while (true) { - $i = $this->getSiblingContinuousSingleLineComment($tokens, $firstCommentIndex, false); - if (null === $i) { - break; - } - - $firstCommentIndex = $i; - } - - $lastCommentIndex = $index; - while (true) { - $i = $this->getSiblingContinuousSingleLineComment($tokens, $lastCommentIndex, true); - if (null === $i) { - break; - } - - $lastCommentIndex = $i; - } - - if ($firstCommentIndex === $lastCommentIndex) { - return true; - } - - for ($i = $firstCommentIndex + 1; $i < $lastCommentIndex; ++$i) { - if (!$tokens[$i]->isWhitespace() && !$tokens[$i]->isComment()) { - return false; - } - } - - return true; - } - - /** - * @param int $index - * @param bool $after - * - * @return null|int - */ - private function getSiblingContinuousSingleLineComment(Tokens $tokens, $index, $after) - { - $siblingIndex = $index; - do { - if ($after) { - $siblingIndex = $tokens->getNextTokenOfKind($siblingIndex, [[T_COMMENT]]); - } else { - $siblingIndex = $tokens->getPrevTokenOfKind($siblingIndex, [[T_COMMENT]]); - } - - if (null === $siblingIndex) { - return null; - } - } while (0 === strpos($tokens[$siblingIndex]->getContent(), '/*')); - - $newLines = 0; - for ($i = min($siblingIndex, $index) + 1, $max = max($siblingIndex, $index); $i < $max; ++$i) { - if ($tokens[$i]->isWhitespace() && Preg::match('/\R/', $tokens[$i]->getContent())) { - if (1 === $newLines || Preg::match('/\R.*\R/', $tokens[$i]->getContent())) { - return null; - } - - ++$newLines; - } - } - - return $siblingIndex; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/EncodingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/EncodingFixer.php deleted file mode 100644 index 9bb2712..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/EncodingFixer.php +++ /dev/null @@ -1,94 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Basic; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR1 ¶2.2. - * - * @author Dariusz Rumiński - */ -final class EncodingFixer extends AbstractFixer -{ - private $BOM; - - public function __construct() - { - parent::__construct(); - - $this->BOM = pack('CCC', 0xef, 0xbb, 0xbf); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHP code MUST use only UTF-8 without BOM (remove BOM).', - [ - new CodeSample( - $this->BOM.'getContent(); - - if (0 === strncmp($content, $this->BOM, 3)) { - /** @var false|string $newContent until support for PHP 5.6 is dropped */ - $newContent = substr($content, 3); - - if (false === $newContent) { - $newContent = ''; // substr returns false rather than an empty string when starting at the end - } - - if ('' === $newContent) { - $tokens->clearAt(0); - } else { - $tokens[0] = new Token([$tokens[0]->getId(), $newContent]); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php deleted file mode 100644 index d006925..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php +++ /dev/null @@ -1,180 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Basic; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerConfiguration\InvalidOptionsForEnvException; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Options; - -/** - * Removes Zero-width space (ZWSP), Non-breaking space (NBSP) and other invisible unicode symbols. - * - * @author Ivan Boprzenkov - */ -final class NonPrintableCharacterFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - private $symbolsReplace; - - private static $tokens = [ - T_STRING_VARNAME, - T_INLINE_HTML, - T_VARIABLE, - T_COMMENT, - T_ENCAPSED_AND_WHITESPACE, - T_CONSTANT_ENCAPSED_STRING, - T_DOC_COMMENT, - ]; - - public function __construct() - { - parent::__construct(); - - $this->symbolsReplace = [ - pack('H*', 'e2808b') => ['', '200b'], // ZWSP U+200B - pack('H*', 'e28087') => [' ', '2007'], // FIGURE SPACE U+2007 - pack('H*', 'e280af') => [' ', '202f'], // NBSP U+202F - pack('H*', 'e281a0') => ['', '2060'], // WORD JOINER U+2060 - pack('H*', 'c2a0') => [' ', 'a0'], // NO-BREAK SPACE U+A0 - ]; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Remove Zero-width space (ZWSP), Non-breaking space (NBSP) and other invisible unicode symbols.', - [ - new CodeSample( - ' true] - ), - ], - null, - 'Risky when strings contain intended invisible characters.' - ); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound(self::$tokens); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('use_escape_sequences_in_strings', 'Whether characters should be replaced with escape sequences in strings.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) // @TODO 3.0 change to true - ->setNormalizer(static function (Options $options, $value) { - if (\PHP_VERSION_ID < 70000 && $value) { - throw new InvalidOptionsForEnvException('Escape sequences require PHP 7.0+.'); - } - - return $value; - }) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $replacements = []; - $escapeSequences = []; - foreach ($this->symbolsReplace as $character => list($replacement, $codepoint)) { - $replacements[$character] = $replacement; - $escapeSequences[$character] = '\u{'.$codepoint.'}'; - } - - foreach ($tokens as $index => $token) { - $content = $token->getContent(); - - if ( - $this->configuration['use_escape_sequences_in_strings'] - && $token->isGivenKind([T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE]) - ) { - if (!Preg::match('/'.implode('|', array_keys($escapeSequences)).'/', $content)) { - continue; - } - - $previousToken = $tokens[$index - 1]; - $stringTypeChanged = false; - $swapQuotes = false; - - if ($previousToken->isGivenKind(T_START_HEREDOC)) { - $previousTokenContent = $previousToken->getContent(); - - if (false !== strpos($previousTokenContent, '\'')) { - $tokens[$index - 1] = new Token([T_START_HEREDOC, str_replace('\'', '', $previousTokenContent)]); - $stringTypeChanged = true; - } - } elseif ("'" === $content[0]) { - $stringTypeChanged = true; - $swapQuotes = true; - } - - if ($swapQuotes) { - $content = str_replace("\\'", "'", $content); - } - if ($stringTypeChanged) { - $content = Preg::replace('/(\\\\{1,2})/', '\\\\\\\\', $content); - $content = str_replace('$', '\$', $content); - } - if ($swapQuotes) { - $content = str_replace('"', '\"', $content); - $content = Preg::replace('/^\'(.*)\'$/', '"$1"', $content); - } - - $tokens[$index] = new Token([$token->getId(), strtr($content, $escapeSequences)]); - - continue; - } - - if ($token->isGivenKind(self::$tokens)) { - $tokens[$index] = new Token([$token->getId(), strtr($content, $replacements)]); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/Psr0Fixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/Psr0Fixer.php deleted file mode 100644 index f0ce65a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/Psr0Fixer.php +++ /dev/null @@ -1,171 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Basic; - -use PhpCsFixer\AbstractPsrAutoloadingFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\FileSpecificCodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jordi Boggiano - * @author Dariusz Rumiński - * @author Bram Gotink - * @author Graham Campbell - */ -final class Psr0Fixer extends AbstractPsrAutoloadingFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Classes must be in a path that matches their namespace, be at least one namespace deep and the class name should match the file name.', - [ - new FileSpecificCodeSample( - ' realpath(__DIR__.'/../..')] - ), - ], - null, - 'This fixer may change your class name, which will break the code that depends on the old name.' - ); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $namespace = false; - $namespaceIndex = 0; - $namespaceEndIndex = 0; - - $classyName = null; - $classyIndex = 0; - - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(T_NAMESPACE)) { - if (false !== $namespace) { - return; - } - - $namespaceIndex = $tokens->getNextMeaningfulToken($index); - $namespaceEndIndex = $tokens->getNextTokenOfKind($index, [';']); - - $namespace = trim($tokens->generatePartialCode($namespaceIndex, $namespaceEndIndex - 1)); - } elseif ($token->isClassy()) { - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - if ($prevToken->isGivenKind(T_NEW)) { - continue; - } - - if (null !== $classyName) { - return; - } - - $classyIndex = $tokens->getNextMeaningfulToken($index); - $classyName = $tokens[$classyIndex]->getContent(); - } - } - - if (null === $classyName) { - return; - } - - if (false !== $namespace) { - $normNamespace = str_replace('\\', '/', $namespace); - $path = str_replace('\\', '/', $file->getRealPath()); - $dir = \dirname($path); - - if ('' !== $this->configuration['dir']) { - /** @var false|string $dir until support for PHP 5.6 is dropped */ - $dir = substr($dir, \strlen(realpath($this->configuration['dir'])) + 1); - - if (false === $dir) { - $dir = ''; - } - - if (\strlen($normNamespace) > \strlen($dir)) { - if ('' !== $dir) { - $normNamespace = substr($normNamespace, -\strlen($dir)); - } else { - $normNamespace = ''; - } - } - } - - /** @var false|string $dir until support for PHP 5.6 is dropped */ - $dir = substr($dir, -\strlen($normNamespace)); - if (false === $dir) { - $dir = ''; - } - - $filename = basename($path, '.php'); - - if ($classyName !== $filename) { - $tokens[$classyIndex] = new Token([T_STRING, $filename]); - } - - if ($normNamespace !== $dir && strtolower($normNamespace) === strtolower($dir)) { - for ($i = $namespaceIndex; $i <= $namespaceEndIndex; ++$i) { - $tokens->clearAt($i); - } - $namespace = substr($namespace, 0, -\strlen($dir)).str_replace('/', '\\', $dir); - - $newNamespace = Tokens::fromCode('clearRange(0, 2); - $newNamespace->clearEmptyTokens(); - - $tokens->insertAt($namespaceIndex, $newNamespace); - } - } else { - $normClass = str_replace('_', '/', $classyName); - $path = str_replace('\\', '/', $file->getRealPath()); - $filename = substr($path, -\strlen($normClass) - 4, -4); - - if ($normClass !== $filename && strtolower($normClass) === strtolower($filename)) { - $tokens[$classyIndex] = new Token([T_STRING, str_replace('/', '_', $filename)]); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('dir', 'The directory where the project code is placed.')) - ->setAllowedTypes(['string']) - ->setDefault('') - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/Psr4Fixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/Psr4Fixer.php deleted file mode 100644 index ee687a8..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/Psr4Fixer.php +++ /dev/null @@ -1,100 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Basic; - -use PhpCsFixer\AbstractPsrAutoloadingFixer; -use PhpCsFixer\FixerDefinition\FileSpecificCodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jordi Boggiano - * @author Dariusz Rumiński - * @author Bram Gotink - * @author Graham Campbell - */ -final class Psr4Fixer extends AbstractPsrAutoloadingFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Class names should match the file name.', - [ - new FileSpecificCodeSample( - ' $token) { - if ($token->isGivenKind(T_NAMESPACE)) { - if ($isNamespaceFound) { - return; - } - - $isNamespaceFound = true; - } elseif ($token->isClassy()) { - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - if ($prevToken->isGivenKind(T_NEW)) { - continue; - } - - if (null !== $classyName) { - return; - } - - $classyIndex = $tokens->getNextMeaningfulToken($index); - $classyName = $tokens[$classyIndex]->getContent(); - } - } - - if (null === $classyName) { - return; - } - - if ($isNamespaceFound) { - $filename = basename(str_replace('\\', '/', $file->getRealPath()), '.php'); - - if ($classyName !== $filename) { - $tokens[$classyIndex] = new Token([T_STRING, $filename]); - } - } else { - $normClass = str_replace('_', '/', $classyName); - $filename = substr(str_replace('\\', '/', $file->getRealPath()), -\strlen($normClass) - 4, -4); - - if ($normClass !== $filename && strtolower($normClass) === strtolower($filename)) { - $tokens[$classyIndex] = new Token([T_STRING, str_replace('/', '_', $filename)]); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php deleted file mode 100644 index b0e1042..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php +++ /dev/null @@ -1,146 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for constants case. - * - * @author Pol Dellaiera - */ -final class ConstantCaseFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * Hold the function that will be used to convert the constants. - * - * @var callable - */ - private $fixFunction; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - if ('lower' === $this->configuration['case']) { - $this->fixFunction = static function ($token) { - return strtolower($token); - }; - } - - if ('upper' === $this->configuration['case']) { - $this->fixFunction = static function ($token) { - return strtoupper($token); - }; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'The PHP constants `true`, `false`, and `null` MUST be written using the correct casing.', - [new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('case', 'Whether to use the `upper` or `lower` case syntax.')) - ->setAllowedValues(['upper', 'lower']) - ->setDefault('lower') - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $fixFunction = $this->fixFunction; - - foreach ($tokens as $index => $token) { - if (!$token->isNativeConstant()) { - continue; - } - - if ( - $this->isNeighbourAccepted($tokens, $tokens->getPrevMeaningfulToken($index)) && - $this->isNeighbourAccepted($tokens, $tokens->getNextMeaningfulToken($index)) - ) { - $tokens[$index] = new Token([$token->getId(), $fixFunction($token->getContent())]); - } - } - } - - /** - * @param int $index - * - * @return bool - */ - private function isNeighbourAccepted(Tokens $tokens, $index) - { - static $forbiddenTokens = [ - T_AS, - T_CLASS, - T_CONST, - T_EXTENDS, - T_IMPLEMENTS, - T_INSTANCEOF, - T_INSTEADOF, - T_INTERFACE, - T_NEW, - T_NS_SEPARATOR, - T_OBJECT_OPERATOR, - T_PAAMAYIM_NEKUDOTAYIM, - T_TRAIT, - T_USE, - CT::T_USE_TRAIT, - CT::T_USE_LAMBDA, - ]; - - $token = $tokens[$index]; - - if ($token->equalsAny(['{', '}'])) { - return false; - } - - return !$token->isGivenKind($forbiddenTokens); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseConstantsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseConstantsFixer.php deleted file mode 100644 index fc393b3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseConstantsFixer.php +++ /dev/null @@ -1,60 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Casing; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * Fixer for rules defined in PSR2 ¶2.5. - * - * @author Dariusz Rumiński - * - * @deprecated proxy to ConstantCaseFixer - */ -final class LowercaseConstantsFixer extends AbstractProxyFixer implements DeprecatedFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'The PHP constants `true`, `false`, and `null` MUST be in lower case.', - [new CodeSample("proxyFixers); - } - - /** - * {@inheritdoc} - */ - protected function createProxyFixers() - { - $fixer = new ConstantCaseFixer(); - $fixer->configure(['case' => 'lower']); - - return [$fixer]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php deleted file mode 100644 index a6e8e3e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php +++ /dev/null @@ -1,75 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶2.5. - * - * @author Dariusz Rumiński - */ -final class LowercaseKeywordsFixer extends AbstractFixer -{ - private static $excludedTokens = [T_HALT_COMPILER]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHP keywords MUST be in lower case.', - [ - new CodeSample( - 'isAnyTokenKindsFound(Token::getKeywords()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if ($token->isKeyword() && !$token->isGivenKind(self::$excludedTokens)) { - $tokens[$index] = new Token([$token->getId(), strtolower($token->getContent())]); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php deleted file mode 100644 index fcd7aff..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php +++ /dev/null @@ -1,105 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - */ -final class LowercaseStaticReferenceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Class static references `self`, `static` and `parent` MUST be in lower case.', - [ - new CodeSample('isAnyTokenKindsFound([T_STATIC, T_STRING]); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->equalsAny([[T_STRING, 'self'], [T_STATIC, 'static'], [T_STRING, 'parent']], false)) { - continue; - } - - $newContent = strtolower($token->getContent()); - if ($token->getContent() === $newContent) { - continue; // case is already correct - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind([T_CONST, T_DOUBLE_COLON, T_FUNCTION, T_NAMESPACE, T_NS_SEPARATOR, T_OBJECT_OPERATOR, T_PRIVATE, T_PROTECTED, T_PUBLIC])) { - continue; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - if ($tokens[$nextIndex]->isGivenKind([T_FUNCTION, T_NS_SEPARATOR, T_PRIVATE, T_PROTECTED, T_PUBLIC])) { - continue; - } - - if ('static' === $newContent && $tokens[$nextIndex]->isGivenKind(T_VARIABLE)) { - continue; - } - - $tokens[$index] = new Token([$token->getId(), $newContent]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php deleted file mode 100644 index be9484f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php +++ /dev/null @@ -1,98 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author ntzm - */ -final class MagicConstantCasingFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Magic constants should be referred to using the correct casing.', - [new CodeSample("isAnyTokenKindsFound($this->getMagicConstantTokens()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $magicConstants = $this->getMagicConstants(); - $magicConstantTokens = $this->getMagicConstantTokens(); - - foreach ($tokens as $index => $token) { - if ($token->isGivenKind($magicConstantTokens)) { - $tokens[$index] = new Token([$token->getId(), $magicConstants[$token->getId()]]); - } - } - } - - /** - * @return array - */ - private function getMagicConstants() - { - static $magicConstants = null; - - if (null === $magicConstants) { - $magicConstants = [ - T_LINE => '__LINE__', - T_FILE => '__FILE__', - T_DIR => '__DIR__', - T_FUNC_C => '__FUNCTION__', - T_CLASS_C => '__CLASS__', - T_METHOD_C => '__METHOD__', - T_NS_C => '__NAMESPACE__', - CT::T_CLASS_CONSTANT => 'class', - T_TRAIT_C => '__TRAIT__', - ]; - } - - return $magicConstants; - } - - /** - * @return array - */ - private function getMagicConstantTokens() - { - static $magicConstantTokens = null; - - if (null === $magicConstantTokens) { - $magicConstantTokens = array_keys($this->getMagicConstants()); - } - - return $magicConstantTokens; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php deleted file mode 100644 index 123d251..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php +++ /dev/null @@ -1,228 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class MagicMethodCasingFixer extends AbstractFixer -{ - private static $magicNames = [ - '__call' => '__call', - '__callstatic' => '__callStatic', - '__clone' => '__clone', - '__construct' => '__construct', - '__debuginfo' => '__debugInfo', - '__destruct' => '__destruct', - '__get' => '__get', - '__invoke' => '__invoke', - '__isset' => '__isset', - '__serialize' => '__serialize', - '__set' => '__set', - '__set_state' => '__set_state', - '__sleep' => '__sleep', - '__tostring' => '__toString', - '__unserialize' => '__unserialize', - '__unset' => '__unset', - '__wakeup' => '__wakeup', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Magic method definitions and calls must be using the correct casing.', - [ - new CodeSample( - '__INVOKE(1); -' - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_STRING) && $tokens->isAnyTokenKindsFound([T_FUNCTION, T_OBJECT_OPERATOR, T_DOUBLE_COLON]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $inClass = 0; - $tokenCount = \count($tokens); - - for ($index = 1; $index < $tokenCount - 2; ++$index) { - if (0 === $inClass && $tokens[$index]->isClassy()) { - $inClass = 1; - $index = $tokens->getNextTokenOfKind($index, ['{']); - - continue; - } - - if (0 !== $inClass) { - if ($tokens[$index]->equals('{')) { - ++$inClass; - - continue; - } - - if ($tokens[$index]->equals('}')) { - --$inClass; - - continue; - } - } - - if (!$tokens[$index]->isGivenKind(T_STRING)) { - continue; // wrong type - } - - $content = $tokens[$index]->getContent(); - if ('__' !== substr($content, 0, 2)) { - continue; // cheap look ahead - } - - $name = strtolower($content); - - if (!$this->isMagicMethodName($name)) { - continue; // method name is not one of the magic ones we can fix - } - - $nameInCorrectCasing = $this->getMagicMethodNameInCorrectCasing($name); - if ($nameInCorrectCasing === $content) { - continue; // method name is already in the correct casing, no fix needed - } - - if ($this->isFunctionSignature($tokens, $index)) { - if (0 !== $inClass) { - // this is a method definition we want to fix - $this->setTokenToCorrectCasing($tokens, $index, $nameInCorrectCasing); - } - - continue; - } - - if ($this->isMethodCall($tokens, $index)) { - $this->setTokenToCorrectCasing($tokens, $index, $nameInCorrectCasing); - - continue; - } - - if ( - ('__callstatic' === $name || '__set_state' === $name) - && $this->isStaticMethodCall($tokens, $index) - ) { - $this->setTokenToCorrectCasing($tokens, $index, $nameInCorrectCasing); - } - } - } - - /** - * @param int $index - * - * @return bool - */ - private function isFunctionSignature(Tokens $tokens, $index) - { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$prevIndex]->isGivenKind(T_FUNCTION)) { - return false; // not a method signature - } - - return $tokens[$tokens->getNextMeaningfulToken($index)]->equals('('); - } - - /** - * @param int $index - * - * @return bool - */ - private function isMethodCall(Tokens $tokens, $index) - { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$prevIndex]->equals([T_OBJECT_OPERATOR, '->'])) { - return false; // not a "simple" method call - } - - return $tokens[$tokens->getNextMeaningfulToken($index)]->equals('('); - } - - /** - * @param int $index - * - * @return bool - */ - private function isStaticMethodCall(Tokens $tokens, $index) - { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$prevIndex]->isGivenKind(T_DOUBLE_COLON)) { - return false; // not a "simple" static method call - } - - return $tokens[$tokens->getNextMeaningfulToken($index)]->equals('('); - } - - /** - * @param string $name - * - * @return bool - */ - private function isMagicMethodName($name) - { - return isset(self::$magicNames[$name]); - } - - /** - * @param string $name name of a magic method - * - * @return string - */ - private function getMagicMethodNameInCorrectCasing($name) - { - return self::$magicNames[$name]; - } - - /** - * @param int $index - * @param string $nameInCorrectCasing - */ - private function setTokenToCorrectCasing(Tokens $tokens, $index, $nameInCorrectCasing) - { - $tokens[$index] = new Token([T_STRING, $nameInCorrectCasing]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionCasingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionCasingFixer.php deleted file mode 100644 index d4cd369..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionCasingFixer.php +++ /dev/null @@ -1,117 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NativeFunctionCasingFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Function defined by PHP should be called using the correct casing.', - [new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - static $nativeFunctionNames = null; - - if (null === $nativeFunctionNames) { - $nativeFunctionNames = $this->getNativeFunctionNames(); - } - - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - // test if we are at a function all - if (!$tokens[$index]->isGivenKind(T_STRING)) { - continue; - } - - $next = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$next]->equals('(')) { - $index = $next; - - continue; - } - - $functionNamePrefix = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$functionNamePrefix]->isGivenKind([T_DOUBLE_COLON, T_NEW, T_OBJECT_OPERATOR, T_FUNCTION, CT::T_RETURN_REF])) { - continue; - } - - if ($tokens[$functionNamePrefix]->isGivenKind(T_NS_SEPARATOR)) { - // skip if the call is to a constructor or to a function in a namespace other than the default - $prev = $tokens->getPrevMeaningfulToken($functionNamePrefix); - if ($tokens[$prev]->isGivenKind([T_STRING, T_NEW])) { - continue; - } - } - - // test if the function call is to a native PHP function - $lower = strtolower($tokens[$index]->getContent()); - if (!\array_key_exists($lower, $nativeFunctionNames)) { - continue; - } - - $tokens[$index] = new Token([T_STRING, $nativeFunctionNames[$lower]]); - $index = $next; - } - } - - /** - * @return array - */ - private function getNativeFunctionNames() - { - $allFunctions = get_defined_functions(); - $functions = []; - foreach ($allFunctions['internal'] as $function) { - $functions[strtolower($function)] = $function; - } - - return $functions; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionTypeDeclarationCasingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionTypeDeclarationCasingFixer.php deleted file mode 100644 index 2d12e72..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionTypeDeclarationCasingFixer.php +++ /dev/null @@ -1,177 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\TypeAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NativeFunctionTypeDeclarationCasingFixer extends AbstractFixer -{ - /** - * https://secure.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration. - * - * self PHP 5.0.0 - * array PHP 5.1.0 - * callable PHP 5.4.0 - * bool PHP 7.0.0 - * float PHP 7.0.0 - * int PHP 7.0.0 - * string PHP 7.0.0 - * iterable PHP 7.1.0 - * void PHP 7.1.0 - * object PHP 7.2.0 - * - * @var array - */ - private $hints; - - /** - * @var FunctionsAnalyzer - */ - private $functionsAnalyzer; - - public function __construct() - { - parent::__construct(); - - $this->hints = [ - 'array' => true, - 'callable' => true, - 'self' => true, - ]; - - if (\PHP_VERSION_ID >= 70000) { - $this->hints = array_merge( - $this->hints, - [ - 'bool' => true, - 'float' => true, - 'int' => true, - 'string' => true, - ] - ); - } - - if (\PHP_VERSION_ID >= 70100) { - $this->hints = array_merge( - $this->hints, - [ - 'iterable' => true, - 'void' => true, - ] - ); - } - - if (\PHP_VERSION_ID >= 70200) { - $this->hints = array_merge($this->hints, ['object' => true]); - } - - $this->functionsAnalyzer = new FunctionsAnalyzer(); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Native type hints for functions should use the correct case.', - [ - new CodeSample("isAllTokenKindsFound([T_FUNCTION, T_STRING]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { - if (\PHP_VERSION_ID >= 70000) { - $this->fixFunctionReturnType($tokens, $index); - } - - $this->fixFunctionArgumentTypes($tokens, $index); - } - } - } - - /** - * @param int $index - */ - private function fixFunctionArgumentTypes(Tokens $tokens, $index) - { - foreach ($this->functionsAnalyzer->getFunctionArguments($tokens, $index) as $argument) { - $this->fixArgumentType($tokens, $argument->getTypeAnalysis()); - } - } - - /** - * @param int $index - */ - private function fixFunctionReturnType(Tokens $tokens, $index) - { - $this->fixArgumentType($tokens, $this->functionsAnalyzer->getFunctionReturnType($tokens, $index)); - } - - private function fixArgumentType(Tokens $tokens, TypeAnalysis $type = null) - { - if (null === $type) { - return; - } - - $argumentIndex = $type->getStartIndex(); - if ($argumentIndex !== $type->getEndIndex()) { - return; // the type to fix are always unqualified and so are always composed as one token - } - - $lowerCasedName = strtolower($type->getName()); - if (!isset($this->hints[$lowerCasedName])) { - return; // check of type is of interest based on name (slower check than previous index based) - } - - $tokens[$argumentIndex] = new Token([$tokens[$argumentIndex]->getId(), $lowerCasedName]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php deleted file mode 100644 index 7449014..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php +++ /dev/null @@ -1,129 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\CastNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class CastSpacesFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @internal - */ - const INSIDE_CAST_SPACE_REPLACE_MAP = [ - ' ' => '', - "\t" => '', - "\n" => '', - "\r" => '', - "\0" => '', - "\x0B" => '', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'A single space or none should be between cast and variable.', - [ - new CodeSample( - " 'single'] - ), - new CodeSample( - " 'none'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after NoShortBoolCastFixer. - */ - public function getPriority() - { - return -10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound(Token::getCastTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isCast()) { - continue; - } - - $tokens[$index] = new Token([ - $token->getId(), - strtr($token->getContent(), self::INSIDE_CAST_SPACE_REPLACE_MAP), - ]); - - if ('single' === $this->configuration['space']) { - // force single whitespace after cast token: - if ($tokens[$index + 1]->isWhitespace(" \t")) { - // - if next token is whitespaces that contains only spaces and tabs - override next token with single space - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } elseif (!$tokens[$index + 1]->isWhitespace()) { - // - if next token is not whitespaces that contains spaces, tabs and new lines - append single space to current token - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - - continue; - } - - // force no whitespace after cast token: - if ($tokens[$index + 1]->isWhitespace()) { - $tokens->clearAt($index + 1); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('space', 'spacing to apply between cast and variable.')) - ->setAllowedValues(['none', 'single']) - ->setDefault('single') - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/LowercaseCastFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/LowercaseCastFixer.php deleted file mode 100644 index f774f52..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/LowercaseCastFixer.php +++ /dev/null @@ -1,95 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\CastNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class LowercaseCastFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Cast should be written in lower case.', - [ - new VersionSpecificCodeSample( - 'isAnyTokenKindsFound(Token::getCastTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - if (!$tokens[$index]->isCast()) { - continue; - } - - $tokens[$index] = new Token([$tokens[$index]->getId(), strtolower($tokens[$index]->getContent())]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ModernizeTypesCastingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ModernizeTypesCastingFixer.php deleted file mode 100644 index 6954521..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ModernizeTypesCastingFixer.php +++ /dev/null @@ -1,159 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\CastNotation; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Vladimir Reznichenko - */ -final class ModernizeTypesCastingFixer extends AbstractFunctionReferenceFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replaces `intval`, `floatval`, `doubleval`, `strval` and `boolval` function calls with according type casting operator.', - [ - new CodeSample( - 'isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - // replacement patterns - static $replacement = [ - 'intval' => [T_INT_CAST, '(int)'], - 'floatval' => [T_DOUBLE_CAST, '(float)'], - 'doubleval' => [T_DOUBLE_CAST, '(float)'], - 'strval' => [T_STRING_CAST, '(string)'], - 'boolval' => [T_BOOL_CAST, '(bool)'], - ]; - - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - foreach ($replacement as $functionIdentity => $newToken) { - $currIndex = 0; - while (null !== $currIndex) { - // try getting function reference and translate boundaries for humans - $boundaries = $this->find($functionIdentity, $tokens, $currIndex, $tokens->count() - 1); - if (null === $boundaries) { - // next function search, as current one not found - continue 2; - } - - list($functionName, $openParenthesis, $closeParenthesis) = $boundaries; - - // analysing cursor shift - $currIndex = $openParenthesis; - - // indicator that the function is overridden - if (1 !== $argumentsAnalyzer->countArguments($tokens, $openParenthesis, $closeParenthesis)) { - continue; - } - - $paramContentEnd = $closeParenthesis; - $commaCandidate = $tokens->getPrevMeaningfulToken($paramContentEnd); - if ($tokens[$commaCandidate]->equals(',')) { - $tokens->removeTrailingWhitespace($commaCandidate); - $tokens->clearAt($commaCandidate); - $paramContentEnd = $commaCandidate; - } - - // check if something complex passed as an argument and preserve parenthesises then - $countParamTokens = 0; - for ($paramContentIndex = $openParenthesis + 1; $paramContentIndex < $paramContentEnd; ++$paramContentIndex) { - //not a space, means some sensible token - if (!$tokens[$paramContentIndex]->isGivenKind(T_WHITESPACE)) { - ++$countParamTokens; - } - } - - $preserveParenthesises = $countParamTokens > 1; - - $afterCloseParenthesisIndex = $tokens->getNextMeaningfulToken($closeParenthesis); - $afterCloseParenthesisToken = $tokens[$afterCloseParenthesisIndex]; - $wrapInParenthesises = $afterCloseParenthesisToken->equalsAny(['[', '{']) || $afterCloseParenthesisToken->isGivenKind(T_POW); - - // analyse namespace specification (root one or none) and decide what to do - $prevTokenIndex = $tokens->getPrevMeaningfulToken($functionName); - if ($tokens[$prevTokenIndex]->isGivenKind(T_NS_SEPARATOR)) { - // get rid of root namespace when it used - $tokens->removeTrailingWhitespace($prevTokenIndex); - $tokens->clearAt($prevTokenIndex); - } - - // perform transformation - $replacementSequence = [ - new Token($newToken), - new Token([T_WHITESPACE, ' ']), - ]; - if ($wrapInParenthesises) { - array_unshift($replacementSequence, new Token('(')); - } - - if (!$preserveParenthesises) { - // closing parenthesis removed with leading spaces - $tokens->removeLeadingWhitespace($closeParenthesis); - $tokens->clearAt($closeParenthesis); - - // opening parenthesis removed with trailing spaces - $tokens->removeLeadingWhitespace($openParenthesis); - $tokens->removeTrailingWhitespace($openParenthesis); - $tokens->clearAt($openParenthesis); - } else { - // we'll need to provide a space after a casting operator - $tokens->removeTrailingWhitespace($functionName); - } - - if ($wrapInParenthesises) { - $tokens->insertAt($closeParenthesis, new Token(')')); - } - - $tokens->overrideRange($functionName, $functionName, $replacementSequence); - - // nested transformations support - $currIndex = $functionName; - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoShortBoolCastFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoShortBoolCastFixer.php deleted file mode 100644 index c1cdfde..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoShortBoolCastFixer.php +++ /dev/null @@ -1,106 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\CastNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoShortBoolCastFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - * - * Must run before CastSpacesFixer. - */ - public function getPriority() - { - return -9; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Short cast `bool` using double exclamation mark should not be used.', - [new CodeSample("isTokenKindFound('!'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = \count($tokens) - 1; $index > 1; --$index) { - if ($tokens[$index]->equals('!')) { - $index = $this->fixShortCast($tokens, $index); - } - } - } - - /** - * @param int $index - * - * @return int - */ - private function fixShortCast(Tokens $tokens, $index) - { - for ($i = $index - 1; $i > 1; --$i) { - if ($tokens[$i]->equals('!')) { - $this->fixShortCastToBoolCast($tokens, $i, $index); - - break; - } - - if (!$tokens[$i]->isComment() && !$tokens[$i]->isWhitespace()) { - break; - } - } - - return $i; - } - - /** - * @param int $start - * @param int $end - */ - private function fixShortCastToBoolCast(Tokens $tokens, $start, $end) - { - for (; $start <= $end; ++$start) { - if ( - !$tokens[$start]->isComment() - && !($tokens[$start]->isWhitespace() && $tokens[$start - 1]->isComment()) - ) { - $tokens->clearAt($start); - } - } - - $tokens->insertAt($start, new Token([T_BOOL_CAST, '(bool)'])); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoUnsetCastFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoUnsetCastFixer.php deleted file mode 100644 index d8accc5..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoUnsetCastFixer.php +++ /dev/null @@ -1,90 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\CastNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoUnsetCastFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Variables must be set `null` instead of using `(unset)` casting.', - [new CodeSample("isTokenKindFound(T_UNSET_CAST); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = \count($tokens) - 1; $index > 0; --$index) { - if ($tokens[$index]->isGivenKind(T_UNSET_CAST)) { - $this->fixUnsetCast($tokens, $index); - } - } - } - - /** - * @param int $index - */ - private function fixUnsetCast(Tokens $tokens, $index) - { - $assignmentIndex = $tokens->getPrevMeaningfulToken($index); - if (null === $assignmentIndex || !$tokens[$assignmentIndex]->equals('=')) { - return; - } - - $varIndex = $tokens->getNextMeaningfulToken($index); - if (null === $varIndex || !$tokens[$varIndex]->isGivenKind(T_VARIABLE)) { - return; - } - - $afterVar = $tokens->getNextMeaningfulToken($varIndex); - if (null === $afterVar || !$tokens[$afterVar]->equalsAny([';', [T_CLOSE_TAG]])) { - return; - } - - $nextIsWhiteSpace = $tokens[$assignmentIndex + 1]->isWhitespace(); - - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - $tokens->clearTokenAndMergeSurroundingWhitespace($varIndex); - - ++$assignmentIndex; - if (!$nextIsWhiteSpace) { - $tokens->insertAt($assignmentIndex, new Token([T_WHITESPACE, ' '])); - } - - ++$assignmentIndex; - $tokens->insertAt($assignmentIndex, new Token([T_STRING, 'null'])); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ShortScalarCastFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ShortScalarCastFixer.php deleted file mode 100644 index 8a1665b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ShortScalarCastFixer.php +++ /dev/null @@ -1,86 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\CastNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class ShortScalarCastFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Cast `(boolean)` and `(integer)` should be written as `(bool)` and `(int)`, `(double)` and `(real)` as `(float)`, `(binary)` as `(string)`.', - [ - new VersionSpecificCodeSample( - "isAnyTokenKindsFound(Token::getCastTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - static $castMap = [ - 'boolean' => 'bool', - 'integer' => 'int', - 'double' => 'float', - 'real' => 'float', - 'binary' => 'string', - ]; - - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - if (!$tokens[$index]->isCast()) { - continue; - } - - $castFrom = trim(substr($tokens[$index]->getContent(), 1, -1)); - $castFromLowered = strtolower($castFrom); - - if (!\array_key_exists($castFromLowered, $castMap)) { - continue; - } - - $tokens[$index] = new Token([ - $tokens[$index]->getId(), - str_replace($castFrom, $castMap[$castFromLowered], $tokens[$index]->getContent()), - ]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php deleted file mode 100644 index f9dbe26..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php +++ /dev/null @@ -1,392 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use SplFileInfo; - -/** - * Make sure there is one blank line above and below class elements. - * - * The exception is when an element is the first or last item in a 'classy'. - * - * @author SpacePossum - */ -final class ClassAttributesSeparationFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var array - */ - private $classElementTypes = []; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->classElementTypes = []; // reset previous configuration - foreach ($this->configuration['elements'] as $element) { - $this->classElementTypes[$element] = true; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Class, trait and interface elements must be separated with one blank line.', - [ - new CodeSample( - ' ['property']] - ), - new CodeSample( - ' ['const']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BracesFixer, IndentationTypeFixer. - * Must run after OrderedClassElementsFixer, SingleClassElementPerStatementFixer. - */ - public function getPriority() - { - return 55; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $class = $classStart = $classEnd = false; - - foreach (array_reverse($tokensAnalyzer->getClassyElements(), true) as $index => $element) { - if (!isset($this->classElementTypes[$element['type']])) { - continue; // not configured to be fixed - } - - if ($element['classIndex'] !== $class) { - $class = $element['classIndex']; - $classStart = $tokens->getNextTokenOfKind($class, ['{']); - $classEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classStart); - } - - if ('method' === $element['type'] && !$tokens[$class]->isGivenKind(T_INTERFACE)) { - // method of class or trait - $attributes = $tokensAnalyzer->getMethodAttributes($index); - - $methodEnd = true === $attributes['abstract'] - ? $tokens->getNextTokenOfKind($index, [';']) - : $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $tokens->getNextTokenOfKind($index, ['{'])) - ; - - $this->fixSpaceBelowClassMethod($tokens, $classEnd, $methodEnd); - $this->fixSpaceAboveClassElement($tokens, $classStart, $index); - - continue; - } - - // `const`, `property` or `method` of an `interface` - $this->fixSpaceBelowClassElement($tokens, $classEnd, $tokens->getNextTokenOfKind($index, [';'])); - $this->fixSpaceAboveClassElement($tokens, $classStart, $index); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $types = ['const', 'method', 'property']; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('elements', sprintf('List of classy elements; \'%s\'.', implode("', '", $types)))) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset($types)]) - ->setDefault(['const', 'method', 'property']) - ->getOption(), - ]); - } - - /** - * Fix spacing below an element of a class, interface or trait. - * - * Deals with comments, PHPDocs and spaces above the element with respect to the position of the - * element within the class, interface or trait. - * - * @param int $classEndIndex - * @param int $elementEndIndex - */ - private function fixSpaceBelowClassElement(Tokens $tokens, $classEndIndex, $elementEndIndex) - { - for ($nextNotWhite = $elementEndIndex + 1;; ++$nextNotWhite) { - if (($tokens[$nextNotWhite]->isComment() || $tokens[$nextNotWhite]->isWhitespace()) && false === strpos($tokens[$nextNotWhite]->getContent(), "\n")) { - continue; - } - - break; - } - - if ($tokens[$nextNotWhite]->isWhitespace()) { - $nextNotWhite = $tokens->getNextNonWhitespace($nextNotWhite); - } - - $this->correctLineBreaks($tokens, $elementEndIndex, $nextNotWhite, $nextNotWhite === $classEndIndex ? 1 : 2); - } - - /** - * Fix spacing below a method of a class or trait. - * - * Deals with comments, PHPDocs and spaces above the method with respect to the position of the - * method within the class or trait. - * - * @param int $classEndIndex - * @param int $elementEndIndex - */ - private function fixSpaceBelowClassMethod(Tokens $tokens, $classEndIndex, $elementEndIndex) - { - $nextNotWhite = $tokens->getNextNonWhitespace($elementEndIndex); - - $this->correctLineBreaks($tokens, $elementEndIndex, $nextNotWhite, $nextNotWhite === $classEndIndex ? 1 : 2); - } - - /** - * Fix spacing above an element of a class, interface or trait. - * - * Deals with comments, PHPDocs and spaces above the element with respect to the position of the - * element within the class, interface or trait. - * - * @param int $classStartIndex index of the class Token the element is in - * @param int $elementIndex index of the element to fix - */ - private function fixSpaceAboveClassElement(Tokens $tokens, $classStartIndex, $elementIndex) - { - static $methodAttr = [T_PRIVATE, T_PROTECTED, T_PUBLIC, T_ABSTRACT, T_FINAL, T_STATIC, T_STRING, T_NS_SEPARATOR, T_VAR, CT::T_NULLABLE_TYPE, CT::T_ARRAY_TYPEHINT]; - - $nonWhiteAbove = null; - - // find out where the element definition starts - $firstElementAttributeIndex = $elementIndex; - for ($i = $elementIndex; $i > $classStartIndex; --$i) { - $nonWhiteAbove = $tokens->getNonWhitespaceSibling($i, -1); - if (null !== $nonWhiteAbove && $tokens[$nonWhiteAbove]->isGivenKind($methodAttr)) { - $firstElementAttributeIndex = $nonWhiteAbove; - } else { - break; - } - } - - // deal with comments above a element - if ($tokens[$nonWhiteAbove]->isGivenKind(T_COMMENT)) { - if (1 === $firstElementAttributeIndex - $nonWhiteAbove) { - // no white space found between comment and element start - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, 1); - - return; - } - - // $tokens[$nonWhiteAbove+1] is always a white space token here - if (substr_count($tokens[$nonWhiteAbove + 1]->getContent(), "\n") > 1) { - // more than one line break, always bring it back to 2 line breaks between the element start and what is above it - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, 2); - - return; - } - - // there are 2 cases: - if ($tokens[$nonWhiteAbove - 1]->isWhitespace() && substr_count($tokens[$nonWhiteAbove - 1]->getContent(), "\n") > 0) { - // 1. The comment is meant for the element (although not a PHPDoc), - // make sure there is one line break between the element and the comment... - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, 1); - // ... and make sure there is blank line above the comment (with the exception when it is directly after a class opening) - $nonWhiteAbove = $this->findCommentBlockStart($tokens, $nonWhiteAbove); - $nonWhiteAboveComment = $tokens->getNonWhitespaceSibling($nonWhiteAbove, -1); - - $this->correctLineBreaks($tokens, $nonWhiteAboveComment, $nonWhiteAbove, $nonWhiteAboveComment === $classStartIndex ? 1 : 2); - } else { - // 2. The comment belongs to the code above the element, - // make sure there is a blank line above the element (i.e. 2 line breaks) - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, 2); - } - - return; - } - - // deal with element without a PHPDoc above it - if (false === $tokens[$nonWhiteAbove]->isGivenKind(T_DOC_COMMENT)) { - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, $nonWhiteAbove === $classStartIndex ? 1 : 2); - - return; - } - - // there should be one linebreak between the element and the PHPDoc above it - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, 1); - - // there should be one blank line between the PHPDoc and whatever is above (with the exception when it is directly after a class opening) - $nonWhiteAbovePHPDoc = $tokens->getNonWhitespaceSibling($nonWhiteAbove, -1); - $this->correctLineBreaks($tokens, $nonWhiteAbovePHPDoc, $nonWhiteAbove, $nonWhiteAbovePHPDoc === $classStartIndex ? 1 : 2); - } - - /** - * @param int $startIndex - * @param int $endIndex - * @param int $reqLineCount - */ - private function correctLineBreaks(Tokens $tokens, $startIndex, $endIndex, $reqLineCount = 2) - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - ++$startIndex; - $numbOfWhiteTokens = $endIndex - $startIndex; - if (0 === $numbOfWhiteTokens) { - $tokens->insertAt($startIndex, new Token([T_WHITESPACE, str_repeat($lineEnding, $reqLineCount)])); - - return; - } - - $lineBreakCount = $this->getLineBreakCount($tokens, $startIndex, $endIndex); - if ($reqLineCount === $lineBreakCount) { - return; - } - - if ($lineBreakCount < $reqLineCount) { - $tokens[$startIndex] = new Token([ - T_WHITESPACE, - str_repeat($lineEnding, $reqLineCount - $lineBreakCount).$tokens[$startIndex]->getContent(), - ]); - - return; - } - - // $lineCount = > $reqLineCount : check the one Token case first since this one will be true most of the time - if (1 === $numbOfWhiteTokens) { - $tokens[$startIndex] = new Token([ - T_WHITESPACE, - Preg::replace('/\r\n|\n/', '', $tokens[$startIndex]->getContent(), $lineBreakCount - $reqLineCount), - ]); - - return; - } - - // $numbOfWhiteTokens = > 1 - $toReplaceCount = $lineBreakCount - $reqLineCount; - for ($i = $startIndex; $i < $endIndex && $toReplaceCount > 0; ++$i) { - $tokenLineCount = substr_count($tokens[$i]->getContent(), "\n"); - if ($tokenLineCount > 0) { - $tokens[$i] = new Token([ - T_WHITESPACE, - Preg::replace('/\r\n|\n/', '', $tokens[$i]->getContent(), min($toReplaceCount, $tokenLineCount)), - ]); - $toReplaceCount -= $tokenLineCount; - } - } - } - - /** - * @param int $whiteSpaceStartIndex - * @param int $whiteSpaceEndIndex - * - * @return int - */ - private function getLineBreakCount(Tokens $tokens, $whiteSpaceStartIndex, $whiteSpaceEndIndex) - { - $lineCount = 0; - for ($i = $whiteSpaceStartIndex; $i < $whiteSpaceEndIndex; ++$i) { - $lineCount += substr_count($tokens[$i]->getContent(), "\n"); - } - - return $lineCount; - } - - /** - * @param int $commentIndex - * - * @return int - */ - private function findCommentBlockStart(Tokens $tokens, $commentIndex) - { - $start = $commentIndex; - for ($i = $commentIndex - 1; $i > 0; --$i) { - if ($tokens[$i]->isComment()) { - $start = $i; - - continue; - } - - if (!$tokens[$i]->isWhitespace() || $this->getLineBreakCount($tokens, $i, $i + 1) > 1) { - break; - } - } - - return $start; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php deleted file mode 100644 index 3cc538a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php +++ /dev/null @@ -1,436 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AliasedFixerOptionBuilder; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * Fixer for part of the rules defined in PSR2 ¶4.1 Extends and Implements and PSR12 ¶8. Anonymous Classes. - * - * @author SpacePossum - */ -final class ClassDefinitionFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Whitespace around the keywords of a class, trait or interfaces definition should be one space.', - [ - new CodeSample( - ' true] - ), - new CodeSample( - ' true] - ), - new CodeSample( - ' true] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - // -4, one for count to index, 3 because min. of tokens for a classy location. - for ($index = $tokens->getSize() - 4; $index > 0; --$index) { - if ($tokens[$index]->isClassy()) { - $this->fixClassyDefinition($tokens, $index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new AliasedFixerOptionBuilder( - new FixerOptionBuilder('multi_line_extends_each_single_line', 'Whether definitions should be multiline.'), - 'multiLineExtendsEachSingleLine' - )) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new AliasedFixerOptionBuilder( - new FixerOptionBuilder('single_item_single_line', 'Whether definitions should be single line when including a single item.'), - 'singleItemSingleLine' - )) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new AliasedFixerOptionBuilder( - new FixerOptionBuilder('single_line', 'Whether definitions should be single line.'), - 'singleLine' - )) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * @param int $classyIndex Class definition token start index - */ - private function fixClassyDefinition(Tokens $tokens, $classyIndex) - { - $classDefInfo = $this->getClassyDefinitionInfo($tokens, $classyIndex); - - // PSR2 4.1 Lists of implements MAY be split across multiple lines, where each subsequent line is indented once. - // When doing so, the first item in the list MUST be on the next line, and there MUST be only one interface per line. - - if (false !== $classDefInfo['implements']) { - $classDefInfo['implements'] = $this->fixClassyDefinitionImplements( - $tokens, - $classDefInfo['open'], - $classDefInfo['implements'] - ); - } - - if (false !== $classDefInfo['extends']) { - $classDefInfo['extends'] = $this->fixClassyDefinitionExtends( - $tokens, - false === $classDefInfo['implements'] ? $classDefInfo['open'] : $classDefInfo['implements']['start'], - $classDefInfo['extends'] - ); - } - - // PSR2: class definition open curly brace must go on a new line. - // PSR12: anonymous class curly brace on same line if not multi line implements. - - $classDefInfo['open'] = $this->fixClassyDefinitionOpenSpacing($tokens, $classDefInfo); - if ($classDefInfo['implements']) { - $end = $classDefInfo['implements']['start']; - } elseif ($classDefInfo['extends']) { - $end = $classDefInfo['extends']['start']; - } else { - $end = $tokens->getPrevNonWhitespace($classDefInfo['open']); - } - - // 4.1 The extends and implements keywords MUST be declared on the same line as the class name. - $this->makeClassyDefinitionSingleLine( - $tokens, - $classDefInfo['anonymousClass'] ? $tokens->getPrevMeaningfulToken($classyIndex) : $classDefInfo['start'], - $end - ); - } - - /** - * @param int $classOpenIndex - * - * @return array - */ - private function fixClassyDefinitionExtends(Tokens $tokens, $classOpenIndex, array $classExtendsInfo) - { - $endIndex = $tokens->getPrevNonWhitespace($classOpenIndex); - - if ($this->configuration['single_line'] || false === $classExtendsInfo['multiLine']) { - $this->makeClassyDefinitionSingleLine($tokens, $classExtendsInfo['start'], $endIndex); - $classExtendsInfo['multiLine'] = false; - } elseif ($this->configuration['single_item_single_line'] && 1 === $classExtendsInfo['numberOfExtends']) { - $this->makeClassyDefinitionSingleLine($tokens, $classExtendsInfo['start'], $endIndex); - $classExtendsInfo['multiLine'] = false; - } elseif ($this->configuration['multi_line_extends_each_single_line'] && $classExtendsInfo['multiLine']) { - $this->makeClassyInheritancePartMultiLine($tokens, $classExtendsInfo['start'], $endIndex); - $classExtendsInfo['multiLine'] = true; - } - - return $classExtendsInfo; - } - - /** - * @param int $classOpenIndex - * - * @return array - */ - private function fixClassyDefinitionImplements(Tokens $tokens, $classOpenIndex, array $classImplementsInfo) - { - $endIndex = $tokens->getPrevNonWhitespace($classOpenIndex); - - if ($this->configuration['single_line'] || false === $classImplementsInfo['multiLine']) { - $this->makeClassyDefinitionSingleLine($tokens, $classImplementsInfo['start'], $endIndex); - $classImplementsInfo['multiLine'] = false; - } elseif ($this->configuration['single_item_single_line'] && 1 === $classImplementsInfo['numberOfImplements']) { - $this->makeClassyDefinitionSingleLine($tokens, $classImplementsInfo['start'], $endIndex); - $classImplementsInfo['multiLine'] = false; - } else { - $this->makeClassyInheritancePartMultiLine($tokens, $classImplementsInfo['start'], $endIndex); - $classImplementsInfo['multiLine'] = true; - } - - return $classImplementsInfo; - } - - /** - * @return int - */ - private function fixClassyDefinitionOpenSpacing(Tokens $tokens, array $classDefInfo) - { - if ($classDefInfo['anonymousClass']) { - if (false !== $classDefInfo['implements']) { - $spacing = $classDefInfo['implements']['multiLine'] ? $this->whitespacesConfig->getLineEnding() : ' '; - } elseif (false !== $classDefInfo['extends']) { - $spacing = $classDefInfo['extends']['multiLine'] ? $this->whitespacesConfig->getLineEnding() : ' '; - } else { - $spacing = ' '; - } - } else { - $spacing = $this->whitespacesConfig->getLineEnding(); - } - - $openIndex = $tokens->getNextTokenOfKind($classDefInfo['classy'], ['{']); - if (' ' !== $spacing && false !== strpos($tokens[$openIndex - 1]->getContent(), "\n")) { - return $openIndex; - } - - if ($tokens[$openIndex - 1]->isWhitespace()) { - if (' ' !== $spacing || !$tokens[$tokens->getPrevNonWhitespace($openIndex - 1)]->isComment()) { - $tokens[$openIndex - 1] = new Token([T_WHITESPACE, $spacing]); - } - - return $openIndex; - } - - $tokens->insertAt($openIndex, new Token([T_WHITESPACE, $spacing])); - - return $openIndex + 1; - } - - /** - * @param int $classyIndex - * - * @return array - */ - private function getClassyDefinitionInfo(Tokens $tokens, $classyIndex) - { - $openIndex = $tokens->getNextTokenOfKind($classyIndex, ['{']); - $prev = $tokens->getPrevMeaningfulToken($classyIndex); - $startIndex = $tokens[$prev]->isGivenKind([T_FINAL, T_ABSTRACT]) ? $prev : $classyIndex; - - $extends = false; - $implements = false; - $anonymousClass = false; - - if (!$tokens[$classyIndex]->isGivenKind(T_TRAIT)) { - $extends = $tokens->findGivenKind(T_EXTENDS, $classyIndex, $openIndex); - $extends = \count($extends) ? $this->getClassyInheritanceInfo($tokens, key($extends), 'numberOfExtends') : false; - - if (!$tokens[$classyIndex]->isGivenKind(T_INTERFACE)) { - $implements = $tokens->findGivenKind(T_IMPLEMENTS, $classyIndex, $openIndex); - $implements = \count($implements) ? $this->getClassyInheritanceInfo($tokens, key($implements), 'numberOfImplements') : false; - $tokensAnalyzer = new TokensAnalyzer($tokens); - $anonymousClass = $tokensAnalyzer->isAnonymousClass($classyIndex); - } - } - - return [ - 'start' => $startIndex, - 'classy' => $classyIndex, - 'open' => $openIndex, - 'extends' => $extends, - 'implements' => $implements, - 'anonymousClass' => $anonymousClass, - ]; - } - - /** - * @param int $startIndex - * @param string $label - * - * @return array - */ - private function getClassyInheritanceInfo(Tokens $tokens, $startIndex, $label) - { - $implementsInfo = ['start' => $startIndex, $label => 1, 'multiLine' => false]; - ++$startIndex; - $endIndex = $tokens->getNextTokenOfKind($startIndex, ['{', [T_IMPLEMENTS], [T_EXTENDS]]); - $endIndex = $tokens[$endIndex]->equals('{') ? $tokens->getPrevNonWhitespace($endIndex) : $endIndex; - for ($i = $startIndex; $i < $endIndex; ++$i) { - if ($tokens[$i]->equals(',')) { - ++$implementsInfo[$label]; - - continue; - } - - if (!$implementsInfo['multiLine'] && false !== strpos($tokens[$i]->getContent(), "\n")) { - $implementsInfo['multiLine'] = true; - } - } - - return $implementsInfo; - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function makeClassyDefinitionSingleLine(Tokens $tokens, $startIndex, $endIndex) - { - for ($i = $endIndex; $i >= $startIndex; --$i) { - if ($tokens[$i]->isWhitespace()) { - $prevNonWhite = $tokens->getPrevNonWhitespace($i); - $nextNonWhite = $tokens->getNextNonWhitespace($i); - - if ($tokens[$prevNonWhite]->isComment() || $tokens[$nextNonWhite]->isComment()) { - $content = $tokens[$prevNonWhite]->getContent(); - if (!('#' === $content || '//' === substr($content, 0, 2))) { - $content = $tokens[$nextNonWhite]->getContent(); - if (!('#' === $content || '//' === substr($content, 0, 2))) { - $tokens[$i] = new Token([T_WHITESPACE, ' ']); - } - } - - continue; - } - - if ($tokens[$i + 1]->equalsAny([',', '(', ')']) || $tokens[$i - 1]->equals('(')) { - $tokens->clearAt($i); - - continue; - } - - $tokens[$i] = new Token([T_WHITESPACE, ' ']); - - continue; - } - - if ($tokens[$i]->equals(',') && !$tokens[$i + 1]->isWhitespace()) { - $tokens->insertAt($i + 1, new Token([T_WHITESPACE, ' '])); - - continue; - } - - if (!$tokens[$i]->isComment()) { - continue; - } - - if (!$tokens[$i + 1]->isWhitespace() && !$tokens[$i + 1]->isComment() && false === strpos($tokens[$i]->getContent(), "\n")) { - $tokens->insertAt($i + 1, new Token([T_WHITESPACE, ' '])); - } - - if (!$tokens[$i - 1]->isWhitespace() && !$tokens[$i - 1]->isComment()) { - $tokens->insertAt($i, new Token([T_WHITESPACE, ' '])); - } - } - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function makeClassyInheritancePartMultiLine(Tokens $tokens, $startIndex, $endIndex) - { - for ($i = $endIndex; $i > $startIndex; --$i) { - $previousInterfaceImplementingIndex = $tokens->getPrevTokenOfKind($i, [',', [T_IMPLEMENTS], [T_EXTENDS]]); - $breakAtIndex = $tokens->getNextMeaningfulToken($previousInterfaceImplementingIndex); - // make the part of a ',' or 'implements' single line - $this->makeClassyDefinitionSingleLine( - $tokens, - $breakAtIndex, - $i - ); - - // make sure the part is on its own line - $isOnOwnLine = false; - for ($j = $breakAtIndex; $j > $previousInterfaceImplementingIndex; --$j) { - if (false !== strpos($tokens[$j]->getContent(), "\n")) { - $isOnOwnLine = true; - - break; - } - } - - if (!$isOnOwnLine) { - if ($tokens[$breakAtIndex - 1]->isWhitespace()) { - $tokens[$breakAtIndex - 1] = new Token([ - T_WHITESPACE, - $this->whitespacesConfig->getLineEnding().$this->whitespacesConfig->getIndent(), - ]); - } else { - $tokens->insertAt($breakAtIndex, new Token([T_WHITESPACE, $this->whitespacesConfig->getLineEnding().$this->whitespacesConfig->getIndent()])); - } - } - - $i = $previousInterfaceImplementingIndex + 1; - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php deleted file mode 100644 index 43a3161..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php +++ /dev/null @@ -1,60 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * @author Filippo Tessarotto - */ -final class FinalClassFixer extends AbstractProxyFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'All classes must be final, except abstract ones and Doctrine entities.', - [ - new CodeSample( - 'configure([ - 'annotation-white-list' => [], - 'consider-absent-docblock-as-internal-class' => true, - ]); - - return [$fixer]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php deleted file mode 100644 index 99c6bb3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php +++ /dev/null @@ -1,214 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class FinalInternalClassFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $intersect = array_intersect_assoc( - $this->configuration['annotation-white-list'], - $this->configuration['annotation-black-list'] - ); - - if (\count($intersect)) { - throw new InvalidFixerConfigurationException($this->getName(), sprintf('Annotation cannot be used in both the include and exclude list, got duplicates: "%s".', implode('", "', array_keys($intersect)))); - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Internal classes should be `final`.', - [ - new CodeSample(" ['@Custom'], - ] - ), - ], - null, - 'Changing classes to `final` might cause code execution to break.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before FinalStaticAccessFixer, ProtectedToPrivateFixer, SelfStaticAccessorFixer. - * Must run after PhpUnitInternalClassFixer. - */ - public function getPriority() - { - return 67; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_CLASS); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - if (!$tokens[$index]->isGivenKind(T_CLASS) || !$this->isClassCandidate($tokens, $index)) { - continue; - } - - // make class final - $tokens->insertAt( - $index, - [ - new Token([T_FINAL, 'final']), - new Token([T_WHITESPACE, ' ']), - ] - ); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $annotationsAsserts = [static function (array $values) { - foreach ($values as $value) { - if (!\is_string($value) || '' === $value) { - return false; - } - } - - return true; - }]; - - $annotationsNormalizer = static function (Options $options, array $value) { - $newValue = []; - foreach ($value as $key) { - if ('@' === $key[0]) { - $key = substr($key, 1); - } - - $newValue[strtolower($key)] = true; - } - - return $newValue; - }; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('annotation-white-list', 'Class level annotations tags that must be set in order to fix the class. (case insensitive)')) - ->setAllowedTypes(['array']) - ->setAllowedValues($annotationsAsserts) - ->setDefault(['@internal']) - ->setNormalizer($annotationsNormalizer) - ->getOption(), - (new FixerOptionBuilder('annotation-black-list', 'Class level annotations tags that must be omitted to fix the class, even if all of the excluded ones are used as well. (case insensitive)')) - ->setAllowedTypes(['array']) - ->setAllowedValues($annotationsAsserts) - ->setDefault([ - '@final', - '@Entity', - '@ORM\Entity', - '@ORM\Mapping\Entity', - '@Mapping\Entity', - ]) - ->setNormalizer($annotationsNormalizer) - ->getOption(), - (new FixerOptionBuilder('consider-absent-docblock-as-internal-class', 'Should classes without any DocBlock be fixed to final?')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * @param int $index T_CLASS index - * - * @return bool - */ - private function isClassCandidate(Tokens $tokens, $index) - { - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind([T_ABSTRACT, T_FINAL, T_NEW])) { - return false; // ignore class; it is abstract or already final - } - - $docToken = $tokens[$tokens->getPrevNonWhitespace($index)]; - - if (!$docToken->isGivenKind(T_DOC_COMMENT)) { - return $this->configuration['consider-absent-docblock-as-internal-class']; - } - - $doc = new DocBlock($docToken->getContent()); - $tags = []; - - foreach ($doc->getAnnotations() as $annotation) { - Preg::match('/@\S+(?=\s|$)/', $annotation->getContent(), $matches); - $tag = strtolower(substr(array_shift($matches), 1)); - foreach ($this->configuration['annotation-black-list'] as $tagStart => $true) { - if (0 === strpos($tag, $tagStart)) { - return false; // ignore class: class-level PHPDoc contains tag that has been excluded through configuration - } - } - - $tags[$tag] = true; - } - - foreach ($this->configuration['annotation-white-list'] as $tag => $true) { - if (!isset($tags[$tag])) { - return false; // ignore class: class-level PHPDoc does not contain all tags that has been included through configuration - } - } - - return true; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php deleted file mode 100644 index fe6828e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php +++ /dev/null @@ -1,168 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class FinalPublicMethodForAbstractClassFixer extends AbstractFixer -{ - /** - * @var array - */ - private $magicMethods = [ - '__construct' => true, - '__destruct' => true, - '__call' => true, - '__callstatic' => true, - '__get' => true, - '__set' => true, - '__isset' => true, - '__unset' => true, - '__sleep' => true, - '__wakeup' => true, - '__tostring' => true, - '__invoke' => true, - '__set_state' => true, - '__clone' => true, - '__debuginfo' => true, - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'All `public` methods of `abstract` classes should be `final`.', - [ - new CodeSample( - 'isAllTokenKindsFound([T_CLASS, T_ABSTRACT, T_PUBLIC, T_FUNCTION]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $classes = array_keys($tokens->findGivenKind(T_CLASS)); - - while ($classIndex = array_pop($classes)) { - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($classIndex)]; - if (!$prevToken->isGivenKind([T_ABSTRACT])) { - continue; - } - - $classOpen = $tokens->getNextTokenOfKind($classIndex, ['{']); - $classClose = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classOpen); - - $this->fixClass($tokens, $classOpen, $classClose); - } - } - - /** - * @param int $classOpenIndex - * @param int $classCloseIndex - */ - private function fixClass(Tokens $tokens, $classOpenIndex, $classCloseIndex) - { - for ($index = $classCloseIndex - 1; $index > $classOpenIndex; --$index) { - // skip method contents - if ($tokens[$index]->equals('}')) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - // skip non public methods - if (!$tokens[$index]->isGivenKind(T_PUBLIC)) { - continue; - } - $nextIndex = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$nextIndex]; - if ($nextToken->isGivenKind(T_STATIC)) { - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - $nextToken = $tokens[$nextIndex]; - } - - // skip uses, attributes, constants etc - if (!$nextToken->isGivenKind(T_FUNCTION)) { - continue; - } - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - $nextToken = $tokens[$nextIndex]; - - // skip magic methods - if (isset($this->magicMethods[strtolower($nextToken->getContent())])) { - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - if ($prevToken->isGivenKind(T_STATIC)) { - $index = $prevIndex; - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - } - // skip abstract or already final methods - if ($prevToken->isGivenKind([T_ABSTRACT, T_FINAL])) { - $index = $prevIndex; - - continue; - } - - $tokens->insertAt( - $index, - [ - new Token([T_FINAL, 'final']), - new Token([T_WHITESPACE, ' ']), - ] - ); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalStaticAccessFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalStaticAccessFixer.php deleted file mode 100644 index 673e55b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalStaticAccessFixer.php +++ /dev/null @@ -1,154 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author ntzm - */ -final class FinalStaticAccessFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Converts `static` access to `self` access in `final` classes.', - [ - new CodeSample( - 'isAllTokenKindsFound([T_FINAL, T_CLASS, T_STATIC]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - if (!$tokens[$index]->isGivenKind(T_FINAL)) { - continue; - } - - $classTokenIndex = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$classTokenIndex]->isGivenKind(T_CLASS)) { - continue; - } - - $startClassIndex = $tokens->getNextTokenOfKind( - $classTokenIndex, - ['{'] - ); - - $endClassIndex = $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_CURLY_BRACE, - $startClassIndex - ); - - $this->replaceStaticAccessWithSelfAccessBetween( - $tokens, - $startClassIndex, - $endClassIndex - ); - } - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function replaceStaticAccessWithSelfAccessBetween( - Tokens $tokens, - $startIndex, - $endIndex - ) { - for ($index = $startIndex; $index <= $endIndex; ++$index) { - if ($tokens[$index]->isGivenKind(T_CLASS)) { - $index = $this->getEndOfAnonymousClass($tokens, $index); - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_STATIC)) { - continue; - } - - $doubleColonIndex = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$doubleColonIndex]->isGivenKind(T_DOUBLE_COLON)) { - continue; - } - - $tokens[$index] = new Token([T_STRING, 'self']); - } - } - - /** - * @param int $index - * - * @return int - */ - private function getEndOfAnonymousClass(Tokens $tokens, $index) - { - $instantiationBraceStart = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$instantiationBraceStart]->equals('(')) { - $index = $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $instantiationBraceStart - ); - } - - $bodyBraceStart = $tokens->getNextTokenOfKind($index, ['{']); - - return $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_CURLY_BRACE, - $bodyBraceStart - ); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/MethodSeparationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/MethodSeparationFixer.php deleted file mode 100644 index dbb3812..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/MethodSeparationFixer.php +++ /dev/null @@ -1,84 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * @author SpacePossum - * - * @deprecated in 2.8, proxy to ClassAttributesSeparationFixer - */ -final class MethodSeparationFixer extends AbstractProxyFixer implements DeprecatedFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Methods must be separated with one blank line.', - [ - new CodeSample( - 'proxyFixers); - } - - /** - * {@inheritdoc} - */ - protected function createProxyFixers() - { - $fixer = new ClassAttributesSeparationFixer(); - $fixer->configure(['elements' => ['method']]); - - return [$fixer]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php deleted file mode 100644 index faea8c6..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php +++ /dev/null @@ -1,101 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Ceeram - */ -final class NoBlankLinesAfterClassOpeningFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There should be no empty lines after class opening brace.', - [ - new CodeSample( - ' $token) { - if (!$token->isClassy()) { - continue; - } - - $startBraceIndex = $tokens->getNextTokenOfKind($index, ['{']); - if (!$tokens[$startBraceIndex + 1]->isWhitespace()) { - continue; - } - - $this->fixWhitespace($tokens, $startBraceIndex + 1); - } - } - - /** - * Cleanup a whitespace token. - * - * @param int $index - */ - private function fixWhitespace(Tokens $tokens, $index) - { - $content = $tokens[$index]->getContent(); - // if there is more than one new line in the whitespace, then we need to fix it - if (substr_count($content, "\n") > 1) { - // the final bit of the whitespace must be the next statement's indentation - $tokens[$index] = new Token([T_WHITESPACE, $this->whitespacesConfig->getLineEnding().substr($content, strrpos($content, "\n") + 1)]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoNullPropertyInitializationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoNullPropertyInitializationFixer.php deleted file mode 100644 index 2d665c4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoNullPropertyInitializationFixer.php +++ /dev/null @@ -1,98 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author ntzm - */ -final class NoNullPropertyInitializationFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Properties MUST not be explicitly initialized with `null` except when they have a type declaration (PHP 7.4).', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_CLASS, T_TRAIT]) && $tokens->isAnyTokenKindsFound([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_VAR]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - if (!$tokens[$index]->isGivenKind([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_VAR])) { - continue; - } - - while (true) { - $varTokenIndex = $index = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$index]->isGivenKind(T_VARIABLE)) { - break; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->equals('=')) { - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(T_NS_SEPARATOR)) { - $index = $tokens->getNextMeaningfulToken($index); - } - - if ($tokens[$index]->equals([T_STRING, 'null'], false)) { - for ($i = $varTokenIndex + 1; $i <= $index; ++$i) { - if ( - !($tokens[$i]->isWhitespace() && false !== strpos($tokens[$i]->getContent(), "\n")) - && !$tokens[$i]->isComment() - ) { - $tokens->clearAt($i); - } - } - } - - ++$index; - } - - if (!$tokens[$index]->equals(',')) { - break; - } - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php deleted file mode 100644 index 92f24fe..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php +++ /dev/null @@ -1,390 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Matteo Beccati - */ -final class NoPhp4ConstructorFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Convert PHP4-style constructors to `__construct`.', - [ - new CodeSample('isTokenKindFound(T_CLASS); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $classes = array_keys($tokens->findGivenKind(T_CLASS)); - $numClasses = \count($classes); - - for ($i = 0; $i < $numClasses; ++$i) { - $index = $classes[$i]; - - // is it an an anonymous class definition? - if ($tokensAnalyzer->isAnonymousClass($index)) { - continue; - } - - // is it inside a namespace? - $nspIndex = $tokens->getPrevTokenOfKind($index, [[T_NAMESPACE, 'namespace']]); - if (null !== $nspIndex) { - $nspIndex = $tokens->getNextMeaningfulToken($nspIndex); - - // make sure it's not the global namespace, as PHP4 constructors are allowed in there - if (!$tokens[$nspIndex]->equals('{')) { - // unless it's the global namespace, the index currently points to the name - $nspIndex = $tokens->getNextTokenOfKind($nspIndex, [';', '{']); - - if ($tokens[$nspIndex]->equals(';')) { - // the class is inside a (non-block) namespace, no PHP4-code should be in there - break; - } - - // the index points to the { of a block-namespace - $nspEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $nspIndex); - if ($index < $nspEnd) { - // the class is inside a block namespace, skip other classes that might be in it - for ($j = $i + 1; $j < $numClasses; ++$j) { - if ($classes[$j] < $nspEnd) { - ++$i; - } - } - // and continue checking the classes that might follow - continue; - } - } - } - - $classNameIndex = $tokens->getNextMeaningfulToken($index); - $className = $tokens[$classNameIndex]->getContent(); - $classStart = $tokens->getNextTokenOfKind($classNameIndex, ['{']); - $classEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classStart); - - $this->fixConstructor($tokens, $className, $classStart, $classEnd); - $this->fixParent($tokens, $classStart, $classEnd); - } - } - - /** - * Fix constructor within a class, if possible. - * - * @param Tokens $tokens the Tokens instance - * @param string $className the class name - * @param int $classStart the class start index - * @param int $classEnd the class end index - */ - private function fixConstructor(Tokens $tokens, $className, $classStart, $classEnd) - { - $php4 = $this->findFunction($tokens, $className, $classStart, $classEnd); - - if (null === $php4) { - // no PHP4-constructor! - return; - } - - if (!empty($php4['modifiers'][T_ABSTRACT]) || !empty($php4['modifiers'][T_STATIC])) { - // PHP4 constructor can't be abstract or static - return; - } - - $php5 = $this->findFunction($tokens, '__construct', $classStart, $classEnd); - - if (null === $php5) { - // no PHP5-constructor, we can rename the old one to __construct - $tokens[$php4['nameIndex']] = new Token([T_STRING, '__construct']); - - // in some (rare) cases we might have just created an infinite recursion issue - $this->fixInfiniteRecursion($tokens, $php4['bodyIndex'], $php4['endIndex']); - - return; - } - - // does the PHP4-constructor only call $this->__construct($args, ...)? - list($seq, $case) = $this->getWrapperMethodSequence($tokens, '__construct', $php4['startIndex'], $php4['bodyIndex']); - if (null !== $tokens->findSequence($seq, $php4['bodyIndex'] - 1, $php4['endIndex'], $case)) { - // good, delete it! - for ($i = $php4['startIndex']; $i <= $php4['endIndex']; ++$i) { - $tokens->clearAt($i); - } - - return; - } - - // does __construct only call the PHP4-constructor (with the same args)? - list($seq, $case) = $this->getWrapperMethodSequence($tokens, $className, $php4['startIndex'], $php4['bodyIndex']); - if (null !== $tokens->findSequence($seq, $php5['bodyIndex'] - 1, $php5['endIndex'], $case)) { - // that was a weird choice, but we can safely delete it and... - for ($i = $php5['startIndex']; $i <= $php5['endIndex']; ++$i) { - $tokens->clearAt($i); - } - // rename the PHP4 one to __construct - $tokens[$php4['nameIndex']] = new Token([T_STRING, '__construct']); - } - } - - /** - * Fix calls to the parent constructor within a class. - * - * @param Tokens $tokens the Tokens instance - * @param int $classStart the class start index - * @param int $classEnd the class end index - */ - private function fixParent(Tokens $tokens, $classStart, $classEnd) - { - // check calls to the parent constructor - foreach ($tokens->findGivenKind(T_EXTENDS) as $index => $token) { - $parentIndex = $tokens->getNextMeaningfulToken($index); - $parentClass = $tokens[$parentIndex]->getContent(); - - // using parent::ParentClassName() or ParentClassName::ParentClassName() - $parentSeq = $tokens->findSequence([ - [T_STRING], - [T_DOUBLE_COLON], - [T_STRING, $parentClass], - '(', - ], $classStart, $classEnd, [2 => false]); - - if (null !== $parentSeq) { - // we only need indexes - $parentSeq = array_keys($parentSeq); - - // match either of the possibilities - if ($tokens[$parentSeq[0]]->equalsAny([[T_STRING, 'parent'], [T_STRING, $parentClass]], false)) { - // replace with parent::__construct - $tokens[$parentSeq[0]] = new Token([T_STRING, 'parent']); - $tokens[$parentSeq[2]] = new Token([T_STRING, '__construct']); - } - } - - // using $this->ParentClassName() - $parentSeq = $tokens->findSequence([ - [T_VARIABLE, '$this'], - [T_OBJECT_OPERATOR], - [T_STRING, $parentClass], - '(', - ], $classStart, $classEnd, [2 => false]); - - if (null !== $parentSeq) { - // we only need indexes - $parentSeq = array_keys($parentSeq); - - // replace call with parent::__construct() - $tokens[$parentSeq[0]] = new Token([ - T_STRING, - 'parent', - ]); - $tokens[$parentSeq[1]] = new Token([ - T_DOUBLE_COLON, - '::', - ]); - $tokens[$parentSeq[2]] = new Token([T_STRING, '__construct']); - } - } - } - - /** - * Fix a particular infinite recursion issue happening when the parent class has __construct and the child has only - * a PHP4 constructor that calls the parent constructor as $this->__construct(). - * - * @param Tokens $tokens the Tokens instance - * @param int $start the PHP4 constructor body start - * @param int $end the PHP4 constructor body end - */ - private function fixInfiniteRecursion(Tokens $tokens, $start, $end) - { - $seq = [ - [T_VARIABLE, '$this'], - [T_OBJECT_OPERATOR], - [T_STRING, '__construct'], - ]; - - while (true) { - $callSeq = $tokens->findSequence($seq, $start, $end, [2 => false]); - - if (null === $callSeq) { - return; - } - - $callSeq = array_keys($callSeq); - - $tokens[$callSeq[0]] = new Token([T_STRING, 'parent']); - $tokens[$callSeq[1]] = new Token([T_DOUBLE_COLON, '::']); - } - } - - /** - * Generate the sequence of tokens necessary for the body of a wrapper method that simply - * calls $this->{$method}( [args...] ) with the same arguments as its own signature. - * - * @param Tokens $tokens the Tokens instance - * @param string $method the wrapped method name - * @param int $startIndex function/method start index - * @param int $bodyIndex function/method body index - * - * @return array an array containing the sequence and case sensitiveness [ 0 => $seq, 1 => $case ] - */ - private function getWrapperMethodSequence(Tokens $tokens, $method, $startIndex, $bodyIndex) - { - // initialise sequence as { $this->{$method}( - $seq = [ - '{', - [T_VARIABLE, '$this'], - [T_OBJECT_OPERATOR], - [T_STRING, $method], - '(', - ]; - $case = [3 => false]; - - // parse method parameters, if any - $index = $startIndex; - while (true) { - // find the next variable name - $index = $tokens->getNextTokenOfKind($index, [[T_VARIABLE]]); - - if (null === $index || $index >= $bodyIndex) { - // we've reached the body already - break; - } - - // append a comma if it's not the first variable - if (\count($seq) > 5) { - $seq[] = ','; - } - - // append variable name to the sequence - $seq[] = [T_VARIABLE, $tokens[$index]->getContent()]; - } - - // almost done, close the sequence with ); } - $seq[] = ')'; - $seq[] = ';'; - $seq[] = '}'; - - return [$seq, $case]; - } - - /** - * Find a function or method matching a given name within certain bounds. - * - * @param Tokens $tokens the Tokens instance - * @param string $name the function/Method name - * @param int $startIndex the search start index - * @param int $endIndex the search end index - * - * @return null|array An associative array, if a match is found: - * - * - nameIndex (int): The index of the function/method name. - * - startIndex (int): The index of the function/method start. - * - endIndex (int): The index of the function/method end. - * - bodyIndex (int): The index of the function/method body. - * - modifiers (array): The modifiers as array keys and their index as - * the values, e.g. array(T_PUBLIC => 10) - */ - private function findFunction(Tokens $tokens, $name, $startIndex, $endIndex) - { - $function = $tokens->findSequence([ - [T_FUNCTION], - [T_STRING, $name], - '(', - ], $startIndex, $endIndex, false); - - if (null === $function) { - return null; - } - - // keep only the indexes - $function = array_keys($function); - - // find previous block, saving method modifiers for later use - $possibleModifiers = [T_PUBLIC, T_PROTECTED, T_PRIVATE, T_STATIC, T_ABSTRACT, T_FINAL]; - $modifiers = []; - - $prevBlock = $tokens->getPrevMeaningfulToken($function[0]); - while (null !== $prevBlock && $tokens[$prevBlock]->isGivenKind($possibleModifiers)) { - $modifiers[$tokens[$prevBlock]->getId()] = $prevBlock; - $prevBlock = $tokens->getPrevMeaningfulToken($prevBlock); - } - - if (isset($modifiers[T_ABSTRACT])) { - // abstract methods have no body - $bodyStart = null; - $funcEnd = $tokens->getNextTokenOfKind($function[2], [';']); - } else { - // find method body start and the end of the function definition - $bodyStart = $tokens->getNextTokenOfKind($function[2], ['{']); - $funcEnd = null !== $bodyStart ? $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $bodyStart) : null; - } - - return [ - 'nameIndex' => $function[1], - 'startIndex' => $prevBlock + 1, - 'endIndex' => $funcEnd, - 'bodyIndex' => $bodyStart, - 'modifiers' => $modifiers, - ]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.php deleted file mode 100644 index e8259da..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.php +++ /dev/null @@ -1,143 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class NoUnneededFinalMethodFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'A `final` class must not have `final` methods and `private` methods must not be `final`.', - [ - new CodeSample( - 'isAllTokenKindsFound([T_CLASS, T_FINAL]); - } - - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensCount = \count($tokens); - for ($index = 0; $index < $tokensCount; ++$index) { - if (!$tokens[$index]->isGivenKind(T_CLASS)) { - continue; - } - - $classOpen = $tokens->getNextTokenOfKind($index, ['{']); - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - $classIsFinal = $prevToken->isGivenKind(T_FINAL); - - $this->fixClass($tokens, $classOpen, $classIsFinal); - } - } - - /** - * @param int $classOpenIndex - * @param bool $classIsFinal - */ - private function fixClass(Tokens $tokens, $classOpenIndex, $classIsFinal) - { - $tokensCount = \count($tokens); - for ($index = $classOpenIndex + 1; $index < $tokensCount; ++$index) { - // Class end - if ($tokens[$index]->equals('}')) { - return; - } - - // Skip method content - if ($tokens[$index]->equals('{')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_FINAL)) { - continue; - } - - if (!$classIsFinal && !$this->isPrivateMethod($tokens, $index, $classOpenIndex)) { - continue; - } - - $tokens->clearAt($index); - - $nextTokenIndex = $index + 1; - if ($tokens[$nextTokenIndex]->isWhitespace()) { - $tokens->clearAt($nextTokenIndex); - } - } - } - - /** - * @param int $index - * @param int $classOpenIndex - * - * @return bool - */ - private function isPrivateMethod(Tokens $tokens, $index, $classOpenIndex) - { - $index = max($classOpenIndex + 1, $tokens->getPrevTokenOfKind($index, [';', '{', '}'])); - - while (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - if ($tokens[$index]->isGivenKind(T_PRIVATE)) { - return true; - } - - ++$index; - } - - return false; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php deleted file mode 100644 index 02292d0..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php +++ /dev/null @@ -1,500 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gregor Harlan - */ -final class OrderedClassElementsFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** @internal */ - const SORT_ALPHA = 'alpha'; - - /** @internal */ - const SORT_NONE = 'none'; - - /** - * @var array Array containing all class element base types (keys) and their parent types (values) - */ - private static $typeHierarchy = [ - 'use_trait' => null, - 'public' => null, - 'protected' => null, - 'private' => null, - 'constant' => null, - 'constant_public' => ['constant', 'public'], - 'constant_protected' => ['constant', 'protected'], - 'constant_private' => ['constant', 'private'], - 'property' => null, - 'property_static' => ['property'], - 'property_public' => ['property', 'public'], - 'property_protected' => ['property', 'protected'], - 'property_private' => ['property', 'private'], - 'property_public_static' => ['property_static', 'property_public'], - 'property_protected_static' => ['property_static', 'property_protected'], - 'property_private_static' => ['property_static', 'property_private'], - 'method' => null, - 'method_static' => ['method'], - 'method_public' => ['method', 'public'], - 'method_protected' => ['method', 'protected'], - 'method_private' => ['method', 'private'], - 'method_public_static' => ['method_static', 'method_public'], - 'method_protected_static' => ['method_static', 'method_protected'], - 'method_private_static' => ['method_static', 'method_private'], - ]; - - /** - * @var array Array containing special method types - */ - private static $specialTypes = [ - 'construct' => null, - 'destruct' => null, - 'magic' => null, - 'phpunit' => null, - ]; - - /** - * Array of supported sort algorithms in configuration. - * - * @var string[] - */ - private $supportedSortAlgorithms = [ - self::SORT_NONE, - self::SORT_ALPHA, - ]; - - /** - * @var array Resolved configuration array (type => position) - */ - private $typePosition; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->typePosition = []; - $pos = 0; - foreach ($this->configuration['order'] as $type) { - $this->typePosition[$type] = $pos++; - } - - foreach (self::$typeHierarchy as $type => $parents) { - if (isset($this->typePosition[$type])) { - continue; - } - - if (!$parents) { - $this->typePosition[$type] = null; - - continue; - } - - foreach ($parents as $parent) { - if (isset($this->typePosition[$parent])) { - $this->typePosition[$type] = $this->typePosition[$parent]; - - continue 2; - } - } - - $this->typePosition[$type] = null; - } - - $lastPosition = \count($this->configuration['order']); - foreach ($this->typePosition as &$pos) { - if (null === $pos) { - $pos = $lastPosition; - } - // last digit is used by phpunit method ordering - $pos *= 10; - } - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Orders the elements of classes/interfaces/traits.', - [ - new CodeSample( - ' ['method_private', 'method_public']] - ), - new CodeSample( - ' ['method_public'], 'sortAlgorithm' => 'alpha'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before ClassAttributesSeparationFixer, MethodSeparationFixer, NoBlankLinesAfterClassOpeningFixer, SpaceAfterSemicolonFixer. - * Must run after NoPhp4ConstructorFixer, ProtectedToPrivateFixer. - */ - public function getPriority() - { - return 65; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($i = 1, $count = $tokens->count(); $i < $count; ++$i) { - if (!$tokens[$i]->isClassy()) { - continue; - } - - $i = $tokens->getNextTokenOfKind($i, ['{']); - $elements = $this->getElements($tokens, $i); - - if (0 === \count($elements)) { - continue; - } - - $sorted = $this->sortElements($elements); - $endIndex = $elements[\count($elements) - 1]['end']; - - if ($sorted !== $elements) { - $this->sortTokens($tokens, $i, $endIndex, $sorted); - } - - $i = $endIndex; - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolverRootless('order', [ - (new FixerOptionBuilder('order', 'List of strings defining order of elements.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(array_keys(array_merge(self::$typeHierarchy, self::$specialTypes)))]) - ->setDefault([ - 'use_trait', - 'constant_public', - 'constant_protected', - 'constant_private', - 'property_public', - 'property_protected', - 'property_private', - 'construct', - 'destruct', - 'magic', - 'phpunit', - 'method_public', - 'method_protected', - 'method_private', - ]) - ->getOption(), - (new FixerOptionBuilder('sortAlgorithm', 'How multiple occurrences of same type statements should be sorted')) - ->setAllowedValues($this->supportedSortAlgorithms) - ->setDefault(self::SORT_NONE) - ->getOption(), - ], $this->getName()); - } - - /** - * @param int $startIndex - * - * @return array[] - */ - private function getElements(Tokens $tokens, $startIndex) - { - static $elementTokenKinds = [CT::T_USE_TRAIT, T_CONST, T_VARIABLE, T_FUNCTION]; - - ++$startIndex; - $elements = []; - - while (true) { - $element = [ - 'start' => $startIndex, - 'visibility' => 'public', - 'static' => false, - ]; - - for ($i = $startIndex;; ++$i) { - $token = $tokens[$i]; - - // class end - if ($token->equals('}')) { - return $elements; - } - - if ($token->isGivenKind(T_STATIC)) { - $element['static'] = true; - - continue; - } - - if ($token->isGivenKind([T_PROTECTED, T_PRIVATE])) { - $element['visibility'] = strtolower($token->getContent()); - - continue; - } - - if (!$token->isGivenKind($elementTokenKinds)) { - continue; - } - - $type = $this->detectElementType($tokens, $i); - if (\is_array($type)) { - $element['type'] = $type[0]; - $element['name'] = $type[1]; - } else { - $element['type'] = $type; - } - - if ('property' === $element['type']) { - $element['name'] = $tokens[$i]->getContent(); - } elseif (\in_array($element['type'], ['use_trait', 'constant', 'method', 'magic', 'construct', 'destruct'], true)) { - $element['name'] = $tokens[$tokens->getNextMeaningfulToken($i)]->getContent(); - } - - $element['end'] = $this->findElementEnd($tokens, $i); - - break; - } - - $elements[] = $element; - $startIndex = $element['end'] + 1; - } - } - - /** - * @param int $index - * - * @return array|string type or array of type and name - */ - private function detectElementType(Tokens $tokens, $index) - { - $token = $tokens[$index]; - - if ($token->isGivenKind(CT::T_USE_TRAIT)) { - return 'use_trait'; - } - - if ($token->isGivenKind(T_CONST)) { - return 'constant'; - } - - if ($token->isGivenKind(T_VARIABLE)) { - return 'property'; - } - - $nameToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - - if ($nameToken->equals([T_STRING, '__construct'], false)) { - return 'construct'; - } - - if ($nameToken->equals([T_STRING, '__destruct'], false)) { - return 'destruct'; - } - - if ( - $nameToken->equalsAny([ - [T_STRING, 'setUpBeforeClass'], - [T_STRING, 'tearDownAfterClass'], - [T_STRING, 'setUp'], - [T_STRING, 'tearDown'], - ], false) - ) { - return ['phpunit', strtolower($nameToken->getContent())]; - } - - if ('__' === substr($nameToken->getContent(), 0, 2)) { - return 'magic'; - } - - return 'method'; - } - - /** - * @param int $index - * - * @return int - */ - private function findElementEnd(Tokens $tokens, $index) - { - $index = $tokens->getNextTokenOfKind($index, ['{', ';']); - - if ($tokens[$index]->equals('{')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - } - - for (++$index; $tokens[$index]->isWhitespace(" \t") || $tokens[$index]->isComment(); ++$index); - - --$index; - - return $tokens[$index]->isWhitespace() ? $index - 1 : $index; - } - - /** - * @param array[] $elements - * - * @return array[] - */ - private function sortElements(array $elements) - { - static $phpunitPositions = [ - 'setupbeforeclass' => 1, - 'teardownafterclass' => 2, - 'setup' => 3, - 'teardown' => 4, - ]; - - foreach ($elements as &$element) { - $type = $element['type']; - - if (\array_key_exists($type, self::$specialTypes)) { - if (isset($this->typePosition[$type])) { - $element['position'] = $this->typePosition[$type]; - if ('phpunit' === $type) { - $element['position'] += $phpunitPositions[$element['name']]; - } - - continue; - } - - $type = 'method'; - } - - if (\in_array($type, ['constant', 'property', 'method'], true)) { - $type .= '_'.$element['visibility']; - if ($element['static']) { - $type .= '_static'; - } - } - - $element['position'] = $this->typePosition[$type]; - } - unset($element); - - usort($elements, function (array $a, array $b) { - if ($a['position'] === $b['position']) { - return $this->sortGroupElements($a, $b); - } - - return $a['position'] > $b['position'] ? 1 : -1; - }); - - return $elements; - } - - private function sortGroupElements(array $a, array $b) - { - $selectedSortAlgorithm = $this->configuration['sortAlgorithm']; - - if (self::SORT_ALPHA === $selectedSortAlgorithm) { - return strcasecmp($a['name'], $b['name']); - } - - return $a['start'] > $b['start'] ? 1 : -1; - } - - /** - * @param int $startIndex - * @param int $endIndex - * @param array[] $elements - */ - private function sortTokens(Tokens $tokens, $startIndex, $endIndex, array $elements) - { - $replaceTokens = []; - - foreach ($elements as $element) { - for ($i = $element['start']; $i <= $element['end']; ++$i) { - $replaceTokens[] = clone $tokens[$i]; - } - } - - $tokens->overrideRange($startIndex + 1, $endIndex, $replaceTokens); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php deleted file mode 100644 index e8ad880..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php +++ /dev/null @@ -1,231 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dave van der Brugge - */ -final class OrderedInterfacesFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** @internal */ - const OPTION_DIRECTION = 'direction'; - - /** @internal */ - const OPTION_ORDER = 'order'; - - /** @internal */ - const DIRECTION_ASCEND = 'ascend'; - - /** @internal */ - const DIRECTION_DESCEND = 'descend'; - - /** @internal */ - const ORDER_ALPHA = 'alpha'; - - /** @internal */ - const ORDER_LENGTH = 'length'; - - /** - * Array of supported directions in configuration. - * - * @var string[] - */ - private $supportedDirectionOptions = [ - self::DIRECTION_ASCEND, - self::DIRECTION_DESCEND, - ]; - - /** - * Array of supported orders in configuration. - * - * @var string[] - */ - private $supportedOrderOptions = [ - self::ORDER_ALPHA, - self::ORDER_LENGTH, - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Orders the interfaces in an `implements` or `interface extends` clause.', - [ - new CodeSample( - " self::DIRECTION_DESCEND] - ), - new CodeSample( - " self::ORDER_LENGTH] - ), - new CodeSample( - " self::ORDER_LENGTH, - self::OPTION_DIRECTION => self::DIRECTION_DESCEND, - ] - ), - ], - null, - "Risky for `implements` when specifying both an interface and its parent interface, because PHP doesn't break on `parent, child` but does on `child, parent`." - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_IMPLEMENTS) - || $tokens->isAllTokenKindsFound([T_INTERFACE, T_EXTENDS]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_IMPLEMENTS)) { - if (!$token->isGivenKind(T_EXTENDS)) { - continue; - } - - $nameTokenIndex = $tokens->getPrevMeaningfulToken($index); - $interfaceTokenIndex = $tokens->getPrevMeaningfulToken($nameTokenIndex); - $interfaceToken = $tokens[$interfaceTokenIndex]; - - if (!$interfaceToken->isGivenKind(T_INTERFACE)) { - continue; - } - } - - $interfaceIndex = 0; - $interfaces = [['tokens' => []]]; - - $implementsStart = $index + 1; - $classStart = $tokens->getNextTokenOfKind($implementsStart, ['{']); - $implementsEnd = $tokens->getPrevNonWhitespace($classStart); - - for ($i = $implementsStart; $i <= $implementsEnd; ++$i) { - if ($tokens[$i]->equals(',')) { - ++$interfaceIndex; - $interfaces[$interfaceIndex] = ['tokens' => []]; - - continue; - } - - $interfaces[$interfaceIndex]['tokens'][] = $tokens[$i]; - } - - if (1 === \count($interfaces)) { - continue; - } - - foreach ($interfaces as $interfaceIndex => $interface) { - $interfaceTokens = Tokens::fromArray($interface['tokens'], false); - - $normalized = ''; - $actualInterfaceIndex = $interfaceTokens->getNextMeaningfulToken(-1); - - while ($interfaceTokens->offsetExists($actualInterfaceIndex)) { - $token = $interfaceTokens[$actualInterfaceIndex]; - - if (null === $token || $token->isComment() || $token->isWhitespace()) { - break; - } - - $normalized .= str_replace('\\', ' ', $token->getContent()); - ++$actualInterfaceIndex; - } - - $interfaces[$interfaceIndex]['normalized'] = $normalized; - $interfaces[$interfaceIndex]['originalIndex'] = $interfaceIndex; - } - - usort($interfaces, function (array $first, array $second) { - $score = self::ORDER_LENGTH === $this->configuration[self::OPTION_ORDER] - ? \strlen($first['normalized']) - \strlen($second['normalized']) - : strcasecmp($first['normalized'], $second['normalized']); - - if (self::DIRECTION_DESCEND === $this->configuration[self::OPTION_DIRECTION]) { - $score *= -1; - } - - return $score; - }); - - $changed = false; - - foreach ($interfaces as $interfaceIndex => $interface) { - if ($interface['originalIndex'] !== $interfaceIndex) { - $changed = true; - - break; - } - } - - if (!$changed) { - continue; - } - - $newTokens = array_shift($interfaces)['tokens']; - - foreach ($interfaces as $interface) { - array_push($newTokens, new Token(','), ...$interface['tokens']); - } - - $tokens->overrideRange($implementsStart, $implementsEnd, $newTokens); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder(self::OPTION_ORDER, 'How the interfaces should be ordered')) - ->setAllowedValues($this->supportedOrderOptions) - ->setDefault(self::ORDER_ALPHA) - ->getOption(), - (new FixerOptionBuilder(self::OPTION_DIRECTION, 'Which direction the interfaces should be ordered')) - ->setAllowedValues($this->supportedDirectionOptions) - ->setDefault(self::DIRECTION_ASCEND) - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php deleted file mode 100644 index 6c6c502..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php +++ /dev/null @@ -1,140 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - * @author SpacePossum - */ -final class ProtectedToPrivateFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Converts `protected` variables and methods to `private` where possible.', - [ - new CodeSample( - 'isAllTokenKindsFound([T_CLASS, T_FINAL, T_PROTECTED]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $end = \count($tokens) - 3; // min. number of tokens to form a class candidate to fix - for ($index = 0; $index < $end; ++$index) { - if (!$tokens[$index]->isGivenKind(T_CLASS)) { - continue; - } - - $classOpen = $tokens->getNextTokenOfKind($index, ['{']); - $classClose = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classOpen); - - if (!$this->skipClass($tokens, $index, $classOpen, $classClose)) { - $this->fixClass($tokens, $classOpen, $classClose); - } - - $index = $classClose; - } - } - - /** - * @param int $classOpenIndex - * @param int $classCloseIndex - */ - private function fixClass(Tokens $tokens, $classOpenIndex, $classCloseIndex) - { - for ($index = $classOpenIndex + 1; $index < $classCloseIndex; ++$index) { - if ($tokens[$index]->equals('{')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_PROTECTED)) { - continue; - } - - $tokens[$index] = new Token([T_PRIVATE, 'private']); - } - } - - /** - * Decide whether or not skip the fix for given class. - * - * @param int $classIndex - * @param int $classOpenIndex - * @param int $classCloseIndex - * - * @return bool - */ - private function skipClass(Tokens $tokens, $classIndex, $classOpenIndex, $classCloseIndex) - { - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($classIndex)]; - if (!$prevToken->isGivenKind(T_FINAL)) { - return true; - } - - for ($index = $classIndex; $index < $classOpenIndex; ++$index) { - if ($tokens[$index]->isGivenKind(T_EXTENDS)) { - return true; - } - } - - $useIndex = $tokens->getNextTokenOfKind($classIndex, [[CT::T_USE_TRAIT]]); - - return $useIndex && $useIndex < $classCloseIndex; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php deleted file mode 100644 index ed6966a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php +++ /dev/null @@ -1,191 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gregor Harlan - */ -final class SelfAccessorFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Inside class or interface element `self` should be preferred to the class name itself.', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_CLASS, T_INTERFACE]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - foreach ((new NamespacesAnalyzer())->getDeclarations($tokens) as $namespace) { - for ($index = $namespace->getScopeStartIndex(); $index < $namespace->getScopeEndIndex(); ++$index) { - if (!$tokens[$index]->isGivenKind([T_CLASS, T_INTERFACE]) || $tokensAnalyzer->isAnonymousClass($index)) { - continue; - } - - $nameIndex = $tokens->getNextTokenOfKind($index, [[T_STRING]]); - $startIndex = $tokens->getNextTokenOfKind($nameIndex, ['{']); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $startIndex); - - $name = $tokens[$nameIndex]->getContent(); - - $this->replaceNameOccurrences($tokens, $namespace->getFullName(), $name, $startIndex, $endIndex); - - $index = $endIndex; - } - } - } - - /** - * Replace occurrences of the name of the classy element by "self" (if possible). - * - * @param string $namespace - * @param string $name - * @param int $startIndex - * @param int $endIndex - */ - private function replaceNameOccurrences(Tokens $tokens, $namespace, $name, $startIndex, $endIndex) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $insideMethodSignatureUntil = null; - - for ($i = $startIndex; $i < $endIndex; ++$i) { - if ($i === $insideMethodSignatureUntil) { - $insideMethodSignatureUntil = null; - } - - $token = $tokens[$i]; - - // skip anonymous classes - if ($token->isGivenKind(T_CLASS) && $tokensAnalyzer->isAnonymousClass($i)) { - $i = $tokens->getNextTokenOfKind($i, ['{']); - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $i); - - continue; - } - - if ($token->isGivenKind(T_FUNCTION)) { - $i = $tokens->getNextTokenOfKind($i, ['(']); - $insideMethodSignatureUntil = $tokens->getNextTokenOfKind($i, ['{', ';']); - - continue; - } - - if (!$token->equals([T_STRING, $name], false)) { - continue; - } - - $nextToken = $tokens[$tokens->getNextMeaningfulToken($i)]; - if ($nextToken->isGivenKind(T_NS_SEPARATOR)) { - continue; - } - - $classStartIndex = $i; - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($i)]; - if ($prevToken->isGivenKind(T_NS_SEPARATOR)) { - $classStartIndex = $this->getClassStart($tokens, $i, $namespace); - if (null === $classStartIndex) { - continue; - } - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($classStartIndex)]; - } - if ($prevToken->isGivenKind([T_OBJECT_OPERATOR, T_STRING])) { - continue; - } - - if ( - $prevToken->isGivenKind([T_INSTANCEOF, T_NEW]) - || $nextToken->isGivenKind(T_PAAMAYIM_NEKUDOTAYIM) - || ( - null !== $insideMethodSignatureUntil - && $i < $insideMethodSignatureUntil - && $prevToken->equalsAny(['(', ',', [CT::T_TYPE_COLON], [CT::T_NULLABLE_TYPE]]) - ) - ) { - for ($j = $classStartIndex; $j < $i; ++$j) { - $tokens->clearTokenAndMergeSurroundingWhitespace($j); - } - $tokens[$i] = new Token([T_STRING, 'self']); - } - } - } - - private function getClassStart(Tokens $tokens, $index, $namespace) - { - $namespace = ('' !== $namespace ? '\\'.$namespace : '').'\\'; - - foreach (array_reverse(Preg::split('/(\\\\)/', $namespace, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)) as $piece) { - $index = $tokens->getPrevMeaningfulToken($index); - if ('\\' === $piece) { - if (!$tokens[$index]->isGivenKind(T_NS_SEPARATOR)) { - return null; - } - } elseif (!$tokens[$index]->equals([T_STRING, $piece], false)) { - return null; - } - } - - return $index; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfStaticAccessorFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfStaticAccessorFixer.php deleted file mode 100644 index 98ea552..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfStaticAccessorFixer.php +++ /dev/null @@ -1,206 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -final class SelfStaticAccessorFixer extends AbstractFixer -{ - /** - * @var TokensAnalyzer - */ - private $tokensAnalyzer; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Inside a `final` class or anonymous class `self` should be preferred to `static`.', - [ - new CodeSample( - 'isAllTokenKindsFound([T_CLASS, T_STATIC]) && $tokens->isAnyTokenKindsFound([T_DOUBLE_COLON, T_NEW, T_INSTANCEOF]); - } - - /** - * {@inheritdoc} - * - * Must run after FinalInternalClassFixer, FunctionToConstantFixer, PhpUnitTestCaseStaticMethodCallsFixer. - */ - public function getPriority() - { - return -10; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $this->tokensAnalyzer = $tokensAnalyzer = new TokensAnalyzer($tokens); - - $classIndex = $tokens->getNextTokenOfKind(0, [[T_CLASS]]); - - while (null !== $classIndex) { - if ( - $tokens[$tokens->getPrevMeaningfulToken($classIndex)]->isGivenKind(T_FINAL) - || $tokensAnalyzer->isAnonymousClass($classIndex) - ) { - $classIndex = $this->fixClass($tokens, $classIndex); - } - - $classIndex = $tokens->getNextTokenOfKind($classIndex, [[T_CLASS]]); - } - } - - /** - * @param int $index - * - * @return int - */ - private function fixClass(Tokens $tokens, $index) - { - $index = $tokens->getNextTokenOfKind($index, ['{']); - $classOpenCount = 1; - - while ($classOpenCount > 0) { - ++$index; - - if ($tokens[$index]->equals('{')) { - ++$classOpenCount; - - continue; - } - - if ($tokens[$index]->equals('}')) { - --$classOpenCount; - - continue; - } - - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { - // do not fix inside lambda - if ($this->tokensAnalyzer->isLambda($index)) { - // figure out where the lambda starts - $index = $tokens->getNextTokenOfKind($index, ['{']); - $openCount = 1; - - do { - $index = $tokens->getNextTokenOfKind($index, ['}', '{', [T_CLASS]]); - if ($tokens[$index]->equals('}')) { - --$openCount; - } elseif ($tokens[$index]->equals('{')) { - ++$openCount; - } else { - $index = $this->fixClass($tokens, $index); - } - } while ($openCount > 0); - } - - continue; - } - - if ($tokens[$index]->isGivenKind([T_NEW, T_INSTANCEOF])) { - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(T_STATIC)) { - $tokens[$index] = new Token([T_STRING, 'self']); - } - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_STATIC)) { - continue; - } - - $staticIndex = $index; - $index = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$index]->isGivenKind(T_DOUBLE_COLON)) { - continue; - } - - $tokens[$staticIndex] = new Token([T_STRING, 'self']); - } - - return $index; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php deleted file mode 100644 index 98b598e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php +++ /dev/null @@ -1,242 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * Fixer for rules defined in PSR2 ¶4.2. - * - * @author Javier Spagnoletti - * @author SpacePossum - * @author Dariusz Rumiński - */ -final class SingleClassElementPerStatementFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - * - * Must run before ClassAttributesSeparationFixer. - */ - public function getPriority() - { - return 56; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There MUST NOT be more than one property or constant declared per statement.', - [ - new CodeSample( - ' ['property']] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $analyzer = new TokensAnalyzer($tokens); - $elements = array_reverse($analyzer->getClassyElements(), true); - - foreach ($elements as $index => $element) { - if (!\in_array($element['type'], $this->configuration['elements'], true)) { - continue; // not in configuration - } - - $this->fixElement($tokens, $element['type'], $index); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $values = ['const', 'property']; - - return new FixerConfigurationResolverRootless('elements', [ - (new FixerOptionBuilder('elements', 'List of strings which element should be modified.')) - ->setDefault($values) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset($values)]) - ->getOption(), - ], $this->getName()); - } - - /** - * @param string $type - * @param int $index - */ - private function fixElement(Tokens $tokens, $type, $index) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $repeatIndex = $index; - - while (true) { - $repeatIndex = $tokens->getNextMeaningfulToken($repeatIndex); - $repeatToken = $tokens[$repeatIndex]; - - if ($tokensAnalyzer->isArray($repeatIndex)) { - if ($repeatToken->isGivenKind(T_ARRAY)) { - $repeatIndex = $tokens->getNextTokenOfKind($repeatIndex, ['(']); - $repeatIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $repeatIndex); - } else { - $repeatIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $repeatIndex); - } - - continue; - } - - if ($repeatToken->equals(';')) { - return; // no repeating found, no fixing needed - } - - if ($repeatToken->equals(',')) { - break; - } - } - - $start = $tokens->getPrevTokenOfKind($index, [';', '{', '}']); - $this->expandElement( - $tokens, - $type, - $tokens->getNextMeaningfulToken($start), - $tokens->getNextTokenOfKind($index, [';']) - ); - } - - /** - * @param string $type - * @param int $startIndex - * @param int $endIndex - */ - private function expandElement(Tokens $tokens, $type, $startIndex, $endIndex) - { - $divisionContent = null; - if ($tokens[$startIndex - 1]->isWhitespace()) { - $divisionContent = $tokens[$startIndex - 1]->getContent(); - if (Preg::match('#(\n|\r\n)#', $divisionContent, $matches)) { - $divisionContent = $matches[0].trim($divisionContent, "\r\n"); - } - } - - // iterate variables to split up - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - $token = $tokens[$i]; - - if ($token->equals(')')) { - $i = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $i); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_CLOSE)) { - $i = $tokens->findBlockStart(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $i); - - continue; - } - - if (!$tokens[$i]->equals(',')) { - continue; - } - - $tokens[$i] = new Token(';'); - if ($tokens[$i + 1]->isWhitespace()) { - $tokens->clearAt($i + 1); - } - - if (null !== $divisionContent && '' !== $divisionContent) { - $tokens->insertAt($i + 1, new Token([T_WHITESPACE, $divisionContent])); - } - - // collect modifiers - $sequence = $this->getModifiersSequences($tokens, $type, $startIndex, $endIndex); - $tokens->insertAt($i + 2, $sequence); - } - } - - /** - * @param string $type - * @param int $startIndex - * @param int $endIndex - * - * @return Token[] - */ - private function getModifiersSequences(Tokens $tokens, $type, $startIndex, $endIndex) - { - if ('property' === $type) { - $tokenKinds = [T_PUBLIC, T_PROTECTED, T_PRIVATE, T_STATIC, T_VAR, T_STRING, T_NS_SEPARATOR, CT::T_NULLABLE_TYPE, CT::T_ARRAY_TYPEHINT]; - } else { - $tokenKinds = [T_PUBLIC, T_PROTECTED, T_PRIVATE, T_CONST]; - } - - $sequence = []; - for ($i = $startIndex; $i < $endIndex - 1; ++$i) { - if ($tokens[$i]->isComment()) { - continue; - } - - if (!$tokens[$i]->isWhitespace() && !$tokens[$i]->isGivenKind($tokenKinds)) { - break; - } - - $sequence[] = clone $tokens[$i]; - } - - return $sequence; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php deleted file mode 100644 index a2419b5..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php +++ /dev/null @@ -1,119 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class SingleTraitInsertPerStatementFixer extends AbstractFixer -{ - public function getDefinition() - { - return new FixerDefinition( - 'Each trait `use` must be done as single statement.', - [ - new CodeSample( - 'isTokenKindFound(CT::T_USE_TRAIT); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = \count($tokens) - 1; 1 < $index; --$index) { - if ($tokens[$index]->isGivenKind(CT::T_USE_TRAIT)) { - $candidates = $this->getCandidates($tokens, $index); - if (\count($candidates) > 0) { - $this->fixTraitUse($tokens, $index, $candidates); - } - } - } - } - - /** - * @param int $useTraitIndex - * @param int[] $candidates ',' indexes to fix - */ - private function fixTraitUse(Tokens $tokens, $useTraitIndex, array $candidates) - { - foreach ($candidates as $commaIndex) { - $inserts = [ - new Token([CT::T_USE_TRAIT, 'use']), - new Token([T_WHITESPACE, ' ']), - ]; - - $nextImportStartIndex = $tokens->getNextMeaningfulToken($commaIndex); - - if ($tokens[$nextImportStartIndex - 1]->isWhitespace()) { - if (1 === Preg::match('/\R/', $tokens[$nextImportStartIndex - 1]->getContent())) { - array_unshift($inserts, clone $tokens[$useTraitIndex - 1]); - } - $tokens->clearAt($nextImportStartIndex - 1); - } - - $tokens[$commaIndex] = new Token(';'); - $tokens->insertAt($nextImportStartIndex, $inserts); - } - } - - /** - * @param int $index - * - * @return int[] - */ - private function getCandidates(Tokens $tokens, $index) - { - $indexes = []; - $index = $tokens->getNextTokenOfKind($index, [',', ';', '{']); - - while (!$tokens[$index]->equals(';')) { - if ($tokens[$index]->equals('{')) { - return []; // do not fix use cases with grouping - } - - $indexes[] = $index; - $index = $tokens->getNextTokenOfKind($index, [',', ';', '{']); - } - - return array_reverse($indexes); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php deleted file mode 100644 index 3752f52..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php +++ /dev/null @@ -1,202 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * Fixer for rules defined in PSR2 ¶4.3, ¶4.5. - * - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class VisibilityRequiredFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Visibility MUST be declared on all properties and methods; `abstract` and `final` MUST be declared before the visibility; `static` MUST be declared after the visibility.', - [ - new CodeSample( - ' ['const']] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolverRootless('elements', [ - (new FixerOptionBuilder('elements', 'The structural elements to fix (PHP >= 7.1 required for `const`).')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(['property', 'method', 'const'])]) - ->setDefault(['property', 'method']) - ->getOption(), - ], $this->getName()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $elements = $tokensAnalyzer->getClassyElements(); - - $propertyTypeDeclarationKinds = [T_STRING, T_NS_SEPARATOR, CT::T_NULLABLE_TYPE, CT::T_ARRAY_TYPEHINT]; - - foreach (array_reverse($elements, true) as $index => $element) { - if (!\in_array($element['type'], $this->configuration['elements'], true)) { - continue; - } - - if (\PHP_VERSION_ID < 70100 && 'const' === $element['type']) { - continue; - } - - $abstractFinalIndex = null; - $visibilityIndex = null; - $staticIndex = null; - $typeIndex = null; - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - $expectedKinds = [T_ABSTRACT, T_FINAL, T_PRIVATE, T_PROTECTED, T_PUBLIC, T_STATIC, T_VAR]; - if ('property' === $element['type']) { - $expectedKinds = array_merge($expectedKinds, $propertyTypeDeclarationKinds); - } - - while ($tokens[$prevIndex]->isGivenKind($expectedKinds)) { - if ($tokens[$prevIndex]->isGivenKind([T_ABSTRACT, T_FINAL])) { - $abstractFinalIndex = $prevIndex; - } elseif ($tokens[$prevIndex]->isGivenKind(T_STATIC)) { - $staticIndex = $prevIndex; - } elseif ($tokens[$prevIndex]->isGivenKind($propertyTypeDeclarationKinds)) { - $typeIndex = $prevIndex; - } else { - $visibilityIndex = $prevIndex; - } - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - } - - if (null !== $typeIndex) { - $index = $typeIndex; - } - - if ($tokens[$prevIndex]->equals(',')) { - continue; - } - - if (null !== $staticIndex) { - if ($this->isKeywordPlacedProperly($tokens, $staticIndex, $index)) { - $index = $staticIndex; - } else { - $this->moveTokenAndEnsureSingleSpaceFollows($tokens, $staticIndex, $index); - } - } - - if (null === $visibilityIndex) { - $tokens->insertAt($index, [new Token([T_PUBLIC, 'public']), new Token([T_WHITESPACE, ' '])]); - } else { - if ($tokens[$visibilityIndex]->isGivenKind(T_VAR)) { - $tokens[$visibilityIndex] = new Token([T_PUBLIC, 'public']); - } - if ($this->isKeywordPlacedProperly($tokens, $visibilityIndex, $index)) { - $index = $visibilityIndex; - } else { - $this->moveTokenAndEnsureSingleSpaceFollows($tokens, $visibilityIndex, $index); - } - } - - if (null === $abstractFinalIndex) { - continue; - } - - if ($this->isKeywordPlacedProperly($tokens, $abstractFinalIndex, $index)) { - continue; - } - - $this->moveTokenAndEnsureSingleSpaceFollows($tokens, $abstractFinalIndex, $index); - } - } - - /** - * @param int $keywordIndex - * @param int $comparedIndex - * - * @return bool - */ - private function isKeywordPlacedProperly(Tokens $tokens, $keywordIndex, $comparedIndex) - { - return $keywordIndex + 2 === $comparedIndex && ' ' === $tokens[$keywordIndex + 1]->getContent(); - } - - /** - * @param int $fromIndex - * @param int $toIndex - */ - private function moveTokenAndEnsureSingleSpaceFollows(Tokens $tokens, $fromIndex, $toIndex) - { - $tokens->insertAt($toIndex, [$tokens[$fromIndex], new Token([T_WHITESPACE, ' '])]); - - $tokens->clearAt($fromIndex); - if ($tokens[$fromIndex + 1]->isWhitespace()) { - $tokens->clearAt($fromIndex + 1); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassUsage/DateTimeImmutableFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassUsage/DateTimeImmutableFixer.php deleted file mode 100644 index 8acf40d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassUsage/DateTimeImmutableFixer.php +++ /dev/null @@ -1,162 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ClassUsage; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - */ -final class DateTimeImmutableFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Class `DateTimeImmutable` should be used instead of `DateTime`.', - [new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $isInNamespace = false; - $isImported = false; // e.g. use DateTime; - - for ($index = 0, $limit = $tokens->count(); $index < $limit; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_NAMESPACE)) { - $isInNamespace = true; - - continue; - } - - if ($token->isGivenKind(T_USE) && $isInNamespace) { - $nextIndex = $tokens->getNextMeaningfulToken($index); - if ('datetime' !== strtolower($tokens[$nextIndex]->getContent())) { - continue; - } - $nextNextIndex = $tokens->getNextMeaningfulToken($nextIndex); - if ($tokens[$nextNextIndex]->equals(';')) { - $isImported = true; - } - - $index = $nextNextIndex; - - continue; - } - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - $lowercaseContent = strtolower($token->getContent()); - - if ('datetime' === $lowercaseContent) { - $this->fixClassUsage($tokens, $index, $isInNamespace, $isImported); - $limit = $tokens->count(); // update limit, as fixing class usage may insert new token - } elseif ('date_create' === $lowercaseContent) { - $this->fixFunctionUsage($tokens, $index, 'date_create_immutable'); - } elseif ('date_create_from_format' === $lowercaseContent) { - $this->fixFunctionUsage($tokens, $index, 'date_create_immutable_from_format'); - } - } - } - - /** - * @param int $index - * @param bool $isInNamespace - * @param bool $isImported - */ - private function fixClassUsage(Tokens $tokens, $index, $isInNamespace, $isImported) - { - $nextIndex = $tokens->getNextMeaningfulToken($index); - if ($tokens[$nextIndex]->isGivenKind(T_DOUBLE_COLON)) { - $nextNextIndex = $tokens->getNextMeaningfulToken($nextIndex); - if ($tokens[$nextNextIndex]->isGivenKind(T_STRING)) { - $nextNextNextIndex = $tokens->getNextMeaningfulToken($nextNextIndex); - if (!$tokens[$nextNextNextIndex]->equals('(')) { - return; - } - } - } - - $isUsedAlone = false; // e.g. new DateTime(); - $isUsedWithLeadingBackslash = false; // e.g. new \DateTime(); - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $prevPrevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - if (!$tokens[$prevPrevIndex]->isGivenKind(T_STRING)) { - $isUsedWithLeadingBackslash = true; - } - } elseif (!$tokens[$prevIndex]->isGivenKind([T_DOUBLE_COLON, T_OBJECT_OPERATOR])) { - $isUsedAlone = true; - } - - if ($isUsedWithLeadingBackslash || $isUsedAlone && ($isInNamespace && $isImported || !$isInNamespace)) { - $tokens[$index] = new Token([T_STRING, \DateTimeImmutable::class]); - if ($isInNamespace && $isUsedAlone) { - $tokens->insertAt($index, new Token([T_NS_SEPARATOR, '\\'])); - } - } - } - - /** - * @param int $index - * @param string $replacement - */ - private function fixFunctionUsage(Tokens $tokens, $index, $replacement) - { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind([T_DOUBLE_COLON, T_NEW, T_OBJECT_OPERATOR])) { - return; - } - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $prevPrevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - if ($tokens[$prevPrevIndex]->isGivenKind([T_NEW, T_STRING])) { - return; - } - } - - $tokens[$index] = new Token([T_STRING, $replacement]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php deleted file mode 100644 index e3e4e24..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php +++ /dev/null @@ -1,232 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\CommentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Utils; - -/** - * @author Kuba Werłos - */ -final class CommentToPhpdocFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var string[] - */ - private $ignoredTags = []; - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_COMMENT); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - * - * Must run before GeneralPhpdocAnnotationRemoveFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocInlineTagFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. - */ - public function getPriority() - { - // Should be run before all other PHPDoc fixers - return 26; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Comments with annotation should be docblock when used on structural elements.', - [new CodeSample("ignoredTags = array_map( - static function ($tag) { - return strtolower($tag); - }, - $this->configuration['ignored_tags'] - ); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('ignored_tags', sprintf('List of ignored tags'))) - ->setAllowedTypes(['array']) - ->setDefault([]) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $commentsAnalyzer = new CommentsAnalyzer(); - - for ($index = 0, $limit = \count($tokens); $index < $limit; ++$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_COMMENT)) { - continue; - } - - if ($commentsAnalyzer->isHeaderComment($tokens, $index)) { - continue; - } - - if (!$commentsAnalyzer->isBeforeStructuralElement($tokens, $index)) { - continue; - } - - $commentIndices = $commentsAnalyzer->getCommentBlockIndices($tokens, $index); - - if ($this->isCommentCandidate($tokens, $commentIndices)) { - $this->fixComment($tokens, $commentIndices); - } - - $index = max($commentIndices); - } - } - - /** - * @param int[] $indices - * - * @return bool - */ - private function isCommentCandidate(Tokens $tokens, array $indices) - { - return array_reduce( - $indices, - function ($carry, $index) use ($tokens) { - if ($carry) { - return true; - } - if (1 !== Preg::match('~(?:#|//|/\*+|\R(?:\s*\*)?)\s*\@([a-zA-Z0-9_\\\\-]+)(?=\s|\(|$)~', $tokens[$index]->getContent(), $matches)) { - return false; - } - - return !\in_array(strtolower($matches[1]), $this->ignoredTags, true); - }, - false - ); - } - - /** - * @param int[] $indices - */ - private function fixComment(Tokens $tokens, $indices) - { - if (1 === \count($indices)) { - $this->fixCommentSingleLine($tokens, reset($indices)); - } else { - $this->fixCommentMultiLine($tokens, $indices); - } - } - - /** - * @param int $index - */ - private function fixCommentSingleLine(Tokens $tokens, $index) - { - $message = $this->getMessage($tokens[$index]->getContent()); - - if ('' !== trim(substr($message, 0, 1))) { - $message = ' '.$message; - } - - if ('' !== trim(substr($message, -1))) { - $message .= ' '; - } - - $tokens[$index] = new Token([T_DOC_COMMENT, '/**'.$message.'*/']); - } - - /** - * @param int[] $indices - */ - private function fixCommentMultiLine(Tokens $tokens, array $indices) - { - $startIndex = reset($indices); - $indent = Utils::calculateTrailingWhitespaceIndent($tokens[$startIndex - 1]); - - $newContent = '/**'.$this->whitespacesConfig->getLineEnding(); - $count = max($indices); - - for ($index = $startIndex; $index <= $count; ++$index) { - if (!$tokens[$index]->isComment()) { - continue; - } - if (false !== strpos($tokens[$index]->getContent(), '*/')) { - return; - } - $newContent .= $indent.' *'.$this->getMessage($tokens[$index]->getContent()).$this->whitespacesConfig->getLineEnding(); - } - - for ($index = $startIndex; $index <= $count; ++$index) { - $tokens->clearAt($index); - } - - $newContent .= $indent.' */'; - - $tokens->insertAt($startIndex, new Token([T_DOC_COMMENT, $newContent])); - } - - private function getMessage($content) - { - if (0 === strpos($content, '#')) { - return substr($content, 1); - } - if (0 === strpos($content, '//')) { - return substr($content, 2); - } - - return rtrim(ltrim($content, '/*'), '*/'); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HashToSlashCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HashToSlashCommentFixer.php deleted file mode 100644 index 62a3161..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HashToSlashCommentFixer.php +++ /dev/null @@ -1,58 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Comment; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * Changes single comments prefixes '#' with '//'. - * - * @author SpacePossum - * - * @deprecated in 2.4, proxy to SingleLineCommentStyleFixer - */ -final class HashToSlashCommentFixer extends AbstractProxyFixer implements DeprecatedFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Single line comments should use double slashes `//` and not hash `#`.', - [new CodeSample("proxyFixers); - } - - /** - * {@inheritdoc} - */ - protected function createProxyFixers() - { - $fixer = new SingleLineCommentStyleFixer(); - $fixer->configure(['comment_types' => ['hash']]); - - return [$fixer]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php deleted file mode 100644 index b47fb4d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php +++ /dev/null @@ -1,452 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AliasedFixerOptionBuilder; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author Antonio J. García Lagar - * @author SpacePossum - */ -final class HeaderCommentFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - const HEADER_PHPDOC = 'PHPDoc'; - const HEADER_COMMENT = 'comment'; - - /** @deprecated will be removed in 3.0 */ - const HEADER_LOCATION_AFTER_OPEN = 1; - /** @deprecated will be removed in 3.0 */ - const HEADER_LOCATION_AFTER_DECLARE_STRICT = 2; - - /** @deprecated will be removed in 3.0 */ - const HEADER_LINE_SEPARATION_BOTH = 1; - /** @deprecated will be removed in 3.0 */ - const HEADER_LINE_SEPARATION_TOP = 2; - /** @deprecated will be removed in 3.0 */ - const HEADER_LINE_SEPARATION_BOTTOM = 3; - /** @deprecated will be removed in 3.0 */ - const HEADER_LINE_SEPARATION_NONE = 4; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Add, replace or remove header comment.', - [ - new CodeSample( - ' 'Made with love.', - ] - ), - new CodeSample( - ' 'Made with love.', - 'comment_type' => 'PHPDoc', - 'location' => 'after_open', - 'separate' => 'bottom', - ] - ), - new CodeSample( - ' 'Made with love.', - 'comment_type' => 'comment', - 'location' => 'after_declare_strict', - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return isset($tokens[0]) && $tokens[0]->isGivenKind(T_OPEN_TAG) && $tokens->isMonolithicPhp(); - } - - /** - * {@inheritdoc} - * - * Must run after DeclareStrictTypesFixer, NoBlankLinesAfterPhpdocFixer. - */ - public function getPriority() - { - // When this fixer is configured with ["separate" => "bottom", "comment_type" => "PHPDoc"] - // and the target file has no namespace or declare() construct, - // the fixed header comment gets trimmed by NoBlankLinesAfterPhpdocFixer if we run before it. - return -30; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $location = $this->configuration['location']; - - $locationIndexes = []; - foreach (['after_open', 'after_declare_strict'] as $possibleLocation) { - $locationIndex = $this->findHeaderCommentInsertionIndex($tokens, $possibleLocation); - - if (!isset($locationIndexes[$locationIndex]) || $possibleLocation === $location) { - $locationIndexes[$locationIndex] = $possibleLocation; - - continue; - } - } - - foreach (array_values($locationIndexes) as $possibleLocation) { - // figure out where the comment should be placed - $headerNewIndex = $this->findHeaderCommentInsertionIndex($tokens, $possibleLocation); - - // check if there is already a comment - $headerCurrentIndex = $this->findHeaderCommentCurrentIndex($tokens, $headerNewIndex - 1); - - if (null === $headerCurrentIndex) { - if ('' === $this->configuration['header'] || $possibleLocation !== $location) { - continue; - } - - $this->insertHeader($tokens, $headerNewIndex); - } elseif ($this->getHeaderAsComment() !== $tokens[$headerCurrentIndex]->getContent() || $possibleLocation !== $location) { - $this->removeHeader($tokens, $headerCurrentIndex); - - if ('' === $this->configuration['header']) { - continue; - } - - if ($possibleLocation === $location) { - $this->insertHeader($tokens, $headerNewIndex); - } - } else { - $this->fixWhiteSpaceAroundHeader($tokens, $headerCurrentIndex); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $fixerName = $this->getName(); - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('header', 'Proper header content.')) - ->setAllowedTypes(['string']) - ->setNormalizer(static function (Options $options, $value) use ($fixerName) { - if ('' === trim($value)) { - return ''; - } - - if (false !== strpos($value, '*/')) { - throw new InvalidFixerConfigurationException($fixerName, 'Cannot use \'*/\' in header.'); - } - - return $value; - }) - ->getOption(), - (new AliasedFixerOptionBuilder( - new FixerOptionBuilder('comment_type', 'Comment syntax type.'), - 'commentType' - )) - ->setAllowedValues([self::HEADER_PHPDOC, self::HEADER_COMMENT]) - ->setDefault(self::HEADER_COMMENT) - ->getOption(), - (new FixerOptionBuilder('location', 'The location of the inserted header.')) - ->setAllowedValues(['after_open', 'after_declare_strict']) - ->setDefault('after_declare_strict') - ->getOption(), - (new FixerOptionBuilder('separate', 'Whether the header should be separated from the file content with a new line.')) - ->setAllowedValues(['both', 'top', 'bottom', 'none']) - ->setDefault('both') - ->getOption(), - ]); - } - - /** - * Enclose the given text in a comment block. - * - * @return string - */ - private function getHeaderAsComment() - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - $comment = (self::HEADER_COMMENT === $this->configuration['comment_type'] ? '/*' : '/**').$lineEnding; - $lines = explode("\n", str_replace("\r", '', $this->configuration['header'])); - - foreach ($lines as $line) { - $comment .= rtrim(' * '.$line).$lineEnding; - } - - return $comment.' */'; - } - - /** - * @param int $headerNewIndex - * - * @return null|int - */ - private function findHeaderCommentCurrentIndex(Tokens $tokens, $headerNewIndex) - { - $index = $tokens->getNextNonWhitespace($headerNewIndex); - - if (null === $index || !$tokens[$index]->isComment()) { - return null; - } - - $next = $index + 1; - - if (!isset($tokens[$next]) || \in_array($this->configuration['separate'], ['top', 'none'], true) || !$tokens[$index]->isGivenKind(T_DOC_COMMENT)) { - return $index; - } - - if ($tokens[$next]->isWhitespace()) { - if (!Preg::match('/^\h*\R\h*$/D', $tokens[$next]->getContent())) { - return $index; - } - - ++$next; - } - - if (!isset($tokens[$next]) || !$tokens[$next]->isClassy() && !$tokens[$next]->isGivenKind(T_FUNCTION)) { - return $index; - } - - return $this->getHeaderAsComment() === $tokens[$index]->getContent() ? $index : null; - } - - /** - * Find the index where the header comment must be inserted. - * - * @param string $location - * - * @return int - */ - private function findHeaderCommentInsertionIndex(Tokens $tokens, $location) - { - if ('after_open' === $location) { - return 1; - } - - $index = $tokens->getNextMeaningfulToken(0); - if (null === $index) { - // file without meaningful tokens but an open tag, comment should always be placed directly after the open tag - return 1; - } - - if (!$tokens[$index]->isGivenKind(T_DECLARE)) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($index); - if (null === $next || !$tokens[$next]->equals('(')) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($next); - if (null === $next || !$tokens[$next]->equals([T_STRING, 'strict_types'], false)) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($next); - if (null === $next || !$tokens[$next]->equals('=')) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($next); - if (null === $next || !$tokens[$next]->isGivenKind(T_LNUMBER)) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($next); - if (null === $next || !$tokens[$next]->equals(')')) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($next); - if (null === $next || !$tokens[$next]->equals(';')) { // don't insert after close tag - return 1; - } - - return $next + 1; - } - - /** - * @param int $headerIndex - */ - private function fixWhiteSpaceAroundHeader(Tokens $tokens, $headerIndex) - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - // fix lines after header comment - if ( - ('both' === $this->configuration['separate'] || 'bottom' === $this->configuration['separate']) - && null !== $tokens->getNextMeaningfulToken($headerIndex) - ) { - $expectedLineCount = 2; - } else { - $expectedLineCount = 1; - } - if ($headerIndex === \count($tokens) - 1) { - $tokens->insertAt($headerIndex + 1, new Token([T_WHITESPACE, str_repeat($lineEnding, $expectedLineCount)])); - } else { - $lineBreakCount = $this->getLineBreakCount($tokens, $headerIndex, 1); - if ($lineBreakCount < $expectedLineCount) { - $missing = str_repeat($lineEnding, $expectedLineCount - $lineBreakCount); - if ($tokens[$headerIndex + 1]->isWhitespace()) { - $tokens[$headerIndex + 1] = new Token([T_WHITESPACE, $missing.$tokens[$headerIndex + 1]->getContent()]); - } else { - $tokens->insertAt($headerIndex + 1, new Token([T_WHITESPACE, $missing])); - } - } elseif ($lineBreakCount > $expectedLineCount && $tokens[$headerIndex + 1]->isWhitespace()) { - $newLinesToRemove = $lineBreakCount - $expectedLineCount; - $tokens[$headerIndex + 1] = new Token([ - T_WHITESPACE, - Preg::replace("/^\\R{{$newLinesToRemove}}/", '', $tokens[$headerIndex + 1]->getContent()), - ]); - } - } - - // fix lines before header comment - $expectedLineCount = 'both' === $this->configuration['separate'] || 'top' === $this->configuration['separate'] ? 2 : 1; - $prev = $tokens->getPrevNonWhitespace($headerIndex); - - $regex = '/\h$/'; - if ($tokens[$prev]->isGivenKind(T_OPEN_TAG) && Preg::match($regex, $tokens[$prev]->getContent())) { - $tokens[$prev] = new Token([T_OPEN_TAG, Preg::replace($regex, $lineEnding, $tokens[$prev]->getContent())]); - } - - $lineBreakCount = $this->getLineBreakCount($tokens, $headerIndex, -1); - if ($lineBreakCount < $expectedLineCount) { - // because of the way the insert index was determined for header comment there cannot be an empty token here - $tokens->insertAt($headerIndex, new Token([T_WHITESPACE, str_repeat($lineEnding, $expectedLineCount - $lineBreakCount)])); - } - } - - /** - * @param int $index - * @param int $direction - * - * @return int - */ - private function getLineBreakCount(Tokens $tokens, $index, $direction) - { - $whitespace = ''; - - for ($index += $direction; isset($tokens[$index]); $index += $direction) { - $token = $tokens[$index]; - - if ($token->isWhitespace()) { - $whitespace .= $token->getContent(); - - continue; - } - - if (-1 === $direction && $token->isGivenKind(T_OPEN_TAG)) { - $whitespace .= $token->getContent(); - } - - if ('' !== $token->getContent()) { - break; - } - } - - return substr_count($whitespace, "\n"); - } - - private function removeHeader(Tokens $tokens, $index) - { - $prevIndex = $index - 1; - $prevToken = $tokens[$prevIndex]; - $newlineRemoved = false; - - if ($prevToken->isWhitespace()) { - $content = $prevToken->getContent(); - - if (Preg::match('/\R/', $content)) { - $newlineRemoved = true; - } - - $content = Preg::replace('/\R?\h*$/', '', $content); - - if ('' !== $content) { - $tokens[$prevIndex] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($prevIndex); - } - } - - $nextIndex = $index + 1; - $nextToken = isset($tokens[$nextIndex]) ? $tokens[$nextIndex] : null; - - if (!$newlineRemoved && null !== $nextToken && $nextToken->isWhitespace()) { - $content = Preg::replace('/^\R/', '', $nextToken->getContent()); - - if ('' !== $content) { - $tokens[$nextIndex] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($nextIndex); - } - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - - /** - * @param int $index - */ - private function insertHeader(Tokens $tokens, $index) - { - $tokens->insertAt($index, new Token([self::HEADER_COMMENT === $this->configuration['comment_type'] ? T_COMMENT : T_DOC_COMMENT, $this->getHeaderAsComment()])); - - $this->fixWhiteSpaceAroundHeader($tokens, $index); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php deleted file mode 100644 index 0d79ec6..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php +++ /dev/null @@ -1,95 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class MultilineCommentOpeningClosingFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'DocBlocks must start with two asterisks, multiline comments must start with a single asterisk, after the opening slash. Both must end with a single asterisk before the closing slash.', - [ - new CodeSample( - <<<'EOT' -isAnyTokenKindsFound([T_COMMENT, T_DOC_COMMENT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - $originalContent = $token->getContent(); - - if ( - !$token->isGivenKind(T_DOC_COMMENT) - && !($token->isGivenKind(T_COMMENT) && 0 === strpos($originalContent, '/*')) - ) { - continue; - } - - $newContent = $originalContent; - - // Fix opening - if ($token->isGivenKind(T_COMMENT)) { - $newContent = Preg::replace('/^\\/\\*{2,}(?!\\/)/', '/*', $newContent); - } - - // Fix closing - $newContent = Preg::replace('/(?getId(), $newContent]); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php deleted file mode 100644 index c6873e7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php +++ /dev/null @@ -1,173 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoEmptyCommentFixer extends AbstractFixer -{ - const TYPE_HASH = 1; - const TYPE_DOUBLE_SLASH = 2; - const TYPE_SLASH_ASTERISK = 3; - - /** - * {@inheritdoc} - * - * Must run before NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer, NoWhitespaceInBlankLineFixer. - * Must run after PhpdocToCommentFixer. - */ - public function getPriority() - { - return 2; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There should not be any empty comments.', - [new CodeSample("isTokenKindFound(T_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = 1, $count = \count($tokens); $index < $count; ++$index) { - if (!$tokens[$index]->isGivenKind(T_COMMENT)) { - continue; - } - - list($blockStart, $index, $isEmpty) = $this->getCommentBlock($tokens, $index); - if (false === $isEmpty) { - continue; - } - - for ($i = $blockStart; $i <= $index; ++$i) { - $tokens->clearTokenAndMergeSurroundingWhitespace($i); - } - } - } - - /** - * Return the start index, end index and a flag stating if the comment block is empty. - * - * @param int $index T_COMMENT index - * - * @return array - */ - private function getCommentBlock(Tokens $tokens, $index) - { - $commentType = $this->getCommentType($tokens[$index]->getContent()); - $empty = $this->isEmptyComment($tokens[$index]->getContent()); - - if (self::TYPE_SLASH_ASTERISK === $commentType) { - return [$index, $index, $empty]; - } - - $start = $index; - $count = \count($tokens); - ++$index; - - for (; $index < $count; ++$index) { - if ($tokens[$index]->isComment()) { - if ($commentType !== $this->getCommentType($tokens[$index]->getContent())) { - break; - } - - if ($empty) { // don't retest if already known the block not being empty - $empty = $this->isEmptyComment($tokens[$index]->getContent()); - } - - continue; - } - - if (!$tokens[$index]->isWhitespace() || $this->getLineBreakCount($tokens, $index, $index + 1) > 1) { - break; - } - } - - return [$start, $index - 1, $empty]; - } - - /** - * @param string $content - * - * @return int - */ - private function getCommentType($content) - { - if ('#' === $content[0]) { - return self::TYPE_HASH; - } - - if ('*' === $content[1]) { - return self::TYPE_SLASH_ASTERISK; - } - - return self::TYPE_DOUBLE_SLASH; - } - - /** - * @param int $whiteStart - * @param int $whiteEnd - * - * @return int - */ - private function getLineBreakCount(Tokens $tokens, $whiteStart, $whiteEnd) - { - $lineCount = 0; - for ($i = $whiteStart; $i < $whiteEnd; ++$i) { - $lineCount += Preg::matchAll('/\R/u', $tokens[$i]->getContent(), $matches); - } - - return $lineCount; - } - - /** - * @param string $content - * - * @return bool - */ - private function isEmptyComment($content) - { - static $mapper = [ - self::TYPE_HASH => '|^#\s*$|', // single line comment starting with '#' - self::TYPE_SLASH_ASTERISK => '|^/\*[\s\*]*\*+/$|', // comment starting with '/*' and ending with '*/' (but not a PHPDoc) - self::TYPE_DOUBLE_SLASH => '|^//\s*$|', // single line comment starting with '//' - ]; - - $type = $this->getCommentType($content); - - return 1 === Preg::match($mapper[$type], $content); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoTrailingWhitespaceInCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoTrailingWhitespaceInCommentFixer.php deleted file mode 100644 index 90da2d1..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoTrailingWhitespaceInCommentFixer.php +++ /dev/null @@ -1,85 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class NoTrailingWhitespaceInCommentFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There MUST be no trailing spaces inside comment or PHPDoc.', - [new CodeSample('isAnyTokenKindsFound([T_COMMENT, T_DOC_COMMENT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(T_DOC_COMMENT)) { - $tokens[$index] = new Token([T_DOC_COMMENT, Preg::replace('/(*ANY)[\h]+$/m', '', $token->getContent())]); - - continue; - } - - if ($token->isGivenKind(T_COMMENT)) { - if ('/*' === substr($token->getContent(), 0, 2)) { - $tokens[$index] = new Token([T_COMMENT, Preg::replace('/(*ANY)[\h]+$/m', '', $token->getContent())]); - } elseif (isset($tokens[$index + 1]) && $tokens[$index + 1]->isWhitespace()) { - $trimmedContent = ltrim($tokens[$index + 1]->getContent(), " \t"); - if ('' !== $trimmedContent) { - $tokens[$index + 1] = new Token([T_WHITESPACE, $trimmedContent]); - } else { - $tokens->clearAt($index + 1); - } - } - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php deleted file mode 100644 index 58fdc13..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php +++ /dev/null @@ -1,168 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class SingleLineCommentStyleFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @var bool - */ - private $asteriskEnabled; - - /** - * @var bool - */ - private $hashEnabled; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->asteriskEnabled = \in_array('asterisk', $this->configuration['comment_types'], true); - $this->hashEnabled = \in_array('hash', $this->configuration['comment_types'], true); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Single-line comments and multi-line comments with only one line of actual content should use the `//` syntax.', - [ - new CodeSample( - ' ['asterisk']] - ), - new CodeSample( - " ['hash']] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_COMMENT)) { - continue; - } - - $content = $token->getContent(); - $commentContent = substr($content, 2, -2) ?: ''; - - if ($this->hashEnabled && '#' === $content[0]) { - $tokens[$index] = new Token([$token->getId(), '//'.substr($content, 1)]); - - continue; - } - - if ( - !$this->asteriskEnabled - || false !== strpos($commentContent, '?>') - || '/*' !== substr($content, 0, 2) - || 1 === Preg::match('/[^\s\*].*\R.*[^\s\*]/s', $commentContent) - ) { - continue; - } - - $nextTokenIndex = $index + 1; - if (isset($tokens[$nextTokenIndex])) { - $nextToken = $tokens[$nextTokenIndex]; - if (!$nextToken->isWhitespace() || 1 !== Preg::match('/\R/', $nextToken->getContent())) { - continue; - } - - $tokens[$nextTokenIndex] = new Token([$nextToken->getId(), ltrim($nextToken->getContent(), " \t")]); - } - - $content = '//'; - if (1 === Preg::match('/[^\s\*]/', $commentContent)) { - $content = '// '.Preg::replace('/[\s\*]*([^\s\*](?:.+[^\s\*])?)[\s\*]*/', '\1', $commentContent); - } - $tokens[$index] = new Token([$token->getId(), $content]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('comment_types', 'List of comment types to fix')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(['asterisk', 'hash'])]) - ->setDefault(['asterisk', 'hash']) - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php deleted file mode 100644 index 31c4b44..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php +++ /dev/null @@ -1,51 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer; - -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - * - * @todo Will incorporate `ConfigurationDefinitionFixerInterface` in 3.0 - */ -interface ConfigurableFixerInterface extends FixerInterface -{ - /** - * Set configuration. - * - * New configuration must override current one, not patch it. - * Using `null` makes fixer to use default configuration (or reset configuration from previously configured back - * to default one). - * - * Some fixers may have no configuration, then - simply pass null. - * Other ones may have configuration that will change behavior of fixer, - * eg `php_unit_strict` fixer allows to configure which methods should be fixed. - * Finally, some fixers need configuration to work, eg `header_comment`. - * - * @param null|array $configuration configuration depends on Fixer - * - * @throws InvalidFixerConfigurationException - */ - public function configure(array $configuration = null); - - /* - * Defines the available configuration options of the fixer. - * - * @return FixerConfigurationResolverInterface - * - * @todo uncomment at 3.0 - */ - // public function getConfigurationDefinition(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurationDefinitionFixerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurationDefinitionFixerInterface.php deleted file mode 100644 index 1512940..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurationDefinitionFixerInterface.php +++ /dev/null @@ -1,28 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer; - -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; - -/** - * @deprecated Will be incorporated into `ConfigurableFixerInterface` in 3.0 - */ -interface ConfigurationDefinitionFixerInterface extends ConfigurableFixerInterface -{ - /** - * Defines the available configuration options of the fixer. - * - * @return FixerConfigurationResolverInterface - */ - public function getConfigurationDefinition(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php deleted file mode 100644 index 718fe26..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php +++ /dev/null @@ -1,284 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ConstantNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Filippo Tessarotto - */ -final class NativeConstantInvocationFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @var array - */ - private $constantsToEscape = []; - - /** - * @var array - */ - private $caseInsensitiveConstantsToEscape = []; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Add leading `\` before constant invocation of internal constant to speed up resolving. Constant name match is case-sensitive, except for `null`, `false` and `true`.', - [ - new CodeSample(" 'namespaced'] - ), - new CodeSample( - " [ - 'MY_CUSTOM_PI', - ], - ] - ), - new CodeSample( - " false, - 'include' => [ - 'MY_CUSTOM_PI', - ], - ] - ), - new CodeSample( - " [ - 'M_PI', - ], - ] - ), - ], - null, - 'Risky when any of the constants are namespaced or overridden.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before GlobalNamespaceImportFixer. - */ - public function getPriority() - { - return 10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $uniqueConfiguredExclude = array_unique($this->configuration['exclude']); - - // Case sensitive constants handling - $constantsToEscape = array_values($this->configuration['include']); - if (true === $this->configuration['fix_built_in']) { - $getDefinedConstants = get_defined_constants(true); - unset($getDefinedConstants['user']); - foreach ($getDefinedConstants as $constants) { - $constantsToEscape = array_merge($constantsToEscape, array_keys($constants)); - } - } - $constantsToEscape = array_diff( - array_unique($constantsToEscape), - $uniqueConfiguredExclude - ); - - // Case insensitive constants handling - static $caseInsensitiveConstants = ['null', 'false', 'true']; - $caseInsensitiveConstantsToEscape = []; - foreach ($constantsToEscape as $constantIndex => $constant) { - $loweredConstant = strtolower($constant); - if (\in_array($loweredConstant, $caseInsensitiveConstants, true)) { - $caseInsensitiveConstantsToEscape[] = $loweredConstant; - unset($constantsToEscape[$constantIndex]); - } - } - - $caseInsensitiveConstantsToEscape = array_diff( - array_unique($caseInsensitiveConstantsToEscape), - array_map(static function ($function) { return strtolower($function); }, $uniqueConfiguredExclude) - ); - - // Store the cache - $this->constantsToEscape = array_fill_keys($constantsToEscape, true); - ksort($this->constantsToEscape); - - $this->caseInsensitiveConstantsToEscape = array_fill_keys($caseInsensitiveConstantsToEscape, true); - ksort($this->caseInsensitiveConstantsToEscape); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - if ('all' === $this->configuration['scope']) { - $this->fixConstantInvocations($tokens, 0, \count($tokens) - 1); - - return; - } - - $namespaces = (new NamespacesAnalyzer())->getDeclarations($tokens); - - // 'scope' is 'namespaced' here - /** @var NamespaceAnalysis $namespace */ - foreach (array_reverse($namespaces) as $namespace) { - if ('' === $namespace->getFullName()) { - continue; - } - - $this->fixConstantInvocations($tokens, $namespace->getScopeStartIndex(), $namespace->getScopeEndIndex()); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $constantChecker = static function ($value) { - foreach ($value as $constantName) { - if (!\is_string($constantName) || '' === trim($constantName) || trim($constantName) !== $constantName) { - throw new InvalidOptionsException(sprintf( - 'Each element must be a non-empty, trimmed string, got "%s" instead.', - \is_object($constantName) ? \get_class($constantName) : \gettype($constantName) - )); - } - } - - return true; - }; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('fix_built_in', 'Whether to fix constants returned by `get_defined_constants`. User constants are not accounted in this list and must be specified in the include one.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('include', 'List of additional constants to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([$constantChecker]) - ->setDefault([]) - ->getOption(), - (new FixerOptionBuilder('exclude', 'List of constants to ignore.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([$constantChecker]) - ->setDefault(['null', 'false', 'true']) - ->getOption(), - (new FixerOptionBuilder('scope', 'Only fix constant invocations that are made within a namespace or fix all.')) - ->setAllowedValues(['all', 'namespaced']) - ->setDefault('all') - ->getOption(), - ]); - } - - /** - * @param int $start - * @param int $end - */ - private function fixConstantInvocations(Tokens $tokens, $start, $end) - { - $useDeclarations = (new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens); - $useConstantDeclarations = []; - foreach ($useDeclarations as $use) { - if ($use->isConstant()) { - $useConstantDeclarations[$use->getShortName()] = true; - } - } - - $tokenAnalyzer = new TokensAnalyzer($tokens); - - $indexes = []; - for ($index = $start; $index < $end; ++$index) { - $token = $tokens[$index]; - - // test if we are at a constant call - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - $tokenContent = $token->getContent(); - - if (!isset($this->constantsToEscape[$tokenContent]) && !isset($this->caseInsensitiveConstantsToEscape[strtolower($tokenContent)])) { - continue; - } - - if (isset($useConstantDeclarations[$tokenContent])) { - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - continue; - } - - if (!$tokenAnalyzer->isConstantInvocation($index)) { - continue; - } - - $indexes[] = $index; - } - - $indexes = array_reverse($indexes); - foreach ($indexes as $index) { - $tokens->insertAt($index, new Token([T_NS_SEPARATOR, '\\'])); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ElseifFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ElseifFixer.php deleted file mode 100644 index bc1598d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ElseifFixer.php +++ /dev/null @@ -1,102 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶5.1. - * - * @author Dariusz Rumiński - */ -final class ElseifFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'The keyword `elseif` should be used instead of `else if` so that all control keywords look like single words.', - [new CodeSample("isAllTokenKindsFound([T_IF, T_ELSE]); - } - - /** - * Replace all `else if` (T_ELSE T_IF) with `elseif` (T_ELSEIF). - * - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_ELSE)) { - continue; - } - - $ifTokenIndex = $tokens->getNextMeaningfulToken($index); - - // if next meaningful token is not T_IF - continue searching, this is not the case for fixing - if (!$tokens[$ifTokenIndex]->isGivenKind(T_IF)) { - continue; - } - - // if next meaningful token is T_IF, but uses an alternative syntax - this is not the case for fixing neither - $conditionEndBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $tokens->getNextMeaningfulToken($ifTokenIndex)); - $afterConditionIndex = $tokens->getNextMeaningfulToken($conditionEndBraceIndex); - if ($tokens[$afterConditionIndex]->equals(':')) { - continue; - } - - // now we have T_ELSE following by T_IF with no alternative syntax so we could fix this - // 1. clear whitespaces between T_ELSE and T_IF - $tokens->clearAt($index + 1); - - // 2. change token from T_ELSE into T_ELSEIF - $tokens[$index] = new Token([T_ELSEIF, 'elseif']); - - // 3. clear succeeding T_IF - $tokens->clearAt($ifTokenIndex); - - $beforeIfTokenIndex = $tokens->getPrevNonWhitespace($ifTokenIndex); - - // 4. clear extra whitespace after T_IF in T_COMMENT,T_WHITESPACE?,T_IF,T_WHITESPACE sequence - if ($tokens[$beforeIfTokenIndex]->isComment() && $tokens[$ifTokenIndex + 1]->isWhitespace()) { - $tokens->clearAt($ifTokenIndex + 1); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/IncludeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/IncludeFixer.php deleted file mode 100644 index 17de89d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/IncludeFixer.php +++ /dev/null @@ -1,153 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\BlocksAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Sebastiaan Stok - * @author Dariusz Rumiński - * @author Kuba Werłos - */ -final class IncludeFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Include/Require and file path should be divided with a single space. File path should not be placed under brackets.', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_REQUIRE, T_REQUIRE_ONCE, T_INCLUDE, T_INCLUDE_ONCE]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $this->clearIncludies($tokens, $this->findIncludies($tokens)); - } - - private function clearIncludies(Tokens $tokens, array $includies) - { - $blocksAnalyzer = new BlocksAnalyzer(); - - foreach ($includies as $includy) { - if ($includy['end'] && !$tokens[$includy['end']]->isGivenKind(T_CLOSE_TAG)) { - $afterEndIndex = $tokens->getNextNonWhitespace($includy['end']); - if (null === $afterEndIndex || !$tokens[$afterEndIndex]->isComment()) { - $tokens->removeLeadingWhitespace($includy['end']); - } - } - - $braces = $includy['braces']; - - if (null !== $braces) { - $prevIndex = $tokens->getPrevMeaningfulToken($includy['begin']); - $nextIndex = $tokens->getNextMeaningfulToken($braces['close']); - - // Include is also legal as function parameter or condition statement but requires being wrapped then. - if (!$tokens[$nextIndex]->equalsAny([';', [T_CLOSE_TAG]]) && !$blocksAnalyzer->isBlock($tokens, $prevIndex, $nextIndex)) { - continue; - } - - $this->removeWhitespaceAroundIfPossible($tokens, $braces['open']); - $this->removeWhitespaceAroundIfPossible($tokens, $braces['close']); - $tokens->clearTokenAndMergeSurroundingWhitespace($braces['open']); - $tokens->clearTokenAndMergeSurroundingWhitespace($braces['close']); - } - - $nextIndex = $tokens->getNonEmptySibling($includy['begin'], 1); - - if ($tokens[$nextIndex]->isWhitespace()) { - $tokens[$nextIndex] = new Token([T_WHITESPACE, ' ']); - } elseif (null !== $braces || $tokens[$nextIndex]->isGivenKind([T_VARIABLE, T_CONSTANT_ENCAPSED_STRING, T_COMMENT])) { - $tokens->insertAt($includy['begin'] + 1, new Token([T_WHITESPACE, ' '])); - } - } - } - - private function findIncludies(Tokens $tokens) - { - static $includyTokenKinds = [T_REQUIRE, T_REQUIRE_ONCE, T_INCLUDE, T_INCLUDE_ONCE]; - - $includies = []; - - foreach ($tokens->findGivenKind($includyTokenKinds) as $includyTokens) { - foreach ($includyTokens as $index => $token) { - $includy = [ - 'begin' => $index, - 'braces' => null, - 'end' => $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]), - ]; - - $braceOpenIndex = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$braceOpenIndex]->equals('(')) { - $braceCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $braceOpenIndex); - - $includy['braces'] = [ - 'open' => $braceOpenIndex, - 'close' => $braceCloseIndex, - ]; - } - - $includies[$index] = $includy; - } - } - - krsort($includies); - - return $includies; - } - - /** - * @param int $index - */ - private function removeWhitespaceAroundIfPossible(Tokens $tokens, $index) - { - $nextIndex = $tokens->getNextNonWhitespace($index); - if (null === $nextIndex || !$tokens[$nextIndex]->isComment()) { - $tokens->removeLeadingWhitespace($index); - } - - $prevIndex = $tokens->getPrevNonWhitespace($index); - if (null === $prevIndex || !$tokens[$prevIndex]->isComment()) { - $tokens->removeTrailingWhitespace($index); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php deleted file mode 100644 index 135bfc9..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php +++ /dev/null @@ -1,227 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Eddilbert Macharia - */ -final class NoAlternativeSyntaxFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replace control structure alternative syntax to use braces.', - [ - new CodeSample( - "isAnyTokenKindsFound( - [ - T_ENDIF, - T_ENDWHILE, - T_ENDFOREACH, - T_ENDFOR, - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BracesFixer, ElseifFixer, NoSuperfluousElseifFixer, NoUselessElseFixer. - */ - public function getPriority() - { - return 26; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = \count($tokens) - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - $this->fixElseif($index, $token, $tokens); - $this->fixElse($index, $token, $tokens); - $this->fixOpenCloseControls($index, $token, $tokens); - } - } - - private function findParenthesisEnd(Tokens $tokens, $structureTokenIndex) - { - $nextIndex = $tokens->getNextMeaningfulToken($structureTokenIndex); - $nextToken = $tokens[$nextIndex]; - - // return if next token is not opening parenthesis - if (!$nextToken->equals('(')) { - return $structureTokenIndex; - } - - return $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $nextIndex); - } - - /** - * Handle both extremes of the control structures. - * e.g. if(): or endif;. - * - * @param int $index the index of the token being processed - * @param Token $token the token being processed - * @param Tokens $tokens the collection of tokens - */ - private function fixOpenCloseControls($index, Token $token, Tokens $tokens) - { - if ($token->isGivenKind([T_IF, T_FOREACH, T_WHILE, T_FOR])) { - $openIndex = $tokens->getNextTokenOfKind($index, ['(']); - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - $afterParenthesisIndex = $tokens->getNextNonWhitespace($closeIndex); - $afterParenthesis = $tokens[$afterParenthesisIndex]; - - if (!$afterParenthesis->equals(':')) { - return; - } - $items = []; - if (!$tokens[$afterParenthesisIndex - 1]->isWhitespace()) { - $items[] = new Token([T_WHITESPACE, ' ']); - } - $items[] = new Token('{'); - - if (!$tokens[$afterParenthesisIndex + 1]->isWhitespace()) { - $items[] = new Token([T_WHITESPACE, ' ']); - } - $tokens->clearAt($afterParenthesisIndex); - $tokens->insertAt($afterParenthesisIndex, $items); - } - - if (!$token->isGivenKind([T_ENDIF, T_ENDFOREACH, T_ENDWHILE, T_ENDFOR])) { - return; - } - - $nextTokenIndex = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$nextTokenIndex]; - $tokens[$index] = new Token('}'); - if ($nextToken->equals(';')) { - $tokens->clearAt($nextTokenIndex); - } - } - - /** - * Handle the else:. - * - * @param int $index the index of the token being processed - * @param Token $token the token being processed - * @param Tokens $tokens the collection of tokens - */ - private function fixElse($index, Token $token, Tokens $tokens) - { - if (!$token->isGivenKind(T_ELSE)) { - return; - } - - $tokenAfterElseIndex = $tokens->getNextMeaningfulToken($index); - $tokenAfterElse = $tokens[$tokenAfterElseIndex]; - if (!$tokenAfterElse->equals(':')) { - return; - } - - $this->addBraces($tokens, new Token([T_ELSE, 'else']), $index, $tokenAfterElseIndex); - } - - /** - * Handle the elsif(): cases. - * - * @param int $index the index of the token being processed - * @param Token $token the token being processed - * @param Tokens $tokens the collection of tokens - */ - private function fixElseif($index, Token $token, Tokens $tokens) - { - if (!$token->isGivenKind(T_ELSEIF)) { - return; - } - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $index); - $tokenAfterParenthesisIndex = $tokens->getNextMeaningfulToken($parenthesisEndIndex); - $tokenAfterParenthesis = $tokens[$tokenAfterParenthesisIndex]; - if (!$tokenAfterParenthesis->equals(':')) { - return; - } - - $this->addBraces($tokens, new Token([T_ELSEIF, 'elseif']), $index, $tokenAfterParenthesisIndex); - } - - /** - * Add opening and closing braces to the else: and elseif: . - * - * @param Tokens $tokens the tokens collection - * @param Token $token the current token - * @param int $index the current token index - * @param int $colonIndex the index of the colon - */ - private function addBraces(Tokens $tokens, Token $token, $index, $colonIndex) - { - $items = [ - new Token('}'), - new Token([T_WHITESPACE, ' ']), - $token, - ]; - if (!$tokens[$index + 1]->isWhitespace()) { - $items[] = new Token([T_WHITESPACE, ' ']); - } - $tokens->clearAt($index); - $tokens->insertAt( - $index, - $items - ); - - // increment the position of the colon by number of items inserted - $colonIndex += \count($items); - - $items = [new Token('{')]; - if (!$tokens[$colonIndex + 1]->isWhitespace()) { - $items[] = new Token([T_WHITESPACE, ' ']); - } - - $tokens->clearAt($colonIndex); - $tokens->insertAt( - $colonIndex, - $items - ); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php deleted file mode 100644 index 04c7e6b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php +++ /dev/null @@ -1,369 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; -use Symfony\Component\OptionsResolver\Options; - -/** - * Fixer for rule defined in PSR2 ¶5.2. - */ -final class NoBreakCommentFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There must be a comment when fall-through is intentional in a non-empty case body.', - [ - new CodeSample( - ' 'some comment'] - ), - ], - 'Adds a "no break" comment before fall-through cases, and removes it if there is no fall-through.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound([T_CASE, T_DEFAULT]); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('comment_text', 'The text to use in the added comment and to detect it.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([ - static function ($value) { - if (\is_string($value) && Preg::match('/\R/', $value)) { - throw new InvalidOptionsException('The comment text must not contain new lines.'); - } - - return true; - }, - ]) - ->setNormalizer(static function (Options $options, $value) { - return rtrim($value); - }) - ->setDefault('no break') - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($position = \count($tokens) - 1; $position >= 0; --$position) { - if ($tokens[$position]->isGivenKind([T_CASE, T_DEFAULT])) { - $this->fixCase($tokens, $position); - } - } - } - - /** - * @param int $casePosition - */ - private function fixCase(Tokens $tokens, $casePosition) - { - $empty = true; - $fallThrough = true; - $commentPosition = null; - for ($i = $tokens->getNextTokenOfKind($casePosition, [':', ';']) + 1, $max = \count($tokens); $i < $max; ++$i) { - if ($tokens[$i]->isGivenKind([T_SWITCH, T_IF, T_ELSE, T_ELSEIF, T_FOR, T_FOREACH, T_WHILE, T_DO, T_FUNCTION, T_CLASS])) { - $empty = false; - $i = $this->getStructureEnd($tokens, $i); - - continue; - } - - if ($tokens[$i]->isGivenKind([T_BREAK, T_CONTINUE, T_RETURN, T_EXIT, T_THROW, T_GOTO])) { - $fallThrough = false; - - continue; - } - - if ($tokens[$i]->equals('}') || $tokens[$i]->isGivenKind(T_ENDSWITCH)) { - if (null !== $commentPosition) { - $this->removeComment($tokens, $commentPosition); - } - - break; - } - - if ($this->isNoBreakComment($tokens[$i])) { - $commentPosition = $i; - - continue; - } - - if ($tokens[$i]->isGivenKind([T_CASE, T_DEFAULT])) { - if (!$empty && $fallThrough) { - if (null !== $commentPosition && $tokens->getPrevNonWhitespace($i) !== $commentPosition) { - $this->removeComment($tokens, $commentPosition); - $commentPosition = null; - } - - if (null === $commentPosition) { - $this->insertCommentAt($tokens, $i); - } else { - $text = $this->configuration['comment_text']; - - $tokens[$commentPosition] = new Token([ - $tokens[$commentPosition]->getId(), - str_ireplace($text, $text, $tokens[$commentPosition]->getContent()), - ]); - - $this->ensureNewLineAt($tokens, $commentPosition); - } - } elseif (null !== $commentPosition) { - $this->removeComment($tokens, $commentPosition); - } - - break; - } - - if (!$tokens[$i]->isGivenKind([T_COMMENT, T_WHITESPACE])) { - $empty = false; - } - } - } - - /** - * @return bool - */ - private function isNoBreakComment(Token $token) - { - if (!$token->isComment()) { - return false; - } - - $text = preg_quote($this->configuration['comment_text'], '~'); - - return 1 === Preg::match("~^((//|#)\\s*{$text}\\s*)|(/\\*\\*?\\s*{$text}\\s*\\*/)$~i", $token->getContent()); - } - - /** - * @param int $casePosition - */ - private function insertCommentAt(Tokens $tokens, $casePosition) - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - $newlinePosition = $this->ensureNewLineAt($tokens, $casePosition); - - $newlineToken = $tokens[$newlinePosition]; - - $nbNewlines = substr_count($newlineToken->getContent(), $lineEnding); - if ($newlineToken->isGivenKind(T_OPEN_TAG) && Preg::match('/\R/', $newlineToken->getContent())) { - ++$nbNewlines; - } elseif ($tokens[$newlinePosition - 1]->isGivenKind(T_OPEN_TAG) && Preg::match('/\R/', $tokens[$newlinePosition - 1]->getContent())) { - ++$nbNewlines; - - if (!Preg::match('/\R/', $newlineToken->getContent())) { - $tokens[$newlinePosition] = new Token([$newlineToken->getId(), $lineEnding.$newlineToken->getContent()]); - } - } - - if ($nbNewlines > 1) { - Preg::match('/^(.*?)(\R\h*)$/s', $newlineToken->getContent(), $matches); - - $indent = $this->getIndentAt($tokens, $newlinePosition - 1); - $tokens[$newlinePosition] = new Token([$newlineToken->getId(), $matches[1].$lineEnding.$indent]); - $tokens->insertAt(++$newlinePosition, new Token([T_WHITESPACE, $matches[2]])); - } - - $tokens->insertAt($newlinePosition, new Token([T_COMMENT, '// '.$this->configuration['comment_text']])); - - $this->ensureNewLineAt($tokens, $newlinePosition); - } - - /** - * @param int $position - * - * @return int The newline token position - */ - private function ensureNewLineAt(Tokens $tokens, $position) - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - $content = $lineEnding.$this->getIndentAt($tokens, $position); - - $whitespaceToken = $tokens[$position - 1]; - if (!$whitespaceToken->isGivenKind(T_WHITESPACE)) { - if ($whitespaceToken->isGivenKind(T_OPEN_TAG)) { - $content = Preg::replace('/\R/', '', $content); - if (!Preg::match('/\R/', $whitespaceToken->getContent())) { - $tokens[$position - 1] = new Token([T_OPEN_TAG, Preg::replace('/\s+$/', $lineEnding, $whitespaceToken->getContent())]); - } - } - - if ('' !== $content) { - $tokens->insertAt($position, new Token([T_WHITESPACE, $content])); - - return $position; - } - - return $position - 1; - } - - if ($tokens[$position - 2]->isGivenKind(T_OPEN_TAG) && Preg::match('/\R/', $tokens[$position - 2]->getContent())) { - $content = Preg::replace('/^\R/', '', $content); - } - - if (!Preg::match('/\R/', $whitespaceToken->getContent())) { - $tokens[$position - 1] = new Token([T_WHITESPACE, $content]); - } - - return $position - 1; - } - - /** - * @param int $commentPosition - */ - private function removeComment(Tokens $tokens, $commentPosition) - { - if ($tokens[$tokens->getPrevNonWhitespace($commentPosition)]->isGivenKind(T_OPEN_TAG)) { - $whitespacePosition = $commentPosition + 1; - $regex = '/^\R\h*/'; - } else { - $whitespacePosition = $commentPosition - 1; - $regex = '/\R\h*$/'; - } - - $whitespaceToken = $tokens[$whitespacePosition]; - if ($whitespaceToken->isGivenKind(T_WHITESPACE)) { - $content = Preg::replace($regex, '', $whitespaceToken->getContent()); - if ('' !== $content) { - $tokens[$whitespacePosition] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($whitespacePosition); - } - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($commentPosition); - } - - /** - * @param int $position - * - * @return string - */ - private function getIndentAt(Tokens $tokens, $position) - { - while (true) { - $position = $tokens->getPrevTokenOfKind($position, [[T_WHITESPACE]]); - - if (null === $position) { - break; - } - - $content = $tokens[$position]->getContent(); - - $prevToken = $tokens[$position - 1]; - if ($prevToken->isGivenKind(T_OPEN_TAG) && Preg::match('/\R$/', $prevToken->getContent())) { - $content = $this->whitespacesConfig->getLineEnding().$content; - } - - if (Preg::match('/\R(\h*)$/', $content, $matches)) { - return $matches[1]; - } - } - - return ''; - } - - /** - * @param int $position - * - * @return int - */ - private function getStructureEnd(Tokens $tokens, $position) - { - $initialToken = $tokens[$position]; - - if ($initialToken->isGivenKind([T_FOR, T_FOREACH, T_WHILE, T_IF, T_ELSEIF, T_SWITCH, T_FUNCTION])) { - $position = $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $tokens->getNextTokenOfKind($position, ['(']) - ); - } elseif ($initialToken->isGivenKind(T_CLASS)) { - $openParenthesisPosition = $tokens->getNextMeaningfulToken($position); - if ('(' === $tokens[$openParenthesisPosition]->getContent()) { - $position = $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $openParenthesisPosition - ); - } - } - - $position = $tokens->getNextMeaningfulToken($position); - if ('{' !== $tokens[$position]->getContent()) { - return $tokens->getNextTokenOfKind($position, [';']); - } - - $position = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $position); - - if ($initialToken->isGivenKind(T_DO)) { - $position = $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $tokens->getNextTokenOfKind($position, ['(']) - ); - - return $tokens->getNextTokenOfKind($position, [';']); - } - - return $position; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoSuperfluousElseifFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoSuperfluousElseifFixer.php deleted file mode 100644 index 37cf0bf..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoSuperfluousElseifFixer.php +++ /dev/null @@ -1,113 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractNoUselessElseFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -final class NoSuperfluousElseifFixer extends AbstractNoUselessElseFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound([T_ELSE, T_ELSEIF]); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replaces superfluous `elseif` with `if`.', - [ - new CodeSample(" $token) { - if ($this->isElseif($tokens, $index) && $this->isSuperfluousElse($tokens, $index)) { - $this->convertElseifToIf($tokens, $index); - } - } - } - - /** - * @param int $index - * - * @return bool - */ - private function isElseif(Tokens $tokens, $index) - { - if ($tokens[$index]->isGivenKind(T_ELSEIF)) { - return true; - } - - return $tokens[$index]->isGivenKind(T_ELSE) && $tokens[$tokens->getNextMeaningfulToken($index)]->isGivenKind(T_IF); - } - - /** - * @param int $index - */ - private function convertElseifToIf(Tokens $tokens, $index) - { - if ($tokens[$index]->isGivenKind(T_ELSE)) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } else { - $tokens[$index] = new Token([T_IF, 'if']); - } - - $whitespace = ''; - for ($previous = $index - 1; $previous > 0; --$previous) { - $token = $tokens[$previous]; - if ($token->isWhitespace() && Preg::match('/(\R\N*)$/', $token->getContent(), $matches)) { - $whitespace = $matches[1]; - - break; - } - } - - if ('' === $whitespace) { - return; - } - - $previousToken = $tokens[$index - 1]; - if (!$previousToken->isWhitespace()) { - $tokens->insertAt($index, new Token([T_WHITESPACE, $whitespace])); - } elseif (!Preg::match('/\R/', $previousToken->getContent())) { - $tokens[$index - 1] = new Token([T_WHITESPACE, $whitespace]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoTrailingCommaInListCallFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoTrailingCommaInListCallFixer.php deleted file mode 100644 index b08e236..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoTrailingCommaInListCallFixer.php +++ /dev/null @@ -1,74 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class NoTrailingCommaInListCallFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Remove trailing commas in list function calls.', - [new CodeSample("isTokenKindFound(T_LIST); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_LIST)) { - continue; - } - - $openIndex = $tokens->getNextMeaningfulToken($index); - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - $markIndex = null; - $prevIndex = $tokens->getPrevNonWhitespace($closeIndex); - - while ($tokens[$prevIndex]->equals(',')) { - $markIndex = $prevIndex; - $prevIndex = $tokens->getPrevNonWhitespace($prevIndex); - } - - if (null !== $markIndex) { - $tokens->clearRange( - $tokens->getPrevNonWhitespace($markIndex) + 1, - $closeIndex - 1 - ); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php deleted file mode 100644 index 40ffd93..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php +++ /dev/null @@ -1,189 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Sullivan Senechal - * @author Dariusz Rumiński - * @author Gregor Harlan - */ -final class NoUnneededControlParenthesesFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - private static $loops = [ - 'break' => ['lookupTokens' => T_BREAK, 'neededSuccessors' => [';']], - 'clone' => ['lookupTokens' => T_CLONE, 'neededSuccessors' => [';', ':', ',', ')'], 'forbiddenContents' => ['?', ':']], - 'continue' => ['lookupTokens' => T_CONTINUE, 'neededSuccessors' => [';']], - 'echo_print' => ['lookupTokens' => [T_ECHO, T_PRINT], 'neededSuccessors' => [';', [T_CLOSE_TAG]]], - 'return' => ['lookupTokens' => T_RETURN, 'neededSuccessors' => [';', [T_CLOSE_TAG]]], - 'switch_case' => ['lookupTokens' => T_CASE, 'neededSuccessors' => [';', ':']], - 'yield' => ['lookupTokens' => T_YIELD, 'neededSuccessors' => [';', ')']], - ]; - - /** - * Dynamic `null` coalesce option set on constructor. - */ - public function __construct() - { - parent::__construct(); - - // To be moved back to compile time property declaration when PHP support of PHP CS Fixer will be 7.0+ - if (\defined('T_COALESCE')) { - self::$loops['clone']['forbiddenContents'][] = [T_COALESCE, '??']; - } - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - $types = []; - - foreach (self::$loops as $loop) { - $types[] = (array) $loop['lookupTokens']; - } - $types = array_merge(...$types); - - return $tokens->isAnyTokenKindsFound($types); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Removes unneeded parentheses around control statements.', - [ - new CodeSample( - ' ['break', 'continue']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoTrailingWhitespaceFixer. - */ - public function getPriority() - { - return 30; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - // Checks if specific statements are set and uses them in this case. - $loops = array_intersect_key(self::$loops, array_flip($this->configuration['statements'])); - - foreach ($tokens as $index => $token) { - if (!$token->equalsAny(['(', [CT::T_BRACE_CLASS_INSTANTIATION_OPEN]])) { - continue; - } - - $blockStartIndex = $index; - $index = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$index]; - - foreach ($loops as $loop) { - if (!$prevToken->isGivenKind($loop['lookupTokens'])) { - continue; - } - - $blockEndIndex = $tokens->findBlockEnd( - $token->equals('(') ? Tokens::BLOCK_TYPE_PARENTHESIS_BRACE : Tokens::BLOCK_TYPE_BRACE_CLASS_INSTANTIATION, - $blockStartIndex - ); - $blockEndNextIndex = $tokens->getNextMeaningfulToken($blockEndIndex); - - if (!$tokens[$blockEndNextIndex]->equalsAny($loop['neededSuccessors'])) { - continue; - } - - if (\array_key_exists('forbiddenContents', $loop)) { - $forbiddenTokenIndex = $tokens->getNextTokenOfKind($blockStartIndex, $loop['forbiddenContents']); - // A forbidden token is found and is inside the parenthesis. - if (null !== $forbiddenTokenIndex && $forbiddenTokenIndex < $blockEndIndex) { - continue; - } - } - - if ($tokens[$blockStartIndex - 1]->isWhitespace() || $tokens[$blockStartIndex - 1]->isComment()) { - $tokens->clearTokenAndMergeSurroundingWhitespace($blockStartIndex); - } else { - // Adds a space to prevent broken code like `return2`. - $tokens[$blockStartIndex] = new Token([T_WHITESPACE, ' ']); - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($blockEndIndex); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolverRootless('statements', [ - (new FixerOptionBuilder('statements', 'List of control statements to fix.')) - ->setAllowedTypes(['array']) - ->setDefault([ - 'break', - 'clone', - 'continue', - 'echo_print', - 'return', - 'switch_case', - 'yield', - ]) - ->getOption(), - ], $this->getName()); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php deleted file mode 100644 index b38d496..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php +++ /dev/null @@ -1,177 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoUnneededCurlyBracesFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Removes unneeded curly braces that are superfluous and aren\'t part of a control structure\'s body.', - [ - new CodeSample( - ' true] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoUselessElseFixer, NoUselessReturnFixer, ReturnAssignmentFixer. - */ - public function getPriority() - { - return 26; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound('}'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($this->findCurlyBraceOpen($tokens) as $index) { - if ($this->isOverComplete($tokens, $index)) { - $this->clearOverCompleteBraces($tokens, $index, $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index)); - } - } - - if ($this->configuration['namespaces']) { - $this->clearIfIsOverCompleteNamespaceBlock($tokens); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('namespaces', 'Remove unneeded curly braces from bracketed namespaces.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * @param int $openIndex index of `{` token - * @param int $closeIndex index of `}` token - */ - private function clearOverCompleteBraces(Tokens $tokens, $openIndex, $closeIndex) - { - $tokens->clearTokenAndMergeSurroundingWhitespace($closeIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($openIndex); - } - - private function findCurlyBraceOpen(Tokens $tokens) - { - for ($i = \count($tokens) - 1; $i > 0; --$i) { - if ($tokens[$i]->equals('{')) { - yield $i; - } - } - } - - /** - * @param int $index index of `{` token - * - * @return bool - */ - private function isOverComplete(Tokens $tokens, $index) - { - static $include = ['{', '}', [T_OPEN_TAG], ':', ';']; - - return $tokens[$tokens->getPrevMeaningfulToken($index)]->equalsAny($include); - } - - private function clearIfIsOverCompleteNamespaceBlock(Tokens $tokens) - { - if (Tokens::isLegacyMode()) { - $index = $tokens->getNextTokenOfKind(0, [[T_NAMESPACE]]); - $secondNamespaceIndex = $tokens->getNextTokenOfKind($index, [[T_NAMESPACE]]); - - if (null !== $secondNamespaceIndex) { - return; - } - } elseif (1 !== $tokens->countTokenKind(T_NAMESPACE)) { - return; // fast check, we never fix if multiple namespaces are defined - } - - $index = $tokens->getNextTokenOfKind(0, [[T_NAMESPACE]]); - - do { - $index = $tokens->getNextMeaningfulToken($index); - } while ($tokens[$index]->isGivenKind([T_STRING, T_NS_SEPARATOR])); - - if (!$tokens[$index]->equals('{')) { - return; // `;` - } - - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - $afterCloseIndex = $tokens->getNextMeaningfulToken($closeIndex); - - if (null !== $afterCloseIndex && (!$tokens[$afterCloseIndex]->isGivenKind(T_CLOSE_TAG) || null !== $tokens->getNextMeaningfulToken($afterCloseIndex))) { - return; - } - - // clear up - $tokens->clearTokenAndMergeSurroundingWhitespace($closeIndex); - $tokens[$index] = new Token(';'); - - if ($tokens[$index - 1]->isWhitespace(" \t") && !$tokens[$index - 2]->isComment()) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index - 1); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUselessElseFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUselessElseFixer.php deleted file mode 100644 index 7326bef..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUselessElseFixer.php +++ /dev/null @@ -1,127 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractNoUselessElseFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoUselessElseFixer extends AbstractNoUselessElseFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_ELSE); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There should not be useless `else` cases.', - [ - new CodeSample(" $token) { - if (!$token->isGivenKind(T_ELSE)) { - continue; - } - - // `else if` vs. `else` and alternative syntax `else:` checks - if ($tokens[$tokens->getNextMeaningfulToken($index)]->equalsAny([':', [T_IF]])) { - continue; - } - - // clean up `else` if it is an empty statement - $this->fixEmptyElse($tokens, $index); - if ($tokens->isEmptyAt($index)) { - continue; - } - - // clean up `else` if possible - if ($this->isSuperfluousElse($tokens, $index)) { - $this->clearElse($tokens, $index); - } - } - } - - /** - * Remove tokens part of an `else` statement if not empty (i.e. no meaningful tokens inside). - * - * @param int $index T_ELSE index - */ - private function fixEmptyElse(Tokens $tokens, $index) - { - $next = $tokens->getNextMeaningfulToken($index); - if ($tokens[$next]->equals('{')) { - $close = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $next); - if (1 === $close - $next) { // '{}' - $this->clearElse($tokens, $index); - } elseif ($tokens->getNextMeaningfulToken($next) === $close) { // '{/**/}' - $this->clearElse($tokens, $index); - } - - return; - } - - // short `else` - $end = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); - if ($next === $end) { - $this->clearElse($tokens, $index); - } - } - - /** - * @param int $index index of T_ELSE - */ - private function clearElse(Tokens $tokens, $index) - { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - // clear T_ELSE and the '{' '}' if there are any - $next = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$next]->equals('{')) { - return; - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $next)); - $tokens->clearTokenAndMergeSurroundingWhitespace($next); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSemicolonToColonFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSemicolonToColonFixer.php deleted file mode 100644 index a7e9682..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSemicolonToColonFixer.php +++ /dev/null @@ -1,113 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶5.2. - * - * @author SpacePossum - */ -final class SwitchCaseSemicolonToColonFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'A case should be followed by a colon and not a semicolon.', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_CASE, T_DEFAULT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if ($token->isGivenKind([T_CASE, T_DEFAULT])) { - $this->fixSwitchCase($tokens, $index); - } - } - } - - /** - * @param int $index - */ - protected function fixSwitchCase(Tokens $tokens, $index) - { - $ternariesCount = 0; - do { - if ($tokens[$index]->equalsAny(['(', '{'])) { // skip constructs - $type = Tokens::detectBlockType($tokens[$index]); - $index = $tokens->findBlockEnd($type['type'], $index); - - continue; - } - - if ($tokens[$index]->equals('?')) { - ++$ternariesCount; - - continue; - } - - if ($tokens[$index]->equalsAny([':', ';'])) { - if (0 === $ternariesCount) { - break; - } - - --$ternariesCount; - } - } while (++$index); - - if ($tokens[$index]->equals(';')) { - $tokens[$index] = new Token(':'); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSpaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSpaceFixer.php deleted file mode 100644 index d47492c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSpaceFixer.php +++ /dev/null @@ -1,92 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶5.2. - * - * @author Sullivan Senechal - */ -final class SwitchCaseSpaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Removes extra spaces between colon and case value.', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_CASE, T_DEFAULT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind([T_CASE, T_DEFAULT])) { - continue; - } - - $ternariesCount = 0; - for ($colonIndex = $index + 1;; ++$colonIndex) { - // We have to skip ternary case for colons. - if ($tokens[$colonIndex]->equals('?')) { - ++$ternariesCount; - } - - if ($tokens[$colonIndex]->equalsAny([':', ';'])) { - if (0 === $ternariesCount) { - break; - } - - --$ternariesCount; - } - } - - $valueIndex = $tokens->getPrevNonWhitespace($colonIndex); - // skip if there is no space between the colon and previous token or is space after comment - if ($valueIndex === $colonIndex - 1 || $tokens[$valueIndex]->isComment()) { - continue; - } - - $tokens->clearAt($valueIndex + 1); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php deleted file mode 100644 index fbc14de..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php +++ /dev/null @@ -1,750 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Bram Gotink - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class YodaStyleFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @var array - */ - private $candidatesMap; - - /** - * @var array - */ - private $candidateTypesConfiguration; - - /** - * @var array - */ - private $candidateTypes; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->resolveConfiguration(); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Write conditions in Yoda style (`true`), non-Yoda style (`false`) or ignore those conditions (`null`) based on configuration.', - [ - new CodeSample( - ' 3; // less than -', - [ - 'equal' => true, - 'identical' => false, - 'less_and_greater' => null, - ] - ), - new CodeSample( - ' true, - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after IsNullFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound($this->candidateTypes); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $this->fixTokens($tokens); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('equal', 'Style for equal (`==`, `!=`) statements.')) - ->setAllowedTypes(['bool', 'null']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('identical', 'Style for identical (`===`, `!==`) statements.')) - ->setAllowedTypes(['bool', 'null']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('less_and_greater', 'Style for less and greater than (`<`, `<=`, `>`, `>=`) statements.')) - ->setAllowedTypes(['bool', 'null']) - ->setDefault(null) - ->getOption(), - (new FixerOptionBuilder('always_move_variable', 'Whether variables should always be on non assignable side when applying Yoda style.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * Finds the end of the right-hand side of the comparison at the given - * index. - * - * The right-hand side ends when an operator with a lower precedence is - * encountered or when the block level for `()`, `{}` or `[]` goes below - * zero. - * - * @param Tokens $tokens The token list - * @param int $index The index of the comparison - * - * @return int The last index of the right-hand side of the comparison - */ - private function findComparisonEnd(Tokens $tokens, $index) - { - ++$index; - $count = \count($tokens); - while ($index < $count) { - $token = $tokens[$index]; - if ($token->isGivenKind([T_WHITESPACE, T_COMMENT, T_DOC_COMMENT])) { - ++$index; - - continue; - } - - if ($this->isOfLowerPrecedence($token)) { - break; - } - - $block = Tokens::detectBlockType($token); - if (null === $block) { - ++$index; - - continue; - } - - if (!$block['isStart']) { - break; - } - - $index = $tokens->findBlockEnd($block['type'], $index) + 1; - } - - $prev = $tokens->getPrevMeaningfulToken($index); - - return $tokens[$prev]->isGivenKind(T_CLOSE_TAG) ? $tokens->getPrevMeaningfulToken($prev) : $prev; - } - - /** - * Finds the start of the left-hand side of the comparison at the given - * index. - * - * The left-hand side ends when an operator with a lower precedence is - * encountered or when the block level for `()`, `{}` or `[]` goes below - * zero. - * - * @param Tokens $tokens The token list - * @param int $index The index of the comparison - * - * @return int The first index of the left-hand side of the comparison - */ - private function findComparisonStart(Tokens $tokens, $index) - { - --$index; - $nonBlockFound = false; - - while (0 <= $index) { - $token = $tokens[$index]; - if ($token->isGivenKind([T_WHITESPACE, T_COMMENT, T_DOC_COMMENT])) { - --$index; - - continue; - } - - if ($this->isOfLowerPrecedence($token)) { - break; - } - - $block = Tokens::detectBlockType($token); - if (null === $block) { - --$index; - $nonBlockFound = true; - - continue; - } - - if ( - $block['isStart'] - || ($nonBlockFound && Tokens::BLOCK_TYPE_CURLY_BRACE === $block['type']) // closing of structure not related to the comparison - ) { - break; - } - - $index = $tokens->findBlockStart($block['type'], $index) - 1; - } - - return $tokens->getNextMeaningfulToken($index); - } - - /** - * @return Tokens - */ - private function fixTokens(Tokens $tokens) - { - for ($i = \count($tokens) - 1; $i > 1; --$i) { - if ($tokens[$i]->isGivenKind($this->candidateTypes)) { - $yoda = $this->candidateTypesConfiguration[$tokens[$i]->getId()]; - } elseif ( - ($tokens[$i]->equals('<') && \in_array('<', $this->candidateTypes, true)) - || ($tokens[$i]->equals('>') && \in_array('>', $this->candidateTypes, true)) - ) { - $yoda = $this->candidateTypesConfiguration[$tokens[$i]->getContent()]; - } else { - continue; - } - - $fixableCompareInfo = $this->getCompareFixableInfo($tokens, $i, $yoda); - if (null === $fixableCompareInfo) { - continue; - } - - $i = $this->fixTokensCompare( - $tokens, - $fixableCompareInfo['left']['start'], - $fixableCompareInfo['left']['end'], - $i, - $fixableCompareInfo['right']['start'], - $fixableCompareInfo['right']['end'] - ); - } - - return $tokens; - } - - /** - * Fixes the comparison at the given index. - * - * A comparison is considered fixed when - * - both sides are a variable (e.g. $a === $b) - * - neither side is a variable (e.g. self::CONST === 3) - * - only the right-hand side is a variable (e.g. 3 === self::$var) - * - * If the left-hand side and right-hand side of the given comparison are - * swapped, this function runs recursively on the previous left-hand-side. - * - * @param int $startLeft - * @param int $endLeft - * @param int $compareOperatorIndex - * @param int $startRight - * @param int $endRight - * - * @return int a upper bound for all non-fixed comparisons - */ - private function fixTokensCompare( - Tokens $tokens, - $startLeft, - $endLeft, - $compareOperatorIndex, - $startRight, - $endRight - ) { - $type = $tokens[$compareOperatorIndex]->getId(); - $content = $tokens[$compareOperatorIndex]->getContent(); - if (\array_key_exists($type, $this->candidatesMap)) { - $tokens[$compareOperatorIndex] = clone $this->candidatesMap[$type]; - } elseif (\array_key_exists($content, $this->candidatesMap)) { - $tokens[$compareOperatorIndex] = clone $this->candidatesMap[$content]; - } - - $right = $this->fixTokensComparePart($tokens, $startRight, $endRight); - $left = $this->fixTokensComparePart($tokens, $startLeft, $endLeft); - - for ($i = $startRight; $i <= $endRight; ++$i) { - $tokens->clearAt($i); - } - - for ($i = $startLeft; $i <= $endLeft; ++$i) { - $tokens->clearAt($i); - } - - $tokens->insertAt($startRight, $left); - $tokens->insertAt($startLeft, $right); - - return $startLeft; - } - - /** - * @param int $start - * @param int $end - * - * @return Tokens - */ - private function fixTokensComparePart(Tokens $tokens, $start, $end) - { - $newTokens = $tokens->generatePartialCode($start, $end); - $newTokens = $this->fixTokens(Tokens::fromCode(sprintf('clearAt(\count($newTokens) - 1); - $newTokens->clearAt(0); - $newTokens->clearEmptyTokens(); - - return $newTokens; - } - - /** - * @param int $index - * @param bool $yoda - * - * @return null|array - */ - private function getCompareFixableInfo(Tokens $tokens, $index, $yoda) - { - $left = $this->getLeftSideCompareFixableInfo($tokens, $index); - $right = $this->getRightSideCompareFixableInfo($tokens, $index); - - if ($yoda) { - $expectedAssignableSide = $right; - $expectedValueSide = $left; - } else { - if ($tokens[$tokens->getNextMeaningfulToken($right['end'])]->equals('=')) { - return null; - } - - $expectedAssignableSide = $left; - $expectedValueSide = $right; - } - - if ( - // variable cannot be moved to expected side - !( - !$this->isVariable($tokens, $expectedAssignableSide['start'], $expectedAssignableSide['end'], false) - && !$this->isListStatement($tokens, $expectedAssignableSide['start'], $expectedAssignableSide['end']) - && $this->isVariable($tokens, $expectedValueSide['start'], $expectedValueSide['end'], false) - ) - // variable cannot be moved to expected side (strict mode) - && !( - $this->configuration['always_move_variable'] - && !$this->isVariable($tokens, $expectedAssignableSide['start'], $expectedAssignableSide['end'], true) - && !$this->isListStatement($tokens, $expectedAssignableSide['start'], $expectedAssignableSide['end']) - && $this->isVariable($tokens, $expectedValueSide['start'], $expectedValueSide['end'], true) - ) - ) { - return null; - } - - return [ - 'left' => $left, - 'right' => $right, - ]; - } - - /** - * @param int $index - * - * @return array - */ - private function getLeftSideCompareFixableInfo(Tokens $tokens, $index) - { - return [ - 'start' => $this->findComparisonStart($tokens, $index), - 'end' => $tokens->getPrevMeaningfulToken($index), - ]; - } - - /** - * @param int $index - * - * @return array - */ - private function getRightSideCompareFixableInfo(Tokens $tokens, $index) - { - return [ - 'start' => $tokens->getNextMeaningfulToken($index), - 'end' => $this->findComparisonEnd($tokens, $index), - ]; - } - - /** - * @param int $index - * @param int $end - * - * @return bool - */ - private function isListStatement(Tokens $tokens, $index, $end) - { - for ($i = $index; $i <= $end; ++$i) { - if ($tokens[$i]->isGivenKind([T_LIST, CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE])) { - return true; - } - } - - return false; - } - - /** - * Checks whether the given token has a lower precedence than `T_IS_EQUAL` - * or `T_IS_IDENTICAL`. - * - * @param Token $token The token to check - * - * @return bool Whether the token has a lower precedence - */ - private function isOfLowerPrecedence(Token $token) - { - static $tokens; - - if (null === $tokens) { - $tokens = [ - T_AND_EQUAL, // &= - T_BOOLEAN_AND, // && - T_BOOLEAN_OR, // || - T_CASE, // case - T_CONCAT_EQUAL, // .= - T_DIV_EQUAL, // /= - T_DOUBLE_ARROW, // => - T_ECHO, // echo - T_GOTO, // goto - T_LOGICAL_AND, // and - T_LOGICAL_OR, // or - T_LOGICAL_XOR, // xor - T_MINUS_EQUAL, // -= - T_MOD_EQUAL, // %= - T_MUL_EQUAL, // *= - T_OPEN_TAG, // >= - T_THROW, // throw - T_XOR_EQUAL, // ^= - ]; - - if (\defined('T_COALESCE')) { - $tokens[] = T_COALESCE; // ?? - } - - if (\defined('T_COALESCE_EQUAL')) { - $tokens[] = T_COALESCE_EQUAL; // ??= - } - } - - static $otherTokens = [ - // bitwise and, or, xor - '&', '|', '^', - // ternary operators - '?', ':', - // assignment - '=', - // end of PHP statement - ',', ';', - ]; - - return $token->isGivenKind($tokens) || $token->equalsAny($otherTokens); - } - - /** - * Checks whether the tokens between the given start and end describe a - * variable. - * - * @param Tokens $tokens The token list - * @param int $start The first index of the possible variable - * @param int $end The last index of the possible variable - * @param bool $strict Enable strict variable detection - * - * @return bool Whether the tokens describe a variable - */ - private function isVariable(Tokens $tokens, $start, $end, $strict) - { - $tokenAnalyzer = new TokensAnalyzer($tokens); - - if ($start === $end) { - return $tokens[$start]->isGivenKind(T_VARIABLE); - } - - if ($strict) { - if ($tokens[$start]->equals('(')) { - return false; - } - - for ($index = $start; $index <= $end; ++$index) { - if ( - $tokens[$index]->isCast() - || $tokens[$index]->isGivenKind(T_INSTANCEOF) - || $tokens[$index]->equals('!') - || $tokenAnalyzer->isBinaryOperator($index) - ) { - return false; - } - } - } - - $index = $start; - - // handle multiple braces around statement ((($a === 1))) - while ( - $tokens[$index]->equals('(') - && $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index) === $end - ) { - $index = $tokens->getNextMeaningfulToken($index); - $end = $tokens->getPrevMeaningfulToken($end); - } - - $expectString = false; - while ($index <= $end) { - $current = $tokens[$index]; - if ($current->isComment() || $current->isWhitespace() || $tokens->isEmptyAt($index)) { - ++$index; - - continue; - } - - // check if this is the last token - if ($index === $end) { - return $current->isGivenKind($expectString ? T_STRING : T_VARIABLE); - } - - if ($current->isGivenKind([T_LIST, CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE])) { - return false; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - $next = $tokens[$nextIndex]; - - // self:: or ClassName:: - if ($current->isGivenKind(T_STRING) && $next->isGivenKind(T_DOUBLE_COLON)) { - $index = $tokens->getNextMeaningfulToken($nextIndex); - - continue; - } - - // \ClassName - if ($current->isGivenKind(T_NS_SEPARATOR) && $next->isGivenKind(T_STRING)) { - $index = $nextIndex; - - continue; - } - - // ClassName\ - if ($current->isGivenKind(T_STRING) && $next->isGivenKind(T_NS_SEPARATOR)) { - $index = $nextIndex; - - continue; - } - - // $a-> or a-> (as in $b->a->c) - if ($current->isGivenKind([T_STRING, T_VARIABLE]) && $next->isGivenKind(T_OBJECT_OPERATOR)) { - $index = $tokens->getNextMeaningfulToken($nextIndex); - $expectString = true; - - continue; - } - - // $a[...], a[...] (as in $c->a[$b]), $a{...} or a{...} (as in $c->a{$b}) - if ( - $current->isGivenKind($expectString ? T_STRING : T_VARIABLE) - && $next->equalsAny(['[', [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN, '{']]) - ) { - $index = $tokens->findBlockEnd( - $next->equals('[') ? Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE : Tokens::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE, - $nextIndex - ); - - if ($index === $end) { - return true; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$index]->equalsAny([[T_OBJECT_OPERATOR, '->'], '[', [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN, '{']])) { - return false; - } - - $index = $tokens->getNextMeaningfulToken($index); - $expectString = true; - - continue; - } - - // $a(...) or $a->b(...) - if ($strict && $current->isGivenKind([T_STRING, T_VARIABLE]) && $next->equals('(')) { - return false; - } - - // {...} (as in $a->{$b}) - if ($expectString && $current->isGivenKind(CT::T_DYNAMIC_PROP_BRACE_OPEN)) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_DYNAMIC_PROP_BRACE, $index); - if ($index === $end) { - return true; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$index]->isGivenKind(T_OBJECT_OPERATOR)) { - return false; - } - - $index = $tokens->getNextMeaningfulToken($index); - $expectString = true; - - continue; - } - - break; - } - - return !$this->isConstant($tokens, $start, $end); - } - - private function isConstant(Tokens $tokens, $index, $end) - { - $expectArrayOnly = false; - $expectNumberOnly = false; - $expectNothing = false; - - for (; $index <= $end; ++$index) { - $token = $tokens[$index]; - - if ($token->isComment() || $token->isWhitespace()) { - continue; - } - - if ($expectNothing) { - return false; - } - - if ($expectArrayOnly) { - if ($token->equalsAny(['(', ')', [CT::T_ARRAY_SQUARE_BRACE_CLOSE]])) { - continue; - } - - return false; - } - - if ($token->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - $expectArrayOnly = true; - - continue; - } - - if ($expectNumberOnly && !$token->isGivenKind([T_LNUMBER, T_DNUMBER])) { - return false; - } - - if ($token->equals('-')) { - $expectNumberOnly = true; - - continue; - } - - if ( - $token->isGivenKind([T_LNUMBER, T_DNUMBER, T_CONSTANT_ENCAPSED_STRING]) - || $token->equalsAny([[T_STRING, 'true'], [T_STRING, 'false'], [T_STRING, 'null']]) - ) { - $expectNothing = true; - - continue; - } - - return false; - } - - return true; - } - - private function resolveConfiguration() - { - $candidateTypes = []; - $this->candidatesMap = []; - - if (null !== $this->configuration['equal']) { - // `==`, `!=` and `<>` - $candidateTypes[T_IS_EQUAL] = $this->configuration['equal']; - $candidateTypes[T_IS_NOT_EQUAL] = $this->configuration['equal']; - } - - if (null !== $this->configuration['identical']) { - // `===` and `!==` - $candidateTypes[T_IS_IDENTICAL] = $this->configuration['identical']; - $candidateTypes[T_IS_NOT_IDENTICAL] = $this->configuration['identical']; - } - - if (null !== $this->configuration['less_and_greater']) { - // `<`, `<=`, `>` and `>=` - $candidateTypes[T_IS_SMALLER_OR_EQUAL] = $this->configuration['less_and_greater']; - $this->candidatesMap[T_IS_SMALLER_OR_EQUAL] = new Token([T_IS_GREATER_OR_EQUAL, '>=']); - - $candidateTypes[T_IS_GREATER_OR_EQUAL] = $this->configuration['less_and_greater']; - $this->candidatesMap[T_IS_GREATER_OR_EQUAL] = new Token([T_IS_SMALLER_OR_EQUAL, '<=']); - - $candidateTypes['<'] = $this->configuration['less_and_greater']; - $this->candidatesMap['<'] = new Token('>'); - - $candidateTypes['>'] = $this->configuration['less_and_greater']; - $this->candidatesMap['>'] = new Token('<'); - } - - $this->candidateTypesConfiguration = $candidateTypes; - $this->candidateTypes = array_keys($candidateTypes); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DefinedFixerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DefinedFixerInterface.php deleted file mode 100644 index 939e718..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DefinedFixerInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer; - -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -interface DefinedFixerInterface extends FixerInterface -{ - /** - * Returns the definition of the fixer. - * - * @return FixerDefinitionInterface - */ - public function getDefinition(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php deleted file mode 100644 index a33e632..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer; - -/** - * @author Kuba Werłos - */ -interface DeprecatedFixerInterface extends FixerInterface -{ - /** - * Returns names of fixers to use instead, if any. - * - * @return string[] - */ - public function getSuccessorsNames(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php deleted file mode 100644 index f8e3155..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php +++ /dev/null @@ -1,104 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\DoctrineAnnotation; - -use Doctrine\Common\Annotations\DocLexer; -use PhpCsFixer\AbstractDoctrineAnnotationFixer; -use PhpCsFixer\Doctrine\Annotation\Tokens; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * Forces the configured operator for assignment in arrays in Doctrine Annotations. - */ -final class DoctrineAnnotationArrayAssignmentFixer extends AbstractDoctrineAnnotationFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Doctrine annotations must use configured operator for assignment in arrays.', - [ - new CodeSample( - " ':'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before DoctrineAnnotationSpacesFixer. - */ - public function getPriority() - { - return 1; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $options = parent::createConfigurationDefinition()->getOptions(); - - $operator = new FixerOptionBuilder('operator', 'The operator to use.'); - $options[] = $operator - ->setAllowedValues(['=', ':']) - ->setDefault('=') - ->getOption() - ; - - return new FixerConfigurationResolver($options); - } - - /** - * {@inheritdoc} - */ - protected function fixAnnotations(Tokens $tokens) - { - $scopes = []; - foreach ($tokens as $token) { - if ($token->isType(DocLexer::T_OPEN_PARENTHESIS)) { - $scopes[] = 'annotation'; - - continue; - } - - if ($token->isType(DocLexer::T_OPEN_CURLY_BRACES)) { - $scopes[] = 'array'; - - continue; - } - - if ($token->isType([DocLexer::T_CLOSE_PARENTHESIS, DocLexer::T_CLOSE_CURLY_BRACES])) { - array_pop($scopes); - - continue; - } - - if ('array' === end($scopes) && $token->isType([DocLexer::T_EQUALS, DocLexer::T_COLON])) { - $token->setContent($this->configuration['operator']); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php deleted file mode 100644 index 31a693a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php +++ /dev/null @@ -1,123 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\DoctrineAnnotation; - -use Doctrine\Common\Annotations\DocLexer; -use PhpCsFixer\AbstractDoctrineAnnotationFixer; -use PhpCsFixer\Doctrine\Annotation\Token; -use PhpCsFixer\Doctrine\Annotation\Tokens; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * Adds braces to Doctrine annotations when missing. - */ -final class DoctrineAnnotationBracesFixer extends AbstractDoctrineAnnotationFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Doctrine annotations without arguments must use the configured syntax.', - [ - new CodeSample( - " 'with_braces'] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver(array_merge( - parent::createConfigurationDefinition()->getOptions(), - [ - (new FixerOptionBuilder('syntax', 'Whether to add or remove braces.')) - ->setAllowedValues(['with_braces', 'without_braces']) - ->setDefault('without_braces') - ->getOption(), - ] - )); - } - - /** - * {@inheritdoc} - */ - protected function fixAnnotations(Tokens $tokens) - { - if ('without_braces' === $this->configuration['syntax']) { - $this->removesBracesFromAnnotations($tokens); - } else { - $this->addBracesToAnnotations($tokens); - } - } - - private function addBracesToAnnotations(Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$tokens[$index]->isType(DocLexer::T_AT)) { - continue; - } - - $braceIndex = $tokens->getNextMeaningfulToken($index + 1); - if (null !== $braceIndex && $tokens[$braceIndex]->isType(DocLexer::T_OPEN_PARENTHESIS)) { - continue; - } - - $tokens->insertAt($index + 2, new Token(DocLexer::T_OPEN_PARENTHESIS, '(')); - $tokens->insertAt($index + 3, new Token(DocLexer::T_CLOSE_PARENTHESIS, ')')); - } - } - - private function removesBracesFromAnnotations(Tokens $tokens) - { - for ($index = 0, $max = \count($tokens); $index < $max; ++$index) { - if (!$tokens[$index]->isType(DocLexer::T_AT)) { - continue; - } - - $openBraceIndex = $tokens->getNextMeaningfulToken($index + 1); - if (null === $openBraceIndex) { - continue; - } - - if (!$tokens[$openBraceIndex]->isType(DocLexer::T_OPEN_PARENTHESIS)) { - continue; - } - - $closeBraceIndex = $tokens->getNextMeaningfulToken($openBraceIndex); - if (null === $closeBraceIndex) { - continue; - } - - if (!$tokens[$closeBraceIndex]->isType(DocLexer::T_CLOSE_PARENTHESIS)) { - continue; - } - - for ($currentIndex = $index + 2; $currentIndex <= $closeBraceIndex; ++$currentIndex) { - $tokens[$currentIndex]->clear(); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php deleted file mode 100644 index 7d97c16..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php +++ /dev/null @@ -1,199 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\DoctrineAnnotation; - -use Doctrine\Common\Annotations\DocLexer; -use PhpCsFixer\AbstractDoctrineAnnotationFixer; -use PhpCsFixer\Doctrine\Annotation\Tokens; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; - -final class DoctrineAnnotationIndentationFixer extends AbstractDoctrineAnnotationFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Doctrine annotations must be indented with four spaces.', - [ - new CodeSample(" true] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver(array_merge( - parent::createConfigurationDefinition()->getOptions(), - [ - (new FixerOptionBuilder('indent_mixed_lines', 'Whether to indent lines that have content before closing parenthesis.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ] - )); - } - - /** - * {@inheritdoc} - */ - protected function fixAnnotations(Tokens $tokens) - { - $annotationPositions = []; - for ($index = 0, $max = \count($tokens); $index < $max; ++$index) { - if (!$tokens[$index]->isType(DocLexer::T_AT)) { - continue; - } - - $annotationEndIndex = $tokens->getAnnotationEnd($index); - if (null === $annotationEndIndex) { - return; - } - - $annotationPositions[] = [$index, $annotationEndIndex]; - $index = $annotationEndIndex; - } - - $indentLevel = 0; - foreach ($tokens as $index => $token) { - if (!$token->isType(DocLexer::T_NONE) || false === strpos($token->getContent(), "\n")) { - continue; - } - - if (!$this->indentationCanBeFixed($tokens, $index, $annotationPositions)) { - continue; - } - - $braces = $this->getLineBracesCount($tokens, $index); - $delta = $braces[0] - $braces[1]; - $mixedBraces = 0 === $delta && $braces[0] > 0; - $extraIndentLevel = 0; - - if ($indentLevel > 0 && ($delta < 0 || $mixedBraces)) { - --$indentLevel; - - if ($this->configuration['indent_mixed_lines'] && $this->isClosingLineWithMeaningfulContent($tokens, $index)) { - $extraIndentLevel = 1; - } - } - - $token->setContent(Preg::replace( - '/(\n( +\*)?) *$/', - '$1'.str_repeat(' ', 4 * ($indentLevel + $extraIndentLevel) + 1), - $token->getContent() - )); - - if ($delta > 0 || $mixedBraces) { - ++$indentLevel; - } - } - } - - /** - * @param int $index - * - * @return int[] - */ - private function getLineBracesCount(Tokens $tokens, $index) - { - $opening = 0; - $closing = 0; - - while (isset($tokens[++$index])) { - $token = $tokens[$index]; - if ($token->isType(DocLexer::T_NONE) && false !== strpos($token->getContent(), "\n")) { - break; - } - - if ($token->isType([DocLexer::T_OPEN_PARENTHESIS, DocLexer::T_OPEN_CURLY_BRACES])) { - ++$opening; - - continue; - } - - if (!$token->isType([DocLexer::T_CLOSE_PARENTHESIS, DocLexer::T_CLOSE_CURLY_BRACES])) { - continue; - } - - if ($opening > 0) { - --$opening; - } else { - ++$closing; - } - } - - return [$opening, $closing]; - } - - /** - * @param int $index - * - * @return bool - */ - private function isClosingLineWithMeaningfulContent(Tokens $tokens, $index) - { - while (isset($tokens[++$index])) { - $token = $tokens[$index]; - if ($token->isType(DocLexer::T_NONE)) { - if (false !== strpos($token->getContent(), "\n")) { - return false; - } - - continue; - } - - return !$token->isType([DocLexer::T_CLOSE_PARENTHESIS, DocLexer::T_CLOSE_CURLY_BRACES]); - } - - return false; - } - - /** - * @param int $newLineTokenIndex - * @param array> $annotationPositions Pairs of begin and end indexes of main annotations - * - * @return bool - */ - private function indentationCanBeFixed(Tokens $tokens, $newLineTokenIndex, array $annotationPositions) - { - foreach ($annotationPositions as $position) { - if ($newLineTokenIndex >= $position[0] && $newLineTokenIndex <= $position[1]) { - return true; - } - } - - for ($index = $newLineTokenIndex + 1, $max = \count($tokens); $index < $max; ++$index) { - $token = $tokens[$index]; - - if (false !== strpos($token->getContent(), "\n")) { - return false; - } - - return $tokens[$index]->isType(DocLexer::T_AT); - } - - return false; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php deleted file mode 100644 index 5ff458d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php +++ /dev/null @@ -1,349 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\DoctrineAnnotation; - -use Doctrine\Common\Annotations\DocLexer; -use PhpCsFixer\AbstractDoctrineAnnotationFixer; -use PhpCsFixer\Doctrine\Annotation\Token; -use PhpCsFixer\Doctrine\Annotation\Tokens; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; - -/** - * Fixes spaces around commas and assignment operators in Doctrine annotations. - */ -final class DoctrineAnnotationSpacesFixer extends AbstractDoctrineAnnotationFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Fixes spaces in Doctrine annotations.', - [ - new CodeSample( - " false, 'before_array_assignments_equals' => false] - ), - ], - 'There must not be any space around parentheses; commas must be preceded by no space and followed by one space; there must be no space around named arguments assignment operator; there must be one space around array assignment operator.' - ); - } - - /** - * {@inheritdoc} - * - * Must run after DoctrineAnnotationArrayAssignmentFixer. - */ - public function getPriority() - { - return 0; - } - - public function configure(array $configuration = null) - { - parent::configure($configuration); - - if (!$this->configuration['around_argument_assignments']) { - foreach ([ - 'before_argument_assignments', - 'after_argument_assignments', - ] as $newOption) { - if (!\array_key_exists($newOption, $configuration)) { - $this->configuration[$newOption] = null; - } - } - } - - if (!$this->configuration['around_array_assignments']) { - foreach ([ - 'before_array_assignments_equals', - 'after_array_assignments_equals', - 'before_array_assignments_colon', - 'after_array_assignments_colon', - ] as $newOption) { - if (!\array_key_exists($newOption, $configuration)) { - $this->configuration[$newOption] = null; - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver(array_merge( - parent::createConfigurationDefinition()->getOptions(), - [ - (new FixerOptionBuilder('around_parentheses', 'Whether to fix spaces around parentheses.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('around_commas', 'Whether to fix spaces around commas.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('around_argument_assignments', 'Whether to fix spaces around argument assignment operator.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->setDeprecationMessage('Use options `before_argument_assignments` and `after_argument_assignments` instead.') - ->getOption(), - (new FixerOptionBuilder('before_argument_assignments', 'Whether to add, remove or ignore spaces before argument assignment operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('after_argument_assignments', 'Whether to add, remove or ignore spaces after argument assignment operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('around_array_assignments', 'Whether to fix spaces around array assignment operators.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->setDeprecationMessage('Use options `before_array_assignments_equals`, `after_array_assignments_equals`, `before_array_assignments_colon` and `after_array_assignments_colon` instead.') - ->getOption(), - (new FixerOptionBuilder('before_array_assignments_equals', 'Whether to add, remove or ignore spaces before array `=` assignment operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('after_array_assignments_equals', 'Whether to add, remove or ignore spaces after array assignment `=` operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('before_array_assignments_colon', 'Whether to add, remove or ignore spaces before array `:` assignment operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('after_array_assignments_colon', 'Whether to add, remove or ignore spaces after array assignment `:` operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(true) - ->getOption(), - ] - )); - } - - /** - * {@inheritdoc} - */ - protected function fixAnnotations(Tokens $tokens) - { - if ($this->configuration['around_parentheses']) { - $this->fixSpacesAroundParentheses($tokens); - } - - if ($this->configuration['around_commas']) { - $this->fixSpacesAroundCommas($tokens); - } - - if ( - null !== $this->configuration['before_argument_assignments'] - || null !== $this->configuration['after_argument_assignments'] - || null !== $this->configuration['before_array_assignments_equals'] - || null !== $this->configuration['after_array_assignments_equals'] - || null !== $this->configuration['before_array_assignments_colon'] - || null !== $this->configuration['after_array_assignments_colon'] - ) { - $this->fixAroundAssignments($tokens); - } - } - - private function fixSpacesAroundParentheses(Tokens $tokens) - { - $inAnnotationUntilIndex = null; - - foreach ($tokens as $index => $token) { - if (null !== $inAnnotationUntilIndex) { - if ($index === $inAnnotationUntilIndex) { - $inAnnotationUntilIndex = null; - - continue; - } - } elseif ($tokens[$index]->isType(DocLexer::T_AT)) { - $endIndex = $tokens->getAnnotationEnd($index); - if (null !== $endIndex) { - $inAnnotationUntilIndex = $endIndex + 1; - } - - continue; - } - - if (null === $inAnnotationUntilIndex) { - continue; - } - - if (!$token->isType([DocLexer::T_OPEN_PARENTHESIS, DocLexer::T_CLOSE_PARENTHESIS])) { - continue; - } - - if ($token->isType(DocLexer::T_OPEN_PARENTHESIS)) { - $token = $tokens[$index - 1]; - if ($token->isType(DocLexer::T_NONE)) { - $token->clear(); - } - - $token = $tokens[$index + 1]; - } else { - $token = $tokens[$index - 1]; - } - - if ($token->isType(DocLexer::T_NONE)) { - if (false !== strpos($token->getContent(), "\n")) { - continue; - } - - $token->clear(); - } - } - } - - private function fixSpacesAroundCommas(Tokens $tokens) - { - $inAnnotationUntilIndex = null; - - foreach ($tokens as $index => $token) { - if (null !== $inAnnotationUntilIndex) { - if ($index === $inAnnotationUntilIndex) { - $inAnnotationUntilIndex = null; - - continue; - } - } elseif ($tokens[$index]->isType(DocLexer::T_AT)) { - $endIndex = $tokens->getAnnotationEnd($index); - if (null !== $endIndex) { - $inAnnotationUntilIndex = $endIndex; - } - - continue; - } - - if (null === $inAnnotationUntilIndex) { - continue; - } - - if (!$token->isType(DocLexer::T_COMMA)) { - continue; - } - - $token = $tokens[$index - 1]; - if ($token->isType(DocLexer::T_NONE)) { - $token->clear(); - } - - if ($index < \count($tokens) - 1 && !Preg::match('/^\s/', $tokens[$index + 1]->getContent())) { - $tokens->insertAt($index + 1, new Token(DocLexer::T_NONE, ' ')); - } - } - } - - private function fixAroundAssignments(Tokens $tokens) - { - $beforeArguments = $this->configuration['before_argument_assignments']; - $afterArguments = $this->configuration['after_argument_assignments']; - $beforeArraysEquals = $this->configuration['before_array_assignments_equals']; - $afterArraysEquals = $this->configuration['after_array_assignments_equals']; - $beforeArraysColon = $this->configuration['before_array_assignments_colon']; - $afterArraysColon = $this->configuration['after_array_assignments_colon']; - - $scopes = []; - foreach ($tokens as $index => $token) { - $endScopeType = end($scopes); - if (false !== $endScopeType && $token->isType($endScopeType)) { - array_pop($scopes); - - continue; - } - - if ($tokens[$index]->isType(DocLexer::T_AT)) { - $scopes[] = DocLexer::T_CLOSE_PARENTHESIS; - - continue; - } - - if ($tokens[$index]->isType(DocLexer::T_OPEN_CURLY_BRACES)) { - $scopes[] = DocLexer::T_CLOSE_CURLY_BRACES; - - continue; - } - - if (DocLexer::T_CLOSE_PARENTHESIS === $endScopeType && $token->isType(DocLexer::T_EQUALS)) { - $this->updateSpacesAfter($tokens, $index, $afterArguments); - $this->updateSpacesBefore($tokens, $index, $beforeArguments); - - continue; - } - - if (DocLexer::T_CLOSE_CURLY_BRACES === $endScopeType) { - if ($token->isType(DocLexer::T_EQUALS)) { - $this->updateSpacesAfter($tokens, $index, $afterArraysEquals); - $this->updateSpacesBefore($tokens, $index, $beforeArraysEquals); - - continue; - } - - if ($token->isType(DocLexer::T_COLON)) { - $this->updateSpacesAfter($tokens, $index, $afterArraysColon); - $this->updateSpacesBefore($tokens, $index, $beforeArraysColon); - } - } - } - } - - /** - * @param int $index - * @param null|bool $insert - */ - private function updateSpacesAfter(Tokens $tokens, $index, $insert) - { - $this->updateSpacesAt($tokens, $index + 1, $index + 1, $insert); - } - - /** - * @param int $index - * @param null|bool $insert - */ - private function updateSpacesBefore(Tokens $tokens, $index, $insert) - { - $this->updateSpacesAt($tokens, $index - 1, $index, $insert); - } - - /** - * @param int $index - * @param int $insertIndex - * @param null|bool $insert - */ - private function updateSpacesAt(Tokens $tokens, $index, $insertIndex, $insert) - { - if (null === $insert) { - return; - } - - $token = $tokens[$index]; - if ($insert) { - if (!$token->isType(DocLexer::T_NONE)) { - $tokens->insertAt($insertIndex, $token = new Token()); - } - - $token->setContent(' '); - } elseif ($token->isType(DocLexer::T_NONE)) { - $token->clear(); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FixerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FixerInterface.php deleted file mode 100644 index e4f5172..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FixerInterface.php +++ /dev/null @@ -1,77 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer; - -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - * @author Fabien Potencier - */ -interface FixerInterface -{ - /** - * Check if the fixer is a candidate for given Tokens collection. - * - * Fixer is a candidate when the collection contains tokens that may be fixed - * during fixer work. This could be considered as some kind of bloom filter. - * When this method returns true then to the Tokens collection may or may not - * need a fixing, but when this method returns false then the Tokens collection - * need no fixing for sure. - * - * @return bool - */ - public function isCandidate(Tokens $tokens); - - /** - * Check if fixer is risky or not. - * - * Risky fixer could change code behavior! - * - * @return bool - */ - public function isRisky(); - - /** - * Fixes a file. - * - * @param \SplFileInfo $file A \SplFileInfo instance - * @param Tokens $tokens Tokens collection - */ - public function fix(\SplFileInfo $file, Tokens $tokens); - - /** - * Returns the name of the fixer. - * - * The name must be all lowercase and without any spaces. - * - * @return string The name of the fixer - */ - public function getName(); - - /** - * Returns the priority of the fixer. - * - * The default priority is 0 and higher priorities are executed first. - * - * @return int - */ - public function getPriority(); - - /** - * Returns true if the file is supported by this fixer. - * - * @return bool true if the file is supported by this fixer, false otherwise - */ - public function supports(\SplFileInfo $file); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php deleted file mode 100644 index d06235f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php +++ /dev/null @@ -1,234 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gregor Harlan - */ -final class CombineNestedDirnameFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replace multiple nested calls of `dirname` by only one call with second `$level` parameter. Requires PHP >= 7.0.', - [ - new VersionSpecificCodeSample( - "= 70000 && $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - * - * Must run before MethodArgumentSpaceFixer, NoSpacesInsideParenthesisFixer. - * Must run after DirConstantFixer. - */ - public function getPriority() - { - return 3; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $dirnameInfo = $this->getDirnameInfo($tokens, $index); - - if (!$dirnameInfo) { - continue; - } - - $prev = $tokens->getPrevMeaningfulToken($dirnameInfo['indexes'][0]); - - if (!$tokens[$prev]->equals('(')) { - continue; - } - - $prev = $tokens->getPrevMeaningfulToken($prev); - - $firstArgumentEnd = $dirnameInfo['end']; - - $dirnameInfoArray = [$dirnameInfo]; - - while ($dirnameInfo = $this->getDirnameInfo($tokens, $prev, $firstArgumentEnd)) { - $dirnameInfoArray[] = $dirnameInfo; - - $prev = $tokens->getPrevMeaningfulToken($dirnameInfo['indexes'][0]); - - if (!$tokens[$prev]->equals('(')) { - break; - } - - $prev = $tokens->getPrevMeaningfulToken($prev); - $firstArgumentEnd = $dirnameInfo['end']; - } - - if (\count($dirnameInfoArray) > 1) { - $this->combineDirnames($tokens, $dirnameInfoArray); - } - - $index = $prev; - } - } - - /** - * @param int $index Index of `dirname` - * @param null|int $firstArgumentEndIndex Index of last token of first argument of `dirname` call - * - * @return array|bool `false` when it is not a (supported) `dirname` call, an array with info about the dirname call otherwise - */ - private function getDirnameInfo(Tokens $tokens, $index, $firstArgumentEndIndex = null) - { - if (!$tokens[$index]->equals([T_STRING, 'dirname'], false)) { - return false; - } - - if (!(new FunctionsAnalyzer())->isGlobalFunctionCall($tokens, $index)) { - return false; - } - - $info['indexes'] = []; - - $prev = $tokens->getPrevMeaningfulToken($index); - - if ($tokens[$prev]->isGivenKind(T_NS_SEPARATOR)) { - $info['indexes'][] = $prev; - } - - $info['indexes'][] = $index; - - // opening parenthesis "(" - $next = $tokens->getNextMeaningfulToken($index); - $info['indexes'][] = $next; - - if (null !== $firstArgumentEndIndex) { - $next = $tokens->getNextMeaningfulToken($firstArgumentEndIndex); - } else { - $next = $tokens->getNextMeaningfulToken($next); - - if ($tokens[$next]->equals(')')) { - return false; - } - - while (!$tokens[$next]->equalsAny([',', ')'])) { - $blockType = Tokens::detectBlockType($tokens[$next]); - - if ($blockType) { - $next = $tokens->findBlockEnd($blockType['type'], $next); - } - - $next = $tokens->getNextMeaningfulToken($next); - } - } - - $info['indexes'][] = $next; - - if ($tokens[$next]->equals(',')) { - $next = $tokens->getNextMeaningfulToken($next); - $info['indexes'][] = $next; - } - - if ($tokens[$next]->equals(')')) { - $info['levels'] = 1; - $info['end'] = $next; - - return $info; - } - - if (!$tokens[$next]->isGivenKind(T_LNUMBER)) { - return false; - } - - $info['secondArgument'] = $next; - $info['levels'] = (int) $tokens[$next]->getContent(); - - $next = $tokens->getNextMeaningfulToken($next); - - if ($tokens[$next]->equals(',')) { - $info['indexes'][] = $next; - $next = $tokens->getNextMeaningfulToken($next); - } - - if (!$tokens[$next]->equals(')')) { - return false; - } - - $info['indexes'][] = $next; - $info['end'] = $next; - - return $info; - } - - private function combineDirnames(Tokens $tokens, array $dirnameInfoArray) - { - $outerDirnameInfo = array_pop($dirnameInfoArray); - $levels = $outerDirnameInfo['levels']; - - foreach ($dirnameInfoArray as $dirnameInfo) { - $levels += $dirnameInfo['levels']; - - foreach ($dirnameInfo['indexes'] as $index) { - $tokens->removeLeadingWhitespace($index); - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - } - - $levelsToken = new Token([T_LNUMBER, (string) $levels]); - - if (isset($outerDirnameInfo['secondArgument'])) { - $tokens[$outerDirnameInfo['secondArgument']] = $levelsToken; - } else { - $prev = $tokens->getPrevMeaningfulToken($outerDirnameInfo['end']); - $items = []; - if (!$tokens[$prev]->equals(',')) { - $items = [new Token(','), new Token([T_WHITESPACE, ' '])]; - } - $items[] = $levelsToken; - $tokens->insertAt($outerDirnameInfo['end'], $items); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php deleted file mode 100644 index c0d7667..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php +++ /dev/null @@ -1,130 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFopenFlagFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class FopenFlagOrderFixer extends AbstractFopenFlagFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Order the flags in `fopen` calls, `b` and `t` must be last.', - [new CodeSample("isGivenKind([T_WHITESPACE, T_COMMENT, T_DOC_COMMENT])) { - continue; - } - - if (null !== $argumentFlagIndex) { - return; // multiple meaningful tokens found, no candidate for fixing - } - - $argumentFlagIndex = $i; - } - - // check if second argument is candidate - if (null === $argumentFlagIndex || !$tokens[$argumentFlagIndex]->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { - return; - } - - $content = $tokens[$argumentFlagIndex]->getContent(); - $contentQuote = $content[0]; // `'`, `"`, `b` or `B` - - if ('b' === $contentQuote || 'B' === $contentQuote) { - $binPrefix = $contentQuote; - $contentQuote = $content[1]; // `'` or `"` - $mode = substr($content, 2, -1); - } else { - $binPrefix = ''; - $mode = substr($content, 1, -1); - } - - $modeLength = \strlen($mode); - if ($modeLength < 2) { - return; // nothing to sort - } - - if (false === $this->isValidModeString($mode)) { - return; - } - - $split = $this->sortFlags(Preg::split('#([^\+]\+?)#', $mode, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)); - $newContent = $binPrefix.$contentQuote.implode('', $split).$contentQuote; - - if ($content !== $newContent) { - $tokens[$argumentFlagIndex] = new Token([T_CONSTANT_ENCAPSED_STRING, $newContent]); - } - } - - /** - * @param string[] $flags - * - * @return string[] - */ - private function sortFlags(array $flags) - { - usort( - $flags, - static function ($flag1, $flag2) { - if ($flag1 === $flag2) { - return 0; - } - - if ('b' === $flag1) { - return 1; - } - - if ('b' === $flag2) { - return -1; - } - - if ('t' === $flag1) { - return 1; - } - - if ('t' === $flag2) { - return -1; - } - - return $flag1 < $flag2 ? -1 : 1; - } - ); - - return $flags; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php deleted file mode 100644 index ea9ba96..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php +++ /dev/null @@ -1,114 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFopenFlagFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class FopenFlagsFixer extends AbstractFopenFlagFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'The flags in `fopen` calls must omit `t`, and `b` must be omitted or included consistently.', - [ - new CodeSample(" false]), - ], - null, - 'Risky when the function `fopen` is overridden.' - ); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('b_mode', 'The `b` flag must be used (`true`) or omitted (`false`).')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - /** - * @param int $argumentStartIndex - * @param int $argumentEndIndex - */ - protected function fixFopenFlagToken(Tokens $tokens, $argumentStartIndex, $argumentEndIndex) - { - $argumentFlagIndex = null; - - for ($i = $argumentStartIndex; $i <= $argumentEndIndex; ++$i) { - if ($tokens[$i]->isGivenKind([T_WHITESPACE, T_COMMENT, T_DOC_COMMENT])) { - continue; - } - - if (null !== $argumentFlagIndex) { - return; // multiple meaningful tokens found, no candidate for fixing - } - - $argumentFlagIndex = $i; - } - - // check if second argument is candidate - if (null === $argumentFlagIndex || !$tokens[$argumentFlagIndex]->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { - return; - } - - $content = $tokens[$argumentFlagIndex]->getContent(); - $contentQuote = $content[0]; // `'`, `"`, `b` or `B` - - if ('b' === $contentQuote || 'B' === $contentQuote) { - $binPrefix = $contentQuote; - $contentQuote = $content[1]; // `'` or `"` - $mode = substr($content, 2, -1); - } else { - $binPrefix = ''; - $mode = substr($content, 1, -1); - } - - if (false === $this->isValidModeString($mode)) { - return; - } - - $mode = str_replace('t', '', $mode); - if ($this->configuration['b_mode']) { - if (false === strpos($mode, 'b')) { - $mode .= 'b'; - } - } else { - $mode = str_replace('b', '', $mode); - } - - $newContent = $binPrefix.$contentQuote.$mode.$contentQuote; - - if ($content !== $newContent) { - $tokens[$argumentFlagIndex] = new Token([T_CONSTANT_ENCAPSED_STRING, $newContent]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php deleted file mode 100644 index dee90ba..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php +++ /dev/null @@ -1,217 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * Fixer for rules defined in PSR2 generally (¶1 and ¶6). - * - * @author Dariusz Rumiński - */ -final class FunctionDeclarationFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @internal - */ - const SPACING_NONE = 'none'; - - /** - * @internal - */ - const SPACING_ONE = 'one'; - - private $supportedSpacings = [self::SPACING_NONE, self::SPACING_ONE]; - - private $singleLineWhitespaceOptions = " \t"; - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - if (\PHP_VERSION_ID >= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Spaces should be properly placed in a function declaration.', - [ - new CodeSample( - ' self::SPACING_NONE] - ), - new VersionSpecificCodeSample( - ' null; -', - new VersionSpecification(70400), - ['closure_function_spacing' => self::SPACING_NONE] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ( - !$token->isGivenKind(T_FUNCTION) - && (\PHP_VERSION_ID < 70400 || !$token->isGivenKind(T_FN)) - ) { - continue; - } - - $startParenthesisIndex = $tokens->getNextTokenOfKind($index, ['(', ';', [T_CLOSE_TAG]]); - if (!$tokens[$startParenthesisIndex]->equals('(')) { - continue; - } - - $endParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startParenthesisIndex); - $startBraceIndex = $tokens->getNextTokenOfKind($endParenthesisIndex, [';', '{', [T_DOUBLE_ARROW]]); - - // fix single-line whitespace before { or => - // eg: `function foo(){}` => `function foo() {}` - // eg: `function foo() {}` => `function foo() {}` - // eg: `fn() =>` => `fn() =>` - if ( - $tokens[$startBraceIndex]->equalsAny(['{', [T_DOUBLE_ARROW]]) && - ( - !$tokens[$startBraceIndex - 1]->isWhitespace() || - $tokens[$startBraceIndex - 1]->isWhitespace($this->singleLineWhitespaceOptions) - ) - ) { - $tokens->ensureWhitespaceAtIndex($startBraceIndex - 1, 1, ' '); - } - - $afterParenthesisIndex = $tokens->getNextNonWhitespace($endParenthesisIndex); - $afterParenthesisToken = $tokens[$afterParenthesisIndex]; - - if ($afterParenthesisToken->isGivenKind(CT::T_USE_LAMBDA)) { - // fix whitespace after CT:T_USE_LAMBDA (we might add a token, so do this before determining start and end parenthesis) - $tokens->ensureWhitespaceAtIndex($afterParenthesisIndex + 1, 0, ' '); - - $useStartParenthesisIndex = $tokens->getNextTokenOfKind($afterParenthesisIndex, ['(']); - $useEndParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $useStartParenthesisIndex); - - // remove single-line edge whitespaces inside use parentheses - $this->fixParenthesisInnerEdge($tokens, $useStartParenthesisIndex, $useEndParenthesisIndex); - - // fix whitespace before CT::T_USE_LAMBDA - $tokens->ensureWhitespaceAtIndex($afterParenthesisIndex - 1, 1, ' '); - } - - // remove single-line edge whitespaces inside parameters list parentheses - $this->fixParenthesisInnerEdge($tokens, $startParenthesisIndex, $endParenthesisIndex); - - $isLambda = $tokensAnalyzer->isLambda($index); - - // remove whitespace before ( - // eg: `function foo () {}` => `function foo() {}` - if (!$isLambda && $tokens[$startParenthesisIndex - 1]->isWhitespace() && !$tokens[$tokens->getPrevNonWhitespace($startParenthesisIndex - 1)]->isComment()) { - $tokens->clearAt($startParenthesisIndex - 1); - } - - if ($isLambda && self::SPACING_NONE === $this->configuration['closure_function_spacing']) { - // optionally remove whitespace after T_FUNCTION of a closure - // eg: `function () {}` => `function() {}` - if ($tokens[$index + 1]->isWhitespace()) { - $tokens->clearAt($index + 1); - } - } else { - // otherwise, enforce whitespace after T_FUNCTION - // eg: `function foo() {}` => `function foo() {}` - $tokens->ensureWhitespaceAtIndex($index + 1, 0, ' '); - } - - if ($isLambda) { - $prev = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prev]->isGivenKind(T_STATIC)) { - // fix whitespace after T_STATIC - // eg: `$a = static function(){};` => `$a = static function(){};` - $tokens->ensureWhitespaceAtIndex($prev + 1, 0, ' '); - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('closure_function_spacing', 'Spacing to use before open parenthesis for closures.')) - ->setDefault(self::SPACING_ONE) - ->setAllowedValues($this->supportedSpacings) - ->getOption(), - ]); - } - - private function fixParenthesisInnerEdge(Tokens $tokens, $start, $end) - { - // remove single-line whitespace before ) - if ($tokens[$end - 1]->isWhitespace($this->singleLineWhitespaceOptions)) { - $tokens->clearAt($end - 1); - } - - // remove single-line whitespace after ( - if ($tokens[$start + 1]->isWhitespace($this->singleLineWhitespaceOptions)) { - $tokens->clearAt($start + 1); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionTypehintSpaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionTypehintSpaceFixer.php deleted file mode 100644 index 531494c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionTypehintSpaceFixer.php +++ /dev/null @@ -1,94 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\TypeAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class FunctionTypehintSpaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Ensure single space between function\'s argument and its typehint.', - [ - new CodeSample("= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ( - !$token->isGivenKind(T_FUNCTION) - && (\PHP_VERSION_ID < 70400 || !$token->isGivenKind(T_FN)) - ) { - continue; - } - - $arguments = $functionsAnalyzer->getFunctionArguments($tokens, $index); - - foreach (array_reverse($arguments) as $argument) { - $type = $argument->getTypeAnalysis(); - - if (!$type instanceof TypeAnalysis) { - continue; - } - - $whitespaceTokenIndex = $type->getEndIndex() + 1; - - if ($tokens[$whitespaceTokenIndex]->equals([T_WHITESPACE])) { - if (' ' === $tokens[$whitespaceTokenIndex]->getContent()) { - continue; - } - - $tokens->clearAt($whitespaceTokenIndex); - } - - $tokens->insertAt($whitespaceTokenIndex, new Token([T_WHITESPACE, ' '])); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php deleted file mode 100644 index e7bf072..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php +++ /dev/null @@ -1,150 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - */ -final class ImplodeCallFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Function `implode` must be called with 2 arguments in the documented order.', - [ - new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - * - * Must run before MethodArgumentSpaceFixer. - * Must run after NoAliasFunctionsFixer. - */ - public function getPriority() - { - return -1; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - for ($index = \count($tokens) - 1; $index > 0; --$index) { - if (!$tokens[$index]->equals([T_STRING, 'implode'], false)) { - continue; - } - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $argumentsIndices = $this->getArgumentIndices($tokens, $index); - - if (1 === \count($argumentsIndices)) { - $firstArgumentIndex = key($argumentsIndices); - $tokens->insertAt($firstArgumentIndex, [ - new Token([T_CONSTANT_ENCAPSED_STRING, "''"]), - new Token(','), - new Token([T_WHITESPACE, ' ']), - ]); - - continue; - } - - if (2 === \count($argumentsIndices)) { - list($firstArgumentIndex, $secondArgumentIndex) = array_keys($argumentsIndices); - - // If the first argument is string we have nothing to do - if ($tokens[$firstArgumentIndex]->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { - continue; - } - // If the second argument is not string we cannot make a swap - if (!$tokens[$secondArgumentIndex]->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { - continue; - } - - // collect tokens from first argument - $firstArgumentEndIndex = $argumentsIndices[key($argumentsIndices)]; - $newSecondArgumentTokens = []; - for ($i = key($argumentsIndices); $i <= $firstArgumentEndIndex; ++$i) { - $newSecondArgumentTokens[] = clone $tokens[$i]; - $tokens->clearAt($i); - } - - $tokens->insertAt($firstArgumentIndex, clone $tokens[$secondArgumentIndex]); - - // insert above increased the second argument index - ++$secondArgumentIndex; - $tokens->clearAt($secondArgumentIndex); - $tokens->insertAt($secondArgumentIndex, $newSecondArgumentTokens); - } - } - } - - /** - * @param int $functionNameIndex - * - * @return array In the format: startIndex => endIndex - */ - private function getArgumentIndices(Tokens $tokens, $functionNameIndex) - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - $openParenthesis = $tokens->getNextTokenOfKind($functionNameIndex, ['(']); - $closeParenthesis = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openParenthesis); - - $indices = []; - - foreach ($argumentsAnalyzer->getArguments($tokens, $openParenthesis, $closeParenthesis) as $startIndexCandidate => $endIndex) { - $indices[$tokens->getNextMeaningfulToken($startIndexCandidate - 1)] = $tokens->getPrevMeaningfulToken($endIndex + 1); - } - - return $indices; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php deleted file mode 100644 index 4c4de72..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php +++ /dev/null @@ -1,511 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerConfiguration\InvalidOptionsForEnvException; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Options; - -/** - * Fixer for rules defined in PSR2 ¶4.4, ¶4.6. - * - * @author Kuanhung Chen - */ -final class MethodArgumentSpaceFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * Method to insert space after comma and remove space before comma. - * - * @param int $index - */ - public function fixSpace(Tokens $tokens, $index) - { - @trigger_error(__METHOD__.' is deprecated and will be removed in 3.0.', E_USER_DEPRECATED); - $this->fixSpace2($tokens, $index); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'In method arguments and method call, there MUST NOT be a space before each comma and there MUST be one space after each comma. Argument lists MAY be split across multiple lines, where each subsequent line is indented once. When doing so, the first item in the list MUST be on the next line, and there MUST be only one argument per line.', - [ - new CodeSample( - " false] - ), - new CodeSample( - " true] - ), - new CodeSample( - " 'ensure_fully_multiline'] - ), - new CodeSample( - " 'ensure_single_line'] - ), - new CodeSample( - " 'ensure_fully_multiline', - 'keep_multiple_spaces_after_comma' => true, - ] - ), - new CodeSample( - " 'ensure_fully_multiline', - 'keep_multiple_spaces_after_comma' => false, - ] - ), - new VersionSpecificCodeSample( - <<<'SAMPLE' - true] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound('('); - } - - public function configure(array $configuration = null) - { - parent::configure($configuration); - - if ($this->configuration['ensure_fully_multiline'] && 'ignore' === $this->configuration['on_multiline']) { - $this->configuration['on_multiline'] = 'ensure_fully_multiline'; - } - } - - /** - * {@inheritdoc} - * - * Must run before ArrayIndentationFixer. - * Must run after BracesFixer, CombineNestedDirnameFixer, ImplodeCallFixer, MethodChainingIndentationFixer, PowToExponentiationFixer. - */ - public function getPriority() - { - return -30; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $expectedTokens = [T_LIST, T_FUNCTION]; - if (\PHP_VERSION_ID >= 70400) { - $expectedTokens[] = T_FN; - } - - for ($index = $tokens->count() - 1; $index > 0; --$index) { - $token = $tokens[$index]; - - if (!$token->equals('(')) { - continue; - } - - $meaningfulTokenBeforeParenthesis = $tokens[$tokens->getPrevMeaningfulToken($index)]; - if ( - $meaningfulTokenBeforeParenthesis->isKeyword() - && !$meaningfulTokenBeforeParenthesis->isGivenKind($expectedTokens) - ) { - continue; - } - - $isMultiline = $this->fixFunction($tokens, $index); - - if ( - $isMultiline - && 'ensure_fully_multiline' === $this->configuration['on_multiline'] - && !$meaningfulTokenBeforeParenthesis->isGivenKind(T_LIST) - ) { - $this->ensureFunctionFullyMultiline($tokens, $index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('keep_multiple_spaces_after_comma', 'Whether keep multiple spaces after comma.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder( - 'ensure_fully_multiline', - 'ensure every argument of a multiline argument list is on its own line' - )) - ->setAllowedTypes(['bool']) - ->setDefault(false) // @TODO 3.0 remove - ->setDeprecationMessage('Use option `on_multiline` instead.') - ->getOption(), - (new FixerOptionBuilder( - 'on_multiline', - 'Defines how to handle function arguments lists that contain newlines.' - )) - ->setAllowedValues(['ignore', 'ensure_single_line', 'ensure_fully_multiline']) - ->setDefault('ignore') // @TODO 3.0 should be 'ensure_fully_multiline' - ->getOption(), - (new FixerOptionBuilder('after_heredoc', 'Whether the whitespace between heredoc end and comma should be removed.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->setNormalizer(static function (Options $options, $value) { - if (\PHP_VERSION_ID < 70300 && $value) { - throw new InvalidOptionsForEnvException('"after_heredoc" option can only be enabled with PHP 7.3+.'); - } - - return $value; - }) - ->getOption(), - ]); - } - - /** - * Fix arguments spacing for given function. - * - * @param Tokens $tokens Tokens to handle - * @param int $startFunctionIndex Start parenthesis position - * - * @return bool whether the function is multiline - */ - private function fixFunction(Tokens $tokens, $startFunctionIndex) - { - $endFunctionIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startFunctionIndex); - - $isMultiline = false; - - $firstWhitespaceIndex = $this->findWhitespaceIndexAfterParenthesis($tokens, $startFunctionIndex, $endFunctionIndex); - $lastWhitespaceIndex = $this->findWhitespaceIndexAfterParenthesis($tokens, $endFunctionIndex, $startFunctionIndex); - - foreach ([$firstWhitespaceIndex, $lastWhitespaceIndex] as $index) { - if (null === $index || !Preg::match('/\R/', $tokens[$index]->getContent())) { - continue; - } - - if ('ensure_single_line' !== $this->configuration['on_multiline']) { - $isMultiline = true; - - continue; - } - - $newLinesRemoved = $this->ensureSingleLine($tokens, $index); - if (!$newLinesRemoved) { - $isMultiline = true; - } - } - - for ($index = $endFunctionIndex - 1; $index > $startFunctionIndex; --$index) { - $token = $tokens[$index]; - - if ($token->equals(')')) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_CLOSE)) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index); - - continue; - } - - if ($token->equals('}')) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if ($token->equals(',')) { - $this->fixSpace2($tokens, $index); - if (!$isMultiline && $this->isNewline($tokens[$index + 1])) { - $isMultiline = true; - - break; - } - } - } - - return $isMultiline; - } - - /** - * @param int $startParenthesisIndex - * @param int $endParenthesisIndex - * - * @return null|int - */ - private function findWhitespaceIndexAfterParenthesis(Tokens $tokens, $startParenthesisIndex, $endParenthesisIndex) - { - $direction = $endParenthesisIndex > $startParenthesisIndex ? 1 : -1; - $startIndex = $startParenthesisIndex + $direction; - $endIndex = $endParenthesisIndex - $direction; - - for ($index = $startIndex; $index !== $endIndex; $index += $direction) { - $token = $tokens[$index]; - - if ($token->isWhitespace()) { - return $index; - } - - if (!$token->isComment()) { - break; - } - } - - return null; - } - - /** - * @param int $index - * - * @return bool Whether newlines were removed from the whitespace token - */ - private function ensureSingleLine(Tokens $tokens, $index) - { - $previousToken = $tokens[$index - 1]; - if ($previousToken->isComment() && 0 !== strpos($previousToken->getContent(), '/*')) { - return false; - } - - $content = Preg::replace('/\R\h*/', '', $tokens[$index]->getContent()); - if ('' !== $content) { - $tokens[$index] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($index); - } - - return true; - } - - /** - * @param int $startFunctionIndex - */ - private function ensureFunctionFullyMultiline(Tokens $tokens, $startFunctionIndex) - { - // find out what the indentation is - $searchIndex = $startFunctionIndex; - do { - $prevWhitespaceTokenIndex = $tokens->getPrevTokenOfKind( - $searchIndex, - [[T_WHITESPACE]] - ); - $searchIndex = $prevWhitespaceTokenIndex; - } while (null !== $prevWhitespaceTokenIndex - && false === strpos($tokens[$prevWhitespaceTokenIndex]->getContent(), "\n") - ); - - if (null === $prevWhitespaceTokenIndex) { - $existingIndentation = ''; - } else { - $existingIndentation = $tokens[$prevWhitespaceTokenIndex]->getContent(); - $lastLineIndex = strrpos($existingIndentation, "\n"); - $existingIndentation = false === $lastLineIndex - ? $existingIndentation - : substr($existingIndentation, $lastLineIndex + 1) - ; - } - - $indentation = $existingIndentation.$this->whitespacesConfig->getIndent(); - $endFunctionIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startFunctionIndex); - - $wasWhitespaceBeforeEndFunctionAddedAsNewToken = $tokens->ensureWhitespaceAtIndex( - $tokens[$endFunctionIndex - 1]->isWhitespace() ? $endFunctionIndex - 1 : $endFunctionIndex, - 0, - $this->whitespacesConfig->getLineEnding().$existingIndentation - ); - - if ($wasWhitespaceBeforeEndFunctionAddedAsNewToken) { - ++$endFunctionIndex; - } - - for ($index = $endFunctionIndex - 1; $index > $startFunctionIndex; --$index) { - $token = $tokens[$index]; - - // skip nested method calls and arrays - if ($token->equals(')')) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - // skip nested arrays - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_CLOSE)) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index); - - continue; - } - - if ($token->equals('}')) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if ($token->equals(',') && !$tokens[$tokens->getNextMeaningfulToken($index)]->equals(')')) { - $this->fixNewline($tokens, $index, $indentation); - } - } - - $this->fixNewline($tokens, $startFunctionIndex, $indentation, false); - } - - /** - * Method to insert newline after comma or opening parenthesis. - * - * @param int $index index of a comma - * @param string $indentation the indentation that should be used - * @param bool $override whether to override the existing character or not - */ - private function fixNewline(Tokens $tokens, $index, $indentation, $override = true) - { - if ($tokens[$index + 1]->isComment()) { - return; - } - - if ($tokens[$index + 2]->isComment()) { - $nextMeaningfulTokenIndex = $tokens->getNextMeaningfulToken($index + 2); - if (!$this->isNewline($tokens[$nextMeaningfulTokenIndex - 1])) { - $tokens->ensureWhitespaceAtIndex($nextMeaningfulTokenIndex, 0, $this->whitespacesConfig->getLineEnding().$indentation); - } - - return; - } - - $nextMeaningfulTokenIndex = $tokens->getNextMeaningfulToken($index); - if ($tokens[$nextMeaningfulTokenIndex]->equals(')')) { - return; - } - - $tokens->ensureWhitespaceAtIndex($index + 1, 0, $this->whitespacesConfig->getLineEnding().$indentation); - } - - /** - * Method to insert space after comma and remove space before comma. - * - * @param int $index - */ - private function fixSpace2(Tokens $tokens, $index) - { - // remove space before comma if exist - if ($tokens[$index - 1]->isWhitespace()) { - $prevIndex = $tokens->getPrevNonWhitespace($index - 1); - - if ( - !$tokens[$prevIndex]->equals(',') && !$tokens[$prevIndex]->isComment() && - ($this->configuration['after_heredoc'] || !$tokens[$prevIndex]->isGivenKind(T_END_HEREDOC)) - ) { - $tokens->clearAt($index - 1); - } - } - - $nextIndex = $index + 1; - $nextToken = $tokens[$nextIndex]; - - // Two cases for fix space after comma (exclude multiline comments) - // 1) multiple spaces after comma - // 2) no space after comma - if ($nextToken->isWhitespace()) { - $newContent = $nextToken->getContent(); - - if ('ensure_single_line' === $this->configuration['on_multiline']) { - $newContent = Preg::replace('/\R/', '', $newContent); - } - - if ( - (!$this->configuration['keep_multiple_spaces_after_comma'] || Preg::match('/\R/', $newContent)) - && !$this->isCommentLastLineToken($tokens, $index + 2) - ) { - $newContent = ltrim($newContent, " \t"); - } - - $tokens[$nextIndex] = new Token([T_WHITESPACE, '' === $newContent ? ' ' : $newContent]); - - return; - } - - if (!$this->isCommentLastLineToken($tokens, $index + 1)) { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - } - - /** - * Check if last item of current line is a comment. - * - * @param Tokens $tokens tokens to handle - * @param int $index index of token - * - * @return bool - */ - private function isCommentLastLineToken(Tokens $tokens, $index) - { - if (!$tokens[$index]->isComment() || !$tokens[$index + 1]->isWhitespace()) { - return false; - } - - $content = $tokens[$index + 1]->getContent(); - - return $content !== ltrim($content, "\r\n"); - } - - /** - * Checks if token is new line. - * - * @return bool - */ - private function isNewline(Token $token) - { - return $token->isWhitespace() && false !== strpos($token->getContent(), "\n"); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php deleted file mode 100644 index e118e06..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php +++ /dev/null @@ -1,424 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Andreas Möller - * @author SpacePossum - */ -final class NativeFunctionInvocationFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @internal - */ - const SET_ALL = '@all'; - - /** - * Subset of SET_INTERNAL. - * - * Change function call to functions known to be optimized by the Zend engine. - * For details: - * - @see https://github.com/php/php-src/blob/php-7.2.6/Zend/zend_compile.c "zend_try_compile_special_func" - * - @see https://github.com/php/php-src/blob/php-7.2.6/ext/opcache/Optimizer/pass1_5.c - * - * @internal - */ - const SET_COMPILER_OPTIMIZED = '@compiler_optimized'; - - /** - * @internal - */ - const SET_INTERNAL = '@internal'; - - /** - * @var callable - */ - private $functionFilter; - - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->functionFilter = $this->getFunctionFilter(); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Add leading `\` before function invocation to speed up resolving.', - [ - new CodeSample( - ' [ - 'json_encode', - ], - ] - ), - new CodeSample( - ' 'all'] - ), - new CodeSample( - ' 'namespaced'] - ), - new CodeSample( - ' ['myGlobalFunction']] - ), - new CodeSample( - ' ['@all']] - ), - new CodeSample( - ' ['@internal']] - ), - new CodeSample( - ' ['@compiler_optimized']] - ), - ], - null, - 'Risky when any of the functions are overridden.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before GlobalNamespaceImportFixer. - * Must run after StrictParamFixer. - */ - public function getPriority() - { - return 10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - if ('all' === $this->configuration['scope']) { - $this->fixFunctionCalls($tokens, $this->functionFilter, 0, \count($tokens) - 1, false); - - return; - } - - $namespaces = (new NamespacesAnalyzer())->getDeclarations($tokens); - - // 'scope' is 'namespaced' here - /** @var NamespaceAnalysis $namespace */ - foreach (array_reverse($namespaces) as $namespace) { - $this->fixFunctionCalls($tokens, $this->functionFilter, $namespace->getScopeStartIndex(), $namespace->getScopeEndIndex(), '' === $namespace->getFullName()); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('exclude', 'List of functions to ignore.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function (array $value) { - foreach ($value as $functionName) { - if (!\is_string($functionName) || '' === trim($functionName) || trim($functionName) !== $functionName) { - throw new InvalidOptionsException(sprintf( - 'Each element must be a non-empty, trimmed string, got "%s" instead.', - \is_object($functionName) ? \get_class($functionName) : \gettype($functionName) - )); - } - } - - return true; - }]) - ->setDefault([]) - ->getOption(), - (new FixerOptionBuilder('include', 'List of function names or sets to fix. Defined sets are `@internal` (all native functions), `@all` (all global functions) and `@compiler_optimized` (functions that are specially optimized by Zend).')) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function (array $value) { - foreach ($value as $functionName) { - if (!\is_string($functionName) || '' === trim($functionName) || trim($functionName) !== $functionName) { - throw new InvalidOptionsException(sprintf( - 'Each element must be a non-empty, trimmed string, got "%s" instead.', - \is_object($functionName) ? \get_class($functionName) : \gettype($functionName) - )); - } - - $sets = [ - self::SET_ALL, - self::SET_INTERNAL, - self::SET_COMPILER_OPTIMIZED, - ]; - - if ('@' === $functionName[0] && !\in_array($functionName, $sets, true)) { - throw new InvalidOptionsException(sprintf('Unknown set "%s", known sets are "%s".', $functionName, implode('", "', $sets))); - } - } - - return true; - }]) - ->setDefault([self::SET_INTERNAL]) - ->getOption(), - (new FixerOptionBuilder('scope', 'Only fix function calls that are made within a namespace or fix all.')) - ->setAllowedValues(['all', 'namespaced']) - ->setDefault('all') - ->getOption(), - (new FixerOptionBuilder('strict', 'Whether leading `\` of function call not meant to have it should be removed.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) // @TODO: 3.0 change to true as default - ->getOption(), - ]); - } - - /** - * @param int $start - * @param int $end - * @param bool $tryToRemove - */ - private function fixFunctionCalls(Tokens $tokens, callable $functionFilter, $start, $end, $tryToRemove) - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - $insertAtIndexes = []; - for ($index = $start; $index < $end; ++$index) { - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - if (!$functionFilter($tokens[$index]->getContent()) || $tryToRemove) { - if (!$this->configuration['strict']) { - continue; - } - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $tokens->clearTokenAndMergeSurroundingWhitespace($prevIndex); - } - - continue; - } - - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - continue; // do not bother if previous token is already namespace separator - } - - $insertAtIndexes[] = $index; - } - - foreach (array_reverse($insertAtIndexes) as $index) { - $tokens->insertAt($index, new Token([T_NS_SEPARATOR, '\\'])); - } - } - - /** - * @return callable - */ - private function getFunctionFilter() - { - $exclude = $this->normalizeFunctionNames($this->configuration['exclude']); - - if (\in_array(self::SET_ALL, $this->configuration['include'], true)) { - if (\count($exclude) > 0) { - return static function ($functionName) use ($exclude) { - return !isset($exclude[strtolower($functionName)]); - }; - } - - return static function () { - return true; - }; - } - - $include = []; - if (\in_array(self::SET_INTERNAL, $this->configuration['include'], true)) { - $include = $this->getAllInternalFunctionsNormalized(); - } elseif (\in_array(self::SET_COMPILER_OPTIMIZED, $this->configuration['include'], true)) { - $include = $this->getAllCompilerOptimizedFunctionsNormalized(); // if `@internal` is set all compiler optimized function are already loaded - } - - foreach ($this->configuration['include'] as $additional) { - if ('@' !== $additional[0]) { - $include[strtolower($additional)] = true; - } - } - - if (\count($exclude) > 0) { - return static function ($functionName) use ($include, $exclude) { - return isset($include[strtolower($functionName)]) && !isset($exclude[strtolower($functionName)]); - }; - } - - return static function ($functionName) use ($include) { - return isset($include[strtolower($functionName)]); - }; - } - - /** - * @return array normalized function names of which the PHP compiler optimizes - */ - private function getAllCompilerOptimizedFunctionsNormalized() - { - return $this->normalizeFunctionNames([ - // @see https://github.com/php/php-src/blob/PHP-7.4/Zend/zend_compile.c "zend_try_compile_special_func" - 'array_key_exists', - 'array_slice', - 'assert', - 'boolval', - 'call_user_func', - 'call_user_func_array', - 'chr', - 'count', - 'defined', - 'doubleval', - 'floatval', - 'func_get_args', - 'func_num_args', - 'get_called_class', - 'get_class', - 'gettype', - 'in_array', - 'intval', - 'is_array', - 'is_bool', - 'is_double', - 'is_float', - 'is_int', - 'is_integer', - 'is_long', - 'is_null', - 'is_object', - 'is_real', - 'is_resource', - 'is_string', - 'ord', - 'strlen', - 'strval', - // @see https://github.com/php/php-src/blob/php-7.2.6/ext/opcache/Optimizer/pass1_5.c - 'constant', - 'define', - 'dirname', - 'extension_loaded', - 'function_exists', - 'is_callable', - ]); - } - - /** - * @return array normalized function names of all internal defined functions - */ - private function getAllInternalFunctionsNormalized() - { - return $this->normalizeFunctionNames(get_defined_functions()['internal']); - } - - /** - * @param string[] $functionNames - * - * @return array all function names lower cased - */ - private function normalizeFunctionNames(array $functionNames) - { - foreach ($functionNames as $index => $functionName) { - $functionNames[strtolower($functionName)] = true; - unset($functionNames[$index]); - } - - return $functionNames; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php deleted file mode 100644 index 5890cf2..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php +++ /dev/null @@ -1,184 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶4.6. - * - * @author Varga Bence - * @author Dariusz Rumiński - */ -final class NoSpacesAfterFunctionNameFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'When making a method or function call, there MUST NOT be a space between the method or function name and the opening parenthesis.', - [new CodeSample("isAnyTokenKindsFound(array_merge($this->getFunctionyTokenKinds(), [T_STRING])); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $functionyTokens = $this->getFunctionyTokenKinds(); - $languageConstructionTokens = $this->getLanguageConstructionTokenKinds(); - $braceTypes = $this->getBraceAfterVariableKinds(); - - foreach ($tokens as $index => $token) { - // looking for start brace - if (!$token->equals('(')) { - continue; - } - - // last non-whitespace token, can never be `null` always at least PHP open tag before it - $lastTokenIndex = $tokens->getPrevNonWhitespace($index); - - // check for ternary operator - $endParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - $nextNonWhiteSpace = $tokens->getNextMeaningfulToken($endParenthesisIndex); - if ( - null !== $nextNonWhiteSpace - && $tokens[$nextNonWhiteSpace]->equals('?') - && $tokens[$lastTokenIndex]->isGivenKind($languageConstructionTokens) - ) { - continue; - } - - // check if it is a function call - if ($tokens[$lastTokenIndex]->isGivenKind($functionyTokens)) { - $this->fixFunctionCall($tokens, $index); - } elseif ($tokens[$lastTokenIndex]->isGivenKind(T_STRING)) { // for real function calls or definitions - $possibleDefinitionIndex = $tokens->getPrevMeaningfulToken($lastTokenIndex); - if (!$tokens[$possibleDefinitionIndex]->isGivenKind(T_FUNCTION)) { - $this->fixFunctionCall($tokens, $index); - } - } elseif ($tokens[$lastTokenIndex]->equalsAny($braceTypes)) { - $block = Tokens::detectBlockType($tokens[$lastTokenIndex]); - if ( - Tokens::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE === $block['type'] - || Tokens::BLOCK_TYPE_DYNAMIC_VAR_BRACE === $block['type'] - || Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE === $block['type'] - || Tokens::BLOCK_TYPE_PARENTHESIS_BRACE === $block['type'] - ) { - $this->fixFunctionCall($tokens, $index); - } - } - } - } - - /** - * Fixes whitespaces around braces of a function(y) call. - * - * @param Tokens $tokens tokens to handle - * @param int $index index of token - */ - private function fixFunctionCall(Tokens $tokens, $index) - { - // remove space before opening brace - if ($tokens[$index - 1]->isWhitespace()) { - $tokens->clearAt($index - 1); - } - } - - /** - * @return array - */ - private function getBraceAfterVariableKinds() - { - static $tokens = [ - ')', - ']', - [CT::T_DYNAMIC_VAR_BRACE_CLOSE], - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - ]; - - return $tokens; - } - - /** - * Gets the token kinds which can work as function calls. - * - * @return int[] Token names - */ - private function getFunctionyTokenKinds() - { - static $tokens = [ - T_ARRAY, - T_ECHO, - T_EMPTY, - T_EVAL, - T_EXIT, - T_INCLUDE, - T_INCLUDE_ONCE, - T_ISSET, - T_LIST, - T_PRINT, - T_REQUIRE, - T_REQUIRE_ONCE, - T_UNSET, - T_VARIABLE, - ]; - - return $tokens; - } - - /** - * Gets the token kinds of actually language construction. - * - * @return int[] - */ - private function getLanguageConstructionTokenKinds() - { - static $languageConstructionTokens = [ - T_ECHO, - T_PRINT, - T_INCLUDE, - T_INCLUDE_ONCE, - T_REQUIRE, - T_REQUIRE_ONCE, - ]; - - return $languageConstructionTokens; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php deleted file mode 100644 index 0ee4f2e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php +++ /dev/null @@ -1,218 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Mark Scherer - * @author Lucas Manzke - * @author Gregor Harlan - */ -final class NoUnreachableDefaultArgumentValueFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'In function arguments there must not be arguments with default values before non-default ones.', - [ - new CodeSample( - '= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($i = 0, $l = $tokens->count(); $i < $l; ++$i) { - if ( - !$tokens[$i]->isGivenKind(T_FUNCTION) - && (\PHP_VERSION_ID < 70400 || !$tokens[$i]->isGivenKind(T_FN)) - ) { - continue; - } - - $startIndex = $tokens->getNextTokenOfKind($i, ['(']); - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - - $this->fixFunctionDefinition($tokens, $startIndex, $i); - } - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function fixFunctionDefinition(Tokens $tokens, $startIndex, $endIndex) - { - $lastArgumentIndex = $this->getLastNonDefaultArgumentIndex($tokens, $startIndex, $endIndex); - - if (!$lastArgumentIndex) { - return; - } - - for ($i = $lastArgumentIndex; $i > $startIndex; --$i) { - $token = $tokens[$i]; - - if ($token->isGivenKind(T_VARIABLE)) { - $lastArgumentIndex = $i; - - continue; - } - - if (!$token->equals('=') || $this->isNonNullableTypehintedNullableVariable($tokens, $i)) { - continue; - } - - $endIndex = $tokens->getPrevTokenOfKind($lastArgumentIndex, [',']); - $endIndex = $tokens->getPrevMeaningfulToken($endIndex); - $this->removeDefaultArgument($tokens, $i, $endIndex); - } - } - - /** - * @param int $startIndex - * @param int $endIndex - * - * @return null|int - */ - private function getLastNonDefaultArgumentIndex(Tokens $tokens, $startIndex, $endIndex) - { - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - $token = $tokens[$i]; - - if ($token->equals('=')) { - $i = $tokens->getPrevMeaningfulToken($i); - - continue; - } - - if ($token->isGivenKind(T_VARIABLE) && !$this->isEllipsis($tokens, $i)) { - return $i; - } - } - - return null; - } - - /** - * @param int $variableIndex - * - * @return bool - */ - private function isEllipsis(Tokens $tokens, $variableIndex) - { - return $tokens[$tokens->getPrevMeaningfulToken($variableIndex)]->isGivenKind(T_ELLIPSIS); - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function removeDefaultArgument(Tokens $tokens, $startIndex, $endIndex) - { - for ($i = $startIndex; $i <= $endIndex;) { - $tokens->clearTokenAndMergeSurroundingWhitespace($i); - $this->clearWhitespacesBeforeIndex($tokens, $i); - $i = $tokens->getNextMeaningfulToken($i); - } - } - - /** - * @param int $index Index of "=" - * - * @return bool - */ - private function isNonNullableTypehintedNullableVariable(Tokens $tokens, $index) - { - $nextToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - - if (!$nextToken->equals([T_STRING, 'null'], false)) { - return false; - } - - $variableIndex = $tokens->getPrevMeaningfulToken($index); - - $searchTokens = [',', '(', [T_STRING], [CT::T_ARRAY_TYPEHINT], [T_CALLABLE]]; - $typehintKinds = [T_STRING, CT::T_ARRAY_TYPEHINT, T_CALLABLE]; - - $prevIndex = $tokens->getPrevTokenOfKind($variableIndex, $searchTokens); - - if (!$tokens[$prevIndex]->isGivenKind($typehintKinds)) { - return false; - } - - return !$tokens[$tokens->getPrevMeaningfulToken($prevIndex)]->isGivenKind(CT::T_NULLABLE_TYPE); - } - - /** - * @param int $index - */ - private function clearWhitespacesBeforeIndex(Tokens $tokens, $index) - { - $prevIndex = $tokens->getNonEmptySibling($index, -1); - if (!$tokens[$prevIndex]->isWhitespace()) { - return; - } - - $prevNonWhiteIndex = $tokens->getPrevNonWhitespace($prevIndex); - if (null === $prevNonWhiteIndex || !$tokens[$prevNonWhiteIndex]->isComment()) { - $tokens->clearTokenAndMergeSurroundingWhitespace($prevIndex); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php deleted file mode 100644 index 4599c8a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php +++ /dev/null @@ -1,151 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\ArgumentAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author HypeMC - */ -final class NullableTypeDeclarationForDefaultNullValueFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Adds or removes `?` before type declarations for parameters with a default `null` value.', - [ - new VersionSpecificCodeSample( - " false] - ), - ], - 'Rule is applied only in a PHP 7.1+ environment.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - if (\PHP_VERSION_ID < 70100) { - return false; - } - - if (!$tokens->isTokenKindFound(T_VARIABLE)) { - return false; - } - - if (\PHP_VERSION_ID >= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - * - * Must run before NoUnreachableDefaultArgumentValueFixer. - */ - public function getPriority() - { - return 1; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('use_nullable_type_declaration', 'Whether to add or remove `?` before type declarations for parameters with a default `null` value.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - $tokenKinds = [T_FUNCTION]; - if (\PHP_VERSION_ID >= 70400) { - $tokenKinds[] = T_FN; - } - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind($tokenKinds)) { - continue; - } - - $arguments = $functionsAnalyzer->getFunctionArguments($tokens, $index); - - $this->fixFunctionParameters($tokens, $arguments); - } - } - - /** - * @param ArgumentAnalysis[] $arguments - */ - private function fixFunctionParameters(Tokens $tokens, array $arguments) - { - foreach (array_reverse($arguments) as $argumentInfo) { - // If the parameter doesn't have a type declaration or a default value null we can continue - if ( - !$argumentInfo->hasTypeAnalysis() - || !$argumentInfo->hasDefault() - || 'null' !== strtolower($argumentInfo->getDefault()) - ) { - continue; - } - - $argumentTypeInfo = $argumentInfo->getTypeAnalysis(); - if (true === $this->configuration['use_nullable_type_declaration']) { - if (!$argumentTypeInfo->isNullable()) { - $tokens->insertAt($argumentTypeInfo->getStartIndex(), new Token([CT::T_NULLABLE_TYPE, '?'])); - } - } else { - if ($argumentTypeInfo->isNullable()) { - $tokens->removeTrailingWhitespace($argumentTypeInfo->getStartIndex()); - $tokens->clearTokenAndMergeSurroundingWhitespace($argumentTypeInfo->getStartIndex()); - } - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php deleted file mode 100644 index ad6c04d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php +++ /dev/null @@ -1,420 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jan Gantzert - */ -final class PhpdocToParamTypeFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** @internal */ - const CLASS_REGEX = '/^\\\\?[a-zA-Z_\\x7f-\\xff](?:\\\\?[a-zA-Z0-9_\\x7f-\\xff]+)*(?\[\])*$/'; - - /** @internal */ - const MINIMUM_PHP_VERSION = 70000; - - /** - * @var array{int, string}[] - */ - private $blacklistFuncNames = [ - [T_STRING, '__clone'], - [T_STRING, '__destruct'], - ]; - - /** - * @var array - */ - private $skippedTypes = [ - 'mixed' => true, - 'resource' => true, - 'static' => true, - 'void' => true, - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'EXPERIMENTAL: Takes `@param` annotations of non-mixed types and adjusts accordingly the function signature. Requires PHP >= 7.0.', - [ - new VersionSpecificCodeSample( - '= self::MINIMUM_PHP_VERSION && $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - * - * Must run before NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer. - * Must run after CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority() - { - return 8; - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('scalar_types', 'Fix also scalar types; may have unexpected behaviour due to PHP bad type coercion system.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; 0 < $index; --$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - $funcName = $tokens->getNextMeaningfulToken($index); - if ($tokens[$funcName]->equalsAny($this->blacklistFuncNames, false)) { - continue; - } - - $paramTypeAnnotations = $this->findParamAnnotations($tokens, $index); - - foreach ($paramTypeAnnotations as $paramTypeAnnotation) { - if (\PHP_VERSION_ID < self::MINIMUM_PHP_VERSION) { - continue; - } - - $types = array_values($paramTypeAnnotation->getTypes()); - $paramType = current($types); - - if (isset($this->skippedTypes[$paramType])) { - continue; - } - - $hasIterable = false; - $hasNull = false; - $hasArray = false; - $hasString = false; - $hasInt = false; - $hasFloat = false; - $hasBool = false; - $hasCallable = false; - $hasObject = false; - $minimumTokenPhpVersion = self::MINIMUM_PHP_VERSION; - - foreach ($types as $key => $type) { - if (1 !== Preg::match(self::CLASS_REGEX, $type, $matches)) { - continue; - } - - if (isset($matches['array'])) { - $hasArray = true; - unset($types[$key]); - } - - if ('iterable' === $type) { - $hasIterable = true; - unset($types[$key]); - $minimumTokenPhpVersion = 70100; - } - - if ('null' === $type) { - $hasNull = true; - unset($types[$key]); - $minimumTokenPhpVersion = 70100; - } - - if ('string' === $type) { - $hasString = true; - unset($types[$key]); - } - - if ('int' === $type) { - $hasInt = true; - unset($types[$key]); - } - - if ('float' === $type) { - $hasFloat = true; - unset($types[$key]); - } - - if ('bool' === $type) { - $hasBool = true; - unset($types[$key]); - } - - if ('callable' === $type) { - $hasCallable = true; - unset($types[$key]); - } - - if ('array' === $type) { - $hasArray = true; - unset($types[$key]); - } - - if ('object' === $type) { - $hasObject = true; - unset($types[$key]); - $minimumTokenPhpVersion = 70200; - } - } - - if (\PHP_VERSION_ID < $minimumTokenPhpVersion) { - continue; - } - - $typesCount = \count($types); - - if (1 < $typesCount) { - continue; - } - - if (0 === $typesCount) { - $paramType = ''; - } elseif (1 === $typesCount) { - $paramType = array_shift($types); - } - - $startIndex = $tokens->getNextTokenOfKind($index, ['(']) + 1; - $variableIndex = $this->findCorrectVariable($tokens, $startIndex - 1, $paramTypeAnnotation); - - if (null === $variableIndex) { - continue; - } - - $byRefIndex = $tokens->getPrevMeaningfulToken($variableIndex); - if ($tokens[$byRefIndex]->equals('&')) { - $variableIndex = $byRefIndex; - } - - if (!('(' === $tokens[$variableIndex - 1]->getContent()) && $this->hasParamTypeHint($tokens, $variableIndex - 2)) { - continue; - } - - $this->fixFunctionDefinition( - $paramType, - $tokens, - $variableIndex, - $hasNull, - $hasArray, - $hasIterable, - $hasString, - $hasInt, - $hasFloat, - $hasBool, - $hasCallable, - $hasObject - ); - } - } - } - - /** - * Find all the param annotations in the function's PHPDoc comment. - * - * @param int $index The index of the function token - * - * @return Annotation[] - */ - private function findParamAnnotations(Tokens $tokens, $index) - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([ - T_COMMENT, - T_ABSTRACT, - T_FINAL, - T_PRIVATE, - T_PROTECTED, - T_PUBLIC, - T_STATIC, - ])); - - if (!$tokens[$index]->isGivenKind(T_DOC_COMMENT)) { - return []; - } - - $doc = new DocBlock($tokens[$index]->getContent()); - - return $doc->getAnnotationsOfType('param'); - } - - /** - * @param int $index - * @param Annotation $paramTypeAnnotation - * - * @return null|int - */ - private function findCorrectVariable(Tokens $tokens, $index, $paramTypeAnnotation) - { - $nextFunction = $tokens->getNextTokenOfKind($index, [[T_FUNCTION]]); - $variableIndex = $tokens->getNextTokenOfKind($index, [[T_VARIABLE]]); - - if (\is_int($nextFunction) && $variableIndex > $nextFunction) { - return null; - } - - if (!isset($tokens[$variableIndex])) { - return null; - } - - $variableToken = $tokens[$variableIndex]->getContent(); - Preg::match('/@param\s*[^\s!<]+\s*([^\s]+)/', $paramTypeAnnotation->getContent(), $paramVariable); - if (isset($paramVariable[1]) && $paramVariable[1] === $variableToken) { - return $variableIndex; - } - - return $this->findCorrectVariable($tokens, $index + 1, $paramTypeAnnotation); - } - - /** - * Determine whether the function already has a param type hint. - * - * @param int $index The index of the end of the function definition line, EG at { or ; - * - * @return bool - */ - private function hasParamTypeHint(Tokens $tokens, $index) - { - return $tokens[$index]->isGivenKind([T_STRING, T_NS_SEPARATOR, CT::T_ARRAY_TYPEHINT, T_CALLABLE, CT::T_NULLABLE_TYPE]); - } - - /** - * @param string $paramType - * @param int $index The index of the end of the function definition line, EG at { or ; - * @param bool $hasNull - * @param bool $hasArray - * @param bool $hasIterable - * @param bool $hasString - * @param bool $hasInt - * @param bool $hasFloat - * @param bool $hasBool - * @param bool $hasCallable - * @param bool $hasObject - */ - private function fixFunctionDefinition( - $paramType, - Tokens $tokens, - $index, - $hasNull, - $hasArray, - $hasIterable, - $hasString, - $hasInt, - $hasFloat, - $hasBool, - $hasCallable, - $hasObject - ) { - $newTokens = []; - - if (true === $hasIterable && true === $hasArray) { - $newTokens[] = new Token([CT::T_ARRAY_TYPEHINT, 'array']); - } elseif (true === $hasIterable) { - $newTokens[] = new Token([T_STRING, 'iterable']); - } elseif (true === $hasArray) { - $newTokens[] = new Token([CT::T_ARRAY_TYPEHINT, 'array']); - } elseif (true === $hasString) { - $newTokens[] = new Token([T_STRING, 'string']); - } elseif (true === $hasInt) { - $newTokens[] = new Token([T_STRING, 'int']); - } elseif (true === $hasFloat) { - $newTokens[] = new Token([T_STRING, 'float']); - } elseif (true === $hasBool) { - $newTokens[] = new Token([T_STRING, 'bool']); - } elseif (true === $hasCallable) { - $newTokens[] = new Token([T_CALLABLE, 'callable']); - } elseif (true === $hasObject) { - $newTokens[] = new Token([T_STRING, 'object']); - } - - if ('' !== $paramType && [] !== $newTokens) { - return; - } - - foreach (explode('\\', $paramType) as $nsIndex => $value) { - if (0 === $nsIndex && '' === $value) { - continue; - } - - if (0 < $nsIndex) { - $newTokens[] = new Token([T_NS_SEPARATOR, '\\']); - } - $newTokens[] = new Token([T_STRING, $value]); - } - - if (true === $hasNull) { - array_unshift($newTokens, new Token([CT::T_NULLABLE_TYPE, '?'])); - } - - $newTokens[] = new Token([T_WHITESPACE, ' ']); - $tokens->insertAt($index, $newTokens); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php deleted file mode 100644 index 2c9665e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php +++ /dev/null @@ -1,378 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class PhpdocToReturnTypeFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @var array> - */ - private $excludeFuncNames = [ - [T_STRING, '__construct'], - [T_STRING, '__destruct'], - [T_STRING, '__clone'], - ]; - - /** - * @var array - */ - private $versionSpecificTypes = [ - 'void' => 70100, - 'iterable' => 70100, - 'object' => 70200, - ]; - - /** - * @var array - */ - private $scalarTypes = [ - 'bool' => 'bool', - 'true' => 'bool', - 'false' => 'bool', - 'float' => 'float', - 'int' => 'int', - 'string' => 'string', - ]; - - /** - * @var array - */ - private $skippedTypes = [ - 'mixed' => true, - 'resource' => true, - 'null' => true, - ]; - - /** - * @var string - */ - private $classRegex = '/^\\\\?[a-zA-Z_\\x7f-\\xff](?:\\\\?[a-zA-Z0-9_\\x7f-\\xff]+)*(?\[\])*$/'; - - /** - * @var array - */ - private $returnTypeCache = []; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'EXPERIMENTAL: Takes `@return` annotation of non-mixed types and adjusts accordingly the function signature. Requires PHP >= 7.0.', - [ - new VersionSpecificCodeSample( - ' false] - ), - ], - null, - 'This rule is EXPERIMENTAL and [1] is not covered with backward compatibility promise. [2] `@return` annotation is mandatory for the fixer to make changes, signatures of methods without it (no docblock, inheritdocs) will not be fixed. [3] Manual actions are required if inherited signatures are not properly documented. [4] `@inheritdocs` support is under construction.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - if (\PHP_VERSION_ID >= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return \PHP_VERSION_ID >= 70000 && $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - * - * Must run before FullyQualifiedStrictTypesFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer, ReturnTypeDeclarationFixer. - * Must run after CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer, PhpdocTypesFixer. - */ - public function getPriority() - { - return 13; - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('scalar_types', 'Fix also scalar types; may have unexpected behaviour due to PHP bad type coercion system.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; 0 < $index; --$index) { - if ( - !$tokens[$index]->isGivenKind(T_FUNCTION) - && (\PHP_VERSION_ID < 70400 || !$tokens[$index]->isGivenKind(T_FN)) - ) { - continue; - } - - $funcName = $tokens->getNextMeaningfulToken($index); - if ($tokens[$funcName]->equalsAny($this->excludeFuncNames, false)) { - continue; - } - - $returnTypeAnnotation = $this->findReturnAnnotations($tokens, $index); - if (1 !== \count($returnTypeAnnotation)) { - continue; - } - - $returnTypeAnnotation = current($returnTypeAnnotation); - $types = array_values($returnTypeAnnotation->getTypes()); - $typesCount = \count($types); - - if (1 > $typesCount || 2 < $typesCount) { - continue; - } - - $isNullable = false; - $returnType = current($types); - - if (2 === $typesCount) { - $null = $types[0]; - $returnType = $types[1]; - if ('null' !== $null) { - $null = $types[1]; - $returnType = $types[0]; - } - - if ('null' !== $null) { - continue; - } - - $isNullable = true; - - if (\PHP_VERSION_ID < 70100) { - continue; - } - - if ('void' === $returnType) { - continue; - } - } - - if ('static' === $returnType) { - $returnType = 'self'; - } - - if (isset($this->skippedTypes[$returnType])) { - continue; - } - - if (isset($this->versionSpecificTypes[$returnType]) && \PHP_VERSION_ID < $this->versionSpecificTypes[$returnType]) { - continue; - } - - if (isset($this->scalarTypes[$returnType])) { - if (false === $this->configuration['scalar_types']) { - continue; - } - - $returnType = $this->scalarTypes[$returnType]; - } else { - if (1 !== Preg::match($this->classRegex, $returnType, $matches)) { - continue; - } - - if (isset($matches['array'])) { - $returnType = 'array'; - } - } - - $startIndex = $tokens->getNextTokenOfKind($index, ['{', ';']); - - if ($this->hasReturnTypeHint($tokens, $startIndex)) { - continue; - } - - if (!$this->isValidType($returnType)) { - continue; - } - - $this->fixFunctionDefinition($tokens, $startIndex, $isNullable, $returnType); - } - } - - /** - * Determine whether the function already has a return type hint. - * - * @param int $index The index of the end of the function definition line, EG at { or ; - * - * @return bool - */ - private function hasReturnTypeHint(Tokens $tokens, $index) - { - $endFuncIndex = $tokens->getPrevTokenOfKind($index, [')']); - $nextIndex = $tokens->getNextMeaningfulToken($endFuncIndex); - - return $tokens[$nextIndex]->isGivenKind(CT::T_TYPE_COLON); - } - - /** - * @param int $index The index of the end of the function definition line, EG at { or ; - * @param bool $isNullable - * @param string $returnType - */ - private function fixFunctionDefinition(Tokens $tokens, $index, $isNullable, $returnType) - { - static $specialTypes = [ - 'array' => [CT::T_ARRAY_TYPEHINT, 'array'], - 'callable' => [T_CALLABLE, 'callable'], - ]; - $newTokens = [ - new Token([CT::T_TYPE_COLON, ':']), - new Token([T_WHITESPACE, ' ']), - ]; - if (true === $isNullable) { - $newTokens[] = new Token([CT::T_NULLABLE_TYPE, '?']); - } - - if (isset($specialTypes[$returnType])) { - $newTokens[] = new Token($specialTypes[$returnType]); - } else { - foreach (explode('\\', $returnType) as $nsIndex => $value) { - if (0 === $nsIndex && '' === $value) { - continue; - } - - if (0 < $nsIndex) { - $newTokens[] = new Token([T_NS_SEPARATOR, '\\']); - } - $newTokens[] = new Token([T_STRING, $value]); - } - } - - $endFuncIndex = $tokens->getPrevTokenOfKind($index, [')']); - $tokens->insertAt($endFuncIndex + 1, $newTokens); - } - - /** - * Find all the return annotations in the function's PHPDoc comment. - * - * @param int $index The index of the function token - * - * @return Annotation[] - */ - private function findReturnAnnotations(Tokens $tokens, $index) - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([ - T_COMMENT, - T_ABSTRACT, - T_FINAL, - T_PRIVATE, - T_PROTECTED, - T_PUBLIC, - T_STATIC, - ])); - - if (!$tokens[$index]->isGivenKind(T_DOC_COMMENT)) { - return []; - } - - $doc = new DocBlock($tokens[$index]->getContent()); - - return $doc->getAnnotationsOfType('return'); - } - - /** - * @param string $returnType - * - * @return bool - */ - private function isValidType($returnType) - { - if (!\array_key_exists($returnType, $this->returnTypeCache)) { - try { - Tokens::fromCode(sprintf('returnTypeCache[$returnType] = true; - } catch (\ParseError $e) { - $this->returnTypeCache[$returnType] = false; - } - } - - return $this->returnTypeCache[$returnType]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php deleted file mode 100644 index 78340a4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php +++ /dev/null @@ -1,133 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class ReturnTypeDeclarationFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - $versionSpecification = new VersionSpecification(70000); - - return new FixerDefinition( - 'There should be one or no space before colon, and one space after it in return type declarations, according to configuration.', - [ - new VersionSpecificCodeSample( - " 'none'] - ), - new VersionSpecificCodeSample( - " 'one'] - ), - ], - 'Rule is applied only in a PHP 7+ environment.' - ); - } - - /** - * {@inheritdoc} - * - * Must run after PhpdocToReturnTypeFixer, VoidReturnFixer. - */ - public function getPriority() - { - return -17; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return \PHP_VERSION_ID >= 70000 && $tokens->isTokenKindFound(CT::T_TYPE_COLON); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $oneSpaceBefore = 'one' === $this->configuration['space_before']; - - for ($index = 0, $limit = $tokens->count(); $index < $limit; ++$index) { - if (!$tokens[$index]->isGivenKind(CT::T_TYPE_COLON)) { - continue; - } - - $previousIndex = $index - 1; - $previousToken = $tokens[$previousIndex]; - - if ($previousToken->isWhitespace()) { - if (!$tokens[$tokens->getPrevNonWhitespace($index - 1)]->isComment()) { - if ($oneSpaceBefore) { - $tokens[$previousIndex] = new Token([T_WHITESPACE, ' ']); - } else { - $tokens->clearAt($previousIndex); - } - } - } elseif ($oneSpaceBefore) { - $tokenWasAdded = $tokens->ensureWhitespaceAtIndex($index, 0, ' '); - - if ($tokenWasAdded) { - ++$limit; - } - - ++$index; - } - - ++$index; - - $tokenWasAdded = $tokens->ensureWhitespaceAtIndex($index, 0, ' '); - - if ($tokenWasAdded) { - ++$limit; - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('space_before', 'Spacing to apply before colon.')) - ->setAllowedValues(['one', 'none']) - ->setDefault('none') - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/SingleLineThrowFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/SingleLineThrowFixer.php deleted file mode 100644 index 31350a6..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/SingleLineThrowFixer.php +++ /dev/null @@ -1,149 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - */ -final class SingleLineThrowFixer extends AbstractFixer -{ - /** - * @internal - */ - const REMOVE_WHITESPACE_AFTER_TOKENS = ['[']; - - /** - * @internal - */ - const REMOVE_WHITESPACE_AROUND_TOKENS = ['(', [T_OBJECT_OPERATOR], [T_DOUBLE_COLON]]; - - /** - * @internal - */ - const REMOVE_WHITESPACE_BEFORE_TOKENS = [')', ']', ',', ';']; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Throwing exception must be done in single line.', - [ - new CodeSample("isTokenKindFound(T_THROW); - } - - /** - * {@inheritdoc} - * - * Must run before ConcatSpaceFixer. - */ - public function getPriority() - { - // must be fun before ConcatSpaceFixer - return 1; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - if (!$tokens[$index]->isGivenKind(T_THROW)) { - continue; - } - - /** @var int $openingBraceCandidateIndex */ - $openingBraceCandidateIndex = $tokens->getNextTokenOfKind($index, [';', '(']); - - while ($tokens[$openingBraceCandidateIndex]->equals('(')) { - /** @var int $closingBraceIndex */ - $closingBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openingBraceCandidateIndex); - /** @var int $openingBraceCandidateIndex */ - $openingBraceCandidateIndex = $tokens->getNextTokenOfKind($closingBraceIndex, [';', '(']); - } - - $this->trimNewLines($tokens, $index, $openingBraceCandidateIndex); - } - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function trimNewLines(Tokens $tokens, $startIndex, $endIndex) - { - for ($index = $startIndex; $index < $endIndex; ++$index) { - $content = $tokens[$index]->getContent(); - - if ($tokens[$index]->isGivenKind(T_COMMENT)) { - if (0 === strpos($content, '//')) { - $content = '/*'.substr($content, 2).' */'; - $tokens->clearAt($index + 1); - } elseif (0 === strpos($content, '#')) { - $content = '/*'.substr($content, 1).' */'; - $tokens->clearAt($index + 1); - } elseif (false !== Preg::match('/\R/', $content)) { - $content = Preg::replace('/\R/', ' ', $content); - } - $tokens[$index] = new Token([T_COMMENT, $content]); - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_WHITESPACE)) { - continue; - } - - if (0 === Preg::match('/\R/', $content)) { - continue; - } - - $prevIndex = $tokens->getNonEmptySibling($index, -1); - if ($tokens[$prevIndex]->equalsAny(array_merge(self::REMOVE_WHITESPACE_AFTER_TOKENS, self::REMOVE_WHITESPACE_AROUND_TOKENS))) { - $tokens->clearAt($index); - - continue; - } - - $nextIndex = $tokens->getNonEmptySibling($index, 1); - if ($tokens[$nextIndex]->equalsAny(array_merge(self::REMOVE_WHITESPACE_AROUND_TOKENS, self::REMOVE_WHITESPACE_BEFORE_TOKENS))) { - if (!$tokens[$prevIndex]->isGivenKind(T_FUNCTION)) { - $tokens->clearAt($index); - - continue; - } - } - - $tokens[$index] = new Token([T_WHITESPACE, ' ']); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/StaticLambdaFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/StaticLambdaFixer.php deleted file mode 100644 index f2da248..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/StaticLambdaFixer.php +++ /dev/null @@ -1,149 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author SpacePossum - */ -final class StaticLambdaFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Lambdas not (indirect) referencing `$this` must be declared `static`.', - [new CodeSample("bindTo` on lambdas without referencing to `$this`.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - if (\PHP_VERSION_ID >= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $analyzer = new TokensAnalyzer($tokens); - - $expectedFunctionKinds = [T_FUNCTION]; - if (\PHP_VERSION_ID >= 70400) { - $expectedFunctionKinds[] = T_FN; - } - - for ($index = $tokens->count() - 4; $index > 0; --$index) { - if (!$tokens[$index]->isGivenKind($expectedFunctionKinds) || !$analyzer->isLambda($index)) { - continue; - } - - $prev = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prev]->isGivenKind(T_STATIC)) { - continue; // lambda is already 'static' - } - - $argumentsStartIndex = $tokens->getNextTokenOfKind($index, ['(']); - $argumentsEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $argumentsStartIndex); - - // figure out where the lambda starts ... - $lambdaOpenIndex = $tokens->getNextTokenOfKind($argumentsEndIndex, ['{', [T_DOUBLE_ARROW]]); - - // ... and where it ends - if ($tokens[$lambdaOpenIndex]->isGivenKind(T_DOUBLE_ARROW)) { - $lambdaEndIndex = $tokens->getNextTokenOfKind($lambdaOpenIndex, [';']); - } else { - $lambdaEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $lambdaOpenIndex); - } - - if ($this->hasPossibleReferenceToThis($tokens, $lambdaOpenIndex, $lambdaEndIndex)) { - continue; - } - - // make the lambda static - $tokens->insertAt( - $index, - [ - new Token([T_STATIC, 'static']), - new Token([T_WHITESPACE, ' ']), - ] - ); - - $index -= 4; // fixed after a lambda, closes candidate is at least 4 tokens before that - } - } - - /** - * Returns 'true' if there is a possible reference to '$this' within the given tokens index range. - * - * @param int $startIndex - * @param int $endIndex - * - * @return bool - */ - private function hasPossibleReferenceToThis(Tokens $tokens, $startIndex, $endIndex) - { - for ($i = $startIndex; $i < $endIndex; ++$i) { - if ($tokens[$i]->isGivenKind(T_VARIABLE) && '$this' === strtolower($tokens[$i]->getContent())) { - return true; // directly accessing '$this' - } - - if ($tokens[$i]->isGivenKind([ - T_INCLUDE, // loading additional symbols we cannot analyze here - T_INCLUDE_ONCE, // " - T_REQUIRE, // " - T_REQUIRE_ONCE, // " - CT::T_DYNAMIC_VAR_BRACE_OPEN, // "$h = ${$g};" case - T_EVAL, // "$c = eval('return $this;');" case - ])) { - return true; - } - - if ($tokens[$i]->equals('$')) { - $nextIndex = $tokens->getNextMeaningfulToken($i); - if ($tokens[$nextIndex]->isGivenKind(T_VARIABLE)) { - return true; // "$$a" case - } - } - } - - return false; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php deleted file mode 100644 index 7f6107e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php +++ /dev/null @@ -1,259 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Mark Nielsen - */ -final class VoidReturnFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Add `void` return type to functions with missing or empty return statements, but priority is given to `@return` annotations. Requires PHP >= 7.1.', - [ - new VersionSpecificCodeSample( - "= 70100 && $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - // These cause syntax errors. - static $excludeFuncNames = [ - [T_STRING, '__construct'], - [T_STRING, '__destruct'], - [T_STRING, '__clone'], - ]; - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - $funcName = $tokens->getNextMeaningfulToken($index); - if ($tokens[$funcName]->equalsAny($excludeFuncNames, false)) { - continue; - } - - $startIndex = $tokens->getNextTokenOfKind($index, ['{', ';']); - - if ($this->hasReturnTypeHint($tokens, $startIndex)) { - continue; - } - - if ($tokens[$startIndex]->equals(';')) { - // No function body defined, fallback to PHPDoc. - if ($this->hasVoidReturnAnnotation($tokens, $index)) { - $this->fixFunctionDefinition($tokens, $startIndex); - } - - continue; - } - - if ($this->hasReturnAnnotation($tokens, $index)) { - continue; - } - - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $startIndex); - - if ($this->hasVoidReturn($tokens, $startIndex, $endIndex)) { - $this->fixFunctionDefinition($tokens, $startIndex); - } - } - } - - /** - * Determine whether there is a non-void return annotation in the function's PHPDoc comment. - * - * @param int $index The index of the function token - * - * @return bool - */ - private function hasReturnAnnotation(Tokens $tokens, $index) - { - foreach ($this->findReturnAnnotations($tokens, $index) as $return) { - if (['void'] !== $return->getTypes()) { - return true; - } - } - - return false; - } - - /** - * Determine whether there is a void return annotation in the function's PHPDoc comment. - * - * @param int $index The index of the function token - * - * @return bool - */ - private function hasVoidReturnAnnotation(Tokens $tokens, $index) - { - foreach ($this->findReturnAnnotations($tokens, $index) as $return) { - if (['void'] === $return->getTypes()) { - return true; - } - } - - return false; - } - - /** - * Determine whether the function already has a return type hint. - * - * @param int $index The index of the end of the function definition line, EG at { or ; - * - * @return bool - */ - private function hasReturnTypeHint(Tokens $tokens, $index) - { - $endFuncIndex = $tokens->getPrevTokenOfKind($index, [')']); - $nextIndex = $tokens->getNextMeaningfulToken($endFuncIndex); - - return $tokens[$nextIndex]->isGivenKind(CT::T_TYPE_COLON); - } - - /** - * Determine whether the function has a void return. - * - * @param int $startIndex Start of function body - * @param int $endIndex End of function body - * - * @return bool - */ - private function hasVoidReturn(Tokens $tokens, $startIndex, $endIndex) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($i = $startIndex; $i < $endIndex; ++$i) { - if ( - // skip anonymous classes - ($tokens[$i]->isGivenKind(T_CLASS) && $tokensAnalyzer->isAnonymousClass($i)) || - // skip lambda functions - ($tokens[$i]->isGivenKind(T_FUNCTION) && $tokensAnalyzer->isLambda($i)) - ) { - $i = $tokens->getNextTokenOfKind($i, ['{']); - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $i); - - continue; - } - - if ($tokens[$i]->isGivenKind([T_YIELD, T_YIELD_FROM])) { - return false; // Generators cannot return void. - } - - if (!$tokens[$i]->isGivenKind(T_RETURN)) { - continue; - } - - $i = $tokens->getNextMeaningfulToken($i); - if (!$tokens[$i]->equals(';')) { - return false; - } - } - - return true; - } - - /** - * @param int $index The index of the end of the function definition line, EG at { or ; - */ - private function fixFunctionDefinition(Tokens $tokens, $index) - { - $endFuncIndex = $tokens->getPrevTokenOfKind($index, [')']); - $tokens->insertAt($endFuncIndex + 1, [ - new Token([CT::T_TYPE_COLON, ':']), - new Token([T_WHITESPACE, ' ']), - new Token([T_STRING, 'void']), - ]); - } - - /** - * Find all the return annotations in the function's PHPDoc comment. - * - * @param int $index The index of the function token - * - * @return Annotation[] - */ - private function findReturnAnnotations(Tokens $tokens, $index) - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([ - T_ABSTRACT, - T_FINAL, - T_PRIVATE, - T_PROTECTED, - T_PUBLIC, - T_STATIC, - ])); - - if (!$tokens[$index]->isGivenKind(T_DOC_COMMENT)) { - return []; - } - - $doc = new DocBlock($tokens[$index]->getContent()); - - return $doc->getAnnotationsOfType('return'); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php deleted file mode 100644 index 56206f7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php +++ /dev/null @@ -1,178 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\TypeAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Generator\NamespacedStringTokenGenerator; -use PhpCsFixer\Tokenizer\Resolver\TypeShortNameResolver; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author VeeWee - */ -final class FullyQualifiedStrictTypesFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Transforms imported FQCN parameters and return types in function arguments to short version.', - [ - new CodeSample( - 'isTokenKindFound(T_FUNCTION) && ( - \count((new NamespacesAnalyzer())->getDeclarations($tokens)) || - \count((new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens)) - ); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $lastIndex = $tokens->count() - 1; - for ($index = $lastIndex; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - // Return types are only available since PHP 7.0 - $this->fixFunctionReturnType($tokens, $index); - $this->fixFunctionArguments($tokens, $index); - } - } - - /** - * @param int $index - */ - private function fixFunctionArguments(Tokens $tokens, $index) - { - $arguments = (new FunctionsAnalyzer())->getFunctionArguments($tokens, $index); - - foreach ($arguments as $argument) { - if (!$argument->hasTypeAnalysis()) { - continue; - } - - $this->detectAndReplaceTypeWithShortType($tokens, $argument->getTypeAnalysis()); - } - } - - /** - * @param int $index - */ - private function fixFunctionReturnType(Tokens $tokens, $index) - { - if (\PHP_VERSION_ID < 70000) { - return; - } - - $returnType = (new FunctionsAnalyzer())->getFunctionReturnType($tokens, $index); - if (!$returnType) { - return; - } - - $this->detectAndReplaceTypeWithShortType($tokens, $returnType); - } - - private function detectAndReplaceTypeWithShortType( - Tokens $tokens, - TypeAnalysis $type - ) { - if ($type->isReservedType()) { - return; - } - - $typeName = $type->getName(); - - if (0 !== strpos($typeName, '\\')) { - return; - } - - $shortType = (new TypeShortNameResolver())->resolve($tokens, $typeName); - if ($shortType === $typeName) { - return; - } - - $shortType = (new NamespacedStringTokenGenerator())->generate($shortType); - - if (true === $type->isNullable()) { - array_unshift($shortType, new Token([CT::T_NULLABLE_TYPE, '?'])); - } - - $tokens->overrideRange( - $type->getStartIndex(), - $type->getEndIndex(), - $shortType - ); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php deleted file mode 100644 index 2a0fe44..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php +++ /dev/null @@ -1,751 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\ClassyAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gregor Harlan - */ -final class GlobalNamespaceImportFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Imports or fully qualifies global classes/functions/constants.', - [ - new CodeSample( - ' true, 'import_constants' => true, 'import_functions' => true] - ), - new CodeSample( - ' false, 'import_constants' => false, 'import_functions' => false] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoUnusedImportsFixer, OrderedImportsFixer. - * Must run after NativeConstantInvocationFixer, NativeFunctionInvocationFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound([T_DOC_COMMENT, T_NS_SEPARATOR, T_USE]) - && $tokens->isTokenKindFound(T_NAMESPACE) - && (Tokens::isLegacyMode() || 1 === $tokens->countTokenKind(T_NAMESPACE)) - && $tokens->isMonolithicPhp(); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $namespaceAnalyses = (new NamespacesAnalyzer())->getDeclarations($tokens); - - if (1 !== \count($namespaceAnalyses) || '' === $namespaceAnalyses[0]->getFullName()) { - return; - } - - $useDeclarations = (new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens); - - $newImports = []; - - if (true === $this->configuration['import_constants']) { - $newImports['const'] = $this->importConstants($tokens, $useDeclarations); - } elseif (false === $this->configuration['import_constants']) { - $this->fullyQualifyConstants($tokens, $useDeclarations); - } - - if (true === $this->configuration['import_functions']) { - $newImports['function'] = $this->importFunctions($tokens, $useDeclarations); - } elseif (false === $this->configuration['import_functions']) { - $this->fullyQualifyFunctions($tokens, $useDeclarations); - } - - if (true === $this->configuration['import_classes']) { - $newImports['class'] = $this->importClasses($tokens, $useDeclarations); - } elseif (false === $this->configuration['import_classes']) { - $this->fullyQualifyClasses($tokens, $useDeclarations); - } - - $newImports = array_filter($newImports); - - if ($newImports) { - $this->insertImports($tokens, $newImports, $useDeclarations); - } - } - - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('import_constants', 'Whether to import, not import or ignore global constants.')) - ->setDefault(null) - ->setAllowedValues([true, false, null]) - ->getOption(), - (new FixerOptionBuilder('import_functions', 'Whether to import, not import or ignore global functions.')) - ->setDefault(null) - ->setAllowedValues([true, false, null]) - ->getOption(), - (new FixerOptionBuilder('import_classes', 'Whether to import, not import or ignore global classes.')) - ->setDefault(true) - ->setAllowedValues([true, false, null]) - ->getOption(), - ]); - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - * - * @return array - */ - private function importConstants(Tokens $tokens, array $useDeclarations) - { - list($global, $other) = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isConstant(); - }, true); - - // find namespaced const declarations (`const FOO = 1`) - // and add them to the not importable names (already used) - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - $token = $tokens[$index]; - - if ($token->isClassy()) { - $index = $tokens->getNextTokenOfKind($index, ['{']); - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if (!$token->isGivenKind(T_CONST)) { - continue; - } - - $index = $tokens->getNextMeaningfulToken($index); - $other[$tokens[$index]->getContent()] = true; - } - - $analyzer = new TokensAnalyzer($tokens); - - $indexes = []; - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - $name = $token->getContent(); - - if (isset($other[$name])) { - continue; - } - - if (!$analyzer->isConstantInvocation($index)) { - continue; - } - - $nsSeparatorIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$nsSeparatorIndex]->isGivenKind(T_NS_SEPARATOR)) { - if (!isset($global[$name])) { - // found an unqualified constant invocation - // add it to the not importable names (already used) - $other[$name] = true; - } - - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($nsSeparatorIndex); - if ($tokens[$prevIndex]->isGivenKind([CT::T_NAMESPACE_OPERATOR, T_STRING])) { - continue; - } - - $indexes[] = $index; - } - - return $this->prepareImports($tokens, $indexes, $global, $other, true); - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - * - * @return array - */ - private function importFunctions(Tokens $tokens, array $useDeclarations) - { - list($global, $other) = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isFunction(); - }, false); - - // find function declarations - // and add them to the not importable names (already used) - foreach ($this->findFunctionDeclarations($tokens, 0, $tokens->count() - 1) as $name) { - $other[strtolower($name)] = true; - } - - $analyzer = new FunctionsAnalyzer(); - - $indexes = []; - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - $name = strtolower($token->getContent()); - - if (isset($other[$name])) { - continue; - } - - if (!$analyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $nsSeparatorIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$nsSeparatorIndex]->isGivenKind(T_NS_SEPARATOR)) { - if (!isset($global[$name])) { - $other[$name] = true; - } - - continue; - } - - $indexes[] = $index; - } - - return $this->prepareImports($tokens, $indexes, $global, $other, false); - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - * - * @return array - */ - private function importClasses(Tokens $tokens, array $useDeclarations) - { - list($global, $other) = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isClass(); - }, false); - - /** @var DocBlock[] $docBlocks */ - $docBlocks = []; - - // find class declarations and class usages in docblocks - // and add them to the not importable names (already used) - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_DOC_COMMENT)) { - $docBlocks[$index] = new DocBlock($token->getContent()); - - $this->traverseDocBlockTypes($docBlocks[$index], static function ($type) use ($global, &$other) { - if (false !== strpos($type, '\\')) { - return; - } - - $name = strtolower($type); - - if (!isset($global[$name])) { - $other[$name] = true; - } - }); - } - - if (!$token->isClassy()) { - continue; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(T_STRING)) { - $other[strtolower($tokens[$index]->getContent())] = true; - } - } - - $analyzer = new ClassyAnalyzer(); - - $indexes = []; - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - $name = strtolower($token->getContent()); - - if (isset($other[$name])) { - continue; - } - - if (!$analyzer->isClassyInvocation($tokens, $index)) { - continue; - } - - $nsSeparatorIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$nsSeparatorIndex]->isGivenKind(T_NS_SEPARATOR)) { - if (!isset($global[$name])) { - $other[$name] = true; - } - - continue; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($nsSeparatorIndex)]->isGivenKind([CT::T_NAMESPACE_OPERATOR, T_STRING])) { - continue; - } - - $indexes[] = $index; - } - - $imports = []; - - foreach ($docBlocks as $index => $docBlock) { - $changed = $this->traverseDocBlockTypes($docBlock, static function ($type) use ($global, $other, &$imports) { - if ('\\' !== $type[0]) { - return $type; - } - - $name = substr($type, 1); - $checkName = strtolower($name); - - if (false !== strpos($checkName, '\\') || isset($other[$checkName])) { - return $type; - } - - if (isset($global[$checkName])) { - return \is_string($global[$checkName]) ? $global[$checkName] : $name; - } - - $imports[$checkName] = $name; - - return $name; - }); - - if ($changed) { - $tokens[$index] = new Token([T_DOC_COMMENT, $docBlock->getContent()]); - } - } - - return $imports + $this->prepareImports($tokens, $indexes, $global, $other, false); - } - - /** - * Removes the leading slash at the given indexes (when the name is not already used). - * - * @param int[] $indexes - * @param bool $caseSensitive - * - * @return array array keys contain the names that must be imported - */ - private function prepareImports(Tokens $tokens, array $indexes, array $global, array $other, $caseSensitive) - { - $imports = []; - - foreach ($indexes as $index) { - $name = $tokens[$index]->getContent(); - $checkName = $caseSensitive ? $name : strtolower($name); - - if (isset($other[$checkName])) { - continue; - } - - if (!isset($global[$checkName])) { - $imports[$checkName] = $name; - } elseif (\is_string($global[$checkName])) { - $tokens[$index] = new Token([T_STRING, $global[$checkName]]); - } - - $tokens->clearAt($tokens->getPrevMeaningfulToken($index)); - } - - return $imports; - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - */ - private function insertImports(Tokens $tokens, array $imports, array $useDeclarations) - { - if ($useDeclarations) { - $useDeclaration = end($useDeclarations); - $index = $useDeclaration->getEndIndex() + 1; - } else { - $namespace = (new NamespacesAnalyzer())->getDeclarations($tokens)[0]; - $index = $namespace->getEndIndex() + 1; - } - - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - if (!$tokens[$index]->isWhitespace() || false === strpos($tokens[$index]->getContent(), "\n")) { - $tokens->insertAt($index, new Token([T_WHITESPACE, $lineEnding])); - } - - foreach ($imports as $type => $typeImports) { - foreach ($typeImports as $name) { - $items = [ - new Token([T_WHITESPACE, $lineEnding]), - new Token([T_USE, 'use']), - new Token([T_WHITESPACE, ' ']), - ]; - - if ('const' === $type) { - $items[] = new Token([CT::T_CONST_IMPORT, 'const']); - $items[] = new Token([T_WHITESPACE, ' ']); - } elseif ('function' === $type) { - $items[] = new Token([CT::T_FUNCTION_IMPORT, 'function']); - $items[] = new Token([T_WHITESPACE, ' ']); - } - - $items[] = new Token([T_STRING, $name]); - $items[] = new Token(';'); - - $tokens->insertAt($index, $items); - } - } - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - */ - private function fullyQualifyConstants(Tokens $tokens, array $useDeclarations) - { - if (!$tokens->isTokenKindFound(CT::T_CONST_IMPORT)) { - return; - } - - list($global) = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isConstant() && !$declaration->isAliased(); - }, true); - - if (!$global) { - return; - } - - $analyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - if (!isset($global[$token->getContent()])) { - continue; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_NS_SEPARATOR)) { - continue; - } - - if (!$analyzer->isConstantInvocation($index)) { - continue; - } - - $tokens->insertAt($index, new Token([T_NS_SEPARATOR, '\\'])); - } - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - */ - private function fullyQualifyFunctions(Tokens $tokens, array $useDeclarations) - { - if (!$tokens->isTokenKindFound(CT::T_FUNCTION_IMPORT)) { - return; - } - - list($global) = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isFunction() && !$declaration->isAliased(); - }, false); - - if (!$global) { - return; - } - - $analyzer = new FunctionsAnalyzer(); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - if (!isset($global[strtolower($token->getContent())])) { - continue; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_NS_SEPARATOR)) { - continue; - } - - if (!$analyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $tokens->insertAt($index, new Token([T_NS_SEPARATOR, '\\'])); - } - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - */ - private function fullyQualifyClasses(Tokens $tokens, array $useDeclarations) - { - if (!$tokens->isTokenKindFound(T_USE)) { - return; - } - - list($global) = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isClass() && !$declaration->isAliased(); - }, false); - - if (!$global) { - return; - } - - $analyzer = new ClassyAnalyzer(); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_DOC_COMMENT)) { - $doc = new DocBlock($token->getContent()); - - $changed = $this->traverseDocBlockTypes($doc, static function ($type) use ($global) { - if (!isset($global[strtolower($type)])) { - return $type; - } - - return '\\'.$type; - }); - - if ($changed) { - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - - continue; - } - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - if (!isset($global[strtolower($token->getContent())])) { - continue; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_NS_SEPARATOR)) { - continue; - } - - if (!$analyzer->isClassyInvocation($tokens, $index)) { - continue; - } - - $tokens->insertAt($index, new Token([T_NS_SEPARATOR, '\\'])); - } - } - - /** - * @param NamespaceUseAnalysis[] $declarations - * @param bool $caseSensitive - * - * @return array - */ - private function filterUseDeclarations(array $declarations, callable $callback, $caseSensitive) - { - $global = []; - $other = []; - - foreach ($declarations as $declaration) { - if (!$callback($declaration)) { - continue; - } - - $fullName = ltrim($declaration->getFullName(), '\\'); - - if (false !== strpos($fullName, '\\')) { - $name = $caseSensitive ? $declaration->getShortName() : strtolower($declaration->getShortName()); - $other[$name] = true; - - continue; - } - - $checkName = $caseSensitive ? $fullName : strtolower($fullName); - $alias = $declaration->getShortName(); - $global[$checkName] = $alias === $fullName ? true : $alias; - } - - return [$global, $other]; - } - - private function findFunctionDeclarations(Tokens $tokens, $start, $end) - { - for ($index = $start; $index <= $end; ++$index) { - $token = $tokens[$index]; - - if ($token->isClassy()) { - $classStart = $tokens->getNextTokenOfKind($index, ['{']); - $classEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classStart); - - for ($index = $classStart; $index <= $classEnd; ++$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - $methodStart = $tokens->getNextTokenOfKind($index, ['{', ';']); - - if ($tokens[$methodStart]->equals(';')) { - $index = $methodStart; - - continue; - } - - $methodEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $methodStart); - - foreach ($this->findFunctionDeclarations($tokens, $methodStart, $methodEnd) as $function) { - yield $function; - } - - $index = $methodEnd; - } - - continue; - } - - if (!$token->isGivenKind(T_FUNCTION)) { - continue; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(CT::T_RETURN_REF)) { - $index = $tokens->getNextMeaningfulToken($index); - } - - if ($tokens[$index]->isGivenKind(T_STRING)) { - yield $tokens[$index]->getContent(); - } - } - } - - private function traverseDocBlockTypes(DocBlock $doc, callable $callback) - { - $annotations = $doc->getAnnotationsOfType(Annotation::getTagsWithTypes()); - - if (!$annotations) { - return false; - } - - $changed = false; - - foreach ($annotations as $annotation) { - $types = $new = $annotation->getTypes(); - - foreach ($types as $i => $fullType) { - $newFullType = $fullType; - - Preg::matchAll('/[\\\\\w]+/', $fullType, $matches, PREG_OFFSET_CAPTURE); - - foreach (array_reverse($matches[0]) as list($type, $offset)) { - $newType = $callback($type); - - if (null !== $newType && $type !== $newType) { - $newFullType = substr_replace($newFullType, $newType, $offset, \strlen($type)); - } - } - - $new[$i] = $newFullType; - } - - if ($types !== $new) { - $annotation->setTypes($new); - $changed = true; - } - } - - return $changed; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoLeadingImportSlashFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoLeadingImportSlashFixer.php deleted file mode 100644 index a668ffa..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoLeadingImportSlashFixer.php +++ /dev/null @@ -1,99 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Carlos Cirello - */ -final class NoLeadingImportSlashFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Remove leading slashes in `use` clauses.', - [new CodeSample("isTokenKindFound(T_USE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $usesIndexes = $tokensAnalyzer->getImportUseIndexes(); - - foreach ($usesIndexes as $idx) { - $nextTokenIdx = $tokens->getNextMeaningfulToken($idx); - $nextToken = $tokens[$nextTokenIdx]; - - if ($nextToken->isGivenKind(T_NS_SEPARATOR)) { - $this->removeLeadingImportSlash($tokens, $nextTokenIdx); - } elseif ($nextToken->isGivenKind([CT::T_FUNCTION_IMPORT, CT::T_CONST_IMPORT])) { - $nextTokenIdx = $tokens->getNextMeaningfulToken($nextTokenIdx); - if ($tokens[$nextTokenIdx]->isGivenKind(T_NS_SEPARATOR)) { - $this->removeLeadingImportSlash($tokens, $nextTokenIdx); - } - } - } - } - - /** - * @param int $index - */ - private function removeLeadingImportSlash(Tokens $tokens, $index) - { - $previousIndex = $tokens->getPrevNonWhitespace($index); - - if ( - $previousIndex < $index - 1 - || $tokens[$previousIndex]->isComment() - ) { - $tokens->clearAt($index); - - return; - } - - $tokens[$index] = new Token([T_WHITESPACE, ' ']); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php deleted file mode 100644 index 52c81a2..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php +++ /dev/null @@ -1,277 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class NoUnusedImportsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Unused `use` statements must be removed.', - [new CodeSample("isTokenKindFound(T_USE); - } - - /** - * {@inheritdoc} - */ - public function supports(\SplFileInfo $file) - { - $path = $file->getPathname(); - - /* - * @deprecated this exception will be removed on 3.0 - * some fixtures are auto-generated by Symfony and may contain unused use statements - */ - if (false !== strpos($path, \DIRECTORY_SEPARATOR.'Fixtures'.\DIRECTORY_SEPARATOR) - && false === strpos($path, \DIRECTORY_SEPARATOR.'tests'.\DIRECTORY_SEPARATOR.'Fixtures'.\DIRECTORY_SEPARATOR) - ) { - return false; - } - - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $useDeclarations = (new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens); - - if (0 === \count($useDeclarations)) { - return; - } - - foreach ((new NamespacesAnalyzer())->getDeclarations($tokens) as $namespace) { - $currentNamespaceUseDeclarations = array_filter( - $useDeclarations, - static function (NamespaceUseAnalysis $useDeclaration) use ($namespace) { - return - $useDeclaration->getStartIndex() >= $namespace->getScopeStartIndex() - && $useDeclaration->getEndIndex() <= $namespace->getScopeEndIndex() - ; - } - ); - - $usagesSearchIgnoredIndexes = []; - - foreach ($currentNamespaceUseDeclarations as $useDeclaration) { - $usagesSearchIgnoredIndexes[$useDeclaration->getStartIndex()] = $useDeclaration->getEndIndex(); - } - - foreach ($currentNamespaceUseDeclarations as $useDeclaration) { - if (!$this->isImportUsed($tokens, $namespace, $usagesSearchIgnoredIndexes, $useDeclaration->getShortName())) { - $this->removeUseDeclaration($tokens, $useDeclaration); - } - } - - $this->removeUsesInSameNamespace($tokens, $currentNamespaceUseDeclarations, $namespace); - } - } - - /** - * @param array $ignoredIndexes - * @param string $shortName - * - * @return bool - */ - private function isImportUsed(Tokens $tokens, NamespaceAnalysis $namespace, array $ignoredIndexes, $shortName) - { - $namespaceEndIndex = $namespace->getScopeEndIndex(); - for ($index = $namespace->getScopeStartIndex(); $index <= $namespaceEndIndex; ++$index) { - if (isset($ignoredIndexes[$index])) { - $index = $ignoredIndexes[$index]; - - continue; - } - - $token = $tokens[$index]; - - if ($token->isGivenKind(T_STRING)) { - $prevMeaningfulToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - - if ($prevMeaningfulToken->isGivenKind(T_NAMESPACE)) { - $index = $tokens->getNextTokenOfKind($index, [';', '{', [T_CLOSE_TAG]]); - - continue; - } - - if ( - 0 === strcasecmp($shortName, $token->getContent()) - && !$prevMeaningfulToken->isGivenKind([T_NS_SEPARATOR, T_CONST, T_OBJECT_OPERATOR, T_DOUBLE_COLON]) - ) { - return true; - } - - continue; - } - - if ($token->isComment() - && Preg::match( - '/(?getContent() - ) - ) { - return true; - } - } - - return false; - } - - private function removeUseDeclaration(Tokens $tokens, NamespaceUseAnalysis $useDeclaration) - { - for ($index = $useDeclaration->getEndIndex() - 1; $index >= $useDeclaration->getStartIndex(); --$index) { - if ($tokens[$index]->isComment()) { - continue; - } - - if (!$tokens[$index]->isWhitespace() || false === strpos($tokens[$index]->getContent(), "\n")) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - continue; - } - - // when multi line white space keep the line feed if the previous token is a comment - $prevIndex = $tokens->getPrevNonWhitespace($index); - if ($tokens[$prevIndex]->isComment()) { - $content = $tokens[$index]->getContent(); - $tokens[$index] = new Token([T_WHITESPACE, substr($content, strrpos($content, "\n"))]); // preserve indent only - } else { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - } - - if ($tokens[$useDeclaration->getEndIndex()]->equals(';')) { // do not remove `? >` - $tokens->clearAt($useDeclaration->getEndIndex()); - } - - // remove white space above and below where the `use` statement was - - $prevIndex = $useDeclaration->getStartIndex() - 1; - $prevToken = $tokens[$prevIndex]; - - if ($prevToken->isWhitespace()) { - $content = rtrim($prevToken->getContent(), " \t"); - - if ('' === $content) { - $tokens->clearAt($prevIndex); - } else { - $tokens[$prevIndex] = new Token([T_WHITESPACE, $content]); - } - - $prevToken = $tokens[$prevIndex]; - } - - if (!isset($tokens[$useDeclaration->getEndIndex() + 1])) { - return; - } - - $nextIndex = $tokens->getNonEmptySibling($useDeclaration->getEndIndex(), 1); - if (null === $nextIndex) { - return; - } - - $nextToken = $tokens[$nextIndex]; - - if ($nextToken->isWhitespace()) { - $content = Preg::replace( - "#^\r\n|^\n#", - '', - ltrim($nextToken->getContent(), " \t"), - 1 - ); - - if ('' !== $content) { - $tokens[$nextIndex] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($nextIndex); - } - - $nextToken = $tokens[$nextIndex]; - } - - if ($prevToken->isWhitespace() && $nextToken->isWhitespace()) { - $content = $prevToken->getContent().$nextToken->getContent(); - - if ('' !== $content) { - $tokens[$nextIndex] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($nextIndex); - } - - $tokens->clearAt($prevIndex); - } - } - - private function removeUsesInSameNamespace(Tokens $tokens, array $useDeclarations, NamespaceAnalysis $namespaceDeclaration) - { - $namespace = $namespaceDeclaration->getFullName(); - $nsLength = \strlen($namespace.'\\'); - - foreach ($useDeclarations as $useDeclaration) { - if ($useDeclaration->isAliased()) { - continue; - } - - $useDeclarationFullName = ltrim($useDeclaration->getFullName(), '\\'); - - if (0 !== strpos($useDeclarationFullName, $namespace.'\\')) { - continue; - } - - $partName = substr($useDeclarationFullName, $nsLength); - - if (false === strpos($partName, '\\')) { - $this->removeUseDeclaration($tokens, $useDeclaration); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php deleted file mode 100644 index 5734aa6..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php +++ /dev/null @@ -1,534 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AliasedFixerOptionBuilder; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Sebastiaan Stok - * @author Dariusz Rumiński - * @author SpacePossum - * @author Darius Matulionis - * @author Adriano Pilger - */ -final class OrderedImportsFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - const IMPORT_TYPE_CLASS = 'class'; - - const IMPORT_TYPE_CONST = 'const'; - - const IMPORT_TYPE_FUNCTION = 'function'; - - const SORT_ALPHA = 'alpha'; - - const SORT_LENGTH = 'length'; - - const SORT_NONE = 'none'; - - /** - * Array of supported sort types in configuration. - * - * @var string[] - */ - private $supportedSortTypes = [self::IMPORT_TYPE_CLASS, self::IMPORT_TYPE_CONST, self::IMPORT_TYPE_FUNCTION]; - - /** - * Array of supported sort algorithms in configuration. - * - * @var string[] - */ - private $supportedSortAlgorithms = [self::SORT_ALPHA, self::SORT_LENGTH, self::SORT_NONE]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Ordering `use` statements.', - [ - new CodeSample(" self::SORT_LENGTH] - ), - new VersionSpecificCodeSample( - " self::SORT_LENGTH, - 'imports_order' => [ - self::IMPORT_TYPE_CONST, - self::IMPORT_TYPE_CLASS, - self::IMPORT_TYPE_FUNCTION, - ], - ] - ), - new VersionSpecificCodeSample( - ' self::SORT_ALPHA, - 'imports_order' => [ - self::IMPORT_TYPE_CONST, - self::IMPORT_TYPE_CLASS, - self::IMPORT_TYPE_FUNCTION, - ], - ] - ), - new VersionSpecificCodeSample( - ' self::SORT_NONE, - 'imports_order' => [ - self::IMPORT_TYPE_CONST, - self::IMPORT_TYPE_CLASS, - self::IMPORT_TYPE_FUNCTION, - ], - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after GlobalNamespaceImportFixer, NoLeadingImportSlashFixer. - */ - public function getPriority() - { - return -30; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_USE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $namespacesImports = $tokensAnalyzer->getImportUseIndexes(true); - - if (0 === \count($namespacesImports)) { - return; - } - - $usesOrder = []; - foreach ($namespacesImports as $uses) { - $usesOrder[] = $this->getNewOrder(array_reverse($uses), $tokens); - } - $usesOrder = array_replace(...$usesOrder); - - $usesOrder = array_reverse($usesOrder, true); - $mapStartToEnd = []; - - foreach ($usesOrder as $use) { - $mapStartToEnd[$use['startIndex']] = $use['endIndex']; - } - - // Now insert the new tokens, starting from the end - foreach ($usesOrder as $index => $use) { - $declarationTokens = Tokens::fromCode( - sprintf( - 'clearRange(0, 2); // clear `clearAt(\count($declarationTokens) - 1); // clear `;` - $declarationTokens->clearEmptyTokens(); - - $tokens->overrideRange($index, $mapStartToEnd[$index], $declarationTokens); - if ($use['group']) { - // a group import must start with `use` and cannot be part of comma separated import list - $prev = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prev]->equals(',')) { - $tokens[$prev] = new Token(';'); - $tokens->insertAt($prev + 1, new Token([T_USE, 'use'])); - - if (!$tokens[$prev + 2]->isWhitespace()) { - $tokens->insertAt($prev + 2, new Token([T_WHITESPACE, ' '])); - } - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $supportedSortTypes = $this->supportedSortTypes; - - return new FixerConfigurationResolver([ - (new AliasedFixerOptionBuilder( - new FixerOptionBuilder('sort_algorithm', 'whether the statements should be sorted alphabetically or by length, or not sorted'), - 'sortAlgorithm' - )) - ->setAllowedValues($this->supportedSortAlgorithms) - ->setDefault(self::SORT_ALPHA) - ->getOption(), - (new AliasedFixerOptionBuilder( - new FixerOptionBuilder('imports_order', 'Defines the order of import types.'), - 'importsOrder' - )) - ->setAllowedTypes(['array', 'null']) - ->setAllowedValues([static function ($value) use ($supportedSortTypes) { - if (null !== $value) { - $missing = array_diff($supportedSortTypes, $value); - if (\count($missing)) { - throw new InvalidOptionsException(sprintf( - 'Missing sort %s "%s".', - 1 === \count($missing) ? 'type' : 'types', - implode('", "', $missing) - )); - } - - $unknown = array_diff($value, $supportedSortTypes); - if (\count($unknown)) { - throw new InvalidOptionsException(sprintf( - 'Unknown sort %s "%s".', - 1 === \count($unknown) ? 'type' : 'types', - implode('", "', $unknown) - )); - } - } - - return true; - }]) - ->setDefault(null) - ->getOption(), - ]); - } - - /** - * This method is used for sorting the uses in a namespace. - * - * @param array $first - * @param array $second - * - * @return int - * - * @internal - */ - private function sortAlphabetically(array $first, array $second) - { - // Replace backslashes by spaces before sorting for correct sort order - $firstNamespace = str_replace('\\', ' ', $this->prepareNamespace($first['namespace'])); - $secondNamespace = str_replace('\\', ' ', $this->prepareNamespace($second['namespace'])); - - return strcasecmp($firstNamespace, $secondNamespace); - } - - /** - * This method is used for sorting the uses statements in a namespace by length. - * - * @param array $first - * @param array $second - * - * @return int - * - * @internal - */ - private function sortByLength(array $first, array $second) - { - $firstNamespace = (self::IMPORT_TYPE_CLASS === $first['importType'] ? '' : $first['importType'].' ').$this->prepareNamespace($first['namespace']); - $secondNamespace = (self::IMPORT_TYPE_CLASS === $second['importType'] ? '' : $second['importType'].' ').$this->prepareNamespace($second['namespace']); - - $firstNamespaceLength = \strlen($firstNamespace); - $secondNamespaceLength = \strlen($secondNamespace); - - if ($firstNamespaceLength === $secondNamespaceLength) { - $sortResult = strcasecmp($firstNamespace, $secondNamespace); - } else { - $sortResult = $firstNamespaceLength > $secondNamespaceLength ? 1 : -1; - } - - return $sortResult; - } - - /** - * @param string $namespace - * - * @return string - */ - private function prepareNamespace($namespace) - { - return trim(Preg::replace('%/\*(.*)\*/%s', '', $namespace)); - } - - /** - * @param int[] $uses - * - * @return array - */ - private function getNewOrder(array $uses, Tokens $tokens) - { - $indexes = []; - $originalIndexes = []; - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - for ($i = \count($uses) - 1; $i >= 0; --$i) { - $index = $uses[$i]; - - $startIndex = $tokens->getTokenNotOfKindSibling($index + 1, 1, [[T_WHITESPACE]]); - $endIndex = $tokens->getNextTokenOfKind($startIndex, [';', [T_CLOSE_TAG]]); - $previous = $tokens->getPrevMeaningfulToken($endIndex); - - $group = $tokens[$previous]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_CLOSE); - if ($tokens[$startIndex]->isGivenKind(CT::T_CONST_IMPORT)) { - $type = self::IMPORT_TYPE_CONST; - $index = $tokens->getNextNonWhitespace($startIndex); - } elseif ($tokens[$startIndex]->isGivenKind(CT::T_FUNCTION_IMPORT)) { - $type = self::IMPORT_TYPE_FUNCTION; - $index = $tokens->getNextNonWhitespace($startIndex); - } else { - $type = self::IMPORT_TYPE_CLASS; - $index = $startIndex; - } - - $namespaceTokens = []; - - while ($index <= $endIndex) { - $token = $tokens[$index]; - - if ($index === $endIndex || (!$group && $token->equals(','))) { - if ($group && self::SORT_NONE !== $this->configuration['sort_algorithm']) { - // if group import, sort the items within the group definition - - // figure out where the list of namespace parts within the group def. starts - $namespaceTokensCount = \count($namespaceTokens) - 1; - $namespace = ''; - for ($k = 0; $k < $namespaceTokensCount; ++$k) { - if ($namespaceTokens[$k]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_OPEN)) { - $namespace .= '{'; - - break; - } - - $namespace .= $namespaceTokens[$k]->getContent(); - } - - // fetch all parts, split up in an array of strings, move comments to the end - $parts = []; - $firstIndent = ''; - $separator = ', '; - $lastIndent = ''; - $hasGroupTrailingComma = false; - - for ($k1 = $k + 1; $k1 < $namespaceTokensCount; ++$k1) { - $comment = ''; - $namespacePart = ''; - for ($k2 = $k1;; ++$k2) { - if ($namespaceTokens[$k2]->equalsAny([',', [CT::T_GROUP_IMPORT_BRACE_CLOSE]])) { - break; - } - - if ($namespaceTokens[$k2]->isComment()) { - $comment .= $namespaceTokens[$k2]->getContent(); - - continue; - } - - // if there is any line ending inside the group import, it should be indented properly - if ( - '' === $firstIndent && - $namespaceTokens[$k2]->isWhitespace() && - false !== strpos($namespaceTokens[$k2]->getContent(), $lineEnding) - ) { - $lastIndent = $lineEnding; - $firstIndent = $lineEnding.$this->whitespacesConfig->getIndent(); - $separator = ','.$firstIndent; - } - - $namespacePart .= $namespaceTokens[$k2]->getContent(); - } - - $namespacePart = trim($namespacePart); - if ('' === $namespacePart) { - $hasGroupTrailingComma = true; - - continue; - } - - $comment = trim($comment); - if ('' !== $comment) { - $namespacePart .= ' '.$comment; - } - - $parts[] = $namespacePart; - - $k1 = $k2; - } - - $sortedParts = $parts; - sort($parts); - - // check if the order needs to be updated, otherwise don't touch as we might change valid CS (to other valid CS). - if ($sortedParts === $parts) { - $namespace = Tokens::fromArray($namespaceTokens)->generateCode(); - } else { - $namespace .= $firstIndent.implode($separator, $parts).($hasGroupTrailingComma ? ',' : '').$lastIndent.'}'; - } - } else { - $namespace = Tokens::fromArray($namespaceTokens)->generateCode(); - } - - $indexes[$startIndex] = [ - 'namespace' => $namespace, - 'startIndex' => $startIndex, - 'endIndex' => $index - 1, - 'importType' => $type, - 'group' => $group, - ]; - - $originalIndexes[] = $startIndex; - - if ($index === $endIndex) { - break; - } - - $namespaceTokens = []; - $nextPartIndex = $tokens->getTokenNotOfKindSibling($index, 1, [[','], [T_WHITESPACE]]); - $startIndex = $nextPartIndex; - $index = $nextPartIndex; - - continue; - } - - $namespaceTokens[] = $token; - ++$index; - } - } - - // Is sort types provided, sorting by groups and each group by algorithm - if (null !== $this->configuration['imports_order']) { - // Grouping indexes by import type. - $groupedByTypes = []; - foreach ($indexes as $startIndex => $item) { - $groupedByTypes[$item['importType']][$startIndex] = $item; - } - - // Sorting each group by algorithm. - foreach ($groupedByTypes as $type => $indexes) { - $groupedByTypes[$type] = $this->sortByAlgorithm($indexes); - } - - // Ordering groups - $sortedGroups = []; - foreach ($this->configuration['imports_order'] as $type) { - if (isset($groupedByTypes[$type]) && !empty($groupedByTypes[$type])) { - foreach ($groupedByTypes[$type] as $startIndex => $item) { - $sortedGroups[$startIndex] = $item; - } - } - } - $indexes = $sortedGroups; - } else { - // Sorting only by algorithm - $indexes = $this->sortByAlgorithm($indexes); - } - - $index = -1; - $usesOrder = []; - - // Loop trough the index but use original index order - foreach ($indexes as $v) { - $usesOrder[$originalIndexes[++$index]] = $v; - } - - return $usesOrder; - } - - /** - * @param array[] $indexes - * - * @return array - */ - private function sortByAlgorithm(array $indexes) - { - if (self::SORT_ALPHA === $this->configuration['sort_algorithm']) { - uasort($indexes, [$this, 'sortAlphabetically']); - } elseif (self::SORT_LENGTH === $this->configuration['sort_algorithm']) { - uasort($indexes, [$this, 'sortByLength']); - } - - return $indexes; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php deleted file mode 100644 index 109a900..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php +++ /dev/null @@ -1,252 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * Fixer for rules defined in PSR2 ¶3. - * - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class SingleImportPerStatementFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There MUST be one use keyword per declaration.', - [new CodeSample("isTokenKindFound(T_USE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $uses = array_reverse($tokensAnalyzer->getImportUseIndexes()); - - foreach ($uses as $index) { - $endIndex = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); - $groupClose = $tokens->getPrevMeaningfulToken($endIndex); - - if ($tokens[$groupClose]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_CLOSE)) { - $this->fixGroupUse($tokens, $index, $endIndex); - } else { - $this->fixMultipleUse($tokens, $index, $endIndex); - } - } - } - - /** - * @param int $index - * - * @return string - */ - private function detectIndent(Tokens $tokens, $index) - { - if (!$tokens[$index - 1]->isWhitespace()) { - return ''; // cannot detect indent - } - - $explodedContent = explode("\n", $tokens[$index - 1]->getContent()); - - return end($explodedContent); - } - - /** - * @param int $index - * - * @return array - */ - private function getGroupDeclaration(Tokens $tokens, $index) - { - $groupPrefix = ''; - $comment = ''; - $groupOpenIndex = null; - for ($i = $index + 1;; ++$i) { - if ($tokens[$i]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_OPEN)) { - $groupOpenIndex = $i; - - break; - } - - if ($tokens[$i]->isComment()) { - $comment .= $tokens[$i]->getContent(); - if (!$tokens[$i - 1]->isWhitespace() && !$tokens[$i + 1]->isWhitespace()) { - $groupPrefix .= ' '; - } - - continue; - } - - if ($tokens[$i]->isWhitespace()) { - $groupPrefix .= ' '; - - continue; - } - - $groupPrefix .= $tokens[$i]->getContent(); - } - - return [ - rtrim($groupPrefix), - $groupOpenIndex, - $tokens->findBlockEnd(Tokens::BLOCK_TYPE_GROUP_IMPORT_BRACE, $groupOpenIndex), - $comment, - ]; - } - - /** - * @param string $groupPrefix - * @param int $groupOpenIndex - * @param int $groupCloseIndex - * @param string $comment - * - * @return string[] - */ - private function getGroupStatements(Tokens $tokens, $groupPrefix, $groupOpenIndex, $groupCloseIndex, $comment) - { - $statements = []; - $statement = $groupPrefix; - - for ($i = $groupOpenIndex + 1; $i <= $groupCloseIndex; ++$i) { - $token = $tokens[$i]; - - if ($token->equals(',') && $tokens[$tokens->getNextMeaningfulToken($i)]->equals([CT::T_GROUP_IMPORT_BRACE_CLOSE])) { - continue; - } - - if ($token->equalsAny([',', [CT::T_GROUP_IMPORT_BRACE_CLOSE]])) { - $statements[] = 'use'.$statement.';'; - $statement = $groupPrefix; - - continue; - } - - if ($token->isWhitespace()) { - $j = $tokens->getNextMeaningfulToken($i); - - if ($tokens[$j]->equals([T_AS])) { - $statement .= ' as '; - $i += 2; - } elseif ($tokens[$j]->equals([T_FUNCTION])) { - $statement = ' function'.$statement; - $i += 2; - } elseif ($tokens[$j]->equals([T_CONST])) { - $statement = ' const'.$statement; - $i += 2; - } - - if ($token->isWhitespace(" \t") || '//' !== substr($tokens[$i - 1]->getContent(), 0, 2)) { - continue; - } - } - - $statement .= $token->getContent(); - } - - if ('' !== $comment) { - $statements[0] .= ' '.$comment; - } - - return $statements; - } - - /** - * @param int $index - * @param int $endIndex - */ - private function fixGroupUse(Tokens $tokens, $index, $endIndex) - { - list($groupPrefix, $groupOpenIndex, $groupCloseIndex, $comment) = $this->getGroupDeclaration($tokens, $index); - $statements = $this->getGroupStatements($tokens, $groupPrefix, $groupOpenIndex, $groupCloseIndex, $comment); - - if (\count($statements) < 2) { - return; - } - - $tokens->clearRange($index, $groupCloseIndex); - if ($tokens[$endIndex]->equals(';')) { - $tokens->clearAt($endIndex); - } - - $ending = $this->whitespacesConfig->getLineEnding(); - $importTokens = Tokens::fromCode('clearAt(0); - $importTokens->clearEmptyTokens(); - - $tokens->insertAt($index, $importTokens); - } - - /** - * @param int $index - * @param int $endIndex - */ - private function fixMultipleUse(Tokens $tokens, $index, $endIndex) - { - $ending = $this->whitespacesConfig->getLineEnding(); - - for ($i = $endIndex - 1; $i > $index; --$i) { - if (!$tokens[$i]->equals(',')) { - continue; - } - - $tokens[$i] = new Token(';'); - $i = $tokens->getNextMeaningfulToken($i); - $tokens->insertAt($i, new Token([T_USE, 'use'])); - $tokens->insertAt($i + 1, new Token([T_WHITESPACE, ' '])); - - $indent = $this->detectIndent($tokens, $index); - if ($tokens[$i - 1]->isWhitespace()) { - $tokens[$i - 1] = new Token([T_WHITESPACE, $ending.$indent]); - - continue; - } - - if (false === strpos($tokens[$i - 1]->getContent(), "\n")) { - $tokens->insertAt($i, new Token([T_WHITESPACE, $ending.$indent])); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleLineAfterImportsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleLineAfterImportsFixer.php deleted file mode 100644 index b32fca3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleLineAfterImportsFixer.php +++ /dev/null @@ -1,158 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use PhpCsFixer\Utils; - -/** - * Fixer for rules defined in PSR2 ¶3. - * - * @author Ceeram - * @author Graham Campbell - */ -final class SingleLineAfterImportsFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_USE); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Each namespace use MUST go on its own line and there MUST be one blank line after the use statements block.', - [ - new CodeSample( - 'whitespacesConfig->getLineEnding(); - $tokensAnalyzer = new TokensAnalyzer($tokens); - - $added = 0; - foreach ($tokensAnalyzer->getImportUseIndexes() as $index) { - $index += $added; - $indent = ''; - - // if previous line ends with comment and current line starts with whitespace, use current indent - if ($tokens[$index - 1]->isWhitespace(" \t") && $tokens[$index - 2]->isGivenKind(T_COMMENT)) { - $indent = $tokens[$index - 1]->getContent(); - } elseif ($tokens[$index - 1]->isWhitespace()) { - $indent = Utils::calculateTrailingWhitespaceIndent($tokens[$index - 1]); - } - - $semicolonIndex = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); // Handle insert index for inline T_COMMENT with whitespace after semicolon - $insertIndex = $semicolonIndex; - - if ($tokens[$semicolonIndex]->isGivenKind(T_CLOSE_TAG)) { - if ($tokens[$insertIndex - 1]->isWhitespace()) { - --$insertIndex; - } - - $tokens->insertAt($insertIndex, new Token(';')); - ++$added; - } - - if ($semicolonIndex === \count($tokens) - 1) { - $tokens->insertAt($insertIndex + 1, new Token([T_WHITESPACE, $ending.$ending.$indent])); - ++$added; - } else { - $newline = $ending; - $tokens[$semicolonIndex]->isGivenKind(T_CLOSE_TAG) ? --$insertIndex : ++$insertIndex; - if ($tokens[$insertIndex]->isWhitespace(" \t") && $tokens[$insertIndex + 1]->isComment()) { - ++$insertIndex; - } - - // Increment insert index for inline T_COMMENT or T_DOC_COMMENT - if ($tokens[$insertIndex]->isComment()) { - ++$insertIndex; - } - - $afterSemicolon = $tokens->getNextMeaningfulToken($semicolonIndex); - if (null === $afterSemicolon || !$tokens[$afterSemicolon]->isGivenKind(T_USE)) { - $newline .= $ending; - } - - if ($tokens[$insertIndex]->isWhitespace()) { - $nextToken = $tokens[$insertIndex]; - if (2 === substr_count($nextToken->getContent(), "\n")) { - continue; - } - $nextMeaningfulAfterUseIndex = $tokens->getNextMeaningfulToken($insertIndex); - if (null !== $nextMeaningfulAfterUseIndex && $tokens[$nextMeaningfulAfterUseIndex]->isGivenKind(T_USE)) { - if (substr_count($nextToken->getContent(), "\n") < 2) { - $tokens[$insertIndex] = new Token([T_WHITESPACE, $newline.$indent.ltrim($nextToken->getContent())]); - } - } else { - $tokens[$insertIndex] = new Token([T_WHITESPACE, $newline.$indent.ltrim($nextToken->getContent())]); - } - } else { - $tokens->insertAt($insertIndex, new Token([T_WHITESPACE, $newline.$indent])); - ++$added; - } - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php deleted file mode 100644 index fa6d7b5..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php +++ /dev/null @@ -1,248 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Sullivan Senechal - */ -final class ClassKeywordRemoveFixer extends AbstractFixer -{ - /** - * @var string[] - */ - private $imports = []; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Converts `::class` keywords to FQCN strings.', - [ - new CodeSample( - 'isTokenKindFound(CT::T_CLASS_CONSTANT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $namespacesAnalyzer = new NamespacesAnalyzer(); - - $previousNamespaceScopeEndIndex = 0; - foreach ($namespacesAnalyzer->getDeclarations($tokens) as $declaration) { - $this->replaceClassKeywordsSection($tokens, '', $previousNamespaceScopeEndIndex, $declaration->getStartIndex()); - $this->replaceClassKeywordsSection($tokens, $declaration->getFullName(), $declaration->getStartIndex(), $declaration->getScopeEndIndex()); - $previousNamespaceScopeEndIndex = $declaration->getScopeEndIndex(); - } - - $this->replaceClassKeywordsSection($tokens, '', $previousNamespaceScopeEndIndex, $tokens->count() - 1); - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function storeImports(Tokens $tokens, $startIndex, $endIndex) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $this->imports = []; - - /** @var int $index */ - foreach ($tokensAnalyzer->getImportUseIndexes() as $index) { - if ($index < $startIndex || $index > $endIndex) { - continue; - } - - $import = ''; - while ($index = $tokens->getNextMeaningfulToken($index)) { - if ($tokens[$index]->equalsAny([';', [CT::T_GROUP_IMPORT_BRACE_OPEN]]) || $tokens[$index]->isGivenKind(T_AS)) { - break; - } - - $import .= $tokens[$index]->getContent(); - } - - // Imports group (PHP 7 spec) - if ($tokens[$index]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_OPEN)) { - $groupEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_GROUP_IMPORT_BRACE, $index); - $groupImports = array_map( - static function ($import) { - return trim($import); - }, - explode(',', $tokens->generatePartialCode($index + 1, $groupEndIndex - 1)) - ); - foreach ($groupImports as $groupImport) { - $groupImportParts = array_map(static function ($import) { - return trim($import); - }, explode(' as ', $groupImport)); - if (2 === \count($groupImportParts)) { - $this->imports[$groupImportParts[1]] = $import.$groupImportParts[0]; - } else { - $this->imports[] = $import.$groupImport; - } - } - } elseif ($tokens[$index]->isGivenKind(T_AS)) { - $aliasIndex = $tokens->getNextMeaningfulToken($index); - $alias = $tokens[$aliasIndex]->getContent(); - $this->imports[$alias] = $import; - } else { - $this->imports[] = $import; - } - } - } - - /** - * @param string $namespace - * @param int $startIndex - * @param int $endIndex - */ - private function replaceClassKeywordsSection(Tokens $tokens, $namespace, $startIndex, $endIndex) - { - if ($endIndex - $startIndex < 3) { - return; - } - - $this->storeImports($tokens, $startIndex, $endIndex); - - $ctClassTokens = $tokens->findGivenKind(CT::T_CLASS_CONSTANT, $startIndex, $endIndex); - foreach (array_reverse(array_keys($ctClassTokens)) as $classIndex) { - $this->replaceClassKeyword($tokens, $namespace, $classIndex); - } - } - - /** - * @param string $namespace - * @param int $classIndex - */ - private function replaceClassKeyword(Tokens $tokens, $namespace, $classIndex) - { - $classEndIndex = $tokens->getPrevMeaningfulToken($classIndex); - $classEndIndex = $tokens->getPrevMeaningfulToken($classEndIndex); - - if ($tokens[$classEndIndex]->equalsAny([[T_STRING, 'self'], [T_STATIC, 'static'], [T_STRING, 'parent']], false)) { - return; - } - - $classBeginIndex = $classEndIndex; - while (true) { - $prev = $tokens->getPrevMeaningfulToken($classBeginIndex); - if (!$tokens[$prev]->isGivenKind([T_NS_SEPARATOR, T_STRING])) { - break; - } - - $classBeginIndex = $prev; - } - - $classString = $tokens->generatePartialCode( - $tokens[$classBeginIndex]->isGivenKind(T_NS_SEPARATOR) - ? $tokens->getNextMeaningfulToken($classBeginIndex) - : $classBeginIndex, - $classEndIndex - ); - - $classImport = false; - foreach ($this->imports as $alias => $import) { - if ($classString === $alias) { - $classImport = $import; - - break; - } - - $classStringArray = explode('\\', $classString); - $namespaceToTest = $classStringArray[0]; - - if (0 === strcmp($namespaceToTest, substr($import, -\strlen($namespaceToTest)))) { - $classImport = $import; - - break; - } - } - - for ($i = $classBeginIndex; $i <= $classIndex; ++$i) { - if (!$tokens[$i]->isComment() && !($tokens[$i]->isWhitespace() && false !== strpos($tokens[$i]->getContent(), "\n"))) { - $tokens->clearAt($i); - } - } - - $tokens->insertAt($classBeginIndex, new Token([ - T_CONSTANT_ENCAPSED_STRING, - "'".$this->makeClassFQN($namespace, $classImport, $classString)."'", - ])); - } - - /** - * @param string $namespace - * @param false|string $classImport - * @param string $classString - * - * @return string - */ - private function makeClassFQN($namespace, $classImport, $classString) - { - if (false === $classImport) { - return ('' !== $namespace ? ($namespace.'\\') : '').$classString; - } - - $classStringArray = explode('\\', $classString); - $classStringLength = \count($classStringArray); - $classImportArray = explode('\\', $classImport); - $classImportLength = \count($classImportArray); - - if (1 === $classStringLength) { - return $classImport; - } - - return implode('\\', array_merge( - \array_slice($classImportArray, 0, $classImportLength - $classStringLength + 1), - $classStringArray - )); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php deleted file mode 100644 index 8f40390..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php +++ /dev/null @@ -1,172 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class CombineConsecutiveIssetsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Using `isset($var) &&` multiple times should be done in one call.', - [new CodeSample("isAllTokenKindsFound([T_ISSET, T_BOOLEAN_AND]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokenCount = $tokens->count(); - - for ($index = 1; $index < $tokenCount; ++$index) { - if (!$tokens[$index]->isGivenKind(T_ISSET) - || !$tokens[$tokens->getPrevMeaningfulToken($index)]->equalsAny(['(', '{', ';', '=', [T_OPEN_TAG], [T_BOOLEAN_AND], [T_BOOLEAN_OR]])) { - continue; - } - - $issetInfo = $this->getIssetInfo($tokens, $index); - $issetCloseBraceIndex = end($issetInfo); // ')' token - $insertLocation = prev($issetInfo) + 1; // one index after the previous meaningful of ')' - - $booleanAndTokenIndex = $tokens->getNextMeaningfulToken($issetCloseBraceIndex); - - while ($tokens[$booleanAndTokenIndex]->isGivenKind(T_BOOLEAN_AND)) { - $issetIndex = $tokens->getNextMeaningfulToken($booleanAndTokenIndex); - if (!$tokens[$issetIndex]->isGivenKind(T_ISSET)) { - $index = $issetIndex; - - break; - } - - // fetch info about the 'isset' statement that we're merging - $nextIssetInfo = $this->getIssetInfo($tokens, $issetIndex); - - $nextMeaningfulTokenIndex = $tokens->getNextMeaningfulToken(end($nextIssetInfo)); - $nextMeaningfulToken = $tokens[$nextMeaningfulTokenIndex]; - - if (!$nextMeaningfulToken->equalsAny([')', '}', ';', [T_CLOSE_TAG], [T_BOOLEAN_AND], [T_BOOLEAN_OR]])) { - $index = $nextMeaningfulTokenIndex; - - break; - } - - // clone what we want to move, do not clone '(' and ')' of the 'isset' statement we're merging - $clones = $this->getTokenClones($tokens, \array_slice($nextIssetInfo, 1, -1)); - - // clean up no the tokens of the 'isset' statement we're merging - $this->clearTokens($tokens, array_merge($nextIssetInfo, [$issetIndex, $booleanAndTokenIndex])); - - // insert the tokens to create the new statement - array_unshift($clones, new Token(','), new Token([T_WHITESPACE, ' '])); - $tokens->insertAt($insertLocation, $clones); - - // correct some counts and offset based on # of tokens inserted - $numberOfTokensInserted = \count($clones); - $tokenCount += $numberOfTokensInserted; - $issetCloseBraceIndex += $numberOfTokensInserted; - $insertLocation += $numberOfTokensInserted; - - $booleanAndTokenIndex = $tokens->getNextMeaningfulToken($issetCloseBraceIndex); - } - } - } - - /** - * @param int[] $indexes - */ - private function clearTokens(Tokens $tokens, array $indexes) - { - foreach ($indexes as $index) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - } - - /** - * @param int $index of T_ISSET - * - * @return int[] indexes of meaningful tokens belonging to the isset statement - */ - private function getIssetInfo(Tokens $tokens, $index) - { - $openIndex = $tokens->getNextMeaningfulToken($index); - - $braceOpenCount = 1; - $meaningfulTokenIndexes = [$openIndex]; - - for ($i = $openIndex + 1;; ++$i) { - if ($tokens[$i]->isWhitespace() || $tokens[$i]->isComment()) { - continue; - } - - $meaningfulTokenIndexes[] = $i; - - if ($tokens[$i]->equals(')')) { - --$braceOpenCount; - if (0 === $braceOpenCount) { - break; - } - } elseif ($tokens[$i]->equals('(')) { - ++$braceOpenCount; - } - } - - return $meaningfulTokenIndexes; - } - - /** - * @param int[] $indexes - * - * @return Token[] - */ - private function getTokenClones(Tokens $tokens, array $indexes) - { - $clones = []; - - foreach ($indexes as $i) { - $clones[] = clone $tokens[$i]; - } - - return $clones; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php deleted file mode 100644 index 7c99517..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php +++ /dev/null @@ -1,191 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class CombineConsecutiveUnsetsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Calling `unset` on multiple items should be done in one call.', - [new CodeSample("isTokenKindFound(T_UNSET); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind(T_UNSET)) { - continue; - } - - $previousUnsetCall = $this->getPreviousUnsetCall($tokens, $index); - if (\is_int($previousUnsetCall)) { - $index = $previousUnsetCall; - - continue; - } - - list($previousUnset, , $previousUnsetBraceEnd) = $previousUnsetCall; - - // Merge the tokens inside the 'unset' call into the previous one 'unset' call. - $tokensAddCount = $this->moveTokens( - $tokens, - $nextUnsetContentStart = $tokens->getNextTokenOfKind($index, ['(']), - $nextUnsetContentEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $nextUnsetContentStart), - $previousUnsetBraceEnd - 1 - ); - - if (!$tokens[$previousUnsetBraceEnd]->isWhitespace()) { - $tokens->insertAt($previousUnsetBraceEnd, new Token([T_WHITESPACE, ' '])); - ++$tokensAddCount; - } - - $tokens->insertAt($previousUnsetBraceEnd, new Token(',')); - ++$tokensAddCount; - - // Remove 'unset', '(', ')' and (possibly) ';' from the merged 'unset' call. - $this->clearOffsetTokens($tokens, $tokensAddCount, [$index, $nextUnsetContentStart, $nextUnsetContentEnd]); - - $nextUnsetSemicolon = $tokens->getNextMeaningfulToken($nextUnsetContentEnd); - if (null !== $nextUnsetSemicolon && $tokens[$nextUnsetSemicolon]->equals(';')) { - $tokens->clearTokenAndMergeSurroundingWhitespace($nextUnsetSemicolon); - } - - $index = $previousUnset + 1; - } - } - - /** - * @param int $offset - * @param int[] $indices - */ - private function clearOffsetTokens(Tokens $tokens, $offset, array $indices) - { - foreach ($indices as $index) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index + $offset); - } - } - - /** - * Find a previous call to unset directly before the index. - * - * Returns an array with - * * unset index - * * opening brace index - * * closing brace index - * * end semicolon index - * - * Or the index to where the method looked for an call. - * - * @param int $index - * - * @return int|int[] - */ - private function getPreviousUnsetCall(Tokens $tokens, $index) - { - $previousUnsetSemicolon = $tokens->getPrevMeaningfulToken($index); - if (null === $previousUnsetSemicolon) { - return $index; - } - - if (!$tokens[$previousUnsetSemicolon]->equals(';')) { - return $previousUnsetSemicolon; - } - - $previousUnsetBraceEnd = $tokens->getPrevMeaningfulToken($previousUnsetSemicolon); - if (null === $previousUnsetBraceEnd) { - return $index; - } - - if (!$tokens[$previousUnsetBraceEnd]->equals(')')) { - return $previousUnsetBraceEnd; - } - - $previousUnsetBraceStart = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $previousUnsetBraceEnd); - $previousUnset = $tokens->getPrevMeaningfulToken($previousUnsetBraceStart); - if (null === $previousUnset) { - return $index; - } - - if (!$tokens[$previousUnset]->isGivenKind(T_UNSET)) { - return $previousUnset; - } - - return [ - $previousUnset, - $previousUnsetBraceStart, - $previousUnsetBraceEnd, - $previousUnsetSemicolon, - ]; - } - - /** - * @param int $start Index previous of the first token to move - * @param int $end Index of the last token to move - * @param int $to Upper boundary index - * - * @return int Number of tokens inserted - */ - private function moveTokens(Tokens $tokens, $start, $end, $to) - { - $added = 0; - for ($i = $start + 1; $i < $end; $i += 2) { - if ($tokens[$i]->isWhitespace() && $tokens[$to + 1]->isWhitespace()) { - $tokens[$to + 1] = new Token([T_WHITESPACE, $tokens[$to + 1]->getContent().$tokens[$i]->getContent()]); - } else { - $tokens->insertAt(++$to, clone $tokens[$i]); - ++$end; - ++$added; - } - - $tokens->clearAt($i + 1); - } - - return $added; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php deleted file mode 100644 index 2879e62..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php +++ /dev/null @@ -1,140 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class DeclareEqualNormalizeFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @var string - */ - private $callback; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->callback = 'none' === $this->configuration['space'] ? 'removeWhitespaceAroundToken' : 'ensureWhitespaceAroundToken'; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Equal sign in declare statement should be surrounded by spaces or not following configuration.', - [ - new CodeSample(" 'single']), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after DeclareStrictTypesFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DECLARE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $callback = $this->callback; - for ($index = 0, $count = $tokens->count(); $index < $count - 6; ++$index) { - if (!$tokens[$index]->isGivenKind(T_DECLARE)) { - continue; - } - - while (!$tokens[++$index]->equals('=')); - - $this->{$callback}($tokens, $index); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('space', 'Spacing to apply around the equal sign.')) - ->setAllowedValues(['single', 'none']) - ->setDefault('none') - ->getOption(), - ]); - } - - /** - * @param int $index of `=` token - */ - private function ensureWhitespaceAroundToken(Tokens $tokens, $index) - { - if ($tokens[$index + 1]->isWhitespace()) { - if (' ' !== $tokens[$index + 1]->getContent()) { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - } else { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - - if ($tokens[$index - 1]->isWhitespace()) { - if (' ' !== $tokens[$index - 1]->getContent() && !$tokens[$tokens->getPrevNonWhitespace($index - 1)]->isComment()) { - $tokens[$index - 1] = new Token([T_WHITESPACE, ' ']); - } - } else { - $tokens->insertAt($index, new Token([T_WHITESPACE, ' '])); - } - } - - /** - * @param int $index of `=` token - */ - private function removeWhitespaceAroundToken(Tokens $tokens, $index) - { - if (!$tokens[$tokens->getPrevNonWhitespace($index)]->isComment()) { - $tokens->removeLeadingWhitespace($index); - } - - $tokens->removeTrailingWhitespace($index); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DirConstantFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DirConstantFixer.php deleted file mode 100644 index c9567b6..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DirConstantFixer.php +++ /dev/null @@ -1,131 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Vladimir Reznichenko - */ -final class DirConstantFixer extends AbstractFunctionReferenceFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replaces `dirname(__FILE__)` expression with equivalent `__DIR__` constant.', - [new CodeSample("isTokenKindFound(T_FILE); - } - - /** - * {@inheritdoc} - * - * Must run before CombineNestedDirnameFixer. - */ - public function getPriority() - { - return 4; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $currIndex = 0; - while (null !== $currIndex) { - $boundaries = $this->find('dirname', $tokens, $currIndex, $tokens->count() - 1); - if (null === $boundaries) { - return; - } - - list($functionNameIndex, $openParenthesis, $closeParenthesis) = $boundaries; - - // analysing cursor shift, so nested expressions kept processed - $currIndex = $openParenthesis; - - // ensure __FILE__ is in between (...) - - $fileCandidateRightIndex = $tokens->getPrevMeaningfulToken($closeParenthesis); - $trailingCommaIndex = null; - if ($tokens[$fileCandidateRightIndex]->equals(',')) { - $trailingCommaIndex = $fileCandidateRightIndex; - $fileCandidateRightIndex = $tokens->getPrevMeaningfulToken($fileCandidateRightIndex); - } - - $fileCandidateRight = $tokens[$fileCandidateRightIndex]; - if (!$fileCandidateRight->isGivenKind(T_FILE)) { - continue; - } - - $fileCandidateLeftIndex = $tokens->getNextMeaningfulToken($openParenthesis); - $fileCandidateLeft = $tokens[$fileCandidateLeftIndex]; - - if (!$fileCandidateLeft->isGivenKind(T_FILE)) { - continue; - } - - // get rid of root namespace when it used - $namespaceCandidateIndex = $tokens->getPrevMeaningfulToken($functionNameIndex); - $namespaceCandidate = $tokens[$namespaceCandidateIndex]; - if ($namespaceCandidate->isGivenKind(T_NS_SEPARATOR)) { - $tokens->removeTrailingWhitespace($namespaceCandidateIndex); - $tokens->clearAt($namespaceCandidateIndex); - } - - if (null !== $trailingCommaIndex) { - if (!$tokens[$tokens->getNextNonWhitespace($trailingCommaIndex)]->isComment()) { - $tokens->removeTrailingWhitespace($trailingCommaIndex); - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($trailingCommaIndex); - } - - // closing parenthesis removed with leading spaces - if (!$tokens[$tokens->getNextNonWhitespace($closeParenthesis)]->isComment()) { - $tokens->removeLeadingWhitespace($closeParenthesis); - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($closeParenthesis); - - // opening parenthesis removed with trailing and leading spaces - if (!$tokens[$tokens->getNextNonWhitespace($openParenthesis)]->isComment()) { - $tokens->removeLeadingWhitespace($openParenthesis); - } - - $tokens->removeTrailingWhitespace($openParenthesis); - $tokens->clearTokenAndMergeSurroundingWhitespace($openParenthesis); - - // replace constant and remove function name - $tokens[$fileCandidateLeftIndex] = new Token([T_DIR, '__DIR__']); - $tokens->clearTokenAndMergeSurroundingWhitespace($functionNameIndex); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php deleted file mode 100644 index 0fb2a11..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php +++ /dev/null @@ -1,175 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jules Pietri - * @author Kuba Werłos - */ -final class ErrorSuppressionFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - const OPTION_MUTE_DEPRECATION_ERROR = 'mute_deprecation_error'; - const OPTION_NOISE_REMAINING_USAGES = 'noise_remaining_usages'; - const OPTION_NOISE_REMAINING_USAGES_EXCLUDE = 'noise_remaining_usages_exclude'; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Error control operator should be added to deprecation notices and/or removed from other cases.', - [ - new CodeSample(" true] - ), - new CodeSample( - " true, - self::OPTION_NOISE_REMAINING_USAGES_EXCLUDE => ['unlink'], - ] - ), - ], - null, - 'Risky because adding/removing `@` might cause changes to code behaviour or if `trigger_error` function is overridden.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound(['@', T_STRING]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder(self::OPTION_MUTE_DEPRECATION_ERROR, 'Whether to add `@` in deprecation notices.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder(self::OPTION_NOISE_REMAINING_USAGES, 'Whether to remove `@` in remaining usages.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder(self::OPTION_NOISE_REMAINING_USAGES_EXCLUDE, 'List of global functions to exclude from removing `@`')) - ->setAllowedTypes(['array']) - ->setDefault([]) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $functionsAnalyzer = new FunctionsAnalyzer(); - $excludedFunctions = array_map(static function ($function) { - return strtolower($function); - }, $this->configuration[self::OPTION_NOISE_REMAINING_USAGES_EXCLUDE]); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ($this->configuration[self::OPTION_NOISE_REMAINING_USAGES] && $token->equals('@')) { - $tokens->clearAt($index); - - continue; - } - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $functionIndex = $index; - $startIndex = $index; - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $startIndex = $prevIndex; - $prevIndex = $tokens->getPrevMeaningfulToken($startIndex); - } - - $index = $prevIndex; - - if ($this->isDeprecationErrorCall($tokens, $functionIndex)) { - if (!$this->configuration[self::OPTION_MUTE_DEPRECATION_ERROR]) { - continue; - } - - if ($tokens[$prevIndex]->equals('@')) { - continue; - } - - $tokens->insertAt($startIndex, new Token('@')); - - continue; - } - - if (!$tokens[$prevIndex]->equals('@')) { - continue; - } - - if ($this->configuration[self::OPTION_NOISE_REMAINING_USAGES] && !\in_array($tokens[$functionIndex]->getContent(), $excludedFunctions, true)) { - $tokens->clearAt($index); - } - } - } - - /** - * @param int $index - * - * @return bool - */ - private function isDeprecationErrorCall(Tokens $tokens, $index) - { - if ('trigger_error' !== strtolower($tokens[$index]->getContent())) { - return false; - } - - $endBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $tokens->getNextTokenOfKind($index, [T_STRING, '('])); - - $prevIndex = $tokens->getPrevMeaningfulToken($endBraceIndex); - if ($tokens[$prevIndex]->equals(',')) { - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - } - - return $tokens[$prevIndex]->equals([T_STRING, 'E_USER_DEPRECATED']); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php deleted file mode 100644 index e28e848..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php +++ /dev/null @@ -1,91 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class ExplicitIndirectVariableFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Add curly braces to indirect variables to make them clear to understand. Requires PHP >= 7.0.', - [ - new VersionSpecificCodeSample( - <<<'EOT' -$bar['baz']; -echo $foo->$callback($baz); - -EOT -, - new VersionSpecification(70000) - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return \PHP_VERSION_ID >= 70000 && $tokens->isTokenKindFound(T_VARIABLE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index > 1; --$index) { - $token = $tokens[$index]; - if (!$token->isGivenKind(T_VARIABLE)) { - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - if (!$prevToken->equals('$') && !$prevToken->isGivenKind(T_OBJECT_OPERATOR)) { - continue; - } - - $openingBrace = CT::T_DYNAMIC_VAR_BRACE_OPEN; - $closingBrace = CT::T_DYNAMIC_VAR_BRACE_CLOSE; - if ($prevToken->isGivenKind(T_OBJECT_OPERATOR)) { - $openingBrace = CT::T_DYNAMIC_PROP_BRACE_OPEN; - $closingBrace = CT::T_DYNAMIC_PROP_BRACE_CLOSE; - } - - $tokens->overrideRange($index, $index, [ - new Token([$openingBrace, '{']), - new Token([T_VARIABLE, $token->getContent()]), - new Token([$closingBrace, '}']), - ]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php deleted file mode 100644 index 81127ba..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php +++ /dev/null @@ -1,320 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class FunctionToConstantFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @var array - */ - private static $availableFunctions; - - /** - * @var array - */ - private $functionsFixMap; - - public function __construct() - { - if (null === self::$availableFunctions) { - self::$availableFunctions = [ - 'get_called_class' => [ - new Token([T_STATIC, 'static']), - new Token([T_DOUBLE_COLON, '::']), - new Token([CT::T_CLASS_CONSTANT, 'class']), - ], - 'get_class' => [new Token([T_CLASS_C, '__CLASS__'])], - 'get_class_this' => [ - new Token([T_STATIC, 'static']), - new Token([T_DOUBLE_COLON, '::']), - new Token([CT::T_CLASS_CONSTANT, 'class']), - ], - 'php_sapi_name' => [new Token([T_STRING, 'PHP_SAPI'])], - 'phpversion' => [new Token([T_STRING, 'PHP_VERSION'])], - 'pi' => [new Token([T_STRING, 'M_PI'])], - ]; - } - - parent::__construct(); - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->functionsFixMap = []; - foreach ($this->configuration['functions'] as $key) { - $this->functionsFixMap[$key] = self::$availableFunctions[$key]; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replace core functions calls returning constants with the constants.', - [ - new CodeSample( - " ['get_called_class', 'get_class_this', 'phpversion']] - ), - ], - null, - 'Risky when any of the configured functions to replace are overridden.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before NativeFunctionCasingFixer, NoExtraBlankLinesFixer, NoSinglelineWhitespaceBeforeSemicolonsFixer, NoTrailingWhitespaceFixer, NoWhitespaceInBlankLineFixer, SelfStaticAccessorFixer. - * Must run after NoSpacesAfterFunctionNameFixer, NoSpacesInsideParenthesisFixer. - */ - public function getPriority() - { - return 1; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $functionAnalyzer = new FunctionsAnalyzer(); - - for ($index = $tokens->count() - 4; $index > 0; --$index) { - $candidate = $this->getReplaceCandidate($tokens, $functionAnalyzer, $index); - if (null === $candidate) { - continue; - } - - $this->fixFunctionCallToConstant( - $tokens, - $index, - $candidate[0], // brace open - $candidate[1], // brace close - $candidate[2] // replacement - ); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $functionNames = array_keys(self::$availableFunctions); - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('functions', 'List of function names to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset($functionNames)]) - ->setDefault([ - 'get_class', - 'php_sapi_name', - 'phpversion', - 'pi', - // TODO on v3.0 add 'get_called_class' and `get_class_this` here - ]) - ->getOption(), - ]); - } - - /** - * @param int $index - * @param int $braceOpenIndex - * @param int $braceCloseIndex - * @param Token[] $replacements - */ - private function fixFunctionCallToConstant(Tokens $tokens, $index, $braceOpenIndex, $braceCloseIndex, array $replacements) - { - for ($i = $braceCloseIndex; $i >= $braceOpenIndex; --$i) { - if ($tokens[$i]->equalsAny([[T_WHITESPACE], [T_COMMENT], [T_DOC_COMMENT]])) { - continue; - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($i); - } - - if ($replacements[0]->isGivenKind([T_CLASS_C, T_STATIC])) { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - if ($prevToken->isGivenKind(T_NS_SEPARATOR)) { - $tokens->clearAt($prevIndex); - } - } - - $tokens->clearAt($index); - $tokens->insertAt($index, $replacements); - } - - /** - * @param int $index - * - * @return null|array - */ - private function getReplaceCandidate( - Tokens $tokens, - FunctionsAnalyzer $functionAnalyzer, - $index - ) { - if (!$tokens[$index]->isGivenKind(T_STRING)) { - return null; - } - - $lowerContent = strtolower($tokens[$index]->getContent()); - - if ('get_class' === $lowerContent) { - return $this->fixGetClassCall($tokens, $functionAnalyzer, $index); - } - - if (!isset($this->functionsFixMap[$lowerContent])) { - return null; - } - - if (!$functionAnalyzer->isGlobalFunctionCall($tokens, $index)) { - return null; - } - - // test if function call without parameters - $braceOpenIndex = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$braceOpenIndex]->equals('(')) { - return null; - } - - $braceCloseIndex = $tokens->getNextMeaningfulToken($braceOpenIndex); - if (!$tokens[$braceCloseIndex]->equals(')')) { - return null; - } - - return $this->getReplacementTokenClones($lowerContent, $braceOpenIndex, $braceCloseIndex); - } - - /** - * @param int $index - * - * @return null|array - */ - private function fixGetClassCall( - Tokens $tokens, - FunctionsAnalyzer $functionAnalyzer, - $index - ) { - if (!isset($this->functionsFixMap['get_class']) && !isset($this->functionsFixMap['get_class_this'])) { - return null; - } - - if (!$functionAnalyzer->isGlobalFunctionCall($tokens, $index)) { - return null; - } - - $braceOpenIndex = $tokens->getNextMeaningfulToken($index); - $braceCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $braceOpenIndex); - - if ($braceCloseIndex === $tokens->getNextMeaningfulToken($braceOpenIndex)) { // no arguments passed - if (isset($this->functionsFixMap['get_class'])) { - return $this->getReplacementTokenClones('get_class', $braceOpenIndex, $braceCloseIndex); - } - } else { - if (isset($this->functionsFixMap['get_class_this'])) { - $isThis = false; - - for ($i = $braceOpenIndex + 1; $i < $braceCloseIndex; ++$i) { - if ($tokens[$i]->equalsAny([[T_WHITESPACE], [T_COMMENT], [T_DOC_COMMENT], ')'])) { - continue; - } - - if ($tokens[$i]->isGivenKind(T_VARIABLE) && '$this' === strtolower($tokens[$i]->getContent())) { - $isThis = true; - - continue; - } - - if (false === $isThis && $tokens[$i]->equals('(')) { - continue; - } - - $isThis = false; - - break; - } - - if ($isThis) { - return $this->getReplacementTokenClones('get_class_this', $braceOpenIndex, $braceCloseIndex); - } - } - } - - return null; - } - - /** - * @param string $lowerContent - * @param int $braceOpenIndex - * @param int $braceCloseIndex - * - * @return array - */ - private function getReplacementTokenClones($lowerContent, $braceOpenIndex, $braceCloseIndex) - { - $clones = []; - foreach ($this->functionsFixMap[$lowerContent] as $token) { - $clones[] = clone $token; - } - - return [ - $braceOpenIndex, - $braceCloseIndex, - $clones, - ]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/IsNullFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/IsNullFixer.php deleted file mode 100644 index 410358d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/IsNullFixer.php +++ /dev/null @@ -1,203 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Vladimir Reznichenko - */ -final class IsNullFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replaces `is_null($var)` expression with `null === $var`.', - [ - new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - static $sequenceNeeded = [[T_STRING, 'is_null'], '(']; - $functionsAnalyzer = new FunctionsAnalyzer(); - - $currIndex = 0; - while (null !== $currIndex) { - $matches = $tokens->findSequence($sequenceNeeded, $currIndex, $tokens->count() - 1, false); - - // stop looping if didn't find any new matches - if (null === $matches) { - break; - } - - // 0 and 1 accordingly are "is_null", "(" tokens - $matches = array_keys($matches); - - // move the cursor just after the sequence - list($isNullIndex, $currIndex) = $matches; - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $matches[0])) { - continue; - } - - $next = $tokens->getNextMeaningfulToken($currIndex); - if ($tokens[$next]->equals(')')) { - continue; - } - - $prevTokenIndex = $tokens->getPrevMeaningfulToken($matches[0]); - - // handle function references with namespaces - if ($tokens[$prevTokenIndex]->isGivenKind(T_NS_SEPARATOR)) { - $tokens->removeTrailingWhitespace($prevTokenIndex); - $tokens->clearAt($prevTokenIndex); - - $prevTokenIndex = $tokens->getPrevMeaningfulToken($prevTokenIndex); - } - - // check if inversion being used, text comparison is due to not existing constant - $isInvertedNullCheck = false; - if ($tokens[$prevTokenIndex]->equals('!')) { - $isInvertedNullCheck = true; - - // get rid of inverting for proper transformations - $tokens->removeTrailingWhitespace($prevTokenIndex); - $tokens->clearAt($prevTokenIndex); - } - - // before getting rind of `()` around a parameter, ensure it's not assignment/ternary invariant - $referenceEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $matches[1]); - $isContainingDangerousConstructs = false; - for ($paramTokenIndex = $matches[1]; $paramTokenIndex <= $referenceEnd; ++$paramTokenIndex) { - if (\in_array($tokens[$paramTokenIndex]->getContent(), ['?', '?:', '=', '??'], true)) { - $isContainingDangerousConstructs = true; - - break; - } - } - - // edge cases: is_null() followed/preceded by ==, ===, !=, !==, <> - $parentLeftToken = $tokens[$tokens->getPrevMeaningfulToken($isNullIndex)]; - $parentRightToken = $tokens[$tokens->getNextMeaningfulToken($referenceEnd)]; - $parentOperations = [T_IS_EQUAL, T_IS_NOT_EQUAL, T_IS_IDENTICAL, T_IS_NOT_IDENTICAL]; - $wrapIntoParentheses = $parentLeftToken->isGivenKind($parentOperations) || $parentRightToken->isGivenKind($parentOperations); - - // possible trailing comma removed - $prevIndex = $tokens->getPrevMeaningfulToken($referenceEnd); - if ($tokens[$prevIndex]->equals(',')) { - $tokens->clearTokenAndMergeSurroundingWhitespace($prevIndex); - } - - if (!$isContainingDangerousConstructs) { - // closing parenthesis removed with leading spaces - $tokens->removeLeadingWhitespace($referenceEnd); - $tokens->clearAt($referenceEnd); - - // opening parenthesis removed with trailing spaces - $tokens->removeLeadingWhitespace($matches[1]); - $tokens->removeTrailingWhitespace($matches[1]); - $tokens->clearAt($matches[1]); - } - - // sequence which we'll use as a replacement - $replacement = [ - new Token([T_STRING, 'null']), - new Token([T_WHITESPACE, ' ']), - new Token($isInvertedNullCheck ? [T_IS_NOT_IDENTICAL, '!=='] : [T_IS_IDENTICAL, '===']), - new Token([T_WHITESPACE, ' ']), - ]; - - if (true === $this->configuration['use_yoda_style']) { - if ($wrapIntoParentheses) { - array_unshift($replacement, new Token('(')); - $tokens->insertAt($referenceEnd + 1, new Token(')')); - } - - $tokens->overrideRange($isNullIndex, $isNullIndex, $replacement); - } else { - $replacement = array_reverse($replacement); - if ($wrapIntoParentheses) { - $replacement[] = new Token(')'); - $tokens[$isNullIndex] = new Token('('); - } else { - $tokens->clearAt($isNullIndex); - } - - $tokens->insertAt($referenceEnd + 1, $replacement); - } - - // nested is_null calls support - $currIndex = $isNullIndex; - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - // @todo 3.0 drop `ConfigurationDefinitionFixerInterface` - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('use_yoda_style', 'Whether Yoda style conditions should be used.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->setDeprecationMessage('Use `yoda_style` fixer instead.') - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php deleted file mode 100644 index 5de1daa..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php +++ /dev/null @@ -1,231 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gert de Pagter - */ -final class NoUnsetOnPropertyFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Properties should be set to `null` instead of using `unset`.', - [new CodeSample("a);\n")], - null, - 'Changing variables to `null` instead of unsetting them will mean they still show up '. - 'when looping over class variables. With PHP 7.4, this rule might introduce `null` assignments to '. - 'property whose type declaration does not allow it.' - ); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_UNSET) - && $tokens->isAnyTokenKindsFound([T_OBJECT_OPERATOR, T_PAAMAYIM_NEKUDOTAYIM]); - } - - /** - * {@inheritdoc} - * - * Must run before CombineConsecutiveUnsetsFixer. - */ - public function getPriority() - { - return 25; - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind(T_UNSET)) { - continue; - } - - $unsetsInfo = $this->getUnsetsInfo($tokens, $index); - - if (!$this->isAnyUnsetToTransform($unsetsInfo)) { - continue; - } - - $isLastUnset = true; // yes, last - we reverse the array below - foreach (array_reverse($unsetsInfo) as $unsetInfo) { - $this->updateTokens($tokens, $unsetInfo, $isLastUnset); - $isLastUnset = false; - } - } - } - - /** - * @param int $index - * - * @return array> - */ - private function getUnsetsInfo(Tokens $tokens, $index) - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - $unsetStart = $tokens->getNextTokenOfKind($index, ['(']); - $unsetEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $unsetStart); - $isFirst = true; - - $unsets = []; - foreach ($argumentsAnalyzer->getArguments($tokens, $unsetStart, $unsetEnd) as $startIndex => $endIndex) { - $startIndex = $tokens->getNextMeaningfulToken($startIndex - 1); - $endIndex = $tokens->getPrevMeaningfulToken($endIndex + 1); - $unsets[] = [ - 'startIndex' => $startIndex, - 'endIndex' => $endIndex, - 'isToTransform' => $this->isProperty($tokens, $startIndex, $endIndex), - 'isFirst' => $isFirst, - ]; - $isFirst = false; - } - - return $unsets; - } - - /** - * @param int $index - * @param int $endIndex - * - * @return bool - */ - private function isProperty(Tokens $tokens, $index, $endIndex) - { - if ($tokens[$index]->isGivenKind(T_VARIABLE)) { - $nextIndex = $tokens->getNextMeaningfulToken($index); - if (null === $nextIndex || !$tokens[$nextIndex]->isGivenKind(T_OBJECT_OPERATOR)) { - return false; - } - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - $nextNextIndex = $tokens->getNextMeaningfulToken($nextIndex); - if (null !== $nextNextIndex && $nextNextIndex < $endIndex) { - return false; - } - - return null !== $nextIndex && $tokens[$nextIndex]->isGivenKind(T_STRING); - } - - if ($tokens[$index]->isGivenKind([T_NS_SEPARATOR, T_STRING])) { - $nextIndex = $tokens->getTokenNotOfKindSibling($index, 1, [[T_DOUBLE_COLON], [T_NS_SEPARATOR], [T_STRING]]); - $nextNextIndex = $tokens->getNextMeaningfulToken($nextIndex); - if (null !== $nextNextIndex && $nextNextIndex < $endIndex) { - return false; - } - - return null !== $nextIndex && $tokens[$nextIndex]->isGivenKind(T_VARIABLE); - } - - return false; - } - - /** - * @param array> $unsetsInfo - * - * @return bool - */ - private function isAnyUnsetToTransform(array $unsetsInfo) - { - foreach ($unsetsInfo as $unsetInfo) { - if ($unsetInfo['isToTransform']) { - return true; - } - } - - return false; - } - - /** - * @param array $unsetInfo - * @param bool $isLastUnset - */ - private function updateTokens(Tokens $tokens, array $unsetInfo, $isLastUnset) - { - // if entry is first and to be transform we remove leading "unset(" - if ($unsetInfo['isFirst'] && $unsetInfo['isToTransform']) { - $braceIndex = $tokens->getPrevTokenOfKind($unsetInfo['startIndex'], ['(']); - $unsetIndex = $tokens->getPrevTokenOfKind($braceIndex, [[T_UNSET]]); - $tokens->clearTokenAndMergeSurroundingWhitespace($braceIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($unsetIndex); - } - - // if entry is last and to be transformed we remove trailing ")" - if ($isLastUnset && $unsetInfo['isToTransform']) { - $braceIndex = $tokens->getNextTokenOfKind($unsetInfo['endIndex'], [')']); - $previousIndex = $tokens->getPrevMeaningfulToken($braceIndex); - if ($tokens[$previousIndex]->equals(',')) { - $tokens->clearTokenAndMergeSurroundingWhitespace($previousIndex); // trailing ',' in function call (PHP 7.3) - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($braceIndex); - } - - // if entry is not last we replace comma with semicolon (last entry already has semicolon - from original unset) - if (!$isLastUnset) { - $commaIndex = $tokens->getNextTokenOfKind($unsetInfo['endIndex'], [',']); - $tokens[$commaIndex] = new Token(';'); - } - - // if entry is to be unset and is not last we add trailing ")" - if (!$unsetInfo['isToTransform'] && !$isLastUnset) { - $tokens->insertAt($unsetInfo['endIndex'] + 1, new Token(')')); - } - - // if entry is to be unset and is not first we add leading "unset(" - if (!$unsetInfo['isToTransform'] && !$unsetInfo['isFirst']) { - $tokens->insertAt( - $unsetInfo['startIndex'], - [ - new Token([T_UNSET, 'unset']), - new Token('('), - ] - ); - } - - // and finally - // if entry is to be transformed we add trailing " = null" - if ($unsetInfo['isToTransform']) { - $tokens->insertAt( - $unsetInfo['endIndex'] + 1, - [ - new Token([T_WHITESPACE, ' ']), - new Token('='), - new Token([T_WHITESPACE, ' ']), - new Token([T_STRING, 'null']), - ] - ); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SilencedDeprecationErrorFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SilencedDeprecationErrorFixer.php deleted file mode 100644 index b119912..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SilencedDeprecationErrorFixer.php +++ /dev/null @@ -1,55 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * @author Jules Pietri - * - * @deprecated - */ -final class SilencedDeprecationErrorFixer extends AbstractProxyFixer implements DeprecatedFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Ensures deprecation notices are silenced.', - [new CodeSample("proxyFixers); - } - - /** - * {@inheritdoc} - */ - protected function createProxyFixers() - { - return [new ErrorSuppressionFixer()]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php deleted file mode 100644 index 8903946..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php +++ /dev/null @@ -1,149 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ListNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class ListSyntaxFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - private $candidateTokenKind; - - /** - * Use 'syntax' => 'long'|'short'. - * - * @param null|array $configuration - * - * @throws InvalidFixerConfigurationException - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->candidateTokenKind = 'long' === $this->configuration['syntax'] ? CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN : T_LIST; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'List (`array` destructuring) assignment should be declared using the configured syntax. Requires PHP >= 7.1.', - [ - new VersionSpecificCodeSample( - " 'short'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BinaryOperatorSpacesFixer, TernaryOperatorSpacesFixer. - */ - public function getPriority() - { - return 1; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return \PHP_VERSION_ID >= 70100 && $tokens->isTokenKindFound($this->candidateTokenKind); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - if ($tokens[$index]->isGivenKind($this->candidateTokenKind)) { - if (T_LIST === $this->candidateTokenKind) { - $this->fixToShortSyntax($tokens, $index); - } else { - $this->fixToLongSyntax($tokens, $index); - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('syntax', 'Whether to use the `long` or `short` `list` syntax.')) - ->setAllowedValues(['long', 'short']) - ->setDefault('long') - ->getOption(), - ]); - } - - /** - * @param int $index - */ - private function fixToLongSyntax(Tokens $tokens, $index) - { - static $typesOfInterest = [ - [CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE], - '[', // [CT::T_ARRAY_SQUARE_BRACE_OPEN], - ]; - - $closeIndex = $tokens->getNextTokenOfKind($index, $typesOfInterest); - if (!$tokens[$closeIndex]->isGivenKind(CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE)) { - return; - } - - $tokens[$index] = new Token('('); - $tokens[$closeIndex] = new Token(')'); - $tokens->insertAt($index, new Token([T_LIST, 'list'])); - } - - /** - * @param int $index - */ - private function fixToShortSyntax(Tokens $tokens, $index) - { - $openIndex = $tokens->getNextTokenOfKind($index, ['(']); - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - - $tokens[$openIndex] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, '[']); - $tokens[$closeIndex] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE, ']']); - - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLineAfterNamespaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLineAfterNamespaceFixer.php deleted file mode 100644 index a209b89..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLineAfterNamespaceFixer.php +++ /dev/null @@ -1,144 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\NamespaceNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶3. - * - * @author Dariusz Rumiński - */ -final class BlankLineAfterNamespaceFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There MUST be one blank line after the namespace declaration.', - [ - new CodeSample("isTokenKindFound(T_NAMESPACE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $lastIndex = $tokens->count() - 1; - - for ($index = $lastIndex; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_NAMESPACE)) { - continue; - } - - $semicolonIndex = $tokens->getNextTokenOfKind($index, [';', '{', [T_CLOSE_TAG]]); - $semicolonToken = $tokens[$semicolonIndex]; - - if (!$semicolonToken->equals(';')) { - continue; - } - - $indexToEnsureBlankLineAfter = $this->getIndexToEnsureBlankLineAfter($tokens, $semicolonIndex); - $indexToEnsureBlankLine = $tokens->getNonEmptySibling($indexToEnsureBlankLineAfter, 1); - - if (null !== $indexToEnsureBlankLine && $tokens[$indexToEnsureBlankLine]->isWhitespace()) { - $tokens[$indexToEnsureBlankLine] = $this->getTokenToInsert($tokens[$indexToEnsureBlankLine]->getContent(), $indexToEnsureBlankLine === $lastIndex); - } else { - $tokens->insertAt($indexToEnsureBlankLineAfter + 1, $this->getTokenToInsert('', $indexToEnsureBlankLineAfter === $lastIndex)); - } - } - } - - /** - * @param int $index - * - * @return int - */ - private function getIndexToEnsureBlankLineAfter(Tokens $tokens, $index) - { - $indexToEnsureBlankLine = $index; - $nextIndex = $tokens->getNonEmptySibling($indexToEnsureBlankLine, 1); - - while (null !== $nextIndex) { - $token = $tokens[$nextIndex]; - - if ($token->isWhitespace()) { - if (1 === Preg::match('/\R/', $token->getContent())) { - break; - } - $nextNextIndex = $tokens->getNonEmptySibling($nextIndex, 1); - - if (!$tokens[$nextNextIndex]->isComment()) { - break; - } - } - - if (!$token->isWhitespace() && !$token->isComment()) { - break; - } - - $indexToEnsureBlankLine = $nextIndex; - $nextIndex = $tokens->getNonEmptySibling($indexToEnsureBlankLine, 1); - } - - return $indexToEnsureBlankLine; - } - - /** - * @param string $currentContent - * @param bool $isLastIndex - * - * @return Token - */ - private function getTokenToInsert($currentContent, $isLastIndex) - { - $ending = $this->whitespacesConfig->getLineEnding(); - - $emptyLines = $isLastIndex ? $ending : $ending.$ending; - $indent = 1 === Preg::match('/^.*\R( *)$/s', $currentContent, $matches) ? $matches[1] : ''; - - return new Token([T_WHITESPACE, $emptyLines.$indent]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoBlankLinesBeforeNamespaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoBlankLinesBeforeNamespaceFixer.php deleted file mode 100644 index c516a01..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoBlankLinesBeforeNamespaceFixer.php +++ /dev/null @@ -1,73 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\NamespaceNotation; - -use PhpCsFixer\AbstractLinesBeforeNamespaceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class NoBlankLinesBeforeNamespaceFixer extends AbstractLinesBeforeNamespaceFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_NAMESPACE); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There should be no blank lines before a namespace declaration.', - [ - new CodeSample( - "count(); $index < $limit; ++$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_NAMESPACE)) { - continue; - } - - $this->fixLinesBeforeNamespace($tokens, $index, 0, 1); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoLeadingNamespaceWhitespaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoLeadingNamespaceWhitespaceFixer.php deleted file mode 100644 index ddb67ad..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoLeadingNamespaceWhitespaceFixer.php +++ /dev/null @@ -1,101 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\NamespaceNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Bram Gotink - * @author Dariusz Rumiński - */ -final class NoLeadingNamespaceWhitespaceFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_NAMESPACE); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'The namespace declaration line shouldn\'t contain leading whitespace.', - [ - new CodeSample( - 'isGivenKind(T_NAMESPACE)) { - continue; - } - - $beforeNamespaceIndex = $index - 1; - $beforeNamespace = $tokens[$beforeNamespaceIndex]; - - if (!$beforeNamespace->isWhitespace()) { - if (!self::endsWithWhitespace($beforeNamespace->getContent())) { - $tokens->insertAt($index, new Token([T_WHITESPACE, $this->whitespacesConfig->getLineEnding()])); - } - - continue; - } - - $lastNewline = strrpos($beforeNamespace->getContent(), "\n"); - - if (false === $lastNewline) { - $beforeBeforeNamespace = $tokens[$index - 2]; - - if (self::endsWithWhitespace($beforeBeforeNamespace->getContent())) { - $tokens->clearAt($beforeNamespaceIndex); - } else { - $tokens[$beforeNamespaceIndex] = new Token([T_WHITESPACE, ' ']); - } - } else { - $tokens[$beforeNamespaceIndex] = new Token([T_WHITESPACE, substr($beforeNamespace->getContent(), 0, $lastNewline + 1)]); - } - } - } - - private static function endsWithWhitespace($str) - { - if ('' === $str) { - return false; - } - - return '' === trim(substr($str, -1)); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/SingleBlankLineBeforeNamespaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/SingleBlankLineBeforeNamespaceFixer.php deleted file mode 100644 index 4b0a9a7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/SingleBlankLineBeforeNamespaceFixer.php +++ /dev/null @@ -1,70 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\NamespaceNotation; - -use PhpCsFixer\AbstractLinesBeforeNamespaceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class SingleBlankLineBeforeNamespaceFixer extends AbstractLinesBeforeNamespaceFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There should be exactly one blank line before a namespace declaration.', - [ - new CodeSample("isTokenKindFound(T_NAMESPACE); - } - - /** - * {@inheritdoc} - * - * Must run after NoBlankLinesAfterPhpdocFixer. - */ - public function getPriority() - { - return -21; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_NAMESPACE)) { - $this->fixLinesBeforeNamespace($tokens, $index, 2, 2); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Naming/NoHomoglyphNamesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Naming/NoHomoglyphNamesFixer.php deleted file mode 100644 index 9f4951e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Naming/NoHomoglyphNamesFixer.php +++ /dev/null @@ -1,244 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Naming; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Fred Cox - * @author Dariusz Rumiński - */ -final class NoHomoglyphNamesFixer extends AbstractFixer -{ - /** - * Used the program https://github.com/mcfedr/homoglyph-download - * to generate this list from - * http://homoglyphs.net/?text=abcdefghijklmnopqrstuvwxyz&lang=en&exc7=1&exc8=1&exc13=1&exc14=1. - * - * Symbols replaced include - * - Latin homoglyphs - * - IPA extensions - * - Greek and Coptic - * - Cyrillic - * - Cyrillic Supplement - * - Letterlike Symbols - * - Latin Numbers - * - Fullwidth Latin - * - * This is not the complete list of unicode homographs, but limited - * to those you are more likely to have typed/copied by accident - * - * @var array - */ - private static $replacements = [ - 'O' => '0', - '0' => '0', - 'I' => '1', - '1' => '1', - '2' => '2', - '3' => '3', - '4' => '4', - '5' => '5', - '6' => '6', - '7' => '7', - '8' => '8', - '9' => '9', - 'Α' => 'A', - 'А' => 'A', - 'A' => 'A', - 'ʙ' => 'B', - 'Β' => 'B', - 'В' => 'B', - 'B' => 'B', - 'Ϲ' => 'C', - 'С' => 'C', - 'Ⅽ' => 'C', - 'C' => 'C', - 'Ⅾ' => 'D', - 'D' => 'D', - 'Ε' => 'E', - 'Е' => 'E', - 'E' => 'E', - 'Ϝ' => 'F', - 'F' => 'F', - 'ɢ' => 'G', - 'Ԍ' => 'G', - 'G' => 'G', - 'ʜ' => 'H', - 'Η' => 'H', - 'Н' => 'H', - 'H' => 'H', - 'l' => 'I', - 'Ι' => 'I', - 'І' => 'I', - 'Ⅰ' => 'I', - 'I' => 'I', - 'Ј' => 'J', - 'J' => 'J', - 'Κ' => 'K', - 'К' => 'K', - 'K' => 'K', - 'K' => 'K', - 'ʟ' => 'L', - 'Ⅼ' => 'L', - 'L' => 'L', - 'Μ' => 'M', - 'М' => 'M', - 'Ⅿ' => 'M', - 'M' => 'M', - 'ɴ' => 'N', - 'Ν' => 'N', - 'N' => 'N', - 'Ο' => 'O', - 'О' => 'O', - 'O' => 'O', - 'Ρ' => 'P', - 'Р' => 'P', - 'P' => 'P', - 'Q' => 'Q', - 'ʀ' => 'R', - 'R' => 'R', - 'Ѕ' => 'S', - 'S' => 'S', - 'Τ' => 'T', - 'Т' => 'T', - 'T' => 'T', - 'U' => 'U', - 'Ѵ' => 'V', - 'Ⅴ' => 'V', - 'V' => 'V', - 'W' => 'W', - 'Χ' => 'X', - 'Х' => 'X', - 'Ⅹ' => 'X', - 'X' => 'X', - 'ʏ' => 'Y', - 'Υ' => 'Y', - 'Ү' => 'Y', - 'Y' => 'Y', - 'Ζ' => 'Z', - 'Z' => 'Z', - '_' => '_', - 'ɑ' => 'a', - 'а' => 'a', - 'a' => 'a', - 'Ь' => 'b', - 'b' => 'b', - 'ϲ' => 'c', - 'с' => 'c', - 'ⅽ' => 'c', - 'c' => 'c', - 'ԁ' => 'd', - 'ⅾ' => 'd', - 'd' => 'd', - 'е' => 'e', - 'e' => 'e', - 'f' => 'f', - 'ɡ' => 'g', - 'g' => 'g', - 'һ' => 'h', - 'h' => 'h', - 'ɩ' => 'i', - 'і' => 'i', - 'ⅰ' => 'i', - 'i' => 'i', - 'ј' => 'j', - 'j' => 'j', - 'k' => 'k', - 'ⅼ' => 'l', - 'l' => 'l', - 'ⅿ' => 'm', - 'm' => 'm', - 'n' => 'n', - 'ο' => 'o', - 'о' => 'o', - 'o' => 'o', - 'р' => 'p', - 'p' => 'p', - 'q' => 'q', - 'r' => 'r', - 'ѕ' => 's', - 's' => 's', - 't' => 't', - 'u' => 'u', - 'ν' => 'v', - 'ѵ' => 'v', - 'ⅴ' => 'v', - 'v' => 'v', - 'ѡ' => 'w', - 'w' => 'w', - 'х' => 'x', - 'ⅹ' => 'x', - 'x' => 'x', - 'у' => 'y', - 'y' => 'y', - 'z' => 'z', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replace accidental usage of homoglyphs (non ascii characters) in names.', - [new CodeSample("isAnyTokenKindsFound([T_VARIABLE, T_STRING]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind([T_VARIABLE, T_STRING])) { - continue; - } - - $replaced = Preg::replaceCallback('/[^[:ascii:]]/u', static function ($matches) { - return isset(self::$replacements[$matches[0]]) - ? self::$replacements[$matches[0]] - : $matches[0] - ; - }, $token->getContent(), -1, $count); - - if ($count) { - $tokens->offsetSet($index, new Token([$token->getId(), $replaced])); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/AlignDoubleArrowFixerHelper.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/AlignDoubleArrowFixerHelper.php deleted file mode 100644 index 4a10e47..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/AlignDoubleArrowFixerHelper.php +++ /dev/null @@ -1,151 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractAlignFixerHelper; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Carlos Cirello - * @author Dariusz Rumiński - * @author Graham Campbell - * - * @deprecated - */ -final class AlignDoubleArrowFixerHelper extends AbstractAlignFixerHelper -{ - /** - * Level counter of the current nest level. - * So one level alignments are not mixed with - * other level ones. - * - * @var int - */ - private $currentLevel = 0; - - public function __construct() - { - @trigger_error( - sprintf( - 'The "%s" class is deprecated. You should stop using it, as it will be removed in 3.0 version.', - __CLASS__ - ), - E_USER_DEPRECATED - ); - } - - /** - * {@inheritdoc} - */ - protected function injectAlignmentPlaceholders(Tokens $tokens, $startAt, $endAt) - { - for ($index = $startAt; $index < $endAt; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind([T_FOREACH, T_FOR, T_WHILE, T_IF, T_SWITCH])) { - $index = $tokens->getNextMeaningfulToken($index); - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($token->isGivenKind(T_ARRAY)) { // don't use "$tokens->isArray()" here, short arrays are handled in the next case - $from = $tokens->getNextMeaningfulToken($index); - $until = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $from); - $index = $until; - - $this->injectArrayAlignmentPlaceholders($tokens, $from, $until); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - if ($prevToken->isGivenKind([T_STRING, T_VARIABLE])) { - continue; - } - - $from = $index; - $until = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $from); - $index = $until; - - $this->injectArrayAlignmentPlaceholders($tokens, $from + 1, $until - 1); - - continue; - } - - if ($token->isGivenKind(T_DOUBLE_ARROW)) { - $tokenContent = sprintf(self::ALIGNABLE_PLACEHOLDER, $this->currentLevel).$token->getContent(); - - $nextIndex = $index + 1; - $nextToken = $tokens[$nextIndex]; - if (!$nextToken->isWhitespace()) { - $tokenContent .= ' '; - } elseif ($nextToken->isWhitespace(" \t")) { - $tokens[$nextIndex] = new Token([T_WHITESPACE, ' ']); - } - - $tokens[$index] = new Token([T_DOUBLE_ARROW, $tokenContent]); - - continue; - } - - if ($token->equals(';')) { - ++$this->deepestLevel; - ++$this->currentLevel; - - continue; - } - - if ($token->equals(',')) { - for ($i = $index; $i < $endAt - 1; ++$i) { - if (false !== strpos($tokens[$i - 1]->getContent(), "\n")) { - break; - } - - if ($tokens[$i + 1]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - $arrayStartIndex = $tokens[$i + 1]->isGivenKind(T_ARRAY) - ? $tokens->getNextMeaningfulToken($i + 1) - : $i + 1 - ; - $blockType = Tokens::detectBlockType($tokens[$arrayStartIndex]); - $arrayEndIndex = $tokens->findBlockEnd($blockType['type'], $arrayStartIndex); - - if ($tokens->isPartialCodeMultiline($arrayStartIndex, $arrayEndIndex)) { - break; - } - } - - ++$index; - } - } - } - } - - /** - * @param int $from - * @param int $until - */ - private function injectArrayAlignmentPlaceholders(Tokens $tokens, $from, $until) - { - // Only inject placeholders for multi-line arrays - if ($tokens->isPartialCodeMultiline($from, $until)) { - ++$this->deepestLevel; - ++$this->currentLevel; - $this->injectAlignmentPlaceholders($tokens, $from, $until); - --$this->currentLevel; - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/AlignEqualsFixerHelper.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/AlignEqualsFixerHelper.php deleted file mode 100644 index 9aecf4c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/AlignEqualsFixerHelper.php +++ /dev/null @@ -1,78 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractAlignFixerHelper; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Carlos Cirello - * @author Graham Campbell - * - * @deprecated - */ -final class AlignEqualsFixerHelper extends AbstractAlignFixerHelper -{ - public function __construct() - { - @trigger_error( - sprintf( - 'The "%s" class is deprecated. You should stop using it, as it will be removed in 3.0 version.', - __CLASS__ - ), - E_USER_DEPRECATED - ); - } - - /** - * {@inheritdoc} - */ - protected function injectAlignmentPlaceholders(Tokens $tokens, $startAt, $endAt) - { - for ($index = $startAt; $index < $endAt; ++$index) { - $token = $tokens[$index]; - - if ($token->equals('=')) { - $tokens[$index] = new Token(sprintf(self::ALIGNABLE_PLACEHOLDER, $this->deepestLevel).$token->getContent()); - - continue; - } - - if ($token->isGivenKind(T_FUNCTION)) { - ++$this->deepestLevel; - - continue; - } - - if ($token->equals('(')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($token->equals('[')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index); - - continue; - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php deleted file mode 100644 index 755f957..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php +++ /dev/null @@ -1,833 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\Console\Command\HelpCommand; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class BinaryOperatorSpacesFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @internal - */ - const SINGLE_SPACE = 'single_space'; - - /** - * @internal - */ - const NO_SPACE = 'no_space'; - - /** - * @internal - */ - const ALIGN = 'align'; - - /** - * @internal - */ - const ALIGN_SINGLE_SPACE = 'align_single_space'; - - /** - * @internal - */ - const ALIGN_SINGLE_SPACE_MINIMAL = 'align_single_space_minimal'; - - /** - * @internal - * @const Placeholder used as anchor for right alignment. - */ - const ALIGN_PLACEHOLDER = "\x2 ALIGNABLE%d \x3"; - - /** - * Keep track of the deepest level ever achieved while - * parsing the code. Used later to replace alignment - * placeholders with spaces. - * - * @var int - */ - private $deepestLevel; - - /** - * Level counter of the current nest level. - * So one level alignments are not mixed with - * other level ones. - * - * @var int - */ - private $currentLevel; - - private static $allowedValues = [ - self::ALIGN, - self::ALIGN_SINGLE_SPACE, - self::ALIGN_SINGLE_SPACE_MINIMAL, - self::SINGLE_SPACE, - self::NO_SPACE, - null, - ]; - - /** - * @var string[] - */ - private static $supportedOperators = [ - '=', - '*', - '/', - '%', - '<', - '>', - '|', - '^', - '+', - '-', - '&', - '&=', - '&&', - '||', - '.=', - '/=', - '=>', - '==', - '>=', - '===', - '!=', - '<>', - '!==', - '<=', - 'and', - 'or', - 'xor', - '-=', - '%=', - '*=', - '|=', - '+=', - '<<', - '<<=', - '>>', - '>>=', - '^=', - '**', - '**=', - '<=>', - '??', - '??=', - ]; - - /** - * @var TokensAnalyzer - */ - private $tokensAnalyzer; - - /** - * @var array - */ - private $alignOperatorTokens = []; - - /** - * @var array - */ - private $operators = []; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - if ( - null !== $configuration && - (\array_key_exists('align_equals', $configuration) || \array_key_exists('align_double_arrow', $configuration)) - ) { - $configuration = $this->resolveOldConfig($configuration); - } - - parent::configure($configuration); - - $this->operators = $this->resolveOperatorsFromConfig(); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Binary operators should be surrounded by space as configured.', - [ - new CodeSample( - " ['=' => 'align', 'xor' => null]] - ), - new CodeSample( - ' ['+=' => 'align_single_space']] - ), - new CodeSample( - ' ['===' => 'align_single_space_minimal']] - ), - new CodeSample( - ' ['|' => 'no_space']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after ArrayIndentationFixer, ArraySyntaxFixer, ListSyntaxFixer, NoMultilineWhitespaceAroundDoubleArrowFixer, PowToExponentiationFixer, StandardizeNotEqualsFixer, StrictComparisonFixer. - */ - public function getPriority() - { - return -32; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $this->tokensAnalyzer = new TokensAnalyzer($tokens); - - // last and first tokens cannot be an operator - for ($index = $tokens->count() - 2; $index > 0; --$index) { - if (!$this->tokensAnalyzer->isBinaryOperator($index)) { - continue; - } - - if ('=' === $tokens[$index]->getContent()) { - $isDeclare = $this->isEqualPartOfDeclareStatement($tokens, $index); - if (false === $isDeclare) { - $this->fixWhiteSpaceAroundOperator($tokens, $index); - } else { - $index = $isDeclare; // skip `declare(foo ==bar)`, see `declare_equal_normalize` - } - } else { - $this->fixWhiteSpaceAroundOperator($tokens, $index); - } - - // previous of binary operator is now never an operator / previous of declare statement cannot be an operator - --$index; - } - - if (\count($this->alignOperatorTokens)) { - $this->fixAlignment($tokens, $this->alignOperatorTokens); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('default', 'Default fix strategy.')) - ->setDefault(self::SINGLE_SPACE) - ->setAllowedValues(self::$allowedValues) - ->getOption(), - (new FixerOptionBuilder('operators', 'Dictionary of `binary operator` => `fix strategy` values that differ from the default strategy.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function ($option) { - foreach ($option as $operator => $value) { - if (!\in_array($operator, self::$supportedOperators, true)) { - throw new InvalidOptionsException( - sprintf( - 'Unexpected "operators" key, expected any of "%s", got "%s".', - implode('", "', self::$supportedOperators), - \is_object($operator) ? \get_class($operator) : \gettype($operator).'#'.$operator - ) - ); - } - - if (!\in_array($value, self::$allowedValues, true)) { - throw new InvalidOptionsException( - sprintf( - 'Unexpected value for operator "%s", expected any of "%s", got "%s".', - $operator, - implode('", "', self::$allowedValues), - \is_object($value) ? \get_class($value) : (null === $value ? 'null' : \gettype($value).'#'.$value) - ) - ); - } - } - - return true; - }]) - ->setDefault([]) - ->getOption(), - // add deprecated options as BC layer - (new FixerOptionBuilder('align_double_arrow', 'Whether to apply, remove or ignore double arrows alignment.')) - ->setDefault(false) - ->setAllowedValues([true, false, null]) - ->setDeprecationMessage('Use options `operators` and `default` instead.') - ->getOption(), - (new FixerOptionBuilder('align_equals', 'Whether to apply, remove or ignore equals alignment.')) - ->setDefault(false) - ->setAllowedValues([true, false, null]) - ->setDeprecationMessage('Use options `operators` and `default` instead.') - ->getOption(), - ]); - } - - /** - * @param int $index - */ - private function fixWhiteSpaceAroundOperator(Tokens $tokens, $index) - { - $tokenContent = strtolower($tokens[$index]->getContent()); - - if (!\array_key_exists($tokenContent, $this->operators)) { - return; // not configured to be changed - } - - if (self::SINGLE_SPACE === $this->operators[$tokenContent]) { - $this->fixWhiteSpaceAroundOperatorToSingleSpace($tokens, $index); - - return; - } - - if (self::NO_SPACE === $this->operators[$tokenContent]) { - $this->fixWhiteSpaceAroundOperatorToNoSpace($tokens, $index); - - return; - } - - // schedule for alignment - $this->alignOperatorTokens[$tokenContent] = $this->operators[$tokenContent]; - - if (self::ALIGN === $this->operators[$tokenContent]) { - return; - } - - // fix white space after operator - if ($tokens[$index + 1]->isWhitespace()) { - if (self::ALIGN_SINGLE_SPACE_MINIMAL === $this->operators[$tokenContent]) { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - - return; - } - - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - - /** - * @param int $index - */ - private function fixWhiteSpaceAroundOperatorToSingleSpace(Tokens $tokens, $index) - { - // fix white space after operator - if ($tokens[$index + 1]->isWhitespace()) { - $content = $tokens[$index + 1]->getContent(); - if (' ' !== $content && false === strpos($content, "\n") && !$tokens[$tokens->getNextNonWhitespace($index + 1)]->isComment()) { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - } else { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - - // fix white space before operator - if ($tokens[$index - 1]->isWhitespace()) { - $content = $tokens[$index - 1]->getContent(); - if (' ' !== $content && false === strpos($content, "\n") && !$tokens[$tokens->getPrevNonWhitespace($index - 1)]->isComment()) { - $tokens[$index - 1] = new Token([T_WHITESPACE, ' ']); - } - } else { - $tokens->insertAt($index, new Token([T_WHITESPACE, ' '])); - } - } - - /** - * @param int $index - */ - private function fixWhiteSpaceAroundOperatorToNoSpace(Tokens $tokens, $index) - { - // fix white space after operator - if ($tokens[$index + 1]->isWhitespace()) { - $content = $tokens[$index + 1]->getContent(); - if (false === strpos($content, "\n") && !$tokens[$tokens->getNextNonWhitespace($index + 1)]->isComment()) { - $tokens->clearAt($index + 1); - } - } - - // fix white space before operator - if ($tokens[$index - 1]->isWhitespace()) { - $content = $tokens[$index - 1]->getContent(); - if (false === strpos($content, "\n") && !$tokens[$tokens->getPrevNonWhitespace($index - 1)]->isComment()) { - $tokens->clearAt($index - 1); - } - } - } - - /** - * @param int $index - * - * @return false|int index of T_DECLARE where the `=` belongs to or `false` - */ - private function isEqualPartOfDeclareStatement(Tokens $tokens, $index) - { - $prevMeaningfulIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevMeaningfulIndex]->isGivenKind(T_STRING)) { - $prevMeaningfulIndex = $tokens->getPrevMeaningfulToken($prevMeaningfulIndex); - if ($tokens[$prevMeaningfulIndex]->equals('(')) { - $prevMeaningfulIndex = $tokens->getPrevMeaningfulToken($prevMeaningfulIndex); - if ($tokens[$prevMeaningfulIndex]->isGivenKind(T_DECLARE)) { - return $prevMeaningfulIndex; - } - } - } - - return false; - } - - /** - * @return array - */ - private function resolveOperatorsFromConfig() - { - $operators = []; - - if (null !== $this->configuration['default']) { - foreach (self::$supportedOperators as $operator) { - $operators[$operator] = $this->configuration['default']; - } - } - - foreach ($this->configuration['operators'] as $operator => $value) { - if (null === $value) { - unset($operators[$operator]); - } else { - $operators[$operator] = $value; - } - } - - if (!\defined('T_SPACESHIP')) { - unset($operators['<=>']); - } - - if (!\defined('T_COALESCE')) { - unset($operators['??']); - } - - if (!\defined('T_COALESCE_EQUAL')) { - unset($operators['??=']); - } - - return $operators; - } - - /** - * @return array - */ - private function resolveOldConfig(array $configuration) - { - $newConfig = [ - 'operators' => [], - ]; - - foreach ($configuration as $name => $setting) { - if ('align_double_arrow' === $name) { - if (true === $configuration[$name]) { - $newConfig['operators']['=>'] = self::ALIGN; - } elseif (false === $configuration[$name]) { - $newConfig['operators']['=>'] = self::SINGLE_SPACE; - } elseif (null !== $configuration[$name]) { - throw new InvalidFixerConfigurationException( - $this->getName(), - sprintf( - 'Invalid configuration: The option "align_double_arrow" with value %s is invalid. Accepted values are: true, false, null.', - $configuration[$name] - ) - ); - } - } elseif ('align_equals' === $name) { - if (true === $configuration[$name]) { - $newConfig['operators']['='] = self::ALIGN; - } elseif (false === $configuration[$name]) { - $newConfig['operators']['='] = self::SINGLE_SPACE; - } elseif (null !== $configuration[$name]) { - throw new InvalidFixerConfigurationException( - $this->getName(), - sprintf( - 'Invalid configuration: The option "align_equals" with value %s is invalid. Accepted values are: true, false, null.', - $configuration[$name] - ) - ); - } - } else { - throw new InvalidFixerConfigurationException($this->getName(), 'Mixing old configuration with new configuration is not allowed.'); - } - } - - $message = sprintf( - 'Given configuration is deprecated and will be removed in 3.0. Use configuration %s as replacement for %s.', - HelpCommand::toString($newConfig), - HelpCommand::toString($configuration) - ); - - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - throw new InvalidFixerConfigurationException($this->getName(), "{$message} This check was performed as `PHP_CS_FIXER_FUTURE_MODE` env var is set."); - } - - @trigger_error($message, E_USER_DEPRECATED); - - return $newConfig; - } - - // Alignment logic related methods - - /** - * @param array $toAlign - */ - private function fixAlignment(Tokens $tokens, array $toAlign) - { - $this->deepestLevel = 0; - $this->currentLevel = 0; - - foreach ($toAlign as $tokenContent => $alignStrategy) { - // This fixer works partially on Tokens and partially on string representation of code. - // During the process of fixing internal state of single Token may be affected by injecting ALIGN_PLACEHOLDER to its content. - // The placeholder will be resolved by `replacePlaceholders` method by removing placeholder or changing it into spaces. - // That way of fixing the code causes disturbances in marking Token as changed - if code is perfectly valid then placeholder - // still be injected and removed, which will cause the `changed` flag to be set. - // To handle that unwanted behavior we work on clone of Tokens collection and then override original collection with fixed collection. - $tokensClone = clone $tokens; - - if ('=>' === $tokenContent) { - $this->injectAlignmentPlaceholdersForArrow($tokensClone, 0, \count($tokens)); - } else { - $this->injectAlignmentPlaceholders($tokensClone, 0, \count($tokens), $tokenContent); - } - - // for all tokens that should be aligned but do not have anything to align with, fix spacing if needed - if (self::ALIGN_SINGLE_SPACE === $alignStrategy || self::ALIGN_SINGLE_SPACE_MINIMAL === $alignStrategy) { - if ('=>' === $tokenContent) { - for ($index = $tokens->count() - 2; $index > 0; --$index) { - if ($tokens[$index]->isGivenKind(T_DOUBLE_ARROW)) { // always binary operator, never part of declare statement - $this->fixWhiteSpaceBeforeOperator($tokensClone, $index, $alignStrategy); - } - } - } elseif ('=' === $tokenContent) { - for ($index = $tokens->count() - 2; $index > 0; --$index) { - if ('=' === $tokens[$index]->getContent() && !$this->isEqualPartOfDeclareStatement($tokens, $index) && $this->tokensAnalyzer->isBinaryOperator($index)) { - $this->fixWhiteSpaceBeforeOperator($tokensClone, $index, $alignStrategy); - } - } - } else { - for ($index = $tokens->count() - 2; $index > 0; --$index) { - $content = $tokens[$index]->getContent(); - if (strtolower($content) === $tokenContent && $this->tokensAnalyzer->isBinaryOperator($index)) { // never part of declare statement - $this->fixWhiteSpaceBeforeOperator($tokensClone, $index, $alignStrategy); - } - } - } - } - - $tokens->setCode($this->replacePlaceholders($tokensClone, $alignStrategy)); - } - } - - /** - * @param int $startAt - * @param int $endAt - * @param string $tokenContent - */ - private function injectAlignmentPlaceholders(Tokens $tokens, $startAt, $endAt, $tokenContent) - { - for ($index = $startAt; $index < $endAt; ++$index) { - $token = $tokens[$index]; - - $content = $token->getContent(); - if ( - strtolower($content) === $tokenContent - && $this->tokensAnalyzer->isBinaryOperator($index) - && ('=' !== $content || !$this->isEqualPartOfDeclareStatement($tokens, $index)) - ) { - $tokens[$index] = new Token(sprintf(self::ALIGN_PLACEHOLDER, $this->deepestLevel).$content); - - continue; - } - - if ($token->isGivenKind(T_FUNCTION)) { - ++$this->deepestLevel; - - continue; - } - - if ($token->equals('(')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($token->equals('[')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index); - - continue; - } - } - } - - /** - * @param int $startAt - * @param int $endAt - */ - private function injectAlignmentPlaceholdersForArrow(Tokens $tokens, $startAt, $endAt) - { - for ($index = $startAt; $index < $endAt; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind([T_FOREACH, T_FOR, T_WHILE, T_IF, T_SWITCH])) { - $index = $tokens->getNextMeaningfulToken($index); - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($token->isGivenKind(T_ARRAY)) { // don't use "$tokens->isArray()" here, short arrays are handled in the next case - $from = $tokens->getNextMeaningfulToken($index); - $until = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $from); - $index = $until; - - $this->injectArrayAlignmentPlaceholders($tokens, $from + 1, $until - 1); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $from = $index; - $until = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $from); - $index = $until; - - $this->injectArrayAlignmentPlaceholders($tokens, $from + 1, $until - 1); - - continue; - } - - if ($token->isGivenKind(T_DOUBLE_ARROW)) { // no need to analyze for `isBinaryOperator` (always true), nor if part of declare statement (not valid PHP) - $tokenContent = sprintf(self::ALIGN_PLACEHOLDER, $this->currentLevel).$token->getContent(); - - $nextToken = $tokens[$index + 1]; - if (!$nextToken->isWhitespace()) { - $tokenContent .= ' '; - } elseif ($nextToken->isWhitespace(" \t")) { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - - $tokens[$index] = new Token([T_DOUBLE_ARROW, $tokenContent]); - - continue; - } - - if ($token->equals(';')) { - ++$this->deepestLevel; - ++$this->currentLevel; - - continue; - } - - if ($token->equals(',')) { - for ($i = $index; $i < $endAt - 1; ++$i) { - if (false !== strpos($tokens[$i - 1]->getContent(), "\n")) { - break; - } - - if ($tokens[$i + 1]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - $arrayStartIndex = $tokens[$i + 1]->isGivenKind(T_ARRAY) - ? $tokens->getNextMeaningfulToken($i + 1) - : $i + 1 - ; - $blockType = Tokens::detectBlockType($tokens[$arrayStartIndex]); - $arrayEndIndex = $tokens->findBlockEnd($blockType['type'], $arrayStartIndex); - - if ($tokens->isPartialCodeMultiline($arrayStartIndex, $arrayEndIndex)) { - break; - } - } - - ++$index; - } - } - } - } - - /** - * @param int $from - * @param int $until - */ - private function injectArrayAlignmentPlaceholders(Tokens $tokens, $from, $until) - { - // Only inject placeholders for multi-line arrays - if ($tokens->isPartialCodeMultiline($from, $until)) { - ++$this->deepestLevel; - ++$this->currentLevel; - $this->injectAlignmentPlaceholdersForArrow($tokens, $from, $until); - --$this->currentLevel; - } - } - - /** - * @param int $index - * @param string $alignStrategy - */ - private function fixWhiteSpaceBeforeOperator(Tokens $tokens, $index, $alignStrategy) - { - // fix white space after operator is not needed as BinaryOperatorSpacesFixer took care of this (if strategy is _not_ ALIGN) - if (!$tokens[$index - 1]->isWhitespace()) { - $tokens->insertAt($index, new Token([T_WHITESPACE, ' '])); - - return; - } - - if (self::ALIGN_SINGLE_SPACE_MINIMAL !== $alignStrategy || $tokens[$tokens->getPrevNonWhitespace($index - 1)]->isComment()) { - return; - } - - $content = $tokens[$index - 1]->getContent(); - if (' ' !== $content && false === strpos($content, "\n")) { - $tokens[$index - 1] = new Token([T_WHITESPACE, ' ']); - } - } - - /** - * Look for group of placeholders and provide vertical alignment. - * - * @param string $alignStrategy - * - * @return string - */ - private function replacePlaceholders(Tokens $tokens, $alignStrategy) - { - $tmpCode = $tokens->generateCode(); - - for ($j = 0; $j <= $this->deepestLevel; ++$j) { - $placeholder = sprintf(self::ALIGN_PLACEHOLDER, $j); - - if (false === strpos($tmpCode, $placeholder)) { - continue; - } - - $lines = explode("\n", $tmpCode); - $groups = []; - $groupIndex = 0; - $groups[$groupIndex] = []; - - foreach ($lines as $index => $line) { - if (substr_count($line, $placeholder) > 0) { - $groups[$groupIndex][] = $index; - } else { - ++$groupIndex; - $groups[$groupIndex] = []; - } - } - - foreach ($groups as $group) { - if (\count($group) < 1) { - continue; - } - - if (self::ALIGN !== $alignStrategy) { - // move place holders to match strategy - foreach ($group as $index) { - $currentPosition = strpos($lines[$index], $placeholder); - $before = substr($lines[$index], 0, $currentPosition); - - if (self::ALIGN_SINGLE_SPACE === $alignStrategy) { - if (1 > \strlen($before) || ' ' !== substr($before, -1)) { // if last char of before-content is not ' '; add it - $before .= ' '; - } - } elseif (self::ALIGN_SINGLE_SPACE_MINIMAL === $alignStrategy) { - if (1 !== Preg::match('/^\h+$/', $before)) { // if indent; do not move, leave to other fixer - $before = rtrim($before).' '; - } - } - - $lines[$index] = $before.substr($lines[$index], $currentPosition); - } - } - - $rightmostSymbol = 0; - foreach ($group as $index) { - $rightmostSymbol = max($rightmostSymbol, strpos(utf8_decode($lines[$index]), $placeholder)); - } - - foreach ($group as $index) { - $line = $lines[$index]; - $currentSymbol = strpos(utf8_decode($line), $placeholder); - $delta = abs($rightmostSymbol - $currentSymbol); - - if ($delta > 0) { - $line = str_replace($placeholder, str_repeat(' ', $delta).$placeholder, $line); - $lines[$index] = $line; - } - } - } - - $tmpCode = str_replace($placeholder, '', implode("\n", $lines)); - } - - return $tmpCode; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php deleted file mode 100644 index 60a1a96..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php +++ /dev/null @@ -1,161 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class ConcatSpaceFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - private $fixCallback; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - if ('one' === $this->configuration['spacing']) { - $this->fixCallback = 'fixConcatenationToSingleSpace'; - } else { - $this->fixCallback = 'fixConcatenationToNoSpace'; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Concatenation should be spaced according configuration.', - [ - new CodeSample( - " 'none'] - ), - new CodeSample( - " 'one'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after SingleLineThrowFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound('.'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $callBack = $this->fixCallback; - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if ($tokens[$index]->equals('.')) { - $this->{$callBack}($tokens, $index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('spacing', 'Spacing to apply around concatenation operator.')) - ->setAllowedValues(['one', 'none']) - ->setDefault('none') - ->getOption(), - ]); - } - - /** - * @param int $index index of concatenation '.' token - */ - private function fixConcatenationToNoSpace(Tokens $tokens, $index) - { - $prevNonWhitespaceToken = $tokens[$tokens->getPrevNonWhitespace($index)]; - if (!$prevNonWhitespaceToken->isGivenKind([T_LNUMBER, T_COMMENT, T_DOC_COMMENT]) || '/*' === substr($prevNonWhitespaceToken->getContent(), 0, 2)) { - $tokens->removeLeadingWhitespace($index, " \t"); - } - - if (!$tokens[$tokens->getNextNonWhitespace($index)]->isGivenKind([T_LNUMBER, T_COMMENT, T_DOC_COMMENT])) { - $tokens->removeTrailingWhitespace($index, " \t"); - } - } - - /** - * @param int $index index of concatenation '.' token - */ - private function fixConcatenationToSingleSpace(Tokens $tokens, $index) - { - $this->fixWhiteSpaceAroundConcatToken($tokens, $index, 1); - $this->fixWhiteSpaceAroundConcatToken($tokens, $index, -1); - } - - /** - * @param int $index index of concatenation '.' token - * @param int $offset 1 or -1 - */ - private function fixWhiteSpaceAroundConcatToken(Tokens $tokens, $index, $offset) - { - $offsetIndex = $index + $offset; - - if (!$tokens[$offsetIndex]->isWhitespace()) { - $tokens->insertAt($index + (1 === $offset ?: 0), new Token([T_WHITESPACE, ' '])); - - return; - } - - if (false !== strpos($tokens[$offsetIndex]->getContent(), "\n")) { - return; - } - - if ($tokens[$index + $offset * 2]->isComment()) { - return; - } - - $tokens[$offsetIndex] = new Token([T_WHITESPACE, ' ']); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php deleted file mode 100644 index 8297273..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php +++ /dev/null @@ -1,217 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gregor Harlan - * @author Kuba Werłos - */ -final class IncrementStyleFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @internal - */ - const STYLE_PRE = 'pre'; - - /** - * @internal - */ - const STYLE_POST = 'post'; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Pre- or post-increment and decrement operators should be used if possible.', - [ - new CodeSample(" self::STYLE_POST] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after StandardizeIncrementFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound([T_INC, T_DEC]); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('style', 'Whether to use pre- or post-increment and decrement operators.')) - ->setAllowedValues([self::STYLE_PRE, self::STYLE_POST]) - ->setDefault(self::STYLE_PRE) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind([T_INC, T_DEC])) { - continue; - } - - if (self::STYLE_PRE === $this->configuration['style'] && $tokensAnalyzer->isUnarySuccessorOperator($index)) { - $nextToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - if (!$nextToken->equalsAny([';', ')'])) { - continue; - } - - $startIndex = $this->findStart($tokens, $index); - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($startIndex)]; - if ($prevToken->equalsAny([';', '{', '}', [T_OPEN_TAG], ')'])) { - $tokens->clearAt($index); - $tokens->insertAt($startIndex, clone $token); - } - } elseif (self::STYLE_POST === $this->configuration['style'] && $tokensAnalyzer->isUnaryPredecessorOperator($index)) { - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - if (!$prevToken->equalsAny([';', '{', '}', [T_OPEN_TAG], ')'])) { - continue; - } - - $endIndex = $this->findEnd($tokens, $index); - - $nextToken = $tokens[$tokens->getNextMeaningfulToken($endIndex)]; - if ($nextToken->equalsAny([';', ')'])) { - $tokens->clearAt($index); - $tokens->insertAt($tokens->getNextNonWhitespace($endIndex), clone $token); - } - } - } - } - - /** - * @param int $index - * - * @return int - */ - private function findEnd(Tokens $tokens, $index) - { - $nextIndex = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$nextIndex]; - - while ($nextToken->equalsAny([ - '$', - '[', - [CT::T_DYNAMIC_PROP_BRACE_OPEN], - [CT::T_DYNAMIC_VAR_BRACE_OPEN], - [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN], - [T_NS_SEPARATOR], - [T_STATIC], - [T_STRING], - [T_VARIABLE], - ])) { - $blockType = Tokens::detectBlockType($nextToken); - if (null !== $blockType) { - $nextIndex = $tokens->findBlockEnd($blockType['type'], $nextIndex); - } - $index = $nextIndex; - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - $nextToken = $tokens[$nextIndex]; - } - - if ($nextToken->isGivenKind(T_OBJECT_OPERATOR)) { - return $this->findEnd($tokens, $nextIndex); - } - - if ($nextToken->isGivenKind(T_PAAMAYIM_NEKUDOTAYIM)) { - return $this->findEnd($tokens, $tokens->getNextMeaningfulToken($nextIndex)); - } - - return $index; - } - - /** - * @param int $index - * - * @return int - */ - private function findStart(Tokens $tokens, $index) - { - do { - $index = $tokens->getPrevMeaningfulToken($index); - $token = $tokens[$index]; - - $blockType = Tokens::detectBlockType($token); - if (null !== $blockType && !$blockType['isStart']) { - $index = $tokens->findBlockStart($blockType['type'], $index); - $token = $tokens[$index]; - } - } while (!$token->equalsAny(['$', [T_VARIABLE]])); - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - - if ($prevToken->equals('$')) { - $index = $prevIndex; - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - } - - if ($prevToken->isGivenKind(T_OBJECT_OPERATOR)) { - return $this->findStart($tokens, $prevIndex); - } - - if ($prevToken->isGivenKind(T_PAAMAYIM_NEKUDOTAYIM)) { - $prevPrevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - if (!$tokens[$prevPrevIndex]->isGivenKind([T_STATIC, T_STRING])) { - return $this->findStart($tokens, $prevIndex); - } - - $index = $tokens->getTokenNotOfKindSibling($prevIndex, -1, [[T_NS_SEPARATOR], [T_STATIC], [T_STRING]]); - $index = $tokens->getNextMeaningfulToken($index); - } - - return $index; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LogicalOperatorsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LogicalOperatorsFixer.php deleted file mode 100644 index 30d4fc3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LogicalOperatorsFixer.php +++ /dev/null @@ -1,76 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Haralan Dobrev - */ -final class LogicalOperatorsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Use `&&` and `||` logical operators instead of `and` and `or`.', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_LOGICAL_AND, T_LOGICAL_OR]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(T_LOGICAL_AND)) { - $tokens[$index] = new Token([T_BOOLEAN_AND, '&&']); - } elseif ($token->isGivenKind(T_LOGICAL_OR)) { - $tokens[$index] = new Token([T_BOOLEAN_OR, '||']); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php deleted file mode 100644 index c3ef617..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php +++ /dev/null @@ -1,150 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class NewWithBracesFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'All instances created with new keyword must be followed by braces.', - [new CodeSample("isTokenKindFound(T_NEW); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - static $nextTokenKinds = null; - - if (null === $nextTokenKinds) { - $nextTokenKinds = [ - '?', - ';', - ',', - '(', - ')', - '[', - ']', - ':', - '<', - '>', - '+', - '-', - '*', - '/', - '%', - '&', - '^', - '|', - [T_CLASS], - [T_IS_SMALLER_OR_EQUAL], - [T_IS_GREATER_OR_EQUAL], - [T_IS_EQUAL], - [T_IS_NOT_EQUAL], - [T_IS_IDENTICAL], - [T_IS_NOT_IDENTICAL], - [T_CLOSE_TAG], - [T_LOGICAL_AND], - [T_LOGICAL_OR], - [T_LOGICAL_XOR], - [T_BOOLEAN_AND], - [T_BOOLEAN_OR], - [T_SL], - [T_SR], - [T_INSTANCEOF], - [T_AS], - [T_DOUBLE_ARROW], - [T_POW], - [CT::T_ARRAY_SQUARE_BRACE_OPEN], - [CT::T_ARRAY_SQUARE_BRACE_CLOSE], - [CT::T_BRACE_CLASS_INSTANTIATION_OPEN], - [CT::T_BRACE_CLASS_INSTANTIATION_CLOSE], - ]; - - if (\defined('T_SPACESHIP')) { - $nextTokenKinds[] = [T_SPACESHIP]; - } - } - - for ($index = $tokens->count() - 3; $index > 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_NEW)) { - continue; - } - - $nextIndex = $tokens->getNextTokenOfKind($index, $nextTokenKinds); - $nextToken = $tokens[$nextIndex]; - - // new anonymous class definition - if ($nextToken->isGivenKind(T_CLASS)) { - if (!$tokens[$tokens->getNextMeaningfulToken($nextIndex)]->equals('(')) { - $this->insertBracesAfter($tokens, $nextIndex); - } - - continue; - } - - // entrance into array index syntax - need to look for exit - while ($nextToken->equals('[') || $nextToken->isGivenKind(CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN)) { - $nextIndex = $tokens->findBlockEnd($tokens->detectBlockType($nextToken)['type'], $nextIndex) + 1; - $nextToken = $tokens[$nextIndex]; - } - - // new statement has a gap in it - advance to the next token - if ($nextToken->isWhitespace()) { - $nextIndex = $tokens->getNextNonWhitespace($nextIndex); - $nextToken = $tokens[$nextIndex]; - } - - // new statement with () - nothing to do - if ($nextToken->equals('(') || $nextToken->isGivenKind(T_OBJECT_OPERATOR)) { - continue; - } - - $this->insertBracesAfter($tokens, $tokens->getPrevMeaningfulToken($nextIndex)); - } - } - - /** - * @param int $index - */ - private function insertBracesAfter(Tokens $tokens, $index) - { - $tokens->insertAt(++$index, [new Token('('), new Token(')')]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSpaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSpaceFixer.php deleted file mode 100644 index d1beb31..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSpaceFixer.php +++ /dev/null @@ -1,81 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Javier Spagnoletti - */ -final class NotOperatorWithSpaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Logical NOT operators (`!`) should have leading and trailing whitespaces.', - [new CodeSample( - 'isTokenKindFound('!'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ($token->equals('!')) { - if (!$tokens[$index + 1]->isWhitespace()) { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - - if (!$tokens[$index - 1]->isWhitespace()) { - $tokens->insertAt($index, new Token([T_WHITESPACE, ' '])); - } - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSuccessorSpaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSuccessorSpaceFixer.php deleted file mode 100644 index feb1b8c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSuccessorSpaceFixer.php +++ /dev/null @@ -1,79 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Javier Spagnoletti - */ -final class NotOperatorWithSuccessorSpaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Logical NOT operators (`!`) should have one trailing whitespace.', - [new CodeSample( - 'isTokenKindFound('!'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ($token->equals('!')) { - if (!$tokens[$index + 1]->isWhitespace()) { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } else { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixer.php deleted file mode 100644 index 245791d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixer.php +++ /dev/null @@ -1,67 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - */ -final class ObjectOperatorWithoutWhitespaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There should not be space before or after object `T_OBJECT_OPERATOR` `->`.', - [new CodeSample(" b;\n")] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_OBJECT_OPERATOR); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - // [Structure] there should not be space before or after T_OBJECT_OPERATOR - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_OBJECT_OPERATOR)) { - continue; - } - - // clear whitespace before -> - if ($tokens[$index - 1]->isWhitespace(" \t") && !$tokens[$index - 2]->isComment()) { - $tokens->clearAt($index - 1); - } - - // clear whitespace after -> - if ($tokens[$index + 1]->isWhitespace(" \t") && !$tokens[$index + 2]->isComment()) { - $tokens->clearAt($index + 1); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/PreIncrementFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/PreIncrementFixer.php deleted file mode 100644 index 04b94b6..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/PreIncrementFixer.php +++ /dev/null @@ -1,56 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * @author Gregor Harlan - * - * @deprecated in 2.8, proxy to IncrementStyleFixer - */ -final class PreIncrementFixer extends AbstractProxyFixer implements DeprecatedFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Pre incrementation/decrementation should be used if possible.', - [new CodeSample("proxyFixers); - } - - /** - * {@inheritdoc} - */ - protected function createProxyFixers() - { - $fixer = new IncrementStyleFixer(); - $fixer->configure(['style' => 'pre']); - - return [$fixer]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeIncrementFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeIncrementFixer.php deleted file mode 100644 index 39013ec..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeIncrementFixer.php +++ /dev/null @@ -1,167 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author ntzm - */ -final class StandardizeIncrementFixer extends AbstractFixer -{ - /** - * @internal - */ - const EXPRESSION_END_TOKENS = [ - ';', - ')', - ']', - ',', - ':', - [CT::T_DYNAMIC_PROP_BRACE_CLOSE], - [CT::T_DYNAMIC_VAR_BRACE_CLOSE], - [T_CLOSE_TAG], - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Increment and decrement operators should be used if possible.', - [ - new CodeSample("isAnyTokenKindsFound([T_PLUS_EQUAL, T_MINUS_EQUAL]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index > 0; --$index) { - $expressionEnd = $tokens[$index]; - if (!$expressionEnd->equalsAny(self::EXPRESSION_END_TOKENS)) { - continue; - } - - $numberIndex = $tokens->getPrevMeaningfulToken($index); - $number = $tokens[$numberIndex]; - if (!$number->isGivenKind(T_LNUMBER) || '1' !== $number->getContent()) { - continue; - } - - $operatorIndex = $tokens->getPrevMeaningfulToken($numberIndex); - $operator = $tokens[$operatorIndex]; - if (!$operator->isGivenKind([T_PLUS_EQUAL, T_MINUS_EQUAL])) { - continue; - } - - $startIndex = $this->findStart($tokens, $tokens->getPrevMeaningfulToken($operatorIndex)); - - $this->clearRangeLeaveComments( - $tokens, - $tokens->getPrevMeaningfulToken($operatorIndex) + 1, - $numberIndex - ); - - $tokens->insertAt( - $startIndex, - new Token($operator->isGivenKind(T_PLUS_EQUAL) ? [T_INC, '++'] : [T_DEC, '--']) - ); - } - } - - /** - * Find the start of a reference. - * - * @param int $index - * - * @return int - */ - private function findStart(Tokens $tokens, $index) - { - while (!$tokens[$index]->equalsAny(['$', [T_VARIABLE]])) { - if ($tokens[$index]->equals(']')) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index); - } elseif ($tokens[$index]->isGivenKind(CT::T_DYNAMIC_PROP_BRACE_CLOSE)) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_DYNAMIC_PROP_BRACE, $index); - } elseif ($tokens[$index]->isGivenKind(CT::T_DYNAMIC_VAR_BRACE_CLOSE)) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_DYNAMIC_VAR_BRACE, $index); - } elseif ($tokens[$index]->isGivenKind(CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE)) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE, $index); - } else { - $index = $tokens->getPrevMeaningfulToken($index); - } - } - - while ($tokens[$tokens->getPrevMeaningfulToken($index)]->equals('$')) { - $index = $tokens->getPrevMeaningfulToken($index); - } - - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_OBJECT_OPERATOR)) { - return $this->findStart($tokens, $tokens->getPrevMeaningfulToken($index)); - } - - return $index; - } - - /** - * Clear tokens in the given range unless they are comments. - * - * @param int $indexStart - * @param int $indexEnd - */ - private function clearRangeLeaveComments(Tokens $tokens, $indexStart, $indexEnd) - { - for ($i = $indexStart; $i <= $indexEnd; ++$i) { - $token = $tokens[$i]; - - if ($token->isComment()) { - continue; - } - - if ($token->isWhitespace("\n\r")) { - continue; - } - - $tokens->clearAt($i); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeNotEqualsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeNotEqualsFixer.php deleted file mode 100644 index d240e33..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeNotEqualsFixer.php +++ /dev/null @@ -1,66 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class StandardizeNotEqualsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replace all `<>` with `!=`.', - [new CodeSample(" \$c;\n")] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BinaryOperatorSpacesFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_IS_NOT_EQUAL); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(T_IS_NOT_EQUAL)) { - $tokens[$index] = new Token([T_IS_NOT_EQUAL, '!=']); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php deleted file mode 100644 index 6560ada..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php +++ /dev/null @@ -1,121 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class TernaryOperatorSpacesFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Standardize spaces around ternary operator.', - [new CodeSample("isAllTokenKindsFound(['?', ':']); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $ternaryLevel = 0; - - foreach ($tokens as $index => $token) { - if ($token->equals('?')) { - ++$ternaryLevel; - - $nextNonWhitespaceIndex = $tokens->getNextNonWhitespace($index); - $nextNonWhitespaceToken = $tokens[$nextNonWhitespaceIndex]; - - if ($nextNonWhitespaceToken->equals(':')) { - // for `$a ?: $b` remove spaces between `?` and `:` - if ($tokens[$index + 1]->isWhitespace()) { - $tokens->clearAt($index + 1); - } - } else { - // for `$a ? $b : $c` ensure space after `?` - $this->ensureWhitespaceExistence($tokens, $index + 1, true); - } - - // for `$a ? $b : $c` ensure space before `?` - $this->ensureWhitespaceExistence($tokens, $index - 1, false); - - continue; - } - - if ($ternaryLevel && $token->equals(':')) { - // for `$a ? $b : $c` ensure space after `:` - $this->ensureWhitespaceExistence($tokens, $index + 1, true); - - $prevNonWhitespaceToken = $tokens[$tokens->getPrevNonWhitespace($index)]; - - if (!$prevNonWhitespaceToken->equals('?')) { - // for `$a ? $b : $c` ensure space before `:` - $this->ensureWhitespaceExistence($tokens, $index - 1, false); - } - - --$ternaryLevel; - } - } - } - - /** - * @param int $index - * @param bool $after - */ - private function ensureWhitespaceExistence(Tokens $tokens, $index, $after) - { - if ($tokens[$index]->isWhitespace()) { - if ( - false === strpos($tokens[$index]->getContent(), "\n") - && !$tokens[$index - 1]->isComment() - ) { - $tokens[$index] = new Token([T_WHITESPACE, ' ']); - } - - return; - } - - $index += $after ? 0 : 1; - $tokens->insertAt($index, new Token([T_WHITESPACE, ' '])); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php deleted file mode 100644 index 28bf095..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php +++ /dev/null @@ -1,215 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class TernaryToNullCoalescingFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Use `null` coalescing operator `??` where possible. Requires PHP >= 7.0.', - [ - new VersionSpecificCodeSample( - "= 70000 && $tokens->isTokenKindFound(T_ISSET); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $issetIndexes = array_keys($tokens->findGivenKind(T_ISSET)); - while ($issetIndex = array_pop($issetIndexes)) { - $this->fixIsset($tokens, $issetIndex); - } - } - - /** - * @param int $index of `T_ISSET` token - */ - private function fixIsset(Tokens $tokens, $index) - { - $prevTokenIndex = $tokens->getPrevMeaningfulToken($index); - if ($this->isHigherPrecedenceAssociativityOperator($tokens[$prevTokenIndex])) { - return; - } - - $startBraceIndex = $tokens->getNextTokenOfKind($index, ['(']); - $endBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startBraceIndex); - - $ternaryQuestionMarkIndex = $tokens->getNextMeaningfulToken($endBraceIndex); - if (!$tokens[$ternaryQuestionMarkIndex]->equals('?')) { - return; // we are not in a ternary operator - } - - // search what is inside the isset() - $issetTokens = $this->getMeaningfulSequence($tokens, $startBraceIndex, $endBraceIndex); - if ($this->hasChangingContent($issetTokens)) { - return; // some weird stuff inside the isset - } - - // search what is inside the middle argument of ternary operator - $ternaryColonIndex = $tokens->getNextTokenOfKind($ternaryQuestionMarkIndex, [':']); - $ternaryFirstOperandTokens = $this->getMeaningfulSequence($tokens, $ternaryQuestionMarkIndex, $ternaryColonIndex); - - if ($issetTokens->generateCode() !== $ternaryFirstOperandTokens->generateCode()) { - return; // regardless of non-meaningful tokens, the operands are different - } - - $ternaryFirstOperandIndex = $tokens->getNextMeaningfulToken($ternaryQuestionMarkIndex); - - // preserve comments and spaces - $comments = []; - $commentStarted = false; - for ($loopIndex = $index; $loopIndex < $ternaryFirstOperandIndex; ++$loopIndex) { - if ($tokens[$loopIndex]->isComment()) { - $comments[] = $tokens[$loopIndex]; - $commentStarted = true; - } elseif ($commentStarted) { - if ($tokens[$loopIndex]->isWhitespace()) { - $comments[] = $tokens[$loopIndex]; - } - - $commentStarted = false; - } - } - - $tokens[$ternaryColonIndex] = new Token([T_COALESCE, '??']); - $tokens->overrideRange($index, $ternaryFirstOperandIndex - 1, $comments); - } - - /** - * Get the sequence of meaningful tokens and returns a new Tokens instance. - * - * @param int $start start index - * @param int $end end index - * - * @return Tokens - */ - private function getMeaningfulSequence(Tokens $tokens, $start, $end) - { - $sequence = []; - $index = $start; - while ($index < $end) { - $index = $tokens->getNextMeaningfulToken($index); - if ($index >= $end || null === $index) { - break; - } - - $sequence[] = $tokens[$index]; - } - - return Tokens::fromArray($sequence); - } - - /** - * Check if the requested token is an operator computed - * before the ternary operator along with the `isset()`. - * - * @return bool - */ - private function isHigherPrecedenceAssociativityOperator(Token $token) - { - static $operatorsPerId = [ - T_ARRAY_CAST => true, - T_BOOLEAN_AND => true, - T_BOOLEAN_OR => true, - T_BOOL_CAST => true, - T_COALESCE => true, - T_DEC => true, - T_DOUBLE_CAST => true, - T_INC => true, - T_INT_CAST => true, - T_IS_EQUAL => true, - T_IS_GREATER_OR_EQUAL => true, - T_IS_IDENTICAL => true, - T_IS_NOT_EQUAL => true, - T_IS_NOT_IDENTICAL => true, - T_IS_SMALLER_OR_EQUAL => true, - T_OBJECT_CAST => true, - T_POW => true, - T_SL => true, - T_SPACESHIP => true, - T_SR => true, - T_STRING_CAST => true, - T_UNSET_CAST => true, - ]; - - static $operatorsPerContent = [ - '!', - '%', - '&', - '*', - '+', - '-', - '/', - ':', - '^', - '|', - '~', - ]; - - return isset($operatorsPerId[$token->getId()]) || $token->equalsAny($operatorsPerContent); - } - - /** - * Check if the `isset()` content may change if called multiple times. - * - * @param Tokens $tokens The original token list - * - * @return bool - */ - private function hasChangingContent(Tokens $tokens) - { - static $operatorsPerId = [ - T_DEC, - T_INC, - T_STRING, - T_YIELD, - T_YIELD_FROM, - ]; - - foreach ($tokens as $token) { - if ($token->isGivenKind($operatorsPerId) || $token->equals('(')) { - return true; - } - } - - return false; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php deleted file mode 100644 index 697cc6d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php +++ /dev/null @@ -1,78 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gregor Harlan - */ -final class UnaryOperatorSpacesFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Unary operators should be placed adjacent to their operands.', - [new CodeSample("count() - 1; $index >= 0; --$index) { - if ($tokensAnalyzer->isUnarySuccessorOperator($index)) { - if (!$tokens[$tokens->getPrevNonWhitespace($index)]->isComment()) { - $tokens->removeLeadingWhitespace($index); - } - - continue; - } - - if ($tokensAnalyzer->isUnaryPredecessorOperator($index)) { - $tokens->removeTrailingWhitespace($index); - - continue; - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php deleted file mode 100644 index 871c149..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php +++ /dev/null @@ -1,98 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpTag; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Ceeram - */ -final class BlankLineAfterOpeningTagFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Ensure there is no code on the same line as the PHP open tag and it is followed by a blank line.', - [new CodeSample("isTokenKindFound(T_OPEN_TAG); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - // ignore files with short open tag and ignore non-monolithic files - if (!$tokens[0]->isGivenKind(T_OPEN_TAG) || !$tokens->isMonolithicPhp()) { - return; - } - - $newlineFound = false; - /** @var Token $token */ - foreach ($tokens as $token) { - if ($token->isWhitespace() && false !== strpos($token->getContent(), "\n")) { - $newlineFound = true; - - break; - } - } - - // ignore one-line files - if (!$newlineFound) { - return; - } - - $token = $tokens[0]; - - if (false === strpos($token->getContent(), "\n")) { - $tokens[0] = new Token([$token->getId(), rtrim($token->getContent()).$lineEnding]); - } - - if (false === strpos($tokens[1]->getContent(), "\n")) { - if ($tokens[1]->isWhitespace()) { - $tokens[1] = new Token([T_WHITESPACE, $lineEnding.$tokens[1]->getContent()]); - } else { - $tokens->insertAt(1, new Token([T_WHITESPACE, $lineEnding])); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php deleted file mode 100644 index b6c3b10..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php +++ /dev/null @@ -1,131 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpTag; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR1 ¶2.1. - * - * @author Dariusz Rumiński - */ -final class FullOpeningTagFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHP code must use the long `generateCode(); - - // replace all echo ' echo ' $token) { - if ($token->isGivenKind(T_OPEN_TAG)) { - $tokenContent = $token->getContent(); - - if ('isGivenKind([T_COMMENT, T_DOC_COMMENT, T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE, T_STRING])) { - $tokenContent = ''; - $tokenContentLength = 0; - $parts = explode('getContent()); - $iLast = \count($parts) - 1; - - foreach ($parts as $i => $part) { - $tokenContent .= $part; - $tokenContentLength += \strlen($part); - - if ($i !== $iLast) { - $originalTokenContent = substr($content, $tokensOldContentLength + $tokenContentLength, 5); - if ('getId(), $tokenContent]); - $token = $tokens[$index]; - } - - $tokensOldContentLength += \strlen($token->getContent()); - } - - $tokensOrg->overrideRange(0, $tokensOrg->count() - 1, $tokens); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/LinebreakAfterOpeningTagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/LinebreakAfterOpeningTagFixer.php deleted file mode 100644 index 5d59e52..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/LinebreakAfterOpeningTagFixer.php +++ /dev/null @@ -1,73 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpTag; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Ceeram - */ -final class LinebreakAfterOpeningTagFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Ensure there is no code on the same line as the PHP open tag.', - [new CodeSample("isTokenKindFound(T_OPEN_TAG); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - // ignore files with short open tag and ignore non-monolithic files - if (!$tokens[0]->isGivenKind(T_OPEN_TAG) || !$tokens->isMonolithicPhp()) { - return; - } - - $newlineFound = false; - foreach ($tokens as $token) { - if ($token->isWhitespace() && false !== strpos($token->getContent(), "\n")) { - $newlineFound = true; - - break; - } - } - - // ignore one-line files - if (!$newlineFound) { - return; - } - - $token = $tokens[0]; - $tokens[0] = new Token([$token->getId(), rtrim($token->getContent()).$this->whitespacesConfig->getLineEnding()]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php deleted file mode 100644 index 8b19366..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php +++ /dev/null @@ -1,69 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpTag; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶2.2. - * - * @author Dariusz Rumiński - */ -final class NoClosingTagFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'The closing `?>` tag MUST be omitted from files containing only PHP.', - [new CodeSample("\n")] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_CLOSE_TAG); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - if (\count($tokens) < 2 || !$tokens->isMonolithicPhp() || !$tokens->isTokenKindFound(T_CLOSE_TAG)) { - return; - } - - $closeTags = $tokens->findGivenKind(T_CLOSE_TAG); - $index = key($closeTags); - - if (isset($tokens[$index - 1]) && $tokens[$index - 1]->isWhitespace()) { - $tokens->clearAt($index - 1); - } - $tokens->clearAt($index); - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$prevIndex]->equalsAny([';', '}', [T_OPEN_TAG]])) { - $tokens->insertAt($prevIndex + 1, new Token(';')); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoShortEchoTagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoShortEchoTagFixer.php deleted file mode 100644 index 5ff7ae8..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoShortEchoTagFixer.php +++ /dev/null @@ -1,80 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpTag; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Vincent Klaiber - */ -final class NoShortEchoTagFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Replace short-echo `isTokenKindFound(T_OPEN_TAG_WITH_ECHO); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $i = \count($tokens); - - while ($i--) { - $token = $tokens[$i]; - - if (!$token->isGivenKind(T_OPEN_TAG_WITH_ECHO)) { - continue; - } - - $nextIndex = $i + 1; - - $tokens[$i] = new Token([T_OPEN_TAG, 'isWhitespace()) { - $tokens->insertAt($nextIndex, new Token([T_WHITESPACE, ' '])); - } - - $tokens->insertAt($nextIndex, new Token([T_ECHO, 'echo'])); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php deleted file mode 100644 index 080cf5c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php +++ /dev/null @@ -1,218 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitConstructFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - private static $assertionFixers = [ - 'assertSame' => 'fixAssertPositive', - 'assertEquals' => 'fixAssertPositive', - 'assertNotEquals' => 'fixAssertNegative', - 'assertNotSame' => 'fixAssertNegative', - ]; - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHPUnit assertion method calls like `->assertSame(true, $foo)` should be written with dedicated method like `->assertTrue($foo)`.', - [ - new CodeSample( - 'assertEquals(false, $b); -$this->assertSame(true, $a); -$this->assertNotEquals(null, $c); -$this->assertNotSame(null, $d); -' - ), - new CodeSample( - 'assertEquals(false, $b); -$this->assertSame(true, $a); -$this->assertNotEquals(null, $c); -$this->assertNotSame(null, $d); -', - ['assertions' => ['assertSame', 'assertNotSame']] - ), - ], - null, - 'Fixer could be risky if one is overriding PHPUnit\'s native methods.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpUnitDedicateAssertFixer. - */ - public function getPriority() - { - return -10; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - // no assertions to be fixed - fast return - if (empty($this->configuration['assertions'])) { - return; - } - - foreach ($this->configuration['assertions'] as $assertionMethod) { - $assertionFixer = self::$assertionFixers[$assertionMethod]; - - for ($index = 0, $limit = $tokens->count(); $index < $limit; ++$index) { - $index = $this->{$assertionFixer}($tokens, $index, $assertionMethod); - - if (null === $index) { - break; - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolverRootless('assertions', [ - (new FixerOptionBuilder('assertions', 'List of assertion methods to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(array_keys(self::$assertionFixers))]) - ->setDefault([ - 'assertEquals', - 'assertSame', - 'assertNotEquals', - 'assertNotSame', - ]) - ->getOption(), - ], $this->getName()); - } - - /** - * @param int $index - * @param string $method - * - * @return null|int - */ - private function fixAssertNegative(Tokens $tokens, $index, $method) - { - static $map = [ - 'false' => 'assertNotFalse', - 'null' => 'assertNotNull', - 'true' => 'assertNotTrue', - ]; - - return $this->fixAssert($map, $tokens, $index, $method); - } - - /** - * @param int $index - * @param string $method - * - * @return null|int - */ - private function fixAssertPositive(Tokens $tokens, $index, $method) - { - static $map = [ - 'false' => 'assertFalse', - 'null' => 'assertNull', - 'true' => 'assertTrue', - ]; - - return $this->fixAssert($map, $tokens, $index, $method); - } - - /** - * @param array $map - * @param int $index - * @param string $method - * - * @return null|int - */ - private function fixAssert(array $map, Tokens $tokens, $index, $method) - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - $sequence = $tokens->findSequence( - [ - [T_STRING, $method], - '(', - ], - $index - ); - - if (null === $sequence) { - return null; - } - - $sequenceIndexes = array_keys($sequence); - if (!$functionsAnalyzer->isTheSameClassCall($tokens, $sequenceIndexes[0])) { - return null; - } - - $sequenceIndexes[2] = $tokens->getNextMeaningfulToken($sequenceIndexes[1]); - $firstParameterToken = $tokens[$sequenceIndexes[2]]; - - if (!$firstParameterToken->isNativeConstant()) { - return $sequenceIndexes[2]; - } - - $sequenceIndexes[3] = $tokens->getNextMeaningfulToken($sequenceIndexes[2]); - - // return if first method argument is an expression, not value - if (!$tokens[$sequenceIndexes[3]]->equals(',')) { - return $sequenceIndexes[3]; - } - - $tokens[$sequenceIndexes[0]] = new Token([T_STRING, $map[strtolower($firstParameterToken->getContent())]]); - $tokens->clearRange($sequenceIndexes[2], $tokens->getNextNonWhitespace($sequenceIndexes[3]) - 1); - - return $sequenceIndexes[3]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php deleted file mode 100644 index 0c3e2a9..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php +++ /dev/null @@ -1,443 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - * @author Dariusz Rumiński - */ -final class PhpUnitDedicateAssertFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - private static $fixMap = [ - 'array_key_exists' => ['assertArrayNotHasKey', 'assertArrayHasKey'], - 'empty' => ['assertNotEmpty', 'assertEmpty'], - 'file_exists' => ['assertFileNotExists', 'assertFileExists'], - 'is_array' => true, - 'is_bool' => true, - 'is_callable' => true, - 'is_dir' => ['assertDirectoryNotExists', 'assertDirectoryExists'], - 'is_double' => true, - 'is_float' => true, - 'is_infinite' => ['assertFinite', 'assertInfinite'], - 'is_int' => true, - 'is_integer' => true, - 'is_long' => true, - 'is_nan' => [false, 'assertNan'], - 'is_null' => ['assertNotNull', 'assertNull'], - 'is_numeric' => true, - 'is_object' => true, - 'is_readable' => ['assertNotIsReadable', 'assertIsReadable'], - 'is_real' => true, - 'is_resource' => true, - 'is_scalar' => true, - 'is_string' => true, - 'is_writable' => ['assertNotIsWritable', 'assertIsWritable'], - ]; - - /** - * @var string[] - */ - private $functions = []; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - if (isset($this->configuration['functions'])) { - $this->functions = $this->configuration['functions']; - - return; - } - - // assertions added in 3.0: assertArrayNotHasKey assertArrayHasKey assertFileNotExists assertFileExists assertNotNull, assertNull - $this->functions = [ - 'array_key_exists', - 'file_exists', - 'is_null', - ]; - - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_3_5)) { - // assertions added in 3.5: assertInternalType assertNotEmpty assertEmpty - $this->functions = array_merge($this->functions, [ - 'empty', - 'is_array', - 'is_bool', - 'is_boolean', - 'is_callable', - 'is_double', - 'is_float', - 'is_int', - 'is_integer', - 'is_long', - 'is_numeric', - 'is_object', - 'is_real', - 'is_resource', - 'is_scalar', - 'is_string', - ]); - } - - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_0)) { - // assertions added in 5.0: assertFinite assertInfinite assertNan - $this->functions = array_merge($this->functions, [ - 'is_infinite', - 'is_nan', - ]); - } - - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_6)) { - // assertions added in 5.6: assertDirectoryExists assertDirectoryNotExists assertIsReadable assertNotIsReadable assertIsWritable assertNotIsWritable - $this->functions = array_merge($this->functions, [ - 'is_dir', - 'is_readable', - 'is_writable', - ]); - } - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHPUnit assertions like `assertInternalType`, `assertFileExists`, should be used over `assertTrue`.', - [ - new CodeSample( - 'assertTrue(is_float( $a), "my message"); -$this->assertTrue(is_nan($a)); -' - ), - new CodeSample( - 'assertTrue(is_dir($a)); -$this->assertTrue(is_writable($a)); -$this->assertTrue(is_readable($a)); -', - ['target' => PhpUnitTargetVersion::VERSION_5_6] - ), - ], - null, - 'Fixer could be risky if one is overriding PHPUnit\'s native methods.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpUnitDedicateAssertInternalTypeFixer. - * Must run after NoAliasFunctionsFixer, PhpUnitConstructFixer. - */ - public function getPriority() - { - return -15; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($this->getPreviousAssertCall($tokens) as $assertCall) { - // test and fix for assertTrue/False to dedicated asserts - if ('asserttrue' === $assertCall['loweredName'] || 'assertfalse' === $assertCall['loweredName']) { - $this->fixAssertTrueFalse($tokens, $assertCall); - - continue; - } - - if ( - 'assertsame' === $assertCall['loweredName'] - || 'assertnotsame' === $assertCall['loweredName'] - || 'assertequals' === $assertCall['loweredName'] - || 'assertnotequals' === $assertCall['loweredName'] - ) { - $this->fixAssertSameEquals($tokens, $assertCall); - - continue; - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $values = [ - 'array_key_exists', - 'empty', - 'file_exists', - 'is_array', - 'is_bool', - 'is_callable', - 'is_double', - 'is_float', - 'is_infinite', - 'is_int', - 'is_integer', - 'is_long', - 'is_nan', - 'is_null', - 'is_numeric', - 'is_object', - 'is_real', - 'is_resource', - 'is_scalar', - 'is_string', - ]; - - sort($values); - - return new FixerConfigurationResolverRootless('functions', [ - (new FixerOptionBuilder('functions', 'List of assertions to fix (overrides `target`).')) - ->setAllowedTypes(['null', 'array']) - ->setAllowedValues([ - null, - new AllowedValueSubset($values), - ]) - ->setDefault(null) - ->setDeprecationMessage('Use option `target` instead.') - ->getOption(), - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([ - PhpUnitTargetVersion::VERSION_3_0, - PhpUnitTargetVersion::VERSION_3_5, - PhpUnitTargetVersion::VERSION_5_0, - PhpUnitTargetVersion::VERSION_5_6, - PhpUnitTargetVersion::VERSION_NEWEST, - ]) - ->setDefault(PhpUnitTargetVersion::VERSION_5_0) // @TODO 3.x: change to `VERSION_NEWEST` - ->getOption(), - ], $this->getName()); - } - - private function fixAssertTrueFalse(Tokens $tokens, array $assertCall) - { - $testDefaultNamespaceTokenIndex = false; - $testIndex = $tokens->getNextMeaningfulToken($assertCall['openBraceIndex']); - - if (!$tokens[$testIndex]->isGivenKind([T_EMPTY, T_STRING])) { - if (!$tokens[$testIndex]->isGivenKind(T_NS_SEPARATOR)) { - return; - } - - $testDefaultNamespaceTokenIndex = $testIndex; - $testIndex = $tokens->getNextMeaningfulToken($testIndex); - } - - $testOpenIndex = $tokens->getNextMeaningfulToken($testIndex); - if (!$tokens[$testOpenIndex]->equals('(')) { - return; - } - - $testCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $testOpenIndex); - - $assertCallCloseIndex = $tokens->getNextMeaningfulToken($testCloseIndex); - if (!$tokens[$assertCallCloseIndex]->equalsAny([')', ','])) { - return; - } - - $isPositive = 'asserttrue' === $assertCall['loweredName']; - - $content = strtolower($tokens[$testIndex]->getContent()); - if (!\in_array($content, $this->functions, true)) { - return; - } - - if (\is_array(self::$fixMap[$content])) { - if (false !== self::$fixMap[$content][$isPositive]) { - $tokens[$assertCall['index']] = new Token([T_STRING, self::$fixMap[$content][$isPositive]]); - $this->removeFunctionCall($tokens, $testDefaultNamespaceTokenIndex, $testIndex, $testOpenIndex, $testCloseIndex); - } - - return; - } - - $type = substr($content, 3); - - $tokens[$assertCall['index']] = new Token([T_STRING, $isPositive ? 'assertInternalType' : 'assertNotInternalType']); - $tokens[$testIndex] = new Token([T_CONSTANT_ENCAPSED_STRING, "'".$type."'"]); - $tokens[$testOpenIndex] = new Token(','); - - $tokens->clearTokenAndMergeSurroundingWhitespace($testCloseIndex); - $commaIndex = $tokens->getPrevMeaningfulToken($testCloseIndex); - if ($tokens[$commaIndex]->equals(',')) { - $tokens->removeTrailingWhitespace($commaIndex); - $tokens->clearAt($commaIndex); - } - - if (!$tokens[$testOpenIndex + 1]->isWhitespace()) { - $tokens->insertAt($testOpenIndex + 1, new Token([T_WHITESPACE, ' '])); - } - - if (false !== $testDefaultNamespaceTokenIndex) { - $tokens->clearTokenAndMergeSurroundingWhitespace($testDefaultNamespaceTokenIndex); - } - } - - private function fixAssertSameEquals(Tokens $tokens, array $assertCall) - { - // @ $this->/self::assertEquals/Same([$nextIndex]) - $expectedIndex = $tokens->getNextMeaningfulToken($assertCall['openBraceIndex']); - - // do not fix - // let $a = [1,2]; $b = "2"; - // "$this->assertEquals("2", count($a)); $this->assertEquals($b, count($a)); $this->assertEquals(2.1, count($a));" - - if (!$tokens[$expectedIndex]->isGivenKind(T_LNUMBER)) { - return; - } - - // @ $this->/self::assertEquals/Same([$nextIndex,$commaIndex]) - $commaIndex = $tokens->getNextMeaningfulToken($expectedIndex); - if (!$tokens[$commaIndex]->equals(',')) { - return; - } - - // @ $this->/self::assertEquals/Same([$nextIndex,$commaIndex,$countCallIndex]) - $countCallIndex = $tokens->getNextMeaningfulToken($commaIndex); - if ($tokens[$countCallIndex]->isGivenKind(T_NS_SEPARATOR)) { - $defaultNamespaceTokenIndex = $countCallIndex; - $countCallIndex = $tokens->getNextMeaningfulToken($countCallIndex); - } else { - $defaultNamespaceTokenIndex = false; - } - - if (!$tokens[$countCallIndex]->isGivenKind(T_STRING)) { - return; - } - - $lowerContent = strtolower($tokens[$countCallIndex]->getContent()); - if ('count' !== $lowerContent && 'sizeof' !== $lowerContent) { - return; // not a call to "count" or "sizeOf" - } - - // @ $this->/self::assertEquals/Same([$nextIndex,$commaIndex,[$defaultNamespaceTokenIndex,]$countCallIndex,$countCallOpenBraceIndex]) - $countCallOpenBraceIndex = $tokens->getNextMeaningfulToken($countCallIndex); - if (!$tokens[$countCallOpenBraceIndex]->equals('(')) { - return; - } - - $countCallCloseBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $countCallOpenBraceIndex); - - $afterCountCallCloseBraceIndex = $tokens->getNextMeaningfulToken($countCallCloseBraceIndex); - if (!$tokens[$afterCountCallCloseBraceIndex]->equalsAny([')', ','])) { - return; - } - - $this->removeFunctionCall( - $tokens, - $defaultNamespaceTokenIndex, - $countCallIndex, - $countCallOpenBraceIndex, - $countCallCloseBraceIndex - ); - - $tokens[$assertCall['index']] = new Token([ - T_STRING, - false === strpos($assertCall['loweredName'], 'not', 6) ? 'assertCount' : 'assertNotCount', - ]); - } - - private function getPreviousAssertCall(Tokens $tokens) - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - for ($index = $tokens->count(); $index > 0; --$index) { - $index = $tokens->getPrevTokenOfKind($index, [[T_STRING]]); - if (null === $index) { - return; - } - - // test if "assert" something call - $loweredContent = strtolower($tokens[$index]->getContent()); - if ('assert' !== substr($loweredContent, 0, 6)) { - continue; - } - - // test candidate for simple calls like: ([\]+'some fixable call'(...)) - $openBraceIndex = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$openBraceIndex]->equals('(')) { - continue; - } - - if (!$functionsAnalyzer->isTheSameClassCall($tokens, $index)) { - continue; - } - - yield [ - 'index' => $index, - 'loweredName' => $loweredContent, - 'openBraceIndex' => $openBraceIndex, - 'closeBraceIndex' => $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openBraceIndex), - ]; - } - } - - /** - * @param false|int $callNSIndex - * @param int $callIndex - * @param int $openIndex - * @param int $closeIndex - */ - private function removeFunctionCall(Tokens $tokens, $callNSIndex, $callIndex, $openIndex, $closeIndex) - { - $tokens->clearTokenAndMergeSurroundingWhitespace($callIndex); - if (false !== $callNSIndex) { - $tokens->clearTokenAndMergeSurroundingWhitespace($callNSIndex); - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($openIndex); - $commaIndex = $tokens->getPrevMeaningfulToken($closeIndex); - if ($tokens[$commaIndex]->equals(',')) { - $tokens->removeTrailingWhitespace($commaIndex); - $tokens->clearAt($commaIndex); - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($closeIndex); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php deleted file mode 100644 index a497376..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php +++ /dev/null @@ -1,200 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Filippo Tessarotto - */ -final class PhpUnitDedicateAssertInternalTypeFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @var array - */ - private $typeToDedicatedAssertMap = [ - 'array' => 'assertIsArray', - 'boolean' => 'assertIsBool', - 'bool' => 'assertIsBool', - 'double' => 'assertIsFloat', - 'float' => 'assertIsFloat', - 'integer' => 'assertIsInt', - 'int' => 'assertIsInt', - 'null' => 'assertNull', - 'numeric' => 'assertIsNumeric', - 'object' => 'assertIsObject', - 'real' => 'assertIsFloat', - 'resource' => 'assertIsResource', - 'string' => 'assertIsString', - 'scalar' => 'assertIsScalar', - 'callable' => 'assertIsCallable', - 'iterable' => 'assertIsIterable', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHPUnit assertions like `assertIsArray` should be used over `assertInternalType`.', - [ - new CodeSample( - 'assertInternalType("array", $var); - $this->assertInternalType("boolean", $var); - } -} -' - ), - ], - null, - 'Risky when PHPUnit methods are overridden or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAllTokenKindsFound([T_CLASS, T_FUNCTION]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - * - * Must run after PhpUnitDedicateAssertFixer. - */ - public function getPriority() - { - return -16; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indexes) { - $this->updateAssertInternalTypeMethods($tokens, $indexes[0], $indexes[1]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([PhpUnitTargetVersion::VERSION_7_5, PhpUnitTargetVersion::VERSION_NEWEST]) - ->setDefault(PhpUnitTargetVersion::VERSION_NEWEST) - ->getOption(), - ]); - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function updateAssertInternalTypeMethods(Tokens $tokens, $startIndex, $endIndex) - { - $anonymousClassIndexes = []; - $tokenAnalyzer = new TokensAnalyzer($tokens); - for ($index = $startIndex; $index < $endIndex; ++$index) { - if (!$tokens[$index]->isClassy() || !$tokenAnalyzer->isAnonymousClass($index)) { - continue; - } - - $openingBraceIndex = $tokens->getNextTokenOfKind($index, ['{']); - $closingBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $openingBraceIndex); - - $anonymousClassIndexes[$closingBraceIndex] = $openingBraceIndex; - } - - for ($index = $endIndex - 1; $index > $startIndex; --$index) { - if (isset($anonymousClassIndexes[$index])) { - $index = $anonymousClassIndexes[$index]; - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_STRING)) { - continue; - } - - $functionName = strtolower($tokens[$index]->getContent()); - if ('assertinternaltype' !== $functionName && 'assertnotinternaltype' !== $functionName) { - continue; - } - - $bracketTokenIndex = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$bracketTokenIndex]->equals('(')) { - continue; - } - - $expectedTypeTokenIndex = $tokens->getNextMeaningfulToken($bracketTokenIndex); - $expectedTypeToken = $tokens[$expectedTypeTokenIndex]; - if (!$expectedTypeToken->equals([T_CONSTANT_ENCAPSED_STRING])) { - continue; - } - - $expectedType = trim($expectedTypeToken->getContent(), '\'"'); - if (!isset($this->typeToDedicatedAssertMap[$expectedType])) { - continue; - } - - $commaTokenIndex = $tokens->getNextMeaningfulToken($expectedTypeTokenIndex); - if (!$tokens[$commaTokenIndex]->equals(',')) { - continue; - } - - $newAssertion = $this->typeToDedicatedAssertMap[$expectedType]; - if ('assertnotinternaltype' === $functionName) { - $newAssertion = str_replace('Is', 'IsNot', $newAssertion); - $newAssertion = str_replace('Null', 'NotNull', $newAssertion); - } - - $nextMeaningfulTokenIndex = $tokens->getNextMeaningfulToken($commaTokenIndex); - - $tokens->overrideRange($index, $nextMeaningfulTokenIndex - 1, [ - new Token([T_STRING, $newAssertion]), - new Token('('), - ]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php deleted file mode 100644 index d718c65..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php +++ /dev/null @@ -1,282 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitExpectationFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var array - */ - private $methodMap = []; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->methodMap = [ - 'setExpectedException' => 'expectExceptionMessage', - ]; - - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_6)) { - $this->methodMap['setExpectedExceptionRegExp'] = 'expectExceptionMessageRegExp'; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Usages of `->setExpectedException*` methods MUST be replaced by `->expectException*` methods.', - [ - new CodeSample( - 'setExpectedException("RuntimeException", "Msg", 123); - foo(); - } - - public function testBar() - { - $this->setExpectedExceptionRegExp("RuntimeException", "/Msg.*/", 123); - bar(); - } -} -' - ), - new CodeSample( - 'setExpectedException("RuntimeException", null, 123); - foo(); - } - - public function testBar() - { - $this->setExpectedExceptionRegExp("RuntimeException", "/Msg.*/", 123); - bar(); - } -} -', - ['target' => PhpUnitTargetVersion::VERSION_5_6] - ), - new CodeSample( - 'setExpectedException("RuntimeException", "Msg", 123); - foo(); - } - - public function testBar() - { - $this->setExpectedExceptionRegExp("RuntimeException", "/Msg.*/", 123); - bar(); - } -} -', - ['target' => PhpUnitTargetVersion::VERSION_5_2] - ), - ], - null, - 'Risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - * - * Must run after PhpUnitNoExpectationAnnotationFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_CLASS); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indexes) { - $this->fixExpectation($tokens, $indexes[0], $indexes[1]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([PhpUnitTargetVersion::VERSION_5_2, PhpUnitTargetVersion::VERSION_5_6, PhpUnitTargetVersion::VERSION_NEWEST]) - ->setDefault(PhpUnitTargetVersion::VERSION_NEWEST) - ->getOption(), - ]); - } - - private function fixExpectation(Tokens $tokens, $startIndex, $endIndex) - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - $oldMethodSequence = [ - new Token([T_VARIABLE, '$this']), - new Token([T_OBJECT_OPERATOR, '->']), - [T_STRING], - ]; - - for ($index = $startIndex; $startIndex < $endIndex; ++$index) { - $match = $tokens->findSequence($oldMethodSequence, $index); - - if (null === $match) { - return; - } - - list($thisIndex, , $index) = array_keys($match); - - if (!isset($this->methodMap[$tokens[$index]->getContent()])) { - continue; - } - - $openIndex = $tokens->getNextTokenOfKind($index, ['(']); - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - $commaIndex = $tokens->getPrevMeaningfulToken($closeIndex); - if ($tokens[$commaIndex]->equals(',')) { - $tokens->removeTrailingWhitespace($commaIndex); - $tokens->clearAt($commaIndex); - } - - $arguments = $argumentsAnalyzer->getArguments($tokens, $openIndex, $closeIndex); - $argumentsCnt = \count($arguments); - - $argumentsReplacements = ['expectException', $this->methodMap[$tokens[$index]->getContent()], 'expectExceptionCode']; - - $indent = $this->whitespacesConfig->getLineEnding().$this->detectIndent($tokens, $thisIndex); - - $isMultilineWhitespace = false; - - for ($cnt = $argumentsCnt - 1; $cnt >= 1; --$cnt) { - $argStart = array_keys($arguments)[$cnt]; - $argBefore = $tokens->getPrevMeaningfulToken($argStart); - - if ('expectExceptionMessage' === $argumentsReplacements[$cnt]) { - $paramIndicatorIndex = $tokens->getNextMeaningfulToken($argBefore); - $afterParamIndicatorIndex = $tokens->getNextMeaningfulToken($paramIndicatorIndex); - - if ( - $tokens[$paramIndicatorIndex]->equals([T_STRING, 'null'], false) && - $tokens[$afterParamIndicatorIndex]->equals(')') - ) { - if ($tokens[$argBefore + 1]->isWhitespace()) { - $tokens->clearTokenAndMergeSurroundingWhitespace($argBefore + 1); - } - $tokens->clearTokenAndMergeSurroundingWhitespace($argBefore); - $tokens->clearTokenAndMergeSurroundingWhitespace($paramIndicatorIndex); - - continue; - } - } - - $isMultilineWhitespace = $isMultilineWhitespace || ($tokens[$argStart]->isWhitespace() && !$tokens[$argStart]->isWhitespace(" \t")); - $tokensOverrideArgStart = [ - new Token([T_WHITESPACE, $indent]), - new Token([T_VARIABLE, '$this']), - new Token([T_OBJECT_OPERATOR, '->']), - new Token([T_STRING, $argumentsReplacements[$cnt]]), - new Token('('), - ]; - $tokensOverrideArgBefore = [ - new Token(')'), - new Token(';'), - ]; - - if ($isMultilineWhitespace) { - array_push($tokensOverrideArgStart, new Token([T_WHITESPACE, $indent.$this->whitespacesConfig->getIndent()])); - array_unshift($tokensOverrideArgBefore, new Token([T_WHITESPACE, $indent])); - } - - if ($tokens[$argStart]->isWhitespace()) { - $tokens->overrideRange($argStart, $argStart, $tokensOverrideArgStart); - } else { - $tokens->insertAt($argStart, $tokensOverrideArgStart); - } - - $tokens->overrideRange($argBefore, $argBefore, $tokensOverrideArgBefore); - } - - $tokens[$index] = new Token([T_STRING, 'expectException']); - } - } - - /** - * @param int $index - * - * @return string - */ - private function detectIndent(Tokens $tokens, $index) - { - if (!$tokens[$index - 1]->isWhitespace()) { - return ''; // cannot detect indent - } - - $explodedContent = explode("\n", $tokens[$index - 1]->getContent()); - - return end($explodedContent); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php deleted file mode 100644 index 335163f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php +++ /dev/null @@ -1,104 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Roland Franssen - */ -final class PhpUnitFqcnAnnotationFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHPUnit annotations should be a FQCNs including a root namespace.', - [new CodeSample( - 'isAllTokenKindsFound([T_CLASS, T_DOC_COMMENT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indexes) { - $startIndex = $indexes[0]; - $prevDocCommentIndex = $tokens->getPrevTokenOfKind($startIndex, [[T_DOC_COMMENT]]); - if (null !== $prevDocCommentIndex) { - $startIndex = $prevDocCommentIndex; - } - $this->fixPhpUnitClass($tokens, $startIndex, $indexes[1]); - } - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function fixPhpUnitClass(Tokens $tokens, $startIndex, $endIndex) - { - for ($index = $startIndex; $index < $endIndex; ++$index) { - if ($tokens[$index]->isGivenKind(T_DOC_COMMENT)) { - $tokens[$index] = new Token([T_DOC_COMMENT, Preg::replace( - '~^(\s*\*\s*@(?:expectedException|covers|coversDefaultClass|uses)\h+)(?!(?:self|static)::)(\w.*)$~m', - '$1\\\\$2', - $tokens[$index]->getContent() - )]); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php deleted file mode 100644 index 901549b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php +++ /dev/null @@ -1,234 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gert de Pagter - */ -final class PhpUnitInternalClassFixer extends AbstractFixer implements WhitespacesAwareFixerInterface, ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'All PHPUnit test classes should be marked as internal.', - [ - new CodeSample(" ['final']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before FinalInternalClassFixer. - */ - public function getPriority() - { - return 68; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_CLASS); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $types = ['normal', 'final', 'abstract']; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('types', 'What types of classes to mark as internal')) - ->setAllowedValues([(new AllowedValueSubset($types))]) - ->setAllowedTypes(['array']) - ->setDefault(['normal', 'final']) - ->getOption(), - ]); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens, true) as $indexes) { - $this->markClassInternal($tokens, $indexes[0]); - } - } - - /** - * @param int $startIndex - */ - private function markClassInternal(Tokens $tokens, $startIndex) - { - $classIndex = $tokens->getPrevTokenOfKind($startIndex, [[T_CLASS]]); - - if (!$this->isAllowedByConfiguration($tokens, $classIndex)) { - return; - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $classIndex); - - if ($this->hasDocBlock($tokens, $classIndex)) { - $this->updateDocBlockIfNeeded($tokens, $docBlockIndex); - - return; - } - - $this->createDocBlock($tokens, $docBlockIndex); - } - - /** - * @param int $i - * - * @return bool - */ - private function isAllowedByConfiguration(Tokens $tokens, $i) - { - $typeIndex = $tokens->getPrevMeaningfulToken($i); - if ($tokens[$typeIndex]->isGivenKind(T_FINAL)) { - return \in_array('final', $this->configuration['types'], true); - } - - if ($tokens[$typeIndex]->isGivenKind(T_ABSTRACT)) { - return \in_array('abstract', $this->configuration['types'], true); - } - - return \in_array('normal', $this->configuration['types'], true); - } - - private function createDocBlock(Tokens $tokens, $docBlockIndex) - { - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $originalIndent = $this->detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - $toInsert = [ - new Token([T_DOC_COMMENT, '/**'.$lineEnd."{$originalIndent} * @internal".$lineEnd."{$originalIndent} */"]), - new Token([T_WHITESPACE, $lineEnd.$originalIndent]), - ]; - $index = $tokens->getNextMeaningfulToken($docBlockIndex); - $tokens->insertAt($index, $toInsert); - } - - private function updateDocBlockIfNeeded(Tokens $tokens, $docBlockIndex) - { - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - if (!empty($doc->getAnnotationsOfType('internal'))) { - return; - } - $doc = $this->makeDocBlockMultiLineIfNeeded($doc, $tokens, $docBlockIndex); - $lines = $this->addInternalAnnotation($doc, $tokens, $docBlockIndex); - $lines = implode('', $lines); - - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $lines]); - } - - /** - * @param int $index - * - * @return bool - */ - private function hasDocBlock(Tokens $tokens, $index) - { - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - - return $tokens[$docBlockIndex]->isGivenKind(T_DOC_COMMENT); - } - - /** - * @param int $index - * - * @return int - */ - private function getDocBlockIndex(Tokens $tokens, $index) - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_FINAL, T_ABSTRACT, T_COMMENT])); - - return $index; - } - - /** - * @param int $index - * - * @return string - */ - private function detectIndent(Tokens $tokens, $index) - { - if (!$tokens[$index - 1]->isWhitespace()) { - return ''; // cannot detect indent - } - - $explodedContent = explode($this->whitespacesConfig->getLineEnding(), $tokens[$index - 1]->getContent()); - - return end($explodedContent); - } - - /** - * @param int $docBlockIndex - * - * @return Line[] - */ - private function addInternalAnnotation(DocBlock $docBlock, Tokens $tokens, $docBlockIndex) - { - $lines = $docBlock->getLines(); - $originalIndent = $this->detectIndent($tokens, $docBlockIndex); - $lineEnd = $this->whitespacesConfig->getLineEnding(); - array_splice($lines, -1, 0, $originalIndent.' *'.$lineEnd.$originalIndent.' * @internal'.$lineEnd); - - return $lines; - } - - /** - * @param int $docBlockIndex - * - * @return DocBlock - */ - private function makeDocBlockMultiLineIfNeeded(DocBlock $doc, Tokens $tokens, $docBlockIndex) - { - $lines = $doc->getLines(); - if (1 === \count($lines) && empty($doc->getAnnotationsOfType('internal'))) { - $indent = $this->detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - $doc->makeMultiLine($indent, $this->whitespacesConfig->getLineEnding()); - - return $doc; - } - - return $doc; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php deleted file mode 100644 index b42338b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php +++ /dev/null @@ -1,278 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use PhpCsFixer\Utils; - -/** - * @author Filippo Tessarotto - */ -final class PhpUnitMethodCasingFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @internal - */ - const CAMEL_CASE = 'camel_case'; - - /** - * @internal - */ - const SNAKE_CASE = 'snake_case'; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Enforce camel (or snake) case for PHPUnit test methods, following configuration.', - [ - new CodeSample( - ' self::SNAKE_CASE] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after PhpUnitTestAnnotationFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAllTokenKindsFound([T_CLASS, T_FUNCTION]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indexes) { - $this->applyCasing($tokens, $indexes[0], $indexes[1]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('case', 'Apply camel or snake case to test methods')) - ->setAllowedValues([self::CAMEL_CASE, self::SNAKE_CASE]) - ->setDefault(self::CAMEL_CASE) - ->getOption(), - ]); - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function applyCasing(Tokens $tokens, $startIndex, $endIndex) - { - for ($index = $endIndex - 1; $index > $startIndex; --$index) { - if (!$this->isTestMethod($tokens, $index)) { - continue; - } - - $functionNameIndex = $tokens->getNextMeaningfulToken($index); - $functionName = $tokens[$functionNameIndex]->getContent(); - $newFunctionName = $this->updateMethodCasing($functionName); - - if ($newFunctionName !== $functionName) { - $tokens[$functionNameIndex] = new Token([T_STRING, $newFunctionName]); - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - if ($this->hasDocBlock($tokens, $index)) { - $this->updateDocBlock($tokens, $docBlockIndex); - } - } - } - - /** - * @param string $functionName - * - * @return string - */ - private function updateMethodCasing($functionName) - { - if (self::CAMEL_CASE === $this->configuration['case']) { - $newFunctionName = $functionName; - $newFunctionName = ucwords($newFunctionName, '_'); - $newFunctionName = str_replace('_', '', $newFunctionName); - $newFunctionName = lcfirst($newFunctionName); - } else { - $newFunctionName = Utils::camelCaseToUnderscore($functionName); - } - - return $newFunctionName; - } - - /** - * @param int $index - * - * @return bool - */ - private function isTestMethod(Tokens $tokens, $index) - { - // Check if we are dealing with a (non abstract, non lambda) function - if (!$this->isMethod($tokens, $index)) { - return false; - } - - // if the function name starts with test it's a test - $functionNameIndex = $tokens->getNextMeaningfulToken($index); - $functionName = $tokens[$functionNameIndex]->getContent(); - - if ($this->startsWith('test', $functionName)) { - return true; - } - // If the function doesn't have test in its name, and no doc block, it's not a test - if (!$this->hasDocBlock($tokens, $index)) { - return false; - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - $doc = $tokens[$docBlockIndex]->getContent(); - if (false === strpos($doc, '@test')) { - return false; - } - - return true; - } - - /** - * @param int $index - * - * @return bool - */ - private function isMethod(Tokens $tokens, $index) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - return $tokens[$index]->isGivenKind(T_FUNCTION) && !$tokensAnalyzer->isLambda($index); - } - - /** - * @param string $needle - * @param string $haystack - * - * @return bool - */ - private function startsWith($needle, $haystack) - { - return substr($haystack, 0, \strlen($needle)) === $needle; - } - - /** - * @param int $index - * - * @return bool - */ - private function hasDocBlock(Tokens $tokens, $index) - { - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - - return $tokens[$docBlockIndex]->isGivenKind(T_DOC_COMMENT); - } - - /** - * @param int $index - * - * @return int - */ - private function getDocBlockIndex(Tokens $tokens, $index) - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_FINAL, T_ABSTRACT, T_COMMENT])); - - return $index; - } - - /** - * @param int $docBlockIndex - */ - private function updateDocBlock(Tokens $tokens, $docBlockIndex) - { - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - $lines = $doc->getLines(); - - $docBlockNeedsUpdate = false; - for ($inc = 0; $inc < \count($lines); ++$inc) { - $lineContent = $lines[$inc]->getContent(); - if (false === strpos($lineContent, '@depends')) { - continue; - } - - $newLineContent = Preg::replaceCallback('/(@depends\s+)(.+)(\b)/', function (array $matches) { - return sprintf( - '%s%s%s', - $matches[1], - $this->updateMethodCasing($matches[2]), - $matches[3] - ); - }, $lineContent); - - if ($newLineContent !== $lineContent) { - $lines[$inc] = new Line($newLineContent); - $docBlockNeedsUpdate = true; - } - } - - if ($docBlockNeedsUpdate) { - $lines = implode('', $lines); - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $lines]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php deleted file mode 100644 index 02d29e5..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php +++ /dev/null @@ -1,150 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitMockFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @var bool - */ - private $fixCreatePartialMock; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Usages of `->getMock` and `->getMockWithoutInvokingTheOriginalConstructor` methods MUST be replaced by `->createMock` or `->createPartialMock` methods.', - [ - new CodeSample( - 'getMockWithoutInvokingTheOriginalConstructor("Foo"); - $mock1 = $this->getMock("Foo"); - $mock1 = $this->getMock("Bar", ["aaa"]); - $mock1 = $this->getMock("Baz", ["aaa"], ["argument"]); // version with more than 2 params is not supported - } -} -' - ), - new CodeSample( - 'getMock("Foo"); - $mock1 = $this->getMock("Bar", ["aaa"]); // version with multiple params is not supported - } -} -', - ['target' => PhpUnitTargetVersion::VERSION_5_4] - ), - ], - null, - 'Risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_CLASS); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->fixCreatePartialMock = PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_5); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indexes) { - for ($index = $indexes[0]; $index < $indexes[1]; ++$index) { - if (!$tokens[$index]->isGivenKind(T_OBJECT_OPERATOR)) { - continue; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->equals([T_STRING, 'getMockWithoutInvokingTheOriginalConstructor'], false)) { - $tokens[$index] = new Token([T_STRING, 'createMock']); - } elseif ($tokens[$index]->equals([T_STRING, 'getMock'], false)) { - $openingParenthesis = $tokens->getNextMeaningfulToken($index); - $closingParenthesis = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openingParenthesis); - - $argumentsCount = $argumentsAnalyzer->countArguments($tokens, $openingParenthesis, $closingParenthesis); - - if (1 === $argumentsCount) { - $tokens[$index] = new Token([T_STRING, 'createMock']); - } elseif (2 === $argumentsCount && true === $this->fixCreatePartialMock) { - $tokens[$index] = new Token([T_STRING, 'createPartialMock']); - } - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([PhpUnitTargetVersion::VERSION_5_4, PhpUnitTargetVersion::VERSION_5_5, PhpUnitTargetVersion::VERSION_NEWEST]) - ->setDefault(PhpUnitTargetVersion::VERSION_NEWEST) - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php deleted file mode 100644 index 91a955a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php +++ /dev/null @@ -1,145 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Michał Adamski - * @author Kuba Werłos - */ -final class PhpUnitMockShortWillReturnFixer extends AbstractFixer -{ - /** - * @internal - */ - const RETURN_METHODS_MAP = [ - 'returnargument' => 'willReturnArgument', - 'returncallback' => 'willReturnCallback', - 'returnself' => 'willReturnSelf', - 'returnvalue' => 'willReturn', - 'returnvaluemap' => 'willReturnMap', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Usage of PHPUnit\'s mock e.g. `->will($this->returnValue(..))` must be replaced by its shorter equivalent such as `->willReturn(...)`.', - [ - new CodeSample('createMock(Some::class); - $someMock->method("some")->will($this->returnSelf()); - $someMock->method("some")->will($this->returnValue("example")); - $someMock->method("some")->will($this->returnArgument(2)); - $someMock->method("some")->will($this->returnCallback("str_rot13")); - $someMock->method("some")->will($this->returnValueMap(["a","b","c"])); - } -} -'), - ], - null, - 'Risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAllTokenKindsFound([T_CLASS, T_OBJECT_OPERATOR, T_STRING]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indexes) { - $this->fixWillReturn($tokens, $indexes[0], $indexes[1]); - } - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function fixWillReturn(Tokens $tokens, $startIndex, $endIndex) - { - for ($index = $startIndex; $index < $endIndex; ++$index) { - if (!$tokens[$index]->isGivenKind(T_OBJECT_OPERATOR)) { - continue; - } - - $functionToReplaceIndex = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$functionToReplaceIndex]->equals([T_STRING, 'will'], false)) { - continue; - } - - $functionToReplaceOpeningBraceIndex = $tokens->getNextMeaningfulToken($functionToReplaceIndex); - if (!$tokens[$functionToReplaceOpeningBraceIndex]->equals('(')) { - continue; - } - - $classReferenceIndex = $tokens->getNextMeaningfulToken($functionToReplaceOpeningBraceIndex); - $objectOperatorIndex = $tokens->getNextMeaningfulToken($classReferenceIndex); - if ( - !($tokens[$classReferenceIndex]->equals([T_VARIABLE, '$this'], false) && $tokens[$objectOperatorIndex]->equals([T_OBJECT_OPERATOR, '->'])) - && !($tokens[$classReferenceIndex]->equals([T_STRING, 'self'], false) && $tokens[$objectOperatorIndex]->equals([T_DOUBLE_COLON, '::'])) - && !($tokens[$classReferenceIndex]->equals([T_STATIC, 'static'], false) && $tokens[$objectOperatorIndex]->equals([T_DOUBLE_COLON, '::'])) - ) { - continue; - } - - $functionToRemoveIndex = $tokens->getNextMeaningfulToken($objectOperatorIndex); - if (!$tokens[$functionToRemoveIndex]->isGivenKind(T_STRING) || !\array_key_exists(strtolower($tokens[$functionToRemoveIndex]->getContent()), self::RETURN_METHODS_MAP)) { - continue; - } - - $openingBraceIndex = $tokens->getNextMeaningfulToken($functionToRemoveIndex); - if (!$tokens[$openingBraceIndex]->equals('(')) { - continue; - } - - $closingBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openingBraceIndex); - - $tokens[$functionToReplaceIndex] = new Token([T_STRING, self::RETURN_METHODS_MAP[strtolower($tokens[$functionToRemoveIndex]->getContent())]]); - $tokens->clearTokenAndMergeSurroundingWhitespace($classReferenceIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($objectOperatorIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($functionToRemoveIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($openingBraceIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($closingBraceIndex); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php deleted file mode 100644 index 2b0ba34..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php +++ /dev/null @@ -1,225 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitNamespacedFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @var string - */ - private $originalClassRegEx; - - /** - * Class Mappings. - * - * * [original classname => new classname] Some classes which match the - * original class regular expression do not have a same-compound name- - * space class and need a dedicated translation table. This trans- - * lation table is defined in @see configure. - * - * @var array|string[] Class Mappings - */ - private $classMap; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - $codeSample = ' PhpUnitTargetVersion::VERSION_4_8]), - ], - "PHPUnit v6 has finally fully switched to namespaces.\n" - ."You could start preparing the upgrade by switching from non-namespaced TestCase to namespaced one.\n" - .'Forward compatibility layer (`\PHPUnit\Framework\TestCase` class) was backported to PHPUnit v4.8.35 and PHPUnit v5.4.0.'."\n" - .'Extended forward compatibility layer (`PHPUnit\Framework\Assert`, `PHPUnit\Framework\BaseTestListener`, `PHPUnit\Framework\TestListener` classes) was introduced in v5.7.0.'."\n", - 'Risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_6_0)) { - $this->originalClassRegEx = '/^PHPUnit_\w+$/i'; - // @noinspection ClassConstantCanBeUsedInspection - $this->classMap = [ - 'PHPUnit_Extensions_PhptTestCase' => 'PHPUnit\Runner\PhptTestCase', - 'PHPUnit_Framework_Constraint' => 'PHPUnit\Framework\Constraint\Constraint', - 'PHPUnit_Framework_Constraint_StringMatches' => 'PHPUnit\Framework\Constraint\StringMatchesFormatDescription', - 'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => 'PHPUnit\Framework\Constraint\JsonMatchesErrorMessageProvider', - 'PHPUnit_Framework_Constraint_PCREMatch' => 'PHPUnit\Framework\Constraint\RegularExpression', - 'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => 'PHPUnit\Framework\Constraint\ExceptionMessageRegularExpression', - 'PHPUnit_Framework_Constraint_And' => 'PHPUnit\Framework\Constraint\LogicalAnd', - 'PHPUnit_Framework_Constraint_Or' => 'PHPUnit\Framework\Constraint\LogicalOr', - 'PHPUnit_Framework_Constraint_Not' => 'PHPUnit\Framework\Constraint\LogicalNot', - 'PHPUnit_Framework_Constraint_Xor' => 'PHPUnit\Framework\Constraint\LogicalXor', - 'PHPUnit_Framework_Error' => 'PHPUnit\Framework\Error\Error', - 'PHPUnit_Framework_TestSuite_DataProvider' => 'PHPUnit\Framework\DataProviderTestSuite', - 'PHPUnit_Framework_MockObject_Invocation_Static' => 'PHPUnit\Framework\MockObject\Invocation\StaticInvocation', - 'PHPUnit_Framework_MockObject_Invocation_Object' => 'PHPUnit\Framework\MockObject\Invocation\ObjectInvocation', - 'PHPUnit_Framework_MockObject_Stub_Return' => 'PHPUnit\Framework\MockObject\Stub\ReturnStub', - 'PHPUnit_Runner_Filter_Group_Exclude' => 'PHPUnit\Runner\Filter\ExcludeGroupFilterIterator', - 'PHPUnit_Runner_Filter_Group_Include' => 'PHPUnit\Runner\Filter\IncludeGroupFilterIterator', - 'PHPUnit_Runner_Filter_Test' => 'PHPUnit\Runner\Filter\NameFilterIterator', - 'PHPUnit_Util_PHP' => 'PHPUnit\Util\PHP\AbstractPhpProcess', - 'PHPUnit_Util_PHP_Default' => 'PHPUnit\Util\PHP\DefaultPhpProcess', - 'PHPUnit_Util_PHP_Windows' => 'PHPUnit\Util\PHP\WindowsPhpProcess', - 'PHPUnit_Util_Regex' => 'PHPUnit\Util\RegularExpression', - 'PHPUnit_Util_TestDox_ResultPrinter_XML' => 'PHPUnit\Util\TestDox\XmlResultPrinter', - 'PHPUnit_Util_TestDox_ResultPrinter_HTML' => 'PHPUnit\Util\TestDox\HtmlResultPrinter', - 'PHPUnit_Util_TestDox_ResultPrinter_Text' => 'PHPUnit\Util\TestDox\TextResultPrinter', - 'PHPUnit_Util_TestSuiteIterator' => 'PHPUnit\Framework\TestSuiteIterator', - 'PHPUnit_Util_XML' => 'PHPUnit\Util\Xml', - ]; - } elseif (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_7)) { - $this->originalClassRegEx = '/^PHPUnit_Framework_TestCase|PHPUnit_Framework_Assert|PHPUnit_Framework_BaseTestListener|PHPUnit_Framework_TestListener$/i'; - $this->classMap = []; - } else { - $this->originalClassRegEx = '/^PHPUnit_Framework_TestCase$/i'; - $this->classMap = []; - } - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $importedOriginalClassesMap = []; - $currIndex = 0; - - while (null !== $currIndex) { - $currIndex = $tokens->getNextTokenOfKind($currIndex, [[T_STRING]]); - - if (null === $currIndex) { - break; - } - - $originalClass = $tokens[$currIndex]->getContent(); - - if (1 !== Preg::match($this->originalClassRegEx, $originalClass)) { - ++$currIndex; - - continue; - } - - $substituteTokens = $this->generateReplacement($originalClass); - - $tokens->clearAt($currIndex); - $tokens->insertAt( - $currIndex, - isset($importedOriginalClassesMap[$originalClass]) ? $substituteTokens[$substituteTokens->getSize() - 1] : $substituteTokens - ); - - $prevIndex = $tokens->getPrevMeaningfulToken($currIndex); - if ($tokens[$prevIndex]->isGivenKind(T_USE)) { - $importedOriginalClassesMap[$originalClass] = true; - } elseif ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - - if ($tokens[$prevIndex]->isGivenKind(T_USE)) { - $importedOriginalClassesMap[$originalClass] = true; - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([PhpUnitTargetVersion::VERSION_4_8, PhpUnitTargetVersion::VERSION_5_7, PhpUnitTargetVersion::VERSION_6_0, PhpUnitTargetVersion::VERSION_NEWEST]) - ->setDefault(PhpUnitTargetVersion::VERSION_NEWEST) - ->getOption(), - ]); - } - - /** - * @param string $originalClassName - * - * @return Tokens - */ - private function generateReplacement($originalClassName) - { - $delimiter = '_'; - $string = $originalClassName; - - if (isset($this->classMap[$originalClassName])) { - $delimiter = '\\'; - $string = $this->classMap[$originalClassName]; - } - - $parts = explode($delimiter, $string); - - $tokensArray = []; - while (!empty($parts)) { - $tokensArray[] = new Token([T_STRING, array_shift($parts)]); - if (!empty($parts)) { - $tokensArray[] = new Token([T_NS_SEPARATOR, '\\']); - } - } - - return Tokens::fromArray($tokensArray); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php deleted file mode 100644 index ecc34d2..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php +++ /dev/null @@ -1,302 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitNoExpectationAnnotationFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var bool - */ - private $fixMessageRegExp; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->fixMessageRegExp = PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_4_3); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Usages of `@expectedException*` annotations MUST be replaced by `->setExpectedException*` methods.', - [ - new CodeSample( - ' PhpUnitTargetVersion::VERSION_3_2] - ), - ], - null, - 'Risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoEmptyPhpdocFixer, PhpUnitExpectationFixer. - */ - public function getPriority() - { - return 10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAllTokenKindsFound([T_CLASS, T_DOC_COMMENT]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indexes) { - $this->fixPhpUnitClass($tokens, $indexes[0], $indexes[1]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([PhpUnitTargetVersion::VERSION_3_2, PhpUnitTargetVersion::VERSION_4_3, PhpUnitTargetVersion::VERSION_NEWEST]) - ->setDefault(PhpUnitTargetVersion::VERSION_NEWEST) - ->getOption(), - (new FixerOptionBuilder('use_class_const', 'Use ::class notation.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - /** - * @param int $index - * - * @return string - */ - private function detectIndent(Tokens $tokens, $index) - { - if (!$tokens[$index - 1]->isWhitespace()) { - return ''; // cannot detect indent - } - - $explodedContent = explode("\n", $tokens[$index - 1]->getContent()); - - return end($explodedContent); - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function fixPhpUnitClass(Tokens $tokens, $startIndex, $endIndex) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - if (!$tokens[$i]->isGivenKind(T_FUNCTION) || $tokensAnalyzer->isLambda($i)) { - continue; - } - - $functionIndex = $i; - $docBlockIndex = $i; - - // ignore abstract functions - $braceIndex = $tokens->getNextTokenOfKind($functionIndex, [';', '{']); - if (!$tokens[$braceIndex]->equals('{')) { - continue; - } - - do { - $docBlockIndex = $tokens->getPrevNonWhitespace($docBlockIndex); - } while ($tokens[$docBlockIndex]->isGivenKind([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_FINAL, T_ABSTRACT, T_COMMENT])); - - if (!$tokens[$docBlockIndex]->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - $annotations = []; - - foreach ($doc->getAnnotationsOfType([ - 'expectedException', - 'expectedExceptionCode', - 'expectedExceptionMessage', - 'expectedExceptionMessageRegExp', - ]) as $annotation) { - $tag = $annotation->getTag()->getName(); - $content = $this->extractContentFromAnnotation($annotation); - $annotations[$tag] = $content; - $annotation->remove(); - } - - if (!isset($annotations['expectedException'])) { - continue; - } - if (!$this->fixMessageRegExp && isset($annotations['expectedExceptionMessageRegExp'])) { - continue; - } - - $originalIndent = $this->detectIndent($tokens, $docBlockIndex); - - $paramList = $this->annotationsToParamList($annotations); - - $newMethodsCode = '' - .(isset($annotations['expectedExceptionMessageRegExp']) ? 'setExpectedExceptionRegExp' : 'setExpectedException') - .'(' - .implode(', ', $paramList) - .');'; - $newMethods = Tokens::fromCode($newMethodsCode); - $newMethods[0] = new Token([ - T_WHITESPACE, - $this->whitespacesConfig->getLineEnding().$originalIndent.$this->whitespacesConfig->getIndent(), - ]); - - // apply changes - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $doc->getContent()]); - $tokens->insertAt($braceIndex + 1, $newMethods); - - $whitespaceIndex = $braceIndex + $newMethods->getSize() + 1; - $tokens[$whitespaceIndex] = new Token([ - T_WHITESPACE, - $this->whitespacesConfig->getLineEnding().$tokens[$whitespaceIndex]->getContent(), - ]); - - $i = $docBlockIndex; - } - } - - /** - * @return string - */ - private function extractContentFromAnnotation(Annotation $annotation) - { - $tag = $annotation->getTag()->getName(); - - if (1 !== Preg::match('/@'.$tag.'\s+(.+)$/s', $annotation->getContent(), $matches)) { - return ''; - } - - $content = $matches[1]; - - if (Preg::match('/\R/u', $content)) { - $content = Preg::replace('/\s*\R+\s*\*\s*/u', ' ', $content); - } - - return rtrim($content); - } - - private function annotationsToParamList(array $annotations) - { - $params = []; - $exceptionClass = ltrim($annotations['expectedException'], '\\'); - - if ($this->configuration['use_class_const']) { - $params[] = "\\{$exceptionClass}::class"; - } else { - $params[] = "'{$exceptionClass}'"; - } - - if (isset($annotations['expectedExceptionMessage'])) { - $params[] = var_export($annotations['expectedExceptionMessage'], true); - } elseif (isset($annotations['expectedExceptionMessageRegExp'])) { - $params[] = var_export($annotations['expectedExceptionMessageRegExp'], true); - } elseif (isset($annotations['expectedExceptionCode'])) { - $params[] = 'null'; - } - - if (isset($annotations['expectedExceptionCode'])) { - $params[] = $annotations['expectedExceptionCode']; - } - - return $params; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitOrderedCoversFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitOrderedCoversFixer.php deleted file mode 100644 index 81678ae..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitOrderedCoversFixer.php +++ /dev/null @@ -1,107 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class PhpUnitOrderedCoversFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Order `@covers` annotation of PHPUnit tests.', - [ - new CodeSample( - 'isAllTokenKindsFound([T_CLASS, T_DOC_COMMENT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = $tokens->count() - 1; $index > 0; --$index) { - if (!$tokens[$index]->isGivenKind(T_DOC_COMMENT) || 0 === Preg::match('/@covers\s.+@covers\s/s', $tokens[$index]->getContent())) { - continue; - } - - $docBlock = new DocBlock($tokens[$index]->getContent()); - $covers = $docBlock->getAnnotationsOfType('covers'); - - $coversMap = []; - foreach ($covers as $annotation) { - $rawContent = $annotation->getContent(); - - $comparableContent = Preg::replace('/\*\s*@covers\s+(.+)/', '\1', strtolower(trim($rawContent))); - $coversMap[$comparableContent] = $rawContent; - } - $orderedCoversMap = $coversMap; - ksort($orderedCoversMap, SORT_STRING); - if ($orderedCoversMap === $coversMap) { - continue; - } - - $lines = $docBlock->getLines(); - foreach (array_reverse($covers) as $annotation) { - array_splice( - $lines, - $annotation->getStart(), - $annotation->getEnd() - $annotation->getStart() + 1, - array_pop($orderedCoversMap) - ); - } - - $tokens[$index] = new Token([T_DOC_COMMENT, implode('', $lines)]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php deleted file mode 100644 index 5890777..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php +++ /dev/null @@ -1,140 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gert de Pagter - */ -final class PhpUnitSetUpTearDownVisibilityFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Changes the visibility of the `setUp()` and `tearDown()` functions of PHPUnit to `protected`, to match the PHPUnit TestCase.', - [ - new CodeSample( - 'hello = "hello"; - } - - public function tearDown() - { - $this->hello = null; - } -} -' - ), - ], - null, - 'This fixer may change functions named `setUp()` or `tearDown()` outside of PHPUnit tests, '. - 'when a class is wrongly seen as a PHPUnit test.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAllTokenKindsFound([T_CLASS, T_FUNCTION]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indexes) { - $this->fixSetUpAndTearDown($tokens, $indexes[0], $indexes[1]); - } - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function fixSetUpAndTearDown(Tokens $tokens, $startIndex, $endIndex) - { - $counter = 0; - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - if (2 === $counter) { - break; // we've seen both method we are interested in, so stop analyzing this class - } - - if (!$this->isSetupOrTearDownMethod($tokens, $i)) { - continue; - } - - ++$counter; - $visibility = $tokensAnalyzer->getMethodAttributes($i)['visibility']; - - if (T_PUBLIC === $visibility) { - $index = $tokens->getPrevTokenOfKind($i, [[T_PUBLIC]]); - $tokens[$index] = new Token([T_PROTECTED, 'protected']); - - continue; - } - - if (null === $visibility) { - $tokens->insertAt($i, [new Token([T_PROTECTED, 'protected']), new Token([T_WHITESPACE, ' '])]); - } - } - } - - /** - * @param int $index - * - * @return bool - */ - private function isSetupOrTearDownMethod(Tokens $tokens, $index) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - $isMethod = $tokens[$index]->isGivenKind(T_FUNCTION) && !$tokensAnalyzer->isLambda($index); - if (!$isMethod) { - return false; - } - - $functionNameIndex = $tokens->getNextMeaningfulToken($index); - $functionName = strtolower($tokens[$functionNameIndex]->getContent()); - - return 'setup' === $functionName || 'teardown' === $functionName; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php deleted file mode 100644 index 3e4a5c2..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php +++ /dev/null @@ -1,270 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use SplFileInfo; - -/** - * @author Jefersson Nathan - */ -final class PhpUnitSizeClassFixer extends AbstractFixer implements WhitespacesAwareFixerInterface, ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'All PHPUnit test cases should have `@small`, `@medium` or `@large` annotation to enable run time limits.', - [ - new CodeSample(" 'medium']), - ], - 'The special groups [small, medium, large] provides a way to identify tests that are taking long to be executed.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAllTokenKindsFound([T_CLASS, T_STRING]); - } - - protected function applyFix(SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens, true) as $indexes) { - $this->markClassSize($tokens, $indexes[0]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('group', 'Define a specific group to be used in case no group is already in use')) - ->setAllowedValues(['small', 'medium', 'large']) - ->setDefault('small') - ->getOption(), - ]); - } - - /** - * @param int $startIndex - */ - private function markClassSize(Tokens $tokens, $startIndex) - { - $classIndex = $tokens->getPrevTokenOfKind($startIndex, [[T_CLASS]]); - - if ($this->isAbstractClass($tokens, $classIndex)) { - return; - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $classIndex); - - if ($this->hasDocBlock($tokens, $classIndex)) { - $this->updateDocBlockIfNeeded($tokens, $docBlockIndex); - - return; - } - - $this->createDocBlock($tokens, $docBlockIndex); - } - - /** - * @param int $i - * - * @return bool - */ - private function isAbstractClass(Tokens $tokens, $i) - { - $typeIndex = $tokens->getPrevMeaningfulToken($i); - - return $tokens[$typeIndex]->isGivenKind(T_ABSTRACT); - } - - private function createDocBlock(Tokens $tokens, $docBlockIndex) - { - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $originalIndent = $this->detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - $group = $this->configuration['group']; - $toInsert = [ - new Token([T_DOC_COMMENT, '/**'.$lineEnd."{$originalIndent} * @".$group.$lineEnd."{$originalIndent} */"]), - new Token([T_WHITESPACE, $lineEnd.$originalIndent]), - ]; - $index = $tokens->getNextMeaningfulToken($docBlockIndex); - $tokens->insertAt($index, $toInsert); - } - - private function updateDocBlockIfNeeded(Tokens $tokens, $docBlockIndex) - { - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - if (!empty($this->filterDocBlock($doc))) { - return; - } - $doc = $this->makeDocBlockMultiLineIfNeeded($doc, $tokens, $docBlockIndex); - $lines = $this->addSizeAnnotation($doc, $tokens, $docBlockIndex); - $lines = implode('', $lines); - - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $lines]); - } - - /** - * @param int $index - * - * @return bool - */ - private function hasDocBlock(Tokens $tokens, $index) - { - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - - return $tokens[$docBlockIndex]->isGivenKind(T_DOC_COMMENT); - } - - /** - * @param int $index - * - * @return int - */ - private function getDocBlockIndex(Tokens $tokens, $index) - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_FINAL, T_ABSTRACT, T_COMMENT])); - - return $index; - } - - /** - * @param int $index - * - * @return string - */ - private function detectIndent(Tokens $tokens, $index) - { - if (!$tokens[$index - 1]->isWhitespace()) { - return ''; // cannot detect indent - } - - $explodedContent = explode($this->whitespacesConfig->getLineEnding(), $tokens[$index - 1]->getContent()); - - return end($explodedContent); - } - - /** - * @param int $docBlockIndex - * - * @return Line[] - */ - private function addSizeAnnotation(DocBlock $docBlock, Tokens $tokens, $docBlockIndex) - { - $lines = $docBlock->getLines(); - $originalIndent = $this->detectIndent($tokens, $docBlockIndex); - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $group = $this->configuration['group']; - array_splice($lines, -1, 0, $originalIndent.' *'.$lineEnd.$originalIndent.' * @'.$group.$lineEnd); - - return $lines; - } - - /** - * @param int $docBlockIndex - * - * @return DocBlock - */ - private function makeDocBlockMultiLineIfNeeded(DocBlock $doc, Tokens $tokens, $docBlockIndex) - { - $lines = $doc->getLines(); - if (1 === \count($lines) && empty($this->filterDocBlock($doc))) { - $lines = $this->splitUpDocBlock($lines, $tokens, $docBlockIndex); - - return new DocBlock(implode('', $lines)); - } - - return $doc; - } - - /** - * Take a one line doc block, and turn it into a multi line doc block. - * - * @param Line[] $lines - * @param int $docBlockIndex - * - * @return Line[] - */ - private function splitUpDocBlock($lines, Tokens $tokens, $docBlockIndex) - { - $lineContent = $this->getSingleLineDocBlockEntry($lines); - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $originalIndent = $this->detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - - return [ - new Line('/**'.$lineEnd), - new Line($originalIndent.' * '.$lineContent.$lineEnd), - new Line($originalIndent.' */'), - ]; - } - - /** - * @param Line|Line[]|string $line - * - * @return string - */ - private function getSingleLineDocBlockEntry($line) - { - $line = $line[0]; - $line = str_replace('*/', '', $line); - $line = trim($line); - $line = str_split($line); - $i = \count($line); - do { - --$i; - } while ('*' !== $line[$i] && '*' !== $line[$i - 1] && '/' !== $line[$i - 2]); - if (' ' === $line[$i]) { - ++$i; - } - $line = \array_slice($line, $i); - - return implode('', $line); - } - - /** - * @return Annotation[][] - */ - private function filterDocBlock(DocBlock $doc) - { - return array_filter([ - $doc->getAnnotationsOfType('small'), - $doc->getAnnotationsOfType('large'), - $doc->getAnnotationsOfType('medium'), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php deleted file mode 100644 index 98d99bb..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php +++ /dev/null @@ -1,154 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitStrictFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - private static $assertionMap = [ - 'assertAttributeEquals' => 'assertAttributeSame', - 'assertAttributeNotEquals' => 'assertAttributeNotSame', - 'assertEquals' => 'assertSame', - 'assertNotEquals' => 'assertNotSame', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHPUnit methods like `assertSame` should be used instead of `assertEquals`.', - [ - new CodeSample( - 'assertAttributeEquals(a(), b()); - $this->assertAttributeNotEquals(a(), b()); - $this->assertEquals(a(), b()); - $this->assertNotEquals(a(), b()); - } -} -' - ), - new CodeSample( - 'assertAttributeEquals(a(), b()); - $this->assertAttributeNotEquals(a(), b()); - $this->assertEquals(a(), b()); - $this->assertNotEquals(a(), b()); - } -} -', - ['assertions' => ['assertEquals']] - ), - ], - null, - 'Risky when any of the functions are overridden or when testing object equality.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - $functionsAnalyzer = new FunctionsAnalyzer(); - - foreach ($this->configuration['assertions'] as $methodBefore) { - $methodAfter = self::$assertionMap[$methodBefore]; - - for ($index = 0, $limit = $tokens->count(); $index < $limit; ++$index) { - $methodIndex = $tokens->getNextTokenOfKind($index, [[T_STRING, $methodBefore]]); - - if (null === $methodIndex) { - break; - } - - if (!$functionsAnalyzer->isTheSameClassCall($tokens, $methodIndex)) { - continue; - } - - $openingParenthesisIndex = $tokens->getNextMeaningfulToken($methodIndex); - $argumentsCount = $argumentsAnalyzer->countArguments( - $tokens, - $openingParenthesisIndex, - $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openingParenthesisIndex) - ); - - if (2 === $argumentsCount || 3 === $argumentsCount) { - $tokens[$methodIndex] = new Token([T_STRING, $methodAfter]); - } - - $index = $methodIndex; - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolverRootless('assertions', [ - (new FixerOptionBuilder('assertions', 'List of assertion methods to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(array_keys(self::$assertionMap))]) - ->setDefault([ - 'assertAttributeEquals', - 'assertAttributeNotEquals', - 'assertEquals', - 'assertNotEquals', - ]) - ->getOption(), - ], $this->getName()); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php deleted file mode 100644 index 7e5bdf8..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php +++ /dev/null @@ -1,61 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use Composer\Semver\Comparator; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class PhpUnitTargetVersion -{ - const VERSION_3_0 = '3.0'; - const VERSION_3_2 = '3.2'; - const VERSION_3_5 = '3.5'; - const VERSION_4_3 = '4.3'; - const VERSION_4_8 = '4.8'; - const VERSION_5_0 = '5.0'; - const VERSION_5_2 = '5.2'; - const VERSION_5_4 = '5.4'; - const VERSION_5_5 = '5.5'; - const VERSION_5_6 = '5.6'; - const VERSION_5_7 = '5.7'; - const VERSION_6_0 = '6.0'; - const VERSION_7_5 = '7.5'; - const VERSION_NEWEST = 'newest'; - - private function __construct() - { - } - - /** - * @param string $candidate - * @param string $target - * - * @return bool - */ - public static function fulfills($candidate, $target) - { - if (self::VERSION_NEWEST === $target) { - throw new \LogicException(sprintf('Parameter `target` shall not be provided as `%s`, determine proper target for tested PHPUnit feature instead.', self::VERSION_NEWEST)); - } - - if (self::VERSION_NEWEST === $candidate) { - return true; - } - - return Comparator::greaterThanOrEqualTo($candidate, $target); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php deleted file mode 100644 index 462e208..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php +++ /dev/null @@ -1,533 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gert de Pagter - */ -final class PhpUnitTestAnnotationFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Adds or removes @test annotations from tests, following configuration.', - [ - new CodeSample('whitespacesConfig->getLineEnding()), - new CodeSample('whitespacesConfig->getLineEnding(), ['style' => 'annotation']), - ], - null, - 'This fixer may change the name of your tests, and could cause incompatibility with'. - ' abstract classes or interfaces.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoEmptyPhpdocFixer, PhpUnitMethodCasingFixer, PhpdocTrimFixer. - */ - public function getPriority() - { - return 10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAllTokenKindsFound([T_CLASS, T_FUNCTION]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indexes) { - if ('annotation' === $this->configuration['style']) { - $this->applyTestAnnotation($tokens, $indexes[0], $indexes[1]); - } else { - $this->applyTestPrefix($tokens, $indexes[0], $indexes[1]); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('style', 'Whether to use the @test annotation or not.')) - ->setAllowedValues(['prefix', 'annotation']) - ->setDefault('prefix') - ->getOption(), - (new FixerOptionBuilder('case', 'Whether to camel or snake case when adding the test prefix')) - ->setAllowedValues(['camel', 'snake']) - ->setDefault('camel') - ->setDeprecationMessage('Use `php_unit_method_casing` fixer instead.') - ->getOption(), - ]); - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function applyTestAnnotation(Tokens $tokens, $startIndex, $endIndex) - { - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - if (!$this->isTestMethod($tokens, $i)) { - continue; - } - - $functionNameIndex = $tokens->getNextMeaningfulToken($i); - $functionName = $tokens[$functionNameIndex]->getContent(); - - if ($this->hasTestPrefix($functionName) && !$this->hasProperTestAnnotation($tokens, $i)) { - $newFunctionName = $this->removeTestPrefix($functionName); - $tokens[$functionNameIndex] = new Token([T_STRING, $newFunctionName]); - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $i); - - // Create a new docblock if it didn't have one before; - if (!$this->hasDocBlock($tokens, $i)) { - $this->createDocBlock($tokens, $docBlockIndex); - - continue; - } - $lines = $this->updateDocBlock($tokens, $docBlockIndex); - - $lines = $this->addTestAnnotation($lines, $tokens, $docBlockIndex); - - $lines = implode('', $lines); - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $lines]); - } - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function applyTestPrefix(Tokens $tokens, $startIndex, $endIndex) - { - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - // We explicitly check again if the function has a doc block to save some time. - if (!$this->isTestMethod($tokens, $i) || !$this->hasDocBlock($tokens, $i)) { - continue; - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $i); - - $lines = $this->updateDocBlock($tokens, $docBlockIndex); - - $lines = implode('', $lines); - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $lines]); - - $functionNameIndex = $tokens->getNextMeaningfulToken($i); - $functionName = $tokens[$functionNameIndex]->getContent(); - - if ($this->hasTestPrefix($functionName)) { - continue; - } - - $newFunctionName = $this->addTestPrefix($functionName); - $tokens[$functionNameIndex] = new Token([T_STRING, $newFunctionName]); - } - } - - /** - * @param int$index - * - * @return bool - */ - private function isTestMethod(Tokens $tokens, $index) - { - // Check if we are dealing with a (non abstract, non lambda) function - if (!$this->isMethod($tokens, $index)) { - return false; - } - - // if the function name starts with test its a test - $functionNameIndex = $tokens->getNextMeaningfulToken($index); - $functionName = $tokens[$functionNameIndex]->getContent(); - - if ($this->hasTestPrefix($functionName)) { - return true; - } - // If the function doesn't have test in its name, and no doc block, its not a test - if (!$this->hasDocBlock($tokens, $index)) { - return false; - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - $doc = $tokens[$docBlockIndex]->getContent(); - if (false === strpos($doc, '@test')) { - return false; - } - - return true; - } - - /** - * @param int $index - * - * @return bool - */ - private function isMethod(Tokens $tokens, $index) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - return $tokens[$index]->isGivenKind(T_FUNCTION) && !$tokensAnalyzer->isLambda($index); - } - - /** - * @param int $index - * - * @return bool - */ - private function hasDocBlock(Tokens $tokens, $index) - { - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - - return $tokens[$docBlockIndex]->isGivenKind(T_DOC_COMMENT); - } - - /** - * @param int $index - * - * @return int - */ - private function getDocBlockIndex(Tokens $tokens, $index) - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_FINAL, T_ABSTRACT, T_COMMENT])); - - return $index; - } - - /** - * @param string $functionName - * - * @return bool - */ - private function hasTestPrefix($functionName) - { - return 0 === strpos($functionName, 'test'); - } - - /** - * @param int $index - * - * @return bool - */ - private function hasProperTestAnnotation(Tokens $tokens, $index) - { - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - $doc = $tokens[$docBlockIndex]->getContent(); - - return 1 === Preg::match('/\*\s+@test\b/', $doc); - } - - /** - * @param string $functionName - * - * @return string - */ - private function removeTestPrefix($functionName) - { - $remainder = Preg::replace('/^test(?=[A-Z_])_?/', '', $functionName); - - if ('' === $remainder) { - return $functionName; - } - - return lcfirst($remainder); - } - - /** - * @param string $functionName - * - * @return string - */ - private function addTestPrefix($functionName) - { - if ('camel' !== $this->configuration['case']) { - return 'test_'.$functionName; - } - - return'test'.ucfirst($functionName); - } - - /** - * @param int $index - * - * @return string - */ - private function detectIndent(Tokens $tokens, $index) - { - if (!$tokens[$index - 1]->isWhitespace()) { - return ''; // cannot detect indent - } - - $explodedContent = explode($this->whitespacesConfig->getLineEnding(), $tokens[$index - 1]->getContent()); - - return end($explodedContent); - } - - /** - * @param int $docBlockIndex - */ - private function createDocBlock(Tokens $tokens, $docBlockIndex) - { - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $originalIndent = $this->detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - $toInsert = [ - new Token([T_DOC_COMMENT, '/**'.$lineEnd."{$originalIndent} * @test".$lineEnd."{$originalIndent} */"]), - new Token([T_WHITESPACE, $lineEnd.$originalIndent]), - ]; - $index = $tokens->getNextMeaningfulToken($docBlockIndex); - $tokens->insertAt($index, $toInsert); - } - - /** - * @param int $docBlockIndex - * - * @return Line[] - */ - private function updateDocBlock(Tokens $tokens, $docBlockIndex) - { - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - $lines = $doc->getLines(); - - return $this->updateLines($lines, $tokens, $docBlockIndex); - } - - /** - * @param Line[] $lines - * @param int $docBlockIndex - * - * @return Line[] - */ - private function updateLines($lines, Tokens $tokens, $docBlockIndex) - { - $needsAnnotation = 'annotation' === $this->configuration['style']; - - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - for ($i = 0; $i < \count($lines); ++$i) { - // If we need to add test annotation and it is a single line comment we need to deal with that separately - if ($needsAnnotation && ($lines[$i]->isTheStart() && $lines[$i]->isTheEnd())) { - if (!$this->doesDocBlockContainTest($doc)) { - $lines = $this->splitUpDocBlock($lines, $tokens, $docBlockIndex); - - return $this->updateLines($lines, $tokens, $docBlockIndex); - } - // One we split it up, we run the function again, so we deal with other things in a proper way - } - - if (!$needsAnnotation && - false !== strpos($lines[$i]->getContent(), ' @test') && - false === strpos($lines[$i]->getContent(), '@testWith') && - false === strpos($lines[$i]->getContent(), '@testdox') - ) { - // We remove @test from the doc block - $lines[$i] = new Line(str_replace(' @test', '', $lines[$i]->getContent())); - } - // ignore the line if it isn't @depends - if (false === strpos($lines[$i]->getContent(), '@depends')) { - continue; - } - - $lines[$i] = $this->updateDependsAnnotation($lines[$i]); - } - - return $lines; - } - - /** - * Take a one line doc block, and turn it into a multi line doc block. - * - * @param Line[] $lines - * @param int $docBlockIndex - * - * @return Line[] - */ - private function splitUpDocBlock($lines, Tokens $tokens, $docBlockIndex) - { - $lineContent = $this->getSingleLineDocBlockEntry($lines); - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $originalIndent = $this->detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - - return [ - new Line('/**'.$lineEnd), - new Line($originalIndent.' * '.$lineContent.$lineEnd), - new Line($originalIndent.' */'), - ]; - } - - /** - * @param Line []$line - * - * @return string - */ - private function getSingleLineDocBlockEntry($line) - { - $line = $line[0]; - $line = str_replace('*/', '', $line); - $line = trim($line); - $line = str_split($line); - $i = \count($line); - do { - --$i; - } while ('*' !== $line[$i] && '*' !== $line[$i - 1] && '/' !== $line[$i - 2]); - if (' ' === $line[$i]) { - ++$i; - } - $line = \array_slice($line, $i); - - return implode('', $line); - } - - /** - * Updates the depends tag on the current doc block. - * - * @return Line - */ - private function updateDependsAnnotation(Line $line) - { - if ('annotation' === $this->configuration['style']) { - return $this->removeTestPrefixFromDependsAnnotation($line); - } - - return $this->addTestPrefixToDependsAnnotation($line); - } - - /** - * @return Line - */ - private function removeTestPrefixFromDependsAnnotation(Line $line) - { - $line = str_split($line->getContent()); - - $dependsIndex = $this->findWhereDependsFunctionNameStarts($line); - $dependsFunctionName = implode('', \array_slice($line, $dependsIndex)); - - if ($this->hasTestPrefix($dependsFunctionName)) { - $dependsFunctionName = $this->removeTestPrefix($dependsFunctionName); - } - array_splice($line, $dependsIndex); - - return new Line(implode('', $line).$dependsFunctionName); - } - - /** - * @return Line - */ - private function addTestPrefixToDependsAnnotation(Line $line) - { - $line = str_split($line->getContent()); - $dependsIndex = $this->findWhereDependsFunctionNameStarts($line); - $dependsFunctionName = implode('', \array_slice($line, $dependsIndex)); - - if (!$this->hasTestPrefix($dependsFunctionName)) { - $dependsFunctionName = $this->addTestPrefix($dependsFunctionName); - } - - array_splice($line, $dependsIndex); - - return new Line(implode('', $line).$dependsFunctionName); - } - - /** - * Helps to find where the function name in the doc block starts. - * - * @return int - */ - private function findWhereDependsFunctionNameStarts(array $line) - { - $counter = \count($line); - - do { - --$counter; - } while (' ' !== $line[$counter]); - - return $counter + 1; - } - - /** - * @param Line[] $lines - * @param int $docBlockIndex - * - * @return Line[] - */ - private function addTestAnnotation($lines, Tokens $tokens, $docBlockIndex) - { - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - - if (!$this->doesDocBlockContainTest($doc)) { - $originalIndent = $this->detectIndent($tokens, $docBlockIndex); - $lineEnd = $this->whitespacesConfig->getLineEnding(); - - array_splice($lines, -1, 0, $originalIndent.' *'.$lineEnd.$originalIndent.' * @test'.$lineEnd); - } - - return $lines; - } - - /** - * @return bool - */ - private function doesDocBlockContainTest(DocBlock $doc) - { - return !empty($doc->getAnnotationsOfType('test')); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php deleted file mode 100644 index 133cab3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php +++ /dev/null @@ -1,474 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Filippo Tessarotto - */ -final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * @internal - */ - const CALL_TYPE_THIS = 'this'; - - /** - * @internal - */ - const CALL_TYPE_SELF = 'self'; - - /** - * @internal - */ - const CALL_TYPE_STATIC = 'static'; - - private $allowedValues = [ - self::CALL_TYPE_THIS => true, - self::CALL_TYPE_SELF => true, - self::CALL_TYPE_STATIC => true, - ]; - - private $staticMethods = [ - // Assert methods - 'anything' => true, - 'arrayHasKey' => true, - 'assertArrayHasKey' => true, - 'assertArrayNotHasKey' => true, - 'assertArraySubset' => true, - 'assertAttributeContains' => true, - 'assertAttributeContainsOnly' => true, - 'assertAttributeCount' => true, - 'assertAttributeEmpty' => true, - 'assertAttributeEquals' => true, - 'assertAttributeGreaterThan' => true, - 'assertAttributeGreaterThanOrEqual' => true, - 'assertAttributeInstanceOf' => true, - 'assertAttributeInternalType' => true, - 'assertAttributeLessThan' => true, - 'assertAttributeLessThanOrEqual' => true, - 'assertAttributeNotContains' => true, - 'assertAttributeNotContainsOnly' => true, - 'assertAttributeNotCount' => true, - 'assertAttributeNotEmpty' => true, - 'assertAttributeNotEquals' => true, - 'assertAttributeNotInstanceOf' => true, - 'assertAttributeNotInternalType' => true, - 'assertAttributeNotSame' => true, - 'assertAttributeSame' => true, - 'assertClassHasAttribute' => true, - 'assertClassHasStaticAttribute' => true, - 'assertClassNotHasAttribute' => true, - 'assertClassNotHasStaticAttribute' => true, - 'assertContains' => true, - 'assertContainsEquals' => true, - 'assertContainsOnly' => true, - 'assertContainsOnlyInstancesOf' => true, - 'assertCount' => true, - 'assertDirectoryExists' => true, - 'assertDirectoryIsReadable' => true, - 'assertDirectoryIsWritable' => true, - 'assertDirectoryNotExists' => true, - 'assertDirectoryNotIsReadable' => true, - 'assertDirectoryNotIsWritable' => true, - 'assertEmpty' => true, - 'assertEqualXMLStructure' => true, - 'assertEquals' => true, - 'assertEqualsCanonicalizing' => true, - 'assertEqualsIgnoringCase' => true, - 'assertEqualsWithDelta' => true, - 'assertFalse' => true, - 'assertFileEquals' => true, - 'assertFileExists' => true, - 'assertFileIsReadable' => true, - 'assertFileIsWritable' => true, - 'assertFileNotEquals' => true, - 'assertFileNotExists' => true, - 'assertFileNotIsReadable' => true, - 'assertFileNotIsWritable' => true, - 'assertFinite' => true, - 'assertGreaterThan' => true, - 'assertGreaterThanOrEqual' => true, - 'assertInfinite' => true, - 'assertInstanceOf' => true, - 'assertInternalType' => true, - 'assertIsArray' => true, - 'assertIsBool' => true, - 'assertIsCallable' => true, - 'assertIsFloat' => true, - 'assertIsInt' => true, - 'assertIsIterable' => true, - 'assertIsNotArray' => true, - 'assertIsNotBool' => true, - 'assertIsNotCallable' => true, - 'assertIsNotFloat' => true, - 'assertIsNotInt' => true, - 'assertIsNotIterable' => true, - 'assertIsNotNumeric' => true, - 'assertIsNotObject' => true, - 'assertIsNotResource' => true, - 'assertIsNotScalar' => true, - 'assertIsNotString' => true, - 'assertIsNumeric' => true, - 'assertIsObject' => true, - 'assertIsReadable' => true, - 'assertIsResource' => true, - 'assertIsScalar' => true, - 'assertIsString' => true, - 'assertIsWritable' => true, - 'assertJson' => true, - 'assertJsonFileEqualsJsonFile' => true, - 'assertJsonFileNotEqualsJsonFile' => true, - 'assertJsonStringEqualsJsonFile' => true, - 'assertJsonStringEqualsJsonString' => true, - 'assertJsonStringNotEqualsJsonFile' => true, - 'assertJsonStringNotEqualsJsonString' => true, - 'assertLessThan' => true, - 'assertLessThanOrEqual' => true, - 'assertNan' => true, - 'assertNotContains' => true, - 'assertNotContainsEquals' => true, - 'assertNotContainsOnly' => true, - 'assertNotCount' => true, - 'assertNotEmpty' => true, - 'assertNotEquals' => true, - 'assertNotEqualsCanonicalizing' => true, - 'assertNotEqualsIgnoringCase' => true, - 'assertNotEqualsWithDelta' => true, - 'assertNotFalse' => true, - 'assertNotInstanceOf' => true, - 'assertNotInternalType' => true, - 'assertNotIsReadable' => true, - 'assertNotIsWritable' => true, - 'assertNotNull' => true, - 'assertNotRegExp' => true, - 'assertNotSame' => true, - 'assertNotSameSize' => true, - 'assertNotTrue' => true, - 'assertNull' => true, - 'assertObjectHasAttribute' => true, - 'assertObjectNotHasAttribute' => true, - 'assertRegExp' => true, - 'assertSame' => true, - 'assertSameSize' => true, - 'assertStringContainsString' => true, - 'assertStringContainsStringIgnoringCase' => true, - 'assertStringEndsNotWith' => true, - 'assertStringEndsWith' => true, - 'assertStringEqualsFile' => true, - 'assertStringMatchesFormat' => true, - 'assertStringMatchesFormatFile' => true, - 'assertStringNotContainsString' => true, - 'assertStringNotContainsStringIgnoringCase' => true, - 'assertStringNotEqualsFile' => true, - 'assertStringNotMatchesFormat' => true, - 'assertStringNotMatchesFormatFile' => true, - 'assertStringStartsNotWith' => true, - 'assertStringStartsWith' => true, - 'assertThat' => true, - 'assertTrue' => true, - 'assertXmlFileEqualsXmlFile' => true, - 'assertXmlFileNotEqualsXmlFile' => true, - 'assertXmlStringEqualsXmlFile' => true, - 'assertXmlStringEqualsXmlString' => true, - 'assertXmlStringNotEqualsXmlFile' => true, - 'assertXmlStringNotEqualsXmlString' => true, - 'attribute' => true, - 'attributeEqualTo' => true, - 'callback' => true, - 'classHasAttribute' => true, - 'classHasStaticAttribute' => true, - 'contains' => true, - 'containsOnly' => true, - 'containsOnlyInstancesOf' => true, - 'countOf' => true, - 'directoryExists' => true, - 'equalTo' => true, - 'fail' => true, - 'fileExists' => true, - 'getCount' => true, - 'getObjectAttribute' => true, - 'getStaticAttribute' => true, - 'greaterThan' => true, - 'greaterThanOrEqual' => true, - 'identicalTo' => true, - 'isEmpty' => true, - 'isFalse' => true, - 'isFinite' => true, - 'isInfinite' => true, - 'isInstanceOf' => true, - 'isJson' => true, - 'isNan' => true, - 'isNull' => true, - 'isReadable' => true, - 'isTrue' => true, - 'isType' => true, - 'isWritable' => true, - 'lessThan' => true, - 'lessThanOrEqual' => true, - 'logicalAnd' => true, - 'logicalNot' => true, - 'logicalOr' => true, - 'logicalXor' => true, - 'markTestIncomplete' => true, - 'markTestSkipped' => true, - 'matches' => true, - 'matchesRegularExpression' => true, - 'objectHasAttribute' => true, - 'readAttribute' => true, - 'resetCount' => true, - 'stringContains' => true, - 'stringEndsWith' => true, - 'stringStartsWith' => true, - - // TestCase methods - 'any' => true, - 'at' => true, - 'atLeast' => true, - 'atLeastOnce' => true, - 'atMost' => true, - 'exactly' => true, - 'never' => true, - 'onConsecutiveCalls' => true, - 'once' => true, - 'returnArgument' => true, - 'returnCallback' => true, - 'returnSelf' => true, - 'returnValue' => true, - 'returnValueMap' => true, - 'setUpBeforeClass' => true, - 'tearDownAfterClass' => true, - 'throwException' => true, - ]; - - private $conversionMap = [ - self::CALL_TYPE_THIS => [[T_OBJECT_OPERATOR, '->'], [T_VARIABLE, '$this']], - self::CALL_TYPE_SELF => [[T_DOUBLE_COLON, '::'], [T_STRING, 'self']], - self::CALL_TYPE_STATIC => [[T_DOUBLE_COLON, '::'], [T_STATIC, 'static']], - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - $codeSample = 'assertSame(1, 2); - self::assertSame(1, 2); - static::assertSame(1, 2); - } -} -'; - - return new FixerDefinition( - 'Calls to `PHPUnit\Framework\TestCase` static methods must all be of the same type, either `$this->`, `self::` or `static::`.', - [ - new CodeSample($codeSample), - new CodeSample($codeSample, ['call_type' => self::CALL_TYPE_THIS]), - ], - null, - 'Risky when PHPUnit methods are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before FinalStaticAccessFixer, SelfStaticAccessorFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAllTokenKindsFound([T_CLASS, T_STRING]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indexes) { - $this->fixPhpUnitClass($tokens, $indexes[0], $indexes[1]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $thisFixer = $this; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('call_type', 'The call type to use for referring to PHPUnit methods.')) - ->setAllowedTypes(['string']) - ->setAllowedValues(array_keys($this->allowedValues)) - ->setDefault('static') - ->getOption(), - (new FixerOptionBuilder('methods', 'Dictionary of `method` => `call_type` values that differ from the default strategy.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function ($option) use ($thisFixer) { - foreach ($option as $method => $value) { - if (!isset($thisFixer->staticMethods[$method])) { - throw new InvalidOptionsException( - sprintf( - 'Unexpected "methods" key, expected any of "%s", got "%s".', - implode('", "', array_keys($thisFixer->staticMethods)), - \is_object($method) ? \get_class($method) : \gettype($method).'#'.$method - ) - ); - } - - if (!isset($thisFixer->allowedValues[$value])) { - throw new InvalidOptionsException( - sprintf( - 'Unexpected value for method "%s", expected any of "%s", got "%s".', - $method, - implode('", "', array_keys($thisFixer->allowedValues)), - \is_object($value) ? \get_class($value) : (null === $value ? 'null' : \gettype($value).'#'.$value) - ) - ); - } - } - - return true; - }]) - ->setDefault([]) - ->getOption(), - ]); - } - - /** - * @param int $startIndex - * @param int $endIndex - */ - private function fixPhpUnitClass(Tokens $tokens, $startIndex, $endIndex) - { - $analyzer = new TokensAnalyzer($tokens); - - for ($index = $startIndex; $index < $endIndex; ++$index) { - // skip anonymous classes - if ($tokens[$index]->isGivenKind(T_CLASS)) { - $index = $this->findEndOfNextBlock($tokens, $index); - - continue; - } - - $callType = $this->configuration['call_type']; - - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { - // skip lambda - if ($analyzer->isLambda($index)) { - $index = $this->findEndOfNextBlock($tokens, $index); - - continue; - } - - // do not change `self` to `this` in static methods - if ('this' === $callType) { - $attributes = $analyzer->getMethodAttributes($index); - if (false !== $attributes['static']) { - $index = $this->findEndOfNextBlock($tokens, $index); - - continue; - } - } - } - - if (!$tokens[$index]->isGivenKind(T_STRING) || !isset($this->staticMethods[$tokens[$index]->getContent()])) { - continue; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$nextIndex]->equals('(')) { - $index = $nextIndex; - - continue; - } - - $methodName = $tokens[$index]->getContent(); - - if (isset($this->configuration['methods'][$methodName])) { - $callType = $this->configuration['methods'][$methodName]; - } - - $operatorIndex = $tokens->getPrevMeaningfulToken($index); - $referenceIndex = $tokens->getPrevMeaningfulToken($operatorIndex); - if (!$this->needsConversion($tokens, $index, $referenceIndex, $callType)) { - continue; - } - - $tokens[$operatorIndex] = new Token($this->conversionMap[$callType][0]); - $tokens[$referenceIndex] = new Token($this->conversionMap[$callType][1]); - } - } - - /** - * @param int $index - * @param int $referenceIndex - * @param string $callType - * - * @return bool - */ - private function needsConversion(Tokens $tokens, $index, $referenceIndex, $callType) - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - return $functionsAnalyzer->isTheSameClassCall($tokens, $index) - && !$tokens[$referenceIndex]->equals($this->conversionMap[$callType][1], false); - } - - /** - * @param int $index - * - * @return int - */ - private function findEndOfNextBlock(Tokens $tokens, $index) - { - $index = $tokens->getNextTokenOfKind($index, ['{']); - - return $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php deleted file mode 100644 index 8ca4c9f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php +++ /dev/null @@ -1,150 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitTestClassRequiresCoversFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Adds a default `@coversNothing` annotation to PHPUnit test classes that have no `@covers*` annotation.', - [ - new CodeSample( - 'assertSame(a(), b()); - } -} -' - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_CLASS); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indexes) { - $this->addRequiresCover($tokens, $indexes[0]); - } - } - - private function addRequiresCover(Tokens $tokens, $startIndex) - { - $classIndex = $tokens->getPrevTokenOfKind($startIndex, [[T_CLASS]]); - $prevIndex = $tokens->getPrevMeaningfulToken($classIndex); - - // don't add `@covers` annotation for abstract base classes - if ($tokens[$prevIndex]->isGivenKind(T_ABSTRACT)) { - return; - } - - $index = $tokens[$prevIndex]->isGivenKind(T_FINAL) ? $prevIndex : $classIndex; - - $indent = $tokens[$index - 1]->isGivenKind(T_WHITESPACE) - ? Preg::replace('/^.*\R*/', '', $tokens[$index - 1]->getContent()) - : ''; - - $prevIndex = $tokens->getPrevNonWhitespace($index); - - if ($tokens[$prevIndex]->isGivenKind(T_DOC_COMMENT)) { - $docIndex = $prevIndex; - $docContent = $tokens[$docIndex]->getContent(); - - // ignore one-line phpdocs like `/** foo */`, as there is no place to put new annotations - if (false === strpos($docContent, "\n")) { - return; - } - - $doc = new DocBlock($docContent); - - // skip if already has annotation - if (!empty($doc->getAnnotationsOfType([ - 'covers', - 'coversDefaultClass', - 'coversNothing', - ]))) { - return; - } - } else { - $docIndex = $index; - $tokens->insertAt($docIndex, [ - new Token([T_DOC_COMMENT, sprintf('/**%s%s */', $this->whitespacesConfig->getLineEnding(), $indent)]), - new Token([T_WHITESPACE, sprintf('%s%s', $this->whitespacesConfig->getLineEnding(), $indent)]), - ]); - - if (!$tokens[$docIndex - 1]->isGivenKind(T_WHITESPACE)) { - $extraNewLines = $this->whitespacesConfig->getLineEnding(); - - if (!$tokens[$docIndex - 1]->isGivenKind(T_OPEN_TAG)) { - $extraNewLines .= $this->whitespacesConfig->getLineEnding(); - } - - $tokens->insertAt($docIndex, [ - new Token([T_WHITESPACE, $extraNewLines.$indent]), - ]); - ++$docIndex; - } - - $doc = new DocBlock($tokens[$docIndex]->getContent()); - } - - $lines = $doc->getLines(); - array_splice( - $lines, - \count($lines) - 1, - 0, - [ - new Line(sprintf( - '%s * @coversNothing%s', - $indent, - $this->whitespacesConfig->getLineEnding() - )), - ] - ); - - $tokens[$docIndex] = new Token([T_DOC_COMMENT, implode('', $lines)]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php deleted file mode 100644 index 3ac63a8..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php +++ /dev/null @@ -1,171 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - * @author Julien Falque - */ -final class AlignMultilineCommentFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - private $tokenKinds; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->tokenKinds = [T_DOC_COMMENT]; - if ('phpdocs_only' !== $this->configuration['comment_type']) { - $this->tokenKinds[] = T_COMMENT; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Each line of multi-line DocComments must have an asterisk [PSR-5] and must be aligned with the first one.', - [ - new CodeSample( - ' 'phpdocs_like'] - ), - new CodeSample( - ' 'all_multiline'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after ArrayIndentationFixer. - */ - public function getPriority() - { - return -40; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound($this->tokenKinds); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind($this->tokenKinds)) { - continue; - } - - $whitespace = ''; - $previousIndex = $index - 1; - if ($tokens[$previousIndex]->isWhitespace()) { - $whitespace = $tokens[$previousIndex]->getContent(); - --$previousIndex; - } - if ($tokens[$previousIndex]->isGivenKind(T_OPEN_TAG)) { - $whitespace = Preg::replace('/\S/', '', $tokens[$previousIndex]->getContent()).$whitespace; - } - - if (1 !== Preg::match('/\R(\h*)$/', $whitespace, $matches)) { - continue; - } - - if ($token->isGivenKind(T_COMMENT) && 'all_multiline' !== $this->configuration['comment_type'] && 1 === Preg::match('/\R(?:\R|\s*[^\s\*])/', $token->getContent())) { - continue; - } - - $indentation = $matches[1]; - $lines = Preg::split('/\R/u', $token->getContent()); - - foreach ($lines as $lineNumber => $line) { - if (0 === $lineNumber) { - continue; - } - - $line = ltrim($line); - if ($token->isGivenKind(T_COMMENT) && (!isset($line[0]) || '*' !== $line[0])) { - continue; - } - - if (!isset($line[0])) { - $line = '*'; - } elseif ('*' !== $line[0]) { - $line = '* '.$line; - } - - $lines[$lineNumber] = $indentation.' '.$line; - } - - $tokens[$index] = new Token([$token->getId(), implode($lineEnding, $lines)]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('comment_type', 'Whether to fix PHPDoc comments only (`phpdocs_only`), any multi-line comment whose lines all start with an asterisk (`phpdocs_like`) or any multi-line comment (`all_multiline`).')) - ->setAllowedValues(['phpdocs_only', 'phpdocs_like', 'all_multiline']) - ->setDefault('phpdocs_only') - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php deleted file mode 100644 index 4a52d97..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php +++ /dev/null @@ -1,130 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - * @author Dariusz Rumiński - */ -final class GeneralPhpdocAnnotationRemoveFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Configured annotations should be omitted from PHPDoc.', - [ - new CodeSample( - ' ['author']] - ), - new CodeSample( - ' ['package', 'subpackage']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoEmptyPhpdocFixer, PhpdocAlignFixer, PhpdocLineSpanFixer, PhpdocSeparationFixer, PhpdocTrimFixer. - * Must run after CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority() - { - return 10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - if (!\count($this->configuration['annotations'])) { - return; - } - - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $annotations = $doc->getAnnotationsOfType($this->configuration['annotations']); - - // nothing to do if there are no annotations - if (empty($annotations)) { - continue; - } - - foreach ($annotations as $annotation) { - $annotation->remove(); - } - - if ('' === $doc->getContent()) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } else { - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolverRootless('annotations', [ - (new FixerOptionBuilder('annotations', 'List of annotations to remove, e.g. `["author"]`.')) - ->setAllowedTypes(['array']) - ->setDefault([]) - ->getOption(), - ], $this->getName()); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoBlankLinesAfterPhpdocFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoBlankLinesAfterPhpdocFixer.php deleted file mode 100644 index 451f8e1..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoBlankLinesAfterPhpdocFixer.php +++ /dev/null @@ -1,113 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class NoBlankLinesAfterPhpdocFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There should not be blank lines between docblock and the documented element.', - [ - new CodeSample( - ' $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - // get the next non-whitespace token inc comments, provided - // that there is whitespace between it and the current token - $next = $tokens->getNextNonWhitespace($index); - if ($index + 2 === $next && false === $tokens[$next]->isGivenKind($forbiddenSuccessors)) { - $this->fixWhitespace($tokens, $index + 1); - } - } - } - - /** - * Cleanup a whitespace token. - * - * @param int $index - */ - private function fixWhitespace(Tokens $tokens, $index) - { - $content = $tokens[$index]->getContent(); - // if there is more than one new line in the whitespace, then we need to fix it - if (substr_count($content, "\n") > 1) { - // the final bit of the whitespace must be the next statement's indentation - $tokens[$index] = new Token([T_WHITESPACE, substr($content, strrpos($content, "\n"))]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php deleted file mode 100644 index 9545ff4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php +++ /dev/null @@ -1,71 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoEmptyPhpdocFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There should not be empty PHPDoc blocks.', - [new CodeSample("isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - if (Preg::match('#^/\*\*[\s\*]*\*/$#', $token->getContent())) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php deleted file mode 100644 index 74b2579..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php +++ /dev/null @@ -1,506 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -final class NoSuperfluousPhpdocTagsFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Removes `@param`, `@return` and `@var` tags that don\'t provide any useful information.', - [ - new CodeSample(' true]), - new VersionSpecificCodeSample(' true]), - new CodeSample(' true]), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoEmptyPhpdocFixer, PhpdocAlignFixer. - * Must run after CommentToPhpdocFixer, FullyQualifiedStrictTypesFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocIndentFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToReturnTypeFixer, PhpdocTypesFixer. - */ - public function getPriority() - { - return 6; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $namespaceUseAnalyzer = new NamespaceUsesAnalyzer(); - - $shortNames = []; - foreach ($namespaceUseAnalyzer->getDeclarationsFromTokens($tokens) as $namespaceUseAnalysis) { - $shortNames[strtolower($namespaceUseAnalysis->getShortName())] = '\\'.strtolower($namespaceUseAnalysis->getFullName()); - } - - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $content = $initialContent = $token->getContent(); - - $documentedElementIndex = $this->findDocumentedElement($tokens, $index); - - if (null === $documentedElementIndex) { - continue; - } - - $token = $tokens[$documentedElementIndex]; - - if ($token->isGivenKind(T_FUNCTION)) { - $content = $this->fixFunctionDocComment($content, $tokens, $index, $shortNames); - } elseif ($token->isGivenKind(T_VARIABLE)) { - $content = $this->fixPropertyDocComment($content, $tokens, $index, $shortNames); - } - - if ($this->configuration['remove_inheritdoc']) { - $content = $this->removeSuperfluousInheritDoc($content); - } - - if ($content !== $initialContent) { - $tokens[$index] = new Token([T_DOC_COMMENT, $content]); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('allow_mixed', 'Whether type `mixed` without description is allowed (`true`) or considered superfluous (`false`)')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('remove_inheritdoc', 'Remove `@inheritDoc` tags')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('allow_unused_params', 'Whether `param` annotation without actual signature is allowed (`true`) or considered superfluous (`false`)')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * @param int $docCommentIndex - * - * @return null|int - */ - private function findDocumentedElement(Tokens $tokens, $docCommentIndex) - { - $index = $docCommentIndex; - - do { - $index = $tokens->getNextMeaningfulToken($index); - - if (null === $index || $tokens[$index]->isGivenKind([T_FUNCTION, T_CLASS, T_INTERFACE])) { - return $index; - } - } while ($tokens[$index]->isGivenKind([T_ABSTRACT, T_FINAL, T_STATIC, T_PRIVATE, T_PROTECTED, T_PUBLIC])); - - $index = $tokens->getNextMeaningfulToken($docCommentIndex); - - $kindsBeforeProperty = [T_STATIC, T_PRIVATE, T_PROTECTED, T_PUBLIC, CT::T_NULLABLE_TYPE, CT::T_ARRAY_TYPEHINT, T_STRING, T_NS_SEPARATOR]; - - if (!$tokens[$index]->isGivenKind($kindsBeforeProperty)) { - return null; - } - - do { - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(T_VARIABLE)) { - return $index; - } - } while ($tokens[$index]->isGivenKind($kindsBeforeProperty)); - - return null; - } - - /** - * @param string $content - * @param int $functionIndex - * - * @return string - */ - private function fixFunctionDocComment($content, Tokens $tokens, $functionIndex, array $shortNames) - { - $docBlock = new DocBlock($content); - - $openingParenthesisIndex = $tokens->getNextTokenOfKind($functionIndex, ['(']); - $closingParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openingParenthesisIndex); - - $argumentsInfo = $this->getArgumentsInfo( - $tokens, - $openingParenthesisIndex + 1, - $closingParenthesisIndex - 1 - ); - - foreach ($docBlock->getAnnotationsOfType('param') as $annotation) { - if (0 === Preg::match('/@param(?:\s+[^\$]\S+)?\s+(\$\S+)/', $annotation->getContent(), $matches)) { - continue; - } - - $argumentName = $matches[1]; - - if (!isset($argumentsInfo[$argumentName]) && $this->configuration['allow_unused_params']) { - continue; - } - - if (!isset($argumentsInfo[$argumentName]) || $this->annotationIsSuperfluous($annotation, $argumentsInfo[$argumentName], $shortNames)) { - $annotation->remove(); - } - } - - $returnTypeInfo = $this->getReturnTypeInfo($tokens, $closingParenthesisIndex); - - foreach ($docBlock->getAnnotationsOfType('return') as $annotation) { - if ($this->annotationIsSuperfluous($annotation, $returnTypeInfo, $shortNames)) { - $annotation->remove(); - } - } - - return $docBlock->getContent(); - } - - /** - * @param string $content - * @param int $index Index of the DocComment token - * - * @return string - */ - private function fixPropertyDocComment($content, Tokens $tokens, $index, array $shortNames) - { - $docBlock = new DocBlock($content); - - do { - $index = $tokens->getNextMeaningfulToken($index); - } while ($tokens[$index]->isGivenKind([T_STATIC, T_PRIVATE, T_PROTECTED, T_PUBLIC])); - - $propertyTypeInfo = $this->getPropertyTypeInfo($tokens, $index); - - foreach ($docBlock->getAnnotationsOfType('var') as $annotation) { - if ($this->annotationIsSuperfluous($annotation, $propertyTypeInfo, $shortNames)) { - $annotation->remove(); - } - } - - return $docBlock->getContent(); - } - - /** - * @param int $start - * @param int $end - * - * @return array - */ - private function getArgumentsInfo(Tokens $tokens, $start, $end) - { - $argumentsInfo = []; - - for ($index = $start; $index <= $end; ++$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_VARIABLE)) { - continue; - } - - $beforeArgumentIndex = $tokens->getPrevTokenOfKind($index, ['(', ',']); - $typeIndex = $tokens->getNextMeaningfulToken($beforeArgumentIndex); - - if ($typeIndex !== $index) { - $info = $this->parseTypeHint($tokens, $typeIndex); - } else { - $info = [ - 'type' => null, - 'allows_null' => true, - ]; - } - - if (!$info['allows_null']) { - $nextIndex = $tokens->getNextMeaningfulToken($index); - if ( - $tokens[$nextIndex]->equals('=') - && $tokens[$tokens->getNextMeaningfulToken($nextIndex)]->equals([T_STRING, 'null']) - ) { - $info['allows_null'] = true; - } - } - - $argumentsInfo[$token->getContent()] = $info; - } - - return $argumentsInfo; - } - - private function getReturnTypeInfo(Tokens $tokens, $closingParenthesisIndex) - { - $colonIndex = $tokens->getNextMeaningfulToken($closingParenthesisIndex); - if ($tokens[$colonIndex]->isGivenKind(CT::T_TYPE_COLON)) { - return $this->parseTypeHint($tokens, $tokens->getNextMeaningfulToken($colonIndex)); - } - - return [ - 'type' => null, - 'allows_null' => true, - ]; - } - - /** - * @param int $index The index of the first token of the type hint - * - * @return array - */ - private function getPropertyTypeInfo(Tokens $tokens, $index) - { - if ($tokens[$index]->isGivenKind(T_VARIABLE)) { - return [ - 'type' => null, - 'allows_null' => true, - ]; - } - - return $this->parseTypeHint($tokens, $index); - } - - /** - * @param int $index The index of the first token of the type hint - * - * @return array - */ - private function parseTypeHint(Tokens $tokens, $index) - { - $allowsNull = false; - if ($tokens[$index]->isGivenKind(CT::T_NULLABLE_TYPE)) { - $allowsNull = true; - $index = $tokens->getNextMeaningfulToken($index); - } - - $type = ''; - while ($tokens[$index]->isGivenKind([T_NS_SEPARATOR, T_STRING, CT::T_ARRAY_TYPEHINT, T_CALLABLE])) { - $type .= $tokens[$index]->getContent(); - - $index = $tokens->getNextMeaningfulToken($index); - } - - return [ - 'type' => '' === $type ? null : $type, - 'allows_null' => $allowsNull, - ]; - } - - /** - * @param array $symbolShortNames - * - * @return bool - */ - private function annotationIsSuperfluous(Annotation $annotation, array $info, array $symbolShortNames) - { - if ('param' === $annotation->getTag()->getName()) { - $regex = '/@param\s+(?:\S|\s(?!\$))++\s\$\S+\s+\S/'; - } elseif ('var' === $annotation->getTag()->getName()) { - $regex = '/@var\s+\S+(\s+\$\S+)?(\s+)([^$\s]+)/'; - } else { - $regex = '/@return\s+\S+\s+\S/'; - } - - if (Preg::match($regex, $annotation->getContent())) { - return false; - } - - $annotationTypes = $this->toComparableNames($annotation->getTypes(), $symbolShortNames); - - if (['null'] === $annotationTypes) { - return false; - } - - if (['mixed'] === $annotationTypes && null === $info['type']) { - return !$this->configuration['allow_mixed']; - } - - $actualTypes = null === $info['type'] ? [] : [$info['type']]; - if ($info['allows_null']) { - $actualTypes[] = 'null'; - } - - return $annotationTypes === $this->toComparableNames($actualTypes, $symbolShortNames); - } - - /** - * Normalizes types to make them comparable. - * - * Converts given types to lowercase, replaces imports aliases with - * their matching FQCN, and finally sorts the result. - * - * @param string[] $types The types to normalize - * @param array $symbolShortNames The imports aliases - * - * @return array The normalized types - */ - private function toComparableNames(array $types, array $symbolShortNames) - { - $normalized = array_map( - static function ($type) use ($symbolShortNames) { - $type = strtolower($type); - - if (isset($symbolShortNames[$type])) { - return $symbolShortNames[$type]; - } - - return $type; - }, - $types - ); - - sort($normalized); - - return $normalized; - } - - /** - * @param string $docComment - * - * @return string - */ - private function removeSuperfluousInheritDoc($docComment) - { - return Preg::replace('~ - # $1: before @inheritDoc tag - ( - # beginning of comment or a PHPDoc tag - (?: - ^/\*\* - (?: - \R - [ \t]*(?:\*[ \t]*)? - )*? - | - @\N+ - ) - - # empty comment lines - (?: - \R - [ \t]*(?:\*[ \t]*?)? - )* - ) - - # spaces before @inheritDoc tag - [ \t]* - - # @inheritDoc tag - (?:@inheritDocs?|\{@inheritDocs?\}) - - # $2: after @inheritDoc tag - ( - # empty comment lines - (?: - \R - [ \t]*(?:\*[ \t]*)? - )* - - # a PHPDoc tag or end of comment - (?: - @\N+ - | - (?: - \R - [ \t]*(?:\*[ \t]*)? - )* - [ \t]*\*/$ - ) - ) - ~ix', '$1$2', $docComment); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php deleted file mode 100644 index 3535d5a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php +++ /dev/null @@ -1,278 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpdocAddMissingParamAnnotationFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHPDoc should contain `@param` for all params.', - [ - new CodeSample( - ' true] - ), - new CodeSample( - ' false] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer, PhpdocAlignFixer, PhpdocOrderFixer. - * Must run after CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocNoAliasTagFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority() - { - return 10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - for ($index = 0, $limit = $tokens->count(); $index < $limit; ++$index) { - $mainIndex = $index; - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $tokenContent = $token->getContent(); - - if (false !== stripos($tokenContent, 'inheritdoc')) { - continue; - } - - // ignore one-line phpdocs like `/** foo */`, as there is no place to put new annotations - if (false === strpos($tokenContent, "\n")) { - continue; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if (null === $index) { - return; - } - - while ($tokens[$index]->isGivenKind([ - T_ABSTRACT, - T_FINAL, - T_PRIVATE, - T_PROTECTED, - T_PUBLIC, - T_STATIC, - T_VAR, - ])) { - $index = $tokens->getNextMeaningfulToken($index); - } - - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - $openIndex = $tokens->getNextTokenOfKind($index, ['(']); - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - - $arguments = []; - - foreach ($argumentsAnalyzer->getArguments($tokens, $openIndex, $index) as $start => $end) { - $argumentInfo = $this->prepareArgumentInformation($tokens, $start, $end); - - if (!$this->configuration['only_untyped'] || '' === $argumentInfo['type']) { - $arguments[$argumentInfo['name']] = $argumentInfo; - } - } - - if (!\count($arguments)) { - continue; - } - - $doc = new DocBlock($tokenContent); - $lastParamLine = null; - - foreach ($doc->getAnnotationsOfType('param') as $annotation) { - $pregMatched = Preg::match('/^[^$]+(\$\w+).*$/s', $annotation->getContent(), $matches); - - if (1 === $pregMatched) { - unset($arguments[$matches[1]]); - } - - $lastParamLine = max($lastParamLine, $annotation->getEnd()); - } - - if (!\count($arguments)) { - continue; - } - - $lines = $doc->getLines(); - $linesCount = \count($lines); - - Preg::match('/^(\s*).*$/', $lines[$linesCount - 1]->getContent(), $matches); - $indent = $matches[1]; - - $newLines = []; - - foreach ($arguments as $argument) { - $type = $argument['type'] ?: 'mixed'; - - if ('?' !== $type[0] && 'null' === strtolower($argument['default'])) { - $type = 'null|'.$type; - } - - $newLines[] = new Line(sprintf( - '%s* @param %s %s%s', - $indent, - $type, - $argument['name'], - $this->whitespacesConfig->getLineEnding() - )); - } - - array_splice( - $lines, - $lastParamLine ? $lastParamLine + 1 : $linesCount - 1, - 0, - $newLines - ); - - $tokens[$mainIndex] = new Token([T_DOC_COMMENT, implode('', $lines)]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('only_untyped', 'Whether to add missing `@param` annotations for untyped parameters only.')) - ->setDefault(true) - ->setAllowedTypes(['bool']) - ->getOption(), - ]); - } - - /** - * @param int $start - * @param int $end - * - * @return array - */ - private function prepareArgumentInformation(Tokens $tokens, $start, $end) - { - $info = [ - 'default' => '', - 'name' => '', - 'type' => '', - ]; - - $sawName = false; - - for ($index = $start; $index <= $end; ++$index) { - $token = $tokens[$index]; - - if ($token->isComment() || $token->isWhitespace()) { - continue; - } - - if ($token->isGivenKind(T_VARIABLE)) { - $sawName = true; - $info['name'] = $token->getContent(); - - continue; - } - - if ($token->equals('=')) { - continue; - } - - if ($sawName) { - $info['default'] .= $token->getContent(); - } elseif ('&' !== $token->getContent()) { - if ($token->isGivenKind(T_ELLIPSIS)) { - if ('' === $info['type']) { - $info['type'] = 'array'; - } else { - $info['type'] .= '[]'; - } - } else { - $info['type'] .= $token->getContent(); - } - } - } - - return $info; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php deleted file mode 100644 index b814a12..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php +++ /dev/null @@ -1,434 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Fabien Potencier - * @author Jordi Boggiano - * @author Sebastiaan Stok - * @author Graham Campbell - * @author Dariusz Rumiński - */ -final class PhpdocAlignFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @internal - */ - const ALIGN_LEFT = 'left'; - - /** - * @internal - */ - const ALIGN_VERTICAL = 'vertical'; - - /** - * @var string - */ - private $regex; - - /** - * @var string - */ - private $regexCommentLine; - - /** - * @var string - */ - private $align; - - private static $alignableTags = [ - 'param', - 'property', - 'property-read', - 'property-write', - 'return', - 'throws', - 'type', - 'var', - 'method', - ]; - - private static $tagsWithName = [ - 'param', - 'property', - ]; - - private static $tagsWithMethodSignature = [ - 'method', - ]; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $tagsWithNameToAlign = array_intersect($this->configuration['tags'], self::$tagsWithName); - $tagsWithMethodSignatureToAlign = array_intersect($this->configuration['tags'], self::$tagsWithMethodSignature); - $tagsWithoutNameToAlign = array_diff($this->configuration['tags'], $tagsWithNameToAlign, $tagsWithMethodSignatureToAlign); - $types = []; - - $indent = '(?P(?: {2}|\t)*)'; - // e.g. @param <$var> - if (!empty($tagsWithNameToAlign)) { - $types[] = '(?P'.implode('|', $tagsWithNameToAlign).')\s+(?P[^$]+?)\s+(?P(?:&|\.{3})?\$[^\s]+)'; - } - - // e.g. @return - if (!empty($tagsWithoutNameToAlign)) { - $types[] = '(?P'.implode('|', $tagsWithoutNameToAlign).')\s+(?P[^\s]+?)'; - } - - // e.g. @method - if (!empty($tagsWithMethodSignatureToAlign)) { - $types[] = '(?P'.implode('|', $tagsWithMethodSignatureToAlign).')(\s+(?P[^\s(]+)|)\s+(?P.+\))'; - } - - // optional - $desc = '(?:\s+(?P\V*))'; - - $this->regex = '/^'.$indent.' \* @(?:'.implode('|', $types).')'.$desc.'\s*$/u'; - $this->regexCommentLine = '/^'.$indent.' \*(?! @)(?:\s+(?P\V+))(?align = $this->configuration['align']; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - $code = <<<'EOF' - self::ALIGN_VERTICAL]), - new CodeSample($code, ['align' => self::ALIGN_LEFT]), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after CommentToPhpdocFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAnnotationWithoutDotFixer, PhpdocIndentFixer, PhpdocIndentFixer, PhpdocInlineTagFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocScalarFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocToCommentFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesFixer, PhpdocTypesFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. - */ - public function getPriority() - { - /* - * Should be run after all other docblock fixers. This because they - * modify other annotations to change their type and or separation - * which totally change the behavior of this fixer. It's important that - * annotations are of the correct type, and are grouped correctly - * before running this fixer. - */ - return -21; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $content = $token->getContent(); - $docBlock = new DocBlock($content); - $this->fixDocBlock($docBlock); - $newContent = $docBlock->getContent(); - if ($newContent !== $content) { - $tokens[$index] = new Token([T_DOC_COMMENT, $newContent]); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $tags = new FixerOptionBuilder('tags', 'The tags that should be aligned.'); - $tags - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(self::$alignableTags)]) - /* - * By default, all tags apart from @property and @method will be aligned for backwards compatibility - * @TODO 3.0 Align all available tags by default - */ - ->setDefault([ - 'param', - 'return', - 'throws', - 'type', - 'var', - ]) - ; - - $align = new FixerOptionBuilder('align', 'Align comments'); - $align - ->setAllowedTypes(['string']) - ->setAllowedValues([self::ALIGN_LEFT, self::ALIGN_VERTICAL]) - ->setDefault(self::ALIGN_VERTICAL) - ; - - return new FixerConfigurationResolver([$tags->getOption(), $align->getOption()]); - } - - private function fixDocBlock(DocBlock $docBlock) - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - for ($i = 0, $l = \count($docBlock->getLines()); $i < $l; ++$i) { - $items = []; - $matches = $this->getMatches($docBlock->getLine($i)->getContent()); - - if (null === $matches) { - continue; - } - - $current = $i; - $items[] = $matches; - - while (true) { - if (null === $docBlock->getLine(++$i)) { - break 2; - } - - $matches = $this->getMatches($docBlock->getLine($i)->getContent(), true); - if (null === $matches) { - break; - } - - $items[] = $matches; - } - - // compute the max length of the tag, hint and variables - $tagMax = 0; - $hintMax = 0; - $varMax = 0; - - foreach ($items as $item) { - if (null === $item['tag']) { - continue; - } - - $tagMax = max($tagMax, \strlen($item['tag'])); - $hintMax = max($hintMax, \strlen($item['hint'])); - $varMax = max($varMax, \strlen($item['var'])); - } - - $currTag = null; - - // update - foreach ($items as $j => $item) { - if (null === $item['tag']) { - if ('@' === $item['desc'][0]) { - $docBlock->getLine($current + $j)->setContent($item['indent'].' * '.$item['desc'].$lineEnding); - - continue; - } - - $extraIndent = 2; - - if (\in_array($currTag, self::$tagsWithName, true) || \in_array($currTag, self::$tagsWithMethodSignature, true)) { - $extraIndent = 3; - } - - $line = - $item['indent'] - .' * ' - .$this->getIndent( - $tagMax + $hintMax + $varMax + $extraIndent, - $this->getLeftAlignedDescriptionIndent($items, $j) - ) - .$item['desc'] - .$lineEnding; - - $docBlock->getLine($current + $j)->setContent($line); - - continue; - } - - $currTag = $item['tag']; - - $line = - $item['indent'] - .' * @' - .$item['tag'] - .$this->getIndent( - $tagMax - \strlen($item['tag']) + 1, - $item['hint'] ? 1 : 0 - ) - .$item['hint'] - ; - - if (!empty($item['var'])) { - $line .= - $this->getIndent(($hintMax ?: -1) - \strlen($item['hint']) + 1) - .$item['var'] - .( - !empty($item['desc']) - ? $this->getIndent($varMax - \strlen($item['var']) + 1).$item['desc'].$lineEnding - : $lineEnding - ) - ; - } elseif (!empty($item['desc'])) { - $line .= $this->getIndent($hintMax - \strlen($item['hint']) + 1).$item['desc'].$lineEnding; - } else { - $line .= $lineEnding; - } - - $docBlock->getLine($current + $j)->setContent($line); - } - } - } - - /** - * @param string $line - * @param bool $matchCommentOnly - * - * @return null|array - */ - private function getMatches($line, $matchCommentOnly = false) - { - if (Preg::match($this->regex, $line, $matches)) { - if (!empty($matches['tag2'])) { - $matches['tag'] = $matches['tag2']; - $matches['hint'] = $matches['hint2']; - $matches['var'] = ''; - } - - if (!empty($matches['tag3'])) { - $matches['tag'] = $matches['tag3']; - $matches['hint'] = $matches['hint3']; - $matches['var'] = $matches['signature']; - } - - if (isset($matches['hint'])) { - $matches['hint'] = trim($matches['hint']); - } - - return $matches; - } - - if ($matchCommentOnly && Preg::match($this->regexCommentLine, $line, $matches)) { - $matches['tag'] = null; - $matches['var'] = ''; - $matches['hint'] = ''; - - return $matches; - } - - return null; - } - - /** - * @param int $verticalAlignIndent - * @param int $leftAlignIndent - * - * @return string - */ - private function getIndent($verticalAlignIndent, $leftAlignIndent = 1) - { - $indent = self::ALIGN_VERTICAL === $this->align ? $verticalAlignIndent : $leftAlignIndent; - - return str_repeat(' ', $indent); - } - - /** - * @param array[] $items - * @param int $index - * - * @return int - */ - private function getLeftAlignedDescriptionIndent(array $items, $index) - { - if (self::ALIGN_LEFT !== $this->align) { - return 0; - } - - // Find last tagged line: - $item = null; - for (; $index >= 0; --$index) { - $item = $items[$index]; - if (null !== $item['tag']) { - break; - } - } - - // No last tag found — no indent: - if (null === $item) { - return 0; - } - - // Indent according to existing values: - return - $this->getSentenceIndent($item['tag']) + - $this->getSentenceIndent($item['hint']) + - $this->getSentenceIndent($item['var']); - } - - /** - * Get indent for sentence. - * - * @param null|string $sentence - * - * @return int - */ - private function getSentenceIndent($sentence) - { - if (null === $sentence) { - return 0; - } - - $length = \strlen($sentence); - - return 0 === $length ? 0 : $length + 1; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php deleted file mode 100644 index 82816f1..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php +++ /dev/null @@ -1,132 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpdocAnnotationWithoutDotFixer extends AbstractFixer -{ - private $tags = ['throws', 'return', 'param', 'internal', 'deprecated', 'var', 'type']; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHPDoc annotation descriptions should not be a sentence.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $annotations = $doc->getAnnotations(); - - if (empty($annotations)) { - continue; - } - - foreach ($annotations as $annotation) { - if ( - !$annotation->getTag()->valid() || !\in_array($annotation->getTag()->getName(), $this->tags, true) - ) { - continue; - } - - $lineAfterAnnotation = $doc->getLine($annotation->getEnd() + 1); - if (null !== $lineAfterAnnotation) { - $lineAfterAnnotationTrimmed = ltrim($lineAfterAnnotation->getContent()); - if ('' === $lineAfterAnnotationTrimmed || '*' !== $lineAfterAnnotationTrimmed[0]) { - // malformed PHPDoc, missing asterisk ! - continue; - } - } - - $content = $annotation->getContent(); - - if ( - 1 !== Preg::match('/[.。]\h*$/u', $content) - || 0 !== Preg::match('/[.。](?!\h*$)/u', $content, $matches) - ) { - continue; - } - - $endLine = $doc->getLine($annotation->getEnd()); - $endLine->setContent(Preg::replace('/(?getContent())); - - $startLine = $doc->getLine($annotation->getStart()); - $optionalTypeRegEx = $annotation->supportTypes() - ? sprintf('(?:%s\s+(?:\$\w+\s+)?)?', preg_quote(implode('|', $annotation->getTypes()), '/')) - : ''; - $content = Preg::replaceCallback( - '/^(\s*\*\s*@\w+\s+'.$optionalTypeRegEx.')(\p{Lu}?(?=\p{Ll}|\p{Zs}))(.*)$/', - static function (array $matches) { - if (\function_exists('mb_strtolower')) { - return $matches[1].mb_strtolower($matches[2]).$matches[3]; - } - - return $matches[1].strtolower($matches[2]).$matches[3]; - }, - $startLine->getContent(), - 1 - ); - $startLine->setContent($content); - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php deleted file mode 100644 index 00f6c4b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php +++ /dev/null @@ -1,139 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Utils; - -/** - * @author Ceeram - * @author Graham Campbell - */ -final class PhpdocIndentFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Docblocks should have the same indentation as the documented subject.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - - // skip if there is no next token or if next token is block end `}` - if (null === $nextIndex || $tokens[$nextIndex]->equals('}')) { - continue; - } - - $prevIndex = $index - 1; - $prevToken = $tokens[$prevIndex]; - - // ignore inline docblocks - if ( - $prevToken->isGivenKind(T_OPEN_TAG) - || ($prevToken->isWhitespace(" \t") && !$tokens[$index - 2]->isGivenKind(T_OPEN_TAG)) - || $prevToken->equalsAny([';', ',', '{', '(']) - ) { - continue; - } - - $indent = ''; - if ($tokens[$nextIndex - 1]->isWhitespace()) { - $indent = Utils::calculateTrailingWhitespaceIndent($tokens[$nextIndex - 1]); - } - - $newPrevContent = $this->fixWhitespaceBeforeDocblock($prevToken->getContent(), $indent); - if ($newPrevContent) { - if ($prevToken->isArray()) { - $tokens[$prevIndex] = new Token([$prevToken->getId(), $newPrevContent]); - } else { - $tokens[$prevIndex] = new Token($newPrevContent); - } - } else { - $tokens->clearAt($prevIndex); - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $this->fixDocBlock($token->getContent(), $indent)]); - } - } - - /** - * Fix indentation of Docblock. - * - * @param string $content Docblock contents - * @param string $indent Indentation to apply - * - * @return string Dockblock contents including correct indentation - */ - private function fixDocBlock($content, $indent) - { - return ltrim(Preg::replace('/^\h*\*/m', $indent.' *', $content)); - } - - /** - * @param string $content Whitespace before Docblock - * @param string $indent Indentation of the documented subject - * - * @return string Whitespace including correct indentation for Dockblock after this whitespace - */ - private function fixWhitespaceBeforeDocblock($content, $indent) - { - return rtrim($content, " \t").$indent; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagFixer.php deleted file mode 100644 index 2c9f615..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagFixer.php +++ /dev/null @@ -1,107 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fix inline tags and make inheritdoc tag always inline. - */ -final class PhpdocInlineTagFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Fix PHPDoc inline tags, make `@inheritdoc` always inline.', - [new CodeSample( - 'isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $content = $token->getContent(); - - // Move `@` inside tag, for example @{tag} -> {@tag}, replace multiple curly brackets, - // remove spaces between '{' and '@', remove 's' at the end of tag. - // Make sure the tags are written in lower case, remove white space between end - // of text and closing bracket and between the tag and inline comment. - $content = Preg::replaceCallback( - '#(?:@{+|{+\h*@)[ \t]*(example|id|internal|inheritdoc|link|source|toc|tutorial)s?([^}]*)(?:}+)#i', - static function (array $matches) { - $doc = trim($matches[2]); - - if ('' === $doc) { - return '{@'.strtolower($matches[1]).'}'; - } - - return '{@'.strtolower($matches[1]).' '.$doc.'}'; - }, - $content - ); - - // Always make inheritdoc inline using with '{' '}' when needed, - // make sure lowercase. - $content = Preg::replace( - '#(? - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gert de Pagter - */ -final class PhpdocLineSpanFixer extends AbstractFixer implements WhitespacesAwareFixerInterface, ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Changes doc blocks from single to multi line, or reversed. Works for class constants, properties and methods only.', - [ - new CodeSample(" 'single'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpdocAlignFixer. - * Must run after CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('const', 'Whether const blocks should be single or multi line')) - ->setAllowedValues(['single', 'multi']) - ->setDefault('multi') - ->getOption(), - (new FixerOptionBuilder('property', 'Whether property doc blocks should be single or multi line')) - ->setAllowedValues(['single', 'multi']) - ->setDefault('multi') - ->getOption(), - (new FixerOptionBuilder('method', 'Whether method doc blocks should be single or multi line')) - ->setAllowedValues(['single', 'multi']) - ->setDefault('multi') - ->getOption(), - ]); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $analyzer = new TokensAnalyzer($tokens); - - $elements = $analyzer->getClassyElements(); - - foreach ($elements as $index => $element) { - if (!$this->hasDocBlock($tokens, $index)) { - continue; - } - - $type = $element['type']; - $docIndex = $this->getDocBlockIndex($tokens, $index); - $doc = new DocBlock($tokens[$docIndex]->getContent()); - - if ('multi' === $this->configuration[$type]) { - $doc->makeMultiLine($originalIndent = $this->detectIndent($tokens, $docIndex), $this->whitespacesConfig->getLineEnding()); - } else { - $doc->makeSingleLine(); - } - - $tokens->offsetSet($docIndex, new Token([T_DOC_COMMENT, $doc->getContent()])); - } - } - - /** - * @param int $index - * - * @return bool - */ - private function hasDocBlock(Tokens $tokens, $index) - { - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - - return $tokens[$docBlockIndex]->isGivenKind(T_DOC_COMMENT); - } - - /** - * @param int $index - * - * @return int - */ - private function getDocBlockIndex(Tokens $tokens, $index) - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([ - T_PUBLIC, - T_PROTECTED, - T_PRIVATE, - T_FINAL, - T_ABSTRACT, - T_COMMENT, - T_VAR, - T_STATIC, - T_STRING, - T_NS_SEPARATOR, - CT::T_NULLABLE_TYPE, - ])); - - return $index; - } - - /** - * @param int $index - * - * @return string - */ - private function detectIndent(Tokens $tokens, $index) - { - if (!$tokens[$index - 1]->isWhitespace()) { - return ''; // cannot detect indent - } - - $explodedContent = explode($this->whitespacesConfig->getLineEnding(), $tokens[$index - 1]->getContent()); - - return end($explodedContent); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php deleted file mode 100644 index 02f1f67..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php +++ /dev/null @@ -1,70 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * @author Graham Campbell - * @author Dariusz Rumiński - */ -final class PhpdocNoAccessFixer extends AbstractProxyFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - '`@access` annotations should be omitted from PHPDoc.', - [ - new CodeSample( - 'configure(['annotations' => ['access']]); - - return [$fixer]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php deleted file mode 100644 index 0e7151f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php +++ /dev/null @@ -1,178 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; -use Symfony\Component\OptionsResolver\Options; - -/** - * Case sensitive tag replace fixer (does not process inline tags like {@inheritdoc}). - * - * @author Graham Campbell - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class PhpdocNoAliasTagFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'No alias PHPDoc tags should be used.', - [ - new CodeSample( - ' ['link' => 'website']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocSingleLineVarSpacingFixer. - * Must run after CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority() - { - return 11; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $searchFor = array_keys($this->configuration['replacements']); - - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $annotations = $doc->getAnnotationsOfType($searchFor); - - if (empty($annotations)) { - continue; - } - - foreach ($annotations as $annotation) { - $annotation->getTag()->setName($this->configuration['replacements'][$annotation->getTag()->getName()]); - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolverRootless('replacements', [ - (new FixerOptionBuilder('replacements', 'Mapping between replaced annotations with new ones.')) - ->setAllowedTypes(['array']) - ->setNormalizer(static function (Options $options, $value) { - $normalizedValue = []; - - foreach ($value as $from => $to) { - if (!\is_string($from)) { - throw new InvalidOptionsException('Tag to replace must be a string.'); - } - - if (!\is_string($to)) { - throw new InvalidOptionsException(sprintf( - 'Tag to replace to from "%s" must be a string.', - $from - )); - } - - if (1 !== Preg::match('#^\S+$#', $to) || false !== strpos($to, '*/')) { - throw new InvalidOptionsException(sprintf( - 'Tag "%s" cannot be replaced by invalid tag "%s".', - $from, - $to - )); - } - - $normalizedValue[trim($from)] = trim($to); - } - - foreach ($normalizedValue as $from => $to) { - if (isset($normalizedValue[$to])) { - throw new InvalidOptionsException(sprintf( - 'Cannot change tag "%1$s" to tag "%2$s", as the tag "%2$s" is configured to be replaced to "%3$s".', - $from, - $to, - $normalizedValue[$to] - )); - } - } - - return $normalizedValue; - }) - ->setDefault([ - 'property-read' => 'property', - 'property-write' => 'property', - 'type' => 'var', - 'link' => 'see', - ]) - ->getOption(), - ], $this->getName()); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php deleted file mode 100644 index 774f8ec..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php +++ /dev/null @@ -1,123 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class PhpdocNoEmptyReturnFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - '`@return void` and `@return null` annotations should be omitted from PHPDoc.', - [ - new CodeSample( - ' $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $annotations = $doc->getAnnotationsOfType('return'); - - if (empty($annotations)) { - continue; - } - - foreach ($annotations as $annotation) { - $this->fixAnnotation($doc, $annotation); - } - - $newContent = $doc->getContent(); - - if ($newContent === $token->getContent()) { - continue; - } - - if ('' === $newContent) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - continue; - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - /** - * Remove return void or return null annotations.. - */ - private function fixAnnotation(DocBlock $doc, Annotation $annotation) - { - $types = $annotation->getNormalizedTypes(); - - if (1 === \count($types) && ('null' === $types[0] || 'void' === $types[0])) { - $annotation->remove(); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoPackageFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoPackageFixer.php deleted file mode 100644 index b04295c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoPackageFixer.php +++ /dev/null @@ -1,70 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * @author Graham Campbell - * @author Dariusz Rumiński - */ -final class PhpdocNoPackageFixer extends AbstractProxyFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - '`@package` and `@subpackage` annotations should be omitted from PHPDoc.', - [ - new CodeSample( - 'configure(['annotations' => ['package', 'subpackage']]); - - return [$fixer]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php deleted file mode 100644 index cfd6735..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php +++ /dev/null @@ -1,190 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Remove inheritdoc tags from classy that does not inherit. - * - * @author SpacePossum - */ -final class PhpdocNoUselessInheritdocFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Classy that does not inherit must not have `@inheritdoc` tags.', - [ - new CodeSample("isTokenKindFound(T_DOC_COMMENT) && $tokens->isAnyTokenKindsFound([T_CLASS, T_INTERFACE]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - // min. offset 4 as minimal candidate is @: isGivenKind([T_CLASS, T_INTERFACE])) { - $index = $this->fixClassy($tokens, $index); - } - } - } - - /** - * @param int $index - * - * @return int - */ - private function fixClassy(Tokens $tokens, $index) - { - // figure out where the classy starts - $classOpenIndex = $tokens->getNextTokenOfKind($index, ['{']); - - // figure out where the classy ends - $classEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classOpenIndex); - - // is classy extending or implementing some interface - $extendingOrImplementing = $this->isExtendingOrImplementing($tokens, $index, $classOpenIndex); - - if (!$extendingOrImplementing) { - // PHPDoc of classy should not have inherit tag even when using traits as Traits cannot provide this information - $this->fixClassyOutside($tokens, $index); - } - - // figure out if the classy uses a trait - if (!$extendingOrImplementing && $this->isUsingTrait($tokens, $index, $classOpenIndex, $classEndIndex)) { - $extendingOrImplementing = true; - } - - $this->fixClassyInside($tokens, $classOpenIndex, $classEndIndex, !$extendingOrImplementing); - - return $classEndIndex; - } - - /** - * @param int $classOpenIndex - * @param int $classEndIndex - * @param bool $fixThisLevel - */ - private function fixClassyInside(Tokens $tokens, $classOpenIndex, $classEndIndex, $fixThisLevel) - { - for ($i = $classOpenIndex; $i < $classEndIndex; ++$i) { - if ($tokens[$i]->isGivenKind(T_CLASS)) { - $i = $this->fixClassy($tokens, $i); - } elseif ($fixThisLevel && $tokens[$i]->isGivenKind(T_DOC_COMMENT)) { - $this->fixToken($tokens, $i); - } - } - } - - /** - * @param int $classIndex - */ - private function fixClassyOutside(Tokens $tokens, $classIndex) - { - $previousIndex = $tokens->getPrevNonWhitespace($classIndex); - if ($tokens[$previousIndex]->isGivenKind(T_DOC_COMMENT)) { - $this->fixToken($tokens, $previousIndex); - } - } - - /** - * @param int $tokenIndex - */ - private function fixToken(Tokens $tokens, $tokenIndex) - { - $count = 0; - $content = Preg::replaceCallback( - '#(\h*(?:@{*|{*\h*@)\h*inheritdoc\h*)([^}]*)((?:}*)\h*)#i', - static function ($matches) { - return ' '.$matches[2]; - }, - $tokens[$tokenIndex]->getContent(), - -1, - $count - ); - - if ($count) { - $tokens[$tokenIndex] = new Token([T_DOC_COMMENT, $content]); - } - } - - /** - * @param int $classIndex - * @param int $classOpenIndex - * - * @return bool - */ - private function isExtendingOrImplementing(Tokens $tokens, $classIndex, $classOpenIndex) - { - for ($index = $classIndex; $index < $classOpenIndex; ++$index) { - if ($tokens[$index]->isGivenKind([T_EXTENDS, T_IMPLEMENTS])) { - return true; - } - } - - return false; - } - - /** - * @param int $classIndex - * @param int $classOpenIndex - * @param int $classCloseIndex - * - * @return bool - */ - private function isUsingTrait(Tokens $tokens, $classIndex, $classOpenIndex, $classCloseIndex) - { - if ($tokens[$classIndex]->isGivenKind(T_INTERFACE)) { - // cannot use Trait inside an interface - return false; - } - - $useIndex = $tokens->getNextTokenOfKind($classOpenIndex, [[CT::T_USE_TRAIT]]); - - return null !== $useIndex && $useIndex < $classCloseIndex; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php deleted file mode 100644 index 9c718ff..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php +++ /dev/null @@ -1,171 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class PhpdocOrderFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Annotations in PHPDoc should be ordered so that `@param` annotations come first, then `@throws` annotations, then `@return` annotations.', - [ - new CodeSample( - ' $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $content = $token->getContent(); - // move param to start, return to end, leave throws in the middle - $content = $this->moveParamAnnotations($content); - // we're parsing the content again to make sure the internal - // state of the dockblock is correct after the modifications - $content = $this->moveReturnAnnotations($content); - // persist the content at the end - $tokens[$index] = new Token([T_DOC_COMMENT, $content]); - } - } - - /** - * Move all param annotations in before throws and return annotations. - * - * @param string $content - * - * @return string - */ - private function moveParamAnnotations($content) - { - $doc = new DocBlock($content); - $params = $doc->getAnnotationsOfType('param'); - - // nothing to do if there are no param annotations - if (empty($params)) { - return $content; - } - - $others = $doc->getAnnotationsOfType(['throws', 'return']); - - if (empty($others)) { - return $content; - } - - // get the index of the final line of the final param annotation - $end = end($params)->getEnd(); - - $line = $doc->getLine($end); - - // move stuff about if required - foreach ($others as $other) { - if ($other->getStart() < $end) { - // we're doing this to maintain the original line indexes - $line->setContent($line->getContent().$other->getContent()); - $other->remove(); - } - } - - return $doc->getContent(); - } - - /** - * Move all return annotations after param and throws annotations. - * - * @param string $content - * - * @return string - */ - private function moveReturnAnnotations($content) - { - $doc = new DocBlock($content); - $returns = $doc->getAnnotationsOfType('return'); - - // nothing to do if there are no return annotations - if (empty($returns)) { - return $content; - } - - $others = $doc->getAnnotationsOfType(['param', 'throws']); - - // nothing to do if there are no other annotations - if (empty($others)) { - return $content; - } - - // get the index of the first line of the first return annotation - $start = $returns[0]->getStart(); - $line = $doc->getLine($start); - - // move stuff about if required - foreach (array_reverse($others) as $other) { - if ($other->getEnd() > $start) { - // we're doing this to maintain the original line indexes - $line->setContent($other->getContent().$line->getContent()); - $other->remove(); - } - } - - return $doc->getContent(); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php deleted file mode 100644 index 5f6c8a4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php +++ /dev/null @@ -1,228 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author SpacePossum - */ -final class PhpdocReturnSelfReferenceFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - private static $toTypes = [ - '$this', - 'static', - 'self', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'The type of `@return` annotations of methods returning a reference to itself must the configured one.', - [ - new CodeSample( - ' ['this' => 'self']] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return \count($tokens) > 10 && $tokens->isTokenKindFound(T_DOC_COMMENT) && $tokens->isAnyTokenKindsFound([T_CLASS, T_INTERFACE]); - } - - /** - * {@inheritdoc} - * - * Must run before NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer. - * Must run after CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority() - { - return 10; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - foreach ($tokensAnalyzer->getClassyElements() as $index => $element) { - if ('method' === $element['type']) { - $this->fixMethod($tokens, $index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $default = [ - 'this' => '$this', - '@this' => '$this', - '$self' => 'self', - '@self' => 'self', - '$static' => 'static', - '@static' => 'static', - ]; - - return new FixerConfigurationResolverRootless('replacements', [ - (new FixerOptionBuilder('replacements', 'Mapping between replaced return types with new ones.')) - ->setAllowedTypes(['array']) - ->setNormalizer(static function (Options $options, $value) use ($default) { - $normalizedValue = []; - foreach ($value as $from => $to) { - if (\is_string($from)) { - $from = strtolower($from); - } - - if (!isset($default[$from])) { - throw new InvalidOptionsException(sprintf( - 'Unknown key "%s", expected any of "%s".', - \is_object($from) ? \get_class($from) : \gettype($from).(\is_resource($from) ? '' : '#'.$from), - implode('", "', array_keys($default)) - )); - } - - if (!\in_array($to, self::$toTypes, true)) { - throw new InvalidOptionsException(sprintf( - 'Unknown value "%s", expected any of "%s".', - \is_object($to) ? \get_class($to) : \gettype($to).(\is_resource($to) ? '' : '#'.$to), - implode('", "', self::$toTypes) - )); - } - - $normalizedValue[$from] = $to; - } - - return $normalizedValue; - }) - ->setDefault($default) - ->getOption(), - ], $this->getName()); - } - - /** - * @param int $index - */ - private function fixMethod(Tokens $tokens, $index) - { - static $methodModifiers = [T_STATIC, T_FINAL, T_ABSTRACT, T_PRIVATE, T_PROTECTED, T_PUBLIC]; - - // find PHPDoc of method (if any) - do { - $tokenIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$tokenIndex]->isGivenKind($methodModifiers)) { - break; - } - - $index = $tokenIndex; - } while (true); - - $docIndex = $tokens->getPrevNonWhitespace($index); - if (!$tokens[$docIndex]->isGivenKind(T_DOC_COMMENT)) { - return; - } - - // find @return - $docBlock = new DocBlock($tokens[$docIndex]->getContent()); - $returnsBlock = $docBlock->getAnnotationsOfType('return'); - - if (!\count($returnsBlock)) { - return; // no return annotation found - } - - $returnsBlock = $returnsBlock[0]; - $types = $returnsBlock->getTypes(); - - if (!\count($types)) { - return; // no return type(s) found - } - - $newTypes = []; - foreach ($types as $type) { - $lower = strtolower($type); - $newTypes[] = isset($this->configuration['replacements'][$lower]) ? $this->configuration['replacements'][$lower] : $type; - } - - if ($types === $newTypes) { - return; - } - - $returnsBlock->setTypes($newTypes); - $tokens[$docIndex] = new Token([T_DOC_COMMENT, $docBlock->getContent()]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php deleted file mode 100644 index 99ccd7d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php +++ /dev/null @@ -1,125 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractPhpdocTypesFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * @author Graham Campbell - */ -final class PhpdocScalarFixer extends AbstractPhpdocTypesFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * The types to fix. - * - * @var array - */ - private static $types = [ - 'boolean' => 'bool', - 'callback' => 'callable', - 'double' => 'float', - 'integer' => 'int', - 'real' => 'float', - 'str' => 'string', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Scalar types should always be written in the same form. `int` not `integer`, `bool` not `boolean`, `float` not `real` or `double`.', - [ - new CodeSample(' ['boolean']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before GeneralPhpdocAnnotationRemoveFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAlignFixer, PhpdocInlineTagFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocToParamTypeFixer, PhpdocToReturnTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. - * Must run after PhpdocTypesFixer. - */ - public function getPriority() - { - /* - * Should be run before all other docblock fixers apart from the - * phpdoc_to_comment and phpdoc_indent fixer to make sure all fixers - * apply correct indentation to new code they add. This should run - * before alignment of params is done since this fixer might change - * the type and thereby un-aligning the params. We also must run after - * the phpdoc_types_fixer because it can convert types to things that - * we can fix. - */ - return 15; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('types', 'A map of types to fix.')) - ->setAllowedValues([new AllowedValueSubset(array_keys(self::$types))]) - ->setDefault(['boolean', 'double', 'integer', 'real', 'str']) // TODO 3.0 add "callback" - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function normalize($type) - { - if (\in_array($type, $this->configuration['types'], true)) { - return self::$types[$type]; - } - - return $type; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php deleted file mode 100644 index 2ecb34d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php +++ /dev/null @@ -1,172 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\TagComparator; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class PhpdocSeparationFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Annotations in PHPDoc should be grouped together so that annotations of the same type immediately follow each other, and annotations of a different type are separated by a single blank line.', - [ - new CodeSample( - 'isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $this->fixDescription($doc); - $this->fixAnnotations($doc); - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - /** - * Make sure the description is separated from the annotations. - */ - private function fixDescription(DocBlock $doc) - { - foreach ($doc->getLines() as $index => $line) { - if ($line->containsATag()) { - break; - } - - if ($line->containsUsefulContent()) { - $next = $doc->getLine($index + 1); - - if (null !== $next && $next->containsATag()) { - $line->addBlank(); - - break; - } - } - } - } - - /** - * Make sure the annotations are correctly separated. - * - * @return string - */ - private function fixAnnotations(DocBlock $doc) - { - foreach ($doc->getAnnotations() as $index => $annotation) { - $next = $doc->getAnnotation($index + 1); - - if (null === $next) { - break; - } - - if (true === $next->getTag()->valid()) { - if (TagComparator::shouldBeTogether($annotation->getTag(), $next->getTag())) { - $this->ensureAreTogether($doc, $annotation, $next); - } else { - $this->ensureAreSeparate($doc, $annotation, $next); - } - } - } - - return $doc->getContent(); - } - - /** - * Force the given annotations to immediately follow each other. - */ - private function ensureAreTogether(DocBlock $doc, Annotation $first, Annotation $second) - { - $pos = $first->getEnd(); - $final = $second->getStart(); - - for ($pos = $pos + 1; $pos < $final; ++$pos) { - $doc->getLine($pos)->remove(); - } - } - - /** - * Force the given annotations to have one empty line between each other. - */ - private function ensureAreSeparate(DocBlock $doc, Annotation $first, Annotation $second) - { - $pos = $first->getEnd(); - $final = $second->getStart() - 1; - - // check if we need to add a line, or need to remove one or more lines - if ($pos === $final) { - $doc->getLine($pos)->addBlank(); - - return; - } - - for ($pos = $pos + 1; $pos < $final; ++$pos) { - $doc->getLine($pos)->remove(); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSingleLineVarSpacingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSingleLineVarSpacingFixer.php deleted file mode 100644 index 3f4a34d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSingleLineVarSpacingFixer.php +++ /dev/null @@ -1,108 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for part of rule defined in PSR5 ¶7.22. - * - * @author SpacePossum - */ -final class PhpdocSingleLineVarSpacingFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Single line `@var` PHPDoc should have proper spacing.', - [new CodeSample("isAnyTokenKindsFound([T_COMMENT, T_DOC_COMMENT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - /** @var Token $token */ - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(T_DOC_COMMENT)) { - $tokens[$index] = new Token([T_DOC_COMMENT, $this->fixTokenContent($token->getContent())]); - - continue; - } - - if (!$token->isGivenKind(T_COMMENT)) { - continue; - } - - $content = $token->getContent(); - $fixedContent = $this->fixTokenContent($content); - if ($content !== $fixedContent) { - $tokens[$index] = new Token([T_DOC_COMMENT, $fixedContent]); - } - } - } - - /** - * @param string $content - * - * @return string - */ - private function fixTokenContent($content) - { - return Preg::replaceCallback( - '#^/\*\*\h*@var\h+(\S+)\h*(\$\S+)?\h*([^\n]*)\*/$#', - static function (array $matches) { - $content = '/** @var'; - for ($i = 1, $m = \count($matches); $i < $m; ++$i) { - if ('' !== $matches[$i]) { - $content .= ' '.$matches[$i]; - } - } - - $content = rtrim($content); - - return $content.' */'; - }, - $content - ); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php deleted file mode 100644 index 3192f28..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php +++ /dev/null @@ -1,104 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\ShortDescription; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class PhpdocSummaryFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHPDoc summary should end in either a full stop, exclamation mark, or question mark.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $end = (new ShortDescription($doc))->getEnd(); - - if (null !== $end) { - $line = $doc->getLine($end); - $content = rtrim($line->getContent()); - - if (!$this->isCorrectlyFormatted($content)) { - $line->setContent($content.'.'.$this->whitespacesConfig->getLineEnding()); - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - } - } - - /** - * Is the last line of the short description correctly formatted? - * - * @param string $content - * - * @return bool - */ - private function isCorrectlyFormatted($content) - { - if (false !== stripos($content, '{@inheritdoc}')) { - return true; - } - - return $content !== rtrim($content, '.。!?¡¿!?'); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php deleted file mode 100644 index f89853d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php +++ /dev/null @@ -1,97 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Analyzer\CommentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Ceeram - * @author Dariusz Rumiński - */ -final class PhpdocToCommentFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - * - * Must run before GeneralPhpdocAnnotationRemoveFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyCommentFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocIndentFixer, PhpdocInlineTagFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocToParamTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. - * Must run after CommentToPhpdocFixer. - */ - public function getPriority() - { - /* - * Should be run before all other docblock fixers so that these fixers - * don't touch doc comments which are meant to be converted to regular - * comments. - */ - return 25; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Docblocks should only be used on structural elements.', - [ - new CodeSample( - ' $sqlite) { - $sqlite->open($path); -} -' - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $commentsAnalyzer = new CommentsAnalyzer(); - - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - if ($commentsAnalyzer->isHeaderComment($tokens, $index)) { - continue; - } - - if ($commentsAnalyzer->isBeforeStructuralElement($tokens, $index)) { - continue; - } - - $tokens[$index] = new Token([T_COMMENT, '/*'.ltrim($token->getContent(), '/*')]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php deleted file mode 100644 index 1c633a8..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php +++ /dev/null @@ -1,217 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\DocBlock\ShortDescription; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Nobu Funaki - * @author Dariusz Rumiński - */ -final class PhpdocTrimConsecutiveBlankLineSeparationFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Removes extra blank lines after summary and after description in PHPDoc.', - [ - new CodeSample( - 'isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $summaryEnd = (new ShortDescription($doc))->getEnd(); - - if (null !== $summaryEnd) { - $this->fixSummary($doc, $summaryEnd); - $this->fixDescription($doc, $summaryEnd); - } - - $this->fixAllTheRest($doc); - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - /** - * @param int $summaryEnd - */ - private function fixSummary(DocBlock $doc, $summaryEnd) - { - $nonBlankLineAfterSummary = $this->findNonBlankLine($doc, $summaryEnd); - - $this->removeExtraBlankLinesBetween($doc, $summaryEnd, $nonBlankLineAfterSummary); - } - - /** - * @param int $summaryEnd - */ - private function fixDescription(DocBlock $doc, $summaryEnd) - { - $annotationStart = $this->findFirstAnnotationOrEnd($doc); - - // assuming the end of the Description appears before the first Annotation - $descriptionEnd = $this->reverseFindLastUsefulContent($doc, $annotationStart); - - if (null === $descriptionEnd || $summaryEnd === $descriptionEnd) { - return; // no Description - } - - if ($annotationStart === \count($doc->getLines()) - 1) { - return; // no content after Description - } - - $this->removeExtraBlankLinesBetween($doc, $descriptionEnd, $annotationStart); - } - - private function fixAllTheRest(DocBlock $doc) - { - $annotationStart = $this->findFirstAnnotationOrEnd($doc); - $lastLine = $this->reverseFindLastUsefulContent($doc, \count($doc->getLines()) - 1); - - if (null !== $lastLine && $annotationStart !== $lastLine) { - $this->removeExtraBlankLinesBetween($doc, $annotationStart, $lastLine); - } - } - - /** - * @param int $from - * @param int $to - */ - private function removeExtraBlankLinesBetween(DocBlock $doc, $from, $to) - { - for ($index = $from + 1; $index < $to; ++$index) { - $line = $doc->getLine($index); - $next = $doc->getLine($index + 1); - $this->removeExtraBlankLine($line, $next); - } - } - - private function removeExtraBlankLine(Line $current, Line $next) - { - if (!$current->isTheEnd() && !$current->containsUsefulContent() - && !$next->isTheEnd() && !$next->containsUsefulContent()) { - $current->remove(); - } - } - - /** - * @param int $after - * - * @return null|int - */ - private function findNonBlankLine(DocBlock $doc, $after) - { - foreach ($doc->getLines() as $index => $line) { - if ($index <= $after) { - continue; - } - - if ($line->containsATag() || $line->containsUsefulContent() || $line->isTheEnd()) { - return $index; - } - } - - return null; - } - - /** - * @return int - */ - private function findFirstAnnotationOrEnd(DocBlock $doc) - { - $index = null; - foreach ($doc->getLines() as $index => $line) { - if ($line->containsATag()) { - return $index; - } - } - - return $index; // no Annotation, return the last line - } - - /** - * @param int $from - * - * @return null|int - */ - private function reverseFindLastUsefulContent(DocBlock $doc, $from) - { - for ($index = $from - 1; $index >= 0; --$index) { - if ($doc->getLine($index)->containsUsefulContent()) { - return $index; - } - } - - return null; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php deleted file mode 100644 index 6fd5512..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php +++ /dev/null @@ -1,129 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class PhpdocTrimFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'PHPDoc should start and end with content, excluding the very first and last line of the docblocks.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $content = $token->getContent(); - $content = $this->fixStart($content); - // we need re-parse the docblock after fixing the start before - // fixing the end in order for the lines to be correctly indexed - $content = $this->fixEnd($content); - $tokens[$index] = new Token([T_DOC_COMMENT, $content]); - } - } - - /** - * Make sure the first useful line starts immediately after the first line. - * - * @param string $content - * - * @return string - */ - private function fixStart($content) - { - return Preg::replace( - '~ - (^/\*\*) # DocComment begin - (?: - \R\h*(?:\*\h*)? # lines without useful content - (?!\R\h*\*/) # not followed by a DocComment end - )+ - (\R\h*(?:\*\h*)?\S) # first line with useful content - ~x', - '$1$2', - $content - ); - } - - /** - * Make sure the last useful line is immediately before the final line. - * - * @param string $content - * - * @return string - */ - private function fixEnd($content) - { - return Preg::replace( - '~ - (\R\h*(?:\*\h*)?\S.*?) # last line with useful content - (?: - (? - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractPhpdocTypesFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * @author Graham Campbell - * @author Dariusz Rumiński - */ -final class PhpdocTypesFixer extends AbstractPhpdocTypesFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * Available types, grouped. - * - * @var array - */ - private static $possibleTypes = [ - 'simple' => [ - 'array', - 'bool', - 'callable', - 'float', - 'int', - 'iterable', - 'null', - 'object', - 'string', - ], - 'alias' => [ - 'boolean', - 'callback', - 'double', - 'integer', - 'real', - ], - 'meta' => [ - '$this', - 'false', - 'mixed', - 'parent', - 'resource', - 'scalar', - 'self', - 'static', - 'true', - 'void', - ], - ]; - - /** - * @var array string[] - */ - private $typesToFix = []; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->typesToFix = array_merge(...array_map(static function ($group) { - return self::$possibleTypes[$group]; - }, $this->configuration['groups'])); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'The correct case must be used for standard PHP types in PHPDoc.', - [ - new CodeSample( - ' ['simple', 'alias']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before GeneralPhpdocAnnotationRemoveFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAlignFixer, PhpdocInlineTagFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocToParamTypeFixer, PhpdocToReturnTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. - * Must run after PhpdocAnnotationWithoutDotFixer, PhpdocIndentFixer. - */ - public function getPriority() - { - /* - * Should be run before all other docblock fixers apart from the - * phpdoc_to_comment and phpdoc_indent fixer to make sure all fixers - * apply correct indentation to new code they add. This should run - * before alignment of params is done since this fixer might change - * the type and thereby un-aligning the params. We also must run before - * the phpdoc_scalar_fixer so that it can make changes after us. - */ - return 16; - } - - /** - * {@inheritdoc} - */ - protected function normalize($type) - { - $lower = strtolower($type); - - if (\in_array($lower, $this->typesToFix, true)) { - return $lower; - } - - return $type; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $possibleGroups = array_keys(self::$possibleTypes); - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('groups', 'Type groups to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset($possibleGroups)]) - ->setDefault($possibleGroups) - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php deleted file mode 100644 index 6d8b05f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php +++ /dev/null @@ -1,223 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Utils; - -final class PhpdocTypesOrderFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Sorts PHPDoc types.', - [ - new CodeSample( - ' 'always_last'] - ), - new CodeSample( - ' 'alpha'] - ), - new CodeSample( - ' 'alpha', - 'null_adjustment' => 'always_last', - ] - ), - new CodeSample( - ' 'alpha', - 'null_adjustment' => 'none', - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpdocAlignFixer. - * Must run after CommentToPhpdocFixer, PhpdocAnnotationWithoutDotFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('sort_algorithm', 'The sorting algorithm to apply.')) - ->setAllowedValues(['alpha', 'none']) - ->setDefault('alpha') - ->getOption(), - (new FixerOptionBuilder('null_adjustment', 'Forces the position of `null` (overrides `sort_algorithm`).')) - ->setAllowedValues(['always_first', 'always_last', 'none']) - ->setDefault('always_first') - ->getOption(), - ]); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $annotations = $doc->getAnnotationsOfType(Annotation::getTagsWithTypes()); - - if (!\count($annotations)) { - continue; - } - - foreach ($annotations as $annotation) { - $types = $annotation->getTypes(); - - // fix main types - $annotation->setTypes($this->sortTypes($types)); - - // fix @method parameters types - $line = $doc->getLine($annotation->getStart()); - $line->setContent(Preg::replaceCallback('/(@method\s+.+?\s+\w+\()(.*)\)/', function (array $matches) { - $sorted = Preg::replaceCallback('/([^\s,]+)([\s]+\$[^\s,]+)/', function (array $matches) { - return $this->sortJoinedTypes($matches[1]).$matches[2]; - }, $matches[2]); - - return $matches[1].$sorted.')'; - }, $line->getContent())); - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - /** - * @param string[] $types - * - * @return string[] - */ - private function sortTypes(array $types) - { - foreach ($types as $index => $type) { - $types[$index] = Preg::replaceCallback('/^([^<]+)<(?:([\w\|]+?)(,\s*))?(.*)>$/', function (array $matches) { - return $matches[1].'<'.$this->sortJoinedTypes($matches[2]).$matches[3].$this->sortJoinedTypes($matches[4]).'>'; - }, $type); - } - - if ('alpha' === $this->configuration['sort_algorithm']) { - $types = Utils::stableSort( - $types, - static function ($type) { return $type; }, - static function ($typeA, $typeB) { - $regexp = '/^\\??\\\?/'; - - return strcasecmp( - Preg::replace($regexp, '', $typeA), - Preg::replace($regexp, '', $typeB) - ); - } - ); - } - - if ('none' !== $this->configuration['null_adjustment']) { - $nulls = []; - foreach ($types as $index => $type) { - if (Preg::match('/^\\\?null$/i', $type)) { - $nulls[$index] = $type; - unset($types[$index]); - } - } - - if (\count($nulls)) { - if ('always_last' === $this->configuration['null_adjustment']) { - array_push($types, ...$nulls); - } else { - array_unshift($types, ...$nulls); - } - } - } - - return $types; - } - - /** - * @param string $types - * - * @return string - */ - private function sortJoinedTypes($types) - { - $types = array_filter( - Preg::split('/([^|<]+(?:<.*>)?)/', $types, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY), - static function ($value) { - return '|' !== $value; - } - ); - - return implode('|', $this->sortTypes($types)); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php deleted file mode 100644 index 403e647..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php +++ /dev/null @@ -1,78 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - */ -final class PhpdocVarAnnotationCorrectOrderFixer extends AbstractFixer -{ - public function getDefinition() - { - return new FixerDefinition( - '`@var` and `@type` annotations must have type and name in the correct order.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - if (false === stripos($token->getContent(), '@var') && false === stripos($token->getContent(), '@type')) { - continue; - } - - $newContent = Preg::replace( - '/(@(?:type|var)\s*)(\$\S+)(\h+)([^\$](?:[^<\s]|<[^>]*>)*)(\s|\*)/i', - '$1$4$3$2$5', - $token->getContent() - ); - - if ($newContent === $token->getContent()) { - continue; - } - - $tokens[$index] = new Token([$token->getId(), $newContent]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php deleted file mode 100644 index 54b820e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php +++ /dev/null @@ -1,151 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - * @author Dave van der Brugge - */ -final class PhpdocVarWithoutNameFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - '`@var` and `@type` annotations of classy properties should not contain the name.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT) && $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - - if (null === $nextIndex) { - continue; - } - - // For people writing static public $foo instead of public static $foo - if ($tokens[$nextIndex]->isGivenKind(T_STATIC)) { - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - } - - // We want only doc blocks that are for properties and thus have specified access modifiers next - if (!$tokens[$nextIndex]->isGivenKind([T_PRIVATE, T_PROTECTED, T_PUBLIC, T_VAR])) { - continue; - } - - $doc = new DocBlock($token->getContent()); - - $firstLevelLines = $this->getFirstLevelLines($doc); - $annotations = $doc->getAnnotationsOfType(['type', 'var']); - - foreach ($annotations as $annotation) { - if (isset($firstLevelLines[$annotation->getStart()])) { - $this->fixLine($firstLevelLines[$annotation->getStart()]); - } - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - private function fixLine(Line $line) - { - $content = $line->getContent(); - - Preg::matchAll('/ \$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $content, $matches); - - if (isset($matches[0][0])) { - $line->setContent(str_replace($matches[0][0], '', $content)); - } - } - - /** - * @return Line[] - */ - private function getFirstLevelLines(DocBlock $docBlock) - { - $nested = 0; - $lines = $docBlock->getLines(); - - foreach ($lines as $index => $line) { - $content = $line->getContent(); - - if (Preg::match('/\s*\*\s*}$/', $content)) { - --$nested; - } - - if ($nested > 0) { - unset($lines[$index]); - } - - if (Preg::match('/\s\{$/', $content)) { - ++$nested; - } - } - - return $lines; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/BlankLineBeforeReturnFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/BlankLineBeforeReturnFixer.php deleted file mode 100644 index ce8eec3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/BlankLineBeforeReturnFixer.php +++ /dev/null @@ -1,71 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ReturnNotation; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\Fixer\Whitespace\BlankLineBeforeStatementFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * @deprecated since 2.4, replaced by BlankLineBeforeStatementFixer - * - * @todo To be removed at 3.0 - * - * @author Dariusz Rumiński - * @author Andreas Möller - */ -final class BlankLineBeforeReturnFixer extends AbstractProxyFixer implements DeprecatedFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'An empty line feed should precede a return statement.', - [new CodeSample("proxyFixers); - } - - /** - * {@inheritdoc} - */ - protected function createProxyFixers() - { - $fixer = new BlankLineBeforeStatementFixer(); - $fixer->configure(['statements' => ['return']]); - - return [$fixer]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/NoUselessReturnFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/NoUselessReturnFixer.php deleted file mode 100644 index 0452f2b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/NoUselessReturnFixer.php +++ /dev/null @@ -1,112 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ReturnNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoUselessReturnFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAllTokenKindsFound([T_FUNCTION, T_RETURN]); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There should not be an empty `return` statement at the end of a function.', - [ - new CodeSample( - ' $token) { - if (!$token->isGivenKind(T_FUNCTION)) { - continue; - } - - $index = $tokens->getNextTokenOfKind($index, [';', '{']); - if ($tokens[$index]->equals('{')) { - $this->fixFunction($tokens, $index, $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index)); - } - } - } - - /** - * @param int $start Token index of the opening brace token of the function - * @param int $end Token index of the closing brace token of the function - */ - private function fixFunction(Tokens $tokens, $start, $end) - { - for ($index = $end; $index > $start; --$index) { - if (!$tokens[$index]->isGivenKind(T_RETURN)) { - continue; - } - - $nextAt = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$nextAt]->equals(';')) { - continue; - } - - if ($tokens->getNextMeaningfulToken($nextAt) !== $end) { - continue; - } - - $previous = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$previous]->equalsAny([[T_ELSE], ')'])) { - continue; - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - $tokens->clearTokenAndMergeSurroundingWhitespace($nextAt); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/ReturnAssignmentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/ReturnAssignmentFixer.php deleted file mode 100644 index 2792eb3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/ReturnAssignmentFixer.php +++ /dev/null @@ -1,374 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ReturnNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class ReturnAssignmentFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Local, dynamic and directly referenced variables should not be assigned and directly returned by a function or method.', - [new CodeSample("isAllTokenKindsFound([T_FUNCTION, T_RETURN, T_VARIABLE]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $tokenCount = \count($tokens); - - for ($index = 1; $index < $tokenCount; ++$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - $functionOpenIndex = $tokens->getNextTokenOfKind($index, ['{', ';']); - if ($tokens[$functionOpenIndex]->equals(';')) { // abstract function - $index = $functionOpenIndex - 1; - - continue; - } - - $functionCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $functionOpenIndex); - $totalTokensAdded = 0; - - do { - $tokensAdded = $this->fixFunction( - $tokens, - $index, - $functionOpenIndex, - $functionCloseIndex - ); - - $totalTokensAdded += $tokensAdded; - } while ($tokensAdded > 0); - - $index = $functionCloseIndex + $totalTokensAdded; - $tokenCount += $totalTokensAdded; - } - } - - /** - * @param int $functionIndex token index of T_FUNCTION - * @param int $functionOpenIndex token index of the opening brace token of the function - * @param int $functionCloseIndex token index of the closing brace token of the function - * - * @return int >= 0 number of tokens inserted into the Tokens collection - */ - private function fixFunction(Tokens $tokens, $functionIndex, $functionOpenIndex, $functionCloseIndex) - { - static $riskyKinds = [ - CT::T_DYNAMIC_VAR_BRACE_OPEN, // "$h = ${$g};" case - T_EVAL, // "$c = eval('return $this;');" case - T_GLOBAL, - T_INCLUDE, // loading additional symbols we cannot analyze here - T_INCLUDE_ONCE, // " - T_REQUIRE, // " - T_REQUIRE_ONCE, // " - T_STATIC, - ]; - - $inserted = 0; - $candidates = []; - $isRisky = false; - - // go through the function declaration and check if references are passed - // - check if it will be risky to fix return statements of this function - for ($index = $functionIndex + 1; $index < $functionOpenIndex; ++$index) { - if ($tokens[$index]->equals('&')) { - $isRisky = true; - - break; - } - } - - // go through all the tokens of the body of the function: - // - check if it will be risky to fix return statements of this function - // - check nested functions; fix when found and update the upper limit + number of inserted token - // - check for return statements that might be fixed (based on if fixing will be risky, which is only know after analyzing the whole function) - - for ($index = $functionOpenIndex + 1; $index < $functionCloseIndex; ++$index) { - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { - $nestedFunctionOpenIndex = $tokens->getNextTokenOfKind($index, ['{', ';']); - if ($tokens[$nestedFunctionOpenIndex]->equals(';')) { // abstract function - $index = $nestedFunctionOpenIndex - 1; - - continue; - } - - $nestedFunctionCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $nestedFunctionOpenIndex); - - $tokensAdded = $this->fixFunction( - $tokens, - $index, - $nestedFunctionOpenIndex, - $nestedFunctionCloseIndex - ); - - $index = $nestedFunctionCloseIndex + $tokensAdded; - $functionCloseIndex += $tokensAdded; - $inserted += $tokensAdded; - } - - if ($isRisky) { - continue; // don't bother to look into anything else than nested functions as the current is risky already - } - - if ($tokens[$index]->equals('&')) { - $isRisky = true; - - continue; - } - - if ($tokens[$index]->isGivenKind(T_RETURN)) { - $candidates[] = $index; - - continue; - } - - // test if there this is anything in the function body that might - // change global state or indirect changes (like through references, eval, etc.) - - if ($tokens[$index]->isGivenKind($riskyKinds)) { - $isRisky = true; - - continue; - } - - if ($tokens[$index]->equals('$')) { - $nextIndex = $tokens->getNextMeaningfulToken($index); - if ($tokens[$nextIndex]->isGivenKind(T_VARIABLE)) { - $isRisky = true; // "$$a" case - - continue; - } - } - - if ($this->isSuperGlobal($tokens[$index])) { - $isRisky = true; - - continue; - } - } - - if ($isRisky) { - return $inserted; - } - - // fix the candidates in reverse order when applicable - for ($i = \count($candidates) - 1; $i >= 0; --$i) { - $index = $candidates[$i]; - - // Check if returning only a variable (i.e. not the result of an expression, function call etc.) - $returnVarIndex = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$returnVarIndex]->isGivenKind(T_VARIABLE)) { - continue; // example: "return 1;" - } - - $endReturnVarIndex = $tokens->getNextMeaningfulToken($returnVarIndex); - if (!$tokens[$endReturnVarIndex]->equalsAny([';', [T_CLOSE_TAG]])) { - continue; // example: "return $a + 1;" - } - - // Check that the variable is assigned just before it is returned - $assignVarEndIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$assignVarEndIndex]->equals(';')) { - continue; // example: "? return $a;" - } - - // Note: here we are @ "; return $a;" (or "; return $a ? >") - do { - $prevMeaningFul = $tokens->getPrevMeaningfulToken($assignVarEndIndex); - - if (!$tokens[$prevMeaningFul]->equals(')')) { - break; - } - - $assignVarEndIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $prevMeaningFul); - } while (true); - - $assignVarOperatorIndex = $tokens->getPrevTokenOfKind( - $assignVarEndIndex, - ['=', ';', '{', [T_OPEN_TAG], [T_OPEN_TAG_WITH_ECHO]] - ); - - if (null === $assignVarOperatorIndex || !$tokens[$assignVarOperatorIndex]->equals('=')) { - continue; - } - - // Note: here we are @ "= [^;{] ; return $a;" - $assignVarIndex = $tokens->getPrevMeaningfulToken($assignVarOperatorIndex); - if (!$tokens[$assignVarIndex]->equals($tokens[$returnVarIndex], false)) { - continue; - } - - // Note: here we are @ "$a = [^;{] ; return $a;" - $beforeAssignVarIndex = $tokens->getPrevMeaningfulToken($assignVarIndex); - if (!$tokens[$beforeAssignVarIndex]->equalsAny([';', '{', '}'])) { - continue; - } - - // Note: here we are @ "[;{}] $a = [^;{] ; return $a;" - $inserted += $this->simplifyReturnStatement( - $tokens, - $assignVarIndex, - $assignVarOperatorIndex, - $index, - $endReturnVarIndex - ); - } - - return $inserted; - } - - /** - * @param int $assignVarIndex - * @param int $assignVarOperatorIndex - * @param int $returnIndex - * @param int $returnVarEndIndex - * - * @return int >= 0 number of tokens inserted into the Tokens collection - */ - private function simplifyReturnStatement( - Tokens $tokens, - $assignVarIndex, - $assignVarOperatorIndex, - $returnIndex, - $returnVarEndIndex - ) { - $inserted = 0; - $originalIndent = $tokens[$assignVarIndex - 1]->isWhitespace() - ? $tokens[$assignVarIndex - 1]->getContent() - : null - ; - - // remove the return statement - if ($tokens[$returnVarEndIndex]->equals(';')) { // do not remove PHP close tags - $tokens->clearTokenAndMergeSurroundingWhitespace($returnVarEndIndex); - } - - for ($i = $returnIndex; $i <= $returnVarEndIndex - 1; ++$i) { - $this->clearIfSave($tokens, $i); - } - - // remove no longer needed indentation of the old/remove return statement - if ($tokens[$returnIndex - 1]->isWhitespace()) { - $content = $tokens[$returnIndex - 1]->getContent(); - $fistLinebreakPos = strrpos($content, "\n"); - $content = false === $fistLinebreakPos - ? ' ' - : substr($content, $fistLinebreakPos) - ; - - $tokens[$returnIndex - 1] = new Token([T_WHITESPACE, $content]); - } - - // remove the variable and the assignment - for ($i = $assignVarIndex; $i <= $assignVarOperatorIndex; ++$i) { - $this->clearIfSave($tokens, $i); - } - - // insert new return statement - $tokens->insertAt($assignVarIndex, new Token([T_RETURN, 'return'])); - ++$inserted; - - // use the original indent of the var assignment for the new return statement - if ( - null !== $originalIndent - && $tokens[$assignVarIndex - 1]->isWhitespace() - && $originalIndent !== $tokens[$assignVarIndex - 1]->getContent() - ) { - $tokens[$assignVarIndex - 1] = new Token([T_WHITESPACE, $originalIndent]); - } - - // remove trailing space after the new return statement which might be added during the clean up process - $nextIndex = $tokens->getNonEmptySibling($assignVarIndex, 1); - if (!$tokens[$nextIndex]->isWhitespace()) { - $tokens->insertAt($nextIndex, new Token([T_WHITESPACE, ' '])); - ++$inserted; - } - - return $inserted; - } - - private function clearIfSave(Tokens $tokens, $index) - { - if ($tokens[$index]->isComment()) { - return; - } - - if ($tokens[$index]->isWhitespace() && $tokens[$tokens->getPrevNonWhitespace($index)]->isComment()) { - return; - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - - /** - * @return bool - */ - private function isSuperGlobal(Token $token) - { - static $superNames = [ - '$_COOKIE' => true, - '$_ENV' => true, - '$_FILES' => true, - '$_GET' => true, - '$_POST' => true, - '$_REQUEST' => true, - '$_SERVER' => true, - '$_SESSION' => true, - '$GLOBALS' => true, - ]; - - if (!$token->isGivenKind(T_VARIABLE)) { - return false; - } - - return isset($superNames[strtoupper($token->getContent())]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php deleted file mode 100644 index 6b324ea..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php +++ /dev/null @@ -1,170 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\ReturnNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class SimplifiedNullReturnFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'A return statement wishing to return `void` should not return `null`.', - [ - new CodeSample("isTokenKindFound(T_RETURN); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_RETURN)) { - continue; - } - - if ($this->needFixing($tokens, $index)) { - $this->clear($tokens, $index); - } - } - } - - /** - * Clear the return statement located at a given index. - * - * @param int $index - */ - private function clear(Tokens $tokens, $index) - { - while (!$tokens[++$index]->equals(';')) { - if ($this->shouldClearToken($tokens, $index)) { - $tokens->clearAt($index); - } - } - } - - /** - * Does the return statement located at a given index need fixing? - * - * @param int $index - * - * @return bool - */ - private function needFixing(Tokens $tokens, $index) - { - if ($this->isStrictOrNullableReturnTypeFunction($tokens, $index)) { - return false; - } - - $content = ''; - while (!$tokens[$index]->equals(';')) { - $index = $tokens->getNextMeaningfulToken($index); - $content .= $tokens[$index]->getContent(); - } - - $content = ltrim($content, '('); - $content = rtrim($content, ');'); - - return 'null' === strtolower($content); - } - - /** - * Is the return within a function with a non-void or nullable return type? - * - * @param int $returnIndex Current return token index - * - * @return bool - */ - private function isStrictOrNullableReturnTypeFunction(Tokens $tokens, $returnIndex) - { - $functionIndex = $returnIndex; - do { - $functionIndex = $tokens->getPrevTokenOfKind($functionIndex, [[T_FUNCTION]]); - if (null === $functionIndex) { - return false; - } - $openingCurlyBraceIndex = $tokens->getNextTokenOfKind($functionIndex, ['{']); - $closingCurlyBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $openingCurlyBraceIndex); - } while ($closingCurlyBraceIndex < $returnIndex); - - $possibleVoidIndex = $tokens->getPrevMeaningfulToken($openingCurlyBraceIndex); - $isStrictReturnType = $tokens[$possibleVoidIndex]->isGivenKind(T_STRING) && 'void' !== $tokens[$possibleVoidIndex]->getContent(); - - $nullableTypeIndex = $tokens->getNextTokenOfKind($functionIndex, [[CT::T_NULLABLE_TYPE]]); - $isNullableReturnType = null !== $nullableTypeIndex && $nullableTypeIndex < $openingCurlyBraceIndex; - - return $isStrictReturnType || $isNullableReturnType; - } - - /** - * Should we clear the specific token? - * - * If the token is a comment, or is whitespace that is immediately before a - * comment, then we'll leave it alone. - * - * @param int $index - * - * @return bool - */ - private function shouldClearToken(Tokens $tokens, $index) - { - $token = $tokens[$index]; - - return !$token->isComment() && !($token->isWhitespace() && $tokens[$index + 1]->isComment()); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php deleted file mode 100644 index 57241d0..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php +++ /dev/null @@ -1,304 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Semicolon; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - * @author Egidijus Girčys - */ -final class MultilineWhitespaceBeforeSemicolonsFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @internal - */ - const STRATEGY_NO_MULTI_LINE = 'no_multi_line'; - - /** - * @internal - */ - const STRATEGY_NEW_LINE_FOR_CHAINED_CALLS = 'new_line_for_chained_calls'; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Forbid multi-line whitespace before the closing semicolon or move the semicolon to the new line for chained calls.', - [ - new CodeSample( - 'method1() - ->method2() - ->method(3); - ?> -', - ['strategy' => self::STRATEGY_NEW_LINE_FOR_CHAINED_CALLS] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before SpaceAfterSemicolonFixer. - * Must run after CombineConsecutiveIssetsFixer, NoEmptyStatementFixer, SingleImportPerStatementFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(';'); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder( - 'strategy', - 'Forbid multi-line whitespace or move the semicolon to the new line for chained calls.' - )) - ->setAllowedValues([self::STRATEGY_NO_MULTI_LINE, self::STRATEGY_NEW_LINE_FOR_CHAINED_CALLS]) - ->setDefault(self::STRATEGY_NO_MULTI_LINE) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - if (self::STRATEGY_NEW_LINE_FOR_CHAINED_CALLS === $this->configuration['strategy']) { - $this->applyChainedCallsFix($tokens); - - return; - } - - if (self::STRATEGY_NO_MULTI_LINE === $this->configuration['strategy']) { - $this->applyNoMultiLineFix($tokens); - } - } - - private function applyNoMultiLineFix(Tokens $tokens) - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - foreach ($tokens as $index => $token) { - if (!$token->equals(';')) { - continue; - } - - $previousIndex = $index - 1; - $previous = $tokens[$previousIndex]; - if (!$previous->isWhitespace() || false === strpos($previous->getContent(), "\n")) { - continue; - } - - $content = $previous->getContent(); - if (0 === strpos($content, $lineEnding) && $tokens[$index - 2]->isComment()) { - $tokens->ensureWhitespaceAtIndex($previousIndex, 0, $lineEnding); - } else { - $tokens->clearAt($previousIndex); - } - } - } - - private function applyChainedCallsFix(Tokens $tokens) - { - for ($index = \count($tokens) - 1; $index >= 0; --$index) { - // continue if token is not a semicolon - if (!$tokens[$index]->equals(';')) { - continue; - } - - // get the indent of the chained call, null in case it's not a chained call - $indent = $this->findWhitespaceBeforeFirstCall($index - 1, $tokens); - - if (null === $indent) { - continue; - } - - // unset semicolon - $tokens->clearAt($index); - - // find the line ending token index after the semicolon - $index = $this->getNewLineIndex($index, $tokens); - - // line ending string of the last method call - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - // appended new line to the last method call - $newline = new Token([T_WHITESPACE, $lineEnding.$indent]); - - // insert the new line with indented semicolon - $tokens->insertAt($index, [$newline, new Token(';')]); - } - } - - /** - * Find the index for the new line. Return the given index when there's no new line. - * - * @param int $index - * - * @return int - */ - private function getNewLineIndex($index, Tokens $tokens) - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - for ($index, $count = \count($tokens); $index < $count; ++$index) { - if (false !== strstr($tokens[$index]->getContent(), $lineEnding)) { - return $index; - } - } - - return $index; - } - - /** - * Checks if the semicolon closes a chained call and returns the whitespace of the first call at $index. - * i.e. it will return the whitespace marked with '____' in the example underneath. - * - * .. - * ____$this->methodCall() - * ->anotherCall(); - * .. - * - * @param int $index - * - * @return null|string - */ - private function findWhitespaceBeforeFirstCall($index, Tokens $tokens) - { - // semicolon followed by a closing bracket? - if (!$tokens[$index]->equals(')')) { - return null; - } - - // find opening bracket - $openingBrackets = 1; - for (--$index; $index > 0; --$index) { - if ($tokens[$index]->equals(')')) { - ++$openingBrackets; - - continue; - } - - if ($tokens[$index]->equals('(')) { - if (1 === $openingBrackets) { - break; - } - --$openingBrackets; - } - } - - // method name - if (!$tokens[--$index]->isGivenKind(T_STRING)) { - return null; - } - - // -> or :: - if (!$tokens[--$index]->isGivenKind([T_OBJECT_OPERATOR, T_DOUBLE_COLON])) { - return null; - } - - // white space - if (!$tokens[--$index]->isGivenKind(T_WHITESPACE)) { - return null; - } - - $closingBrackets = 0; - for ($index; $index >= 0; --$index) { - if ($tokens[$index]->equals(')')) { - ++$closingBrackets; - } - - if ($tokens[$index]->equals('(')) { - --$closingBrackets; - } - - // must be the variable of the first call in the chain - if ($tokens[$index]->isGivenKind([T_VARIABLE, T_RETURN, T_STRING]) && 0 === $closingBrackets) { - if ($tokens[--$index]->isGivenKind(T_WHITESPACE) - || $tokens[$index]->isGivenKind(T_OPEN_TAG)) { - return $this->getIndentAt($tokens, $index); - } - } - } - - return null; - } - - /** - * @param int $index - * - * @return null|string - */ - private function getIndentAt(Tokens $tokens, $index) - { - $content = ''; - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - // find line ending token - for ($index; $index > 0; --$index) { - if (false !== strstr($tokens[$index]->getContent(), $lineEnding)) { - break; - } - } - - if ($tokens[$index]->isWhitespace()) { - $content = $tokens[$index]->getContent(); - --$index; - } - - if ($tokens[$index]->isGivenKind(T_OPEN_TAG)) { - $content = $tokens[$index]->getContent().$content; - } - - if (1 === Preg::match('/\R{1}(\h*)$/', $content, $matches)) { - return $matches[1]; - } - - return null; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoEmptyStatementFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoEmptyStatementFixer.php deleted file mode 100644 index 027eca3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoEmptyStatementFixer.php +++ /dev/null @@ -1,162 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Semicolon; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author SpacePossum - * @author Dariusz Rumiński - */ -final class NoEmptyStatementFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Remove useless semicolon statements.', - [new CodeSample("isTokenKindFound(';'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - // skip T_FOR parenthesis to ignore duplicated `;` like `for ($i = 1; ; ++$i) {...}` - if ($tokens[$index]->isGivenKind(T_FOR)) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $tokens->getNextMeaningfulToken($index)) + 1; - - continue; - } - - if (!$tokens[$index]->equals(';')) { - continue; - } - - $previousMeaningfulIndex = $tokens->getPrevMeaningfulToken($index); - - // A semicolon can always be removed if it follows a semicolon, '{' or opening tag. - if ($tokens[$previousMeaningfulIndex]->equalsAny(['{', ';', [T_OPEN_TAG]])) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - continue; - } - - // A semicolon might be removed if it follows a '}' but only if the brace is part of certain structures. - if ($tokens[$previousMeaningfulIndex]->equals('}')) { - $this->fixSemicolonAfterCurlyBraceClose($tokens, $index, $previousMeaningfulIndex); - } - } - } - - /** - * Fix semicolon after closing curly brace if needed. - * - * Test for the following cases - * - just '{' '}' block (following open tag or ';') - * - if, else, elseif - * - interface, trait, class (but not anonymous) - * - catch, finally (but not try) - * - for, foreach, while (but not 'do - while') - * - switch - * - function (declaration, but not lambda) - * - declare (with '{' '}') - * - namespace (with '{' '}') - * - * @param int $index Semicolon index - * @param int $curlyCloseIndex - */ - private function fixSemicolonAfterCurlyBraceClose(Tokens $tokens, $index, $curlyCloseIndex) - { - static $beforeCurlyOpeningKinds = null; - if (null === $beforeCurlyOpeningKinds) { - $beforeCurlyOpeningKinds = [T_ELSE, T_FINALLY, T_NAMESPACE, T_OPEN_TAG]; - } - - $curlyOpeningIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $curlyCloseIndex); - $beforeCurlyOpening = $tokens->getPrevMeaningfulToken($curlyOpeningIndex); - if ($tokens[$beforeCurlyOpening]->isGivenKind($beforeCurlyOpeningKinds) || $tokens[$beforeCurlyOpening]->equalsAny([';', '{', '}'])) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - return; - } - - // check for namespaces and class, interface and trait definitions - if ($tokens[$beforeCurlyOpening]->isGivenKind(T_STRING)) { - $classyTest = $tokens->getPrevMeaningfulToken($beforeCurlyOpening); - while ($tokens[$classyTest]->equals(',') || $tokens[$classyTest]->isGivenKind([T_STRING, T_NS_SEPARATOR, T_EXTENDS, T_IMPLEMENTS])) { - $classyTest = $tokens->getPrevMeaningfulToken($classyTest); - } - - $tokensAnalyzer = new TokensAnalyzer($tokens); - - if ( - $tokens[$classyTest]->isGivenKind(T_NAMESPACE) || - ($tokens[$classyTest]->isClassy() && !$tokensAnalyzer->isAnonymousClass($classyTest)) - ) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - - return; - } - - // early return check, below only control structures with conditions are fixed - if (!$tokens[$beforeCurlyOpening]->equals(')')) { - return; - } - - $openingBrace = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $beforeCurlyOpening); - $beforeOpeningBrace = $tokens->getPrevMeaningfulToken($openingBrace); - - if ($tokens[$beforeOpeningBrace]->isGivenKind([T_IF, T_ELSEIF, T_FOR, T_FOREACH, T_WHILE, T_SWITCH, T_CATCH, T_DECLARE])) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - return; - } - - // check for function definition - if ($tokens[$beforeOpeningBrace]->isGivenKind(T_STRING)) { - $beforeString = $tokens->getPrevMeaningfulToken($beforeOpeningBrace); - if ($tokens[$beforeString]->isGivenKind(T_FUNCTION)) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); // implicit return - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoMultilineWhitespaceBeforeSemicolonsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoMultilineWhitespaceBeforeSemicolonsFixer.php deleted file mode 100644 index d35bb10..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoMultilineWhitespaceBeforeSemicolonsFixer.php +++ /dev/null @@ -1,68 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Semicolon; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; - -/** - * @deprecated since 2.9.1, replaced by MultilineWhitespaceBeforeSemicolonsFixer - * - * @todo To be removed at 3.0 - * - * @author Graham Campbell - */ -final class NoMultilineWhitespaceBeforeSemicolonsFixer extends AbstractProxyFixer implements DeprecatedFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Multi-line whitespace before closing semicolon are prohibited.', - [ - new CodeSample( - 'proxyFixers); - } - - /** - * {@inheritdoc} - */ - protected function createProxyFixers() - { - $fixer = new MultilineWhitespaceBeforeSemicolonsFixer(); - $fixer->configure(['strategy' => MultilineWhitespaceBeforeSemicolonsFixer::STRATEGY_NO_MULTI_LINE]); - - return [$fixer]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoSinglelineWhitespaceBeforeSemicolonsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoSinglelineWhitespaceBeforeSemicolonsFixer.php deleted file mode 100644 index dc4cf4a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoSinglelineWhitespaceBeforeSemicolonsFixer.php +++ /dev/null @@ -1,75 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Semicolon; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class NoSinglelineWhitespaceBeforeSemicolonsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Single-line whitespace before closing semicolon are prohibited.', - [new CodeSample("foo() ;\n")] - ); - } - - /** - * {@inheritdoc} - * - * Must run after CombineConsecutiveIssetsFixer, FunctionToConstantFixer, NoEmptyStatementFixer, SingleImportPerStatementFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(';'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->equals(';') || !$tokens[$index - 1]->isWhitespace(" \t")) { - continue; - } - - if ($tokens[$index - 2]->equals(';')) { - // do not remove all whitespace before the semicolon because it is also whitespace after another semicolon - if (!$tokens[$index - 1]->equals(' ')) { - $tokens[$index - 1] = new Token([T_WHITESPACE, ' ']); - } - } elseif (!$tokens[$index - 2]->isComment()) { - $tokens->clearAt($index - 1); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SemicolonAfterInstructionFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SemicolonAfterInstructionFixer.php deleted file mode 100644 index 35ee221..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SemicolonAfterInstructionFixer.php +++ /dev/null @@ -1,63 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Semicolon; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class SemicolonAfterInstructionFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Instructions must be terminated with a semicolon.', - [new CodeSample("\n")] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_CLOSE_TAG); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = \count($tokens) - 1; $index > 1; --$index) { - if (!$tokens[$index]->isGivenKind(T_CLOSE_TAG)) { - continue; - } - - $prev = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prev]->equalsAny([';', '{', '}', ':', [T_OPEN_TAG]])) { - continue; - } - - $tokens->insertAt($prev + 1, new Token(';')); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php deleted file mode 100644 index e11c1f1..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php +++ /dev/null @@ -1,145 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Semicolon; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class SpaceAfterSemicolonFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Fix whitespace after a semicolon.', - [ - new CodeSample( - " true, - ]), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after CombineConsecutiveUnsetsFixer, MultilineWhitespaceBeforeSemicolonsFixer, NoEmptyStatementFixer, OrderedClassElementsFixer, SingleImportPerStatementFixer, SingleTraitInsertPerStatementFixer. - */ - public function getPriority() - { - return -1; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(';'); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('remove_in_empty_for_expressions', 'Whether spaces should be removed for empty `for` expressions.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $insideForParenthesesUntil = null; - - for ($index = 0, $max = \count($tokens) - 1; $index < $max; ++$index) { - if ($this->configuration['remove_in_empty_for_expressions']) { - if ($tokens[$index]->isGivenKind(T_FOR)) { - $index = $tokens->getNextMeaningfulToken($index); - $insideForParenthesesUntil = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($index === $insideForParenthesesUntil) { - $insideForParenthesesUntil = null; - - continue; - } - } - - if (!$tokens[$index]->equals(';')) { - continue; - } - - if (!$tokens[$index + 1]->isWhitespace()) { - if ( - !$tokens[$index + 1]->equalsAny([')', [T_INLINE_HTML]]) && ( - !$this->configuration['remove_in_empty_for_expressions'] - || !$tokens[$index + 1]->equals(';') - ) - ) { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - ++$max; - } - - continue; - } - - if ( - null !== $insideForParenthesesUntil - && ($tokens[$index + 2]->equals(';') || $index + 2 === $insideForParenthesesUntil) - && !Preg::match('/\R/', $tokens[$index + 1]->getContent()) - ) { - $tokens->clearAt($index + 1); - - continue; - } - - if ( - isset($tokens[$index + 2]) - && !$tokens[$index + 1]->equals([T_WHITESPACE, ' ']) - && $tokens[$index + 1]->isWhitespace(" \t") - && !$tokens[$index + 2]->isComment() - && !$tokens[$index + 2]->equals(')') - ) { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php deleted file mode 100644 index ef11e6c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php +++ /dev/null @@ -1,152 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Strict; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jordi Boggiano - * @author SpacePossum - */ -final class DeclareStrictTypesFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Force strict types declaration in all files. Requires PHP >= 7.0.', - [ - new VersionSpecificCodeSample( - "= 70000 && isset($tokens[0]) && $tokens[0]->isGivenKind(T_OPEN_TAG); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - // check if the declaration is already done - $searchIndex = $tokens->getNextMeaningfulToken(0); - if (null === $searchIndex) { - $this->insertSequence($tokens); // declaration not found, insert one - - return; - } - - $sequenceLocation = $tokens->findSequence([[T_DECLARE, 'declare'], '(', [T_STRING, 'strict_types'], '=', [T_LNUMBER], ')'], $searchIndex, null, false); - if (null === $sequenceLocation) { - $this->insertSequence($tokens); // declaration not found, insert one - - return; - } - - $this->fixStrictTypesCasingAndValue($tokens, $sequenceLocation); - } - - /** - * @param array $sequence - */ - private function fixStrictTypesCasingAndValue(Tokens $tokens, array $sequence) - { - /** @var int $index */ - /** @var Token $token */ - foreach ($sequence as $index => $token) { - if ($token->isGivenKind(T_STRING)) { - $tokens[$index] = new Token([T_STRING, strtolower($token->getContent())]); - - continue; - } - if ($token->isGivenKind(T_LNUMBER)) { - $tokens[$index] = new Token([T_LNUMBER, '1']); - - break; - } - } - } - - private function insertSequence(Tokens $tokens) - { - $sequence = [ - new Token([T_DECLARE, 'declare']), - new Token('('), - new Token([T_STRING, 'strict_types']), - new Token('='), - new Token([T_LNUMBER, '1']), - new Token(')'), - new Token(';'), - ]; - $endIndex = \count($sequence); - - $tokens->insertAt(1, $sequence); - - // start index of the sequence is always 1 here, 0 is always open tag - // transform "getContent(), "\n")) { - $tokens[0] = new Token([$tokens[0]->getId(), trim($tokens[0]->getContent()).' ']); - } - - if ($endIndex === \count($tokens) - 1) { - return; // no more tokens afters sequence, single_blank_line_at_eof might add a line - } - - $lineEnding = $this->whitespacesConfig->getLineEnding(); - if (!$tokens[1 + $endIndex]->isWhitespace()) { - $tokens->insertAt(1 + $endIndex, new Token([T_WHITESPACE, $lineEnding])); - - return; - } - - $content = $tokens[1 + $endIndex]->getContent(); - $tokens[1 + $endIndex] = new Token([T_WHITESPACE, $lineEnding.ltrim($content, " \t")]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictComparisonFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictComparisonFixer.php deleted file mode 100644 index 7a706a6..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictComparisonFixer.php +++ /dev/null @@ -1,86 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Strict; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class StrictComparisonFixer extends AbstractFixer -{ - public function getDefinition() - { - return new FixerDefinition( - 'Comparisons should be strict.', - [new CodeSample("isAnyTokenKindsFound([T_IS_EQUAL, T_IS_NOT_EQUAL]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - static $map = [ - T_IS_EQUAL => [ - 'id' => T_IS_IDENTICAL, - 'content' => '===', - ], - T_IS_NOT_EQUAL => [ - 'id' => T_IS_NOT_IDENTICAL, - 'content' => '!==', - ], - ]; - - foreach ($tokens as $index => $token) { - $tokenId = $token->getId(); - - if (isset($map[$tokenId])) { - $tokens[$index] = new Token([$map[$tokenId]['id'], $map[$tokenId]['content']]); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php deleted file mode 100644 index fb982a3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php +++ /dev/null @@ -1,164 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Strict; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class StrictParamFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Functions should be used with `$strict` param set to `true`.', - [new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - * - * Must run before NativeFunctionInvocationFixer. - */ - public function getPriority() - { - return 11; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - static $map = null; - - if (null === $map) { - $trueToken = new Token([T_STRING, 'true']); - - $map = [ - 'array_keys' => [null, null, $trueToken], - 'array_search' => [null, null, $trueToken], - 'base64_decode' => [null, $trueToken], - 'in_array' => [null, null, $trueToken], - 'mb_detect_encoding' => [null, [new Token([T_STRING, 'mb_detect_order']), new Token('('), new Token(')')], $trueToken], - ]; - } - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - $nextIndex = $tokens->getNextMeaningfulToken($index); - if (null !== $nextIndex && !$tokens[$nextIndex]->equals('(')) { - continue; - } - - $lowercaseContent = strtolower($token->getContent()); - if ($token->isGivenKind(T_STRING) && isset($map[$lowercaseContent])) { - $this->fixFunction($tokens, $index, $map[$lowercaseContent]); - } - } - } - - private function fixFunction(Tokens $tokens, $functionIndex, array $functionParams) - { - $startBraceIndex = $tokens->getNextTokenOfKind($functionIndex, ['(']); - $endBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startBraceIndex); - $paramsQuantity = 0; - $expectParam = true; - - for ($index = $startBraceIndex + 1; $index < $endBraceIndex; ++$index) { - $token = $tokens[$index]; - - if ($expectParam && !$token->isWhitespace() && !$token->isComment()) { - ++$paramsQuantity; - $expectParam = false; - } - - if ($token->equals('(')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index); - - continue; - } - - if ($token->equals(',')) { - $expectParam = true; - - continue; - } - } - - $functionParamsQuantity = \count($functionParams); - - if ($paramsQuantity === $functionParamsQuantity) { - return; - } - - $tokensToInsert = []; - for ($i = $paramsQuantity; $i < $functionParamsQuantity; ++$i) { - // function call do not have all params that are required to set useStrict flag, exit from method! - if (!$functionParams[$i]) { - return; - } - - $tokensToInsert[] = new Token(','); - $tokensToInsert[] = new Token([T_WHITESPACE, ' ']); - - if (!\is_array($functionParams[$i])) { - $tokensToInsert[] = clone $functionParams[$i]; - - continue; - } - - foreach ($functionParams[$i] as $param) { - $tokensToInsert[] = clone $param; - } - } - - $beforeEndBraceIndex = $tokens->getTokenNotOfKindSibling($endBraceIndex, -1, [[T_WHITESPACE], ',']); - $tokens->insertAt($beforeEndBraceIndex + 1, $tokensToInsert); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php deleted file mode 100644 index 8cd23bd..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php +++ /dev/null @@ -1,167 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class EscapeImplicitBackslashesFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - $codeSample = <<<'EOF' - true] - ), - new CodeSample( - $codeSample, - ['double_quoted' => false] - ), - new CodeSample( - $codeSample, - ['heredoc_syntax' => false] - ), - ], - 'In PHP double-quoted strings and heredocs some chars like `n`, `$` or `u` have special meanings if preceded by a backslash ' - .'(and some are special only if followed by other special chars), while a backslash preceding other chars are interpreted like a plain ' - .'backslash. The precise list of those special chars is hard to remember and to identify quickly: this fixer escapes backslashes ' - ."that do not start a special interpretation with the char after them.\n" - .'It is possible to fix also single-quoted strings: in this case there is no special chars apart from single-quote and backslash ' - .'itself, so the fixer simply ensure that all backslashes are escaped. Both single and double backslashes are allowed in single-quoted ' - .'strings, so the purpose in this context is mainly to have a uniformed way to have them written all over the codebase.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound([T_ENCAPSED_AND_WHITESPACE, T_CONSTANT_ENCAPSED_STRING]); - } - - /** - * {@inheritdoc} - * - * Must run before HeredocToNowdocFixer, SingleQuoteFixer. - * Must run after BacktickToShellExecFixer. - */ - public function getPriority() - { - return 1; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - static $singleQuotedRegex = '/(? $token) { - $content = $token->getContent(); - if ($token->equalsAny(['"', 'b"', 'B"'])) { - $doubleQuoteOpened = !$doubleQuoteOpened; - } - if (!$token->isGivenKind([T_ENCAPSED_AND_WHITESPACE, T_CONSTANT_ENCAPSED_STRING]) || false === strpos($content, '\\')) { - continue; - } - - // Nowdoc syntax - if ($token->isGivenKind(T_ENCAPSED_AND_WHITESPACE) && '\'' === substr(rtrim($tokens[$index - 1]->getContent()), -1)) { - continue; - } - - $firstTwoCharacters = strtolower(substr($content, 0, 2)); - $isSingleQuotedString = $token->isGivenKind(T_CONSTANT_ENCAPSED_STRING) && ('\'' === $content[0] || 'b\'' === $firstTwoCharacters); - $isDoubleQuotedString = - ($token->isGivenKind(T_CONSTANT_ENCAPSED_STRING) && ('"' === $content[0] || 'b"' === $firstTwoCharacters)) - || ($token->isGivenKind(T_ENCAPSED_AND_WHITESPACE) && $doubleQuoteOpened) - ; - $isHeredocSyntax = !$isSingleQuotedString && !$isDoubleQuotedString; - if ( - (false === $this->configuration['single_quoted'] && $isSingleQuotedString) - || (false === $this->configuration['double_quoted'] && $isDoubleQuotedString) - || (false === $this->configuration['heredoc_syntax'] && $isHeredocSyntax) - ) { - continue; - } - - $regex = $heredocSyntaxRegex; - if ($isSingleQuotedString) { - $regex = $singleQuotedRegex; - } elseif ($isDoubleQuotedString) { - $regex = $doubleQuotedRegex; - } - - $newContent = Preg::replace($regex, '\\\\\\\\$1', $content); - if ($newContent !== $content) { - $tokens[$index] = new Token([$token->getId(), $newContent]); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('single_quoted', 'Whether to fix single-quoted strings.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('double_quoted', 'Whether to fix double-quoted strings.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('heredoc_syntax', 'Whether to fix heredoc syntax.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php deleted file mode 100644 index caa6950..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php +++ /dev/null @@ -1,172 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class ExplicitStringVariableFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Converts implicit variables into explicit ones in double-quoted strings or heredoc syntax.', - [new CodeSample( - <<<'EOT' -country !"; -$c = "I have $farm[0] chickens !"; - -EOT - )], - 'The reasoning behind this rule is the following:' - ."\n".'- When there are two valid ways of doing the same thing, using both is confusing, there should be a coding standard to follow' - ."\n".'- PHP manual marks `"$var"` syntax as implicit and `"${var}"` syntax as explicit: explicit code should always be preferred' - ."\n".'- Explicit syntax allows word concatenation inside strings, e.g. `"${var}IsAVar"`, implicit doesn\'t' - ."\n".'- Explicit syntax is easier to detect for IDE/editors and therefore has colors/highlight with higher contrast, which is easier to read' - ."\n".'Backtick operator is skipped because it is harder to handle; you can use `backtick_to_shell_exec` fixer to normalize backticks to strings' - ); - } - - /** - * {@inheritdoc} - * - * Must run before SimpleToComplexStringVariableFixer. - * Must run after BacktickToShellExecFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_VARIABLE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $backtickStarted = false; - for ($index = \count($tokens) - 1; $index > 0; --$index) { - $token = $tokens[$index]; - if ($token->equals('`')) { - $backtickStarted = !$backtickStarted; - - continue; - } - - if ($backtickStarted || !$token->isGivenKind(T_VARIABLE)) { - continue; - } - - $prevToken = $tokens[$index - 1]; - if (!$this->isStringPartToken($prevToken)) { - continue; - } - - $distinctVariableIndex = $index; - $variableTokens = [ - $distinctVariableIndex => [ - 'tokens' => [$index => $token], - 'firstVariableTokenIndex' => $index, - 'lastVariableTokenIndex' => $index, - ], - ]; - - $nextIndex = $index + 1; - $squareBracketCount = 0; - while (!$this->isStringPartToken($tokens[$nextIndex])) { - if ($tokens[$nextIndex]->isGivenKind(T_CURLY_OPEN)) { - $nextIndex = $tokens->getNextTokenOfKind($nextIndex, [[CT::T_CURLY_CLOSE]]); - } elseif ($tokens[$nextIndex]->isGivenKind(T_VARIABLE) && 1 !== $squareBracketCount) { - $distinctVariableIndex = $nextIndex; - $variableTokens[$distinctVariableIndex] = [ - 'tokens' => [$nextIndex => $tokens[$nextIndex]], - 'firstVariableTokenIndex' => $nextIndex, - 'lastVariableTokenIndex' => $nextIndex, - ]; - } else { - $variableTokens[$distinctVariableIndex]['tokens'][$nextIndex] = $tokens[$nextIndex]; - $variableTokens[$distinctVariableIndex]['lastVariableTokenIndex'] = $nextIndex; - - if ($tokens[$nextIndex]->equalsAny(['[', ']'])) { - ++$squareBracketCount; - } - } - - ++$nextIndex; - } - krsort($variableTokens, \SORT_NUMERIC); - - foreach ($variableTokens as $distinctVariableSet) { - if (1 === \count($distinctVariableSet['tokens'])) { - $singleVariableIndex = key($distinctVariableSet['tokens']); - $singleVariableToken = current($distinctVariableSet['tokens']); - $tokens->overrideRange($singleVariableIndex, $singleVariableIndex, [ - new Token([T_DOLLAR_OPEN_CURLY_BRACES, '${']), - new Token([T_STRING_VARNAME, substr($singleVariableToken->getContent(), 1)]), - new Token([CT::T_DOLLAR_CLOSE_CURLY_BRACES, '}']), - ]); - } else { - foreach ($distinctVariableSet['tokens'] as $variablePartIndex => $variablePartToken) { - if ($variablePartToken->isGivenKind(T_NUM_STRING)) { - $tokens[$variablePartIndex] = new Token([T_LNUMBER, $variablePartToken->getContent()]); - - continue; - } - - if ($variablePartToken->isGivenKind(T_STRING) && $tokens[$variablePartIndex + 1]->equals(']')) { - $tokens[$variablePartIndex] = new Token([T_CONSTANT_ENCAPSED_STRING, "'".$variablePartToken->getContent()."'"]); - } - } - - $tokens->insertAt($distinctVariableSet['lastVariableTokenIndex'] + 1, new Token([CT::T_CURLY_CLOSE, '}'])); - $tokens->insertAt($distinctVariableSet['firstVariableTokenIndex'], new Token([T_CURLY_OPEN, '{'])); - } - } - } - } - - /** - * Check if token is a part of a string. - * - * @param Token $token The token to check - * - * @return bool - */ - private function isStringPartToken(Token $token) - { - return $token->isGivenKind(T_ENCAPSED_AND_WHITESPACE) - || $token->isGivenKind(T_START_HEREDOC) - || '"' === $token->getContent() - || 'b"' === strtolower($token->getContent()) - ; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php deleted file mode 100644 index b54dbd9..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php +++ /dev/null @@ -1,115 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gregor Harlan - */ -final class HeredocToNowdocFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Convert `heredoc` to `nowdoc` where possible.', - [ - new CodeSample( - <<<'EOF' -isTokenKindFound(T_START_HEREDOC); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_START_HEREDOC) || false !== strpos($token->getContent(), "'")) { - continue; - } - - if ($tokens[$index + 1]->isGivenKind(T_END_HEREDOC)) { - $tokens[$index] = $this->convertToNowdoc($token); - - continue; - } - - if ( - !$tokens[$index + 1]->isGivenKind(T_ENCAPSED_AND_WHITESPACE) || - !$tokens[$index + 2]->isGivenKind(T_END_HEREDOC) - ) { - continue; - } - - $content = $tokens[$index + 1]->getContent(); - // regex: odd number of backslashes, not followed by dollar - if (Preg::match('/(?convertToNowdoc($token); - $content = str_replace(['\\\\', '\\$'], ['\\', '$'], $content); - $tokens[$index + 1] = new Token([ - $tokens[$index + 1]->getId(), - $content, - ]); - } - } - - /** - * Transforms the heredoc start token to nowdoc notation. - * - * @return Token - */ - private function convertToNowdoc(Token $token) - { - return new Token([ - $token->getId(), - Preg::replace('/^([Bb]?<<<)(\h*)"?([^\s"]+)"?/', '$1$2\'$3\'', $token->getContent()), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoBinaryStringFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoBinaryStringFixer.php deleted file mode 100644 index 08a2561..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoBinaryStringFixer.php +++ /dev/null @@ -1,65 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author ntzm - */ -final class NoBinaryStringFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound([T_CONSTANT_ENCAPSED_STRING, T_START_HEREDOC]); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There should not be a binary flag before strings.', - [ - new CodeSample(" $token) { - if (!$token->isGivenKind([T_CONSTANT_ENCAPSED_STRING, T_START_HEREDOC])) { - continue; - } - - $content = $token->getContent(); - - if ('b' === strtolower($content[0])) { - $tokens[$index] = new Token([$token->getId(), substr($content, 1)]); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php deleted file mode 100644 index 14cb635..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php +++ /dev/null @@ -1,113 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dave van der Brugge - */ -final class SimpleToComplexStringVariableFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Converts explicit variables in double-quoted strings and heredoc syntax from simple to complex format (`${` to `{$`).', - [ - new CodeSample( - <<<'EOT' -isTokenKindFound(T_DOLLAR_OPEN_CURLY_BRACES); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = \count($tokens) - 3; $index > 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_DOLLAR_OPEN_CURLY_BRACES)) { - continue; - } - - $varnameToken = $tokens[$index + 1]; - - if (!$varnameToken->isGivenKind(T_STRING_VARNAME)) { - continue; - } - - $dollarCloseToken = $tokens[$index + 2]; - - if (!$dollarCloseToken->isGivenKind(CT::T_DOLLAR_CLOSE_CURLY_BRACES)) { - continue; - } - - $tokenOfStringBeforeToken = $tokens[$index - 1]; - $stringContent = $tokenOfStringBeforeToken->getContent(); - - if ('$' === substr($stringContent, -1) && '\\$' !== substr($stringContent, -2)) { - $newContent = substr($stringContent, 0, -1).'\\$'; - $tokenOfStringBeforeToken = new Token([T_ENCAPSED_AND_WHITESPACE, $newContent]); - } - - $tokens->overrideRange($index - 1, $index + 2, [ - $tokenOfStringBeforeToken, - new Token([T_CURLY_OPEN, '{']), - new Token([T_VARIABLE, '$'.$varnameToken->getContent()]), - new Token([CT::T_CURLY_CLOSE, '}']), - ]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php deleted file mode 100644 index 46055b4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php +++ /dev/null @@ -1,116 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gregor Harlan - */ -final class SingleQuoteFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - $codeSample = <<<'EOF' - true] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after EscapeImplicitBackslashesFixer. - */ - public function getPriority() - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_CONSTANT_ENCAPSED_STRING); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { - continue; - } - - $content = $token->getContent(); - $prefix = ''; - - if ('b' === strtolower($content[0])) { - $prefix = $content[0]; - $content = substr($content, 1); - } - - if ( - '"' === $content[0] && - (true === $this->configuration['strings_containing_single_quote_chars'] || false === strpos($content, "'")) && - // regex: odd number of backslashes, not followed by double quote or dollar - !Preg::match('/(?setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLineEndingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLineEndingFixer.php deleted file mode 100644 index 33a50f7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLineEndingFixer.php +++ /dev/null @@ -1,85 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixes the line endings in multi-line strings. - * - * @author Ilija Tovilo - */ -final class StringLineEndingFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound([T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE, T_INLINE_HTML]); - } - - /** - * {@inheritdoc} - */ - public function isRisky() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'All multi-line strings must use correct line ending.', - [ - new CodeSample( - "whitespacesConfig->getLineEnding(); - - foreach ($tokens as $tokenIndex => $token) { - if (!$token->isGivenKind([T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE, T_INLINE_HTML])) { - continue; - } - - $tokens[$tokenIndex] = new Token([ - $token->getId(), - Preg::replace( - '#\R#u', - $ending, - $token->getContent() - ), - ]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/ArrayIndentationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/ArrayIndentationFixer.php deleted file mode 100644 index c7ef70d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/ArrayIndentationFixer.php +++ /dev/null @@ -1,400 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -final class ArrayIndentationFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Each element of an array must be indented exactly once.', - [ - new CodeSample(" [\n 'baz' => true,\n ],\n];\n"), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - * - * Must run before AlignMultilineCommentFixer, BinaryOperatorSpacesFixer. - * Must run after BracesFixer, MethodArgumentSpaceFixer, MethodChainingIndentationFixer. - */ - public function getPriority() - { - return -31; - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($this->findArrays($tokens) as $array) { - $indentLevel = 1; - $scopes = [[ - 'opening_braces' => $array['start_braces']['opening'], - 'unindented' => false, - ]]; - $currentScope = 0; - - $arrayIndent = $this->getLineIndentation($tokens, $array['start']); - $previousLineInitialIndent = $arrayIndent; - $previousLineNewIndent = $arrayIndent; - - foreach ($array['braces'] as $index => $braces) { - $currentIndentLevel = $indentLevel; - if ( - $braces['starts_with_closing'] - && !$scopes[$currentScope]['unindented'] - && !$this->isClosingLineWithMeaningfulContent($tokens, $index) - ) { - --$currentIndentLevel; - } - - $token = $tokens[$index]; - if ($this->newlineIsInArrayScope($tokens, $index, $array)) { - $content = Preg::replace( - '/(\R+)\h*$/', - '$1'.$arrayIndent.str_repeat($this->whitespacesConfig->getIndent(), $currentIndentLevel), - $token->getContent() - ); - - $previousLineInitialIndent = $this->extractIndent($token->getContent()); - $previousLineNewIndent = $this->extractIndent($content); - } else { - $content = Preg::replace( - '/(\R)'.preg_quote($previousLineInitialIndent, '/').'(\h*)$/', - '$1'.$previousLineNewIndent.'$2', - $token->getContent() - ); - } - - $closingBraces = $braces['closing']; - while ($closingBraces-- > 0) { - if (!$scopes[$currentScope]['unindented']) { - --$indentLevel; - $scopes[$currentScope]['unindented'] = true; - } - - if (0 === --$scopes[$currentScope]['opening_braces']) { - array_pop($scopes); - --$currentScope; - } - } - - if ($braces['opening'] > 0) { - $scopes[] = [ - 'opening_braces' => $braces['opening'], - 'unindented' => false, - ]; - ++$indentLevel; - ++$currentScope; - } - - $tokens[$index] = new Token([T_WHITESPACE, $content]); - } - } - } - - private function findArrays(Tokens $tokens) - { - $arrays = []; - - foreach ($this->findArrayTokenRanges($tokens, 0, \count($tokens) - 1) as $arrayTokenRanges) { - $array = [ - 'start' => $arrayTokenRanges[0][0], - 'end' => $arrayTokenRanges[\count($arrayTokenRanges) - 1][1], - 'token_ranges' => $arrayTokenRanges, - ]; - - $array['start_braces'] = $this->getLineSignificantBraces($tokens, $array['start'] - 1, $array); - $array['braces'] = $this->computeArrayLineSignificantBraces($tokens, $array); - - $arrays[] = $array; - } - - return $arrays; - } - - private function findArrayTokenRanges(Tokens $tokens, $from, $to) - { - $arrayTokenRanges = []; - $currentArray = null; - $valueSinceIndex = null; - - for ($index = $from; $index <= $to; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - $arrayStartIndex = $index; - - if ($token->isGivenKind(T_ARRAY)) { - $index = $tokens->getNextTokenOfKind($index, ['(']); - } - - $endIndex = $tokens->findBlockEnd( - $tokens[$index]->equals('(') ? Tokens::BLOCK_TYPE_PARENTHESIS_BRACE : Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, - $index - ); - - if (null === $currentArray) { - $currentArray = [ - 'start' => $index, - 'end' => $endIndex, - 'ignored_tokens_ranges' => [], - ]; - } else { - if (null === $valueSinceIndex) { - $valueSinceIndex = $arrayStartIndex; - } - - $index = $endIndex; - } - - continue; - } - - if (null === $currentArray || $token->isWhitespace() || $token->isComment()) { - continue; - } - - if ($currentArray['end'] === $index) { - if (null !== $valueSinceIndex) { - $currentArray['ignored_tokens_ranges'][] = [$valueSinceIndex, $tokens->getPrevMeaningfulToken($index)]; - $valueSinceIndex = null; - } - - $rangeIndexes = [$currentArray['start']]; - foreach ($currentArray['ignored_tokens_ranges'] as list($start, $end)) { - $rangeIndexes[] = $start - 1; - $rangeIndexes[] = $end + 1; - } - $rangeIndexes[] = $currentArray['end']; - - $arrayTokenRanges[] = array_chunk($rangeIndexes, 2); - - foreach ($currentArray['ignored_tokens_ranges'] as list($start, $end)) { - foreach ($this->findArrayTokenRanges($tokens, $start, $end) as $nestedArray) { - $arrayTokenRanges[] = $nestedArray; - } - } - - $currentArray = null; - - continue; - } - - if (null === $valueSinceIndex) { - $valueSinceIndex = $index; - } - - if ( - ($token->equals('(') && !$tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_ARRAY)) - || $token->equals('{') - ) { - $index = $tokens->findBlockEnd( - $token->equals('{') ? Tokens::BLOCK_TYPE_CURLY_BRACE : Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $index - ); - } - - if ($token->equals(',')) { - $currentArray['ignored_tokens_ranges'][] = [$valueSinceIndex, $tokens->getPrevMeaningfulToken($index)]; - $valueSinceIndex = null; - } - } - - return $arrayTokenRanges; - } - - private function computeArrayLineSignificantBraces(Tokens $tokens, array $array) - { - $braces = []; - - for ($index = $array['start']; $index <= $array['end']; ++$index) { - if (!$this->isNewLineToken($tokens, $index)) { - continue; - } - - $braces[$index] = $this->getLineSignificantBraces($tokens, $index, $array); - } - - return $braces; - } - - private function getLineSignificantBraces(Tokens $tokens, $index, array $array) - { - $deltas = []; - - for (++$index; $index <= $array['end']; ++$index) { - if ($this->isNewLineToken($tokens, $index)) { - break; - } - - if (!$this->indexIsInArrayTokenRanges($index, $array)) { - continue; - } - - $token = $tokens[$index]; - if ($token->equals('(') && !$tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_ARRAY)) { - continue; - } - - if ($token->equals(')')) { - $openBraceIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - if (!$tokens[$tokens->getPrevMeaningfulToken($openBraceIndex)]->isGivenKind(T_ARRAY)) { - continue; - } - } - - if ($token->equalsAny(['(', [CT::T_ARRAY_SQUARE_BRACE_OPEN]])) { - $deltas[] = 1; - - continue; - } - - if ($token->equalsAny([')', [CT::T_ARRAY_SQUARE_BRACE_CLOSE]])) { - $deltas[] = -1; - } - } - - $braces = [ - 'opening' => 0, - 'closing' => 0, - 'starts_with_closing' => -1 === reset($deltas), - ]; - - foreach ($deltas as $delta) { - if (1 === $delta) { - ++$braces['opening']; - } elseif ($braces['opening'] > 0) { - --$braces['opening']; - } else { - ++$braces['closing']; - } - } - - return $braces; - } - - private function isClosingLineWithMeaningfulContent(Tokens $tokens, $newLineIndex) - { - $nextMeaningfulIndex = $tokens->getNextMeaningfulToken($newLineIndex); - - return !$tokens[$nextMeaningfulIndex]->equalsAny([')', [CT::T_ARRAY_SQUARE_BRACE_CLOSE]]); - } - - private function getLineIndentation(Tokens $tokens, $index) - { - $newlineTokenIndex = $this->getPreviousNewlineTokenIndex($tokens, $index); - - if (null === $newlineTokenIndex) { - return ''; - } - - return $this->extractIndent($this->computeNewLineContent($tokens, $newlineTokenIndex)); - } - - private function extractIndent($content) - { - if (Preg::match('/\R(\h*)[^\r\n]*$/D', $content, $matches)) { - return $matches[1]; - } - - return ''; - } - - private function getPreviousNewlineTokenIndex(Tokens $tokens, $index) - { - while ($index > 0) { - $index = $tokens->getPrevTokenOfKind($index, [[T_WHITESPACE], [T_INLINE_HTML]]); - - if (null === $index) { - break; - } - - if ($this->isNewLineToken($tokens, $index)) { - return $index; - } - } - - return null; - } - - private function newlineIsInArrayScope(Tokens $tokens, $index, array $array) - { - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->equalsAny(['.', '?', ':'])) { - return false; - } - - $nextToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - if ($nextToken->isGivenKind(T_OBJECT_OPERATOR) || $nextToken->equalsAny(['.', '?', ':'])) { - return false; - } - - return $this->indexIsInArrayTokenRanges($index, $array); - } - - private function indexIsInArrayTokenRanges($index, array $array) - { - foreach ($array['token_ranges'] as list($start, $end)) { - if ($index < $start) { - return false; - } - - if ($index <= $end) { - return true; - } - } - - return false; - } - - private function isNewLineToken(Tokens $tokens, $index) - { - if (!$tokens[$index]->equalsAny([[T_WHITESPACE], [T_INLINE_HTML]])) { - return false; - } - - return (bool) Preg::match('/\R/', $this->computeNewLineContent($tokens, $index)); - } - - private function computeNewLineContent(Tokens $tokens, $index) - { - $content = $tokens[$index]->getContent(); - - if (0 !== $index && $tokens[$index - 1]->equalsAny([[T_OPEN_TAG], [T_CLOSE_TAG]])) { - $content = Preg::replace('/\S/', '', $tokens[$index - 1]->getContent()).$content; - } - - return $content; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php deleted file mode 100644 index 6783a1e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php +++ /dev/null @@ -1,367 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Dariusz Rumiński - * @author Andreas Möller - * @author SpacePossum - */ -final class BlankLineBeforeStatementFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var array - */ - private static $tokenMap = [ - 'break' => T_BREAK, - 'case' => T_CASE, - 'continue' => T_CONTINUE, - 'declare' => T_DECLARE, - 'default' => T_DEFAULT, - 'die' => T_EXIT, - 'do' => T_DO, - 'exit' => T_EXIT, - 'for' => T_FOR, - 'foreach' => T_FOREACH, - 'goto' => T_GOTO, - 'if' => T_IF, - 'include' => T_INCLUDE, - 'include_once' => T_INCLUDE_ONCE, - 'require' => T_REQUIRE, - 'require_once' => T_REQUIRE_ONCE, - 'return' => T_RETURN, - 'switch' => T_SWITCH, - 'throw' => T_THROW, - 'try' => T_TRY, - 'while' => T_WHILE, - 'yield' => T_YIELD, - ]; - - /** - * @var array - */ - private $fixTokenMap = []; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - $this->fixTokenMap = []; - - foreach ($this->configuration['statements'] as $key) { - $this->fixTokenMap[$key] = self::$tokenMap[$key]; - } - - $this->fixTokenMap = array_values($this->fixTokenMap); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'An empty line feed must precede any configured statement.', - [ - new CodeSample( - 'process(); - break; - case 44: - break; -} -', - [ - 'statements' => ['break'], - ] - ), - new CodeSample( - 'isTired()) { - $bar->sleep(); - continue; - } -} -', - [ - 'statements' => ['continue'], - ] - ), - new CodeSample( - ' ['die'], - ] - ), - new CodeSample( - ' 0); -', - [ - 'statements' => ['do'], - ] - ), - new CodeSample( - ' ['exit'], - ] - ), - new CodeSample( - ' ['goto'], - ] - ), - new CodeSample( - ' ['if'], - ] - ), - new CodeSample( - ' ['return'], - ] - ), - new CodeSample( - ' ['switch'], - ] - ), - new CodeSample( - 'bar(); - throw new \UnexpectedValueException("A cannot be null."); -} -', - [ - 'statements' => ['throw'], - ] - ), - new CodeSample( - 'bar(); -} catch (\Exception $exception) { - $a = -1; -} -', - [ - 'statements' => ['try'], - ] - ), - new CodeSample( - ' ['yield'], - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after NoExtraBlankLinesFixer, NoUselessReturnFixer, ReturnAssignmentFixer. - */ - public function getPriority() - { - return -21; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound($this->fixTokenMap); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $analyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 1; $index > 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind($this->fixTokenMap)) { - continue; - } - - if ($token->isGivenKind(T_WHILE) && $analyzer->isWhilePartOfDoWhile($index)) { - continue; - } - - $prevNonWhitespace = $tokens->getPrevNonWhitespace($index); - - if ($this->shouldAddBlankLine($tokens, $prevNonWhitespace)) { - $this->insertBlankLine($tokens, $index); - } - - $index = $prevNonWhitespace; - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('statements', 'List of statements which must be preceded by an empty line.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(array_keys(self::$tokenMap))]) - ->setDefault([ - 'break', - 'continue', - 'declare', - 'return', - 'throw', - 'try', - ]) - ->getOption(), - ]); - } - - /** - * @param int $prevNonWhitespace - * - * @return bool - */ - private function shouldAddBlankLine(Tokens $tokens, $prevNonWhitespace) - { - $prevNonWhitespaceToken = $tokens[$prevNonWhitespace]; - - if ($prevNonWhitespaceToken->isComment()) { - for ($j = $prevNonWhitespace - 1; $j >= 0; --$j) { - if (false !== strpos($tokens[$j]->getContent(), "\n")) { - return false; - } - - if ($tokens[$j]->isWhitespace() || $tokens[$j]->isComment()) { - continue; - } - - return $tokens[$j]->equalsAny([';', '}']); - } - } - - return $prevNonWhitespaceToken->equalsAny([';', '}']); - } - - /** - * @param int $index - */ - private function insertBlankLine(Tokens $tokens, $index) - { - $prevIndex = $index - 1; - $prevToken = $tokens[$prevIndex]; - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - if ($prevToken->isWhitespace()) { - $newlinesCount = substr_count($prevToken->getContent(), "\n"); - - if (0 === $newlinesCount) { - $tokens[$prevIndex] = new Token([T_WHITESPACE, rtrim($prevToken->getContent(), " \t").$lineEnding.$lineEnding]); - } elseif (1 === $newlinesCount) { - $tokens[$prevIndex] = new Token([T_WHITESPACE, $lineEnding.$prevToken->getContent()]); - } - } else { - $tokens->insertAt($index, new Token([T_WHITESPACE, $lineEnding.$lineEnding])); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/CompactNullableTypehintFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/CompactNullableTypehintFixer.php deleted file mode 100644 index 8cb48c3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/CompactNullableTypehintFixer.php +++ /dev/null @@ -1,79 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jack Cherng - */ -final class CompactNullableTypehintFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Remove extra spaces in a nullable typehint.', - [ - new VersionSpecificCodeSample( - "= 70100 && $tokens->isTokenKindFound(CT::T_NULLABLE_TYPE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - static $typehintKinds = [ - CT::T_ARRAY_TYPEHINT, - T_CALLABLE, - T_NS_SEPARATOR, - T_STRING, - ]; - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind(CT::T_NULLABLE_TYPE)) { - continue; - } - - // remove whitespaces only if there are only whitespaces - // between '?' and the variable type - if ( - $tokens[$index + 1]->isWhitespace() && - $tokens[$index + 2]->isGivenKind($typehintKinds) - ) { - $tokens->removeTrailingWhitespace($index); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php deleted file mode 100644 index 22d6bcc..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php +++ /dev/null @@ -1,167 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gregor Harlan - */ -final class HeredocIndentationFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Heredoc/nowdoc content must be properly indented. Requires PHP >= 7.3.', - [ - new VersionSpecificCodeSample( - <<<'SAMPLE' -= 70300 && $tokens->isTokenKindFound(T_START_HEREDOC); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - for ($index = \count($tokens) - 1; 0 <= $index; --$index) { - if (!$tokens[$index]->isGivenKind(T_END_HEREDOC)) { - continue; - } - - $end = $index; - $index = $tokens->getPrevTokenOfKind($index, [[T_START_HEREDOC]]); - - $this->fixIndentation($tokens, $index, $end); - } - } - - /** - * @param int $start - * @param int $end - */ - private function fixIndentation(Tokens $tokens, $start, $end) - { - $indent = $this->getIndentAt($tokens, $start).$this->whitespacesConfig->getIndent(); - - Preg::match('/^\h*/', $tokens[$end]->getContent(), $matches); - $currentIndent = $matches[0]; - $currentIndentLength = \strlen($currentIndent); - - $content = $indent.substr($tokens[$end]->getContent(), $currentIndentLength); - $tokens[$end] = new Token([T_END_HEREDOC, $content]); - - if ($end === $start + 1) { - return; - } - - for ($index = $end - 1, $last = true; $index > $start; --$index, $last = false) { - if (!$tokens[$index]->isGivenKind([T_ENCAPSED_AND_WHITESPACE, T_WHITESPACE])) { - continue; - } - - $content = $tokens[$index]->getContent(); - - if ('' !== $currentIndent) { - $content = Preg::replace('/(?<=\v)(?!'.$currentIndent.')\h+/', '', $content); - } - - $regexEnd = $last && !$currentIndent ? '(?!\v|$)' : '(?!\v)'; - $content = Preg::replace('/(?<=\v)'.$currentIndent.$regexEnd.'/', $indent, $content); - - $tokens[$index] = new Token([$tokens[$index]->getId(), $content]); - } - - ++$index; - - if (!$tokens[$index]->isGivenKind(T_ENCAPSED_AND_WHITESPACE)) { - $tokens->insertAt($index, new Token([T_ENCAPSED_AND_WHITESPACE, $indent])); - - return; - } - - $content = $tokens[$index]->getContent(); - - if (!\in_array($content[0], ["\r", "\n"], true) && (!$currentIndent || $currentIndent === substr($content, 0, $currentIndentLength))) { - $content = $indent.substr($content, $currentIndentLength); - } elseif ($currentIndent) { - $content = Preg::replace('/^(?!'.$currentIndent.')\h+/', '', $content); - } - - $tokens[$index] = new Token([T_ENCAPSED_AND_WHITESPACE, $content]); - } - - /** - * @param int $index - * - * @return string - */ - private function getIndentAt(Tokens $tokens, $index) - { - for (; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind([T_WHITESPACE, T_INLINE_HTML, T_OPEN_TAG])) { - continue; - } - - $content = $tokens[$index]->getContent(); - - if ($tokens[$index]->isWhitespace() && $tokens[$index - 1]->isGivenKind(T_OPEN_TAG)) { - $content = $tokens[$index - 1]->getContent().$content; - } - - if (1 === Preg::match('/\R(\h*)$/', $content, $matches)) { - return $matches[1]; - } - } - - return ''; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php deleted file mode 100644 index ae16ae5..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php +++ /dev/null @@ -1,163 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶2.4. - * - * @author Dariusz Rumiński - */ -final class IndentationTypeFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * @var string - */ - private $indent; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Code MUST use configured indentation type.', - [ - new CodeSample("isAnyTokenKindsFound([T_COMMENT, T_DOC_COMMENT, T_WHITESPACE]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $this->indent = $this->whitespacesConfig->getIndent(); - - foreach ($tokens as $index => $token) { - if ($token->isComment()) { - $tokens[$index] = $this->fixIndentInComment($tokens, $index); - - continue; - } - - if ($token->isWhitespace()) { - $tokens[$index] = $this->fixIndentToken($tokens, $index); - - continue; - } - } - } - - /** - * @param int $index - * - * @return Token - */ - private function fixIndentInComment(Tokens $tokens, $index) - { - $content = Preg::replace('/^(?:(?getContent(), -1, $count); - - // Also check for more tabs. - while (0 !== $count) { - $content = Preg::replace('/^(\ +)?\t/m', '\1 ', $content, -1, $count); - } - - $indent = $this->indent; - - // change indent to expected one - $content = Preg::replaceCallback('/^(?: )+/m', function ($matches) use ($indent) { - return $this->getExpectedIndent($matches[0], $indent); - }, $content); - - return new Token([$tokens[$index]->getId(), $content]); - } - - /** - * @param int $index - * - * @return Token - */ - private function fixIndentToken(Tokens $tokens, $index) - { - $content = $tokens[$index]->getContent(); - $previousTokenHasTrailingLinebreak = false; - - // @TODO 3.0 this can be removed when we have a transformer for "T_OPEN_TAG" to "T_OPEN_TAG + T_WHITESPACE" - if (false !== strpos($tokens[$index - 1]->getContent(), "\n")) { - $content = "\n".$content; - $previousTokenHasTrailingLinebreak = true; - } - - $indent = $this->indent; - $newContent = Preg::replaceCallback( - '/(\R)(\h+)/', // find indent - function (array $matches) use ($indent) { - // normalize mixed indent - $content = Preg::replace('/(?:(?getExpectedIndent($content, $indent); - }, - $content - ); - - if ($previousTokenHasTrailingLinebreak) { - $newContent = substr($newContent, 1); - } - - return new Token([T_WHITESPACE, $newContent]); - } - - /** - * @param string $content - * @param string $indent - * - * @return string mixed - */ - private function getExpectedIndent($content, $indent) - { - if ("\t" === $indent) { - $content = str_replace(' ', $indent, $content); - } - - return $content; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/LineEndingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/LineEndingFixer.php deleted file mode 100644 index 0157c84..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/LineEndingFixer.php +++ /dev/null @@ -1,102 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶2.2. - * - * @author Fabien Potencier - * @author SpacePossum - * @author Dariusz Rumiński - */ -final class LineEndingFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'All PHP files must use same line ending.', - [ - new CodeSample( - "whitespacesConfig->getLineEnding(); - - for ($index = 0, $count = \count($tokens); $index < $count; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_ENCAPSED_AND_WHITESPACE)) { - if ($tokens[$tokens->getNextMeaningfulToken($index)]->isGivenKind(T_END_HEREDOC)) { - $tokens[$index] = new Token([ - $token->getId(), - Preg::replace( - '#\R#', - $ending, - $token->getContent() - ), - ]); - } - - continue; - } - - if ($token->isGivenKind([T_CLOSE_TAG, T_COMMENT, T_DOC_COMMENT, T_OPEN_TAG, T_START_HEREDOC, T_WHITESPACE])) { - $tokens[$index] = new Token([ - $token->getId(), - Preg::replace( - '#\R#', - $ending, - $token->getContent() - ), - ]); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php deleted file mode 100644 index b48b41e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php +++ /dev/null @@ -1,202 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Vladimir Boliev - */ -final class MethodChainingIndentationFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Method chaining MUST be properly indented. Method chaining with different levels of indentation is not supported.', - [new CodeSample("setEmail('voff.web@gmail.com')\n ->setPassword('233434');\n")] - ); - } - - /** - * {@inheritdoc} - * - * Must run before ArrayIndentationFixer, MethodArgumentSpaceFixer. - * Must run after BracesFixer. - */ - public function getPriority() - { - return -29; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isTokenKindFound(T_OBJECT_OPERATOR); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - for ($index = 1, $count = \count($tokens); $index < $count; ++$index) { - if (!$tokens[$index]->isGivenKind(T_OBJECT_OPERATOR)) { - continue; - } - - if ($this->canBeMovedToNextLine($index, $tokens)) { - $newline = new Token([T_WHITESPACE, $lineEnding]); - if ($tokens[$index - 1]->isWhitespace()) { - $tokens[$index - 1] = $newline; - } else { - $tokens->insertAt($index, $newline); - ++$index; - } - } - - $currentIndent = $this->getIndentAt($tokens, $index - 1); - if (null === $currentIndent) { - continue; - } - - $expectedIndent = $this->getExpectedIndentAt($tokens, $index); - if ($currentIndent !== $expectedIndent) { - $tokens[$index - 1] = new Token([T_WHITESPACE, $lineEnding.$expectedIndent]); - } - } - } - - /** - * @param int $index index of the first token on the line to indent - * - * @return string - */ - private function getExpectedIndentAt(Tokens $tokens, $index) - { - $index = $tokens->getPrevMeaningfulToken($index); - $indent = $this->whitespacesConfig->getIndent(); - - for ($i = $index; $i >= 0; --$i) { - if ($tokens[$i]->equals(')')) { - $i = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $i); - } - - $currentIndent = $this->getIndentAt($tokens, $i); - if (null === $currentIndent) { - continue; - } - - if ($this->currentLineRequiresExtraIndentLevel($tokens, $i, $index)) { - return $currentIndent.$indent; - } - - return $currentIndent; - } - - return $indent; - } - - /** - * @param int $index position of the T_OBJECT_OPERATOR token - * - * @return bool - */ - private function canBeMovedToNextLine($index, Tokens $tokens) - { - $prevMeaningful = $tokens->getPrevMeaningfulToken($index); - $hasCommentBefore = false; - - for ($i = $index - 1; $i > $prevMeaningful; --$i) { - if ($tokens[$i]->isComment()) { - $hasCommentBefore = true; - - continue; - } - - if ($tokens[$i]->isWhitespace() && 1 === Preg::match('/\R/', $tokens[$i]->getContent())) { - return $hasCommentBefore; - } - } - - return false; - } - - /** - * @param int $index index of the indentation token - * - * @return null|string - */ - private function getIndentAt(Tokens $tokens, $index) - { - if (1 === Preg::match('/\R{1}(\h*)$/', $this->getIndentContentAt($tokens, $index), $matches)) { - return $matches[1]; - } - - return null; - } - - private function getIndentContentAt(Tokens $tokens, $index) - { - if (!$tokens[$index]->isGivenKind([T_WHITESPACE, T_INLINE_HTML])) { - return ''; - } - - $content = $tokens[$index]->getContent(); - - if ($tokens[$index]->isWhitespace() && $tokens[$index - 1]->isGivenKind(T_OPEN_TAG)) { - $content = $tokens[$index - 1]->getContent().$content; - } - - if (Preg::match('/\R/', $content)) { - return $content; - } - - return ''; - } - - /** - * @param int $start index of first meaningful token on previous line - * @param int $end index of last token on previous line - * - * @return bool - */ - private function currentLineRequiresExtraIndentLevel(Tokens $tokens, $start, $end) - { - if ($tokens[$start + 1]->isGivenKind(T_OBJECT_OPERATOR)) { - return false; - } - - if ($tokens[$end]->isGivenKind(CT::T_BRACE_CLASS_INSTANTIATION_CLOSE)) { - return true; - } - - return - !$tokens[$end]->equals(')') - || $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $end) >= $start - ; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php deleted file mode 100644 index a1b560b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php +++ /dev/null @@ -1,484 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\ConfigurationException\InvalidConfigurationException; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class NoExtraBlankLinesFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var string[] - */ - private static $availableTokens = [ - 'break', - 'case', - 'continue', - 'curly_brace_block', - 'default', - 'extra', - 'parenthesis_brace_block', - 'return', - 'square_brace_block', - 'switch', - 'throw', - 'use', - 'useTrait', - 'use_trait', - ]; - - /** - * @var array key is token id, value is name of callback - */ - private $tokenKindCallbackMap; - - /** - * @var array token prototype, value is name of callback - */ - private $tokenEqualsMap; - - /** - * @var Tokens - */ - private $tokens; - - /** - * @var TokensAnalyzer - */ - private $tokensAnalyzer; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null) - { - parent::configure($configuration); - - static $reprToTokenMap = [ - 'break' => T_BREAK, - 'case' => T_CASE, - 'continue' => T_CONTINUE, - 'curly_brace_block' => '{', - 'default' => T_DEFAULT, - 'extra' => T_WHITESPACE, - 'parenthesis_brace_block' => '(', - 'return' => T_RETURN, - 'square_brace_block' => CT::T_ARRAY_SQUARE_BRACE_OPEN, - 'switch' => T_SWITCH, - 'throw' => T_THROW, - 'use' => T_USE, - 'use_trait' => CT::T_USE_TRAIT, - ]; - - static $tokenKindCallbackMap = [ - T_BREAK => 'fixAfterToken', - T_CASE => 'fixAfterToken', - T_CONTINUE => 'fixAfterToken', - T_DEFAULT => 'fixAfterToken', - T_RETURN => 'fixAfterToken', - T_SWITCH => 'fixAfterToken', - T_THROW => 'fixAfterToken', - T_USE => 'removeBetweenUse', - T_WHITESPACE => 'removeMultipleBlankLines', - CT::T_USE_TRAIT => 'removeBetweenUse', - CT::T_ARRAY_SQUARE_BRACE_OPEN => 'fixStructureOpenCloseIfMultiLine', // typeless '[' tokens should not be fixed (too rare) - ]; - - static $tokenEqualsMap = [ - '{' => 'fixStructureOpenCloseIfMultiLine', // i.e. not: CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN - '(' => 'fixStructureOpenCloseIfMultiLine', // i.e. not: CT::T_BRACE_CLASS_INSTANTIATION_OPEN - ]; - - $tokensAssoc = array_flip(array_intersect_key($reprToTokenMap, array_flip($this->configuration['tokens']))); - - $this->tokenKindCallbackMap = array_intersect_key($tokenKindCallbackMap, $tokensAssoc); - $this->tokenEqualsMap = array_intersect_key($tokenEqualsMap, $tokensAssoc); - } - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Removes extra blank lines and/or blank lines following configuration.', - [ - new CodeSample( - ' ['break']] - ), - new CodeSample( - ' ['continue']] - ), - new CodeSample( - ' ['curly_brace_block']] - ), - new CodeSample( - ' ['extra']] - ), - new CodeSample( - ' ['parenthesis_brace_block']] - ), - new CodeSample( - ' ['return']] - ), - new CodeSample( - ' ['square_brace_block']] - ), - new CodeSample( - ' ['throw']] - ), - new CodeSample( - ' ['use']] - ), - new CodeSample( - ' ['use_trait']] - ), - new CodeSample( - ' ['switch', 'case', 'default']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BlankLineBeforeStatementFixer. - * Must run after CombineConsecutiveUnsetsFixer, FunctionToConstantFixer, NoEmptyCommentFixer, NoEmptyPhpdocFixer, NoEmptyStatementFixer, NoUnusedImportsFixer, NoUselessElseFixer, NoUselessReturnFixer. - */ - public function getPriority() - { - return -20; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - $this->tokens = $tokens; - $this->tokensAnalyzer = new TokensAnalyzer($this->tokens); - for ($index = $tokens->getSize() - 1; $index > 0; --$index) { - $this->fixByToken($tokens[$index], $index); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $that = $this; - - return new FixerConfigurationResolverRootless('tokens', [ - (new FixerOptionBuilder('tokens', 'List of tokens to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(self::$availableTokens)]) - ->setNormalizer(static function (Options $options, $tokens) use ($that) { - foreach ($tokens as &$token) { - if ('useTrait' === $token) { - $message = "Token \"useTrait\" in option \"tokens\" for rule \"{$that->getName()}\" is deprecated and will be removed in 3.0, use \"use_trait\" instead."; - - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - throw new InvalidConfigurationException("{$message} This check was performed as `PHP_CS_FIXER_FUTURE_MODE` env var is set."); - } - - @trigger_error($message, E_USER_DEPRECATED); - $token = 'use_trait'; - - break; - } - } - - return $tokens; - }) - ->setDefault(['extra']) - ->getOption(), - ], $this->getName()); - } - - private function fixByToken(Token $token, $index) - { - foreach ($this->tokenKindCallbackMap as $kind => $callback) { - if (!$token->isGivenKind($kind)) { - continue; - } - - $this->{$callback}($index); - - return; - } - - foreach ($this->tokenEqualsMap as $equals => $callback) { - if (!$token->equals($equals)) { - continue; - } - - $this->{$callback}($index); - - return; - } - } - - private function removeBetweenUse($index) - { - $next = $this->tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); - if (null === $next || $this->tokens[$next]->isGivenKind(T_CLOSE_TAG)) { - return; - } - - $nextUseCandidate = $this->tokens->getNextMeaningfulToken($next); - if (null === $nextUseCandidate || !$this->tokens[$nextUseCandidate]->isGivenKind($this->tokens[$index]->getId()) || !$this->containsLinebreak($index, $nextUseCandidate)) { - return; - } - - return $this->removeEmptyLinesAfterLineWithTokenAt($next); - } - - private function removeMultipleBlankLines($index) - { - $expected = $this->tokens[$index - 1]->isGivenKind(T_OPEN_TAG) && 1 === Preg::match('/\R$/', $this->tokens[$index - 1]->getContent()) ? 1 : 2; - - $parts = Preg::split('/(.*\R)/', $this->tokens[$index]->getContent(), -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - $count = \count($parts); - - if ($count > $expected) { - $this->tokens[$index] = new Token([T_WHITESPACE, implode('', \array_slice($parts, 0, $expected)).rtrim($parts[$count - 1], "\r\n")]); - } - } - - private function fixAfterToken($index) - { - for ($i = $index - 1; $i > 0; --$i) { - if ($this->tokens[$i]->isGivenKind(T_FUNCTION) && $this->tokensAnalyzer->isLambda($i)) { - return; - } - - if ($this->tokens[$i]->isGivenKind(T_CLASS) && $this->tokensAnalyzer->isAnonymousClass($i)) { - return; - } - - if ($this->tokens[$i]->isWhitespace() && false !== strpos($this->tokens[$i]->getContent(), "\n")) { - break; - } - } - - $this->removeEmptyLinesAfterLineWithTokenAt($index); - } - - /** - * Remove white line(s) after the index of a block type, - * but only if the block is not on one line. - * - * @param int $index body start - */ - private function fixStructureOpenCloseIfMultiLine($index) - { - $blockTypeInfo = Tokens::detectBlockType($this->tokens[$index]); - $bodyEnd = $this->tokens->findBlockEnd($blockTypeInfo['type'], $index); - - for ($i = $bodyEnd - 1; $i >= $index; --$i) { - if (false !== strpos($this->tokens[$i]->getContent(), "\n")) { - $this->removeEmptyLinesAfterLineWithTokenAt($i); - $this->removeEmptyLinesAfterLineWithTokenAt($index); - - break; - } - } - } - - private function removeEmptyLinesAfterLineWithTokenAt($index) - { - // find the line break - $tokenCount = \count($this->tokens); - for ($end = $index; $end < $tokenCount; ++$end) { - if ( - $this->tokens[$end]->equals('}') - || false !== strpos($this->tokens[$end]->getContent(), "\n") - ) { - break; - } - } - - if ($end === $tokenCount) { - return; // not found, early return - } - - $ending = $this->whitespacesConfig->getLineEnding(); - - for ($i = $end; $i < $tokenCount && $this->tokens[$i]->isWhitespace(); ++$i) { - $content = $this->tokens[$i]->getContent(); - if (substr_count($content, "\n") < 1) { - continue; - } - - $pos = strrpos($content, "\n"); - if ($pos + 2 <= \strlen($content)) { // preserve indenting where possible - $newContent = $ending.substr($content, $pos + 1); - } else { - $newContent = $ending; - } - - $this->tokens[$i] = new Token([T_WHITESPACE, $newContent]); - } - } - - /** - * @param int $startIndex - * @param int $endIndex - * - * @return bool - */ - private function containsLinebreak($startIndex, $endIndex) - { - for ($i = $endIndex; $i > $startIndex; --$i) { - if (Preg::match('/\R/', $this->tokens[$i]->getContent())) { - return true; - } - } - - return false; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraConsecutiveBlankLinesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraConsecutiveBlankLinesFixer.php deleted file mode 100644 index 07be319..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraConsecutiveBlankLinesFixer.php +++ /dev/null @@ -1,73 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - * - * @deprecated in 2.10, proxy to NoExtraBlankLinesFixer - */ -final class NoExtraConsecutiveBlankLinesFixer extends AbstractProxyFixer implements ConfigurationDefinitionFixerInterface, DeprecatedFixerInterface, WhitespacesAwareFixerInterface -{ - private $fixer; - - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return $this->getFixer()->getDefinition(); - } - - public function configure(array $configuration = null) - { - $this->getFixer()->configure($configuration); - $this->configuration = $configuration; - } - - public function getConfigurationDefinition() - { - return $this->getFixer()->getConfigurationDefinition(); - } - - /** - * {@inheritdoc} - */ - public function getSuccessorsNames() - { - return array_keys($this->proxyFixers); - } - - /** - * {@inheritdoc} - */ - protected function createProxyFixers() - { - return [$this->getFixer()]; - } - - private function getFixer() - { - if (null === $this->fixer) { - $this->fixer = new NoExtraBlankLinesFixer(); - } - - return $this->fixer; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php deleted file mode 100644 index 1ffc2ed..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php +++ /dev/null @@ -1,107 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurationDefinitionFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverRootless; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Javier Spagnoletti - */ -final class NoSpacesAroundOffsetFixer extends AbstractFixer implements ConfigurationDefinitionFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There MUST NOT be spaces around offset braces.', - [ - new CodeSample(" ['inside']]), - new CodeSample(" ['outside']]), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens) - { - return $tokens->isAnyTokenKindsFound(['[', CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->equalsAny(['[', [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN]])) { - continue; - } - - if (\in_array('inside', $this->configuration['positions'], true)) { - if ($token->equals('[')) { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index); - } else { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE, $index); - } - - // remove space after opening `[` or `{` - if ($tokens[$index + 1]->isWhitespace(" \t")) { - $tokens->clearAt($index + 1); - } - - // remove space before closing `]` or `}` - if ($tokens[$endIndex - 1]->isWhitespace(" \t")) { - $tokens->clearAt($endIndex - 1); - } - } - - if (\in_array('outside', $this->configuration['positions'], true)) { - $prevNonWhitespaceIndex = $tokens->getPrevNonWhitespace($index); - if ($tokens[$prevNonWhitespaceIndex]->isComment()) { - continue; - } - - $tokens->removeLeadingWhitespace($index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition() - { - $values = ['inside', 'outside']; - - return new FixerConfigurationResolverRootless('positions', [ - (new FixerOptionBuilder('positions', 'Whether spacing should be fixed inside and/or outside the offset braces.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset($values)]) - ->setDefault($values) - ->getOption(), - ], $this->getName()); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesInsideParenthesisFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesInsideParenthesisFixer.php deleted file mode 100644 index 25c8d09..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesInsideParenthesisFixer.php +++ /dev/null @@ -1,110 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶4.3, ¶4.6, ¶5. - * - * @author Marc Aubé - * @author Dariusz Rumiński - */ -final class NoSpacesInsideParenthesisFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'There MUST NOT be a space after the opening parenthesis. There MUST NOT be a space before the closing parenthesis.', - [ - new CodeSample("isTokenKindFound('('); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens) - { - foreach ($tokens as $index => $token) { - if (!$token->equals('(')) { - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - // ignore parenthesis for T_ARRAY - if (null !== $prevIndex && $tokens[$prevIndex]->isGivenKind(T_ARRAY)) { - continue; - } - - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - // remove space after opening `(` - if (!$tokens[$tokens->getNextNonWhitespace($index)]->isComment()) { - $this->removeSpaceAroundToken($tokens, $index + 1); - } - - // remove space before closing `)` if it is not `list($a, $b, )` case - if (!$tokens[$tokens->getPrevMeaningfulToken($endIndex)]->equals(',')) { - $this->removeSpaceAroundToken($tokens, $endIndex - 1); - } - } - } - - /** - * Remove spaces from token at a given index. - * - * @param int $index - */ - private function removeSpaceAroundToken(Tokens $tokens, $index) - { - $token = $tokens[$index]; - - if ($token->isWhitespace() && false === strpos($token->getContent(), "\n")) { - $tokens->clearAt($index); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php deleted file mode 100644 index 06c79eb..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php +++ /dev/null @@ -1,114 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶2.3. - * - * Don't add trailing spaces at the end of non-blank lines. - * - * @author Fabien Potencier - * @author Dariusz Rumiński - */ -final class NoTrailingWhitespaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Remove trailing whitespace at the end of non-blank lines.', - [new CodeSample("= 0; --$index) { - $token = $tokens[$index]; - if ( - $token->isGivenKind(T_OPEN_TAG) - && $tokens->offsetExists($index + 1) - && $tokens[$index + 1]->isWhitespace() - && 1 === Preg::match('/(.*)\h$/', $token->getContent(), $openTagMatches) - && 1 === Preg::match('/^(\R)(.*)$/s', $tokens[$index + 1]->getContent(), $whitespaceMatches) - ) { - $tokens[$index] = new Token([T_OPEN_TAG, $openTagMatches[1].$whitespaceMatches[1]]); - if ('' === $whitespaceMatches[2]) { - $tokens->clearAt($index + 1); - } else { - $tokens[$index + 1] = new Token([T_WHITESPACE, $whitespaceMatches[2]]); - } - - continue; - } - - if (!$token->isWhitespace()) { - continue; - } - - $lines = Preg::split('/(\\R+)/', $token->getContent(), -1, PREG_SPLIT_DELIM_CAPTURE); - $linesSize = \count($lines); - - // fix only multiline whitespaces or singleline whitespaces at the end of file - if ($linesSize > 1 || !isset($tokens[$index + 1])) { - if (!$tokens[$index - 1]->isGivenKind(T_OPEN_TAG) || 1 !== Preg::match('/(.*)\R$/', $tokens[$index - 1]->getContent())) { - $lines[0] = rtrim($lines[0], " \t"); - } - - for ($i = 1; $i < $linesSize; ++$i) { - $trimmedLine = rtrim($lines[$i], " \t"); - if ('' !== $trimmedLine) { - $lines[$i] = $trimmedLine; - } - } - - $content = implode('', $lines); - if ('' !== $content) { - $tokens[$index] = new Token([$token->getId(), $content]); - } else { - $tokens->clearAt($index); - } - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php deleted file mode 100644 index 139afa2..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php +++ /dev/null @@ -1,103 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class NoWhitespaceInBlankLineFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'Remove trailing whitespace at the end of blank lines.', - [new CodeSample("isWhitespace()) { - $this->fixWhitespaceToken($tokens, $i); - } - } - } - - /** - * @param int $index - */ - private function fixWhitespaceToken(Tokens $tokens, $index) - { - $content = $tokens[$index]->getContent(); - $lines = Preg::split("/(\r\n|\n)/", $content); - $lineCount = \count($lines); - - if ( - // fix T_WHITESPACES with at least 3 lines (eg `\n \n`) - $lineCount > 2 - // and T_WHITESPACES with at least 2 lines at the end of file or after open tag with linebreak - || ($lineCount > 0 && (!isset($tokens[$index + 1]) || $tokens[$index - 1]->isGivenKind(T_OPEN_TAG))) - ) { - $lMax = isset($tokens[$index + 1]) ? $lineCount - 1 : $lineCount; - - $lStart = 1; - if ($tokens[$index - 1]->isGivenKind(T_OPEN_TAG) && "\n" === substr($tokens[$index - 1]->getContent(), -1)) { - $lStart = 0; - } - - for ($l = $lStart; $l < $lMax; ++$l) { - $lines[$l] = Preg::replace('/^\h+$/', '', $lines[$l]); - } - $content = implode($this->whitespacesConfig->getLineEnding(), $lines); - if ('' !== $content) { - $tokens[$index] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($index); - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SingleBlankLineAtEofFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SingleBlankLineAtEofFixer.php deleted file mode 100644 index a8a59dd..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SingleBlankLineAtEofFixer.php +++ /dev/null @@ -1,73 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * A file must always end with a line endings character. - * - * Fixer for rules defined in PSR2 ¶2.2. - * - * @author Fabien Potencier - * @author Dariusz Rumiński - */ -final class SingleBlankLineAtEofFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition() - { - return new FixerDefinition( - 'A PHP file without end tag must always end with a single empty line feed.', - [ - new CodeSample("count(); - - if ($count && !$tokens[$count - 1]->isGivenKind([T_INLINE_HTML, T_CLOSE_TAG, T_OPEN_TAG])) { - $tokens->ensureWhitespaceAtIndex($count - 1, 1, $this->whitespacesConfig->getLineEnding()); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/WhitespacesAwareFixerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/WhitespacesAwareFixerInterface.php deleted file mode 100644 index 7f1c22c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/WhitespacesAwareFixerInterface.php +++ /dev/null @@ -1,23 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Fixer; - -use PhpCsFixer\WhitespacesFixerConfig; - -/** - * @author Dariusz Rumiński - */ -interface WhitespacesAwareFixerInterface extends FixerInterface -{ - public function setWhitespacesConfig(WhitespacesFixerConfig $config); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php deleted file mode 100644 index 38bc92e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php +++ /dev/null @@ -1,103 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -/** - * @author ntzm - * - * @internal - * - * @todo 3.0 Drop this class - */ -final class AliasedFixerOption implements FixerOptionInterface -{ - /** - * @var FixerOptionInterface - */ - private $fixerOption; - - /** - * @var string - */ - private $alias; - - public function __construct(FixerOptionInterface $fixerOption, $alias) - { - $this->fixerOption = $fixerOption; - $this->alias = $alias; - } - - /** - * @return string - */ - public function getAlias() - { - return $this->alias; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->fixerOption->getName(); - } - - /** - * {@inheritdoc} - */ - public function getDescription() - { - return $this->fixerOption->getDescription(); - } - - /** - * {@inheritdoc} - */ - public function hasDefault() - { - return $this->fixerOption->hasDefault(); - } - - /** - * {@inheritdoc} - */ - public function getDefault() - { - return $this->fixerOption->getDefault(); - } - - /** - * {@inheritdoc} - */ - public function getAllowedTypes() - { - return $this->fixerOption->getAllowedTypes(); - } - - /** - * {@inheritdoc} - */ - public function getAllowedValues() - { - return $this->fixerOption->getAllowedValues(); - } - - /** - * {@inheritdoc} - */ - public function getNormalizer() - { - return $this->fixerOption->getNormalizer(); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php deleted file mode 100644 index 61e814c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php +++ /dev/null @@ -1,94 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -/** - * @author ntzm - * - * @internal - * - * @todo 3.0 Drop this class - */ -final class AliasedFixerOptionBuilder -{ - /** - * @var FixerOptionBuilder - */ - private $optionBuilder; - - /** - * @var string - */ - private $alias; - - public function __construct(FixerOptionBuilder $optionBuilder, $alias) - { - $this->optionBuilder = $optionBuilder; - $this->alias = $alias; - } - - /** - * @param mixed $default - * - * @return $this - */ - public function setDefault($default) - { - $this->optionBuilder->setDefault($default); - - return $this; - } - - /** - * @param string[] $allowedTypes - * - * @return $this - */ - public function setAllowedTypes(array $allowedTypes) - { - $this->optionBuilder->setAllowedTypes($allowedTypes); - - return $this; - } - - /** - * @return $this - */ - public function setAllowedValues(array $allowedValues) - { - $this->optionBuilder->setAllowedValues($allowedValues); - - return $this; - } - - /** - * @return $this - */ - public function setNormalizer(\Closure $normalizer) - { - $this->optionBuilder->setNormalizer($normalizer); - - return $this; - } - - /** - * @return AliasedFixerOption - */ - public function getOption() - { - return new AliasedFixerOption( - $this->optionBuilder->getOption(), - $this->alias - ); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php deleted file mode 100644 index bc4410b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php +++ /dev/null @@ -1,53 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -/** - * @internal - */ -final class AllowedValueSubset -{ - private $allowedValues; - - public function __construct(array $allowedValues) - { - $this->allowedValues = $allowedValues; - } - - /** - * Checks whether the given values are a subset of the allowed ones. - * - * @param mixed $values the value to validate - * - * @return bool - */ - public function __invoke($values) - { - if (!\is_array($values)) { - return false; - } - - foreach ($values as $value) { - if (!\in_array($value, $this->allowedValues, true)) { - return false; - } - } - - return true; - } - - public function getAllowedValues() - { - return $this->allowedValues; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php deleted file mode 100644 index f498ea3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php +++ /dev/null @@ -1,99 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -final class DeprecatedFixerOption implements DeprecatedFixerOptionInterface -{ - /** - * @var FixerOptionInterface - */ - private $option; - - /** - * @var string - */ - private $deprecationMessage; - - /** - * @param string $deprecationMessage - */ - public function __construct(FixerOptionInterface $option, $deprecationMessage) - { - $this->option = $option; - $this->deprecationMessage = $deprecationMessage; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->option->getName(); - } - - /** - * {@inheritdoc} - */ - public function getDescription() - { - return $this->option->getDescription(); - } - - /** - * {@inheritdoc} - */ - public function hasDefault() - { - return $this->option->hasDefault(); - } - - /** - * {@inheritdoc} - */ - public function getDefault() - { - return $this->option->getDefault(); - } - - /** - * {@inheritdoc} - */ - public function getAllowedTypes() - { - return $this->option->getAllowedTypes(); - } - - /** - * {@inheritdoc} - */ - public function getAllowedValues() - { - return $this->option->getAllowedValues(); - } - - /** - * {@inheritdoc} - */ - public function getNormalizer() - { - return $this->option->getNormalizer(); - } - - /** - * @return string - */ - public function getDeprecationMessage() - { - return $this->deprecationMessage; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOptionInterface.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOptionInterface.php deleted file mode 100644 index fc84798..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOptionInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -interface DeprecatedFixerOptionInterface extends FixerOptionInterface -{ - /** - * @return string - */ - public function getDeprecationMessage(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php deleted file mode 100644 index 29efdbd..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php +++ /dev/null @@ -1,128 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; -use Symfony\Component\OptionsResolver\OptionsResolver; - -final class FixerConfigurationResolver implements FixerConfigurationResolverInterface -{ - /** - * @var FixerOptionInterface[] - */ - private $options = []; - - /** - * @var string[] - */ - private $registeredNames = []; - - /** - * @param iterable $options - */ - public function __construct($options) - { - foreach ($options as $option) { - $this->addOption($option); - } - - if (empty($this->registeredNames)) { - throw new \LogicException('Options cannot be empty.'); - } - } - - /** - * {@inheritdoc} - */ - public function getOptions() - { - return $this->options; - } - - /** - * {@inheritdoc} - */ - public function resolve(array $options) - { - $resolver = new OptionsResolver(); - - foreach ($this->options as $option) { - $name = $option->getName(); - - if ($option instanceof AliasedFixerOption) { - $alias = $option->getAlias(); - - if (\array_key_exists($alias, $options)) { - if (\array_key_exists($name, $options)) { - throw new InvalidOptionsException(sprintf('Aliased option %s/%s is passed multiple times.', $name, $alias)); - } - - @trigger_error(sprintf('Option "%s" is deprecated, use "%s" instead.', $alias, $name), E_USER_DEPRECATED); - - $options[$name] = $options[$alias]; - unset($options[$alias]); - } - } - - if ($option->hasDefault()) { - $resolver->setDefault($name, $option->getDefault()); - } else { - $resolver->setRequired($name); - } - - $allowedValues = $option->getAllowedValues(); - if (null !== $allowedValues) { - foreach ($allowedValues as &$allowedValue) { - if (\is_object($allowedValue) && \is_callable($allowedValue)) { - $allowedValue = static function ($values) use ($allowedValue) { - return $allowedValue($values); - }; - } - } - - $resolver->setAllowedValues($name, $allowedValues); - } - - $allowedTypes = $option->getAllowedTypes(); - if (null !== $allowedTypes) { - $resolver->setAllowedTypes($name, $allowedTypes); - } - - $normalizer = $option->getNormalizer(); - if (null !== $normalizer) { - $resolver->setNormalizer($name, $normalizer); - } - } - - return $resolver->resolve($options); - } - - /** - * @throws \LogicException when the option is already defined - * - * @return $this - */ - private function addOption(FixerOptionInterface $option) - { - $name = $option->getName(); - - if (\in_array($name, $this->registeredNames, true)) { - throw new \LogicException(sprintf('The "%s" option is defined multiple times.', $name)); - } - - $this->options[] = $option; - $this->registeredNames[] = $name; - - return $this; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverInterface.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverInterface.php deleted file mode 100644 index 099f5f1..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverInterface.php +++ /dev/null @@ -1,28 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -interface FixerConfigurationResolverInterface -{ - /** - * @return FixerOptionInterface[] - */ - public function getOptions(); - - /** - * @param array $configuration - * - * @return array - */ - public function resolve(array $configuration); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverRootless.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverRootless.php deleted file mode 100644 index 32efd0b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverRootless.php +++ /dev/null @@ -1,99 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -/** - * @internal - * - * @deprecated will be removed in 3.0 - */ -final class FixerConfigurationResolverRootless implements FixerConfigurationResolverInterface -{ - /** - * @var FixerConfigurationResolverInterface - */ - private $resolver; - - /** - * @var string - */ - private $root; - - /** - * @var string - */ - private $fixerName; - - /** - * @param string $root - * @param iterable $options - * @param string $fixerName - */ - public function __construct($root, $options, $fixerName) - { - $this->resolver = new FixerConfigurationResolver($options); - $this->fixerName = $fixerName; - - $names = array_map( - static function (FixerOptionInterface $option) { - return $option->getName(); - }, - $this->resolver->getOptions() - ); - - if (!\in_array($root, $names, true)) { - throw new \LogicException(sprintf('The "%s" option is not defined.', $root)); - } - - $this->root = $root; - } - - /** - * {@inheritdoc} - */ - public function getOptions() - { - return $this->resolver->getOptions(); - } - - /** - * {@inheritdoc} - */ - public function resolve(array $options) - { - if (!empty($options) && !\array_key_exists($this->root, $options)) { - $names = array_map( - static function (FixerOptionInterface $option) { - return $option->getName(); - }, - $this->resolver->getOptions() - ); - - $passedNames = array_keys($options); - - if (!empty(array_diff($passedNames, $names))) { - $message = "Passing \"{$this->root}\" at the root of the configuration for rule \"{$this->fixerName}\" is deprecated and will not be supported in 3.0, use \"{$this->root}\" => array(...) option instead."; - - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - throw new \RuntimeException("{$message}. This check was performed as `PHP_CS_FIXER_FUTURE_MODE` env var is set."); - } - - @trigger_error($message, E_USER_DEPRECATED); - - $options = [$this->root => $options]; - } - } - - return $this->resolver->resolve($options); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php deleted file mode 100644 index 55ada57..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php +++ /dev/null @@ -1,172 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -final class FixerOption implements FixerOptionInterface -{ - /** - * @var string - */ - private $name; - - /** - * @var string - */ - private $description; - - /** - * @var mixed - */ - private $default; - - /** - * @var bool - */ - private $isRequired; - - /** - * @var null|string[] - */ - private $allowedTypes; - - /** - * @var null|array - */ - private $allowedValues; - - /** - * @var null|\Closure - */ - private $normalizer; - - /** - * @param string $name - * @param string $description - * @param bool $isRequired - * @param mixed $default - * @param null|string[] $allowedTypes - */ - public function __construct( - $name, - $description, - $isRequired = true, - $default = null, - array $allowedTypes = null, - array $allowedValues = null, - \Closure $normalizer = null - ) { - if ($isRequired && null !== $default) { - throw new \LogicException('Required options cannot have a default value.'); - } - - if (null !== $allowedValues) { - foreach ($allowedValues as &$allowedValue) { - if ($allowedValue instanceof \Closure) { - $allowedValue = $this->unbind($allowedValue); - } - } - } - - $this->name = $name; - $this->description = $description; - $this->isRequired = $isRequired; - $this->default = $default; - $this->allowedTypes = $allowedTypes; - $this->allowedValues = $allowedValues; - if (null !== $normalizer) { - $this->normalizer = $this->unbind($normalizer); - } - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - /** - * {@inheritdoc} - */ - public function getDescription() - { - return $this->description; - } - - /** - * {@inheritdoc} - */ - public function hasDefault() - { - return !$this->isRequired; - } - - /** - * {@inheritdoc} - */ - public function getDefault() - { - if (!$this->hasDefault()) { - throw new \LogicException('No default value defined.'); - } - - return $this->default; - } - - /** - * {@inheritdoc} - */ - public function getAllowedTypes() - { - return $this->allowedTypes; - } - - /** - * {@inheritdoc} - */ - public function getAllowedValues() - { - return $this->allowedValues; - } - - /** - * {@inheritdoc} - */ - public function getNormalizer() - { - return $this->normalizer; - } - - /** - * Unbinds the given closure to avoid memory leaks. - * - * The closures provided to this class were probably defined in a fixer - * class and thus bound to it by default. The configuration will then be - * stored in {@see AbstractFixer::$configurationDefinition}, leading to the - * following cyclic reference: - * - * fixer -> configuration definition -> options -> closures -> fixer - * - * This cyclic reference prevent the garbage collector to free memory as - * all elements are still referenced. - * - * See {@see https://bugs.php.net/bug.php?id=69639 Bug #69639} for details. - * - * @return \Closure - */ - private function unbind(\Closure $closure) - { - return $closure->bindTo(null); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php deleted file mode 100644 index d839574..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php +++ /dev/null @@ -1,145 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -final class FixerOptionBuilder -{ - /** - * @var string - */ - private $name; - - /** - * @var string - */ - private $description; - - /** - * @var mixed - */ - private $default; - - /** - * @var bool - */ - private $isRequired = true; - - /** - * @var null|string[] - */ - private $allowedTypes; - - /** - * @var null|array - */ - private $allowedValues; - - /** - * @var null|\Closure - */ - private $normalizer; - - /** - * @var null|string - */ - private $deprecationMessage; - - /** - * @param string $name - * @param string $description - */ - public function __construct($name, $description) - { - $this->name = $name; - $this->description = $description; - } - - /** - * @param mixed $default - * - * @return $this - */ - public function setDefault($default) - { - $this->default = $default; - $this->isRequired = false; - - return $this; - } - - /** - * @param string[] $allowedTypes - * - * @return $this - */ - public function setAllowedTypes(array $allowedTypes) - { - $this->allowedTypes = $allowedTypes; - - return $this; - } - - /** - * @return $this - */ - public function setAllowedValues(array $allowedValues) - { - $this->allowedValues = $allowedValues; - - return $this; - } - - /** - * @return $this - */ - public function setNormalizer(\Closure $normalizer) - { - $this->normalizer = $normalizer; - - return $this; - } - - /** - * @param null|string $deprecationMessage - * - * @return $this - */ - public function setDeprecationMessage($deprecationMessage) - { - $this->deprecationMessage = $deprecationMessage; - - return $this; - } - - /** - * @return FixerOptionInterface - */ - public function getOption() - { - $option = new FixerOption( - $this->name, - $this->description, - $this->isRequired, - $this->default, - $this->allowedTypes, - $this->allowedValues, - $this->normalizer - ); - - if (null !== $this->deprecationMessage) { - $option = new DeprecatedFixerOption($option, $this->deprecationMessage); - } - - return $option; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php deleted file mode 100644 index c682db6..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php +++ /dev/null @@ -1,53 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -interface FixerOptionInterface -{ - /** - * @return string - */ - public function getName(); - - /** - * @return string - */ - public function getDescription(); - - /** - * @return bool - */ - public function hasDefault(); - - /** - * @throws \LogicException when no default value is defined - * - * @return mixed - */ - public function getDefault(); - - /** - * @return null|string[] - */ - public function getAllowedTypes(); - - /** - * @return null|array - */ - public function getAllowedValues(); - - /** - * @return null|\Closure - */ - public function getNormalizer(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/InvalidOptionsForEnvException.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/InvalidOptionsForEnvException.php deleted file mode 100644 index 755d0b0..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/InvalidOptionsForEnvException.php +++ /dev/null @@ -1,24 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerConfiguration; - -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class InvalidOptionsForEnvException extends InvalidOptionsException -{ -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php deleted file mode 100644 index 4e7dab7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php +++ /dev/null @@ -1,54 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerDefinition; - -/** - * @author Dariusz Rumiński - */ -final class CodeSample implements CodeSampleInterface -{ - /** - * @var string - */ - private $code; - - /** - * @var null|array - */ - private $configuration; - - /** - * @param string $code - */ - public function __construct($code, array $configuration = null) - { - $this->code = $code; - $this->configuration = $configuration; - } - - /** - * @return string - */ - public function getCode() - { - return $this->code; - } - - /** - * @return null|array - */ - public function getConfiguration() - { - return $this->configuration; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSampleInterface.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSampleInterface.php deleted file mode 100644 index 877214a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSampleInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerDefinition; - -/** - * @author Dariusz Rumiński - */ -interface CodeSampleInterface -{ - /** - * @return string - */ - public function getCode(); - - /** - * @return null|array - */ - public function getConfiguration(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php deleted file mode 100644 index 3f3c1e8..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php +++ /dev/null @@ -1,67 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerDefinition; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FileSpecificCodeSample implements FileSpecificCodeSampleInterface -{ - /** - * @var CodeSampleInterface - */ - private $codeSample; - - /** - * @var \SplFileInfo - */ - private $splFileInfo; - - /** - * @param string $code - */ - public function __construct( - $code, - \SplFileInfo $splFileInfo, - array $configuration = null - ) { - $this->codeSample = new CodeSample($code, $configuration); - $this->splFileInfo = $splFileInfo; - } - - /** - * {@inheritdoc} - */ - public function getCode() - { - return $this->codeSample->getCode(); - } - - /** - * {@inheritdoc} - */ - public function getConfiguration() - { - return $this->codeSample->getConfiguration(); - } - - /** - * {@inheritdoc} - */ - public function getSplFileInfo() - { - return $this->splFileInfo; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSampleInterface.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSampleInterface.php deleted file mode 100644 index b069e30..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSampleInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerDefinition; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -interface FileSpecificCodeSampleInterface extends CodeSampleInterface -{ - /** - * @return \SplFileInfo - */ - public function getSplFileInfo(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php deleted file mode 100644 index 3a948ce..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php +++ /dev/null @@ -1,93 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerDefinition; - -/** - * @author Dariusz Rumiński - */ -final class FixerDefinition implements FixerDefinitionInterface -{ - private $riskyDescription; - private $configurationDescription; - private $defaultConfiguration; - private $codeSamples; - private $summary; - private $description; - - /** - * @param string $summary - * @param CodeSampleInterface[] $codeSamples array of samples, where single sample is [code, configuration] - * @param null|string $description - * @param null|string $configurationDescription null for non-configurable fixer - * @param null|array $defaultConfiguration null for non-configurable fixer - * @param null|string $riskyDescription null for non-risky fixer - */ - public function __construct( - $summary, - array $codeSamples, - $description = null, - $configurationDescription = null, - array $defaultConfiguration = null, - $riskyDescription = null - ) { - if (6 === \func_num_args()) { - @trigger_error('Arguments #5 and #6 of FixerDefinition::__construct() are deprecated and will be removed in 3.0, use argument #4 instead.', E_USER_DEPRECATED); - } elseif (5 === \func_num_args()) { - @trigger_error('Argument #5 of FixerDefinition::__construct() is deprecated and will be removed in 3.0.', E_USER_DEPRECATED); - } else { - $riskyDescription = $configurationDescription; - $configurationDescription = null; - } - - $this->summary = $summary; - $this->codeSamples = $codeSamples; - $this->description = $description; - $this->configurationDescription = $configurationDescription; - $this->defaultConfiguration = $defaultConfiguration; - $this->riskyDescription = $riskyDescription; - } - - public function getSummary() - { - return $this->summary; - } - - public function getDescription() - { - return $this->description; - } - - public function getConfigurationDescription() - { - @trigger_error(sprintf('%s is deprecated and will be removed in 3.0.', __METHOD__), E_USER_DEPRECATED); - - return $this->configurationDescription; - } - - public function getDefaultConfiguration() - { - @trigger_error(sprintf('%s is deprecated and will be removed in 3.0.', __METHOD__), E_USER_DEPRECATED); - - return $this->defaultConfiguration; - } - - public function getRiskyDescription() - { - return $this->riskyDescription; - } - - public function getCodeSamples() - { - return $this->codeSamples; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinitionInterface.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinitionInterface.php deleted file mode 100644 index 1b1e93e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinitionInterface.php +++ /dev/null @@ -1,55 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerDefinition; - -/** - * @author Dariusz Rumiński - */ -interface FixerDefinitionInterface -{ - /** - * @return string - */ - public function getSummary(); - - /** - * @return null|string - */ - public function getDescription(); - - /** - * @return null|string null for non-configurable fixer - * - * @deprecated will be removed in 3.0 - */ - public function getConfigurationDescription(); - - /** - * @return null|array null for non-configurable fixer - * - * @deprecated will be removed in 3.0 - */ - public function getDefaultConfiguration(); - - /** - * @return null|string null for non-risky fixer - */ - public function getRiskyDescription(); - - /** - * Array of samples, where single sample is [code, configuration]. - * - * @return CodeSampleInterface[] - */ - public function getCodeSamples(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php deleted file mode 100644 index 01080e7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php +++ /dev/null @@ -1,65 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerDefinition; - -/** - * @author Andreas Möller - */ -final class VersionSpecificCodeSample implements VersionSpecificCodeSampleInterface -{ - /** - * @var CodeSampleInterface - */ - private $codeSample; - - /** - * @var VersionSpecificationInterface - */ - private $versionSpecification; - - /** - * @param string $code - */ - public function __construct( - $code, - VersionSpecificationInterface $versionSpecification, - array $configuration = null - ) { - $this->codeSample = new CodeSample($code, $configuration); - $this->versionSpecification = $versionSpecification; - } - - /** - * {@inheritdoc} - */ - public function getCode() - { - return $this->codeSample->getCode(); - } - - /** - * {@inheritdoc} - */ - public function getConfiguration() - { - return $this->codeSample->getConfiguration(); - } - - /** - * {@inheritdoc} - */ - public function isSuitableFor($version) - { - return $this->versionSpecification->isSatisfiedBy($version); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSampleInterface.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSampleInterface.php deleted file mode 100644 index 9612770..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSampleInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerDefinition; - -/** - * @author Andreas Moeller - */ -interface VersionSpecificCodeSampleInterface extends CodeSampleInterface -{ - /** - * @param int $version - * - * @return bool - */ - public function isSuitableFor($version); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php deleted file mode 100644 index d1459d1..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php +++ /dev/null @@ -1,75 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerDefinition; - -/** - * @author Andreas Möller - */ -final class VersionSpecification implements VersionSpecificationInterface -{ - /** - * @var null|int - */ - private $minimum; - - /** - * @var null|int - */ - private $maximum; - - /** - * @param null|int $minimum - * @param null|int $maximum - * - * @throws \InvalidArgumentException - */ - public function __construct($minimum = null, $maximum = null) - { - if (null === $minimum && null === $maximum) { - throw new \InvalidArgumentException('Minimum or maximum need to be specified.'); - } - - if (null !== $minimum && (!\is_int($minimum) || 1 > $minimum)) { - throw new \InvalidArgumentException('Minimum needs to be either null or an integer greater than 0.'); - } - - if (null !== $maximum) { - if (!\is_int($maximum) || 1 > $maximum) { - throw new \InvalidArgumentException('Maximum needs to be either null or an integer greater than 0.'); - } - - if (null !== $minimum && $maximum < $minimum) { - throw new \InvalidArgumentException('Maximum should not be lower than the minimum.'); - } - } - - $this->minimum = $minimum; - $this->maximum = $maximum; - } - - /** - * {@inheritdoc} - */ - public function isSatisfiedBy($version) - { - if (null !== $this->minimum && $version < $this->minimum) { - return false; - } - - if (null !== $this->maximum && $version > $this->maximum) { - return false; - } - - return true; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificationInterface.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificationInterface.php deleted file mode 100644 index 36ae354..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificationInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\FixerDefinition; - -/** - * @author Andreas Möller - */ -interface VersionSpecificationInterface -{ - /** - * @param int $version - * - * @return bool - */ - public function isSatisfiedBy($version); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php b/vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php deleted file mode 100644 index da0605a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php +++ /dev/null @@ -1,254 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use Symfony\Component\Finder\Finder as SymfonyFinder; -use Symfony\Component\Finder\SplFileInfo; - -/** - * Class provides a way to create a group of fixers. - * - * Fixers may be registered (made the factory aware of them) by - * registering a custom fixer and default, built in fixers. - * Then, one can attach Config instance to fixer instances. - * - * Finally factory creates a ready to use group of fixers. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class FixerFactory -{ - /** - * @var FixerNameValidator - */ - private $nameValidator; - - /** - * @var FixerInterface[] - */ - private $fixers = []; - - /** - * @var FixerInterface[] Associative array of fixers with names as keys - */ - private $fixersByName = []; - - public function __construct() - { - $this->nameValidator = new FixerNameValidator(); - } - - /** - * Create instance. - * - * @return FixerFactory - */ - public static function create() - { - return new self(); - } - - public function setWhitespacesConfig(WhitespacesFixerConfig $config) - { - foreach ($this->fixers as $fixer) { - if ($fixer instanceof WhitespacesAwareFixerInterface) { - $fixer->setWhitespacesConfig($config); - } - } - - return $this; - } - - /** - * @return FixerInterface[] - */ - public function getFixers() - { - $this->fixers = Utils::sortFixers($this->fixers); - - return $this->fixers; - } - - /** - * @return $this - */ - public function registerBuiltInFixers() - { - static $builtInFixers = null; - - if (null === $builtInFixers) { - $builtInFixers = []; - - /** @var SplFileInfo $file */ - foreach (SymfonyFinder::create()->files()->in(__DIR__.'/Fixer') as $file) { - $relativeNamespace = $file->getRelativePath(); - $fixerClass = 'PhpCsFixer\\Fixer\\'.($relativeNamespace ? $relativeNamespace.'\\' : '').$file->getBasename('.php'); - if ('Fixer' === substr($fixerClass, -5)) { - $builtInFixers[] = $fixerClass; - } - } - } - - foreach ($builtInFixers as $class) { - $this->registerFixer(new $class(), false); - } - - return $this; - } - - /** - * @param FixerInterface[] $fixers - * - * @return $this - */ - public function registerCustomFixers(array $fixers) - { - foreach ($fixers as $fixer) { - $this->registerFixer($fixer, true); - } - - return $this; - } - - /** - * @param bool $isCustom - * - * @return $this - */ - public function registerFixer(FixerInterface $fixer, $isCustom) - { - $name = $fixer->getName(); - - if (isset($this->fixersByName[$name])) { - throw new \UnexpectedValueException(sprintf('Fixer named "%s" is already registered.', $name)); - } - - if (!$this->nameValidator->isValid($name, $isCustom)) { - throw new \UnexpectedValueException(sprintf('Fixer named "%s" has invalid name.', $name)); - } - - $this->fixers[] = $fixer; - $this->fixersByName[$name] = $fixer; - - return $this; - } - - /** - * Apply RuleSet on fixers to filter out all unwanted fixers. - * - * @return $this - */ - public function useRuleSet(RuleSetInterface $ruleSet) - { - $fixers = []; - $fixersByName = []; - $fixerConflicts = []; - - $fixerNames = array_keys($ruleSet->getRules()); - foreach ($fixerNames as $name) { - if (!\array_key_exists($name, $this->fixersByName)) { - throw new \UnexpectedValueException(sprintf('Rule "%s" does not exist.', $name)); - } - - $fixer = $this->fixersByName[$name]; - - $config = $ruleSet->getRuleConfiguration($name); - if (null !== $config) { - if ($fixer instanceof ConfigurableFixerInterface) { - if (!\is_array($config) || !\count($config)) { - throw new InvalidFixerConfigurationException($fixer->getName(), 'Configuration must be an array and may not be empty.'); - } - - $fixer->configure($config); - } else { - throw new InvalidFixerConfigurationException($fixer->getName(), 'Is not configurable.'); - } - } - - $fixers[] = $fixer; - $fixersByName[$name] = $fixer; - - $conflicts = array_intersect($this->getFixersConflicts($fixer), $fixerNames); - if (\count($conflicts) > 0) { - $fixerConflicts[$name] = $conflicts; - } - } - - if (\count($fixerConflicts) > 0) { - throw new \UnexpectedValueException($this->generateConflictMessage($fixerConflicts)); - } - - $this->fixers = $fixers; - $this->fixersByName = $fixersByName; - - return $this; - } - - /** - * Check if fixer exists. - * - * @param string $name - * - * @return bool - */ - public function hasRule($name) - { - return isset($this->fixersByName[$name]); - } - - /** - * @return null|string[] - */ - private function getFixersConflicts(FixerInterface $fixer) - { - static $conflictMap = [ - 'no_blank_lines_before_namespace' => ['single_blank_line_before_namespace'], - ]; - - $fixerName = $fixer->getName(); - - return \array_key_exists($fixerName, $conflictMap) ? $conflictMap[$fixerName] : []; - } - - /** - * @param array $fixerConflicts - * - * @return string - */ - private function generateConflictMessage(array $fixerConflicts) - { - $message = 'Rule contains conflicting fixers:'; - $report = []; - foreach ($fixerConflicts as $fixer => $fixers) { - // filter mutual conflicts - $report[$fixer] = array_filter( - $fixers, - static function ($candidate) use ($report, $fixer) { - return !\array_key_exists($candidate, $report) || !\in_array($fixer, $report[$candidate], true); - } - ); - - if (\count($report[$fixer]) > 0) { - $message .= sprintf("\n- \"%s\" with \"%s\"", $fixer, implode('", "', $report[$fixer])); - } - } - - return $message; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php b/vendor/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php deleted file mode 100644 index 1fafb70..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php +++ /dev/null @@ -1,59 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Event\Event; - -/** - * Event that is fired when file was processed by Fixer. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class FixerFileProcessedEvent extends Event -{ - /** - * Event name. - */ - const NAME = 'fixer.file_processed'; - - const STATUS_UNKNOWN = 0; - const STATUS_INVALID = 1; - const STATUS_SKIPPED = 2; - const STATUS_NO_CHANGES = 3; - const STATUS_FIXED = 4; - const STATUS_EXCEPTION = 5; - const STATUS_LINT = 6; - - /** - * @var int - */ - private $status; - - /** - * @param int $status - */ - public function __construct($status) - { - $this->status = $status; - } - - /** - * @return int - */ - public function getStatus() - { - return $this->status; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerNameValidator.php b/vendor/friendsofphp/php-cs-fixer/src/FixerNameValidator.php deleted file mode 100644 index bfa4477..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerNameValidator.php +++ /dev/null @@ -1,36 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FixerNameValidator -{ - /** - * @param string $name - * @param bool $isCustom - * - * @return bool - */ - public function isValid($name, $isCustom) - { - if (!$isCustom) { - return 1 === Preg::match('/^[a-z][a-z0-9_]*$/', $name); - } - - return 1 === Preg::match('/^[A-Z][a-zA-Z0-9]*\/[a-z][a-z0-9_]*$/', $name); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php b/vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php deleted file mode 100644 index 4044cd7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php +++ /dev/null @@ -1,75 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Indicator; - -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class PhpUnitTestCaseIndicator -{ - public function isPhpUnitClass(Tokens $tokens, $index) - { - if (!$tokens[$index]->isGivenKind(T_CLASS)) { - throw new \LogicException(sprintf('No T_CLASS at given index %d, got %s.', $index, $tokens[$index]->getName())); - } - - $index = $tokens->getNextMeaningfulToken($index); - if (0 !== Preg::match('/(?:Test|TestCase)$/', $tokens[$index]->getContent())) { - return true; - } - - while (null !== $index = $tokens->getNextMeaningfulToken($index)) { - if ($tokens[$index]->equals('{')) { - break; // end of class signature - } - - if (!$tokens[$index]->isGivenKind(T_STRING)) { - continue; // not part of extends nor part of implements; so continue - } - - if (0 !== Preg::match('/(?:Test|TestCase)(?:Interface)?$/', $tokens[$index]->getContent())) { - return true; - } - } - - return false; - } - - /** - * @param bool $beginAtBottom whether we should start yielding PHPUnit classes from the bottom of the file - * - * @return \Generator array of [int start, int end] indexes from sooner to later classes - */ - public function findPhpUnitClasses(Tokens $tokens, $beginAtBottom = true) - { - $direction = $beginAtBottom ? -1 : 1; - - for ($index = 1 === $direction ? 0 : $tokens->count() - 1; $tokens->offsetExists($index); $index += $direction) { - if (!$tokens[$index]->isGivenKind(T_CLASS) || !$this->isPhpUnitClass($tokens, $index)) { - continue; - } - - $startIndex = $tokens->getNextTokenOfKind($index, ['{'], false); - - if (null === $startIndex) { - return; - } - - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $startIndex); - yield [$startIndex, $endIndex]; - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php deleted file mode 100644 index 9367cf0..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php +++ /dev/null @@ -1,72 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Linter; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class CachingLinter implements LinterInterface -{ - /** - * @var LinterInterface - */ - private $sublinter; - - /** - * @var array - */ - private $cache = []; - - public function __construct(LinterInterface $linter) - { - $this->sublinter = $linter; - } - - /** - * {@inheritdoc} - */ - public function isAsync() - { - return $this->sublinter->isAsync(); - } - - /** - * {@inheritdoc} - */ - public function lintFile($path) - { - $checksum = crc32(file_get_contents($path)); - - if (!isset($this->cache[$checksum])) { - $this->cache[$checksum] = $this->sublinter->lintFile($path); - } - - return $this->cache[$checksum]; - } - - /** - * {@inheritdoc} - */ - public function lintSource($source) - { - $checksum = crc32($source); - - if (!isset($this->cache[$checksum])) { - $this->cache[$checksum] = $this->sublinter->lintSource($source); - } - - return $this->cache[$checksum]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php deleted file mode 100644 index 199eacc..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php +++ /dev/null @@ -1,64 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Linter; - -/** - * Handle PHP code linting process. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class Linter implements LinterInterface -{ - /** - * @var LinterInterface - */ - private $sublinter; - - /** - * @param null|string $executable PHP executable, null for autodetection - */ - public function __construct($executable = null) - { - try { - $this->sublinter = new TokenizerLinter(); - } catch (UnavailableLinterException $e) { - $this->sublinter = new ProcessLinter($executable); - } - } - - /** - * {@inheritdoc} - */ - public function isAsync() - { - return $this->sublinter->isAsync(); - } - - /** - * {@inheritdoc} - */ - public function lintFile($path) - { - return $this->sublinter->lintFile($path); - } - - /** - * {@inheritdoc} - */ - public function lintSource($source) - { - return $this->sublinter->lintSource($source); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/LinterInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/LinterInterface.php deleted file mode 100644 index efaa2a4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/LinterInterface.php +++ /dev/null @@ -1,44 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Linter; - -/** - * Interface for PHP code linting process manager. - * - * @author Dariusz Rumiński - */ -interface LinterInterface -{ - /** - * @return bool - */ - public function isAsync(); - - /** - * Lint PHP file. - * - * @param string $path - * - * @return LintingResultInterface - */ - public function lintFile($path); - - /** - * Lint PHP code. - * - * @param string $source - * - * @return LintingResultInterface - */ - public function lintSource($source); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingException.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingException.php deleted file mode 100644 index 7ce51fe..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Linter; - -/** - * @author Dariusz Rumiński - */ -class LintingException extends \RuntimeException -{ -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingResultInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingResultInterface.php deleted file mode 100644 index 75f56a1..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingResultInterface.php +++ /dev/null @@ -1,24 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Linter; - -/** - * @author Dariusz Rumiński - */ -interface LintingResultInterface -{ - /** - * Check if linting process was successful and raise LintingException if not. - */ - public function check(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php deleted file mode 100644 index 05d820e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php +++ /dev/null @@ -1,149 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Linter; - -use PhpCsFixer\FileReader; -use PhpCsFixer\FileRemoval; -use Symfony\Component\Filesystem\Exception\IOException; -use Symfony\Component\Process\PhpExecutableFinder; -use Symfony\Component\Process\Process; - -/** - * Handle PHP code linting using separated process of `php -l _file_`. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ProcessLinter implements LinterInterface -{ - /** - * @var FileRemoval - */ - private $fileRemoval; - - /** - * @var ProcessLinterProcessBuilder - */ - private $processBuilder; - - /** - * Temporary file for code linting. - * - * @var null|string - */ - private $temporaryFile; - - /** - * @param null|string $executable PHP executable, null for autodetection - */ - public function __construct($executable = null) - { - if (null === $executable) { - $executableFinder = new PhpExecutableFinder(); - $executable = $executableFinder->find(false); - - if (false === $executable) { - throw new UnavailableLinterException('Cannot find PHP executable.'); - } - - if ('phpdbg' === \PHP_SAPI) { - if (false === strpos($executable, 'phpdbg')) { - throw new UnavailableLinterException('Automatically found PHP executable is non-standard phpdbg. Could not find proper PHP executable.'); - } - - // automatically found executable is `phpdbg`, let us try to fallback to regular `php` - $executable = str_replace('phpdbg', 'php', $executable); - - if (!is_executable($executable)) { - throw new UnavailableLinterException('Automatically found PHP executable is phpdbg. Could not find proper PHP executable.'); - } - } - } - - $this->processBuilder = new ProcessLinterProcessBuilder($executable); - - $this->fileRemoval = new FileRemoval(); - } - - public function __destruct() - { - if (null !== $this->temporaryFile) { - $this->fileRemoval->delete($this->temporaryFile); - } - } - - /** - * {@inheritdoc} - */ - public function isAsync() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function lintFile($path) - { - return new ProcessLintingResult($this->createProcessForFile($path)); - } - - /** - * {@inheritdoc} - */ - public function lintSource($source) - { - return new ProcessLintingResult($this->createProcessForSource($source)); - } - - /** - * @param string $path path to file - * - * @return Process - */ - private function createProcessForFile($path) - { - // in case php://stdin - if (!is_file($path)) { - return $this->createProcessForSource(FileReader::createSingleton()->read($path)); - } - - $process = $this->processBuilder->build($path); - $process->setTimeout(10); - $process->start(); - - return $process; - } - - /** - * Create process that lint PHP code. - * - * @param string $source code - * - * @return Process - */ - private function createProcessForSource($source) - { - if (null === $this->temporaryFile) { - $this->temporaryFile = tempnam('.', 'cs_fixer_tmp_'); - $this->fileRemoval->observe($this->temporaryFile); - } - - if (false === @file_put_contents($this->temporaryFile, $source)) { - throw new IOException(sprintf('Failed to write file "%s".', $this->temporaryFile), 0, null, $this->temporaryFile); - } - - return $this->createProcessForFile($this->temporaryFile); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php deleted file mode 100644 index 5cce9e1..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php +++ /dev/null @@ -1,50 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Linter; - -use Symfony\Component\Process\Process; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class ProcessLinterProcessBuilder -{ - /** - * @var string - */ - private $executable; - - /** - * @param string $executable PHP executable - */ - public function __construct($executable) - { - $this->executable = $executable; - } - - /** - * @param string $path - * - * @return Process - */ - public function build($path) - { - return new Process([ - $this->executable, - '-l', - $path, - ]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php deleted file mode 100644 index b04facc..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php +++ /dev/null @@ -1,59 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Linter; - -use Symfony\Component\Process\Process; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class ProcessLintingResult implements LintingResultInterface -{ - /** - * @var bool - */ - private $isSuccessful; - - /** - * @var Process - */ - private $process; - - public function __construct(Process $process) - { - $this->process = $process; - } - - /** - * {@inheritdoc} - */ - public function check() - { - if (!$this->isSuccessful()) { - // on some systems stderr is used, but on others, it's not - throw new LintingException($this->process->getErrorOutput() ?: $this->process->getOutput(), $this->process->getExitCode()); - } - } - - private function isSuccessful() - { - if (null === $this->isSuccessful) { - $this->process->wait(); - $this->isSuccessful = $this->process->isSuccessful(); - } - - return $this->isSuccessful; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php deleted file mode 100644 index 90d31d5..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php +++ /dev/null @@ -1,70 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Linter; - -use PhpCsFixer\FileReader; -use PhpCsFixer\Tokenizer\CodeHasher; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Handle PHP code linting. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class TokenizerLinter implements LinterInterface -{ - public function __construct() - { - if (false === \defined('TOKEN_PARSE')) { - throw new UnavailableLinterException('Cannot use tokenizer as linter.'); - } - } - - /** - * {@inheritdoc} - */ - public function isAsync() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function lintFile($path) - { - return $this->lintSource(FileReader::createSingleton()->read($path)); - } - - /** - * {@inheritdoc} - */ - public function lintSource($source) - { - try { - // To lint, we will parse the source into Tokens. - // During that process, it might throw ParseError. - // If it won't, cache of tokenized version of source will be kept, which is great for Runner. - // Yet, first we need to clear already existing cache to not hit it and lint the code indeed. - $codeHash = CodeHasher::calculateCodeHash($source); - Tokens::clearCache($codeHash); - Tokens::fromCode($source); - - return new TokenizerLintingResult(); - } catch (\ParseError $e) { - return new TokenizerLintingResult($e); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php deleted file mode 100644 index 67c3510..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php +++ /dev/null @@ -1,45 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Linter; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class TokenizerLintingResult implements LintingResultInterface -{ - /** - * @var null|\ParseError - */ - private $error; - - public function __construct(\ParseError $error = null) - { - $this->error = $error; - } - - /** - * {@inheritdoc} - */ - public function check() - { - if (null !== $this->error) { - throw new LintingException( - sprintf('PHP Parse error: %s on line %d.', $this->error->getMessage(), $this->error->getLine()), - $this->error->getCode(), - $this->error - ); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/UnavailableLinterException.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/UnavailableLinterException.php deleted file mode 100644 index 6e8cd63..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/UnavailableLinterException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Linter; - -/** - * Exception that is thrown when the chosen linter is not available on the environment. - * - * @author Dariusz Rumiński - */ -class UnavailableLinterException extends \RuntimeException -{ -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/PharChecker.php b/vendor/friendsofphp/php-cs-fixer/src/PharChecker.php deleted file mode 100644 index 81fae9f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/PharChecker.php +++ /dev/null @@ -1,39 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * @internal - */ -final class PharChecker implements PharCheckerInterface -{ - /** - * {@inheritdoc} - */ - public function checkFileValidity($filename) - { - try { - $phar = new \Phar($filename); - // free the variable to unlock the file - unset($phar); - } catch (\Exception $e) { - if (!$e instanceof \UnexpectedValueException && !$e instanceof \PharException) { - throw $e; - } - - return 'Failed to create Phar instance. '.$e->getMessage(); - } - - return null; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/PharCheckerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/PharCheckerInterface.php deleted file mode 100644 index 8de1395..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/PharCheckerInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * @internal - */ -interface PharCheckerInterface -{ - /** - * @param string $filename - * - * @return null|string the invalidity reason if any, null otherwise - */ - public function checkFileValidity($filename); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Preg.php b/vendor/friendsofphp/php-cs-fixer/src/Preg.php deleted file mode 100644 index d4161ad..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Preg.php +++ /dev/null @@ -1,233 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * This class replaces preg_* functions to better handling UTF8 strings, - * ensuring no matter "u" modifier is present or absent subject will be handled correctly. - * - * @author Kuba Werłos - * - * @internal - */ -final class Preg -{ - /** - * @param string $pattern - * @param string $subject - * @param null|string[] $matches - * @param int $flags - * @param int $offset - * - * @throws PregException - * - * @return int - */ - public static function match($pattern, $subject, &$matches = null, $flags = 0, $offset = 0) - { - $result = @preg_match(self::addUtf8Modifier($pattern), $subject, $matches, $flags, $offset); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - $result = @preg_match(self::removeUtf8Modifier($pattern), $subject, $matches, $flags, $offset); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); - } - - /** - * @param string $pattern - * @param string $subject - * @param null|string[] $matches - * @param int $flags - * @param int $offset - * - * @throws PregException - * - * @return int - */ - public static function matchAll($pattern, $subject, &$matches = null, $flags = PREG_PATTERN_ORDER, $offset = 0) - { - $result = @preg_match_all(self::addUtf8Modifier($pattern), $subject, $matches, $flags, $offset); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - $result = @preg_match_all(self::removeUtf8Modifier($pattern), $subject, $matches, $flags, $offset); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); - } - - /** - * @param string|string[] $pattern - * @param string|string[] $replacement - * @param string|string[] $subject - * @param int $limit - * @param null|int $count - * - * @throws PregException - * - * @return string|string[] - */ - public static function replace($pattern, $replacement, $subject, $limit = -1, &$count = null) - { - $result = @preg_replace(self::addUtf8Modifier($pattern), $replacement, $subject, $limit, $count); - if (null !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - $result = @preg_replace(self::removeUtf8Modifier($pattern), $replacement, $subject, $limit, $count); - if (null !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); - } - - /** - * @param string|string[] $pattern - * @param callable $callback - * @param string|string[] $subject - * @param int $limit - * @param null|int $count - * - * @throws PregException - * - * @return string|string[] - */ - public static function replaceCallback($pattern, $callback, $subject, $limit = -1, &$count = null) - { - $result = @preg_replace_callback(self::addUtf8Modifier($pattern), $callback, $subject, $limit, $count); - if (null !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - $result = @preg_replace_callback(self::removeUtf8Modifier($pattern), $callback, $subject, $limit, $count); - if (null !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); - } - - /** - * @param string $pattern - * @param string $subject - * @param int $limit - * @param int $flags - * - * @throws PregException - * - * @return string[] - */ - public static function split($pattern, $subject, $limit = -1, $flags = 0) - { - $result = @preg_split(self::addUtf8Modifier($pattern), $subject, $limit, $flags); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - $result = @preg_split(self::removeUtf8Modifier($pattern), $subject, $limit, $flags); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); - } - - /** - * @param string|string[] $pattern - * - * @return string|string[] - */ - private static function addUtf8Modifier($pattern) - { - if (\is_array($pattern)) { - return array_map(__METHOD__, $pattern); - } - - return $pattern.'u'; - } - - /** - * @param string|string[] $pattern - * - * @return string|string[] - */ - private static function removeUtf8Modifier($pattern) - { - if (\is_array($pattern)) { - return array_map(__METHOD__, $pattern); - } - - if ('' === $pattern) { - return ''; - } - - $delimiter = $pattern[0]; - - $endDelimiterPosition = strrpos($pattern, $delimiter); - - return substr($pattern, 0, $endDelimiterPosition).str_replace('u', '', substr($pattern, $endDelimiterPosition)); - } - - /** - * Create PregException. - * - * Create the generic PregException message and if possible due to finding - * an invalid pattern, tell more about such kind of error in the message. - * - * @param int $error - * @param string $method - * @param string[] $patterns - * - * @return PregException - */ - private static function newPregException($error, $method, array $patterns) - { - foreach ($patterns as $pattern) { - $last = error_get_last(); - $result = @preg_match($pattern, ''); - - if (false !== $result) { - continue; - } - - $code = preg_last_error(); - $next = error_get_last(); - - if ($last !== $next) { - $message = sprintf( - '(code: %d) %s', - $code, - preg_replace('~preg_[a-z_]+[()]{2}: ~', '', $next['message']) - ); - } else { - $message = sprintf('(code: %d)', $code); - } - - return new PregException( - sprintf('%s(): Invalid PCRE pattern "%s": %s (version: %s)', $method, $pattern, $message, PCRE_VERSION), - $code - ); - } - - return new PregException(sprintf('Error occurred when calling %s.', $method), $error); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/PregException.php b/vendor/friendsofphp/php-cs-fixer/src/PregException.php deleted file mode 100644 index 79ff1e0..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/PregException.php +++ /dev/null @@ -1,24 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * Exception that is thrown when PCRE function encounters an error. - * - * @author Kuba Werłos - * - * @internal - */ -final class PregException extends \RuntimeException -{ -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Report/CheckstyleReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Report/CheckstyleReporter.php deleted file mode 100644 index 6ce5ab2..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Report/CheckstyleReporter.php +++ /dev/null @@ -1,74 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Report; - -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * @author Kévin Gomez - * - * @internal - */ -final class CheckstyleReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat() - { - return 'checkstyle'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary) - { - if (!\extension_loaded('dom')) { - throw new \RuntimeException('Cannot generate report! `ext-dom` is not available!'); - } - - $dom = new \DOMDocument('1.0', 'UTF-8'); - $checkstyles = $dom->appendChild($dom->createElement('checkstyle')); - - foreach ($reportSummary->getChanged() as $filePath => $fixResult) { - /** @var \DOMElement $file */ - $file = $checkstyles->appendChild($dom->createElement('file')); - $file->setAttribute('name', $filePath); - - foreach ($fixResult['appliedFixers'] as $appliedFixer) { - $error = $this->createError($dom, $appliedFixer); - $file->appendChild($error); - } - } - - $dom->formatOutput = true; - - return $reportSummary->isDecoratedOutput() ? OutputFormatter::escape($dom->saveXML()) : $dom->saveXML(); - } - - /** - * @param string $appliedFixer - * - * @return \DOMElement - */ - private function createError(\DOMDocument $dom, $appliedFixer) - { - $error = $dom->createElement('error'); - $error->setAttribute('severity', 'warning'); - $error->setAttribute('source', 'PHP-CS-Fixer.'.$appliedFixer); - $error->setAttribute('message', 'Found violation(s) of type: '.$appliedFixer); - - return $error; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Report/GitlabReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Report/GitlabReporter.php deleted file mode 100644 index 7845ca7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Report/GitlabReporter.php +++ /dev/null @@ -1,60 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Report; - -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * Generates a report according to gitlabs subset of codeclimate json files. - * - * @see https://github.com/codeclimate/spec/blob/master/SPEC.md#data-types - * - * @author Hans-Christian Otto - * - * @internal - */ -final class GitlabReporter implements ReporterInterface -{ - public function getFormat() - { - return 'gitlab'; - } - - /** - * Process changed files array. Returns generated report. - * - * @return string - */ - public function generate(ReportSummary $reportSummary) - { - $report = []; - foreach ($reportSummary->getChanged() as $fileName => $change) { - foreach ($change['appliedFixers'] as $fixerName) { - $report[] = [ - 'description' => $fixerName, - 'fingerprint' => md5($fileName.$fixerName), - 'location' => [ - 'path' => $fileName, - 'lines' => [ - 'begin' => 0, // line numbers are required in the format, but not available to reports - ], - ], - ]; - } - } - - $jsonString = json_encode($report); - - return $reportSummary->isDecoratedOutput() ? OutputFormatter::escape($jsonString) : $jsonString; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Report/JsonReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Report/JsonReporter.php deleted file mode 100644 index 2772b2d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Report/JsonReporter.php +++ /dev/null @@ -1,71 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Report; - -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * @author Boris Gorbylev - * - * @internal - */ -final class JsonReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat() - { - return 'json'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary) - { - $jFiles = []; - - foreach ($reportSummary->getChanged() as $file => $fixResult) { - $jfile = ['name' => $file]; - - if ($reportSummary->shouldAddAppliedFixers()) { - $jfile['appliedFixers'] = $fixResult['appliedFixers']; - } - - if (!empty($fixResult['diff'])) { - $jfile['diff'] = $fixResult['diff']; - } - - $jFiles[] = $jfile; - } - - $json = [ - 'files' => $jFiles, - ]; - - if (null !== $reportSummary->getTime()) { - $json['time'] = [ - 'total' => round($reportSummary->getTime() / 1000, 3), - ]; - } - - if (null !== $reportSummary->getMemory()) { - $json['memory'] = round($reportSummary->getMemory() / 1024 / 1024, 3); - } - - $json = json_encode($json); - - return $reportSummary->isDecoratedOutput() ? OutputFormatter::escape($json) : $json; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Report/JunitReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Report/JunitReporter.php deleted file mode 100644 index fa747b3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Report/JunitReporter.php +++ /dev/null @@ -1,141 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Report; - -use PhpCsFixer\Preg; -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * @author Boris Gorbylev - * - * @internal - */ -final class JunitReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat() - { - return 'junit'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary) - { - if (!\extension_loaded('dom')) { - throw new \RuntimeException('Cannot generate report! `ext-dom` is not available!'); - } - - $dom = new \DOMDocument('1.0', 'UTF-8'); - $testsuites = $dom->appendChild($dom->createElement('testsuites')); - /** @var \DomElement $testsuite */ - $testsuite = $testsuites->appendChild($dom->createElement('testsuite')); - $testsuite->setAttribute('name', 'PHP CS Fixer'); - - if (\count($reportSummary->getChanged())) { - $this->createFailedTestCases($dom, $testsuite, $reportSummary); - } else { - $this->createSuccessTestCase($dom, $testsuite); - } - - if ($reportSummary->getTime()) { - $testsuite->setAttribute( - 'time', - sprintf( - '%.3f', - $reportSummary->getTime() / 1000 - ) - ); - } - - $dom->formatOutput = true; - - return $reportSummary->isDecoratedOutput() ? OutputFormatter::escape($dom->saveXML()) : $dom->saveXML(); - } - - private function createSuccessTestCase(\DOMDocument $dom, \DOMElement $testsuite) - { - $testcase = $dom->createElement('testcase'); - $testcase->setAttribute('name', 'All OK'); - $testcase->setAttribute('assertions', '1'); - - $testsuite->appendChild($testcase); - $testsuite->setAttribute('tests', '1'); - $testsuite->setAttribute('assertions', '1'); - $testsuite->setAttribute('failures', '0'); - $testsuite->setAttribute('errors', '0'); - } - - private function createFailedTestCases(\DOMDocument $dom, \DOMElement $testsuite, ReportSummary $reportSummary) - { - $assertionsCount = 0; - foreach ($reportSummary->getChanged() as $file => $fixResult) { - $testcase = $this->createFailedTestCase( - $dom, - $file, - $fixResult, - $reportSummary->shouldAddAppliedFixers() - ); - $testsuite->appendChild($testcase); - $assertionsCount += (int) $testcase->getAttribute('assertions'); - } - - $testsuite->setAttribute('tests', (string) \count($reportSummary->getChanged())); - $testsuite->setAttribute('assertions', (string) $assertionsCount); - $testsuite->setAttribute('failures', (string) $assertionsCount); - $testsuite->setAttribute('errors', '0'); - } - - /** - * @param string $file - * @param bool $shouldAddAppliedFixers - * - * @return \DOMElement - */ - private function createFailedTestCase(\DOMDocument $dom, $file, array $fixResult, $shouldAddAppliedFixers) - { - $appliedFixersCount = \count($fixResult['appliedFixers']); - - $testName = str_replace('.', '_DOT_', Preg::replace('@\.'.pathinfo($file, PATHINFO_EXTENSION).'$@', '', $file)); - - $testcase = $dom->createElement('testcase'); - $testcase->setAttribute('name', $testName); - $testcase->setAttribute('file', $file); - $testcase->setAttribute('assertions', (string) $appliedFixersCount); - - $failure = $dom->createElement('failure'); - $failure->setAttribute('type', 'code_style'); - $testcase->appendChild($failure); - - if ($shouldAddAppliedFixers) { - $failureContent = "applied fixers:\n---------------\n"; - - foreach ($fixResult['appliedFixers'] as $appliedFixer) { - $failureContent .= "* {$appliedFixer}\n"; - } - } else { - $failureContent = "Wrong code style\n"; - } - - if (!empty($fixResult['diff'])) { - $failureContent .= "\nDiff:\n---------------\n\n".$fixResult['diff']; - } - - $failure->appendChild($dom->createCDATASection(trim($failureContent))); - - return $testcase; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Report/ReportSummary.php b/vendor/friendsofphp/php-cs-fixer/src/Report/ReportSummary.php deleted file mode 100644 index a276649..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Report/ReportSummary.php +++ /dev/null @@ -1,122 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Report; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class ReportSummary -{ - /** - * @var bool - */ - private $addAppliedFixers; - - /** - * @var array - */ - private $changed; - - /** - * @var bool - */ - private $isDecoratedOutput; - - /** - * @var bool - */ - private $isDryRun; - - /** - * @var int - */ - private $memory; - - /** - * @var int - */ - private $time; - - /** - * @param int $time duration in milliseconds - * @param int $memory memory usage in bytes - * @param bool $addAppliedFixers - * @param bool $isDryRun - * @param bool $isDecoratedOutput - */ - public function __construct( - array $changed, - $time, - $memory, - $addAppliedFixers, - $isDryRun, - $isDecoratedOutput - ) { - $this->changed = $changed; - $this->time = $time; - $this->memory = $memory; - $this->addAppliedFixers = $addAppliedFixers; - $this->isDryRun = $isDryRun; - $this->isDecoratedOutput = $isDecoratedOutput; - } - - /** - * @return bool - */ - public function isDecoratedOutput() - { - return $this->isDecoratedOutput; - } - - /** - * @return bool - */ - public function isDryRun() - { - return $this->isDryRun; - } - - /** - * @return array - */ - public function getChanged() - { - return $this->changed; - } - - /** - * @return int - */ - public function getMemory() - { - return $this->memory; - } - - /** - * @return int - */ - public function getTime() - { - return $this->time; - } - - /** - * @return bool - */ - public function shouldAddAppliedFixers() - { - return $this->addAppliedFixers; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Report/ReporterFactory.php b/vendor/friendsofphp/php-cs-fixer/src/Report/ReporterFactory.php deleted file mode 100644 index fce9099..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Report/ReporterFactory.php +++ /dev/null @@ -1,100 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Report; - -use Symfony\Component\Finder\Finder as SymfonyFinder; -use Symfony\Component\Finder\SplFileInfo; - -/** - * @author Boris Gorbylev - * - * @internal - */ -final class ReporterFactory -{ - /** @var ReporterInterface[] */ - private $reporters = []; - - public static function create() - { - return new self(); - } - - public function registerBuiltInReporters() - { - /** @var null|string[] $builtInReporters */ - static $builtInReporters; - - if (null === $builtInReporters) { - $builtInReporters = []; - - /** @var SplFileInfo $file */ - foreach (SymfonyFinder::create()->files()->name('*Reporter.php')->in(__DIR__) as $file) { - $relativeNamespace = $file->getRelativePath(); - $builtInReporters[] = sprintf( - '%s\\%s%s', - __NAMESPACE__, - $relativeNamespace ? $relativeNamespace.'\\' : '', - $file->getBasename('.php') - ); - } - } - - foreach ($builtInReporters as $reporterClass) { - $this->registerReporter(new $reporterClass()); - } - - return $this; - } - - /** - * @return $this - */ - public function registerReporter(ReporterInterface $reporter) - { - $format = $reporter->getFormat(); - - if (isset($this->reporters[$format])) { - throw new \UnexpectedValueException(sprintf('Reporter for format "%s" is already registered.', $format)); - } - - $this->reporters[$format] = $reporter; - - return $this; - } - - /** - * @return string[] - */ - public function getFormats() - { - $formats = array_keys($this->reporters); - sort($formats); - - return $formats; - } - - /** - * @param string $format - * - * @return ReporterInterface - */ - public function getReporter($format) - { - if (!isset($this->reporters[$format])) { - throw new \UnexpectedValueException(sprintf('Reporter for format "%s" is not registered.', $format)); - } - - return $this->reporters[$format]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Report/ReporterInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Report/ReporterInterface.php deleted file mode 100644 index 6138558..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Report/ReporterInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Report; - -/** - * @author Boris Gorbylev - */ -interface ReporterInterface -{ - /** - * @return string - */ - public function getFormat(); - - /** - * Process changed files array. Returns generated report. - * - * @return string - */ - public function generate(ReportSummary $reportSummary); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Report/TextReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Report/TextReporter.php deleted file mode 100644 index c473d84..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Report/TextReporter.php +++ /dev/null @@ -1,108 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Report; - -use PhpCsFixer\Differ\DiffConsoleFormatter; - -/** - * @author Boris Gorbylev - * - * @internal - */ -final class TextReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat() - { - return 'txt'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary) - { - $output = ''; - - $i = 0; - foreach ($reportSummary->getChanged() as $file => $fixResult) { - ++$i; - $output .= sprintf('%4d) %s', $i, $file); - - if ($reportSummary->shouldAddAppliedFixers()) { - $output .= $this->getAppliedFixers($reportSummary->isDecoratedOutput(), $fixResult); - } - - $output .= $this->getDiff($reportSummary->isDecoratedOutput(), $fixResult); - $output .= PHP_EOL; - } - - return $output.$this->getFooter($reportSummary->getTime(), $reportSummary->getMemory(), $reportSummary->isDryRun()); - } - - /** - * @param bool $isDecoratedOutput - * - * @return string - */ - private function getAppliedFixers($isDecoratedOutput, array $fixResult) - { - return sprintf( - $isDecoratedOutput ? ' (%s)' : ' (%s)', - implode(', ', $fixResult['appliedFixers']) - ); - } - - /** - * @param bool $isDecoratedOutput - * - * @return string - */ - private function getDiff($isDecoratedOutput, array $fixResult) - { - if (empty($fixResult['diff'])) { - return ''; - } - - $diffFormatter = new DiffConsoleFormatter($isDecoratedOutput, sprintf( - ' ---------- begin diff ----------%s%%s%s ----------- end diff -----------', - PHP_EOL, - PHP_EOL - )); - - return PHP_EOL.$diffFormatter->format($fixResult['diff']).PHP_EOL; - } - - /** - * @param int $time - * @param int $memory - * @param bool $isDryRun - * - * @return string - */ - private function getFooter($time, $memory, $isDryRun) - { - if (0 === $time || 0 === $memory) { - return ''; - } - - return PHP_EOL.sprintf( - '%s all files in %.3f seconds, %.3f MB memory used'.PHP_EOL, - $isDryRun ? 'Checked' : 'Fixed', - $time / 1000, - $memory / 1024 / 1024 - ); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Report/XmlReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Report/XmlReporter.php deleted file mode 100644 index 080715a..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Report/XmlReporter.php +++ /dev/null @@ -1,140 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Report; - -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * @author Boris Gorbylev - * - * @internal - */ -final class XmlReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat() - { - return 'xml'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary) - { - if (!\extension_loaded('dom')) { - throw new \RuntimeException('Cannot generate report! `ext-dom` is not available!'); - } - - $dom = new \DOMDocument('1.0', 'UTF-8'); - // new nodes should be added to this or existing children - $root = $dom->createElement('report'); - $dom->appendChild($root); - - $filesXML = $dom->createElement('files'); - $root->appendChild($filesXML); - - $i = 1; - foreach ($reportSummary->getChanged() as $file => $fixResult) { - $fileXML = $dom->createElement('file'); - $fileXML->setAttribute('id', (string) $i++); - $fileXML->setAttribute('name', $file); - $filesXML->appendChild($fileXML); - - if ($reportSummary->shouldAddAppliedFixers()) { - $fileXML->appendChild($this->createAppliedFixersElement($dom, $fixResult)); - } - - if (!empty($fixResult['diff'])) { - $fileXML->appendChild($this->createDiffElement($dom, $fixResult)); - } - } - - if (0 !== $reportSummary->getTime()) { - $root->appendChild($this->createTimeElement($reportSummary->getTime(), $dom)); - } - - if (0 !== $reportSummary->getMemory()) { - $root->appendChild($this->createMemoryElement($reportSummary->getMemory(), $dom)); - } - - $dom->formatOutput = true; - - return $reportSummary->isDecoratedOutput() ? OutputFormatter::escape($dom->saveXML()) : $dom->saveXML(); - } - - /** - * @param \DOMDocument $dom - * - * @return \DOMElement - */ - private function createAppliedFixersElement($dom, array $fixResult) - { - $appliedFixersXML = $dom->createElement('applied_fixers'); - - foreach ($fixResult['appliedFixers'] as $appliedFixer) { - $appliedFixerXML = $dom->createElement('applied_fixer'); - $appliedFixerXML->setAttribute('name', $appliedFixer); - $appliedFixersXML->appendChild($appliedFixerXML); - } - - return $appliedFixersXML; - } - - /** - * @return \DOMElement - */ - private function createDiffElement(\DOMDocument $dom, array $fixResult) - { - $diffXML = $dom->createElement('diff'); - $diffXML->appendChild($dom->createCDATASection($fixResult['diff'])); - - return $diffXML; - } - - /** - * @param float $time - * - * @return \DOMElement - */ - private function createTimeElement($time, \DOMDocument $dom) - { - $time = round($time / 1000, 3); - - $timeXML = $dom->createElement('time'); - $timeXML->setAttribute('unit', 's'); - $timeTotalXML = $dom->createElement('total'); - $timeTotalXML->setAttribute('value', (string) $time); - $timeXML->appendChild($timeTotalXML); - - return $timeXML; - } - - /** - * @param float $memory - * - * @return \DOMElement - */ - private function createMemoryElement($memory, \DOMDocument $dom) - { - $memory = round($memory / 1024 / 1024, 3); - - $memoryXML = $dom->createElement('memory'); - $memoryXML->setAttribute('value', (string) $memory); - $memoryXML->setAttribute('unit', 'MB'); - - return $memoryXML; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet.php deleted file mode 100644 index 51b65ff..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet.php +++ /dev/null @@ -1,534 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Fixer\FunctionNotation\NativeFunctionInvocationFixer; -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; - -/** - * Set of rules to be used by fixer. - * - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -final class RuleSet implements RuleSetInterface -{ - private $setDefinitions = [ - '@PSR1' => [ - 'encoding' => true, - 'full_opening_tag' => true, - ], - '@PSR2' => [ - '@PSR1' => true, - 'blank_line_after_namespace' => true, - 'braces' => true, - 'class_definition' => true, - 'constant_case' => true, - 'elseif' => true, - 'function_declaration' => true, - 'indentation_type' => true, - 'line_ending' => true, - 'lowercase_keywords' => true, - 'method_argument_space' => ['on_multiline' => 'ensure_fully_multiline'], - 'no_break_comment' => true, - 'no_closing_tag' => true, - 'no_spaces_after_function_name' => true, - 'no_spaces_inside_parenthesis' => true, - 'no_trailing_whitespace' => true, - 'no_trailing_whitespace_in_comment' => true, - 'single_blank_line_at_eof' => true, - 'single_class_element_per_statement' => ['elements' => ['property']], - 'single_import_per_statement' => true, - 'single_line_after_imports' => true, - 'switch_case_semicolon_to_colon' => true, - 'switch_case_space' => true, - 'visibility_required' => true, - ], - '@Symfony' => [ - '@PSR2' => true, - 'array_syntax' => ['syntax' => 'short'], - 'binary_operator_spaces' => true, - 'blank_line_after_opening_tag' => true, - 'blank_line_before_statement' => [ - 'statements' => ['return'], - ], - 'braces' => [ - 'allow_single_line_closure' => true, - ], - 'cast_spaces' => true, - 'class_attributes_separation' => ['elements' => ['method']], - 'class_definition' => ['single_line' => true], - 'concat_space' => true, - 'declare_equal_normalize' => true, - 'function_typehint_space' => true, - 'include' => true, - 'increment_style' => true, - 'lowercase_cast' => true, - 'lowercase_static_reference' => true, - 'magic_constant_casing' => true, - 'magic_method_casing' => true, - 'method_argument_space' => true, - 'native_function_casing' => true, - 'native_function_type_declaration_casing' => true, - 'new_with_braces' => true, - 'no_blank_lines_after_class_opening' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_empty_comment' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_blank_lines' => ['tokens' => [ - 'curly_brace_block', - 'extra', - 'parenthesis_brace_block', - 'square_brace_block', - 'throw', - 'use', - ]], - 'no_leading_import_slash' => true, - 'no_leading_namespace_whitespace' => true, - 'no_mixed_echo_print' => true, - 'no_multiline_whitespace_around_double_arrow' => true, - 'no_short_bool_cast' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_spaces_around_offset' => true, - 'no_superfluous_phpdoc_tags' => ['allow_mixed' => true, 'allow_unused_params' => true], - 'no_trailing_comma_in_list_call' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_unneeded_control_parentheses' => true, - 'no_unneeded_curly_braces' => ['namespaces' => true], - 'no_unused_imports' => true, - 'no_whitespace_before_comma_in_array' => true, - 'no_whitespace_in_blank_line' => true, - 'normalize_index_brace' => true, - 'object_operator_without_whitespace' => true, - 'ordered_imports' => true, - 'php_unit_fqcn_annotation' => true, - 'phpdoc_align' => [ - // @TODO: on 3.0 switch whole rule to `=> true`, currently we use custom config that will be default on 3.0 - 'tags' => [ - 'method', - 'param', - 'property', - 'return', - 'throws', - 'type', - 'var', - ], - ], - 'phpdoc_annotation_without_dot' => true, - 'phpdoc_indent' => true, - 'phpdoc_inline_tag' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_alias_tag' => true, - 'phpdoc_no_package' => true, - 'phpdoc_no_useless_inheritdoc' => true, - 'phpdoc_return_self_reference' => true, - 'phpdoc_scalar' => true, - 'phpdoc_separation' => true, - 'phpdoc_single_line_var_spacing' => true, - 'phpdoc_summary' => true, - 'phpdoc_to_comment' => true, - 'phpdoc_trim' => true, - 'phpdoc_trim_consecutive_blank_line_separation' => true, - 'phpdoc_types' => true, - 'phpdoc_types_order' => [ - 'null_adjustment' => 'always_last', - 'sort_algorithm' => 'none', - ], - 'phpdoc_var_without_name' => true, - 'return_type_declaration' => true, - 'semicolon_after_instruction' => true, - 'short_scalar_cast' => true, - 'single_blank_line_before_namespace' => true, - 'single_class_element_per_statement' => true, - 'single_line_comment_style' => [ - 'comment_types' => ['hash'], - ], - 'single_line_throw' => true, - 'single_quote' => true, - 'single_trait_insert_per_statement' => true, - 'space_after_semicolon' => [ - 'remove_in_empty_for_expressions' => true, - ], - 'standardize_increment' => true, - 'standardize_not_equals' => true, - 'ternary_operator_spaces' => true, - 'trailing_comma_in_multiline_array' => true, - 'trim_array_spaces' => true, - 'unary_operator_spaces' => true, - 'whitespace_after_comma_in_array' => true, - 'yoda_style' => true, - ], - '@Symfony:risky' => [ - 'dir_constant' => true, - 'ereg_to_preg' => true, - 'error_suppression' => true, - 'fopen_flag_order' => true, - 'fopen_flags' => ['b_mode' => false], - 'function_to_constant' => [ - 'functions' => [ - 'get_called_class', - 'get_class', - 'get_class_this', - 'php_sapi_name', - 'phpversion', - 'pi', - ], - ], - 'implode_call' => true, - 'is_null' => true, - 'modernize_types_casting' => true, - 'native_constant_invocation' => [ - 'fix_built_in' => false, - 'include' => [ - 'DIRECTORY_SEPARATOR', - 'PHP_SAPI', - 'PHP_VERSION_ID', - ], - 'scope' => 'namespaced', - ], - 'native_function_invocation' => [ - 'include' => [NativeFunctionInvocationFixer::SET_COMPILER_OPTIMIZED], - 'scope' => 'namespaced', - 'strict' => true, - ], - 'no_alias_functions' => true, - 'no_homoglyph_names' => true, - 'no_unneeded_final_method' => true, - 'non_printable_character' => true, - 'php_unit_construct' => true, - 'php_unit_mock_short_will_return' => true, - 'psr4' => true, - 'self_accessor' => true, - 'set_type_to_cast' => true, - ], - '@PhpCsFixer' => [ - '@Symfony' => true, - 'align_multiline_comment' => true, - 'array_indentation' => true, - 'blank_line_before_statement' => true, - 'combine_consecutive_issets' => true, - 'combine_consecutive_unsets' => true, - 'compact_nullable_typehint' => true, - 'escape_implicit_backslashes' => true, - 'explicit_indirect_variable' => true, - 'explicit_string_variable' => true, - 'fully_qualified_strict_types' => true, - 'heredoc_to_nowdoc' => true, - 'method_argument_space' => ['on_multiline' => 'ensure_fully_multiline'], - 'method_chaining_indentation' => true, - 'multiline_comment_opening_closing' => true, - 'multiline_whitespace_before_semicolons' => ['strategy' => 'new_line_for_chained_calls'], - 'no_alternative_syntax' => true, - 'no_binary_string' => true, - 'no_extra_blank_lines' => ['tokens' => [ - 'break', - 'continue', - 'curly_brace_block', - 'extra', - 'parenthesis_brace_block', - 'return', - 'square_brace_block', - 'throw', - 'use', - ]], - 'no_null_property_initialization' => true, - 'no_short_echo_tag' => true, - 'no_superfluous_elseif' => true, - 'no_unset_cast' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'ordered_class_elements' => true, - 'php_unit_internal_class' => true, - 'php_unit_method_casing' => true, - 'php_unit_ordered_covers' => true, - 'php_unit_test_class_requires_covers' => true, - 'phpdoc_add_missing_param_annotation' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_order' => true, - 'phpdoc_types_order' => true, - 'phpdoc_var_annotation_correct_order' => true, - 'protected_to_private' => true, - 'return_assignment' => true, - 'simple_to_complex_string_variable' => true, - 'single_line_comment_style' => true, - 'single_line_throw' => false, - ], - '@PhpCsFixer:risky' => [ - '@Symfony:risky' => true, - 'comment_to_phpdoc' => true, - 'final_internal_class' => true, - 'logical_operators' => true, - 'no_unreachable_default_argument_value' => true, - 'no_unset_on_property' => true, - 'php_unit_set_up_tear_down_visibility' => true, - 'php_unit_strict' => true, - 'php_unit_test_annotation' => true, - 'php_unit_test_case_static_method_calls' => true, - 'strict_comparison' => true, - 'strict_param' => true, - 'string_line_ending' => true, - ], - '@DoctrineAnnotation' => [ - 'doctrine_annotation_array_assignment' => [ - 'operator' => ':', - ], - 'doctrine_annotation_braces' => true, - 'doctrine_annotation_indentation' => true, - 'doctrine_annotation_spaces' => [ - 'before_array_assignments_colon' => false, - ], - ], - '@PHP56Migration' => [], - '@PHP56Migration:risky' => [ - 'pow_to_exponentiation' => true, - ], - '@PHP70Migration' => [ - '@PHP56Migration' => true, - 'ternary_to_null_coalescing' => true, - ], - '@PHP70Migration:risky' => [ - '@PHP56Migration:risky' => true, - 'combine_nested_dirname' => true, - 'declare_strict_types' => true, - 'non_printable_character' => [ - 'use_escape_sequences_in_strings' => true, - ], - 'random_api_migration' => ['replacements' => [ - 'mt_rand' => 'random_int', - 'rand' => 'random_int', - ]], - ], - '@PHP71Migration' => [ - '@PHP70Migration' => true, - 'visibility_required' => ['elements' => [ - 'const', - 'method', - 'property', - ]], - ], - '@PHP71Migration:risky' => [ - '@PHP70Migration:risky' => true, - 'void_return' => true, - ], - '@PHP73Migration' => [ - '@PHP71Migration' => true, - 'heredoc_indentation' => true, - ], - '@PHPUnit30Migration:risky' => [ - 'php_unit_dedicate_assert' => ['target' => PhpUnitTargetVersion::VERSION_3_0], - ], - '@PHPUnit32Migration:risky' => [ - '@PHPUnit30Migration:risky' => true, - 'php_unit_no_expectation_annotation' => ['target' => PhpUnitTargetVersion::VERSION_3_2], - ], - '@PHPUnit35Migration:risky' => [ - '@PHPUnit32Migration:risky' => true, - 'php_unit_dedicate_assert' => ['target' => PhpUnitTargetVersion::VERSION_3_5], - ], - '@PHPUnit43Migration:risky' => [ - '@PHPUnit35Migration:risky' => true, - 'php_unit_no_expectation_annotation' => ['target' => PhpUnitTargetVersion::VERSION_4_3], - ], - '@PHPUnit48Migration:risky' => [ - '@PHPUnit43Migration:risky' => true, - 'php_unit_namespaced' => ['target' => PhpUnitTargetVersion::VERSION_4_8], - ], - '@PHPUnit50Migration:risky' => [ - '@PHPUnit48Migration:risky' => true, - 'php_unit_dedicate_assert' => true, - ], - '@PHPUnit52Migration:risky' => [ - '@PHPUnit50Migration:risky' => true, - 'php_unit_expectation' => ['target' => PhpUnitTargetVersion::VERSION_5_2], - ], - '@PHPUnit54Migration:risky' => [ - '@PHPUnit52Migration:risky' => true, - 'php_unit_mock' => ['target' => PhpUnitTargetVersion::VERSION_5_4], - ], - '@PHPUnit55Migration:risky' => [ - '@PHPUnit54Migration:risky' => true, - 'php_unit_mock' => ['target' => PhpUnitTargetVersion::VERSION_5_5], - ], - '@PHPUnit56Migration:risky' => [ - '@PHPUnit55Migration:risky' => true, - 'php_unit_dedicate_assert' => ['target' => PhpUnitTargetVersion::VERSION_5_6], - 'php_unit_expectation' => ['target' => PhpUnitTargetVersion::VERSION_5_6], - ], - '@PHPUnit57Migration:risky' => [ - '@PHPUnit56Migration:risky' => true, - 'php_unit_namespaced' => ['target' => PhpUnitTargetVersion::VERSION_5_7], - ], - '@PHPUnit60Migration:risky' => [ - '@PHPUnit57Migration:risky' => true, - 'php_unit_namespaced' => ['target' => PhpUnitTargetVersion::VERSION_6_0], - ], - '@PHPUnit75Migration:risky' => [ - '@PHPUnit60Migration:risky' => true, - 'php_unit_dedicate_assert_internal_type' => ['target' => PhpUnitTargetVersion::VERSION_7_5], - ], - ]; - - /** - * Set that was used to generate group of rules. - * - * The key is name of rule or set, value is bool if the rule/set should be used. - * - * @var array - */ - private $set; - - /** - * Group of rules generated from input set. - * - * The key is name of rule, value is bool if the rule/set should be used. - * The key must not point to any set. - * - * @var array - */ - private $rules; - - public function __construct(array $set = []) - { - foreach ($set as $key => $value) { - if (\is_int($key)) { - throw new \InvalidArgumentException(sprintf('Missing value for "%s" rule/set.', $value)); - } - } - - $this->set = $set; - $this->resolveSet(); - } - - public static function create(array $set = []) - { - return new self($set); - } - - /** - * {@inheritdoc} - */ - public function hasRule($rule) - { - return \array_key_exists($rule, $this->rules); - } - - /** - * {@inheritdoc} - */ - public function getRuleConfiguration($rule) - { - if (!$this->hasRule($rule)) { - throw new \InvalidArgumentException(sprintf('Rule "%s" is not in the set.', $rule)); - } - - if (true === $this->rules[$rule]) { - return null; - } - - return $this->rules[$rule]; - } - - /** - * {@inheritdoc} - */ - public function getRules() - { - return $this->rules; - } - - /** - * {@inheritdoc} - */ - public function getSetDefinitionNames() - { - return array_keys($this->setDefinitions); - } - - /** - * @param string $name name of set - * - * @return array - */ - private function getSetDefinition($name) - { - if (!isset($this->setDefinitions[$name])) { - throw new \InvalidArgumentException(sprintf('Set "%s" does not exist.', $name)); - } - - return $this->setDefinitions[$name]; - } - - /** - * Resolve input set into group of rules. - * - * @return $this - */ - private function resolveSet() - { - $rules = $this->set; - $resolvedRules = []; - - // expand sets - foreach ($rules as $name => $value) { - if ('@' === $name[0]) { - if (!\is_bool($value)) { - throw new \UnexpectedValueException(sprintf('Nested rule set "%s" configuration must be a boolean.', $name)); - } - - $set = $this->resolveSubset($name, $value); - $resolvedRules = array_merge($resolvedRules, $set); - } else { - $resolvedRules[$name] = $value; - } - } - - // filter out all resolvedRules that are off - $resolvedRules = array_filter($resolvedRules); - - $this->rules = $resolvedRules; - - return $this; - } - - /** - * Resolve set rules as part of another set. - * - * If set value is false then disable all fixers in set, - * if not then get value from set item. - * - * @param string $setName - * @param bool $setValue - * - * @return array - */ - private function resolveSubset($setName, $setValue) - { - $rules = $this->getSetDefinition($setName); - foreach ($rules as $name => $value) { - if ('@' === $name[0]) { - $set = $this->resolveSubset($name, $setValue); - unset($rules[$name]); - $rules = array_merge($rules, $set); - } elseif (!$setValue) { - $rules[$name] = false; - } else { - $rules[$name] = $value; - } - } - - return $rules; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSetInterface.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSetInterface.php deleted file mode 100644 index c52eccc..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSetInterface.php +++ /dev/null @@ -1,59 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * Set of rules to be used by fixer. - * - * Example of set: ["@PSR2" => true, "@PSR1" => false, "strict" => true]. - * - * @author Dariusz Rumiński - */ -interface RuleSetInterface -{ - public function __construct(array $set = []); - - public static function create(array $set = []); - - /** - * Get configuration for given rule. - * - * @param string $rule name of rule - * - * @return null|array - */ - public function getRuleConfiguration($rule); - - /** - * Get all rules from rules set. - * - * @return array - */ - public function getRules(); - - /** - * Get names of all set definitions. - * - * @return string[] - */ - public function getSetDefinitionNames(); - - /** - * Check given rule is in rules set. - * - * @param string $rule name of rule - * - * @return bool - */ - public function hasRule($rule); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php deleted file mode 100644 index cd6bcb6..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php +++ /dev/null @@ -1,80 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Runner; - -use PhpCsFixer\Linter\LinterInterface; -use PhpCsFixer\Linter\LintingResultInterface; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FileCachingLintingIterator extends \CachingIterator -{ - /** - * @var LintingResultInterface - */ - private $currentResult; - - /** - * @var LinterInterface - */ - private $linter; - - /** - * @var LintingResultInterface - */ - private $nextResult; - - public function __construct(\Iterator $iterator, LinterInterface $linter) - { - parent::__construct($iterator); - - $this->linter = $linter; - } - - public function currentLintingResult() - { - return $this->currentResult; - } - - public function next() - { - parent::next(); - - $this->currentResult = $this->nextResult; - - if ($this->hasNext()) { - $this->nextResult = $this->handleItem($this->getInnerIterator()->current()); - } - } - - public function rewind() - { - parent::rewind(); - - if ($this->valid()) { - $this->currentResult = $this->handleItem($this->current()); - } - - if ($this->hasNext()) { - $this->nextResult = $this->handleItem($this->getInnerIterator()->current()); - } - } - - private function handleItem(\SplFileInfo $file) - { - return $this->linter->lintFile($file->getRealPath()); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php deleted file mode 100644 index 7a4ac22..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php +++ /dev/null @@ -1,122 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Runner; - -use PhpCsFixer\Cache\CacheManagerInterface; -use PhpCsFixer\Event\Event; -use PhpCsFixer\FileReader; -use PhpCsFixer\FixerFileProcessedEvent; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FileFilterIterator extends \FilterIterator -{ - /** - * @var null|EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var CacheManagerInterface - */ - private $cacheManager; - - /** - * @var array - */ - private $visitedElements = []; - - public function __construct( - \Traversable $iterator, - EventDispatcherInterface $eventDispatcher = null, - CacheManagerInterface $cacheManager - ) { - if (!$iterator instanceof \Iterator) { - $iterator = new \IteratorIterator($iterator); - } - - parent::__construct($iterator); - - $this->eventDispatcher = $eventDispatcher; - $this->cacheManager = $cacheManager; - } - - public function accept() - { - $file = $this->current(); - if (!$file instanceof \SplFileInfo) { - throw new \RuntimeException( - sprintf( - 'Expected instance of "\SplFileInfo", got "%s".', - \is_object($file) ? \get_class($file) : \gettype($file) - ) - ); - } - - $path = $file->isLink() ? $file->getPathname() : $file->getRealPath(); - - if (isset($this->visitedElements[$path])) { - return false; - } - - $this->visitedElements[$path] = true; - - if (!$file->isFile() || $file->isLink()) { - return false; - } - - $content = FileReader::createSingleton()->read($path); - - // mark as skipped: - if ( - // empty file - '' === $content - // file that does not need fixing due to cache - || !$this->cacheManager->needFixing($file->getPathname(), $content) - ) { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_SKIPPED) - ); - - return false; - } - - return true; - } - - /** - * @param string $name - */ - private function dispatchEvent($name, Event $event) - { - if (null === $this->eventDispatcher) { - return; - } - - // BC compatibility < Sf 4.3 - if ( - !$this->eventDispatcher instanceof \Symfony\Contracts\EventDispatcher\EventDispatcherInterface - ) { - $this->eventDispatcher->dispatch($name, $event); - - return; - } - - $this->eventDispatcher->dispatch($event, $name); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php deleted file mode 100644 index fbd9b34..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php +++ /dev/null @@ -1,68 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Runner; - -use PhpCsFixer\Linter\LinterInterface; -use PhpCsFixer\Linter\LintingResultInterface; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FileLintingIterator extends \IteratorIterator -{ - /** - * @var LintingResultInterface - */ - private $currentResult; - - /** - * @var null|LinterInterface - */ - private $linter; - - public function __construct(\Iterator $iterator, LinterInterface $linter) - { - parent::__construct($iterator); - - $this->linter = $linter; - } - - /** - * @return null|LintingResultInterface - */ - public function currentLintingResult() - { - return $this->currentResult; - } - - public function next() - { - parent::next(); - - $this->currentResult = $this->valid() ? $this->handleItem($this->current()) : null; - } - - public function rewind() - { - parent::rewind(); - - $this->currentResult = $this->valid() ? $this->handleItem($this->current()) : null; - } - - private function handleItem(\SplFileInfo $file) - { - return $this->linter->lintFile($file->getRealPath()); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php deleted file mode 100644 index 088be8d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php +++ /dev/null @@ -1,307 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Runner; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Cache\CacheManagerInterface; -use PhpCsFixer\Cache\Directory; -use PhpCsFixer\Cache\DirectoryInterface; -use PhpCsFixer\Differ\DifferInterface; -use PhpCsFixer\Error\Error; -use PhpCsFixer\Error\ErrorsManager; -use PhpCsFixer\Event\Event; -use PhpCsFixer\FileReader; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\FixerFileProcessedEvent; -use PhpCsFixer\Linter\LinterInterface; -use PhpCsFixer\Linter\LintingException; -use PhpCsFixer\Linter\LintingResultInterface; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\Filesystem\Exception\IOException; - -/** - * @author Dariusz Rumiński - */ -final class Runner -{ - /** - * @var DifferInterface - */ - private $differ; - - /** - * @var DirectoryInterface - */ - private $directory; - - /** - * @var null|EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var ErrorsManager - */ - private $errorsManager; - - /** - * @var CacheManagerInterface - */ - private $cacheManager; - - /** - * @var bool - */ - private $isDryRun; - - /** - * @var LinterInterface - */ - private $linter; - - /** - * @var \Traversable - */ - private $finder; - - /** - * @var FixerInterface[] - */ - private $fixers; - - /** - * @var bool - */ - private $stopOnViolation; - - public function __construct( - $finder, - array $fixers, - DifferInterface $differ, - EventDispatcherInterface $eventDispatcher = null, - ErrorsManager $errorsManager, - LinterInterface $linter, - $isDryRun, - CacheManagerInterface $cacheManager, - DirectoryInterface $directory = null, - $stopOnViolation = false - ) { - $this->finder = $finder; - $this->fixers = $fixers; - $this->differ = $differ; - $this->eventDispatcher = $eventDispatcher; - $this->errorsManager = $errorsManager; - $this->linter = $linter; - $this->isDryRun = $isDryRun; - $this->cacheManager = $cacheManager; - $this->directory = $directory ?: new Directory(''); - $this->stopOnViolation = $stopOnViolation; - } - - /** - * @return array - */ - public function fix() - { - $changed = []; - - $finder = $this->finder; - $finderIterator = $finder instanceof \IteratorAggregate ? $finder->getIterator() : $finder; - $fileFilteredFileIterator = new FileFilterIterator( - $finderIterator, - $this->eventDispatcher, - $this->cacheManager - ); - - $collection = $this->linter->isAsync() - ? new FileCachingLintingIterator($fileFilteredFileIterator, $this->linter) - : new FileLintingIterator($fileFilteredFileIterator, $this->linter); - - foreach ($collection as $file) { - $fixInfo = $this->fixFile($file, $collection->currentLintingResult()); - - // we do not need Tokens to still caching just fixed file - so clear the cache - Tokens::clearCache(); - - if ($fixInfo) { - $name = $this->directory->getRelativePathTo($file); - $changed[$name] = $fixInfo; - - if ($this->stopOnViolation) { - break; - } - } - } - - return $changed; - } - - private function fixFile(\SplFileInfo $file, LintingResultInterface $lintingResult) - { - $name = $file->getPathname(); - - try { - $lintingResult->check(); - } catch (LintingException $e) { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_INVALID) - ); - - $this->errorsManager->report(new Error(Error::TYPE_INVALID, $name, $e)); - - return; - } - - $old = FileReader::createSingleton()->read($file->getRealPath()); - - Tokens::setLegacyMode(false); - - $tokens = Tokens::fromCode($old); - $oldHash = $tokens->getCodeHash(); - - $newHash = $oldHash; - $new = $old; - - $appliedFixers = []; - - try { - foreach ($this->fixers as $fixer) { - // for custom fixers we don't know is it safe to run `->fix()` without checking `->supports()` and `->isCandidate()`, - // thus we need to check it and conditionally skip fixing - if ( - !$fixer instanceof AbstractFixer && - (!$fixer->supports($file) || !$fixer->isCandidate($tokens)) - ) { - continue; - } - - $fixer->fix($file, $tokens); - - if ($tokens->isChanged()) { - $tokens->clearEmptyTokens(); - $tokens->clearChanged(); - $appliedFixers[] = $fixer->getName(); - } - } - } catch (\Exception $e) { - $this->processException($name, $e); - - return; - } catch (\ParseError $e) { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_LINT) - ); - - $this->errorsManager->report(new Error(Error::TYPE_LINT, $name, $e)); - - return; - } catch (\Throwable $e) { - $this->processException($name, $e); - - return; - } - - $fixInfo = null; - - if (!empty($appliedFixers)) { - $new = $tokens->generateCode(); - $newHash = $tokens->getCodeHash(); - } - - // We need to check if content was changed and then applied changes. - // But we can't simple check $appliedFixers, because one fixer may revert - // work of other and both of them will mark collection as changed. - // Therefore we need to check if code hashes changed. - if ($oldHash !== $newHash) { - $fixInfo = [ - 'appliedFixers' => $appliedFixers, - 'diff' => $this->differ->diff($old, $new), - ]; - - try { - $this->linter->lintSource($new)->check(); - } catch (LintingException $e) { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_LINT) - ); - - $this->errorsManager->report(new Error(Error::TYPE_LINT, $name, $e, $fixInfo['appliedFixers'], $fixInfo['diff'])); - - return; - } - - if (!$this->isDryRun) { - if (false === @file_put_contents($file->getRealPath(), $new)) { - $error = error_get_last(); - - throw new IOException( - sprintf('Failed to write file "%s", "%s".', $file->getPathname(), $error ? $error['message'] : 'no reason available'), - 0, - null, - $file->getRealPath() - ); - } - } - } - - $this->cacheManager->setFile($name, $new); - - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent($fixInfo ? FixerFileProcessedEvent::STATUS_FIXED : FixerFileProcessedEvent::STATUS_NO_CHANGES) - ); - - return $fixInfo; - } - - /** - * Process an exception that occurred. - * - * @param string $name - * @param \Throwable $e - */ - private function processException($name, $e) - { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_EXCEPTION) - ); - - $this->errorsManager->report(new Error(Error::TYPE_EXCEPTION, $name, $e)); - } - - /** - * @param string $name - */ - private function dispatchEvent($name, Event $event) - { - if (null === $this->eventDispatcher) { - return; - } - - // BC compatibility < Sf 4.3 - if ( - !$this->eventDispatcher instanceof \Symfony\Contracts\EventDispatcher\EventDispatcherInterface - ) { - $this->eventDispatcher->dispatch($name, $event); - - return; - } - - $this->eventDispatcher->dispatch($event, $name); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php b/vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php deleted file mode 100644 index 2eedfa3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php +++ /dev/null @@ -1,172 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * @author Davi Koscianski Vidal - * - * @internal - */ -final class StdinFileInfo extends \SplFileInfo -{ - public function __construct() - { - } - - public function __toString() - { - return $this->getRealPath(); - } - - public function getRealPath() - { - // So file_get_contents & friends will work. - // Warning - this stream is not seekable, so `file_get_contents` will work only once! Consider using `FileReader`. - return 'php://stdin'; - } - - public function getATime() - { - return 0; - } - - public function getBasename($suffix = null) - { - return $this->getFilename(); - } - - public function getCTime() - { - return 0; - } - - public function getExtension() - { - return '.php'; - } - - public function getFileInfo($className = null) - { - throw new \BadMethodCallException(sprintf('Method "%s" is not implemented.', __METHOD__)); - } - - public function getFilename() - { - /* - * Useful so fixers depending on PHP-only files still work. - * - * The idea to use STDIN is to parse PHP-only files, so we can - * assume that there will be always a PHP file out there. - */ - - return 'stdin.php'; - } - - public function getGroup() - { - return 0; - } - - public function getInode() - { - return 0; - } - - public function getLinkTarget() - { - return ''; - } - - public function getMTime() - { - return 0; - } - - public function getOwner() - { - return 0; - } - - public function getPath() - { - return ''; - } - - public function getPathInfo($className = null) - { - throw new \BadMethodCallException(sprintf('Method "%s" is not implemented.', __METHOD__)); - } - - public function getPathname() - { - return $this->getFilename(); - } - - public function getPerms() - { - return 0; - } - - public function getSize() - { - return 0; - } - - public function getType() - { - return 'file'; - } - - public function isDir() - { - return false; - } - - public function isExecutable() - { - return false; - } - - public function isFile() - { - return true; - } - - public function isLink() - { - return false; - } - - public function isReadable() - { - return true; - } - - public function isWritable() - { - return false; - } - - public function openFile($openMode = 'r', $useIncludePath = false, $context = null) - { - throw new \BadMethodCallException(sprintf('Method "%s" is not implemented.', __METHOD__)); - } - - public function setFileClass($className = null) - { - } - - public function setInfoClass($className = null) - { - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Test/AbstractFixerTestCase.php b/vendor/friendsofphp/php-cs-fixer/src/Test/AbstractFixerTestCase.php deleted file mode 100644 index 748c10f..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Test/AbstractFixerTestCase.php +++ /dev/null @@ -1,36 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Test; - -use PhpCsFixer\Tests\Test\AbstractFixerTestCase as BaseAbstractFixerTestCase; - -/** - * @TODO 3.0 While removing, remove loading `tests/Test` from `autoload` section of `composer.json`. - * - * @deprecated since v2.4 - */ -abstract class AbstractFixerTestCase extends BaseAbstractFixerTestCase -{ - public function __construct($name = null, array $data = [], $dataName = '') - { - @trigger_error( - sprintf( - 'The "%s" class is deprecated. You should stop using it, as it will be removed in 3.0 version.', - __CLASS__ - ), - E_USER_DEPRECATED - ); - - parent::__construct($name, $data, $dataName); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Test/AbstractIntegrationTestCase.php b/vendor/friendsofphp/php-cs-fixer/src/Test/AbstractIntegrationTestCase.php deleted file mode 100644 index fe7c20c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Test/AbstractIntegrationTestCase.php +++ /dev/null @@ -1,36 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Test; - -use PhpCsFixer\Tests\Test\AbstractIntegrationTestCase as BaseAbstractIntegrationTestCase; - -/** - * @TODO 3.0 While removing, remove loading `tests/Test` from `autoload` section of `composer.json`. - * - * @deprecated since v2.4 - */ -abstract class AbstractIntegrationTestCase extends BaseAbstractIntegrationTestCase -{ - public function __construct($name = null, array $data = [], $dataName = '') - { - @trigger_error( - sprintf( - 'The "%s" class is deprecated. You should stop using it, as it will be removed in 3.0 version.', - __CLASS__ - ), - E_USER_DEPRECATED - ); - - parent::__construct($name, $data, $dataName); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Test/AccessibleObject.php b/vendor/friendsofphp/php-cs-fixer/src/Test/AccessibleObject.php deleted file mode 100644 index 3a6c8d4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Test/AccessibleObject.php +++ /dev/null @@ -1,93 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Test; - -/** - * @author Dariusz Rumiński - * - * @deprecated since v2.5. Use "php-cs-fixer/accessible-object" package instead. - */ -final class AccessibleObject -{ - private $object; - private $reflection; - - /** - * @param object $object - */ - public function __construct($object) - { - @trigger_error( - sprintf( - 'The "%s" class is deprecated and will be removed in 3.0 version. Use "php-cs-fixer/accessible-object" package instead.', - __CLASS__ - ), - E_USER_DEPRECATED - ); - - $this->object = $object; - $this->reflection = new \ReflectionClass($object); - } - - public function __call($name, array $arguments) - { - if (!method_exists($this->object, $name)) { - throw new \LogicException(sprintf('Cannot call non existing method %s->%s.', \get_class($this->object), $name)); - } - - $method = $this->reflection->getMethod($name); - $method->setAccessible(true); - - return $method->invokeArgs($this->object, $arguments); - } - - public function __isset($name) - { - try { - $value = $this->{$name}; - } catch (\LogicException $e) { - return false; - } - - return isset($value); - } - - public function __get($name) - { - if (!property_exists($this->object, $name)) { - throw new \LogicException(sprintf('Cannot get non existing property %s->%s.', \get_class($this->object), $name)); - } - - $property = $this->reflection->getProperty($name); - $property->setAccessible(true); - - return $property->getValue($this->object); - } - - public function __set($name, $value) - { - if (!property_exists($this->object, $name)) { - throw new \LogicException(sprintf('Cannot set non existing property %s->%s = %s.', \get_class($this->object), $name, var_export($value, true))); - } - - $property = $this->reflection->getProperty($name); - $property->setAccessible(true); - - $property->setValue($this->object, $value); - } - - public static function create($object) - { - return new self($object); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Test/IntegrationCase.php b/vendor/friendsofphp/php-cs-fixer/src/Test/IntegrationCase.php deleted file mode 100644 index 59cfbce..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Test/IntegrationCase.php +++ /dev/null @@ -1,136 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Test; - -use PhpCsFixer\RuleSet; -use PhpCsFixer\Tests\Test\IntegrationCase as BaseIntegrationCase; - -/** - * @author Dariusz Rumiński - * - * @TODO 3.0 While removing, remove loading `tests/Test` from `autoload` section of `composer.json`. - * - * @deprecated since v2.4 - */ -final class IntegrationCase -{ - /** - * @var BaseIntegrationCase - */ - private $base; - - /** - * @param string $fileName - * @param string $title - * @param string $expectedCode - * @param null|string $inputCode - */ - public function __construct( - $fileName, - $title, - array $settings, - array $requirements, - array $config, - RuleSet $ruleset, - $expectedCode, - $inputCode - ) { - $this->base = new BaseIntegrationCase( - $fileName, - $title, - $settings, - $requirements, - $config, - $ruleset, - $expectedCode, - $inputCode - ); - @trigger_error( - sprintf( - 'The "%s" class is deprecated. You should stop using it, as it will be removed in 3.0 version.', - __CLASS__ - ), - E_USER_DEPRECATED - ); - } - - public function hasInputCode() - { - return $this->base->hasInputCode(); - } - - public function getConfig() - { - return $this->base->getConfig(); - } - - public function getExpectedCode() - { - return $this->base->getExpectedCode(); - } - - public function getFileName() - { - return $this->base->getFileName(); - } - - public function getInputCode() - { - return $this->base->getInputCode(); - } - - public function getRequirement($name) - { - return $this->base->getRequirement($name); - } - - public function getRequirements() - { - return $this->base->getRequirements(); - } - - public function getRuleset() - { - return $this->base->getRuleset(); - } - - public function getSettings() - { - return $this->base->getSettings(); - } - - public function getTitle() - { - return $this->base->getTitle(); - } - - /** - * @return bool - * - * @deprecated since v2.1, on ~2.1 line IntegrationTest check whether different priorities are required is done automatically, this method will be removed on v3.0 - */ - public function shouldCheckPriority() - { - @trigger_error( - sprintf( - 'The "%s" method is deprecated. You should stop using it, as it will be removed in 3.0 version.', - __METHOD__ - ), - E_USER_DEPRECATED - ); - - $settings = $this->base->getSettings(); - - return isset($settings['checkPriority']) ? $settings['checkPriority'] : true; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTransformer.php deleted file mode 100644 index 5cca9a8..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTransformer.php +++ /dev/null @@ -1,42 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer; - -use PhpCsFixer\Utils; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -abstract class AbstractTransformer implements TransformerInterface -{ - /** - * {@inheritdoc} - */ - public function getName() - { - $nameParts = explode('\\', static::class); - $name = substr(end($nameParts), 0, -\strlen('Transformer')); - - return Utils::camelCaseToUnderscore($name); - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - return 0; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php deleted file mode 100644 index 4b747fb..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php +++ /dev/null @@ -1,108 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; - -/** - * @internal - */ -final class ArgumentAnalysis -{ - /** - * The default value of the argument. - * - * @var null|string - */ - private $default; - - /** - * The name of the argument. - * - * @var string - */ - private $name; - - /** - * The index where the name is located in the supplied Tokens object. - * - * @var int - */ - private $nameIndex; - - /** - * The type analysis of the argument. - * - * @var null|TypeAnalysis - */ - private $typeAnalysis; - - /** - * @param string $name - * @param int $nameIndex - * @param null|string $default - */ - public function __construct($name, $nameIndex, $default, TypeAnalysis $typeAnalysis = null) - { - $this->name = $name; - $this->nameIndex = $nameIndex; - $this->default = $default ?: null; - $this->typeAnalysis = $typeAnalysis ?: null; - } - - /** - * @return null|string - */ - public function getDefault() - { - return $this->default; - } - - /** - * @return bool - */ - public function hasDefault() - { - return null !== $this->default; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * @return int - */ - public function getNameIndex() - { - return $this->nameIndex; - } - - /** - * @return null|TypeAnalysis - */ - public function getTypeAnalysis() - { - return $this->typeAnalysis; - } - - /** - * @return bool - */ - public function hasTypeAnalysis() - { - return null !== $this->typeAnalysis; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php deleted file mode 100644 index 4457db7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php +++ /dev/null @@ -1,127 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; - -/** - * @internal - */ -final class NamespaceAnalysis implements StartEndTokenAwareAnalysis -{ - /** - * The fully qualified namespace name. - * - * @var string - */ - private $fullName; - - /** - * The short version of the namespace. - * - * @var string - */ - private $shortName; - - /** - * The start index of the namespace declaration in the analyzed Tokens. - * - * @var int - */ - private $startIndex; - - /** - * The end index of the namespace declaration in the analyzed Tokens. - * - * @var int - */ - private $endIndex; - - /** - * The start index of the scope of the namespace in the analyzed Tokens. - * - * @var int - */ - private $scopeStartIndex; - - /** - * The end index of the scope of the namespace in the analyzed Tokens. - * - * @var int - */ - private $scopeEndIndex; - - /** - * @param string $fullName - * @param string $shortName - * @param int $startIndex - * @param int $endIndex - * @param int $scopeStartIndex - * @param int $scopeEndIndex - */ - public function __construct($fullName, $shortName, $startIndex, $endIndex, $scopeStartIndex, $scopeEndIndex) - { - $this->fullName = $fullName; - $this->shortName = $shortName; - $this->startIndex = $startIndex; - $this->endIndex = $endIndex; - $this->scopeStartIndex = $scopeStartIndex; - $this->scopeEndIndex = $scopeEndIndex; - } - - /** - * @return string - */ - public function getFullName() - { - return $this->fullName; - } - - /** - * @return string - */ - public function getShortName() - { - return $this->shortName; - } - - /** - * @return int - */ - public function getStartIndex() - { - return $this->startIndex; - } - - /** - * @return int - */ - public function getEndIndex() - { - return $this->endIndex; - } - - /** - * @return int - */ - public function getScopeStartIndex() - { - return $this->scopeStartIndex; - } - - /** - * @return int - */ - public function getScopeEndIndex() - { - return $this->scopeEndIndex; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php deleted file mode 100644 index 687aeff..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php +++ /dev/null @@ -1,147 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; - -/** - * @internal - */ -final class NamespaceUseAnalysis implements StartEndTokenAwareAnalysis -{ - const TYPE_CLASS = 1; - const TYPE_FUNCTION = 2; - const TYPE_CONSTANT = 3; - - /** - * The fully qualified use namespace. - * - * @var string - */ - private $fullName; - - /** - * The short version of use namespace or the alias name in case of aliased use statements. - * - * @var string - */ - private $shortName; - - /** - * Is the use statement being aliased? - * - * @var bool - */ - private $isAliased; - - /** - * The start index of the namespace declaration in the analyzed Tokens. - * - * @var int - */ - private $startIndex; - - /** - * The end index of the namespace declaration in the analyzed Tokens. - * - * @var int - */ - private $endIndex; - - /** - * The type of import: class, function or constant. - * - * @var int - */ - private $type; - - /** - * @param string $fullName - * @param string $shortName - * @param bool $isAliased - * @param int $startIndex - * @param int $endIndex - * @param int $type - */ - public function __construct($fullName, $shortName, $isAliased, $startIndex, $endIndex, $type) - { - $this->fullName = $fullName; - $this->shortName = $shortName; - $this->isAliased = $isAliased; - $this->startIndex = $startIndex; - $this->endIndex = $endIndex; - $this->type = $type; - } - - /** - * @return string - */ - public function getFullName() - { - return $this->fullName; - } - - /** - * @return string - */ - public function getShortName() - { - return $this->shortName; - } - - /** - * @return bool - */ - public function isAliased() - { - return $this->isAliased; - } - - /** - * @return int - */ - public function getStartIndex() - { - return $this->startIndex; - } - - /** - * @return int - */ - public function getEndIndex() - { - return $this->endIndex; - } - - /** - * @return bool - */ - public function isClass() - { - return self::TYPE_CLASS === $this->type; - } - - /** - * @return bool - */ - public function isFunction() - { - return self::TYPE_FUNCTION === $this->type; - } - - /** - * @return bool - */ - public function isConstant() - { - return self::TYPE_CONSTANT === $this->type; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php deleted file mode 100644 index 1cadfff..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php +++ /dev/null @@ -1,30 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; - -interface StartEndTokenAwareAnalysis -{ - /** - * The start index of the analyzed subject inside of the Tokens. - * - * @return int - */ - public function getStartIndex(); - - /** - * The end index of the analyzed subject inside of the Tokens. - * - * @return int - */ - public function getEndIndex(); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php deleted file mode 100644 index ed1b927..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php +++ /dev/null @@ -1,125 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; - -/** - * @internal - */ -final class TypeAnalysis implements StartEndTokenAwareAnalysis -{ - /** - * This list contains soft and hard reserved types that can be used or will be used by PHP at some point. - * - * More info: - * - * @see https://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.types - * @see https://php.net/manual/en/reserved.other-reserved-words.php - * @see https://php.net/manual/en/language.pseudo-types.php - * - * @var array - */ - private static $reservedTypes = [ - 'array', - 'bool', - 'callable', - 'int', - 'iterable', - 'float', - 'mixed', - 'numeric', - 'object', - 'resource', - 'self', - 'string', - 'void', - ]; - - /** - * @var string - */ - private $name; - - /** - * @var int - */ - private $startIndex; - - /** - * @var int - */ - private $endIndex; - - /** - * @var bool - */ - private $nullable; - - /** - * @param string $name - * @param int $startIndex - * @param int $endIndex - */ - public function __construct($name, $startIndex, $endIndex) - { - $this->name = $name; - $this->nullable = false; - - if (0 === strpos($name, '?')) { - $this->name = substr($name, 1); - $this->nullable = true; - } - - $this->startIndex = $startIndex; - $this->endIndex = $endIndex; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * @return int - */ - public function getStartIndex() - { - return $this->startIndex; - } - - /** - * @return int - */ - public function getEndIndex() - { - return $this->endIndex; - } - - /** - * @return bool - */ - public function isReservedType() - { - return \in_array($this->name, self::$reservedTypes, true); - } - - /** - * @return bool - */ - public function isNullable() - { - return $this->nullable; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ArgumentsAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ArgumentsAnalyzer.php deleted file mode 100644 index d463e89..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ArgumentsAnalyzer.php +++ /dev/null @@ -1,140 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Analyzer\Analysis\ArgumentAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\TypeAnalysis; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - * @author Vladimir Reznichenko - * - * @internal - */ -final class ArgumentsAnalyzer -{ - /** - * Count amount of parameters in a function/method reference. - * - * @param int $openParenthesis - * @param int $closeParenthesis - * - * @return int - */ - public function countArguments(Tokens $tokens, $openParenthesis, $closeParenthesis) - { - return \count($this->getArguments($tokens, $openParenthesis, $closeParenthesis)); - } - - /** - * Returns start and end token indexes of arguments. - * - * Returns an array with each key being the first token of an - * argument and the value the last. Including non-function tokens - * such as comments and white space tokens, but without the separation - * tokens like '(', ',' and ')'. - * - * @param int $openParenthesis - * @param int $closeParenthesis - * - * @return array - */ - public function getArguments(Tokens $tokens, $openParenthesis, $closeParenthesis) - { - $arguments = []; - $firstSensibleToken = $tokens->getNextMeaningfulToken($openParenthesis); - if ($tokens[$firstSensibleToken]->equals(')')) { - return $arguments; - } - - $paramContentIndex = $openParenthesis + 1; - $argumentsStart = $paramContentIndex; - for (; $paramContentIndex < $closeParenthesis; ++$paramContentIndex) { - $token = $tokens[$paramContentIndex]; - - // skip nested (), [], {} constructs - $blockDefinitionProbe = Tokens::detectBlockType($token); - - if (null !== $blockDefinitionProbe && true === $blockDefinitionProbe['isStart']) { - $paramContentIndex = $tokens->findBlockEnd($blockDefinitionProbe['type'], $paramContentIndex); - - continue; - } - - // if comma matched, increase arguments counter - if ($token->equals(',')) { - if ($tokens->getNextMeaningfulToken($paramContentIndex) === $closeParenthesis) { - break; // trailing ',' in function call (PHP 7.3) - } - - $arguments[$argumentsStart] = $paramContentIndex - 1; - $argumentsStart = $paramContentIndex + 1; - } - } - - $arguments[$argumentsStart] = $paramContentIndex - 1; - - return $arguments; - } - - /** - * @param int $argumentStart - * @param int $argumentEnd - * - * @return ArgumentAnalysis - */ - public function getArgumentInfo(Tokens $tokens, $argumentStart, $argumentEnd) - { - $info = [ - 'default' => null, - 'name' => null, - 'name_index' => null, - 'type' => null, - 'type_index_start' => null, - 'type_index_end' => null, - ]; - - $sawName = false; - for ($index = $argumentStart; $index <= $argumentEnd; ++$index) { - $token = $tokens[$index]; - if ($token->isComment() || $token->isWhitespace() || $token->isGivenKind(T_ELLIPSIS) || $token->equals('&')) { - continue; - } - if ($token->isGivenKind(T_VARIABLE)) { - $sawName = true; - $info['name_index'] = $index; - $info['name'] = $token->getContent(); - - continue; - } - if ($token->equals('=')) { - continue; - } - if ($sawName) { - $info['default'] .= $token->getContent(); - } else { - $info['type_index_start'] = ($info['type_index_start'] > 0) ? $info['type_index_start'] : $index; - $info['type_index_end'] = $index; - $info['type'] .= $token->getContent(); - } - } - - return new ArgumentAnalysis( - $info['name'], - $info['name_index'], - $info['default'], - $info['type'] ? new TypeAnalysis($info['type'], $info['type_index_start'], $info['type_index_end']) : null - ); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php deleted file mode 100644 index 8a1eb91..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php +++ /dev/null @@ -1,67 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - * - * @internal - */ -final class BlocksAnalyzer -{ - /** - * @param null|int $openIndex - * @param null|int $closeIndex - * - * @return bool - */ - public function isBlock(Tokens $tokens, $openIndex, $closeIndex) - { - if (null === $openIndex || null === $closeIndex) { - return false; - } - - if (!$tokens->offsetExists($openIndex)) { - return false; - } - - if (!$tokens->offsetExists($closeIndex)) { - return false; - } - - $blockType = $this->getBlockType($tokens[$openIndex]); - - if (null === $blockType) { - return false; - } - - return $closeIndex === $tokens->findBlockEnd($blockType, $openIndex); - } - - /** - * @return null|int - */ - private function getBlockType(Token $token) - { - foreach (Tokens::getBlockEdgeDefinitions() as $blockType => $definition) { - if ($token->equals($definition['start'])) { - return $blockType; - } - } - - return null; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php deleted file mode 100644 index a374d97..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php +++ /dev/null @@ -1,82 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class ClassyAnalyzer -{ - /** - * @param int $index - * - * @return bool - */ - public function isClassyInvocation(Tokens $tokens, $index) - { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_STRING)) { - throw new \LogicException(sprintf('No T_STRING at given index %d, got %s.', $index, $tokens[$index]->getName())); - } - - if (\in_array(strtolower($token->getContent()), ['bool', 'float', 'int', 'iterable', 'object', 'parent', 'self', 'string', 'void'], true)) { - return false; - } - - $next = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$next]; - - if ($nextToken->isGivenKind(T_NS_SEPARATOR)) { - return false; - } - - if ($nextToken->isGivenKind([T_DOUBLE_COLON, T_ELLIPSIS, CT::T_TYPE_ALTERNATION, T_VARIABLE])) { - return true; - } - - $prev = $tokens->getPrevMeaningfulToken($index); - - while ($tokens[$prev]->isGivenKind([CT::T_NAMESPACE_OPERATOR, T_NS_SEPARATOR, T_STRING])) { - $prev = $tokens->getPrevMeaningfulToken($prev); - } - - $prevToken = $tokens[$prev]; - - if ($prevToken->isGivenKind([T_EXTENDS, T_INSTANCEOF, T_INSTEADOF, T_IMPLEMENTS, T_NEW, CT::T_NULLABLE_TYPE, CT::T_TYPE_ALTERNATION, CT::T_TYPE_COLON, CT::T_USE_TRAIT])) { - return true; - } - - // `Foo & $bar` could be: - // - function reference parameter: function baz(Foo & $bar) {} - // - bit operator: $x = Foo & $bar; - if ($nextToken->equals('&') && $tokens[$tokens->getNextMeaningfulToken($next)]->isGivenKind(T_VARIABLE)) { - $checkIndex = $tokens->getPrevTokenOfKind($prev + 1, [';', '{', '}', [T_FUNCTION], [T_OPEN_TAG], [T_OPEN_TAG_WITH_ECHO]]); - - return $tokens[$checkIndex]->isGivenKind(T_FUNCTION); - } - - if (!$prevToken->equals(',')) { - return false; - } - - do { - $prev = $tokens->getPrevMeaningfulToken($prev); - } while ($tokens[$prev]->equalsAny([',', [T_NS_SEPARATOR], [T_STRING], [CT::T_NAMESPACE_OPERATOR]])); - - return $tokens[$prev]->isGivenKind([T_IMPLEMENTS, CT::T_USE_TRAIT]); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php deleted file mode 100644 index d345f66..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php +++ /dev/null @@ -1,314 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer; - -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - * @author SpacePossum - * - * @internal - */ -final class CommentsAnalyzer -{ - const TYPE_HASH = 1; - const TYPE_DOUBLE_SLASH = 2; - const TYPE_SLASH_ASTERISK = 3; - - /** - * @param int $index - * - * @return bool - */ - public function isHeaderComment(Tokens $tokens, $index) - { - if (!$tokens[$index]->isGivenKind([T_COMMENT, T_DOC_COMMENT])) { - throw new \InvalidArgumentException('Given index must point to a comment.'); - } - - if (null === $tokens->getNextMeaningfulToken($index)) { - return false; - } - - $prevIndex = $tokens->getPrevNonWhitespace($index); - - if ($tokens[$prevIndex]->equals(';')) { - $braceCloseIndex = $tokens->getPrevMeaningfulToken($prevIndex); - if (!$tokens[$braceCloseIndex]->equals(')')) { - return false; - } - - $braceOpenIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $braceCloseIndex); - $declareIndex = $tokens->getPrevMeaningfulToken($braceOpenIndex); - if (!$tokens[$declareIndex]->isGivenKind(T_DECLARE)) { - return false; - } - - $prevIndex = $tokens->getPrevNonWhitespace($declareIndex); - } - - return $tokens[$prevIndex]->isGivenKind(T_OPEN_TAG); - } - - /** - * Check if comment at given index precedes structural element. - * - * @see https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc.md#3-definitions - * - * @param int $index - * - * @return bool - */ - public function isBeforeStructuralElement(Tokens $tokens, $index) - { - $token = $tokens[$index]; - - if (!$token->isGivenKind([T_COMMENT, T_DOC_COMMENT])) { - throw new \InvalidArgumentException('Given index must point to a comment.'); - } - - $nextIndex = $index; - do { - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - } while (null !== $nextIndex && $tokens[$nextIndex]->equals('(')); - - if (null === $nextIndex || $tokens[$nextIndex]->equals('}')) { - return false; - } - - $nextToken = $tokens[$nextIndex]; - - if ($this->isStructuralElement($nextToken)) { - return true; - } - - if ($this->isValidControl($tokens, $token, $nextIndex)) { - return true; - } - - if ($this->isValidVariable($tokens, $nextIndex)) { - return true; - } - - if ($this->isValidLanguageConstruct($tokens, $token, $nextIndex)) { - return true; - } - - return false; - } - - /** - * Return array of indices that are part of a comment started at given index. - * - * @param int $index T_COMMENT index - * - * @return null|array - */ - public function getCommentBlockIndices(Tokens $tokens, $index) - { - if (!$tokens[$index]->isGivenKind(T_COMMENT)) { - throw new \InvalidArgumentException('Given index must point to a comment.'); - } - - $commentType = $this->getCommentType($tokens[$index]->getContent()); - $indices = [$index]; - - if (self::TYPE_SLASH_ASTERISK === $commentType) { - return $indices; - } - - $count = \count($tokens); - ++$index; - - for (; $index < $count; ++$index) { - if ($tokens[$index]->isComment()) { - if ($commentType === $this->getCommentType($tokens[$index]->getContent())) { - $indices[] = $index; - - continue; - } - - break; - } - - if (!$tokens[$index]->isWhitespace() || $this->getLineBreakCount($tokens, $index, $index + 1) > 1) { - break; - } - } - - return $indices; - } - - /** - * @see https://github.com/phpDocumentor/fig-standards/blob/master/proposed/phpdoc.md#3-definitions - * - * @return bool - */ - private function isStructuralElement(Token $token) - { - static $skip = [ - T_PRIVATE, - T_PROTECTED, - T_PUBLIC, - T_VAR, - T_FUNCTION, - T_ABSTRACT, - T_CONST, - T_NAMESPACE, - T_REQUIRE, - T_REQUIRE_ONCE, - T_INCLUDE, - T_INCLUDE_ONCE, - T_FINAL, - T_STATIC, - ]; - - return $token->isClassy() || $token->isGivenKind($skip); - } - - /** - * Checks control structures (for, foreach, if, switch, while) for correct docblock usage. - * - * @param Token $docsToken docs Token - * @param int $controlIndex index of control structure Token - * - * @return bool - */ - private function isValidControl(Tokens $tokens, Token $docsToken, $controlIndex) - { - static $controlStructures = [ - T_FOR, - T_FOREACH, - T_IF, - T_SWITCH, - T_WHILE, - ]; - - if (!$tokens[$controlIndex]->isGivenKind($controlStructures)) { - return false; - } - - $index = $tokens->getNextMeaningfulToken($controlIndex); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - $docsContent = $docsToken->getContent(); - - for ($index = $index + 1; $index < $endIndex; ++$index) { - $token = $tokens[$index]; - - if ( - $token->isGivenKind(T_VARIABLE) && - false !== strpos($docsContent, $token->getContent()) - ) { - return true; - } - } - - return false; - } - - /** - * Checks variable assignments through `list()`, `print()` etc. calls for correct docblock usage. - * - * @param Token $docsToken docs Token - * @param int $languageConstructIndex index of variable Token - * - * @return bool - */ - private function isValidLanguageConstruct(Tokens $tokens, Token $docsToken, $languageConstructIndex) - { - static $languageStructures = [ - T_LIST, - T_PRINT, - T_ECHO, - CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, - ]; - - if (!$tokens[$languageConstructIndex]->isGivenKind($languageStructures)) { - return false; - } - - $endKind = $tokens[$languageConstructIndex]->isGivenKind(CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN) - ? [CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE] - : ')'; - - $endIndex = $tokens->getNextTokenOfKind($languageConstructIndex, [$endKind]); - - $docsContent = $docsToken->getContent(); - - for ($index = $languageConstructIndex + 1; $index < $endIndex; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_VARIABLE) && false !== strpos($docsContent, $token->getContent())) { - return true; - } - } - - return false; - } - - /** - * Checks variable assignments for correct docblock usage. - * - * @param int $index index of variable Token - * - * @return bool - */ - private function isValidVariable(Tokens $tokens, $index) - { - if (!$tokens[$index]->isGivenKind(T_VARIABLE)) { - return false; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - - return $tokens[$nextIndex]->equals('='); - } - - /** - * @param string $content - * - * @return int - */ - private function getCommentType($content) - { - if ('#' === $content[0]) { - return self::TYPE_HASH; - } - - if ('*' === $content[1]) { - return self::TYPE_SLASH_ASTERISK; - } - - return self::TYPE_DOUBLE_SLASH; - } - - /** - * @param int $whiteStart - * @param int $whiteEnd - * - * @return int - */ - private function getLineBreakCount(Tokens $tokens, $whiteStart, $whiteEnd) - { - $lineCount = 0; - for ($i = $whiteStart; $i < $whiteEnd; ++$i) { - $lineCount += Preg::matchAll('/\R/u', $tokens[$i]->getContent()); - } - - return $lineCount; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php deleted file mode 100644 index 463e452..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php +++ /dev/null @@ -1,262 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Analyzer\Analysis\ArgumentAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\TypeAnalysis; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class FunctionsAnalyzer -{ - /** - * @var array - */ - private $functionsAnalysis = ['tokens' => '', 'imports' => [], 'declarations' => []]; - - /** - * Important: risky because of the limited (file) scope of the tool. - * - * @param int $index - * - * @return bool - */ - public function isGlobalFunctionCall(Tokens $tokens, $index) - { - if (!$tokens[$index]->isGivenKind(T_STRING)) { - return false; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$nextIndex]->equals('(')) { - return false; - } - - $previousIsNamespaceSeparator = false; - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $previousIsNamespaceSeparator = true; - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - } - - if ($tokens[$prevIndex]->isGivenKind([T_DOUBLE_COLON, T_FUNCTION, CT::T_NAMESPACE_OPERATOR, T_NEW, T_OBJECT_OPERATOR, CT::T_RETURN_REF, T_STRING])) { - return false; - } - - if ($previousIsNamespaceSeparator) { - return true; - } - - if ($tokens->isChanged() || $tokens->getCodeHash() !== $this->functionsAnalysis['tokens']) { - $this->buildFunctionsAnalysis($tokens); - } - - // figure out in which namespace we are - $namespaceAnalyzer = new NamespacesAnalyzer(); - - $declarations = $namespaceAnalyzer->getDeclarations($tokens); - $scopeStartIndex = 0; - $scopeEndIndex = \count($tokens) - 1; - $inGlobalNamespace = false; - - foreach ($declarations as $declaration) { - $scopeStartIndex = $declaration->getScopeStartIndex(); - $scopeEndIndex = $declaration->getScopeEndIndex(); - - if ($index >= $scopeStartIndex && $index <= $scopeEndIndex) { - $inGlobalNamespace = '' === $declaration->getFullName(); - - break; - } - } - - $call = strtolower($tokens[$index]->getContent()); - - // check if the call is to a function declared in the same namespace as the call is done, - // if the call is already in the global namespace than declared functions are in the same - // global namespace and don't need checking - - if (!$inGlobalNamespace) { - /** @var int $functionNameIndex */ - foreach ($this->functionsAnalysis['declarations'] as $functionNameIndex) { - if ($functionNameIndex < $scopeStartIndex || $functionNameIndex > $scopeEndIndex) { - continue; - } - - if (strtolower($tokens[$functionNameIndex]->getContent()) === $call) { - return false; - } - } - } - - /** @var NamespaceUseAnalysis $functionUse */ - foreach ($this->functionsAnalysis['imports'] as $functionUse) { - if ($functionUse->getStartIndex() < $scopeStartIndex || $functionUse->getEndIndex() > $scopeEndIndex) { - continue; - } - - if ($call !== strtolower($functionUse->getShortName())) { - continue; - } - - // global import like `use function \str_repeat;` - return $functionUse->getShortName() === ltrim($functionUse->getFullName(), '\\'); - } - - return true; - } - - /** - * @param int $methodIndex - * - * @return ArgumentAnalysis[] - */ - public function getFunctionArguments(Tokens $tokens, $methodIndex) - { - $argumentsStart = $tokens->getNextTokenOfKind($methodIndex, ['(']); - $argumentsEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $argumentsStart); - $argumentAnalyzer = new ArgumentsAnalyzer(); - $arguments = []; - - foreach ($argumentAnalyzer->getArguments($tokens, $argumentsStart, $argumentsEnd) as $start => $end) { - $argumentInfo = $argumentAnalyzer->getArgumentInfo($tokens, $start, $end); - $arguments[$argumentInfo->getName()] = $argumentInfo; - } - - return $arguments; - } - - /** - * @param int $methodIndex - * - * @return null|TypeAnalysis - */ - public function getFunctionReturnType(Tokens $tokens, $methodIndex) - { - $argumentsStart = $tokens->getNextTokenOfKind($methodIndex, ['(']); - $argumentsEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $argumentsStart); - $typeColonIndex = $tokens->getNextMeaningfulToken($argumentsEnd); - if (':' !== $tokens[$typeColonIndex]->getContent()) { - return null; - } - - $type = ''; - $typeStartIndex = $tokens->getNextMeaningfulToken($typeColonIndex); - $typeEndIndex = $typeStartIndex; - $functionBodyStart = $tokens->getNextTokenOfKind($typeColonIndex, ['{', ';', [T_DOUBLE_ARROW]]); - for ($i = $typeStartIndex; $i < $functionBodyStart; ++$i) { - if ($tokens[$i]->isWhitespace() || $tokens[$i]->isComment()) { - continue; - } - - $type .= $tokens[$i]->getContent(); - $typeEndIndex = $i; - } - - return new TypeAnalysis($type, $typeStartIndex, $typeEndIndex); - } - - /** - * @param int $index - * - * @return bool - */ - public function isTheSameClassCall(Tokens $tokens, $index) - { - if (!$tokens->offsetExists($index)) { - return false; - } - - $operatorIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens->offsetExists($operatorIndex)) { - return false; - } - - $referenceIndex = $tokens->getPrevMeaningfulToken($operatorIndex); - if (!$tokens->offsetExists($referenceIndex)) { - return false; - } - - return $tokens[$operatorIndex]->equals([T_OBJECT_OPERATOR, '->']) && $tokens[$referenceIndex]->equals([T_VARIABLE, '$this'], false) - || $tokens[$operatorIndex]->equals([T_DOUBLE_COLON, '::']) && $tokens[$referenceIndex]->equals([T_STRING, 'self'], false) - || $tokens[$operatorIndex]->equals([T_DOUBLE_COLON, '::']) && $tokens[$referenceIndex]->equals([T_STATIC, 'static'], false); - } - - private function buildFunctionsAnalysis(Tokens $tokens) - { - $this->functionsAnalysis = [ - 'tokens' => $tokens->getCodeHash(), - 'imports' => [], - 'declarations' => [], - ]; - - // find declarations - - if ($tokens->isTokenKindFound(T_FUNCTION)) { - $end = \count($tokens); - - for ($i = 0; $i < $end; ++$i) { - // skip classy, we are looking for functions not methods - if ($tokens[$i]->isGivenKind(Token::getClassyTokenKinds())) { - $i = $tokens->getNextTokenOfKind($i, ['(', '{']); - - if ($tokens[$i]->equals('(')) { // anonymous class - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $i); - $i = $tokens->getNextTokenOfKind($i, ['{']); - } - - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $i); - - continue; - } - - if (!$tokens[$i]->isGivenKind(T_FUNCTION)) { - continue; - } - - $i = $tokens->getNextMeaningfulToken($i); - - if ($tokens[$i]->isGivenKind(CT::T_RETURN_REF)) { - $i = $tokens->getNextMeaningfulToken($i); - } - - if (!$tokens[$i]->isGivenKind(T_STRING)) { - continue; - } - - $this->functionsAnalysis['declarations'][] = $i; - } - } - - // find imported functions - - $namespaceUsesAnalyzer = new NamespaceUsesAnalyzer(); - - if ($tokens->isTokenKindFound(CT::T_FUNCTION_IMPORT)) { - $declarations = $namespaceUsesAnalyzer->getDeclarationsFromTokens($tokens); - - foreach ($declarations as $declaration) { - if ($declaration->isFunction()) { - $this->functionsAnalysis['imports'][] = $declaration; - } - } - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php deleted file mode 100644 index 3149f11..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php +++ /dev/null @@ -1,105 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @internal - */ -final class NamespaceUsesAnalyzer -{ - /** - * @return NamespaceUseAnalysis[] - */ - public function getDeclarationsFromTokens(Tokens $tokens) - { - $tokenAnalyzer = new TokensAnalyzer($tokens); - $useIndexes = $tokenAnalyzer->getImportUseIndexes(); - - return $this->getDeclarations($tokens, $useIndexes); - } - - /** - * @return NamespaceUseAnalysis[] - */ - private function getDeclarations(Tokens $tokens, array $useIndexes) - { - $uses = []; - - foreach ($useIndexes as $index) { - $endIndex = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); - $analysis = $this->parseDeclaration($tokens, $index, $endIndex); - if ($analysis) { - $uses[] = $analysis; - } - } - - return $uses; - } - - /** - * @param int $startIndex - * @param int $endIndex - * - * @return null|NamespaceUseAnalysis - */ - private function parseDeclaration(Tokens $tokens, $startIndex, $endIndex) - { - $fullName = $shortName = ''; - $aliased = false; - - $type = NamespaceUseAnalysis::TYPE_CLASS; - for ($i = $startIndex; $i <= $endIndex; ++$i) { - $token = $tokens[$i]; - if ($token->equals(',') || $token->isGivenKind(CT::T_GROUP_IMPORT_BRACE_CLOSE)) { - // do not touch group use declarations until the logic of this is added (for example: `use some\a\{ClassD};`) - // ignore multiple use statements that should be split into few separate statements (for example: `use BarB, BarC as C;`) - return null; - } - - if ($token->isGivenKind(CT::T_FUNCTION_IMPORT)) { - $type = NamespaceUseAnalysis::TYPE_FUNCTION; - } elseif ($token->isGivenKind(CT::T_CONST_IMPORT)) { - $type = NamespaceUseAnalysis::TYPE_CONSTANT; - } - - if ($token->isWhitespace() || $token->isComment() || $token->isGivenKind(T_USE)) { - continue; - } - - if ($token->isGivenKind(T_STRING)) { - $shortName = $token->getContent(); - if (!$aliased) { - $fullName .= $shortName; - } - } elseif ($token->isGivenKind(T_NS_SEPARATOR)) { - $fullName .= $token->getContent(); - } elseif ($token->isGivenKind(T_AS)) { - $aliased = true; - } - } - - return new NamespaceUseAnalysis( - trim($fullName), - $shortName, - $aliased, - $startIndex, - $endIndex, - $type - ); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php deleted file mode 100644 index 36fd714..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php +++ /dev/null @@ -1,71 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class NamespacesAnalyzer -{ - /** - * @return NamespaceAnalysis[] - */ - public function getDeclarations(Tokens $tokens) - { - $namespaces = []; - - for ($index = 1, $count = \count($tokens); $index < $count; ++$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_NAMESPACE)) { - continue; - } - - $declarationEndIndex = $tokens->getNextTokenOfKind($index, [';', '{']); - $namespace = trim($tokens->generatePartialCode($index + 1, $declarationEndIndex - 1)); - $declarationParts = explode('\\', $namespace); - $shortName = end($declarationParts); - - if ($tokens[$declarationEndIndex]->equals('{')) { - $scopeEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $declarationEndIndex); - } else { - $scopeEndIndex = $tokens->getNextTokenOfKind($declarationEndIndex, [[T_NAMESPACE]]); - if (null === $scopeEndIndex) { - $scopeEndIndex = \count($tokens); - } - --$scopeEndIndex; - } - - $namespaces[] = new NamespaceAnalysis( - $namespace, - $shortName, - $index, - $declarationEndIndex, - $index, - $scopeEndIndex - ); - - // Continue the analysis after the end of this namespace to find the next one - $index = $scopeEndIndex; - } - - if (0 === \count($namespaces)) { - $namespaces[] = new NamespaceAnalysis('', '', 0, 0, 0, \count($tokens) - 1); - } - - return $namespaces; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php deleted file mode 100644 index 05a28c6..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php +++ /dev/null @@ -1,95 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer; - -/** - * @author Dariusz Rumiński - */ -final class CT -{ - const T_ARRAY_INDEX_CURLY_BRACE_CLOSE = 10001; - const T_ARRAY_INDEX_CURLY_BRACE_OPEN = 10002; - const T_ARRAY_SQUARE_BRACE_CLOSE = 10003; - const T_ARRAY_SQUARE_BRACE_OPEN = 10004; - const T_ARRAY_TYPEHINT = 10005; - const T_BRACE_CLASS_INSTANTIATION_CLOSE = 10006; - const T_BRACE_CLASS_INSTANTIATION_OPEN = 10007; - const T_CLASS_CONSTANT = 10008; - const T_CONST_IMPORT = 10009; - const T_CURLY_CLOSE = 10010; - const T_DESTRUCTURING_SQUARE_BRACE_CLOSE = 10011; - const T_DESTRUCTURING_SQUARE_BRACE_OPEN = 10012; - const T_DOLLAR_CLOSE_CURLY_BRACES = 10013; - const T_DYNAMIC_PROP_BRACE_CLOSE = 10014; - const T_DYNAMIC_PROP_BRACE_OPEN = 10015; - const T_DYNAMIC_VAR_BRACE_CLOSE = 10016; - const T_DYNAMIC_VAR_BRACE_OPEN = 10017; - const T_FUNCTION_IMPORT = 10018; - const T_GROUP_IMPORT_BRACE_CLOSE = 10019; - const T_GROUP_IMPORT_BRACE_OPEN = 10020; - const T_NAMESPACE_OPERATOR = 10021; - const T_NULLABLE_TYPE = 10022; - const T_RETURN_REF = 10023; - const T_TYPE_ALTERNATION = 10024; - const T_TYPE_COLON = 10025; - const T_USE_LAMBDA = 10026; - const T_USE_TRAIT = 10027; - - private function __construct() - { - } - - /** - * Get name for custom token. - * - * @param int $value custom token value - * - * @return string - */ - public static function getName($value) - { - if (!self::has($value)) { - throw new \InvalidArgumentException(sprintf('No custom token was found for "%s".', $value)); - } - - $tokens = self::getMapById(); - - return 'CT::'.$tokens[$value]; - } - - /** - * Check if given custom token exists. - * - * @param int $value custom token value - * - * @return bool - */ - public static function has($value) - { - $tokens = self::getMapById(); - - return isset($tokens[$value]); - } - - private static function getMapById() - { - static $constants; - - if (null === $constants) { - $reflection = new \ReflectionClass(__CLASS__); - $constants = array_flip($reflection->getConstants()); - } - - return $constants; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php deleted file mode 100644 index 27683c1..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php +++ /dev/null @@ -1,38 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class CodeHasher -{ - private function __construct() - { - // cannot create instance of util. class - } - - /** - * Calculate hash for code. - * - * @param string $code - * - * @return string - */ - public static function calculateCodeHash($code) - { - return (string) crc32($code); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Generator/NamespacedStringTokenGenerator.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Generator/NamespacedStringTokenGenerator.php deleted file mode 100644 index aeb50c4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Generator/NamespacedStringTokenGenerator.php +++ /dev/null @@ -1,43 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Generator; - -use PhpCsFixer\Tokenizer\Token; - -/** - * @internal - */ -final class NamespacedStringTokenGenerator -{ - /** - * Parse a string that contains a namespace into tokens. - * - * @param string $input - * - * @return Token[] - */ - public function generate($input) - { - $tokens = []; - $parts = explode('\\', $input); - - foreach ($parts as $index => $part) { - $tokens[] = new Token([T_STRING, $part]); - if ($index !== \count($parts) - 1) { - $tokens[] = new Token([T_NS_SEPARATOR, '\\']); - } - } - - return $tokens; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Resolver/TypeShortNameResolver.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Resolver/TypeShortNameResolver.php deleted file mode 100644 index 65bbd0e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Resolver/TypeShortNameResolver.php +++ /dev/null @@ -1,94 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Resolver; - -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class TypeShortNameResolver -{ - /** - * This method will resolve the shortName of a FQCN if possible or otherwise return the inserted type name. - * E.g.: use Foo\Bar => "Bar". - * - * @param string $typeName - * - * @return string - */ - public function resolve(Tokens $tokens, $typeName) - { - // First match explicit imports: - $useMap = $this->getUseMapFromTokens($tokens); - foreach ($useMap as $shortName => $fullName) { - $regex = '/^\\\\?'.preg_quote($fullName, '/').'$/'; - if (Preg::match($regex, $typeName)) { - return $shortName; - } - } - - // Next try to match (partial) classes inside the same namespace - // For now only support one namespace per file: - $namespaces = $this->getNamespacesFromTokens($tokens); - if (1 === \count($namespaces)) { - foreach ($namespaces as $fullName) { - $matches = []; - $regex = '/^\\\\?'.preg_quote($fullName, '/').'\\\\(?P.+)$/'; - if (Preg::match($regex, $typeName, $matches)) { - return $matches['className']; - } - } - } - - // Next: Try to match partial use statements: - - foreach ($useMap as $shortName => $fullName) { - $matches = []; - $regex = '/^\\\\?'.preg_quote($fullName, '/').'\\\\(?P.+)$/'; - if (Preg::match($regex, $typeName, $matches)) { - return $shortName.'\\'.$matches['className']; - } - } - - return $typeName; - } - - /** - * @return array A list of all FQN namespaces in the file with the short name as key - */ - private function getNamespacesFromTokens(Tokens $tokens) - { - return array_map(static function (NamespaceAnalysis $info) { - return $info->getFullName(); - }, (new NamespacesAnalyzer())->getDeclarations($tokens)); - } - - /** - * @return array A list of all FQN use statements in the file with the short name as key - */ - private function getUseMapFromTokens(Tokens $tokens) - { - $map = []; - - foreach ((new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens) as $useDeclaration) { - $map[$useDeclaration->getShortName()] = $useDeclaration->getFullName(); - } - - return $map; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php deleted file mode 100644 index 8fdf4fe..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php +++ /dev/null @@ -1,618 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer; - -use PhpCsFixer\Utils; - -/** - * Representation of single token. - * As a token prototype you should understand a single element generated by token_get_all. - * - * @author Dariusz Rumiński - */ -class Token -{ - /** - * Content of token prototype. - * - * @var string - */ - private $content; - - /** - * ID of token prototype, if available. - * - * @var null|int - */ - private $id; - - /** - * If token prototype is an array. - * - * @var bool - */ - private $isArray; - - /** - * Flag is token was changed. - * - * @var bool - */ - private $changed = false; - - /** - * @param array|string $token token prototype - */ - public function __construct($token) - { - if (\is_array($token)) { - if (!\is_int($token[0])) { - throw new \InvalidArgumentException(sprintf( - 'Id must be an int, got "%s".', - \is_object($token[0]) ? \get_class($token[0]) : \gettype($token[0]) - )); - } - - if (!\is_string($token[1])) { - throw new \InvalidArgumentException(sprintf( - 'Content must be a string, got "%s".', - \is_object($token[1]) ? \get_class($token[1]) : \gettype($token[1]) - )); - } - - if ('' === $token[1]) { - throw new \InvalidArgumentException('Cannot set empty content for id-based Token.'); - } - - $this->isArray = true; - $this->id = $token[0]; - $this->content = $token[1]; - - if ($token[0] && '' === $token[1]) { - throw new \InvalidArgumentException('Cannot set empty content for id-based Token.'); - } - } elseif (\is_string($token)) { - $this->isArray = false; - $this->content = $token; - } else { - throw new \InvalidArgumentException(sprintf( - 'Cannot recognize input value as valid Token prototype, got "%s".', - \is_object($token) ? \get_class($token) : \gettype($token) - )); - } - } - - /** - * @return int[] - */ - public static function getCastTokenKinds() - { - static $castTokens = [T_ARRAY_CAST, T_BOOL_CAST, T_DOUBLE_CAST, T_INT_CAST, T_OBJECT_CAST, T_STRING_CAST, T_UNSET_CAST]; - - return $castTokens; - } - - /** - * Get classy tokens kinds: T_CLASS, T_INTERFACE and T_TRAIT. - * - * @return int[] - */ - public static function getClassyTokenKinds() - { - static $classTokens = [T_CLASS, T_TRAIT, T_INTERFACE]; - - return $classTokens; - } - - /** - * Clear token at given index. - * - * Clearing means override token by empty string. - * - * @deprecated since 2.4 - */ - public function clear() - { - @trigger_error(__METHOD__.' is deprecated and will be removed in 3.0.', E_USER_DEPRECATED); - Tokens::setLegacyMode(true); - - $this->content = ''; - $this->id = null; - $this->isArray = false; - } - - /** - * Clear internal flag if token was changed. - * - * @deprecated since 2.4 - */ - public function clearChanged() - { - @trigger_error(__METHOD__.' is deprecated and will be removed in 3.0.', E_USER_DEPRECATED); - Tokens::setLegacyMode(true); - - $this->changed = false; - } - - /** - * Check if token is equals to given one. - * - * If tokens are arrays, then only keys defined in parameter token are checked. - * - * @param array|string|Token $other token or it's prototype - * @param bool $caseSensitive perform a case sensitive comparison - * - * @return bool - */ - public function equals($other, $caseSensitive = true) - { - if ($other instanceof self) { - // Inlined getPrototype() on this very hot path. - // We access the private properties of $other directly to save function call overhead. - // This is only possible because $other is of the same class as `self`. - if (!$other->isArray) { - $otherPrototype = $other->content; - } else { - $otherPrototype = [ - $other->id, - $other->content, - ]; - } - } else { - $otherPrototype = $other; - } - - if ($this->isArray !== \is_array($otherPrototype)) { - return false; - } - - if (!$this->isArray) { - return $this->content === $otherPrototype; - } - - if ($this->id !== $otherPrototype[0]) { - return false; - } - - if (isset($otherPrototype[1])) { - if ($caseSensitive) { - if ($this->content !== $otherPrototype[1]) { - return false; - } - } elseif (0 !== strcasecmp($this->content, $otherPrototype[1])) { - return false; - } - } - - // detect unknown keys - unset($otherPrototype[0], $otherPrototype[1]); - - return empty($otherPrototype); - } - - /** - * Check if token is equals to one of given. - * - * @param array $others array of tokens or token prototypes - * @param bool $caseSensitive perform a case sensitive comparison - * - * @return bool - */ - public function equalsAny(array $others, $caseSensitive = true) - { - foreach ($others as $other) { - if ($this->equals($other, $caseSensitive)) { - return true; - } - } - - return false; - } - - /** - * A helper method used to find out whether or not a certain input token has to be case-sensitively matched. - * - * @param array|bool $caseSensitive global case sensitiveness or an array of booleans, whose keys should match - * the ones used in $others. If any is missing, the default case-sensitive - * comparison is used - * @param int $key the key of the token that has to be looked up - * - * @return bool - */ - public static function isKeyCaseSensitive($caseSensitive, $key) - { - if (\is_array($caseSensitive)) { - return isset($caseSensitive[$key]) ? $caseSensitive[$key] : true; - } - - return $caseSensitive; - } - - /** - * @return array|string token prototype - */ - public function getPrototype() - { - if (!$this->isArray) { - return $this->content; - } - - return [ - $this->id, - $this->content, - ]; - } - - /** - * Get token's content. - * - * It shall be used only for getting the content of token, not for checking it against excepted value. - * - * @return string - */ - public function getContent() - { - return $this->content; - } - - /** - * Get token's id. - * - * It shall be used only for getting the internal id of token, not for checking it against excepted value. - * - * @return null|int - */ - public function getId() - { - return $this->id; - } - - /** - * Get token's name. - * - * It shall be used only for getting the name of token, not for checking it against excepted value. - * - * @return null|string token name - */ - public function getName() - { - if (null === $this->id) { - return null; - } - - return self::getNameForId($this->id); - } - - /** - * Get token's name. - * - * It shall be used only for getting the name of token, not for checking it against excepted value. - * - * @param int $id - * - * @return null|string token name - */ - public static function getNameForId($id) - { - if (CT::has($id)) { - return CT::getName($id); - } - - $name = token_name($id); - - return 'UNKNOWN' === $name ? null : $name; - } - - /** - * Generate array containing all keywords that exists in PHP version in use. - * - * @return array - */ - public static function getKeywords() - { - static $keywords = null; - - if (null === $keywords) { - $keywords = self::getTokenKindsForNames(['T_ABSTRACT', 'T_ARRAY', 'T_AS', 'T_BREAK', 'T_CALLABLE', 'T_CASE', - 'T_CATCH', 'T_CLASS', 'T_CLONE', 'T_CONST', 'T_CONTINUE', 'T_DECLARE', 'T_DEFAULT', 'T_DO', - 'T_ECHO', 'T_ELSE', 'T_ELSEIF', 'T_EMPTY', 'T_ENDDECLARE', 'T_ENDFOR', 'T_ENDFOREACH', - 'T_ENDIF', 'T_ENDSWITCH', 'T_ENDWHILE', 'T_EVAL', 'T_EXIT', 'T_EXTENDS', 'T_FINAL', - 'T_FINALLY', 'T_FN', 'T_FOR', 'T_FOREACH', 'T_FUNCTION', 'T_GLOBAL', 'T_GOTO', 'T_HALT_COMPILER', - 'T_IF', 'T_IMPLEMENTS', 'T_INCLUDE', 'T_INCLUDE_ONCE', 'T_INSTANCEOF', 'T_INSTEADOF', - 'T_INTERFACE', 'T_ISSET', 'T_LIST', 'T_LOGICAL_AND', 'T_LOGICAL_OR', 'T_LOGICAL_XOR', - 'T_NAMESPACE', 'T_NEW', 'T_PRINT', 'T_PRIVATE', 'T_PROTECTED', 'T_PUBLIC', 'T_REQUIRE', - 'T_REQUIRE_ONCE', 'T_RETURN', 'T_STATIC', 'T_SWITCH', 'T_THROW', 'T_TRAIT', 'T_TRY', - 'T_UNSET', 'T_USE', 'T_VAR', 'T_WHILE', 'T_YIELD', 'T_YIELD_FROM', - ]) + [ - CT::T_ARRAY_TYPEHINT => CT::T_ARRAY_TYPEHINT, - CT::T_CLASS_CONSTANT => CT::T_CLASS_CONSTANT, - CT::T_CONST_IMPORT => CT::T_CONST_IMPORT, - CT::T_FUNCTION_IMPORT => CT::T_FUNCTION_IMPORT, - CT::T_NAMESPACE_OPERATOR => CT::T_NAMESPACE_OPERATOR, - CT::T_USE_TRAIT => CT::T_USE_TRAIT, - CT::T_USE_LAMBDA => CT::T_USE_LAMBDA, - ]; - } - - return $keywords; - } - - /** - * Generate array containing all predefined constants that exists in PHP version in use. - * - * @see https://php.net/manual/en/language.constants.predefined.php - * - * @return array - */ - public static function getMagicConstants() - { - static $magicConstants = null; - - if (null === $magicConstants) { - $magicConstants = self::getTokenKindsForNames(['T_CLASS_C', 'T_DIR', 'T_FILE', 'T_FUNC_C', 'T_LINE', 'T_METHOD_C', 'T_NS_C', 'T_TRAIT_C']); - } - - return $magicConstants; - } - - /** - * Check if token prototype is an array. - * - * @return bool is array - */ - public function isArray() - { - return $this->isArray; - } - - /** - * Check if token is one of type cast tokens. - * - * @return bool - */ - public function isCast() - { - return $this->isGivenKind(self::getCastTokenKinds()); - } - - /** - * Check if token was changed. - * - * @return bool - * - * @deprecated since 2.4 - */ - public function isChanged() - { - @trigger_error(__METHOD__.' is deprecated and will be removed in 3.0.', E_USER_DEPRECATED); - - return $this->changed; - } - - /** - * Check if token is one of classy tokens: T_CLASS, T_INTERFACE or T_TRAIT. - * - * @return bool - */ - public function isClassy() - { - return $this->isGivenKind(self::getClassyTokenKinds()); - } - - /** - * Check if token is one of comment tokens: T_COMMENT or T_DOC_COMMENT. - * - * @return bool - */ - public function isComment() - { - static $commentTokens = [T_COMMENT, T_DOC_COMMENT]; - - return $this->isGivenKind($commentTokens); - } - - /** - * Check if token is empty, e.g. because of clearing. - * - * @return bool - * - * @deprecated since 2.4 - */ - public function isEmpty() - { - @trigger_error(__METHOD__.' is deprecated and will be removed in 3.0.', E_USER_DEPRECATED); - - return null === $this->id && ('' === $this->content || null === $this->content); - } - - /** - * Check if token is one of given kind. - * - * @param int|int[] $possibleKind kind or array of kinds - * - * @return bool - */ - public function isGivenKind($possibleKind) - { - return $this->isArray && (\is_array($possibleKind) ? \in_array($this->id, $possibleKind, true) : $this->id === $possibleKind); - } - - /** - * Check if token is a keyword. - * - * @return bool - */ - public function isKeyword() - { - $keywords = static::getKeywords(); - - return $this->isArray && isset($keywords[$this->id]); - } - - /** - * Check if token is a native PHP constant: true, false or null. - * - * @return bool - */ - public function isNativeConstant() - { - static $nativeConstantStrings = ['true', 'false', 'null']; - - return $this->isArray && \in_array(strtolower($this->content), $nativeConstantStrings, true); - } - - /** - * Returns if the token is of a Magic constants type. - * - * @see https://php.net/manual/en/language.constants.predefined.php - * - * @return bool - */ - public function isMagicConstant() - { - $magicConstants = static::getMagicConstants(); - - return $this->isArray && isset($magicConstants[$this->id]); - } - - /** - * Check if token is whitespace. - * - * @param null|string $whitespaces whitespace characters, default is " \t\n\r\0\x0B" - * - * @return bool - */ - public function isWhitespace($whitespaces = " \t\n\r\0\x0B") - { - if (null === $whitespaces) { - $whitespaces = " \t\n\r\0\x0B"; - } - - if ($this->isArray && !$this->isGivenKind(T_WHITESPACE)) { - return false; - } - - return '' === trim($this->content, $whitespaces); - } - - /** - * Override token. - * - * If called on Token inside Tokens collection please use `Tokens::overrideAt` instead. - * - * @param array|string|Token $other token prototype - * - * @deprecated since 2.4 - */ - public function override($other) - { - @trigger_error(__METHOD__.' is deprecated and will be removed in 3.0.', E_USER_DEPRECATED); - Tokens::setLegacyMode(true); - - $prototype = $other instanceof self ? $other->getPrototype() : $other; - - if ($this->equals($prototype)) { - return; - } - - $this->changed = true; - - if (\is_array($prototype)) { - $this->isArray = true; - $this->id = $prototype[0]; - $this->content = $prototype[1]; - - return; - } - - $this->isArray = false; - $this->id = null; - $this->content = $prototype; - } - - /** - * @param string $content - * - * @deprecated since 2.4 - */ - public function setContent($content) - { - @trigger_error(__METHOD__.' is deprecated and will be removed in 3.0.', E_USER_DEPRECATED); - Tokens::setLegacyMode(true); - - if ($this->content === $content) { - return; - } - - $this->changed = true; - $this->content = $content; - - // setting empty content is clearing the token - if ('' === $content) { - @trigger_error(__METHOD__.' shall not be used to clear token, use Tokens::clearAt instead.', E_USER_DEPRECATED); - $this->id = null; - $this->isArray = false; - } - } - - public function toArray() - { - return [ - 'id' => $this->id, - 'name' => $this->getName(), - 'content' => $this->content, - 'isArray' => $this->isArray, - 'changed' => $this->changed, - ]; - } - - /** - * @param null|string[] $options JSON encode option - * - * @return string - */ - public function toJson(array $options = null) - { - static $defaultOptions = null; - - if (null === $options) { - if (null === $defaultOptions) { - $defaultOptions = Utils::calculateBitmask(['JSON_PRETTY_PRINT', 'JSON_NUMERIC_CHECK']); - } - - $options = $defaultOptions; - } else { - $options = Utils::calculateBitmask($options); - } - - return json_encode($this->toArray(), $options); - } - - /** - * @param string[] $tokenNames - * - * @return array - */ - private static function getTokenKindsForNames(array $tokenNames) - { - $keywords = []; - foreach ($tokenNames as $keywordName) { - if (\defined($keywordName)) { - $keyword = \constant($keywordName); - $keywords[$keyword] = $keyword; - } - } - - return $keywords; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php deleted file mode 100644 index 61d4d44..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php +++ /dev/null @@ -1,1453 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer; - -use PhpCsFixer\Preg; -use PhpCsFixer\Utils; - -/** - * Collection of code tokens. - * - * Its role is to provide the ability to manage collection and navigate through it. - * - * As a token prototype you should understand a single element generated by token_get_all. - * - * @author Dariusz Rumiński - * - * @extends \SplFixedArray - */ -class Tokens extends \SplFixedArray -{ - const BLOCK_TYPE_PARENTHESIS_BRACE = 1; - const BLOCK_TYPE_CURLY_BRACE = 2; - const BLOCK_TYPE_INDEX_SQUARE_BRACE = 3; - const BLOCK_TYPE_ARRAY_SQUARE_BRACE = 4; - const BLOCK_TYPE_DYNAMIC_PROP_BRACE = 5; - const BLOCK_TYPE_DYNAMIC_VAR_BRACE = 6; - const BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE = 7; - const BLOCK_TYPE_GROUP_IMPORT_BRACE = 8; - const BLOCK_TYPE_DESTRUCTURING_SQUARE_BRACE = 9; - const BLOCK_TYPE_BRACE_CLASS_INSTANTIATION = 10; - - /** - * Static class cache. - * - * @var array - */ - private static $cache = []; - - /** - * Cache of block edges. Any change in collection will invalidate it. - * - * @var array - */ - private $blockEndCache = []; - - /** - * crc32 hash of code string. - * - * @var string - */ - private $codeHash; - - /** - * Flag is collection was changed. - * - * It doesn't know about change of collection's items. To check it run `isChanged` method. - * - * @var bool - */ - private $changed = false; - - /** - * Set of found token kinds. - * - * When the token kind is present in this set it means that given token kind - * was ever seen inside the collection (but may not be part of it any longer). - * The key is token kind and the value is always true. - * - * @var array - */ - private $foundTokenKinds = []; - - /** - * @var bool - * - * @todo remove at 3.0 - */ - private static $isLegacyMode = false; - - /** - * Clone tokens collection. - */ - public function __clone() - { - foreach ($this as $key => $val) { - $this[$key] = clone $val; - } - } - - /** - * @return bool - * - * @internal - * - * @todo remove at 3.0 - */ - public static function isLegacyMode() - { - return self::$isLegacyMode; - } - - /** - * @param bool $isLegacy - * - * @internal - * - * @todo remove at 3.0 - */ - public static function setLegacyMode($isLegacy) - { - if (getenv('PHP_CS_FIXER_FUTURE_MODE') && $isLegacy) { - throw new \RuntimeException('Cannot enable `legacy mode` when using `future mode`. This check was performed as `PHP_CS_FIXER_FUTURE_MODE` env var is set.'); - } - - self::$isLegacyMode = $isLegacy; - } - - /** - * Clear cache - one position or all of them. - * - * @param null|string $key position to clear, when null clear all - */ - public static function clearCache($key = null) - { - if (null === $key) { - self::$cache = []; - - return; - } - - if (self::hasCache($key)) { - unset(self::$cache[$key]); - } - } - - /** - * Detect type of block. - * - * @param Token $token token - * - * @return null|array array with 'type' and 'isStart' keys or null if not found - */ - public static function detectBlockType(Token $token) - { - foreach (self::getBlockEdgeDefinitions() as $type => $definition) { - if ($token->equals($definition['start'])) { - return ['type' => $type, 'isStart' => true]; - } - - if ($token->equals($definition['end'])) { - return ['type' => $type, 'isStart' => false]; - } - } - - return null; - } - - /** - * Create token collection from array. - * - * @param Token[] $array the array to import - * @param bool $saveIndexes save the numeric indexes used in the original array, default is yes - * - * @return Tokens - */ - public static function fromArray($array, $saveIndexes = null) - { - $tokens = new self(\count($array)); - - if (null === $saveIndexes || $saveIndexes) { - foreach ($array as $key => $val) { - $tokens[$key] = $val; - } - } else { - $index = 0; - - foreach ($array as $val) { - $tokens[$index++] = $val; - } - } - - $tokens->generateCode(); // regenerate code to calculate code hash - - return $tokens; - } - - /** - * Create token collection directly from code. - * - * @param string $code PHP code - * - * @return Tokens - */ - public static function fromCode($code) - { - $codeHash = self::calculateCodeHash($code); - - if (self::hasCache($codeHash)) { - $tokens = self::getCache($codeHash); - - // generate the code to recalculate the hash - $tokens->generateCode(); - - if ($codeHash === $tokens->codeHash) { - $tokens->clearEmptyTokens(); - $tokens->clearChanged(); - - return $tokens; - } - } - - $tokens = new self(); - $tokens->setCode($code); - $tokens->clearChanged(); - - return $tokens; - } - - /** - * @return array - */ - public static function getBlockEdgeDefinitions() - { - return [ - self::BLOCK_TYPE_CURLY_BRACE => [ - 'start' => '{', - 'end' => '}', - ], - self::BLOCK_TYPE_PARENTHESIS_BRACE => [ - 'start' => '(', - 'end' => ')', - ], - self::BLOCK_TYPE_INDEX_SQUARE_BRACE => [ - 'start' => '[', - 'end' => ']', - ], - self::BLOCK_TYPE_ARRAY_SQUARE_BRACE => [ - 'start' => [CT::T_ARRAY_SQUARE_BRACE_OPEN, '['], - 'end' => [CT::T_ARRAY_SQUARE_BRACE_CLOSE, ']'], - ], - self::BLOCK_TYPE_DYNAMIC_PROP_BRACE => [ - 'start' => [CT::T_DYNAMIC_PROP_BRACE_OPEN, '{'], - 'end' => [CT::T_DYNAMIC_PROP_BRACE_CLOSE, '}'], - ], - self::BLOCK_TYPE_DYNAMIC_VAR_BRACE => [ - 'start' => [CT::T_DYNAMIC_VAR_BRACE_OPEN, '{'], - 'end' => [CT::T_DYNAMIC_VAR_BRACE_CLOSE, '}'], - ], - self::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE => [ - 'start' => [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN, '{'], - 'end' => [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE, '}'], - ], - self::BLOCK_TYPE_GROUP_IMPORT_BRACE => [ - 'start' => [CT::T_GROUP_IMPORT_BRACE_OPEN, '{'], - 'end' => [CT::T_GROUP_IMPORT_BRACE_CLOSE, '}'], - ], - self::BLOCK_TYPE_DESTRUCTURING_SQUARE_BRACE => [ - 'start' => [CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, '['], - 'end' => [CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE, ']'], - ], - self::BLOCK_TYPE_BRACE_CLASS_INSTANTIATION => [ - 'start' => [CT::T_BRACE_CLASS_INSTANTIATION_OPEN, '('], - 'end' => [CT::T_BRACE_CLASS_INSTANTIATION_CLOSE, ')'], - ], - ]; - } - - /** - * Set new size of collection. - * - * @param int $size - */ - public function setSize($size) - { - if ($this->getSize() !== $size) { - $this->changed = true; - parent::setSize($size); - } - } - - /** - * Unset collection item. - * - * @param int $index - */ - public function offsetUnset($index) - { - $this->changed = true; - $this->unregisterFoundToken($this[$index]); - parent::offsetUnset($index); - } - - /** - * Set collection item. - * - * Warning! `$newval` must not be typehinted to be compatible with `ArrayAccess::offsetSet` method. - * - * @param int $index - * @param Token $newval - */ - public function offsetSet($index, $newval) - { - $this->blockEndCache = []; - - if (!isset($this[$index]) || !$this[$index]->equals($newval)) { - $this->changed = true; - - if (isset($this[$index])) { - $this->unregisterFoundToken($this[$index]); - } - - $this->registerFoundToken($newval); - } - - parent::offsetSet($index, $newval); - } - - /** - * Clear internal flag if collection was changed and flag for all collection's items. - */ - public function clearChanged() - { - $this->changed = false; - - if (self::isLegacyMode()) { - foreach ($this as $token) { - $token->clearChanged(); - } - } - } - - /** - * Clear empty tokens. - * - * Empty tokens can occur e.g. after calling clear on item of collection. - */ - public function clearEmptyTokens() - { - $limit = $this->count(); - $index = 0; - - for (; $index < $limit; ++$index) { - if ($this->isEmptyAt($index)) { - break; - } - } - - // no empty token found, therefore there is no need to override collection - if ($limit === $index) { - return; - } - - for ($count = $index; $index < $limit; ++$index) { - if (!$this->isEmptyAt($index)) { - /** @var Token $token */ - $token = $this[$index]; - $this[$count++] = $token; - } - } - - $this->setSize($count); - } - - /** - * Ensure that on given index is a whitespace with given kind. - * - * If there is a whitespace then it's content will be modified. - * If not - the new Token will be added. - * - * @param int $index index - * @param int $indexOffset index offset for Token insertion - * @param string $whitespace whitespace to set - * - * @return bool if new Token was added - */ - public function ensureWhitespaceAtIndex($index, $indexOffset, $whitespace) - { - $removeLastCommentLine = static function (self $tokens, $index, $indexOffset, $whitespace) { - $token = $tokens[$index]; - - if (1 === $indexOffset && $token->isGivenKind(T_OPEN_TAG)) { - if (0 === strpos($whitespace, "\r\n")) { - $tokens[$index] = new Token([T_OPEN_TAG, rtrim($token->getContent())."\r\n"]); - - return \strlen($whitespace) > 2 // can be removed on PHP 7; https://php.net/manual/en/function.substr.php - ? substr($whitespace, 2) - : '' - ; - } - - $tokens[$index] = new Token([T_OPEN_TAG, rtrim($token->getContent()).$whitespace[0]]); - - return \strlen($whitespace) > 1 // can be removed on PHP 7; https://php.net/manual/en/function.substr.php - ? substr($whitespace, 1) - : '' - ; - } - - return $whitespace; - }; - - if ($this[$index]->isWhitespace()) { - $whitespace = $removeLastCommentLine($this, $index - 1, $indexOffset, $whitespace); - - if ('' === $whitespace) { - $this->clearAt($index); - } else { - $this[$index] = new Token([T_WHITESPACE, $whitespace]); - } - - return false; - } - - $whitespace = $removeLastCommentLine($this, $index, $indexOffset, $whitespace); - if ('' === $whitespace) { - return false; - } - - $this->insertAt( - $index + $indexOffset, - [ - new Token([T_WHITESPACE, $whitespace]), - ] - ); - - return true; - } - - /** - * @param int $type type of block, one of BLOCK_TYPE_* - * @param int $searchIndex index of opening brace - * @param bool $findEnd if method should find block's end, default true, otherwise method find block's start - * - * @return int index of closing brace - */ - public function findBlockEnd($type, $searchIndex, $findEnd = true) - { - if (3 === \func_num_args()) { - if ($findEnd) { - @trigger_error('Argument #3 of Tokens::findBlockEnd is deprecated and will be removed in 3.0, you can safely drop the argument.', E_USER_DEPRECATED); - } else { - @trigger_error('Argument #3 of Tokens::findBlockEnd is deprecated and will be removed in 3.0, use Tokens::findBlockStart instead.', E_USER_DEPRECATED); - } - } - - return $this->findOppositeBlockEdge($type, $searchIndex, $findEnd); - } - - /** - * @param int $type type of block, one of BLOCK_TYPE_* - * @param int $searchIndex index of closing brace - * - * @return int index of opening brace - */ - public function findBlockStart($type, $searchIndex) - { - return $this->findOppositeBlockEdge($type, $searchIndex, false); - } - - /** - * @param array|int $possibleKind kind or array of kind - * @param int $start optional offset - * @param null|int $end optional limit - * - * @return array array of tokens of given kinds or assoc array of arrays - */ - public function findGivenKind($possibleKind, $start = 0, $end = null) - { - $this->rewind(); - if (null === $end) { - $end = $this->count(); - } - - $elements = []; - $possibleKinds = (array) $possibleKind; - - foreach ($possibleKinds as $kind) { - $elements[$kind] = []; - } - - if (!self::isLegacyMode()) { - $possibleKinds = array_filter($possibleKinds, function ($kind) { - return $this->isTokenKindFound($kind); - }); - } - - if (\count($possibleKinds)) { - for ($i = $start; $i < $end; ++$i) { - $token = $this[$i]; - if ($token->isGivenKind($possibleKinds)) { - $elements[$token->getId()][$i] = $token; - } - } - } - - return \is_array($possibleKind) ? $elements : $elements[$possibleKind]; - } - - /** - * @return string - */ - public function generateCode() - { - $code = $this->generatePartialCode(0, \count($this) - 1); - $this->changeCodeHash(self::calculateCodeHash($code)); - - return $code; - } - - /** - * Generate code from tokens between given indexes. - * - * @param int $start start index - * @param int $end end index - * - * @return string - */ - public function generatePartialCode($start, $end) - { - $code = ''; - - for ($i = $start; $i <= $end; ++$i) { - $code .= $this[$i]->getContent(); - } - - return $code; - } - - /** - * Get hash of code. - * - * @return string - */ - public function getCodeHash() - { - return $this->codeHash; - } - - /** - * Get index for closest next token which is non whitespace. - * - * This method is shorthand for getNonWhitespaceSibling method. - * - * @param int $index token index - * @param null|string $whitespaces whitespaces characters for Token::isWhitespace - * - * @return null|int - */ - public function getNextNonWhitespace($index, $whitespaces = null) - { - return $this->getNonWhitespaceSibling($index, 1, $whitespaces); - } - - /** - * Get index for closest next token of given kind. - * - * This method is shorthand for getTokenOfKindSibling method. - * - * @param int $index token index - * @param array $tokens possible tokens - * @param bool $caseSensitive perform a case sensitive comparison - * - * @return null|int - */ - public function getNextTokenOfKind($index, array $tokens = [], $caseSensitive = true) - { - return $this->getTokenOfKindSibling($index, 1, $tokens, $caseSensitive); - } - - /** - * Get index for closest sibling token which is non whitespace. - * - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - * @param null|string $whitespaces whitespaces characters for Token::isWhitespace - * - * @return null|int - */ - public function getNonWhitespaceSibling($index, $direction, $whitespaces = null) - { - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - return null; - } - - $token = $this[$index]; - - if (!$token->isWhitespace($whitespaces)) { - return $index; - } - } - } - - /** - * Get index for closest previous token which is non whitespace. - * - * This method is shorthand for getNonWhitespaceSibling method. - * - * @param int $index token index - * @param null|string $whitespaces whitespaces characters for Token::isWhitespace - * - * @return null|int - */ - public function getPrevNonWhitespace($index, $whitespaces = null) - { - return $this->getNonWhitespaceSibling($index, -1, $whitespaces); - } - - /** - * Get index for closest previous token of given kind. - * This method is shorthand for getTokenOfKindSibling method. - * - * @param int $index token index - * @param array $tokens possible tokens - * @param bool $caseSensitive perform a case sensitive comparison - * - * @return null|int - */ - public function getPrevTokenOfKind($index, array $tokens = [], $caseSensitive = true) - { - return $this->getTokenOfKindSibling($index, -1, $tokens, $caseSensitive); - } - - /** - * Get index for closest sibling token of given kind. - * - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - * @param array $tokens possible tokens - * @param bool $caseSensitive perform a case sensitive comparison - * - * @return null|int - */ - public function getTokenOfKindSibling($index, $direction, array $tokens = [], $caseSensitive = true) - { - if (!self::isLegacyMode()) { - $tokens = array_filter($tokens, function ($token) { - return $this->isTokenKindFound($this->extractTokenKind($token)); - }); - } - - if (!\count($tokens)) { - return null; - } - - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - return null; - } - - $token = $this[$index]; - - if ($token->equalsAny($tokens, $caseSensitive)) { - return $index; - } - } - } - - /** - * Get index for closest sibling token not of given kind. - * - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - * @param array $tokens possible tokens - * - * @return null|int - */ - public function getTokenNotOfKindSibling($index, $direction, array $tokens = []) - { - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - return null; - } - - if ($this->isEmptyAt($index)) { - continue; - } - - if ($this[$index]->equalsAny($tokens)) { - continue; - } - - return $index; - } - } - - /** - * Get index for closest sibling token that is not a whitespace or comment. - * - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - * - * @return null|int - */ - public function getMeaningfulTokenSibling($index, $direction) - { - return $this->getTokenNotOfKindSibling( - $index, - $direction, - [[T_WHITESPACE], [T_COMMENT], [T_DOC_COMMENT]] - ); - } - - /** - * Get index for closest sibling token which is not empty. - * - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - * - * @return null|int - */ - public function getNonEmptySibling($index, $direction) - { - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - return null; - } - - if (!$this->isEmptyAt($index)) { - return $index; - } - } - } - - /** - * Get index for closest next token that is not a whitespace or comment. - * - * @param int $index token index - * - * @return null|int - */ - public function getNextMeaningfulToken($index) - { - return $this->getMeaningfulTokenSibling($index, 1); - } - - /** - * Get index for closest previous token that is not a whitespace or comment. - * - * @param int $index token index - * - * @return null|int - */ - public function getPrevMeaningfulToken($index) - { - return $this->getMeaningfulTokenSibling($index, -1); - } - - /** - * Find a sequence of meaningful tokens and returns the array of their locations. - * - * @param array $sequence an array of tokens (kinds) (same format used by getNextTokenOfKind) - * @param int $start start index, defaulting to the start of the file - * @param int $end end index, defaulting to the end of the file - * @param array|bool $caseSensitive global case sensitiveness or an array of booleans, whose keys should match - * the ones used in $others. If any is missing, the default case-sensitive - * comparison is used - * - * @return null|array an array containing the tokens matching the sequence elements, indexed by their position - */ - public function findSequence(array $sequence, $start = 0, $end = null, $caseSensitive = true) - { - $sequenceCount = \count($sequence); - if (0 === $sequenceCount) { - throw new \InvalidArgumentException('Invalid sequence.'); - } - - // $end defaults to the end of the collection - $end = null === $end ? \count($this) - 1 : min($end, \count($this) - 1); - - if ($start + $sequenceCount - 1 > $end) { - return null; - } - - // make sure the sequence content is "meaningful" - foreach ($sequence as $key => $token) { - // if not a Token instance already, we convert it to verify the meaningfulness - if (!$token instanceof Token) { - if (\is_array($token) && !isset($token[1])) { - // fake some content as it is required by the Token constructor, - // although optional for search purposes - $token[1] = 'DUMMY'; - } - $token = new Token($token); - } - - if ($token->isWhitespace() || $token->isComment() || '' === $token->getContent()) { - throw new \InvalidArgumentException(sprintf('Non-meaningful token at position: "%s".', $key)); - } - } - - if (!self::isLegacyMode()) { - foreach ($sequence as $token) { - if (!$this->isTokenKindFound($this->extractTokenKind($token))) { - return null; - } - } - } - - // remove the first token from the sequence, so we can freely iterate through the sequence after a match to - // the first one is found - $key = key($sequence); - $firstCs = Token::isKeyCaseSensitive($caseSensitive, $key); - $firstToken = $sequence[$key]; - unset($sequence[$key]); - - // begin searching for the first token in the sequence (start included) - $index = $start - 1; - while (null !== $index && $index <= $end) { - $index = $this->getNextTokenOfKind($index, [$firstToken], $firstCs); - - // ensure we found a match and didn't get past the end index - if (null === $index || $index > $end) { - return null; - } - - // initialise the result array with the current index - $result = [$index => $this[$index]]; - - // advance cursor to the current position - $currIdx = $index; - - // iterate through the remaining tokens in the sequence - foreach ($sequence as $key => $token) { - $currIdx = $this->getNextMeaningfulToken($currIdx); - - // ensure we didn't go too far - if (null === $currIdx || $currIdx > $end) { - return null; - } - - if (!$this[$currIdx]->equals($token, Token::isKeyCaseSensitive($caseSensitive, $key))) { - // not a match, restart the outer loop - continue 2; - } - - // append index to the result array - $result[$currIdx] = $this[$currIdx]; - } - - // do we have a complete match? - // hint: $result is bigger than $sequence since the first token has been removed from the latter - if (\count($sequence) < \count($result)) { - return $result; - } - } - - return null; - } - - /** - * Insert instances of Token inside collection. - * - * @param int $index start inserting index - * @param array|Token|Tokens $items instances of Token to insert - */ - public function insertAt($index, $items) - { - $items = \is_array($items) || $items instanceof self ? $items : [$items]; - $itemsCnt = \count($items); - - if (0 === $itemsCnt) { - return; - } - - $oldSize = \count($this); - $this->changed = true; - $this->blockEndCache = []; - $this->setSize($oldSize + $itemsCnt); - - // since we only move already existing items around, we directly call into SplFixedArray::offset* methods. - // that way we get around additional overhead this class adds with overridden offset* methods. - for ($i = $oldSize + $itemsCnt - 1; $i >= $index; --$i) { - $oldItem = parent::offsetExists($i - $itemsCnt) ? parent::offsetGet($i - $itemsCnt) : new Token(''); - parent::offsetSet($i, $oldItem); - } - - for ($i = 0; $i < $itemsCnt; ++$i) { - if ('' === $items[$i]->getContent()) { - throw new \InvalidArgumentException('Must not add empty token to collection.'); - } - - $this->registerFoundToken($items[$i]); - parent::offsetSet($i + $index, $items[$i]); - } - } - - /** - * Check if collection was change: collection itself (like insert new tokens) or any of collection's elements. - * - * @return bool - */ - public function isChanged() - { - if ($this->changed) { - return true; - } - - if (self::isLegacyMode()) { - foreach ($this as $token) { - if ($token->isChanged()) { - return true; - } - } - } - - return false; - } - - /** - * @param int $index - * - * @return bool - */ - public function isEmptyAt($index) - { - $token = $this[$index]; - - return null === $token->getId() && '' === $token->getContent(); - } - - public function clearAt($index) - { - $this[$index] = new Token(''); - } - - /** - * Override token at given index and register it. - * - * @param int $index - * @param array|string|Token $token token prototype - * - * @deprecated since 2.4, use offsetSet instead - */ - public function overrideAt($index, $token) - { - @trigger_error(__METHOD__.' is deprecated and will be removed in 3.0, use offsetSet instead.', E_USER_DEPRECATED); - self::$isLegacyMode = true; - - $this[$index]->override($token); - $this->registerFoundToken($token); - } - - /** - * Override tokens at given range. - * - * @param int $indexStart start overriding index - * @param int $indexEnd end overriding index - * @param array|Tokens $items tokens to insert - */ - public function overrideRange($indexStart, $indexEnd, $items) - { - $oldCode = $this->generatePartialCode($indexStart, $indexEnd); - - $newCode = ''; - foreach ($items as $item) { - $newCode .= $item->getContent(); - } - - // no changes, return - if ($oldCode === $newCode) { - return; - } - - $indexToChange = $indexEnd - $indexStart + 1; - $itemsCount = \count($items); - - // If we want to add more items than passed range contains we need to - // add placeholders for overhead items. - if ($itemsCount > $indexToChange) { - $placeholders = []; - while ($itemsCount > $indexToChange) { - $placeholders[] = new Token('__PLACEHOLDER__'); - ++$indexToChange; - } - $this->insertAt($indexEnd + 1, $placeholders); - } - - // Override each items. - foreach ($items as $itemIndex => $item) { - $this[$indexStart + $itemIndex] = $item; - } - - // If we want to add less tokens than passed range contains then clear - // not needed tokens. - if ($itemsCount < $indexToChange) { - $this->clearRange($indexStart + $itemsCount, $indexEnd); - } - } - - /** - * @param int $index - * @param null|string $whitespaces optional whitespaces characters for Token::isWhitespace - */ - public function removeLeadingWhitespace($index, $whitespaces = null) - { - $this->removeWhitespaceSafely($index, -1, $whitespaces); - } - - /** - * @param int $index - * @param null|string $whitespaces optional whitespaces characters for Token::isWhitespace - */ - public function removeTrailingWhitespace($index, $whitespaces = null) - { - $this->removeWhitespaceSafely($index, 1, $whitespaces); - } - - /** - * Set code. Clear all current content and replace it by new Token items generated from code directly. - * - * @param string $code PHP code - */ - public function setCode($code) - { - // No need to work when the code is the same. - // That is how we avoid a lot of work and setting changed flag. - if ($code === $this->generateCode()) { - return; - } - - // clear memory - $this->setSize(0); - - $tokens = \defined('TOKEN_PARSE') - ? token_get_all($code, TOKEN_PARSE) - : token_get_all($code); - - $this->setSize(\count($tokens)); - - foreach ($tokens as $index => $token) { - $this[$index] = new Token($token); - } - - $transformers = Transformers::create(); - $transformers->transform($this); - - $this->foundTokenKinds = []; - foreach ($this as $token) { - $this->registerFoundToken($token); - } - - $this->rewind(); - $this->changeCodeHash(self::calculateCodeHash($code)); - $this->changed = true; - } - - public function toJson() - { - static $options = null; - - if (null === $options) { - $options = Utils::calculateBitmask(['JSON_PRETTY_PRINT', 'JSON_NUMERIC_CHECK']); - } - - $output = new \SplFixedArray(\count($this)); - - foreach ($this as $index => $token) { - $output[$index] = $token->toArray(); - } - - $this->rewind(); - - return json_encode($output, $options); - } - - /** - * Check if all token kinds given as argument are found. - * - * @return bool - */ - public function isAllTokenKindsFound(array $tokenKinds) - { - foreach ($tokenKinds as $tokenKind) { - if (empty($this->foundTokenKinds[$tokenKind])) { - return false; - } - } - - return true; - } - - /** - * Check if any token kind given as argument is found. - * - * @return bool - */ - public function isAnyTokenKindsFound(array $tokenKinds) - { - foreach ($tokenKinds as $tokenKind) { - if (!empty($this->foundTokenKinds[$tokenKind])) { - return true; - } - } - - return false; - } - - /** - * Check if token kind given as argument is found. - * - * @param int|string $tokenKind - * - * @return bool - */ - public function isTokenKindFound($tokenKind) - { - return !empty($this->foundTokenKinds[$tokenKind]); - } - - /** - * @param int|string $tokenKind - * - * @return int - */ - public function countTokenKind($tokenKind) - { - if (self::isLegacyMode()) { - throw new \RuntimeException(sprintf('"%s" is not available in legacy mode.', __METHOD__)); - } - - return isset($this->foundTokenKinds[$tokenKind]) ? $this->foundTokenKinds[$tokenKind] : 0; - } - - /** - * Clear tokens in the given range. - * - * @param int $indexStart - * @param int $indexEnd - */ - public function clearRange($indexStart, $indexEnd) - { - for ($i = $indexStart; $i <= $indexEnd; ++$i) { - $this->clearAt($i); - } - } - - /** - * Checks for monolithic PHP code. - * - * Checks that the code is pure PHP code, in a single code block, starting - * with an open tag. - * - * @return bool - */ - public function isMonolithicPhp() - { - $size = $this->count(); - - if (0 === $size) { - return false; - } - - if (self::isLegacyMode()) { - // If code is not monolithic there is a great chance that first or last token is `T_INLINE_HTML`: - if ($this[0]->isGivenKind(T_INLINE_HTML) || $this[$size - 1]->isGivenKind(T_INLINE_HTML)) { - return false; - } - - for ($index = 1; $index < $size; ++$index) { - if ($this[$index]->isGivenKind([T_INLINE_HTML, T_OPEN_TAG, T_OPEN_TAG_WITH_ECHO])) { - return false; - } - } - - return true; - } - - if ($this->isTokenKindFound(T_INLINE_HTML)) { - return false; - } - - return 1 >= ($this->countTokenKind(T_OPEN_TAG) + $this->countTokenKind(T_OPEN_TAG_WITH_ECHO)); - } - - /** - * @param int $start start index - * @param int $end end index - * - * @return bool - */ - public function isPartialCodeMultiline($start, $end) - { - for ($i = $start; $i <= $end; ++$i) { - if (false !== strpos($this[$i]->getContent(), "\n")) { - return true; - } - } - - return false; - } - - /** - * @param int $index - */ - public function clearTokenAndMergeSurroundingWhitespace($index) - { - $count = \count($this); - $this->clearAt($index); - - if ($index === $count - 1) { - return; - } - - $nextIndex = $this->getNonEmptySibling($index, 1); - - if (null === $nextIndex || !$this[$nextIndex]->isWhitespace()) { - return; - } - - $prevIndex = $this->getNonEmptySibling($index, -1); - - if ($this[$prevIndex]->isWhitespace()) { - $this[$prevIndex] = new Token([T_WHITESPACE, $this[$prevIndex]->getContent().$this[$nextIndex]->getContent()]); - } elseif ($this->isEmptyAt($prevIndex + 1)) { - $this[$prevIndex + 1] = new Token([T_WHITESPACE, $this[$nextIndex]->getContent()]); - } - - $this->clearAt($nextIndex); - } - - private function removeWhitespaceSafely($index, $direction, $whitespaces = null) - { - $whitespaceIndex = $this->getNonEmptySibling($index, $direction); - if (isset($this[$whitespaceIndex]) && $this[$whitespaceIndex]->isWhitespace()) { - $newContent = ''; - $tokenToCheck = $this[$whitespaceIndex]; - - // if the token candidate to remove is preceded by single line comment we do not consider the new line after this comment as part of T_WHITESPACE - if (isset($this[$whitespaceIndex - 1]) && $this[$whitespaceIndex - 1]->isComment() && '/*' !== substr($this[$whitespaceIndex - 1]->getContent(), 0, 2)) { - list($emptyString, $newContent, $whitespacesToCheck) = Preg::split('/^(\R)/', $this[$whitespaceIndex]->getContent(), -1, PREG_SPLIT_DELIM_CAPTURE); - if ('' === $whitespacesToCheck) { - return; - } - $tokenToCheck = new Token([T_WHITESPACE, $whitespacesToCheck]); - } - - if (!$tokenToCheck->isWhitespace($whitespaces)) { - return; - } - - if ('' === $newContent) { - $this->clearAt($whitespaceIndex); - } else { - $this[$whitespaceIndex] = new Token([T_WHITESPACE, $newContent]); - } - } - } - - /** - * @param int $type type of block, one of BLOCK_TYPE_* - * @param int $searchIndex index of starting brace - * @param bool $findEnd if method should find block's end or start - * - * @return int index of opposite brace - */ - private function findOppositeBlockEdge($type, $searchIndex, $findEnd) - { - $blockEdgeDefinitions = self::getBlockEdgeDefinitions(); - - if (!isset($blockEdgeDefinitions[$type])) { - throw new \InvalidArgumentException(sprintf('Invalid param type: "%s".', $type)); - } - - if (!self::isLegacyMode() && isset($this->blockEndCache[$searchIndex])) { - return $this->blockEndCache[$searchIndex]; - } - - $startEdge = $blockEdgeDefinitions[$type]['start']; - $endEdge = $blockEdgeDefinitions[$type]['end']; - $startIndex = $searchIndex; - $endIndex = $this->count() - 1; - $indexOffset = 1; - - if (!$findEnd) { - list($startEdge, $endEdge) = [$endEdge, $startEdge]; - $indexOffset = -1; - $endIndex = 0; - } - - if (!$this[$startIndex]->equals($startEdge)) { - throw new \InvalidArgumentException(sprintf('Invalid param $startIndex - not a proper block "%s".', $findEnd ? 'start' : 'end')); - } - - $blockLevel = 0; - - for ($index = $startIndex; $index !== $endIndex; $index += $indexOffset) { - $token = $this[$index]; - - if ($token->equals($startEdge)) { - ++$blockLevel; - - continue; - } - - if ($token->equals($endEdge)) { - --$blockLevel; - - if (0 === $blockLevel) { - break; - } - - continue; - } - } - - if (!$this[$index]->equals($endEdge)) { - throw new \UnexpectedValueException(sprintf('Missing block "%s".', $findEnd ? 'end' : 'start')); - } - - $this->blockEndCache[$startIndex] = $index; - $this->blockEndCache[$index] = $startIndex; - - return $index; - } - - /** - * Calculate hash for code. - * - * @param string $code - * - * @return string - */ - private static function calculateCodeHash($code) - { - return CodeHasher::calculateCodeHash($code); - } - - /** - * Get cache value for given key. - * - * @param string $key item key - * - * @return Tokens - */ - private static function getCache($key) - { - if (!self::hasCache($key)) { - throw new \OutOfBoundsException(sprintf('Unknown cache key: "%s".', $key)); - } - - return self::$cache[$key]; - } - - /** - * Check if given key exists in cache. - * - * @param string $key item key - * - * @return bool - */ - private static function hasCache($key) - { - return isset(self::$cache[$key]); - } - - /** - * @param string $key item key - * @param Tokens $value item value - */ - private static function setCache($key, self $value) - { - self::$cache[$key] = $value; - } - - /** - * Change code hash. - * - * Remove old cache and set new one. - * - * @param string $codeHash new code hash - */ - private function changeCodeHash($codeHash) - { - if (null !== $this->codeHash) { - self::clearCache($this->codeHash); - } - - $this->codeHash = $codeHash; - self::setCache($this->codeHash, $this); - } - - /** - * Register token as found. - * - * @param array|string|Token $token token prototype - */ - private function registerFoundToken($token) - { - // inlined extractTokenKind() call on the hot path - $tokenKind = $token instanceof Token - ? ($token->isArray() ? $token->getId() : $token->getContent()) - : (\is_array($token) ? $token[0] : $token) - ; - - if (!isset($this->foundTokenKinds[$tokenKind])) { - $this->foundTokenKinds[$tokenKind] = 0; - } - - ++$this->foundTokenKinds[$tokenKind]; - } - - /** - * Register token as found. - * - * @param array|string|Token $token token prototype - */ - private function unregisterFoundToken($token) - { - // inlined extractTokenKind() call on the hot path - $tokenKind = $token instanceof Token - ? ($token->isArray() ? $token->getId() : $token->getContent()) - : (\is_array($token) ? $token[0] : $token) - ; - - if (!isset($this->foundTokenKinds[$tokenKind])) { - return; - } - - --$this->foundTokenKinds[$tokenKind]; - } - - /** - * @param array|string|Token $token token prototype - * - * @return int|string - */ - private function extractTokenKind($token) - { - return $token instanceof Token - ? ($token->isArray() ? $token->getId() : $token->getContent()) - : (\is_array($token) ? $token[0] : $token) - ; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php deleted file mode 100644 index 4b04acb..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php +++ /dev/null @@ -1,743 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer; - -/** - * Analyzer of Tokens collection. - * - * Its role is to provide the ability to analyze collection. - * - * @author Dariusz Rumiński - * @author Gregor Harlan - * @author SpacePossum - * - * @internal - */ -final class TokensAnalyzer -{ - /** - * Tokens collection instance. - * - * @var Tokens - */ - private $tokens; - - public function __construct(Tokens $tokens) - { - $this->tokens = $tokens; - } - - /** - * Get indexes of methods and properties in classy code (classes, interfaces and traits). - * - * @return array[] - */ - public function getClassyElements() - { - $this->tokens->rewind(); - $elements = []; - - for ($index = 1, $count = \count($this->tokens) - 2; $index < $count; ++$index) { - if ($this->tokens[$index]->isClassy()) { - list($index, $newElements) = $this->findClassyElements($index, $index); - $elements += $newElements; - } - } - - ksort($elements); - - return $elements; - } - - /** - * Get indexes of namespace uses. - * - * @param bool $perNamespace Return namespace uses per namespace - * - * @return int[]|int[][] - */ - public function getImportUseIndexes($perNamespace = false) - { - $tokens = $this->tokens; - - $tokens->rewind(); - - $uses = []; - $namespaceIndex = 0; - - for ($index = 0, $limit = $tokens->count(); $index < $limit; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_NAMESPACE)) { - $nextTokenIndex = $tokens->getNextTokenOfKind($index, [';', '{']); - $nextToken = $tokens[$nextTokenIndex]; - - if ($nextToken->equals('{')) { - $index = $nextTokenIndex; - } - - if ($perNamespace) { - ++$namespaceIndex; - } - - continue; - } - - if ($token->isGivenKind(T_USE)) { - $uses[$namespaceIndex][] = $index; - } - } - - if (!$perNamespace && isset($uses[$namespaceIndex])) { - return $uses[$namespaceIndex]; - } - - return $uses; - } - - /** - * Check if there is an array at given index. - * - * @param int $index - * - * @return bool - */ - public function isArray($index) - { - return $this->tokens[$index]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * Check if the array at index is multiline. - * - * This only checks the root-level of the array. - * - * @param int $index - * - * @return bool - */ - public function isArrayMultiLine($index) - { - if (!$this->isArray($index)) { - throw new \InvalidArgumentException(sprintf('Not an array at given index %d.', $index)); - } - - $tokens = $this->tokens; - - // Skip only when its an array, for short arrays we need the brace for correct - // level counting - if ($tokens[$index]->isGivenKind(T_ARRAY)) { - $index = $tokens->getNextMeaningfulToken($index); - } - - $endIndex = $tokens[$index]->equals('(') - ? $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index) - : $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index) - ; - - for (++$index; $index < $endIndex; ++$index) { - $token = $tokens[$index]; - $blockType = Tokens::detectBlockType($token); - - if ($blockType && $blockType['isStart']) { - $index = $tokens->findBlockEnd($blockType['type'], $index); - - continue; - } - - if ( - $token->isWhitespace() && - !$tokens[$index - 1]->isGivenKind(T_END_HEREDOC) && - false !== strpos($token->getContent(), "\n") - ) { - return true; - } - } - - return false; - } - - /** - * Returns the attributes of the method under the given index. - * - * The array has the following items: - * 'visibility' int|null T_PRIVATE, T_PROTECTED or T_PUBLIC - * 'static' bool - * 'abstract' bool - * 'final' bool - * - * @param int $index Token index of the method (T_FUNCTION) - * - * @return array - */ - public function getMethodAttributes($index) - { - $tokens = $this->tokens; - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_FUNCTION)) { - throw new \LogicException(sprintf('No T_FUNCTION at given index %d, got %s.', $index, $token->getName())); - } - - $attributes = [ - 'visibility' => null, - 'static' => false, - 'abstract' => false, - 'final' => false, - ]; - - for ($i = $index; $i >= 0; --$i) { - $tokenIndex = $tokens->getPrevMeaningfulToken($i); - - $i = $tokenIndex; - $token = $tokens[$tokenIndex]; - - if ($token->isGivenKind(T_STATIC)) { - $attributes['static'] = true; - - continue; - } - - if ($token->isGivenKind(T_FINAL)) { - $attributes['final'] = true; - - continue; - } - - if ($token->isGivenKind(T_ABSTRACT)) { - $attributes['abstract'] = true; - - continue; - } - - // visibility - - if ($token->isGivenKind(T_PRIVATE)) { - $attributes['visibility'] = T_PRIVATE; - - continue; - } - - if ($token->isGivenKind(T_PROTECTED)) { - $attributes['visibility'] = T_PROTECTED; - - continue; - } - - if ($token->isGivenKind(T_PUBLIC)) { - $attributes['visibility'] = T_PUBLIC; - - continue; - } - - // found a meaningful token that is not part of - // the function signature; stop looking - break; - } - - return $attributes; - } - - /** - * Check if there is an anonymous class under given index. - * - * @param int $index - * - * @return bool - */ - public function isAnonymousClass($index) - { - $tokens = $this->tokens; - $token = $tokens[$index]; - - if (!$token->isClassy()) { - throw new \LogicException(sprintf('No classy token at given index %d.', $index)); - } - - if (!$token->isGivenKind(T_CLASS)) { - return false; - } - - return $tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_NEW); - } - - /** - * Check if the function under given index is a lambda. - * - * @param int $index - * - * @return bool - */ - public function isLambda($index) - { - if ( - !$this->tokens[$index]->isGivenKind(T_FUNCTION) - && (\PHP_VERSION_ID < 70400 || !$this->tokens[$index]->isGivenKind(T_FN)) - ) { - throw new \LogicException(sprintf('No T_FUNCTION or T_FN at given index %d, got %s.', $index, $this->tokens[$index]->getName())); - } - - $startParenthesisIndex = $this->tokens->getNextMeaningfulToken($index); - $startParenthesisToken = $this->tokens[$startParenthesisIndex]; - - // skip & for `function & () {}` syntax - if ($startParenthesisToken->isGivenKind(CT::T_RETURN_REF)) { - $startParenthesisIndex = $this->tokens->getNextMeaningfulToken($startParenthesisIndex); - $startParenthesisToken = $this->tokens[$startParenthesisIndex]; - } - - return $startParenthesisToken->equals('('); - } - - /** - * Check if the T_STRING under given index is a constant invocation. - * - * @param int $index - * - * @return bool - */ - public function isConstantInvocation($index) - { - if (!$this->tokens[$index]->isGivenKind(T_STRING)) { - throw new \LogicException(sprintf('No T_STRING at given index %d, got %s.', $index, $this->tokens[$index]->getName())); - } - - $nextIndex = $this->tokens->getNextMeaningfulToken($index); - - if ( - $this->tokens[$nextIndex]->equalsAny(['(', '{']) || - $this->tokens[$nextIndex]->isGivenKind([T_AS, T_DOUBLE_COLON, T_ELLIPSIS, T_NS_SEPARATOR, CT::T_RETURN_REF, CT::T_TYPE_ALTERNATION, T_VARIABLE]) - ) { - return false; - } - - $prevIndex = $this->tokens->getPrevMeaningfulToken($index); - - if ($this->tokens[$prevIndex]->isGivenKind([T_AS, T_CLASS, T_CONST, T_DOUBLE_COLON, T_FUNCTION, T_GOTO, CT::T_GROUP_IMPORT_BRACE_OPEN, T_INTERFACE, T_OBJECT_OPERATOR, T_TRAIT, CT::T_TYPE_COLON])) { - return false; - } - - while ($this->tokens[$prevIndex]->isGivenKind([CT::T_NAMESPACE_OPERATOR, T_NS_SEPARATOR, T_STRING])) { - $prevIndex = $this->tokens->getPrevMeaningfulToken($prevIndex); - } - - if ($this->tokens[$prevIndex]->isGivenKind([CT::T_CONST_IMPORT, T_EXTENDS, CT::T_FUNCTION_IMPORT, T_IMPLEMENTS, T_INSTANCEOF, T_INSTEADOF, T_NAMESPACE, T_NEW, CT::T_NULLABLE_TYPE, CT::T_TYPE_COLON, T_USE, CT::T_USE_TRAIT])) { - return false; - } - - // `FOO & $bar` could be: - // - function reference parameter: function baz(Foo & $bar) {} - // - bit operator: $x = FOO & $bar; - if ($this->tokens[$nextIndex]->equals('&') && $this->tokens[$this->tokens->getNextMeaningfulToken($nextIndex)]->isGivenKind(T_VARIABLE)) { - $checkIndex = $this->tokens->getPrevTokenOfKind($prevIndex, [';', '{', '}', [T_FUNCTION], [T_OPEN_TAG], [T_OPEN_TAG_WITH_ECHO]]); - - if ($this->tokens[$checkIndex]->isGivenKind(T_FUNCTION)) { - return false; - } - } - - // check for `extends`/`implements`/`use` list - if ($this->tokens[$prevIndex]->equals(',')) { - $checkIndex = $prevIndex; - while ($this->tokens[$checkIndex]->equalsAny([',', [T_AS], [CT::T_NAMESPACE_OPERATOR], [T_NS_SEPARATOR], [T_STRING]])) { - $checkIndex = $this->tokens->getPrevMeaningfulToken($checkIndex); - } - - if ($this->tokens[$checkIndex]->isGivenKind([T_EXTENDS, CT::T_GROUP_IMPORT_BRACE_OPEN, T_IMPLEMENTS, T_USE, CT::T_USE_TRAIT])) { - return false; - } - } - - // check for array in double quoted string: `"..$foo[bar].."` - if ($this->tokens[$prevIndex]->equals('[') && $this->tokens[$nextIndex]->equals(']')) { - $checkToken = $this->tokens[$this->tokens->getNextMeaningfulToken($nextIndex)]; - - if ($checkToken->equals('"') || $checkToken->isGivenKind([T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES, T_ENCAPSED_AND_WHITESPACE, T_VARIABLE])) { - return false; - } - } - - // check for goto label - if ($this->tokens[$nextIndex]->equals(':') && $this->tokens[$prevIndex]->equalsAny([';', '}', [T_OPEN_TAG], [T_OPEN_TAG_WITH_ECHO]])) { - return false; - } - - return true; - } - - /** - * Checks if there is an unary successor operator under given index. - * - * @param int $index - * - * @return bool - */ - public function isUnarySuccessorOperator($index) - { - static $allowedPrevToken = [ - ']', - [T_STRING], - [T_VARIABLE], - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - [CT::T_DYNAMIC_PROP_BRACE_CLOSE], - [CT::T_DYNAMIC_VAR_BRACE_CLOSE], - ]; - - $tokens = $this->tokens; - $token = $tokens[$index]; - - if (!$token->isGivenKind([T_INC, T_DEC])) { - return false; - } - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - - return $prevToken->equalsAny($allowedPrevToken); - } - - /** - * Checks if there is an unary predecessor operator under given index. - * - * @param int $index - * - * @return bool - */ - public function isUnaryPredecessorOperator($index) - { - static $potentialSuccessorOperator = [T_INC, T_DEC]; - - static $potentialBinaryOperator = ['+', '-', '&', [CT::T_RETURN_REF]]; - - static $otherOperators; - if (null === $otherOperators) { - $otherOperators = ['!', '~', '@', [T_ELLIPSIS]]; - } - - static $disallowedPrevTokens; - if (null === $disallowedPrevTokens) { - $disallowedPrevTokens = [ - ']', - '}', - ')', - '"', - '`', - [CT::T_ARRAY_SQUARE_BRACE_CLOSE], - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - [CT::T_DYNAMIC_PROP_BRACE_CLOSE], - [CT::T_DYNAMIC_VAR_BRACE_CLOSE], - [T_CLASS_C], - [T_CONSTANT_ENCAPSED_STRING], - [T_DEC], - [T_DIR], - [T_DNUMBER], - [T_FILE], - [T_FUNC_C], - [T_INC], - [T_LINE], - [T_LNUMBER], - [T_METHOD_C], - [T_NS_C], - [T_STRING], - [T_TRAIT_C], - [T_VARIABLE], - ]; - } - - $tokens = $this->tokens; - $token = $tokens[$index]; - - if ($token->isGivenKind($potentialSuccessorOperator)) { - return !$this->isUnarySuccessorOperator($index); - } - - if ($token->equalsAny($otherOperators)) { - return true; - } - - if (!$token->equalsAny($potentialBinaryOperator)) { - return false; - } - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - - if (!$prevToken->equalsAny($disallowedPrevTokens)) { - return true; - } - - if (!$token->equals('&') || !$prevToken->isGivenKind(T_STRING)) { - return false; - } - - static $searchTokens = [ - ';', - '{', - '}', - [T_FUNCTION], - [T_OPEN_TAG], - [T_OPEN_TAG_WITH_ECHO], - ]; - $prevToken = $tokens[$tokens->getPrevTokenOfKind($index, $searchTokens)]; - - return $prevToken->isGivenKind(T_FUNCTION); - } - - /** - * Checks if there is a binary operator under given index. - * - * @param int $index - * - * @return bool - */ - public function isBinaryOperator($index) - { - static $nonArrayOperators = [ - '=' => true, - '*' => true, - '/' => true, - '%' => true, - '<' => true, - '>' => true, - '|' => true, - '^' => true, - '.' => true, - ]; - - static $potentialUnaryNonArrayOperators = [ - '+' => true, - '-' => true, - '&' => true, - ]; - - static $arrayOperators; - if (null === $arrayOperators) { - $arrayOperators = [ - T_AND_EQUAL => true, // &= - T_BOOLEAN_AND => true, // && - T_BOOLEAN_OR => true, // || - T_CONCAT_EQUAL => true, // .= - T_DIV_EQUAL => true, // /= - T_DOUBLE_ARROW => true, // => - T_IS_EQUAL => true, // == - T_IS_GREATER_OR_EQUAL => true, // >= - T_IS_IDENTICAL => true, // === - T_IS_NOT_EQUAL => true, // !=, <> - T_IS_NOT_IDENTICAL => true, // !== - T_IS_SMALLER_OR_EQUAL => true, // <= - T_LOGICAL_AND => true, // and - T_LOGICAL_OR => true, // or - T_LOGICAL_XOR => true, // xor - T_MINUS_EQUAL => true, // -= - T_MOD_EQUAL => true, // %= - T_MUL_EQUAL => true, // *= - T_OR_EQUAL => true, // |= - T_PLUS_EQUAL => true, // += - T_POW => true, // ** - T_POW_EQUAL => true, // **= - T_SL => true, // << - T_SL_EQUAL => true, // <<= - T_SR => true, // >> - T_SR_EQUAL => true, // >>= - T_XOR_EQUAL => true, // ^= - CT::T_TYPE_ALTERNATION => true, // | - ]; - - if (\defined('T_SPACESHIP')) { - $arrayOperators[T_SPACESHIP] = true; // <=> - } - - if (\defined('T_COALESCE')) { - $arrayOperators[T_COALESCE] = true; // ?? - } - - if (\defined('T_COALESCE_EQUAL')) { - $arrayOperators[T_COALESCE_EQUAL] = true; // ??= - } - } - - $tokens = $this->tokens; - $token = $tokens[$index]; - - if ($token->isArray()) { - return isset($arrayOperators[$token->getId()]); - } - - if (isset($nonArrayOperators[$token->getContent()])) { - return true; - } - - if (isset($potentialUnaryNonArrayOperators[$token->getContent()])) { - return !$this->isUnaryPredecessorOperator($index); - } - - return false; - } - - /** - * Check if `T_WHILE` token at given index is `do { ... } while ();` syntax - * and not `while () { ...}`. - * - * @param int $index - * - * @return bool - */ - public function isWhilePartOfDoWhile($index) - { - $tokens = $this->tokens; - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_WHILE)) { - throw new \LogicException(sprintf('No T_WHILE at given index %d, got %s.', $index, $token->getName())); - } - - $endIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$endIndex]->equals('}')) { - return false; - } - - $startIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $endIndex); - $beforeStartIndex = $tokens->getPrevMeaningfulToken($startIndex); - - return $tokens[$beforeStartIndex]->isGivenKind(T_DO); - } - - /** - * Find classy elements. - * - * Searches in tokens from the classy (start) index till the end (index) of the classy. - * Returns an array; first value is the index until the method has analysed (int), second the found classy elements (array). - * - * @param int $classIndex classy index - * @param int $index - * - * @return array - */ - private function findClassyElements($classIndex, $index) - { - $elements = []; - $curlyBracesLevel = 0; - $bracesLevel = 0; - ++$index; // skip the classy index itself - - for ($count = \count($this->tokens); $index < $count; ++$index) { - $token = $this->tokens[$index]; - - if ($token->isGivenKind(T_ENCAPSED_AND_WHITESPACE)) { - continue; - } - - if ($token->isClassy()) { // anonymous class in class - // check for nested anonymous classes inside the new call of an anonymous class, - // for example `new class(function (){new class(function (){new class(function (){}){};}){};}){};` etc. - // if class(XYZ) {} skip till `(` as XYZ might contain functions etc. - - $nestedClassIndex = $index; - $index = $this->tokens->getNextMeaningfulToken($index); - - if ($this->tokens[$index]->equals('(')) { - ++$index; // move after `(` - - for ($nestedBracesLevel = 1; $index < $count; ++$index) { - $token = $this->tokens[$index]; - - if ($token->equals('(')) { - ++$nestedBracesLevel; - - continue; - } - - if ($token->equals(')')) { - --$nestedBracesLevel; - - if (0 === $nestedBracesLevel) { - list($index, $newElements) = $this->findClassyElements($nestedClassIndex, $index); - $elements += $newElements; - - break; - } - - continue; - } - - if ($token->isClassy()) { // anonymous class in class - list($index, $newElements) = $this->findClassyElements($index, $index); - $elements += $newElements; - } - } - } else { - list($index, $newElements) = $this->findClassyElements($nestedClassIndex, $nestedClassIndex); - $elements += $newElements; - } - - continue; - } - - if ($token->equals('(')) { - ++$bracesLevel; - - continue; - } - - if ($token->equals(')')) { - --$bracesLevel; - - continue; - } - - if ($token->equals('{')) { - ++$curlyBracesLevel; - - continue; - } - - if ($token->equals('}')) { - --$curlyBracesLevel; - - if (0 === $curlyBracesLevel) { - break; - } - - continue; - } - - if (1 !== $curlyBracesLevel || !$token->isArray()) { - continue; - } - - if (0 === $bracesLevel && $token->isGivenKind(T_VARIABLE)) { - $elements[$index] = [ - 'token' => $token, - 'type' => 'property', - 'classIndex' => $classIndex, - ]; - - continue; - } - - if ($token->isGivenKind(T_FUNCTION)) { - $elements[$index] = [ - 'token' => $token, - 'type' => 'method', - 'classIndex' => $classIndex, - ]; - } elseif ($token->isGivenKind(T_CONST)) { - $elements[$index] = [ - 'token' => $token, - 'type' => 'const', - 'classIndex' => $classIndex, - ]; - } - } - - return [$index, $elements]; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ArrayTypehintTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ArrayTypehintTransformer.php deleted file mode 100644 index 347cf14..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ArrayTypehintTransformer.php +++ /dev/null @@ -1,61 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `array` typehint from T_ARRAY into CT::T_ARRAY_TYPEHINT. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ArrayTypehintTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [CT::T_ARRAY_TYPEHINT]; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 50000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - if (!$token->isGivenKind(T_ARRAY)) { - return; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$nextIndex]; - - if (!$nextToken->equals('(')) { - $tokens[$index] = new Token([CT::T_ARRAY_TYPEHINT, $token->getContent()]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceClassInstantiationTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceClassInstantiationTransformer.php deleted file mode 100644 index c86792b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceClassInstantiationTransformer.php +++ /dev/null @@ -1,88 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform braced class instantiation braces in `(new Foo())` into CT::T_BRACE_CLASS_INSTANTIATION_OPEN - * and CT::T_BRACE_CLASS_INSTANTIATION_CLOSE. - * - * @author Sebastiaans Stok - * - * @internal - */ -final class BraceClassInstantiationTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [CT::T_BRACE_CLASS_INSTANTIATION_OPEN, CT::T_BRACE_CLASS_INSTANTIATION_CLOSE]; - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - // must run after CurlyBraceTransformer and SquareBraceTransformer - return -2; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 50000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - if (!$tokens[$index]->equals('(') || !$tokens[$tokens->getNextMeaningfulToken($index)]->equals([T_NEW])) { - return; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->equalsAny([ - ']', - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - [CT::T_ARRAY_SQUARE_BRACE_CLOSE], - [T_ARRAY], - [T_CLASS], - [T_ELSEIF], - [T_FOR], - [T_FOREACH], - [T_IF], - [T_STATIC], - [T_STRING], - [T_SWITCH], - [T_VARIABLE], - [T_WHILE], - ])) { - return; - } - - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - $tokens[$index] = new Token([CT::T_BRACE_CLASS_INSTANTIATION_OPEN, '(']); - $tokens[$closeIndex] = new Token([CT::T_BRACE_CLASS_INSTANTIATION_CLOSE, ')']); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ClassConstantTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ClassConstantTransformer.php deleted file mode 100644 index b55959d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ClassConstantTransformer.php +++ /dev/null @@ -1,64 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `class` class' constant from T_CLASS into CT::T_CLASS_CONSTANT. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ClassConstantTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [CT::T_CLASS_CONSTANT]; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 50500; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - if (!$token->equalsAny([ - [T_CLASS, 'class'], - [T_STRING, 'class'], - ], false)) { - return; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - - if ($prevToken->isGivenKind(T_DOUBLE_COLON)) { - $tokens[$index] = new Token([CT::T_CLASS_CONSTANT, $token->getContent()]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/CurlyBraceTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/CurlyBraceTransformer.php deleted file mode 100644 index 7dcb368..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/CurlyBraceTransformer.php +++ /dev/null @@ -1,221 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform discriminate overloaded curly braces tokens. - * - * Performed transformations: - * - closing `}` for T_CURLY_OPEN into CT::T_CURLY_CLOSE, - * - closing `}` for T_DOLLAR_OPEN_CURLY_BRACES into CT::T_DOLLAR_CLOSE_CURLY_BRACES, - * - in `$foo->{$bar}` into CT::T_DYNAMIC_PROP_BRACE_OPEN and CT::T_DYNAMIC_PROP_BRACE_CLOSE, - * - in `${$foo}` into CT::T_DYNAMIC_VAR_BRACE_OPEN and CT::T_DYNAMIC_VAR_BRACE_CLOSE, - * - in `$array{$index}` into CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN and CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE, - * - in `use some\a\{ClassA, ClassB, ClassC as C}` into CT::T_GROUP_IMPORT_BRACE_OPEN, CT::T_GROUP_IMPORT_BRACE_CLOSE. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class CurlyBraceTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [ - CT::T_CURLY_CLOSE, - CT::T_DOLLAR_CLOSE_CURLY_BRACES, - CT::T_DYNAMIC_PROP_BRACE_OPEN, - CT::T_DYNAMIC_PROP_BRACE_CLOSE, - CT::T_DYNAMIC_VAR_BRACE_OPEN, - CT::T_DYNAMIC_VAR_BRACE_CLOSE, - CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN, - CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE, - CT::T_GROUP_IMPORT_BRACE_OPEN, - CT::T_GROUP_IMPORT_BRACE_CLOSE, - ]; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 50000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - $this->transformIntoCurlyCloseBrace($tokens, $token, $index); - $this->transformIntoDollarCloseBrace($tokens, $token, $index); - $this->transformIntoDynamicPropBraces($tokens, $token, $index); - $this->transformIntoDynamicVarBraces($tokens, $token, $index); - $this->transformIntoCurlyIndexBraces($tokens, $token, $index); - - if (\PHP_VERSION_ID >= 70000) { - $this->transformIntoGroupUseBraces($tokens, $token, $index); - } - } - - /** - * Transform closing `}` for T_CURLY_OPEN into CT::T_CURLY_CLOSE. - * - * This should be done at very beginning of curly braces transformations. - * - * @param int $index - */ - private function transformIntoCurlyCloseBrace(Tokens $tokens, Token $token, $index) - { - if (!$token->isGivenKind(T_CURLY_OPEN)) { - return; - } - - $level = 1; - $nestIndex = $index; - - while (0 < $level) { - ++$nestIndex; - - // we count all kind of { - if ($tokens[$nestIndex]->equals('{')) { - ++$level; - - continue; - } - - // we count all kind of } - if ($tokens[$nestIndex]->equals('}')) { - --$level; - } - } - - $tokens[$nestIndex] = new Token([CT::T_CURLY_CLOSE, '}']); - } - - private function transformIntoDollarCloseBrace(Tokens $tokens, Token $token, $index) - { - if ($token->isGivenKind(T_DOLLAR_OPEN_CURLY_BRACES)) { - $nextIndex = $tokens->getNextTokenOfKind($index, ['}']); - $tokens[$nextIndex] = new Token([CT::T_DOLLAR_CLOSE_CURLY_BRACES, '}']); - } - } - - private function transformIntoDynamicPropBraces(Tokens $tokens, Token $token, $index) - { - if (!$token->isGivenKind(T_OBJECT_OPERATOR)) { - return; - } - - if (!$tokens[$index + 1]->equals('{')) { - return; - } - - $openIndex = $index + 1; - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $openIndex); - - $tokens[$openIndex] = new Token([CT::T_DYNAMIC_PROP_BRACE_OPEN, '{']); - $tokens[$closeIndex] = new Token([CT::T_DYNAMIC_PROP_BRACE_CLOSE, '}']); - } - - private function transformIntoDynamicVarBraces(Tokens $tokens, Token $token, $index) - { - if (!$token->equals('$')) { - return; - } - - $openIndex = $tokens->getNextMeaningfulToken($index); - - if (null === $openIndex) { - return; - } - - $openToken = $tokens[$openIndex]; - - if (!$openToken->equals('{')) { - return; - } - - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $openIndex); - - $tokens[$openIndex] = new Token([CT::T_DYNAMIC_VAR_BRACE_OPEN, '{']); - $tokens[$closeIndex] = new Token([CT::T_DYNAMIC_VAR_BRACE_CLOSE, '}']); - } - - private function transformIntoCurlyIndexBraces(Tokens $tokens, Token $token, $index) - { - if (!$token->equals('{')) { - return; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - if (!$tokens[$prevIndex]->equalsAny([ - [T_STRING], - [T_VARIABLE], - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - ']', - ')', - ])) { - return; - } - - if ( - $tokens[$prevIndex]->isGivenKind(T_STRING) - && !$tokens[$tokens->getPrevMeaningfulToken($prevIndex)]->isGivenKind(T_OBJECT_OPERATOR) - ) { - return; - } - - if ( - $tokens[$prevIndex]->equals(')') - && !$tokens[$tokens->getPrevMeaningfulToken( - $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $prevIndex) - )]->isGivenKind(T_ARRAY) - ) { - return; - } - - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - $tokens[$index] = new Token([CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN, '{']); - $tokens[$closeIndex] = new Token([CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE, '}']); - } - - private function transformIntoGroupUseBraces(Tokens $tokens, Token $token, $index) - { - if (!$token->equals('{')) { - return; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - if (!$tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - return; - } - - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - $tokens[$index] = new Token([CT::T_GROUP_IMPORT_BRACE_OPEN, '{']); - $tokens[$closeIndex] = new Token([CT::T_GROUP_IMPORT_BRACE_CLOSE, '}']); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ImportTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ImportTransformer.php deleted file mode 100644 index ea8a0cd..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ImportTransformer.php +++ /dev/null @@ -1,67 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform const/function import tokens. - * - * Performed transformations: - * - T_CONST into CT::T_CONST_IMPORT - * - T_FUNCTION into CT::T_FUNCTION_IMPORT - * - * @author Gregor Harlan - * - * @internal - */ -final class ImportTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [CT::T_CONST_IMPORT, CT::T_FUNCTION_IMPORT]; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 50600; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - if (!$token->isGivenKind([T_CONST, T_FUNCTION])) { - return; - } - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - - if ($prevToken->isGivenKind(T_USE)) { - $tokens[$index] = new Token([ - $token->isGivenKind(T_FUNCTION) ? CT::T_FUNCTION_IMPORT : CT::T_CONST_IMPORT, - $token->getContent(), - ]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamespaceOperatorTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamespaceOperatorTransformer.php deleted file mode 100644 index e2700dc..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamespaceOperatorTransformer.php +++ /dev/null @@ -1,61 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `namespace` operator from T_NAMESPACE into CT::T_NAMESPACE_OPERATOR. - * - * @author Gregor Harlan - * - * @internal - */ -final class NamespaceOperatorTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [CT::T_NAMESPACE_OPERATOR]; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 50300; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - if (!$token->isGivenKind(T_NAMESPACE)) { - return; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$nextIndex]; - - if ($nextToken->isGivenKind(T_NS_SEPARATOR)) { - $tokens[$index] = new Token([CT::T_NAMESPACE_OPERATOR, $token->getContent()]); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NullableTypeTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NullableTypeTransformer.php deleted file mode 100644 index 8eb1aa3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NullableTypeTransformer.php +++ /dev/null @@ -1,70 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `?` operator into CT::T_NULLABLE_TYPE in `function foo(?Bar $b) {}`. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class NullableTypeTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [CT::T_NULLABLE_TYPE]; - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - // needs to run after TypeColonTransformer - return -20; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 70100; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - if (!$token->equals('?')) { - return; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - - if ($prevToken->equalsAny(['(', ',', [CT::T_TYPE_COLON], [T_PRIVATE], [T_PROTECTED], [T_PUBLIC], [T_VAR], [T_STATIC]])) { - $tokens[$index] = new Token([CT::T_NULLABLE_TYPE, '?']); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ReturnRefTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ReturnRefTransformer.php deleted file mode 100644 index 636a9e7..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ReturnRefTransformer.php +++ /dev/null @@ -1,62 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `&` operator into CT::T_RETURN_REF in `function & foo() {}`. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ReturnRefTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [CT::T_RETURN_REF]; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 50000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - $prevKinds = [T_FUNCTION]; - if (\PHP_VERSION_ID >= 70400) { - $prevKinds[] = T_FN; - } - - if ( - $token->equals('&') - && $tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind($prevKinds) - ) { - $tokens[$index] = new Token([CT::T_RETURN_REF, '&']); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/SquareBraceTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/SquareBraceTransformer.php deleted file mode 100644 index 24499a5..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/SquareBraceTransformer.php +++ /dev/null @@ -1,196 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform discriminate overloaded square braces tokens. - * - * Performed transformations: - * - in `[1, 2, 3]` into CT::T_ARRAY_SQUARE_BRACE_OPEN and CT::T_ARRAY_SQUARE_BRACE_CLOSE, - * - in `[$a, &$b, [$c]] = array(1, 2, array(3))` into CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN and CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE. - * - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -final class SquareBraceTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [ - CT::T_ARRAY_SQUARE_BRACE_OPEN, - CT::T_ARRAY_SQUARE_BRACE_CLOSE, - CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, - CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE, - ]; - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - // must run after CurlyBraceTransformer - return -1; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - // Short array syntax was introduced in PHP 5.4, but the fixer is smart - // enough to handle it even before 5.4. - // Same for array destructing syntax sugar `[` introduced in PHP 7.1. - return 50000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - if ($this->isArrayDestructing($tokens, $index)) { - $this->transformIntoDestructuringSquareBrace($tokens, $index); - - return; - } - - if ($this->isShortArray($tokens, $index)) { - $this->transformIntoArraySquareBrace($tokens, $index); - } - } - - /** - * @param int $index - */ - private function transformIntoArraySquareBrace(Tokens $tokens, $index) - { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index); - - $tokens[$index] = new Token([CT::T_ARRAY_SQUARE_BRACE_OPEN, '[']); - $tokens[$endIndex] = new Token([CT::T_ARRAY_SQUARE_BRACE_CLOSE, ']']); - } - - /** - * @param int $index - */ - private function transformIntoDestructuringSquareBrace(Tokens $tokens, $index) - { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index); - - $tokens[$index] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, '[']); - $tokens[$endIndex] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE, ']']); - - $previousMeaningfulIndex = $index; - $index = $tokens->getNextMeaningfulToken($index); - - while ($index < $endIndex) { - if ($tokens[$index]->equals('[') && $tokens[$previousMeaningfulIndex]->equalsAny([[CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN], ','])) { - $tokens[$tokens->findBlockEnd(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index)] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE, ']']); - $tokens[$index] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, '[']); - } - - $previousMeaningfulIndex = $index; - $index = $tokens->getNextMeaningfulToken($index); - } - } - - /** - * Check if token under given index is short array opening. - * - * @param int $index - * - * @return bool - */ - private function isShortArray(Tokens $tokens, $index) - { - if (!$tokens[$index]->equals('[')) { - return false; - } - - static $disallowedPrevTokens = [ - ')', - ']', - '}', - '"', - [T_CONSTANT_ENCAPSED_STRING], - [T_STRING], - [T_STRING_VARNAME], - [T_VARIABLE], - [CT::T_ARRAY_SQUARE_BRACE_CLOSE], - [CT::T_DYNAMIC_PROP_BRACE_CLOSE], - [CT::T_DYNAMIC_VAR_BRACE_CLOSE], - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - ]; - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - if ($prevToken->equalsAny($disallowedPrevTokens)) { - return false; - } - - $nextToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - if ($nextToken->equals(']')) { - return true; - } - - return !$this->isArrayDestructing($tokens, $index); - } - - /** - * @param int $index - * - * @return bool - */ - private function isArrayDestructing(Tokens $tokens, $index) - { - if (\PHP_VERSION_ID < 70100 || !$tokens[$index]->equals('[')) { - return false; - } - - static $disallowedPrevTokens = [ - ')', - ']', - '"', - [T_CONSTANT_ENCAPSED_STRING], - [T_STRING], - [T_STRING_VARNAME], - [T_VARIABLE], - [CT::T_ARRAY_SQUARE_BRACE_CLOSE], - [CT::T_DYNAMIC_PROP_BRACE_CLOSE], - [CT::T_DYNAMIC_VAR_BRACE_CLOSE], - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - ]; - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - if ($prevToken->equalsAny($disallowedPrevTokens)) { - return false; - } - - $type = Tokens::detectBlockType($tokens[$index]); - $end = $tokens->findBlockEnd($type['type'], $index); - - $nextToken = $tokens[$tokens->getNextMeaningfulToken($end)]; - - return $nextToken->equals('='); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeAlternationTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeAlternationTransformer.php deleted file mode 100644 index fefebc5..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeAlternationTransformer.php +++ /dev/null @@ -1,86 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `|` operator into CT::T_TYPE_ALTERNATION in `} catch (ExceptionType1 | ExceptionType2 $e) {`. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class TypeAlternationTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [CT::T_TYPE_ALTERNATION]; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 70100; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - if (!$token->equals('|')) { - return; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - - if (!$prevToken->isGivenKind(T_STRING)) { - return; - } - - do { - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - if (null === $prevIndex) { - break; - } - - $prevToken = $tokens[$prevIndex]; - - if ($prevToken->isGivenKind([T_NS_SEPARATOR, T_STRING])) { - continue; - } - - if ( - $prevToken->isGivenKind(CT::T_TYPE_ALTERNATION) - || ( - $prevToken->equals('(') - && $tokens[$tokens->getPrevMeaningfulToken($prevIndex)]->isGivenKind(T_CATCH) - ) - ) { - $tokens[$index] = new Token([CT::T_TYPE_ALTERNATION, '|']); - } - - break; - } while (true); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeColonTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeColonTransformer.php deleted file mode 100644 index 63dd21d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeColonTransformer.php +++ /dev/null @@ -1,88 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `:` operator into CT::T_TYPE_COLON in `function foo() : int {}`. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class TypeColonTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [CT::T_TYPE_COLON]; - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - // needs to run after ReturnRefTransformer and UseTransformer - return -10; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 70000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - if (!$token->equals(':')) { - return; - } - - $endIndex = $tokens->getPrevMeaningfulToken($index); - - if (!$tokens[$endIndex]->equals(')')) { - return; - } - - $startIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $endIndex); - $prevIndex = $tokens->getPrevMeaningfulToken($startIndex); - $prevToken = $tokens[$prevIndex]; - - // if this could be a function name we need to take one more step - if ($prevToken->isGivenKind(T_STRING)) { - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - $prevToken = $tokens[$prevIndex]; - } - - $prevKinds = [T_FUNCTION, CT::T_RETURN_REF, CT::T_USE_LAMBDA]; - if (\PHP_VERSION_ID >= 70400) { - $prevKinds[] = T_FN; - } - - if ($prevToken->isGivenKind($prevKinds)) { - $tokens[$index] = new Token([CT::T_TYPE_COLON, ':']); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/UseTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/UseTransformer.php deleted file mode 100644 index db4f906..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/UseTransformer.php +++ /dev/null @@ -1,110 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform T_USE into: - * - CT::T_USE_TRAIT for imports, - * - CT::T_USE_LAMBDA for lambda variable uses. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class UseTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return [CT::T_USE_TRAIT, CT::T_USE_LAMBDA]; - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - // Should run after CurlyBraceTransformer and before TypeColonTransformer - return -5; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 50300; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - if ($token->isGivenKind(T_USE) && $this->isUseForLambda($tokens, $index)) { - $tokens[$index] = new Token([CT::T_USE_LAMBDA, $token->getContent()]); - - return; - } - - // Only search inside class/trait body for `T_USE` for traits. - // Cannot import traits inside interfaces or anywhere else - - if (!$token->isGivenKind([T_CLASS, T_TRAIT])) { - return; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_DOUBLE_COLON)) { - return; - } - - $index = $tokens->getNextTokenOfKind($index, ['{']); - $innerLimit = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - while ($index < $innerLimit) { - $token = $tokens[++$index]; - - if (!$token->isGivenKind(T_USE)) { - continue; - } - - if ($this->isUseForLambda($tokens, $index)) { - $tokens[$index] = new Token([CT::T_USE_LAMBDA, $token->getContent()]); - } else { - $tokens[$index] = new Token([CT::T_USE_TRAIT, $token->getContent()]); - } - } - } - - /** - * Check if token under given index is `use` statement for lambda function. - * - * @param int $index - * - * @return bool - */ - private function isUseForLambda(Tokens $tokens, $index) - { - $nextToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - - // test `function () use ($foo) {}` case - return $nextToken->equals('('); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/WhitespacyCommentTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/WhitespacyCommentTransformer.php deleted file mode 100644 index 9878ff3..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/WhitespacyCommentTransformer.php +++ /dev/null @@ -1,71 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Move trailing whitespaces from comments and docs into following T_WHITESPACE token. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class WhitespacyCommentTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getCustomTokens() - { - return []; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId() - { - return 50000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, $index) - { - if (!$token->isComment()) { - return; - } - - $content = $token->getContent(); - $trimmedContent = rtrim($content); - - // nothing trimmed, nothing to do - if ($content === $trimmedContent) { - return; - } - - $whitespaces = substr($content, \strlen($trimmedContent)); - - $tokens[$index] = new Token([$token->getId(), $trimmedContent]); - - if (isset($tokens[$index + 1]) && $tokens[$index + 1]->isWhitespace()) { - $tokens[$index + 1] = new Token([T_WHITESPACE, $whitespaces.$tokens[$index + 1]->getContent()]); - } else { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, $whitespaces])); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TransformerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TransformerInterface.php deleted file mode 100644 index 91edaca..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TransformerInterface.php +++ /dev/null @@ -1,72 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer; - -/** - * Interface for Transformer class. - * - * Transformer role is to register custom tokens and transform Tokens collection to use them. - * - * Custom token is a user defined token type and is used to separate different meaning of original token type. - * For example T_ARRAY is a token for both creating new array and typehinting a parameter. This two meaning should have two token types. - * - * @author Dariusz Rumiński - * - * @internal - */ -interface TransformerInterface -{ - /** - * Get tokens created by Transformer. - * - * @return array - */ - public function getCustomTokens(); - - /** - * Return the name of the transformer. - * - * The name must be all lowercase and without any spaces. - * - * @return string The name of the fixer - */ - public function getName(); - - /** - * Returns the priority of the transformer. - * - * The default priority is 0 and higher priorities are executed first. - * - * @return int - */ - public function getPriority(); - - /** - * Return minimal required PHP version id to transform the code. - * - * Custom Token kinds from Transformers are always registered, but sometimes - * there is no need to analyse the Tokens if for sure we cannot find examined - * token kind, eg transforming `T_FUNCTION` in ` - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tokenizer; - -use PhpCsFixer\Utils; -use Symfony\Component\Finder\Finder; -use Symfony\Component\Finder\SplFileInfo; - -/** - * Collection of Transformer classes. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class Transformers -{ - /** - * The registered transformers. - * - * @var TransformerInterface[] - */ - private $items = []; - - /** - * Register built in Transformers. - */ - private function __construct() - { - $this->registerBuiltInTransformers(); - - usort($this->items, static function (TransformerInterface $a, TransformerInterface $b) { - return Utils::cmpInt($b->getPriority(), $a->getPriority()); - }); - } - - /** - * @return Transformers - */ - public static function create() - { - static $instance = null; - - if (!$instance) { - $instance = new self(); - } - - return $instance; - } - - /** - * Transform given Tokens collection through all Transformer classes. - * - * @param Tokens $tokens Tokens collection - */ - public function transform(Tokens $tokens) - { - foreach ($this->items as $transformer) { - foreach ($tokens as $index => $token) { - $transformer->process($tokens, $token, $index); - } - } - } - - /** - * @param TransformerInterface $transformer Transformer - */ - private function registerTransformer(TransformerInterface $transformer) - { - if (\PHP_VERSION_ID >= $transformer->getRequiredPhpVersionId()) { - $this->items[] = $transformer; - } - } - - private function registerBuiltInTransformers() - { - static $registered = false; - - if ($registered) { - return; - } - - $registered = true; - - foreach ($this->findBuiltInTransformers() as $transformer) { - $this->registerTransformer($transformer); - } - } - - /** - * @return \Generator|TransformerInterface[] - */ - private function findBuiltInTransformers() - { - /** @var SplFileInfo $file */ - foreach (Finder::create()->files()->in(__DIR__.'/Transformer') as $file) { - $relativeNamespace = $file->getRelativePath(); - $class = __NAMESPACE__.'\\Transformer\\'.($relativeNamespace ? $relativeNamespace.'\\' : '').$file->getBasename('.php'); - - yield new $class(); - } - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php b/vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php deleted file mode 100644 index 98e3e2b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php +++ /dev/null @@ -1,111 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Console\Application; - -/** - * Obtain information about using version of tool. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ToolInfo implements ToolInfoInterface -{ - const COMPOSER_PACKAGE_NAME = 'friendsofphp/php-cs-fixer'; - - const COMPOSER_LEGACY_PACKAGE_NAME = 'fabpot/php-cs-fixer'; - - /** - * @var null|array - */ - private $composerInstallationDetails; - - /** - * @var null|bool - */ - private $isInstalledByComposer; - - public function getComposerInstallationDetails() - { - if (!$this->isInstalledByComposer()) { - throw new \LogicException('Cannot get composer version for tool not installed by composer.'); - } - - if (null === $this->composerInstallationDetails) { - $composerInstalled = json_decode(file_get_contents($this->getComposerInstalledFile()), true); - - $packages = isset($composerInstalled['packages']) ? $composerInstalled['packages'] : $composerInstalled; - - foreach ($packages as $package) { - if (\in_array($package['name'], [self::COMPOSER_PACKAGE_NAME, self::COMPOSER_LEGACY_PACKAGE_NAME], true)) { - $this->composerInstallationDetails = $package; - - break; - } - } - } - - return $this->composerInstallationDetails; - } - - public function getComposerVersion() - { - $package = $this->getComposerInstallationDetails(); - - $versionSuffix = ''; - - if (isset($package['dist']['reference'])) { - $versionSuffix = '#'.$package['dist']['reference']; - } - - return $package['version'].$versionSuffix; - } - - public function getVersion() - { - if ($this->isInstalledByComposer()) { - return Application::VERSION.':'.$this->getComposerVersion(); - } - - return Application::VERSION; - } - - public function isInstalledAsPhar() - { - return 'phar://' === substr(__DIR__, 0, 7); - } - - public function isInstalledByComposer() - { - if (null === $this->isInstalledByComposer) { - $this->isInstalledByComposer = !$this->isInstalledAsPhar() && file_exists($this->getComposerInstalledFile()); - } - - return $this->isInstalledByComposer; - } - - public function getPharDownloadUri($version) - { - return sprintf( - 'https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/%s/php-cs-fixer.phar', - $version - ); - } - - private function getComposerInstalledFile() - { - return __DIR__.'/../../../composer/installed.json'; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php b/vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php deleted file mode 100644 index d5c3708..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * @internal - */ -interface ToolInfoInterface -{ - public function getComposerInstallationDetails(); - - public function getComposerVersion(); - - public function getVersion(); - - public function isInstalledAsPhar(); - - public function isInstalledByComposer(); - - public function getPharDownloadUri($version); -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Utils.php b/vendor/friendsofphp/php-cs-fixer/src/Utils.php deleted file mode 100644 index f9f900b..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Utils.php +++ /dev/null @@ -1,185 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\Tokenizer\Token; - -/** - * @author Dariusz Rumiński - * @author Graham Campbell - * @author Odín del Río - * - * @internal - */ -final class Utils -{ - /** - * Calculate a bitmask for given constant names. - * - * @param string[] $options constant names - * - * @return int - */ - public static function calculateBitmask(array $options) - { - $bitmask = 0; - - foreach ($options as $optionName) { - if (\defined($optionName)) { - $bitmask |= \constant($optionName); - } - } - - return $bitmask; - } - - /** - * Converts a camel cased string to a snake cased string. - * - * @param string $string - * - * @return string - */ - public static function camelCaseToUnderscore($string) - { - return strtolower(Preg::replace('/(?isWhitespace()) { - throw new \InvalidArgumentException(sprintf('The given token must be whitespace, got "%s".', $token->getName())); - } - - $str = strrchr( - str_replace(["\r\n", "\r"], "\n", $token->getContent()), - "\n" - ); - - if (false === $str) { - return ''; - } - - return ltrim($str, "\n"); - } - - /** - * Perform stable sorting using provided comparison function. - * - * Stability is ensured by using Schwartzian transform. - * - * @param mixed[] $elements - * @param callable $getComparedValue a callable that takes a single element and returns the value to compare - * @param callable $compareValues a callable that compares two values - * - * @return mixed[] - */ - public static function stableSort(array $elements, callable $getComparedValue, callable $compareValues) - { - array_walk($elements, static function (&$element, $index) use ($getComparedValue) { - $element = [$element, $index, $getComparedValue($element)]; - }); - - usort($elements, static function ($a, $b) use ($compareValues) { - $comparison = $compareValues($a[2], $b[2]); - - if (0 !== $comparison) { - return $comparison; - } - - return self::cmpInt($a[1], $b[1]); - }); - - return array_map(static function (array $item) { - return $item[0]; - }, $elements); - } - - /** - * Sort fixers by their priorities. - * - * @param FixerInterface[] $fixers - * - * @return FixerInterface[] - */ - public static function sortFixers(array $fixers) - { - // Schwartzian transform is used to improve the efficiency and avoid - // `usort(): Array was modified by the user comparison function` warning for mocked objects. - return self::stableSort( - $fixers, - static function (FixerInterface $fixer) { - return $fixer->getPriority(); - }, - static function ($a, $b) { - return self::cmpInt($b, $a); - } - ); - } - - /** - * Join names in natural language wrapped in backticks, e.g. `a`, `b` and `c`. - * - * @param string[] $names - * - * @throws \InvalidArgumentException - * - * @return string - */ - public static function naturalLanguageJoinWithBackticks(array $names) - { - if (empty($names)) { - throw new \InvalidArgumentException('Array of names cannot be empty'); - } - - $names = array_map(static function ($name) { - return sprintf('`%s`', $name); - }, $names); - - $last = array_pop($names); - - if ($names) { - return implode(', ', $names).' and '.$last; - } - - return $last; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php b/vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php deleted file mode 100644 index 93ad5f4..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php +++ /dev/null @@ -1,56 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * @author Dariusz Rumiński - */ -final class WhitespacesFixerConfig -{ - private $indent; - private $lineEnding; - - /** - * @param string $indent - * @param string $lineEnding - */ - public function __construct($indent = ' ', $lineEnding = "\n") - { - if (!\in_array($indent, [' ', ' ', "\t"], true)) { - throw new \InvalidArgumentException('Invalid "indent" param, expected tab or two or four spaces.'); - } - - if (!\in_array($lineEnding, ["\n", "\r\n"], true)) { - throw new \InvalidArgumentException('Invalid "lineEnding" param, expected "\n" or "\r\n".'); - } - - $this->indent = $indent; - $this->lineEnding = $lineEnding; - } - - /** - * @return string - */ - public function getIndent() - { - return $this->indent; - } - - /** - * @return string - */ - public function getLineEnding() - { - return $this->lineEnding; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php b/vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php deleted file mode 100644 index d0f529d..0000000 --- a/vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php +++ /dev/null @@ -1,57 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -final class WordMatcher -{ - /** - * @var string[] - */ - private $candidates; - - /** - * @param string[] $candidates - */ - public function __construct(array $candidates) - { - $this->candidates = $candidates; - } - - /** - * @param string $needle - * - * @return null|string - */ - public function match($needle) - { - $word = null; - $distance = ceil(\strlen($needle) * 0.35); - - foreach ($this->candidates as $candidate) { - $candidateDistance = levenshtein($needle, $candidate); - - if ($candidateDistance < $distance) { - $word = $candidate; - $distance = $candidateDistance; - } - } - - return $word; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractFixerTestCase.php b/vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractFixerTestCase.php deleted file mode 100644 index df9d342..0000000 --- a/vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractFixerTestCase.php +++ /dev/null @@ -1,259 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests\Test; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\Linter\CachingLinter; -use PhpCsFixer\Linter\Linter; -use PhpCsFixer\Linter\LinterInterface; -use PhpCsFixer\Tests\Test\Assert\AssertTokensTrait; -use PhpCsFixer\Tests\TestCase; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Prophecy\Argument; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -abstract class AbstractFixerTestCase extends TestCase -{ - use AssertTokensTrait; - use IsIdenticalConstraint; - - /** - * @var null|LinterInterface - */ - protected $linter; - - /** - * @var null|AbstractFixer - */ - protected $fixer; - - protected function setUp() - { - parent::setUp(); - - $this->linter = $this->getLinter(); - $this->fixer = $this->createFixer(); - - // @todo remove at 3.0 together with env var itself - if (getenv('PHP_CS_FIXER_TEST_USE_LEGACY_TOKENIZER')) { - Tokens::setLegacyMode(true); - } - } - - protected function tearDown() - { - parent::tearDown(); - - $this->linter = null; - $this->fixer = null; - - // @todo remove at 3.0 - Tokens::setLegacyMode(false); - } - - final public function testIsRisky() - { - static::assertInternalType('bool', $this->fixer->isRisky(), sprintf('Return type for ::isRisky of "%s" is invalid.', $this->fixer->getName())); - - if ($this->fixer->isRisky()) { - self::assertValidDescription($this->fixer->getName(), 'risky description', $this->fixer->getDefinition()->getRiskyDescription()); - } else { - static::assertNull($this->fixer->getDefinition()->getRiskyDescription(), sprintf('[%s] Fixer is not risky so no description of it expected.', $this->fixer->getName())); - } - - if ($this->fixer instanceof AbstractProxyFixer) { - return; - } - - $reflection = new \ReflectionMethod($this->fixer, 'isRisky'); - - // If fixer is not risky then the method `isRisky` from `AbstractFixer` must be used - static::assertSame( - !$this->fixer->isRisky(), - AbstractFixer::class === $reflection->getDeclaringClass()->getName() - ); - } - - /** - * @return AbstractFixer - */ - protected function createFixer() - { - $fixerClassName = preg_replace('/^(PhpCsFixer)\\\\Tests(\\\\.+)Test$/', '$1$2', static::class); - - return new $fixerClassName(); - } - - /** - * @param string $filename - * - * @return \SplFileInfo - */ - protected function getTestFile($filename = __FILE__) - { - static $files = []; - - if (!isset($files[$filename])) { - $files[$filename] = new \SplFileInfo($filename); - } - - return $files[$filename]; - } - - /** - * Tests if a fixer fixes a given string to match the expected result. - * - * It is used both if you want to test if something is fixed or if it is not touched by the fixer. - * It also makes sure that the expected output does not change when run through the fixer. That means that you - * do not need two test cases like [$expected] and [$expected, $input] (where $expected is the same in both cases) - * as the latter covers both of them. - * This method throws an exception if $expected and $input are equal to prevent test cases that accidentally do - * not test anything. - * - * @param string $expected The expected fixer output - * @param null|string $input The fixer input, or null if it should intentionally be equal to the output - * @param null|\SplFileInfo $file The file to fix, or null if unneeded - */ - protected function doTest($expected, $input = null, \SplFileInfo $file = null) - { - if ($expected === $input) { - throw new \InvalidArgumentException('Input parameter must not be equal to expected parameter.'); - } - - $file = $file ?: $this->getTestFile(); - $fileIsSupported = $this->fixer->supports($file); - - if (null !== $input) { - static::assertNull($this->lintSource($input)); - - Tokens::clearCache(); - $tokens = Tokens::fromCode($input); - - if ($fileIsSupported) { - static::assertTrue($this->fixer->isCandidate($tokens), 'Fixer must be a candidate for input code.'); - static::assertFalse($tokens->isChanged(), 'Fixer must not touch Tokens on candidate check.'); - $fixResult = $this->fixer->fix($file, $tokens); - static::assertNull($fixResult, '->fix method must return null.'); - } - - static::assertThat( - $tokens->generateCode(), - self::createIsIdenticalStringConstraint($expected), - 'Code build on input code must match expected code.' - ); - static::assertTrue($tokens->isChanged(), 'Tokens collection built on input code must be marked as changed after fixing.'); - - $tokens->clearEmptyTokens(); - - static::assertSame( - \count($tokens), - \count(array_unique(array_map(static function (Token $token) { - return spl_object_hash($token); - }, $tokens->toArray()))), - 'Token items inside Tokens collection must be unique.' - ); - - Tokens::clearCache(); - $expectedTokens = Tokens::fromCode($expected); - static::assertTokens($expectedTokens, $tokens); - } - - static::assertNull($this->lintSource($expected)); - - Tokens::clearCache(); - $tokens = Tokens::fromCode($expected); - - if ($fileIsSupported) { - $fixResult = $this->fixer->fix($file, $tokens); - static::assertNull($fixResult, '->fix method must return null.'); - } - - static::assertThat( - $tokens->generateCode(), - self::createIsIdenticalStringConstraint($expected), - 'Code build on expected code must not change.' - ); - static::assertFalse($tokens->isChanged(), 'Tokens collection built on expected code must not be marked as changed after fixing.'); - } - - /** - * @param string $source - * - * @return null|string - */ - protected function lintSource($source) - { - try { - $this->linter->lintSource($source)->check(); - } catch (\Exception $e) { - return $e->getMessage()."\n\nSource:\n{$source}"; - } - - return null; - } - - /** - * @return LinterInterface - */ - private function getLinter() - { - static $linter = null; - - if (null === $linter) { - if (getenv('SKIP_LINT_TEST_CASES')) { - $linterProphecy = $this->prophesize(\PhpCsFixer\Linter\LinterInterface::class); - $linterProphecy - ->lintSource(Argument::type('string')) - ->willReturn($this->prophesize(\PhpCsFixer\Linter\LintingResultInterface::class)->reveal()) - ; - - $linter = $linterProphecy->reveal(); - } else { - $linter = new CachingLinter(new Linter()); - } - } - - return $linter; - } - - /** - * @param string $fixerName - * @param string $descriptionType - * @param mixed $description - */ - private static function assertValidDescription($fixerName, $descriptionType, $description) - { - static::assertInternalType('string', $description); - static::assertRegExp('/^[A-Z`][^"]+\.$/', $description, sprintf('[%s] The %s must start with capital letter or a ` and end with dot.', $fixerName, $descriptionType)); - static::assertNotContains('phpdocs', $description, sprintf('[%s] `PHPDoc` must not be in the plural in %s.', $fixerName, $descriptionType), true); - static::assertCorrectCasing($description, 'PHPDoc', sprintf('[%s] `PHPDoc` must be in correct casing in %s.', $fixerName, $descriptionType)); - static::assertCorrectCasing($description, 'PHPUnit', sprintf('[%s] `PHPUnit` must be in correct casing in %s.', $fixerName, $descriptionType)); - static::assertFalse(strpos($descriptionType, '``'), sprintf('[%s] The %s must no contain sequential backticks.', $fixerName, $descriptionType)); - } - - /** - * @param string $needle - * @param string $haystack - * @param string $message - */ - private static function assertCorrectCasing($needle, $haystack, $message) - { - static::assertSame(substr_count(strtolower($haystack), strtolower($needle)), substr_count($haystack, $needle), $message); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationCaseFactory.php b/vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationCaseFactory.php deleted file mode 100644 index cd3c9b5..0000000 --- a/vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationCaseFactory.php +++ /dev/null @@ -1,254 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests\Test; - -use PhpCsFixer\RuleSet; -use Symfony\Component\Finder\SplFileInfo; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -abstract class AbstractIntegrationCaseFactory implements IntegrationCaseFactoryInterface -{ - /** - * @return IntegrationCase - */ - public function create(SplFileInfo $file) - { - try { - if (!preg_match( - '/^ - --TEST-- \r?\n(? .*?) - \s --RULESET-- \r?\n(?<ruleset> .*?) - (?:\s --CONFIG-- \r?\n(?<config> .*?))? - (?:\s --SETTINGS-- \r?\n(?<settings> .*?))? - (?:\s --REQUIREMENTS-- \r?\n(?<requirements> .*?))? - (?:\s --EXPECT-- \r?\n(?<expect> .*?\r?\n*))? - (?:\s --INPUT-- \r?\n(?<input> .*))? - $/sx', - $file->getContents(), - $match - )) { - throw new \InvalidArgumentException('File format is invalid.'); - } - - $match = array_merge( - [ - 'config' => null, - 'settings' => null, - 'requirements' => null, - 'expect' => null, - 'input' => null, - ], - $match - ); - - return new IntegrationCase( - $file->getRelativePathname(), - $this->determineTitle($file, $match['title']), - $this->determineSettings($file, $match['settings']), - $this->determineRequirements($file, $match['requirements']), - $this->determineConfig($file, $match['config']), - $this->determineRuleset($file, $match['ruleset']), - $this->determineExpectedCode($file, $match['expect']), - $this->determineInputCode($file, $match['input']) - ); - } catch (\InvalidArgumentException $e) { - throw new \InvalidArgumentException( - sprintf('%s Test file: "%s".', $e->getMessage(), $file->getRelativePathname()), - $e->getCode(), - $e - ); - } - } - - /** - * Parses the '--CONFIG--' block of a '.test' file. - * - * @param string $config - * - * @return array - */ - protected function determineConfig(SplFileInfo $file, $config) - { - $parsed = $this->parseJson($config, [ - 'indent' => ' ', - 'lineEnding' => "\n", - ]); - - if (!\is_string($parsed['indent'])) { - throw new \InvalidArgumentException(sprintf( - 'Expected string value for "indent", got "%s".', - \is_object($parsed['indent']) ? \get_class($parsed['indent']) : \gettype($parsed['indent']).'#'.$parsed['indent'] - )); - } - - if (!\is_string($parsed['lineEnding'])) { - throw new \InvalidArgumentException(sprintf( - 'Expected string value for "lineEnding", got "%s".', - \is_object($parsed['lineEnding']) ? \get_class($parsed['lineEnding']) : \gettype($parsed['lineEnding']).'#'.$parsed['lineEnding'] - )); - } - - return $parsed; - } - - /** - * Parses the '--REQUIREMENTS--' block of a '.test' file and determines requirements. - * - * @param string $config - * - * @return array - */ - protected function determineRequirements(SplFileInfo $file, $config) - { - $parsed = $this->parseJson($config, [ - 'php' => \PHP_VERSION_ID, - ]); - - if (!\is_int($parsed['php'])) { - throw new \InvalidArgumentException(sprintf( - 'Expected int value like 50509 for "php", got "%s".', - \is_object($parsed['php']) ? \get_class($parsed['php']) : \gettype($parsed['php']).'#'.$parsed['php'] - )); - } - - return $parsed; - } - - /** - * Parses the '--RULESET--' block of a '.test' file and determines what fixers should be used. - * - * @param string $config - * - * @return RuleSet - */ - protected function determineRuleset(SplFileInfo $file, $config) - { - return new RuleSet($this->parseJson($config)); - } - - /** - * Parses the '--TEST--' block of a '.test' file and determines title. - * - * @param string $config - * - * @return string - */ - protected function determineTitle(SplFileInfo $file, $config) - { - return $config; - } - - /** - * Parses the '--SETTINGS--' block of a '.test' file and determines settings. - * - * @param string $config - * - * @return array - */ - protected function determineSettings(SplFileInfo $file, $config) - { - $parsed = $this->parseJson($config, [ - 'checkPriority' => true, - ]); - - if (!\is_bool($parsed['checkPriority'])) { - throw new \InvalidArgumentException(sprintf( - 'Expected bool value for "checkPriority", got "%s".', - \is_object($parsed['checkPriority']) ? \get_class($parsed['checkPriority']) : \gettype($parsed['checkPriority']).'#'.$parsed['checkPriority'] - )); - } - - return $parsed; - } - - /** - * @param null|string $code - * - * @return string - */ - protected function determineExpectedCode(SplFileInfo $file, $code) - { - $code = $this->determineCode($file, $code, '-out.php'); - - if (null === $code) { - throw new \InvalidArgumentException('Missing expected code.'); - } - - return $code; - } - - /** - * @param null|string $code - * - * @return null|string - */ - protected function determineInputCode(SplFileInfo $file, $code) - { - return $this->determineCode($file, $code, '-in.php'); - } - - /** - * @param null|string $code - * @param string $suffix - * - * @return null|string - */ - private function determineCode(SplFileInfo $file, $code, $suffix) - { - if (null !== $code) { - return $code; - } - - $candidateFile = new SplFileInfo($file->getPathname().$suffix, '', ''); - if ($candidateFile->isFile()) { - return $candidateFile->getContents(); - } - - return null; - } - - /** - * @param null|string $encoded - * - * @return array - */ - private function parseJson($encoded, array $template = null) - { - // content is optional if template is provided - if (!$encoded && null !== $template) { - $decoded = []; - } else { - $decoded = json_decode($encoded, true); - - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf('Malformed JSON: "%s", error: "%s".', $encoded, json_last_error_msg())); - } - } - - if (null !== $template) { - $decoded = array_merge( - $template, - array_intersect_key( - $decoded, - array_flip(array_keys($template)) - ) - ); - } - - return $decoded; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationTestCase.php b/vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationTestCase.php deleted file mode 100644 index 8d8d686..0000000 --- a/vendor/friendsofphp/php-cs-fixer/tests/Test/AbstractIntegrationTestCase.php +++ /dev/null @@ -1,402 +0,0 @@ -<?php - -/* - * This file is part of PHP CS Fixer. - * - * (c) Fabien Potencier <fabien@symfony.com> - * Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests\Test; - -use PhpCsFixer\Cache\NullCacheManager; -use PhpCsFixer\Differ\SebastianBergmannDiffer; -use PhpCsFixer\Error\Error; -use PhpCsFixer\Error\ErrorsManager; -use PhpCsFixer\FileRemoval; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\FixerFactory; -use PhpCsFixer\Linter\CachingLinter; -use PhpCsFixer\Linter\Linter; -use PhpCsFixer\Linter\LinterInterface; -use PhpCsFixer\Runner\Runner; -use PhpCsFixer\Tests\TestCase; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\WhitespacesFixerConfig; -use Prophecy\Argument; -use Symfony\Component\Filesystem\Exception\IOException; -use Symfony\Component\Filesystem\Filesystem; -use Symfony\Component\Finder\Finder; -use Symfony\Component\Finder\SplFileInfo; - -/** - * Integration test base class. - * - * This test searches for '.test' fixture files in the given directory. - * Each fixture file will be parsed and tested against the expected result. - * - * Fixture files have the following format: - * - * --TEST-- - * Example test description. - * --RULESET-- - * {"@PSR2": true, "strict": true} - * --CONFIG--* - * {"indent": " ", "lineEnding": "\n"} - * --SETTINGS--* - * {"key": "value"} # optional extension point for custom IntegrationTestCase class - * --EXPECT-- - * Expected code after fixing - * --INPUT--* - * Code to fix - * - * * Section or any line in it may be omitted. - * ** PHP minimum version. Default to current running php version (no effect). - * - * @author SpacePossum - * - * @internal - */ -abstract class AbstractIntegrationTestCase extends TestCase -{ - use IsIdenticalConstraint; - - /** - * @var null|LinterInterface - */ - protected $linter; - - /** - * @var null|FileRemoval - */ - private static $fileRemoval; - - public static function setUpBeforeClass() - { - parent::setUpBeforeClass(); - - $tmpFile = static::getTempFile(); - self::$fileRemoval = new FileRemoval(); - self::$fileRemoval->observe($tmpFile); - - if (!is_file($tmpFile)) { - $dir = \dirname($tmpFile); - - if (!is_dir($dir)) { - $fs = new Filesystem(); - $fs->mkdir($dir, 0766); - } - } - } - - public static function tearDownAfterClass() - { - parent::tearDownAfterClass(); - - $tmpFile = static::getTempFile(); - - self::$fileRemoval->delete($tmpFile); - self::$fileRemoval = null; - } - - protected function setUp() - { - parent::setUp(); - - $this->linter = $this->getLinter(); - - // @todo remove at 3.0 together with env var itself - if (getenv('PHP_CS_FIXER_TEST_USE_LEGACY_TOKENIZER')) { - Tokens::setLegacyMode(true); - } - } - - protected function tearDown() - { - parent::tearDown(); - - $this->linter = null; - - // @todo remove at 3.0 - Tokens::setLegacyMode(false); - } - - /** - * @dataProvider provideIntegrationCases - * - * @see doTest() - */ - public function testIntegration(IntegrationCase $case) - { - $this->doTest($case); - } - - /** - * Creates test data by parsing '.test' files. - * - * @return IntegrationCase[][] - */ - public function provideIntegrationCases() - { - $fixturesDir = realpath(static::getFixturesDir()); - if (!is_dir($fixturesDir)) { - throw new \UnexpectedValueException(sprintf('Given fixture dir "%s" is not a directory.', $fixturesDir)); - } - - $factory = static::createIntegrationCaseFactory(); - $tests = []; - - /** @var SplFileInfo $file */ - foreach (Finder::create()->files()->in($fixturesDir) as $file) { - if ('test' !== $file->getExtension()) { - continue; - } - - $tests[$file->getPathname()] = [ - $factory->create($file), - ]; - } - - return $tests; - } - - /** - * @return IntegrationCaseFactoryInterface - */ - protected static function createIntegrationCaseFactory() - { - return new IntegrationCaseFactory(); - } - - /** - * Returns the full path to directory which contains the tests. - * - * @return string - */ - protected static function getFixturesDir() - { - throw new \BadMethodCallException('Method "getFixturesDir" must be overridden by the extending class.'); - } - - /** - * Returns the full path to the temporary file where the test will write to. - * - * @return string - */ - protected static function getTempFile() - { - throw new \BadMethodCallException('Method "getTempFile" must be overridden by the extending class.'); - } - - /** - * Applies the given fixers on the input and checks the result. - * - * It will write the input to a temp file. The file will be fixed by a Fixer instance - * configured with the given fixers. The result is compared with the expected output. - * It checks if no errors were reported during the fixing. - */ - protected function doTest(IntegrationCase $case) - { - if (\PHP_VERSION_ID < $case->getRequirement('php')) { - static::markTestSkipped(sprintf('PHP %d (or later) is required for "%s", current "%d".', $case->getRequirement('php'), $case->getFileName(), \PHP_VERSION_ID)); - } - - $input = $case->getInputCode(); - $expected = $case->getExpectedCode(); - - $input = $case->hasInputCode() ? $input : $expected; - - $tmpFile = static::getTempFile(); - - if (false === @file_put_contents($tmpFile, $input)) { - throw new IOException(sprintf('Failed to write to tmp. file "%s".', $tmpFile)); - } - - $errorsManager = new ErrorsManager(); - $fixers = static::createFixers($case); - $runner = new Runner( - new \ArrayIterator([new \SplFileInfo($tmpFile)]), - $fixers, - new SebastianBergmannDiffer(), - null, - $errorsManager, - $this->linter, - false, - new NullCacheManager() - ); - - Tokens::clearCache(); - $result = $runner->fix(); - $changed = array_pop($result); - - if (!$errorsManager->isEmpty()) { - $errors = $errorsManager->getExceptionErrors(); - static::assertEmpty($errors, sprintf('Errors reported during fixing of file "%s": %s', $case->getFileName(), $this->implodeErrors($errors))); - - $errors = $errorsManager->getInvalidErrors(); - static::assertEmpty($errors, sprintf('Errors reported during linting before fixing file "%s": %s.', $case->getFileName(), $this->implodeErrors($errors))); - - $errors = $errorsManager->getLintErrors(); - static::assertEmpty($errors, sprintf('Errors reported during linting after fixing file "%s": %s.', $case->getFileName(), $this->implodeErrors($errors))); - } - - if (!$case->hasInputCode()) { - static::assertEmpty( - $changed, - sprintf( - "Expected no changes made to test \"%s\" in \"%s\".\nFixers applied:\n%s.\nDiff.:\n%s.", - $case->getTitle(), - $case->getFileName(), - null === $changed ? '[None]' : implode(',', $changed['appliedFixers']), - null === $changed ? '[None]' : $changed['diff'] - ) - ); - - return; - } - - static::assertNotEmpty($changed, sprintf('Expected changes made to test "%s" in "%s".', $case->getTitle(), $case->getFileName())); - $fixedInputCode = file_get_contents($tmpFile); - static::assertThat( - $fixedInputCode, - self::createIsIdenticalStringConstraint($expected), - sprintf( - "Expected changes do not match result for \"%s\" in \"%s\".\nFixers applied:\n%s.", - $case->getTitle(), - $case->getFileName(), - null === $changed ? '[None]' : implode(',', $changed['appliedFixers']) - ) - ); - - if (1 < \count($fixers)) { - $tmpFile = static::getTempFile(); - if (false === @file_put_contents($tmpFile, $input)) { - throw new IOException(sprintf('Failed to write to tmp. file "%s".', $tmpFile)); - } - - $runner = new Runner( - new \ArrayIterator([new \SplFileInfo($tmpFile)]), - array_reverse($fixers), - new SebastianBergmannDiffer(), - null, - $errorsManager, - $this->linter, - false, - new NullCacheManager() - ); - - Tokens::clearCache(); - $runner->fix(); - $fixedInputCodeWithReversedFixers = file_get_contents($tmpFile); - - static::assertRevertedOrderFixing($case, $fixedInputCode, $fixedInputCodeWithReversedFixers); - } - - // run the test again with the `expected` part, this should always stay the same - $this->testIntegration( - new IntegrationCase( - $case->getFileName(), - $case->getTitle().' "--EXPECT-- part run"', - $case->getSettings(), - $case->getRequirements(), - $case->getConfig(), - $case->getRuleset(), - $case->getExpectedCode(), - null - ) - ); - } - - /** - * @param string $fixedInputCode - * @param string $fixedInputCodeWithReversedFixers - */ - protected static function assertRevertedOrderFixing(IntegrationCase $case, $fixedInputCode, $fixedInputCodeWithReversedFixers) - { - // If output is different depends on rules order - we need to verify that the rules are ordered by priority. - // If not, any order is valid. - if ($fixedInputCode !== $fixedInputCodeWithReversedFixers) { - static::assertGreaterThan( - 1, - \count(array_unique(array_map( - static function (FixerInterface $fixer) { - return $fixer->getPriority(); - }, - static::createFixers($case) - ))), - sprintf( - 'Rules priorities are not differential enough. If rules would be used in reverse order then final output would be different than the expected one. For that, different priorities must be set up for used rules to ensure stable order of them. In "%s".', - $case->getFileName() - ) - ); - } - } - - /** - * @return FixerInterface[] - */ - private static function createFixers(IntegrationCase $case) - { - $config = $case->getConfig(); - - return FixerFactory::create() - ->registerBuiltInFixers() - ->useRuleSet($case->getRuleset()) - ->setWhitespacesConfig( - new WhitespacesFixerConfig($config['indent'], $config['lineEnding']) - ) - ->getFixers() - ; - } - - /** - * @param Error[] $errors - * - * @return string - */ - private function implodeErrors(array $errors) - { - $errorStr = ''; - foreach ($errors as $error) { - $source = $error->getSource(); - $errorStr .= sprintf("%d: %s%s\n", $error->getType(), $error->getFilePath(), null === $source ? '' : ' '.$source->getMessage()."\n\n".$source->getTraceAsString()); - } - - return $errorStr; - } - - /** - * @return LinterInterface - */ - private function getLinter() - { - static $linter = null; - - if (null === $linter) { - if (getenv('SKIP_LINT_TEST_CASES')) { - $linterProphecy = $this->prophesize(\PhpCsFixer\Linter\LinterInterface::class); - $linterProphecy - ->lintSource(Argument::type('string')) - ->willReturn($this->prophesize(\PhpCsFixer\Linter\LintingResultInterface::class)->reveal()) - ; - $linterProphecy - ->lintFile(Argument::type('string')) - ->willReturn($this->prophesize(\PhpCsFixer\Linter\LintingResultInterface::class)->reveal()) - ; - $linterProphecy - ->isAsync() - ->willReturn(false) - ; - - $linter = $linterProphecy->reveal(); - } else { - $linter = new CachingLinter(new Linter()); - } - } - - return $linter; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/tests/Test/Assert/AssertTokensTrait.php b/vendor/friendsofphp/php-cs-fixer/tests/Test/Assert/AssertTokensTrait.php deleted file mode 100644 index 409446e..0000000 --- a/vendor/friendsofphp/php-cs-fixer/tests/Test/Assert/AssertTokensTrait.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php - -/* - * This file is part of PHP CS Fixer. - * - * (c) Fabien Potencier <fabien@symfony.com> - * Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests\Test\Assert; - -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * @internal - */ -trait AssertTokensTrait -{ - private static function assertTokens(Tokens $expectedTokens, Tokens $inputTokens) - { - foreach ($expectedTokens as $index => $expectedToken) { - $inputToken = $inputTokens[$index]; - - static::assertTrue( - $expectedToken->equals($inputToken), - sprintf("The token at index %d must be:\n%s,\ngot:\n%s.", $index, $expectedToken->toJson(), $inputToken->toJson()) - ); - - $expectedTokenKind = $expectedToken->isArray() ? $expectedToken->getId() : $expectedToken->getContent(); - static::assertTrue( - $inputTokens->isTokenKindFound($expectedTokenKind), - sprintf( - 'The token kind %s (%s) must be found in tokens collection.', - $expectedTokenKind, - \is_string($expectedTokenKind) ? $expectedTokenKind : Token::getNameForId($expectedTokenKind) - ) - ); - } - - static::assertSame($expectedTokens->count(), $inputTokens->count(), 'Both collections must have the same length.'); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCase.php b/vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCase.php deleted file mode 100644 index 4148799..0000000 --- a/vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCase.php +++ /dev/null @@ -1,153 +0,0 @@ -<?php - -/* - * This file is part of PHP CS Fixer. - * - * (c) Fabien Potencier <fabien@symfony.com> - * Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests\Test; - -use PhpCsFixer\RuleSet; - -/** - * @author Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * @internal - */ -final class IntegrationCase -{ - private $config; - - /** - * @var string - */ - private $expectedCode; - - /** - * @var string - */ - private $fileName; - - /** - * @var null|string - */ - private $inputCode; - - /** - * Env requirements (possible keys: php). - * - * @var array - */ - private $requirements; - - /** - * @var RuleSet - */ - private $ruleset; - - /** - * Settings how to perform the test (possible keys: none in base class, use as extension point for custom IntegrationTestCase). - * - * @var array - */ - private $settings; - - /** - * @var string - */ - private $title; - - /** - * @param string $fileName - * @param string $title - * @param string $expectedCode - * @param null|string $inputCode - */ - public function __construct( - $fileName, - $title, - array $settings, - array $requirements, - array $config, - RuleSet $ruleset, - $expectedCode, - $inputCode - ) { - $this->fileName = $fileName; - $this->title = $title; - $this->settings = $settings; - $this->requirements = $requirements; - $this->config = $config; - $this->ruleset = $ruleset; - $this->expectedCode = $expectedCode; - $this->inputCode = $inputCode; - } - - public function hasInputCode() - { - return null !== $this->inputCode; - } - - public function getConfig() - { - return $this->config; - } - - public function getExpectedCode() - { - return $this->expectedCode; - } - - public function getFileName() - { - return $this->fileName; - } - - public function getInputCode() - { - return $this->inputCode; - } - - /** - * @param string $name - * - * @return mixed - */ - public function getRequirement($name) - { - if (!\array_key_exists($name, $this->requirements)) { - throw new \InvalidArgumentException(sprintf( - 'Unknown requirement key "%s", expected any of "%s".', - $name, - implode('","', array_keys($this->requirements)) - )); - } - - return $this->requirements[$name]; - } - - public function getRequirements() - { - return $this->requirements; - } - - public function getRuleset() - { - return $this->ruleset; - } - - public function getSettings() - { - return $this->settings; - } - - public function getTitle() - { - return $this->title; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactory.php b/vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactory.php deleted file mode 100644 index 14702f2..0000000 --- a/vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactory.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -/* - * This file is part of PHP CS Fixer. - * - * (c) Fabien Potencier <fabien@symfony.com> - * Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests\Test; - -/** - * @author Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * @internal - */ -final class IntegrationCaseFactory extends AbstractIntegrationCaseFactory -{ -} diff --git a/vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactoryInterface.php b/vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactoryInterface.php deleted file mode 100644 index f69a2eb..0000000 --- a/vendor/friendsofphp/php-cs-fixer/tests/Test/IntegrationCaseFactoryInterface.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -/* - * This file is part of PHP CS Fixer. - * - * (c) Fabien Potencier <fabien@symfony.com> - * Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests\Test; - -use Symfony\Component\Finder\SplFileInfo; - -/** - * @author Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * @internal - */ -interface IntegrationCaseFactoryInterface -{ - /** - * @return IntegrationCase - */ - public function create(SplFileInfo $file); -} diff --git a/vendor/friendsofphp/php-cs-fixer/tests/Test/InternalIntegrationCaseFactory.php b/vendor/friendsofphp/php-cs-fixer/tests/Test/InternalIntegrationCaseFactory.php deleted file mode 100644 index 0228b2c..0000000 --- a/vendor/friendsofphp/php-cs-fixer/tests/Test/InternalIntegrationCaseFactory.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -/* - * This file is part of PHP CS Fixer. - * - * (c) Fabien Potencier <fabien@symfony.com> - * Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests\Test; - -use Symfony\Component\Finder\SplFileInfo; - -/** - * @author Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * @internal - */ -final class InternalIntegrationCaseFactory extends AbstractIntegrationCaseFactory -{ - /** - * {@inheritdoc} - */ - protected function determineSettings(SplFileInfo $file, $config) - { - $parsed = parent::determineSettings($file, $config); - - $parsed['isExplicitPriorityCheck'] = \in_array('priority', explode(\DIRECTORY_SEPARATOR, $file->getRelativePathname()), true); - - return $parsed; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/tests/Test/IsIdenticalConstraint.php b/vendor/friendsofphp/php-cs-fixer/tests/Test/IsIdenticalConstraint.php deleted file mode 100644 index 114d9cb..0000000 --- a/vendor/friendsofphp/php-cs-fixer/tests/Test/IsIdenticalConstraint.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -/* - * This file is part of PHP CS Fixer. - * - * (c) Fabien Potencier <fabien@symfony.com> - * Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests\Test; - -use PhpCsFixer\PhpunitConstraintIsIdenticalString\Constraint\IsIdenticalString; -use PHPUnit\Framework\Constraint\IsIdentical as PhpUnitIsIdentical; - -/** - * @internal - * - * @todo Remove me when usages will end up in dedicated package. - */ -trait IsIdenticalConstraint -{ - /** - * @todo Remove me when this class will end up in dedicated package. - * - * @param string $expected - * - * @return IsIdenticalString|\PHPUnit_Framework_Constraint_IsIdentical|PhpUnitIsIdentical - */ - private static function createIsIdenticalStringConstraint($expected) - { - $candidate = self::getIsIdenticalStringConstraintClassName(); - - return new $candidate($expected); - } - - /** - * @return string - */ - private static function getIsIdenticalStringConstraintClassName() - { - foreach ([ - IsIdenticalString::class, - PhpUnitIsIdentical::class, - 'PHPUnit_Framework_Constraint_IsIdentical', - ] as $className) { - if (class_exists($className)) { - return $className; - } - } - - throw new \RuntimeException('PHPUnit not installed?!'); - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/tests/TestCase.php b/vendor/friendsofphp/php-cs-fixer/tests/TestCase.php deleted file mode 100644 index 1702107..0000000 --- a/vendor/friendsofphp/php-cs-fixer/tests/TestCase.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php - -/* - * This file is part of PHP CS Fixer. - * - * (c) Fabien Potencier <fabien@symfony.com> - * Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Tests; - -use PHPUnit\Framework\TestCase as BaseTestCase; -use PHPUnitGoodPractices\Traits\ExpectationViaCodeOverAnnotationTrait; -use PHPUnitGoodPractices\Traits\ExpectOverSetExceptionTrait; -use PHPUnitGoodPractices\Traits\IdentityOverEqualityTrait; -use PHPUnitGoodPractices\Traits\ProphecyOverMockObjectTrait; -use PHPUnitGoodPractices\Traits\ProphesizeOnlyInterfaceTrait; - -if (trait_exists(ProphesizeOnlyInterfaceTrait::class)) { - /** - * @author Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * @internal - */ - abstract class TestCase extends BaseTestCase - { - use ExpectationViaCodeOverAnnotationTrait; - use ExpectOverSetExceptionTrait; - use IdentityOverEqualityTrait; - use ProphecyOverMockObjectTrait; - use ProphesizeOnlyInterfaceTrait; - } -} else { - /** - * Version without traits for cases when this class is used as a lib. - * - * @author Dariusz Rumiński <dariusz.ruminski@gmail.com> - * - * @internal - * - * @todo 3.0 To be removed when we clean up composer prod-autoloader from dev-packages. - */ - abstract class TestCase extends BaseTestCase - { - } -} diff --git a/vendor/johnkary/phpunit-speedtrap/.gitignore b/vendor/johnkary/phpunit-speedtrap/.gitignore deleted file mode 100644 index 238a9c6..0000000 --- a/vendor/johnkary/phpunit-speedtrap/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/phpunit.xml -/vendor -/composer.lock diff --git a/vendor/johnkary/phpunit-speedtrap/.travis.yml b/vendor/johnkary/phpunit-speedtrap/.travis.yml deleted file mode 100644 index a32c81d..0000000 --- a/vendor/johnkary/phpunit-speedtrap/.travis.yml +++ /dev/null @@ -1,41 +0,0 @@ -language: php - -php: - - 7.1 - - 7.2 - - 7.3 - - 7.4 - - nightly - -env: - - PHPUNIT=7.* - - PHPUNIT=8.* - - PHPUNIT=9.* - - PHPUNIT=dev-master MIN_STABILITY=dev - -matrix: - exclude: - - php: 7.1 - env: PHPUNIT=8.* - - php: 7.1 - env: PHPUNIT=9.* - - php: 7.1 - env: PHPUNIT=dev-master MIN_STABILITY=dev - - php: 7.2 - env: PHPUNIT=9.* - - php: 7.2 - env: PHPUNIT=dev-master MIN_STABILITY=dev - allow_failures: - - php: nightly - -cache: - directories: - - $HOME/.composer - -before_script: - - phpenv config-rm xdebug.ini || true - - if [ "$MIN_STABILITY" != "" ]; then composer config minimum-stability $MIN_STABILITY; fi - - composer require phpunit/phpunit:${PHPUNIT} - -script: - - ./vendor/bin/phpunit diff --git a/vendor/johnkary/phpunit-speedtrap/CHANGELOG.md b/vendor/johnkary/phpunit-speedtrap/CHANGELOG.md deleted file mode 100644 index a2b2f46..0000000 --- a/vendor/johnkary/phpunit-speedtrap/CHANGELOG.md +++ /dev/null @@ -1,41 +0,0 @@ -CHANGELOG -================= - -View diff for a specific commit: -https://github.com/johnkary/phpunit-speedtrap/commit/XXX where XXX is the commit hash - -View diff between two versions: -https://github.com/johnkary/phpunit-speedtrap/compare/v3.1.0...v3.2.0 - -## 3.2.0 (2020-02-12) - -Version 3.2 introduces supports for PHPUnit 9.0+. -If your use of SpeedTrap depends on specific text output from SpeedTrap slowness -report, see below wording changes that may require updating your implementation. - -* [PR #57](https://github.com/johnkary/phpunit-speedtrap/pull/57) Wording change to slowness report in renderHeader() - -## 3.1.0 (2019-02-23) - -Version 3.1 introduces support for PHPUnit 8.0+. - -## 3.0.0 (2018-02-24) - -Version 3.0 introduces support for PHPUnit 7.0+ and PHP 7.1+. - -Changes may be required if you have extended SpeedTrapListener. See -[UPGRADE.md](UPGRADE.md) for upgrading your subclass to support 3.0. - -* [PR #41](https://github.com/johnkary/phpunit-speedtrap/pull/41) Make compatible with phpunit 7.x - -## 2.0.0 (2017-12-06) - -Version 2.0 introduces support for PHPUnit 6.0+, PHP 7.0+ and PSR-4 autoloading. - -Changes are required if you have extended SpeedTrapListener. See -[UPGRADE.md](UPGRADE.md) for upgrading your subclass to support 2.0. - -* [PR #26](https://github.com/johnkary/phpunit-speedtrap/pull/26) Support PHPUnit 6.0 -* [PR #30](https://github.com/johnkary/phpunit-speedtrap/pull/30) Add PHP 7 features (includes backwards compatibility breaks, see UPGRADE.md) -* [PR #31](https://github.com/johnkary/phpunit-speedtrap/pull/31) Support PSR-4 autoloading -* [PR #39](https://github.com/johnkary/phpunit-speedtrap/pull/39) SpeedTrapListener extends PHPUnit BaseTestListener diff --git a/vendor/johnkary/phpunit-speedtrap/LICENSE b/vendor/johnkary/phpunit-speedtrap/LICENSE deleted file mode 100644 index 1f129cb..0000000 --- a/vendor/johnkary/phpunit-speedtrap/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 John Kary - -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/johnkary/phpunit-speedtrap/README.md b/vendor/johnkary/phpunit-speedtrap/README.md deleted file mode 100644 index 5ba0556..0000000 --- a/vendor/johnkary/phpunit-speedtrap/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# phpunit-speedtrap - -[![Build Status](https://travis-ci.org/johnkary/phpunit-speedtrap.svg?branch=master)](https://travis-ci.org/johnkary/phpunit-speedtrap) - -SpeedTrap reports on slow-running PHPUnit tests right in the console. - -Many factors affect test execution time. A test not properly isolated from variable latency (database, network, etc.) and even basic load on the test machine will cause test execution times to fluctuate. - -SpeedTrap helps **identify slow tests** but cannot explain **why** those tests are slow. For that consider using [Blackfire.io](https://blackfire.io) to profile the test suite, or another PHPUnit listener [PHPUnit\_Listener\_XHProf](https://github.com/sebastianbergmann/phpunit-testlistener-xhprof), to specifically identify slow code. - -![Screenshot of terminal using SpeedTrap](http://i.imgur.com/Zr34giR.png) - -## Installation - -SpeedTrap is installable via [Composer](http://getcomposer.org) and should be added as a `require-dev` dependency: - - composer require --dev johnkary/phpunit-speedtrap - - -## Usage - -Enable with all defaults by adding the following code to your project's `phpunit.xml` file: - -```xml -<phpunit bootstrap="vendor/autoload.php"> -... - <listeners> - <listener class="JohnKary\PHPUnit\Listener\SpeedTrapListener" /> - </listeners> -</phpunit> -``` - -Now run the test suite as normal. If one or more test executions exceed the slowness threshold (500ms by default), SpeedTrap will report on those tests in the console after all tests have completed. - -## Configuration - -SpeedTrap has two configurable parameters: - -* **slowThreshold** - Number of milliseconds a test takes to execute before being considered "slow" (Default: 500ms) -* **reportLength** - Number of slow tests included in the report (Default: 10 tests) - -These configuration parameters are set in `phpunit.xml` when adding the listener: - -```xml -<phpunit bootstrap="vendor/autoload.php"> - <!-- ... other suite configuration here ... --> - - <listeners> - <listener class="JohnKary\PHPUnit\Listener\SpeedTrapListener"> - <arguments> - <array> - <element key="slowThreshold"> - <integer>500</integer> - </element> - <element key="reportLength"> - <integer>5</integer> - </element> - </array> - </arguments> - </listener> - </listeners> -</phpunit> -``` - -This allows customizing what the project considers a "slow" test and how many are reported on to project maintainers. - -## Custom slowness threshold per-test case - -Some projects have a few complex tests that take a long time to run. It is possible to set a different slowness threshold for individual test cases. - -Use the annotation `@slowThreshold` to set a custom slowness threshold for single test cases. This number may be higher or lower than the default threshold and will be used in place of the default threshold for that specific test. - -```php -class SomeTestCase extends PHPUnit\Framework\TestCase -{ - /** - * @slowThreshold 5000 - */ - public function testLongRunningProcess() - { - // Code that takes a longer time to execute - } -} -``` - -## Inspiration - -This project was inspired by [RSpec's](https://github.com/rspec/rspec) `--profile` option that displays feedback about slow tests. - -## License - -phpunit-speedtrap is available under the MIT License. diff --git a/vendor/johnkary/phpunit-speedtrap/UPGRADE.md b/vendor/johnkary/phpunit-speedtrap/UPGRADE.md deleted file mode 100644 index c70b361..0000000 --- a/vendor/johnkary/phpunit-speedtrap/UPGRADE.md +++ /dev/null @@ -1,38 +0,0 @@ -UPGRADE FROM 2.x to 3.0 -======================= - -### `JohnKary\PHPUnit\Listener\SpeedTrapListener` subclasses must ensure method signatures match PHPUnit TestListenerDefaultImplementation - -SpeedTrapListener was upgraded to support PHPUnit 7.0, which introduced a -new trait `TestListenerDefaultImplementation` containing a few new scalar type -hints and void return hints. SpeedTrapListener subclasses overriding any -of the below methods will require updating the new method signatures: - -| Old signature | New signature | -| -------- | --- | -| `public function endTest(Test $test, $time)` | `public function endTest(Test $test, float $time): void` -| `public function startTestSuite(TestSuite $suite)` | `public function startTestSuite(TestSuite $suite): void` -| `public function endTestSuite(TestSuite $suite)` | `public function endTestSuite(TestSuite $suite): void` - - -UPGRADE FROM 1.x to 2.0 -======================= - -### `JohnKary\PHPUnit\Listener\SpeedTrapListener` subclasses must implement scalar type hints - -SpeedTrapListener was upgraded to support PHP 7 scalar type hints. Any -subclass will need to update the overridden function signature: - -* Declare strict types at the top of your subclass: `declare(strict_types=1);` -* Update method signatures: - -| Old signature | New signature | -| -------- | --- | -| `protected function isSlow($time, $slowThreshold)` | `protected function isSlow(int $time, int $slowThreshold) : bool` -| `protected function addSlowTest(TestCase $test, $time)` | `protected function addSlowTest(TestCase $test, int $time)` -| `protected function hasSlowTests()` | `protected function hasSlowTests() : bool` -| `protected function toMilliseconds($time)` | `protected function toMilliseconds(float $time) : int` -| `protected function makeLabel(TestCase $test)` | `protected function makeLabel(TestCase $test) : string` -| `protected function getReportLength()` | `protected function getReportLength() : int` -| `protected function getHiddenCount()` | `protected function getHiddenCount() : int` -| `protected function getSlowThreshold(TestCase $test)` | `protected function getSlowThreshold(TestCase $test) : int` diff --git a/vendor/johnkary/phpunit-speedtrap/composer.json b/vendor/johnkary/phpunit-speedtrap/composer.json deleted file mode 100644 index a3ddcbc..0000000 --- a/vendor/johnkary/phpunit-speedtrap/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "johnkary/phpunit-speedtrap", - "type": "library", - "description": "Find and report on slow tests in your PHPUnit test suite", - "keywords": [ - "PHPUnit", - "slow", - "profile" - ], - "homepage": "https://github.com/johnkary/phpunit-speedtrap", - "license": "MIT", - "authors": [ - { - "name": "John Kary", - "email": "john@johnkary.net" - } - ], - "require": { - "php": ">=7.1", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - } - }, - "autoload": { - "psr-4": { - "JohnKary\\PHPUnit\\Listener\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "JohnKary\\PHPUnit\\Listener\\Tests\\": "tests/" - } - } -} diff --git a/vendor/johnkary/phpunit-speedtrap/phpunit.xml.dist b/vendor/johnkary/phpunit-speedtrap/phpunit.xml.dist deleted file mode 100644 index 8e95376..0000000 --- a/vendor/johnkary/phpunit-speedtrap/phpunit.xml.dist +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<!-- http://www.phpunit.de/manual/current/en/appendixes.configuration.html --> -<phpunit - xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation = "vendor/phpunit/phpunit/phpunit.xsd" - backupGlobals = "false" - backupStaticAttributes = "false" - colors = "true" - convertErrorsToExceptions = "true" - convertNoticesToExceptions = "true" - convertWarningsToExceptions = "true" - processIsolation = "false" - stopOnFailure = "false" - bootstrap = "vendor/autoload.php"> - - <testsuites> - <testsuite name="Project Test Suite"> - <directory>tests</directory> - </testsuite> - </testsuites> - - <listeners> - <listener class="JohnKary\PHPUnit\Listener\SpeedTrapListener"> - <arguments> - <array> - <element key="slowThreshold"> - <integer>500</integer> - </element> - <element key="reportLength"> - <integer>5</integer> - </element> - </array> - </arguments> - </listener> - </listeners> - - <filter> - <whitelist> - <directory>src</directory> - </whitelist> - </filter> - -</phpunit> diff --git a/vendor/johnkary/phpunit-speedtrap/src/SpeedTrapListener.php b/vendor/johnkary/phpunit-speedtrap/src/SpeedTrapListener.php deleted file mode 100644 index dcf0a1f..0000000 --- a/vendor/johnkary/phpunit-speedtrap/src/SpeedTrapListener.php +++ /dev/null @@ -1,229 +0,0 @@ -<?php -declare(strict_types=1); - -namespace JohnKary\PHPUnit\Listener; - -use PHPUnit\Framework\{TestListener, TestListenerDefaultImplementation, TestSuite, Test, TestCase}; - -/** - * A PHPUnit TestListener that exposes your slowest running tests by outputting - * results directly to the console. - */ -class SpeedTrapListener implements TestListener -{ - use TestListenerDefaultImplementation; - - /** - * Internal tracking for test suites. - * - * Increments as more suites are run, then decremented as they finish. All - * suites have been run when returns to 0. - */ - protected $suites = 0; - - /** - * Test execution time (milliseconds) after which a test will be considered - * "slow" and be included in the slowness report. - * - * @var int - */ - protected $slowThreshold; - - /** - * Number of tests to print in slowness report. - * - * @var int - */ - protected $reportLength; - - /** - * Collection of slow tests. - * Keys (string) => Printable label describing the test - * Values (int) => Test execution time, in milliseconds - */ - protected $slow = []; - - public function __construct(array $options = []) - { - $this->loadOptions($options); - } - - /** - * A test ended. - * - * @param Test $test - * @param float $time - */ - public function endTest(Test $test, float $time): void - { - if (!$test instanceof TestCase) return; - - $timeInMilliseconds = $this->toMilliseconds($time); - $threshold = $this->getSlowThreshold($test); - - if ($this->isSlow($timeInMilliseconds, $threshold)) { - $this->addSlowTest($test, $timeInMilliseconds); - } - } - - /** - * A test suite started. - * - * @param TestSuite $suite - */ - public function startTestSuite(TestSuite $suite): void - { - $this->suites++; - } - - /** - * A test suite ended. - * - * @param TestSuite $suite - */ - public function endTestSuite(TestSuite $suite): void - { - $this->suites--; - - if (0 === $this->suites && $this->hasSlowTests()) { - arsort($this->slow); // Sort longest running tests to the top - - $this->renderHeader(); - $this->renderBody(); - $this->renderFooter(); - } - } - - /** - * Whether the given test execution time is considered slow. - * - * @param int $time Test execution time in milliseconds - * @param int $slowThreshold Test execution time at which a test should be considered slow, in milliseconds - */ - protected function isSlow(int $time, int $slowThreshold): bool - { - return $time >= $slowThreshold; - } - - /** - * Stores a test as slow. - */ - protected function addSlowTest(TestCase $test, int $time) - { - $label = $this->makeLabel($test); - - $this->slow[$label] = $time; - } - - /** - * Whether at least one test has been considered slow. - */ - protected function hasSlowTests(): bool - { - return !empty($this->slow); - } - - /** - * Convert PHPUnit's reported test time (microseconds) to milliseconds. - */ - protected function toMilliseconds(float $time): int - { - return (int) round($time * 1000); - } - - /** - * Label describing a test. - */ - protected function makeLabel(TestCase $test): string - { - return sprintf('%s:%s', get_class($test), $test->getName()); - } - - /** - * Calculate number of tests to include in slowness report. - */ - protected function getReportLength(): int - { - return min(count($this->slow), $this->reportLength); - } - - /** - * Calculate number of slow tests to be hidden from the slowness report - * due to list length. - */ - protected function getHiddenCount(): int - { - $total = count($this->slow); - $showing = $this->getReportLength(); - - $hidden = 0; - if ($total > $showing) { - $hidden = $total - $showing; - } - - return $hidden; - } - - /** - * Renders slowness report header. - */ - protected function renderHeader() - { - echo sprintf("\n\nYou should really speed up these slow tests (>%sms)...\n", $this->slowThreshold); - } - - /** - * Renders slowness report body. - */ - protected function renderBody() - { - $slowTests = $this->slow; - - $length = $this->getReportLength(); - for ($i = 1; $i <= $length; ++$i) { - $label = key($slowTests); - $time = array_shift($slowTests); - - echo sprintf(" %s. %sms to run %s\n", $i, $time, $label); - } - } - - /** - * Renders slowness report footer. - */ - protected function renderFooter() - { - if ($hidden = $this->getHiddenCount()) { - echo sprintf("...and there %s %s more above your threshold hidden from view", $hidden == 1 ? 'is' : 'are', $hidden); - } - } - - /** - * Populate options into class internals. - */ - protected function loadOptions(array $options) - { - $this->slowThreshold = $options['slowThreshold'] ?? 500; - $this->reportLength = $options['reportLength'] ?? 10; - } - - /** - * Calculate slow test threshold for given test. A TestCase may override the - * suite-wide slowness threshold by using the annotation {@slowThreshold} - * with a threshold value in milliseconds. - * - * For example, the following test would be considered slow if its execution - * time meets or exceeds 5000ms (5 seconds): - * - * <code> - * \@slowThreshold 5000 - * public function testLongRunningProcess() {} - * </code> - */ - protected function getSlowThreshold(TestCase $test): int - { - $ann = $test->getAnnotations(); - - return isset($ann['method']['slowThreshold'][0]) ? (int) $ann['method']['slowThreshold'][0] : $this->slowThreshold; - } -} diff --git a/vendor/johnkary/phpunit-speedtrap/tests/ExceptionalTest.php b/vendor/johnkary/phpunit-speedtrap/tests/ExceptionalTest.php deleted file mode 100644 index afc2ef4..0000000 --- a/vendor/johnkary/phpunit-speedtrap/tests/ExceptionalTest.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -declare(strict_types=1); - -namespace JohnKary\PHPUnit\Listener\Tests; - -use PHPUnit\Framework\TestCase; - -class ExceptionalTest extends TestCase -{ - public function testExceptionCanBeThrownInTest() - { - $this->expectException('InvalidArgumentException'); - $this->expectExceptionMessage('CODE1'); - throw new \InvalidArgumentException('CODE1'); - } - - public function testSkippedTest() - { - $this->markTestSkipped('Skipped tests do not cause Exceptions in Listener'); - } - - public function testIncompleteTest() - { - $this->markTestIncomplete('Incomplete tests do not cause Exceptions in Listener'); - } -} - \ No newline at end of file diff --git a/vendor/johnkary/phpunit-speedtrap/tests/SomeSlowTest.php b/vendor/johnkary/phpunit-speedtrap/tests/SomeSlowTest.php deleted file mode 100644 index b441488..0000000 --- a/vendor/johnkary/phpunit-speedtrap/tests/SomeSlowTest.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php -declare(strict_types=1); - -namespace JohnKary\PHPUnit\Listener\Tests; - -use PHPUnit\Framework\TestCase; - -class SomeSlowTest extends TestCase -{ - public function testFastTest() - { - $this->assertTrue(true); - } - - public function testSlowTests() - { - $this->extendTime(300); - - $this->assertTrue(true); - } - - public function testAnotherSlowTests() - { - $this->extendTime(500); - - $this->assertTrue(true); - } - - public function testLongEndToEndTest() - { - $this->extendTime(500); - - $this->assertTrue(true); - } - - /** - * @dataProvider provideTime - */ - public function testWithDataProvider(int $time) - { - $this->extendTime($time); - - $this->assertTrue(true); - } - public function provideTime() - { - return [ - 'Rock' => [800], - 'Chalk' => [700], - 'Jayhawk' => [600], - ]; - } - - /** - * This test's runtime would normally be under the suite's threshold, but - * this annotation sets a lower threshold, causing it to be considered slow - * and reported on in the test output. - * - * @slowThreshold 5 - */ - public function testCanSetLowerSlowThreshold() - { - $this->extendTime(10); - $this->assertTrue(true); - } - - /** - * This test's runtime would normally be over the suite's threshold, but - * this annotation sets a higher threshold, causing it to be not be - * considered slow and not reported on in the test output. - * - * @slowThreshold 50000 - */ - public function testCanSetHigherSlowThreshold() - { - $this->extendTime(600); - $this->assertTrue(true); - } - - /** - * @param int $ms Number of additional microseconds to execute code - */ - private function extendTime(int $ms) - { - usleep($ms * 1000); - } -} diff --git a/vendor/microsoft/tolerant-php-parser/LICENSE.txt b/vendor/microsoft/tolerant-php-parser/LICENSE.txt deleted file mode 100644 index 79918eb..0000000 --- a/vendor/microsoft/tolerant-php-parser/LICENSE.txt +++ /dev/null @@ -1,17 +0,0 @@ -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -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/microsoft/tolerant-php-parser/ThirdPartyNotices.txt b/vendor/microsoft/tolerant-php-parser/ThirdPartyNotices.txt deleted file mode 100644 index d712c99..0000000 --- a/vendor/microsoft/tolerant-php-parser/ThirdPartyNotices.txt +++ /dev/null @@ -1,22 +0,0 @@ -Microsoft/tolerant-php-parser - -THIRD-PARTY SOFTWARE NOTICES AND INFORMATION -Do Not Translate or Localize - -This project incorporates components from the projects listed below. The original copyright notices and the licenses under which Microsoft received such components are set forth below. Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise. - -1. php/php-langspec (https://github.com/php/php-langspec) - - -%% php/php-langspec NOTICES AND INFORMATION BEGIN HERE -========================================= -Facebook has dedicated all copyright to this specification to the public -domain worldwide under the CC0 Public Domain Dedication located at -<http://creativecommons.org/publicdomain/zero/1.0/>. - -The first draft of this specification was initially written in 2014 by -Facebook, Inc. - -This specification is distributed without any warranty. -========================================= -END OF php/php-langspec NOTICES AND INFORMATION diff --git a/vendor/microsoft/tolerant-php-parser/composer.json b/vendor/microsoft/tolerant-php-parser/composer.json deleted file mode 100644 index 9579f11..0000000 --- a/vendor/microsoft/tolerant-php-parser/composer.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "microsoft/tolerant-php-parser", - "description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios", - "type": "library", - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.4" - }, - "license": "MIT", - "authors": [ - { - "name": "Rob Lourens", - "email": "roblou@microsoft.com" - } - ], - "autoload": { - "psr-4": { "Microsoft\\PhpParser\\": ["src/"] } - } -} diff --git a/vendor/microsoft/tolerant-php-parser/phpstan.neon b/vendor/microsoft/tolerant-php-parser/phpstan.neon deleted file mode 100644 index bfbed74..0000000 --- a/vendor/microsoft/tolerant-php-parser/phpstan.neon +++ /dev/null @@ -1,9 +0,0 @@ -parameters: - level: 2 - paths: - - src/ - ignoreErrors: - # phpstan issue, see: https://github.com/phpstan/phpstan/issues/1306 - - "/Variable .unaryExpression might not be defined./" - - "/Variable .passedPrefix might not be defined./" - - "/Variable .prefix might not be defined./" diff --git a/vendor/microsoft/tolerant-php-parser/src/CharacterCodes.php b/vendor/microsoft/tolerant-php-parser/src/CharacterCodes.php deleted file mode 100644 index c411ed6..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/CharacterCodes.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class CharacterCodes { - const _0 = 0x30; - const _1 = 0x31; - const _2 = 0x32; - const _3 = 0x33; - const _4 = 0x34; - const _5 = 0x35; - const _6 = 0x36; - const _7 = 0x37; - const _8 = 0x38; - const _9 = 0x39; - - const a = 0x61; - const b = 0x62; - const c = 0x63; - const d = 0x64; - const e = 0x65; - const f = 0x66; - const g = 0x67; - const h = 0x68; - const i = 0x69; - const j = 0x6A; - const k = 0x6B; - const l = 0x6C; - const m = 0x6D; - const n = 0x6E; - const o = 0x6F; - const p = 0x70; - const q = 0x71; - const r = 0x72; - const s = 0x73; - const t = 0x74; - const u = 0x75; - const v = 0x76; - const w = 0x77; - const x = 0x78; - const y = 0x79; - const z = 0x7A; - - const A = 0x41; - const B = 0x42; - const C = 0x43; - const D = 0x44; - const E = 0x45; - const F = 0x46; - const G = 0x47; - const H = 0x48; - const I = 0x49; - const J = 0x4A; - const K = 0x4B; - const L = 0x4C; - const M = 0x4D; - const N = 0x4E; - const O = 0x4F; - const P = 0x50; - const Q = 0x51; - const R = 0x52; - const S = 0x53; - const T = 0x54; - const U = 0x55; - const V = 0x56; - const W = 0x57; - const X = 0x58; - const Y = 0x59; - const Z = 0x5a; - - const _underscore = 0x5F; // _ - const _dollar = 0x24; // $ - const _ampersand = 0x26; // & - const _asterisk = 0x2A; // * - const _at = 0x40; // @ - const _backslash = 0x5C; // \ - const _backtick = 0x60; // ` - const _bar = 0x7C; // | - const _caret = 0x5E; // ^ - const _closeBrace = 0x7D; // } - const _closeBracket = 0x5D; // ] - const _closeParen = 0x29; // ) - const _colon = 0x3A; // : - const _comma = 0x2C; // ; - const _dot = 0x2E; // . - const _doubleQuote = 0x22; // " - const _equals = 0x3D; // = - const _exclamation = 0x21; // ! - const _greaterThan = 0x3E; // > - const _hash = 0x23; // # - const _lessThan = 0x3C; // < - const _minus = 0x2D; // - - const _openBrace = 0x7B; // { - const _openBracket = 0x5B; // [ - const _openParen = 0x28; // ( - const _percent = 0x25; // % - const _plus = 0x2B; // + - const _question = 0x3F; // ? - const _semicolon = 0x3B; // ; - const _singleQuote = 0x27; // ' - const _slash = 0x2F; // / - const _tilde = 0x7E; // ~ - - const _backspace = 0x08; // \b - const _formFeed = 0x0C; // \f - const _byteOrderMark = 0xFEFF; - const _space = 0x20; - const _newline = 0x0A; // \n - const _return = 0x0D; // \r - const _tab = 0x09; // \t - const _verticalTab = 0x0B; // \v -} diff --git a/vendor/microsoft/tolerant-php-parser/src/ClassLike.php b/vendor/microsoft/tolerant-php-parser/src/ClassLike.php deleted file mode 100644 index 08b7fa8..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/ClassLike.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -/** - * Represents Classes, Interfaces and Traits. - */ -interface ClassLike {} diff --git a/vendor/microsoft/tolerant-php-parser/src/Diagnostic.php b/vendor/microsoft/tolerant-php-parser/src/Diagnostic.php deleted file mode 100644 index a3e1228..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Diagnostic.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class Diagnostic { - /** @var int */ - public $kind; - - /** @var string */ - public $message; - - /** @var int */ - public $start; - - /** @var int */ - public $length; - - public function __construct(int $kind, string $message, int $start, int $length) { - $this->kind = $kind; - $this->message = $message; - $this->start = $start; - $this->length = $length; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/DiagnosticKind.php b/vendor/microsoft/tolerant-php-parser/src/DiagnosticKind.php deleted file mode 100644 index 012db9d..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/DiagnosticKind.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class DiagnosticKind { - const Error = 0; - const Warning = 1; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/DiagnosticsProvider.php b/vendor/microsoft/tolerant-php-parser/src/DiagnosticsProvider.php deleted file mode 100644 index 89f274e..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/DiagnosticsProvider.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -use Microsoft\PhpParser\Node; - -class DiagnosticsProvider { - - /** - * @var string[] maps the token kind to the corresponding name - */ - private static $tokenKindToText; - - /** - * @param int $kind (must be a valid token kind) - * @return string - */ - public static function getTextForTokenKind($kind) { - return self::$tokenKindToText[$kind]; - } - - /** - * This is called when this class is loaded, at the bottom of this file. - * @return void - */ - public static function initTokenKindToText() { - self::$tokenKindToText = \array_flip(\array_merge( - TokenStringMaps::OPERATORS_AND_PUNCTUATORS, - TokenStringMaps::KEYWORDS, - TokenStringMaps::RESERVED_WORDS - )); - } - - /** - * Returns the diagnostic for $node, or null. - * @param \Microsoft\PhpParser\Node|\Microsoft\PhpParser\Token $node - * @return Diagnostic|null - */ - public static function checkDiagnostics($node) { - if ($node instanceof Token) { - if (\get_class($node) === Token::class) { - return null; - } - return self::checkDiagnosticForUnexpectedToken($node); - } - - if ($node instanceof Node) { - return $node->getDiagnosticForNode(); - } - return null; - } - - /** - * @param Token $token - * @return Diagnostic|null - */ - private static function checkDiagnosticForUnexpectedToken($token) { - if ($token instanceof SkippedToken) { - // TODO - consider also attaching parse context information to skipped tokens - // this would allow us to provide more helpful error messages that inform users what to do - // about the problem rather than simply pointing out the mistake. - return new Diagnostic( - DiagnosticKind::Error, - "Unexpected '" . - (self::$tokenKindToText[$token->kind] - ?? Token::getTokenKindNameFromValue($token->kind)) . - "'", - $token->start, - $token->getEndPosition() - $token->start - ); - } elseif ($token instanceof MissingToken) { - return new Diagnostic( - DiagnosticKind::Error, - "'" . - (self::$tokenKindToText[$token->kind] - ?? Token::getTokenKindNameFromValue($token->kind)) . - "' expected.", - $token->start, - $token->getEndPosition() - $token->start - ); - } - } - - /** - * Traverses AST to generate diagnostics. - * @param \Microsoft\PhpParser\Node $n - * @return Diagnostic[] - */ - public static function getDiagnostics(Node $n) : array { - $diagnostics = []; - - /** - * @param \Microsoft\PhpParser\Node|\Microsoft\PhpParser\Token $node - */ - $n->walkDescendantNodesAndTokens(function($node) use (&$diagnostics) { - if (($diagnostic = self::checkDiagnostics($node)) !== null) { - $diagnostics[] = $diagnostic; - } - }); - - return $diagnostics; - } -} - -DiagnosticsProvider::initTokenKindToText(); diff --git a/vendor/microsoft/tolerant-php-parser/src/FilePositionMap.php b/vendor/microsoft/tolerant-php-parser/src/FilePositionMap.php deleted file mode 100644 index 1cb056b..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/FilePositionMap.php +++ /dev/null @@ -1,142 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -/** - * FilePositionMap can be used to get the line number for a large number of nodes (starting from 1). - * It works the most efficiently when the requested node is close to the previously requested node. - * - * Other designs that weren't chosen: - * - Precomputing all of the start/end offsets when initializing was slower - Some offsets weren't needed, and walking the tree was slower. - * - Caching line numbers for previously requested offsets wasn't really necessary, since offsets are usually close together and weren't requested repeatedly. - */ -class FilePositionMap { - /** @var string the full file contents */ - private $fileContents; - - /** @var int - Precomputed strlen($file_contents) */ - private $fileContentsLength; - - /** @var int the 0-based byte offset of the most recent request for a line number. */ - private $currentOffset; - - /** @var int the 1-based line number for $this->currentOffset (updated whenever currentOffset is updated) */ - private $lineForCurrentOffset; - - public function __construct(string $file_contents) { - $this->fileContents = $file_contents; - $this->fileContentsLength = \strlen($file_contents); - $this->currentOffset = 0; - $this->lineForCurrentOffset = 1; - } - - /** - * @param Node $node the node to get the start line for. - * TODO deprecate and merge this and getTokenStartLine into getStartLine - * if https://github.com/Microsoft/tolerant-php-parser/issues/166 is fixed, - * (i.e. if there is a consistent way to get the start offset) - */ - public function getNodeStartLine(Node $node) : int { - return $this->getLineNumberForOffset($node->getStart()); - } - - /** - * @param Token $token the token to get the start line for. - */ - public function getTokenStartLine(Token $token) : int { - return $this->getLineNumberForOffset($token->start); - } - - /** - * @param Node|Token $node - */ - public function getStartLine($node) : int { - if ($node instanceof Token) { - $offset = $node->start; - } else { - $offset = $node->getStart(); - } - return $this->getLineNumberForOffset($offset); - } - - /** - * @param Node|Token $node - * Similar to getStartLine but includes the column - */ - public function getStartLineCharacterPositionForOffset($node) : LineCharacterPosition { - if ($node instanceof Token) { - $offset = $node->start; - } else { - $offset = $node->getStart(); - } - return $this->getLineCharacterPositionForOffset($offset); - } - - /** @param Node|Token $node */ - public function getEndLine($node) : int { - return $this->getLineNumberForOffset($node->getEndPosition()); - } - - /** - * @param Node|Token $node - * Similar to getStartLine but includes the column - */ - public function getEndLineCharacterPosition($node) : LineCharacterPosition { - return $this->getLineCharacterPositionForOffset($node->getEndPosition()); - } - - /** - * @param int $offset - * Similar to getStartLine but includes both the line and the column - */ - public function getLineCharacterPositionForOffset(int $offset) : LineCharacterPosition { - $line = $this->getLineNumberForOffset($offset); - $character = $this->getColumnForOffset($offset); - return new LineCharacterPosition($line, $character); - } - - /** - * @param int $offset - A 0-based byte offset - * @return int - gets the 1-based line number for $offset - */ - public function getLineNumberForOffset(int $offset) : int { - if ($offset < 0) { - $offset = 0; - } elseif ($offset > $this->fileContentsLength) { - $offset = $this->fileContentsLength; - } - $currentOffset = $this->currentOffset; - if ($offset > $currentOffset) { - $this->lineForCurrentOffset += \substr_count($this->fileContents, "\n", $currentOffset, $offset - $currentOffset); - $this->currentOffset = $offset; - } elseif ($offset < $currentOffset) { - $this->lineForCurrentOffset -= \substr_count($this->fileContents, "\n", $offset, $currentOffset - $offset); - $this->currentOffset = $offset; - } - return $this->lineForCurrentOffset; - } - - /** - * @param int $offset - A 0-based byte offset - * @return int - gets the 1-based column number for $offset - */ - public function getColumnForOffset(int $offset) : int { - $length = $this->fileContentsLength; - if ($offset <= 1) { - return 1; - } elseif ($offset > $length) { - $offset = $length; - } - // Postcondition: offset >= 1, ($lastNewlinePos < $offset) - // If there was no previous newline, lastNewlinePos = 0 - - // Start strrpos check from the character before the current character, - // in case the current character is a newline. - $lastNewlinePos = \strrpos($this->fileContents, "\n", -$length + $offset - 1); - return 1 + $offset - ($lastNewlinePos === false ? 0 : $lastNewlinePos + 1); - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/FunctionLike.php b/vendor/microsoft/tolerant-php-parser/src/FunctionLike.php deleted file mode 100644 index 73580bf..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/FunctionLike.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -/** - * Interface for recognizing functions easily. - * Each Node that implements this interface can be considered a function. - */ -interface FunctionLike {} \ No newline at end of file diff --git a/vendor/microsoft/tolerant-php-parser/src/LineCharacterPosition.php b/vendor/microsoft/tolerant-php-parser/src/LineCharacterPosition.php deleted file mode 100644 index 6b28434..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/LineCharacterPosition.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class LineCharacterPosition { - public $line; - public $character; - - public function __construct(int $line, int $character) { - $this->line = $line; - $this->character = $character; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/MissingToken.php b/vendor/microsoft/tolerant-php-parser/src/MissingToken.php deleted file mode 100644 index be3e6e0..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/MissingToken.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class MissingToken extends Token { - public function __construct(int $kind, int $fullStart) { - parent::__construct($kind, $fullStart, $fullStart, 0); - } - - public function jsonSerialize() { - return array_merge( - ["error" => $this->getTokenKindNameFromValue(TokenKind::MissingToken)], - parent::jsonSerialize() - ); - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/NamespacedNameInterface.php b/vendor/microsoft/tolerant-php-parser/src/NamespacedNameInterface.php deleted file mode 100644 index d4431d5..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/NamespacedNameInterface.php +++ /dev/null @@ -1,11 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -interface NamespacedNameInterface { - public function getNamespacedName() : ResolvedName; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/NamespacedNameTrait.php b/vendor/microsoft/tolerant-php-parser/src/NamespacedNameTrait.php deleted file mode 100644 index 3fc292b..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/NamespacedNameTrait.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -use Microsoft\PhpParser\Node\NamespaceUseClause; -use Microsoft\PhpParser\Node\NamespaceUseGroupClause; -use Microsoft\PhpParser\Node\QualifiedName; -use Microsoft\PhpParser\Node\Statement\NamespaceDefinition; -use Microsoft\PhpParser\Node\Statement\NamespaceUseDeclaration; - -trait NamespacedNameTrait { - public abstract function getNamespaceDefinition(); - public abstract function getFileContents() : string; - public abstract function getNameParts() : array; - - /** - * Gets resolved name from current namespace. Note that this is not necessarily the *actual* name - * that is resolved during compilation or at runtime. For that, see QualifiedName::getResolvedName(). - * - * @return ResolvedName - */ - public function getNamespacedName() : ResolvedName { - $namespaceDefinition = $this->getNamespaceDefinition(); - $content = $this->getFileContents(); - if ($namespaceDefinition === null) { - // global namespace -> strip namespace\ prefix - return ResolvedName::buildName($this->getNameParts(), $content); - } - - if ($namespaceDefinition->name !== null) { - $resolvedName = ResolvedName::buildName($namespaceDefinition->name->nameParts, $content); - } else { - $resolvedName = ResolvedName::buildName([], $content); - } - if ( - !($this instanceof QualifiedName && ( - ($this->parent instanceof NamespaceDefinition) || - ($this->parent instanceof NamespaceUseDeclaration) || - ($this->parent instanceof NamespaceUseClause) || - ($this->parent instanceof NamespaceUseGroupClause))) - ) { - $resolvedName->addNameParts($this->getNameParts(), $content); - } - return $resolvedName; - } -} \ No newline at end of file diff --git a/vendor/microsoft/tolerant-php-parser/src/Node.php b/vendor/microsoft/tolerant-php-parser/src/Node.php deleted file mode 100644 index bc7e6bb..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node.php +++ /dev/null @@ -1,697 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -use Microsoft\PhpParser\Node\NamespaceUseClause; -use Microsoft\PhpParser\Node\NamespaceUseGroupClause; -use Microsoft\PhpParser\Node\SourceFileNode; -use Microsoft\PhpParser\Node\Statement\NamespaceDefinition; -use Microsoft\PhpParser\Node\Statement\NamespaceUseDeclaration; - -abstract class Node implements \JsonSerializable { - const CHILD_NAMES = []; - - /** @var array[] Map from node class to array of child keys */ - private static $childNames = []; - - /** @var Node|null */ - public $parent; - - public function getNodeKindName() : string { - // Use strrpos (rather than explode) to avoid creating a temporary array. - return substr(static::class, strrpos(static::class, "\\") + 1); - } - - /** - * Gets start position of Node, not including leading comments and whitespace. - * @return int - * @throws \Exception - */ - public function getStart() : int { - $child = $this->getChildNodesAndTokens()->current(); - if ($child instanceof Node) { - return $child->getStart(); - } elseif ($child instanceof Token) { - return $child->start; - } - throw new \Exception("Unknown type in AST"); - } - - /** - * Gets start position of Node, including leading comments and whitespace - * @return int - * @throws \Exception - */ - public function getFullStart() : int { - foreach($this::CHILD_NAMES as $name) { - - if (($child = $this->$name) !== null) { - - if (\is_array($child)) { - if(!isset($child[0])) { - continue; - } - $child = $child[0]; - } - - if ($child instanceof Node) { - return $child->getFullStart(); - } - - if ($child instanceof Token) { - return $child->fullStart; - } - - throw new \Exception("Unknown type in AST: " . \gettype($child)); - } - }; - - throw new \RuntimeException("Could not resolve full start position"); - } - - /** - * Gets parent of current node (returns null if has no parent) - * @return null|Node - */ - public function getParent() { - return $this->parent; - } - - /** - * Gets first ancestor that is an instance of one of the provided classes. - * Returns null if there is no match. - * - * @param string ...$classNames - * @return Node|null - */ - public function getFirstAncestor(...$classNames) { - $ancestor = $this; - while (($ancestor = $ancestor->parent) !== null) { - foreach ($classNames as $className) { - if ($ancestor instanceof $className) { - return $ancestor; - } - } - } - return null; - } - - /** - * Gets first child that is an instance of one of the provided classes. - * Returns null if there is no match. - * - * @param array ...$classNames - * @return Node|null - */ - public function getFirstChildNode(...$classNames) { - foreach ($this::CHILD_NAMES as $name) { - $val = $this->$name; - foreach ($classNames as $className) { - if (\is_array($val)) { - foreach ($val as $child) { - if ($child instanceof $className) { - return $child; - } - } - continue; - } elseif ($val instanceof $className) { - return $val; - } - } - } - return null; - } - - /** - * Gets first descendant node that is an instance of one of the provided classes. - * Returns null if there is no match. - * - * @param array ...$classNames - * @return Node|null - */ - public function getFirstDescendantNode(...$classNames) { - foreach ($this->getDescendantNodes() as $descendant) { - foreach ($classNames as $className) { - if ($descendant instanceof $className) { - return $descendant; - } - } - } - return null; - } - - /** - * Gets root of the syntax tree (returns self if has no parents) - * @return SourceFileNode (expect root to be SourceFileNode unless the tree was manipulated) - */ - public function getRoot() : Node { - $node = $this; - while ($node->parent !== null) { - $node = $node->parent; - } - return $node; - } - - /** - * Gets generator containing all descendant Nodes and Tokens. - * - * @param callable|null $shouldDescendIntoChildrenFn - * @return \Generator|Node[]|Token[] - */ - public function getDescendantNodesAndTokens(callable $shouldDescendIntoChildrenFn = null) { - // TODO - write unit tests to prove invariants - // (concatenating all descendant Tokens should produce document, concatenating all Nodes should produce document) - foreach ($this->getChildNodesAndTokens() as $child) { - // Check possible types of $child, most frequent first - if ($child instanceof Node) { - yield $child; - if ($shouldDescendIntoChildrenFn === null || $shouldDescendIntoChildrenFn($child)) { - yield from $child->getDescendantNodesAndTokens($shouldDescendIntoChildrenFn); - } - } elseif ($child instanceof Token) { - yield $child; - } - } - } - - /** - * Iterate over all descendant Nodes and Tokens, calling $callback. - * This can often be faster than getDescendantNodesAndTokens - * if you just need to call something and don't need a generator. - * - * @param callable $callback a callback that accepts Node|Token - * @param callable|null $shouldDescendIntoChildrenFn - * @return void - */ - public function walkDescendantNodesAndTokens(callable $callback, callable $shouldDescendIntoChildrenFn = null) { - // TODO - write unit tests to prove invariants - // (concatenating all descendant Tokens should produce document, concatenating all Nodes should produce document) - foreach (static::CHILD_NAMES as $name) { - $child = $this->$name; - // Check possible types of $child, most frequent first - if ($child instanceof Token) { - $callback($child); - } elseif ($child instanceof Node) { - $callback($child); - if ($shouldDescendIntoChildrenFn === null || $shouldDescendIntoChildrenFn($child)) { - $child->walkDescendantNodesAndTokens($callback, $shouldDescendIntoChildrenFn); - } - } elseif (\is_array($child)) { - foreach ($child as $childElement) { - if ($childElement instanceof Token) { - $callback($childElement); - } elseif ($childElement instanceof Node) { - $callback($childElement); - if ($shouldDescendIntoChildrenFn === null || $shouldDescendIntoChildrenFn($childElement)) { - $childElement->walkDescendantNodesAndTokens($callback, $shouldDescendIntoChildrenFn); - } - } - } - } - } - } - - /** - * Gets a generator containing all descendant Nodes. - * @param callable|null $shouldDescendIntoChildrenFn - * @return \Generator|Node[] - */ - public function getDescendantNodes(callable $shouldDescendIntoChildrenFn = null) { - foreach ($this->getChildNodes() as $child) { - yield $child; - if ($shouldDescendIntoChildrenFn === null || $shouldDescendIntoChildrenFn($child)) { - yield from $child->getDescendantNodes($shouldDescendIntoChildrenFn); - } - } - } - - /** - * Gets generator containing all descendant Tokens. - * @param callable|null $shouldDescendIntoChildrenFn - * @return \Generator|Token[] - */ - public function getDescendantTokens(callable $shouldDescendIntoChildrenFn = null) { - foreach ($this->getChildNodesAndTokens() as $child) { - if ($child instanceof Node) { - if ($shouldDescendIntoChildrenFn == null || $shouldDescendIntoChildrenFn($child)) { - yield from $child->getDescendantTokens($shouldDescendIntoChildrenFn); - } - } elseif ($child instanceof Token) { - yield $child; - } - } - } - - /** - * Gets generator containing all child Nodes and Tokens (direct descendants). - * Does not return null elements. - * - * @return \Generator|Token[]|Node[] - */ - public function getChildNodesAndTokens() : \Generator { - foreach ($this::CHILD_NAMES as $name) { - $val = $this->$name; - - if (\is_array($val)) { - foreach ($val as $child) { - if ($child !== null) { - yield $name => $child; - } - } - continue; - } - if ($val !== null) { - yield $name => $val; - } - } - } - - /** - * Gets generator containing all child Nodes (direct descendants) - * @return \Generator|Node[] - */ - public function getChildNodes() : \Generator { - foreach ($this::CHILD_NAMES as $name) { - $val = $this->$name; - if (\is_array($val)) { - foreach ($val as $child) { - if ($child instanceof Node) { - yield $child; - } - } - continue; - } elseif ($val instanceof Node) { - yield $val; - } - } - } - - /** - * Gets generator containing all child Tokens (direct descendants) - * - * @return \Generator|Token[] - */ - public function getChildTokens() { - foreach ($this::CHILD_NAMES as $name) { - $val = $this->$name; - if (\is_array($val)) { - foreach ($val as $child) { - if ($child instanceof Token) { - yield $child; - } - } - continue; - } elseif ($val instanceof Token) { - yield $val; - } - } - } - - /** - * Gets array of declared child names (cached). - * - * This is used as an optimization when iterating over nodes: For direct iteration - * PHP will create a properties hashtable on the object, thus doubling memory usage. - * We avoid this by iterating over just the names instead. - * - * @return string[] - */ - public function getChildNames() { - return $this::CHILD_NAMES; - } - - /** - * Gets width of a Node (not including comment / whitespace trivia) - * - * @return int - */ - public function getWidth() : int { - $first = $this->getStart(); - $last = $this->getEndPosition(); - - return $last - $first; - } - - /** - * Gets width of a Node (including comment / whitespace trivia) - * - * @return int - */ - public function getFullWidth() : int { - $first = $this->getFullStart(); - $last = $this->getEndPosition(); - - return $last - $first; - } - - /** - * Gets string representing Node text (not including leading comment + whitespace trivia) - * @return string - */ - public function getText() : string { - $start = $this->getStart(); - $end = $this->getEndPosition(); - - $fileContents = $this->getFileContents(); - return \substr($fileContents, $start, $end - $start); - } - - /** - * Gets full text of Node (including leading comment + whitespace trivia) - * @return string - */ - public function getFullText() : string { - $start = $this->getFullStart(); - $end = $this->getEndPosition(); - - $fileContents = $this->getFileContents(); - return \substr($fileContents, $start, $end - $start); - - } - - /** - * Gets string representing Node's leading comment and whitespace text. - * @return string - */ - public function getLeadingCommentAndWhitespaceText() : string { - // TODO re-tokenize comments and whitespace - $fileContents = $this->getFileContents(); - foreach ($this->getDescendantTokens() as $token) { - return $token->getLeadingCommentsAndWhitespaceText($fileContents); - } - } - - protected function getChildrenKvPairs() { - $result = array(); - foreach ($this::CHILD_NAMES as $name) { - $result[$name] = $this->$name; - } - return $result; - } - - public function jsonSerialize() { - $kindName = $this->getNodeKindName(); - return ["$kindName" => $this->getChildrenKvPairs()]; - } - - /** - * Get the end index of a Node. - * @return int - * @throws \Exception - */ - public function getEndPosition() { - // TODO test invariant - start of next node is end of previous node - for ($i = \count($childKeys = $this::CHILD_NAMES) - 1; $i >= 0; $i--) { - $lastChildKey = $childKeys[$i]; - $lastChild = $this->$lastChildKey; - - if (\is_array($lastChild)) { - $lastChild = \end($lastChild); - } - - if ($lastChild instanceof Token) { - return $lastChild->fullStart + $lastChild->length; - } elseif ($lastChild instanceof Node) { - return $lastChild->getEndPosition(); - } - } - - throw new \Exception("Unhandled node type"); - } - - public function getFileContents() : string { - // TODO consider renaming to getSourceText - return $this->getRoot()->fileContents; - } - - public function getUri() : string { - return $this->getRoot()->uri; - } - - public function getLastChild() { - $a = iterator_to_array($this->getChildNodesAndTokens()); - return \end($a); - } - - /** - * Searches descendants to find a Node at the given position. - * - * @param int $pos - * @return Node - */ - public function getDescendantNodeAtPosition(int $pos) { - foreach ($this->getChildNodes() as $child) { - if ($child->containsPosition($pos)) { - $node = $child->getDescendantNodeAtPosition($pos); - if (!is_null($node)) { - return $node; - } - } - } - - return $this; - } - - /** - * Returns true if the given Node or Token contains the given position. - * @param int $pos - * @return bool - */ - private function containsPosition(int $pos): bool { - return $this->getStart() <= $pos && $pos <= $this->getEndPosition(); - } - - /** - * Gets leading PHP Doc Comment text corresponding to the current Node. - * Returns last doc comment in leading comment / whitespace trivia, - * and returns null if there is no preceding doc comment. - * - * @return string|null - */ - public function getDocCommentText() { - $leadingTriviaText = $this->getLeadingCommentAndWhitespaceText(); - $leadingTriviaTokens = PhpTokenizer::getTokensArrayFromContent( - $leadingTriviaText, ParseContext::SourceElements, $this->getFullStart(), false - ); - for ($i = \count($leadingTriviaTokens) - 1; $i >= 0; $i--) { - $token = $leadingTriviaTokens[$i]; - if ($token->kind === TokenKind::DocCommentToken) { - return $token->getText($this->getFileContents()); - } - } - return null; - } - - public function __toString() { - return $this->getText(); - } - - /** - * @return array|ResolvedName[][] - * @throws \Exception - */ - public function getImportTablesForCurrentScope() { - $namespaceDefinition = $this->getNamespaceDefinition(); - - // Use declarations can exist in either the global scope, or inside namespace declarations. - // http://php.net/manual/en/language.namespaces.importing.php#language.namespaces.importing.scope - // - // The only code allowed before a namespace declaration is a declare statement, and sub-namespaces are - // additionally unaffected by by import rules of higher-level namespaces. Therefore, we can make the assumption - // that we need not travel up the spine any further once we've found the current namespace. - // http://php.net/manual/en/language.namespaces.definition.php - if ($namespaceDefinition instanceof NamespaceDefinition) { - $topLevelNamespaceStatements = $namespaceDefinition->compoundStatementOrSemicolon instanceof Token - ? $namespaceDefinition->parent->statementList // we need to start from the namespace definition. - : $namespaceDefinition->compoundStatementOrSemicolon->statements; - $namespaceFullStart = $namespaceDefinition->getFullStart(); - } else { - $topLevelNamespaceStatements = $this->getRoot()->statementList; - $namespaceFullStart = 0; - } - - $nodeFullStart = $this->getFullStart(); - - // TODO optimize performance - // Currently we rebuild the import tables on every call (and therefore every name resolution operation) - // It is likely that a consumer will attempt many consecutive name resolution requests within the same file. - // Therefore, we can consider optimizing on the basis of the "most recently used" import table set. - // The idea: Keep a single set of import tables cached based on a unique root node id, and invalidate - // cache whenever we attempt to resolve a qualified name with a different root node. - // - // In order to make this work, it will probably make sense to change the way we parse namespace definitions. - // https://github.com/Microsoft/tolerant-php-parser/issues/81 - // - // Currently the namespace definition only includes a compound statement or semicolon token as one if it's children. - // Instead, we should move to a model where we parse future statements as a child rather than as a separate - // statement. This would enable us to retrieve all the information we would need to find the fully qualified - // name by simply traveling up the spine to find the first ancestor of type NamespaceDefinition. - $namespaceImportTable = $functionImportTable = $constImportTable = []; - $contents = $this->getFileContents(); - - foreach ($topLevelNamespaceStatements as $useDeclaration) { - if ($useDeclaration->getFullStart() <= $namespaceFullStart) { - continue; - } - if ($useDeclaration->getFullStart() > $nodeFullStart) { - break; - } elseif (!($useDeclaration instanceof NamespaceUseDeclaration)) { - continue; - } - - // TODO fix getValues - foreach ((isset($useDeclaration->useClauses) ? $useDeclaration->useClauses->getValues() : []) as $useClause) { - $namespaceNamePartsPrefix = $useClause->namespaceName !== null ? $useClause->namespaceName->nameParts : []; - - if ($useClause->groupClauses !== null && $useClause instanceof NamespaceUseClause) { - // use A\B\C\{D\E}; namespace import: ["E" => [A,B,C,D,E]] - // use A\B\C\{D\E as F}; namespace import: ["F" => [A,B,C,D,E]] - // use function A\B\C\{A, B} function import: ["A" => [A,B,C,A], "B" => [A,B,C]] - // use function A\B\C\{const A} const import: ["A" => [A,B,C,A]] - foreach ($useClause->groupClauses->children as $groupClause) { - if (!($groupClause instanceof NamespaceUseGroupClause)) { - continue; - } - $namespaceNameParts = \array_merge($namespaceNamePartsPrefix, $groupClause->namespaceName->nameParts); - $functionOrConst = $groupClause->functionOrConst ?? $useDeclaration->functionOrConst; - $alias = $groupClause->namespaceAliasingClause === null - ? $groupClause->namespaceName->getLastNamePart()->getText($contents) - : $groupClause->namespaceAliasingClause->name->getText($contents); - - $this->addToImportTable( - $alias, $functionOrConst, $namespaceNameParts, $contents, - $namespaceImportTable, $functionImportTable, $constImportTable - ); - } - } else { - // use A\B\C; namespace import: ["C" => [A,B,C]] - // use A\B\C as D; namespace import: ["D" => [A,B,C]] - // use function A\B\C as D function import: ["D" => [A,B,C]] - // use A\B, C\D; namespace import: ["B" => [A,B], "D" => [C,D]] - $alias = $useClause->namespaceAliasingClause === null - ? $useClause->namespaceName->getLastNamePart()->getText($contents) - : $useClause->namespaceAliasingClause->name->getText($contents); - $functionOrConst = $useDeclaration->functionOrConst; - $namespaceNameParts = $namespaceNamePartsPrefix; - - $this->addToImportTable( - $alias, $functionOrConst, $namespaceNameParts, $contents, - $namespaceImportTable, $functionImportTable, $constImportTable - ); - } - } - } - - return [$namespaceImportTable, $functionImportTable, $constImportTable]; - } - - /** - * Gets corresponding NamespaceDefinition for Node. Returns null if in global namespace. - * - * @return NamespaceDefinition|null - */ - public function getNamespaceDefinition() { - $namespaceDefinition = $this instanceof NamespaceDefinition - ? $this - : $this->getFirstAncestor(NamespaceDefinition::class, SourceFileNode::class); - - if ($namespaceDefinition instanceof NamespaceDefinition && !($namespaceDefinition->parent instanceof SourceFileNode)) { - $namespaceDefinition = $namespaceDefinition->getFirstAncestor(SourceFileNode::class); - } - - if ($namespaceDefinition === null) { - // TODO provide a way to throw errors without crashing consumer - throw new \Exception("Invalid tree - SourceFileNode must always exist at root of tree."); - } - - $fullStart = $this->getFullStart(); - $lastNamespaceDefinition = null; - if ($namespaceDefinition instanceof SourceFileNode) { - foreach ($namespaceDefinition->getChildNodes() as $childNode) { - if ($childNode instanceof NamespaceDefinition && $childNode->getFullStart() < $fullStart) { - $lastNamespaceDefinition = $childNode; - } - } - } - - if ($lastNamespaceDefinition !== null && $lastNamespaceDefinition->compoundStatementOrSemicolon instanceof Token) { - $namespaceDefinition = $lastNamespaceDefinition; - } elseif ($namespaceDefinition instanceof SourceFileNode) { - $namespaceDefinition = null; - } - - return $namespaceDefinition; - } - - public function getPreviousSibling() { - // TODO make more efficient - $parent = $this->parent; - if ($parent === null) { - return null; - } - - $prevSibling = null; - - foreach ($parent::CHILD_NAMES as $name) { - $val = $parent->$name; - if (\is_array($val)) { - foreach ($val as $sibling) { - if ($sibling === $this) { - return $prevSibling; - } elseif ($sibling instanceof Node) { - $prevSibling = $sibling; - } - } - continue; - } elseif ($val instanceof Node) { - if ($val === $this) { - return $prevSibling; - } - $prevSibling = $val; - } - } - return null; - } - - /** - * Add the alias and resolved name to the corresponding namespace, function, or const import table. - * If the alias already exists, it will get replaced by the most recent using. - * - * TODO - worth throwing an error here in stead? - */ - private function addToImportTable($alias, $functionOrConst, $namespaceNameParts, $contents, & $namespaceImportTable, & $functionImportTable, & $constImportTable):array - { - if ($alias !== null) { - if ($functionOrConst === null) { - // namespaces are case-insensitive -// $alias = \strtolower($alias); - $namespaceImportTable[$alias] = ResolvedName::buildName($namespaceNameParts, $contents); - return array($namespaceImportTable, $functionImportTable, $constImportTable); - } elseif ($functionOrConst->kind === TokenKind::FunctionKeyword) { - // functions are case-insensitive -// $alias = \strtolower($alias); - $functionImportTable[$alias] = ResolvedName::buildName($namespaceNameParts, $contents); - return array($namespaceImportTable, $functionImportTable, $constImportTable); - } elseif ($functionOrConst->kind === TokenKind::ConstKeyword) { - // constants are case-sensitive - $constImportTable[$alias] = ResolvedName::buildName($namespaceNameParts, $contents); - return array($namespaceImportTable, $functionImportTable, $constImportTable); - } - return array($namespaceImportTable, $functionImportTable, $constImportTable); - } - return array($namespaceImportTable, $functionImportTable, $constImportTable); - } - - /** - * This is overridden in subclasses - * @return Diagnostic|null - Callers should use DiagnosticsProvider::getDiagnostics instead - * @internal - */ - public function getDiagnosticForNode() { - return null; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/AnonymousFunctionUseClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/AnonymousFunctionUseClause.php deleted file mode 100644 index b38fee2..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/AnonymousFunctionUseClause.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Node\DelimitedList\UseVariableNameList; -use Microsoft\PhpParser\Token; - -class AnonymousFunctionUseClause extends Node { - /** @var Token */ - public $useKeyword; - - /** @var Token */ - public $openParen; - - /** @var UseVariableNameList */ - public $useVariableNameList; - - /** @var Token */ - public $closeParen; - - const CHILD_NAMES = [ - 'useKeyword', - 'openParen', - 'useVariableNameList', - 'closeParen' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/ArrayElement.php b/vendor/microsoft/tolerant-php-parser/src/Node/ArrayElement.php deleted file mode 100644 index 84fd15f..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/ArrayElement.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class ArrayElement extends Node { - - /** @var Expression|null */ - public $elementKey; - - /** @var Token|null */ - public $arrowToken; - - /** @var Token|null */ - public $byRef; - - /** @var Expression */ - public $elementValue; - - const CHILD_NAMES = [ - 'elementKey', - 'arrowToken', - 'byRef', - 'elementValue' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/CaseStatementNode.php b/vendor/microsoft/tolerant-php-parser/src/Node/CaseStatementNode.php deleted file mode 100644 index 4fb321e..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/CaseStatementNode.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class CaseStatementNode extends Node { - /** @var Token */ - public $caseKeyword; - /** @var Expression */ - public $expression; - /** @var Token */ - public $defaultLabelTerminator; - /** @var StatementNode[] */ - public $statementList; - - const CHILD_NAMES = [ - 'caseKeyword', - 'expression', - 'defaultLabelTerminator', - 'statementList' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/CatchClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/CatchClause.php deleted file mode 100644 index ac71b64..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/CatchClause.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class CatchClause extends Node { - /** @var Token */ - public $catch; - /** @var Token */ - public $openParen; - /** @var QualifiedName */ - public $qualifiedName; - /** - * @var QualifiedName[]|Token[] Remaining tokens and qualified names in the catch clause - * (e.g. `catch (FirstException|SecondException $x)` would contain - * the representation of `|SecondException`) - * - * TODO: In the next backwards incompatible release, replace qualifiedName with qualifiedNameList? - */ - public $otherQualifiedNameList; - /** @var Token */ - public $variableName; - /** @var Token */ - public $closeParen; - /** @var StatementNode */ - public $compoundStatement; - - const CHILD_NAMES = [ - 'catch', - 'openParen', - 'qualifiedName', - 'otherQualifiedNameList', - 'variableName', - 'closeParen', - 'compoundStatement' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/ClassBaseClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/ClassBaseClause.php deleted file mode 100644 index affbf70..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/ClassBaseClause.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class ClassBaseClause extends Node { - /** @var Token */ - public $extendsKeyword; - - /** @var QualifiedName */ - public $baseClass; - - const CHILD_NAMES = [ - 'extendsKeyword', - 'baseClass' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/ClassConstDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/ClassConstDeclaration.php deleted file mode 100644 index c724c5c..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/ClassConstDeclaration.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class ClassConstDeclaration extends Node { - - /** @var Token[] */ - public $modifiers; - - /** @var Token */ - public $constKeyword; - - /** @var DelimitedList\ConstElementList */ - public $constElements; - - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'modifiers', - 'constKeyword', - 'constElements', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/ClassInterfaceClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/ClassInterfaceClause.php deleted file mode 100644 index 5849070..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/ClassInterfaceClause.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class ClassInterfaceClause extends Node { - /** @var Token */ - public $implementsKeyword; - - /** @var DelimitedList\QualifiedNameList|null */ - public $interfaceNameList; - - const CHILD_NAMES = [ - 'implementsKeyword', - 'interfaceNameList' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/ClassMembersNode.php b/vendor/microsoft/tolerant-php-parser/src/Node/ClassMembersNode.php deleted file mode 100644 index 45ddbef..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/ClassMembersNode.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class ClassMembersNode extends Node { - /** @var Token */ - public $openBrace; - - /** @var Node[] */ - public $classMemberDeclarations; - - /** @var Token */ - public $closeBrace; - - const CHILD_NAMES = [ - 'openBrace', - 'classMemberDeclarations', - 'closeBrace' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/ConstElement.php b/vendor/microsoft/tolerant-php-parser/src/Node/ConstElement.php deleted file mode 100644 index 56c70e1..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/ConstElement.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\NamespacedNameInterface; -use Microsoft\PhpParser\NamespacedNameTrait; -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class ConstElement extends Node implements NamespacedNameInterface { - use NamespacedNameTrait; - - /** @var Token */ - public $name; - - /** @var Token */ - public $equalsToken; - - /** @var Expression */ - public $assignment; - - const CHILD_NAMES = [ - 'name', - 'equalsToken', - 'assignment' - ]; - - public function getNameParts() : array { - return [$this->name]; - } - - public function getName() { - return $this->name->getText($this->getFileContents()); - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DeclareDirective.php b/vendor/microsoft/tolerant-php-parser/src/Node/DeclareDirective.php deleted file mode 100644 index 55e9af2..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DeclareDirective.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class DeclareDirective extends Node { - /** @var Token */ - public $name; - /** @var Token */ - public $equals; - /** @var Token */ - public $literal; - - const CHILD_NAMES = [ - 'name', - 'equals', - 'literal' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DefaultStatementNode.php b/vendor/microsoft/tolerant-php-parser/src/Node/DefaultStatementNode.php deleted file mode 100644 index 5cdae3b..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DefaultStatementNode.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class DefaultStatementNode extends Node { - /** @var Token */ - public $defaultKeyword; - /** @var Token */ - public $defaultLabelTerminator; - /** @var StatementNode[] */ - public $statementList; - - const CHILD_NAMES = [ - 'defaultKeyword', - 'defaultLabelTerminator', - 'statementList' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList.php deleted file mode 100644 index 7c45285..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; -use Microsoft\PhpParser\TokenKind; - -abstract class DelimitedList extends Node { - /** @var Token[]|Node[] */ - public $children; - - const CHILD_NAMES = [ - 'children' - ]; - - const DELIMITERS = [TokenKind::CommaToken, TokenKind::BarToken, TokenKind::SemicolonToken]; - - public function getElements() : \Generator { - foreach ($this->children as $child) { - if ($child instanceof Node) { - yield $child; - } elseif ($child instanceof Token && !\in_array($child->kind, self::DELIMITERS)) { - yield $child; - } - } - } - - public function getValues() { - foreach ($this->children as $idx=>$value) { - if ($idx % 2 == 0) { - yield $value; - } - } - } - - public function addElement($node) { - if ($node === null) { - return; - } - if ($this->children === null) { - $this->children = [$node]; - return; - } - $this->children[] = $node; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ArgumentExpressionList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ArgumentExpressionList.php deleted file mode 100644 index 0815ee5..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ArgumentExpressionList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class ArgumentExpressionList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ArrayElementList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ArrayElementList.php deleted file mode 100644 index 53bc43a..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ArrayElementList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class ArrayElementList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ConstElementList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ConstElementList.php deleted file mode 100644 index cab5848..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ConstElementList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class ConstElementList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ExpressionList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ExpressionList.php deleted file mode 100644 index 25c8f2e..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ExpressionList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class ExpressionList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ListExpressionList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ListExpressionList.php deleted file mode 100644 index f2b67d5..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ListExpressionList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class ListExpressionList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/NamespaceUseClauseList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/NamespaceUseClauseList.php deleted file mode 100644 index 4b0d922..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/NamespaceUseClauseList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class NamespaceUseClauseList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/NamespaceUseGroupClauseList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/NamespaceUseGroupClauseList.php deleted file mode 100644 index d3e2eb4..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/NamespaceUseGroupClauseList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class NamespaceUseGroupClauseList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ParameterDeclarationList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ParameterDeclarationList.php deleted file mode 100644 index 1aba56a..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/ParameterDeclarationList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class ParameterDeclarationList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/QualifiedNameList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/QualifiedNameList.php deleted file mode 100644 index f2892cc..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/QualifiedNameList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class QualifiedNameList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/QualifiedNameParts.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/QualifiedNameParts.php deleted file mode 100644 index 6a8d2b0..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/QualifiedNameParts.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class QualifiedNameParts extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/StaticVariableNameList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/StaticVariableNameList.php deleted file mode 100644 index b1b1088..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/StaticVariableNameList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class StaticVariableNameList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/TraitSelectOrAliasClauseList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/TraitSelectOrAliasClauseList.php deleted file mode 100644 index b7b4b58..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/TraitSelectOrAliasClauseList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class TraitSelectOrAliasClauseList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/UseVariableNameList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/UseVariableNameList.php deleted file mode 100644 index ccd70fa..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/UseVariableNameList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class UseVariableNameList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/VariableNameList.php b/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/VariableNameList.php deleted file mode 100644 index 379ae70..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/DelimitedList/VariableNameList.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\DelimitedList; - -use Microsoft\PhpParser\Node\DelimitedList; - -class VariableNameList extends DelimitedList { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/ElseClauseNode.php b/vendor/microsoft/tolerant-php-parser/src/Node/ElseClauseNode.php deleted file mode 100644 index 6ac7ce6..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/ElseClauseNode.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class ElseClauseNode extends Node { - /** @var Token */ - public $elseKeyword; - /** @var Token */ - public $colon; - /** @var StatementNode|StatementNode[] */ - public $statements; - - const CHILD_NAMES = [ - 'elseKeyword', - 'colon', - 'statements' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/ElseIfClauseNode.php b/vendor/microsoft/tolerant-php-parser/src/Node/ElseIfClauseNode.php deleted file mode 100644 index f4b8ab4..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/ElseIfClauseNode.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class ElseIfClauseNode extends Node { - /** @var Token */ - public $elseIfKeyword; - /** @var Token */ - public $openParen; - /** @var Expression */ - public $expression; - /** @var Token */ - public $closeParen; - /** @var Token|null */ - public $colon; - /** @var StatementNode|StatementNode[] */ - public $statements; - - const CHILD_NAMES = [ - 'elseIfKeyword', - 'openParen', - 'expression', - 'closeParen', - 'colon', - 'statements' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression.php deleted file mode 100644 index ad83846..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; - -abstract class Expression extends Node { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/AnonymousFunctionCreationExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/AnonymousFunctionCreationExpression.php deleted file mode 100644 index 7a58acd..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/AnonymousFunctionCreationExpression.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\FunctionLike; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\FunctionBody; -use Microsoft\PhpParser\Node\FunctionHeader; -use Microsoft\PhpParser\Node\FunctionReturnType; -use Microsoft\PhpParser\Node\FunctionUseClause; -use Microsoft\PhpParser\Token; - -class AnonymousFunctionCreationExpression extends Expression implements FunctionLike { - /** @var Token|null */ - public $staticModifier; - - use FunctionHeader, FunctionUseClause, FunctionReturnType, FunctionBody; - - const CHILD_NAMES = [ - 'staticModifier', - - // FunctionHeader - 'functionKeyword', - 'byRefToken', - 'name', - 'openParen', - 'parameters', - 'closeParen', - - // FunctionUseClause - 'anonymousFunctionUseClause', - - // FunctionReturnType - 'colonToken', - 'questionToken', - 'returnType', - - // FunctionBody - 'compoundStatementOrSemicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ArgumentExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ArgumentExpression.php deleted file mode 100644 index 7059ae8..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ArgumentExpression.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class ArgumentExpression extends Expression { - /** @var Token|null */ - public $byRefToken; // TODO removed in newer versions of PHP. Also only accept variable, not expression if byRef - - /** @var Token|null */ - public $dotDotDotToken; - - /** @var Expression */ - public $expression; - - const CHILD_NAMES = [ - 'byRefToken', - 'dotDotDotToken', - 'expression' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ArrayCreationExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ArrayCreationExpression.php deleted file mode 100644 index f3fc7f0..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ArrayCreationExpression.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class ArrayCreationExpression extends Expression { - - /** @var Token|null */ - public $arrayKeyword; - - /** @var Token */ - public $openParenOrBracket; - - /** @var DelimitedList\ArrayElementList */ - public $arrayElements; - - /** @var Token */ - public $closeParenOrBracket; - - const CHILD_NAMES = [ - 'arrayKeyword', - 'openParenOrBracket', - 'arrayElements', - 'closeParenOrBracket' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/AssignmentExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/AssignmentExpression.php deleted file mode 100644 index dc1683b..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/AssignmentExpression.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class AssignmentExpression extends BinaryExpression { - - /** @var Expression */ - public $leftOperand; - - /** @var Token */ - public $operator; - - /** @var Token */ - public $byRef; - - /** @var Expression */ - public $rightOperand; - - const CHILD_NAMES = [ - 'leftOperand', - 'operator', - 'byRef', - 'rightOperand' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/BinaryExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/BinaryExpression.php deleted file mode 100644 index 61ec6ff..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/BinaryExpression.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class BinaryExpression extends Expression { - - /** @var Expression */ - public $leftOperand; - - /** @var Token */ - public $operator; - - /** @var Expression */ - public $rightOperand; - - const CHILD_NAMES = [ - 'leftOperand', - 'operator', - 'rightOperand' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/BracedExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/BracedExpression.php deleted file mode 100644 index dd3ea23..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/BracedExpression.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class BracedExpression extends Expression { - /** @var Token */ - public $openBrace; - - /** @var Expression */ - public $expression; - - /** @var Token */ - public $closeBrace; - - const CHILD_NAMES = [ - 'openBrace', - 'expression', - 'closeBrace' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/CallExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/CallExpression.php deleted file mode 100644 index 0654fb3..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/CallExpression.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class CallExpression extends Expression { - /** @var Expression */ - public $callableExpression; - - /** @var Token */ - public $openParen; - - /** @var DelimitedList\ArgumentExpressionList|null */ - public $argumentExpressionList; - - /** @var Token */ - public $closeParen; - - const CHILD_NAMES = [ - 'callableExpression', - 'openParen', - 'argumentExpressionList', - 'closeParen' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/CastExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/CastExpression.php deleted file mode 100644 index 951125c..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/CastExpression.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Token; - -class CastExpression extends UnaryExpression { - - /** @var Token */ - public $openParen; - - /** @var Token */ - public $castType; - - /** @var Token */ - public $closeParen; - - /** @var Variable */ - public $operand; - - const CHILD_NAMES = [ - 'openParen', - 'castType', - 'closeParen', - 'operand' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/CloneExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/CloneExpression.php deleted file mode 100644 index 25ebf93..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/CloneExpression.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class CloneExpression extends Expression { - - /** @var Token */ - public $cloneKeyword; - - /** @var Expression */ - public $expression; - - const CHILD_NAMES = [ - 'cloneKeyword', - 'expression' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/EchoExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/EchoExpression.php deleted file mode 100644 index d8ea286..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/EchoExpression.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\DelimitedList\ExpressionList; -use Microsoft\PhpParser\Token; - -/** - * This represents either a literal echo expression (`echo expr`) - * or a short echo tag (`<?= expr...`) - * - * TODO: An echo statement cannot be used as an expression. - * Consider refactoring this to become EchoStatement in a future backwards incompatible release. - */ -class EchoExpression extends Expression { - - /** - * @var Token|null this is null if generated from `<?=` - */ - public $echoKeyword; - - /** @var ExpressionList */ - public $expressions; - - const CHILD_NAMES = [ - 'echoKeyword', - 'expressions' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/EmptyIntrinsicExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/EmptyIntrinsicExpression.php deleted file mode 100644 index dacbc9a..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/EmptyIntrinsicExpression.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class EmptyIntrinsicExpression extends Expression { - - /** @var Token */ - public $emptyKeyword; - - /** @var Token */ - public $openParen; - - /** @var Expression */ - public $expression; - - /** @var Token */ - public $closeParen; - - const CHILD_NAMES = [ - 'emptyKeyword', - 'openParen', - 'expression', - 'closeParen' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ErrorControlExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ErrorControlExpression.php deleted file mode 100644 index ca12810..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ErrorControlExpression.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Token; - -class ErrorControlExpression extends UnaryExpression { - - /** @var Token */ - public $operator; - - /** @var UnaryExpression */ - public $operand; - - const CHILD_NAMES = [ - 'operator', - 'operand' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/EvalIntrinsicExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/EvalIntrinsicExpression.php deleted file mode 100644 index 149f934..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/EvalIntrinsicExpression.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class EvalIntrinsicExpression extends Expression { - - /** @var Token */ - public $evalKeyword; - - /** @var Token */ - public $openParen; - - /** @var Expression */ - public $expression; - - /** @var Token */ - public $closeParen; - - const CHILD_NAMES = [ - 'evalKeyword', - 'openParen', - 'expression', - 'closeParen' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ExitIntrinsicExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ExitIntrinsicExpression.php deleted file mode 100644 index 28503ba..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ExitIntrinsicExpression.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class ExitIntrinsicExpression extends Expression { - - /** @var Token */ - public $exitOrDieKeyword; - - /** @var Token|null */ - public $openParen; - - /** @var Expression|null */ - public $expression; - - /** @var Token|null */ - public $closeParen; - - const CHILD_NAMES = [ - 'exitOrDieKeyword', - 'openParen', - 'expression', - 'closeParen' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/IssetIntrinsicExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/IssetIntrinsicExpression.php deleted file mode 100644 index 66e67e4..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/IssetIntrinsicExpression.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class IssetIntrinsicExpression extends Expression { - - /** @var Token */ - public $issetKeyword; - - /** @var Token */ - public $openParen; - - /** @var DelimitedList\ExpressionList */ - public $expressions; - - /** @var Token */ - public $closeParen; - - const CHILD_NAMES = [ - 'issetKeyword', - 'openParen', - 'expressions', - 'closeParen' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ListIntrinsicExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ListIntrinsicExpression.php deleted file mode 100644 index ab1e702..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ListIntrinsicExpression.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class ListIntrinsicExpression extends Expression { - - /** @var Token */ - public $listKeyword; - - /** @var Token */ - public $openParen; - - /** @var DelimitedList\ListExpressionList */ - public $listElements; - - /** @var Token */ - public $closeParen; - - const CHILD_NAMES = [ - 'listKeyword', - 'openParen', - 'listElements', - 'closeParen' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/MemberAccessExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/MemberAccessExpression.php deleted file mode 100644 index 7621bc5..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/MemberAccessExpression.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class MemberAccessExpression extends Expression { - - /** @var Expression */ - public $dereferencableExpression; - - /** @var Token */ - public $arrowToken; - - /** @var Token */ - public $memberName; - - const CHILD_NAMES = [ - 'dereferencableExpression', - 'arrowToken', - 'memberName' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ObjectCreationExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ObjectCreationExpression.php deleted file mode 100644 index 9d39be5..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ObjectCreationExpression.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\ClassBaseClause; -use Microsoft\PhpParser\Node\ClassInterfaceClause; -use Microsoft\PhpParser\Node\ClassMembersNode; -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\QualifiedName; -use Microsoft\PhpParser\Token; - -class ObjectCreationExpression extends Expression { - - /** @var Token */ - public $newKeword; - - /** @var QualifiedName|Variable|Token */ - public $classTypeDesignator; - - /** @var Token|null */ - public $openParen; - - /** @var DelimitedList\ArgumentExpressionList|null */ - public $argumentExpressionList; - - /** @var Token|null */ - public $closeParen; - - /** @var ClassBaseClause|null */ - public $classBaseClause; - - /** @var ClassInterfaceClause|null */ - public $classInterfaceClause; - - /** @var ClassMembersNode|null */ - public $classMembers; - - const CHILD_NAMES = [ - 'newKeword', // TODO - 'classTypeDesignator', - 'openParen', - 'argumentExpressionList', - 'closeParen', - 'classBaseClause', - 'classInterfaceClause', - 'classMembers' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ParenthesizedExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ParenthesizedExpression.php deleted file mode 100644 index 4ae1706..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ParenthesizedExpression.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class ParenthesizedExpression extends Expression { - - /** @var Token */ - public $openParen; - - /** @var Expression */ - public $expression; - - /** @var Token */ - public $closeParen; - - const CHILD_NAMES = [ - 'openParen', - 'expression', - 'closeParen' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/PostfixUpdateExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/PostfixUpdateExpression.php deleted file mode 100644 index 38e4c57..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/PostfixUpdateExpression.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class PostfixUpdateExpression extends Expression { - /** @var Variable */ - public $operand; - - /** @var Token */ - public $incrementOrDecrementOperator; - - const CHILD_NAMES = [ - 'operand', - 'incrementOrDecrementOperator' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/PrefixUpdateExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/PrefixUpdateExpression.php deleted file mode 100644 index 2ca61ff..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/PrefixUpdateExpression.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Token; - -class PrefixUpdateExpression extends UnaryExpression { - - /** @var Token */ - public $incrementOrDecrementOperator; - - /** @var Variable */ - public $operand; - - const CHILD_NAMES = [ - 'incrementOrDecrementOperator', - 'operand' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/PrintIntrinsicExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/PrintIntrinsicExpression.php deleted file mode 100644 index 8873724..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/PrintIntrinsicExpression.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class PrintIntrinsicExpression extends Expression { - - /** @var Token */ - public $printKeyword; - - /** @var Expression */ - public $expression; - - const CHILD_NAMES = [ - 'printKeyword', - 'expression' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ScopedPropertyAccessExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ScopedPropertyAccessExpression.php deleted file mode 100644 index 73a85fc..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ScopedPropertyAccessExpression.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\QualifiedName; -use Microsoft\PhpParser\Token; - -class ScopedPropertyAccessExpression extends Expression { - - /** @var Expression|QualifiedName|Token */ - public $scopeResolutionQualifier; - - /** @var Token */ - public $doubleColon; - - /** @var Token|Variable */ - public $memberName; - - const CHILD_NAMES = [ - 'scopeResolutionQualifier', - 'doubleColon', - 'memberName' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ScriptInclusionExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ScriptInclusionExpression.php deleted file mode 100644 index 1fec1e3..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/ScriptInclusionExpression.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class ScriptInclusionExpression extends Expression { - /** @var Token */ - public $requireOrIncludeKeyword; - /** @var Expression */ - public $expression; - - const CHILD_NAMES = [ - 'requireOrIncludeKeyword', - 'expression' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/SubscriptExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/SubscriptExpression.php deleted file mode 100644 index 4756f68..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/SubscriptExpression.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class SubscriptExpression extends Expression { - - /** @var Expression */ - public $postfixExpression; - - /** @var Token */ - public $openBracketOrBrace; - - /** @var Expression */ - public $accessExpression; - - /** @var Token */ - public $closeBracketOrBrace; - - const CHILD_NAMES = [ - 'postfixExpression', - 'openBracketOrBrace', - 'accessExpression', - 'closeBracketOrBrace' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/TernaryExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/TernaryExpression.php deleted file mode 100644 index 5a12deb..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/TernaryExpression.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class TernaryExpression extends Expression { - - /** @var Expression|Token (only a token when token before '?' is invalid/missing) */ - public $condition; - - /** @var Token */ - public $questionToken; - - /** @var Expression */ - public $ifExpression; - - /** @var Token */ - public $colonToken; - - /** @var Expression */ - public $elseExpression; - - const CHILD_NAMES = [ - 'condition', - 'questionToken', - 'ifExpression', - 'colonToken', - 'elseExpression' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnaryExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnaryExpression.php deleted file mode 100644 index 6da38cd..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnaryExpression.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; - -class UnaryExpression extends Expression { - /** @var UnaryExpression|Variable */ - public $operand; - - const CHILD_NAMES = [ - 'operand' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnaryOpExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnaryOpExpression.php deleted file mode 100644 index 0acc044..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnaryOpExpression.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Token; - -class UnaryOpExpression extends UnaryExpression { - - /** @var Token */ - public $operator; - - /** @var UnaryExpression */ - public $operand; - - const CHILD_NAMES = [ - 'operator', - 'operand' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnsetIntrinsicExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnsetIntrinsicExpression.php deleted file mode 100644 index 4017f65..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/UnsetIntrinsicExpression.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class UnsetIntrinsicExpression extends Expression { - - /** @var Token */ - public $unsetKeyword; - - /** @var Token */ - public $openParen; - - /** @var DelimitedList\ExpressionList */ - public $expressions; - - /** @var Token */ - public $closeParen; - - const CHILD_NAMES = [ - 'unsetKeyword', - 'openParen', - 'expressions', - 'closeParen' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/Variable.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/Variable.php deleted file mode 100644 index 7a3d3cd..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/Variable.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class Variable extends Expression { - /** @var Token */ - public $dollar; - - /** @var Token|Variable|BracedExpression */ - public $name; - - const CHILD_NAMES = [ - 'dollar', - 'name' - ]; - - public function getName() { - if ( - $this->name instanceof Token && - $name = ltrim($this->name->getText($this->getFileContents()), '$') - ) { - return $name; - } - return null; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/YieldExpression.php b/vendor/microsoft/tolerant-php-parser/src/Node/Expression/YieldExpression.php deleted file mode 100644 index 63da295..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Expression/YieldExpression.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Expression; - -use Microsoft\PhpParser\Node\ArrayElement; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Token; - -class YieldExpression extends Expression { - /** @var Token */ - public $yieldOrYieldFromKeyword; - - /** @var ArrayElement */ - public $arrayElement; - - const CHILD_NAMES = ['yieldOrYieldFromKeyword', 'arrayElement']; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/FinallyClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/FinallyClause.php deleted file mode 100644 index d404e30..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/FinallyClause.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class FinallyClause extends Node { - /** @var Token */ - public $finallyToken; - /** @var StatementNode */ - public $compoundStatement; - - const CHILD_NAMES = [ - 'finallyToken', - 'compoundStatement' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/ForeachKey.php b/vendor/microsoft/tolerant-php-parser/src/Node/ForeachKey.php deleted file mode 100644 index 08bb303..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/ForeachKey.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class ForeachKey extends Node { - /** @var Expression */ - public $expression; - /** @var Token */ - public $arrow; - - const CHILD_NAMES = [ - 'expression', - 'arrow' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/ForeachValue.php b/vendor/microsoft/tolerant-php-parser/src/Node/ForeachValue.php deleted file mode 100644 index 19c153f..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/ForeachValue.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class ForeachValue extends Node { - /** @var Token|null */ - public $ampersand; - /** @var Expression */ - public $expression; - - const CHILD_NAMES = [ - 'ampersand', - 'expression' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/FunctionBody.php b/vendor/microsoft/tolerant-php-parser/src/Node/FunctionBody.php deleted file mode 100644 index 077eb27..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/FunctionBody.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node\Statement\CompoundStatementNode; -use Microsoft\PhpParser\Token; - -trait FunctionBody { - /** @var CompoundStatementNode|Token */ - public $compoundStatementOrSemicolon; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/FunctionHeader.php b/vendor/microsoft/tolerant-php-parser/src/Node/FunctionHeader.php deleted file mode 100644 index 47e5097..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/FunctionHeader.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Token; - -trait FunctionHeader { - /** @var Token */ - public $functionKeyword; - /** @var Token */ - public $byRefToken; - /** @var null|Token */ - public $name; - /** @var Token */ - public $openParen; - /** @var DelimitedList\ParameterDeclarationList */ - public $parameters; - /** @var Token */ - public $closeParen; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/FunctionReturnType.php b/vendor/microsoft/tolerant-php-parser/src/Node/FunctionReturnType.php deleted file mode 100644 index 2c217f6..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/FunctionReturnType.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Token; - -trait FunctionReturnType { - /** @var Token */ - public $colonToken; - /** @var Token|null */ - public $questionToken; - /** @var Token|QualifiedName */ - public $returnType; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/FunctionUseClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/FunctionUseClause.php deleted file mode 100644 index 8f23b0b..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/FunctionUseClause.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -trait FunctionUseClause { - /** @var AnonymousFunctionUseClause|null */ - public $anonymousFunctionUseClause; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/InterfaceBaseClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/InterfaceBaseClause.php deleted file mode 100644 index 4bca0e4..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/InterfaceBaseClause.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class InterfaceBaseClause extends Node { - /** @var Token */ - public $extendsKeyword; - - /** @var DelimitedList\QualifiedNameList */ - public $interfaceNameList; - - const CHILD_NAMES = [ - 'extendsKeyword', - 'interfaceNameList' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/InterfaceMembers.php b/vendor/microsoft/tolerant-php-parser/src/Node/InterfaceMembers.php deleted file mode 100644 index 6517487..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/InterfaceMembers.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class InterfaceMembers extends Node { - /** @var Token */ - public $openBrace; - - /** @var Node[] */ - public $interfaceMemberDeclarations; - - /** @var Token */ - public $closeBrace; - - const CHILD_NAMES = [ - 'openBrace', - 'interfaceMemberDeclarations', - 'closeBrace' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/MethodDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/MethodDeclaration.php deleted file mode 100644 index 07c9c0f..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/MethodDeclaration.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Diagnostic; -use Microsoft\PhpParser\DiagnosticKind; -use Microsoft\PhpParser\DiagnosticsProvider; -use Microsoft\PhpParser\FunctionLike; -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; -use Microsoft\PhpParser\TokenKind; - -class MethodDeclaration extends Node implements FunctionLike { - /** @var Token[] */ - public $modifiers; - - use FunctionHeader, FunctionReturnType, FunctionBody; - - const CHILD_NAMES = [ - 'modifiers', - - // FunctionHeader - 'functionKeyword', - 'byRefToken', - 'name', - 'openParen', - 'parameters', - 'closeParen', - - // FunctionReturnType - 'colonToken', - 'questionToken', - 'returnType', - - // FunctionBody - 'compoundStatementOrSemicolon' - ]; - - public function isStatic() : bool { - if ($this->modifiers === null) { - return false; - } - foreach ($this->modifiers as $modifier) { - if ($modifier->kind === TokenKind::StaticKeyword) { - return true; - } - } - return false; - } - - public function getName() { - return $this->name->getText($this->getFileContents()); - } - - /** - * @return Diagnostic|null - Callers should use DiagnosticsProvider::getDiagnostics instead - * @internal - * @override - */ - public function getDiagnosticForNode() { - foreach ($this->modifiers as $modifier) { - if ($modifier->kind === TokenKind::VarKeyword) { - return new Diagnostic( - DiagnosticKind::Error, - "Unexpected modifier '" . DiagnosticsProvider::getTextForTokenKind($modifier->kind) . "'", - $modifier->start, - $modifier->length - ); - } - } - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/MissingMemberDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/MissingMemberDeclaration.php deleted file mode 100644 index 848d4f4..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/MissingMemberDeclaration.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class MissingMemberDeclaration extends Node { - - /** @var Token[] */ - public $modifiers; - - /** @var Token|null needed along with typeDeclaration for what looked like typed property declarations but was missing VariableName */ - public $questionToken; - - /** @var QualifiedName|Token|null */ - public $typeDeclaration; - - const CHILD_NAMES = [ - 'modifiers', - 'questionToken', - 'typeDeclaration', - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/NamespaceAliasingClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/NamespaceAliasingClause.php deleted file mode 100644 index f338d5e..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/NamespaceAliasingClause.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class NamespaceAliasingClause extends Node { - /** @var Token */ - public $asKeyword; - /** @var Token */ - public $name; - - const CHILD_NAMES = [ - 'asKeyword', - 'name' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/NamespaceUseClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/NamespaceUseClause.php deleted file mode 100644 index ef59628..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/NamespaceUseClause.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Token; - -class NamespaceUseClause extends Node { - /** @var QualifiedName */ - public $namespaceName; - /** @var NamespaceAliasingClause */ - public $namespaceAliasingClause; - /** @var Token|null */ - public $openBrace; - /** @var DelimitedList\NamespaceUseGroupClauseList|null */ - public $groupClauses; - /** @var Token|null */ - public $closeBrace; - - const CHILD_NAMES = [ - 'namespaceName', - 'namespaceAliasingClause', - 'openBrace', - 'groupClauses', - 'closeBrace' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/NamespaceUseGroupClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/NamespaceUseGroupClause.php deleted file mode 100644 index 950195e..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/NamespaceUseGroupClause.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class NamespaceUseGroupClause extends Node { - - /** @var Token */ - public $functionOrConst; - /** @var QualifiedName */ - public $namespaceName; - /** @var NamespaceAliasingClause */ - public $namespaceAliasingClause; - - const CHILD_NAMES = [ - 'functionOrConst', - 'namespaceName', - 'namespaceAliasingClause' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/NumericLiteral.php b/vendor/microsoft/tolerant-php-parser/src/Node/NumericLiteral.php deleted file mode 100644 index f311b7b..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/NumericLiteral.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Token; - -class NumericLiteral extends Expression { - /** @var Token */ - public $children; - - const CHILD_NAMES = [ - 'children' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Parameter.php b/vendor/microsoft/tolerant-php-parser/src/Node/Parameter.php deleted file mode 100644 index 97080b9..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Parameter.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class Parameter extends Node { - /** @var Token|null */ - public $questionToken; - /** @var QualifiedName|Token|null */ - public $typeDeclaration; - /** @var Token|null */ - public $byRefToken; - /** @var Token|null */ - public $dotDotDotToken; - /** @var Token */ - public $variableName; - /** @var Token|null */ - public $equalsToken; - /** @var null|Expression */ - public $default; - - const CHILD_NAMES = [ - 'questionToken', - 'typeDeclaration', - 'byRefToken', - 'dotDotDotToken', - 'variableName', - 'equalsToken', - 'default' - ]; - - public function isVariadic() { - return $this->byRefToken !== null; - } - - public function getName() { - if ( - $this->variableName instanceof Token && - $name = substr($this->variableName->getText($this->getFileContents()), 1) - ) { - return $name; - } - return null; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/PropertyDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/PropertyDeclaration.php deleted file mode 100644 index 1628dfa..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/PropertyDeclaration.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; -use Microsoft\PhpParser\TokenKind; - -class PropertyDeclaration extends Node { - - /** @var Token[] */ - public $modifiers; - - /** @var Token|null question token for PHP 7.4 type declaration */ - public $questionToken; - - /** @var QualifiedName|Token|null */ - public $typeDeclaration; - - /** @var DelimitedList\ExpressionList */ - public $propertyElements; - - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'modifiers', - 'questionToken', - 'typeDeclaration', - 'propertyElements', - 'semicolon' - ]; - - public function isStatic() : bool { - if ($this->modifiers === null) { - return false; - } - foreach ($this->modifiers as $modifier) { - if ($modifier->kind === TokenKind::StaticKeyword) { - return true; - } - } - return false; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/QualifiedName.php b/vendor/microsoft/tolerant-php-parser/src/Node/QualifiedName.php deleted file mode 100644 index d3d477c..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/QualifiedName.php +++ /dev/null @@ -1,190 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\NamespacedNameInterface; -use Microsoft\PhpParser\NamespacedNameTrait; -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Node\Expression\AnonymousFunctionCreationExpression; -use Microsoft\PhpParser\Node\Expression\CallExpression; -use Microsoft\PhpParser\Node\Expression\ObjectCreationExpression; -use Microsoft\PhpParser\ResolvedName; -use Microsoft\PhpParser\Token; -use Microsoft\PhpParser\TokenKind; - -class QualifiedName extends Node implements NamespacedNameInterface { - use NamespacedNameTrait; - - /** @var Token */ - public $globalSpecifier; // \_opt - /** @var RelativeSpecifier */ - public $relativeSpecifier; // namespace\ - /** @var array */ - public $nameParts; - - const CHILD_NAMES = [ - 'globalSpecifier', - 'relativeSpecifier', - 'nameParts' - ]; - - /** - * Checks whether a QualifiedName is prefixed with a backslash global specifier. - * @return bool - */ - public function isFullyQualifiedName() : bool { - return isset($this->globalSpecifier); - } - - /** - * Checks whether a QualifiedName begins with a "namespace" keyword - * @return bool - */ - public function isRelativeName() : bool { - return isset($this->relativeSpecifier); - } - - /** - * Checks whether a Name includes at least one namespace separator (and is neither fully-qualified nor relative) - * @return bool - */ - public function isQualifiedName() : bool { - return - !$this->isFullyQualifiedName() && - !$this->isRelativeName() && - \count($this->nameParts) > 1; // at least one namespace separator - } - - /** - * Checks whether a name is does not include a namespace separator. - * @return bool - */ - public function isUnqualifiedName() : bool { - return !($this->isFullyQualifiedName() || $this->isRelativeName() || $this->isQualifiedName()); - } - - /** - * Gets resolved name based on name resolution rules defined in: - * http://php.net/manual/en/language.namespaces.rules.php - * - * Returns null if one of the following conditions is met: - * - name resolution is not valid for this element (e.g. part of the name in a namespace definition) - * - name cannot be resolved (unqualified namespaced function/constant names that are not explicitly imported.) - * - * @return null|string|ResolvedName - * @throws \Exception - */ - public function getResolvedName($namespaceDefinition = null) { - // Name resolution not applicable to constructs that define symbol names or aliases. - if (($this->parent instanceof Node\Statement\NamespaceDefinition && $this->parent->name->getStart() === $this->getStart()) || - $this->parent instanceof Node\Statement\NamespaceUseDeclaration || - $this->parent instanceof Node\NamespaceUseClause || - $this->parent instanceof Node\NamespaceUseGroupClause || - $this->parent->parent instanceof Node\TraitUseClause || - $this->parent instanceof Node\TraitSelectOrAliasClause || - ($this->parent instanceof TraitSelectOrAliasClause && - ($this->parent->asOrInsteadOfKeyword == null || $this->parent->asOrInsteadOfKeyword->kind === TokenKind::AsKeyword)) - ) { - return null; - } - - if (in_array($lowerText = strtolower($this->getText()), ["self", "static", "parent"])) { - return $lowerText; - } - - // FULLY QUALIFIED NAMES - // - resolve to the name without leading namespace separator. - if ($this->isFullyQualifiedName()) { - return ResolvedName::buildName($this->nameParts, $this->getFileContents()); - } - - // RELATIVE NAMES - // - resolve to the name with namespace replaced by the current namespace. - // - if current namespace is global, strip leading namespace\ prefix. - if ($this->isRelativeName()) { - return $this->getNamespacedName(); - } - - list($namespaceImportTable, $functionImportTable, $constImportTable) = $this->getImportTablesForCurrentScope(); - - // QUALIFIED NAMES - // - first segment of the name is translated according to the current class/namespace import table. - // - If no import rule applies, the current namespace is prepended to the name. - if ($this->isQualifiedName()) { - return $this->tryResolveFromImportTable($namespaceImportTable) ?? $this->getNamespacedName(); - } - - // UNQUALIFIED NAMES - // - translated according to the current import table for the respective symbol type. - // (class-like => namespace import table, constant => const import table, function => function import table) - // - if no import rule applies: - // - all symbol types: if current namespace is global, resolve to global namespace. - // - class-like symbols: resolve from current namespace. - // - function or const: resolved at runtime (from current namespace, with fallback to global namespace). - if ($this->isConstantName()) { - $resolvedName = $this->tryResolveFromImportTable($constImportTable, /* case-sensitive */ true); - $namespaceDefinition = $this->getNamespaceDefinition(); - if ($namespaceDefinition !== null && $namespaceDefinition->name === null) { - $resolvedName = $resolvedName ?? ResolvedName::buildName($this->nameParts, $this->getFileContents()); - } - return $resolvedName; - } elseif ($this->parent instanceof CallExpression) { - $resolvedName = $this->tryResolveFromImportTable($functionImportTable); - if (($namespaceDefinition = $this->getNamespaceDefinition()) === null || $namespaceDefinition->name === null) { - $resolvedName = $resolvedName ?? ResolvedName::buildName($this->nameParts, $this->getFileContents()); - } - return $resolvedName; - } - - return $this->tryResolveFromImportTable($namespaceImportTable) ?? $this->getNamespacedName(); - } - - public function getLastNamePart() { - $parts = $this->nameParts; - for ($i = \count($parts) - 1; $i >= 0; $i--) { - // TODO - also handle reserved word tokens - if ($parts[$i]->kind === TokenKind::Name) { - return $parts[$i]; - } - } - return null; - } - - /** - * @param ResolvedName[] $importTable - * @param bool $isCaseSensitive - * @return string|null - */ - private function tryResolveFromImportTable($importTable, bool $isCaseSensitive = false) { - $content = $this->getFileContents(); - $index = $this->nameParts[0]->getText($content); -// if (!$isCaseSensitive) { -// $index = strtolower($index); -// } - if(isset($importTable[$index])) { - $resolvedName = $importTable[$index]; - $resolvedName->addNameParts(\array_slice($this->nameParts, 1), $content); - return $resolvedName; - } - return null; - } - - private function isConstantName() : bool { - return - ($this->parent instanceof Node\Statement\ExpressionStatement || $this->parent instanceof Expression) && - !( - $this->parent instanceof Node\Expression\MemberAccessExpression || $this->parent instanceof CallExpression || - $this->parent instanceof ObjectCreationExpression || - $this->parent instanceof Node\Expression\ScopedPropertyAccessExpression || $this->parent instanceof AnonymousFunctionCreationExpression || - ($this->parent instanceof Node\Expression\BinaryExpression && $this->parent->operator->kind === TokenKind::InstanceOfKeyword) - ); - } - - public function getNameParts() : array { - return $this->nameParts; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/RelativeSpecifier.php b/vendor/microsoft/tolerant-php-parser/src/Node/RelativeSpecifier.php deleted file mode 100644 index 8c301ed..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/RelativeSpecifier.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class RelativeSpecifier extends Node { - /** @var Token */ - public $namespaceKeyword; - - /** @var Token */ - public $backslash; - - const CHILD_NAMES = [ - 'namespaceKeyword', - 'backslash' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/ReservedWord.php b/vendor/microsoft/tolerant-php-parser/src/Node/ReservedWord.php deleted file mode 100644 index 08361b0..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/ReservedWord.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Token; - -class ReservedWord extends Expression { - /** @var Token */ - public $children; - - const CHILD_NAMES = [ - 'children' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/SourceFileNode.php b/vendor/microsoft/tolerant-php-parser/src/Node/SourceFileNode.php deleted file mode 100644 index 5f62da4..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/SourceFileNode.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class SourceFileNode extends Node { - /** @var string */ - public $fileContents; - - /** @var string */ - public $uri; - - /** @var Node[] */ - public $statementList; - - /** @var Token */ - public $endOfFileToken; - - const CHILD_NAMES = ['statementList', 'endOfFileToken']; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/BreakOrContinueStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/BreakOrContinueStatement.php deleted file mode 100644 index e0ed83e..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/BreakOrContinueStatement.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Diagnostic; -use Microsoft\PhpParser\DiagnosticKind; -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; -use Microsoft\PhpParser\TokenKind; - -class BreakOrContinueStatement extends StatementNode { - /** @var Token */ - public $breakOrContinueKeyword; - /** @var Expression|null */ - public $breakoutLevel; - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'breakOrContinueKeyword', - 'breakoutLevel', - 'semicolon' - ]; - - /** - * @return Diagnostic|null - Callers should use DiagnosticsProvider::getDiagnostics instead - * @internal - * @override - */ - public function getDiagnosticForNode() { - if ($this->breakoutLevel === null) { - return null; - } - - $breakoutLevel = $this->breakoutLevel; - while ($breakoutLevel instanceof Node\Expression\ParenthesizedExpression) { - $breakoutLevel = $breakoutLevel->expression; - } - - if ( - $breakoutLevel instanceof Node\NumericLiteral - && $breakoutLevel->children->kind === TokenKind::IntegerLiteralToken - ) { - $literalString = $breakoutLevel->getText(); - $firstTwoChars = \substr($literalString, 0, 2); - - if ($firstTwoChars === '0b' || $firstTwoChars === '0B') { - if (\bindec(\substr($literalString, 2)) > 0) { - return null; - } - } - else if (\intval($literalString, 0) > 0) { - return null; - } - } - - if ($breakoutLevel instanceof Token) { - $start = $breakoutLevel->getStartPosition(); - } - else { - $start = $breakoutLevel->getStart(); - } - $end = $breakoutLevel->getEndPosition(); - - return new Diagnostic( - DiagnosticKind::Error, - "Positive integer literal expected.", - $start, - $end - $start - ); - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ClassDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ClassDeclaration.php deleted file mode 100644 index 5b23039..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ClassDeclaration.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\ClassLike; -use Microsoft\PhpParser\NamespacedNameInterface; -use Microsoft\PhpParser\NamespacedNameTrait; -use Microsoft\PhpParser\Node\ClassBaseClause; -use Microsoft\PhpParser\Node\ClassInterfaceClause; -use Microsoft\PhpParser\Node\ClassMembersNode; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class ClassDeclaration extends StatementNode implements NamespacedNameInterface, ClassLike { - use NamespacedNameTrait; - - /** @var Token */ - public $abstractOrFinalModifier; - - /** @var Token */ - public $classKeyword; - - /** @var Token */ - public $name; - - /** @var ClassBaseClause */ - public $classBaseClause; - - /** @var ClassInterfaceClause */ - public $classInterfaceClause; - - /** @var ClassMembersNode */ - public $classMembers; - - const CHILD_NAMES = [ - 'abstractOrFinalModifier', - 'classKeyword', - 'name', - 'classBaseClause', - 'classInterfaceClause', - 'classMembers' - ]; - - public function getNameParts() : array { - return [$this->name]; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/CompoundStatementNode.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/CompoundStatementNode.php deleted file mode 100644 index 739e5b3..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/CompoundStatementNode.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class CompoundStatementNode extends StatementNode { - /** @var Token */ - public $openBrace; - - /** @var array|Node[] */ - public $statements; - - /** @var Token */ - public $closeBrace; - - const CHILD_NAMES = [ - 'openBrace', - 'statements', - 'closeBrace' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ConstDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ConstDeclaration.php deleted file mode 100644 index b3091e5..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ConstDeclaration.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class ConstDeclaration extends StatementNode { - /** @var Token */ - public $constKeyword; - - /** @var DelimitedList\ConstElementList */ - public $constElements; - - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'constKeyword', - 'constElements', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/DeclareStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/DeclareStatement.php deleted file mode 100644 index 9b2108e..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/DeclareStatement.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class DeclareStatement extends StatementNode { - /** @var Token */ - public $declareKeyword; - /** @var Token */ - public $openParen; - /** @var Node */ - public $declareDirective; - /** @var Token */ - public $closeParen; - /** @var Token|null */ - public $colon; - /** @var StatementNode|StatementNode[] */ - public $statements; - /** @var Token|null */ - public $enddeclareKeyword; - /** @var Token|null */ - public $semicolon; - - const CHILD_NAMES = [ - 'declareKeyword', - 'openParen', - 'declareDirective', - 'closeParen', - 'colon', - 'statements', - 'enddeclareKeyword', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/DoStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/DoStatement.php deleted file mode 100644 index 5eada3e..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/DoStatement.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class DoStatement extends StatementNode { - /** @var Token */ - public $do; - /** @var StatementNode */ - public $statement; - /** @var Token */ - public $whileToken; - /** @var Token */ - public $openParen; - /** @var Expression */ - public $expression; - /** @var Token */ - public $closeParen; - /** @var Token|null */ - public $semicolon; - - const CHILD_NAMES = [ - 'do', - 'statement', - 'whileToken', - 'openParen', - 'expression', - 'closeParen', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/EmptyStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/EmptyStatement.php deleted file mode 100644 index 81d1430..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/EmptyStatement.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class EmptyStatement extends StatementNode { - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ExpressionStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ExpressionStatement.php deleted file mode 100644 index 96e7afe..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ExpressionStatement.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class ExpressionStatement extends StatementNode { - /** @var Expression */ - public $expression; - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'expression', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ForStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ForStatement.php deleted file mode 100644 index cdd7dbb..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ForStatement.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class ForStatement extends StatementNode { - /** @var Token */ - public $for; - /** @var Token */ - public $openParen; - /** @var Expression|null */ - public $forInitializer; - /** @var Token */ - public $exprGroupSemicolon1; - /** @var Expression|null */ - public $forControl; - /** @var Token */ - public $exprGroupSemicolon2; - /** @var Expression|null */ - public $forEndOfLoop; - /** @var Token */ - public $closeParen; - /** @var Token|null */ - public $colon; - /** @var StatementNode|StatementNode[] */ - public $statements; - /** @var Token|null */ - public $endFor; - /** @var Token|null */ - public $endForSemicolon; - - const CHILD_NAMES = [ - 'for', - 'openParen', - 'forInitializer', - 'exprGroupSemicolon1', - 'forControl', - 'exprGroupSemicolon2', - 'forEndOfLoop', - 'closeParen', - 'colon', - 'statements', - 'endFor', - 'endForSemicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ForeachStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ForeachStatement.php deleted file mode 100644 index 8e0a64e..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ForeachStatement.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\ForeachKey; -use Microsoft\PhpParser\Node\ForeachValue; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class ForeachStatement extends StatementNode { - /** @var Token */ - public $foreach; - /** @var Token */ - public $openParen; - /** @var Expression */ - public $forEachCollectionName; - /** @var Token */ - public $asKeyword; - /** @var ForeachKey|null */ - public $foreachKey; - /** @var ForeachValue */ - public $foreachValue; - /** @var Token */ - public $closeParen; - /** @var Token|null */ - public $colon; - /** @var StatementNode|StatementNode[] */ - public $statements; - /** @var Token|null */ - public $endForeach; - /** @var Token|null */ - public $endForeachSemicolon; - - const CHILD_NAMES = [ - 'foreach', - 'openParen', - 'forEachCollectionName', - 'asKeyword', - 'foreachKey', - 'foreachValue', - 'closeParen', - 'colon', - 'statements', - 'endForeach', - 'endForeachSemicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/FunctionDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/FunctionDeclaration.php deleted file mode 100644 index f186305..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/FunctionDeclaration.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\FunctionLike; -use Microsoft\PhpParser\NamespacedNameInterface; -use Microsoft\PhpParser\NamespacedNameTrait; -use Microsoft\PhpParser\Node\FunctionBody; -use Microsoft\PhpParser\Node\FunctionHeader; -use Microsoft\PhpParser\Node\FunctionReturnType; -use Microsoft\PhpParser\Node\StatementNode; - -class FunctionDeclaration extends StatementNode implements NamespacedNameInterface, FunctionLike { - use FunctionHeader, FunctionReturnType, FunctionBody; - use NamespacedNameTrait; - - const CHILD_NAMES = [ - // FunctionHeader - 'functionKeyword', - 'byRefToken', - 'name', - 'openParen', - 'parameters', - 'closeParen', - - // FunctionReturnType - 'colonToken', - 'questionToken', - 'returnType', - - // FunctionBody - 'compoundStatementOrSemicolon' - ]; - - public function getNameParts() : array { - return [$this->name]; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/FunctionStaticDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/FunctionStaticDeclaration.php deleted file mode 100644 index b96608d..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/FunctionStaticDeclaration.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class FunctionStaticDeclaration extends StatementNode { - - /** @var Token */ - public $staticKeyword; - - /** @var DelimitedList\StaticVariableNameList */ - public $staticVariableNameList; - - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'staticKeyword', - 'staticVariableNameList', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/GlobalDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/GlobalDeclaration.php deleted file mode 100644 index 53e3628..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/GlobalDeclaration.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class GlobalDeclaration extends StatementNode { - - /** @var Token */ - public $globalKeyword; - - /** @var DelimitedList\VariableNameList */ - public $variableNameList; - - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'globalKeyword', - 'variableNameList', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/GotoStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/GotoStatement.php deleted file mode 100644 index 3feb3bc..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/GotoStatement.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class GotoStatement extends StatementNode { - /** @var Token */ - public $goto; - /** @var Token */ - public $name; - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'goto', - 'name', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/IfStatementNode.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/IfStatementNode.php deleted file mode 100644 index 67d04ad..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/IfStatementNode.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\ElseClauseNode; -use Microsoft\PhpParser\Node\ElseIfClauseNode; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class IfStatementNode extends StatementNode { - /** @var Token */ - public $ifKeyword; - /** @var Token */ - public $openParen; - /** @var Expression */ - public $expression; - /** @var Token */ - public $closeParen; - /** @var Token|null */ - public $colon; - /** @var StatementNode|StatementNode[] */ - public $statements; - /** @var ElseIfClauseNode[] */ - public $elseIfClauses; - /** @var ElseClauseNode|null */ - public $elseClause; - /** @var Token|null */ - public $endifKeyword; - /** @var Token|null */ - public $semicolon; - - const CHILD_NAMES = [ - 'ifKeyword', - 'openParen', - 'expression', - 'closeParen', - 'colon', - 'statements', - 'elseIfClauses', - 'elseClause', - 'endifKeyword', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/InlineHtml.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/InlineHtml.php deleted file mode 100644 index 8e158ca..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/InlineHtml.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class InlineHtml extends StatementNode { - /** @var Token|null */ - public $scriptSectionEndTag; - - /** @var Token */ - public $text; - - /** @var Token|null */ - public $scriptSectionStartTag; - - /** - * @var ExpressionStatement|null used to represent the expression echoed by `<?=` while parsing. - * - * This should always be null in the returned AST, - * and is deliberately excluded from CHILD_NAMES. - * - * This will be null under any of these conditions: - * - * - The scriptSectionStartTag isn't TokenKind::ScriptSectionStartWithEchoTag, - * - The echoStatement was normalized and moved into a statement list. - * If a caller doesn't do this, that's a bug. - */ - public $echoStatement; - - const CHILD_NAMES = [ - 'scriptSectionEndTag', - 'text', - 'scriptSectionStartTag', - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/InterfaceDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/InterfaceDeclaration.php deleted file mode 100644 index e11261f..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/InterfaceDeclaration.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\ClassLike; -use Microsoft\PhpParser\NamespacedNameInterface; -use Microsoft\PhpParser\NamespacedNameTrait; -use Microsoft\PhpParser\Node\InterfaceBaseClause; -use Microsoft\PhpParser\Node\InterfaceMembers; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class InterfaceDeclaration extends StatementNode implements NamespacedNameInterface, ClassLike { - use NamespacedNameTrait; - - /** @var Token */ - public $interfaceKeyword; - - /** @var Token */ - public $name; - - /** @var InterfaceBaseClause|null */ - public $interfaceBaseClause; - - /** @var InterfaceMembers */ - public $interfaceMembers; - - const CHILD_NAMES = [ - 'interfaceKeyword', - 'name', - 'interfaceBaseClause', - 'interfaceMembers' - ]; - - public function getNameParts() : array { - return [$this->name]; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamedLabelStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamedLabelStatement.php deleted file mode 100644 index e88e7bc..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamedLabelStatement.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class NamedLabelStatement extends StatementNode { - /** @var Token */ - public $name; - /** @var Token */ - public $colon; - /** @var StatementNode */ - public $statement; - - const CHILD_NAMES = [ - 'name', - 'colon', - 'statement' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamespaceDefinition.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamespaceDefinition.php deleted file mode 100644 index b16a355..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamespaceDefinition.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\QualifiedName; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; -use Microsoft\PhpParser\Node\SourceFileNode; - -/** - * @property SourceFileNode $parent - */ -class NamespaceDefinition extends StatementNode { - /** @var Token */ - public $namespaceKeyword; - /** @var QualifiedName|null */ - public $name; - /** @var CompoundStatementNode|Token */ - public $compoundStatementOrSemicolon; - - const CHILD_NAMES = [ - 'namespaceKeyword', - 'name', - 'compoundStatementOrSemicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamespaceUseDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamespaceUseDeclaration.php deleted file mode 100644 index c18e82b..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/NamespaceUseDeclaration.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Diagnostic; -use Microsoft\PhpParser\DiagnosticKind; -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class NamespaceUseDeclaration extends StatementNode { - /** @var Token */ - public $useKeyword; - /** @var Token */ - public $functionOrConst; - /** @var DelimitedList\NamespaceUseClauseList */ - public $useClauses; - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'useKeyword', - 'functionOrConst', - 'useClauses', - 'semicolon' - ]; - - /** - * @return Diagnostic|null - Callers should use DiagnosticsProvider::getDiagnostics instead - * @internal - * @override - */ - public function getDiagnosticForNode() { - if ( - $this->useClauses != null - && \count($this->useClauses->children) > 1 - ) { - foreach ($this->useClauses->children as $useClause) { - if($useClause instanceof Node\NamespaceUseClause && !is_null($useClause->openBrace)) { - return new Diagnostic( - DiagnosticKind::Error, - "; expected.", - $useClause->getEndPosition(), - 1 - ); - } - } - } - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ReturnStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ReturnStatement.php deleted file mode 100644 index 50353c1..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ReturnStatement.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class ReturnStatement extends StatementNode { - /** @var Token */ - public $returnKeyword; - /** @var Expression|null */ - public $expression; - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'returnKeyword', - 'expression', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/SwitchStatementNode.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/SwitchStatementNode.php deleted file mode 100644 index df05739..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/SwitchStatementNode.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\CaseStatementNode; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class SwitchStatementNode extends StatementNode { - /** @var Token */ - public $switchKeyword; - /** @var Token */ - public $openParen; - /** @var Expression */ - public $expression; - /** @var Token */ - public $closeParen; - /** @var Token|null */ - public $colon; - /** @var Token|null */ - public $openBrace; - /** @var CaseStatementNode[] */ - public $caseStatements; - /** @var Token|null */ - public $closeBrace; - /** @var Token|null */ - public $endswitch; - /** @var Token|null */ - public $semicolon; - - const CHILD_NAMES = [ - 'switchKeyword', - 'openParen', - 'expression', - 'closeParen', - 'colon', - 'openBrace', - 'caseStatements', - 'closeBrace', - 'endswitch', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ThrowStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ThrowStatement.php deleted file mode 100644 index 34dc13d..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/ThrowStatement.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class ThrowStatement extends StatementNode { - /** @var Token */ - public $throwKeyword; - /** @var Expression */ - public $expression; - /** @var Token */ - public $semicolon; - - const CHILD_NAMES = [ - 'throwKeyword', - 'expression', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/TraitDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/TraitDeclaration.php deleted file mode 100644 index 9583faf..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/TraitDeclaration.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\ClassLike; -use Microsoft\PhpParser\NamespacedNameInterface; -use Microsoft\PhpParser\NamespacedNameTrait; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Node\TraitMembers; -use Microsoft\PhpParser\Token; - -class TraitDeclaration extends StatementNode implements NamespacedNameInterface, ClassLike { - use NamespacedNameTrait; - - /** @var Token */ - public $traitKeyword; - - /** @var Token */ - public $name; - - /** @var TraitMembers */ - public $traitMembers; - - const CHILD_NAMES = [ - 'traitKeyword', - 'name', - 'traitMembers' - ]; - - public function getNameParts() : array { - return [$this->name]; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/TryStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/TryStatement.php deleted file mode 100644 index b0e503c..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/TryStatement.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\CatchClause; -use Microsoft\PhpParser\Node\FinallyClause; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class TryStatement extends StatementNode { - /** @var Token */ - public $tryKeyword; - /** @var StatementNode */ - public $compoundStatement; - /** @var CatchClause[]|null */ - public $catchClauses; - /** @var FinallyClause|null */ - public $finallyClause; - - const CHILD_NAMES = [ - 'tryKeyword', - 'compoundStatement', - 'catchClauses', - 'finallyClause' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/WhileStatement.php b/vendor/microsoft/tolerant-php-parser/src/Node/Statement/WhileStatement.php deleted file mode 100644 index d79ae71..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/Statement/WhileStatement.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node\Statement; - -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\StatementNode; -use Microsoft\PhpParser\Token; - -class WhileStatement extends StatementNode { - /** @var Token */ - public $whileToken; - /** @var Token */ - public $openParen; - /** @var Expression */ - public $expression; - /** @var Token */ - public $closeParen; - /** @var Token|null */ - public $colon; - /** @var StatementNode|StatementNode[] */ - public $statements; - /** @var Token|null */ - public $endWhile; - /** @var Token|null */ - public $semicolon; - - const CHILD_NAMES = [ - 'whileToken', - 'openParen', - 'expression', - 'closeParen', - 'colon', - 'statements', - 'endWhile', - 'semicolon' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/StatementNode.php b/vendor/microsoft/tolerant-php-parser/src/Node/StatementNode.php deleted file mode 100644 index c664370..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/StatementNode.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; - -abstract class StatementNode extends Node { -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/StaticVariableDeclaration.php b/vendor/microsoft/tolerant-php-parser/src/Node/StaticVariableDeclaration.php deleted file mode 100644 index 7c08ec5..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/StaticVariableDeclaration.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class StaticVariableDeclaration extends Node { - - /** @var Token */ - public $variableName; - - /** @var Token|null */ - public $equalsToken; - - /** @var Expression|null */ - public $assignment; - - const CHILD_NAMES = [ - 'variableName', - 'equalsToken', - 'assignment', - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/StringLiteral.php b/vendor/microsoft/tolerant-php-parser/src/Node/StringLiteral.php deleted file mode 100644 index 00018e0..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/StringLiteral.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class StringLiteral extends Expression { - /** @var Token */ - public $startQuote; - - /** @var Token[]|Node[]|Token */ - public $children; - - /** @var Token */ - public $endQuote; - - const CHILD_NAMES = [ - 'startQuote', - 'children', - 'endQuote', - ]; - - public function getStringContentsText() { - // TODO add tests - $stringContents = ""; - if (isset($this->startQuote)) { - foreach ($this->children as $child) { - $contents = $this->getFileContents(); - $stringContents .= $child->getFullText($contents); - } - } else { - // TODO ensure string consistency (all strings should have start / end quote) - $stringContents = trim($this->children->getText($this->getFileContents()), '"\''); - } - return $stringContents; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/TraitMembers.php b/vendor/microsoft/tolerant-php-parser/src/Node/TraitMembers.php deleted file mode 100644 index 53c375c..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/TraitMembers.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class TraitMembers extends Node { - /** @var Token */ - public $openBrace; - - /** @var Node[] */ - public $traitMemberDeclarations; - - /** @var Token */ - public $closeBrace; - - const CHILD_NAMES = [ - 'openBrace', - 'traitMemberDeclarations', - 'closeBrace', - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/TraitSelectOrAliasClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/TraitSelectOrAliasClause.php deleted file mode 100644 index 0144716..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/TraitSelectOrAliasClause.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class TraitSelectOrAliasClause extends Node { - /** @var QualifiedName|Node\Expression\ScopedPropertyAccessExpression */ - public $name; - - /** @var Token */ - public $asOrInsteadOfKeyword; - - /** @var Token[] */ - public $modifiers; - - /** @var QualifiedName|Node\Expression\ScopedPropertyAccessExpression */ - public $targetName; - - /** - * @var Token[]|QualifiedName[]|null - * - * This is set if $asOrInsteadOfKeyword is an insteadof keyword. - * (E.g. for parsing `use T1, T2, T3{T1::foo insteadof T2, T3}` - * - * NOTE: This was added as a separate property to minimize - * backwards compatibility breaks in applications using this file. - * - * TODO: Use a more consistent design such as either of the following: - * 1. Combine targetName and remainingTargetNames into a DelimitedList - * 2. Use two distinct properties for the targets of `as` and `insteadof` - */ - public $remainingTargetNames; - - const CHILD_NAMES = [ - 'name', - 'asOrInsteadOfKeyword', - 'modifiers', - 'targetName', - 'remainingTargetNames', - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/TraitUseClause.php b/vendor/microsoft/tolerant-php-parser/src/Node/TraitUseClause.php deleted file mode 100644 index 8c343c4..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/TraitUseClause.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class TraitUseClause extends Node { - /** @var Token */ - public $useKeyword; - - /** @var DelimitedList\QualifiedNameList */ - public $traitNameList; - - /** @var Token */ - public $semicolonOrOpenBrace; - - /** @var DelimitedList\TraitSelectOrAliasClauseList */ - public $traitSelectAndAliasClauses; - - /** @var Token */ - public $closeBrace; - - const CHILD_NAMES = [ - 'useKeyword', - 'traitNameList', - 'semicolonOrOpenBrace', - 'traitSelectAndAliasClauses', - 'closeBrace' - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Node/UseVariableName.php b/vendor/microsoft/tolerant-php-parser/src/Node/UseVariableName.php deleted file mode 100644 index 21fc079..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Node/UseVariableName.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser\Node; - -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -class UseVariableName extends Node { - const CHILD_NAMES = ['byRef', 'variableName']; - - /** @var Token|null */ - public $byRef; - - /** @var Token */ - public $variableName; - - public function getName() { - if ( - $this->variableName instanceof Token && - $name = substr($this->variableName->getText($this->getFileContents()), 1) - ) { - return $name; - } - return null; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/ParseContext.php b/vendor/microsoft/tolerant-php-parser/src/ParseContext.php deleted file mode 100644 index 99d9b50..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/ParseContext.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class ParseContext { - const SourceElements = 0; - const BlockStatements = 1; - const ClassMembers = 2; - const IfClause2Elements = 3; - const SwitchStatementElements = 4; - const CaseStatementElements = 5; - const WhileStatementElements = 6; - const ForStatementElements = 7; - const ForeachStatementElements = 8; - const DeclareStatementElements = 9; - const InterfaceMembers = 10; - const TraitMembers = 11; - const Count = 12; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Parser.php b/vendor/microsoft/tolerant-php-parser/src/Parser.php deleted file mode 100644 index 44f94de..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Parser.php +++ /dev/null @@ -1,3419 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -use Microsoft\PhpParser\Node\AnonymousFunctionUseClause; -use Microsoft\PhpParser\Node\ArrayElement; -use Microsoft\PhpParser\Node\CaseStatementNode; -use Microsoft\PhpParser\Node\CatchClause; -use Microsoft\PhpParser\Node\ClassBaseClause; -use Microsoft\PhpParser\Node\ClassInterfaceClause; -use Microsoft\PhpParser\Node\ClassMembersNode; -use Microsoft\PhpParser\Node\ConstElement; -use Microsoft\PhpParser\Node\Expression; -use Microsoft\PhpParser\Node\Expression\{ - AnonymousFunctionCreationExpression, - ArgumentExpression, - ArrayCreationExpression, - AssignmentExpression, - BinaryExpression, - BracedExpression, - CallExpression, - CastExpression, - CloneExpression, - EmptyIntrinsicExpression, - ErrorControlExpression, - EvalIntrinsicExpression, - ExitIntrinsicExpression, - IssetIntrinsicExpression, - MemberAccessExpression, - ParenthesizedExpression, - PrefixUpdateExpression, - PrintIntrinsicExpression, - EchoExpression, - ListIntrinsicExpression, - ObjectCreationExpression, - ScriptInclusionExpression, - PostfixUpdateExpression, - ScopedPropertyAccessExpression, - SubscriptExpression, - TernaryExpression, - UnaryExpression, - UnaryOpExpression, - UnsetIntrinsicExpression, - Variable, - YieldExpression -}; -use Microsoft\PhpParser\Node\StaticVariableDeclaration; -use Microsoft\PhpParser\Node\ClassConstDeclaration; -use Microsoft\PhpParser\Node\DeclareDirective; -use Microsoft\PhpParser\Node\DelimitedList; -use Microsoft\PhpParser\Node\ElseClauseNode; -use Microsoft\PhpParser\Node\ElseIfClauseNode; -use Microsoft\PhpParser\Node\FinallyClause; -use Microsoft\PhpParser\Node\ForeachKey; -use Microsoft\PhpParser\Node\ForeachValue; -use Microsoft\PhpParser\Node\InterfaceBaseClause; -use Microsoft\PhpParser\Node\InterfaceMembers; -use Microsoft\PhpParser\Node\MissingMemberDeclaration; -use Microsoft\PhpParser\Node\NamespaceAliasingClause; -use Microsoft\PhpParser\Node\NamespaceUseGroupClause; -use Microsoft\PhpParser\Node\NumericLiteral; -use Microsoft\PhpParser\Node\PropertyDeclaration; -use Microsoft\PhpParser\Node\ReservedWord; -use Microsoft\PhpParser\Node\StringLiteral; -use Microsoft\PhpParser\Node\MethodDeclaration; -use Microsoft\PhpParser\Node\Parameter; -use Microsoft\PhpParser\Node\QualifiedName; -use Microsoft\PhpParser\Node\RelativeSpecifier; -use Microsoft\PhpParser\Node\SourceFileNode; -use Microsoft\PhpParser\Node\Statement\{ - ClassDeclaration, - ConstDeclaration, - CompoundStatementNode, - FunctionStaticDeclaration, - GlobalDeclaration, - BreakOrContinueStatement, - DeclareStatement, - DoStatement, - EmptyStatement, - ExpressionStatement, - ForeachStatement, - ForStatement, - FunctionDeclaration, - GotoStatement, - IfStatementNode, - InlineHtml, - InterfaceDeclaration, - NamespaceDefinition, - NamespaceUseDeclaration, - NamedLabelStatement, - ReturnStatement, - SwitchStatementNode, - ThrowStatement, - TraitDeclaration, - TryStatement, - WhileStatement -}; -use Microsoft\PhpParser\Node\TraitMembers; -use Microsoft\PhpParser\Node\TraitSelectOrAliasClause; -use Microsoft\PhpParser\Node\TraitUseClause; -use Microsoft\PhpParser\Node\UseVariableName; -use Microsoft\PhpParser\Node\NamespaceUseClause; - -class Parser { - /** @var TokenStreamProviderInterface */ - private $lexer; - - private $currentParseContext; - public $sourceFile; - - private $nameOrKeywordOrReservedWordTokens; - private $nameOrReservedWordTokens; - private $nameOrStaticOrReservedWordTokens; - private $reservedWordTokens; - private $keywordTokens; - // TODO consider validating parameter and return types on post-parse instead so we can be more permissive - private $parameterTypeDeclarationTokens; - private $returnTypeDeclarationTokens; - - public function __construct() { - $this->reservedWordTokens = \array_values(TokenStringMaps::RESERVED_WORDS); - $this->keywordTokens = \array_values(TokenStringMaps::KEYWORDS); - $this->nameOrKeywordOrReservedWordTokens = \array_merge([TokenKind::Name], $this->keywordTokens, $this->reservedWordTokens); - $this->nameOrReservedWordTokens = \array_merge([TokenKind::Name], $this->reservedWordTokens); - $this->nameOrStaticOrReservedWordTokens = \array_merge([TokenKind::Name, TokenKind::StaticKeyword], $this->reservedWordTokens); - $this->parameterTypeDeclarationTokens = - [TokenKind::ArrayKeyword, TokenKind::CallableKeyword, TokenKind::BoolReservedWord, - TokenKind::FloatReservedWord, TokenKind::IntReservedWord, TokenKind::StringReservedWord, - TokenKind::ObjectReservedWord]; // TODO update spec - $this->returnTypeDeclarationTokens = \array_merge([TokenKind::VoidReservedWord], $this->parameterTypeDeclarationTokens); - } - - /** - * Generates AST from source file contents. Returns an instance of SourceFileNode, which is always the top-most - * Node-type of the tree. - * - * @param string $fileContents - * @return SourceFileNode - */ - public function parseSourceFile(string $fileContents, string $uri = null) : SourceFileNode { - $this->lexer = TokenStreamProviderFactory::GetTokenStreamProvider($fileContents); - - $this->reset(); - - $sourceFile = new SourceFileNode(); - $this->sourceFile = $sourceFile; - $sourceFile->fileContents = $fileContents; - $sourceFile->uri = $uri; - $sourceFile->statementList = array(); - if ($this->getCurrentToken()->kind !== TokenKind::EndOfFileToken) { - $inlineHTML = $this->parseInlineHtml($sourceFile); - $sourceFile->statementList[] = $inlineHTML; - if ($inlineHTML->echoStatement) { - $sourceFile->statementList[] = $inlineHTML->echoStatement; - $inlineHTML->echoStatement->parent = $sourceFile; - $inlineHTML->echoStatement = null; - } - } - $sourceFile->statementList = - \array_merge($sourceFile->statementList, $this->parseList($sourceFile, ParseContext::SourceElements)); - - $this->sourceFile->endOfFileToken = $this->eat1(TokenKind::EndOfFileToken); - $this->advanceToken(); - - $sourceFile->parent = null; - - return $sourceFile; - } - - private function reset() { - $this->advanceToken(); - - // Stores the current parse context, which includes the current and enclosing lists. - $this->currentParseContext = 0; - } - - /** - * Parse a list of elements for a given ParseContext until a list terminator associated - * with that ParseContext is reached. Additionally abort parsing when an element is reached - * that is invalid in the current context, but valid in an enclosing context. If an element - * is invalid in both current and enclosing contexts, generate a SkippedToken, and continue. - * @param Node $parentNode - * @param int $listParseContext - * @return array - */ - private function parseList($parentNode, int $listParseContext) { - $savedParseContext = $this->currentParseContext; - $this->currentParseContext |= 1 << $listParseContext; - $parseListElementFn = $this->getParseListElementFn($listParseContext); - - $nodeArray = array(); - while (!$this->isListTerminator($listParseContext)) { - if ($this->isValidListElement($listParseContext, $this->getCurrentToken())) { - $element = $parseListElementFn($parentNode); - if ($element instanceof Node) { - $element->parent = $parentNode; - if ($element instanceof InlineHtml && $element->echoStatement && $listParseContext === ParseContext::SourceElements) { - $nodeArray[] = $element->echoStatement; - $element->echoStatement->parent = $parentNode; - $element->echoStatement = null; - } - } - $nodeArray[] = $element; - continue; - } - - // Error handling logic: - // The current parse context does not know how to handle the current token, - // so check if the enclosing contexts know what to do. If so, we assume that - // the list has completed parsing, and return to the enclosing context. - // - // Example: - // class A { - // function foo() { - // return; - // // } <- MissingToken (generated when we try to "eat" the closing brace) - // - // public function bar() { - // } - // } - // - // In the case above, the Method ParseContext doesn't know how to handle "public", but - // the Class ParseContext will know what to do with it. So we abort the Method ParseContext, - // and return to the Class ParseContext. This enables us to generate a tree with a single - // class that contains two method nodes, even though there was an error present in the first method. - if ($this->isCurrentTokenValidInEnclosingContexts()) { - break; - } - - // None of the enclosing contexts know how to handle the token. Generate a - // SkippedToken, and continue parsing in the current context. - // Example: - // class A { - // function foo() { - // return; - // & // <- SkippedToken - // } - // } - $token = new SkippedToken($this->getCurrentToken()); - $nodeArray[] = $token; - $this->advanceToken(); - } - - $this->currentParseContext = $savedParseContext; - - return $nodeArray; - } - - private function isListTerminator(int $parseContext) { - $tokenKind = $this->getCurrentToken()->kind; - if ($tokenKind === TokenKind::EndOfFileToken) { - // Being at the end of the file ends all lists. - return true; - } - - switch ($parseContext) { - case ParseContext::SourceElements: - return false; - - case ParseContext::InterfaceMembers: - case ParseContext::ClassMembers: - case ParseContext::BlockStatements: - case ParseContext::TraitMembers: - return $tokenKind === TokenKind::CloseBraceToken; - case ParseContext::SwitchStatementElements: - return $tokenKind === TokenKind::CloseBraceToken || $tokenKind === TokenKind::EndSwitchKeyword; - case ParseContext::IfClause2Elements: - return - $tokenKind === TokenKind::ElseIfKeyword || - $tokenKind === TokenKind::ElseKeyword || - $tokenKind === TokenKind::EndIfKeyword; - - case ParseContext::WhileStatementElements: - return $tokenKind === TokenKind::EndWhileKeyword; - - case ParseContext::CaseStatementElements: - return - $tokenKind === TokenKind::CaseKeyword || - $tokenKind === TokenKind::DefaultKeyword; - - case ParseContext::ForStatementElements: - return - $tokenKind === TokenKind::EndForKeyword; - - case ParseContext::ForeachStatementElements: - return $tokenKind === TokenKind::EndForEachKeyword; - - case ParseContext::DeclareStatementElements: - return $tokenKind === TokenKind::EndDeclareKeyword; - } - // TODO warn about unhandled parse context - return false; - } - - private function isValidListElement($context, Token $token) { - - // TODO - switch ($context) { - case ParseContext::SourceElements: - case ParseContext::BlockStatements: - case ParseContext::IfClause2Elements: - case ParseContext::CaseStatementElements: - case ParseContext::WhileStatementElements: - case ParseContext::ForStatementElements: - case ParseContext::ForeachStatementElements: - case ParseContext::DeclareStatementElements: - return $this->isStatementStart($token); - - case ParseContext::ClassMembers: - return $this->isClassMemberDeclarationStart($token); - - case ParseContext::TraitMembers: - return $this->isTraitMemberDeclarationStart($token); - - case ParseContext::InterfaceMembers: - return $this->isInterfaceMemberDeclarationStart($token); - - case ParseContext::SwitchStatementElements: - return - $token->kind === TokenKind::CaseKeyword || - $token->kind === TokenKind::DefaultKeyword; - } - return false; - } - - private function getParseListElementFn($context) { - switch ($context) { - case ParseContext::SourceElements: - case ParseContext::BlockStatements: - case ParseContext::IfClause2Elements: - case ParseContext::CaseStatementElements: - case ParseContext::WhileStatementElements: - case ParseContext::ForStatementElements: - case ParseContext::ForeachStatementElements: - case ParseContext::DeclareStatementElements: - return $this->parseStatementFn(); - case ParseContext::ClassMembers: - return $this->parseClassElementFn(); - - case ParseContext::TraitMembers: - return $this->parseTraitElementFn(); - - case ParseContext::InterfaceMembers: - return $this->parseInterfaceElementFn(); - - case ParseContext::SwitchStatementElements: - return $this->parseCaseOrDefaultStatement(); - default: - throw new \Exception("Unrecognized parse context"); - } - } - - /** - * Aborts parsing list when one of the parent contexts understands something - * @return bool - */ - private function isCurrentTokenValidInEnclosingContexts() { - for ($contextKind = 0; $contextKind < ParseContext::Count; $contextKind++) { - if ($this->isInParseContext($contextKind)) { - if ($this->isValidListElement($contextKind, $this->getCurrentToken()) || $this->isListTerminator($contextKind)) { - return true; - } - } - } - return false; - } - - private function isInParseContext($contextToCheck) { - return ($this->currentParseContext & (1 << $contextToCheck)); - } - - /** - * Retrieve the current token, and check that it's of the expected TokenKind. - * If so, advance and return the token. Otherwise return a MissingToken for - * the expected token. - * @param int|int[] ...$kinds - * @return Token - */ - private function eat(...$kinds) { - $token = $this->token; - if (\is_array($kinds[0])) { - $kinds = $kinds[0]; - } - foreach ($kinds as $kind) { - if ($token->kind === $kind) { - $this->token = $this->lexer->scanNextToken(); - return $token; - } - } - // TODO include optional grouping for token kinds - return new MissingToken($kinds[0], $token->fullStart); - } - - /** - * Retrieve the current token, and check that it's of the kind $kind. - * If so, advance and return the token. Otherwise return a MissingToken for - * the expected token. - * - * This is faster than calling eat() if there is a single token. - * - * @param int $kind - * @return Token - */ - private function eat1($kind) { - $token = $this->token; - if ($token->kind === $kind) { - $this->token = $this->lexer->scanNextToken(); - return $token; - } - // TODO include optional grouping for token kinds - return new MissingToken($kind, $token->fullStart); - } - - /** - * @param int|int[] ...$kinds (Can provide a single value with a list of kinds, or multiple kinds) - * @return Token|null - */ - private function eatOptional(...$kinds) { - $token = $this->token; - if (\is_array($kinds[0])) { - $kinds = $kinds[0]; - } - if (\in_array($token->kind, $kinds)) { - $this->token = $this->lexer->scanNextToken(); - return $token; - } - return null; - } - - /** - * @param int $kind a single kind - * @return Token|null - */ - private function eatOptional1($kind) { - $token = $this->token; - if ($token->kind === $kind) { - $this->token = $this->lexer->scanNextToken(); - return $token; - } - return null; - } - - private $token; - - private function getCurrentToken() : Token { - return $this->token; - } - - private function advanceToken() { - $this->token = $this->lexer->scanNextToken(); - } - - private function parseStatement($parentNode) { - return ($this->parseStatementFn())($parentNode); - } - - private function parseStatementFn() { - return function ($parentNode) { - $token = $this->getCurrentToken(); - switch ($token->kind) { - // compound-statement - case TokenKind::OpenBraceToken: - return $this->parseCompoundStatement($parentNode); - - // labeled-statement - case TokenKind::Name: - if ($this->lookahead(TokenKind::ColonToken)) { - return $this->parseNamedLabelStatement($parentNode); - } - break; - - // selection-statement - case TokenKind::IfKeyword: - return $this->parseIfStatement($parentNode); - case TokenKind::SwitchKeyword: - return $this->parseSwitchStatement($parentNode); - - // iteration-statement - case TokenKind::WhileKeyword: // while-statement - return $this->parseWhileStatement($parentNode); - case TokenKind::DoKeyword: // do-statement - return $this->parseDoStatement($parentNode); - case TokenKind::ForKeyword: // for-statement - return $this->parseForStatement($parentNode); - case TokenKind::ForeachKeyword: // foreach-statement - return $this->parseForeachStatement($parentNode); - - // jump-statement - case TokenKind::GotoKeyword: // goto-statement - return $this->parseGotoStatement($parentNode); - case TokenKind::ContinueKeyword: // continue-statement - case TokenKind::BreakKeyword: // break-statement - return $this->parseBreakOrContinueStatement($parentNode); - case TokenKind::ReturnKeyword: // return-statement - return $this->parseReturnStatement($parentNode); - case TokenKind::ThrowKeyword: // throw-statement - return $this->parseThrowStatement($parentNode); - - // try-statement - case TokenKind::TryKeyword: - return $this->parseTryStatement($parentNode); - - // declare-statement - case TokenKind::DeclareKeyword: - return $this->parseDeclareStatement($parentNode); - - // function-declaration - case TokenKind::FunctionKeyword: - // Check that this is not an anonymous-function-creation-expression - if ($this->lookahead($this->nameOrKeywordOrReservedWordTokens) || $this->lookahead(TokenKind::AmpersandToken, $this->nameOrKeywordOrReservedWordTokens)) { - return $this->parseFunctionDeclaration($parentNode); - } - break; - - // class-declaration - case TokenKind::FinalKeyword: - case TokenKind::AbstractKeyword: - if (!$this->lookahead(TokenKind::ClassKeyword)) { - $this->advanceToken(); - return new SkippedToken($token); - } - case TokenKind::ClassKeyword: - return $this->parseClassDeclaration($parentNode); - - // interface-declaration - case TokenKind::InterfaceKeyword: - return $this->parseInterfaceDeclaration($parentNode); - - // namespace-definition - case TokenKind::NamespaceKeyword: - if (!$this->lookahead(TokenKind::BackslashToken)) { - // TODO add error handling for the case where a namespace definition does not occur in the outer-most scope - return $this->parseNamespaceDefinition($parentNode); - } - break; - - // namespace-use-declaration - case TokenKind::UseKeyword: - return $this->parseNamespaceUseDeclaration($parentNode); - - case TokenKind::SemicolonToken: - return $this->parseEmptyStatement($parentNode); - - case TokenKind::EchoKeyword: - return $this->parseEchoStatement($parentNode); - - // trait-declaration - case TokenKind::TraitKeyword: - return $this->parseTraitDeclaration($parentNode); - - // global-declaration - case TokenKind::GlobalKeyword: - return $this->parseGlobalDeclaration($parentNode); - - // const-declaration - case TokenKind::ConstKeyword: - return $this->parseConstDeclaration($parentNode); - - // function-static-declaration - case TokenKind::StaticKeyword: - // Check that this is not an anonymous-function-creation-expression - if (!$this->lookahead([TokenKind::FunctionKeyword, TokenKind::OpenParenToken, TokenKind::ColonColonToken])) { - return $this->parseFunctionStaticDeclaration($parentNode); - } - break; - - case TokenKind::ScriptSectionEndTag: - return $this->parseInlineHtml($parentNode); - - case TokenKind::UnsetKeyword: - return $this->parseUnsetStatement($parentNode); - } - - $expressionStatement = new ExpressionStatement(); - $expressionStatement->parent = $parentNode; - $expressionStatement->expression = $this->parseExpression($expressionStatement, true); - $expressionStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - return $expressionStatement; - }; - } - - private function parseClassElementFn() { - return function ($parentNode) { - $modifiers = $this->parseModifiers(); - - $token = $this->getCurrentToken(); - switch ($token->kind) { - case TokenKind::ConstKeyword: - return $this->parseClassConstDeclaration($parentNode, $modifiers); - - case TokenKind::FunctionKeyword: - return $this->parseMethodDeclaration($parentNode, $modifiers); - - case TokenKind::QuestionToken: - return $this->parseRemainingPropertyDeclarationOrMissingMemberDeclaration( - $parentNode, - $modifiers, - $this->eat1(TokenKind::QuestionToken) - ); - case TokenKind::VariableName: - return $this->parsePropertyDeclaration($parentNode, $modifiers); - - case TokenKind::UseKeyword: - return $this->parseTraitUseClause($parentNode); - - default: - return $this->parseRemainingPropertyDeclarationOrMissingMemberDeclaration($parentNode, $modifiers); - } - }; - } - - private function parseClassDeclaration($parentNode) : Node { - $classNode = new ClassDeclaration(); // TODO verify not nested - $classNode->parent = $parentNode; - $classNode->abstractOrFinalModifier = $this->eatOptional(TokenKind::AbstractKeyword, TokenKind::FinalKeyword); - $classNode->classKeyword = $this->eat1(TokenKind::ClassKeyword); - $classNode->name = $this->eat($this->nameOrReservedWordTokens); // TODO should be any - $classNode->name->kind = TokenKind::Name; - $classNode->classBaseClause = $this->parseClassBaseClause($classNode); - $classNode->classInterfaceClause = $this->parseClassInterfaceClause($classNode); - $classNode->classMembers = $this->parseClassMembers($classNode); - return $classNode; - } - - private function parseClassMembers($parentNode) : Node { - $classMembers = new ClassMembersNode(); - $classMembers->openBrace = $this->eat1(TokenKind::OpenBraceToken); - $classMembers->classMemberDeclarations = $this->parseList($classMembers, ParseContext::ClassMembers); - $classMembers->closeBrace = $this->eat1(TokenKind::CloseBraceToken); - $classMembers->parent = $parentNode; - return $classMembers; - } - - private function parseFunctionDeclaration($parentNode) { - $functionNode = new FunctionDeclaration(); - $this->parseFunctionType($functionNode); - $functionNode->parent = $parentNode; - return $functionNode; - } - - private function parseMethodDeclaration($parentNode, $modifiers) { - $methodDeclaration = new MethodDeclaration(); - $methodDeclaration->modifiers = $modifiers; - $this->parseFunctionType($methodDeclaration, true); - $methodDeclaration->parent = $parentNode; - return $methodDeclaration; - } - - private function parseParameterFn() { - return function ($parentNode) { - $parameter = new Parameter(); - $parameter->parent = $parentNode; - $parameter->questionToken = $this->eatOptional1(TokenKind::QuestionToken); - $parameter->typeDeclaration = $this->tryParseParameterTypeDeclaration($parameter); - $parameter->byRefToken = $this->eatOptional1(TokenKind::AmpersandToken); - // TODO add post-parse rule that prevents assignment - // TODO add post-parse rule that requires only last parameter be variadic - $parameter->dotDotDotToken = $this->eatOptional1(TokenKind::DotDotDotToken); - $parameter->variableName = $this->eat1(TokenKind::VariableName); - $parameter->equalsToken = $this->eatOptional1(TokenKind::EqualsToken); - if ($parameter->equalsToken !== null) { - // TODO add post-parse rule that checks for invalid assignments - $parameter->default = $this->parseExpression($parameter); - } - return $parameter; - }; - } - - private function parseReturnTypeDeclaration($parentNode) { - $returnTypeDeclaration = - $this->eatOptional($this->returnTypeDeclarationTokens) - ?? $this->parseQualifiedName($parentNode) - ?? new MissingToken(TokenKind::ReturnType, $this->getCurrentToken()->fullStart); - - return $returnTypeDeclaration; - } - - private function tryParseParameterTypeDeclaration($parentNode) { - $parameterTypeDeclaration = - $this->eatOptional($this->parameterTypeDeclarationTokens) ?? $this->parseQualifiedName($parentNode); - return $parameterTypeDeclaration; - } - - private function parseCompoundStatement($parentNode) { - $compoundStatement = new CompoundStatementNode(); - $compoundStatement->openBrace = $this->eat1(TokenKind::OpenBraceToken); - $compoundStatement->statements = $this->parseList($compoundStatement, ParseContext::BlockStatements); - $compoundStatement->closeBrace = $this->eat1(TokenKind::CloseBraceToken); - $compoundStatement->parent = $parentNode; - return $compoundStatement; - } - - private function array_push_list(& $array, $list) { - foreach ($list as $item) { - $array[] = $item; - } - } - - private function isClassMemberDeclarationStart(Token $token) { - switch ($token->kind) { - // const-modifier - case TokenKind::ConstKeyword: - - // visibility-modifier - case TokenKind::PublicKeyword: - case TokenKind::ProtectedKeyword: - case TokenKind::PrivateKeyword: - - // static-modifier - case TokenKind::StaticKeyword: - - // class-modifier - case TokenKind::AbstractKeyword: - case TokenKind::FinalKeyword: - - case TokenKind::VarKeyword: - - case TokenKind::FunctionKeyword: - - case TokenKind::UseKeyword: - return true; - - } - - return false; - } - - private function isStatementStart(Token $token) { - // https://github.com/php/php-langspec/blob/master/spec/19-grammar.md#statements - switch ($token->kind) { - // Compound Statements - case TokenKind::OpenBraceToken: - - // Labeled Statements - case TokenKind::Name: -// case TokenKind::CaseKeyword: // TODO update spec -// case TokenKind::DefaultKeyword: - - // Expression Statements - case TokenKind::SemicolonToken: - case TokenKind::IfKeyword: - case TokenKind::SwitchKeyword: - - // Iteration Statements - case TokenKind::WhileKeyword: - case TokenKind::DoKeyword: - case TokenKind::ForKeyword: - case TokenKind::ForeachKeyword: - - // Jump Statements - case TokenKind::GotoKeyword: - case TokenKind::ContinueKeyword: - case TokenKind::BreakKeyword: - case TokenKind::ReturnKeyword: - case TokenKind::ThrowKeyword: - - // The try Statement - case TokenKind::TryKeyword: - - // The declare Statement - case TokenKind::DeclareKeyword: - - // const-declaration - case TokenKind::ConstKeyword: - - // function-definition - case TokenKind::FunctionKeyword: - - // class-declaration - case TokenKind::ClassKeyword: - case TokenKind::AbstractKeyword: - case TokenKind::FinalKeyword: - - // interface-declaration - case TokenKind::InterfaceKeyword: - - // trait-declaration - case TokenKind::TraitKeyword: - - // namespace-definition - case TokenKind::NamespaceKeyword: - - // namespace-use-declaration - case TokenKind::UseKeyword: - - // global-declaration - case TokenKind::GlobalKeyword: - - // function-static-declaration - case TokenKind::StaticKeyword: - - case TokenKind::ScriptSectionEndTag: - return true; - - default: - return $this->isExpressionStart($token); - } - } - - private function isExpressionStart($token) { - return ($this->isExpressionStartFn())($token); - } - - private function isExpressionStartFn() { - return function ($token) { - switch ($token->kind) { - // Script Inclusion Expression - case TokenKind::RequireKeyword: - case TokenKind::RequireOnceKeyword: - case TokenKind::IncludeKeyword: - case TokenKind::IncludeOnceKeyword: - - // yield-expression - case TokenKind::YieldKeyword: - case TokenKind::YieldFromKeyword: - - // object-creation-expression - case TokenKind::NewKeyword: - case TokenKind::CloneKeyword: - return true; - - // unary-op-expression - case TokenKind::PlusToken: - case TokenKind::MinusToken: - case TokenKind::ExclamationToken: - case TokenKind::TildeToken: - - // error-control-expression - case TokenKind::AtSymbolToken: - - // prefix-increment-expression - case TokenKind::PlusPlusToken: - // prefix-decrement-expression - case TokenKind::MinusMinusToken: - return true; - - // variable-name - case TokenKind::VariableName: - case TokenKind::DollarToken: - return true; - - // qualified-name - case TokenKind::Name: - case TokenKind::BackslashToken: - return true; - case TokenKind::NamespaceKeyword: - // TODO currently only supports qualified-names, but eventually parse namespace declarations - return $this->checkToken(TokenKind::BackslashToken); - - // literal - case TokenKind::DecimalLiteralToken: // TODO merge dec, oct, hex, bin, float -> NumericLiteral - case TokenKind::OctalLiteralToken: - case TokenKind::HexadecimalLiteralToken: - case TokenKind::BinaryLiteralToken: - case TokenKind::FloatingLiteralToken: - case TokenKind::InvalidOctalLiteralToken: - case TokenKind::InvalidHexadecimalLiteral: - case TokenKind::InvalidBinaryLiteral: - case TokenKind::IntegerLiteralToken: - - case TokenKind::StringLiteralToken: - - case TokenKind::SingleQuoteToken: - case TokenKind::DoubleQuoteToken: - case TokenKind::HeredocStart: - case TokenKind::BacktickToken: - - // array-creation-expression - case TokenKind::ArrayKeyword: - case TokenKind::OpenBracketToken: - - // intrinsic-construct - case TokenKind::EchoKeyword: - case TokenKind::ListKeyword: - case TokenKind::UnsetKeyword: - - // intrinsic-operator - case TokenKind::EmptyKeyword: - case TokenKind::EvalKeyword: - case TokenKind::ExitKeyword: - case TokenKind::DieKeyword: - case TokenKind::IsSetKeyword: - case TokenKind::PrintKeyword: - - // ( expression ) - case TokenKind::OpenParenToken: - case TokenKind::ArrayCastToken: - case TokenKind::BoolCastToken: - case TokenKind::DoubleCastToken: - case TokenKind::IntCastToken: - case TokenKind::ObjectCastToken: - case TokenKind::StringCastToken: - case TokenKind::UnsetCastToken: - - // anonymous-function-creation-expression - case TokenKind::StaticKeyword: - case TokenKind::FunctionKeyword: - return true; - } - return \in_array($token->kind, $this->reservedWordTokens, true); - }; - } - - /** - * @param Node $parentNode - * @return Token|MissingToken|Node - */ - private function parsePrimaryExpression($parentNode) { - $token = $this->getCurrentToken(); - switch ($token->kind) { - // variable-name - case TokenKind::VariableName: // TODO special case $this - case TokenKind::DollarToken: - return $this->parseSimpleVariable($parentNode); - - // qualified-name - case TokenKind::Name: // TODO Qualified name - case TokenKind::BackslashToken: - case TokenKind::NamespaceKeyword: - return $this->parseQualifiedName($parentNode); - - case TokenKind::DecimalLiteralToken: // TODO merge dec, oct, hex, bin, float -> NumericLiteral - case TokenKind::OctalLiteralToken: - case TokenKind::HexadecimalLiteralToken: - case TokenKind::BinaryLiteralToken: - case TokenKind::FloatingLiteralToken: - case TokenKind::InvalidOctalLiteralToken: - case TokenKind::InvalidHexadecimalLiteral: - case TokenKind::InvalidBinaryLiteral: - case TokenKind::IntegerLiteralToken: - return $this->parseNumericLiteralExpression($parentNode); - - case TokenKind::StringLiteralToken: - return $this->parseStringLiteralExpression($parentNode); - - case TokenKind::DoubleQuoteToken: - case TokenKind::SingleQuoteToken: - case TokenKind::HeredocStart: - case TokenKind::BacktickToken: - return $this->parseStringLiteralExpression2($parentNode); - - // TODO constant-expression - - // array-creation-expression - case TokenKind::ArrayKeyword: - case TokenKind::OpenBracketToken: - return $this->parseArrayCreationExpression($parentNode); - - // intrinsic-construct - case TokenKind::ListKeyword: - return $this->parseListIntrinsicExpression($parentNode); - - // intrinsic-operator - case TokenKind::EmptyKeyword: - return $this->parseEmptyIntrinsicExpression($parentNode); - case TokenKind::EvalKeyword: - return $this->parseEvalIntrinsicExpression($parentNode); - - case TokenKind::ExitKeyword: - case TokenKind::DieKeyword: - return $this->parseExitIntrinsicExpression($parentNode); - - case TokenKind::IsSetKeyword: - return $this->parseIssetIntrinsicExpression($parentNode); - - case TokenKind::PrintKeyword: - return $this->parsePrintIntrinsicExpression($parentNode); - - // ( expression ) - case TokenKind::OpenParenToken: - return $this->parseParenthesizedExpression($parentNode); - - // anonymous-function-creation-expression - case TokenKind::StaticKeyword: - // handle `static::`, `static(`, `new static;`, `instanceof static` - if (($this->lookahead([TokenKind::ColonColonToken, TokenKind::OpenParenToken])) || - (!$this->lookahead(TokenKind::FunctionKeyword)) - ) { - return $this->parseQualifiedName($parentNode); - } - // Could be `static function` anonymous function creation expression, so flow through - case TokenKind::FunctionKeyword: - return $this->parseAnonymousFunctionCreationExpression($parentNode); - - case TokenKind::TrueReservedWord: - case TokenKind::FalseReservedWord: - case TokenKind::NullReservedWord: - // handle `true::`, `true(`, `true\` - if ($this->lookahead([TokenKind::BackslashToken, TokenKind::ColonColonToken, TokenKind::OpenParenToken])) { - return $this->parseQualifiedName($parentNode); - } - return $this->parseReservedWordExpression($parentNode); - } - if (\in_array($token->kind, TokenStringMaps::RESERVED_WORDS)) { - return $this->parseQualifiedName($parentNode); - } - - return new MissingToken(TokenKind::Expression, $token->fullStart); - } - - private function parseEmptyStatement($parentNode) { - $emptyStatement = new EmptyStatement(); - $emptyStatement->parent = $parentNode; - $emptyStatement->semicolon = $this->eat1(TokenKind::SemicolonToken); - return $emptyStatement; - } - - private function parseStringLiteralExpression($parentNode) { - // TODO validate input token - $expression = new StringLiteral(); - $expression->parent = $parentNode; - $expression->children = $this->getCurrentToken(); // TODO - merge string types - $this->advanceToken(); - return $expression; - } - - private function parseStringLiteralExpression2($parentNode) { - // TODO validate input token - $expression = new StringLiteral(); - $expression->parent = $parentNode; - $expression->startQuote = $this->eat(TokenKind::SingleQuoteToken, TokenKind::DoubleQuoteToken, TokenKind::HeredocStart, TokenKind::BacktickToken); - $expression->children = array(); - - while (true) { - switch ($this->getCurrentToken()->kind) { - case TokenKind::DollarOpenBraceToken: - case TokenKind::OpenBraceDollarToken: - $expression->children[] = $this->eat(TokenKind::DollarOpenBraceToken, TokenKind::OpenBraceDollarToken); - // TODO: Reject ${var->prop} and ${(var->prop)} without rejecting ${var+otherVar} - // Currently, this fails to reject ${var->prop} (because `var` has TokenKind::Name instead of StringVarname) - if ($this->getCurrentToken()->kind === TokenKind::StringVarname) { - $expression->children[] = $this->parseComplexDollarTemplateStringExpression($expression); - } else { - $expression->children[] = $this->parseExpression($expression); - } - $expression->children[] = $this->eat1(TokenKind::CloseBraceToken); - break; - case $startQuoteKind = $expression->startQuote->kind: - case TokenKind::EndOfFileToken: - case TokenKind::HeredocEnd: - $expression->endQuote = $this->eat($startQuoteKind, TokenKind::HeredocEnd); - return $expression; - case TokenKind::VariableName: - $expression->children[] = $this->parseTemplateStringExpression($expression); - break; - default: - $expression->children[] = $this->getCurrentToken(); - $this->advanceToken(); - break; - } - } - } - - /** - * This is used to parse the contents of `"${...}"` expressions. - * - * Supported: x, x[0], x[$y] - * Not supported: $x->p1, x[0][1], etc. - * @see parseTemplateStringExpression - * - * Precondition: getCurrentToken()->kind === TokenKind::StringVarname - */ - private function parseComplexDollarTemplateStringExpression($parentNode) { - $var = $this->parseSimpleVariable($parentNode); - $token = $this->getCurrentToken(); - if ($token->kind === TokenKind::OpenBracketToken) { - return $this->parseTemplateStringSubscriptExpression($var); - } - return $var; - } - - /** - * Double-quoted and heredoc strings support a basic set of expression types, described in http://php.net/manual/en/language.types.string.php#language.types.string.parsing - * Supported: $x, $x->p, $x[0], $x[$y] - * Not supported: $x->p1->p2, $x[0][1], etc. - * Since there is a relatively small finite set of allowed forms, I implement it here rather than trying to reuse the general expression parsing code. - */ - private function parseTemplateStringExpression($parentNode) { - $token = $this->getCurrentToken(); - if ($token->kind === TokenKind::VariableName) { - $var = $this->parseSimpleVariable($parentNode); - $token = $this->getCurrentToken(); - if ($token->kind === TokenKind::OpenBracketToken) { - return $this->parseTemplateStringSubscriptExpression($var); - } else if ($token->kind === TokenKind::ArrowToken) { - return $this->parseTemplateStringMemberAccessExpression($var); - } else { - return $var; - } - } - - return null; - } - - private function parseTemplateStringSubscriptExpression($postfixExpression) : SubscriptExpression { - $subscriptExpression = new SubscriptExpression(); - $subscriptExpression->parent = $postfixExpression->parent; - $postfixExpression->parent = $subscriptExpression; - - $subscriptExpression->postfixExpression = $postfixExpression; - $subscriptExpression->openBracketOrBrace = $this->eat1(TokenKind::OpenBracketToken); // Only [] syntax is supported, not {} - $token = $this->getCurrentToken(); - if ($token->kind === TokenKind::VariableName) { - $subscriptExpression->accessExpression = $this->parseSimpleVariable($subscriptExpression); - } elseif ($token->kind === TokenKind::IntegerLiteralToken) { - $subscriptExpression->accessExpression = $this->parseNumericLiteralExpression($subscriptExpression); - } elseif ($token->kind === TokenKind::StringLiteralToken) { - // TODO: investigate if this should add other uncommon types of tokens for strings/numbers mentioned in parsePrimaryExpression() - $subscriptExpression->accessExpression = $this->parseStringLiteralExpression($subscriptExpression); - } elseif ($token->kind === TokenKind::Name) { - $subscriptExpression->accessExpression = $this->parseTemplateStringSubscriptStringLiteral($subscriptExpression); - } else { - $subscriptExpression->accessExpression = new MissingToken(TokenKind::Expression, $token->fullStart); - } - - $subscriptExpression->closeBracketOrBrace = $this->eat1(TokenKind::CloseBracketToken); - - return $subscriptExpression; - } - - private function parseTemplateStringSubscriptStringLiteral($parentNode) : StringLiteral { - $expression = new StringLiteral(); - $expression->parent = $parentNode; - $expression->children = $this->eat1(TokenKind::Name); - return $expression; - } - - private function parseTemplateStringMemberAccessExpression($expression) : MemberAccessExpression { - $memberAccessExpression = new MemberAccessExpression(); - $memberAccessExpression->parent = $expression->parent; - $expression->parent = $memberAccessExpression; - - $memberAccessExpression->dereferencableExpression = $expression; - $memberAccessExpression->arrowToken = $this->eat1(TokenKind::ArrowToken); - $memberAccessExpression->memberName = $this->eat1(TokenKind::Name); - - return $memberAccessExpression; - } - - private function parseNumericLiteralExpression($parentNode) { - $numericLiteral = new NumericLiteral(); - $numericLiteral->parent = $parentNode; - $numericLiteral->children = $this->getCurrentToken(); - $this->advanceToken(); - return $numericLiteral; - } - - private function parseReservedWordExpression($parentNode) { - $reservedWord = new ReservedWord(); - $reservedWord->parent = $parentNode; - $reservedWord->children = $this->getCurrentToken(); - $this->advanceToken(); - return $reservedWord; - } - - private function isModifier($token) { - switch ($token->kind) { - // class-modifier - case TokenKind::AbstractKeyword: - case TokenKind::FinalKeyword: - - // visibility-modifier - case TokenKind::PublicKeyword: - case TokenKind::ProtectedKeyword: - case TokenKind::PrivateKeyword: - - // static-modifier - case TokenKind::StaticKeyword: - - // var - case TokenKind::VarKeyword: - return true; - } - return false; - } - - private function parseModifiers() { - $modifiers = array(); - $token = $this->getCurrentToken(); - while ($this->isModifier($token)) { - $modifiers[] = $token; - $this->advanceToken(); - $token = $this->getCurrentToken(); - } - return $modifiers; - } - - private function isParameterStartFn() { - return function ($token) { - switch ($token->kind) { - case TokenKind::DotDotDotToken: - - // qualified-name - case TokenKind::Name: // http://php.net/manual/en/language.namespaces.rules.php - case TokenKind::BackslashToken: - case TokenKind::NamespaceKeyword: - - case TokenKind::AmpersandToken: - - case TokenKind::VariableName: - return true; - - // nullable-type - case TokenKind::QuestionToken: - return true; - } - - // scalar-type - return \in_array($token->kind, $this->parameterTypeDeclarationTokens); - }; - } - - /** - * @param string $className (name of subclass of DelimitedList) - * @param int $delimiter - * @param callable $isElementStartFn - * @param callable $parseElementFn - * @param Node $parentNode - * @param bool $allowEmptyElements - * @return DelimitedList|null instance of $className - */ - private function parseDelimitedList($className, $delimiter, $isElementStartFn, $parseElementFn, $parentNode, $allowEmptyElements = false) { - // TODO consider allowing empty delimiter to be more tolerant - $node = new $className(); - $token = $this->getCurrentToken(); - do { - if ($isElementStartFn($token)) { - $node->addElement($parseElementFn($node)); - } elseif (!$allowEmptyElements || ($allowEmptyElements && !$this->checkToken($delimiter))) { - break; - } - - $delimeterToken = $this->eatOptional($delimiter); - if ($delimeterToken !== null) { - $node->addElement($delimeterToken); - } - $token = $this->getCurrentToken(); - // TODO ERROR CASE - no delimiter, but a param follows - } while ($delimeterToken !== null); - - - $node->parent = $parentNode; - if ($node->children === null) { - return null; - } - return $node; - } - - private function isQualifiedNameStart($token) { - return ($this->isQualifiedNameStartFn())($token); - } - - private function isQualifiedNameStartFn() { - return function ($token) { - switch ($token->kind) { - case TokenKind::BackslashToken: - case TokenKind::NamespaceKeyword: - case TokenKind::Name: - return true; - } - return false; - }; - } - - private function isQualifiedNameStartForCatchFn() { - return function ($token) { - switch ($token->kind) { - case TokenKind::BackslashToken: - case TokenKind::NamespaceKeyword: - case TokenKind::Name: - return true; - } - // Unfortunately, catch(int $x) is *syntactically valid* php which `php --syntax-check` would accept. - // (tolerant-php-parser is concerned with syntax, not semantics) - return in_array($token->kind, $this->reservedWordTokens, true); - }; - } - - private function parseQualifiedName($parentNode) { - return ($this->parseQualifiedNameFn())($parentNode); - } - - private function parseQualifiedNameFn() { - return function ($parentNode) { - $node = new QualifiedName(); - $node->parent = $parentNode; - $node->relativeSpecifier = $this->parseRelativeSpecifier($node); - if (!isset($node->relativeSpecifier)) { - $node->globalSpecifier = $this->eatOptional1(TokenKind::BackslashToken); - } - - $nameParts = - $this->parseDelimitedList( - DelimitedList\QualifiedNameParts::class, - TokenKind::BackslashToken, - function ($token) { - // a\static() <- VALID - // a\static\b <- INVALID - // a\function <- INVALID - // a\true\b <-VALID - // a\b\true <-VALID - // a\static::b <-VALID - // TODO more tests - return $this->lookahead(TokenKind::BackslashToken) - ? in_array($token->kind, $this->nameOrReservedWordTokens) - : in_array($token->kind, $this->nameOrStaticOrReservedWordTokens); - }, - function ($parentNode) { - $name = $this->lookahead(TokenKind::BackslashToken) - ? $this->eat($this->nameOrReservedWordTokens) - : $this->eat($this->nameOrStaticOrReservedWordTokens); // TODO support keyword name - $name->kind = TokenKind::Name; // bool/true/null/static should not be treated as keywords in this case - return $name; - }, $node); - if ($nameParts === null && $node->globalSpecifier === null && $node->relativeSpecifier === null) { - return null; - } - - $node->nameParts = $nameParts ? $nameParts->children : []; - - return $node; - }; - } - - private function parseRelativeSpecifier($parentNode) { - $node = new RelativeSpecifier(); - $node->parent = $parentNode; - $node->namespaceKeyword = $this->eatOptional1(TokenKind::NamespaceKeyword); - if ($node->namespaceKeyword !== null) { - $node->backslash = $this->eat1(TokenKind::BackslashToken); - } - if (isset($node->backslash)) { - return $node; - } - return null; - } - - /** - * @param MethodDeclaration|FunctionDeclaration|AnonymousFunctionCreationExpression $functionDeclaration - */ - private function parseFunctionType(Node $functionDeclaration, $canBeAbstract = false, $isAnonymous = false) { - - $functionDeclaration->functionKeyword = $this->eat1(TokenKind::FunctionKeyword); - $functionDeclaration->byRefToken = $this->eatOptional1(TokenKind::AmpersandToken); - $functionDeclaration->name = $isAnonymous - ? $this->eatOptional($this->nameOrKeywordOrReservedWordTokens) - : $this->eat($this->nameOrKeywordOrReservedWordTokens); - - if (isset($functionDeclaration->name)) { - $functionDeclaration->name->kind = TokenKind::Name; - } - - if ($isAnonymous && isset($functionDeclaration->name)) { - // Anonymous functions should not have names - $functionDeclaration->name = new SkippedToken($functionDeclaration->name); // TODO instead handle this during post-walk - } - - $functionDeclaration->openParen = $this->eat1(TokenKind::OpenParenToken); - $functionDeclaration->parameters = $this->parseDelimitedList( - DelimitedList\ParameterDeclarationList::class, - TokenKind::CommaToken, - $this->isParameterStartFn(), - $this->parseParameterFn(), - $functionDeclaration); - $functionDeclaration->closeParen = $this->eat1(TokenKind::CloseParenToken); - if ($isAnonymous) { - $functionDeclaration->anonymousFunctionUseClause = $this->parseAnonymousFunctionUseClause($functionDeclaration); - } - - if ($this->checkToken(TokenKind::ColonToken)) { - $functionDeclaration->colonToken = $this->eat1(TokenKind::ColonToken); - $functionDeclaration->questionToken = $this->eatOptional1(TokenKind::QuestionToken); - $functionDeclaration->returnType = $this->parseReturnTypeDeclaration($functionDeclaration); - } - - if ($canBeAbstract) { - $functionDeclaration->compoundStatementOrSemicolon = $this->eatOptional1(TokenKind::SemicolonToken); - } - - if (!isset($functionDeclaration->compoundStatementOrSemicolon)) { - $functionDeclaration->compoundStatementOrSemicolon = $this->parseCompoundStatement($functionDeclaration); - } - } - - private function parseNamedLabelStatement($parentNode) { - $namedLabelStatement = new NamedLabelStatement(); - $namedLabelStatement->parent = $parentNode; - $namedLabelStatement->name = $this->eat1(TokenKind::Name); - $namedLabelStatement->colon = $this->eat1(TokenKind::ColonToken); - $namedLabelStatement->statement = $this->parseStatement($namedLabelStatement); - return $namedLabelStatement; - } - - private function lookahead(...$expectedKinds) : bool { - $startPos = $this->lexer->getCurrentPosition(); - $startToken = $this->token; - $succeeded = true; - foreach ($expectedKinds as $kind) { - $token = $this->lexer->scanNextToken(); - $currentPosition = $this->lexer->getCurrentPosition(); - $endOfFilePosition = $this->lexer->getEndOfFilePosition(); - if (\is_array($kind)) { - $succeeded = false; - foreach ($kind as $kindOption) { - if ($currentPosition <= $endOfFilePosition && $token->kind === $kindOption) { - $succeeded = true; - break; - } - } - } else { - if ($currentPosition > $endOfFilePosition || $token->kind !== $kind) { - $succeeded = false; - break; - } - } - } - $this->lexer->setCurrentPosition($startPos); - $this->token = $startToken; - return $succeeded; - } - - private function checkToken($expectedKind) : bool { - return $this->getCurrentToken()->kind === $expectedKind; - } - - private function parseIfStatement($parentNode) { - $ifStatement = new IfStatementNode(); - $ifStatement->parent = $parentNode; - $ifStatement->ifKeyword = $this->eat1(TokenKind::IfKeyword); - $ifStatement->openParen = $this->eat1(TokenKind::OpenParenToken); - $ifStatement->expression = $this->parseExpression($ifStatement); - $ifStatement->closeParen = $this->eat1(TokenKind::CloseParenToken); - $curTokenKind = $this->getCurrentToken()->kind; - if ($curTokenKind === TokenKind::ColonToken) { - $ifStatement->colon = $this->eat1(TokenKind::ColonToken); - $ifStatement->statements = $this->parseList($ifStatement, ParseContext::IfClause2Elements); - } else if ($curTokenKind !== TokenKind::ScriptSectionEndTag) { - // Fix #246 : properly parse `if (false) ?\>echoed text\<?php` - $ifStatement->statements = $this->parseStatement($ifStatement); - } - $ifStatement->elseIfClauses = []; // TODO - should be some standard for empty arrays vs. null? - while ($this->checkToken(TokenKind::ElseIfKeyword)) { - $ifStatement->elseIfClauses[] = $this->parseElseIfClause($ifStatement); - } - - if ($this->checkToken(TokenKind::ElseKeyword)) { - $ifStatement->elseClause = $this->parseElseClause($ifStatement); - } - - $ifStatement->endifKeyword = $this->eatOptional1(TokenKind::EndIfKeyword); - if ($ifStatement->endifKeyword) { - $ifStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - } - - return $ifStatement; - } - - private function parseElseIfClause($parentNode) { - $elseIfClause = new ElseIfClauseNode(); - $elseIfClause->parent = $parentNode; - $elseIfClause->elseIfKeyword = $this->eat1(TokenKind::ElseIfKeyword); - $elseIfClause->openParen = $this->eat1(TokenKind::OpenParenToken); - $elseIfClause->expression = $this->parseExpression($elseIfClause); - $elseIfClause->closeParen = $this->eat1(TokenKind::CloseParenToken); - $curTokenKind = $this->getCurrentToken()->kind; - if ($curTokenKind === TokenKind::ColonToken) { - $elseIfClause->colon = $this->eat1(TokenKind::ColonToken); - $elseIfClause->statements = $this->parseList($elseIfClause, ParseContext::IfClause2Elements); - } elseif ($curTokenKind !== TokenKind::ScriptSectionEndTag) { - $elseIfClause->statements = $this->parseStatement($elseIfClause); - } - return $elseIfClause; - } - - private function parseElseClause($parentNode) { - $elseClause = new ElseClauseNode(); - $elseClause->parent = $parentNode; - $elseClause->elseKeyword = $this->eat1(TokenKind::ElseKeyword); - $curTokenKind = $this->getCurrentToken()->kind; - if ($curTokenKind === TokenKind::ColonToken) { - $elseClause->colon = $this->eat1(TokenKind::ColonToken); - $elseClause->statements = $this->parseList($elseClause, ParseContext::IfClause2Elements); - } elseif ($curTokenKind !== TokenKind::ScriptSectionEndTag) { - $elseClause->statements = $this->parseStatement($elseClause); - } - return $elseClause; - } - - private function parseSwitchStatement($parentNode) { - $switchStatement = new SwitchStatementNode(); - $switchStatement->parent = $parentNode; - $switchStatement->switchKeyword = $this->eat1(TokenKind::SwitchKeyword); - $switchStatement->openParen = $this->eat1(TokenKind::OpenParenToken); - $switchStatement->expression = $this->parseExpression($switchStatement); - $switchStatement->closeParen = $this->eat1(TokenKind::CloseParenToken); - $switchStatement->openBrace = $this->eatOptional1(TokenKind::OpenBraceToken); - $switchStatement->colon = $this->eatOptional1(TokenKind::ColonToken); - $switchStatement->caseStatements = $this->parseList($switchStatement, ParseContext::SwitchStatementElements); - if ($switchStatement->colon !== null) { - $switchStatement->endswitch = $this->eat1(TokenKind::EndSwitchKeyword); - $switchStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - } else { - $switchStatement->closeBrace = $this->eat1(TokenKind::CloseBraceToken); - } - - return $switchStatement; - } - - private function parseCaseOrDefaultStatement() { - return function ($parentNode) { - $caseStatement = new CaseStatementNode(); - $caseStatement->parent = $parentNode; - // TODO add error checking - $caseStatement->caseKeyword = $this->eat(TokenKind::CaseKeyword, TokenKind::DefaultKeyword); - if ($caseStatement->caseKeyword->kind === TokenKind::CaseKeyword) { - $caseStatement->expression = $this->parseExpression($caseStatement); - } - $caseStatement->defaultLabelTerminator = $this->eat(TokenKind::ColonToken, TokenKind::SemicolonToken); - $caseStatement->statementList = $this->parseList($caseStatement, ParseContext::CaseStatementElements); - return $caseStatement; - }; - } - - private function parseWhileStatement($parentNode) { - $whileStatement = new WhileStatement(); - $whileStatement->parent = $parentNode; - $whileStatement->whileToken = $this->eat1(TokenKind::WhileKeyword); - $whileStatement->openParen = $this->eat1(TokenKind::OpenParenToken); - $whileStatement->expression = $this->parseExpression($whileStatement); - $whileStatement->closeParen = $this->eat1(TokenKind::CloseParenToken); - $whileStatement->colon = $this->eatOptional1(TokenKind::ColonToken); - if ($whileStatement->colon !== null) { - $whileStatement->statements = $this->parseList($whileStatement, ParseContext::WhileStatementElements); - $whileStatement->endWhile = $this->eat1(TokenKind::EndWhileKeyword); - $whileStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - } elseif (!$this->checkToken(TokenKind::ScriptSectionEndTag)) { - $whileStatement->statements = $this->parseStatement($whileStatement); - } - return $whileStatement; - } - - /** - * @param Node $parentNode - * @param bool $force - * @return Node|MissingToken|array - The expression, or a missing token, or (if $force) an array containing a missed and skipped token - */ - private function parseExpression($parentNode, $force = false) { - $token = $this->getCurrentToken(); - if ($token->kind === TokenKind::EndOfFileToken) { - return new MissingToken(TokenKind::Expression, $token->fullStart); - } - - $expression = ($this->parseExpressionFn())($parentNode); - if ($force && $expression instanceof MissingToken) { - $expression = [$expression, new SkippedToken($token)]; - $this->advanceToken(); - } - - return $expression; - } - - private function parseExpressionFn() { - return function ($parentNode) { - return $this->parseBinaryExpressionOrHigher(0, $parentNode); - }; - } - - /** - * @param Node $parentNode - * @return Expression - */ - private function parseUnaryExpressionOrHigher($parentNode) { - $token = $this->getCurrentToken(); - switch ($token->kind) { - // unary-op-expression - case TokenKind::PlusToken: - case TokenKind::MinusToken: - case TokenKind::ExclamationToken: - case TokenKind::TildeToken: - return $this->parseUnaryOpExpression($parentNode); - - // error-control-expression - case TokenKind::AtSymbolToken: - return $this->parseErrorControlExpression($parentNode); - - // prefix-increment-expression - case TokenKind::PlusPlusToken: - // prefix-decrement-expression - case TokenKind::MinusMinusToken: - return $this->parsePrefixUpdateExpression($parentNode); - - case TokenKind::ArrayCastToken: - case TokenKind::BoolCastToken: - case TokenKind::DoubleCastToken: - case TokenKind::IntCastToken: - case TokenKind::ObjectCastToken: - case TokenKind::StringCastToken: - case TokenKind::UnsetCastToken: - return $this->parseCastExpression($parentNode); - - case TokenKind::OpenParenToken: - // TODO remove duplication - if ($this->lookahead( - [TokenKind::ArrayKeyword, - TokenKind::BinaryReservedWord, - TokenKind::BoolReservedWord, - TokenKind::BooleanReservedWord, - TokenKind::DoubleReservedWord, - TokenKind::IntReservedWord, - TokenKind::IntegerReservedWord, - TokenKind::FloatReservedWord, - TokenKind::ObjectReservedWord, - TokenKind::RealReservedWord, - TokenKind::StringReservedWord, - TokenKind::UnsetKeyword], TokenKind::CloseParenToken)) { - return $this->parseCastExpressionGranular($parentNode); - } - break; - -/* - - case TokenKind::BacktickToken: - return $this->parseShellCommandExpression($parentNode); - - case TokenKind::OpenParenToken: - // TODO -// return $this->parseCastExpressionGranular($parentNode); - break;*/ - - // object-creation-expression (postfix-expression) - case TokenKind::NewKeyword: - return $this->parseObjectCreationExpression($parentNode); - - // clone-expression (postfix-expression) - case TokenKind::CloneKeyword: - return $this->parseCloneExpression($parentNode); - - case TokenKind::YieldKeyword: - case TokenKind::YieldFromKeyword: - return $this->parseYieldExpression($parentNode); - - // include-expression - // include-once-expression - // require-expression - // require-once-expression - case TokenKind::IncludeKeyword: - case TokenKind::IncludeOnceKeyword: - case TokenKind::RequireKeyword: - case TokenKind::RequireOnceKeyword: - return $this->parseScriptInclusionExpression($parentNode); - } - - $expression = $this->parsePrimaryExpression($parentNode); - return $this->parsePostfixExpressionRest($expression); - } - - /** - * @param int $precedence - * @param Node $parentNode - * @return Expression - */ - private function parseBinaryExpressionOrHigher($precedence, $parentNode) { - $leftOperand = $this->parseUnaryExpressionOrHigher($parentNode); - - list($prevNewPrecedence, $prevAssociativity) = self::UNKNOWN_PRECEDENCE_AND_ASSOCIATIVITY; - - while (true) { - $token = $this->getCurrentToken(); - - list($newPrecedence, $associativity) = $this->getBinaryOperatorPrecedenceAndAssociativity($token); - - // Expressions using operators w/o associativity (equality, relational, instanceof) - // cannot reference identical expression types within one of their operands. - // - // Example: - // $a < $b < $c // CASE 1: INVALID - // $a < $b === $c < $d // CASE 2: VALID - // - // In CASE 1, it is expected that we stop parsing the expression after the $b token. - if ($prevAssociativity === Associativity::None && $prevNewPrecedence === $newPrecedence) { - break; - } - - // Precedence and associativity properties determine whether we recurse, and continue - // building up the current operand, or whether we pop out. - // - // Example: - // $a + $b + $c // CASE 1: additive-expression (left-associative) - // $a = $b = $c // CASE 2: equality-expression (right-associative) - // - // CASE 1: - // The additive-expression is left-associative, which means we expect the grouping to be: - // ($a + $b) + $c - // - // Because both + operators have the same precedence, and the + operator is left associative, - // we expect the second + operator NOT to be consumed because $newPrecedence > $precedence => FALSE - // - // CASE 2: - // The equality-expression is right-associative, which means we expect the grouping to be: - // $a = ($b = $c) - // - // Because both = operators have the same precedence, and the = operator is right-associative, - // we expect the second = operator to be consumed because $newPrecedence >= $precedence => TRUE - $shouldConsumeCurrentOperator = - $associativity === Associativity::Right ? - $newPrecedence >= $precedence: - $newPrecedence > $precedence; - - if (!$shouldConsumeCurrentOperator) { - break; - } - - // Unlike every other binary expression, exponentiation operators take precedence over unary operators. - // - // Example: - // -3**2 => -9 - // - // In these cases, we strip the UnaryExpression operator, and reassign $leftOperand to - // $unaryExpression->operand. - // - // After we finish building the BinaryExpression, we rebuild the UnaryExpression so that it includes - // the original operator, and the newly constructed exponentiation-expression as the operand. - $shouldOperatorTakePrecedenceOverUnary = false; - switch ($token->kind) { - case TokenKind::AsteriskAsteriskToken: - $shouldOperatorTakePrecedenceOverUnary = $leftOperand instanceof UnaryExpression; - break; - case TokenKind::EqualsToken: - case TokenKind::AsteriskAsteriskEqualsToken: - case TokenKind::AsteriskEqualsToken: - case TokenKind::SlashEqualsToken: - case TokenKind::PercentEqualsToken: - case TokenKind::PlusEqualsToken: - case TokenKind::MinusEqualsToken: - case TokenKind::DotEqualsToken: - case TokenKind::LessThanLessThanEqualsToken: - case TokenKind::GreaterThanGreaterThanEqualsToken: - case TokenKind::AmpersandEqualsToken: - case TokenKind::CaretEqualsToken: - case TokenKind::BarEqualsToken: - case TokenKind::QuestionQuestionEqualsToken: - // Workarounds for https://github.com/Microsoft/tolerant-php-parser/issues/19#issue-201714377 - // Parse `!$a = $b` as `!($a = $b)` - PHP constrains the Left Hand Side of an assignment to a variable. A unary operator (`@`, `!`, etc.) is not a variable. - // Instanceof has similar constraints for the LHS. - // So does `!$a += $b` - // TODO: Any other operators? - if ($leftOperand instanceof UnaryOpExpression) { - $shouldOperatorTakePrecedenceOverUnary = true; - } - break; - case TokenKind::InstanceOfKeyword: - // Unlike assignment, the instanceof operator doesn't have restrictions on what can go in the left hand side. - // `!` is the only unary operator with lower precedence than instanceof. - if ($leftOperand instanceof UnaryOpExpression) { - if ($leftOperand->operator->kind === TokenKind::ExclamationToken) { - $shouldOperatorTakePrecedenceOverUnary = true; - } - } - break; - } - - if ($shouldOperatorTakePrecedenceOverUnary) { - $unaryExpression = $leftOperand; - $leftOperand = $unaryExpression->operand; - } - - $this->advanceToken(); - - if ($token->kind === TokenKind::EqualsToken) { - $byRefToken = $this->eatOptional1(TokenKind::AmpersandToken); - } - - $leftOperand = $token->kind === TokenKind::QuestionToken ? - $this->parseTernaryExpression($leftOperand, $token, $parentNode) : - $this->makeBinaryExpression( - $leftOperand, - $token, - $byRefToken ?? null, - $this->parseBinaryExpressionOrHigher($newPrecedence, null), - $parentNode); - - // Rebuild the unary expression if we deconstructed it earlier. - if ($shouldOperatorTakePrecedenceOverUnary) { - $leftOperand->parent = $unaryExpression; - $unaryExpression->operand = $leftOperand; - $leftOperand = $unaryExpression; - } - - // Hold onto these values, so we know whether we've hit duplicate non-associative operators, - // and need to terminate early. - $prevNewPrecedence = $newPrecedence; - $prevAssociativity = $associativity; - } - return $leftOperand; - } - - const OPERATOR_PRECEDENCE_AND_ASSOCIATIVITY = - [ - // logical-inc-OR-expression-2 (L) - TokenKind::OrKeyword => [6, Associativity::Left], - - // logical-exc-OR-expression-2 (L) - TokenKind::XorKeyword=> [7, Associativity::Left], - - // logical-AND-expression-2 (L) - TokenKind::AndKeyword=> [8, Associativity::Left], - - // simple-assignment-expression (R) - // TODO byref-assignment-expression - TokenKind::EqualsToken => [9, Associativity::Right], - - // compound-assignment-expression (R) - TokenKind::AsteriskAsteriskEqualsToken => [9, Associativity::Right], - TokenKind::AsteriskEqualsToken => [9, Associativity::Right], - TokenKind::SlashEqualsToken => [9, Associativity::Right], - TokenKind::PercentEqualsToken => [9, Associativity::Right], - TokenKind::PlusEqualsToken => [9, Associativity::Right], - TokenKind::MinusEqualsToken => [9, Associativity::Right], - TokenKind::DotEqualsToken => [9, Associativity::Right], - TokenKind::LessThanLessThanEqualsToken => [9, Associativity::Right], - TokenKind::GreaterThanGreaterThanEqualsToken => [9, Associativity::Right], - TokenKind::AmpersandEqualsToken => [9, Associativity::Right], - TokenKind::CaretEqualsToken => [9, Associativity::Right], - TokenKind::BarEqualsToken => [9, Associativity::Right], - TokenKind::QuestionQuestionEqualsToken => [9, Associativity::Right], - - // TODO conditional-expression (L) - TokenKind::QuestionToken => [10, Associativity::Left], -// TokenKind::ColonToken => [9, Associativity::Left], - - // TODO coalesce-expression (R) - TokenKind::QuestionQuestionToken => [9, Associativity::Right], - - //logical-inc-OR-expression-1 (L) - TokenKind::BarBarToken => [12, Associativity::Left], - - // logical-AND-expression-1 (L) - TokenKind::AmpersandAmpersandToken => [13, Associativity::Left], - - // bitwise-inc-OR-expression (L) - TokenKind::BarToken => [14, Associativity::Left], - - // bitwise-exc-OR-expression (L) - TokenKind::CaretToken => [15, Associativity::Left], - - // bitwise-AND-expression (L) - TokenKind::AmpersandToken => [16, Associativity::Left], - - // equality-expression (X) - TokenKind::EqualsEqualsToken => [17, Associativity::None], - TokenKind::ExclamationEqualsToken => [17, Associativity::None], - TokenKind::LessThanGreaterThanToken => [17, Associativity::None], - TokenKind::EqualsEqualsEqualsToken => [17, Associativity::None], - TokenKind::ExclamationEqualsEqualsToken => [17, Associativity::None], - TokenKind::LessThanEqualsGreaterThanToken => [17, Associativity::None], - - // relational-expression (X) - TokenKind::LessThanToken => [18, Associativity::None], - TokenKind::GreaterThanToken => [18, Associativity::None], - TokenKind::LessThanEqualsToken => [18, Associativity::None], - TokenKind::GreaterThanEqualsToken => [18, Associativity::None], - - // shift-expression (L) - TokenKind::LessThanLessThanToken => [19, Associativity::Left], - TokenKind::GreaterThanGreaterThanToken => [19, Associativity::Left], - - // additive-expression (L) - TokenKind::PlusToken => [20, Associativity::Left], - TokenKind::MinusToken => [20, Associativity::Left], - TokenKind::DotToken =>[20, Associativity::Left], - - // multiplicative-expression (L) - TokenKind::AsteriskToken => [21, Associativity::Left], - TokenKind::SlashToken => [21, Associativity::Left], - TokenKind::PercentToken => [21, Associativity::Left], - - // instanceof-expression (X) - TokenKind::InstanceOfKeyword => [22, Associativity::None], - - // exponentiation-expression (R) - TokenKind::AsteriskAsteriskToken => [23, Associativity::Right] - ]; - - const UNKNOWN_PRECEDENCE_AND_ASSOCIATIVITY = [-1, -1]; - - private function getBinaryOperatorPrecedenceAndAssociativity($token) { - if (isset(self::OPERATOR_PRECEDENCE_AND_ASSOCIATIVITY[$token->kind])) { - return self::OPERATOR_PRECEDENCE_AND_ASSOCIATIVITY[$token->kind]; - } - - return self::UNKNOWN_PRECEDENCE_AND_ASSOCIATIVITY; - } - - /** - * @internal Do not use outside this class, this may be changed or removed. - */ - const KNOWN_ASSIGNMENT_TOKEN_SET = [ - TokenKind::AsteriskAsteriskEqualsToken => true, - TokenKind::AsteriskEqualsToken => true, - TokenKind::SlashEqualsToken => true, - TokenKind::PercentEqualsToken => true, - TokenKind::PlusEqualsToken => true, - TokenKind::MinusEqualsToken => true, - TokenKind::DotEqualsToken => true, - TokenKind::LessThanLessThanEqualsToken => true, - TokenKind::GreaterThanGreaterThanEqualsToken => true, - TokenKind::AmpersandEqualsToken => true, - TokenKind::CaretEqualsToken => true, - TokenKind::BarEqualsToken => true, - TokenKind::QuestionQuestionEqualsToken => true, - // InstanceOf has other remaining issues, but this heuristic is an improvement for many common cases such as `$x && $y = $z` - ]; - - private function makeBinaryExpression($leftOperand, $operatorToken, $byRefToken, $rightOperand, $parentNode) { - $assignmentExpression = $operatorToken->kind === TokenKind::EqualsToken; - if ($assignmentExpression || \array_key_exists($operatorToken->kind, self::KNOWN_ASSIGNMENT_TOKEN_SET)) { - if ($leftOperand instanceof BinaryExpression) { - if (!\array_key_exists($leftOperand->operator->kind, self::KNOWN_ASSIGNMENT_TOKEN_SET)) { - // Handle cases without parenthesis, such as $x ** $y === $z, as $x ** ($y === $z) - return $this->shiftBinaryOperands($leftOperand, $operatorToken, $byRefToken, $rightOperand, $parentNode); - } - } elseif ($leftOperand instanceof UnaryOpExpression || $leftOperand instanceof ErrorControlExpression) { - return $this->shiftUnaryOperands($leftOperand, $operatorToken, $byRefToken, $rightOperand, $parentNode); - } - } - $binaryExpression = $assignmentExpression ? new AssignmentExpression() : new BinaryExpression(); - $binaryExpression->parent = $parentNode; - $leftOperand->parent = $binaryExpression; - $rightOperand->parent = $binaryExpression; - $binaryExpression->leftOperand = $leftOperand; - $binaryExpression->operator = $operatorToken; - if ($binaryExpression instanceof AssignmentExpression && isset($byRefToken)) { - $binaryExpression->byRef = $byRefToken; - } - $binaryExpression->rightOperand = $rightOperand; - return $binaryExpression; - } - - /** - * @param ErrorControlExpression|UnaryOpExpression $leftOperand - */ - private function shiftUnaryOperands(UnaryExpression $leftOperand, $operatorToken, $byRefToken, $rightOperand, $parentNode) { - $outerUnaryOpExpression = clone($leftOperand); - $inner = $this->makeBinaryExpression( - $leftOperand->operand, - $operatorToken, - $byRefToken, - $rightOperand, - $outerUnaryOpExpression - ); - // Either ErrorControlExpression or a UnaryOpExpression - $outerUnaryOpExpression->parent = $parentNode; - // TODO should this binaryExpression be wrapped in a UnaryExpression? - $outerUnaryOpExpression->operand = $inner; - - return $outerUnaryOpExpression; - } - - private function shiftBinaryOperands(BinaryExpression $leftOperand, $operatorToken, $byRefToken, $rightOperand, $parentNode) { - $inner = $this->makeBinaryExpression( - $leftOperand->rightOperand, - $operatorToken, - $byRefToken, - $rightOperand, - $parentNode - ); - $outer = $this->makeBinaryExpression( - $leftOperand->leftOperand, - $leftOperand->operator, - null, - $inner, - $parentNode - ); - $inner->parent = $outer; - return $outer; - } - - private function parseDoStatement($parentNode) { - $doStatement = new DoStatement(); - $doStatement->parent = $parentNode; - $doStatement->do = $this->eat1(TokenKind::DoKeyword); - $doStatement->statement = $this->parseStatement($doStatement); - $doStatement->whileToken = $this->eat1(TokenKind::WhileKeyword); - $doStatement->openParen = $this->eat1(TokenKind::OpenParenToken); - $doStatement->expression = $this->parseExpression($doStatement); - $doStatement->closeParen = $this->eat1(TokenKind::CloseParenToken); - $doStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - return $doStatement; - } - - private function parseForStatement($parentNode) { - $forStatement = new ForStatement(); - $forStatement->parent = $parentNode; - $forStatement->for = $this->eat1(TokenKind::ForKeyword); - $forStatement->openParen = $this->eat1(TokenKind::OpenParenToken); - $forStatement->forInitializer = $this->parseExpressionList($forStatement); // TODO spec is redundant - $forStatement->exprGroupSemicolon1 = $this->eat1(TokenKind::SemicolonToken); - $forStatement->forControl = $this->parseExpressionList($forStatement); - $forStatement->exprGroupSemicolon2 = $this->eat1(TokenKind::SemicolonToken); - $forStatement->forEndOfLoop = $this->parseExpressionList($forStatement); - $forStatement->closeParen = $this->eat1(TokenKind::CloseParenToken); - $forStatement->colon = $this->eatOptional1(TokenKind::ColonToken); - if ($forStatement->colon !== null) { - $forStatement->statements = $this->parseList($forStatement, ParseContext::ForStatementElements); - $forStatement->endFor = $this->eat1(TokenKind::EndForKeyword); - $forStatement->endForSemicolon = $this->eatSemicolonOrAbortStatement(); - } elseif (!$this->checkToken(TokenKind::ScriptSectionEndTag)) { - $forStatement->statements = $this->parseStatement($forStatement); - } - return $forStatement; - } - - private function parseForeachStatement($parentNode) { - $foreachStatement = new ForeachStatement(); - $foreachStatement->parent = $parentNode; - $foreachStatement->foreach = $this->eat1(TokenKind::ForeachKeyword); - $foreachStatement->openParen = $this->eat1(TokenKind::OpenParenToken); - $foreachStatement->forEachCollectionName = $this->parseExpression($foreachStatement); - $foreachStatement->asKeyword = $this->eat1(TokenKind::AsKeyword); - $foreachStatement->foreachKey = $this->tryParseForeachKey($foreachStatement); - $foreachStatement->foreachValue = $this->parseForeachValue($foreachStatement); - $foreachStatement->closeParen = $this->eat1(TokenKind::CloseParenToken); - $foreachStatement->colon = $this->eatOptional1(TokenKind::ColonToken); - if ($foreachStatement->colon !== null) { - $foreachStatement->statements = $this->parseList($foreachStatement, ParseContext::ForeachStatementElements); - $foreachStatement->endForeach = $this->eat1(TokenKind::EndForEachKeyword); - $foreachStatement->endForeachSemicolon = $this->eatSemicolonOrAbortStatement(); - } elseif (!$this->checkToken(TokenKind::ScriptSectionEndTag)) { - $foreachStatement->statements = $this->parseStatement($foreachStatement); - } - return $foreachStatement; - } - - private function tryParseForeachKey($parentNode) { - if (!$this->isExpressionStart($this->getCurrentToken())) { - return null; - } - - $startPos = $this->lexer->getCurrentPosition(); - $startToken = $this->getCurrentToken(); - $foreachKey = new ForeachKey(); - $foreachKey->parent = $parentNode; - $foreachKey->expression = $this->parseExpression($foreachKey); - - if (!$this->checkToken(TokenKind::DoubleArrowToken)) { - $this->lexer->setCurrentPosition($startPos); - $this->token = $startToken; - return null; - } - - $foreachKey->arrow = $this->eat1(TokenKind::DoubleArrowToken); - return $foreachKey; - } - - private function parseForeachValue($parentNode) { - $foreachValue = new ForeachValue(); - $foreachValue->parent = $parentNode; - $foreachValue->ampersand = $this->eatOptional1(TokenKind::AmpersandToken); - $foreachValue->expression = $this->parseExpression($foreachValue); - return $foreachValue; - } - - private function parseGotoStatement($parentNode) { - $gotoStatement = new GotoStatement(); - $gotoStatement->parent = $parentNode; - $gotoStatement->goto = $this->eat1(TokenKind::GotoKeyword); - $gotoStatement->name = $this->eat1(TokenKind::Name); - $gotoStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - return $gotoStatement; - } - - private function parseBreakOrContinueStatement($parentNode) { - // TODO should be error checking if on top level - $continueStatement = new BreakOrContinueStatement(); - $continueStatement->parent = $parentNode; - $continueStatement->breakOrContinueKeyword = $this->eat(TokenKind::ContinueKeyword, TokenKind::BreakKeyword); - - if ($this->isExpressionStart($this->getCurrentToken())) { - $continueStatement->breakoutLevel = $this->parseExpression($continueStatement); - } - - $continueStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - - return $continueStatement; - } - - private function parseReturnStatement($parentNode) { - $returnStatement = new ReturnStatement(); - $returnStatement->parent = $parentNode; - $returnStatement->returnKeyword = $this->eat1(TokenKind::ReturnKeyword); - if ($this->isExpressionStart($this->getCurrentToken())) { - $returnStatement->expression = $this->parseExpression($returnStatement); - } - $returnStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - - return $returnStatement; - } - - private function parseThrowStatement($parentNode) { - $throwStatement = new ThrowStatement(); - $throwStatement->parent = $parentNode; - $throwStatement->throwKeyword = $this->eat1(TokenKind::ThrowKeyword); - // TODO error for failures to parse expressions when not optional - $throwStatement->expression = $this->parseExpression($throwStatement); - $throwStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - - return $throwStatement; - } - - private function parseTryStatement($parentNode) { - $tryStatement = new TryStatement(); - $tryStatement->parent = $parentNode; - $tryStatement->tryKeyword = $this->eat1(TokenKind::TryKeyword); - $tryStatement->compoundStatement = $this->parseCompoundStatement($tryStatement); // TODO verifiy this is only compound - - $tryStatement->catchClauses = array(); // TODO - should be some standard for empty arrays vs. null? - while ($this->checkToken(TokenKind::CatchKeyword)) { - $tryStatement->catchClauses[] = $this->parseCatchClause($tryStatement); - } - - if ($this->checkToken(TokenKind::FinallyKeyword)) { - $tryStatement->finallyClause = $this->parseFinallyClause($tryStatement); - } - - return $tryStatement; - } - - private function parseCatchClause($parentNode) { - $catchClause = new CatchClause(); - $catchClause->parent = $parentNode; - $catchClause->catch = $this->eat1(TokenKind::CatchKeyword); - $catchClause->openParen = $this->eat1(TokenKind::OpenParenToken); - $qualifiedNameList = $this->parseQualifiedNameCatchList($catchClause)->children ?? []; - $catchClause->qualifiedName = $qualifiedNameList[0] ?? null; // TODO generate missing token or error if null - $catchClause->otherQualifiedNameList = array_slice($qualifiedNameList, 1); // TODO: Generate error if the name list has missing tokens - $catchClause->variableName = $this->eat1(TokenKind::VariableName); - $catchClause->closeParen = $this->eat1(TokenKind::CloseParenToken); - $catchClause->compoundStatement = $this->parseCompoundStatement($catchClause); - - return $catchClause; - } - - private function parseFinallyClause($parentNode) { - $finallyClause = new FinallyClause(); - $finallyClause->parent = $parentNode; - $finallyClause->finallyToken = $this->eat1(TokenKind::FinallyKeyword); - $finallyClause->compoundStatement = $this->parseCompoundStatement($finallyClause); - - return $finallyClause; - } - - private function parseDeclareStatement($parentNode) { - $declareStatement = new DeclareStatement(); - $declareStatement->parent = $parentNode; - $declareStatement->declareKeyword = $this->eat1(TokenKind::DeclareKeyword); - $declareStatement->openParen = $this->eat1(TokenKind::OpenParenToken); - $declareStatement->declareDirective = $this->parseDeclareDirective($declareStatement); - $declareStatement->closeParen = $this->eat1(TokenKind::CloseParenToken); - - if ($this->checkToken(TokenKind::SemicolonToken)) { - $declareStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - } elseif ($this->checkToken(TokenKind::ColonToken)) { - $declareStatement->colon = $this->eat1(TokenKind::ColonToken); - $declareStatement->statements = $this->parseList($declareStatement, ParseContext::DeclareStatementElements); - $declareStatement->enddeclareKeyword = $this->eat1(TokenKind::EndDeclareKeyword); - $declareStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - } else { - $declareStatement->statements = $this->parseStatement($declareStatement); - } - - return $declareStatement; - } - - private function parseDeclareDirective($parentNode) { - $declareDirective = new DeclareDirective(); - $declareDirective->parent = $parentNode; - $declareDirective->name = $this->eat1(TokenKind::Name); - $declareDirective->equals = $this->eat1(TokenKind::EqualsToken); - $declareDirective->literal = - $this->eat( - TokenKind::FloatingLiteralToken, - TokenKind::IntegerLiteralToken, - TokenKind::DecimalLiteralToken, - TokenKind::OctalLiteralToken, - TokenKind::HexadecimalLiteralToken, - TokenKind::BinaryLiteralToken, - TokenKind::InvalidOctalLiteralToken, - TokenKind::InvalidHexadecimalLiteral, - TokenKind::InvalidBinaryLiteral, - TokenKind::StringLiteralToken - ); // TODO simplify - - return $declareDirective; - } - - private function parseSimpleVariable($parentNode) { - return ($this->parseSimpleVariableFn())($parentNode); - } - - private function parseSimpleVariableFn() { - return function ($parentNode) { - $token = $this->getCurrentToken(); - $variable = new Variable(); - $variable->parent = $parentNode; - - if ($token->kind === TokenKind::DollarToken) { - $variable->dollar = $this->eat1(TokenKind::DollarToken); - $token = $this->getCurrentToken(); - - switch ($token->kind) { - case TokenKind::OpenBraceToken: - $variable->name = $this->parseBracedExpression($variable); - break; - case TokenKind::VariableName: - case TokenKind::StringVarname: - case TokenKind::DollarToken: - $variable->name = $this->parseSimpleVariable($variable); - break; - default: - $variable->name = new MissingToken(TokenKind::VariableName, $token->fullStart); - break; - } - } elseif ($token->kind === TokenKind::VariableName || $token->kind === TokenKind::StringVarname) { - // TODO consider splitting into dollar and name. - // StringVarname is the variable name without $, used in a template string e.g. `"${foo}"` - $variable->name = $this->eat(TokenKind::VariableName, TokenKind::StringVarname); - } else { - $variable->name = new MissingToken(TokenKind::VariableName, $token->fullStart); - } - - return $variable; - }; - } - - private function parseYieldExpression($parentNode) { - $yieldExpression = new YieldExpression(); - $yieldExpression->parent = $parentNode; - $yieldExpression->yieldOrYieldFromKeyword = $this->eat( - TokenKind::YieldFromKeyword, - TokenKind::YieldKeyword - ); - if ($yieldExpression->yieldOrYieldFromKeyword->kind === TokenKind::YieldFromKeyword) { - // Don't use parseArrayElement. E.g. `yield from &$varName` or `yield from $key => $varName` are both syntax errors - $arrayElement = new ArrayElement(); - $arrayElement->parent = $yieldExpression; - $arrayElement->elementValue = $this->parseExpression($arrayElement); - $yieldExpression->arrayElement = $arrayElement; - } else { - // This is always an ArrayElement for backwards compatibilitiy. - // TODO: Can this be changed to a non-ArrayElement in a future release? - if ($this->isExpressionStart($this->getCurrentToken())) { - // Both `yield expr;` and `yield;` are possible. - $yieldExpression->arrayElement = $this->parseArrayElement($yieldExpression); - } else { - $yieldExpression->arrayElement = null; - } - } - - return $yieldExpression; - } - - private function parseScriptInclusionExpression($parentNode) { - $scriptInclusionExpression = new ScriptInclusionExpression(); - $scriptInclusionExpression->parent = $parentNode; - $scriptInclusionExpression->requireOrIncludeKeyword = - $this->eat( - TokenKind::RequireKeyword, TokenKind::RequireOnceKeyword, - TokenKind::IncludeKeyword, TokenKind::IncludeOnceKeyword - ); - $scriptInclusionExpression->expression = $this->parseExpression($scriptInclusionExpression); - return $scriptInclusionExpression; - } - - private function parseEchoStatement($parentNode) { - $expressionStatement = new ExpressionStatement(); - - // TODO: Could flatten into EchoStatement instead? - $echoExpression = new EchoExpression(); - $echoExpression->parent = $expressionStatement; - $echoExpression->echoKeyword = $this->eat1(TokenKind::EchoKeyword); - $echoExpression->expressions = - $this->parseExpressionList($echoExpression); - - $expressionStatement->parent = $parentNode; - $expressionStatement->expression = $echoExpression; - $expressionStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - - return $expressionStatement; - } - - private function parseUnsetStatement($parentNode) { - $expressionStatement = new ExpressionStatement(); - - // TODO: Could flatten into UnsetStatement instead? - $unsetExpression = $this->parseUnsetIntrinsicExpression($expressionStatement); - - $expressionStatement->parent = $parentNode; - $expressionStatement->expression = $unsetExpression; - $expressionStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - - return $expressionStatement; - } - - private function parseListIntrinsicExpression($parentNode) { - $listExpression = new ListIntrinsicExpression(); - $listExpression->parent = $parentNode; - $listExpression->listKeyword = $this->eat1(TokenKind::ListKeyword); - $listExpression->openParen = $this->eat1(TokenKind::OpenParenToken); - // TODO - parse loosely as ArrayElementList, and validate parse tree later - $listExpression->listElements = - $this->parseArrayElementList($listExpression, DelimitedList\ListExpressionList::class); - $listExpression->closeParen = $this->eat1(TokenKind::CloseParenToken); - - return $listExpression; - } - - private function isArrayElementStart($token) { - return ($this->isArrayElementStartFn())($token); - } - - private function isArrayElementStartFn() { - return function ($token) { - return $token->kind === TokenKind::AmpersandToken || $this->isExpressionStart($token); - }; - } - - private function parseArrayElement($parentNode) { - return ($this->parseArrayElementFn())($parentNode); - } - - private function parseArrayElementFn() { - return function ($parentNode) { - $arrayElement = new ArrayElement(); - $arrayElement->parent = $parentNode; - - if ($this->checkToken(TokenKind::AmpersandToken)) { - $arrayElement->byRef = $this->eat1(TokenKind::AmpersandToken); - $arrayElement->elementValue = $this->parseExpression($arrayElement); - } else { - $expression = $this->parseExpression($arrayElement); - if ($this->checkToken(TokenKind::DoubleArrowToken)) { - $arrayElement->elementKey = $expression; - $arrayElement->arrowToken = $this->eat1(TokenKind::DoubleArrowToken); - $arrayElement->byRef = $this->eatOptional1(TokenKind::AmpersandToken); // TODO not okay for list expressions - $arrayElement->elementValue = $this->parseExpression($arrayElement); - } else { - $arrayElement->elementValue = $expression; - } - } - - return $arrayElement; - }; - } - - private function parseExpressionList($parentExpression) { - return $this->parseDelimitedList( - DelimitedList\ExpressionList::class, - TokenKind::CommaToken, - $this->isExpressionStartFn(), - $this->parseExpressionFn(), - $parentExpression - ); - } - - private function parseUnsetIntrinsicExpression($parentNode) { - $unsetExpression = new UnsetIntrinsicExpression(); - $unsetExpression->parent = $parentNode; - - $unsetExpression->unsetKeyword = $this->eat1(TokenKind::UnsetKeyword); - $unsetExpression->openParen = $this->eat1(TokenKind::OpenParenToken); - $unsetExpression->expressions = $this->parseExpressionList($unsetExpression); - $unsetExpression->closeParen = $this->eat1(TokenKind::CloseParenToken); - - return $unsetExpression; - } - - private function parseArrayCreationExpression($parentNode) { - $arrayExpression = new ArrayCreationExpression(); - $arrayExpression->parent = $parentNode; - - $arrayExpression->arrayKeyword = $this->eatOptional1(TokenKind::ArrayKeyword); - - $arrayExpression->openParenOrBracket = $arrayExpression->arrayKeyword !== null - ? $this->eat1(TokenKind::OpenParenToken) - : $this->eat1(TokenKind::OpenBracketToken); - - $arrayExpression->arrayElements = $this->parseArrayElementList($arrayExpression, DelimitedList\ArrayElementList::class); - - $arrayExpression->closeParenOrBracket = $arrayExpression->arrayKeyword !== null - ? $this->eat1(TokenKind::CloseParenToken) - : $this->eat1(TokenKind::CloseBracketToken); - - return $arrayExpression; - } - - private function parseArrayElementList($listExpression, $className) { - return $this->parseDelimitedList( - $className, - TokenKind::CommaToken, - $this->isArrayElementStartFn(), - $this->parseArrayElementFn(), - $listExpression, - true - ); - } - - private function parseEmptyIntrinsicExpression($parentNode) { - $emptyExpression = new EmptyIntrinsicExpression(); - $emptyExpression->parent = $parentNode; - - $emptyExpression->emptyKeyword = $this->eat1(TokenKind::EmptyKeyword); - $emptyExpression->openParen = $this->eat1(TokenKind::OpenParenToken); - $emptyExpression->expression = $this->parseExpression($emptyExpression); - $emptyExpression->closeParen = $this->eat1(TokenKind::CloseParenToken); - - return $emptyExpression; - } - - private function parseEvalIntrinsicExpression($parentNode) { - $evalExpression = new EvalIntrinsicExpression(); - $evalExpression->parent = $parentNode; - - $evalExpression->evalKeyword = $this->eat1(TokenKind::EvalKeyword); - $evalExpression->openParen = $this->eat1(TokenKind::OpenParenToken); - $evalExpression->expression = $this->parseExpression($evalExpression); - $evalExpression->closeParen = $this->eat1(TokenKind::CloseParenToken); - - return $evalExpression; - } - - private function parseParenthesizedExpression($parentNode) { - $parenthesizedExpression = new ParenthesizedExpression(); - $parenthesizedExpression->parent = $parentNode; - - $parenthesizedExpression->openParen = $this->eat1(TokenKind::OpenParenToken); - $parenthesizedExpression->expression = $this->parseExpression($parenthesizedExpression); - $parenthesizedExpression->closeParen = $this->eat1(TokenKind::CloseParenToken); - - return $parenthesizedExpression; - } - - private function parseExitIntrinsicExpression($parentNode) { - $exitExpression = new ExitIntrinsicExpression(); - $exitExpression->parent = $parentNode; - - $exitExpression->exitOrDieKeyword = $this->eat(TokenKind::ExitKeyword, TokenKind::DieKeyword); - $exitExpression->openParen = $this->eatOptional1(TokenKind::OpenParenToken); - if ($exitExpression->openParen !== null) { - if ($this->isExpressionStart($this->getCurrentToken())) { - $exitExpression->expression = $this->parseExpression($exitExpression); - } - $exitExpression->closeParen = $this->eat1(TokenKind::CloseParenToken); - } - - return $exitExpression; - } - - private function parsePrintIntrinsicExpression($parentNode) { - $printExpression = new PrintIntrinsicExpression(); - $printExpression->parent = $parentNode; - - $printExpression->printKeyword = $this->eat1(TokenKind::PrintKeyword); - $printExpression->expression = $this->parseExpression($printExpression); - - return $printExpression; - } - - private function parseIssetIntrinsicExpression($parentNode) { - $issetExpression = new IssetIntrinsicExpression(); - $issetExpression->parent = $parentNode; - - $issetExpression->issetKeyword = $this->eat1(TokenKind::IsSetKeyword); - $issetExpression->openParen = $this->eat1(TokenKind::OpenParenToken); - $issetExpression->expressions = $this->parseExpressionList($issetExpression); - $issetExpression->closeParen = $this->eat1(TokenKind::CloseParenToken); - - return $issetExpression; - } - - private function parseUnaryOpExpression($parentNode) { - $unaryOpExpression = new UnaryOpExpression(); - $unaryOpExpression->parent = $parentNode; - $unaryOpExpression->operator = - $this->eat(TokenKind::PlusToken, TokenKind::MinusToken, TokenKind::ExclamationToken, TokenKind::TildeToken); - $unaryOpExpression->operand = $this->parseUnaryExpressionOrHigher($unaryOpExpression); - - return $unaryOpExpression; - } - - private function parseErrorControlExpression($parentNode) { - $errorControlExpression = new ErrorControlExpression(); - $errorControlExpression->parent = $parentNode; - - $errorControlExpression->operator = $this->eat1(TokenKind::AtSymbolToken); - $errorControlExpression->operand = $this->parseUnaryExpressionOrHigher($errorControlExpression); - - return $errorControlExpression; - } - - private function parsePrefixUpdateExpression($parentNode) { - $prefixUpdateExpression = new PrefixUpdateExpression(); - $prefixUpdateExpression->parent = $parentNode; - - $prefixUpdateExpression->incrementOrDecrementOperator = $this->eat(TokenKind::PlusPlusToken, TokenKind::MinusMinusToken); - - $prefixUpdateExpression->operand = $this->parsePrimaryExpression($prefixUpdateExpression); - - if (!($prefixUpdateExpression->operand instanceof MissingToken)) { - $prefixUpdateExpression->operand = $this->parsePostfixExpressionRest($prefixUpdateExpression->operand, false); - } - - // TODO also check operand expression validity - return $prefixUpdateExpression; - } - - private function parsePostfixExpressionRest($expression, $allowUpdateExpression = true) { - $tokenKind = $this->getCurrentToken()->kind; - - // `--$a++` is invalid - if ($allowUpdateExpression && - ($tokenKind === TokenKind::PlusPlusToken || - $tokenKind === TokenKind::MinusMinusToken)) { - return $this->parseParsePostfixUpdateExpression($expression); - } - - // TODO write tons of tests - if (!($expression instanceof Variable || - $expression instanceof ParenthesizedExpression || - $expression instanceof QualifiedName || - $expression instanceof CallExpression || - $expression instanceof MemberAccessExpression || - $expression instanceof SubscriptExpression || - $expression instanceof ScopedPropertyAccessExpression || - $expression instanceof StringLiteral || - $expression instanceof ArrayCreationExpression - )) { - return $expression; - } - if ($tokenKind === TokenKind::ColonColonToken) { - $expression = $this->parseScopedPropertyAccessExpression($expression, null); - return $this->parsePostfixExpressionRest($expression); - } - - $tokenKind = $this->getCurrentToken()->kind; - - if ($tokenKind === TokenKind::OpenBraceToken || - $tokenKind === TokenKind::OpenBracketToken) { - $expression = $this->parseSubscriptExpression($expression); - return $this->parsePostfixExpressionRest($expression); - } - - if ($expression instanceof ArrayCreationExpression) { - // Remaining postfix expressions are invalid, so abort - return $expression; - } - - if ($tokenKind === TokenKind::ArrowToken) { - $expression = $this->parseMemberAccessExpression($expression); - return $this->parsePostfixExpressionRest($expression); - } - - if ($tokenKind === TokenKind::OpenParenToken && !$this->isParsingObjectCreationExpression) { - $expression = $this->parseCallExpressionRest($expression); - - if (!$this->checkToken(TokenKind::OpenParenToken)) { - return $this->parsePostfixExpressionRest($expression); - } - if ( - $expression instanceof ParenthesizedExpression || - $expression instanceof CallExpression || - $expression instanceof SubscriptExpression) { - // Continue parsing the remaining brackets for expressions - // such as `(new Foo())()`, `foo()()`, `foo()['index']()` - return $this->parsePostfixExpressionRest($expression); - } - return $expression; - } - - // Reached the end of the postfix-expression, so return - return $expression; - } - - private function parseMemberName($parentNode) { - $token = $this->getCurrentToken(); - switch ($token->kind) { - case TokenKind::Name: - $this->advanceToken(); // TODO all names should be Nodes - return $token; - case TokenKind::VariableName: - case TokenKind::DollarToken: - return $this->parseSimpleVariable($parentNode); // TODO should be simple-variable - case TokenKind::OpenBraceToken: - return $this->parseBracedExpression($parentNode); - - default: - if (\in_array($token->kind, $this->nameOrKeywordOrReservedWordTokens)) { - $this->advanceToken(); - $token->kind = TokenKind::Name; - return $token; - } - } - return new MissingToken(TokenKind::MemberName, $token->fullStart); - } - - private function isArgumentExpressionStartFn() { - return function ($token) { - return - $token->kind === TokenKind::DotDotDotToken ? true : $this->isExpressionStart($token); - }; - } - - private function parseArgumentExpressionFn() { - return function ($parentNode) { - $argumentExpression = new ArgumentExpression(); - $argumentExpression->parent = $parentNode; - $argumentExpression->byRefToken = $this->eatOptional1(TokenKind::AmpersandToken); - $argumentExpression->dotDotDotToken = $this->eatOptional1(TokenKind::DotDotDotToken); - $argumentExpression->expression = $this->parseExpression($argumentExpression); - return $argumentExpression; - }; - } - - private function parseCallExpressionRest($expression) { - $callExpression = new CallExpression(); - $callExpression->parent = $expression->parent; - $expression->parent = $callExpression; - $callExpression->callableExpression = $expression; - $callExpression->openParen = $this->eat1(TokenKind::OpenParenToken); - $callExpression->argumentExpressionList = - $this->parseArgumentExpressionList($callExpression); - $callExpression->closeParen = $this->eat1(TokenKind::CloseParenToken); - return $callExpression; - } - - private function parseParsePostfixUpdateExpression($prefixExpression) { - $postfixUpdateExpression = new PostfixUpdateExpression(); - $postfixUpdateExpression->operand = $prefixExpression; - $postfixUpdateExpression->parent = $prefixExpression->parent; - $prefixExpression->parent = $postfixUpdateExpression; - $postfixUpdateExpression->incrementOrDecrementOperator = - $this->eat(TokenKind::PlusPlusToken, TokenKind::MinusMinusToken); - return $postfixUpdateExpression; - } - - private function parseBracedExpression($parentNode) { - $bracedExpression = new BracedExpression(); - $bracedExpression->parent = $parentNode; - - $bracedExpression->openBrace = $this->eat1(TokenKind::OpenBraceToken); - $bracedExpression->expression = $this->parseExpression($bracedExpression); - $bracedExpression->closeBrace = $this->eat1(TokenKind::CloseBraceToken); - - return $bracedExpression; - } - - private function parseSubscriptExpression($expression) : SubscriptExpression { - $subscriptExpression = new SubscriptExpression(); - $subscriptExpression->parent = $expression->parent; - $expression->parent = $subscriptExpression; - - $subscriptExpression->postfixExpression = $expression; - $subscriptExpression->openBracketOrBrace = $this->eat(TokenKind::OpenBracketToken, TokenKind::OpenBraceToken); - $subscriptExpression->accessExpression = $this->isExpressionStart($this->getCurrentToken()) - ? $this->parseExpression($subscriptExpression) - : null; // TODO error if used in a getter - - if ($subscriptExpression->openBracketOrBrace->kind === TokenKind::OpenBraceToken) { - $subscriptExpression->closeBracketOrBrace = $this->eat1(TokenKind::CloseBraceToken); - } else { - $subscriptExpression->closeBracketOrBrace = $this->eat1(TokenKind::CloseBracketToken); - } - - return $subscriptExpression; - } - - private function parseMemberAccessExpression($expression):MemberAccessExpression { - $memberAccessExpression = new MemberAccessExpression(); - $memberAccessExpression->parent = $expression->parent; - $expression->parent = $memberAccessExpression; - - $memberAccessExpression->dereferencableExpression = $expression; - $memberAccessExpression->arrowToken = $this->eat1(TokenKind::ArrowToken); - $memberAccessExpression->memberName = $this->parseMemberName($memberAccessExpression); - - return $memberAccessExpression; - } - - /** - * @param Node|null $expression - * @param Node|null $fallbackParentNode (Workaround for the invalid AST `use TraitName::foo as ::x`) - */ - private function parseScopedPropertyAccessExpression($expression, $fallbackParentNode): ScopedPropertyAccessExpression { - $scopedPropertyAccessExpression = new ScopedPropertyAccessExpression(); - $scopedPropertyAccessExpression->parent = $expression->parent ?? $fallbackParentNode; - if ($expression instanceof Node) { - $expression->parent = $scopedPropertyAccessExpression; - $scopedPropertyAccessExpression->scopeResolutionQualifier = $expression; // TODO ensure always a Node - } - - $scopedPropertyAccessExpression->doubleColon = $this->eat1(TokenKind::ColonColonToken); - $scopedPropertyAccessExpression->memberName = $this->parseMemberName($scopedPropertyAccessExpression); - - return $scopedPropertyAccessExpression; - } - - private $isParsingObjectCreationExpression = false; - - private function parseObjectCreationExpression($parentNode) { - $objectCreationExpression = new ObjectCreationExpression(); - $objectCreationExpression->parent = $parentNode; - $objectCreationExpression->newKeword = $this->eat1(TokenKind::NewKeyword); - // TODO - add tests for this scenario - $this->isParsingObjectCreationExpression = true; - $objectCreationExpression->classTypeDesignator = - $this->eatOptional1(TokenKind::ClassKeyword) ?? - $this->parseExpression($objectCreationExpression); - - $this->isParsingObjectCreationExpression = false; - - $objectCreationExpression->openParen = $this->eatOptional1(TokenKind::OpenParenToken); - if ($objectCreationExpression->openParen !== null) { - $objectCreationExpression->argumentExpressionList = $this->parseArgumentExpressionList($objectCreationExpression); - $objectCreationExpression->closeParen = $this->eat1(TokenKind::CloseParenToken); - } - - $objectCreationExpression->classBaseClause = $this->parseClassBaseClause($objectCreationExpression); - $objectCreationExpression->classInterfaceClause = $this->parseClassInterfaceClause($objectCreationExpression); - - if ($this->getCurrentToken()->kind === TokenKind::OpenBraceToken) { - $objectCreationExpression->classMembers = $this->parseClassMembers($objectCreationExpression); - } - - return $objectCreationExpression; - } - - private function parseArgumentExpressionList($parentNode) { - return $this->parseDelimitedList( - DelimitedList\ArgumentExpressionList::class, - TokenKind::CommaToken, - $this->isArgumentExpressionStartFn(), - $this->parseArgumentExpressionFn(), - $parentNode - ); - } - - /** - * @param Node|Token $leftOperand (should only be a token for invalid ASTs) - * @param Token $questionToken - * @param Node $fallbackParentNode - */ - private function parseTernaryExpression($leftOperand, $questionToken, $fallbackParentNode):TernaryExpression { - $ternaryExpression = new TernaryExpression(); - if ($leftOperand instanceof Node) { - $ternaryExpression->parent = $leftOperand->parent; - $leftOperand->parent = $ternaryExpression; - } else { - $ternaryExpression->parent = $fallbackParentNode; - } - $ternaryExpression->condition = $leftOperand; - $ternaryExpression->questionToken = $questionToken; - $ternaryExpression->ifExpression = $this->isExpressionStart($this->getCurrentToken()) ? $this->parseExpression($ternaryExpression) : null; - $ternaryExpression->colonToken = $this->eat1(TokenKind::ColonToken); - $ternaryExpression->elseExpression = $this->parseBinaryExpressionOrHigher(9, $ternaryExpression); - $leftOperand = $ternaryExpression; - return $leftOperand; - } - - private function parseClassInterfaceClause($parentNode) { - $classInterfaceClause = new ClassInterfaceClause(); - $classInterfaceClause->parent = $parentNode; - $classInterfaceClause->implementsKeyword = $this->eatOptional1(TokenKind::ImplementsKeyword); - - if ($classInterfaceClause->implementsKeyword === null) { - return null; - } - - $classInterfaceClause->interfaceNameList = - $this->parseQualifiedNameList($classInterfaceClause); - return $classInterfaceClause; - } - - private function parseClassBaseClause($parentNode) { - $classBaseClause = new ClassBaseClause(); - $classBaseClause->parent = $parentNode; - - $classBaseClause->extendsKeyword = $this->eatOptional1(TokenKind::ExtendsKeyword); - if ($classBaseClause->extendsKeyword === null) { - return null; - } - $classBaseClause->baseClass = $this->parseQualifiedName($classBaseClause); - - return $classBaseClause; - } - - private function parseClassConstDeclaration($parentNode, $modifiers) { - $classConstDeclaration = new ClassConstDeclaration(); - $classConstDeclaration->parent = $parentNode; - - $classConstDeclaration->modifiers = $modifiers; - $classConstDeclaration->constKeyword = $this->eat1(TokenKind::ConstKeyword); - $classConstDeclaration->constElements = $this->parseConstElements($classConstDeclaration); - $classConstDeclaration->semicolon = $this->eat1(TokenKind::SemicolonToken); - - return $classConstDeclaration; - } - - /** - * @param Node $parentNode - * @param Token[] $modifiers - * @param Token|null $questionToken - */ - private function parseRemainingPropertyDeclarationOrMissingMemberDeclaration($parentNode, $modifiers, $questionToken = null) - { - $typeDeclaration = $this->tryParseParameterTypeDeclaration(null); - if ($questionToken !== null && $typeDeclaration === null) { - $typeDeclaration = new MissingToken(TokenKind::PropertyType, $this->getCurrentToken()->fullStart); - } - if ($this->getCurrentToken()->kind !== TokenKind::VariableName) { - return $this->makeMissingMemberDeclaration($parentNode, $modifiers, $questionToken, $typeDeclaration); - } - return $this->parsePropertyDeclaration($parentNode, $modifiers, $questionToken, $typeDeclaration); - } - - /** - * @param Node $parentNode - * @param Token[] $modifiers - * @param Token|null $questionToken - * @param QualifiedName|Token|null $typeDeclaration - */ - private function parsePropertyDeclaration($parentNode, $modifiers, $questionToken = null, $typeDeclaration = null) { - $propertyDeclaration = new PropertyDeclaration(); - $propertyDeclaration->parent = $parentNode; - - $propertyDeclaration->modifiers = $modifiers; - $propertyDeclaration->questionToken = $questionToken; // - $propertyDeclaration->typeDeclaration = $typeDeclaration; - if ($typeDeclaration instanceof Node) { - $typeDeclaration->parent = $propertyDeclaration; - } - $propertyDeclaration->propertyElements = $this->parseExpressionList($propertyDeclaration); - $propertyDeclaration->semicolon = $this->eat1(TokenKind::SemicolonToken); - - return $propertyDeclaration; - } - - /** - * @param Node $parentNode - * @return DelimitedList\QualifiedNameList - */ - private function parseQualifiedNameList($parentNode) { - return $this->parseDelimitedList( - DelimitedList\QualifiedNameList::class, - TokenKind::CommaToken, - $this->isQualifiedNameStartFn(), - $this->parseQualifiedNameFn(), - $parentNode); - } - - private function parseQualifiedNameCatchList($parentNode) { - $result = $this->parseDelimitedList( - DelimitedList\QualifiedNameList::class, - TokenKind::BarToken, - $this->isQualifiedNameStartForCatchFn(), - $this->parseQualifiedNameFn(), - $parentNode); - - // Add a MissingToken so that this will Warn about `catch (T| $x) {}` - // TODO: Make this a reusable abstraction? - if ($result && (end($result->children)->kind ?? null) === TokenKind::BarToken) { - $result->children[] = new MissingToken(TokenKind::Name, $this->token->fullStart); - } - return $result; - } - - private function parseInterfaceDeclaration($parentNode) { - $interfaceDeclaration = new InterfaceDeclaration(); // TODO verify not nested - $interfaceDeclaration->parent = $parentNode; - $interfaceDeclaration->interfaceKeyword = $this->eat1(TokenKind::InterfaceKeyword); - $interfaceDeclaration->name = $this->eat1(TokenKind::Name); - $interfaceDeclaration->interfaceBaseClause = $this->parseInterfaceBaseClause($interfaceDeclaration); - $interfaceDeclaration->interfaceMembers = $this->parseInterfaceMembers($interfaceDeclaration); - return $interfaceDeclaration; - } - - private function parseInterfaceMembers($parentNode) : Node { - $interfaceMembers = new InterfaceMembers(); - $interfaceMembers->openBrace = $this->eat1(TokenKind::OpenBraceToken); - $interfaceMembers->interfaceMemberDeclarations = $this->parseList($interfaceMembers, ParseContext::InterfaceMembers); - $interfaceMembers->closeBrace = $this->eat1(TokenKind::CloseBraceToken); - $interfaceMembers->parent = $parentNode; - return $interfaceMembers; - } - - private function isInterfaceMemberDeclarationStart(Token $token) { - switch ($token->kind) { - // visibility-modifier - case TokenKind::PublicKeyword: - case TokenKind::ProtectedKeyword: - case TokenKind::PrivateKeyword: - - // static-modifier - case TokenKind::StaticKeyword: - - // class-modifier - case TokenKind::AbstractKeyword: - case TokenKind::FinalKeyword: - - case TokenKind::ConstKeyword: - - case TokenKind::FunctionKeyword: - return true; - } - return false; - } - - private function parseInterfaceElementFn() { - return function ($parentNode) { - $modifiers = $this->parseModifiers(); - - $token = $this->getCurrentToken(); - switch ($token->kind) { - case TokenKind::ConstKeyword: - return $this->parseClassConstDeclaration($parentNode, $modifiers); - - case TokenKind::FunctionKeyword: - return $this->parseMethodDeclaration($parentNode, $modifiers); - - default: - $missingInterfaceMemberDeclaration = new MissingMemberDeclaration(); - $missingInterfaceMemberDeclaration->parent = $parentNode; - $missingInterfaceMemberDeclaration->modifiers = $modifiers; - return $missingInterfaceMemberDeclaration; - } - }; - } - - private function parseInterfaceBaseClause($parentNode) { - $interfaceBaseClause = new InterfaceBaseClause(); - $interfaceBaseClause->parent = $parentNode; - - $interfaceBaseClause->extendsKeyword = $this->eatOptional1(TokenKind::ExtendsKeyword); - if (isset($interfaceBaseClause->extendsKeyword)) { - $interfaceBaseClause->interfaceNameList = $this->parseQualifiedNameList($interfaceBaseClause); - } else { - return null; - } - - return $interfaceBaseClause; - } - - private function parseNamespaceDefinition($parentNode) { - $namespaceDefinition = new NamespaceDefinition(); - $namespaceDefinition->parent = $parentNode; - - $namespaceDefinition->namespaceKeyword = $this->eat1(TokenKind::NamespaceKeyword); - - if (!$this->checkToken(TokenKind::NamespaceKeyword)) { - $namespaceDefinition->name = $this->parseQualifiedName($namespaceDefinition); // TODO only optional with compound statement block - } - - $namespaceDefinition->compoundStatementOrSemicolon = - $this->checkToken(TokenKind::OpenBraceToken) ? - $this->parseCompoundStatement($namespaceDefinition) : $this->eatSemicolonOrAbortStatement(); - - return $namespaceDefinition; - } - - private function parseNamespaceUseDeclaration($parentNode) { - $namespaceUseDeclaration = new NamespaceUseDeclaration(); - $namespaceUseDeclaration->parent = $parentNode; - $namespaceUseDeclaration->useKeyword = $this->eat1(TokenKind::UseKeyword); - $namespaceUseDeclaration->functionOrConst = $this->eatOptional(TokenKind::FunctionKeyword, TokenKind::ConstKeyword); - $namespaceUseDeclaration->useClauses = $this->parseNamespaceUseClauseList($namespaceUseDeclaration); - $namespaceUseDeclaration->semicolon = $this->eatSemicolonOrAbortStatement(); - return $namespaceUseDeclaration; - } - - private function parseNamespaceUseClauseList($parentNode) { - return $this->parseDelimitedList( - DelimitedList\NamespaceUseClauseList::class, - TokenKind::CommaToken, - function ($token) { - return $this->isQualifiedNameStart($token) || $token->kind === TokenKind::FunctionKeyword || $token->kind === TokenKind::ConstKeyword; - }, - function ($parentNode) { - $namespaceUseClause = new NamespaceUseClause(); - $namespaceUseClause->parent = $parentNode; - $namespaceUseClause->namespaceName = $this->parseQualifiedName($namespaceUseClause); - if ($this->checkToken(TokenKind::AsKeyword)) { - $namespaceUseClause->namespaceAliasingClause = $this->parseNamespaceAliasingClause($namespaceUseClause); - } - elseif ($this->checkToken(TokenKind::OpenBraceToken)) { - $namespaceUseClause->openBrace = $this->eat1(TokenKind::OpenBraceToken); - $namespaceUseClause->groupClauses = $this->parseNamespaceUseGroupClauseList($namespaceUseClause); - $namespaceUseClause->closeBrace = $this->eat1(TokenKind::CloseBraceToken); - } - - return $namespaceUseClause; - }, - $parentNode - ); - } - - private function parseNamespaceUseGroupClauseList($parentNode) { - return $this->parseDelimitedList( - DelimitedList\NamespaceUseGroupClauseList::class, - TokenKind::CommaToken, - function ($token) { - return $this->isQualifiedNameStart($token) || $token->kind === TokenKind::FunctionKeyword || $token->kind === TokenKind::ConstKeyword; - }, - function ($parentNode) { - $namespaceUseGroupClause = new NamespaceUseGroupClause(); - $namespaceUseGroupClause->parent = $parentNode; - - $namespaceUseGroupClause->functionOrConst = $this->eatOptional(TokenKind::FunctionKeyword, TokenKind::ConstKeyword); - $namespaceUseGroupClause->namespaceName = $this->parseQualifiedName($namespaceUseGroupClause); - if ($this->checkToken(TokenKind::AsKeyword)) { - $namespaceUseGroupClause->namespaceAliasingClause = $this->parseNamespaceAliasingClause($namespaceUseGroupClause); - } - - return $namespaceUseGroupClause; - }, - $parentNode - ); - } - - private function parseNamespaceAliasingClause($parentNode) { - $namespaceAliasingClause = new NamespaceAliasingClause(); - $namespaceAliasingClause->parent = $parentNode; - $namespaceAliasingClause->asKeyword = $this->eat1(TokenKind::AsKeyword); - $namespaceAliasingClause->name = $this->eat1(TokenKind::Name); - return $namespaceAliasingClause; - } - - private function parseTraitDeclaration($parentNode) { - $traitDeclaration = new TraitDeclaration(); - $traitDeclaration->parent = $parentNode; - - $traitDeclaration->traitKeyword = $this->eat1(TokenKind::TraitKeyword); - $traitDeclaration->name = $this->eat1(TokenKind::Name); - - $traitDeclaration->traitMembers = $this->parseTraitMembers($traitDeclaration); - - return $traitDeclaration; - } - - private function parseTraitMembers($parentNode) { - $traitMembers = new TraitMembers(); - $traitMembers->parent = $parentNode; - - $traitMembers->openBrace = $this->eat1(TokenKind::OpenBraceToken); - - $traitMembers->traitMemberDeclarations = $this->parseList($traitMembers, ParseContext::TraitMembers); - - $traitMembers->closeBrace = $this->eat1(TokenKind::CloseBraceToken); - - return $traitMembers; - } - - private function isTraitMemberDeclarationStart($token) { - switch ($token->kind) { - // property-declaration - case TokenKind::VariableName: - - // modifiers - case TokenKind::PublicKeyword: - case TokenKind::ProtectedKeyword: - case TokenKind::PrivateKeyword: - case TokenKind::VarKeyword: - case TokenKind::StaticKeyword: - case TokenKind::AbstractKeyword: - case TokenKind::FinalKeyword: - - // method-declaration - case TokenKind::FunctionKeyword: - - // trait-use-clauses - case TokenKind::UseKeyword: - return true; - } - return false; - } - - private function parseTraitElementFn() { - return function ($parentNode) { - $modifiers = $this->parseModifiers(); - - $token = $this->getCurrentToken(); - switch ($token->kind) { - case TokenKind::FunctionKeyword: - return $this->parseMethodDeclaration($parentNode, $modifiers); - - case TokenKind::QuestionToken: - return $this->parseRemainingPropertyDeclarationOrMissingMemberDeclaration( - $parentNode, - $modifiers, - $this->eat1(TokenKind::QuestionToken) - ); - case TokenKind::VariableName: - return $this->parsePropertyDeclaration($parentNode, $modifiers); - - case TokenKind::UseKeyword: - return $this->parseTraitUseClause($parentNode); - - default: - return $this->parseRemainingPropertyDeclarationOrMissingMemberDeclaration($parentNode, $modifiers); - } - }; - } - - /** - * @param Node $parentNode - * @param Token[] $modifiers - * @param Token $questionToken - * @param QualifiedName|Token|null $typeDeclaration - */ - private function makeMissingMemberDeclaration($parentNode, $modifiers, $questionToken = null, $typeDeclaration = null) { - $missingTraitMemberDeclaration = new MissingMemberDeclaration(); - $missingTraitMemberDeclaration->parent = $parentNode; - $missingTraitMemberDeclaration->modifiers = $modifiers; - $missingTraitMemberDeclaration->questionToken = $questionToken; - $missingTraitMemberDeclaration->typeDeclaration = $typeDeclaration; - if ($typeDeclaration instanceof Node) { - $typeDeclaration->parent = $missingTraitMemberDeclaration; - } - return $missingTraitMemberDeclaration; - } - - private function parseTraitUseClause($parentNode) { - $traitUseClause = new TraitUseClause(); - $traitUseClause->parent = $parentNode; - - $traitUseClause->useKeyword = $this->eat1(TokenKind::UseKeyword); - $traitUseClause->traitNameList = $this->parseQualifiedNameList($traitUseClause); - - $traitUseClause->semicolonOrOpenBrace = $this->eat(TokenKind::OpenBraceToken, TokenKind::SemicolonToken); - if ($traitUseClause->semicolonOrOpenBrace->kind === TokenKind::OpenBraceToken) { - $traitUseClause->traitSelectAndAliasClauses = $this->parseTraitSelectAndAliasClauseList($traitUseClause); - $traitUseClause->closeBrace = $this->eat1(TokenKind::CloseBraceToken); - } - - return $traitUseClause; - } - - private function parseTraitSelectAndAliasClauseList($parentNode) { - return $this->parseDelimitedList( - DelimitedList\TraitSelectOrAliasClauseList::class, - TokenKind::SemicolonToken, - $this->isQualifiedNameStartFn(), - $this->parseTraitSelectOrAliasClauseFn(), - $parentNode - ); - } - - private function parseTraitSelectOrAliasClauseFn() { - return function ($parentNode) { - $traitSelectAndAliasClause = new TraitSelectOrAliasClause(); - $traitSelectAndAliasClause->parent = $parentNode; - $traitSelectAndAliasClause->name = // TODO update spec - $this->parseQualifiedNameOrScopedPropertyAccessExpression($traitSelectAndAliasClause); - - $traitSelectAndAliasClause->asOrInsteadOfKeyword = $this->eat(TokenKind::AsKeyword, TokenKind::InsteadOfKeyword); - $traitSelectAndAliasClause->modifiers = $this->parseModifiers(); // TODO accept all modifiers, verify later - - if ($traitSelectAndAliasClause->asOrInsteadOfKeyword->kind === TokenKind::InsteadOfKeyword) { - // https://github.com/Microsoft/tolerant-php-parser/issues/190 - // TODO: In the next backwards incompatible release, convert targetName to a list? - $interfaceNameList = $this->parseQualifiedNameList($traitSelectAndAliasClause)->children ?? []; - $traitSelectAndAliasClause->targetName = $interfaceNameList[0] ?? new MissingToken(TokenKind::BarToken, $this->token->fullStart); - $traitSelectAndAliasClause->remainingTargetNames = array_slice($interfaceNameList, 1); - } else { - $traitSelectAndAliasClause->targetName = - $this->parseQualifiedNameOrScopedPropertyAccessExpression($traitSelectAndAliasClause); - $traitSelectAndAliasClause->remainingTargetNames = []; - } - - // TODO errors for insteadof/as - return $traitSelectAndAliasClause; - }; - } - - private function parseQualifiedNameOrScopedPropertyAccessExpression($parentNode) { - $qualifiedNameOrScopedProperty = $this->parseQualifiedName($parentNode); - if ($this->getCurrentToken()->kind === TokenKind::ColonColonToken) { - $qualifiedNameOrScopedProperty = $this->parseScopedPropertyAccessExpression($qualifiedNameOrScopedProperty, $parentNode); - } - return $qualifiedNameOrScopedProperty; - } - - private function parseGlobalDeclaration($parentNode) { - $globalDeclaration = new GlobalDeclaration(); - $globalDeclaration->parent = $parentNode; - - $globalDeclaration->globalKeyword = $this->eat1(TokenKind::GlobalKeyword); - $globalDeclaration->variableNameList = $this->parseDelimitedList( - DelimitedList\VariableNameList::class, - TokenKind::CommaToken, - $this->isVariableNameStartFn(), - $this->parseSimpleVariableFn(), - $globalDeclaration - ); - - $globalDeclaration->semicolon = $this->eatSemicolonOrAbortStatement(); - - return $globalDeclaration; - } - - private function parseFunctionStaticDeclaration($parentNode) { - $functionStaticDeclaration = new FunctionStaticDeclaration(); - $functionStaticDeclaration->parent = $parentNode; - - $functionStaticDeclaration->staticKeyword = $this->eat1(TokenKind::StaticKeyword); - $functionStaticDeclaration->staticVariableNameList = $this->parseDelimitedList( - DelimitedList\StaticVariableNameList::class, - TokenKind::CommaToken, - function ($token) { - return $token->kind === TokenKind::VariableName; - }, - $this->parseStaticVariableDeclarationFn(), - $functionStaticDeclaration - ); - $functionStaticDeclaration->semicolon = $this->eatSemicolonOrAbortStatement(); - - return $functionStaticDeclaration; - } - - private function isVariableNameStartFn() { - return function ($token) { - return $token->kind === TokenKind::VariableName || $token->kind === TokenKind::DollarToken; - }; - } - - private function parseStaticVariableDeclarationFn() { - return function ($parentNode) { - $staticVariableDeclaration = new StaticVariableDeclaration(); - $staticVariableDeclaration->parent = $parentNode; - $staticVariableDeclaration->variableName = $this->eat1(TokenKind::VariableName); - $staticVariableDeclaration->equalsToken = $this->eatOptional1(TokenKind::EqualsToken); - if ($staticVariableDeclaration->equalsToken !== null) { - // TODO add post-parse rule that checks for invalid assignments - $staticVariableDeclaration->assignment = $this->parseExpression($staticVariableDeclaration); - } - return $staticVariableDeclaration; - }; - } - - private function parseConstDeclaration($parentNode) { - $constDeclaration = new ConstDeclaration(); - $constDeclaration->parent = $parentNode; - - $constDeclaration->constKeyword = $this->eat1(TokenKind::ConstKeyword); - $constDeclaration->constElements = $this->parseConstElements($constDeclaration); - $constDeclaration->semicolon = $this->eatSemicolonOrAbortStatement(); - - return $constDeclaration; - } - - private function parseConstElements($parentNode) { - return $this->parseDelimitedList( - DelimitedList\ConstElementList::class, - TokenKind::CommaToken, - function ($token) { - return \in_array($token->kind, $this->nameOrKeywordOrReservedWordTokens); - }, - $this->parseConstElementFn(), - $parentNode - ); - } - - private function parseConstElementFn() { - return function ($parentNode) { - $constElement = new ConstElement(); - $constElement->parent = $parentNode; - $constElement->name = $this->getCurrentToken(); - $this->advanceToken(); - $constElement->name->kind = TokenKind::Name; // to support keyword names - $constElement->equalsToken = $this->eat1(TokenKind::EqualsToken); - // TODO add post-parse rule that checks for invalid assignments - $constElement->assignment = $this->parseExpression($constElement); - return $constElement; - }; - } - - private function parseCastExpression($parentNode) { - $castExpression = new CastExpression(); - $castExpression->parent = $parentNode; - $castExpression->castType = $this->eat( - TokenKind::ArrayCastToken, - TokenKind::BoolCastToken, - TokenKind::DoubleCastToken, - TokenKind::IntCastToken, - TokenKind::ObjectCastToken, - TokenKind::StringCastToken, - TokenKind::UnsetCastToken - ); - - $castExpression->operand = $this->parseUnaryExpressionOrHigher($castExpression); - - return $castExpression; - } - - private function parseCastExpressionGranular($parentNode) { - $castExpression = new CastExpression(); - $castExpression->parent = $parentNode; - - $castExpression->openParen = $this->eat1(TokenKind::OpenParenToken); - $castExpression->castType = $this->eat( - TokenKind::ArrayKeyword, - TokenKind::BinaryReservedWord, - TokenKind::BoolReservedWord, - TokenKind::BooleanReservedWord, - TokenKind::DoubleReservedWord, - TokenKind::IntReservedWord, - TokenKind::IntegerReservedWord, - TokenKind::FloatReservedWord, - TokenKind::ObjectReservedWord, - TokenKind::RealReservedWord, - TokenKind::StringReservedWord, - TokenKind::UnsetKeyword - ); - $castExpression->closeParen = $this->eat1(TokenKind::CloseParenToken); - $castExpression->operand = $this->parseUnaryExpressionOrHigher($castExpression); - - return $castExpression; - } - - private function parseAnonymousFunctionCreationExpression($parentNode) { - $anonymousFunctionCreationExpression = new AnonymousFunctionCreationExpression(); - $anonymousFunctionCreationExpression->parent = $parentNode; - - $anonymousFunctionCreationExpression->staticModifier = $this->eatOptional1(TokenKind::StaticKeyword); - $this->parseFunctionType($anonymousFunctionCreationExpression, false, true); - - return $anonymousFunctionCreationExpression; - } - - private function parseAnonymousFunctionUseClause($parentNode) { - $anonymousFunctionUseClause = new AnonymousFunctionUseClause(); - $anonymousFunctionUseClause->parent = $parentNode; - - $anonymousFunctionUseClause->useKeyword = $this->eatOptional1(TokenKind::UseKeyword); - if ($anonymousFunctionUseClause->useKeyword === null) { - return null; - } - $anonymousFunctionUseClause->openParen = $this->eat1(TokenKind::OpenParenToken); - $anonymousFunctionUseClause->useVariableNameList = $this->parseDelimitedList( - DelimitedList\UseVariableNameList::class, - TokenKind::CommaToken, - function ($token) { - return $token->kind === TokenKind::AmpersandToken || $token->kind === TokenKind::VariableName; - }, - function ($parentNode) { - $useVariableName = new UseVariableName(); - $useVariableName->parent = $parentNode; - $useVariableName->byRef = $this->eatOptional1(TokenKind::AmpersandToken); - $useVariableName->variableName = $this->eat1(TokenKind::VariableName); - return $useVariableName; - }, - $anonymousFunctionUseClause - ); - $anonymousFunctionUseClause->closeParen = $this->eat1(TokenKind::CloseParenToken); - - return $anonymousFunctionUseClause; - } - - private function parseCloneExpression($parentNode) { - $cloneExpression = new CloneExpression(); - $cloneExpression->parent = $parentNode; - - $cloneExpression->cloneKeyword = $this->eat1(TokenKind::CloneKeyword); - $cloneExpression->expression = $this->parseUnaryExpressionOrHigher($cloneExpression); - - return $cloneExpression; - } - - private function eatSemicolonOrAbortStatement() { - if ($this->getCurrentToken()->kind !== TokenKind::ScriptSectionEndTag) { - return $this->eat1(TokenKind::SemicolonToken); - } - return null; - } - - private function parseInlineHtml($parentNode) { - $inlineHtml = new InlineHtml(); - $inlineHtml->parent = $parentNode; - $inlineHtml->scriptSectionEndTag = $this->eatOptional1(TokenKind::ScriptSectionEndTag); - $inlineHtml->text = $this->eatOptional1(TokenKind::InlineHtml); - $inlineHtml->scriptSectionStartTag = $this->eatOptional(TokenKind::ScriptSectionStartTag, TokenKind::ScriptSectionStartWithEchoTag); - - // This is the easiest way to represent `<?= "expr", "other" ` - if (($inlineHtml->scriptSectionStartTag->kind ?? null) === TokenKind::ScriptSectionStartWithEchoTag) { - $echoStatement = new ExpressionStatement(); - - $echoExpression = new EchoExpression(); - $expressionList = $this->parseExpressionList($echoExpression) ?? (new MissingToken(TokenKind::Expression, $this->token->fullStart)); - $echoExpression->expressions = $expressionList; - $echoExpression->parent = $echoStatement; - - $echoStatement->expression = $echoExpression; - $echoStatement->semicolon = $this->eatSemicolonOrAbortStatement(); - $echoStatement->parent = $inlineHtml; - // Deliberately leave echoKeyword as null instead of MissingToken - - $inlineHtml->echoStatement = $echoStatement; - } - - return $inlineHtml; - } -} - -class Associativity { - const None = 0; - const Left = 1; - const Right = 2; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/PhpTokenizer.php b/vendor/microsoft/tolerant-php-parser/src/PhpTokenizer.php deleted file mode 100644 index 847cbbb..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/PhpTokenizer.php +++ /dev/null @@ -1,304 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -// If this predates PHP 7.4, T_COALESCE_EQUAL is unavailable. -// The replacement value is arbitrary - it just has to be different from other values of token constants. -define(__NAMESPACE__ . '\T_COALESCE_EQUAL', defined('T_COALESCE_EQUAL') ? constant('T_COALESCE_EQUAL') : 'T_COALESCE_EQUAL'); - -/** - * Tokenizes content using PHP's built-in `token_get_all`, and converts to "lightweight" Token representation. - * - * Initially we tried hand-spinning the lexer (see `experiments/Lexer.php`), but we had difficulties optimizing - * performance (especially when working with Unicode characters.) - * - * Class PhpTokenizer - * @package Microsoft\PhpParser - */ -class PhpTokenizer implements TokenStreamProviderInterface { - public $pos; - public $endOfFilePos; - - private $tokensArray; - - public function __construct($content) { - $this->tokensArray = $this->getTokensArrayFromContent($content); - $this->endOfFilePos = \count($this->tokensArray) - 1; - $this->pos = 0; - } - - public function scanNextToken() : Token { - return $this->pos >= $this->endOfFilePos - ? $this->tokensArray[$this->endOfFilePos] - : $this->tokensArray[$this->pos++]; - } - - public function getCurrentPosition() : int { - return $this->pos; - } - - public function setCurrentPosition(int $pos) { - $this->pos = $pos; - } - - public function getEndOfFilePosition() : int { - return $this->endOfFilePos; - } - - public function getTokensArray() : array { - return $this->tokensArray; - } - - public static function getTokensArrayFromContent( - $content, $parseContext = null, $initialPos = 0, $treatCommentsAsTrivia = true - ) : array { - if ($parseContext !== null) { - $prefix = self::PARSE_CONTEXT_TO_PREFIX[$parseContext]; - $content = $prefix . $content; - $passedPrefix = false; - } - - $tokens = @\token_get_all($content); - - $arr = array(); - $fullStart = $start = $pos = $initialPos; - - foreach ($tokens as $token) { - if (\is_array($token)) { - $tokenKind = $token[0]; - $strlen = \strlen($token[1]); - } else { - $tokenKind = $token; - $strlen = \strlen($token); - } - - $pos += $strlen; - - if ($parseContext !== null && !$passedPrefix) { - $passedPrefix = \strlen($prefix) < $pos; - if ($passedPrefix) { - $fullStart = $start = $pos = $initialPos; - } - continue; - } - - switch ($tokenKind) { - case \T_OPEN_TAG: - $arr[] = new Token(TokenKind::ScriptSectionStartTag, $fullStart, $start, $pos-$fullStart); - $start = $fullStart = $pos; - break; - - case \T_WHITESPACE: - $start += $strlen; - break; - - case \T_STRING: - $name = \strtolower($token[1]); - if (isset(TokenStringMaps::RESERVED_WORDS[$name])) { - $newTokenKind = TokenStringMaps::RESERVED_WORDS[$name]; - $arr[] = new Token($newTokenKind, $fullStart, $start, $pos - $fullStart); - $start = $fullStart = $pos; - break; - } - - default: - if (($tokenKind === \T_COMMENT || $tokenKind === \T_DOC_COMMENT) && $treatCommentsAsTrivia) { - $start += $strlen; - break; - } - - $newTokenKind = self::TOKEN_MAP[$tokenKind] ?? TokenKind::Unknown; - $arr[] = new Token($newTokenKind, $fullStart, $start, $pos - $fullStart); - $start = $fullStart = $pos; - break; - } - } - - $arr[] = new Token(TokenKind::EndOfFileToken, $fullStart, $start, $pos - $fullStart); - return $arr; - } - - const TOKEN_MAP = [ - T_CLASS_C => TokenKind::Name, - T_DIR => TokenKind::Name, - T_FILE => TokenKind::Name, - T_FUNC_C => TokenKind::Name, - T_HALT_COMPILER => TokenKind::Name, - T_METHOD_C => TokenKind::Name, - T_NS_C => TokenKind::Name, - T_TRAIT_C => TokenKind::Name, - T_LINE => TokenKind::Name, - - T_STRING => TokenKind::Name, - T_VARIABLE => TokenKind::VariableName, - - T_ABSTRACT => TokenKind::AbstractKeyword, - T_LOGICAL_AND => TokenKind::AndKeyword, - T_ARRAY => TokenKind::ArrayKeyword, - T_AS => TokenKind::AsKeyword, - T_BREAK => TokenKind::BreakKeyword, - T_CALLABLE => TokenKind::CallableKeyword, - T_CASE => TokenKind::CaseKeyword, - T_CATCH => TokenKind::CatchKeyword, - T_CLASS => TokenKind::ClassKeyword, - T_CLONE => TokenKind::CloneKeyword, - T_CONST => TokenKind::ConstKeyword, - T_CONTINUE => TokenKind::ContinueKeyword, - T_DECLARE => TokenKind::DeclareKeyword, - T_DEFAULT => TokenKind::DefaultKeyword, - T_DO => TokenKind::DoKeyword, - T_ECHO => TokenKind::EchoKeyword, - T_ELSE => TokenKind::ElseKeyword, - T_ELSEIF => TokenKind::ElseIfKeyword, - T_EMPTY => TokenKind::EmptyKeyword, - T_ENDDECLARE => TokenKind::EndDeclareKeyword, - T_ENDFOR => TokenKind::EndForKeyword, - T_ENDFOREACH => TokenKind::EndForEachKeyword, - T_ENDIF => TokenKind::EndIfKeyword, - T_ENDSWITCH => TokenKind::EndSwitchKeyword, - T_ENDWHILE => TokenKind::EndWhileKeyword, - T_EVAL => TokenKind::EvalKeyword, - T_EXIT => TokenKind::ExitKeyword, - T_EXTENDS => TokenKind::ExtendsKeyword, - T_FINAL => TokenKind::FinalKeyword, - T_FINALLY => TokenKind::FinallyKeyword, - T_FOR => TokenKind::ForKeyword, - T_FOREACH => TokenKind::ForeachKeyword, - T_FUNCTION => TokenKind::FunctionKeyword, - T_GLOBAL => TokenKind::GlobalKeyword, - T_GOTO => TokenKind::GotoKeyword, - T_IF => TokenKind::IfKeyword, - T_IMPLEMENTS => TokenKind::ImplementsKeyword, - T_INCLUDE => TokenKind::IncludeKeyword, - T_INCLUDE_ONCE => TokenKind::IncludeOnceKeyword, - T_INSTANCEOF => TokenKind::InstanceOfKeyword, - T_INSTEADOF => TokenKind::InsteadOfKeyword, - T_INTERFACE => TokenKind::InterfaceKeyword, - T_ISSET => TokenKind::IsSetKeyword, - T_LIST => TokenKind::ListKeyword, - T_NAMESPACE => TokenKind::NamespaceKeyword, - T_NEW => TokenKind::NewKeyword, - T_LOGICAL_OR => TokenKind::OrKeyword, - T_PRINT => TokenKind::PrintKeyword, - T_PRIVATE => TokenKind::PrivateKeyword, - T_PROTECTED => TokenKind::ProtectedKeyword, - T_PUBLIC => TokenKind::PublicKeyword, - T_REQUIRE => TokenKind::RequireKeyword, - T_REQUIRE_ONCE => TokenKind::RequireOnceKeyword, - T_RETURN => TokenKind::ReturnKeyword, - T_STATIC => TokenKind::StaticKeyword, - T_SWITCH => TokenKind::SwitchKeyword, - T_THROW => TokenKind::ThrowKeyword, - T_TRAIT => TokenKind::TraitKeyword, - T_TRY => TokenKind::TryKeyword, - T_UNSET => TokenKind::UnsetKeyword, - T_USE => TokenKind::UseKeyword, - T_VAR => TokenKind::VarKeyword, - T_WHILE => TokenKind::WhileKeyword, - T_LOGICAL_XOR => TokenKind::XorKeyword, - T_YIELD => TokenKind::YieldKeyword, - T_YIELD_FROM => TokenKind::YieldFromKeyword, - - "[" => TokenKind::OpenBracketToken, - "]" => TokenKind::CloseBracketToken, - "(" => TokenKind::OpenParenToken, - ")" => TokenKind::CloseParenToken, - "{" => TokenKind::OpenBraceToken, - "}" => TokenKind::CloseBraceToken, - "." => TokenKind::DotToken, - T_OBJECT_OPERATOR => TokenKind::ArrowToken, - T_INC => TokenKind::PlusPlusToken, - T_DEC => TokenKind::MinusMinusToken, - T_POW => TokenKind::AsteriskAsteriskToken, - "*" => TokenKind::AsteriskToken, - "+" => TokenKind::PlusToken, - "-" => TokenKind::MinusToken, - "~" => TokenKind::TildeToken, - "!" => TokenKind::ExclamationToken, - "$" => TokenKind::DollarToken, - "/" => TokenKind::SlashToken, - "%" => TokenKind::PercentToken, - T_SL => TokenKind::LessThanLessThanToken, - T_SR => TokenKind::GreaterThanGreaterThanToken, - "<" => TokenKind::LessThanToken, - ">" => TokenKind::GreaterThanToken, - T_IS_SMALLER_OR_EQUAL => TokenKind::LessThanEqualsToken, - T_IS_GREATER_OR_EQUAL => TokenKind::GreaterThanEqualsToken, - T_IS_EQUAL => TokenKind::EqualsEqualsToken, - T_IS_IDENTICAL => TokenKind::EqualsEqualsEqualsToken, - T_IS_NOT_EQUAL => TokenKind::ExclamationEqualsToken, - T_IS_NOT_IDENTICAL => TokenKind::ExclamationEqualsEqualsToken, - "^" => TokenKind::CaretToken, - "|" => TokenKind::BarToken, - "&" => TokenKind::AmpersandToken, - T_BOOLEAN_AND => TokenKind::AmpersandAmpersandToken, - T_BOOLEAN_OR => TokenKind::BarBarToken, - ":" => TokenKind::ColonToken, - ";" => TokenKind::SemicolonToken, - "=" => TokenKind::EqualsToken, - T_POW_EQUAL => TokenKind::AsteriskAsteriskEqualsToken, - T_MUL_EQUAL => TokenKind::AsteriskEqualsToken, - T_DIV_EQUAL => TokenKind::SlashEqualsToken, - T_MOD_EQUAL => TokenKind::PercentEqualsToken, - T_PLUS_EQUAL => TokenKind::PlusEqualsToken, - T_MINUS_EQUAL => TokenKind::MinusEqualsToken, - T_CONCAT_EQUAL => TokenKind::DotEqualsToken, - T_SL_EQUAL => TokenKind::LessThanLessThanEqualsToken, - T_SR_EQUAL => TokenKind::GreaterThanGreaterThanEqualsToken, - T_AND_EQUAL => TokenKind::AmpersandEqualsToken, - T_XOR_EQUAL => TokenKind::CaretEqualsToken, - T_OR_EQUAL => TokenKind::BarEqualsToken, - "," => TokenKind::CommaToken, - namespace\T_COALESCE_EQUAL => TokenKind::QuestionQuestionEqualsToken, - T_COALESCE => TokenKind::QuestionQuestionToken, - T_SPACESHIP => TokenKind::LessThanEqualsGreaterThanToken, - T_ELLIPSIS => TokenKind::DotDotDotToken, - T_NS_SEPARATOR => TokenKind::BackslashToken, - T_PAAMAYIM_NEKUDOTAYIM => TokenKind::ColonColonToken, - T_DOUBLE_ARROW => TokenKind::DoubleArrowToken, // TODO missing from spec - - "@" => TokenKind::AtSymbolToken, - "`" => TokenKind::BacktickToken, - "?" => TokenKind::QuestionToken, - - T_LNUMBER => TokenKind::IntegerLiteralToken, - - T_DNUMBER => TokenKind::FloatingLiteralToken, - - T_OPEN_TAG => TokenKind::ScriptSectionStartTag, - T_OPEN_TAG_WITH_ECHO => TokenKind::ScriptSectionStartWithEchoTag, - T_CLOSE_TAG => TokenKind::ScriptSectionEndTag, - - T_INLINE_HTML => TokenKind::InlineHtml, - - "\"" => TokenKind::DoubleQuoteToken, - "'" => TokenKind::SingleQuoteToken, - T_ENCAPSED_AND_WHITESPACE => TokenKind::EncapsedAndWhitespace, - T_DOLLAR_OPEN_CURLY_BRACES => TokenKind::DollarOpenBraceToken, - T_CURLY_OPEN => TokenKind::OpenBraceDollarToken, - T_CONSTANT_ENCAPSED_STRING => TokenKind::StringLiteralToken, - - T_ARRAY_CAST => TokenKind::ArrayCastToken, - T_BOOL_CAST => TokenKind::BoolCastToken, - T_DOUBLE_CAST => TokenKind::DoubleCastToken, - T_INT_CAST => TokenKind::IntCastToken, - T_OBJECT_CAST => TokenKind::ObjectCastToken, - T_STRING_CAST => TokenKind::StringCastToken, - T_UNSET_CAST => TokenKind::UnsetCastToken, - - T_START_HEREDOC => TokenKind::HeredocStart, - T_END_HEREDOC => TokenKind::HeredocEnd, - T_STRING_VARNAME => TokenKind::StringVarname, - T_COMMENT => TokenKind::CommentToken, - T_DOC_COMMENT => TokenKind::DocCommentToken, - T_NUM_STRING => TokenKind::IntegerLiteralToken - ]; - - const PARSE_CONTEXT_TO_PREFIX = [ - ParseContext::SourceElements => "<?php " - ]; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/PositionUtilities.php b/vendor/microsoft/tolerant-php-parser/src/PositionUtilities.php deleted file mode 100644 index 6c9e2b8..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/PositionUtilities.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class PositionUtilities { - /** - * Gets a Range from 0-indexed position into $text. - - * Out of bounds positions are handled gracefully. Positions greater than the length of text length - * are resolved to the end of the text, and negative positions are resolved to the beginning. - */ - public static function getRangeFromPosition(int $pos, int $length, string $text): Range { - $start = self::getLineCharacterPositionFromPosition($pos, $text); - $end = self::getLineCharacterPositionFromPosition($pos + $length, $text); - - return new Range($start, $end); - } - - /** - * Gets 0-indexed LineCharacterPosition from 0-indexed position into $text. - * - * Out of bounds positions are handled gracefully. Positions greater than the length of text length - * are resolved to text length, and negative positions are resolved to 0. - * TODO consider throwing exception instead. - */ - public static function getLineCharacterPositionFromPosition(int $pos, string $text) : LineCharacterPosition { - $textLength = \strlen($text); - if ($pos >= $textLength) { - $pos = $textLength; - } elseif ($pos < 0) { - $pos = 0; - } - - // Start strrpos check from the character before the current character, - // in case the current character is a newline - $startAt = max(-($textLength - $pos) - 1, -$textLength); - $lastNewlinePos = \strrpos($text, "\n", $startAt); - $char = $pos - ($lastNewlinePos === false ? 0 : $lastNewlinePos + 1); - $line = $pos > 0 ? \substr_count($text, "\n", 0, $pos) : 0; - return new LineCharacterPosition($line, $char); - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Range.php b/vendor/microsoft/tolerant-php-parser/src/Range.php deleted file mode 100644 index 36acf40..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Range.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class Range { - public $start; - public $end; - - public function __construct(LineCharacterPosition $start, LineCharacterPosition $end) { - $this->start = $start; - $this->end = $end; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/ResolvedName.php b/vendor/microsoft/tolerant-php-parser/src/ResolvedName.php deleted file mode 100644 index 34acf4f..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/ResolvedName.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class ResolvedName { - private $parts = []; - - /** - * @param Token[] $tokens - */ - public static function buildName(array $tokens, $content) : ResolvedName { - $name = new ResolvedName(); - foreach ($tokens as $token) { - if ($token->kind === TokenKind::Name) { - $name->parts[] = $token->getText($content); - } - } - return $name; - } - - public function addNameParts(array $parts, $content) { - foreach ($parts as $part) { - if ($part->kind === TokenKind::Name && !($part instanceof MissingToken)) { - $this->parts[] = $part->getText($content); - } - } - } - - public function getNameParts() { - return $this->parts; - } - - public function getFullyQualifiedNameText() : string { - return join("\\", $this->parts); - } - - public function __toString() { - return $this->getFullyQualifiedNameText(); - } -} \ No newline at end of file diff --git a/vendor/microsoft/tolerant-php-parser/src/SkippedToken.php b/vendor/microsoft/tolerant-php-parser/src/SkippedToken.php deleted file mode 100644 index 4c3174d..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/SkippedToken.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class SkippedToken extends Token { - public function __construct(Token $token) { - parent::__construct($token->kind, $token->fullStart, $token->start, $token->length); - } - - public function jsonSerialize() { - return array_merge( - ["error" => $this->getTokenKindNameFromValue(TokenKind::SkippedToken)], - parent::jsonSerialize() - ); - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/TextEdit.php b/vendor/microsoft/tolerant-php-parser/src/TextEdit.php deleted file mode 100644 index a967b38..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/TextEdit.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class TextEdit { - /** @var int */ - public $start; - - /** @var int */ - public $length; - - /** @var string */ - public $content; - - public function __construct(int $start, int $length, string $content) { - $this->start = $start; - $this->length = $length; - $this->content = $content; - } - - /** - * Applies array of edits to the document, and returns the resulting text. - * Supplied $edits must not overlap, and be ordered by increasing start position. - * - * Note that after applying edits, the original AST should be invalidated. - * - * @param TextEdit[] $edits - * @param string $text - * @return string - */ - public static function applyEdits(array $edits, string $text) : string { - $prevEditStart = PHP_INT_MAX; - for ($i = \count($edits) - 1; $i >= 0; $i--) { - $edit = $edits[$i]; - \assert( - $prevEditStart > $edit->start && $prevEditStart > $edit->start + $edit->length, - "Supplied TextEdit[] must not overlap, and be in increasing start position order." - ); - if ($edit->start < 0 || $edit->length < 0 || $edit->start + $edit->length > \strlen($text)) { - throw new \OutOfBoundsException("Applied TextEdit range out of bounds."); - } - $prevEditStart = $edit->start; - $head = \substr($text, 0, $edit->start); - $tail = \substr($text, $edit->start + $edit->length); - $text = $head . $edit->content . $tail; - } - return $text; - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/Token.php b/vendor/microsoft/tolerant-php-parser/src/Token.php deleted file mode 100644 index f746e8a..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/Token.php +++ /dev/null @@ -1,134 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -use function substr; - -class Token implements \JsonSerializable { - // TODO optimize memory - ideally this would be a struct of 4 ints - /** @var int */ - public $kind; - /** @var int */ - public $fullStart; - /** @var int */ - public $start; - /** @var int */ - public $length; - - /** - * @param int $kind - * @param int $fullStart - * @param int $start - * @param int $length - */ - public function __construct($kind, $fullStart, $start, $length) { - $this->kind = $kind; - $this->fullStart = $fullStart; - $this->start = $start; - $this->length = $length; - } - - public function getLeadingCommentsAndWhitespaceText(string $document) : string { - return substr($document, $this->fullStart, $this->start - $this->fullStart); - } - - /** - * @param string|null $document - * @return bool|null|string - */ - public function getText(string $document = null) { - if ($document === null) { - return null; - } - return substr($document, $this->start, $this->length - ($this->start - $this->fullStart)); - } - - public function getFullText(string $document) : string { - return substr($document, $this->fullStart, $this->length); - } - - /** - * @return int - */ - public function getStartPosition() { - return $this->start; - } - - /** - * @return int - */ - public function getFullStart() { - return $this->fullStart; - } - - /** - * @return int - */ - public function getWidth() { - return $this->length + $this->fullStart - $this->start; - } - - /** - * @return int - */ - public function getFullWidth() { - return $this->length; - } - - /** - * @return int - */ - public function getEndPosition() { - return $this->fullStart + $this->length; - } - - /** - * @return string[] - A hash map of the format [int $tokenKind => string $tokenName] - */ - private static function getTokenKindNameFromValueMap() { - static $mapToKindName; - if ($mapToKindName === null) { - $constants = (new \ReflectionClass("Microsoft\\PhpParser\\TokenKind"))->getConstants(); - $mapToKindName = \array_flip($constants); - } - return $mapToKindName; - } - - /** - * Returns the token kind name as a string, or the token number if the name - * was not found. - * - * @param int $kind - * @return int|string - */ - public static function getTokenKindNameFromValue($kind) { - $mapToKindName = self::getTokenKindNameFromValueMap(); - return $mapToKindName[$kind] ?? $kind; - } - - public function jsonSerialize() { - $kindName = $this->getTokenKindNameFromValue($this->kind); - - if (!isset($GLOBALS["SHORT_TOKEN_SERIALIZE"])) { - $GLOBALS["SHORT_TOKEN_SERIALIZE"] = false; - } - - if ($GLOBALS["SHORT_TOKEN_SERIALIZE"]) { - return [ - "kind" => $kindName, - "textLength" => $this->length - ($this->start - $this->fullStart) - ]; - } else { - return [ - "kind" => $kindName, - "fullStart" => $this->fullStart, - "start" => $this->start, - "length" => $this->length - ]; - } - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/TokenKind.php b/vendor/microsoft/tolerant-php-parser/src/TokenKind.php deleted file mode 100644 index 9ecd3be..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/TokenKind.php +++ /dev/null @@ -1,213 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class TokenKind { - const Unknown = 0; - const EndOfFileToken = 1; - - const Name = 2; - const VariableName = 3; - - const SkippedToken = 4; - const MissingToken = 5; - const QualifiedName = 6; - - - const AbstractKeyword = 101; - const AndKeyword = 102; - const ArrayKeyword = 103; - const AsKeyword = 104; - const BreakKeyword = 105; - const CallableKeyword = 106; - const CaseKeyword = 107; - const CatchKeyword = 108; - const ClassKeyword = 109; - const CloneKeyword = 110; - const ConstKeyword = 111; - const ContinueKeyword = 112; - const DeclareKeyword = 113; - const DefaultKeyword = 114; - const DieKeyword = 115; - const DoKeyword = 116; - const EchoKeyword = 117; - const ElseKeyword = 118; - const ElseIfKeyword = 119; - const EmptyKeyword = 120; - const EndDeclareKeyword = 121; - const EndForKeyword = 122; - const EndForEachKeyword = 123; - const EndIfKeyword = 124; - const EndSwitchKeyword = 125; - const EndWhileKeyword = 126; - const EvalKeyword = 127; - const ExitKeyword = 128; - const ExtendsKeyword = 129; - const FinalKeyword = 130; - const FinallyKeyword = 131; - const ForKeyword = 132; - const ForeachKeyword = 133; - const FunctionKeyword = 134; - const GlobalKeyword = 135; - const GotoKeyword = 136; - const IfKeyword = 137; - const ImplementsKeyword = 138; - const IncludeKeyword = 139; - const IncludeOnceKeyword = 140; - const InstanceOfKeyword = 141; - const InsteadOfKeyword = 142; - const InterfaceKeyword = 143; - const IsSetKeyword = 144; - const ListKeyword = 145; - const NamespaceKeyword = 146; - const NewKeyword = 147; - const OrKeyword = 148; - const PrintKeyword = 149; - const PrivateKeyword = 150; - const ProtectedKeyword = 151; - const PublicKeyword = 152; - const RequireKeyword = 153; - const RequireOnceKeyword = 154; - const ReturnKeyword = 155; - const StaticKeyword = 156; - const SwitchKeyword = 157; - const ThrowKeyword = 158; - const TraitKeyword = 159; - const TryKeyword = 160; - const UnsetKeyword = 161; - const UseKeyword = 162; - const VarKeyword = 163; - const WhileKeyword = 164; - const XorKeyword = 165; - const YieldKeyword = 166; - const YieldFromKeyword = 167; - - const OpenBracketToken = 201; - const CloseBracketToken = 202; - const OpenParenToken = 203; - const CloseParenToken = 204; - const OpenBraceToken = 205; - const CloseBraceToken = 206; - const DotToken = 207; - const ArrowToken = 208; - const PlusPlusToken = 209; - const MinusMinusToken = 210; - const AsteriskAsteriskToken = 211; - const AsteriskToken = 212; - const PlusToken = 213; - const MinusToken = 214; - const TildeToken = 215; - const ExclamationToken = 216; - const DollarToken = 217; - const SlashToken = 218; - const PercentToken = 220; - const LessThanLessThanToken = 221; - const GreaterThanGreaterThanToken = 222; - const LessThanToken = 223; - const GreaterThanToken = 224; - const LessThanEqualsToken = 225; - const GreaterThanEqualsToken = 226; - const EqualsEqualsToken = 227; - const EqualsEqualsEqualsToken = 228; - const ExclamationEqualsToken = 229; - const ExclamationEqualsEqualsToken = 230; - const CaretToken = 231; - const BarToken = 232; - const AmpersandToken = 233; - const AmpersandAmpersandToken = 234; - const BarBarToken = 235; - const ColonToken = 236; - const SemicolonToken = 237; - const EqualsToken = 238; - const AsteriskAsteriskEqualsToken = 239; - const AsteriskEqualsToken = 240; - const SlashEqualsToken = 241; - const PercentEqualsToken = 242; - const PlusEqualsToken = 243; - const MinusEqualsToken = 244; - const DotEqualsToken = 245; - const LessThanLessThanEqualsToken = 246; - const GreaterThanGreaterThanEqualsToken = 247; - const AmpersandEqualsToken = 248; - const CaretEqualsToken = 249; - const BarEqualsToken = 250; - const CommaToken = 251; - const QuestionQuestionToken = 252; - const LessThanEqualsGreaterThanToken = 253; - const DotDotDotToken = 254; - const BackslashToken = 255; - const ColonColonToken = 256; - const DoubleArrowToken = 257; // TODO missing from spec - const LessThanGreaterThanToken = 258; // TODO missing from spec - const AtSymbolToken = 259; - const BacktickToken = 260; - const QuestionToken = 261; - const QuestionQuestionEqualsToken = 262; - - const DecimalLiteralToken = 301; - const OctalLiteralToken = 302; - const HexadecimalLiteralToken = 303; - const BinaryLiteralToken = 304; - const FloatingLiteralToken = 305; - const InvalidOctalLiteralToken = 306; - const InvalidHexadecimalLiteral = 307; - const InvalidBinaryLiteral = 308; - const StringLiteralToken = 309; - - // RESERVED WORDS - const IntReservedWord = 317; - const FloatReservedWord = 318; - const TrueReservedWord = 319; - const StringReservedWord = 320; - const BoolReservedWord = 321; - const NullReservedWord = 322; - - const ScriptSectionStartTag = 323; - const ScriptSectionEndTag = 324; - const ScriptSectionStartWithEchoTag = 419; - - // TODO how to handle incremental parsing w/ this? - const ScriptSectionPrependedText = 325; - const VoidReservedWord = 326; - const FalseReservedWord = 327; - - const MemberName = 328; - const Expression = 329; - - const BinaryReservedWord = 330; // TODO better way - const BooleanReservedWord = 331; - const DoubleReservedWord = 332; - const IntegerReservedWord = 333; - const ObjectReservedWord = 334; - const RealReservedWord = 335; - const ReturnType = 336; - const InlineHtml = 337; - const PropertyType = 338; - -// const DollarOpenCurly = 339; - const EncapsedAndWhitespace = 400; - const SingleQuoteToken = 401; - const DoubleQuoteToken = 402; - const DollarOpenBraceToken = 403; - const OpenBraceDollarToken = 404; - const CastToken = 405; - const HeredocStart = 406; - const HeredocEnd = 407; - const StringVarname = 408; - const UnsetCastToken = 409; - const StringCastToken = 410; - const ObjectCastToken = 411; - const IntCastToken = 412; - const DoubleCastToken = 413; - const BoolCastToken = 414; - const ArrayCastToken = 415; - const IntegerLiteralToken = 416; - const CommentToken = 417; - const DocCommentToken = 418; - - // TODO type annotations - PHP7 -} diff --git a/vendor/microsoft/tolerant-php-parser/src/TokenStreamProviderFactory.php b/vendor/microsoft/tolerant-php-parser/src/TokenStreamProviderFactory.php deleted file mode 100644 index c5dbb1c..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/TokenStreamProviderFactory.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -class TokenStreamProviderFactory { - public static function GetTokenStreamProvider($content) { - // return new Lexer($content); - return new PhpTokenizer($content); - } -} diff --git a/vendor/microsoft/tolerant-php-parser/src/TokenStreamProviderInterface.php b/vendor/microsoft/tolerant-php-parser/src/TokenStreamProviderInterface.php deleted file mode 100644 index 882291f..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/TokenStreamProviderInterface.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -interface TokenStreamProviderInterface { - public function scanNextToken() : Token; - - public function getCurrentPosition() : int; - - public function setCurrentPosition(int $pos); - - public function getEndOfFilePosition() : int; - - public function getTokensArray() : array; -} diff --git a/vendor/microsoft/tolerant-php-parser/src/TokenStringMaps.php b/vendor/microsoft/tolerant-php-parser/src/TokenStringMaps.php deleted file mode 100644 index 9468274..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/TokenStringMaps.php +++ /dev/null @@ -1,183 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -namespace Microsoft\PhpParser; - -use Microsoft\PhpParser\TokenKind; - -class TokenStringMaps { - const KEYWORDS = array( - "abstract" => TokenKind::AbstractKeyword, - "and" => TokenKind::AndKeyword, - "array" => TokenKind::ArrayKeyword, - "as" => TokenKind::AsKeyword, - "break" => TokenKind::BreakKeyword, - "callable" => TokenKind::CallableKeyword, - "case" => TokenKind::CaseKeyword, - "catch" => TokenKind::CatchKeyword, - "class" => TokenKind::ClassKeyword, - "clone" => TokenKind::CloneKeyword, - "const" => TokenKind::ConstKeyword, - "continue" => TokenKind::ContinueKeyword, - "declare" => TokenKind::DeclareKeyword, - "default" => TokenKind::DefaultKeyword, - "die" => TokenKind::DieKeyword, - "do" => TokenKind::DoKeyword, - "echo" => TokenKind::EchoKeyword, - "else" => TokenKind::ElseKeyword, - "elseif" => TokenKind::ElseIfKeyword, - "empty" => TokenKind::EmptyKeyword, - "enddeclare" => TokenKind::EndDeclareKeyword, - "endfor" => TokenKind::EndForKeyword, - "endforeach" => TokenKind::EndForEachKeyword, - "endif" => TokenKind::EndIfKeyword, - "endswitch" => TokenKind::EndSwitchKeyword, - "endwhile" => TokenKind::EndWhileKeyword, - "eval" => TokenKind::EvalKeyword, - "exit" => TokenKind::ExitKeyword, - "extends" => TokenKind::ExtendsKeyword, - "final" => TokenKind::FinalKeyword, - "finally" => TokenKind::FinallyKeyword, - "for" => TokenKind::ForKeyword, - "foreach" => TokenKind::ForeachKeyword, - "function" => TokenKind::FunctionKeyword, - "global" => TokenKind::GlobalKeyword, - "goto" => TokenKind::GotoKeyword, - "if" => TokenKind::IfKeyword, - "implements" => TokenKind::ImplementsKeyword, - "include" => TokenKind::IncludeKeyword, - "include_once" => TokenKind::IncludeOnceKeyword, - "instanceof" => TokenKind::InstanceOfKeyword, - "insteadof" => TokenKind::InsteadOfKeyword, - "interface" => TokenKind::InterfaceKeyword, - "isset" => TokenKind::IsSetKeyword, - "list" => TokenKind::ListKeyword, - "namespace" => TokenKind::NamespaceKeyword, - "new" => TokenKind::NewKeyword, - "or" => TokenKind::OrKeyword, - "print" => TokenKind::PrintKeyword, - "private" => TokenKind::PrivateKeyword, - "protected" => TokenKind::ProtectedKeyword, - "public" => TokenKind::PublicKeyword, - "require" => TokenKind::RequireKeyword, - "require_once" => TokenKind::RequireOnceKeyword, - "return" => TokenKind::ReturnKeyword, - "static" => TokenKind::StaticKeyword, - "switch" => TokenKind::SwitchKeyword, - "throw" => TokenKind::ThrowKeyword, - "trait" => TokenKind::TraitKeyword, - "try" => TokenKind::TryKeyword, - "unset" => TokenKind::UnsetKeyword, - "use" => TokenKind::UseKeyword, - "var" => TokenKind::VarKeyword, - "while" => TokenKind::WhileKeyword, - "xor" => TokenKind::XorKeyword, - "yield" => TokenKind::YieldKeyword, - "yield from" => TokenKind::YieldFromKeyword, - - - // TODO soft reserved words? - ); - - const RESERVED_WORDS = [ - // http://php.net/manual/en/reserved.constants.php - // TRUE, FALSE, NULL are special predefined constants - // TODO - also consider adding other constants - "true" => TokenKind::TrueReservedWord, - "false" => TokenKind::FalseReservedWord, - "null" => TokenKind::NullReservedWord, - - // RESERVED WORDS: - // http://php.net/manual/en/reserved.other-reserved-words.php - "int" => TokenKind::IntReservedWord, - "float" => TokenKind::FloatReservedWord, - "bool" => TokenKind::BoolReservedWord, - "string" => TokenKind::StringReservedWord, - "binary" => TokenKind::BinaryReservedWord, - "boolean" => TokenKind::BooleanReservedWord, - "double" => TokenKind::DoubleReservedWord, - "integer" => TokenKind::IntegerReservedWord, - "object" => TokenKind::ObjectReservedWord, - "real" => TokenKind::RealReservedWord, - "void" => TokenKind::VoidReservedWord - ]; - - const OPERATORS_AND_PUNCTUATORS = array( - "[" => TokenKind::OpenBracketToken, - "]" => TokenKind::CloseBracketToken, - "(" => TokenKind::OpenParenToken, - ")" => TokenKind::CloseParenToken, - "{" => TokenKind::OpenBraceToken, - "}" => TokenKind::CloseBraceToken, - "." => TokenKind::DotToken, - "->" => TokenKind::ArrowToken, - "=>" => TokenKind::DoubleArrowToken, - "++" => TokenKind::PlusPlusToken, - "--" => TokenKind::MinusMinusToken, - "**" => TokenKind::AsteriskAsteriskToken, - "*" => TokenKind::AsteriskToken, - "+" => TokenKind::PlusToken, - "-" => TokenKind::MinusToken, - "~" => TokenKind::TildeToken, - "!" => TokenKind::ExclamationToken, - "$" => TokenKind::DollarToken, - "/" => TokenKind::SlashToken, - "%" => TokenKind::PercentToken, - "<<" => TokenKind::LessThanLessThanToken, - ">>" => TokenKind::GreaterThanGreaterThanToken, - "<" => TokenKind::LessThanToken, - ">" => TokenKind::GreaterThanToken, - "<=" => TokenKind::LessThanEqualsToken, - ">=" => TokenKind::GreaterThanEqualsToken, - "==" => TokenKind::EqualsEqualsToken, - "===" => TokenKind::EqualsEqualsEqualsToken, - "!=" => TokenKind::ExclamationEqualsToken, - "!==" => TokenKind::ExclamationEqualsEqualsToken, - "^" => TokenKind::CaretToken, - "|" => TokenKind::BarToken, - "&" => TokenKind::AmpersandToken, - "&&" => TokenKind::AmpersandAmpersandToken, - "||" => TokenKind::BarBarToken, - "?" => TokenKind::QuestionToken, - ":" => TokenKind::ColonToken, - "::" => TokenKind::ColonColonToken, - ";" => TokenKind::SemicolonToken, - "=" => TokenKind::EqualsToken, - "**=" => TokenKind::AsteriskAsteriskEqualsToken, - "*=" => TokenKind::AsteriskEqualsToken, - "/=" => TokenKind::SlashEqualsToken, - "%=" => TokenKind::PercentEqualsToken, - "+=" => TokenKind::PlusEqualsToken, - "-=" => TokenKind::MinusEqualsToken, - ".=" => TokenKind::DotEqualsToken, - "<<=" => TokenKind::LessThanLessThanEqualsToken, - ">>=" => TokenKind::GreaterThanGreaterThanEqualsToken, - "&=" => TokenKind::AmpersandEqualsToken, - "^=" => TokenKind::CaretEqualsToken, - "|=" => TokenKind::BarEqualsToken, - "," => TokenKind::CommaToken, - "??" => TokenKind::QuestionQuestionToken, - "??=" => TokenKind::QuestionQuestionEqualsToken, - "<=>" => TokenKind::LessThanEqualsGreaterThanToken, - "<>" => TokenKind::LessThanGreaterThanToken, - "..." => TokenKind::DotDotDotToken, - "\\" => TokenKind::BackslashToken, - "<?=" => TokenKind::ScriptSectionStartWithEchoTag, // TODO, technically not an operator - "<?php " => TokenKind::ScriptSectionStartTag, // TODO, technically not an operator - "<?php\t" => TokenKind::ScriptSectionStartTag, // TODO add tests - "<?php\n" => TokenKind::ScriptSectionStartTag, - "<?php\r" => TokenKind::ScriptSectionStartTag, - "<?php\r\n" => TokenKind::ScriptSectionStartTag, - "?>" => TokenKind::ScriptSectionEndTag, // TODO, technically not an operator - "?>\n" => TokenKind::ScriptSectionEndTag, // TODO, technically not an operator - "?>\r\n" => TokenKind::ScriptSectionEndTag, // TODO, technically not an operator - "?>\r" => TokenKind::ScriptSectionEndTag, // TODO, technically not an operator - "@" => TokenKind::AtSymbolToken, // TODO not in spec - "`" => TokenKind::BacktickToken - ); - -// TODO add new tokens -} diff --git a/vendor/microsoft/tolerant-php-parser/src/bootstrap.php b/vendor/microsoft/tolerant-php-parser/src/bootstrap.php deleted file mode 100644 index 821c544..0000000 --- a/vendor/microsoft/tolerant-php-parser/src/bootstrap.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -spl_autoload_register(function ($class) { - $path = str_replace("\\", "/", __DIR__ . "/" . \substr($class, 20) . ".php"); - if (file_exists($path)) { - require_once $path; - } -}); diff --git a/vendor/myclabs/deep-copy/.github/FUNDING.yml b/vendor/myclabs/deep-copy/.github/FUNDING.yml deleted file mode 100644 index b8da664..0000000 --- a/vendor/myclabs/deep-copy/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# These are supported funding model platforms - -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: "packagist/myclabs/deep-copy" -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/vendor/myclabs/deep-copy/LICENSE b/vendor/myclabs/deep-copy/LICENSE deleted file mode 100644 index c3e8350..0000000 --- a/vendor/myclabs/deep-copy/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 My C-Sense - -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/myclabs/deep-copy/README.md b/vendor/myclabs/deep-copy/README.md deleted file mode 100644 index 007ad5b..0000000 --- a/vendor/myclabs/deep-copy/README.md +++ /dev/null @@ -1,375 +0,0 @@ -# DeepCopy - -DeepCopy helps you create deep copies (clones) of your objects. It is designed to handle cycles in the association graph. - -[![Build Status](https://travis-ci.org/myclabs/DeepCopy.png?branch=1.x)](https://travis-ci.org/myclabs/DeepCopy) -[![Coverage Status](https://coveralls.io/repos/myclabs/DeepCopy/badge.png?branch=1.x)](https://coveralls.io/r/myclabs/DeepCopy?branch=1.x) -[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/myclabs/DeepCopy/badges/quality-score.png?s=2747100c19b275f93a777e3297c6c12d1b68b934)](https://scrutinizer-ci.com/g/myclabs/DeepCopy/) -[![Total Downloads](https://poser.pugx.org/myclabs/deep-copy/downloads.svg)](https://packagist.org/packages/myclabs/deep-copy) - -## Table of Contents - -1. [How](#how) -1. [Why](#why) - 1. [Using simply `clone`](#using-simply-clone) - 1. [Overridding `__clone()`](#overridding-__clone) - 1. [With `DeepCopy`](#with-deepcopy) -1. [How it works](#how-it-works) -1. [Going further](#going-further) - 1. [Matchers](#matchers) - 1. [Property name](#property-name) - 1. [Specific property](#specific-property) - 1. [Type](#type) - 1. [Filters](#filters) - 1. [`SetNullFilter`](#setnullfilter-filter) - 1. [`KeepFilter`](#keepfilter-filter) - 1. [`DoctrineCollectionFilter`](#doctrinecollectionfilter-filter) - 1. [`DoctrineEmptyCollectionFilter`](#doctrineemptycollectionfilter-filter) - 1. [`DoctrineProxyFilter`](#doctrineproxyfilter-filter) - 1. [`ReplaceFilter`](#replacefilter-type-filter) - 1. [`ShallowCopyFilter`](#shallowcopyfilter-type-filter) -1. [Edge cases](#edge-cases) -1. [Contributing](#contributing) - 1. [Tests](#tests) - - -## How? - -Install with Composer: - -```json -composer require myclabs/deep-copy -``` - -Use simply: - -```php -use DeepCopy\DeepCopy; - -$copier = new DeepCopy(); -$myCopy = $copier->copy($myObject); -``` - - -## Why? - -- How do you create copies of your objects? - -```php -$myCopy = clone $myObject; -``` - -- How do you create **deep** copies of your objects (i.e. copying also all the objects referenced in the properties)? - -You use [`__clone()`](http://www.php.net/manual/en/language.oop5.cloning.php#object.clone) and implement the behavior -yourself. - -- But how do you handle **cycles** in the association graph? - -Now you're in for a big mess :( - -![association graph](doc/graph.png) - - -### Using simply `clone` - -![Using clone](doc/clone.png) - - -### Overridding `__clone()` - -![Overridding __clone](doc/deep-clone.png) - - -### With `DeepCopy` - -![With DeepCopy](doc/deep-copy.png) - - -## How it works - -DeepCopy recursively traverses all the object's properties and clones them. To avoid cloning the same object twice it -keeps a hash map of all instances and thus preserves the object graph. - -To use it: - -```php -use function DeepCopy\deep_copy; - -$copy = deep_copy($var); -``` - -Alternatively, you can create your own `DeepCopy` instance to configure it differently for example: - -```php -use DeepCopy\DeepCopy; - -$copier = new DeepCopy(true); - -$copy = $copier->copy($var); -``` - -You may want to roll your own deep copy function: - -```php -namespace Acme; - -use DeepCopy\DeepCopy; - -function deep_copy($var) -{ - static $copier = null; - - if (null === $copier) { - $copier = new DeepCopy(true); - } - - return $copier->copy($var); -} -``` - - -## Going further - -You can add filters to customize the copy process. - -The method to add a filter is `DeepCopy\DeepCopy::addFilter($filter, $matcher)`, -with `$filter` implementing `DeepCopy\Filter\Filter` -and `$matcher` implementing `DeepCopy\Matcher\Matcher`. - -We provide some generic filters and matchers. - - -### Matchers - - - `DeepCopy\Matcher` applies on a object attribute. - - `DeepCopy\TypeMatcher` applies on any element found in graph, including array elements. - - -#### Property name - -The `PropertyNameMatcher` will match a property by its name: - -```php -use DeepCopy\Matcher\PropertyNameMatcher; - -// Will apply a filter to any property of any objects named "id" -$matcher = new PropertyNameMatcher('id'); -``` - - -#### Specific property - -The `PropertyMatcher` will match a specific property of a specific class: - -```php -use DeepCopy\Matcher\PropertyMatcher; - -// Will apply a filter to the property "id" of any objects of the class "MyClass" -$matcher = new PropertyMatcher('MyClass', 'id'); -``` - - -#### Type - -The `TypeMatcher` will match any element by its type (instance of a class or any value that could be parameter of -[gettype()](http://php.net/manual/en/function.gettype.php) function): - -```php -use DeepCopy\TypeMatcher\TypeMatcher; - -// Will apply a filter to any object that is an instance of Doctrine\Common\Collections\Collection -$matcher = new TypeMatcher('Doctrine\Common\Collections\Collection'); -``` - - -### Filters - -- `DeepCopy\Filter` applies a transformation to the object attribute matched by `DeepCopy\Matcher` -- `DeepCopy\TypeFilter` applies a transformation to any element matched by `DeepCopy\TypeMatcher` - - -#### `SetNullFilter` (filter) - -Let's say for example that you are copying a database record (or a Doctrine entity), so you want the copy not to have -any ID: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\SetNullFilter; -use DeepCopy\Matcher\PropertyNameMatcher; - -$object = MyClass::load(123); -echo $object->id; // 123 - -$copier = new DeepCopy(); -$copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id')); - -$copy = $copier->copy($object); - -echo $copy->id; // null -``` - - -#### `KeepFilter` (filter) - -If you want a property to remain untouched (for example, an association to an object): - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\KeepFilter; -use DeepCopy\Matcher\PropertyMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category')); - -$copy = $copier->copy($object); -// $copy->category has not been touched -``` - - -#### `DoctrineCollectionFilter` (filter) - -If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter; -use DeepCopy\Matcher\PropertyTypeMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection')); - -$copy = $copier->copy($object); -``` - - -#### `DoctrineEmptyCollectionFilter` (filter) - -If you use Doctrine and want to copy an entity who contains a `Collection` that you want to be reset, you can use the -`DoctrineEmptyCollectionFilter` - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\Doctrine\DoctrineEmptyCollectionFilter; -use DeepCopy\Matcher\PropertyMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty')); - -$copy = $copier->copy($object); - -// $copy->myProperty will return an empty collection -``` - - -#### `DoctrineProxyFilter` (filter) - -If you use Doctrine and use cloning on lazy loaded entities, you might encounter errors mentioning missing fields on a -Doctrine proxy class (...\\\_\_CG\_\_\Proxy). -You can use the `DoctrineProxyFilter` to load the actual entity behind the Doctrine proxy class. -**Make sure, though, to put this as one of your very first filters in the filter chain so that the entity is loaded -before other filters are applied!** - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\Doctrine\DoctrineProxyFilter; -use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new DoctrineProxyFilter(), new DoctrineProxyMatcher()); - -$copy = $copier->copy($object); - -// $copy should now contain a clone of all entities, including those that were not yet fully loaded. -``` - - -#### `ReplaceFilter` (type filter) - -1. If you want to replace the value of a property: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\ReplaceFilter; -use DeepCopy\Matcher\PropertyMatcher; - -$copier = new DeepCopy(); -$callback = function ($currentValue) { - return $currentValue . ' (copy)' -}; -$copier->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title')); - -$copy = $copier->copy($object); - -// $copy->title will contain the data returned by the callback, e.g. 'The title (copy)' -``` - -2. If you want to replace whole element: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\TypeFilter\ReplaceFilter; -use DeepCopy\TypeMatcher\TypeMatcher; - -$copier = new DeepCopy(); -$callback = function (MyClass $myClass) { - return get_class($myClass); -}; -$copier->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass')); - -$copy = $copier->copy([new MyClass, 'some string', new MyClass]); - -// $copy will contain ['MyClass', 'some string', 'MyClass'] -``` - - -The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable. - - -#### `ShallowCopyFilter` (type filter) - -Stop *DeepCopy* from recursively copying element, using standard `clone` instead: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\TypeFilter\ShallowCopyFilter; -use DeepCopy\TypeMatcher\TypeMatcher; -use Mockery as m; - -$this->deepCopy = new DeepCopy(); -$this->deepCopy->addTypeFilter( - new ShallowCopyFilter, - new TypeMatcher(m\MockInterface::class) -); - -$myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class)); -// All mocks will be just cloned, not deep copied -``` - - -## Edge cases - -The following structures cannot be deep-copied with PHP Reflection. As a result they are shallow cloned and filters are -not applied. There is two ways for you to handle them: - -- Implement your own `__clone()` method -- Use a filter with a type matcher - - -## Contributing - -DeepCopy is distributed under the MIT license. - - -### Tests - -Running the tests is simple: - -```php -vendor/bin/phpunit -``` - -### Support - -Get professional support via [the Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-myclabs-deep-copy?utm_source=packagist-myclabs-deep-copy&utm_medium=referral&utm_campaign=readme). diff --git a/vendor/myclabs/deep-copy/composer.json b/vendor/myclabs/deep-copy/composer.json deleted file mode 100644 index 45656c9..0000000 --- a/vendor/myclabs/deep-copy/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "myclabs/deep-copy", - "type": "library", - "description": "Create deep copies (clones) of your objects", - "keywords": ["clone", "copy", "duplicate", "object", "object graph"], - "license": "MIT", - - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "autoload-dev": { - "psr-4": { - "DeepCopy\\": "fixtures/", - "DeepCopyTest\\": "tests/DeepCopyTest/" - } - }, - - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - - "config": { - "sort-packages": true - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php b/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php deleted file mode 100644 index 15e5c68..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php +++ /dev/null @@ -1,298 +0,0 @@ -<?php - -namespace DeepCopy; - -use ArrayObject; -use DateInterval; -use DateTimeInterface; -use DateTimeZone; -use DeepCopy\Exception\CloneException; -use DeepCopy\Filter\Filter; -use DeepCopy\Matcher\Matcher; -use DeepCopy\Reflection\ReflectionHelper; -use DeepCopy\TypeFilter\Date\DateIntervalFilter; -use DeepCopy\TypeFilter\Spl\ArrayObjectFilter; -use DeepCopy\TypeFilter\Spl\SplDoublyLinkedListFilter; -use DeepCopy\TypeFilter\TypeFilter; -use DeepCopy\TypeMatcher\TypeMatcher; -use ReflectionObject; -use ReflectionProperty; -use SplDoublyLinkedList; - -/** - * @final - */ -class DeepCopy -{ - /** - * @var object[] List of objects copied. - */ - private $hashMap = []; - - /** - * Filters to apply. - * - * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - */ - private $filters = []; - - /** - * Type Filters to apply. - * - * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - */ - private $typeFilters = []; - - /** - * @var bool - */ - private $skipUncloneable = false; - - /** - * @var bool - */ - private $useCloneMethod; - - /** - * @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used - * instead of the regular deep cloning. - */ - public function __construct($useCloneMethod = false) - { - $this->useCloneMethod = $useCloneMethod; - - $this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); - $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); - $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); - } - - /** - * If enabled, will not throw an exception when coming across an uncloneable property. - * - * @param $skipUncloneable - * - * @return $this - */ - public function skipUncloneable($skipUncloneable = true) - { - $this->skipUncloneable = $skipUncloneable; - - return $this; - } - - /** - * Deep copies the given object. - * - * @param mixed $object - * - * @return mixed - */ - public function copy($object) - { - $this->hashMap = []; - - return $this->recursiveCopy($object); - } - - public function addFilter(Filter $filter, Matcher $matcher) - { - $this->filters[] = [ - 'matcher' => $matcher, - 'filter' => $filter, - ]; - } - - public function prependFilter(Filter $filter, Matcher $matcher) - { - array_unshift($this->filters, [ - 'matcher' => $matcher, - 'filter' => $filter, - ]); - } - - public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) - { - $this->typeFilters[] = [ - 'matcher' => $matcher, - 'filter' => $filter, - ]; - } - - private function recursiveCopy($var) - { - // Matches Type Filter - if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { - return $filter->apply($var); - } - - // Resource - if (is_resource($var)) { - return $var; - } - - // Array - if (is_array($var)) { - return $this->copyArray($var); - } - - // Scalar - if (! is_object($var)) { - return $var; - } - - // Object - return $this->copyObject($var); - } - - /** - * Copy an array - * @param array $array - * @return array - */ - private function copyArray(array $array) - { - foreach ($array as $key => $value) { - $array[$key] = $this->recursiveCopy($value); - } - - return $array; - } - - /** - * Copies an object. - * - * @param object $object - * - * @throws CloneException - * - * @return object - */ - private function copyObject($object) - { - $objectHash = spl_object_hash($object); - - if (isset($this->hashMap[$objectHash])) { - return $this->hashMap[$objectHash]; - } - - $reflectedObject = new ReflectionObject($object); - $isCloneable = $reflectedObject->isCloneable(); - - if (false === $isCloneable) { - if ($this->skipUncloneable) { - $this->hashMap[$objectHash] = $object; - - return $object; - } - - throw new CloneException( - sprintf( - 'The class "%s" is not cloneable.', - $reflectedObject->getName() - ) - ); - } - - $newObject = clone $object; - $this->hashMap[$objectHash] = $newObject; - - if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { - return $newObject; - } - - if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { - return $newObject; - } - - foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { - $this->copyObjectProperty($newObject, $property); - } - - return $newObject; - } - - private function copyObjectProperty($object, ReflectionProperty $property) - { - // Ignore static properties - if ($property->isStatic()) { - return; - } - - // Apply the filters - foreach ($this->filters as $item) { - /** @var Matcher $matcher */ - $matcher = $item['matcher']; - /** @var Filter $filter */ - $filter = $item['filter']; - - if ($matcher->matches($object, $property->getName())) { - $filter->apply( - $object, - $property->getName(), - function ($object) { - return $this->recursiveCopy($object); - } - ); - - // If a filter matches, we stop processing this property - return; - } - } - - $property->setAccessible(true); - - // Ignore uninitialized properties (for PHP >7.4) - if (method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { - return; - } - - $propertyValue = $property->getValue($object); - - // Copy the property - $property->setValue($object, $this->recursiveCopy($propertyValue)); - } - - /** - * Returns first filter that matches variable, `null` if no such filter found. - * - * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and - * 'matcher' with value of type {@see TypeMatcher} - * @param mixed $var - * - * @return TypeFilter|null - */ - private function getFirstMatchedTypeFilter(array $filterRecords, $var) - { - $matched = $this->first( - $filterRecords, - function (array $record) use ($var) { - /* @var TypeMatcher $matcher */ - $matcher = $record['matcher']; - - return $matcher->matches($var); - } - ); - - return isset($matched) ? $matched['filter'] : null; - } - - /** - * Returns first element that matches predicate, `null` if no such element found. - * - * @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - * @param callable $predicate Predicate arguments are: element. - * - * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' - * with value of type {@see TypeMatcher} or `null`. - */ - private function first(array $elements, callable $predicate) - { - foreach ($elements as $element) { - if (call_user_func($predicate, $element)) { - return $element; - } - } - - return null; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php deleted file mode 100644 index c046706..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -namespace DeepCopy\Exception; - -use UnexpectedValueException; - -class CloneException extends UnexpectedValueException -{ -} \ No newline at end of file diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php deleted file mode 100644 index 9702101..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -namespace DeepCopy\Exception; - -use ReflectionException; - -class PropertyException extends ReflectionException -{ -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php deleted file mode 100644 index e6d9377..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -namespace DeepCopy\Filter\Doctrine; - -use DeepCopy\Filter\Filter; -use DeepCopy\Reflection\ReflectionHelper; - -/** - * @final - */ -class DoctrineCollectionFilter implements Filter -{ - /** - * Copies the object property doctrine collection. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - - $reflectionProperty->setAccessible(true); - $oldCollection = $reflectionProperty->getValue($object); - - $newCollection = $oldCollection->map( - function ($item) use ($objectCopier) { - return $objectCopier($item); - } - ); - - $reflectionProperty->setValue($object, $newCollection); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php deleted file mode 100644 index 7b33fd5..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -namespace DeepCopy\Filter\Doctrine; - -use DeepCopy\Filter\Filter; -use DeepCopy\Reflection\ReflectionHelper; -use Doctrine\Common\Collections\ArrayCollection; - -/** - * @final - */ -class DoctrineEmptyCollectionFilter implements Filter -{ - /** - * Sets the object property to an empty doctrine collection. - * - * @param object $object - * @param string $property - * @param callable $objectCopier - */ - public function apply($object, $property, $objectCopier) - { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - $reflectionProperty->setAccessible(true); - - $reflectionProperty->setValue($object, new ArrayCollection()); - } -} \ No newline at end of file diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php deleted file mode 100644 index 8bee8f7..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -namespace DeepCopy\Filter\Doctrine; - -use DeepCopy\Filter\Filter; - -/** - * @final - */ -class DoctrineProxyFilter implements Filter -{ - /** - * Triggers the magic method __load() on a Doctrine Proxy class to load the - * actual entity from the database. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - $object->__load(); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php deleted file mode 100644 index 85ba18c..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php - -namespace DeepCopy\Filter; - -/** - * Filter to apply to a property while copying an object - */ -interface Filter -{ - /** - * Applies the filter to the object. - * - * @param object $object - * @param string $property - * @param callable $objectCopier - */ - public function apply($object, $property, $objectCopier); -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php deleted file mode 100644 index 4b11a08..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php - -namespace DeepCopy\Filter; - -class KeepFilter implements Filter -{ - /** - * Keeps the value of the object property. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - // Nothing to do - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php deleted file mode 100644 index 7aca593..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -namespace DeepCopy\Filter; - -use DeepCopy\Reflection\ReflectionHelper; - -/** - * @final - */ -class ReplaceFilter implements Filter -{ - /** - * @var callable - */ - protected $callback; - - /** - * @param callable $callable Will be called to get the new value for each property to replace - */ - public function __construct(callable $callable) - { - $this->callback = $callable; - } - - /** - * Replaces the object property by the result of the callback called with the object property. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - $reflectionProperty->setAccessible(true); - - $value = call_user_func($this->callback, $reflectionProperty->getValue($object)); - - $reflectionProperty->setValue($object, $value); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php deleted file mode 100644 index bea86b8..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -namespace DeepCopy\Filter; - -use DeepCopy\Reflection\ReflectionHelper; - -/** - * @final - */ -class SetNullFilter implements Filter -{ - /** - * Sets the object property to null. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($object, null); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php deleted file mode 100644 index ec8856f..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -namespace DeepCopy\Matcher\Doctrine; - -use DeepCopy\Matcher\Matcher; -use Doctrine\Common\Persistence\Proxy; - -/** - * @final - */ -class DoctrineProxyMatcher implements Matcher -{ - /** - * Matches a Doctrine Proxy class. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return $object instanceof Proxy; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php deleted file mode 100644 index d67f3ca..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php - -namespace DeepCopy\Matcher; - -interface Matcher -{ - /** - * @param object $object - * @param string $property - * - * @return boolean - */ - public function matches($object, $property); -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php deleted file mode 100644 index 073b20c..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -namespace DeepCopy\Matcher; - -/** - * @final - */ -class PropertyMatcher implements Matcher -{ - /** - * @var string - */ - private $class; - - /** - * @var string - */ - private $property; - - /** - * @param string $class Class name - * @param string $property Property name - */ - public function __construct($class, $property) - { - $this->class = $class; - $this->property = $property; - } - - /** - * Matches a specific property of a specific class. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return ($object instanceof $this->class) && $property == $this->property; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php deleted file mode 100644 index c8ec0d2..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -namespace DeepCopy\Matcher; - -/** - * @final - */ -class PropertyNameMatcher implements Matcher -{ - /** - * @var string - */ - private $property; - - /** - * @param string $property Property name - */ - public function __construct($property) - { - $this->property = $property; - } - - /** - * Matches a property by its name. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return $property == $this->property; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php deleted file mode 100644 index a6b0c0b..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php - -namespace DeepCopy\Matcher; - -use DeepCopy\Reflection\ReflectionHelper; -use ReflectionException; - -/** - * Matches a property by its type. - * - * It is recommended to use {@see DeepCopy\TypeFilter\TypeFilter} instead, as it applies on all occurrences - * of given type in copied context (eg. array elements), not just on object properties. - * - * @final - */ -class PropertyTypeMatcher implements Matcher -{ - /** - * @var string - */ - private $propertyType; - - /** - * @param string $propertyType Property type - */ - public function __construct($propertyType) - { - $this->propertyType = $propertyType; - } - - /** - * {@inheritdoc} - */ - public function matches($object, $property) - { - try { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - } catch (ReflectionException $exception) { - return false; - } - - $reflectionProperty->setAccessible(true); - - return $reflectionProperty->getValue($object) instanceof $this->propertyType; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php b/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php deleted file mode 100644 index 742410c..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php - -namespace DeepCopy\Reflection; - -use DeepCopy\Exception\PropertyException; -use ReflectionClass; -use ReflectionException; -use ReflectionObject; -use ReflectionProperty; - -class ReflectionHelper -{ - /** - * Retrieves all properties (including private ones), from object and all its ancestors. - * - * Standard \ReflectionClass->getProperties() does not return private properties from ancestor classes. - * - * @author muratyaman@gmail.com - * @see http://php.net/manual/en/reflectionclass.getproperties.php - * - * @param ReflectionClass $ref - * - * @return ReflectionProperty[] - */ - public static function getProperties(ReflectionClass $ref) - { - $props = $ref->getProperties(); - $propsArr = array(); - - foreach ($props as $prop) { - $propertyName = $prop->getName(); - $propsArr[$propertyName] = $prop; - } - - if ($parentClass = $ref->getParentClass()) { - $parentPropsArr = self::getProperties($parentClass); - foreach ($propsArr as $key => $property) { - $parentPropsArr[$key] = $property; - } - - return $parentPropsArr; - } - - return $propsArr; - } - - /** - * Retrieves property by name from object and all its ancestors. - * - * @param object|string $object - * @param string $name - * - * @throws PropertyException - * @throws ReflectionException - * - * @return ReflectionProperty - */ - public static function getProperty($object, $name) - { - $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); - - if ($reflection->hasProperty($name)) { - return $reflection->getProperty($name); - } - - if ($parentClass = $reflection->getParentClass()) { - return self::getProperty($parentClass->getName(), $name); - } - - throw new PropertyException( - sprintf( - 'The class "%s" doesn\'t have a property with the given name: "%s".', - is_object($object) ? get_class($object) : $object, - $name - ) - ); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php deleted file mode 100644 index becd1cf..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter\Date; - -use DateInterval; -use DeepCopy\TypeFilter\TypeFilter; - -/** - * @final - * - * @deprecated Will be removed in 2.0. This filter will no longer be necessary in PHP 7.1+. - */ -class DateIntervalFilter implements TypeFilter -{ - - /** - * {@inheritdoc} - * - * @param DateInterval $element - * - * @see http://news.php.net/php.bugs/205076 - */ - public function apply($element) - { - $copy = new DateInterval('P0D'); - - foreach ($element as $propertyName => $propertyValue) { - $copy->{$propertyName} = $propertyValue; - } - - return $copy; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php deleted file mode 100644 index 164f8b8..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter; - -/** - * @final - */ -class ReplaceFilter implements TypeFilter -{ - /** - * @var callable - */ - protected $callback; - - /** - * @param callable $callable Will be called to get the new value for each element to replace - */ - public function __construct(callable $callable) - { - $this->callback = $callable; - } - - /** - * {@inheritdoc} - */ - public function apply($element) - { - return call_user_func($this->callback, $element); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php deleted file mode 100644 index a5fbd7a..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter; - -/** - * @final - */ -class ShallowCopyFilter implements TypeFilter -{ - /** - * {@inheritdoc} - */ - public function apply($element) - { - return clone $element; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php deleted file mode 100644 index 1784601..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -namespace DeepCopy\TypeFilter\Spl; - -use DeepCopy\DeepCopy; -use DeepCopy\TypeFilter\TypeFilter; - -/** - * In PHP 7.4 the storage of an ArrayObject isn't returned as - * ReflectionProperty. So we deep copy its array copy. - */ -final class ArrayObjectFilter implements TypeFilter -{ - /** - * @var DeepCopy - */ - private $copier; - - public function __construct(DeepCopy $copier) - { - $this->copier = $copier; - } - - /** - * {@inheritdoc} - */ - public function apply($arrayObject) - { - $clone = clone $arrayObject; - foreach ($arrayObject->getArrayCopy() as $k => $v) { - $clone->offsetSet($k, $this->copier->copy($v)); - } - - return $clone; - } -} - diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php deleted file mode 100644 index c5644cf..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter\Spl; - -/** - * @deprecated Use {@see SplDoublyLinkedListFilter} instead. - */ -class SplDoublyLinkedList extends SplDoublyLinkedListFilter -{ -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php deleted file mode 100644 index c33be45..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter\Spl; - -use Closure; -use DeepCopy\DeepCopy; -use DeepCopy\TypeFilter\TypeFilter; -use SplDoublyLinkedList; - -/** - * @final - */ -class SplDoublyLinkedListFilter implements TypeFilter -{ - private $copier; - - public function __construct(DeepCopy $copier) - { - $this->copier = $copier; - } - - /** - * {@inheritdoc} - */ - public function apply($element) - { - $newElement = clone $element; - - $copy = $this->createCopyClosure(); - - return $copy($newElement); - } - - private function createCopyClosure() - { - $copier = $this->copier; - - $copy = function (SplDoublyLinkedList $list) use ($copier) { - // Replace each element in the list with a deep copy of itself - for ($i = 1; $i <= $list->count(); $i++) { - $copy = $copier->recursiveCopy($list->shift()); - - $list->push($copy); - } - - return $list; - }; - - return Closure::bind($copy, null, DeepCopy::class); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php deleted file mode 100644 index 5785a7d..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter; - -interface TypeFilter -{ - /** - * Applies the filter to the object. - * - * @param mixed $element - */ - public function apply($element); -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php deleted file mode 100644 index a563cb2..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - -namespace DeepCopy\TypeMatcher; - -class TypeMatcher -{ - /** - * @var string - */ - private $type; - - /** - * @param string $type - */ - public function __construct($type) - { - $this->type = $type; - } - - /** - * @param mixed $element - * - * @return boolean - */ - public function matches($element) - { - return is_object($element) ? is_a($element, $this->type) : gettype($element) === $this->type; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php b/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php deleted file mode 100644 index 55dcc92..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -namespace DeepCopy; - -use function function_exists; - -if (false === function_exists('DeepCopy\deep_copy')) { - /** - * Deep copies the given value. - * - * @param mixed $value - * @param bool $useCloneMethod - * - * @return mixed - */ - function deep_copy($value, $useCloneMethod = false) - { - return (new DeepCopy($useCloneMethod))->copy($value); - } -} diff --git a/vendor/netresearch/jsonmapper/LICENSE b/vendor/netresearch/jsonmapper/LICENSE deleted file mode 100644 index 2ebd481..0000000 --- a/vendor/netresearch/jsonmapper/LICENSE +++ /dev/null @@ -1,47 +0,0 @@ -Open Software License v. 3.0 (OSL-3.0) - -This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: - - Licensed under the Open Software License version 3.0 - -1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: - - a) to reproduce the Original Work in copies, either alone or as part of a collective work; - - b) to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; - - c) to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License; - - d) to perform the Original Work publicly; and - - e) to display the Original Work publicly. - -2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. - -3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. - -4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor’s trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. - -5) External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). - -6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. - -7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. - -8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. - -9) Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including “fair use” or “fair dealing”). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). - -10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. - -11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. - -12) Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. - -13) Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. - -14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. - -16) Modification of This License. This License is Copyright (c) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. \ No newline at end of file diff --git a/vendor/netresearch/jsonmapper/composer.json b/vendor/netresearch/jsonmapper/composer.json deleted file mode 100644 index b6d2777..0000000 --- a/vendor/netresearch/jsonmapper/composer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "netresearch/jsonmapper", - "description": "Map nested JSON structures onto PHP classes", - "license": "OSL-3.0", - "autoload": { - "psr-0": {"JsonMapper": "src/"} - }, - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues" - }, - "require":{ - "php": ">=5.6", - "ext-spl": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*" - }, - "require-dev": { - "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4 || ~7.0", - "squizlabs/php_codesniffer": "~3.5" - } -} diff --git a/vendor/netresearch/jsonmapper/contributing.rst b/vendor/netresearch/jsonmapper/contributing.rst deleted file mode 100644 index 1e40f12..0000000 --- a/vendor/netresearch/jsonmapper/contributing.rst +++ /dev/null @@ -1,13 +0,0 @@ -************************************** -How to add your features to JsonMapper -************************************** - -If you want to add a new feature or a fix to this library, please consider these aspects: - -- Respect the original code style and continue using it - it uses `PEAR Coding Standards`__. -- Pull requests fixing a bug should include a test case that illustrates the wrong behaviour. -- Pull requests adding a new feature should also include a test for the new feature. - - __ http://pear.php.net/manual/en/standards.php - -Having test cases included in your pull request greatly helps reviewing it and will increase the chance of it being merged. diff --git a/vendor/netresearch/jsonmapper/src/JsonMapper.php b/vendor/netresearch/jsonmapper/src/JsonMapper.php deleted file mode 100644 index 6977b0f..0000000 --- a/vendor/netresearch/jsonmapper/src/JsonMapper.php +++ /dev/null @@ -1,829 +0,0 @@ -<?php -/** - * Part of JsonMapper - * - * PHP version 5 - * - * @category Netresearch - * @package JsonMapper - * @author Christian Weiske <cweiske@cweiske.de> - * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 - * @link http://cweiske.de/ - */ - -/** - * Automatically map JSON structures into objects. - * - * @category Netresearch - * @package JsonMapper - * @author Christian Weiske <cweiske@cweiske.de> - * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 - * @link http://cweiske.de/ - */ -class JsonMapper -{ - /** - * PSR-3 compatible logger object - * - * @link http://www.php-fig.org/psr/psr-3/ - * @var object - * @see setLogger() - */ - protected $logger; - - /** - * Throw an exception when JSON data contain a property - * that is not defined in the PHP class - * - * @var boolean - */ - public $bExceptionOnUndefinedProperty = false; - - /** - * Throw an exception if the JSON data miss a property - * that is marked with @required in the PHP class - * - * @var boolean - */ - public $bExceptionOnMissingData = false; - - /** - * If the types of map() parameters shall be checked. - * - * You have to disable it if you're using the json_decode "assoc" parameter. - * - * json_decode($str, false) - * - * @var boolean - */ - public $bEnforceMapType = true; - - /** - * Throw an exception when an object is expected but the JSON contains - * a non-object type. - * - * @var boolean - */ - public $bStrictObjectTypeChecking = false; - - /** - * Throw an exception, if null value is found - * but the type of attribute does not allow nulls. - * - * @var bool - */ - public $bStrictNullTypes = true; - - /** - * Allow mapping of private and proteted properties. - * - * @var boolean - */ - public $bIgnoreVisibility = false; - - /** - * Remove attributes that were not passed in JSON, - * to avoid confusion between them and NULL values. - * - * @var boolean - */ - public $bRemoveUndefinedAttributes = false; - - /** - * Override class names that JsonMapper uses to create objects. - * Useful when your setter methods accept abstract classes or interfaces. - * - * @var array - */ - public $classMap = array(); - - /** - * Callback used when an undefined property is found. - * - * Works only when $bExceptionOnUndefinedProperty is disabled. - * - * Parameters to this function are: - * 1. Object that is being filled - * 2. Name of the unknown JSON property - * 3. JSON value of the property - * - * @var callable - */ - public $undefinedPropertyHandler = null; - - /** - * Runtime cache for inspected classes. This is particularly effective if - * mapArray() is called with a large number of objects - * - * @var array property inspection result cache - */ - protected $arInspectedClasses = array(); - - /** - * Method to call on each object after deserialization is done. - * - * Is only called if it exists on the object. - * - * @var string|null - */ - public $postMappingMethod = null; - - /** - * Map data all data in $json into the given $object instance. - * - * @param object $json JSON object structure from json_decode() - * @param object $object Object to map $json data into - * - * @return mixed Mapped object is returned. - * @see mapArray() - */ - public function map($json, $object) - { - if ($this->bEnforceMapType && !is_object($json)) { - throw new InvalidArgumentException( - 'JsonMapper::map() requires first argument to be an object' - . ', ' . gettype($json) . ' given.' - ); - } - if (!is_object($object)) { - throw new InvalidArgumentException( - 'JsonMapper::map() requires second argument to be an object' - . ', ' . gettype($object) . ' given.' - ); - } - - $strClassName = get_class($object); - $rc = new ReflectionClass($object); - $strNs = $rc->getNamespaceName(); - $providedProperties = array(); - foreach ($json as $key => $jvalue) { - $key = $this->getSafeName($key); - $providedProperties[$key] = true; - - // Store the property inspection results so we don't have to do it - // again for subsequent objects of the same type - if (!isset($this->arInspectedClasses[$strClassName][$key])) { - $this->arInspectedClasses[$strClassName][$key] - = $this->inspectProperty($rc, $key); - } - - list($hasProperty, $accessor, $type) - = $this->arInspectedClasses[$strClassName][$key]; - - if (!$hasProperty) { - if ($this->bExceptionOnUndefinedProperty) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" does not exist' - . ' in object of type ' . $strClassName - ); - } else if ($this->undefinedPropertyHandler !== null) { - call_user_func( - $this->undefinedPropertyHandler, - $object, $key, $jvalue - ); - } else { - $this->log( - 'info', - 'Property {property} does not exist in {class}', - array('property' => $key, 'class' => $strClassName) - ); - } - continue; - } - - if ($accessor === null) { - if ($this->bExceptionOnUndefinedProperty) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" has no public setter method' - . ' in object of type ' . $strClassName - ); - } - $this->log( - 'info', - 'Property {property} has no public setter method in {class}', - array('property' => $key, 'class' => $strClassName) - ); - continue; - } - - if ($this->isNullable($type) || !$this->bStrictNullTypes) { - if ($jvalue === null) { - $this->setProperty($object, $accessor, null); - continue; - } - $type = $this->removeNullable($type); - } else if ($jvalue === null) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" in class "' - . $strClassName . '" must not be NULL' - ); - } - - $type = $this->getFullNamespace($type, $strNs); - $type = $this->getMappedType($type, $jvalue); - - if ($type === null || $type === 'mixed') { - //no given type - simply set the json data - $this->setProperty($object, $accessor, $jvalue); - continue; - } else if ($this->isObjectOfSameType($type, $jvalue)) { - $this->setProperty($object, $accessor, $jvalue); - continue; - } else if ($this->isSimpleType($type)) { - if ($type === 'string' && is_object($jvalue)) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" in class "' - . $strClassName . '" is an object and' - . ' cannot be converted to a string' - ); - } - settype($jvalue, $type); - $this->setProperty($object, $accessor, $jvalue); - continue; - } - - //FIXME: check if type exists, give detailed error message if not - if ($type === '') { - throw new JsonMapper_Exception( - 'Empty type at property "' - . $strClassName . '::$' . $key . '"' - ); - } - - $array = null; - $subtype = null; - if ($this->isArrayOfType($type)) { - //array - $array = array(); - $subtype = substr($type, 0, -2); - } else if (substr($type, -1) == ']') { - list($proptype, $subtype) = explode('[', substr($type, 0, -1)); - if ($proptype == 'array') { - $array = array(); - } else { - $array = $this->createInstance($proptype, false, $jvalue); - } - } else { - if (is_a($type, 'ArrayObject', true)) { - $array = $this->createInstance($type, false, $jvalue); - } - } - - if ($array !== null) { - if (!is_array($jvalue) && $this->isFlatType(gettype($jvalue))) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" must be an array, ' - . gettype($jvalue) . ' given' - ); - } - - $cleanSubtype = $this->removeNullable($subtype); - $subtype = $this->getFullNamespace($cleanSubtype, $strNs); - $child = $this->mapArray($jvalue, $array, $subtype, $key); - } else if ($this->isFlatType(gettype($jvalue))) { - //use constructor parameter if we have a class - // but only a flat type (i.e. string, int) - if ($this->bStrictObjectTypeChecking) { - throw new JsonMapper_Exception( - 'JSON property "' . $key . '" must be an object, ' - . gettype($jvalue) . ' given' - ); - } - $child = $this->createInstance($type, true, $jvalue); - } else { - $child = $this->createInstance($type, false, $jvalue); - $this->map($jvalue, $child); - } - $this->setProperty($object, $accessor, $child); - } - - if ($this->bExceptionOnMissingData) { - $this->checkMissingData($providedProperties, $rc); - } - - if ($this->bRemoveUndefinedAttributes) { - $this->removeUndefinedAttributes($object, $providedProperties); - } - - if ($this->postMappingMethod !== null - && $rc->hasMethod($this->postMappingMethod) - ) { - $refDeserializePostMethod = $rc->getMethod( - $this->postMappingMethod - ); - $refDeserializePostMethod->setAccessible(true); - $refDeserializePostMethod->invoke($object); - } - - return $object; - } - - /** - * Convert a type name to a fully namespaced type name. - * - * @param string $type Type name (simple type or class name) - * @param string $strNs Base namespace that gets prepended to the type name - * - * @return string Fully-qualified type name with namespace - */ - protected function getFullNamespace($type, $strNs) - { - if ($type === null || $type === '' || $type[0] == '\\' - || $strNs == '' - ) { - return $type; - } - list($first) = explode('[', $type, 2); - if ($this->isSimpleType($first) || $first === 'mixed') { - return $type; - } - - //create a full qualified namespace - return '\\' . $strNs . '\\' . $type; - } - - /** - * Check required properties exist in json - * - * @param array $providedProperties array with json properties - * @param object $rc Reflection class to check - * - * @throws JsonMapper_Exception - * - * @return void - */ - protected function checkMissingData($providedProperties, ReflectionClass $rc) - { - foreach ($rc->getProperties() as $property) { - $rprop = $rc->getProperty($property->name); - $docblock = $rprop->getDocComment(); - $annotations = $this->parseAnnotations($docblock); - if (isset($annotations['required']) - && !isset($providedProperties[$property->name]) - ) { - throw new JsonMapper_Exception( - 'Required property "' . $property->name . '" of class ' - . $rc->getName() - . ' is missing in JSON data' - ); - } - } - } - - /** - * Remove attributes from object that were not passed in JSON data. - * - * This is to avoid confusion between those that were actually passed - * as NULL, and those that weren't provided at all. - * - * @param object $object Object to remove properties from - * @param array $providedProperties Array with JSON properties - * - * @return void - */ - protected function removeUndefinedAttributes($object, $providedProperties) - { - foreach (get_object_vars($object) as $propertyName => $dummy) { - if (!isset($providedProperties[$propertyName])) { - unset($object->{$propertyName}); - } - } - } - - /** - * Map an array - * - * @param array $json JSON array structure from json_decode() - * @param mixed $array Array or ArrayObject that gets filled with - * data from $json - * @param string $class Class name for children objects. - * All children will get mapped onto this type. - * Supports class names and simple types - * like "string" and nullability "string|null". - * Pass "null" to not convert any values - * @param string $parent_key Defines the key this array belongs to - * in order to aid debugging. - * - * @return mixed Mapped $array is returned - */ - public function mapArray($json, $array, $class = null, $parent_key = '') - { - $originalClass = $class; - foreach ($json as $key => $jvalue) { - $class = $this->getMappedType($originalClass, $jvalue); - if ($class === null) { - $array[$key] = $jvalue; - } else if ($this->isArrayOfType($class)) { - $array[$key] = $this->mapArray( - $jvalue, - array(), - substr($class, 0, -2) - ); - } else if ($this->isFlatType(gettype($jvalue))) { - //use constructor parameter if we have a class - // but only a flat type (i.e. string, int) - if ($jvalue === null) { - $array[$key] = null; - } else { - if ($this->isSimpleType($class)) { - settype($jvalue, $class); - $array[$key] = $jvalue; - } else { - $array[$key] = $this->createInstance( - $class, true, $jvalue - ); - } - } - } else if ($this->isFlatType($class)) { - throw new JsonMapper_Exception( - 'JSON property "' . ($parent_key ? $parent_key : '?') . '"' - . ' is an array of type "' . $class . '"' - . ' but contained a value of type' - . ' "' . gettype($jvalue) . '"' - ); - } else if (is_a($class, 'ArrayObject', true)) { - $array[$key] = $this->mapArray( - $jvalue, - $this->createInstance($class) - ); - } else { - $array[$key] = $this->map( - $jvalue, $this->createInstance($class, false, $jvalue) - ); - } - } - return $array; - } - - /** - * Try to find out if a property exists in a given class. - * Checks property first, falls back to setter method. - * - * @param object $rc Reflection class to check - * @param string $name Property name - * - * @return array First value: if the property exists - * Second value: the accessor to use ( - * ReflectionMethod or ReflectionProperty, or null) - * Third value: type of the property - */ - protected function inspectProperty(ReflectionClass $rc, $name) - { - //try setter method first - $setter = 'set' . $this->getCamelCaseName($name); - - if ($rc->hasMethod($setter)) { - $rmeth = $rc->getMethod($setter); - if ($rmeth->isPublic() || $this->bIgnoreVisibility) { - $rparams = $rmeth->getParameters(); - if (count($rparams) > 0) { - $pclass = $rparams[0]->getClass(); - $nullability = ''; - if ($rparams[0]->allowsNull()) { - $nullability = '|null'; - } - if ($pclass !== null) { - return array( - true, $rmeth, - '\\' . $pclass->getName() . $nullability - ); - } - } - - $docblock = $rmeth->getDocComment(); - $annotations = $this->parseAnnotations($docblock); - - if (!isset($annotations['param'][0])) { - // If there is no annotations (higher priority) inspect - // if there's a scalar type being defined - if (PHP_MAJOR_VERSION >= 7) { - $ptype = $rparams[0]->getType(); - if ($ptype !== null) { - // ReflectionType::__toString() is deprecated - if (PHP_VERSION >= 7.1 - && $ptype instanceof ReflectionNamedType - ) { - $ptype = $ptype->getName(); - } - return array(true, $rmeth, $ptype . $nullability); - } - } - return array(true, $rmeth, null); - } - list($type) = explode(' ', trim($annotations['param'][0])); - return array(true, $rmeth, $type); - } - } - - //now try to set the property directly - //we have to look it up in the class hierarchy - $class = $rc; - $rprop = null; - do { - if ($class->hasProperty($name)) { - $rprop = $class->getProperty($name); - } - } while ($rprop === null && $class = $class->getParentClass()); - - if ($rprop === null) { - //case-insensitive property matching - foreach ($rc->getProperties() as $p) { - if ((strcasecmp($p->name, $name) === 0)) { - $rprop = $p; - break; - } - } - } - if ($rprop !== null) { - if ($rprop->isPublic() || $this->bIgnoreVisibility) { - $docblock = $rprop->getDocComment(); - $annotations = $this->parseAnnotations($docblock); - - if (!isset($annotations['var'][0])) { - return array(true, $rprop, null); - } - - //support "@var type description" - list($type) = explode(' ', $annotations['var'][0]); - - return array(true, $rprop, $type); - } else { - //no setter, private property - return array(true, null, null); - } - } - - //no setter, no property - return array(false, null, null); - } - - /** - * Removes - and _ and makes the next letter uppercase - * - * @param string $name Property name - * - * @return string CamelCasedVariableName - */ - protected function getCamelCaseName($name) - { - return str_replace( - ' ', '', ucwords(str_replace(array('_', '-'), ' ', $name)) - ); - } - - /** - * Since hyphens cannot be used in variables we have to uppercase them. - * - * Technically you may use them, but they are awkward to access. - * - * @param string $name Property name - * - * @return string Name without hyphen - */ - protected function getSafeName($name) - { - if (strpos($name, '-') !== false) { - $name = $this->getCamelCaseName($name); - } - - return $name; - } - - /** - * Set a property on a given object to a given value. - * - * Checks if the setter or the property are public are made before - * calling this method. - * - * @param object $object Object to set property on - * @param object $accessor ReflectionMethod or ReflectionProperty - * @param mixed $value Value of property - * - * @return void - */ - protected function setProperty( - $object, $accessor, $value - ) { - if (!$accessor->isPublic() && $this->bIgnoreVisibility) { - $accessor->setAccessible(true); - } - if ($accessor instanceof ReflectionProperty) { - $accessor->setValue($object, $value); - } else { - //setter method - $accessor->invoke($object, $value); - } - } - - /** - * Create a new object of the given type. - * - * This method exists to be overwritten in child classes, - * so you can do dependency injection or so. - * - * @param string $class Class name to instantiate - * @param boolean $useParameter Pass $parameter to the constructor or not - * @param mixed $jvalue Constructor parameter (the json value) - * - * @return object Freshly created object - */ - protected function createInstance( - $class, $useParameter = false, $jvalue = null - ) { - if ($useParameter) { - return new $class($jvalue); - } else { - $reflectClass = new ReflectionClass($class); - $constructor = $reflectClass->getConstructor(); - if (null === $constructor - || $constructor->getNumberOfRequiredParameters() > 0 - ) { - return $reflectClass->newInstanceWithoutConstructor(); - } - return $reflectClass->newInstance(); - } - } - - /** - * Get the mapped class/type name for this class. - * Returns the incoming classname if not mapped. - * - * @param string $type Type name to map - * @param mixed $jvalue Constructor parameter (the json value) - * - * @return string The mapped type/class name - */ - protected function getMappedType($type, $jvalue = null) - { - if (isset($this->classMap[$type])) { - $target = $this->classMap[$type]; - } else if (is_string($type) && $type !== '' && $type[0] == '\\' - && isset($this->classMap[substr($type, 1)]) - ) { - $target = $this->classMap[substr($type, 1)]; - } else { - $target = null; - } - - if ($target) { - if (is_callable($target)) { - $type = $target($type, $jvalue); - } else { - $type = $target; - } - } - return $type; - } - - /** - * Checks if the given type is a "simple type" - * - * @param string $type type name from gettype() - * - * @return boolean True if it is a simple PHP type - * - * @see isFlatType() - */ - protected function isSimpleType($type) - { - return $type == 'string' - || $type == 'boolean' || $type == 'bool' - || $type == 'integer' || $type == 'int' - || $type == 'double' || $type == 'float' - || $type == 'array' || $type == 'object'; - } - - /** - * Checks if the object is of this type or has this type as one of its parents - * - * @param string $type class name of type being required - * @param mixed $value Some PHP value to be tested - * - * @return boolean True if $object has type of $type - */ - protected function isObjectOfSameType($type, $value) - { - if (false === is_object($value)) { - return false; - } - - return is_a($value, $type); - } - - /** - * Checks if the given type is a type that is not nested - * (simple type except array and object) - * - * @param string $type type name from gettype() - * - * @return boolean True if it is a non-nested PHP type - * - * @see isSimpleType() - */ - protected function isFlatType($type) - { - return $type == 'NULL' - || $type == 'string' - || $type == 'boolean' || $type == 'bool' - || $type == 'integer' || $type == 'int' - || $type == 'double' || $type == 'float'; - } - - /** - * Returns true if type is an array of elements - * (bracket notation) - * - * @param string $strType type to be matched - * - * @return bool - */ - protected function isArrayOfType($strType) - { - return substr($strType, -2) === '[]'; - } - - /** - * Checks if the given type is nullable - * - * @param string $type type name from the phpdoc param - * - * @return boolean True if it is nullable - */ - protected function isNullable($type) - { - return stripos('|' . $type . '|', '|null|') !== false; - } - - /** - * Remove the 'null' section of a type - * - * @param string $type type name from the phpdoc param - * - * @return string The new type value - */ - protected function removeNullable($type) - { - if ($type === null) { - return null; - } - return substr( - str_ireplace('|null|', '|', '|' . $type . '|'), - 1, -1 - ); - } - - /** - * Copied from PHPUnit 3.7.29, Util/Test.php - * - * @param string $docblock Full method docblock - * - * @return array - */ - protected static function parseAnnotations($docblock) - { - $annotations = array(); - // Strip away the docblock header and footer - // to ease parsing of one line annotations - $docblock = substr($docblock, 3, -2); - - $re = '/@(?P<name>[A-Za-z_-]+)(?:[ \t]+(?P<value>.*?))?[ \t]*\r?$/m'; - if (preg_match_all($re, $docblock, $matches)) { - $numMatches = count($matches[0]); - - for ($i = 0; $i < $numMatches; ++$i) { - $annotations[$matches['name'][$i]][] = $matches['value'][$i]; - } - } - - return $annotations; - } - - /** - * Log a message to the $logger object - * - * @param string $level Logging level - * @param string $message Text to log - * @param array $context Additional information - * - * @return null - */ - protected function log($level, $message, array $context = array()) - { - if ($this->logger) { - $this->logger->log($level, $message, $context); - } - } - - /** - * Sets a logger instance on the object - * - * @param LoggerInterface $logger PSR-3 compatible logger object - * - * @return null - */ - public function setLogger($logger) - { - $this->logger = $logger; - } -} -?> diff --git a/vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php b/vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php deleted file mode 100644 index bb8040c..0000000 --- a/vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -/** - * Part of JsonMapper - * - * PHP version 5 - * - * @category Netresearch - * @package JsonMapper - * @author Christian Weiske <cweiske@cweiske.de> - * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 - * @link http://cweiske.de/ - */ - -/** - * Simple exception - * - * @category Netresearch - * @package JsonMapper - * @author Christian Weiske <cweiske@cweiske.de> - * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 - * @link http://cweiske.de/ - */ -class JsonMapper_Exception extends Exception -{ -} -?> diff --git a/vendor/paragonie/random_compat/LICENSE b/vendor/paragonie/random_compat/LICENSE deleted file mode 100644 index 45c7017..0000000 --- a/vendor/paragonie/random_compat/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Paragon Initiative Enterprises - -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/paragonie/random_compat/build-phar.sh b/vendor/paragonie/random_compat/build-phar.sh deleted file mode 100755 index b4a5ba3..0000000 --- a/vendor/paragonie/random_compat/build-phar.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -basedir=$( dirname $( readlink -f ${BASH_SOURCE[0]} ) ) - -php -dphar.readonly=0 "$basedir/other/build_phar.php" $* \ No newline at end of file diff --git a/vendor/paragonie/random_compat/composer.json b/vendor/paragonie/random_compat/composer.json deleted file mode 100644 index 1fa8de9..0000000 --- a/vendor/paragonie/random_compat/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "paragonie/random_compat", - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "random", - "polyfill", - "pseudorandom" - ], - "license": "MIT", - "type": "library", - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "support": { - "issues": "https://github.com/paragonie/random_compat/issues", - "email": "info@paragonie.com", - "source": "https://github.com/paragonie/random_compat" - }, - "require": { - "php": "^7" - }, - "require-dev": { - "vimeo/psalm": "^1", - "phpunit/phpunit": "4.*|5.*" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - } -} diff --git a/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey b/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey deleted file mode 100644 index eb50ebf..0000000 --- a/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEd+wCqJDrx5B4OldM0dQE0ZMX+lx1ZWm -pui0SUqD4G29L3NGsz9UhJ/0HjBdbnkhIK5xviT0X5vtjacF6ajgcCArbTB+ds+p -+h7Q084NuSuIpNb6YPfoUFgC/CL9kAoc ------END PUBLIC KEY----- diff --git a/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc b/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc deleted file mode 100644 index 6a1d7f3..0000000 --- a/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2.0.22 (MingW32) - -iQEcBAABAgAGBQJWtW1hAAoJEGuXocKCZATaJf0H+wbZGgskK1dcRTsuVJl9IWip -QwGw/qIKI280SD6/ckoUMxKDCJiFuPR14zmqnS36k7N5UNPnpdTJTS8T11jttSpg -1LCmgpbEIpgaTah+cELDqFCav99fS+bEiAL5lWDAHBTE/XPjGVCqeehyPYref4IW -NDBIEsvnHPHPLsn6X5jq4+Yj5oUixgxaMPiR+bcO4Sh+RzOVB6i2D0upWfRXBFXA -NNnsg9/zjvoC7ZW73y9uSH+dPJTt/Vgfeiv52/v41XliyzbUyLalf02GNPY+9goV -JHG1ulEEBJOCiUD9cE1PUIJwHA/HqyhHIvV350YoEFiHl8iSwm7SiZu5kPjaq74= -=B6+8 ------END PGP SIGNATURE----- diff --git a/vendor/paragonie/random_compat/lib/random.php b/vendor/paragonie/random_compat/lib/random.php deleted file mode 100644 index c7731a5..0000000 --- a/vendor/paragonie/random_compat/lib/random.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/** - * Random_* Compatibility Library - * for using the new PHP 7 random_* API in PHP 5 projects - * - * @version 2.99.99 - * @released 2018-06-06 - * - * The MIT License (MIT) - * - * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises - * - * 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. - */ - -// NOP diff --git a/vendor/paragonie/random_compat/other/build_phar.php b/vendor/paragonie/random_compat/other/build_phar.php deleted file mode 100644 index 70ef4b2..0000000 --- a/vendor/paragonie/random_compat/other/build_phar.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -$dist = dirname(__DIR__).'/dist'; -if (!is_dir($dist)) { - mkdir($dist, 0755); -} -if (file_exists($dist.'/random_compat.phar')) { - unlink($dist.'/random_compat.phar'); -} -$phar = new Phar( - $dist.'/random_compat.phar', - FilesystemIterator::CURRENT_AS_FILEINFO | \FilesystemIterator::KEY_AS_FILENAME, - 'random_compat.phar' -); -rename( - dirname(__DIR__).'/lib/random.php', - dirname(__DIR__).'/lib/index.php' -); -$phar->buildFromDirectory(dirname(__DIR__).'/lib'); -rename( - dirname(__DIR__).'/lib/index.php', - dirname(__DIR__).'/lib/random.php' -); - -/** - * If we pass an (optional) path to a private key as a second argument, we will - * sign the Phar with OpenSSL. - * - * If you leave this out, it will produce an unsigned .phar! - */ -if ($argc > 1) { - if (!@is_readable($argv[1])) { - echo 'Could not read the private key file:', $argv[1], "\n"; - exit(255); - } - $pkeyFile = file_get_contents($argv[1]); - - $private = openssl_get_privatekey($pkeyFile); - if ($private !== false) { - $pkey = ''; - openssl_pkey_export($private, $pkey); - $phar->setSignatureAlgorithm(Phar::OPENSSL, $pkey); - - /** - * Save the corresponding public key to the file - */ - if (!@is_readable($dist.'/random_compat.phar.pubkey')) { - $details = openssl_pkey_get_details($private); - file_put_contents( - $dist.'/random_compat.phar.pubkey', - $details['key'] - ); - } - } else { - echo 'An error occurred reading the private key from OpenSSL.', "\n"; - exit(255); - } -} diff --git a/vendor/paragonie/random_compat/psalm-autoload.php b/vendor/paragonie/random_compat/psalm-autoload.php deleted file mode 100644 index d71d1b8..0000000 --- a/vendor/paragonie/random_compat/psalm-autoload.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -require_once 'lib/byte_safe_strings.php'; -require_once 'lib/cast_to_int.php'; -require_once 'lib/error_polyfill.php'; -require_once 'other/ide_stubs/libsodium.php'; -require_once 'lib/random.php'; - -$int = random_int(0, 65536); diff --git a/vendor/paragonie/random_compat/psalm.xml b/vendor/paragonie/random_compat/psalm.xml deleted file mode 100644 index 596d99d..0000000 --- a/vendor/paragonie/random_compat/psalm.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0"?> -<psalm - autoloader="psalm-autoload.php" - stopOnFirstError="false" - useDocblockTypes="true" -> - <projectFiles> - <directory name="lib" /> - </projectFiles> - <issueHandlers> - <RedundantConditionGivenDocblockType errorLevel="info" /> - <UnresolvableInclude errorLevel="info" /> - <DuplicateClass errorLevel="info" /> - <InvalidOperand errorLevel="info" /> - <UndefinedConstant errorLevel="info" /> - <MissingReturnType errorLevel="info" /> - <InvalidReturnType errorLevel="info" /> - </issueHandlers> -</psalm> diff --git a/vendor/pdepend/pdepend/CHANGELOG.md b/vendor/pdepend/pdepend/CHANGELOG.md deleted file mode 100644 index 48872cf..0000000 --- a/vendor/pdepend/pdepend/CHANGELOG.md +++ /dev/null @@ -1,661 +0,0 @@ -pdepend-2.8.0 (2020/05/25) -========================== - -- Added [\#458](https://github.com/pdepend/pdepend/pull/458) Support trait insteadof overrides. (Issue [\#367](https://github.com/pdepend/pdepend/issues/367) and [\#320](https://github.com/pdepend/pdepend/issues/320) ) -- Added [\#466](https://github.com/pdepend/pdepend/pull/466) Allow to configure file cache ttl in configuration file. (Issue [\#465](https://github.com/pdepend/pdepend/issues/465)) -- Added [\#487](https://github.com/pdepend/pdepend/pull/484) Support arrow functions return type hints. -- Fixed [\#467](https://github.com/pdepend/pdepend/pull/467) Use the HOME env variable also for Windows. (Issue [\#447](https://github.com/pdepend/pdepend/issue/447) ) -- Fixed [\#475](https://github.com/pdepend/pdepend/pull/475) Fixed [\#474](https://github.com/pdepend/pdepend/issues/474) typed property visibility -- Fixed [\#476](https://github.com/pdepend/pdepend/pull/476) Fixed [\#473](https://github.com/pdepend/pdepend/issues/473) handle skipped variable in destructuring array -- Fixed [\#478](https://github.com/pdepend/pdepend/pull/478) Fixed [\#472](https://github.com/pdepend/pdepend/issues/472) Use the current token instead of the first inner one to determine the class start. -- Fixed [\#483](https://github.com/pdepend/pdepend/pull/483) Fixed bool flip in parseEscapedAstLiteralString() -- Fixed [\#479](https://github.com/pdepend/pdepend/pull/479) Fixed [\#299](https://github.com/pdepend/pdepend/issues/299) Class constant expression declaration. -- Changed: Tidelift language ( [\#460](https://github.com/pdepend/pdepend/pull/460), [\#461](https://github.com/pdepend/pdepend/pull/461) and [\#462](https://github.com/pdepend/pdepend/pull/462) ) -- Changed: Interal cleanup with refactoring and adding missing PHPDoc ( [\#477](https://github.com/pdepend/pdepend/pull/477), [\#484](https://github.com/pdepend/pdepend/pull/484) and [\#485](https://github.com/pdepend/pdepend/pull/485) ) - -pdepend-2.7.1 (2020/02/12) -========================== - -- Fixed [\#453](https://github.com/pdepend/pdepend/pull/453) Support for typed properties (nullable, array, FQN, scalar) -- Fixed [\#446](https://github.com/pdepend/pdepend/pull/446) Suppress E_NOTICE thrown by unserialize() - -pdepend-2.7.0 (2020/01/24) -========================== - -- Added [\#362](https://github.com/pdepend/pdepend/pull/362) Support for php:// stream wrappers -- Added [\#427](https://github.com/pdepend/pdepend/pull/427) PHP 7.4 features support - -pdepend-2.6.1 (2019/12/21) -========================== - -- Added [\#398](https://github.com/pdepend/pdepend/pull/398) Support for Symfony 5 -- Fixed [\#299](https://github.com/pdepend/pdepend/pull/299) Array concatenation in constant declaration - -pdepend-2.6.0 (2019/12/16) -========================== - -- Added [\#383](https://github.com/pdepend/pdepend/pull/383) Support of PHP 7.1 syntax -- Fixed [\#386](https://github.com/pdepend/pdepend/pull/386) PHP 7 and parsing some return types -- Fixed [\#381](https://github.com/pdepend/pdepend/pull/381) Unexpected token error with invokable -- Fixed [\#365](https://github.com/pdepend/pdepend/pull/365) unable to call method on newly created and invoked class -- Removed not needed files from the export used by composer - -pdepend-2.5.2 (2017/12/13) -========================== - -This release contains a single bugfix for missing command options. - -- Fix for GH355: Unknown option --jdepend-chart [\#356](https://github.com/pdepend/pdepend/pull/356) ([manuelpichler](https://github.com/manuelpichler)) - -pdepend-2.5.1 (2017/12/06) -========================== - -This release contains many bugfixes, enables Scrutinizer and adds code coverage integration. HHVM support was dropped. Full support for missing language features for PHP <= 7.1 were added. - -- Support for "yield from" in PHP 7.0 [\#350](https://github.com/pdepend/pdepend/pull/350) ([emirb](https://github.com/emirb)) -- Support for constant visibility in interfaces in PHP 7.1 [\#349](https://github.com/pdepend/pdepend/pull/349) ([KacerCZ](https://github.com/KacerCZ)) -- Support catch of multiple exception types in PHP 7.1 [\#348](https://github.com/pdepend/pdepend/pull/348) ([KacerCZ](https://github.com/KacerCZ)) -- Added support for PHP 7.1 types - iterable and void [\#342](https://github.com/pdepend/pdepend/pull/342) ([KacerCZ](https://github.com/KacerCZ)) -- Add Symfony 4 support [\#340](https://github.com/pdepend/pdepend/pull/340) ([surikman](https://github.com/surikman)) -- Fix Scrutinizer config [\#336](https://github.com/pdepend/pdepend/pull/336) ([emirb](https://github.com/emirb)) -- Fixed PHPUnit warnings [\#333](https://github.com/pdepend/pdepend/pull/333) ([KacerCZ](https://github.com/KacerCZ)) -- Codecov explicit coverage file [\#332](https://github.com/pdepend/pdepend/pull/332) ([emirb](https://github.com/emirb)) -- Add codecov.io integration [\#331](https://github.com/pdepend/pdepend/pull/331) ([emirb](https://github.com/emirb)) -- Use uniqid\(\) in AbstractASTArtifact::getId\(\) instead of microtime\(\) [\#330](https://github.com/pdepend/pdepend/pull/330) ([KacerCZ](https://github.com/KacerCZ)) -- Fix Iterator so it will not return directories [\#329](https://github.com/pdepend/pdepend/pull/329) ([KacerCZ](https://github.com/KacerCZ)) -- Fix tests on Windows [\#328](https://github.com/pdepend/pdepend/pull/328) ([KacerCZ](https://github.com/KacerCZ)) -- PHP 7.2 fixes [\#326](https://github.com/pdepend/pdepend/pull/326) ([emirb](https://github.com/emirb)) -- Capitalize XML word [\#325](https://github.com/pdepend/pdepend/pull/325) ([bocharsky-bw](https://github.com/bocharsky-bw)) -- Fix typo [\#321](https://github.com/pdepend/pdepend/pull/321) ([ravage84](https://github.com/ravage84)) -- Fixes \#193 regression [\#319](https://github.com/pdepend/pdepend/pull/319) ([mdeboer](https://github.com/mdeboer)) -- Remove running of PHP 5.3 build since dropped by Travis. [\#316](https://github.com/pdepend/pdepend/pull/316) ([niconoe-](https://github.com/niconoe-)) -- Fix issue \#297 adding support for constant visibility into the parser for PHP 7.1 [\#314](https://github.com/pdepend/pdepend/pull/314) ([mmucklo](https://github.com/mmucklo)) -- Remove references to HHVM [\#309](https://github.com/pdepend/pdepend/pull/309) ([ravage84](https://github.com/ravage84)) -- fix count\(\): Parameter must be an array or an object that implements ... [\#303](https://github.com/pdepend/pdepend/pull/303) ([remicollet](https://github.com/remicollet)) -- "a xml" -\> "an xml" [\#300](https://github.com/pdepend/pdepend/pull/300) ([bocharsky-bw](https://github.com/bocharsky-bw)) - -pdepend-2.5.0 (2017/01/19) -========================== - -This release closes a parsing bug in PDepend 2.4.1, starts with the -implementation of PHP 7.1 support and adds a new attribute for the -fully-qualified-classname to the summary report. - -- Fixed #282: Issue with grouped use statements when only a single - level namespace prefix was used. Fixed in commit #3e523f5. -- Implemented #294: Add support for PHP 7.1 optionals. Implemented in - commit #c5c53eb. -- Implemented #88: Fully qualified classname in summary report. - Implemented in commit #13e9cbc. - -pdepend-2.4.1 (2017/01/11) -========================== - -This release closes a bug within PDepend's parser when keywords are -used as method or constant names in PHP 7.0 - -- Fixes an issue with methods or constants with keyword identifiers - called/accessed in PHP 7. Fixed in commit #8f07ac7. - -pdepend-2.4.0 (2017/01/10) -========================== - -This release implements language features like Anonymous Classes, -Group use Declarations, Uniform Variable Syntax or Loosening Reserved -Word Restrictions that were introduced with PHP 7.0, so that PDepend -2.4 is now PHP 7.0 compatible. - -- Fixed #281: PHP 7 - Anonymous Class - Internal parser state issues - Fixed in commit #00a61c6. -- Fixed #285: Parse the magic constant __TRAIT__ Fixed in commit - #b76e2b0. -- Fixed #210: Partial Class Namespace is Calculated Twice: in Global - and it's Own Namespace Fixed in commit #e81411f. -- Implemented #280: Refactor SymbolTable Implemented in commit - #1265259. -- Implemented #282: PHP 7 - Group use declarations Implemented in - commit #fd4aaca. -- Implemented #269: Unexpected token: :: (implicit object / method - usage) Implemented in commit #e611915. -- Implemented #204: Support for the ... operator in function calls - Implemented in commit #078e532. -- Implemented #290: Unexpected token: ARRAY (reserved keyword as a - class constant) Implemented in commit #d4bf7bb. - -pdepend-2.3.2 (2016/11/23) -========================== - -Bugfix release that closes a caching issue that was introduced in -2.3.1. - -- Fixed #276: Uncaught Error: Call to a member function type() on null - in Fixed in commit #48d8081. -- Allow list as method name under PHP 7 Fixed in commit #4968ed4. -- Fixed #277: serialize(): "comment" is returned from __sleep multiple - times in store in FileCacheDriver.php Fixed in commit #31cf053. - -pdepend-2.3.1 (2016/11/23) -========================== - - - -- Fixed #250: Updating ASTAnonymousClass to implement ASTNode, - retaining class behavior. Fixed in commit #2111906. - -pdepend-2.3.0 (2016/11/22) -========================== - -This release closes multiple bugs/issue and has merged several -outstanding pull requests. Beside that it is now possible to pipe -source through STDIN into pdepend. - -- Fixed #263: Fix NPath calculations for the ternary operator. Fixed - in commit #df0e9c5. -- Fixed #260: Fix typos Fixed in commit #20b36c1. -- Fixed #259: DOMDocument file handling. Fixed in commit #fa2afc6. -- Fixed #247: Fix handling of use declarations with const and function - keywords. Fixed in commit #dc9128b. -- Fixed #240: Fix some typos from the website. Fixed in commit - #332672a. -- Fixed #249: Unexpected token: callable Fixed in commit #. -- Support for PHP's ** pow expression implemented. Implemented in - commit #bce6145. -- Implemented #262: Support stdin implemented. Implemented in commit - #3ef2328. -- Implemented #231: Apply the filter on files as well. Implemented in - commit #62d1406. - -pdepend-2.2.6 (2016/10/04) -========================== - -Bugfix release. - -- Fixed #267: Fix UnexpectedTokenException on null coalesce operator - Fixed in commit #8e80aaa. - -pdepend-2.2.4 (2016/03/10) -========================== - -This releases closes a bug in PDepend's parsing code for PHP 7 return -types, that caused a invalid state in the internal AST representation. -This bug was issued in PHPMD's issue tracker first by user radmen. - -- Cannot create new nodes, when internal state is frozen. #328 Fixed - in commit #ffe9957. - -pdepend-2.2.3 (2016/02/22) -========================== - -This release includes several pending pull requests from GitHub. -Beside that this release adds support for complex expressions in -property, constant and parameter declarations, introduced with PHP -5.6. - -- Fixed #226: Fixed division by zero issue. Fixed in commit #fb46614. -- Fixed #227: Fix support to files filters. Fixed in commit #4e150db. -- Fixed #230: Fix handling cygwin home folder location. Fixed in - commit #126c38a. -- Implemented #221: Add --quiet option. Implemented in commit - #9a710f7. -- Implemented #236: Switch to PSR-4 for autoloading Implemented in - commit #57b54bd. -- Implemented #238: Unexpected token errors for 5.6 "constant - expression" initializers. Implemented in commit #0087c94. - -pdepend-2.2.2 (2015/10/16) -========================== - -This release adds a new analyzer that can be used to visualize -namespace dependencies. - -- Implemented #221: Added line numbers to summary log. Implemented in - commit #a975553. -- Implemented #222: Calculate type dependencies. Implemented in commit - #8a924f6. - -pdepend-2.2.1 (2015/09/24) -========================== - -With this release we made a dependency downgrade, so that we can -support more environments. - -- Implemented #223: Minimum Symfony version downgraded to 2.3. - Implemented in commit #8601cc3. - -pdepend-2.2.0 (2015/09/19) -========================== - -This release contains beside several contributed additions and -bugfixes better support for PHP 7 language constructs. - -- Fixed #119: PDepend doesn't follow any symlinks to directories. - Fixed in commit #b80ae7e. -- Fixed #143: Truncated summary when analyzing ISO-8859-1 input. Fixed - in commit #d979462. -- Fixed #193: Cache conflict when executing pdepend in parallel. Fixed - in commit #a4e20ff. -- Fixed #197: Warning: DOMNode::cloneNode(): ID <id> already defined - in phar. Fixed in commit #2221f74. -- Fixed #201: ShellCheck warnings in scripts/compare.sh Fixed in - commit #. -- Fixed #209: PHP 5.6 constant syntax not supported. Fixed in commit - #1209b0e. -- Fixed #213: PHP 7: T_CHARACTER and T_BAD_CHARACTER are no longer - defined. Fixed in commit #1f5b051. -- Fixed #214: PHP 7: Return types not supported. Fixed in commit - #249932b. - -pdepend-2.1.0 (2015/05/21) -========================== - -This release introduces an analyzer for the Halstead metrics and the -maintainability index, contributed by Matthias Mullie. Beside that we -have closed several issues and bugs in PDepend's source code. - -- Fixed #196: Fix Typo in phpDoc Fixed in commit #2b51fed. -- Fixed #200: Fix annotation-typo in AbstractPHPParser.php Fixed in - commit #776529d. -- Fixed #202: Support for variable arg list implemented Fixed in - commit #dff2547. -- Implemented #177: HHVM support Implemented in commit #48ee5d9. -- Implemented #185: Remove unused imports and order alphabetically - Implemented in commit #46d5fb. -- Implemented #198: Add analyzers for Halstead measures & - maintainability index Implemented in commit #3497862. - -pdepend-2.0.6 (2015/03/02) -========================== - -Concurrency issue in the file cache garbage collector fixed. - -- Suppress exceptions when there are concurrency issues within the - garbage collector. Fixed in commit #3e31cc7. - -pdepend-2.0.5 (2015/02/27) -========================== - -This release just adds a simple garbage collector for PDepend's file -cache - -- Garbage collector for old cache files added. Implemented in commit - #56712b1. - -pdepend-2.0.4 (2014/12/04) -========================== - -This release closes some minor issues and incorporates several -outstanding pull requests. - -- Fixed #187: Unexpected token :?> with broken up switch statement - Fixed in commit #c12ee0e. -- Fixed #180: Unexpected token: <<, line: 5, col: 27 Fixed in commit - #4df5b9d. -- Fixed #179: Fixed display of duration longer than one hour Fixed in - commit #1288292. -- Fixed #176: Typo on website fixed. Fixed in commit #6a8e542. -- Fixed #175: Inconsistent indention in phpunit.dist.xml file fixed. - Fixed in commit #bc758e4. -- Fixed #174: Fix conflicting import: "Extension" is already in use in - the "PDepend\DependencyInjection" namespace. Fixed in commit - #e3e672b. -- Fixed #173: Fixing parsing True/False keywords in namespaces: Usage - of true and false keywords are allowed in namespace declarations in - PHP. Fixed in commit #d96e4e7. -- Fixed #170: invalid xml-report after parsing traits Fixed in commit - #1d1bec0. -- Fixed #167: Fix Invalid argument supplied for foreach() in - FileCacheDriver.php Fixed in commit #73d32f3. -- Fixed #165: Fix FileUtil::getUserHomeDir on Mac Fixed in commit - #4826c3f. -- Fixed #164: Empty yields raise Fatal error: When using empty yields - yield; the parser raises an fatal error. Fixed in commit #7ab0736. -- Fixed #163: File cache concurrency fix: Fixes concurrent run of - pdepend and phpmd. Fixed in commit #3955c07. -- Fixed #154: Invalid trait conflict errors: t is completely valid to - mix traits in PHP that have the same methods declared, as long as - only one of them is concrete (all the others must be abstract). - Fixed in commit #45ab1d3. -- Fixed #128: Problem when I use parent:: in trait Fixed in commit - #a73e6de. -- Implemented #177: HHVM support Implemented in commit #17da34b. - -pdepend-2.0.3 (2014/10/08) -========================== - -This is a bugfix release which closes some minor issues. - -- Fixed #129: Windows+Composer install fails due to "path too long" - Fixed in commit #64f95c1. -- Fixed #172: Outdated news on the website -- Fixed #166: Added support for foreach with list statement (PHP 5.5) - Fixed in commit #a744af1. -- Fixed #171: The list usage in foreach loops reports an invalid token - Fixed in commit #a744af1. - -pdepend-2.0.2 (2014/09/16) -========================== - - - -- Fixed #160: include_once PDepend/Util/Coverage/CloverReport.php: - failed to open stream Fixed in commit #4dca605. -- Implemented #105: Support Java style array notations in doc comments - Implemented in commit #2ec5166. - -pdepend-2.0.1 (2014/09/09) -========================== - -Bug fix release which closes a issue within PDepend's C.R.A.P. index -calculation. - -- Handle code surrounded by @codeCoverageIgnore annotations correct. - Fixed in commit #3e67aa2. - -pdepend-2.0.0 (2014/05/21) -========================== - -New mayor release of PDepend. - -- Fixed #126: Allow closure as array element Fixed in commit #b9775ac. -- Fixed #153: Support for new finally keyword implemented. Fixed in - commit #e536e7a. -- Fixed #144: pdepend --version gives me a wrong message.. Fixed in - commit #f6acea9. -- Implemented #113: Specify license, BSD license was missing in - composer.json file. Implemented in commit #3ba9c9e. -- Implemented #117: Adds composer autoload info Implemented in commit - #e624f8e. - -pdepend-1.1.1 (2013/07/25) -========================== - -Closes several PHP 5.4 issues. - -- Fixed #116: Adding a fix for PHP 5.4 style arrays. Fixed in commit - #cbfddaa. -- Fixed #95: PHP 5.4 array syntax is not supported in property - initialization. Fixed in commit #f6ee217. -- Fixed #97: protected property PHP_Depend_Code_Method::$parent Fixed - in commit #87a1b5e. -- Fixed #104: Syntax errors reported when PHP 5.4 short array syntax - is used in method signatures or class variable definitions. Fixed in - commit #d731fa6. -- Fixed #103: Fix syntax error in composer.json example Fixed in - commit #e897a66. -- Implemented #101: Package name for chart svg Implemented in commit - #479aaa5. - -pdepend-1.1.0 (2012/09/12) -========================== - -This release closes a critical issue in the context of traits -handling. - -- Changed type of Node/Trait Fixed in commit #806eaab. -- Changed to PSR1 coding standard. Implemented in commit #. - -pdepend-1.0.7 (2012/04/29) -========================== - -This release closes a minor bug within the parsing code for doc -comments.. - -- Fixed: DocComment is sometimes incorrectly set for functions Fixed - in commit #ac71753. - -pdepend-1.0.6 (2012/04/22) -========================== - -This release closes a bug with traits that were introduced with PHP -5.4. This bug results in an E_FATAL when PHP_Depend performs coupling -analysis on a trait. - -- Fixed: E_FATAL when the coupling analyzer processes a trait. Fixed - in commit #ac71753. -- Added: Composer support Implemented in commit #3d98f02. - -pdepend-1.0.5 (2012/04/05) -========================== - -This release closes a bug introduced with the last release, which -causes PHP_Depend not to flush it's metric cache when a file has -changed. - -- Fixed #27588643: PHP_Depend doesn't invalidate the cache. Fixed in - commit #99d5c13. - -pdepend-1.0.4 (2012/02/25) -========================== - -This release closes an issue introduced with the last release. It -closes one more regression related to PHP's memory_limit and the -Suhosin patch. - -- Fixed fatal error due to bug in memory_limit modification code. - Fixed in commit #b869eff. - -pdepend-1.0.3 (2012/02/25) -========================== - -This release closes a minor issue in PHP_Depend's memory handling when -it is run in a PHP environment that uses the Suhosin patch and the -suhosin.memory_limit setting. - -- Fixed #25450915: Alert disable memory_limit Fixed in commit - #0628e7d. - -pdepend-1.0.2 (2012/02/15) -========================== - -This release contains a huge improvement in PHP_Depend's memory usage. -Due to some changes in the caching behavior we got a memory reduction -of ~ 90%, measured against medium sized code bases like Symfony2 or -FLOW3. - -- Fixed #24732243: pdepend fails on 'const' Fixed in commit #4d6a687. -- Fixed #24975343: PHP_Depend doesn't handle nested list expressions. - Fixed in commit #d124ef0. -- Implemented #24702477: Huge memory footprint Implemented in commit - #75c9755. - -pdepend-1.0.1 (2012/02/08) -========================== - -This release fixes two bugs in PHP_Depend's parser, which resulted in -uncatchable errors. - -- Fixed #24635313: _parseOptionalExpression() returning null causes - exception Fixed in commit #97189b0. -- Fixed #24638569: pdepend crashes on vanilia drupal site Fixed in - commit #f20f40a. - -pdepend-1.0.0 (2012/02/04) -========================== - -Now that we have completed support for all the new language features -introduced with PHP 5.4, we are ready to release version 1.0.0 of -PHP_Depend. PHP_Depend can now handle traits, static closures, binary -numbers, the callable type hint and the new short array syntax. Beside -that, we have spent much effort in improving PHP_Depend's overall -performance and we got an average speed gain of ~ 15% for processing -major frameworks like Symfony2 or FLOW3, when PHP_Depend's file cache -(default setup) is used. Additionally this release closes several -minor issues in PHP_Depend. - -- Fixed #18976391: PHP_Depend's file cache implementation does not - work with PHP 5.4. Fixed in commit #06ce51a. -- Fixed #18459091: PDepend task never ends, if there is an incorrect - inheritance Fixed in commit #13b5d12. -- Fixed #19875155: Implement static closures Fixed in commit #1e24a34. -- Implemented #8927307: Add support for traits Implemented in commit - #84f612e. -- Implemented #19874825: Implement the short array syntax introduced - with PHP 5.4 Implemented in commit #338bca2. -- Implemented #9069837: Implement expression lists. Implemented in - commit #bbb06c7. -- Implemented #21435399: Implement PHP 5.4 variable method names - Implemented in commit #911b6ec. -- Implemented #21408469: Implement PHP 5.4 binary number format - Implemented in commit #e3bccf1. -- Implemented #21339411: Implement PHP 5.4 callable type hint - Implemented in commit #ee5caa6. -- Implemented #21271399: Deprecate the --phpunit-xml log option - Implemented in commit #658c25c. -- Implemented #19817309: Implement PHP 5.4 array dereferencing - Implemented in commit #6dba831. - -pdepend-0.10.9 (2012/01/25) -=========================== - -This release fixes a small issue in PHP_Depend's parser, which results -in an exception when heredoc was used as property or constant -initializer. - -- Fixed #23951621: PHP_Depend fails on Heredocs and Nowdocs in - property declaration. Fixed in commit #373c478. - -pdepend-0.10.8 (2012/01/24) -=========================== - -This release closes an issue in PHP_Depend's parser that produces -invalid package names when the source file contains a statement before -the class or interface doc comment. - -- Fixed #23905939: Package gets lost when prefixed with control - structure Fixed in commit #b62bed7. - -pdepend-0.10.7 (2011/12/06) -=========================== - -This release closes a critical bug in PHP_Depend's parser which -results in an E_FATAL. This can happen when a control structure does -not contain a body or termination token. - -- E_FATAL when a control structure like if, for or foreach does not - contain a body or a termination symbol. Fixed in commit #b367a41. - -pdepend-0.10.6 (2011/08/21) -=========================== - -This release closes a critical bug in PHP_Depend's parser that -produced false positiv error messages for classes named like 'True', -'False' or 'Null' - -- Fixed #17264279: Unexpected token: True, line: 348, col: 49, - file:... Fixed in commit #5ac3e55. - -pdepend-0.10.5 (2011/05/20) -=========================== - -This release closes two minor bugs in PHP_Depend. One incompatibility -with PHP 5.2.x versions and one bug related to PHP_Depend's log -behavior when PHP_Depend analyzes unstructured source code. This -release was published on May the 20th 2011. - -- Fixed #13255437: PHP 5.2 Compatibility Issues. Fixed in commit - #8d4a095. -- Fixed #13405179: PHP Depend report is not generated if all files do - not contain a class nor a function. Fixed in commit #554ade1. - -pdepend-0.10.4 (2011/04/09) -=========================== - -This release contains an improvement in PHP_Depend's memory -consumption. We have optimized the internal data structures in such a -way that the memory footprint was reduced by ~30%. These values were -measured for currently popular frameworks with a medium to large sized -code base. The tests were run under ubuntu with PHP 5.2.17 and PHP -5.3.6. - -pdepend-0.10.3 (2011/03/02) -=========================== - -This release closes a critial bug in PHP_Depend's analyzer locator -code that prevents PHP_Depend from running on windows. This release -was published on March the 02th 2011. - -- Fixed #10659085: Analyzer locator code does not work on windows. - Fixed in commit #0101798. - -pdepend-0.10.2 (2011/02/28) -=========================== - -This release of PHP_Depend closes two bugs. One related to the start -and end line properties of object property nodes in the syntax tree. -The second fix closes a bug in PHP_Depend's implementation of the WMCi -metric. Beside these two fixes this release implements three minor -features, one design issue in the syntax tree api and the other two -other features are related to the new metrics CE, CA, CBO and NPM. -Additionally we have restructured PHP_Depend's directory structure -from a custom, freestyle format to a directory layout that is similar -to maven's convention. With this change we have fixed several issues -and workarounds in PHP_Depend's build process. - -- Fixed #9936901: WMCi calculation is incorrect for overwritten - methods. Fixed in commit #69d079a. -- Fixed #8927377: Invalid Start/End Line/Column for object property - access. Fixed in commit #fc57264. -- Implemented #9069393: Replace optional NULL argument of setPackage() - with separate method. Implemented in commit #1282cdb. -- Implemented #9069871: Implement efferent- and afferent-coupling for - classes. Implemented in commit #07537c2. -- Implemented #9997915: Implement Number of Public Methods metric. - Implemented in commit #2dd3ebf. - -pdepend-0.10.1 (2011/02/06) -=========================== - -- Fixed #9634613: Notice: Undefined property $___temp___. Fixed in - commit #5fb6900. - -pdepend-0.10.0 (2011/02/05) -=========================== - -This version only contains a small bugfix compared to the last release -canditate. Version 0.10.0 of PHP_Depend was released on February the -05th 2011. The key feature for this release is the overall performance -of PHP_Depend. Therefore we have implemented a new caching layer that -reuses already calculated analyzes-results much more efficient than -older versions of PHP_Depend. With these modifications we have -achieved a performance gain of 100% and more for consecutive -analysis-runs. This final release only fixes a small bug in -PHP_Depend's analyzer class locator that has caused some issues when -PHP_Depend was executed as an external dependency that uses a \*.phar -archive as distribution format. - -- Fixed #9623949: Also find analyzers in phar archives in the current - include_path. Fixed in commit #f53dca9. -- Fixed #113: PHP fatal error when an unserialized object graph none - NodeI instances. Fixed in commit #c0f4384. -- Fixed #164: Faulty implementation of the --ignore path filter fixed. - Now this filter only works on the local part of a file or directory - name and not on the complete path. Fixed in commit #f75275e. -- Fixed #176: Calculation of CIS metric is incorrect. Fixed in commit - #1193f4a. -- Fixed #182: Clone is a valid function, method and type name in older - php versions. Fixed with git commit Fixed in commit #b18bf37. -- Fixed #189: Invalid Start/End Line/Column for object method - invocation. Fixed in commit #c6cc9dd. -- Fixed #191: New implementation of --ignore only accepts relative - paths. Fixed in commit #38e6b52. -- Fixed #163: Alternative syntax end tokens can terminate with closing - PHP-tag. -- Fixed #181: No log generated when parsing Typo3 extension - "t3extplorer" (Unexpected token ASCII 39). Indirectly fixed in this - release. -- Implemented #130: Simplify PHP_Depend's ASTCompoundVariable and skip - nested ASTCompoundExpression node instance. -- Implemented #131: Add new method isThis() to PHP_Depend's - ASTVariable class. -- Implemented #132: Housekeeping: Cleanup the PHP_Depend_Input package - test code. -- Implemented #139: Implement Post-/Pre- Increment/Decrement. -- Implemented #143: Support PHP's alternative control structure - syntax. -- Implemented #146: Implement PHP's declare-statement. -- Implemented #148: Implement cast expressions. -- Implemented #170: Rename FunctionNameParserImpl into - FunctionNameParserAllVersions. Task scope changed and complete - refactoring done. Parser moved into a version specific parser class. -- Implemented #178: Provide configuration option for the cache - directory. Implemented in commit #00ed8ec. diff --git a/vendor/pdepend/pdepend/LICENSE b/vendor/pdepend/pdepend/LICENSE deleted file mode 100644 index d4e43ea..0000000 --- a/vendor/pdepend/pdepend/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2008, Manuel Pichler -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/pdepend/pdepend/README.md b/vendor/pdepend/pdepend/README.md deleted file mode 100644 index 04c4361..0000000 --- a/vendor/pdepend/pdepend/README.md +++ /dev/null @@ -1,15 +0,0 @@ -PHP Depend -======= -[![Build Status](https://travis-ci.org/pdepend/pdepend.svg?branch=master)](https://travis-ci.org/pdepend/pdepend) -[![Packagist](https://img.shields.io/packagist/dt/pdepend/pdepend.svg)](https://github.com/pdepend/pdepend) -[![codecov.io](https://codecov.io/gh/pdepend/pdepend/branch/master/graphs/badge.svg?branch=master)](https://codecov.io/github/pdepend/pdepend?branch=master) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/pdepend/pdepend/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/pdepend/pdepend/?branch=master) -[![Chat to us on Gitter](https://badges.gitter.im/pdepend/community.svg)](https://gitter.im/pdepend/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -## [Documentation](https://pdepend.org/) - -## PHP Depend for enterprise - -Available as part of the Tidelift Subscription. - -The maintainers of ``PHP Depend`` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-pdepend-pdepend?utm_source=packagist-pdepend-pdepend&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/vendor/pdepend/pdepend/build.properties b/vendor/pdepend/pdepend/build.properties deleted file mode 100644 index 992bf59..0000000 --- a/vendor/pdepend/pdepend/build.properties +++ /dev/null @@ -1,19 +0,0 @@ -project.dir = -project.uri = pdepend.org -project.name = pdepend -project.version = 2.8.0 -project.stability = stable - -project.pear.uri = pear.example.com - -vendor.dir.includes = symfony/**/*,composer/**/*,autoload.php -vendor.dir.excludes = symfony/**/Tests/**/* - -codesniffer.standard = PSR2 - -codesniffer.fail.on.violation = true - -project.scm.uri = github.com/${project.name}/${project.name}/commit - -phpunit.package.name = phpunit-4.8.36 -phpunit.enabled = false diff --git a/vendor/pdepend/pdepend/composer.json b/vendor/pdepend/pdepend/composer.json deleted file mode 100644 index fd08e2a..0000000 --- a/vendor/pdepend/pdepend/composer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "pdepend/pdepend", - "description": "Official version of pdepend to be handled with Composer", - "license": "BSD-3-Clause", - "type": "library", - "require": { - "php": ">=5.3.7", - "symfony/dependency-injection": "^2.3.0|^3|^4|^5", - "symfony/filesystem": "^2.3.0|^3|^4|^5", - "symfony/config": "^2.3.0|^3|^4|^5" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|^5.7", - "squizlabs/php_codesniffer": "^2.0.0", - "gregwar/rst": "^1.0", - "easy-doc/easy-doc": "0.0.0 || ^1.2.3" - }, - "bin": ["src/bin/pdepend"], - "autoload": { - "psr-4": {"PDepend\\": "src/main/php/PDepend"} - }, - "scripts": { - "test": "phpunit", - "cs-check": "phpcs -p --standard=PSR2 --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1 ./src/main/php ./src/test/php", - "cs-fix": "phpcbf -p --standard=PSR2 --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1 ./src/main/php ./src/test/php", - "build-website": "easy-doc build src/site/config.php --verbose" - }, - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - } -} diff --git a/vendor/pdepend/pdepend/phpcs.xml.dist b/vendor/pdepend/pdepend/phpcs.xml.dist deleted file mode 100644 index 1503339..0000000 --- a/vendor/pdepend/pdepend/phpcs.xml.dist +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0"?> -<ruleset name="PHP_Depend"> - <description>Coding standard for PDepend.</description> - - <file>scripts</file> - <file>src</file> - - <!-- Website content --> - <exclude-pattern>src/site/</exclude-pattern> - <!-- Files for unit tests --> - <exclude-pattern>src/test/resources/</exclude-pattern> - - <arg name="colors"/> - <arg value="np"/> - - <rule ref="PSR2"/> - -</ruleset> diff --git a/vendor/pdepend/pdepend/src/bin/pdepend b/vendor/pdepend/pdepend/src/bin/pdepend deleted file mode 100755 index e7bac25..0000000 --- a/vendor/pdepend/pdepend/src/bin/pdepend +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env php -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -use PDepend\TextUI\Command; - -// PEAR/svn workaround -if (strpos('@php_bin@', '@php_bin') === 0) { - set_include_path('.' . PATH_SEPARATOR . dirname(__FILE__) . '/../main/php'); -} - -// check for pdepend installed as composer package -if (file_exists(__DIR__ . '/../../../../autoload.php')) { - require_once __DIR__ . '/../../../../autoload.php'; -} else { - require_once __DIR__ . '/../../vendor/autoload.php'; -} - -// Allow as much memory as possible by default -if (extension_loaded('suhosin') && is_numeric(ini_get('suhosin.memory_limit'))) { - $limit = ini_get('memory_limit'); - if (preg_match('(^(\d+)([BKMGT]))', $limit, $match)) { - $shift = array('B' => 0, 'K' => 10, 'M' => 20, 'G' => 30, 'T' => 40); - $limit = ($match[1] * (1 << $shift[$match[2]])); - } - if (ini_get('suhosin.memory_limit') > $limit && $limit > -1) { - ini_set('memory_limit', ini_get('suhosin.memory_limit')); - } -} else { - ini_set('memory_limit', -1); -} - -exit(Command::main()); diff --git a/vendor/pdepend/pdepend/src/bin/pdepend.bat b/vendor/pdepend/pdepend/src/bin/pdepend.bat deleted file mode 100644 index b3ef026..0000000 --- a/vendor/pdepend/pdepend/src/bin/pdepend.bat +++ /dev/null @@ -1,46 +0,0 @@ -@echo off -REM This file is part of PDepend. -REM -REM Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. -REM All rights reserved. -REM -REM Redistribution and use in source and binary forms, with or without -REM modification, are permitted provided that the following conditions -REM are met: -REM -REM * Redistributions of source code must retain the above copyright -REM notice, this list of conditions and the following disclaimer. -REM -REM * Redistributions in binary form must reproduce the above copyright -REM notice, this list of conditions and the following disclaimer in -REM the documentation and/or other materials provided with the -REM distribution. -REM -REM * Neither the name of Manuel Pichler nor the names of his -REM contributors may be used to endorse or promote products derived -REM from this software without specific prior written permission. -REM -REM THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -REM "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -REM LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -REM FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -REM COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -REM INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -REM BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -REM LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -REM CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC -REM LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -REM ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -REM POSSIBILITY OF SUCH DAMAGE. -REM -REM $Id$ -REM - - -if "%PHPBIN%" == "" set PHPBIN=@php_bin@ -if not exist "%PHPBIN%" if "%PHP_PEAR_PHP_BIN%" neq "" goto USE_PEAR_PATH -GOTO RUN -:USE_PEAR_PATH -set PHPBIN=%PHP_PEAR_PHP_BIN% -:RUN -"%PHPBIN%" "@bin_dir@\pdepend" %* diff --git a/vendor/pdepend/pdepend/src/bin/pdepend.php b/vendor/pdepend/pdepend/src/bin/pdepend.php deleted file mode 100755 index a8e6b21..0000000 --- a/vendor/pdepend/pdepend/src/bin/pdepend.php +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env php -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -use PDepend\TextUI\Command; - -// PEAR/svn workaround -if (strpos('@php_bin@', '@php_bin') === 0) { - set_include_path('.' . PATH_SEPARATOR . dirname(__FILE__) . '/../main/php'); -} - -require_once __DIR__ . '/../../vendor/autoload.php'; - -// Allow as much memory as possible by default -if (extension_loaded('suhosin') && is_numeric(ini_get('suhosin.memory_limit'))) { - $limit = ini_get('memory_limit'); - if (preg_match('(^(\d+)([BKMGT]))', $limit, $match)) { - $shift = array('B' => 0, 'K' => 10, 'M' => 20, 'G' => 30, 'T' => 40); - $limit = ($match[1] * (1 << $shift[$match[2]])); - } - if (ini_get('suhosin.memory_limit') > $limit && $limit > -1) { - ini_set('memory_limit', ini_get('suhosin.memory_limit')); - } -} else { - ini_set('memory_limit', -1); -} - -exit(Command::main()); diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Application.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Application.php deleted file mode 100644 index 705fa63..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Application.php +++ /dev/null @@ -1,198 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend; - -use Symfony\Component\Config\FileLocator; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; - -/** - * PDepend Application - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Application -{ - private $container; - - /** - * @var string - */ - private $configurationFile; - - /** - * @param string $configurationFile - */ - public function setConfigurationFile($configurationFile) - { - if (!file_exists($configurationFile)) { - throw new \InvalidArgumentException( - sprintf('The configuration file "%s" doesn\'t exist.', $configurationFile) - ); - } - - $this->configurationFile = $configurationFile; - } - - /** - * @return \PDepend\Util\Configuration - */ - public function getConfiguration() - { - return $this->getContainer()->get('pdepend.configuration'); - } - - /** - * @return \PDepend\Engine - */ - public function getEngine() - { - return $this->getContainer()->get('pdepend.engine'); - } - - /** - * @return \PDepend\TextUI\Runner - */ - public function getRunner() - { - return $this->getContainer()->get('pdepend.textui.runner'); // TODO: Use standard name? textui is detail. - } - - /** - * @return \PDepend\Report\ReportGeneratorFactory - */ - public function getReportGeneratorFactory() - { - return $this->getContainer()->get('pdepend.report_generator_factory'); - } - - /** - * @return \PDepend\Metrics\AnalyzerFactory - */ - public function getAnalyzerFactory() - { - return $this->getContainer()->get('pdepend.analyzer_factory'); - } - - private function getContainer() - { - if ($this->container === null) { - $this->container = $this->createContainer(); - } - - return $this->container; - } - - /** - * @return \Symfony\Component\DependencyInjection\ContainerInterface - */ - private function createContainer() - { - $extensions = array(new DependencyInjection\PdependExtension()); - - $container = new ContainerBuilder(new ParameterBag(array())); - $container->prependExtensionConfig('pdepend', array()); - $container->addCompilerPass(new DependencyInjection\Compiler\ProcessListenerPass()); - - $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../../../resources')); - - foreach ($extensions as $extension) { - $container->registerExtension($extension); - } - - if ($this->configurationFile) { - $loader->load($this->configurationFile); - } - - $container->compile(); - - return $container; - } - - /** - * Returns available logger options and documentation messages. - * - * @return array<string, array> - */ - public function getAvailableLoggerOptions() - { - return $this->getAvailableOptionsFor('pdepend.logger'); - } - - /** - * Returns available analyzer options and documentation messages. - * - * @return array<string, array> - */ - public function getAvailableAnalyzerOptions() - { - return $this->getAvailableOptionsFor('pdepend.analyzer'); - } - - /** - * @return array<string, array> - */ - private function getAvailableOptionsFor($serviceTag) - { - $container = $this->getContainer(); - - $loggerServices = $container->findTaggedServiceIds($serviceTag); - - $options = array(); - - foreach ($loggerServices as $loggerServiceTags) { - foreach ($loggerServiceTags as $loggerServiceTag) { - if (isset($loggerServiceTag['option']) && isset($loggerServiceTag['message'])) { - $options[$loggerServiceTag['option']] = array( - 'message' => $loggerServiceTag['message'], - 'value' => isset($loggerServiceTag['value']) ? $loggerServiceTag['value'] : 'file' - ); - } - } - } - - return $options; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/DbusUI/ResultPrinter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/DbusUI/ResultPrinter.php deleted file mode 100644 index 746198c..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/DbusUI/ResultPrinter.php +++ /dev/null @@ -1,202 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\DbusUI; - -// This is just fun and it is not really testable -// @codeCoverageIgnoreStart -use Dbus; -use DBusArray; -use DBusDict; -use DBusUInt32; -use PDepend\Metrics\Analyzer; -use PDepend\ProcessListener; -use PDepend\Source\ASTVisitor\AbstractASTVisitListener; -use PDepend\Source\Builder\Builder; -use PDepend\Source\Tokenizer\Tokenizer; - -/** - * Fun result printer that uses dbus to show a notification window. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ResultPrinter extends AbstractASTVisitListener implements ProcessListener -{ - /** - * Time when it the process has started. - * - * @var integer - */ - private $startTime = 0; - - /** - * Number of parsed/analyzed files. - * - * @var integer - */ - private $parsedFiles = 0; - - /** - * Is called when PDepend starts the file parsing process. - * - * @param \PDepend\Source\Builder\Builder $builder The used node builder instance. - * @return void - */ - public function startParseProcess(Builder $builder) - { - $this->startTime = time(); - } - - /** - * Is called when PDepend has finished the file parsing process. - * - * @param \PDepend\Source\Builder\Builder $builder The used node builder instance. - * @return void - */ - public function endParseProcess(Builder $builder) - { - } - - /** - * Is called when PDepend starts parsing of a new file. - * - * @param \PDepend\Source\Tokenizer\Tokenizer $tokenizer - * @return void - */ - public function startFileParsing(Tokenizer $tokenizer) - { - } - - /** - * Is called when PDepend has finished a file. - * - * @param \PDepend\Source\Tokenizer\Tokenizer $tokenizer - * @return void - */ - public function endFileParsing(Tokenizer $tokenizer) - { - ++$this->parsedFiles; - } - - /** - * Is called when PDepend starts the analyzing process. - * - * @return void - */ - public function startAnalyzeProcess() - { - } - - /** - * Is called when PDepend has finished the analyzing process. - * - * @return void - */ - public function endAnalyzeProcess() - { - } - - /** - * Is called when PDepend starts the logging process. - * - * @return void - */ - public function startLogProcess() - { - } - - /** - * Is called when PDepend has finished the logging process. - * - * @return void - */ - public function endLogProcess() - { - if (extension_loaded('dbus') === false) { - return; - } - - $dbus = new Dbus(Dbus::BUS_SESSION); - $proxy = $dbus->createProxy( - "org.freedesktop.Notifications", // connection name - "/org/freedesktop/Notifications", // object - "org.freedesktop.Notifications" // interface - ); - $proxy->Notify( - 'PDepend', - new DBusUInt32(0), - 'pdepend', - 'PDepend', - sprintf( - '%d files analyzed in %s minutes...', - $this->parsedFiles, - (date('i:s', time() - $this->startTime)) - ), - new DBusArray(DBus::STRING, array()), - new DBusDict(DBus::VARIANT, array()), - 1000 - ); - } - - /** - * Is called when PDepend starts a new analyzer. - * - * @param \PDepend\Metrics\Analyzer $analyzer The context analyzer instance. - * @return void - */ - public function startAnalyzer(Analyzer $analyzer) - { - } - - /** - * Is called when PDepend has finished one analyzing process. - * - * @param \PDepend\Metrics\Analyzer $analyzer The context analyzer instance. - * @return void - */ - public function endAnalyzer(Analyzer $analyzer) - { - } -} - -// @codeCoverageIgnoreEnd diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Compiler/ProcessListenerPass.php b/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Compiler/ProcessListenerPass.php deleted file mode 100644 index 11591a6..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Compiler/ProcessListenerPass.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Find Process Listeners of extensions by 'pdepend.process_listener' tag. - * - * Listeners are added to the PDepend\Engine service. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ProcessListenerPass implements CompilerPassInterface -{ - public function process(ContainerBuilder $container) - { - $engineDefinition = $container->findDefinition('pdepend.engine'); - - $processListenerTags = $container->findTaggedServiceIds('pdepend.process_listener'); - - foreach ($processListenerTags as $id => $tags) { - $engineDefinition->addMethodCall('addProcessListener', array(new Reference($id))); - } - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Configuration.php b/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Configuration.php deleted file mode 100644 index 435cc2b..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Configuration.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\DependencyInjection; - -use PDepend\Util\FileUtil; -use PDepend\Util\Workarounds; -use Symfony\Component\Config\Definition\ConfigurationInterface; - -/** - * This is the class that validates and merges configuration - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Configuration implements ConfigurationInterface -{ - const DEFAULT_TTL = 2592000; //30 days - - /** - * @var array<Extension> - */ - private $extensions = array(); - - public function __construct(array $extensions) - { - $this->extensions = $extensions; - } - - /** - * {@inheritDoc} - */ - public function getConfigTreeBuilder() - { - $home = FileUtil::getUserHomeDirOrSysTempDir(); - $workarounds = new Workarounds(); - - $defaultCacheDriver = ($workarounds->hasSerializeReferenceIssue()) ? 'memory' : 'file'; - - $treeBuilder = new TreeBuilder(); - $rootNode = $treeBuilder->getRootNode(); - - $rootNode - ->children() - ->arrayNode('cache') - ->addDefaultsIfNotSet() - ->children() - ->enumNode('driver')->defaultValue($defaultCacheDriver)->values(array('file', 'memory'))->end() - ->scalarNode('location')->info('This value is only used for the file cache.')->defaultValue($home . '/.pdepend')->end() - ->integerNode('ttl')->info('This value is only used for the file cache. Value in seconds.')->defaultValue(self::DEFAULT_TTL)->end() - ->end() - ->end() - ->arrayNode('image_convert') - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('font_size')->defaultValue('11')->end() - ->scalarNode('font_family')->defaultValue('Arial')->end() - ->end() - ->end() - ->arrayNode('parser') - ->addDefaultsIfNotSet() - ->children() - ->integerNode('nesting')->defaultValue(65536)->end() - ->end() - ->end() - ->end(); - - $extensionsNode = $rootNode - ->children() - ->arrayNode('extensions') - ->addDefaultsIfNotSet() - ->children(); - - foreach ($this->extensions as $extension) { - $extensionNode = $extensionsNode->arrayNode($extension->getName()); - $extension->getConfig($extensionNode); - } - - return $treeBuilder->getTreeBuilder(); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Extension.php b/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Extension.php deleted file mode 100644 index 2d93ad5..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/Extension.php +++ /dev/null @@ -1,136 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\DependencyInjection; - -use ReflectionClass; -use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; -use Symfony\Component\Config\FileLocator; -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; -use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; - -/** - * PDepend base extension class. - * - * Copied from Behat - * - * @link https://github.com/Behat/Behat/blob/3.0/src/Behat/Behat/Extension/Extension.php - * @author Konstantin Kudryashov <ever.zet@gmail.com> - */ -abstract class Extension -{ - /** - * Return name of the extension - * - * @return string - */ - abstract public function getName(); - - /** - * Loads a specific configuration. - * - * @param array $config Extension configuration hash (from behat.yml) - * @param ContainerBuilder $container ContainerBuilder instance - */ - public function load(array $config, ContainerBuilder $container) - { - $path = rtrim($this->getServiceDefinitionsPath(), DIRECTORY_SEPARATOR); - $name = $this->getServiceDefinitionsName(); - - if (file_exists($path . DIRECTORY_SEPARATOR . ($file = $name . '.xml'))) { - $loader = new XmlFileLoader($container, new FileLocator($path)); - $loader->load($file); - } - if (file_exists($path . DIRECTORY_SEPARATOR . ($file = $name . '.yml'))) { - $loader = new YamlFileLoader($container, new FileLocator($path)); - $loader->load($file); - } - - $container->setParameter($this->getName() . '.parameters', $config); - } - - /** - * Setups configuration for current extension. - * - * @param ArrayNodeDefinition $builder - */ - public function getConfig(ArrayNodeDefinition $builder) - { - $builder - ->useAttributeAsKey('name') - ->prototype('variable'); - } - - /** - * Returns compiler passes used by this extension. - * - * @return CompilerPassInterface[] - */ - public function getCompilerPasses() - { - return array(); - } - - /** - * Returns name of the service definition config without extension and path. - * - * @return string - */ - protected function getServiceDefinitionsName() - { - return 'services'; - } - - /** - * Returns service definition configs path. - * - * @return string - */ - protected function getServiceDefinitionsPath() - { - $reflection = new ReflectionClass($this); - - return dirname($reflection->getFileName()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/ExtensionManager.php b/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/ExtensionManager.php deleted file mode 100644 index 087ad31..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/ExtensionManager.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\DependencyInjection; - -/** - * Manage activation and registration of extensions for PDepend. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ExtensionManager -{ - private $extensions = array(); - - /** - * Activate an extension based on a class name. - * - * @throws \RuntimeException - * @param string $className - * @return void - */ - public function activateExtension($className) - { - if (!class_exists($className)) { - throw new \RuntimeException( - sprintf( - 'Cannot find extension class %s" for PDepend. Maybe the plugin is not installed?', - $className - ) - ); - } - - $extension = new $className; - - if (!($extension instanceof Extension)) { - throw new \RuntimeException( - sprintf('Class "%s" is not a valid Extension', $className) - ); - } - - $this->extensions[$extension->getName()] = $extension; - } - - /** - * Return all activated extensions. - * - * @return array<\PDepend\DependencyInjection\Extension> - */ - public function getActivatedExtensions() - { - return $this->extensions; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/PdependExtension.php b/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/PdependExtension.php deleted file mode 100644 index 6bbdd43..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/PdependExtension.php +++ /dev/null @@ -1,128 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\DependencyInjection; - -use Symfony\Component\Config\FileLocator; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Extension\Extension as SymfonyExtension; -use Symfony\Component\DependencyInjection\Loader; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; - -/** - * PDepend DependencyInjection Extension for Symfony DIC - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class PdependExtension extends SymfonyExtension -{ - /** - * {@inheritDoc} - */ - public function load(array $configs, ContainerBuilder $container) - { - $extensionManager = new ExtensionManager(); - - foreach ($configs as $config) { - if (!isset($config['extensions'])) { - continue; - } - - foreach ($config['extensions'] as $config) { - if (!isset($config['class'])) { - continue; - } - - $extensionManager->activateExtension($config['class']); - } - } - - $configuration = new Configuration($extensionManager->getActivatedExtensions()); - $config = $this->processConfiguration($configuration, $configs); - - $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ . '/../../../resources')); - $loader->load('services.xml'); - - foreach ($extensionManager->getActivatedExtensions() as $extension) { - $extensionConfig = $config['extensions'][$extension->getName()]; - - $tempContainer = new ContainerBuilder(new ParameterBag(array())); - $tempContainer->addObjectResource($extension); - - // load extension into temporary container - $extension->load($extensionConfig, $tempContainer); - - // merge temporary container into normal one - $container->merge($tempContainer); - } - - $settings = $this->createSettings($config); - - $configurationDefinition = $container->findDefinition('pdepend.configuration'); - $configurationDefinition->setArguments(array($settings)); - } - - private function createSettings($config) - { - $settings = new \stdClass(); - - $settings->cache = new \stdClass(); - $settings->cache->driver = $config['cache']['driver']; - $settings->cache->location = $config['cache']['location']; - $settings->cache->ttl = $config['cache']['ttl']; - - $settings->imageConvert = new \stdClass(); - $settings->imageConvert->fontSize = $config['image_convert']['font_size']; - $settings->imageConvert->fontFamily = $config['image_convert']['font_family']; - - $settings->parser = new \stdClass(); - $settings->parser->nesting = $config['parser']['nesting']; - - return $settings; - } - - public function getNamespace() - { - return 'http://pdepend.org/schema/dic/pdepend'; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/TreeBuilder.php b/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/TreeBuilder.php deleted file mode 100644 index 491974a..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/DependencyInjection/TreeBuilder.php +++ /dev/null @@ -1,103 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\DependencyInjection; - -use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; -use Symfony\Component\Config\Definition\Builder\NodeDefinition; -use Symfony\Component\Config\Definition\Builder\TreeBuilder as BaseTreeBuilder; - -/** - * This is the class that embed the Symfony TreeBuilder and its root node. - */ -class TreeBuilder -{ - /** - * @var NodeDefinition|ArrayNodeDefinition - */ - protected $rootNode; - - /** - * @var BaseTreeBuilder - */ - protected $treeBuilder; - - /** - * TreeBuilder constructor. - * - * @param string $name - */ - public function __construct($name = 'pdepend') - { - if (method_exists('Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder', 'root')) { - // Symfony < 5 - $this->treeBuilder = new BaseTreeBuilder(); - $this->rootNode = $this->treeBuilder->root($name); - - return; - } - - // Symfony 5+ - $this->treeBuilder = new BaseTreeBuilder($name); - $this->rootNode = $this->treeBuilder->getRootNode(); - } - - /** - * Get the root node of the built tree. - * - * @return ArrayNodeDefinition|NodeDefinition - */ - public function getRootNode() - { - return $this->rootNode; - } - - /** - * Get the base Symfony tree builder. - * - * @return BaseTreeBuilder - */ - public function getTreeBuilder() - { - return $this->treeBuilder; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Engine.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Engine.php deleted file mode 100644 index 16b6ad1..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Engine.php +++ /dev/null @@ -1,726 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend; - -use ArrayIterator; -use GlobIterator; -use PDepend\Input\CompositeFilter; -use PDepend\Input\Filter; -use PDepend\Input\Iterator; -use PDepend\Metrics\AnalyzerCacheAware; -use PDepend\Metrics\AnalyzerFactory; -use PDepend\Metrics\AnalyzerFilterAware; -use PDepend\Report\CodeAwareGenerator; -use PDepend\Source\AST\ASTArtifactList\ArtifactFilter; -use PDepend\Source\AST\ASTArtifactList\CollectionArtifactFilter; -use PDepend\Source\AST\ASTArtifactList\NullArtifactFilter; -use PDepend\Source\ASTVisitor\ASTVisitor; -use PDepend\Source\Builder\Builder; -use PDepend\Source\Language\PHP\PHPBuilder; -use PDepend\Source\Language\PHP\PHPParserGeneric; -use PDepend\Source\Language\PHP\PHPTokenizerInternal; -use PDepend\Source\Tokenizer\Tokenizer; -use PDepend\Util\Cache\CacheFactory; -use PDepend\Util\Configuration; -use SplFileObject; - -/** - * PDepend analyzes php class files and generates metrics. - * - * The PDepend is a php port/adaption of the Java class file analyzer - * <a href="http://clarkware.com/software/JDepend.html">JDepend</a>. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Engine -{ - /** - * Marks the storage used for runtime tokens. - */ - const TOKEN_STORAGE = 1; - - /** - * Marks the storag engine used for parser artifacts. - */ - const PARSER_STORAGE = 2; - - /** - * The system configuration. - * - * @var \PDepend\Util\Configuration - * @since 0.10.0 - */ - protected $configuration = null; - - /** - * Prefix for PHP streams. - * - * @var string - */ - protected $phpStreamPrefix = 'php://'; - - /** - * List of source directories. - * - * @var array<string> - */ - private $directories = array(); - - /** - * List of source code file names. - * - * @var array<string> - */ - private $files = array(); - - /** - * The used code node builder. - * - * @var \PDepend\Source\Builder\Builder - */ - private $builder = null; - - /** - * Generated {@link \PDepend\Source\AST\ASTNamespace} objects. - * - * @var \PDepend\Source\AST\ASTNamespace[] - */ - private $namespaces = null; - - /** - * List of all registered {@link \PDepend\Report\ReportGenerator} instances. - * - * @var \PDepend\Report\ReportGenerator[] - */ - private $generators = array(); - - /** - * A composite filter for input files. - * - * @var \PDepend\Input\CompositeFilter - */ - private $fileFilter = null; - - /** - * A filter for namespace. - * - * @var \PDepend\Source\AST\ASTArtifactList\ArtifactFilter - */ - private $codeFilter = null; - - /** - * Should the parse ignore doc comment annotations? - * - * @var boolean - */ - private $withoutAnnotations = false; - - /** - * List or registered listeners. - * - * @var \PDepend\ProcessListener[] - */ - private $listeners = array(); - - /** - * List of analyzer options. - * - * @var array<string, mixed> - */ - private $options = array(); - - /** - * List of all {@link \PDepend\Source\Parser\ParserException} that were caught during - * the parsing process. - * - * @var \PDepend\Source\Parser\ParserException[] - */ - private $parseExceptions = array(); - - /** - * The configured cache factory. - * - * @var \PDepend\Util\Cache\CacheFactory - * @since 1.0.0 - */ - private $cacheFactory; - - /** - * @var \PDepend\Metrics\AnalyzerFactory - */ - private $analyzerFactory; - - /** - * Constructs a new php depend facade. - * - * @param \PDepend\Util\Configuration $configuration The system configuration. - * @param \PDepend\Util\Cache\CacheFactory $cacheFactory - * @param \PDepend\Metrics\AnalyzerFactory $analyzerFactory - */ - public function __construct( - Configuration $configuration, - CacheFactory $cacheFactory, - AnalyzerFactory $analyzerFactory - ) { - $this->configuration = $configuration; - - $this->codeFilter = new NullArtifactFilter(); - $this->fileFilter = new CompositeFilter(); - - $this->cacheFactory = $cacheFactory; - $this->analyzerFactory = $analyzerFactory; - } - - /** - * Adds the specified directory to the list of directories to be analyzed. - * - * @param string $directory The php source directory. - * @return void - */ - public function addDirectory($directory) - { - $dir = realpath($directory); - - if ($dir === false || !is_dir($dir)) { - throw new \InvalidArgumentException("Invalid directory '{$directory}' added."); - } - - $this->directories[] = $dir; - } - - /** - * Adds a single source code file to the list of files to be analysed. - * - * @param string $file The source file name. - * @return void - */ - public function addFile($file) - { - if ($file === '-') { - $file = $this->phpStreamPrefix . 'stdin'; - } - - if ($this->isPhpStream($file)) { - $this->files[] = $file; - - return; - } - - if (!is_file($file)) { - throw new \InvalidArgumentException(sprintf('The given file "%s" does not exist.', $file)); - } - - $this->files[] = realpath($file); - } - - /** - * Adds a logger to the output list. - * - * @param \PDepend\Report\ReportGenerator $generator The logger instance. - * @return void - */ - public function addReportGenerator(\PDepend\Report\ReportGenerator $generator) - { - $this->generators[] = $generator; - } - - /** - * Adds a new input/file filter. - * - * @param \PDepend\Input\Filter $filter New input/file filter instance. - * @return void - */ - public function addFileFilter(Filter $filter) - { - $this->fileFilter->append($filter); - } - - /** - * Sets an additional code filter. These filters could be used to hide - * external libraries and global stuff from the PDepend output. - * - * @param \PDepend\Source\AST\ASTArtifactList\ArtifactFilter $filter - * @return void - */ - public function setCodeFilter(ArtifactFilter $filter) - { - $this->codeFilter = $filter; - } - - /** - * Sets analyzer options. - * - * @param array<string, mixed> $options The analyzer options. - * @return void - */ - public function setOptions(array $options = array()) - { - $this->options = $options; - } - - /** - * Should the parse ignore doc comment annotations? - * - * @return void - */ - public function setWithoutAnnotations() - { - $this->withoutAnnotations = true; - } - - /** - * Adds a process listener. - * - * @param \PDepend\ProcessListener $listener The listener instance. - * @return void - */ - public function addProcessListener(ProcessListener $listener) - { - if (in_array($listener, $this->listeners, true) === false) { - $this->listeners[] = $listener; - } - } - - /** - * Analyzes the registered directories and returns the collection of - * analyzed namespace. - * - * @return \PDepend\Source\AST\ASTNamespace[] - */ - public function analyze() - { - $this->builder = new PHPBuilder(); - - $this->performParseProcess(); - - // Get global filter collection - $collection = CollectionArtifactFilter::getInstance(); - $collection->setFilter($this->codeFilter); - - $collection->setFilter(); - - $this->performAnalyzeProcess(); - - // Set global filter for logging - $collection->setFilter($this->codeFilter); - - $namespaces = $this->builder->getNamespaces(); - - $this->fireStartLogProcess(); - - foreach ($this->generators as $generator) { - // Check for code aware loggers - if ($generator instanceof CodeAwareGenerator) { - $generator->setArtifacts($namespaces); - } - $generator->close(); - } - - $this->fireEndLogProcess(); - - return ($this->namespaces = $namespaces); - } - - /** - * Returns the number of analyzed php classes and interfaces. - * - * @return integer - */ - public function countClasses() - { - if ($this->namespaces === null) { - $msg = 'countClasses() doesn\'t work before the source was analyzed.'; - throw new \RuntimeException($msg); - } - - $classes = 0; - foreach ($this->namespaces as $namespace) { - $classes += count($namespace->getTypes()); - } - return $classes; - } - - /** - * Returns an <b>array</b> with all {@link \PDepend\Source\Parser\ParserException} - * that were caught during the parsing process. - * - * @return \PDepend\Source\Parser\ParserException[] - */ - public function getExceptions() - { - return $this->parseExceptions; - } - - /** - * Returns the number of analyzed namespaces. - * - * @return integer - */ - public function countNamespaces() - { - if ($this->namespaces === null) { - $msg = 'countNamespaces() doesn\'t work before the source was analyzed.'; - throw new \RuntimeException($msg); - } - - $count = 0; - foreach ($this->namespaces as $namespace) { - if ($namespace->isUserDefined()) { - ++$count; - } - } - return $count; - } - - /** - * Returns the analyzed namespace for the given name. - * - * @param string $name - * @return \PDepend\Source\AST\ASTNamespace - * @throws \OutOfBoundsException - * @throws \RuntimeException - */ - public function getNamespace($name) - { - if ($this->namespaces === null) { - $msg = 'getNamespace() doesn\'t work before the source was analyzed.'; - throw new \RuntimeException($msg); - } - foreach ($this->namespaces as $namespace) { - if ($namespace->getName() === $name) { - return $namespace; - } - } - throw new \OutOfBoundsException(sprintf('Unknown namespace "%s".', $name)); - } - - /** - * Returns an array with the analyzed namespace. - * - * @return \PDepend\Source\AST\ASTNamespace[] - * @throws \RuntimeException - */ - public function getNamespaces() - { - if ($this->namespaces === null) { - $msg = 'getNamespaces() doesn\'t work before the source was analyzed.'; - throw new \RuntimeException($msg); - } - return $this->namespaces; - } - - /** - * Send the start parsing process event. - * - * @param \PDepend\Source\Builder\Builder $builder The used node builder instance. - * @return void - */ - protected function fireStartParseProcess(Builder $builder) - { - foreach ($this->listeners as $listener) { - $listener->startParseProcess($builder); - } - } - - /** - * Send the end parsing process event. - * - * @param \PDepend\Source\Builder\Builder $builder The used node builder instance. - * @return void - */ - protected function fireEndParseProcess(Builder $builder) - { - foreach ($this->listeners as $listener) { - $listener->endParseProcess($builder); - } - } - - /** - * Sends the start file parsing event. - * - * @param \PDepend\Source\Tokenizer\Tokenizer $tokenizer - * @return void - */ - protected function fireStartFileParsing(Tokenizer $tokenizer) - { - foreach ($this->listeners as $listener) { - $listener->startFileParsing($tokenizer); - } - } - - /** - * Sends the end file parsing event. - * - * @param \PDepend\Source\Tokenizer\Tokenizer $tokenizer - * @return void - */ - protected function fireEndFileParsing(Tokenizer $tokenizer) - { - foreach ($this->listeners as $listener) { - $listener->endFileParsing($tokenizer); - } - } - - /** - * Sends the start analyzing process event. - * - * @return void - */ - protected function fireStartAnalyzeProcess() - { - foreach ($this->listeners as $listener) { - $listener->startAnalyzeProcess(); - } - } - - /** - * Sends the end analyzing process event. - * - * @return void - */ - protected function fireEndAnalyzeProcess() - { - foreach ($this->listeners as $listener) { - $listener->endAnalyzeProcess(); - } - } - - /** - * Sends the start log process event. - * - * @return void - */ - protected function fireStartLogProcess() - { - foreach ($this->listeners as $listener) { - $listener->startLogProcess(); - } - } - - /** - * Sends the end log process event. - * - * @return void - */ - protected function fireEndLogProcess() - { - foreach ($this->listeners as $listener) { - $listener->endLogProcess(); - } - } - - /** - * This method performs the parsing process of all source files. It expects - * that the <b>$_builder</b> property was initialized with a concrete builder - * implementation. - * - * @return void - */ - private function performParseProcess() - { - // Reset list of thrown exceptions - $this->parseExceptions = array(); - - $tokenizer = new PHPTokenizerInternal(); - - $this->fireStartParseProcess($this->builder); - - foreach ($this->createFileIterator() as $file) { - $tokenizer->setSourceFile($file); - - $parser = new PHPParserGeneric( - $tokenizer, - $this->builder, - $this->cacheFactory->create() - ); - $parser->setMaxNestingLevel($this->configuration->parser->nesting); - - // Disable annotation parsing? - if ($this->withoutAnnotations === true) { - $parser->setIgnoreAnnotations(); - } - - $this->fireStartFileParsing($tokenizer); - - try { - $parser->parse(); - } catch (\PDepend\Source\Parser\ParserException $e) { - $this->parseExceptions[] = $e; - } - $this->fireEndFileParsing($tokenizer); - } - - $this->fireEndParseProcess($this->builder); - } - - /** - * This method performs the analysing process of the parsed source files. It - * creates the required analyzers for the registered listeners and then - * applies them to the source tree. - * - * @return void - */ - private function performAnalyzeProcess() - { - $analyzerLoader = $this->createAnalyzers($this->options); - - $collection = CollectionArtifactFilter::getInstance(); - - $this->fireStartAnalyzeProcess(); - - ini_set('xdebug.max_nesting_level', $this->configuration->parser->nesting); - - foreach ($analyzerLoader as $analyzer) { - // Add filters if this analyzer is filter aware - if ($analyzer instanceof AnalyzerFilterAware) { - $collection->setFilter($this->codeFilter); - } - - $analyzer->analyze($this->builder->getNamespaces()); - - // Remove filters if this analyzer is filter aware - $collection->setFilter(); - - foreach ($this->generators as $logger) { - $logger->log($analyzer); - } - } - - ini_restore('xdebug.max_nesting_level'); - - $this->fireEndAnalyzeProcess(); - } - - /** - * This method will create an iterator instance which contains all files - * that are part of the parsing process. - * - * @return \Iterator - */ - private function createFileIterator() - { - if (count($this->directories) === 0 && count($this->files) === 0) { - throw new \RuntimeException('No source directory and file set.'); - } - - $fileIterator = new \AppendIterator(); - - foreach ($this->files as $file) { - $fileIterator->append( - $this->isPhpStream($file) - ? new ArrayIterator(array(new SplFileObject($file))) - : new Iterator(new GlobIterator($file), $this->fileFilter) - ); - } - - foreach ($this->directories as $directory) { - $fileIterator->append( - new Iterator( - new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator( - $directory . '/', - \RecursiveDirectoryIterator::FOLLOW_SYMLINKS - ) - ), - $this->fileFilter, - $directory - ) - ); - } - - // TODO: It's important to validate this behavior, imho there is something - // wrong in the iterator code used above. - // Strange: why is the iterator not unique and why does this loop fix it? - $files = array(); - foreach ($fileIterator as $file) { - if (is_string($file)) { - $files[$file] = $file; - } else { - $pathname = $file->getRealPath() ?: $file->getPathname(); - $files[$pathname] = $pathname; - } - } - - foreach ($files as $key => $file) { - if (!$this->fileFilter->accept($file, $file)) { - unset($files[$key]); - } - } - - ksort($files); - // END - - return new ArrayIterator(array_values($files)); - } - - private function createAnalyzers($options) - { - $analyzers = $this->analyzerFactory->createRequiredForGenerators($this->generators); - - $cacheKey = md5(serialize($this->files) . serialize($this->directories)); - $cache = $this->cacheFactory->create($cacheKey); - - foreach ($analyzers as $analyzer) { - if ($analyzer instanceof AnalyzerCacheAware) { - $analyzer->setCache($cache); - } - $analyzer->setOptions($options); - - foreach ($this->listeners as $listener) { - $analyzer->addAnalyzeListener($listener); - - if ($analyzer instanceof ASTVisitor) { - $analyzer->addVisitListener($listener); - } - } - } - - return $analyzers; - } - - private function isPhpStream($path) - { - return substr($path, 0, strlen($this->phpStreamPrefix)) === $this->phpStreamPrefix; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Input/CompositeFilter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Input/CompositeFilter.php deleted file mode 100644 index 1c4d321..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Input/CompositeFilter.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Input; - -/** - * Simple composite pattern implementation that allows to bundle multiple - * filter implementations. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class CompositeFilter implements Filter -{ - /** - * List of aggregated {@link \PDepend\Input\Filter} objects. - * - * @var \PDepend\Input\Filter[] - */ - protected $filters = array(); - - /** - * Adds a file filter to this composite. - * - * @param \PDepend\Input\Filter $filter The new filter object. - * @return void - */ - public function append(Filter $filter) - { - $this->filters[] = $filter; - } - - /** - * Delegates the given <b>$localPath</b> object to all aggregated filters. - * Returns <b>true</b> if this filter accepts the given path. - * - * @param string $relative The relative path to the specified root. - * @param string $absolute The absolute path to a source file. - * @return boolean - */ - public function accept($relative, $absolute) - { - foreach ($this->filters as $filter) { - if (false === $filter->accept($relative, $absolute)) { - return false; - } - } - return true; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Input/ExcludePathFilter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Input/ExcludePathFilter.php deleted file mode 100644 index 0d5b493..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Input/ExcludePathFilter.php +++ /dev/null @@ -1,123 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Input; - -/** - * Filters a given file path against a blacklist with disallow path fragments. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ExcludePathFilter implements Filter -{ - /** - * Regular expression that should not match against the relative file paths. - * - * @var string - * @since 0.10.0 - */ - protected $relative = ''; - - /** - * Regular expression that should not match against the absolute file paths. - * - * @var string - * @since 0.10.0 - */ - protected $absolute = ''; - - /** - * Constructs a new exclude path filter instance and accepts an array of - * exclude pattern as argument. - * - * @param array $patterns List of exclude file path patterns. - */ - public function __construct(array $patterns) - { - $quoted = array_map('preg_quote', $patterns); - - $this->relative = '(' . str_replace('\*', '.*', join('|', $quoted)) . ')i'; - $this->absolute = '(^(' . str_replace('\*', '.*', join('|', $quoted)) .'))i'; - } - - /** - * Returns <b>true</b> if this filter accepts the given path. - * - * @param string $relative The relative path to the specified root. - * @param string $absolute The absolute path to a source file. - * - * @return boolean - */ - public function accept($relative, $absolute) - { - return ($this->notRelative($relative) && $this->notAbsolute($absolute)); - } - - /** - * This method checks if the given <b>$path</b> does not match against the - * exclude patterns as an absolute path. - * - * @param string $path The absolute path to a source file. - * - * @return boolean - * @since 0.10.0 - */ - protected function notAbsolute($path) - { - return (preg_match($this->absolute, $path) === 0); - } - - /** - * This method checks if the given <b>$path</b> does not match against the - * exclude patterns as an relative path. - * - * @param string $path The relative path to a source file. - * - * @return boolean - * @since 0.10.0 - */ - protected function notRelative($path) - { - return (preg_match($this->relative, $path) === 0); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Input/ExtensionFilter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Input/ExtensionFilter.php deleted file mode 100644 index 0d14f95..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Input/ExtensionFilter.php +++ /dev/null @@ -1,88 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Input; - -/** - * Whitelist filter that accepts files by their file extension. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ExtensionFilter implements Filter -{ - /** - * Whitelist of accepted file extensions. - * - * @var array<string> - */ - protected $extensions = array(); - - /** - * Constructs a new file extension filter instance with the given list of - * allowed file <b>$extensions</b>. - * - * @param array $extensions List of allowed extension. - */ - public function __construct(array $extensions) - { - $this->extensions = $extensions; - } - - /** - * Returns <b>true</b> if this filter accepts the given paths. - * - * @param string $relative The relative path to the specified root. - * @param string $absolute The absolute path to a source file. - * @return boolean - */ - public function accept($relative, $absolute) - { - if (strpos($absolute, 'php://') === 0) { - return true; - } - - $extension = pathinfo($relative, PATHINFO_EXTENSION); - - return in_array($extension, $this->extensions); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Input/Filter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Input/Filter.php deleted file mode 100644 index 2e88648..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Input/Filter.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Input; - -/** - * Base interface for file filters. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface Filter -{ - /** - * Returns <b>true</b> if this filter accepts the given paths. - * - * @param string $relative The relative path to the specified root. - * @param string $absolute The absolute path to a source file. - * @return boolean - */ - public function accept($relative, $absolute); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Input/Iterator.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Input/Iterator.php deleted file mode 100644 index 33ff65b..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Input/Iterator.php +++ /dev/null @@ -1,121 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Input; - -/** - * Simple utility filter iterator for php source files. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Iterator extends \FilterIterator -{ - /** - * The associated filter object. - * - * @var \PDepend\Input\Filter - */ - protected $filter = null; - - /** - * Optional root path for the files. - * - * @var string - * @since 0.10.0 - */ - protected $rootPath = null; - - /** - * Constructs a new file filter iterator. - * - * @param \Iterator $iterator The inner iterator. - * @param \PDepend\Input\Filter $filter The filter object. - * @param string $rootPath Optional root path for the files. - */ - public function __construct(\Iterator $iterator, Filter $filter, $rootPath = null) - { - parent::__construct($iterator); - - $this->filter = $filter; - $this->rootPath = $rootPath; - } - - /** - * Returns <b>true</b> if the file name ends with '.php'. - * - * @return boolean - */ - public function accept() - { - if ($this->getInnerIterator()->current()->isDir()) { - return false; - } - return $this->filter->accept($this->getLocalPath(), $this->getFullPath()); - } - - /** - * Returns the full qualified realpath for the currently active file. - * - * @return string - * @since 0.10.0 - */ - protected function getFullPath() - { - return $this->getInnerIterator()->current()->getRealpath(); - } - - /** - * Returns the local path of the current file, if the root path property was - * set. If not, this method returns the absolute file path. - * - * @return string - * @since 0.10.0 - */ - protected function getLocalPath() - { - if ($this->rootPath && 0 === strpos($this->getFullPath(), $this->rootPath)) { - return substr($this->getFullPath(), strlen($this->rootPath)); - } - return $this->getFullPath(); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AbstractAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AbstractAnalyzer.php deleted file mode 100644 index 2333e55..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AbstractAnalyzer.php +++ /dev/null @@ -1,147 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics; - -use PDepend\Source\ASTVisitor\AbstractASTVisitor; - -/** - * This abstract class provides a base implementation of an analyzer. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -abstract class AbstractAnalyzer extends AbstractASTVisitor implements Analyzer -{ - /** - * Global options array. - * - * @var array<string, mixed> - */ - protected $options = array(); - - /** - * List or registered listeners. - * - * @var \PDepend\Metrics\AnalyzerListener[] - */ - private $listeners = array(); - - /** - * Constructs a new analyzer instance. - * - * @param array<string, mixed> $options Global option array, every analyzer - * can extract the required options. - */ - public function __construct(array $options = array()) - { - $this->options = $options; - } - - /** - * Set global options - * - * @param array<string, mixed> $options Global option array, every analyzer - * can extract the required options. - */ - public function setOptions(array $options = array()) - { - $this->options = $options; - } - - /** - * Adds a listener to this analyzer. - * - * @param \PDepend\Metrics\AnalyzerListener $listener The listener instance. - * @return void - */ - public function addAnalyzeListener(\PDepend\Metrics\AnalyzerListener $listener) - { - if (in_array($listener, $this->listeners, true) === false) { - $this->listeners[] = $listener; - } - } - - /** - * An analyzer that is active must return <b>true</b> to recognized by - * pdepend framework, while an analyzer that does not perform any action - * for any reason should return <b>false</b>. - * - * By default all analyzers are enabled. Overwrite this method to provide - * state based disabling/enabling. - * - * @return boolean - * @since 0.9.10 - */ - public function isEnabled() - { - return true; - } - - /** - * The analyzer implementation should call this method when it starts the - * code processing. This method will send an analyzer start event to all - * registered listeners. - * - * @return void - */ - protected function fireStartAnalyzer() - { - foreach ($this->listeners as $listener) { - $listener->startAnalyzer($this); - } - } - - /** - * The analyzer implementation should call this method when it has finished - * the code processing. This method will send an analyzer end event to all - * registered listeners. - * - * @return void - */ - protected function fireEndAnalyzer() - { - foreach ($this->listeners as $listener) { - $listener->endAnalyzer($this); - } - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AbstractCachingAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AbstractCachingAnalyzer.php deleted file mode 100644 index 06929e3..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AbstractCachingAnalyzer.php +++ /dev/null @@ -1,145 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Metrics; - -use PDepend\Source\AST\AbstractASTArtifact; -use PDepend\Util\Cache\CacheDriver; - -/** - * This abstract class provides an analyzer that provides the basic infrastructure - * for caching. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -abstract class AbstractCachingAnalyzer extends AbstractAnalyzer implements AnalyzerCacheAware -{ - /** - * Collected node metrics - * - * @var array - */ - protected $metrics = null; - - /** - * Metrics restored from the cache. This property is only used temporary. - * - * @var array - */ - private $metricsCached = array(); - - /** - * Injected cache driver. - * - * @var \PDepend\Util\Cache\CacheDriver - */ - private $cache; - - /** - * Setter method for the system wide used cache. - * - * @param \PDepend\Util\Cache\CacheDriver $cache - * @return void - */ - public function setCache(CacheDriver $cache) - { - $this->cache = $cache; - } - - /** - * Getter method for the system wide used cache. - * - * @return \PDepend\Util\Cache\CacheDriver $cache - */ - public function getCache() - { - return $this->cache; - } - - /** - * Tries to restore the metrics for a cached node. If this method has - * restored the metrics it will return <b>TRUE</b>, otherwise the return - * value will be <b>FALSE</b>. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return boolean - */ - protected function restoreFromCache(AbstractASTArtifact $node) - { - $id = $node->getId(); - if ($node->isCached() && isset($this->metricsCached[$id])) { - $this->metrics[$id] = $this->metricsCached[$id]; - return true; - } - return false; - } - - /** - * Initializes the previously calculated metrics from the cache. - * - * @return void - */ - protected function loadCache() - { - $this->metricsCached = (array) $this->cache - ->type('metrics') - ->restore(get_class($this)); - } - - /** - * Unloads the metrics cache and stores the current set of metrics in the - * cache. - * - * @return void - */ - protected function unloadCache() - { - $this->cache - ->type('metrics') - ->store(get_class($this), $this->metrics); - - $this->metricsCached = array(); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AggregateAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AggregateAnalyzer.php deleted file mode 100644 index e37c4f7..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AggregateAnalyzer.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics; - -/** - * This analyzer interface provides a specialized form that allows an analyzer - * to aggregate metrics calculated by other analyzers. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface AggregateAnalyzer extends Analyzer -{ - /** - * This method must return an <b>array</b> of class names for required - * analyzers. - * - * @return array<string> - */ - public function getRequiredAnalyzers(); - - /** - * Adds a required sub analyzer. - * - * @param \PDepend\Metrics\Analyzer $analyzer The sub analyzer instance. - * @return void - */ - public function addAnalyzer(Analyzer $analyzer); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer.php deleted file mode 100644 index ee9c781..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer.php +++ /dev/null @@ -1,96 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics; - -use PDepend\Source\AST\ASTArtifactList; - -/** - * Base interface for all analyzer implementations. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface Analyzer -{ - /** - * Constructs a new analyzer instance. - * - * @param array<string, mixed> $options Global option array, every analyzer - * can extract the required options. - */ - public function __construct(array $options = array()); - - /** - * Adds a listener to this analyzer. - * - * @param \PDepend\Metrics\AnalyzerListener $listener The listener instance. - * @return void - */ - public function addAnalyzeListener(AnalyzerListener $listener); - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces); - - /** - * An analyzer that is active must return <b>true</b> to recognized by - * pdepend framework, while an analyzer that does not perform any action - * for any reason should return <b>false</b>. - * - * @return boolean - * @since 0.9.10 - */ - public function isEnabled(); - - /** - * Set global options - * - * @param array<string, mixed> $options - * @since 2.0.1 - */ - public function setOptions(array $options = array()); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/ClassDependencyAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/ClassDependencyAnalyzer.php deleted file mode 100644 index f4fc7cc..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/ClassDependencyAnalyzer.php +++ /dev/null @@ -1,343 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractAnalyzer; -use PDepend\Source\AST\AbstractASTArtifact; -use PDepend\Source\AST\AbstractASTClassOrInterface; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTNamespace; - -/** - * This visitor generates the metrics for the analyzed namespaces. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ClassDependencyAnalyzer extends AbstractAnalyzer -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_AFFERENT_COUPLING = 'ca', - M_EFFERENT_COUPLING = 'ce'; - - /** - * Hash with all calculated node metrics. - * - * <code> - * array( - * '0375e305-885a-4e91-8b5c-e25bda005438' => array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ), - * 'e60c22f0-1a63-4c40-893e-ed3b35b84d0b' => array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ) - * ) - * </code> - * - * @var array<string, array> - */ - private $nodeMetrics = null; - - protected $nodeSet = array(); - - /** - * Nodes in which the current analyzed class is used. - * - * @var array<string, array<integer, \PDepend\Source\AST\AbstractASTArtifact>> - */ - private $efferentNodes = array(); - - /** - * Nodes that is used by the current analyzed class. - * - * @var array<string, array<integer, \PDepend\Source\AST\AbstractASTArtifact>> - */ - private $afferentNodes = array(); - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->nodeMetrics === null) { - $this->fireStartAnalyzer(); - - $this->nodeMetrics = array(); - - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->postProcess(); - - $this->fireEndAnalyzer(); - } - } - - /** - * Returns an array of all afferent nodes. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return \PDepend\Source\AST\AbstractASTArtifact[] - */ - public function getAfferents(AbstractASTArtifact $node) - { - $afferents = array(); - if (isset($this->afferentNodes[$node->getId()])) { - $afferents = $this->afferentNodes[$node->getId()]; - } - return $afferents; - } - - /** - * Returns an array of all efferent nodes. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return \PDepend\Source\AST\AbstractASTArtifact[] - */ - public function getEfferents(AbstractASTArtifact $node) - { - $efferents = array(); - if (isset($this->efferentNodes[$node->getId()])) { - $efferents = $this->efferentNodes[$node->getId()]; - } - return $efferents; - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - $type = $method->getParent(); - foreach ($method->getDependencies() as $dependency) { - $this->collectDependencies($type, $dependency); - } - - $this->fireEndMethod($method); - } - - /** - * Visits a namespace node. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function visitNamespace(ASTNamespace $namespace) - { - $this->fireStartNamespace($namespace); - - $this->nodeSet[$namespace->getId()] = $namespace; - - foreach ($namespace->getTypes() as $type) { - $type->accept($this); - } - - $this->fireEndNamespace($namespace); - } - - /** - * Visits a class node. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - $this->fireStartClass($class); - $this->visitType($class); - $this->fireEndClass($class); - } - - /** - * Visits an interface node. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - $this->fireStartInterface($interface); - $this->visitType($interface); - $this->fireEndInterface($interface); - } - - /** - * Generic visit method for classes and interfaces. Both visit methods - * delegate calls to this method. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $type - * @return void - */ - protected function visitType(AbstractASTClassOrInterface $type) - { - $id = $type->getId(); - - foreach ($type->getDependencies() as $dependency) { - $this->collectDependencies($type, $dependency); - } - - foreach ($type->getMethods() as $method) { - $method->accept($this); - } - } - - /** - * Collects the dependencies between the two given classes. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $typeA - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $typeB - * - * @return void - */ - private function collectDependencies(AbstractASTClassOrInterface $typeA, AbstractASTClassOrInterface $typeB) - { - $idA = $typeA->getId(); - $idB = $typeB->getId(); - - if ($idB === $idA) { - return; - } - - // Create a container for this dependency - $this->initTypeMetric($typeA); - $this->initTypeMetric($typeB); - - if (!in_array($idB, $this->nodeMetrics[$idA][self::M_EFFERENT_COUPLING])) { - $this->nodeMetrics[$idA][self::M_EFFERENT_COUPLING][] = $idB; - $this->nodeMetrics[$idB][self::M_AFFERENT_COUPLING][] = $idA; - } - } - - /** - * Initializes the node metric record for the given <b>$type</b>. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $type - * @return void - */ - protected function initTypeMetric(AbstractASTClassOrInterface $type) - { - $id = $type->getId(); - - if (!isset($this->nodeMetrics[$id])) { - $this->nodeSet[$id] = $type; - - $this->nodeMetrics[$id] = array( - self::M_AFFERENT_COUPLING => array(), - self::M_EFFERENT_COUPLING => array(), - ); - } - } - - /** - * Post processes all analyzed nodes. - * - * @return void - */ - protected function postProcess() - { - foreach ($this->nodeMetrics as $id => $metrics) { - $this->afferentNodes[$id] = array(); - foreach ($metrics[self::M_AFFERENT_COUPLING] as $caId) { - $this->afferentNodes[$id][] = $this->nodeSet[$caId]; - } - - $this->efferentNodes[$id] = array(); - foreach ($metrics[self::M_EFFERENT_COUPLING] as $ceId) { - $this->efferentNodes[$id][] = $this->nodeSet[$ceId]; - } - - $afferent = count($metrics[self::M_AFFERENT_COUPLING]); - $efferent = count($metrics[self::M_EFFERENT_COUPLING]); - - $this->nodeMetrics[$id][self::M_AFFERENT_COUPLING] = $afferent; - $this->nodeMetrics[$id][self::M_EFFERENT_COUPLING] = $efferent; - } - } - - /** - * Collects a single cycle that is reachable by this namespace. All namespaces - * that are part of the cylce are stored in the given <b>$list</b> array. - * - * @param \PDepend\Source\AST\AbstractASTArtifact[] $list - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return boolean If this method detects a cycle the return value is <b>true</b> - * otherwise this method will return <b>false</b>. - */ - protected function collectCycle(array &$list, AbstractASTArtifact $node) - { - if (in_array($node, $list, true)) { - $list[] = $node; - return true; - } - - $list[] = $node; - - foreach ($this->getEfferents($node) as $efferent) { - if ($this->collectCycle($list, $efferent)) { - return true; - } - } - - if (is_int($idx = array_search($node, $list, true))) { - unset($list[$idx]); - } - return false; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/ClassLevelAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/ClassLevelAnalyzer.php deleted file mode 100644 index 3ac442c..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/ClassLevelAnalyzer.php +++ /dev/null @@ -1,409 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractAnalyzer; -use PDepend\Metrics\AggregateAnalyzer; -use PDepend\Metrics\AnalyzerFilterAware; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Source\AST\AbstractASTType; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTProperty; -use PDepend\Source\AST\ASTTrait; - -/** - * Generates some class level based metrics. This analyzer is based on the - * metrics specified in the following document. - * - * http://www.aivosto.com/project/help/pm-oo-misc.html - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ClassLevelAnalyzer extends AbstractAnalyzer implements AggregateAnalyzer, AnalyzerFilterAware, AnalyzerNodeAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_IMPLEMENTED_INTERFACES = 'impl', - M_CLASS_INTERFACE_SIZE = 'cis', - M_CLASS_SIZE = 'csz', - M_NUMBER_OF_PUBLIC_METHODS = 'npm', - M_PROPERTIES = 'vars', - M_PROPERTIES_INHERIT = 'varsi', - M_PROPERTIES_NON_PRIVATE = 'varsnp', - M_WEIGHTED_METHODS = 'wmc', - M_WEIGHTED_METHODS_INHERIT = 'wmci', - M_WEIGHTED_METHODS_NON_PRIVATE = 'wmcnp'; - - /** - * Hash with all calculated node metrics. - * - * <code> - * array( - * '0375e305-885a-4e91-8b5c-e25bda005438' => array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ), - * 'e60c22f0-1a63-4c40-893e-ed3b35b84d0b' => array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ) - * ) - * </code> - * - * @var array<string, array> - */ - private $nodeMetrics = null; - - /** - * The internal used cyclomatic complexity analyzer. - * - * @var \PDepend\Metrics\Analyzer\CyclomaticComplexityAnalyzer - */ - private $cyclomaticAnalyzer = null; - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->nodeMetrics === null) { - // First check for the require cc analyzer - if ($this->cyclomaticAnalyzer === null) { - throw new \RuntimeException('Missing required CC analyzer.'); - } - - $this->fireStartAnalyzer(); - - $this->cyclomaticAnalyzer->analyze($namespaces); - - // Init node metrics - $this->nodeMetrics = array(); - - // Visit all nodes - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->fireEndAnalyzer(); - } - } - - /** - * This method must return an <b>array</b> of class names for required - * analyzers. - * - * @return array<string> - */ - public function getRequiredAnalyzers() - { - return array('PDepend\\Metrics\\Analyzer\\CyclomaticComplexityAnalyzer'); - } - - /** - * Adds a required sub analyzer. - * - * @param \PDepend\Metrics\Analyzer $analyzer The sub analyzer instance. - * @return void - */ - public function addAnalyzer(\PDepend\Metrics\Analyzer $analyzer) - { - if ($analyzer instanceof \PDepend\Metrics\Analyzer\CyclomaticComplexityAnalyzer) { - $this->cyclomaticAnalyzer = $analyzer; - } else { - throw new \InvalidArgumentException('CC Analyzer required.'); - } - } - - /** - * This method will return an <b>array</b> with all generated metric values - * for the given <b>$node</b>. If there are no metrics for the requested - * node, this method will return an empty <b>array</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array<string, mixed> - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - $metrics = array(); - if (isset($this->nodeMetrics[$artifact->getId()])) { - $metrics = $this->nodeMetrics[$artifact->getId()]; - } - return $metrics; - } - - /** - * Visits a class node. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - $this->fireStartClass($class); - - $impl = count($class->getInterfaces()); - $varsi = $this->calculateVarsi($class); - $wmci = $this->calculateWmciForClass($class); - - $this->nodeMetrics[$class->getId()] = array( - self::M_IMPLEMENTED_INTERFACES => $impl, - self::M_CLASS_INTERFACE_SIZE => 0, - self::M_CLASS_SIZE => 0, - self::M_NUMBER_OF_PUBLIC_METHODS => 0, - self::M_PROPERTIES => 0, - self::M_PROPERTIES_INHERIT => $varsi, - self::M_PROPERTIES_NON_PRIVATE => 0, - self::M_WEIGHTED_METHODS => 0, - self::M_WEIGHTED_METHODS_INHERIT => $wmci, - self::M_WEIGHTED_METHODS_NON_PRIVATE => 0 - ); - - foreach ($class->getProperties() as $property) { - $property->accept($this); - } - foreach ($class->getMethods() as $method) { - $method->accept($this); - } - - $this->fireEndClass($class); - } - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - // Empty visit method, we don't want interface metrics - } - - /** - * Visits a trait node. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @since 1.0.0 - */ - public function visitTrait(ASTTrait $trait) - { - $this->fireStartTrait($trait); - - $wmci = $this->calculateWmciForTrait($trait); - - $this->nodeMetrics[$trait->getId()] = array( - self::M_IMPLEMENTED_INTERFACES => 0, - self::M_CLASS_INTERFACE_SIZE => 0, - self::M_CLASS_SIZE => 0, - self::M_NUMBER_OF_PUBLIC_METHODS => 0, - self::M_PROPERTIES => 0, - self::M_PROPERTIES_INHERIT => 0, - self::M_PROPERTIES_NON_PRIVATE => 0, - self::M_WEIGHTED_METHODS => 0, - self::M_WEIGHTED_METHODS_INHERIT => $wmci, - self::M_WEIGHTED_METHODS_NON_PRIVATE => 0 - ); - - foreach ($trait->getProperties() as $property) { - $property->accept($this); - } - foreach ($trait->getMethods() as $method) { - $method->accept($this); - } - - $this->fireEndTrait($trait); - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - $id = $method->getParent()->getId(); - - $ccn = $this->cyclomaticAnalyzer->getCcn2($method); - - // Increment Weighted Methods Per Class(WMC) value - $this->nodeMetrics[$id][self::M_WEIGHTED_METHODS] += $ccn; - // Increment Class Size(CSZ) value - ++$this->nodeMetrics[$id][self::M_CLASS_SIZE]; - - // Increment Non Private values - if ($method->isPublic()) { - ++$this->nodeMetrics[$id][self::M_NUMBER_OF_PUBLIC_METHODS]; - // Increment Non Private WMC value - $this->nodeMetrics[$id][self::M_WEIGHTED_METHODS_NON_PRIVATE] += $ccn; - // Increment Class Interface Size(CIS) value - ++$this->nodeMetrics[$id][self::M_CLASS_INTERFACE_SIZE]; - } - - $this->fireEndMethod($method); - } - - /** - * Visits a property node. - * - * @param \PDepend\Source\AST\ASTProperty $property - * @return void - */ - public function visitProperty(ASTProperty $property) - { - $this->fireStartProperty($property); - - $id = $property->getDeclaringClass()->getId(); - - // Increment VARS value - ++$this->nodeMetrics[$id][self::M_PROPERTIES]; - // Increment Class Size(CSZ) value - ++$this->nodeMetrics[$id][self::M_CLASS_SIZE]; - - // Increment Non Private values - if ($property->isPublic()) { - // Increment Non Private VARS value - ++$this->nodeMetrics[$id][self::M_PROPERTIES_NON_PRIVATE]; - // Increment Class Interface Size(CIS) value - ++$this->nodeMetrics[$id][self::M_CLASS_INTERFACE_SIZE]; - } - - $this->fireEndProperty($property); - } - - /** - * Calculates the Variables Inheritance of a class metric, this method only - * counts protected and public properties of parent classes. - * - * @param \PDepend\Source\AST\ASTClass $class The context class instance. - * @return integer - */ - private function calculateVarsi(ASTClass $class) - { - // List of properties, this method only counts not overwritten properties - $properties = array(); - // Collect all properties of the context class - foreach ($class->getProperties() as $prop) { - $properties[$prop->getName()] = true; - } - - foreach ($class->getParentClasses() as $parent) { - foreach ($parent->getProperties() as $prop) { - if (!$prop->isPrivate() && !isset($properties[$prop->getName()])) { - $properties[$prop->getName()] = true; - } - } - } - return count($properties); - } - - /** - * Calculates the Weight Method Per Class metric, this method only counts - * protected and public methods of parent classes. - * - * @param \PDepend\Source\AST\ASTClass $class The context class instance. - * @return integer - */ - private function calculateWmciForClass(ASTClass $class) - { - $ccn = $this->calculateWmci($class); - - foreach ($class->getParentClasses() as $parent) { - foreach ($parent->getMethods() as $method) { - if ($method->isPrivate()) { - continue; - } - if (isset($ccn[($name = $method->getName())])) { - continue; - } - $ccn[$name] = $this->cyclomaticAnalyzer->getCcn2($method); - } - } - - return array_sum($ccn); - } - - /** - * Calculates the Weight Method Per Class metric for a trait. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return integer - * @since 1.0.6 - */ - private function calculateWmciForTrait(ASTTrait $trait) - { - return array_sum($this->calculateWmci($trait)); - } - - /** - * Calculates the Weight Method Per Class metric. - * - * @param \PDepend\Source\AST\AbstractASTType $type - * @return integer[] - * @since 1.0.6 - */ - private function calculateWmci(AbstractASTType $type) - { - $ccn = array(); - - foreach ($type->getMethods() as $method) { - $ccn[$method->getName()] = $this->cyclomaticAnalyzer->getCcn2($method); - } - - return $ccn; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer.php deleted file mode 100644 index a167bf6..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer.php +++ /dev/null @@ -1,235 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractAnalyzer; -use PDepend\Metrics\Analyzer\CodeRankAnalyzer\StrategyFactory; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTArtifactList; - -/** - * Calculates the code rank metric for classes and namespaces. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class CodeRankAnalyzer extends AbstractAnalyzer implements AnalyzerNodeAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_CODE_RANK = 'cr', - M_REVERSE_CODE_RANK = 'rcr'; - - /** - * The used damping factor. - */ - const DAMPING_FACTOR = 0.85; - - /** - * Number of loops for the code range calculation. - */ - const ALGORITHM_LOOPS = 25; - - /** - * Option key for the code rank mode. - */ - const STRATEGY_OPTION = 'coderank-mode'; - - /** - * All found nodes. - * - * @var array<string, array> - */ - private $nodes = array(); - - /** - * List of node collect strategies. - * - * @var \PDepend\Metrics\Analyzer\CodeRankAnalyzer\CodeRankStrategyI[] - */ - private $strategies = array(); - - /** - * Hash with all calculated node metrics. - * - * <code> - * array( - * '0375e305-885a-4e91-8b5c-e25bda005438' => array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ), - * 'e60c22f0-1a63-4c40-893e-ed3b35b84d0b' => array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ) - * ) - * </code> - * - * @var array<string, array> - */ - private $nodeMetrics = null; - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->nodeMetrics === null) { - $this->fireStartAnalyzer(); - - $factory = new StrategyFactory(); - if (isset($this->options[self::STRATEGY_OPTION])) { - foreach ($this->options[self::STRATEGY_OPTION] as $identifier) { - $this->strategies[] = $factory->createStrategy($identifier); - } - } else { - $this->strategies[] = $factory->createDefaultStrategy(); - } - - // Register all listeners - foreach ($this->getVisitListeners() as $listener) { - foreach ($this->strategies as $strategy) { - $strategy->addVisitListener($listener); - } - } - - foreach ($namespaces as $namespace) { - // Traverse all strategies - foreach ($this->strategies as $strategy) { - $namespace->accept($strategy); - } - } - - // Collect all nodes - foreach ($this->strategies as $strategy) { - $collected = $strategy->getCollectedNodes(); - $this->nodes = array_merge_recursive($collected, $this->nodes); - } - - // Init node metrics - $this->nodeMetrics = array(); - - // Calculate code rank metrics - $this->buildCodeRankMetrics(); - - $this->fireEndAnalyzer(); - } - } - - /** - * This method will return an <b>array</b> with all generated metric values - * for the given <b>$node</b>. If there are no metrics for the requested - * node, this method will return an empty <b>array</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array<string, mixed> - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - if (isset($this->nodeMetrics[$artifact->getId()])) { - return $this->nodeMetrics[$artifact->getId()]; - } - return array(); - } - - /** - * Generates the forward and reverse code rank for the given <b>$nodes</b>. - * - * @return void - */ - protected function buildCodeRankMetrics() - { - foreach (array_keys($this->nodes) as $id) { - $this->nodeMetrics[$id] = array( - self::M_CODE_RANK => 0, - self::M_REVERSE_CODE_RANK => 0 - ); - } - foreach ($this->computeCodeRank('out', 'in') as $id => $rank) { - $this->nodeMetrics[$id][self::M_CODE_RANK] = $rank; - } - foreach ($this->computeCodeRank('in', 'out') as $id => $rank) { - $this->nodeMetrics[$id][self::M_REVERSE_CODE_RANK] = $rank; - } - } - - /** - * Calculates the code rank for the given <b>$nodes</b> set. - * - * @param string $id1 Identifier for the incoming edges. - * @param string $id2 Identifier for the outgoing edges. - * - * @return array<string, float> - */ - protected function computeCodeRank($id1, $id2) - { - $dampingFactory = self::DAMPING_FACTOR; - - $ranks = array(); - - foreach (array_keys($this->nodes) as $name) { - $ranks[$name] = 1; - } - - for ($i = 0; $i < self::ALGORITHM_LOOPS; $i++) { - foreach ($this->nodes as $name => $info) { - $rank = 0; - foreach ($info[$id1] as $ref) { - $previousRank = $ranks[$ref]; - $refCount = count($this->nodes[$ref][$id2]); - - $rank += ($previousRank / $refCount); - } - $ranks[$name] = ((1 - $dampingFactory)) + $dampingFactory * $rank; - } - } - return $ranks; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/CodeRankStrategyI.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/CodeRankStrategyI.php deleted file mode 100644 index 536f23e..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/CodeRankStrategyI.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer\CodeRankAnalyzer; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * The code rank strategy provides an interface for dependency collection. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface CodeRankStrategyI extends ASTVisitor -{ - /** - * Returns the collected nodes. - * - * @return array<string, array> - */ - public function getCollectedNodes(); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/InheritanceStrategy.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/InheritanceStrategy.php deleted file mode 100644 index 4814c7e..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/InheritanceStrategy.php +++ /dev/null @@ -1,150 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer\CodeRankAnalyzer; - -use PDepend\Source\AST\AbstractASTArtifact; -use PDepend\Source\AST\AbstractASTClassOrInterface; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\ASTVisitor\AbstractASTVisitor; - -/** - * Collects class and namespace metrics based on inheritance. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class InheritanceStrategy extends AbstractASTVisitor implements CodeRankStrategyI -{ - /** - * All found nodes. - * - * @var array<string, array> - */ - private $nodes = array(); - - /** - * Returns the collected nodes. - * - * @return array<string, array> - */ - public function getCollectedNodes() - { - return $this->nodes; - } - - /** - * Visits a code class object. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - $this->fireStartClass($class); - $this->visitType($class); - $this->fireEndClass($class); - } - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - $this->fireStartInterface($interface); - $this->visitType($interface); - $this->fireEndInterface($interface); - } - - /** - * Generic visitor method for classes and interfaces. Both visit methods - * delegate calls to this method. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $type - * @return void - */ - protected function visitType(AbstractASTClassOrInterface $type) - { - $namespace = $type->getNamespace(); - - $this->initNode($namespace); - $this->initNode($type); - - foreach ($type->getDependencies() as $dependency) { - $depPkg = $dependency->getNamespace(); - - $this->initNode($dependency); - $this->initNode($depPkg); - - $this->nodes[$type->getId()]['in'][] = $dependency->getId(); - $this->nodes[$dependency->getId()]['out'][] = $type->getId(); - - // No self references - if ($namespace !== $depPkg) { - $this->nodes[$namespace->getId()]['in'][] = $depPkg->getId(); - $this->nodes[$depPkg->getId()]['out'][] = $namespace->getId(); - } - } - } - - /** - * Initializes the temporary node container for the given <b>$node</b>. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return void - */ - protected function initNode(AbstractASTArtifact $node) - { - if (!isset($this->nodes[$node->getId()])) { - $this->nodes[$node->getId()] = array( - 'in' => array(), - 'out' => array(), - 'name' => $node->getName(), - 'type' => get_class($node) - ); - } - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/MethodStrategy.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/MethodStrategy.php deleted file mode 100644 index 42bbd13..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/MethodStrategy.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer\CodeRankAnalyzer; - -use PDepend\Source\AST\AbstractASTArtifact; -use PDepend\Source\AST\AbstractASTClassOrInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\ASTVisitor\AbstractASTVisitor; - -/** - * Collects class and namespace metrics based on class and interface methods. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class MethodStrategy extends AbstractASTVisitor implements CodeRankStrategyI -{ - /** - * All found nodes. - * - * @var array<string, array> - */ - private $nodes = array(); - - /** - * Returns the collected nodes. - * - * @return array<string, array> - */ - public function getCollectedNodes() - { - return $this->nodes; - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - // Get owner type - $type = $method->getParent(); - - if (($depType = $method->getReturnClass()) !== null) { - $this->processType($type, $depType); - } - foreach ($method->getExceptionClasses() as $depType) { - $this->processType($type, $depType); - } - foreach ($method->getDependencies() as $depType) { - $this->processType($type, $depType); - } - - $this->fireEndMethod($method); - } - - /** - * Extracts the coupling information between the two given types and their - * parent namespacess. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $type - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $dependency - * @return void - */ - private function processType(AbstractASTClassOrInterface $type, AbstractASTClassOrInterface $dependency) - { - if ($type !== $dependency) { - $this->initNode($type); - $this->initNode($dependency); - - $this->nodes[$type->getId()]['in'][] = $dependency->getId(); - $this->nodes[$dependency->getId()]['out'][] = $type->getId(); - } - - $namespace = $type->getNamespace(); - $dependencyNamespace = $dependency->getNamespace(); - - if ($namespace !== $dependencyNamespace) { - $this->initNode($namespace); - $this->initNode($dependencyNamespace); - - $this->nodes[$namespace->getId()]['in'][] = $dependencyNamespace->getId(); - $this->nodes[$dependencyNamespace->getId()]['out'][] = $namespace->getId(); - } - } - - /** - * Initializes the temporary node container for the given <b>$node</b>. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return void - */ - private function initNode(AbstractASTArtifact $node) - { - if (!isset($this->nodes[$node->getId()])) { - $this->nodes[$node->getId()] = array( - 'in' => array(), - 'out' => array(), - 'name' => $node->getName(), - 'type' => get_class($node) - ); - } - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/PropertyStrategy.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/PropertyStrategy.php deleted file mode 100644 index 13f34fe..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/PropertyStrategy.php +++ /dev/null @@ -1,130 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer\CodeRankAnalyzer; - -use PDepend\Source\AST\AbstractASTArtifact; -use PDepend\Source\AST\ASTProperty; -use PDepend\Source\ASTVisitor\AbstractASTVisitor; - -/** - * Collects class and namespace metrics based on class properties. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class PropertyStrategy extends AbstractASTVisitor implements CodeRankStrategyI -{ - /** - * All found nodes. - * - * @var array<string, array> - */ - private $nodes = array(); - - /** - * Returns the collected nodes. - * - * @return array<string, array> - */ - public function getCollectedNodes() - { - return $this->nodes; - } - - /** - * Visits a property node. - * - * @param \PDepend\Source\AST\ASTProperty $property - * @return void - */ - public function visitProperty(ASTProperty $property) - { - $this->fireStartProperty($property); - - if (($depClass = $property->getClass()) === null) { - $this->fireEndProperty($property); - return; - } - - $depNamespace = $depClass->getNamespace(); - - $class = $property->getDeclaringClass(); - $namespace = $class->getNamespace(); - - if ($depClass !== $class) { - $this->initNode($class); - $this->initNode($depClass); - - $this->nodes[$class->getId()]['in'][] = $depClass->getId(); - $this->nodes[$depClass->getId()]['out'][] = $class->getId(); - } - - if ($depNamespace !== $namespace) { - $this->initNode($namespace); - $this->initNode($depNamespace); - - $this->nodes[$namespace->getId()]['in'][] = $depNamespace->getId(); - $this->nodes[$depNamespace->getId()]['out'][] = $namespace->getId(); - } - - $this->fireEndProperty($property); - } - - /** - * Initializes the temporary node container for the given <b>$node</b>. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return void - */ - protected function initNode(AbstractASTArtifact $node) - { - if (!isset($this->nodes[$node->getId()])) { - $this->nodes[$node->getId()] = array( - 'in' => array(), - 'out' => array(), - 'name' => $node->getName(), - 'type' => get_class($node) - ); - } - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/StrategyFactory.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/StrategyFactory.php deleted file mode 100644 index 3d061b0..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CodeRankAnalyzer/StrategyFactory.php +++ /dev/null @@ -1,125 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer\CodeRankAnalyzer; - -/** - * Factory for the different code rank strategies. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class StrategyFactory -{ - /** - * The identifier for the inheritance strategy. - */ - const STRATEGY_INHERITANCE = 'inheritance'; - - /** - * The identifier for the property strategy. - */ - const STRATEGY_PROPERTY = 'property'; - - /** - * The identifier for the method strategy. - */ - const STRATEGY_METHOD = 'method'; - - /** - * The default strategy. - * - * @var string - */ - private $defaultStrategy = self::STRATEGY_INHERITANCE; - - /** - * List of all valid properties. - * - * @var array<string> - */ - private $validStrategies = array( - self::STRATEGY_INHERITANCE, - self::STRATEGY_METHOD, - self::STRATEGY_PROPERTY - ); - - /** - * Creates the default code rank strategy. - * - * @return \PDepend\Metrics\Analyzer\CodeRankAnalyzer\CodeRankStrategyI - */ - public function createDefaultStrategy() - { - return $this->createStrategy($this->defaultStrategy); - } - - /** - * Creates a code rank strategy for the given identifier. - * - * @param string $strategyName The strategy identifier. - * @return \PDepend\Metrics\Analyzer\CodeRankAnalyzer\CodeRankStrategyI - * @throws \InvalidArgumentException If the given <b>$id</b> is not valid or - * no matching class declaration exists. - */ - public function createStrategy($strategyName) - { - if (in_array($strategyName, $this->validStrategies) === false) { - throw new \InvalidArgumentException( - sprintf('Cannot load file for identifier "%s".', $strategyName) - ); - } - - // Prepare identifier - $name = ucfirst(strtolower($strategyName)); - - $className = "PDepend\\Metrics\\Analyzer\\CodeRankAnalyzer\\{$name}Strategy"; - - if (false === class_exists($className)) { - $fileName = "PDepend/Metrics/Analyzer/CodeRankAnalyzer/{$name}Strategy.php"; - - include_once $fileName; - } - - return new $className(); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CohesionAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CohesionAnalyzer.php deleted file mode 100644 index d5ce8e8..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CohesionAnalyzer.php +++ /dev/null @@ -1,155 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractAnalyzer; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTArtifactList; - -/** - * This analyzer implements several metrics that describe cohesion of classes - * and namespaces. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class CohesionAnalyzer extends AbstractAnalyzer implements AnalyzerNodeAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_LCOM4 = 'lcom4'; - - /** - * Collected cohesion metrics for classes. - * - * @var array - */ - private $nodeMetrics = array(); - - /** - * This method will return an <b>array</b> with all generated metric values - * for the node with the given <b>$id</b> identifier. If there are no - * metrics for the requested node, this method will return an empty <b>array</b>. - * - * <code> - * array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ) - * </code> - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array<string, mixed> - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - if (isset($this->nodeMetrics[$artifact->getId()])) { - return $this->nodeMetrics[$artifact->getId()]; - } - return array(); - } - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * - * @return void - */ - public function analyze($namespaces) - { - $this->fireStartAnalyzer(); - - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->fireEndAnalyzer(); - } - - /* - public function visitProperty(\PDepend\Source\AST\ASTProperty $property) - { - $this->fireStartProperty($property); - echo ltrim($property->getName(), '$'), PHP_EOL; - $this->fireEndProperty($property); - } - - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - $prefixes = $method->findChildrenOfType( - 'PDepend\\Source\\AST\\ASTMemberPrimaryPrefix' - ); - foreach ($prefixes as $prefix) { - $variable = $prefix->getChild(0); - if ($variable instanceof \PDepend\Source\AST\ASTVariable - && $variable->isThis() - ) { - echo "\$this->"; - } elseif ($variable instanceof \PDepend\Source\AST\ASTSelfReference) { - echo "self::"; - } else { - continue; - } - - $next = $prefix->getChild(1); - if ($next instanceof \PDepend\Source\AST\ASTMemberPrimaryPrefix) { - $next = $next->getChild(0); - } - - if ($next instanceof \PDepend\Source\AST\ASTPropertyPostfix) { - echo $next->getImage(), PHP_EOL; - } elseif ($next instanceof \PDepend\Source\AST\ASTMethodPostfix) { - echo $next->getImage(), '()', PHP_EOL; - } - } - - $this->fireEndMethod($method); - } - */ -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CouplingAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CouplingAnalyzer.php deleted file mode 100644 index 11cd75c..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CouplingAnalyzer.php +++ /dev/null @@ -1,453 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractAnalyzer; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Metrics\AnalyzerProjectAware; -use PDepend\Source\AST\AbstractASTCallable; -use PDepend\Source\AST\AbstractASTType; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTProperty; - -/** - * This analyzer collects coupling values for the hole project. It calculates - * all function and method <b>calls</b> and the <b>fanout</b>, that means the - * number of referenced types. - * - * The FANOUT calculation is based on the definition used by the apache maven - * project. - * - * <ul> - * <li>field declarations (Uses doc comment annotations)</li> - * <li>formal parameters and return types (The return type uses doc comment - * annotations)</li> - * <li>throws declarations (Uses doc comment annotations)</li> - * <li>local variables</li> - * </ul> - * - * http://www.jajakarta.org/turbine/en/turbine/maven/reference/metrics.html - * - * The implemented algorithm counts each type only once for a method and function. - * Any type that is either a supertype or a subtype of the class is not counted. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class CouplingAnalyzer extends AbstractAnalyzer implements AnalyzerNodeAware, AnalyzerProjectAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_CALLS = 'calls', - M_FANOUT = 'fanout', - M_CA = 'ca', - M_CBO = 'cbo', - M_CE = 'ce'; - - /** - * Has this analyzer already processed the source under test? - * - * @var boolean - * @since 0.10.2 - */ - private $uninitialized = true; - - /** - * The number of method or function calls. - * - * @var integer - */ - private $calls = 0; - - /** - * Number of fanouts. - * - * @var integer - */ - private $fanout = 0; - - /** - * Temporary map that is used to hold the id combinations of dependee and - * depender. - * - * @var array<string, array> - * @since 0.10.2 - */ - private $dependencyMap = array(); - - /** - * This array holds a mapping between node identifiers and an array with - * the node's metrics. - * - * @var array<string, array> - * @since 0.10.2 - */ - private $nodeMetrics = array(); - - /** - * Provides the project summary as an <b>array</b>. - * - * <code> - * array( - * 'calls' => 23, - * 'fanout' => 42 - * ) - * </code> - * - * @return array<string, mixed> - */ - public function getProjectMetrics() - { - return array( - self::M_CALLS => $this->calls, - self::M_FANOUT => $this->fanout - ); - } - - /** - * This method will return an <b>array</b> with all generated metric values - * for the given node instance. If there are no metrics for the given node - * this method will return an empty <b>array</b>. - * - * <code> - * array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ) - * </code> - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array<string, mixed> - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - if (isset($this->nodeMetrics[$artifact->getId()])) { - return $this->nodeMetrics[$artifact->getId()]; - } - return array(); - } - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->uninitialized) { - $this->doAnalyze($namespaces); - $this->uninitialized = false; - } - } - - /** - * This method traverses all namespaces in the given iterator and calculates - * the coupling metrics for them. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - * @since 0.10.2 - */ - private function doAnalyze($namespaces) - { - $this->fireStartAnalyzer(); - $this->reset(); - - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->postProcessTemporaryCouplingMap(); - $this->fireEndAnalyzer(); - } - - /** - * This method resets all internal state variables before the analyzer can - * start the object tree traversal. - * - * @return void - * @since 0.10.2 - */ - private function reset() - { - $this->calls = 0; - $this->fanout = 0; - $this->nodeMetrics = array(); - $this->dependencyMap = array(); - } - - /** - * This method takes the temporary coupling map with node IDs and calculates - * the concrete node metrics. - * - * @return void - * @since 0.10.2 - */ - private function postProcessTemporaryCouplingMap() - { - foreach ($this->dependencyMap as $id => $metrics) { - $afferentCoupling = count($metrics['ca']); - $efferentCoupling = count($metrics['ce']); - - $this->nodeMetrics[$id] = array( - self::M_CA => $afferentCoupling, - self::M_CBO => $efferentCoupling, - self::M_CE => $efferentCoupling - ); - - $this->fanout += $efferentCoupling; - } - - $this->dependencyMap = array(); - } - - /** - * Visits a function node. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - $this->fireStartFunction($function); - - $fanouts = array(); - if (($type = $function->getReturnClass()) !== null) { - $fanouts[] = $type; - ++$this->fanout; - } - foreach ($function->getExceptionClasses() as $type) { - if (in_array($type, $fanouts, true) === false) { - $fanouts[] = $type; - ++$this->fanout; - } - } - foreach ($function->getDependencies() as $type) { - if (in_array($type, $fanouts, true) === false) { - $fanouts[] = $type; - ++$this->fanout; - } - } - - foreach ($fanouts as $fanout) { - $this->initDependencyMap($fanout); - - $this->dependencyMap[$fanout->getId()]['ca'][$function->getId()] = true; - } - - $this->countCalls($function); - - $this->fireEndFunction($function); - } - - /** - * Visit method for classes that will be called by PDepend during the - * analysis phase with the current context class. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - * @since 0.10.2 - */ - public function visitClass(ASTClass $class) - { - $this->initDependencyMap($class); - parent::visitClass($class); - } - - /** - * Visit method for interfaces that will be called by PDepend during the - * analysis phase with the current context interface. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - * @since 0.10.2 - */ - public function visitInterface(ASTInterface $interface) - { - $this->initDependencyMap($interface); - parent::visitInterface($interface); - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - $declaringClass = $method->getParent(); - - $this->calculateCoupling( - $declaringClass, - $method->getReturnClass() - ); - - foreach ($method->getExceptionClasses() as $type) { - $this->calculateCoupling($declaringClass, $type); - } - foreach ($method->getDependencies() as $type) { - $this->calculateCoupling($declaringClass, $type); - } - - $this->countCalls($method); - - $this->fireEndMethod($method); - } - - /** - * Visits a property node. - * - * @param \PDepend\Source\AST\ASTProperty $property - * @return void - */ - public function visitProperty(ASTProperty $property) - { - $this->fireStartProperty($property); - - $this->calculateCoupling( - $property->getDeclaringClass(), - $property->getClass() - ); - - $this->fireEndProperty($property); - } - - /** - * Calculates the coupling between the given types. - * - * @param \PDepend\Source\AST\AbstractASTType $declaringType - * @param \PDepend\Source\AST\AbstractASTType $coupledType - * @return void - * @since 0.10.2 - */ - private function calculateCoupling( - AbstractASTType $declaringType, - AbstractASTType $coupledType = null - ) { - $this->initDependencyMap($declaringType); - - if (null === $coupledType) { - return; - } - if ($coupledType->isSubtypeOf($declaringType) - || $declaringType->isSubtypeOf($coupledType) - ) { - return; - } - - $this->initDependencyMap($coupledType); - - $this->dependencyMap[ - $declaringType->getId() - ]['ce'][ - $coupledType->getId() - ] = true; - - $this->dependencyMap[ - $coupledType->getId() - ]['ca'][ - $declaringType->getId() - ] = true; - } - - /** - * This method will initialize a temporary coupling container for the given - * given class or interface instance. - * - * @param \PDepend\Source\AST\AbstractASTType $type - * @return void - * @since 0.10.2 - */ - private function initDependencyMap(AbstractASTType $type) - { - if (isset($this->dependencyMap[$type->getId()])) { - return; - } - - $this->dependencyMap[$type->getId()] = array( - 'ce' => array(), - 'ca' => array() - ); - } - - /** - * Counts all calls within the given <b>$callable</b> - * - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return void - */ - private function countCalls(AbstractASTCallable $callable) - { - $invocations = $callable->findChildrenOfType('PDepend\\Source\\AST\\ASTInvocation'); - - $invoked = array(); - - foreach ($invocations as $invocation) { - $parents = $invocation->getParentsOfType('PDepend\\Source\\AST\\ASTMemberPrimaryPrefix'); - - $image = ''; - foreach ($parents as $parent) { - $child = $parent->getChild(0); - if ($child !== $invocation) { - $image .= $child->getImage() . '.'; - } - } - $image .= $invocation->getImage() . '()'; - - $invoked[$image] = $image; - } - - $this->calls += count($invoked); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CrapIndexAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CrapIndexAnalyzer.php deleted file mode 100644 index 80cd94b..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CrapIndexAnalyzer.php +++ /dev/null @@ -1,271 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractAnalyzer; -use PDepend\Metrics\AggregateAnalyzer; -use PDepend\Metrics\Analyzer; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Source\AST\AbstractASTCallable; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTMethod; - -/** - * This analyzer calculates the C.R.A.P. index for methods an functions when a - * clover coverage report was supplied. This report can be supplied by using the - * command line option <b>--coverage-report=</b>. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class CrapIndexAnalyzer extends AbstractAnalyzer implements AggregateAnalyzer, AnalyzerNodeAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_CRAP_INDEX = 'crap', - M_COVERAGE = 'cov'; - - /** - * The report option name. - */ - const REPORT_OPTION = 'coverage-report'; - - /** - * Calculated crap metrics. - * - * @var array<string, array> - */ - private $metrics = null; - - /** - * The coverage report instance representing the supplied coverage report - * file. - * - * @var \PDepend\Util\Coverage\Report - */ - private $report = null; - - /** - * - * @var \PDepend\Metrics\Analyzer - */ - private $ccnAnalyzer = null; - - /** - * Returns <b>true</b> when this analyzer is enabled. - * - * @return boolean - */ - public function isEnabled() - { - return isset($this->options[self::REPORT_OPTION]); - } - - /** - * Returns the calculated metrics for the given node or an empty <b>array</b> - * when no metrics exist for the given node. - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array<string, float> - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - if (isset($this->metrics[$artifact->getId()])) { - return $this->metrics[$artifact->getId()]; - } - return array(); - } - - /** - * Returns an array with analyzer class names that are required by the crap - * index analyzers. - * - * @return array<string> - */ - public function getRequiredAnalyzers() - { - return array('PDepend\\Metrics\\Analyzer\\CyclomaticComplexityAnalyzer'); - } - - /** - * Adds an analyzer that this analyzer depends on. - * - * @param \PDepend\Metrics\Analyzer $analyzer - * @return void - */ - public function addAnalyzer(Analyzer $analyzer) - { - $this->ccnAnalyzer = $analyzer; - } - - /** - * Performs the crap index analysis. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->isEnabled() && $this->metrics === null) { - $this->doAnalyze($namespaces); - } - } - - /** - * Performs the crap index analysis. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - private function doAnalyze($namespaces) - { - $this->metrics = array(); - - $this->ccnAnalyzer->analyze($namespaces); - - $this->fireStartAnalyzer(); - - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->fireEndAnalyzer(); - } - - /** - * Visits the given method. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - if ($method->isAbstract() === false) { - $this->visitCallable($method); - } - } - - /** - * Visits the given function. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - $this->visitCallable($function); - } - - /** - * Visits the given callable instance. - * - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return void - */ - private function visitCallable(AbstractASTCallable $callable) - { - $this->metrics[$callable->getId()] = array( - self::M_CRAP_INDEX => $this->calculateCrapIndex($callable), - self::M_COVERAGE => $this->calculateCoverage($callable) - ); - } - - /** - * Calculates the crap index for the given callable. - * - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return float - */ - private function calculateCrapIndex(AbstractASTCallable $callable) - { - $report = $this->createOrReturnCoverageReport(); - - $complexity = $this->ccnAnalyzer->getCcn2($callable); - $coverage = $report->getCoverage($callable); - - if ($coverage == 0) { - return pow($complexity, 2) + $complexity; - } elseif ($coverage > 99.5) { - return $complexity; - } - return pow($complexity, 2) * pow(1 - $coverage / 100, 3) + $complexity; - } - - /** - * Calculates the code coverage for the given callable object. - * - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return float - */ - private function calculateCoverage(AbstractASTCallable $callable) - { - return $this->createOrReturnCoverageReport()->getCoverage($callable); - } - - /** - * Returns a previously created report instance or creates a new report - * instance. - * - * @return \PDepend\Util\Coverage\Report - */ - private function createOrReturnCoverageReport() - { - if ($this->report === null) { - $this->report = $this->createCoverageReport(); - } - return $this->report; - } - - /** - * Creates a new coverage report instance. - * - * @return \PDepend\Util\Coverage\Report - */ - private function createCoverageReport() - { - $factory = new \PDepend\Util\Coverage\Factory(); - return $factory->create($this->options['coverage-report']); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CyclomaticComplexityAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CyclomaticComplexityAnalyzer.php deleted file mode 100644 index 7d662e3..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/CyclomaticComplexityAnalyzer.php +++ /dev/null @@ -1,464 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractCachingAnalyzer; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Metrics\AnalyzerProjectAware; -use PDepend\Source\AST\AbstractASTCallable; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; - -/** - * This class calculates the Cyclomatic Complexity Number(CCN) for the project, - * methods and functions. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class CyclomaticComplexityAnalyzer extends AbstractCachingAnalyzer implements AnalyzerNodeAware, AnalyzerProjectAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_CYCLOMATIC_COMPLEXITY_1 = 'ccn', - M_CYCLOMATIC_COMPLEXITY_2 = 'ccn2'; - - /** - * The project Cyclomatic Complexity Number. - * - * @var integer - */ - private $ccn = 0; - - /** - * Extended Cyclomatic Complexity Number(CCN2) for the project. - * - * @var integer - */ - private $ccn2 = 0; - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->metrics === null) { - $this->loadCache(); - $this->fireStartAnalyzer(); - - // Init node metrics - $this->metrics = array(); - - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->fireEndAnalyzer(); - $this->unloadCache(); - } - } - - /** - * Returns the cyclomatic complexity for the given <b>$node</b> instance. - * - * @param \PDepend\Source\AST\ASTArtifact $node - * @return integer - */ - public function getCcn(ASTArtifact $node) - { - $metrics = $this->getNodeMetrics($node); - if (isset($metrics[self::M_CYCLOMATIC_COMPLEXITY_1])) { - return $metrics[self::M_CYCLOMATIC_COMPLEXITY_1]; - } - return 0; - } - - /** - * Returns the extended cyclomatic complexity for the given <b>$node</b> - * instance. - * - * @param \PDepend\Source\AST\ASTArtifact $node - * @return integer - */ - public function getCcn2(ASTArtifact $node) - { - $metrics = $this->getNodeMetrics($node); - if (isset($metrics[self::M_CYCLOMATIC_COMPLEXITY_2])) { - return $metrics[self::M_CYCLOMATIC_COMPLEXITY_2]; - } - return 0; - } - - /** - * This method will return an <b>array</b> with all generated metric values - * for the given <b>$node</b>. If there are no metrics for the requested - * node, this method will return an empty <b>array</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array<string, integer> - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - if (isset($this->metrics[$artifact->getId()])) { - return $this->metrics[$artifact->getId()]; - } - return array(); - } - - /** - * Provides the project summary metrics as an <b>array</b>. - * - * @return array - */ - public function getProjectMetrics() - { - return array( - self::M_CYCLOMATIC_COMPLEXITY_1 => $this->ccn, - self::M_CYCLOMATIC_COMPLEXITY_2 => $this->ccn2 - ); - } - - /** - * Visits a function node. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - $this->fireStartFunction($function); - - if (false === $this->restoreFromCache($function)) { - $this->calculateComplexity($function); - } - $this->updateProjectMetrics($function->getId()); - - $this->fireEndFunction($function); - } - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - // Empty visit method, we don't want interface metrics - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - if (false === $this->restoreFromCache($method)) { - $this->calculateComplexity($method); - } - $this->updateProjectMetrics($method->getId()); - - $this->fireEndMethod($method); - } - - /** - * Visits methods, functions or closures and calculated their complexity. - * - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return void - * @since 0.9.8 - */ - public function calculateComplexity(AbstractASTCallable $callable) - { - $data = array( - self::M_CYCLOMATIC_COMPLEXITY_1 => 1, - self::M_CYCLOMATIC_COMPLEXITY_2 => 1 - ); - - foreach ($callable->getChildren() as $child) { - $data = $child->accept($this, $data); - } - - $this->metrics[$callable->getId()] = $data; - } - - /** - * Stores the complexity of a node and updates the corresponding project - * values. - * - * @param string $nodeId Identifier of the analyzed item. - * - * @return void - * @since 1.0.0 - */ - private function updateProjectMetrics($nodeId) - { - $this->ccn += $this->metrics[$nodeId][self::M_CYCLOMATIC_COMPLEXITY_1]; - $this->ccn2 += $this->metrics[$nodeId][self::M_CYCLOMATIC_COMPLEXITY_2]; - } - - /** - * Visits a boolean AND-expression. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitBooleanAndExpression($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - return $this->visit($node, $data); - } - - /** - * Visits a boolean OR-expression. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitBooleanOrExpression($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - return $this->visit($node, $data); - } - - /** - * Visits a switch label. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitSwitchLabel($node, $data) - { - if (!$node->isDefault()) { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_1]; - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - } - return $this->visit($node, $data); - } - - /** - * Visits a catch statement. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitCatchStatement($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_1]; - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - - return $this->visit($node, $data); - } - - /** - * Visits an elseif statement. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitElseIfStatement($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_1]; - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - - return $this->visit($node, $data); - } - - /** - * Visits a for statement. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitForStatement($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_1]; - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - - return $this->visit($node, $data); - } - - /** - * Visits a foreach statement. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitForeachStatement($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_1]; - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - - return $this->visit($node, $data); - } - - /** - * Visits an if statement. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitIfStatement($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_1]; - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - - return $this->visit($node, $data); - } - - /** - * Visits a logical AND expression. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitLogicalAndExpression($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - return $this->visit($node, $data); - } - - /** - * Visits a logical OR expression. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitLogicalOrExpression($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - return $this->visit($node, $data); - } - - /** - * Visits a ternary operator. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitConditionalExpression($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_1]; - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - - return $this->visit($node, $data); - } - - /** - * Visits a while-statement. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.8 - */ - public function visitWhileStatement($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_1]; - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - - return $this->visit($node, $data); - } - - /** - * Visits a do/while-statement. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param array<string, integer> $data The previously calculated ccn values. - * - * @return array<string, integer> - * @since 0.9.12 - */ - public function visitDoWhileStatement($node, $data) - { - ++$data[self::M_CYCLOMATIC_COMPLEXITY_1]; - ++$data[self::M_CYCLOMATIC_COMPLEXITY_2]; - - return $this->visit($node, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/DependencyAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/DependencyAnalyzer.php deleted file mode 100644 index e56da54..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/DependencyAnalyzer.php +++ /dev/null @@ -1,492 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractAnalyzer; -use PDepend\Source\AST\AbstractASTArtifact; -use PDepend\Source\AST\AbstractASTClassOrInterface; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTNamespace; - -/** - * This visitor generates the metrics for the analyzed namespaces. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class DependencyAnalyzer extends AbstractAnalyzer -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_NUMBER_OF_CLASSES = 'tc', - M_NUMBER_OF_CONCRETE_CLASSES = 'cc', - M_NUMBER_OF_ABSTRACT_CLASSES = 'ac', - M_AFFERENT_COUPLING = 'ca', - M_EFFERENT_COUPLING = 'ce', - M_ABSTRACTION = 'a', - M_INSTABILITY = 'i', - M_DISTANCE = 'd'; - /** - * Hash with all calculated node metrics. - * - * <code> - * array( - * '0375e305-885a-4e91-8b5c-e25bda005438' => array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ), - * 'e60c22f0-1a63-4c40-893e-ed3b35b84d0b' => array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ) - * ) - * </code> - * - * @var array<string, array> - */ - private $nodeMetrics = null; - - protected $nodeSet = array(); - - /** - * Nodes in which the current analyzed dependency is used. - * - * @var array<string, array<integer, \PDepend\Source\AST\AbstractASTArtifact>> - */ - private $efferentNodes = array(); - - /** - * Nodes that is used by the current analyzed node. - * - * @var array<string, array<integer, \PDepend\Source\AST\AbstractASTArtifact>> - */ - private $afferentNodes = array(); - - /** - * All collected cycles for the input code. - * - * <code> - * array( - * <namespace-id> => array( - * \PDepend\Source\AST\ASTNamespace {}, - * \PDepend\Source\AST\ASTNamespace {}, - * ), - * <namespace-id> => array( - * \PDepend\Source\AST\ASTNamespace {}, - * \PDepend\Source\AST\ASTNamespace {}, - * ), - * ) - * </code> - * - * @var array<string, array|null> - */ - private $collectedCycles = array(); - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->nodeMetrics === null) { - $this->fireStartAnalyzer(); - - $this->nodeMetrics = array(); - - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->postProcess(); - - $this->calculateAbstractness(); - $this->calculateInstability(); - $this->calculateDistance(); - - $this->fireEndAnalyzer(); - } - } - - /** - * Returns the statistics for the requested node. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return array - */ - public function getStats(AbstractASTArtifact $node) - { - $stats = array(); - if (isset($this->nodeMetrics[$node->getId()])) { - $stats = $this->nodeMetrics[$node->getId()]; - } - return $stats; - } - - /** - * Returns an array of all afferent nodes. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return \PDepend\Source\AST\AbstractASTArtifact[] - */ - public function getAfferents(AbstractASTArtifact $node) - { - $afferents = array(); - if (isset($this->afferentNodes[$node->getId()])) { - $afferents = $this->afferentNodes[$node->getId()]; - } - ksort($afferents); - - return $afferents; - } - - /** - * Returns an array of all efferent nodes. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return \PDepend\Source\AST\AbstractASTArtifact[] - */ - public function getEfferents(AbstractASTArtifact $node) - { - $efferents = array(); - if (isset($this->efferentNodes[$node->getId()])) { - $efferents = $this->efferentNodes[$node->getId()]; - } - ksort($efferents); - - return $efferents; - } - - /** - * Returns an array of nodes that build a cycle for the requested node or it - * returns <b>null</b> if no cycle exists . - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return \PDepend\Source\AST\AbstractASTArtifact[] - */ - public function getCycle(AbstractASTArtifact $node) - { - if (array_key_exists($node->getId(), $this->collectedCycles)) { - return $this->collectedCycles[$node->getId()]; - } - - $list = array(); - if ($this->collectCycle($list, $node)) { - $this->collectedCycles[$node->getId()] = $list; - } else { - $this->collectedCycles[$node->getId()] = null; - } - - return $this->collectedCycles[$node->getId()]; - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - $namespace = $method->getParent()->getNamespace(); - foreach ($method->getDependencies() as $dependency) { - $this->collectDependencies($namespace, $dependency->getNamespace()); - } - - $this->fireEndMethod($method); - } - - /** - * Visits a namespace node. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function visitNamespace(ASTNamespace $namespace) - { - $this->fireStartNamespace($namespace); - - $this->initNamespaceMetric($namespace); - - $this->nodeSet[$namespace->getId()] = $namespace; - - foreach ($namespace->getTypes() as $type) { - $type->accept($this); - } - - $this->fireEndNamespace($namespace); - } - - /** - * Visits a class node. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - $this->fireStartClass($class); - $this->visitType($class); - $this->fireEndClass($class); - } - - /** - * Visits an interface node. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - $this->fireStartInterface($interface); - $this->visitType($interface); - $this->fireEndInterface($interface); - } - - /** - * Generic visit method for classes and interfaces. Both visit methods - * delegate calls to this method. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $type - * @return void - */ - protected function visitType(AbstractASTClassOrInterface $type) - { - $id = $type->getNamespace()->getId(); - - // Increment total classes count - ++$this->nodeMetrics[$id][self::M_NUMBER_OF_CLASSES]; - - // Check for abstract or concrete class - if ($type->isAbstract()) { - ++$this->nodeMetrics[$id][self::M_NUMBER_OF_ABSTRACT_CLASSES]; - } else { - ++$this->nodeMetrics[$id][self::M_NUMBER_OF_CONCRETE_CLASSES]; - } - - - foreach ($type->getDependencies() as $dependency) { - $this->collectDependencies( - $type->getNamespace(), - $dependency->getNamespace() - ); - } - - foreach ($type->getMethods() as $method) { - $method->accept($this); - } - } - - /** - * Collects the dependencies between the two given namespaces. - * - * @param \PDepend\Source\AST\ASTNamespace $namespaceA - * @param \PDepend\Source\AST\ASTNamespace $namespaceB - * - * @return void - */ - private function collectDependencies(ASTNamespace $namespaceA, ASTNamespace $namespaceB) - { - $idA = $namespaceA->getId(); - $idB = $namespaceB->getId(); - - if ($idB === $idA) { - return; - } - - // Create a container for this dependency - $this->initNamespaceMetric($namespaceB); - - if (!in_array($idB, $this->nodeMetrics[$idA][self::M_EFFERENT_COUPLING])) { - $this->nodeMetrics[$idA][self::M_EFFERENT_COUPLING][] = $idB; - $this->nodeMetrics[$idB][self::M_AFFERENT_COUPLING][] = $idA; - } - } - - /** - * Initializes the node metric record for the given <b>$namespace</b>. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - protected function initNamespaceMetric(ASTNamespace $namespace) - { - $id = $namespace->getId(); - - if (!isset($this->nodeMetrics[$id])) { - $this->nodeSet[$id] = $namespace; - - $this->nodeMetrics[$id] = array( - self::M_NUMBER_OF_CLASSES => 0, - self::M_NUMBER_OF_CONCRETE_CLASSES => 0, - self::M_NUMBER_OF_ABSTRACT_CLASSES => 0, - self::M_AFFERENT_COUPLING => array(), - self::M_EFFERENT_COUPLING => array(), - self::M_ABSTRACTION => 0, - self::M_INSTABILITY => 0, - self::M_DISTANCE => 0 - ); - } - } - - /** - * Post processes all analyzed nodes. - * - * @return void - */ - protected function postProcess() - { - foreach ($this->nodeMetrics as $id => $metrics) { - $this->afferentNodes[$id] = array(); - foreach ($metrics[self::M_AFFERENT_COUPLING] as $caId) { - $this->afferentNodes[$id][] = $this->nodeSet[$caId]; - } - - sort($this->afferentNodes[$id]); - - $this->efferentNodes[$id] = array(); - foreach ($metrics[self::M_EFFERENT_COUPLING] as $ceId) { - $this->efferentNodes[$id][] = $this->nodeSet[$ceId]; - } - - sort($this->efferentNodes[$id]); - - $afferent = count($metrics[self::M_AFFERENT_COUPLING]); - $efferent = count($metrics[self::M_EFFERENT_COUPLING]); - - $this->nodeMetrics[$id][self::M_AFFERENT_COUPLING] = $afferent; - $this->nodeMetrics[$id][self::M_EFFERENT_COUPLING] = $efferent; - } - } - - /** - * Calculates the abstractness for all analyzed nodes. - * - * @return void - */ - protected function calculateAbstractness() - { - foreach ($this->nodeMetrics as $id => $metrics) { - if ($metrics[self::M_NUMBER_OF_CLASSES] !== 0) { - $this->nodeMetrics[$id][self::M_ABSTRACTION] = ( - $metrics[self::M_NUMBER_OF_ABSTRACT_CLASSES] / - $metrics[self::M_NUMBER_OF_CLASSES] - ); - } - } - } - - /** - * Calculates the instability for all analyzed nodes. - * - * @return void - */ - protected function calculateInstability() - { - foreach ($this->nodeMetrics as $id => $metrics) { - // Count total incoming and outgoing dependencies - $total = ( - $metrics[self::M_AFFERENT_COUPLING] + - $metrics[self::M_EFFERENT_COUPLING] - ); - - if ($total !== 0) { - $this->nodeMetrics[$id][self::M_INSTABILITY] = ( - $metrics[self::M_EFFERENT_COUPLING] / $total - ); - } - } - } - - /** - * Calculates the distance to an optimal value. - * - * @return void - */ - protected function calculateDistance() - { - foreach ($this->nodeMetrics as $id => $metrics) { - $this->nodeMetrics[$id][self::M_DISTANCE] = abs( - ($metrics[self::M_ABSTRACTION] + $metrics[self::M_INSTABILITY]) - 1 - ); - } - } - - /** - * Collects a single cycle that is reachable by this namespace. All namespaces - * that are part of the cylce are stored in the given <b>$list</b> array. - * - * @param \PDepend\Source\AST\ASTNamespace[] $list - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return boolean If this method detects a cycle the return value is <b>true</b> - * otherwise this method will return <b>false</b>. - */ - protected function collectCycle(array &$list, ASTNamespace $namespace) - { - if (in_array($namespace, $list, true)) { - $list[] = $namespace; - return true; - } - - $list[] = $namespace; - - foreach ($this->getEfferents($namespace) as $efferent) { - if ($this->collectCycle($list, $efferent)) { - return true; - } - } - - if (is_int($idx = array_search($namespace, $list, true))) { - unset($list[$idx]); - } - return false; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/HalsteadAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/HalsteadAnalyzer.php deleted file mode 100644 index c30b6b8..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/HalsteadAnalyzer.php +++ /dev/null @@ -1,401 +0,0 @@ -<?php - -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2015, Matthias Mullie <pdepend@mullie.eu>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2015 Matthias Mullie. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractCachingAnalyzer; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Source\AST\AbstractASTCallable; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\Tokenizer\Tokens; - -/** - * This class calculates the Halstead Complexity Measures for the project, - * methods and functions. - * - * @copyright 2015 Matthias Mullie. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class HalsteadAnalyzer extends AbstractCachingAnalyzer implements AnalyzerNodeAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_HALSTEAD_LENGTH = 'hnt', // N = N1 + N2 (total operators + operands) - M_HALSTEAD_VOCABULARY = 'hnd', // n = n1 + n2 (distinct operators + operands) - M_HALSTEAD_VOLUME = 'hv', // V = N * log2(n) - M_HALSTEAD_DIFFICULTY = 'hd', // D = (n1 / 2) * (N2 / n2) - M_HALSTEAD_LEVEL = 'hl', // L = 1 / D - M_HALSTEAD_EFFORT = 'he', // E = V * D - M_HALSTEAD_TIME = 'ht', // T = E / 18 - M_HALSTEAD_BUGS = 'hb', // B = (E ** (2/3)) / 3000 - M_HALSTEAD_CONTENT = 'hi'; // I = (V / D) - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->metrics === null) { - $this->loadCache(); - $this->fireStartAnalyzer(); - - // Init node metrics - $this->metrics = array(); - - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->fireEndAnalyzer(); - $this->unloadCache(); - } - } - - /** - * This method will return an <b>array</b> with all generated basis metrics - * for the given <b>$node</b> (n1, n2, N1, N2). If there are no metrics for - * the requested node, this method will return an empty <b>array</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array - */ - public function getNodeBasisMetrics(ASTArtifact $artifact) - { - if (isset($this->metrics[$artifact->getId()])) { - return $this->metrics[$artifact->getId()]; - } - - return array(); - } - - /** - * This method will return an <b>array</b> with all generated metric values - * for the given <b>$node</b>. If there are no metrics for the requested - * node, this method will return an empty <b>array</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - $basis = $this->getNodeBasisMetrics($artifact); - if ($basis) { - return $this->calculateHalsteadMeasures($basis); - } - - return array(); - } - - /** - * Visits a function node. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - $this->fireStartFunction($function); - - if (false === $this->restoreFromCache($function)) { - $this->calculateHalsteadBasis($function); - } - - $this->fireEndFunction($function); - } - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - // Empty visit method, we don't want interface metrics - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - if (false === $this->restoreFromCache($method)) { - $this->calculateHalsteadBasis($method); - } - - $this->fireEndMethod($method); - } - - /** - * @see http://www.scribd.com/doc/99533/Halstead-s-Operators-and-Operands-in-C-C-JAVA-by-Indranil-Nandy - * - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return void - */ - public function calculateHalsteadBasis(AbstractASTCallable $callable) - { - $operators = array(); - $operands = array(); - - $skipUntil = null; - - $tokens = $callable->getTokens(); - foreach ($tokens as $i => $token) { - /* - * Some operations should be ignored, e.g. function declarations. - * When we encounter a new function, we'll skip all tokens until we - * find the closing token. - */ - if ($skipUntil !== null) { - if ($token->type === $skipUntil) { - $skipUntil = null; - } - - continue; - } - - switch ($token->type) { - // A pair of parenthesis is considered a single operator. - case Tokens::T_PARENTHESIS_CLOSE: - case Tokens::T_CURLY_BRACE_CLOSE: - case Tokens::T_SQUARED_BRACKET_CLOSE: - case Tokens::T_ANGLE_BRACKET_CLOSE: - break; - - // A label is considered an operator if it is used as the target - // of a GOTO statement. - case Tokens::T_GOTO: - $operators[] = $token->image; - // Ignore next token as operand but count as operator instead. - $skipUntil = $tokens[$i + 1]->type; - $operators[] = $tokens[$i + 1]->image; - break; - - /* - * The following control structures case ...: for (...) if (...) - * switch (...) while(...) and try-catch (...) are treated in a - * special way. The colon and the parentheses are considered to - * be a part of the constructs. The case and the colon or the - * “for (...)”, “if (...)”, “switch (...)”, “while(...)”, - * “try-catch( )” are counted together as one operator. - */ - // case Tokens::T_SWITCH: // not followed by () - // case Tokens::T_TRY: // not followed by () - // case Tokens::T_DO: // always comes with while, which accounts for () already - case Tokens::T_IF: - case Tokens::T_FOR: - case Tokens::T_FOREACH: - case Tokens::T_WHILE: - case Tokens::T_CATCH: - $operators[] = $token->image; - /* - * These are always followed by parenthesis, which would add - * another operator (only opening parenthesis counts) - * so we'll have to skip that one. - */ - $skipUntil = Tokens::T_PARENTHESIS_OPEN; - break; - - /* - * The ternary operator ‘?’ followed by ‘:’ is considered a - * single operator as it is equivalent to “if-else” construct. - */ - case Tokens::T_COLON: - /* - * Colon is used after keyword, where it counts as part of - * that operator, or in ternary operator, where it also - * counts as 1. - */ - break; - - // The comments are considered neither an operator nor an operand. - case Tokens::T_DOC_COMMENT: - case Tokens::T_COMMENT: - break; - - /* - * `new` is considered same as the function call, mainly because - * it's equivalent to the function call. - */ - case Tokens::T_NEW: - break; - - /* - * Like T_IF & co, array(..) needs 3 tokens ("array", "(" and - * ")") for what's essentially just 1 operator. - */ - case Tokens::T_ARRAY: - break; - - /* - * Class::method or $object->method both only count as 1 - * identifier, even though they consist of 3 tokens. - */ - case Tokens::T_OBJECT_OPERATOR: - case Tokens::T_DOUBLE_COLON: - // Glue ->/:: and before & after parts together. - $image = array_pop($operands).$token->image.$tokens[$i + 1]->image; - $operands[] = $image; - - // Skip next part (would be seen as operand) - $skipUntil = $tokens[$i + 1]->type; - break; - - // Ignore HEREDOC delimiters. - case Tokens::T_START_HEREDOC: - case Tokens::T_END_HEREDOC: - break; - - // Ignore PHP open & close tags and non-PHP content. - case Tokens::T_OPEN_TAG: - case Tokens::T_CLOSE_TAG: - case Tokens::T_NO_PHP: - break; - - /* - * The function name is considered a single operator when it - * appears as calling a function, but when it appears in - * declarations or in function definitions it is not counted as - * operator. - * Default parameter assignments are not counted. - */ - case Tokens::T_FUNCTION: - // Because `)` could appear in default argument assignment - // (`$var = array()`), we need to skip until `{`, but that - // one should be included in operators. - $skipUntil = Tokens::T_CURLY_BRACE_OPEN; - $operators[] = '{'; - break; - - /* - * When variables or constants appear in declaration they are - * not considered as operands, they are considered operands only - * when they appear with operators in expressions. - */ - case Tokens::T_VAR: - case Tokens::T_CONST: - $skipUntil = Tokens::T_SEMICOLON; - break; - case Tokens::T_STRING: - // `define` is T_STRING, just like any other identifier. - if ($token->image === 'define') { - // Undo all of "define", "(", name, ",", value, ")" - $skipUntil = Tokens::T_PARENTHESIS_CLOSE; - } else { - $operands[] = $token->image; - } - break; - - // Operands - case Tokens::T_CONSTANT_ENCAPSED_STRING: - case Tokens::T_VARIABLE: - case Tokens::T_LNUMBER: - case Tokens::T_DNUMBER: - case Tokens::T_NUM_STRING: - case Tokens::T_NULL: - case Tokens::T_TRUE: - case Tokens::T_FALSE: - case Tokens::T_CLASS_FQN: - case Tokens::T_LINE: - case Tokens::T_METHOD_C: - case Tokens::T_NS_C: - case Tokens::T_DIR: - case TOKENS::T_ENCAPSED_AND_WHITESPACE: // content of HEREDOC - $operands[] = $token->image; - break; - - // Everything else is an operator. - default: - $operators[] = $token->image; - break; - } - } - - $this->metrics[$callable->getId()] = array( - 'n1' => count($operators), - 'n2' => count($operands), - 'N1' => count(array_unique($operators)), - 'N2' => count(array_unique($operands)), - ); - } - - /** - * Calculates Halstead measures from n1, n2, N1 & N2. - * - * @see http://www.verifysoft.com/en_halstead_metrics.html - * @see http://www.grammatech.com/codesonar/workflow-features/halstead - * - * @param array $basis [n1, n2, N1, N2] - * @return array - */ - public function calculateHalsteadMeasures(array $basis) - { - $measures = array(); - $measures[self::M_HALSTEAD_LENGTH] = $basis['N1'] + $basis['N2']; - $measures[self::M_HALSTEAD_VOCABULARY] = $basis['n1'] + $basis['n2']; - $measures[self::M_HALSTEAD_VOLUME] = - $measures[self::M_HALSTEAD_LENGTH] * log($measures[self::M_HALSTEAD_VOCABULARY], 2); - $measures[self::M_HALSTEAD_DIFFICULTY] = ($basis['n1'] / 2) * ($basis['N1'] / ($basis['n2'] ?: 1)); - $measures[self::M_HALSTEAD_LEVEL] = 1 / ($measures[self::M_HALSTEAD_DIFFICULTY] ?: 1); - $measures[self::M_HALSTEAD_EFFORT] = - $measures[self::M_HALSTEAD_VOLUME] * $measures[self::M_HALSTEAD_DIFFICULTY]; - $measures[self::M_HALSTEAD_TIME] = $measures[self::M_HALSTEAD_EFFORT] / 18; - $measures[self::M_HALSTEAD_BUGS] = pow($measures[self::M_HALSTEAD_EFFORT], (2/3)) / 3000; - $measures[self::M_HALSTEAD_CONTENT] = - $measures[self::M_HALSTEAD_VOLUME] / ($measures[self::M_HALSTEAD_DIFFICULTY] ?: 1); - - return $measures; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/HierarchyAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/HierarchyAnalyzer.php deleted file mode 100644 index 5ff878e..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/HierarchyAnalyzer.php +++ /dev/null @@ -1,317 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractAnalyzer; -use PDepend\Metrics\AnalyzerFilterAware; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Metrics\AnalyzerProjectAware; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTNamespace; - -/** - * This analyzer calculates class/namespace hierarchy metrics. - * - * This analyzer expects that a node list filter is set, before it starts the - * analyze process. This filter will suppress PHP internal and external library - * stuff. - * - * This analyzer is based on the following metric set: - * - http://www.aivosto.com/project/help/pm-oo-misc.html - * - * This analyzer is based on the following metric set: - * - http://www.aivosto.com/project/help/pm-oo-misc.html - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class HierarchyAnalyzer extends AbstractAnalyzer implements AnalyzerFilterAware, AnalyzerNodeAware, AnalyzerProjectAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_NUMBER_OF_ABSTRACT_CLASSES = 'clsa', - M_NUMBER_OF_CONCRETE_CLASSES = 'clsc', - M_NUMBER_OF_ROOT_CLASSES = 'roots', - M_NUMBER_OF_LEAF_CLASSES = 'leafs'; - - /** - * Number of all analyzed functions. - * - * @var integer - */ - private $fcs = 0; - - /** - * Number of all analyzer methods. - * - * @var integer - */ - private $mts = 0; - - /** - * Number of all analyzed classes. - * - * @var integer - */ - private $cls = 0; - - /** - * Number of all analyzed abstract classes. - * - * @var integer - */ - private $clsa = 0; - - /** - * Number of all analyzed interfaces. - * - * @var integer - */ - private $interfs = 0; - - /** - * Number of all root classes within the analyzed source code. - * - * @var array<string, boolean> - */ - private $roots = array(); - - /** - * Number of all none leaf classes within the analyzed source code - * - * @var array<string, boolean> - */ - private $noneLeafs = array(); - - /** - * Hash with all calculated node metrics. - * - * <code> - * array( - * '0375e305-885a-4e91-8b5c-e25bda005438' => array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ), - * 'e60c22f0-1a63-4c40-893e-ed3b35b84d0b' => array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ) - * ) - * </code> - * - * @var array<string, array> - */ - private $nodeMetrics = null; - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->nodeMetrics === null) { - $this->fireStartAnalyzer(); - - // Init node metrics - $this->nodeMetrics = array(); - - // Visit all nodes - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->fireEndAnalyzer(); - } - } - - /** - * Provides the project summary metrics as an <b>array</b>. - * - * @return array<string, mixed> - */ - public function getProjectMetrics() - { - // Count none leaf classes - $noneLeafs = count($this->noneLeafs); - - return array( - self::M_NUMBER_OF_ABSTRACT_CLASSES => $this->clsa, - self::M_NUMBER_OF_CONCRETE_CLASSES => $this->cls - $this->clsa, - self::M_NUMBER_OF_ROOT_CLASSES => count($this->roots), - self::M_NUMBER_OF_LEAF_CLASSES => $this->cls - $noneLeafs, - ); - } - - /** - * This method will return an <b>array</b> with all generated metric values - * for the given <b>$node</b> instance. If there are no metrics for the - * requested node, this method will return an empty <b>array</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array<string, mixed> - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - if (isset($this->nodeMetrics[$artifact->getId()])) { - return $this->nodeMetrics[$artifact->getId()]; - } - return array(); - } - - /** - * Calculates metrics for the given <b>$class</b> instance. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - if (false === $class->isUserDefined()) { - return; - } - - $this->fireStartClass($class); - - ++$this->cls; - - if ($class->isAbstract()) { - ++$this->clsa; - } - - $parentClass = $class->getParentClass(); - if ($parentClass !== null) { - if ($parentClass->getParentClass() === null) { - $this->roots[$parentClass->getId()] = true; - } - $this->noneLeafs[$parentClass->getId()] = true; - } - - // Store node metric - $this->nodeMetrics[$class->getId()] = array(); - - foreach ($class->getMethods() as $method) { - $method->accept($this); - } - foreach ($class->getProperties() as $property) { - $property->accept($this); - } - - $this->fireEndClass($class); - } - - /** - * Calculates metrics for the given <b>$function</b> instance. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - $this->fireStartFunction($function); - ++$this->fcs; - $this->fireEndFunction($function); - } - - /** - * Calculates metrics for the given <b>$interface</b> instance. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - $this->fireStartInterface($interface); - - ++$this->interfs; - - foreach ($interface->getMethods() as $method) { - $method->accept($this); - } - - $this->fireEndInterface($interface); - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - ++$this->mts; - $this->fireEndMethod($method); - } - - /** - * Calculates metrics for the given <b>$namespace</b> instance. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function visitNamespace(ASTNamespace $namespace) - { - $this->fireStartNamespace($namespace); - - foreach ($namespace->getTypes() as $type) { - $type->accept($this); - } - - foreach ($namespace->getFunctions() as $function) { - $function->accept($this); - } - - $this->fireEndNamespace($namespace); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/InheritanceAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/InheritanceAnalyzer.php deleted file mode 100644 index ec094fd..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/InheritanceAnalyzer.php +++ /dev/null @@ -1,362 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractAnalyzer; -use PDepend\Metrics\AnalyzerFilterAware; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Metrics\AnalyzerProjectAware; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\AST\ASTClass; - -/** - * This analyzer provides two project related inheritance metrics. - * - * <b>ANDC - Average Number of Derived Classes</b>: The average number of direct - * subclasses of a class. This metric only covers classes in the analyzed system, - * no library or environment classes are covered. - * - * <b>AHH - Average Hierarchy Height</b>: The computed average of all inheritance - * trees within the analyzed system, external classes or interfaces are ignored. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class InheritanceAnalyzer extends AbstractAnalyzer implements - AnalyzerNodeAware, - AnalyzerFilterAware, - AnalyzerProjectAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_AVERAGE_NUMBER_DERIVED_CLASSES = 'andc', - M_AVERAGE_HIERARCHY_HEIGHT = 'ahh', - M_DEPTH_OF_INHERITANCE_TREE = 'dit', - M_NUMBER_OF_ADDED_METHODS = 'noam', - M_NUMBER_OF_OVERWRITTEN_METHODS = 'noom', - M_NUMBER_OF_DERIVED_CLASSES = 'nocc', - M_MAXIMUM_INHERITANCE_DEPTH = 'maxDIT'; - - /** - * Contains the max inheritance depth for all root classes within the - * analyzed system. The array size is equal to the number of analyzed root - * classes. - * - * @var array<integer> - */ - private $rootClasses = array(); - - /** - * @var array<integer> - * - * @deprecated 3.0.0 This property will no longer be accessible on the public access level in next major version. - */ - public $derivedClasses = array(); - - /** - * The maximum depth of inheritance tree value within the analyzed source code. - * - * @var integer - */ - private $maxDIT = 0; - - /** - * The average number of derived classes. - * - * @var float - */ - private $andc = 0; - - /** - * The average hierarchy height. - * - * @var float - */ - private $ahh = 0; - - /** - * Total number of classes. - * - * @var integer - */ - private $numberOfClasses = 0; - - /** - * Total number of derived classes. - * - * @var integer - */ - private $numberOfDerivedClasses = 0; - - /** - * Metrics calculated for a single source node. - * - * @var array<string, array> - */ - private $nodeMetrics = null; - - /** - * This method will return an <b>array</b> with all generated metric values - * for the given <b>$node</b>. If there are no metrics for the requested - * node, this method will return an empty <b>array</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array<string, mixed> - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - if (isset($this->nodeMetrics[$artifact->getId()])) { - return $this->nodeMetrics[$artifact->getId()]; - } - return array(); - } - - /** - * Provides the project summary as an <b>array</b>. - * - * <code> - * array( - * 'andc' => 0.73, - * 'ahh' => 0.56 - * ) - * </code> - * - * @return array<string, mixed> - */ - public function getProjectMetrics() - { - return array( - self::M_AVERAGE_NUMBER_DERIVED_CLASSES => $this->andc, - self::M_AVERAGE_HIERARCHY_HEIGHT => $this->ahh, - self::M_MAXIMUM_INHERITANCE_DEPTH => $this->maxDIT, - ); - } - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->nodeMetrics === null) { - $this->nodeMetrics = array(); - - $this->fireStartAnalyzer(); - $this->doAnalyze($namespaces); - $this->fireEndAnalyzer(); - } - } - - /** - * Calculates several inheritance related metrics for the given source - * namespaces. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - * @since 0.9.10 - */ - private function doAnalyze($namespaces) - { - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - if ($this->numberOfClasses > 0) { - $this->andc = $this->numberOfDerivedClasses / $this->numberOfClasses; - } - if (($count = count($this->rootClasses)) > 0) { - $this->ahh = array_sum($this->rootClasses) / $count; - } - } - - /** - * Visits a class node. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - if (!$class->isUserDefined()) { - return; - } - - $this->fireStartClass($class); - - $this->initNodeMetricsForClass($class); - - $this->calculateNumberOfDerivedClasses($class); - $this->calculateNumberOfAddedAndOverwrittenMethods($class); - $this->calculateDepthOfInheritanceTree($class); - - $this->fireEndClass($class); - } - - /** - * Calculates the number of derived classes. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - * @since 0.9.5 - */ - private function calculateNumberOfDerivedClasses(ASTClass $class) - { - $id = $class->getId(); - if (isset($this->derivedClasses[$id]) === false) { - $this->derivedClasses[$id] = 0; - } - - $parentClass = $class->getParentClass(); - if ($parentClass !== null && $parentClass->isUserDefined()) { - $id = $parentClass->getId(); - - ++$this->numberOfDerivedClasses; - ++$this->nodeMetrics[$id][self::M_NUMBER_OF_DERIVED_CLASSES]; - } - } - - /** - * Calculates the maximum HIT for the given class. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - * @since 0.9.10 - */ - private function calculateDepthOfInheritanceTree(ASTClass $class) - { - $dit = 0; - $id = $class->getId(); - $root = $class->getId(); - - foreach ($class->getParentClasses() as $parent) { - if (!$parent->isUserDefined()) { - ++$dit; - } - ++$dit; - $root = $parent->getId(); - } - - // Collect max dit value - $this->maxDIT = max($this->maxDIT, $dit); - - if (empty($this->rootClasses[$root]) || $this->rootClasses[$root] < $dit) { - $this->rootClasses[$root] = $dit; - } - $this->nodeMetrics[$id][self::M_DEPTH_OF_INHERITANCE_TREE] = $dit; - } - - /** - * Calculates two metrics. The number of added methods and the number of - * overwritten methods. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - * @since 0.9.10 - */ - private function calculateNumberOfAddedAndOverwrittenMethods(ASTClass $class) - { - $parentClass = $class->getParentClass(); - if ($parentClass === null) { - return; - } - - $parentMethodNames = array(); - foreach ($parentClass->getAllMethods() as $method) { - $parentMethodNames[$method->getName()] = $method->isAbstract(); - } - - $numberOfAddedMethods = 0; - $numberOfOverwrittenMethods = 0; - - foreach ($class->getAllMethods() as $method) { - if ($method->getParent() !== $class) { - continue; - } - - if (isset($parentMethodNames[$method->getName()])) { - if (!$parentMethodNames[$method->getName()]) { - ++$numberOfOverwrittenMethods; - } - } else { - ++$numberOfAddedMethods; - } - } - - $id = $class->getId(); - - $this->nodeMetrics[$id][self::M_NUMBER_OF_ADDED_METHODS] = $numberOfAddedMethods; - $this->nodeMetrics[$id][self::M_NUMBER_OF_OVERWRITTEN_METHODS] = $numberOfOverwrittenMethods; - } - - /** - * Initializes a empty metric container for the given class node. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - * @since 0.9.10 - */ - private function initNodeMetricsForClass(ASTClass $class) - { - $id = $class->getId(); - if (isset($this->nodeMetrics[$id])) { - return; - } - - ++$this->numberOfClasses; - - $this->nodeMetrics[$id] = array( - self::M_DEPTH_OF_INHERITANCE_TREE => 0, - self::M_NUMBER_OF_ADDED_METHODS => 0, - self::M_NUMBER_OF_DERIVED_CLASSES => 0, - self::M_NUMBER_OF_OVERWRITTEN_METHODS => 0 - ); - - foreach ($class->getParentClasses() as $parent) { - $this->initNodeMetricsForClass($parent); - } - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/MaintainabilityIndexAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/MaintainabilityIndexAnalyzer.php deleted file mode 100644 index e4ed97a..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/MaintainabilityIndexAnalyzer.php +++ /dev/null @@ -1,201 +0,0 @@ -<?php - -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2015, Matthias Mullie <pdepend@mullie.eu>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2015 Matthias Mullie. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractCachingAnalyzer; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Source\AST\AbstractASTCallable; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; - -/** - * This class calculates the Halstead Complexity Measures for the project, - * methods and functions. - * - * @copyright 2015 Matthias Mullie. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class MaintainabilityIndexAnalyzer extends AbstractCachingAnalyzer implements AnalyzerNodeAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_MAINTAINABILITY_INDEX = 'mi'; - - /** - * @var AbstractCachingAnalyzer[] - */ - private $analyzers = array(); - - /** - * Maintainability index is a combination of cyclomatic complexity, - * halstead volume & lines of code, all of which we already have analyzers - * for. - * - * @param array $options - */ - public function __construct(array $options = array()) - { - parent::__construct($options); - - $this->analyzers['ccn'] = new CyclomaticComplexityAnalyzer(); - $this->analyzers['halstead'] = new HalsteadAnalyzer(); - $this->analyzers['loc'] = new NodeLocAnalyzer(); - } - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace $namespaces - * @return void - */ - public function analyze($namespaces) - { - // Run CCN, Halstead & LOC analyzers first - foreach ($this->analyzers as $analyzer) { - $analyzer->setCache($this->getCache()); - $analyzer->analyze($namespaces); - } - - if ($this->metrics === null) { - $this->loadCache(); - $this->fireStartAnalyzer(); - - // Init node metrics - $this->metrics = array(); - - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->fireEndAnalyzer(); - $this->unloadCache(); - } - } - - /** - * This method will return an <b>array</b> with all generated metric values - * for the given <b>$node</b>. If there are no metrics for the requested - * node, this method will return an empty <b>array</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - if (isset($this->metrics[$artifact->getId()])) { - return $this->metrics[$artifact->getId()]; - } - - return array(); - } - - /** - * Visits a function node. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - $this->fireStartFunction($function); - - if (false === $this->restoreFromCache($function)) { - $this->calculateMaintainabilityIndex($function); - } - - $this->fireEndFunction($function); - } - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - // Empty visit method, we don't want interface metrics - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - if (false === $this->restoreFromCache($method)) { - $this->calculateMaintainabilityIndex($method); - } - - $this->fireEndMethod($method); - } - - /** - * @see http://blogs.msdn.com/b/codeanalysis/archive/2007/11/20/maintainability-index-range-and-meaning.aspx - * - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return void - */ - public function calculateMaintainabilityIndex(AbstractASTCallable $callable) - { - $cyclomaticComplexity = $this->analyzers['ccn']->getCcn2($callable); - - $halstead = $this->analyzers['halstead']->getNodeMetrics($callable); - $halsteadVolume = $halstead[HalsteadAnalyzer::M_HALSTEAD_VOLUME]; - - $loc = $this->analyzers['loc']->getNodeMetrics($callable); - $eloc = $loc[NodeLocAnalyzer::M_EXECUTABLE_LINES_OF_CODE]; - - $maintainabilityIndex = 171 - 5.2 * log($halsteadVolume) - 0.23 * $cyclomaticComplexity - 16.2 * log($eloc); - $maintainabilityIndex = min(100, max(0, $maintainabilityIndex * 100 / 171)); - $this->metrics[$callable->getId()] = array(self::M_MAINTAINABILITY_INDEX => $maintainabilityIndex); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NPathComplexityAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NPathComplexityAnalyzer.php deleted file mode 100644 index 3c1a691..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NPathComplexityAnalyzer.php +++ /dev/null @@ -1,571 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractCachingAnalyzer; -use PDepend\Metrics\AnalyzerFilterAware; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Source\AST\AbstractASTCallable; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTBooleanAndExpression; -use PDepend\Source\AST\ASTBooleanOrExpression; -use PDepend\Source\AST\ASTConditionalExpression; -use PDepend\Source\AST\ASTExpression; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTLogicalAndExpression; -use PDepend\Source\AST\ASTLogicalOrExpression; -use PDepend\Source\AST\ASTLogicalXorExpression; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTStatement; -use PDepend\Source\AST\ASTSwitchLabel; -use PDepend\Util\MathUtil; - -/** - * This analyzer calculates the NPath complexity of functions and methods. The - * NPath complexity metric measures the acyclic execution paths through a method - * or function. See Nejmeh, Communications of the ACM Feb 1988 pp 188-200. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class NPathComplexityAnalyzer extends AbstractCachingAnalyzer implements AnalyzerFilterAware, AnalyzerNodeAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_NPATH_COMPLEXITY = 'npath'; - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->metrics === null) { - $this->loadCache(); - $this->fireStartAnalyzer(); - - $this->metrics = array(); - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->fireEndAnalyzer(); - $this->unloadCache(); - } - } - - /** - * This method will return an <b>array</b> with all generated metric values - * for the node with the given <b>$id</b> identifier. If there are no - * metrics for the requested node, this method will return an empty <b>array</b>. - * - * <code> - * array( - * 'npath' => '17' - * ) - * </code> - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - $metric = array(); - if (isset($this->metrics[$artifact->getId()])) { - $metric = array(self::M_NPATH_COMPLEXITY => $this->metrics[$artifact->getId()]); - } - return $metric; - } - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - // Empty visit method, we don't want interface metrics - } - - /** - * Visits a function node. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - $this->fireStartFunction($function); - - if (false === $this->restoreFromCache($function)) { - $this->calculateComplexity($function); - } - - $this->fireEndFunction($function); - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - if (false === $this->restoreFromCache($method)) { - $this->calculateComplexity($method); - } - - $this->fireEndMethod($method); - } - - /** - * This method will calculate the NPath complexity for the given callable - * instance. - * - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return void - * @since 0.9.12 - */ - protected function calculateComplexity(AbstractASTCallable $callable) - { - $npath = '1'; - foreach ($callable->getChildren() as $child) { - $stmt = $child->accept($this, $npath); - $npath = MathUtil::mul($npath, $stmt); - } - - $this->metrics[$callable->getId()] = $npath; - } - - /** - * This method calculates the NPath Complexity of a conditional-statement, - * the meassured value is then returned as a string. - * - * <code> - * <expr1> ? <expr2> : <expr3> - * - * -- NP(?) = NP(<expr1>) + NP(<expr2>) + NP(<expr3>) + 2 -- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node - * @param string $data - * @return string - * @since 0.9.12 - */ - public function visitConditionalExpression($node, $data) - { - // Calculate the complexity of the condition - $parent = $node->getParent()->getChild(0); - $npath = $this->sumComplexity($parent); - - // New PHP 5.3 ifsetor-operator $x ?: $y - if (count($node->getChildren()) === 1) { - $npath = MathUtil::mul($npath, '2'); - } - - // The complexity of each child has no minimum - foreach ($node->getChildren() as $child) { - $cn = $this->sumComplexity($child); - $npath = MathUtil::add($npath, $cn); - } - - // Add 2 for the branching per the NPath spec - $npath = MathUtil::add($npath, '2'); - - return MathUtil::mul($npath, $data); - } - - /** - * This method calculates the NPath Complexity of a do-while-statement, the - * meassured value is then returned as a string. - * - * <code> - * do - * <do-range> - * while (<expr>) - * S; - * - * -- NP(do) = NP(<do-range>) + NP(<expr>) + 1 -- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param string $data The previously calculated npath value. - * - * @return string - * @since 0.9.12 - */ - public function visitDoWhileStatement($node, $data) - { - $stmt = $node->getChild(0)->accept($this, 1); - $expr = $this->sumComplexity($node->getChild(1)); - - $npath = MathUtil::add($expr, $stmt); - $npath = MathUtil::add($npath, '1'); - - return MathUtil::mul($npath, $data); - } - - /** - * This method calculates the NPath Complexity of an elseif-statement, the - * meassured value is then returned as a string. - * - * <code> - * elseif (<expr>) - * <elseif-range> - * S; - * - * -- NP(elseif) = NP(<elseif-range>) + NP(<expr>) + 1 -- - * - * - * elseif (<expr>) - * <elseif-range> - * else - * <else-range> - * S; - * - * -- NP(if) = NP(<if-range>) + NP(<expr>) + NP(<else-range> -- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param string $data The previously calculated npath value. - * - * @return string - * @since 0.9.12 - */ - public function visitElseIfStatement($node, $data) - { - $npath = $this->sumComplexity($node->getChild(0)); - foreach ($node->getChildren() as $child) { - if ($child instanceof ASTStatement) { - $expr = $child->accept($this, 1); - $npath = MathUtil::add($npath, $expr); - } - } - - if (!$node->hasElse()) { - $npath = MathUtil::add($npath, '1'); - } - - return MathUtil::mul($npath, $data); - } - - /** - * This method calculates the NPath Complexity of a for-statement, the - * meassured value is then returned as a string. - * - * <code> - * for (<expr1>; <expr2>; <expr3>) - * <for-range> - * S; - * - * -- NP(for) = NP(<for-range>) + NP(<expr1>) + NP(<expr2>) + NP(<expr3>) + 1 -- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param string $data The previously calculated npath value. - * - * @return string - * @since 0.9.12 - */ - public function visitForStatement($node, $data) - { - $npath = '1'; - foreach ($node->getChildren() as $child) { - if ($child instanceof ASTStatement) { - $stmt = $child->accept($this, 1); - $npath = MathUtil::add($npath, $stmt); - } elseif ($child instanceof ASTExpression) { - $expr = $this->sumComplexity($child); - $npath = MathUtil::add($npath, $expr); - } - } - - return MathUtil::mul($npath, $data); - } - - /** - * This method calculates the NPath Complexity of a for-statement, the - * meassured value is then returned as a string. - * - * <code> - * fpreach (<expr>) - * <foreach-range> - * S; - * - * -- NP(foreach) = NP(<foreach-range>) + NP(<expr>) + 1 -- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param string $data The previously calculated npath value. - * - * @return string - * @since 0.9.12 - */ - public function visitForeachStatement($node, $data) - { - $npath = $this->sumComplexity($node->getChild(0)); - $npath = MathUtil::add($npath, '1'); - - foreach ($node->getChildren() as $child) { - if ($child instanceof ASTStatement) { - $stmt = $child->accept($this, 1); - $npath = MathUtil::add($npath, $stmt); - } - } - - return MathUtil::mul($npath, $data); - } - - /** - * This method calculates the NPath Complexity of an if-statement, the - * meassured value is then returned as a string. - * - * <code> - * if (<expr>) - * <if-range> - * S; - * - * -- NP(if) = NP(<if-range>) + NP(<expr>) + 1 -- - * - * - * if (<expr>) - * <if-range> - * else - * <else-range> - * S; - * - * -- NP(if) = NP(<if-range>) + NP(<expr>) + NP(<else-range> -- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param string $data The previously calculated npath value. - * - * @return string - * @since 0.9.12 - */ - public function visitIfStatement($node, $data) - { - $npath = $this->sumComplexity($node->getChild(0)); - - foreach ($node->getChildren() as $child) { - if ($child instanceof ASTStatement) { - $stmt = $child->accept($this, 1); - $npath = MathUtil::add($npath, $stmt); - } - } - - if (!$node->hasElse()) { - $npath = MathUtil::add($npath, '1'); - } - - return MathUtil::mul($npath, $data); - } - - /** - * This method calculates the NPath Complexity of a return-statement, the - * meassured value is then returned as a string. - * - * <code> - * return <expr>; - * - * -- NP(return) = NP(<expr>) -- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param string $data The previously calculated npath value. - * - * @return string - * @since 0.9.12 - */ - public function visitReturnStatement($node, $data) - { - if (($npath = $this->sumComplexity($node)) === '0') { - return $data; - } - return MathUtil::mul($npath, $data); - } - - /** - * This method calculates the NPath Complexity of a switch-statement, the - * meassured value is then returned as a string. - * - * <code> - * switch (<expr>) - * <case-range1> - * <case-range2> - * ... - * <default-range> - * - * -- NP(switch) = NP(<expr>) + NP(<default-range>) + NP(<case-range1>) ... -- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param string $data The previously calculated npath value. - * - * @return string - * @since 0.9.12 - */ - public function visitSwitchStatement($node, $data) - { - $npath = $this->sumComplexity($node->getChild(0)); - foreach ($node->getChildren() as $child) { - if ($child instanceof ASTSwitchLabel) { - $label = $child->accept($this, 1); - $npath = MathUtil::add($npath, $label); - } - } - return MathUtil::mul($npath, $data); - } - - /** - * This method calculates the NPath Complexity of a try-catch-statement, the - * meassured value is then returned as a string. - * - * <code> - * try - * <try-range> - * catch - * <catch-range> - * - * -- NP(try) = NP(<try-range>) + NP(<catch-range>) -- - * - * - * try - * <try-range> - * catch - * <catch-range1> - * catch - * <catch-range2> - * ... - * - * -- NP(try) = NP(<try-range>) + NP(<catch-range1>) + NP(<catch-range2>) ... -- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param string $data The previously calculated npath value. - * - * @return string - * @since 0.9.12 - */ - public function visitTryStatement($node, $data) - { - $npath = '0'; - foreach ($node->getChildren() as $child) { - if ($child instanceof ASTStatement) { - $stmt = $child->accept($this, 1); - $npath = MathUtil::add($npath, $stmt); - } - } - return MathUtil::mul($npath, $data); - } - - /** - * This method calculates the NPath Complexity of a while-statement, the - * meassured value is then returned as a string. - * - * <code> - * while (<expr>) - * <while-range> - * S; - * - * -- NP(while) = NP(<while-range>) + NP(<expr>) + 1 -- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * @param string $data The previously calculated npath value. - * - * @return string - * @since 0.9.12 - */ - public function visitWhileStatement($node, $data) - { - $expr = $this->sumComplexity($node->getChild(0)); - $stmt = $node->getChild(1)->accept($this, 1); - - $npath = MathUtil::add($expr, $stmt); - $npath = MathUtil::add($npath, '1'); - - return MathUtil::mul($npath, $data); - } - - /** - * Calculates the expression sum of the given node. - * - * @param \PDepend\Source\AST\ASTNode $node The currently visited node. - * - * @return string - * @since 0.9.12 - * @todo I don't like this method implementation, it should be possible to - * implement this method with more visitor behavior for the boolean - * and logical expressions. - */ - public function sumComplexity($node) - { - $sum = '0'; - if ($node instanceof ASTConditionalExpression) { - $sum = MathUtil::add($sum, $node->accept($this, 1)); - } elseif ($node instanceof ASTBooleanAndExpression - || $node instanceof ASTBooleanOrExpression - || $node instanceof ASTLogicalAndExpression - || $node instanceof ASTLogicalOrExpression - || $node instanceof ASTLogicalXorExpression - ) { - $sum = MathUtil::add($sum, '1'); - } else { - foreach ($node->getChildren() as $child) { - $expr = $this->sumComplexity($child); - $sum = MathUtil::add($sum, $expr); - } - } - return $sum; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NodeCountAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NodeCountAnalyzer.php deleted file mode 100644 index 4262f4f..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NodeCountAnalyzer.php +++ /dev/null @@ -1,328 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractAnalyzer; -use PDepend\Metrics\AnalyzerFilterAware; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Metrics\AnalyzerProjectAware; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTNamespace; - -/** - * This analyzer collects different count metrics for code artifacts like - * classes, methods, functions or namespaces. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class NodeCountAnalyzer extends AbstractAnalyzer implements AnalyzerFilterAware, AnalyzerNodeAware, AnalyzerProjectAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_NUMBER_OF_PACKAGES = 'nop', - M_NUMBER_OF_CLASSES = 'noc', - M_NUMBER_OF_INTERFACES = 'noi', - M_NUMBER_OF_METHODS = 'nom', - M_NUMBER_OF_FUNCTIONS = 'nof'; - - /** - * Number Of Packages. - * - * @var integer - */ - private $nop = 0; - - /** - * Number Of Classes. - * - * @var integer - */ - private $noc = 0; - - /** - * Number Of Interfaces. - * - * @var integer - */ - private $noi = 0; - - /** - * Number Of Methods. - * - * @var integer - */ - private $nom = 0; - - /** - * Number Of Functions. - * - * @var integer - */ - private $nof = 0; - - /** - * Collected node metrics - * - * @var array<string, array> - */ - private $nodeMetrics = null; - - /** - * This method will return an <b>array</b> with all generated metric values - * for the given <b>$node</b> instance. If there are no metrics for the - * requested node, this method will return an empty <b>array</b>. - * - * <code> - * array( - * 'noc' => 23, - * 'nom' => 17, - * 'nof' => 42 - * ) - * </code> - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array<string, mixed> - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - $metrics = array(); - if (isset($this->nodeMetrics[$artifact->getId()])) { - $metrics = $this->nodeMetrics[$artifact->getId()]; - } - return $metrics; - } - - /** - * Provides the project summary as an <b>array</b>. - * - * <code> - * array( - * 'nop' => 23, - * 'noc' => 17, - * 'noi' => 23, - * 'nom' => 42, - * 'nof' => 17 - * ) - * </code> - * - * @return array<string, mixed> - */ - public function getProjectMetrics() - { - return array( - self::M_NUMBER_OF_PACKAGES => $this->nop, - self::M_NUMBER_OF_CLASSES => $this->noc, - self::M_NUMBER_OF_INTERFACES => $this->noi, - self::M_NUMBER_OF_METHODS => $this->nom, - self::M_NUMBER_OF_FUNCTIONS => $this->nof - ); - } - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces) - { - // Check for previous run - if ($this->nodeMetrics === null) { - $this->fireStartAnalyzer(); - - $this->nodeMetrics = array(); - - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->fireEndAnalyzer(); - } - } - - /** - * Visits a class node. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - if (false === $class->isUserDefined()) { - return; - } - - $this->fireStartClass($class); - - // Update global class count - ++$this->noc; - - $id = $class->getNamespace()->getId(); - ++$this->nodeMetrics[$id][self::M_NUMBER_OF_CLASSES]; - - $this->nodeMetrics[$class->getId()] = array( - self::M_NUMBER_OF_METHODS => 0 - ); - - foreach ($class->getMethods() as $method) { - $method->accept($this); - } - - $this->fireEndClass($class); - } - - /** - * Visits a function node. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - $this->fireStartFunction($function); - - // Update global function count - ++$this->nof; - - $id = $function->getNamespace()->getId(); - ++$this->nodeMetrics[$id][self::M_NUMBER_OF_FUNCTIONS]; - - $this->fireEndFunction($function); - } - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - if (false === $interface->isUserDefined()) { - return; - } - - $this->fireStartInterface($interface); - - // Update global class count - ++$this->noi; - - $id = $interface->getNamespace()->getId(); - ++$this->nodeMetrics[$id][self::M_NUMBER_OF_INTERFACES]; - - $this->nodeMetrics[$interface->getId()] = array( - self::M_NUMBER_OF_METHODS => 0 - ); - - foreach ($interface->getMethods() as $method) { - $method->accept($this); - } - - $this->fireEndInterface($interface); - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - // Update global method count - ++$this->nom; - - $parent = $method->getParent(); - - // Update parent class or interface - $parentId = $parent->getId(); - ++$this->nodeMetrics[$parentId][self::M_NUMBER_OF_METHODS]; - - $id = $parent->getNamespace()->getId(); - ++$this->nodeMetrics[$id][self::M_NUMBER_OF_METHODS]; - - $this->fireEndMethod($method); - } - - /** - * Visits a namespace node. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function visitNamespace(ASTNamespace $namespace) - { - $this->fireStartNamespace($namespace); - - ++$this->nop; - - $this->nodeMetrics[$namespace->getId()] = array( - self::M_NUMBER_OF_CLASSES => 0, - self::M_NUMBER_OF_INTERFACES => 0, - self::M_NUMBER_OF_METHODS => 0, - self::M_NUMBER_OF_FUNCTIONS => 0 - ); - - - foreach ($namespace->getClasses() as $class) { - $class->accept($this); - } - foreach ($namespace->getInterfaces() as $interface) { - $interface->accept($this); - } - foreach ($namespace->getFunctions() as $function) { - $function->accept($this); - } - - $this->fireEndNamespace($namespace); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NodeLocAnalyzer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NodeLocAnalyzer.php deleted file mode 100644 index cea8523..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/Analyzer/NodeLocAnalyzer.php +++ /dev/null @@ -1,487 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics\Analyzer; - -use PDepend\Metrics\AbstractCachingAnalyzer; -use PDepend\Metrics\AnalyzerFilterAware; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Metrics\AnalyzerProjectAware; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTCompilationUnit; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\Tokenizer\Tokens; - -/** - * This analyzer collects different lines of code metrics. - * - * It collects the total Lines Of Code(<b>loc</b>), the None Comment Lines Of - * Code(<b>ncloc</b>), the Comment Lines Of Code(<b>cloc</b>) and a approximated - * Executable Lines Of Code(<b>eloc</b>) for files, classes, interfaces, - * methods, properties and function. - * - * The current implementation has a limitation, that affects inline comments. - * The following code will suppress one line of code. - * - * <code> - * function foo() { - * foobar(); // Bad behaviour... - * } - * </code> - * - * The same rule applies to class methods. mapi, <b>PLEASE, FIX THIS ISSUE.</b> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class NodeLocAnalyzer extends AbstractCachingAnalyzer implements - AnalyzerNodeAware, - AnalyzerFilterAware, - AnalyzerProjectAware -{ - /** - * Metrics provided by the analyzer implementation. - */ - const M_LINES_OF_CODE = 'loc', - M_COMMENT_LINES_OF_CODE = 'cloc', - M_EXECUTABLE_LINES_OF_CODE = 'eloc', - M_LOGICAL_LINES_OF_CODE = 'lloc', - M_NON_COMMENT_LINES_OF_CODE = 'ncloc'; - - /** - * Collected project metrics. - * - * @var array<string, integer> - */ - private $projectMetrics = array( - self::M_LINES_OF_CODE => 0, - self::M_COMMENT_LINES_OF_CODE => 0, - self::M_EXECUTABLE_LINES_OF_CODE => 0, - self::M_LOGICAL_LINES_OF_CODE => 0, - self::M_NON_COMMENT_LINES_OF_CODE => 0 - ); - - /** - * Executable lines of code in a class. The method calculation increases - * this property with each method's ELOC value. - * - * @var integer - * @since 0.9.12 - */ - private $classExecutableLines = 0; - - /** - * Logical lines of code in a class. The method calculation increases this - * property with each method's LLOC value. - * - * @var integer - * @since 0.9.13 - */ - private $classLogicalLines = 0; - - /** - * This method will return an <b>array</b> with all generated metric values - * for the given <b>$node</b> instance. If there are no metrics for the - * requested node, this method will return an empty <b>array</b>. - * - * <code> - * array( - * 'loc' => 23, - * 'cloc' => 17, - * 'eloc' => 17, - * 'ncloc' => 42 - * ) - * </code> - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array - */ - public function getNodeMetrics(ASTArtifact $artifact) - { - $metrics = array(); - if (isset($this->metrics[$artifact->getId()])) { - $metrics = $this->metrics[$artifact->getId()]; - } - return $metrics; - } - - /** - * Provides the project summary as an <b>array</b>. - * - * <code> - * array( - * 'loc' => 23, - * 'cloc' => 17, - * 'ncloc' => 42 - * ) - * </code> - * - * @return array - */ - public function getProjectMetrics() - { - return $this->projectMetrics; - } - - /** - * Processes all {@link \PDepend\Source\AST\ASTNamespace} code nodes. - * - * @param \PDepend\Source\AST\ASTNamespace[] $namespaces - * @return void - */ - public function analyze($namespaces) - { - if ($this->metrics === null) { - $this->loadCache(); - $this->fireStartAnalyzer(); - - $this->metrics = array(); - foreach ($namespaces as $namespace) { - $namespace->accept($this); - } - - $this->fireEndAnalyzer(); - $this->unloadCache(); - } - } - - /** - * Visits a class node. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - $this->fireStartClass($class); - - $class->getCompilationUnit()->accept($this); - - $this->classExecutableLines = 0; - $this->classLogicalLines = 0; - - foreach ($class->getMethods() as $method) { - $method->accept($this); - } - - if ($this->restoreFromCache($class)) { - $this->fireEndClass($class); - return; - } - - list($cloc) = $this->linesOfCode($class->getTokens(), true); - - $loc = $class->getEndLine() - $class->getStartLine() + 1; - $ncloc = $loc - $cloc; - - $this->metrics[$class->getId()] = array( - self::M_LINES_OF_CODE => $loc, - self::M_COMMENT_LINES_OF_CODE => $cloc, - self::M_EXECUTABLE_LINES_OF_CODE => $this->classExecutableLines, - self::M_LOGICAL_LINES_OF_CODE => $this->classLogicalLines, - self::M_NON_COMMENT_LINES_OF_CODE => $ncloc, - ); - - $this->fireEndClass($class); - } - - /** - * Visits a file node. - * - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit - * @return void - */ - public function visitCompilationUnit(ASTCompilationUnit $compilationUnit) - { - // Skip for dummy files - if ($compilationUnit->getFileName() === null) { - return; - } - // Check for initial file - $id = $compilationUnit->getId(); - if (isset($this->metrics[$id])) { - return; - } - - $this->fireStartFile($compilationUnit); - - if ($this->restoreFromCache($compilationUnit)) { - $this->updateProjectMetrics($id); - $this->fireEndFile($compilationUnit); - return; - } - - list($cloc, $eloc, $lloc) = $this->linesOfCode($compilationUnit->getTokens()); - - $loc = $compilationUnit->getEndLine(); - $ncloc = $loc - $cloc; - - $this->metrics[$id] = array( - self::M_LINES_OF_CODE => $loc, - self::M_COMMENT_LINES_OF_CODE => $cloc, - self::M_EXECUTABLE_LINES_OF_CODE => $eloc, - self::M_LOGICAL_LINES_OF_CODE => $lloc, - self::M_NON_COMMENT_LINES_OF_CODE => $ncloc - ); - - $this->updateProjectMetrics($id); - - $this->fireEndFile($compilationUnit); - } - - /** - * Visits a function node. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - $this->fireStartFunction($function); - - $function->getCompilationUnit()->accept($this); - - if ($this->restoreFromCache($function)) { - $this->fireEndFunction($function); - return; - } - - list($cloc, $eloc, $lloc) = $this->linesOfCode( - $function->getTokens(), - true - ); - - $loc = $function->getEndLine() - $function->getStartLine() + 1; - $ncloc = $loc - $cloc; - - $this->metrics[$function->getId()] = array( - self::M_LINES_OF_CODE => $loc, - self::M_COMMENT_LINES_OF_CODE => $cloc, - self::M_EXECUTABLE_LINES_OF_CODE => $eloc, - self::M_LOGICAL_LINES_OF_CODE => $lloc, - self::M_NON_COMMENT_LINES_OF_CODE => $ncloc - ); - - $this->fireEndFunction($function); - } - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - $this->fireStartInterface($interface); - - $interface->getCompilationUnit()->accept($this); - - foreach ($interface->getMethods() as $method) { - $method->accept($this); - } - - if ($this->restoreFromCache($interface)) { - $this->fireEndInterface($interface); - return; - } - - list($cloc) = $this->linesOfCode($interface->getTokens(), true); - - $loc = $interface->getEndLine() - $interface->getStartLine() + 1; - $ncloc = $loc - $cloc; - - $this->metrics[$interface->getId()] = array( - self::M_LINES_OF_CODE => $loc, - self::M_COMMENT_LINES_OF_CODE => $cloc, - self::M_EXECUTABLE_LINES_OF_CODE => 0, - self::M_LOGICAL_LINES_OF_CODE => 0, - self::M_NON_COMMENT_LINES_OF_CODE => $ncloc - ); - - $this->fireEndInterface($interface); - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - if ($this->restoreFromCache($method)) { - $this->fireEndMethod($method); - return; - } - - if ($method->isAbstract()) { - $cloc = 0; - $eloc = 0; - $lloc = 0; - } else { - list($cloc, $eloc, $lloc) = $this->linesOfCode( - $method->getTokens(), - true - ); - } - $loc = $method->getEndLine() - $method->getStartLine() + 1; - $ncloc = $loc - $cloc; - - $this->metrics[$method->getId()] = array( - self::M_LINES_OF_CODE => $loc, - self::M_COMMENT_LINES_OF_CODE => $cloc, - self::M_EXECUTABLE_LINES_OF_CODE => $eloc, - self::M_LOGICAL_LINES_OF_CODE => $lloc, - self::M_NON_COMMENT_LINES_OF_CODE => $ncloc - ); - - $this->classExecutableLines += $eloc; - $this->classLogicalLines += $lloc; - - $this->fireEndMethod($method); - } - - /** - * Updates the project metrics based on the node metrics identifier by the - * given <b>$id</b>. - * - * @param string $id The unique identifier of a node. - * @return void - */ - private function updateProjectMetrics($id) - { - foreach ($this->metrics[$id] as $metric => $value) { - $this->projectMetrics[$metric] += $value; - } - } - - /** - * Counts the Comment Lines Of Code (CLOC) and a pseudo Executable Lines Of - * Code (ELOC) values. - * - * ELOC = Non Whitespace Lines + Non Comment Lines - * - * <code> - * array( - * 0 => 23, // Comment Lines Of Code - * 1 => 42 // Executable Lines Of Code - * ) - * </code> - * - * @param array $tokens The raw token stream. - * @param boolean $search Optional boolean flag, search start. - * @return array - */ - private function linesOfCode(array $tokens, $search = false) - { - $clines = array(); - $elines = array(); - $llines = 0; - - $count = count($tokens); - if ($search === true) { - for ($i = 0; $i < $count; ++$i) { - $token = $tokens[$i]; - - if ($token->type === Tokens::T_CURLY_BRACE_OPEN) { - break; - } - } - } else { - $i = 0; - } - - for (; $i < $count; ++$i) { - $token = $tokens[$i]; - - if ($token->type === Tokens::T_COMMENT - || $token->type === Tokens::T_DOC_COMMENT - ) { - $lines =& $clines; - } else { - $lines =& $elines; - } - - switch ($token->type) { - // These statement are terminated by a semicolon - //case \PDepend\Source\Tokenizer\Tokens::T_RETURN: - //case \PDepend\Source\Tokenizer\Tokens::T_THROW: - case Tokens::T_IF: - case Tokens::T_TRY: - case Tokens::T_CASE: - case Tokens::T_GOTO: - case Tokens::T_CATCH: - case Tokens::T_WHILE: - case Tokens::T_ELSEIF: - case Tokens::T_SWITCH: - case Tokens::T_DEFAULT: - case Tokens::T_FOREACH: - case Tokens::T_FUNCTION: - case Tokens::T_SEMICOLON: - ++$llines; - break; - case Tokens::T_DO: - case Tokens::T_FOR: - // Because statements at least require one semicolon - --$llines; - break; - } - - if ($token->startLine === $token->endLine) { - $lines[$token->startLine] = true; - } else { - for ($j = $token->startLine; $j <= $token->endLine; ++$j) { - $lines[$j] = true; - } - } - unset($lines); - } - return array(count($clines), count($elines), $llines); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerCacheAware.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerCacheAware.php deleted file mode 100644 index 915f83f..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerCacheAware.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Metrics; - -use PDepend\Util\Cache\CacheDriver; - -/** - * Simple marker interface that is used to mark an analyzer as cache aware. This - * means that the loading infrastructure code will inject an instance of - * {@link \PDepend\Util\Cache\CacheDriver} into this analyzer. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -interface AnalyzerCacheAware extends Analyzer -{ - /** - * Setter method for the system wide used cache. - * - * @param \PDepend\Util\Cache\CacheDriver $cache - * @return void - */ - public function setCache(CacheDriver $cache); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerFactory.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerFactory.php deleted file mode 100644 index db5f590..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerFactory.php +++ /dev/null @@ -1,88 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics; - -use Symfony\Component\DependencyInjection\ContainerInterface; - -/** - * Creates Analyzer instances - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class AnalyzerFactory -{ - /** - * @var \Symfony\Component\DependencyInjection\ContainerInterface - */ - private $container; - - /** - * Create a new Analyzer Factory - * - * @param \Symfony\Component\DependencyInjection\ContainerInterface $container - */ - public function __construct(ContainerInterface $container) - { - $this->container = $container; - } - - /** - * Create and configure all analyzers required for given set of loggers. - * - * @param \PDepend\Report\ReportGenerator[] $generators - * @return \PDepend\Metrics\Analyzer[] - */ - public function createRequiredForGenerators(array $generators) - { - $analyzers = array(); - - foreach ($generators as $logger) { - foreach ($logger->getAcceptedAnalyzers() as $type) { - $analyzers[$type] = $this->container->get($type); - } - } - - return $analyzers; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerFilterAware.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerFilterAware.php deleted file mode 100644 index fca672a..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerFilterAware.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics; - -/** - * Simple marker interface that is used to mark an analyzer as namespace filter - * aware. This means that a defined namespace filter for external dependencies - * on namespaces an its classes and interfaces must be set before this analyzer - * starts. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface AnalyzerFilterAware extends Analyzer -{ -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerIterator.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerIterator.php deleted file mode 100644 index 428c4fa..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerIterator.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.10 - */ - -namespace PDepend\Metrics; - -/** - * Filter iterator that only returns enabled {@link \PDepend\Metrics\Analyzer} - * instances. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.10 - */ -class AnalyzerIterator extends \FilterIterator -{ - /** - * Constructs a new iterator instance. - * - * @param \PDepend\Metrics\Analyzer[] $analyzers - */ - public function __construct(array $analyzers) - { - parent::__construct(new \ArrayIterator($analyzers)); - } - - /** - * Returns <b>true</b> when the current analyzer instance is enabled. - * - * @return boolean - */ - public function accept() - { - return $this->getInnerIterator()->current()->isEnabled(); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerListener.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerListener.php deleted file mode 100644 index ecf28e2..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerListener.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics; - -use PDepend\Source\ASTVisitor\ASTVisitListener; - -/** - * An implementation of this listener can be used to recieve informations about - * the current metric analyzer. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface AnalyzerListener extends ASTVisitListener -{ - /** - * This method is called when the analyzer starts code processing. - * - * @param \PDepend\Metrics\Analyzer $analyzer The context analyzer instance. - * @return void - */ - public function startAnalyzer(Analyzer $analyzer); - - /** - * This method is called when the analyzer has finished code processing. - * - * @param \PDepend\Metrics\Analyzer $analyzer The context analyzer instance. - * @return void - */ - public function endAnalyzer(Analyzer $analyzer); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerNodeAware.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerNodeAware.php deleted file mode 100644 index 34e45a3..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerNodeAware.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics; - -use PDepend\Source\AST\ASTArtifact; - -/** - * Marker interface that marks a result set as node metrics aware. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface AnalyzerNodeAware extends Analyzer -{ - /** - * This method will return an <b>array</b> with all generated metric values - * for the node with the given <b>$id</b> identifier. If there are no - * metrics for the requested node, this method will return an empty <b>array</b>. - * - * <code> - * array( - * 'loc' => 42, - * 'ncloc' => 17, - * 'cc' => 12 - * ) - * </code> - * - * @param \PDepend\Source\AST\ASTArtifact $artifact - * @return array<string, mixed> - */ - public function getNodeMetrics(ASTArtifact $artifact); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerProjectAware.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerProjectAware.php deleted file mode 100644 index 35fc759..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Metrics/AnalyzerProjectAware.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Metrics; - -/** - * This interface is used to mark a result set as project summary aware. - * - * A result set that implements this interface provides overview or calculated - * values for the complete analyzed source code. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface AnalyzerProjectAware extends Analyzer -{ - /** - * Provides the project summary as an <b>array</b>. - * - * <code> - * array( - * 'loc' => 1742, - * 'nop' => 23, - * 'noc' => 17 - * ) - * </code> - * - * @return array<string, mixed> - */ - public function getProjectMetrics(); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/ProcessListener.php b/vendor/pdepend/pdepend/src/main/php/PDepend/ProcessListener.php deleted file mode 100644 index ab1a43d..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/ProcessListener.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend; - -// @codeCoverageIgnoreStart -use PDepend\Metrics\AnalyzerListener; -use PDepend\Source\ASTVisitor\ASTVisitListener; -use PDepend\Source\Builder\Builder; -use PDepend\Source\Tokenizer\Tokenizer; - -/** - * This listener can be used to get informations about the current pdepend process. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface ProcessListener extends ASTVisitListener, AnalyzerListener -{ - /** - * Is called when PDepend starts the file parsing process. - * - * @param \PDepend\Source\Builder\Builder $builder The used node builder instance. - * @return void - */ - public function startParseProcess(Builder $builder); - - /** - * Is called when PDepend has finished the file parsing process. - * - * @param \PDepend\Source\Builder\Builder $builder The used node builder instance. - * @return void - */ - public function endParseProcess(Builder $builder); - - /** - * Is called when PDepend starts parsing of a new file. - * - * @param \PDepend\Source\Tokenizer\Tokenizer $tokenizer - * @return void - */ - public function startFileParsing(Tokenizer $tokenizer); - - /** - * Is called when PDepend has finished a file. - * - * @param \PDepend\Source\Tokenizer\Tokenizer $tokenizer - * @return void - */ - public function endFileParsing(Tokenizer $tokenizer); - - /** - * Is called when PDepend starts the analyzing process. - * - * @return void - */ - public function startAnalyzeProcess(); - - /** - * Is called when PDepend has finished the analyzing process. - * - * @return void - */ - public function endAnalyzeProcess(); - - /** - * Is called when PDepend starts the logging process. - * - * @return void - */ - public function startLogProcess(); - - /** - * Is called when PDepend has finished the logging process. - * - * @return void - */ - public function endLogProcess(); -} - -// @codeCoverageIgnoreEnd diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/CodeAwareGenerator.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/CodeAwareGenerator.php deleted file mode 100644 index c5cad63..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/CodeAwareGenerator.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Report; - -use PDepend\Source\AST\ASTArtifactList; - -/** - * A logger that implements this interface needs the analyzed code structure. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface CodeAwareGenerator extends ReportGenerator -{ - /** - * Sets the context code nodes. - * - * @param \PDepend\Source\AST\ASTArtifactList $artifacts - * @return void - */ - public function setArtifacts(ASTArtifactList $artifacts); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Dependencies/Xml.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Dependencies/Xml.php deleted file mode 100644 index 7b4eabe..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Dependencies/Xml.php +++ /dev/null @@ -1,351 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Report\Dependencies; - -use PDepend\Metrics\Analyzer; -use PDepend\Metrics\Analyzer\ClassDependencyAnalyzer; -use PDepend\Report\CodeAwareGenerator; -use PDepend\Report\FileAwareGenerator; -use PDepend\Report\NoLogOutputException; -use PDepend\Source\AST\AbstractASTArtifact; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\AST\AbstractASTClassOrInterface; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTCompilationUnit; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTNamespace; -use PDepend\Source\AST\ASTTrait; -use PDepend\Source\ASTVisitor\AbstractASTVisitor; -use PDepend\Util\Utf8Util; - -/** - * This logger generates a summary xml document with aggregated project, class, - * method and file dependencies. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Xml extends AbstractASTVisitor implements CodeAwareGenerator, FileAwareGenerator -{ - /** - * The log output file. - * - * @var string - */ - private $logFile = null; - - /** - * The raw {@link \PDepend\Source\AST\ASTNamespace} instances. - * - * @var \PDepend\Source\AST\ASTArtifactList - */ - protected $code = null; - - /** - * Set of all analyzed files. - * - * @var \PDepend\Source\AST\ASTCompilationUnit[] - */ - protected $fileSet = array(); - - /** - * @var \PDepend\Metrics\Analyzer\ClassDependencyAnalyzer|null - */ - private $dependencyAnalyzer; - - /** - * The internal used xml stack. - * - * @var \DOMElement[] - */ - private $xmlStack = array(); - - /** - * Sets the output log file. - * - * @param string $logFile The output log file. - * - * @return void - */ - public function setLogFile($logFile) - { - $this->logFile = $logFile; - } - - /** - * Returns an <b>array</b> with accepted analyzer types. These types can be - * concrete analyzer classes or one of the descriptive analyzer interfaces. - * - * @return array<string> - */ - public function getAcceptedAnalyzers() - { - return array( - 'pdepend.analyzer.class_dependency', - ); - } - - /** - * Sets the context code nodes. - * - * @param \PDepend\Source\AST\ASTArtifactList $artifacts - * @return void - */ - public function setArtifacts(ASTArtifactList $artifacts) - { - $this->code = $artifacts; - } - - /** - * Adds an analyzer to log. If this logger accepts the given analyzer it - * with return <b>true</b>, otherwise the return value is <b>false</b>. - * - * @param \PDepend\Metrics\Analyzer $analyzer The analyzer to log. - * @return boolean - */ - public function log(Analyzer $analyzer) - { - if ($analyzer instanceof ClassDependencyAnalyzer) { - $this->dependencyAnalyzer = $analyzer; - return true; - } - return false; - } - - /** - * Closes the logger process and writes the output file. - * - * @return void - * @throws \PDepend\Report\NoLogOutputException If the no log target exists. - */ - public function close() - { - if ($this->logFile === null) { - throw new NoLogOutputException($this); - } - - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - - $dependencies = $dom->createElement('dependencies'); - $dependencies->setAttribute('generated', date('Y-m-d\TH:i:s')); - $dependencies->setAttribute('pdepend', '@package_version@'); - array_push($this->xmlStack, $dependencies); - - foreach ($this->code as $node) { - $node->accept($this); - } - - $dom->appendChild($dependencies); - - $buffer = $dom->saveXML(); - file_put_contents($this->logFile, $buffer); - } - - /** - * Visits a class node. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - $this->generateTypeXml($class, 'class'); - } - - /** - * Visits a trait node. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - */ - public function visitTrait(ASTTrait $trait) - { - $this->generateTypeXml($trait, 'trait'); - } - - /** - * Generates the XML for a class or trait node. - * - * @param \PDepend\Source\AST\ASTClass $type - * @param string $typeIdentifier - * @return void - */ - private function generateTypeXml(AbstractASTClassOrInterface $type, $typeIdentifier) - { - if (!$type->isUserDefined()) { - return; - } - - $xml = end($this->xmlStack); - $doc = $xml->ownerDocument; - - $typeXml = $doc->createElement($typeIdentifier); - $typeXml->setAttribute('name', Utf8Util::ensureEncoding($type->getName())); - $xml->appendChild($typeXml); - - array_push($this->xmlStack, $typeXml); - $this->writeNodeDependencies($typeXml, $type); - $this->writeFileReference($typeXml, $type->getCompilationUnit()); - array_pop($this->xmlStack); - } - - /** - * Visits a function node. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - // Do not care - } - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - $this->generateTypeXml($interface, 'interface'); - } - - /** - * Visits a namespace node. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function visitNamespace(ASTNamespace $namespace) - { - $xml = end($this->xmlStack); - $doc = $xml->ownerDocument; - - $packageXml = $doc->createElement('package'); - $packageXml->setAttribute('name', Utf8Util::ensureEncoding($namespace->getName())); - - array_push($this->xmlStack, $packageXml); - - foreach ($namespace->getTypes() as $type) { - $type->accept($this); - } - foreach ($namespace->getFunctions() as $function) { - $function->accept($this); - } - - array_pop($this->xmlStack); - - if ($packageXml->firstChild === null) { - return; - } - - $xml->appendChild($packageXml); - } - - /** - * Aggregates all dependencies for the given <b>$node</b> instance and adds them - * to the <b>\DOMElement</b> - * - * @param \DOMElement $xml - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return void - */ - protected function writeNodeDependencies(\DOMElement $xml, AbstractASTArtifact $node) - { - if (!$this->dependencyAnalyzer) { - return; - } - - $xml = end($this->xmlStack); - $doc = $xml->ownerDocument; - - $efferentXml = $doc->createElement('efferent'); - $xml->appendChild($efferentXml); - foreach ($this->dependencyAnalyzer->getEfferents($node) as $type) { - $typeXml = $doc->createElement('type'); - $typeXml->setAttribute('namespace', Utf8Util::ensureEncoding($type->getNamespaceName())); - $typeXml->setAttribute('name', Utf8Util::ensureEncoding($type->getName())); - - $efferentXml->appendChild($typeXml); - } - - $afferentXml = $doc->createElement('afferent'); - $xml->appendChild($afferentXml); - foreach ($this->dependencyAnalyzer->getAfferents($node) as $type) { - $typeXml = $doc->createElement('type'); - $typeXml->setAttribute('namespace', Utf8Util::ensureEncoding($type->getNamespaceName())); - $typeXml->setAttribute('name', Utf8Util::ensureEncoding($type->getName())); - - $afferentXml->appendChild($typeXml); - } - } - - /** - * Appends a file reference element to the given <b>$xml</b> element. - * - * <code> - * <class name="\PDepend\Engine"> - * <file name="PDepend/Engine.php" /> - * </class> - * </code> - * - * @param \DOMElement $xml The parent xml element. - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit The code file instance. - * @return void - */ - protected function writeFileReference(\DOMElement $xml, ASTCompilationUnit $compilationUnit = null) - { - if (in_array($compilationUnit, $this->fileSet, true) === false) { - $this->fileSet[] = $compilationUnit; - } - - $fileXml = $xml->ownerDocument->createElement('file'); - $fileXml->setAttribute('name', Utf8Util::ensureEncoding($compilationUnit->getFileName())); - - $xml->appendChild($fileXml); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/FileAwareGenerator.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/FileAwareGenerator.php deleted file mode 100644 index ad9ca35..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/FileAwareGenerator.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Report; - -/** - * Marker interface for a log file aware logger. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface FileAwareGenerator extends ReportGenerator -{ - /** - * Sets the output log file. - * - * @param string $logFile The output log file. - * - * @return void - */ - public function setLogFile($logFile); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/Chart.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/Chart.php deleted file mode 100644 index cf3c2b8..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/Chart.php +++ /dev/null @@ -1,253 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Report\Jdepend; - -use PDepend\Metrics\Analyzer; -use PDepend\Metrics\Analyzer\DependencyAnalyzer; -use PDepend\Report\CodeAwareGenerator; -use PDepend\Report\FileAwareGenerator; -use PDepend\Report\NoLogOutputException; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\ASTVisitor\AbstractASTVisitor; -use PDepend\Util\Utf8Util; -use PDepend\Util\FileUtil; -use PDepend\Util\ImageConvert; - -/** - * Generates a chart with the aggregated metrics. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Chart extends AbstractASTVisitor implements CodeAwareGenerator, FileAwareGenerator -{ - /** - * The output file name. - * - * @var string - */ - private $logFile = null; - - /** - * The context source code. - * - * @var \PDepend\Source\AST\ASTArtifactList - */ - private $code = null; - - /** - * The context analyzer instance. - * - * @var \PDepend\Metrics\Analyzer\DependencyAnalyzer - */ - private $analyzer = null; - - /** - * Sets the output log file. - * - * @param string $logFile The output log file. - * - * @return void - */ - public function setLogFile($logFile) - { - $this->logFile = $logFile; - } - - /** - * Returns an <b>array</b> with accepted analyzer types. These types can be - * concrete analyzer classes or one of the descriptive analyzer interfaces. - * - * @return array<string> - */ - public function getAcceptedAnalyzers() - { - return array('pdepend.analyzer.dependency'); - } - - /** - * Sets the context code nodes. - * - * @param \PDepend\Source\AST\ASTArtifactList $artifacts - * @return void - */ - public function setArtifacts(ASTArtifactList $artifacts) - { - $this->code = $artifacts; - } - - /** - * Adds an analyzer to log. If this logger accepts the given analyzer it - * with return <b>true</b>, otherwise the return value is <b>false</b>. - * - * @param \PDepend\Metrics\Analyzer $analyzer The analyzer to log. - * @return boolean - */ - public function log(Analyzer $analyzer) - { - if ($analyzer instanceof DependencyAnalyzer) { - $this->analyzer = $analyzer; - - return true; - } - return false; - } - - /** - * Closes the logger process and writes the output file. - * - * @return void - * @throws \PDepend\Report\NoLogOutputException If the no log target exists. - */ - public function close() - { - // Check for configured log file - if ($this->logFile === null) { - throw new NoLogOutputException($this); - } - - $bias = 0.1; - - $svg = new \DOMDocument('1.0', 'UTF-8'); - $svg->loadXML(file_get_contents(dirname(__FILE__) . '/chart.svg')); - - $layer = $svg->getElementById('jdepend.layer'); - - $bad = $svg->getElementById('jdepend.bad'); - $bad->removeAttribute('xml:id'); - - $good = $svg->getElementById('jdepend.good'); - $good->removeAttribute('xml:id'); - - $legendTemplate = $svg->getElementById('jdepend.legend'); - $legendTemplate->removeAttribute('xml:id'); - - $max = 0; - $min = 0; - - $items = array(); - foreach ($this->code as $namespace) { - if (!$namespace->isUserDefined()) { - continue; - } - - $metrics = $this->analyzer->getStats($namespace); - - if (count($metrics) === 0) { - continue; - } - - $size = $metrics['cc'] + $metrics['ac']; - if ($size > $max) { - $max = $size; - } elseif ($min === 0 || $size < $min) { - $min = $size; - } - - $items[] = array( - 'size' => $size, - 'abstraction' => $metrics['a'], - 'instability' => $metrics['i'], - 'distance' => $metrics['d'], - 'name' => Utf8Util::ensureEncoding($namespace->getName()) - ); - } - - $diff = (($max - $min) / 10); - - // Sort items by size - usort( - $items, - function ($a, $b) { - return ($a['size'] - $b['size']); - } - ); - - foreach ($items as $item) { - if ($item['distance'] < $bias) { - $ellipse = $good->cloneNode(true); - } else { - $ellipse = $bad->cloneNode(true); - } - $r = 15; - if ($diff !== 0) { - $r = 5 + (($item['size'] - $min) / $diff); - } - - $a = $r / 15; - $e = (50 - $r) + ($item['abstraction'] * 320); - $f = (20 - $r + 190) - ($item['instability'] * 190); - - $transform = "matrix({$a}, 0, 0, {$a}, {$e}, {$f})"; - - $ellipse->setAttribute('id', uniqid('pdepend_')); - $ellipse->setAttribute('title', $item['name']); - $ellipse->setAttribute('transform', $transform); - - $layer->appendChild($ellipse); - - $result = preg_match('#\\\\([^\\\\]+)$#', $item['name'], $found); - if ($result && count($found)) { - $angle = rand(0, 314) / 100 - 1.57; - $legend = $legendTemplate->cloneNode(true); - $legend->setAttribute('x', $e + $r * (1 + cos($angle))); - $legend->setAttribute('y', $f + $r * (1 + sin($angle))); - $legend->nodeValue = $found[1]; - $legendTemplate->parentNode->appendChild($legend); - } - } - - $bad->parentNode->removeChild($bad); - $good->parentNode->removeChild($good); - $legendTemplate->parentNode->removeChild($legendTemplate); - - $temp = FileUtil::getSysTempDir(); - $temp .= '/' . uniqid('pdepend_') . '.svg'; - $svg->save($temp); - - ImageConvert::convert($temp, $this->logFile); - - // Remove temp file - unlink($temp); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/Xml.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/Xml.php deleted file mode 100644 index 9b0ad77..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/Xml.php +++ /dev/null @@ -1,373 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Report\Jdepend; - -use PDepend\Metrics\Analyzer; -use PDepend\Metrics\Analyzer\DependencyAnalyzer; -use PDepend\Report\CodeAwareGenerator; -use PDepend\Report\FileAwareGenerator; -use PDepend\Report\NoLogOutputException; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTNamespace; -use PDepend\Source\ASTVisitor\AbstractASTVisitor; -use PDepend\Util\Utf8Util; - -/** - * Generates an xml document with the aggregated metrics. The format is borrowed - * from <a href="http://clarkware.com/software/JDepend.html">JDepend</a>. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Xml extends AbstractASTVisitor implements CodeAwareGenerator, FileAwareGenerator -{ - /** - * The output log file. - * - * @var string - */ - private $logFile = null; - - /** - * The raw {@link \PDepend\Source\AST\ASTNamespace} instances. - * - * @var \PDepend\Source\AST\ASTArtifactList - */ - protected $code = null; - - /** - * Set of all analyzed files. - * - * @var \PDepend\Source\AST\ASTCompilationUnit[] - */ - protected $fileSet = array(); - - /** - * List of all generated project metrics. - * - * @var array<string, mixed> - */ - protected $projectMetrics = array(); - - /** - * List of all collected node metrics. - * - * @var array<string, array> - */ - protected $nodeMetrics = array(); - - /** - * The dependency result set. - * - * @var DependencyAnalyzer - */ - protected $analyzer = null; - - /** - * The Packages dom element. - * - * @var \DOMElement - */ - protected $packages = null; - - /** - * The Cycles dom element. - * - * @var \DOMElement - */ - protected $cycles = null; - - /** - * The concrete classes element for the current package. - * - * @var \DOMElement - */ - protected $concreteClasses = null; - - /** - * The abstract classes element for the current package. - * - * @var \DOMElement - */ - protected $abstractClasses = null; - - /** - * Sets the output log file. - * - * @param string $logFile The output log file. - * - * @return void - */ - public function setLogFile($logFile) - { - $this->logFile = $logFile; - } - - /** - * Returns an <b>array</b> with accepted analyzer types. These types can be - * concrete analyzer classes or one of the descriptive analyzer interfaces. - * - * @return array<string> - */ - public function getAcceptedAnalyzers() - { - return array('pdepend.analyzer.dependency'); - } - - /** - * Sets the context code nodes. - * - * @param \PDepend\Source\AST\ASTArtifactList $artifacts - * @return void - */ - public function setArtifacts(ASTArtifactList $artifacts) - { - $this->code = $artifacts; - } - - /** - * Adds an analyzer to log. If this logger accepts the given analyzer it - * with return <b>true</b>, otherwise the return value is <b>false</b>. - * - * @param \PDepend\Metrics\Analyzer $analyzer The analyzer to log. - * @return boolean - */ - public function log(Analyzer $analyzer) - { - if ($analyzer instanceof DependencyAnalyzer) { - $this->analyzer = $analyzer; - - return true; - } - return false; - } - - /** - * Closes the logger process and writes the output file. - * - * @return void - * @throws \PDepend\Report\NoLogOutputException If the no log target exists. - */ - public function close() - { - // Check for configured output - if ($this->logFile === null) { - throw new NoLogOutputException($this); - } - - $dom = new \DOMDocument('1.0', 'UTF-8'); - - $dom->formatOutput = true; - - $jdepend = $dom->createElement('PDepend'); - - $this->packages = $jdepend->appendChild($dom->createElement('Packages')); - $this->cycles = $jdepend->appendChild($dom->createElement('Cycles')); - - foreach ($this->code as $node) { - $node->accept($this); - } - - $dom->appendChild($jdepend); - $buffer = $dom->saveXML(); - file_put_contents($this->logFile, $buffer); - } - - /** - * Visits a class node. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - if (!$class->isUserDefined()) { - return; - } - - $doc = $this->packages->ownerDocument; - - $classXml = $doc->createElement('Class'); - $classXml->setAttribute('sourceFile', (string) $class->getCompilationUnit()); - $classXml->appendChild( - $doc->createTextNode( - Utf8Util::ensureEncoding($class->getName()) - ) - ); - - if ($class->isAbstract()) { - $this->abstractClasses->appendChild($classXml); - } else { - $this->concreteClasses->appendChild($classXml); - } - } - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - if (!$interface->isUserDefined()) { - return; - } - - $doc = $this->abstractClasses->ownerDocument; - - $classXml = $doc->createElement('Class'); - $classXml->setAttribute('sourceFile', (string) $interface->getCompilationUnit()); - $classXml->appendChild( - $doc->createTextNode( - Utf8Util::ensureEncoding($interface->getName()) - ) - ); - - $this->abstractClasses->appendChild($classXml); - } - - /** - * Visits a package node. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function visitNamespace(ASTNamespace $namespace) - { - if (!$namespace->isUserDefined()) { - return; - } - - $stats = $this->analyzer->getStats($namespace); - if (count($stats) === 0) { - return; - } - - $doc = $this->packages->ownerDocument; - - $this->concreteClasses = $doc->createElement('ConcreteClasses'); - $this->abstractClasses = $doc->createElement('AbstractClasses'); - - $packageXml = $doc->createElement('Package'); - $packageXml->setAttribute('name', Utf8Util::ensureEncoding($namespace->getName())); - - $statsXml = $doc->createElement('Stats'); - $statsXml->appendChild($doc->createElement('TotalClasses')) - ->appendChild($doc->createTextNode($stats['tc'])); - $statsXml->appendChild($doc->createElement('ConcreteClasses')) - ->appendChild($doc->createTextNode($stats['cc'])); - $statsXml->appendChild($doc->createElement('AbstractClasses')) - ->appendChild($doc->createTextNode($stats['ac'])); - $statsXml->appendChild($doc->createElement('Ca')) - ->appendChild($doc->createTextNode($stats['ca'])); - $statsXml->appendChild($doc->createElement('Ce')) - ->appendChild($doc->createTextNode($stats['ce'])); - $statsXml->appendChild($doc->createElement('A')) - ->appendChild($doc->createTextNode($stats['a'])); - $statsXml->appendChild($doc->createElement('I')) - ->appendChild($doc->createTextNode($stats['i'])); - $statsXml->appendChild($doc->createElement('D')) - ->appendChild($doc->createTextNode($stats['d'])); - - $dependsUpon = $doc->createElement('DependsUpon'); - foreach ($this->analyzer->getEfferents($namespace) as $efferent) { - $efferentXml = $doc->createElement('Package'); - $efferentXml->appendChild( - $doc->createTextNode( - Utf8Util::ensureEncoding($efferent->getName()) - ) - ); - - $dependsUpon->appendChild($efferentXml); - } - - $usedBy = $doc->createElement('UsedBy'); - foreach ($this->analyzer->getAfferents($namespace) as $afferent) { - $afferentXml = $doc->createElement('Package'); - $afferentXml->appendChild( - $doc->createTextNode( - Utf8Util::ensureEncoding($afferent->getName()) - ) - ); - - $usedBy->appendChild($afferentXml); - } - - $packageXml->appendChild($statsXml); - $packageXml->appendChild($this->concreteClasses); - $packageXml->appendChild($this->abstractClasses); - $packageXml->appendChild($dependsUpon); - $packageXml->appendChild($usedBy); - - if (($cycles = $this->analyzer->getCycle($namespace)) !== null) { - $cycleXml = $doc->createElement('Package'); - $cycleXml->setAttribute('Name', Utf8Util::ensureEncoding($namespace->getName())); - - foreach ($cycles as $cycle) { - $cycleXml->appendChild($doc->createElement('Package')) - ->appendChild( - $doc->createTextNode( - Utf8Util::ensureEncoding($cycle->getName()) - ) - ); - } - - $this->cycles->appendChild($cycleXml); - } - - foreach ($namespace->getTypes() as $type) { - $type->accept($this); - } - - if ($this->concreteClasses->firstChild === null - && $this->abstractClasses->firstChild === null - ) { - return; - } - - $this->packages->appendChild($packageXml); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/chart.svg b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/chart.svg deleted file mode 100644 index 8f18905..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Jdepend/chart.svg +++ /dev/null @@ -1,587 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="390" - height="250" - id="svg2924" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docname="chart.svg" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <defs - id="defs2926"> - <linearGradient - id="Definition_LinearGradient_76_64_78_66_b3ff4400_619e2400"> - <stop - offset="0" - style="stop-color: #b3ff44; stop-opacity: 1.00;" - id="stop24" /> - <stop - offset="1" - style="stop-color: #619e24; stop-opacity: 1.00;" - id="stop26" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#Definition_LinearGradient_76_64_78_66_b3ff4400_619e2400" - id="linearGradient2905" - gradientUnits="userSpaceOnUse" - x1="76.3702" - y1="64.2934" - x2="78.8554" - y2="66.7786" /> - <linearGradient - id="Definition_LinearGradient_318_84_320_87_ff9d0000_ac550000"> - <stop - offset="0" - style="stop-color: #ff9d00; stop-opacity: 1.00;" - id="stop156" /> - <stop - offset="1" - style="stop-color: #ac5500; stop-opacity: 1.00;" - id="stop158" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#Definition_LinearGradient_318_84_320_87_ff9d0000_ac550000" - id="jdepend.bad.gradient" - gradientUnits="userSpaceOnUse" - x1="0" - y1="15" - x2="15" - y2="30" /> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - id="perspective2932" /> - <linearGradient - inkscape:collect="always" - xlink:href="#Definition_LinearGradient_76_64_78_66_b3ff4400_619e2400" - id="jdepend.good.gradient" - gradientUnits="userSpaceOnUse" - x1="0" - y1="15" - x2="15" - y2="30" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1.5" - inkscape:cx="138.95468" - inkscape:cy="125" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - inkscape:window-width="1280" - inkscape:window-height="753" - inkscape:window-x="0" - inkscape:window-y="46" /> - <metadata - id="metadata2929"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - xml:id="jdepend.layer"> - <rect - style="opacity:1;fill:#4e9a06;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4614" - width="373.00024" - height="1.0000018" - x="53.196194" - y="-9.293786" - transform="matrix(0.8604851,0.5094756,-0.5094738,0.8604862,0,0)" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4464" - width="0.99999946" - height="201" - x="82" - y="19.000061" - rx="0" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4466" - width="0.99999946" - height="201" - x="113.99999" - y="19.000061" - rx="0" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4468" - width="0.99999946" - height="201" - x="146" - y="19.000061" - rx="0" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4470" - width="0.99999946" - height="201" - x="177.99998" - y="19.000061" - rx="0" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4472" - width="0.99999946" - height="201" - x="209.99998" - y="19.000061" - rx="0" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4474" - width="0.99999946" - height="201" - x="241.99998" - y="19.000061" - rx="0" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4476" - width="0.99999946" - height="201" - x="274" - y="19.000061" - rx="0" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4478" - width="0.99999946" - height="201" - x="305.99997" - y="19.000061" - rx="0" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4480" - width="0.99999946" - height="201" - x="337.99997" - y="19.000061" - rx="0" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4482" - width="0.99999946" - height="201" - x="369.99997" - y="19.000061" - rx="0" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4484" - width="331" - height="1" - x="40" - y="19.000025" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4486" - width="331" - height="1" - x="40" - y="57.000023" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4488" - width="331" - height="1" - x="40" - y="38.000023" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4490" - width="331" - height="1" - x="40" - y="76.000023" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4492" - width="331" - height="1" - x="40" - y="95.000023" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4494" - width="331" - height="1" - x="40" - y="133.00003" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4496" - width="331" - height="1" - x="40" - y="114.00002" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4498" - width="331" - height="1" - x="40" - y="152.00005" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4500" - width="331" - height="1" - x="40" - y="171.00005" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4502" - width="331" - height="1" - x="40" - y="190.00006" /> - <rect - style="opacity:1;fill:#555753;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4504" - width="331" - height="1" - x="40" - y="209.00006" /> - <rect - style="opacity:1;fill:#555753;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4462" - width="0.99999946" - height="201" - x="49.999996" - y="19.000061" - rx="0" - ry="0" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="83.181007" - y="231.87305" - id="text4506"><tspan - sodipodi:role="line" - id="tspan4508" - x="83.181007" - y="231.87305">0.1</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="114.70088" - y="231.87305" - id="text4510"><tspan - sodipodi:role="line" - id="tspan4512" - x="114.70088" - y="231.87305">0.2</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="242.95323" - y="231.87305" - id="text4514"><tspan - sodipodi:role="line" - id="tspan4516" - x="242.95323" - y="231.87305">0.6</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="210.84497" - y="231.87305" - id="text4518"><tspan - sodipodi:role="line" - id="tspan4520" - x="210.84497" - y="231.87305">0.5</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="178.72696" - y="231.87305" - id="text4522"><tspan - sodipodi:role="line" - id="tspan4524" - x="178.72696" - y="231.87305">0.4</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="146.74567" - y="231.87305" - id="text4526"><tspan - sodipodi:role="line" - id="tspan4528" - x="146.74567" - y="231.87305">0.3</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="307.16241" - y="231.87305" - id="text4530"><tspan - sodipodi:role="line" - id="tspan4532" - x="307.16241" - y="231.87305">0.8</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="275.07858" - y="231.87305" - id="text4534"><tspan - sodipodi:role="line" - id="tspan4536" - x="275.07858" - y="231.87305">0.7</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="371.16162" - y="231.87305" - id="text4538"><tspan - sodipodi:role="line" - id="tspan4540" - x="371.16162" - y="231.87305">1.0</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="339.25113" - y="231.87305" - id="text4542"><tspan - sodipodi:role="line" - id="tspan4544" - x="339.25113" - y="231.87305">0.9</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="50.533203" - y="231.87305" - id="text4546"><tspan - sodipodi:role="line" - id="tspan4548" - x="50.533203" - y="231.87305">0.0</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="28.533201" - y="193.87793" - id="text4550"><tspan - sodipodi:role="line" - id="tspan4552" - x="28.533201" - y="193.87793">0.1</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="28.533201" - y="174.87793" - id="text4554"><tspan - sodipodi:role="line" - id="tspan4556" - x="28.533201" - y="174.87793">0.2</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="28.533201" - y="98.87793" - id="text4558"><tspan - sodipodi:role="line" - id="tspan4560" - x="28.533201" - y="98.87793">0.6</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="28.533201" - y="117.87792" - id="text4562"><tspan - sodipodi:role="line" - id="tspan4564" - x="28.533201" - y="117.87792">0.5</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="28.533201" - y="136.87793" - id="text4566"><tspan - sodipodi:role="line" - id="tspan4568" - x="28.533201" - y="136.87793">0.4</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="28.533201" - y="155.87793" - id="text4570"><tspan - sodipodi:role="line" - id="tspan4572" - x="28.533201" - y="155.87793">0.3</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="28.533201" - y="60.875481" - id="text4574"><tspan - sodipodi:role="line" - id="tspan4576" - x="28.533201" - y="60.875481">0.8</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="28.533201" - y="79.87793" - id="text4578"><tspan - sodipodi:role="line" - id="tspan4580" - x="28.533201" - y="79.87793">0.7</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="28.162107" - y="22.87793" - id="text4582"><tspan - sodipodi:role="line" - id="tspan4584" - x="28.162107" - y="22.87793">1.0</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="28.533201" - y="41.875492" - id="text4586"><tspan - sodipodi:role="line" - id="tspan4588" - x="28.533201" - y="41.875492">0.9</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="28.939205" - y="212.87793" - id="text4590"><tspan - sodipodi:role="line" - id="tspan4592" - x="28.939205" - y="212.87793">0.0</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="195.05258" - y="247.85966" - id="text4604" - transform="scale(1.0000012,0.9999988)"><tspan - sodipodi:role="line" - id="tspan4606" - x="195.05258" - y="247.85966">Abstraction</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;" - x="-126.09961" - y="10.589844" - id="text4608" - transform="matrix(0,-1,1,0,0,0)"><tspan - sodipodi:role="line" - id="tspan4610" - x="-126.09961" - y="10.589844">Instability</tspan></text> - <text - xml:space="preserve" - style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:URW Chancery L" - x="313.30417" - y="246.10596" - id="text2692"><tspan - sodipodi:role="line" - id="tspan2694" - x="313.30417" - y="246.10596" - style="font-size:9px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#2e3436;font-family:Arial; Italic">Generated by PDepend</tspan></text> - <ellipse - sodipodi:ry="15" - sodipodi:rx="15" - sodipodi:cy="15" - sodipodi:cx="15" - id="jdepend.bad" - xml:id="jdepend.bad" - style="fill:url(#jdepend.bad.gradient);stroke:none" - ry="15" - rx="15" - cy="15" - cx="15" - transform="translate(163,4)" /> - <ellipse - sodipodi:ry="15" - sodipodi:rx="15" - sodipodi:cy="15" - sodipodi:cx="15" - id="jdepend.good" - xml:id="jdepend.good" - style="fill:url(#jdepend.good.gradient);stroke:none" - ry="15" - rx="15" - cy="15" - cx="15" - transform="matrix(0.6,0,0,0.6,41,10)" /> - </g> - <g> - <text - xml:space="preserve" - style="font-size:4px;font-family:Arial;fill:#2e3436;" - x="195.05258" - y="120.85966" - xml:id="jdepend.legend">Package</text> - </g> -</svg> diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/NoLogOutputException.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/NoLogOutputException.php deleted file mode 100644 index d2885e0..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/NoLogOutputException.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Report; - -/** - * This type of exception is thrown, if a required log target/log file wasn't - * configured for the current logger instance. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class NoLogOutputException extends \LogicException -{ - /** - * Creates a new log target exception for the given log instance. - * - * @param \PDepend\Report\ReportGenerator $logger - */ - public function __construct(ReportGenerator $logger) - { - $className = get_class($logger); - $message = "The log target is not configured for '{$className}'."; - - parent::__construct($message); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Overview/Pyramid.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Overview/Pyramid.php deleted file mode 100644 index 28c6ed8..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Overview/Pyramid.php +++ /dev/null @@ -1,333 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Report\Overview; - -use PDepend\Metrics\Analyzer; -use PDepend\Metrics\Analyzer\CouplingAnalyzer; -use PDepend\Metrics\Analyzer\CyclomaticComplexityAnalyzer; -use PDepend\Metrics\Analyzer\InheritanceAnalyzer; -use PDepend\Metrics\Analyzer\NodeCountAnalyzer; -use PDepend\Metrics\Analyzer\NodeLocAnalyzer; -use PDepend\Report\FileAwareGenerator; -use PDepend\Report\NoLogOutputException; -use PDepend\Util\FileUtil; -use PDepend\Util\ImageConvert; - -/** - * This logger generates a system overview pyramid, as described in the book - * <b>Object-Oriented Metrics in Practice</b>. - * - * http://www.springer.com/computer/programming/book/978-3-540-24429-5 - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Pyramid implements FileAwareGenerator -{ - /** - * The output file name. - * - * @var string - */ - private $logFile = null; - - /** - * The used coupling analyzer. - * - * @var \PDepend\Metrics\Analyzer\CouplingAnalyzer - */ - private $coupling = null; - - /** - * The used cyclomatic complexity analyzer. - * - * @var \PDepend\Metrics\Analyzer\CyclomaticComplexityAnalyzer - */ - private $cyclomaticComplexity = null; - - /** - * The used inheritance analyzer. - * - * @var \PDepend\Metrics\Analyzer\InheritanceAnalyzer - */ - private $inheritance = null; - - /** - * The used node count analyzer. - * - * @var \PDepend\Metrics\Analyzer\NodeCountAnalyzer - */ - private $nodeCount = null; - - /** - * The used node loc analyzer. - * - * @var \PDepend\Metrics\Analyzer\NodeLocAnalyzer - */ - private $nodeLoc = null; - - /** - * Holds defined thresholds for the computed proportions. This set is based - * on java thresholds, we should find better values for php projects. - * - * @var array<string, array> - */ - private $thresholds = array( - 'cyclo-loc' => array(0.16, 0.20, 0.24), - 'loc-nom' => array(7, 10, 13), - 'nom-noc' => array(4, 7, 10), - 'noc-nop' => array(6, 17, 26), - 'calls-nom' => array(2.01, 2.62, 3.2), - 'fanout-calls' => array(0.56, 0.62, 0.68), - 'andc' => array(0.25, 0.41, 0.57), - 'ahh' => array(0.09, 0.21, 0.32) - ); - - /** - * Sets the output log file. - * - * @param string $logFile The output log file. - * - * @return void - */ - public function setLogFile($logFile) - { - $this->logFile = $logFile; - } - - /** - * Returns an <b>array</b> with accepted analyzer types. These types can be - * concrete analyzer classes or one of the descriptive analyzer interfaces. - * - * @return array<string> - */ - public function getAcceptedAnalyzers() - { - return array( - 'pdepend.analyzer.coupling', - 'pdepend.analyzer.cyclomatic_complexity', - 'pdepend.analyzer.inheritance', - 'pdepend.analyzer.node_count', - 'pdepend.analyzer.node_loc', - ); - } - - /** - * Adds an analyzer to log. If this logger accepts the given analyzer it - * with return <b>true</b>, otherwise the return value is <b>false</b>. - * - * @param \PDepend\Metrics\Analyzer $analyzer The analyzer to log. - * @return boolean - */ - public function log(Analyzer $analyzer) - { - if ($analyzer instanceof CyclomaticComplexityAnalyzer) { - $this->cyclomaticComplexity = $analyzer; - } elseif ($analyzer instanceof CouplingAnalyzer) { - $this->coupling = $analyzer; - } elseif ($analyzer instanceof InheritanceAnalyzer) { - $this->inheritance = $analyzer; - } elseif ($analyzer instanceof NodeCountAnalyzer) { - $this->nodeCount = $analyzer; - } elseif ($analyzer instanceof NodeLocAnalyzer) { - $this->nodeLoc = $analyzer; - } else { - return false; - } - return true; - } - - /** - * Closes the logger process and writes the output file. - * - * @return void - * @throws \PDepend\Report\NoLogOutputException - */ - public function close() - { - // Check for configured log file - if ($this->logFile === null) { - throw new NoLogOutputException($this); - } - - $metrics = $this->collectMetrics(); - $proportions = $this->computeProportions($metrics); - - $svg = new \DOMDocument('1.0', 'UTF-8'); - $svg->loadXML(file_get_contents(dirname(__FILE__) . '/pyramid.svg')); - - $items = array_merge($metrics, $proportions); - foreach ($items as $name => $value) { - $svg->getElementById("pdepend.{$name}")->nodeValue = $value; - - if (($threshold = $this->computeThreshold($name, $value)) === null) { - continue; - } - if (($color = $svg->getElementById("threshold.{$threshold}")) === null) { - continue; - } - if (($rect = $svg->getElementById("rect.{$name}")) === null) { - continue; - } - preg_match('/fill:(#[^;"]+)/', $color->getAttribute('style'), $match); - - $style = $rect->getAttribute('style'); - $style = preg_replace('/fill:#[^;"]+/', "fill:{$match[1]}", $style); - $rect->setAttribute('style', $style); - } - - $temp = FileUtil::getSysTempDir(); - $temp .= '/' . uniqid('pdepend_') . '.svg'; - $svg->save($temp); - - ImageConvert::convert($temp, $this->logFile); - - // Remove temp file - unlink($temp); - } - - /** - * Computes the threshold (low, average, high) for the given value and metric. - * If no threshold is defined for the given name, this method will return - * <b>null</b>. - * - * @param string $name The metric/field identfier. - * @param mixed $value The metric/field value. - * @return string|null - */ - private function computeThreshold($name, $value) - { - if (!isset($this->thresholds[$name])) { - return null; - } - - $threshold = $this->thresholds[$name]; - if ($value <= $threshold[0]) { - return 'low'; - } elseif ($value >= $threshold[2]) { - return 'high'; - } else { - $low = $value - $threshold[0]; - $avg = $threshold[1] - $value; - - if ($low < $avg) { - return 'low'; - } - } - return 'average'; - } - - /** - * Computes the proportions between the given metrics. - * - * @param array $metrics The aggregated project metrics. - * @return array<string, float> - */ - private function computeProportions(array $metrics) - { - $orders = array( - array('cyclo', 'loc', 'nom', 'noc', 'nop'), - array('fanout', 'calls', 'nom') - ); - - $proportions = array(); - foreach ($orders as $names) { - for ($i = 1, $c = count($names); $i < $c; ++$i) { - $value1 = $metrics[$names[$i]]; - $value2 = $metrics[$names[$i - 1]]; - - $identifier = "{$names[$i - 1]}-{$names[$i]}"; - - $proportions[$identifier] = 0; - if ($value1 > 0) { - $proportions[$identifier] = round($value2 / $value1, 3); - } - } - } - - return $proportions; - } - - /** - * Aggregates the required metrics from the registered analyzers. - * - * @return array<string, mixed> - * @throws \RuntimeException If one of the required analyzers isn't set. - */ - private function collectMetrics() - { - if ($this->coupling === null) { - throw new \RuntimeException('Missing Coupling analyzer.'); - } - if ($this->cyclomaticComplexity === null) { - throw new \RuntimeException('Missing Cyclomatic Complexity analyzer.'); - } - if ($this->inheritance === null) { - throw new \RuntimeException('Missing Inheritance analyzer.'); - } - if ($this->nodeCount === null) { - throw new \RuntimeException('Missing Node Count analyzer.'); - } - if ($this->nodeLoc === null) { - throw new \RuntimeException('Missing Node LOC analyzer.'); - } - - $coupling = $this->coupling->getProjectMetrics(); - $cyclomatic = $this->cyclomaticComplexity->getProjectMetrics(); - $inheritance = $this->inheritance->getProjectMetrics(); - $nodeCount = $this->nodeCount->getProjectMetrics(); - $nodeLoc = $this->nodeLoc->getProjectMetrics(); - - return array( - 'cyclo' => $cyclomatic['ccn2'], - 'loc' => $nodeLoc['eloc'], - 'nom' => ($nodeCount['nom'] + $nodeCount['nof']), - 'noc' => $nodeCount['noc'], - 'nop' => $nodeCount['nop'], - 'ahh' => round($inheritance['ahh'], 3), - 'andc' => round($inheritance['andc'], 3), - 'fanout' => $coupling['fanout'], - 'calls' => $coupling['calls'] - ); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Overview/pyramid.svg b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Overview/pyramid.svg deleted file mode 100644 index 8d341c5..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Overview/pyramid.svg +++ /dev/null @@ -1,769 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="390" - height="250" - id="svg5110" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docname="pyramid.svg" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <defs - id="defs5112"> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - id="perspective5118" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1.5" - inkscape:cx="179.96345" - inkscape:cy="96.137457" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - inkscape:window-width="1280" - inkscape:window-height="753" - inkscape:window-x="0" - inkscape:window-y="46" /> - <metadata - id="metadata5115"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <rect - style="fill:#555753" - width="0" - height="0" - x="0" - y="0" - rx="0" - ry="0" - id="rect8982" - xml:id="threshold.low" /> - <rect - style="fill:#73d216" - width="0" - height="0" - x="0" - y="0" - rx="0" - ry="0" - id="rect8983" - xml:id="threshold.average" /> - <rect - style="fill:#f57900" - width="0" - height="0" - x="0" - y="0" - rx="0" - ry="0" - id="rect2834" - xml:id="threshold.high" /> - <rect - style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4954" - width="118.69567" - height="16.956522" - x="232.7668" - y="185.67191" - rx="2.9780269" - ry="0" /> - <rect - style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4956" - width="157.2332" - height="34" - x="232.7668" - y="201" - rx="3.9449191" - ry="0" /> - <rect - style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4958" - width="80.158104" - height="33.913044" - x="154.15019" - y="122.47035" - rx="2.0111351" - ry="0" /> - <rect - style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4960" - width="234.30832" - height="34" - x="0" - y="201" - rx="5.8787031" - ry="0" /> - <rect - style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4962" - width="195.77077" - height="16.956522" - x="38.537552" - y="185.67191" - rx="4.9118109" - ry="0" /> - <rect - style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4964" - width="157.2332" - height="16.956522" - x="77.075104" - y="170.25687" - rx="3.9449191" - ry="0" /> - <rect - style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4966" - width="118.69567" - height="16.956522" - x="115.61267" - y="154.84189" - rx="2.9780269" - ry="0" /> - <rect - style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4968" - width="231.22531" - height="30.83004" - x="1.541504" - y="202.62846" - rx="5.8013515" - ry="0" /> - <rect - style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4970" - width="192.68774" - height="15.41502" - x="40.079056" - y="187.21365" - rx="4.8344593" - ry="0" /> - <rect - style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4972" - width="154.15019" - height="15.41502" - x="78.616608" - y="171.79837" - rx="3.8675678" - ry="0" /> - <rect - style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4974" - width="115.61266" - height="15.41502" - x="117.15414" - y="156.38339" - rx="2.9006755" - ry="0" /> - <rect - style="opacity:1;fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4976" - width="77.075096" - height="30.83004" - x="155.6917" - y="124.01187" - rx="1.9337839" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4978" - width="154.15019" - height="30.83004" - x="234.3083" - y="202.62846" - rx="3.8675678" - ry="0" /> - <rect - style="opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4980" - width="115.61266" - height="15.41502" - x="234.3083" - y="187.21341" - rx="2.9006755" - ry="0" /> - <rect - style="opacity:1;fill:#555753;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4982" - xml:id="rect.andc" - width="38.537548" - height="15.43004" - x="194.22925" - y="124.01187" - rx="0.96689194" - ry="0" /> - <rect - style="opacity:1;fill:#555753;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect2851" - xml:id="rect.ahh" - width="38.537548" - height="15.4" - x="194.22925" - y="139.41187" - rx="0.96689194" - ry="0" /> - <rect - style="opacity:1;fill:#f57900;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4984" - xml:id="rect.noc-nop" - width="38.537548" - height="15.41502" - x="117.15414" - y="156.38339" - rx="0.80574334" /> - <rect - style="opacity:1;fill:#f57900;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4986" - xml:id="rect.nom-noc" - width="38.537548" - height="15.41502" - x="78.616608" - y="171.79837" - rx="0.80574334" /> - <rect - style="opacity:1;fill:#73d216;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4988" - xml:id="rect.loc-nom" - width="38.537548" - height="15.41502" - x="40.079056" - y="187.21341" - rx="0.80574334" /> - <rect - style="opacity:1;fill:#555753;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4990" - xml:id="rect.cyclo-loc" - width="38.537548" - height="15.41502" - x="1.541504" - y="202.62846" - rx="0.80574334" /> - <rect - style="opacity:1;fill:#f57900;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4992" - xml:id="rect.calls-nom" - width="38.537548" - height="15.41502" - x="311.38339" - y="187.21341" - rx="0.80574334" /> - <rect - style="opacity:1;fill:#555753;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4994" - xml:id="rect.fanout-calls" - width="38.537548" - height="15.41502" - x="349.92096" - y="202.62846" - rx="0.80574334" /> - <rect - style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4996" - width="231.22531" - height="1" - x="1.541504" - y="217.04344" - rx="5.8013515" - ry="0" /> - <rect - style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4998" - width="192.68774" - height="1" - x="40.079056" - y="201.62846" - rx="4.8344593" - ry="0" /> - <rect - style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5000" - width="154.15019" - height="1" - x="78.616608" - y="186.21341" - rx="3.8675678" - ry="0" /> - <rect - style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5002" - width="115.61266" - height="1" - x="117.15414" - y="170.79837" - rx="2.9006755" - ry="0" /> - <rect - style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5004" - width="115.61266" - height="1" - x="234.3083" - y="201.62846" - rx="2.9006755" - ry="0" /> - <rect - style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5006" - width="154.15019" - height="1" - x="234.3083" - y="217.04344" - rx="3.8675678" - ry="0" /> - <rect - style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5008" - width="77.075096" - height="1" - x="155.6917" - y="138.42685" - rx="1.9337839" - ry="0" /> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - x="158" - y="135" - title="Average Number of Derived Classes" - id="text5010"><tspan - sodipodi:role="line" - title="Average Number of Derived Classes" - id="tspan5012" - x="158" - y="135">ANDC</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - x="158" - y="151" - title="Average Hierarchy Height" - id="text5014"><tspan - sodipodi:role="line" - title="Average Hierarchy Height" - id="tspan5016" - x="158" - y="151">AHH</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - x="158" - y="168" - title="Number Of Packages" - id="text5018"><tspan - sodipodi:role="line" - title="Number Of Packages" - id="tspan5020" - x="158" - y="168">NOP</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - x="119" - y="183.00002" - id="text5022" - title="Number Of Classes" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Number Of Classes" - id="tspan5024" - x="119" - y="183.00002">NOC</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - x="81" - y="198.00002" - id="text5026" - title="Number Of Methods (Methods+Functions)" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Number Of Methods (Methods+Functions)" - id="tspan5028" - x="81" - y="198.00002">NOM</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - x="42" - y="213.00002" - id="text5030" - title="Lines Of Code (Non Comment and Non Whitespace Lines)" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Lines Of Code (Non Comment and Non Whitespace Lines)" - id="tspan5032" - x="42" - y="213.00002">LOC</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - x="3" - y="230.00002" - id="text5034" - title="Cyclomatic Complexity" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Cyclomatic Complexity" - id="tspan5036" - x="3" - y="230.00002">CYCLO</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - x="308.85785" - y="198.00043" - id="text5038" - title="Number Of Methods (Methods+Functions)" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Number Of Methods (Methods+Functions)" - id="tspan5040" - x="308.85785" - y="198.00043">NOM</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - x="348" - y="213.00002" - id="text5042" - title="Number of Operation Calls" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Number of Operation Calls" - id="tspan5044" - x="348" - y="213.00002">CALLS</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - x="387" - y="230.00002" - id="text5046" - title="Number of Called Classes" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Number of Called Classes" - id="tspan5048" - x="387" - y="230.00002">FANOUT</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Number of Called Classes" - x="236" - y="230.00002" - id="text5050" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Number of Called Classes" - id="tspan5052" - xml:id="pdepend.fanout" - x="236" - y="230.00002">8590</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Number of Operation Calls" - x="236" - y="213.00002" - id="text5054" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Number of Operation Calls" - id="tspan5056" - xml:id="pdepend.calls" - x="236" - y="213.00002">15128</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Cyclomatic Complexity" - x="232" - y="230.00002" - id="text5058" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Cyclomatic Complexity" - id="tspan5060" - xml:id="pdepend.cyclo" - x="232" - y="230.00002">5579</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Lines Of Code (Non Comment and Non Whitespace Lines)" - x="232" - y="213.00002" - id="text5062" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - xml:id="pdepend.loc" - title="Lines Of Code (Non Comment and Non Whitespace Lines)" - id="tspan5064" - x="232" - y="213.00002">35175</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Number Of Methods (Methods+Functions)" - x="232" - y="198.00002" - id="text5066" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Number Of Methods (Methods+Functions)" - id="tspan5068" - xml:id="pdepend.nom" - x="232" - y="198.00002">3618</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Number Of Packages" - x="232" - y="168.00002" - id="text5070" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Number Of Packages" - id="tspan5072" - xml:id="pdepend.nop" - x="232" - y="168.00002">19</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Number Of Classes" - x="232" - y="183.00002" - id="text5074" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Number Of Classes" - id="tspan5076" - xml:id="pdepend.noc" - x="232" - y="183.00002">384</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-anchor:end;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Average Number of Derived Classes" - x="232" - y="135.00002" - id="text5078" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Average Number of Derived Classes" - id="tspan5080" - xml:id="pdepend.andc" - x="232" - y="135.00002">0,31</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-anchor:end;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Average Hierarchy Height" - x="232" - y="151.00002" - id="text5082" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Average Hierarchy Height" - id="tspan5084" - xml:id="pdepend.ahh" - x="232" - y="151.00002">0,12</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Ratio: Number of Classes / Number of Packages" - x="119" - y="168.00002" - id="text5086" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Ratio: Number of Classes / Number of Packages" - id="tspan5088" - xml:id="pdepend.noc-nop" - x="119" - y="168.00002">20,21</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Ratio: Number of Methods / Number of Classes" - x="81" - y="183.00002" - id="text5090" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Ratio: Number of Methods / Number of Classes" - id="tspan5092" - xml:id="pdepend.nom-noc" - x="81" - y="183.00002">9,42</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Ratio: Lines of Code / Number of Methods" - x="42" - y="198.00002" - id="text5094" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Ratio: Lines of Code / Number of Methods" - id="tspan5096" - xml:id="pdepend.loc-nom" - x="42" - y="198.00002">9,72</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Ratio: Cyclomatic Complexity / Lines of Code" - x="3" - y="213.00002" - id="text5098" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Ratio: Cyclomatic Complexity / Lines of Code" - id="tspan5100" - xml:id="pdepend.cyclo-loc" - x="3" - y="213.00002">0,15</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-anchor:end;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Ratio: Number of Called Classes(FANOUT) / Number of Operation Calls" - x="388.56299" - y="213.00002" - id="text5102" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Ratio: Number of Called Classes(FANOUT) / Number of Operation Calls" - id="tspan5104" - xml:id="pdepend.fanout-calls" - x="388.56299" - y="213.00002">0,561</tspan></text> - <text - xml:space="preserve" - style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-anchor:end;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - title="Ratio: Number of Operation Calls / Number of Methods (Methods+Functions)" - x="348" - y="198.00002" - id="text5106" - transform="scale(0.9999985,1.0000015)"><tspan - sodipodi:role="line" - title="Ratio: Number of Operation Calls / Number of Methods (Methods+Functions)" - id="tspan5108" - xml:id="pdepend.calls-nom" - x="348" - y="198.00002">4,18</tspan></text> - <text - xml:space="preserve" - style="font-size:8px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:end;text-anchor:end;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial" - x="386.39493" - y="246.10596" - id="text2692"><tspan - sodipodi:role="line" - id="tspan2694" - x="386.39493" - y="246.10596" - style="font-size:9px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;text-anchor:end;fill:#2e3436;font-family:Arial;">Generated by PDepend</tspan></text> - <path - sodipodi:type="arc" - style="opacity:1;fill:#555753;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path3780" - sodipodi:cx="53.333332" - sodipodi:cy="285.66666" - sodipodi:rx="12" - sodipodi:ry="10.333333" - d="M 65.333332,285.66666 A 12,10.333333 0 1 1 41.333332,285.66666 A 12,10.333333 0 1 1 65.333332,285.66666 z" - transform="matrix(0.375,0,0,0.4354839,-5.4999995,119.09677)" /> - <text - xml:space="preserve" - style="font-size:8px;font-style:normal;font-weight:bold;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:URW Chancery L;" - x="32.386719" - y="246.64209" - id="text3782"><tspan - sodipodi:role="line" - id="tspan3784" - x="32.386719" - y="246.64209" - style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#2e3436;font-family:Arial;">Low</tspan></text> - <path - sodipodi:type="arc" - style="opacity:1;fill:#73d216;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path3786" - sodipodi:cx="53.333332" - sodipodi:cy="285.66666" - sodipodi:rx="12" - sodipodi:ry="10.333333" - d="M 65.333332,285.66666 A 12,10.333333 0 1 1 41.333332,285.66666 A 12,10.333333 0 1 1 65.333332,285.66666 z" - transform="matrix(0.375,0,0,0.4354839,54.5,119.09677)" /> - <text - xml:space="preserve" - style="font-size:8px;font-style:normal;font-weight:bold;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:URW Chancery L;" - x="102.38672" - y="245.77417" - id="text3788"><tspan - sodipodi:role="line" - id="tspan3790" - x="102.38672" - y="245.77417" - style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#2e3436;font-family:Arial;">Average</tspan></text> - <path - sodipodi:type="arc" - style="opacity:1;fill:#f57900;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path3792" - sodipodi:cx="53.333332" - sodipodi:cy="285.66666" - sodipodi:rx="12" - sodipodi:ry="10.333333" - d="M 65.333332,285.66666 A 12,10.333333 0 1 1 41.333332,285.66666 A 12,10.333333 0 1 1 65.333332,285.66666 z" - transform="matrix(0.375,0,0,0.4354839,132.5,119.09677)" /> - <text - xml:space="preserve" - style="font-size:8px;font-style:normal;font-weight:bold;text-align:center;text-anchor:middle;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:URW Chancery L;" - x="170.38672" - y="245.77417" - id="text3794"><tspan - sodipodi:role="line" - id="tspan3796" - x="170.38672" - y="245.77417" - style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#2e3436;font-family:Arial;">High</tspan></text> - </g> -</svg> diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/ReportGenerator.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/ReportGenerator.php deleted file mode 100644 index b972cd7..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/ReportGenerator.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Report; - -use PDepend\Metrics\Analyzer; - -/** - * Base interface for all PDepend report generators. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface ReportGenerator -{ - /** - * Adds an analyzer to log. If this logger accepts the given analyzer it - * with return <b>true</b>, otherwise the return value is <b>false</b>. - * - * @param \PDepend\Metrics\Analyzer $analyzer The analyzer to log. - * @return boolean - */ - public function log(Analyzer $analyzer); - - /** - * Closes the logger process and writes the output file. - * - * @return void - * @throws \PDepend\Report\NoLogOutputException If the no log target exists. - */ - public function close(); - - /** - * Returns an <b>array</b> with accepted analyzer types. These types can be - * concrete analyzer classes or one of the descriptive analyzer interfaces. - * - * @return array<string> - */ - public function getAcceptedAnalyzers(); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/ReportGeneratorFactory.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/ReportGeneratorFactory.php deleted file mode 100644 index 535996e..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/ReportGeneratorFactory.php +++ /dev/null @@ -1,118 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Report; - -use Symfony\Component\DependencyInjection\ContainerInterface; - -/** - * This factory creates singleton instances of available loggers. - * - * The identifiers are used to find a matching service in the DIC - * that is tagged with 'pdepend.logger' and has an option attribute - * named after the identifier, prefixed with --: - * - * Identifier "my-custom-logger" searchs for: - * - * <tag name="pdepend.logger" option="--my-custom-logger" /> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ReportGeneratorFactory -{ - /** - * @var \Symfony\Component\DependencyInjection\ContainerInterface - */ - private $container; - - public function __construct(ContainerInterface $container) - { - $this->container = $container; - } - - /** - * Creates a new generator or returns an existing instance for the given - * <b>$identifier</b>. - * - * @param string $identifier The generator identifier. - * @param string $fileName The log output file name. - * @return \PDepend\Report\ReportGenerator - * @throws \RuntimeException - */ - public function createGenerator($identifier, $fileName) - { - if (!isset($this->instances[$identifier])) { - $loggerServices = $this->container->findTaggedServiceIds('pdepend.logger'); - - $logger = null; - - foreach ($loggerServices as $id => $loggerServiceTags) { - foreach ($loggerServiceTags as $loggerServiceTag) { - if ($loggerServiceTag['option'] === '--' . $identifier) { - $logger = $this->container->get($id); - } - } - } - - if (!$logger) { - throw new \RuntimeException(sprintf('Unknown generator with identifier "%s".', $identifier)); - } - - // TODO: Refactor this into an external log configurator or a similar - // concept. - if ($logger instanceof FileAwareGenerator) { - $logger->setLogFile($fileName); - } - - $this->instances[$identifier] = $logger; - } - return $this->instances[$identifier]; - } - - /** - * Set of created logger instances. - * - * @var \PDepend\Report\ReportGenerator[] - */ - protected $instances = array(); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Summary/Xml.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Summary/Xml.php deleted file mode 100644 index 291fb04..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Report/Summary/Xml.php +++ /dev/null @@ -1,449 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Report\Summary; - -use PDepend\Metrics\Analyzer; -use PDepend\Metrics\AnalyzerNodeAware; -use PDepend\Metrics\AnalyzerProjectAware; -use PDepend\Report\CodeAwareGenerator; -use PDepend\Report\FileAwareGenerator; -use PDepend\Report\NoLogOutputException; -use PDepend\Source\AST\AbstractASTArtifact; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTCompilationUnit; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTNamespace; -use PDepend\Source\AST\ASTTrait; -use PDepend\Source\ASTVisitor\AbstractASTVisitor; -use PDepend\Util\Utf8Util; - -/** - * This logger generates a summary xml document with aggregated project, class, - * method and file metrics. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Xml extends AbstractASTVisitor implements CodeAwareGenerator, FileAwareGenerator -{ - /** - * The log output file. - * - * @var string - */ - private $logFile = null; - - /** - * The raw {@link \PDepend\Source\AST\ASTNamespace} instances. - * - * @var \PDepend\Source\AST\ASTArtifactList - */ - protected $code = null; - - /** - * Set of all analyzed files. - * - * @var \PDepend\Source\AST\ASTCompilationUnit[] - */ - protected $fileSet = array(); - - /** - * List of all analyzers that implement the node aware interface - * {@link \PDepend\Metrics\AnalyzerNodeAware}. - * - * @var \PDepend\Metrics\AnalyzerNodeAware[] - */ - private $nodeAwareAnalyzers = array(); - - /** - * List of all analyzers that implement the node aware interface - * {@link \PDepend\Metrics\AnalyzerProjectAware}. - * - * @var \PDepend\Metrics\AnalyzerProjectAware[] - */ - private $projectAwareAnalyzers = array(); - - /** - * The internal used xml stack. - * - * @var \DOMElement[] - */ - private $xmlStack = array(); - - /** - * Sets the output log file. - * - * @param string $logFile The output log file. - * - * @return void - */ - public function setLogFile($logFile) - { - $this->logFile = $logFile; - } - - /** - * Returns an <b>array</b> with accepted analyzer types. These types can be - * concrete analyzer classes or one of the descriptive analyzer interfaces. - * - * @return array<string> - */ - public function getAcceptedAnalyzers() - { - return array( - 'pdepend.analyzer.cyclomatic_complexity', - 'pdepend.analyzer.node_loc', - 'pdepend.analyzer.npath_complexity', - 'pdepend.analyzer.inheritance', - 'pdepend.analyzer.node_count', - 'pdepend.analyzer.hierarchy', - 'pdepend.analyzer.crap_index', - 'pdepend.analyzer.code_rank', - 'pdepend.analyzer.coupling', - 'pdepend.analyzer.class_level', - 'pdepend.analyzer.cohesion', - 'pdepend.analyzer.halstead', - 'pdepend.analyzer.maintainability', - ); - } - - /** - * Sets the context code nodes. - * - * @param \PDepend\Source\AST\ASTArtifactList $artifacts - * @return void - */ - public function setArtifacts(ASTArtifactList $artifacts) - { - $this->code = $artifacts; - } - - /** - * Adds an analyzer to log. If this logger accepts the given analyzer it - * with return <b>true</b>, otherwise the return value is <b>false</b>. - * - * @param \PDepend\Metrics\Analyzer $analyzer The analyzer to log. - * @return boolean - */ - public function log(Analyzer $analyzer) - { - $accepted = false; - if ($analyzer instanceof AnalyzerProjectAware) { - $this->projectAwareAnalyzers[] = $analyzer; - - $accepted = true; - } - if ($analyzer instanceof AnalyzerNodeAware) { - $this->nodeAwareAnalyzers[] = $analyzer; - - $accepted = true; - } - return $accepted; - } - - /** - * Closes the logger process and writes the output file. - * - * @return void - * @throws \PDepend\Report\NoLogOutputException If the no log target exists. - */ - public function close() - { - if ($this->logFile === null) { - throw new NoLogOutputException($this); - } - - $dom = new \DOMDocument('1.0', 'UTF-8'); - - $dom->formatOutput = true; - - $metrics = $dom->createElement('metrics'); - $metrics->setAttribute('generated', date('Y-m-d\TH:i:s')); - $metrics->setAttribute('pdepend', '@package_version@'); - - foreach ($this->getProjectMetrics() as $name => $value) { - $metrics->setAttribute($name, $value); - } - - array_push($this->xmlStack, $metrics); - - foreach ($this->code as $node) { - $node->accept($this); - } - - if (count($this->fileSet) > 0) { - $filesXml = $dom->createElement('files'); - foreach ($this->fileSet as $file) { - $fileXml = $dom->createElement('file'); - $fileXml->setAttribute('name', Utf8Util::ensureEncoding($file->getFileName())); - - $this->writeNodeMetrics($fileXml, $file); - - $filesXml->appendChild($fileXml); - } - $metrics->insertBefore($filesXml, $metrics->firstChild); - } - - $dom->appendChild($metrics); - - $buffer = $dom->saveXML(); - file_put_contents($this->logFile, $buffer); - } - - /** - * Returns an array with all collected project metrics. - * - * @return array<string, mixed> - * @since 0.9.10 - */ - private function getProjectMetrics() - { - $projectMetrics = array(); - foreach ($this->projectAwareAnalyzers as $analyzer) { - $projectMetrics = array_merge( - $projectMetrics, - $analyzer->getProjectMetrics() - ); - } - ksort($projectMetrics); - - return $projectMetrics; - } - - /** - * Visits a class node. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - $this->generateTypeXml($class, 'class'); - } - - /** - * Visits a trait node. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - */ - public function visitTrait(ASTTrait $trait) - { - $this->generateTypeXml($trait, 'trait'); - } - - /** - * Generates the XML for a class or trait node. - * - * @param \PDepend\Source\AST\ASTClass $type - * @param string $typeIdentifier - * @return void - */ - private function generateTypeXml(ASTClass $type, $typeIdentifier) - { - if (!$type->isUserDefined()) { - return; - } - - $xml = end($this->xmlStack); - $doc = $xml->ownerDocument; - - $typeXml = $doc->createElement($typeIdentifier); - $typeXml->setAttribute('name', Utf8Util::ensureEncoding($type->getName())); - $typeXml->setAttribute('fqname', Utf8Util::ensureEncoding($type->getNamespacedName())); - $typeXml->setAttribute('start', (string)$type->getStartLine()); - $typeXml->setAttribute('end', (string)$type->getEndLine()); - - $this->writeNodeMetrics($typeXml, $type); - $this->writeFileReference($typeXml, $type->getCompilationUnit()); - - $xml->appendChild($typeXml); - - array_push($this->xmlStack, $typeXml); - - foreach ($type->getMethods() as $method) { - $method->accept($this); - } - foreach ($type->getProperties() as $property) { - $property->accept($this); - } - - array_pop($this->xmlStack); - } - - /** - * Visits a function node. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - $xml = end($this->xmlStack); - $doc = $xml->ownerDocument; - - $functionXml = $doc->createElement('function'); - $functionXml->setAttribute('name', Utf8Util::ensureEncoding($function->getName())); - $functionXml->setAttribute('start', (string)$function->getStartLine()); - $functionXml->setAttribute('end', (string)$function->getEndLine()); - - $this->writeNodeMetrics($functionXml, $function); - $this->writeFileReference($functionXml, $function->getCompilationUnit()); - - $xml->appendChild($functionXml); - } - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - // Empty implementation, because we don't want interface methods. - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $xml = end($this->xmlStack); - $doc = $xml->ownerDocument; - - $methodXml = $doc->createElement('method'); - $methodXml->setAttribute('name', Utf8Util::ensureEncoding($method->getName())); - $methodXml->setAttribute('start', (string)$method->getStartLine()); - $methodXml->setAttribute('end', (string)$method->getEndLine()); - - $this->writeNodeMetrics($methodXml, $method); - - $xml->appendChild($methodXml); - } - - /** - * Visits a namespace node. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function visitNamespace(ASTNamespace $namespace) - { - $xml = end($this->xmlStack); - $doc = $xml->ownerDocument; - - $packageXml = $doc->createElement('package'); - $packageXml->setAttribute('name', Utf8Util::ensureEncoding($namespace->getName())); - - $this->writeNodeMetrics($packageXml, $namespace); - - array_push($this->xmlStack, $packageXml); - - foreach ($namespace->getTypes() as $type) { - $type->accept($this); - } - foreach ($namespace->getFunctions() as $function) { - $function->accept($this); - } - - array_pop($this->xmlStack); - - if ($packageXml->firstChild === null) { - return; - } - - $xml->appendChild($packageXml); - } - - /** - * Aggregates all metrics for the given <b>$node</b> instance and adds them - * to the <b>\DOMElement</b> - * - * @param \DOMElement $xml - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return void - */ - protected function writeNodeMetrics(\DOMElement $xml, AbstractASTArtifact $node) - { - $metrics = array(); - foreach ($this->nodeAwareAnalyzers as $analyzer) { - $metrics = array_merge($metrics, $analyzer->getNodeMetrics($node)); - } - - foreach ($metrics as $name => $value) { - $xml->setAttribute($name, $value); - } - } - - /** - * Appends a file reference element to the given <b>$xml</b> element. - * - * <code> - * <class name="\PDepend\Engine"> - * <file name="PDepend/Engine.php" /> - * </class> - * </code> - * - * @param \DOMElement $xml The parent xml element. - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit The code file instance. - * @return void - */ - protected function writeFileReference(\DOMElement $xml, ASTCompilationUnit $compilationUnit = null) - { - if (in_array($compilationUnit, $this->fileSet, true) === false) { - $this->fileSet[] = $compilationUnit; - } - - $fileXml = $xml->ownerDocument->createElement('file'); - $fileXml->setAttribute('name', Utf8Util::ensureEncoding($compilationUnit->getFileName())); - - $xml->appendChild($fileXml); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAllocationExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAllocationExpression.php deleted file mode 100644 index cc8ff64..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAllocationExpression.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * An instance of this class represents an object allocation. - * - * <code> - * function foo() - * { - * // ------------- - * new bar\Baz(); - * // ------------- - * - * // --------- - * new Foo(); - * // --------- - * } - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTAllocationExpression extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitAllocationExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAnonymousClass.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAnonymousClass.php deleted file mode 100644 index 8ab9799..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAnonymousClass.php +++ /dev/null @@ -1,327 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * Represents a php class node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ -class ASTAnonymousClass extends ASTClass implements ASTNode -{ - /** - * The parent node of this node or <b>null</b> when this node is the root - * of a node tree. - * - * @var \PDepend\Source\AST\ASTNode|null - */ - protected $parent = null; - - /** - * Metadata for this node instance, serialized in a string. This string - * contains the start, end line, and the start, end column and the node - * image in a colon separated string. - * - * @var string - * @since 0.10.4 - */ - protected $metadata = ':::'; - - /** - * @param string $image - * @return void - */ - public function setImage($image) - { - $this->setName($image); - } - - /** - * Returns the source image of this ast node. - * - * @return string - */ - public function getImage() - { - return $this->getName(); - } - - /** - * Returns the start line for this ast node. - * - * @return integer - */ - public function getStartLine() - { - return $this->getMetadataInteger(0); - } - - /** - * Returns the start column for this ast node. - * - * @return integer - */ - public function getStartColumn() - { - return $this->getMetadataInteger(2); - } - - /** - * Returns the end line for this ast node. - * - * @return integer - */ - public function getEndLine() - { - return $this->getMetadataInteger(1); - } - - /** - * Returns the end column for this ast node. - * - * @return integer - */ - public function getEndColumn() - { - return $this->getMetadataInteger(3); - } - - /** - * For better performance we have moved the single setter methods for the - * node columns and lines into this configure method. - * - * @param integer $startLine - * @param integer $endLine - * @param integer $startColumn - * @param integer $endColumn - * @return void - * @since 0.9.10 - */ - public function configureLinesAndColumns($startLine, $endLine, $startColumn, $endColumn) - { - $this->setMetadataInteger(0, $startLine); - $this->setMetadataInteger(1, $endLine); - $this->setMetadataInteger(2, $startColumn); - $this->setMetadataInteger(3, $endColumn); - } - - /** - * Returns the parent node of this node or <b>null</b> when this node is - * the root of a node tree. - * - * @return \PDepend\Source\AST\ASTNode - */ - public function getParent() - { - return $this->parent; - } - - /** - * Sets the parent node of this node. - * - * @param \PDepend\Source\AST\ASTNode $node - * @return void - */ - public function setParent(ASTNode $node) - { - $this->parent = $node; - } - - /** - * Traverses up the node tree and finds all parent nodes that are instances - * of <b>$parentType</b>. - * - * @param string $parentType - * @return \PDepend\Source\AST\ASTNode[] - */ - public function getParentsOfType($parentType) - { - $parents = array(); - - $parentNode = $this->parent; - while (is_object($parentNode)) { - if ($parentNode instanceof $parentType) { - array_unshift($parents, $parentNode); - } - $parentNode = $parentNode->getParent(); - } - return $parents; - } - - /** - * This method adds a new child node at the first position of the children. - * - * @param \PDepend\Source\AST\ASTNode $node - * @return void - */ - public function prependChild(ASTNode $node) - { - array_unshift($this->nodes, $node); - $node->setParent($this); - } - - /** - * Will return <b>true</b> if this class was declared anonymous in an - * allocation expression. - * - * @return boolean - */ - public function isAnonymous() - { - return true; - } - - /** - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return integer - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitAnonymousClass($this, $data); - } - - /** - * The magic sleep method will be called by PHP's runtime environment right - * before an instance of this class gets serialized. It should return an - * array with those property names that should be serialized for this class. - * - * @return array - * @since 0.10.0 - */ - public function __sleep() - { - return array_merge(array('metadata'), parent::__sleep()); - } - - /** - * The magic wakeup method will be called by PHP's runtime environment when - * a serialized instance of this class was unserialized. This implementation - * of the wakeup method will register this object in the the global class - * context. - * - * @return void - */ - public function __wakeup() - { - $this->methods = null; - - foreach ($this->nodes as $node) { - $node->setParent($this); - } - - parent::__wakeup(); - } - - /** - * Returns an integer value that was stored under the given index. - * - * @param integer $index - * @return integer - * @since 0.10.4 - */ - protected function getMetadataInteger($index) - { - return (int) $this->getMetadata($index); - } - - /** - * Stores an integer value under the given index in the internally used data - * string. - * - * @param integer $index - * @param integer $value - * @return void - * @since 0.10.4 - */ - protected function setMetadataInteger($index, $value) - { - $this->setMetadata($index, $value); - } - - /** - * Returns the value that was stored under the given index. - * - * @param integer $index - * @return mixed - * @since 0.10.4 - */ - protected function getMetadata($index) - { - $metadata = explode(':', $this->metadata, $this->getMetadataSize()); - return $metadata[$index]; - } - - /** - * Stores the given value under the given index in an internal storage - * container. - * - * @param integer $index - * @param mixed $value - * @return void - * @since 0.10.4 - */ - protected function setMetadata($index, $value) - { - $metadata = explode(':', $this->metadata, $this->getMetadataSize()); - $metadata[$index] = $value; - - $this->metadata = join(':', $metadata); - } - - /** - * Returns the total number of the used property bag. - * - * @return integer - * @since 0.10.4 - */ - protected function getMetadataSize() - { - return 4; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArguments.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArguments.php deleted file mode 100644 index 6d18ccf..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArguments.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This class represents arguments as they are supplied to functions or - * constructors invocations. - * - * <code> - * // ------------ - * Foo::bar($x, $y, $z); - * // ------------ - * - * // ------------ - * $foo->bar($x, $y, $z); - * // ------------ - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTArguments extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitArguments($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArray.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArray.php deleted file mode 100644 index 5d9ebe5..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArray.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents an array expression. - * - * <code> - * // ------------------------------------- - * $array = array( 1, 2, 3, array( $a, $b, $c ) ); - * // ------------------------------------- - * - * // --------------------------- - * $array = [ 1, 2, 3, [ $a, $b, $c ] ]; - * // --------------------------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -class ASTArray extends \PDepend\Source\AST\ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitArray($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArrayElement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArrayElement.php deleted file mode 100644 index 49d35fe..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArrayElement.php +++ /dev/null @@ -1,112 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a single array element expression. - * - * <code> - * // _ ______ __________________________ - * // __ ___ __________ - * $array = array( 1, 2 => 3, array( $a, &$b, 1 => &$c ) ); - * - * // _ ______ _____________________ - * // __ ___ ________ - * $array = [ 1, 2 => 3, [ $a, &$b, 1 => &$c ] ]; - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -class ASTArrayElement extends \PDepend\Source\AST\ASTExpression -{ - /** - * This method will return <b>true</b> when the element value is passed by - * reference. - * - * @return boolean - */ - public function isByReference() - { - return $this->getMetadataBoolean(5); - } - - /** - * This method can be used to mark the element value as passed by reference. - * - * @return void - */ - public function setByReference() - { - $this->setMetadataBoolean(5, true); - } - - /** - * Returns the total number of the used property bag. - * - * @return integer - * @since 0.10.4 - * @see \PDepend\Source\AST\ASTNode#getMetadataSize() - */ - protected function getMetadataSize() - { - return 6; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitArrayElement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArrayIndexExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArrayIndexExpression.php deleted file mode 100644 index d067831..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArrayIndexExpression.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a array-expression. - * - * <code> - * ------ - * $x[42]; - * ------ - * - * ----------- - * $this->foo[23][42]; - * ----------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTArrayIndexExpression extends ASTIndexExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitArrayIndexExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifact.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifact.php deleted file mode 100644 index fac2e57..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifact.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * Abstract base class for code item. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface ASTArtifact /* extends ASTNode */ -{ - /** - * Returns the artifact name. - * - * @return string - * @deprecated Use getImage() inherit from ASTNode class. - */ - public function getName(); - - /** - * Returns a id for this code node. - * - * @return string - */ - public function getId(); - - /** - * ASTVisitor method for node tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @return void - */ - public function accept(ASTVisitor $visitor); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList.php deleted file mode 100644 index 206065e..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList.php +++ /dev/null @@ -1,228 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\AST\ASTArtifactList\CollectionArtifactFilter; - -/** - * Iterator for code nodes. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTArtifactList implements \ArrayAccess, \Iterator, \Countable -{ - /** - * List of {@link \PDepend\Source\AST\ASTArtifact} objects in - * this iterator. - * - * @var \PDepend\Source\AST\ASTArtifact[] - */ - private $artifacts = array(); - - /** - * Total number of available nodes. - * - * @var integer - */ - private $count = 0; - - /** - * Current internal offset. - * - * @var integer - */ - private $offset = 0; - - /** - * Constructs a new node iterator from the given {@link \PDepend\Source\AST\ASTArtifact} - * node array. - * - * @param \PDepend\Source\AST\ASTArtifact[] $artifacts - */ - public function __construct(array $artifacts) - { - $filter = CollectionArtifactFilter::getInstance(); - - $nodeKeys = array(); - foreach ($artifacts as $artifact) { - $id = $artifact->getId(); - - if (isset($nodeKeys[$id])) { - continue; - } - - if ($filter->accept($artifact)) { - $nodeKeys[$id] = $id; - $this->artifacts[] = $artifact; - - ++$this->count; - } - } - } - - /** - * Returns the number of {@link \PDepend\Source\AST\ASTArtifact} - * objects in this iterator. - * - * @return integer - */ - public function count() - { - return count($this->artifacts); - } - - /** - * Returns the current node or <b>false</b> - * - * @return \PDepend\Source\AST\ASTArtifact - */ - public function current() - { - if ($this->offset >= $this->count) { - return false; - } - return $this->artifacts[$this->offset]; - } - - /** - * Returns the name of the current {@link \PDepend\Source\AST\ASTArtifact}. - * - * @return string - */ - public function key() - { - return $this->artifacts[$this->offset]->getName(); - } - - /** - * Moves the internal pointer to the next {@link \PDepend\Source\AST\ASTArtifact}. - * - * @return void - */ - public function next() - { - ++$this->offset; - } - - /** - * Rewinds the internal pointer. - * - * @return void - */ - public function rewind() - { - $this->offset = 0; - } - - /** - * Returns <b>true</b> while there is a next {@link \PDepend\Source\AST\ASTArtifact}. - * - * @return boolean - */ - public function valid() - { - return ($this->offset < $this->count); - } - - /** - * Whether a offset exists - * - * @param mixed $offset An offset to check for. - * - * @return boolean Returns true on success or false on failure. The return - * value will be casted to boolean if non-boolean was returned. - * @since 1.0.0 - * @link http://php.net/manual/en/arrayaccess.offsetexists.php - */ - public function offsetExists($offset) - { - return isset($this->artifacts[$offset]); - } - - /** - * Offset to retrieve - * - * @param mixed $offset - * @return \PDepend\Source\AST\ASTArtifact Can return all value types. - * @throws \OutOfBoundsException - * @since 1.0.0 - * @link http://php.net/manual/en/arrayaccess.offsetget.php - */ - public function offsetGet($offset) - { - if (isset($this->artifacts[$offset])) { - return $this->artifacts[$offset]; - } - throw new \OutOfBoundsException("The offset {$offset} does not exist."); - } - - /** - * Offset to set - * - * @param mixed $offset - * @param mixed $value - * @return void - * @throws \BadMethodCallException - * @since 1.0.0 - * @link http://php.net/manual/en/arrayaccess.offsetset.php - */ - public function offsetSet($offset, $value) - { - throw new \BadMethodCallException('Not supported operation.'); - } - - /** - * Offset to unset - * - * @param mixed $offset - * @return void - * @throws \BadMethodCallException - * @since 1.0.0 - * @link http://php.net/manual/en/arrayaccess.offsetunset.php - */ - public function offsetUnset($offset) - { - throw new \BadMethodCallException('Not supported operation.'); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/ArtifactFilter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/ArtifactFilter.php deleted file mode 100644 index 0fdc3cc..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/ArtifactFilter.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST\ASTArtifactList; - -use PDepend\Source\AST\ASTArtifact; - -/** - * Base interface for {@link \PDepend\Source\AST\ASTArtifactList} filters. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface ArtifactFilter -{ - /** - * Returns <b>true</b> if the given node should be part of the node iterator, - * otherwise this method will return <b>false</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $node - * @return boolean - */ - public function accept(ASTArtifact $node); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/CollectionArtifactFilter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/CollectionArtifactFilter.php deleted file mode 100644 index 13603c3..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/CollectionArtifactFilter.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST\ASTArtifactList; - -use PDepend\Source\AST\ASTArtifact; - -/** - * Static composite filter for code nodes. This class is used for an overall - * filtering. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * - * @fixme Never ever use a singleton!!! - */ -final class CollectionArtifactFilter implements ArtifactFilter -{ - /** - * Singleton instance of this filter. - * - * @var \PDepend\Source\AST\ASTArtifactList\CollectionArtifactFilter - */ - private static $instance = null; - - /** - * Singleton method for this filter class. - * - * @return \PDepend\Source\AST\ASTArtifactList\CollectionArtifactFilter - */ - public static function getInstance() - { - if (self::$instance === null) { - self::$instance = new CollectionArtifactFilter(); - } - return self::$instance; - } - - /** - * Constructs a new static filter. - * - * @access private - */ - public function __construct() - { - } - - /** - * An optional configured filter instance. - * - * @var \PDepend\Source\AST\ASTArtifactList\ArtifactFilter - */ - private $filter = null; - - /** - * Sets the used filter instance. - * - * @param \PDepend\Source\AST\ASTArtifactList\ArtifactFilter $filter - * @return void - * @since 0.9.12 - */ - public function setFilter(ArtifactFilter $filter = null) - { - $this->filter = $filter; - } - - /** - * Returns <b>true</b> if the given node should be part of the node iterator, - * otherwise this method will return <b>false</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $node - * @return boolean - */ - public function accept(ASTArtifact $node) - { - if ($this->filter === null) { - return true; - } - return $this->filter->accept($node); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/NullArtifactFilter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/NullArtifactFilter.php deleted file mode 100644 index 6e307ef..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/NullArtifactFilter.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST\ASTArtifactList; - -use PDepend\Source\AST\ASTArtifact; - -/** - * This is a simple NULL-implementation of the code filter interface. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class NullArtifactFilter implements ArtifactFilter -{ - /** - * Returns <b>true</b> if the given node should be part of the node iterator, - * otherwise this method will return <b>false</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $node - * @return boolean - */ - public function accept(ASTArtifact $node) - { - return true; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/PackageArtifactFilter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/PackageArtifactFilter.php deleted file mode 100644 index d11a1cc..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTArtifactList/PackageArtifactFilter.php +++ /dev/null @@ -1,102 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST\ASTArtifactList; - -use PDepend\Source\AST\AbstractASTClassOrInterface; -use PDepend\Source\AST\ASTArtifact; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTNamespace; - -/** - * This class implements a filter that is based on the namespace. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class PackageArtifactFilter implements ArtifactFilter -{ - /** - * Regexp with ignorable namespace names and namespace name fragments. - * - * @var string - */ - private $pattern = ''; - - /** - * Constructs a new namespace filter for the given list of namespace names. - * - * @param array<string> $namespaces - */ - public function __construct(array $namespaces) - { - $patterns = array(); - foreach ($namespaces as $namespace) { - $patterns[] = str_replace('\*', '\S*', preg_quote($namespace)); - } - $this->pattern = '#^(' . join('|', $patterns) . ')$#D'; - } - - /** - * Returns <b>true</b> if the given node should be part of the node iterator, - * otherwise this method will return <b>false</b>. - * - * @param \PDepend\Source\AST\ASTArtifact $node - * @return boolean - */ - public function accept(ASTArtifact $node) - { - $namespace = null; - // NOTE: This looks a little bit ugly and it seems better to exclude - // \PDepend\Source\AST\ASTMethod and \PDepend\Source\AST\ASTProperty, - // but when PDepend supports more node types, this could produce errors. - if ($node instanceof AbstractASTClassOrInterface) { - $namespace = $node->getNamespace()->getName(); - } elseif ($node instanceof ASTFunction) { - $namespace = $node->getNamespace()->getName(); - } elseif ($node instanceof ASTNamespace) { - $namespace = $node->getName(); - } - - return (preg_match($this->pattern, $namespace) === 0); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAssignmentExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAssignmentExpression.php deleted file mode 100644 index b793b46..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTAssignmentExpression.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents any kind of assignment. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTAssignmentExpression extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitAssignmentExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBooleanAndExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBooleanAndExpression.php deleted file mode 100644 index 73abcb6..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBooleanAndExpression.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a boolean and-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTBooleanAndExpression extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitBooleanAndExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBooleanOrExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBooleanOrExpression.php deleted file mode 100644 index f2e0579..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBooleanOrExpression.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a boolean or-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTBooleanOrExpression extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitBooleanOrExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBreakStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBreakStatement.php deleted file mode 100644 index 9550508..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTBreakStatement.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a break-statement. - * - * <code> - * ------ - * break; - * ------ - * - * --------- - * break 42; - * --------- - * - * ---------------------- - * break $this->foobar(); - * ---------------------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTBreakStatement extends \PDepend\Source\AST\ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitBreakStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCallable.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCallable.php deleted file mode 100644 index 98c08eb..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCallable.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -/** - * Base interface for all callables. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface ASTCallable -{ - /** - * @return \PDepend\Source\AST\ASTType - */ - public function getReturnType(); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCastExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCastExpression.php deleted file mode 100644 index 8635e3e..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCastExpression.php +++ /dev/null @@ -1,181 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.15 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a cast-expression node. - * - * <code> - * // ---------- - * $foo = (int) $bar; - * // ---------- - * - * // ----------- - * $foo = (bool) $bar; - * // ----------- - * - * // ------------ - * $foo = (array) $bar; - * // ------------ - * - * // ------------ - * $foo = (unset) $bar; - * // ------------ - * - * // ------------- - * $foo = (double) $bar; - * // ------------- - * - * // ------------- - * $foo = (string) $bar; - * // ------------- - * - * // ------------- - * $foo = (object) $bar; - * // ------------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.15 - */ -class ASTCastExpression extends \PDepend\Source\AST\ASTUnaryExpression -{ - /** - * Constructs a new cast-expression node. - * - * @param string $image The original cast image. - */ - public function __construct($image) - { - parent::__construct(preg_replace('(\s+)', '', strtolower($image))); - } - - /** - * Returns <b>true</b> when this node represents an array cast-expression. - * - * @return boolean - */ - public function isArray() - { - return ($this->getImage() === '(array)'); - } - - /** - * Returns <b>true</b> when this node represents an object cast-expression. - * - * @return boolean - */ - public function isObject() - { - return ($this->getImage() === '(object)'); - } - - /** - * Returns <b>true</b> when this node represents a boolean cast-expression. - * - * @return boolean - */ - public function isBoolean() - { - return ($this->getImage() === '(bool)' || $this->getImage() === '(boolean)'); - } - - /** - * Returns <b>true</b> when this node represents an integer cast-expression. - * - * @return boolean - */ - public function isInteger() - { - return ($this->getImage() === '(int)' || $this->getImage() === '(integer)'); - } - - /** - * Returns <b>true</b> when this node represents a float cast-expression. - * - * @return boolean - */ - public function isFloat() - { - return ($this->getImage() === '(real)' - || $this->getImage() === '(float)' - || $this->getImage() === '(double)' - ); - } - - /** - * Returns <b>true</b> when this node represents a string cast-expression. - * - * @return boolean - */ - public function isString() - { - return (strcmp('(string)', $this->getImage()) === 0); - } - - /** - * Returns <b>true</b> when this node represents an unset cast-expression. - * - * @return boolean - */ - public function isUnset() - { - return ($this->getImage() === '(unset)'); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitCastExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCatchStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCatchStatement.php deleted file mode 100644 index 14d1082..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCatchStatement.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a catch-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTCatchStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitCatchStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClass.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClass.php deleted file mode 100644 index 4fda922..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClass.php +++ /dev/null @@ -1,214 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * Represents a php class node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTClass extends AbstractASTClassOrInterface -{ - /** - * List of associated properties. - * - * @var \PDepend\Source\AST\ASTProperty[] - */ - private $properties = null; - - /** - * Returns <b>true</b> if this is an abstract class or an interface. - * - * @return boolean - */ - public function isAbstract() - { - return (($this->modifiers & State::IS_EXPLICIT_ABSTRACT) === State::IS_EXPLICIT_ABSTRACT); - } - - /** - * This method will return <b>true</b> when this class is declared as final. - * - * @return boolean - */ - public function isFinal() - { - return (($this->modifiers & State::IS_FINAL) === State::IS_FINAL); - } - - /** - * Will return <b>true</b> if this class was declared anonymous in an - * allocation expression. - * - * @return boolean - */ - public function isAnonymous() - { - return false; - } - - /** - * Returns all properties for this class. - * - * @return \PDepend\Source\AST\ASTProperty[] - */ - public function getProperties() - { - if ($this->properties === null) { - $this->properties = array(); - - $declarations = $this->findChildrenOfType('PDepend\\Source\\AST\\ASTFieldDeclaration'); - foreach ($declarations as $declaration) { - $declarators = $declaration->findChildrenOfType('PDepend\\Source\\AST\\ASTVariableDeclarator'); - - foreach ($declarators as $declarator) { - $property = new ASTProperty($declaration, $declarator); - $property->setDeclaringClass($this); - $property->setCompilationUnit($this->getCompilationUnit()); - - $this->properties[] = $property; - } - } - } - - return new ASTArtifactList($this->properties); - } - - /** - * Checks that this user type is a subtype of the given <b>$type</b> instance. - * - * @param \PDepend\Source\AST\AbstractASTType $type - * @return boolean - */ - public function isSubtypeOf(AbstractASTType $type) - { - if ($type === $this) { - return true; - } elseif ($type instanceof ASTInterface) { - foreach ($this->getInterfaces() as $interface) { - if ($interface === $type) { - return true; - } - } - } elseif (($parent = $this->getParentClass()) !== null) { - if ($parent === $type) { - return true; - } - return $parent->isSubtypeOf($type); - } - return false; - } - - /** - * Returns the declared modifiers for this type. - * - * @return integer - * @since 0.9.4 - */ - public function getModifiers() - { - return $this->modifiers; - } - - /** - * This method sets a OR combined integer of the declared modifiers for this - * node. - * - * This method will throw an exception when the value of given <b>$modifiers</b> - * contains an invalid/unexpected modifier - * - * @param integer $modifiers - * @return void - * @throws \BadMethodCallException - * @throws \InvalidArgumentException - * @since 0.9.4 - */ - public function setModifiers($modifiers) - { - if ($this->modifiers !== 0) { - throw new \BadMethodCallException( - 'Cannot overwrite previously set class modifiers.' - ); - } - - $expected = ~State::IS_EXPLICIT_ABSTRACT - & ~State::IS_IMPLICIT_ABSTRACT - & ~State::IS_FINAL; - - if (($expected & $modifiers) !== 0) { - throw new \InvalidArgumentException('Invalid class modifier given.'); - } - - $this->modifiers = $modifiers; - } - - /** - * ASTVisitor method for node tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @return void - */ - public function accept(ASTVisitor $visitor) - { - $visitor->visitClass($this); - } - - /** - * The magic wakeup method will be called by PHP's runtime environment when - * a serialized instance of this class was unserialized. This implementation - * of the wakeup method will register this object in the the global class - * context. - * - * @return void - * @since 0.10.0 - */ - public function __wakeup() - { - parent::__wakeup(); - - $this->context->registerClass($this); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassFqnPostfix.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassFqnPostfix.php deleted file mode 100644 index c92f99a..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassFqnPostfix.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.0.0 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This class represents the full qualified class name postfix. - * - * <code> - * // ----- - * Foo::class - * // ----- - * - * // ----- - * $bar:: class; - * // ----- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.0.0 - */ -class ASTClassFqnPostfix extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitClassFqnPostfix($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceRecursiveInheritanceException.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceRecursiveInheritanceException.php deleted file mode 100644 index 44f3d9c..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceRecursiveInheritanceException.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -/** - * This type of exception will be thrown when an inheritance hierarchy is - * recursive, so that . - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -class ASTClassOrInterfaceRecursiveInheritanceException extends \RuntimeException -{ - /** - * Constructs a new exception instance. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $type - */ - public function __construct(AbstractASTClassOrInterface $type) - { - parent::__construct( - sprintf( - 'Type %s\%s is part of an endless inheritance hierarchy.', - preg_replace('(\W+)', '\\', $type->getNamespace()->getName()), - $type->getName() - ) - ); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceReference.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceReference.php deleted file mode 100644 index f24af79..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceReference.php +++ /dev/null @@ -1,126 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.5 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; -use PDepend\Source\Builder\BuilderContext; - -/** - * This class is used as a placeholder for unknown classes or interfaces. It - * will resolve the concrete type instance on demand. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.5 - */ -class ASTClassOrInterfaceReference extends ASTType -{ - /** - * The global AST builder context. - * - * @var \PDepend\Source\Builder\BuilderContext - */ - protected $context = null; - - /** - * An already loaded type instance. - * - * @var \PDepend\Source\AST\AbstractASTClassOrInterface|null - */ - protected $typeInstance = null; - - /** - * Constructs a new type holder instance. - * - * @param \PDepend\Source\Builder\BuilderContext $context - * @param string $qualifiedName - */ - public function __construct(BuilderContext $context, $qualifiedName) - { - parent::__construct($qualifiedName); - - $this->context = $context; - } - - /** - * Returns the concrete type instance associated with with this placeholder. - * - * @return \PDepend\Source\AST\AbstractASTClassOrInterface - */ - public function getType() - { - if ($this->typeInstance === null) { - $this->typeInstance = $this->context->getClassOrInterface( - $this->getImage() - ); - } - return $this->typeInstance; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitClassOrInterfaceReference($this, $data); - } - - /** - * Magic method which returns the names of all those properties that should - * be cached for this node instance. - * - * @return array - * @since 0.10.0 - */ - public function __sleep() - { - return array_merge(array('context'), parent::__sleep()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceReferenceIterator.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceReferenceIterator.php deleted file mode 100644 index b4b85fa..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassOrInterfaceReferenceIterator.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -/** - * This is a special implementation of the node iterator that will translate - * a list of given {@link \PDepend\Source\AST\ASTClassOrInterfaceReference} holders - * into a list of unique {@link \PDepend\Source\AST\AbstractASTClassOrInterface} - * instances. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTClassOrInterfaceReferenceIterator extends ASTArtifactList -{ - /** - * Constructs a new reference iterator instance. - * - * @param \PDepend\Source\AST\ASTClassOrInterfaceReference[] $references List of - * references to concrete type instances. - */ - public function __construct(array $references) - { - parent::__construct($this->createClassesAndInterfaces($references)); - } - - /** - * This method creates a set of {@link \PDepend\Source\AST\AbstractASTClassOrInterface} - * objects from the given reference array. - * - * @param \PDepend\Source\AST\ASTClassOrInterfaceReference[] $references - * @return \PDepend\Source\AST\AbstractASTClassOrInterface[] - */ - protected function createClassesAndInterfaces(array $references) - { - $classesAndInterfaces = array(); - - foreach ($references as $reference) { - $classOrInterface = $reference->getType(); - - if (isset($classesAndInterfaces[$classOrInterface->getId()])) { - continue; - } - $classesAndInterfaces[$classOrInterface->getId()] = $classOrInterface; - } - - return $classesAndInterfaces; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassReference.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassReference.php deleted file mode 100644 index d2a5bfb..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClassReference.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.5 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This is a classes only version of the class or interface reference . - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.5 - */ -class ASTClassReference extends ASTClassOrInterfaceReference -{ - /** - * Returns the concrete type instance associated with with this placeholder. - * - * @return \PDepend\Source\AST\AbstractASTClassOrInterface - */ - public function getType() - { - if ($this->typeInstance === null) { - $this->typeInstance = $this->context->getClass($this->getImage()); - } - return $this->typeInstance; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitClassReference($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCloneExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCloneExpression.php deleted file mode 100644 index 45cd77a..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCloneExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a clone-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTCloneExpression extends \PDepend\Source\AST\ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitCloneExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClosure.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClosure.php deleted file mode 100644 index ea205fc..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTClosure.php +++ /dev/null @@ -1,158 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a closure-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTClosure extends AbstractASTNode implements ASTCallable -{ - /** - * @return \PDepend\Source\AST\ASTType|null - */ - public function getReturnType() - { - foreach ($this->nodes as $node) { - if ($node instanceof ASTType) { - return $node; - } - } - return null; - } - - /** - * This method will return <b>true</b> when this closure returns by - * reference. - * - * @return boolean - */ - public function returnsByReference() - { - return $this->getMetadataBoolean(5); - } - - /** - * This method can be used to flag this closure as returns by reference. - * - * @param boolean $returnsReference Does this closure return by reference? - * - * @return void - */ - public function setReturnsByReference($returnsReference) - { - $this->setMetadataBoolean(5, (boolean) $returnsReference); - } - - /** - * Returns whether this closure was defined as static or not. - * - * This method will return <b>TRUE</b> when the closure was declared as - * followed: - * - * <code> - * $closure = static function( $e ) { - * return pow( $e, 2 ); - * } - * </code> - * - * And it will return <b>FALSE</b> when we declare the closure as usual: - * - * <code> - * $closure = function( $e ) { - * return pow( $e, 2 ); - * } - * </code> - * - * @return boolean - * @since 1.0.0 - */ - public function isStatic() - { - return $this->getMetadataBoolean(6); - } - - /** - * This method can be used to flag this closure instance as static. - * - * @param boolean $static Whether this closure is static or not. - * - * @return void - * @since 1.0.0 - */ - public function setStatic($static) - { - $this->setMetadataBoolean(6, (boolean) $static); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitClosure($this, $data); - } - - /** - * Returns the total number of the used property bag. - * - * @return integer - * @since 1.0.0 - * @see \PDepend\Source\AST\ASTNode#getMetadataSize() - */ - protected function getMetadataSize() - { - return 7; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTComment.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTComment.php deleted file mode 100644 index 4f7865a..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTComment.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a comment. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTComment extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitComment($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompilationUnit.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompilationUnit.php deleted file mode 100644 index 871b55c..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompilationUnit.php +++ /dev/null @@ -1,384 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; -use PDepend\Util\Cache\CacheDriver; - -/** - * This class provides an interface to a single source file. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTCompilationUnit extends AbstractASTArtifact -{ - /** - * The internal used cache instance. - * - * @var \PDepend\Util\Cache\CacheDriver - * @since 0.10.0 - */ - protected $cache = null; - - /** - * The unique identifier for this function. - * - * @var string - */ - protected $id = null; - - /** - * The source file name/path. - * - * @var string - */ - protected $fileName = null; - - /** - * The comment for this type. - * - * @var string - */ - protected $comment = null; - - /** - * The files start line. This property must always have the value <em>1</em>. - * - * @var integer - * @since 0.10.0 - */ - protected $startLine = 0; - - /** - * The files end line. - * - * @var integer - * @since 0.10.0 - */ - protected $endLine = 0; - - /** - * List of classes, interfaces and functions that parsed from this file. - * - * @var \PDepend\Source\AST\AbstractASTArtifact[] - * @since 0.10.0 - */ - protected $childNodes = array(); - - /** - * Was this file instance restored from the cache? - * - * @var boolean - * @since 0.10.0 - */ - protected $cached = false; - - /** - * Normalized code in this file. - * - * @var string - */ - private $source = null; - - /** - * Constructs a new source file instance. - * - * @param string|null $fileName The source file name/path. - */ - public function __construct($fileName) - { - if ($fileName && strpos($fileName, 'php://') === 0) { - $this->fileName = $fileName; - } elseif ($fileName !== null) { - $this->fileName = realpath($fileName); - } - } - - /** - * Returns the physical file name for this object. - * - * @return string - */ - public function getName() - { - return $this->fileName; - } - - /** - * Returns the physical file name for this object. - * - * @return string - */ - public function getFileName() - { - return $this->fileName; - } - - /** - * Returns a id for this code node. - * - * @return string - */ - public function getId() - { - return $this->id; - } - - /** - * Sets the unique identifier for this file instance. - * - * @param string $id Identifier for this file. - * @return void - * @since 0.9.12 - */ - public function setId($id) - { - $this->id = $id; - } - - /** - * Setter method for the used parser and token cache. - * - * @param \PDepend\Util\Cache\CacheDriver $cache - * @return \PDepend\Source\AST\ASTCompilationUnit - * @since 0.10.0 - */ - public function setCache(CacheDriver $cache) - { - $this->cache = $cache; - return $this; - } - - /** - * Returns normalized source code with stripped whitespaces. - * - * @return string - */ - public function getSource() - { - $this->readSource(); - return $this->source; - } - - /** - * Returns an <b>array</b> with all tokens within this file. - * - * @return array<array> - */ - public function getTokens() - { - return (array) $this->cache - ->type('tokens') - ->restore($this->getId()); - } - - /** - * Sets the tokens for this file. - * - * @param array<array> $tokens The generated tokens. - * - * @return void - */ - public function setTokens(array $tokens) - { - $this->cache - ->type('tokens') - ->store($this->getId(), $tokens); - } - - /** - * Adds a source item that was parsed from this source file. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $artifact - * @return void - * @since 0.10.0 - */ - public function addChild(AbstractASTArtifact $artifact) - { - $this->childNodes[$artifact->getId()] = $artifact; - } - - /** - * Returns the start line number for this source file. For an existing file - * this value must always be <em>1</em>, while it can be <em>0</em> for a - * not existing dummy file. - * - * @return integer - * @since 0.10.0 - */ - public function getStartLine() - { - if ($this->startLine === 0) { - $this->readSource(); - } - return $this->startLine; - } - - /** - * Returns the start line number for this source file. For an existing file - * this value must always be greater <em>0</em>, while it can be <em>0</em> - * for a not existing dummy file. - * - * @return integer - * @since 0.10.0 - */ - public function getEndLine() - { - if ($this->endLine === 0) { - $this->readSource(); - } - return $this->endLine; - } - - /** - * This method will return <b>true</b> when this file instance was restored - * from the cache and not currently parsed. Otherwise this method will return - * <b>false</b>. - * - * @return boolean - * @since 0.10.0 - */ - public function isCached() - { - return $this->cached; - } - - /** - * ASTVisitor method for node tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @return void - */ - public function accept(ASTVisitor $visitor) - { - $visitor->visitCompilationUnit($this); - } - - /** - * The magic sleep method will be called by PHP's runtime environment right - * before it serializes an instance of this class. This method returns an - * array with those property names that should be serialized. - * - * @return array<string> - * @since 0.10.0 - */ - public function __sleep() - { - return array( - 'cache', - 'childNodes', - 'comment', - 'endLine', - 'fileName', - 'startLine', - 'id' - ); - } - - /** - * The magic wakeup method will is called by PHP's runtime environment when - * a serialized instance of this class was unserialized. This implementation - * of the wakeup method restores the references between all parsed entities - * in this source file and this file instance. - * - * @return void - * @since 0.10.0 - * @see \PDepend\Source\AST\ASTCompilationUnit::$childNodes - */ - public function __wakeup() - { - $this->cached = true; - - foreach ($this->childNodes as $childNode) { - $childNode->setCompilationUnit($this); - } - } - - /** - * Returns the string representation of this class. - * - * @return string - */ - public function __toString() - { - return ($this->fileName === null ? '' : $this->fileName); - } - - /** - * Reads the source file if required. - * - * @return void - */ - protected function readSource() - { - if ($this->source === null && (file_exists($this->fileName) || strpos($this->fileName, 'php://') === 0)) { - $source = file_get_contents($this->fileName); - - $this->source = str_replace(array("\r\n", "\r"), "\n", $source); - - $this->startLine = 1; - $this->endLine = substr_count($this->source, "\n") + 1; - } - } - - // Deprecated methods - // @codeCoverageIgnoreStart - - /** - * This method can be called by the PDepend runtime environment or a - * utilizing component to free up memory. This methods are required for - * PHP version < 5.3 where cyclic references can not be resolved - * automatically by PHP's garbage collector. - * - * @return void - * @since 0.9.12 - * @deprecated Since 0.10.0 - */ - public function free() - { - fwrite(STDERR, __METHOD__ . ' is deprecated since version 0.10.0' . PHP_EOL); - } - - // @codeCoverageIgnoreEnd -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompilationUnitNotFoundException.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompilationUnitNotFoundException.php deleted file mode 100644 index a988915..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompilationUnitNotFoundException.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Source\AST; - -/** - * This type of exception will be thrown when the source file of a code object - * is accessed, but this property is not available. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -class ASTCompilationUnitNotFoundException extends \RuntimeException -{ - /** - * Constructs a new exception instance. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $owner - */ - public function __construct(AbstractASTArtifact $owner) - { - parent::__construct( - sprintf( - 'The mandatory parent was not defined for the %s named %s.', - get_class($owner), - $owner->getName() - ) - ); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompoundExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompoundExpression.php deleted file mode 100644 index 8773d0c..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompoundExpression.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This class represents a compound expression node. - * - * <code> - * // ----- - * Foo::${BAR}(); - * // ----- - * - * // ----- - * Foo::$${BAR}(); - * // ----- - * - * // ----- - * $foo->{BAR}(); - * // ----- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTCompoundExpression extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitCompoundExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompoundVariable.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompoundVariable.php deleted file mode 100644 index 696b00f..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTCompoundVariable.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This class represents a compound variable node. - * - * <code> - * // ------ - * Foo::${BAR}(); - * // ------ - * - * // ------ - * Foo::$${BAR}(); - * // ------ - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTCompoundVariable extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitCompoundVariable($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConditionalExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConditionalExpression.php deleted file mode 100644 index 14b1f92..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConditionalExpression.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a conditional expression. - * - * <code> - * -------------- - * $x = ($foo ? 42 : 23) - * -------------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTConditionalExpression extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitConditionalExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstant.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstant.php deleted file mode 100644 index 3171240..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstant.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This class represents a constant node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTConstant extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitConstant($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantDeclarator.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantDeclarator.php deleted file mode 100644 index 3da04e1..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantDeclarator.php +++ /dev/null @@ -1,136 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This class represents a single constant declarator within a constant - * definition. - * - * <code> - * class Foo - * { - * // -------- - * const BAR = 42; - * // -------- - * } - * </code> - * - * Or in a comma separated constant defintion: - * - * <code> - * class Foo - * { - * // -------- - * const BAR = 42, - * // -------- - * - * // -------------- - * const BAZ = 'Foobar', - * // -------------- - * - * // ---------- - * const FOO = 3.14; - * // ---------- - * } - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTConstantDeclarator extends AbstractASTNode -{ - /** - * The initial declaration value for this node or <b>null</b>. - * - * @var \PDepend\Source\AST\ASTValue - */ - protected $value = null; - - /** - * Returns the initial declaration value for this node. - * - * @return \PDepend\Source\AST\ASTValue - */ - public function getValue() - { - return $this->value; - } - - /** - * Sets the declared default value for this constant node. - * - * @param \PDepend\Source\AST\ASTValue $value - * @return void - */ - public function setValue(ASTValue $value) - { - $this->value = $value; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitConstantDeclarator($this, $data); - } - - /** - * Magic sleep method that returns an array with those property names that - * should be cached for this node instance. - * - * @return array<string> - */ - public function __sleep() - { - return array_merge(array('value'), parent::__sleep()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantDefinition.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantDefinition.php deleted file mode 100644 index 1e1f154..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantDefinition.php +++ /dev/null @@ -1,163 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This class represents a single constant definition as it can occure in - * class definition or interface declaration. - * - * <code> - * class Foo - * { - * // ------------------------ - * const FOO = 42, BAR = 23; - * // ------------------------ - * } - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTConstantDefinition extends AbstractASTNode -{ - /** - * This method returns a OR combined integer of the declared modifiers for - * this property. - * - * @return integer - */ - public function getModifiers() - { - return $this->getMetadataInteger(5); - } - - /** - * This method sets a OR combined integer of the declared modifiers for this - * node. - * - * This method will throw an exception when the value of given <b>$modifiers</b> - * contains an invalid/unexpected modifier - * - * @param integer $modifiers The declared modifiers for this node. - * - * @return void - * @throws \InvalidArgumentException If the given modifier contains unexpected values. - */ - public function setModifiers($modifiers) - { - $expected = ~State::IS_PUBLIC - & ~State::IS_PROTECTED - & ~State::IS_PRIVATE; - - if (($expected & $modifiers) !== 0) { - throw new \InvalidArgumentException( - 'Invalid field modifiers given, allowed modifiers are ' . - 'IS_PUBLIC, IS_PROTECTED and IS_PRIVATE.' - ); - } - - $this->setMetadataInteger(5, $modifiers); - } - - /** - * Returns <b>true</b> if this node is marked as public, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isPublic() - { - return (($this->getModifiers() & State::IS_PUBLIC) === State::IS_PUBLIC); - } - - /** - * Returns <b>true</b> if this node is marked as protected, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isProtected() - { - return (($this->getModifiers() & State::IS_PROTECTED) === State::IS_PROTECTED); - } - - /** - * Returns <b>true</b> if this node is marked as private, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isPrivate() - { - return (($this->getModifiers() & State::IS_PRIVATE) === State::IS_PRIVATE); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitConstantDefinition($this, $data); - } - - - /** - * Returns the total number of the used property bag. - * - * @return integer - * @since 0.10.4 - * @see \PDepend\Source\AST\ASTNode#getMetadataSize() - */ - protected function getMetadataSize() - { - return 6; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantPostfix.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantPostfix.php deleted file mode 100644 index a3641ba..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTConstantPostfix.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This class represents a constant postfix expression.. - * - * <code> - * // --- - * Foo::BAR; - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTConstantPostfix extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitConstantPostfix($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTContinueStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTContinueStatement.php deleted file mode 100644 index f83c600..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTContinueStatement.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a continue-statement. - * - * <code> - * --------- - * continue; - * --------- - * - * ------------ - * continue 42; - * ------------ - * - * ------------------------- - * continue $this->foobar(); - * ------------------------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTContinueStatement extends \PDepend\Source\AST\ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitContinueStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTDeclareStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTDeclareStatement.php deleted file mode 100644 index d7f94d5..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTDeclareStatement.php +++ /dev/null @@ -1,130 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a declare-statement. - * - * <code> - * ------------------------------- - * declare(encoding='ISO-8859-1'); - * ------------------------------- - * - * ------------------- - * declare(ticks=42) { - * // ... - * } - * - - * - * ------------------ - * declare(ticks=42): - * // ... - * enddeclare; - * ----------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -class ASTDeclareStatement extends \PDepend\Source\AST\ASTStatement -{ - /** - * The parsed declare values. - * - * @var \PDepend\Source\AST\ASTValue[] - */ - protected $values = array(); - - /** - * Returns all values/parameters for this declare statement. - * - * @return \PDepend\Source\AST\ASTValue[] - */ - public function getValues() - { - return $this->values; - } - - /** - * Adds a parameter/value for this declare-statement. - * - * @param string $name - * @param \PDepend\Source\AST\ASTValue $value - * - * @return void - */ - public function addValue($name, ASTValue $value) - { - $this->values[$name] = $value; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * - * @return mixed - * @since 0.10.0 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitDeclareStatement($this, $data); - } - - /** - * The magic sleep method will be called by PHP's runtime environment right - * before an instance of this class gets serialized. It should return an - * array with those property names that should be serialized for this class. - * - * @return array<string> - * @since 0.10.0 - */ - public function __sleep() - { - return array_merge(array('values'), parent::__sleep()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTDoWhileStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTDoWhileStatement.php deleted file mode 100644 index ec38c9a..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTDoWhileStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a do/while-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTDoWhileStatement extends \PDepend\Source\AST\ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitDoWhileStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTEchoStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTEchoStatement.php deleted file mode 100644 index ceb8783..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTEchoStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents an echo-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTEchoStatement extends \PDepend\Source\AST\ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitEchoStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTElseIfStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTElseIfStatement.php deleted file mode 100644 index 3077a14..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTElseIfStatement.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents an elseif-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTElseIfStatement extends \PDepend\Source\AST\ASTStatement -{ - /** - * Returns <b>true</b> when this <b>elseif</b>-statement is followed by an - * <b>else</b>-statement. - * - * @return boolean - * @since 0.9.12 - */ - public function hasElse() - { - if (count($this->nodes) === 3) { - return (count($this->nodes) === 3); - } - return false; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitElseIfStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTEvalExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTEvalExpression.php deleted file mode 100644 index c802741..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTEvalExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents an eval-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTEvalExpression extends \PDepend\Source\AST\ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitEvalExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTExitExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTExitExpression.php deleted file mode 100644 index 16c2173..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTExitExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents an exit-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTExitExpression extends \PDepend\Source\AST\ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitExitExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTExpression.php deleted file mode 100644 index 8074342..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This node class encapsultes any expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTExpression extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFieldDeclaration.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFieldDeclaration.php deleted file mode 100644 index 13c52ce..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFieldDeclaration.php +++ /dev/null @@ -1,205 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use OutOfBoundsException; - -/** - * This class represents a field or property declaration of a class. - * - * <code> - * // Simple field declaration - * class Foo { - * protected $foo; - * } - * - * // Field declaration with multiple properties - * class Foo { - * protected $foo = 23 - * $bar = 42, - * $baz = null; - * } - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTFieldDeclaration extends AbstractASTNode -{ - /** - * Checks if this parameter has a type. - * - * @return boolean - */ - public function hasType() - { - return (reset($this->nodes) instanceof ASTType); - } - - /** - * Returns the type of this parameter. - * - * @return \PDepend\Source\AST\ASTType - */ - public function getType() - { - if ($this->hasType()) { - return $this->getChild(0); - } - - throw new OutOfBoundsException('The parameter does not have a type specification.'); - } - - /** - * This method returns a OR combined integer of the declared modifiers for - * this property. - * - * @return integer - */ - public function getModifiers() - { - return $this->getMetadataInteger(5); - } - - /** - * This method sets a OR combined integer of the declared modifiers for this - * node. - * - * This method will throw an exception when the value of given <b>$modifiers</b> - * contains an invalid/unexpected modifier - * - * @param integer $modifiers The declared modifiers for this node. - * - * @return void - * @throws \InvalidArgumentException If the given modifier contains unexpected values. - */ - public function setModifiers($modifiers) - { - $expected = ~State::IS_PUBLIC - & ~State::IS_PROTECTED - & ~State::IS_PRIVATE - & ~State::IS_STATIC; - - if (($expected & $modifiers) !== 0) { - throw new \InvalidArgumentException( - 'Invalid field modifiers given, allowed modifiers are ' . - 'IS_PUBLIC, IS_PROTECTED, IS_PRIVATE and IS_STATIC.' - ); - } - - $this->setMetadataInteger(5, $modifiers); - } - - /** - * Returns <b>true</b> if this node is marked as public, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isPublic() - { - return (($this->getModifiers() & State::IS_PUBLIC) === State::IS_PUBLIC); - } - - /** - * Returns <b>true</b> if this node is marked as protected, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isProtected() - { - return (($this->getModifiers() & State::IS_PROTECTED) === State::IS_PROTECTED); - } - - /** - * Returns <b>true</b> if this node is marked as private, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isPrivate() - { - return (($this->getModifiers() & State::IS_PRIVATE) === State::IS_PRIVATE); - } - - /** - * Returns <b>true</b> when this node is declared as static, otherwise - * the returned value will be <b>false</b>. - * - * @return boolean - */ - public function isStatic() - { - return (($this->getModifiers() & State::IS_STATIC) === State::IS_STATIC); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitFieldDeclaration($this, $data); - } - - /** - * Returns the total number of the used property bag. - * - * @return integer - * @since 0.10.4 - * @see \PDepend\Source\AST\ASTNode#getMetadataSize() - */ - protected function getMetadataSize() - { - return 6; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFinallyStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFinallyStatement.php deleted file mode 100644 index 7c72df7..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFinallyStatement.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a finally-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTFinallyStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitFinallyStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForInit.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForInit.php deleted file mode 100644 index bfe6de8..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForInit.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -/** - * This node class represent the init part of a for-statement. - * - * <code> - * ------------------------ - * for ($x = 0, $y = 23, $z = 42; $x < $y; ++$x) {} - * ------------------------ - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTForInit extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitForInit($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForStatement.php deleted file mode 100644 index b187a1b..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a for-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTForStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitForStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForUpdate.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForUpdate.php deleted file mode 100644 index 7a6e775..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForUpdate.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represent the update part of a for-statement. - * - * <code> - * ------------------------------- - * for ($x = 0, $y = 23, $z = 42; $x < $y; ++$x, $y = $x + 1, $z = $x + 2) {} - * ------------------------------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTForUpdate extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitForUpdate($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForeachStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForeachStatement.php deleted file mode 100644 index b95e69b..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTForeachStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a foreach-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTForeachStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitForeachStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFormalParameter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFormalParameter.php deleted file mode 100644 index 30ee926..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFormalParameter.php +++ /dev/null @@ -1,155 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use OutOfBoundsException; -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This class represents a formal parameter within the signature of a function, - * method or closure. - * - * Formal parameters can include a type hint, a by reference identifier and a - * default value. The only mandatory part is the parameter identifier. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTFormalParameter extends AbstractASTNode -{ - /** - * Checks if this parameter has a type. - * - * @return boolean - */ - public function hasType() - { - return (reset($this->nodes) instanceof ASTType); - } - - /** - * Returns the type of this parameter. - * - * @return \PDepend\Source\AST\ASTType - */ - public function getType() - { - if ($this->hasType()) { - return $this->getChild(0); - } - - throw new OutOfBoundsException('The parameter does not have a type specification.'); - } - - /** - * This method will return <b>true</b> when the parameter is declared as a - * variable argument list <b>...</b>. - * - * @return boolean - * @since 2.0.7 - */ - public function isVariableArgList() - { - return $this->getMetadataBoolean(6); - } - - /** - * This method can be used to mark this parameter as passed by reference. - * - * @return void - @since 2.0.7 - */ - public function setVariableArgList() - { - $this->setMetadataBoolean(6, true); - } - - /** - * This method will return <b>true</b> when the parameter is passed by - * reference. - * - * @return boolean - */ - public function isPassedByReference() - { - return $this->getMetadataBoolean(5); - } - - /** - * This method can be used to mark this parameter as passed by reference. - * - * @return void - */ - public function setPassedByReference() - { - $this->setMetadataBoolean(5, true); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitFormalParameter($this, $data); - } - - /** - * Returns the total number of the used property bag. - * - * @return integer - * @since 0.10.4 - * @see \PDepend\Source\AST\ASTNode#getMetadataSize() - */ - protected function getMetadataSize() - { - return 7; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFormalParameters.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFormalParameters.php deleted file mode 100644 index 6ecd6fa..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFormalParameters.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This ast class represents a list for formal parameters. This means the - * parameters of a method, function or closure declaration. - * - * <code> - * // -- - * function foo() {} - * // -- - * - * // -------- - * $x = function($x, $y) {} - * // -------- - * - * class Foo { - * // ----------------- - * public function bar(Foo $obj = null) {} - * // ----------------- - * } - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTFormalParameters extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitFormalParameters($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFunction.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFunction.php deleted file mode 100644 index b603763..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFunction.php +++ /dev/null @@ -1,176 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; -use PDepend\Source\Builder\BuilderContext; - -/** - * Represents a php function node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTFunction extends AbstractASTCallable -{ - /** - * The parent namespace for this function. - * - * @var \PDepend\Source\AST\ASTNamespace|null - * @since 0.10.0 - */ - private $namespace = null; - - /** - * The currently used builder context. - * - * @var \PDepend\Source\Builder\BuilderContext|null - * @since 0.10.0 - */ - protected $context = null; - - /** - * The name of the parent namespace for this function. We use this property - * to restore the parent namespace while we unserialize a cached object tree. - * - * @var string|null - */ - protected $namespaceName = null; - - /** - * Sets the currently active builder context. - * - * @param \PDepend\Source\Builder\BuilderContext $context Current builder context. - * @return \PDepend\Source\AST\ASTFunction - * @since 0.10.0 - */ - public function setContext(BuilderContext $context) - { - $this->context = $context; - return $this; - } - - /** - * Returns the parent namespace for this function. - * - * @return \PDepend\Source\AST\ASTNamespace - */ - public function getNamespace() - { - return $this->namespace; - } - - /** - * Sets the parent namespace for this function. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function setNamespace(ASTNamespace $namespace) - { - $this->namespaceName = $namespace->getName(); - $this->namespace = $namespace; - } - - /** - * Resets the namespace associated with this function node. - * - * @return void - * @since 0.10.2 - */ - public function unsetNamespace() - { - $this->namespaceName = null; - $this->namespace = null; - } - - /** - * Returns the name of the parent namespace/package or <b>NULL</b> when this - * function does not belong to a namespace. - * - * @return string - * @since 0.10.0 - */ - public function getNamespaceName() - { - return $this->namespaceName; - } - - /** - * ASTVisitor method for node tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @return void - */ - public function accept(ASTVisitor $visitor) - { - $visitor->visitFunction($this); - } - - /** - * The magic sleep method will be called by the PHP engine when this class - * gets serialized. It returns an array with those properties that should be - * cached for all function instances. - * - * @return array<string> - * @since 0.10.0 - */ - public function __sleep() - { - return array_merge(array('context', 'namespaceName'), parent::__sleep()); - } - - /** - * The magic wakeup method will be called by PHP's runtime environment when - * a serialized instance of this class was unserialized. This implementation - * of the wakeup method will register this object in the the global function - * context. - * - * @return void - * @since 0.10.0 - */ - public function __wakeup() - { - $this->context->registerFunction($this); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFunctionPostfix.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFunctionPostfix.php deleted file mode 100644 index ac72ba0..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTFunctionPostfix.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a function postfix expression. - * - * <code> - * //------- - * foo($bar); - * //------- - * - * //-------- - * $foo($bar); - * //-------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTFunctionPostfix extends ASTInvocation -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitFunctionPostfix($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTGlobalStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTGlobalStatement.php deleted file mode 100644 index 362a272..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTGlobalStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a global-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTGlobalStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitGlobalStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTGotoStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTGotoStatement.php deleted file mode 100644 index 23064c4..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTGotoStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a goto-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTGotoStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitGotoStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTHeredoc.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTHeredoc.php deleted file mode 100644 index 2d425e4..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTHeredoc.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a here-/nowdoc node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTHeredoc extends ASTExpression -{ - /** - * Delimiter used for this heredoc instance. - * - * @var string - */ - protected $delimiter = null; - - /** - * Sets the delimiter used for this heredoc instance. - * - * @param string $delimiter The heredoc delimiter. - * - * @return void - */ - public function setDelimiter($delimiter) - { - $this->delimiter = $delimiter; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitHeredoc($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIdentifier.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIdentifier.php deleted file mode 100644 index a7090e0..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIdentifier.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * A static identifier as it can be used to access a function, method, constant - * or property. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTIdentifier extends ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitIdentifier($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIfStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIfStatement.php deleted file mode 100644 index 4ca26b7..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIfStatement.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents an if-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTIfStatement extends ASTStatement -{ - /** - * Returns <b>true</b> when this <b>if</b>-statement is followed by an - * <b>else</b>-statement. - * - * @return boolean - * @since 0.9.12 - */ - public function hasElse() - { - return (count($this->nodes) === 3); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitIfStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIncludeExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIncludeExpression.php deleted file mode 100644 index 3d20393..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIncludeExpression.php +++ /dev/null @@ -1,108 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a <b>include</b>- or <b>include_once</b>-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTIncludeExpression extends ASTExpression -{ - /** - * Does this node represent a <b>include_once</b>-expression? - * - * @var boolean - */ - protected $once = false; - - /** - * Does this node represent a <b>include_once</b>-expression? - * - * @return boolean - */ - public function isOnce() - { - return $this->once; - } - - /** - * Flags this node as a <b>include_once</b>-expression. - * - * @return void - */ - public function setOnce() - { - $this->once = true; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitIncludeExpression($this, $data); - } - - /** - * The magic sleep method will be called by PHP's runtime environment right - * before an instance of this class gets serialized. It should return an - * array with those property names that should be serialized for this class. - * - * @return array<string> - * @since 0.10.0 - */ - public function __sleep() - { - return array_merge(array('once'), parent::__sleep()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIndexExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIndexExpression.php deleted file mode 100644 index 440a7e9..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIndexExpression.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This is an abstract base class for index nodes. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -abstract class ASTIndexExpression extends ASTExpression -{ -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInstanceOfExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInstanceOfExpression.php deleted file mode 100644 index e10a993..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInstanceOfExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents an instanceof expression node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTInstanceOfExpression extends ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitInstanceOfExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInterface.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInterface.php deleted file mode 100644 index effde60..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInterface.php +++ /dev/null @@ -1,145 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * Representation of a code interface. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTInterface extends AbstractASTClassOrInterface -{ - /** - * The modifiers for this interface instance, by default an interface is - * always abstract. - * - * @var integer - */ - protected $modifiers = State::IS_IMPLICIT_ABSTRACT; - - /** - * Returns <b>true</b> if this is an abstract class or an interface. - * - * @return boolean - */ - public function isAbstract() - { - return true; - } - - /** - * Sets a reference onto the parent class of this class node. - * - * @param \PDepend\Source\AST\ASTClassReference $classReference - * @return void - * @throws \BadMethodCallException - * @since 0.9.5 - */ - public function setParentClassReference(\PDepend\Source\AST\ASTClassReference $classReference) - { - throw new \BadMethodCallException( - 'Unsupported method ' . __METHOD__ . '() called.' - ); - } - - /** - * Checks that this user type is a subtype of the given <b>$type</b> instance. - * - * @param \PDepend\Source\AST\AbstractASTType $type - * @return boolean - */ - public function isSubtypeOf(AbstractASTType $type) - { - if ($type === $this) { - return true; - } elseif ($type instanceof ASTInterface) { - foreach ($this->getInterfaces() as $interface) { - if ($interface === $type) { - return true; - } - } - } - return false; - } - - /** - * Returns the declared modifiers for this type. - * - * @return integer - * @since 0.9.4 - */ - public function getModifiers() - { - return $this->modifiers; - } - - /** - * ASTVisitor method for node tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @return void - */ - public function accept(ASTVisitor $visitor) - { - $visitor->visitInterface($this); - } - - /** - * The magic wakeup method will be called by PHP's runtime environment when - * a serialized instance of this class was unserialized. This implementation - * of the wakeup method will register this object in the the global class - * context. - * - * @return void - * @since 0.10.0 - */ - public function __wakeup() - { - parent::__wakeup(); - - $this->context->registerInterface($this); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInvocation.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInvocation.php deleted file mode 100644 index f56115e..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTInvocation.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This is an abstract base class for invocation nodes. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -abstract class ASTInvocation extends ASTExpression -{ -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIssetExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIssetExpression.php deleted file mode 100644 index 971ed21..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTIssetExpression.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents an isste-expression/function. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTIssetExpression extends ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitIssetExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLabelStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLabelStatement.php deleted file mode 100644 index 0b3da02..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLabelStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a label-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTLabelStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitLabelStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTListExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTListExpression.php deleted file mode 100644 index d73de56..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTListExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a list-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTListExpression extends ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitListExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLiteral.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLiteral.php deleted file mode 100644 index 6819d64..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLiteral.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a literal node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTLiteral extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitLiteral($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalAndExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalAndExpression.php deleted file mode 100644 index 251d3b2..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalAndExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a logical <b>and</b>-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTLogicalAndExpression extends ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitLogicalAndExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalOrExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalOrExpression.php deleted file mode 100644 index 5db5d7c..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalOrExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a logical <b>or</b>-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTLogicalOrExpression extends ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitLogicalOrExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalXorExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalXorExpression.php deleted file mode 100644 index d5433e9..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTLogicalXorExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a logical <b>xor</b>-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTLogicalXorExpression extends ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitLogicalXorExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMemberPrimaryPrefix.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMemberPrimaryPrefix.php deleted file mode 100644 index 40d9647..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMemberPrimaryPrefix.php +++ /dev/null @@ -1,99 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * Primary prefix expression as it is used to access class or interface members - * like methods, properties and constants. - * - * <code> - * //-------- - * Foo::bar(); - * //-------- - * - * //--------- - * Foo::$bar(); - * //--------- - * - * //--------- - * $obj->bar(); - * //--------- - * - * //---------- - * $obj->$bar(); - * //---------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTMemberPrimaryPrefix extends AbstractASTNode -{ - /** - * Returns <b>true</b> when this member primary prefix represents a static - * property or method access. - * - * @return boolean - */ - public function isStatic() - { - return ($this->getImage() === '::'); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitMemberPrimaryPrefix($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMethod.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMethod.php deleted file mode 100644 index 28a4ae9..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMethod.php +++ /dev/null @@ -1,234 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * Represents a php method node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTMethod extends AbstractASTCallable -{ - /** - * The parent type object. - * - * @var \PDepend\Source\AST\AbstractASTType - */ - protected $parent = null; - - /** - * Defined modifiers for this property node. - * - * @var integer - */ - protected $modifiers = 0; - - /** - * This method returns a OR combined integer of the declared modifiers for - * this method. - * - * @return integer - * @since 1.0.0 - */ - public function getModifiers() - { - return $this->modifiers; - } - - /** - * This method sets a OR combined integer of the declared modifiers for this - * node. - * - * This method will throw an exception when the value of given <b>$modifiers</b> - * contains an invalid/unexpected modifier - * - * @param integer $modifiers - * @return void - * @throws \InvalidArgumentException If the given modifier contains unexpected values. - * @since 0.9.4 - */ - public function setModifiers($modifiers) - { - $expected = ~State::IS_PUBLIC - & ~State::IS_PROTECTED - & ~State::IS_PRIVATE - & ~State::IS_STATIC - & ~State::IS_ABSTRACT - & ~State::IS_FINAL; - - if (($expected & $modifiers) !== 0) { - throw new \InvalidArgumentException('Invalid method modifier given.'); - } - - $this->modifiers = $modifiers; - } - - /** - * Returns <b>true</b> if this is an abstract method. - * - * @return boolean - */ - public function isAbstract() - { - return (($this->modifiers & State::IS_ABSTRACT) === State::IS_ABSTRACT); - } - - /** - * Returns <b>true</b> if this node is marked as public, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isPublic() - { - return (($this->modifiers & State::IS_PUBLIC) === State::IS_PUBLIC); - } - - /** - * Returns <b>true</b> if this node is marked as protected, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isProtected() - { - return (($this->modifiers & State::IS_PROTECTED) === State::IS_PROTECTED); - } - - /** - * Returns <b>true</b> if this node is marked as private, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isPrivate() - { - return (($this->modifiers & State::IS_PRIVATE) === State::IS_PRIVATE); - } - - /** - * Returns <b>true</b> when this node is declared as static, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isStatic() - { - return (($this->modifiers & State::IS_STATIC) === State::IS_STATIC); - } - - /** - * Returns <b>true</b> when this node is declared as final, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isFinal() - { - return (($this->modifiers & State::IS_FINAL) === State::IS_FINAL); - } - - /** - * Returns the parent type object or <b>null</b> - * - * @return \PDepend\Source\AST\AbstractASTType|null - */ - public function getParent() - { - return $this->parent; - } - - /** - * Sets the parent type object. - * - * @param \PDepend\Source\AST\AbstractASTType $parent - * @return void - */ - public function setParent(AbstractASTType $parent = null) - { - $this->parent = $parent; - } - - /** - * Returns the source file where this method was declared. - * - * @return \PDepend\Source\AST\ASTCompilationUnit - * @throws \PDepend\Source\AST\ASTCompilationUnitNotFoundException When no parent was set. - * @since 0.10.0 - */ - public function getCompilationUnit() - { - if ($this->parent === null) { - throw new ASTCompilationUnitNotFoundException($this); - } - - return $this->parent->getCompilationUnit(); - } - - /** - * ASTVisitor method for node tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @return void - */ - public function accept(ASTVisitor $visitor) - { - $visitor->visitMethod($this); - } - - /** - * The magic sleep method will be called by the PHP engine when this class - * gets serialized. It returns an array with those properties that should be - * cached for method instances. - * - * @return array<string> - * @since 0.10.0 - */ - public function __sleep() - { - return array_merge(array('modifiers'), parent::__sleep()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMethodPostfix.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMethodPostfix.php deleted file mode 100644 index 538edd8..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTMethodPostfix.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a method postfix expression.. - * - * <code> - * // --------- - * Foo::bar($baz); - * // --------- - * - * // ---------- - * Foo::$bar($baz); - * // ---------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTMethodPostfix extends ASTInvocation -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitMethodPostfix($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTNamespace.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTNamespace.php deleted file mode 100644 index 1a6d5f5..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTNamespace.php +++ /dev/null @@ -1,322 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * Represents a php namespace node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTNamespace extends AbstractASTArtifact -{ - /** - * The unique identifier for this function. - * - * @var string - */ - protected $id = null; - - /** - * List of all {@link \PDepend\Source\AST\AbstractASTClassOrInterface} - * objects for this namespace. - * - * @var \PDepend\Source\AST\AbstractASTClassOrInterface[] - */ - protected $types = array(); - - /** - * List of all standalone {@link \PDepend\Source\AST\ASTFunction} objects - * in this namespace. - * - * @var \PDepend\Source\AST\ASTFunction[] - */ - protected $functions = array(); - - /** - * Does this namespace contain user defined functions, classes or interfaces? - * - * @var boolean - */ - private $userDefined = null; - - /** - * @var boolean - */ - protected $packageAnnotation = false; - - /** - * Constructs a new namespace for the given <b>$name</b> - * - * @param string $name - */ - public function __construct($name) - { - parent::__construct($name); - $this->id = spl_object_hash($this); - } - - /** - * Returns a id for this code node. - * - * @return string - */ - public function getId() - { - return $this->id; - } - - /** - * Returns <b>true</b> when at least one artifact <b>function</b> or a - * <b>class/method</b> is user defined. Otherwise this method will return - * <b>false</b>. - * - * @return boolean - * @since 0.9.10 - */ - public function isUserDefined() - { - if ($this->userDefined === null) { - $this->userDefined = $this->checkUserDefined(); - } - return $this->userDefined; - } - - /** - * Returns <b>true</b> when at least one artifact <b>function</b> or a - * <b>class/method</b> is user defined. Otherwise this method will return - * <b>false</b>. - * - * @return boolean - * @since 0.9.10 - */ - private function checkUserDefined() - { - foreach ($this->types as $type) { - if ($type->isUserDefined()) { - return true; - } - } - return (count($this->functions) > 0); - } - - /** - * Returns an array with all {@link \PDepend\Source\AST\ASTTrait} - * instances declared in this namespace. - * - * @return \PDepend\Source\AST\ASTArtifactList - * @since 1.0.0 - */ - public function getTraits() - { - return $this->getTypesOfType('PDepend\\Source\\AST\\ASTTrait'); - } - - /** - * Returns an iterator with all {@link \PDepend\Source\AST\ASTClass} - * instances within this namespace. - * - * @return \PDepend\Source\AST\ASTClass[] - */ - public function getClasses() - { - return $this->getTypesOfType('PDepend\\Source\\AST\\ASTClass'); - } - - /** - * Returns an iterator with all {@link \PDepend\Source\AST\ASTInterface} - * instances within this namespace. - * - * @return \PDepend\Source\AST\ASTInterface[] - */ - public function getInterfaces() - { - return $this->getTypesOfType('PDepend\\Source\\AST\\ASTInterface'); - } - - /** - * Returns an iterator with all types of the given <b>$className</b> in this - * namespace. - * - * @param string $className The class/type we are looking for. - * @return \PDepend\Source\AST\ASTArtifactList - * @since 1.0.0 - */ - private function getTypesOfType($className) - { - $types = array(); - foreach ($this->types as $type) { - if (get_class($type) === $className) { - $types[] = $type; - } - } - return new ASTArtifactList($types); - } - - /** - * Returns all {@link \PDepend\Source\AST\AbstractASTType} objects in - * this namespace. - * - * @return \PDepend\Source\AST\AbstractASTType[] - */ - public function getTypes() - { - return new ASTArtifactList($this->types); - } - - /** - * Adds the given type to this namespace and returns the input type instance. - * - * @param \PDepend\Source\AST\AbstractASTType $type - * @return \PDepend\Source\AST\AbstractASTType - */ - public function addType(AbstractASTType $type) - { - // Skip if this namespace already contains this type - if (in_array($type, $this->types, true)) { - return $type; - } - - if ($type->getNamespace() !== null) { - $type->getNamespace()->removeType($type); - } - - // Set this as class namespace - $type->setNamespace($this); - // Append class to internal list - $this->types[$type->getId()] = $type; - - return $type; - } - - /** - * Removes the given type instance from this namespace. - * - * @param \PDepend\Source\AST\AbstractASTType $type - * @return void - */ - public function removeType(AbstractASTType $type) - { - if (($index = array_search($type, $this->types, true)) !== false) { - // Remove class from internal list - unset($this->types[$index]); - // Remove this as parent - $type->unsetNamespace(); - } - } - - /** - * Returns all {@link \PDepend\Source\AST\ASTFunction} objects in this - * namespace. - * - * @return \PDepend\Source\AST\ASTFunction[] - */ - public function getFunctions() - { - return new ASTArtifactList($this->functions); - } - - /** - * Adds the given function to this namespace and returns the input instance. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return \PDepend\Source\AST\ASTFunction - */ - public function addFunction(ASTFunction $function) - { - if ($function->getNamespace() !== null) { - $function->getNamespace()->removeFunction($function); - } - - $function->setNamespace($this); - // Append function to internal list - $this->functions[$function->getId()] = $function; - - return $function; - } - - /** - * Removes the given function from this namespace. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function removeFunction(ASTFunction $function) - { - if (($index = array_search($function, $this->functions, true)) !== false) { - // Remove function from internal list - unset($this->functions[$index]); - // Remove this as parent - $function->unsetNamespace(); - } - } - - /** - * @return boolean - */ - public function isPackageAnnotation() - { - return $this->packageAnnotation; - } - - /** - * @param boolean $packageAnnotation - */ - public function setPackageAnnotation($packageAnnotation) - { - $this->packageAnnotation = $packageAnnotation; - } - - /** - * ASTVisitor method for node tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @return void - */ - public function accept(ASTVisitor $visitor) - { - $visitor->visitNamespace($this); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTNode.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTNode.php deleted file mode 100644 index 65c5fb7..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTNode.php +++ /dev/null @@ -1,182 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This is an abstract base implementation of the ast node interface. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ -interface ASTNode -{ - /** - * Returns the source image of this ast node. - * - * @return string - */ - public function getImage(); - - /** - * Returns the start line for this ast node. - * - * @return integer - */ - public function getStartLine(); - - /** - * Returns the start column for this ast node. - * - * @return integer - */ - public function getStartColumn(); - - /** - * Returns the end line for this ast node. - * - * @return integer - */ - public function getEndLine(); - - /** - * Returns the end column for this ast node. - * - * @return integer - */ - public function getEndColumn(); - - /** - * Returns the node instance for the given index or throws an exception. - * - * @param integer $index - * @return \PDepend\Source\AST\ASTNode - * @throws \OutOfBoundsException When no node exists at the given index. - */ - public function getChild($index); - - /** - * This method returns all direct children of the actual node. - * - * @return \PDepend\Source\AST\ASTNode[] - */ - public function getChildren(); - - /** - * This method will search recursive for the first child node that is an - * instance of the given <b>$targetType</b>. The returned value will be - * <b>null</b> if no child exists for that. - * - * @param string $targetType - * @return \PDepend\Source\AST\ASTNode - */ - public function getFirstChildOfType($targetType); - - /** - * This method will search recursive for all child nodes that are an - * instance of the given <b>$targetType</b>. The returned value will be - * an empty <b>array</b> if no child exists for that. - * - * @param string $targetType Searched class or interface type. - * @param array $results Already found node instances. This parameter - * is only for internal usage. - * @return \PDepend\Source\AST\ASTNode[] - */ - public function findChildrenOfType($targetType, array &$results = array()); - - /** - * Returns the parent node of this node or <b>null</b> when this node is - * the root of a node tree. - * - * @return \PDepend\Source\AST\ASTNode - */ - public function getParent(); - - /** - * Sets the parent node of this node. - * - * @param \PDepend\Source\AST\ASTNode $node - * @return void - */ - public function setParent(ASTNode $node); - - /** - * Traverses up the node tree and finds all parent nodes that are instances - * of <b>$parentType</b>. - * - * @param string $parentType - * @return \PDepend\Source\AST\ASTNode[] - */ - public function getParentsOfType($parentType); - - /** - * Returns a doc comment for this node or <b>null</b> when no comment was - * found. - * - * @return string - */ - public function getComment(); - - /** - * Sets the raw doc comment for this node. - * - * @param string $comment The doc comment block for this node. - * - * @return void - */ - public function setComment($comment); - - /** - * For better performance we have moved the single setter methods for the - * node columns and lines into this configure method. - * - * @param integer $startLine - * @param integer $endLine - * @param integer $startColumn - * @param integer $endColumn - * @return void - * @since 0.9.10 - */ - public function configureLinesAndColumns($startLine, $endLine, $startColumn, $endColumn); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTParameter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTParameter.php deleted file mode 100644 index e7fdb46..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTParameter.php +++ /dev/null @@ -1,393 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * An instance of this class represents a function or method parameter within - * the analyzed source code. - * - * <code> - * <?php - * class Builder - * { - * public function buildNode($name, $line, \PDepend\Source\AST\ASTCompilationUnit $unit) { - * } - * } - * - * function parse(Builder $builder, $file) { - * } - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTParameter extends AbstractASTArtifact -{ - /** - * The parent function or method instance. - * - * @var \PDepend\Source\AST\AbstractASTCallable - */ - private $declaringFunction = null; - - /** - * The parameter position. - * - * @var integer - */ - private $position = 0; - - /** - * Is this parameter optional or mandatory? - * - * @var boolean - */ - private $optional = false; - - /** - * The wrapped formal parameter instance. - * - * @var ASTFormalParameter - */ - private $formalParameter = null; - - /** - * The wrapped variable declarator instance. - * - * @var \PDepend\Source\AST\ASTVariableDeclarator - */ - private $variableDeclarator = null; - - /** - * Constructs a new parameter instance for the given AST node. - * - * @param ASTFormalParameter $formalParameter - */ - public function __construct(ASTFormalParameter $formalParameter) - { - $this->formalParameter = $formalParameter; - $this->variableDeclarator = $formalParameter->getFirstChildOfType( - 'PDepend\\Source\\AST\\ASTVariableDeclarator' - ); - - $this->id = spl_object_hash($this); - } - - /** - * Returns the item name. - * - * @return string - */ - public function getName() - { - return $this->variableDeclarator->getImage(); - } - - /** - * Returns the line number where the item declaration can be found. - * - * @return integer - */ - public function getStartLine() - { - return $this->formalParameter->getStartLine(); - } - - /** - * Returns the line number where the item declaration ends. - * - * @return integer The last source line for this item. - */ - public function getEndLine() - { - return $this->formalParameter->getEndLine(); - } - - /** - * Returns the parent function or method instance or <b>null</b> - * - * @return \PDepend\Source\AST\AbstractASTCallable - * @since 0.9.5 - */ - public function getDeclaringFunction() - { - return $this->declaringFunction; - } - - /** - * Sets the parent function or method object. - * - * @param \PDepend\Source\AST\AbstractASTCallable $function - * @return void - * @since 0.9.5 - */ - public function setDeclaringFunction(AbstractASTCallable $function) - { - $this->declaringFunction = $function; - } - - /** - * This method will return the class where the parent method was declared. - * The returned value will be <b>null</b> if the parent is a function. - * - * @return \PDepend\Source\AST\AbstractASTClassOrInterface|null - * @since 0.9.5 - */ - public function getDeclaringClass() - { - // TODO: Review this for refactoring, maybe create a empty getParent()? - if ($this->declaringFunction instanceof ASTMethod) { - return $this->declaringFunction->getParent(); - } - return null; - } - - /** - * Returns the parameter position in the method/function signature. - * - * @return integer - */ - public function getPosition() - { - return $this->position; - } - - /** - * Sets the parameter position in the method/function signature. - * - * @param integer $position The parameter position. - * - * @return void - */ - public function setPosition($position) - { - $this->position = $position; - } - - /** - * Returns the class type of this parameter. This method will return - * <b>null</b> for all scalar type, only classes or interfaces are used. - * - * @return \PDepend\Source\AST\AbstractASTClassOrInterface|null - * @since 0.9.5 - */ - public function getClass() - { - $classReference = $this->formalParameter->getFirstChildOfType( - 'PDepend\\Source\\AST\\ASTClassOrInterfaceReference' - ); - if ($classReference === null) { - return null; - } - return $classReference->getType(); - } - - /** - * This method will return <b>true</b> when the parameter is passed by - * reference. - * - * @return boolean - * @since 0.9.5 - */ - public function isPassedByReference() - { - return $this->formalParameter->isPassedByReference(); - } - - /** - * This method will return <b>true</b> when the parameter was declared with - * the array type hint, otherwise the it will return <b>false</b>. - * - * @return boolean - * @since 0.9.5 - */ - public function isArray() - { - $node = $this->formalParameter->getChild(0); - return ($node instanceof \PDepend\Source\AST\ASTTypeArray); - } - - /** - * This method will return <b>true</b> when current parameter is a simple - * scalar or it is an <b>array</b> or type explicit declared with a default - * value <b>null</b>. - * - * @return boolean - * @since 0.9.5 - */ - public function allowsNull() - { - return ( - ( - $this->isArray() === false - && $this->getClass() === null - ) || ( - $this->isDefaultValueAvailable() === true - && $this->getDefaultValue() === null - ) - ); - } - - /** - * This method will return <b>true</b> when this parameter is optional and - * can be left blank on invocation. - * - * @return boolean - * @since 0.9.5 - */ - public function isOptional() - { - return $this->optional; - } - - /** - * This method can be used to mark a parameter optional. Note that a - * parameter is only optional when it has a default value an no following - * parameter has no default value. - * - * @param boolean $optional Boolean flag that marks this parameter a - * optional or not. - * - * @return void - * @since 0.9.5 - */ - public function setOptional($optional) - { - $this->optional = (boolean) $optional; - } - - /** - * This method will return <b>true</b> when the parameter declaration - * contains a default value. - * - * @return boolean - * @since 0.9.5 - */ - public function isDefaultValueAvailable() - { - $value = $this->variableDeclarator->getValue(); - if ($value === null) { - return false; - } - return $value->isValueAvailable(); - } - - /** - * This method will return the declared default value for this parameter. - * Please note that this method will return <b>null</b> when no default - * value was declared, therefore you should combine calls to this method and - * {@link \PDepend\Source\AST\ASTParameter::isDefaultValueAvailable()} to - * detect a NULL-value. - * - * @return mixed - * @since 0.9.5 - */ - public function getDefaultValue() - { - $value = $this->variableDeclarator->getValue(); - - return $value === null ? null : $value->getValue(); - } - - /** - * ASTVisitor method for node tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @return void - */ - public function accept(ASTVisitor $visitor) - { - $visitor->visitParameter($this); - } - - /** - * This method returns a string representation of this parameter. - * - * @return string - */ - public function __toString() - { - $required = $this->isOptional() ? 'optional' : 'required'; - $reference = $this->isPassedByReference() ? '&' : ''; - - $typeHint = ''; - if ($this->isArray() === true) { - $typeHint = ' array'; - } elseif ($this->getClass() !== null) { - $typeHint = ' ' . $this->getClass()->getName(); - } - - $default = ''; - if ($this->isDefaultValueAvailable()) { - $default = ' = '; - - $value = $this->getDefaultValue(); - if ($value === null) { - $default .= 'NULL'; - $typeHint .= ($typeHint !== '' ? ' or NULL' : ''); - } elseif ($value === false) { - $default .= 'false'; - } elseif ($value === true) { - $default .= 'true'; - } elseif (is_array($value) === true) { - $default .= 'Array'; - } elseif (is_string($value) === true) { - $default .= "'" . $value . "'"; - } else { - $default .= $value; - } - } - - return sprintf( - 'Parameter #%d [ <%s>%s %s%s%s ]', - $this->position, - $required, - $typeHint, - $reference, - $this->getName(), - $default - ); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTParentReference.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTParentReference.php deleted file mode 100644 index 97fd699..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTParentReference.php +++ /dev/null @@ -1,130 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This is a special reference container that is used whenever the keyword - * <b>parent</b> is used to reference a class or interface. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -final class ASTParentReference extends ASTClassOrInterfaceReference -{ - /** - * The source image of this node. - */ - const IMAGE = 'parent'; - - /** - * The wrapped reference node. - * - * @var \PDepend\Source\AST\ASTClassOrInterfaceReference - */ - protected $reference = null; - - /** - * Constructs a new type holder instance. - * - * @param \PDepend\Source\AST\ASTClassOrInterfaceReference $reference The type - * instance that reference the concrete target of self. - * - * @todo Call parent constructor, otherwise this could cause bad side effects. - */ - public function __construct(ASTClassOrInterfaceReference $reference) - { - $this->reference = $reference; - } - - /** - * Returns the visual representation for this node type. - * - * @return string - * @since 0.10.4 - */ - public function getImage() - { - return self::IMAGE; - } - - /** - * Returns the concrete type instance associated with with this placeholder. - * - * @return \PDepend\Source\AST\AbstractASTClassOrInterface - */ - public function getType() - { - return $this->reference->getType(); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitParentReference($this, $data); - } - - /** - * The magic sleep method will be called by PHP's runtime environment right - * before an instance of this class gets serialized. It should return an - * array with those property names that should be serialized for this class. - * - * @return array<string> - * @since 0.10.0 - */ - public function __sleep() - { - return array_merge(array('reference'), parent::__sleep()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPostfixExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPostfixExpression.php deleted file mode 100644 index d5ad677..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPostfixExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a postfix-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -class ASTPostfixExpression extends ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitPostfixExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPreDecrementExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPreDecrementExpression.php deleted file mode 100644 index 20fa7ce..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPreDecrementExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a pre-decrement-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -class ASTPreDecrementExpression extends ASTUnaryExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitPreDecrementExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPreIncrementExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPreIncrementExpression.php deleted file mode 100644 index c4bcc1a..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPreIncrementExpression.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a pre-increment-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -class ASTPreIncrementExpression extends ASTUnaryExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitPreIncrementExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPrintExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPrintExpression.php deleted file mode 100644 index 423e8bf..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPrintExpression.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This class represents a print node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ -class ASTPrintExpression extends ASTExpression -{ - /** - * ASTPrintExpression constructor. - */ - public function __construct() - { - parent::__construct('print'); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitPrintExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTProperty.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTProperty.php deleted file mode 100644 index da7394e..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTProperty.php +++ /dev/null @@ -1,366 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This code class represents a class property. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTProperty extends AbstractASTArtifact -{ - /** - * The parent type object. - * - * @var ASTClass - */ - private $declaringClass = null; - - /** - * The wrapped field declaration instance. - * - * @var \PDepend\Source\AST\ASTFieldDeclaration - * @since 0.9.6 - */ - private $fieldDeclaration = null; - - /** - * The wrapped variable declarator instance. - * - * @var \PDepend\Source\AST\ASTVariableDeclarator - * @since 0.9.6 - */ - private $variableDeclarator = null; - - /** - * Constructs a new item for the given field declaration and variable - * declarator. - * - * @param \PDepend\Source\AST\ASTFieldDeclaration $fieldDeclaration The context - * field declaration where this property was declared in the source. - * @param \PDepend\Source\AST\ASTVariableDeclarator $variableDeclarator The context - * variable declarator for this property instance. - */ - public function __construct( - \PDepend\Source\AST\ASTFieldDeclaration $fieldDeclaration, - \PDepend\Source\AST\ASTVariableDeclarator $variableDeclarator - ) { - $this->fieldDeclaration = $fieldDeclaration; - $this->variableDeclarator = $variableDeclarator; - - $this->id = spl_object_hash($this); - } - - /** - * Returns the item name. - * - * @return string - */ - public function getName() - { - return $this->variableDeclarator->getImage(); - } - - /** - * This method returns a OR combined integer of the declared modifiers for - * this property. - * - * @return integer - * @since 0.9.6 - */ - public function getModifiers() - { - return $this->fieldDeclaration->getModifiers(); - } - - /** - * Returns <b>true</b> if this node is marked as public, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isPublic() - { - return $this->fieldDeclaration->isPublic(); - } - - /** - * Returns <b>true</b> if this node is marked as protected, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isProtected() - { - return $this->fieldDeclaration->isProtected(); - } - - /** - * Returns <b>true</b> if this node is marked as private, otherwise the - * returned value will be <b>false</b>. - * - * @return boolean - */ - public function isPrivate() - { - return $this->fieldDeclaration->isPrivate(); - } - - /** - * Returns <b>true</b> when this node is declared as static, otherwise - * the returned value will be <b>false</b>. - * - * @return boolean - */ - public function isStatic() - { - return $this->fieldDeclaration->isStatic(); - } - - /** - * This method will return <b>true</b> when this property doc comment - * contains an array type hint, otherwise the it will return <b>false</b>. - * - * @return boolean - * @since 0.9.6 - */ - public function isArray() - { - $typeNode = $this->fieldDeclaration->getFirstChildOfType( - 'PDepend\\Source\\AST\\ASTType' - ); - if ($typeNode === null) { - return false; - } - return $typeNode->isArray(); - } - - /** - * This method will return <b>true</b> when this property doc comment - * contains a primitive type hint, otherwise the it will return <b>false</b>. - * - * @return boolean - * @since 0.9.6 - */ - public function isScalar() - { - $typeNode = $this->fieldDeclaration->getFirstChildOfType( - 'PDepend\\Source\\AST\\ASTType' - ); - if ($typeNode === null) { - return false; - } - return $typeNode->isScalar(); - } - - /** - * Returns the type of this property. This method will return <b>null</b> - * for all scalar type, only class properties will have a type. - * - * @return \PDepend\Source\AST\AbstractASTClassOrInterface|null - * @since 0.9.5 - */ - public function getClass() - { - $reference = $this->fieldDeclaration->getFirstChildOfType( - 'PDepend\\Source\\AST\\ASTClassOrInterfaceReference' - ); - if ($reference === null) { - return null; - } - return $reference->getType(); - } - - /** - * Returns the doc comment for this item or <b>null</b>. - * - * @return string - */ - public function getComment() - { - return $this->fieldDeclaration->getComment(); - } - - /** - * Returns the line number where the property declaration can be found. - * - * @return integer - * @since 0.9.6 - */ - public function getStartLine() - { - return $this->variableDeclarator->getStartLine(); - } - - /** - * Returns the column number where the property declaration starts. - * - * @return integer - * @since 0.9.8 - */ - public function getStartColumn() - { - return $this->variableDeclarator->getStartColumn(); - } - - /** - * Returns the line number where the property declaration ends. - * - * @return integer - * @since 0.9.6 - */ - public function getEndLine() - { - return $this->variableDeclarator->getEndLine(); - } - - /** - * Returns the column number where the property declaration ends. - * - * @return integer - * @since 0.9.8 - */ - public function getEndColumn() - { - return $this->variableDeclarator->getEndColumn(); - } - - /** - * This method will return the class where this property was declared. - * - * @return \PDepend\Source\AST\AbstractASTClassOrInterface - * @since 0.9.6 - */ - public function getDeclaringClass() - { - return $this->declaringClass; - } - - /** - * Sets the declaring class object. - * - * @param \PDepend\Source\AST\ASTClass $declaringClass - * @return void - * @since 0.9.6 - */ - public function setDeclaringClass(ASTClass $declaringClass) - { - $this->declaringClass = $declaringClass; - } - - /** - * This method will return <b>true</b> when the parameter declaration - * contains a default value. - * - * @return boolean - * @since 0.9.6 - */ - public function isDefaultValueAvailable() - { - $value = $this->variableDeclarator->getValue(); - if ($value === null) { - return false; - } - return $value->isValueAvailable(); - } - - /** - * This method will return the default value for this property instance or - * <b>null</b> when this property was only declared and not initialized. - * - * @return mixed - * @since 0.9.6 - */ - public function getDefaultValue() - { - $value = $this->variableDeclarator->getValue(); - if ($value === null) { - return null; - } - return $value->getValue(); - } - - /** - * ASTVisitor method for node tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @return void - */ - public function accept(ASTVisitor $visitor) - { - $visitor->visitProperty($this); - } - - /** - * This method returns a string representation of this parameter. - * - * @return string - * @since 0.9.6 - */ - public function __toString() - { - $static = ''; - - if ($this->isStatic() === true) { - $static = ' static'; - } - - $visibility = ' public'; - if ($this->isProtected() === true) { - $visibility = ' protected'; - } elseif ($this->isPrivate() === true) { - $visibility = ' private'; - } - - return sprintf( - 'Property [%s%s %s ]%s', - $visibility, - $static, - $this->getName(), - PHP_EOL - ); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPropertyPostfix.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPropertyPostfix.php deleted file mode 100644 index 703e82f..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTPropertyPostfix.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a property postfix expression.. - * - * <code> - * // ---- - * Foo::$bar; - * // ---- - * - * // ----- - * Foo::$$bar; - * // ----- - * - * // --- - * $foo->bar; - * // --- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTPropertyPostfix extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitPropertyPostfix($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTRequireExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTRequireExpression.php deleted file mode 100644 index 847ae3d..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTRequireExpression.php +++ /dev/null @@ -1,108 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a <b>require</b>- or <b>require_once</b>-expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTRequireExpression extends ASTExpression -{ - /** - * Does this node represent a <b>require_once</b>-expression? - * - * @var boolean - */ - protected $once = false; - - /** - * Does this node represent a <b>require_once</b>-expression? - * - * @return boolean - */ - public function isOnce() - { - return $this->once; - } - - /** - * Flags this node as a <b>require_once</b>-expression. - * - * @return void - */ - public function setOnce() - { - $this->once = true; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitRequireExpression($this, $data); - } - - /** - * The magic sleep method will be called by PHP's runtime environment right - * before an instance of this class gets serialized. It should return an - * array with those property names that should be serialized for this class. - * - * @return array<string> - * @since 0.10.0 - */ - public function __sleep() - { - return array_merge(array('once'), parent::__sleep()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTReturnStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTReturnStatement.php deleted file mode 100644 index 973f3d6..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTReturnStatement.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a return statement node. - * - * <code> - * // ------- - * return; - * // ------- - * - * // ---------- - * return 42; - * // ---------- - * - * // --------------------------------------------- - * return $this->createValue($this->getValue()); - * // --------------------------------------------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTReturnStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitReturnStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScalarType.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScalarType.php deleted file mode 100644 index f18614f..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScalarType.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents primitive types like integer, float, boolean, string - * etc. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTScalarType extends ASTType -{ - /** - * This method will return <b>true</b> when this type is a php primitive. - * For this concrete implementation the return value will be always true. - * - * @return boolean - */ - public function isScalar() - { - return true; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitScalarType($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScope.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScope.php deleted file mode 100644 index 8734c24..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScope.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a method/function scope. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTScope extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitScope($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScopeStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScopeStatement.php deleted file mode 100644 index 393f1c4..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTScopeStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a program scope statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTScopeStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitScopeStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSelfReference.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSelfReference.php deleted file mode 100644 index 73865af..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSelfReference.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; -use PDepend\Source\Builder\BuilderContext; - -/** - * This is a special reference container that is used whenever the keyword - * <b>self</b> is used to reference a class or interface. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTSelfReference extends ASTClassOrInterfaceReference -{ - /** - * The source image of this node. - */ - const IMAGE = 'self'; - - /** - * The currently used builder context. - * - * @var \PDepend\Source\Builder\BuilderContext - * @since 0.10.0 - */ - protected $context = null; - - /** - * The full qualified class name, including the namespace or namespace name. - * - * @var string - * @since 0.10.0 - * @todo To reduce memory usage, move property into new metadata string - */ - protected $qualifiedName = null; - - /** - * Constructs a new type holder instance. - * - * @param \PDepend\Source\Builder\BuilderContext $context - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $target - */ - public function __construct(BuilderContext $context, AbstractASTClassOrInterface $target) - { - $this->context = $context; - $this->typeInstance = $target; - } - - /** - * Returns the visual representation for this node type. - * - * @return string - * @since 0.10.4 - */ - public function getImage() - { - return self::IMAGE; - } - - /** - * Returns the class or interface instance that this node instance represents. - * - * @return \PDepend\Source\AST\AbstractASTClassOrInterface - * @since 0.10.0 - */ - public function getType() - { - if ($this->typeInstance == null) { - $this->typeInstance = $this->context - ->getClassOrInterface($this->qualifiedName); - } - return $this->typeInstance; - } - - /** - * The magic sleep method will be called by PHP's runtime environment right - * before an instance of this class gets serialized. It should return an - * array with those property names that should be serialized for this class. - * - * @return array - * @since 0.10.0 - */ - public function __sleep() - { - $this->qualifiedName = $this->getType()->getNamespaceName() . '\\' . - $this->getType()->getName(); - - return array_merge(array('qualifiedName'), parent::__sleep()); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitSelfReference($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTShiftLeftExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTShiftLeftExpression.php deleted file mode 100644 index 9539360..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTShiftLeftExpression.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This node class encapsultes a shift left expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.1 - */ -class ASTShiftLeftExpression extends ASTExpression -{ - /** - * The default image for this node. - */ - const IMAGE = '<<'; - - /** - * Returns the source image of this ast node. - * - * @return string - */ - public function getImage() - { - return self::IMAGE; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitShiftLeftExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTShiftRightExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTShiftRightExpression.php deleted file mode 100644 index b341e50..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTShiftRightExpression.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This node class encapsultes a shift right expression. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.1 - */ -class ASTShiftRightExpression extends ASTExpression -{ - /** - * The default image for this node. - */ - const IMAGE = '>>'; - - /** - * Returns the source image of this ast node. - * - * @return string - */ - public function getImage() - { - return self::IMAGE; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitShiftRightExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStatement.php deleted file mode 100644 index 41a44ae..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This is node represents a single statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTStatement extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStaticReference.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStaticReference.php deleted file mode 100644 index a3b9e42..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStaticReference.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This is a special reference container that is used whenever the keyword - * <b>static</b> is used to reference a class or interface. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTStaticReference extends ASTSelfReference -{ - /** - * The source image of this node. - */ - const IMAGE = 'static'; - - /** - * Returns the visual representation for this node type. - * - * @return string - * @since 0.10.4 - */ - public function getImage() - { - return self::IMAGE; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitStaticReference($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStaticVariableDeclaration.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStaticVariableDeclaration.php deleted file mode 100644 index 8d3a9f7..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStaticVariableDeclaration.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a static variable declaration. - * - * <code> - * function foo() - * { - * // First declaration - * static $foo; - * // Second declaration - * static $bar = array(); - * // Third declaration - * static $baz = array(), - * $foobar = null, - * $barbaz; - * } - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTStaticVariableDeclaration extends ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitStaticVariableDeclaration($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTString.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTString.php deleted file mode 100644 index ebf6889..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTString.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.10 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents PHP strings that can embed various other expressions. - * - * <code> - * $string = "Manuel $Pichler <{$email}>"; - * - * // \PDepend\Source\AST\ASTString - * // |-- ASTLiteral - "Manuel ") - * // |-- ASTVariable - $Pichler - * // |-- ASTLiteral - " <" - * // |-- ASTCompoundExpression - {...} - * // | |-- ASTVariable - $email - * // |-- ASTLiteral - ">" - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.10 - */ -class ASTString extends AbstractASTNode -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitString($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStringIndexExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStringIndexExpression.php deleted file mode 100644 index 2a23db5..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTStringIndexExpression.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a <b>string index</b>-expression. - * - * <code> - * // --- - * $object->foo{2} - * // --- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTStringIndexExpression extends ASTIndexExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitStringIndexExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSwitchLabel.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSwitchLabel.php deleted file mode 100644 index 3554566..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSwitchLabel.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a switch-label. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTSwitchLabel extends AbstractASTNode -{ - /** - * Is this switch label the default label? - * - * @var boolean - */ - protected $default = false; - - /** - * Returns <b>true</b> when this node is the default label. - * - * @return boolean - */ - public function isDefault() - { - return $this->default; - } - - /** - * Flags this node instance as the default switch label. - * - * @return void - */ - public function setDefault() - { - $this->default = true; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitSwitchLabel($this, $data); - } - - /** - * The magic sleep method will be called by PHP's runtime environment right - * before an instance of this class gets serialized. It should return an - * array with those property names that should be serialized for this class. - * - * @return array<string> - * @since 0.10.0 - */ - public function __sleep() - { - return array_merge(array('default'), parent::__sleep()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSwitchStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSwitchStatement.php deleted file mode 100644 index e3d717c..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTSwitchStatement.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a switch statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ASTSwitchStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitSwitchStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTThrowStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTThrowStatement.php deleted file mode 100644 index 42339de..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTThrowStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a throw-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTThrowStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitThrowStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTrait.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTrait.php deleted file mode 100644 index eabfe16..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTrait.php +++ /dev/null @@ -1,123 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * Representation of a trait. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -class ASTTrait extends ASTClass -{ - /** - * Returns all properties for this class. - * - * @return \PDepend\Source\AST\ASTProperty[] - * @since 1.0.6 - * @todo Return properties declared by a trait. - */ - public function getProperties() - { - return array(); - } - - /** - * Returns an array with {@link \PDepend\Source\AST\ASTMethod} objects - * that are implemented or imported by this trait. - * - * @return \PDepend\Source\AST\ASTMethod[] - */ - public function getAllMethods() - { - $methods = $this->getTraitMethods(); - - foreach ($this->getMethods() as $method) { - $methods[strtolower($method->getName())] = $method; - } - - return $methods; - } - - /** - * Checks that this user type is a subtype of the given <b>$type</b> instance. - * - * @param \PDepend\Source\AST\AbstractASTType $type - * @return boolean - * @todo Should we handle trait subtypes? - */ - public function isSubtypeOf(AbstractASTType $type) - { - return false; - } - - /** - * ASTVisitor method for node tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @return void - */ - public function accept(ASTVisitor $visitor) - { - $visitor->visitTrait($this); - } - - /** - * The magic wakeup method will be called by PHP's runtime environment when - * a serialized instance of this class was unserialized. This implementation - * of the wakeup method will register this object in the the global class - * context. - * - * @return void - */ - public function __wakeup() - { - parent::__wakeup(); - - $this->context->registerTrait($this); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptation.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptation.php deleted file mode 100644 index 2374499..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptation.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a trait adaptation scope. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -class ASTTraitAdaptation extends ASTScope -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitTraitAdaptation($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptationAlias.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptationAlias.php deleted file mode 100644 index 7c4a607..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptationAlias.php +++ /dev/null @@ -1,140 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a trait adaptation alias. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -class ASTTraitAdaptationAlias extends ASTStatement -{ - /** - * The new aliased method name. - * - * @var string - */ - protected $newName; - - /** - * The new method modifier for the imported method. - * - * @var integer - */ - protected $newModifier = -1; - - /** - * Sets the new method modifier. - * - * @param integer $newModifier The new method modifier. - * - * @return void - */ - public function setNewModifier($newModifier) - { - $this->newModifier = $newModifier; - } - - /** - * Returns the new method modifier or <b>-1</b> when this alias does not - * specify a new method modifier. - * - * @return integer - */ - public function getNewModifier() - { - return $this->newModifier; - } - - /** - * Sets the new aliased method name. - * - * @param string $newName The new aliased method name. - * - * @return void - */ - public function setNewName($newName) - { - $this->newName = $newName; - } - - /** - * Returns the new aliased method name or <b>NULL</b> when this alias does - * not specify a new method name. - * - * @return string - */ - public function getNewName() - { - return $this->newName; - } - - /** - * The magic sleep method will be called by PHP's runtime environment right - * before an instance of this class gets serialized. It should return an - * array with those property names that should be serialized for this class. - * - * @return array - */ - public function __sleep() - { - return array_merge(array('newName', 'newModifier'), parent::__sleep()); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitTraitAdaptationAlias($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptationPrecedence.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptationPrecedence.php deleted file mode 100644 index babf422..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitAdaptationPrecedence.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a trait adaptation precedence. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -class ASTTraitAdaptationPrecedence extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitTraitAdaptationPrecedence($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitMethodCollisionException.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitMethodCollisionException.php deleted file mode 100644 index c73fd10..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitMethodCollisionException.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -/** - * This type of exception will be thrown when a trait related method collision - * occurred. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -class ASTTraitMethodCollisionException extends \RuntimeException -{ - /** - * Constructs a new exception instance. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @param \PDepend\Source\AST\AbstractASTType $type - */ - public function __construct(ASTMethod $method, AbstractASTType $type) - { - parent::__construct( - sprintf( - 'Trait method %s has not been applied, because there are ' . - 'collisions with other trait methods on %s\%s.', - $method->getName(), - preg_replace('(\W+)', '\\', $type->getNamespace()->getName()), - $type->getName() - ) - ); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitReference.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitReference.php deleted file mode 100644 index 5638214..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitReference.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This is a trait only version of the type reference . - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -class ASTTraitReference extends ASTClassOrInterfaceReference -{ - /** - * Returns the concrete type instance associated with with this placeholder. - * - * @return \PDepend\Source\AST\AbstractASTType - */ - public function getType() - { - if ($this->typeInstance === null) { - $this->typeInstance = $this->context->getTrait($this->getImage()); - } - return $this->typeInstance; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitTraitReference($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitUseStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitUseStatement.php deleted file mode 100644 index c5993db..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTraitUseStatement.php +++ /dev/null @@ -1,215 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * This node class represents a trait use statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -class ASTTraitUseStatement extends ASTStatement -{ - /** - * @var \PDepend\Source\AST\ASTMethod[]|null - */ - private $allMethods; - - /** - * Returns an array with all aliased or directly imported methods. - * - * @return \PDepend\Source\AST\ASTMethod[] - */ - public function getAllMethods() - { - if ($this->allMethods === null) { - $this->allMethods = array(); - - foreach ($this->nodes as $node) { - if ($node instanceof ASTTraitReference) { - $this->collectMethods($node); - } - } - } - - return $this->allMethods; - } - - /** - * This method tests if the given {@link \PDepend\Source\AST\ASTMethod} is excluded - * by precedence statement in this use statement. It will return <b>true</b> - * if the given <b>$method</b> is excluded, otherwise the return value of - * this method will be <b>false</b>. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return boolean - */ - public function hasExcludeFor(ASTMethod $method) - { - $methodName = strtolower($method->getName()); - $methodParent = $method->getParent(); - - $precedences = $this->findChildrenOfType('PDepend\\Source\\AST\\ASTTraitAdaptationPrecedence'); - - foreach ($precedences as $precedence) { - if (strtolower($precedence->getImage()) !== $methodName) { - continue; - } - - $children = $precedence->getChildren(); - - for ($i = 1, $count = count($children); $i < $count; ++$i) { - if ($methodParent === $children[$i]->getType()) { - return true; - } - } - } - - return false; - } - - /** - * Collects all directly defined methods or method aliases for the given - * {@link \PDepend\Source\AST\ASTTraitReference} - * - * @param \PDepend\Source\AST\ASTTraitReference $reference Context trait reference. - * - * @return void - */ - private function collectMethods(ASTTraitReference $reference) - { - foreach ($reference->getType()->getAllMethods() as $method) { - foreach ($this->getAliasesFor($method) as $alias) { - $this->allMethods[] = $alias; - } - } - } - - /** - * Returns an <b>array</b> with all aliases for the given method. If no - * alias exists for the given method, this method will simply return the - * an <b>array</b> with the original method. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return \PDepend\Source\AST\ASTMethod[] - */ - private function getAliasesFor(ASTMethod $method) - { - $name = strtolower($method->getName()); - - $newNames = array(); - foreach ($this->getAliases() as $alias) { - $name2 = strtolower($alias->getImage()); - if ($name2 !== $name) { - continue; - } - - $modifier = $method->getModifiers(); - if (-1 < $alias->getNewModifier()) { - $modifier &= ~( - State::IS_PUBLIC | - State::IS_PROTECTED | - State::IS_PRIVATE - ); - $modifier |= $alias->getNewModifier(); - } - - $newName = $method->getName(); - if ($alias->getNewName()) { - $newName = $alias->getNewName(); - } - - if (0 === count($alias->getChildren())) { - $newMethod = clone $method; - $newMethod->setName($newName); - $newMethod->setModifiers($modifier); - - $newNames[] = $newMethod; - continue; - } - - if ($alias->getChild(0)->getType() !== $method->getParent()) { - continue; - } - - $newMethod = clone $method; - $newMethod->setName($newName); - $newMethod->setModifiers($modifier); - - $newNames[] = $newMethod; - } - - if (count($newNames) > 0) { - return $newNames; - } - return array($method); - } - - /** - * Returns an <b>array</b> with all alias statements declared in this use - * statement. - * - * @return \PDepend\Source\AST\ASTTraitAdaptationAlias[] - */ - private function getAliases() - { - return $this->findChildrenOfType('PDepend\\Source\\AST\\ASTTraitAdaptationAlias'); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitTraitUseStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTryStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTryStatement.php deleted file mode 100644 index 9ddd93b..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTryStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This node class represents a try-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTTryStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitTryStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTType.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTType.php deleted file mode 100644 index 3716bfa..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTType.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\ASTVisitor\ASTVisitor; - -/** - * Abstract base class for a type node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTType extends AbstractASTNode -{ - /** - * This method will return <b>true</b> when the underlying type is an array. - * - * @return boolean - */ - public function isArray() - { - return false; - } - - /** - * This method will return <b>true</b> when the underlying data type is a - * php primitive. - * - * @return boolean - */ - public function isScalar() - { - return false; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor - * @param mixed $data - * @return mixed - * @since 0.9.12 - */ - public function accept(ASTVisitor $visitor, $data = null) - { - return $visitor->visitType($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeArray.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeArray.php deleted file mode 100644 index 99c7d80..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeArray.php +++ /dev/null @@ -1,94 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents an array type node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTTypeArray extends ASTType -{ - /** - * The visual image for this node type. - */ - const IMAGE = 'array'; - - /** - * @return string - */ - public function getImage() - { - return self::IMAGE; - } - - /** - * This method will return <b>true</b> when the underlying type is an array. - * For this concrete type implementation the returned value will be always - * <b>true</b>. - * - * @return boolean - */ - public function isArray() - { - return true; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitTypeArray($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeCallable.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeCallable.php deleted file mode 100644 index 2bc58c5..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeCallable.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a callable type node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -class ASTTypeCallable extends ASTType -{ - /** - * The visual image for this node type. - */ - const IMAGE = 'callable'; - - /** - * @return string - */ - public function getImage() - { - return self::IMAGE; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitTypeCallable($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeIterable.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeIterable.php deleted file mode 100644 index d159111..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTTypeIterable.php +++ /dev/null @@ -1,94 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.5.1 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents an array type node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.5.1 - */ -class ASTTypeIterable extends ASTType -{ - /** - * The visual image for this node type. - */ - const IMAGE = 'iterable'; - - /** - * @return string - */ - public function getImage() - { - return self::IMAGE; - } - - /** - * This method will return <b>true</b> when the underlying type is an array. - * For this concrete type implementation the returned value will be always - * <b>true</b>. - * - * @return boolean - */ - public function isArray() - { - return true; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitTypeIterable($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTUnaryExpression.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTUnaryExpression.php deleted file mode 100644 index 788d220..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTUnaryExpression.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.11 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents an unary expression node. - * - * <code> - * // - - * -$foo - * // - - * - * // - - * +$foo - * // - - * - * // - - * &$foo - * // - - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.11 - */ -class ASTUnaryExpression extends ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitUnaryExpression($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTUnsetStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTUnsetStatement.php deleted file mode 100644 index d2f10eb..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTUnsetStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a unset-statement node. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class ASTUnsetStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitUnsetStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTValue.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTValue.php deleted file mode 100644 index 6eb9011..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTValue.php +++ /dev/null @@ -1,107 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.5 - */ - -namespace PDepend\Source\AST; - -/** - * This class encapsulates possible default values for functions, methods, - * parameters and properties. We use a separate class because otherwise you - * cannot differentiate between no default value and a scalar <b>null</b>. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.5 - */ -class ASTValue -{ - /** - * Boolean flag that is <b>true</b> when a PHP-value was set. - * - * @var boolean - */ - private $valueAvailable = false; - - /** - * The parsed PHP-value, - * - * @var mixed - */ - private $value = null; - - /** - * This method will return the parsed PHP value. - * - * @return mixed - */ - public function getValue() - { - return $this->value; - } - - /** - * This method will set the parsed PHP-value. Please note that this method - * acts as a one-way-function, only the first call with set the value all - * following calls will be ignored. - * - * @param mixed $value The parsed PHP-value. - * - * @return void - */ - public function setValue($value) - { - if ($this->valueAvailable === false) { - $this->value = $value; - $this->valueAvailable = true; - } - } - - /** - * This method will return <b>true</b> when the PHP-value is already set. - * - * @return boolean - */ - public function isValueAvailable() - { - return $this->valueAvailable; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariable.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariable.php deleted file mode 100644 index eddbf6d..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariable.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a variable node. - * - * <code> - * // ---- - * Foo::$bar(); - * // ---- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTVariable extends ASTExpression -{ - /** - * This method will return <b>true</b> when this variable instance represents - * the <b>$this</b> scope of a class instance. - * - * @return boolean - * @since 0.10.0 - */ - public function isThis() - { - return ($this->getImage() === '$this'); - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitVariable($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariableDeclarator.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariableDeclarator.php deleted file mode 100644 index 5f6c002..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariableDeclarator.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This node type represents a variable declarator. A variable declarator always - * contains a variable name and it can optionally provide a variable default - * value. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTVariableDeclarator extends ASTExpression -{ - /** - * The initial declaration value for this node or <b>null</b>. - * - * @var \PDepend\Source\AST\ASTValue|null - */ - protected $value = null; - - /** - * Returns the initial declaration value for this node or <b>null</b> when - * no default value exists. - * - * @return \PDepend\Source\AST\ASTValue|null - */ - public function getValue() - { - return $this->value; - } - - /** - * Sets the declared default value for this variable node. - * - * @param \PDepend\Source\AST\ASTValue $value - * - * @return void - */ - public function setValue(ASTValue $value) - { - $this->value = $value; - } - - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitVariableDeclarator($this, $data); - } - - /** - * The magic sleep method will be called by PHP's runtime environment right - * before an instance of this class gets serialized. It should return an - * array with those property names that should be serialized for this class. - * - * @return array<string> - * @since 0.10.0 - */ - public function __sleep() - { - return array_merge(array('value'), parent::__sleep()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariableVariable.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariableVariable.php deleted file mode 100644 index 532c283..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTVariableVariable.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a variable variable node. - * - * <code> - * // - - * Foo::$$bar(); - * // - - * - * // -- - * Foo::$$$bar(); - * // -- - * - * // - - * Foo::$${BAR}(); - * // - - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class ASTVariableVariable extends ASTExpression -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitVariableVariable($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTWhileStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTWhileStatement.php deleted file mode 100644 index 62d6548..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTWhileStatement.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a while-statement. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.8 - */ -class ASTWhileStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitWhileStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTYieldStatement.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTYieldStatement.php deleted file mode 100644 index 65b72ce..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/ASTYieldStatement.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Source\AST; - -/** - * This class represents a yield statement node. - * - * <code> - * // ------- - * yield 24; - * // ------- - * - * // ---------- - * yield $variable; - * // ---------- - * - * // --------------------------------------------- - * yield $foo => $bar; - * // --------------------------------------------- - * </code> - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since @TODO - */ -class ASTYieldStatement extends ASTStatement -{ - /** - * Accept method of the visitor design pattern. This method will be called - * by a visitor during tree traversal. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitor $visitor The calling visitor instance. - * @param mixed $data - * - * @return mixed - * @since 0.9.12 - */ - public function accept(\PDepend\Source\ASTVisitor\ASTVisitor $visitor, $data = null) - { - return $visitor->visitYieldStatement($this, $data); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTArtifact.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTArtifact.php deleted file mode 100644 index 43b2847..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTArtifact.php +++ /dev/null @@ -1,256 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -/** - * Abstract base class for code item. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -abstract class AbstractASTArtifact implements ASTArtifact -{ - /** - * The name for this item. - * - * @var string - */ - protected $name = ''; - - /** - * The unique identifier for this function. - * - * @var string|null - */ - protected $id = null; - - /** - * The line number where the item declaration starts. - * - * @var integer - */ - protected $startLine = 0; - - /** - * The line number where the item declaration ends. - * - * @var integer - */ - protected $endLine = 0; - - /** - * The source file for this item. - * - * @var \PDepend\Source\AST\ASTCompilationUnit|null - */ - protected $compilationUnit = null; - - /** - * The comment for this type. - * - * @var string|null - */ - protected $comment = null; - - /** - * Constructs a new item for the given <b>$name</b>. - * - * @param string $name The item name. - */ - public function __construct($name) - { - $this->name = $name; - } - - /** - * Returns the source image of this ast node. - * - * @return string - */ - public function getImage() - { - return $this->name; - } - - /** - * Returns the item name. - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the item name. - * - * @param string $name The item name. - * - * @return void - * @since 1.0.0 - */ - public function setName($name) - { - $this->name = $name; - } - - - - /** - * Returns a id for this code node. - * - * @return string - */ - public function getId() - { - if ($this->id === null) { - $this->id = md5(uniqid('', true)); - } - return $this->id; - } - - /** - * Sets the unique identifier for this node instance. - * - * @param string $id Identifier for this node. - * @return void - * @since 0.9.12 - */ - public function setId($id) - { - $this->id = $id; - } - - /** - * Returns the source file for this item. - * - * @return \PDepend\Source\AST\ASTCompilationUnit|null - */ - public function getCompilationUnit() - { - return $this->compilationUnit; - } - - /** - * Sets the source file for this item. - * - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit - * @return void - */ - public function setCompilationUnit(ASTCompilationUnit $compilationUnit) - { - if ($this->compilationUnit === null || $this->compilationUnit->getName() === null) { - $this->compilationUnit = $compilationUnit; - } - } - - /** - * Returns a doc comment for this node or <b>null</b> when no comment was - * found. - * - * @return string - */ - public function getComment() - { - return $this->comment; - } - - /** - * Sets the raw doc comment for this node. - * - * @param string $comment - * @return void - */ - public function setComment($comment) - { - $this->comment = $comment; - } - - /** - * Returns the line number where the class or interface declaration starts. - * - * @return integer - */ - public function getStartLine() - { - return $this->startLine; - } - - /** - * Returns the line number where the class or interface declaration ends. - * - * @return integer - */ - public function getEndLine() - { - return $this->endLine; - } - - // BEGIN@deprecated - - /** - * Returns the doc comment for this item or <b>null</b>. - * - * @return string - * @deprecated Use getComment() inherit from ASTNode instead. - */ - public function getDocComment() - { - return $this->getComment(); - } - - /** - * Sets the doc comment for this item. - * - * @param string $docComment - * @return void - * @deprecated Use setComment() inherit from ASTNode instead. - */ - public function setDocComment($docComment) - { - $this->setComment($docComment); - } - - // END@deprecated -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTCallable.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTCallable.php deleted file mode 100644 index f4dfe58..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTCallable.php +++ /dev/null @@ -1,523 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Util\Cache\CacheDriver; - -/** - * Abstract base class for callable objects. - * - * Callable objects is a generic parent for methods and functions. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -abstract class AbstractASTCallable extends AbstractASTArtifact implements ASTCallable -{ - /** - * The internal used cache instance. - * - * @var \PDepend\Util\Cache\CacheDriver|null - * @since 0.10.0 - */ - protected $cache = null; - - /** - * A reference instance for the return value of this callable. By - * default and for any scalar type this property is <b>null</b>. - * - * @var \PDepend\Source\AST\ASTClassOrInterfaceReference|null - * @since 0.9.5 - */ - protected $returnClassReference = null; - - /** - * List of all exceptions classes referenced by this callable. - * - * @var \PDepend\Source\AST\ASTClassOrInterfaceReference[] - * @since 0.9.5 - */ - protected $exceptionClassReferences = array(); - - /** - * Does this callable return a value by reference? - * - * @var boolean - */ - protected $returnsReference = false; - - /** - * List of all parsed child nodes. - * - * @var \PDepend\Source\AST\ASTNode[] - * @since 0.9.6 - */ - protected $nodes = array(); - - /** - * The start line number of the method or function declaration. - * - * @var integer - * @since 0.9.12 - */ - protected $startLine = 0; - - /** - * The end line number of the method or function declaration. - * - * @var integer - * @since 0.9.12 - */ - protected $endLine = 0; - - /** - * List of method/function parameters. - * - * @var \PDepend\Source\AST\ASTParameter[]|null - */ - private $parameters = null; - - /** - * Setter method for the currently used token cache, where this callable - * instance can store the associated tokens. - * - * @param \PDepend\Util\Cache\CacheDriver $cache - * @return \PDepend\Source\AST\AbstractASTCallable - * @since 0.10.0 - */ - public function setCache(CacheDriver $cache) - { - $this->cache = $cache; - return $this; - } - - /** - * Adds a parsed child node to this node. - * - * @param \PDepend\Source\AST\ASTNode $node A parsed child node instance. - * - * @return void - * @access private - * @since 0.9.6 - */ - public function addChild(ASTNode $node) - { - $this->nodes[] = $node; - } - - /** - * Returns all child nodes of this method. - * - * @return \PDepend\Source\AST\ASTNode[] - * @since 0.9.8 - */ - public function getChildren() - { - return $this->nodes; - } - - /** - * This method will search recursive for the first child node that is an - * instance of the given <b>$targetType</b>. The returned value will be - * <b>null</b> if no child exists for that. - * - * @param string $targetType Searched class or interface type. - * - * @return \PDepend\Source\AST\ASTNode|null - * @access private - * @since 0.9.6 - */ - public function getFirstChildOfType($targetType) - { - foreach ($this->nodes as $node) { - if ($node instanceof $targetType) { - return $node; - } - if (($child = $node->getFirstChildOfType($targetType)) !== null) { - return $child; - } - } - return null; - } - - /** - * Will find all children for the given type. - * - * @param string $targetType The target class or interface type. - * @param array $results The found children. - * - * @return \PDepend\Source\AST\ASTNode[] - * @access private - * @since 0.9.6 - */ - public function findChildrenOfType($targetType, array &$results = array()) - { - foreach ($this->nodes as $node) { - if ($node instanceof $targetType) { - $results[] = $node; - } - $node->findChildrenOfType($targetType, $results); - } - return $results; - } - - /** - * Returns the tokens found in the function body. - * - * @return array<mixed> - */ - public function getTokens() - { - return (array) $this->cache - ->type('tokens') - ->restore($this->id); - } - - /** - * Sets the tokens found in the function body. - * - * @param \PDepend\Source\Tokenizer\Token[] $tokens The body tokens. - * - * @return void - */ - public function setTokens(array $tokens) - { - $this->startLine = reset($tokens)->startLine; - $this->endLine = end($tokens)->endLine; - - $this->cache - ->type('tokens') - ->store($this->id, $tokens); - } - - /** - * Returns the line number where the callable declaration starts. - * - * @return integer - * @since 0.9.6 - */ - public function getStartLine() - { - return $this->startLine; - } - - /** - * Returns the line number where the callable declaration ends. - * - * @return integer - * @since 0.9.6 - */ - public function getEndLine() - { - return $this->endLine; - } - - /** - * Returns all {@link \PDepend\Source\AST\AbstractASTClassOrInterface} - * objects this function depends on. - * - * @return ASTClassOrInterfaceReferenceIterator - */ - public function getDependencies() - { - return new ASTClassOrInterfaceReferenceIterator( - $this->findChildrenOfType( - 'PDepend\\Source\\AST\\ASTClassOrInterfaceReference' - ) - ); - } - - /** - * This method will return a class or interface instance that represents - * the return value of this callable. The returned value will be <b>null</b> - * if there is no return value or the return value is scalat. - * - * @return \PDepend\Source\AST\AbstractASTClassOrInterface|null - * @since 0.9.5 - */ - public function getReturnClass() - { - if ($this->returnClassReference) { - return $this->returnClassReference->getType(); - } - if (($node = $this->getReturnType()) instanceof ASTClassOrInterfaceReference) { - return $node->getType(); - } - return null; - } - - /** - * Tests if this callable has a return class and return <b>true</b> if it is - * configured. - * - * @return boolean - * @since 2.2.4 - */ - public function hasReturnClass() - { - if ($this->returnClassReference) { - return true; - } - if (($node = $this->getReturnType()) instanceof ASTClassOrInterfaceReference) { - return true; - } - return false; - } - - /** - * @return \PDepend\Source\AST\ASTType|null - */ - public function getReturnType() - { - foreach ($this->nodes as $node) { - if ($node instanceof ASTType) { - return $node; - } - } - return null; - } - - /** - * This method can be used to set a reference instance for the declared - * function return type. - * - * @param \PDepend\Source\AST\ASTClassOrInterfaceReference $classReference Holder - * instance for the declared function return type. - * - * @return void - * @since 0.9.5 - */ - public function setReturnClassReference(ASTClassOrInterfaceReference $classReference) - { - $this->returnClassReference = $classReference; - } - - /** - * Adds a reference holder for a thrown exception class or interface to - * this callable. - * - * @param \PDepend\Source\AST\ASTClassOrInterfaceReference $classReference A - * reference instance for a thrown exception. - * - * @return void - * @since 0.9.5 - */ - public function addExceptionClassReference( - \PDepend\Source\AST\ASTClassOrInterfaceReference $classReference - ) { - $this->exceptionClassReferences[] = $classReference; - } - - /** - * Returns an iterator with thrown exception - * {@link \PDepend\Source\AST\AbstractASTClassOrInterface} instances. - * - * @return ASTClassOrInterfaceReferenceIterator - */ - public function getExceptionClasses() - { - return new ASTClassOrInterfaceReferenceIterator( - $this->exceptionClassReferences - ); - } - - /** - * Returns an array with all method/function parameters. - * - * @return \PDepend\Source\AST\ASTParameter[]|null - */ - public function getParameters() - { - if ($this->parameters === null) { - $this->initParameters(); - } - return $this->parameters; - } - - /** - * This method will return <b>true</b> when this method returns a value by - * reference, otherwise the return value will be <b>false</b>. - * - * @return boolean - * @since 0.9.5 - */ - public function returnsReference() - { - return $this->returnsReference; - } - - /** - * A call to this method will flag the callable instance with the returns - * reference flag, which means that the context function or method returns - * a value by reference. - * - * @return void - * @since 0.9.5 - */ - public function setReturnsReference() - { - $this->returnsReference = true; - } - - /** - * Returns an array with all declared static variables. - * - * @return array - * @since 0.9.6 - */ - public function getStaticVariables() - { - $staticVariables = array(); - - $declarations = $this->findChildrenOfType( - 'PDepend\\Source\\AST\\ASTStaticVariableDeclaration' - ); - foreach ($declarations as $declaration) { - $variables = $declaration->findChildrenOfType( - 'PDepend\\Source\\AST\\ASTVariableDeclarator' - ); - foreach ($variables as $variable) { - $image = $variable->getImage(); - $value = $variable->getValue(); - if ($value !== null) { - $value = $value->getValue(); - } - - $staticVariables[substr($image, 1)] = $value; - } - } - return $staticVariables; - } - - /** - * This method will return <b>true</b> when this callable instance was - * restored from the cache and not currently parsed. Otherwise this method - * will return <b>false</b>. - * - * @return boolean - * @since 0.10.0 - */ - public function isCached() - { - return $this->compilationUnit->isCached(); - } - - /** - * This method will initialize the <b>$_parameters</b> property. - * - * @return void - * @since 0.9.6 - */ - private function initParameters() - { - $parameters = array(); - - $formalParameters = $this->getFirstChildOfType( - 'PDepend\\Source\\AST\\ASTFormalParameters' - ); - - $formalParameters = $formalParameters->findChildrenOfType( - 'PDepend\\Source\\AST\\ASTFormalParameter' - ); - - foreach ($formalParameters as $formalParameter) { - $parameter = new ASTParameter($formalParameter); - $parameter->setDeclaringFunction($this); - $parameter->setPosition(count($parameters)); - - $parameters[] = $parameter; - } - - $optional = true; - foreach (array_reverse($parameters) as $parameter) { - if ($parameter->isDefaultValueAvailable() === false) { - $optional = false; - } - $parameter->setOptional($optional); - } - - $this->parameters = $parameters; - } - - /** - * The magic sleep method will be called by the PHP engine when this class - * gets serialized. It returns an array with those properties that should be - * cached for all callable instances. - * - * @return array - * @since 0.10.0 - */ - public function __sleep() - { - return array( - 'cache', - 'id', - 'name', - 'nodes', - 'startLine', - 'endLine', - 'comment', - 'returnsReference', - 'returnClassReference', - 'exceptionClassReferences' - ); - } - - // @codeCoverageIgnoreStart - - /** - * This method can be called by the PDepend runtime environment or a - * utilizing component to free up memory. This methods are required for - * PHP version < 5.3 where cyclic references can not be resolved - * automatically by PHP's garbage collector. - * - * @return void - * @since 0.9.12 - */ - public function free() - { - trigger_error(__METHOD__ . '() is deprecated.', E_USER_DEPRECATED); - } - - // @codeCoverageIgnoreEnd -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTClassOrInterface.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTClassOrInterface.php deleted file mode 100644 index eb1bc7c..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTClassOrInterface.php +++ /dev/null @@ -1,367 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\AST\ASTArtifactList\CollectionArtifactFilter; - -/** - * Represents an interface or a class type. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -abstract class AbstractASTClassOrInterface extends AbstractASTType -{ - /** - * The parent for this class node. - * - * @var \PDepend\Source\AST\ASTClassReference|null - * @since 0.9.5 - */ - protected $parentClassReference = null; - - /** - * List of all interfaces implemented/extended by the this type. - * - * @var \PDepend\Source\AST\ASTClassOrInterfaceReference[] - */ - protected $interfaceReferences = array(); - - /** - * An <b>array</b> with all constants defined in this class or interface. - * - * @var array<string, mixed> - */ - protected $constants = null; - - /** - * Returns the parent class or <b>null</b> if this class has no parent. - * - * @return \PDepend\Source\AST\ASTClass|null - * @throws \PDepend\Source\AST\ASTClassOrInterfaceRecursiveInheritanceException - */ - public function getParentClass() - { - // No parent? Stop here! - if ($this->parentClassReference === null) { - return null; - } - - $parentClass = $this->parentClassReference->getType(); - - if ($parentClass === $this) { - throw new ASTClassOrInterfaceRecursiveInheritanceException($this); - } - - // Check parent against global filter - $collection = CollectionArtifactFilter::getInstance(); - if ($collection->accept($parentClass) === false) { - return null; - } - - return $parentClass; - } - - /** - * Returns an array with all parents for the current class. - * - * The returned array contains class instances for each parent of this class. - * They are ordered in the reverse inheritance order. This means that the - * direct parent of this class is the first element in the returned array - * and parent of this parent the second element and so on. - * - * @return \PDepend\Source\AST\ASTClass[] - * @throws \PDepend\Source\AST\ASTClassOrInterfaceRecursiveInheritanceException - * @since 1.0.0 - */ - public function getParentClasses() - { - $parents = array(); - $parent = $this; - while (is_object($parent = $parent->getParentClass())) { - if (in_array($parent, $parents, true)) { - throw new ASTClassOrInterfaceRecursiveInheritanceException($parent); - } - $parents[] = $parent; - } - return $parents; - } - - /** - * Returns a reference onto the parent class of this class node or <b>null</b>. - * - * @return \PDepend\Source\AST\ASTClassReference|null - * @since 0.9.5 - */ - public function getParentClassReference() - { - return $this->parentClassReference; - } - - /** - * Sets a reference onto the parent class of this class node. - * - * @param \PDepend\Source\AST\ASTClassReference $classReference Reference to the - * declared parent class. - * - * @return void - * @since 0.9.5 - */ - public function setParentClassReference(ASTClassReference $classReference) - { - $this->nodes[] = $classReference; - $this->parentClassReference = $classReference; - } - - /** - * Returns a node iterator with all implemented interfaces. - * - * @return \PDepend\Source\AST\ASTInterface[] - * @since 0.9.5 - */ - public function getInterfaces() - { - $stack = $this->getParentClasses(); - array_unshift($stack, $this); - - $interfaces = array(); - - while (($top = array_pop($stack)) !== null) { - foreach ($top->interfaceReferences as $interfaceReference) { - $interface = $interfaceReference->getType(); - if (in_array($interface, $interfaces, true) === true) { - continue; - } - $interfaces[] = $interface; - $stack[] = $interface; - } - } - - return new ASTArtifactList($interfaces); - } - - /** - * Returns an array of references onto the interfaces of this class node. - * - * @return array - * @since 0.10.4 - */ - public function getInterfaceReferences() - { - return $this->interfaceReferences; - } - - /** - * Adds a interface reference node. - * - * @param \PDepend\Source\AST\ASTClassOrInterfaceReference $interfaceReference - * @return void - * @since 0.9.5 - */ - public function addInterfaceReference(ASTClassOrInterfaceReference $interfaceReference) - { - $this->nodes[] = $interfaceReference; - $this->interfaceReferences[] = $interfaceReference; - } - - /** - * Returns an <b>array</b> with all constants defined in this class or - * interface. - * - * @return array<string, mixed> - */ - public function getConstants() - { - if ($this->constants === null) { - $this->initConstants(); - } - return $this->constants; - } - - /** - * This method returns <b>true</b> when a constant for <b>$name</b> exists, - * otherwise it returns <b>false</b>. - * - * @param string $name Name of the searched constant. - * - * @return boolean - * @since 0.9.6 - */ - public function hasConstant($name) - { - if ($this->constants === null) { - $this->initConstants(); - } - return array_key_exists($name, $this->constants); - } - - /** - * This method will return the value of a constant for <b>$name</b> or it - * will return <b>false</b> when no constant for that name exists. - * - * @param string $name Name of the searched constant. - * - * @return mixed - * @since 0.9.6 - */ - public function getConstant($name) - { - if ($this->hasConstant($name) === true) { - return $this->constants[$name]; - } - return false; - } - - /** - * Returns a list of all methods provided by this type or one of its parents. - * - * @return \PDepend\Source\AST\ASTMethod[] - * @since 0.9.10 - */ - public function getAllMethods() - { - $methods = array(); - foreach ($this->getInterfaces() as $interface) { - foreach ($interface->getAllMethods() as $method) { - $methods[strtolower($method->getName())] = $method; - } - } - - if (is_object($parentClass = $this->getParentClass())) { - foreach ($parentClass->getAllMethods() as $methodName => $method) { - $methods[$methodName] = $method; - } - } - - foreach ($this->getTraitMethods() as $method) { - $methods[strtolower($method->getName())] = $method; - } - - foreach ($this->getMethods() as $method) { - $methods[strtolower($method->getName())] = $method; - } - - return $methods; - } - - /** - * Returns all {@link \PDepend\Source\AST\AbstractASTClassOrInterface} - * objects this type depends on. - * - * @return \PDepend\Source\AST\AbstractASTClassOrInterface[] - */ - public function getDependencies() - { - $references = $this->interfaceReferences; - if ($this->parentClassReference !== null) { - $references[] = $this->parentClassReference; - } - - return new ASTClassOrInterfaceReferenceIterator($references); - } - - /** - * Returns <b>true</b> if this is an abstract class or an interface. - * - * @return boolean - */ - abstract public function isAbstract(); - - /** - * Returns the declared modifiers for this type. - * - * @return integer - */ - abstract public function getModifiers(); - - /** - * This method initializes the constants defined in this class or interface. - * - * @return void - * @since 0.9.6 - */ - private function initConstants() - { - $this->constants = array(); - if (($parentClass = $this->getParentClass()) !== null) { - $this->constants = $parentClass->getConstants(); - } - - foreach ($this->getInterfaces() as $interface) { - $this->constants = array_merge( - $this->constants, - $interface->getConstants() - ); - } - - $definitions = $this->findChildrenOfType('PDepend\\Source\\AST\\ASTConstantDefinition'); - - foreach ($definitions as $definition) { - $declarators = $definition->findChildrenOfType('PDepend\\Source\\AST\\ASTConstantDeclarator'); - - foreach ($declarators as $declarator) { - $image = $declarator->getImage(); - $value = $declarator->getValue()->getValue(); - - $this->constants[$image] = $value; - } - } - } - - /** - * The magic sleep method is called by the PHP runtime environment before an - * instance of this class gets serialized. It returns an array with the - * names of all those properties that should be cached for this class or - * interface instance. - * - * @return array - * @since 0.10.0 - */ - public function __sleep() - { - return array_merge( - array('constants', 'interfaceReferences', 'parentClassReference'), - parent::__sleep() - ); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTNode.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTNode.php deleted file mode 100644 index 0768d98..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTNode.php +++ /dev/null @@ -1,471 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\AST; - -/** - * This is an abstract base implementation of the ast node interface. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -abstract class AbstractASTNode implements ASTNode -{ - /** - * Parsed child nodes of this node. - * - * @var \PDepend\Source\AST\ASTNode[] - */ - protected $nodes = array(); - - /** - * The parent node of this node or <b>null</b> when this node is the root - * of a node tree. - * - * @var \PDepend\Source\AST\ASTNode|null - */ - protected $parent = null; - - /** - * An optional doc comment for this node. - * - * @var string - */ - protected $comment = null; - - /** - * Metadata for this node instance, serialized in a string. This string - * contains the start, end line, and the start, end column and the node - * image in a colon seperated string. - * - * @var string - * @since 0.10.4 - */ - protected $metadata = '::::'; - - /** - * Constructs a new ast node instance. - * - * @param string $image The source image for this node. - */ - public function __construct($image = null) - { - $this->metadata = str_repeat(':', $this->getMetadataSize() - 1); - - $this->setImage($image); - } - - /** - * Sets the image for this ast node. - * - * @param string $image - * @return void - */ - public function setImage($image) - { - $this->setMetadata(4, $image); - } - - /** - * Returns the source image of this ast node. - * - * @return string - */ - public function getImage() - { - return $this->getMetadata(4); - } - - /** - * Returns the start line for this ast node. - * - * @return integer - */ - public function getStartLine() - { - return $this->getMetadataInteger(0); - } - - /** - * Returns the start column for this ast node. - * - * @return integer - */ - public function getStartColumn() - { - return $this->getMetadataInteger(2); - } - - /** - * Returns the end line for this ast node. - * - * @return integer - */ - public function getEndLine() - { - return $this->getMetadataInteger(1); - } - - /** - * Returns the end column for this ast node. - * - * @return integer - */ - public function getEndColumn() - { - return $this->getMetadataInteger(3); - } - - /** - * For better performance we have moved the single setter methods for the - * node columns and lines into this configure method. - * - * @param integer $startLine - * @param integer $endLine - * @param integer $startColumn - * @param integer $endColumn - * @return void - * @since 0.9.10 - */ - public function configureLinesAndColumns( - $startLine, - $endLine, - $startColumn, - $endColumn - ) { - $this->setMetadataInteger(0, $startLine); - $this->setMetadataInteger(1, $endLine); - $this->setMetadataInteger(2, $startColumn); - $this->setMetadataInteger(3, $endColumn); - } - - /** - * Returns an integer value that was stored under the given index. - * - * @param integer $index - * @return integer - * @since 0.10.4 - */ - protected function getMetadataInteger($index) - { - return (int) $this->getMetadata($index); - } - - /** - * Stores an integer value under the given index in the internally used data - * string. - * - * @param integer $index - * @param integer $value - * @return void - * @since 0.10.4 - */ - protected function setMetadataInteger($index, $value) - { - $this->setMetadata($index, $value); - } - - /** - * Returns a boolean value that was stored under the given index. - * - * @param integer $index - * @return boolean - * @since 0.10.4 - */ - protected function getMetadataBoolean($index) - { - return (bool) $this->getMetadata($index); - } - - /** - * Stores a boolean value under the given index in the internally used data - * string. - * - * @param integer $index - * @param boolean $value - * @return void - * @since 0.10.4 - */ - protected function setMetadataBoolean($index, $value) - { - $this->setMetadata($index, $value ? 1 : 0); - } - - /** - * Returns the value that was stored under the given index. - * - * @param integer $index - * @return string - * @since 0.10.4 - */ - protected function getMetadata($index) - { - $metadata = explode(':', $this->metadata, $this->getMetadataSize()); - return $metadata[$index]; - } - - /** - * Stores the given value under the given index in an internal storage - * container. - * - * @param integer $index - * @param mixed $value - * @return void - * @since 0.10.4 - */ - protected function setMetadata($index, $value) - { - $metadata = explode(':', $this->metadata, $this->getMetadataSize()); - $metadata[$index] = $value; - - $this->metadata = join(':', $metadata); - } - - /** - * Returns the total number of the used property bag. - * - * @return integer - * @since 0.10.4 - */ - protected function getMetadataSize() - { - return 5; - } - - /** - * Returns the node instance for the given index or throws an exception. - * - * @param integer $index - * @return \PDepend\Source\AST\ASTNode - * @throws \OutOfBoundsException When no node exists at the given index. - */ - public function getChild($index) - { - if (isset($this->nodes[$index])) { - return $this->nodes[$index]; - } - throw new \OutOfBoundsException( - sprintf( - 'No node found at index %d in node of type: %s', - $index, - get_class($this) - ) - ); - } - - /** - * This method returns all direct children of the actual node. - * - * @return \PDepend\Source\AST\ASTNode[] - */ - public function getChildren() - { - return $this->nodes; - } - - /** - * This method will search recursive for the first child node that is an - * instance of the given <b>$targetType</b>. The returned value will be - * <b>null</b> if no child exists for that. - * - * @param string $targetType - * @return \PDepend\Source\AST\ASTNode|null - */ - public function getFirstChildOfType($targetType) - { - foreach ($this->nodes as $node) { - if ($node instanceof $targetType) { - return $node; - } - if (($child = $node->getFirstChildOfType($targetType)) !== null) { - return $child; - } - } - return null; - } - - /** - * This method will search recursive for all child nodes that are an - * instance of the given <b>$targetType</b>. The returned value will be - * an empty <b>array</b> if no child exists for that. - * - * @param string $targetType Searched class or interface type. - * @param array $results Already found node instances. This parameter - * is only for internal usage. - * @return \PDepend\Source\AST\ASTNode[] - */ - public function findChildrenOfType($targetType, array &$results = array()) - { - foreach ($this->nodes as $node) { - if ($node instanceof $targetType) { - $results[] = $node; - } - $node->findChildrenOfType($targetType, $results); - } - return $results; - } - - /** - * This method adds a new child node at the first position of the children. - * - * @param \PDepend\Source\AST\ASTNode $node - * @return void - */ - public function prependChild(ASTNode $node) - { - array_unshift($this->nodes, $node); - $node->setParent($this); - } - - /** - * This method adds a new child node to this node instance. - * - * @param \PDepend\Source\AST\ASTNode $node - * @return void - */ - public function addChild(ASTNode $node) - { - $this->nodes[] = $node; - $node->setParent($this); - } - - /** - * Returns the parent node of this node or <b>null</b> when this node is - * the root of a node tree. - * - * @return \PDepend\Source\AST\ASTNode - */ - public function getParent() - { - return $this->parent; - } - - /** - * Traverses up the node tree and finds all parent nodes that are instances - * of <b>$parentType</b>. - * - * @param string $parentType - * @return \PDepend\Source\AST\ASTNode[] - */ - public function getParentsOfType($parentType) - { - $parents = array(); - - $parentNode = $this->parent; - while (is_object($parentNode)) { - if ($parentNode instanceof $parentType) { - array_unshift($parents, $parentNode); - } - $parentNode = $parentNode->getParent(); - } - return $parents; - } - - /** - * Sets the parent node of this node. - * - * @param \PDepend\Source\AST\ASTNode $node - * @return void - */ - public function setParent(ASTNode $node) - { - $this->parent = $node; - } - - /** - * Returns a doc comment for this node or <b>null</b> when no comment was - * found. - * - * @return string - */ - public function getComment() - { - return $this->comment; - } - - /** - * Sets the raw doc comment for this node. - * - * @param string $comment The doc comment block for this node. - * - * @return void - */ - public function setComment($comment) - { - $this->comment = $comment; - } - - /** - * The magic sleep method will be called by PHP's runtime environment right - * before an instance of this class gets serialized. It should return an - * array with those property names that should be serialized for this class. - * - * @return array - * @since 0.10.0 - */ - public function __sleep() - { - return array( - 'comment', - 'metadata', - 'nodes' - ); - } - - /** - * The magic wakeup method will be called by PHP's runtime environment when - * a previously serialized object gets unserialized. This implementation of - * the wakeup method restores the dependencies between an ast node and the - * node's children. - * - * @return void - * @since 0.10.0 - */ - public function __wakeup() - { - foreach ($this->nodes as $node) { - $node->setParent($this); - } - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTType.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTType.php deleted file mode 100644 index c852ef6..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/AbstractASTType.php +++ /dev/null @@ -1,527 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ - -namespace PDepend\Source\AST; - -use PDepend\Source\Builder\BuilderContext; -use PDepend\Source\Tokenizer\Token; -use PDepend\Util\Cache\CacheDriver; - -/** - * Represents any valid complex php type. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 1.0.0 - */ -abstract class AbstractASTType extends AbstractASTArtifact -{ - /** - * The internal used cache instance. - * - * @var \PDepend\Util\Cache\CacheDriver|null - */ - protected $cache = null; - - /** - * The currently used builder context. - * - * @var \PDepend\Source\Builder\BuilderContext|null - */ - protected $context = null; - - /** - * The parent namespace for this class. - * - * @var \PDepend\Source\AST\ASTNamespace|null - */ - private $namespace = null; - - /** - * An <b>array</b> with all constants defined in this class or interface. - * - * @var array<string, mixed>|null - */ - protected $constants = null; - - /** - * This property will indicate that the class or interface is user defined. - * The parser marks all classes and interfaces as user defined that have a - * source file and were part of parsing process. - * - * @var boolean - */ - protected $userDefined = false; - - /** - * List of all parsed child nodes. - * - * @var \PDepend\Source\AST\ASTNode[] - */ - protected $nodes = array(); - - /** - * Name of the parent namespace for this class or interface instance. Or - * <b>NULL</b> when no namespace was specified. - * - * @var string|null - */ - protected $namespaceName = null; - - /** - * The modifiers for this class instance. - * - * @var integer - */ - protected $modifiers = 0; - - /** - * Temporary property that only holds methods during the parsing process. - * - * @var ASTMethod[]|null - * @since 1.0.2 - */ - protected $methods = array(); - - - /** - * Setter method for the currently used token cache, where this class or - * interface instance can store the associated tokens. - * - * @param \PDepend\Util\Cache\CacheDriver $cache - * @return \PDepend\Source\AST\AbstractASTType - */ - public function setCache(CacheDriver $cache) - { - $this->cache = $cache; - return $this; - } - - /** - * Sets the currently active builder context. - * - * @param \PDepend\Source\Builder\BuilderContext $context - * @return \PDepend\Source\AST\AbstractASTType - */ - public function setContext(BuilderContext $context) - { - $this->context = $context; - return $this; - } - - /** - * Adds a parsed child node to this node. - * - * @param \PDepend\Source\AST\ASTNode $node - * @return void - * @access private - */ - public function addChild(ASTNode $node) - { - $this->nodes[] = $node; - } - - /** - * Returns the child at the given index. - * - * @param integer $index - * @return \PDepend\Source\AST\ASTNode - * @throws \OutOfBoundsException - */ - public function getChild($index) - { - if (isset($this->nodes[$index])) { - return $this->nodes[$index]; - } - throw new \OutOfBoundsException( - sprintf( - 'No node found at index %d in node of type: %s', - $index, - get_class($this) - ) - ); - } - - /** - * Returns all child nodes of this class. - * - * @return \PDepend\Source\AST\ASTNode[] - */ - public function getChildren() - { - return $this->nodes; - } - - /** - * This method will search recursive for the first child node that is an - * instance of the given <b>$targetType</b>. The returned value will be - * <b>null</b> if no child exists for that. - * - * @param string $targetType Searched class or interface type. - * - * @return \PDepend\Source\AST\ASTNode|null - * @access private - * @todo Refactor $_methods property to getAllMethods() when it exists. - */ - public function getFirstChildOfType($targetType) - { - foreach ($this->nodes as $node) { - if ($node instanceof $targetType) { - return $node; - } - if (($child = $node->getFirstChildOfType($targetType)) !== null) { - return $child; - } - } - $methods = $this->getMethods(); - foreach ($methods as $method) { - if (($child = $method->getFirstChildOfType($targetType)) !== null) { - return $child; - } - } - - return null; - } - - /** - * Will find all children for the given type. - * - * @param string $targetType The target class or interface type. - * @param array $results The found children. - * - * @return \PDepend\Source\AST\ASTNode[] - * @access private - * @todo Refactor $_methods property to getAllMethods() when it exists. - */ - public function findChildrenOfType($targetType, array &$results = array()) - { - foreach ($this->nodes as $node) { - if ($node instanceof $targetType) { - $results[] = $node; - } - $node->findChildrenOfType($targetType, $results); - } - - foreach ($this->getMethods() as $method) { - $method->findChildrenOfType($targetType, $results); - } - - return $results; - } - - /** - * This method will return <b>true</b> when this type has a declaration in - * the analyzed source files. - * - * @return boolean - */ - public function isUserDefined() - { - return $this->userDefined; - } - - /** - * This method can be used to mark a type as user defined. User defined - * means that the type has a valid declaration in the analyzed source files. - * - * @return void - */ - public function setUserDefined() - { - $this->userDefined = true; - } - - /** - * Returns all {@link \PDepend\Source\AST\ASTMethod} objects in this type. - * - * @return ASTArtifactList<ASTMethod> - */ - public function getMethods() - { - if (is_array($this->methods)) { - return new ASTArtifactList($this->methods); - } - - $methods = (array) $this->cache - ->type('methods') - ->restore($this->getId()); - - foreach ($methods as $method) { - $method->compilationUnit = $this->compilationUnit; - $method->setParent($this); - } - - return new ASTArtifactList($methods); - } - - /** - * Adds the given method to this type. - * - * @param ASTMethod $method - * @return ASTMethod - */ - public function addMethod(ASTMethod $method) - { - $method->setParent($this); - - $this->methods[] = $method; - - return $method; - } - - /** - * Returns an array with {@link \PDepend\Source\AST\ASTMethod} objects - * that are imported through traits. - * - * @return ASTMethod[] - * @since 1.0.0 - */ - protected function getTraitMethods() - { - $methods = array(); - - $uses = $this->findChildrenOfType( - 'PDepend\\Source\\AST\\ASTTraitUseStatement' - ); - - foreach ($uses as $use) { - $priorMethods = array(); - $precedences = $use->findChildrenOfType('PDepend\\Source\\AST\\ASTTraitAdaptationPrecedence'); - - /** @var ASTTraitAdaptationPrecedence $precedence */ - foreach ($precedences as $precedence) { - $priorMethods[strtolower($precedence->getImage())] = true; - } - /** @var ASTMethod $method */ - foreach ($use->getAllMethods() as $method) { - foreach ($uses as $use2) { - if ($use2->hasExcludeFor($method)) { - continue 2; - } - } - - $name = strtolower($method->getName()); - - if (!isset($methods[$name]) || isset($priorMethods[$name])) { - $methods[$name] = $method; - continue; - } - - if ($methods[$name]->isAbstract()) { - $methods[$name] = $method; - continue; - } - - if ($method->isAbstract()) { - continue; - } - - throw new ASTTraitMethodCollisionException($method, $this); - } - } - - return $methods; - } - - /** - * Returns an <b>array</b> with all tokens within this type. - * - * @return \PDepend\Source\Tokenizer\Token[] - */ - public function getTokens() - { - return (array) $this->cache - ->type('tokens') - ->restore($this->id); - } - - /** - * Sets the tokens for this type. - * - * @param \PDepend\Source\Tokenizer\Token[] $tokens - * @return void - */ - public function setTokens(array $tokens, Token $startToken = null) - { - if (!$startToken) { - $startToken = reset($tokens); - } - - $this->startLine = $startToken->startLine; - $this->endLine = end($tokens)->endLine; - - $this->cache - ->type('tokens') - ->store($this->id, $tokens); - } - - /** - * @return string - */ - public function getNamespacedName() - { - if (null === $this->namespace || $this->namespace->isPackageAnnotation()) { - return $this->name; - } - return sprintf('%s\\%s', $this->namespaceName, $this->name); - } - - /** - * Returns the name of the parent namespace. - * - * @return string - */ - public function getNamespaceName() - { - return $this->namespaceName; - } - - /** - * Returns the parent namespace for this class. - * - * @return \PDepend\Source\AST\ASTNamespace - */ - public function getNamespace() - { - return $this->namespace; - } - - /** - * Sets the parent namespace for this type. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function setNamespace(ASTNamespace $namespace) - { - $this->namespace = $namespace; - $this->namespaceName = $namespace->getName(); - } - - /** - * Resets the associated namespace reference. - * - * @return void - */ - public function unsetNamespace() - { - $this->namespace = null; - $this->namespaceName = null; - } - - /** - * This method will return <b>true</b> when this class or interface instance - * was restored from the cache and not currently parsed. Otherwise this - * method will return <b>false</b>. - * - * @return boolean - */ - public function isCached() - { - return $this->compilationUnit->isCached(); - } - - /** - * Returns a list of all methods provided by this type or one of its parents. - * - * @return ASTMethod[] - */ - abstract public function getAllMethods(); - - /** - * Checks that this user type is a subtype of the given <b>$type</b> - * instance. - * - * @param \PDepend\Source\AST\AbstractASTType $type - * @return boolean - * @since 1.0.6 - */ - abstract public function isSubtypeOf(AbstractASTType $type); - - /** - * The magic sleep method is called by the PHP runtime environment before an - * instance of this class gets serialized. It returns an array with the - * names of all those properties that should be cached for this class or - * interface instance. - * - * @return array - */ - public function __sleep() - { - if (is_array($this->methods)) { - $this->cache - ->type('methods') - ->store($this->id, $this->methods); - - $this->methods = null; - } - - return array( - 'cache', - 'context', - 'comment', - 'endLine', - 'modifiers', - 'name', - 'nodes', - 'namespaceName', - 'startLine', - 'userDefined', - 'id' - ); - } - - /** - * The magic wakeup method is called by the PHP runtime environment when a - * serialized instance of this class gets unserialized and all properties - * are restored. This implementation of the <b>__wakeup()</b> method sets - * a flag that this object was restored from the cache and it restores the - * dependency between this class or interface and it's child methods. - * - * @return void - */ - public function __wakeup() - { - $this->methods = null; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/State.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/State.php deleted file mode 100644 index 973a684..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/AST/State.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\AST; - -/** - * Holds constants with internal state constants - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface State -{ - /** - * Marks a class or interface as implicit abstract. - */ - const IS_IMPLICIT_ABSTRACT = \ReflectionClass::IS_IMPLICIT_ABSTRACT; - - /** - * Marks a class or interface as explicit abstract. - */ - const IS_EXPLICIT_ABSTRACT = \ReflectionClass::IS_EXPLICIT_ABSTRACT; - - /** - * Marks a node as public. - */ - const IS_PUBLIC = \ReflectionMethod::IS_PUBLIC; - - /** - * Marks a node as protected. - */ - const IS_PROTECTED = \ReflectionMethod::IS_PROTECTED; - - /** - * Marks a node as private. - */ - const IS_PRIVATE = \ReflectionMethod::IS_PRIVATE; - - /** - * Marks a node as abstract. - */ - const IS_ABSTRACT = \ReflectionMethod::IS_ABSTRACT; - - /** - * Marks a node as final. - */ - const IS_FINAL = \ReflectionMethod::IS_FINAL; - - /** - * Marks a node as static. - */ - const IS_STATIC = \ReflectionMethod::IS_STATIC; -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/ASTVisitListener.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/ASTVisitListener.php deleted file mode 100644 index 2ea66b0..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/ASTVisitListener.php +++ /dev/null @@ -1,208 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\ASTVisitor; - -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTCompilationUnit; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTNamespace; -use PDepend\Source\AST\ASTParameter; -use PDepend\Source\AST\ASTProperty; -use PDepend\Source\AST\ASTTrait; - -/** - * Base interface for a visitor listener. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface ASTVisitListener -{ - /** - * Is called when the visitor starts a new class instance. - * - * @param \PDepend\Source\AST\ASTClass $class The context class instance. - * @return void - */ - public function startVisitClass(ASTClass $class); - - /** - * Is called when the visitor ends with a class instance. - * - * @param \PDepend\Source\AST\ASTClass $class The context class instance. - * @return void - */ - public function endVisitClass(ASTClass $class); - - /** - * Is called when the visitor starts a new trait instance. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @since 1.0.0 - */ - public function startVisitTrait(ASTTrait $trait); - - /** - * Is called when the visitor ends with a trait instance. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @since 1.0.0 - */ - public function endVisitTrait(ASTTrait $trait); - - /** - * Is called when the visitor starts a new file instance. - * - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit The context file instance. - * @return void - */ - public function startVisitFile(ASTCompilationUnit $compilationUnit); - - /** - * Is called when the visitor ends with a file instance. - * - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit The context file instance. - * @return void - */ - public function endVisitFile(ASTCompilationUnit $compilationUnit); - - /** - * Is called when the visitor starts a new function instance. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function startVisitFunction(ASTFunction $function); - - /** - * Is called when the visitor ends with a function instance. - * - * @param ASTFunction $function - * @return void - */ - public function endVisitFunction(ASTFunction $function); - - /** - * Is called when the visitor starts a new interface instance. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function startVisitInterface(ASTInterface $interface); - - /** - * Is called when the visitor ends with an interface instance. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function endVisitInterface(ASTInterface $interface); - - /** - * Is called when the visitor starts a new method instance. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function startVisitMethod(ASTMethod $method); - - /** - * Is called when the visitor ends with a method instance. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function endVisitMethod(ASTMethod $method); - - /** - * Is called when the visitor starts a new namespace instance. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function startVisitNamespace(ASTNamespace $namespace); - - /** - * Is called when the visitor ends with a namespace instance. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function endVisitNamespace(ASTNamespace $namespace); - - /** - * Is called when the visitor starts a new parameter instance. - * - * @param \PDepend\Source\AST\ASTParameter $parameter - * @return void - */ - public function startVisitParameter(ASTParameter $parameter); - - /** - * Is called when the visitor ends with a parameter instance. - * - * @param \PDepend\Source\AST\ASTParameter $parameter - * @return void - */ - public function endVisitParameter(ASTParameter $parameter); - - /** - * Is called when the visitor starts a new property instance. - * - * @param \PDepend\Source\AST\ASTProperty $property - * @return void - */ - public function startVisitProperty(ASTProperty $property); - - /** - * Is called when the visitor ends with a property instance. - * - * @param \PDepend\Source\AST\ASTProperty $property - * @return void - */ - public function endVisitProperty(ASTProperty $property); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/ASTVisitor.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/ASTVisitor.php deleted file mode 100644 index ae6164b..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/ASTVisitor.php +++ /dev/null @@ -1,167 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\ASTVisitor; - -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTCompilationUnit; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTNamespace; -use PDepend\Source\AST\ASTParameter; -use PDepend\Source\AST\ASTProperty; -use PDepend\Source\AST\ASTTrait; - -/** - * Base interface for visitors that work on the generated node tree. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface ASTVisitor -{ - /** - * Adds a new listener to this node visitor. - * @param \PDepend\Source\ASTVisitor\ASTVisitListener $listener - * @return void - */ - public function addVisitListener(ASTVisitListener $listener); - - /** - * Visits a class node. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class); - - /** - * Visits a trait node. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @since 1.0.0 - */ - public function visitTrait(ASTTrait $trait); - - /** - * Visits a file node. - * - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit - * @return void - */ - public function visitCompilationUnit(ASTCompilationUnit $compilationUnit); - - /** - * Visits a function node. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function); - - /** - * Visits a code interface object. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface); - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method); - - /** - * Visits a namespace node. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function visitNamespace(ASTNamespace $namespace); - - /** - * Visits a parameter node. - * - * @param \PDepend\Source\AST\ASTParameter $parameter - * @return void - */ - public function visitParameter(ASTParameter $parameter); - - /** - * Visits a property node. - * - * @param \PDepend\Source\AST\ASTProperty $property - * @return void - */ - public function visitProperty(ASTProperty $property); - - /** - * Magic call method used to provide simplified visitor implementations. - * With this method we can call <b>visit${NodeClassName}</b> on each node. - * - * <code> - * $visitor->visitAllocationExpression($alloc); - * - * $visitor->visitStatement($stmt); - * </code> - * - * All visit methods takes two argument. The first argument is the current - * context ast node and the second argument is a data array or object that - * is used to collect data. - * - * The return value of this method is the second input argument, modified - * by the concrete visit method. - * - * @param string $method Name of the called method. - * @param array $args Array with method argument. - * - * @return mixed - * @since 0.9.12 - */ - public function __call($method, $args); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/AbstractASTVisitListener.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/AbstractASTVisitListener.php deleted file mode 100644 index 95ff338..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/AbstractASTVisitListener.php +++ /dev/null @@ -1,284 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\ASTVisitor; - -use PDepend\Source\AST\AbstractASTArtifact; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTCompilationUnit; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTNamespace; -use PDepend\Source\AST\ASTParameter; -use PDepend\Source\AST\ASTProperty; -use PDepend\Source\AST\ASTTrait; - -/** - * This abstract class provides a default implementation of the node visitor - * listener. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -abstract class AbstractASTVisitListener implements ASTVisitListener -{ - /** - * Is called when the visitor starts a new class instance. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function startVisitClass(ASTClass $class) - { - $this->startVisitNode($class); - } - - /** - * Is called when the visitor ends with a class instance. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function endVisitClass(ASTClass $class) - { - $this->endVisitNode($class); - } - - /** - * Is called when the visitor starts a new trait instance. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @since 1.0.0 - */ - public function startVisitTrait(ASTTrait $trait) - { - $this->startVisitNode($trait); - } - - /** - * Is called when the visitor ends with a trait instance. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @since 1.0.0 - */ - public function endVisitTrait(ASTTrait $trait) - { - $this->endVisitNode($trait); - } - - /** - * Is called when the visitor starts a new file instance. - * - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit - * @return void - */ - public function startVisitFile(ASTCompilationUnit $compilationUnit) - { - $this->startVisitNode($compilationUnit); - } - - /** - * Is called when the visitor ends with a file instance. - * - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit - * @return void - */ - public function endVisitFile(ASTCompilationUnit $compilationUnit) - { - $this->endVisitNode($compilationUnit); - } - - /** - * Is called when the visitor starts a new function instance. - * - * @param ASTFunction $function - * @return void - */ - public function startVisitFunction(ASTFunction $function) - { - $this->startVisitNode($function); - } - - /** - * Is called when the visitor ends with a function instance. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function endVisitFunction(ASTFunction $function) - { - $this->endVisitNode($function); - } - - /** - * Is called when the visitor starts a new interface instance. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function startVisitInterface(ASTInterface $interface) - { - $this->startVisitNode($interface); - } - - /** - * Is called when the visitor ends with an interface instance. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function endVisitInterface(ASTInterface $interface) - { - $this->endVisitNode($interface); - } - - /** - * Is called when the visitor starts a new method instance. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function startVisitMethod(ASTMethod $method) - { - $this->startVisitNode($method); - } - - /** - * Is called when the visitor ends with a method instance. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function endVisitMethod(ASTMethod $method) - { - $this->endVisitNode($method); - } - - /** - * Is called when the visitor starts a new namespace instance. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function startVisitNamespace(ASTNamespace $namespace) - { - $this->startVisitNode($namespace); - } - - /** - * Is called when the visitor ends with a namespace instance. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - public function endVisitNamespace(ASTNamespace $namespace) - { - $this->endVisitNode($namespace); - } - - /** - * Is called when the visitor starts a new parameter instance. - * - * @param \PDepend\Source\AST\ASTParameter $parameter - * @return void - */ - public function startVisitParameter(ASTParameter $parameter) - { - $this->startVisitNode($parameter); - } - - /** - * Is called when the visitor ends with a parameter instance. - * - * @param \PDepend\Source\AST\ASTParameter $parameter - * @return void - */ - public function endVisitParameter(ASTParameter $parameter) - { - $this->endVisitNode($parameter); - } - - /** - * Is called when the visitor starts a new property instance. - * - * @param \PDepend\Source\AST\ASTProperty $property - * @return void - */ - public function startVisitProperty(ASTProperty $property) - { - $this->startVisitNode($property); - } - - /** - * Is called when the visitor ends with a property instance. - * - * @param \PDepend\Source\AST\ASTProperty $property - * @return void - */ - public function endVisitProperty(ASTProperty $property) - { - $this->endVisitNode($property); - } - - /** - * Generic notification method that is called for every node start. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return void - */ - protected function startVisitNode(AbstractASTArtifact $node) - { - } - - /** - * Generic notification method that is called when the node processing ends. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return void - */ - protected function endVisitNode(AbstractASTArtifact $node) - { - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/AbstractASTVisitor.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/AbstractASTVisitor.php deleted file mode 100644 index 4fc2169..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/ASTVisitor/AbstractASTVisitor.php +++ /dev/null @@ -1,523 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\ASTVisitor; - -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTCompilationUnit; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTNamespace; -use PDepend\Source\AST\ASTParameter; -use PDepend\Source\AST\ASTProperty; -use PDepend\Source\AST\ASTTrait; - -/** - * This abstract visitor implementation provides a default traversal algorithm - * that can be used for custom visitors. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -abstract class AbstractASTVisitor implements ASTVisitor -{ - /** - * List of all registered listeners. - * - * @var \PDepend\Source\ASTVisitor\ASTVisitListener[] - */ - private $listeners = array(); - - /** - * Returns an iterator with all registered visit listeners. - * - * @return \Iterator - */ - public function getVisitListeners() - { - return new \ArrayIterator($this->listeners); - } - - /** - * Adds a new listener to this node visitor. - * - * @param \PDepend\Source\ASTVisitor\ASTVisitListener $listener - * @return void - */ - public function addVisitListener(ASTVisitListener $listener) - { - if (in_array($listener, $this->listeners, true) === false) { - $this->listeners[] = $listener; - } - } - - /** - * Visits a class node. - * - * @param ASTClass $class - * @return void - */ - public function visitClass(ASTClass $class) - { - $this->fireStartClass($class); - - $class->getCompilationUnit()->accept($this); - - foreach ($class->getProperties() as $property) { - $property->accept($this); - } - foreach ($class->getMethods() as $method) { - $method->accept($this); - } - - $this->fireEndClass($class); - } - - /** - * Visits a trait node. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @since 1.0.0 - */ - public function visitTrait(ASTTrait $trait) - { - $this->fireStartTrait($trait); - - $trait->getCompilationUnit()->accept($this); - - foreach ($trait->getMethods() as $method) { - $method->accept($this); - } - - $this->fireEndTrait($trait); - } - - /** - * Visits a file node. - * - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit - * @return void - */ - public function visitCompilationUnit(ASTCompilationUnit $compilationUnit) - { - $this->fireStartFile($compilationUnit); - $this->fireEndFile($compilationUnit); - } - - /** - * Visits a function node. - * - * @param ASTFunction $function - * @return void - */ - public function visitFunction(ASTFunction $function) - { - $this->fireStartFunction($function); - - $function->getCompilationUnit()->accept($this); - - foreach ($function->getParameters() as $parameter) { - $parameter->accept($this); - } - - $this->fireEndFunction($function); - } - - /** - * Visits a code interface object. - * - * @param ASTInterface $interface - * @return void - */ - public function visitInterface(ASTInterface $interface) - { - $this->fireStartInterface($interface); - - $interface->getCompilationUnit()->accept($this); - - foreach ($interface->getMethods() as $method) { - $method->accept($this); - } - - $this->fireEndInterface($interface); - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - public function visitMethod(ASTMethod $method) - { - $this->fireStartMethod($method); - - foreach ($method->getParameters() as $parameter) { - $parameter->accept($this); - } - - $this->fireEndMethod($method); - } - - /** - * Visits a namespace node. - * - * @param ASTNamespace $namespace - * @return void - */ - public function visitNamespace(ASTNamespace $namespace) - { - $this->fireStartNamespace($namespace); - - foreach ($namespace->getClasses() as $class) { - $class->accept($this); - } - foreach ($namespace->getInterfaces() as $interface) { - $interface->accept($this); - } - foreach ($namespace->getTraits() as $trait) { - $trait->accept($this); - } - foreach ($namespace->getFunctions() as $function) { - $function->accept($this); - } - - $this->fireEndNamespace($namespace); - } - - /** - * Visits a parameter node. - * - * @param \PDepend\Source\AST\ASTParameter $parameter - * @return void - */ - public function visitParameter(ASTParameter $parameter) - { - $this->fireStartParameter($parameter); - $this->fireEndParameter($parameter); - } - - /** - * Visits a property node. - * - * @param \PDepend\Source\AST\ASTProperty $property - * @return void - */ - public function visitProperty(ASTProperty $property) - { - $this->fireStartProperty($property); - $this->fireEndProperty($property); - } - - - /** - * Magic call method used to provide simplified visitor implementations. - * With this method we can call <b>visit${NodeClassName}</b> on each node. - * - * <code> - * $visitor->visitAllocationExpression($alloc); - * - * $visitor->visitStatement($stmt); - * </code> - * - * All visit methods takes two argument. The first argument is the current - * context ast node and the second argument is a data array or object that - * is used to collect data. - * - * The return value of this method is the second input argument, modified - * by the concrete visit method. - * - * @param string $method Name of the called method. - * @param array $args Array with method argument. - * - * @return mixed - * @since 0.9.12 - */ - public function __call($method, $args) - { - if (!isset($args[1])) { - throw new \RuntimeException("No node to visit provided for $method."); - } - - $value = $args[1]; - foreach ($args[0]->getChildren() as $child) { - $value = $child->accept($this, $value); - } - return $value; - } - - /** - * Sends a start class event. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - protected function fireStartClass(ASTClass $class) - { - foreach ($this->listeners as $listener) { - $listener->startVisitClass($class); - } - } - - /** - * Sends an end class event. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - protected function fireEndClass(ASTClass $class) - { - foreach ($this->listeners as $listener) { - $listener->endVisitClass($class); - } - } - - /** - * Sends a start trait event. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - */ - protected function fireStartTrait(ASTTrait $trait) - { - foreach ($this->listeners as $listener) { - $listener->startVisitTrait($trait); - } - } - - /** - * Sends an end trait event. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - */ - protected function fireEndTrait(ASTTrait $trait) - { - foreach ($this->listeners as $listener) { - $listener->endVisitTrait($trait); - } - } - - /** - * Sends a start file event. - * - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit - * @return void - */ - protected function fireStartFile(ASTCompilationUnit $compilationUnit) - { - foreach ($this->listeners as $listener) { - $listener->startVisitFile($compilationUnit); - } - } - - /** - * Sends an end file event. - * - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit - * @return void - */ - protected function fireEndFile(ASTCompilationUnit $compilationUnit) - { - foreach ($this->listeners as $listener) { - $listener->endVisitFile($compilationUnit); - } - } - - /** - * Sends a start function event. - * - * @param ASTFunction $function - * @return void - */ - protected function fireStartFunction(ASTFunction $function) - { - foreach ($this->listeners as $listener) { - $listener->startVisitFunction($function); - } - } - - /** - * Sends an end function event. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - protected function fireEndFunction(ASTFunction $function) - { - foreach ($this->listeners as $listener) { - $listener->endVisitFunction($function); - } - } - - /** - * Sends a start interface event. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - protected function fireStartInterface(ASTInterface $interface) - { - foreach ($this->listeners as $listener) { - $listener->startVisitInterface($interface); - } - } - - /** - * Sends an end interface event. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - protected function fireEndInterface(ASTInterface $interface) - { - foreach ($this->listeners as $listener) { - $listener->endVisitInterface($interface); - } - } - - /** - * Sends a start method event. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - protected function fireStartMethod(ASTMethod $method) - { - foreach ($this->listeners as $listener) { - $listener->startVisitMethod($method); - } - } - - /** - * Sends an end method event. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return void - */ - protected function fireEndMethod(ASTMethod $method) - { - foreach ($this->listeners as $listener) { - $listener->endVisitMethod($method); - } - } - - /** - * Sends a start namespace event. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - protected function fireStartNamespace(ASTNamespace $namespace) - { - foreach ($this->listeners as $listener) { - $listener->startVisitNamespace($namespace); - } - } - - /** - * Sends an end namespace event. - * - * @param \PDepend\Source\AST\ASTNamespace $namespace - * @return void - */ - protected function fireEndNamespace(ASTNamespace $namespace) - { - foreach ($this->listeners as $listener) { - $listener->endVisitNamespace($namespace); - } - } - - /** - * Sends a start parameter event. - * - * @param \PDepend\Source\AST\ASTParameter $parameter - * @return void - */ - protected function fireStartParameter(ASTParameter $parameter) - { - foreach ($this->listeners as $listener) { - $listener->startVisitParameter($parameter); - } - } - - /** - * Sends a end parameter event. - * - * @param \PDepend\Source\AST\ASTParameter $parameter - * @return void - */ - protected function fireEndParameter(ASTParameter $parameter) - { - foreach ($this->listeners as $listener) { - $listener->endVisitParameter($parameter); - } - } - - /** - * Sends a start property event. - * - * @param \PDepend\Source\AST\ASTProperty $property - * @return void - */ - protected function fireStartProperty(ASTProperty $property) - { - foreach ($this->listeners as $listener) { - $listener->startVisitProperty($property); - } - } - - /** - * Sends an end property event. - * - * @param \PDepend\Source\AST\ASTProperty $property - * @return void - */ - protected function fireEndProperty(ASTProperty $property) - { - foreach ($this->listeners as $listener) { - $listener->endVisitProperty($property); - } - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/Builder.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/Builder.php deleted file mode 100644 index 438dd19..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/Builder.php +++ /dev/null @@ -1,1254 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Builder; - -use PDepend\Source\AST\AbstractASTClassOrInterface; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTClassOrInterfaceReference; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTTrait; -use PDepend\Util\Cache\CacheDriver; - -/** - * Base interface for all code node builders. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface Builder extends \IteratorAggregate -{ - /** - * The default package name. - */ - const DEFAULT_NAMESPACE = '+global'; - - /** - * Setter method for the currently used token cache. - * - * @param \PDepend\Util\Cache\CacheDriver $cache - * @return \PDepend\Source\Builder\Builder - * @since 0.10.0 - */ - public function setCache(CacheDriver $cache); - - /** - * Restores a function within the internal type scope. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - * @since 0.10.0 - */ - public function restoreFunction(ASTFunction $function); - - /** - * This method will try to find an already existing instance for the given - * qualified name. It will create a new {@link \PDepend\Source\AST\ASTClass} - * instance when no matching type exists. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\AbstractASTClassOrInterface - * @since 0.9.5 - */ - public function getClassOrInterface($qualifiedName); - - /** - * Builds a new code type reference instance. - * - * @param string $qualifiedName The qualified name of the referenced type. - * - * @return \PDepend\Source\AST\ASTClassOrInterfaceReference - * @since 0.9.5 - */ - public function buildAstClassOrInterfaceReference($qualifiedName); - - /** - * Builds a new php trait instance. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTTrait - * @since 1.0.0 - */ - public function buildTrait($qualifiedName); - - /** - * Restores an existing trait instance within the context of this builder. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @since 1.0.0 - */ - public function restoreTrait(ASTTrait $trait); - - /** - * This method will try to find an already existing instance for the given - * qualified name. It will create a new {@link \PDepend\Source\AST\ASTTrait} - * instance when no matching type exists. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTTrait - * @since 1.0.0 - */ - public function getTrait($qualifiedName); - - /** - * Builds a new code class instance. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTClass - */ - public function buildClass($qualifiedName); - - /** - * Builds an anonymous class instance. - * - * @return \PDepend\Source\AST\ASTAnonymousClass - */ - public function buildAnonymousClass(); - - /** - * This method will try to find an already existing instance for the given - * qualified name. It will create a new {@link \PDepend\Source\AST\ASTClass} - * instance when no matching type exists. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTClass - * @since 0.9.5 - */ - public function getClass($qualifiedName); - - /** - * Restores an existing class instance within the context of this builder. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - * @since 0.10.0 - */ - public function restoreClass(ASTClass $class); - - /** - * Builds a new code type reference instance. - * - * @param string $qualifiedName The qualified name of the referenced type. - * @return \PDepend\Source\AST\ASTClassReference - * @since 0.9.5 - */ - public function buildAstClassReference($qualifiedName); - - /** - * Builds a new new interface instance. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTInterface - */ - public function buildInterface($qualifiedName); - - /** - * Restores an existing interface instance within the context of this builder. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - * @since 0.10.0 - */ - public function restoreInterface(ASTInterface $interface); - - /** - * This method will try to find an already existing instance for the given - * qualified name. It will create a new {@link \PDepend\Source\AST\ASTInterface} - * instance when no matching type exists. - * - * @param string $qualifiedName The full qualified type identifier. - * @return \PDepend\Source\AST\ASTInterface - * @since 0.9.5 - */ - public function getInterface($qualifiedName); - - /** - * Builds a new namespace instance. - * - * @param string $name - * @return \PDepend\Source\AST\ASTNamespace - */ - public function buildNamespace($name); - - /** - * Builds a new method instance. - * - * @param string $name - * @return \PDepend\Source\AST\ASTMethod - */ - public function buildMethod($name); - - /** - * Builds a new function instance. - * - * @param string $name - * @return \PDepend\Source\AST\ASTFunction - */ - public function buildFunction($name); - - /** - * Builds a new self reference instance. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $type - * @return \PDepend\Source\AST\ASTSelfReference - * @since 0.9.6 - */ - public function buildAstSelfReference(AbstractASTClassOrInterface $type); - - /** - * Builds a new parent reference instance. - * - * @param \PDepend\Source\AST\ASTClassOrInterfaceReference $reference The type - * instance that reference the concrete target of parent. - * @return \PDepend\Source\AST\ASTParentReference - * @since 0.9.6 - */ - public function buildAstParentReference(ASTClassOrInterfaceReference $reference); - - /** - * Builds a new static reference instance. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $owner - * @return \PDepend\Source\AST\ASTStaticReference - * @since 0.9.6 - */ - public function buildAstStaticReference(AbstractASTClassOrInterface $owner); - - /** - * Builds a new field declaration node. - * - * @return \PDepend\Source\AST\ASTFieldDeclaration - * @since 0.9.6 - */ - public function buildAstFieldDeclaration(); - - /** - * Builds a new variable declarator node. - * - * @param string $image The source image for the variable declarator. - * - * @return \PDepend\Source\AST\ASTVariableDeclarator - * @since 0.9.6 - */ - public function buildAstVariableDeclarator($image); - - /** - * Builds a new constant node. - * - * @param string $image The source image for the constant. - * - * @return \PDepend\Source\AST\ASTConstant - * @since 0.9.6 - */ - public function buildAstConstant($image); - - /** - * Builds a new variable node. - * - * @param string $image The source image for the variable. - * - * @return \PDepend\Source\AST\ASTVariable - * @since 0.9.6 - */ - public function buildAstVariable($image); - - /** - * Builds a new variable variable node. - * - * @param string $image The source image for the variable variable. - * - * @return \PDepend\Source\AST\ASTVariableVariable - * @since 0.9.6 - */ - public function buildAstVariableVariable($image); - - /** - * Builds a new compound variable node. - * - * @param string $image The source image for the compound variable. - * - * @return \PDepend\Source\AST\ASTCompoundVariable - * @since 0.9.6 - */ - public function buildAstCompoundVariable($image); - - /** - * Builds a new compound expression node. - * - * @return \PDepend\Source\AST\ASTCompoundExpression - * @since 0.9.6 - */ - public function buildAstCompoundExpression(); - - /** - * Builds a new static variable declaration node. - * - * @param string $image The source image for the static declaration. - * - * @return \PDepend\Source\AST\ASTStaticVariableDeclaration - * @since 0.9.6 - */ - public function buildAstStaticVariableDeclaration($image); - - /** - * Builds a new closure node. - * - * @return \PDepend\Source\AST\ASTClosure - * @since 0.9.12 - */ - public function buildAstClosure(); - - /** - * Builds a new formal parameters node. - * - * @return \PDepend\Source\AST\ASTFormalParameters - * @since 0.9.6 - */ - public function buildAstFormalParameters(); - - /** - * Builds a new formal parameter node. - * - * @return \PDepend\Source\AST\ASTFormalParameter - * @since 0.9.6 - */ - public function buildAstFormalParameter(); - - /** - * Builds a new expression node. - * - * @param string $image - * @return \PDepend\Source\AST\ASTExpression - * @since 0.9.8 - */ - public function buildAstExpression($image = null); - - /** - * Builds a new assignment expression node. - * - * @param string $image The assignment operator. - * - * @return \PDepend\Source\AST\ASTAssignmentExpression - * @since 0.9.8 - */ - public function buildAstAssignmentExpression($image); - - /** - * Builds a new allocation expression node. - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTAllocationExpression - * @since 0.9.6 - */ - public function buildAstAllocationExpression($image); - - /** - * Builds a new eval-expression node. - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTEvalExpression - * @since 0.9.12 - */ - public function buildAstEvalExpression($image); - - /** - * Builds a new exit-expression instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTExitExpression - * @since 0.9.12 - */ - public function buildAstExitExpression($image); - - /** - * Builds a new clone-expression node. - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTCloneExpression - * @since 0.9.12 - */ - public function buildAstCloneExpression($image); - - /** - * Builds a new list-expression node. - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTListExpression - * @since 0.9.12 - */ - public function buildAstListExpression($image); - - /** - * Builds a new include- or include_once-expression. - * - * @return \PDepend\Source\AST\ASTIncludeExpression - * @since 0.9.12 - */ - public function buildAstIncludeExpression(); - - /** - * Builds a new require- or require_once-expression. - * - * @return \PDepend\Source\AST\ASTRequireExpression - * @since 0.9.12 - */ - public function buildAstRequireExpression(); - - /** - * Builds a new array-expression node. - * - * @return \PDepend\Source\AST\ASTArrayIndexExpression - * @since 0.9.12 - */ - public function buildAstArrayIndexExpression(); - - /** - * Builds a new string-expression node. - * - * <code> - * // -------- - * $string{$index} - * // -------- - * </code> - * - * @return \PDepend\Source\AST\ASTStringIndexExpression - * @since 0.9.12 - */ - public function buildAstStringIndexExpression(); - - /** - * Builds a new instanceof-expression node. - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTInstanceOfExpression - * @since 0.9.6 - */ - public function buildAstInstanceOfExpression($image); - - /** - * Builds a new isset-expression node. - * - * <code> - * // ----------- - * if (isset($foo)) { - * // ----------- - * } - * - * // ----------------------- - * if (isset($foo, $bar, $baz)) { - * // ----------------------- - * } - * </code> - * - * @return \PDepend\Source\AST\ASTIssetExpression - * @since 0.9.12 - */ - public function buildAstIssetExpression(); - - /** - * Builds a new boolean conditional-expression. - * - * <code> - * -------------- - * $bar = ($foo ? 42 : 23); - * -------------- - * </code> - * - * @return \PDepend\Source\AST\ASTConditionalExpression - * @since 0.9.8 - */ - public function buildAstConditionalExpression(); - - /** - * Builds a new print-expression. - * - * <code> - * ------------- - * print "qafoo"; - * ------------- - * </code> - * - * @return \PDepend\Source\AST\ASTPrintExpression - * @since 2.3 - */ - public function buildAstPrintExpression(); - - /** - * Build a new shift left expression. - * - * @return \PDepend\Source\AST\ASTShiftLeftExpression - * @since 1.0.1 - */ - public function buildAstShiftLeftExpression(); - - /** - * Build a new shift right expression. - * - * @return \PDepend\Source\AST\ASTShiftRightExpression - * @since 1.0.1 - */ - public function buildAstShiftRightExpression(); - - /** - * Builds a new boolean and-expression. - * - * @return \PDepend\Source\AST\ASTBooleanAndExpression - * @since 0.9.8 - */ - public function buildAstBooleanAndExpression(); - - /** - * Builds a new boolean or-expression. - * - * @return \PDepend\Source\AST\ASTBooleanOrExpression - * @since 0.9.8 - */ - public function buildAstBooleanOrExpression(); - - /** - * Builds a new logical <b>and</b>-expression. - * - * @return \PDepend\Source\AST\ASTLogicalAndExpression - * @since 0.9.8 - */ - public function buildAstLogicalAndExpression(); - - /** - * Builds a new logical <b>or</b>-expression. - * - * @return \PDepend\Source\AST\ASTLogicalOrExpression - * @since 0.9.8 - */ - public function buildAstLogicalOrExpression(); - - /** - * Builds a new logical <b>xor</b>-expression. - * - * @return \PDepend\Source\AST\ASTLogicalXorExpression - * @since 0.9.8 - */ - public function buildAstLogicalXorExpression(); - - /** - * Builds a new trait use-statement node. - * - * @return \PDepend\Source\AST\ASTTraitUseStatement - * @since 1.0.0 - */ - public function buildAstTraitUseStatement(); - - /** - * Builds a new trait adaptation scope. - * - * @return \PDepend\Source\AST\ASTTraitAdaptation - * @since 1.0.0 - */ - public function buildAstTraitAdaptation(); - - /** - * Builds a new trait adaptation alias statement. - * - * @param string $image The trait method name. - * - * @return \PDepend\Source\AST\ASTTraitAdaptationAlias - * @since 1.0.0 - */ - public function buildAstTraitAdaptationAlias($image); - - /** - * Builds a new trait adaptation precedence statement. - * - * @param string $image The trait method name. - * - * @return \PDepend\Source\AST\ASTTraitAdaptationPrecedence - * @since 1.0.0 - */ - public function buildAstTraitAdaptationPrecedence($image); - - /** - * Builds a new trait reference node. - * - * @param string $qualifiedName The full qualified trait name. - * - * @return \PDepend\Source\AST\ASTTraitReference - * @since 1.0.0 - */ - public function buildAstTraitReference($qualifiedName); - - /** - * Builds a new switch-statement-node. - * - * @return \PDepend\Source\AST\ASTSwitchStatement - * @since 0.9.8 - */ - public function buildAstSwitchStatement(); - - /** - * Builds a new switch-label node. - * - * @param string $image The source image of this label. - * - * @return \PDepend\Source\AST\ASTSwitchLabel - * @since 0.9.8 - */ - public function buildAstSwitchLabel($image); - - /** - * Builds a new catch-statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTCatchStatement - * @since 0.9.8 - */ - public function buildAstCatchStatement($image); - - /** - * Builds a new finally-statement node. - * - * @return \PDepend\Source\AST\ASTFinallyStatement - * @since 2.0.0 - */ - public function buildAstFinallyStatement(); - - /** - * Builds a new if statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTIfStatement - * @since 0.9.8 - */ - public function buildAstIfStatement($image); - - /** - * Builds a new elseif-statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTElseIfStatement - * @since 0.9.8 - */ - public function buildAstElseIfStatement($image); - - /** - * Builds a new for-statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTForStatement - * @since 0.9.8 - */ - public function buildAstForStatement($image); - - /** - * Builds a new for-init node. - * - * <code> - * ------------------------ - * for ($x = 0, $y = 23, $z = 42; $x < $y; ++$x) {} - * ------------------------ - * </code> - * - * @return \PDepend\Source\AST\ASTForInit - * @since 0.9.8 - */ - public function buildAstForInit(); - - /** - * Builds a new for-update node. - * - * <code> - * ------------------------------- - * for ($x = 0, $y = 23, $z = 42; $x < $y; ++$x, $y = $x + 1, $z = $x + 2) {} - * ------------------------------- - * </code> - * - * @return \PDepend\Source\AST\ASTForUpdate - * @since 0.9.12 - */ - public function buildAstForUpdate(); - - /** - * Builds a new foreach-statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTForeachStatement - * @since 0.9.8 - */ - public function buildAstForeachStatement($image); - - /** - * Builds a new while-statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTWhileStatement - * @since 0.9.8 - */ - public function buildAstWhileStatement($image); - - /** - * Builds a new do/while-statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTDoWhileStatement - * @since 0.9.12 - */ - public function buildAstDoWhileStatement($image); - - /** - * Builds a new declare-statement node. - * - * <code> - * ------------------------------- - * declare(encoding='ISO-8859-1'); - * ------------------------------- - * - * ------------------- - * declare(ticks=42) { - * // ... - * } - * - - * - * ------------------ - * declare(ticks=42): - * // ... - * enddeclare; - * ----------- - * </code> - * - * @return \PDepend\Source\AST\ASTDeclareStatement - * @since 0.10.0 - */ - public function buildAstDeclareStatement(); - - /** - * Builds a new member primary expression node. - * - * <code> - * //-------- - * Foo::bar(); - * //-------- - * - * //--------- - * Foo::$bar(); - * //--------- - * - * //--------- - * $obj->bar(); - * //--------- - * - * //---------- - * $obj->$bar(); - * //---------- - * </code> - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTMemberPrimaryPrefix - * @since 0.9.6 - */ - public function buildAstMemberPrimaryPrefix($image); - - /** - * Builds a new identifier node. - * - * @param string $image The image of this identifier. - * - * @return \PDepend\Source\AST\ASTIdentifier - * @since 0.9.6 - */ - public function buildAstIdentifier($image); - - /** - * Builds a new function postfix expression. - * - * <code> - * //------- - * foo($bar); - * //------- - * - * //-------- - * $foo($bar); - * //-------- - * </code> - * - * @param string $image The image of this node. - * - * @return \PDepend\Source\AST\ASTFunctionPostfix - * @since 0.9.6 - */ - public function buildAstFunctionPostfix($image); - - /** - * Builds a new method postfix expression. - * - * <code> - * // --------- - * Foo::bar($baz); - * // --------- - * - * // ---------- - * Foo::$bar($baz); - * // ---------- - * </code> - * - * @param string $image The image of this node. - * - * @return \PDepend\Source\AST\ASTMethodPostfix - * @since 0.9.6 - */ - public function buildAstMethodPostfix($image); - - /** - * Builds a new constant postfix expression. - * - * <code> - * // --- - * Foo::BAR; - * // --- - * </code> - * - * @param string $image The image of this node. - * - * @return \PDepend\Source\AST\ASTConstantPostfix - * @since 0.9.6 - */ - public function buildAstConstantPostfix($image); - - /** - * Builds a new property postfix expression. - * - * <code> - * // ---- - * Foo::$bar; - * // ---- - * - * // --- - * $object->bar; - * // --- - * </code> - * - * @param string $image The image of this node. - * - * @return \PDepend\Source\AST\ASTPropertyPostfix - * @since 0.9.6 - */ - public function buildAstPropertyPostfix($image); - - /** - * Builds a new full qualified class name postfix expression. - * - * <code> - * // ----- - * Foo::class; - * // ----- - * - * // ----- - * $object::class; - * // ----- - * </code> - * - * @return \PDepend\Source\AST\ASTClassFqnPostfix - * @since 2.0.0 - */ - public function buildAstClassFqnPostfix(); - - /** - * Builds a new arguments list. - * - * <code> - * // ------------ - * Foo::bar($x, $y, $z); - * // ------------ - * - * // ------------ - * $foo->bar($x, $y, $z); - * // ------------ - * </code> - * - * @return \PDepend\Source\AST\ASTArguments - * @since 0.9.6 - */ - public function buildAstArguments(); - - /** - * Builds a new array type node. - * - * @return \PDepend\Source\AST\ASTTypeArray - * @since 0.9.6 - */ - public function buildAstTypeArray(); - - /** - * Builds a new node for the callable type. - * - * @return \PDepend\Source\AST\ASTTypeCallable - * @since 1.0.0 - */ - public function buildAstTypeCallable(); - - /** - * Builds a new node for the iterable type. - * - * @return \PDepend\Source\AST\ASTTypeIterable - * @since 2.5.1 - */ - public function buildAstTypeIterable(); - - /** - * Builds a new primitive type node. - * - * @param string $image - * @return \PDepend\Source\AST\ASTScalarType - * @since 0.9.6 - */ - public function buildAstScalarType($image); - - /** - * Builds a new literal node. - * - * @param string $image The source image for the literal node. - * - * @return \PDepend\Source\AST\ASTLiteral - * @since 0.9.6 - */ - public function buildAstLiteral($image); - - /** - * Builds a new php string node. - * - * <code> - * $string = "Manuel $Pichler <{$email}>"; - * - * // \PDepend\Source\AST\ASTString - * // |-- ASTLiteral - "Manuel ") - * // |-- ASTVariable - $Pichler - * // |-- ASTLiteral - " <" - * // |-- ASTCompoundExpression - {...} - * // | |-- ASTVariable - $email - * // |-- ASTLiteral - ">" - * </code> - * - * @return \PDepend\Source\AST\ASTString - * @since 0.9.10 - */ - public function buildAstString(); - - /** - * Builds a new php array node. - * - * @return \PDepend\Source\AST\ASTArray - * @since 1.0.0 - */ - public function buildAstArray(); - - /** - * Builds a new array element node. - * - * @return \PDepend\Source\AST\ASTArrayElement - * @since 1.0.0 - */ - public function buildAstArrayElement(); - - /** - * Builds a new heredoc node. - * - * @return \PDepend\Source\AST\ASTHeredoc - * @since 0.9.12 - */ - public function buildAstHeredoc(); - - /** - * Builds a new constant definition node. - * - * <code> - * class Foo - * { - * // ------------------------ - * const FOO = 42, BAR = 23; - * // ------------------------ - * } - * </code> - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTConstantDefinition - * @since 0.9.6 - */ - public function buildAstConstantDefinition($image); - - /** - * Builds a new constant declarator node. - * - * <code> - * class Foo - * { - * // -------- - * const BAR = 42; - * // -------- - * } - * </code> - * - * Or in a comma separated constant defintion: - * - * <code> - * class Foo - * { - * // -------- - * const BAR = 42, - * // -------- - * - * // -------------- - * const BAZ = 'Foobar', - * // -------------- - * - * // ---------- - * const FOO = 3.14; - * // ---------- - * } - * </code> - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTConstantDeclarator - * @since 0.9.6 - */ - public function buildAstConstantDeclarator($image); - - /** - * Builds a new comment node instance. - * - * @param string $cdata The comment text. - * - * @return \PDepend\Source\AST\ASTComment - * @since 0.9.8 - */ - public function buildAstComment($cdata); - - /** - * Builds a new unary expression node instance. - * - * @param string $image The unary expression image/character. - * - * @return \PDepend\Source\AST\ASTUnaryExpression - * @since 0.9.11 - */ - public function buildAstUnaryExpression($image); - - /** - * Builds a new cast-expression node instance. - * - * @param string $image The cast-expression image/character. - * - * @return \PDepend\Source\AST\ASTCastExpression - * @since 0.10.0 - */ - public function buildAstCastExpression($image); - - /** - * Builds a new postfix-expression node instance. - * - * @param string $image The postfix-expression image/character. - * - * @return \PDepend\Source\AST\ASTPostfixExpression - * @since 0.10.0 - */ - public function buildAstPostfixExpression($image); - - /** - * Builds a new pre-increment-expression node instance. - * - * @return \PDepend\Source\AST\ASTPreIncrementExpression - * @since 0.10.0 - */ - public function buildAstPreIncrementExpression(); - - /** - * Builds a new pre-decrement-expression node instance. - * - * @return \PDepend\Source\AST\ASTPreDecrementExpression - * @since 0.10.0 - */ - public function buildAstPreDecrementExpression(); - - /** - * Builds a new function/method scope instance. - * - * @return \PDepend\Source\AST\ASTScope - * @since 0.9.12 - */ - public function buildAstScope(); - - /** - * Builds a new statement instance. - * - * @return \PDepend\Source\AST\ASTStatement - * @since 0.9.12 - */ - public function buildAstStatement(); - - /** - * Builds a new return-statement node instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTReturnStatement - * @since 0.9.12 - */ - public function buildAstReturnStatement($image); - - /** - * Builds a new break-statement node instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTBreakStatement - * @since 0.9.12 - */ - public function buildAstBreakStatement($image); - - /** - * Builds a new continue-statement node instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTContinueStatement - * @since 0.9.12 - */ - public function buildAstContinueStatement($image); - - /** - * Builds a new scope-statement instance. - * - * @return \PDepend\Source\AST\ASTScopeStatement - * @since 0.9.12 - */ - public function buildAstScopeStatement(); - - /** - * Builds a new try-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTTryStatement - * @since 0.9.12 - */ - public function buildAstTryStatement($image); - - /** - * Builds a new throw-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTThrowStatement - * @since 0.9.12 - */ - public function buildAstThrowStatement($image); - - /** - * Builds a new goto-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTGotoStatement - * @since 0.9.12 - */ - public function buildAstGotoStatement($image); - - /** - * Builds a new label-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTLabelStatement - * @since 0.9.12 - */ - public function buildAstLabelStatement($image); - - /** - * Builds a new global-statement instance. - * - * @return \PDepend\Source\AST\ASTGlobalStatement - * @since 0.9.12 - */ - public function buildAstGlobalStatement(); - - /** - * Builds a new unset-statement instance. - * - * @return \PDepend\Source\AST\ASTUnsetStatement - * @since 0.9.12 - */ - public function buildAstUnsetStatement(); - - /** - * Builds a new exit-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTEchoStatement - * @since 0.9.12 - */ - public function buildAstEchoStatement($image); - - /** - * Builds a new yield-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTYieldStatement - * @since $version$ - */ - public function buildAstYieldStatement($image); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/BuilderContext.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/BuilderContext.php deleted file mode 100644 index 14fcf78..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/BuilderContext.php +++ /dev/null @@ -1,121 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Source\Builder; - -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTTrait; - -/** - * Base interface for a builder context. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -interface BuilderContext -{ - /** - * This method can be used to register an existing function in the current - * application context. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function registerFunction(ASTFunction $function); - - /** - * This method can be used to register an existing trait in the current - * class context. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @since 1.0.0 - */ - public function registerTrait(ASTTrait $trait); - - /** - * This method can be used to register an existing class in the current - * class context. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - */ - public function registerClass(ASTClass $class); - - /** - * This method can be used to register an existing interface in the current - * class context. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function registerInterface(ASTInterface $interface); - - /** - * Returns the trait instance for the given qualified name. - * - * @param string $qualifiedName Full qualified trait name. - * @return \PDepend\Source\AST\ASTTrait - * @since 1.0.0 - */ - public function getTrait($qualifiedName); - - /** - * Returns the class instance for the given qualified name. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTClass - */ - public function getClass($qualifiedName); - - /** - * Returns a class or an interface instance for the given qualified name. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\AbstractASTClassOrInterface - */ - public function getClassOrInterface($qualifiedName); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/BuilderContext/GlobalBuilderContext.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/BuilderContext/GlobalBuilderContext.php deleted file mode 100644 index 7939d02..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Builder/BuilderContext/GlobalBuilderContext.php +++ /dev/null @@ -1,174 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Source\Builder\BuilderContext; - -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTTrait; -use PDepend\Source\Builder\Builder; -use PDepend\Source\Builder\BuilderContext; - -/** - * This class provides the default implementation of the builder context. - * - * This class utilizes the simple <b>static</b> language construct to share the - * context instance between all using objects. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -class GlobalBuilderContext implements BuilderContext -{ - /** - * The currently used ast builder. - * - * @var \PDepend\Source\Builder\Builder - */ - protected static $builder = null; - - /** - * Constructs a new builder context instance. - * - * @param \PDepend\Source\Builder\Builder $builder The currently used ast builder. - */ - public function __construct(Builder $builder) - { - self::$builder = $builder; - } - - /** - * This method can be used to register an existing function in the current - * application context. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - */ - public function registerFunction(ASTFunction $function) - { - self::$builder->restoreFunction($function); - } - - /** - * This method can be used to register an existing trait in the current - * class context. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @since 1.0.0 - */ - public function registerTrait(ASTTrait $trait) - { - self::$builder->restoreTrait($trait); - } - - /** - * This method can be used to register an existing class in the current - * class context. - * - * @param \PDepend\Source\AST\ASTClass $class The class instance. - * @return void - */ - public function registerClass(ASTClass $class) - { - self::$builder->restoreClass($class); - } - - /** - * This method can be used to register an existing interface in the current - * class context. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - */ - public function registerInterface(ASTInterface $interface) - { - self::$builder->restoreInterface($interface); - } - - /** - * Returns the trait instance for the given qualified name. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTTrait - * @since 1.0.0 - */ - public function getTrait($qualifiedName) - { - return $this->getBuilder()->getTrait($qualifiedName); - } - - /** - * Returns the class instance for the given qualified name. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTClass - */ - public function getClass($qualifiedName) - { - return $this->getBuilder()->getClass($qualifiedName); - } - - /** - * Returns a class or an interface instance for the given qualified name. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\AbstractASTClassOrInterface - */ - public function getClassOrInterface($qualifiedName) - { - return $this->getBuilder()->getClassOrInterface($qualifiedName); - } - - /** - * Returns the currently used builder instance. - * - * @return \PDepend\Source\Builder\Builder - */ - protected function getBuilder() - { - return self::$builder; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php deleted file mode 100644 index 373938a..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/AbstractPHPParser.php +++ /dev/null @@ -1,7178 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Language\PHP; - -use PDepend\Source\AST\AbstractASTCallable; -use PDepend\Source\AST\AbstractASTClassOrInterface; -use PDepend\Source\AST\ASTAllocationExpression; -use PDepend\Source\AST\ASTArguments; -use PDepend\Source\AST\ASTArray; -use PDepend\Source\AST\ASTCatchStatement; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTCompoundVariable; -use PDepend\Source\AST\ASTDeclareStatement; -use PDepend\Source\AST\ASTExpression; -use PDepend\Source\AST\ASTFunctionPostfix; -use PDepend\Source\AST\ASTIndexExpression; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMemberPrimaryPrefix; -use PDepend\Source\AST\ASTNode; -use PDepend\Source\AST\ASTStatement; -use PDepend\Source\AST\ASTSwitchStatement; -use PDepend\Source\AST\ASTTrait; -use PDepend\Source\AST\ASTTraitAdaptation; -use PDepend\Source\AST\ASTTraitUseStatement; -use PDepend\Source\AST\ASTValue; -use PDepend\Source\AST\ASTVariable; -use PDepend\Source\AST\ASTVariableVariable; -use PDepend\Source\AST\State; -use PDepend\Source\Builder\Builder; -use PDepend\Source\Parser\InvalidStateException; -use PDepend\Source\Parser\MissingValueException; -use PDepend\Source\Parser\NoActiveScopeException; -use PDepend\Source\Parser\TokenStreamEndException; -use PDepend\Source\Parser\UnexpectedTokenException; -use PDepend\Source\Tokenizer\Token; -use PDepend\Source\Tokenizer\Tokenizer; -use PDepend\Source\Tokenizer\Tokens; -use PDepend\Util\Cache\CacheDriver; -use PDepend\Util\Log; -use PDepend\Util\Type; - -/** - * The php source parser. - * - * With the default settings the parser includes annotations, better known as - * doc comment tags, in the generated result. This means it extracts the type - * information of @var tags for properties, and types in @return + @throws tags - * of functions and methods. The current implementation tries to ignore all - * scalar types from <b>boolean</b> to <b>void</b>. You should disable this - * feature for project that have more or less invalid doc comments, because it - * could produce invalid results. - * - * <code> - * $parser->setIgnoreAnnotations(); - * </code> - * - * <b>Note</b>: Due to the fact that it is possible to use the same name for - * multiple classes and interfaces, and there is no way to determine to which - * package it belongs, while the parser handles class, interface or method - * signatures, the parser could/will create a code tree that doesn't reflect the - * real source structure. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -abstract class AbstractPHPParser -{ - /** - * Regular expression for inline type definitions in regular comments. This - * kind of type is supported by IDEs like Netbeans or eclipse. - */ - const REGEXP_INLINE_TYPE = '(^\s*/\*\s* - @var\s+ - \$[a-zA-Z_\x7f-\xff\\\\][a-zA-Z0-9_\x7f-\xff]*\s+ - (.*?) - \s*\*/\s*$)ix'; - - /** - * Regular expression for types defined in <b>throws</b> annotations of - * method or function doc comments. - */ - const REGEXP_THROWS_TYPE = '(\*\s* - @throws\s+ - ([a-zA-Z_\x7f-\xff\\\\][a-zA-Z0-9_\x7f-\xff\\\\]*) - )ix'; - - /** - * Regular expression for types defined in annotations like <b>return</b> or - * <b>var</b> in doc comments of functions and methods. - */ - const REGEXP_RETURN_TYPE = '(\*\s* - @return\s+ - (array\(\s* - (\w+\s*=>\s*)? - ([a-zA-Z_\x7f-\xff\\\\][a-zA-Z0-9_\x7f-\xff\|\\\\]*)\s* - \) - | - ([a-zA-Z_\x7f-\xff\\\\][a-zA-Z0-9_\x7f-\xff\|\\\\]*))\s+ - | - ([a-zA-Z_\x7f-\xff\\\\][a-zA-Z0-9_\x7f-\xff\|\\\\]*)\[\] - )ix'; - - /** - * Regular expression for types defined in annotations like <b>return</b> or - * <b>var</b> in doc comments of functions and methods. - */ - const REGEXP_VAR_TYPE = '(\*\s* - @var\s+ - (array\(\s* - (\w+\s*=>\s*)? - ([a-zA-Z_\x7f-\xff\\\\][a-zA-Z0-9_\x7f-\xff\|\\\\]*)\s* - \) - | - ([a-zA-Z_\x7f-\xff\\\\][a-zA-Z0-9_\x7f-\xff\|\\\\]*))\s+ - | - ([a-zA-Z_\x7f-\xff\\\\][a-zA-Z0-9_\x7f-\xff\|\\\\]*)\[\]\s+ - | - (array)\(\s*\)\s+ - )ix'; - - /** - * Internal state flag, that will be set to <b>true</b> when the parser has - * prefixed a qualified name with the actual namespace. - * - * @var boolean - */ - protected $namespacePrefixReplaced = false; - - /** - * The name of the last detected namespace. - * - * @var string|null - */ - private $namespaceName; - - /** - * Last parsed package tag. - * - * @var string|null - */ - private $packageName = Builder::DEFAULT_NAMESPACE; - - /** - * The package defined in the file level comment. - * - * @var string|null - */ - private $globalPackageName = Builder::DEFAULT_NAMESPACE; - - /** - * The used data structure builder. - * - * @var Builder - */ - protected $builder; - - /** - * The currently parsed file instance. - * - * @var \PDepend\Source\AST\ASTCompilationUnit - */ - protected $compilationUnit; - - /** - * The symbol table used to handle PHP 5.3 use statements. - * - * @var \PDepend\Source\Parser\SymbolTable - */ - protected $useSymbolTable; - - /** - * The last parsed doc comment or <b>null</b>. - * - * @var string|null - */ - private $docComment; - - /** - * Bitfield of last parsed modifiers. - * - * @var integer - */ - private $modifiers = 0; - - /** - * The actually parsed class or interface instance. - * - * @var \PDepend\Source\AST\AbstractASTClassOrInterface|null - */ - protected $classOrInterface; - - /** - * If this property is set to <b>true</b> the parser will ignore all doc - * comment annotations. - * - * @var boolean - */ - private $ignoreAnnotations = false; - - /** - * Stack with all active token scopes. - * - * @var \PDepend\Source\Parser\TokenStack - */ - protected $tokenStack; - - /** - * Used identifier builder instance. - * - * @var \PDepend\Util\IdBuilder - * @since 0.9.12 - */ - private $idBuilder = null; - - /** - * The maximum valid nesting level allowed. - * - * @var integer - * @since 0.9.12 - */ - private $maxNestingLevel = 1024; - - /** - * - * @var \PDepend\Util\Cache\CacheDriver - * @since 0.10.0 - */ - protected $cache; - - /* - * The used code tokenizer. - * - * @var \PDepend\Source\Tokenizer\Tokenizer - */ - protected $tokenizer; - - /** - * Constructs a new source parser. - * - * @param \PDepend\Source\Tokenizer\Tokenizer $tokenizer - * @param \PDepend\Source\Builder\Builder $builder - * @param \PDepend\Util\Cache\CacheDriver $cache - */ - public function __construct(Tokenizer $tokenizer, Builder $builder, CacheDriver $cache) - { - $this->tokenizer = $tokenizer; - $this->builder = $builder; - $this->cache = $cache; - - $this->idBuilder = new \PDepend\Util\IdBuilder(); - $this->tokenStack = new \PDepend\Source\Parser\TokenStack(); - $this->useSymbolTable = new \PDepend\Source\Parser\SymbolTable(); - - $this->builder->setCache($this->cache); - } - - /** - * Sets the ignore annotations flag. This means that the parser will ignore - * doc comment annotations. - * - * @return void - */ - public function setIgnoreAnnotations() - { - $this->ignoreAnnotations = true; - } - - /** - * Configures the maximum allowed nesting level. - * - * @param integer $maxNestingLevel The maximum allowed nesting level. - * - * @return void - * @since 0.9.12 - */ - public function setMaxNestingLevel($maxNestingLevel) - { - $this->maxNestingLevel = $maxNestingLevel; - } - - /** - * Returns the maximum allowed nesting/recursion level. - * - * @return integer - * @since 0.9.12 - */ - protected function getMaxNestingLevel() - { - return $this->maxNestingLevel; - } - - /** - * Parses the contents of the tokenizer and generates a node tree based on - * the found tokens. - * - * @return void - */ - public function parse() - { - $this->compilationUnit = $this->tokenizer->getSourceFile(); - $this->compilationUnit - ->setCache($this->cache) - ->setId($this->idBuilder->forFile($this->compilationUnit)); - - if ($this->compilationUnit->getFileName() === 'php://stdin') { - $hash = md5('php://stdin'); - } else { - $hash = md5_file($this->compilationUnit->getFileName()); - } - - if ($this->cache->restore($this->compilationUnit->getId(), $hash)) { - return; - } - - $this->cache->remove($this->compilationUnit->getId()); - - $this->setUpEnvironment(); - - $this->tokenStack->push(); - - Log::debug('Processing file ' . $this->compilationUnit); - - $tokenType = $this->tokenizer->peek(); - - while ($tokenType !== Tokenizer::T_EOF) { - switch ($tokenType) { - case Tokens::T_COMMENT: - $this->consumeToken(Tokens::T_COMMENT); - break; - case Tokens::T_DOC_COMMENT: - $comment = $this->consumeToken(Tokens::T_DOC_COMMENT)->image; - - $this->packageName = $this->parsePackageAnnotation($comment); - $this->docComment = $comment; - break; - case Tokens::T_USE: - // Parse a use statement. This method has no return value but it - // creates a new entry in the symbol map. - $this->parseUseDeclarations(); - break; - case Tokens::T_NAMESPACE: - $this->parseNamespaceDeclaration(); - break; - case Tokens::T_NO_PHP: - case Tokens::T_OPEN_TAG: - case Tokens::T_OPEN_TAG_WITH_ECHO: - $this->consumeToken($tokenType); - $this->reset(); - break; - case Tokens::T_CLOSE_TAG: - $this->parseNonePhpCode(); - $this->reset(); - break; - default: - if (null === $this->parseOptionalStatement()) { - // Consume whatever token - $this->consumeToken($tokenType); - } - break; - } - - $tokenType = $this->tokenizer->peek(); - } - - $this->compilationUnit->setTokens($this->tokenStack->pop()); - $this->cache->store( - $this->compilationUnit->getId(), - $this->compilationUnit, - $hash - ); - - $this->tearDownEnvironment(); - } - - /** - * Initializes the parser environment. - * - * @return void - * @since 0.9.12 - */ - protected function setUpEnvironment() - { - ini_set('xdebug.max_nesting_level', (string)$this->getMaxNestingLevel()); - - $this->useSymbolTable->createScope(); - - $this->reset(); - } - - /** - * Restores the parser environment back. - * - * @throws NoActiveScopeException - * - * @return void - * @since 0.9.12 - */ - protected function tearDownEnvironment() - { - ini_restore('xdebug.max_nesting_level'); - - $this->useSymbolTable->destroyScope(); - } - - /** - * Resets some object properties. - * - * @param integer $modifiers Optional default modifiers. - * - * @return void - */ - protected function reset($modifiers = 0) - { - $this->packageName = Builder::DEFAULT_NAMESPACE; - $this->docComment = null; - $this->modifiers = $modifiers; - } - - /** - * Tests if the given token type is a reserved keyword in the supported PHP - * version. - * - * @param integer $tokenType - * @return boolean - * @since 1.1.1 - */ - abstract protected function isKeyword($tokenType); - - /** - * Parses a valid class or interface name and returns the image of the parsed - * token. - * - * @return string - * @throws \PDepend\Source\Parser\TokenStreamEndException - * @throws \PDepend\Source\Parser\UnexpectedTokenException - */ - protected function parseClassName() - { - $type = $this->tokenizer->peek(); - - if ($this->isClassName($type)) { - return $this->consumeToken($type)->image; - } elseif ($type === Tokenizer::T_EOF) { - throw new TokenStreamEndException($this->tokenizer); - } - - throw $this->getUnexpectedTokenException(); - } - - /** - * Will return <b>true</b> if the given <b>$tokenType</b> is a valid class - * name part. - * - * @param integer $tokenType - * @return boolean - * @since 0.10.6 - */ - protected function isClassName($tokenType) - { - switch ($tokenType) { - case Tokens::T_NULL: - case Tokens::T_TRUE: - case Tokens::T_FALSE: - case Tokens::T_TRAIT: - case Tokens::T_YIELD: - case Tokens::T_STRING: - case Tokens::T_TRAIT_C: - case Tokens::T_CALLABLE: - case Tokens::T_INSTEADOF: - return true; - } - return false; - } - - /** - * Parses a function name from the given tokenizer and returns the string - * literal representing the function name. If no valid token exists in the - * token stream, this method will throw an exception. - * - * @return string - * @throws \PDepend\Source\Parser\UnexpectedTokenException - * @throws \PDepend\Source\Parser\TokenStreamEndException - * @since 0.10.0 - */ - protected function parseFunctionName() - { - $tokenType = $this->tokenizer->peek(); - - if ($this->isFunctionName($tokenType)) { - return $this->consumeToken($tokenType)->image; - } elseif ($tokenType === Tokenizer::T_EOF) { - throw new TokenStreamEndException($this->tokenizer); - } - - throw $this->getUnexpectedTokenException(); - } - - /** - * @param integer $tokenType - * @return boolean - */ - private function isAllowedName($tokenType) - { - switch ($tokenType) { - case Tokens::T_NULL: - case Tokens::T_SELF: - case Tokens::T_TRUE: - case Tokens::T_FALSE: - case Tokens::T_TRAIT: - case Tokens::T_YIELD: - case Tokens::T_PARENT: - case Tokens::T_STRING: - case Tokens::T_TRAIT_C: - case Tokens::T_CALLABLE: - case Tokens::T_INSTEADOF: - return true; - } - return false; - } - - /** - * @param integer $tokenType - * @return boolean - */ - protected function isConstantName($tokenType) - { - return $this->isAllowedName($tokenType); - } - - /** - * Tests if the give token is a valid function name in the supported PHP - * version. - * - * @param integer $tokenType - * @return boolean - * @since 2.3 - */ - protected function isFunctionName($tokenType) - { - return $this->isAllowedName($tokenType); - } - - /** - * @return string - * @throws \PDepend\Source\Parser\UnexpectedTokenException - * @throws \PDepend\Source\Parser\TokenStreamEndException - */ - protected function parseMethodName() - { - $tokenType = $this->tokenizer->peek(); - - if ($this->isMethodName($tokenType)) { - return $this->consumeToken($tokenType)->image; - } elseif ($tokenType === Tokenizer::T_EOF) { - throw new TokenStreamEndException($this->tokenizer); - } - - throw $this->getUnexpectedTokenException(); - } - - /** - * @param integer $tokenType - * @return bool - */ - protected function isMethodName($tokenType) - { - return $this->isAllowedName($tokenType); - } - - /** - * Parses a trait declaration. - * - * @return \PDepend\Source\AST\ASTTrait - * @since 1.0.0 - */ - private function parseTraitDeclaration() - { - $this->tokenStack->push(); - - $trait = $this->parseTraitSignature(); - $trait = $this->parseTypeBody($trait); - $trait->setTokens($this->tokenStack->pop()); - - $this->reset(); - - return $trait; - } - - /** - * Parses the signature of a trait. - * - * @return \PDepend\Source\AST\ASTTrait - */ - private function parseTraitSignature() - { - $this->consumeToken(Tokens::T_TRAIT); - $this->consumeComments(); - - $qualifiedName = $this->createQualifiedTypeName($this->parseClassName()); - - $trait = $this->builder->buildTrait($qualifiedName); - $trait->setCompilationUnit($this->compilationUnit); - $trait->setComment($this->docComment); - $trait->setId($this->idBuilder->forClassOrInterface($trait)); - $trait->setUserDefined(); - - return $trait; - } - - /** - * Parses the dependencies in a interface signature. - * - * @return \PDepend\Source\AST\ASTInterface - */ - private function parseInterfaceDeclaration() - { - $this->tokenStack->push(); - - $interface = $this->parseInterfaceSignature(); - $interface = $this->parseTypeBody($interface); - $interface->setTokens($this->tokenStack->pop()); - - $this->reset(); - - return $interface; - } - - /** - * Parses the signature of an interface and finally returns a configured - * interface instance. - * - * @return \PDepend\Source\AST\ASTInterface - * @since 0.10.2 - */ - private function parseInterfaceSignature() - { - $this->consumeToken(Tokens::T_INTERFACE); - $this->consumeComments(); - - $qualifiedName = $this->createQualifiedTypeName($this->parseClassName()); - - $interface = $this->builder->buildInterface($qualifiedName); - $interface->setCompilationUnit($this->compilationUnit); - $interface->setComment($this->docComment); - $interface->setId($this->idBuilder->forClassOrInterface($interface)); - $interface->setUserDefined(); - - return $this->parseOptionalExtendsList($interface); - } - - /** - * Parses an optional interface list of an interface declaration. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return \PDepend\Source\AST\ASTInterface - * @since 0.10.2 - */ - private function parseOptionalExtendsList(ASTInterface $interface) - { - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - if ($tokenType === Tokens::T_EXTENDS) { - $this->consumeToken(Tokens::T_EXTENDS); - $this->parseInterfaceList($interface); - } - return $interface; - } - - /** - * Parses the dependencies in a class signature. - * - * @return \PDepend\Source\AST\ASTClass - */ - protected function parseClassDeclaration() - { - $startToken = $this->tokenizer->currentToken(); - $this->tokenStack->push(); - - $class = $this->parseClassSignature(); - $class = $this->parseTypeBody($class); - $class->setTokens($this->tokenStack->pop(), $startToken); - - $this->reset(); - - return $class; - } - - /** - * Parses the signature of a class. - * - * The signature of a class consists of optional class modifiers like, final - * or abstract, the T_CLASS token, the class name, an optional parent class - * and an optional list of implemented interfaces. - * - * @return \PDepend\Source\AST\ASTClass - * @since 1.0.0 - */ - protected function parseClassSignature() - { - $this->parseClassModifiers(); - $this->consumeToken(Tokens::T_CLASS); - $this->consumeComments(); - - $qualifiedName = $this->createQualifiedTypeName($this->parseClassName()); - - $class = $this->builder->buildClass($qualifiedName); - $class->setCompilationUnit($this->compilationUnit); - $class->setModifiers($this->modifiers); - $class->setComment($this->docComment); - $class->setId($this->idBuilder->forClassOrInterface($class)); - $class->setUserDefined(); - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - if ($tokenType === Tokens::T_EXTENDS) { - $class = $this->parseClassExtends($class); - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - } - - if ($tokenType === Tokens::T_IMPLEMENTS) { - $this->consumeToken(Tokens::T_IMPLEMENTS); - $this->parseInterfaceList($class); - } - - return $class; - } - - /** - * This method parses an optional class modifier. Valid class modifiers are - * <b>final</b> or <b>abstract</b>. - * - * @return void - */ - private function parseClassModifiers() - { - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - if ($tokenType === Tokens::T_ABSTRACT) { - $this->consumeToken(Tokens::T_ABSTRACT); - $this->modifiers |= State::IS_EXPLICIT_ABSTRACT; - } elseif ($tokenType === Tokens::T_FINAL) { - $this->consumeToken(Tokens::T_FINAL); - $this->modifiers |= State::IS_FINAL; - } - - $this->consumeComments(); - } - - /** - * Parses a parent class declaration for the given <b>$class</b>. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return \PDepend\Source\AST\ASTClass - * @since 1.0.0 - */ - protected function parseClassExtends(ASTClass $class) - { - $this->consumeToken(Tokens::T_EXTENDS); - $this->tokenStack->push(); - - $class->setParentClassReference( - $this->setNodePositionsAndReturn( - $this->builder->buildAstClassReference( - $this->parseQualifiedName() - ) - ) - ); - - return $class; - } - - /** - * This method parses a list of interface names as used in the <b>extends</b> - * part of a interface declaration or in the <b>implements</b> part of a - * class declaration. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $abstractType - * @return void - */ - protected function parseInterfaceList(AbstractASTClassOrInterface $abstractType) - { - while (true) { - $this->tokenStack->push(); - - $abstractType->addInterfaceReference( - $this->setNodePositionsAndReturn( - $this->builder->buildAstClassOrInterfaceReference( - $this->parseQualifiedName() - ) - ) - ); - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - if ($tokenType === Tokens::T_CURLY_BRACE_OPEN) { - break; - } - $this->consumeToken(Tokens::T_COMMA); - } - } - - /** - * Parses a class/interface/trait body. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $classOrInterface - * @return \PDepend\Source\AST\AbstractASTClassOrInterface - * @throws \PDepend\Source\Parser\UnexpectedTokenException - * @throws \PDepend\Source\Parser\TokenStreamEndException - */ - protected function parseTypeBody(AbstractASTClassOrInterface $classOrInterface) - { - $this->classOrInterface = $classOrInterface; - - // Consume comments and read opening curly brace - $this->consumeComments(); - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN); - - $defaultModifier = State::IS_PUBLIC; - if ($classOrInterface instanceof ASTInterface) { - $defaultModifier |= State::IS_ABSTRACT; - } - $this->reset(); - - $tokenType = $this->tokenizer->peek(); - - while ($tokenType !== Tokenizer::T_EOF) { - switch ($tokenType) { - case Tokens::T_ABSTRACT: - case Tokens::T_PUBLIC: - case Tokens::T_PRIVATE: - case Tokens::T_PROTECTED: - case Tokens::T_STATIC: - case Tokens::T_FINAL: - case Tokens::T_FUNCTION: - case Tokens::T_VARIABLE: - case Tokens::T_VAR: - $methodOrProperty = $this->parseMethodOrFieldDeclaration( - $defaultModifier - ); - - if ($methodOrProperty instanceof ASTNode) { - $classOrInterface->addChild($methodOrProperty); - } - - $this->reset(); - break; - case Tokens::T_CONST: - $classOrInterface->addChild($this->parseConstantDefinition()); - $this->reset(); - break; - case Tokens::T_CURLY_BRACE_CLOSE: - $this->consumeToken(Tokens::T_CURLY_BRACE_CLOSE); - - $this->reset(); - - // Reset context class or interface instance - $this->classOrInterface = null; - - // Stop processing - return $classOrInterface; - case Tokens::T_COMMENT: - $token = $this->consumeToken(Tokens::T_COMMENT); - - $comment = $this->builder->buildAstComment($token->image); - $comment->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - $classOrInterface->addChild($comment); - break; - case Tokens::T_DOC_COMMENT: - $token = $this->consumeToken(Tokens::T_DOC_COMMENT); - - $comment = $this->builder->buildAstComment($token->image); - $comment->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - $classOrInterface->addChild($comment); - - $this->docComment = $token->image; - break; - case Tokens::T_USE: - $classOrInterface->addChild($this->parseTraitUseStatement()); - break; - default: - throw $this->getUnexpectedTokenException(); - } - - $tokenType = $this->tokenizer->peek(); - } - - throw new TokenStreamEndException($this->tokenizer); - } - - /** - * This method will parse a list of modifiers and a following property or - * method. - * - * @param integer $modifiers - * @return \PDepend\Source\AST\ASTMethod|\PDepend\Source\AST\ASTFieldDeclaration - * @since 0.9.6 - */ - protected function parseMethodOrFieldDeclaration($modifiers = 0) - { - $this->tokenStack->push(); - $tokenType = $this->tokenizer->peek(); - - while ($tokenType !== Tokenizer::T_EOF) { - switch ($tokenType) { - case Tokens::T_PRIVATE: - $modifiers |= State::IS_PRIVATE; - $modifiers = $modifiers & ~State::IS_PUBLIC; - break; - case Tokens::T_PROTECTED: - $modifiers |= State::IS_PROTECTED; - $modifiers = $modifiers & ~State::IS_PUBLIC; - break; - case Tokens::T_VAR: - case Tokens::T_PUBLIC: - $modifiers |= State::IS_PUBLIC; - break; - case Tokens::T_STATIC: - $modifiers |= State::IS_STATIC; - break; - case Tokens::T_ABSTRACT: - $modifiers |= State::IS_ABSTRACT; - break; - case Tokens::T_FINAL: - $modifiers |= State::IS_FINAL; - break; - case Tokens::T_FUNCTION: - $method = $this->parseMethodDeclaration(); - $method->setModifiers($modifiers); - $method->setCompilationUnit($this->compilationUnit); - $method->setId($this->idBuilder->forMethod($method)); - $method->setTokens($this->tokenStack->pop()); - - return $method; - case Tokens::T_VARIABLE: - $declaration = $this->parseFieldDeclaration(); - $declaration->setModifiers($modifiers); - - return $declaration; - default: - return $this->parseUnknownDeclaration($tokenType, $modifiers); - } - - $this->consumeToken($tokenType); - $this->consumeComments(); - - $tokenType = $this->tokenizer->peek(); - } - - throw $this->getUnexpectedTokenException(); - } - - /** - * Override this in later PHPParserVersions as necessary - * @param integer $tokenType - * @param integer $modifiers - * @return \PDepend\Source\AST\ASTConstantDefinition - * @throws UnexpectedTokenException - */ - protected function parseUnknownDeclaration($tokenType, $modifiers) - { - throw $this->getUnexpectedTokenException(); - } - - /** - * This method will parse a class field declaration with all it's variables. - * - * <code> - * // Simple field declaration - * class Foo { - * protected $foo; - * } - * - * // Field declaration with multiple properties - * class Foo { - * protected $foo = 23 - * $bar = 42, - * $baz = null; - * } - * </code> - * - * @return \PDepend\Source\AST\ASTFieldDeclaration - * @since 0.9.6 - */ - protected function parseFieldDeclaration() - { - $declaration = $this->builder->buildAstFieldDeclaration(); - $declaration->setComment($this->docComment); - - $type = $this->parseFieldDeclarationType(); - - if ($type !== null) { - $declaration->addChild($type); - } - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - while ($tokenType !== Tokenizer::T_EOF) { - $declaration->addChild($this->parseVariableDeclarator()); - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - if ($tokenType !== Tokens::T_COMMA) { - break; - } - - $this->consumeToken(Tokens::T_COMMA); - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - } - - $this->setNodePositionsAndReturn($declaration); - - $this->consumeToken(Tokens::T_SEMICOLON); - - return $declaration; - } - - /** - * This method parses a simple function or a PHP 5.3 lambda function or - * closure. - * - * @return \PDepend\Source\AST\AbstractASTCallable - * @since 0.9.5 - */ - private function parseFunctionOrClosureDeclaration() - { - $this->tokenStack->push(); - - $this->consumeToken(Tokens::T_FUNCTION); - $this->consumeComments(); - - $returnReference = $this->parseOptionalByReference(); - - if ($this->isNextTokenFormalParameterList()) { - return $this->setNodePositionsAndReturn( - $this->parseClosureDeclaration() - ); - } - - $callable = $this->parseFunctionDeclaration(); - $this->compilationUnit->addChild($callable); - - $callable->setComment($this->docComment); - $callable->setTokens($this->tokenStack->pop()); - $this->prepareCallable($callable); - - if ($returnReference) { - $callable->setReturnsReference(); - } - - $this->reset(); - - return $callable; - } - - /** - * Parses an optional by reference token. The return value will be - * <b>true</b> when a reference token was found, otherwise this method will - * return <b>false</b>. - * - * @return boolean - * @since 0.9.8 - */ - protected function parseOptionalByReference() - { - return $this->isNextTokenByReference() && $this->parseByReference(); - } - - /** - * Tests that the next available token is the returns by reference token. - * - * @return boolean - * @since 0.9.8 - */ - private function isNextTokenByReference() - { - return ($this->tokenizer->peek() === Tokens::T_BITWISE_AND); - } - - /** - * This method parses a returns by reference token and returns <b>true</b>. - * - * @return boolean - */ - private function parseByReference() - { - $this->consumeToken(Tokens::T_BITWISE_AND); - $this->consumeComments(); - - return true; - } - - /** - * Tests that the next available token is an opening parenthesis. - * - * @return boolean - * @since 0.9.10 - */ - private function isNextTokenFormalParameterList() - { - $this->consumeComments(); - return ($this->tokenizer->peek() === Tokens::T_PARENTHESIS_OPEN); - } - - /** - * This method parses a function declaration. - * - * @return \PDepend\Source\AST\ASTFunction - * @since 0.9.5 - */ - private function parseFunctionDeclaration() - { - $this->consumeComments(); - - // Next token must be the function identifier - $functionName = $this->parseFunctionName(); - - $function = $this->builder->buildFunction($functionName); - $function->setCompilationUnit($this->compilationUnit); - $function->setId($this->idBuilder->forFunction($function)); - - $this->parseCallableDeclaration($function); - - // First check for an existing namespace - if ($this->namespaceName !== null) { - $namespaceName = $this->namespaceName; - } elseif ($this->packageName !== Builder::DEFAULT_NAMESPACE) { - $namespaceName = $this->packageName; - } else { - $namespaceName = $this->globalPackageName; - } - - $namespace = $this->builder->buildNamespace($namespaceName); - $namespace->setPackageAnnotation(null === $this->namespaceName); - $namespace->addFunction($function); - - // Store function in source file, because we need them during the file's - // __wakeup() phase for function declarations within another function or - // method declaration. - $this->compilationUnit->addChild($function); - - return $function; - } - - /** - * This method parses a method declaration. - * - * @return \PDepend\Source\AST\ASTMethod - * @since 0.9.5 - */ - private function parseMethodDeclaration() - { - // Read function keyword - $this->consumeToken(Tokens::T_FUNCTION); - $this->consumeComments(); - - $returnsReference = $this->parseOptionalByReference(); - - $methodName = $this->parseMethodName(); - - $method = $this->builder->buildMethod($methodName); - $method->setComment($this->docComment); - $method->setCompilationUnit($this->compilationUnit); - - $this->classOrInterface->addMethod($method); - - $this->parseCallableDeclaration($method); - $this->prepareCallable($method); - - if ($returnsReference === true) { - $method->setReturnsReference(); - } - - return $method; - } - - /** - * This method parses a PHP 5.3 closure or lambda function. - * - * @return \PDepend\Source\AST\ASTClosure - * @since 0.9.5 - */ - private function parseClosureDeclaration() - { - $this->tokenStack->push(); - - if (Tokens::T_FUNCTION === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_FUNCTION); - } - - $closure = $this->builder->buildAstClosure(); - $closure->setReturnsByReference($this->parseOptionalByReference()); - $closure->addChild($this->parseFormalParameters()); - $closure = $this->parseOptionalBoundVariables($closure); - $closure = $this->parseCallableDeclarationAddition($closure); - $closure->addChild($this->parseScope()); - - return $this->setNodePositionsAndReturn($closure); - } - - /** - * Parses a function or a method and adds it to the parent context node. - * - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return void - */ - private function parseCallableDeclaration(AbstractASTCallable $callable) - { - $callable->addChild($this->parseFormalParameters()); - $callable = $this->parseCallableDeclarationAddition($callable); - - $this->consumeComments(); - if ($this->tokenizer->peek() == Tokens::T_CURLY_BRACE_OPEN) { - $callable->addChild($this->parseScope()); - } else { - $this->consumeToken(Tokens::T_SEMICOLON); - } - } - - /** - * Extension for version specific additions. - * - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return \PDepend\Source\AST\AbstractASTCallable - */ - protected function parseCallableDeclarationAddition($callable) - { - return $callable; - } - - /** - * Parses a trait use statement. - * - * @return ASTTraitUseStatement - * @since 1.0.0 - */ - private function parseTraitUseStatement() - { - $this->tokenStack->push(); - $this->consumeToken(Tokens::T_USE); - - $useStatement = $this->builder->buildAstTraitUseStatement(); - $useStatement->addChild($this->parseTraitReference()); - - $this->consumeComments(); - - while (Tokens::T_COMMA === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_COMMA); - $useStatement->addChild($this->parseTraitReference()); - } - - return $this->setNodePositionsAndReturn( - $this->parseOptionalTraitAdaptation($useStatement) - ); - } - - /** - * Parses a trait reference instance. - * - * @return \PDepend\Source\AST\ASTTraitReference - * @since 1.0.0 - */ - private function parseTraitReference() - { - $this->consumeComments(); - $this->tokenStack->push(); - - return $this->setNodePositionsAndReturn( - $this->builder->buildAstTraitReference( - $this->parseQualifiedName() - ) - ); - } - - /** - * Parses the adaptation list of the given use statement or simply reads - * the terminating semicolon, when no adaptation list exists. - * - * @param ASTTraitUseStatement $useStatement - * @return ASTTraitUseStatement - * @since 1.0.0 - */ - private function parseOptionalTraitAdaptation(ASTTraitUseStatement $useStatement) { - $this->consumeComments(); - - if (Tokens::T_CURLY_BRACE_OPEN === $this->tokenizer->peek()) { - $useStatement->addChild($this->parseTraitAdaptation()); - } else { - $this->consumeToken(Tokens::T_SEMICOLON); - } - - return $useStatement; - } - - /** - * Parses the adaptation expression of a trait use statement. - * - * @return ASTTraitAdaptation - * @since 1.0.0 - */ - private function parseTraitAdaptation() - { - $this->tokenStack->push(); - - $adaptation = $this->builder->buildAstTraitAdaptation(); - - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN); - - do { - $this->tokenStack->push(); - - $reference = $this->parseTraitMethodReference(); - $this->consumeComments(); - - $stmt = Tokens::T_AS === $this->tokenizer->peek() - ? $this->parseTraitAdaptationAliasStatement($reference) - : $this->parseTraitAdaptationPrecedenceStatement($reference); - - $this->consumeComments(); - $this->consumeToken(Tokens::T_SEMICOLON); - - $adaptation->addChild($this->setNodePositionsAndReturn($stmt)); - - $this->consumeComments(); - } while (Tokens::T_CURLY_BRACE_CLOSE !== $this->tokenizer->peek()); - - $this->consumeToken(Tokens::T_CURLY_BRACE_CLOSE); - - return $this->setNodePositionsAndReturn($adaptation); - } - - /** - * Parses a trait method reference and returns the found reference as an - * <b>array</b>. - * - * The returned array with contain only one element, when the referenced - * method is specified by the method's name, without the declaring trait. - * When the method reference contains the declaring trait the returned - * <b>array</b> will contain two elements. The first element is the plain - * method name and the second element is an instance of the - * {@link \PDepend\Source\AST\ASTTraitReference} class that represents the - * declaring trait. - * - * @return array - * @since 1.0.0 - */ - private function parseTraitMethodReference() - { - $this->tokenStack->push(); - - $qualifiedName = $this->parseQualifiedName(); - - $this->consumeComments(); - - if (Tokens::T_DOUBLE_COLON === $this->tokenizer->peek()) { - $traitReference = $this->setNodePositionsAndReturn( - $this->builder->buildAstTraitReference($qualifiedName) - ); - - $this->consumeToken(Tokens::T_DOUBLE_COLON); - $this->consumeComments(); - - return array($this->parseMethodName(), $traitReference); - } - - $this->tokenStack->pop(); - - return array($qualifiedName); - } - - /** - * Parses a trait adaptation alias statement. - * - * @param array $reference Parsed method reference array. - * - * @return \PDepend\Source\AST\ASTTraitAdaptationAlias - * @since 1.0.0 - */ - private function parseTraitAdaptationAliasStatement(array $reference) - { - $stmt = $this->builder->buildAstTraitAdaptationAlias($reference[0]); - - if (2 === count($reference)) { - $stmt->addChild($reference[1]); - } - - $this->consumeToken(Tokens::T_AS); - $this->consumeComments(); - - switch ($this->tokenizer->peek()) { - case Tokens::T_PUBLIC: - $stmt->setNewModifier(State::IS_PUBLIC); - $this->consumeToken(Tokens::T_PUBLIC); - $this->consumeComments(); - break; - case Tokens::T_PROTECTED: - $stmt->setNewModifier(State::IS_PROTECTED); - $this->consumeToken(Tokens::T_PROTECTED); - $this->consumeComments(); - break; - case Tokens::T_PRIVATE: - $stmt->setNewModifier(State::IS_PRIVATE); - $this->consumeToken(Tokens::T_PRIVATE); - $this->consumeComments(); - break; - } - - if (Tokens::T_SEMICOLON !== $this->tokenizer->peek()) { - $stmt->setNewName($this->parseMethodName()); - } - return $stmt; - } - - /** - * Parses a trait adaptation precedence statement. - * - * @param array $reference Parsed method reference array. - * @return \PDepend\Source\AST\ASTTraitAdaptationPrecedence - * @throws \PDepend\Source\Parser\InvalidStateException - * @since 1.0.0 - */ - private function parseTraitAdaptationPrecedenceStatement(array $reference) - { - if (count($reference) < 2) { - throw new InvalidStateException( - $this->tokenizer->next()->startLine, - $this->compilationUnit->getFileName(), - 'Expecting full qualified trait method name.' - ); - } - - $stmt = $this->builder->buildAstTraitAdaptationPrecedence($reference[0]); - $stmt->addChild($reference[1]); - - $this->consumeToken(Tokens::T_INSTEADOF); - $this->consumeComments(); - - $stmt->addChild($this->parseTraitReference()); - - $this->consumeComments(); - while (Tokens::T_COMMA === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_COMMA); - $stmt->addChild($this->parseTraitReference()); - $this->consumeComments(); - } - - return $stmt; - } - - /** - * Parses an allocation expression. - * - * <code> - * function foo() - * { - * // ------------- - * new bar\Baz(); - * // ------------- - * - * // --------- - * new Foo(); - * // --------- - * } - * </code> - * - * @return \PDepend\Source\AST\ASTAllocationExpression - * @since 0.9.6 - */ - private function parseAllocationExpression() - { - $this->tokenStack->push(); - - $token = $this->consumeToken(Tokens::T_NEW); - - $allocation = $this->builder->buildAstAllocationExpression($token->image); - $allocation = $this->parseAllocationExpressionTypeReference($allocation); - - if ($this->isNextTokenArguments()) { - $allocation->addChild($this->parseArguments()); - } - - return $this->setNodePositionsAndReturn($allocation); - } - - /** - * Parse the type reference used in an allocation expression. - * - * @param \PDepend\Source\AST\ASTAllocationExpression $allocation - * @return \PDepend\Source\AST\ASTNode - * @since 2.3 - */ - protected function parseAllocationExpressionTypeReference(ASTAllocationExpression $allocation) - { - return $this->parseExpressionTypeReference($allocation, true); - } - - /** - * Parses a eval-expression node. - * - * @return \PDepend\Source\AST\ASTEvalExpression - * @since 0.9.12 - */ - private function parseEvalExpression() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_EVAL); - - $expr = $this->builder->buildAstEvalExpression($token->image); - $expr->addChild($this->parseParenthesisExpression()); - - return $this->setNodePositionsAndReturn($expr); - } - - /** - * This method parses an exit-expression. - * - * @return \PDepend\Source\AST\ASTExitExpression - * @since 0.9.12 - */ - private function parseExitExpression() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_EXIT); - - $expr = $this->builder->buildAstExitExpression($token->image); - - $this->consumeComments(); - if ($this->tokenizer->peek() === Tokens::T_PARENTHESIS_OPEN) { - $expr->addChild($this->parseParenthesisExpression()); - } - return $this->setNodePositionsAndReturn($expr); - } - - /** - * Parses a clone-expression node. - * - * @return \PDepend\Source\AST\ASTCloneExpression - * @since 0.9.12 - */ - private function parseCloneExpression() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_CLONE); - - $expr = $this->builder->buildAstCloneExpression($token->image); - $expr->addChild($this->parseExpression()); - - return $this->setNodePositionsAndReturn($expr); - } - - /** - * Throws an exception if the given token is not a valid list unpacking opening token for current PHP level. - * - * @param int $tokenType - * @param \PDepend\Source\Tokenizer\Token $unexpectedToken - */ - private function ensureTokenIsListUnpackingOpening($tokenType, $unexpectedToken = null) - { - if (!$this->isListUnpacking($tokenType)) { - throw $this->getUnexpectedTokenException($unexpectedToken ?: $this->tokenizer->prevToken()); - } - } - - /** - * Return true if current PHP level supports keys in lists. - * - * @return bool - */ - protected function supportsKeysInList() - { - return false; - } - - /** - * This method parses a single list-statement node. - * - * @return \PDepend\Source\AST\ASTListExpression - * @since 0.9.12 - */ - private function parseListExpression() - { - $this->tokenStack->push(); - - $tokenType = $this->tokenizer->peek(); - $this->ensureTokenIsListUnpackingOpening($tokenType); - $shortSyntax = ($tokenType !== Tokens::T_LIST); - - if ($shortSyntax) { - $token = $this->consumeToken(Tokens::T_SQUARED_BRACKET_OPEN); - $list = $this->builder->buildAstListExpression($token->image); - } else { - $token = $this->consumeToken(Tokens::T_LIST); - $this->consumeComments(); - - $list = $this->builder->buildAstListExpression($token->image); - - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - } - - $this->consumeComments(); - - while (($tokenType = $this->tokenizer->peek()) !== Tokenizer::T_EOF) { - // The variable is optional: - // list(, , , , $something) = ...; - // is valid. - switch ($tokenType) { - case Tokens::T_COMMA: - $this->consumeToken(Tokens::T_COMMA); - $this->consumeComments(); - break; - case Tokens::T_SQUARED_BRACKET_CLOSE: - case Tokens::T_PARENTHESIS_CLOSE: - break 2; - case Tokens::T_LIST: - case Tokens::T_SQUARED_BRACKET_OPEN: - $list->addChild($this->parseListExpression()); - $this->consumeComments(); - break; - default: - $list->addChild($this->parseListSlotExpression()); - $this->consumeComments(); - break; - } - } - - $closeToken = $shortSyntax ? Tokens::T_SQUARED_BRACKET_CLOSE : Tokens::T_PARENTHESIS_CLOSE; - $this->consumeToken($closeToken); - - return $this->setNodePositionsAndReturn($list); - } - - /** - * Parse individual slot of a list() expression. - * - * @return \PDepend\Source\AST\ASTListExpression|ASTNode - */ - private function parseListSlotExpression() - { - $startToken = $this->tokenizer->currentToken(); - $node = $this->parseOptionalExpression(); - - if ($node && !$this->isReadWriteVariable($node) && $this->tokenizer->peek() === Tokens::T_DOUBLE_ARROW) { - if (!$this->supportsKeysInList()) { - throw $this->getUnexpectedTokenException($startToken); - } - - $this->consumeComments(); - $this->consumeToken(Tokens::T_DOUBLE_ARROW); - $this->consumeComments(); - - return in_array($this->tokenizer->peek(), array(Tokens::T_LIST, Tokens::T_SQUARED_BRACKET_OPEN)) - ? $this->parseListExpression() - : $this->parseVariableOrConstantOrPrimaryPrefix(); - } - - return $node ?: $this->parseVariableOrConstantOrPrimaryPrefix(); - } - - /** - * Parses a include-expression node. - * - * @return \PDepend\Source\AST\ASTIncludeExpression - * @since 0.9.12 - */ - private function parseIncludeExpression() - { - $expr = $this->builder->buildAstIncludeExpression(); - - return $this->parseRequireOrIncludeExpression($expr, Tokens::T_INCLUDE); - } - - /** - * Parses a include_once-expression node. - * - * @return \PDepend\Source\AST\ASTIncludeExpression - * @since 0.9.12 - */ - private function parseIncludeOnceExpression() - { - $expr = $this->builder->buildAstIncludeExpression(); - $expr->setOnce(); - - return $this->parseRequireOrIncludeExpression($expr, Tokens::T_INCLUDE_ONCE); - } - - /** - * Parses a require-expression node. - * - * @return \PDepend\Source\AST\ASTRequireExpression - * @since 0.9.12 - */ - private function parseRequireExpression() - { - $expr = $this->builder->buildAstRequireExpression(); - - return $this->parseRequireOrIncludeExpression($expr, Tokens::T_REQUIRE); - } - - /** - * Parses a require_once-expression node. - * - * @return \PDepend\Source\AST\ASTRequireExpression - * @since 0.9.12 - */ - private function parseRequireOnceExpression() - { - $expr = $this->builder->buildAstRequireExpression(); - $expr->setOnce(); - - return $this->parseRequireOrIncludeExpression($expr, Tokens::T_REQUIRE_ONCE); - } - - /** - * Parses a <b>require_once</b>-, <b>require</b>-, <b>include_once</b>- or - * <b>include</b>-expression node. - * - * @param \PDepend\Source\AST\ASTExpression $expr - * @param integer $type - * @return \PDepend\Source\AST\ASTExpression - * @since 0.9.12 - */ - private function parseRequireOrIncludeExpression(ASTExpression $expr, $type) - { - $this->tokenStack->push(); - - $this->consumeToken($type); - $this->consumeComments(); - - if ($this->tokenizer->peek() === Tokens::T_PARENTHESIS_OPEN) { - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - $expr->addChild($this->parseOptionalExpression()); - $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - } else { - $expr->addChild($this->parseOptionalExpression()); - } - - return $this->setNodePositionsAndReturn($expr); - } - - /** - * Parses a cast-expression node. - * - * @return \PDepend\Source\AST\ASTCastExpression - * @since 0.10.0 - */ - protected function parseCastExpression() - { - $token = $this->consumeToken($this->tokenizer->peek()); - - $expr = $this->builder->buildAstCastExpression($token->image); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $expr; - } - - /** - * This method will parse an increment-expression. Depending on the previous - * node this can be a {@link \PDepend\Source\AST\ASTPostIncrementExpression} or - * {@link \PDepend\Source\AST\ASTPostfixExpression}. - * - * @param array $expressions List of previous parsed expression nodes. - * @return \PDepend\Source\AST\ASTExpression - * @since 0.10.0 - */ - private function parseIncrementExpression(array &$expressions) - { - if ($this->isReadWriteVariable(end($expressions))) { - return $this->parsePostIncrementExpression(array_pop($expressions)); - } - return $this->parsePreIncrementExpression(); - } - - /** - * Parses a post increment-expression and adds the given child to that node. - * - * @param \PDepend\Source\AST\ASTNode $child The child expression node. - * - * @return \PDepend\Source\AST\ASTPostfixExpression - * @since 0.10.0 - */ - private function parsePostIncrementExpression(ASTNode $child) - { - $token = $this->consumeToken(Tokens::T_INC); - - $expr = $this->builder->buildAstPostfixExpression($token->image); - $expr->addChild($child); - $expr->configureLinesAndColumns( - $child->getStartLine(), - $token->endLine, - $child->getStartColumn(), - $token->endColumn - ); - - return $expr; - } - - /** - * Parses a pre increment-expression and adds the given child to that node. - * - * @return \PDepend\Source\AST\ASTPreIncrementExpression - * @since 0.10.0 - */ - private function parsePreIncrementExpression() - { - $token = $this->consumeToken(Tokens::T_INC); - - $expr = $this->builder->buildAstPreIncrementExpression(); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $expr; - } - - /** - * This method will parse an decrement-expression. Depending on the previous - * node this can be a {@link \PDepend\Source\AST\ASTPostDecrementExpression} or - * {@link \PDepend\Source\AST\ASTPostfixExpression}. - * - * @param array $expressions List of previous parsed expression nodes. - * - * @return \PDepend\Source\AST\ASTExpression - * @since 0.10.0 - */ - private function parseDecrementExpression(array &$expressions) - { - if ($this->isReadWriteVariable(end($expressions))) { - return $this->parsePostDecrementExpression(array_pop($expressions)); - } - return $this->parsePreDecrementExpression(); - } - - /** - * Parses a post decrement-expression and adds the given child to that node. - * - * @param \PDepend\Source\AST\ASTNode $child The child expression node. - * - * @return \PDepend\Source\AST\ASTPostfixExpression - * @since 0.10.0 - */ - private function parsePostDecrementExpression(ASTNode $child) - { - $token = $this->consumeToken(Tokens::T_DEC); - - $expr = $this->builder->buildAstPostfixExpression($token->image); - $expr->addChild($child); - $expr->configureLinesAndColumns( - $child->getStartLine(), - $token->endLine, - $child->getStartColumn(), - $token->endColumn - ); - - return $expr; - } - - /** - * Parses a pre decrement-expression and adds the given child to that node. - * - * @return \PDepend\Source\AST\ASTPreDecrementExpression - * @since 0.10.0 - */ - private function parsePreDecrementExpression() - { - $token = $this->consumeToken(Tokens::T_DEC); - - $expr = $this->builder->buildAstPreDecrementExpression(); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $expr; - } - - /** - * Parses one or more optional php <b>array</b> or <b>string</b> expressions. - * - * <code> - * --------- - * $array[0]; - * --------- - * - * ---------------- - * $array[1]['foo']; - * ---------------- - * - * ---------------- - * $string{1}[0]{0}; - * ---------------- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The parent/context node instance. - * - * @return \PDepend\Source\AST\ASTNode - * @since 0.9.12 - */ - protected function parseOptionalIndexExpression(ASTNode $node) - { - $this->consumeComments(); - - switch ($this->tokenizer->peek()) { - case Tokens::T_CURLY_BRACE_OPEN: - return $this->parseStringIndexExpression($node); - case Tokens::T_SQUARED_BRACKET_OPEN: - return $this->parseArrayIndexExpression($node); - } - - return $node; - } - - /** - * Parses an index expression as it is valid to access elements in a php - * string or array. - * - * @param \PDepend\Source\AST\ASTNode $node The context source node. - * @param \PDepend\Source\AST\ASTExpression $expr The concrete index expression. - * @param integer $open The open token type. - * @param integer $close The close token type. - * - * @return \PDepend\Source\AST\ASTNode - * @since 0.9.12 - */ - private function parseIndexExpression( - \PDepend\Source\AST\ASTNode $node, - \PDepend\Source\AST\ASTExpression $expr, - $open, - $close - ) { - $this->consumeToken($open); - - if (($child = $this->parseOptionalExpression()) != null) { - $expr->addChild($child); - } - - $token = $this->consumeToken($close); - - $expr->configureLinesAndColumns( - $node->getStartLine(), - $token->endLine, - $node->getStartColumn(), - $token->endColumn - ); - - return $this->parseOptionalIndexExpression($expr); - } - - /** - * Parses a mandatory array index expression. - * - * <code> - * // --- - * $array[0]; - * // --- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The context source node. - * - * @return \PDepend\Source\AST\ASTArrayIndexExpression - * @since 0.9.12 - */ - private function parseArrayIndexExpression(ASTNode $node) - { - $expr = $this->builder->buildAstArrayIndexExpression(); - $expr->addChild($node); - - return $this->parseIndexExpression( - $node, - $expr, - Tokens::T_SQUARED_BRACKET_OPEN, - Tokens::T_SQUARED_BRACKET_CLOSE - ); - } - - /** - * Parses a mandatory array index expression. - * - * <code> - * // --- - * $string{0}; - * // --- - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The context source node. - * - * @return \PDepend\Source\AST\ASTStringIndexExpression - * @since 0.9.12 - */ - private function parseStringIndexExpression(ASTNode $node) - { - $expr = $this->builder->buildAstStringIndexExpression(); - $expr->addChild($node); - - return $this->parseIndexExpression( - $node, - $expr, - Tokens::T_CURLY_BRACE_OPEN, - Tokens::T_CURLY_BRACE_CLOSE - ); - } - - /** - * This method checks if the next available token starts an arguments node. - * - * @return boolean - * @since 0.9.8 - */ - protected function isNextTokenArguments() - { - $this->consumeComments(); - return $this->tokenizer->peek() === Tokens::T_PARENTHESIS_OPEN; - } - - /** - * This method configures the given node with its start and end positions. - * - * @param \PDepend\Source\AST\ASTNode $node - * @param array|null $tokens - * @return \PDepend\Source\AST\ASTNode - * @since 0.9.8 - */ - protected function setNodePositionsAndReturn(ASTNode $node, array &$tokens = null) - { - $tokens = $this->stripTrailingComments($this->tokenStack->pop()); - - $end = $tokens[count($tokens) - 1]; - $start = $tokens[0]; - - $node->configureLinesAndColumns( - $start->startLine, - $end->endLine, - $start->startColumn, - $end->endColumn - ); - - return $node; - } - - /** - * Strips all trailing comments from the given token stream. - * - * @param Token[] $tokens Original token stream. - * @return Token[] - * @since 1.0.0 - */ - private function stripTrailingComments(array $tokens) - { - $comments = array(Tokens::T_COMMENT, Tokens::T_DOC_COMMENT); - - while (count($tokens) > 1 && in_array(end($tokens)->type, $comments)) { - array_pop($tokens); - } - return $tokens; - } - - /** - * This method parse an instance of expression with its associated class or - * interface reference. - * - * <code> - * ---------------- - * ($object instanceof Clazz); - * ---------------- - * - * ------------------------ - * ($object instanceof Clazz::$clazz); - * ------------------------ - * - * ----------------- - * ($object instanceof $clazz); - * ----------------- - * - * ----------------------- - * ($object instanceof $clazz->type); - * ----------------------- - * - * ----------------------------- - * ($object instanceof static|self|parent); - * ----------------------------- - * </code> - * - * @return \PDepend\Source\AST\ASTInstanceOfExpression - * @since 0.9.6 - */ - private function parseInstanceOfExpression() - { - // Consume the "instanceof" keyword and strip comments - $token = $this->consumeToken(Tokens::T_INSTANCEOF); - - return $this->parseExpressionTypeReference( - $this->builder->buildAstInstanceOfExpression($token->image), - false - ); - } - - /** - * Parses an isset-expression node. - * - * <code> - * // ----------- - * if (isset($foo)) { - * // ----------- - * } - * - * // ----------------------- - * if (isset($foo, $bar, $baz)) { - * // ----------------------- - * } - * </code> - * - * @return \PDepend\Source\AST\ASTIssetExpression - * @since 0.9.12 - */ - private function parseIssetExpression() - { - $startToken = $this->consumeToken(Tokens::T_ISSET); - $this->consumeComments(); - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - - $expr = $this->builder->buildAstIssetExpression(); - $expr = $this->parseVariableList($expr); - - $stopToken = $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - - $expr->configureLinesAndColumns( - $startToken->startLine, - $stopToken->endLine, - $startToken->startColumn, - $stopToken->endColumn - ); - - return $expr; - } - - /** - * @param boolean $classRef - * @return \PDepend\Source\AST\ASTClassOrInterfaceReference|ASTNode|\PDepend\Source\AST\ASTSelfReference|\PDepend\Source\AST\ASTStaticReference - */ - private function parseStandAloneExpressionTypeReference($classRef) - { - // Peek next token and look for a static type identifier - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - switch ($tokenType) { - case Tokens::T_DOLLAR: - case Tokens::T_VARIABLE: - // TODO: Parse variable or Member Primary Prefix + Property Postfix - $ref = $this->parseVariableOrFunctionPostfixOrMemberPrimaryPrefix(); - break; - case Tokens::T_SELF: - $ref = $this->parseSelfReference($this->consumeToken(Tokens::T_SELF)); - break; - case Tokens::T_PARENT: - $ref = $this->parseParentReference($this->consumeToken(Tokens::T_PARENT)); - break; - case Tokens::T_STATIC: - $ref = $this->parseStaticReference($this->consumeToken(Tokens::T_STATIC)); - break; - default: - $ref = $this->parseClassOrInterfaceReference($classRef); - break; - } - - return $ref; - } - - /** - * This method parses a type identifier as it is used in expression nodes - * like {@link \PDepend\Source\AST\ASTInstanceOfExpression} or an object - * allocation node like {@link \PDepend\Source\AST\ASTAllocationExpression}. - * - * @param \PDepend\Source\AST\ASTNode $expr - * @param boolean $classRef - * @return \PDepend\Source\AST\ASTNode - */ - protected function parseExpressionTypeReference(ASTNode $expr, $classRef) - { - $expr->addChild( - $this->parseOptionalMemberPrimaryPrefix( - $this->parseOptionalStaticMemberPrimaryPrefix( - $this->parseStandAloneExpressionTypeReference($classRef) - ) - ) - ); - - return $expr; - } - - /** - * This method parses a conditional-expression. - * - * <code> - * -------------- - * $foo = ($bar ? 42 : 23); - * -------------- - * </code> - * - * @return \PDepend\Source\AST\ASTConditionalExpression - * @since 0.9.8 - */ - protected function parseConditionalExpression() - { - $this->tokenStack->push(); - $this->consumeToken(Tokens::T_QUESTION_MARK); - - $expr = $this->builder->buildAstConditionalExpression(); - if (($child = $this->parseOptionalExpression()) != null) { - $expr->addChild($child); - } - - $this->consumeToken(Tokens::T_COLON); - - $expr->addChild($this->parseExpression()); - - return $this->setNodePositionsAndReturn($expr); - } - - /** - * This method parses a shift left expression node. - * - * @return \PDepend\Source\AST\ASTShiftLeftExpression - * @since 1.0.1 - */ - protected function parseShiftLeftExpression() - { - $token = $this->consumeToken(Tokens::T_SL); - - $expr = $this->builder->buildAstShiftLeftExpression(); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - return $expr; - } - - /** - * This method parses a shift right expression node. - * - * @return \PDepend\Source\AST\ASTShiftRightExpression - * @since 1.0.1 - */ - protected function parseShiftRightExpression() - { - $token = $this->consumeToken(Tokens::T_SR); - - $expr = $this->builder->buildAstShiftRightExpression(); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - return $expr; - } - - /** - * This method parses a boolean and-expression. - * - * @return \PDepend\Source\AST\ASTBooleanAndExpression - * @since 0.9.8 - */ - protected function parseBooleanAndExpression() - { - $token = $this->consumeToken(Tokens::T_BOOLEAN_AND); - - $expr = $this->builder->buildAstBooleanAndExpression(); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - return $expr; - } - - /** - * This method parses a boolean or-expression. - * - * @return \PDepend\Source\AST\ASTBooleanOrExpression - * @since 0.9.8 - */ - protected function parseBooleanOrExpression() - { - $token = $this->consumeToken(Tokens::T_BOOLEAN_OR); - - $expr = $this->builder->buildAstBooleanOrExpression(); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - return $expr; - } - - /** - * This method parses a logical <b>and</b>-expression. - * - * @return \PDepend\Source\AST\ASTLogicalAndExpression - * @since 0.9.8 - */ - protected function parseLogicalAndExpression() - { - $token = $this->consumeToken(Tokens::T_LOGICAL_AND); - - $expr = $this->builder->buildAstLogicalAndExpression(); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - return $expr; - } - - /** - * This method parses a logical <b>or</b>-expression. - * - * @return \PDepend\Source\AST\ASTLogicalOrExpression - * @since 0.9.8 - */ - protected function parseLogicalOrExpression() - { - $token = $this->consumeToken(Tokens::T_LOGICAL_OR); - - $expr = $this->builder->buildAstLogicalOrExpression(); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - return $expr; - } - - /** - * This method parses a logical <b>xor</b>-expression. - * - * @return \PDepend\Source\AST\ASTLogicalXorExpression - * @since 0.9.8 - */ - protected function parseLogicalXorExpression() - { - $token = $this->consumeToken(Tokens::T_LOGICAL_XOR); - - $expr = $this->builder->buildAstLogicalXorExpression(); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - return $expr; - } - - /** - * Parses a class or interface reference node. - * - * @param boolean $classReference Force a class reference. - * - * @return \PDepend\Source\AST\ASTClassOrInterfaceReference - * @since 0.9.8 - */ - private function parseClassOrInterfaceReference($classReference) - { - $this->tokenStack->push(); - - return $this->setNodePositionsAndReturn( - $this->builder->buildAstNeededReference( - $this->parseQualifiedName(), - $classReference - ) - ); - } - - /** - * This method parses a brace expression and adds all parsed node instances - * to the given {@link \PDepend\Source\AST\ASTNode} object. Finally it returns - * the prepared input node. - * - * A brace expression can be a compound: - * - * <code> - * $this->{$foo ? 'foo' : 'bar'}(); - * </code> - * - * or a parameter list: - * - * <code> - * $this->foo($bar, $baz); - * </code> - * - * or an array index: - * - * <code> - * $foo[$bar]; - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node - * @param \PDepend\Source\Tokenizer\Token $start - * @param integer $closeToken - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\TokenStreamEndException - * @since 0.9.6 - */ - protected function parseBraceExpression( - ASTNode $node, - Token $start, - $closeToken - ) { - if (is_object($expr = $this->parseOptionalExpression())) { - $node->addChild($expr); - } - - $end = $this->consumeToken($closeToken); - - $node->configureLinesAndColumns( - $start->startLine, - $end->endLine, - $start->startColumn, - $end->endColumn - ); - return $node; - } - - /** - * Parses the body of the given statement instance and adds all parsed nodes - * to that statement. - * - * @param \PDepend\Source\AST\ASTStatement $stmt The owning statement. - * - * @return \PDepend\Source\AST\ASTStatement - * @since 0.9.12 - */ - private function parseStatementBody(\PDepend\Source\AST\ASTStatement $stmt) - { - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - if ($tokenType === Tokens::T_CURLY_BRACE_OPEN) { - $stmt->addChild($this->parseRegularScope()); - } elseif ($tokenType === Tokens::T_COLON) { - $stmt->addChild($this->parseAlternativeScope()); - } else { - $stmt->addChild($this->parseStatement()); - } - return $stmt; - } - - /** - * Parse a scope enclosed by curly braces. - * - * @return \PDepend\Source\AST\ASTScope - * @since 0.9.12 - */ - private function parseRegularScope() - { - $this->tokenStack->push(); - - $this->consumeComments(); - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN); - - $scope = $this->parseScopeStatements(); - - $this->consumeToken(Tokens::T_CURLY_BRACE_CLOSE); - return $this->setNodePositionsAndReturn($scope); - } - - /** - * Parses the scope of a statement that is surrounded with PHP's alternative - * syntax for statements. - * - * @return \PDepend\Source\AST\ASTScopeStatement - * @since 0.10.0 - */ - private function parseAlternativeScope() - { - $this->tokenStack->push(); - $this->consumeToken(Tokens::T_COLON); - - $scope = $this->parseScopeStatements(); - - $this->parseOptionalAlternativeScopeTermination(); - return $this->setNodePositionsAndReturn($scope); - } - - /** - * Parses all statements that exist in a scope an adds them to a scope - * instance. - * - * @return \PDepend\Source\AST\ASTScopeStatement - * @since 0.10.0 - */ - private function parseScopeStatements() - { - $scope = $this->builder->buildAstScopeStatement(); - while (($child = $this->parseOptionalStatement()) != null) { - if ($child instanceof \PDepend\Source\AST\ASTNode) { - $scope->addChild($child); - } - } - return $scope; - } - - /** - * Parses the termination of a scope statement that uses PHP's laternative - * syntax format. - * - * @return void - * @since 0.10.0 - */ - private function parseOptionalAlternativeScopeTermination() - { - $tokenType = $this->tokenizer->peek(); - if ($this->isAlternativeScopeTermination($tokenType)) { - $this->parseAlternativeScopeTermination($tokenType); - } - } - - - /** - * This method returns <b>true</b> when the given token identifier represents - * the end token of a alternative scope termination symbol. Otherwise this - * method will return <b>false</b>. - * - * @param integer $tokenType The token type identifier. - * - * @return boolean - * @since 0.10.0 - */ - private function isAlternativeScopeTermination($tokenType) - { - return in_array( - $tokenType, - array( - Tokens::T_ENDDECLARE, - Tokens::T_ENDFOR, - Tokens::T_ENDFOREACH, - Tokens::T_ENDIF, - Tokens::T_ENDSWITCH, - Tokens::T_ENDWHILE - ) - ); - } - - /** - * Parses a series of tokens that represent an alternative scope termination. - * - * @param integer $tokenType The token type identifier. - * - * @return void - * @since 0.10.0 - */ - private function parseAlternativeScopeTermination($tokenType) - { - $this->consumeToken($tokenType); - $this->consumeComments(); - - if ($this->tokenizer->peek() === Tokens::T_SEMICOLON) { - $this->consumeToken(Tokens::T_SEMICOLON); - } else { - $this->parseNonePhpCode(); - } - } - - /** - * This method parses multiple expressions and adds them as children to the - * given <b>$exprList</b> node. - * - * @param \PDepend\Source\AST\ASTNode $exprList - * @return \PDepend\Source\AST\ASTNode - * @since 1.0.0 - */ - private function parseExpressionList(ASTNode $exprList) - { - $this->consumeComments(); - while ($expr = $this->parseOptionalExpression()) { - $exprList->addChild($expr); - - $this->consumeComments(); - if (Tokens::T_COMMA === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_COMMA); - $this->consumeComments(); - } else { - break; - } - } - - return $exprList; - } - - /** - * This method parses an expression node and returns it. When no expression - * was found this method will throw an InvalidStateException. - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @since 1.0.1 - */ - private function parseExpression() - { - if (null === ($expr = $this->parseOptionalExpression())) { - $token = $this->consumeToken($this->tokenizer->peek()); - - throw new InvalidStateException( - $token->startLine, - $this->compilationUnit->getFileName(), - 'Mandatory expression expected.' - ); - } - return $expr; - } - - /** - * This method optionally parses an expression node and returns it. When no - * expression was found this method will return <b>null</b>. - * - * @return \PDepend\Source\AST\ASTNode|null - * @throws \PDepend\Source\Parser\ParserException - * @since 0.9.6 - */ - protected function parseOptionalExpression() - { - $expressions = array(); - - while (($tokenType = $this->tokenizer->peek()) != Tokenizer::T_EOF) { - $expr = null; - - switch ($tokenType) { - case Tokens::T_COMMA: - case Tokens::T_AS: - case Tokens::T_BREAK: - case Tokens::T_CLOSE_TAG: - case Tokens::T_COLON: - case Tokens::T_CONTINUE: - case Tokens::T_CURLY_BRACE_CLOSE: - case Tokens::T_DECLARE: - case Tokens::T_DO: - case Tokens::T_DOUBLE_ARROW: - case Tokens::T_ECHO: - case Tokens::T_END_HEREDOC: - case Tokens::T_ENDFOREACH: - case Tokens::T_FOR: - case Tokens::T_FOREACH: - case Tokens::T_GLOBAL: - case Tokens::T_GOTO: - case Tokens::T_IF: - case Tokens::T_PARENTHESIS_CLOSE: - case Tokens::T_RETURN: - case Tokens::T_SEMICOLON: - case Tokens::T_SQUARED_BRACKET_CLOSE: - case Tokens::T_SWITCH: - case Tokens::T_THROW: - case Tokens::T_TRY: - case Tokens::T_UNSET: - case Tokens::T_WHILE: - break 2; - case Tokens::T_SELF: - case Tokens::T_STRING: - case Tokens::T_PARENT: - case Tokens::T_STATIC: - case Tokens::T_DOLLAR: - case Tokens::T_VARIABLE: - case Tokens::T_BACKSLASH: - case Tokens::T_NAMESPACE: - $expressions[] = $this->parseVariableOrConstantOrPrimaryPrefix(); - break; - case ($this->isArrayStartDelimiter()): - $expressions[] = $this->doParseArray(); - break; - case Tokens::T_NULL: - case Tokens::T_TRUE: - case Tokens::T_FALSE: - case Tokens::T_LNUMBER: - case Tokens::T_DNUMBER: - case Tokens::T_BACKTICK: - case Tokens::T_DOUBLE_QUOTE: - case Tokens::T_CONSTANT_ENCAPSED_STRING: - $expressions[] = $this->parseLiteralOrString(); - break; - case Tokens::T_NEW: - $expressions[] = $this->parseAllocationExpression(); - break; - case Tokens::T_EVAL: - $expressions[] = $this->parseEvalExpression(); - break; - case Tokens::T_CLONE: - $expressions[] = $this->parseCloneExpression(); - break; - case Tokens::T_INSTANCEOF: - $expressions[] = $this->parseInstanceOfExpression(); - break; - case Tokens::T_ISSET: - $expressions[] = $this->parseIssetExpression(); - break; - case Tokens::T_LIST: - case Tokens::T_SQUARED_BRACKET_OPEN: - $expressions[] = $this->parseListExpression(); - break; - case Tokens::T_QUESTION_MARK: - $expressions[] = $this->parseConditionalExpression(); - break; - case Tokens::T_BOOLEAN_AND: - $expressions[] = $this->parseBooleanAndExpression(); - break; - case Tokens::T_BOOLEAN_OR: - $expressions[] = $this->parseBooleanOrExpression(); - break; - case Tokens::T_LOGICAL_AND: - $expressions[] = $this->parseLogicalAndExpression(); - break; - case Tokens::T_LOGICAL_OR: - $expressions[] = $this->parseLogicalOrExpression(); - break; - case Tokens::T_LOGICAL_XOR: - $expressions[] = $this->parseLogicalXorExpression(); - break; - case Tokens::T_FUNCTION: - $expressions[] = $this->parseClosureDeclaration(); - break; - case Tokens::T_FN: - $expressions[] = $this->parseLambdaFunctionDeclaration(); - break; - case Tokens::T_PARENTHESIS_OPEN: - $expressions[] = $this->parseParenthesisExpressionOrPrimaryPrefix(); - break; - case Tokens::T_EXIT: - $expressions[] = $this->parseExitExpression(); - break; - case Tokens::T_START_HEREDOC: - $expressions[] = $this->parseHeredoc(); - break; - case Tokens::T_CURLY_BRACE_OPEN: - $expressions[] = $this->parseBraceExpression( - $this->builder->buildAstExpression(), - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN), - Tokens::T_CURLY_BRACE_CLOSE - ); - break; - case Tokens::T_INCLUDE: - $expressions[] = $this->parseIncludeExpression(); - break; - case Tokens::T_INCLUDE_ONCE: - $expressions[] = $this->parseIncludeOnceExpression(); - break; - case Tokens::T_REQUIRE: - $expressions[] = $this->parseRequireExpression(); - break; - case Tokens::T_REQUIRE_ONCE: - $expressions[] = $this->parseRequireOnceExpression(); - break; - case Tokens::T_DEC: - $expressions[] = $this->parseDecrementExpression($expressions); - break; - case Tokens::T_INC: - $expressions[] = $this->parseIncrementExpression($expressions); - break; - case Tokens::T_SL: - $expressions[] = $this->parseShiftLeftExpression(); - break; - case Tokens::T_SR: - $expressions[] = $this->parseShiftRightExpression(); - break; - case Tokens::T_DIR: - case Tokens::T_FILE: - case Tokens::T_LINE: - case Tokens::T_NS_C: - case Tokens::T_FUNC_C: - case Tokens::T_CLASS_C: - case Tokens::T_METHOD_C: - $expressions[] = $this->parseConstant(); - break; - case Tokens::T_INT_CAST: - case Tokens::T_BOOL_CAST: - case Tokens::T_ARRAY_CAST: - case Tokens::T_UNSET_CAST: - case Tokens::T_OBJECT_CAST: - case Tokens::T_DOUBLE_CAST: - case Tokens::T_STRING_CAST: - $expressions[] = $this->parseCastExpression(); - break; - case Tokens::T_EQUAL: - case Tokens::T_OR_EQUAL: - case Tokens::T_SL_EQUAL: - case Tokens::T_SR_EQUAL: - case Tokens::T_AND_EQUAL: - case Tokens::T_DIV_EQUAL: - case Tokens::T_MOD_EQUAL: - case Tokens::T_MUL_EQUAL: - case Tokens::T_XOR_EQUAL: - case Tokens::T_PLUS_EQUAL: - case Tokens::T_MINUS_EQUAL: - case Tokens::T_CONCAT_EQUAL: - case Tokens::T_COALESCE_EQUAL: - $expressions[] = $this->parseAssignmentExpression( - array_pop($expressions) - ); - break; - // TODO: Handle comments here - case Tokens::T_COMMENT: - case Tokens::T_DOC_COMMENT: - $this->consumeToken($tokenType); - break; - case Tokens::T_PRINT: // TODO: Implement print expression - $token = $this->consumeToken($tokenType); - - $expr = $this->builder->buildAstPrintExpression(); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - $expressions[] = $expr; - break; - case Tokens::T_ELLIPSIS: - $this->checkEllipsisInExpressionSupport(); - case Tokens::T_STRING_VARNAME: // TODO: Implement this - case Tokens::T_PLUS: // TODO: Make this a arithmetic expression - case Tokens::T_MINUS: - case Tokens::T_MUL: - case Tokens::T_DIV: - case Tokens::T_MOD: - case Tokens::T_IS_EQUAL: // TODO: Implement compare expressions - case Tokens::T_IS_NOT_EQUAL: - case Tokens::T_IS_IDENTICAL: - case Tokens::T_IS_NOT_IDENTICAL: - case Tokens::T_IS_GREATER_OR_EQUAL: - case Tokens::T_IS_SMALLER_OR_EQUAL: - case Tokens::T_ANGLE_BRACKET_OPEN: - case Tokens::T_ANGLE_BRACKET_CLOSE: - case Tokens::T_EMPTY: - case Tokens::T_CONCAT: - case Tokens::T_BITWISE_OR: - case Tokens::T_BITWISE_AND: - case Tokens::T_BITWISE_NOT: - case Tokens::T_BITWISE_XOR: - $token = $this->consumeToken($tokenType); - - $expr = $this->builder->buildAstExpression($token->image); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - $expressions[] = $expr; - break; - case Tokens::T_AT: - case Tokens::T_EXCLAMATION_MARK: - $token = $this->consumeToken($tokenType); - - $expr = $this->builder->buildAstUnaryExpression($token->image); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - $expressions[] = $expr; - break; - case Tokens::T_YIELD: - $expressions[] = $this->parseYield(); - break; - default: - $expressions[] = $this->parseOptionalExpressionForVersion(); - break; - } - } - - $expressions = $this->reduce($expressions); - - $count = count($expressions); - if ($count == 0) { - return null; - } elseif ($count == 1) { - return $expressions[0]; - } - - $expr = $this->builder->buildAstExpression(); - foreach ($expressions as $node) { - $expr->addChild($node); - } - $expr->configureLinesAndColumns( - $expressions[0]->getStartLine(), - $expressions[$count - 1]->getEndLine(), - $expressions[0]->getStartColumn(), - $expressions[$count - 1]->getEndColumn() - ); - - return $expr; - } - - /** - * This method will be called when the base parser cannot handle an expression - * in the base version. In this method you can implement version specific - * expressions. - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\UnexpectedTokenException - * @since 2.2 - */ - protected function parseOptionalExpressionForVersion() - { - throw $this->getUnexpectedTokenException(); - } - - /** - * Applies all reduce rules against the given expression list. - * - * @param \PDepend\Source\AST\ASTExpression[] $expressions Unprepared input - * array with parsed expression nodes found in the source tree. - * - * @return \PDepend\Source\AST\ASTExpression[] - * @since 0.10.0 - */ - protected function reduce(array $expressions) - { - return $this->reduceUnaryExpression($expressions); - } - - /** - * Reduces all unary-expressions in the given expression list. - * - * @param \PDepend\Source\AST\ASTExpression[] $expressions Unprepared input - * array with parsed expression nodes found in the source tree. - * - * @return \PDepend\Source\AST\ASTExpression[] - * @since 0.10.0 - */ - private function reduceUnaryExpression(array $expressions) - { - for ($i = count($expressions) - 2; $i >= 0; --$i) { - $expr = $expressions[$i]; - if ($expr instanceof \PDepend\Source\AST\ASTUnaryExpression) { - $child = $expressions[$i + 1]; - - $expr->addChild($child); - - $expr->configureLinesAndColumns( - $expr->getStartLine(), - $child->getEndLine(), - $expr->getStartColumn(), - $child->getEndColumn() - ); - - unset($expressions[$i + 1]); - } - } - return array_values($expressions); - } - - /** - * This method parses a switch statement. - * - * @return \PDepend\Source\AST\ASTSwitchStatement - * @since 0.9.8 - */ - private function parseSwitchStatement() - { - $this->tokenStack->push(); - $this->consumeToken(Tokens::T_SWITCH); - - $switch = $this->builder->buildAstSwitchStatement(); - $switch->addChild($this->parseParenthesisExpression()); - $this->parseSwitchStatementBody($switch); - - return $this->setNodePositionsAndReturn($switch); - } - - /** - * Parses the body of a switch statement. - * - * @param \PDepend\Source\AST\ASTSwitchStatement $switch The parent switch stmt. - * - * @return \PDepend\Source\AST\ASTSwitchStatement - * @since 0.9.8 - */ - private function parseSwitchStatementBody(ASTSwitchStatement $switch) - { - $this->consumeComments(); - if ($this->tokenizer->peek() === Tokens::T_CURLY_BRACE_OPEN) { - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN); - } else { - $this->consumeToken(Tokens::T_COLON); - } - - while (($tokenType = $this->tokenizer->peek()) !== Tokenizer::T_EOF) { - switch ($tokenType) { - case Tokens::T_CLOSE_TAG: - $this->parseNonePhpCode(); - break; - case Tokens::T_ENDSWITCH: - $this->parseAlternativeScopeTermination(Tokens::T_ENDSWITCH); - return $switch; - case Tokens::T_CURLY_BRACE_CLOSE: - $this->consumeToken(Tokens::T_CURLY_BRACE_CLOSE); - return $switch; - case Tokens::T_CASE: - $switch->addChild($this->parseSwitchLabel()); - break; - case Tokens::T_DEFAULT: - $switch->addChild($this->parseSwitchLabelDefault()); - break; - case Tokens::T_COMMENT: - case Tokens::T_DOC_COMMENT: - $this->consumeToken($tokenType); - break; - default: - break 2; - } - } - - throw $this->getUnexpectedTokenException(); - } - - /** - * This method parses a case label of a switch statement. - * - * @return \PDepend\Source\AST\ASTSwitchLabel - * @since 0.9.8 - */ - private function parseSwitchLabel() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_CASE); - - $label = $this->builder->buildAstSwitchLabel($token->image); - $label->addChild($this->parseExpression()); - - if ($this->tokenizer->peek() === Tokens::T_COLON) { - $this->consumeToken(Tokens::T_COLON); - } else { - $this->consumeToken(Tokens::T_SEMICOLON); - } - - $this->parseSwitchLabelBody($label); - - return $this->setNodePositionsAndReturn($label); - } - - /** - * This method parses the default label of a switch statement. - * - * @return \PDepend\Source\AST\ASTSwitchLabel - * @since 0.9.8 - */ - private function parseSwitchLabelDefault() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_DEFAULT); - - $this->consumeComments(); - if ($this->tokenizer->peek() === Tokens::T_COLON) { - $this->consumeToken(Tokens::T_COLON); - } else { - $this->consumeToken(Tokens::T_SEMICOLON); - } - - $label = $this->builder->buildAstSwitchLabel($token->image); - $label->setDefault(); - - $this->parseSwitchLabelBody($label); - - return $this->setNodePositionsAndReturn($label); - } - - /** - * Parses the body of an switch label node. - * - * @param \PDepend\Source\AST\ASTSwitchLabel $label The context switch label. - * @return \PDepend\Source\AST\ASTSwitchLabel - */ - private function parseSwitchLabelBody(\PDepend\Source\AST\ASTSwitchLabel $label) - { - $curlyBraceCount = 0; - - $tokenType = $this->tokenizer->peek(); - while ($tokenType !== Tokenizer::T_EOF) { - switch ($tokenType) { - case Tokens::T_CURLY_BRACE_OPEN: - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN); - ++$curlyBraceCount; - break; - case Tokens::T_CURLY_BRACE_CLOSE: - if ($curlyBraceCount === 0) { - return $label; - } - $this->consumeToken(Tokens::T_CURLY_BRACE_CLOSE); - --$curlyBraceCount; - break; - case Tokens::T_CLOSE_TAG: - $this->parseNonePhpCode(); - break; - case Tokens::T_CASE: - case Tokens::T_DEFAULT: - case Tokens::T_ENDSWITCH: - return $label; - default: - $statement = $this->parseOptionalStatement(); - if ($statement === null) { - $this->consumeToken($tokenType); - } elseif ($statement instanceof ASTNode) { - $label->addChild($statement); - } - // TODO: Change the <else if> into and <else> when the ast - // implementation is finished. - break; - } - $tokenType = $this->tokenizer->peek(); - } - throw new TokenStreamEndException($this->tokenizer); - } - - /** - * Parses the termination token for a statement. This termination token can - * be a semicolon or a closing php tag. - * - * @return void - * @since 0.9.12 - */ - private function parseStatementTermination() - { - $this->consumeComments(); - if ($this->tokenizer->peek() === Tokens::T_SEMICOLON) { - $this->consumeToken(Tokens::T_SEMICOLON); - } else { - $this->parseNonePhpCode(); - } - } - - /** - * This method parses a try-statement + associated catch-statements. - * - * @return \PDepend\Source\AST\ASTTryStatement - * @since 0.9.12 - */ - private function parseTryStatement() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_TRY); - - $stmt = $this->builder->buildAstTryStatement($token->image); - $stmt->addChild($this->parseRegularScope()); - - $this->consumeComments(); - - if (false === in_array($this->tokenizer->peek(), array(Tokens::T_CATCH, Tokens::T_FINALLY))) { - throw $this->getUnexpectedTokenException(); - } - - while ($this->tokenizer->peek() === Tokens::T_CATCH) { - $stmt->addChild($this->parseCatchStatement()); - $this->consumeComments(); - } - - while ($this->tokenizer->peek() === Tokens::T_FINALLY) { - $stmt->addChild($this->parseFinallyStatement()); - $this->consumeComments(); - } - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses a throw-statement. - * - * @return \PDepend\Source\AST\ASTThrowStatement - * @since 0.9.12 - */ - private function parseThrowStatement() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_THROW); - - $stmt = $this->builder->buildAstThrowStatement($token->image); - $stmt->addChild($this->parseExpression()); - - $this->parseStatementTermination(); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses a goto-statement. - * - * @return \PDepend\Source\AST\ASTGotoStatement - * @since 0.9.12 - */ - private function parseGotoStatement() - { - $this->tokenStack->push(); - - $this->consumeToken(Tokens::T_GOTO); - $this->consumeComments(); - - $token = $this->consumeToken(Tokens::T_STRING); - - $this->parseStatementTermination(); - - $stmt = $this->builder->buildAstGotoStatement($token->image); - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses a label-statement. - * - * @return \PDepend\Source\AST\ASTLabelStatement - * @since 0.9.12 - */ - private function parseLabelStatement() - { - $this->tokenStack->push(); - - $token = $this->consumeToken(Tokens::T_STRING); - $this->consumeComments(); - $this->consumeToken(Tokens::T_COLON); - - return $this->setNodePositionsAndReturn( - $this->builder->buildAstLabelStatement($token->image) - ); - } - - /** - * This method parses a global-statement. - * - * @return \PDepend\Source\AST\ASTGlobalStatement - * @since 0.9.12 - */ - private function parseGlobalStatement() - { - $this->tokenStack->push(); - $this->consumeToken(Tokens::T_GLOBAL); - - $stmt = $this->builder->buildAstGlobalStatement(); - $stmt = $this->parseVariableList($stmt); - - $this->parseStatementTermination(); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses a unset-statement. - * - * @return \PDepend\Source\AST\ASTUnsetStatement - * @since 0.9.12 - */ - private function parseUnsetStatement() - { - $this->tokenStack->push(); - - $this->consumeToken(Tokens::T_UNSET); - $this->consumeComments(); - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - - $stmt = $this->builder->buildAstUnsetStatement(); - $stmt = $this->parseVariableList($stmt); - - $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - - $this->parseStatementTermination(); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses a catch-statement. - * - * @return \PDepend\Source\AST\ASTCatchStatement - * @since 0.9.8 - */ - private function parseCatchStatement() - { - $this->tokenStack->push(); - $this->consumeComments(); - - $token = $this->consumeToken(Tokens::T_CATCH); - - $catch = $this->builder->buildAstCatchStatement($token->image); - - $this->consumeComments(); - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - - $this->parseCatchExceptionClass($catch); - - $this->consumeComments(); - $catch->addChild($this->parseVariable()); - - $this->consumeComments(); - $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - - $catch->addChild($this->parseRegularScope()); - - return $this->setNodePositionsAndReturn($catch); - } - - /** - * This method parses class references in catch statement. - * - * @param \PDepend\Source\AST\ASTCatchStatement $stmt The owning catch statement. - */ - protected function parseCatchExceptionClass(ASTCatchStatement $stmt) - { - $stmt->addChild( - $this->builder->buildAstClassOrInterfaceReference( - $this->parseQualifiedName() - ) - ); - } - - /** - * This method parses a finally-statement. - * - * @return \PDepend\Source\AST\ASTFinallyStatement - * @since 2.0.0 - */ - private function parseFinallyStatement() - { - $this->tokenStack->push(); - $this->consumeComments(); - - $token = $this->consumeToken(Tokens::T_FINALLY); - - $finally = $this->builder->buildAstFinallyStatement(); - $finally->addChild($this->parseRegularScope()); - - return $this->setNodePositionsAndReturn($finally); - } - - /** - * This method parses a single if-statement node. - * - * @return \PDepend\Source\AST\ASTIfStatement - * @since 0.9.8 - */ - private function parseIfStatement() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_IF); - - $stmt = $this->builder->buildAstIfStatement($token->image); - $stmt->addChild($this->parseParenthesisExpression()); - - $this->parseStatementBody($stmt); - $this->parseOptionalElseOrElseIfStatement($stmt); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses a single elseif-statement node. - * - * @return \PDepend\Source\AST\ASTElseIfStatement - * @since 0.9.8 - */ - private function parseElseIfStatement() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_ELSEIF); - - $stmt = $this->builder->buildAstElseIfStatement($token->image); - $stmt->addChild($this->parseParenthesisExpression()); - - $this->parseStatementBody($stmt); - $this->parseOptionalElseOrElseIfStatement($stmt); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses an optional else-, else+if- or elseif-statement. - * - * @param \PDepend\Source\AST\ASTStatement $stmt The owning if/elseif statement. - * - * @return \PDepend\Source\AST\ASTStatement - * @since 0.9.12 - */ - private function parseOptionalElseOrElseIfStatement(ASTStatement $stmt) - { - $this->consumeComments(); - switch ($this->tokenizer->peek()) { - case Tokens::T_ELSE: - $this->consumeToken(Tokens::T_ELSE); - $this->consumeComments(); - if ($this->tokenizer->peek() === Tokens::T_IF) { - $stmt->addChild($this->parseIfStatement()); - } else { - $this->parseStatementBody($stmt); - } - break; - case Tokens::T_ELSEIF: - $stmt->addChild($this->parseElseIfStatement()); - break; - } - - return $stmt; - } - - /** - * This method parses a single for-statement node. - * - * @return \PDepend\Source\AST\ASTForStatement - * @since 0.9.8 - */ - private function parseForStatement() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_FOR); - - $this->consumeComments(); - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - - $stmt = $this->builder->buildAstForStatement($token->image); - - if (($init = $this->parseForInit()) !== null) { - $stmt->addChild($init); - } - $this->consumeToken(Tokens::T_SEMICOLON); - - if (($expr = $this->parseForExpression()) !== null) { - $stmt->addChild($expr); - } - $this->consumeToken(Tokens::T_SEMICOLON); - - if (($update = $this->parseForUpdate()) !== null) { - $stmt->addChild($update); - } - $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - - return $this->setNodePositionsAndReturn($this->parseStatementBody($stmt)); - } - - /** - * Parses the init part of a for-statement. - * - * <code> - * ------------------------ - * for ($x = 0, $y = 23, $z = 42; $x < $y; ++$x) {} - * ------------------------ - * </code> - * - * @return \PDepend\Source\AST\ASTForInit|null - * @since 0.9.8 - */ - private function parseForInit() - { - $this->consumeComments(); - - if (Tokens::T_SEMICOLON === $this->tokenizer->peek()) { - return null; - } - - $this->tokenStack->push(); - - $init = $this->builder->buildAstForInit(); - $this->parseExpressionList($init); - - return $this->setNodePositionsAndReturn($init); - } - - /** - * Parses the expression part of a for-statement. - * - * @return \PDepend\Source\AST\ASTExpression - * @since 0.9.12 - */ - private function parseForExpression() - { - return $this->parseOptionalExpression(); - } - - /** - * Parses the update part of a for-statement. - * - * <code> - * ------------------------------- - * for ($x = 0, $y = 23, $z = 42; $x < $y; ++$x, $y = $x + 1, $z = $x + 2) {} - * ------------------------------- - * </code> - * - * @return \PDepend\Source\AST\ASTForUpdate|null - * @since 0.9.12 - */ - private function parseForUpdate() - { - $this->consumeComments(); - if (Tokens::T_PARENTHESIS_CLOSE === $this->tokenizer->peek()) { - return null; - } - - $this->tokenStack->push(); - - $update = $this->builder->buildAstForUpdate(); - $this->parseExpressionList($update); - - return $this->setNodePositionsAndReturn($update); - } - - /** - * This methods return true if the token matches a list opening in the current PHP version level. - * - * @param int $tokenType - * @return bool - * @since 2.6.0 - */ - protected function isListUnpacking($tokenType = null) - { - return ($tokenType ?: $this->tokenizer->peek()) === Tokens::T_LIST; - } - - /** - * Get the parsed list of a foreach statement children. - * - * @return ASTNode[] - */ - private function parseForeachChildren() - { - if ($this->tokenizer->peek() === Tokens::T_BITWISE_AND) { - return array($this->parseVariableOrMemberByReference()); - } - - if ($this->isListUnpacking()) { - return array($this->parseListExpression()); - } - - $children = array( - $this->parseVariableOrConstantOrPrimaryPrefix() - ); - - if ($this->tokenizer->peek() === Tokens::T_DOUBLE_ARROW) { - $this->consumeToken(Tokens::T_DOUBLE_ARROW); - - $children[] = $this->isListUnpacking() - ? $this->parseListExpression() - : $this->parseVariableOrMemberOptionalByReference(); - } - - return $children; - } - - /** - * This method parses a single foreach-statement node. - * - * @return \PDepend\Source\AST\ASTForeachStatement - * @since 0.9.8 - */ - private function parseForeachStatement() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_FOREACH); - - $foreach = $this->builder->buildAstForeachStatement($token->image); - - $this->consumeComments(); - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - - $foreach->addChild($this->parseExpression()); - - $this->consumeToken(Tokens::T_AS); - $this->consumeComments(); - - foreach ($this->parseForeachChildren() as $child) { - $foreach->addChild($child); - } - - $this->consumeComments(); - $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - - return $this->setNodePositionsAndReturn( - $this->parseStatementBody($foreach) - ); - } - - /** - * This method parses a single while-statement node. - * - * @return \PDepend\Source\AST\ASTWhileStatement - * @since 0.9.8 - */ - private function parseWhileStatement() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_WHILE); - - $stmt = $this->builder->buildAstWhileStatement($token->image); - $stmt->addChild($this->parseParenthesisExpression()); - - return $this->setNodePositionsAndReturn( - $this->parseStatementBody($stmt) - ); - } - - /** - * This method parses a do/while-statement. - * - * @return \PDepend\Source\AST\ASTDoWhileStatement - * @since 0.9.12 - */ - private function parseDoWhileStatement() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_DO); - - $stmt = $this->builder->buildAstDoWhileStatement($token->image); - $stmt = $this->parseStatementBody($stmt); - - $this->consumeComments(); - $this->consumeToken(Tokens::T_WHILE); - - $stmt->addChild($this->parseParenthesisExpression()); - - $this->parseStatementTermination(); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses a declare-statement. - * - * <code> - * ------------------------------- - * declare(encoding='ISO-8859-1'); - * ------------------------------- - * - * ------------------- - * declare(ticks=42) { - * // ... - * } - * - - * - * ------------------ - * declare(ticks=42): - * // ... - * enddeclare; - * ----------- - * </code> - * - * @return \PDepend\Source\AST\ASTDeclareStatement - * @since 0.10.0 - */ - private function parseDeclareStatement() - { - $this->tokenStack->push(); - $this->consumeToken(Tokens::T_DECLARE); - - $stmt = $this->builder->buildAstDeclareStatement(); - $stmt = $this->parseDeclareList($stmt); - $stmt = $this->parseStatementBody($stmt); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses a list of declare values. A declare list value always - * consists of a string token and a static scalar. - * - * @param \PDepend\Source\AST\ASTDeclareStatement $stmt The declare statement that - * is the owner of this list. - * @return \PDepend\Source\AST\ASTDeclareStatement - * @since 0.10.0 - */ - private function parseDeclareList(ASTDeclareStatement $stmt) - { - $this->consumeComments(); - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - - while (true) { - $this->consumeComments(); - $name = $this->consumeToken(Tokens::T_STRING)->image; - - $this->consumeComments(); - $this->consumeToken(Tokens::T_EQUAL); - - $this->consumeComments(); - $value = $this->parseStaticValue(); - - $stmt->addValue($name, $value); - - $this->consumeComments(); - if ($this->tokenizer->peek() === Tokens::T_COMMA) { - $this->consumeToken(Tokens::T_COMMA); - continue; - } - break; - } - - $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - return $stmt; - } - - /** - * This method builds a return statement from a given token. - * - * @return \PDepend\Source\AST\ASTReturnStatement - * @since 2.7.0 - */ - protected function buildReturnStatement(Token $token) - { - $stmt = $this->builder->buildAstReturnStatement($token->image); - - if (($expr = $this->parseOptionalExpression()) != null) { - $stmt->addChild($expr); - } - - return $stmt; - } - - /** - * This method parses a single return-statement node. - * - * @return \PDepend\Source\AST\ASTReturnStatement - * @since 0.9.12 - */ - private function parseReturnStatement() - { - $this->tokenStack->push(); - - $stmt = $this->buildReturnStatement( - $this->consumeToken(Tokens::T_RETURN) - ); - - $this->parseStatementTermination(); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses a break-statement node. - * - * @return \PDepend\Source\AST\ASTBreakStatement - * @since 0.9.12 - */ - private function parseBreakStatement() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_BREAK); - - $stmt = $this->builder->buildAstBreakStatement($token->image); - if (($expr = $this->parseOptionalExpression()) != null) { - $stmt->addChild($expr); - } - $this->parseStatementTermination(); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses a continue-statement node. - * - * @return \PDepend\Source\AST\ASTContinueStatement - * @since 0.9.12 - */ - private function parseContinueStatement() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_CONTINUE); - - $stmt = $this->builder->buildAstContinueStatement($token->image); - if (($expr = $this->parseOptionalExpression()) != null) { - $stmt->addChild($expr); - } - $this->parseStatementTermination(); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * This method parses a echo-statement node. - * - * @return \PDepend\Source\AST\ASTEchoStatement - * @since 0.9.12 - */ - private function parseEchoStatement() - { - $this->tokenStack->push(); - $token = $this->consumeToken(Tokens::T_ECHO); - - $stmt = $this->parseExpressionList( - $this->builder->buildAstEchoStatement($token->image) - ); - - $this->parseStatementTermination(); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * Parses a simple parenthesis expression or a direct object access, which - * was introduced with PHP 5.4.0: - * - * <code> - * (new MyClass())->bar(); - * </code> - * - * @return \PDepend\Source\AST\ASTNode - * @since 1.0.0 - */ - protected function parseParenthesisExpressionOrPrimaryPrefix() - { - return $this->parseParenthesisExpressionOrPrimaryPrefixForVersion( - $this->parseParenthesisExpression() - ); - } - - /** - * @param \PDepend\Source\AST\ASTExpression $expr - * @return \PDepend\Source\AST\ASTExpression - */ - protected function parseParenthesisExpressionOrPrimaryPrefixForVersion(ASTExpression $expr) - { - $this->consumeComments(); - if (Tokens::T_OBJECT_OPERATOR === $this->tokenizer->peek()) { - return $this->parseMemberPrimaryPrefix($expr->getChild(0)); - } - return $expr; - } - - /** - * Parses any expression that is surrounded by an opening and a closing - * parenthesis - * - * @return \PDepend\Source\AST\ASTExpression - * @since 0.9.8 - */ - protected function parseParenthesisExpression() - { - $this->tokenStack->push(); - $this->consumeComments(); - - $expr = $this->builder->buildAstExpression(); - $expr = $this->parseBraceExpression( - $expr, - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN), - Tokens::T_PARENTHESIS_CLOSE - ); - - return $this->setNodePositionsAndReturn($expr); - } - - /** - * This method parses a member primary prefix expression or a function - * postfix expression node. - * - * A member primary prefix can be a method call: - * - * <code> - * $object->foo(); - * - * clazz::foo(); - * </code> - * - * a property access: - * - * <code> - * $object->foo; - * - * clazz::$foo; - * </code> - * - * or a class constant access: - * - * <code> - * clazz::FOO; - * </code> - * - * A function postfix represents any kind of function call: - * - * <code> - * $function(); - * - * func(); - * </code> - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @since 0.9.6 - */ - private function parseMemberPrefixOrFunctionPostfix() - { - $this->tokenStack->push(); - $this->tokenStack->push(); - - $qName = $this->parseQualifiedName(); - - // Remove comments - $this->consumeComments(); - - // Get next token type - $tokenType = $this->tokenizer->peek(); - - switch ($tokenType) { - case Tokens::T_DOUBLE_COLON: - $node = $this->builder->buildAstClassOrInterfaceReference($qName); - $node = $this->setNodePositionsAndReturn($node); - $node = $this->parseStaticMemberPrimaryPrefix($node); - break; - case Tokens::T_PARENTHESIS_OPEN: - $node = $this->builder->buildAstIdentifier($qName); - $node = $this->setNodePositionsAndReturn($node); - $node = $this->parseFunctionPostfix($node); - break; - default: - $node = $this->builder->buildAstConstant($qName); - $node = $this->setNodePositionsAndReturn($node); - break; - } - - return $this->setNodePositionsAndReturn($node); - } - - /** - * This method will parse an optional function postfix. - * - * If the next available token is an opening parenthesis, this method will - * wrap the given <b>$node</b> with a {@link \PDepend\Source\AST\ASTFunctionPostfix} - * node. - * - * @param \PDepend\Source\AST\ASTNode $node The previously parsed node. - * - * @return \PDepend\Source\AST\ASTNode The original input node or this node - * wrapped with a function postfix instance. - * @since 1.0.0 - */ - private function parseOptionalFunctionPostfix(ASTNode $node) - { - $this->consumeComments(); - if (Tokens::T_PARENTHESIS_OPEN === $this->tokenizer->peek()) { - return $this->parseFunctionPostfix($node); - } - return $node; - } - - /** - * This method parses a function postfix expression. An object of type - * {@link \PDepend\Source\AST\ASTFunctionPostfix} represents any valid php - * function call. - * - * This method will delegate the call to another method that returns a - * member primary prefix object when the function postfix expression is - * followed by an object operator. - * - * @param \PDepend\Source\AST\ASTNode $node This node represents the function - * identifier. An identifier can be a static string, a variable, a - * compound variable or any other valid php function identifier. - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @since 0.9.6 - */ - private function parseFunctionPostfix(ASTNode $node) - { - $image = $this->extractPostfixImage($node); - - $function = $this->builder->buildAstFunctionPostfix($image); - $function->addChild($node); - $function->addChild($this->parseArguments()); - - return $this->parseOptionalMemberPrimaryPrefix( - $this->parseOptionalIndexExpression($function) - ); - } - - /** - * This method parses a PHP version specific identifier for method and - * property postfix expressions. - * - * @return \PDepend\Source\AST\ASTNode - * @since 1.0.0 - */ - protected function parsePostfixIdentifier() - { - switch ($this->tokenizer->peek()) { - case Tokens::T_STRING: - $node = $this->parseLiteral(); - break; - default: - $node = $this->parseCompoundVariableOrVariableVariableOrVariable(); - break; - } - return $this->parseOptionalIndexExpression($node); - } - - /** - * This method parses an optional member primary expression. It will parse - * the primary expression when an object operator can be found at the actual - * token stream position. Otherwise this method simply returns the input - * {@link \PDepend\Source\AST\ASTNode} instance. - * - * @param \PDepend\Source\AST\ASTNode $node This node represents primary prefix - * left expression. It will be the first child of the parsed member - * primary expression. - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @since 0.9.6 - */ - protected function parseOptionalMemberPrimaryPrefix(ASTNode $node) - { - $this->consumeComments(); - - if ($this->tokenizer->peek() === Tokens::T_OBJECT_OPERATOR) { - return $this->parseMemberPrimaryPrefix($node); - } - return $node; - } - - /** - * This method parses a dynamic or object bound member primary expression. - * A member primary prefix can be a method call: - * - * <code> - * $object->foo(); - * </code> - * - * or a property access: - * - * <code> - * $object->foo; - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The left node in the parsed member - * primary expression. - * @return ASTMemberPrimaryPrefix - * @throws \PDepend\Source\Parser\ParserException - * @since 0.9.6 - */ - protected function parseMemberPrimaryPrefix(ASTNode $node) - { - // Consume double colon and optional comments - $token = $this->consumeToken(Tokens::T_OBJECT_OPERATOR); - - $prefix = $this->builder->buildAstMemberPrimaryPrefix($token->image); - $prefix->addChild($node); - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - switch ($tokenType) { - case ($this->isMethodName($tokenType)): - $child = $this->parseIdentifier($tokenType); - $child = $this->parseOptionalIndexExpression($child); - - // TODO: Move this in a separate method - if ($child instanceof ASTIndexExpression) { - $this->consumeComments(); - if (Tokens::T_PARENTHESIS_OPEN === $this->tokenizer->peek()) { - $prefix->addChild($this->parsePropertyPostfix($child)); - return $this->parseOptionalFunctionPostfix($prefix); - } - } - break; - case Tokens::T_CURLY_BRACE_OPEN: - $child = $this->parseCompoundExpression(); - break; - default: - $child = $this->parseCompoundVariableOrVariableVariableOrVariable(); - break; - } - - $prefix->addChild( - $this->parseMethodOrPropertyPostfix( - $this->parseOptionalIndexExpression($child) - ) - ); - - return $this->parseOptionalMemberPrimaryPrefix( - $this->parseOptionalIndexExpression($prefix) - ); - } - - /** - * This method parses an optional member primary expression. It will parse - * the primary expression when a double colon operator can be found at the - * actual token stream position. Otherwise this method simply returns the - * input {@link \PDepend\Source\AST\ASTNode} instance. - * - * @param \PDepend\Source\AST\ASTNode $node This node represents primary prefix - * left expression. It will be the first child of the parsed member - * primary expression. - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @since 1.0.1 - */ - private function parseOptionalStaticMemberPrimaryPrefix(ASTNode $node) - { - $this->consumeComments(); - - if ($this->tokenizer->peek() === Tokens::T_DOUBLE_COLON) { - return $this->parseStaticMemberPrimaryPrefix($node); - } - - return $node; - } - - /** - * This method parses a static member primary expression. The given node - * contains the used static class or interface identifier. A static member - * primary prefix can represent the following code expressions: - * - * A static method class: - * - * <code> - * Foo::bar(); - * </code> - * - * a static property access: - * - * <code> - * Foo::$bar; - * </code> - * - * or a static constant access: - * - * <code> - * Foo::BAR; - * </code> - * - * @param \PDepend\Source\AST\ASTNode $node The left node in the parsed member - * primary expression. - * @return ASTMemberPrimaryPrefix - * @throws \PDepend\Source\Parser\ParserException - * @since 0.9.6 - */ - protected function parseStaticMemberPrimaryPrefix(ASTNode $node) - { - $token = $this->consumeToken(Tokens::T_DOUBLE_COLON); - - $prefix = $this->builder->buildAstMemberPrimaryPrefix($token->image); - $prefix->addChild($node); - - $this->consumeComments(); - - switch ($this->tokenizer->peek()) { - case Tokens::T_STRING: - $postfix = $this->parseMethodOrConstantPostfix(); - break; - case Tokens::T_CLASS_FQN: - $postfix = $this->parseFullQualifiedClassNamePostfix(); - break; - default: - $postfix = $this->parseMethodOrPropertyPostfix( - $this->parsePostfixIdentifier() - ); - break; - } - - $prefix->addChild($postfix); - - return $this->parseOptionalMemberPrimaryPrefix( - $this->parseOptionalIndexExpression($prefix) - ); - } - - /** - * This method parses a method- or constant-postfix expression. This expression - * will contain an identifier node as nested child. - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @since 0.9.6 - */ - private function parseMethodOrConstantPostfix() - { - $this->tokenStack->push(); - - $node = $this->parseIdentifier(); - - $this->consumeComments(); - if ($this->tokenizer->peek() === Tokens::T_PARENTHESIS_OPEN) { - $postfix = $this->parseMethodPostfix($node); - } else { - $postfix = $this->builder->buildAstConstantPostfix($node->getImage()); - $postfix->addChild($node); - } - - return $this->setNodePositionsAndReturn($postfix); - } - - /** - * This method parses a method- or property-postfix expression. This expression - * will contain the given node as method or property identifier. - * - * @param \PDepend\Source\AST\ASTNode $node The identifier for the parsed postfix - * expression node. This node will be the first child of the returned - * postfix node instance. - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @since 0.9.6 - */ - private function parseMethodOrPropertyPostfix(ASTNode $node) - { - // Strip optional comments - $this->consumeComments(); - - switch ($this->tokenizer->peek()) { - case Tokens::T_PARENTHESIS_OPEN: - $postfix = $this->parseMethodPostfix($node); - break; - default: - $postfix = $this->parsePropertyPostfix($node); - break; - } - return $this->parseOptionalMemberPrimaryPrefix($postfix); - } - - /** - * Parses/Creates a property postfix node instance. - * - * @param \PDepend\Source\AST\ASTNode $node Node that represents the image of - * the property postfix node. - * - * @return \PDepend\Source\AST\ASTPropertyPostfix - * @since 0.10.2 - */ - private function parsePropertyPostfix(ASTNode $node) - { - $image = $this->extractPostfixImage($node); - - $postfix = $this->builder->buildAstPropertyPostfix($image); - $postfix->addChild($node); - - $postfix->configureLinesAndColumns( - $node->getStartLine(), - $node->getEndLine(), - $node->getStartColumn(), - $node->getEndColumn() - ); - - return $postfix; - } - - /** - * Parses a full qualified class name postfix. - * - * @return \PDepend\Source\AST\ASTClassFqnPostfix - * @since 2.0.0 - */ - protected function parseFullQualifiedClassNamePostfix() - { - throw $this->getUnexpectedTokenException(); - } - - /** - * This method will extract the image/name of the real property/variable - * that is wrapped by {@link \PDepend\Source\AST\ASTIndexExpression} nodes. If - * the given node is now wrapped by index expressions, this method will - * return the image of the entire <b>$node</b>. - * - * @param \PDepend\Source\AST\ASTNode $node The context node that may be wrapped - * by multiple array or string index expressions. - * - * @return string - * @since 1.0.0 - */ - private function extractPostfixImage(ASTNode $node) - { - while ($node instanceof ASTIndexExpression) { - $node = $node->getChild(0); - } - return $node->getImage(); - } - - /** - * Parses a method postfix node instance. - * - * @param \PDepend\Source\AST\ASTNode $node Node that represents the image of - * the method postfix node. - * - * @return \PDepend\Source\AST\ASTMethodPostfix - * @since 1.0.0 - */ - private function parseMethodPostfix(ASTNode $node) - { - $args = $this->parseArguments(); - $image = $this->extractPostfixImage($node); - - $postfix = $this->builder->buildAstMethodPostfix($image); - $postfix->addChild($node); - $postfix->addChild($args); - - $postfix->configureLinesAndColumns( - $node->getStartLine(), - $args->getEndLine(), - $node->getStartColumn(), - $args->getEndColumn() - ); - - return $this->parseOptionalMemberPrimaryPrefix($postfix); - } - - /** - * This method parses the arguments passed to a function- or method-call. - * - * @return \PDepend\Source\AST\ASTArguments - * @throws \PDepend\Source\Parser\ParserException - * @since 0.9.6 - */ - protected function parseArguments() - { - $this->consumeComments(); - - $this->tokenStack->push(); - - $arguments = $this->builder->buildAstArguments(); - - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - $this->consumeComments(); - - if (Tokens::T_PARENTHESIS_CLOSE !== $this->tokenizer->peek()) { - $arguments = $this->parseArgumentList($arguments); - } - $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - - return $this->setNodePositionsAndReturn($arguments); - } - - /** - * @param \PDepend\Source\AST\ASTArguments $arguments - * @return \PDepend\Source\AST\ASTArguments - */ - protected function parseArgumentList(ASTArguments $arguments) - { - return $this->parseExpressionList($arguments); - } - - /** - * This method implements the parsing for various expression types like - * variables, object/static method. All these expressions are valid in - * several php language constructs like, isset, empty, unset etc. - * - * @return \PDepend\Source\AST\ASTNode - * @since 0.9.12 - */ - protected function parseVariableOrConstantOrPrimaryPrefix() - { - $this->consumeComments(); - switch ($this->tokenizer->peek()) { - case Tokens::T_DOLLAR: - case Tokens::T_VARIABLE: - return $this->parseVariableOrFunctionPostfixOrMemberPrimaryPrefix(); - case Tokens::T_SELF: - return $this->parseConstantOrSelfMemberPrimaryPrefix(); - case Tokens::T_PARENT: - return $this->parseConstantOrParentMemberPrimaryPrefix(); - case Tokens::T_STATIC: - return $this->parseStaticVariableDeclarationOrMemberPrimaryPrefix(); - case Tokens::T_STRING: - case Tokens::T_BACKSLASH: - case Tokens::T_NAMESPACE: - return $this->parseMemberPrefixOrFunctionPostfix(); - } - - throw $this->getUnexpectedTokenException(); - } - - /** - * This method parses any type of variable, function postfix expressions or - * any kind of member primary prefix. - * - * This method expects that the actual token represents any kind of valid - * php variable: simple variable, compound variable or variable variable. - * - * It will parse a function postfix or member primary expression when this - * variable is followed by an object operator, double colon or opening - * parenthesis. - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @since 0.9.6 - */ - private function parseVariableOrFunctionPostfixOrMemberPrimaryPrefix() - { - $this->tokenStack->push(); - - $variable = $this->parseCompoundVariableOrVariableVariableOrVariable(); - $variable = $this->parseOptionalIndexExpression($variable); - - $this->consumeComments(); - switch ($this->tokenizer->peek()) { - case Tokens::T_DOUBLE_COLON: - $result = $this->parseStaticMemberPrimaryPrefix($variable); - break; - case Tokens::T_OBJECT_OPERATOR: - $result = $this->parseMemberPrimaryPrefix($variable); - break; - case Tokens::T_PARENTHESIS_OPEN: - $result = $this->parseFunctionPostfix($variable); - break; - default: - $result = $variable; - break; - } - return $this->setNodePositionsAndReturn($result); - } - - /** - * Parses an assingment expression node. - * - * @param \PDepend\Source\AST\ASTNode $left The left part of the assignment - * expression that will be parsed by this method. - * - * @return \PDepend\Source\AST\ASTAssignmentExpression - * @since 0.9.12 - */ - protected function parseAssignmentExpression(ASTNode $left) - { - $token = $this->consumeToken($this->tokenizer->peek()); - - $node = $this->builder->buildAstAssignmentExpression($token->image); - $node->addChild($left); - - // TODO: Change this into a mandatory expression in later versions - if (($expr = $this->parseOptionalExpression()) != null) { - $node->addChild($expr); - } else { - $expr = $left; - } - - $node->configureLinesAndColumns( - $left->getStartLine(), - $expr->getEndLine(), - $left->getStartColumn(), - $expr->getEndColumn() - ); - - return $node; - } - - /** - * This method parses a {@link \PDepend\Source\AST\ASTStaticReference} node. - * - * @param \PDepend\Source\Tokenizer\Token $token The "static" keyword token. - * @return \PDepend\Source\AST\ASTStaticReference - * @throws \PDepend\Source\Parser\ParserException - * @throws \PDepend\Source\Parser\InvalidStateException - * @since 0.9.6 - */ - private function parseStaticReference(Token $token) - { - // Strip optional comments - $this->consumeComments(); - - if ($this->classOrInterface === null) { - throw new InvalidStateException( - $token->startLine, - (string) $this->compilationUnit, - 'The keyword "static" was used outside of a class/method scope.' - ); - } - - $ref = $this->builder->buildAstStaticReference($this->classOrInterface); - $ref->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $ref; - } - - /** - * This method parses a {@link \PDepend\Source\AST\ASTSelfReference} node. - * - * @param \PDepend\Source\Tokenizer\Token $token The "self" keyword token. - * @return \PDepend\Source\AST\ASTSelfReference - * @throws \PDepend\Source\Parser\ParserException - * @throws \PDepend\Source\Parser\InvalidStateException - * @since 0.9.6 - */ - protected function parseSelfReference(Token $token) - { - if ($this->classOrInterface === null) { - throw new InvalidStateException( - $token->startLine, - (string) $this->compilationUnit, - 'The keyword "self" was used outside of a class/method scope.' - ); - } - - $ref = $this->builder->buildAstSelfReference($this->classOrInterface); - $ref->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $ref; - } - - /** - * Parses a simple PHP constant use and returns a corresponding node. - * - * @return \PDepend\Source\AST\ASTNode - * @since 1.0.0 - */ - protected function parseConstant() - { - $this->tokenStack->push(); - switch ($type = $this->tokenizer->peek()) { - case Tokens::T_STRING: - // TODO: Separate node classes for magic constants - case Tokens::T_DIR: - case Tokens::T_FILE: - case Tokens::T_LINE: - case Tokens::T_NS_C: - case Tokens::T_FUNC_C: - case Tokens::T_CLASS_C: - case Tokens::T_METHOD_C: - case Tokens::T_TRAIT_C: - $token = $this->consumeToken($type); - - return $this->setNodePositionsAndReturn( - $this->builder->buildAstConstant($token->image) - ); - } - } - - /** - * This method parses a {@link \PDepend\Source\AST\ASTConstant} node or - * an instance of {@link \PDepend\Source\AST\ASTSelfReference} as part of - * a {@link \PDepend\Source\AST\ASTMemberPrimaryPrefix} that contains the - * self reference as its first child when the self token is followed by a - * double colon token. - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @throws \PDepend\Source\Parser\InvalidStateException - * @since 0.9.6 - */ - private function parseConstantOrSelfMemberPrimaryPrefix() - { - // Read self token and strip optional comments - $token = $this->consumeToken(Tokens::T_SELF); - $this->consumeComments(); - - if ($this->tokenizer->peek() == Tokens::T_DOUBLE_COLON) { - return $this->parseStaticMemberPrimaryPrefix( - $this->parseSelfReference($token) - ); - } - - return $this->builder->buildAstConstant($token->image); - } - - /** - * This method parses a {@link \PDepend\Source\AST\ASTParentReference} node. - * - * @param \PDepend\Source\Tokenizer\Token $token The "self" keyword token. - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @throws \PDepend\Source\Parser\InvalidStateException - * @since 0.9.6 - */ - private function parseParentReference(Token $token) - { - if ($this->classOrInterface === null) { - throw new InvalidStateException( - $token->startLine, - (string) $this->compilationUnit, - 'The keyword "parent" was used as type hint but the parameter ' . - 'declaration is not in a class scope.' - ); - } - - if ($this->classOrInterface instanceof ASTTrait) { - $classReference = $this->builder->buildAstClassReference('__PDepend_TraitRuntimeReference'); - } else { - $classReference = $this->classOrInterface->getParentClassReference(); - } - - if ($classReference === null) { - throw new InvalidStateException( - $token->startLine, - (string) $this->compilationUnit, - sprintf( - 'The keyword "parent" was used as type hint but the ' . - 'class "%s" does not declare a parent.', - $this->classOrInterface->getName() - ) - ); - } - - $ref = $this->builder->buildAstParentReference($classReference); - $ref->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $ref; - } - - /** - * This method parses a {@link \PDepend\Source\AST\ASTConstant} node or - * an instance of {@link \PDepend\Source\AST\ASTParentReference} as part - * of a {@link \PDepend\Source\AST\ASTMemberPrimaryPrefix} that contains - * the parent reference as its first child when the self token is followed - * by a double colon token. - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @throws \PDepend\Source\Parser\InvalidStateException - * @since 0.9.6 - */ - private function parseConstantOrParentMemberPrimaryPrefix() - { - // Consume parent token and strip optional comments - $token = $this->consumeToken(Tokens::T_PARENT); - $this->consumeComments(); - - if ($this->tokenizer->peek() == Tokens::T_DOUBLE_COLON) { - return $this->parseStaticMemberPrimaryPrefix( - $this->parseParentReference($token) - ); - } - - return $this->builder->buildAstConstant($token->image); - } - - /** - * Parses a variable or any other valid member expression that is optionally - * prefixed with PHP's reference operator. - * - * <code> - * // ----------- - * foreach ( $array as &$this->foo ) {} - * // ----------- - * - * // ---------- - * $foo = &$bar->baz; - * // ---------- - * </code> - * - * @return \PDepend\Source\AST\ASTUnaryExpression - * @since 0.9.18 - */ - private function parseVariableOrMemberOptionalByReference() - { - $this->consumeComments(); - - if ($this->tokenizer->peek() === Tokens::T_BITWISE_AND) { - return $this->parseVariableOrMemberByReference(); - } - - return $this->parseVariableOrConstantOrPrimaryPrefix(); - } - - /** - * Parses a variable or any other valid member expression that is prefixed - * with PHP's reference operator. - * - * <code> - * // ----------- - * foreach ( $array as &$this->foo ) {} - * // ----------- - * - * // ---------- - * $foo = &$bar->baz; - * // ---------- - * </code> - * - * @return \PDepend\Source\AST\ASTUnaryExpression - * @since 0.9.18 - */ - private function parseVariableOrMemberByReference() - { - $this->tokenStack->push(); - - $token = $this->consumeToken(Tokens::T_BITWISE_AND); - $this->consumeComments(); - - $expr = $this->builder->buildAstUnaryExpression($token->image); - $expr->addChild($this->parseVariableOrConstantOrPrimaryPrefix()); - - return $this->setNodePositionsAndReturn($expr); - } - - /** - * This method parses a simple PHP variable. - * - * @return ASTVariable - * @throws UnexpectedTokenException - * @since 0.9.6 - */ - private function parseVariable() - { - $token = $this->consumeToken(Tokens::T_VARIABLE); - - $variable = $this->builder->buildAstVariable($token->image); - $variable->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $variable; - } - - /** - * This method parses a comma separated list of valid php variables and/or - * properties and adds them to the given node instance. - * - * @param \PDepend\Source\AST\ASTNode $node The context parent node. - * - * @return \PDepend\Source\AST\ASTNode The prepared entire node. - * @since 0.9.12 - */ - private function parseVariableList(ASTNode $node) - { - $this->consumeComments(); - while ($this->tokenizer->peek() !== Tokenizer::T_EOF) { - $node->addChild($this->parseVariableOrConstantOrPrimaryPrefix()); - - $this->consumeComments(); - if ($this->tokenizer->peek() === Tokens::T_COMMA) { - $this->consumeToken(Tokens::T_COMMA); - $this->consumeComments(); - } else { - break; - } - } - - return $node; - } - - /** - * This method is a decision point between the different variable types - * availanle in PHP. It peeks the next token and then decides whether it is - * a regular variable or when the next token is of type <b>T_DOLLAR</b> a - * compound- or variable-variable. - * - * <code> - * ---- - * $foo; - * ---- - * - * ----- - * $$foo; - * ----- - * - * ------ - * ${FOO}; - * ------ - * </code> - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @throws UnexpectedTokenException - * @since 0.9.6 - */ - protected function parseCompoundVariableOrVariableVariableOrVariable() - { - if ($this->tokenizer->peek() == Tokens::T_DOLLAR) { - return $this->parseCompoundVariableOrVariableVariable(); - } - return $this->parseVariable(); - } - - /** - * Parses a PHP compound variable or a simple literal node. - * - * @return \PDepend\Source\AST\ASTNode - * @since 0.9.19 - */ - private function parseCompoundVariableOrLiteral() - { - $this->tokenStack->push(); - - // Read the dollar token - $token = $this->consumeToken(Tokens::T_DOLLAR); - $this->consumeComments(); - - // Get next token type - $tokenType = $this->tokenizer->peek(); - - switch ($tokenType) { - case Tokens::T_CURLY_BRACE_OPEN: - $variable = $this->builder->buildAstCompoundVariable($token->image); - $variable->addChild($this->parseCompoundExpression()); - break; - default: - $variable = $this->builder->buildAstLiteral($token->image); - break; - } - - return $this->setNodePositionsAndReturn($variable); - } - - /** - * This method implements a decision point between compound-variables and - * variable-variable. It expects that the next token in the token-stream is - * of type <b>T_DOLLAR</b> and removes it from the stream. Then this method - * peeks the next available token when it is of type <b>T_CURLY_BRACE_OPEN</b> - * this is compound variable, otherwise it can be a variable-variable or a - * compound-variable. - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\ParserException - * @throws UnexpectedTokenException - * @since 0.9.6 - */ - private function parseCompoundVariableOrVariableVariable() - { - $this->tokenStack->push(); - - // Read the dollar token - $token = $this->consumeToken(Tokens::T_DOLLAR); - $this->consumeComments(); - - // Get next token type - $tokenType = $this->tokenizer->peek(); - - // T_DOLLAR|T_VARIABLE === Variable variable, - // T_CURLY_BRACE_OPEN === Compound variable - switch ($tokenType) { - case Tokens::T_DOLLAR: - case Tokens::T_VARIABLE: - $variable = $this->builder->buildAstVariableVariable($token->image); - $variable->addChild( - $this->parseCompoundVariableOrVariableVariableOrVariable() - ); - break; - default: - $variable = $this->parseCompoundVariable($token); - break; - } - - return $this->setNodePositionsAndReturn($variable); - } - - /** - * This method parses a compound variable like: - * - * <code> - * // ---------------- - * return ${'Foo' . 'Bar'}; - * // ---------------- - * </code> - * - * @param \PDepend\Source\Tokenizer\Token $token The dollar token. - * @return ASTCompoundVariable - * @since 0.10.0 - */ - private function parseCompoundVariable(Token $token) - { - return $this->parseBraceExpression( - $this->builder->buildAstCompoundVariable($token->image), - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN), - Tokens::T_CURLY_BRACE_CLOSE - ); - } - - /** - * This method parses a compound expression like: - * - * <code> - * // ------ ------ - * $foo = "{$bar}, {$baz}\n"; - * // ------ ------ - * </code> - * - * or a simple literal token: - * - * <code> - * // - - * $foo = "{{$bar}, {$baz}\n"; - * // - - * </code> - * - * @return \PDepend\Source\AST\ASTNode - * @since 0.9.10 - */ - private function parseCompoundExpressionOrLiteral() - { - $token = $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN); - $this->consumeComments(); - - switch ($this->tokenizer->peek()) { - case Tokens::T_DOLLAR: - case Tokens::T_VARIABLE: - return $this->parseBraceExpression( - $this->builder->buildAstCompoundExpression(), - $token, - Tokens::T_CURLY_BRACE_CLOSE - ); - } - - $literal = $this->builder->buildAstLiteral($token->image); - $literal->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $literal; - } - - /** - * This method parses a compound expression node. - * - * <code> - * ------------------ - * {'_' . foo . $bar} - * ------------------ - * </code> - * - * @return \PDepend\Source\AST\ASTCompoundExpression - * @throws \PDepend\Source\Parser\ParserException - * @throws \PDepend\Source\Parser\ParserException - * @since 0.9.6 - */ - protected function parseCompoundExpression() - { - $this->consumeComments(); - - return $this->parseBraceExpression( - $this->builder->buildAstCompoundExpression(), - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN), - Tokens::T_CURLY_BRACE_CLOSE - ); - } - - /** - * Parses a static identifier expression, as it is used for method and - * function names. - * - * @param integer $tokenType - * @return \PDepend\Source\AST\ASTIdentifier - * @since 0.9.12 - */ - protected function parseIdentifier($tokenType = Tokens::T_STRING) - { - $token = $this->consumeToken($tokenType); - - $node = $this->builder->buildAstIdentifier($token->image); - $node->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $node; - } - - /** - * This method parses a {@link \PDepend\Source\AST\ASTLiteral} node or an - * instance of {@link \PDepend\Source\AST\ASTString} that represents a string - * in double quotes or surrounded by backticks. - * - * @return \PDepend\Source\AST\ASTNode - * @throws UnexpectedTokenException - */ - protected function parseLiteralOrString() - { - $tokenType = $this->tokenizer->peek(); - - switch ($tokenType) { - case Tokens::T_NULL: - case Tokens::T_TRUE: - case Tokens::T_FALSE: - case Tokens::T_DNUMBER: - case Tokens::T_CONSTANT_ENCAPSED_STRING: - $token = $this->consumeToken($tokenType); - - $literal = $this->builder->buildAstLiteral($token->image); - $literal->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - return $literal; - case Tokens::T_LNUMBER: - return $this->parseIntegerNumber(); - default: - return $this->parseString($tokenType); - } - } - - /** - * Parses an integer value. - * - * @return \PDepend\Source\AST\ASTLiteral - * @since 1.0.0 - */ - protected function parseIntegerNumber() - { - $token = $this->consumeToken(Tokens::T_LNUMBER); - - $literal = $this->builder->buildAstLiteral($token->image); - $literal->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $literal; - } - - /** - * Parses an array structure. - * - * @return \PDepend\Source\AST\ASTArray - * @since 1.0.0 - */ - protected function doParseArray($static = false) - { - $this->tokenStack->push(); - - return $this->setNodePositionsAndReturn( - $this->parseArray( - $this->builder->buildAstArray(), - $static - ) - ); - } - - /** - * Tests if the next token is a valid array start delimiter in the supported - * PHP version. - * - * @return boolean - * @since 1.0.0 - */ - abstract protected function isArrayStartDelimiter(); - - /** - * Parses a php array declaration. - * - * @param \PDepend\Source\AST\ASTArray $array - * @param boolean $static - * - * @return \PDepend\Source\AST\ASTArray - * @since 1.0.0 - */ - abstract protected function parseArray(ASTArray $array, $static = false); - - /** - * Return true if [, $foo] or [$foo, , $bar] is allowed. - * - * @return bool - */ - protected function canHaveCommaBetweenArrayElements() - { - return false; - } - - /** - * Parses all elements in an array. - * - * @param \PDepend\Source\AST\ASTArray $array - * @param integer $endDelimiter - * @param boolean $static - * @return \PDepend\Source\AST\ASTArray - * @since 1.0.0 - */ - protected function parseArrayElements(ASTArray $array, $endDelimiter, $static = false) - { - $consecutiveComma = null; - $openingToken = $this->tokenizer->prevToken(); - $useSquaredBrackets = ($endDelimiter === Tokens::T_SQUARED_BRACKET_CLOSE); - $this->consumeComments(); - - while ($endDelimiter !== $this->tokenizer->peek()) { - while ($this->canHaveCommaBetweenArrayElements() && Tokens::T_COMMA === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_COMMA); - $this->consumeComments(); - } - - $array->addChild($this->parseArrayElement($static)); - - $this->consumeComments(); - - if (Tokens::T_COMMA === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_COMMA); - $this->consumeComments(); - } - - if ($useSquaredBrackets && $this->isListUnpacking(Tokens::T_SQUARED_BRACKET_OPEN)) { - while (Tokens::T_COMMA === $this->tokenizer->peek()) { - $consecutiveComma = $this->tokenizer->prevToken(); - $this->consumeToken(Tokens::T_COMMA); - $this->consumeComments(); - } - } - } - - // Once we parsed the whole array, detect if it's a destructuring list or a value, - // then check the content is consistent - $this->ensureArrayIsValid($useSquaredBrackets, $openingToken, $consecutiveComma); - - return $array; - } - - /** - * Check if the given array/list is a value and so does not have consecutive commas in it, - * or if it's a destructuring list and so check the syntax is valid in the current PHP level. - * - * @param bool $useSquaredBrackets - * @param Token|null $openingToken - * @param Token|null $consecutiveComma - * - * @throws UnexpectedTokenException - * - * @return void - */ - protected function ensureArrayIsValid($useSquaredBrackets, $openingToken, $consecutiveComma) - { - // If this array is followed by =, it's in fact a destructuring list - if ($this->tokenizer->peekNext() === Tokens::T_EQUAL) { - // If it uses [], check the PHP level allow it - if ($useSquaredBrackets) { - $this->ensureTokenIsListUnpackingOpening(Tokens::T_SQUARED_BRACKET_OPEN, $openingToken); - } - } elseif ($consecutiveComma) { - // If it's not a destructuring list, it must not contain 2 consecutive commas - throw $this->getUnexpectedTokenException($consecutiveComma); - } - } - - /** - * Parses a single array element. - * - * An array element can have a simple value, a key/value pair, a value by - * reference or a key/value pair with a referenced value. - * - * @param boolean $static - * @return \PDepend\Source\AST\ASTArrayElement - * @since 1.0.0 - */ - protected function parseArrayElement($static = false) - { - $this->consumeComments(); - - $this->tokenStack->push(); - - $element = $this->builder->buildAstArrayElement(); - if ($this->parseOptionalByReference()) { - if ($static) { - $tokens = $this->tokenStack->pop(); - - throw $this->getUnexpectedTokenException(end($tokens)); - } - - $element->setByReference(); - } - - $this->consumeComments(); - if ($this->isKeyword($this->tokenizer->peek())) { - throw $this->getUnexpectedTokenException(); - } - - $element->addChild($this->parseExpression()); - - $this->consumeComments(); - if (Tokens::T_DOUBLE_ARROW === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_DOUBLE_ARROW); - $this->consumeComments(); - - if ($this->parseOptionalByReference()) { - $element->setByReference(); - } - $element->addChild($this->parseExpression()); - } - - return $this->setNodePositionsAndReturn($element); - } - - /** - * Parses a here- or nowdoc string instance. - * - * @return \PDepend\Source\AST\ASTHeredoc - * @since 0.9.12 - */ - protected function parseHeredoc() - { - $this->tokenStack->push(); - $this->consumeToken(Tokens::T_START_HEREDOC); - - $heredoc = $this->builder->buildAstHeredoc(); - $this->parseStringExpressions($heredoc, Tokens::T_END_HEREDOC); - - $token = $this->consumeToken(Tokens::T_END_HEREDOC); - $heredoc->setDelimiter($token->image); - - return $this->setNodePositionsAndReturn($heredoc); - } - - /** - * Parses a simple string sequence between two tokens of the same type. - * - * @param integer $tokenType The start/stop token type. - * - * @return string - * @since 0.9.10 - */ - private function parseStringSequence($tokenType) - { - $type = $tokenType; - $string = ''; - - do { - $string .= $this->consumeToken($type)->image; - $type = $this->tokenizer->peek(); - } while ($type != $tokenType && $type != Tokenizer::T_EOF); - - return $string . $this->consumeToken($tokenType)->image; - } - - /** - * This method parses a php string with all possible embedded expressions. - * - * <code> - * $string = "Manuel $Pichler <{$email}>"; - * - * // \PDepend\Source\AST\ASTSTring - * // |-- ASTLiteral - "Manuel ") - * // |-- ASTVariable - $Pichler - * // |-- ASTLiteral - " <" - * // |-- ASTCompoundExpression - {...} - * // | |-- ASTVariable - $email - * // |-- ASTLiteral - ">" - * </code> - * - * @param integer $delimiterType The start/stop token type. - * - * @return \PDepend\Source\AST\ASTString - * @throws \PDepend\Source\Parser\UnexpectedTokenException - * @since 0.9.10 - */ - private function parseString($delimiterType) - { - $token = $this->consumeToken($delimiterType); - - $string = $this->builder->buildAstString(); - $startLine = $token->startLine; - $startColumn = $token->startColumn; - - $this->parseStringExpressions($string, $delimiterType); - - $token = $this->consumeToken($delimiterType); - $endLine = $token->endLine; - $endColumn = $token->endColumn; - - $string->configureLinesAndColumns( - $startLine, - $endLine, - $startColumn, - $endColumn - ); - - return $string; - } - - /** - * This method parses the contents of a string or here-/now-doc node. It - * will not consume the given stop token, so it is up to the calling method - * to consume the stop token. The return value of this method is the prepared - * input string node. - * - * @param \PDepend\Source\AST\ASTNode $node - * @param integer $stopToken - * @return \PDepend\Source\AST\ASTNode - * @since 0.9.12 - */ - private function parseStringExpressions(ASTNode $node, $stopToken) - { - while (($tokenType = $this->tokenizer->peek()) != Tokenizer::T_EOF) { - switch ($tokenType) { - case $stopToken: - break 2; - case Tokens::T_BACKSLASH: - $node->addChild($this->parseEscapedAstLiteralString()); - break; - case Tokens::T_DOLLAR: - $node->addChild($this->parseCompoundVariableOrLiteral()); - break; - case Tokens::T_VARIABLE: - $node->addChild($this->parseVariable()); - break; - case Tokens::T_CURLY_BRACE_OPEN: - $node->addChild($this->parseCompoundExpressionOrLiteral()); - break; - default: - $node->addChild($this->parseLiteral()); - break; - } - } - return $node; - } - - /** - * This method parses an escaped sequence of literal tokens. - * - * @return \PDepend\Source\AST\ASTLiteral - * @since 0.9.10 - */ - private function parseEscapedAstLiteralString() - { - $this->tokenStack->push(); - - $image = $this->consumeToken(Tokens::T_BACKSLASH)->image; - $escape = true; - - $tokenType = $this->tokenizer->peek(); - while ($tokenType != Tokenizer::T_EOF) { - if ($tokenType === Tokens::T_BACKSLASH) { - $escape = !$escape; - $image .= $this->consumeToken(Tokens::T_BACKSLASH)->image; - - $tokenType = $this->tokenizer->peek(); - continue; - } - - if ($escape) { - $image .= $this->consumeToken($tokenType)->image; - break; - } - } - return $this->setNodePositionsAndReturn( - $this->builder->buildAstLiteral($image) - ); - } - - /** - * This method parses a simple literal and configures the position - * properties. - * - * @return \PDepend\Source\AST\ASTLiteral - * @since 0.9.10 - */ - protected function parseLiteral() - { - $token = $this->consumeToken($this->tokenizer->peek()); - - $node = $this->builder->buildAstLiteral($token->image); - $node->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $node; - } - - /** - * Extracts all dependencies from a callable signature. - * - * @return \PDepend\Source\AST\ASTFormalParameters - * @since 0.9.5 - */ - protected function parseFormalParameters() - { - $this->consumeComments(); - - $this->tokenStack->push(); - - $formalParameters = $this->builder->buildAstFormalParameters(); - - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - $this->consumeComments(); - - $tokenType = $this->tokenizer->peek(); - - // Check for function without parameters - if ($tokenType === Tokens::T_PARENTHESIS_CLOSE) { - $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - - return $this->setNodePositionsAndReturn($formalParameters); - } - - while ($tokenType !== Tokenizer::T_EOF) { - $formalParameters->addChild( - $this->parseFormalParameterOrTypeHintOrByReference() - ); - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - // Check for following parameter - if ($tokenType !== Tokens::T_COMMA) { - break; - } - - $this->consumeToken(Tokens::T_COMMA); - } - - $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - - return $this->setNodePositionsAndReturn($formalParameters); - } - - /** - * This method parses a formal parameter in all it's variations. - * - * <code> - * // ------------ - * function traverse(Iterator $it) {} - * // ------------ - * - * // --------- - * function traverse(array $ar) {} - * // --------- - * - * // --- - * function traverse(&$x) {} - * // --- - * </code> - * - * @return \PDepend\Source\AST\ASTFormalParameter - * @since 0.9.6 - */ - protected function parseFormalParameterOrTypeHintOrByReference() - { - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - $this->tokenStack->push(); - - switch ($tokenType) { - case Tokens::T_ARRAY: - $parameter = $this->parseFormalParameterAndArrayTypeHint(); - break; - case ($this->isTypeHint($tokenType)): - $parameter = $this->parseFormalParameterAndTypeHint(); - break; - case Tokens::T_SELF: - $parameter = $this->parseFormalParameterAndSelfTypeHint(); - break; - case Tokens::T_PARENT: - $parameter = $this->parseFormalParameterAndParentTypeHint(); - break; - case Tokens::T_BITWISE_AND: - $parameter = $this->parseFormalParameterAndByReference(); - break; - default: - $parameter = $this->parseFormalParameter(); - break; - } - return $this->setNodePositionsAndReturn($parameter); - } - - /** - * This method parses a formal parameter that has an array type hint. - * - * <code> - * // --------- - * function traverse(array $ar) {} - * // --------- - * </code> - * - * @return \PDepend\Source\AST\ASTFormalParameter - * @since 0.9.6 - */ - private function parseFormalParameterAndArrayTypeHint() - { - $node = $this->parseArrayType(); - - $parameter = $this->parseFormalParameterOrByReference(); - $parameter->prependChild($node); - - return $parameter; - } - - /** - * @return \PDepend\Source\AST\ASTTypeArray - */ - protected function parseArrayType() - { - $token = $this->consumeToken(Tokens::T_ARRAY); - - $type = $this->builder->buildAstTypeArray(); - $type->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $type; - } - - /** - * This method parses a formal parameter that has a regular class type hint. - * - * <code> - * // ------------ - * function traverse(Iterator $it) {} - * // ------------ - * </code> - * - * @return \PDepend\Source\AST\ASTFormalParameter - * @since 0.9.6 - */ - private function parseFormalParameterAndTypeHint() - { - $this->tokenStack->push(); - - $classReference = $this->setNodePositionsAndReturn( - $this->parseTypeHint() - ); - - $parameter = $this->parseFormalParameterOrByReference(); - $parameter->prependChild($classReference); - - return $parameter; - } - - /** - * This method will parse a formal parameter that has the keyword parent as - * parameter type hint. - * - * <code> - * class Foo extends Bar - * { - * // --------- - * public function test(parent $o) {} - * // --------- - * } - * </code> - * - * @return \PDepend\Source\AST\ASTFormalParameter - * @throws \PDepend\Source\Parser\InvalidStateException - * @since 0.9.6 - */ - private function parseFormalParameterAndParentTypeHint() - { - $reference = $this->parseParentType(); - $parameter = $this->parseFormalParameterOrByReference(); - $parameter->prependChild($reference); - - return $parameter; - } - - /** - * @return \PDepend\Source\AST\ASTParentReference - */ - protected function parseParentType() - { - return $this->parseParentReference($this->consumeToken(Tokens::T_PARENT)); - } - - /** - * This method will parse a formal parameter that has the keyword self as - * parameter type hint. - * - * <code> - * class Foo - * { - * // ------- - * public function test(self $o) {} - * // ------- - * } - * </code> - * - * @return \PDepend\Source\AST\ASTFormalParameter - * @since 0.9.6 - */ - private function parseFormalParameterAndSelfTypeHint() - { - $self = $this->parseSelfType(); - - $parameter = $this->parseFormalParameterOrByReference(); - $parameter->addChild($self); - - return $parameter; - } - - /** - * @return \PDepend\Source\AST\ASTSelfReference - */ - protected function parseSelfType() - { - return $this->parseSelfReference($this->consumeToken(Tokens::T_SELF)); - } - - /** - * This method will parse a formal parameter that can optionally be passed - * by reference. - * - * <code> - * // --- ------- - * function foo(array &$x, $y = 42) {} - * // --- ------- - * </code> - * - * @return \PDepend\Source\AST\ASTFormalParameter - * @since 0.9.6 - */ - protected function parseFormalParameterOrByReference() - { - $this->consumeComments(); - if ($this->tokenizer->peek() === Tokens::T_BITWISE_AND) { - return $this->parseFormalParameterAndByReference(); - } - return $this->parseFormalParameter(); - } - - /** - * This method will parse a formal parameter that is passed by reference. - * - * <code> - * // --- -------- - * function foo(array &$x, &$y = 42) {} - * // --- -------- - * </code> - * - * @return \PDepend\Source\AST\ASTFormalParameter - * @since 0.9.6 - */ - private function parseFormalParameterAndByReference() - { - $this->consumeToken(Tokens::T_BITWISE_AND); - $this->consumeComments(); - - $parameter = $this->parseFormalParameter(); - $parameter->setPassedByReference(); - - return $parameter; - } - - /** - * This method will parse a formal parameter. A formal parameter is at least - * a variable name, but can also contain a default parameter value. - * - * <code> - * // -- ------- - * function foo(Bar $x, $y = 42) {} - * // -- ------- - * </code> - * - * @return \PDepend\Source\AST\ASTFormalParameter - * @since 0.9.6 - */ - protected function parseFormalParameter() - { - $parameter = $this->builder->buildAstFormalParameter(); - $parameter->addChild($this->parseVariableDeclarator()); - - return $parameter; - } - - /** - * Tests if the given token type is a valid formal parameter in the supported - * PHP version. - * - * @param integer $tokenType - * @return boolean - * @since 1.0.0 - */ - protected function isTypeHint($tokenType) - { - switch ($tokenType) { - case Tokens::T_STRING: - case Tokens::T_BACKSLASH: - case Tokens::T_NAMESPACE: - return true; - } - return false; - } - - /** - * Parses a type hint that is valid in the supported PHP version. - * - * @return \PDepend\Source\AST\ASTNode|null - * @since 1.0.0 - */ - protected function parseTypeHint() - { - switch ($this->tokenizer->peek()) { - case Tokens::T_STRING: - case Tokens::T_BACKSLASH: - case Tokens::T_NAMESPACE: - return $this->builder->buildAstClassOrInterfaceReference( - $this->parseQualifiedName() - ); - } - - return null; - } - - /** - * Extracts all dependencies from a callable body. - * - * @return \PDepend\Source\AST\ASTScope - * @since 0.9.12 - */ - private function parseScope() - { - $scope = $this->builder->buildAstScope(); - - $this->tokenStack->push(); - - $this->consumeComments(); - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN); - - while (($stmt = $this->parseOptionalStatement()) !== null) { - // TODO: Remove if-statement once, we have translated functions and - // closures into ast-nodes - if ($stmt instanceof \PDepend\Source\AST\ASTNode) { - $scope->addChild($stmt); - } - } - - $this->consumeComments(); - $this->consumeToken(Tokens::T_CURLY_BRACE_CLOSE); - - return $this->setNodePositionsAndReturn($scope); - } - - /** - * Parse a statement. - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\UnexpectedTokenException - * @throws \PDepend\Source\Parser\TokenStreamEndException - * @since 1.0.0 - */ - private function parseStatement() - { - if (is_object($stmt = $this->parseOptionalStatement())) { - return $stmt; - } - if (is_object($token = $this->tokenizer->next())) { - throw $this->getUnexpectedTokenException($token); - } - throw new TokenStreamEndException($this->tokenizer); - } - - /** - * Parses an optional statement or returns <b>null</b>. - * - * @return \PDepend\Source\AST\ASTNode|null - * @since 0.9.8 - */ - private function parseOptionalStatement() - { - $tokenType = $this->tokenizer->peek(); - - switch ($tokenType) { - case Tokens::T_ECHO: - return $this->parseEchoStatement(); - case Tokens::T_SWITCH: - return $this->parseSwitchStatement(); - case Tokens::T_TRY: - return $this->parseTryStatement(); - case Tokens::T_THROW: - return $this->parseThrowStatement(); - case Tokens::T_IF: - return $this->parseIfStatement(); - case Tokens::T_FOR: - return $this->parseForStatement(); - case Tokens::T_FOREACH: - return $this->parseForeachStatement(); - case Tokens::T_DO: - return $this->parseDoWhileStatement(); - case Tokens::T_WHILE: - return $this->parseWhileStatement(); - case Tokens::T_RETURN: - return $this->parseReturnStatement(); - case Tokens::T_BREAK: - return $this->parseBreakStatement(); - case Tokens::T_CONTINUE: - return $this->parseContinueStatement(); - case Tokens::T_GOTO: - return $this->parseGotoStatement(); - case Tokens::T_GLOBAL: - return $this->parseGlobalStatement(); - case Tokens::T_UNSET: - return $this->parseUnsetStatement(); - case Tokens::T_STRING: - if ($this->tokenizer->peekNext() === Tokens::T_COLON) { - return $this->parseLabelStatement(); - } - break; - case Tokens::T_CONST: - return $this->parseConstantDefinition(); - case Tokens::T_FN: - return $this->parseLambdaFunctionDeclaration(); - case Tokens::T_FUNCTION: - return $this->parseFunctionOrClosureDeclaration(); - case Tokens::T_COMMENT: - return $this->parseCommentWithOptionalInlineClassOrInterfaceReference(); - case Tokens::T_DOC_COMMENT: - return $this->builder->buildAstComment( - $this->consumeToken(Tokens::T_DOC_COMMENT)->image - ); - case Tokens::T_CURLY_BRACE_OPEN: - return $this->parseRegularScope(); - case Tokens::T_DECLARE: - return $this->parseDeclareStatement(); - case Tokens::T_ELSE: - case Tokens::T_ENDIF: - case Tokens::T_ELSEIF: - case Tokens::T_ENDFOR: - case Tokens::T_ENDWHILE: - case Tokens::T_ENDSWITCH: - case Tokens::T_ENDDECLARE: - case Tokens::T_ENDFOREACH: - case Tokens::T_CURLY_BRACE_CLOSE: - return null; - case Tokens::T_CLOSE_TAG: - if (($tokenType = $this->parseNonePhpCode()) === Tokenizer::T_EOF) { - return null; - } - - return $this->parseOptionalStatement(); - case Tokens::T_TRAIT: - $package = $this->getNamespaceOrPackage(); - $package->addType($trait = $this->parseTraitDeclaration()); - - $this->builder->restoreTrait($trait); - $this->compilationUnit->addChild($trait); - - return $trait; - case Tokens::T_INTERFACE: - $package = $this->getNamespaceOrPackage(); - $package->addType($interface = $this->parseInterfaceDeclaration()); - - $this->builder->restoreInterface($interface); - $this->compilationUnit->addChild($interface); - - return $interface; - case Tokens::T_CLASS: - case Tokens::T_FINAL: - case Tokens::T_ABSTRACT: - $package = $this->getNamespaceOrPackage(); - $package->addType($class = $this->parseClassDeclaration()); - - $this->builder->restoreClass($class); - $this->compilationUnit->addChild($class); - - return $class; - case Tokens::T_YIELD: - return $this->parseYield(); - } - - $this->tokenStack->push(); - $stmt = $this->builder->buildAstStatement(); - - if (($expr = $this->parseOptionalExpression()) != null) { - $stmt->addChild($expr); - } - - $this->parseStatementTermination(); - - return $this->setNodePositionsAndReturn($stmt); - } - - /** - * Parses a sequence of none php code tokens and returns the token type of - * the next token. - * - * @return integer - * @since 0.9.12 - */ - private function parseNonePhpCode() - { - $this->consumeToken(Tokens::T_CLOSE_TAG); - - $this->tokenStack->push(); - while (($tokenType = $this->tokenizer->peek()) !== Tokenizer::T_EOF) { - switch ($tokenType) { - case Tokens::T_OPEN_TAG: - case Tokens::T_OPEN_TAG_WITH_ECHO: - $this->consumeToken($tokenType); - $tokenType = $this->tokenizer->peek(); - break 2; - default: - $this->consumeToken($tokenType); - break; - } - } - $this->tokenStack->pop(); - - return $tokenType; - } - - /** - * Parses a comment and optionally an embedded class or interface type - * annotation. - * - * @return \PDepend\Source\AST\ASTComment - * @since 0.9.8 - */ - private function parseCommentWithOptionalInlineClassOrInterfaceReference() - { - $token = $this->consumeToken(Tokens::T_COMMENT); - - $comment = $this->builder->buildAstComment($token->image); - if (preg_match(self::REGEXP_INLINE_TYPE, $token->image, $match)) { - $image = $this->useSymbolTable->lookup($match[1]) ?: $match[1]; - - $comment->addChild( - $this->builder->buildAstClassOrInterfaceReference($image) - ); - } - - $comment->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - return $comment; - } - - /** - * Parses an optional set of bound closure variables. - * - * @param \PDepend\Source\AST\ASTClosure $closure The context closure instance. - * - * @return \PDepend\Source\AST\ASTClosure - * @since 1.0.0 - */ - protected function parseOptionalBoundVariables( - \PDepend\Source\AST\ASTClosure $closure - ) { - $this->consumeComments(); - - if (Tokens::T_USE === $this->tokenizer->peek()) { - return $this->parseBoundVariables($closure); - } - - return $closure; - } - - /** - * Parses a list of bound closure variables. - * - * @param \PDepend\Source\AST\ASTClosure $closure The parent closure instance. - * - * @return \PDepend\Source\AST\ASTClosure - * @since 0.9.5 - */ - private function parseBoundVariables(\PDepend\Source\AST\ASTClosure $closure) - { - $this->consumeToken(Tokens::T_USE); - - $this->consumeComments(); - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - - while ($this->tokenizer->peek() !== Tokenizer::T_EOF) { - $this->consumeComments(); - - if ($this->tokenizer->peek() === Tokens::T_BITWISE_AND) { - $this->consumeToken(Tokens::T_BITWISE_AND); - $this->consumeComments(); - } - - $this->consumeToken(Tokens::T_VARIABLE); - $this->consumeComments(); - - if ($this->tokenizer->peek() === Tokens::T_COMMA) { - $this->consumeToken(Tokens::T_COMMA); - - continue; - } - - break; - } - - $this->consumeComments(); - $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - - return $closure; - } - - /** - * Parses a php class/method name chain. - * - * <code> - * PDepend\Source\Parser::parse(); - * </code> - * - * @throws NoActiveScopeException - * - * @return string - * @link http://php.net/manual/en/language.namespaces.importing.php - */ - protected function parseQualifiedName() - { - $fragments = $this->parseQualifiedNameRaw(); - - // Check for fully qualified name - if ($fragments[0] === '\\') { - return join('', $fragments); - } - - if ($this->isScalarOrCallableTypeHint($fragments[0])) { - return $fragments[0]; - } - - // Search for an use alias - $mapsTo = $this->useSymbolTable->lookup($fragments[0]); - - if ($mapsTo !== null) { - // Remove alias and add real namespace - array_shift($fragments); - array_unshift($fragments, $mapsTo); - } elseif ($this->namespaceName !== null - && $this->namespacePrefixReplaced === false - ) { - // Prepend current namespace - array_unshift($fragments, $this->namespaceName, '\\'); - } - - return join('', $fragments); - } - - /** - * This method parses a qualified PHP 5.3 class, interface and namespace - * identifier and returns the collected tokens as a string array. - * - * @return array<string> - * @since 0.9.5 - */ - protected function parseQualifiedNameRaw() - { - // Reset namespace prefix flag - $this->namespacePrefixReplaced = false; - - // Consume comments and fetch first token type - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - $qualifiedName = array(); - - if ($tokenType === Tokens::T_NAMESPACE) { - // Consume namespace keyword - $this->consumeToken(Tokens::T_NAMESPACE); - $this->consumeComments(); - - // Add current namespace as first token - $qualifiedName = array((string) $this->namespaceName); - - // Set prefixed flag to true - $this->namespacePrefixReplaced = true; - } elseif ($this->isClassName($tokenType)) { - $qualifiedName[] = $this->parseClassName(); - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - // Stop here for simple identifier - if ($tokenType !== Tokens::T_BACKSLASH) { - return $qualifiedName; - } - } - - do { - // Next token must be a namespace separator - $this->consumeToken(Tokens::T_BACKSLASH); - $this->consumeComments(); - - // Append to qualified name - $qualifiedName[] = '\\'; - - if ($nextElement = $this->parseQualifiedNameElement($qualifiedName)) { - $qualifiedName[] = $nextElement; - } - - $this->consumeComments(); - - // Get next token type - $tokenType = $this->tokenizer->peek(); - } while ($tokenType === Tokens::T_BACKSLASH); - - return $qualifiedName; - } - - /** - * Determines if the given image is a PHP 7 type hint. - * - * @param string $image - * @return boolean - */ - protected function isScalarOrCallableTypeHint($image) - { - // Scalar & callable type hints were not present in PHP 5 - return false; - } - - /** - * @param array $previousElements - * @return string - */ - protected function parseQualifiedNameElement(array $previousElements) - { - return $this->parseClassName(); - } - - /** - * This method parses a PHP 5.3 namespace declaration. - * - * @throws NoActiveScopeException - * - * @return void - * @since 0.9.5 - */ - private function parseNamespaceDeclaration() - { - // Consume namespace keyword and strip optional comments - $this->consumeToken(Tokens::T_NAMESPACE); - $this->consumeComments(); - - $tokenType = $this->tokenizer->peek(); - - // Search for a namespace identifier - if ($this->isClassName($tokenType)) { - // Reset namespace property - $this->namespaceName = null; - - $qualifiedName = $this->parseQualifiedName(); - - $this->consumeComments(); - if ($this->tokenizer->peek() === Tokens::T_CURLY_BRACE_OPEN) { - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN); - } else { - $this->consumeToken(Tokens::T_SEMICOLON); - } - - // Create a package for this namespace - $this->namespaceName = $qualifiedName; - - $this->useSymbolTable->resetScope(); - } elseif ($tokenType === Tokens::T_BACKSLASH) { - // Same namespace reference, something like: - // new namespace\Foo(); - // or: - // $x = namespace\foo::bar(); - - // Now parse a qualified name - $this->parseQualifiedNameRaw(); - } else { - // Consume opening curly brace - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN); - - // Create a package for this namespace - $this->namespaceName = ''; - - $this->useSymbolTable->resetScope(); - } - - $this->reset(); - } - - /** - * This method parses a list of PHP 5.3 use declarations and adds a mapping - * between short name and full qualified name to the use symbol table. - * - * <code> - * use \foo\bar as fb, - * \foobar\Bar; - * </code> - * - * @return void - * @since 0.9.5 - */ - protected function parseUseDeclarations() - { - // Consume use keyword - $this->consumeToken(Tokens::T_USE); - $this->consumeComments(); - - // Parse all use declarations - $this->parseUseDeclaration(); - $this->consumeComments(); - - // Consume closing semicolon - $this->consumeToken(Tokens::T_SEMICOLON); - - // Reset any previous state - $this->reset(); - } - - /** - * This method parses a single use declaration and adds a mapping between - * short name and full qualified name to the use symbol table. - * - * @throws NoActiveScopeException - * - * @return void - * @since 0.9.5 - */ - protected function parseUseDeclaration() - { - $fragments = $this->parseQualifiedNameRaw(); - $this->consumeComments(); - - // Add leading backslash, because aliases must be full qualified - // http://php.net/manual/en/language.namespaces.importing.php - if ($fragments[0] !== '\\') { - array_unshift($fragments, '\\'); - } - - $this->parseUseDeclarationForVersion($fragments); - - // Check for a following use declaration - if ($this->tokenizer->peek() === Tokens::T_COMMA) { - // Consume comma token and comments - $this->consumeToken(Tokens::T_COMMA); - $this->consumeComments(); - - $this->parseUseDeclaration(); - } - } - - /** - * @param array $fragments - * @return void - */ - protected function parseUseDeclarationForVersion(array $fragments) - { - $image = $this->parseNamespaceImage($fragments); - - // Add mapping between image and qualified name to symbol table - $this->useSymbolTable->add($image, join('', $fragments)); - } - - /** - * @param array $fragments - * @return string - */ - protected function parseNamespaceImage(array $fragments) - { - if ($this->tokenizer->peek() === Tokens::T_AS) { - $this->consumeToken(Tokens::T_AS); - $this->consumeComments(); - - $image = $this->consumeToken(Tokens::T_STRING)->image; - $this->consumeComments(); - } else { - $image = end($fragments); - } - - return $image; - } - - /** - * Parses a single constant definition with one or more constant declarators. - * - * <code> - * class Foo - * { - * // ------------------------ - * const FOO = 42, BAR = 23; - * // ------------------------ - * } - * </code> - * - * @return \PDepend\Source\AST\ASTConstantDefinition - * @since 0.9.6 - */ - protected function parseConstantDefinition() - { - $this->tokenStack->push(); - - $token = $this->consumeToken(Tokens::T_CONST); - - $definition = $this->builder->buildAstConstantDefinition($token->image); - $definition->setComment($this->docComment); - - do { - $definition->addChild($this->parseConstantDeclarator()); - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - if ($tokenType === Tokens::T_SEMICOLON) { - break; - } - - $this->consumeToken(Tokens::T_COMMA); - } while ($tokenType !== Tokenizer::T_EOF); - - - $definition = $this->setNodePositionsAndReturn($definition); - - $this->consumeToken(Tokens::T_SEMICOLON); - - return $definition; - } - - /** - * Parses a single constant declarator. - * - * <code> - * class Foo - * { - * // -------- - * const BAR = 42; - * // -------- - * } - * </code> - * - * Or in a comma separated constant defintion: - * - * <code> - * class Foo - * { - * // -------- - * const BAR = 42, - * // -------- - * - * // -------------- - * const BAZ = 'Foobar', - * // -------------- - * - * // ---------- - * const FOO = 3.14; - * // ---------- - * } - * </code> - * - * @return \PDepend\Source\AST\ASTConstantDeclarator - * @since 0.9.6 - */ - protected function parseConstantDeclarator() - { - // Remove leading comments and create a new token stack - $this->consumeComments(); - $this->tokenStack->push(); - - $tokenType = $this->tokenizer->peek(); - - if (false === $this->isConstantName($tokenType)) { - throw $this->getUnexpectedTokenException(); - } - - $token = $this->consumeToken($tokenType); - - $this->consumeComments(); - $this->consumeToken(Tokens::T_EQUAL); - - $declarator = $this->builder->buildAstConstantDeclarator($token->image); - $declarator->setValue($this->parseConstantDeclaratorValue()); - - return $this->setNodePositionsAndReturn($declarator); - } - - /** - * Parses the value of a php constant. By default this can be only static - * values that were allowed in the oldest supported PHP version. - * - * @return \PDepend\Source\AST\ASTValue - * @since 2.2.x - */ - protected function parseConstantDeclaratorValue() - { - return $this->parseStaticValue(); - } - - /** - * This method parses a static variable declaration list, a member primary - * prefix invoked in the static context of a class or it parses a static - * closure declaration. - * - * Static variable: - * <code> - * function foo() { - * // ------------------------------ - * static $foo, $bar, $baz = null; - * // ------------------------------ - * } - * </code> - * - * Static method invocation: - * <code> - * class Foo { - * public function baz() { - * // ---------------- - * static::foobar(); - * // ---------------- - * } - * public function foobar() {} - * } - * - * class Bar extends Foo { - * public function foobar() {} - * } - * </code> - * - * Static closure declaration: - * <code> - * $closure = static function($x, $y) { - * return ($x * $y); - * }; - * </code> - * - * @return \PDepend\Source\AST\ASTConstant - * @throws \PDepend\Source\Parser\ParserException - * @throws \PDepend\Source\Parser\UnexpectedTokenException - * @since 0.9.6 - */ - private function parseStaticVariableDeclarationOrMemberPrimaryPrefix() - { - $this->tokenStack->push(); - - // Consume static token and strip optional comments - $token = $this->consumeToken(Tokens::T_STATIC); - $this->consumeComments(); - - // Fetch next token type - $tokenType = $this->tokenizer->peek(); - - if ($tokenType === Tokens::T_PARENTHESIS_OPEN - || $tokenType === Tokens::T_DOUBLE_COLON - ) { - return $this->setNodePositionsAndReturn( - $this->parseStaticMemberPrimaryPrefix( - $this->parseStaticReference($token) - ) - ); - } elseif ($tokenType === Tokens::T_FUNCTION) { - $closure = $this->parseClosureDeclaration(); - $closure->setStatic(true); - - return $this->setNodePositionsAndReturn($closure); - } elseif ($tokenType === Tokens::T_FN) { - $closure = $this->parseLambdaFunctionDeclaration(); - $closure->setStatic(true); - - return $this->setNodePositionsAndReturn($closure); - } - - return $this->setNodePositionsAndReturn( - $this->parseStaticVariableDeclaration($token) - ); - } - - /** - * This method will parse a static variable declaration. - * - * <code> - * function foo() - * { - * // First declaration - * static $foo; - * // Second declaration - * static $bar = array(); - * // Third declaration - * static $baz = array(), - * $foobar = null, - * $barbaz; - * } - * </code> - * - * @param \PDepend\Source\Tokenizer\Token $token Token with the "static" keyword. - * @return \PDepend\Source\AST\ASTStaticVariableDeclaration - * @since 0.9.6 - */ - private function parseStaticVariableDeclaration(Token $token) - { - $staticDeclaration = $this->builder->buildAstStaticVariableDeclaration( - $token->image - ); - - // Strip optional comments - $this->consumeComments(); - - // Fetch next token type - $tokenType = $this->tokenizer->peek(); - - while ($tokenType !== Tokenizer::T_EOF) { - $staticDeclaration->addChild($this->parseVariableDeclarator()); - - $this->consumeComments(); - - // Semicolon terminates static declaration - $tokenType = $this->tokenizer->peek(); - - if ($tokenType === Tokens::T_SEMICOLON) { - break; - } - - // We are here, so there must be a next declarator - $this->consumeToken(Tokens::T_COMMA); - } - - return $staticDeclaration; - } - - /** - * This method will parse a variable declarator. - * - * <code> - * // Parameter declarator - * function foo($x = 23) { - * } - * // Property declarator - * class Foo{ - * protected $bar = 42; - * } - * // Static declarator - * function baz() { - * static $foo; - * } - * </code> - * - * @return \PDepend\Source\AST\ASTVariableDeclarator - * @since 0.9.6 - */ - protected function parseVariableDeclarator() - { - $this->tokenStack->push(); - - $name = $this->consumeToken(Tokens::T_VARIABLE)->image; - $this->consumeComments(); - - $declarator = $this->builder->buildAstVariableDeclarator($name); - - if ($this->tokenizer->peek() === Tokens::T_EQUAL) { - $this->consumeToken(Tokens::T_EQUAL); - $declarator->setValue($this->parseStaticValueOrStaticArray()); - } - - return $this->setNodePositionsAndReturn($declarator); - } - - /** - * This method will parse a static value or a static array as it is - * used as default value for a parameter or property declaration. - * - * @return \PDepend\Source\AST\ASTValue - * @since 0.9.6 - */ - protected function parseStaticValueOrStaticArray() - { - $this->consumeComments(); - - if ($this->isArrayStartDelimiter()) { - // TODO: Use default value as value! - $defaultValue = $this->doParseArray(true); - - $value = new ASTValue(); - $value->setValue(array()); - - return $value; - } - - return $this->parseStaticValue(); - } - - /** - * This method will parse a static default value as it is used for a - * parameter, property or constant declaration. - * - * @return \PDepend\Source\AST\ASTValue - * @since 0.9.5 - */ - protected function parseStaticValue() - { - $defaultValue = new ASTValue(); - - $this->consumeComments(); - - // By default all parameters positive signed - $signed = 1; - - $tokenType = $this->tokenizer->peek(); - - while ($tokenType !== Tokenizer::T_EOF) { - switch ($tokenType) { - case Tokens::T_COMMA: - case Tokens::T_SEMICOLON: - case Tokens::T_PARENTHESIS_CLOSE: - if ($defaultValue->isValueAvailable() === true) { - return $defaultValue; - } - - throw new MissingValueException($this->tokenizer); - case Tokens::T_NULL: - $this->consumeToken(Tokens::T_NULL); - $defaultValue->setValue(null); - break; - case Tokens::T_TRUE: - $this->consumeToken(Tokens::T_TRUE); - $defaultValue->setValue(true); - break; - case Tokens::T_FALSE: - $this->consumeToken(Tokens::T_FALSE); - $defaultValue->setValue(false); - break; - case Tokens::T_LNUMBER: - $token = $this->consumeToken(Tokens::T_LNUMBER); - $defaultValue->setValue($signed * (int) $token->image); - break; - case Tokens::T_DNUMBER: - $token = $this->consumeToken(Tokens::T_DNUMBER); - $defaultValue->setValue($signed * (double) $token->image); - break; - case Tokens::T_CONSTANT_ENCAPSED_STRING: - $token = $this->consumeToken(Tokens::T_CONSTANT_ENCAPSED_STRING); - $defaultValue->setValue(substr($token->image, 1, -1)); - break; - case Tokens::T_DOUBLE_COLON: - $this->consumeToken(Tokens::T_DOUBLE_COLON); - break; - case Tokens::T_CLASS_FQN: - $this->consumeToken(Tokens::T_CLASS_FQN); - break; - case Tokens::T_PLUS: - $this->consumeToken(Tokens::T_PLUS); - break; - case Tokens::T_ELLIPSIS: - $this->checkEllipsisInExpressionSupport(); - $this->consumeToken(Tokens::T_ELLIPSIS); - break; - case Tokens::T_MINUS: - $this->consumeToken(Tokens::T_MINUS); - $signed *= -1; - break; - case Tokens::T_DOUBLE_QUOTE: - $defaultValue->setValue($this->parseStringSequence($tokenType)); - break; - case Tokens::T_STATIC: - case Tokens::T_SELF: - case Tokens::T_PARENT: - $node = $this->parseStandAloneExpressionTypeReference(true); - - if ($this->tokenizer->peek() === Tokens::T_DOUBLE_COLON) { - $node->addChild($this->parseStaticMemberPrimaryPrefix($node)); - } - - $defaultValue->setValue($node); - break; - case Tokens::T_STRING: - case Tokens::T_BACKSLASH: - $node = $this->builder->buildAstClassOrInterfaceReference( - $this->parseQualifiedName() - ); - - if ($this->tokenizer->peek() === Tokens::T_DOUBLE_COLON) { - $node->addChild($this->parseStaticMemberPrimaryPrefix($node)); - } - - $defaultValue->setValue($node); - break; - case Tokens::T_DIR: - case Tokens::T_FILE: - case Tokens::T_LINE: - case Tokens::T_NS_C: - case Tokens::T_FUNC_C: - case Tokens::T_CLASS_C: - case Tokens::T_METHOD_C: - case Tokens::T_SQUARED_BRACKET_OPEN: - case Tokens::T_SQUARED_BRACKET_CLOSE: - // There is a default value but we don't handle it at the moment. - $defaultValue->setValue(null); - $this->consumeToken($tokenType); - break; - case Tokens::T_START_HEREDOC: - $defaultValue->setValue( - $this->parseHeredoc()->getChild(0)->getImage() - ); - break; - default: - return $this->parseStaticValueVersionSpecific($defaultValue); - } - - $this->consumeComments(); - - $tokenType = $this->tokenizer->peek(); - } - - // We should never reach this, so throw an exception - throw new TokenStreamEndException($this->tokenizer); - } - - /** - * Parses additional static values that are valid in the supported php version. - * - * @param \PDepend\Source\AST\ASTValue $value - * @return \PDepend\Source\AST\ASTValue - * @throws \PDepend\Source\Parser\UnexpectedTokenException - */ - protected function parseStaticValueVersionSpecific(ASTValue $value) - { - throw $this->getUnexpectedTokenException(); - } - - /** - * Parses fn operator of lambda function for syntax fn() => available since PHP 7.4. - * - * @return \PDepend\Source\AST\ASTValue - * @throws \PDepend\Source\Parser\UnexpectedTokenException - */ - protected function parseLambdaFunctionDeclaration() - { - throw $this->getUnexpectedTokenException(); - } - - /** - * Checks if the given expression is a read/write variable as defined in - * the PHP zend_language_parser.y definition. - * - * @param \PDepend\Source\AST\ASTNode $expr The context node instance. - * - * @return boolean - * @since 0.10.0 - */ - private function isReadWriteVariable($expr) - { - return $expr instanceof ASTVariable - || $expr instanceof ASTFunctionPostfix - || $expr instanceof ASTVariableVariable - || $expr instanceof ASTCompoundVariable - || $expr instanceof ASTMemberPrimaryPrefix; - } - - /** - * This method creates a qualified class or interface name based on the - * current parser state. By default method uses the current namespace scope - * as prefix for the given local name. And it will fallback to a previously - * parsed package annotation, when no namespace declaration was parsed. - * - * @param string $localName The local class or interface name. - * - * @return string - */ - private function createQualifiedTypeName($localName) - { - return ltrim($this->getNamespaceOrPackageName() . '\\' . $localName, '\\'); - } - - /** - * Returns the name of a declared names. When the parsed code is not namespaced - * this method will return the name from the @package annotation. - * - * @return string - * @since 0.9.8 - */ - private function getNamespaceOrPackageName() - { - if ($this->namespaceName === null) { - return $this->packageName; - } - return $this->namespaceName; - } - - /** - * Returns the currently active package or namespace. - * - * @return \PDepend\Source\AST\ASTNamespace - * @since 1.0.0 - */ - private function getNamespaceOrPackage() - { - $namespace = $this->builder->buildNamespace($this->getNamespaceOrPackageName()); - $namespace->setPackageAnnotation(null === $this->namespaceName); - - return $namespace; - } - - /** - * Extracts the @package information from the given comment. - * - * @param string $comment - * @return string|null - */ - private function parsePackageAnnotation($comment) - { - if (getenv('DISMISS_PACKAGES')) { - $this->packageName = null; - $this->globalPackageName = null; - - return null; - } - - $package = Builder::DEFAULT_NAMESPACE; - if (preg_match('#\*\s*@package\s+(\S+)#', $comment, $match)) { - $package = trim($match[1]); - if (preg_match('#\*\s*@subpackage\s+(\S+)#', $comment, $match)) { - $package .= '\\' . trim($match[1]); - } - } - - // Check for doc level comment - if ($this->globalPackageName === Builder::DEFAULT_NAMESPACE - && $this->isFileComment() === true - ) { - $this->globalPackageName = $package; - - $this->compilationUnit->setComment($comment); - } - - return $package; - } - - /** - * Checks that the current token could be used as file comment. - * - * This method checks that the previous token is an open tag and the following - * token is not a class, a interface, final, abstract or a function. - * - * @return boolean - */ - protected function isFileComment() - { - if ($this->tokenizer->prev() !== Tokens::T_OPEN_TAG) { - return false; - } - - $notExpectedTags = array( - Tokens::T_CLASS, - Tokens::T_FINAL, - Tokens::T_TRAIT, - Tokens::T_ABSTRACT, - Tokens::T_FUNCTION, - Tokens::T_INTERFACE - ); - - return !in_array($this->tokenizer->peek(), $notExpectedTags, true); - } - - /** - * Returns the class names of all <b>throws</b> annotations with in the - * given comment block. - * - * @param string $comment The context doc comment block. - * - * @return array - */ - private function parseThrowsAnnotations($comment) - { - $throws = array(); - - if (preg_match_all(self::REGEXP_THROWS_TYPE, $comment, $matches) > 0) { - foreach ($matches[1] as $match) { - $throws[] = $this->useSymbolTable->lookup($match) ?: $match; - } - } - - return $throws; - } - - /** - * This method parses the given doc comment text for a return annotation and - * it returns the found return type. - * - * @param string $comment A doc comment text. - * - * @return string|null - */ - private function parseReturnAnnotation($comment) - { - if (0 === preg_match(self::REGEXP_RETURN_TYPE, $comment, $match)) { - return null; - } - - foreach (explode('|', end($match)) as $image) { - $image = $this->useSymbolTable->lookup($image) ?: $image; - - if (Type::isScalarType($image)) { - continue; - } - - return $image; - } - - return null; - } - - /** - * This method parses the given doc comment text for a var annotation and - * it returns the found property types. - * - * @param string $comment A doc comment text. - * @return array<string> - */ - private function parseVarAnnotation($comment) - { - if (preg_match(self::REGEXP_VAR_TYPE, $comment, $match) > 0) { - $useSymbolTable = $this->useSymbolTable; - - return array_map( - function ($image) use ($useSymbolTable) { - return $useSymbolTable->lookup($image) ?: $image; - }, - array_map('trim', explode('|', end($match))) - ); - } - - return array(); - } - - /** - * This method will extract the type information of a property from it's - * doc comment information. The returned value will be <b>null</b> when no - * type information exists. - * - * @return \PDepend\Source\AST\ASTType|null - * @since 0.9.6 - */ - private function parseFieldDeclarationType() - { - // Skip, if ignore annotations is set - if ($this->ignoreAnnotations === true) { - return null; - } - - $reference = $this->parseFieldDeclarationClassOrInterfaceReference(); - - if ($reference !== null) { - return $reference; - } - - $annotations = $this->parseVarAnnotation($this->docComment); - - foreach ($annotations as $annotation) { - if (Type::isPrimitiveType($annotation) === true) { - return $this->builder->buildAstScalarType( - Type::getPrimitiveType($annotation) - ); - } - - if (Type::isArrayType($annotation) === true) { - return $this->builder->buildAstTypeArray(); - } - } - - return null; - } - - /** - * Extracts non scalar types from a field doc comment and creates a - * matching type instance. - * - * @return \PDepend\Source\AST\ASTClassOrInterfaceReference|null - * @since 0.9.6 - */ - private function parseFieldDeclarationClassOrInterfaceReference() - { - $annotations = $this->parseVarAnnotation($this->docComment); - - foreach ($annotations as $annotation) { - if (Type::isScalarType($annotation) === false) { - return $this->builder->buildAstClassOrInterfaceReference( - $annotation - ); - } - } - - return null; - } - - /** - * This method parses a yield-statement node. - * - * @return \PDepend\Source\AST\ASTYieldStatement - */ - private function parseYield() - { - $this->tokenStack->push(); - - $token = $this->consumeToken(Tokens::T_YIELD); - $this->consumeComments(); - - $yield = $this->builder->buildAstYieldStatement($token->image); - - $node = $this->parseOptionalExpression(); - if ($node) { - $yield->addChild($node); - - if ($this->tokenizer->peek() === Tokens::T_DOUBLE_ARROW) { - $this->consumeToken(Tokens::T_DOUBLE_ARROW); - - $yield->addChild($this->parseOptionalExpression()); - } - } - - $this->consumeComments(); - - if (Tokens::T_PARENTHESIS_CLOSE === $this->tokenizer->peek()) { - return $this->setNodePositionsAndReturn($yield); - } - - $this->parseStatementTermination(); - - return $this->setNodePositionsAndReturn($yield); - } - - /** - * Extracts documented <b>throws</b> and <b>return</b> types and sets them - * to the given <b>$callable</b> instance. - * - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return void - */ - private function prepareCallable(AbstractASTCallable $callable) - { - // Skip, if ignore annotations is set - if ($this->ignoreAnnotations === true) { - return; - } - - // Get all @throws Types - $throws = $this->parseThrowsAnnotations($callable->getComment()); - foreach ($throws as $qualifiedName) { - $callable->addExceptionClassReference( - $this->builder->buildAstClassOrInterfaceReference($qualifiedName) - ); - } - - // Stop here if return class already exists. - if ($callable->hasReturnClass()) { - return; - } - - // Get return annotation - $qualifiedName = $this->parseReturnAnnotation($callable->getComment()); - if ($qualifiedName !== null) { - $callable->setReturnClassReference( - $this->builder->buildAstClassOrInterfaceReference($qualifiedName) - ); - } - } - - /** - * This method will consume the next token in the token stream. It will - * throw an exception if the type of this token is not identical with - * <b>$tokenType</b>. - * - * @param integer $tokenType The next expected token type. - * @return \PDepend\Source\Tokenizer\Token - * @throws \PDepend\Source\Parser\TokenStreamEndException - * @throws \PDepend\Source\Parser\UnexpectedTokenException - */ - protected function consumeToken($tokenType) - { - switch ($this->tokenizer->peek()) { - case $tokenType: - return $this->tokenStack->add($this->tokenizer->next()); - case Tokenizer::T_EOF: - throw new TokenStreamEndException($this->tokenizer); - } - - throw $this->getUnexpectedTokenException(); - } - - /** - * This method will consume all comment tokens from the token stream. - * - * @return void - */ - protected function consumeComments() - { - $type = $this->tokenizer->peek(); - while ($type == Tokens::T_COMMENT || $type == Tokens::T_DOC_COMMENT) { - $token = $this->consumeToken($type); - $type = $this->tokenizer->peek(); - - if (Tokens::T_COMMENT === $token->type) { - continue; - } - - $this->docComment = $token->image; - if (preg_match('(\s+@package\s+[^\s]+\s+)', $token->image)) { - $this->packageName = $this->parsePackageAnnotation($token->image); - } - } - } - - /** - * @return UnexpectedTokenException - */ - protected function getUnexpectedTokenException(Token $token = null) - { - return new UnexpectedTokenException( - (null === $token) ? $this->tokenizer->next() : $token, - $this->tokenizer->getSourceFile() - ); - } - - /** - * Throws an UnexpectedTokenException - * - * @param \PDepend\Source\Tokenizer\Token $token - * @return void - * @throws \PDepend\Source\Parser\UnexpectedTokenException - * @since 2.2.5 - */ - protected function throwUnexpectedTokenException(Token $token = null) - { - throw $this->getUnexpectedTokenException($token); - } - - protected function checkEllipsisInExpressionSupport() - { - $this->throwUnexpectedTokenException(); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPBuilder.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPBuilder.php deleted file mode 100644 index 89cecc5..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPBuilder.php +++ /dev/null @@ -1,2397 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Language\PHP; - -use PDepend\Source\AST\AbstractASTClassOrInterface; -use PDepend\Source\AST\ASTArtifactList; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTClassOrInterfaceReference; -use PDepend\Source\AST\ASTClassReference; -use PDepend\Source\AST\ASTCompilationUnit; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTNamespace; -use PDepend\Source\AST\ASTParentReference; -use PDepend\Source\AST\ASTTrait; -use PDepend\Source\Builder\Builder; -use PDepend\Source\Builder\BuilderContext\GlobalBuilderContext; -use PDepend\Util\Cache\CacheDriver; -use PDepend\Util\Log; -use PDepend\Util\Type; - -/** - * Default code tree builder implementation. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class PHPBuilder implements Builder -{ - /** - * The internal used cache instance. - * - * @var \PDepend\Util\Cache\CacheDriver - * @since 0.10.0 - */ - protected $cache = null; - - /** - * The ast builder context. - * - * @var \PDepend\Source\Builder\BuilderContext - * @since 0.10.0 - */ - protected $context = null; - - /** - * This property holds all packages found during the parsing phase. - * - * @var \PDepend\Source\AST\ASTNamespace[] - * @since 0.9.12 - */ - private $preparedNamespaces = null; - - /** - * Default package which contains all functions and classes with an unknown - * scope. - * - * @var \PDepend\Source\AST\ASTNamespace - */ - protected $defaultPackage = null; - - /** - * Default source file that acts as a dummy. - * - * @var ASTCompilationUnit - */ - protected $defaultCompilationUnit = null; - - /** - * All generated {@link \PDepend\Source\AST\ASTTrait} objects - * - * @var \PDepend\Source\AST\ASTTrait[] - */ - private $traits = array(); - - /** - * All generated {@link \PDepend\Source\AST\ASTClass} objects - * - * @var \PDepend\Source\AST\ASTClass[] - */ - private $classes = array(); - - /** - * All generated {@link \PDepend\Source\AST\ASTInterface} instances. - * - * @var \PDepend\Source\AST\ASTInterface[] - */ - private $interfaces = array(); - - /** - * All generated {@link \PDepend\Source\AST\ASTNamespace} objects - * - * @var \PDepend\Source\AST\ASTNamespace[] - */ - private $namespaces = array(); - - /** - * Internal status flag used to check that a build request is internal. - * - * @var boolean - */ - private $internal = false; - - /** - * Internal used flag that marks the parsing process as frozen. - * - * @var boolean - */ - private $frozen = false; - - /** - * Cache of all traits created during the regular parsing process. - * - * @var \PDepend\Source\AST\ASTTrait[] - */ - private $frozenTraits = array(); - - /** - * Cache of all classes created during the regular parsing process. - * - * @var \PDepend\Source\AST\ASTClass[] - */ - private $frozenClasses = array(); - - /** - * Cache of all interfaces created during the regular parsing process. - * - * @var \PDepend\Source\AST\ASTInterface[] - */ - private $frozenInterfaces = array(); - - /** - * Constructs a new builder instance. - */ - public function __construct() - { - $this->defaultPackage = new ASTNamespace(self::DEFAULT_NAMESPACE); - $this->defaultCompilationUnit = new ASTCompilationUnit(null); - - $this->namespaces[self::DEFAULT_NAMESPACE] = $this->defaultPackage; - - $this->context = new GlobalBuilderContext($this); - } - - /** - * Setter method for the currently used token cache. - * - * @param \PDepend\Util\Cache\CacheDriver $cache - * @return \PDepend\Source\Language\PHP\PHPBuilder - * @since 0.10.0 - */ - public function setCache(CacheDriver $cache) - { - $this->cache = $cache; - return $this; - } - - /** - * Builds a new code type reference instance. - * - * @param string $qualifiedName The qualified name of the referenced type. - * - * @return ASTClassOrInterfaceReference - * @since 0.9.5 - */ - public function buildAstClassOrInterfaceReference($qualifiedName) - { - $this->checkBuilderState(); - - // Debug method creation - Log::debug( - 'Creating: \PDepend\Source\AST\ASTClassOrInterfaceReference(' . - $qualifiedName . - ')' - ); - - return new ASTClassOrInterfaceReference($this->context, $qualifiedName); - } - - /** - * Builds a new code type reference instance, either Class or ClassOrInterface. - * - * @param string $qualifiedName The qualified name of the referenced type. - * @param bool $classReference true if class reference only. - * - * @return ASTClassOrInterfaceReference - * @since 0.9.5 - */ - public function buildAstNeededReference($qualifiedName, $classReference) - { - if ($classReference === true) { - return $this->buildAstClassReference($qualifiedName); - } - - return $this->buildAstClassOrInterfaceReference($qualifiedName); - } - - /** - * This method will try to find an already existing instance for the given - * qualified name. It will create a new {@link \PDepend\Source\AST\ASTClass} - * instance when no matching type exists. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\AbstractASTClassOrInterface - * @since 0.9.5 - */ - public function getClassOrInterface($qualifiedName) - { - $classOrInterface = $this->findClass($qualifiedName); - if ($classOrInterface !== null) { - return $classOrInterface; - } - - $classOrInterface = $this->findInterface($qualifiedName); - if ($classOrInterface !== null) { - return $classOrInterface; - } - return $this->buildClassInternal($qualifiedName); - } - - /** - * Builds a new php trait instance. - * - * @param string $qualifiedName The full qualified trait name. - * - * @return \PDepend\Source\AST\ASTTrait - * @since 1.0.0 - */ - public function buildTrait($qualifiedName) - { - $this->checkBuilderState(); - - $trait = new ASTTrait($this->extractTypeName($qualifiedName)); - $trait->setCache($this->cache) - ->setContext($this->context) - ->setCompilationUnit($this->defaultCompilationUnit); - - return $trait; - } - - /** - * This method will try to find an already existing instance for the given - * qualified name. It will create a new {@link \PDepend\Source\AST\ASTTrait} - * instance when no matching type exists. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTTrait - * @since 1.0.0 - */ - public function getTrait($qualifiedName) - { - $trait = $this->findTrait($qualifiedName); - if ($trait === null) { - $trait = $this->buildTraitInternal($qualifiedName); - } - return $trait; - } - - /** - * Builds a new trait reference node. - * - * @param string $qualifiedName The full qualified trait name. - * - * @return \PDepend\Source\AST\ASTTraitReference - * @since 1.0.0 - */ - public function buildAstTraitReference($qualifiedName) - { - $this->checkBuilderState(); - - Log::debug( - 'Creating: \PDepend\Source\AST\ASTTraitReference(' . $qualifiedName . ')' - ); - - return new \PDepend\Source\AST\ASTTraitReference($this->context, $qualifiedName); - } - - /** - * Builds a new class instance or reuses a previous created class. - * - * Where possible you should give a qualified class name, that is prefixed - * with the package identifier. - * - * <code> - * $builder->buildClass('php::depend::Parser'); - * </code> - * - * To determine the correct class, this method implements the following - * algorithm. - * - * <ol> - * <li>Check for an exactly matching instance and reuse it.</li> - * <li>Check for a class instance that belongs to the default package. If - * such an instance exists, reuse it and replace the default package with - * the newly given package information.</li> - * <li>Check that the requested class is in the default package, if this - * is true, reuse the first class instance and ignore the default package. - * </li> - * <li>Create a new instance for the specified package.</li> - * </ol> - * - * @param string $name The class name. - * - * @return \PDepend\Source\AST\ASTClass The created class object. - */ - public function buildClass($name) - { - $this->checkBuilderState(); - - $class = new ASTClass($this->extractTypeName($name)); - $class->setCache($this->cache) - ->setContext($this->context) - ->setCompilationUnit($this->defaultCompilationUnit); - - return $class; - } - - /** - * This method will try to find an already existing instance for the given - * qualified name. It will create a new {@link \PDepend\Source\AST\ASTClass} - * instance when no matching type exists. - * - * @param string $qualifiedName The full qualified type identifier. - * - * @return \PDepend\Source\AST\ASTClass - * @since 0.9.5 - */ - public function getClass($qualifiedName) - { - $class = $this->findClass($qualifiedName); - if ($class === null) { - $class = $this->buildClassInternal($qualifiedName); - } - return $class; - } - - /** - * Builds an anonymous class instance. - * - * @return \PDepend\Source\AST\ASTAnonymousClass - */ - public function buildAnonymousClass() - { - return $this->buildAstNodeInstance('ASTAnonymousClass') - ->setCache($this->cache) - ->setContext($this->context); - } - - /** - * Builds a new code type reference instance. - * - * @param string $qualifiedName The qualified name of the referenced type. - * - * @return \PDepend\Source\AST\ASTClassReference - * @since 0.9.5 - */ - public function buildAstClassReference($qualifiedName) - { - $this->checkBuilderState(); - - // Debug method creation - Log::debug( - 'Creating: \PDepend\Source\AST\ASTClassReference(' . $qualifiedName . ')' - ); - - return new ASTClassReference($this->context, $qualifiedName); - } - - /** - * Builds a new new interface instance. - * - * If there is an existing class instance for the given name, this method - * checks if this class is part of the default namespace. If this is the - * case this method will update all references to the new interface and it - * removes the class instance. Otherwise it creates new interface instance. - * - * Where possible you should give a qualified interface name, that is - * prefixed with the package identifier. - * - * <code> - * $builder->buildInterface('php::depend::Parser'); - * </code> - * - * To determine the correct interface, this method implements the following - * algorithm. - * - * <ol> - * <li>Check for an exactly matching instance and reuse it.</li> - * <li>Check for a interface instance that belongs to the default package. - * If such an instance exists, reuse it and replace the default package - * with the newly given package information.</li> - * <li>Check that the requested interface is in the default package, if - * this is true, reuse the first interface instance and ignore the default - * package. - * </li> - * <li>Create a new instance for the specified package.</li> - * </ol> - * - * @param string $name The interface name. - * @return \PDepend\Source\AST\ASTInterface - */ - public function buildInterface($name) - { - $this->checkBuilderState(); - - $interface = new ASTInterface($this->extractTypeName($name)); - $interface->setCache($this->cache) - ->setContext($this->context) - ->setCompilationUnit($this->defaultCompilationUnit); - - return $interface; - } - - /** - * This method will try to find an already existing instance for the given - * qualified name. It will create a new {@link \PDepend\Source\AST\ASTInterface} - * instance when no matching type exists. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTInterface - * @since 0.9.5 - */ - public function getInterface($qualifiedName) - { - $interface = $this->findInterface($qualifiedName); - if ($interface === null) { - $interface = $this->buildInterfaceInternal($qualifiedName); - } - return $interface; - } - - /** - * Builds a new method instance. - * - * @param string $name - * @return \PDepend\Source\AST\ASTMethod - */ - public function buildMethod($name) - { - $this->checkBuilderState(); - - // Debug method creation - Log::debug("Creating: \\PDepend\\Source\\AST\\ASTMethod({$name})"); - - // Create a new method instance - $method = new ASTMethod($name); - $method->setCache($this->cache); - - return $method; - } - - /** - * Builds a new package instance. - * - * @param string $name The package name. - * @return \PDepend\Source\AST\ASTNamespace - */ - public function buildNamespace($name) - { - if (!isset($this->namespaces[$name])) { - // Debug package creation - Log::debug( - 'Creating: \\PDepend\\Source\\AST\\ASTNamespace(' . $name . ')' - ); - - $this->namespaces[$name] = new ASTNamespace($name); - } - return $this->namespaces[$name]; - } - - /** - * Builds a new function instance. - * - * @param string $name The function name. - * @return ASTFunction - */ - public function buildFunction($name) - { - $this->checkBuilderState(); - - // Debug function creation - Log::debug("Creating: \\PDepend\\Source\\AST\\ASTFunction({$name})"); - - // Create new function - $function = new ASTFunction($name); - $function->setCache($this->cache) - ->setContext($this->context) - ->setCompilationUnit($this->defaultCompilationUnit); - - return $function; - } - - /** - * Builds a new self reference instance. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $type - * @return \PDepend\Source\AST\ASTSelfReference - * @since 0.9.6 - */ - public function buildAstSelfReference(AbstractASTClassOrInterface $type) - { - Log::debug( - 'Creating: \PDepend\Source\AST\ASTSelfReference(' . $type->getName() . ')' - ); - - return new \PDepend\Source\AST\ASTSelfReference($this->context, $type); - } - - /** - * Builds a new parent reference instance. - * - * @param ASTClassOrInterfaceReference $reference The type - * instance that reference the concrete target of parent. - * - * @return ASTParentReference - * @since 0.9.6 - */ - public function buildAstParentReference(ASTClassOrInterfaceReference $reference) - { - Log::debug('Creating: \PDepend\Source\AST\ASTParentReference()'); - - return new ASTParentReference($reference); - } - - /** - * Builds a new static reference instance. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $owner - * @return \PDepend\Source\AST\ASTStaticReference - * @since 0.9.6 - */ - public function buildAstStaticReference(AbstractASTClassOrInterface $owner) - { - Log::debug('Creating: \PDepend\Source\AST\ASTStaticReference()'); - - return new \PDepend\Source\AST\ASTStaticReference($this->context, $owner); - } - - /** - * Builds a new field declaration node. - * - * @return \PDepend\Source\AST\ASTFieldDeclaration - * @since 0.9.6 - */ - public function buildAstFieldDeclaration() - { - return $this->buildAstNodeInstance('ASTFieldDeclaration'); - } - - /** - * Builds a new variable declarator node. - * - * @param string $image The source image for the variable declarator. - * - * @return \PDepend\Source\AST\ASTVariableDeclarator - * @since 0.9.6 - */ - public function buildAstVariableDeclarator($image) - { - return $this->buildAstNodeInstance('ASTVariableDeclarator', $image); - } - - /** - * Builds a new static variable declaration node. - * - * @param string $image The source image for the statuc declaration. - * - * @return \PDepend\Source\AST\ASTStaticVariableDeclaration - * @since 0.9.6 - */ - public function buildAstStaticVariableDeclaration($image) - { - return $this->buildAstNodeInstance('ASTStaticVariableDeclaration', $image); - } - - /** - * Builds a new constant node. - * - * @param string $image The source image for the constant. - * - * @return \PDepend\Source\AST\ASTConstant - * @since 0.9.6 - */ - public function buildAstConstant($image) - { - return $this->buildAstNodeInstance('ASTConstant', $image); - } - - /** - * Builds a new variable node. - * - * @param string $image The source image for the variable. - * - * @return \PDepend\Source\AST\ASTVariable - * @since 0.9.6 - */ - public function buildAstVariable($image) - { - return $this->buildAstNodeInstance('ASTVariable', $image); - } - - /** - * Builds a new variable variable node. - * - * @param string $image The source image for the variable variable. - * - * @return \PDepend\Source\AST\ASTVariableVariable - * @since 0.9.6 - */ - public function buildAstVariableVariable($image) - { - return $this->buildAstNodeInstance('ASTVariableVariable', $image); - } - - /** - * Builds a new compound variable node. - * - * @param string $image The source image for the compound variable. - * - * @return \PDepend\Source\AST\ASTCompoundVariable - * @since 0.9.6 - */ - public function buildAstCompoundVariable($image) - { - return $this->buildAstNodeInstance('ASTCompoundVariable', $image); - } - - /** - * Builds a new compound expression node. - * - * @return \PDepend\Source\AST\ASTCompoundExpression - * @since 0.9.6 - */ - public function buildAstCompoundExpression() - { - return $this->buildAstNodeInstance('ASTCompoundExpression'); - } - - /** - * Builds a new closure node. - * - * @return \PDepend\Source\AST\ASTClosure - * @since 0.9.12 - */ - public function buildAstClosure() - { - return $this->buildAstNodeInstance('ASTClosure'); - } - - /** - * Builds a new formal parameters node. - * - * @return \PDepend\Source\AST\ASTFormalParameters - * @since 0.9.6 - */ - public function buildAstFormalParameters() - { - return $this->buildAstNodeInstance('ASTFormalParameters'); - } - - /** - * Builds a new formal parameter node. - * - * @return \PDepend\Source\AST\ASTFormalParameter - * @since 0.9.6 - */ - public function buildAstFormalParameter() - { - return $this->buildAstNodeInstance('ASTFormalParameter'); - } - - /** - * Builds a new expression node. - * - * @param string $image - * @return \PDepend\Source\AST\ASTExpression - * @since 0.9.8 - */ - public function buildAstExpression($image = null) - { - return $this->buildAstNodeInstance('ASTExpression', $image); - } - - /** - * Builds a new assignment expression node. - * - * @param string $image The assignment operator. - * - * @return \PDepend\Source\AST\ASTAssignmentExpression - * @since 0.9.8 - */ - public function buildAstAssignmentExpression($image) - { - return $this->buildAstNodeInstance('ASTAssignmentExpression', $image); - } - - /** - * Builds a new allocation expression node. - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTAllocationExpression - * @since 0.9.6 - */ - public function buildAstAllocationExpression($image) - { - return $this->buildAstNodeInstance('ASTAllocationExpression', $image); - } - - /** - * Builds a new eval-expression node. - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTEvalExpression - * @since 0.9.12 - */ - public function buildAstEvalExpression($image) - { - return $this->buildAstNodeInstance('ASTEvalExpression', $image); - } - - /** - * Builds a new exit-expression instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTExitExpression - * @since 0.9.12 - */ - public function buildAstExitExpression($image) - { - return $this->buildAstNodeInstance('ASTExitExpression', $image); - } - - /** - * Builds a new clone-expression node. - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTCloneExpression - * @since 0.9.12 - */ - public function buildAstCloneExpression($image) - { - return $this->buildAstNodeInstance('ASTCloneExpression', $image); - } - - /** - * Builds a new list-expression node. - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTListExpression - * @since 0.9.12 - */ - public function buildAstListExpression($image) - { - return $this->buildAstNodeInstance('ASTListExpression', $image); - } - - /** - * Builds a new include- or include_once-expression. - * - * @return \PDepend\Source\AST\ASTIncludeExpression - * @since 0.9.12 - */ - public function buildAstIncludeExpression() - { - return $this->buildAstNodeInstance('ASTIncludeExpression'); - } - - /** - * Builds a new require- or require_once-expression. - * - * @return \PDepend\Source\AST\ASTRequireExpression - * @since 0.9.12 - */ - public function buildAstRequireExpression() - { - return $this->buildAstNodeInstance('ASTRequireExpression'); - } - - /** - * Builds a new array-expression node. - * - * @return \PDepend\Source\AST\ASTArrayIndexExpression - * @since 0.9.12 - */ - public function buildAstArrayIndexExpression() - { - return $this->buildAstNodeInstance('ASTArrayIndexExpression'); - } - - /** - * Builds a new string-expression node. - * - * <code> - * // -------- - * $string{$index} - * // -------- - * </code> - * - * @return \PDepend\Source\AST\ASTStringIndexExpression - * @since 0.9.12 - */ - public function buildAstStringIndexExpression() - { - return $this->buildAstNodeInstance('ASTStringIndexExpression'); - } - - /** - * Builds a new php array node. - * - * @return \PDepend\Source\AST\ASTArray - * @since 1.0.0 - */ - public function buildAstArray() - { - return $this->buildAstNodeInstance('ASTArray'); - } - - /** - * Builds a new array element node. - * - * @return \PDepend\Source\AST\ASTArrayElement - * @since 1.0.0 - */ - public function buildAstArrayElement() - { - return $this->buildAstNodeInstance('ASTArrayElement'); - } - - - /** - * Builds a new instanceof expression node. - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTInstanceOfExpression - * @since 0.9.6 - */ - public function buildAstInstanceOfExpression($image) - { - return $this->buildAstNodeInstance('ASTInstanceOfExpression', $image); - } - - /** - * Builds a new isset-expression node. - * - * <code> - * // ----------- - * if (isset($foo)) { - * // ----------- - * } - * - * // ----------------------- - * if (isset($foo, $bar, $baz)) { - * // ----------------------- - * } - * </code> - * - * @return \PDepend\Source\AST\ASTIssetExpression - * @since 0.9.12 - */ - public function buildAstIssetExpression() - { - return $this->buildAstNodeInstance('ASTIssetExpression'); - } - - /** - * Builds a new boolean conditional-expression. - * - * <code> - * -------------- - * $bar = ($foo ? 42 : 23); - * -------------- - * </code> - * - * @return \PDepend\Source\AST\ASTConditionalExpression - * @since 0.9.8 - */ - public function buildAstConditionalExpression() - { - return $this->buildAstNodeInstance('ASTConditionalExpression', '?'); - } - - /** - * Builds a new print-expression. - * - * <code> - * ------------- - * print "qafoo"; - * ------------- - * </code> - * - * @return \PDepend\Source\AST\ASTPrintExpression - * @since 2.3 - */ - public function buildAstPrintExpression() - { - return $this->buildAstNodeInstance('ASTPrintExpression', 'print'); - } - - /** - * Build a new shift left expression. - * - * @return \PDepend\Source\AST\ASTShiftLeftExpression - * @since 1.0.1 - */ - public function buildAstShiftLeftExpression() - { - return $this->buildAstNodeInstance('ASTShiftLeftExpression'); - } - - /** - * Build a new shift right expression. - * - * @return \PDepend\Source\AST\ASTShiftRightExpression - * @since 1.0.1 - */ - public function buildAstShiftRightExpression() - { - return $this->buildAstNodeInstance('ASTShiftRightExpression'); - } - - /** - * Builds a new boolean and-expression. - * - * @return \PDepend\Source\AST\ASTBooleanAndExpression - * @since 0.9.8 - */ - public function buildAstBooleanAndExpression() - { - return $this->buildAstNodeInstance('ASTBooleanAndExpression', '&&'); - } - - /** - * Builds a new boolean or-expression. - * - * @return \PDepend\Source\AST\ASTBooleanOrExpression - * @since 0.9.8 - */ - public function buildAstBooleanOrExpression() - { - return $this->buildAstNodeInstance('ASTBooleanOrExpression', '||'); - } - - /** - * Builds a new logical <b>and</b>-expression. - * - * @return \PDepend\Source\AST\ASTLogicalAndExpression - * @since 0.9.8 - */ - public function buildAstLogicalAndExpression() - { - return $this->buildAstNodeInstance('ASTLogicalAndExpression', 'and'); - } - - /** - * Builds a new logical <b>or</b>-expression. - * - * @return \PDepend\Source\AST\ASTLogicalOrExpression - * @since 0.9.8 - */ - public function buildAstLogicalOrExpression() - { - return $this->buildAstNodeInstance('ASTLogicalOrExpression', 'or'); - } - - /** - * Builds a new logical <b>xor</b>-expression. - * - * @return \PDepend\Source\AST\ASTLogicalXorExpression - * @since 0.9.8 - */ - public function buildAstLogicalXorExpression() - { - return $this->buildAstNodeInstance('ASTLogicalXorExpression', 'xor'); - } - - /** - * Builds a new trait use-statement node. - * - * @return \PDepend\Source\AST\ASTTraitUseStatement - * @since 1.0.0 - */ - public function buildAstTraitUseStatement() - { - return $this->buildAstNodeInstance('ASTTraitUseStatement'); - } - - /** - * Builds a new trait adaptation scope - * - * @return \PDepend\Source\AST\ASTTraitAdaptation - * @since 1.0.0 - */ - public function buildAstTraitAdaptation() - { - return $this->buildAstNodeInstance('ASTTraitAdaptation'); - } - - /** - * Builds a new trait adaptation alias statement. - * - * @param string $image The trait method name. - * - * @return \PDepend\Source\AST\ASTTraitAdaptationAlias - * @since 1.0.0 - */ - public function buildAstTraitAdaptationAlias($image) - { - return $this->buildAstNodeInstance('ASTTraitAdaptationAlias', $image); - } - - /** - * Builds a new trait adaptation precedence statement. - * - * @param string $image The trait method name. - * - * @return \PDepend\Source\AST\ASTTraitAdaptationPrecedence - * @since 1.0.0 - */ - public function buildAstTraitAdaptationPrecedence($image) - { - return $this->buildAstNodeInstance('ASTTraitAdaptationPrecedence', $image); - } - - /** - * Builds a new switch-statement-node. - * - * @return \PDepend\Source\AST\ASTSwitchStatement - * @since 0.9.8 - */ - public function buildAstSwitchStatement() - { - return $this->buildAstNodeInstance('ASTSwitchStatement'); - } - - /** - * Builds a new switch-label node. - * - * @param string $image The source image of this label. - * - * @return \PDepend\Source\AST\ASTSwitchLabel - * @since 0.9.8 - */ - public function buildAstSwitchLabel($image) - { - return $this->buildAstNodeInstance('ASTSwitchLabel', $image); - } - - /** - * Builds a new global-statement instance. - * - * @return \PDepend\Source\AST\ASTGlobalStatement - * @since 0.9.12 - */ - public function buildAstGlobalStatement() - { - return $this->buildAstNodeInstance('ASTGlobalStatement'); - } - - /** - * Builds a new unset-statement instance. - * - * @return \PDepend\Source\AST\ASTUnsetStatement - * @since 0.9.12 - */ - public function buildAstUnsetStatement() - { - return $this->buildAstNodeInstance('ASTUnsetStatement'); - } - - /** - * Builds a new catch-statement node. - * - * @param string $image - * @return \PDepend\Source\AST\ASTCatchStatement - * @since 0.9.8 - */ - public function buildAstCatchStatement($image) - { - return $this->buildAstNodeInstance('ASTCatchStatement', $image); - } - - /** - * Builds a new finally-statement node. - * - * @return \PDepend\Source\AST\ASTFinallyStatement - * @since 2.0.0 - */ - public function buildAstFinallyStatement() - { - return $this->buildAstNodeInstance('ASTFinallyStatement', 'finally'); - } - - /** - * Builds a new if statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTIfStatement - * @since 0.9.8 - */ - public function buildAstIfStatement($image) - { - return $this->buildAstNodeInstance('ASTIfStatement', $image); - } - - /** - * Builds a new elseif statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTElseIfStatement - * @since 0.9.8 - */ - public function buildAstElseIfStatement($image) - { - return $this->buildAstNodeInstance('ASTElseIfStatement', $image); - } - - /** - * Builds a new for statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTForStatement - * @since 0.9.8 - */ - public function buildAstForStatement($image) - { - return $this->buildAstNodeInstance('ASTForStatement', $image); - } - - /** - * Builds a new for-init node. - * - * <code> - * ------------------------ - * for ($x = 0, $y = 23, $z = 42; $x < $y; ++$x) {} - * ------------------------ - * </code> - * - * @return \PDepend\Source\AST\ASTForInit - * @since 0.9.8 - */ - public function buildAstForInit() - { - return $this->buildAstNodeInstance('ASTForInit'); - } - - /** - * Builds a new for-update node. - * - * <code> - * ------------------------------- - * for ($x = 0, $y = 23, $z = 42; $x < $y; ++$x, $y = $x + 1, $z = $x + 2) {} - * ------------------------------- - * </code> - * - * @return \PDepend\Source\AST\ASTForUpdate - * @since 0.9.12 - */ - public function buildAstForUpdate() - { - return $this->buildAstNodeInstance('ASTForUpdate'); - } - - /** - * Builds a new foreach-statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTForeachStatement - * @since 0.9.8 - */ - public function buildAstForeachStatement($image) - { - return $this->buildAstNodeInstance('ASTForeachStatement', $image); - } - - /** - * Builds a new while-statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTWhileStatement - * @since 0.9.8 - */ - public function buildAstWhileStatement($image) - { - return $this->buildAstNodeInstance('ASTWhileStatement', $image); - } - - /** - * Builds a new do/while-statement node. - * - * @param string $image The source image of this statement. - * - * @return \PDepend\Source\AST\ASTDoWhileStatement - * @since 0.9.12 - */ - public function buildAstDoWhileStatement($image) - { - return $this->buildAstNodeInstance('ASTDoWhileStatement', $image); - } - - /** - * Builds a new declare-statement node. - * - * <code> - * ------------------------------- - * declare(encoding='ISO-8859-1'); - * ------------------------------- - * - * ------------------- - * declare(ticks=42) { - * // ... - * } - * - - * - * ------------------ - * declare(ticks=42): - * // ... - * enddeclare; - * ----------- - * </code> - * - * @return \PDepend\Source\AST\ASTDeclareStatement - * @since 0.10.0 - */ - public function buildAstDeclareStatement() - { - return $this->buildAstNodeInstance('ASTDeclareStatement'); - } - - /** - * Builds a new member primary expression node. - * - * <code> - * //-------- - * Foo::bar(); - * //-------- - * - * //--------- - * Foo::$bar(); - * //--------- - * - * //--------- - * $obj->bar(); - * //--------- - * - * //---------- - * $obj->$bar(); - * //---------- - * </code> - * - * @param string $image The source image of this expression. - * - * @return \PDepend\Source\AST\ASTMemberPrimaryPrefix - * @since 0.9.6 - */ - public function buildAstMemberPrimaryPrefix($image) - { - return $this->buildAstNodeInstance('ASTMemberPrimaryPrefix', $image); - } - - /** - * Builds a new identifier node. - * - * @param string $image The image of this identifier. - * - * @return \PDepend\Source\AST\ASTIdentifier - * @since 0.9.6 - */ - public function buildAstIdentifier($image) - { - return $this->buildAstNodeInstance('ASTIdentifier', $image); - } - - /** - * Builds a new function postfix expression. - * - * <code> - * //------- - * foo($bar); - * //------- - * - * //-------- - * $foo($bar); - * //-------- - * </code> - * - * @param string $image The image of this node. - * - * @return \PDepend\Source\AST\ASTFunctionPostfix - * @since 0.9.6 - */ - public function buildAstFunctionPostfix($image) - { - return $this->buildAstNodeInstance('ASTFunctionPostfix', $image); - } - - /** - * Builds a new method postfix expression. - * - * <code> - * // --------- - * Foo::bar($baz); - * // --------- - * - * // ---------- - * Foo::$bar($baz); - * // ---------- - * </code> - * - * @param string $image The image of this node. - * - * @return \PDepend\Source\AST\ASTMethodPostfix - * @since 0.9.6 - */ - public function buildAstMethodPostfix($image) - { - return $this->buildAstNodeInstance('ASTMethodPostfix', $image); - } - - /** - * Builds a new constant postfix expression. - * - * <code> - * // --- - * Foo::BAR; - * // --- - * </code> - * - * @param string $image The image of this node. - * - * @return \PDepend\Source\AST\ASTConstantPostfix - * @since 0.9.6 - */ - public function buildAstConstantPostfix($image) - { - return $this->buildAstNodeInstance('ASTConstantPostfix', $image); - } - - /** - * Builds a new property postfix expression. - * - * <code> - * // ---- - * Foo::$bar; - * // ---- - * - * // --- - * $object->bar; - * // --- - * </code> - * - * @param string $image The image of this node. - * - * @return \PDepend\Source\AST\ASTPropertyPostfix - * @since 0.9.6 - */ - public function buildAstPropertyPostfix($image) - { - return $this->buildAstNodeInstance('ASTPropertyPostfix', $image); - } - - /** - * Builds a new full qualified class name postfix expression. - * - * <code> - * // ----- - * Foo::class; - * // ----- - * - * // ----- - * $object::class; - * // ----- - * </code> - * - * @return \PDepend\Source\AST\ASTClassFqnPostfix - * @since 2.0.0 - */ - public function buildAstClassFqnPostfix() - { - return $this->buildAstNodeInstance('ASTClassFqnPostfix', 'class'); - } - - /** - * Builds a new arguments list. - * - * <code> - * // ------------ - * Foo::bar($x, $y, $z); - * // ------------ - * - * // ------------ - * $foo->bar($x, $y, $z); - * // ------------ - * </code> - * - * @return \PDepend\Source\AST\ASTArguments - * @since 0.9.6 - */ - public function buildAstArguments() - { - return $this->buildAstNodeInstance('ASTArguments'); - } - - /** - * Builds a new array type node. - * - * @return \PDepend\Source\AST\ASTTypeArray - * @since 0.9.6 - */ - public function buildAstTypeArray() - { - return $this->buildAstNodeInstance('ASTTypeArray'); - } - - /** - * Builds a new node for the callable type. - * - * @return \PDepend\Source\AST\ASTTypeCallable - * @since 1.0.0 - */ - public function buildAstTypeCallable() - { - return $this->buildAstNodeInstance('ASTTypeCallable'); - } - - /** - * Builds a new node for the iterable type. - * - * @return \PDepend\Source\AST\ASTTypeIterable - * @since 2.5.1 - */ - public function buildAstTypeIterable() - { - return $this->buildAstNodeInstance('ASTTypeIterable'); - } - - /** - * Builds a new primitive type node. - * - * @param string $image The source image for the primitive type. - * - * @return \PDepend\Source\AST\ASTScalarType - * @since 0.9.6 - */ - public function buildAstScalarType($image) - { - return $this->buildAstNodeInstance('ASTScalarType', $image); - } - - /** - * Builds a new literal node. - * - * @param string $image The source image for the literal node. - * - * @return \PDepend\Source\AST\ASTLiteral - * @since 0.9.6 - */ - public function buildAstLiteral($image) - { - return $this->buildAstNodeInstance('ASTLiteral', $image); - } - - /** - * Builds a new php string node. - * - * <code> - * $string = "Manuel $Pichler <{$email}>"; - * - * // \PDepend\Source\AST\ASTString - * // |-- ASTLiteral - "Manuel ") - * // |-- ASTVariable - $Pichler - * // |-- ASTLiteral - " <" - * // |-- ASTCompoundExpression - {...} - * // | |-- ASTVariable - $email - * // |-- ASTLiteral - ">" - * </code> - * - * @return \PDepend\Source\AST\ASTString - * @since 0.9.10 - */ - public function buildAstString() - { - return $this->buildAstNodeInstance('ASTString'); - } - - /** - * Builds a new heredoc node. - * - * @return \PDepend\Source\AST\ASTHeredoc - * @since 0.9.12 - */ - public function buildAstHeredoc() - { - return $this->buildAstNodeInstance('ASTHeredoc'); - } - - /** - * Builds a new constant definition node. - * - * <code> - * class Foo - * { - * // ------------------------ - * const FOO = 42, BAR = 23; - * // ------------------------ - * } - * </code> - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTConstantDefinition - * @since 0.9.6 - */ - public function buildAstConstantDefinition($image) - { - return $this->buildAstNodeInstance('ASTConstantDefinition', $image); - } - - /** - * Builds a new constant declarator node. - * - * <code> - * class Foo - * { - * // -------- - * const BAR = 42; - * // -------- - * } - * </code> - * - * Or in a comma separated constant defintion: - * - * <code> - * class Foo - * { - * // -------- - * const BAR = 42, - * // -------- - * - * // -------------- - * const BAZ = 'Foobar', - * // -------------- - * - * // ---------- - * const FOO = 3.14; - * // ---------- - * } - * </code> - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTConstantDeclarator - * @since 0.9.6 - */ - public function buildAstConstantDeclarator($image) - { - return $this->buildAstNodeInstance('ASTConstantDeclarator', $image); - } - - /** - * Builds a new comment node instance. - * - * @param string $cdata The comment text. - * - * @return \PDepend\Source\AST\ASTComment - * @since 0.9.8 - */ - public function buildAstComment($cdata) - { - return $this->buildAstNodeInstance('ASTComment', $cdata); - } - - /** - * Builds a new unary expression node instance. - * - * @param string $image The unary expression image/character. - * - * @return \PDepend\Source\AST\ASTUnaryExpression - * @since 0.9.11 - */ - public function buildAstUnaryExpression($image) - { - return $this->buildAstNodeInstance('ASTUnaryExpression', $image); - } - - /** - * Builds a new cast-expression node instance. - * - * @param string $image The cast-expression image/character. - * - * @return \PDepend\Source\AST\ASTCastExpression - * @since 0.10.0 - */ - public function buildAstCastExpression($image) - { - return $this->buildAstNodeInstance('ASTCastExpression', $image); - } - - /** - * Builds a new postfix-expression node instance. - * - * @param string $image The postfix-expression image/character. - * - * @return \PDepend\Source\AST\ASTPostfixExpression - * @since 0.10.0 - */ - public function buildAstPostfixExpression($image) - { - return $this->buildAstNodeInstance('ASTPostfixExpression', $image); - } - - /** - * Builds a new pre-increment-expression node instance. - * - * @return \PDepend\Source\AST\ASTPreIncrementExpression - * @since 0.10.0 - */ - public function buildAstPreIncrementExpression() - { - return $this->buildAstNodeInstance('ASTPreIncrementExpression'); - } - - /** - * Builds a new pre-decrement-expression node instance. - * - * @return \PDepend\Source\AST\ASTPreDecrementExpression - * @since 0.10.0 - */ - public function buildAstPreDecrementExpression() - { - return $this->buildAstNodeInstance('ASTPreDecrementExpression'); - } - - /** - * Builds a new function/method scope instance. - * - * @return \PDepend\Source\AST\ASTScope - * @since 0.9.12 - */ - public function buildAstScope() - { - return $this->buildAstNodeInstance('ASTScope'); - } - - /** - * Builds a new statement instance. - * - * @return \PDepend\Source\AST\ASTStatement - * @since 0.9.12 - */ - public function buildAstStatement() - { - return $this->buildAstNodeInstance('ASTStatement'); - } - - /** - * Builds a new return statement node instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTReturnStatement - * @since 0.9.12 - */ - public function buildAstReturnStatement($image) - { - return $this->buildAstNodeInstance('ASTReturnStatement', $image); - } - - /** - * Builds a new break-statement node instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTBreakStatement - * @since 0.9.12 - */ - public function buildAstBreakStatement($image) - { - return $this->buildAstNodeInstance('ASTBreakStatement', $image); - } - - /** - * Builds a new continue-statement node instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTContinueStatement - * @since 0.9.12 - */ - public function buildAstContinueStatement($image) - { - return $this->buildAstNodeInstance('ASTContinueStatement', $image); - } - - /** - * Builds a new scope-statement instance. - * - * @return \PDepend\Source\AST\ASTScopeStatement - * @since 0.9.12 - */ - public function buildAstScopeStatement() - { - return $this->buildAstNodeInstance('ASTScopeStatement'); - } - - /** - * Builds a new try-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTTryStatement - * @since 0.9.12 - */ - public function buildAstTryStatement($image) - { - return $this->buildAstNodeInstance('ASTTryStatement', $image); - } - - /** - * Builds a new throw-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTThrowStatement - * @since 0.9.12 - */ - public function buildAstThrowStatement($image) - { - return $this->buildAstNodeInstance('ASTThrowStatement', $image); - } - - /** - * Builds a new goto-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTGotoStatement - * @since 0.9.12 - */ - public function buildAstGotoStatement($image) - { - return $this->buildAstNodeInstance('ASTGotoStatement', $image); - } - - /** - * Builds a new label-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTLabelStatement - * @since 0.9.12 - */ - public function buildAstLabelStatement($image) - { - return $this->buildAstNodeInstance('ASTLabelStatement', $image); - } - - /** - * Builds a new exit-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTEchoStatement - * @since 0.9.12 - */ - public function buildAstEchoStatement($image) - { - return $this->buildAstNodeInstance('ASTEchoStatement', $image); - } - - /** - * Builds a new yield-statement instance. - * - * @param string $image The source code image for this node. - * - * @return \PDepend\Source\AST\ASTYieldStatement - * @since $version$ - */ - public function buildAstYieldStatement($image) - { - return $this->buildAstNodeInstance('ASTYieldStatement', $image); - } - - /** - * Returns an iterator with all generated {@link \PDepend\Source\AST\ASTNamespace} - * objects. - * - * @return \PDepend\Source\AST\ASTArtifactList - */ - public function getIterator() - { - return $this->getNamespaces(); - } - - /** - * Returns an iterator with all generated {@link \PDepend\Source\AST\ASTNamespace} - * objects. - * - * @return \PDepend\Source\AST\ASTNamespace[] - */ - public function getNamespaces() - { - if ($this->preparedNamespaces === null) { - $this->preparedNamespaces = $this->getPreparedNamespaces(); - } - return new ASTArtifactList($this->preparedNamespaces); - } - - /** - * Returns an iterator with all generated {@link \PDepend\Source\AST\ASTNamespace} - * objects. - * - * @return \PDepend\Source\AST\ASTArtifactList - * @since 0.9.12 - */ - private function getPreparedNamespaces() - { - // Create a package array copy - $namespaces = $this->namespaces; - - // Remove default package if empty - if (count($this->defaultPackage->getTypes()) === 0 - && count($this->defaultPackage->getFunctions()) === 0 - ) { - unset($namespaces[self::DEFAULT_NAMESPACE]); - } - return $namespaces; - } - - /** - * Builds a new trait instance or reuses a previous created trait. - * - * Where possible you should give a qualified trait name, that is prefixed - * with the package identifier. - * - * <code> - * $builder->buildTrait('php::depend::Parser'); - * </code> - * - * To determine the correct trait, this method implements the following - * algorithm. - * - * <ol> - * <li>Check for an exactly matching instance and reuse it.</li> - * <li>Check for a class instance that belongs to the default package. If - * such an instance exists, reuse it and replace the default package with - * the newly given package information.</li> - * <li>Check that the requested trait is in the default package, if this - * is true, reuse the first trait instance and ignore the default package. - * </li> - * <li>Create a new instance for the specified package.</li> - * </ol> - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTTrait - * @since 0.9.5 - */ - protected function buildTraitInternal($qualifiedName) - { - $this->internal = true; - - $trait = $this->buildTrait($qualifiedName); - $trait->setNamespace( - $this->buildNamespace($this->extractNamespaceName($qualifiedName)) - ); - - $this->restoreTrait($trait); - - return $trait; - } - - /** - * This method tries to find a trait instance matching for the given - * qualified name in all scopes already processed. It will return the best - * matching instance or <b>null</b> if no match exists. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTTrait|null - * @since 0.9.5 - */ - protected function findTrait($qualifiedName) - { - $this->freeze(); - - $trait = $this->findType( - $this->frozenTraits, - $qualifiedName - ); - - if ($trait === null) { - $trait = $this->findType($this->traits, $qualifiedName); - } - return $trait; - } - - /** - * Builds a new new interface instance. - * - * If there is an existing interface instance for the given name, this method - * checks if this interface is part of the default namespace. If this is the - * case this method will update all references to the new interface and it - * removes the class instance. Otherwise it creates new interface instance. - * - * Where possible you should give a qualified interface name, that is - * prefixed with the package identifier. - * - * <code> - * $builder->buildInterface('php::depend::Parser'); - * </code> - * - * To determine the correct interface, this method implements the following - * algorithm. - * - * <ol> - * <li>Check for an exactly matching instance and reuse it.</li> - * <li>Check for a interface instance that belongs to the default package. - * If such an instance exists, reuse it and replace the default package - * with the newly given package information.</li> - * <li>Check that the requested interface is in the default package, if - * this is true, reuse the first interface instance and ignore the default - * package. - * </li> - * <li>Create a new instance for the specified package.</li> - * </ol> - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTInterface - * @since 0.9.5 - */ - protected function buildInterfaceInternal($qualifiedName) - { - $this->internal = true; - - $interface = $this->buildInterface($qualifiedName); - $interface->setNamespace( - $this->buildNamespace($this->extractNamespaceName($qualifiedName)) - ); - - $this->restoreInterface($interface); - - return $interface; - } - - /** - * This method tries to find an interface instance matching for the given - * qualified name in all scopes already processed. It will return the best - * matching instance or <b>null</b> if no match exists. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTInterface|null - * @since 0.9.5 - */ - protected function findInterface($qualifiedName) - { - $this->freeze(); - - $interface = $this->findType( - $this->frozenInterfaces, - $qualifiedName - ); - - if ($interface === null) { - $interface = $this->findType( - $this->interfaces, - $qualifiedName - ); - } - return $interface; - } - - /** - * Builds a new class instance or reuses a previous created class. - * - * Where possible you should give a qualified class name, that is prefixed - * with the package identifier. - * - * <code> - * $builder->buildClass('php::depend::Parser'); - * </code> - * - * To determine the correct class, this method implements the following - * algorithm. - * - * <ol> - * <li>Check for an exactly matching instance and reuse it.</li> - * <li>Check for a class instance that belongs to the default package. If - * such an instance exists, reuse it and replace the default package with - * the newly given package information.</li> - * <li>Check that the requested class is in the default package, if this - * is true, reuse the first class instance and ignore the default package. - * </li> - * <li>Create a new instance for the specified package.</li> - * </ol> - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTClass - * @since 0.9.5 - */ - protected function buildClassInternal($qualifiedName) - { - $this->internal = true; - - $class = $this->buildClass($qualifiedName); - $class->setNamespace( - $this->buildNamespace($this->extractNamespaceName($qualifiedName)) - ); - - $this->restoreClass($class); - - return $class; - } - - /** - * This method tries to find a class instance matching for the given - * qualified name in all scopes already processed. It will return the best - * matching instance or <b>null</b> if no match exists. - * - * @param string $qualifiedName - * @return \PDepend\Source\AST\ASTClass|null - * @since 0.9.5 - */ - protected function findClass($qualifiedName) - { - $this->freeze(); - - $class = $this->findType( - $this->frozenClasses, - $qualifiedName - ); - - if ($class === null) { - $class = $this->findType($this->classes, $qualifiedName); - } - return $class; - } - - /** - * This method tries to find an interface or class instance matching for the - * given qualified name in all scopes already processed. It will return the - * best matching instance or <b>null</b> if no match exists. - * - * @param array $instances - * @param string $qualifiedName - * @return \PDepend\Source\AST\AbstractASTType|null - * @since 0.9.5 - */ - protected function findType(array $instances, $qualifiedName) - { - $classOrInterfaceName = $this->extractTypeName($qualifiedName); - $caseInsensitiveName = strtolower($classOrInterfaceName); - if (!isset($instances[$caseInsensitiveName])) { - return null; - } - - $namespaceName = $this->extractNamespaceName($qualifiedName); - if ($namespaceName === null) { - return null; - } - - // Check for exact match and return first matching instance - if (isset($instances[$caseInsensitiveName][$namespaceName])) { - return reset($instances[$caseInsensitiveName][$namespaceName]); - } - - if (!$this->isDefault($namespaceName)) { - return null; - } - - $classesOrInterfaces = reset($instances[$caseInsensitiveName]); - return reset($classesOrInterfaces); - } - - /** - * This method will freeze the actual builder state and create a second - * runtime scope. - * - * @return void - * @since 0.9.5 - */ - protected function freeze() - { - if ($this->frozen === true) { - return; - } - - $this->frozen = true; - - $this->frozenTraits = $this->copyTypesWithPackage($this->traits); - $this->frozenClasses = $this->copyTypesWithPackage($this->classes); - $this->frozenInterfaces = $this->copyTypesWithPackage($this->interfaces); - - $this->traits = array(); - $this->classes = array(); - $this->interfaces = array(); - } - - /** - * Creates a copy of the given input array, but skips all types that do not - * contain a parent package. - * - * @param array $originalTypes The original types created during the parsing - * process. - * - * @return array - */ - private function copyTypesWithPackage(array $originalTypes) - { - $copiedTypes = array(); - foreach ($originalTypes as $typeName => $namespaces) { - foreach ($namespaces as $namespaceName => $types) { - foreach ($types as $index => $type) { - if (is_object($type->getNamespace())) { - $copiedTypes[$typeName][$namespaceName][$index] = $type; - } - } - } - } - return $copiedTypes; - } - - /** - * Restores a function within the internal type scope. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return void - * @since 0.10.0 - */ - public function restoreFunction(ASTFunction $function) - { - $this->buildNamespace($function->getNamespaceName()) - ->addFunction($function); - } - - /** - * Restores a trait within the internal type scope. - * - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @since 0.10.0 - */ - public function restoreTrait(ASTTrait $trait) - { - $this->storeTrait( - $trait->getName(), - $trait->getNamespaceName(), - $trait - ); - } - - /** - * Restores a class within the internal type scope. - * - * @param \PDepend\Source\AST\ASTClass $class - * @return void - * @since 0.10.0 - */ - public function restoreClass(ASTClass $class) - { - $this->storeClass( - $class->getName(), - $class->getNamespaceName(), - $class - ); - } - - /** - * Restores an interface within the internal type scope. - * - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - * @since 0.10.0 - */ - public function restoreInterface(ASTInterface $interface) - { - $this->storeInterface( - $interface->getName(), - $interface->getNamespaceName(), - $interface - ); - } - - /** - * This method will persist a trait instance for later reuse. - * - * @param string $traitName - * @param string $namespaceName - * @param \PDepend\Source\AST\ASTTrait $trait - * @return void - * @@since 1.0.0 - */ - protected function storeTrait($traitName, $namespaceName, ASTTrait $trait) - { - $traitName = strtolower($traitName); - if (!isset($this->traits[$traitName][$namespaceName])) { - $this->traits[$traitName][$namespaceName] = array(); - } - $this->traits[$traitName][$namespaceName][$trait->getId()] = $trait; - - $namespace = $this->buildNamespace($namespaceName); - $namespace->addType($trait); - } - - /** - * This method will persist a class instance for later reuse. - * - * @param string $className - * @param string $namespaceName - * @param \PDepend\Source\AST\ASTClass $class - * @return void - * @@since 0.9.5 - */ - protected function storeClass($className, $namespaceName, ASTClass $class) - { - $className = strtolower($className); - if (!isset($this->classes[$className][$namespaceName])) { - $this->classes[$className][$namespaceName] = array(); - } - $this->classes[$className][$namespaceName][$class->getId()] = $class; - - $namespace = $this->buildNamespace($namespaceName); - $namespace->addType($class); - } - - /** - * This method will persist an interface instance for later reuse. - * - * @param string $interfaceName - * @param string $namespaceName - * @param \PDepend\Source\AST\ASTInterface $interface - * @return void - * @@since 0.9.5 - */ - protected function storeInterface($interfaceName, $namespaceName, ASTInterface $interface) - { - $interfaceName = strtolower($interfaceName); - if (!isset($this->interfaces[$interfaceName][$namespaceName])) { - $this->interfaces[$interfaceName][$namespaceName] = array(); - } - $this->interfaces[$interfaceName][$namespaceName][$interface->getId()] - = $interface; - - $namespace = $this->buildNamespace($namespaceName); - $namespace->addType($interface); - } - - /** - * Checks that the parser is not frozen or a request is flagged as internal. - * - * @param boolean $internal The new internal flag value. - * @return void - * @throws \BadMethodCallException - * @since 0.9.5 - */ - protected function checkBuilderState($internal = false) - { - if ($this->frozen === true && $this->internal === false) { - throw new \BadMethodCallException( - 'Cannot create new nodes, when internal state is frozen.' - ); - } - $this->internal = $internal; - } - - - /** - * Returns <b>true</b> if the given package is the default package. - * - * @param string $namespaceName The package name. - * @return boolean - */ - protected function isDefault($namespaceName) - { - return ($namespaceName === self::DEFAULT_NAMESPACE); - } - - /** - * Extracts the type name of a qualified PHP 5.3 type identifier. - * - * <code> - * $typeName = $this->extractTypeName('foo\bar\foobar'); - * var_dump($typeName); - * // Results in: - * // string(6) "foobar" - * </code> - * - * @param string $qualifiedName The qualified PHP 5.3 type identifier. - * - * @return string - */ - protected function extractTypeName($qualifiedName) - { - if (($pos = strrpos($qualifiedName, '\\')) !== false) { - return substr($qualifiedName, $pos + 1); - } - return $qualifiedName; - } - - /** - * Extracts the package name of a qualified PHP 5.3 class identifier. - * - * If the class name doesn't contain a package identifier this method will - * return the default identifier. - * - * <code> - * $namespaceName = $this->extractPackageName('foo\bar\foobar'); - * var_dump($namespaceName); - * // Results in: - * // string(8) "foo\bar" - * - * $namespaceName = $this->extractPackageName('foobar'); - * var_dump($namespaceName); - * // Results in: - * // string(6) "+global" - * </code> - * - * @param string $qualifiedName The qualified PHP 5.3 class identifier. - * - * @return string|null - */ - protected function extractNamespaceName($qualifiedName) - { - if (($pos = strrpos($qualifiedName, '\\')) !== false) { - return ltrim(substr($qualifiedName, 0, $pos), '\\'); - } elseif (Type::isInternalType($qualifiedName)) { - return Type::getTypePackage($qualifiedName); - } - return self::DEFAULT_NAMESPACE; - } - - /** - * Creates a {@link \PDepend\Source\AST\ASTNode} instance. - * - * @param string $className - * @param string $image - * @return \PDepend\Source\AST\ASTNode - * @since 0.9.12 - */ - private function buildAstNodeInstance($className, $image = null) - { - $className = "\\PDepend\\Source\\AST\\{$className}"; - - Log::debug("Creating: {$className}({$image})"); - - return new $className($image); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserGeneric.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserGeneric.php deleted file mode 100644 index 9bc4e64..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserGeneric.php +++ /dev/null @@ -1,168 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.20 - */ - -namespace PDepend\Source\Language\PHP; - -use PDepend\Source\Tokenizer\Tokens; - -/** - * Concrete parser implementation that is very tolerant and accepts language - * constructs and keywords that are reserved in newer php versions, but not in - * older versions. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.20 - */ -class PHPParserGeneric extends PHPParserVersion74 -{ - /** - * Tests if the given token type is a reserved keyword in the supported PHP - * version. - * - * @param integer $tokenType - * @return boolean - * @since 1.1.1 - */ - protected function isKeyword($tokenType) - { - switch ($tokenType) { - case Tokens::T_CLASS: - case Tokens::T_INTERFACE: - return true; - } - return false; - } - - /** - * Will return <b>true</b> if the given <b>$tokenType</b> is a valid class - * name part. - * - * @param integer $tokenType The type of a parsed token. - * - * @return boolean - * @since 0.10.6 - */ - protected function isClassName($tokenType) - { - switch ($tokenType) { - case Tokens::T_DIR: - case Tokens::T_USE: - case Tokens::T_GOTO: - case Tokens::T_NULL: - case Tokens::T_NS_C: - case Tokens::T_TRUE: - case Tokens::T_CLONE: - case Tokens::T_FALSE: - case Tokens::T_TRAIT: - case Tokens::T_STRING: - case Tokens::T_TRAIT_C: - case Tokens::T_CALLABLE: - case Tokens::T_INSTEADOF: - case Tokens::T_NAMESPACE: - return true; - } - return false; - } - - /** - * Tests if the give token is a valid function name in the supported PHP - * version. - * - * @param integer $tokenType - * @return boolean - * @since 2.3 - */ - protected function isFunctionName($tokenType) - { - switch ($tokenType) { - case Tokens::T_CLONE: - case Tokens::T_STRING: - case Tokens::T_USE: - case Tokens::T_GOTO: - case Tokens::T_NULL: - case Tokens::T_SELF: - case Tokens::T_TRUE: - case Tokens::T_FALSE: - case Tokens::T_TRAIT: - case Tokens::T_INSTEADOF: - case Tokens::T_NAMESPACE: - case Tokens::T_DIR: - case Tokens::T_NS_C: - case Tokens::T_YIELD: - case Tokens::T_PARENT: - case Tokens::T_TRAIT_C: - return true; - } - return false; - } - - /** - * Parses additional static values that are valid in the supported php version. - * - * @param \PDepend\Source\AST\ASTValue $value - * @return \PDepend\Source\AST\ASTValue - * @throws \PDepend\Source\Parser\UnexpectedTokenException - * @todo Handle shift left/right expressions in ASTValue - */ /* - protected function parseStaticValueVersionSpecific(ASTValue $value) - { - switch ($this->tokenizer->peek()) { - case Tokens::T_SL: - $shift = $this->parseShiftLeftExpression(); - $this->parseStaticValue(); - break; - case Tokens::T_SR: - $shift = $this->parseShiftRightExpression(); - $this->parseStaticValue(); - break; - default: - throw new UnexpectedTokenException( - $this->tokenizer->next(), - $this->tokenizer->getSourceFile() - ); - } - - return $value; - }*/ -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion53.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion53.php deleted file mode 100644 index 89741e3..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion53.php +++ /dev/null @@ -1,103 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ - -namespace PDepend\Source\Language\PHP; - -use PDepend\Source\AST\ASTArray; -use PDepend\Source\Parser\UnexpectedTokenException; -use PDepend\Source\Tokenizer\Tokens; - -/** - * Concrete parser implementation that supports features up to PHP version 5.5. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ -abstract class PHPParserVersion53 extends AbstractPHPParser -{ - - /** - * Tests if the next token is a valid array start delimiter in the supported - * PHP version. - * - * @return boolean - * @since 1.0.0 - */ - protected function isArrayStartDelimiter() - { - switch ($this->tokenizer->peek()) { - case Tokens::T_ARRAY: - return true; - } - return false; - } - - /** - * Parses a php array declaration. - * - * @param \PDepend\Source\AST\ASTArray $array - * @param boolean $static - * @return \PDepend\Source\AST\ASTArray - * @since 1.0.0 - */ - protected function parseArray(ASTArray $array, $static = false) - { - switch ($this->tokenizer->peek()) { - case Tokens::T_ARRAY: - $this->consumeToken(Tokens::T_ARRAY); - $this->consumeComments(); - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN); - $this->parseArrayElements($array, Tokens::T_PARENTHESIS_CLOSE, $static); - $this->consumeToken(Tokens::T_PARENTHESIS_CLOSE); - break; - default: - throw new UnexpectedTokenException( - $this->tokenizer->next(), - $this->tokenizer->getSourceFile() - ); - } - - return $array; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion54.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion54.php deleted file mode 100644 index 2f4f4a2..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion54.php +++ /dev/null @@ -1,298 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ - -namespace PDepend\Source\Language\PHP; - -use PDepend\Source\AST\ASTArray; -use PDepend\Source\Parser\UnexpectedTokenException; -use PDepend\Source\Tokenizer\Tokens; - -/** - * Concrete parser implementation that supports features up to PHP version 5.4. - * - * TODO: - * - Non constant operands are forbidden now in break and continue - * - break $var - * - continue $var - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ -abstract class PHPParserVersion54 extends PHPParserVersion53 -{ - /** - * Will return <b>true</b> if the given <b>$tokenType</b> is a valid class - * name part. - * - * @param integer $tokenType The type of a parsed token. - * @return boolean - * @since 0.10.6 - */ - protected function isClassName($tokenType) - { - switch ($tokenType) { - case Tokens::T_NULL: - case Tokens::T_TRUE: - case Tokens::T_FALSE: - case Tokens::T_STRING: - return true; - } - return false; - } - - /** - * @param integer $tokenType - * @return boolean - */ - protected function isConstantName($tokenType) - { - return $this->isFunctionName($tokenType); - } - - /** - * @param integer $tokenType - * @return bool - */ - protected function isMethodName($tokenType) - { - return $this->isFunctionName($tokenType); - } - - /** - * Tests if the give token is a valid function name in the supported PHP - * version. - * - * @param integer $tokenType - * @return boolean - * @since 2.3 - */ - protected function isFunctionName($tokenType) - { - switch ($tokenType) { - case Tokens::T_STRING: - case Tokens::T_NULL: - case Tokens::T_SELF: - case Tokens::T_TRUE: - case Tokens::T_FALSE: - case Tokens::T_PARENT: - return true; - } - return false; - } - - /** - * Tests if the given token type is a reserved keyword in the supported PHP - * version. - * - * @param integer $tokenType - * @return boolean - */ - protected function isKeyword($tokenType) - { - switch ($tokenType) { - case Tokens::T_CLASS: - case Tokens::T_TRAIT: - case Tokens::T_CALLABLE: - case Tokens::T_INSTEADOF: - case Tokens::T_INTERFACE: - return true; - } - return false; - } - - /** - * Tests if the given token type is a valid type hint in the supported - * PHP version. - * - * @param integer $tokenType - * @return boolean - * @since 1.0.0 - */ - protected function isTypeHint($tokenType) - { - switch ($tokenType) { - case Tokens::T_CALLABLE: - return true; - default: - return parent::isTypeHint($tokenType); - } - } - - /** - * Parses a type hint that is valid in the supported PHP version. - * - * @return \PDepend\Source\AST\ASTNode - * @since 1.0.0 - */ - protected function parseTypeHint() - { - switch ($this->tokenizer->peek()) { - case Tokens::T_CALLABLE: - $this->consumeToken(Tokens::T_CALLABLE); - $type = $this->builder->buildAstTypeCallable(); - break; - default: - $type = parent::parseTypeHint(); - break; - } - return $type; - } - - /** - * Tests if the next token is a valid array start delimiter in the supported - * PHP version. - * - * @return boolean - * @since 1.0.0 - */ - protected function isArrayStartDelimiter() - { - switch ($this->tokenizer->peek()) { - case Tokens::T_ARRAY: - case Tokens::T_SQUARED_BRACKET_OPEN: - return true; - } - - return false; - } - - /** - * Parses a php array declaration. - * - * @param \PDepend\Source\AST\ASTArray $array - * @param boolean $static - * @return \PDepend\Source\AST\ASTArray - * @since 1.0.0 - */ - protected function parseArray(ASTArray $array, $static = false) - { - switch ($this->tokenizer->peek()) { - case Tokens::T_SQUARED_BRACKET_OPEN: - $this->consumeToken(Tokens::T_SQUARED_BRACKET_OPEN); - $this->parseArrayElements($array, Tokens::T_SQUARED_BRACKET_CLOSE, $static); - $this->consumeToken(Tokens::T_SQUARED_BRACKET_CLOSE); - break; - default: - parent::parseArray($array, $static); - break; - } - - return $array; - } - - /** - * Parses an integer value. - * - * @return \PDepend\Source\AST\ASTLiteral - * @throws \PDepend\Source\Parser\UnexpectedTokenException - */ - protected function parseIntegerNumber() - { - $token = $this->consumeToken(Tokens::T_LNUMBER); - - if ('0' !== substr($token->image, 0, 1)) { - goto BUILD_LITERAL; - } - - if (Tokens::T_STRING !== $this->tokenizer->peek()) { - goto BUILD_LITERAL; - } - - $token1 = $this->consumeToken(Tokens::T_STRING); - if (0 === preg_match('(^b[01]+$)', $token1->image)) { - throw new UnexpectedTokenException( - $token1, - $this->tokenizer->getSourceFile() - ); - } - - $token->image = $token->image . $token1->image; - $token->endLine = $token1->endLine; - $token->endColumn = $token1->endColumn; - - BUILD_LITERAL: - - $literal = $this->builder->buildAstLiteral($token->image); - $literal->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $literal; - } - - /** - * Parses the class expr syntax supported since PHP 5.4. - * - * @return \PDepend\Source\AST\ASTNode - * @since 2.3 - */ - protected function parsePostfixIdentifier() - { - switch ($this->tokenizer->peek()) { - case Tokens::T_CURLY_BRACE_OPEN: - $node = $this->parseCompoundExpression(); - break; - default: - $node = parent::parsePostfixIdentifier(); - break; - } - return $this->parseOptionalIndexExpression($node); - } - - /** - * @return \PDepend\Source\AST\ASTNode - */ - protected function parseOptionalExpressionForVersion() - { - switch ($this->tokenizer->peek()) { - case Tokens::T_TRAIT_C: - return $this->parseConstant(); - default: - return parent::parseOptionalExpressionForVersion(); - } - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion55.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion55.php deleted file mode 100644 index d37d759..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion55.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ - -namespace PDepend\Source\Language\PHP; - -use PDepend\Source\Tokenizer\Tokens; - -/** - * Concrete parser implementation that supports features up to PHP version 5.5. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ -abstract class PHPParserVersion55 extends PHPParserVersion54 -{ - /** - * Parses a full qualified class name postfix. - * - * parseFullQualifiedClassNamePostfix() exists since 2.0.0 and have been customized for PHP 5.5 since 2.6.0. - * - * @return \PDepend\Source\AST\ASTClassFqnPostfix - * @since 2.0.0 - */ - protected function parseFullQualifiedClassNamePostfix() - { - $this->tokenStack->push(); - - $this->consumeToken(Tokens::T_CLASS_FQN); - - return $this->setNodePositionsAndReturn( - $this->builder->buildAstClassFqnPostfix() - ); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion56.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion56.php deleted file mode 100644 index 03acec2..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion56.php +++ /dev/null @@ -1,424 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ - -namespace PDepend\Source\Language\PHP; - -use PDepend\Source\AST\ASTArguments; -use PDepend\Source\AST\ASTValue; -use PDepend\Source\Parser\UnexpectedTokenException; -use PDepend\Source\Tokenizer\FullTokenizer; -use PDepend\Source\Tokenizer\Tokenizer; -use PDepend\Source\Tokenizer\Tokens; - -/** - * Concrete parser implementation that supports features up to PHP version 5.6. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ -abstract class PHPParserVersion56 extends PHPParserVersion55 -{ - /** - * Parses additional static values that are valid in the supported php version. - * - * @param \PDepend\Source\AST\ASTValue $value - * @return \PDepend\Source\AST\ASTValue|null - * @throws \PDepend\Source\Parser\UnexpectedTokenException - */ - protected function parseStaticValueVersionSpecific(ASTValue $value) - { - $expressions = array(); - - while (($tokenType = $this->tokenizer->peek()) != Tokenizer::T_EOF) { - switch ($tokenType) { - case Tokens::T_COMMA: - case Tokens::T_CLOSE_TAG: - case Tokens::T_COLON: - case Tokens::T_DOUBLE_ARROW: - case Tokens::T_END_HEREDOC: - case Tokens::T_PARENTHESIS_CLOSE: - case Tokens::T_SEMICOLON: - case Tokens::T_SQUARED_BRACKET_CLOSE: - break 2; - case Tokens::T_SELF: - case Tokens::T_STRING: - case Tokens::T_PARENT: - case Tokens::T_STATIC: - case Tokens::T_DOLLAR: - case Tokens::T_VARIABLE: - case Tokens::T_BACKSLASH: - case Tokens::T_NAMESPACE: - $expressions[] = $this->parseVariableOrConstantOrPrimaryPrefix(); - break; - case ($this->isArrayStartDelimiter()): - $expressions[] = $this->doParseArray(true); - break; - case Tokens::T_NULL: - case Tokens::T_TRUE: - case Tokens::T_FALSE: - case Tokens::T_LNUMBER: - case Tokens::T_DNUMBER: - case Tokens::T_BACKTICK: - case Tokens::T_DOUBLE_QUOTE: - case Tokens::T_CONSTANT_ENCAPSED_STRING: - $expressions[] = $this->parseLiteralOrString(); - break; - case Tokens::T_QUESTION_MARK: - $expressions[] = $this->parseConditionalExpression(); - break; - case Tokens::T_BOOLEAN_AND: - $expressions[] = $this->parseBooleanAndExpression(); - break; - case Tokens::T_BOOLEAN_OR: - $expressions[] = $this->parseBooleanOrExpression(); - break; - case Tokens::T_LOGICAL_AND: - $expressions[] = $this->parseLogicalAndExpression(); - break; - case Tokens::T_LOGICAL_OR: - $expressions[] = $this->parseLogicalOrExpression(); - break; - case Tokens::T_LOGICAL_XOR: - $expressions[] = $this->parseLogicalXorExpression(); - break; - case Tokens::T_PARENTHESIS_OPEN: - $expressions[] = $this->parseParenthesisExpressionOrPrimaryPrefix(); - break; - case Tokens::T_START_HEREDOC: - $expressions[] = $this->parseHeredoc(); - break; - case Tokens::T_SL: - $expressions[] = $this->parseShiftLeftExpression(); - break; - case Tokens::T_SR: - $expressions[] = $this->parseShiftRightExpression(); - break; - case Tokens::T_ELLIPSIS: - $this->checkEllipsisInExpressionSupport(); - case Tokens::T_STRING_VARNAME: // TODO: Implement this - case Tokens::T_PLUS: // TODO: Make this a arithmetic expression - case Tokens::T_MINUS: - case Tokens::T_MUL: - case Tokens::T_DIV: - case Tokens::T_MOD: - case Tokens::T_POW: - case Tokens::T_IS_EQUAL: // TODO: Implement compare expressions - case Tokens::T_IS_NOT_EQUAL: - case Tokens::T_IS_IDENTICAL: - case Tokens::T_IS_NOT_IDENTICAL: - case Tokens::T_BITWISE_OR: - case Tokens::T_BITWISE_AND: - case Tokens::T_BITWISE_NOT: - case Tokens::T_BITWISE_XOR: - case Tokens::T_IS_GREATER_OR_EQUAL: - case Tokens::T_IS_SMALLER_OR_EQUAL: - case Tokens::T_ANGLE_BRACKET_OPEN: - case Tokens::T_ANGLE_BRACKET_CLOSE: - case Tokens::T_EMPTY: - case Tokens::T_CONCAT: - $token = $this->consumeToken($tokenType); - - $expr = $this->builder->buildAstExpression($token->image); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - $expressions[] = $expr; - break; - case Tokens::T_EQUAL: - case Tokens::T_OR_EQUAL: - case Tokens::T_SL_EQUAL: - case Tokens::T_SR_EQUAL: - case Tokens::T_AND_EQUAL: - case Tokens::T_DIV_EQUAL: - case Tokens::T_MOD_EQUAL: - case Tokens::T_MUL_EQUAL: - case Tokens::T_XOR_EQUAL: - case Tokens::T_PLUS_EQUAL: - case Tokens::T_MINUS_EQUAL: - case Tokens::T_CONCAT_EQUAL: - case Tokens::T_COALESCE_EQUAL: - $expressions[] = $this->parseAssignmentExpression( - array_pop($expressions) - ); - break; - case Tokens::T_DIR: - case Tokens::T_FILE: - case Tokens::T_LINE: - case Tokens::T_NS_C: - case Tokens::T_FUNC_C: - case Tokens::T_CLASS_C: - case Tokens::T_METHOD_C: - $expressions[] = $this->parseConstant(); - break; - // TODO: Handle comments here - case Tokens::T_COMMENT: - case Tokens::T_DOC_COMMENT: - $this->consumeToken($tokenType); - break; - case Tokens::T_AT: - case Tokens::T_EXCLAMATION_MARK: - $token = $this->consumeToken($tokenType); - - $expr = $this->builder->buildAstUnaryExpression($token->image); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - $expressions[] = $expr; - break; - default: - throw new UnexpectedTokenException( - $this->tokenizer->next(), - $this->tokenizer->getSourceFile() - ); - } - } - - $expressions = $this->reduce($expressions); - - $count = count($expressions); - if ($count == 0) { - return null; - } elseif ($count == 1) { - // @todo ASTValue must be a valid node. - $value->setValue($expressions[0]); - - return $value; - } - - $expr = $this->builder->buildAstExpression(); - foreach ($expressions as $node) { - $expr->addChild($node); - } - $expr->configureLinesAndColumns( - $expressions[0]->getStartLine(), - $expressions[$count - 1]->getEndLine(), - $expressions[0]->getStartColumn(), - $expressions[$count - 1]->getEndColumn() - ); - - // @todo ASTValue must be a valid node. - $value->setValue($expr); - - return $value; - } - - /** - * Parses use declarations that are valid in the supported php version. - * - * @return void - */ - protected function parseUseDeclarations() - { - // Consume use keyword - $this->consumeToken(Tokens::T_USE); - $this->consumeComments(); - - // Consume const and function tokens - $nextToken = $this->tokenizer->peek(); - switch ($nextToken) { - case Tokens::T_CONST: - case Tokens::T_FUNCTION: - $this->consumeToken($nextToken); - } - - // Parse all use declarations - $this->parseUseDeclaration(); - $this->consumeComments(); - - // Consume closing semicolon - $this->consumeToken(Tokens::T_SEMICOLON); - - // Reset any previous state - $this->reset(); - } - - /** - * This method will be called when the base parser cannot handle an expression - * in the base version. In this method you can implement version specific - * expressions. - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\UnexpectedTokenException - * @since 2.2 - */ - protected function parseOptionalExpressionForVersion() - { - if ($expression = $this->parseExpressionVersion56()) { - return $expression; - } - return parent::parseOptionalExpressionForVersion(); - } - - /** - * In this method we implement parsing of PHP 5.6 specific expressions. - * - * @return \PDepend\Source\AST\ASTNode - * @since 2.3 - */ - protected function parseExpressionVersion56() - { - $this->consumeComments(); - $nextTokenType = $this->tokenizer->peek(); - - switch ($nextTokenType) { - case Tokens::T_POW: - $token = $this->consumeToken($nextTokenType); - - $expr = $this->builder->buildAstExpression($token->image); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $expr; - } - } - - /** - * @param \PDepend\Source\AST\ASTArguments $arguments - * @return \PDepend\Source\AST\ASTArguments - */ - protected function parseArgumentList(ASTArguments $arguments) - { - while (true) { - $this->consumeComments(); - if (Tokens::T_ELLIPSIS === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_ELLIPSIS); - } - - $this->consumeComments(); - if (null === ($expr = $this->parseOptionalExpression())) { - break; - } - - $arguments->addChild($expr); - - $this->consumeComments(); - if (Tokens::T_COMMA === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_COMMA); - $this->consumeComments(); - - continue; - } - } - - return $arguments; - } - - /** - * Parses the value of a php constant. By default this can be only static - * values that were allowed in the oldest supported PHP version. - * - * @return \PDepend\Source\AST\ASTValue - */ - protected function parseConstantDeclaratorValue() - { - if ($this->isFollowedByStaticValueOrStaticArray()) { - return $this->parseStaticValueOrStaticArray(); - } - - // Else it would be provided as ASTLiteral or expressions object. - $value = new ASTValue(); - $value->setValue($this->parseOptionalExpression()); - - return $value; - } - - /** - * Determines if the following expression can be stored as a static value. - * - * @return bool - */ - protected function isFollowedByStaticValueOrStaticArray() - { - // If we can't anticipate, we should assume it can be a dynamic value - if (!($this->tokenizer instanceof FullTokenizer)) { - return false; - } - - for($i = 0; $type = $this->tokenizer->peekAt($i); $i++) { - switch ($type) { - case Tokens::T_COMMENT: - case Tokens::T_DOC_COMMENT: - case Tokens::T_ARRAY: - case Tokens::T_SQUARED_BRACKET_OPEN: - case Tokens::T_SQUARED_BRACKET_CLOSE: - case Tokens::T_PARENTHESIS_OPEN: - case Tokens::T_PARENTHESIS_CLOSE: - case Tokens::T_COMMA: - case Tokens::T_DOUBLE_ARROW: - case Tokens::T_NULL: - case Tokens::T_TRUE: - case Tokens::T_FALSE: - case Tokens::T_LNUMBER: - case Tokens::T_DNUMBER: - case Tokens::T_STRING: - case Tokens::T_EQUAL: - case Tokens::T_START_HEREDOC: - case Tokens::T_END_HEREDOC: - case Tokens::T_ENCAPSED_AND_WHITESPACE: - break; - - case Tokens::T_SEMICOLON: - case Tokenizer::T_EOF: - return true; - - default: - return false; - } - } - - return false; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion70.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion70.php deleted file mode 100644 index a9706a4..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion70.php +++ /dev/null @@ -1,583 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ - -namespace PDepend\Source\Language\PHP; - -use PDepend\Source\AST\ASTAllocationExpression; -use PDepend\Source\AST\ASTExpression; -use PDepend\Source\AST\ASTNode; -use PDepend\Source\Tokenizer\Tokens; - -/** - * Concrete parser implementation that supports features up to PHP version 7.0. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ -abstract class PHPParserVersion70 extends PHPParserVersion56 -{ - /** - * @param integer $tokenType - * @return boolean - */ - protected function isConstantName($tokenType) - { - switch ($tokenType) { - case Tokens::T_CALLABLE: - case Tokens::T_TRAIT: - case Tokens::T_EXTENDS: - case Tokens::T_IMPLEMENTS: - case Tokens::T_STATIC: - case Tokens::T_ABSTRACT: - case Tokens::T_FINAL: - case Tokens::T_PUBLIC: - case Tokens::T_PROTECTED: - case Tokens::T_PRIVATE: - case Tokens::T_CONST: - case Tokens::T_ENDDECLARE: - case Tokens::T_ENDFOR: - case Tokens::T_ENDFOREACH: - case Tokens::T_ENDIF: - case Tokens::T_ENDWHILE: - case Tokens::T_EMPTY: - case Tokens::T_EVAL: - case Tokens::T_LOGICAL_AND: - case Tokens::T_GLOBAL: - case Tokens::T_GOTO: - case Tokens::T_INSTANCEOF: - case Tokens::T_INSTEADOF: - case Tokens::T_INTERFACE: - case Tokens::T_ISSET: - case Tokens::T_NAMESPACE: - case Tokens::T_NEW: - case Tokens::T_LOGICAL_OR: - case Tokens::T_LOGICAL_XOR: - case Tokens::T_TRY: - case Tokens::T_USE: - case Tokens::T_VAR: - case Tokens::T_EXIT: - case Tokens::T_LIST: - case Tokens::T_CLONE: - case Tokens::T_INCLUDE: - case Tokens::T_INCLUDE_ONCE: - case Tokens::T_THROW: - case Tokens::T_ARRAY: - case Tokens::T_PRINT: - case Tokens::T_ECHO: - case Tokens::T_REQUIRE: - case Tokens::T_REQUIRE_ONCE: - case Tokens::T_RETURN: - case Tokens::T_ELSE: - case Tokens::T_ELSEIF: - case Tokens::T_DEFAULT: - case Tokens::T_BREAK: - case Tokens::T_CONTINUE: - case Tokens::T_SWITCH: - case Tokens::T_YIELD: - case Tokens::T_FUNCTION: - case Tokens::T_IF: - case Tokens::T_ENDSWITCH: - case Tokens::T_FINALLY: - case Tokens::T_FOR: - case Tokens::T_FOREACH: - case Tokens::T_DECLARE: - case Tokens::T_CASE: - case Tokens::T_DO: - case Tokens::T_WHILE: - case Tokens::T_AS: - case Tokens::T_CATCH: - //case Tokens::T_DIE: - case Tokens::T_SELF: - case Tokens::T_PARENT: - case Tokens::T_UNSET: - return true; - } - return parent::isConstantName($tokenType); - } - - /** - * @param integer $tokenType - * @return bool - */ - protected function isMethodName($tokenType) - { - switch ($tokenType) { - case Tokens::T_CLASS: - return true; - } - return $this->isConstantName($tokenType); - } - - /** - * @return \PDepend\Source\AST\ASTNode - */ - protected function parsePostfixIdentifier() - { - $tokenType = $this->tokenizer->peek(); - switch (true) { - case ($this->isConstantName($tokenType)): - $node = $this->parseLiteral(); - break; - default: - $node = parent::parsePostfixIdentifier(); - break; - } - return $this->parseOptionalIndexExpression($node); - } - - /** - * @param \PDepend\Source\AST\AbstractASTCallable $callable - * @return \PDepend\Source\AST\AbstractASTCallable - */ - protected function parseCallableDeclarationAddition($callable) - { - $this->consumeComments(); - if (Tokens::T_COLON != $this->tokenizer->peek()) { - return $callable; - } - - $this->consumeToken(Tokens::T_COLON); - - $type = $this->parseReturnTypeHint(); - $callable->addChild($type); - - return $callable; - } - - /** - * @return \PDepend\Source\AST\ASTType - */ - protected function parseReturnTypeHint() - { - $this->consumeComments(); - - switch ($tokenType = $this->tokenizer->peek()) { - case Tokens::T_ARRAY: - $type = $this->parseArrayType(); - break; - case Tokens::T_SELF: - $type = $this->parseSelfType(); - break; - case Tokens::T_PARENT: - $type = $this->parseParentType(); - break; - default: - $type = $this->parseTypeHint(); - break; - } - return $type; - } - - /** - * Parses a type hint that is valid in the supported PHP version. - * - * @return \PDepend\Source\AST\ASTNode - * @since 2.3 - */ - protected function parseTypeHint() - { - switch ($this->tokenizer->peek()) { - case Tokens::T_ARRAY: - $type = $this->parseArrayType(); - break; - - case Tokens::T_SELF: - $type = $this->parseSelfType(); - break; - - case Tokens::T_STRING: - case Tokens::T_BACKSLASH: - case Tokens::T_NAMESPACE: - $name = $this->parseQualifiedName(); - - $type = $this->isScalarOrCallableTypeHint($name) - ? $this->parseScalarOrCallableTypeHint($name) - : $this->builder->buildAstClassOrInterfaceReference($name); - break; - - default: - $type = parent::parseTypeHint(); - break; - } - - return $type; - } - - /** - * Parses any expression that is surrounded by an opening and a closing - * parenthesis - * - * @return \PDepend\Source\AST\ASTExpression - */ - protected function parseParenthesisExpression() - { - $this->tokenStack->push(); - $this->consumeComments(); - - $expr = $this->builder->buildAstExpression(); - $expr = $this->parseBraceExpression( - $expr, - $this->consumeToken(Tokens::T_PARENTHESIS_OPEN), - Tokens::T_PARENTHESIS_CLOSE - ); - - while ($this->tokenizer->peek() === Tokens::T_PARENTHESIS_OPEN) { - $function = $this->builder->buildAstFunctionPostfix($expr->getImage()); - $function->addChild($expr); - $function->addChild($this->parseArguments()); - $expr = $function; - } - - return $this->setNodePositionsAndReturn($expr); - } - - /** - * Tests if the given image is a PHP 7 type hint. - * - * @param string $image - * @return boolean - */ - protected function isScalarOrCallableTypeHint($image) - { - switch (strtolower($image)) { - case 'int': - case 'bool': - case 'float': - case 'string': - case 'callable': - case 'iterable': - case 'void': - return true; - } - - return false; - } - - /** - * Parses a scalar type hint or a callable type hint. - * - * @param string $image - * @return \PDepend\Source\AST\ASTType|false - */ - protected function parseScalarOrCallableTypeHint($image) - { - switch (strtolower($image)) { - case 'int': - case 'bool': - case 'float': - case 'string': - return $this->builder->buildAstScalarType($image); - case 'callable': - return $this->builder->buildAstTypeCallable(); - case 'void': - case 'iterable': - throw $this->getUnexpectedTokenException($this->tokenizer->prevToken()); - } - - return false; - } - - /** - * Parse the type reference used in an allocation expression. - * - * @param \PDepend\Source\AST\ASTAllocationExpression $allocation - * @return \PDepend\Source\AST\ASTNode - * @since 2.3 - */ - protected function parseAllocationExpressionTypeReference(ASTAllocationExpression $allocation) - { - return $this->parseAnonymousClassDeclaration($allocation) - ?: parent::parseAllocationExpressionTypeReference($allocation); - } - - /** - * Attempts to the next sequence of tokens as an anonymous class and adds it to the allocation expression - * - * @param \PDepend\Source\AST\ASTAllocationExpression $allocation - * - * @return null|\PDepend\Source\AST\ASTAnonymousClass - */ - protected function parseAnonymousClassDeclaration(ASTAllocationExpression $allocation) - { - $this->consumeComments(); - if (Tokens::T_CLASS !== $this->tokenizer->peek()) { - return null; - } - - $classOrInterface = $this->classOrInterface; - - $this->tokenStack->push(); - - $this->consumeToken(Tokens::T_CLASS); - $this->consumeComments(); - - $class = $this->builder->buildAnonymousClass(); - $class->setName( - sprintf( - 'class@anonymous%s0x%s', - $this->compilationUnit->getFileName(), - uniqid('') - ) - ); - $class->setCompilationUnit($this->compilationUnit); - $class->setUserDefined(); - - if ($this->isNextTokenArguments()) { - $class->addChild($this->parseArguments()); - } - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - - if ($tokenType === Tokens::T_EXTENDS) { - $class = $this->parseClassExtends($class); - - $this->consumeComments(); - $tokenType = $this->tokenizer->peek(); - } - - if ($tokenType === Tokens::T_IMPLEMENTS) { - $this->consumeToken(Tokens::T_IMPLEMENTS); - $this->parseInterfaceList($class); - } - - $allocation->addChild( - $this->setNodePositionsAndReturn( - $this->parseTypeBody($class), - $tokens - ) - ); - $class->setTokens($tokens); - - $this->classOrInterface = $classOrInterface; - - return $allocation; - } - - /** - * @param \PDepend\Source\AST\ASTNode $node - * @return \PDepend\Source\AST\ASTNode - */ - protected function parseOptionalMemberPrimaryPrefix(ASTNode $node) - { - $this->consumeComments(); - - if (Tokens::T_DOUBLE_COLON === $this->tokenizer->peek()) { - return $this->parseStaticMemberPrimaryPrefix($node); - } - - if ($this->tokenizer->peek() === Tokens::T_OBJECT_OPERATOR) { - return $this->parseMemberPrimaryPrefix($node); - } - - return $node; - } - - /** - * @param \PDepend\Source\AST\ASTExpression $expr - * @return \PDepend\Source\AST\ASTExpression - */ - protected function parseParenthesisExpressionOrPrimaryPrefixForVersion(ASTExpression $expr) - { - $this->consumeComments(); - - if (Tokens::T_DOUBLE_COLON === $this->tokenizer->peek()) { - return $this->parseStaticMemberPrimaryPrefix($expr->getChild(0)); - } - - if ($this->tokenizer->peek() === Tokens::T_OBJECT_OPERATOR) { - $node = count($expr->getChildren()) === 0 ? $expr : $expr->getChild(0); - return $this->parseMemberPrimaryPrefix($node); - } - - return $expr; - } - - /** - * This method will be called when the base parser cannot handle an expression - * in the base version. In this method you can implement version specific - * expressions. - * - * @return \PDepend\Source\AST\ASTNode - * @throws \PDepend\Source\Parser\UnexpectedTokenException - * @since 2.3 - */ - protected function parseOptionalExpressionForVersion() - { - return $this->parseExpressionVersion70() - ?: parent::parseOptionalExpressionForVersion(); - } - - /** - * In this method we implement parsing of PHP 7.0 specific expressions. - * - * @return \PDepend\Source\AST\ASTNode - * @since 2.3 - */ - protected function parseExpressionVersion70() - { - $this->consumeComments(); - $nextTokenType = $this->tokenizer->peek(); - - switch ($nextTokenType) { - case Tokens::T_SPACESHIP: - case Tokens::T_COALESCE: - $token = $this->consumeToken($nextTokenType); - - $expr = $this->builder->buildAstExpression($token->image); - $expr->configureLinesAndColumns( - $token->startLine, - $token->endLine, - $token->startColumn, - $token->endColumn - ); - - return $expr; - } - } - - /** - * This method will parse a formal parameter. A formal parameter is at least - * a variable name, but can also contain a default parameter value. - * - * <code> - * // -- ------- - * function foo(Bar $x, $y = 42) {} - * // -- ------- - * </code> - * - * @return \PDepend\Source\AST\ASTFormalParameter - * @since 2.0.7 - */ - protected function parseFormalParameter() - { - $parameter = $this->builder->buildAstFormalParameter(); - - if (Tokens::T_ELLIPSIS === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_ELLIPSIS); - $this->consumeComments(); - - $parameter->setVariableArgList(); - } - - $parameter->addChild($this->parseVariableDeclarator()); - - return $parameter; - } - - /** - * @param array $fragments - * @return void - */ - protected function parseUseDeclarationForVersion(array $fragments) - { - if (Tokens::T_CURLY_BRACE_OPEN === $this->tokenizer->peek()) { - $this->parseUseDeclarationVersion70($fragments); - - return; - } - - parent::parseUseDeclarationForVersion($fragments); - } - - /** - * @param array $fragments - * @return void - */ - protected function parseUseDeclarationVersion70(array $fragments) - { - $namespacePrefixReplaced = $this->namespacePrefixReplaced; - - $this->consumeToken(Tokens::T_CURLY_BRACE_OPEN); - $this->consumeComments(); - - do { - $nextToken = $this->tokenizer->peek(); - switch ($nextToken) { - case Tokens::T_CONST: - case Tokens::T_FUNCTION: - $this->consumeToken($nextToken); - } - - $subFragments = $this->parseQualifiedNameRaw(); - $this->consumeComments(); - - $image = $this->parseNamespaceImage($subFragments); - - if (Tokens::T_COMMA != $this->tokenizer->peek()) { - break; - } - - $this->consumeToken(Tokens::T_COMMA); - $this->consumeComments(); - - // Add mapping between image and qualified name to symbol table - $this->useSymbolTable->add($image, join('', array_merge($fragments, $subFragments))); - } while (true); - - $this->useSymbolTable->add($image, join('', array_merge($fragments, $subFragments))); - - $this->consumeToken(Tokens::T_CURLY_BRACE_CLOSE); - $this->consumeComments(); - - $this->namespacePrefixReplaced = $namespacePrefixReplaced; - } - - /** - * @param array $previousElements - * @return string|null - */ - protected function parseQualifiedNameElement(array $previousElements) - { - if (Tokens::T_CURLY_BRACE_OPEN !== $this->tokenizer->peek()) { - return parent::parseQualifiedNameElement($previousElements); - } - - if (count($previousElements) >= 2 && '\\' === end($previousElements)) { - return null; - } - - throw $this->getUnexpectedTokenException($this->tokenizer->next()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion71.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion71.php deleted file mode 100644 index 391eaca..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion71.php +++ /dev/null @@ -1,242 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ - -namespace PDepend\Source\Language\PHP; - -use PDepend\Source\AST\ASTCatchStatement; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\State; -use PDepend\Source\Parser\InvalidStateException; -use PDepend\Source\Parser\UnexpectedTokenException; -use PDepend\Source\Tokenizer\Tokens; - -/** - * Concrete parser implementation that supports features up to PHP version 7.1. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.4 - */ -abstract class PHPParserVersion71 extends PHPParserVersion70 -{ - /** - * Return true if current PHP level supports keys in lists. - * - * @return bool - */ - protected function supportsKeysInList() - { - return true; - } - - /** - * This methods return true if the token matches a list opening in the current PHP version level. - * - * @param int $tokenType - * @return bool - * @since 2.6.0 - */ - protected function isListUnpacking($tokenType = null) - { - return in_array($tokenType ?: $this->tokenizer->peek(), array(Tokens::T_LIST, Tokens::T_SQUARED_BRACKET_OPEN)); - } - - /** - * @return \PDepend\Source\AST\ASTType - */ - protected function parseReturnTypeHint() - { - $this->consumeComments(); - $this->consumeQuestionMark(); - - return parent::parseReturnTypeHint(); - } - - /** - * This method parses a formal parameter in all it's variations. - * - * <code> - * // ------------ - * function traverse(Iterator $it) {} - * // ------------ - * - * // --------- - * function traverse(array $ar) {} - * // --------- - * - * // --- - * function traverse(&$x) {} - * // --- - * </code> - * - * @return \PDepend\Source\AST\ASTFormalParameter - */ - protected function parseFormalParameterOrTypeHintOrByReference() - { - $this->consumeComments(); - $this->consumeQuestionMark(); - - return parent::parseFormalParameterOrTypeHintOrByReference(); - } - - /** - * Parses a type hint that is valid in the supported PHP version. - * - * @return \PDepend\Source\AST\ASTNode - */ - protected function parseTypeHint() - { - $this->consumeQuestionMark(); - - return parent::parseTypeHint(); - } - - /** - * Override this in later PHPParserVersions as necessary - * @param integer $tokenType - * @param integer $modifiers - * @return \PDepend\Source\AST\ASTConstantDefinition; - * @throws UnexpectedTokenException - */ - protected function parseUnknownDeclaration($tokenType, $modifiers) - { - if ($tokenType == Tokens::T_CONST) { - $definition = $this->parseConstantDefinition(); - $constantModifiers = $this->getModifiersForConstantDefinition($tokenType, $modifiers); - $definition->setModifiers($constantModifiers); - - return $definition; - } - - return parent::parseUnknownDeclaration($tokenType, $modifiers); - } - - /** - * Tests if the given image is a PHP 7 type hint. - * - * @param string $image - * @return boolean - */ - protected function isScalarOrCallableTypeHint($image) - { - switch (strtolower($image)) { - case 'iterable': - case 'void': - return true; - } - - return parent::isScalarOrCallableTypeHint($image); - } - - /** - * Parses a scalar type hint or a callable type hint. - * - * @param string $image - * @return \PDepend\Source\AST\ASTType - */ - protected function parseScalarOrCallableTypeHint($image) - { - switch (strtolower($image)) { - case 'void': - return $this->builder->buildAstScalarType($image); - case 'iterable': - return $this->builder->buildAstTypeIterable(); - } - - return parent::parseScalarOrCallableTypeHint($image); - } - - /** - * This method parses class references in catch statement. - * - * @param \PDepend\Source\AST\ASTCatchStatement $stmt The owning catch statement. - */ - protected function parseCatchExceptionClass(ASTCatchStatement $stmt) - { - do { - $repeat = false; - parent::parseCatchExceptionClass($stmt); - - if (Tokens::T_BITWISE_OR === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_BITWISE_OR); - $repeat = true; - } - } while ($repeat === true); - } - - /** - * Return true if [, $foo] or [$foo, , $bar] is allowed. - * - * @return bool - */ - protected function canHaveCommaBetweenArrayElements() - { - return true; - } - - private function consumeQuestionMark() - { - if ($this->tokenizer->peek() === Tokens::T_QUESTION_MARK) { - $this->consumeToken(Tokens::T_QUESTION_MARK); - } - } - - private function getModifiersForConstantDefinition($tokenType, $modifiers) - { - $allowed = State::IS_PUBLIC | State::IS_PROTECTED | State::IS_PRIVATE; - $modifiers &= $allowed; - - if ($this->classOrInterface instanceof ASTInterface && ($modifiers & (State::IS_PROTECTED | State::IS_PRIVATE)) !== 0) { - throw new InvalidStateException( - $this->tokenizer->next()->startLine, - (string) $this->compilationUnit, - sprintf( - 'Constant can\'t be declared private or protected in interface "%s".', - $this->classOrInterface->getName() - ) - ); - } - - return $modifiers; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion72.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion72.php deleted file mode 100644 index 6a6f0a0..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion72.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ - -namespace PDepend\Source\Language\PHP; - -/** - * Concrete parser implementation that supports features up to PHP version 7.2. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.4 - */ -abstract class PHPParserVersion72 extends PHPParserVersion71 -{ -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion73.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion73.php deleted file mode 100644 index 23e48c5..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion73.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ - -namespace PDepend\Source\Language\PHP; - -/** - * Concrete parser implementation that supports features up to PHP version 7.3. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.4 - */ -abstract class PHPParserVersion73 extends PHPParserVersion72 -{ -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion74.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion74.php deleted file mode 100644 index 4ea8758..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPParserVersion74.php +++ /dev/null @@ -1,134 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.3 - */ - -namespace PDepend\Source\Language\PHP; - -use PDepend\Source\AST\ASTFieldDeclaration; -use PDepend\Source\AST\ASTType; -use PDepend\Source\Parser\UnexpectedTokenException; -use PDepend\Source\Tokenizer\Tokens; - -/** - * Concrete parser implementation that supports features up to PHP version 7.4. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.4 - */ -abstract class PHPParserVersion74 extends PHPParserVersion73 -{ - protected function parseUnknownDeclaration($tokenType, $modifiers) - { - /** - * Typed properties - * https://www.php.net/manual/en/migration74.new-features.php#migration74.new-features.core.typed-properties - */ - if (in_array($tokenType, array( - Tokens::T_STRING, - Tokens::T_ARRAY, - Tokens::T_QUESTION_MARK, - Tokens::T_BACKSLASH, - Tokens::T_CALLABLE, - Tokens::T_SELF, - ))) { - $type = $this->parseTypeHint(); - $declaration = $this->parseFieldDeclaration(); - $declaration->prependChild($type); - $declaration->setModifiers($modifiers); - - return $declaration; - } - - return parent::parseUnknownDeclaration($tokenType, $modifiers); - } - - protected function parseMethodOrFieldDeclaration($modifiers = 0) - { - $field = parent::parseMethodOrFieldDeclaration($modifiers); - - if ($field instanceof ASTType) { - $type = $field; - - $field = parent::parseMethodOrFieldDeclaration($modifiers); - - if (!($field instanceof ASTFieldDeclaration)) { - throw new UnexpectedTokenException($this->tokenizer->prevToken(), $this->tokenizer->getSourceFile()); - } - - $field->prependChild($type); - } - - return $field; - } - - protected function parseLambdaFunctionDeclaration() - { - $this->tokenStack->push(); - - if (Tokens::T_FN === $this->tokenizer->peek()) { - $this->consumeToken(Tokens::T_FN); - } - - $closure = $this->builder->buildAstClosure(); - $closure->setReturnsByReference($this->parseOptionalByReference()); - $closure->addChild($this->parseFormalParameters()); - $closure = $this->parseCallableDeclarationAddition($closure); - - $closure->addChild( - $this->buildReturnStatement( - $this->consumeToken(Tokens::T_DOUBLE_ARROW) - ) - ); - - return $this->setNodePositionsAndReturn($closure); - } - - /** - * Override PHP 7.3 checkEllipsisInExpressionSupport to stop throwing the - * parsing exception. - */ - protected function checkEllipsisInExpressionSupport() - { - // Do not throw the exception from parent PHP 7.3 - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPTokenizerInternal.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPTokenizerInternal.php deleted file mode 100644 index f4f86ce..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Language/PHP/PHPTokenizerInternal.php +++ /dev/null @@ -1,954 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Language\PHP; - -use PDepend\Source\AST\ASTCompilationUnit; -use PDepend\Source\Tokenizer\FullTokenizer; -use PDepend\Source\Tokenizer\Token; -use PDepend\Source\Tokenizer\Tokenizer; -use PDepend\Source\Tokenizer\Tokens; - -/** - * Define PHP 5.4 __TRAIT__ token constant. - */ -if (!defined('T_TRAIT_C')) { - define('T_TRAIT_C', 42000); -} - -/** - * Define PHP 5.4 'trait' token constant. - */ -if (!defined('T_TRAIT')) { - define('T_TRAIT', 42001); -} - -/** - * Define PHP 5.4 'insteadof' token constant. - */ -if (!defined('T_INSTEADOF')) { - define('T_INSTEADOF', 42002); -} - -/** - * Define PHP 5.3 __NAMESPACE__ token constant. - */ -if (!defined('T_NS_C')) { - define('T_NS_C', 42003); -} - -/** - * Define PHP 5.3 'use' token constant - */ -if (!defined('T_USE')) { - define('T_USE', 42004); -} - -/** - * Define PHP 5.3 'namespace' token constant. - */ -if (!defined('T_NAMESPACE')) { - define('T_NAMESPACE', 42005); -} - -/** - * Define PHP 5.6 '...' token constant - */ -if (!defined('T_ELLIPSIS')) { - define('T_ELLIPSIS', 42006); -} - -/** - * Define PHP 5.3's '__DIR__' token constant. - */ -if (!defined('T_DIR')) { - define('T_DIR', 42006); -} - -/** - * Define PHP 5.3's 'T_GOTO' token constant. - */ -if (!defined('T_GOTO')) { - define('T_GOTO', 42007); -} - -/** - * Define PHP 5.4's 'T_CALLABLE' token constant - */ -if (!defined('T_CALLABLE')) { - define('T_CALLABLE', 42008); -} - -/** - * Define PHP 5.5's 'T_YIELD' token constant - */ -if (!defined('T_YIELD')) { - define('T_YIELD', 42009); -} - -/** - * Define PHP 5,5's 'T_FINALLY' token constant - */ -if (!defined('T_FINALLY')) { - define('T_FINALLY', 42010); -} - -/** - * Define character token that was removed in PHP 7 - */ -if (!defined('T_CHARACTER')) { - define('T_CHARACTER', 42011); -} - -/** - * Define bad character token that was removed in PHP 7 - */ -if (!defined('T_BAD_CHARACTER')) { - define('T_BAD_CHARACTER', 42012); -} - -/** - * Define PHP 7's '<=>' token constant - */ -if (!defined('T_SPACESHIP')) { - define('T_SPACESHIP', 42013); -} - -/** - * Define PHP 7's '??' token constant - */ -if (!defined('T_COALESCE')) { - define('T_COALESCE', 42014); -} - -/** - * Define PHP 7's '**' token constant - */ -if (!defined('T_POW')) { - define('T_POW', 42015); -} - -/** - * Define PHP 7.4's fn arrow function keyword - */ -if (!defined('T_FN')) { - define('T_FN', 42016); -} - -/** - * Define PHP 7.4's ??= operator - */ -if (!defined('T_COALESCE_EQUAL')) { - define('T_COALESCE_EQUAL', 42017); -} - -/** - * This tokenizer uses the internal {@link token_get_all()} function as token stream - * generator. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class PHPTokenizerInternal implements FullTokenizer -{ - /** - * Mapping between php internal tokens and php depend tokens. - * - * @var array<integer, integer> - */ - protected static $tokenMap = array( - T_AS => Tokens::T_AS, - T_DO => Tokens::T_DO, - T_IF => Tokens::T_IF, - T_SL => Tokens::T_SL, - T_SR => Tokens::T_SR, - T_DEC => Tokens::T_DEC, - T_FOR => Tokens::T_FOR, - T_INC => Tokens::T_INC, - T_NEW => Tokens::T_NEW, - T_POW => Tokens::T_POW, - T_TRY => Tokens::T_TRY, - T_USE => Tokens::T_USE, - T_VAR => Tokens::T_VAR, - T_CASE => Tokens::T_CASE, - T_ECHO => Tokens::T_ECHO, - T_ELSE => Tokens::T_ELSE, - T_EVAL => Tokens::T_EVAL, - T_EXIT => Tokens::T_EXIT, - T_FILE => Tokens::T_FILE, - T_GOTO => Tokens::T_GOTO, - T_LINE => Tokens::T_LINE, - T_LIST => Tokens::T_LIST, - T_NS_C => Tokens::T_NS_C, - T_ARRAY => Tokens::T_ARRAY, - T_BREAK => Tokens::T_BREAK, - T_CLASS => Tokens::T_CLASS, - T_CATCH => Tokens::T_CATCH, - T_CLONE => Tokens::T_CLONE, - T_CONST => Tokens::T_CONST, - T_EMPTY => Tokens::T_EMPTY, - T_ENDIF => Tokens::T_ENDIF, - T_FINAL => Tokens::T_FINAL, - T_ISSET => Tokens::T_ISSET, - T_PRINT => Tokens::T_PRINT, - T_THROW => Tokens::T_THROW, - T_TRAIT => Tokens::T_TRAIT, - T_UNSET => Tokens::T_UNSET, - T_WHILE => Tokens::T_WHILE, - T_ENDFOR => Tokens::T_ENDFOR, - T_ELSEIF => Tokens::T_ELSEIF, - T_FUNC_C => Tokens::T_FUNC_C, - T_GLOBAL => Tokens::T_GLOBAL, - T_PUBLIC => Tokens::T_PUBLIC, - T_RETURN => Tokens::T_RETURN, - T_STATIC => Tokens::T_STATIC, - T_STRING => Tokens::T_STRING, - T_SWITCH => Tokens::T_SWITCH, - T_CLASS_C => Tokens::T_CLASS_C, - T_COMMENT => Tokens::T_COMMENT, - T_DECLARE => Tokens::T_DECLARE, - T_DEFAULT => Tokens::T_DEFAULT, - T_DNUMBER => Tokens::T_DNUMBER, - T_EXTENDS => Tokens::T_EXTENDS, - T_FOREACH => Tokens::T_FOREACH, - T_INCLUDE => Tokens::T_INCLUDE, - T_LNUMBER => Tokens::T_LNUMBER, - T_PRIVATE => Tokens::T_PRIVATE, - T_REQUIRE => Tokens::T_REQUIRE, - T_TRAIT_C => Tokens::T_TRAIT_C, - T_ABSTRACT => Tokens::T_ABSTRACT, - T_CALLABLE => Tokens::T_CALLABLE, - T_ENDWHILE => Tokens::T_ENDWHILE, - T_FUNCTION => Tokens::T_FUNCTION, - T_INT_CAST => Tokens::T_INT_CAST, - T_IS_EQUAL => Tokens::T_IS_EQUAL, - T_OR_EQUAL => Tokens::T_OR_EQUAL, - T_CONTINUE => Tokens::T_CONTINUE, - T_METHOD_C => Tokens::T_METHOD_C, - T_ELLIPSIS => Tokens::T_ELLIPSIS, - T_OPEN_TAG => Tokens::T_OPEN_TAG, - T_SL_EQUAL => Tokens::T_SL_EQUAL, - T_SR_EQUAL => Tokens::T_SR_EQUAL, - T_VARIABLE => Tokens::T_VARIABLE, - T_ENDSWITCH => Tokens::T_ENDSWITCH, - T_DIV_EQUAL => Tokens::T_DIV_EQUAL, - T_AND_EQUAL => Tokens::T_AND_EQUAL, - T_MOD_EQUAL => Tokens::T_MOD_EQUAL, - T_MUL_EQUAL => Tokens::T_MUL_EQUAL, - T_NAMESPACE => Tokens::T_NAMESPACE, - T_XOR_EQUAL => Tokens::T_XOR_EQUAL, - T_INTERFACE => Tokens::T_INTERFACE, - T_BOOL_CAST => Tokens::T_BOOL_CAST, - T_CHARACTER => Tokens::T_CHARACTER, - T_CLOSE_TAG => Tokens::T_CLOSE_TAG, - T_INSTEADOF => Tokens::T_INSTEADOF, - T_PROTECTED => Tokens::T_PROTECTED, - T_SPACESHIP => Tokens::T_SPACESHIP, - T_CURLY_OPEN => Tokens::T_CURLY_BRACE_OPEN, - T_ENDFOREACH => Tokens::T_ENDFOREACH, - T_ENDDECLARE => Tokens::T_ENDDECLARE, - T_IMPLEMENTS => Tokens::T_IMPLEMENTS, - T_NUM_STRING => Tokens::T_NUM_STRING, - T_PLUS_EQUAL => Tokens::T_PLUS_EQUAL, - T_ARRAY_CAST => Tokens::T_ARRAY_CAST, - T_BOOLEAN_OR => Tokens::T_BOOLEAN_OR, - T_INSTANCEOF => Tokens::T_INSTANCEOF, - T_LOGICAL_OR => Tokens::T_LOGICAL_OR, - T_UNSET_CAST => Tokens::T_UNSET_CAST, - T_DOC_COMMENT => Tokens::T_DOC_COMMENT, - T_END_HEREDOC => Tokens::T_END_HEREDOC, - T_MINUS_EQUAL => Tokens::T_MINUS_EQUAL, - T_BOOLEAN_AND => Tokens::T_BOOLEAN_AND, - T_DOUBLE_CAST => Tokens::T_DOUBLE_CAST, - T_INLINE_HTML => Tokens::T_INLINE_HTML, - T_LOGICAL_AND => Tokens::T_LOGICAL_AND, - T_LOGICAL_XOR => Tokens::T_LOGICAL_XOR, - T_OBJECT_CAST => Tokens::T_OBJECT_CAST, - T_STRING_CAST => Tokens::T_STRING_CAST, - T_DOUBLE_ARROW => Tokens::T_DOUBLE_ARROW, - T_INCLUDE_ONCE => Tokens::T_INCLUDE_ONCE, - T_IS_IDENTICAL => Tokens::T_IS_IDENTICAL, - T_DOUBLE_COLON => Tokens::T_DOUBLE_COLON, - T_CONCAT_EQUAL => Tokens::T_CONCAT_EQUAL, - T_IS_NOT_EQUAL => Tokens::T_IS_NOT_EQUAL, - T_REQUIRE_ONCE => Tokens::T_REQUIRE_ONCE, - T_BAD_CHARACTER => Tokens::T_BAD_CHARACTER, - T_HALT_COMPILER => Tokens::T_HALT_COMPILER, - T_START_HEREDOC => Tokens::T_START_HEREDOC, - T_STRING_VARNAME => Tokens::T_STRING_VARNAME, - T_OBJECT_OPERATOR => Tokens::T_OBJECT_OPERATOR, - T_IS_NOT_IDENTICAL => Tokens::T_IS_NOT_IDENTICAL, - T_OPEN_TAG_WITH_ECHO => Tokens::T_OPEN_TAG_WITH_ECHO, - T_IS_GREATER_OR_EQUAL => Tokens::T_IS_GREATER_OR_EQUAL, - T_IS_SMALLER_OR_EQUAL => Tokens::T_IS_SMALLER_OR_EQUAL, - // T_PAAMAYIM_NEKUDOTAYIM => Tokens::T_DOUBLE_COLON, - T_ENCAPSED_AND_WHITESPACE => Tokens::T_ENCAPSED_AND_WHITESPACE, - T_CONSTANT_ENCAPSED_STRING => Tokens::T_CONSTANT_ENCAPSED_STRING, - T_YIELD => Tokens::T_YIELD, - T_FINALLY => Tokens::T_FINALLY, - T_COALESCE => Tokens::T_COALESCE, - T_COALESCE_EQUAL => Tokens::T_COALESCE_EQUAL, - // T_DOLLAR_OPEN_CURLY_BRACES => Tokens::T_CURLY_BRACE_OPEN, - T_FN => Tokens::T_FN, - ); - - /** - * Internally used transition token. - */ - const T_ELLIPSIS = 23006; - - /** - * Mapping between php internal text tokens an php depend numeric tokens. - * - * @var array<string, integer> - */ - protected static $literalMap = array( - '@' => Tokens::T_AT, - '/' => Tokens::T_DIV, - '%' => Tokens::T_MOD, - '*' => Tokens::T_MUL, - '+' => Tokens::T_PLUS, - ':' => Tokens::T_COLON, - ',' => Tokens::T_COMMA, - '=' => Tokens::T_EQUAL, - '-' => Tokens::T_MINUS, - '.' => Tokens::T_CONCAT, - '$' => Tokens::T_DOLLAR, - '`' => Tokens::T_BACKTICK, - '\\' => Tokens::T_BACKSLASH, - ';' => Tokens::T_SEMICOLON, - '|' => Tokens::T_BITWISE_OR, - '&' => Tokens::T_BITWISE_AND, - '~' => Tokens::T_BITWISE_NOT, - '^' => Tokens::T_BITWISE_XOR, - '"' => Tokens::T_DOUBLE_QUOTE, - '?' => Tokens::T_QUESTION_MARK, - '!' => Tokens::T_EXCLAMATION_MARK, - '{' => Tokens::T_CURLY_BRACE_OPEN, - '}' => Tokens::T_CURLY_BRACE_CLOSE, - '(' => Tokens::T_PARENTHESIS_OPEN, - ')' => Tokens::T_PARENTHESIS_CLOSE, - '<' => Tokens::T_ANGLE_BRACKET_OPEN, - '>' => Tokens::T_ANGLE_BRACKET_CLOSE, - '[' => Tokens::T_SQUARED_BRACKET_OPEN, - ']' => Tokens::T_SQUARED_BRACKET_CLOSE, - 'use' => Tokens::T_USE, - 'goto' => Tokens::T_GOTO, - 'null' => Tokens::T_NULL, - 'self' => Tokens::T_SELF, - 'true' => Tokens::T_TRUE, - 'array' => Tokens::T_ARRAY, - 'false' => Tokens::T_FALSE, - 'trait' => Tokens::T_TRAIT, - 'yield' => Tokens::T_YIELD, - 'yield from' => Tokens::T_YIELD, - 'parent' => Tokens::T_PARENT, - 'finally' => Tokens::T_FINALLY, - 'callable' => Tokens::T_CALLABLE, - 'insteadof' => Tokens::T_INSTEADOF, - 'namespace' => Tokens::T_NAMESPACE, - '__dir__' => Tokens::T_DIR, - '__trait__' => Tokens::T_TRAIT_C, - '__namespace__' => Tokens::T_NS_C, - ); - - /** - * - * @var array<mixed, array> - */ - protected static $substituteTokens = array( - T_DOLLAR_OPEN_CURLY_BRACES => array('$', '{'), - ); - - /** - * BuilderContext sensitive alternative mappings. - * - * @var array<integer, array> - */ - protected static $alternativeMap = array( - Tokens::T_USE => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - Tokens::T_CONST => Tokens::T_STRING, - Tokens::T_FUNCTION => Tokens::T_STRING, - ), - - Tokens::T_GOTO => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - Tokens::T_CONST => Tokens::T_STRING, - Tokens::T_FUNCTION => Tokens::T_STRING, - ), - - Tokens::T_NULL => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - Tokens::T_CONST => Tokens::T_STRING, - Tokens::T_FUNCTION => Tokens::T_STRING, - ), - - Tokens::T_SELF => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - Tokens::T_CONST => Tokens::T_STRING, - Tokens::T_FUNCTION => Tokens::T_STRING, - ), - - Tokens::T_TRUE => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - Tokens::T_NAMESPACE => Tokens::T_STRING, - Tokens::T_CONST => Tokens::T_STRING, - Tokens::T_FUNCTION => Tokens::T_STRING, - ), - - Tokens::T_ARRAY => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - ), - - Tokens::T_FALSE => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - Tokens::T_NAMESPACE => Tokens::T_STRING, - Tokens::T_CONST => Tokens::T_STRING, - Tokens::T_FUNCTION => Tokens::T_STRING, - ), - - Tokens::T_NAMESPACE => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - Tokens::T_CONST => Tokens::T_STRING, - Tokens::T_FUNCTION => Tokens::T_STRING, - ), - - Tokens::T_DIR => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - Tokens::T_CONST => Tokens::T_STRING, - Tokens::T_FUNCTION => Tokens::T_STRING, - ), - - Tokens::T_NS_C => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - Tokens::T_CONST => Tokens::T_STRING, - Tokens::T_FUNCTION => Tokens::T_STRING, - ), - - Tokens::T_PARENT => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - Tokens::T_CONST => Tokens::T_STRING, - Tokens::T_FUNCTION => Tokens::T_STRING, - ), - - Tokens::T_FINALLY => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - Tokens::T_CONST => Tokens::T_STRING, - Tokens::T_FUNCTION => Tokens::T_STRING, - ), - - Tokens::T_CALLABLE => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - ), - - Tokens::T_LIST => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - ), - - Tokens::T_EMPTY => array( - Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, - Tokens::T_DOUBLE_COLON => Tokens::T_STRING, - ), - - Tokens::T_CLASS => array( - Tokens::T_DOUBLE_COLON => Tokens::T_CLASS_FQN, - ), - ); - - protected static $reductionMap = array( - Tokens::T_CONCAT => array( - Tokens::T_CONCAT => array( - 'type' => self::T_ELLIPSIS, - 'image' => '..', - ), - self::T_ELLIPSIS => array( - 'type' => Tokens::T_ELLIPSIS, - 'image' => '...', - ) - ), - - Tokens::T_ANGLE_BRACKET_CLOSE => array( - Tokens::T_IS_SMALLER_OR_EQUAL => array( - 'type' => Tokens::T_SPACESHIP, - 'image' => '<=>', - ) - ), - - Tokens::T_QUESTION_MARK => array( - Tokens::T_QUESTION_MARK => array( - 'type' => Tokens::T_COALESCE, - 'image' => '??', - ) - ), - - Tokens::T_MUL => array( - Tokens::T_MUL => array( - 'type' => Tokens::T_POW, - 'image' => '**', - ) - ), - ); - - /** - * The source file instance. - * - * @var \PDepend\Source\AST\ASTCompilationUnit - */ - protected $sourceFile = ''; - - /** - * Count of all tokens. - * - * @var integer - */ - protected $count = 0; - - /** - * Internal stream pointer index. - * - * @var integer - */ - protected $index = 0; - - /** - * Prepared token list. - * - * @var Token[]|null - */ - protected $tokens = null; - - /** - * The next free identifier for unknown string tokens. - * - * @var integer - */ - private $unknownTokenID = 1000; - - /** - * Returns the name of the source file. - * - * @return \PDepend\Source\AST\ASTCompilationUnit - */ - public function getSourceFile() - { - return $this->sourceFile; - } - - /** - * Sets a new php source file. - * - * @param string $sourceFile A php source file. - * - * @return void - */ - public function setSourceFile($sourceFile) - { - $this->tokens = null; - $this->sourceFile = new ASTCompilationUnit($sourceFile); - } - - /** - * Returns the previous token or null if there is no one yet. - * - * @return Token|null - */ - public function prevToken() - { - $this->tokenize(); - - if ($this->index > 0 && $this->index < $this->count - 1) { - return $this->tokens[$this->index - 1]; - } - - return null; - } - - /** - * Returns the current token or null if there is no more. - * - * @return Token|null - */ - public function currentToken() - { - $this->tokenize(); - - if ($this->index < $this->count - 1) { - return $this->tokens[$this->index]; - } - - return null; - } - - /** - * Returns the next token or {@link \PDepend\Source\Tokenizer\Tokenizer::T_EOF} if - * there is no next token. - * - * @return Token|integer - */ - public function next() - { - $this->tokenize(); - - if ($this->index < $this->count) { - return $this->tokens[$this->index++]; - } - - return self::T_EOF; - } - - /** - * Returns the next token type or {@link \PDepend\Source\Tokenizer\Tokenizer::T_EOF} if - * there is no next token. - * - * @return integer - */ - public function peek() - { - $this->tokenize(); - - if (isset($this->tokens[$this->index])) { - return $this->tokens[$this->index]->type; - } - - return self::T_EOF; - } - - /** - * Returns the token type at the given position relatively to the current position. - * - * @param integer $shift positive or negative to apply to the current index. - * @return integer - */ - public function peekAt($shift) - { - $this->tokenize(); - - if ($this->index < -$shift) { - return self::T_BOF; - } - - $index = $this->index + $shift; - - if (isset($this->tokens[$index])) { - return $this->tokens[$index]->type; - } - - return self::T_EOF; - } - - /** - * Returns the type of next token, after the current token. This method - * ignores all comments between the current and the next token. - * - * @return integer - * @since 0.9.12 - */ - public function peekNext() - { - $this->tokenize(); - - $offset = 0; - - do { - $type = $this->tokens[$this->index + ++$offset]->type; - } while ($type == Tokens::T_COMMENT || $type == Tokens::T_DOC_COMMENT); - - return $type; - } - - /** - * Returns the previous token type or {@link \PDepend\Source\Tokenizer\Tokenizer::T_BOF} - * if there is no previous token. - * - * @return integer - */ - public function prev() - { - $this->tokenize(); - - if ($this->index > 1) { - return $this->tokens[$this->index - 2]->type; - } - return self::T_BOF; - } - - /** - * This method takes an array of tokens returned by <b>token_get_all()</b> - * and substitutes some of the tokens with those required by PDepend's - * parser implementation. - * - * @param array<array> $tokens Unprepared array of php tokens. - * - * @return array<array> - */ - private function substituteTokens(array $tokens) - { - $result = array(); - foreach ($tokens as $token) { - $temp = (array) $token; - $temp = $temp[0]; - if (isset(self::$substituteTokens[$temp])) { - foreach (self::$substituteTokens[$temp] as $token) { - $result[] = $token; - } - } else { - $result[] = $token; - } - } - return $result; - } - - /** - * Tokenizes the content of the source file with {@link token_get_all()} and - * filters this token stream. - * - * @return void - */ - private function tokenize() - { - if ($this->tokens !== null) { - return; - } - - $this->tokens = array(); - $this->index = 0; - $this->count = 0; - - // Replace short open tags, short open tags will produce invalid results - // in all environments with disabled short open tags. - $source = $this->sourceFile->getSource(); - $source = preg_replace( - array('(<\?=)', '(<\?(\s))'), - array('<?php echo ', '<?php\1'), - $source - ); - - $tokens = $this->substituteTokens(token_get_all($source)); - - // Is the current token between an opening and a closing php tag? - $inTag = false; - - // The current line number - $startLine = 1; - - $startColumn = 1; - $endColumn = 1; - - $literalMap = self::$literalMap; - $tokenMap = self::$tokenMap; - - // Previous found type - $previousType = null; - $previousStartColumn = 0; - - while ($token = current($tokens)) { - $type = null; - $image = null; - - if (is_string($token)) { - $token = array(null, $token); - } - - if ($token[0] === T_OPEN_TAG) { - $type = $tokenMap[$token[0]]; - $image = $token[1]; - $inTag = true; - } elseif ($token[0] === T_CLOSE_TAG) { - $type = $tokenMap[$token[0]]; - $image = $token[1]; - $inTag = false; - } elseif ($inTag === false) { - $type = Tokens::T_NO_PHP; - $image = $this->consumeNonePhpTokens($tokens); - } elseif ($token[0] === T_WHITESPACE) { - // Count newlines in token - $lines = substr_count($token[1], "\n"); - if ($lines === 0) { - $startColumn += strlen($token[1]); - } else { - $startColumn = strlen( - substr($token[1], strrpos($token[1], "\n") + 1) - ) + 1; - } - - $startLine += $lines; - } else { - $value = strtolower($token[1]); - if (isset($literalMap[$value])) { - // Fetch literal type - $type = $literalMap[$value]; - $image = $token[1]; - - // Check for a context sensitive alternative - if (isset(self::$alternativeMap[$type][$previousType])) { - $type = self::$alternativeMap[$type][$previousType]; - } - - if (isset(self::$reductionMap[$type][$previousType])) { - $image = self::$reductionMap[$type][$previousType]['image']; - $type = self::$reductionMap[$type][$previousType]['type']; - - $startColumn = $previousStartColumn; - - array_pop($this->tokens); - } - } elseif (isset($tokenMap[$token[0]])) { - $type = $tokenMap[$token[0]]; - // Check for a context sensitive alternative - if (isset(self::$alternativeMap[$type][$previousType])) { - $type = self::$alternativeMap[$type][$previousType]; - } - - $image = $token[1]; - } else { - // This should never happen - // @codeCoverageIgnoreStart - list($type, $image) = $this->generateUnknownToken($token[1]); - // @codeCoverageIgnoreEnd - } - } - - if ($type) { - $rtrim = rtrim($image); - $lines = substr_count($rtrim, "\n"); - if ($lines === 0) { - $endColumn = $startColumn + strlen($rtrim) - 1; - } else { - $endColumn = strlen( - substr($rtrim, strrpos($rtrim, "\n") + 1) - ); - } - - $endLine = $startLine + $lines; - - $token = new Token($type, $rtrim, $startLine, $endLine, $startColumn, $endColumn); - - // Store token in internal list - $this->tokens[] = $token; - - // Store previous start column - $previousStartColumn = $startColumn; - - // Count newlines in token - $lines = substr_count($image, "\n"); - if ($lines === 0) { - $startColumn += strlen($image); - } else { - $startColumn = strlen( - substr($image, strrpos($image, "\n") + 1) - ) + 1; - } - - $startLine += $lines; - - // Store current type - if ($type !== Tokens::T_COMMENT && $type !== Tokens::T_DOC_COMMENT) { - $previousType = $type; - } - } - - next($tokens); - } - - $this->count = count($this->tokens); - } - - /** - * This method fetches all tokens until an opening php tag was found and it - * returns the collected content. The returned value will be null if there - * was no none php token. - * - * @param array $tokens Reference to the current token stream. - * - * @return string - */ - private function consumeNonePhpTokens(array &$tokens) - { - // The collected token content - $content = null; - - // Fetch current token - $token = (array) current($tokens); - - // Skipp all non open tags - while ($token[0] !== T_OPEN_TAG_WITH_ECHO && - $token[0] !== T_OPEN_TAG && - $token[0] !== false) { - $content .= (isset($token[1]) ? $token[1] : $token[0]); - - $token = (array) next($tokens); - } - - // Set internal pointer one back when there was at least one none php token - if ($token[0] !== false) { - prev($tokens); - } - - return $content; - } - - /** - * Generates a dummy/temp token for unknown string literals. - * - * @param string $token The unknown string token. - * - * @return array<integer, mixed> - */ - private function generateUnknownToken($token) - { - return array($this->unknownTokenID++, $token); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/InvalidStateException.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/InvalidStateException.php deleted file mode 100644 index c4bcb59..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/InvalidStateException.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Parser; - -/** - * This type of exception is thrown when the parser reaches an invalid state - * and the parsed source does not fill the expected structure. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class InvalidStateException extends ParserException -{ - /** - * Constructs a new invalid state exception. - * - * @param integer $lineNumber Line number where the parser has stopped. - * @param string $fileName The source file where this exception occurred. - * @param string $reason Short description what has happened. - */ - public function __construct($lineNumber, $fileName, $reason) - { - parent::__construct( - sprintf( - 'The parser has reached an invalid state near line "%d" in file ' . - '"%s". Please check the following conditions: %s', - $lineNumber, - $fileName, - $reason - ) - ); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/MissingValueException.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/MissingValueException.php deleted file mode 100644 index 976723a..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/MissingValueException.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Parser; - -use PDepend\Source\Tokenizer\Token; -use PDepend\Source\Tokenizer\Tokenizer; - -/** - * This type of exception is thrown when a parameter or property declaration - * should contain a default value, but this value was not defined. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class MissingValueException extends ParserException -{ - /** - * Constructs a new missing value exception. - * - * @param \PDepend\Source\Tokenizer\Tokenizer $tokenizer - */ - public function __construct(Tokenizer $tokenizer) - { - // Get wrong token - $token = $tokenizer->next(); - // The parser must take care for this - assert($token instanceof Token); - - $message = sprintf( - 'Missing default value on line: %d, col: %d, file: %s.', - $token->startLine, - $token->startColumn, - $tokenizer->getSourceFile() - ); - - parent::__construct($message); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/NoActiveScopeException.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/NoActiveScopeException.php deleted file mode 100644 index c7d3c97..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/NoActiveScopeException.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Parser; - -/** - * This type of exception is thrown when an operation is performed - * on a symbol table and there is no active scope. - */ -class NoActiveScopeException extends ParserException -{ - /** - * Constructs a new no active scope exception. - */ - public function __construct() - { - parent::__construct('No active scope in symbol table.'); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/ParserException.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/ParserException.php deleted file mode 100644 index c2902ce..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/ParserException.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Parser; - -/** - * Base class for exceptions that can occurred during the parsing process. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ParserException extends \RuntimeException -{ -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/SymbolTable.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/SymbolTable.php deleted file mode 100644 index 318b211..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/SymbolTable.php +++ /dev/null @@ -1,175 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Parser; - -/** - * This class provides a simple hashmap for name mappings done by the parser. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class SymbolTable -{ - /** - * Stack with all active scopes. - * - * @var array<array> - */ - private $scopeStack = array(); - - /** - * The currently active scope. - * - * @var array<string, string>|null - */ - private $scope = array(); - - /** - * This method creates a new scope. - * - * @return void - */ - public function createScope() - { - // Add copy of last scope as new scope - array_push($this->scopeStack, $this->scope); - } - - /** - * This method destroys the top most scope. - * - * @throws NoActiveScopeException - * - * @return void - */ - public function destroyScope() - { - $this->ensureActiveScopeExists(); - - // Destroy current active scope - $this->scope = null; - - // Try to restore previously active scope - if (count($this->scopeStack) > 0) { - $this->scope = array_pop($this->scopeStack); - } - } - - /** - * Adds a new value to the top most scope. - * - * @param string $key The key of this scope value. - * @param mixed $value A new scope value. - * - * @throws NoActiveScopeException - * - * @return void - */ - public function add($key, $value) - { - $this->ensureActiveScopeExists(); - $this->scope[$this->normalizeKey($key)] = $value; - } - - /** - * Resets the current scope - * - * @throws NoActiveScopeException - * - * @return void - */ - public function resetScope() - { - $this->ensureActiveScopeExists(); - $this->scope = array(); - } - - /** - * This method will return the registered value for the given key, when it - * exists in the current scope. The returned value will <b>null</b> if no - * value exists for the given key. - * - * @param string $key The key for a searched scope value. - * - * @throws NoActiveScopeException - * - * @return mixed - */ - public function lookup($key) - { - $this->ensureActiveScopeExists(); - - $normalizedKey = $this->normalizeKey($key); - - return isset($this->scope[$normalizedKey]) - ? $this->scope[$normalizedKey] - : null; - } - - /** - * Checks if there is an active scope. - * - * @throws NoActiveScopeException if no active scope exists. - * - * @return void - */ - private function ensureActiveScopeExists() - { - if (null === $this->scope) { - throw new NoActiveScopeException(); - } - } - - /** - * Normalizes the <code>$key</code>, so it's the same for - * <code>add()</code> and <code>lookup()</code> operations. - * - * @param string $key - * - * @return string normalized key - */ - private function normalizeKey($key) - { - return strtolower($key); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenException.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenException.php deleted file mode 100644 index 811c754..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenException.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.10 - */ - -namespace PDepend\Source\Parser; - -/** - * Base class for token/token stream related exceptions. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.10 - */ -class TokenException extends ParserException -{ -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenStack.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenStack.php deleted file mode 100644 index 3fedf7e..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenStack.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ - -namespace PDepend\Source\Parser; - -use PDepend\Source\Tokenizer\Token; - -/** - * This class provides a scoped collection for {@link \PDepend\Source\Tokenizer\Token} - * objects. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.6 - */ -class TokenStack -{ - /** - * The actual token scope. - * - * @var \PDepend\Source\Tokenizer\Token[] - */ - private $tokens = array(); - - /** - * Stack with token scopes. - * - * @var \PDepend\Source\Tokenizer\Token[][] - */ - private $stack = array(); - - /** - * The current stack offset. - * - * @var integer - */ - private $offset = 0; - - /** - * This method will push a new token scope onto the stack, - * - * @return void - */ - public function push() - { - $this->stack[$this->offset++] = $this->tokens; - $this->tokens = array(); - } - - /** - * This method will pop the top token scope from the stack and return an - * array with all collected tokens. Additionally this method will add all - * tokens of the removed scope onto the next token scope. - * - * @return \PDepend\Source\Tokenizer\Token[] - */ - public function pop() - { - $tokens = $this->tokens; - $this->tokens = $this->stack[--$this->offset]; - - unset($this->stack[$this->offset]); - - foreach ($tokens as $token) { - $this->tokens[] = $token; - } - return $tokens; - } - - /** - * This method will add a new token to the currently active token scope. - * - * @param \PDepend\Source\Tokenizer\Token $token The token to add. - * @return \PDepend\Source\Tokenizer\Token - */ - public function add(Token $token) - { - return ($this->tokens[] = $token); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenStreamEndException.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenStreamEndException.php deleted file mode 100644 index 85eccb3..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/TokenStreamEndException.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Parser; - -use PDepend\Source\Tokenizer\Tokenizer; - -/** - * This type of exception is thrown when the parser reaches the end of the token - * stream, but expects further tokens. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class TokenStreamEndException extends TokenException -{ - /** - * Constructs a new end of token stream exception. - * - * @param \PDepend\Source\Tokenizer\Tokenizer $tokenizer - */ - public function __construct(Tokenizer $tokenizer) - { - parent::__construct( - sprintf( - 'Unexpected end of token stream in file: %s.', - $tokenizer->getSourceFile() - ) - ); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/UnexpectedTokenException.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/UnexpectedTokenException.php deleted file mode 100644 index 9863d5f..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Parser/UnexpectedTokenException.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Parser; - -use PDepend\Source\Tokenizer\Token; - -/** - * This type of exception is thrown when the parser detects an unexpected token. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class UnexpectedTokenException extends TokenException -{ - /** - * Constructs a new unexpected token exception. - * - * @param Token $token The last parsed token instance. - * @param string $fileName The file where the exception occurred. - */ - public function __construct(Token $token, $fileName) - { - $message = sprintf( - 'Unexpected token: %s, line: %d, col: %d, file: %s.', - $token->image, - $token->startLine, - $token->startColumn, - $fileName - ); - - parent::__construct($message); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/FullTokenizer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/FullTokenizer.php deleted file mode 100644 index b969fa5..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/FullTokenizer.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Tokenizer; - -/** - * Base interface for php code tokenizers that can access any token anytime. - * - * - Are able to return previously emitted token. - * - Are able to return token from the not yet buffered string. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface FullTokenizer extends Tokenizer -{ - /** - * Returns the token type at the given position relatively to the current position. - * - * @param integer $shift positive or negative to apply to the current index. - * @return integer - */ - public function peekAt($shift); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Token.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Token.php deleted file mode 100644 index 9f8c1bc..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Token.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Tokenizer; - -/** - * This struct represents a code token. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Token -{ - /** - * The token type identifier. - * - * @var integer - */ - public $type = null; - - /** - * The token image/textual representation. - * - * @var string - */ - public $image = null; - - /** - * The start line number for this token. - * - * @var integer - */ - public $startLine = null; - - /** - * The end line number for this token. - * - * @var integer - */ - public $endLine = null; - - /** - * The start column number for this token. - * - * @var integer - */ - public $startColumn = null; - - /** - * The end column number for this token. - * - * @var integer - */ - public $endColumn = null; - - /** - * Constructs a new source token. - * - * @param integer $type The token type identifier. - * @param string $image The token image/textual representation. - * @param integer $startLine The start line number for this token. - * @param integer $endLine The end line number for this token. - * @param integer $startColumn The start column number for this token. - * @param integer $endColumn The end column number for this token. - */ - public function __construct($type, $image, $startLine, $endLine, $startColumn, $endColumn) - { - $this->type = $type; - $this->image = $image; - $this->startLine = $startLine; - $this->endLine = $endLine; - $this->startColumn = $startColumn; - $this->endColumn = $endColumn; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Tokenizer.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Tokenizer.php deleted file mode 100644 index 8773f9f..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Tokenizer.php +++ /dev/null @@ -1,127 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Tokenizer; - -/** - * Base interface for all php code tokenizers. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface Tokenizer -{ - /** - * Marks the end of the token stream. - */ - const T_EOF = -1; - - /** - * Marks the beginning of the token stream. - */ - const T_BOF = -2; - - /** - * Returns the name of the source file. - * - * @return string - */ - public function getSourceFile(); - - /** - * Sets a new php source file. - * - * @param string $sourceFile A php source file. - * - * @return void - */ - public function setSourceFile($sourceFile); - - /** - * Returns the next token or {@link \PDepend\Source\Tokenizer\Tokenizer::T_EOF} if - * there is no next token. - * - * @return \PDepend\Source\Tokenizer\Token|integer - */ - public function next(); - - /** - * Returns the previous token or null if there is no one yet. - * - * @return \PDepend\Source\Tokenizer\Token|null - * @since 2.6.0 - */ - public function prevToken(); - - /** - * Returns the current token or null if there is no more. - * - * @return \PDepend\Source\Tokenizer\Token|null - * @since 2.6.0 - */ - public function currentToken(); - - /** - * Returns the next token type or {@link \PDepend\Source\Tokenizer\Tokenizer::T_EOF} if - * there is no next token. - * - * @return integer - */ - public function peek(); - - /** - * Returns the type of next token, after the current token. This method - * ignores all comments between the current and the next token. - * - * @return integer - * @since 0.9.12 - */ - public function peekNext(); - - /** - * Returns the previous token type or {@link \PDepend\Source\Tokenizer\Tokenizer::T_BOF} - * if there is no previous token. - * - * @return integer - */ - public function prev(); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Tokens.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Tokens.php deleted file mode 100644 index 6a84bc3..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Source/Tokenizer/Tokens.php +++ /dev/null @@ -1,889 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Source\Tokenizer; - -/** - * This interface holds the different tokenizer, builder and parser constants. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface Tokens -{ - /** - * Marks a class token. - */ - const T_CLASS = 1; - - /** - * Marks an interface token. - */ - const T_INTERFACE = 2; - - /** - * Marks an abstract token. - */ - const T_ABSTRACT = 3; - - /** - * Marks a curly brace open. - */ - const T_CURLY_BRACE_OPEN = 4; - - /** - * Marks a curly brace close. - */ - const T_CURLY_BRACE_CLOSE = 5; - - /** - * Marks a parenthesis open. - */ - const T_PARENTHESIS_OPEN = 6; - - /** - * Marks a parenthesis close. - */ - const T_PARENTHESIS_CLOSE = 7; - - /** - * Marks a new token. - */ - const T_NEW = 8; - - /** - * Marks a function. - */ - const T_FUNCTION = 9; - - /** - * Marks a double colon. - */ - const T_DOUBLE_COLON = 10; - - /** - * Marks a string token. - */ - const T_STRING = 11; - - /** - * Marks a doc comment. - */ - const T_DOC_COMMENT = 12; - - /** - * Marks a semicolon. - */ - const T_SEMICOLON = 13; - - /** - * Marks a null token. - */ - const T_NULL = 14; - - /** - * Marks a true token. - */ - const T_TRUE = 15; - - /** - * Marks a false token. - */ - const T_FALSE = 16; - - /** - * Marks a array token. - */ - const T_ARRAY = 17; - - /** - * Marks a 'parent' token. - */ - const T_PARENT = 18; - - /** - * Marks a '=' token. - */ - const T_EQUAL = 19; - - /** - * Marks a '&=' token. - */ - const T_AND_EQUAL = 20; - - /** - * Marks a '.=' token. - */ - const T_CONCAT_EQUAL = 21; - - /** - * Marks a '/=' token. - */ - const T_DIV_EQUAL = 22; - - /** - * Marks a '==' token. - */ - const T_IS_EQUAL = 23; - - /** - * Marks a '>=' token. - */ - const T_IS_GREATER_OR_EQUAL = 24; - - /** - * Marks a '===' token. - */ - const T_IS_IDENTICAL = 25; - - /** - * Marks a '!=' or '<>' token. - */ - const T_IS_NOT_EQUAL = 26; - - /** - * Marks a '!==' token. - */ - const T_IS_NOT_IDENTICAL = 27; - - /** - * Marks a '<=' token. - */ - const T_IS_SMALLER_OR_EQUAL = 28; - - /** - * Marks a '-=' token. - */ - const T_MINUS_EQUAL = 29; - - /** - * Marks a '%=' token. - */ - const T_MOD_EQUAL = 30; - - /** - * Marks a '*=' token. - */ - const T_MUL_EQUAL = 31; - - /** - * Marks a '|=' token. - */ - const T_OR_EQUAL = 32; - - /** - * Marks a '+=' token. - */ - const T_PLUS_EQUAL = 33; - - /** - * Marks a '^=' token. - */ - const T_XOR_EQUAL = 34; - - /** - * Marks a '.' token. - */ - const T_CONCAT = 35; - - /** - * Marks a 'as' token. - */ - const T_AS = 36; - - /** - * Marks a '(array)' cast token. - */ - const T_ARRAY_CAST = 37; - - /** - * Marks a '&&' token. - */ - const T_BOOLEAN_AND = 38; - - /** - * Marks a '||' token. - */ - const T_BOOLEAN_OR = 39; - - /** - * Marks a '(bool)' or '(boolean)' cast token. - */ - const T_BOOL_CAST = 40; - - /** - * Marks a 'break' token. - */ - const T_BREAK = 41; - - /** - * Marks a 'case' token. - */ - const T_CASE = 42; - - /** - * Marks a 'catch' token. - */ - const T_CATCH = 43; - - /** - * Marks a '__CLASS__' token. - */ - const T_CLASS_C = 44; - - /** - * Marks a 'clone' token. - */ - const T_CLONE = 45; - - /** - * Marks a '?>' token. - */ - const T_CLOSE_TAG = 46; - - /** - * Marks a 'const' token. - */ - const T_CONST = 47; - - /** - * Marks a constant string like 'foo' or "foo". - */ - const T_CONSTANT_ENCAPSED_STRING = 48; - - /** - * Marks a 'continue' token. - */ - const T_CONTINUE = 49; - - /** - * Marks a '--' token. - */ - const T_DEC = 50; - - /** - * Marks a 'declare' token. - */ - const T_DECLARE = 51; - - /** - * Marks a 'default' token. - */ - const T_DEFAULT = 52; - - /** - * Marks a floating point number. - */ - const T_DNUMBER = 53; - - /** - * Marks a 'do' token. - */ - const T_DO = 54; - - /** - * Marks a '=>' token. - */ - const T_DOUBLE_ARROW = 55; - - /** - * Marks a '(real)', '(float)' or '(double)' cast token. - */ - const T_DOUBLE_CAST = 56; - - /** - * Marks a 'echo' token. - */ - const T_ECHO = 57; - - /** - * Marks a 'else' token. - */ - const T_ELSE = 58; - - /** - * Marks a 'elseif' token. - */ - const T_ELSEIF = 59; - - /** - * Marks a 'empty' token. - */ - const T_EMPTY = 60; - - /** - * Marks the end of a heredoc block. - */ - const T_END_HEREDOC = 61; - - /** - * Marks a 'evil' token. - */ - const T_EVAL = 62; - - /** - * Marks a 'exit' or 'die' token. - */ - const T_EXIT = 63; - - /** - * Marks a 'extends' token. - */ - const T_EXTENDS = 64; - - /** - * Marks a '__FILE__' token. - */ - const T_FILE = 65; - - /** - * Marks a 'final' token. - */ - const T_FINAL = 66; - - /** - * Marks a 'for' token. - */ - const T_FOR = 67; - - /** - * Marks a 'foreach' token. - */ - const T_FOREACH = 68; - - /** - * Marks a '__FUNCTION__' token. - */ - const T_FUNC_C = 69; - - /** - * Marks a 'global' token. - */ - const T_GLOBAL = 70; - - /** - * Marks a '__halt_compiler()' token. - */ - const T_HALT_COMPILER = 71; - - /** - * Marks a 'if' token. - */ - const T_IF = 72; - - /** - * Marks a 'implements' token. - */ - const T_IMPLEMENTS = 73; - - /** - * Marks a '++' token. - */ - const T_INC = 74; - - /** - * Marks a 'include' token. - */ - const T_INCLUDE = 75; - - /** - * Marks a 'include_once' token. - */ - const T_INCLUDE_ONCE = 76; - - /** - * Marks inline html??? - */ - const T_INLINE_HTML = 77; - - /** - * Marks a 'instanceof' token. - */ - const T_INSTANCEOF = 78; - - /** - * Marks a '(int)' or '(integer)' cast token. - */ - const T_INT_CAST = 79; - - /** - * Marks a 'isset' token. - */ - const T_ISSET = 80; - - /** - * Marks a '__LINE__' token. - */ - const T_LINE = 81; - - /** - * Marks a 'list' token. - */ - const T_LIST = 82; - - /** - * Marks a integer number token. - */ - const T_LNUMBER = 83; - - /** - * Marks a 'and' token. - */ - const T_LOGICAL_AND = 84; - - /** - * Marks a 'or' token. - */ - const T_LOGICAL_OR = 85; - - /** - * Marks a 'xor' token. - */ - const T_LOGICAL_XOR = 86; - - /** - * Marks a '__METHOD__' token. - */ - const T_METHOD_C = 87; - - /** - * Marks a '__NAMESPACE__' token. - */ - const T_NS_C = 88; - - /** - * A number string token??? - */ - const T_NUM_STRING = 89; - - /** - * Marks a '(object)' cast token. - */ - const T_OBJECT_CAST = 90; - - /** - * Marks a '->' object access token. - */ - const T_OBJECT_OPERATOR = 91; - - /** - * Marks a php open token. - */ - const T_OPEN_TAG = 92; - - /** - * Marks a php open token. - */ - const T_OPEN_TAG_WITH_ECHO = 93; - - /** - * Marks a 'print' token. - */ - const T_PRINT = 94; - - /** - * Marks a 'private' token. - */ - const T_PRIVATE = 95; - - /** - * Marks a 'public' token. - */ - const T_PUBLIC = 96; - - /** - * Marks a 'protected' token. - */ - const T_PROTECTED = 97; - - /** - * Marks a 'require' token. - */ - const T_REQUIRE = 98; - - /** - * Marks a 'require_once' token. - */ - const T_REQUIRE_ONCE = 99; - - /** - * Marks a 'return' token. - */ - const T_RETURN = 100; - - /** - * Marks a '<<' token. - */ - const T_SL = 101; - - /** - * Marks a '<<=' token. - */ - const T_SL_EQUAL = 102; - - /** - * Marks a '>>' token. - */ - const T_SR = 103; - - /** - * Marks a '>>=' token. - */ - const T_SR_EQUAL = 104; - - /** - * Marks the beginning of a here doc block. - */ - const T_START_HEREDOC = 105; - - /** - * Marks a 'static' token. - */ - const T_STATIC = 106; - - /** - * Marks a '(string)' cast token. - */ - const T_STRING_CAST = 107; - - /** - * Marks a string var name??? - */ - const T_STRING_VARNAME = 108; - - /** - * Marks a 'switch' token. - */ - const T_SWITCH = 109; - - /** - * Marks a 'throw' token. - */ - const T_THROW = 110; - - /** - * Marks a 'try' token. - */ - const T_TRY = 111; - - /** - * Marks a 'unset' token. - */ - const T_UNSET = 112; - - /** - * Marks a '(unset)' cast token. - */ - const T_UNSET_CAST = 113; - - /** - * Marks a 'use' token. - */ - const T_USE = 114; - - /** - * Marks a 'var' token. - */ - const T_VAR = 115; - - /** - * Marks a variable token. - */ - const T_VARIABLE = 116; - - /** - * Marks a 'while' token. - */ - const T_WHILE = 117; - - /** - * Marks a ',' token. - */ - const T_COMMA = 118; - - /** - * Marks a '*' token. - */ - const T_MUL = 119; - - /** - * Marks a '[' token. - */ - const T_SQUARED_BRACKET_OPEN = 120; - - /** - * Marks a ']' token. - */ - const T_SQUARED_BRACKET_CLOSE = 121; - - /** - * Marks a '<' token. - */ - const T_ANGLE_BRACKET_OPEN = 122; - - /** - * Marks a '>' token. - */ - const T_ANGLE_BRACKET_CLOSE = 123; - - /** - * Marks a '"' token. - */ - const T_DOUBLE_QUOTE = 124; - - /** - * Marks a ':' token. - */ - const T_COLON = 125; - - /** - * Marks a '@' token. - */ - const T_AT = 126; - - /** - * Marks a '+' token. - */ - const T_PLUS = 127; - - /** - * Marks a '-' token. - */ - const T_MINUS = 128; - - /** - * Marks a '!' token. - */ - const T_EXCLAMATION_MARK = 129; - - /** - * Marks a '?' token. - */ - const T_QUESTION_MARK = 130; - - /** - * Marks a '&' token. - */ - const T_BITWISE_AND = 131; - - /** - * Marks a '|' token. - */ - const T_BITWISE_OR = 132; - - /** - * Marks a '~' token. - */ - const T_BITWISE_NOT = 133; - - /** - * Marks a '^' token. - */ - const T_BITWISE_XOR = 134; - - /** - * Marks a '/' token. - */ - const T_DIV = 135; - - /** - * Marks a '%' token. - */ - const T_MOD = 136; - - /** - * Marks a comment token. - */ - const T_COMMENT = 137; - - /** - * Marks a 'namespace' token. - */ - const T_NAMESPACE = 138; - - /** - * Marks an escape token. - */ - const T_ENCAPSED_AND_WHITESPACE = 139; - - /** - * Marks a '$' string token. - */ - const T_DOLLAR = 140; - - /** - * Marks any character token. - */ - const T_CHARACTER = 141; - - /** - * Marks any bad character token. - */ - const T_BAD_CHARACTER = 142; - - /** - * Marks a 'self' token. - */ - const T_SELF = 143; - - /** - * Marks a '`' backtick token. - */ - const T_BACKTICK = 144; - - /** - * Marks a '\' backslash token. - */ - const T_BACKSLASH = 145; - - /** - * Marks a '__DIR__' token. - */ - const T_DIR = 146; - - /** - * Marks a 'goto' token. - */ - const T_GOTO = 147; - - /** - * Alternative end token for an if-statement. - */ - const T_ENDIF = 148; - - /** - * Alternative end token for a for-statement. - */ - const T_ENDFOR = 149; - - /** - * Alternative end token for a foreach-statement. - */ - const T_ENDFOREACH = 150; - - /** - * Alternative end token for a switch-statement. - */ - const T_ENDSWITCH = 151; - - /** - * Alternative end token for a while-statement. - */ - const T_ENDWHILE = 152; - - /** - * Alternative end token for a declare-statement. - */ - const T_ENDDECLARE = 153; - - /** - * Marks a 'trait' keyword token. - */ - const T_TRAIT = 154; - - /** - * Marks a '__TRAIT__' magic constant token. - */ - const T_TRAIT_C = 155; - - /** - * Token that represents the new Callable type hint. - */ - const T_CALLABLE = 156; - - /** - * Token that represents the new 'insteadof' keyword. - */ - const T_INSTEADOF = 157; - - /** - * Token that represents the stdClass::class and $class::class constant. - */ - const T_CLASS_FQN = 158; - - /** - * Token that represents the new 'yield' keyword. - */ - const T_YIELD = 159; - - /** - * Token that represents the 'finally' keyword. - */ - const T_FINALLY = 160; - - /** - * Token that represents the '...' token - * - * @since 2.0.7 - */ - const T_ELLIPSIS = 161; - - /** - * Token that represents the '<=>' spaceship operator - */ - const T_SPACESHIP = 162; - - /** - * Token that represents the '??' null coalescing operator - */ - const T_COALESCE = 163; - - /** - * Token that represents the '**' null coalescing operator - */ - const T_POW = 164; - - /** - * Token that represents the 'fn' keyword of arrow functions. - */ - const T_FN = 165; - - /** - * Token that represents the '??=' null coalescing assignment operator - */ - const T_COALESCE_EQUAL = 166; - - /** - * Marks any content not between php tags. - */ - const T_NO_PHP = 255; -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/Command.php b/vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/Command.php deleted file mode 100644 index 435667b..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/Command.php +++ /dev/null @@ -1,646 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\TextUI; - -use PDepend\Application; -use PDepend\Util\ConfigurationInstance; -use PDepend\Util\Log; -use PDepend\Util\Workarounds; - -/** - * Handles the command line stuff and starts the text ui runner. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Command -{ - /** - * Marks a cli error exit. - */ - const CLI_ERROR = 1742; - - /** - * Marks an input error exit. - */ - const INPUT_ERROR = 1743; - - /** - * The recieved cli options - * - * @var array<string, mixed> - */ - private $options = array(); - - /** - * The directories/files to be analyzed - * - * @var array<integer, string> - */ - private $source = array(); - - /** - * The used text ui runner. - * - * @var \PDepend\TextUI\Runner - */ - private $runner = null; - - /** - * @var \PDepend\Application - */ - private $application; - - /** - * Performs the main cli process and returns the exit code. - * - * @return integer - */ - public function run() - { - $this->application = new Application(); - - try { - if ($this->parseArguments() === false) { - $this->printHelp(); - return self::CLI_ERROR; - } - } catch (\Exception $e) { - echo $e->getMessage(), PHP_EOL, PHP_EOL; - - $this->printHelp(); - return self::CLI_ERROR; - } - - if (isset($this->options['--help'])) { - $this->printHelp(); - return Runner::SUCCESS_EXIT; - } - if (isset($this->options['--usage'])) { - $this->printUsage(); - return Runner::SUCCESS_EXIT; - } - if (isset($this->options['--version'])) { - $this->printVersion(); - return Runner::SUCCESS_EXIT; - } - - $configurationFile = false; - - if (isset($this->options['--configuration'])) { - $configurationFile = $this->options['--configuration']; - - if (false === file_exists($configurationFile)) { - $configurationFile = getcwd() . '/' . $configurationFile; - } - if (false === file_exists($configurationFile)) { - $configurationFile = $this->options['--configuration']; - } - - unset($this->options['--configuration']); - } elseif (file_exists(getcwd() . '/pdepend.xml')) { - $configurationFile = getcwd() . '/pdepend.xml'; - } elseif (file_exists(getcwd() . '/pdepend.xml.dist')) { - $configurationFile = getcwd() . '/pdepend.xml.dist'; - } - - if ($configurationFile) { - try { - $this->application->setConfigurationFile($configurationFile); - } catch (\Exception $e) { - echo $e->getMessage(), PHP_EOL, PHP_EOL; - - $this->printHelp(); - return self::CLI_ERROR; - } - } - - // Create a new text ui runner - $this->runner = $this->application->getRunner(); - - $this->assignArguments(); - - // Get a copy of all options - $options = $this->options; - - // Get an array with all available log options - $logOptions = $this->application->getAvailableLoggerOptions(); - - // Get an array with all available analyzer options - $analyzerOptions = $this->application->getAvailableAnalyzerOptions(); - - foreach ($options as $option => $value) { - if (isset($logOptions[$option])) { - // Reduce recieved option list - unset($options[$option]); - // Register logger - $this->runner->addReportGenerator(substr($option, 2), $value); - } elseif (isset($analyzerOptions[$option])) { - // Reduce recieved option list - unset($options[$option]); - - if (isset($analyzerOptions[$option]['value']) && is_bool($value)) { - echo 'Option ', $option, ' requires a value.', PHP_EOL; - return self::INPUT_ERROR; - } elseif ($analyzerOptions[$option]['value'] === 'file' - && file_exists($value) === false - ) { - echo 'Specified file ', $option, '=', $value, - ' not exists.', PHP_EOL; - - return self::INPUT_ERROR; - } elseif ($analyzerOptions[$option]['value'] === '*[,...]') { - $value = array_map('trim', explode(',', $value)); - } - $this->runner->addOption(substr($option, 2), $value); - } - } - - if (isset($options['--without-annotations'])) { - // Disable annotation parsing - $this->runner->setWithoutAnnotations(); - // Remove option - unset($options['--without-annotations']); - } - - if (isset($options['--optimization'])) { - // This option is deprecated. - echo 'Option --optimization is ambiguous.', PHP_EOL; - // Remove option - unset($options['--optimization']); - } - - if (isset($options['--quiet'])) { - $runSilent = true; - unset($options['--quiet']); - } else { - $runSilent = false; - $this->runner->addProcessListener(new \PDepend\TextUI\ResultPrinter()); - } - - if (isset($options['--notify-me'])) { - $this->runner->addProcessListener( - new \PDepend\DbusUI\ResultPrinter() - ); - unset($options['--notify-me']); - } - - if (count($options) > 0) { - $this->printHelp(); - echo "Unknown option '", key($options), "' given.", PHP_EOL; - return self::CLI_ERROR; - } - - try { - // Output current pdepend version and author - if ($runSilent === false) { - $this->printVersion(); - $this->printWorkarounds(); - } - - $startTime = time(); - - $result = $this->runner->run(); - - if ($this->runner->hasParseErrors() === true) { - $errors = $this->runner->getParseErrors(); - - printf( - '%sThe following error%s occurred:%s', - PHP_EOL, - count($errors) > 1 ? 's' : '', - PHP_EOL - ); - - foreach ($errors as $error) { - echo $error, PHP_EOL; - } - echo PHP_EOL; - } - if ($runSilent === false) { - $this->printStatistics($startTime); - } - - return $result; - } catch (\RuntimeException $e) { - echo PHP_EOL, PHP_EOL, - 'Critical error: ', PHP_EOL, - '=============== ', PHP_EOL, - $e->getMessage(), PHP_EOL; - - Log::debug($e->getTraceAsString()); - - return $e->getCode(); - } - } - - /** - * Parses the cli arguments. - * - * @return boolean - */ - protected function parseArguments() - { - if (!isset($_SERVER['argv'])) { - if (false === (boolean) ini_get('register_argc_argv')) { - // @codeCoverageIgnoreStart - echo 'Please enable register_argc_argv in your php.ini.'; - } else { - // @codeCoverageIgnoreEnd - echo 'Unknown error, no $argv array available.'; - } - echo PHP_EOL, PHP_EOL; - return false; - } - - $argv = $_SERVER['argv']; - - // Remove the pdepend command line file - array_shift($argv); - - if (count($argv) === 0) { - return false; - } - - // Last argument must be a list of source directories - if (strpos(end($argv), '--') !== 0) { - $this->source = explode(',', array_pop($argv)); - } - - for ($i = 0, $c = count($argv); $i < $c; ++$i) { - // Is it an ini_set option? - if ($argv[$i] === '-d' && isset($argv[$i + 1])) { - if (strpos($argv[++$i], '=') === false) { - ini_set($argv[$i], 'on'); - } else { - list($key, $value) = explode('=', $argv[$i]); - - ini_set($key, $value); - } - } elseif (strpos($argv[$i], '=') === false) { - $this->options[$argv[$i]] = true; - } else { - list($key, $value) = explode('=', $argv[$i]); - - $this->options[$key] = $value; - } - } - - return true; - } - - /** - * Assign CLI arguments to current runner instance - * - * @return bool - */ - protected function assignArguments() - { - if ($this->source) { - $this->runner->setSourceArguments($this->source); - } - - // Check for suffix option - if (isset($this->options['--suffix'])) { - // Get file extensions - $extensions = explode(',', $this->options['--suffix']); - // Set allowed file extensions - $this->runner->setFileExtensions($extensions); - - unset($this->options['--suffix']); - } - - // Check for ignore option - if (isset($this->options['--ignore'])) { - // Get exclude directories - $directories = explode(',', $this->options['--ignore']); - // Set exclude directories - $this->runner->setExcludeDirectories($directories); - - unset($this->options['--ignore']); - } - - // Check for exclude namespace option - if (isset($this->options['--exclude'])) { - // Get exclude directories - $namespaces = explode(',', $this->options['--exclude']); - // Set exclude namespace - $this->runner->setExcludeNamespaces($namespaces); - - unset($this->options['--exclude']); - } - - // Check for the bad documentation option - if (isset($this->options['--bad-documentation'])) { - echo "Option --bad-documentation is ambiguous.", PHP_EOL; - - unset($this->options['--bad-documentation']); - } - - $configuration = $this->application->getConfiguration(); - - // Store in config registry - ConfigurationInstance::set($configuration); - - if (isset($this->options['--debug'])) { - unset($this->options['--debug']); - - Log::setSeverity(Log::DEBUG); - } - } - - /** - * Outputs the current PDepend version. - * - * @return void - */ - protected function printVersion() - { - $build = __DIR__ . '/../../../../../build.properties'; - - if (file_exists($build)) { - $data = @parse_ini_file($build); - $version = $data['project.version']; - } else { - $version = '@package_version@'; - } - - echo 'PDepend ', $version, PHP_EOL, PHP_EOL; - } - - /** - * If the current PHP installation requires some workarounds or limitations, - * this method will output a message on STDOUT. - * - * @return void - */ - protected function printWorkarounds() - { - $workarounds = new Workarounds(); - - if ($workarounds->isNotRequired()) { - return; - } - - echo 'Your PHP version requires some workaround:', PHP_EOL; - foreach ($workarounds->getRequiredWorkarounds() as $workaround) { - echo '- ', $workaround, PHP_EOL; - } - echo PHP_EOL; - } - - /** - * Outputs the base usage of PDepend. - * - * @return void - */ - protected function printUsage() - { - $this->printVersion(); - echo 'Usage: pdepend [options] [logger] <dir[,dir[,...]]>', PHP_EOL, PHP_EOL; - } - - /** - * Outputs the main help of PDepend. - * - * @return void - */ - protected function printHelp() - { - $this->printUsage(); - - $length = $this->printLogOptions(); - $length = $this->printAnalyzerOptions($length); - - $this->printOption( - '--configuration=<file>', - 'Optional PDepend configuration file.', - $length - ); - echo PHP_EOL; - - $this->printOption( - '--suffix=<ext[,...]>', - 'List of valid PHP file extensions.', - $length - ); - $this->printOption( - '--ignore=<dir[,...]>', - 'List of exclude directories.', - $length - ); - $this->printOption( - '--exclude=<pkg[,...]>', - 'List of exclude namespaces.', - $length - ); - echo PHP_EOL; - - $this->printOption( - '--without-annotations', - 'Do not parse doc comment annotations.', - $length - ); - echo PHP_EOL; - - $this->printOption('--quiet', 'Prints errors only.', $length); - $this->printOption('--debug', 'Prints debugging information.', $length); - $this->printOption('--help', 'Print this help text.', $length); - $this->printOption('--version', 'Print the current version.', $length); - - $this->printDbusOption($length); - - $this->printOption('-d key[=value]', 'Sets a php.ini value.', $length); - echo PHP_EOL; - } - - /** - * Prints all available log options and returns the length of the longest - * option. - * - * @return integer - */ - protected function printLogOptions() - { - $maxLength = 0; - $options = array(); - $logOptions = $this->application->getAvailableLoggerOptions(); - foreach ($logOptions as $option => $info) { - // Build log option identifier - $identifier = sprintf('%s=<%s>', $option, $info['value']); - // Store in options array - $options[$identifier] = $info['message']; - - $length = strlen($identifier); - if ($length > $maxLength) { - $maxLength = $length; - } - } - - ksort($options); - - $last = null; - foreach ($options as $option => $message) { - $current = substr($option, 0, strrpos($option, '-')); - if ($last !== null && $last !== $current) { - echo PHP_EOL; - } - $last = $current; - - $this->printOption($option, $message, $maxLength); - } - echo PHP_EOL; - - return $maxLength; - } - - /** - * Prints the analyzer options. - * - * @param integer $length Length of the longest option. - * - * @return integer - */ - protected function printAnalyzerOptions($length) - { - $options = $this->application->getAvailableAnalyzerOptions(); - - if (count($options) === 0) { - return $length; - } - - ksort($options); - - foreach ($options as $option => $info) { - if (isset($info['value'])) { - $option .= '=<' . $info['value'] . '>'; - } else { - $option .= '=<value>'; - } - - $this->printOption($option, $info['message'], $length); - } - echo PHP_EOL; - - return $length; - } - - /** - * Prints a single option. - * - * @param string $option The option identifier. - * @param string $message The option help message. - * @param integer $length The length of the longest option. - * - * @return void - */ - private function printOption($option, $message, $length) - { - // Ignore the phpunit xml option - if (0 === strpos($option, '--phpunit-xml=')) { - return; - } - - // Calculate the max message length - $mlength = 77 - $length; - - $option = str_pad($option, $length, ' ', STR_PAD_RIGHT); - echo ' ', $option, ' '; - - $lines = explode(PHP_EOL, wordwrap($message, $mlength, PHP_EOL)); - echo array_shift($lines); - - while (($line = array_shift($lines)) !== null) { - echo PHP_EOL, str_repeat(' ', $length + 3), $line; - } - echo PHP_EOL; - } - - /** - * Optionally outputs the dbus option when the required extension - * is loaded. - * - * @param integer $length Padding length for the option. - * - * @return void - */ - private function printDbusOption($length) - { - if (extension_loaded("dbus") === false) { - return; - } - - $option = '--notify-me'; - $message = 'Show a notification after analysis.'; - - $this->printOption($option, $message, $length); - } - - /** - * Main method that starts the command line runner. - * - * @return integer The exit code. - */ - public static function main() - { - $command = new Command(); - return $command->run(); - } - - /** - * @param integer $startTime - */ - private function printStatistics($startTime) - { - $duration = time() - $startTime; - $hours = intval($duration / 3600); - $minutes = intval(($duration - $hours * 3600) / 60); - $seconds = $duration % 60; - echo PHP_EOL, 'Time: ', sprintf('%d:%02d:%02d', $hours, $minutes, $seconds); - if (function_exists('memory_get_peak_usage')) { - $memory = (memory_get_peak_usage(true) / (1024 * 1024)); - printf('; Memory: %4.2fMb', $memory); - } - echo PHP_EOL; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/ResultPrinter.php b/vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/ResultPrinter.php deleted file mode 100644 index e719eb0..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/ResultPrinter.php +++ /dev/null @@ -1,231 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\TextUI; - -use PDepend\Metrics\Analyzer; -use PDepend\ProcessListener; -use PDepend\Source\AST\AbstractASTArtifact; -use PDepend\Source\ASTVisitor\AbstractASTVisitListener; -use PDepend\Source\Builder\Builder; -use PDepend\Source\Tokenizer\Tokenizer; - -/** - * Prints current the PDepend status information. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ResultPrinter extends AbstractASTVisitListener implements ProcessListener -{ - /** - * The step size. - */ - const STEP_SIZE = 20; - - /** - * Number of processed items. - * - * @var integer - */ - private $count = 0; - - /** - * Is called when PDepend starts the file parsing process. - * - * @param \PDepend\Source\Builder\Builder $builder - * @return void - */ - public function startParseProcess(Builder $builder) - { - $this->count = 0; - - echo "Parsing source files:\n"; - } - - /** - * Is called when PDepend has finished the file parsing process. - * - * @param \PDepend\Source\Builder\Builder $builder - * @return void - */ - public function endParseProcess(Builder $builder) - { - $this->finish(); - } - - /** - * Is called when PDepend starts parsing of a new file. - * - * @param \PDepend\Source\Tokenizer\Tokenizer $tokenizer - * @return void - */ - public function startFileParsing(Tokenizer $tokenizer) - { - $this->step(); - } - - /** - * Is called when PDepend has finished a file. - * - * @param \PDepend\Source\Tokenizer\Tokenizer $tokenizer - * @return void - */ - public function endFileParsing(Tokenizer $tokenizer) - { - } - - /** - * Is called when PDepend starts the analyzing process. - * - * @return void - */ - public function startAnalyzeProcess() - { - } - - /** - * Is called when PDepend has finished the analyzing process. - * - * @return void - */ - public function endAnalyzeProcess() - { - } - - /** - * Is called when PDepend starts the logging process. - * - * @return void - */ - public function startLogProcess() - { - echo "Generating pdepend log files, this may take a moment.\n"; - } - - /** - * Is called when PDepend has finished the logging process. - * - * @return void - */ - public function endLogProcess() - { - } - - /** - * Is called when PDepend starts a new analyzer. - * - * @param \PDepend\Metrics\Analyzer $analyzer - * @return void - */ - public function startAnalyzer(Analyzer $analyzer) - { - $this->count = 0; - - $parts = explode('\\', get_class($analyzer)); - - $name = preg_replace('(Analyzer$)', '', end($parts)); - $name = preg_replace('/([a-zA-Z])([a-z])(?=[A-Z])/', '$1$2 ', $name); - - echo "Calculating {$name} metrics:\n"; - } - - /** - * Is called when PDepend has finished one analyzing process. - * - * @param \PDepend\Metrics\Analyzer $analyzer - * @return void - */ - public function endAnalyzer(Analyzer $analyzer) - { - $this->finish(self::STEP_SIZE); - } - - /** - * Generic notification method that is called for every node start. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $node - * @return void - */ - public function startVisitNode(AbstractASTArtifact $node) - { - $this->step(self::STEP_SIZE); - } - - /** - * Prints a single dot for the current step. - * - * @param integer $size - * @return void - */ - protected function step($size = 1) - { - if ($this->count > 0 && $this->count % $size === 0) { - echo '.'; - } - if ($this->count > 0 && $this->count % ($size * 60) === 0) { - printf("% 6s\n", $this->count); - } - ++$this->count; - } - - /** - * Closes the current dot line. - * - * @param integer $size - * @return void - */ - protected function finish($size = 1) - { - $diff = ($this->count % ($size * 60)); - - if ($diff === 0) { - printf(".% 6s\n\n", $this->count); - } elseif ($size === 1) { - $indent = 66 - ceil($diff / $size); - printf(".% {$indent}s\n\n", $this->count); - } else { - $indent = 66 - ceil($diff / $size) + 1; - printf("% {$indent}s\n\n", $this->count); - } - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/Runner.php b/vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/Runner.php deleted file mode 100644 index c2a6f8e..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/TextUI/Runner.php +++ /dev/null @@ -1,347 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\TextUI; - -use PDepend\Engine; -use PDepend\Input\ExcludePathFilter; -use PDepend\Input\ExtensionFilter; -use PDepend\ProcessListener; -use PDepend\Report\ReportGeneratorFactory; -use PDepend\Source\AST\ASTArtifactList\PackageArtifactFilter; - -/** - * The command line runner starts a PDepend process. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Runner -{ - /** - * Marks the default success exit. - */ - const SUCCESS_EXIT = 0; - - /** - * Marks an internal exception exit. - */ - const EXCEPTION_EXIT = 2; - - /** - * List of allowed file extensions. Default file extensions are <b>php</b> - * and <p>php5</b>. - * - * @var array<string> - */ - private $extensions = array('php', 'php5'); - - /** - * List of exclude directories. Default exclude dirs are <b>.svn</b> and - * <b>CVS</b>. - * - * @var array<string> - */ - private $excludeDirectories = array('.git', '.svn', 'CVS'); - - /** - * List of exclude namespaces. - * - * @var array<string> - */ - private $excludeNamespaces = array(); - - /** - * List of source code directories and files. - * - * @var array<string> - */ - private $sourceArguments = array(); - - /** - * Should the parse ignore doc comment annotations? - * - * @var boolean - */ - private $withoutAnnotations = false; - - /** - * List of log identifiers and log files. - * - * @var array<string, string> - */ - private $loggerMap = array(); - - /** - * List of cli options for loggers or analyzers. - * - * @var array<string, mixed> - */ - private $options = array(); - - /** - * This of process listeners that will be hooked into PDepend's analyzing - * process. - * - * @var \PDepend\ProcessListener[] - */ - private $processListeners = array(); - - /** - * List of error messages for all parsing errors. - * - * @var array<string> - */ - private $parseErrors = array(); - - /** - * @var \PDepend\Report\ReportGeneratorFactory - */ - private $reportGeneratorFactory; - - /** - * @var \PDepend\Engine - */ - private $engine; - - public function __construct(ReportGeneratorFactory $reportGeneratorFactory, Engine $engine) - { - $this->reportGeneratorFactory = $reportGeneratorFactory; - $this->engine = $engine; - } - - /** - * Sets a list of allowed file extensions. - * - * NOTE: If you call this method, it will replace the default file extensions. - * - * @param array<string> $extensions - * @return void - */ - public function setFileExtensions(array $extensions) - { - $this->extensions = $extensions; - } - - /** - * Sets a list of exclude directories. - * - * NOTE: If this method is called, it will overwrite the default settings. - * - * @param array<string> $excludeDirectories - * @return void - */ - public function setExcludeDirectories(array $excludeDirectories) - { - $this->excludeDirectories = $excludeDirectories; - } - - /** - * Sets a list of exclude packages. - * - * @param array<string> $excludePackages - * @return void - */ - public function setExcludeNamespaces(array $excludePackages) - { - $this->excludeNamespaces = $excludePackages; - } - - /** - * Sets a list of source directories and files. - * - * @param array<string> $sourceArguments - * @return void - */ - public function setSourceArguments(array $sourceArguments) - { - $this->sourceArguments = $sourceArguments; - } - - /** - * Should the parser ignore doc comment annotations? - * - * @return void - */ - public function setWithoutAnnotations() - { - $this->withoutAnnotations = true; - } - - /** - * Adds a logger to this runner. - * - * @param string $generatorId - * @param string $reportFile - * @return void - */ - public function addReportGenerator($generatorId, $reportFile) - { - $this->loggerMap[$generatorId] = $reportFile; - } - - /** - * Adds a logger or analyzer option. - * - * @param string $identifier - * @param string|array $value - * @return void - */ - public function addOption($identifier, $value) - { - $this->options[$identifier] = $value; - } - - /** - * Adds a process listener instance that will be hooked into PDepend's - * analyzing process. - * - * @param \PDepend\ProcessListener $processListener - * @return void - */ - public function addProcessListener(ProcessListener $processListener) - { - $this->processListeners[] = $processListener; - } - - /** - * Starts the main PDepend process and returns <b>true</b> after a successful - * execution. - * - * @return integer - * @throws \RuntimeException An exception with a readable error message and - * an exit code. - */ - public function run() - { - $engine = $this->engine; - $engine->setOptions($this->options); - - if (count($this->extensions) > 0) { - $filter = new ExtensionFilter($this->extensions); - $engine->addFileFilter($filter); - } - - if (count($this->excludeDirectories) > 0) { - $exclude = $this->excludeDirectories; - $filter = new ExcludePathFilter($exclude); - $engine->addFileFilter($filter); - } - - if (count($this->excludeNamespaces) > 0) { - $exclude = $this->excludeNamespaces; - $filter = new PackageArtifactFilter($exclude); - $engine->setCodeFilter($filter); - } - - if ($this->withoutAnnotations === true) { - $engine->setWithoutAnnotations(); - } - - // Try to set all source directories. - try { - foreach ($this->sourceArguments as $sourceArgument) { - if (is_dir($sourceArgument)) { - $engine->addDirectory($sourceArgument); - } else { - $engine->addFile($sourceArgument); - } - } - } catch (\Exception $e) { - throw new \RuntimeException($e->getMessage(), self::EXCEPTION_EXIT); - } - - if (count($this->loggerMap) === 0) { - throw new \RuntimeException('No output specified.', self::EXCEPTION_EXIT); - } - - // To append all registered loggers. - try { - foreach ($this->loggerMap as $generatorId => $reportFile) { - // Create a new logger - $generator = $this->reportGeneratorFactory->createGenerator($generatorId, $reportFile); - - $engine->addReportGenerator($generator); - } - } catch (\Exception $e) { - throw new \RuntimeException($e->getMessage(), self::EXCEPTION_EXIT); - } - - foreach ($this->processListeners as $processListener) { - $engine->addProcessListener($processListener); - } - - try { - $engine->analyze(); - - foreach ($engine->getExceptions() as $exception) { - $this->parseErrors[] = $exception->getMessage(); - } - } catch (\Exception $e) { - throw new \RuntimeException($e->getMessage(), self::EXCEPTION_EXIT); - } - - return self::SUCCESS_EXIT; - } - - /** - * This method will return <b>true</b> when there were errors during the - * parse process. - * - * @return boolean - */ - public function hasParseErrors() - { - return (count($this->parseErrors) > 0); - } - - /** - * This method will return an <b>array</b> with error messages for all - * failures that happened during the parsing process. - * - * @return array<string> - */ - public function getParseErrors() - { - return $this->parseErrors; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/CacheDriver.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/CacheDriver.php deleted file mode 100644 index ea76432..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/CacheDriver.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Util\Cache; - -/** - * Base interface for a concrete cache driver. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -interface CacheDriver -{ - /** - * The current cache version. - */ - const VERSION = '@version:a31e9e344aac643e20751f6d915114eb:@'; - - /** - * Sets the type for the next <em>store()</em> or <em>restore()</em> method - * call. A type is something like a namespace or group for cache entries. - * - * Note that the cache type will be reset after each storage method call, so - * you must invoke right before every call to <em>restore()</em> or - * <em>store()</em>. - * - * @param string $type - * @return \PDepend\Util\Cache\CacheDriver - */ - public function type($type); - - /** - * This method will store the given <em>$data</em> under <em>$key</em>. This - * method can be called with a third parameter that will be used as a - * verification token, when the a cache entry gets restored. If the stored - * hash and the supplied hash are not identical, that cache entry will be - * removed and not returned. - * - * @param string $key The cache key for the given data. - * @param mixed $data Any data that should be cached. - * @param string $hash Optional hash that will be used for verification. - * @return void - */ - public function store($key, $data, $hash = null); - - /** - * This method tries to restore an existing cache entry for the given - * <em>$key</em>. If a matching entry exists, this method verifies that the - * given <em>$hash</em> and the the value stored with cache entry are equal. - * Then it returns the cached entry. Otherwise this method will return - * <b>NULL</b>. - * - * @param string $key The cache key for the given data. - * @param string $hash Optional hash that will be used for verification. - * @return mixed - */ - public function restore($key, $hash = null); - - /** - * This method will remove an existing cache entry for the given identifier. - * It will delete all cache entries where the cache key start with the given - * <b>$pattern</b>. If no matching entry exists, this method simply does - * nothing. - * - * @param string $pattern The cache key pattern. - * @return void - */ - public function remove($pattern); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/CacheFactory.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/CacheFactory.php deleted file mode 100644 index 1c19197..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/CacheFactory.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Util\Cache; - -use PDepend\Util\Cache\Driver\FileCacheDriver; -use PDepend\Util\Cache\Driver\MemoryCacheDriver; -use PDepend\Util\Configuration; - -/** - * Factory that encapsulates the creation of a concrete cache instance. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -class CacheFactory -{ - - const DEFAULT_TTL = 2592000; //30 days - - /** - * The system configuration. - * - * @var \PDepend\Util\Configuration - */ - protected $configuration = null; - - /** - * Singleton property that holds existing cache instances. - * - * @var \PDepend\Util\Cache\CacheDriver[] - */ - protected $caches = array(); - - /** - * Constructs a new cache factory instance for the given configuration. - * - * @param \PDepend\Util\Configuration $configuration The system configuration. - */ - public function __construct(Configuration $configuration) - { - $this->configuration = $configuration; - } - - /** - * Creates a new instance or returns an existing cache for the given cache - * identifier. - * - * @param string $cacheKey The name/identifier for the cache instance. - * - * @return \PDepend\Util\Cache\CacheDriver - */ - public function create($cacheKey = null) - { - if (false === isset($this->caches[$cacheKey])) { - $this->caches[$cacheKey] = $this->createCache($cacheKey); - } - return $this->caches[$cacheKey]; - } - - /** - * Creates a cache instance based on the supplied configuration. - * - * @param string|null $cacheKey The name/identifier for the cache instance. - * @return \PDepend\Util\Cache\CacheDriver - * @throws \InvalidArgumentException If the configured cache driver is unknown. - */ - protected function createCache($cacheKey = null) - { - switch ($this->configuration->cache->driver) { - case 'file': - return $this->createFileCache( - $this->configuration->cache->location, - $this->configuration->cache->ttl, - $cacheKey - ); - case 'memory': - return $this->createMemoryCache(); - } - throw new \InvalidArgumentException( - "Unknown cache driver '{$this->configuration->cache->driver}' given." - ); - } - - /** - * Creates a new file system based cache instance. - * - * @param string $location Cache root directory. - * @param int $ttl Cache ttl - * @param string|null $cacheKey The name/identifier for the cache instance. - * @return \PDepend\Util\Cache\Driver\FileCacheDriver - */ - protected function createFileCache($location, $ttl = self::DEFAULT_TTL, $cacheKey = null) - { - return new FileCacheDriver($location, $ttl, $cacheKey); - } - - /** - * Creates an in memory cache instance. - * - * @return \PDepend\Util\Cache\Driver\MemoryCacheDriver - */ - protected function createMemoryCache() - { - return new MemoryCacheDriver(); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/File/FileCacheDirectory.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/File/FileCacheDirectory.php deleted file mode 100644 index 1658015..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/File/FileCacheDirectory.php +++ /dev/null @@ -1,226 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Util\Cache\Driver\File; - -use PDepend\Util\Cache\CacheDriver; - -/** - * Directory helper for the file system based cache implementation. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -class FileCacheDirectory -{ - /** - * The current cache version/hash number. - */ - const VERSION = CacheDriver::VERSION; - - /** - * The cache root directory. - * - * @var string - */ - protected $cacheDir = null; - - /** - * Constructs a new cache directory helper instance. - * - * @param string $cacheDir The cache root directory. - */ - public function __construct($cacheDir) - { - $this->cacheDir = $this->ensureExists($cacheDir); - - if (false === $this->isValidVersion()) { - $this->flush(); - } - } - - /** - * Creates a cache directory for the given cache entry key and returns the - * full qualified path for that cache directory. - * - * @param string $key The cache for an entry. - * @return string - */ - public function createCacheDirectory($key) - { - return $this->createOrReturnCacheDirectory($key); - } - - /** - * Returns the full qualified path for an existing cache directory or - * creates a new cache directory for the given cache entry key and returns - * the full qualified path for that cache directory. - * - * @param string $key The cache for an entry. - * @return string - */ - protected function createOrReturnCacheDirectory($key) - { - $path = $this->getCacheDir() . '/' . substr($key, 0, 2); - if (false === file_exists($path)) { - @mkdir($path, 0775, true); - } - return $path; - } - - /** - * Ensures that the given <b>$cacheDir</b> really exists. - * - * @param string $cacheDir The cache root directory. - * @return string - */ - protected function ensureExists($cacheDir) - { - if (false === file_exists($cacheDir)) { - @mkdir($cacheDir, 0775, true); - } - return $cacheDir; - } - - /** - * Tests if the current software cache version is similar to the stored - * file system cache version. - * - * @return boolean - */ - protected function isValidVersion() - { - return (self::VERSION === $this->readVersion()); - } - - /** - * Reads the stored cache version number from the cache root directory. - * - * @return string|null - */ - protected function readVersion() - { - if (file_exists($this->getVersionFile())) { - return trim(file_get_contents($this->getVersionFile())); - } - return null; - } - - /** - * Writes the current software cache version into a file in the cache root - * directory. - * - * @return void - */ - protected function writeVersion() - { - file_put_contents($this->getVersionFile(), self::VERSION, LOCK_EX); - } - - /** - * Returns the file name for the used version file. - * - * @return string - */ - protected function getVersionFile() - { - return $this->getCacheDir() . '/_version'; - } - - /** - * Returns the cache root directory. - * - * @return string - */ - protected function getCacheDir() - { - return $this->cacheDir; - } - - /** - * Flushes all contents below the configured cache root directory and writes - * a version file with the current software version. - * - * @return void - */ - protected function flush() - { - $this->flushDirectory($this->getCacheDir()); - $this->writeVersion(); - } - - /** - * Deletes all files and directories below the given <b>$cacheDir</b>. - * - * @param string $cacheDir A cache directory. - * - * @return void - */ - protected function flushDirectory($cacheDir) - { - foreach (new \DirectoryIterator($cacheDir) as $child) { - $this->flushEntry($child); - } - } - - /** - * Flushes the cache record for the given file info instance, independent if - * it is a file, directory or symlink. - * - * @param \SplFileInfo $file - * @return void - */ - protected function flushEntry(\SplFileInfo $file) - { - $path = $file->getRealPath(); - if ($file->isDot()) { - return; - } elseif ($file->isFile()) { - @unlink($path); - } else { - $this->flushDirectory($path); - @rmdir($path); - } - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/File/FileCacheGarbageCollector.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/File/FileCacheGarbageCollector.php deleted file mode 100644 index 164da4f..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/File/FileCacheGarbageCollector.php +++ /dev/null @@ -1,146 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util\Cache\Driver\File; - -use PDepend\Util\Log; - -/** - * Simple garbage collector for PDepend's file cache. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class FileCacheGarbageCollector -{ - const DEFAULT_TTL = 2592000; //30 days - - /** - * @var string - */ - private $cacheDir; - - /** - * @var integer - */ - private $expirationTimestamp; - - /** - * @param string $cacheDir - * @param integer $ttl - */ - public function __construct($cacheDir, $ttl = self::DEFAULT_TTL) - { - $this->cacheDir = $cacheDir; - $this->expirationTimestamp = time() - $ttl; - } - - /** - * Removes all outdated cache files and returns the number of garbage - * collected files. - * - * @return integer - */ - public function garbageCollect() - { - if (false === file_exists($this->cacheDir)) { - return 0; - } - - $count = 0; - - try { - $files = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator($this->cacheDir) - ); - foreach ($files as $file) { - if ($this->isCollectibleFile($file)) { - $this->garbageCollectFile($file); - $count += 1; - } - } - - return $count; - } catch (\UnexpectedValueException $e) { - /* This may happen if PHPMD and PDepend run in parallel */ - return $count; - } - } - - /** - * Checks if the given file can be removed. - * - * @param \SplFileInfo $file - * @return boolean - */ - private function isCollectibleFile(\SplFileInfo $file) - { - if (false === $file->isFile()) { - return false; - } - - $time = $file->getATime(); - if ($time > $this->expirationTimestamp) { - return false; - } - - $time = $file->getMTime(); - if ($time > $this->expirationTimestamp) { - return false; - } - - return true; - } - - /** - * Removes the given cache file. - * - * @param \SplFileInfo $file - * @return void - */ - private function garbageCollectFile(\SplFileInfo $file) - { - Log::debug("Removing file '{$file->getPathname()}' from cache."); - - @unlink($file->getPathname()); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/FileCacheDriver.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/FileCacheDriver.php deleted file mode 100644 index 0fab8ce..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/FileCacheDriver.php +++ /dev/null @@ -1,298 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Util\Cache\Driver; - -use PDepend\Util\Cache\CacheDriver; -use PDepend\Util\Cache\Driver\File\FileCacheDirectory; -use PDepend\Util\Cache\Driver\File\FileCacheGarbageCollector; - -/** - * A file system based cache implementation. - * - * This class implements the {@link \PDepend\Util\Cache\CacheDriver} interface - * based on the local file system. It creates a special directory structure and - * stores all cache entries in files under this directory structure. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -class FileCacheDriver implements CacheDriver -{ - - const DEFAULT_TTL = 2592000; //30 days - - /** - * Default cache entry type. - */ - const ENTRY_TYPE = 'cache'; - - /** - * The cache directory handler - * - * @var FileCacheDirectory - */ - protected $directory; - - /** - * The current cache entry type. - * - * @var string - */ - protected $type = self::ENTRY_TYPE; - - /** - * Major and minor version of the currently used PHP. - * - * @var string - */ - protected $version; - - /** - * Unique key for this cache instance. - * - * @var string - * @since 1.0.0 - */ - private $cacheKey; - - /** - * This method constructs a new file cache instance for the given root - * directory. - * - * @param string $root The cache root directory. - * @param int $ttl The cache TTL. - * @param string|null $cacheKey Unique key for this cache instance. - */ - public function __construct($root, $ttl = self::DEFAULT_TTL, $cacheKey = null) - { - $this->directory = new FileCacheDirectory($root); - $this->version = preg_replace('(^(\d+\.\d+).*)', '\\1', phpversion()); - - $this->cacheKey = $cacheKey; - - $this->garbageCollect($root, $ttl); - } - - /** - * Sets the type for the next <em>store()</em> or <em>restore()</em> method - * call. A type is something like a namespace or group for cache entries. - * - * Note that the cache type will be reset after each storage method call, so - * you must invoke right before every call to <em>restore()</em> or - * <em>store()</em>. - * - * @param string $type The name or object type for the next storage method call. - * @return \PDepend\Util\Cache\CacheDriver - */ - public function type($type) - { - $this->type = $type; - return $this; - } - - /** - * This method will store the given <em>$data</em> under <em>$key</em>. This - * method can be called with a third parameter that will be used as a - * verification token, when the a cache entry gets restored. If the stored - * hash and the supplied hash are not identical, that cache entry will be - * removed and not returned. - * - * @param string $key The cache key for the given data. - * @param mixed $data Any data that should be cached. - * @param string $hash Optional hash that will be used for verification. - * @return void - */ - public function store($key, $data, $hash = null) - { - $file = $this->getCacheFile($key); - $this->write($file, serialize(array('hash' => $hash, 'data' => $data))); - } - - /** - * This method writes the given <em>$data</em> into <em>$file</em>. - * - * @param string $file The cache file name. - * @param string $data Serialized cache data. - * @return void - */ - protected function write($file, $data) - { - $handle = fopen($file, 'wb'); - flock($handle, LOCK_EX); - fwrite($handle, $data); - flock($handle, LOCK_UN); - fclose($handle); - } - - /** - * This method tries to restore an existing cache entry for the given - * <em>$key</em>. If a matching entry exists, this method verifies that the - * given <em>$hash</em> and the the value stored with cache entry are equal. - * Then it returns the cached entry. Otherwise this method will return - * <b>NULL</b>. - * - * @param string $key The cache key for the given data. - * @param string $hash Optional hash that will be used for verification. - * @return mixed - */ - public function restore($key, $hash = null) - { - $file = $this->getCacheFile($key); - if (file_exists($file)) { - return $this->restoreFile($file, $hash); - } - return null; - } - - /** - * This method restores a cache entry, when the given <em>$hash</em> is equal - * to stored hash value. If both hashes are equal this method returns the - * cached entry. Otherwise this method returns <b>NULL</b>. - * - * @param string $file The cache file name. - * @param string $hash The verification hash. - * @return mixed - */ - protected function restoreFile($file, $hash) - { - // unserialize() throws E_NOTICE when data is corrupt - $data = @unserialize($this->read($file)); - if ($data !== false && $data['hash'] === $hash) { - return $data['data']; - } - return null; - } - - /** - * This method reads the raw data from the given <em>$file</em>. - * - * @param string $file The cache file name. - * @return string - */ - protected function read($file) - { - $handle = fopen($file, 'rb'); - flock($handle, LOCK_EX); - - $data = fread($handle, filesize($file)); - - flock($handle, LOCK_UN); - fclose($handle); - - return $data; - } - - /** - * This method will remove an existing cache entry for the given identifier. - * It will delete all cache entries where the cache key start with the given - * <b>$pattern</b>. If no matching entry exists, this method simply does - * nothing. - * - * @param string $pattern The cache key pattern. - * @return void - */ - public function remove($pattern) - { - $file = $this->getCacheFileWithoutExtension($pattern); - $glob = glob("{$file}*.*"); - // avoid error if we dont find files - if ($glob !== false) { - foreach (glob("{$file}*.*") as $f) { - @unlink($f); - } - } - } - - /** - * This method creates the full qualified file name for a cache entry. This - * file name is a combination of the given <em>$key</em>, the cache root - * directory and the current entry type. - * - * @param string $key The cache key for the given data. - * @return string - */ - protected function getCacheFile($key) - { - $cacheFile = $this->getCacheFileWithoutExtension($key) . - '.' . $this->version . - '.' . $this->type; - - $this->type = self::ENTRY_TYPE; - - return $cacheFile; - } - - /** - * This method creates the full qualified file name for a cache entry. This - * file name is a combination of the given <em>$key</em>, the cache root - * directory and the current entry type, but without the used cache file - * extension. - * - * @param string $key The cache key for the given data. - * @return string - */ - protected function getCacheFileWithoutExtension($key) - { - if (is_string($this->cacheKey)) { - $key = md5($key . $this->cacheKey); - } - - $path = $this->directory->createCacheDirectory($key); - return "{$path}/{$key}"; - } - - /** - * Cleans old cache files. - * - * @param string $root - * @param int $ttl - * @return void - */ - protected function garbageCollect($root, $ttl) - { - $garbageCollector = new FileCacheGarbageCollector($root, $ttl); - $garbageCollector->garbageCollect(); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/MemoryCacheDriver.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/MemoryCacheDriver.php deleted file mode 100644 index 439705c..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/Driver/MemoryCacheDriver.php +++ /dev/null @@ -1,213 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ - -namespace PDepend\Util\Cache\Driver; - -use PDepend\Util\Cache\CacheDriver; - -/** - * A memory based cache implementation. - * - * This class implements the {@link \PDepend\Util\Cache\CacheDriver} interface based - * on an in memory data structure. This means that all cached entries will get - * lost when the php process exits. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.10.0 - */ -class MemoryCacheDriver implements CacheDriver -{ - /** - * Default cache entry type. - */ - const ENTRY_TYPE = 'cache'; - - /** - * The in memory cache. - * - * @var array<string, array> - */ - protected $cache = array(); - - /** - * Current cache entry type. - * - * @var string - */ - protected $type = self::ENTRY_TYPE; - - /** - * Unique identifier within the same cache instance. - * - * @var string - */ - protected $staticId = null; - - /** - * Global stack, mainly used during testing. - * - * @var array<string, array<string, array<integer, mixed>>> - */ - protected static $staticCache = array(); - - /** - * Instantiates a new in memory cache instance. - */ - public function __construct() - { - $this->staticId = sha1(uniqid(rand(0, PHP_INT_MAX))); - } - - /** - * Sets the type for the next <em>store()</em> or <em>restore()</em> method - * call. A type is something like a namespace or group for cache entries. - * - * Note that the cache type will be reset after each storage method call, so - * you must invoke right before every call to <em>restore()</em> or - * <em>store()</em>. - * - * @param string $type The name or object type for the next storage method call. - * @return \PDepend\Util\Cache\CacheDriver - */ - public function type($type) - { - $this->type = $type; - return $this; - } - - /** - * This method will store the given <em>$data</em> under <em>$key</em>. This - * method can be called with a third parameter that will be used as a - * verification token, when the a cache entry gets restored. If the stored - * hash and the supplied hash are not identical, that cache entry will be - * removed and not returned. - * - * @param string $key The cache key for the given data. - * @param mixed $data Any data that should be cached. - * @param string $hash Optional hash that will be used for verification. - * @return void - */ - public function store($key, $data, $hash = null) - { - $this->cache[$this->getCacheKey($key)] = array($hash, $data); - } - - /** - * This method tries to restore an existing cache entry for the given - * <em>$key</em>. If a matching entry exists, this method verifies that the - * given <em>$hash</em> and the the value stored with cache entry are equal. - * Then it returns the cached entry. Otherwise this method will return - * <b>NULL</b>. - * - * @param string $key The cache key for the given data. - * @param string $hash Optional hash that will be used for verification. - * @return mixed - */ - public function restore($key, $hash = null) - { - $cacheKey = $this->getCacheKey($key); - if (isset($this->cache[$cacheKey]) && $this->cache[$cacheKey][0] === $hash) { - return $this->cache[$cacheKey][1]; - } - return null; - } - - /** - * This method will remove an existing cache entry for the given identifier. - * It will delete all cache entries where the cache key start with the given - * <b>$pattern</b>. If no matching entry exists, this method simply does - * nothing. - * - * @param string $pattern The cache key pattern. - * @return void - */ - public function remove($pattern) - { - foreach (array_keys($this->cache) as $key) { - if (0 === strpos($key, $pattern)) { - unset($this->cache[$key]); - } - } - } - - /** - * Creates a prepared cache entry identifier, based on the given <em>$key</em> - * and the <em>$type</em> property. Note that this method resets the cache - * type, so that it is only valid for a single call. - * - * @param string $key The concrete object key. - * @return string - */ - protected function getCacheKey($key) - { - $type = $this->type; - $this->type = self::ENTRY_TYPE; - - return "{$key}.{$type}"; - } - - /** - * PHP's magic serialize sleep method. - * - * @return array - * @since 1.0.2 - */ - public function __sleep() - { - self::$staticCache[$this->staticId] = $this->cache; - - return array('staticId'); - } - - /** - * PHP's magic serialize wakeup method. - * - * @return void - * @since 1.0.2 - */ - public function __wakeup() - { - $this->cache = self::$staticCache[$this->staticId]; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Configuration.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Configuration.php deleted file mode 100644 index 0e1b082..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Configuration.php +++ /dev/null @@ -1,128 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util; - -/** - * Simple container class that holds settings for PDepend and all its sub - * systems. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Configuration -{ - /** - * Simple object tree holding the concrete configuration values. - * - * @var \stdClass - * @since 0.10.0 - */ - protected $settings = null; - - /** - * Constructs a new configuration instance with the given settings tree. - * - * @param \stdClass $settings The concrete configuration values. - * @since 0.10.0 - */ - public function __construct(\stdClass $settings) - { - $this->settings = $settings; - } - - /** - * Magic get method that is called by PHP's runtime engine whenever an - * undeclared object property is accessed through a read operation. This - * implementation of the magic get method checks if a configuration value - * for the given <b>$name</b> exists and returns the configuration value if - * a matching entry exists. Otherwise this method will throw an exception. - * - * @param string $name Name of the requested configuration value. - * @return mixed - * @throws \OutOfRangeException If no matching configuration value exists. - * @since 0.10.0 - */ - public function __get($name) - { - if (isset($this->settings->{$name})) { - return $this->settings->{$name}; - } - throw new \OutOfRangeException( - sprintf("A configuration option '%s' not exists.", $name) - ); - } - - /** - * Magic setter method that will be called by PHP's runtime engine when a - * write operation is performed on an undeclared object property. This - * implementation of the magic set method always throws an exception, because - * configuration settings are immutable. - * - * @param string $name Name of the write property. - * @param mixed $value The new property value. - * @return void - * @throws \OutOfRangeException Whenever this method is called. - * @since 0.10.0 - */ - public function __set($name, $value) - { - throw new \OutOfRangeException( - sprintf("A configuration option '%s' not exists.", $name) - ); - } - - /** - * Magic isset method that will be called by PHP's runtime engine when the - * <em>isset()</em> operator is called on an undefined object property. This - * implementation of the magic isset method tests if a configuration value - * for the given <b>$name</b> exists. - * - * @param string $name Name of the requested property. - * @return boolean - * @since 0.10.0 - */ - public function __isset($name) - { - return isset($this->settings->{$name}); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/ConfigurationInstance.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/ConfigurationInstance.php deleted file mode 100644 index b73403a..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/ConfigurationInstance.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util; - -/** - * Registry class for the PDepend configuration class. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ConfigurationInstance -{ - /** - * The unique configuration instance. - * - * @var \PDepend\Util\Configuration|null - */ - private static $configuration = null; - - /** - * Returns a configured config instance or <b>null</b>. - * - * @return \PDepend\Util\Configuration|null - */ - public static function get() - { - return self::$configuration; - } - - /** - * Sets the configuration instance. - * - * @param \PDepend\Util\Configuration $configuration The config instance. - * @return void - */ - public static function set(Configuration $configuration = null) - { - self::$configuration = $configuration; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/CloverReport.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/CloverReport.php deleted file mode 100644 index e6a9788..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/CloverReport.php +++ /dev/null @@ -1,151 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util\Coverage; - -use PDepend\Source\AST\AbstractASTArtifact; - -/** - * Coverage report implementation for clover formatted xml files. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class CloverReport implements Report -{ - /** - * Holds the line coverage for all files found in the coverage report. - * - * @var array<string, array> - */ - private $fileLineCoverage = array(); - - /** - * Constructs a new clover report instance. - * - * @param \SimpleXMLElement $sxml The context simple xml element. - */ - public function __construct(\SimpleXMLElement $sxml) - { - $this->readProjectCoverage($sxml->project); - } - - /** - * Reads the coverage information for a project. - * - * @param \SimpleXMLElement $sxml Element representing the clover project tag. - * @return void - */ - private function readProjectCoverage(\SimpleXMLElement $sxml) - { - $this->readFileCoverage($sxml); - foreach ($sxml->package as $package) { - $this->readFileCoverage($package); - } - } - - /** - * Reads the coverage information for all file elements under the given - * parent. - * - * @param \SimpleXMLElement $sxml Element representing a file parent element. - * @return void - */ - private function readFileCoverage(\SimpleXMLElement $sxml) - { - foreach ($sxml->file as $file) { - $lines = array(); - foreach ($file->line as $line) { - $lines[(int) $line['num']] = (0 < (int) $line['count']); - } - $this->fileLineCoverage[(string) $file['name']] = $lines; - } - } - - /** - * Returns the percentage code coverage for the given item instance. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $artifact - * @return float - */ - public function getCoverage(AbstractASTArtifact $artifact) - { - $lines = $this->getLines($artifact->getCompilationUnit()->getFileName()); - - $startLine = $artifact->getStartLine(); - $endLine = $artifact->getEndLine(); - - $executable = 0; - $executed = 0; - for ($i = $startLine; $i <= $endLine; ++$i) { - if (!isset($lines[$i])) { - continue; - } - ++$executable; - if ($lines[$i]) { - ++$executed; - } - } - - if (0 === $executed && 1 === $executable && 0 < ($endLine - $startLine)) { - return 100; - } - if ($executed === 0) { - return 0; - } - return (($executed / $executable) * 100); - } - - /** - * Returns the lines of the covered file. - * - * @param string $fileName The source file name. - * @return array<boolean> - */ - private function getLines($fileName) - { - if (isset($this->fileLineCoverage[$fileName])) { - return $this->fileLineCoverage[$fileName]; - } - return array(); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/Factory.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/Factory.php deleted file mode 100644 index b47f1cf..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/Factory.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util\Coverage; - -/** - * Factory used to abstract concrete coverage report formats from the pdepend - * application. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Factory -{ - /** - * Factory method that tries to create coverage report instance for a given - * path name. - * - * @param string $pathName Qualified path name of a coverage report file. - * @return \PDepend\Util\Coverage\CloverReport - * @throws \RuntimeException When the given path name does not point to a - * valid coverage file or onto an unsupported coverage format. - */ - public function create($pathName) - { - $sxml = $this->loadXml($pathName); - if ($sxml->project) { - return new CloverReport($sxml); - } - throw new \RuntimeException('Unsupported coverage report format.'); - } - - /** - * Creates a simple xml instance for the xml contents that are located under - * the given path name. - * - * @param string $pathName Qualified path name of a coverage report file. - * @return \SimpleXMLElement - * @throws \RuntimeException When the given path name does not point to a - * valid xml file. - */ - private function loadXml($pathName) - { - $mode = libxml_use_internal_errors(true); - $sxml = simplexml_load_file($pathName); - libxml_use_internal_errors($mode); - - if ($sxml === false) { - $xmlError = libxml_get_last_error(); - throw new \RuntimeException($xmlError ? trim($xmlError->message) : 'Unknown error'); - } - return $sxml; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/Report.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/Report.php deleted file mode 100644 index bc44b99..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Coverage/Report.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util\Coverage; - -use PDepend\Source\AST\AbstractASTArtifact; - -/** - * Base interface representing a coverage report. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -interface Report -{ - /** - * Returns the percentage code coverage for the given item instance. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $artifact - * @return float - */ - public function getCoverage(AbstractASTArtifact $artifact); -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/FileUtil.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/FileUtil.php deleted file mode 100644 index 8966af4..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/FileUtil.php +++ /dev/null @@ -1,98 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util; - -/** - * This is a utility class for some file operations. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -final class FileUtil -{ - /** - * Returns the home directory of the current user if it exists. Otherwise - * this method will return the system temp directory. - * - * @return string - * @since 0.10.0 - */ - public static function getUserHomeDirOrSysTempDir() - { - $home = self::getUserHomeDir(); - - if (file_exists($home) && is_writable($home)) { - return $home; - } - - return self::getSysTempDir(); - } - - /** - * Returns the system temp directory. - * - * @return string - */ - public static function getSysTempDir() - { - return sys_get_temp_dir(); - } - - /** - * Returns the home directory of the current user. - * - * @return string - * @since 0.10.0 - */ - public static function getUserHomeDir() - { - $userHomeDir = getenv('HOME'); - - if (!$userHomeDir) { - // The HOME environment isn't always set on Windows, then we do a fallback to the HOMEDRIVE and HOMEPATH - $userHomeDir = getenv('HOMEDRIVE') . getenv('HOMEPATH'); - } - - return $userHomeDir; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/IdBuilder.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/IdBuilder.php deleted file mode 100644 index 1b05c14..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/IdBuilder.php +++ /dev/null @@ -1,168 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ - -namespace PDepend\Util; - -use PDepend\Source\AST\AbstractASTArtifact; -use PDepend\Source\AST\AbstractASTType; -use PDepend\Source\AST\ASTCompilationUnit; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTMethod; - -/** - * This class provides methods to generate unique, but reproducable identifiers - * for nodes generated during the parsing process. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 0.9.12 - */ -class IdBuilder -{ - /** - * @var array<array> - * - * @deprecated 3.0.0 This property will no longer be accessible on the public access level in next major version. - */ - public $offsetInFile = array(); - - /** - * Generates an identifier for the given file instance. - * - * @param \PDepend\Source\AST\ASTCompilationUnit $compilationUnit - * @return string - */ - public function forFile(ASTCompilationUnit $compilationUnit) - { - return $this->hash($compilationUnit->getFileName()); - } - - /** - * Generates an identifier for the given function instance. - * - * @param \PDepend\Source\AST\ASTFunction $function - * @return string - */ - public function forFunction(ASTFunction $function) - { - return $this->forOffsetItem($function, 'function'); - } - - /** - * Generates an identifier for the given class, interface or trait instance. - * - * @param \PDepend\Source\AST\AbstractASTType $type - * @return string - */ - public function forClassOrInterface(AbstractASTType $type) - { - return $this->forOffsetItem( - $type, - ltrim(strrchr(strtolower(get_class($type)), '_'), '_') - ); - } - - /** - * Generates an identifier for the given source item. - * - * @param \PDepend\Source\AST\AbstractASTArtifact $artifact - * @param string $prefix The item type identifier. - * @return string - */ - protected function forOffsetItem(AbstractASTArtifact $artifact, $prefix) - { - $fileHash = $artifact->getCompilationUnit()->getId(); - $itemHash = $this->hash($prefix . ':' . strtolower($artifact->getName())); - - $offset = $this->getOffsetInFile($fileHash, $itemHash); - - return sprintf('%s-%s-%s', $fileHash, $itemHash, $offset); - } - - /** - * Generates an identifier for the given method instance. - * - * @param \PDepend\Source\AST\ASTMethod $method - * @return string - */ - public function forMethod(ASTMethod $method) - { - return sprintf( - '%s-%s', - $method->getParent()->getId(), - $this->hash(strtolower($method->getName())) - ); - } - - /** - * Creates a base 36 hash for the given string. - * - * @param string $string The raw input identifier/string. - * @return string - */ - protected function hash($string) - { - return substr(base_convert(md5($string), 16, 36), 0, 11); - } - - /** - * Returns the node offset/occurence of the given <b>$string</b> within a - * file. - * - * @param string $file The file identifier. - * @param string $string The node identifier. - * @return string - */ - protected function getOffsetInFile($file, $string) - { - if (isset($this->offsetInFile[$file][$string])) { - $this->offsetInFile[$file][$string]++; - } else { - $this->offsetInFile[$file][$string] = 0; - } - return sprintf( - '%02s', - base_convert($this->offsetInFile[$file][$string], 10, 36) - ); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/ImageConvert.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/ImageConvert.php deleted file mode 100644 index 8ef6c29..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/ImageConvert.php +++ /dev/null @@ -1,180 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util; - -/** - * Simple utility class that is used to create different image formats. This - * class can use the ImageMagick cli tool <b>convert</b> and the pecl extension - * <b>pecl/imagick</b>. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class ImageConvert -{ - /** - * Tries to converts the <b>$input</b> image into the <b>$output</b> format. - * - * @param string $input The input file. - * @param string $output The output file. - * @return void - */ - public static function convert($input, $output) - { - $inputType = strtolower(pathinfo($input, PATHINFO_EXTENSION)); - $outputType = strtolower(pathinfo($output, PATHINFO_EXTENSION)); - - // Check for output file without extension and reuse input type - if ($outputType === '') { - $outputType = $inputType; - $output .= ".{$outputType}"; - } - - if ($inputType === 'svg') { - self::prepareSvg($input); - } - - if ($inputType === $outputType) { - file_put_contents($output, file_get_contents($input)); - } elseif (extension_loaded('imagick') === true) { - $imagick = new \Imagick($input); - $imagick->setImageFormat($outputType); - $imagick->writeImage($output); - - // The following code is not testable when imagick is installed - // @codeCoverageIgnoreStart - } elseif (self::hasImagickConvert() === true) { - $input = escapeshellarg($input); - $output = escapeshellarg($output); - - system("convert {$input} {$output}"); - } else { - $fallback = substr($output, 0, -strlen($outputType)) . $inputType; - - echo "WARNING: Cannot generate image of type '{$outputType}'. This", - " feature needs either the\n pecl/imagick extension or", - " the ImageMagick cli tool 'convert'.\n\n", - "Writing alternative image:\n{$fallback}\n\n"; - - file_put_contents($fallback, file_get_contents($input)); - } - // @codeCoverageIgnoreEnd - } - - /** - * Tests that the ImageMagick CLI tool <b>convert</b> exists. - * - * @return boolean - */ - protected static function hasImagickConvert() - { - // @codeCoverageIgnoreStart - $desc = array( - 0 => array('pipe', 'r'), - 1 => array('pipe', 'w'), - 2 => array('pipe', 'a'), - ); - - $proc = proc_open('convert', $desc, $pipes); - if (is_resource($proc)) { - fwrite($pipes[0], '-version'); - fclose($pipes[0]); - - return (0 === proc_close($proc)); - } - return false; - // @codeCoverageIgnoreEnd - } - - /** - * Utility method for svg input files. - * - * If the input file has the mime type svg and a configuration file with - * imageConvert options exists, this method will prepare the input image - * file. - * - * @param string $input The input svg file. - * @return void - */ - protected static function prepareSvg($input) - { - // Check for a configuration instance - if (($config = ConfigurationInstance::get()) === null) { - return; - } - - $svg = file_get_contents($input); - - // Check for font family - if (isset($config->imageConvert->fontFamily)) { - // Get font family - $fontFamily = (string) $config->imageConvert->fontFamily; - // Replace CSS separators - $fontReplace = 'font-family:' . strtr($fontFamily, ';:', ' '); - $fontPattern = '/font-family:\s*Arial/'; - - $svg = preg_replace($fontPattern, $fontReplace, $svg); - } - - // Check for font size - if (isset($config->imageConvert->fontSize)) { - // Get font size - $fontSize = abs((float) $config->imageConvert->fontSize); - - // Fetch all font-size expressions - preg_match_all('/font-size:\s*(\d+)/', $svg, $fontSizes); - $fontSizes = array_unique($fontSizes[1]); - - $resize = ($fontSize - max($fontSizes)); - foreach ($fontSizes as $fontSize) { - // Calculate resize value - $fontReplace = 'font-size:' . ($fontSize + $resize); - $fontPattern = "/font-size:\s*{$fontSize}/"; - - $svg = preg_replace($fontPattern, $fontReplace, $svg); - } - } - - file_put_contents($input, $svg); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Log.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Log.php deleted file mode 100644 index 1f0a156..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Log.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util; - -/** - * Simple logging class for debug messages and extended information. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -final class Log -{ - /** - * Log debug messages. - */ - const DEBUG = 1; - - /** - * The log output stream, defaults for the moment to stderr. - * - * @var resource - */ - private static $stream = STDERR; - - /** - * Are debugging messages activated? - * - * @var boolean - */ - private static $debug = false; - - /** - * Sets the log severity levels, this can be an OR combined list of valid - * severities. - * - * @param integer $severity The log severity levels. - * - * @return void - */ - public static function setSeverity($severity) - { - self::$debug = ((self::DEBUG & $severity) === $severity); - } - - /** - * Logs the given message with debug severity. - * - * @param string $message The debug log message. - * - * @return void - */ - public static function debug($message) - { - if (self::$debug) { - self::log($message); - } - } - - /** - * Generic log method for all severities. - * - * @param string $message The log message. - * - * @return void - */ - public static function log($message) - { - fwrite(self::$stream, PHP_EOL . $message); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/MathUtil.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/MathUtil.php deleted file mode 100644 index 0ffb156..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/MathUtil.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util; - -/** - * This is a simply utility class that will perform mathematical operations with - * bcmath when the extension exists, otherwise it will use default math operations. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -final class MathUtil -{ - /** - * This method will multiply the two given operands with the bcmath extension - * when available, otherwise it will use the default mathematical operations. - * - * @param string $left The left arithmetic operand. - * @param string $right The right arithmetic operand. - * - * @return string - */ - public static function mul($left, $right) - { - if (function_exists('bcmul')) { - return bcmul($left, $right); - } - return (string) ((int) $left * (int) $right); - } - - /** - * This method will add the two given operands with the bcmath extension - * when available, otherwise it will use the default mathematical operations. - * - * @param string $left The left arithmetic operand. - * @param string $right The right arithmetic operand. - * - * @return string - */ - public static function add($left, $right) - { - if (function_exists('bcadd')) { - return bcadd($left, $right); - } - return (string) ((int) $left + (int) $right); - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Type.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Type.php deleted file mode 100644 index a1681a6..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Type.php +++ /dev/null @@ -1,407 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util; - -/** - * Utility class that can be used to detect simpl scalars or internal types. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -final class Type -{ - /** - * Constants for valid php data types. - */ - const PHP_TYPE_ARRAY = 'array', - PHP_TYPE_BOOLEAN = 'boolean', - PHP_TYPE_FLOAT = 'float', - PHP_TYPE_INTEGER = 'integer', - PHP_TYPE_STRING = 'string'; - /** - * Constants with valid php data type identifiers. - */ - const IMAGE_ARRAY = 'array', - IMAGE_BOOL = 'bool', - IMAGE_BOOLEAN = 'boolean', - IMAGE_DOUBLE = 'double', - IMAGE_FLOAT = 'float', - IMAGE_INT = 'int', - IMAGE_INTEGER = 'integer', - IMAGE_MIXED = 'mixed', - IMAGE_REAL = 'real', - IMAGE_RESOURCE = 'resource', - IMAGE_OBJECT = 'object', - IMAGE_STRING = 'string', - IMAGE_STDCLASS = 'stdclass', - IMAGE_VOID = 'void'; - - /** - * Constants with the metaphone representation of multiple php data types. - */ - const IMAGE_METAPHONE_ARRAY = 'AR', - IMAGE_METAPHONE_BOOL = 'BL', - IMAGE_METAPHONE_BOOLEAN = 'BLN', - IMAGE_METAPHONE_DOUBLE = 'TBL', - IMAGE_METAPHONE_FLOAT = 'FLT', - IMAGE_METAPHONE_INT = 'INT', - IMAGE_METAPHONE_INTEGER = 'INTJR', - IMAGE_METAPHONE_MIXED = 'MKST', - IMAGE_METAPHONE_REAL = 'RL', - IMAGE_METAPHONE_RESOURCE = 'RSRS', - IMAGE_METAPHONE_OBJECT = 'OBJKT', - IMAGE_METAPHONE_STRING = 'STRNK', - IMAGE_METAPHONE_STDCLASS = 'STTKLS', - IMAGE_METAPHONE_UNKNOWN = 'UNKNN', - IMAGE_METAPHONE_UNKNOWN_TYPE = 'UNKNNTP'; - - /** - * Constants with the soundex representation of multiple php data types. - */ - const IMAGE_SOUNDEX_ARRAY = 'A600', - IMAGE_SOUNDEX_BOOL = 'B450', - IMAGE_SOUNDEX_BOOLEAN = 'B400', - IMAGE_SOUNDEX_DOUBLE = 'D140', - IMAGE_SOUNDEX_FLOAT = 'F430', - IMAGE_SOUNDEX_INT = 'I530', - IMAGE_SOUNDEX_INTEGER = 'I532', - IMAGE_SOUNDEX_MIXED = 'M230', - IMAGE_SOUNDEX_REAL = 'R400', - IMAGE_SOUNDEX_RESOURCE = 'R262', - IMAGE_SOUNDEX_OBJECT = 'O122', - IMAGE_SOUNDEX_STRING = 'S365', - IMAGE_SOUNDEX_STDCLASS = 'S324', - IMAGE_SOUNDEX_UNKNOWN = 'U525'; - - /** - * Constants for other types/keywords frequently used. - */ - const IMAGE_OTHER_NULL = 'null', - IMAGE_OTHER_FALSE = 'false', - IMAGE_OTHER_TRUE = 'true', - IMAGE_OTHER_UNKNOWN = 'unknown', - IMAGE_OTHER_UNKNOWN_TYPE = 'unknown_type'; - - /** - * This property contains a mapping between a unified lower case type name - * and the corresponding PHP extension that declares this type. - * - * @var array<string, string> - */ - private static $typeNameToExtension = null; - - /** - * Hash with all internal namespaces/extensions. Key and value are identical - * and contain the name of the extension. - * - * @var array<string, string> - * @since 0.9.10 - */ - private static $internalNamespaces = null; - - /** - * List of scalar php types. - * - * @var array<string, bool> - */ - private static $scalarTypes = array( - self::IMAGE_ARRAY => true, - self::IMAGE_BOOL => true, - self::IMAGE_BOOLEAN => true, - self::IMAGE_DOUBLE => true, - self::IMAGE_FLOAT => true, - self::IMAGE_INT => true, - self::IMAGE_INTEGER => true, - self::IMAGE_MIXED => true, - self::IMAGE_REAL => true, - self::IMAGE_RESOURCE => true, - self::IMAGE_OBJECT => true, - self::IMAGE_STRING => true, - self::IMAGE_STDCLASS => true, - self::IMAGE_VOID => true, - self::IMAGE_OTHER_NULL => true, - self::IMAGE_OTHER_FALSE => true, - self::IMAGE_OTHER_TRUE => true, - self::IMAGE_OTHER_UNKNOWN => true, - self::IMAGE_OTHER_UNKNOWN_TYPE => true, - self::IMAGE_METAPHONE_ARRAY => true, - self::IMAGE_METAPHONE_BOOL => true, - self::IMAGE_METAPHONE_BOOLEAN => true, - self::IMAGE_METAPHONE_DOUBLE => true, - self::IMAGE_METAPHONE_FLOAT => true, - self::IMAGE_METAPHONE_INT => true, - self::IMAGE_METAPHONE_INTEGER => true, - self::IMAGE_METAPHONE_MIXED => true, - self::IMAGE_METAPHONE_OBJECT => true, - self::IMAGE_METAPHONE_REAL => true, - self::IMAGE_METAPHONE_RESOURCE => true, - self::IMAGE_METAPHONE_STRING => true, - self::IMAGE_METAPHONE_STDCLASS => true, - self::IMAGE_METAPHONE_UNKNOWN => true, - self::IMAGE_METAPHONE_UNKNOWN_TYPE => true, - self::IMAGE_SOUNDEX_ARRAY => true, - self::IMAGE_SOUNDEX_BOOL => true, - self::IMAGE_SOUNDEX_BOOLEAN => true, - self::IMAGE_SOUNDEX_DOUBLE => true, - self::IMAGE_SOUNDEX_FLOAT => true, - self::IMAGE_SOUNDEX_INT => true, - self::IMAGE_SOUNDEX_INTEGER => true, - self::IMAGE_SOUNDEX_MIXED => true, - self::IMAGE_SOUNDEX_REAL => true, - self::IMAGE_SOUNDEX_RESOURCE => true, - self::IMAGE_SOUNDEX_OBJECT => true, - self::IMAGE_SOUNDEX_STRING => true, - self::IMAGE_SOUNDEX_STDCLASS => true, - self::IMAGE_SOUNDEX_UNKNOWN => true, - ); - - /** - * List of primitive php types. - * - * @var array<string, string> - */ - private static $primitiveTypes = array( - self::IMAGE_BOOL => self::PHP_TYPE_BOOLEAN, - self::IMAGE_BOOLEAN => self::PHP_TYPE_BOOLEAN, - self::IMAGE_SOUNDEX_BOOL => self::PHP_TYPE_BOOLEAN, - self::IMAGE_SOUNDEX_BOOLEAN => self::PHP_TYPE_BOOLEAN, - self::IMAGE_OTHER_FALSE => self::PHP_TYPE_BOOLEAN, - self::IMAGE_OTHER_TRUE => self::PHP_TYPE_BOOLEAN, - self::IMAGE_METAPHONE_BOOL => self::PHP_TYPE_BOOLEAN, - self::IMAGE_METAPHONE_BOOLEAN => self::PHP_TYPE_BOOLEAN, - self::IMAGE_REAL => self::PHP_TYPE_FLOAT, - self::IMAGE_FLOAT => self::PHP_TYPE_FLOAT, - self::IMAGE_DOUBLE => self::PHP_TYPE_FLOAT, - self::IMAGE_METAPHONE_REAL => self::PHP_TYPE_FLOAT, - self::IMAGE_METAPHONE_FLOAT => self::PHP_TYPE_FLOAT, - self::IMAGE_METAPHONE_DOUBLE => self::PHP_TYPE_FLOAT, - self::IMAGE_SOUNDEX_DOUBLE => self::PHP_TYPE_FLOAT, - self::IMAGE_SOUNDEX_FLOAT => self::PHP_TYPE_FLOAT, - self::IMAGE_SOUNDEX_REAL => self::PHP_TYPE_FLOAT, - self::IMAGE_INT => self::PHP_TYPE_INTEGER, - self::IMAGE_INTEGER => self::PHP_TYPE_INTEGER, - self::IMAGE_METAPHONE_INT => self::PHP_TYPE_INTEGER, - self::IMAGE_METAPHONE_INTEGER => self::PHP_TYPE_INTEGER, - self::IMAGE_SOUNDEX_INT => self::PHP_TYPE_INTEGER, - self::IMAGE_SOUNDEX_INTEGER => self::PHP_TYPE_INTEGER, - self::IMAGE_STRING => self::PHP_TYPE_STRING, - self::IMAGE_METAPHONE_STRING => self::PHP_TYPE_STRING, - self::IMAGE_SOUNDEX_STRING => self::PHP_TYPE_STRING, - ); - - /** - * Returns <b>true</b> if the given type is internal or part of an - * extension. - * - * @param string $typeName The type name. - * - * @return boolean - */ - public static function isInternalType($typeName) - { - self::initTypeToExtension(); - - $normalizedName = ltrim($typeName, '\\'); - $normalizedName = strtolower($normalizedName); - - return isset(self::$typeNameToExtension[$normalizedName]); - } - - /** - * Returns the package/extension for the given type name. If no package - * exists, this method will return <b>null</b>. - * - * @param string $typeName The type name. - * - * @return string|null - */ - public static function getTypePackage($typeName) - { - self::initTypeToExtension(); - - $normalizedName = ltrim($typeName, '\\'); - $normalizedName = strtolower($normalizedName); - if (isset(self::$typeNameToExtension[$normalizedName])) { - return self::$typeNameToExtension[$normalizedName]; - } - return null; - } - - /** - * Returns an array with all package/extension names. - * - * @return array<string> - */ - public static function getInternalNamespaces() - { - if (self::$internalNamespaces === null) { - self::$internalNamespaces = array(); - foreach (self::initTypeToExtension() as $namespace) { - self::$internalNamespaces[$namespace] = $namespace; - } - } - return self::$internalNamespaces; - } - - /** - * This method will return <b>true</b> when the given package represents a - * php extension. - * - * @param string $packageName Name of a package. - * - * @return boolean - */ - public static function isInternalPackage($packageName) - { - $packageNames = self::getInternalNamespaces(); - return isset($packageNames[strtolower($packageName)]); - } - - /** - * This method will return <b>true</b> when the given type identifier is in - * the list of scalar/none-object types. - * - * @param string $image The type identifier. - * - * @return boolean - */ - public static function isScalarType($image) - { - $image = strtolower($image); - if (isset(self::$scalarTypes[$image]) === true) { - return true; - } - $image = metaphone($image); - if (isset(self::$scalarTypes[$image]) === true) { - return true; - } - return isset(self::$scalarTypes[soundex($image)]); - } - - /** - * This method will return <b>true</b> when the given type identifier is in - * the list of primitive types. - * - * @param string $image The type image. - * - * @return boolean - * @since 0.9.6 - */ - public static function isPrimitiveType($image) - { - return (self::getPrimitiveType($image) !== null); - } - - /** - * This method will return a unified type image for a detected source type - * image. - * - * @param string $image The found primitive type image. - * - * @return string|null - * @since 0.9.6 - */ - public static function getPrimitiveType($image) - { - $image = strtolower($image); - if (isset(self::$primitiveTypes[$image]) === true) { - return self::$primitiveTypes[$image]; - } - $image = metaphone($image); - if (isset(self::$primitiveTypes[$image]) === true) { - return self::$primitiveTypes[$image]; - } - $image = soundex($image); - if (isset(self::$primitiveTypes[$image]) === true) { - return self::$primitiveTypes[$image]; - } - return null; - } - - /** - * This method will return <b>true</b> when the given image describes a - * php array type. - * - * @param string $image The found type image. - * - * @return boolean - * @since 0.9.6 - */ - public static function isArrayType($image) - { - return (strtolower($image) === 'array'); - } - - /** - * This method reads all available classes and interfaces and checks whether - * this type belongs to an extension or is internal. All internal and extension - * classes are collected in an internal data structure. - * - * @return array<string, string> - */ - private static function initTypeToExtension() - { - // Skip when already done. - if (self::$typeNameToExtension !== null) { - return self::$typeNameToExtension; - } - - self::$typeNameToExtension = array('iterator' => '+standard'); - - $extensionNames = get_loaded_extensions(); - $extensionNames = array_map('strtolower', $extensionNames); - - foreach ($extensionNames as $extensionName) { - $extension = new \ReflectionExtension($extensionName); - - $classNames = $extension->getClassNames(); - $classNames = array_map('strtolower', $classNames); - - foreach ($classNames as $className) { - self::$typeNameToExtension[$className] = '+' . $extensionName; - } - } - - return self::$typeNameToExtension; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Utf8Util.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Utf8Util.php deleted file mode 100644 index 33ec6ad..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Utf8Util.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php -/** - * This file is part of PDepend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util; - -/** - * This is a simply utility class that will perform mathematical operations with - * bcmath when the extension exists, otherwise it will use default math operations. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @since 2.2.x - */ -final class Utf8Util -{ - public static function ensureEncoding($raw) - { - $encoding = 'UTF8'; - if (function_exists('mb_detect_encoding')) { - $encoding = mb_detect_encoding($raw) ?: $encoding; - } - - $text = ''; - if (function_exists('iconv')) { - $text = @iconv($encoding, 'UTF8//IGNORE', $raw) ?: ''; - } - - if ($text === '') { - $text = utf8_encode($raw); - } - - return $text; - } -} diff --git a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Workarounds.php b/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Workarounds.php deleted file mode 100644 index 4b4ebbe..0000000 --- a/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Workarounds.php +++ /dev/null @@ -1,90 +0,0 @@ -<?php -/** - * This file is part of PHP_Depend. - * - * PHP Version 5 - * - * Copyright (c) 2008-2017 Manuel Pichler <mapi@pdepend.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Manuel Pichler nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -namespace PDepend\Util; - -/** - * Utility class used to test for required php version workarounds. - * - * @copyright 2008-2017 Manuel Pichler. All rights reserved. - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ -class Workarounds -{ - /** - * Tests if the used PHP version has the known unserialize issue with object - * references. - * - * @return boolean - * @see https://bugs.php.net/bug.php?id=62373 - */ - public function hasSerializeReferenceIssue() - { - return version_compare(PHP_VERSION, '5.4.0', '>') && version_compare(PHP_VERSION, '5.4.5', '<='); - } - - /** - * Tests if the current environment has no known issues and does not - * require any workaround. - * - * @return boolean - */ - public function isNotRequired() - { - return !$this->hasSerializeReferenceIssue(); - } - - /** - * Returns an array with error messages related to the required workarounds. - * - * @return array - */ - public function getRequiredWorkarounds() - { - $issues = array(); - if ($this->hasSerializeReferenceIssue()) { - $issues[] = 'File cache deactivated due to known serialize() issues in PHP ' . PHP_VERSION; - } - - return $issues; - } -} diff --git a/vendor/pdepend/pdepend/src/main/resources/schema/configuration.xsd b/vendor/pdepend/pdepend/src/main/resources/schema/configuration.xsd deleted file mode 100644 index 95b0fb6..0000000 --- a/vendor/pdepend/pdepend/src/main/resources/schema/configuration.xsd +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version="1.0"?> -<xsd:schema targetNamespace="http://pdepend.org/schema/configuration" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns="http://pdepend.org/schema/configuration"> - - <xsd:element name="configuration"> - <xsd:complexType> - <xsd:choice minOccurs="0" maxOccurs="unbounded" > - <xsd:element ref="imageConvert" minOccurs="0" maxOccurs="1" /> - <xsd:element ref="cache" minOccurs="0" maxOccurs="1" /> - </xsd:choice> - </xsd:complexType> - </xsd:element> - - <xsd:element name="cache"> - <xsd:complexType> - <xsd:sequence> - <xsd:element ref="driver" /> - <xsd:element ref="location" minOccurs="0" maxOccurs="1" /> - </xsd:sequence> - </xsd:complexType> - </xsd:element> - - <xsd:element name="driver"> - <xsd:simpleType> - <xsd:restriction base="xsd:string"> - <xsd:enumeration value="file" /> - <xsd:enumeration value="memory" /> - </xsd:restriction> - </xsd:simpleType> - </xsd:element> - - <xsd:element name="location" type="xsd:anyURI" /> - - <xsd:element name="imageConvert"> - <xsd:complexType> - <xsd:sequence> - <xsd:element ref="fontFamily" minOccurs="0" maxOccurs="1" /> - <xsd:element ref="fontSize" minOccurs="0" maxOccurs="1" /> - </xsd:sequence> - </xsd:complexType> - </xsd:element> - - <xsd:element name="fontFamily" type="xsd:string" /> - <xsd:element name="fontSize" type="xsd:int" /> -</xsd:schema> diff --git a/vendor/pdepend/pdepend/src/main/resources/services.xml b/vendor/pdepend/pdepend/src/main/resources/services.xml deleted file mode 100644 index 8bd47d0..0000000 --- a/vendor/pdepend/pdepend/src/main/resources/services.xml +++ /dev/null @@ -1,123 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<container xmlns="http://symfony.com/schema/dic/services" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:pdepend="http://pdepend.org/schema/dic/pdepend" - xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> - - <services> - <service id="pdepend.textui.runner" class="PDepend\TextUI\Runner" public="true"> - <argument type="service" id="pdepend.report_generator_factory" /> - <argument type="service" id="pdepend.engine" /> - </service> - - <service id="pdepend.util.cache_factory" class="PDepend\Util\Cache\CacheFactory"> - <argument type="service" id="pdepend.configuration" /> - </service> - - <service id="pdepend.engine" class="PDepend\Engine" public="true"> - <argument type="service" id="pdepend.configuration" /> - <argument type="service" id="pdepend.util.cache_factory" /> - <argument type="service" id="pdepend.analyzer_factory" /> - </service> - - <service id="pdepend.analyzer_factory" class="PDepend\Metrics\AnalyzerFactory" public="true"> - <argument type="service" id="service_container" /> - </service> - - <service id="pdepend.configuration" class="PDepend\Util\Configuration" public="true"> - </service> - - <service id="pdepend.textui.result_printer" class="PDepend\TextUI\ResultPrinter" /> - - <service id="pdepend.report.summary.xml" class="PDepend\Report\Summary\Xml" public="true"> - <tag name="pdepend.logger" option="--summary-xml" message="Generates a xml log with all metrics." /> - </service> - - <service id="pdepend.report.dependencies.xml" class="PDepend\Report\Dependencies\Xml" public="true"> - <tag name="pdepend.logger" option="--dependency-xml" message="Generates a xml log with all dependencies." /> - </service> - - <service id="pdepend.report.jdepend.xml" class="PDepend\Report\Jdepend\Xml" public="true"> - <tag name="pdepend.logger" option="--jdepend-xml" message="Generates the package dependency log." /> - </service> - - <service id="pdepend.report.jdepend.chart" class="PDepend\Report\Jdepend\Chart" public="true"> - <tag name="pdepend.logger" option="--jdepend-chart" message="Generates a diagram of the analyzed packages." /> - </service> - - <service id="pdepend.report.overview.pyramid" class="PDepend\Report\Overview\Pyramid" public="true"> - <tag name="pdepend.logger" option="--overview-pyramid" message="Generates a chart with an Overview Pyramid for the analyzed project." /> - </service> - - <service id="pdepend.report_generator_factory" class="PDepend\Report\ReportGeneratorFactory" public="true"> - <argument type="service" id="service_container" /> - </service> - - <service id="pdepend.analyzer.class_level" class="PDepend\Metrics\Analyzer\ClassLevelAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - - <call method="addAnalyzer"> - <argument type="service" id="pdepend.analyzer.cyclomatic_complexity" /> - </call> - </service> - - <service id="pdepend.analyzer.code_rank" class="PDepend\Metrics\Analyzer\CodeRankAnalyzer" public="true"> - <tag name="pdepend.analyzer" option="--coderank-mode" message="Used CodeRank strategies. Comma separated list of 'inheritance'(default), 'property' and 'method'." value="*[,...]" /> - </service> - - <service id="pdepend.analyzer.cohesion" class="PDepend\Metrics\Analyzer\CohesionAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - - <service id="pdepend.analyzer.coupling" class="PDepend\Metrics\Analyzer\CouplingAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - - <service id="pdepend.analyzer.crap_index" class="PDepend\Metrics\Analyzer\CrapIndexAnalyzer" public="true"> - <tag name="pdepend.analyzer" option="--coverage-report" message="Clover style CodeCoverage report, as produced by PHPUnit's --coverage-clover option." /> - <call method="addAnalyzer"> - <argument type="service" id="pdepend.analyzer.cyclomatic_complexity" /> - </call> - </service> - - <service id="pdepend.analyzer.cyclomatic_complexity" class="PDepend\Metrics\Analyzer\CyclomaticComplexityAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - - <service id="pdepend.analyzer.dependency" class="PDepend\Metrics\Analyzer\DependencyAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - - <service id="pdepend.analyzer.class_dependency" class="PDepend\Metrics\Analyzer\ClassDependencyAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - - <service id="pdepend.analyzer.hierarchy" class="PDepend\Metrics\Analyzer\HierarchyAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - - <service id="pdepend.analyzer.inheritance" class="PDepend\Metrics\Analyzer\InheritanceAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - - <service id="pdepend.analyzer.npath_complexity" class="PDepend\Metrics\Analyzer\NPathComplexityAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - - <service id="pdepend.analyzer.node_count" class="PDepend\Metrics\Analyzer\NodeCountAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - - <service id="pdepend.analyzer.node_loc" class="PDepend\Metrics\Analyzer\NodeLocAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - - <service id="pdepend.analyzer.halstead" class="PDepend\Metrics\Analyzer\HalsteadAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - - <service id="pdepend.analyzer.maintainability" class="PDepend\Metrics\Analyzer\MaintainabilityIndexAnalyzer" public="true"> - <tag name="pdepend.analyzer" /> - </service> - </services> -</container> diff --git a/vendor/phan/phan/.phan/bin/mkfilelist b/vendor/phan/phan/.phan/bin/mkfilelist deleted file mode 100755 index deb8b01..0000000 --- a/vendor/phan/phan/.phan/bin/mkfilelist +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -if [[ -z $WORKSPACE ]] -then - export WORKSPACE=. -fi -cd $WORKSPACE - -for dir in \ - src \ - tests/Phan \ - vendor/phpunit/phpunit/src vendor/symfony/console -do - if [ -d "$dir" ]; then - find $dir -name '*.php' - fi -done diff --git a/vendor/phan/phan/.phan/bin/phan b/vendor/phan/phan/.phan/bin/phan deleted file mode 100755 index b25f6e8..0000000 --- a/vendor/phan/phan/.phan/bin/phan +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh - -# Root directory of project -export ROOT=`git rev-parse --show-toplevel` - -# Phan's directory for executables -export BIN=$ROOT/.phan/bin - -# Phan's data directory -export DATA=$ROOT/.phan/data -mkdir -p $DATA; - -# Go to the root of this git repo -pushd $ROOT > /dev/null - - # Get the current hash of HEAD - export REV=`git rev-parse HEAD` - - # Create the data directory for this run if it - # doesn't exist yet - export RUN=$DATA/$REV - mkdir -p $RUN - - $BIN/mkfilelist > $RUN/files - - # Run the analysis, emitting output to the console - # and using a previous state file. - phan \ - --progress-bar \ - --project-root-directory $ROOT \ - --output $RUN/issues && exit $? - - # Re-link the latest directory - rm -f $ROOT/.phan/data/latest - ln -s $RUN $DATA/latest - - # Output any issues that were found - cat $RUN/issues - -popd > /dev/null diff --git a/vendor/phan/phan/.phan/config.php b/vendor/phan/phan/.phan/config.php deleted file mode 100644 index 75e79f8..0000000 --- a/vendor/phan/phan/.phan/config.php +++ /dev/null @@ -1,487 +0,0 @@ -<?php -declare(strict_types=1); - -use Phan\Issue; - -/** - * This configuration will be read and overlaid on top of the - * default configuration. Command line arguments will be applied - * after this file is read. - * - * @see src/Phan/Config.php - * See Config for all configurable options. - * - * A Note About Paths - * ================== - * - * Files referenced from this file should be defined as - * - * ``` - * Config::projectPath('relative_path/to/file') - * ``` - * - * where the relative path is relative to the root of the - * project which is defined as either the working directory - * of the phan executable or a path passed in via the CLI - * '-d' flag. - */ -return [ - // Supported values: `'5.6'`, `'7.0'`, `'7.1'`, `'7.2'`, `'7.3'`, `null`. - // If this is set to `null`, - // then Phan assumes the PHP version which is closest to the minor version - // of the php executable used to execute Phan. - // - // Note that the **only** effect of choosing `'5.6'` is to infer that functions removed in php 7.0 exist. - // (See `backward_compatibility_checks` for additional options) - 'target_php_version' => null, - - // Default: true. If this is set to true, - // and target_php_version is newer than the version used to run Phan, - // Phan will act as though functions added in newer PHP versions exist. - // - // NOTE: Currently, this only affects Closure::fromCallable - 'pretend_newer_core_functions_exist' => true, - - // If true, missing properties will be created when - // they are first seen. If false, we'll report an - // error message. - 'allow_missing_properties' => false, - - // Allow null to be cast as any type and for any - // type to be cast to null. - 'null_casts_as_any_type' => false, - - // Allow null to be cast as any array-like type - // This is an incremental step in migrating away from null_casts_as_any_type. - // If null_casts_as_any_type is true, this has no effect. - 'null_casts_as_array' => false, - - // Allow any array-like type to be cast to null. - // This is an incremental step in migrating away from null_casts_as_any_type. - // If null_casts_as_any_type is true, this has no effect. - 'array_casts_as_null' => false, - - // If enabled, Phan will warn if **any** type in a method's object expression - // is definitely not an object, - // or if **any** type in an invoked expression is not a callable. - // Setting this to true will introduce numerous false positives - // (and reveal some bugs). - 'strict_method_checking' => true, - - // If enabled, Phan will warn if **any** type in the argument's type - // cannot be cast to a type in the parameter's expected type. - // Setting this to true will introduce a large number of false positives (and some bugs). - // (For self-analysis, Phan has a large number of suppressions and file-level suppressions, due to \ast\Node being difficult to type check) - 'strict_param_checking' => true, - - // If enabled, Phan will warn if **any** type in a property assignment's type - // cannot be cast to a type in the property's expected type. - // Setting this to true will introduce a large number of false positives (and some bugs). - // (For self-analysis, Phan has a large number of suppressions and file-level suppressions, due to \ast\Node being difficult to type check) - 'strict_property_checking' => true, - - // If enabled, Phan will warn if **any** type in the return statement's union type - // cannot be cast to a type in the method's declared return type. - // Setting this to true will introduce a large number of false positives (and some bugs). - // (For self-analysis, Phan has a large number of suppressions and file-level suppressions, due to \ast\Node being difficult to type check) - 'strict_return_checking' => true, - - // If enabled, scalars (int, float, bool, string, null) - // are treated as if they can cast to each other. - // This does not affect checks of array keys. See scalar_array_key_cast. - 'scalar_implicit_cast' => false, - - // If enabled, any scalar array keys (int, string) - // are treated as if they can cast to each other. - // E.g. array<int,stdClass> can cast to array<string,stdClass> and vice versa. - // Normally, a scalar type such as int could only cast to/from int and mixed. - 'scalar_array_key_cast' => false, - - // If this has entries, scalars (int, float, bool, string, null) - // are allowed to perform the casts listed. - // E.g. ['int' => ['float', 'string'], 'float' => ['int'], 'string' => ['int'], 'null' => ['string']] - // allows casting null to a string, but not vice versa. - // (subset of scalar_implicit_cast) - 'scalar_implicit_partial' => [], - - // If true, seemingly undeclared variables in the global - // scope will be ignored. This is useful for projects - // with complicated cross-file globals that you have no - // hope of fixing. - 'ignore_undeclared_variables_in_global_scope' => false, - - // Backwards Compatibility Checking (This is very slow) - 'backward_compatibility_checks' => false, - - // If true, check to make sure the return type declared - // in the doc-block (if any) matches the return type - // declared in the method signature. This process is - // slow. - 'check_docblock_signature_return_type_match' => true, - - // If true, check to make sure the param types declared - // in the doc-block (if any) matches the param types - // declared in the method signature. - 'check_docblock_signature_param_type_match' => true, - - // (*Requires check_docblock_signature_param_type_match to be true*) - // If true, make narrowed types from phpdoc params override - // the real types from the signature, when real types exist. - // (E.g. allows specifying desired lists of subclasses, - // or to indicate a preference for non-nullable types over nullable types) - // Affects analysis of the body of the method and the param types passed in by callers. - 'prefer_narrowed_phpdoc_param_type' => true, - - // (*Requires check_docblock_signature_return_type_match to be true*) - // If true, make narrowed types from phpdoc returns override - // the real types from the signature, when real types exist. - // (E.g. allows specifying desired lists of subclasses, - // or to indicate a preference for non-nullable types over nullable types) - // Affects analysis of return statements in the body of the method and the return types passed in by callers. - 'prefer_narrowed_phpdoc_return_type' => true, - - // If enabled, check all methods that override a - // parent method to make sure its signature is - // compatible with the parent's. This check - // can add quite a bit of time to the analysis. - // This will also check if final methods are overridden, etc. - 'analyze_signature_compatibility' => true, - - // Set this to true to allow contravariance in real parameter types of method overrides (Introduced in php 7.2) - // See https://secure.php.net/manual/en/migration72.new-features.php#migration72.new-features.param-type-widening - // (Users may enable this if analyzing projects that support only php 7.2+) - // This is false by default. (Will warn if real parameter types are omitted in an override) - 'allow_method_param_type_widening' => false, - - // Set this to true to make Phan guess that undocumented parameter types - // (for optional parameters) have the same type as default values - // (Instead of combining that type with `mixed`). - // E.g. `function($x = 'val')` would make Phan infer that $x had a type of `string`, not `string|mixed`. - // Phan will not assume it knows specific types if the default value is false or null. - 'guess_unknown_parameter_type_using_default' => false, - - // This setting maps case insensitive strings to union types. - // This is useful if a project uses phpdoc that differs from the phpdoc2 standard. - // If the corresponding value is the empty string, Phan will ignore that union type (E.g. can ignore 'the' in `@return the value`) - // If the corresponding value is not empty, Phan will act as though it saw the corresponding union type when the keys show up in a UnionType of @param, @return, @var, @property, etc. - // - // This matches the **entire string**, not parts of the string. - // (E.g. `@return the|null` will still look for a class with the name `the`, but `@return the` will be ignored with the below setting) - // - // (These are not aliases, this setting is ignored outside of doc comments). - // (Phan does not check if classes with these names exist) - // - // Example setting: ['unknown' => '', 'number' => 'int|float', 'char' => 'string', 'long' => 'int', 'the' => ''] - 'phpdoc_type_mapping' => [ ], - - // Set to true in order to attempt to detect dead - // (unreferenced) code. Keep in mind that the - // results will only be a guess given that classes, - // properties, constants and methods can be referenced - // as variables (like `$class->$property` or - // `$class->$method()`) in ways that we're unable - // to make sense of. - 'dead_code_detection' => false, - - // Set to true in order to attempt to detect unused variables. - // dead_code_detection will also enable unused variable detection. - 'unused_variable_detection' => true, - - // Set to true in order to force tracking references to elements - // (functions/methods/consts/protected). - // dead_code_detection is another option which also causes references - // to be tracked. - 'force_tracking_references' => false, - - // Enable this to warn about harmless redundant use for classes and namespaces such as `use Foo\bar` in namespace Foo. - // - // Note: This does not affect warnings about redundant uses in the global namespace. - 'warn_about_redundant_use_namespaced_class' => true, - - // If true, then run a quick version of checks that takes less time. - // False by default. - 'quick_mode' => false, - - // If true, then before analysis, try to simplify AST into a form - // which improves Phan's type inference in edge cases. - // - // This may conflict with 'dead_code_detection'. - // When this is true, this slows down analysis slightly. - // - // E.g. rewrites `if ($a = value() && $a > 0) {...}` - // into $a = value(); if ($a) { if ($a > 0) {...}}` - 'simplify_ast' => true, - - // If true, Phan will read `class_alias` calls in the global scope, - // then (1) create aliases from the *parsed* files if no class definition was found, - // and (2) emit issues in the global scope if the source or target class is invalid. - // (If there are multiple possible valid original classes for an aliased class name, - // the one which will be created is unspecified.) - // NOTE: THIS IS EXPERIMENTAL, and the implementation may change. - 'enable_class_alias_support' => false, - - // Enable or disable support for generic templated - // class types. - 'generic_types_enabled' => true, - - // If enabled, warn about throw statement where the exception types - // are not documented in the PHPDoc of functions, methods, and closures. - 'warn_about_undocumented_throw_statements' => true, - - // If enabled (and warn_about_undocumented_throw_statements is enabled), - // warn about function/closure/method calls that have (at)throws - // without the invoking method documenting that exception. - 'warn_about_undocumented_exceptions_thrown_by_invoked_functions' => true, - - // If this is a list, Phan will not warn about lack of documentation of (at)throws - // for any of the listed classes or their subclasses. - // This setting only matters when warn_about_undocumented_throw_statements is true. - // The default is the empty array (Warn about every kind of Throwable) - 'exception_classes_with_optional_throws_phpdoc' => [ - 'LogicException', - 'RuntimeException', - 'InvalidArgumentException', - 'AssertionError', - 'TypeError', - 'Phan\Exception\IssueException', // TODO: Make Phan aware that some arguments suppress certain issues - 'Phan\AST\TolerantASTConverter\InvalidNodeException', // This is used internally in TolerantASTConverter - - // TODO: Undo the suppressions for the below categories of issues: - 'Phan\Exception\CodeBaseException', - ], - - // Increase this to properly analyze require_once statements - 'max_literal_string_type_length' => 1000, - - // Setting this to true makes the process assignment for file analysis - // as predictable as possible, using consistent hashing. - // Even if files are added or removed, or process counts change, - // relatively few files will move to a different group. - // (use when the number of files is much larger than the process count) - // NOTE: If you rely on Phan parsing files/directories in the order - // that they were provided in this config, don't use this) - // See https://github.com/phan/phan/wiki/Different-Issue-Sets-On-Different-Numbers-of-CPUs - 'consistent_hashing_file_order' => false, - - // Override to hardcode existence and types of (non-builtin) globals. - // Class names should be prefixed with '\\'. - // (E.g. ['_FOO' => '\\FooClass', 'page' => '\\PageClass', 'userId' => 'int']) - 'globals_type_map' => [], - - // The minimum severity level to report on. This can be - // set to Issue::SEVERITY_LOW, Issue::SEVERITY_NORMAL or - // Issue::SEVERITY_CRITICAL. - 'minimum_severity' => Issue::SEVERITY_LOW, - - // Add any issue types (such as 'PhanUndeclaredMethod') - // here to inhibit them from being reported - 'suppress_issue_types' => [ - 'PhanUnreferencedClosure', // False positives seen with closures in arrays, TODO: move closure checks closer to what is done by unused variable plugin - 'PhanPluginNoCommentOnProtectedMethod', - 'PhanPluginDescriptionlessCommentOnProtectedMethod', - 'PhanPluginNoCommentOnPrivateMethod', - 'PhanPluginDescriptionlessCommentOnPrivateMethod', - ], - - // If empty, no filter against issues types will be applied. - // If non-empty, only issues within the list will be emitted - // by Phan. - // - // See https://github.com/phan/phan/wiki/Issue-Types-Caught-by-Phan - // for the full list of issues that Phan detects. - // - // Phan is capable of detecting hundreds of types of issues. - // Projects should almost always use `suppress_issue_types` instead. - 'whitelist_issue_types' => [ - // 'PhanUndeclaredClass', - ], - - // A list of files to include in analysis - 'file_list' => [ - 'phan', - 'phan_client', - 'plugins/codeclimate/engine', - 'tool/make_stubs', - 'internal/dump_fallback_ast.php', - 'internal/internalsignatures.php', - 'internal/package.php', - 'internal/reflection_completeness_check.php', - 'internal/sanitycheck.php', - 'internal/update_wiki_config_types.php', - 'internal/update_wiki_issue_types.php', - 'vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php', - 'vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', - 'vendor/phpdocumentor/reflection-docblock/src/DocBlock.php', - // 'vendor/phpunit/phpunit/src/Framework/TestCase.php', - ], - - // A regular expression to match files to be excluded - // from parsing and analysis and will not be read at all. - // - // This is useful for excluding groups of test or example - // directories/files, unanalyzable files, or files that - // can't be removed for whatever reason. - // (e.g. '@Test\.php$@', or '@vendor/.*/(tests|Tests)/@') - 'exclude_file_regex' => '@^vendor/.*/(tests?|Tests?)/@', - - // Enable this to enable checks of require/include statements referring to valid paths. - 'enable_include_path_checks' => true, - - // A list of include paths to check when checking if `require_once`, `include`, etc. are valid. - // - // To refer to the directory of the file being analyzed, use `'.'` - // To refer to the project root directory, you must use \Phan\Config::getProjectRootDirectory() - // - // (E.g. `['.', \Phan\Config::getProjectRootDirectory() . '/src/folder-added-to-include_path']`) - 'include_paths' => ['.'], - - // Enable this to warn about the use of relative paths in `require_once`, `include`, etc. - // Relative paths are harder to reason about, and opcache may have issues with relative paths in edge cases. - 'warn_about_relative_include_statement' => true, - - // A file list that defines files that will be excluded - // from parsing and analysis and will not be read at all. - // - // This is useful for excluding hopelessly unanalyzable - // files that can't be removed for whatever reason. - 'exclude_file_list' => [ - 'internal/Sniffs/ValidUnderscoreVariableNameSniff.php', - ], - - // The number of processes to fork off during the analysis - // phase. - 'processes' => 1, - - // A list of directories that should be parsed for class and - // method information. After excluding the directories - // defined in exclude_analysis_directory_list, the remaining - // files will be statically analyzed for errors. - // - // Thus, both first-party and third-party code being used by - // your application should be included in this list. - 'directory_list' => [ - 'internal/lib', - 'src', - 'tests/Phan', - 'vendor/composer/semver/src', - 'vendor/composer/xdebug-handler/src', - 'vendor/felixfbecker/advanced-json-rpc/lib', - 'vendor/microsoft/tolerant-php-parser/src', - 'vendor/netresearch/jsonmapper/src', - 'vendor/phpunit/phpunit/src', - 'vendor/psr/log/Psr', - 'vendor/sabre/event/lib', - 'vendor/symfony/console', - '.phan/plugins', - '.phan/stubs', - ], - - // List of case-insensitive file extensions supported by Phan. - // (e.g. php, html, htm) - 'analyzed_file_extensions' => ['php'], - - // A directory list that defines files that will be excluded - // from static analysis, but whose class and method - // information should be included. - // - // Generally, you'll want to include the directories for - // third-party code (such as 'vendor/') in this list. - // - // n.b.: If you'd like to parse but not analyze 3rd - // party code, directories containing that code - // should be added to the `directory_list` as - // to `exclude_analysis_directory_list`. - 'exclude_analysis_directory_list' => [ - 'vendor/' - ], - - // By default, Phan will log error messages to stdout if PHP is using options that slow the analysis. - // (e.g. PHP is compiled with --enable-debug or when using XDebug) - 'skip_slow_php_options_warning' => false, - - // You can put paths to internal stubs in this config option. - // Phan will continue using its detailed type annotations, but load the constants, classes, functions, and classes (and their Reflection types) from these stub files (doubling as valid php files). - // Use a different extension from php to avoid accidentally loading these. - // The 'mkstubs' script can be used to generate your own stubs (compatible with php 7.0+ right now) - 'autoload_internal_extension_signatures' => [ - 'ast' => '.phan/internal_stubs/ast.phan_php', - 'ctype' => '.phan/internal_stubs/ctype.phan_php', - 'igbinary' => '.phan/internal_stubs/igbinary.phan_php', - 'pcntl' => '.phan/internal_stubs/pcntl.phan_php', - 'posix' => '.phan/internal_stubs/posix.phan_php', - 'readline' => '.phan/internal_stubs/readline.phan_php', - 'sysvmsg' => '.phan/internal_stubs/sysvmsg.phan_php', - 'sysvsem' => '.phan/internal_stubs/sysvsem.phan_php', - 'sysvshm' => '.phan/internal_stubs/sysvshm.phan_php', - ], - - // Set this to false to emit PhanUndeclaredFunction issues for internal functions that Phan has signatures for, - // but aren't available in the codebase, or the internal functions used to run phan (may lead to false positives if an extension isn't loaded) - // If this is true(default), then Phan will not warn. - // Also see 'autoload_internal_extension_signatures' for an alternative way to fix this type of issue. - 'ignore_undeclared_functions_with_known_signatures' => false, - - 'plugin_config' => [ - // A list of 1 or more PHP binaries (Absolute path or program name found in $PATH) - // to use to analyze your files with PHP's native `--syntax-check`. - // - // This can be used to simultaneously run PHP's syntax checks with multiple PHP versions. - // e.g. `'plugin_config' => ['php_native_syntax_check_binaries' => ['php72', 'php70', 'php56']]` - // if all of those programs can be found in $PATH - - // 'php_native_syntax_check_binaries' => [PHP_BINARY], - - // The maximum number of `php --syntax-check` processes to run at any point in time (Minimum: 1). - // This may be temporarily higher if php_native_syntax_check_binaries has more elements than this process count. - 'php_native_syntax_check_max_processes' => 4, - - // blacklist of methods to warn about for HasPHPDocPlugin - 'has_phpdoc_method_ignore_regex' => '@^Phan\\\\Tests\\\\.*::(test.*|.*Provider)$@', - ], - - // A list of plugin files to execute - // NOTE: values can be the base name without the extension for plugins bundled with Phan (E.g. 'AlwaysReturnPlugin') - // or relative/absolute paths to the plugin (Relative to the project root). - 'plugins' => [ - 'AlwaysReturnPlugin', - 'DollarDollarPlugin', - 'UnreachableCodePlugin', - 'DuplicateArrayKeyPlugin', - 'PregRegexCheckerPlugin', - 'PrintfCheckerPlugin', - 'PHPUnitAssertionPlugin', // analyze assertSame/assertInstanceof/assertTrue/assertFalse - 'UseReturnValuePlugin', - - // UnknownElementTypePlugin warns about unknown types in element signatures. - 'UnknownElementTypePlugin', - 'DuplicateExpressionPlugin', - // warns about carriage returns("\r"), trailing whitespace, and tabs in PHP files. - 'WhitespacePlugin', - //////////////////////////////////////////////////////////////////////// - // Plugins for Phan's self-analysis - //////////////////////////////////////////////////////////////////////// - - // TODO: warn about the usage of assert() for Phan's self-analysis. See https://github.com/phan/phan/issues/288 - 'NoAssertPlugin', - - 'HasPHPDocPlugin', - - // This should only be enabled if the code being analyzed contains Phan plugins. - '.phan/plugins/PhanSelfCheckPlugin.php', - - //////////////////////////////////////////////////////////////////////// - // End plugins for Phan's self-analysis - //////////////////////////////////////////////////////////////////////// - - // 'SleepCheckerPlugin' is useful for projects which heavily use the __sleep() method. Phan doesn't use __sleep(). - // InvokePHPNativeSyntaxCheckPlugin invokes 'php --no-php-ini --syntax-check ${abs_path_to_analyzed_file}.php' and reports any error messages. - // Using this can cause phan's overall analysis time to more than double. - // 'InvokePHPNativeSyntaxCheckPlugin', - - // 'PHPUnitNotDeadCodePlugin', // Marks PHPUnit test case subclasses and test cases as referenced code. This is only useful for runs when dead code detection is enabled. - - // NOTE: This plugin only produces correct results when - // Phan is run on a single core (-j1). - // 'UnusedSuppressionPlugin', - ], -]; diff --git a/vendor/phan/phan/.phan/internal_stubs/README.md b/vendor/phan/phan/.phan/internal_stubs/README.md deleted file mode 100644 index 27754ac..0000000 --- a/vendor/phan/phan/.phan/internal_stubs/README.md +++ /dev/null @@ -1,4 +0,0 @@ -This folder will eventually contain stubs for the latest versions of various extensions. -If the extension is loaded in the binary to run phan, then phan will do nothing. -The plan is to make phan load these files and act as though internal classes, constants, -and functions existed with the same signatures as these php files. diff --git a/vendor/phan/phan/.phan/internal_stubs/ast.phan_php b/vendor/phan/phan/.phan/internal_stubs/ast.phan_php deleted file mode 100644 index 4648dbe..0000000 --- a/vendor/phan/phan/.phan/internal_stubs/ast.phan_php +++ /dev/null @@ -1,210 +0,0 @@ -<?php -// These stubs were generated by the phan stub generator. -// @phan-stub-for-extension ast@1.0.1 - -namespace ast { -class Metadata { - - // properties - public $flags; - public $flagsCombinable; - public $kind; - public $name; -} - -class Node { - - // properties - public $children; - public $endLineno; - public $flags; - public $kind; - public $lineno; - - // methods - public function __construct($kind = null, $flags = null, array $children = null, $lineno = null) {} -} - -function get_kind_name($kind) {} -function get_metadata() {} -function get_supported_versions($exclude_deprecated = null) {} -function kind_uses_flags($kind) {} -function parse_code($code, $version = null, $filename = null) {} -function parse_file($filename, $version = null) {} -const AST_ARG_LIST = 128; -const AST_ARRAY = 129; -const AST_ARRAY_ELEM = 525; -const AST_ASSIGN = 517; -const AST_ASSIGN_OP = 519; -const AST_ASSIGN_REF = 518; -const AST_BINARY_OP = 520; -const AST_BREAK = 285; -const AST_CALL = 515; -const AST_CAST = 261; -const AST_CATCH = 772; -const AST_CATCH_LIST = 135; -const AST_CLASS = 70; -const AST_CLASS_CONST = 516; -const AST_CLASS_CONST_DECL = 140; -const AST_CLASS_NAME = 511; -const AST_CLONE = 266; -const AST_CLOSURE = 68; -const AST_CLOSURE_USES = 137; -const AST_CLOSURE_VAR = 2049; -const AST_CONDITIONAL = 770; -const AST_CONST = 257; -const AST_CONST_DECL = 139; -const AST_CONST_ELEM = 775; -const AST_CONTINUE = 286; -const AST_DECLARE = 536; -const AST_DIM = 512; -const AST_DO_WHILE = 532; -const AST_ECHO = 282; -const AST_EMPTY = 262; -const AST_ENCAPS_LIST = 130; -const AST_EXIT = 267; -const AST_EXPR_LIST = 131; -const AST_FOR = 1024; -const AST_FOREACH = 1025; -const AST_FUNC_DECL = 67; -const AST_GLOBAL = 276; -const AST_GOTO = 284; -const AST_GROUP_USE = 543; -const AST_HALT_COMPILER = 281; -const AST_IF = 133; -const AST_IF_ELEM = 533; -const AST_INCLUDE_OR_EVAL = 269; -const AST_INSTANCEOF = 527; -const AST_ISSET = 263; -const AST_LABEL = 279; -const AST_LIST = 255; -const AST_MAGIC_CONST = 0; -const AST_METHOD = 69; -const AST_METHOD_CALL = 768; -const AST_METHOD_REFERENCE = 539; -const AST_NAME = 2048; -const AST_NAMESPACE = 540; -const AST_NAME_LIST = 141; -const AST_NEW = 526; -const AST_NULLABLE_TYPE = 2050; -const AST_PARAM = 773; -const AST_PARAM_LIST = 136; -const AST_POST_DEC = 274; -const AST_POST_INC = 273; -const AST_PRE_DEC = 272; -const AST_PRE_INC = 271; -const AST_PRINT = 268; -const AST_PROP = 513; -const AST_PROP_DECL = 138; -const AST_PROP_ELEM = 774; -const AST_PROP_GROUP = 767; -const AST_REF = 280; -const AST_RETURN = 278; -const AST_SHELL_EXEC = 265; -const AST_STATIC = 530; -const AST_STATIC_CALL = 769; -const AST_STATIC_PROP = 514; -const AST_STMT_LIST = 132; -const AST_SWITCH = 534; -const AST_SWITCH_CASE = 535; -const AST_SWITCH_LIST = 134; -const AST_THROW = 283; -const AST_TRAIT_ADAPTATIONS = 142; -const AST_TRAIT_ALIAS = 542; -const AST_TRAIT_PRECEDENCE = 538; -const AST_TRY = 771; -const AST_TYPE = 1; -const AST_UNARY_OP = 270; -const AST_UNPACK = 258; -const AST_UNSET = 277; -const AST_USE = 143; -const AST_USE_ELEM = 541; -const AST_USE_TRAIT = 537; -const AST_VAR = 256; -const AST_WHILE = 531; -const AST_YIELD = 528; -const AST_YIELD_FROM = 275; -} - -namespace ast\flags { -const ARRAY_ELEM_REF = 1; -const ARRAY_SYNTAX_LIST = 1; -const ARRAY_SYNTAX_LONG = 2; -const ARRAY_SYNTAX_SHORT = 3; -const BINARY_ADD = 1; -const BINARY_BITWISE_AND = 10; -const BINARY_BITWISE_OR = 9; -const BINARY_BITWISE_XOR = 11; -const BINARY_BOOL_AND = 259; -const BINARY_BOOL_OR = 258; -const BINARY_BOOL_XOR = 14; -const BINARY_COALESCE = 260; -const BINARY_CONCAT = 8; -const BINARY_DIV = 4; -const BINARY_IS_EQUAL = 17; -const BINARY_IS_GREATER = 256; -const BINARY_IS_GREATER_OR_EQUAL = 257; -const BINARY_IS_IDENTICAL = 15; -const BINARY_IS_NOT_EQUAL = 18; -const BINARY_IS_NOT_IDENTICAL = 16; -const BINARY_IS_SMALLER = 19; -const BINARY_IS_SMALLER_OR_EQUAL = 20; -const BINARY_MOD = 5; -const BINARY_MUL = 3; -const BINARY_POW = 166; -const BINARY_SHIFT_LEFT = 6; -const BINARY_SHIFT_RIGHT = 7; -const BINARY_SPACESHIP = 170; -const BINARY_SUB = 2; -const CLASS_ABSTRACT = 32; -const CLASS_ANONYMOUS = 256; -const CLASS_FINAL = 4; -const CLASS_INTERFACE = 64; -const CLASS_TRAIT = 128; -const CLOSURE_USE_REF = 1; -const EXEC_EVAL = 1; -const EXEC_INCLUDE = 2; -const EXEC_INCLUDE_ONCE = 4; -const EXEC_REQUIRE = 8; -const EXEC_REQUIRE_ONCE = 16; -const FUNC_GENERATOR = 8388608; -const FUNC_RETURNS_REF = 67108864; -const MAGIC_CLASS = 373; -const MAGIC_DIR = 372; -const MAGIC_FILE = 371; -const MAGIC_FUNCTION = 376; -const MAGIC_LINE = 370; -const MAGIC_METHOD = 375; -const MAGIC_NAMESPACE = 389; -const MAGIC_TRAIT = 374; -const MODIFIER_ABSTRACT = 2; -const MODIFIER_FINAL = 4; -const MODIFIER_PRIVATE = 1024; -const MODIFIER_PROTECTED = 512; -const MODIFIER_PUBLIC = 256; -const MODIFIER_STATIC = 1; -const NAME_FQ = 0; -const NAME_NOT_FQ = 1; -const NAME_RELATIVE = 2; -const PARAM_REF = 1; -const PARAM_VARIADIC = 2; -const RETURNS_REF = 67108864; -const TYPE_ARRAY = 7; -const TYPE_BOOL = 16; -const TYPE_CALLABLE = 17; -const TYPE_DOUBLE = 5; -const TYPE_ITERABLE = 18; -const TYPE_LONG = 4; -const TYPE_NULL = 1; -const TYPE_OBJECT = 8; -const TYPE_STRING = 6; -const TYPE_VOID = 19; -const UNARY_BITWISE_NOT = 12; -const UNARY_BOOL_NOT = 13; -const UNARY_MINUS = 262; -const UNARY_PLUS = 261; -const UNARY_SILENCE = 260; -const USE_CONST = 4; -const USE_FUNCTION = 2; -const USE_NORMAL = 1; -} diff --git a/vendor/phan/phan/.phan/internal_stubs/ctype.phan_php b/vendor/phan/phan/.phan/internal_stubs/ctype.phan_php deleted file mode 100644 index 19dcfe8..0000000 --- a/vendor/phan/phan/.phan/internal_stubs/ctype.phan_php +++ /dev/null @@ -1,17 +0,0 @@ -<?php -// These stubs were generated by the phan stub generator. -// @phan-stub-for-extension ctype@7.2.0 - -namespace { -function ctype_alnum() {} -function ctype_alpha() {} -function ctype_cntrl() {} -function ctype_digit() {} -function ctype_graph() {} -function ctype_lower() {} -function ctype_print() {} -function ctype_punct() {} -function ctype_space() {} -function ctype_upper() {} -function ctype_xdigit() {} -} diff --git a/vendor/phan/phan/.phan/internal_stubs/igbinary.phan_php b/vendor/phan/phan/.phan/internal_stubs/igbinary.phan_php deleted file mode 100644 index 375ebd5..0000000 --- a/vendor/phan/phan/.phan/internal_stubs/igbinary.phan_php +++ /dev/null @@ -1,8 +0,0 @@ -<?php -// These stubs were generated by the phan stub generator. -// @phan-stub-for-extension igbinary@3.0.0 - -namespace { -function igbinary_serialize($value) {} -function igbinary_unserialize($str) {} -} diff --git a/vendor/phan/phan/.phan/internal_stubs/pcntl.phan_php b/vendor/phan/phan/.phan/internal_stubs/pcntl.phan_php deleted file mode 100644 index 8d0737f..0000000 --- a/vendor/phan/phan/.phan/internal_stubs/pcntl.phan_php +++ /dev/null @@ -1,143 +0,0 @@ -<?php -// These stubs were generated by the phan stub generator. -// @phan-stub-for-extension pcntl@7.2.0RC2 - -namespace { -function pcntl_alarm($seconds) {} -function pcntl_async_signals($on) {} -function pcntl_errno() {} -function pcntl_exec($path, $args = NULL, $envs = NULL) {} -function pcntl_fork() {} -function pcntl_get_last_error() {} -function pcntl_getpriority($pid = NULL, $process_identifier = NULL) {} -function pcntl_setpriority($priority, $pid = NULL, $process_identifier = NULL) {} -function pcntl_signal($signo, $handler, $restart_syscalls = NULL) {} -function pcntl_signal_dispatch() {} -function pcntl_signal_get_handler($signo) {} -function pcntl_sigprocmask($how, $set, &$oldset = NULL) {} -function pcntl_sigtimedwait($set, &$info = NULL, $seconds = NULL, $nanoseconds = NULL) {} -function pcntl_sigwaitinfo($set, &$info = NULL) {} -function pcntl_strerror($errno) {} -function pcntl_wait(&$status, $options = NULL, &$rusage = NULL) {} -function pcntl_waitpid($pid, &$status, $options = NULL, &$rusage = NULL) {} -function pcntl_wexitstatus($status) {} -function pcntl_wifcontinued($status) {} -function pcntl_wifexited($status) {} -function pcntl_wifsignaled($status) {} -function pcntl_wifstopped($status) {} -function pcntl_wstopsig($status) {} -function pcntl_wtermsig($status) {} -const BUS_ADRALN = 1; -const BUS_ADRERR = 2; -const BUS_OBJERR = 3; -const CLD_CONTINUED = 6; -const CLD_DUMPED = 3; -const CLD_EXITED = 1; -const CLD_KILLED = 2; -const CLD_STOPPED = 5; -const CLD_TRAPPED = 4; -const FPE_FLTDIV = 3; -const FPE_FLTINV = 7; -const FPE_FLTOVF = 4; -const FPE_FLTRES = 6; -const FPE_FLTSUB = 8; -const FPE_FLTUND = 7; -const FPE_INTDIV = 1; -const FPE_INTOVF = 2; -const ILL_BADSTK = 8; -const ILL_COPROC = 7; -const ILL_ILLADR = 3; -const ILL_ILLOPC = 1; -const ILL_ILLOPN = 2; -const ILL_ILLTRP = 4; -const ILL_PRVOPC = 5; -const ILL_PRVREG = 6; -const PCNTL_E2BIG = 7; -const PCNTL_EACCES = 13; -const PCNTL_EAGAIN = 11; -const PCNTL_ECHILD = 10; -const PCNTL_EFAULT = 14; -const PCNTL_EINTR = 4; -const PCNTL_EINVAL = 22; -const PCNTL_EIO = 5; -const PCNTL_EISDIR = 21; -const PCNTL_ELIBBAD = 80; -const PCNTL_ELOOP = 40; -const PCNTL_EMFILE = 24; -const PCNTL_ENAMETOOLONG = 36; -const PCNTL_ENFILE = 23; -const PCNTL_ENOENT = 2; -const PCNTL_ENOEXEC = 8; -const PCNTL_ENOMEM = 12; -const PCNTL_ENOTDIR = 20; -const PCNTL_EPERM = 1; -const PCNTL_ESRCH = 3; -const PCNTL_ETXTBSY = 26; -const POLL_ERR = 4; -const POLL_HUP = 6; -const POLL_IN = 1; -const POLL_MSG = 3; -const POLL_OUT = 2; -const POLL_PRI = 5; -const PRIO_PGRP = 1; -const PRIO_PROCESS = 0; -const PRIO_USER = 2; -const SEGV_ACCERR = 2; -const SEGV_MAPERR = 1; -const SIGABRT = 6; -const SIGALRM = 14; -const SIGBABY = 31; -const SIGBUS = 7; -const SIGCHLD = 17; -const SIGCLD = 17; -const SIGCONT = 18; -const SIGFPE = 8; -const SIGHUP = 1; -const SIGILL = 4; -const SIGINT = 2; -const SIGIO = 29; -const SIGIOT = 6; -const SIGKILL = 9; -const SIGPIPE = 13; -const SIGPOLL = 29; -const SIGPROF = 27; -const SIGPWR = 30; -const SIGQUIT = 3; -const SIGRTMAX = 64; -const SIGRTMIN = 34; -const SIGSEGV = 11; -const SIGSTKFLT = 16; -const SIGSTOP = 19; -const SIGSYS = 31; -const SIGTERM = 15; -const SIGTRAP = 5; -const SIGTSTP = 20; -const SIGTTIN = 21; -const SIGTTOU = 22; -const SIGURG = 23; -const SIGUSR1 = 10; -const SIGUSR2 = 12; -const SIGVTALRM = 26; -const SIGWINCH = 28; -const SIGXCPU = 24; -const SIGXFSZ = 25; -const SIG_BLOCK = 0; -const SIG_DFL = 0; -const SIG_ERR = -1; -const SIG_IGN = 1; -const SIG_SETMASK = 2; -const SIG_UNBLOCK = 1; -const SI_ASYNCIO = -4; -const SI_KERNEL = 128; -const SI_MESGQ = -3; -const SI_QUEUE = -1; -const SI_SIGIO = -5; -const SI_TIMER = -2; -const SI_TKILL = -6; -const SI_USER = 0; -const TRAP_BRKPT = 1; -const TRAP_TRACE = 2; -const WCONTINUED = 8; -const WNOHANG = 1; -const WUNTRACED = 2; -} diff --git a/vendor/phan/phan/.phan/internal_stubs/posix.phan_php b/vendor/phan/phan/.phan/internal_stubs/posix.phan_php deleted file mode 100644 index f15927a..0000000 --- a/vendor/phan/phan/.phan/internal_stubs/posix.phan_php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -// These stubs were generated by the phan stub generator. -// @phan-stub-for-extension posix@7.2.0RC2 - -namespace { -function posix_access($file, $mode = NULL) {} -function posix_ctermid() {} -function posix_errno() {} -function posix_get_last_error() {} -function posix_getcwd() {} -function posix_getegid() {} -function posix_geteuid() {} -function posix_getgid() {} -function posix_getgrgid($gid) {} -function posix_getgrnam($name) {} -function posix_getgroups() {} -function posix_getlogin() {} -function posix_getpgid($pid) {} -function posix_getpgrp() {} -function posix_getpid() {} -function posix_getppid() {} -function posix_getpwnam($username) {} -function posix_getpwuid($uid) {} -function posix_getrlimit() {} -function posix_getsid($pid) {} -function posix_getuid() {} -function posix_initgroups($name, $base_group_id) {} -function posix_isatty($fd) {} -function posix_kill($pid, $sig) {} -function posix_mkfifo($pathname, $mode) {} -function posix_mknod($pathname, $mode, $major = NULL, $minor = NULL) {} -function posix_setegid($gid) {} -function posix_seteuid($uid) {} -function posix_setgid($gid) {} -function posix_setpgid($pid, $pgid) {} -function posix_setrlimit($resource, $softlimit, $hardlimit) {} -function posix_setsid() {} -function posix_setuid($uid) {} -function posix_strerror($errno) {} -function posix_times() {} -function posix_ttyname($fd) {} -function posix_uname() {} -const POSIX_F_OK = 0; -const POSIX_RLIMIT_AS = 9; -const POSIX_RLIMIT_CORE = 4; -const POSIX_RLIMIT_CPU = 0; -const POSIX_RLIMIT_DATA = 2; -const POSIX_RLIMIT_FSIZE = 1; -const POSIX_RLIMIT_INFINITY = -1; -const POSIX_RLIMIT_LOCKS = 10; -const POSIX_RLIMIT_MEMLOCK = 8; -const POSIX_RLIMIT_MSGQUEUE = 12; -const POSIX_RLIMIT_NICE = 13; -const POSIX_RLIMIT_NOFILE = 7; -const POSIX_RLIMIT_NPROC = 6; -const POSIX_RLIMIT_RSS = 5; -const POSIX_RLIMIT_RTPRIO = 14; -const POSIX_RLIMIT_RTTIME = 15; -const POSIX_RLIMIT_SIGPENDING = 11; -const POSIX_RLIMIT_STACK = 3; -const POSIX_R_OK = 4; -const POSIX_S_IFBLK = 24576; -const POSIX_S_IFCHR = 8192; -const POSIX_S_IFIFO = 4096; -const POSIX_S_IFREG = 32768; -const POSIX_S_IFSOCK = 49152; -const POSIX_W_OK = 2; -const POSIX_X_OK = 1; -} diff --git a/vendor/phan/phan/.phan/internal_stubs/readline.phan_php b/vendor/phan/phan/.phan/internal_stubs/readline.phan_php deleted file mode 100644 index 0aa53d3..0000000 --- a/vendor/phan/phan/.phan/internal_stubs/readline.phan_php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -// These stubs were generated by the phan stub generator. -// @phan-stub-for-extension readline@7.2.1 - -namespace { -function readline($prompt = NULL) {} -function readline_add_history($prompt) {} -function readline_callback_handler_install($prompt, $callback) {} -function readline_callback_handler_remove() {} -function readline_callback_read_char() {} -function readline_clear_history() {} -function readline_completion_function($funcname) {} -function readline_info($varname = NULL, $newvalue = NULL) {} -function readline_list_history() {} -function readline_read_history($filename = NULL) {} -function readline_redisplay() {} -function readline_write_history($filename = NULL) {} -const READLINE_LIB = 'readline'; -} diff --git a/vendor/phan/phan/.phan/internal_stubs/sysvmsg.phan_php b/vendor/phan/phan/.phan/internal_stubs/sysvmsg.phan_php deleted file mode 100644 index 0180ce4..0000000 --- a/vendor/phan/phan/.phan/internal_stubs/sysvmsg.phan_php +++ /dev/null @@ -1,18 +0,0 @@ -<?php -// These stubs were generated by the phan stub generator. -// @phan-stub-for-extension sysvmsg@7.2.0RC2 - -namespace { -function msg_get_queue($key, $perms = NULL) {} -function msg_queue_exists($key) {} -function msg_receive($queue, $desiredmsgtype, &$msgtype, $maxsize, &$message, $unserialize = NULL, $flags = NULL, &$errorcode = NULL) {} -function msg_remove_queue($queue) {} -function msg_send($queue, $msgtype, $message, $serialize = NULL, $blocking = NULL, &$errorcode = NULL) {} -function msg_set_queue($queue, $data) {} -function msg_stat_queue($queue) {} -const MSG_EAGAIN = 11; -const MSG_ENOMSG = 42; -const MSG_EXCEPT = 4; -const MSG_IPC_NOWAIT = 1; -const MSG_NOERROR = 2; -} diff --git a/vendor/phan/phan/.phan/internal_stubs/sysvsem.phan_php b/vendor/phan/phan/.phan/internal_stubs/sysvsem.phan_php deleted file mode 100644 index 000f3d2..0000000 --- a/vendor/phan/phan/.phan/internal_stubs/sysvsem.phan_php +++ /dev/null @@ -1,10 +0,0 @@ -<?php -// These stubs were generated by the phan stub generator. -// @phan-stub-for-extension sysvsem@7.2.0RC2 - -namespace { -function sem_acquire($sem_identifier, $nowait = NULL) {} -function sem_get($key, $max_acquire = NULL, $perm = NULL, $auto_release = NULL) {} -function sem_release($sem_identifier) {} -function sem_remove($sem_identifier) {} -} diff --git a/vendor/phan/phan/.phan/internal_stubs/sysvshm.phan_php b/vendor/phan/phan/.phan/internal_stubs/sysvshm.phan_php deleted file mode 100644 index ed96d50..0000000 --- a/vendor/phan/phan/.phan/internal_stubs/sysvshm.phan_php +++ /dev/null @@ -1,13 +0,0 @@ -<?php -// These stubs were generated by the phan stub generator. -// @phan-stub-for-extension sysvshm@7.2.0RC2 - -namespace { -function shm_attach($key, $memsize = NULL, $perm = NULL) {} -function shm_detach($shm_identifier) {} -function shm_get_var($id, $variable_key) {} -function shm_has_var($id, $variable_key) {} -function shm_put_var($shm_identifier, $variable_key, $variable) {} -function shm_remove($shm_identifier) {} -function shm_remove_var($id, $variable_key) {} -} diff --git a/vendor/phan/phan/.phan/internal_stubs/xdebug.phan_php b/vendor/phan/phan/.phan/internal_stubs/xdebug.phan_php deleted file mode 100644 index b77eca9..0000000 --- a/vendor/phan/phan/.phan/internal_stubs/xdebug.phan_php +++ /dev/null @@ -1,53 +0,0 @@ -<?php -// These stubs were generated by the phan stub generator. -// @phan-stub-for-extension xdebug@2.5.5 -// (The xdebug stub is included with Phan for use by users affected by phan restarting with xdebug unavailable) - -namespace { -function xdebug_break() {} -function xdebug_call_class($depth = NULL) {} -function xdebug_call_file($depth = NULL) {} -function xdebug_call_function($depth = NULL) {} -function xdebug_call_line($depth = NULL) {} -function xdebug_clear_aggr_profiling_data() {} -function xdebug_code_coverage_started() {} -function xdebug_debug_zval($var) {} -function xdebug_debug_zval_stdout($var) {} -function xdebug_disable() {} -function xdebug_dump_aggr_profiling_data($prefix = NULL) {} -function xdebug_dump_superglobals() {} -function xdebug_enable() {} -function xdebug_get_code_coverage() {} -function xdebug_get_collected_errors($clear = NULL) {} -function xdebug_get_declared_vars() {} -function xdebug_get_formatted_function_stack() {} -function xdebug_get_function_count() {} -function xdebug_get_function_stack() {} -function xdebug_get_headers() {} -function xdebug_get_monitored_functions($clear = NULL) {} -function xdebug_get_profiler_filename() {} -function xdebug_get_stack_depth() {} -function xdebug_get_tracefile_name() {} -function xdebug_is_enabled() {} -function xdebug_memory_usage() {} -function xdebug_peak_memory_usage() {} -function xdebug_print_function_stack($message = NULL, $options = NULL) {} -function xdebug_start_code_coverage($options = NULL) {} -function xdebug_start_error_collection() {} -function xdebug_start_function_monitor($functions_to_monitor) {} -function xdebug_start_trace($fname = NULL, $options = NULL) {} -function xdebug_stop_code_coverage($cleanup = NULL) {} -function xdebug_stop_error_collection() {} -function xdebug_stop_function_monitor() {} -function xdebug_stop_trace() {} -function xdebug_time_index() {} -function xdebug_var_dump($var) {} -const XDEBUG_CC_BRANCH_CHECK = 4; -const XDEBUG_CC_DEAD_CODE = 2; -const XDEBUG_CC_UNUSED = 1; -const XDEBUG_STACK_NO_DESC = 1; -const XDEBUG_TRACE_APPEND = 1; -const XDEBUG_TRACE_COMPUTERIZED = 2; -const XDEBUG_TRACE_HTML = 4; -const XDEBUG_TRACE_NAKED_FILENAME = 8; -} diff --git a/vendor/phan/phan/.phan/plugins/AlwaysReturnPlugin.php b/vendor/phan/phan/.phan/plugins/AlwaysReturnPlugin.php deleted file mode 100644 index e3ea93b..0000000 --- a/vendor/phan/phan/.phan/plugins/AlwaysReturnPlugin.php +++ /dev/null @@ -1,165 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\Analysis\BlockExitStatusChecker; -use Phan\CodeBase; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Method; -use Phan\Language\Type\NullType; -use Phan\Language\Type\VoidType; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeFunctionCapability; -use Phan\PluginV2\AnalyzeMethodCapability; - -/** - * This file checks if a function, closure or method unconditionally returns. - * If the function doesn't have a void return type, - * then this plugin will emit an issue. - * - * It hooks into two events: - * - * - analyzeMethod - * Once all methods are parsed, this method will be called - * on every method in the code base - * - * - analyzeFunction - * Once all functions have been parsed, this method will - * be called on every function in the code base. - * - * A plugin file must - * - * - Contain a class that inherits from \Phan\PluginV2 - * - * - End by returning an instance of that class. - * - * It is assumed without being checked that plugins aren't - * mangling state within the passed code base or context. - * - * Note: When adding new plugins, - * add them to the corresponding section of README.md - */ -final class AlwaysReturnPlugin extends PluginV2 implements - AnalyzeFunctionCapability, - AnalyzeMethodCapability -{ - - /** - * @param CodeBase $code_base - * The code base in which the method exists - * - * @param Method $method - * A method being analyzed - * - * @return void - * - * @override - */ - public function analyzeMethod( - CodeBase $code_base, - Method $method - ) { - $stmts_list = self::getStatementListToAnalyze($method); - if ($stmts_list === null) { - // check for abstract methods, generators, etc. - return; - } - if ($method->getFQSEN() !== $method->getDefiningFQSEN()) { - // Check if this was inherited by a descendant class. - return; - } - - if (self::returnTypeOfFunctionLikeAllowsNull($method)) { - return; - } - if (!BlockExitStatusChecker::willUnconditionallyThrowOrReturn($stmts_list)) { - if (!$method->checkHasSuppressIssueAndIncrementCount('PhanPluginAlwaysReturnMethod')) { - self::emitIssue( - $code_base, - $method->getContext(), - 'PhanPluginAlwaysReturnMethod', - "Method {METHOD} has a return type of {TYPE}, but may fail to return a value", - [(string)$method->getFQSEN(), (string)$method->getUnionType()] - ); - } - } - } - - /** - * @param CodeBase $code_base - * The code base in which the function exists - * - * @param Func $function - * A function or closure being analyzed - * - * @return void - * - * @override - */ - public function analyzeFunction( - CodeBase $code_base, - Func $function - ) { - $stmts_list = self::getStatementListToAnalyze($function); - if ($stmts_list === null) { - // check for abstract methods, generators, etc. - return; - } - - if (self::returnTypeOfFunctionLikeAllowsNull($function)) { - return; - } - if (!BlockExitStatusChecker::willUnconditionallyThrowOrReturn($stmts_list)) { - if (!$function->checkHasSuppressIssueAndIncrementCount('PhanPluginAlwaysReturnFunction')) { - self::emitIssue( - $code_base, - $function->getContext(), - 'PhanPluginAlwaysReturnFunction', - "Function {FUNCTION} has a return type of {TYPE}, but may fail to return a value", - [(string)$function->getFQSEN(), (string)$function->getUnionType()] - ); - } - } - } - - /** - * @param Func|Method $func - * @return ?Node - returns null if there's no statement list to analyze - */ - private static function getStatementListToAnalyze($func) - { - if (!$func->hasNode()) { - return null; - } elseif ($func->getHasYield()) { - // generators always return Generator. - return null; - } - $node = $func->getNode(); - if (!$node) { - return null; - } - return $node->children['stmts']; - } - - /** - * @param FunctionInterface $func - * @return bool - Is void(absence of a return type) an acceptable return type. - * NOTE: projects can customize this as needed. - */ - private static function returnTypeOfFunctionLikeAllowsNull(FunctionInterface $func) : bool - { - $real_return_type = $func->getRealReturnType(); - if (!$real_return_type->isEmpty() && !$real_return_type->isType(VoidType::instance(false))) { - return false; - } - $return_type = $func->getUnionType(); - return ($return_type->isEmpty() - || $return_type->containsNullable() - || $return_type->hasType(VoidType::instance(false)) - || $return_type->hasType(NullType::instance(false))); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new AlwaysReturnPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/DemoPlugin.php b/vendor/phan/phan/.phan/plugins/DemoPlugin.php deleted file mode 100644 index 7e66fd4..0000000 --- a/vendor/phan/phan/.phan/plugins/DemoPlugin.php +++ /dev/null @@ -1,236 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\CodeBase; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\Method; -use Phan\Language\Element\Property; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeClassCapability; -use Phan\PluginV2\AnalyzeFunctionCapability; -use Phan\PluginV2\AnalyzeMethodCapability; -use Phan\PluginV2\AnalyzePropertyCapability; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * This file demonstrates plugins for Phan. - * This Plugin hooks into five events; - * - * - getPostAnalyzeNodeVisitorClassName - * This method returns a class that is called on every AST node from every - * file being analyzed - * - * - analyzeClass - * Once all classes have been parsed, this method will be - * called on every class that is found in the code base - * - * - analyzeMethod - * Once all methods are parsed, this method will be called - * on every method in the code base - * - * - analyzeFunction - * Once all functions have been parsed, this method will - * be called on every function in the code base. - * - * - analyzeProperty - * Once all functions have been parsed, this method will - * be called on every property in the code base. - * - * A plugin file must - * - * - Contain a class that inherits from \Phan\PluginV2 - * and implements one or more `Capability`s. - * - * - End by returning an instance of that class. - * - * It is assumed without being checked that plugins aren't - * mangling state within the passed code base or context. - * - * Note: When adding new plugins, - * add them to the corresponding section of README.md - */ -class DemoPlugin extends PluginV2 implements - AnalyzeClassCapability, - AnalyzeFunctionCapability, - AnalyzeMethodCapability, - PostAnalyzeNodeCapability, - AnalyzePropertyCapability -{ - - /** - * @return string - The name of the visitor that will be called (formerly analyzeNode) - * @override - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return DemoNodeVisitor::class; - } - - /** - * @param CodeBase $code_base - * The code base in which the class exists - * - * @param Clazz $class - * A class being analyzed - * - * @return void - * - * @override - */ - public function analyzeClass( - CodeBase $code_base, - Clazz $class - ) { - // As an example, we test to see if the name of - // the class is `Class`, and emit an issue explain that - // the name is not allowed. - // NOTE: Placeholders can be found in \Phan\Issue::uncolored_format_string_for_replace - if ($class->getName() == 'Class') { - self::emitIssue( - $code_base, - $class->getContext(), - 'DemoPluginClassName', - "Class {CLASS} cannot be called `Class`", - [(string)$class->getFQSEN()] - ); - } - } - - /** - * @param CodeBase $code_base - * The code base in which the method exists - * - * @param Method $method - * A method being analyzed - * - * @return void - * - * @override - */ - public function analyzeMethod( - CodeBase $code_base, - Method $method - ) { - // As an example, we test to see if the name of the - // method is `function`, and emit an issue if it is. - // NOTE: Placeholders can be found in \Phan\Issue::uncolored_format_string_for_replace - if ($method->getName() == 'function') { - self::emitIssue( - $code_base, - $method->getContext(), - 'DemoPluginMethodName', - "Method {METHOD} cannot be called `function`", - [(string)$method->getFQSEN()] - ); - } - } - - /** - * @param CodeBase $code_base - * The code base in which the function exists - * - * @param Func $function - * A function being analyzed - * - * @return void - * - * @override - */ - public function analyzeFunction( - CodeBase $code_base, - Func $function - ) { - // As an example, we test to see if the name of the - // function is `function`, and emit an issue if it is. - if ($function->getName() == 'function') { - self::emitIssue( - $code_base, - $function->getContext(), - 'DemoPluginFunctionName', - "Function {FUNCTION} cannot be called `function`", - [(string)$function->getFQSEN()] - ); - } - } - - /** - * @param CodeBase $code_base - * The code base in which the property exists - * - * @param Property $property - * A property being analyzed - * - * @return void - * - * @override - */ - public function analyzeProperty( - CodeBase $code_base, - Property $property - ) { - // As an example, we test to see if the name of the - // property is `property`, and emit an issue if it is. - if ($property->getName() == 'property') { - self::emitIssue( - $code_base, - $property->getContext(), - 'DemoPluginPropertyName', - "Property {PROPERTY} should not be called `property`", - [(string)$property->getFQSEN()] - ); - } - } -} - -/** - * When __invoke on this class is called with a node, a method - * will be dispatched based on the `kind` of the given node. - * - * Visitors such as this are useful for defining lots of different - * checks on a node based on its kind. - */ -class DemoNodeVisitor extends PluginAwarePostAnalysisVisitor -{ - // Subclasses should declare protected $parent_node_list as an instance property if they need to know the list. - - // @var array<int,Node> - Set after the constructor is called if an instance property with this name is declared - // protected $parent_node_list; - - // A plugin's visitors should NOT implement visit(), unless they need to. - - /** - * @param Node $node - * A node to analyze - * - * @return void - * - * @override - */ - public function visitInstanceof(Node $node) - { - // Debug::printNode($node); - - $class_name = $node->children['class']->children['name'] ?? null; - - // If we can't figure out the name of the class, don't - // bother continuing. - if (!$class_name) { - return; - } - - // As an example, enforce that we cannot call - // instanceof against 'object'. - if ($class_name == 'object') { - $this->emit( - 'PhanPluginInstanceOfObject', - "Cannot call instanceof against `object`" - ); - } - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new DemoPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/DollarDollarPlugin.php b/vendor/phan/phan/.phan/plugins/DollarDollarPlugin.php deleted file mode 100644 index af00477..0000000 --- a/vendor/phan/phan/.phan/plugins/DollarDollarPlugin.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * This plugin checks for occurrences of `$$x`, - * which may be a typo, or behave differently in php 5 vs 7, or be hard to analyze code. - * - * This file demonstrates plugins for Phan. Plugins hook into various events. - * DollarDollarPlugin hooks into one event: - * - * - getPostAnalyzeNodeVisitorClassName - * This method returns a visitor that is called on every AST node from every - * file being analyzed - * - * A plugin file must - * - * - Contain a class that inherits from \Phan\PluginV2 - * - * - End by returning an instance of that class. - * - * It is assumed without being checked that plugins aren't - * mangling state within the passed code base or context. - * - * Note: When adding new plugins, - * add them to the corresponding section of README.md - */ -class DollarDollarPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - - /** - * @return string - name of PluginAwarePostAnalysisVisitor subclass - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return DollarDollarVisitor::class; - } -} - -/** - * When __invoke on this class is called with a node, a method - * will be dispatched based on the `kind` of the given node. - * - * Visitors such as this are useful for defining lots of different - * checks on a node based on its kind. - */ -class DollarDollarVisitor extends PluginAwarePostAnalysisVisitor -{ - - // A plugin's visitors should not override visit() unless they need to. - - /** - * @param Node $node - * A node to analyze - * - * @return void - * @override - */ - public function visitVar(Node $node) - { - if ($node->children['name'] instanceof Node) { - $this->emitPluginIssue( - $this->code_base, - $this->context, - 'PhanPluginDollarDollar', - "$$ Variables are not allowed.", - [] - ); - } - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new DollarDollarPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/DuplicateArrayKeyPlugin.php b/vendor/phan/phan/.phan/plugins/DuplicateArrayKeyPlugin.php deleted file mode 100644 index 57f9e66..0000000 --- a/vendor/phan/phan/.phan/plugins/DuplicateArrayKeyPlugin.php +++ /dev/null @@ -1,305 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\AST\ASTHasher; -use Phan\AST\ASTReverter; -use Phan\AST\UnionTypeVisitor; -use Phan\Issue; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * Checks for duplicate/equivalent array keys and case statements, as well as arrays mixing `key => value, with `value,`. - * - * @see DollarDollarPlugin for generic plugin documentation. - */ -class DuplicateArrayKeyPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - /** - * @return string - name of PluginAwarePostAnalysisVisitor subclass - * @override - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return DuplicateArrayKeyVisitor::class; - } -} - -/** - * This class has visitArray called on all array literals in files to check for potential problems with keys. - * - * When __invoke on this class is called with a node, a method - * will be dispatched based on the `kind` of the given node. - * - * Visitors such as this are useful for defining lots of different - * checks on a node based on its kind. - */ -class DuplicateArrayKeyVisitor extends PluginAwarePostAnalysisVisitor -{ - const HASH_PREFIX = "\x00__phan_dnu_"; - - // Do not define the visit() method unless a plugin has code and needs to visit most/all node types. - - /** - * @param Node $node - * A switch statement's case statement(AST_SWITCH_LIST) node to analyze - * - * @return void - * - * @override - */ - public function visitSwitchList(Node $node) - { - $children = $node->children; - if (count($children) <= 1) { - // This plugin will never emit errors if there are 0 or 1 elements. - return; - } - - $case_constant_set = []; - $values_to_check = []; - foreach ($children as $i => $case_node) { - $case_cond = $case_node->children['cond']; - if ($case_cond === null) { - continue; // This is `default:`. php --syntax-check already checks for duplicates. - } - // Skip array entries without literal keys. (Do it before resolving the key value) - if (!is_scalar($case_cond)) { - $case_cond = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $case_cond)->asSingleScalarValueOrNullOrSelf(); - if (is_object($case_cond)) { - // Skip non-literal keys. - continue; - } - } - if (is_string($case_cond)) { - $cond_key = "s$case_cond"; - $values_to_check[$i] = $case_cond; - } elseif (is_int($case_cond)) { - $cond_key = $case_cond; - $values_to_check[$i] = $case_cond; - } else { - $cond_key = json_encode($case_cond); - if (is_scalar($case_cond)) { - $values_to_check[$i] = $case_cond; - } - } - if (isset($case_constant_set[$cond_key])) { - $normalized_case_cond = self::normalizeSwitchKey($case_cond); - $this->emitPluginIssue( - $this->code_base, - clone($this->context)->withLineNumberStart($case_node->lineno), - 'PhanPluginDuplicateSwitchCase', - "Duplicate/Equivalent switch case({STRING_LITERAL}) detected in switch statement - the later entry will be ignored.", - [(string)$normalized_case_cond], - Issue::SEVERITY_NORMAL, - Issue::REMEDIATION_A, - 15071 - ); - // Add a fake value to indicate loose equality checks are redundant - $values_to_check[-1] = true; - } - $case_constant_set[$cond_key] = $case_node->lineno; - } - if (!isset($values_to_check[-1]) && count($values_to_check) > 1 && !self::areAllSwitchCasesTheSameType($values_to_check)) { - // @phan-suppress-next-line PhanPartialTypeMismatchArgument array keys are integers for switch - $this->extendedLooseEqualityCheck($values_to_check, $children); - } - } - - /** - * @param array<int,mixed> $values_to_check scalar constant values of case statements - */ - private static function areAllSwitchCasesTheSameType(array $values_to_check) : bool - { - $categories = 0; - foreach ($values_to_check as $value) { - if (is_int($value)) { - $categories |= 1; - if ($categories !== 1) { - return false; - } - } elseif (is_string($value)) { - if (is_numeric($value)) { - // This includes float-like strings such as `"1e0"`, which adds ambiguity ("1e0" == "1") - return false; - } - $categories |= 2; - if ($categories !== 2) { - return false; - } - } else { - return false; - } - } - return true; - } - - /** - * Perform a heuristic check if any element is `==` a previous element. - * - * This is intended to perform well for large arrays. - * - * TODO: Do a better job for small arrays. - * - * @return void - * @param array<int,mixed> $values_to_check - * @param array<int,mixed> $children an array of scalars - */ - private function extendedLooseEqualityCheck(array $values_to_check, $children) - { - $numeric_set = []; - $fuzzy_numeric_set = []; - foreach ($values_to_check as $i => $value) { - if (is_numeric($value)) { - // For `"1"`, search for `"1foo"`, `"1bar"`, etc. - $value = is_float($value) ? $value : filter_var($value, FILTER_VALIDATE_FLOAT); - $old_index = $numeric_set[$value] ?? $fuzzy_numeric_set[$value] ?? null; - $numeric_set[$value] = $i; - } else { - $value = (float)$value; - // For `"1foo"`, search for `1` but not `"1bar"` - $old_index = $numeric_set[$value] ?? null; - // @phan-suppress-next-line PhanTypeMismatchDimAssignment - $fuzzy_numeric_set[$value] = $i; - } - if ($old_index !== null) { - $this->emitPluginIssue( - $this->code_base, - clone($this->context)->withLineNumberStart($children[$i]->lineno), - 'PhanPluginDuplicateSwitchCaseLooseEquality', - "Switch case({STRING_LITERAL}) is loosely equivalent (==) to an earlier case ({STRING_LITERAL}) in switch statement - the earlier entry may be chosen instead.", - [self::normalizeSwitchKey($values_to_check[$i]), self::normalizeSwitchKey($values_to_check[$old_index])], - Issue::SEVERITY_NORMAL, - Issue::REMEDIATION_A, - 15072 - ); - } - } - } - - /** - * @param Node $node - * An array literal(AST_ARRAY) node to analyze - * - * @return void - * - * @override - */ - public function visitArray(Node $node) - { - $children = $node->children; - if (count($children) <= 1) { - // This plugin will never emit errors if there are 0 or 1 elements. - return; - } - - $has_entry_without_key = false; - $key_set = []; - foreach ($children as $entry) { - if ($entry === null) { - continue; // Triggered by code such as `list(, $a) = $expr`. In php 7.1, the array and list() syntax was unified. - } - $key = $entry->children['key']; - // Skip array entries without literal keys. (Do it before resolving the key value) - if ($key === null) { - $has_entry_without_key = true; - continue; - } - if (!is_scalar($key)) { - $key = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $key)->asSingleScalarValueOrNullOrSelf(); - if (is_object($key)) { - $key = self::HASH_PREFIX . ASTHasher::hash($entry->children['key']); - } - } - - if (isset($key_set[$key])) { - // @phan-suppress-next-line PhanPartialTypeMismatchArgument - $this->warnAboutDuplicateArrayKey($node, $entry, $key); - } - // @phan-suppress-next-line PhanTypeMismatchDimAssignment - $key_set[$key] = true; - } - if ($has_entry_without_key && count($key_set) > 0) { - // This is probably a typo in most codebases. (e.g. ['foo' => 'bar', 'baz']) - // In phan, InternalFunctionSignatureMap.php does this deliberately with the first parameter being the return type. - $this->emit( - 'PhanPluginMixedKeyNoKey', - "Should not mix array entries of the form [key => value,] with entries of the form [value,].", - [], - Issue::SEVERITY_NORMAL, - Issue::REMEDIATION_A, - 15071 - ); - } - } - - /** - * @param int|string|float|bool|null $key - */ - private function warnAboutDuplicateArrayKey(Node $node, Node $entry, $key) - { - if (is_string($key) && strncmp($key, self::HASH_PREFIX, strlen(self::HASH_PREFIX)) === 0) { - $this->emitPluginIssue( - $this->code_base, - clone($this->context)->withLineNumberStart($entry->lineno ?? $node->lineno), - 'PhanPluginDuplicateArrayKeyExpression', - "Duplicate dynamic array key expression ({CODE}) detected in array - the earlier entry will be ignored if the expression had the same value.", - [ASTReverter::toShortString($entry->children['key'])], - Issue::SEVERITY_NORMAL, - Issue::REMEDIATION_A, - 15071 - ); - return; - } - $normalized_key = self::normalizeKey($key); - $this->emitPluginIssue( - $this->code_base, - clone($this->context)->withLineNumberStart($entry->lineno ?? $node->lineno), - 'PhanPluginDuplicateArrayKey', - "Duplicate/Equivalent array key value({STRING_LITERAL}) detected in array - the earlier entry will be ignored.", - [(string)$normalized_key], - Issue::SEVERITY_NORMAL, - Issue::REMEDIATION_A, - 15071 - ); - } - - /** - * Converts a key to the value it would be if used as a case. - * E.g. 0, 0.5, and "0" all become the same value(0) when used as an array key. - * - * @param int|string|float|bool|null $key - The array key literal to be normalized. - * @return string - The normalized representation. - */ - private static function normalizeSwitchKey($key) : string - { - if (is_int($key)) { - return (string)$key; - } elseif (!is_string($key)) { - return (string)json_encode($key); - } - $tmp = [$key => true]; - return ASTReverter::toShortString(key($tmp)); - } - - /** - * Converts a key to the value it would be if used as an array key. - * E.g. 0, 0.5, and "0" all become the same value(0) when used as an array key. - * - * @param int|string|float|bool|null $key - The array key literal to be normalized. - * @return string - The normalized representation. - */ - private static function normalizeKey($key) - { - if (is_int($key)) { - return (string)$key; - } - $tmp = [$key => true]; - return ASTReverter::toShortString(key($tmp)); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new DuplicateArrayKeyPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/DuplicateExpressionPlugin.php b/vendor/phan/phan/.phan/plugins/DuplicateExpressionPlugin.php deleted file mode 100644 index 7daef04..0000000 --- a/vendor/phan/phan/.phan/plugins/DuplicateExpressionPlugin.php +++ /dev/null @@ -1,380 +0,0 @@ -<?php -declare(strict_types=1); - -use ast\flags; -use ast\Node; -use Phan\Analysis\PostOrderAnalysisVisitor; -use Phan\AST\ASTHasher; -use Phan\AST\ASTReverter; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * This plugin checks for duplicate expressions in a statement - * that are likely to be a bug. - * - * - E.g. `expr1 == expr1` - * - * This file demonstrates plugins for Phan. Plugins hook into various events. - * DuplicateExpressionPlugin hooks into one event: - * - * - getPostAnalyzeNodeVisitorClassName - * This method returns a visitor that is called on every AST node from every - * file being analyzed - * - * A plugin file must - * - * - Contain a class that inherits from \Phan\PluginV2 - * - * - End by returning an instance of that class. - * - * It is assumed without being checked that plugins aren't - * mangling state within the passed code base or context. - * - * Note: When adding new plugins, - * add them to the corresponding section of README.md - */ -class DuplicateExpressionPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - - /** - * @return string - name of PluginAwarePostAnalysisVisitor subclass - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return RedundantNodeVisitor::class; - } -} - -/** - * This visitor analyzes node kinds that can be the root of expressions - * containing duplicate expressions. - */ -class RedundantNodeVisitor extends PluginAwarePostAnalysisVisitor -{ - /** - * These are types of binary operations for which it is - * likely to be a typo if both the left and right-hand sides - * of the operation are the same. - */ - const REDUNDANT_BINARY_OP_SET = [ - flags\BINARY_BOOL_AND => true, - flags\BINARY_BOOL_OR => true, - flags\BINARY_BOOL_XOR => true, - flags\BINARY_BITWISE_OR => true, - flags\BINARY_BITWISE_AND => true, - flags\BINARY_BITWISE_XOR => true, - flags\BINARY_SUB => true, - flags\BINARY_DIV => true, - flags\BINARY_MOD => true, - flags\BINARY_IS_IDENTICAL => true, - flags\BINARY_IS_NOT_IDENTICAL => true, - flags\BINARY_IS_EQUAL => true, - flags\BINARY_IS_NOT_EQUAL => true, - flags\BINARY_IS_SMALLER => true, - flags\BINARY_IS_SMALLER_OR_EQUAL => true, - flags\BINARY_IS_GREATER => true, - flags\BINARY_IS_GREATER_OR_EQUAL => true, - flags\BINARY_SPACESHIP => true, - flags\BINARY_COALESCE => true, - ]; - - /** - * A subset of REDUNDANT_BINARY_OP_SET. - * - * These binary operations will make this plugin warn if both sides are literals. - */ - const BINARY_OP_BOTH_LITERAL_WARN_SET = [ - flags\BINARY_BOOL_AND => true, - flags\BINARY_BOOL_OR => true, - flags\BINARY_BOOL_XOR => true, - flags\BINARY_IS_IDENTICAL => true, - flags\BINARY_IS_NOT_IDENTICAL => true, - flags\BINARY_IS_EQUAL => true, - flags\BINARY_IS_NOT_EQUAL => true, - flags\BINARY_IS_SMALLER => true, - flags\BINARY_IS_SMALLER_OR_EQUAL => true, - flags\BINARY_IS_GREATER => true, - flags\BINARY_IS_GREATER_OR_EQUAL => true, - flags\BINARY_SPACESHIP => true, - flags\BINARY_COALESCE => true, - ]; - - /** - * @param Node $node - * A binary operation node to analyze - * - * @return void - * @override - * @suppress PhanAccessClassConstantInternal - */ - public function visitBinaryOp(Node $node) - { - $flags = $node->flags; - if (!\array_key_exists($flags, self::REDUNDANT_BINARY_OP_SET)) { - // Nothing to warn about - return; - } - $left = $node->children['left']; - $right = $node->children['right']; - if (ASTHasher::hash($left) === ASTHasher::hash($right)) { - $this->emitPluginIssue( - $this->code_base, - $this->context, - 'PhanPluginDuplicateExpressionBinaryOp', - 'Both sides of the binary operator {OPERATOR} are the same: {CODE}', - [ - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags], - ASTReverter::toShortString($left), - ] - ); - return; - } - if (!\array_key_exists($flags, self::BINARY_OP_BOTH_LITERAL_WARN_SET)) { - return; - } - if ($left instanceof Node) { - $left = self::resolveLiteralValue($left); - if ($left instanceof Node) { - return; - } - } - if ($right instanceof Node) { - $right = self::resolveLiteralValue($right); - if ($right instanceof Node) { - return; - } - } - $this->emitPluginIssue( - $this->code_base, - $this->context, - 'PhanPluginBothLiteralsBinaryOp', - 'Suspicious usage of a binary operator where both operands are literals. Expression: {CODE} {OPERATOR} {CODE} (result is {CODE})', - [ - ASTReverter::toShortString($left), - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$flags], - ASTReverter::toShortString($right), - ASTReverter::toShortString(self::computeResultForBothLiteralsWarning($left, $right, $flags)), - ] - ); - } - - /** - * @param Node $node - * An assignment operation node to analyze - * - * @return void - * @override - */ - public function visitAssignRef(Node $node) - { - $this->visitAssign($node); - } - - /** - * @param Node $node - * An assignment operation node to analyze - * - * @return void - * @override - */ - public function visitAssign(Node $node) - { - $var = $node->children['var']; - $expr = $node->children['expr']; - if (ASTHasher::hash($var) === ASTHasher::hash($expr)) { - $this->emitPluginIssue( - $this->code_base, - $this->context, - 'PhanPluginDuplicateExpressionAssignment', - 'Both sides of the assignment {OPERATOR} are the same: {CODE}', - [ - $node->kind === ast\AST_ASSIGN_REF ? '=&' : '=', - ASTReverter::toShortString($var), - ] - ); - return; - } - } - - /** - * Compute result of a binary operator for a PhanPluginBothLiteralsBinaryOp warning - * @param int|string|float|bool|null $left left hand side of operation - * @param int|string|float|bool|null $right right hand side of operation - * @param int $flags - * @return int|string|float|bool|null - */ - private static function computeResultForBothLiteralsWarning($left, $right, int $flags) - { - switch ($flags) { - case flags\BINARY_BOOL_AND: - return $left && $right; - case flags\BINARY_BOOL_OR: - return $left || $right; - case flags\BINARY_BOOL_XOR: - return $left xor $right; - case flags\BINARY_IS_IDENTICAL: - return $left === $right; - case flags\BINARY_IS_NOT_IDENTICAL: - return $left !== $right; - case flags\BINARY_IS_EQUAL: - return $left == $right; - case flags\BINARY_IS_NOT_EQUAL: - return $left != $right; - case flags\BINARY_IS_SMALLER: - return $left < $right; - case flags\BINARY_IS_SMALLER_OR_EQUAL: - return $left <= $right; - case flags\BINARY_IS_GREATER: - return $left > $right; - case flags\BINARY_IS_GREATER_OR_EQUAL: - return $left >= $right; - case flags\BINARY_SPACESHIP: - return $left <=> $right; - case flags\BINARY_COALESCE: - return $left ?? $right; - default: - return '(unknown)'; - } - } - - /** - * @return int|string|float|bool|null|Node the resolved value of $node, or $node if it could not be resolved - */ - private static function resolveLiteralValue(Node $node) - { - if ($node->kind !== ast\AST_CONST) { - return $node; - } - // @phan-suppress-next-line PhanPartialTypeMismatchArgumentInternal - switch (\strtolower($node->children['name']->children['name'] ?? null)) { - case 'false': - return false; - case 'true': - return true; - case 'null': - return null; - default: - return $node; - } - } - - /** - * @param Node $node - * A binary operation node to analyze - * - * @return void - * @override - */ - public function visitConditional(Node $node) - { - $cond_node = $node->children['cond']; - $true_node_hash = ASTHasher::hash($node->children['true']); - - if (ASTHasher::hash($cond_node) === $true_node_hash) { - $this->emitPluginIssue( - $this->code_base, - $this->context, - 'PhanPluginDuplicateConditionalTernaryDuplication', - '"X ? X : Y" can usually be simplified to "X ?: Y". The duplicated expression X was {CODE}', - [ASTReverter::toShortString($cond_node)] - ); - return; - } - if (!$cond_node instanceof Node) { - return; - } - switch ($cond_node->kind) { - case ast\AST_ISSET: - if (ASTHasher::hash($cond_node->children['var']) === $true_node_hash) { - $this->warnDuplicateConditionalNullCoalescing('isset(X) ? X : Y', $node->children['true']); - } - break; - case ast\AST_BINARY_OP: - $this->checkBinaryOpOfConditional($cond_node, $true_node_hash); - break; - case ast\AST_UNARY_OP: - $this->checkUnaryOpOfConditional($cond_node, $true_node_hash); - break; - } - } - - /** - * @param int|string $true_node_hash - */ - private function checkBinaryOpOfConditional(Node $cond_node, $true_node_hash) - { - if ($cond_node->flags !== ast\flags\BINARY_IS_NOT_IDENTICAL) { - return; - } - $left_node = $cond_node->children['left']; - $right_node = $cond_node->children['right']; - if (self::isNullConstantNode($left_node)) { - if (ASTHasher::hash($right_node) === $true_node_hash) { - $this->warnDuplicateConditionalNullCoalescing('null !== X ? X : Y', $right_node); - } - } elseif (self::isNullConstantNode($right_node)) { - if (ASTHasher::hash($left_node) === $true_node_hash) { - $this->warnDuplicateConditionalNullCoalescing('X !== null ? X : Y', $left_node); - } - } - } - - /** - * @param int|string $true_node_hash - */ - private function checkUnaryOpOfConditional(Node $cond_node, $true_node_hash) - { - if ($cond_node->flags !== ast\flags\UNARY_BOOL_NOT) { - return; - } - $expr = $cond_node->children['expr']; - if (!$expr instanceof Node) { - return; - } - if ($expr->kind === ast\AST_CALL) { - $function = $expr->children['expr']; - if ($function->kind !== ast\AST_NAME || strcasecmp((string)($function->children['name'] ?? ''), 'is_null') !== 0) { - return; - } - $args = $expr->children['args']->children; - if (count($args) !== 1) { - return; - } - if (ASTHasher::hash($args[0]) === $true_node_hash) { - $this->warnDuplicateConditionalNullCoalescing('!is_null(X) ? X : Y', $args[0]); - } - } - } - - /** - * @param Node|mixed $node - */ - private static function isNullConstantNode($node) : bool - { - if (!$node instanceof Node) { - return false; - } - return $node->kind === ast\AST_CONST && strcasecmp((string)$node->children['name']->children['name'] ?? '', 'null') === 0; - } - - /** - * @param ?(Node|string|int|float) $x_node - */ - private function warnDuplicateConditionalNullCoalescing(string $expr, $x_node) - { - $this->emitPluginIssue( - $this->code_base, - $this->context, - 'PhanPluginDuplicateConditionalNullCoalescing', - '"' . $expr . '" can usually be simplified to "X ?? Y" in PHP 7. The duplicated expression X was {CODE}', - [ASTReverter::toShortString($x_node)] - ); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. - -return new DuplicateExpressionPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/FFIAnalysisPlugin.php b/vendor/phan/phan/.phan/plugins/FFIAnalysisPlugin.php deleted file mode 100644 index 1272a0d..0000000 --- a/vendor/phan/phan/.phan/plugins/FFIAnalysisPlugin.php +++ /dev/null @@ -1,154 +0,0 @@ -<?php -declare(strict_types=1); - -use ast\Node; -use Phan\Language\Element\Variable; -use Phan\Language\UnionType; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PluginAwarePreAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; -use Phan\PluginV2\PreAnalyzeNodeCapability; - -/** - * This plugin modifies Phan's analysis of code using FFI\CData variables. - * - * A plugin file must - * - * - Contain a class that inherits from \Phan\PluginV2 - * - * - End by returning an instance of that class. - * - * It is assumed without being checked that plugins aren't - * mangling state within the passed code base or context. - * - * - This plugin does mangle state because FFI\CData is typical - * - * Note: When adding new plugins, - * add them to the corresponding section of README.md - */ -class FFIAnalysisPlugin extends PluginV2 implements PostAnalyzeNodeCapability, PreAnalyzeNodeCapability -{ - /** - * @return class-string - name of PluginAwarePostAnalysisVisitor subclass - * @override - */ - public static function getPreAnalyzeNodeVisitorClassName() : string - { - return FFIPreAnalysisVisitor::class; - } - - /** - * @return class-string - name of PluginAwarePostAnalysisVisitor subclass - * @override - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return FFIPostAnalysisVisitor::class; - } -} - -/** - * This visitor records FFI\CData types if the original value was FFI\CData - */ -class FFIPreAnalysisVisitor extends PluginAwarePreAnalysisVisitor -{ - /** - * @override - * @param Node $node a node of kind ast\AST_ASSIGN - * @return void - */ - public function visitAssign(Node $node) - { - $left = $node->children['var']; - if (!($left instanceof Node)) { - return; - } - if ($left->kind !== ast\AST_VAR) { - return; - } - $var_name = $left->children['name']; - if (!is_string($var_name)) { - return; - } - $scope = $this->context->getScope(); - if (!$scope->hasVariableWithName($var_name)) { - return; - } - $var = $scope->getVariableByName($var_name); - $category = self::containsFFICDataType($var->getUnionType()); - if (!$category) { - return; - } - // @phan-suppress-next-line PhanUndeclaredProperty - $node->is_ffi = $category; - } - - const PARTIALLY_FFI_CDATA = 1; - const ENTIRELY_FFI_CDATA = 2; - - /** - * Check if the type contains FFI\CData - */ - private static function containsFFICDataType(UnionType $union_type) : int - { - foreach ($union_type->getTypeSet() as $type) { - if (strcasecmp('\FFI', $type->getNamespace()) !== 0) { - continue; - } - if (strcasecmp('CData', $type->getName()) !== 0) { - continue; - } - if ($type->getIsNullable()) { - return self::PARTIALLY_FFI_CDATA; - } - if ($union_type->typeCount() > 1) { - return self::PARTIALLY_FFI_CDATA; - } - return self::ENTIRELY_FFI_CDATA; - } - return 0; - } -} - -/** - * This visitor restores FFI\CData types after assignments if the original value was FFI\CData - */ -class FFIPostAnalysisVisitor extends PluginAwarePostAnalysisVisitor -{ - /** - * @return void - * @override - */ - public function visitAssign(Node $node) - { - // @phan-suppress-next-line PhanUndeclaredProperty - if (isset($node->is_ffi)) { - $this->analyzeFFIAssign($node); - } - } - - private function analyzeFFIAssign(Node $node) - { - $var_name = $node->children['var']->children['name'] ?? null; - if (!is_string($var_name)) { - return; - } - $cdata_type = UnionType::fromFullyQualifiedString('\FFI\CData'); - $scope = $this->context->getScope(); - // @phan-suppress-next-line PhanUndeclaredProperty - if ($node->is_ffi !== FFIPreAnalysisVisitor::ENTIRELY_FFI_CDATA) { - if ($scope->hasVariableWithName($var_name)) { - $cdata_type = $cdata_type->withUnionType($scope->getVariableByName($var_name)->getUnionType()); - } - } - $this->context->getScope()->addVariable( - new Variable($this->context, $var_name, $cdata_type, 0) - ); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. - -return new FFIAnalysisPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/HasPHPDocPlugin.php b/vendor/phan/phan/.phan/plugins/HasPHPDocPlugin.php deleted file mode 100644 index 78ac9e0..0000000 --- a/vendor/phan/phan/.phan/plugins/HasPHPDocPlugin.php +++ /dev/null @@ -1,273 +0,0 @@ -<?php declare(strict_types=1); - -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\MarkupDescription; -use Phan\Language\Element\Method; -use Phan\Language\Element\Property; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeClassCapability; -use Phan\PluginV2\AnalyzeFunctionCapability; -use Phan\PluginV2\AnalyzeMethodCapability; -use Phan\PluginV2\AnalyzePropertyCapability; - -/** - * This file checks if an element (class or property) has a PHPDoc comment, - * and that Phan can extract a plaintext summary/description from that comment. - * - * (e.g. for generating a hover description in the language server) - * - * It hooks into these events: - * - * - analyzeClass - * Once all classes are parsed, this method will be called - * on every method in the code base - * - * - analyzeProperty - * Once all functions have been parsed, this method will - * be called on every property in the code base. - * - * A plugin file must - * - * - Contain a class that inherits from \Phan\PluginV2 - * - * - End by returning an instance of that class. - * - * It is assumed without being checked that plugins aren't - * mangling state within the passed code base or context. - * - * Note: When adding new plugins, - * add them to the corresponding section of README.md - */ -final class HasPHPDocPlugin extends PluginV2 implements - AnalyzeClassCapability, - AnalyzeFunctionCapability, - AnalyzeMethodCapability, - AnalyzePropertyCapability -{ - /** - * @param CodeBase $code_base - * The code base in which the class exists - * - * @param Clazz $class - * A class being analyzed - * - * @return void - * - * @override - */ - public function analyzeClass( - CodeBase $code_base, - Clazz $class - ) { - if ($class->isAnonymous()) { - // Probably not useful in many cases to document a short anonymous class. - return; - } - $doc_comment = $class->getDocComment(); - if (!$doc_comment) { - self::emitIssue( - $code_base, - $class->getContext(), - 'PhanPluginNoCommentOnClass', - 'Class {CLASS} has no doc comment', - [$class->getFQSEN()] - ); - return; - } - $description = MarkupDescription::extractDescriptionFromDocComment($class); - if (!$description) { - self::emitIssue( - $code_base, - $class->getContext(), - 'PhanPluginDescriptionlessCommentOnClass', - 'Class {CLASS} has no readable description: {STRING_LITERAL}', - [$class->getFQSEN(), self::getDocCommentRepresentation($doc_comment)] - ); - return; - } - } - - /** - * @param CodeBase $code_base - * The code base in which the property exists - * - * @param Property $property - * A property being analyzed - * - * @return void - * - * @override - */ - public function analyzeProperty( - CodeBase $code_base, - Property $property - ) { - if ($property->isDynamicProperty()) { - // And dynamic properties don't have phpdoc. - return; - } - if ($property->isFromPHPDoc()) { - // Phan does not track descriptions of (at)property. - return; - } - if ($property->getFQSEN() !== $property->getRealDefiningFQSEN()) { - // Only warn once for the original definition of this property. - // Don't warn about subclasses inheriting this property. - return; - } - $doc_comment = $property->getDocComment(); - if (!$doc_comment) { - $visibility_upper = ucfirst($property->getVisibilityName()); - self::emitIssue( - $code_base, - $property->getContext(), - "PhanPluginNoCommentOn${visibility_upper}Property", - "$visibility_upper property {PROPERTY} has no doc comment", - [$property->getRepresentationForIssue()] - ); - return; - } - $description = MarkupDescription::extractDescriptionFromDocComment($property); - if (!$description) { - $visibility_upper = ucfirst($property->getVisibilityName()); - self::emitIssue( - $code_base, - $property->getContext(), - "PhanPluginDescriptionlessCommentOn${visibility_upper}Property", - "$visibility_upper property {PROPERTY} has no readable description: {STRING_LITERAL}", - [$property->getRepresentationForIssue(), self::getDocCommentRepresentation($doc_comment)] - ); - return; - } - } - - /** - * @param CodeBase $code_base - * The code base in which the method exists - * - * @param Method $method - * A method being analyzed - * - * @return void - * - * @override - */ - public function analyzeMethod( - CodeBase $code_base, - Method $method - ) { - if ($method->isFromPHPDoc()) { - // Phan does not track descriptions of (at)method. - return; - } - if ($method->getIsMagic()) { - // Don't require a description for `__construct()`, `__sleep()`, etc. - return; - } - if ($method->getFQSEN() !== $method->getRealDefiningFQSEN()) { - // Only warn once for the original definition of this method. - // Don't warn about subclasses inheriting this method. - return; - } - if ($method->getIsOverride()) { - // Note: This deliberately avoids requiring a summary for methods that are just overrides of other methods - // This reduces the number of false positives - return; - } - $method_filter = Config::getValue('plugin_config')['has_phpdoc_method_ignore_regex'] ?? null; - if (is_string($method_filter)) { - $fqsen_string = ltrim((string)$method->getFQSEN(), '\\'); - if (preg_match($method_filter, $fqsen_string) > 0) { - return; - } - } - - $doc_comment = $method->getDocComment(); - if (!$doc_comment) { - $visibility_upper = ucfirst($method->getVisibilityName()); - self::emitIssue( - $code_base, - $method->getContext(), - "PhanPluginNoCommentOn${visibility_upper}Method", - "$visibility_upper method {METHOD} has no doc comment", - [$method->getFQSEN()] - ); - return; - } - $description = MarkupDescription::extractDescriptionFromDocComment($method); - if (!$description) { - $visibility_upper = ucfirst($method->getVisibilityName()); - self::emitIssue( - $code_base, - $method->getContext(), - "PhanPluginDescriptionlessCommentOn${visibility_upper}Method", - "$visibility_upper method {METHOD} has no readable description: {STRING_LITERAL}", - [$method->getFQSEN(), self::getDocCommentRepresentation($doc_comment)] - ); - return; - } - } - - /** - * @param CodeBase $code_base - * The code base in which the function exists - * - * @param Func $function - * A function being analyzed - * - * @return void - * - * @override - */ - public function analyzeFunction( - CodeBase $code_base, - Func $function - ) { - $doc_comment = $function->getDocComment(); - if ($function->isPHPInternal()) { - // This isn't user-defined, there's no reason to warn or way to change it. - return; - } - if ($function->isNSInternal($code_base)) { - // (at)internal are internal to the library, and there's less of a need to document them - return; - } - if ($function->isClosure()) { - // Probably not useful in many cases to document a short closure passed to array_map, etc. - return; - } - if (!$doc_comment) { - self::emitIssue( - $code_base, - $function->getContext(), - "PhanPluginNoCommentOnFunction", - "Function {FUNCTION} has no doc comment", - [$function->getFQSEN()] - ); - return; - } - $description = MarkupDescription::extractDescriptionFromDocComment($function); - if (!$description) { - self::emitIssue( - $code_base, - $function->getContext(), - "PhanPluginDescriptionlessCommentOnFunction", - "Function {FUNCTION} has no readable description: {STRING_LITERAL}", - [$function->getFQSEN(), self::getDocCommentRepresentation($doc_comment)] - ); - return; - } - } - - private static function getDocCommentRepresentation(string $doc_comment) : string - { - return (string)json_encode(MarkupDescription::getDocCommentWithoutWhitespace($doc_comment), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new HasPHPDocPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/InvalidVariableIssetPlugin.php b/vendor/phan/phan/.phan/plugins/InvalidVariableIssetPlugin.php deleted file mode 100644 index 66ddd9b..0000000 --- a/vendor/phan/phan/.phan/plugins/InvalidVariableIssetPlugin.php +++ /dev/null @@ -1,100 +0,0 @@ -<?php declare(strict_types=1); - -// .phan/plugins/InvalidVariableIssetPlugin.php - -use ast\Node; -use Phan\Language\Context; -use Phan\Language\Element\Variable; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * This plugin detects undeclared variables within isset() checks. - */ -class InvalidVariableIssetPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - - /** - * @return string - name of PluginAwarePostAnalysisVisitor subclass - * - * @override - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return InvalidVariableIssetVisitor::class; - } -} - -/** - * This plugin checks isset nodes (\ast\AST_ISSET) to see if they contain undeclared variables - */ -class InvalidVariableIssetVisitor extends PluginAwarePostAnalysisVisitor -{ - - /** define classes to parse */ - const CLASSES = [ - ast\AST_STATIC_CALL, - ast\AST_STATIC_PROP, - ]; - - /** define expression to parse */ - const EXPRESSIONS = [ - ast\AST_CALL, - ast\AST_DIM, - ast\AST_INSTANCEOF, - ast\AST_METHOD_CALL, - ast\AST_PROP, - ]; - - // A plugin's visitors should not override visit() unless they need to. - - /** @override */ - public function visitIsset(Node $node) : Context - { - $argument = $node->children['var']; - $variable = $argument; - - // get variable name from argument - while (!isset($variable->children['name'])) { - if (in_array($variable->kind, self::EXPRESSIONS, true)) { - $variable = $variable->children['expr']; - } elseif (in_array($variable->kind, self::CLASSES, true)) { - $variable = $variable->children['class']; - } else { - return $this->context; - } - } - $name = $variable->children['name']; - - // emit issue if name is not declared - // Check for edge cases such as isset($$var) - if (is_string($name) && $name) { - if (!Variable::isHardcodedVariableInScopeWithName($name, $this->context->isInGlobalScope()) && - !$this->context->getScope()->hasVariableWithName($name)) { - $this->emit( - 'PhanPluginUndeclaredVariableIsset', - 'undeclared variable ${VARIABLE} in isset()', - [$name] - ); - } - } elseif ($argument->kind !== ast\AST_VAR) { - // emit issue if argument is not array access - $this->emit( - 'PhanPluginInvalidVariableIsset', - "non array/property access in isset()", - [] - ); - } elseif (!is_string($name)) { - // emit issue if argument is not array access - $this->emit( - 'PhanPluginComplexVariableInIsset', - "Unanalyzable complex variable expression in isset", - [] - ); - } - return $this->context; - } -} - -return new InvalidVariableIssetPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/InvokePHPNativeSyntaxCheckPlugin.php b/vendor/phan/phan/.phan/plugins/InvokePHPNativeSyntaxCheckPlugin.php deleted file mode 100644 index 067f585..0000000 --- a/vendor/phan/phan/.phan/plugins/InvokePHPNativeSyntaxCheckPlugin.php +++ /dev/null @@ -1,367 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Context; -use Phan\PluginV2; -use Phan\PluginV2\AfterAnalyzeFileCapability; -use Phan\PluginV2\BeforeAnalyzeFileCapability; -use Phan\PluginV2\FinalizeProcessCapability; - -/** - * This plugin invokes the equivalent of `php --no-php-ini --syntax-check $analyzed_file_path`. - * - * php-ast reports syntax errors, but does not report all **semantic** errors that `php --syntax-check` would detect. - * - * Note that loading PHP modules would slow down analysis, so this plugin adds `--no-php-ini`. - * - * NOTE: This may not work in languages other than english. - * NOTE: .phan/config.php can contain a config to override the PHP binary/binaries used - * This can replace the default binary (PHP_BINARY) with an array of absolute path or program names(in $PATH) - * E.g. have 'plugin_config' => ['php_native_syntax_check_binaries' => ['php72', 'php70', 'php56']] - * Note: This may cause Phan to take over twice as long. This is recommended for use with `--processes N`. - * - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class InvokePHPNativeSyntaxCheckPlugin extends PluginV2 implements - AfterAnalyzeFileCapability, - BeforeAnalyzeFileCapability, - FinalizeProcessCapability -{ - const LINE_NUMBER_REGEX = "@ on line ([1-9][0-9]*)$@"; - const STDIN_FILENAME_REGEX = "@ in (Standard input code|-)@"; - - /** - * @var array<int,InvokeExecutionPromise> - * A list of invoked processes that this plugin created. - * This plugin creates 0 or more processes(up to a maximum number can run at a time) - * and then waits for the execution of those processes to finish. - */ - private $processes = []; - - /** - * @param CodeBase $code_base @phan-unused-param - * The code base in which the node exists - * - * @param Context $context - * A context with the file name for $file_contents and the scope after analyzing $node. - * - * @param string $file_contents the unmodified file contents @phan-unused-param - * @param Node $node the node @phan-unused-param - * @return void - * @override - */ - public function beforeAnalyzeFile( - CodeBase $code_base, - Context $context, - string $file_contents, - Node $node - ) { - $php_binaries = (Config::getValue('plugin_config')['php_native_syntax_check_binaries'] ?? null) ?: [PHP_BINARY]; - - foreach ($php_binaries as $binary) { - $this->processes[] = new InvokeExecutionPromise($binary, $file_contents, $context); - } - } - - /** - * @param CodeBase $code_base - * The code base in which the node exists - * - * @param Context $context @phan-unused-param - * A context with the file name for $file_contents and the scope after analyzing $node. - * - * @param string $file_contents the unmodified file contents @phan-unused-param - * @param Node $node the node @phan-unused-param - * @return void - * @override - * @throws Error if a process fails to shut down - */ - public function afterAnalyzeFile( - CodeBase $code_base, - Context $context, - string $file_contents, - Node $node - ) { - $configured_max_incomplete_processes = (int)(Config::getValue('plugin_config')['php_native_syntax_check_max_processes'] ?? 1) - 1; - $max_incomplete_processes = max(0, $configured_max_incomplete_processes); - $this->awaitIncompleteProcesses($code_base, $max_incomplete_processes); - } - - /** - * @throws Error if a syntax check process fails to shut down - */ - private function awaitIncompleteProcesses(CodeBase $code_base, int $max_incomplete_processes) - { - foreach ($this->processes as $i => $process) { - if (!$process->read()) { - continue; - } - unset($this->processes[$i]); - self::handleError($code_base, $process); - } - $max_incomplete_processes = max(0, $max_incomplete_processes); - while (count($this->processes) > $max_incomplete_processes) { - $process = array_pop($this->processes); - if (!$process) { - throw new AssertionError("Process list should be non-empty"); - } - $process->blockingRead(); - self::handleError($code_base, $process); - } - } - - /** - * @override - * @throws Error if a syntax check process fails to shut down. - */ - public function finalizeProcess(CodeBase $code_base) - { - $this->awaitIncompleteProcesses($code_base, 0); - } - - /** - * @return void - */ - private static function handleError(CodeBase $code_base, InvokeExecutionPromise $process) - { - $check_error_message = $process->getError(); - if (!is_string($check_error_message)) { - return; - } - $context = $process->getContext(); - $binary = $process->getBinary(); - $lineno = 1; - if (preg_match(self::LINE_NUMBER_REGEX, $check_error_message, $matches)) { - $lineno = (int)$matches[1]; - $check_error_message = trim(preg_replace(self::LINE_NUMBER_REGEX, '', $check_error_message)); - } - $check_error_message = preg_replace(self::STDIN_FILENAME_REGEX, '', $check_error_message); - - - self::emitIssue( - $code_base, - clone($context)->withLineNumberStart($lineno), - 'PhanNativePHPSyntaxCheckPlugin', - 'Saw error or notice for {FILE} --syntax-check: {DETAILS}', - [ - $binary === PHP_BINARY ? 'php' : $binary, - json_encode($check_error_message), - - ] - ); - } -} - -/** - * This wraps a `php --syntax-check` process, - * and contains methods to start the process and await the result - * (and check for failures) - */ -class InvokeExecutionPromise -{ - /** @var string path to the php binary invoked */ - private $binary; - - /** @var bool is the process finished executing */ - private $done = false; - - /** @var resource the result of `proc_open()` */ - private $process; - - /** @var array{0:resource,1:resource,2:resource} stdin, stdout, stderr */ - private $pipes; - - /** @var ?string an error message */ - private $error = null; - - /** @var string the raw bytes from stdout with serialized data */ - private $raw_stdout = ''; - - /** @var Context has the file name being analyzed */ - private $context; - - public function __construct(string $binary, string $file_contents, Context $context) - { - // TODO: Use symfony process - // Note: We might have invalid utf-8, ensure that the streams are opened in binary mode. - // I'm not sure if this is necessary. - if (DIRECTORY_SEPARATOR === "\\") { - $cmd = $binary . ' --syntax-check --no-php-ini'; - $abs_path = Config::projectPath($context->getFile()); - if (!file_exists($abs_path)) { - $this->done = true; - $this->error = "File does not exist"; - return; - } - - // Possibly https://bugs.php.net/bug.php?id=51800 - // NOTE: Work around this by writing from the original file. This may not work as expected in LSP mode - $abs_path = str_replace("/", "\\", $abs_path); - - $cmd .= ' < ' . escapeshellarg($abs_path); - - $descriptorspec = [ - 1 => ['pipe', 'wb'], - ]; - $this->binary = $binary; - $process = proc_open($cmd, $descriptorspec, $pipes); - if (!is_resource($process)) { - $this->done = true; - $this->error = "Failed to run proc_open in " . __METHOD__; - return; - } - $this->process = $process; - } else { - $cmd = escapeshellarg($binary) . ' --syntax-check --no-php-ini'; - $descriptorspec = [ - ['pipe', 'rb'], - ['pipe', 'wb'], - ]; - $this->binary = $binary; - $process = proc_open($cmd, $descriptorspec, $pipes); - if (!is_resource($process)) { - $this->done = true; - $this->error = "Failed to run proc_open in " . __METHOD__; - return; - } - $this->process = $process; - - self::streamPutContents($pipes[0], $file_contents); - } - $this->pipes = $pipes; - - if (!stream_set_blocking($pipes[1], false)) { - $this->error = "unable to set read stdout to non-blocking"; - } - $this->context = clone($context); - } - - /** - * @param resource $stream stream to write $file_contents to before fclose() - * @param string $file_contents - * @return void - * See https://bugs.php.net/bug.php?id=39598 - */ - private static function streamPutContents($stream, string $file_contents) - { - try { - while (strlen($file_contents) > 0) { - $bytes_written = fwrite($stream, $file_contents); - if ($bytes_written === false) { - error_log('failed to write in ' . __METHOD__); - return; - } - if ($bytes_written === 0) { - $read_streams = []; - $write_streams = [$stream]; - $except_streams = []; - stream_select($read_streams, $write_streams, $except_streams, 0); - if (!$write_streams) { - usleep(1000); - // This is blocked? - continue; - } - // $stream is ready to be written to? - $bytes_written = fwrite($stream, $file_contents); - if (!$bytes_written) { - error_log('failed to write in ' . __METHOD__ . ' but the stream should be ready'); - return; - } - } - if ($bytes_written > 0) { - $file_contents = \substr($file_contents, $bytes_written); - } - } - } finally { - fclose($stream); - } - } - - /** - * @return bool false if an error was encountered when trying to read more output from the syntax check process. - */ - public function read() : bool - { - if ($this->done) { - return true; - } - $stdout = $this->pipes[1]; - while (!feof($stdout)) { - $bytes = fread($stdout, 4096); - if ($bytes === false) { - break; - } - if (strlen($bytes) === 0) { - break; - } - $this->raw_stdout .= $bytes; - } - if (!feof($stdout)) { - return false; - } - fclose($stdout); - - $this->done = true; - - $exit_code = proc_close($this->process); - if ($exit_code === 0) { - $this->error = null; - return true; - } - $output = str_replace("\r", "", trim($this->raw_stdout)); - $first_line = explode("\n", $output)[0]; - $this->error = $first_line; - return true; - } - - /** - * @return void - * @throws Error if reading failed - */ - public function blockingRead() - { - if ($this->done) { - return; - } - if (!stream_set_blocking($this->pipes[1], true)) { - throw new Error("Unable to make stdout blocking"); - } - if (!$this->read()) { - throw new Error("Failed to read"); - } - } - - /** - * @return ?string - * @throws RangeException if this was called before the process finished - */ - public function getError() - { - if (!$this->done) { - throw new RangeException("Called " . __METHOD__ . " too early"); - } - return $this->error; - } - - /** - * Returns the context containing the name of the file being syntax checked - */ - public function getContext() : Context - { - return $this->context; - } - - /** - * @return string the path to the PHP interpreter binary. (e.g. `/usr/bin/php`) - */ - public function getBinary() : string - { - return $this->binary; - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new InvokePHPNativeSyntaxCheckPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/NoAssertPlugin.php b/vendor/phan/phan/.phan/plugins/NoAssertPlugin.php deleted file mode 100644 index b649765..0000000 --- a/vendor/phan/phan/.phan/plugins/NoAssertPlugin.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * This plugin checks for occurrences of `assert(cond)` for Phan's self-analysis. - * It is not suitable for some projects. - * See https://github.com/phan/phan/issues/288 - * - * This file demonstrates plugins for Phan. Plugins hook into various events. - * NoAssertPlugin hooks into one event: - * - * - getPostAnalyzeNodeVisitorClassName - * This method returns a visitor that is called on every AST node from every - * file being analyzed - * - * A plugin file must - * - * - Contain a class that inherits from \Phan\PluginV2 - * - * - End by returning an instance of that class. - * - * It is assumed without being checked that plugins aren't - * mangling state within the passed code base or context. - * - * Note: When adding new plugins, - * add them to the corresponding section of README.md - */ -class NoAssertPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - - /** - * @return string - name of PluginAwarePostAnalysisVisitor subclass - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return NoAssertVisitor::class; - } -} - -/** - * When __invoke on this class is called with a node, a method - * will be dispatched based on the `kind` of the given node. - * - * Visitors such as this are useful for defining lots of different - * checks on a node based on its kind. - */ -class NoAssertVisitor extends PluginAwarePostAnalysisVisitor -{ - - // A plugin's visitors should not override visit() unless they need to. - - /** - * @param Node $node - * A node to analyze - * - * @return void - * @override - */ - public function visitCall(Node $node) - { - $name = $node->children['expr']->children['name'] ?? null; - if (!is_string($name)) { - return; - } - if (strcasecmp($name, 'assert') !== 0) { - return; - } - $this->emitPluginIssue( - $this->code_base, - $this->context, - 'PhanPluginNoAssert', - // phpcs:ignore Generic.Files.LineLength.MaxExceeded - 'assert() is discouraged. Although phan supports using assert() for type annotations, PHP\'s documentation recommends assertions only for debugging, and assert() has surprising behaviors.', - [] - ); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new NoAssertPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/NonBoolBranchPlugin.php b/vendor/phan/phan/.phan/plugins/NonBoolBranchPlugin.php deleted file mode 100644 index 633a544..0000000 --- a/vendor/phan/phan/.phan/plugins/NonBoolBranchPlugin.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php declare(strict_types=1); - -// .phan/plugins/NonBoolBranchPlugin.php - -use ast\Node; -use Phan\AST\UnionTypeVisitor; -use Phan\Exception\IssueException; -use Phan\Language\Context; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePreAnalysisVisitor; -use Phan\PluginV2\PreAnalyzeNodeCapability; - -/** - * This plugin warns if an expression which has types other than `bool` is used in an if/else if. - * - * Note that the 'simplify_ast' setting's default of true will interfere with this plugin. - */ -class NonBoolBranchPlugin extends PluginV2 implements PreAnalyzeNodeCapability -{ - /** - * @return string - name of PluginAwarePreAnalysisVisitor subclass - * - * @override - */ - public static function getPreAnalyzeNodeVisitorClassName() : string - { - return NonBoolBranchVisitor::class; - } -} - -/** - * This visitor checks if statements for conditions ('cond') that are non-booleans. - */ -class NonBoolBranchVisitor extends PluginAwarePreAnalysisVisitor -{ - // A plugin's visitors should not override visit() unless they need to. - - /** - * @override - */ - public function visitIf(Node $node) : Context - { - // Here, we visit the group of if/elseif/else instead of the individuals (visitIfElem) - // so that we have the Union types of the variables **before** the PreOrderAnalysisVisitor makes inferences - foreach ($node->children as $if_node) { - $condition = $if_node->children['cond']; - - // dig nodes to avoid the NOT('!') operation converting its value to a boolean type. - // Also, use right-hand side of assignments such as `$x = (expr)` - while (($condition instanceof Node) && ( - ($condition->flags === ast\flags\UNARY_BOOL_NOT && $condition->kind === ast\AST_UNARY_OP) - || (\in_array($condition->kind, [\ast\AST_ASSIGN, \ast\AST_ASSIGN_REF], true))) - ) { - $condition = $condition->children['expr']; - } - - if ($condition === null) { - // $condition === null will be appeared in else-clause, then avoid them - continue; - } - - if ($condition instanceof Node) { - $this->context = $this->context->withLineNumberStart($condition->lineno); - } - // evaluate the type of conditional expression - try { - $union_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $condition); - } catch (IssueException $_) { - return $this->context; - } - if (!$union_type->isEmpty() && !$union_type->isExclusivelyBoolTypes()) { - $this->emit( - 'PhanPluginNonBoolBranch', - 'Non bool value of type {TYPE} evaluated in if clause', - [(string)$union_type] - ); - } - } - return $this->context; - } -} - -return new NonBoolBranchPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/NonBoolInLogicalArithPlugin.php b/vendor/phan/phan/.phan/plugins/NonBoolInLogicalArithPlugin.php deleted file mode 100644 index 51a9332..0000000 --- a/vendor/phan/phan/.phan/plugins/NonBoolInLogicalArithPlugin.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\AST\UnionTypeVisitor; -use Phan\Language\Context; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * This plugin checks for non-booleans in either side of logical arithmetic operators - * (e.g. &&, ||, xor) - */ -class NonBoolInLogicalArithPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - - /** - * @return string - name of PluginAwarePostAnalysisVisitor subclass - * - * @override - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return NonBoolInLogicalArithVisitor::class; - } -} - -/** - * This visitor checks boolean logical arithmetic operations for non-boolean expressions on either side. - */ -class NonBoolInLogicalArithVisitor extends PluginAwarePostAnalysisVisitor -{ - - /** define boolean operator list */ - const BINARY_BOOL_OPERATORS = [ - ast\flags\BINARY_BOOL_OR, - ast\flags\BINARY_BOOL_AND, - ast\flags\BINARY_BOOL_XOR, - ]; - - // A plugin's visitors should not override visit() unless they need to. - - /** - * @override - */ - public function visitBinaryOp(Node $node) : Context - { - // check every boolean binary operation - if (in_array($node->flags, self::BINARY_BOOL_OPERATORS, true)) { - // get left node and parse it - // (dig nodes to avoid NOT('!') operator's converting its value to boolean type) - $left_node = $node->children['left']; - while (isset($left_node->flags) && $left_node->flags === ast\flags\UNARY_BOOL_NOT) { - $left_node = $left_node->children['expr']; - } - - // get right node and parse it - $right_node = $node->children['right']; - while (isset($right_node->flags) && $right_node->flags === ast\flags\UNARY_BOOL_NOT) { - $right_node = $right_node->children['expr']; - } - - // get the type of two nodes - $left_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $left_node); - $right_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $right_node); - - // if left or right type is NOT boolean, emit issue - if (!$left_type->isExclusivelyBoolTypes()) { - if ($left_node instanceof Node) { - $this->context = $this->context->withLineNumberStart($left_node->lineno); - } - $this->emit( - 'PhanPluginNonBoolInLogicalArith', - 'Non bool value of type {TYPE} in logical arithmetic', - [(string)$left_type] - ); - } - if (!$right_type->isExclusivelyBoolTypes()) { - if ($right_node instanceof Node) { - $this->context = $this->context->withLineNumberStart($right_node->lineno); - } - $this->emit( - 'PhanPluginNonBoolInLogicalArith', - 'Non bool value of type {TYPE} in logical arithmetic', - [(string)$right_type] - ); - } - } - return $this->context; - } -} - -return new NonBoolInLogicalArithPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/NotFullyQualifiedUsagePlugin.php b/vendor/phan/phan/.phan/plugins/NotFullyQualifiedUsagePlugin.php deleted file mode 100644 index b26fccf..0000000 --- a/vendor/phan/phan/.phan/plugins/NotFullyQualifiedUsagePlugin.php +++ /dev/null @@ -1,204 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\Config; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * This warns if references to global functions or global constants are not fully qualified. - * - * This Plugin hooks into one event: - * - * - getPostAnalyzeNodeVisitorClassName - * This method returns a class that is called on every AST node from every - * file being analyzed - */ -class NotFullyQualifiedUsagePlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - - /** - * @return string - The name of the visitor that will be called (formerly analyzeNode) - * @override - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return NotFullyQualifiedUsageVisitor::class; - } -} - -/** - * When __invoke on this class is called with a node, a method - * will be dispatched based on the `kind` of the given node. - * - * Visitors such as this are useful for defining lots of different - * checks on a node based on its kind. - */ -class NotFullyQualifiedUsageVisitor extends PluginAwarePostAnalysisVisitor -{ - // Subclasses should declare protected $parent_node_list as an instance property if they need to know the list. - - // @var array<int,Node> - Set after the constructor is called if an instance property with this name is declared - // protected $parent_node_list; - - // A plugin's visitors should NOT implement visit(), unless they need to. - - // phpcs:disable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase - const NotFullyQualifiedFunctionCall = 'PhanPluginNotFullyQualifiedFunctionCall'; - const NotFullyQualifiedOptimizableFunctionCall = 'PhanPluginNotFullyQualifiedOptimizableFunctionCall'; - const NotFullyQualifiedGlobalConstant = 'PhanPluginNotFullyQualifiedGlobalConstant'; - // phpcs:enable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase - - /** - * Source of functions: `zend_try_compile_special_func` from https://github.com/php/php-src/blob/master/Zend/zend_compile.c - */ - const OPTIMIZABLE_FUNCTIONS = [ - 'array_key_exists' => true, - 'array_slice' => true, - 'boolval' => true, - 'call_user_func' => true, - 'call_user_func_array' => true, - 'chr' => true, - 'count' => true, - 'defined' => true, - 'doubleval' => true, - 'floatval' => true, - 'func_get_args' => true, - 'func_num_args' => true, - 'get_called_class' => true, - 'get_class' => true, - 'gettype' => true, - 'in_array' => true, - 'intval' => true, - 'is_array' => true, - 'is_bool' => true, - 'is_double' => true, - 'is_float' => true, - 'is_int' => true, - 'is_integer' => true, - 'is_long' => true, - 'is_null' => true, - 'is_object' => true, - 'is_real' => true, - 'is_resource' => true, - 'is_string' => true, - 'ord' => true, - 'strlen' => true, - 'strval' => true, - ]; - - /** - * @param Node $node - * A node to analyze of type ast\AST_CALL (call to a global function) - * - * @return void - * - * @override - */ - public function visitCall(Node $node) - { - $expression = $node->children['expr']; - if (!($expression instanceof Node) || $expression->kind !== ast\AST_NAME) { - return; - } - if (($expression->flags & ast\flags\NAME_NOT_FQ) !== ast\flags\NAME_NOT_FQ) { - // This is namespace\foo() or \NS\foo() - return; - } - if ($this->context->getNamespace() === '\\') { - // This is in the global namespace and is always fully qualified - return; - } - $function_name = $expression->children['name']; - if (!is_string($function_name)) { - // Possibly redundant. - return; - } - // TODO: Probably wrong for ast\parse_code - should check namespace map of USE_NORMAL for 'ast' there. - // Same for ContextNode->getFunction() - if ($this->context->hasNamespaceMapFor(\ast\flags\USE_FUNCTION, $function_name)) { - return; - } - $this->warnNotFullyQualifiedFunctionCall($function_name, $expression); - } - - private function warnNotFullyQualifiedFunctionCall(string $function_name, Node $expression) - { - if (array_key_exists(strtolower($function_name), self::OPTIMIZABLE_FUNCTIONS)) { - $issue_type = self::NotFullyQualifiedOptimizableFunctionCall; - $issue_msg = 'Expected function call to {FUNCTION}() to be fully qualified or have a use statement but none were found in namespace {NAMESPACE}' - . ' (opcache can optimize fully qualified calls to this function in recent php versions)'; - } else { - $issue_type = self::NotFullyQualifiedFunctionCall; - $issue_msg = 'Expected function call to {FUNCTION}() to be fully qualified or have a use statement but none were found in namespace {NAMESPACE}'; - } - $this->emitPluginIssue( - $this->code_base, - clone($this->context)->withLineNumberStart($expression->lineno), - $issue_type, - $issue_msg, - [$function_name, $this->context->getNamespace()] - ); - } - - /** - * @param Node $node - * A node to analyze of type ast\AST_CONST (reference to a constant) - * - * @return void - * - * @override - */ - public function visitConst(Node $node) - { - $expression = $node->children['name']; - if (!($expression instanceof Node) || $expression->kind !== ast\AST_NAME) { - return; - } - if (($expression->flags & ast\flags\NAME_NOT_FQ) !== ast\flags\NAME_NOT_FQ) { - // This is namespace\SOME_CONST or \NS\SOME_CONST - return; - } - if ($this->context->getNamespace() === '\\') { - // This is in the global namespace and is always fully qualified - return; - } - $constant_name = $expression->children['name']; - if (!is_string($constant_name)) { - // Possibly redundant. - return; - } - $constant_name_lower = strtolower($constant_name); - if ($constant_name_lower === 'true' || $constant_name_lower === 'false' || $constant_name_lower === 'null') { - // These are keywords and are the same in any namespace - return; - } - - // TODO: Probably wrong for ast\AST_NAME - should check namespace map of USE_NORMAL for 'ast' there. - // Same for ContextNode->getConst() - if ($this->context->hasNamespaceMapFor(\ast\flags\USE_CONST, $constant_name)) { - return; - } - $this->warnNotFullyQualifiedConstantUsage($constant_name, $expression); - } - - private function warnNotFullyQualifiedConstantUsage(string $constant_name, Node $expression) - { - $this->emitPluginIssue( - $this->code_base, - clone($this->context)->withLineNumberStart($expression->lineno), - self::NotFullyQualifiedGlobalConstant, - 'Expected usage of {CONST} to be fully qualified or have a use statement but none were found in namespace {NAMESPACE}', - [$constant_name, $this->context->getNamespace()] - ); - } -} - -if (Config::isIssueFixingPluginEnabled()) { - require_once __DIR__ . '/NotFullyQualifiedUsagePlugin/fixers.php'; -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new NotFullyQualifiedUsagePlugin(); diff --git a/vendor/phan/phan/.phan/plugins/NotFullyQualifiedUsagePlugin/fixers.php b/vendor/phan/phan/.phan/plugins/NotFullyQualifiedUsagePlugin/fixers.php deleted file mode 100644 index 412df3b..0000000 --- a/vendor/phan/phan/.phan/plugins/NotFullyQualifiedUsagePlugin/fixers.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php declare(strict_types=1); - -use Microsoft\PhpParser\Node\Expression\CallExpression; -use Microsoft\PhpParser\Node\QualifiedName; -use Phan\AST\TolerantASTConverter\NodeUtils; -use Phan\CodeBase; -use Phan\IssueInstance; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedGlobalConstantName; -use Phan\Library\FileCacheEntry; -use Phan\Plugin\Internal\IssueFixingPlugin\FileEdit; -use Phan\Plugin\Internal\IssueFixingPlugin\FileEditSet; -use Phan\Plugin\Internal\IssueFixingPlugin\IssueFixer; - -/** - * Implements --automatic-fix for NotFullyQualifiedUsagePlugin - * - * This is a prototype, there are various features it does not implement. - */ -call_user_func(static function () { - /** - * @return ?FileEditSet - * @suppress PhanAccessMethodInternal - */ - $fix = static function (CodeBase $code_base, FileCacheEntry $contents, IssueInstance $instance) { - $line = $instance->getLine(); - $expected_name = $instance->getTemplateParameters()[0]; - $edits = []; - foreach ($contents->getNodesAtLine($line) as $node) { - if (!$node instanceof QualifiedName) { - continue; - } - if ($node->globalSpecifier || $node->relativeSpecifier) { - // This is already qualified - continue; - } - $actual_name = (new NodeUtils($contents->getContents()))->phpParserNameToString($node); - if ($actual_name !== $expected_name) { - continue; - } - $is_actual_call = $node->parent instanceof CallExpression; - $is_expected_call = $instance->getIssue()->getType() !== NotFullyQualifiedUsageVisitor::NotFullyQualifiedGlobalConstant; - if ($is_actual_call !== $is_expected_call) { - IssueFixer::debug("skip check mismatch actual expected are call vs constants\n"); - // don't warn about constants with the same names as functions or vice-versa - continue; - } - try { - if ($is_expected_call) { - // Don't do this if the global function this refers to doesn't exist. - // TODO: Support namespaced functions - if (!$code_base->hasFunctionWithFQSEN(FullyQualifiedFunctionName::fromFullyQualifiedString($actual_name))) { - IssueFixer::debug("skip attempt to fix $actual_name() because function was not found in the global scope\n"); - return null; - } - } else { - // Don't do this if the global function this refers to doesn't exist. - // TODO: Support namespaced functions - if (!$code_base->hasGlobalConstantWithFQSEN(FullyQualifiedGlobalConstantName::fromFullyQualifiedString($actual_name))) { - IssueFixer::debug("skip attempt to fix $actual_name because the constant was not found in the global scope\n"); - return null; - } - } - } catch (Exception $_) { - continue; - } - //fwrite(STDERR, "name is: " . get_class($node->parent) . "\n"); - - // They are case-sensitively identical. - // Generate a fix. - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - $start = $node->getStart(); - $edits[] = new FileEdit($start, $start, '\\'); - } - if ($edits) { - return new FileEditSet($edits); - } - return null; - }; - IssueFixer::registerFixerClosure( - NotFullyQualifiedUsageVisitor::NotFullyQualifiedGlobalConstant, - $fix - ); - IssueFixer::registerFixerClosure( - NotFullyQualifiedUsageVisitor::NotFullyQualifiedFunctionCall, - $fix - ); - IssueFixer::registerFixerClosure( - NotFullyQualifiedUsageVisitor::NotFullyQualifiedOptimizableFunctionCall, - $fix - ); -}); diff --git a/vendor/phan/phan/.phan/plugins/NumericalComparisonPlugin.php b/vendor/phan/phan/.phan/plugins/NumericalComparisonPlugin.php deleted file mode 100644 index f0916b0..0000000 --- a/vendor/phan/phan/.phan/plugins/NumericalComparisonPlugin.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\AST\UnionTypeVisitor; -use Phan\Language\Context; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * This plugin enforces that loose equality is used for numeric operands (e.g. `2 == 2.0`), - * and that strict equality is used for non-numeric operands (e.g. `"2" === "2e0"` is false). - */ -class NumericalComparisonPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - - /** - * @return string - name of PluginAwarePostAnalysisVisitor subclass - * - * @override - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return NumericalComparisonVisitor::class; - } -} - -/** - * This visitor checks binary operators to check that - * loose equality is used for numeric operands (e.g. `2 == 2.0`), - * and that strict equality is used for non-numeric operands (e.g. `"2" === "2e0"` is false). - */ -class NumericalComparisonVisitor extends PluginAwarePostAnalysisVisitor -{ - /** define equal operator list */ - const BINARY_EQUAL_OPERATORS = [ - ast\flags\BINARY_IS_EQUAL, - ast\flags\BINARY_IS_NOT_EQUAL, - ]; - - /** define identical operator list */ - const BINARY_IDENTICAL_OPERATORS = [ - ast\flags\BINARY_IS_IDENTICAL, - ast\flags\BINARY_IS_NOT_IDENTICAL, - ]; - - // A plugin's visitors should not override visit() unless they need to. - - /** - * @override - */ - public function visitBinaryOp(Node $node) : Context - { - // get the types of left and right values - $left_node = $node->children['left']; - $left_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $left_node); - $right_node = $node->children['right']; - $right_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $right_node); - - // non numerical values are not allowed in the operator equal(==, !=) - if (in_array($node->flags, self::BINARY_EQUAL_OPERATORS)) { - if (!$left_type->isNonNullNumberType() && - !$right_type->isNonNullNumberType() - ) { - $this->emit( - 'PhanPluginNumericalComparison', - "non numerical values compared by the operators '==' or '!='", - [] - ); - } - // numerical values are not allowed in the operator identical('===', '!==') - } elseif (in_array($node->flags, self::BINARY_IDENTICAL_OPERATORS)) { - if ($left_type->isNonNullNumberType() || - $right_type->isNonNullNumberType()) { - // TODO: different name for this issue type? - $this->emit( - 'PhanPluginNumericalComparison', - "numerical values compared by the operators '===' or '!=='", - [] - ); - } - } - return $this->context; - } -} - -return new NumericalComparisonPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/PHPUnitAssertionPlugin.php b/vendor/phan/phan/.phan/plugins/PHPUnitAssertionPlugin.php deleted file mode 100644 index 3ab5994..0000000 --- a/vendor/phan/phan/.phan/plugins/PHPUnitAssertionPlugin.php +++ /dev/null @@ -1,234 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Element\Comment\Assertion; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Method; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\UnionType; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeFunctionCallCapability; - -/** - * Mark PHPUnit helper assertions as having side effects. - * - * - assertTrue - * - assertNull - * - assertNotNull - * - assertFalse - * - assertSame($expected, $actual) - * - assertInstanceof - * - * NOTE: This will probably be rewritten - */ -class PHPUnitAssertionPlugin extends PluginV2 implements AnalyzeFunctionCallCapability -{ - /** - * @override - */ - public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array - { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - $assert_class_fqsen = FullyQualifiedClassName::fromFullyQualifiedString('PHPUnit\Framework\Assert'); - if (!$code_base->hasClassWithFQSEN($assert_class_fqsen)) { - if (!getenv('PHAN_PHPUNIT_ASSERTION_PLUGIN_QUIET')) { - fwrite(STDERR, "PHPUnitAssertionPlugin failed to find class PHPUnit\Framework\Assert, giving up (set environment variable PHAN_PHPUNIT_ASSERTION_PLUGIN_QUIET=1 to ignore this)\n"); - } - return []; - } - $result = []; - foreach ($code_base->getMethodSet() as $method) { - $method_fqsen = $method->getDefiningFQSEN(); - $class_fqsen = $method_fqsen->getFullyQualifiedClassName(); - if ($class_fqsen !== $assert_class_fqsen) { - continue; - } - $closure = $this->createClosureForMethod($code_base, $method, $method_fqsen->getName()); - if (!$closure) { - continue; - } - $result[(string)$method->getFQSEN()] = $closure; - } - return $result; - } - - /** - * @return ?Closure(CodeBase, Context, FunctionInterface, array):void - * @suppress PhanAccessClassConstantInternal, PhanAccessMethodInternal - */ - private function createClosureForMethod(CodeBase $code_base, Method $method, string $name) - { - // TODO: Add a helper method which will convert a doc comment and a stub php function source code to a closure for a param index (or indices) - switch (\strtolower($name)) { - case 'asserttrue': - case 'assertnotfalse': - return $method->createClosureForAssertion( - $code_base, - new Assertion(UnionType::empty(), 'unusedParamName', Assertion::IS_TRUE), - 0 - ); - case 'assertfalse': - case 'assertnottrue': - return $method->createClosureForAssertion( - $code_base, - new Assertion(UnionType::empty(), 'unusedParamName', Assertion::IS_FALSE), - 0 - ); - case 'assertnull': - return $method->createClosureForAssertion( - $code_base, - new Assertion(UnionType::fromFullyQualifiedString('null'), 'unusedParamName', Assertion::IS_OF_TYPE), - 0 - ); - case 'assertnotnull': - return $method->createClosureForAssertion( - $code_base, - new Assertion(UnionType::fromFullyQualifiedString('null'), 'unusedParamName', Assertion::IS_NOT_OF_TYPE), - 0 - ); - case 'assertsame': - // Sets the type of $actual to $expected - // - // This is equivalent to the side effects of the below doc comment. - // Note that the doc comment would make phan emit warnings about invalid classes, etc. - // TODO: Reuse the code for templates here - // - // (at)template T - // (at)param T $expected - // (at)param mixed $actual - // (at)phan-assert T $actual - return $method->createClosureForUnionTypeExtractorAndAssertionType( - /** - * @param array<int,Node|string|int|float> $args - */ - static function (CodeBase $code_base, Context $context, array $args) : UnionType { - if (\count($args) < 2) { - return UnionType::empty(); - } - return UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - }, - Assertion::IS_OF_TYPE, - 1 - ); - case 'assertinternaltype': - return $method->createClosureForUnionTypeExtractorAndAssertionType( - /** - * @param array<int,Node|string|int|float> $args - */ - function (CodeBase $code_base, Context $context, array $args) : UnionType { - if (\count($args) < 2) { - return UnionType::empty(); - } - $string = $args[0]; - if ($string instanceof ast\Node) { - $string = (UnionTypeVisitor::unionTypeFromNode($code_base, $context, $string))->asSingleScalarValueOrNull(); - } - if (!is_string($string)) { - return UnionType::empty(); - } - $original_type = (UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[1])); - switch ($string) { - case 'numeric': - return UnionType::fromFullyQualifiedString('int|float|string'); - case 'integer': - case 'int': - return UnionType::fromFullyQualifiedString('int'); - - case 'double': - case 'float': - case 'real': - return UnionType::fromFullyQualifiedString('float'); - - case 'string': - return UnionType::fromFullyQualifiedString('string'); - - case 'boolean': - case 'bool': - return UnionType::fromFullyQualifiedString('bool'); - - case 'null': - return UnionType::fromFullyQualifiedString('null'); - - case 'array': - $result = $original_type->arrayTypes(); - if ($result->isEmpty()) { - return UnionType::fromFullyQualifiedString('array'); - } - return $result; - case 'object': - $result = $original_type->objectTypes(); - if ($result->isEmpty()) { - return UnionType::fromFullyQualifiedString('object'); - } - return $result; - case 'resource': - return UnionType::fromFullyQualifiedString('resource'); - case 'scalar': - $result = $original_type->scalarTypes(); - if ($result->isEmpty()) { - return UnionType::fromFullyQualifiedString('int|string|float|bool'); - } - return $result; - - case 'callable': - $result = $original_type->callableTypes(); - if ($result->isEmpty()) { - return UnionType::fromFullyQualifiedString('callable'); - } - return $result; - } - // Warn about possibly invalid assertion - // NOTE: This is only emitted for variables - $this->emitPluginIssue( - $code_base, - $context, - 'PhanPluginPHPUnitAssertionInvalidInternalType', - 'Unknown type {STRING_LITERAL} in call to assertInternalType', - [$string] - ); - - return UnionType::empty(); - }, - Assertion::IS_OF_TYPE, - 1 - ); - case 'assertinstanceof': - // This is equivalent to the side effects of the below doc comment. - // Note that the doc comment would make phan emit warnings about invalid classes, etc. - // TODO: Reuse the code for class-string<T> here. - // - // (at)template T - // (at)param class-string<T> $expected - // (at)param mixed $actual - // (at)phan-assert T $actual - return $method->createClosureForUnionTypeExtractorAndAssertionType( - /** - * @param array<int,Node|string|int|float> $args - */ - static function (CodeBase $code_base, Context $context, array $args) : UnionType { - if (\count($args) < 2) { - return UnionType::empty(); - } - $string = (UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]))->asSingleScalarValueOrNull(); - if (!is_string($string)) { - return UnionType::empty(); - } - try { - return FullyQualifiedClassName::fromFullyQualifiedString($string)->asType()->asUnionType(); - } catch (\Exception $_) { - return UnionType::empty(); - } - }, - Assertion::IS_OF_TYPE, - 1 - ); - } - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new PHPUnitAssertionPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/PHPUnitNotDeadCodePlugin.php b/vendor/phan/phan/.phan/plugins/PHPUnitNotDeadCodePlugin.php deleted file mode 100644 index 246aaef..0000000 --- a/vendor/phan/phan/.phan/plugins/PHPUnitNotDeadCodePlugin.php +++ /dev/null @@ -1,156 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\Config; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Method; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * Mark all phpunit test cases as used for dead code detection during Phan's self-analysis. - * - * Implements the following capabilities - * (This choice of capability makes this plugin efficiently analyze only classes that are in the analyzed file list) - * - * - public static function getPostAnalyzeNodeVisitorClassName() : string - * Returns the name of a class extending PluginAwarePostAnalysisVisitor, which will be used to analyze nodes in the analysis phase. - * If the PluginAwarePostAnalysisVisitor subclass has an instance property called parent_node_list, - * Phan will automatically set that property to the list of parent nodes (The nodes deepest in the AST are at the end of the list) - * (implement \Phan\PluginV2\PostAnalyzeNodeCapability) - */ -class PHPUnitNotDeadCodePlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - /** - * @override - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return PHPUnitNotDeadPluginVisitor::class; - } -} - -/** - * This visitor visits classes (After all class/method definitions are parsed and analyzed) - * and, for subclasses of PHPUnit test cases, - * marks the phpunit test cases, (at)dataProviders, and special PHPUnit subclass properties as being referenced (i.e. not dead code) - */ -class PHPUnitNotDeadPluginVisitor extends PluginAwarePostAnalysisVisitor -{ - /** @var FullyQualifiedClassName for the base class of all PHPUnit tests */ - private static $phpunit_test_case_fqsen; - - /** @var Type for the base class of all PHPUnit tests */ - private static $phpunit_test_case_type; - - /** @var bool did this plugin already warn that TestCase was missing? */ - private static $did_warn_missing_class = false; - - /** - * This is called after the parse phase is completely finished, so $this->code_base contains all class definitions - * @return void - * @override - */ - public function visitClass(Node $unused_node) - { - if (!Config::get_track_references()) { - return; - } - $code_base = $this->code_base; - if (!$code_base->hasClassWithFQSEN(self::$phpunit_test_case_fqsen)) { - if (!self::$did_warn_missing_class) { - fprintf(STDERR, "Using plugin %s but could not find PHPUnit\Framework\TestCase\n", self::class); - self::$did_warn_missing_class = true; - } - return; - } - // This assumes PreOrderAnalysisVisitor->visitClass is called first. - $context = $this->context; - // @phan-suppress-next-line PhanThrowTypeAbsentForCall definitely in class scope in visitClass - $class = $context->getClassInScope($code_base); - if (!$class->getFQSEN()->asType()->asExpandedTypes($code_base)->hasType(self::$phpunit_test_case_type)) { - // This isn't a phpunit test case. - return; - } - - // Mark subclasses of TestCase as referenced - $class->addReference($context); - // Mark all test cases as referenced - foreach ($class->getMethodMap($code_base) as $method) { - if (static::isTestCase($method)) { - // TODO: Parse @dataProvider methodName, check for method existence, - // then mark method for dataProvider as referenced. - $method->addReference($context); - $this->markDataProvidersAsReferenced($class, $method); - } - } - // https://phpunit.de/manual/current/en/fixtures.html (PHPUnit framework checks for this override) - if ($class->hasPropertyWithName($code_base, 'backupStaticAttributesBlacklist')) { - $property = $class->getPropertyByName($code_base, 'backupStaticAttributesBlacklist'); - $property->addReference($context); - $property->setHasReadReference(); - } - } - - /** - * This regex contains a single pattern, which matches a valid PHP identifier. - * (e.g. for variable names, magic property names, etc. - * This does not allow backslashes. - */ - const WORD_REGEX = '([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)'; - - /** - * Marks all data provider methods as being referenced - * - * @param Method $method the Method representing a unit test in a test case subclass - * - * @return void - */ - private function markDataProvidersAsReferenced(Clazz $class, Method $method) - { - if (preg_match('/@dataProvider\s+' . self::WORD_REGEX . '/', $method->getNode()->children['docComment'] ?? '', $match)) { - $data_provider_name = $match[1]; - if ($class->hasMethodWithName($this->code_base, $data_provider_name)) { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall checked for existence - $class->getMethodByName($this->code_base, $data_provider_name)->addReference($this->context); - } - } - } - - /** - * @return bool true if $method is a PHPUnit test case - */ - protected static function isTestCase(Method $method) : bool - { - if (!$method->isPublic()) { - return false; - } - if (preg_match('@^test@i', $method->getName())) { - return true; - } - if (preg_match('/@test\b/', $method->getNode()->children['docComment'] ?? '')) { - return true; - } - return false; - } - - /** - * Static initializer for this plugin - Gets called below before any methods can be used - * @return void - * @suppress PhanThrowTypeAbsentForCall this FQSEN is valid - */ - public static function init() - { - $fqsen = FullyQualifiedClassName::make('\\PHPUnit\Framework', 'TestCase'); - self::$phpunit_test_case_fqsen = $fqsen; - self::$phpunit_test_case_type = $fqsen->asType(); - } -} -PHPUnitNotDeadPluginVisitor::init(); - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new PHPUnitNotDeadCodePlugin(); diff --git a/vendor/phan/phan/.phan/plugins/PhanSelfCheckPlugin.php b/vendor/phan/phan/.phan/plugins/PhanSelfCheckPlugin.php deleted file mode 100644 index cff3346..0000000 --- a/vendor/phan/phan/.phan/plugins/PhanSelfCheckPlugin.php +++ /dev/null @@ -1,273 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\PhanSelfCheckPlugin; // Don't pollute the global namespace - -use ast\Node; -use Closure; -use InvalidArgumentException; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\Type\ArrayShapeType; -use Phan\Library\ConversionSpec; -use Phan\Library\StringUtil; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeFunctionCallCapability; -use function count; -use function is_string; - -/** - * This plugin checks for invalid calls to emitIssue, emitPluginIssue, Issue::maybeEmit(), etc. - * This is useful for developing Phan plugins. - * - * This uses ConversionSpec as a heuristic to determine the number of arguments to format strings. - * This currently does not try to check types of arguments. - * - * NOTE: This does not check Issue::fromType($typename)(...args) - */ -class PhanSelfCheckPlugin extends PluginV2 implements AnalyzeFunctionCallCapability -{ - const TooManyArgumentsForIssue = 'PhanPluginTooManyArgumentsForIssue'; - const TooFewArgumentsForIssue = 'PhanPluginTooFewArgumentsForIssue'; - const UnknownIssueType = 'PhanPluginUnknownIssueType'; - - /** - * @param CodeBase $code_base @phan-unused-param - * @return Closure[] - */ - public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array - { - /** - * @return Closure(CodeBase, Context, FunctionInterface, array<int,mixed>):void - */ - $make_array_issue_callback = static function (int $fmt_index, int $arg_index) { - /** - * @param array<int,Node|string|int|float> $args the nodes for the arguments to the invocation - * @return void - */ - return static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $unused_function, - array $args - ) use ( - $fmt_index, - $arg_index -) { - if (\count($args) <= $fmt_index) { - return; - } - // TODO: Check for AST_UNPACK - $issue_message_template = $args[$fmt_index]; - if ($issue_message_template instanceof Node) { - $issue_message_template = (new ContextNode($code_base, $context, $issue_message_template))->getEquivalentPHPScalarValue(); - } - if (!is_string($issue_message_template)) { - return; - } - $issue_message_arg_count = self::computeArraySize($code_base, $context, $args[$arg_index] ?? null); - if ($issue_message_arg_count === null) { - return; - } - self::checkIssueTemplateUsage($code_base, $context, $issue_message_template, $issue_message_arg_count); - }; - }; - /** - * @param int $type_index the index of a parameter expecting an issue type (e.g. PhanParamTooMany) - * @param int $arg_index the index of an array parameter expecting sequential arguments. This is >= $type_index. - * @return Closure(CodeBase, Context, FunctionInterface, array<int,mixed>):void - */ - $make_type_and_parameters_callback = static function (int $type_index, int $arg_index) { - /** - * @param array<int,Node|string|int|float> $args the nodes for the arguments to the invocation - * @return void - */ - return static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $function, - array $args - ) use ( - $type_index, - $arg_index -) { - if (\count($args) <= $type_index) { - return; - } - // TODO: Check for AST_UNPACK - $issue_type = $args[$type_index]; - if ($issue_type instanceof Node) { - $issue_type = (new ContextNode($code_base, $context, $issue_type))->getEquivalentPHPScalarValue(); - } - if (!is_string($issue_type)) { - return; - } - $issue = self::getIssueOrWarn($code_base, $context, $function, $issue_type); - if (!$issue) { - return; - } - $issue_message_arg_count = self::computeArraySize($code_base, $context, $args[$arg_index] ?? null); - if ($issue_message_arg_count === null) { - return; - } - self::checkIssueTemplateUsage($code_base, $context, $issue->getTemplate(), $issue_message_arg_count); - }; - }; - /** - * @param int $type_index the index of a parameter expecting an issue type (e.g. PhanParamTooMany) - * @param int $arg_index the index of an array parameter expecting variable arguments. This is >= $type_index. - * @return Closure(CodeBase, Context, FunctionInterface, array<int,mixed>):void - */ - $make_type_and_varargs_callback = static function (int $type_index, int $arg_index) { - /** - * @param array<int,Node|string|int|float> $args the nodes for the arguments to the invocation - * @return void - */ - return static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $function, - array $args - ) use ( - $type_index, - $arg_index -) { - if (\count($args) <= $type_index) { - return; - } - // TODO: Check for AST_UNPACK - $issue_type = $args[$type_index]; - if ($issue_type instanceof Node) { - $issue_type = (new ContextNode($code_base, $context, $issue_type))->getEquivalentPHPScalarValue(); - } - if (!is_string($issue_type)) { - return; - } - $issue = self::getIssueOrWarn($code_base, $context, $function, $issue_type); - if (!$issue) { - return; - } - if ((\end($args)->kind ?? null) === \ast\AST_UNPACK) { - // give up - return; - } - // number of args passed to varargs. >= 0 if valid. - $issue_message_arg_count = count($args) - $arg_index; - if ($issue_message_arg_count < 0) { - // should already emit PhanParamTooFew - return; - } - self::checkIssueTemplateUsage($code_base, $context, $issue->getTemplate(), $issue_message_arg_count); - }; - }; - /** - * Analyzes a call to plugin->emitIssue($code_base, $context, $issue_type, $issue_message_fmt, $args) - */ - $short_emit_issue_callback = $make_type_and_varargs_callback(0, 2); - - $results = [ - '\Phan\AST\ContextNode::emitIssue' => $short_emit_issue_callback, - '\Phan\Issue::emit' => $make_type_and_varargs_callback(0, 3), - '\Phan\Issue::emitWithParameters' => $make_type_and_parameters_callback(0, 3), - '\Phan\Issue::maybeEmit' => $make_type_and_varargs_callback(2, 4), - '\Phan\Issue::maybeEmitWithParameters' => $make_type_and_parameters_callback(2, 4), - '\Phan\Analysis\BinaryOperatorFlagVisitor::emitIssue' => $short_emit_issue_callback, - '\Phan\Language\Element\Comment\Builder::emitIssue' => $make_type_and_parameters_callback(0, 2), - ]; - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - $emit_plugin_issue_fqsen = FullyQualifiedMethodName::fromFullyQualifiedString('\Phan\PluginV2\IssueEmitter::emitPluginIssue'); - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - $analysis_visitor_fqsen = FullyQualifiedMethodName::fromFullyQualifiedString('\Phan\AST\AnalysisVisitor::emitIssue'); - - $emit_plugin_issue_callback = $make_array_issue_callback(3, 4); - foreach ($code_base->getMethodSet() as $method) { - $real_fqsen = $method->getRealDefiningFQSEN(); - if ($real_fqsen === $emit_plugin_issue_fqsen) { - $results[(string)$method->getFQSEN()] = $emit_plugin_issue_callback; - } elseif ($real_fqsen === $analysis_visitor_fqsen) { - $results[(string)$method->getFQSEN()] = $short_emit_issue_callback; - } - } - return $results; - } - - /** - * @return ?Issue - */ - private static function getIssueOrWarn(CodeBase $code_base, Context $context, FunctionInterface $function, string $issue_type) - { - try { - return Issue::fromType($issue_type); - } catch (InvalidArgumentException $_) { - self::emitIssue( - $code_base, - $context, - self::UnknownIssueType, - 'Unknown issue type {STRING_LITERAL} in a call to {METHOD}(). (may be a false positive - check if the version of Phan running PhanSelfCheckPlugin is the same version that the analyzed codebase is using)', - [$issue_type, $function->getFQSEN()] - ); - return null; - } - } - - private static function checkIssueTemplateUsage(CodeBase $code_base, Context $context, string $issue_message_template, int $issue_message_arg_count) - { - $issue_message_format_string = Issue::templateToFormatString($issue_message_template); - $expected_arg_count = ConversionSpec::computeExpectedArgumentCount($issue_message_format_string); - if ($expected_arg_count === $issue_message_arg_count) { - return; - } - if ($issue_message_arg_count > $expected_arg_count) { - self::emitIssue( - $code_base, - $context, - self::TooManyArgumentsForIssue, - 'Too many arguments for issue {STRING_LITERAL}: expected {COUNT}, got {COUNT}', - [StringUtil::jsonEncode($issue_message_template), $expected_arg_count, $issue_message_arg_count], - Issue::SEVERITY_NORMAL - ); - } else { - self::emitIssue( - $code_base, - $context, - self::TooFewArgumentsForIssue, - 'Too few arguments for issue {STRING_LITERAL}: expected {COUNT}, got {COUNT}', - [StringUtil::jsonEncode($issue_message_template), $expected_arg_count, $issue_message_arg_count], - Issue::SEVERITY_CRITICAL - ); - } - } - - /** - * @param Node|mixed $arg - * @return ?int - */ - private static function computeArraySize(CodeBase $code_base, Context $context, $arg) - { - if ($arg === null) { - return 0; - } - $union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $arg); - if ($union_type->typeCount() !== 1) { - return null; - } - $types = $union_type->getTypeSet(); - $array_shape_type = \reset($types); - if (!$array_shape_type instanceof ArrayShapeType) { - return null; - } - $field_types = $array_shape_type->getFieldTypes(); - foreach ($field_types as $field_type) { - if ($field_type->getIsPossiblyUndefined()) { - return null; - } - } - return count($field_types); - } -} - -return new PhanSelfCheckPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/PossiblyStaticMethodPlugin.php b/vendor/phan/phan/.phan/plugins/PossiblyStaticMethodPlugin.php deleted file mode 100644 index ca24049..0000000 --- a/vendor/phan/phan/.phan/plugins/PossiblyStaticMethodPlugin.php +++ /dev/null @@ -1,251 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\AST\ContextNode; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Element\Method; -use Phan\Language\ElementContext; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeMethodCapability; -use Phan\PluginV2\FinalizeProcessCapability; - -/** - * This file checks if a method can be made static without causing any errors. - * - * It hooks into these events: - * - * - analyzeMethod - * Once all classes are parsed, this method will be called - * on every method in the code base - * - * - finalizeProcess - * Once the analysis phase is complete, this method will be called - * - * A plugin file must - * - * - Contain a class that inherits from \Phan\PluginV2 - * - * - End by returning an instance of that class. - * - * It is assumed without being checked that plugins aren't - * mangling state within the passed code base or context. - * - * Note: When adding new plugins, - * add them to the corresponding section of README.md - */ -final class PossiblyStaticMethodPlugin extends PluginV2 implements - AnalyzeMethodCapability, - FinalizeProcessCapability -{ - - /** - * @var Method[] a list of methods where checks were postponed - */ - private $methods_for_postponed_analysis = []; - - /** - * @param CodeBase $code_base - * The code base in which the method exists - * - * @param Method $method - * A method being analyzed - * - * @return void - */ - private static function analyzePostponedMethod( - CodeBase $code_base, - Method $method - ) { - if ($method->getIsOverride()) { - // This method can't be static unless its parent is also static. - return; - } - if ($method->getIsOverriddenByAnother()) { - // Changing this method causes a fatal error. - return; - } - - $stmts_list = self::getStatementListToAnalyze($method); - if ($stmts_list === null) { - // check for abstract methods, etc. - return; - } - if (self::nodeCanBeStatic($code_base, $method, $stmts_list)) { - $visibility_upper = ucfirst($method->getVisibilityName()); - self::emitIssue( - $code_base, - $method->getContext(), - "PhanPluginPossiblyStatic${visibility_upper}Method", - "$visibility_upper method {METHOD} can be static", - [$method->getFQSEN()] - ); - } - } - - /** - * @param Method $method - * @return ?Node - returns null if there's no statement list to analyze - */ - private static function getStatementListToAnalyze(Method $method) - { - if (!$method->hasNode()) { - return null; - } - $node = $method->getNode(); - if (!$node) { - return null; - } - return $node->children['stmts']; - } - - /** - * @param CodeBase $code_base - * The code base in which the method exists - * - * @param Node|int|string|float|null $node - * @return bool - returns true if the node allows its method to be static - */ - private static function nodeCanBeStatic(CodeBase $code_base, Method $method, $node) - { - if (!($node instanceof Node)) { - if (is_array($node)) { - foreach ($node as $child_node) { - if (!self::nodeCanBeStatic($code_base, $method, $child_node)) { - return false; - } - } - } - return true; - } - switch ($node->kind) { - case ast\AST_VAR: - if ($node->children['name'] === 'this') { - return false; - } - // Handle edge cases such as `${$this->varName}` - break; - case ast\AST_CLASS: - case ast\AST_FUNC_DECL: - return true; - case ast\AST_STATIC_CALL: - if (self::isSelfOrParentCallUsingObject($code_base, $method, $node)) { - return false; - } - // Check code such as `static::someMethod($this->prop)` - break; - case ast\AST_CLOSURE: - if ($node->flags & \ast\flags\MODIFIER_STATIC) { - return true; - } - break; - } - foreach ($node->children as $child_node) { - if (!self::nodeCanBeStatic($code_base, $method, $child_node)) { - return false; - } - } - return true; - } - - /** - * @param CodeBase $code_base - * The code base in which the calling instance method exists - * - * @param Node $node a node of kind ast\AST_STATIC_CALL - * (e.g. SELF::someMethod(), parent::someMethod(), SomeClass::staticMethod()) - * - * @return bool true if the AST_STATIC_CALL node is really calling an instance method - */ - private static function isSelfOrParentCallUsingObject(CodeBase $code_base, Method $method, Node $node) : bool - { - $class_node = $node->children['class']; - if (!($class_node instanceof Node && $class_node->kind === ast\AST_NAME)) { - return false; - } - $class_name = $class_node->children['name']; - if (!is_string($class_name)) { - return false; - } - if (!in_array(strtolower($class_name), ['self', 'parent'], true)) { - return false; - } - $method_name = $node->children['method']; - if (!is_string($method_name)) { - // This is uninferable - return true; - } - try { - $method = (new ContextNode($code_base, new ElementContext($method), $node))->getMethod($method_name, true, false); - } catch (Exception $_) { - // This might be an instance method if we don't know what it is - return true; - } - return !$method->isStatic(); - } - - /** - * @param CodeBase $unused_code_base - * The code base in which the method exists - * - * @param Method $method - * A method being analyzed - * - * @return void - * - * @override - */ - public function analyzeMethod( - CodeBase $unused_code_base, - Method $method - ) { - // 1. Perform any checks that can be done immediately to rule out being able - // to convert this to a static method - if ($method->isStatic()) { - // This is what we want. - return; - } - if ($method->getIsMagic()) { - // Magic methods can't be static. - return; - } - if ($method->getFQSEN() !== $method->getRealDefiningFQSEN()) { - // Only warn once for the original definition of this method. - // Don't warn about subclasses inheriting this method. - return; - } - $method_filter = Config::getValue('plugin_config')['possibly_static_method_ignore_regex'] ?? null; - if (is_string($method_filter)) { - $fqsen_string = ltrim((string)$method->getFQSEN(), '\\'); - if (preg_match($method_filter, $fqsen_string) > 0) { - return; - } - } - if (!$method->hasNode()) { - // There's no body to check - This is abstract or can't be checked - return; - } - $fqsen = $method->getFQSEN(); - - // 2. Defer remaining checks until we have all the necessary information - // (is this method overridden/an override, is parent::foo() referring to a static or an instance method, etc.) - $this->methods_for_postponed_analysis[(string) $fqsen] = $method; - } - - /** - * @param CodeBase $code_base - * The code base being analyzed - * - * @override - */ - public function finalizeProcess(CodeBase $code_base) - { - foreach ($this->methods_for_postponed_analysis as $method) { - self::analyzePostponedMethod($code_base, $method); - } - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new PossiblyStaticMethodPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/PregRegexCheckerPlugin.php b/vendor/phan/phan/.phan/plugins/PregRegexCheckerPlugin.php deleted file mode 100644 index de80bc3..0000000 --- a/vendor/phan/phan/.phan/plugins/PregRegexCheckerPlugin.php +++ /dev/null @@ -1,293 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Element\Func; -use Phan\Language\Type\IterableType; -use Phan\Language\Type\LiteralStringType; -use Phan\Library\RegexKeyExtractor; -use Phan\Library\StringUtil; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeFunctionCallCapability; - -/** - * This plugin checks for invalid regexes in calls to preg_match. (And all of the other internal PCRE functions). - * - * This plugin performs this check by attempting to match the empty string, - * then checking if PHP emitted a warning (Instead of failing to match) - * (PHP doesn't have preg_validate()) - * - * - getAnalyzeFunctionCallClosures - * This method returns a map from function/method FQSEN to closures that are called on invocations of those closures. - */ -class PregRegexCheckerPlugin extends PluginV2 implements AnalyzeFunctionCallCapability -{ - // Skip over analyzing regex keys that couldn't be resolved. - // Don't try to convert values to PHP data (should be closures) - const RESOLVE_REGEX_KEY_FLAGS = (ContextNode::RESOLVE_DEFAULT | ContextNode::RESOLVE_KEYS_SKIP_UNKNOWN_KEYS) & - ~(ContextNode::RESOLVE_KEYS_SKIP_UNKNOWN_KEYS | ContextNode::RESOLVE_ARRAY_VALUES); - - - /** @return void */ - private static function analyzePattern(CodeBase $code_base, Context $context, Func $function, string $pattern) - { - /** - * @suppress PhanParamSuspiciousOrder 100% deliberate use of varying regex and constant $subject for preg_match - * @return ?array<string,mixed> - */ - $err = with_disabled_phan_error_handler(static function () use ($pattern) { - $old_error_reporting = error_reporting(); - \error_reporting(0); - \ob_start(); - \error_clear_last(); - try { - // Annoyingly, preg_match would not warn about the `/e` modifier, removed in php 7. - // Use `preg_replace` instead (The eval body is empty and phan requires 7.0+ to run) - $result = @\preg_replace($pattern, '', ''); - if ($result === false || $result === null) { - return \error_get_last() ?? []; - } - return null; - } finally { - \ob_end_clean(); - \error_reporting($old_error_reporting); - } - }); - if ($err !== null) { - // TODO: scan for 'at offset %d$' and print the corresponding section of the regex. Note: Have to remove delimiters and unescape characters within the delimiters. - self::emitIssue( - $code_base, - $context, - 'PhanPluginInvalidPregRegex', - 'Call to {FUNCTION} was passed an invalid regex {STRING_LITERAL}: {DETAILS}', - [(string)$function->getFQSEN(), StringUtil::encodeValue($pattern), \preg_replace('@^preg_replace\(\): @', '', $err['message'] ?? 'unknown error')] - ); - return; - } - } - - /** - * @param CodeBase $code_base - * @param Context $context - * @param Node|string|int|float $pattern - * @return array<string,string> - */ - private static function extractStringsFromStringOrArray( - CodeBase $code_base, - Context $context, - $pattern - ) : array { - if (\is_string($pattern)) { - return [$pattern => $pattern]; - } - $pattern_union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $pattern); - $result = []; - foreach ($pattern_union_type->getTypeSet() as $type) { - if ($type instanceof LiteralStringType) { - $value = $type->getValue(); - $result[$value] = $value; - } elseif ($type instanceof IterableType) { - $iterable_type = $type->iterableValueUnionType($code_base); - foreach ($iterable_type ? $iterable_type->getTypeSet() : [] as $element_type) { - if ($element_type instanceof LiteralStringType) { - $value = $element_type->getValue(); - $result[$value] = $value; - } - } - } - } - return $result; - } - - /** - * @param array<int,string> $patterns 1 or more regex patterns - * @return array<string|int,true> the set of keys in the pattern - * @throws InvalidArgumentException if any regex could not be parsed by the heuristics - */ - private static function computePatternKeys(array $patterns) : array - { - $result = []; - foreach ($patterns as $regex) { - $result += RegexKeyExtractor::getKeys($regex); - } - return $result; - } - - /** - * @return array<int|string,string> references to indices in the pattern - */ - private static function extractTemplateKeys(string $template) : array - { - $result = []; - // > replacement may contain references of the form \\n or $n, - // ... - // > n can be from 0 to 99, and \\0 or $0 refers to the text matched by the whole pattern. - preg_match_all('/[$\\\\]([0-9]{1,2}|[^0-9{]|(?<=\$)\{[0-9]{1,2}\})/', $template, $all_matches, PREG_SET_ORDER); - foreach ($all_matches as $match) { - $key = $match[1]; - if ($key[0] === '{') { - $key = (string)\substr($key, 1, -1); - } - if ($key[0] >= '0' && $key[0] <= '9') { - // Edge case: Convert '09' to 9 - $result[(int)$key] = $match[0]; - } - } - return $result; - } - - /** - * @param string[] $patterns 1 or more regex patterns - * @param Node|string|int|float $replacement_node - */ - private static function analyzeReplacementTemplate(CodeBase $code_base, Context $context, array $patterns, $replacement_node) - { - $replacement_templates = self::extractStringsFromStringOrArray($code_base, $context, $replacement_node); - $pattern_keys = null; - - // https://secure.php.net/manual/en/function.preg-replace.php#refsect1-function.preg-replace-parameters - // > $replacement may contain references of the form \\n or $n, with the latter form being the preferred one. - try { - foreach ($replacement_templates as $replacement_template) { - $pattern_keys = $pattern_keys ?? self::computePatternKeys($patterns); - $regex_group_keys = self::extractTemplateKeys($replacement_template); - foreach ($regex_group_keys as $key => $reference_string) { - if (!isset($pattern_keys[$key])) { - usort($patterns, 'strcmp'); - self::emitIssue( - $code_base, - $context, - 'PhanPluginInvalidPregRegexReplacement', - 'Call to {FUNCTION} was passed an invalid replacement reference {STRING_LITERAL} to pattern {STRING_LITERAL}', - ['\preg_replace', StringUtil::encodeValue($reference_string), StringUtil::encodeValueList(' or ', $patterns)] - ); - } - } - } - } catch (InvalidArgumentException $_) { - // TODO: Is this warned about elsewhere? - return; - } - } - - /** - * @param CodeBase $code_base @phan-unused-param - * @return array<string, Closure(CodeBase,Context,Func,array):void> - */ - public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array - { - /** - * @param array<int,Node|string|int|float> $args the nodes for the arguments to the invocation - * @return void - */ - $preg_pattern_callback = static function ( - CodeBase $code_base, - Context $context, - Func $function, - array $args - ) { - if (count($args) < 1) { - return; - } - $pattern = $args[0]; - if ($pattern instanceof Node) { - $pattern = (new ContextNode($code_base, $context, $pattern))->getEquivalentPHPScalarValue(); - } - if (\is_string($pattern)) { - self::analyzePattern($code_base, $context, $function, $pattern); - } - }; - - /** - * @param array<int,Node|int|string|float> $args - * @return void - */ - $preg_pattern_or_array_callback = static function ( - CodeBase $code_base, - Context $context, - Func $function, - array $args - ) { - if (count($args) < 1) { - return; - } - $pattern_node = $args[0]; - foreach (self::extractStringsFromStringOrArray($code_base, $context, $pattern_node) as $pattern) { - self::analyzePattern($code_base, $context, $function, $pattern); - } - }; - - /** - * @param array<int,Node|int|string|float> $args - * @return void - */ - $preg_pattern_and_replacement_callback = static function ( - CodeBase $code_base, - Context $context, - Func $function, - array $args - ) { - if (count($args) < 1) { - return; - } - $pattern_node = $args[0]; - $patterns = self::extractStringsFromStringOrArray($code_base, $context, $pattern_node); - if (count($patterns) === 0) { - return; - } - foreach ($patterns as $pattern) { - self::analyzePattern($code_base, $context, $function, $pattern); - } - if (count($args) < 2) { - return; - } - self::analyzeReplacementTemplate($code_base, $context, $patterns, $args[1]); - }; - - /** - * @param array<int,Node|string|int|float> $args the nodes for the arguments to the invocation - * @return void - */ - $preg_replace_callback_array_callback = static function ( - CodeBase $code_base, - Context $context, - Func $function, - array $args - ) { - if (count($args) < 1) { - return; - } - // TODO: Resolve global constants and class constants? - $pattern = $args[0]; - if ($pattern instanceof Node) { - $pattern = (new ContextNode($code_base, $context, $pattern))->getEquivalentPHPValue(self::RESOLVE_REGEX_KEY_FLAGS); - } - if (\is_array($pattern)) { - foreach ($pattern as $child_pattern => $_) { - self::analyzePattern($code_base, $context, $function, (string)$child_pattern); - } - return; - } - }; - - // TODO: Check that the callbacks have the right signatures in another PR? - return [ - // call - 'preg_filter' => $preg_pattern_or_array_callback, - 'preg_grep' => $preg_pattern_callback, - 'preg_match' => $preg_pattern_callback, - 'preg_match_all' => $preg_pattern_callback, - 'preg_replace_callback_array' => $preg_replace_callback_array_callback, - 'preg_replace_callback' => $preg_pattern_or_array_callback, - 'preg_replace' => $preg_pattern_and_replacement_callback, - 'preg_split' => $preg_pattern_callback, - ]; - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new PregRegexCheckerPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/PrintfCheckerPlugin.php b/vendor/phan/phan/.phan/plugins/PrintfCheckerPlugin.php deleted file mode 100644 index b813bd8..0000000 --- a/vendor/phan/phan/.phan/plugins/PrintfCheckerPlugin.php +++ /dev/null @@ -1,737 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\PrintfCheckerPlugin; // Don't pollute the global namespace - -use ast; -use ast\Node; -use Phan\AST\ASTReverter; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Exception\CodeBaseException; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Type; -use Phan\Language\Type\FalseType; -use Phan\Language\Type\LiteralStringType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; -use Phan\Library\ConversionSpec; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeFunctionCallCapability; -use Phan\PluginV2\ReturnTypeOverrideCapability; -use function count; -use function implode; -use function is_object; -use function is_string; -use function strcasecmp; -use function var_export; - -/** - * This plugin checks for invalid format strings and invalid uses of format strings in printf and sprintf, etc. - * e.g. for printf("literal format %s", $arg) - * - * This uses ConversionSpec as a heuristic to determine the positions used by PHP format strings. - * Some edge cases may have been overlooked. - * - * This validates strings of the form - * - constant strings, such as '%d of %s' - * - TODO: _(str) and gettext(str) - * - TODO: Better resolution of global constants and class constants - * - * This analyzes printf, sprintf, and fprintf. - * - * TODO: Add optional verbose warnings about unanalyzable strings - * TODO: Check if arg can cast to string. - */ -class PrintfCheckerPlugin extends PluginV2 implements AnalyzeFunctionCallCapability, ReturnTypeOverrideCapability -{ - - // Pylint error codes for emitted issues. - const ERR_UNTRANSLATED_USE_ECHO = 1300; - const ERR_UNTRANSLATED_NONE_USED = 1301; - const ERR_UNTRANSLATED_NONEXISTENT = 1302; - const ERR_UNTRANSLATED_UNUSED = 1303; - const ERR_UNTRANSLATED_NOT_PERCENT = 1304; - const ERR_UNTRANSLATED_INCOMPATIBLE_SPECIFIER = 1305; - const ERR_UNTRANSLATED_INCOMPATIBLE_ARGUMENT = 1306; // E.g. passing a string where an int is expected - const ERR_UNTRANSLATED_INCOMPATIBLE_ARGUMENT_WEAK = 1307; // E.g. passing an int where a string is expected - const ERR_UNTRANSLATED_WIDTH_INSTEAD_OF_POSITION = 1308; // e.g. _('%1s'). Change to _('%1$1s' if you really mean that the width is 1, add positions for others ('%2$s', etc.) - const ERR_UNTRANSLATED_UNKNOWN_FORMAT_STRING = 1310; - const ERR_TRANSLATED_INCOMPATIBLE = 1309; - const ERR_TRANSLATED_HAS_MORE_ARGS = 1311; - - /** - * People who have translations may subclass this plugin and return a mapping from other locales to those locales translations of $fmt_str. - * @param string $fmt_str @phan-unused-param - * @return string[] mapping locale to the translation (e.g. ['fr_FR' => 'Bonjour'] for $fmt_str == 'Hello') - */ - protected static function gettextForAllLocales(string $fmt_str) - { - return []; - } - - /** - * Convert an expression(a list of tokens) to a primitive. - * People who have custom such as methods or functions to fetch translations - * may subclass this plugin and override this method to add checks for AST_CALL (foo()), AST_METHOD_CALL(MyClass::getTranslation($id), etc.) - * - * @param CodeBase $code_base - * @param Context $context - * @param bool|int|string|float|Node|array|null $ast_node - * @return ?PrimitiveValue - */ - protected function astNodeToPrimitive(CodeBase $code_base, Context $context, $ast_node) - { - // Base case: convert primitive tokens such as numbers and strings. - if (!($ast_node instanceof Node)) { - return new PrimitiveValue($ast_node); - } - switch ($ast_node->kind) { - // TODO: Resolve class constant access when those are format strings. Same for PregRegexCheckerPlugin. - case \ast\AST_CALL: - $name_node = $ast_node->children['expr']; - if ($name_node->kind === \ast\AST_NAME) { - // TODO: Use Phan's function resolution? - // TODO: ngettext? - $name = $name_node->children['name']; - if (!\is_string($name)) { - break; - } - if ($name === '_' || strcasecmp($name, 'gettext') === 0) { - $child_arg = $ast_node->children['args']->children[0] ?? null; - if ($child_arg === null) { - break; - } - $prim = self::astNodeToPrimitive($code_base, $context, $child_arg); - if ($prim === null) { - break; - } - return new PrimitiveValue($prim->value, true); - } - } - break; - case \ast\AST_BINARY_OP: - if ($ast_node->flags !== ast\flags\BINARY_CONCAT) { - break; - } - $left = $this->astNodeToPrimitive($code_base, $context, $ast_node->children['left']); - if ($left === null) { - break; - } - $right = $this->astNodeToPrimitive($code_base, $context, $ast_node->children['right']); - if ($right === null) { - break; - } - $result = self::concatenateToPrimitive($left, $right); - if ($result) { - return $result; - } - break; - } - $result = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $ast_node)->asSingleScalarValueOrNullOrSelf(); - if (!is_object($result)) { - return new PrimitiveValue($result); - } - // We don't know how to convert this to a primitive, give up. - // (Subclasses may add their own logic first, then call self::astNodeToPrimitive) - return null; - } - - /** - * Convert a primitive and a sequence of tokens to a primitive formed by - * concatenating strings. - * - * @param PrimitiveValue $left the value on the left. - * @param PrimitiveValue $right the value on the right. - * @return ?PrimitiveValue - */ - protected static function concatenateToPrimitive(PrimitiveValue $left, PrimitiveValue $right) - { - // Combining untranslated strings with anything will cause problems. - if ($left->is_translated) { - return null; - } - if ($right->is_translated) { - return null; - } - $str = $left->value . $right->value; - return new PrimitiveValue($str); - } - - public function getReturnTypeOverrides(CodeBase $unused_code_base) : array - { - $string_union_type = StringType::instance(false)->asUnionType(); - /** - * @param array<int,Node|string|int|float> $args the nodes for the arguments to the invocation - */ - $sprintf_handler = static function ( - CodeBase $code_base, - Context $context, - Func $unused_function, - array $args - ) use ($string_union_type) : UnionType { - if (count($args) < 1) { - return FalseType::instance(false)->asUnionType(); - } - $union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - $format_strings = []; - foreach ($union_type->getTypeSet() as $type) { - if (!$type instanceof LiteralStringType) { - return $string_union_type; - } - $format_strings[] = $type->getValue(); - } - if (count($format_strings) === 0) { - return $string_union_type; - } - $result_union_type = UnionType::empty(); - foreach ($format_strings as $format_string) { - $min_width = 0; - foreach (ConversionSpec::extractAll($format_string) as $spec_group) { - foreach ($spec_group as $spec) { - $min_width += ($spec->width ?: 0); - } - } - if (!LiteralStringType::canRepresentStringOfLength($min_width)) { - return $string_union_type; - } - $sprintf_args = []; - for ($i = 1; $i < count($args); $i++) { - $arg = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[$i])->asSingleScalarValueOrNullOrSelf(); - if (is_object($arg)) { - return $string_union_type; - } - $sprintf_args[] = $arg; - } - $result = \with_disabled_phan_error_handler( - /** @return string */ - static function () use ($format_string, $sprintf_args) { - // @phan-suppress-next-line PhanPluginPrintfVariableFormatString - return @\vsprintf($format_string, $sprintf_args); - } - ); - $result_union_type = $result_union_type->withType(Type::fromObject($result)); - } - return $result_union_type; - }; - return [ - 'sprintf' => $sprintf_handler, - ]; - } - - /** - * @param CodeBase $code_base @phan-unused-param - * @return \Closure[] - */ - public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array - { - /** - * Analyzes a printf-like function with a format directive in the first position. - * @param array<int,Node|string|int|float> $args the nodes for the arguments to the invocation - * @return void - */ - $printf_callback = function ( - CodeBase $code_base, - Context $context, - Func $function, - array $args - ) { - // TODO: Resolve global constants and class constants? - // TODO: Check for AST_UNPACK - $pattern = $args[0] ?? null; - if ($pattern === null) { - return; - } - if ($pattern instanceof Node) { - $pattern = (new ContextNode($code_base, $context, $pattern))->getEquivalentPHPScalarValue(); - } - $remaining_args = \array_slice($args, 1); - $this->analyzePrintfPattern($code_base, $context, $function, $pattern, $remaining_args); - }; - /** - * Analyzes a printf-like function with a format directive in the first position. - * @param array<int,Node|string|int|float> $args the nodes for the arguments to the invocation - * @return void - */ - $fprintf_callback = function ( - CodeBase $code_base, - Context $context, - Func $function, - array $args - ) { - if (\count($args) < 2) { - return; - } - // TODO: Resolve global constants and class constants? - // TODO: Check for AST_UNPACK - $pattern = $args[1]; - if ($pattern instanceof Node) { - $pattern = (new ContextNode($code_base, $context, $pattern))->getEquivalentPHPValue(); - } - $remaining_args = \array_slice($args, 2); - $this->analyzePrintfPattern($code_base, $context, $function, $pattern, $remaining_args); - }; - /** - * Analyzes a printf-like function with a format directive in the first position. - * @param array<int,Node|int|string|float> $args - * @return void - */ - $vprintf_callback = function ( - CodeBase $code_base, - Context $context, - Func $function, - array $args - ) { - if (\count($args) < 2) { - return; - } - // TODO: Resolve global constants and class constants? - // TODO: Check for AST_UNPACK - $pattern = $args[0]; - if ($pattern instanceof Node) { - $pattern = (new ContextNode($code_base, $context, $pattern))->getEquivalentPHPScalarValue(); - } - $format_args_node = $args[1]; - $format_args = (new ContextNode($code_base, $context, $format_args_node))->getEquivalentPHPValue(); - $this->analyzePrintfPattern($code_base, $context, $function, $pattern, \is_array($format_args) ? $format_args : null); - }; - /** - * Analyzes a printf-like function with a format directive in the first position. - * @param array<int,Node|string|int|float> $args the nodes for the arguments to the invocation - * @return void - */ - $vfprintf_callback = function ( - CodeBase $code_base, - Context $context, - Func $function, - array $args - ) { - if (\count($args) < 3) { - return; - } - // TODO: Resolve global constants and class constants? - // TODO: Check for AST_UNPACK - $pattern = $args[1]; - if ($pattern instanceof Node) { - $pattern = (new ContextNode($code_base, $context, $pattern))->getEquivalentPHPScalarValue(); - } - $format_args_node = $args[2]; - $format_args = (new ContextNode($code_base, $context, $format_args_node))->getEquivalentPHPValue(); - $this->analyzePrintfPattern($code_base, $context, $function, $pattern, \is_array($format_args) ? $format_args : null); - }; - return [ - // call - 'printf' => $printf_callback, - 'sprintf' => $printf_callback, - 'fprintf' => $fprintf_callback, - 'vprintf' => $vprintf_callback, - 'vsprintf' => $vprintf_callback, - 'vfprintf' => $vfprintf_callback, - ]; - } - - protected static function encodeString(string $str) : string - { - $result = \json_encode($str, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE); - if ($result !== false) { - return $result; - } - return var_export($str, true); - } - - /** - * Analyzes a printf pattern, emitting issues if necessary - * @param CodeBase $code_base - * @param Context $context - * @param FunctionInterface $function - * @param Node|array|string|float|int|bool|null $pattern_node - * @param ?(Node|string|int|float)[] $arg_nodes arguments following the format string. Null if the arguments could not be determined. - * @return void - * @suppress PhanPartialTypeMismatchArgument TODO: refactor into smaller functions - */ - protected function analyzePrintfPattern(CodeBase $code_base, Context $context, FunctionInterface $function, $pattern_node, $arg_nodes) - { - // Given a node, extract the printf directive and whether or not it could be translated - $primitive_for_fmtstr = $this->astNodeToPrimitive($code_base, $context, $pattern_node); - if ($primitive_for_fmtstr === null) { - self::emitIssue( - $code_base, - $context, - 'PhanPluginPrintfVariableFormatString', - 'Code {CODE} has a dynamic format string that could not be inferred by Phan', - [ASTReverter::toShortString($pattern_node)], - Issue::SEVERITY_LOW, - Issue::REMEDIATION_B, - self::ERR_UNTRANSLATED_UNKNOWN_FORMAT_STRING - ); - // TODO: Add a verbose option - return; - } - // Make sure that the untranslated format string is being used correctly. - // If the format string will be translated, also check the translations. - - $fmt_str = $primitive_for_fmtstr->value; - $is_translated = $primitive_for_fmtstr->is_translated; - $specs = is_string($fmt_str) ? ConversionSpec::extractAll($fmt_str) : []; - $fmt_str = (string)$fmt_str; - /** - * @param string $issue_type - * A name for the type of issue such as 'PhanPluginMyIssue' - * - * @param string $issue_message_format - * The complete issue message format string to emit such as - * 'class with fqsen {CLASS} is broken in some fashion' (preferred) - * or 'class with fqsen %s is broken in some fashion' - * The list of placeholders for between braces can be found - * in \Phan\Issue::uncolored_format_string_for_template. - * - * @param array<int,string|float|int> $issue_message_args - * The arguments for this issue format. - * If this array is empty, $issue_message_args is kept in place - * - * @param int $severity - * A value from the set {Issue::SEVERITY_LOW, - * Issue::SEVERITY_NORMAL, Issue::SEVERITY_HIGH}. - * - * @param int $issue_type_id An issue id for pylint - */ - $emit_issue = static function (string $issue_type, string $issue_message_format, array $issue_message_args, int $severity, int $issue_type_id) use ($code_base, $context) { - self::emitIssue( - $code_base, - $context, - $issue_type, - $issue_message_format, - $issue_message_args, - $severity, - Issue::REMEDIATION_B, - $issue_type_id - ); - }; - - // Check for extra or missing arguments - if (\is_array($arg_nodes) && \count($arg_nodes) === 0) { - if (count($specs) > 0) { - $largest_positional = \max(\array_keys($specs)); - $examples = []; - foreach ($specs[$largest_positional] as $example_spec) { - $examples[] = self::encodeString($example_spec->directive); - } - // emit issues with 1-based offsets - $emit_issue( - 'PhanPluginPrintfNonexistentArgument', - 'Format string {STRING_LITERAL} refers to nonexistent argument #{INDEX} in {STRING_LITERAL}', - [self::encodeString($fmt_str), $largest_positional, \implode(',', $examples)], - Issue::SEVERITY_NORMAL, - self::ERR_UNTRANSLATED_NONEXISTENT - ); - } - $replacement_function_name = \in_array($function->getName(), ['vprintf', 'fprintf', 'vfprintf']) ? 'fwrite' : 'echo'; - $emit_issue( - "PhanPluginPrintfNoArguments", - "No format string arguments are given for {STRING_LITERAL}, consider using {FUNCTION} instead", - [self::encodeString($fmt_str), $replacement_function_name], - Issue::SEVERITY_LOW, - self::ERR_UNTRANSLATED_USE_ECHO - ); - return; - } - if (count($specs) == 0) { - $emit_issue( - 'PhanPluginPrintfNoSpecifiers', - 'None of the formatting arguments passed alongside format string {STRING_LITERAL} are used', - [self::encodeString($fmt_str)], - Issue::SEVERITY_LOW, - self::ERR_UNTRANSLATED_NONE_USED - ); - return; - } - - if (\is_array($arg_nodes)) { - $largest_positional = \max(\array_keys($specs)); - if ($largest_positional > \count($arg_nodes)) { - $examples = []; - foreach ($specs[$largest_positional] as $example_spec) { - $examples[] = self::encodeString($example_spec->directive); - } - // emit issues with 1-based offsets - $emit_issue( - 'PhanPluginPrintfNonexistentArgument', - 'Format string {STRING_LITERAL} refers to nonexistent argument #{INDEX} in {STRING_LITERAL}', - [self::encodeString($fmt_str), $largest_positional, \implode(',', $examples)], - Issue::SEVERITY_NORMAL, - self::ERR_UNTRANSLATED_NONEXISTENT - ); - } elseif ($largest_positional < count($arg_nodes)) { - $emit_issue( - 'PhanPluginPrintfUnusedArgument', - 'Format string {STRING_LITERAL} does not use provided argument #{INDEX}', - [self::encodeString($fmt_str), $largest_positional + 1], - Issue::SEVERITY_NORMAL, - self::ERR_UNTRANSLATED_UNUSED - ); - } - } - - /** @var string[][] maps argument position to a list of possible canonical strings (e.g. '%1$d') for that argument */ - $types_of_arg = []; - - // Check format string alone for common signs of problems. - // E.g. "% s", "%1$d %1$s" - foreach ($specs as $i => $spec_group) { - $types = []; - foreach ($spec_group as $spec) { - $canonical = $spec->toCanonicalString(); - $types[$canonical] = true; - if ($spec->padding_char === ' ' && ($spec->width === '' || !$spec->position)) { - // Warn about "100% dollars" but not about "100%1$ 2dollars" (If both position and width were parsed, assume the padding was intentional) - $emit_issue( - 'PhanPluginPrintfNotPercent', - // phpcs:ignore Generic.Files.LineLength.MaxExceeded - "Format string {STRING_LITERAL} contains something that is not a percent sign, it will be treated as a format string '{STRING_LITERAL}' with padding. Use {DETAILS} for a literal percent sign, or '{STRING_LITERAL}' to be less ambiguous", - [self::encodeString($fmt_str), $spec->directive, '%%', $canonical], - Issue::SEVERITY_NORMAL, - self::ERR_UNTRANSLATED_NOT_PERCENT - ); - } - if ($is_translated && $spec->width && - ($spec->padding_char === '' || $spec->padding_char === ' ')) { - $intended_string = $spec->toCanonicalStringWithWidthAsPosition(); - $emit_issue( - 'PhanPluginPrintfWidthNotPosition', - "Format string {STRING_LITERAL} is specifying a width({STRING_LITERAL}) instead of a position({STRING_LITERAL})", - [self::encodeString($fmt_str), self::encodeString($canonical), self::encodeString($intended_string)], - Issue::SEVERITY_NORMAL, - self::ERR_UNTRANSLATED_WIDTH_INSTEAD_OF_POSITION - ); - } - } - - $types_of_arg[$i] = $types; - if (count($types) > 1) { - // May be an off by one error in the format string. - $emit_issue( - 'PhanPluginPrintfIncompatibleSpecifier', - 'Format string {STRING_LITERAL} refers to argument #{INDEX} in different ways: {DETAILS}', - [self::encodeString($fmt_str), $i, implode(',', \array_keys($types))], - Issue::SEVERITY_LOW, - self::ERR_UNTRANSLATED_INCOMPATIBLE_SPECIFIER - ); - } - } - - if (\is_array($arg_nodes)) { - foreach ($specs as $i => $spec_group) { - // $arg_nodes is a 0-based array, $spec_group is 1-based. - $arg_node = $arg_nodes[$i - 1] ?? null; - if (!isset($arg_node)) { - continue; - } - $actual_union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $arg_node); - if ($actual_union_type->isEmpty()) { - // Nothing to check. - continue; - } - - $expected_set = []; - foreach ($spec_group as $spec) { - $type_name = $spec->getExpectedUnionTypeName(); - $expected_set[$type_name] = true; - } - $expected_union_type = new UnionType(); - foreach ($expected_set as $type_name => $_) { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall getExpectedUnionTypeName should only return valid union types - $expected_union_type = $expected_union_type->withType(Type::fromFullyQualifiedString($type_name)); - } - if ($actual_union_type->canCastToUnionType($expected_union_type)) { - continue; - } - if (isset($expected_set['string'])) { - $can_cast_to_string = false; - // Allow passing objects with __toString() to printf whether or not strict types are used in the caller. - // TODO: Move into a common helper method? - try { - foreach ($actual_union_type->asExpandedTypes($code_base)->asClassList($code_base, $context) as $clazz) { - if ($clazz->hasMethodWithName($code_base, '__toString')) { - $can_cast_to_string = true; - break; - } - } - } catch (CodeBaseException $_) { - // Swallow "Cannot find class", go on to emit issue. - } - if ($can_cast_to_string) { - continue; - } - } - - $expected_union_type_string = (string)$expected_union_type; - if (self::canWeakCast($actual_union_type, $expected_set)) { - // This can be resolved by casting the arg to (string) manually in printf. - $emit_issue( - 'PhanPluginPrintfIncompatibleArgumentTypeWeak', - // phpcs:ignore Generic.Files.LineLength.MaxExceeded - 'Format string {STRING_LITERAL} refers to argument #{INDEX} as {DETAILS}, so type {TYPE} is expected. However, {FUNCTION} was passed the type {TYPE} (which is weaker than {TYPE})', - [ - self::encodeString($fmt_str), - $i, - self::getSpecStringsRepresentation($spec_group), - $expected_union_type_string, - $function->getName(), - (string)$actual_union_type, - $expected_union_type_string, - ], - Issue::SEVERITY_LOW, - self::ERR_UNTRANSLATED_INCOMPATIBLE_ARGUMENT_WEAK - ); - } else { - // This can be resolved by casting the arg to (int) manually in printf. - $emit_issue( - 'PhanPluginPrintfIncompatibleArgumentType', - 'Format string {STRING_LITERAL} refers to argument #{INDEX} as {DETAILS}, so type {TYPE} is expected, but {FUNCTION} was passed incompatible type {TYPE}', - [ - self::encodeString($fmt_str), - $i, - self::getSpecStringsRepresentation($spec_group), - $expected_union_type_string, - $function->getName(), - (string)$actual_union_type, - ], - Issue::SEVERITY_LOW, - self::ERR_UNTRANSLATED_INCOMPATIBLE_ARGUMENT - ); - } - } - } - - // Make sure the translations are compatible with this format string. - // In order to take advantage of the ability to analyze translations, override gettextForAllLocales - if ($is_translated) { - $this->validateTranslations($code_base, $context, $fmt_str, $types_of_arg); - } - } - - /** - * @param ConversionSpec[] $specs - */ - private static function getSpecStringsRepresentation(array $specs) : string - { - return \implode(',', \array_unique(\array_map(static function (ConversionSpec $spec) : string { - return $spec->directive; - }, $specs))); - } - - /** - * @param array<string,true> $expected_set the types being checked for the ability to weakly cast to - */ - private static function canWeakCast(UnionType $actual_union_type, array $expected_set) : bool - { - if (isset($expected_set['string'])) { - static $string_weak_types; - if ($string_weak_types === null) { - $string_weak_types = UnionType::fromFullyQualifiedString('int|string|float'); - } - return $actual_union_type->canCastToUnionType($string_weak_types); - } - // We already allow int->float conversion - return false; - } - - /** - * TODO: Finish testing this. - * - * By default, this is a no-op, unless gettextForAllLocales is overridden in a subclass - * - * Check that the translations of the format string $fmt_str - * are compatible with the untranslated format string. - * - * In virtually all cases, the conversions specifiers should be - * identical to the conversion specifier (apart from whether or not - * position is explicitly stated) - * - * Emits issues. - * - * @param CodeBase $code_base - * @param Context $context - * @param string $fmt_str - * @param ConversionSpec[][] $types_of_arg contains array of ConversionSpec for - * each position in the untranslated format string. - * @return void - */ - protected static function validateTranslations(CodeBase $code_base, Context $context, string $fmt_str, array $types_of_arg) - { - $translations = static::gettextForAllLocales($fmt_str); - foreach ($translations as $locale => $translated_fmt_str) { - // Skip untranslated or equal strings. - if ($translated_fmt_str === $fmt_str) { - continue; - } - // Compare the translated specs for a given position to the existing spec. - $translated_specs = ConversionSpec::extractAll($translated_fmt_str); - foreach ($translated_specs as $i => $spec_group) { - $expected = $types_of_arg[$i] ?? []; - foreach ($spec_group as $spec) { - $canonical = $spec->toCanonicalString(); - if (!isset($expected[$canonical])) { - $expected_types = $expected ? implode(',', \array_keys($expected)) - : 'unused'; - - if ($expected_types !== 'unused') { - $severity = Issue::SEVERITY_NORMAL; - $issue_type_id = self::ERR_TRANSLATED_INCOMPATIBLE; - $issue_type = 'PhanPluginPrintfTranslatedIncompatible'; - } else { - $severity = Issue::SEVERITY_NORMAL; - $issue_type_id = self::ERR_TRANSLATED_HAS_MORE_ARGS; - $issue_type = 'PhanPluginPrintfTranslatedHasMoreArgs'; - } - self::emitIssue( - $code_base, - $context, - $issue_type, - // phpcs:ignore Generic.Files.LineLength.MaxExceeded - 'Translated string {STRING_LITERAL} has local {DETAILS} which refers to argument #{INDEX} as {STRING_LITERAL}, but the original format string treats it as {DETAILS} (ORIGINAL: {STRING_LITERAL}, TRANSLATION: {STRING_LITERAL})', - [ - self::encodeString($fmt_str), - $locale, - $i, - $canonical, - $expected_types, - self::encodeString($fmt_str), - self::encodeString($translated_fmt_str), - ], - $severity, - Issue::REMEDIATION_B, - $issue_type_id - ); - } - } - } - } - } -} - -/** - * Represents the information we have about the result of evaluating an expression. - * Currently, used only for printf arguments. - */ -class PrimitiveValue -{ - /** @var array|int|string|float|bool|null The primitive value of the expression if it could be determined. */ - public $value; - /** @var bool Whether or not the expression value was translated. */ - public $is_translated; - - /** - * @param array|int|string|float|bool|null $value - */ - public function __construct($value, bool $is_translated = false) - { - $this->value = $value; - $this->is_translated = $is_translated; - } -} - -return new PrintfCheckerPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/README.md b/vendor/phan/phan/.phan/plugins/README.md deleted file mode 100644 index ffd525f..0000000 --- a/vendor/phan/phan/.phan/plugins/README.md +++ /dev/null @@ -1,367 +0,0 @@ -Plugins -======= - -The plugins in this folder can be used to add additional capabilities to phan. -Add their relative path (.phan/plugins/...) to the `plugins` entry of .phan/config.php. - -Plugin Documentation --------------------- - -[Wiki Article: Writing Plugins For Phan](https://github.com/phan/phan/wiki/Writing-Plugins-for-Phan) - -Plugin List ------------ - -This section contains short descriptions of plugin files, and lists the issue types which they emit. - -They are grouped into the following sections: - -1. Plugins Affecting Phan Analysis -2. General-Use Plugins -3. Plugins Specific to Code Styles -4. Demo Plugins (Plugin authors should base new plugins off of these, if they don't see a similar plugin) - -### 1. Plugins Affecting Phan Analysis - -(More plugins will be added later, e.g. if they add new methods, add types to Phan's analysis of a return type, etc) - -#### UnusedSuppressionPlugin.php - -Warns if an `@suppress` annotation is no longer needed to suppress issue types on a function, method, closure, or class. -(Suppressions may stop being needed if Phan's analysis improves/changes in a release, -or if the relevant parts of the codebase fixed the bug/added annotations) -**This must be run with exactly one worker process** - -- **UnusedSuppression**: `Element {FUNCTIONLIKE} suppresses issue {ISSUETYPE} but does not use it` -- **UnusedPluginSuppression**: `Plugin {STRING_LITERAL} suppresses issue {ISSUETYPE} on this line but this suppression is unused or suppressed elsewhere` -- **UnusedPluginFileSuppression**: `Plugin {STRING_LITERAL} suppresses issue {ISSUETYPE} in this file but this suppression is unused or suppressed elsewhere` - -The setting `'plugin_config' => ['unused_suppression_ignore_list' => ['FlakyPluginIssueName']]` can be used in `.phan/config.php` -to make this plugin avoid emitting `Unused*Suppression` for a list of issue names. - -#### FFIAnalysisPlugin.php - -This is only necessary if you are using [PHP 7.4's FFI (Foreign Function Interface) support](https://wiki.php.net/rfc/ffi) - -This makes Phan infer that assignments to variables that originally contained CData will continue to be CData. - -### 2. General-Use Plugins - -These plugins are useful across a wide variety of code styles, and should give low false positives. -Also see [DollarDollarPlugin.php](#dollardollarpluginphp) for a meaningful real-world example. - -#### AlwaysReturnPlugin.php - -Checks if a function or method with a non-void return type will **unconditionally** return or throw. -This is stricter than Phan's default checks (Phan accepts a function or method that **may** return something, or functions that unconditionally throw). - -#### DuplicateArrayKeyPlugin.php - -Warns about common errors in php array keys and switch statements. Has the following checks (This is able to resolve global and class constants to their scalar values). - -- **PhanPluginDuplicateArrayKey**: a duplicate or equivalent array key literal. - - (E.g `[2 => "value", "other" => "s", "2" => "value2"]` duplicates the key `2`) -- **PhanPluginDuplicateArrayKeyExpression**: `Duplicate/Equivalent dynamic array key expression ({CODE}) detected in array - the earlier entry will be ignored if the expression had the same value.` - (E.g. `[$x => 'value', $y => "s", $y => "value2"]`) -- **PhanPluginDuplicateSwitchCase**: a duplicate or equivalent case statement. - - (E.g `switch ($x) { case 2: echo "A\n"; break; case 2: echo "B\n"; break;}` duplicates the key `2`. The later case statements are ignored.) -- **PhanPluginDuplicateSwitchCaseLooseEquality**: a case statement that is loosely equivalent to an earlier case statement. - - (E.g `switch ('foo') { case 0: echo "0\n"; break; case 'foo': echo "foo\n"; break;}` has `0 == 'foo'`, and echoes `0` because of that) -- **PhanPluginMixedKeyNoKey**: mixing array entries of the form [key => value,] with entries of the form [value,]. - - (E.g. `['key' => 'value', 'othervalue']` is often found in code because the key for `'othervalue'` was forgotten) - -#### PregRegexCheckerPlugin - -This plugin checks for invalid regexes. -This plugin is able to resolve literals, global constants, and class constants as regexes. - -- **PhanPluginInvalidPregRegex**: The provided regex is invalid, according to PHP. -- **PhanPluginInvalidPregRegexReplacement**: The replacement string template of `preg_replace` refers to a match group that doesn't exist. (e.g. `preg_replace('/x(a)/', 'y$2', $strVal)`) - -#### PrintfCheckerPlugin - -Checks for invalid format strings, incorrect argument counts, and unused arguments in printf calls. -Additionally, warns about incompatible union types (E.g. passing `string` for the argument corresponding to `%d`) -This plugin is able to resolve literals, global constants, and class constants as format strings. - - -- **PhanPluginPrintfNonexistentArgument**: `Format string {STRING_LITERAL} refers to nonexistent argument #{INDEX} in {STRING_LITERAL}` -- **PhanPluginPrintfNoArguments**: `No format string arguments are given for {STRING_LITERAL}, consider using {FUNCTION} instead` -- **PhanPluginPrintfNoSpecifiers**: `None of the formatting arguments passed alongside format string {STRING_LITERAL} are used` -- **PhanPluginPrintfUnusedArgument**: `Format string {STRING_LITERAL} does not use provided argument #{INDEX}` -- **PhanPluginPrintfNotPercent**: `Format string {STRING_LITERAL} contains something that is not a percent sign, it will be treated as a format string '{STRING_LITERAL}' with padding. Use %% for a literal percent sign, or '{STRING_LITERAL}' to be less ambiguous` - (Usually a typo, e.g. `printf("%s is 20% done", $taskName)` treats `% d` as a second argument) -- **PhanPluginPrintfWidthNotPosition**: `Format string {STRING_LITERAL} is specifying a width({STRING_LITERAL}) instead of a position({STRING_LITERAL})` -- **PhanPluginPrintfIncompatibleSpecifier**: `Format string {STRING_LITERAL} refers to argument #{INDEX} in different ways: {DETAILS}` (e.g. `"%1$s of #%1$d"`. May be an off by one error.) -- **PhanPluginPrintfIncompatibleArgumentTypeWeak**: `Format string {STRING_LITERAL} refers to argument #{INDEX} as {DETAILS}, so type {TYPE} is expected. However, {FUNCTION} was passed the type {TYPE} (which is weaker than {TYPE})` -- **PhanPluginPrintfIncompatibleArgumentType**: `Format string {STRING_LITERAL} refers to argument #{INDEX} as {DETAILS}, so type {TYPE} is expected, but {FUNCTION} was passed incompatible type {TYPE}` -- **PhanPluginPrintfVariableFormatString**: `Code {CODE} has a dynamic format string that could not be inferred by Phan` - -Note (for projects using `gettext`): -Subclassing this plugin (and overriding `gettextForAllLocales`) will allow you to analyze translations of a project for compatibility. -This will require extra work to set up. -See [PrintfCheckerPlugin's source](./PrintfCheckerPlugin.php) for details. - -#### UnreachableCodePlugin.php - -Checks for syntactically unreachable statements in the global scope or function bodies. -(E.g. function calls after unconditional `continue`/`break`/`throw`/`return`/`exit()` statements) - -- **PhanPluginUnreachableCode**: `Unreachable statement detected` - -#### Unused variable detection - -This is now built into Phan itself, and can be enabled via `--unused-variable-detection`. - -#### InvokePHPNativeSyntaxCheckPlugin.php - -This invokes `php --no-php-ini --syntax-check $analyzed_file_path` for you. (See -This is useful for cases Phan doesn't cover (e.g. [Issue #449](https://github.com/phan/phan/issues/449) or [Issue #277](https://github.com/phan/phan/issues/277)). - -Note: This may double the time Phan takes to analyze a project. This plugin can be safely used along with `--processes N`. - -This does not run on files that are parsed but not analyzed. - -Configuration settings can be added to `.phan/config.php`: - -```php - 'plugin_config' => [ - // A list of 1 or more PHP binaries (Absolute path or program name found in $PATH) - // to use to analyze your files with PHP's native `--syntax-check`. - // - // This can be used to simultaneously run PHP's syntax checks with multiple PHP versions. - // e.g. `'plugin_config' => ['php_native_syntax_check_binaries' => ['php72', 'php70', 'php56']]` - // if all of those programs can be found in $PATH - - // 'php_native_syntax_check_binaries' => [PHP_BINARY], - - // The maximum number of `php --syntax-check` processes to run at any point in time - // (Minimum: 1. Default: 1). - // This may be temporarily higher if php_native_syntax_check_binaries - // has more elements than this process count. - 'php_native_syntax_check_max_processes' => 4, - ], -``` - -If you wish to make sure that analyzed files would be accepted by those PHP versions -(Requires that php72, php70, and php56 be locatable with the `$PATH` environment variable) - -#### UseReturnValuePlugin.php - -This plugin warns when code fails to use the return value of internal functions/methods such as `sprintf` or `array_merge` or `Exception->getCode()`. -(functions/methods where the return value should almost always be used) - -- **PhanPluginUseReturnValueInternalKnown**: `Expected to use the return value of the internal function/method {FUNCTION}`, - -This plugin also has a dynamic mode(disabled by default and slow) where it will warn if a function or method's return value is unused. -This checks if the function/method's return value is used 98% or more of the time, then warns about the remaining places where the return value was unused. - -- **PhanPluginUseReturnValue**: `Expected to use the return value of the user-defined function/method {FUNCTION} - {SCALAR}%% of calls use it in the rest of the codebase`, -- **PhanPluginUseReturnValueInternal**: `Expected to use the return value of the internal function/method {FUNCTION} - {SCALAR}%% of calls use it in the rest of the codebase`, - -See [UseReturnValuePlugin.php](./UseReturnValuePlugin.php) for configuration options. - -#### PHPUnitAssertionPlugin.php - -This plugin will make Phan infer side effects from calls to some of the helper methods that PHPUnit provides in test cases. - -- Infer that a condition is truthy from `assertTrue()` and `assertNotFalse()` (e.g. `assertTrue($x instanceof MyClass)`) -- Infer that a condition is null/not null from `assertNull()` and `assertNotNull()` -- Infer class types from `assertInstanceOf(MyClass::class, $actual)` -- Infer types from `assertInternalType($expected, $actual)` -- Infer that $actual has the exact type of $expected after calling `assertSame($expected, $actual)` -- Other methods aren't supported yet. - -### 3. Plugins Specific to Code Styles - -These plugins may be useful to enforce certain code styles, -but may cause false positives in large projects with different code styles. - -#### NonBool - -##### NonBoolBranchPlugin.php - -- **PhanPluginNonBoolBranch** Warns if an expression which has types other than `bool` is used in an if/else if. - - (E.g. warns about `if ($x)`, where $x is an integer. Fix by checking `if ($x != 0)`, etc.) - -##### NonBoolInLogicalArithPlugin.php - -- **PhanPluginNonBoolInLogicalArith** Warns if an expression where the left/right-hand side has types other than `bool` is used in a binary operation. - - (E.g. warns about `if ($x && $x->fn())`, where $x is an object. Fix by checking `if (($x instanceof MyClass) && $x->fn())`) - -#### HasPHPDocPlugin.php - -Checks if an element (class or property) has a PHPDoc comment, -and that Phan can extract a plaintext summary/description from that comment. - -- **PhanPluginNoCommentOnClass**: `Class {CLASS} has no doc comment` -- **PhanPluginDescriptionlessCommentOnClass**: `Class {CLASS} has no readable description: {STRING_LITERAL}` -- **PhanPluginNoCommentOnFunction**: `Function {FUNCTION} has no doc comment` -- **PhanPluginDescriptionlessCommentOnFunction**: `Function {FUNCTION} has no readable description: {STRING_LITERAL}` -- **PhanPluginNoCommentOnPublicProperty**: `Public property {PROPERTY} has no doc comment` (Also exists for Private and Protected) -- **PhanPluginDescriptionlessCommentOnPublicProperty**: `Public property {PROPERTY} has no readable description: {STRING_LITERAL}` (Also exists for Private and Protected) - -Warnings about method verbosity also exist, many categories may need to be completely disabled due to the large number of method declarations in a typical codebase: - -- Warnings are not emitted for `@internal` methods. -- Warnings are not emitted for methods that override methods in the parent class. -- Warnings can be suppressed based on the method FQSEN with `plugin_config => [..., 'has_phpdoc_method_ignore_regex' => (a PCRE regex)]` - - (e.g. to suppress issues about tests, or about missing documentation about getters and setters, etc.) - -The warning types for methods are below: - -- **PhanPluginNoCommentOnPublicMethod**: `Public method {METHOD} has no doc comment` (Also exists for Private and Protected) -- **PhanPluginDescriptionlessCommentOnPublicMethod**: `Public method {METHOD} has no readable description: {STRING_LITERAL}` (Also exists for Private and Protected) - -#### InvalidVariableIssetPlugin.php - -Warns about invalid uses of `isset`. This README documentation may be inaccurate for this plugin. - -- **PhanPluginInvalidVariableIsset** : Forces all uses of `isset` to be on arrays or variables. - - E.g. it will warn about `isset(foo()['key'])`, because foo() is not a variable or an array access. -- **PhanUndeclaredVariable**: Warns if `$array` is undeclared in `isset($array[$key])` - -#### NoAssertPlugin.php - -Discourages the usage of assert() in the analyzed project. -See https://secure.php.net/assert - -- **PhanPluginNoAssert**: `assert() is discouraged. Although phan supports using assert() for type annotations, PHP's documentation recommends assertions only for debugging, and assert() has surprising behaviors.` - -#### NotFullyQualifiedUsagePlugin.php - -Encourages the usage of fully qualified global functions and constants (slightly faster, especially for functions such as `strlen`, `count`, etc.) - -- **PhanPluginNotFullyQualifiedFunctionCall**: `Expected function call to {FUNCTION}() to be fully qualified or have a use statement but none were found in namespace {NAMESPACE}` -- **PhanPluginNotFullyQualifiedOptimizableFunctionCall**: `Expected function call to {FUNCTION}() to be fully qualified or have a use statement but none were found in namespace {NAMESPACE} (opcache can optimize fully qualified calls to this function in recent php versions)` -- **PhanPluginNotFullyQualifiedGlobalConstant**: `Expected usage of {CONST} to be fully qualified or have a use statement but none were found in namespace {NAMESPACE}` - -#### NumericalComparisonPlugin.php - -Enforces that loose equality is used for numeric operands (e.g. `2 == 2.0`), and that strict equality is used for non-numeric operands (e.g. `"2" === "2e0"` is false). - -- **PhanPluginNumericalComparison**: nonnumerical values compared by the operators '==' or '!=='; numerical values compared by the operators '===' or '!==' - -#### PHPUnitNotDeadCodePlugin.php - -Marks unit tests and dataProviders of subclasses of PHPUnit\Framework\TestCase as referenced. -Avoids false positives when `--dead-code-detection` is enabled. - -(Does not emit any issue types) - -#### SleepCheckerPlugin.php - -Warn about returning non-arrays in [`__sleep`](https://secure.php.net/__sleep), -as well as about returning array values with invalid property names in `__sleep`. - -- **SleepCheckerInvalidReturnStatement`**: `__sleep must return an array of strings. This is definitely not an array.` -- **SleepCheckerInvalidReturnType**: `__sleep is returning {TYPE}, expected string[]` -- **SleepCheckerInvalidPropNameType**: `__sleep is returning an array with a value of type {TYPE}, expected string` -- **SleepCheckerInvalidPropName**: `__sleep is returning an array that includes {PROPERTY}, which cannot be found` -- **SleepCheckerMagicPropName**: `__sleep is returning an array that includes {PROPERTY}, which is a magic property` -- **SleepCheckerDynamicPropName**: `__sleep is returning an array that includes {PROPERTY}, which is a dynamically added property (but not a declared property)` -- **SleepCheckerPropertyMissingTransient**: `Property {PROPERTY} that is not serialized by __sleep should be annotated with @transient or @phan-transient`, - -#### UnknownElementTypePlugin.php - -Warns about elements containing unknown types (function/method/closure return types, parameter types) - -- **PhanPluginUnknownMethodReturnType**: `Method {METHOD} has no declared or inferred return type` -- **PhanPluginUnknownMethodParamType**: `Method {METHOD} has no declared or inferred parameter type for ${PARAMETER}` -- **PhanPluginUnknownFunctionReturnType**: `Function {FUNCTION} has no declared or inferred return type` -- **PhanPluginUnknownFunctionParamType**: `Function {FUNCTION} has no declared or inferred return type for ${PARAMETER}` -- **PhanPluginUnknownClosureReturnType**: `Closure {FUNCTION} has no declared or inferred return type` -- **PhanPluginUnknownClosureParamType**: `Closure {FUNCTION} has no declared or inferred return type for ${PARAMETER}` -- **PhanPluginUnknownPropertyType**: `Property {PROPERTY} has an initial type that cannot be inferred` - -#### DuplicateExpressionPlugin.php - -This plugin checks for duplicate expressions in a statement -that are likely to be a bug. (e.g. `expr1 == expr`) - -- **PhanPluginDuplicateExpressionAssignment**: `Both sides of the assignment {OPERATOR} are the same: {CODE}` -- **PhanPluginDuplicateExpressionBinaryOp**: `Both sides of the binary operator {OPERATOR} are the same: {CODE}` -- **PhanPluginDuplicateConditionalTernaryDuplication**: `"X ? X : Y" can usually be simplified to "X ?: Y". The duplicated expression X was {CODE}` -- **PhanPluginDuplicateConditionalNullCoalescing**: `"isset(X) ? X : Y" can usually be simplified to "X ?? Y" in PHP 7. The duplicated expression X was {CODE}` -- **PhanPluginBothLiteralsBinaryOp**: `Suspicious usage of a binary operator where both operands are literals. Expression: {CODE} {OPERATOR} {CODE} (result is {CODE})` (e.g. warns about `null == 'a literal` in `$x ?? null == 'a literal'`) - -#### WhitespacePlugin.php - -This plugin checks for unexpected whitespace in PHP files. - -- **PhanPluginWhitespaceCarriageReturn**: `The first occurrence of a carriage return ("\r") was seen here. Running "dos2unix" can fix that.` -- **PhanPluginWhitespaceTab**: `The first occurrence of a tab was seen here. Running "expand" can fix that.` -- **PhanPluginWhitespaceTrailing**: `The first occurrence of trailing whitespace was seen here.` - -#### SuspiciousParamOrderPlugin.php - -This plugin guesses if arguments to a function call are out of order, based on heuristics on the name in the expression (e.g. variable name). -This will only warn if the argument types are compatible with the alternate parameters being suggested. -This may be useful when analyzing methods with long parameter lists. - -E.g. warns about invoking `function example($first, $second, $third)` as `example($mySecond, $myThird, $myFirst)` - -- **PhanPluginSuspiciousParamOrder**: `Suspicious order for arguments named {DETAILS} - These are being passed to parameters {DETAILS} of {FUNCTION} defined at {FILE}:{LINE}` -- **PhanPluginSuspiciousParamOrderInternal**: `Suspicious order for arguments named {DETAILS} - These are being passed to parameters {DETAILS}` - -#### PossiblyStaticMethodPlugin.php - -Checks if a method can be made static without causing any errors. - -- **PhanPluginPossiblyStaticPublicMethod**: `Public method {PROPERTY} can be static` (Also exists for Private and Protected) - -Warnings may need to be completely disabled due to the large number of method declarations in a typical codebase: - -- Warnings are not emitted for methods that override methods in the parent class. -- Warnings are not emitted for methods that are overridden in child classes. -- Warnings can be suppressed based on the method FQSEN with `plugin_config => [..., 'possibly_static_method_ignore_regex' => (a PCRE regex)]` - -### 4. Demo plugins: - -These files demonstrate plugins for Phan. - -#### DemoPlugin.php - -Look at this class's documentation if you want an example to base your plugin off of. -Generates the following issue types under the types: - -- **DemoPluginClassName**: a declared class isn't called 'Class' -- **DemoPluginFunctionName**: a declared function isn't called `function` -- **DemoPluginMethodName**: a declared method isn't called `function` - PHP's default checks(`php -l` would catch the class/function name types.) -- **DemoPluginInstanceof**: codebase contains `(expr) instanceof object` (usually invalid, and `is_object()` should be used instead. That would actually be a check for `class object`). - -#### DollarDollarPlugin.php - -Checks for complex variable access expressions `$$x`, which may be hard to read, and make the variable accesses hard/impossible to analyze. - -- **PhanPluginDollarDollar**: Warns about the use of $$x, ${(expr)}, etc. - -### 5. Third party plugins - -- https://github.com/Drenso/PhanExtensions is a third party project with several plugins to do the following: - - - Analyze Symfony doc comment annotations. - - Mark elements in inline doc comments (which Phan doesn't parse) as referencing types from `use statements` as not dead code. - -- https://github.com/TysonAndre/PhanTypoCheck checks all tokens of PHP files for typos, including within string literals. - It is also able to analyze calls to `gettext()`. - -### 6. Self-analysis plugins: - -#### PhanSelfCheckPlugin.php - -This plugin checks for invalid calls to `PluginV2::emitIssue`, `Issue::maybeEmit()`, etc. -This is useful for developing Phan and Phan plugins. - -- **PhanPluginTooFewArgumentsForIssue**: `Too few arguments for issue {STRING_LITERAL}: expected {COUNT}, got {COUNT}` -- **PhanPluginTooManyArgumentsForIssue**: `Too many arguments for issue {STRING_LITERAL}: expected {COUNT}, got {COUNT}` -- **PhanPluginUnknownIssueType**: `Unknown issue type {STRING_LITERAL} in a call to {METHOD}(). (may be a false positive - check if the version of Phan running PhanSelfCheckPlugin is the same version that the analyzed codebase is using)` diff --git a/vendor/phan/phan/.phan/plugins/SleepCheckerPlugin.php b/vendor/phan/phan/.phan/plugins/SleepCheckerPlugin.php deleted file mode 100644 index 30abfff..0000000 --- a/vendor/phan/phan/.phan/plugins/SleepCheckerPlugin.php +++ /dev/null @@ -1,247 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\Config; -use Phan\Language\Type\StringType; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * This plugin checks uses of __sleep() - * - * It assumes that the body of the __sleep() implementation is simple, - * and just returns array literals directly. - * This plugin does not analyze building up arrays, array_merge(), variables, etc. - * - * It is assumed without being checked that plugins aren't - * mangling state within the passed code base or context. - */ -class SleepCheckerPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - - /** - * @return string - name of PluginAwarePostAnalysisVisitor subclass - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return SleepCheckerVisitor::class; - } -} - -/** - * When __invoke on this class is called with a node, a method - * will be dispatched based on the `kind` of the given node. - * - * Visitors such as this are useful for defining lots of different - * checks on a node based on its kind. - */ -class SleepCheckerVisitor extends PluginAwarePostAnalysisVisitor -{ - - // A plugin's visitors should not override visit() unless they need to. - - /** - * @param Node $node - * A node to analyze - * - * @return void - * @override - */ - public function visitMethod(Node $node) - { - if (strcasecmp('__sleep', (string)$node->children['name']) !== 0) { - return; - } - $sleep_properties = []; - $this->analyzeStatementsOfSleep($node, $sleep_properties); - $this->warnAboutTransientSleepProperties($sleep_properties); - } - - /** - * Warn about instance properties that aren't mentioned in __sleep() - * and don't have (at)transient or (at)phan-transient - * - * @param array<string,true> $sleep_properties - * @return void - */ - private function warnAboutTransientSleepProperties(array $sleep_properties) - { - if (count($sleep_properties) === 0) { - // Give up, failed to extract property names - return; - } - // @phan-suppress-next-line PhanThrowTypeAbsentForCall we're in class scope - $class = $this->context->getClassInScope($this->code_base); - $class_fqsen = $class->getFQSEN(); - foreach ($class->getPropertyMap($this->code_base) as $property_name => $property) { - if ($property->isStatic()) { - continue; - } - if ($property->isFromPHPDoc()) { - continue; - } - if ($property->isDynamicProperty()) { - continue; - } - if (isset($sleep_properties[$property_name])) { - continue; - } - if ($property->getRealDefiningFQSEN()->getFullyQualifiedClassName() !== $class_fqsen) { - continue; - } - $doc_comment = $property->getDocComment() ?? ''; - $has_transient = preg_match('/@(phan-)?transient\b/', $doc_comment) > 0; - if (!$has_transient) { - $regex = Config::getValue('plugin_config')['sleep_transient_warning_blacklist_regex'] ?? null; - if (is_string($regex) && preg_match($regex, $property_name)) { - continue; - } - $this->emitPluginIssue( - $this->code_base, - $property->getContext(), - 'SleepCheckerPropertyMissingTransient', - 'Property {PROPERTY} that is not serialized by __sleep should be annotated with @transient or @phan-transient', - [$property->__toString()] - ); - } - } - } - - /** - * @param Node|int|string|float|null $node - * @param array<string,true> $sleep_properties - * @return void - */ - private function analyzeStatementsOfSleep($node, array &$sleep_properties = []) - { - if (!($node instanceof Node)) { - if (is_array($node)) { - foreach ($node as $child_node) { - $this->analyzeStatementsOfSleep($child_node, $sleep_properties); - } - } - return; - } - switch ($node->kind) { - case ast\AST_RETURN: - $this->analyzeReturnValue($node->children['expr'], $node->lineno, $sleep_properties); - return; - case ast\AST_CLASS: - case ast\AST_CLOSURE: - case ast\AST_FUNC_DECL: - return; - default: - foreach ($node->children as $child_node) { - $this->analyzeStatementsOfSleep($child_node, $sleep_properties); - } - } - } - - const RESOLVE_SETTINGS = - ContextNode::RESOLVE_ARRAYS | - ContextNode::RESOLVE_ARRAY_VALUES | - ContextNode::RESOLVE_CONSTANTS; - - /** - * @param Node|string|int|float|null $expr_node - * @param int $lineno - * @param array<string,true> $sleep_properties - */ - private function analyzeReturnValue($expr_node, int $lineno, array &$sleep_properties) - { - $context = clone($this->context)->withLineNumberStart($lineno); - if (!($expr_node instanceof Node)) { - $this->emitPluginIssue( - $this->code_base, - $context, - 'SleepCheckerInvalidReturnStatement', - '__sleep must return an array of strings. This is definitely not an array.' - ); - return; - } - $code_base = $this->code_base; - - $union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $expr_node); - if (!$union_type->hasArray()) { - $this->emitPluginIssue( - $this->code_base, - $context, - 'SleepCheckerInvalidReturnType', - '__sleep is returning {TYPE}, expected {TYPE}', - [(string)$union_type, 'string[]'] - ); - return; - } - if (!$context->isInClassScope()) { - return; - } - - $kind = $expr_node->kind; - if (!\in_array($kind, [ast\AST_CONST, ast\AST_ARRAY, ast\AST_CLASS_CONST])) { - return; - } - - $value = (new ContextNode($code_base, $context, $expr_node))->getEquivalentPHPValue(self::RESOLVE_SETTINGS); - if (!is_array($value)) { - return; - } - // @phan-suppress-next-line PhanThrowTypeAbsentForCall we're in class scope - $class = $context->getClassInScope($code_base); - - foreach ($value as $prop_name) { - if (!is_string($prop_name)) { - $prop_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $prop_name); - if (!$prop_type->isType(StringType::instance(false))) { - $this->emitPluginIssue( - $this->code_base, - $context, - 'SleepCheckerInvalidPropNameType', - '__sleep is returning an array with a value of type {TYPE}, expected {TYPE}', - [(string)$prop_type, 'string'] - ); - } - continue; - } - $sleep_properties[$prop_name] = true; - - if (!$class->hasPropertyWithName($code_base, $prop_name)) { - $this->emitPluginIssue( - $this->code_base, - $context, - 'SleepCheckerInvalidPropName', - '__sleep is returning an array that includes {PROPERTY}, which cannot be found', - [$prop_name] - ); - continue; - } - $prop = $class->getPropertyByName($code_base, $prop_name); - if ($prop->isFromPHPDoc()) { - $this->emitPluginIssue( - $this->code_base, - $context, - 'SleepCheckerMagicPropName', - '__sleep is returning an array that includes {PROPERTY}, which is a magic property', - [$prop_name] - ); - continue; - } - if ($prop->isDynamicProperty()) { - $this->emitPluginIssue( - $this->code_base, - $context, - 'SleepCheckerDynamicPropName', - '__sleep is returning an array that includes {PROPERTY}, which is a dynamically added property (but not a declared property)', - [$prop_name] - ); - continue; - } - } - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new SleepCheckerPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/SuspiciousParamOrderPlugin.php b/vendor/phan/phan/.phan/plugins/SuspiciousParamOrderPlugin.php deleted file mode 100644 index c19a9b6..0000000 --- a/vendor/phan/phan/.phan/plugins/SuspiciousParamOrderPlugin.php +++ /dev/null @@ -1,334 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\Exception\CodeBaseException; -use Phan\Language\Element\FunctionInterface; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * A plugin that checks if calls to a function or method pass in arguments in a suspicious order. - * E.g. calling `function example($offset, $count)` as `example($count, $offset)` - */ -class SuspiciousParamOrderPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - /** - * @return string - name of PluginAwarePostAnalysisVisitor subclass - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return SuspiciousParamOrderVisitor::class; - } -} - -/** - * Checks for invocations of functions/methods where the return value should be used. - * Also, gathers statistics on how often those functions/methods are used. - */ -class SuspiciousParamOrderVisitor extends PluginAwarePostAnalysisVisitor -{ - // phpcs:disable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase - // this is deliberate for issue names - const SuspiciousParamOrderInternal = 'PhanPluginSuspiciousParamOrderInternal'; - const SuspiciousParamOrder = 'PhanPluginSuspiciousParamOrder'; - // phpcs:enable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase - - /** - * @param Node $node a node of type AST_CALL - * @return void - * @override - */ - public function visitCall(Node $node) - { - $args = $node->children['args']->children; - if (count($args) < 2) { - // Can't have a suspicious param order if there are less than 2 params - return; - } - $expression = $node->children['expr']; - try { - $function_list_generator = (new ContextNode( - $this->code_base, - $this->context, - $expression - ))->getFunctionFromNode(); - - foreach ($function_list_generator as $function) { - // @phan-suppress-next-line PhanPartialTypeMismatchArgument - $this->checkCall($function, $args, $node); - } - } catch (CodeBaseException $_) { - } - } - - /** - * @param Node|string|int|float|null $arg_node - * @return ?string - */ - private static function extractName($arg_node) - { - if (!$arg_node instanceof Node) { - return null; - } - switch ($arg_node->kind) { - case ast\AST_VAR: - $name = $arg_node->children['name']; - break; - /* - case ast\AST_CONST: - $name = $arg_node->children['name']->children['name']; - break; - */ - case ast\AST_PROP: - case ast\AST_STATIC_PROP: - $name = $arg_node->children['prop']; - break; - case ast\AST_METHOD_CALL: - case ast\AST_STATIC_CALL: - $name = $arg_node->children['method']; - break; - case ast\AST_CALL: - $name = $arg_node->children['expr']; - break; - default: - return null; - } - return is_string($name) ? $name : null; - } - - /** - * Returns a distance in the range 0..1, inclusive. - * - * A distance of 0 means they are similar (e.g. foo and getFoo()), - * and 1 means there are no letters in common (bar and foo) - */ - private static function computeDistance(string $a, string $b) : float - { - $la = strlen($a); - $lb = strlen($b); - return (levenshtein($a, $b) - abs($la - $lb)) / max(1, min($la, $lb)); - } - - /** - * @param array<int,Node|string|int|float|null> $args - * @return void - */ - private function checkCall(FunctionInterface $function, array $args, Node $node) - { - $arg_names = []; - foreach ($args as $i => $arg_node) { - $name = self::extractName($arg_node); - if (!is_string($name)) { - return; - } - $arg_names[$i] = strtolower($name); - } - if (count($arg_names) < 2) { - return; - } - $parameters = $function->getParameterList(); - $parameter_names = []; - foreach ($arg_names as $i => $_) { - if (!isset($parameters[$i])) { - unset($arg_names[$i]); - continue; - } - $parameter_names[$i] = strtolower($parameters[$i]->getName()); - } - if (count($arg_names) < 2) { - return; - } - $best_destination_map = []; - foreach ($arg_names as $i => $name) { - // To even be considered, the distance metric must be less than 60% (100% would have nothing in common) - $best_distance = min( - 0.6, - self::computeDistance($name, $parameter_names[$i]) - ); - $best_destination = null; - // echo "Distances for $name to $parameter_names[$i] is $best_distance\n"; - - foreach ($parameter_names as $j => $parameter_name_j) { - if ($j === $i) { - continue; - } - $d_swap_j = self::computeDistance($name, $parameter_name_j); - // echo "Distances for $name to $parameter_name_j is $d_swap_j\n"; - if ($d_swap_j < $best_distance) { - $best_destination = $j; - $best_distance = $d_swap_j; - } - } - if ($best_destination !== null) { - $best_destination_map[$i] = $best_destination; - } - } - if (count($best_destination_map) < 2) { - return; - } - foreach (self::findCycles($best_destination_map) as $cycle) { - // To reduce false positives, don't warn unless we know the parameter $j would be compatible with what was used at $i - foreach ($cycle as $array_index => $i) { - $j = $cycle[($array_index + 1) % count($cycle)]; - $type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $args[$i]); - // echo "Checking if $type can cast to $parameters[$j]\n"; - if (!$type->asExpandedTypes($this->code_base)->canCastToUnionType($parameters[$j]->getUnionType())) { - continue 2; - } - } - $arg_details = implode(' and ', array_map(static function (int $i) use ($args) : string { - return self::extractName($args[$i]) ?? 'unknown'; - }, $cycle)); - $param_details = implode(' and ', array_map(static function (int $i) use ($parameters) : string { - $param = $parameters[$i]; - return '#' . ($i + 1) . ' (' . trim($param->getUnionType() . ' $' . $param->getName()) . ')'; - }, $cycle)); - if ($function->isPHPInternal()) { - $this->emitPluginIssue( - $this->code_base, - clone($this->context)->withLineNumberStart($node->lineno), - self::SuspiciousParamOrderInternal, - 'Suspicious order for arguments named {DETAILS} - These are being passed to parameters {DETAILS} of {FUNCTION}', - [ - $arg_details, - $param_details, - $function->getRepresentationForIssue(), - ] - ); - } else { - $this->emitPluginIssue( - $this->code_base, - clone($this->context)->withLineNumberStart($node->lineno), - self::SuspiciousParamOrder, - 'Suspicious order for arguments named {DETAILS} - These are being passed to parameters {DETAILS} of {FUNCTION} defined at {FILE}:{LINE}', - [ - $arg_details, - $param_details, - $function->getRepresentationForIssue(), - $function->getContext()->getFile(), - $function->getContext()->getLineNumberStart(), - ] - ); - } - } - } - - /** - * @param array<int,int> $values - * @return array<int,int> - */ - private static function normalizeCycle(array $values, int $next) - { - $pos = array_search($next, $values); - $values = array_slice($values, $pos ?: 0); - $min_pos = 0; - foreach ($values as $i => $value) { - if ($value < $values[$min_pos]) { - $min_pos = $values[$i]; - } - } - return array_merge(array_slice($values, $min_pos), array_slice($values, 0, $min_pos)); - } - - /** - * Given [1 => 2, 2 => 3, 3 => 1, 4 => 5, 5 => 6, 6 => 5]], return [[1,2,3],[5,6]] - * @param array<int,int> $destination_map - * @return array<int,array<int,int>> - */ - public static function findCycles(array $destination_map) : array - { - $result = []; - while (count($destination_map) > 0) { - reset($destination_map); - $key = (int) key($destination_map); - $values = []; - while (count($destination_map) > 0) { - $values[] = $key; - $next = $destination_map[$key]; - unset($destination_map[$key]); - if (in_array($next, $values)) { - $values = self::normalizeCycle($values, $next); - if (count($values) >= 2) { - $result[] = $values; - } - $values = []; - break; - } - if (!isset($destination_map[$next])) { - break; - } - $key = $next; - } - } - return $result; - } - - /** - * @param Node $node a node of type AST_METHOD_CALL - * @return void - * @override - */ - public function visitMethodCall(Node $node) - { - $args = $node->children['args']->children; - if (count($args) < 2) { - // Can't have a suspicious param order if there are less than 2 params - return; - } - - $method_name = $node->children['method']; - - if (!\is_string($method_name)) { - return; - } - try { - $method = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getMethod($method_name, false); - } catch (Exception $_) { - return; - } - // @phan-suppress-next-line PhanPartialTypeMismatchArgument - $this->checkCall($method, $args, $node); - } - - /** - * @param Node $node a node of type AST_STATIC_CALL - * @return void - * @override - */ - public function visitStaticCall(Node $node) - { - $args = $node->children['args']->children; - if (count($args) < 2) { - // Can't have a suspicious param order if there are less than 2 params - return; - } - - $method_name = $node->children['method']; - - if (!\is_string($method_name)) { - return; - } - try { - $method = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getMethod($method_name, true, true); - } catch (Exception $_) { - return; - } - // @phan-suppress-next-line PhanPartialTypeMismatchArgument - $this->checkCall($method, $args, $node); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new SuspiciousParamOrderPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/UnknownElementTypePlugin.php b/vendor/phan/phan/.phan/plugins/UnknownElementTypePlugin.php deleted file mode 100644 index 7c76704..0000000 --- a/vendor/phan/phan/.phan/plugins/UnknownElementTypePlugin.php +++ /dev/null @@ -1,228 +0,0 @@ -<?php declare(strict_types=1); - -use Phan\CodeBase; -use Phan\Language\Element\AddressableElement; -use Phan\Language\Element\Func; -use Phan\Language\Element\Method; -use Phan\Language\Element\Property; -use Phan\Language\Type; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\NullType; -use Phan\Language\UnionType; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeFunctionCapability; -use Phan\PluginV2\AnalyzeMethodCapability; -use Phan\PluginV2\AnalyzePropertyCapability; - -/** - * This file checks if any elements in the codebase have undeclared types. - */ -class UnknownElementTypePlugin extends PluginV2 implements - AnalyzeFunctionCapability, - AnalyzeMethodCapability, - AnalyzePropertyCapability -{ - - /** - * Returns true for array, ?array, and array|null - */ - private static function isRegularArray(UnionType $type) : bool - { - return $type->hasTypeMatchingCallback(static function (Type $type) : bool { - return get_class($type) === ArrayType::class; - }) && !$type->hasTypeMatchingCallback(static function (Type $type) : bool { - return get_class($type) !== ArrayType::class && !($type instanceof NullType); - }); - } - - /** - * @param CodeBase $code_base - * The code base in which the method exists - * - * @param Method $method - * A method being analyzed - * - * @return void - * - * @override - */ - public function analyzeMethod( - CodeBase $code_base, - Method $method - ) { - if ($method->getFQSEN() !== $method->getRealDefiningFQSEN()) { - return; - } - - self::performChecks( - $code_base, - $method, - 'PhanPluginUnknownMethodReturnType', - 'Method {METHOD} has no declared or inferred return type', - 'PhanPluginUnknownArrayMethodReturnType', - 'Method {METHOD} has a return type of array, but does not specify any key types or value types' - ); - // NOTE: Placeholders can be found in \Phan\Issue::uncolored_format_string_for_replace - foreach ($method->getParameterList() as $parameter) { - if ($parameter->getUnionType()->isEmpty()) { - self::emitIssue( - $code_base, - $parameter->createContext($method), - 'PhanPluginUnknownMethodParamType', - 'Method {METHOD} has no declared or inferred parameter type for ${PARAMETER}', - [(string)$method->getFQSEN(), $parameter->getName()] - ); - } elseif (self::isRegularArray($parameter->getUnionType())) { - self::emitIssue( - $code_base, - $parameter->createContext($method), - 'PhanPluginUnknownArrayMethodParamType', - 'Method {METHOD} has a parameter type of array for ${PARAMETER}, but does not specify any key types or value types', - [(string)$method->getFQSEN(), $parameter->getName()] - ); - } - } - } - - private static function performChecks( - CodeBase $code_base, - AddressableElement $element, - string $issue_type_for_empty, - string $message_for_empty, - string $issue_type_for_unknown_array, - string $message_for_unknown_array - ) { - $union_type = $element->getUnionType(); - if ($union_type->isEmpty()) { - self::emitIssue( - $code_base, - $element->getContext(), - $issue_type_for_empty, - $message_for_empty, - [(string)$element->getFQSEN()] - ); - } elseif (self::isRegularArray($union_type)) { - self::emitIssue( - $code_base, - $element->getContext(), - $issue_type_for_unknown_array, - $message_for_unknown_array, - [(string)$element->getFQSEN()] - ); - } - } - - /** - * @param CodeBase $code_base - * The code base in which the function exists - * - * @param Func $function - * A function being analyzed - * - * @return void - * - * @override - */ - public function analyzeFunction( - CodeBase $code_base, - Func $function - ) { - // NOTE: Placeholders can be found in \Phan\Issue::uncolored_format_string_for_replace - if ($function->getUnionType()->isEmpty()) { - if ($function->getFQSEN()->isClosure()) { - $issue = 'PhanPluginUnknownClosureReturnType'; - $message = 'Closure {FUNCTION} has no declared or inferred return type'; - } else { - $issue = 'PhanPluginUnknownFunctionReturnType'; - $message = 'Function {FUNCTION} has no declared or inferred return type'; - } - self::emitIssue( - $code_base, - $function->getContext(), - $issue, - $message, - [(string)$function->getNameForIssue()] - ); - } elseif (self::isRegularArray($function->getUnionType())) { - if ($function->getFQSEN()->isClosure()) { - $issue = 'PhanPluginUnknownArrayClosureReturnType'; - $message = 'Closure {FUNCTION} has a return type of array, but does not specify key or value types'; - } else { - $issue = 'PhanPluginUnknownArrayFunctionReturnType'; - $message = 'Function {FUNCTION} has a return type of array, but does not specify key or value types'; - } - self::emitIssue( - $code_base, - $function->getContext(), - $issue, - $message, - [(string)$function->getNameForIssue()] - ); - } - foreach ($function->getParameterList() as $parameter) { - if ($parameter->getUnionType()->isEmpty()) { - if ($function->getFQSEN()->isClosure()) { - $issue = 'PhanPluginUnknownClosureParamType'; - $message = 'Closure {FUNCTION} has no declared or inferred return type for ${PARAMETER}'; - } else { - $issue = 'PhanPluginUnknownFunctionParamType'; - $message = 'Function {FUNCTION} has no declared or inferred return type for ${PARAMETER}'; - } - self::emitIssue( - $code_base, - $parameter->createContext($function), - $issue, - $message, - [(string)$function->getNameForIssue(), $parameter->getName()] - ); - } elseif (self::isRegularArray($parameter->getUnionType())) { - if ($function->getFQSEN()->isClosure()) { - $issue = 'PhanPluginUnknownArrayClosureParamType'; - $message = 'Closure {FUNCTION} has a parameter type of array for ${PARAMETER}, but does not specify any key types or value types'; - } else { - $issue = 'PhanPluginUnknownArrayFunctionParamType'; - $message = 'Function {FUNCTION} has a parameter type of array for ${PARAMETER}, but does not specify any key types or value types'; - } - self::emitIssue( - $code_base, - $parameter->createContext($function), - $issue, - $message, - [(string)$function->getNameForIssue(), $parameter->getName()] - ); - } - } - } - - /** - * @param CodeBase $code_base - * The code base in which the property exists - * - * @param Property $property - * A property being analyzed - * - * @return void - * - * @override - */ - public function analyzeProperty( - CodeBase $code_base, - Property $property - ) { - if ($property->getFQSEN() !== $property->getRealDefiningFQSEN()) { - return; - } - self::performChecks( - $code_base, - $property, - 'PhanPluginUnknownPropertyType', - 'Property {PROPERTY} has an initial type that cannot be inferred', - 'PhanPluginUnknownArrayPropertyType', - 'Property {PROPERTY} has an array type, but does not specify any key types or value types' - ); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new UnknownElementTypePlugin(); diff --git a/vendor/phan/phan/.phan/plugins/UnreachableCodePlugin.php b/vendor/phan/phan/.phan/plugins/UnreachableCodePlugin.php deleted file mode 100644 index 26cebf3..0000000 --- a/vendor/phan/phan/.phan/plugins/UnreachableCodePlugin.php +++ /dev/null @@ -1,119 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\Analysis\BlockExitStatusChecker; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * This file checks for syntactically unreachable statements in - * the global scope or function bodies. - * - * It hooks into one event: - * - * - getPostAnalyzeNodeVisitorClassName - * This method returns a class that is called on every AST node from every - * file being analyzed - * - * A plugin file must - * - * - Contain a class that inherits from \Phan\PluginV2 - * - * - End by returning an instance of that class. - * - * It is assumed without being checked that plugins aren't - * mangling state within the passed code base or context. - * - * Note: When adding new plugins, - * add them to the corresponding section of README.md - */ -final class UnreachableCodePlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - - /** - * @return string - The name of the visitor that will be called (formerly analyzeNode) - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return UnreachableCodeVisitor::class; - } -} - -/** - * When __invoke on this class is called with a node, a method - * will be dispatched based on the `kind` of the given node. - * - * Visitors such as this are useful for defining lots of different - * checks on a node based on its kind. - */ -final class UnreachableCodeVisitor extends PluginAwarePostAnalysisVisitor -{ - // A plugin's visitors should NOT implement visit(), unless they need to. - - const DECL_KIND_SET = [ - \ast\AST_CLASS => true, - \ast\AST_FUNC_DECL => true, - \ast\AST_CONST => true, - ]; - - /** - * @param Node $node - * A node to analyze - * - * @return void - * - * @override - */ - public function visitStmtList(Node $node) - { - $child_nodes = $node->children; - - $last_node_index = count($child_nodes) - 1; - foreach ($child_nodes as $i => $node) { - if (!\is_int($i)) { - throw new AssertionError("Expected integer index"); - } - if ($i >= $last_node_index) { - break; - } - if (!($node instanceof Node)) { - continue; - } - if (!BlockExitStatusChecker::willUnconditionallySkipRemainingStatements($node)) { - continue; - } - // Skip over empty statements and scalar statements. - for ($j = $i + 1; array_key_exists($j, $child_nodes); $j++) { - $next_node = $child_nodes[$j]; - if (!($next_node instanceof Node && $next_node->lineno > 0)) { - continue; - } - if (array_key_exists($next_node->kind, self::DECL_KIND_SET)) { - if ($this->context->isInGlobalScope()) { - continue; - } - } - $context = clone($this->context)->withLineNumberStart($next_node->lineno); - if ($this->context->isInFunctionLikeScope()) { - if ($this->context->getFunctionLikeInScope($this->code_base)->checkHasSuppressIssueAndIncrementCount('PhanPluginUnreachableCode')) { - // don't emit the below issue. - break; - } - } - $this->emitPluginIssue( - $this->code_base, - $context, - 'PhanPluginUnreachableCode', - 'Unreachable statement detected', - [] - ); - break; - } - break; - } - } -} -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new UnreachableCodePlugin(); diff --git a/vendor/phan/phan/.phan/plugins/UnusedSuppressionPlugin.php b/vendor/phan/phan/.phan/plugins/UnusedSuppressionPlugin.php deleted file mode 100644 index 20214b9..0000000 --- a/vendor/phan/phan/.phan/plugins/UnusedSuppressionPlugin.php +++ /dev/null @@ -1,299 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Context; -use Phan\Language\Element\AddressableElement; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\Method; -use Phan\Language\Element\Property; -use Phan\Plugin\ConfigPluginSet; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeClassCapability; -use Phan\PluginV2\AnalyzeFunctionCapability; -use Phan\PluginV2\AnalyzeMethodCapability; -use Phan\PluginV2\AnalyzePropertyCapability; -use Phan\PluginV2\BeforeAnalyzeFileCapability; -use Phan\PluginV2\FinalizeProcessCapability; -use Phan\PluginV2\SuppressionCapability; - -/** - * Check for unused (at)suppress annotations. - * - * NOTE! This plugin only produces correct results when Phan - * is run on a single processor (via the `-j1` flag). - */ -class UnusedSuppressionPlugin extends PluginV2 implements - BeforeAnalyzeFileCapability, - AnalyzeClassCapability, - AnalyzeFunctionCapability, - AnalyzeMethodCapability, - AnalyzePropertyCapability, - FinalizeProcessCapability -{ - - /** - * @var AddressableElement[] - Analysis is postponed until finalizeProcess. - * Issues may have been emitted after `$this->analyze*()` were called, - * which is why those methods postpone the check until analysis is finished. - * - * Also, looping over all elements again would be slow. - * - * These are currently unique, even when quick_mode is false. - */ - private $elements_for_postponed_analysis = []; - - /** - * @var string[] a list of files where checks for unused suppressions was postponed - * (Because of non-quick mode, we may emit issues in a file after analysis has run on that file) - */ - private $files_for_postponed_analysis = []; - - /** - * @var array<string,array<string,array<string,array<int,int>>>> stores the suppressions for active plugins - * maps plugin class to - * file name to - * issue type to - * unique list of line numbers of suppressions - */ - private $plugin_active_suppression_list; - - /** - * @param CodeBase $code_base - * The code base in which the element exists - * - * @param AddressableElement $element - * Any element such as function, method, class - * (which has an FQSEN) - * - * @return void - */ - private static function analyzeAddressableElement( - CodeBase $code_base, - AddressableElement $element - ) { - // Get the set of suppressed issues on the element - $suppress_issue_list = - $element->getSuppressIssueList(); - - if (\array_key_exists('UnusedSuppression', $suppress_issue_list)) { - // The element's doc comment is suppressing everything emitted by this plugin. - return; - } - - // Check to see if any are unused - foreach ($suppress_issue_list as $issue_type => $use_count) { - if (0 !== $use_count) { - continue; - } - if (in_array($issue_type, self::getUnusedSuppressionIgnoreList())) { - continue; - } - self::emitIssue( - $code_base, - $element->getContext(), - 'UnusedSuppression', - "Element {FUNCTIONLIKE} suppresses issue {ISSUETYPE} but does not use it", - [(string)$element->getFQSEN(), $issue_type] - ); - } - } - - /** - * @param CodeBase $unused_code_base - * The code base in which the class exists - * - * @param Clazz $class - * A class being analyzed - * - * @return void - * - * @override - */ - public function analyzeClass( - CodeBase $unused_code_base, - Clazz $class - ) { - $this->elements_for_postponed_analysis[] = $class; - } - - /** - * @param CodeBase $unused_code_base - * The code base in which the method exists - * - * @param Method $method - * A method being analyzed - * - * @return void - * - * @override - */ - public function analyzeMethod( - CodeBase $unused_code_base, - Method $method - ) { - - // Ignore methods inherited by subclasses - if ($method->getFQSEN() !== $method->getDefiningFQSEN()) { - return; - } - - $this->elements_for_postponed_analysis[] = $method; - } - - /** - * @param CodeBase $unused_code_base - * The code base in which the function exists - * - * @param Func $function - * A function being analyzed - * - * @return void - * - * @override - */ - public function analyzeFunction( - CodeBase $unused_code_base, - Func $function - ) { - $this->elements_for_postponed_analysis[] = $function; - } - - /** - * @param CodeBase $unused_code_base - * The code base in which the property exists - * - * @param Property $property - * A property being analyzed - * - * @return void - * - * @override - */ - public function analyzeProperty( - CodeBase $unused_code_base, - Property $property - ) { - $this->elements_for_postponed_analysis[] = $property; - } - - /** - * NOTE! This plugin only produces correct results when Phan - * is run on a single processor (via the `-j1` flag). - * Putting this hook in finalizeProcess() just minimizes the incorrect result counts. - * @override - */ - public function finalizeProcess(CodeBase $code_base) - { - foreach ($this->elements_for_postponed_analysis as $element) { - self::analyzeAddressableElement($code_base, $element); - } - $this->analyzePluginSuppressions($code_base); - } - - private function analyzePluginSuppressions(CodeBase $code_base) - { - $suppression_plugin_set = ConfigPluginSet::instance()->getSuppressionPluginSet(); - if (count($suppression_plugin_set) === 0) { - return; - } - - foreach ($this->files_for_postponed_analysis as $file_path) { - foreach ($suppression_plugin_set as $plugin) { - $this->analyzePluginSuppressionsForFile($code_base, $plugin, $file_path); - } - } - } - - /** - * @return array<int,string> - */ - private static function getUnusedSuppressionIgnoreList() : array - { - return Config::getValue('plugin_config')['unused_suppression_ignore_list'] ?? []; - } - - /** - * @return void - */ - private function analyzePluginSuppressionsForFile(CodeBase $code_base, SuppressionCapability $plugin, string $relative_file_path) - { - $absolute_file_path = Config::projectPath($relative_file_path); - $plugin_class = \get_class($plugin); - $name_pos = \strrpos($plugin_class, '\\'); - if ($name_pos !== false) { - $plugin_name = \substr($plugin_class, $name_pos + 1); - } else { - $plugin_name = $plugin_class; - } - $plugin_suppressions = $plugin->getIssueSuppressionList($code_base, $absolute_file_path); - $plugin_successful_suppressions = $this->plugin_active_suppression_list[$plugin_class][$absolute_file_path] ?? null; - - $unused_suppression_ignore_list = self::getUnusedSuppressionIgnoreList(); - - foreach ($plugin_suppressions as $issue_type => $line_list) { - foreach ($line_list as $lineno => $lineno_of_comment) { - if (isset($plugin_successful_suppressions[$issue_type][$lineno])) { - continue; - } - // TODO: finish letting plugins suppress UnusedSuppression on other plugins - $issue_kind = 'UnusedPluginSuppression'; - $message = 'Plugin {STRING_LITERAL} suppresses issue {ISSUETYPE} on this line but this suppression is unused or suppressed elsewhere'; - if ($lineno === 0) { - $issue_kind = 'UnusedPluginFileSuppression'; - $message = 'Plugin {STRING_LITERAL} suppresses issue {ISSUETYPE} in this file but this suppression is unused or suppressed elsewhere'; - } - if (isset($plugin_suppressions['UnusedSuppression'][$lineno_of_comment])) { - continue; - } - if (isset($plugin_suppressions[$issue_kind][$lineno_of_comment])) { - continue; - } - if (in_array($issue_type, $unused_suppression_ignore_list, true)) { - continue; - } - self::emitIssue( - $code_base, - (new Context())->withFile($relative_file_path)->withLineNumberStart($lineno_of_comment), - $issue_kind, - $message, - [$plugin_name, $issue_type] - ); - } - } - return; - } - - public function beforeAnalyzeFile( - CodeBase $unused_code_base, - Context $context, - string $unused_file_contents, - Node $unused_node - ) { - $file = $context->getFile(); - $this->files_for_postponed_analysis[$file] = $file; - } - - /** - * Record the fact that $plugin caused suppressions in $file_path for issue $issue_type due to an annotation around $line - * - * @return void - * @internal - */ - public function recordPluginSuppression( - SuppressionCapability $plugin, - string $file_path, - string $issue_type, - int $line - ) { - $file_name = Config::projectPath($file_path); - $plugin_class = \get_class($plugin); - $this->plugin_active_suppression_list[$plugin_class][$file_name][$issue_type][$line] = $line; - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new UnusedSuppressionPlugin(); diff --git a/vendor/phan/phan/.phan/plugins/UseReturnValuePlugin.php b/vendor/phan/phan/.phan/plugins/UseReturnValuePlugin.php deleted file mode 100644 index 0b489cb..0000000 --- a/vendor/phan/phan/.phan/plugins/UseReturnValuePlugin.php +++ /dev/null @@ -1,1079 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\AST\ContextNode; -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\CodeBaseException; -use Phan\Language\Context; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionInterface; -use Phan\PluginV2; -use Phan\PluginV2\FinalizeProcessCapability; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * A plugin that checks for invocations of functions/methods where the return value should be used. - * Also, gathers statistics on how often those functions/methods are used. - * - * This can be configured by fields of 'plugin_config', or by setting environment variables. - * - * Note: When this is using dynamic checks of the whole codebase, the run should be limited to a single process. That check is memory intensive. - * - * Configuration options: - * - * - ['plugin_config']['use_return_value_verbose'] (or PHAN_USE_RETURN_VALUE_DEBUG=1 as an environment variable) - * - * Print statistics about what percentage of time methods/functions are used - * - ['plugin_config']['use_return_value_dynamic_checks'] (or PHAN_USE_RETURN_VALUE_DYNAMIC_CHECKS=1 as an environment variable) - * - * Warn about unused return values when the return value is used in 98%+ of the overall statements in the project - * - ['plugin_config']['use_return_value_warn_threshold_percentage'] (or PHAN_USE_RETURN_VALUE_WARN_THRESHOLD_PERCENTAGE=1 as an environment variable) - * - * For dynamic checks, use this value instead of the default of 98 (should be between 0.01 and 100) - */ -class UseReturnValuePlugin extends PluginV2 implements PostAnalyzeNodeCapability, FinalizeProcessCapability -{ - // phpcs:disable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase - // this is deliberate for issue names - const UseReturnValue = 'PhanPluginUseReturnValue'; - const UseReturnValueInternal = 'PhanPluginUseReturnValueInternal'; - const UseReturnValueInternalKnown = 'PhanPluginUseReturnValueInternalKnown'; - // phpcs:enable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase - - const DEFAULT_THRESHOLD_PERCENTAGE = 98; - - /** - * @var array<string,StatsForFQSEN> maps an FQSEN to information about the FQSEN and its uses. - * @internal - */ - public static $stats = []; - - /** - * @var bool should debug information about commonly used FQSENs be used in this project? - */ - public static $debug = false; - - /** - * @var bool - If true, this will track the calls in your program to warn if a return value - * of an internal or user-defined function/method is unused, - * when over self::$threshold_percentage (e.g. 98%) is used. - * - * This option is slow and won't work effectively in the language server mode. - */ - public static $use_dynamic = false; - - /** - * @return string - name of PluginAwarePostAnalysisVisitor subclass - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - self::$stats = []; - // NOTE: debug should be used together with dynamic checks. - self::$debug = Config::getValue('plugin_config')['use_return_value_verbose'] ?? (bool)getenv('PHAN_USE_RETURN_VALUE_DEBUG'); - self::$use_dynamic = Config::getValue('plugin_config')['use_return_value_dynamic_checks'] ?? - (bool)getenv('PHAN_USE_RETURN_VALUE_DYNAMIC_CHECKS'); - return UseReturnValueVisitor::class; - } - - /** - * @return void - * @override - */ - public function finalizeProcess(CodeBase $code_base) - { - if (!self::$use_dynamic) { - return; - } - $threshold_percentage = Config::getValue('plugin_config')['use_return_value_warn_threshold_percentage'] ?? - (getenv('PHAN_USE_RETURN_VALUE_WARN_THRESHOLD_PERCENTAGE') ?: self::DEFAULT_THRESHOLD_PERCENTAGE); - - foreach (self::$stats as $fqsen => $counter) { - $fqsen_key = ltrim(strtolower($fqsen), "\\"); - $used_count = count($counter->used_locations); - $unused_count = count($counter->unused_locations); - $total_count = $used_count + $unused_count; - - $known_must_use_return_value = self::HARDCODED_FQSENS[$fqsen_key] ?? null; - $used_percentage = $used_count / $total_count * 100; - if ($total_count >= 5) { - if (self::$debug) { - fprintf(STDERR, "%09.4f %% used: (%4d uses): %s (%s)\n", $used_percentage, $total_count, $fqsen, $counter->is_internal ? 'internal' : 'user-defined'); - } - } - - if ($known_must_use_return_value === false) { - continue; - } - - if ($unused_count > 0 && $used_percentage >= $threshold_percentage) { - $percentage_string = number_format($used_percentage, 2); - foreach ($counter->unused_locations as $key => $context) { - if (!preg_match('/:(\d+)$/', $key, $matches)) { - fprintf(STDERR, "Failed to extract line number from %s\n", $key); - continue; - } - $line = (int)$matches[1]; - $context = $context->withLineNumberStart($line); - if ($known_must_use_return_value) { - self::emitIssue( - $code_base, - $context, - self::UseReturnValueInternalKnown, - 'Expected to use the return value of the internal function/method {FUNCTION}', - [$fqsen] - ); - } elseif ($counter->is_internal) { - self::emitIssue( - $code_base, - $context, - self::UseReturnValueInternal, - 'Expected to use the return value of the internal function/method {FUNCTION} - {SCALAR}%% of calls use it in the rest of the codebase', - [$fqsen, $percentage_string] - ); - } else { - self::emitIssue( - $code_base, - $context, - self::UseReturnValue, - 'Expected to use the return value of the user-defined function/method {FUNCTION} - {SCALAR}%% of calls use it in the rest of the codebase', - [$fqsen, $percentage_string] - ); - } - } - } - } - } - - /** - * Maps lowercase FQSENs to whether or not this plugin should warn about the return value of a method being unused. - * This should remain sorted. - */ - const HARDCODED_FQSENS = [ - '_' => true, - 'abs' => true, - 'acosh' => true, - 'acos' => true, - 'addcslashes' => true, - 'addslashes' => true, - 'apcu_fetch' => true, - 'arrayaccess::offsetexists' => true, - 'arrayaccess::offsetget' => true, - 'array_change_key_case' => true, - 'array_chunk' => true, - 'array_column' => true, - 'array_combine' => true, - 'array_count_values' => true, - 'array_diff_assoc' => true, - 'array_diff_key' => true, - 'array_diff' => true, - 'array_fill_keys' => true, - 'array_fill' => true, - 'array_filter' => true, - 'array_flip' => true, - 'array_intersect_assoc' => true, - 'array_intersect_key' => true, - 'array_intersect' => true, - 'arrayiterator::current' => true, - 'arrayiterator::key' => true, - 'arrayiterator::valid' => true, - 'array_key_exists' => true, - 'array_keys' => true, - 'array_map' => true, - 'array_merge_recursive' => true, - 'array_merge' => true, - 'array_pad' => true, - 'array_product' => true, - 'array_rand' => true, - 'array_reduce' => true, - 'array_replace_recursive' => true, - 'array_replace' => true, - 'array_reverse' => true, - 'array_search' => true, - 'array_slice' => true, - 'array_sum' => true, - 'array_unique' => true, - 'array_values' => true, - 'asinh' => true, - 'asin' => true, - 'atan2' => true, - 'atanh' => true, - 'atan' => true, - 'base64_decode' => true, - 'base64_encode' => true, - 'base_convert' => true, - 'basename' => true, - 'bcadd' => true, - 'bccomp' => true, - 'bcdiv' => true, - 'bcmod' => true, - 'bcmul' => true, - 'bcpowmod' => true, - 'bcpow' => true, - 'bcscale' => true, - 'bcsqrt' => true, - 'bcsub' => true, - 'bin2hex' => true, - 'bindec' => true, - 'boolval' => true, - 'bzcompress' => true, - 'bzdecompress' => true, - 'ceil' => true, - 'checkdate' => true, - 'checkdnsrr' => true, - 'chop' => true, - 'chr' => true, - 'chunk_split' => true, - 'class_implements' => true, - 'class_parents' => true, - 'closure::bindto' => true, - 'closure::bind' => true, - 'closure::fromcallable' => true, - 'compact' => true, - 'constant' => true, - 'convert_cyr_string' => true, - 'convert_uudecode' => true, - 'convert_uuencode' => true, - 'cosh' => true, - 'cos' => true, - 'countable::count' => true, - 'count_chars' => true, - 'count' => true, - 'crc32' => true, - 'ctype_alnum' => true, - 'ctype_alpha' => true, - 'ctype_digit' => true, - 'ctype_lower' => true, - 'ctype_space' => true, - 'ctype_upper' => true, - 'ctype_xdigit' => true, - 'curl_errno' => true, - 'curl_error' => true, - 'curl_exec' => true, - 'curl_getinfo' => true, - 'curl_init' => true, - 'curl_version' => true, - 'current' => true, - 'date_create' => true, - 'date_default_timezone_get' => true, - 'dateinterval::format' => true, - 'datetime::createfromformat' => true, - 'datetime::diff' => true, - 'datetime::format' => true, - 'datetime::gettimestamp' => true, - 'datetime::gettimezone' => true, - 'datetimeimmutable::createfromformat' => true, - 'datetimeimmutable::diff' => true, - 'datetimeimmutable::format' => true, - 'datetimeimmutable::gettimestamp' => true, - 'datetimeimmutable::gettimezone' => true, - 'datetimeimmutable::settimezone' => true, - 'datetimeinterface::format' => true, - 'datetimeinterface::gettimestamp' => true, - 'datetimeinterface::gettimezone' => true, - 'datetimezone::getname' => true, - 'date' => true, - 'debug_backtrace' => true, - 'decbin' => true, - 'dechex' => true, - 'decoct' => true, - 'defined' => true, - 'deg2rad' => true, - 'dirname' => true, - 'domdocument::createcdatasection' => true, - 'domdocument::createcomment' => true, - 'domdocument::createelementns' => true, - 'domdocument::createelement' => true, - 'domdocument::createtextnode' => true, - 'domdocument::getelementsbytagnamens' => true, - 'domdocument::getelementsbytagname' => true, - 'domdocument::importnode' => true, - 'domdocument::savexml' => true, - 'domelement::getattribute' => true, - 'domelement::getelementsbytagnamens' => true, - 'domelement::hasattribute' => true, - 'domelement::haschildnodes' => true, - 'domelement::issamenode' => true, - 'domnodelist::item' => true, - 'domxpath::query' => true, - 'doubleval' => true, - 'each' => true, - 'errorexception::getfile' => true, - 'errorexception::getline' => true, - 'errorexception::getseverity' => true, - 'error::getcode' => true, - 'error::getfile' => true, - 'error_get_last' => true, - 'error::getline' => true, - 'error::getmessage' => true, - 'escapeshellarg' => true, - 'exception::getcode' => true, - 'exception::getfile' => true, - 'exception::getline' => true, - 'exception::getmessage' => true, - 'exception::getprevious' => true, - 'exception::gettraceasstring' => true, - 'exception::gettrace' => true, - 'explode' => true, - 'expm1' => true, - 'exp' => true, - 'extension_loaded' => true, - 'feof' => true, - 'fgetcsv' => true, - 'fgets' => true, - 'file_exists' => true, - 'filemtime' => true, - 'fileperms' => true, - 'filesize' => true, - 'file' => true, - 'filter_input_array' => true, - 'filter_input' => true, - 'filteriterator::current' => true, - 'filteriterator::getinneriterator' => true, - 'filter_var' => true, - 'floatval' => true, - 'floor' => true, - 'fmod' => true, - 'fopen' => true, - 'fread' => true, - 'fsockopen' => true, - 'fstat' => true, - 'ftell' => true, - 'ftp_chdir' => true, - 'func_get_args' => true, - 'func_get_arg' => true, - 'func_num_args' => true, - 'function_exists' => true, - 'get_called_class' => true, - 'get_cfg_var' => true, - 'get_class_methods' => true, - 'get_class' => true, - 'getcwd' => true, - 'getdate' => true, - 'get_declared_classes' => true, - 'get_declared_interfaces' => true, - 'get_declared_traits' => true, - 'get_defined_constants' => true, - 'get_defined_functions' => true, - 'get_defined_vars' => true, - 'getenv' => true, - 'gethostname' => true, - 'getimagesize' => true, - 'get_include_path' => true, - 'get_magic_quotes_gpc' => true, - 'get_magic_quotes_gpc_runtime' => true, - 'getmypid' => true, - 'get_object_vars' => true, - 'get_parent_class' => true, - 'getrandmax' => true, - 'get_resource_type' => true, - 'gettext' => true, - 'gettype' => true, - 'glob' => true, - 'gmdate' => true, - 'gmmktime' => true, - 'gzcompress' => true, - 'gzdecode' => true, - 'gzdeflate' => true, - 'gzencode' => true, - 'gzinflate' => true, - 'gzopen' => true, - 'gzuncompress' => true, - 'hash_algos' => true, - 'hash_equals' => true, - 'hash_file' => true, - 'hash_final' => true, - 'hash_hmac' => true, - 'hash_init' => true, - 'hash_pbkdf2' => true, - 'hash' => true, - 'headers_sent' => true, - 'hex2bin' => true, - 'hexdec' => true, - 'htmlentities' => true, - 'html_entity_decode' => true, - 'htmlspecialchars_decode' => true, - 'htmlspecialchars' => true, - 'http_build_query' => true, - 'hypot' => true, - 'iconv_strlen' => true, - 'iconv' => true, - 'imagecreatetruecolor' => true, - 'imagetypes' => true, - 'implode' => true, - 'in_array' => true, - 'inet_ntop' => true, - 'inet_pton' => true, - 'ini_get' => true, - 'intdiv' => true, - 'intlchar::charage' => true, - 'intlchar::chardigitvalue' => true, - 'intlchar::chardirection' => true, - 'intlchar::charfromname' => true, - 'intlchar::charmirror' => true, - 'intlchar::charname' => true, - 'intlchar::chartype' => true, - 'intlchar::chr' => true, - 'intlchar::digit' => true, - 'intlchar::enumcharnames' => true, - 'intlchar::enumchartypes' => true, - 'intlchar::foldcase' => true, - 'intlchar::fordigit' => true, - 'intlchar::getbidipairedbracket' => true, - 'intlchar::getblockcode' => true, - 'intlchar::getcombiningclass' => true, - 'intlchar::getfc_nfkc_closure' => true, - 'intlchar::getintpropertymaxvalue' => true, - 'intlchar::getintpropertyminvalue' => true, - 'intlchar::getintpropertyvalue' => true, - 'intlchar::getnumericvalue' => true, - 'intlchar::getpropertyenum' => true, - 'intlchar::getpropertyname' => true, - 'intlchar::getpropertyvalueenum' => true, - 'intlchar::getpropertyvaluename' => true, - 'intlchar::getunicodeversion' => true, - 'intlchar::hasbinaryproperty' => true, - 'intlchar::isalnum' => true, - 'intlchar::isalpha' => true, - 'intlchar::isbase' => true, - 'intlchar::isblank' => true, - 'intlchar::iscntrl' => true, - 'intlchar::isdefined' => true, - 'intlchar::isdigit' => true, - 'intlchar::isgraph' => true, - 'intlchar::isidignorable' => true, - 'intlchar::isidpart' => true, - 'intlchar::isidstart' => true, - 'intlchar::isisocontrol' => true, - 'intlchar::isjavaidpart' => true, - 'intlchar::isjavaidstart' => true, - 'intlchar::isjavaspacechar' => true, - 'intlchar::islower' => true, - 'intlchar::ismirrored' => true, - 'intlchar::isprint' => true, - 'intlchar::ispunct' => true, - 'intlchar::isspace' => true, - 'intlchar::istitle' => true, - 'intlchar::isualphabetic' => true, - 'intlchar::isulowercase' => true, - 'intlchar::isupper' => true, - 'intlchar::isuuppercase' => true, - 'intlchar::isuwhitespace' => true, - 'intlchar::iswhitespace' => true, - 'intlchar::isxdigit' => true, - 'intlchar::ord' => true, - 'intlchar::tolower' => true, - 'intlchar::totitle' => true, - 'intlchar::toupper' => true, - 'intl_get_error_code' => true, - 'intl_get_error_message' => true, - 'intl_is_failure' => true, - 'intval' => true, - 'invalidargumentexception::getmessage' => true, - 'ip2long' => true, - 'is_array' => true, - 'is_a' => true, - 'is_bool' => true, - 'is_callable' => true, - 'is_countable' => true, - 'is_dir' => true, - 'is_double' => true, - 'is_executable' => true, - 'is_file' => true, - 'is_finite' => true, - 'is_float' => true, - 'is_infinite' => true, - 'is_integer' => true, - 'is_int' => true, - 'is_iterable' => true, - 'is_link' => true, - 'is_long' => true, - 'is_nan' => true, - 'is_null' => true, - 'is_numeric' => true, - 'is_object' => true, - 'is_readable' => true, - 'is_real' => true, - 'is_resource' => true, - 'is_scalar' => true, - 'is_string' => true, - 'is_subclass_of' => true, - 'is_writable' => true, - 'is_writeable' => true, - 'iteratoraggregate::getiterator' => true, - 'iterator_count' => true, - 'iterator::current' => true, - 'iteratoriterator::current' => true, - 'iterator_to_array' => true, - 'iterator::valid' => true, - 'join' => true, - 'json_decode' => true, - 'json_encode' => true, - 'json_last_error_msg' => true, - 'json_last_error' => true, - 'key_exists' => true, - 'key' => true, - 'lcfirst' => true, - 'levenshtein' => true, - 'libxml_get_errors' => true, - 'localeconv' => true, - 'locale::getdefault' => true, - 'log10' => true, - 'log1p' => true, - 'log' => true, - 'long2ip' => true, - 'ltrim' => true, - 'max' => true, - 'mb_convert_case' => true, - 'mb_convert_encoding' => true, - 'mb_detect_encoding' => true, - 'mb_strlen' => true, - 'mb_strpos' => true, - 'mb_strtolower' => true, - 'mb_strwidth' => true, - 'mb_substr' => true, - 'md5_file' => true, - 'md5' => true, - 'memcached::getoption' => true, - 'memcached::getresultcode' => true, - 'memcached::get' => true, - 'memory_get_peak_usage' => true, - 'memory_get_usage' => true, - 'metaphone' => true, - 'method_exists' => true, - 'microtime' => true, - 'min' => true, - 'mktime' => true, - 'mt_getrandmax' => true, - 'mt_rand' => true, - 'ngettext' => true, - 'nl2br' => true, - 'numberformatter::format' => true, - 'numberformatter::getattribute' => true, - 'numberformatter::geterrorcode' => true, - 'numberformatter::geterrormessage' => true, - 'numberformatter::getsymbol' => true, - 'numberformatter::gettextattribute' => true, - 'number_format' => true, - 'ob_get_clean' => true, // prefer ob_end_clean - 'ob_get_contents' => true, - 'ob_get_level' => true, - 'octdec' => true, - 'opendir' => true, - 'openssl_encrypt' => true, - 'openssl_error_string' => true, - 'openssl_random_pseudo_bytes' => true, - 'ord' => true, - 'pack' => true, - 'parse_ini_file' => true, - 'parse_url' => true, - 'pathinfo' => true, - 'pdoexception::getcode' => true, - 'pdoexception::getmessage' => true, - 'pdo::getattribute' => true, - 'pdo::prepare' => true, - 'pdo::quote' => true, - 'pdostatement::execute' => true, - 'pdostatement::fetchall' => true, - 'pdostatement::fetchcolumn' => true, - 'pdostatement::fetch' => true, - 'pdostatement::rowcount' => true, - 'php_sapi_name' => true, - 'php_uname' => true, - 'phpversion' => true, - 'pi' => true, - 'popen' => true, - 'posix_isatty' => true, - 'pow' => true, - 'preg_filter' => true, - 'preg_grep' => true, - 'preg_last_error' => true, - 'preg_quote' => true, - 'preg_replace_callback' => true, - 'preg_replace_callback_array' => true, - 'preg_replace' => true, - 'preg_split' => true, - 'proc_open' => true, - 'property_exists' => true, - 'quoted_printable_decode' => true, - 'quoted_printable_encode' => true, - 'quotemeta' => true, - 'rad2deg' => true, - 'random_bytes' => true, - 'random_int' => true, - 'rand' => true, - 'range' => true, - 'rawurldecode' => true, - 'rawurlencode' => true, - 'readdir' => true, - 'readlink' => true, - 'realpath' => true, - 'redis::getoption' => true, - 'reflectionclass::getconstructor' => true, - 'reflectionclass::getdoccomment' => true, - 'reflectionclass::getfilename' => true, - 'reflectionclass::getinterfaces' => true, - 'reflectionclass::getmethods' => true, - 'reflectionclass::getmethod' => true, - 'reflectionclass::getnamespacename' => true, - 'reflectionclass::getname' => true, - 'reflectionclass::getparentclass' => true, - 'reflectionclass::getproperties' => true, - 'reflectionclass::getproperty' => true, - 'reflectionclass::getshortname' => true, - 'reflectionclass::gettraits' => true, - 'reflectionclass::hasmethod' => true, - 'reflectionclass::hasproperty' => true, - 'reflectionclass::implementsinterface' => true, - 'reflectionclass::isabstract' => true, - 'reflectionclass::isfinal' => true, - 'reflectionclass::isinstantiable' => true, - 'reflectionclass::isinterface' => true, - 'reflectionclass::isinternal' => true, - 'reflectionclass::issubclassof' => true, - 'reflectionclass::istrait' => true, - 'reflectionclass::isuserdefined' => true, - 'reflectionclass::newinstanceargs' => true, - 'reflectionclass::newinstance' => true, - 'reflectionexception::getmessage' => true, - 'reflectionfunction::getclosurescopeclass' => true, - 'reflectionfunction::getfilename' => true, - 'reflectionfunction::getparameters' => true, - 'reflectionmethod::getdeclaringclass' => true, - 'reflectionmethod::getdoccomment' => true, - 'reflectionmethod::getfilename' => true, - 'reflectionmethod::getname' => true, - 'reflectionmethod::getnumberofparameters' => true, - 'reflectionmethod::getnumberofrequiredparameters' => true, - 'reflectionmethod::getparameters' => true, - 'reflectionmethod::getreturntype' => true, - 'reflectionmethod::getstartline' => true, - 'reflectionmethod::hasreturntype' => true, - 'reflectionmethod::isabstract' => true, - 'reflectionmethod::isconstructor' => true, - 'reflectionmethod::isfinal' => true, - 'reflectionmethod::ispublic' => true, - 'reflectionmethod::isstatic' => true, - 'reflectionmethod::returnsreference' => true, - 'reflectionnamedtype::getname' => true, - 'reflectionobject::getfilename' => true, - 'reflectionobject::getmethod' => true, - 'reflectionobject::getproperties' => true, - 'reflectionobject::getproperty' => true, - 'reflectionobject::hasmethod' => true, - 'reflectionparameter::allowsnull' => true, - 'reflectionparameter::getclass' => true, - 'reflectionparameter::getdefaultvalue' => true, - 'reflectionparameter::getname' => true, - 'reflectionparameter::gettype' => true, - 'reflectionparameter::hastype' => true, - 'reflectionparameter::isarray' => true, - 'reflectionparameter::isdefaultvalueavailable' => true, - 'reflectionparameter::isoptional' => true, - 'reflectionparameter::ispassedbyreference' => true, - 'reflectionparameter::isvariadic' => true, - 'reflectionproperty::getdeclaringclass' => true, - 'reflectionproperty::getname' => true, - 'reflectionproperty::getvalue' => true, - 'reflectionproperty::ispublic' => true, - 'reflectionproperty::isstatic' => true, - 'reflectiontype::__tostring' => true, - 'resourcebundle::geterrorcode' => true, - 'round' => true, - 'rtrim' => true, - 'runtimeexception::getcode' => true, - 'runtimeexception::getmessage' => true, - 'scandir' => true, - 'seekableiterator::current' => true, - 'seekableiterator::key' => true, - 'seekableiterator::valid' => true, - 'serialize' => true, - 'session_regenerate_id' => true, - 'session_status' => true, - 'sha1' => true, - 'similar_text' => true, - 'simplexmlelement::asxml' => true, - 'simplexmlelement::attributes' => true, - 'simplexmlelement::children' => true, - 'simplexmlelement::getnamespaces' => true, - 'simplexmlelement::xpath' => true, - 'simplexml_import_dom' => true, - 'simplexml_load_file' => true, - 'simplexml_load_string' => true, - 'sinh' => true, - 'sin' => true, - 'sizeof' => true, - 'socket_last_error' => true, - 'socket_strerror' => true, - 'solrresponse::getresponse' => true, - 'solrutils::escapequerychars' => true, - 'soundex' => true, - 'spl_autoload_functions' => true, - 'splfileinfo::getbasename' => true, - 'splfileinfo::getfilename' => true, - 'splfileinfo::getpathname' => true, - 'splfileinfo::getrealpath' => true, - 'splfileinfo::getsize' => true, - 'splfixedarray::count' => true, - 'splfixedarray::getsize' => true, - 'splfixedarray::offsetexists' => true, - 'spl_object_hash' => true, - 'spl_object_id' => true, - 'splobjectstorage::contains' => true, - 'splobjectstorage::offsetexists' => true, - 'splobjectstorage::offsetget' => true, - 'splstack::top' => true, - 'sprintf' => true, - 'sqrt' => true, - 'stat' => true, - 'strcasecmp' => true, - 'strchr' => true, - 'strcmp' => true, - 'strcoll' => true, - 'strcspn' => true, - 'stream_context_create' => true, - 'stream_get_contents' => true, - 'stream_get_meta_data' => true, - 'stream_isatty' => true, - 'stream_is_local' => true, - 'stream_resolve_include_path' => true, - 'stream_socket_client' => true, - 'strftime' => true, - 'stripcslashes' => true, - 'stripos' => true, - 'stripslashes' => true, - 'strip_tags' => true, - 'str_ireplace' => true, - 'stristr' => true, - 'strlen' => true, - 'strnatcasecmp' => true, - 'strnatcmp' => true, - 'strncasecmp' => true, - 'strncmp' => true, - 'str_pad' => true, - 'strpbrk' => true, - 'strpos' => true, - 'strrchr' => true, - 'str_repeat' => true, - 'str_replace' => true, - 'strrev' => true, - 'strripos' => true, - 'str_rot13' => true, - 'strrpos' => true, - 'str_split' => true, - 'strspn' => true, - 'strstr' => true, - 'strtolower' => true, - 'strtotime' => true, - 'strtoupper' => true, - 'strtr' => true, - 'strval' => true, - 'str_word_count' => true, - 'substr_compare' => true, - 'substr_count' => true, - 'substr_replace' => true, - 'substr' => true, - 'sys_get_temp_dir' => true, - 'tanh' => true, - 'tan' => true, - 'tempnam' => true, - 'throwable::getcode' => true, // todo: make these apply to subclasses automatically - 'throwable::getfile' => true, - 'throwable::getline' => true, - 'throwable::getmessage' => true, - 'throwable::getprevious' => true, - 'throwable::gettraceasstring' => true, - 'throwable::gettrace' => true, - 'time' => true, - 'token_get_all' => true, - 'token_name' => true, - 'trim' => true, - 'ucfirst' => true, - 'ucwords' => true, - 'umask' => true, - 'unexpectedvalueexception::getmessage' => true, - 'uniqid' => true, - 'unpack' => true, - 'unserialize' => true, - 'urldecode' => true, - 'urlencode' => true, - 'utf8_decode' => true, - 'utf8_encode' => true, - 'version_compare' => true, - 'vsprintf' => true, - 'wordwrap' => true, - 'xml_get_error_code' => true, - 'xml_parser_create' => true, - 'xmlreader::getattribute' => true, - 'ziparchive::getfromname' => true, - 'ziparchive::locatename' => true, - 'zlib_decode' => true, - 'zlib_encode' => true, - - 'call_user_func' => false, // dynamic - 'call_user_func_array' => false, - 'chmod' => false, // some code is optimistic - 'class_exists' => false, // triggers class autoloader to load the class - 'copy' => false, // some code is optimistic - 'define' => false, - 'end' => false, // move array cursor - 'file_get_contents' => false, // can be used for urls - 'interface_exists' => false, // triggers class autoloader to load the interface - 'mkdir' => false, // some code is optimistic - 'next' => false, // move array cursor - 'preg_match' => false, // useful if known - 'prev' => false, // move array cursor - 'print_r' => self::USE_IF_SECOND_ARGUMENT_TRUE, // returns a string if second arg is true - 'reflectionmethod::invokeargs' => false, // may be a void - 'rename' => false, // some code is optimistic - 'reset' => false, // move array cursor - 'session_id' => false, // Triggers regeneration - 'strtok' => false, // advances a cursor if called with 1 argument - 'trait_exists' => false, // triggers class autoloader to load the trait - 'var_export' => self::USE_IF_SECOND_ARGUMENT_TRUE, // returns a string if second arg is true - ]; - - const USE_IF_SECOND_ARGUMENT_TRUE = 'if2ndtrue'; -} - -/** - * Information about the function and the locations where the function was called for one FQSEN - */ -class StatsForFQSEN -{ - /** @var array<string,Context> the locations where the return value was unused */ - public $unused_locations = []; - /** @var array<string,Context> the locations where the return value was used */ - public $used_locations = []; - /** @var bool is this function fqsen internal to PHP */ - public $is_internal; - - public function __construct(FunctionInterface $function) - { - $this->is_internal = $function->isPHPInternal(); - } -} - -/** - * Checks for invocations of functions/methods where the return value should be used. - * Also, gathers statistics on how often those functions/methods are used. - */ -class UseReturnValueVisitor extends PluginAwarePostAnalysisVisitor -{ - /** @var array<int,Node> set by plugin framework */ - protected $parent_node_list; - - /** - * Skip unary ops when determining the parent node. - * E.g. for `@foo();`, the parent node is AST_STMT_LIST (which we infer means the result is unused) - * For `$x = +foo();` the parent node is AST_ASSIGN. - * @return ?Node - */ - private function findNonUnaryParentNodeNode() - { - $parent = end($this->parent_node_list); - if (!$parent) { - return null; - } - if ($parent->kind !== ast\AST_UNARY_OP) { - return $parent; - } - - for ($i = key($this->parent_node_list) - 1; $i >= 0; $i--) { - $parent = $this->parent_node_list[$i]; - if ($parent->kind !== ast\AST_UNARY_OP) { - return $parent; - } - } - return null; - } - - /** - * @param Node $node a node of type AST_CALL - * @return void - * @override - */ - public function visitCall(Node $node) - { - $parent = $this->findNonUnaryParentNodeNode(); - if (!$parent) { - //fwrite(STDERR, "No parent in " . __METHOD__ . "\n"); - return; - } - $used = $parent->kind !== ast\AST_STMT_LIST; - if ($used && !UseReturnValuePlugin::$use_dynamic) { - return; - } - $key = $this->context->getFile() . ':' . $this->context->getLineNumberStart(); - //fwrite(STDERR, "Saw parent of type " . ast\get_kind_name($parent->kind) . "\n"); - - $expression = $node->children['expr']; - try { - $function_list_generator = (new ContextNode( - $this->code_base, - $this->context, - $expression - ))->getFunctionFromNode(); - - foreach ($function_list_generator as $function) { - if ($function instanceof Func && $function->isClosure()) { - continue; - } - $fqsen = $function->getFQSEN()->__toString(); - if (!UseReturnValuePlugin::$use_dynamic) { - $this->quickWarn($fqsen, $node); - continue; - } - $counter = UseReturnValuePlugin::$stats[$fqsen] ?? null; - if (!$counter) { - UseReturnValuePlugin::$stats[$fqsen] = $counter = new StatsForFQSEN($function); - } - if ($used) { - $counter->used_locations[$key] = $this->context; - } else { - $counter->unused_locations[$key] = $this->context; - } - } - } catch (CodeBaseException $_) { - } - } - - /** - * @param Node $node a node of type AST_METHOD_CALL - * @return void - * @override - */ - public function visitMethodCall(Node $node) - { - $parent = $this->findNonUnaryParentNodeNode(); - if (!$parent) { - //fwrite(STDERR, "No parent in " . __METHOD__ . "\n"); - return; - } - $used = $parent->kind !== ast\AST_STMT_LIST; - if ($used && !UseReturnValuePlugin::$use_dynamic) { - return; - } - $key = $this->context->getFile() . ':' . $this->context->getLineNumberStart(); - //fwrite(STDERR, "Saw parent of type " . ast\get_kind_name($parent->kind) . "\n"); - - $method_name = $node->children['method']; - - if (!\is_string($method_name)) { - return; - } - try { - $method = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getMethod($method_name, false); - } catch (Exception $_) { - return; - } - $fqsen = $method->getDefiningFQSEN()->__toString(); - if (!UseReturnValuePlugin::$use_dynamic) { - $this->quickWarn($fqsen, $node); - return; - } - $counter = UseReturnValuePlugin::$stats[$fqsen] ?? null; - if (!$counter) { - UseReturnValuePlugin::$stats[$fqsen] = $counter = new StatsForFQSEN($method); - } - if ($used) { - $counter->used_locations[$key] = $this->context; - } else { - $counter->unused_locations[$key] = $this->context; - } - } - - /** - * @param Node $node a node of type AST_METHOD_CALL - * @return void - * @override - */ - public function visitStaticCall(Node $node) - { - $parent = $this->findNonUnaryParentNodeNode(); - if (!$parent) { - //fwrite(STDERR, "No parent in " . __METHOD__ . "\n"); - return; - } - $used = $parent->kind !== ast\AST_STMT_LIST; - if ($used && !UseReturnValuePlugin::$use_dynamic) { - return; - } - $key = $this->context->getFile() . ':' . $this->context->getLineNumberStart(); - //fwrite(STDERR, "Saw parent of type " . ast\get_kind_name($parent->kind) . "\n"); - - $method_name = $node->children['method']; - - if (!\is_string($method_name)) { - return; - } - try { - $method = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getMethod($method_name, true, true); - } catch (Exception $_) { - return; - } - $fqsen = $method->getDefiningFQSEN()->__toString(); - if (!UseReturnValuePlugin::$use_dynamic) { - $this->quickWarn($fqsen, $node); - return; - } - $counter = UseReturnValuePlugin::$stats[$fqsen] ?? null; - if (!$counter) { - UseReturnValuePlugin::$stats[$fqsen] = $counter = new StatsForFQSEN($method); - } - if ($used) { - $counter->used_locations[$key] = $this->context; - } else { - $counter->unused_locations[$key] = $this->context; - } - } - - private static function isSecondArgumentTrue(Node $node) : bool - { - $args = $node->children['args']->children; - $bool_node = $args[1] ?? null; - if (!$bool_node) { - return false; - } - if ($bool_node->kind !== ast\AST_CONST) { - return false; - } - $name = $bool_node->children['name']->children['name'] ?? null; - return is_string($name) && strcasecmp($name, 'true') === 0; - } - - private function quickWarn(string $fqsen, Node $node) - { - $fqsen_key = strtolower(ltrim($fqsen, "\\")); - $result = UseReturnValuePlugin::HARDCODED_FQSENS[$fqsen_key] ?? false; - if (!$result) { - return; - } - if ($result !== true) { - // var_export and print_r take a second bool argument - if (!self::isSecondArgumentTrue($node)) { - return; - } - } - $this->emitPluginIssue( - $this->code_base, - clone($this->context)->withLineNumberStart($node->lineno), - UseReturnValuePlugin::UseReturnValueInternalKnown, - 'Expected to use the return value of the internal function/method {FUNCTION}', - [$fqsen] - ); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new UseReturnValuePlugin(); diff --git a/vendor/phan/phan/.phan/plugins/WhitespacePlugin.php b/vendor/phan/phan/.phan/plugins/WhitespacePlugin.php deleted file mode 100644 index 3ccb1c5..0000000 --- a/vendor/phan/phan/.phan/plugins/WhitespacePlugin.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php declare(strict_types=1); - -use ast\Node; -use Phan\CodeBase; -use Phan\IssueInstance; -use Phan\Language\Context; -use Phan\Library\FileCacheEntry; -use Phan\Plugin\Internal\IssueFixingPlugin\FileEditSet; -use Phan\PluginV2; -use Phan\PluginV2\AfterAnalyzeFileCapability; -use Phan\PluginV2\AutomaticFixCapability; - -/** - * This plugin checks the whitespace in analyzed PHP files for (1) tabs, (2) windows newlines, and (3) trailing whitespace. - */ -class WhitespacePlugin extends PluginV2 implements - AfterAnalyzeFileCapability, - AutomaticFixCapability -{ - const CarriageReturn = 'PhanPluginWhitespaceCarriageReturn'; - const Tab = 'PhanPluginWhitespaceTab'; - const WhitespaceTrailing = 'PhanPluginWhitespaceTrailing'; - - private static function calculateLine(string $contents, int $byte_offset) : int - { - return 1 + substr_count($contents, "\n", 0, $byte_offset); - } - - /** - * @param CodeBase $code_base - * The code base in which the node exists - * - * @param Context $context @phan-unused-param - * A context with the file name for $file_contents and the scope after analyzing $node. - * - * @param string $file_contents the unmodified file contents @phan-unused-param - * @param Node $node the node @phan-unused-param - * @return void - * @override - * @throws Error if a process fails to shut down - */ - public function afterAnalyzeFile( - CodeBase $code_base, - Context $context, - string $file_contents, - Node $node - ) { - if (!preg_match('/[\r\t]|[ \t]\r?$/m', $file_contents)) { - // Typical case: no errors - return; - } - $newline_position = strpos($file_contents, "\r"); - if ($newline_position !== false) { - self::emitIssue( - $code_base, - clone($context)->withLineNumberStart(self::calculateLine($file_contents, $newline_position)), - self::CarriageReturn, - 'The first occurrence of a carriage return ("\r") was seen here. Running "dos2unix" can fix that.' - ); - } - $tab_position = strpos($file_contents, "\t"); - if ($tab_position !== false) { - self::emitIssue( - $code_base, - clone($context)->withLineNumberStart(self::calculateLine($file_contents, $tab_position)), - self::Tab, - 'The first occurrence of a tab was seen here. Running "expand" can fix that.' - ); - } - if (preg_match('/[ \t]\r?$/m', $file_contents, $match, PREG_OFFSET_CAPTURE)) { - self::emitIssue( - $code_base, - clone($context)->withLineNumberStart(self::calculateLine($file_contents, $match[0][1])), - self::WhitespaceTrailing, - 'The first occurrence of trailing whitespace was seen here.' - ); - } - } - - /** - * @return array<string,Closure(CodeBase,FileCacheEntry,IssueInstance):(?FileEditSet)> - */ - public function getAutomaticFixers() : array - { - return require(__DIR__ . '/WhitespacePlugin/fixers.php'); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new WhitespacePlugin(); diff --git a/vendor/phan/phan/.phan/plugins/WhitespacePlugin/fixers.php b/vendor/phan/phan/.phan/plugins/WhitespacePlugin/fixers.php deleted file mode 100644 index e792a83..0000000 --- a/vendor/phan/phan/.phan/plugins/WhitespacePlugin/fixers.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php declare(strict_types=1); - -use Phan\CodeBase; -use Phan\Config; -use Phan\IssueInstance; -use Phan\Library\FileCacheEntry; -use Phan\Plugin\Internal\IssueFixingPlugin\FileEdit; -use Phan\Plugin\Internal\IssueFixingPlugin\FileEditSet; -use Phan\Plugin\Internal\IssueFixingPlugin\IssueFixer; - -/** - * Fixers for --automatic-fix and WhitespacePlugin - */ -return [ - /** - * @return ?FileEditSet - * @suppress PhanAccessMethodInternal - */ - WhitespacePlugin::Tab => static function (CodeBase $unused_code_base, FileCacheEntry $contents, IssueInstance $instance) { - $spaces_per_tab = (int)(Config::getValue('plugin_config')['spaces_per_tab'] ?? 4); - if ($spaces_per_tab <= 0) { - $spaces_per_tab = 4; - } - - /** - * @return Generator<FileEdit> - */ - $compute_edits = static function (string $line_contents, int $byte_offset) use ($spaces_per_tab) { - preg_match_all('/\t+/', $line_contents, $matches, PREG_OFFSET_CAPTURE); - - $effective_space_count = 0; - $prev_end = 0; // byte offset of previous end of tab sequences - // run the equivalent of unix's 'unexpand' - foreach ($matches[0] as $match) { - $column = $match[1]; // 0-based column - $effective_space_count += $column - $prev_end; - $len = strlen($match[0]); - - $prev_end = $column + $len; - - $replacement_space_count = ($len - 1) * $spaces_per_tab + ($spaces_per_tab - ($effective_space_count % $spaces_per_tab)); - - $start = $byte_offset + $match[1]; - // @phan-suppress-next-line PhanAccessMethodInternal - yield new FileEdit($start, $start + $len, str_repeat(' ', $replacement_space_count)); - } - }; - - IssueFixer::debug("Calling tab fixer for {$instance->getFile()}\n"); - $raw_contents = $contents->getContents(); - $byte_offset = 0; - $edits = []; - foreach (explode("\n", $raw_contents) as $line_contents) { - if (strpos($line_contents, "\t") !== false) { - foreach ($compute_edits(rtrim($line_contents), $byte_offset) as $edit) { - $edits[] = $edit; - } - } - $byte_offset += strlen($line_contents) + 1; - } - if (!$edits) { - return null; - } - IssueFixer::debug("Resulting edits for tab fixes: " . json_encode($edits) . "\n"); - //$line = $instance->getLine(); - return new FileEditSet($edits); - }, - /** - * @return ?FileEditSet - * @suppress PhanAccessMethodInternal - */ - WhitespacePlugin::WhitespaceTrailing => static function (CodeBase $unused_code_base, FileCacheEntry $contents, IssueInstance $instance) { - IssueFixer::debug("Calling trailing whitespace fixer {$instance->getFile()}\n"); - $raw_contents = $contents->getContents(); - $byte_offset = 0; - $edits = []; - foreach (explode("\n", $raw_contents) as $line_contents) { - $new_byte_offset = $byte_offset + strlen($line_contents) + 1; - $line_contents = rtrim($line_contents, "\r"); - if (preg_match('/\s+$/', $line_contents, $matches)) { - $len = strlen($matches[0]); - $offset = $byte_offset + strlen($line_contents) - $len; - // Remove 1 or more bytes of trailing whitespace from each line - $edits[] = new FileEdit($offset, $offset + $len); - } - $byte_offset = $new_byte_offset; - } - if (!$edits) { - return null; - } - IssueFixer::debug("Resulting edits for trailing whitespace: " . json_encode($edits) . "\n"); - //$line = $instance->getLine(); - return new FileEditSet($edits); - }, - - /** - * @return ?FileEditSet - * @suppress PhanAccessMethodInternal - */ - WhitespacePlugin::CarriageReturn => static function (CodeBase $unused_code_base, FileCacheEntry $contents, IssueInstance $instance) { - IssueFixer::debug("Calling trailing whitespace fixer {$instance->getFile()}\n"); - $raw_contents = $contents->getContents(); - $byte_offset = 0; - $edits = []; - foreach (explode("\n", $raw_contents) as $line_contents) { - if (substr($line_contents, -1) === "\r") { - $offset = $byte_offset + strlen($line_contents) - 1; - // Remove the byte with the carriage return - $edits[] = new FileEdit($offset, $offset + 1); - } - $byte_offset += strlen($line_contents) + 1; - } - if (!$edits) { - return null; - } - IssueFixer::debug("Resulting edits for trailing whitespace: " . json_encode($edits) . "\n"); - //$line = $instance->getLine(); - return new FileEditSet($edits); - }, -]; diff --git a/vendor/phan/phan/.phan/stubs/README.md b/vendor/phan/phan/.phan/stubs/README.md deleted file mode 100644 index 8e7a4c9..0000000 --- a/vendor/phan/phan/.phan/stubs/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Add any stubs to this directory for code that you don't want to parse, but still want -to expose to phan while analyzing the phan codebase diff --git a/vendor/phan/phan/CODE_OF_CONDUCT.md b/vendor/phan/phan/CODE_OF_CONDUCT.md deleted file mode 100644 index 3e9822e..0000000 --- a/vendor/phan/phan/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,34 +0,0 @@ -# Code of Conduct - -We are committed to fostering a welcoming community. Any participant and -contributor is required to adhere to Phan’s Code of Conduct, which is based on [Etsy’s Code of Conduct](http://etsy.github.io/codeofconduct.html). - -We are proud to say that we have an open source community that is welcoming, positive, and respectful to all participants, -regardless of gender, gender identity, gender presentation, sexual orientation, race, age, -disability, physical appearance, national origin, ethnicity, religion or any other protected status. -We believe our diversity makes us stronger and enriches the work we do. -In an effort to maintain a high level of respect and acceptance in our community, -we ask that anyone who participates in the Phan project’s open source community (https://github.com/phan) follow this Code of Conduct. - -By participating in the Phan project’s open source community, you agree to: - -- Treat each other with respect. This space and its related channels (such as pull requests, IRC channels, or mailing lists) may not be used to disparage another participant. -- Respect each other’s privacy. Do not post another participant’s private or personally identifiable information in public spaces without their permission. -- Respect each other’s boundaries. Do not use this space or any of its related channels to harass another participant. -- Be thoughtful about what you say. Do not post content that promotes, supports, or glorifies hatred. -- Be helpful. Offer constructive criticism or voice a dissenting opinion, but don’t be mean. Do not post threats of violence against others or promote or encourage others to engage in violence or illegal activity. -- Be lawful. Don’t post, link or attach content that violates third party intellectual property rights, has malicious intent or interferes with the security of the Phan project or contributors, or violates the law. - -Examples of unacceptable behavior include, but are not limited to: offensive comments, verbal threats or demands, sexualized images, intimidation, stalking, sustained disruption of discussions, unwelcome sexual attention or approaches, violence, threats of violence, or violent or discriminatory language directed against another person or group. - -The safety of everyone in the community is of paramount importance. This means this is not the appropriate forum for: - -- Direct communication with a contributor once they have requested that you leave them alone (except for standard automated notifications as part of the contribution process); or, -- Engaging in inflammatory debates, doxxing or trolling, regardless of subject. - -Discrimination, harassment or individual or coordinated attacks on contributors of any kind, whether directly or via ‘code language’ will not be tolerated. - -If you are being harassed or discriminated against, if you notice that someone else is being harassed or discriminated against, or if you have any other concerns, please contact a member of Phan’s team. -If a participant violates this Code of Conduct, the Phan project’s members may take any action we deem appropriate, -including warning the offender, -blocking them from the current project or all Phan projects temporarily or permanently, and/or contacting law enforcement. diff --git a/vendor/phan/phan/DCO.txt b/vendor/phan/phan/DCO.txt deleted file mode 100644 index 8201f99..0000000 --- a/vendor/phan/phan/DCO.txt +++ /dev/null @@ -1,37 +0,0 @@ -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -1 Letterman Drive -Suite D4700 -San Francisco, CA, 94129 - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. diff --git a/vendor/phan/phan/LICENSE b/vendor/phan/phan/LICENSE deleted file mode 100644 index 9648881..0000000 --- a/vendor/phan/phan/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -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. - --------------------------------------------------------------------------------- -Third party licenses are below --------------------------------------------------------------------------------- - -Parts of Phan's code were based on code from the below repositories: - -- LICENSE.LANGUAGE_SERVER (ISC License) https://github.com/felixfbecker/php-language-server. -- LICENSE.PHP_PARSER https://github.com/nikic/php-parser diff --git a/vendor/phan/phan/LICENSE.LANGUAGE_SERVER b/vendor/phan/phan/LICENSE.LANGUAGE_SERVER deleted file mode 100644 index a2984cd..0000000 --- a/vendor/phan/phan/LICENSE.LANGUAGE_SERVER +++ /dev/null @@ -1,20 +0,0 @@ -The code implementing support for the open Language Server Protocol -is based on code from https://github.com/felixfbecker/php-language-server. - -Phan's language server implementation also uses the composer dependency felixfbecker/advanced-json-rpc - -ISC License - -Copyright (c) 2016, Felix Frederick Becker - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/phan/phan/LICENSE.PHPSTORM_STUBS b/vendor/phan/phan/LICENSE.PHPSTORM_STUBS deleted file mode 100644 index 46f3de2..0000000 --- a/vendor/phan/phan/LICENSE.PHPSTORM_STUBS +++ /dev/null @@ -1,5 +0,0 @@ -Some of Phan's type signature info (e.g. for functions, methods, etc.) -and documentation (for classes, functions, constants, etc.) -was extracted from https://github.com/JetBrains/phpstorm-stubs - -phpstorm-stubs is available under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) diff --git a/vendor/phan/phan/LICENSE.PHP_PARSER b/vendor/phan/phan/LICENSE.PHP_PARSER deleted file mode 100644 index a0c41d2..0000000 --- a/vendor/phan/phan/LICENSE.PHP_PARSER +++ /dev/null @@ -1,34 +0,0 @@ -Parts of the code for this are based on nikic/php-parser (For \Phan\AST\TolerantASTConverter\String_). -Those parts have the below license: - -Copyright (c) 2011-2018 by Nikita Popov. - -Some rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phan/phan/MAINTAINERS.md b/vendor/phan/phan/MAINTAINERS.md deleted file mode 100644 index bacb16e..0000000 --- a/vendor/phan/phan/MAINTAINERS.md +++ /dev/null @@ -1,14 +0,0 @@ -Phan is maintained by the following people. - -All maintainers must agree to the [Developer Certificate of Origin](https://github.com/phan/phan/blob/38bf1fd15e39bc668084accb8caab21f09ff75ba/DCO.txt). - -# Maintainers - -**Andrew S. Morrison**<br /> -As a maintainer of Phan, I agree to the [Developer Certificate of Origin](https://github.com/phan/phan/blob/38bf1fd15e39bc668084accb8caab21f09ff75ba/DCO.txt). - -**Rasmus Lerdorf**<br /> -As a maintainer of Phan, I agree to the [Developer Certificate of Origin](https://github.com/phan/phan/blob/38bf1fd15e39bc668084accb8caab21f09ff75ba/DCO.txt). - -**Tyson Andre**<br /> -As a maintainer of Phan, I agree to the [Developer Certificate of Origin](https://github.com/phan/phan/blob/38bf1fd15e39bc668084accb8caab21f09ff75ba/DCO.txt). diff --git a/vendor/phan/phan/NEWS.md b/vendor/phan/phan/NEWS.md deleted file mode 100644 index 3fc1e28..0000000 --- a/vendor/phan/phan/NEWS.md +++ /dev/null @@ -1,2312 +0,0 @@ -Phan NEWS - -22 May 2019, Phan 1.3.5 ------------------------ - -Phan 2 is out (requires PHP 7.1+ to run), -and that release line will contain all of Phan's new features, bug fixes, and crash fixes. - -Maintenance: -+ Mention that Phan 2.0.0 has been released in `--help`, `--version`, and crash reports. (#2789) - The environment variable `PHAN_SUPPRESS_PHP_UPGRADE_NOTICE=1` can be set to disable this notice. -+ Warn if attempting to execute Phan 1.x with PHP 7.4-dev or newer (Phan 2 should be used instead) -+ Recommend using Phan 2 when `--target-php-version` or `target_php_version` is 7.4 or newer. - -09 May 2019, Phan 1.3.4 ------------------------ - -Bug fixes: -+ Fix bug in Phan 1.3.3 causing polyfill parser to be used if the installed version of php-ast was older than 1.0.1. - -08 May 2019, Phan 1.3.3 ------------------------ - -New features(CLI, Configs): -+ Make the progress bar guaranteed to display 100% at the end of the analysis phase (#2694) - Print a newline to stderr once Phan is done updating the progress bar. -+ Add `maximum_recursion_depth` - This setting specifies the maximum recursion depth that - can be reached during re-analysis. - Default is 2. -+ Add `--constant-variable-detection` - This checks for variables that can be replaced with literals or constants. (#2704) - This is almost entirely false positives in most coding styles, but may catch some dead code. -+ Add `--language-server-disable-go-to-definition`, `--language-server-disable-hover`, and `--language-server-disable-completion` - (These are already disabled by default, but will be enabled by default in Phan 2.0) - -New features(Analysis): -+ Emit `PhanDeprecatedClassConstant` for code using a constant marked with `@deprecated`. -+ When recursively inferring the return type of `BaseClass::method()` from its return statements, - make that also affect the inherited copies of that method (`SubClass::method()`). (#2718) - This change is limited to methods with no return type in the phpdoc or real signature. -+ Improve unused variable detection: Detect more unused variables for expressions such as `$x++` and `$x -= 2` (#2715) -+ Fix false positive `PhanUnusedVariable` after assignment by reference (#2730) -+ Warn about references, static variables, and uses of global variables that are probably unnecessary (never used/assigned to afterwards) (#2733) - New issue types: `PhanUnusedVariableReference`, `PhanUnusedVariableGlobal`, `PhanUnusedVariableGlobal` -+ Warn about invalid AST nodes for defaults of properties and static variables. (#2732) -+ Warn about union types on properties that might have an incomplete suffix. (e.g. `/** @var array<int, */`) (#2708) - -Plugins: -+ Add more forms of checks such as `$x !== null ? $x : null` to `PhanPluginDuplicateConditionalNullCoalescing` (#2691) - -28 Apr 2019, Phan 1.3.2 ------------------------ - -New features(CLI, Configs): -+ Add `--debug`/`-D` flag to generate verbose debug output. - This is useful when looking into poor performance or unexpected behavior (e.g. infinite loops or crashes). -+ Suggest similarly named plugins if `--plugin SomePluginName` refers to a built-in plugin that doesn't exist. -+ Add `assume_no_external_class_overrides` - When enabled, Phan will more aggressively assume class elements aren't overridden. - - e.g. infer that non-final methods without return statements have type `void`. - Disabled by default. - -New features(Analysis): -+ Support locally tracking assignments to and conditionals on `$this->prop` inside of function scopes. (#805, #204) - - This supports only one level of nesting. (i.e. Phan will not track `$this->prop->subProp` or `$this->prop['field']`) - - Properties are deliberately tracked for just the variable `$this` (which can't be reassigned), and not other variables. -+ Fix false positives with dead code detection for internal stubs in `autoload_internal_extension_signatures`. (#2605) -+ Add a way to escape/unescape array shape keys (newlines, binary data, etc) (#1664) - - e.g. `@return array{\n\r\t\x01\\:true}` in phpdoc would correspond to `return ["\n\r\t\x01\\" => true];` - -Plugins: -+ Add `FFIAnalysisPlugin` to avoid false positives in uses of PHP 7.4's `FFI\CData` (#2659) - (C data of scalar types may be read and assigned as regular PHP data. `$x = FFI::new(“int”); $x = 42;`) - - Note that this is only implemented for variables right now. - -20 Apr 2019, Phan 1.3.1 ------------------------ - -New features(Analysis): -+ Fix false positive `PhanTypeMismatchReturnNullable` and `PhanTypeMismatchArgumentNullable` introduced in 1.3.0 (#2667) -+ Emit `PhanPossiblyNullTypeMismatchProperty` instead of `PhanTypeMismatchProperty` when assigning `?T` - to a property expecting a compatible but non-nullable type. - - (The same issue was already emitted when the internal union type representation was `T|null` (not `?T`) and strict property type checking was enabled) - -Plugins: -+ Add `PossiblyStaticMethodPlugin` to detect instance methods that can be changed to static methods (#2609) -+ Fix edge cases checking if left/right-hand side of binary operations are numbers in `NumericalComparisonPlugin` - -19 Apr 2019, Phan 1.3.0 ------------------------ - -New features(Analysis): -+ Fix false positive `UnusedSuppression` when a doc comment suppresses an issue about itself. (#2571) -+ Improve analysis of argument unpacking with reference parameters, fix false positive `PhanTypeNonVarPassByRef` (#2646) -+ In issue descriptions and suggestions, replace invalid utf-8 (and literal newlines) with placeholders (#2645) -+ Suggest typo fixes in `PhanMisspelledAnnotation` for `@phan-*` annotations. (#2640) -+ Emit `PhanUnreferencedClass` when the only references to a class or its elements are within that class. - Previously, it would fail to be emitted when a class referenced itself. -+ Emit `PhanUnusedPublicNoOverrideMethodParameter` for method parameters that are not overridden and are not overrides. (#2539) - - This is expected to have a lower false positive rate than `PhanUnusedPublicMethodParameter` because parameters - might be unused by some of the classes overriding/implementing a method. - - Setting `unused_variable_detection_assume_override_exists` to true in `.phan/config.php` can be used to continue emitting the old issue names instead of `*NoOverride*` equivalents. -+ Warn about more numeric operations(+, /, etc) on unknown strings and non-numeric literal strings (#2656) - The settings `scalar_implicit_cast` and `scalar_implicit_partial` affect this for the `string` union type but not for literals. -+ Improve types inferred from checks such as `if (is_array($var['field'])) { use($var['field']); }` and `if ($var['field'] instanceof stdClass) {...}` (#2601) -+ Infer that $varName is non-null and an object for conditions such as `if (isset($varName->field['prop']))` -+ Be more consistent about warning when passing `?SomeClass` to a parameter expecting non-null `SomeClass`. -+ Add `PhanTypeMismatchArgumentNullable*` and `PhanTypeMismatchReturnNullable` when the main reason the type check failed was nullability - - Previously, Phan would fail to detect that some nullable class instances were incompatible with the non-null expected types in some cases. -+ Improve analysis of negation of `instanceof` checks on nullable types. (#2663) - -Language Server/Daemon mode: -+ Analyze new but unsaved files, if they would be analyzed by Phan once they actually were saved to disk. - -Plugins: -+ Warn about assignments where the left and right hand side are the same expression in `DuplicateExpressionPlugin` (#2641) - New issue type: `PhanPluginDuplicateExpressionAssignment` - -Deprecations: -+ Print a message to stderr if the installed php-ast version is older than 1.0.1. - A future major Phan version of Phan will probably depend on AST version 70 to support new syntax found in PHP 7.4. -+ Print a message to stderr if the installed PHP version is 7.0. - A future major version of Phan will require PHP 7.1+ to run. - - Phan will still continue to support setting `target_php_version` to `'7.0'` and `--target-php-version 7.0` in that release. - -Bug fixes: -+ Fix edge cases in how Phan checks if files are in `exclude_analysis_directory_list` (#2651) -+ Fix crash parsing comma in string literal in array shape (#2597) - (e.g. `@param array{0:'test,other'} $x`) - -06 Apr 2019, Phan 1.2.8 ------------------------ - -New features(CLI): -+ Fix edge cases initializing directory list and target versions of config files (#2629, #2160) - -New features(Analysis): -+ Support analyzing `if (false !== is_string($var))` and similar complex conditions. (#2613) -+ Emit `PhanUnusedGotoLabel` for labels without a corresponding `goto` in the same function scope. (#2617) - (note that Phan does not understand the effects of goto on control flow) -+ Don't emit `PhanUnreferencedClass` for anonymous classes. (#2604) -+ Detect undeclared types in phpdoc callables and closures. (#2562) -+ Warn about unreferenced PHPDoc `@property`/`@property-read`/`@property-write` annotations in `--dead-code-detection`. - New issue types: `PhanWriteOnlyPHPDocProperty`, `PhanReadOnlyPHPDocProperty`, `PhanUnreferencedPHPDocProperty`. - -Maintenance: -+ Make escaped string arguments fit on a single line for more issue types. -+ Rename `UseContantNoEffect` to `UseConstantNoEffect`. -+ Rename `AddressableElement::isStrictlyMoreVisibileThan()` to `isStrictlyMoreVisibleThan`. - -Plugins: -+ Fix edge case where `WhitespacePlugin` would not detect trailing whitespace. -+ Detect `PhanPluginDuplicateSwitchCaseLooseEquality` in `DuplicateArrayKeyPlugin`. (#2310) - Warn about cases of switch cases that are loosely equivalent to earlier cases, and which might get unexpectedly missed because of that. (e.g. `0` and `'foo'`) - -Bug fixes: -+ Catch and handle "Cannot access parent when not in object context" when parsing global functions incorrectly using `parent` parameter type. (#2619) -+ Improve the performance of `--progress-bar` when the terminal width can't be computed by symfony. (#2634) - -22 Mar 2019, Phan 1.2.7 ------------------------ - -New features(CLI,Configs) -+ Use a progress bar for `--progress-bar` on Windows instead of printing dots. (#2572) - Use ASCII characters for the progress bar instead of UTF-8 if the code page isn't utf-8 or if Phan can't infer the terminal's code page (e.g. in PHP < 7.1) - -Language Server/Daemon mode: -+ Make "Go to Definition" work when the constructor of a user-defined class is inherited from an internal class. (#2598) - -Maintenance: -+ Update tolerant-php-parser version to 0.0.17 - (fix parsing of some edge cases, minor performance improvement, prepare to support php 7.4 in polyfill) -+ Use paratest for phpunit tests in Travis/Appveyor - -Bug fixes: -+ Make the codeclimate plugin analyze the correct directory. Update the dependencies of the codeclimate plugin. (#2139) -+ Fix false positive checking for undefined offset with `$foo['strVal']` when strings are in the union type of `$foo` (#2541) -+ Fix crash in analysis of `call_user_func` (#2576) -+ Fix a false positive PhanTypeInvalidDimOffset for `unset` on array fields in conditional branches. (#2591) -+ Fix edge cases where types for variables inferred in one branch affect unrelated branches (#2593) - -09 Mar 2019, Phan 1.2.6 ------------------------ - -New features(CLI,Configs) -+ Add config `enable_extended_internal_return_type_plugins` to more aggressively - infer literal values for functions such as `json_decode`, `strtolower`, `implode`, etc. (disabled by default), -+ Make `--dead-code-detection` load `UnreachableCodePlugin` if that plugin isn't already loaded (#1824) -+ Add `--automatic-fix` to fix any issues Phan is capable of fixing - (currently a prototype. Fixes are guessed based on line numbers). - This is currently limited to: - - unreferenced use statements on their own line (requires `--dead-code-detection`). - - issues emitted by `WhitespacePlugin` (#2523) - - unqualified global function calls/constant uses from namespaces (requires `NotFullyQualifiedUsagePlugin`) - (will do the wrong thing for functions that are both global and in the same namespace) - -New features(Analysis): -+ Make Phan infer more precise literal types for internal constants such as `PHP_EOF`. - These depend on the PHP binary used to run Phan. - - In most cases, that shouldn't matter. -+ Emit `PhanPluginPrintfVariableFormatString` in `PrintfCheckerPlugin` if the inferred format string isn't a single literal (#2431) -+ Don't emit `PhanWriteOnlyPrivateProperty` with dead code detection when at least one assignment is by reference (#1658) -+ Allow a single hyphen between words in `@suppress issue-name` annotations (and `@phan-suppress-next-line issue-name`, etc.) (#2515) - Note that CamelCase issue names are conventional for Phan and its plugins. -+ Emit `PhanCompatibleAutoload` when using `function __autoload() {}` instead of `spl_autoload_register() {}` (#2528) -+ Be more aggressive about inferring that the result is `null` when accessing array offsets that don't exist. (#2541) -+ Fix a false positive analyzing `array_map` when the closure has a dependent return type. (#2554) -+ Emit `PhanNoopArrayAccess` when an array field is fetched but not used (#2538) - -Language Server/Daemon mode: -+ Fix an error in the language server on didChangeConfiguration -+ Show hover text of ancestors for class elements (methods, constants, and properties) when no summary is available for the class element. (#1945) - -Maintenance -+ Don't exit if the AST version Phan uses (currently version 50) is deprecated by php-ast (#1134) - -Plugins: -+ Write `PhanSelfCheckPlugin` for self-analysis of Phan and plugins for Phan. (#1576) - This warns if too many/too few arguments are provided for the issue template when emitting an issue. -+ Add `AutomaticFixCapability` for plugins to provide fixes for issues for `--automatic-fix` (#2549) -+ Change issue messages for closures in `UnknownElementTypePlugin` (#2543) - -Bug fixes: -+ Fix bug: `--ignore-undeclared` failed to properly ignore undeclared elements since 1.2.3 (#2502) -+ Fix false positive `PhanTypeInvalidDimOffset` for functions nested within other functions. -+ Support commas in the union types of parameters of magic methods (#2507) -+ Fix parsing `?(A|B|C)` (#2551) - -27 Feb 2019, Phan 1.2.5 ------------------------ - -New features(Analysis): -+ Cache ASTs generated by the polyfill to disk by default, improving performance of the polyfill parser. - (e.g. affects use cases where `php-ast` is not installed and `--use-polyfill-parser` is enabled). - - ASTs generated by the native parser (`php-ast`) are not cached. - - (For the language server/daemon mode, Phan stops reading from/writing to the cache after it finishes initializing) -+ Be more consistent warning about invalid callables passed to internal functions such as `register_shutdown_function` (#2046) -+ Add `@phan-suppress-next-next-line` to suppress issues on the line 2 lines below the comment. This is useful in block comments/doc comments. (#2470) -+ Add `@phan-suppress-previous-line` to suppress issues on the line above the comment. (#2470) -+ Detect `PhanRedefineClassConstant` and `PhanRedefineProperty` when class constants and properties are redefined. (#2492) - -New features(CLI): -+ Add `--disable-cache` to disable the disk cache of ASTs generated by the polyfill. - -Language Server/Daemon mode: -+ Show plaintext summaries of internal classes, functions, methods, constants, and properties when hover text is requested. -+ Show descriptions of superglobals and function parameters when hovering over a variable. - -Maintenance -+ Render the constants in `PhanUndeclaredMagicConstant` as `__METHOD__` instead of `MAGIC_METHOD` - -Plugins: -+ Add `WhitespacePlugin` to check for trailing whitespace, tabs, and carriage returns in PHP files. -+ Add `HandleLazyLoadInternalFunctionCapability` so that plugins can modify Phan's information about internal global functions when those functions are loaded after analysis starts. -+ Add `SuspiciousParamOrderPlugin` which guesses if arguments to functions are out of order based on the names used in the argument expressions. - - E.g. warns about invoking `function example($first, $second, $third)` as `example($mySecond, $myThird, $myFirst)` -+ Warn if too many arguments are passed to `emitIssue`, `emitPluginIssue`, etc. (#2481) - -Bug fixes: -+ Support parsing nullable template types in PHPDoc (e.g. `@return ?T`) -+ Allow casting `null` to `?\MyClass<\Something>`. -+ Fix false positive PhanUndeclaredMagicConstant for `__METHOD__` and `__FUNCTION__` in function/method parameters (#2490) -+ More consistently emit `PhanParamReqAfterOpt` in methods (#1843). - -18 Feb 2019, Phan 1.2.4 ------------------------ - -New features(Analysis): -+ Inherit more specific phpdoc template types even when there are real types in the signature. (#2447) - e.g. inherit `@param MyClass<T>` and `@return MyClass<U>` from the - ancestor class of `function someMethod(MyClass $x) : MyClass {}`. - - This is only done when each phpdoc type is compatible with the real signature type. -+ Warn about `@var Type` without a variable name in doc comments of function-likes (#2445) -+ Infer side effects of `array_push` and `array_unshift` on complex expressions such as properties. (#2365) -+ Warn when a non-string is used as a property name for a dynamic property access (#1402) -+ Don't emit `PhanAccessMethodProtected` for `if ($this instanceof OtherClasslike) { $this->protectedMethod(); }` (#2372) - (This only applies to uses of the variable `$this`, e.g. in closures or when checking interfaces) - -Plugins: -+ Warn about unspecialized array types of elements in UnknownElementTypePlugin. `mixed[]` can be used when absolutely nothing is known about the array's key or value types. -+ Warn about failing to use the return value of `var_export($value, true)` (and `print_r`) in `UseReturnValuePlugin` (#2391) -+ Fix plugin causing `InvalidVariableIssetPlugin` to go into an infinite loop for `isset(self::CONST['offset'])` (#2446) - -Maintenance -+ Limit frames of stack traces in crash reports to 1000 bytes of encoded data. (#2444) -+ Support analysis of the upcoming php 7.4 `??=` operator (#2369) -+ Add a `target_php_version` option for PHP 7.4. - This only affects inferred function signatures, and does not allow parsing newer syntax. - -Bug fixes: -+ Fix a crash seen when parsing return typehint for `Closure` in a different case (e.g. `closure`) (#2438) -+ Fix an issue loading the autoloader multiple times when the `vendor` folder is not lowercase on case-sensitive filesystems (#2440) -+ Fix bug causing template types on methods to not work properly when inherited from a trait method. -+ Catch and warn when declaring a constant that would conflict with built in keywords (true/false/null) and prevent it from affecting inferences. (#1642) - -10 Feb 2019, Phan 1.2.3 ------------------------ - -New features(CLI): -+ Add `-I <file_list>` as an alias of `--include-analysis-file-list <file>`. -+ Support repeating the include option (`-I <file_or_list> -I <file_or_list>`) - and the exclude option (`-3 <file_or_list> -3 <file_or_list>`). - -New features(Analysis): -+ Inherit more specific phpdoc types even when there are real types in the signature. (#2409) - e.g. inherit `@param array<int,\stdClass>` and `@return MyClass[]` from the - ancestor class of `function someMethod(array $x) : array {}`. - - This is only done when each phpdoc type is compatible with the real signature type. -+ Detect more expressions without side effects: `PhanNoopEmpty` and `PhanNoopIsset` (for `isset(expr)` and `empty(expr)`) (#2389) -+ Also emit `PhanNoopBinaryOperator` for the `??`, `||`, and `&&` operators, - but only when the result is unused and the right-hand side has no obvious side effects. (#2389) -+ Properly analyze effects of a property/field access expression as the key of a `foreach` statement. (#1601) -+ Emit `PhanTypeInstantiateTrait` when calling `new TraitName()` (#2379) -+ Emit `PhanTemplateTypeConstant` when using `@var T` on a class constant's doc comment. (#2402) -+ Warn for invalid operands of a wider variety of binary operators (`/`, `/=`, `>>`, `<<=`, `-`, `%`, `**`, etc) (#2410) - New issue types: `PhanTypeInvalidRightOperandOfIntegerOp` and `PhanTypeInvalidLeftOperandOfIntegerOp`. - Also, mention the operator name in the issue message. - -Language Server/Daemon mode: -+ Attempted fixes for bugs with issue filtering in the language server on Windows. -+ Add `--language-server-disable-output-filter`, which disables the language server filter to limit outputted issues - to those in files currently open in the IDE. - -Maintenance -+ Don't emit a warning to stderr when `--language-server-completion-vscode` is used. -+ Catch the rare RecursionDepthException in more places, improve readability of its exception message. (#2386) -+ Warn that php-ast 1.0.0 and older always crash with PHP 7.4-dev or newer. - -Bug fixes: -+ Fix edge cases in checking if properties/methods are accessible from a trait (#2371) -+ Fix edge cases checking for `PhanTypeInstantiateInterface` and `PhanTypeInstantiateAbstract` (#2379) - -Plugins: -+ Infer a literal string return value when calling `sprintf` on known literal scalar types in `PrintfCheckerPlugin`. (#2131) -+ Infer that `;@foo();` is not a usage of `foo()` in `UseReturnValuePlugin`. (#2412) -+ Implement `NotFullyQualifiedUsagePlugin` to warn about uses of global functions and constants that aren't fully qualified. (#857) - -02 Feb 2019, Phan 1.2.2 ------------------------ - -New features(CLI): -+ Emit a warning to stderr if no files were parsed when Phan is invoked. (#2289) - -New features(Analysis): -+ Add `@phan-extends` and `@extends` as an alias of `@inherits` (#2351) -+ Make checks such as `$x !== 'a literal'` (and `!=`) remove the literal string/int type from the union type. (#1789) - -Language Server/Daemon mode: -+ Limit analysis results of the language server to only the currently open files. (#1722) -+ Limit analysis results of Phan daemon to just the requested files in **all** output formats (#2374) - (not just when `phan_client` post-processes the output) -+ Make code completion immediately after typing `->` and `::` behave more consistently (#2343) - Note: this fix only applies at the very last character of a line -+ Be more consistent about including types in hover text for properties (#2348) -+ Make "Go to Definition" on `new MyClass` go to `MyClass::__construct` if it exists. (#2276) -+ Support "Go to Definition" for references to global functions and global constants in comments and literal strings. - Previously, Phan would only look for class definitions in comments and literal strings. -+ Fix a crash requesting completion results for some class names/global constants. - -Maintenance: -+ Warn and exit immediately if any plugins are missing or invalid (instead of crashing after parsing all files) (#2099) -+ Emit warnings to stderr if any config settings seem to be the wrong type (#2376) -+ Standardize on logging to stderr. -+ Add more details about the call that crashed to the crash report. - -Bug fixes: -+ Emit a warning and exit if `--config-file <file>` does not exist (#2271) -+ Fix inferences about `foreach ($arr as [[$nested]]) {...}` (#2362) -+ Properly analyze accesses of `@internal` elements of the root namespace from other parts of the root namespace. (#2366) -+ Consistently emit `UseNormalNoEffect` (etc.) when using names/functions/constants of the global scrope from the global scope. -+ Fix a bug causing incorrect warnings due to uses of global/class constants. - -Plugins: -+ Add `UseReturnValuePlugin`, which will warn about code that calls a function/method such as `sprintf` or `array_merge` without using the return value. - - The list it uses is not comprehensive; it is a small subset of commonly used functions. - - This plugin can also be configured to automatically warn about failing to use a return value of **any** user-defined or internal function-like, - when over 98% of the other calls in the codebase did use the return value. - -18 Jan 2019, Phan 1.2.1 ------------------------ - -New features(CLI): -+ Add short flags: `-S` for `--strict-type-checking`, `-C` for `--color`, `-P` for `--plugin <plugin>` - -New features(Analysis): -+ Infer that the result of `array_map` has integer keys when passed two or more arrays (#2277) -+ Improve inferences about the left-hand side of `&&` statements such as `$leftVar && (other_expression);` (#2300) -+ Warn about passing an undefined variable to a function expecting a reference parameter with a real, non-nullable type (#1344) -+ Include variables in scope as alternative suggestions for undeclared properties (#1680) -+ Infer a string literal when analyzing calls to `basename` or `dirname` on an expression that evaluates to a string literal. (#2323) -+ Be stricter about warning when literal int/string values are passed to incompatible scalar types when `scalar_implicit_cast` or `scalar_implicit_partial` are used. (#2340) - -Maintenance: -+ End the output for `--output-mode <json>` with a newline. -+ Upgrade tolerant-php-parser, making the polyfill/fallback properly parse `$a && $b = $c` (#2180) -+ Add updates to the function/method signature map from Psalm and PHPStan. - -Language Server/Daemon mode: -+ Add `--output-mode <mode>` to `phan_client`. (#1568) - - Supported formats: `phan_client` (default), `text`, `json`, `csv`, `codeclimate`, `checkstyle`, or `pylint` -+ Add `--color` to `phan_client` (e.g. for use with `--output-mode text`) -+ Add `--language-server-completion-vscode`. This is a workaround to make completion of variables and static properties work in [the Phan plugin for VS Code](https://github.com/tysonandre/vscode-php-phan) -+ Include Phan's signature types in hover text for internal and user-defined methods (instead of just the real types) (#2309) - Also, show defaults of non-nullable parameters as `= default` instead of `= null` -+ Properly return a result set when requesting variable completion of `$` followed by nothing. -+ Fix code completion when `--language-server-analyze-only-on-save` is on. (#2327) - -Plugins: -+ Add a new issue type to `DuplicateExpressionPlugin`: `PhanPluginBothLiteralsBinaryOp`. (#2297) - - (warns about suspicious expressions such as `null == 'a literal` in `$x ?? null == 'a literal'`) -+ Support `assertInternalType` in `PHPUnitAssertionPlugin` (#2290) -+ Warn when identical dynamic expressions (e.g. variables, function calls) are used as array keys in `DuplicateArrayKeyPlugin` -+ Allow plugins to include a `Suggestion` when calling `$this->emitIssue()` - -05 Jan 2019, Phan 1.2.0 ------------------------ - -New features(Analysis): -+ Infer match keys of `$matches` for a wider range of regexes (e.g. non-capturing groups, named subgroups) (#2294) -+ Improve detection of invalid arguments in code implicitly calling `__invoke`. -+ Support extracting template types from more forms of `callable` types. (#2264) -+ Support `@phan-assert`, `@phan-assert-true-condition`, and `@phan-assert-false-condition`. - Examples of side effects when this annotation is used on a function/method declaration: - - - `@phan-assert int $x` will assert that the argument to the parameter `$x` is of type `int`. - - `@phan-assert !false $x` will assert that the argument to the parameter `$x` is not false. - - `@phan-assert !\Traversable $x` will assert that the argument to the parameter `$x` is not `Traversable` (or a subclass) - - `@phan-assert-true-condition $x` will make Phan infer that the argument to parameter `$x` is truthy if the function returned successfully. - - `@phan-assert-false-condition $x` will make Phan infer that the argument to parameter `$x` is falsey if the function returned successfully. - - This can be used in combination with Phan's template support. - - See [tests/plugin_test/src/072_custom_assertions.php](tests/plugin_test/src/072_custom_assertions.php) for example uses of these annotations. -+ Suggest typo fixes when emitting `PhanUnusedVariable`, if only one definition was seen. (#2281) -+ Infer that `new $x` is of the template type `T` if `$x` is `class-string<T>` (#2257) - -Plugins: -- Add `PHPUnitAssertionPlugin`. - This plugin will make Phan infer side effects of some of the helper methods PHPUnit provides within test cases. - - - Infer that a condition is truthy from `assertTrue()` and `assertNotFalse()` (e.g. `assertTrue($x instanceof MyClass)`) - - Infer that a condition is null/not null from `assertNull()` and `assertNotNull()` - - Infer class type of `$actual` from `assertInstanceOf(MyClass::class, $actual)` - - Infer that `$actual` has the exact type of `$expected` after calling `assertSame($expected, $actual)` - - Other methods aren't supported yet. - -Bug fixes: -- Infer that some internal classes' properties (such as `\Exception->message`) are protected (#2283) -- Fix a crash running Phan without php-ast when no files were parsed (#2287) - -30 Dec 2018, Phan 1.1.10 ------------------------- - -New features(Analysis): -+ Add suggestions if to `PhanUndeclaredConstant` issue messages about undeclared global constants, if possible. (#2240) - Suggestions include other global constants, variables, class constants, properties, and function names. -+ Warn about `continue` and `break` with no matching loop/switch scope. (#1869) - New issue types: `PhanContinueOrBreakTooManyLevels`, `PhanContinueOrBreakNotInLoop` -+ Warn about `continue` statements targeting `switch` control structures (doing the same thing as a `break`) (#1869) - New issue types: `PhanContinueTargetingSwitch` -+ Support inferring template types from array keys. - int/string/mixed can be inferred from `array<TKey,\someType>` when `@template TKey` is in the class/function-like scope. -+ Phan can now infer template types from even more categories of parameter types in constructors and regular functions/methods. (#522) - - - infer `T` from `Closure(T):\OtherClass` and `callable(T):\OtherClass` - - infer `T` from `array{keyName:T}` - - infer `TKey` from `array<TKey,\OtherClass>` (as int, string, or mixed) - -Bug fixes: -+ Refactor the way `@template` annotations are parsed on classes and function-likes to avoid various edge cases (#2253) -+ Fix a bug causing Phan to fail to analyze closures/uses of closures when used inline (e.g. in function calls) - -27 Dec 2018, Phan 1.1.9 ------------------------ - -New features(Analysis): -+ Warn about `split` and other functions that were removed in PHP 7.0 by default. (#2235, #2236) - (`target_php_version` can now be set to `'5.6'` if you have a PHP 5.6 project that uses those) -+ Fix a false positive `PhanUnreferencedConstant` seen when calling `define()` with a dynamic name. (#2245) -+ Support analyzing `@template` in PHPDoc of closures, functions and methods. (#522) - - Phan currently requires the template type to be part of the parameter type(s) as well as the return type. - - New issue types: `PhanTemplateTypeNotUsedInFunctionReturn`, `PhanTemplateTypeNotDeclaredInFunctionParams` -+ Make `@template` on classes behave more consistently. (#522) - - Phan will now check the union types of parameters instead of assuming that arguments will always occur in the same order and positions as `@template`. -+ Phan can now infer template types from more categories of parameter types in constructors and regular functions/methods. (#522) - - `@param T[]` - - `@param Closure():T` - - `@param OtherClass<\stdClass,T>` - - - Note that this implementation is currently incomplete - Phan is not yet able to extract `T` from types not mentioned here (e.g. `array{0:T}`, `Generator<T>`, etc.) -+ Add `callable-string` and `class-string` types. (#1346) - Warn if an invalid/undefined callable/class name is passed to parameters declared with those exact types. -+ Infer a more accurate literal string for the `::class` constant. - - Additionally, support inferring that a function/method will return instances of the passed in class name, when code has PHPDoc such as the following: - - ``` - /** - * @template T - * @param class-string<T> $className - * @return T - */ - ``` - -Plugins: -+ Detect more possible duplicates in `DuplicateArrayKeyPlugin` - -Language Server/Daemon mode: -+ Be more consistent about how return types in methods (of files that aren't open) are inferred. - -Bug fixes: -+ Fix a bug parsing the CLI option `--target-php-version major.minor` (Phan will now correctly set the `target_php_version` config setting) -+ Fix type inferences of `$x['offset'] = expr` in a branch, when outside of that branch. (#2241) - -15 Dec 2018, Phan 1.1.8 ------------------------ - -New features(Analysis): -+ Infer more accurate types for return values/expected arguments of methods of template classes. -+ Support template types in magic methods and properties. (#776, related to #497) -+ Emit `PhanUndeclaredMagicConstant` when using a magic constant in a scope that doesn't make sense. - Infer more accurate literal strings for some magic constants. - -Bug fixes: -+ Fix a crash when an empty scalar value was passed to a function with variadic arguments (#2232) - -08 Dec 2018, Phan 1.1.7 ------------------------ - -Maintenance: -+ Improve checks for empty/invalid FQSENs. - Also, replace `PhanTypeExpectedObjectOrClassNameInvalidName` with `PhanEmptyFQSENInClasslike` or `PhanInvalidFQSENInClasslike`. - -Bug fixes: -+ Fix uncaught crash on startup analyzing `class OCI-Lob` from oci8 (#2222) - -08 Dec 2018, Phan 1.1.6 ------------------------ - -New features(Analysis): -+ Add suggestions to `PhanUndeclaredFunction` for functions in other namespaces - and similarly named functions in the same namespace. -+ Add issue types `PhanInvalidFQSENInCallable` and `PhanInvalidFQSENInClasslike` -+ Properly analyze closures generated by `Closure::fromCallable()` on a method. -+ Emit `PhanDeprecatedCaseInsensitiveDefine` when define is used to create case-insensitive constants (#2213) - -Maintenance: -+ Increase the default of the config setting `suggestion_check_limit` from 50 to 1000. -+ Shorten help messages for `phan --init` (#2162) - -Plugins: -+ Add a prototype tool `tool/dump_markdown_preview`, - which can be used to preview what description text Phan parses from a doc comment - (similar to the language server's hover text) - -Bug fixes: -+ Infer more accurate types after asserting `!empty($x)` -+ Fix a crash seen when analyzing anonymous class with 0 args - when checking if PhanInfiniteRecursion should be emitted (#2206) -+ Fix a bug causing Phan to fail to warn about nullable phpdoc types - replacing non-nullable param/return types in the real signature. -+ Infer the correct type for the result of the unary `+` operator. - Improve inferences when `+`/`-` operators are used on string literals. -+ Fix name inferred for global constants `define()`d within a namespace (#2207). - This now properly treats the constant name as being fully qualified. -+ Don't emit PhanParamSignatureRealMismatchReturnType for a return type of `T` replacing `?T`, - or for `array` replacing `iterable` (#2211) - -29 Nov 2018, Phan 1.1.5 ------------------------ - -Language Server: -+ Fix a crash in the Language Server when pcntl is not installed or enabled (e.g. on Windows) (#2186) - -27 Nov 2018, Phan 1.1.4 ------------------------ - -New features(Analysis): -+ Preserve original descendent object types after type assertions, when original object types are all subtypes - (e.g. infer `SubClass` for `$x = rand(0,1) ? new SubClass() : false; if ($x instanceof BaseClass) { ... }`) - -Maintenance: -+ Emit `UnusedPluginSuppression` on `@phan-suppress-next-line` and `@phan-file-suppress` - on the same line as the comment declaring the suppression. (#2167, #1731) -+ Don't emit `PhanInvalidCommentForDeclarationType` (or attempt to parse) unknown tags that have known tags as prefixes (#2156) - (e.g. `@param-some-unknown-tag`) - -Bug fixes: -+ Fix a crash when analyzing a nullable parameter of type `self` in traits (#2163) -+ Properly parse closures/generic arrays/array shapes when inner types also contain commas (#2141) -+ Support matching parentheses inside closure params, recursively. (e.g. `Closure(int[],Closure(int):bool):int[]`) -+ Don't warn about properties being read-only when they might be modified by reference (#1729) - -20 Nov 2018, Phan 1.1.3 ------------------------ - -New features(CLI): -+ Warn when calling method on union types that are definitely partially invalid. (#1885) - New config setting: `--strict-method-checking` (enabled as part of `--strict-type-checking`) - New issue type: `PhanPossiblyNonClassMethodCall` -+ Add a prototype tool `tool/phoogle`, which can be used to search for function/method signatures in user-declared and internal functions/methods. - E.g. to look for functions that return a string, given a string and an array: - `/path/phan/tool/phoogle 'string -> array -> string` - -New features(Analysis): -+ Add a heuristic check to detect potential infinite recursion in a functionlike calling itself (i.e. stack overflows) - New issue types: `PhanInfiniteRecursion` -+ Infer literal integer values from expressions such as `2 | 1`, `2 + 2`, etc. -+ Infer more accurate array shapes for `preg_match_all` (based on existing inferences for `preg_match`) -+ Make Phan infer union types of variables from switch statements on variables (#1291) - (including literal int and string types) -+ Analyze simple assertions on `get_class($var)` of various forms (#1977) - Examples: - - `assert(get_class($x) === 'someClass')` - - `if (get_class($x) === someClass::class)` - - `switch (get_class($x)) {case someClass::class: ...}` -+ Warn about invalid/possibly invalid callables in function calls. - New issue types: `PhanTypeInvalidCallable`, `PhanTypePossiblyInvalidCallable` (the latter check requires `--strict-method-checking`) -+ Reduce false positives for a few functions (such as `substr`) in strict mode. -+ Make Phan infer that variables are not null/false from various comparison expressions, e.g. `assert($x > 0);` -+ Detect invalid arguments to `++`/`--` operators (#680). - Improve the analysis of the side effects of `++`/`--` operators. - New issue type: `PhanTypeInvalidUnaryOperandIncOrDec` - -Plugins: -+ Add `BeforeAnalyzeCapability`, which will be executed once before starting the analysis phase. (#2086) - -Bug fixes: -+ Fix false positives analyzing `define()` (#2128) -+ Support declaring instance properties as the union type `static` (#2145) - New issue types: `PhanStaticPropIsStaticType` -+ Fix a crash seen when Phan attempted to emit `PhanTypeArrayOperator` for certain operations (#2153) - -05 Nov 2018, Phan 1.1.2 ------------------------ - -New features(CLI): -+ Make `phan --progress-bar` fit within narrower console widths. (#2096) - (Make the old width into the new **maximum** width) - Additionally, use a gradient of shades for the progress bar. - -New features(Analysis): -+ Warn when attempting to read from a write-only real/magic property (or vice-versa) (#595) - - New issue types: `PhanAccessReadOnlyProperty`, `PhanAccessReadOnlyMagicProperty`, `PhanAccessWriteOnlyProperty`, `PhanAccessWriteOnlyMagicProperty` - - New annotations: `@phan-read-only` and `@phan-write-only` (on its own line) in the doc comment of a real property. -+ Warn about use statements that are redundant. (#2048) - - New issue types: `PhanUseConstantNoEffect`, `PhanUseFunctionNoEffect`, `PhanUseNormalNamespacedNoEffect`, `PhanUseNormalNoEffect` - - By default, this will only warn about use statements made from the global namespace, of elements also in the global namespace. - To also warn about redundant **namespaced** uses of classes/namespaces (e.g. `namespace Foo; use Foo\MyClass;`), enable `warn_about_redundant_use_namespaced_class` -+ Warn when using a trait as a real param/return type of a method-like (#2007) - New issue types: `PhanTypeInvalidTraitParam`, `PhanTypeInvalidTraitReturn` -+ Improve the polyfill/fallback parser's heredoc and nowdoc lexing (#1537) -+ Properly warn about an undefined variable being passed to `array_shift` (it expects an array but undefined is converted to null) (related to fix for #2100) -+ Stop adding generic int/string to the type of a class property when the doc comment mentions only literal int/string values (#2102) - (e.g. `@var 1|2`) -+ Improve line number of warning about extra comma in arrays (i.e. empty array elements). (#2066) -+ Properly parse [flexible heredoc/nowdoc syntaxes](https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes) that were added in PHP 7.3 (#1537) -+ Warn about more invalid operands of the binary operators `^`,`/`,`&` (#1825) - Also, fix cases where `PhanTypeArrayOperator` would not be emitted. - New issue types: `PhanTypeInvalidBitwiseBinaryOperator`, `PhanTypeMismatchBitwiseBinaryOperands` -+ Indicate when warnings about too many arguments are caused only by argument unpacking. (#1324) - New issue types: `PhanParamTooManyUnpack`, `PhanParamTooManyUnpackInternal` -+ Properly warn about undefined namespaced constants/functions from within a namespace (#2112) - Phan was failing to warn in some cases. -+ Always infer `int` for `<<` and `>>` -+ Support using dynamic values as the name for a `define()` statement (#2116) - -Maintenance: -+ Make issue messages more consistent in their syntax used to describe closures/functions (#1695) -+ Consistently refer to instance properties as `Class->propname` and static properties as `Class::$staticpropname` in issue messages. - -Bug fixes: -+ Properly type check `static::someMethodName()`. - Previously, Phan would fail to infer types for the results of those method calls. -+ Improve handling of `array_shift`. Don't warn when it's used on a global or superglobal (#2100) -+ Infer that `self` and `static` in a trait refer to the methods of that trait. (#2006) - -22 Oct 2018, Phan 1.1.1 ------------------------ - -New features(Analysis): -+ Add `defined at {FILE}:{LINE}` to warnings about property visibility. -+ Warn about missing references (`\n` or `$n`) in the replacement template string of `preg_replace()` (#2047) -+ Make `@suppress` on closures/functions/methods apply more consistently to issues emitted when analyzing the closure/function/method declaration. (#2071) -+ Make `@suppress` on warnings about unparseable doc comments work as expected (e.g. for `PhanInvalidCommentForDeclarationType on a class`) (#1429) -+ Support checking for missing/invalid files in `require`/`include`/`require_once`/`include_once` statements. - - To enable these checks, set `enable_include_path_checks` to `true` in your Phan config. - - New issue types: `PhanRelativePathUsed`, `PhanTypeInvalidEval`, `PhanTypeInvalidRequire`, `PhanInvalidRequireFile`, `PhanMissingRequiredFile` - - New config settings: `enable_include_path_checks`, `include_paths`, `warn_about_relative_include_statement` -+ Warn when attempting to unset a property that was declared (i.e. not a dynamic or magic property) (#569) - New issue type: `PhanTypeObjectUnsetDeclaredProperty` - - - This warning is emitted because declared properties are commonly expected to exist when they are accessed. -+ Warn about iterating over an object that's not a `Traversable` and not `stdClass` (#1115) - New issue types (for those objects) were added for the following cases: - - 1. Has no declared properties (`TypeNoPropertiesForeach`) - 2. Has properties and none are accessible. (`TypeNoAccessiblePropertiesForeach`) - 3. Has properties and some are accessible. (`TypeSuspiciousNonTraversableForeach`) -+ Add `@phan-template` and `@phan-inherits` as aliases for `@template` and `@inherits` (#2063) -+ Warn about passing non-objects to `clone()` (`PhanTypeInvalidCloneNotObject`) (#1798) - -Maintenance: -+ Minor performance improvements. -+ Increase the default value of `max_literal_string_type_length` from 50 to 200. -+ Include Phan version in Phan's error handler and exception handler output. (#1639) - -Bug fixes: -+ Don't crash when parsing an invalid cast expression. Only the fallback/polyfill parsers were affected. - -Language Server/Daemon mode: -+ Fix bugs in the language server. - - 1. The language server was previously using the non-PCNTL fallback - implementation unconditionally due to an incorrect default configuration value. - After this fix, the language server properly uses PCNTL by default - if PCNTL is available. - - This bug was introduced by PR #1743 - - 2. Fix a bug causing the language server to eventually run out of memory when PCNTL was disabled. - -08 Oct 2018, Phan 1.1.0 ------------------------ - -Maintenance: -+ Work on making this compatible with `php-ast` 1.0.0dev. (#2038) - (Phan continues to support php-ast 0.1.5 and newer) - - Remove dead code (such as helper functions and references to constants) that aren't needed when using AST version 50 (which Phan uses). - - Some plugins may be affected if they call these helper methods or use those constants when the shim is used. - -Bug fixes: -+ Fix a crash parsing an empty `shell_exec` shorthand string when using the fallback parser - (i.e. two backticks in a row) -+ Fix a false positive `PhanUnusedVariable` warning about a variable declared prior to a do/while loop (#2026) - -02 Oct 2018, Phan 1.0.7 ------------------------ - -New features(Analysis): -+ Support the `(int|string)[]` syntax of union types (union of multiple types converted to an array) in PHPDoc (#2008) - - e.g. `@param (int|string)[] $paramName`, `@return (int|string)[]` -+ Support spaces after commas in array shapes (#1966) -+ Emit warnings when using non-strings as dynamic method names (e.g. `$o->{$notAString}()`) - New issue types: `PhanTypeInvalidMethodName`, `PhanTypeInvalidStaticMethodName`, `PhanTypeInvalidCallableMethodName` - -Plugins: -+ In HasPHPDocPlugin, use a more compact representation to show what Phan sees from the raw doc comment. -+ In HasPHPDocPlugin, warn about global functions without extractable PHPDoc summaries. - - New issue types: `PhanPluginNoCommentOnFunction`, `PhanPluginDescriptionlessCommentOnFunction` -+ In HasPHPDocPlugin, warn about methods without extractable PHPDoc summaries. - - New issue types: `PhanPluginNoCommentOn*Method`, `PhanPluginDescriptionlessCommentOn*Method` - - These can be suppressed based on the method FQSEN with `plugin_config => [..., 'has_phpdoc_method_ignore_regex' => (a PCRE regex)]` - (e.g. to suppress issues about tests, or about missing documentation about getters and setters, etc.) - -Bug fixes: -+ Fix false positive `PhanUnusedVariable` for variables declared before break/continue that are used after the loop. (#1985) -+ Properly emit `PhanUnusedVariable` for variables where definitions are shadowed by definitions in branches and/or loops. (#2012) -+ Properly emit `PhanUnusedVariable` for variables which are redefined in a 'do while' loop. -+ Be more consistent about emitting `PhanUnusedVariableCaughtException` when exception variable names are reused later on. -+ Fix a crash when parsing `@method` annotations with many parameters (#2019) - -25 Sep 2018, Phan 1.0.6 ------------------------ - -New features(Analysis): -+ Be more consistent about warning about undeclared properties in some edge cases. - New issue types: `PhanUndeclaredClassProperty`, `PhanUndeclaredClassStaticProperty` - -Maintenance: -+ Restore test files in future published releases' **git tags** (#1986) - (But exclude them from the zip/tar archives published on GitHub Releases) - - - When `--prefer-dist` (the default) is used in composer to download a stable release, - the test files will not be part of the downloaded files. - -Language Server/Daemon mode: -+ Add support for code completion suggestions. (#1706) - - This can be enabled by passing `--language-server-enable-completion` - - This will complete references to the following element types: - - - variable names (using superglobals and local variables that have been declared in the scope) - - global constants, global functions, and class names. - - class constants, instance and static properties, and instance and static method names. - - NOTE: If you are completing from the empty string (e.g. immediately after `->` or `::`), - Phan may interpret the next word token (e.g. on the next line) as the property/constant name/etc. to complete, - due to the nature of the parser used (The cursor position doesn't affect the parsing logic). - - - Completion requests before tokens that can't be treated that way will not cause that problem. - (such as `}`, `;`, `)`, the end of the file, etc.) - -Bug fixes: -+ Fix various uncaught errors in Phan that occurred when parsing invalid ASTs. - Instead of crashing, warn about the bug or invalid AST. - - New issue types: `PhanInvalidConstantFQSEN`, `PhanContextNotObjectUsingSelf`, `PhanInvalidTraitUse` (for unparsable trait uses) - -21 Sep 2018, Phan 1.0.5 ------------------------ - -New Features(Analysis) -+ Warn if a PHPDoc annotation for an element(`@param`, `@method`, or `@property*`) is repeated. (#1963) - - New issue types: `PhanCommentDuplicateMagicMethod`, `PhanCommentDuplicateMagicProperty`, `PhanCommentDuplicateParam` -+ Add basic support for `extract()` (#1978) -+ Improve line numbers for warnings about `@param` and `@return` annotations (#1369) - -Maintenance: -+ Make `ext-ast` a suggested composer dependency instead of a required composer dependency (#1981) - - `--use-fallback-parser` allows Phan to analyze files even when php-ast is not installed or enabled. -+ Remove test files from future published releases (#1982) - -Plugins: -+ Properly warn about code after `break` and `continue` in `UnreachableCodePlugin`. - Previously, Phan only warned about code after `throw` and `return`. - -Bug fixes: -+ Don't infer bad types for variables when analyzing `array_push` using expressions containing those variables. (#1955) - - (also fixes other `array_*` functions taking references) -+ Fix false negatives in PHP5 backwards compatibility heuristic checks (#1939) -+ Fix false positive `PhanUnanalyzableInheritance` for a method inherited from a trait (which itself uses trait) (#1968) -+ Fix an uncaught `RuntimeException` when type checking an array that was roughly 12 or more levels deep (#1962) -+ Improve checks of the return type of magic methods against methods inherited from ancestor classes (#1975) - - Don't emit a false positive `PhanParamSignaturePHPDocMismatchReturnType` - -Language Server/Daemon mode: -+ Fix an uncaught exception when extracting a URL with an unexpected scheme (not `file:/...`) (#1960) -+ Fix false positive `PhanUnreferencedUseNormal` issues seen when the daemon was running without pcntl (#1860) - -10 Sep 2018, Phan 1.0.4 ------------------------ - -Plugins: -+ Fix a crash in `DuplicateExpressionPlugin`. -+ Add `HasPHPDocPlugin`, which checks if an element (class or property) has a PHPDoc comment, - and that Phan can extract a plaintext summary/description from that comment. - -Language Server/Daemon mode: -+ Support generating a hover description for variables. - - - For union types with a single non-nullable class/interface type, the hover text include the full summary description of that class-like. - - For non-empty union types, this will just show the raw union type (e.g. `string|false`) -+ Improve extraction of summaries of elements (e.g. hover description) - - - Support using `@return` as a summary for function-likes. - - Parse the lines after `@var` tag (before subsequent tags) - as an additional part of the summary for constants/properties. - -Maintenance: -+ Update Phar file to contain missing LICENSEs (#1950) -+ Add more documentation to Phan's code. - -07 Sep 2018, Phan 1.0.3 ------------------------ - -Bug fixes -+ Fix bugs in analysis of assignments within conditionals (#1937) -+ Fix a crash analyzing comparison with variable assignment expression (#1940) - (e.g. `if (1 + 1 > ($var = 1))`) - -Plugins: -+ Update `SleepCheckerPlugin` to warn about properties that aren't returned in `__sleep()` - that don't have a doc comment annotation of `@phan-transient` or `@transient`. - (This is not an officially specified annotation) - - New issue type: `SleepCheckerPropertyMissingTransient` - - New setting: `$config['plugin_config']['sleep_transient_warning_blacklist_regex']` - can be used to prevent Phan from warning about certain properties missing `@phan-transient` - -06 Sep 2018, Phan 1.0.2 ------------------------ - -New features(Analysis) -+ Allow spaces on either side of `|` in union types - (e.g. `@param array | ArrayAccess $x`) -+ Warn about array destructuring assignments from non-arrays (#1818) - (E.g. `[$x] = 2`) - - New issue type: `PhanTypeInvalidExpressionArrayDestructuring` -+ Infer the number of groups for $matches in `preg_match()` - - Named subpatterns, non-capturing patterns, and regular expression options are not supported yet. - Phan will just infer a more generic type such as `string[]` (depending on the bit flags). -+ Warn about ambiguous uses of `Closure():void` in phpdoc. - Also, make that syntax count as a reference to `use Closure;` in that namespace. -+ Track the line number of magic method and magic properties (Instead of reporting the line number of the class). - -Bug fixes -+ Fix a crash seen when using a temporary expression in a write context. (#1915) - - New issue type: `PhanInvalidWriteToTemporaryExpression` -+ Fix a crash seen with --use-fallback-parser with an invalid expression after `new` -+ Properly infer that closures have a class name of `Closure` for some issue types. - (e.g. `call_user_func([function() {}, 'invalidMethod'])`) -+ Fix a bug analyzing nested assignment in conditionals (#1919) -+ Don't include impossible types when analyzing assertions such as `is_string($var)` (#1932) - -26 Aug 2018, Phan 1.0.1 ------------------------ - -New features(CLI,Configs) -+ Support setting a `target_php_version` of PHP 7.3 in the config file or through `--target-php-version`. -+ Assume that `__construct`, `__destruct`, `__set`, `__get`, `__unset`, `__clone`, and `__wakeup` have return types of void if unspecified. - -New features(Analysis) -+ Add function signatures for functions added/modified in PHP 7.3. (#1537) -+ Improve the line number for warnings about unextractable `@property*` annotations. -+ Make Phan aware that `$x` is not false inside of loops such as `while ($x = dynamic_value()) {...}` (#1646) -+ Improve inferred types of `$x` in complex equality/inequality checks such as `if (($x = dynamic_value()) !== false) {...}` -+ Make `!is_numeric` assertions remove `int` and `float` from the union type of an expression. (#1895) -+ Preserve any matching original types in scalar type assertions (#1896) - (e.g. a variable `$x` of type `?int|?MyClass` will have type `int` after `assert(is_numeric($x))`) - -Maintenance: -+ Add/modify various function, methods, and property type signatures. - -Plugins: -+ Add `UnknownElementTypePlugin` to warn about functions/methods - that have param/return types that Phan can't infer anything about. - (it can still infer some things in non-quick mode about parameters) - - New issue types: `PhanPluginUnknownMethodReturnType`, `PhanPluginUnknownClosureReturnType`, `PhanPluginUnknownFunctionReturnType`, `PhanPluginUnknownPropertyType` -+ Add `DuplicateExpressionPlugin` to warn about duplicated expressions such as: - - `X == X`, `X || X`, and many other binary operators (for operators where it is likely to be a bug) - - `X ? X : Y` (can often simplify to `X ?: Y`) - - `isset(X) ? X : Y` (can simplify to `??` in PHP 7) - - New issue types: `PhanPluginDuplicateExpressionBinaryOp`, `PhanPluginDuplicateConditionalTernaryOperation`, `PhanPluginDuplicateConditionalNullCoalescing` -+ Improve types inferred for `$matches` for PregRegexCheckerPlugin. - -Bug fixes: -+ Properly handle `CompileError` (that are not the subclass `ParseError`). CompileError was added in PHP 7.3. - (Phan now logs these the same way it would log other syntax errors, instead of treating this like an unexpected Error.) -+ Make sure that private methods that are generators, that are inherited from a trait, aren't treated like a `void`. -+ Fix a crash analyzing a dynamic call to a static method, which occurred when dead code detection or reference tracking was enabled. (#1889) -+ Don't accidentally emit false positive issues about operands of binary operators in certain contexts. (#1898) - -12 Aug 2018, Phan 1.0.0 ------------------------ - -The Phan 1.0.0 release supports analysis of php 7.0-7.2, and can be executed with php 7.0+. -This release replaces the previous 0.12.x releases. -Because Phan uses PHP's Reflection APIs, it's recommended to use the same PHP minor version for analyzing the code as would be used to run the code. -(For the small number of function/method signatures, etc., that were added or changed in each minor release of PHP.) - -Plugins: -+ Plugins: Remove V1 plugins (and V1 plugin examples), as well as legacy plugin capabilities. (#249) - Third party plugin authors must use V2 of the plugin system. - - Removed capabilities: - - - `AnalyzeNodeCapability`, `LegacyAnalyzeNodeCapability`, `LegacyPostAnalyzeNodeCapability` (use `PostAnalyzeNodeCapability` instead) - - `LegacyPreAnalyzeNodeCapability` (use `PreAnalyzeNodeCapability` instead) -+ API: Remove various methods that were deprecated. (#249) - Any plugins using those methods will need to be updated. - (e.g. `Config::getValue('config_value')` must be used instead of `Config::get()->config_value`) -+ Config: Remove `progress_bar_sample_rate` (#249) - (`progress_bar_sample_interval` must be used instead if you want the progress bar to be faster or slower) -+ Maintenance: Immediately report the exception and exit if any plugins threw an uncaught `Throwable` during initialization. - (E.g. this results in a better error message when a third party plugin requires PHP 7.1 syntax but PHP 7.0 is used to run Phan) - -21 Jul 2018, Phan 0.12.15 -------------------------- - -New features(Analysis) -+ Make Phan's unused variable detection also treat exception variables as variable definitions, - and warn if the caught exception is unused. (#1810) - New issue types: `PhanUnusedVariableCaughtException` -+ Be more aggressive about inferring that a method has a void return type, when it is safe to do so -+ Emit `PhanInvalidConstantExpression` in some places where PHP would emit `"Constant expression contains invalid operations"` - - Phan will replace the default parameter type (or constant type) with `mixed` for constants and class constants. - - Previously, this could cause Phan to crash, especially with `--use-fallback-parser` on invalid ASTs. -+ Improve analysis of arguments passed to `implode()` - -New features(CLI) -+ Add `--daemonize-tcp-host` CLI option for specifying the hostname for daemon mode (#1868). - The default will remain `127.0.0.1` when not specified. - It can be overridden to values such as `0.0.0.0` (publicly accessible, e.g. for usage with Docker) - -Language Server/Daemon mode: -+ Implement support for hover requests in the Language Server (#1738) - - This will show a preview of the element definition (showing signature types instead of PHPDoc types) - along with the snippet of the element description from the doc comment. - - Clients that use this should pass in the CLI option `--language-server-enable-hover` when starting the language server. - - - Note that this implementation assumes that clients sanitize the mix of markdown and HTML before rendering it. - - Note that this may slow down some language server clients if they pause while waiting for the hover request to finish. - -Maintenance: -+ Add a workaround for around a notice in PHP 7.3alpha4 (that Phan treats as fatal) (#1870) - -Bug fixes: -+ Fix a bug in checking if nullable versions of specialized type were compatible with other nullable types. (#1839, #1852) - Phan now correctly allows the following type casts: - - - `?1` can cast to `?int` - - `?'a string'` can cast to `?string` - - `?Closure(T1):T2` can cast to `?Closure` - - `?callable(T1):T2` can cast to `?callable`, -+ Make `exclude_file_list` work more consistently on Windows. - -08 Jul 2018, Phan 0.12.14 -------------------------- - -New features(CLI, Configs) -+ Add `warn_about_undocumented_throw_statements` and `exception_classes_with_optional_throws_phpdoc` config. (#90) - - If `warn_about_undocumented_throw_statements` is true, Phan will warn about uncaught throw statements that aren't documented in the function's PHPDoc. - (excluding classes listed in `exception_classes_with_optional_throws_phpdoc` and their subclasses) - This does not yet check function and method calls within the checked function that may themselves throw. - - Add `warn_about_undocumented_exceptions_thrown_by_invoked_functions`. - If enabled (and `warn_about_undocumented_throw_statements` is enabled), - Phan will warn about function/closure/method invocations that have `@throws` - that aren't caught or documented in the invoking method. - New issue types: `PhanThrowTypeAbsent`, `PhanThrowTypeAbsentForCall`, - `PhanThrowTypeMismatch`, `PhanThrowTypeMismatchForCall` - - Add `exception_classes_with_optional_throws_phpdoc` config. - Phan will not warn about lack of documentation of `@throws` for any of the configured classes or their subclasses. - The default is the empty array (Don't suppress any warnings.) - (E.g. Phan suppresses `['RuntimeException', 'AssertionError', 'TypeError']` for self-analysis) - -New Features (Analysis): -+ Warn when string literals refer to invalid class names (E.g. `$myClass::SOME_CONSTANT`). (#1794) - New issue types: `PhanTypeExpectedObjectOrClassNameInvalidName` (emitted if the name can't be used as a class) - This will also emit `PhanUndeclaredClass` if the class name could not be found. -+ Make Phan aware that `$this` doesn't exist in a static closure (#768) - -Language Server/Daemon mode: -+ Fix another rare bug that can cause crashes in the polyfill/fallback parser when parsing invalid or incomplete ASTs. -+ Add a `--language-server-hide-category` setting to hide the issue category from diagnostic messages. -+ Remove the numeric diagnostic code from the language server diagnostics (a.k.a. issues). - (Certain language clients such as LanguageClient-neovim would render that the code in the quickfix menu, wasting space) -+ Support "go to definition" for union types within all code comment types (#1704) - (e.g. can go to definition in `// some annotation or comment mentioning MyType`) - -New features(Analysis) -+ Support analysis of [`list()` reference assignment](https://wiki.php.net/rfc/list_reference_assignment) for php 7.3 (which is still in alpha). (#1537) -+ Warn about invalid operands of the unary operators `+`, `-`, and `~` - New issue types: `PhanTypeInvalidUnaryOperandNumeric` and `PhanTypeInvalidUnaryOperandBitwiseNot` (#680) - -Bug fixes: -+ Fix a bug causing Phan to infer extra wrong types (`ancestorClass[][]`) for `@return className[]` (#1822) -+ Start warning about assignment operations (e.g. `+=`) when the modified variable isn't referenced later in the function. -+ Make exceptions in `catch{}` always include the type `Throwable` even if the declared type doesn't. (#336) - -16 Jun 2018, Phan 0.12.13 -------------------------- - -New features(Analysis) -+ Support integer literals both in PHPDoc and in Phan's type system. (E.g. `@return -1|string`) - Include integer values in issue messages if the values are known. -+ Support string literals both in PHPDoc and in Phan's type system. (E.g. `@return 'example\n'`) - Phan can now infer possible variable values for dynamic function/method calls, etc. - - Note: By default, Phan does not store representations of strings longer than 50 characters. This can be increased with the `'max_literal_string_type_length'` config. - - Supported escape codes: `\\`, `\'`, `\r`, `\n`, `\t`, and hexadecimal (`\xXX`). -+ Improve inferred types of unary operators. -+ Warn about using `void`/`iterable`/`object` in use statements based on `target_php_version`. (#449) - New issue types: `PhanCompatibleUseVoidPHP70`, `PhanCompatibleUseObjectPHP71`, `PhanCompatibleUseObjectPHP71` -+ Warn about making overrides of inherited property and constants less visible (#788) - New issue types: `PhanPropertyAccessSignatureMismatch`, `PhanPropertyAccessSignatureMismatchInternal`, - `PhanConstantAccessSignatureMismatch`, `PhanConstantAccessSignatureMismatchInternal`. -+ Warn about making static properties into non-static properties (and vice-versa) (#615) - New issue types: `PhanAccessNonStaticToStaticProperty`, `PhanAccessStaticToNonStaticProperty` -+ Warn about inheriting from a class/trait/interface that has multiple possible definitions (#773) - New issue types: `PhanRedefinedExtendedClass`, `PhanRedefinedUsedTrait`, `PhanRedefinedInheritedInterface` -+ Infer more accurate types for the side effects of assignment operators (i.e. `+=`, `.=`, etc) and other binary operations. (#1775) -+ Warn about invalid arguments to binary operators or assignment operators. - New issue types: `PhanTypeInvalidLeftOperandOfAdd`, `PhanTypeInvalidLeftOperandOfNumericOp`, - `PhanTypeInvalidRightOperandOfAdd`, `PhanTypeInvalidRightOperandOfNumericOp` -+ Warn about using negative string offsets and multiple catch exceptions in PHP 7.0 (if `target_php_version` is less than `'7.1'`). (#1771, #1778) - New issue types: `PhanCompatibleMultiExceptionCatchPHP70`, `PhanCompatibleNegativeStringOffset`. - -Maintenance: -+ Update signature map with more accurate signatures (#1761) -+ Upgrade tolerant-php-parser, making the polyfill/fallback able to parse PHP 7.1's multi exception catch. - -Bug fixes: -+ Don't add more generic types to properties with more specific PHPDoc types (#1783). - For example, don't add `array` to a property declared with PHPDoc type `/** @var string[] */` -+ Fix uncaught `AssertionError` when `parent` is used in PHPDoc (#1758) -+ Fix various bugs that can cause crashes in the polyfill/fallback parser when parsing invalid or incomplete ASTs. -+ Fix unparsable/invalid function signature entries of rarely used functions -+ Warn about undefined variables on the left-hand side of assignment operations (e.g. `$x .= 'string'`) (#1613) - -08 Jun 2018, Phan 0.12.12 -------------------------- - -Maintenance: -+ Increase the severity of some issues to critical - (if they are likely to cause runtime Errors in the latest PHP version). - -Bug fixes: -+ Allow suppressing `PhanTypeInvalidThrows*` with doc comment suppressions - in the phpdoc of a function/method/closure. -+ Fix crashes when fork pool is used and some issue types are emitted (#1754) -+ Catch uncaught exception for PhanContextNotObject when calling `instanceof self` outside a class scope (#1754) - -30 May 2018, Phan 0.12.11 -------------------------- - -Language Server/Daemon mode: -+ Make the language server work more reliably when `pcntl` is unavailable. (E.g. on Windows) (#1739) -+ By default, allow the language server and daemon mode to start with the fallback even if `pcntl` is unavailable. - (`--language-server-require-pcntl` can be used to make the language server refuse to start without `pcntl`) - -Bug fixes: -+ Don't crash if `ext-tokenizer` isn't installed (#1747) -+ Fix invalid output of `tool/make_stubs` for APCu (#1745) - -27 May 2018, Phan 0.12.10 -------------------------- - -New features(CLI, Configs) -+ Add CLI flag `--unused-variable-detection`. -+ Add config setting `unused_variable_detection` (disabled by default). - Unused variable detection can be enabled by `--unused-variable-detection`, `--dead-code-detection`, or the config. - -New features(Analysis): -+ Add built-in support for unused variable detection. (#345) - Currently, this is limited to analyzing inside of functions, methods, and closures. - This has some minor false positives with loops and conditional branches. - - Warnings about unused parameters can be suppressed by adding `@phan-unused-param` on the same line as `@param`, - e.g. `@param MyClass $x @phan-unused-param`. - (as well as via standard issue suppression methods.) - - The built in unused variable detection support will currently not warn about any of the following issue types, to reduce false positives. - - - Variables beginning with `$unused` or `$raii` (case-insensitive) - - `$_` (the exact variable name) - - Superglobals, used globals (`global $myGlobal;`), and static variables within function scopes. - - Any references, globals, or static variables in a function scope. - - New Issue types: - - `PhanUnusedVariable`, - - `PhanUnusedVariableValueOfForeachWithKey`, (has a high false positive rate) - - `PhanUnusedPublicMethodParameter`, `PhanUnusedPublicFinalMethodParameter`, - - `PhanUnusedProtectedMethodParameter`, `PhanUnusedProtectedFinalMethodParameter`, - - `PhanUnusedPrivateMethodParameter`, `PhanUnusedProtectedFinalMethodParameter`, - - `PhanUnusedClosureUseVariable`, `PhanUnusedClosureParameter`, - - `PhanUnusedGlobalFunctionParameter` - - This is similar to the third party plugin `PhanUnusedVariable`. - The built-in support has the following changes: - - - Emits fewer/different false positives (e.g. when analyzing loops), but also detects fewer potential issues. - - Reimplemented using visitors extensively (Similar to the code for `BlockAnalysisVisitor`) - - Uses a different data structure from `PhanUnusedVariable`. - This represents all definitions of a variable, instead of just the most recent one. - This approximately tracks the full graph of definitions and uses of variables within a function body. - (This allows warning about all unused definitions, or about definitions that are hidden by subsequent definitions) - - Integration: This is planned to be integrated with other features of Phan, e.g. "Go to Definition" for variables. (Planned for #1211 and #1705) - -Bug fixes: -+ Minor improvements to `UnusedSuppressionPlugin` - -Misc: -+ Support `composer.json`'s `vendor-dir` for `phan --init` - -22 May 2018, Phan 0.12.9 ------------------------- - -New features(CLI, Configs): -+ Add CLI flag `--language-server-enable-go-to-definition`. See the section "Language Server/Daemon mode". -+ Add Config setting `disable_line_based_suppression` to disable line-based suppression from internal comments. See the section "New Features" -+ Add Config setting `disable_file_based_suppression` to disable file-based issue suppressions. - -New features(Analysis): -+ Make `@suppress`, `@phan-suppress`, `@phan-file-suppress` accept a comma separated issue list of issue types to suppress. (#1715) - Spaces aren't allowed before the commas. -+ Implement `@phan-suppress-current-line` and `@phan-suppress-next-line` to suppress issues on the current or next line. - - These can occur within any comment or doc comment (i.e. the comment types for `/*`, `//`, and `/**`) - - These suppressions accept a comma separated list of issue type names. - Commas must be immediately after the previous issue type. - - Note: Phan currently does not support inline comments anywhere else. - Phan also does not associate these inline comments with any information about the current scope. - This suppression is based on tokenizing the PHP file and determining the line based on that comment line. - - Examples: - - ```php - // @phan-suppress-next-line PhanUndeclaredVariable, PhanUndeclaredFunction optional reason goes here - $result = call_undefined_function() + $undefined_variable; - - $closure(); /* @phan-suppress-current-line PhanParamTooFew optional reason for suppression */ - - /** - * This can also be used within doc comments: - - * @phan-suppress-next-line PhanInvalidCommentForDeclarationType optional reason for suppression - * @property int $x - */ - function my_example() { - } - ``` - - `PhanUnusedSuppressionPlugin` is capable of detecting if line-based suppressions are unused. -+ Allow using `@phan-file-suppress` as a regular comment anywhere within a file (`//`, `/*`, or `/**` comments). - Previously, `@phan-file-suppress` could only be used inside the doc comment of an element. - - `@phan-file-suppress` in no-op string literals will be deprecated in a future Phan release. -+ Emit class name suggestions for undeclared types in param, property, return type, and thrown type declarations. (#1689) - - Affects `PhanUndeclaredTypeParameter`, `PhanUndeclaredTypeProperty`, `PhanUndeclaredTypeReturnType`, - `PhanUndeclaredTypeThrowsType`, and `PhanInvalidThrowsIs*` -+ Add `pretend_newer_core_methods_exist` config setting. - If this is set to true (the default), - and `target_php_version` is newer than the version used to run Phan, - Phan will act as though functions added in newer PHP versions exist. - - Note: Currently only affects `Closure::fromCallable()`, which was added in PHP 7.1. - This setting will affect more functions and methods in the future. - -Language Server/Daemon mode: -+ Support "Go to definition" for properties, classes, global/class constants, and methods/global functions (Issue #1483) - (Must pass the CLI option `--language-server-enable-go-to-definition` when starting the server to enable this) -+ Support "Go to type definition" for variables, properties, classes, and methods/global functions (Issue #1702) - (Must pass the CLI option `--language-server-enable-go-to-definition` when starting the server to enable this) - Note that constants can't have object types in PHP, so there's no implementation of "Go To Type Definition" for those. - -Plugins: -+ Add a new plugin capability `SuppressionCapability` - that allows users to suppress issues in additional ways. (#1070) -+ Add a new plugin `SleepCheckerPlugin`. (PR #1696) - Warn about returning non-arrays in sleep, - as well as about returning array values with invalid property names. - - Issue types: `SleepCheckerInvalidReturnStatement`, `SleepCheckerInvalidPropNameType`, `SleepCheckerInvalidPropName`, - `SleepCheckerMagicPropName`, and `SleepCheckerDynamicPropName` -+ Make `PhanPregRegexCheckerPlugin` warn about the `/e` modifier on regexes (#1692) - -Misc: -+ Add simple integration test for the language server mode. - -Bug fixes: -+ Be more consistent about emitting `PhanUndeclaredType*` for invalid types within array shapes. -+ Avoid a crash when the left-hand side of an assignment is invalid. (#1693) -+ Prevent an uncaught `TypeError` when integer variable names (e.g. `${42}`) are used in branches (Issue #1699) - -12 May 2018, Phan 0.12.8 ------------------------- - -Bug fixes -+ Fix a crash that occurs when the `iterable<[KeyType,]ValueType>` annotation is used in phpdoc. (#1685) - -08 May 2018, Phan 0.12.7 ------------------------- - -New features: -+ For `PhanUndeclaredMethod` and `PhanUndeclaredStaticMethod` issues, suggest visible methods (in the same class) with similar names. -+ For `PhanUndeclaredConstant` issues (for class constants), suggest visible constants (in the same class) with similar names. -+ For `PhanUndeclaredProperty` and `PhanUndeclaredStaticProperty` issues, suggest visible properties (in the same class) with similar names. -+ When suggesting alternatives to undeclared classes, - also include suggestions for similar class names within the same namespace as the undeclared class. - (Comparing Levenshtein distance) - -Language Server/Daemon mode -+ Make the latest version of `phan_client` include any suggestion alongside the issue message (for daemon mode). -+ Include text from suggestions in Language Server Protocol output - -Bug fixes -+ Fix a bug generating variable suggestions when there were multiple similar variable names - (The suggestions that would show up might not be the best set of suggestions) -+ Fix a crash in the tolerant-php-parser polyfill seen when typing out an echo statement -+ Fix incorrect suggestions to use properties (of the same name) instead of undeclared variables in class scopes. - (Refer to static properties as `self::$name` and don't suggest inaccessible inherited private properties) -+ Don't suggest obviously invalid alternatives to undeclared classes. - (E.g. don't suggest traits or interfaces for `new MisspelledClass`, don't suggest interfaces for static method invocations) - -06 May 2018, Phan 0.12.6 ------------------------- - -New features(Analysis) -+ Warn about properties that are read but not written to when dead code detection is enabled - (Similar to existing warnings about properties that are written to but never read) - New issue types: `PhanReadOnlyPrivateProperty`, `PhanReadOnlyProtectedProperty`, `PhanReadOnlyPublicProperty` -+ When warning about undeclared classes, mention any classes that have the same name (but a different namespace) as suggestions. - - E.g. `test.php:26 PhanUndeclaredClassInstanceof Checking instanceof against undeclared class \MyNS\InvalidArgumentException (Did you mean class \InvalidArgumentException)` -+ When warning about undeclared variables (outside of the global scope), mention any variables that have similar names (based on case-insensitive Levenshtein distance) as suggestions. - - In method scopes: If `$myName` is undeclared, but `$this->myName` is declared (or inherited), `$this->myName` will be one of the suggestions. -+ Warn about string and numeric literals that are no-ops. (E.g. `<?php 'notEchoedStr'; "notEchoed $x"; ?>`) - New issue types: `PhanNoopStringLiteral`, `PhanNoopEncapsulatedStringLiteral`, `PhanNoopNumericLiteral`. - - Note: This will not warn about Phan's [inline type checks via string literals](https://github.com/phan/phan/wiki/Annotating-Your-Source-Code#inline-type-checks-via-string-literals) -+ When returning an array literal (with known keys) directly, - make Phan infer the array literal's array shape type instead of a combination of generic array types. -+ Make type casting rules stricter when checking if an array shape can cast to a given generic array type. - (E.g. `array{a:string,b:int}` can no longer cast to `array<string,int>`, but can cast to `array<string,int>|array<string,string>`). - - E.g. Phan will now warn about `/** @return array<string,int> */ function example() { $result = ['a' => 'x', 'b' => 2]; return $result; }` -+ Warn about invalid expressions/variables encapsulated within double-quoted strings or within heredoc strings. - New issue type: `TypeSuspiciousStringExpression` (May also emit `TypeConversionFromArray`) - -+ Add support for template params in iterable types in phpdoc. (#824) - Phan supports `iterable<TValue>` and `iterable<TKey, TValue>` syntaxes. (Where TKey and TValue are union types) - Phan will check that generic arrays and array shapes can cast to iterable template types. -+ Add support for template syntax of Generator types in phpdoc. (#824) - Supported syntaxes are: - - 1. `\Generator<TValue>` - 2. `\Generator<TKey,TValue>` - 3. `\Generator<TKey,TValue,TSend>` (TSend is the expected type of `$x` in `$x = yield;`) - 4. `\Generator<TKey,TValue,TSend,TReturn>` (TReturn is the expected type of `expr` in `return expr`) - - New issue types: `PhanTypeMismatchGeneratorYieldValue`, `PhanTypeMismatchGeneratorYieldKey` (For comparing yield statements against the declared `TValue` and `TKey`) - - Additionally, Phan will use `@return Generator|TValue[]` to analyze the yield statements - within a function/method body the same way as it would analyze `@return Generator<TValue>`. - (Analysis outside the method would not change) - -+ Add support for template params in Iterator and Traversable types in phpdoc. (#824) - NOTE: Internal subtypes of those classes (e.g. ArrayObject) are not supported yet. - Supported syntaxes are: - - 1. `Traversable<TValue>`/`Iterator<TValue>` - 2. `Traversable<TKey,TValue>`/`Iterator<TKey,TValue>` - -+ Analyze `yield from` statements. - - New issue types: `PhanTypeInvalidYieldFrom` (Emitted when the expression passed to `yield from` is not a Traversable or an array) - - Warnings about the inferred keys/values of `yield from` being invalid reuse `PhanTypeMismatchGeneratorYieldValue` and `PhanTypeMismatchGeneratorYieldKey` -+ Make the union types within the phpdoc template syntax of `iterator`/`Traversable`/`Iterator`/`Generator` affect analysis of the keys/values of `foreach` statements -+ Improve Phan's analysis of array functions modifying arguments by reference, reducing false positives. (#1662) - Affects `array_shift`/`array_unshift`/`array_push`/`array_pop`/`array_splice`. - -Misc -+ Infer that a falsey array is the empty array shape. - -Bug Fixes -+ Consistently warn about unreferenced declared properties (i.e. properties that are not magic or dynamically added). - Previously, Phan would just never warn if the class had a `__get()` method (as a heuristic). - -03 Apr 2018, Phan 0.12.5 ------------------------- - -Plugins -+ Add an option `'php_native_syntax_check_max_processes'` to `'plugin_config'` for `InvokePHPNativeSyntaxCheckPlugin`. - -Bug Fixes -+ Remove extra whitespace from messages of comment text in `UnextractableAnnotationElementName` (e.g. `"\r"`) -+ Fix bugs in `InvokePHPNativeSyntaxCheckPlugin` - -31 Mar 2018, Phan 0.12.4 ------------------------- - -New Features(CLI, Configs) -+ Add a `strict_param_checking` config setting. (And a `--strict-param-checking` CLI flag) - If this is set to true, then Phan will warn if at least one of the types - in an argument's union type can't cast to the expected parameter type. - New issue types: `PhanPartialTypeMismatchArgument`, `PhanPossiblyNullTypeArgument`, and `PhanPossiblyFalseTypeArgument` - (along with equivalents for internal functions and methods) - - Setting this to true will likely introduce large numbers of warnings. - Those issue types would need to be suppressed entirely, - or with `@phan-file-suppress`, or with `@suppress`. -+ Add a `strict_property_checking` config setting. (And a `--strict-property-checking` CLI flag) - If this is set to true, then Phan will warn if at least one of the types - in an assignment's union type can't cast to the expected property type. - New issue types: `PhanPartialTypeMismatchProperty`, `PhanPossiblyNullTypeProperty`, and `PhanPossiblyFalseTypeProperty` - - NOTE: This option does not make Phan check if all possible expressions have a given property, but may do that in the future. -+ Add a `strict_return_checking` config setting. (And a `--strict-return-checking` CLI flag) - If this is set to true, then Phan will warn if at least one of the types - in a return statement's union type can't cast to the expected return type. - New issue types: `PhanPartialTypeMismatchReturn`, `PhanPossiblyNullTypeReturn`, and `PhanPossiblyFalseTypeReturn` - - Setting this to true will likely introduce large numbers of warnings. - Those issue types would need to be suppressed entirely, - or with `@phan-file-suppress`, or with `@suppress`. -+ Add a `--strict-type-checking` CLI flag, to enable all of the new strict property/param/return type checks. -+ Add a `guess_unknown_parameter_type_using_default` config, - which can be enabled to make Phan more aggressively infer the types of undocumented optional parameters - from the parameter's default value. - E.g. `function($x = 'val')` would make Phan infer that the function expects $x to have a type of `string`, not `string|mixed`. - -Plugins -+ Add a new plugin `InvokePHPNativeSyntaxCheckPlugin` on all analyzed files (but not files excluded from analysis) (#629) -+ Add a new plugin capability `AfterAnalyzeFileCapability` that runs after a given file is analyzed. - This does not get invoked for files that are excluded from analysis, or for empty files. - -New Features(Analysis) -+ Detect unreachable catch statements (#112) - (Check if an earlier catch statement caught an ancestor of a given catch statement) -+ Support phpdoc3's `scalar` type in phpdoc. (#1589) - That type is equivalent to `bool|float|int|string`. -+ Improve analysis of return statements with ternary conditionals (e.g. `return $a ?: $b`). -+ Start analyzing negated `instanceof` conditionals such as `assert(!($x instanceof MyClass))`. -+ Infer that the reference parameter's resulting type for `preg_match` is a `string[]`, not `array` (when possible) - (And that the type is `array{0:string,1:int}[]` when `PREG_OFFSET_CAPTURE` is passed as a flag) -+ Warn in more places when Phan can't extract union types or element identifiers from a doc comment. - New issue types: `UnextractableAnnotationElementName`, `UnextractableAnnotationSuffix`. - (E.g. warn about `@param int description` (ideally has param name) and `@return int?` (Phan doesn't parse the `?`, should be `@return ?int`)) - -Bug Fixes -+ Don't emit false positive `PhanTypeArraySuspiciousNullable`, etc. for complex isset/empty/unset expressions. (#642) -+ Analyze conditionals wrapped by `@(cond)` (e.g. `if (@array_key_exists('key', $array)) {...}`) (#1591) -+ Appending an unknown type to an array shape should update Phan's inferred keys(int) and values(mixed) of an array. (#1560) -+ Make line numbers for arguments more accurate -+ Infer that the result of `|` or `&` on two strings is a string. -+ Fix a crash caused by empty FQSENs for classlike names or function names (#1616) - -24 Mar 2018, Phan 0.12.3 ------------------------- - -New Features(CLI, Configs) -+ Add `--polyfill-parse-all-element-doc-comments` for PHP 7.0. - If you're using the polyfill (e.g. using `--force-polyfill-parser`), this will parse doc comments on class constants in php 7.0. - (Normally, the polyfill wouldn't include that information, to closely imitate `php-ast`'s behavior) - -New Features(Analysis) -+ Infer the type of `[]` as `array{}` (the empty array), not `array`. (#1382) -+ Allow phpdoc `@param` array shapes to contain optional fields. (E.g. `array{requiredKey:int,optionalKey?:string}`) (#1382) - An array shape is now allowed to cast to another array shape, as long as the required fields are compatible with the target type, - and any optional fields from the target type are absent in the source type or compatible. -+ In issue messages, represent closures by their signatures instead of as `\closure_{hexdigits}` -+ Emit `PhanTypeArrayUnsetSuspicious` when trying to unset the offset of something that isn't an array or array-like. -+ Add limited support for analyzing `unset` on variables and the first dimension of arrays. - Unsetting variables does not yet work in conditional branches. -+ Don't emit `PhanTypeInvalidDimOffset` in `isset`/`empty`/`unset` -+ Improve Phan's analysis of loose equality (#1101) -+ Add new issue types `PhanWriteOnlyPublicProperty`, `PhanWriteOnlyProtectedProperty`, and `PhanWriteOnlyPrivateProperty`, - which will be emitted on properties that are written to but never read from. - (Requires that dead code detection be enabled) -+ Improve Phan's analysis of switch statements and fix bugs. (#1561) -+ Add `PhanTypeSuspiciousEcho` to warn about suspicious types being passed to echo/print statements. - This now warns about booleans, arrays, resources, null, non-stringable classes, combinations of those types, etc. - (`var_export` or JSON encoding usually makes more sense for a boolean/null) -+ Make Phan infer that top-level array keys for expressions such as `if (isset($x['keyName']))` exist and are non-null. (#1514) -+ Make Phan infer that top-level array keys for expressions such as `if (array_key_exists('keyName', $x))` exist. (#1514) -+ Make Phan aware of types after negated of `isset`/`array_key_exists` checks for array shapes (E.g. `if (!array_key_exists('keyName', $x)) { var_export($x['keyName']); }`) - Note: This will likely fail to warn if the variable is already a mix of generic arrays and array shapes. -+ Make Phan check that types in `@throws` annotations are valid; don't warn about classes in `@throws` being unreferenced. (#1555) - New issue types: `PhanUndeclaredTypeThrowsType`, `PhanTypeInvalidThrowsNonObject`, `PhanTypeInvalidThrowsNonThrowable`, `PhanTypeInvalidThrowsIsTrait`, `PhanTypeInvalidThrowsIsInterface` - -New types: -+ Add `Closure` and `callable` with annotated param types and return to Phan's type system(#1578, #1581). - This is not a part of the phpdoc2 standard or any other standard. - These can be used in any phpdoc tags that Phan is aware of, - to indicate their expected types (`@param`, `@var`, `@return`, etc.) - - Examples: - - - `function(int $x) : ?int {return $x;}` has the type `Closure(int):?int`, - which can cast to `callable(int):?int` - - `function(array &$x) {$x[] = 2;}` has the type `Closure(array&):void` - - `function(int $i = 2, int ...$args) : void {}` - has the type `Closure(int=,int...):void` - - Note: Complex return types such as `int[]` or `int|false` - **must** be surrounded by brackets to avoid potential ambiguities. - - - e.g. `Closure(int|array): (int[])` - - e.g. `Closure(): (int|false)` - - e.g. `Closure(): (array{key:string})` is not ambiguous, - but the return type must be surrounded by brackets for now - - Other notes: - - For now, the inner parameter list of `Closure(...)` - cannot contain the characters `(` or `)` - (or `,`, except to separate the arguments) - Future changes are planned to allow those characters. - - Phan treats `Closure(T)` as an alias of `Closure(T):void` - - Placeholder variable names can be part of these types, - similarly to `@method` (`Closure($unknown,int $count=0):T` - is equivalent to `Closure(mixed,int):T` - -Maintenance -+ Add `--disable-usage-on-error` option to `phan_client` (#1540) -+ Print directory which phan daemon is going to await analysis requests for (#1544) -+ Upgrade the dependency `Microsoft/tolerant-php-parser` to 0.0.10 (includes minor bug fixes) - -Bug Fixes -+ Allow phpdoc `@param` array shapes to contain union types (#1382) -+ Remove leading `./` from Phan's relative paths for files (#1548, #1538) -+ Reduce false positives in dead code detection for constants/properties/methods. -+ Don't warn when base classes access protected properties of their subclasses. - -02 Mar 2018, Phan 0.12.2 ------------------------- - -New Features(Analysis) - -+ Emit `PhanTypeInvalidDimOffsetArrayDestructuring` when an unknown offset value is used in an array destructuring assignment (#1534, #1477) - (E.g. `foreach ($expr as ['key' => $value])`, `list($k) = [2]`, etc.) - -Plugins -+ Add a new plugin capability `PostAnalyzeNodeCapability` (preferred) and `LegacyPostAnalyzeNodeCapability`. - These capabilities give plugins for post-order analysis access to a list of parent nodes, - instead of just the last parent node. - Plugin authors should use these instead of `AnalyzeNodeCapability` and `LegacyAnalyzeNodeCapability`. - - (`parent_node_list` is set as an instance property on the visitor returned by PostAnalyzeNodeCapability - if the instance property was declared) - -Maintenance: -+ Speed up analysis when quick mode isn't used. - -Bug Fixes -+ Reduce false positives in `PhanTypeInvalidDimOffset` -+ Don't warn when adding new keys to an array when assigning multiple dimensions at once (#1518) -+ Reduce false positives when a property's type gets inferred as an array shape(#1520) -+ Reduce false positives when adding fields to an array in the global scope. -+ Reduce false positives by converting array shapes to generic arrays before recursively analyzing method/function invocations (#1525) - -28 Feb 2018, Phan 0.12.1 ------------------------- - -New Features(Analysis) -+ Emit `PhanTypeInvalidDimOffset` when an unknown offset is fetched from an array shape type. (#1478) - -Bug Fixes -+ Fix an "Undefined variable" error when checking for php 7.1/7.0 incompatibilities in return types. (#1511) - Fix other crashes. - -25 Feb 2018, Phan 0.12.0 ------------------------- - -The Phan 0.12.0 release supports analysis of php 7.0-7.2, and can be executed with php 7.0+. -This release replaces the previous releases (The 0.11 releases for php 7.2, the 0.10 releases for php 7.1, and the 0.8 releases for php 7.0) -Because Phan uses Reflection, it's recommended to use the same PHP minor version for analyzing the code as would be used to run the code. -(For the small number of function/method signatures, etc., that were added or changed in each minor release of PHP.) - -After upgrading Phan, projects using phan should add a `target_php_version` setting to their `.phan/config.php`. - -New Features(CLI, Configs) -+ Add a `target_php_version` config setting, which can be set to `'7.0'`, `'7.1'`, `'7.2'`, or `null`/`'native'`. (#1174) - This defaults to the same PHP minor version as the PHP binary used to run Phan. - `target_php_version` can be overridden via the CLI option `--target-php-version {7.0,7.1,7.2,native}` - - NOTE: This setting does not let a PHP 7.0 installation parse PHP 7.1 nullable syntax or PHP 7.1 array destructuring syntax. - - If you are unable to upgrade the PHP version used for analysis to php 7.1, the polyfill parser settings may help - (See `--force-polyfill-parser` or `--use-fallback-parser`. Those have a few known bugs in edge cases.) -+ Add `--init` CLI flag and CLI options to affect the generated config. (#145) - (Options: `--init-level=1..5`, `--init-analyze-dir=path/to/src`, `--init-analyze-file=path/to/file.php`, `--init-no-composer`, `--init-overwrite`) - -New Features(Analysis) -+ In doc comments, support `@phan-var`, `@phan-param`, `@phan-return`, `@phan-property`, and `@phan-method`. (#1470) - These annotations will take precedence over `@var`, `@param`, `@return`, `@property`, and `@method`. -+ Support `@phan-suppress` as an alias of `@suppress`. -+ Add a non-standard way to explicitly set var types inline. (#890) - `; '@phan-var T $varName'; expression_using($varName);` and - `; '@phan-var-force T $varName'; expression_using($varName);` - - If Phan sees a string literal containing `@phan-var` as a top-level statement of a statement list, it will immediately set the type of `$varName` to `T` without any type checks. - (`@phan-var-force T $x` will do the same thing, and will create the variable if it didn't already exist). - - Note: Due to limitations of the `php-ast` parser, Phan isn't able to use inline doc comments, so this is the solution that was used instead. - - Example Usage: - - ```php - $values = mixed_expression(); - - // Note: This annotation must go **after** setting the variable. - // This has to be a string literal; phan cannot parse inline doc comments. - '@phan-var array<int,MyClass> $values'; - - foreach ($x as $instance) { - function_expecting_myclass($x); - } - ``` -+ Add a way to suppress issues for the entire file (including within methods, etc.) (#1190) - The `@phan-file-suppress` annotation can also be added to phpdoc for classes, etc. - This feature is recommended for use at the top of the file or on the first class in the file. - It may or may not affect statements above the suppression. - This feature may fail to catch certain issues emitted during the parse phase. - - ```php - <?php - // Add a suppression for remaining statements in this file. - '@phan-file-suppress PhanUnreferencedUseNormal (description)'; - use MyNS\MyClass; - // ... - - /** @SomeUnreadableAnnotation {MyClass} */ - class Example { } - ``` - -+ Add `CompatibleNullableTypePHP70`, `CompatibleShortArrayAssignPHP70`, `CompatibleKeyedArrayAssignPHP70`, - `CompatibleKeyedArrayAssignPHP70`, and `CompatibleIterableTypePHP70`, (#1174, #624, #449) - which are emitted when the `target_php_version` is less than '7.1'. -+ Add `CompatibleObjectTypePHP71`, which is emitted for the `object` typehint when the `target_php_version` - is less than 7.2. (#1174, #827) -+ Add `PhanTypeMismatchDimFetchNullable`, which is emitted if the non-null - version of the dimension type would be a valid index. (#1472) -+ Emit `PhanTypeArraySuspiciousNullable` when accessing fields of a nullable array (now including `?(T[])`, etc.). (#1472) - (Stop emitting PhanTypeArraySuspicious for `?array`) -+ Add `PhanNoopBinaryOperator` and `PhanNoopUnaryOperator` checks (#1404) -+ Add `PhanCommentParamOutOfOrder` code style check. (#1401) - This checks that `@param` annotations appear in the same order as the real parameters. -+ Detect unused imports (Does not parse inline doc comments) (#1095) - Added `PhanUnreferencedUseNormal`, `PhanUnreferencedUseFunction`, `PhanUnreferencedUseConstant`. - - (Note that Phan does not parse inline doc comments, which may cause false positives for `PhanUnreferencedUseNormal`) -+ Add `PhanTypeMismatchArrayDestructuringKey` checks for invalid array key types in list assignments (E.g. `list($x) = ['key' => 'value']` (#1383) - -Language Server -+ Support running Language Server and daemon mode on Windows (#819) - (the `pcntl` dependency is no longer mandatory for running Phan as a server) - The `--language-server-allow-missing-pcntl` option must be set by the client. - - When this fallback is used, Phan **manually** saves and restores the - data structures that store information about the project being analyzed. - - This fallback is new and experimental. -+ Make Phan Language Server analyze new files added to a project (Issue #920) -+ Analyze all of the PHP files that are currently opened in the IDE - according to the language server client, - instead of just the most recently edited file (Issue #1147) - (E.g. analyze other files open in tabs or split windows) -+ When closing or deleting a file, clear the issues that were emitted - for that file. -+ If analysis requests (opening files, editing files, etc) - are arriving faster than Phan can analyze and generate responses, - then buffer the file changes (until end of input) - and then begin to generate analysis results. - - Hopefully, this should reduce the necessity for limiting Phan to - analyzing only on save. - -Bug fixes -+ In files with multiple namespaces, don't use `use` statements from earlier namespaces. (#1096) -+ Fix bugs analyzing code using functions/constants provided by group use statements, in addition to `use function` and `use const` statements. - -14 Feb 2018, Phan 0.11.3 ------------------------- - -### Ported from Phan 0.10.5 - -New Features(CLI, Configs) -+ Add `--allow-polyfill-parser` and `--force-polyfill-parser` options. - These allow Phan to be run without installing `php-ast`. - - Using the native `php-ast` extension is still recommended. - The polyfill is slower and has several known bugs. - - Additionally, the way doc comments are parsed by the polyfill is different. - Doc comments for elements such as closures may be parsed differently from `php-ast` - -Maintenance: -+ Fix bugs in the `--use-fallback-parser` mode. - Upgrade the `tolerant-php-parser` dependency (contains bug fixes and performance improvements) - -Bug fixes -+ Fix a bug in `tool/make_stubs` when generating stubs of namespaced global functions. -+ Fix a refactoring bug that caused methods and properties to fail to be inherited (#1456) -+ If `ignore_undeclared_variables_in_global_scope` is true, then analyze `assert()` - and conditionals in the global scope as if the variable was defined after the check. - -11 Feb 2018, Phan 0.11.2 ------------------------- - -### Ported from Phan 0.10.4 - -New Features(Analysis) - -+ Support array key types of `int`, `string`, and `mixed` (i.e. `int|string`) in union types such as `array<int,T>` (#824) - - Check that the array key types match when assigning expected param types, return types, property types, etc. - By default, an array with a key type of `int` can't cast to an array key type of `string`, or vice versa. - Mixed union types in keys can cast to/from any key type. - - - To allow casting `array<int,T>` to `array<string,T>`, enable `scalar_array_key_cast` in your `.phan/config.php`. - -+ Warn when using the wrong type of array keys offsets to fetch from an array (E.g. `string` key for `array<int,T>`) (Issue #1390) -+ Infer array key types of `int`, `string`, or `int|string` in `foreach` over arrays. (#1300) - (Phan's type system doesn't support inferring key types for `iterable` or `Traversable` right now) -+ Support **parsing** PHPDoc array shapes - (E.g. a function expecting `['field' => 'a string']` can document this as `@param array{field:string}` $options) - For now, this is converted to generic arrays (Equivalent to `string[]`). - - `[[0, ...], new stdClass]` would have type `array{0:int[], 1:string}` - - - The field value types can be any union type. - - Field keys are currently limited to keys matching the regex `[-_.a-zA-Z0-9\x7f-\xff]+`. (Identifiers, numbers, '-', and '.') - Escape mechanisms such as backslashes (e.g. "\x20" for " ") may be supported in the future. -+ Add `PhanTypeMismatchUnpackKey` and `PhanTypeMismatchUnpackValue` to analyze array unpacking operator (also known as splat) (#1384) - - Emit `PhanTypeMismatchUnpackKey` when passing iterables/arrays with invalid keys to the unpacking operator (i.e. `...`). - - Emit `PhanTypeMismatchUnpackValue` when passing values that aren't iterables or arrays to the unpacking operator. - (See https://secure.php.net/manual/en/migration56.new-features.php#migration56.new-features.splat) -+ When determining the union type of an array literal, - base it on the union types of **all** of the values (and all of the keys) instead of just the first 5 array elements. -+ When determining the union type of the possible value types of an array literal, - combine the generic types into a union type instead of simplifying the types to `array`. - In practical terms, this means that `[1,2,'a']` is seen as `array<int,int|string>`, - which Phan represents as `array<int,int>|array<int,string>`. - - In the previous Phan release, the union type of `[1,2,'a']` would be represented as `int[]|string[]`, - which is equivalent to `array<mixed,int>|array<mixed,string>` - - Another example: `[$strKey => new MyClass(), $strKey2 => $unknown]` will be represented as - `array<string,MyClass>|array<string,mixed>`. - (If Phan can't infer the union type of a key or value, `mixed` gets added to that key or value.) -+ Improve analysis of try/catch/finally blocks (#1408) - Analyze `catch` blocks with the inferences about the `try` block. - Analyze a `finally` block with the combined inferences from the `try` and `catch` blocks. -+ Account for side effects of `&&` and `||` operators in expressions, outside of `if`/`assert` statements. (#1415) - E.g. `$isValid = ($x instanceof MyClass && $x->isValid())` will now consistently check that isValid() exists on MyClass. -+ Improve analysis of expressions within conditionals, such as `if (!($x instanceof MyClass) || $x->method())` - or `if (!(cond($x) && othercond($x)))` - - (Phan is now aware of the types of the right-hand side of `||` and `&&` in more cases) -+ Add many param and return type signatures for internal functions and methods, - for params and return types that were previously untyped. - (Imported from docs.php.net's SVN repo) -+ More precise analysis of the return types of `var_export()`, `print_r()`, and `json_decode()` (#1326, #1327) -+ Improve type narrowing from `iterable` to `\Traversable`/`array` (#1427) - This change affects `is_array()`/`is_object()` checks and their negations. -+ Fix more edge cases which would cause Phan to fail to infer that properties, constants, or methods are inherited. (PR #1440 for issues #311, #1426, #454) - -Plugins -+ Fix bugs in `NonBoolBranchPlugin` and `NonBoolInLogicalArithPlugin` (#1413, #1410) -+ **Make UnionType instances immutable.** - This will affect plugins that used addType/addUnionType/removeType. withType/withUnionType/withoutType should be used instead. - To modify the type of elements(properties, method return types, parameters, variables, etc), - plugin authors should use `Element->setUnionType(plugin_modifier_function(Element->getUnionType()))`. - -Language server: -+ Add a CLI option `--language-server-analyze-only-on-save` to prevent the client from sending change notifications. (#1325) - (Only notify the language server when the user saves a document) - This significantly reduces CPU usage, but clients won't get notifications about issues immediately. - -Bug fixes -+ Warn when attempting to call an instance method on an expression with type string (#1314). -+ Fix a bug in `tool/make_stubs` when generating stubs of global functions. -+ Fix some bugs that occurred when Phan resolved inherited class constants in class elements such as properties. (#537 and #454) -+ Emit an issue when a function/method's parameter defaults refer to an undeclared class constant/global constant. - -20 Jan 2018, Phan 0.11.1 ------------------------- - -### Ported from Phan 0.10.3 - -New Features(CLI, Configs) - -+ For `--fallback-parser`: Switch to [tolerant-php-parser](https://github.com/Microsoft/tolerant-php-parser) - as a dependency of the fallback implementation. (#1125) - This does a better job of generating PHP AST trees when attempting to parse code with a broader range of syntax errors. - Keep `PHP-Parser` as a dependency for now for parsing strings. - -Maintenance -+ Various performance optimizations, including caching of inferred union types to avoid unnecessary recalculation. -+ Make `phan_client` and the vim snippet in `plugins/vim/phansnippet.vim` more compatible with neovim -+ Upgrade felixfbecker/advanced-json-rpc dependency to ^3.0.0 (#1354) -+ Performance improvements. - Changed the internal representation of union types to no longer require `spl_object_id` or the polyfill. - -Bug Fixes -+ Allow `null` to be passed in where a union type of `mixed` was expected. -+ Don't warn when passing `?T` (PHPDoc or real) where the PHPDoc type was `T|null`. (#609, #1090, #1192, #1337) - This is useful for expressions used for property assignments, return statements, function calls, etc. -+ Fix a few of Phan's signatures for internal functions and methods. - -17 Nov 2017, Phan 0.11.0 ------------------------- - -New Features (Analysis of PHP 7.2) -+ Support analyzing the `object` type hint in real function/method signatures. (#995) -+ Allow widening an overriding method's param types in php 7.2 branch (#1256) - Phan continues warning about `ParamSignatureRealMismatchHasNoParamType` by default, in case a project needs to work with older php releases. - Add `'allow_method_param_type_widening' => true` if you wish for Phan to stop emitting that issue category. -+ Miscellaneous function signature changes for analysis of PHP 7.2 codebases (#828) - -### Ported from Phan 0.10.2 - -New Features(Analysis) -+ Enable `simplify_ast` by default. - The new default value should reduce false positives when analyzing conditions of if statements. (#407, #1066) -+ Support less ambiguous `?(T[])` and `(?T)[]` in phpdoc (#1213) - Note that `(S|T)[]` is **not** supported yet. -+ Support alternate syntax `array<T>` and `array<Key, T>` in phpdoc (PR #1213) - Note that Phan ignores the provided value of `Key` completely right now (i.e. same as `T[]`); Key types will be supported in Phan 0.10.3. -+ Speed up Phan analysis on small projects, reduce memory usage (Around 0.15 seconds and 15MB) - This was done by deferring loading the information about internal classes and functions until that information was needed for analysis. -+ Analyze existence and usage of callables passed to (internal and user-defined) function&methods expecting callable. (#1194) - Analysis will now warn if the referenced function/method of a callable array/string - (passed to a function/method expecting a callable param) does not exist. - - This change also reduces false positives in dead code detection (Passing in these callable arrays/strings counts as a reference now) -+ Warn if attempting to read/write to a property or constant when the expression is a non-object. (or not a class name, for static elements) (#1268) -+ Split `PhanUnreferencedClosure` out of `PhanUnreferencedFunction`. (Emitted by `--dead-code-detection`) -+ Split `PhanUnreferencedMethod` into `PhanUnreferencedPublicMethod`, `PhanUnreferencedProtectedMethod`, and `PhanUnreferencedPrivateMethod`. -+ Split errors for class constants out of `PhanUnreferencedConst`: - Add `PhanUnreferencedPublicClassConst`, `PhanUnreferencedProtectedClassConst`, and `PhanUnreferencedPrivateClassConst`. - `PhanUnreferencedConst` is now exclusively used for global constants. -+ Analyze uses of `compact()` for undefined variables (#1089) -+ Add `PhanParamSuspiciousOrder` to warn about mixing up variable and constant/literal arguments in calls to built in string/regex functions - (`explode`, `strpos`, `mb_strpos`, `preg_match`, etc.) -+ Preserve the closure's function signature in the inferred return value of `Closure::bind()`. (#869) -+ Support indicating that a reference parameter's input value is unused by writing `@phan-output-reference` on the same line as an `@param` annotation. - This indicates that Phan should not warn about the passed in type, and should not preserve the passed in type after the call to the function/method. - (In other words, Phan will analyze a user-defined reference parameter the same way as it would `$matches` in `preg_match($pattern, $string, $matches)`) - Example usage: `/** @param string $x @phan-output-reference */ function set_x(&$x) { $x = 'result'; }` -+ Make phan infer unreachability from fatal errors such as `trigger_error($message, E_USER_ERROR);` (#1224) -+ Add new issue types for places where an object would be expected: - `PhanTypeExpectedObjectPropAccess`, `PhanTypeExpectedObjectPropAccessButGotNull`, `PhanTypeExpectedObjectStaticPropAccess`, - `PhanTypeExpectedObject`, and `PhanTypeExpectedObjectOrClassName -+ Emit more accurate line numbers for phpdoc comments, when warning about phpdoc in doc comments being invalid. (#1294) - This gives up and uses the element's line number if the phpdoc ends over 10 lines before the start of the element. -+ Work on allowing union types to be part of template types in doc comments, - as well as types with template syntax. - (e.g. `array<int|string>` is now equivalent to `int[]|string[]`, - and `MyClass<T1|T2,T3|T4>` can now be parsed in doc comments) -+ Disambiguate the nullable parameter in output. - E.g. an array of nullable integers will now be printed in error messages as `(?int)[]` - A nullable array of integers will continue to be printed in error messages as `?int[]`, and can be specified in PHPDoc as `?(int[])`. - -New Features (CLI, Configs) -+ Improve default update rate of `--progress-bar` (Update it every 0.10 seconds) - -Bug Fixes -+ Fixes bugs in `PrintfCheckerPlugin`: Alignment goes before width, and objects with __toString() can cast to %s. (#1225) -+ Reduce false positives in analysis of gotos, blocks containing gotos anywhere may do something other than return or throw. (#1222) -+ Fix a crash when a magic method with a return type has the same name as a real method. -+ Allow methods to have weaker PHPdoc types than the overridden method in `PhanParamSignatureMismatch`. (#1253) - `PhanParamSignatureRealMismatch*` is unaffected, and will continue working the same way in Phan releases analyzing PHP < 7.2. -+ Stop warning about `PhanParamSignatureMismatch`, etc. for private methods. The private methods don't affect each other. (#1250) -+ Properly parse `?self` as a *nullable* instance of the current class in union types (#1264) -+ Stop erroneously warning about inherited constants being unused in subclasses for dead code detection (#1260) -+ For dead code detection, properly track uses of inherited class elements (methods, properties, classes) as uses of the original definition. (#1108) - Fix the way that uses of private/protected methods from traits were tracked. - Also, start warning about a subset of issues from interfaces and abstract classes (e.g. unused interface constants) -+ Properly handle `static::class` as a class name in an array callable, or `static::method_name` in a string callable (#1232) -+ Make `@template` tag for [Generic Types](https://github.com/phan/phan/wiki/Generic-Types) case-sensitive. (#1243) -+ Fix a bug causing Phan to infer an empty union type (which can cast to any type) for arrays with elements of empty union types. (#1296) - -Plugins -+ Make DuplicateArrayKeyPlugin start warning about duplicate values of known global constants and class constants. (#1139) -+ Make DuplicateArrayKeyPlugin start warning about case statements with duplicate values (This resolves constant values the same way as array key checks) -+ Support `'plugins' => ['AlwaysReturnPlugin']` as shorthand for full relative path to a bundled plugin such as AlwaysReturnPlugin.php (#1209) - -Maintenance -+ Performance improvements: Phan analysis is 13%-22% faster than 0.10.1, with `simplify_ast` enabled. -+ Used PHP_CodeSniffer to automatically make Phan's source directory adhere closely to PSR-1 and PSR-2, making minor changes to many files. - (e.g. which line each brace goes on, etc.) -+ Stop tracking references to internal (non user-defined) elements (constants, properties, functions, classes, and methods) during dead code detection. - (Dead code detection now requires an extra 15MB instead of 17MB for self-analysis) - -20 Oct 2017, Phan 0.10.1 ------------------------- - -New Features(Analysis) -+ Support `@return $this` in phpdoc for methods and magic methods. - (but not elsewhere. E.g. `@param $this $varName` is not supported, use `@param static $varName`) (#634) -+ Check if functions/methods passed to `array_map` and `array_filter` are compatible with their arguments. - Recursively analyze the functions/methods passed to `array_map`/`array_filter` if no types were provided. (unless quick mode is being used) - -New Features (CLI, Configs) - -+ Add Language Server Protocol support (Experimental) (#821) - Compatibility: Unix, Linux (depends on php `pcntl` extension). - This has the same analysis capabilities provided by [daemon mode](https://github.com/phan/phan/wiki/Using-Phan-Daemon-Mode#using-phan_client-from-an-editor). - Supporting a standard protocol should make it easier to write extensions supporting Phan in various IDEs. - See https://github.com/Microsoft/language-server-protocol/blob/master/README.md -+ Add config (`autoload_internal_extension_signatures`) to allow users to specify PHP extensions (modules) used by the analyzed project, - along with stubs for Phan to use (instead of ReflectionFunction, etc) if the PHP binary used to run Phan doesn't have those extensions enabled. (#627) - Add a script (`tool/make_stubs`) to output the contents of stubs to use for `autoload_internal_extension_signatures` (#627). -+ By default, automatically restart Phan without xdebug if xdebug is enabled. (#1161) - If you wish to analyze a project using XDebug's functions, set `autoload_internal_extension_signatures` - (e.g. `['xdebug' => 'vendor/phan/phan/.phan/internal_stubs/xdebug.phan_php']`) - If you wish to use xdebug to debug Phan's analysis itself, set and export the environment variable `PHAN_ALLOW_XDEBUG=1`. -+ Improve analysis of return types of `array_pop`, `array_shift`, `current`, `end`, `next`, `prev`, `reset`, `array_map`, `array_filter`, etc. - See `ArrayReturnTypeOverridePlugin.php.` - Phan can analyze callables (for `array_map`/`array_filter`) of `Closure` form, as well as strings/2-part arrays that are inlined. -+ Add `--memory-limit` CLI option (e.g. `--memory-limit 500M`). If this option isn't provided, there is no memory limit. (#1148) - -Maintenance -+ Document the `--disable-plugins` CLI flag. - -Plugins -+ Add a new plugin capability `ReturnTypeOverrideCapability` which can override the return type of functions and methods on a case by case basis. - (e.g. based on one or more of the argument types or values) (related to #612, #1181) -+ Add a new plugin capability `AnalyzeFunctionCallCapability` which can add logic to analyze calls to a small subset of functions. - (e.g. based on one or more of the argument types or values) (#1181) -+ Make line numbers more accurate in `DuplicateArrayKeyPlugin`. -+ Add `PregRegexCheckerPlugin` to check for invalid regexes. (uses `AnalyzeFunctionCallCapability`). - This plugin is able to resolve literals, global constants, and class constants as regexes. - See [the corresponding section of .phan/plugins/README.md](.phan/plugins/README.md#pregregexcheckerpluginphp) -+ Add `PrintfCheckerPlugin` to check for invalid format strings or incorrect arguments in printf calls. (uses `AnalyzeFunctionCallCapability`) - This plugin is able to resolve literals, global constants, and class constants as format strings. - See [the corresponding section of .phan/plugins/README.md](.phan/plugins/README.md#printfcheckerpluginphp) - -Bug Fixes -+ Properly check for undeclared classes in arrays within phpdoc `@param`, `@property`, `@method`, `@var`, and `@return` (etc.) types. - Also, fix a bug in resolving namespaces of generic arrays that are nested 2 or more array levels deep. -+ Fix uncaught TypeError when magic property has the same name as a property. (#1141) -+ Make AlwaysReturnPlugin warn about functions/methods with real nullable return types failing to return a value. -+ Change the behavior of the `-d` flag, make it change the current working directory to the provided directory. -+ Properly set the real param type and return types of internal functions, in rare cases where that exists. -+ Support analyzing the rare case of namespaced internal global functions (e.g. `\ast\parse_code($code, $version)`) -+ Improve analysis of shorthand ternary operator: Remove false/null from cond_expr in `(cond_expr) ?: (false_expr)` (#1186) - -24 Sep 2017, Phan 0.10.0 ------------------------- - -New Features(Analysis) -+ Check types of dimensions when using array access syntax (#406, #1093) - (E.g. for an `array`, check that the array dimension can cast to `int|string`) - -New Features (CLI, Configs) -+ Add option `ignore_undeclared_functions_with_known_signatures` which can be set to `false` - to always warn about global functions Phan has signatures for - but are unavailable in the current PHP process (and enabled extensions, and the project being analyzed) (#1080) - The default was/is to not warn, to reduce false positives. -+ Add CLI flag `--use-fallback-parser` (Experimental). If this flags is provided, then when Phan analyzes a syntactically invalid file, - it will try again with a parser which tolerates a few types of errors, and analyze the statements that could be parsed. - Useful in combination with daemon mode. -+ Add `phpdoc_type_mapping` config setting. - Projects can override this to make Phan ignore or substitute non-standard phpdoc2 types and common typos (#294) - (E.g. `'phpdoc_type_mapping' => ['the' => '', 'unknown_type' => '', 'number' => 'int|float']`) - -Maintenance -+ Increased minimum `ext-ast` version constraint to 0.1.5, switched to AST version 50. -+ Update links to project from github.com/etsy/phan to github.com/phan/phan. -+ Use the native `spl_object_id` function if it is available for the union type implementation. - This will make phan 10% faster in PHP 7.2. - (for PHP 7.1, https://github.com/runkit7/runkit_object_id 1.1.0+ also provides a native implementation of `spl_object_id`) -+ Reduce memory usage by around 5% by tracking only the file and lines associated with variables, instead of a full Context object. - - -Plugins -+ Increased minimum `ext-ast` version constraint to 0.1.5, switched to AST version 50. - Third party plugins will need to create a different version, Decls were changed into regular Nodes -+ Implement `AnalyzePropertyCapability` and `FinalizeProcessCapability`. - Make `UnusedSuppressionPlugin` start using `AnalyzePropertyCapability` and `FinalizeProcessCapability`. - Fix bug where `UnusedSuppressionPlugin` could run before the suppressed issues would be emitted, - making it falsely emit that suppressions were unused. - -Bug Fixes -+ Fix a few incorrect property names for Phan's signatures of internal classes (#1085) -+ Fix bugs in lookup of relative and non-fully qualified class and function names (#1097) -+ Fix a bug affecting analysis of code when `simplify_ast` is true. -+ Fix uncaught NodeException when analyzing complex variables as references (#1116), - e.g. `function_expecting_reference($$x)`. - -15 Aug 2017, Phan 0.9.4 ------------------------ - -New Features (Analysis) -+ Check (the first 5) elements of returned arrays against the declared return union types, individually (Issue #935) - (E.g. `/** @return int[] */ function foo() {return [2, "x"]; }` will now warn with `PhanTypeMismatchReturn` about returning `string[]`) -+ Check both sides of ternary conditionals against the declared return union types - (E.g. `function foo($x) : int {return is_string($x) ? $x : 0; }` will now warn with `PhanTypeMismatchReturn` - about returning a string). -+ Improved analysis of negations of conditions within ternary conditional operators and else/else if statements. (Issue #538) - Support analysis of negation of the `||` operator. (E.g. `if (!(is_string($x) || is_int($x))) {...}`) -+ Make phan aware of blocks of code which will unconditionally throw or return. (Issue #308, #817, #996, #956) - - Don't infer variable types from blocks of code which unconditionally throw or return. - - Infer the negation of type assertions from if statements that unconditionally throw/return/break/continue. - (E.g. `if (!is_string($x)) { return false; } functionUsingX($x);`) - - When checking if a variable is defined by all branches of an if statement, ignore branches which unconditionally throw/return/break/continue. -+ To reduce the false positives from analysis of the negation of type assertions, - normalize nullable/boolean union types after analyzing code branches (E.g. if/else) affecting the types of those variables. - (e.g. convert "bool|false|null" to "?bool") -+ Add a new plugin file `AlwaysReturnPlugin`. (Issue #996) - This will add a stricter check that a function with a non-null return type *unconditionally* returns a value (or explicitly throws, or exit()s). - Currently, Phan just checks if a function *may* return, or unconditionally throws. -+ Add a new plugin file `UnreachableCodePlugin` (in development). - This will warn about statements that appear to be unreachable - (statements occurring after unconditional return/break/throw/return/exit statements) - -New Features (CLI, Configs) -+ Add config setting `prefer_narrowed_phpdoc_return_type` (See "New Features (CLI, Configs)), - which will use only the phpdoc return types for inferences, if they're narrowed. - This config is enabled by default, and requires `check_docblock_signature_return_type_match` to be enabled. - -Bug Fixes -+ Work around notice about COMPILER_HALT_OFFSET on windows. -+ Fixes #462 : Fix type inferences for instanceof for checks with dynamic class names are provided. - Valid class names are either a string or an instance of the class to check against. - Warn if the class name is definitely invalid. -+ Fix false positives about undefined variables in isset()/empty() (Issue #1039) - (Fixes bug introduced in Phan 0.9.3) -+ Fix false positive warnings about accessing protected methods from traits (Issue #1033) - Act as though the class which used a trait is the place where the method was defined, - so that method visibility checks work properly. - Additionally, fix false positive warnings about visibility of method aliases from traits. -+ Warn about instantiation of class with inaccessible constructor (Issue #1043) -+ Fix rare uncaught exceptions (Various) -+ Make issues and plugin issues on properties consistently use suppressions from the plugin doc comment. - -Changes In Emitted Issues -+ Improve `InvalidVariableIssetPlugin`. Change the names and messages for issue types. - Emit `PhanPluginUndeclaredVariableInIsset` and `PhanPluginComplexVariableIsset` - instead of `PhanUndeclaredVariable`. - Stop erroneously warning about valid property fetches and checks of fields of superglobals. - -0.9.3 Jul 11, 2017 ------------------- - -New Features (Analysis) -+ Automatically inherit `@param` and `@return` types from parent methods. - This is controlled by the boolean config `inherit_phpdoc_types`, which is true by default. - `analyze_signature_compatibility` must also be set to true (default is true) for this step to be performed. -+ Better analysis of calls to parent::__construct(). (Issue #852) -+ Warn with `PhanAccessOwnConstructor` if directly invoking self::__construct or static::__construct in some cases (partial). -+ Start analyzing the inside of for/while loops using the loop's condition (Issue #859) - (Inferences may leak to outside of those loops. `do{} while(cond)` is not specially analyzed yet) -+ Improve analysis of types in expressions within compound conditions (Issue #847) - (E.g. `if (is_array($x) && fn_expecting_array($x)) {...}`) -+ Evaluate the third part of a for loop with the context after the inner body is evaluated (Issue #477) -+ Emit `PhanUndeclaredVariableDim` if adding an array field to an undeclared variable. (Issue #841) - Better analyze `list($var['field']) = values` -+ Improve accuracy of `PhanTypeMismatchDeclaredReturn` (Move the check to after parse phase is finished) -+ Enable `check_docblock_signature_return_type_match` and `check_docblock_signature_param_type_match` by default. - Improve performance of those checks. - Switch to checking individual types (of the union type) of the phpdoc types and emitting issues for each invalid part. -+ Create `PhanTypeMismatchDeclaredParam` (Move the check to after parse phase is finished) - Also add config setting `prefer_narrowed_phpdoc_param_type` (See "New Features (CLI, Configs)) - This config is enabled by default. - - Also create `PhanTypeMismatchDeclaredParamNullable` when params such as `function foo(string $x = null)` - are documented as the narrowed forms `@param null $x` or `@param string $x`. - Those should be changed to either `string|null` or `?string`. -+ Detect undeclared return types at point of declaration, and emit `PhanUndeclaredTypeReturnType` (Issue #835) -+ Create `PhanParamSignaturePHPDocMismatch*` issue types, for mismatches between `@method` and real signature/other `@method` tag. -+ Create `PhanAccessWrongInheritanceCategory*` issue types to warn about classes extending a trait/interface instead of class, etc. (#873) -+ Create `PhanExtendsFinalClass*` issue types to warn about classes extending from final classes. -+ Create `PhanAccessOverridesFinalMethod*` issue types to warn about methods overriding final methods. -+ Create `PhanTypeMagicVoidWithReturn` to warn if `void` methods such as `__construct`, `__set`, etc return a value that would be ignored. (Issue #913) -+ Add check for `PhanTypeMissingReturn` within closures. Properly emit `PhanTypeMissingReturn` in functions/methods containing closures. (Issue #599) -+ Improved checking for `PhanUndeclaredVariable` in array keys and conditional conditions. (Issue #912) -+ Improved warnings and inferences about internal function references for functions such as `sort`, `preg_match` (Issue #871, #958) - Phan is now aware of many internal functions which normally ignore the original values of references passed in (E.g. `preg_match`) -+ Properly when code attempts to access static/non-static properties as if they were non-static/static. (Issue #936) -+ Create `PhanCommentOverrideOnNonOverrideMethod` and `PhanCommentOverrideOnNonOverrideConstant`. (Issue #926) - These issue types will be emitted if `@override` is part of doc comment of a method or class constant which doesn't override or implement anything. - (`@Override` and `@phan-override` can also be used as aliases of `@override`. `@override` is not currently part of any phpdoc standard.) -+ Add `@phan-closure-scope`, which can be used to annotate closure definitions with the namespaced class it will be bound to (Issue #309, #590, #790) - (E.g. if the intent was that Closure->bindTo or Closure->bind would be called to bind it to `\MyNS\MyClass` (or an instance of that class), - then a closure could be declared as `/** @phan-closure-scope \MyNS\MyClass */ function() { $this->somePrivateMyClassMethod(); }` -+ Add `Closure` as a first class type, (Previously, closures were treated as `callable` in some places) (Issue #978) - -New Features (CLI, Configs) -+ Create `check_docblock_signature_param_type_match` (similar to `check_docblock_signature_return_type_match`) config setting - to enable warning if phpdoc types are incompatible with the real types. True(enabled) by default. - - Create `prefer_narrowed_phpdoc_param_type` config setting (True by default, requires `check_docblock_signature_return_type_match` to be enabled). - When it is true, Phan will analyze each function using the phpdoc param types instead of the provided signature types - if the possible phpdoc types are narrower and compatible with the signature. - (E.g. indicate that subclasses are expected over base classes, indicate that non-nullable is expected instead of nullable) - This affects analysis both inside and outside the method. - - Aside: Phan currently defaults to preferring phpdoc type over real return type, and emits `PhanTypeMismatchDeclaredReturn` if the two are incompatible. -+ Create `enable_class_alias_support` config setting (disabled by default), which enables analyzing basic usage of class_alias. (Issue #586) - Set it to true to enable it. - NOTE: this is still experimental. -+ Warn to stderr about running Phan analysis with XDebug (Issue #116) - The warning can be disabled by the Phan config setting `skip_slow_php_options_warning` to true. -+ Add a config setting 'scalar_implicit_partial' to allow moving away from 'scalar_implicit_cast' (Issue #541) - This allows users to list out (and gradually remove) permitted scalar type casts. -+ Add `null_casts_as_array` and `array_casts_as_null` settings, which can be used while migrating away from `null_casts_as_any_type`. - These will be checked if one of the types has a union type of `null`, as well as when checking if a nullable array can cast to a regular array. - -Plugins - -+ Redesign plugin system to be more efficient. (Issue #600) - New plugins should extend `\Phan\PluginV2` and implement the interfaces for capabilities they need to have, - such as `\Phan\PluginV2\AnalyzeClassCapability`. - In the new plugin system, plugins will only be run when they need to (Phan no longer needs to invoke an empty method body). - Old subclasses of `\Phan\Plugin\PluginImplementation` will continue to work, but will be less efficient. - -Maintenance -+ Reduce memory usage by around 15% by using a more efficient representation of union types (PR #729). - The optional extension https://github.com/runkit7/runkit_object_id can be installed to boost performance by around 10%. -+ Check method signatures compatibility against all overridden methods (e.g. interfaces with the same methods), not just the first ones (Issue #925) - -Bug Fixes -+ Work around known bugs in current releases of two PECL extensions (Issue #888, #889) -+ Fix typo - Change `PhanParamSignatureRealMismatch` to `PhanParamSignatureRealMismatchReturnType` -+ Consistently exit with non-zero exit code if there are multiple processes, and any process failed to return valid results. (Issue #868) -+ Fixes #986 : PhanUndeclaredVariable used to fail to be emitted in some deeply nested expressions, such as `return $undefVar . 'suffix';` -+ Make Phan infer the return types of closures, both for closures invoked inline and closures declared then invoked later (Issue #564) -+ Phan now correctly analyze global functions for mismatches of phpdoc types and real parameter types. - Previously, it wouldn't emit warnings for global functions, only for methods. -+ Don't add `mixed` to inferred union types of properties which already have non-empty phpdoc types. (Issue #512) - mixed would just result in Phan failing to emit any types of issues. -+ When `simplify_ast` is true, simplify the ASTs parsed in the parse mode as well. - Makes analysis consistent when `quick_mode` is false (AST nodes from the parse phase would also be used in the analysis phase) -+ Don't emit PhanTypeNonVarPassByRef on arguments that are function/method calls returning references. (Issue #236) -+ Emit PhanContextNotObject more reliably when not in class scope. - -Backwards Incompatible Changes -+ Fix categories of some issue types, renumber error ids for the pylint error formatter to be unique and consistent. - -0.9.2 Jun 13, 2017 ------------------- - -New Features (Analysis) -+ Add `PhanParamSignatureRealMismatch*` (e.g. `ParamSignatureRealMismatchTooManyRequiredParameters`), - which ignores phpdoc types and imitates PHP's inheritance warning/error checks as closely as possible. (Issue #374) - This has a much lower rate of false positives than `PhanParamSignatureMismatch`, which is based on Liskov Substitution Principle and also accounts for phpdoc types. - (`PhanParamSignatureMismatch` continues to exist) -+ Create `PhanUndeclaredStaticProperty` (Issue #610) - This is of higher severity than PhanUndeclaredProperty, because PHP 7 throws an Error. - Also add `PhanAccessPropertyStaticAsNonStatic` -+ Supports magic instance/static `@method` annotations. (Issue #467) - This is enabled by default. -+ Change the behavior of non-quick recursion (Affects emitted issues in large projects). - Improve performance of non-quick analysis by checking for redundant analysis steps - (E.g. calls from two different places passing the same union types for each parameter), - continuing to recurse when passing by reference. -+ Support for checking for misuses of "@internal" annotations. Phan assumes this means it is internal to a namespace. (Issue #353) - This checks properties, methods, class constants, and classes. - (Adds `PhanAccessConstantInternal`, `PhanAccessClassInternal`, `PhanAccessClassConstantInternal`, `PhanAccessPropertyInternal`, `PhanAccessMethodInternal`) - (The implementation may change) -+ Make conditionals such as `is_string` start applying to the condition in ternary operators (`$a ? $b : $c`) -+ Treat `resource`, `object`, and `mixed` as native types only when they occur in phpdoc. - Outside of phpdoc (e.g. `$x instanceof resource`), analyze those names as if they were class names. -+ Emit low severity issues if Phan can't extract types from phpdoc, - the phpdoc `@param` is out of sync with the code, - or if the phpdoc annotation doesn't apply to an element type (Issue #778) -+ Allow inferring the type of variables from `===` conditionals such as `if ($x === true)` -+ Add issue type for non-abstract classes containing abstract methods from itself or its ancestors - (`PhanClassContainsAbstractMethod`, `PhanClassContainsAbstractMethodInternal`) -+ Partial support for handling trait adaptations (`as`/`insteadof`) when using traits (Issue #312) -+ Start checking if uses of private/protected class methods *defined in a trait* are visible outside of that class. - Before, Phan would always assume they were visible, to reduce false positives. -+ If Phan has inferred/been provided generic array types for a variable (e.g. `int[]`), - then analysis of the code within `if (is_array($x))` will act as though the type is `int[]`. - The checks `is_object` and `is_scalar` now also preserve known sub-types of the group of types. - (If Phan isn't aware of any sub-types, it will infer the generic version, e.g. `object`) -+ Start checking if unanalyzable variable accesses such as `$$x` are very likely to be invalid or typos (e.g. $x is an object or array or null) - Emit `PhanTypeSuspiciousIndirectVariable` if those are seen. (PR #809) -+ Add partial support for inferring the union types of the results of expressions such as `$x ^= 5` (e.g. in `foo($x ^= 5)`) (PR #809) -+ Thoroughly analyze the methods declared within traits, - using only the information available within the trait. (Issue #800, PR #815) - If new emitted issues are seen, users can (1) add abstract methods to traits, (2) add `@method` annotations, or (3) add `@suppress` annotations. - -New Features (CLI, Configs) -+ (Linux/Unix only) Add Experimental Phan Daemon mode (PR #563 for Issue #22), which allows phan to run in the background, and accept TCP requests to analyze single files. - (The implementation currently requires the `pcntl` extension, which does not in Windows) - Server usage: `path/to/phan --daemonize-tcp-port 4846` (In the root directory of the project being analyzed) - Client usage: `path/to/phan_client --daemonize-tcp-port 4846 -l src/file1.php [ -l src/file2.php ]` -+ Add `--color` CLI flag, with rudimentary unix terminal coloring for the plain text output formatter. (Issue #363) - Color schemes are customizable with `color_scheme`, in the config file. -+ Add the `exclude_file_regex` config to exclude file paths based on a regular expression (e.g. tests or example files mixed with the codebase) (#635) - The regular expression is run against the relative path within the project. -+ Add `--dump-parsed-file-list` option to print files which Phan would parse. -+ Add experimental `simplify_ast` config, to simplify the AST into a form which improves Phan's type inference. - (E.g. handles some variable declarations within `if ()` statements. - Infers that $x is a string for constructs such as `if (!is_string($x)) {return;} function_using_x($x);`) - This is slow, and disabled by default. -+ Add `--include-analysis-file-list` option to define files that will be included in static analysis, to the exclusion of others. -+ Start emitting `PhanDeprecatedFunctionInternal` if an internal (to PHP) function/method is deprecated. - (Phan emits `PhanUndeclaredFunction` if a function/method was removed; Functions deprecated in PHP 5.x were removed in 7.0) - -Maintenance -+ Update function signature map to analyze `iterable` and `is_iterable` from php 7.1 -+ Improve type inferences on functions with nullable default values. -+ Update miscellaneous new functions in php 7.1 standard library (e.g. `getenv`) - -Bug Fixes -- Fix PhanTypeMismatchArgument, etc. for uses of `new static()`, static::CONST, etc in a method. (Issue #632) -- Fix uncaught exception when conditional node is a scalar (Issue #613) -- Existence of __get() no longer affects analyzing static properties. (Issue #610) -- Phan can now detect the declaration of constants relative to a `use`d namespace (Issue #509) -- Phan can now detect the declaration of functions relative to a `use`d namespace (Issue #510) -- Fix a bug where the JSON output printer accidentally escaped some output ("<"), causing invalid JSON. -- Fix a bug where a print/echo/method call erroneously marked methods/functions as having a return value. (Issue #811) -- Improve analysis of SimpleXMLElement (Issues #542, #539) -- Fix crash handling trait use aliases which change only the method's visibility (Issue #861) - -Backwards Incompatible Changes -- Declarations of user-defined constants are now consistently - analyzed in a case-sensitive way. - This may affect projects using `define(name, value, case_insensitive = true)`. - Change the code being analyzed to exactly match the constant name in define()) - -0.9.1 Mar 15, 2017 ------------------- - -New Features (Analysis) -+ Conditions in `if(cond(A) && expr(A))` (e.g. `instanceof`, `is_string`, etc) now affect analysis of right-hand side of `&&` (PR #540) -+ Add `PhanDeprecatedInterface` and `PhanDeprecatedTrait`, similar to `PhanDeprecatedClass` -+ Supports magic `@property` annotations, with aliases `@property-read` and @property-write`. (Issue #386) - This is enabled by default. - - Phan also supports the `@phan-forbid-undeclared-magic-properties` annotation, - which will make it warn about undeclared properties if no real property or `@property` annotation exists. - -New Features (CLI, Configs) -+ Add `--version` CLI flag -+ Move some rare CLI options from `--help` into `--extended-help` - -Maintenance -+ Improved stability of analyzing phpdoc and real nullable types (Issue #567) -+ Fix type signatures Phan has for some internal methods. -+ Improve CLI `--progress-bar` tracking by printing 0% immediately. -+ Add Developer Certificate of Origin - -Bug Fixes -+ Fix uncaught issue exception analyzing class constants (Issue #551) -+ Fix group use in ASTs -+ Fix false positives checking if native types can cast to/from nullable native types (Issue #567, #582) -+ Exit with non-zero exit code if an invalid CLI argument is passed to Phan - -Backwards Incompatible Changes -+ Change the way that parameter's default values affect type inferences. - (May now add to the union type or ignore default values. Used to always add the default value types) - Add `@param` types if you encounter new issues. - This was done to avoid false positives in cases such as `function foo($maybeArray = false)` -+ Increase minimum `ext-ast` version constraint to 0.1.4 - -0.9.0 Feb 21, 2017 ------------------- - -The 0.9.x versions will be tracking syntax from PHP versions 7.1.x and is runnable on PHP 7.1+. -Please use version 0.8.x if you're using a version of PHP < 7.1. - -New Features (Analysis) -+ Support php 7.1 class constant visibility -+ Support variadic phpdoc in `@param`, e.g. `@param string ...$args` - Avoid ambiguity by emitting `PhanTypeMismatchVariadicComment` and `PhanTypeMismatchVariadicParam`. -+ Initial support for php 7.1 nullable types and void, both in phpdoc and real parameters. -+ Initial support for php 7.1 `iterable` type -+ Both conditions from `if(cond(A) && cond(B))` (e.g. `instanceof`, `is_string`, etc.) now affect analysis of the if element's block (PR #540) -+ Apply conditionals such as `is_string` to type guards in ternary operators (Issue #465) -+ Allow certain checks for removing null from Phan's inferred types, reducing false positives (E.g. `if(!is_null($x) && $x->method())`) (#518) -+ Incomplete support for specifying the class scope in which a closure will be used/bound (#309) -+ Support `@return self` in class context - -New Features (CLI, Configs) -+ Introduce `check_docblock_signature_return_type_match` config (slow, disabled by default) - (Checks if the phpdoc types match up with declared return types) - -Maintenance -+ Add Code of Conduct -+ Fix type signatures for some internal methods and internal class properties. - -Bug Fixes -+ Allow asserting `object` is a specific object type without warning (Issue #516) -+ Fix bugs in analysis of varargs within a function(Issue #516) -+ Treat null defaults in functions and methods the same way (Issue #508) - In both, add null defaults to the UnionType only if there's already another type. - In both, add non-null defaults to the UnionType (Contains `mixed` if there weren't any explicit types) -+ Specially handle phpdoc type aliases such as `boolean` only in phpdoc (Issue #471) - (Outside of phpdoc, it refers to a class with the name `boolean`) -+ Add some internal classes other than `stdClass` which are allowed to have dynamic, undeclared properties (Issue #433) -+ Fix assertion errors when passing references by reference (Issue #500) - -Backwards Incompatible Changes -+ Requires newer `ext-ast` version (Must support version 35). - -0.8.3 Jan 26, 2017 ------------------- - -The 0.8.x versions will be tracking syntax from PHP versions 7.0.x and is runnable on PHP 7.0+. -Please use version 0.8.x if you're using a version of PHP < 7.1. -For best results, run version 0.8.x with PHP 7.0 if you are analyzing a codebase which normally runs on php <= 7.0 -(If php 7.1 is used, Phan will think that some new classes, methods, and functions exist or have different parameter lists because it gets this info from `Reflection`) - -??? diff --git a/vendor/phan/phan/README.md b/vendor/phan/phan/README.md deleted file mode 100644 index 5a89327..0000000 --- a/vendor/phan/phan/README.md +++ /dev/null @@ -1,275 +0,0 @@ -Phan is a static analyzer for PHP that prefers to minimize false-positives. Phan attempts to prove incorrectness rather than correctness. - -Phan looks for common issues and will verify type compatibility on various operations when type -information is available or can be deduced. Phan has a good (but not comprehensive) understanding of flow control -and can track values in a few use cases (e.g. arrays, integers, and strings). - -[![Build Status](https://travis-ci.org/phan/phan.svg?branch=master)](https://travis-ci.org/phan/phan) -[![Build Status (Windows)](https://ci.appveyor.com/api/projects/status/github/phan/phan?branch=master&svg=true)](https://ci.appveyor.com/project/TysonAndre/phan/branch/master) -[![Gitter](https://badges.gitter.im/phan/phan.svg)](https://gitter.im/phan/phan?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) -[![Latest Stable Version](https://img.shields.io/packagist/v/phan/phan.svg)](https://packagist.org/packages/phan/phan) -[![License](https://img.shields.io/packagist/l/phan/phan.svg)](https://github.com/phan/phan/blob/master/LICENSE) - -# Getting Started - -The easiest way to use Phan is via Composer. - -``` -composer require phan/phan -``` - -With Phan installed, you'll want to [create a `.phan/config.php` file](https://github.com/phan/phan/wiki/Getting-Started#creating-a-config-file) in -your project to tell Phan how to analyze your source code. Once configured, you can run it via `./vendor/bin/phan`. - -This version (branch) of Phan depends on PHP 7.0-7.3 with the [php-ast](https://github.com/nikic/php-ast) extension (0.1.5+ or 1.0.0+) and supports PHP version 7.0-7.3 syntax. -Installation instructions for php-ast can be found [here](https://github.com/nikic/php-ast#installation). - -* **Alternative Installation Methods**<br /> - See [Getting Started](https://github.com/phan/phan/wiki/Getting-Started) for alternative methods of using -Phan and details on how to configure Phan for your project.<br /> -* **Incrementally Strengthening Analysis**<br /> - Take a look at [Incrementally Strengthening Analysis](https://github.com/phan/phan/wiki/Incrementally-Strengthening-Analysis) for some tips on how to slowly ramp up the strictness of the analysis as your code becomes better equipped to be analyzed. <br /> -* **Installing Dependencies**<br /> - Take a look at [Installing Phan Dependencies](https://github.com/phan/phan/wiki/Getting-Started#installing-phan-dependencies) for help getting Phan's dependencies installed on your system. - -The [Wiki has more information about using Phan](https://github.com/phan/phan/wiki#using-phan). - -# Features - -Phan is able to perform the following kinds of analysis: - -* Check that all methods, functions, classes, traits, interfaces, constants, properties and variables are defined and accessible. -* Check for type safety and arity issues on method/function/closure calls. -* Check for PHP7/PHP5 backward compatibility. -* Check for features that weren't supported in older PHP 7.x minor releases (E.g. `object`, `void`, `iterable`, `?T`, `[$x] = ...;`, negative string offsets, multiple exception catches, etc.) -* Check for sanity with array accesses. -* Check for type safety on binary operations. -* Check for valid and type safe return values on methods, functions, and closures. -* Check for No-Ops on arrays, closures, constants, properties, variables, unary operators, and binary operators. -* Check for unused/dead/[unreachable](https://github.com/phan/phan/tree/master/.phan/plugins#unreachablecodepluginphp) code. (Pass in `--dead-code-detection`) -* Check for unused variables and parameters. (Pass in `--unused-variable-detection`) -* Check for unused `use` statements. -* Check for classes, functions and methods being redefined. -* Check for sanity with class inheritance (e.g. checks method signature compatibility). - Phan also checks for final classes/methods being overridden, that abstract methods are implemented, and that the implemented interface is really an interface (and so on). -* Supports namespaces, traits and variadics. -* Supports [Union Types](https://github.com/phan/phan/wiki/About-Union-Types). -* Supports [Generic Types (i.e. `@template`)](https://github.com/phan/phan/wiki/Generic-Types). -* Supports generic arrays such as `int[]`, `UserObject[]`, `array<int,UserObject>`, etc.. -* Supports array shapes such as `array{key:string,otherKey:?stdClass}`, etc. (internally and in PHPDoc tags) - This also supports indicating that fields of an array shape are optional - via `array{requiredKey:string,optionalKey?:string}` (useful for `@param`) -* Supports phpdoc [type annotations](https://github.com/phan/phan/wiki/Annotating-Your-Source-Code). -* Supports inheriting phpdoc type annotations. -* Supports checking that phpdoc type annotations are a narrowed form (E.g. subclasses/subtypes) of the real type signatures -* Supports inferring types from [assert() statements](https://github.com/phan/phan/wiki/Annotating-Your-Source-Code) and conditionals in if elements/loops. -* Supports [`@deprecated` annotation](https://github.com/phan/phan/wiki/Annotating-Your-Source-Code#deprecated) for deprecating classes, methods and functions -* Supports [`@internal` annotation](https://github.com/phan/phan/wiki/Annotating-Your-Source-Code#internal) for elements (such as a constant, function, class, class constant, property or method) as internal to the package in which it's defined. -* Supports `@suppress <ISSUE_TYPE>` annotations for [suppressing issues](https://github.com/phan/phan/wiki/Annotating-Your-Source-Code#suppress). -* Supports [magic @property annotations](https://github.com/phan/phan/wiki/Annotating-Your-Source-Code#property) (partial) (`@property <union_type> <variable_name>`) -* Supports [magic @method annotations](https://github.com/phan/phan/wiki/Annotating-Your-Source-Code#method) (`@method <union_type> <method_name>(<union_type> <param1_name>)`) -* Supports [`class_alias` annotations (experimental, off by default)](https://github.com/phan/phan/pull/586) -* Supports indicating the class to which a closure will be bound, via `@phan-closure-scope` ([example](tests/files/src/0264_closure_override_context.php)) -* Supports analysis of closures and return types passed to `array_map`, `array_filter`, and other internal array functions. -* Offers extensive configuration for weakening the analysis to make it useful on large sloppy code bases -* Can be run on many cores. (requires `pcntl`) -* Output is emitted in text, checkstyle, json, pylint, csv, or codeclimate formats. -* Can run [user plugins on source for checks specific to your code](https://github.com/phan/phan/wiki/Writing-Plugins-for-Phan). - [Phan includes various plugins you may wish to enable for your project](https://github.com/phan/phan/tree/master/.phan/plugins#2-general-use-plugins). - -See [Phan Issue Types](https://github.com/phan/phan/wiki/Issue-Types-Caught-by-Phan) for descriptions -and examples of all issues that can be detected by Phan. Take a look at the -[\Phan\Issue](https://github.com/phan/phan/blob/master/src/Phan/Issue.php) to see the -definition of each error type. - -Take a look at the [Tutorial for Analyzing a Large Sloppy Code Base](https://github.com/phan/phan/wiki/Tutorial-for-Analyzing-a-Large-Sloppy-Code-Base) to get a sense of what the process of doing ongoing analysis might look like for you. - -Phan can be used from [various editors and IDEs](https://github.com/phan/phan/wiki/Editor-Support) for its error checking, "go to definition" support, etc. via the [Language Server Protocol](https://github.com/Microsoft/language-server-protocol). -Editors and tools can also request analysis of individual files in a project using the simpler [Daemon Mode](https://github.com/phan/phan/wiki/Using-Phan-Daemon-Mode). - -See the [tests](https://github.com/phan/phan/blob/master/tests/files) directory for some examples of the various checks. - -Phan is imperfect and shouldn't be used to prove that your PHP-based rocket guidance system is free of defects. - -## Features provided by plugins - -Additional analysis features have been provided by [plugins](https://github.com/phan/phan/tree/master/.phan/plugins#plugins). - -- [Checking for syntactically unreachable statements](https://github.com/phan/phan/tree/master/.phan/plugins#unreachablecodepluginphp) (E.g. `{ throw new Exception("Message"); return $value; }`) -- [Checking `*printf()` format strings against the provided arguments](https://github.com/phan/phan/tree/master/.phan/plugins#printfcheckerplugin) (as well as checking for common errors) -- [Checking that PCRE regexes passed to `preg_*()` are valid](https://github.com/phan/phan/tree/master/.phan/plugins#pregregexcheckerplugin) -- [Checking for `@suppress` annotations that are no longer needed.](https://github.com/phan/phan/tree/master/.phan/plugins#unusedsuppressionpluginphp) -- [Checking for duplicate or missing array keys.](https://github.com/phan/phan/tree/master/.phan/plugins#duplicatearraykeypluginphp) -- [Checking coding style conventions](https://github.com/phan/phan/tree/master/.phan/plugins#3-plugins-specific-to-code-styles) -- [Others](https://github.com/phan/phan/tree/master/.phan/plugins#plugins) - -Example: [Phan's plugins for self-analysis.](https://github.com/phan/phan/blob/1.2.1/.phan/config.php#L593-L613) - -# Usage - -Phan needs to be configured with details on where to find code to analyze and how to analyze it. The -easiest way to tell Phan where to find source code is to [create a `.phan/config.php` file](https://github.com/phan/phan/wiki/Getting-Started#creating-a-config-file). -A simple `.phan/config.php` file might look something like the following. - -```php -<?php - -/** - * This configuration will be read and overlaid on top of the - * default configuration. Command line arguments will be applied - * after this file is read. - */ -return [ - - // Supported values: '7.0', '7.1', '7.2', '7.3', null. - // If this is set to null, - // then Phan assumes the PHP version which is closest to the minor version - // of the php executable used to execute phan. - "target_php_version" => null, - - // A list of directories that should be parsed for class and - // method information. After excluding the directories - // defined in exclude_analysis_directory_list, the remaining - // files will be statically analyzed for errors. - // - // Thus, both first-party and third-party code being used by - // your application should be included in this list. - 'directory_list' => [ - 'src', - 'vendor/symfony/console', - ], - - // A directory list that defines files that will be excluded - // from static analysis, but whose class and method - // information should be included. - // - // Generally, you'll want to include the directories for - // third-party code (such as "vendor/") in this list. - // - // n.b.: If you'd like to parse but not analyze 3rd - // party code, directories containing that code - // should be added to the `directory_list` as - // to `exclude_analysis_directory_list`. - "exclude_analysis_directory_list" => [ - 'vendor/' - ], - - // A list of plugin files to execute. - // See https://github.com/phan/phan/tree/master/.phan/plugins for even more. - // (Pass these in as relative paths. - // Base names without extensions such as 'AlwaysReturnPlugin' - // can be used to refer to a plugin that is bundled with Phan) - 'plugins' => [ - // checks if a function, closure or method unconditionally returns. - - // can also be written as 'vendor/phan/phan/.phan/plugins/AlwaysReturnPlugin.php' - 'AlwaysReturnPlugin', - // Checks for syntactically unreachable statements in - // the global scope or function bodies. - 'UnreachableCodePlugin', - 'DollarDollarPlugin', - 'DuplicateArrayKeyPlugin', - 'PregRegexCheckerPlugin', - 'PrintfCheckerPlugin', - ], -]; -``` - -Take a look at [Creating a Config File](https://github.com/phan/phan/wiki/Getting-Started#creating-a-config-file) and -[Incrementally Strengthening Analysis](https://github.com/phan/phan/wiki/Incrementally-Strengthening-Analysis) for -more details. - -Running `phan --help` will show [usage information and command-line options](./internal/CLI-HELP.md). - -## Annotating Your Source Code - -Phan reads and understands most [PHPDoc](http://www.phpdoc.org/docs/latest/guides/types.html) -type annotations including [Union Types](https://github.com/phan/phan/wiki/About-Union-Types) -(like `int|MyClass|string|null`) and generic array types (like `int[]` or `string[]|MyClass[]` or `array<int,MyClass>`). - -Take a look at [Annotating Your Source Code](https://github.com/phan/phan/wiki/Annotating-Your-Source-Code) -and [About Union Types](https://github.com/phan/phan/wiki/About-Union-Types) for some help -getting started with defining types in your code. - -Phan supports `(int|string)[]` style annotations, and represents them internally as `int[]|string[]` -(Both annotations are treated like array which may have integers and/or strings). -When you have arrays of mixed types, just use `array`. - -The following code shows off the various annotations that are supported. - -```php -/** - * @return void - */ -function f() {} - -/** @deprecated */ -class C { - /** @var int */ - const C = 42; - - /** @var string[]|null */ - public $p = null; - - /** - * @param int|null $p - * @return string[]|null - */ - public static function f($p) { - if (is_null($p)) { - return null; - } - - return array_map( - /** @param int $i */ - function($i) { - return "thing $i"; - }, - range(0, $p) - ); - } -} -``` - -Just like in PHP, any type can be nulled in the function declaration which also -means a null is allowed to be passed in for that parameter. - -Phan checks the type of every single element of arrays (Including keys and values). -In practical terms, this means that `[$int1=>$int2,$int3=>$int4,$int5=>$str6]` is seen as `array<int,int|string>`, -which Phan represents as `array<int,int>|array<int,string>`. -`[$strKey => new MyClass(), $strKey2 => $unknown]` will be represented as -`array<string,MyClass>|array<string,mixed>`. - -- Literals such as `[12,'myString']` will be represented internally as array shapes such as `array{0:12,1:'myString'}` - -# Generating a file list - -This static analyzer does not track includes or try to figure out autoloader magic. It treats -all the files you throw at it as one big application. For code encapsulated in classes this -works well. For code running in the global scope it gets a bit tricky because order -matters. If you have an `index.php` including a file that sets a bunch of global variables and -you then try to access those after the `include(...)` in `index.php` the static analyzer won't -know anything about these. - -In practical terms this simply means that you should put your entry points and any files -setting things in the global scope at the top of your file list. If you have a `config.php` -that sets global variables that everything else needs, then you should put that first in the list followed by your -various entry points, then all your library files containing your classes. - -# Development - -Take a look at [Developer's Guide to Phan](https://github.com/phan/phan/wiki/Developer's-Guide-To-Phan) for help getting started hacking on Phan. - -When you find an issue, please take the time to create a tiny reproducing code snippet that illustrates -the bug. And once you have done that, fix it. Then turn your code snippet into a test and add it to -[tests](tests) then `./test` and send a PR with your fix and test. Alternatively, you can open an Issue with -details. - -To run Phan's unit tests, just run `./test`. - -To run all of Phan's unit tests and integration tests, run `./tests/run_all_tests.sh` - -# Code of Conduct - -We are committed to fostering a welcoming community. Any participant and -contributor is required to adhere to our [Code of Conduct](./CODE_OF_CONDUCT.md). diff --git a/vendor/phan/phan/composer.json b/vendor/phan/phan/composer.json deleted file mode 100644 index 7102463..0000000 --- a/vendor/phan/phan/composer.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "phan/phan", - "description": "A static analyzer for PHP", - "keywords": ["php", "static", "analyzer"], - "type": "project", - "license": "MIT", - "authors": [ - { - "name": "Tyson Andre" - }, - { - "name": "Rasmus Lerdorf" - }, - { - "name": "Andrew S. Morrison" - } - ], - "config": { - "sort-packages": true, - "platform": { - "php": "7.0.24" - } - }, - "require": { - "php": "^7.0.0", - "ext-filter": "*", - "ext-json": "*", - "composer/semver": "^1.4", - "composer/xdebug-handler": "^1.3.2", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "microsoft/tolerant-php-parser": "0.0.17", - "sabre/event": "^5.0", - "symfony/console": "^2.3|^3.0|~4.0", - "symfony/polyfill-mbstring": "^1.11.0" - }, - "suggest": { - "ext-ast": "Needed for parsing ASTs (unless --use-fallback-parser is used). 1.0.1+ is recommended, php-ast ^0.1.5|^1.0.0 is needed.", - "ext-igbinary": "Improves performance of polyfill when ext-ast is unavailable", - "ext-tokenizer": "Needed for non-AST support and file/line-based suppressions." - }, - "require-dev": { - "brianium/paratest": "^1.1", - "phpunit/phpunit": "^6.3.0" - }, - "autoload": { - "psr-4": {"Phan\\": "src/Phan"} - }, - "autoload-dev": { - "psr-4": {"Phan\\Tests\\": "tests/Phan"} - }, - "bin": ["phan", "phan_client", "tocheckstyle"] -} diff --git a/vendor/phan/phan/composer.lock b/vendor/phan/phan/composer.lock deleted file mode 100644 index 845be58..0000000 --- a/vendor/phan/phan/composer.lock +++ /dev/null @@ -1,2219 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "7c3ae20d38ec7ff1a765cb823e897feb", - "packages": [ - { - "name": "composer/semver", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/46d9139568ccb8d9e7cdd4539cab7347568a5e2e", - "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5", - "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "time": "2019-03-19T17:25:45+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "1.3.2", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "d17708133b6c276d6e42ef887a877866b909d892" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/d17708133b6c276d6e42ef887a877866b909d892", - "reference": "d17708133b6c276d6e42ef887a877866b909d892", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "time": "2019-01-28T20:25:53+00:00" - }, - { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.0.3", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "241c470695366e7b83672be04ea0e64d8085a551" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/241c470695366e7b83672be04ea0e64d8085a551", - "reference": "241c470695366e7b83672be04ea0e64d8085a551", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0", - "php": ">=7.0", - "phpdocumentor/reflection-docblock": "^4.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation", - "time": "2018-09-10T08:58:41+00:00" - }, - { - "name": "microsoft/tolerant-php-parser", - "version": "v0.0.17", - "source": { - "type": "git", - "url": "https://github.com/Microsoft/tolerant-php-parser.git", - "reference": "89386de8dec9c004c8ea832692e236c92f34b542" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Microsoft/tolerant-php-parser/zipball/89386de8dec9c004c8ea832692e236c92f34b542", - "reference": "89386de8dec9c004c8ea832692e236c92f34b542", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Microsoft\\PhpParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rob Lourens", - "email": "roblou@microsoft.com" - } - ], - "description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios", - "time": "2019-03-09T19:24:59+00:00" - }, - { - "name": "netresearch/jsonmapper", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "3868fe1128ce1169228acdb623359dca74db5ef3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/3868fe1128ce1169228acdb623359dca74db5ef3", - "reference": "3868fe1128ce1169228acdb623359dca74db5ef3", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4", - "squizlabs/php_codesniffer": "~1.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "time": "2017-11-28T21:30:01+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2017-09-11T18:02:19+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "4.3.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", - "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", - "shasum": "" - }, - "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", - "webmozart/assert": "^1.0" - }, - "require-dev": { - "doctrine/instantiator": "~1.0.5", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2019-04-30T17:48:53+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "0.4.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" - }, - "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "time": "2017-07-14T14:27:02+00:00" - }, - { - "name": "psr/log", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2018-11-20T15:27:04+00:00" - }, - { - "name": "sabre/event", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/event.git", - "reference": "f5cf802d240df1257866d8813282b98aee3bc548" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/event/zipball/f5cf802d240df1257866d8813282b98aee3bc548", - "reference": "f5cf802d240df1257866d8813282b98aee3bc548", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": ">=6", - "sabre/cs": "~1.0.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Sabre\\Event\\": "lib/" - }, - "files": [ - "lib/coroutine.php", - "lib/Loop/functions.php", - "lib/Promise/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" - } - ], - "description": "sabre/event is a library for lightweight event-based programming", - "homepage": "http://sabre.io/event/", - "keywords": [ - "EventEmitter", - "async", - "coroutine", - "eventloop", - "events", - "hooks", - "plugin", - "promise", - "reactor", - "signal" - ], - "time": "2018-03-05T13:55:47+00:00" - }, - { - "name": "symfony/console", - "version": "v3.4.27", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "15a9104356436cb26e08adab97706654799d31d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/15a9104356436cb26e08adab97706654799d31d8", - "reference": "15a9104356436cb26e08adab97706654799d31d8", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2019-04-08T09:29:13+00:00" - }, - { - "name": "symfony/debug", - "version": "v3.4.27", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "681afbb26488903c5ac15e63734f1d8ac430c9b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/681afbb26488903c5ac15e63734f1d8ac430c9b9", - "reference": "681afbb26488903c5ac15e63734f1d8ac430c9b9", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" - }, - "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Debug Component", - "homepage": "https://symfony.com", - "time": "2019-04-11T09:48:14+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.11.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "82ebae02209c21113908c229e9883c419720738a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", - "reference": "82ebae02209c21113908c229e9883c419720738a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, - { - "name": "Gert de Pagter", - "email": "backendtea@gmail.com" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "time": "2019-02-06T07:57:58+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.11.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "time": "2019-02-06T07:57:58+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", - "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0", - "symfony/polyfill-ctype": "^1.8" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2018-12-25T11:19:39+00:00" - } - ], - "packages-dev": [ - { - "name": "brianium/habitat", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/brianium/habitat.git", - "reference": "d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brianium/habitat/zipball/d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96", - "reference": "d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96", - "shasum": "" - }, - "require-dev": { - "monolog/monolog": ">=1.5.0", - "phpunit/phpunit": ">=3.7.21" - }, - "type": "library", - "autoload": { - "psr-0": { - "Habitat": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian", - "email": "scaturrob@gmail.com", - "homepage": "http://brianscaturro.com", - "role": "Lead" - } - ], - "description": "A dependable php environment", - "time": "2013-06-08T04:42:29+00:00" - }, - { - "name": "brianium/paratest", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/paratestphp/paratest.git", - "reference": "30f01dff874f9a5dd0b0651bca6384888030d47b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/30f01dff874f9a5dd0b0651bca6384888030d47b", - "reference": "30f01dff874f9a5dd0b0651bca6384888030d47b", - "shasum": "" - }, - "require": { - "brianium/habitat": "1.0.0", - "composer/semver": "~1.2", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-simplexml": "*", - "php": ">=7.0", - "phpunit/php-timer": "^1.0.4", - "phpunit/phpunit": "^6.0.13", - "symfony/console": "^3.4|^4.0", - "symfony/process": "^3.4|^4.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.3.2" - }, - "bin": [ - "bin/paratest" - ], - "type": "library", - "autoload": { - "psr-4": { - "ParaTest\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Scaturro", - "email": "scaturrob@gmail.com", - "homepage": "http://brianscaturro.com", - "role": "Lead" - } - ], - "description": "Parallel testing for PHP", - "homepage": "https://github.com/brianium/paratest", - "keywords": [ - "concurrent", - "parallel", - "phpunit", - "testing" - ], - "time": "2018-01-18T12:09:16+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", - "shasum": "" - }, - "require": { - "php": ">=5.3,<8.0-DEV" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2015-06-14T21:17:01+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.7.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^4.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "time": "2017-10-19T19:58:43+00:00" - }, - { - "name": "phar-io/manifest", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^1.0.1", - "php": "^5.6 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2017-03-05T18:14:27+00:00" - }, - { - "name": "phar-io/version", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "time": "2017-03-05T17:38:23+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", - "sebastian/comparator": "^1.1|^2.0|^3.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0" - }, - "require-dev": { - "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2018-08-05T17:53:17+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "5.3.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^7.0", - "phpunit/php-file-iterator": "^1.4.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^2.0.1", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.0", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-xdebug": "^2.5.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2018-04-06T15:36:58+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.4.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2017-11-27T13:52:08+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.9", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2017-02-26T11:10:40+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "791198a2c6254db10131eecfe8c06670700904db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", - "reference": "791198a2c6254db10131eecfe8c06670700904db", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2017-11-27T05:48:46+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "6.5.14", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bac23fe7ff13dbdb461481f706f0e9fe746334b7", - "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "myclabs/deep-copy": "^1.6.1", - "phar-io/manifest": "^1.0.1", - "phar-io/version": "^1.0", - "php": "^7.0", - "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^5.3", - "phpunit/php-file-iterator": "^1.4.3", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^1.0.9", - "phpunit/phpunit-mock-objects": "^5.0.9", - "sebastian/comparator": "^2.1", - "sebastian/diff": "^2.0", - "sebastian/environment": "^3.1", - "sebastian/exporter": "^3.1", - "sebastian/global-state": "^2.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^1.0", - "sebastian/version": "^2.0.1" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2", - "phpunit/dbunit": "<3.0" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-xdebug": "*", - "phpunit/php-invoker": "^1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.5.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2019-02-01T05:22:47+00:00" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "5.0.10", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f", - "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.5", - "php": "^7.0", - "phpunit/php-text-template": "^1.2.1", - "sebastian/exporter": "^3.1" - }, - "conflict": { - "phpunit/phpunit": "<6.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.5.11" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "abandoned": true, - "time": "2018-08-09T05:50:03+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" - }, - { - "name": "sebastian/comparator", - "version": "2.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/diff": "^2.0 || ^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2018-02-01T13:46:46+00:00" - }, - { - "name": "sebastian/diff", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2017-08-03T08:09:46+00:00" - }, - { - "name": "sebastian/environment", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2017-07-01T08:51:00+00:00" - }, - { - "name": "sebastian/exporter", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2017-04-03T13:19:02+00:00" - }, - { - "name": "sebastian/global-state", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2017-04-27T15:39:26+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "shasum": "" - }, - "require": { - "php": ">=5.6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28T20:34:47+00:00" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" - }, - { - "name": "symfony/process", - "version": "v3.4.27", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "a9c4dfbf653023b668c282e4e02609d131f4057a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/a9c4dfbf653023b668c282e4e02609d131f4057a", - "reference": "a9c4dfbf653023b668c282e4e02609d131f4057a", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com", - "time": "2019-04-08T16:15:54+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/1c42705be2b6c1de5904f8afacef5895cab44bf8", - "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2019-04-04T09:56:43+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.0.0", - "ext-filter": "*", - "ext-json": "*" - }, - "platform-dev": [], - "platform-overrides": { - "php": "7.0.24" - } -} diff --git a/vendor/phan/phan/phan b/vendor/phan/phan/phan deleted file mode 100755 index 5397d1b..0000000 --- a/vendor/phan/phan/phan +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env php -<?php require_once __DIR__ . '/src/phan.php'; diff --git a/vendor/phan/phan/phan_client b/vendor/phan/phan/phan_client deleted file mode 100755 index a61b750..0000000 --- a/vendor/phan/phan/phan_client +++ /dev/null @@ -1,579 +0,0 @@ -#!/usr/bin/env php -<?php -/** - * Usage: phan_client -l path/to/file.php - * Compatible with php 5.6 and php 7.x - * (The server itself requires a newer php version) - * - * See plugins/vim/snippet.vim for an example of a use of this program. - * - * Analyzes a single php file. - * - If it is syntactically valid, scans it with phan, and emits lines beginning with "phan error:" - * - If it is invalid, emits the output of the PHP syntax checker - * - * This is meant to be a self-contained script with no file dependencies. - * - * Not tested on windows, probably won't work, but should be easy to add. - * Enhanced substitute for php -l, when phan daemon is running in the background for that folder. - * - * Note: if the daemon is run inside of Docker, one would probably need to change the URL in src/Phan/Daemon/Request.php from 127.0.0.1 to 0.0.0.0, - * and docker run -p 127.0.0.1:4846:4846 path/to/phan --daemonize-tcp-port 4846 --quick (second port is the docker one) - * - * See one of the many dockerized phan instructions, such as https://github.com/cloudflare/docker-phan - * e.g. https://github.com/cloudflare/docker-phan/blob/master/builder/scripts/mkimage-phan.bash - * mentions how it installed php-ast, similar steps could be used for other modules. - * (Install phpVERSION-dev/pecl to install extensions from source/pecl (phpize, configure, make install/pecl install)) - * - * TODO: tutorial or repo. - * - * @phan-file-suppress PhanPartialTypeMismatchArgumentInternal - * @phan-file-suppress PhanPluginDuplicateConditionalNullCoalescing this can't use the `??` operator because it's compatible with php 5.6 - */ -class PhanPHPLinter -{ - // Wait at most 3 seconds to lint a file. - const TIMEOUT_MS = 3000; - - /** @var bool - Whether or not this is verbose */ - public static $verbose = false; - - /** - * @param string $msg - * @return void - */ - private static function debugError($msg) - { - error_log($msg); - } - - /** - * @param string $msg - * @return void - */ - private static function debugInfo($msg) - { - if (self::$verbose) { - self::debugError($msg); - } - } - - /** - * The main function of the phan_client binary. - * See the doc comment of this file. - * - * @return void - */ - public static function run() - { - error_reporting(E_ALL); - // TODO: check for .phan/lock to see if daemon is running? - - $opts = new PhanPHPLinterOpts(); // parse options, exit on failure. - self::$verbose = $opts->verbose; - - $failure_code = 0; - $temporary_file_mapping_contents = []; - // TODO: Check that path gets defined - foreach ($opts->file_list as $path) { - if (isset($opts->temporary_file_map[$path])) { - $temporary_path = $opts->temporary_file_map[$path]; - $temporary_contents = file_get_contents($temporary_path); - if ($temporary_contents === false) { - self::debugError(sprintf("Could not open temporary input file: %s", $temporary_path)); - $failure_code = 1; - continue; - } - $exit_code = 0; - if (!$opts->use_fallback_parser) { - ob_start(); - try { - system("php -l --no-php-ini " . escapeshellarg($temporary_path), $exit_code); - } finally { - $output = ob_get_clean(); - } - } - if ($exit_code === 0) { - $temporary_file_mapping_contents[$path] = $temporary_contents; - } - if ($exit_code !== 0) { - echo $output; - } - } else { - // TODO: use popen instead - // TODO: add option to capture output, suppress "No syntax error"? - // --no-php-ini is a faster way to parse since php doesn't need to load multiple extensions. Assumes none of the extensions change the way php is parsed. - $exit_code = 0; - if (!$opts->use_fallback_parser) { - ob_start(); - try { - system("php -l --no-php-ini " . escapeshellarg($path), $exit_code); - } finally { - $output = ob_get_clean(); - } - } - if ($exit_code !== 0) { - echo $output; - } - } - if ($exit_code !== 0) { - // The file is syntactically invalid. Or php somehow isn't able to be invoked from this script. - $failure_code = $exit_code; - } - } - // Exit if any of the requested files are syntactically invalid. - if ($failure_code !== 0) { - self::debugError("Files were syntactically invalid\n"); - exit($failure_code); - } - - // TODO: Check that everything in $this->file_list is in the same path. - // $path = reset($opts->file_list); - $real = realpath($path); - if (!$real) { - self::debugError("Could not resolve $path\n"); - } - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - $dirname = dirname($real); - $old_dirname = null; - unset($real); - - // TODO: In another PR, have an alternative way to run the daemon/server on Windows (Serialize and unserialize global state? - // The server side is unsupported on Windows, due to the `pcntl` extension not being supported. - $found_phan_config = false; - while ($dirname !== $old_dirname) { - if (file_exists($dirname . '/.phan/config.php')) { - $found_phan_config = true; - break; - } - $old_dirname = $dirname; - $dirname = dirname($dirname); - } - if (!$found_phan_config) { - self::debugInfo("Not in a Phan project, nothing to do."); - exit(0); - } - - $file_mapping = []; - $real_files = []; - foreach ($opts->file_list as $path) { - $real = realpath($path); - if (!$real) { - self::debugInfo("could not find real path to '$path'"); - continue; - } - // Convert this to a relative path - if (strncmp($dirname . '/', $real, strlen($dirname . '/')) === 0) { - $real = substr($real, strlen($dirname . '/')); - $mapped_path = isset($opts->temporary_file_map[$path]) ? $opts->temporary_file_map[$path] : $path; - // If we are analyzing a temporary file, but it's within a project, then output the path to a temporary file for consistency. - // (Tools which pass something a temporary path expect a temporary path in the output.) - $file_mapping[$real] = $mapped_path; - $real_files[] = $real; - } else { - self::debugInfo("Not in a Phan project, nothing to do."); - } - } - if (count($file_mapping) == 0) { - self::debugInfo("Not in a real project"); - } - // The file is syntactically valid. Run phan. - $request = [ - 'method' => 'analyze_files', - 'files' => $real_files, - 'format' => 'json', - ]; - if ($opts->output_mode) { - $request['format'] = $opts->output_mode; - $request['is_user_specified_format'] = true; - } - if ($opts->color) { - $request['color'] = true; - } - - if (count($temporary_file_mapping_contents) > 0) { - $request['temporary_file_mapping_contents'] = $temporary_file_mapping_contents; - } - - $serialized_request = json_encode($request); - if (!is_string($serialized_request)) { - self::debugError("Could not serialize this request\n"); - exit(1); - } - - // TODO: check if the folder is within a folder with subdirectory .phan/config.php - // TODO: Check if there is a lock before attempting to connect? - $client = @stream_socket_client($opts->url, $errno, $errstr, 20.0); - if (!\is_resource($client)) { - // TODO: This should attempt to start up the phan daemon for the given folder? - self::debugError("Phan daemon not running on " . ($opts->url)); - exit(0); - } - fwrite($client, $serialized_request); - stream_set_timeout($client, (int)floor(self::TIMEOUT_MS / 1000), 1000 * (self::TIMEOUT_MS % 1000)); - stream_socket_shutdown($client, STREAM_SHUT_WR); - $response_lines = []; - while (!feof($client)) { - $response_lines[] = fgets($client); - } - stream_socket_shutdown($client, STREAM_SHUT_RD); - fclose($client); - $response_bytes = implode('', $response_lines); - // This uses the 'phplike' format imitating php's error format. "%s in %s on line %d" - $response = json_decode($response_bytes, true); - if (!is_array($response)) { - self::debugError(sprintf("Invalid response from phan for %s: expected JSON object: %s", $opts->url, $response_bytes)); - return; - } - $status = isset($response['status']) ? $response['status'] : null; - if ($status === 'ok') { - self::dumpJSONIssues($response, $file_mapping, $request); - } else { - self::debugError(sprintf("Invalid response from phan for %s: %s", $opts->url, $response_bytes)); - } - } - - /** - * @param array<string,mixed> $response - * @param string[] $file_mapping - * @param array<string,mixed> $request - * @return void - */ - private static function dumpJSONIssues(array $response, array $file_mapping, array $request) - { - $did_debug = false; - $lines = []; - // if ($response['issue_count'] > 0) - $issues = $response['issues']; - $format = $request['format']; - if ($format === 'json') { - if (!\is_array($issues)) { - if (\is_string($issues)) { - self::debugError(sprintf("Invalid issues response from phan: %s\n", $issues)); - } else { - self::debugError(sprintf("Invalid type for issues response from phan: %s\n", gettype($issues))); - } - return; - } - if (isset($request['is_user_specified_format'])) { - // The user requested the raw JSON, not what `phan_client` converts it to - echo json_encode($issues) . "\n"; - return; - } - } else { - // When formats other than 'json' are requested, the Phan daemon returns the issues as a raw string. - // (e.g. codeclimate returns a string with JSON separated by "\x00") - if (!\is_string($issues)) { - self::debugError(sprintf("Invalid type for issues response from phan: %s\n", gettype($issues))); - return; - } - echo $issues; - return; - } - foreach ($issues as $issue) { - if ($issue['type'] !== 'issue') { - continue; - } - $pathInProject = $issue['location']['path']; // relative path - if (!isset($file_mapping[$pathInProject])) { - if (!$did_debug) { - self::debugInfo(sprintf("Unexpected path for issue (expected %s): %s\n", json_encode($file_mapping) ?: 'invalid', json_encode($issue) ?: 'invalid')); - } - $did_debug = true; - continue; - } - $line = $issue['location']['lines']['begin']; - $description = $issue['description']; - $parts = explode(' ', $description, 3); - if (count($parts) === 3 && $parts[1] === $issue['check_name']) { - $description = implode(': ', $parts); - } - if (isset($issue['suggestion'])) { - $description .= ' (' . $issue['suggestion'] . ')'; - } - $lines[] = sprintf("Phan error: %s in %s on line %d\n", $description, $file_mapping[$pathInProject], $line); - } - // https://github.com/neomake/neomake/issues/153 - echo implode('', $lines); - } -} - -/** - * This represents the CLI options for Phan - * (and the logic to parse them and generate usage messages) - */ -class PhanPHPLinterOpts -{ - /** @var string tcp:// or unix:// socket URL of the daemon. */ - public $url; - - /** @var array<int,string> - file list */ - public $file_list = []; - - /** @var string[]|null - optional, maps original files to temporary file path to use as a substitute. */ - public $temporary_file_map = null; - - /** @var bool if true, enable verbose output. */ - public $verbose = false; - - /** @var bool should this client request analysis from the Phan server when the file has syntax errors */ - public $use_fallback_parser; - - /** @var ?string the output mode to use. If null, use the default from the daemon */ - public $output_mode = null; - - /** @var bool whether to color the output on the client */ - public $color = false; - - /** - * @var bool should this client print a usage text if an **unexpected** error occurred. - */ - private $print_usage_on_error = true; - - /** - * @param string $msg - optional message - * @param int $exit_code - process exit code. - * @return void - exits with $exit_code - */ - public function usage($msg = '', $exit_code = 0) - { - if (!$msg || $this->print_usage_on_error) { - global $argv; - if (!empty($msg)) { - echo "$msg\n"; - } - - // TODO: Add an option to autostart the daemon if user also has global configuration to allow it for a given project folder. ($HOME/.phanconfig) - // TODO: Allow changing (adding/removing) issue suppression types for the analysis phase (would not affect the parse phase) - - echo <<<EOB -Usage: {$argv[0]} [options] -l file.php [ -l file2.php] - --daemonize-socket </path/to/file.sock> - Unix socket which a Phan daemon is listening for requests on. - - --daemonize-tcp-port <default|1024-65535> - TCP port which a Phan daemon is listening for JSON requests on, in daemon mode. (E.g. 'default', which is an alias for port 4846) - If no option is specified for the daemon's address, phan_client defaults to connecting on port 4846. - - --use-fallback-parser - Skip the local PHP syntax check. - Use this if the daemon is also executing with --use-fallback-parser, or if the daemon runs a different PHP version from the default. - Useful if you wish to report errors while editing the file, even if the file is currently syntactically invalid. - - -l, --syntax-check <file.php> - Syntax check, and if the Phan daemon is running, analyze the following file (absolute path or relative to current working directory) - This will only analyze the file if a full phan check (with .phan/config.php) would analyze the file. - - -m <mode>, --output-mode - Output mode from 'phan_client' (default), 'text', 'json', 'csv', 'codeclimate', 'checkstyle', or 'pylint' - - -t, --temporary-file-map '{"file.php":"/path/to/tmp/file_copy.php"}' - A json mapping from original path to absolute temporary path (E.g. of a file that is still being edited) - - -f, --flycheck-file '/path/to/tmp/file_copy.php' - A simpler way to specify a file mapping when checking a single files. - Pass this after the only occurrence of --syntax-check. - - -d, --disable-usage-on-error - If this option is set, don't print full usage messages for missing/inaccessible files or inaccessible daemons. - (Continue printing usage messages for invalid combinations of options.) - - -v, --verbose - Whether to emit debugging output of this client. - - -h, --help - This help information - -EOB; - } - exit($exit_code); - } - - /** - * @suppress PhanParamTooManyInternal - `getopt` added an optional third parameter in php 7.1 - * @suppress UnusedSuppression - */ - public function __construct() - { - global $argv; - - // Parse command line args - $optind = 0; - $shortopts = "s:p:l:t:f:m:vhd"; - $longopts = [ - 'help', - 'daemonize-socket:', - 'daemonize-tcp-port:', - 'disable-usage-on-error', - 'syntax-check:', - 'temporary-file-map:', - 'use-fallback-parser', - 'flycheck-file:', - 'output-mode:', - 'color', - 'verbose', - ]; - $getopt_reflection = new ReflectionFunction('getopt'); - if ($getopt_reflection->getNumberOfParameters() >= 3) { - // optind support is only in php 7.1+. - // hhvm doesn't expect a third parameter, but reports a version of php 7.1, even in the latest version. - $opts = getopt($shortopts, $longopts, $optind); - } else { - $opts = getopt($shortopts, $longopts); - } - if (PHP_VERSION_ID >= 70100 && $optind < count($argv)) { - $this->usage(sprintf("Unexpected parameter %s", json_encode($argv[$optind]) ?: var_export($argv[$optind], true))); - } - - // Check for this first, since the option parser may also emit debug output in the future. - if (in_array('-v', $argv) || in_array('--verbose', $argv)) { - PhanPHPLinter::$verbose = true; - $this->verbose = true; - } - $print_usage_on_error = true; - - foreach ((\is_array($opts) ? $opts : []) as $key => $value) { - switch ($key) { - case 's': - case 'daemonize-socket': - $this->checkCanConnectToDaemon('unix'); - if ($this->url !== null) { - $this->usage('Can specify --daemonize-socket or --daemonize-tcp-port only once', 1); - } - // Check if the socket is valid after parsing the file list. - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - $socket_dirname = dirname(realpath($value)); - if (!is_string($socket_dirname) || !file_exists($socket_dirname) || !is_dir($socket_dirname)) { - // The client doesn't require that the file exists if the daemon isn't running, but we do require that the folder exists. - $msg = sprintf('Configured to connect to Unix socket server at socket %s, but folder %s does not exist', json_encode($value) ?: 'invalid', json_encode($socket_dirname) ?: 'invalid'); - $this->usage($msg, 1); - } else { - $this->url = sprintf('unix://%s/%s', $socket_dirname, basename($value)); - } - break; - case 'use-fallback-parser': - $this->use_fallback_parser = true; - break; - case 'f': - case 'flycheck-file': - // Add alias, for use in flycheck - if (\is_array($this->temporary_file_map)) { - $this->usage('--flycheck-file should be specified only once.', 1); - } - if (!\is_array($this->file_list) || count($this->file_list) !== 1) { - $this->usage('--flycheck-file should be specified after the first occurrence of -l.', 1); - } - if (!is_string($value)) { - $this->usage('--flycheck-file should be passed a string value', 1); - break; // unreachable - } - $this->temporary_file_map = [$this->file_list[0] => $value]; - break; - case 't': - case 'temporary-file-map': - if (\is_array($this->temporary_file_map)) { - $this->usage('--temporary-file-map should be specified only once.', 1); - } - $mapping = json_decode($value, true); - if (!\is_array($mapping)) { - $this->usage('--temporary-file-map should be a JSON encoded map from source file to temporary file to analyze instead', 1); - break; // unreachable - } - $this->temporary_file_map = $mapping; - - break; - case 'p': - case 'daemonize-tcp-port': - $this->checkCanConnectToDaemon('tcp'); - if (strcasecmp($value, 'default') === 0) { - $port = 4846; - } else { - $port = filter_var($value, FILTER_VALIDATE_INT); - } - if ($port >= 1024 && $port <= 65535) { - $this->url = sprintf('tcp://127.0.0.1:%d', $port); - } else { - $this->usage("daemonize-tcp-port must be the string 'default' or an integer between 1024 and 65535, got '$value'", 1); - } - break; - case 'l': - case 'syntax-check': - $path = $value; - if (!is_string($path)) { - $this->print_usage_on_error = $print_usage_on_error; - $this->usage(sprintf("Error: asked to analyze path %s which is not a string", json_encode($path) ?: 'invalid'), 1); - exit(1); - } - if (!file_exists($path)) { - $this->print_usage_on_error = $print_usage_on_error; - $this->usage(sprintf("Error: asked to analyze file %s which does not exist", json_encode($path) ?: 'invalid'), 1); - exit(1); - } - $this->file_list[] = $path; - break; - case 'h': - case 'help': - $this->usage(); - break; - case 'd': - case 'disable-usage-on-error': - $print_usage_on_error = false; - break; - case 'v': - case 'verbose': - break; // already parsed. - case 'color': - $this->color = true; - break; - case 'm': - case 'output-mode': - if (!is_string($value) || !in_array($value, ['text', 'json', 'csv', 'codeclimate', 'checkstyle', 'pylint', 'phan_client'])) { - $this->usage("Expected --output-mode {text,json,csv,codeclimate,checkstyle,pylint}, but got " . json_encode($value), 1); - break; // unreachable - } - if ($value === 'phan_client') { - // We're requesting the default - break; - } - $this->output_mode = $value; - break; - default: - $this->usage("Unknown option '-$key'", 1); - break; - } - } - if (count($this->file_list) === 0) { - // Invalid invocation, always print this message - $this->usage("This requires at least one file to analyze (with -l path/to/file", 1); - } - if (\is_array($this->temporary_file_map)) { - foreach ($this->temporary_file_map as $original_path => $unused_temporary_path) { - if (!in_array($original_path, $this->file_list)) { - $this->usage("Need to specify -l '$original_path' if a mapping is included", 1); - } - } - } - if ($this->url === null) { - $this->url = 'tcp://127.0.0.1:4846'; - } - // In the majority of cases, apply this **after** checking sanity of CLI options - // (without actually starting the analysis). - $this->print_usage_on_error = $print_usage_on_error; - } - - /** - * prints error message if php doesn't support connecting to a daemon with a given protocol. - * @param string $protocol - * @return void - */ - private function checkCanConnectToDaemon($protocol) - { - $opt = $protocol === 'unix' ? '--daemonize-socket' : '--daemonize-tcp-port'; - if (!in_array($protocol, stream_get_transports())) { - $this->usage("The $protocol:///path/to/file schema is not supported on this system, cannot connect to a daemon with $opt", 1); - } - if ($this->url !== null) { - $this->usage('Can specify --daemonize-socket or --daemonize-tcp-port only once', 1); - } - } -} -PhanPHPLinter::run(); diff --git a/vendor/phan/phan/prep b/vendor/phan/phan/prep deleted file mode 100755 index d7e6a0a..0000000 --- a/vendor/phan/phan/prep +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env php -<?php require_once 'src/prep.php'; diff --git a/vendor/phan/phan/src/Phan/AST/ASTHasher.php b/vendor/phan/phan/src/Phan/AST/ASTHasher.php deleted file mode 100644 index 4dfc0f9..0000000 --- a/vendor/phan/phan/src/Phan/AST/ASTHasher.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST; - -use ast\Node; -use function is_int; -use function is_string; -use function md5; - -/** - * This converts a PHP AST Node into a hash. - * This ignores line numbers and spacing. - */ -class ASTHasher -{ - /** - * @param string|int|float|null $node - * @return string a 16-byte binary key - */ - public static function hashKey($node) - { - if (is_string($node)) { - return md5('s' . $node, true); - } - // Both 2.0 and 2 cast to the string '2' - if (is_int($node)) { - return md5((string) $node, true); - } - return md5('f' . $node, true); - } - - /** - * @param Node|string|int|float|null $node - * @return string a 16-byte binary key - */ - public static function hash($node) - { - if (!($node instanceof Node)) { - // hashKey - if (is_string($node)) { - return md5('s' . $node, true); - } - if (is_int($node)) { - return md5((string) $node, true); - } - return md5('f' . $node, true); - } - // @phan-suppress-next-line PhanUndeclaredProperty - return $node->hash ?? ($node->hash = self::computeHash($node)); - } - - /** - * @param Node $node - * @return string a 16-byte binary key - */ - private static function computeHash($node) - { - $str = 'N' . $node->kind . ':' . ($node->flags & 0xfffff); - foreach ($node->children as $key => $child) { - // added in PhanAnnotationAdder - if ($key === 'phan_nf') { - continue; - } - $str .= self::hashKey($key); - $str .= self::hash($child); - } - return md5($str, true); - } -} diff --git a/vendor/phan/phan/src/Phan/AST/ASTReverter.php b/vendor/phan/phan/src/Phan/AST/ASTReverter.php deleted file mode 100644 index e610b31..0000000 --- a/vendor/phan/phan/src/Phan/AST/ASTReverter.php +++ /dev/null @@ -1,196 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST; - -use ast; -use ast\Node; -use Closure; -use Phan\Analysis\PostOrderAnalysisVisitor; -use function implode; -use function is_string; - -/** - * This converts a PHP AST into an approximate string representation. - * This ignores line numbers and spacing. - * - * Eventual goals: - * - * 1. Short representations of constants for LSP hover requests. - * 2. Short representations for errors (e.g. "Error at $x->foo(self::MY_CONST)") - * 3. Configuration of rendering this. - * - * Similar utilities: - * - * - https://github.com/tpunt/php-ast-reverter is a pretty printer. - * - \Phan\Debug::nodeToString() converts nodes to strings. - */ -class ASTReverter -{ - /** @var array<int,Closure(Node):string> this contains closures to convert node kinds to strings */ - private static $closure_map; - /** @var Closure(Node):string this maps unknown node types to strings */ - private static $noop; - - // TODO: Make this configurable, copy instance properties to static properties. - public function __construct() - { - } - - /** - * Convert $node to a short PHP string representing $node. - * - * This does not work for all node kinds, and may be ambiguous. - * - * @param Node|string|int|float|bool|null $node - * @return string - */ - public static function toShortString($node) - { - if (!($node instanceof Node)) { - if ($node === null) { - // use lowercase 'null' instead of 'NULL' - return 'null'; - } - if (\is_string($node)) { - return self::escapeString($node); - } - // TODO: minimal representations for floats, etc. - return \var_export($node, true); - } - return (self::$closure_map[$node->kind] ?? self::$noop)($node); - } - - /** - * Escapes the inner contents to be suitable for a single-line single or double quoted string - * - * @see https://github.com/nikic/PHP-Parser/tree/master/lib/PhpParser/PrettyPrinter/Standard.php - */ - public static function escapeString(string $string) : string - { - if (\preg_match('/([\0-\15\16-\37])/', $string)) { - // Use double quoted strings if this contains newlines, tabs, control characters, etc. - return '"' . self::escapeInnerString($string, '"') . '"'; - } - // Otherwise, use single quotes - return \var_export($string, true); - } - - /** - * Escapes the inner contents to be suitable for a single-line double quoted string - * - * @see https://github.com/nikic/PHP-Parser/tree/master/lib/PhpParser/PrettyPrinter/Standard.php - */ - public static function escapeInnerString(string $string, string $quote = null) : string - { - if (null === $quote) { - // For doc strings, don't escape newlines - $escaped = \addcslashes($string, "\t\f\v$\\"); - } else { - $escaped = \addcslashes($string, "\n\r\t\f\v$" . $quote . "\\"); - } - - // Escape other control characters - return \preg_replace_callback('/([\0-\10\16-\37])(?=([0-7]?))/', /** @param array<int,string> $matches */ static function (array $matches) : string { - $oct = \decoct(\ord($matches[1])); - if ($matches[2] !== '') { - // If there is a trailing digit, use the full three character form - return '\\' . \str_pad($oct, 3, '0', \STR_PAD_LEFT); - } - return '\\' . $oct; - }, $escaped); - } - - /** - * Static initializer. - * - * @return void - */ - public static function init() - { - self::$noop = static function (Node $_) : string { - return '(unknown)'; - }; - self::$closure_map = [ - ast\AST_CLASS_CONST => static function (Node $node) : string { - return self::toShortString($node->children['class']) . '::' . $node->children['const']; - }, - ast\AST_CONST => static function (Node $node) : string { - return self::toShortString($node->children['name']); - }, - ast\AST_VAR => static function (Node $node) : string { - $name_node = $node->children['name']; - return '$' . (is_string($name_node) ? $name_node : ('{' . self::toShortString($name_node) . '}')); - }, - ast\AST_DIM => static function (Node $node) : string { - $expr_str = self::toShortString($node->children['expr']); - if ($expr_str === '(unknown)') { - return '(unknown)'; - } - - $dim_str = self::toShortString($node->children['dim']); - return "${expr_str}[${dim_str}]"; - }, - ast\AST_NAME => static function (Node $node) : string { - $result = $node->children['name']; - switch ($node->flags) { - case ast\flags\NAME_FQ: - return '\\' . $result; - case ast\flags\NAME_RELATIVE: - return 'namespace\\' . $result; - default: - return (string)$result; - } - }, - ast\AST_ARRAY => static function (Node $node) : string { - $parts = []; - foreach ($node->children as $elem) { - if (!$elem) { - $parts[] = ''; - continue; - } - $part = self::toShortString($elem->children['value']); - $key_node = $elem->children['key']; - if ($key_node !== null) { - $part = self::toShortString($key_node) . '=>' . $part; - } - $parts[] = $part; - } - $string = implode(',', $parts); - switch ($node->flags) { - case ast\flags\ARRAY_SYNTAX_SHORT: - case ast\flags\ARRAY_SYNTAX_LONG: - default: - return "[$string]"; - case ast\flags\ARRAY_SYNTAX_LIST: - return "list($string)"; - } - }, - /** @suppress PhanAccessClassConstantInternal */ - ast\AST_BINARY_OP => static function (Node $node) : string { - return \sprintf( - "(%s %s %s)", - self::toShortString($node->children['left']), - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags] ?? ' unknown ', - self::toShortString($node->children['right']) - ); - }, - ast\AST_PROP => static function (Node $node) : string { - $prop_node = $node->children['prop']; - return \sprintf( - '%s->%s', - self::toShortString($node->children['expr']), - $prop_node instanceof Node ? '{' . self::toShortString($prop_node) . '}' : (string)$prop_node - ); - }, - ast\AST_STATIC_PROP => static function (Node $node) : string { - $prop_node = $node->children['prop']; - return \sprintf( - '%s::$%s', - self::toShortString($node->children['class']), - $prop_node instanceof Node ? '{' . self::toShortString($prop_node) . '}' : (string)$prop_node - ); - }, - ]; - } -} -ASTReverter::init(); diff --git a/vendor/phan/phan/src/Phan/AST/ASTSimplifier.php b/vendor/phan/phan/src/Phan/AST/ASTSimplifier.php deleted file mode 100644 index 5a9c5b9..0000000 --- a/vendor/phan/phan/src/Phan/AST/ASTSimplifier.php +++ /dev/null @@ -1,827 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST; - -use AssertionError; -use ast; -use ast\flags; -use ast\Node; -use function array_map; -use function array_merge; -use function array_pop; -use function count; -use function in_array; - -/** - * This simplifies a PHP AST into a form which is easier to analyze, - * and returns the new Node. - * The original \ast\Node objects are not modified. - * - * @phan-file-suppress PhanPartialTypeMismatchArgumentInternal - */ -class ASTSimplifier -{ - public function __construct() - { - } - - /** - * @param Node $node - * @return array<int,Node> (Equivalent list of nodes to [$node], possibly a clone with modifications) - */ - private static function apply(Node $node) : array - { - switch ($node->kind) { - case \ast\AST_FUNC_DECL: - case \ast\AST_METHOD: - case \ast\AST_CLOSURE: - case \ast\AST_CLASS: - case \ast\AST_DO_WHILE: - case \ast\AST_FOREACH: - return [self::applyToStmts($node)]; - case \ast\AST_FOR: - return self::normalizeForStatement($node); - case \ast\AST_WHILE: - return self::normalizeWhileStatement($node); - //case \ast\AST_BREAK: - //case \ast\AST_CONTINUE: - //case \ast\AST_RETURN: - //case \ast\AST_THROW: - //case \ast\AST_EXIT: - default: - return [$node]; - case \ast\AST_STMT_LIST: - return [self::applyToStatementList($node)]; - // Conditional blocks: - case \ast\AST_IF: - return self::normalizeIfStatement($node); - case \ast\AST_TRY: - return [self::normalizeTryStatement($node)]; - } - } - - /** - * @param Node $node - A node which will have its child statements simplified. - * @return Node - The same node, or an equivalent simplified node - */ - private static function applyToStmts(Node $node) : Node - { - $stmts = $node->children['stmts']; - // Can be null, a single statement, or (possibly) a scalar instead of a node? - if (!($stmts instanceof Node)) { - return $node; - } - $new_stmts = self::applyToStatementList($stmts); - if ($new_stmts === $stmts) { - return $node; - } - $new_node = clone($node); - $new_node->children['stmts'] = $new_stmts; - return $new_node; - } - - /** - * @param Node $statement_list - The statement list to simplify - * @return Node - an equivalent statement list (Identical, or a clone) - */ - private static function applyToStatementList(Node $statement_list) : Node - { - if ($statement_list->kind !== \ast\AST_STMT_LIST) { - $statement_list = self::buildStatementList($statement_list->lineno ?? 0, $statement_list); - } - $new_children = []; - foreach ($statement_list->children as $child_node) { - if ($child_node instanceof Node) { - foreach (self::apply($child_node) as $new_child_node) { - $new_children[] = $new_child_node; - } - } else { - $new_children[] = $child_node; - } - } - list($new_children, $modified) = self::normalizeStatementList($new_children); - if (!$modified && $new_children === $statement_list->children) { - return $statement_list; - } - $clone_node = clone($statement_list); - $clone_node->children = $new_children; - return $clone_node; - } - - /** - * Creates a new node with kind \ast\AST_STMT_LIST from a list of 0 or more child nodes. - */ - private static function buildStatementList(int $lineno, Node ...$child_nodes) : Node - { - return new Node( - \ast\AST_STMT_LIST, - 0, - $child_nodes, - $lineno - ); - } - - /** - * @param array<int,?Node|?float|?int|?string|?float|?bool> $statements - * @return array{0:array<int,Node>,1:bool} - [New/old list, bool $modified] An equivalent list after simplifying (or the original list) - */ - private static function normalizeStatementList(array $statements) : array - { - $modified = false; - $new_statements = []; - foreach ($statements as $stmt) { - $new_statements[] = $stmt; - if (!($stmt instanceof Node)) { - continue; - } - if ($stmt->kind !== \ast\AST_IF) { - continue; - } - // Run normalizeIfStatement again. - \array_pop($new_statements); - \array_push($new_statements, ...self::normalizeIfStatement($stmt)); - $modified = $modified || \end($new_statements) !== $stmt; - continue; - } - return [$modified ? $new_statements : $statements, $modified]; - } - - /** - * Replaces the last node in a list with a list of 0 or more nodes - * @param array<int,Node> $nodes - * @param Node ...$new_statements - * @return void - */ - private static function replaceLastNodeWithNodeList(array &$nodes, Node... $new_statements) - { - if (\array_pop($nodes) === false) { - throw new AssertionError("Saw an unexpected empty node list"); - } - foreach ($new_statements as $stmt) { - $nodes[] = $stmt; - } - } - - const NON_SHORT_CIRCUITING_BINARY_OPERATOR_FLAGS = [ - flags\BINARY_BOOL_XOR, - flags\BINARY_IS_IDENTICAL, - flags\BINARY_IS_NOT_IDENTICAL, - flags\BINARY_IS_EQUAL, - flags\BINARY_IS_NOT_EQUAL, - flags\BINARY_IS_SMALLER, - flags\BINARY_IS_SMALLER_OR_EQUAL, - flags\BINARY_IS_GREATER, - flags\BINARY_IS_GREATER_OR_EQUAL, - flags\BINARY_SPACESHIP, - ]; - - /** - * If this returns true, the expression has no side effects, and can safely be reordered. - * (E.g. returns true for `MY_CONST` or `false` in `if (MY_CONST === ($x = y))` - * - * @param Node|string|float|int $node - * @internal the way this behaves may change - */ - public static function isExpressionWithoutSideEffects($node) : bool - { - if (!($node instanceof Node)) { - return true; - } - switch ($node->kind) { - case \ast\AST_CONST: - case \ast\AST_MAGIC_CONST: - case \ast\AST_NAME: - return true; - case \ast\AST_UNARY_OP: - return self::isExpressionWithoutSideEffects($node->children['expr']); - case \ast\AST_BINARY_OP: - return self::isExpressionWithoutSideEffects($node->children['left']) && - self::isExpressionWithoutSideEffects($node->children['right']); - case \ast\AST_CLASS_CONST: - return self::isExpressionWithoutSideEffects($node->children['class']); - default: - return false; - } - } - - /** - * Converts an if statement to one which is easier for phan to analyze - * E.g. repeatedly makes these conversions - * if (A && B) {X} -> if (A) { if (B) {X}} - * if ($var = A) {X} -> $var = A; if ($var) {X} - * @return array<int,Node> - One or more nodes created from $original_node. - * Will return [$original_node] if no modifications were made. - */ - private static function normalizeIfStatement(Node $original_node) : array - { - $nodes = [$original_node]; - // Repeatedly apply these rules - do { - $old_nodes = $nodes; - $node = $nodes[count($nodes) - 1]; - $node->flags = 0; - $if_cond = $node->children[0]->children['cond']; - if (!($if_cond instanceof Node)) { - break; // No transformation rules apply here. - } - - if ($if_cond->kind === \ast\AST_UNARY_OP && - $if_cond->flags === flags\UNARY_BOOL_NOT) { - $cond_node = $if_cond->children['expr']; - if ($cond_node instanceof Node && - $cond_node->kind === \ast\AST_UNARY_OP && - $cond_node->flags === flags\UNARY_BOOL_NOT) { - self::replaceLastNodeWithNodeList($nodes, self::applyIfDoubleNegateReduction($node)); - continue; - } - if (count($node->children) === 1) { - self::replaceLastNodeWithNodeList($nodes, self::applyIfNegatedToIfElseReduction($node)); - continue; - } - } - if ($if_cond->kind === \ast\AST_BINARY_OP && in_array($if_cond->flags, self::NON_SHORT_CIRCUITING_BINARY_OPERATOR_FLAGS, true)) { - // if (($var = A) === B) {X} -> $var = A; if ($var === B) { X} - $if_cond_children = $if_cond->children; - if (in_array($if_cond_children['left']->kind ?? 0, [\ast\AST_ASSIGN, \ast\AST_ASSIGN_REF], true) && - ($if_cond_children['left']->children['var']->kind ?? 0) === \ast\AST_VAR && - self::isExpressionWithoutSideEffects($if_cond_children['right'])) { - self::replaceLastNodeWithNodeList($nodes, ...self::applyAssignInLeftSideOfBinaryOpReduction($node)); - continue; - } - if (in_array($if_cond_children['right']->kind ?? 0, [\ast\AST_ASSIGN, \ast\AST_ASSIGN_REF], true) && - ($if_cond_children['right']->children['var']->kind ?? 0) === \ast\AST_VAR && - self::isExpressionWithoutSideEffects($if_cond_children['left'])) { - self::replaceLastNodeWithNodeList($nodes, ...self::applyAssignInRightSideOfBinaryOpReduction($node)); - continue; - } - // TODO: If the left-hand side is a constant or class constant or literal, that's safe to rearrange as well - // (But `foo($y = something()) && $x = $y` is not safe to rearrange) - } - if (count($node->children) === 1) { - if ($if_cond->kind === \ast\AST_BINARY_OP && - $if_cond->flags === flags\BINARY_BOOL_AND) { - self::replaceLastNodeWithNodeList($nodes, self::applyIfAndReduction($node)); - // if (A && B) {X} -> if (A) { if (B) {X}} - // Do this, unless there is an else statement that can be executed. - continue; - } - } elseif (count($node->children) === 2) { - if ($if_cond->kind === \ast\AST_UNARY_OP && - $if_cond->flags === flags\UNARY_BOOL_NOT && - $node->children[1]->children['cond'] === null) { - self::replaceLastNodeWithNodeList($nodes, self::applyIfNegateReduction($node)); - continue; - } - } elseif (count($node->children) >= 3) { - self::replaceLastNodeWithNodeList($nodes, self::applyIfChainReduction($node)); - continue; - } - if ($if_cond->kind === \ast\AST_ASSIGN && - ($if_cond->children['var']->kind ?? null) === \ast\AST_VAR) { - // if ($var = A) {X} -> $var = A; if ($var) {X} - // do this whether or not there is an else. - // TODO: Could also reduce `if (($var = A) && B) {X} else if (C) {Y} -> $var = A; .... - self::replaceLastNodeWithNodeList($nodes, ...self::applyIfAssignReduction($node)); - continue; - } - } while ($old_nodes !== $nodes); - return $nodes; - } - - /** - * Converts a while statement to one which is easier for phan to analyze - * E.g. repeatedly makes these conversions - * while (A && B) {X} -> while (A) { if (!B) {break;} X} - * while (!!A) {X} -> while (A) { X } - * @return array{0:Node} - An array with a single while statement - * Will return [$original_node] if no modifications were made. - */ - private static function normalizeWhileStatement(Node $original_node) : array - { - $node = $original_node; - // Repeatedly apply these rules - while (true) { - $while_cond = $node->children['cond']; - if (!($while_cond instanceof Node)) { - break; // No transformation rules apply here. - } - - if ($while_cond->kind === \ast\AST_UNARY_OP && - $while_cond->flags === flags\UNARY_BOOL_NOT) { - $cond_node = $while_cond->children['expr']; - if ($cond_node instanceof Node && - $cond_node->kind === \ast\AST_UNARY_OP && - $cond_node->flags === flags\UNARY_BOOL_NOT) { - $node = self::applyWhileDoubleNegateReduction($node); - continue; - } - break; - } - if ($while_cond->kind === \ast\AST_BINARY_OP && - $while_cond->flags === flags\BINARY_BOOL_AND) { - // TODO: Also support `and` operator. - $node = self::applyWhileAndReduction($node); - // while (A && B) {X} -> while (A) { if (!B) {break;} X} - // Do this, unless there is an else statement that can be executed. - continue; - } - break; - } - - return [$node]; - } - - /** - * Converts a while statement to one which is easier for phan to analyze - * E.g. repeatedly makes these conversions - * while (A && B) {X} -> while (A) { if (!B) {break;} X} - * while (!!A) {X} -> while (A) { X } - * @return array{0:Node} - An array with a single while statement - * Will return [$node] if no modifications were made. - */ - private static function normalizeForStatement(Node $node) : array - { - // Repeatedly apply these rules - while (true) { - $for_cond_list = $node->children['cond']; - if (!($for_cond_list instanceof Node)) { - break; // No transformation rules apply here. - } - - $for_cond = \end($for_cond_list->children); - - if (!($for_cond instanceof Node)) { - break; - } - if ($for_cond->kind === \ast\AST_UNARY_OP && - $for_cond->flags === flags\UNARY_BOOL_NOT) { - $cond_node = $for_cond->children['expr']; - if ($cond_node instanceof Node && - $cond_node->kind === \ast\AST_UNARY_OP && - $cond_node->flags === flags\UNARY_BOOL_NOT) { - $node = self::applyForDoubleNegateReduction($node); - continue; - } - break; - } - if ($for_cond->kind === \ast\AST_BINARY_OP && - $for_cond->flags === flags\BINARY_BOOL_AND) { - // TODO: Also support `and` operator. - $node = self::applyForAndReduction($node); - // for (init ; A && B; loop) {X} -> for (init; A; loop) { if (!B) {break;} X} - // Do this, unless there is an else statement that can be executed. - continue; - } - break; - } - - return [$node]; - } - - /** - * if (($var = A) === B) {X} -> $var = A; if ($var === B) { X } - * - * @return array{0:Node,1:Node} - */ - private static function applyAssignInLeftSideOfBinaryOpReduction(Node $node) : array - { - $inner_assign_statement = $node->children[0]->children['cond']->children['left']; - if (!($inner_assign_statement instanceof Node)) { - throw new AssertionError('Expected $inner_assign_statement instanceof Node'); - } - $inner_assign_var = $inner_assign_statement->children['var']; - - if ($inner_assign_var->kind !== \ast\AST_VAR) { - throw new AssertionError('Expected $inner_assign_var->kind === \ast\AST_VAR'); - } - - $new_node_elem = clone($node->children[0]); - $new_node_elem->children['cond']->children['left'] = $inner_assign_var; - $new_node_elem->flags = 0; - $new_node = clone($node); - $new_node->children[0] = $new_node_elem; - $new_node->lineno = $new_node_elem->lineno ?? 0; - $new_node->flags = 0; - return [$inner_assign_statement, $new_node]; - } - - /** - * if (B === ($var = A)) {X} -> $var = A; if (B === $var) { X } - * - * @return array{0:Node,1:Node} - */ - private static function applyAssignInRightSideOfBinaryOpReduction(Node $node) : array - { - $inner_assign_statement = $node->children[0]->children['cond']->children['right']; - $inner_assign_var = $inner_assign_statement->children['var']; - - $new_node_elem = clone($node->children[0]); - $new_node_elem->children['cond']->children['right'] = $inner_assign_var; - $new_node_elem->flags = 0; - $new_node = clone($node); - $new_node->children[0] = $new_node_elem; - $new_node->lineno = $new_node_elem->lineno ?? 0; - $new_node->flags = 0; - return [$inner_assign_statement, $new_node]; - } - - /** - * Creates a new node with kind \ast\AST_IF from two branches - */ - private static function buildIfNode(Node $l, Node $r) : Node - { - return new Node( - \ast\AST_IF, - 0, - [$l, $r], - $l->lineno ?? 0 - ); - } - - /** - * maps if (A) {X} elseif (B) {Y} else {Z} -> if (A) {Y} else { if (B) {Y} else {Z}} - */ - private static function applyIfChainReduction(Node $node) : Node - { - $children = $node->children; // Copy of array of Nodes of type IF_ELEM - if (count($children) <= 2) { - return $node; - } - while (count($children) > 2) { - $r = array_pop($children); - $l = array_pop($children); - if (!($l instanceof Node && $r instanceof Node)) { - throw new AssertionError("Expected to have AST_IF_ELEM nodes"); - } - $l->children['stmts']->flags = 0; - $r->children['stmts']->flags = 0; - $inner_if_node = self::buildIfNode($l, $r); - $new_r = new Node( - \ast\AST_IF_ELEM, - 0, - [ - 'cond' => null, - 'stmts' => self::buildStatementList($inner_if_node->lineno, ...(self::normalizeIfStatement($inner_if_node))), - ], - 0 - ); - $children[] = $new_r; - } - // $children is an array of 2 nodes of type IF_ELEM - return new Node(\ast\AST_IF, 0, $children, $node->lineno); - } - - /** - * Converts if (A && B) {X}` -> `if (A) { if (B){X}}` - * @return Node simplified node logically equivalent to $node, with kind \ast\AST_IF. - */ - private static function applyIfAndReduction(Node $node) : Node - { - if (count($node->children) != 1) { - throw new AssertionError('Expected an if statement with no else/elseif statements'); - } - $inner_node_elem = clone($node->children[0]); // AST_IF_ELEM - $inner_node_elem->children['cond'] = $inner_node_elem->children['cond']->children['right']; - $inner_node_elem->flags = 0; - $inner_node_lineno = $inner_node_elem->lineno ?? 0; - - // Normalize code such as `if (A && (B && C)) {...}` recursively. - $inner_node_stmts = self::normalizeIfStatement(new Node( - \ast\AST_IF, - 0, - [$inner_node_elem], - $inner_node_lineno - )); - - $inner_node_stmt_list = new Node(\ast\AST_STMT_LIST, 0, $inner_node_stmts, $inner_node_lineno); - $outer_node_elem = clone($node->children[0]); // AST_IF_ELEM - $outer_node_elem->children['cond'] = $node->children[0]->children['cond']->children['left']; - $outer_node_elem->children['stmts'] = $inner_node_stmt_list; - $outer_node_elem->flags = 0; - return new Node( - \ast\AST_IF, - $node->lineno, - [$outer_node_elem], - 0 - ); - } - - /** - * Converts `while (A && B) {X}` -> `while (A) { if (!B) { break;} X}` - * @return Node simplified node logically equivalent to $node, with kind \ast\AST_IF. - */ - private static function applyWhileAndReduction(Node $node) : Node - { - $cond_node = $node->children['cond']; - $right_node = $cond_node->children['right']; - $lineno = $right_node->lineno ?? $cond_node->lineno; - $conditional_break_elem = self::makeBreakWithNegatedConditional($right_node, $lineno); - - return new Node( - ast\AST_WHILE, - 0, - [ - 'cond' => $cond_node->children['left'], - 'stmts' => new Node( - ast\AST_STMT_LIST, - $lineno, - array_merge([$conditional_break_elem], $node->children['stmts']->children), - 0 - ), - ], - $node->lineno - ); - } - - /** - * Converts `for (INIT; A && B; LOOP) {X}` -> `for (INIT; A; LOOP) { if (!B) { break;} X}` - * @return Node simplified node logically equivalent to $node, with kind \ast\AST_IF. - */ - private static function applyForAndReduction(Node $node) : Node - { - $children = $node->children; - $cond_node_array = $children['cond']->children; - $cond_node = array_pop($cond_node_array); - $right_node = $cond_node->children['right']; - $lineno = $right_node->lineno ?? $cond_node->lineno; - $conditional_break_elem = self::makeBreakWithNegatedConditional($right_node, $lineno); - - $cond_node_array[] = $cond_node->children['left']; - - $cond_node_list = new Node( - ast\AST_EXPR_LIST, - 0, - $cond_node_array, - $children['cond']->lineno - ); - - return new Node( - ast\AST_FOR, - 0, - [ - 'init' => $children['init'], - 'cond' => $cond_node_list, - 'loop' => $children['loop'], - 'stmts' => new Node( - ast\AST_STMT_LIST, - $lineno, - array_merge([$conditional_break_elem], $children['stmts']->children), - 0 - ), - ], - $node->lineno - ); - } - - /** - * Creates a Node for `if (!COND) { break; }` - * @param Node|string|int|float $cond_node - */ - private static function makeBreakWithNegatedConditional($cond_node, int $lineno) : Node - { - $break_if_elem = new Node( - ast\AST_IF_ELEM, - 0, - [ - 'cond' => new Node( - ast\AST_UNARY_OP, - flags\UNARY_BOOL_NOT, - ['expr' => $cond_node], - $lineno - ), - 'stmts' => new Node( - ast\AST_STMT_LIST, - 0, - [new Node(ast\AST_BREAK, $lineno, ['depth' => null], 0)], - $lineno - ), - ], - $lineno - ); - return new Node( - ast\AST_IF, - 0, - [$break_if_elem], - $lineno - ); - } - - /** - * Converts if ($x = A) {Y} -> $x = A; if ($x) {Y} - * This allows analyzing variables set in if blocks outside of the `if` block - * @return array{0:Node,1:Node} [$outer_assign_statement, $new_node] - */ - private static function applyIfAssignReduction(Node $node) : array - { - $outer_assign_statement = $node->children[0]->children['cond']; - if (!($outer_assign_statement instanceof Node)) { - throw new AssertionError('Expected condition of first if statement (with assignment as condition) to be a Node'); - } - $new_node_elem = clone($node->children[0]); - $new_node_elem->children['cond'] = $new_node_elem->children['cond']->children['var']; - $new_node_elem->flags = 0; - $new_node = clone($node); - $new_node->children[0] = $new_node_elem; - $new_node->lineno = $new_node_elem->lineno ?? 0; - $new_node->flags = 0; - return [$outer_assign_statement, $new_node]; - } - - /** - * Converts if (!x) {Y} else {Z} -> if (x) {Z} else {Y} - * This improves Phan's analysis for cases such as `if (!is_string($x))`. - */ - private static function applyIfNegateReduction(Node $node) : Node - { - if (!( - count($node->children) === 2 && - $node->children[0]->children['cond']->flags === flags\UNARY_BOOL_NOT && - $node->children[1]->children['cond'] === null - )) { - throw new AssertionError('Failed precondition of ' . __METHOD__); - } - $new_node = clone($node); - $new_node->children = [clone($new_node->children[1]), clone($new_node->children[0])]; - $new_node->children[0]->children['cond'] = $node->children[0]->children['cond']->children['expr']; - $new_node->children[1]->children['cond'] = null; - $new_node->flags = 0; - return $new_node; - } - - /** - * Converts if (!!(x)) {Y} -> if (x) {Y} - * This improves Phan's analysis for cases such as `if (!!x)` - */ - private static function applyIfDoubleNegateReduction(Node $node) : Node - { - if (!( - $node->children[0]->children['cond']->flags === flags\UNARY_BOOL_NOT && - $node->children[0]->children['cond']->children['expr']->flags === flags\UNARY_BOOL_NOT - )) { - throw new AssertionError('Failed precondition of ' . __METHOD__); - } - - $new_cond = $node->children[0]->children['cond']->children['expr']->children['expr']; - $new_node = clone($node); - $new_node->flags = 0; - $new_node->children[0] = clone($node->children[0]); - $new_node->children[0]->flags = 0; - $new_node->children[0]->children['cond'] = $new_cond; - - return $new_node; - } - - /** - * Converts while (!!(x)) {Y} -> if (x) {Y} - * This improves Phan's analysis for cases such as `if (!!x)` - */ - private static function applyWhileDoubleNegateReduction(Node $node) : Node - { - if (!( - $node->children['cond']->flags === flags\UNARY_BOOL_NOT && - $node->children['cond']->children['expr']->flags === flags\UNARY_BOOL_NOT - )) { - throw new AssertionError('Failed precondition of ' . __METHOD__); - } - - return new Node( - ast\AST_WHILE, - 0, - [ - 'cond' => $node->children['cond']->children['expr']->children['expr'], - 'stmts' => $node->children['stmts'] - ], - $node->lineno - ); - } - - /** - * Converts for (INIT; !!(x); LOOP) {Y} -> if (INIT; x; LOOP) {Y} - * This improves Phan's analysis for cases such as `if (!!x)` - */ - private static function applyForDoubleNegateReduction(Node $node) : Node - { - $children = $node->children; - $cond_node_list = $children['cond']->children; - $cond_node = array_pop($cond_node_list); - if (!( - $cond_node->flags === flags\UNARY_BOOL_NOT && - $cond_node->children['expr']->flags === flags\UNARY_BOOL_NOT - )) { - throw new AssertionError('Failed precondition of ' . __METHOD__); - } - $cond_node_list[] = $cond_node->children['expr']->children['expr']; - - $children['cond'] = new ast\Node( - ast\AST_EXPR_LIST, - 0, - $cond_node_list, - $children['cond']->lineno - ); - - return new Node( - ast\AST_FOR, - 0, - $children, - $node->lineno - ); - } - - private static function applyIfNegatedToIfElseReduction(Node $node) : Node - { - if (count($node->children) !== 1) { - throw new AssertionError("Expected one child node"); - } - $if_elem = $node->children[0]; - if ($if_elem->children['cond']->flags !== flags\UNARY_BOOL_NOT) { - throw new AssertionError("Expected condition to begin with unary boolean negation operator"); - } - $lineno = $if_elem->lineno; - $new_else_elem = new Node( - \ast\AST_IF_ELEM, - 0, - [ - 'cond' => null, - 'stmts' => $if_elem->children['stmts'], - ], - $lineno - ); - $new_if_elem = new Node( - \ast\AST_IF_ELEM, - 0, - [ - 'cond' => $if_elem->children['cond']->children['expr'], - 'stmts' => new Node(\ast\AST_STMT_LIST, 0, [], $if_elem->lineno), - ], - $lineno - ); - return new Node( - \ast\AST_IF, - 0, - [$new_if_elem, $new_else_elem], - $node->lineno - ); - } - - /** - * Recurses on a list of 0 or more catch statements. (as in try/catch) - * Returns an equivalent list of catch AST nodes (or the original if no changes were made) - */ - private static function normalizeCatchesList(Node $catches) : Node - { - $list = $catches->children; - $new_list = array_map( - /** @return mixed */ - static function (Node $node) { - return self::applyToStmts($node); - }, - // @phan-suppress-next-line PhanPartialTypeMismatchArgument should be impossible to be float - $list - ); - if ($new_list === $list) { - return $catches; - } - $new_catches = clone($catches); - $new_catches->children = $new_list; - $new_catches->flags = 0; - return $new_catches; - } - - /** - * Recurses on a try/catch/finally node, applying simplifications(catch/finally are optional) - * Returns an equivalent try/catch/finally node (or the original if no changes were made) - */ - private static function normalizeTryStatement(Node $node) : Node - { - $try = $node->children['try']; - $catches = $node->children['catches']; - $finally = $node->children['finally'] ?? null; - $new_try = self::applyToStatementList($try); - $new_catches = $catches ? self::normalizeCatchesList($catches) : $catches; - $new_finally = $finally ? self::applyToStatementList($finally) : $finally; - if ($new_try === $try && $new_catches === $catches && $new_finally === $finally) { - return $node; - } - $new_node = clone($node); - $new_node->children['try'] = $new_try; - $new_node->children['catches'] = $new_catches; - $new_node->children['finally'] = $new_finally; - $new_node->flags = 0; - return $new_node; - } - - /** - * Returns a Node that represents $node after all of the AST simplification steps. - * - * $node is not modified. This will reuse descendant nodes that didn't change. - */ - public static function applyStatic(Node $node) : Node - { - $rewriter = new self(); - $nodes = $rewriter->apply($node); - if (count($nodes) !== 1) { - throw new AssertionError("Expected applying simplifier to a statement list would return an array with one statement list"); - } - return $nodes[0]; - } -} diff --git a/vendor/phan/phan/src/Phan/AST/AnalysisVisitor.php b/vendor/phan/phan/src/Phan/AST/AnalysisVisitor.php deleted file mode 100644 index 6b26b51..0000000 --- a/vendor/phan/phan/src/Phan/AST/AnalysisVisitor.php +++ /dev/null @@ -1,124 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST; - -use Phan\AST\Visitor\KindVisitorImplementation; -use Phan\CodeBase; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\FQSEN; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Suggestion; - -/** - * A visitor used for analysis. - * - * In addition to calling the corresponding visit*() method for the passed in \ast\Node's kind, - * this contains helper methods to emit issues. - */ -abstract class AnalysisVisitor extends KindVisitorImplementation -{ - /** - * @var CodeBase - * The code base within which we're operating - */ - protected $code_base; - - /** - * @var Context - * The context in which the node we're going to be looking - * at exits. - */ - protected $context; - - /** - * @param CodeBase $code_base - * The code base within which we're operating - * - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - */ - public function __construct( - CodeBase $code_base, - Context $context - ) { - $this->context = $context; - $this->code_base = $code_base; - } - - /** - * @param string $issue_type - * The type of issue to emit such as Issue::ParentlessClass - * - * @param int $lineno - * The line number where the issue was found - * - * @param int|string|FQSEN|UnionType|Type ...$parameters - * Template parameters for the issue's error message - * - * @return void - */ - protected function emitIssue( - string $issue_type, - int $lineno, - ...$parameters - ) { - Issue::maybeEmitWithParameters( - $this->code_base, - $this->context, - $issue_type, - $lineno, - $parameters - ); - } - - /** - * @param string $issue_type - * The type of issue to emit such as Issue::ParentlessClass - * - * @param int $lineno - * The line number where the issue was found - * - * @param array<int,int|string|FQSEN|UnionType|Type> $parameters - * Template parameters for the issue's error message - * - * @param ?Suggestion $suggestion - * A suggestion (may be null) - * - * @return void - */ - protected function emitIssueWithSuggestion( - string $issue_type, - int $lineno, - array $parameters, - $suggestion - ) { - Issue::maybeEmitWithParameters( - $this->code_base, - $this->context, - $issue_type, - $lineno, - $parameters, - $suggestion - ); - } - - /** - * Check if an issue type (different from the one being emitted) should be suppressed. - * - * This is useful for ensuring that TypeMismatchProperty also suppresses PhanPossiblyNullTypeMismatchProperty, - * for example. - */ - protected function shouldSuppressIssue(string $issue_type, int $lineno) : bool - { - return Issue::shouldSuppressIssue( - $this->code_base, - $this->context, - $issue_type, - $lineno, - [] - ); - } -} diff --git a/vendor/phan/phan/src/Phan/AST/ContextNode.php b/vendor/phan/phan/src/Phan/AST/ContextNode.php deleted file mode 100644 index 383fcbc..0000000 --- a/vendor/phan/phan/src/Phan/AST/ContextNode.php +++ /dev/null @@ -1,2344 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST; - -use AssertionError; -use ast; -use ast\Node; -use Exception; -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\CodeBaseException; -use Phan\Exception\EmptyFQSENException; -use Phan\Exception\FQSENException; -use Phan\Exception\IssueException; -use Phan\Exception\NodeException; -use Phan\Exception\RecursionDepthException; -use Phan\Exception\UnanalyzableException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\ClassConstant; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\GlobalConstant; -use Phan\Language\Element\Method; -use Phan\Language\Element\Parameter; -use Phan\Language\Element\Property; -use Phan\Language\Element\TraitAdaptations; -use Phan\Language\Element\TraitAliasSource; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN; -use Phan\Language\FQSEN\FullyQualifiedClassConstantName; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedGlobalConstantName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\FQSEN\FullyQualifiedPropertyName; -use Phan\Language\Type; -use Phan\Language\Type\IntType; -use Phan\Language\Type\LiteralStringType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\ObjectType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; -use Phan\Library\FileCache; -use Phan\Library\None; -use function implode; -use function is_object; -use function is_string; -use function strcasecmp; -use function strpos; -use function strtolower; - -if (!\function_exists('spl_object_id')) { - require_once __DIR__ . '/../../spl_object_id.php'; -} - -/** - * Methods for an AST node in context - * @phan-file-suppress PhanPartialTypeMismatchArgument - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class ContextNode -{ - - /** @var CodeBase The code base within which we're operating */ - private $code_base; - - /** @var Context The context in which we are requesting information about the Node $this->node */ - private $context; - - /** @var Node|array|bool|string|float|int|bool|null the node which we're requesting information about. */ - private $node; - - /** - * @param CodeBase $code_base The code base within which we're operating - * @param Context $context The context in which we are requesting information about the Node. - * @param Node|array|string|float|int|bool|null $node the node which we're requesting information about. - */ - public function __construct( - CodeBase $code_base, - Context $context, - $node - ) { - $this->code_base = $code_base; - $this->context = $context; - $this->node = $node; - } - - /** - * Get a list of fully qualified names from a node - * - * @return array<int,string> - * @throws FQSENException if the node has invalid names - * @suppress PhanUnreferencedPublicMethod this used to be used - */ - public function getQualifiedNameList() : array - { - if (!($this->node instanceof Node)) { - return []; - } - - $union_type = UnionType::empty(); - foreach ($this->node->children as $name_node) { - $union_type = $union_type->withUnionType(UnionTypeVisitor::unionTypeFromClassNode( - $this->code_base, - $this->context, - $name_node - )); - } - return \array_map('strval', $union_type->getTypeSet()); - } - - /** - * Get a fully qualified name from a node - * - * @return string - * - * @throws FQSENException if the node is invalid - * @internal TODO: Stop using this - */ - public function getQualifiedName() : string - { - return UnionTypeVisitor::unionTypeFromClassNode( - $this->code_base, - $this->context, - $this->node - )->__toString(); - } - - /** - * Gets the FQSEN for a trait. - * NOTE: does not validate that it is really used on a trait - * @return array<int,FullyQualifiedClassName> - * @throws FQSENException - */ - public function getTraitFQSENList() : array - { - if (!($this->node instanceof Node)) { - return []; - } - - /** - * @param Node|int|string|float|null $name_node - * @throws FQSENException - */ - $result = []; - foreach ($this->node->children as $name_node) { - $trait_fqsen = (new ContextNode( - $this->code_base, - $this->context, - $name_node - ))->getTraitFQSEN([]); - if ($trait_fqsen) { - // Should never be null but check anyway - // TODO warn - $result[] = $trait_fqsen; - } - } - return $result; - } - - /** - * Gets the FQSEN for a trait. - * NOTE: does not validate that it is really used on a trait - * @param array<string,TraitAdaptations> $adaptations_map - * @return ?FullyQualifiedClassName (If this returns null, the caller is responsible for emitting an issue or falling back) - * @throws FQSENException hopefully impossible - */ - public function getTraitFQSEN(array $adaptations_map) - { - // TODO: In a subsequent PR, try to make trait analysis work when $adaptations_map has multiple possible traits. - $trait_fqsen_string = $this->getQualifiedName(); - if ($trait_fqsen_string === '') { - if (\count($adaptations_map) === 1) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return \reset($adaptations_map)->getTraitFQSEN(); - } else { - return null; - } - } - return FullyQualifiedClassName::fromStringInContext( - $trait_fqsen_string, - $this->context - ); - } - - /** - * Get a list of traits adaptations from a node of kind ast\AST_TRAIT_ADAPTATIONS - * (with fully qualified names and `as`/`instead` info) - * - * @param array<int,FullyQualifiedClassName> $trait_fqsen_list TODO: use this for sanity check - * - * @return array<string,TraitAdaptations> maps the lowercase trait fqsen to the corresponding adaptations. - * - * @throws UnanalyzableException (should be caught and emitted as an issue) - */ - public function getTraitAdaptationsMap(array $trait_fqsen_list) : array - { - if (!($this->node instanceof Node)) { - return []; - } - - // NOTE: This fetches fully qualified names more than needed, - // but this isn't optimized, since traits aren't frequently used in classes. - - $adaptations_map = []; - foreach ($trait_fqsen_list as $trait_fqsen) { - $adaptations_map[\strtolower($trait_fqsen->__toString())] = new TraitAdaptations($trait_fqsen); - } - - foreach ($this->node->children as $adaptation_node) { - if (!$adaptation_node instanceof Node) { - throw new AssertionError('Expected adaptation_node to be Node'); - } - if ($adaptation_node->kind === ast\AST_TRAIT_ALIAS) { - $this->handleTraitAlias($adaptations_map, $adaptation_node); - } elseif ($adaptation_node->kind === ast\AST_TRAIT_PRECEDENCE) { - $this->handleTraitPrecedence($adaptations_map, $adaptation_node); - } else { - throw new AssertionError("Unknown adaptation node kind " . $adaptation_node->kind); - } - } - return $adaptations_map; - } - - /** - * Handles a node of kind ast\AST_TRAIT_ALIAS, modifying the corresponding TraitAdaptations instance - * @param array<string,TraitAdaptations> $adaptations_map - * @param Node $adaptation_node - * @return void - */ - private function handleTraitAlias(array $adaptations_map, Node $adaptation_node) - { - $trait_method_node = $adaptation_node->children['method']; - $trait_original_class_name_node = $trait_method_node->children['class']; - $trait_original_method_name = $trait_method_node->children['method']; - $trait_new_method_name = $adaptation_node->children['alias'] ?? $trait_original_method_name; - if (!\is_string($trait_original_method_name)) { - $this->emitIssue( - Issue::InvalidTraitUse, - $trait_original_class_name_node->lineno ?? 0, - "Expected original method name of a trait use to be a string" - ); - return; - } - if (!\is_string($trait_new_method_name)) { - $this->emitIssue( - Issue::InvalidTraitUse, - $trait_original_class_name_node->lineno ?? 0, - "Expected new method name of a trait use to be a string" - ); - return; - } - try { - $trait_fqsen = (new ContextNode( - $this->code_base, - $this->context, - $trait_original_class_name_node - ))->getTraitFQSEN($adaptations_map); - } catch (FQSENException $e) { - $this->emitIssue( - Issue::InvalidTraitUse, - $trait_original_class_name_node->lineno ?? 0, - $e->getMessage() - ); - return; - } - if ($trait_fqsen === null) { - // TODO: try to analyze this rare special case instead of giving up in a subsequent PR? - // E.g. `use A, B{foo as bar}` is valid PHP, but hard to analyze. - $this->emitIssue( - Issue::AmbiguousTraitAliasSource, - $trait_method_node->lineno ?? 0, - $trait_new_method_name, - $trait_original_method_name, - '[' . implode(', ', \array_map(static function (TraitAdaptations $t) : string { - return (string) $t->getTraitFQSEN(); - }, $adaptations_map)) . ']' - ); - return; - } - - $fqsen_key = \strtolower($trait_fqsen->__toString()); - - $adaptations_info = $adaptations_map[$fqsen_key] ?? null; - if ($adaptations_info === null) { - // This will probably correspond to a PHP fatal error, but keep going anyway. - $this->emitIssue( - Issue::RequiredTraitNotAdded, - $trait_original_class_name_node->lineno ?? 0, - $trait_fqsen->__toString() - ); - return; - } - // TODO: Could check for duplicate alias method occurrences, but `php -l` would do that for you in some cases - $adaptations_info->alias_methods[$trait_new_method_name] = new TraitAliasSource($trait_original_method_name, $adaptation_node->lineno ?? 0, $adaptation_node->flags ?? 0); - // Handle `use MyTrait { myMethod as private; }` by skipping the original method. - // TODO: Do this a cleaner way. - if (strcasecmp($trait_new_method_name, $trait_original_method_name) === 0) { - $adaptations_info->hidden_methods[\strtolower($trait_original_method_name)] = true; - } - } - - /** - * @param string|int|float|bool|Type|UnionType|FQSEN ...$parameters - * Template parameters for the issue's error message. - * If these are objects, they should define __toString() - */ - private function emitIssue( - string $issue_type, - int $lineno, - ...$parameters - ) { - Issue::maybeEmit( - $this->code_base, - $this->context, - $issue_type, - $lineno, - ...$parameters - ); - } - - /** - * Handles a node of kind ast\AST_TRAIT_PRECEDENCE, modifying the corresponding TraitAdaptations instance - * @param array<string,TraitAdaptations> $adaptations_map - * @param Node $adaptation_node - * @return void - * @throws UnanalyzableException (should be caught and emitted as an issue) - */ - private function handleTraitPrecedence(array $adaptations_map, Node $adaptation_node) - { - // TODO: Should also verify that the original method exists, in a future PR? - $trait_method_node = $adaptation_node->children['method']; - // $trait_chosen_class_name_node = $trait_method_node->children['class']; - $trait_chosen_method_name = $trait_method_node->children['method']; - $trait_chosen_class_name_node = $trait_method_node->children['class']; - if (!is_string($trait_chosen_method_name)) { - $this->emitIssue( - Issue::InvalidTraitUse, - $trait_method_node->lineno ?? 0, - "Expected the insteadof method's name to be a string" - ); - return; - } - - try { - $trait_chosen_fqsen = (new ContextNode( - $this->code_base, - $this->context, - $trait_chosen_class_name_node - ))->getTraitFQSEN($adaptations_map); - } catch (FQSENException $e) { - $this->emitIssue( - Issue::InvalidTraitUse, - $trait_method_node->lineno ?? 0, - $e->getMessage() - ); - return; - } - - - if (!$trait_chosen_fqsen) { - throw new UnanalyzableException( - $trait_chosen_class_name_node, - "This shouldn't happen. Could not determine trait fqsen for trait with higher precedence for method $trait_chosen_method_name" - ); - } - - if (($adaptations_map[\strtolower($trait_chosen_fqsen->__toString())] ?? null) === null) { - // This will probably correspond to a PHP fatal error, but keep going anyway. - $this->emitIssue( - Issue::RequiredTraitNotAdded, - $trait_chosen_class_name_node->lineno ?? 0, - $trait_chosen_fqsen->__toString() - ); - } - - // This is the class which will have the method hidden - foreach ($adaptation_node->children['insteadof']->children as $trait_insteadof_class_name) { - try { - $trait_insteadof_fqsen = (new ContextNode( - $this->code_base, - $this->context, - $trait_insteadof_class_name - ))->getTraitFQSEN($adaptations_map); - } catch (\Exception $_) { - $trait_insteadof_fqsen = null; - } - if (!$trait_insteadof_fqsen) { - throw new UnanalyzableException( - $trait_insteadof_class_name, - "This shouldn't happen. Could not determine trait fqsen for trait with lower precedence for method $trait_chosen_method_name" - ); - } - - $fqsen_key = \strtolower($trait_insteadof_fqsen->__toString()); - - $adaptations_info = $adaptations_map[$fqsen_key] ?? null; - if ($adaptations_info === null) { - // TODO: Make this into an issue type - $this->emitIssue( - Issue::RequiredTraitNotAdded, - $trait_insteadof_class_name->lineno ?? 0, - $trait_insteadof_fqsen->__toString() - ); - continue; - } - $adaptations_info->hidden_methods[strtolower($trait_chosen_method_name)] = true; - } - } - - /** - * @return string - * A variable name associated with the given node - * - * TODO: Deprecate this and use more precise ways to locate the desired element - * TODO: Distinguish between the empty string and the lack of a name - */ - public function getVariableName() : string - { - if (!($this->node instanceof Node)) { - return (string)$this->node; - } - - $node = $this->node; - - while (($node instanceof Node) - && ($node->kind != ast\AST_VAR) - && ($node->kind != ast\AST_STATIC) - && ($node->kind != ast\AST_MAGIC_CONST) - ) { - $node = \array_values($node->children)[0] ?? null; - } - - if (!($node instanceof Node)) { - return (string)$node; - } - - $name_node = $node->children['name'] ?? ''; - if ($name_node === '') { - return ''; - } - - if ($name_node instanceof Node) { - // This is nonsense. Give up, but check if it's a type other than int/string. - // (e.g. to catch typos such as $$this->foo = bar;) - try { - $name_node_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $name_node, true); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - return ''; - } - static $int_or_string_type; - if ($int_or_string_type === null) { - $int_or_string_type = new UnionType([StringType::instance(false), IntType::instance(false), NullType::instance(false)]); - } - if (!$name_node_type->canCastToUnionType($int_or_string_type)) { - $this->emitIssue(Issue::TypeSuspiciousIndirectVariable, $name_node->lineno ?? 0, (string)$name_node_type); - } - - // return empty string on failure. - return (string)$name_node_type->asSingleScalarValueOrNull(); - } - - return (string)$name_node; - } - - /** - * @return UnionType the union type of the class for this class node. (Typically has just one Type, but only for kind \ast\AST_NAME) - * @throws FQSENException if class union type is invalid - * @deprecated call UnionTypeVisitor::unionTypeFromClassNode - * @suppress PhanUnreferencedPublicMethod - */ - public function getClassUnionType() : UnionType - { - return UnionTypeVisitor::unionTypeFromClassNode( - $this->code_base, - $this->context, - $this->node - ); - } - - // Constants for getClassList() API - const CLASS_LIST_ACCEPT_ANY = 0; - const CLASS_LIST_ACCEPT_OBJECT = 1; - const CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME = 2; - - /** - * @return array{0:UnionType,1:Clazz[]} - * @throws CodeBaseException if $ignore_missing_classes == false - */ - public function getClassListInner(bool $ignore_missing_classes) - { - $node = $this->node; - if (!($node instanceof Node)) { - if (\is_string($node)) { - return [LiteralStringType::instanceForValue($node, false)->asUnionType(), []]; - } - return [UnionType::empty(), []]; - } - $context = $this->context; - $node_id = \spl_object_id($node); - - $cached_result = $context->getCachedClassListOfNode($node_id); - if ($cached_result) { - // About 25% of requests are cache hits - return $cached_result; - } - $code_base = $this->code_base; - try { - $union_type = UnionTypeVisitor::unionTypeFromClassNode( - $code_base, - $context, - $node - ); - } catch (FQSENException $e) { - $this->emitIssue( - $e instanceof EmptyFQSENException ? Issue::EmptyFQSENInClasslike : Issue::InvalidFQSENInClasslike, - $this->node->lineno ?? $context->getLineNumberStart(), - $e->getFQSEN() - ); - $union_type = UnionType::empty(); - } - if ($union_type->isEmpty()) { - $result = [$union_type, []]; - $context->setCachedClassListOfNode($node_id, $result); - return $result; - } - - $class_list = []; - if ($ignore_missing_classes) { - try { - // TODO: Not sure why iterator_to_array would cause a test failure - foreach ($union_type->asClassList( - $code_base, - $context - ) as $clazz) { - $class_list[] = $clazz; - } - $result = [$union_type, $class_list]; - $context->setCachedClassListOfNode($node_id, $result); - return $result; - } catch (CodeBaseException $_) { - // swallow it - // TODO: Is it appropriate to return class_list - return [$union_type, $class_list]; - } - } - foreach ($union_type->asClassList( - $code_base, - $context - ) as $clazz) { - $class_list[] = $clazz; - } - $result = [$union_type, $class_list]; - $context->setCachedClassListOfNode($node_id, $result); - return $result; - } - /** - * @param bool $ignore_missing_classes - * If set to true, missing classes will be ignored and - * exceptions will be inhibited - * - * @param int $expected_type_categories - * Does not affect the returned classes, but will cause phan to emit issues. Does not emit by default. - * If set to CLASS_LIST_ACCEPT_ANY, this will not warn. - * If set to CLASS_LIST_ACCEPT_OBJECT, this will warn if the inferred type is exclusively non-object types. - * If set to CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME, this will warn if the inferred type is exclusively non-object and non-string types. - * - * @param ?string $custom_issue_type - * If this exists, emit the given issue type (passing in the class's union type as format arg) instead of the default issue type. - * The issue type passed in must have exactly one template string parameter (e.g. {CLASS}, {TYPE}) - * - * @return array<int,Clazz> - * A list of classes representing the non-native types - * associated with the given node - * - * @throws CodeBaseException - * An exception is thrown if a non-native type does not have - * an associated class - * - * @throws IssueException - * An exception is thrown if fetching the requested class name - * would trigger an issue (e.g. Issue::ContextNotObject) - */ - public function getClassList(bool $ignore_missing_classes = false, int $expected_type_categories = self::CLASS_LIST_ACCEPT_ANY, string $custom_issue_type = null) : array - { - list($union_type, $class_list) = $this->getClassListInner($ignore_missing_classes); - if ($union_type->isEmpty()) { - return []; - } - - // TODO: Should this check that count($class_list) > 0 instead? Or just always check? - if (\count($class_list) === 0 && $expected_type_categories !== self::CLASS_LIST_ACCEPT_ANY) { - if (!$union_type->hasTypeMatchingCallback(static function (Type $type) use ($expected_type_categories) : bool { - return $type->isObject() || ($type instanceof MixedType) || ($expected_type_categories === self::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME && $type instanceof StringType); - })) { - if ($custom_issue_type === Issue::TypeExpectedObjectPropAccess) { - if ($union_type->isType(NullType::instance(false))) { - $custom_issue_type = Issue::TypeExpectedObjectPropAccessButGotNull; - } - } - $this->emitIssue( - $custom_issue_type ?? ($expected_type_categories === self::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME ? Issue::TypeExpectedObjectOrClassName : Issue::TypeExpectedObject), - $this->node->lineno ?? 0, - (string)$union_type->asNonLiteralType() - ); - } elseif ($expected_type_categories === self::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME) { - foreach ($union_type->getTypeSet() as $type) { - if ($type instanceof LiteralStringType) { - $type_value = $type->getValue(); - try { - $fqsen = FullyQualifiedClassName::fromFullyQualifiedString($type_value); - if ($this->code_base->hasClassWithFQSEN($fqsen)) { - $class_list[] = $this->code_base->getClassByFQSEN($fqsen); - } else { - $this->emitIssue( - Issue::UndeclaredClass, - $this->node->lineno ?? $this->context->getLineNumberStart(), - (string)$fqsen - ); - } - } catch (FQSENException $e) { - $this->emitIssue( - $e instanceof EmptyFQSENException ? Issue::EmptyFQSENInClasslike : Issue::InvalidFQSENInClasslike, - $this->node->lineno ?? $this->context->getLineNumberStart(), - $e->getFQSEN() - ); - } - } - } - } - } - - return $class_list; - } - - /** - * @param Node|string $method_name - * Either then name of the method or a node that - * produces the name of the method. - * - * @param bool $is_static - * Set to true if this is a static method call - * - * @param bool $is_direct - * Set to true if this is directly invoking the method (guaranteed not to be special syntax) - * - * @param bool $is_new_expression - * Set to true if this is (new (expr)()) - * - * @return Method - * A method with the given name on the class referenced - * from the given node - * - * @throws NodeException - * An exception is thrown if we can't understand the node - * - * @throws CodeBaseException - * An exception is thrown if we can't find the given - * method - * - * @throws IssueException - */ - public function getMethod( - $method_name, - bool $is_static, - bool $is_direct = false, - bool $is_new_expression = false - ) : Method { - - if ($method_name instanceof Node) { - $method_name_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $method_name - ); - foreach ($method_name_type->getTypeSet() as $type) { - if ($type instanceof LiteralStringType) { - // TODO: Warn about nullable? - return $this->getMethod($type->getValue(), $is_static, $is_direct, $is_new_expression); - } - } - // The method_name turned out to be a variable. - // There isn't much we can do to figure out what - // it's referring to. - throw new NodeException( - $method_name, - "Unexpected method node" - ); - } - - if (!\is_string($method_name)) { - throw new AssertionError("Method name must be a string. Found non-string in context."); - } - - $node = $this->node; - if (!($node instanceof Node)) { - throw new AssertionError('$node must be a node'); - } - - try { - // Fetch the list of valid classes, and warn about any undefined classes. - // (We have more specific issue types such as PhanNonClassMethodCall below, don't emit PhanTypeExpected*) - $class_list = (new ContextNode( - $this->code_base, - $this->context, - $node->children['expr'] - ?? $node->children['class'] - ))->getClassList(false, $is_new_expression ? self::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME : self::CLASS_LIST_ACCEPT_ANY); - } catch (CodeBaseException $exception) { - $exception_fqsen = $exception->getFQSEN(); - throw new IssueException( - Issue::fromType(Issue::UndeclaredClassMethod)( - $this->context->getFile(), - $node->lineno, - [$method_name, (string)$exception_fqsen], - ($exception_fqsen instanceof FullyQualifiedClassName - ? IssueFixSuggester::suggestSimilarClassForMethod($this->code_base, $this->context, $exception_fqsen, $method_name, $is_static) - : null) - ) - ); - } - - // If there were no classes on the left-type, figure - // out what we were trying to call the method on - // and send out an error. - if (\count($class_list) === 0) { - try { - $union_type = UnionTypeVisitor::unionTypeFromClassNode( - $this->code_base, - $this->context, - $node->children['expr'] - ?? $node->children['class'] - ); - } catch (FQSENException $e) { - throw new IssueException( - Issue::fromType($e instanceof EmptyFQSENException ? Issue::EmptyFQSENInClasslike : Issue::InvalidFQSENInClasslike)( - $this->context->getFile(), - $node->lineno, - [$e->getFQSEN()] - ) - ); - } - - if (!$union_type->isEmpty() - && $union_type->isNativeType() - && !$union_type->hasAnyType([ - MixedType::instance(false), - ObjectType::instance(false), - ]) - // reject `$stringVar->method()` but not `$stringVar::method()` and not (`new $stringVar()` - && !(($is_static || $is_new_expression) && $union_type->hasNonNullStringType()) - && !( - Config::get_null_casts_as_any_type() - && $union_type->hasType(NullType::instance(false)) - ) - ) { - throw new IssueException( - Issue::fromType(Issue::NonClassMethodCall)( - $this->context->getFile(), - $node->lineno, - [ $method_name, (string)$union_type ] - ) - ); - } - - throw new NodeException( - $node, - "Can't figure out method call for $method_name" - ); - } - - // Hunt to see if any of them have the method we're - // looking for - foreach ($class_list as $class) { - if ($class->hasMethodWithName($this->code_base, $method_name, $is_direct)) { - $method = $class->getMethodByName( - $this->code_base, - $method_name - ); - if ($method->hasTemplateType()) { - try { - return $method->resolveTemplateType( - $this->code_base, - UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $node->children['expr'] ?? $node->children['class']) - ); - } catch (RecursionDepthException $_) { - } - } - return $method; - } elseif (!$is_static && $class->allowsCallingUndeclaredInstanceMethod($this->code_base)) { - return $class->getCallMethod($this->code_base); - } elseif ($is_static && $class->allowsCallingUndeclaredStaticMethod($this->code_base)) { - return $class->getCallStaticMethod($this->code_base); - } - } - - $first_class = $class_list[0]; - - // Figure out an FQSEN for the method we couldn't find - $method_fqsen = FullyQualifiedMethodName::make( - $first_class->getFQSEN(), - $method_name - ); - - if ($is_static) { - throw new IssueException( - Issue::fromType(Issue::UndeclaredStaticMethod)( - $this->context->getFile(), - $node->lineno, - [ (string)$method_fqsen ], - IssueFixSuggester::suggestSimilarMethod($this->code_base, $this->context, $first_class, $method_name, $is_static) - ) - ); - } - - throw new IssueException( - Issue::fromType(Issue::UndeclaredMethod)( - $this->context->getFile(), - $node->lineno, - [ (string)$method_fqsen ], - IssueFixSuggester::suggestSimilarMethod($this->code_base, $this->context, $first_class, $method_name, $is_static) - ) - ); - } - - /** - * Yields a list of FunctionInterface objects for the 'expr' of an AST_CALL. - * @return iterable<void, FunctionInterface, void, void> - */ - public function getFunctionFromNode() - { - $expression = $this->node; - if (!($expression instanceof Node)) { - if (!\is_string($expression)) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeInvalidCallable, - $this->context->getLineNumberStart(), - (string)$expression - ); - } - // TODO: this might need to account for 'myFunction'() - return []; - } - if ($expression->kind == ast\AST_NAME) { - $name = $expression->children['name']; - try { - return [ - $this->getFunction($name), - ]; - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - } catch (FQSENException $exception) { - Issue::maybeEmit( - $this->code_base, - $this->context, - $exception instanceof EmptyFQSENException ? Issue::EmptyFQSENInCallable : Issue::InvalidFQSENInCallable, - $expression->lineno, - $exception->getFQSEN() - ); - } - return []; - } - // The least common case: A dynamic function call such as $x(), (self::$x)(), etc. - return $this->getFunctionLikeFromDynamicExpression(); - } - - /** - * Yields a list of FunctionInterface objects for the 'expr' of an AST_CALL. - * Precondition: expr->kind !== ast\AST_NAME - * - * @return \Generator<void, FunctionInterface, void, void> - */ - private function getFunctionLikeFromDynamicExpression() - { - $code_base = $this->code_base; - $context = $this->context; - $expression = $this->node; - $union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $expression); - if ($union_type->isEmpty()) { - return; - } - - $has_type = false; - foreach ($union_type->getTypeSet() as $type) { - $func = $type->asFunctionInterfaceOrNull($code_base, $context); - if ($func) { - yield $func; - $has_type = true; - } - } - if (!$has_type) { - if (!$union_type->hasPossiblyCallableType()) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeInvalidCallable, - $expression->lineno, - $union_type - ); - return; - } - } - if (Config::get_strict_method_checking() && $union_type->containsDefiniteNonCallableType()) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypePossiblyInvalidCallable, - $expression->lineno, - $union_type - ); - } - } - - /** - * @throws IssueException for PhanUndeclaredFunction to be caught and reported by the caller - */ - private function throwUndeclaredFunctionIssueException(FullyQualifiedFunctionName $function_fqsen, bool $suggest_in_global_namespace, FullyQualifiedFunctionName $namespaced_function_fqsen = null) - { - throw new IssueException( - Issue::fromType(Issue::UndeclaredFunction)( - $this->context->getFile(), - $this->node->lineno ?? $this->context->getLineNumberStart(), - [ "$function_fqsen()" ], - IssueFixSuggester::suggestSimilarGlobalFunction($this->code_base, $this->context, $namespaced_function_fqsen ?? $function_fqsen, $suggest_in_global_namespace) - ) - ); - } - - /** - * @param string $function_name - * The name of the function we'd like to look up - * - * @param bool $is_function_declaration - * This must be set to true if we're getting a function - * that is being declared and false if we're getting a - * function being called. - * - * @return FunctionInterface - * A method with the given name in the given context - * - * @throws IssueException - * An exception is thrown if we can't find the given - * function - * - * @throws FQSENException - * An exception is thrown if the FQSEN being requested - * was determined but was invalid/empty - */ - public function getFunction( - string $function_name, - bool $is_function_declaration = false - ) : FunctionInterface { - - $node = $this->node; - if (!($node instanceof Node)) { - throw new AssertionError('$this->node must be a node'); - } - $code_base = $this->code_base; - $context = $this->context; - $namespace = $context->getNamespace(); - $flags = $node->flags; - // TODO: support namespace aliases for functions - if ($is_function_declaration) { - $function_fqsen = FullyQualifiedFunctionName::make($namespace, $function_name); - if ($code_base->hasFunctionWithFQSEN($function_fqsen)) { - return $code_base->getFunctionByFQSEN($function_fqsen); - } - } elseif (($flags & ast\flags\NAME_RELATIVE) !== 0) { - // For relative functions (e.g. namespace\foo()) - $function_fqsen = FullyQualifiedFunctionName::make($namespace, $function_name); - if (!$code_base->hasFunctionWithFQSEN($function_fqsen)) { - $this->throwUndeclaredFunctionIssueException($function_fqsen, false); - } - return $code_base->getFunctionByFQSEN($function_fqsen); - } else { - if (($flags & ast\flags\NAME_NOT_FQ) !== 0) { - if ($context->hasNamespaceMapFor(\ast\flags\USE_FUNCTION, $function_name)) { - // If we already have `use function function_name;` - $function_fqsen = $context->getNamespaceMapFor(\ast\flags\USE_FUNCTION, $function_name); - if (!($function_fqsen instanceof FullyQualifiedFunctionName)) { - throw new AssertionError("Expected to fetch a fully qualified function name for this namespace use"); - } - - // Make sure the method we're calling actually exists - if (!$code_base->hasFunctionWithFQSEN($function_fqsen)) { - // The FQSEN from 'use MyNS\function_name;' was the only possible fqsen for that function. - $this->throwUndeclaredFunctionIssueException($function_fqsen, false); - } - - return $code_base->getFunctionByFQSEN($function_fqsen); - } - // For relative and non-fully qualified functions (e.g. namespace\foo(), foo()) - $function_fqsen = FullyQualifiedFunctionName::make($namespace, $function_name); - - if ($code_base->hasFunctionWithFQSEN($function_fqsen)) { - return $code_base->getFunctionByFQSEN($function_fqsen); - } - if ($namespace === '' || \strpos($function_name, '\\') !== false) { - throw new IssueException( - Issue::fromType(Issue::UndeclaredFunction)( - $context->getFile(), - $node->lineno, - [ "$function_fqsen()" ], - IssueFixSuggester::suggestSimilarGlobalFunction($this->code_base, $context, $function_fqsen) - ) - ); - } - // If it doesn't exist in the local namespace, try it - // in the global namespace - } - $function_fqsen = - FullyQualifiedFunctionName::make( - '', - $function_name - ); - } - - // Make sure the method we're calling actually exists - if (!$code_base->hasFunctionWithFQSEN($function_fqsen)) { - $not_fully_qualified = (bool)($flags & ast\flags\NAME_NOT_FQ); - $this->throwUndeclaredFunctionIssueException( - $function_fqsen, - !$not_fully_qualified, - $not_fully_qualified ? FullyQualifiedFunctionName::make($namespace, $function_name) : $function_fqsen - ); - } - - return $code_base->getFunctionByFQSEN($function_fqsen); - } - - /** - * @return Variable - * A variable in scope or a new variable - * - * @throws NodeException - * An exception is thrown if we can't understand the node - * - * @throws IssueException - * An IssueException is thrown if the variable doesn't - * exist - */ - public function getVariable() : Variable - { - $node = $this->node; - if (!($node instanceof Node)) { - throw new AssertionError('$this->node must be a node'); - } - - // Get the name of the variable - $variable_name = $this->getVariableName(); - - if ($variable_name === '') { - throw new NodeException( - $node, - "Variable name not found" - ); - } - - // Check to see if the variable exists in this scope - if (!$this->context->getScope()->hasVariableWithName($variable_name)) { - if (Variable::isHardcodedVariableInScopeWithName($variable_name, $this->context->isInGlobalScope())) { - // We return a clone of the global or superglobal variable - // that can't be used to influence the type of that superglobal in other files. - return new Variable( - $this->context, - $variable_name, - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable - Variable::getUnionTypeOfHardcodedGlobalVariableWithName($variable_name), - 0 - ); - } - throw new IssueException( - Issue::fromType(Issue::UndeclaredVariable)( - $this->context->getFile(), - $node->lineno, - [ $variable_name ], - IssueFixSuggester::suggestVariableTypoFix($this->code_base, $this->context, $variable_name) - ) - ); - } - - return $this->context->getScope()->getVariableByName( - $variable_name - ); - } - - /** - * @return Variable - * A variable in scope - * - * @throws NodeException - * An exception is thrown if we can't understand the node - * - * @throws IssueException - * An IssueException is thrown if the variable doesn't - * exist - */ - public function getVariableStrict() : Variable - { - $node = $this->node; - if (!($node instanceof Node)) { - throw new AssertionError('$this->node must be a node'); - } - - if ($node->kind === ast\AST_VAR) { - $variable_name = $node->children['name']; - - if (!is_string($variable_name)) { - throw new NodeException( - $node, - "Variable name not found" - ); - } - - // Check to see if the variable exists in this scope - $scope = $this->context->getScope(); - if (!$scope->hasVariableWithName($variable_name)) { - if (Variable::isHardcodedVariableInScopeWithName($variable_name, $this->context->isInGlobalScope())) { - // We return a clone of the global or superglobal variable - // that can't be used to influence the type of that superglobal in other files. - return new Variable( - $this->context, - $variable_name, - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable - Variable::getUnionTypeOfHardcodedGlobalVariableWithName($variable_name), - 0 - ); - } - throw new IssueException( - Issue::fromType(Issue::UndeclaredVariable)( - $this->context->getFile(), - $node->lineno, - [ $variable_name ], - IssueFixSuggester::suggestVariableTypoFix($this->code_base, $this->context, $variable_name) - ) - ); - } - - return $scope->getVariableByName( - $variable_name - ); - } - throw new NodeException($node, 'Not a variable node'); - } - - /** - * @return Variable - * A variable in scope or a new variable - * - * @throws NodeException - * An exception is thrown if we can't understand the node - * - * @unused - * @suppress PhanUnreferencedPublicMethod - * @see self::getOrCreateVariableForReferenceParameter() - That is probably what you want instead. - */ - public function getOrCreateVariable() : Variable - { - try { - return $this->getVariable(); - } catch (IssueException $_) { - // Swallow it - } - - $node = $this->node; - if (!($node instanceof Node)) { - throw new AssertionError('$this->node must be a node'); - } - - // Create a new variable - $variable = Variable::fromNodeInContext( - $node, - $this->context, - $this->code_base, - false - ); - - $this->context->addScopeVariable($variable); - - return $variable; - } - - /** - * @param Parameter $parameter the parameter types inferred from combination of real and union type - * - * @param ?Parameter $real_parameter the real parameter type from the type signature - * - * @return Variable - * A variable in scope or a new variable - * - * @throws NodeException - * An exception is thrown if we can't understand the node - */ - public function getOrCreateVariableForReferenceParameter(Parameter $parameter, $real_parameter) : Variable - { - try { - return $this->getVariable(); - } catch (IssueException $_) { - // Swallow it - } - - $node = $this->node; - if (!($node instanceof Node)) { - throw new AssertionError('$this->node must be a node'); - } - - // Create a new variable - $variable = Variable::fromNodeInContext( - $node, - $this->context, - $this->code_base, - false - ); - static $null_type = null; - if ($null_type === null) { - $null_type = NullType::instance(false)->asUnionType(); - } - if ($parameter->getReferenceType() === Parameter::REFERENCE_READ_WRITE || - ($real_parameter && !$real_parameter->getNonVariadicUnionType()->containsNullableOrIsEmpty())) { - // If this is a variable that is both read and written, - // then set the previously undefined variable type to null instead so we can type check it - // (e.g. arguments to array_shift()) - // - // Also, if this has a real type signature that would make PHP throw a TypeError when passed null, then set this to null so the type checker will emit a warning (#1344) - // - // (TODO: read/writeable is currently only possible to annotate for internal functions in FunctionSignatureMap.php), - - // TODO: How should this handle variadic references? - $variable->setUnionType($null_type); - } - - $this->context->addScopeVariable($variable); - - return $variable; - } - - /** - * @param bool $is_static - * True if we're looking for a static property, - * false if we're looking for an instance property. - * - * @return Property - * A variable in scope or a new variable - * - * @throws NodeException - * An exception is thrown if we can't understand the node - * - * @throws IssueException - * An exception is thrown if we can't find the given - * class or if we don't have access to the property (its - * private or protected) - * or if the property is static and missing. - * - * @throws UnanalyzableException - * An exception is thrown if we hit a construct in which - * we can't determine if the property exists or not - */ - public function getProperty( - bool $is_static - ) : Property { - $node = $this->node; - - if (!($node instanceof Node)) { - throw new AssertionError('$this->node must be a node'); - } - - $property_name = $node->children['prop']; - - // Give up for things like C::$prop_name - if (!\is_string($property_name)) { - if ($property_name instanceof Node) { - $property_name = UnionTypeVisitor::anyStringLiteralForNode($this->code_base, $this->context, $property_name); - } else { - $property_name = (string)$property_name; - } - if (!\is_string($property_name)) { - throw $this->createExceptionForInvalidPropertyName($node, $is_static); - } - } - - $class_fqsen = null; - - try { - $expected_type_categories = $is_static ? self::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME : self::CLASS_LIST_ACCEPT_OBJECT; - $expected_issue = $is_static ? Issue::TypeExpectedObjectStaticPropAccess : Issue::TypeExpectedObjectPropAccess; - $class_list = (new ContextNode( - $this->code_base, - $this->context, - $node->children['expr'] ?? - $node->children['class'] - ))->getClassList(false, $expected_type_categories, $expected_issue); - } catch (CodeBaseException $exception) { - $exception_fqsen = $exception->getFQSEN(); - if ($exception_fqsen instanceof FullyQualifiedClassName) { - throw new IssueException( - Issue::fromType($is_static ? Issue::UndeclaredClassStaticProperty : Issue::UndeclaredClassProperty)( - $this->context->getFile(), - $node->lineno, - [ $property_name, $exception_fqsen ] - ) - ); - } - // TODO: Is this ever used? The undeclared property issues should instead be caused by the hasPropertyWithFQSEN checks below. - if ($is_static) { - throw new IssueException( - Issue::fromType(Issue::UndeclaredStaticProperty)( - $this->context->getFile(), - $node->lineno, - [ $property_name, (string)$exception->getFQSEN() ] - ) - ); - } else { - throw new IssueException( - Issue::fromType(Issue::UndeclaredProperty)( - $this->context->getFile(), - $node->lineno, - [ "{$exception->getFQSEN()}->$property_name" ] - ) - ); - } - } - - foreach ($class_list as $class) { - $class_fqsen = $class->getFQSEN(); - - // Keep hunting if this class doesn't have the given - // property - if (!$class->hasPropertyWithName( - $this->code_base, - $property_name - )) { - // (if fetching an instance property) - // If there's a getter on properties then all - // bets are off. However, @phan-forbid-undeclared-magic-properties - // will make this method analyze the code as if all properties were declared or had @property annotations. - if (!$is_static && $class->hasGetMethod($this->code_base) && !$class->getForbidUndeclaredMagicProperties($this->code_base)) { - throw new UnanalyzableException( - $node, - "Can't determine if property {$property_name} exists in class {$class->getFQSEN()} with __get defined" - ); - } - - continue; - } - - $property = $class->getPropertyByNameInContext( - $this->code_base, - $property_name, - $this->context, - $is_static, - $node - ); - - if ($property->isDeprecated()) { - $this->emitIssue( - Issue::DeprecatedProperty, - $node->lineno, - $property->getRepresentationForIssue(), - $property->getFileRef()->getFile(), - $property->getFileRef()->getLineNumberStart() - ); - } - - if ($property->isNSInternal($this->code_base) - && !$property->isNSInternalAccessFromContext( - $this->code_base, - $this->context - ) - ) { - $this->emitIssue( - Issue::AccessPropertyInternal, - $node->lineno, - $property->getRepresentationForIssue(), - $property->getElementNamespace() ?: '\\', - $property->getFileRef()->getFile(), - $property->getFileRef()->getLineNumberStart(), - $this->context->getNamespace() ?: '\\' - ); - } - - return $property; - } - - // Since we didn't find the property on any of the - // possible classes, check for classes with dynamic - // properties - if (!$is_static) { - foreach ($class_list as $class) { - if (Config::getValue('allow_missing_properties') - || $class->getHasDynamicProperties($this->code_base) - ) { - return $class->getPropertyByNameInContext( - $this->code_base, - $property_name, - $this->context, - $is_static, - $node - ); - } - } - } - - /* - $std_class_fqsen = - FullyQualifiedClassName::getStdClassFQSEN(); - - // If missing properties are cool, create it on - // the first class we found - if (!$is_static && ($class_fqsen && ($class_fqsen === $std_class_fqsen)) - || Config::getValue('allow_missing_properties') - ) { - if (count($class_list) > 0) { - $class = $class_list[0]; - return $class->getPropertyByNameInContext( - $this->code_base, - $property_name, - $this->context, - $is_static, - $node - ); - } - } - */ - - // If the class isn't found, we'll get the message elsewhere - if ($class_fqsen) { - $suggestion = null; - if ($class) { - $suggestion = IssueFixSuggester::suggestSimilarProperty($this->code_base, $this->context, $class, $property_name, $is_static); - } - - if ($is_static) { - throw new IssueException( - Issue::fromType(Issue::UndeclaredStaticProperty)( - $this->context->getFile(), - $node->lineno, - [ $property_name, (string)$class_fqsen ], - $suggestion - ) - ); - } else { - throw new IssueException( - Issue::fromType(Issue::UndeclaredProperty)( - $this->context->getFile(), - $node->lineno, - [ "$class_fqsen->$property_name" ], - $suggestion - ) - ); - } - } - - throw new NodeException( - $node, - "Cannot figure out property from {$this->context}" - ); - } - - /** - * @return NodeException|IssueException - */ - private function createExceptionForInvalidPropertyName(Node $node, bool $is_static) : Exception - { - $property_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $node->children['prop']); - if ($property_type->canCastToUnionType(StringType::instance(false)->asUnionType())) { - // If we know it can be a string, throw a NodeException instead of a specific issue - return new NodeException( - $node, - "Cannot figure out property name" - ); - } - return new IssueException( - Issue::fromType($is_static ? Issue::TypeInvalidStaticPropertyName : Issue::TypeInvalidPropertyName)( - $this->context->getFile(), - $node->lineno, - [$property_type] - ) - ); - } - - /** - * @return Property - * A variable in scope or a new variable - * - * @throws NodeException - * An exception is thrown if we can't understand the node - * - * @throws UnanalyzableException - * An exception is thrown if we can't find the given - * class - * - * @throws CodeBaseException - * An exception is thrown if we can't find the given - * class - * - * @throws IssueException - * An exception is thrown if $is_static, but the property doesn't exist. - */ - public function getOrCreateProperty( - string $property_name, - bool $is_static - ) : Property { - - try { - return $this->getProperty($is_static); - } catch (IssueException $exception) { - if ($is_static) { - throw $exception; - } - // TODO: log types of IssueException that aren't for undeclared properties? - // (in another PR) - - // For instance properties, ignore it, - // because we'll create our own property - } catch (UnanalyzableException $exception) { - if ($is_static) { - throw $exception; - } - // For instance properties, ignore it, - // because we'll create our own property - } - - $node = $this->node; - if (!($node instanceof Node)) { - throw new AssertionError('$this->node must be a node'); - } - - try { - $expected_type_categories = $is_static ? self::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME : self::CLASS_LIST_ACCEPT_OBJECT; - $expected_issue = $is_static ? Issue::TypeExpectedObjectStaticPropAccess : Issue::TypeExpectedObjectPropAccess; - $class_list = (new ContextNode( - $this->code_base, - $this->context, - $node->children['expr'] ?? null - ))->getClassList(false, $expected_type_categories, $expected_issue); - } catch (CodeBaseException $exception) { - throw new IssueException( - Issue::fromType(Issue::UndeclaredClassReference)( - $this->context->getFile(), - $node->lineno, - [ $exception->getFQSEN() ] - ) - ); - } - - $class = \reset($class_list); - - if (!($class instanceof Clazz)) { - // empty list - throw new UnanalyzableException( - $node, - "Could not get class name from node" - ); - } - - $flags = 0; - if ($node->kind == ast\AST_STATIC_PROP) { - $flags |= ast\flags\MODIFIER_STATIC; - } - - $property_fqsen = FullyQualifiedPropertyName::make( - $class->getFQSEN(), - $property_name - ); - - // Otherwise, we'll create it - $property = new Property( - $this->context, - $property_name, - UnionType::empty(), - $flags, - $property_fqsen - ); - - $class->addProperty($this->code_base, $property, new None()); - - return $property; - } - - /** - * @return GlobalConstant - * Get the (non-class) constant associated with this node - * in this context - * - * @throws IssueException - * should be emitted by the caller if caught. - */ - public function getConst() : GlobalConstant - { - $node = $this->node; - if (!$node instanceof Node) { - throw new AssertionError('$node must be a node'); - } - - if ($node->kind !== ast\AST_CONST) { - throw new AssertionError("Node must be of type ast\AST_CONST"); - } - - $constant_name = $node->children['name']->children['name'] ?? null; - if (!\is_string($constant_name)) { - throw new AssertionError("Can't determine constant name"); - } - - $code_base = $this->code_base; - - $constant_name_lower = \strtolower($constant_name); - if ($constant_name_lower === 'true' || $constant_name_lower === 'false' || $constant_name_lower === 'null') { - return $code_base->getGlobalConstantByFQSEN( - // @phan-suppress-next-line PhanThrowTypeMismatchForCall - FullyQualifiedGlobalConstantName::fromFullyQualifiedString( - $constant_name_lower - ) - ); - } - - $context = $this->context; - $flags = $node->children['name']->flags; - try { - if (($flags & ast\flags\NAME_RELATIVE) !== 0) { - $fqsen = FullyQualifiedGlobalConstantName::make($context->getNamespace(), $constant_name); - } elseif (($flags & ast\flags\NAME_NOT_FQ) !== 0) { - if ($context->hasNamespaceMapFor(\ast\flags\USE_CONST, $constant_name)) { - // If we already have `use const CONST_NAME;` - $fqsen = $context->getNamespaceMapFor(\ast\flags\USE_CONST, $constant_name); - if (!($fqsen instanceof FullyQualifiedGlobalConstantName)) { - throw new AssertionError("expected to fetch a fully qualified const name for this namespace use"); - } - - // the fqsen from 'use myns\const_name;' was the only possible fqsen for that const. - } else { - $fqsen = FullyQualifiedGlobalConstantName::make( - $context->getNamespace(), - $constant_name - ); - - if (!$code_base->hasGlobalConstantWithFQSEN($fqsen)) { - if (\strpos($constant_name, '\\') !== false) { - $this->throwUndeclaredGlobalConstantIssueException($code_base, $context, $fqsen); - } - $fqsen = FullyQualifiedGlobalConstantName::fromFullyQualifiedString( - $constant_name - ); - } - } - } else { - // This is a fully qualified constant - $fqsen = FullyQualifiedGlobalConstantName::fromFullyQualifiedString( - $constant_name - ); - } - } catch (FQSENException $e) { - throw new AssertionError("Impossible FQSENException: " . $e->getMessage(), $e); - } - // This is either a fully qualified constant, - // or a relative constant for which nothing was found in the namespace - - if (!$code_base->hasGlobalConstantWithFQSEN($fqsen)) { - $this->throwUndeclaredGlobalConstantIssueException($code_base, $context, $fqsen); - } - - $constant = $code_base->getGlobalConstantByFQSEN($fqsen); - - if ($constant->isNSInternal($code_base) - && !$constant->isNSInternalAccessFromContext( - $code_base, - $context - ) - ) { - // TODO: Refactor and also check namespaced constants - $this->emitIssue( - Issue::AccessConstantInternal, - $node->lineno, - (string)$constant->getFQSEN(), - $constant->getElementNamespace(), - $constant->getFileRef()->getFile(), - $constant->getFileRef()->getLineNumberStart(), - $context->getNamespace() - ); - } - - return $constant; - } - - /** - * @throws IssueException - */ - private function throwUndeclaredGlobalConstantIssueException(CodeBase $code_base, Context $context, FullyQualifiedGlobalConstantName $fqsen) - { - throw new IssueException( - Issue::fromType(Issue::UndeclaredConstant)( - $this->context->getFile(), - $this->node->lineno ?? $context->getLineNumberStart(), - [ $fqsen ], - IssueFixSuggester::suggestSimilarGlobalConstant($code_base, $context, $fqsen) - ) - ); - } - - /** - * @return ClassConstant - * Get the (non-class) constant associated with this node - * in this context - * - * @throws NodeException - * An exception is thrown if we can't understand the node - * - * @throws CodeBaseException - * An exception is thrown if we can't find the given - * class - * - * @throws UnanalyzableException - * An exception is thrown if we hit a construct in which - * we can't determine if the property exists or not - * - * @throws IssueException - * An exception is thrown if an issue is found while getting - * the list of possible classes. - */ - public function getClassConst() : ClassConstant - { - $node = $this->node; - if (!($node instanceof Node)) { - throw new AssertionError('$this->node must be a node'); - } - - $constant_name = $node->children['const']; - if (!\strcasecmp($constant_name, 'class')) { - $constant_name = 'class'; - } - - $class_fqsen = null; - - try { - $class_list = (new ContextNode( - $this->code_base, - $this->context, - $node->children['class'] - ))->getClassList(false, self::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME); - } catch (CodeBaseException $exception) { - $exception_fqsen = $exception->getFQSEN(); - throw new IssueException( - Issue::fromType(Issue::UndeclaredClassConstant)( - $this->context->getFile(), - $node->lineno, - [$constant_name, (string)$exception_fqsen], - IssueFixSuggester::suggestSimilarClassForGenericFQSEN($this->code_base, $this->context, $exception_fqsen) - ) - ); - } - - foreach ($class_list as $class) { - // Remember the last analyzed class for the next issue message - $class_fqsen = $class->getFQSEN(); - - // Check to see if the class has the constant - if (!$class->hasConstantWithName( - $this->code_base, - $constant_name - )) { - continue; - } - - $constant = $class->getConstantByNameInContext( - $this->code_base, - $constant_name, - $this->context - ); - - if ($constant->isNSInternal($this->code_base) - && !$constant->isNSInternalAccessFromContext( - $this->code_base, - $this->context - ) - ) { - $this->emitIssue( - Issue::AccessClassConstantInternal, - $node->lineno, - (string)$constant->getFQSEN(), - $constant->getFileRef()->getFile(), - $constant->getFileRef()->getLineNumberStart() - ); - } - if ($constant->isDeprecated()) { - $this->emitIssue( - Issue::DeprecatedClassConstant, - $node->lineno, - (string)$constant->getFQSEN(), - $constant->getFileRef()->getFile(), - $constant->getFileRef()->getLineNumberStart() - ); - } - - return $constant; - } - - // If no class is found, we'll emit the error elsewhere - if ($class_fqsen) { - $class_constant_fqsen = FullyQualifiedClassConstantName::make($class_fqsen, $constant_name); - throw new IssueException( - Issue::fromType(Issue::UndeclaredConstant)( - $this->context->getFile(), - $node->lineno, - [ "$class_fqsen::$constant_name" ], - IssueFixSuggester::suggestSimilarClassConstant($this->code_base, $this->context, $class_constant_fqsen) - ) - ); - } - - throw new NodeException( - $node, - "Can't figure out constant {$constant_name} in node" - ); - } - - /** - * @return string - * A unique and stable name for an anonymous class - */ - public function getUnqualifiedNameForAnonymousClass() : string - { - if (!($this->node instanceof Node)) { - throw new AssertionError('$this->node must be a node'); - } - - if (!($this->node->flags & ast\flags\CLASS_ANONYMOUS)) { - throw new AssertionError('Node must be an anonymous class node'); - } - - $class_name = 'anonymous_class_' - . \substr(\md5( - $this->context->getFile() . $this->context->getLineNumberStart() - ), 0, 8); - - return $class_name; - } - - /** - * @return Func - * @throws CodeBaseException if the closure could not be found - */ - public function getClosure() : Func - { - $closure_fqsen = - FullyQualifiedFunctionName::fromClosureInContext( - $this->context, - $this->node - ); - - if (!$this->code_base->hasFunctionWithFQSEN($closure_fqsen)) { - throw new CodeBaseException( - $closure_fqsen, - "Could not find closure $closure_fqsen" - ); - } - - return $this->code_base->getFunctionByFQSEN($closure_fqsen); - } - - /** - * Perform some backwards compatibility checks on a node. - * This ignores union types, and can be run in the parse phase. - * (It often should, because outside quick mode, it may be run multiple times per node) - * - * TODO: This is repetitive, move these checks into ParseVisitor? - * - * @return void - */ - public function analyzeBackwardCompatibility() - { - if (!Config::get_backward_compatibility_checks()) { - return; - } - - if (!($this->node instanceof Node) || !($this->node->children['expr'] ?? false)) { - return; - } - - if ($this->node->kind === ast\AST_STATIC_CALL || - $this->node->kind === ast\AST_METHOD_CALL) { - return; - } - - $llnode = $this->node; - - if ($this->node->kind !== ast\AST_DIM) { - if (!($this->node->children['expr'] instanceof Node)) { - return; - } - - if ($this->node->children['expr']->kind !== ast\AST_DIM) { - (new ContextNode( - $this->code_base, - $this->context, - $this->node->children['expr'] - ))->analyzeBackwardCompatibility(); - return; - } - - $temp = $this->node->children['expr']->children['expr']; - $llnode = $this->node->children['expr']; - $lnode = $temp; - } else { - $temp = $this->node->children['expr']; - $lnode = $temp; - } - - // Strings can have DIMs, it turns out. - if (!($temp instanceof Node)) { - return; - } - - if (!($temp->kind == ast\AST_PROP - || $temp->kind == ast\AST_STATIC_PROP - )) { - return; - } - - while ($temp instanceof Node - && ($temp->kind == ast\AST_PROP - || $temp->kind == ast\AST_STATIC_PROP) - ) { - $llnode = $lnode; - $lnode = $temp; - - // Lets just hope the 0th is the expression - // we want - $temp = \array_values($temp->children)[0]; - } - - if (!($temp instanceof Node)) { - return; - } - - // Foo::$bar['baz'](); is a problem - // Foo::$bar['baz'] is not - if ($lnode->kind === ast\AST_STATIC_PROP - && $this->node->kind !== ast\AST_CALL - ) { - return; - } - - // $this->$bar['baz']; is a problem - // $this->bar['baz'] is not - if ($lnode->kind === ast\AST_PROP - && !($lnode->children['prop'] instanceof Node) - && !($llnode->children['prop'] instanceof Node) - ) { - return; - } - - if (( - ( - $lnode->children['prop'] instanceof Node - && $lnode->children['prop']->kind == ast\AST_VAR - ) - || - ( - ($lnode->children['class'] ?? null) instanceof Node - && ( - $lnode->children['class']->kind == ast\AST_VAR - || $lnode->children['class']->kind == ast\AST_NAME - ) - ) - || - ( - ($lnode->children['expr'] ?? null) instanceof Node - && ( - $lnode->children['expr']->kind == ast\AST_VAR - || $lnode->children['expr']->kind == ast\AST_NAME - ) - ) - ) - && - ( - $temp->kind == ast\AST_VAR - || $temp->kind == ast\AST_NAME - ) - ) { - $cache_entry = FileCache::getOrReadEntry($this->context->getFile()); - $line = $cache_entry->getLine($this->node->lineno) ?? ''; - unset($cache_entry); - if (strpos($line, '}[') === false - && strpos($line, ']}') === false - && strpos($line, '>{') === false - ) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::CompatiblePHP7, - $this->node->lineno - ); - } - } - } - - /** - * @return ?FullyQualifiedClassName - * @throws IssueException if the list of possible classes couldn't be determined. - */ - public function resolveClassNameInContext() - { - // A function argument to resolve into an FQSEN - $arg = $this->node; - - try { - if (\is_string($arg)) { - // Class_alias treats arguments as fully qualified strings. - return FullyQualifiedClassName::fromFullyQualifiedString($arg); - } - if ($arg instanceof Node - && $arg->kind === ast\AST_CLASS_CONST - && \strcasecmp($arg->children['const'], 'class') === 0 - ) { - $class_type = UnionTypeVisitor::unionTypeFromClassNode( - $this->code_base, - $this->context, - $arg->children['class'] - ); - - // If we find a class definition, then return it. There should be 0 or 1. - // (Expressions such as 'int::class' are syntactically valid, but would have 0 results). - foreach ($class_type->asClassFQSENList($this->context) as $class_fqsen) { - return $class_fqsen; - } - } - - $class_name = $this->getEquivalentPHPScalarValue(); - // TODO: Emit - if (\is_string($class_name)) { - return FullyQualifiedClassName::fromFullyQualifiedString($class_name); - } - } catch (FQSENException $e) { - throw new IssueException( - Issue::fromType($e instanceof EmptyFQSENException ? Issue::EmptyFQSENInClasslike : Issue::InvalidFQSENInClasslike)( - $e instanceof EmptyFQSENException ? Issue::EmptyFQSENInClasslike : Issue::InvalidFQSENInClasslike, - $this->node->lineno ?? $this->context->getLineNumberStart(), - [$e->getFQSEN()] - ) - ); - } - - return null; - } - - // Flags for getEquivalentPHPValue - - // Should this attempt to resolve arrays? - const RESOLVE_ARRAYS = (1 << 0); - // Should this attempt to resolve array keys? - const RESOLVE_ARRAY_KEYS = (1 << 1); - // Should this attempt to resolve array values? - const RESOLVE_ARRAY_VALUES = (1 << 2); - // Should this attempt to resolve accesses to constants? - const RESOLVE_CONSTANTS = (1 << 3); - // If resolving array keys fails, should this use a placeholder? - const RESOLVE_KEYS_USE_FALLBACK_PLACEHOLDER = (1 << 4); - // Skip unknown keys - const RESOLVE_KEYS_SKIP_UNKNOWN_KEYS = (1 << 5); - - const RESOLVE_DEFAULT = - self::RESOLVE_ARRAYS | - self::RESOLVE_ARRAY_KEYS | - self::RESOLVE_ARRAY_VALUES | - self::RESOLVE_CONSTANTS | - self::RESOLVE_KEYS_USE_FALLBACK_PLACEHOLDER; - - const RESOLVE_SCALAR_DEFAULT = - self::RESOLVE_CONSTANTS | - self::RESOLVE_KEYS_USE_FALLBACK_PLACEHOLDER; - - /** - * @param int $flags - See self::RESOLVE_* - * @return ?array<mixed,mixed> - returns an array if elements could be resolved. - */ - private function getEquivalentPHPArrayElements(Node $node, int $flags) - { - $elements = []; - foreach ($node->children as $child_node) { - if (!($child_node instanceof Node)) { - self::warnAboutEmptyArrayElements($this->code_base, $this->context, $node); - continue; - } - $key_node = ($flags & self::RESOLVE_ARRAY_KEYS) != 0 ? $child_node->children['key'] : null; - $value_node = $child_node->children['value']; - if (self::RESOLVE_ARRAY_VALUES) { - $value_node = $this->getEquivalentPHPValueForNode($value_node, $flags); - } - // NOTE: this has some overlap with DuplicateKeyPlugin - if ($key_node === null) { - $elements[] = $value_node; - } elseif (\is_scalar($key_node)) { - $elements[$key_node] = $value_node; // Check for float? - } else { - $key = $this->getEquivalentPHPValueForNode($key_node, $flags); - if (\is_scalar($key)) { - $elements[$key] = $value_node; - } else { - if (($flags & self::RESOLVE_KEYS_USE_FALLBACK_PLACEHOLDER) !== 0) { - $elements[] = $value_node; - } else { - // TODO: Alternate strategies? - return null; - } - } - } - } - return $elements; - } - - /** - * @param Node $node a node of kind AST_ARRAY - * @suppress PhanUndeclaredProperty this adds a dynamic property - * @return void - */ - public static function warnAboutEmptyArrayElements(CodeBase $code_base, Context $context, Node $node) - { - if (isset($node->didWarnAboutEmptyArrayElements)) { - return; - } - $node->didWarnAboutEmptyArrayElements = true; - - $lineno = $node->lineno; - foreach ($node->children as $child_node) { - if (!$child_node) { - // Emit the line number of the nearest Node before this empty element - Issue::maybeEmit( - $code_base, - $context, - Issue::SyntaxError, - $lineno, - "Cannot use empty array elements in arrays" - ); - continue; - } - // Update the line number of the nearest Node - $lineno = $child_node->lineno; - } - } - /** - * This converts an AST node in context to the value it represents. - * This is useful for plugins, etc, and will gradually improve. - * - * @see self::getEquivalentPHPValue() - * - * @param Node|float|int|string $node - * @return Node|string[]|int[]|float[]|string|float|int|bool|null - - * If this could be resolved and we're certain of the value, this gets a raw PHP value for $node. - * Otherwise, this returns $node. - */ - public function getEquivalentPHPValueForNode($node, int $flags) - { - if (!($node instanceof Node)) { - return $node; - } - $kind = $node->kind; - if ($kind === ast\AST_ARRAY) { - if (($flags & self::RESOLVE_ARRAYS) === 0) { - return $node; - } - $elements = $this->getEquivalentPHPArrayElements($node, $flags); - if ($elements === null) { - // Attempted to resolve elements but failed at one or more elements. - return $node; - } - return $elements; - } elseif ($kind === ast\AST_CONST) { - $name = $node->children['name']->children['name'] ?? null; - if (\is_string($name)) { - switch (\strtolower($name)) { - case 'false': - return false; - case 'true': - return true; - case 'null': - return null; - } - } - if (($flags & self::RESOLVE_CONSTANTS) === 0) { - return $node; - } - try { - $constant = (new ContextNode($this->code_base, $this->context, $node))->getConst(); - } catch (Exception $_) { - // Is there a need to catch IssueException as well? - return $node; - } - // TODO: Recurse, but don't try to resolve constants again - $new_node = $constant->getNodeForValue(); - if (is_object($new_node)) { - // Avoid infinite recursion, only resolve once - $new_node = (new ContextNode($this->code_base, $constant->getContext(), $new_node))->getEquivalentPHPValueForNode($new_node, $flags & ~self::RESOLVE_CONSTANTS); - } - return $new_node; - } elseif ($kind === ast\AST_CLASS_CONST) { - if (($flags & self::RESOLVE_CONSTANTS) === 0) { - return $node; - } - try { - $constant = (new ContextNode($this->code_base, $this->context, $node))->getClassConst(); - } catch (\Exception $_) { - return $node; - } - // TODO: Recurse, but don't try to resolve constants again - $new_node = $constant->getNodeForValue(); - if (is_object($new_node)) { - // Avoid infinite recursion, only resolve once - $new_node = (new ContextNode($this->code_base, $constant->getContext(), $new_node))->getEquivalentPHPValueForNode($new_node, $flags & ~self::RESOLVE_CONSTANTS); - } - return $new_node; - } elseif ($kind === ast\AST_MAGIC_CONST) { - // TODO: Look into eliminating this - return $this->getValueForMagicConstByNode($node); - } - $node_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node - ); - $value = $node_type->asValueOrNullOrSelf(); - if (\is_object($value)) { - return $node; - } - return $value; - } - - /** - * @return array|string|int|float|bool|null|Node the value of the corresponding PHP constant, - * or the original node if that could not be determined - * @suppress PhanUnreferencedPublicMethod - */ - public function getValueForMagicConst() - { - $node = $this->node; - if (!($node instanceof Node && $node->kind === ast\AST_MAGIC_CONST)) { - throw new AssertionError(__METHOD__ . ' expected AST_MAGIC_CONST'); - } - return $this->getValueForMagicConstByNode($node); - } - - /** - * @return array|string|int|float|bool|null|Node the value of the corresponding PHP constant, - * or the original node if that could not be determined - */ - public function getValueForMagicConstByNode(Node $node) - { - // TODO: clean up or refactor? - $context = $this->context; - $flags = $node->flags; - switch ($flags) { - case ast\flags\MAGIC_CLASS: - if ($context->isInClassScope()) { - return \ltrim($context->getClassFQSEN()->__toString(), '\\'); - } - break; - case ast\flags\MAGIC_FUNCTION: - if ($context->isInFunctionLikeScope()) { - $fqsen = $context->getFunctionLikeFQSEN(); - return $fqsen->isClosure() ? '{closure}' : $fqsen->getName(); - } - break; - case ast\flags\MAGIC_METHOD: - // TODO: Is this right? - if ($context->isInFunctionLikeScope()) { - return \ltrim($context->getFunctionLikeFQSEN()->__toString(), '\\'); - } - break; - case ast\flags\MAGIC_DIR: - return \dirname(Config::projectPath($context->getFile())); - case ast\flags\MAGIC_FILE: - return Config::projectPath($context->getFile()); - case ast\flags\MAGIC_LINE: - return $node->lineno ?? $context->getLineNumberStart(); - case ast\flags\MAGIC_NAMESPACE: - return \ltrim($context->getNamespace(), '\\'); - case ast\flags\MAGIC_TRAIT: - // TODO: Could check if in trait, low importance. - if (!$context->isInClassScope()) { - break; - } - $fqsen = $this->context->getClassFQSEN(); - if ($this->code_base->hasClassWithFQSEN($fqsen)) { - if (!$this->code_base->getClassByFQSEN($fqsen)->isTrait()) { - break; - } - } - return \ltrim($context->getClassFQSEN()->__toString(), '\\'); - default: - return $node; - } - $this->emitIssue( - Issue::UndeclaredMagicConstant, - $node->lineno, - UnionTypeVisitor::MAGIC_CONST_NAME_MAP[$flags] - ); - return ''; - } - - /** - * This converts an AST node in context to the value it represents. - * This is useful for plugins, etc, and will gradually improve. - * - * This does not create new object instances. - * - * @return Node|string[]|int[]|float[]|string|float|int|bool|null - - * If this could be resolved and we're certain of the value, this gets an equivalent definition. - * Otherwise, this returns $node. - */ - public function getEquivalentPHPValue(int $flags = self::RESOLVE_DEFAULT) - { - return $this->getEquivalentPHPValueForNode($this->node, $flags); - } - - /** - * This converts an AST node in context to the value it represents. - * This is useful for plugins, etc, and will gradually improve. - * - * This does not create new object instances. - * - * @return Node|string|float|int|bool|null - - * If this could be resolved and we're certain of the value, this gets an equivalent definition. - * Otherwise, this returns $node. If this would be an array, this returns $node. - * - * @suppress PhanPartialTypeMismatchReturn the flags prevent this from returning an array - */ - public function getEquivalentPHPScalarValue() - { - return $this->getEquivalentPHPValueForNode($this->node, self::RESOLVE_SCALAR_DEFAULT); - } -} diff --git a/vendor/phan/phan/src/Phan/AST/Parser.php b/vendor/phan/phan/src/Phan/AST/Parser.php deleted file mode 100644 index 58c846c..0000000 --- a/vendor/phan/phan/src/Phan/AST/Parser.php +++ /dev/null @@ -1,274 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST; - -use ast\Node; -use CompileError; -use Error; -use ParseError; -use Phan\AST\TolerantASTConverter\ParseException; -use Phan\AST\TolerantASTConverter\ParseResult; -use Phan\AST\TolerantASTConverter\TolerantASTConverter; -use Phan\AST\TolerantASTConverter\TolerantASTConverterWithNodeMapping; -use Phan\CodeBase; -use Phan\Config; -use Phan\Daemon\Request; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Library\Cache; -use Phan\Library\DiskCache; -use Phan\Phan; -use Phan\Plugin\ConfigPluginSet; -use function error_reporting; - -/** - * Parser parses the passed in PHP code based on configuration settings. - * - * It has options for error-tolerant parsing, - * annotating \ast\Nodes with additional information used by the language server - */ -class Parser -{ - /** @var ?Cache<ParseResult> */ - private static $cache = null; - - /** - * Creates a cache if Phan is configured to use caching in the current phase. - * - * @return ?Cache<ParseResult> - */ - private static function maybeGetCache(CodeBase $code_base) - { - if ($code_base->getExpectChangesToFileContents()) { - return null; - } - if (!Config::getValue('cache_polyfill_asts')) { - return null; - } - return self::getCache(); - } - - /** - * @return Cache<ParseResult> - * @suppress PhanPartialTypeMismatchReturn - */ - private static function getCache() : Cache - { - return self::$cache ?? self::$cache = self::makeNewCache(); - } - - /** - * @return DiskCache<ParseResult> - */ - private static function makeNewCache() : DiskCache - { - $igbinary_version = \phpversion('igbinary') ?: ''; - $use_igbinary = \version_compare($igbinary_version, '2.0.5') >= 0; - - $user = \getenv('USERNAME') ?: \getenv('USER'); - $directory = \sys_get_temp_dir() . '/phan'; - if ($user) { - $directory .= "-$user"; - } - return new DiskCache($directory, '-ast', ParseResult::class, $use_igbinary); - } - - /** - * Parses the code. If $suppress_parse_errors is false, this also emits SyntaxError. - * - * @param CodeBase $code_base - * @param Context $context - * @param ?Request $request (A daemon mode request if in daemon mode. May affect the parser used for $file_path) - * @param string $file_path file path for error reporting - * @param string $file_contents file contents to pass to parser. This may deliberately differ from what is currently on disk (e.g. for the language server mode or daemon mode) - * @param bool $suppress_parse_errors (If true, don't emit SyntaxError) - * @return ?Node - * @throws ParseError - * @throws CompileError (possible in php 7.3) - * @throws ParseException - */ - public static function parseCode( - CodeBase $code_base, - Context $context, - $request, - string $file_path, - string $file_contents, - bool $suppress_parse_errors - ) { - try { - // This will choose the parser to use based on the config and $file_path - // (For "Go To Definition", one of the files will have a slower parser which records the requested AST node) - - if (self::shouldUsePolyfill($file_path, $request)) { - // This helper method has its own exception handling. - // It may throw a ParseException, which is unintentionally not caught here. - return self::parseCodePolyfill($code_base, $context, $file_path, $file_contents, $suppress_parse_errors, $request); - } - // Suppress "declare(encoding=...) ignored because Zend multibyte feature is turned off by settings" (#1076) - // E_COMPILE_WARNING can't be caught by a PHP error handler, - // the errors are printed to stderr by default (can't be captured), - // and those errors might mess up language servers, etc. if ever printed to stdout - $original_error_reporting = error_reporting(); - error_reporting($original_error_reporting & ~\E_COMPILE_WARNING); - try { - return \ast\parse_code( - $file_contents, - Config::AST_VERSION, - $file_path - ); - } finally { - error_reporting($original_error_reporting); - } - } catch (ParseError $native_parse_error) { - return self::handleParseError($code_base, $context, $file_path, $file_contents, $suppress_parse_errors, $native_parse_error); - } catch (CompileError $native_parse_error) { - return self::handleParseError($code_base, $context, $file_path, $file_contents, $suppress_parse_errors, $native_parse_error); - } - } - - /** - * Handles ParseError|CompileError. - * This will return a Node or re-throw an error, depending on the configuration and parameters. - * - * This method is written to be compatible with PHP 7.0-7.3. - * - * @param CodeBase $code_base - * @param Context $context - * @param string $file_path file path for error reporting - * @param string $file_contents file contents to pass to parser. May be overridden to ignore what is currently on disk. - * @param ParseError|CompileError $native_parse_error (can be CompileError in 7.3, will be ParseError in most cases) - * @return ?Node - * @throws ParseError most of the time - * @throws CompileError in PHP 7.3+ - */ - public static function handleParseError( - CodeBase $code_base, - Context $context, - string $file_path, - string $file_contents, - bool $suppress_parse_errors, - Error $native_parse_error - ) { - if (!$suppress_parse_errors) { - Issue::maybeEmit( - $code_base, - $context, - Issue::SyntaxError, - $native_parse_error->getLine(), - $native_parse_error->getMessage() - ); - } - if (!Config::getValue('use_fallback_parser')) { - // By default, don't try to re-parse files with syntax errors. - throw $native_parse_error; - } - - // If there's a parse error in a file that's excluded from analysis, give up on parsing it. - // Users might not see the parse error, and ignoring it (e.g. acting as though a file in vendor/ or ext/ - // that can't be parsed has class and function definitions) - // may lead to users not noticing bugs. - if (Phan::isExcludedAnalysisFile($file_path)) { - throw $native_parse_error; - } - // But if the user would see the syntax error, go ahead and retry. - - $converter = new TolerantASTConverter(); - $converter->setPHPVersionId(Config::get_closest_target_php_version_id()); - $converter->setParseAllDocComments(Config::getValue('polyfill_parse_all_element_doc_comments')); - $errors = []; - try { - $node = $converter->parseCodeAsPHPAST($file_contents, Config::AST_VERSION, $errors); - } catch (\Exception $_) { - // Generic fallback. TODO: log. - throw $native_parse_error; - } - // TODO: loop over $errors? - return $node; - } - - /** - * Parses the code. If $suppress_parse_errors is false, this also emits SyntaxError. - * - * @param CodeBase $code_base - * @param Context $context - * @param string $file_path file path for error reporting - * @param string $file_contents file contents to pass to parser. May be overridden to ignore what is currently on disk. - * @param bool $suppress_parse_errors (If true, don't emit SyntaxError) - * @param ?Request $request - May affect the parser used for $file_path - * @return ?Node - * @throws ParseException - */ - public static function parseCodePolyfill(CodeBase $code_base, Context $context, string $file_path, string $file_contents, bool $suppress_parse_errors, $request) - { - $converter = self::createConverter($file_path, $file_contents, $request); - $converter->setPHPVersionId(Config::get_closest_target_php_version_id()); - $converter->setParseAllDocComments(Config::getValue('polyfill_parse_all_element_doc_comments')); - $errors = []; - try { - $node = $converter->parseCodeAsPHPAST($file_contents, Config::AST_VERSION, $errors, self::maybeGetCache($code_base)); - } catch (\Exception $e) { - // Generic fallback. TODO: log. - throw new ParseException('Unexpected Exception of type ' . \get_class($e) . ': ' . $e->getMessage(), 0); - } - foreach ($errors as $diagnostic) { - if ($diagnostic->kind === 0) { - $diagnostic_error_start_line = 1 + \substr_count($file_contents, "\n", 0, $diagnostic->start); - $diagnostic_error_message = 'Fallback parser diagnostic error: ' . $diagnostic->message; - if (!$suppress_parse_errors) { - Issue::maybeEmit( - $code_base, - $context, - Issue::SyntaxError, - $diagnostic_error_start_line, - $diagnostic_error_message - ); - } - if (!Config::getValue('use_fallback_parser')) { - // By default, don't try to re-parse files with syntax errors. - throw new ParseException($diagnostic_error_message, $diagnostic_error_start_line); - } - - // If there's a parse error in a file that's excluded from analysis, give up on parsing it. - // Users might not see the parse error, and ignoring it (e.g. acting as though a file in vendor/ or ext/ - // that can't be parsed has class and function definitions) - // may lead to users not noticing bugs. - if (Phan::isExcludedAnalysisFile($file_path)) { - throw new ParseException($diagnostic_error_message, $diagnostic_error_start_line); - } - } - } - return $node; - } - - private static function shouldUsePolyfill(string $file_path, Request $request = null) : bool - { - if (Config::getValue('use_polyfill_parser')) { - return true; - } - if ($request) { - return $request->shouldUseMappingPolyfill($file_path); - } - return false; - } - - - private static function createConverter(string $file_path, string $file_contents, Request $request = null) : TolerantASTConverter - { - if ($request && $request->shouldUseMappingPolyfill($file_path)) { - // TODO: Rename to something better - $converter = new TolerantASTConverterWithNodeMapping( - $request->getTargetByteOffset($file_contents), - static function (Node $node) { - // @phan-suppress-next-line PhanAccessMethodInternal - ConfigPluginSet::instance()->prepareNodeSelectionPluginForNode($node); - } - ); - if ($request->shouldAddPlaceholdersForPath($file_path)) { - $converter->setShouldAddPlaceholders(true); - } - return $converter; - } - - return new TolerantASTConverter(); - } -} diff --git a/vendor/phan/phan/src/Phan/AST/PhanAnnotationAdder.php b/vendor/phan/phan/src/Phan/AST/PhanAnnotationAdder.php deleted file mode 100644 index 218b266..0000000 --- a/vendor/phan/phan/src/Phan/AST/PhanAnnotationAdder.php +++ /dev/null @@ -1,217 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST; - -use ast; -use ast\flags; -use ast\Node; -use Closure; - -/** - * This adds annotations for Phan analysis to a given node, - * modifying the flags of a node in place. - * This adds custom children ($node->children['phan_nf']) to node types that have a variable number of children or expected values for flags - * - * and returns the new Node. - * The original \ast\Node objects are not modified. - * - * This adds to $node->children - Many AST node kinds can be used in places Phan needs to know about. - * (for being potentially null/undefined) - * - * Current annotations: - * - * 1. Mark $x in isset($x['key']['nested']) as being acceptable to have null offsets. - * Same for $x in $x ?? null, empty($x['offset']), and so on. - * 2. Mark $x and $x['key'] in "$x['key'] = $y" as being acceptable to be null or undefined. - * and so on (e.g. ['key' => $x[0]] = $y) - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class PhanAnnotationAdder -{ - const PHAN_NODE_FLAGS = 'phan_nf'; - - const FLAG_IGNORE_NULLABLE = 1 << 29; - const FLAG_IGNORE_UNDEF = 1 << 30; - - const FLAG_IGNORE_NULLABLE_AND_UNDEF = self::FLAG_IGNORE_UNDEF | self::FLAG_IGNORE_NULLABLE; - - public function __construct() - { - } - - /** @var array<int,Closure(Node):void> maps values of ast\Node->kind to closures that can be used to generate annotations (on the ast\Node instance) for that node kind */ - private static $closures_for_kind; - - /** @return void */ - public static function init() - { - if (\is_array(self::$closures_for_kind)) { - return; - } - self::initInner(); - } - - const FLAGS_NODE_TYPE_SET = [ - ast\AST_VAR => true, - ast\AST_DIM => true, - ast\AST_ASSIGN => true, - ast\AST_ASSIGN_REF => true, - ]; - - /** - * @param array<mixed,Node|string|float|int|null> $children (should all be Nodes or null) - * @param int $bit_set - */ - private static function markArrayElements($children, $bit_set) - { - foreach ($children as $node) { - if ($node instanceof Node) { - $node->flags |= $bit_set; - } - } - } - - /** - * @param Node $node - * @param int $bit_set the bits to add to the flags - */ - private static function markNode($node, $bit_set) - { - $kind = $node->kind; - if (\array_key_exists($kind, self::FLAGS_NODE_TYPE_SET)) { - $node->flags |= $bit_set; - } elseif ($kind === ast\AST_ARRAY) { - // flags and children are single-purpose right now - self::markArrayElements($node->children, $bit_set); - } else { - $node->children[self::PHAN_NODE_FLAGS] = $bit_set; - } - } - - private static function initInner() - { - /** - * @param Node $node - * @return void - */ - $binary_op_handler = static function ($node) { - if ($node->flags === flags\BINARY_COALESCE) { - $inner_node = $node->children['left']; - if ($inner_node instanceof Node) { - self::markNode($inner_node, self::FLAG_IGNORE_NULLABLE_AND_UNDEF); - } - } - }; - /** - * @param Node $node - * @return void - */ - $dim_handler = static function ($node) { - if ($node->flags & self::FLAG_IGNORE_NULLABLE_AND_UNDEF) { - $inner_node = $node->children['expr']; - if ($inner_node instanceof Node) { - self::markNode($inner_node, self::FLAG_IGNORE_NULLABLE_AND_UNDEF); - } - } - }; - - /** - * @param Node $node - * @return void - */ - $ignore_nullable_and_undef_handler = static function ($node) { - $inner_node = $node->children['var']; - if ($inner_node instanceof Node) { - self::markNode($inner_node, self::FLAG_IGNORE_NULLABLE_AND_UNDEF); - } - }; - - /** - * @param Node $node - * @return void - */ - $ignore_nullable_and_undef_expr_handler = static function ($node) { - $inner_node = $node->children['expr']; - if ($inner_node instanceof Node) { - self::markNode($inner_node, self::FLAG_IGNORE_NULLABLE_AND_UNDEF); - } - }; - /** - * @param Node $node - * @return void - */ - $ast_array_elem_handler = static function ($node) { - // Handle [$a1, $a2] = $array; - Don't warn about $node - $bit = $node->flags & self::FLAG_IGNORE_UNDEF; - if ($bit) { - $inner_node = $node->children['value']; - if (($inner_node instanceof Node)) { - self::markNode($inner_node, $bit); - } - } - }; - - self::$closures_for_kind = [ - ast\AST_BINARY_OP => $binary_op_handler, - ast\AST_DIM => $dim_handler, - ast\AST_EMPTY => $ignore_nullable_and_undef_expr_handler, - ast\AST_ISSET => $ignore_nullable_and_undef_handler, - ast\AST_UNSET => $ignore_nullable_and_undef_handler, - ast\AST_ASSIGN => $ignore_nullable_and_undef_handler, - ast\AST_ASSIGN_REF => $ignore_nullable_and_undef_handler, - // Skip over AST_ARRAY - ast\AST_ARRAY_ELEM => $ast_array_elem_handler, - ]; - } - - /** - * @param Node|array|int|string|float|bool|null $node - * @return void - */ - public static function applyFull($node) - { - if ($node instanceof Node) { - $closure = self::$closures_for_kind[$node->kind] ?? null; - if ($closure !== null) { - $closure($node); - } - foreach ($node->children as $inner) { - self::applyFull($inner); - } - } - } - - /** - * @param Node|string|int|float|null $node - * @return void - */ - private static function applyToScopeInner($node) - { - if ($node instanceof Node) { - $kind = $node->kind; - if ($kind === ast\AST_CLASS || $kind === ast\AST_FUNC_DECL || $kind === ast\AST_CLOSURE) { - return; - } - - $closure = self::$closures_for_kind[$kind] ?? null; - if ($closure !== null) { - $closure($node); - } - foreach ($node->children as $inner) { - self::applyToScopeInner($inner); - } - } - } - - /** - * @param Node $node a node beginning a scope such as AST_FUNC, AST_STMT_LIST, AST_METHOD, etc. (Assumes these nodes don't have any annotations. - * @return void - */ - public static function applyToScope(Node $node) - { - foreach ($node->children as $inner) { - self::applyToScopeInner($inner); - } - } -} -PhanAnnotationAdder::init(); diff --git a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/InvalidNodeException.php b/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/InvalidNodeException.php deleted file mode 100644 index 060ab7c..0000000 --- a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/InvalidNodeException.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\TolerantASTConverter; - -use Exception; - -/** - * An exception thrown when TolerantASTConverter is processing something that would become an invalid Node. - * - * This is caught within TolerantASTConverter, the way it is handled depends on configuration settings. - * @internal - */ -final class InvalidNodeException extends Exception -{ -} diff --git a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/NodeDumper.php b/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/NodeDumper.php deleted file mode 100644 index 7abe732..0000000 --- a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/NodeDumper.php +++ /dev/null @@ -1,161 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\TolerantASTConverter; - -use Exception; -use Microsoft\PhpParser\Node; -use Microsoft\PhpParser\Token; - -use function get_class; -use function gettype; -use function is_object; -use function substr; - -/** - * Source: https://github.com/TysonAndre/tolerant-php-parser-to-php-ast - * - * The MIT License (MIT) - * - * Copyright (c) 2017 Tyson Andre - * - * 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. - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class NodeDumper -{ - /** @var string the contents of the file containing the tolerant-php-parser node to be dumped. */ - private $file_contents; - /** @var bool whether we should print byte offsets along with the node */ - private $include_offset; - /** @var bool whether we should print the node kind of tokens*/ - private $include_token_kind; - /** @var string the indentation string to print before each level of nodes (whitespace) */ - private $indent; - - // TODO: Pass an options array instead, or add setters? - public function __construct(string $file_contents, bool $include_offset = false, bool $include_token_kind = false, string $indent = ' ') - { - $this->file_contents = $file_contents; - $this->include_offset = $include_offset; - $this->include_token_kind = $include_token_kind; - $this->indent = $indent; - } - - /** @return void */ - public function setIncludeOffset(bool $include_offset) - { - $this->include_offset = $include_offset; - } - - /** @return void */ - public function setIncludeTokenKind(bool $include_token_kind) - { - $this->include_token_kind = $include_token_kind; - } - - /** - * @return void - * @suppress PhanUnreferencedPublicMethod - */ - public function setIndent(string $indent) - { - $this->indent = $indent; - } - - /** - * Converts the class name of $ast_node to a short string describing that class name. - * Removes the common `Microsoft\\PhpParser\\` prefix - */ - public static function dumpClassName(Node $ast_node) : string - { - $name = get_class($ast_node); - if (\stripos($name, 'Microsoft\\PhpParser\\') === 0) { - // Remove the PhpParser namespace - $name = (string)substr($name, 20); - } - return $name; - } - - /** - * Converts the class name of $ast_node to a short string describing that class name. - * Removes the common `Microsoft\\PhpParser\\` prefix - */ - public static function dumpTokenClassName(Token $ast_node) : string - { - $name = get_class($ast_node); - if (\stripos($name, 'Microsoft\\PhpParser\\') === 0) { - // Remove the PhpParser namespace - $name = (string)substr($name, 20); - } - return $name; - } - - /** - * @param Node|Token|null $ast_node - * @param string $padding (to be echoed before the current node - * @return string - * @throws Exception for invalid $ast_node values - */ - public function dumpTreeAsString($ast_node, string $key = '', string $padding = '') : string - { - if ($ast_node instanceof Node) { - $first_part = \sprintf( - "%s%s%s%s\n", - $padding, - $key !== '' ? $key . ': ' : '', - self::dumpClassName($ast_node), - $this->include_offset ? ' (@' . $ast_node->getStart() . ')' : '' - ); - - $result = $first_part; - foreach ($ast_node->getChildNodesAndTokens() as $name => $child) { - $result .= $this->dumpTreeAsString($child, (string) $name, $padding . $this->indent); - } - return $result; - } elseif ($ast_node instanceof Token) { - return \sprintf( - "%s%s%s: %s%s%s: %s\n", - $padding, - $key !== '' ? $key . ': ' : '', - self::dumpTokenClassName($ast_node), - $ast_node->getTokenKindNameFromValue($ast_node->kind), - $this->include_token_kind ? '(' . $ast_node->kind . ')' : '', - $this->include_offset ? ' (@' . $ast_node->start . ')' : '', - \Phan\Library\StringUtil::jsonEncode(\substr($this->file_contents, $ast_node->fullStart, $ast_node->length)) - ); - } elseif (\is_scalar($ast_node) || $ast_node === null) { - return \var_export($ast_node, true); - } else { - $type = is_object($ast_node) ? get_class($ast_node) : gettype($ast_node); - throw new \InvalidArgumentException("Unexpected type of \$ast_node was seen in dumper: " . $type); - } - } - - /** - * @param Node|Token $ast_node - * @param string $padding (to be echoed before the current node - * @return void - * @throws Exception for invalid $ast_node values - * @suppress PhanUnreferencedPublicMethod - */ - public function dumpTree($ast_node, string $key = '', string $padding = '') - { - echo $this->dumpTreeAsString($ast_node, $key, $padding); - } -} diff --git a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/NodeUtils.php b/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/NodeUtils.php deleted file mode 100644 index 0c94cc7..0000000 --- a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/NodeUtils.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\TolerantASTConverter; - -use Microsoft\PhpParser\Node\QualifiedName; -use Microsoft\PhpParser\Token; -use Microsoft\PhpParser\TokenKind; - -/** - * Miscellaneous utilities for converting nodes to strings. - * - * This deliberately duplicates some functionality in TolerantASTConverter for use outside of TolerantASTConverter. - * (static methods are faster inside of TolerantASTConverter) - */ -final class NodeUtils -{ - /** @var string */ - private $file_contents; - - public function __construct(string $file_contents) - { - $this->file_contents = $file_contents; - } - - /** - * Convert a token to the string it represents, without whitespace or `$`. - * - * @phan-suppress PhanPartialTypeMismatchArgumentInternal hopefully in range - */ - public function tokenToString(Token $n) : string - { - $result = \trim($n->getText($this->file_contents)); - $kind = $n->kind; - if ($kind === TokenKind::VariableName) { - return \trim($result, '$'); - } - return $result; - } - - /** - * Converts a qualified name to the string it represents, combining name parts. - */ - public function phpParserNameToString(QualifiedName $name) : string - { - $name_parts = $name->nameParts; - // TODO: Handle error case (can there be missing parts?) - $result = ''; - foreach ($name_parts as $part) { - // @phan-suppress-next-line PhanPossiblyNullTypeArgument - $part_as_string = $this->tokenToString($part); - if ($part_as_string !== '') { - $result .= \trim($part_as_string); - } - } - $result = \rtrim(\preg_replace('/\\\\{2,}/', '\\', $result), '\\'); - if ($result === '') { - // Would lead to "The name cannot be empty" when parsing - throw new InvalidNodeException(); - } - return $result; - } -} diff --git a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ParseException.php b/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ParseException.php deleted file mode 100644 index 405e358..0000000 --- a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ParseException.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\TolerantASTConverter; - -use Exception; -use Throwable; - -/** - * An error in the polyfill PHP parser used for unparseable code. - * - * Should be handled similarly to parseError. - * Note that getLine() can't be overridden - */ -class ParseException extends Exception -{ - /** @var int the line number of the unparsable file where parsing failed. */ - private $line_number_start; - - public function __construct(string $message, int $line_number_start, Throwable $previous = null) - { - parent::__construct($message, 0, $previous); - $this->line_number_start = $line_number_start; - } - - /** - * Returns the line of the file being parsed that caused this ParseException. - */ - public function getLineNumberStart() : int - { - return $this->line_number_start; - } -} diff --git a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ParseResult.php b/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ParseResult.php deleted file mode 100644 index 6431d0c..0000000 --- a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ParseResult.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\TolerantASTConverter; - -use ast; -use Microsoft\PhpParser\Diagnostic; - -/** - * All details about the results of parsing. - * - * This can be serialized and used in a cache. - */ -class ParseResult -{ - /** @var ast\Node the node that was parsed */ - public $node; - /** @var Diagnostic[] diagnostics emitted */ - public $diagnostics; - - /** - * @param Diagnostic[] $diagnostics errors seen when parsing $node - */ - public function __construct(ast\Node $node, array $diagnostics) - { - $this->node = $node; - $this->diagnostics = $diagnostics; - } -} diff --git a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/StringUtil.php b/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/StringUtil.php deleted file mode 100644 index 1fbc300..0000000 --- a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/StringUtil.php +++ /dev/null @@ -1,199 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\TolerantASTConverter; - -use function chr; -use function hexdec; -use function is_string; -use function octdec; -use function preg_replace; -use function str_replace; -use function strpos; -use function strrpos; -use function strspn; -use function substr; - -/** - * This class is based on code from https://github.com/nikic/PHP-Parser/blob/master/lib/PhpParser/Node/Scalar/String_.php - * - * Original License - * ---------------- - * - * Copyright (c) 2011-2018 by Nikita Popov. - * - * Some rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * * The names of the contributors may not be used to endorse or - * promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -final class StringUtil -{ - const REPLACEMENTS = [ - '\\' => '\\', - '$' => '$', - 'n' => "\n", - 'r' => "\r", - 't' => "\t", - 'f' => "\f", - 'v' => "\v", - 'e' => "\x1B", - ]; - - /** - * @internal - * - * Parses a string token. - * - * @param string $str String token content - * - * @return string The parsed string - */ - public static function parse(string $str) : string - { - $c = $str[0]; - if ($c === '<') { - return self::parseHeredoc($str); - } - $binary_length = 0; - if ('b' === $c || 'B' === $c) { - $binary_length = 1; - } - - if ('\'' === $str[$binary_length]) { - return str_replace( - ['\\\\', '\\\''], - ['\\', '\''], - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - substr($str, $binary_length + 1, -1) - ); - } else { - return self::parseEscapeSequences( - substr($str, $binary_length + 1, -1), - '"' - ); - } - } - - /** - * Converts a fragment of raw (possibly indented) - * heredoc to the string that the PHP interpreter would treat it as. - */ - public static function parseHeredoc(string $str) : string - { - // TODO: handle dos newlines - // TODO: Parse escape sequences - $first_line_index = (int)strpos($str, "\n"); - $last_line_index = (int)strrpos($str, "\n"); - // $last_line = substr($str, $last_line_index + 1); - $spaces = strspn($str, " \t", $last_line_index + 1); - - // On Windows, the "\r" must also be removed from the last line of the heredoc - $inner = (string)substr($str, $first_line_index + 1, $last_line_index - ($first_line_index + 1) - ($str[$last_line_index - 1] === "\r" ? 1 : 0)); - - if ($spaces > 0) { - $inner = preg_replace("/^" . substr($str, $last_line_index + 1, $spaces) . "/m", '', $inner); - } - if (strpos(substr($str, 0, $first_line_index), "'") === false) { - // If the start of the here/nowdoc doesn't contain a "'", it's heredoc. - // The contents have to be unescaped. - return self::parseEscapeSequences($inner, null); - } - return $inner; - } - - /** - * Parses escape sequences in strings (all string types apart from single quoted). - * - * @param string|false $str String without quotes - * @param null|string $quote Quote type - * - * @return string String with escape sequences parsed - * @throws InvalidNodeException for invalid code points - */ - public static function parseEscapeSequences($str, $quote) : string - { - if (!is_string($str)) { - // Invalid AST input; give up - return ''; - } - if (null !== $quote) { - $str = str_replace('\\' . $quote, $quote, $str); - } - - return \preg_replace_callback( - '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}|u\{([0-9a-fA-F]+)\})~', - /** - * @param array<int,string> $matches - * @return string - */ - static function ($matches) { - $str = $matches[1]; - - if (isset(self::REPLACEMENTS[$str])) { - return self::REPLACEMENTS[$str]; - } elseif ('x' === $str[0] || 'X' === $str[0]) { - // @phan-suppress-next-line PhanPartialTypeMismatchArgumentInternal - return chr(hexdec($str)); - } elseif ('u' === $str[0]) { - // @phan-suppress-next-line PhanPartialTypeMismatchArgument - return self::codePointToUtf8(hexdec($matches[2])); - } else { - return chr(octdec($str)); - } - }, - $str - ); - } - - /** - * Converts a Unicode code point to its UTF-8 encoded representation. - * - * @param int $num Code point - * - * @return string UTF-8 representation of code point - * - * @throws InvalidNodeException for invalid code points - */ - private static function codePointToUtf8(int $num) : string - { - if ($num <= 0x7F) { - return chr($num); - } - if ($num <= 0x7FF) { - return chr(($num >> 6) + 0xC0) . chr(($num & 0x3F) + 0x80); - } - if ($num <= 0xFFFF) { - return chr(($num >> 12) + 0xE0) . chr((($num >> 6) & 0x3F) + 0x80) . chr(($num & 0x3F) + 0x80); - } - if ($num <= 0x1FFFFF) { - return chr(($num >> 18) + 0xF0) . chr((($num >> 12) & 0x3F) + 0x80) - . chr((($num >> 6) & 0x3F) + 0x80) . chr(($num & 0x3F) + 0x80); - } - throw new InvalidNodeException('Invalid UTF-8 codepoint escape sequence: Codepoint too large'); - } -} diff --git a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/TolerantASTConverter.php b/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/TolerantASTConverter.php deleted file mode 100644 index e1877ed..0000000 --- a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/TolerantASTConverter.php +++ /dev/null @@ -1,3030 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\TolerantASTConverter; - -use AssertionError; -use ast; -use ast\flags; -use Error; -use Exception; -use InvalidArgumentException; -use Microsoft\PhpParser; -use Microsoft\PhpParser\Diagnostic; -use Microsoft\PhpParser\DiagnosticsProvider; -use Microsoft\PhpParser\FilePositionMap; -use Microsoft\PhpParser\MissingToken; -use Microsoft\PhpParser\Parser; -use Microsoft\PhpParser\Token; -use Microsoft\PhpParser\TokenKind; -use Phan\CLI; -use Phan\Library\Cache; -use RuntimeException; -use function array_merge; -use function class_exists; -use function count; -use function get_class; -use function implode; -use function is_array; -use function sprintf; -use function substr; -use function var_export; -use const FILTER_FLAG_ALLOW_HEX; -use const FILTER_FLAG_ALLOW_OCTAL; -use const FILTER_VALIDATE_FLOAT; -use const FILTER_VALIDATE_INT; -use const PHP_VERSION_ID; - -// If php-ast isn't loaded already, then load this file to generate equivalent -// class, constant, and function definitions. -if (!class_exists('ast\Node')) { - require_once __DIR__ . '/ast_shim.php'; -} - -/** - * Source: https://github.com/TysonAndre/tolerant-php-parser-to-php-ast - * - * Uses Microsoft/tolerant-php-parser to create an instance of ast\Node. - * Useful if the php-ast extension isn't actually installed. - * - * @author Tyson Andre - * - * TODO: Don't need to pass in $start_line for many of these functions - * - * This is implemented as a collection of static methods for performance, - * but functionality is provided through instance methods. - * (The private methods may become instance methods if the performance impact is negligible - * in PHP and HHVM) - * - * The instance methods set all of the options (static variables) - * each time they are invoked, - * so it's possible to have multiple callers use this without affecting each other. - * - * Compatibility: PHP 7.0-7.3 - * - * ---------------------------------------------------------------------------- - * - * - * License for TolerantASTConverter.php: - * - * The MIT License (MIT) - * - * Copyright (c) 2017-2018 Tyson Andre - * - * 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. - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - * - * NOTE: EchoExpression can get converted to multiple `ast\Node`s (e.g. for `echo 'first', 'second';`, which is why this has so many partial mismatches. - * The current version of tolerant-php-parser prevents EchoExpression (and UnsetIntrinsicExpression) from being anything other than a top-level statement. - * - * @phan-file-suppress PhanPartialTypeMismatchReturn - * @phan-file-suppress PhanPartialTypeMismatchArgument - * @phan-file-suppress PhanPartialTypeMismatchArgumentInternal - */ -class TolerantASTConverter -{ - // The latest stable version of php-ast. - // For something > 50, update the library's release. - const AST_VERSION = 50; - - // The versions that this supports - // TODO: Also enable support for version 60 once there is a stable 1.0.0 release. (Issue #2038) - const SUPPORTED_AST_VERSIONS = [self::AST_VERSION]; - - const _IGNORED_STRING_TOKEN_KIND_SET = [ - TokenKind::OpenBraceDollarToken => true, - TokenKind::OpenBraceToken => true, - TokenKind::DollarOpenBraceToken => true, - TokenKind::CloseBraceToken => true, - ]; - - // If this environment variable is set, this will throw. - // (For debugging, may be removed in the future) - const ENV_AST_THROW_INVALID = 'AST_THROW_INVALID'; - - const INCOMPLETE_CLASS_CONST = '__INCOMPLETE_CLASS_CONST__'; - const INCOMPLETE_PROPERTY = '__INCOMPLETE_PROPERTY__'; - const INCOMPLETE_VARIABLE = '__INCOMPLETE_VARIABLE__'; - - /** - * @var int - A version in SUPPORTED_AST_VERSIONS - */ - protected static $php_version_id_parsing = PHP_VERSION_ID; - - /** - * @var int - Internal counter for declarations, to generate __declId in `ast\Node`s for declarations. - */ - protected static $decl_id = 0; - - /** @var bool should placeholder nodes be added as child nodes instead of refusing to generate a Node for an invalid statement? */ - protected static $should_add_placeholders = false; - - /** @var string the contents of the file currently being parsed */ - protected static $file_contents = ''; - - /** @var FilePositionMap maps byte offsets of the currently parsed file to line numbers */ - protected static $file_position_map; - - /** @var bool if true, force all doc comments to be parsed */ - private static $parse_all_doc_comments = false; - - /** @var bool Sets equivalent static option in self::_start_parsing() */ - protected $instance_should_add_placeholders = false; - - /** - * @var int can be used to tweak behavior for compatibility. - * Set to a newer version to support comments on class constants, etc. - */ - protected $instance_php_version_id_parsing = PHP_VERSION_ID; - - /** - * @var bool if true, force all doc comments to be parsed - */ - private $instance_parse_all_doc_comments = false; - - // No-op. - public function __construct() - { - } - - /** @return void */ - public function setShouldAddPlaceholders(bool $value) - { - $this->instance_should_add_placeholders = $value; - } - - /** @return void */ - public function setPHPVersionId(int $value) - { - $this->instance_php_version_id_parsing = $value; - } - - /** - * Parse all doc comments, even the ones the current php version's php-ast would be incapable of providing. - * @return void - */ - public function setParseAllDocComments(bool $value) - { - $this->instance_parse_all_doc_comments = $value; - } - - /** - * Generates an ast\Node with this converter's current settings. (caching if $cache is non-null) - * - * @param Diagnostic[] &$errors @phan-output-reference - * @param ?Cache<ParseResult> $cache - * @return ast\Node - * @throws InvalidArgumentException if the requested AST version is invalid. - */ - public function parseCodeAsPHPAST(string $file_contents, int $version, array &$errors = [], Cache $cache = null) - { - if (!\in_array($version, self::SUPPORTED_AST_VERSIONS)) { - throw new \InvalidArgumentException(sprintf("Unexpected version: want %s, got %d", \implode(', ', self::SUPPORTED_AST_VERSIONS), $version)); - } - $errors = []; - $cache_key = null; - if ($cache) { - $cache_key = $this->generateCacheKey($file_contents, $version); - $result = $cache_key ? $cache->getIfExists($cache_key) : null; - if ($result) { - $errors = $result->diagnostics; - return $result->node; - } - } - $result = $this->parseCodeAsPHPASTUncached($file_contents, $version, $errors); - if ($cache && $cache_key) { - $cache->save($cache_key, new ParseResult($result, $errors)); - } - return $result; - } - - /** - * Generates an ast\Node with this converter's current settings. - * - * @param Diagnostic[] &$errors @phan-output-reference - * @return ast\Node - * @throws InvalidArgumentException if the requested AST version is invalid. - */ - public function parseCodeAsPHPASTUncached(string $file_contents, int $version, array &$errors = []) - { - // Aside: this can be implemented as a stub. - $parser_node = static::phpParserParse($file_contents, $errors); - return $this->phpParserToPhpast($parser_node, $version, $file_contents); - } - - /** - * @param null|Diagnostic[] &$errors @phan-output-reference (TODO: param-out) - * @return PhpParser\Node - */ - public static function phpParserParse(string $file_contents, array &$errors = null) : PhpParser\Node - { - $parser = new Parser(); // TODO: In php 7.3, we might need to provide a version, due to small changes in lexing? - $result = $parser->parseSourceFile($file_contents); - $errors = DiagnosticsProvider::getDiagnostics($result); - return $result; - } - - /** - * Visible for testing - * - * @param PhpParser\Node $parser_node - * @param int $ast_version - * @param string $file_contents - * @return ast\Node - * @throws InvalidArgumentException if the provided AST version isn't valid - */ - public function phpParserToPhpast(PhpParser\Node $parser_node, int $ast_version, string $file_contents) - { - if (!\in_array($ast_version, self::SUPPORTED_AST_VERSIONS)) { - throw new \InvalidArgumentException(sprintf("Unexpected version: want %s, got %d", implode(', ', self::SUPPORTED_AST_VERSIONS), $ast_version)); - } - $this->startParsing($file_contents); - $stmts = static::phpParserNodeToAstNode($parser_node); - // return static::normalizeNamespaces($stmts); - return $stmts; - } - - /** @return void */ - protected function startParsing(string $file_contents) - { - self::$decl_id = 0; - self::$should_add_placeholders = $this->instance_should_add_placeholders; - self::$php_version_id_parsing = $this->instance_php_version_id_parsing; - self::$parse_all_doc_comments = $this->instance_parse_all_doc_comments; - self::$file_position_map = new FilePositionMap($file_contents); - // $file_contents required for looking up line numbers. - // TODO: Other data structures? - self::$file_contents = $file_contents; - } - - /** - * @param null|bool|int|string|PhpParser\Node|Token|(PhpParser\Node|Token)[] $n - * @throws Exception if node is invalid - */ - protected static function debugDumpNodeOrToken($n) : string - { - if (\is_scalar($n)) { - return var_export($n, true); - } - if (!\is_array($n)) { - $n = [$n]; - } - $result = []; - foreach ($n as $e) { - $dumper = new NodeDumper(self::$file_contents); - $dumper->setIncludeTokenKind(true); - $result[] = $dumper->dumpTreeAsString($e); - } - return implode("\n", $result); - } - - /** - * @param Token|PhpParser\Node[]|PhpParser\Node\StatementNode $parser_nodes - * This is represented as a single node for `if` with a colon (macro style) - * @param ?int $lineno - * @param bool $return_null_on_empty (return null if non-array (E.g. semicolon is seen)) - * @return ?ast\Node - * Throws RuntimeException|Exception if the statement list is invalid - * @suppress PhanThrowTypeAbsentForCall|PhanThrowTypeMismatchForCall - */ - private static function phpParserStmtlistToAstNode($parser_nodes, $lineno, bool $return_null_on_empty = false) - { - if ($parser_nodes instanceof PhpParser\Node\Statement\CompoundStatementNode) { - $parser_nodes = $parser_nodes->statements; - } elseif ($parser_nodes instanceof PhpParser\Node\StatementNode) { - if ($parser_nodes instanceof PhpParser\Node\Statement\EmptyStatement) { - $parser_nodes = []; - } else { - $parser_nodes = [$parser_nodes]; - } - } elseif ($parser_nodes instanceof Token) { - if ($parser_nodes->kind === TokenKind::SemicolonToken) { - if ($return_null_on_empty) { - return null; - } - return new ast\Node( - ast\AST_STMT_LIST, - 0, - [], - $lineno ?? 0 - ); - } - } - - if (!\is_array($parser_nodes)) { - throw new RuntimeException("Unexpected type for statements: " . static::debugDumpNodeOrToken($parser_nodes)); - } - $children = []; - foreach ($parser_nodes as $parser_node) { - try { - // @phan-suppress-next-line PhanPossiblyNullTypeArgument - $child_node = static::phpParserNodeToAstNode($parser_node); - } catch (InvalidNodeException $_) { - continue; - } - if (\is_array($child_node)) { - // EchoExpression returns multiple children. - foreach ($child_node as $child_node_part) { - $children[] = $child_node_part; - } - } elseif (!\is_null($child_node)) { - $children[] = $child_node; - } - } - if (!\is_int($lineno)) { - foreach ($parser_nodes as $parser_node) { - $child_node_line = static::getEndLine($parser_node); - if ($child_node_line > 0) { - $lineno = $child_node_line; - break; - } - } - } - return new ast\Node(ast\AST_STMT_LIST, 0, $children, $lineno ?? 0); - } - - private static function phpParserExprListToExprList(PhpParser\Node\DelimitedList\ExpressionList $expressions_list, int $lineno) : ast\Node - { - $children = []; - $expressions_children = $expressions_list->children; - foreach ($expressions_children as $expr) { - if ($expr instanceof Token && $expr->kind === TokenKind::CommaToken) { - continue; - } - $child_node = static::phpParserNodeToAstNode($expr); - if (\is_array($child_node)) { - // EchoExpression returns multiple children in php-ast - foreach ($child_node as $child_node_part) { - $children[] = $child_node_part; - } - } elseif (!\is_null($child_node)) { - $children[] = $child_node; - } - } - foreach ($expressions_children as $parser_node) { - $child_node_line = static::getEndLine($parser_node); - if ($child_node_line > 0) { - $lineno = $child_node_line; - break; - } - } - return new ast\Node( - ast\AST_EXPR_LIST, - 0, - $children, - $lineno - ); - } - - /** - * @param PhpParser\Node|Token $n - The node from PHP-Parser - * @return ast\Node|ast\Node[]|string|int|float|bool|null - whatever ast\parse_code would return as the equivalent. - * @throws InvalidArgumentException if Phan doesn't know what $n is - */ - protected static function phpParserNonValueNodeToAstNode($n) - { - static $callback_map; - static $fallback_closure; - if (\is_null($callback_map)) { - $callback_map = static::initHandleMap(); - /** - * @param PhpParser\Node|Token $n - * @return ast\Node - Not a real node, but a node indicating the TODO - * @throws InvalidArgumentException for invalid node classes - * @throws Error if the environment variable AST_THROW_INVALID is set (for debugging) - */ - $fallback_closure = static function ($n, int $unused_start_line) { - if (!($n instanceof PhpParser\Node) && !($n instanceof Token)) { - // @phan-suppress-next-line PhanThrowTypeMismatchForCall debugDumpNodeOrToken can throw - throw new \InvalidArgumentException("Invalid type for node: " . (\is_object($n) ? \get_class($n) : \gettype($n)) . ": " . static::debugDumpNodeOrToken($n)); - } - return static::astStub($n); - }; - } - $callback = $callback_map[\get_class($n)] ?? $fallback_closure; - // @phan-suppress-next-line PhanThrowTypeMismatch, PhanThrowTypeAbsentForCall - return $callback($n, self::getStartLine($n)); - } - - /** - * @param PhpParser\Node|Token $n - The node from PHP-Parser - * @return ast\Node|ast\Node[]|string|int|float|bool|null - whatever ast\parse_code would return as the equivalent. - * @throws InvalidNodeException when self::$should_add_placeholders is false, like many of these methods. - */ - protected static function phpParserNodeToAstNodeOrPlaceholderExpr($n) - { - if (!self::$should_add_placeholders) { - return static::phpParserNodeToAstNode($n); - } - try { - return static::phpParserNodeToAstNode($n); - } catch (InvalidNodeException $_) { - return static::newPlaceholderExpression($n); - } - } - - /** - * @param PhpParser\Node|Token $n - The node from PHP-Parser - * @return ast\Node|ast\Node[]|string|int|float|null - whatever ast\parse_code would return as the equivalent. - */ - protected static function phpParserNodeToAstNode($n) - { - static $callback_map; - static $fallback_closure; - if (\is_null($callback_map)) { - $callback_map = static::initHandleMap(); - /** - * @param PhpParser\Node|Token $n - * @return ast\Node - Not a real node, but a node indicating the TODO - * @throws InvalidArgumentException|Exception for invalid node classes - * @throws Error if the environment variable AST_THROW_INVALID is set to debug. - */ - $fallback_closure = static function ($n, int $unused_start_line) { - if (!($n instanceof PhpParser\Node) && !($n instanceof Token)) { - throw new \InvalidArgumentException("Invalid type for node: " . (\is_object($n) ? \get_class($n) : \gettype($n)) . ": " . static::debugDumpNodeOrToken($n)); - } - - return static::astStub($n); - }; - } - $callback = $callback_map[\get_class($n)] ?? $fallback_closure; - // @phan-suppress-next-line PhanThrowTypeAbsent - $result = $callback($n, self::$file_position_map->getStartLine($n)); - if (($result instanceof ast\Node) && $result->kind === ast\AST_NAME) { - return new ast\Node(ast\AST_CONST, 0, ['name' => $result], $result->lineno); - } - return $result; - } - - /** - * @param PhpParser\Node|Token $n - * @throws InvalidNodeException if this was called on an unexpected type - */ - final protected static function getStartLine($n) : int - { - if (\is_object($n)) { - return self::$file_position_map->getStartLine($n); - } - throw new InvalidNodeException(); - } - - /** - * @param ?PhpParser\Node|?Token $n - * @throws InvalidNodeException if this was called on an unexpected type - */ - final protected static function getEndLine($n) : int - { - if (!\is_object($n)) { - if (\is_null($n)) { - return 0; - } - throw new InvalidNodeException(); - } - return self::$file_position_map->getEndLine($n); - } - - /** - * This returns an array of values mapping class names to the closures which converts them to a scalar or ast\Node - * - * Why not a switch? Switches are slow until php 7.2, and there are dozens of class names to handle. - * - * - In php <= 7.1, the interpreter would loop through all possible cases, and compare against the value one by one. - * - There are a lot of local variables to look at. - * - * @return \Closure[] - */ - protected static function initHandleMap() : array - { - $closures = [ - /** @return ?ast\Node */ - 'Microsoft\PhpParser\Node\SourceFileNode' => static function (PhpParser\Node\SourceFileNode $n, int $start_line) { - return static::phpParserStmtlistToAstNode($n->statementList, $start_line, false); - }, - /** @return mixed */ - 'Microsoft\PhpParser\Node\Expression\ArgumentExpression' => static function (PhpParser\Node\Expression\ArgumentExpression $n, int $start_line) { - $result = static::phpParserNodeToAstNode($n->expression); - if ($n->dotDotDotToken !== null) { - return new ast\Node(ast\AST_UNPACK, 0, ['expr' => $result], $start_line); - } - return $result; - }, - /** - * @return ast\Node|string|int|float - * @throws InvalidNodeException - */ - 'Microsoft\PhpParser\Node\Expression\SubscriptExpression' => static function (PhpParser\Node\Expression\SubscriptExpression $n, int $start_line) { - $expr = static::phpParserNodeToAstNode($n->postfixExpression); - try { - return new ast\Node(ast\AST_DIM, 0, [ - 'expr' => $expr, - 'dim' => $n->accessExpression !== null ? static::phpParserNodeToAstNode($n->accessExpression) : null, - ], $start_line); - } catch (InvalidNodeException $_) { - return $expr; - } - }, - /** @return ?ast\Node */ - 'Microsoft\PhpParser\Node\Expression\AssignmentExpression' => static function (PhpParser\Node\Expression\AssignmentExpression $n, int $start_line) { - try { - $var_node = static::phpParserNodeToAstNode($n->leftOperand); - } catch (InvalidNodeException $_) { - if (self::$should_add_placeholders) { - $var_node = new ast\Node(ast\AST_VAR, 0, ['name' => self::INCOMPLETE_VARIABLE], $start_line); - } else { - // convert `;= $b;` to `;$b;` - return static::phpParserNodeToAstNode($n->rightOperand); - } - } - $expr_node = static::phpParserNodeToAstNodeOrPlaceholderExpr($n->rightOperand); - // FIXME switch on $n->kind - return static::astNodeAssign( - $var_node, - $expr_node, - $start_line, - $n->byRef !== null - ); - }, - /** - * @return ast\Node|string|float|int (can return a non-Node if the left or right-hand side could not be parsed - */ - 'Microsoft\PhpParser\Node\Expression\BinaryExpression' => static function (PhpParser\Node\Expression\BinaryExpression $n, int $start_line) { - static $lookup = [ - TokenKind::AmpersandAmpersandToken => flags\BINARY_BOOL_AND, - TokenKind::AmpersandToken => flags\BINARY_BITWISE_AND, - TokenKind::AndKeyword => flags\BINARY_BOOL_AND, - TokenKind::AsteriskAsteriskToken => flags\BINARY_POW, - TokenKind::AsteriskToken => flags\BINARY_MUL, - TokenKind::BarBarToken => flags\BINARY_BOOL_OR, - TokenKind::BarToken => flags\BINARY_BITWISE_OR, - TokenKind::CaretToken => flags\BINARY_BITWISE_XOR, - TokenKind::DotToken => flags\BINARY_CONCAT, - TokenKind::EqualsEqualsEqualsToken => flags\BINARY_IS_IDENTICAL, - TokenKind::EqualsEqualsToken => flags\BINARY_IS_EQUAL, - TokenKind::ExclamationEqualsEqualsToken => flags\BINARY_IS_NOT_IDENTICAL, - TokenKind::ExclamationEqualsToken => flags\BINARY_IS_NOT_EQUAL, - TokenKind::GreaterThanEqualsToken => flags\BINARY_IS_GREATER_OR_EQUAL, - TokenKind::GreaterThanGreaterThanToken => flags\BINARY_SHIFT_RIGHT, - TokenKind::GreaterThanToken => flags\BINARY_IS_GREATER, - TokenKind::LessThanEqualsGreaterThanToken => flags\BINARY_SPACESHIP, - TokenKind::LessThanEqualsToken => flags\BINARY_IS_SMALLER_OR_EQUAL, - TokenKind::LessThanLessThanToken => flags\BINARY_SHIFT_LEFT, - TokenKind::LessThanToken => flags\BINARY_IS_SMALLER, - TokenKind::MinusToken => flags\BINARY_SUB, - TokenKind::OrKeyword => flags\BINARY_BOOL_OR, - TokenKind::PercentToken => flags\BINARY_MOD, - TokenKind::PlusToken => flags\BINARY_ADD, - TokenKind::QuestionQuestionToken => flags\BINARY_COALESCE, - TokenKind::SlashToken => flags\BINARY_DIV, - TokenKind::XorKeyword => flags\BINARY_BOOL_XOR, - ]; - static $assign_lookup = [ - TokenKind::AmpersandEqualsToken => flags\BINARY_BITWISE_AND, - TokenKind::AsteriskAsteriskEqualsToken => flags\BINARY_POW, - TokenKind::AsteriskEqualsToken => flags\BINARY_MUL, - TokenKind::BarEqualsToken => flags\BINARY_BITWISE_OR, - TokenKind::CaretEqualsToken => flags\BINARY_BITWISE_XOR, - TokenKind::DotEqualsToken => flags\BINARY_CONCAT, - TokenKind::MinusEqualsToken => flags\BINARY_SUB, - TokenKind::PercentEqualsToken => flags\BINARY_MOD, - TokenKind::PlusEqualsToken => flags\BINARY_ADD, - TokenKind::SlashEqualsToken => flags\BINARY_DIV, - TokenKind::GreaterThanGreaterThanEqualsToken => flags\BINARY_SHIFT_RIGHT, - TokenKind::LessThanLessThanEqualsToken => flags\BINARY_SHIFT_LEFT, - ]; - $kind = $n->operator->kind; - if ($kind === TokenKind::InstanceOfKeyword) { - return new ast\Node(ast\AST_INSTANCEOF, 0, [ - 'expr' => static::phpParserNodeToAstNode($n->leftOperand), - 'class' => static::phpParserNonValueNodeToAstNode($n->rightOperand), - ], $start_line); - } - $ast_kind = $lookup[$kind] ?? null; - if ($ast_kind === null) { - $ast_kind = $assign_lookup[$kind] ?? null; - if ($ast_kind === null) { - throw new AssertionError("missing $kind (" . Token::getTokenKindNameFromValue($kind) . ")"); - } - return static::astNodeAssignop($ast_kind, $n, $start_line); - } - return static::astNodeBinaryop($ast_kind, $n, $start_line); - }, - 'Microsoft\PhpParser\Node\Expression\UnaryOpExpression' => static function (PhpParser\Node\Expression\UnaryOpExpression $n, int $start_line) : ast\Node { - static $lookup = [ - TokenKind::TildeToken => flags\UNARY_BITWISE_NOT, - TokenKind::MinusToken => flags\UNARY_MINUS, - TokenKind::PlusToken => flags\UNARY_PLUS, - TokenKind::ExclamationToken => flags\UNARY_BOOL_NOT, - ]; - $kind = $n->operator->kind; - $ast_kind = $lookup[$kind] ?? null; - if ($ast_kind === null) { - throw new AssertionError("missing $kind(" . Token::getTokenKindNameFromValue($kind) . ")"); - } - return new ast\Node( - ast\AST_UNARY_OP, - $ast_kind, - ['expr' => static::phpParserNodeToAstNode($n->operand)], - $start_line - ); - }, - 'Microsoft\PhpParser\Node\Expression\CastExpression' => static function (PhpParser\Node\Expression\CastExpression $n, int $start_line) : ast\Node { - static $lookup = [ - // From Parser->parseCastExpression() - TokenKind::ArrayCastToken => flags\TYPE_ARRAY, - TokenKind::BoolCastToken => flags\TYPE_BOOL, - TokenKind::DoubleCastToken => flags\TYPE_DOUBLE, - TokenKind::IntCastToken => flags\TYPE_LONG, - TokenKind::ObjectCastToken => flags\TYPE_OBJECT, - TokenKind::StringCastToken => flags\TYPE_STRING, - TokenKind::UnsetCastToken => flags\TYPE_NULL, - - // From Parser->parseCastExpressionGranular() - // This is a syntax error, but try to match what the intent was - TokenKind::ArrayKeyword => flags\TYPE_ARRAY, - TokenKind::BinaryReservedWord => flags\TYPE_STRING, - TokenKind::BoolReservedWord => flags\TYPE_BOOL, - TokenKind::BooleanReservedWord => flags\TYPE_BOOL, - TokenKind::DoubleReservedWord => flags\TYPE_DOUBLE, - TokenKind::IntReservedWord => flags\TYPE_LONG, - TokenKind::IntegerReservedWord => flags\TYPE_LONG, - TokenKind::FloatReservedWord => flags\TYPE_DOUBLE, - TokenKind::ObjectReservedWord => flags\TYPE_OBJECT, - TokenKind::RealReservedWord => flags\TYPE_DOUBLE, - TokenKind::StringReservedWord => flags\TYPE_STRING, - TokenKind::UnsetKeyword => flags\TYPE_NULL, - ]; - $kind = $n->castType->kind; - $ast_kind = $lookup[$kind] ?? null; - if ($ast_kind === null) { - throw new AssertionError("missing $kind"); - } - return new ast\Node( - ast\AST_CAST, - $ast_kind, - ['expr' => static::phpParserNodeToAstNode($n->operand)], - static::getEndLine($n) ?: $start_line - ); - }, - 'Microsoft\PhpParser\Node\Expression\AnonymousFunctionCreationExpression' => static function ( - PhpParser\Node\Expression\AnonymousFunctionCreationExpression $n, - int $start_line - ) : ast\Node { - $ast_return_type = static::phpParserTypeToAstNode($n->returnType, static::getEndLine($n->returnType) ?: $start_line); - if (($ast_return_type->children['name'] ?? null) === '') { - $ast_return_type = null; - } - if ($n->questionToken !== null && $ast_return_type !== null) { - $ast_return_type = new ast\Node(ast\AST_NULLABLE_TYPE, 0, ['type' => $ast_return_type], $start_line); - } - return static::astDeclClosure( - $n->byRefToken !== null, - $n->staticModifier !== null, - static::phpParserParamsToAstParams($n->parameters, $start_line), - static::phpParserClosureUsesToAstClosureUses($n->anonymousFunctionUseClause->useVariableNameList ?? null, $start_line), - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable return_null_on_empty is false. - static::phpParserStmtlistToAstNode($n->compoundStatementOrSemicolon->statements, self::getStartLine($n->compoundStatementOrSemicolon), false), - $ast_return_type, - $start_line, - static::getEndLine($n), - static::resolveDocCommentForClosure($n) - ); - }, - /** - * @return ?ast\Node - * @throws InvalidNodeException if the resulting AST would not be analyzable by Phan - */ - 'Microsoft\PhpParser\Node\Expression\ScopedPropertyAccessExpression' => static function (PhpParser\Node\Expression\ScopedPropertyAccessExpression $n, int $start_line) { - $member_name = $n->memberName; - if ($member_name instanceof PhpParser\Node\Expression\Variable) { - try { - $prop_node = static::phpParserNodeToAstNode($member_name->name); - } catch (InvalidNodeException $e) { - if (self::$should_add_placeholders) { - $prop_node = ''; - } else { - throw $e; - } - } - return new ast\Node( - ast\AST_STATIC_PROP, - 0, - [ - 'class' => static::phpParserNonValueNodeToAstNode($n->scopeResolutionQualifier), - 'prop' => $prop_node, - ], - $start_line - ); - } else { - if ($member_name instanceof Token) { - if (\get_class($member_name) !== Token::class) { - if (self::$should_add_placeholders) { - $member_name = self::INCOMPLETE_CLASS_CONST; - } else { - throw new InvalidNodeException(); - } - } else { - $member_name = static::tokenToString($member_name); - } - } else { - // E.g. Node\Expression\BracedExpression - throw new InvalidNodeException(); - } - return static::phpParserClassconstfetchToAstClassconstfetch($n->scopeResolutionQualifier, $member_name, $start_line); - } - }, - 'Microsoft\PhpParser\Node\Expression\CloneExpression' => static function (PhpParser\Node\Expression\CloneExpression $n, int $start_line) : ast\Node { - return new ast\Node(ast\AST_CLONE, 0, ['expr' => static::phpParserNodeToAstNode($n->expression)], $start_line); - }, - 'Microsoft\PhpParser\Node\Expression\ErrorControlExpression' => static function (PhpParser\Node\Expression\ErrorControlExpression $n, int $start_line) : ast\Node { - return new ast\Node( - ast\AST_UNARY_OP, - flags\UNARY_SILENCE, - ['expr' => static::phpParserNodeToAstNode($n->operand)], - $start_line - ); - }, - 'Microsoft\PhpParser\Node\Expression\EmptyIntrinsicExpression' => static function (PhpParser\Node\Expression\EmptyIntrinsicExpression $n, int $start_line) : ast\Node { - return new ast\Node(ast\AST_EMPTY, 0, ['expr' => static::phpParserNodeToAstNode($n->expression)], $start_line); - }, - 'Microsoft\PhpParser\Node\Expression\EvalIntrinsicExpression' => static function (PhpParser\Node\Expression\EvalIntrinsicExpression $n, int $start_line) : ast\Node { - return new ast\Node( - ast\AST_INCLUDE_OR_EVAL, - flags\EXEC_EVAL, - ['expr' => static::phpParserNodeToAstNode($n->expression)], - $start_line - ); - }, - /** @return string|ast\Node */ - 'Microsoft\PhpParser\Token' => static function (PhpParser\Token $token, int $start_line) { - $kind = $token->kind; - $str = static::tokenToString($token); - if ($kind === TokenKind::StaticKeyword) { - return new ast\Node(ast\AST_NAME, flags\NAME_NOT_FQ, ['name' => $str], $start_line); - } - return $str; - }, - /** - * @throws InvalidNodeException - */ - 'Microsoft\PhpParser\MissingToken' => static function (PhpParser\MissingToken $unused_node, int $_) { - throw new InvalidNodeException(); - }, - /** - * @throws InvalidNodeException - */ - 'Microsoft\PhpParser\SkippedToken' => static function (PhpParser\SkippedToken $unused_node, int $_) { - throw new InvalidNodeException(); - }, - 'Microsoft\PhpParser\Node\Expression\ExitIntrinsicExpression' => static function (PhpParser\Node\Expression\ExitIntrinsicExpression $n, int $start_line) : ast\Node { - $expression = $n->expression; - $expr_node = $expression !== null ? static::phpParserNodeToAstNode($expression) : null; - return new ast\Node(ast\AST_EXIT, 0, ['expr' => $expr_node], $start_line); - }, - 'Microsoft\PhpParser\Node\Expression\CallExpression' => static function (PhpParser\Node\Expression\CallExpression $n, int $start_line) : ast\Node { - $callable_expression = $n->callableExpression; - $arg_list = static::phpParserArgListToAstArgList($n->argumentExpressionList, $start_line); - if ($callable_expression instanceof PhpParser\Node\Expression\MemberAccessExpression) { // $a->f() - return static::astNodeMethodCall( - static::phpParserNonValueNodeToAstNode($callable_expression->dereferencableExpression), - static::phpParserNodeToAstNode($callable_expression->memberName), - $arg_list, - $start_line - ); - } elseif ($callable_expression instanceof PhpParser\Node\Expression\ScopedPropertyAccessExpression) { // a::f() - return static::astNodeStaticCall( - static::phpParserNonValueNodeToAstNode($callable_expression->scopeResolutionQualifier), - static::phpParserNodeToAstNode($callable_expression->memberName), - $arg_list, - $start_line - ); - } else { // f() - return static::astNodeCall( - static::phpParserNonValueNodeToAstNode($callable_expression), - $arg_list, - $start_line - ); - } - }, - 'Microsoft\PhpParser\Node\Expression\ScriptInclusionExpression' => static function (PhpParser\Node\Expression\ScriptInclusionExpression $n, int $start_line) : ast\Node { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall should not happen - $flags = static::phpParserIncludeTokenToAstIncludeFlags($n->requireOrIncludeKeyword); - return new ast\Node( - ast\AST_INCLUDE_OR_EVAL, - $flags, - ['expr' => static::phpParserNodeToAstNode($n->expression)], - $start_line - ); - }, - /** - * @return ?ast\Node - */ - 'Microsoft\PhpParser\Node\Expression\IssetIntrinsicExpression' => static function (PhpParser\Node\Expression\IssetIntrinsicExpression $n, int $start_line) { - $ast_issets = []; - foreach ($n->expressions->children ?? [] as $var) { - if ($var instanceof Token) { - if ($var->kind === TokenKind::CommaToken) { - continue; - } elseif ($var->length === 0) { - continue; - } - } - $ast_issets[] = new ast\Node(ast\AST_ISSET, 0, [ - 'var' => static::phpParserNodeToAstNode($var), - ], $start_line); - } - $e = $ast_issets[0] ?? null; - for ($i = 1; $i < \count($ast_issets); $i++) { - $right = $ast_issets[$i]; - $e = new ast\Node( - ast\AST_BINARY_OP, - flags\BINARY_BOOL_AND, - [ - 'left' => $e, - 'right' => $right, - ], - $e->lineno - ); - } - return $e; - }, - 'Microsoft\PhpParser\Node\Expression\ArrayCreationExpression' => static function (PhpParser\Node\Expression\ArrayCreationExpression $n, int $start_line) : ast\Node { - return static::phpParserArrayToAstArray($n, $start_line); - }, - 'Microsoft\PhpParser\Node\Expression\ListIntrinsicExpression' => static function (PhpParser\Node\Expression\ListIntrinsicExpression $n, int $start_line) : ast\Node { - return static::phpParserListToAstList($n, $start_line); - }, - 'Microsoft\PhpParser\Node\Expression\ObjectCreationExpression' => static function (PhpParser\Node\Expression\ObjectCreationExpression $n, int $start_line) : ast\Node { - $end_line = static::getEndLine($n); - $class_type_designator = $n->classTypeDesignator; - if ($class_type_designator instanceof Token && $class_type_designator->kind === TokenKind::ClassKeyword) { - // Node of type AST_CLASS - $class_node = static::astStmtClass( - flags\CLASS_ANONYMOUS, - null, - $n->classBaseClause !== null ? static::phpParserNonValueNodeToAstNode($n->classBaseClause->baseClass) : null, - $n->classInterfaceClause, - static::phpParserStmtlistToAstNode($n->classMembers->classMemberDeclarations ?? [], $start_line, false), - $start_line, - $end_line, - $n->getDocCommentText() - ); - } else { - $class_node = static::phpParserNonValueNodeToAstNode($class_type_designator); - } - return new ast\Node(ast\AST_NEW, 0, [ - 'class' => $class_node, - 'args' => static::phpParserArgListToAstArgList($n->argumentExpressionList, $start_line), - ], $start_line); - }, - /** @return mixed */ - 'Microsoft\PhpParser\Node\Expression\ParenthesizedExpression' => static function (PhpParser\Node\Expression\ParenthesizedExpression $n, int $_) { - return static::phpParserNodeToAstNode($n->expression); - }, - 'Microsoft\PhpParser\Node\Expression\PrefixUpdateExpression' => static function (PhpParser\Node\Expression\PrefixUpdateExpression $n, int $start_line) : ast\Node { - $type = $n->incrementOrDecrementOperator->kind === TokenKind::PlusPlusToken ? ast\AST_PRE_INC : ast\AST_PRE_DEC; - - return new ast\Node($type, 0, ['var' => static::phpParserNodeToAstNode($n->operand)], $start_line); - }, - 'Microsoft\PhpParser\Node\Expression\PostfixUpdateExpression' => static function (PhpParser\Node\Expression\PostfixUpdateExpression $n, int $start_line) : ast\Node { - $type = $n->incrementOrDecrementOperator->kind === TokenKind::PlusPlusToken ? ast\AST_POST_INC : ast\AST_POST_DEC; - - return new ast\Node($type, 0, ['var' => static::phpParserNodeToAstNode($n->operand)], $start_line); - }, - 'Microsoft\PhpParser\Node\Expression\PrintIntrinsicExpression' => static function (PhpParser\Node\Expression\PrintIntrinsicExpression $n, int $start_line) : ast\Node { - return new ast\Node( - ast\AST_PRINT, - 0, - ['expr' => static::phpParserNodeToAstNode($n->expression)], - $start_line - ); - }, - /** @return ?ast\Node */ - 'Microsoft\PhpParser\Node\Expression\MemberAccessExpression' => static function (PhpParser\Node\Expression\MemberAccessExpression $n, int $start_line) { - return static::phpParserMemberAccessExpressionToAstProp($n, $start_line); - }, - 'Microsoft\PhpParser\Node\Expression\TernaryExpression' => static function (PhpParser\Node\Expression\TernaryExpression $n, int $start_line) : ast\Node { - return new ast\Node( - ast\AST_CONDITIONAL, - 0, - [ - 'cond' => static::phpParserNodeToAstNode($n->condition), - 'true' => $n->ifExpression !== null ? static::phpParserNodeToAstNode($n->ifExpression) : null, - 'false' => static::phpParserNodeToAstNode($n->elseExpression), - ], - $start_line - ); - }, - /** - * @return ?ast\Node - * @throws InvalidNodeException if the variable would be unanalyzable - * TODO: Consider ${''} as a placeholder instead? - */ - 'Microsoft\PhpParser\Node\Expression\Variable' => static function (PhpParser\Node\Expression\Variable $n, int $start_line) { - $name_node = $n->name; - // Note: there are 2 different ways to handle an Error. 1. Add a placeholder. 2. remove all of the statements in that tree. - if ($name_node instanceof PhpParser\Node) { - $name_node = static::phpParserNodeToAstNode($name_node); - } elseif ($name_node instanceof Token) { - if ($name_node instanceof PhpParser\MissingToken) { - if (self::$should_add_placeholders) { - $name_node = '__INCOMPLETE_VARIABLE__'; - } else { - throw new InvalidNodeException(); - } - } else { - if ($name_node->kind === TokenKind::VariableName) { - $name_node = static::variableTokenToString($name_node); - } else { - $name_node = static::tokenToString($name_node); - } - } - } - return new ast\Node(ast\AST_VAR, 0, ['name' => $name_node], $start_line); - }, - /** - * @return ast\Node - */ - 'Microsoft\PhpParser\Node\Expression\BracedExpression' => static function (PhpParser\Node\Expression\BracedExpression $n, int $_) { - return static::phpParserNodeToAstNode($n->expression); - }, - 'Microsoft\PhpParser\Node\Expression\YieldExpression' => static function (PhpParser\Node\Expression\YieldExpression $n, int $start_line) : ast\Node { - $kind = $n->yieldOrYieldFromKeyword->kind === TokenKind::YieldFromKeyword ? ast\AST_YIELD_FROM : ast\AST_YIELD; - - $array_element = $n->arrayElement; - $element_value = $array_element->elementValue ?? null; - // Workaround for <= 0.0.5 - // TODO: Remove workaround? - $ast_expr = ($element_value !== null && !($element_value instanceof MissingToken)) ? static::phpParserNodeToAstNode($array_element->elementValue) : null; - if ($kind === \ast\AST_YIELD) { - $element_key = $array_element->elementKey ?? null; - $children = [ - 'value' => $ast_expr, - 'key' => $element_key !== null ? static::phpParserNodeToAstNode($element_key) : null, - ]; - } else { - $children = [ - 'expr' => $ast_expr, - ]; - } - return new ast\Node( - $kind, - 0, - $children, - $start_line - ); - }, - 'Microsoft\PhpParser\Node\ReservedWord' => static function (PhpParser\Node\ReservedWord $n, int $start_line) : ast\Node { - return new ast\Node( - ast\AST_NAME, - flags\NAME_NOT_FQ, - ['name' => static::tokenToString($n->children)], - $start_line - ); - }, - 'Microsoft\PhpParser\Node\QualifiedName' => static function (PhpParser\Node\QualifiedName $n, int $start_line) : ast\Node { - $name_parts = $n->nameParts; - if (\count($name_parts) === 1) { - $part = $name_parts[0]; - '@phan-var Token $part'; - $imploded_parts = static::tokenToString($part); - if ($part->kind === TokenKind::Name) { - if (\preg_match('@^__(LINE|FILE|DIR|FUNCTION|CLASS|TRAIT|METHOD|NAMESPACE)__$@i', $imploded_parts) > 0) { - return new ast\Node( - ast\AST_MAGIC_CONST, - self::_MAGIC_CONST_LOOKUP[\strtoupper($imploded_parts)], - [], - self::getStartLine($part) - ); - } - } - } else { - $imploded_parts = static::phpParserNameToString($n); - } - if ($n->globalSpecifier !== null) { - $ast_kind = flags\NAME_FQ; - } elseif (($n->relativeSpecifier->namespaceKeyword ?? null) !== null) { - $ast_kind = flags\NAME_RELATIVE; - } else { - $ast_kind = flags\NAME_NOT_FQ; - } - return new ast\Node(ast\AST_NAME, $ast_kind, ['name' => $imploded_parts], $start_line); - }, - 'Microsoft\PhpParser\Node\Parameter' => static function (PhpParser\Node\Parameter $n, int $start_line) : ast\Node { - $type_line = static::getEndLine($n->typeDeclaration) ?: $start_line; - $default = $n->default; - $default_node = $default !== null ? static::phpParserNodeToAstNode($default) : null; - return static::astNodeParam( - $n->questionToken !== null, - $n->byRefToken !== null, - $n->dotDotDotToken !== null, - static::phpParserTypeToAstNode($n->typeDeclaration, $type_line), - static::variableTokenToString($n->variableName), - $default_node, - $start_line - ); - }, - /** @return int|float */ - 'Microsoft\PhpParser\Node\NumericLiteral' => static function (PhpParser\Node\NumericLiteral $n, int $_) { - $text = static::tokenToString($n->children); - $as_int = \filter_var($text, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL | FILTER_FLAG_ALLOW_HEX); - if ($as_int !== false) { - return $as_int; - } - return (float)$text; - }, - /** - * @return ast\Node|string - * @throws Exception if the tokens of the string literal are invalid, etc. - */ - 'Microsoft\PhpParser\Node\StringLiteral' => static function (PhpParser\Node\StringLiteral $n, int $start_line) { - $children = $n->children; - if ($children instanceof Token) { - $inner_node = static::parseQuotedString($n); - } elseif (\count($children) === 0) { - $inner_node = ''; - } elseif (\count($children) === 1 && $children[0] instanceof Token) { - $inner_node = static::parseQuotedString($n); - } else { - $inner_node = self::parseMultiPartString($n, $children); - } - if ($n->startQuote !== null && $n->startQuote->kind === TokenKind::BacktickToken) { - return new ast\Node(ast\AST_SHELL_EXEC, 0, ['expr' => $inner_node], isset($children[0]) ? self::getStartLine($children[0]) : $start_line); - // TODO: verify match - } - return $inner_node; - }, - /** @return mixed - Can return a node or a scalar, depending on the settings */ - 'Microsoft\PhpParser\Node\Statement\CompoundStatementNode' => static function (PhpParser\Node\Statement\CompoundStatementNode $n, int $_) { - $children = []; - foreach ($n->statements as $parser_node) { - // @phan-suppress-next-line PhanPossiblyNullTypeArgument - $child_node = static::phpParserNodeToAstNode($parser_node); - if (\is_array($child_node)) { - // EchoExpression returns multiple children. - foreach ($child_node as $child_node_part) { - $children[] = $child_node_part; - } - } elseif (!\is_null($child_node)) { - $children[] = $child_node; - } - } - return $children; - }, - /** - * @return int|string|ast\Node|null - * null if incomplete - * int|string for no-op scalar statements like `;2;` - */ - 'Microsoft\PhpParser\Node\Statement\ExpressionStatement' => static function (PhpParser\Node\Statement\ExpressionStatement $n, int $_) { - $expression = $n->expression; - // tolerant-php-parser uses parseExpression(..., $force=true), which can return an array. - // It is the only thing that uses $force=true at the time of writing. - if (!\is_object($expression)) { - return null; - } - return static::phpParserNodeToAstNode($n->expression); - }, - 'Microsoft\PhpParser\Node\Statement\BreakOrContinueStatement' => static function (PhpParser\Node\Statement\BreakOrContinueStatement $n, int $start_line) : ast\Node { - $kind = $n->breakOrContinueKeyword->kind === TokenKind::ContinueKeyword ? ast\AST_CONTINUE : ast\AST_BREAK; - $breakout_level = $n->breakoutLevel; - if ($breakout_level !== null) { - $breakout_level = static::phpParserNodeToAstNode($breakout_level); - if (!\is_int($breakout_level)) { - $breakout_level = null; - } - } - return new ast\Node($kind, 0, ['depth' => $breakout_level], $start_line); - }, - 'Microsoft\PhpParser\Node\CatchClause' => static function (PhpParser\Node\CatchClause $n, int $start_line) : ast\Node { - $qualified_name = $n->qualifiedName; - $catch_inner_list = []; - // Handle `catch()` syntax error - if ($qualified_name instanceof PhpParser\Node\QualifiedName) { - $catch_inner_list[] = static::phpParserNonValueNodeToAstNode($qualified_name); - } - foreach ($n->otherQualifiedNameList as $other_qualified_name) { - if ($other_qualified_name instanceof PhpParser\Node\QualifiedName) { - $catch_inner_list[] = static::phpParserNonValueNodeToAstNode($other_qualified_name); - } - } - $catch_list_node = new ast\Node(ast\AST_NAME_LIST, 0, $catch_inner_list, $catch_inner_list[0]->lineno ?? $start_line); - // TODO: Change to handle multiple exception types in catch clauses - // after https://github.com/Microsoft/tolerant-php-parser/issues/103 is supported - return static::astStmtCatch( - $catch_list_node, - static::variableTokenToString($n->variableName), - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable return_null_on_empty is false. - static::phpParserStmtlistToAstNode($n->compoundStatement, $start_line, false), - $start_line - ); - }, - 'Microsoft\PhpParser\Node\Statement\InterfaceDeclaration' => static function (PhpParser\Node\Statement\InterfaceDeclaration $n, int $start_line) : ast\Node { - $end_line = static::getEndLine($n) ?: $start_line; - return static::astStmtClass( - flags\CLASS_INTERFACE, - static::tokenToString($n->name), - static::interfaceBaseClauseToNode($n->interfaceBaseClause), - null, - static::phpParserStmtlistToAstNode($n->interfaceMembers->interfaceMemberDeclarations ?? [], $start_line, false), - $start_line, - $end_line, - $n->getDocCommentText() - ); - }, - 'Microsoft\PhpParser\Node\Statement\ClassDeclaration' => static function (PhpParser\Node\Statement\ClassDeclaration $n, int $start_line) : ast\Node { - $end_line = static::getEndLine($n); - $base_class = $n->classBaseClause->baseClass ?? null; - return static::astStmtClass( - static::phpParserClassModifierToAstClassFlags($n->abstractOrFinalModifier), - static::tokenToString($n->name), - $base_class !== null ? static::phpParserNonValueNodeToAstNode($base_class) : null, - $n->classInterfaceClause, - static::phpParserStmtlistToAstNode($n->classMembers->classMemberDeclarations ?? [], self::getStartLine($n->classMembers), false), - $start_line, - $end_line, - $n->getDocCommentText() - ); - }, - 'Microsoft\PhpParser\Node\Statement\TraitDeclaration' => static function (PhpParser\Node\Statement\TraitDeclaration $n, int $start_line) : ast\Node { - $end_line = static::getEndLine($n) ?: $start_line; - return static::astStmtClass( - flags\CLASS_TRAIT, - static::tokenToString($n->name), - null, - null, - static::phpParserStmtlistToAstNode($n->traitMembers->traitMemberDeclarations ?? [], self::getStartLine($n->traitMembers), false), - $start_line, - $end_line, - $n->getDocCommentText() - ); - }, - 'Microsoft\PhpParser\Node\ClassConstDeclaration' => static function (PhpParser\Node\ClassConstDeclaration $n, int $start_line) : ast\Node { - return static::phpParserClassConstToAstNode($n, $start_line); - }, - /** @return null - A stub that will be removed by the caller. */ - 'Microsoft\PhpParser\Node\MissingMemberDeclaration' => static function (PhpParser\Node\MissingMemberDeclaration $unused_n, int $unused_start_line) { - // This node type is generated for something that isn't a function/constant/property. e.g. "public example();" - return null; - }, - /** - * @throws InvalidNodeException - */ - 'Microsoft\PhpParser\Node\MethodDeclaration' => static function (PhpParser\Node\MethodDeclaration $n, int $start_line) : ast\Node { - $statements = $n->compoundStatementOrSemicolon; - $ast_return_type = static::phpParserTypeToAstNode($n->returnType, static::getEndLine($n->returnType) ?: $start_line); - if (($ast_return_type->children['name'] ?? null) === '') { - $ast_return_type = null; - } - $original_method_name = $n->name; - if (!($original_method_name instanceof Token)) { - throw new InvalidNodeException(); - } - if ($original_method_name->kind === TokenKind::Name) { - $method_name = static::tokenToString($original_method_name); - } else { - $method_name = 'placeholder_' . $original_method_name->fullStart; - } - - if ($n->questionToken !== null && $ast_return_type !== null) { - $ast_return_type = new ast\Node(ast\AST_NULLABLE_TYPE, 0, ['type' => $ast_return_type], $start_line); - } - return static::newAstDecl( - ast\AST_METHOD, - static::phpParserVisibilityToAstVisibility($n->modifiers) | ($n->byRefToken !== null ? flags\FUNC_RETURNS_REF : 0), - [ - 'params' => static::phpParserParamsToAstParams($n->parameters, $start_line), - 'uses' => null, - 'stmts' => static::phpParserStmtlistToAstNode($statements, self::getStartLine($statements), true), - 'returnType' => $ast_return_type, - ], - $start_line, - $n->getDocCommentText(), - $method_name, - static::getEndLine($n), - self::nextDeclId() - ); - }, - 'Microsoft\PhpParser\Node\Statement\ConstDeclaration' => static function (PhpParser\Node\Statement\ConstDeclaration $n, int $start_line) : ast\Node { - return static::phpParserConstToAstNode($n, $start_line); - }, - 'Microsoft\PhpParser\Node\Statement\DeclareStatement' => static function (PhpParser\Node\Statement\DeclareStatement $n, int $start_line) : ast\Node { - $doc_comment = $n->getDocCommentText(); - $directive = $n->declareDirective; - if (!($directive instanceof PhpParser\Node\DeclareDirective)) { - throw new AssertionError("Unexpected type for directive"); - } - return static::astStmtDeclare( - static::phpParserDeclareListToAstDeclares($directive, $start_line, $doc_comment), - $n->statements !== null ? static::phpParserStmtlistToAstNode($n->statements, $start_line, true) : null, - $start_line - ); - }, - 'Microsoft\PhpParser\Node\Statement\DoStatement' => static function (PhpParser\Node\Statement\DoStatement $n, int $start_line) : ast\Node { - return new ast\Node( - ast\AST_DO_WHILE, - 0, - [ - 'stmts' => static::phpParserStmtlistToAstNode($n->statement, $start_line, false), - 'cond' => static::phpParserNodeToAstNode($n->expression), - ], - $start_line - ); - }, - /** - * @return ast\Node|ast\Node[] - */ - 'Microsoft\PhpParser\Node\Expression\EchoExpression' => static function (PhpParser\Node\Expression\EchoExpression $n, int $start_line) { - $ast_echos = []; - foreach ($n->expressions->children ?? [] as $expr) { - if ($expr instanceof Token && $expr->kind === TokenKind::CommaToken) { - continue; - } - $ast_echos[] = new ast\Node( - ast\AST_ECHO, - 0, - ['expr' => static::phpParserNodeToAstNode($expr)], - $start_line - ); - } - return \count($ast_echos) === 1 ? $ast_echos[0] : $ast_echos; - }, - /** - * @return ?ast\Node - */ - 'Microsoft\PhpParser\Node\ForeachKey' => static function (PhpParser\Node\ForeachKey $n, int $_) { - $result = static::phpParserNodeToAstNode($n->expression); - if (!$result instanceof ast\Node) { - return null; - } - return $result; - }, - 'Microsoft\PhpParser\Node\Statement\ForeachStatement' => static function (PhpParser\Node\Statement\ForeachStatement $n, int $start_line) : ast\Node { - $foreach_value = $n->foreachValue; - $value = static::phpParserNodeToAstNode($foreach_value->expression); - if ($foreach_value->ampersand) { - $value = new ast\Node( - ast\AST_REF, - 0, - ['var' => $value], - $value->lineno ?? $start_line - ); - } - $foreach_key = $n->foreachKey; - return new ast\Node( - ast\AST_FOREACH, - 0, - [ - 'expr' => static::phpParserNodeToAstNode($n->forEachCollectionName), - 'value' => $value, - 'key' => $foreach_key !== null ? static::phpParserNodeToAstNode($foreach_key) : null, - 'stmts' => static::phpParserStmtlistToAstNode($n->statements, $start_line, true), - ], - $start_line - ); - //return static::phpParserStmtlistToAstNode($n->statements, $start_line); - }, - 'Microsoft\PhpParser\Node\FinallyClause' => static function (PhpParser\Node\FinallyClause $n, int $start_line) : ast\Node { - // @phan-suppress-next-line PhanTypeMismatchReturnNullable return_null_on_empty is false. - return static::phpParserStmtlistToAstNode($n->compoundStatement, $start_line, false); - }, - /** - * @throws InvalidNodeException - */ - 'Microsoft\PhpParser\Node\Statement\FunctionDeclaration' => static function (PhpParser\Node\Statement\FunctionDeclaration $n, int $start_line) : ast\Node { - $end_line = static::getEndLine($n) ?: $start_line; - $ast_return_type = static::phpParserTypeToAstNode($n->returnType, static::getEndLine($n->returnType) ?: $start_line); - if (($ast_return_type->children['name'] ?? null) === '') { - $ast_return_type = null; - } - if ($n->questionToken !== null && $ast_return_type !== null) { - $ast_return_type = new ast\Node(ast\AST_NULLABLE_TYPE, 0, ['type' => $ast_return_type], $start_line); - } - $name = $n->name; - if (!($name instanceof Token)) { - throw new InvalidNodeException(); - } - - return static::astDeclFunction( - $n->byRefToken !== null, - static::tokenToString($name), - static::phpParserParamsToAstParams($n->parameters, $start_line), - $ast_return_type, - static::phpParserStmtlistToAstNode($n->compoundStatementOrSemicolon, self::getStartLine($n->compoundStatementOrSemicolon), false), - $start_line, - $end_line, - $n->getDocCommentText() - ); - }, - /** @return ast\Node|ast\Node[] */ - 'Microsoft\PhpParser\Node\Statement\GlobalDeclaration' => static function (PhpParser\Node\Statement\GlobalDeclaration $n, int $start_line) { - $global_nodes = []; - foreach ($n->variableNameList->children ?? [] as $var) { - if ($var instanceof Token && $var->kind === TokenKind::CommaToken) { - continue; - } - $global_nodes[] = new ast\Node(ast\AST_GLOBAL, 0, ['var' => static::phpParserNodeToAstNode($var)], static::getEndLine($var) ?: $start_line); - } - return \count($global_nodes) === 1 ? $global_nodes[0] : $global_nodes; - }, - 'Microsoft\PhpParser\Node\Statement\IfStatementNode' => static function (PhpParser\Node\Statement\IfStatementNode $n, int $start_line) : ast\Node { - return static::phpParserIfStmtToAstIfStmt($n, $start_line); - }, - /** @return ast\Node|ast\Node[] */ - 'Microsoft\PhpParser\Node\Statement\InlineHtml' => static function (PhpParser\Node\Statement\InlineHtml $n, int $start_line) { - $text = $n->text; - if ($text === null) { - return []; // For the beginning/end of files - } - return new ast\Node( - ast\AST_ECHO, - 0, - ['expr' => static::tokenToRawString($n->text)], - $start_line - ); - }, - /** @suppress PhanTypeMismatchArgument TODO: Make ForStatement have more accurate docs? */ - 'Microsoft\PhpParser\Node\Statement\ForStatement' => static function (PhpParser\Node\Statement\ForStatement $n, int $start_line) : ast\Node { - return new ast\Node( - ast\AST_FOR, - 0, - [ - 'init' => $n->forInitializer !== null ? static::phpParserExprListToExprList($n->forInitializer, $start_line) : null, - 'cond' => $n->forControl !== null ? static::phpParserExprListToExprList($n->forControl, $start_line) : null, - 'loop' => $n->forEndOfLoop !== null ? static::phpParserExprListToExprList($n->forEndOfLoop, $start_line) : null, - 'stmts' => static::phpParserStmtlistToAstNode($n->statements, $start_line, true), - ], - $start_line - ); - }, - /** @return ast\Node[] */ - 'Microsoft\PhpParser\Node\Statement\NamespaceUseDeclaration' => static function (PhpParser\Node\Statement\NamespaceUseDeclaration $n, int $start_line) { - $use_clauses = $n->useClauses; - $results = []; - $parser_use_kind = $n->functionOrConst->kind ?? null; - foreach ($use_clauses->children ?? [] as $use_clause) { - if (!($use_clause instanceof PhpParser\Node\NamespaceUseClause)) { - continue; - } - $results[] = static::astStmtUseOrGroupUseFromUseClause($use_clause, $parser_use_kind, $start_line); - } - return $results; - }, - 'Microsoft\PhpParser\Node\Statement\NamespaceDefinition' => static function (PhpParser\Node\Statement\NamespaceDefinition $n, int $start_line) : ast\Node { - $stmt = $n->compoundStatementOrSemicolon; - $name_node = $n->name; - if ($stmt instanceof PhpParser\Node) { - $stmts_start_line = self::getStartLine($stmt); - $ast_stmt = static::phpParserStmtlistToAstNode($n->compoundStatementOrSemicolon, $stmts_start_line, true); - $start_line = $name_node !== null ? self::getStartLine($name_node) : $stmts_start_line; // imitate php-ast - } else { - $ast_stmt = null; - } - return new ast\Node( - ast\AST_NAMESPACE, - 0, - [ - 'name' => $name_node !== null ? static::phpParserNameToString($name_node) : null, - 'stmts' => $ast_stmt, - ], - $start_line - ); - }, - /** @return array{} */ - 'Microsoft\PhpParser\Node\Statement\EmptyStatement' => static function (PhpParser\Node\Statement\EmptyStatement $unused_node, int $unused_start_line) : array { - // `;;` - return []; - }, - 'Microsoft\PhpParser\Node\PropertyDeclaration' => static function (PhpParser\Node\PropertyDeclaration $n, int $start_line) : ast\Node { - return static::phpParserPropertyToAstNode($n, $start_line); - }, - 'Microsoft\PhpParser\Node\Statement\ReturnStatement' => static function (PhpParser\Node\Statement\ReturnStatement $n, int $start_line) : ast\Node { - $e = $n->expression; - $expr_node = $e !== null ? static::phpParserNodeToAstNode($e) : null; - return new ast\Node(ast\AST_RETURN, 0, ['expr' => $expr_node], $start_line); - }, - /** @return ast\Node|ast\Node[] */ - 'Microsoft\PhpParser\Node\Statement\FunctionStaticDeclaration' => static function (PhpParser\Node\Statement\FunctionStaticDeclaration $n, int $start_line) { - $static_nodes = []; - foreach ($n->staticVariableNameList->children ?? [] as $var) { - if ($var instanceof Token) { - continue; - } - if (!($var instanceof PhpParser\Node\StaticVariableDeclaration)) { - // FIXME error tolerance - throw new AssertionError("Expected StaticVariableDeclaration"); - } - - $assignment = $var->assignment; - $static_nodes[] = new ast\Node(ast\AST_STATIC, 0, [ - 'var' => new ast\Node(ast\AST_VAR, 0, ['name' => static::phpParserNodeToAstNode($var->variableName)], static::getEndLine($var) ?: $start_line), - 'default' => $assignment !== null ? static::phpParserNodeToAstNode($assignment) : null, - ], static::getEndLine($var) ?: $start_line); - } - return \count($static_nodes) === 1 ? $static_nodes[0] : $static_nodes; - }, - 'Microsoft\PhpParser\Node\Statement\SwitchStatementNode' => static function (PhpParser\Node\Statement\SwitchStatementNode $n, int $start_line) : ast\Node { - return static::phpParserSwitchListToAstSwitch($n, $start_line); - }, - 'Microsoft\PhpParser\Node\Statement\ThrowStatement' => static function (PhpParser\Node\Statement\ThrowStatement $n, int $start_line) : ast\Node { - return new ast\Node( - ast\AST_THROW, - 0, - ['expr' => static::phpParserNodeToAstNode($n->expression)], - $start_line - ); - }, - - 'Microsoft\PhpParser\Node\TraitUseClause' => static function (PhpParser\Node\TraitUseClause $n, int $start_line) : ast\Node { - $clauses_list_node = $n->traitSelectAndAliasClauses; - if ($clauses_list_node instanceof PhpParser\Node\DelimitedList\TraitSelectOrAliasClauseList) { - $adaptations_inner = []; - foreach ($clauses_list_node->children as $select_or_alias_clause) { - if ($select_or_alias_clause instanceof Token) { - continue; - } - if (!($select_or_alias_clause instanceof PhpParser\Node\TraitSelectOrAliasClause)) { - throw new AssertionError("Expected TraitSelectOrAliasClause"); - } - $result = static::phpParserNodeToAstNode($select_or_alias_clause); - if ($result instanceof ast\Node) { - $adaptations_inner[] = $result; - } - } - $adaptations = new ast\Node(ast\AST_TRAIT_ADAPTATIONS, 0, $adaptations_inner, $adaptations_inner[0]->lineno ?? $start_line); - } else { - $adaptations = null; - } - return new ast\Node( - ast\AST_USE_TRAIT, - 0, - [ - 'traits' => static::phpParserNameListToAstNameList($n->traitNameList->children ?? [], $start_line), - 'adaptations' => $adaptations, - ], - $start_line - ); - }, - - /** - * @return ?ast\Node - */ - 'Microsoft\PhpParser\Node\TraitSelectOrAliasClause' => static function (PhpParser\Node\TraitSelectOrAliasClause $n, int $start_line) { - // FIXME targetName phpdoc is wrong. - $name = $n->name; - if ($n->asOrInsteadOfKeyword->kind === TokenKind::InsteadOfKeyword) { - $member_name_list = $name->memberName ?? null; - if ($member_name_list === null) { - return null; - } - - $target_name_list = array_merge([$n->targetName], $n->remainingTargetNames ?? []); - if (\is_object($member_name_list)) { - $member_name_list = [$member_name_list]; - } - // Trait::y insteadof OtherTrait - $trait_node = static::phpParserNonValueNodeToAstNode($name->scopeResolutionQualifier); - $method_node = static::phpParserNameListToAstNameList($member_name_list, $start_line); - $target_node = static::phpParserNameListToAstNameList($target_name_list, $start_line); - $outer_method_node = new ast\Node(ast\AST_METHOD_REFERENCE, 0, [ - 'class' => $trait_node, - 'method' => $method_node->children[0] - ], $start_line); - - if (\count($member_name_list) !== 1) { - throw new AssertionError("Expected insteadof member_name_list length to be 1"); - } - $children = [ - 'method' => $outer_method_node, - 'insteadof' => $target_node, - ]; - return new ast\Node(ast\AST_TRAIT_PRECEDENCE, 0, $children, $start_line); - } else { - if ($name instanceof PhpParser\Node\Expression\ScopedPropertyAccessExpression) { - $class_node = static::phpParserNonValueNodeToAstNode($name->scopeResolutionQualifier); - $method_node = static::phpParserNodeToAstNode($name->memberName); - } else { - $class_node = null; - $method_node = static::phpParserNameToString($name); - } - $flags = static::phpParserVisibilityToAstVisibility($n->modifiers, false); - $target_name = $n->targetName; - $target_name = $target_name instanceof PhpParser\Node\QualifiedName ? static::phpParserNameToString($target_name) : null; - $children = [ - 'method' => new ast\Node(ast\AST_METHOD_REFERENCE, 0, [ - 'class' => $class_node, - 'method' => $method_node, - ], $start_line), - 'alias' => $target_name, - ]; - - return new ast\Node(ast\AST_TRAIT_ALIAS, $flags, $children, $start_line); - } - }, - 'Microsoft\PhpParser\Node\Statement\TryStatement' => static function (PhpParser\Node\Statement\TryStatement $n, int $start_line) : ast\Node { - $finally_clause = $n->finallyClause; - return static::astNodeTry( - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable return_null_on_empty is false. - static::phpParserStmtlistToAstNode($n->compoundStatement, $start_line, false), // $n->try - static::phpParserCatchlistToAstCatchlist($n->catchClauses ?? [], $start_line), - $finally_clause !== null ? static::phpParserStmtlistToAstNode($finally_clause->compoundStatement, self::getStartLine($finally_clause), false) : null, - $start_line - ); - }, - /** @return ast\Node|ast\Node[] */ - 'Microsoft\PhpParser\Node\Expression\UnsetIntrinsicExpression' => static function (PhpParser\Node\Expression\UnsetIntrinsicExpression $n, int $start_line) { - $stmts = []; - foreach ($n->expressions->children ?? [] as $var) { - if ($var instanceof Token) { - // Skip over ',' and invalid tokens - continue; - } - $stmts[] = new ast\Node(ast\AST_UNSET, 0, ['var' => static::phpParserNodeToAstNode($var)], static::getEndLine($var) ?: $start_line); - } - return \count($stmts) === 1 ? $stmts[0] : $stmts; - }, - 'Microsoft\PhpParser\Node\Statement\WhileStatement' => static function (PhpParser\Node\Statement\WhileStatement $n, int $start_line) : ast\Node { - return static::astNodeWhile( - static::phpParserNodeToAstNode($n->expression), - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable return_null_on_empty is false. - static::phpParserStmtlistToAstNode($n->statements, $start_line, false), - $start_line - ); - }, - 'Microsoft\PhpParser\Node\Statement\GotoStatement' => static function (PhpParser\Node\Statement\GotoStatement $n, int $start_line) : ast\Node { - return new ast\Node(ast\AST_GOTO, 0, ['label' => static::tokenToString($n->name)], $start_line); - }, - /** @return ast\Node[] */ - 'Microsoft\PhpParser\Node\Statement\NamedLabelStatement' => static function (PhpParser\Node\Statement\NamedLabelStatement $n, int $start_line) { - $label = new ast\Node(ast\AST_LABEL, 0, ['name' => static::tokenToString($n->name)], $start_line); - $statement = static::phpParserNodeToAstNode($n->statement); - return [$label, $statement]; - }, - ]; - - foreach ($closures as $key => $_) { - if (!(\class_exists($key))) { - throw new AssertionError("Class $key should exist"); - } - } - return $closures; - } - - /** - * Overridden in TolerantASTConverterWithNodeMapping - * - * @param PhpParser\Node\NamespaceUseClause $use_clause - * @param ?int $parser_use_kind - * @param int $start_line - * @return ast\Node - * - * @throws InvalidNodeException - */ - protected static function astStmtUseOrGroupUseFromUseClause(PhpParser\Node\NamespaceUseClause $use_clause, $parser_use_kind, int $start_line) : ast\Node - { - $namespace_name_node = $use_clause->namespaceName; - if ($namespace_name_node instanceof PhpParser\Node\QualifiedName) { - $namespace_name = \rtrim(static::phpParserNameToString($namespace_name_node), '\\'); - } else { - throw new InvalidNodeException(); - } - if ($use_clause->groupClauses !== null) { - return static::astStmtGroupUse( - $parser_use_kind, // E.g. kind is FunctionKeyword or ConstKeyword or null - $namespace_name, - static::phpParserNamespaceUseListToAstUseList($use_clause->groupClauses->children ?? []), - $start_line - ); - } else { - $alias_token = $use_clause->namespaceAliasingClause->name ?? null; - $alias = $alias_token !== null ? static::tokenToString($alias_token) : null; - return static::astStmtUse($parser_use_kind, $namespace_name, $alias, $start_line); - } - } - - /** - * @param ast\Node $try_node - * @param ?ast\Node $catches_node - * @param ?ast\Node $finally_node - */ - private static function astNodeTry( - $try_node, - $catches_node, - $finally_node, - int $start_line - ) : ast\Node { - // Return fields of $node->children in the same order as php-ast - $children = [ - 'try' => $try_node, - ]; - if ($catches_node !== null) { - $children['catches'] = $catches_node; - } - $children['finally'] = $finally_node; - return new ast\Node(ast\AST_TRY, 0, $children, $start_line); - } - - /** - * @param ast\Node $stmts - */ - private static function astStmtCatch(ast\Node $types, string $var, $stmts, int $lineno) : ast\Node - { - return new ast\Node( - ast\AST_CATCH, - 0, - [ - 'class' => $types, - 'var' => new ast\Node(ast\AST_VAR, 0, ['name' => $var], $lineno), - 'stmts' => $stmts, - ], - $lineno - ); - } - - /** - * @param PhpParser\Node\CatchClause[] $catches - */ - private static function phpParserCatchlistToAstCatchlist(array $catches, int $lineno) : ast\Node - { - $children = []; - foreach ($catches as $parser_catch) { - $children[] = static::phpParserNonValueNodeToAstNode($parser_catch); - } - return new ast\Node(ast\AST_CATCH_LIST, 0, $children, $children[0]->lineno ?? $lineno); - } - - /** - * @param array<int,Token|PhpParser\Node> $types - */ - private static function phpParserNameListToAstNameList(array $types, int $line) : ast\Node - { - $ast_types = []; - foreach ($types as $type) { - if ($type instanceof Token && $type->kind === TokenKind::CommaToken) { - continue; - } - $ast_types[] = static::phpParserNonValueNodeToAstNode($type); - } - return new ast\Node(ast\AST_NAME_LIST, 0, $ast_types, $line); - } - - /** - * @param ast\Node|string|int|float $cond - */ - private static function astNodeWhile($cond, ast\Node $stmts, int $start_line) : ast\Node - { - return new ast\Node( - ast\AST_WHILE, - 0, - [ - 'cond' => $cond, - 'stmts' => $stmts, - ], - $start_line - ); - } - - /** - * @param ast\Node|string|int|float $var - * @param ast\Node|string|int|float $expr - */ - private static function astNodeAssign($var, $expr, int $line, bool $ref) : ast\Node - { - return new ast\Node( - $ref ? ast\AST_ASSIGN_REF : ast\AST_ASSIGN, - 0, - [ - 'var' => $var, - 'expr' => $expr, - ], - $line - ); - } - - /** - * @throws Error if the kind could not be found - */ - private static function phpParserIncludeTokenToAstIncludeFlags(Token $type) : int - { - switch ($type->kind) { - case TokenKind::IncludeKeyword: - return flags\EXEC_INCLUDE; - case TokenKind::IncludeOnceKeyword: - return flags\EXEC_INCLUDE_ONCE; - case TokenKind::RequireKeyword: - return flags\EXEC_REQUIRE; - case TokenKind::RequireOnceKeyword: - return flags\EXEC_REQUIRE_ONCE; - default: - throw new \Error("Unrecognized PhpParser include/require type"); - } - } - - /** - * @param PhpParser\Node\QualifiedName|Token|null $type - * @return ?ast\Node - */ - protected static function phpParserTypeToAstNode($type, int $line) - { - if (\is_null($type)) { - return null; - } - $original_type = $type; - if ($type instanceof PhpParser\Node\QualifiedName) { - $type = static::phpParserNameToString($type); - } elseif ($type instanceof Token) { - $type = static::tokenToString($type); - } - if (\is_string($type)) { - switch (\strtolower($type)) { - case 'null': - $flags = flags\TYPE_NULL; - break; - case 'bool': - $flags = flags\TYPE_BOOL; - break; - case 'int': - $flags = flags\TYPE_LONG; - break; - case 'float': - $flags = flags\TYPE_DOUBLE; - break; - case 'string': - $flags = flags\TYPE_STRING; - break; - case 'array': - $flags = flags\TYPE_ARRAY; - break; - case 'object': - $flags = flags\TYPE_OBJECT; - break; - case 'callable': - $flags = flags\TYPE_CALLABLE; - break; - case 'void': - $flags = flags\TYPE_VOID; - break; - case 'iterable': - $flags = flags\TYPE_ITERABLE; - break; - default: - // TODO: Refactor this into a function accepting a QualifiedName - if ($original_type instanceof PhpParser\Node\QualifiedName) { - if ($original_type->globalSpecifier !== null) { - $ast_kind = flags\NAME_FQ; - } elseif (($original_type->relativeSpecifier->namespaceKeyword ?? null) !== null) { - $ast_kind = flags\NAME_RELATIVE; - } else { - $ast_kind = flags\NAME_NOT_FQ; - } - } else { - $ast_kind = flags\NAME_NOT_FQ; - } - return new ast\Node( - ast\AST_NAME, - $ast_kind, - ['name' => $type], - $line - ); - } - return new ast\Node(ast\AST_TYPE, $flags, [], $line); - } - return static::phpParserNodeToAstNode($type); - } - - /** - * @param bool $by_ref - * @param ?ast\Node $type - * @param string $name - * @param ?ast\Node|?int|?string|?float $default - */ - private static function astNodeParam(bool $is_nullable, bool $by_ref, bool $variadic, $type, $name, $default, int $line) : ast\Node - { - if ($is_nullable) { - $type = new ast\Node( - ast\AST_NULLABLE_TYPE, - 0, - ['type' => $type], - $line - ); - } - return new ast\Node( - ast\AST_PARAM, - ($by_ref ? flags\PARAM_REF : 0) | ($variadic ? flags\PARAM_VARIADIC : 0), - [ - 'type' => $type, - 'name' => $name, - 'default' => $default, - ], - $line - ); - } - - /** @param ?PhpParser\Node\DelimitedList\ParameterDeclarationList $parser_params */ - private static function phpParserParamsToAstParams($parser_params, int $line) : ast\Node - { - $new_params = []; - foreach ($parser_params->children ?? [] as $parser_node) { - if ($parser_node instanceof Token) { - continue; - } - $new_params[] = static::phpParserNodeToAstNode($parser_node); - } - return new ast\Node( - ast\AST_PARAM_LIST, - 0, - $new_params, - $new_params[0]->lineno ?? $line - ); - } - - /** - * @param PhpParser\Node|PhpParser\Token $parser_node - * @suppress UnusedSuppression, TypeMismatchProperty - */ - protected static function astStub($parser_node) : ast\Node - { - // Debugging code. - if (\getenv(self::ENV_AST_THROW_INVALID)) { - // @phan-suppress-next-line PhanThrowTypeAbsent only throws for debugging - throw new \Error("TODO:" . get_class($parser_node)); - } - - $node = new ast\Node(); - $node->kind = "TODO:" . get_class($parser_node); - $node->flags = 0; - $node->lineno = self::getStartLine($parser_node); - $node->children = []; - return $node; - } - - /** - * @param ?PhpParser\Node\DelimitedList\UseVariableNameList $uses - * @param int $line - * @return ?ast\Node - */ - private static function phpParserClosureUsesToAstClosureUses( - $uses, - int $line - ) { - if (count($uses->children ?? []) === 0) { - return null; - } - $ast_uses = []; - foreach ($uses->children as $use) { - if ($use instanceof Token) { - continue; - } - if (!($use instanceof PhpParser\Node\UseVariableName)) { - throw new AssertionError("Expected UseVariableName"); - } - $ast_uses[] = new ast\Node(ast\AST_CLOSURE_VAR, $use->byRef ? 1 : 0, ['name' => static::tokenToString($use->variableName)], self::getStartLine($use)); - } - return new ast\Node(ast\AST_CLOSURE_USES, 0, $ast_uses, $ast_uses[0]->lineno ?? $line); - } - - /** - * @return ?string - */ - private static function resolveDocCommentForClosure(PhpParser\Node\Expression\AnonymousFunctionCreationExpression $node) - { - $doc_comment = $node->getDocCommentText(); - if ($doc_comment) { - return $doc_comment; - } - for ($prev_node = $node; $node = $node->parent; $prev_node = $node) { - if ($node instanceof PhpParser\Node\Expression\AssignmentExpression || - $node instanceof PhpParser\Node\Expression\ParenthesizedExpression || - $node instanceof PhpParser\Node\ArrayElement || - $node instanceof PhpParser\Node\Statement\ReturnStatement) { - $doc_comment = $node->getDocCommentText(); - if ($doc_comment) { - return $doc_comment; - } - continue; - } - if ($node instanceof PhpParser\Node\Expression\ArgumentExpression) { - // Skip ArgumentExpression and the PhpParser\Node\DelimitedList\ArgumentExpressionList - // to get to the CallExpression - $node = $node->parent->parent; - // fall through - } - if ($node instanceof PhpParser\Node\Expression\MemberAccessExpression) { - // E.g. ((Closure)->bindTo()) - if ($prev_node !== $node->dereferencableExpression) { - return null; - } - $doc_comment = $node->getDocCommentText(); - if ($doc_comment) { - return $doc_comment; - } - continue; - } - if ($node instanceof PhpParser\Node\Expression\CallExpression) { - if ($prev_node === $node->callableExpression) { - $doc_comment = $node->getDocCommentText(); - if ($doc_comment) { - return $doc_comment; - } - continue; - } - if ($node->callableExpression instanceof PhpParser\Node\Expression\AnonymousFunctionCreationExpression) { - return null; - } - $found = false; - foreach ($node->argumentExpressionList->children ?? [] as $argument_expression) { - if (!($argument_expression instanceof PhpParser\Node\Expression\ArgumentExpression)) { - continue; - } - $expression = $argument_expression->expression; - if ($expression === $prev_node) { - $found = true; - $doc_comment = $node->getDocCommentText(); - if ($doc_comment) { - return $doc_comment; - } - break; - } - if (!($expression instanceof PhpParser\Node)) { - continue; - } - if ($expression instanceof PhpParser\Node\ConstElement || $expression instanceof PhpParser\Node\NumericLiteral || $expression instanceof PhpParser\Node\StringLiteral) { - continue; - } - return null; - } - - if ($found) { - continue; - } - } - break; - } - return null; - } - - /** - * @param ?ast\Node $uses - * @param ?ast\Node $return_type - * @param ?string $doc_comment - */ - private static function astDeclClosure( - bool $by_ref, - bool $static, - ast\Node $params, - $uses, - ast\Node $stmts, - $return_type, - int $start_line, - int $end_line, - $doc_comment - ) : ast\Node { - return static::newAstDecl( - ast\AST_CLOSURE, - ($by_ref ? flags\FUNC_RETURNS_REF : 0) | ($static ? flags\MODIFIER_STATIC : 0), - [ - 'params' => $params, - 'uses' => $uses, - 'stmts' => $stmts, - 'returnType' => $return_type, - ], - $start_line, - $doc_comment, - '{closure}', - $end_line, - self::nextDeclId() - ); - } - - /** - * @param ?ast\Node $return_type - * @param ?ast\Node $stmts (TODO: create empty statement list instead of null) - * @param ?string $doc_comment - */ - private static function astDeclFunction( - bool $by_ref, - string $name, - ast\Node $params, - $return_type, - $stmts, - int $line, - int $end_line, - $doc_comment - ) : ast\Node { - return static::newAstDecl( - ast\AST_FUNC_DECL, - $by_ref ? flags\FUNC_RETURNS_REF : 0, - [ - 'params' => $params, - 'uses' => null, - 'stmts' => $stmts, - 'returnType' => $return_type, - ], - $line, - $doc_comment, - $name, - $end_line, - self::nextDeclId() - ); - } - - /** - * @param ?Token $flags - * @throws InvalidArgumentException if the class flags were unexpected - */ - private static function phpParserClassModifierToAstClassFlags($flags) : int - { - if ($flags === null) { - return 0; - } - switch ($flags->kind) { - case TokenKind::AbstractKeyword: - return flags\CLASS_ABSTRACT; - case TokenKind::FinalKeyword: - return flags\CLASS_FINAL; - default: - throw new InvalidArgumentException("Unexpected kind '" . Token::getTokenKindNameFromValue($flags->kind) . "'"); - } - } - - /** - * @param ?PhpParser\Node\InterfaceBaseClause $node - * @return ?ast\Node - */ - private static function interfaceBaseClauseToNode($node) - { - if (!$node instanceof PhpParser\Node\InterfaceBaseClause) { - // TODO: real placeholder? - return null; - } - - $interface_extends_name_list = []; - foreach ($node->interfaceNameList->children ?? [] as $implement) { - if ($implement instanceof Token && $implement->kind === TokenKind::CommaToken) { - continue; - } - $interface_extends_name_list[] = static::phpParserNonValueNodeToAstNode($implement); - } - if (\count($interface_extends_name_list) === 0) { - return null; - } - return new ast\Node(ast\AST_NAME_LIST, 0, $interface_extends_name_list, $interface_extends_name_list[0]->lineno); - } - - /** - * @param int $flags - * @param ?string $name - * @param ?ast\Node $extends - * @param ?PhpParser\Node\ClassInterfaceClause $implements - * @param ?ast\Node $stmts - * @param int $line - * @param int $end_line - * @param ?string $doc_comment - */ - private static function astStmtClass( - int $flags, - $name, - $extends, - $implements, - $stmts, - int $line, - int $end_line, - $doc_comment - ) : ast\Node { - - // NOTE: `null` would be an anonymous class. - // the empty string or '0' is a missing string we pretend is an anonymous class - // so that Phan won't throw an UnanalyzableException during the analysis phase - if ($name === null || !$name) { - $flags |= flags\CLASS_ANONYMOUS; - } - - if (($flags & flags\CLASS_INTERFACE) > 0) { - $children = [ - 'extends' => null, - 'implements' => $extends, - 'stmts' => $stmts, - ]; - } else { - if ($implements !== null) { - $ast_implements_inner = []; - foreach ($implements->interfaceNameList->children ?? [] as $implement) { - // TODO: simplify? - if ($implement instanceof Token && $implement->kind === TokenKind::CommaToken) { - continue; - } - $ast_implements_inner[] = static::phpParserNonValueNodeToAstNode($implement); - } - if (\count($ast_implements_inner) > 0) { - $ast_implements = new ast\Node(ast\AST_NAME_LIST, 0, $ast_implements_inner, $ast_implements_inner[0]->lineno); - } else { - $ast_implements = null; - } - } else { - $ast_implements = null; - } - $children = [ - 'extends' => $extends, - 'implements' => $ast_implements, - 'stmts' => $stmts, - ]; - } - - return static::newAstDecl( - ast\AST_CLASS, - $flags, - $children, - $line, - $doc_comment, - $name, - $end_line, - self::nextDeclId() - ); - } - - /** - * @param ?PhpParser\Node\DelimitedList\ArgumentExpressionList $args - */ - private static function phpParserArgListToAstArgList($args, int $line) : ast\Node - { - $ast_args = []; - foreach ($args->children ?? [] as $arg) { - if ($arg instanceof Token && $arg->kind === TokenKind::CommaToken) { - continue; - } - $ast_args[] = static::phpParserNodeToAstNode($arg); - } - return new ast\Node(ast\AST_ARG_LIST, 0, $ast_args, $args ? self::getStartLine($args) : $line); - } - - /** - * @param ?int $kind - * @throws InvalidArgumentException if the token kind was somehow invalid - */ - private static function phpParserNamespaceUseKindToASTUseFlags($kind) : int - { - switch ($kind ?? 0) { - case TokenKind::FunctionKeyword: - return flags\USE_FUNCTION; - case TokenKind::ConstKeyword: - return flags\USE_CONST; - case 0: - return flags\USE_NORMAL; - default: - throw new \InvalidArgumentException("Unexpected kind '" . Token::getTokenKindNameFromValue($kind ?? 0) . "'"); - } - } - - /** - * @param Token[]|PhpParser\Node\NamespaceUseGroupClause[]|PhpParser\Node[] $uses - * @return ast\Node[] - */ - private static function phpParserNamespaceUseListToAstUseList(array $uses) : array - { - $ast_uses = []; - foreach ($uses as $use_clause) { - if (!($use_clause instanceof PhpParser\Node\NamespaceUseGroupClause)) { - continue; - } - $raw_namespace_name = $use_clause->namespaceName; - if (!$raw_namespace_name instanceof PhpParser\Node\QualifiedName) { - // Invalid AST, ignore. We should have already warned about the syntax - continue; - } - // ast doesn't fill in an alias if it's identical to the real name, - // but phpParser does? - $namespace_name = \rtrim(static::phpParserNameToString($raw_namespace_name), '\\'); - $alias_token = $use_clause->namespaceAliasingClause->name ?? null; - $alias = $alias_token !== null ? static::tokenToString($alias_token) : null; - - $ast_uses[] = new ast\Node( - ast\AST_USE_ELEM, - static::phpParserNamespaceUseKindToASTUseFlags($use_clause->functionOrConst->kind ?? 0), - [ - 'name' => $namespace_name, - 'alias' => $alias !== $namespace_name ? $alias : null, - ], - self::getStartLine($use_clause) - ); - } - return $ast_uses; - } - - /** - * @param ?int $type - * @param ?string $alias - * @return ast\Node - */ - private static function astStmtUse($type, string $name, $alias, int $line) : ast\Node - { - $use_inner = new ast\Node(ast\AST_USE_ELEM, 0, ['name' => $name, 'alias' => $alias], $line); - return new ast\Node( - ast\AST_USE, - static::phpParserNamespaceUseKindToASTUseFlags($type), - [$use_inner], - $line - ); - } - - /** - * @param ?int $type - * @param ?string $prefix - * @param array<int,ast\Node> $uses - */ - private static function astStmtGroupUse($type, $prefix, array $uses, int $line) : ast\Node - { - $flags = static::phpParserNamespaceUseKindToASTUseFlags($type); - $uses = new ast\Node(ast\AST_USE, 0, $uses, $line); - if ($flags === flags\USE_NORMAL) { - foreach ($uses->children as $use) { - if ($use->flags !== 0) { - $flags = 0; - break; - } - } - } else { - foreach ($uses->children as $use) { - if ($use->flags === flags\USE_NORMAL) { - $use->flags = 0; - } - } - } - - return new ast\Node( - ast\AST_GROUP_USE, - $flags, - [ - 'prefix' => $prefix, - 'uses' => $uses, - ], - $line - ); - } - - /** - * @param ast\Node|string|int|float|null $cond (null for else statements) - * @param ast\Node $stmts - * @param int $line - */ - private static function astIfElem($cond, $stmts, int $line) : ast\Node - { - return new ast\Node(ast\AST_IF_ELEM, 0, ['cond' => $cond, 'stmts' => $stmts], $line); - } - - private static function phpParserSwitchListToAstSwitch(PhpParser\Node\Statement\SwitchStatementNode $node, int $start_line) : ast\Node - { - $stmts = []; - $node_line = static::getEndLine($node) ?? $start_line; - foreach ($node->caseStatements as $case) { - if (!($case instanceof PhpParser\Node\CaseStatementNode)) { - continue; - } - $case_line = static::getEndLine($case); - $stmts[] = new ast\Node( - ast\AST_SWITCH_CASE, - 0, - [ - 'cond' => $case->expression !== null ? static::phpParserNodeToAstNode($case->expression) : null, - 'stmts' => static::phpParserStmtlistToAstNode($case->statementList, $case_line, false), - ], - $case_line ?? $node_line - ); - } - return new ast\Node(ast\AST_SWITCH, 0, [ - 'cond' => static::phpParserNodeToAstNode($node->expression), - 'stmts' => new ast\Node(ast\AST_SWITCH_LIST, 0, $stmts, $stmts[0]->lineno ?? $node_line), - ], $node_line); - } - - /** - * @param PhpParser\Node[]|PhpParser\Node|Token $stmts - */ - private static function getStartLineOfStatementOrStatements($stmts) : int - { - if (is_array($stmts)) { - return isset($stmts[0]) ? self::getStartLine($stmts[0]) : 0; - } - return self::getStartLine($stmts); - } - - private static function phpParserIfStmtToAstIfStmt(PhpParser\Node\Statement\IfStatementNode $node, int $start_line) : ast\Node - { - $if_elem = static::astIfElem( - static::phpParserNodeToAstNode($node->expression), - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable return_null_on_empty is false. - static::phpParserStmtlistToAstNode( - $node->statements, - self::getStartLineOfStatementOrStatements($node->statements) ?: $start_line, - false - ), - $start_line - ); - $if_elems = [$if_elem]; - foreach ($node->elseIfClauses as $else_if) { - $if_elem_line = self::getStartLine($else_if); - $if_elem = static::astIfElem( - static::phpParserNodeToAstNode($else_if->expression), - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable return_null_on_empty is false. - static::phpParserStmtlistToAstNode( - $else_if->statements, - self::getStartLineOfStatementOrStatements($else_if->statements) - ), - $if_elem_line - ); - $if_elems[] = $if_elem; - } - $parser_else_node = $node->elseClause; - if ($parser_else_node) { - $parser_else_line = self::getStartLineOfStatementOrStatements($parser_else_node->statements); - $if_elems[] = static::astIfElem( - null, - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable return_null_on_empty is false. - static::phpParserStmtlistToAstNode($parser_else_node->statements, $parser_else_line, false), - $parser_else_line - ); - } - return new ast\Node(ast\AST_IF, 0, $if_elems, $start_line); - } - - /** - * @return ast\Node|string|int|float - */ - private static function astNodeBinaryop(int $flags, PhpParser\Node\Expression\BinaryExpression $n, int $start_line) - { - try { - $left_node = static::phpParserNodeToAstNode($n->leftOperand); - } catch (InvalidNodeException $_) { - if (self::$should_add_placeholders) { - $left_node = static::newPlaceholderExpression($n->leftOperand); - } else { - // convert `;$b ^;` to `;$b;` - return static::phpParserNodeToAstNode($n->rightOperand); - } - } - try { - $right_node = static::phpParserNodeToAstNode($n->rightOperand); - } catch (InvalidNodeException $_) { - if (self::$should_add_placeholders) { - $right_node = static::newPlaceholderExpression($n->rightOperand); - } else { - // convert `;^ $b;` to `;$b;` - return $left_node; - } - } - - return new ast\Node( - ast\AST_BINARY_OP, - $flags, - [ - 'left' => $left_node, - 'right' => $right_node, - ], - $start_line - ); - } - - /** - * Binary assignment operation such as `+=` - * - * @return ast\Node|string|int|float - * (Can return non-Node for an invalid AST if the right-hand is a scalar) - */ - private static function astNodeAssignop(int $flags, PhpParser\Node\Expression\BinaryExpression $n, int $start_line) - { - try { - $var_node = static::phpParserNodeToAstNode($n->leftOperand); - } catch (InvalidNodeException $_) { - if (self::$should_add_placeholders) { - $var_node = new ast\Node(ast\AST_VAR, 0, ['name' => '__INCOMPLETE_VARIABLE__'], $start_line); - } else { - // convert `;= $b;` to `;$b;` - return static::phpParserNodeToAstNode($n->rightOperand); - } - } - $expr_node = static::phpParserNodeToAstNode($n->rightOperand); - return new ast\Node( - ast\AST_ASSIGN_OP, - $flags, - [ - 'var' => $var_node, - 'expr' => $expr_node, - ], - $start_line - ); - } - - /** - * @param PhpParser\Node\Expression\AssignmentExpression|PhpParser\Node\Expression\Variable $n - * @param ?string $doc_comment - * @throws InvalidNodeException if the type can't be converted to a valid AST - * @throws InvalidArgumentException if the passed in class is completely unexpected - */ - private static function phpParserPropelemToAstPropelem($n, $doc_comment) : ast\Node - { - if ($n instanceof PhpParser\Node\Expression\AssignmentExpression) { - $name_node = $n->leftOperand; - if (!($name_node instanceof PhpParser\Node\Expression\Variable)) { - throw new InvalidNodeException(); - } - $children = [ - 'name' => static::phpParserNodeToAstNode($name_node->name), - 'default' => $n->rightOperand ? static::phpParserNodeToAstNode($n->rightOperand) : null, - ]; - } elseif ($n instanceof PhpParser\Node\Expression\Variable) { - $name = $n->name; - if (!($name instanceof Token) || !$name->length) { - throw new InvalidNodeException(); - } - $children = [ - 'name' => static::tokenToString($name), - 'default' => null, - ]; - } else { - // @phan-suppress-next-line PhanThrowTypeMismatchForCall debugDumpNodeOrToken can throw - throw new \InvalidArgumentException("Unexpected class for property element: Expected Variable or AssignmentExpression, got: " . static::debugDumpNodeOrToken($n)); - } - - $start_line = self::getStartLine($n); - - $children['docComment'] = static::extractPhpdocComment($n) ?? $doc_comment; - return new ast\Node(ast\AST_PROP_ELEM, 0, $children, $start_line); - } - - /** - * @param ?string $doc_comment - */ - private static function phpParserConstelemToAstConstelem(PhpParser\Node\ConstElement $n, $doc_comment) : ast\Node - { - $start_line = self::getStartLine($n); - $children = [ - 'name' => static::variableTokenToString($n->name), - 'value' => static::phpParserNodeToAstNode($n->assignment), - ]; - - if (self::$php_version_id_parsing >= 70100 || self::$parse_all_doc_comments) { - $children['docComment'] = static::extractPhpdocComment($n) ?? $doc_comment; - } - return new ast\Node(ast\AST_CONST_ELEM, 0, $children, $start_line); - } - - /** - * @param Token[] $visibility - * @throws RuntimeException if a visibility token was unexpected - */ - private static function phpParserVisibilityToAstVisibility(array $visibility, bool $automatically_add_public = true) : int - { - $ast_visibility = 0; - foreach ($visibility as $token) { - switch ($token->kind) { - case TokenKind::VarKeyword: - $ast_visibility |= flags\MODIFIER_PUBLIC; - break; - case TokenKind::PublicKeyword: - $ast_visibility |= flags\MODIFIER_PUBLIC; - break; - case TokenKind::ProtectedKeyword: - $ast_visibility |= flags\MODIFIER_PROTECTED; - break; - case TokenKind::PrivateKeyword: - $ast_visibility |= flags\MODIFIER_PRIVATE; - break; - case TokenKind::StaticKeyword: - $ast_visibility |= flags\MODIFIER_STATIC; - break; - case TokenKind::AbstractKeyword: - $ast_visibility |= flags\MODIFIER_ABSTRACT; - break; - case TokenKind::FinalKeyword: - $ast_visibility |= flags\MODIFIER_FINAL; - break; - default: - throw new \RuntimeException("Unexpected visibility modifier '" . Token::getTokenKindNameFromValue($token->kind) . "'"); - } - } - if ($automatically_add_public && !($ast_visibility & (flags\MODIFIER_PUBLIC | flags\MODIFIER_PROTECTED | flags\MODIFIER_PRIVATE))) { - $ast_visibility |= flags\MODIFIER_PUBLIC; - } - return $ast_visibility; - } - - private static function phpParserPropertyToAstNode(PhpParser\Node\PropertyDeclaration $n, int $start_line) : ast\Node - { - $prop_elems = []; - $doc_comment = $n->getDocCommentText(); - - foreach ($n->propertyElements->children ?? [] as $i => $prop) { - if ($prop instanceof Token) { - continue; - } - // @phan-suppress-next-line PhanTypeMismatchArgument casting to a more specific node - $prop_elems[] = static::phpParserPropelemToAstPropelem($prop, $i === 0 ? $doc_comment : null); - } - $flags = static::phpParserVisibilityToAstVisibility($n->modifiers, false); - - return new ast\Node(ast\AST_PROP_DECL, $flags, $prop_elems, $prop_elems[0]->lineno ?? (self::getStartLine($n) ?: $start_line)); - } - - private static function phpParserClassConstToAstNode(PhpParser\Node\ClassConstDeclaration $n, int $start_line) : ast\Node - { - $const_elems = []; - $doc_comment = $n->getDocCommentText(); - foreach ($n->constElements->children ?? [] as $i => $const_elem) { - if ($const_elem instanceof Token) { - continue; - } - // @phan-suppress-next-line PhanTypeMismatchArgument casting to a more specific node - $const_elems[] = static::phpParserConstelemToAstConstelem($const_elem, $i === 0 ? $doc_comment : null); - } - $flags = static::phpParserVisibilityToAstVisibility($n->modifiers); - - return new ast\Node(ast\AST_CLASS_CONST_DECL, $flags, $const_elems, $const_elems[0]->lineno ?? $start_line); - } - - /** - * @throws InvalidNodeException - */ - private static function phpParserConstToAstNode(PhpParser\Node\Statement\ConstDeclaration $n, int $start_line) : ast\Node - { - $const_elems = []; - $doc_comment = $n->getDocCommentText(); - foreach ($n->constElements->children ?? [] as $i => $prop) { - if ($prop instanceof Token) { - continue; - } - if (!($prop instanceof PhpParser\Node\ConstElement)) { - throw new InvalidNodeException(); - } - $const_elems[] = static::phpParserConstelemToAstConstelem($prop, $i === 0 ? $doc_comment : null); - } - - return new ast\Node(ast\AST_CONST_DECL, 0, $const_elems, $const_elems[0]->lineno ?? $start_line); - } - - /** - * @param ?string $first_doc_comment - */ - private static function phpParserDeclareListToAstDeclares(PhpParser\Node\DeclareDirective $declare, int $start_line, $first_doc_comment) : ast\Node - { - $ast_declare_elements = []; - if ($declare->name->length > 0 && $declare->literal->length > 0) { - // Skip SkippedToken or MissingToken - $children = [ - 'name' => static::tokenToString($declare->name), - 'value' => static::tokenToScalar($declare->literal), - ]; - $doc_comment = static::extractPhpdocComment($declare) ?? $first_doc_comment; - // $first_doc_comment = null; - if (self::$php_version_id_parsing >= 70100 || self::$parse_all_doc_comments) { - $children['docComment'] = $doc_comment; - } - $node = new ast\Node(ast\AST_CONST_ELEM, 0, $children, self::getStartLine($declare)); - $ast_declare_elements[] = $node; - } - return new ast\Node(ast\AST_CONST_DECL, 0, $ast_declare_elements, $start_line); - } - - /** - * @param ?ast\Node $stmts - */ - private static function astStmtDeclare(ast\Node $declares, $stmts, int $start_line) : ast\Node - { - $children = [ - 'declares' => $declares, - 'stmts' => $stmts, - ]; - return new ast\Node(ast\AST_DECLARE, 0, $children, $start_line); - } - - /** - * @param string|ast\Node $expr - * @param ast\Node $args - */ - private static function astNodeCall($expr, $args, int $start_line) : ast\Node - { - if (\is_string($expr)) { - if (substr($expr, 0, 1) === '\\') { - $expr = substr($expr, 1); - } - $expr = new ast\Node(ast\AST_NAME, flags\NAME_FQ, ['name' => $expr], $start_line); - } - return new ast\Node(ast\AST_CALL, 0, ['expr' => $expr, 'args' => $args], $start_line); - } - - /** - * @param ast\Node $expr - * @param ast\Node $method - */ - private static function astNodeMethodCall($expr, $method, ast\Node $args, int $start_line) : ast\Node - { - return new ast\Node(ast\AST_METHOD_CALL, 0, ['expr' => $expr, 'method' => $method, 'args' => $args], $start_line); - } - - /** - * @param ast\Node|string $class - * @param ast\Node $method - */ - private static function astNodeStaticCall($class, $method, ast\Node $args, int $start_line) : ast\Node - { - // TODO: is this applicable? - if (\is_string($class)) { - if (substr($class, 0, 1) === '\\') { - $class = substr($class, 1); - } - $class = new ast\Node(ast\AST_NAME, flags\NAME_FQ, ['name' => $class], $start_line); - } - return new ast\Node(ast\AST_STATIC_CALL, 0, ['class' => $class, 'method' => $method, 'args' => $args], $start_line); - } - - /** - * TODO: Get rid of this function? - * @param string|PhpParser\Node|null|array $comments - * @return ?string the doc comment, or null - */ - private static function extractPhpdocComment($comments) - { - if (\is_string($comments)) { - return $comments; - } - if ($comments instanceof PhpParser\Node) { - // TODO: Extract only the substring with doc comment text? - return $comments->getDocCommentText() ?: null; - } - if ($comments === null) { - return null; - } - if (!(\is_array($comments))) { - throw new AssertionError("Expected an array of comments"); - } - if (\count($comments) === 0) { - return null; - } - } - - private static function phpParserListToAstList(PhpParser\Node\Expression\ListIntrinsicExpression $n, int $start_line) : ast\Node - { - $ast_items = []; - $prev_was_element = false; - foreach ($n->listElements->children ?? [] as $item) { - if ($item instanceof Token) { - if (!$prev_was_element) { - $ast_items[] = null; - continue; - } - $prev_was_element = false; - continue; - } else { - $prev_was_element = true; - } - if (!($item instanceof PhpParser\Node\ArrayElement)) { - throw new AssertionError("Expected ArrayElement"); - } - $element_key = $item->elementKey; - $ast_items[] = new ast\Node(ast\AST_ARRAY_ELEM, 0, [ - 'value' => static::phpParserNodeToAstNode($item->elementValue), - 'key' => $element_key !== null ? static::phpParserNodeToAstNode($element_key) : null, - ], self::getStartLine($item)); - } - if (self::$php_version_id_parsing < 70100 && \count($ast_items) === 0) { - $ast_items[] = null; - } - return new ast\Node(ast\AST_ARRAY, flags\ARRAY_SYNTAX_LIST, $ast_items, $start_line); - } - - private static function phpParserArrayToAstArray(PhpParser\Node\Expression\ArrayCreationExpression $n, int $start_line) : ast\Node - { - $ast_items = []; - $prev_was_element = false; - foreach ($n->arrayElements->children ?? [] as $item) { - if ($item instanceof Token) { - if (!$prev_was_element) { - $ast_items[] = null; - continue; - } - $prev_was_element = false; - continue; - } else { - $prev_was_element = true; - } - if (!($item instanceof PhpParser\Node\ArrayElement)) { - throw new AssertionError("Expected ArrayElement"); - } - $flags = $item->byRef ? flags\PARAM_REF : 0; - $element_key = $item->elementKey; - $ast_items[] = new ast\Node(ast\AST_ARRAY_ELEM, $flags, [ - 'value' => static::phpParserNodeToAstNode($item->elementValue), - 'key' => $element_key !== null ? static::phpParserNodeToAstNode($element_key) : null, - ], self::getStartLine($item)); - } - if (self::$php_version_id_parsing < 70100) { - $flags = 0; - } else { - $kind = $n->openParenOrBracket->kind; - if ($kind === TokenKind::OpenBracketToken) { - $flags = flags\ARRAY_SYNTAX_SHORT; - } else { - $flags = flags\ARRAY_SYNTAX_LONG; - } - } - // Workaround for ast line choice - return new ast\Node(ast\AST_ARRAY, $flags, $ast_items, $ast_items[0]->lineno ?? $start_line); - } - - /** - * @return ?ast\Node - * @throws InvalidNodeException if the member name could not be converted - * - * (and various other exceptions) - */ - private static function phpParserMemberAccessExpressionToAstProp(PhpParser\Node\Expression\MemberAccessExpression $n, int $start_line) - { - // TODO: Check for incomplete tokens? - $member_name = $n->memberName; - try { - $name = static::phpParserNodeToAstNode($member_name); // complex expression - } catch (InvalidNodeException $e) { - if (self::$should_add_placeholders) { - $name = self::INCOMPLETE_PROPERTY; - } else { - throw $e; - } - } - return new ast\Node(ast\AST_PROP, 0, [ - 'expr' => static::phpParserNodeToAstNode($n->dereferencableExpression), - 'prop' => $name, // ast\Node|string - ], $start_line); - } - - /** - * @return int|string|float|bool|null - */ - private static function tokenToScalar(Token $n) - { - $str = static::tokenToString($n); - $int = \filter_var($str, FILTER_VALIDATE_INT); - if ($int !== false) { - return $int; - } - $float = \filter_var($str, FILTER_VALIDATE_FLOAT); - if ($float !== false) { - return $float; - } - - return StringUtil::parse($str); - } - - /** - * @throws Exception if node is invalid - */ - private static function parseQuotedString(PhpParser\Node\StringLiteral $n) : string - { - $start = $n->getStart(); - $text = (string)substr(self::$file_contents, $start, $n->getEndPosition() - $start); - return StringUtil::parse($text); - } - - /** - * @suppress PhanPartialTypeMismatchArgumentInternal hopefully in range - */ - private static function variableTokenToString(Token $n) : string - { - return \ltrim(\trim($n->getText(self::$file_contents)), '$'); - } - - /** - * @suppress PhanPartialTypeMismatchReturn this is in bounds and $file_contents is a string - */ - private static function tokenToRawString(Token $n) : string - { - return $n->getText(self::$file_contents); - } - - /** @internal */ - const _MAGIC_CONST_LOOKUP = [ - '__LINE__' => flags\MAGIC_LINE, - '__FILE__' => flags\MAGIC_FILE, - '__DIR__' => flags\MAGIC_DIR, - '__NAMESPACE__' => flags\MAGIC_NAMESPACE, - '__FUNCTION__' => flags\MAGIC_FUNCTION, - '__METHOD__' => flags\MAGIC_METHOD, - '__CLASS__' => flags\MAGIC_CLASS, - '__TRAIT__' => flags\MAGIC_TRAIT, - ]; - - // FIXME don't use in places expecting non-strings. - /** - * @phan-suppress PhanPartialTypeMismatchArgumentInternal hopefully in range - */ - private static function tokenToString(Token $n) : string - { - $result = \trim($n->getText(self::$file_contents)); - $kind = $n->kind; - if ($kind === TokenKind::VariableName) { - return \trim($result, '$'); - } - return $result; - } - - /** - * @param PhpParser\Node\Expression|PhpParser\Node\QualifiedName|Token $scope_resolution_qualifier - */ - private static function phpParserClassconstfetchToAstClassconstfetch($scope_resolution_qualifier, string $name, int $start_line) : ast\Node - { - return new ast\Node(ast\AST_CLASS_CONST, 0, [ - 'class' => static::phpParserNonValueNodeToAstNode($scope_resolution_qualifier), - 'const' => $name, - ], $start_line); - } - - /** - * @return string - * @throws InvalidNodeException if the qualified type name could not be converted to a valid php-ast type name - */ - private static function phpParserNameToString(PhpParser\Node\QualifiedName $name) : string - { - $name_parts = $name->nameParts; - // TODO: Handle error case (can there be missing parts?) - $result = ''; - foreach ($name_parts as $part) { - // @phan-suppress-next-line PhanPossiblyNullTypeArgument - $part_as_string = static::tokenToString($part); - if ($part_as_string !== '') { - $result .= \trim($part_as_string); - } - } - $result = \rtrim(\preg_replace('/\\\\{2,}/', '\\', $result), '\\'); - if ($result === '') { - // Would lead to "The name cannot be empty" when parsing - throw new InvalidNodeException(); - } - return $result; - } - - /** - * @param array<mixed,ast\Node|string|int|float|null> $children - * @return ast\Node - */ - private static function newAstDecl(int $kind, int $flags, array $children, int $lineno, string $doc_comment = null, string $name = null, int $end_lineno = 0, int $decl_id = -1) : ast\Node - { - $decl_children = []; - $decl_children['name'] = $name; - $decl_children['docComment'] = $doc_comment; - $decl_children += $children; - if ($decl_id >= 0) { - $decl_children['__declId'] = $decl_id; - } - $node = new ast\Node($kind, $flags, $decl_children, $lineno); - $node->endLineno = $end_lineno; - return $node; - } - - private static function nextDeclId() : int - { - return self::$decl_id++; - } - - /** @param PhpParser\Node|Token $n the node or token to convert to a placeholder */ - private static function newPlaceholderExpression($n) : ast\Node - { - $start_line = self::getStartLine($n); - $name_node = new ast\Node(ast\AST_NAME, flags\NAME_FQ, ['name' => '__INCOMPLETE_EXPR__'], $start_line); - return new ast\Node(ast\AST_CONST, 0, ['name' => $name_node], $start_line); - } - - /** - * @param PhpParser\Node[]|PhpParser\Token[] $children $children - */ - private static function parseMultiPartString(PhpParser\Node\StringLiteral $n, array $children) : ast\Node - { - if ($n->startQuote->length >= 3) { - return self::parseMultiPartHeredoc($n, $children); - } - return self::parseMultiPartRegularString($n, $children); - } - - /** - * @param PhpParser\Node[]|PhpParser\Token[] $children $children - */ - private static function parseMultiPartRegularString(PhpParser\Node\StringLiteral $n, array $children) : ast\Node - { - $inner_node_parts = []; - $start_quote_text = static::tokenToString($n->startQuote); - $end_quote_text = $n->endQuote->getText(self::$file_contents); - - foreach ($children as $part) { - if ($part instanceof PhpParser\Node) { - $inner_node_parts[] = static::phpParserNodeToAstNode($part); - } else { - $kind = $part->kind; - if (\array_key_exists($kind, self::_IGNORED_STRING_TOKEN_KIND_SET)) { - continue; - } - // ($part->kind === TokenKind::EncapsedAndWhitespace) - $raw_string = static::tokenToRawString($part); - if (\strlen($start_quote_text) > 1) { - // I guess it depends on what's before it. - // TODO: Use a correct heuristic instead - $raw_string = "\n$raw_string\n"; - } - - // Pass in '"\\n"' and get "\n" (somewhat inefficient) - $represented_string = StringUtil::parse($start_quote_text . $raw_string . $end_quote_text); - $inner_node_parts[] = $represented_string; - } - } - return new ast\Node(ast\AST_ENCAPS_LIST, 0, $inner_node_parts, self::getStartLine($children[0])); - } - - /** - * @param PhpParser\Node[]|PhpParser\Token[] $children $children - */ - private static function parseMultiPartHeredoc(PhpParser\Node\StringLiteral $n, array $children) : ast\Node - { - $inner_node_parts = []; - $end_of_start_quote = self::$file_contents[$n->startQuote->start + $n->startQuote->length - 1]; - $end_quote_text = $n->endQuote->getText(self::$file_contents); - - $spaces = \strspn($end_quote_text, " \t"); - $raw_spaces = substr($end_quote_text, 0, $spaces); - - foreach ($children as $i => $part) { - if ($part instanceof PhpParser\Node) { - $inner_node_parts[] = static::phpParserNodeToAstNode($part); - continue; - } - $kind = $part->kind; - if (\array_key_exists($kind, self::_IGNORED_STRING_TOKEN_KIND_SET)) { - continue; - } - // ($part->kind === TokenKind::EncapsedAndWhitespace) - $raw_string = static::tokenToRawString($part); - if ($i > 0) { - $raw_string = $raw_spaces . $raw_string; - } - - $represented_string = $spaces > 0 ? \preg_replace("/^" . $raw_spaces . "/m", '', $raw_string) : $raw_string; - if ($end_of_start_quote !== "'") { - $represented_string = StringUtil::parseEscapeSequences($represented_string, null); - } - $inner_node_parts[] = $represented_string; - } - $i = \count($inner_node_parts) - 1; - $s = $inner_node_parts[$i]; - if (\is_string($s)) { - $s = substr($s, 0, -1); - // On Windows, the "\r" must also be removed from the last line of the heredoc - if (substr($s, -1) === "\r") { - $s = substr($s, 0, -1); - } - $inner_node_parts[$i] = $s; - } - - return new ast\Node(ast\AST_ENCAPS_LIST, 0, $inner_node_parts, self::getStartLine($children[0])); - } - - /** - * Gets a string based on environment details that could affect parsing - */ - private static function getEnvironmentDetails() : string - { - static $details = null; - if ($details === null) { - $details = \sha1(var_export([ - \PHP_VERSION, - \PHP_BINARY, - \ini_get('short_open_tag'), - class_exists(CLI::class) ? CLI::getDevelopmentVersionId() : 'unknown' - ], true)); - } - return $details; - } - - /** - * @return ?string - null if this should not be cached - */ - public function generateCacheKey(string $file_contents, int $version) - { - $details = var_export([ - \sha1($file_contents), - $version, - self::getEnvironmentDetails(), - $this->instance_should_add_placeholders, - $this->instance_parse_all_doc_comments, - ], true); - return \sha1($details); - } -} -class_exists(TolerantASTConverterWithNodeMapping::class); diff --git a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/TolerantASTConverterWithNodeMapping.php b/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/TolerantASTConverterWithNodeMapping.php deleted file mode 100644 index 81205f4..0000000 --- a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/TolerantASTConverterWithNodeMapping.php +++ /dev/null @@ -1,442 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\TolerantASTConverter; - -use AssertionError; -use ast; -use Closure; -use InvalidArgumentException; -use Microsoft\PhpParser; -use Microsoft\PhpParser\Diagnostic; -use Microsoft\PhpParser\Token; -use Microsoft\PhpParser\TokenKind; -use Phan\Library\Cache; -use Throwable; -use function is_string; -use function preg_match; - -/** - * This is a subclass of TolerantASTConverter - * that maps the original AST to the corresponding generated ast\Node. - * - * This is planned for use with "Go to definition" requests, completion requests, etc. - * - * (This lets you know the byte offset of a given node and how long that node is) - * - * Workflow: - * - * 1. A request is received for finding the type definition of the ast\Node at byte offset 100 in a given file - * 2. Phan will figure out which PhpParser\Token that is referring to. - * - * If this is a property, method invocation, constant, etc., - * this will refer to the property access (Not the name), constant access, etc. - * - * This is done via iterating over the tokens, finding the token that contains the offset, - * then walking back up to the parent - * 3. Then, Phan will use $node_mapping to update the corresponding AST node - * - * @phan-file-suppress PhanUndeclaredProperty deliberately adding dynamic property - * - * The logging to STDERR can be uncommented if you have issues debugging why - * Phan can't locate a given node's definition. - */ -class TolerantASTConverterWithNodeMapping extends TolerantASTConverter -{ - /** - * @var PhpParser\Node|Token|null - * This is the closest node or token from tolerant-php-parser - * (among the nodes being parsed **that will have a corresponding ast\Node be created**) - * - * TODO: If this is null, then just use TolerantASTConverter's node generation logic to be a bit faster - */ - private static $closest_node_or_token; - - /** - * @var ?Token - * TODO: If this is null, then just use TolerantASTConverter's node generation logic to be a bit faster - */ - private static $closest_node_or_token_symbol; - - /** @var int the byte offset we are looking for, to mark the corresponding Node as within the selected location */ - private static $desired_byte_offset; - - /** @var int the byte offset we are looking for, to mark the corresponding Node as within the selected location */ - private $instance_desired_byte_offset; - - /** - * @var ?Closure(ast\Node):void This is optional. If it is set, this is invoked on the Node we marked. - * Currently, this is used to add plugin methods at runtime (limited to what is needed to handle that node's kind) - */ - private static $handle_selected_node; - - /** - * @var ?Closure(ast\Node):void This is optional. If it is set, this is invoked on the Node we marked. - * Currently, this is used to add plugin methods at runtime (limited to what is needed to handle that node's kind) - */ - private $instance_handle_selected_node; - - /** - * @param int $desired_byte_offset the byte offset of the cursor - * @param ?Closure(ast\Node):void $handle_selected_node this can be passed in. - * If a node corresponding to a reference was found, then this closure will be invoked once with that node. - */ - public function __construct(int $desired_byte_offset, Closure $handle_selected_node = null) - { - $this->instance_desired_byte_offset = $desired_byte_offset; - $this->instance_handle_selected_node = $handle_selected_node; - } - - /** - * @param Diagnostic[] &$errors @phan-output-reference - * - * @return \ast\Node - * - * @throws InvalidArgumentException for invalid $version - * @throws Throwable (after logging) if anything is thrown by the parser - */ - public function parseCodeAsPHPAST(string $file_contents, int $version, array &$errors = [], Cache $unused_cache = null) - { - // Force the byte offset to be within the - $byte_offset = \max(0, \min(\strlen($file_contents), $this->instance_desired_byte_offset)); - self::$desired_byte_offset = $byte_offset; - self::$handle_selected_node = $this->instance_handle_selected_node; - - if (!\in_array($version, self::SUPPORTED_AST_VERSIONS)) { - throw new InvalidArgumentException(\sprintf("Unexpected version: want %s, got %d", \implode(', ', self::SUPPORTED_AST_VERSIONS), $version)); - } - - // Aside: this can be implemented as a stub. - try { - $parser_node = static::phpParserParse($file_contents, $errors); - self::findNodeAtOffset($parser_node, $byte_offset); - // phpcs:ignore Generic.Files.LineLength.MaxExceeded - // fwrite(STDERR, "Seeking node: " . json_encode(self::$closest_node_or_token, JSON_PRETTY_PRINT) . "nearby: " . json_encode(self::$closest_node_or_token_symbol, JSON_PRETTY_PRINT) . "\n"); - return $this->phpParserToPhpast($parser_node, $version, $file_contents); - } catch (Throwable $e) { - // fprintf(STDERR, "saw exception: %s\n", $e->getMessage()); - throw $e; - } finally { - self::$closest_node_or_token = null; - self::$closest_node_or_token_symbol = null; - } - } - - /** - * @return ?string - null if this should not be cached - */ - public function generateCacheKey(string $unused_file_contents, int $unused_version) - { - return null; - } - - /** - * Records the closest node or token to the given offset. - * Heuristics are used to ensure that this can map to an ast\Node. - * TODO: Finish implementing - * - * @return void - */ - private static function findNodeAtOffset(PhpParser\Node $parser_node, int $offset) - { - self::$closest_node_or_token = null; - self::$closest_node_or_token_symbol = null; - // fprintf(STDERR, "Seeking offset %d\n", $offset); - self::findNodeAtOffsetRecursive($parser_node, $offset); - } - - /** - * We use a blacklist because there are more many more tokens we want to use the parent for. - * For example, when navigating to class names in comments, the comment can be prior to pretty much any token (e.g. AmpersandToken, PublicKeyword, etc.) - * - * @internal - */ - const KINDS_TO_NOT_RETURN_PARENT = [ - TokenKind::QualifiedName => true, - ]; - - /** - * @param PhpParser\Node $parser_node - * @return bool|PhpParser\Node|PhpParser\Token (Returns $parser_node if that node was what the cursor is pointing directly to) - */ - private static function findNodeAtOffsetRecursive($parser_node, int $offset) - { - foreach ($parser_node->getChildNodesAndTokens() as $key => $node_or_token) { - if ($node_or_token instanceof Token) { - // fprintf( - // STDERR, - // "Scanning over Token %s (fullStart=%d) %d-%d for offset=%d\n", - // Token::getTokenKindNameFromValue($node_or_token->kind), - // $node_or_token->fullStart, - // $node_or_token->start, - // $node_or_token->getEndPosition(), - // $offset - // ); - if ($node_or_token->getEndPosition() > $offset) { - if ($node_or_token->start > $offset) { - if ($node_or_token->fullStart <= $offset) { - // The cursor falls within the leading comments (doc comment or otherwise) - // of this token. - self::$closest_node_or_token_symbol = $node_or_token; - } elseif (self::$closest_node_or_token_symbol === null) { - // The cursor is hovering over whitespace. - // Give up. - return true; - } - } - if (!\in_array($node_or_token->kind, self::KINDS_TO_NOT_RETURN_PARENT, true)) { - // We want the parent of a Name, e.g. a class - self::$closest_node_or_token = $parser_node; - // fwrite(STDERR, "Found node: " . json_encode($parser_node) . "\n"); - return $parser_node; - } - // fwrite(STDERR, "Found token (parent " . get_class($parser_node) . "): " . json_encode($node_or_token)); - self::$closest_node_or_token = $node_or_token; - // TODO: Handle other cases - return $node_or_token; - } - } - if ($node_or_token instanceof PhpParser\Node) { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall shouldn't happen for generated ASTs - $end_position = $node_or_token->getEndPosition(); - // fprintf(STDERR, "Scanning over Node %s %d-%d\n", get_class($node_or_token), $node_or_token->getStart(), $end_position); - if ($end_position < $offset) { - // End this early if this token ends before the cursor even starts - continue; - } - $state = self::findNodeAtOffsetRecursive($node_or_token, $offset); - if ($state) { - // fwrite(STDERR, "Found parent node for $key: " . get_class($parser_node) . "\n"); - // fwrite(STDERR, "Found parent node for $key: " . json_encode($parser_node) . "\n"); - if ($state instanceof PhpParser\Node) { - if (!is_string($key)) { - throw new AssertionError("Expected key to be a string"); - } - return self::adjustClosestNodeOrToken($parser_node, $key); - } - return true; - } - } - } - return false; - } - - /** - * This optionally adjusts the closest_node_or_token to a more useful value. - * (so that functionality such as "go to definition" for classes, properties, etc. will work as expected) - * - * @param PhpParser\Node $node the parent node of the old value of - * @param string $key - * @return PhpParser\Node|true - */ - private static function adjustClosestNodeOrToken(PhpParser\Node $node, string $key) - { - switch ($key) { - case 'memberName': - case 'callableExpression': - case 'namespaceName': - case 'namespaceAliasingClause': - // fwrite(STDERR, "Adjusted node: " . json_encode($node) . "\n"); - self::$closest_node_or_token = $node; - return $node; - } - return true; - } - - /** - * @param PhpParser\Node|Token $n - The node from PHP-Parser - * @return ast\Node|ast\Node[]|string|int|float|bool|null - whatever ast\parse_code would return as the equivalent. - * @throws InvalidNodeException when self::$should_add_placeholders is false, like many of these methods. - * @override - */ - protected static function phpParserNodeToAstNodeOrPlaceholderExpr($n) - { - // fprintf(STDERR, "Comparing %s to %s\n", get_class($n), get_class(self::$closest_node_or_token)); - $ast_node = parent::phpParserNodeToAstNodeOrPlaceholderExpr($n); - if ($n === self::$closest_node_or_token) { - self::markNodeAsSelected($n, $ast_node); - } - return $ast_node; - } - - /** - * This marks the tolerant-php-parser Node as being selected, - * and adds any information that will be useful to code handling the corresponding - * - * @param PhpParser\Node|Token $n @phan-unused-param the tolerant-php-parser node that generated the $ast_node - * @param mixed $ast_node the node that was selected because it was under the cursor - */ - private static function markNodeAsSelected($n, $ast_node) - { - // fwrite(STDERR, "Marking corresponding node as flagged: " . json_encode($n) . "\n" . \Phan\Debug::nodeToString($ast_node) . "\n"); - // fflush(STDERR); - if ($ast_node instanceof ast\Node) { - if (self::$closest_node_or_token_symbol !== null) { - // fwrite(STDERR, "Marking corresponding node as flagged: " . json_encode($n) . "\n" . json_encode($ast_node) . "\n"); - // fflush(STDERR); - - // TODO: This won't work if the comment is at the end of the file. Add a dummy statement or something to associate it with. - // - // TODO: Extract the longest class name or method name from the doc comment - $fragment = self::extractFragmentFromCommentLike(); - if ($fragment === null) { - // We're inside of a string or doc comment but failed to extract a class name - return; - } - // fwrite(STDERR, "Marking selectedFragment = $fragment\n"); - $ast_node->isSelectedApproximate = self::$closest_node_or_token_symbol; - $ast_node->selectedFragment = $fragment; - } - // fwrite(STDERR, "Marking node with kind " . ast\get_kind_name($ast_node->kind) . " as selected\n"); - $ast_node->isSelected = true; - $closure = self::$handle_selected_node; - if ($closure) { - $closure($ast_node); - } - } - } - - /** - * @internal - */ - const VALID_FRAGMENT_CHARACTER_REGEX = '/[\\\\a-z0-9_\x7f-\xff]/i'; - - /** - * @return ?string A fragment that is a potentially valid class or function identifier (e.g. 'MyNs\MyClass', '\MyClass') - * for the comment or string under the cursor - * - * TODO: Support method identifiers? - * TODO: Support variables? - * TODO: Implement support for going to function definitions if no class could be found - */ - private static function extractFragmentFromCommentLike() - { - $offset = self::$desired_byte_offset; - $contents = self::$file_contents; - - // fwrite(STDERR, __METHOD__ . " looking for $offset\n"); - if (!preg_match(self::VALID_FRAGMENT_CHARACTER_REGEX, $contents[$offset] ?? '')) { - // fwrite(STDERR, "Giving up, invalid character at $offset\n"); - // Give up if the character under the cursor is an invalid character for a token - return null; - } - // Iterate backwards to find the start of this class identifier - while ($offset > 0 && preg_match(self::VALID_FRAGMENT_CHARACTER_REGEX, $contents[$offset - 1])) { - $offset--; - } - // fwrite(STDERR, "Moved back to $offset, searching at " . json_encode(substr($contents, $offset, 20)) . "\n"); - - if (preg_match('/\\\\?[a-z_\x7f-\xff][a-z0-9_\x7f-\xff]*(\\\\[a-z_\x7f-\xff][a-z0-9_\x7f-\xff]*)*/i', $contents, $matches, 0, $offset) > 0) { - // fwrite(STDERR, "Returning $matches[0]\n"); - return $matches[0]; - } - return null; - } - - /** - * @param PhpParser\Node|Token $n - The node from PHP-Parser - * @return ast\Node|ast\Node[]|string|int|float|bool|null - whatever ast\parse_code would return as the equivalent. - * @override - */ - protected static function phpParserNodeToAstNode($n) - { - static $callback_map; - static $fallback_closure; - if (\is_null($callback_map)) { - // XXX: If initHandleMap is called on TolerantASTConverter in the parent implementation before TolerantASTConverterWithNodeMapping, - // then static:: in the callbacks would point to TolerantASTConverter, not this subclass. - // - // This is worked around by copying and pasting the parent implementation - $callback_map = static::initHandleMap(); - /** - * @param PhpParser\Node|Token $n - * @throws InvalidArgumentException for invalid token classes - * @suppress PhanThrowTypeMismatchForCall can throw if debugDumpNodeOrToken fails - */ - $fallback_closure = static function ($n, int $unused_start_line) : ast\Node { - if (!($n instanceof PhpParser\Node) && !($n instanceof Token)) { - throw new InvalidArgumentException("Invalid type for node: " . (\is_object($n) ? \get_class($n) : \gettype($n)) . ": " . static::debugDumpNodeOrToken($n)); - } - - return static::astStub($n); - }; - } - $callback = $callback_map[\get_class($n)] ?? $fallback_closure; - $result = $callback($n, self::$file_position_map->getStartLine($n)); - if (($result instanceof ast\Node) && $result->kind === ast\AST_NAME) { - $result = new ast\Node(ast\AST_CONST, 0, ['name' => $result], $result->lineno); - } - if ($n === self::$closest_node_or_token) { - self::markNodeAsSelected($n, $result); - } - return $result; - } - - /** - * @param PhpParser\Node|Token $n - The node from PHP-Parser - * @return ast\Node|ast\Node[]|string|int|float|bool|null - whatever ast\parse_code would return as the equivalent. - * @override - */ - protected static function phpParserNonValueNodeToAstNode($n) - { - // fprintf(STDERR, "Comparing %s to %s\n", get_class($n), get_class(self::$closest_node_or_token)); - static $callback_map; - static $fallback_closure; - if (\is_null($callback_map)) { - // XXX: If initHandleMap is called on TolerantASTConverter in the parent implementation before TolerantASTConverterWithNodeMapping, - // then static:: in the callbacks would point to TolerantASTConverter, not this subclass. - // - // This is worked around by copying and pasting the parent implementation - $callback_map = static::initHandleMap(); - /** - * @param PhpParser\Node|Token $n - * @throws InvalidArgumentException for invalid token classes - */ - $fallback_closure = static function ($n, int $unused_start_line) : ast\Node { - if (!($n instanceof PhpParser\Node) && !($n instanceof Token)) { - // @phan-suppress-next-line PhanThrowTypeMismatchForCall debugDumpNodeOrToken can throw - throw new InvalidArgumentException("Invalid type for node: " . (\is_object($n) ? \get_class($n) : \gettype($n)) . ": " . static::debugDumpNodeOrToken($n)); - } - return static::astStub($n); - }; - } - $callback = $callback_map[\get_class($n)] ?? $fallback_closure; - $ast_node = $callback($n, self::getStartLine($n)); - if ($n === self::$closest_node_or_token) { - self::markNodeAsSelected($n, $ast_node); - } - return $ast_node; - } - - /** - * @override - */ - protected static function astStmtUseOrGroupUseFromUseClause( - PhpParser\Node\NamespaceUseClause $use_clause, - $parser_use_kind, - int $start_line - ) : ast\Node { - // fwrite(STDERR, "Calling astStmtUseOrGroupUseFromUseClause for " . json_encode($use_clause) . "\n"); - $ast_node = parent::astStmtUseOrGroupUseFromUseClause($use_clause, $parser_use_kind, $start_line); - if ($use_clause === self::$closest_node_or_token) { - // NOTE: This selects AST_USE instead of AST_USE_ELEM so that we have - // full information on whether it is a function, constant, or class/namespace - // fwrite(STDERR, "Marking corresponding node as flagged: " . json_encode($use_clause) . "\n" . json_encode($ast_node) . "\n"); - self::markNodeAsSelected($use_clause, $ast_node); - } - return $ast_node; - } - - /** - * @param PhpParser\Node\QualifiedName|Token|null $type - * @return ?ast\Node - * @override - */ - protected static function phpParserTypeToAstNode($type, int $line) - { - $ast_node = parent::phpParserTypeToAstNode($type, $line); - if ($type === self::$closest_node_or_token && $type !== null) { - self::markNodeAsSelected($type, $ast_node); - } - return $ast_node; - } -} diff --git a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ast_shim.php b/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ast_shim.php deleted file mode 100644 index 716ea41..0000000 --- a/vendor/phan/phan/src/Phan/AST/TolerantASTConverter/ast_shim.php +++ /dev/null @@ -1,285 +0,0 @@ -<?php -declare(strict_types=1); - -/** - * Based on PHPDoc stub file for ast extension from - * https://github.com/nikic/php-ast/blob/master/ast_stub.php - * - * @author Bill Schaller <bill@zeroedin.com> - * @author Nikita Popov <nikic@php.net> - * - * With modifications to be a functional replacement for the data - * structures and global constants of ext-ast. (for class ast\Node) - * - * This supports AST version 50 - * - * However, this file does not define any global functions such as - * ast\parse_code() and ast\parse_file(). (to avoid confusion) - * - * TODO: Make it so that constant values will be identical to php-ast - * for PHP 7.0-7.3 - * - * @phan-file-suppress PhanUnreferencedConstant, UnusedPluginFileSuppression - Plugins may reference some of these constants - * @phan-file-suppress PhanPluginUnknownArrayPropertyType, PhanPluginUnknownArrayMethodParamType this is a stub - * - * @author Tyson Andre - */ - -// AST KIND CONSTANTS -namespace ast; - -const AST_ARG_LIST = 128; -const AST_ARRAY = 129; -const AST_ENCAPS_LIST = 130; -const AST_EXPR_LIST = 131; -const AST_STMT_LIST = 132; -const AST_IF = 133; -const AST_SWITCH_LIST = 134; -const AST_CATCH_LIST = 135; -const AST_PARAM_LIST = 136; -const AST_CLOSURE_USES = 137; -const AST_PROP_DECL = 138; -const AST_CONST_DECL = 139; -const AST_CLASS_CONST_DECL = 140; -const AST_NAME_LIST = 141; -const AST_TRAIT_ADAPTATIONS = 142; -const AST_USE = 143; -const AST_NAME = 2048; -const AST_CLOSURE_VAR = 2049; -const AST_NULLABLE_TYPE = 2050; -const AST_FUNC_DECL = 66; -const AST_CLOSURE = 67; -const AST_METHOD = 68; -const AST_CLASS = 69; -const AST_MAGIC_CONST = 0; -const AST_TYPE = 1; -const AST_VAR = 256; -const AST_CONST = 257; -const AST_UNPACK = 258; -const AST_CAST = 261; -const AST_EMPTY = 262; -const AST_ISSET = 263; -const AST_SHELL_EXEC = 265; -const AST_CLONE = 266; -const AST_EXIT = 267; -const AST_PRINT = 268; -const AST_INCLUDE_OR_EVAL = 269; -const AST_UNARY_OP = 270; -const AST_PRE_INC = 271; -const AST_PRE_DEC = 272; -const AST_POST_INC = 273; -const AST_POST_DEC = 274; -const AST_YIELD_FROM = 275; -const AST_GLOBAL = 276; -const AST_UNSET = 277; -const AST_RETURN = 278; -const AST_LABEL = 279; -const AST_REF = 280; -const AST_HALT_COMPILER = 281; -const AST_ECHO = 282; -const AST_THROW = 283; -const AST_GOTO = 284; -const AST_BREAK = 285; -const AST_CONTINUE = 286; -const AST_DIM = 512; -const AST_PROP = 513; -const AST_STATIC_PROP = 514; -const AST_CALL = 515; -const AST_CLASS_CONST = 516; -const AST_ASSIGN = 517; -const AST_ASSIGN_REF = 518; -const AST_ASSIGN_OP = 519; -const AST_BINARY_OP = 520; -const AST_ARRAY_ELEM = 525; -const AST_NEW = 526; -const AST_INSTANCEOF = 527; -const AST_YIELD = 528; -const AST_STATIC = 530; -const AST_WHILE = 531; -const AST_DO_WHILE = 532; -const AST_IF_ELEM = 533; -const AST_SWITCH = 534; -const AST_SWITCH_CASE = 535; -const AST_DECLARE = 536; -const AST_PROP_ELEM = 774; -const AST_CONST_ELEM = 775; -const AST_USE_TRAIT = 537; -const AST_TRAIT_PRECEDENCE = 538; -const AST_METHOD_REFERENCE = 539; -const AST_NAMESPACE = 540; -const AST_USE_ELEM = 541; -const AST_TRAIT_ALIAS = 542; -const AST_GROUP_USE = 543; -const AST_METHOD_CALL = 768; -const AST_STATIC_CALL = 769; -const AST_CONDITIONAL = 770; -const AST_TRY = 771; -const AST_CATCH = 772; -const AST_PARAM = 773; -const AST_FOR = 1024; -const AST_FOREACH = 1025; -// END AST KIND CONSTANTS - -// AST FLAG CONSTANTS -namespace ast\flags; - -const NAME_FQ = 0; -const NAME_NOT_FQ = 1; -const NAME_RELATIVE = 2; -const MODIFIER_PUBLIC = 256; -const MODIFIER_PROTECTED = 512; -const MODIFIER_PRIVATE = 1024; -const MODIFIER_STATIC = 1; -const MODIFIER_ABSTRACT = 2; -const MODIFIER_FINAL = 4; -const RETURNS_REF = 67108864; -const FUNC_RETURNS_REF = 67108864; -const FUNC_GENERATOR = 4194304; // NOTE: Not set in all PHP versions. -const ARRAY_ELEM_REF = 1; -const CLOSURE_USE_REF = 1; -const CLASS_ABSTRACT = 32; -const CLASS_FINAL = 4; -const CLASS_TRAIT = 128; -const CLASS_INTERFACE = 64; -const CLASS_ANONYMOUS = 256; -const PARAM_REF = 1; -const PARAM_VARIADIC = 2; -const TYPE_NULL = 1; -const TYPE_BOOL = 13; -const TYPE_LONG = 4; -const TYPE_DOUBLE = 5; -const TYPE_STRING = 6; -const TYPE_ARRAY = 7; -const TYPE_OBJECT = 8; -const TYPE_CALLABLE = 14; -const TYPE_VOID = 18; -const TYPE_ITERABLE = 19; -const UNARY_BOOL_NOT = 13; -const UNARY_BITWISE_NOT = 12; -const UNARY_SILENCE = 260; -const UNARY_PLUS = 261; -const UNARY_MINUS = 262; -const BINARY_BOOL_AND = 259; -const BINARY_BOOL_OR = 258; -const BINARY_BOOL_XOR = 14; -const BINARY_BITWISE_OR = 9; -const BINARY_BITWISE_AND = 10; -const BINARY_BITWISE_XOR = 11; -const BINARY_CONCAT = 8; -const BINARY_ADD = 1; -const BINARY_SUB = 2; -const BINARY_MUL = 3; -const BINARY_DIV = 4; -const BINARY_MOD = 5; -const BINARY_POW = 166; -const BINARY_SHIFT_LEFT = 6; -const BINARY_SHIFT_RIGHT = 7; -const BINARY_IS_IDENTICAL = 15; -const BINARY_IS_NOT_IDENTICAL = 16; -const BINARY_IS_EQUAL = 17; -const BINARY_IS_NOT_EQUAL = 18; -const BINARY_IS_SMALLER = 19; -const BINARY_IS_SMALLER_OR_EQUAL = 20; -const BINARY_IS_GREATER = 256; -const BINARY_IS_GREATER_OR_EQUAL = 257; -const BINARY_SPACESHIP = 170; -const BINARY_COALESCE = 260; -const EXEC_EVAL = 1; -const EXEC_INCLUDE = 2; -const EXEC_INCLUDE_ONCE = 4; -const EXEC_REQUIRE = 8; -const EXEC_REQUIRE_ONCE = 16; -const USE_NORMAL = 361; -const USE_FUNCTION = 346; -const USE_CONST = 347; -const MAGIC_LINE = 370; -const MAGIC_FILE = 371; -const MAGIC_DIR = 372; -const MAGIC_NAMESPACE = 389; -const MAGIC_FUNCTION = 376; -const MAGIC_METHOD = 375; -const MAGIC_CLASS = 373; -const MAGIC_TRAIT = 374; -const ARRAY_SYNTAX_LIST = 1; -const ARRAY_SYNTAX_LONG = 2; -const ARRAY_SYNTAX_SHORT = 3; -// END AST FLAG CONSTANTS - -namespace ast; - -// The parse_file(), parse_code(), get_kind_name(), and kind_uses_flags() are deliberately omitted from this stub. -// Use Phan\Debug and Phan\AST\Parser instead. - -if (!\class_exists('\ast\Node')) { - /** - * This class describes a single node in a PHP AST. - * @suppress PhanRedefineClassInternal - */ - class Node - { - /** @var int AST Node Kind. Values are one of ast\AST_* constants. */ - public $kind; - - /** - * @var int AST Flags. - * Certain node kinds have flags that can be set. - * These will be a bitfield of ast\flags\* constants. - */ - public $flags; - - /** @var int Line the node starts in */ - public $lineno; - - /** @var array Child nodes (may be empty) */ - public $children; - /** - * A constructor which validates data types but not the values themselves. - * For backwards compatibility reasons, all values are optional and properties default to null - * @suppress PhanPossiblyNullTypeMismatchProperty - */ - public function __construct(int $kind = null, int $flags = null, array $children = null, int $lineno = null) - { - $this->kind = $kind; - $this->flags = $flags; - $this->children = $children; - $this->lineno = $lineno; - } - } -} - -if (!\class_exists('ast\Metadata')) { - /** - * Metadata entry for a single AST kind, as returned by ast\get_metadata(). - * @suppress PhanRedefineClassInternal - * @suppress PhanUnreferencedClass - */ - class Metadata - { - /** - * @var int AST node kind (one of the ast\AST_* constants). - * @suppress PhanUnreferencedPublicProperty - */ - public $kind; - - /** - * @var string Name of the node kind (e.g. "AST_NAME"). - * @suppress PhanUnreferencedPublicProperty - */ - public $name; - - /** - * @var array<int,string> Array of supported flags. The flags are given as names of constants, such as - * "ast\flags\TYPE_STRING". - * @suppress PhanUnreferencedPublicProperty - */ - public $flags; - - /** - * @var bool Whether the flags are exclusive or combinable. Exclusive flags should be checked - * using ===, while combinable flags should be checked using &. - * @suppress PhanUnreferencedPublicProperty - */ - // phpcs:ignore Phan.NamingConventions.ValidUnderscoreVariableName.MemberVarNotUnderscore - public $flagsCombinable; - } -} diff --git a/vendor/phan/phan/src/Phan/AST/UnionTypeVisitor.php b/vendor/phan/phan/src/Phan/AST/UnionTypeVisitor.php deleted file mode 100644 index 0032e73..0000000 --- a/vendor/phan/phan/src/Phan/AST/UnionTypeVisitor.php +++ /dev/null @@ -1,3140 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST; - -use AssertionError; -use ast; -use ast\Node; -use Closure; -use Phan\Analysis\AssignOperatorFlagVisitor; -use Phan\Analysis\BinaryOperatorFlagVisitor; -use Phan\Analysis\ConditionVisitor; -use Phan\Analysis\NegatedConditionVisitor; -use Phan\AST\Visitor\Element; -use Phan\CodeBase; -use Phan\Config; -use Phan\Debug; -use Phan\Exception\CodeBaseException; -use Phan\Exception\EmptyFQSENException; -use Phan\Exception\FQSENException; -use Phan\Exception\InvalidFQSENException; -use Phan\Exception\IssueException; -use Phan\Exception\NodeException; -use Phan\Exception\RecursionDepthException; -use Phan\Exception\UnanalyzableException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionLikeName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedGlobalStructuralElement; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\Scope\BranchScope; -use Phan\Language\Scope\GlobalScope; -use Phan\Language\Type; -use Phan\Language\Type\ArrayShapeType; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\BoolType; -use Phan\Language\Type\CallableType; -use Phan\Language\Type\ClassStringType; -use Phan\Language\Type\ClosureType; -use Phan\Language\Type\FloatType; -use Phan\Language\Type\GenericArrayType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\IterableType; -use Phan\Language\Type\LiteralIntType; -use Phan\Language\Type\LiteralStringType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\ObjectType; -use Phan\Language\Type\SelfType; -use Phan\Language\Type\StaticOrSelfType; -use Phan\Language\Type\StaticType; -use Phan\Language\Type\StringType; -use Phan\Language\Type\TemplateType; -use Phan\Language\Type\VoidType; -use Phan\Language\UnionType; -use Phan\Language\UnionTypeBuilder; -use Phan\Library\StringUtil; -use TypeError; -use function is_scalar; -use function is_string; - -/** - * Determines the UnionType associated with a given node. - * - * @see UnionTypeVisitor::unionTypeFromNode() - * - * @phan-file-suppress PhanPartialTypeMismatchArgument node is complicated - * @phan-file-suppress PhanPartialTypeMismatchArgumentInternal node is complicated - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class UnionTypeVisitor extends AnalysisVisitor -{ - /** - * @var bool - * Set to true to cause loggable issues to be thrown - * instead of emitted as issues to the log. - */ - private $should_catch_issue_exception = false; - - /** - * @param CodeBase $code_base - * The code base within which we're operating - * - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - * - * @param bool $should_catch_issue_exception - * Set to true to cause loggable issues to be thrown - * instead of emitted as issues to the log. - */ - public function __construct( - CodeBase $code_base, - Context $context, - bool $should_catch_issue_exception = true - ) { - // Inlined to be more efficient. - // parent::__construct($code_base, $context); - $this->code_base = $code_base; - $this->context = $context; - - $this->should_catch_issue_exception = - $should_catch_issue_exception; - } - - /** - * @param CodeBase $code_base - * The code base within which we're operating - * - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - * - * @param Node|string|bool|int|float|null $node - * The node for which we'd like to determine its type - * - * @param bool $should_catch_issue_exception - * Set to true to cause loggable issues to be thrown - * instead - * - * @return UnionType - * The UnionType associated with the given node - * in the given Context within the given CodeBase - * - * @throws IssueException - * If $should_catch_issue_exception is false an IssueException may - * be thrown for optional issues. - */ - public static function unionTypeFromNode( - CodeBase $code_base, - Context $context, - $node, - bool $should_catch_issue_exception = true - ) : UnionType { - if (!($node instanceof Node)) { - if ($node === null) { - // NOTE: Parameter default checks expect this to return empty - return UnionType::empty(); - } - return Type::fromObject($node)->asUnionType(); - } - $node_id = \spl_object_id($node); - - $cached_union_type = $context->getUnionTypeOfNodeIfCached($node_id, $should_catch_issue_exception); - if ($cached_union_type !== null) { - return $cached_union_type; - } - - if ($should_catch_issue_exception) { - try { - $union_type = (new self( - $code_base, - $context, - $should_catch_issue_exception - ))->{Element::VISIT_LOOKUP_TABLE[$node->kind] ?? 'visit'}($node); - $context->setCachedUnionTypeOfNode($node_id, $union_type, true); - return $union_type; - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $code_base, - $context, - $exception->getIssueInstance() - ); - return UnionType::empty(); - } - } - - $union_type = (new self( - $code_base, - $context, - $should_catch_issue_exception - ))->{Element::VISIT_LOOKUP_TABLE[$node->kind] ?? 'visit'}($node); - - $context->setCachedUnionTypeOfNode($node_id, $union_type, false); - return $union_type; - } - - /** - * Default visitor for node kinds that do not have - * an overriding method - * - * @param Node $node (@phan-unused-param) - * An AST node we'd like to determine the UnionType - * for - * - * @return UnionType - * The set of types associated with the given node - */ - public function visit(Node $node) : UnionType - { - /* - throw new NodeException($node, - 'Visitor not implemented for node of type ' - . Debug::nodeName($node) - ); - */ - return UnionType::empty(); - } - - /** - * Visit a node with kind `\ast\AST_POST_INC` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitPostInc(Node $node) : UnionType - { - // TODO: Check if union type is sane (string/int) - return self::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['var'] - )->asNonLiteralType(); - } - - /** - * Visit a node with kind `\ast\AST_POST_DEC` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitPostDec(Node $node) : UnionType - { - // TODO: Check if union type is sane (string/int) - return self::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['var'] - )->asNonLiteralType(); - } - - /** - * Visit a node with kind `\ast\AST_PRE_DEC` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitPreDec(Node $node) : UnionType - { - // TODO: Check if union type is sane (string/int) - return self::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['var'] - )->asNonLiteralType()->getTypeAfterIncOrDec(); - } - - /** - * Visit a node with kind `\ast\AST_PRE_INC` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - * - * TODO: in PostOrderAnalysisVisitor, set the type to unknown for ++/-- - */ - public function visitPreInc(Node $node) : UnionType - { - // TODO: Check if union type is sane (string/int) - return self::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['var'] - )->asNonLiteralType()->getTypeAfterIncOrDec(); - } - - /** - * Visit a node with kind `\ast\AST_CLONE` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitClone(Node $node) : UnionType - { - // TODO: Check if union type is sane (Any object type) - return self::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'] - ); - } - - /** - * Visit a node with kind `\ast\AST_EMPTY` - * - * @param Node $node (@phan-unused-param) - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitEmpty(Node $node) : UnionType - { - return BoolType::instance(false)->asUnionType(); - } - - /** - * Visit a node with kind `\ast\AST_ISSET` - * - * @param Node $node (@phan-unused-param) - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitIsset(Node $node) : UnionType - { - return BoolType::instance(false)->asUnionType(); - } - - /** - * Visit a node with kind `\ast\AST_INCLUDE_OR_EVAL` - * - * @param Node $node (@phan-unused-param) - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitIncludeOrEval(Node $node) : UnionType - { - // require() can return arbitrary objects. Lets just - // say that we don't know what it is and move on - return UnionType::empty(); - } - - private static function literalIntUnionType(int $value) : UnionType - { - return LiteralIntType::instanceForValue($value, false)->asUnionType(); - } - - private static function literalStringUnionType(string $value) : UnionType - { - return LiteralStringType::instanceForValue($value, false)->asUnionType(); - } - - const MAGIC_CONST_NAME_MAP = [ - ast\flags\MAGIC_LINE => '__LINE__', - ast\flags\MAGIC_FILE => '__FILE__', - ast\flags\MAGIC_DIR => '__DIR__', - ast\flags\MAGIC_NAMESPACE => '__NAME__', - ast\flags\MAGIC_FUNCTION => '__FUNCTION__', - ast\flags\MAGIC_METHOD => '__METHOD__', - ast\flags\MAGIC_CLASS => '__CLASS__', - ast\flags\MAGIC_TRAIT => '__TRAIT__', - ]; - - /** - * Visit a node with kind `\ast\AST_MAGIC_CONST` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitMagicConst(Node $node) : UnionType - { - $flags = $node->flags; - switch ($flags) { - case ast\flags\MAGIC_CLASS: - if ($this->context->isInClassScope()) { - // Works in classes, traits, and interfaces - return self::literalStringUnionType(\ltrim($this->context->getClassFQSEN()->__toString(), '\\')); - } - break; - case ast\flags\MAGIC_FUNCTION: - if ($this->context->isInFunctionLikeScope()) { - $fqsen = $this->context->getFunctionLikeFQSEN(); - return self::literalStringUnionType($fqsen->isClosure() ? '{closure}' : $fqsen->getName()); - } - break; - case ast\flags\MAGIC_METHOD: - if ($this->context->isInFunctionLikeScope()) { - // Emits method or function FQSEN. - $fqsen = $this->context->getFunctionLikeFQSEN(); - return self::literalStringUnionType($fqsen->isClosure() ? '{closure}' : \ltrim($fqsen->__toString(), '\\')); - } - break; - case ast\flags\MAGIC_DIR: - return self::literalStringUnionType(\dirname(Config::projectPath($this->context->getFile()))); - case ast\flags\MAGIC_FILE: - return self::literalStringUnionType(Config::projectPath($this->context->getFile())); - case ast\flags\MAGIC_LINE: - return self::literalIntUnionType($node->lineno); - case ast\flags\MAGIC_NAMESPACE: - return self::literalStringUnionType(\ltrim($this->context->getNamespace(), '\\')); - case ast\flags\MAGIC_TRAIT: - // TODO: Could check if in trait, low importance. - if (!$this->context->isInClassScope()) { - break; - } - $fqsen = $this->context->getClassFQSEN(); - if ($this->code_base->hasClassWithFQSEN($fqsen)) { - if (!$this->code_base->getClassByFQSEN($fqsen)->isTrait()) { - break; - } - } - return self::literalStringUnionType((string)\ltrim($this->context->getClassFQSEN()->__toString(), '\\')); - default: - return StringType::instance(false)->asUnionType(); - } - $this->emitIssue( - Issue::UndeclaredMagicConstant, - $node->lineno, - self::MAGIC_CONST_NAME_MAP[$flags] - ); - - return self::literalStringUnionType(''); - } - - /** - * Visit a node with kind `\ast\AST_ASSIGN_REF` - * @see self::visitAssign() - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitAssignRef(Node $node) : UnionType - { - // TODO: Is there any way this should differ from analysis - // (e.g. should subsequent assignments affect the right-hand Node?) - return $this->visitAssign($node); - } - - /** - * Visit a node with kind `\ast\AST_SHELL_EXEC` - * - * @param Node $node (@phan-unused-param) - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitShellExec(Node $node) : UnionType - { - return StringType::instance(false)->asUnionType(); - } - - /** - * @return ?Type - * @throws IssueException if the parent type could not be resolved - */ - public static function findParentType(Context $context, CodeBase $code_base) - { - if (!$context->isInClassScope()) { - throw new IssueException( - Issue::fromType(Issue::ContextNotObject)( - $context->getFile(), - $context->getLineNumberStart(), - ['parent'] - ) - ); - } - $class = $context->getClassInScope($code_base); - - $parent_type_option = $class->getParentTypeOption(); - if ($parent_type_option->isDefined()) { - return $parent_type_option->get(); - } - - // Using `parent` in a class or interface without a parent is always invalid. - // Doing this in a trait may or not be valid. - if (!$class->isTrait()) { - Issue::maybeEmit( - $code_base, - $context, - Issue::ParentlessClass, - $context->getLineNumberStart(), - (string)$class->getFQSEN() - ); - } - - return null; - } - - /** - * Visit a node with kind `\ast\AST_NAME` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitName(Node $node) : UnionType - { - $name = $node->children['name']; - try { - if ($node->flags & \ast\flags\NAME_NOT_FQ) { - if (\strcasecmp('parent', $name) === 0) { - $parent_type = self::findParentType($this->context, $this->code_base); - return $parent_type ? $parent_type->asUnionType() : UnionType::empty(); - } - - return Type::fromStringInContext( - $name, - $this->context, - Type::FROM_NODE - )->asUnionType(); - } - - if ($node->flags & \ast\flags\NAME_RELATIVE) { // $x = new namespace\Foo(); - $name = \rtrim($this->context->getNamespace(), '\\') . '\\' . $name; - return Type::fromFullyQualifiedString( - $name - )->asUnionType(); - } - // Sometimes 0 for a fully qualified name? - - // @phan-suppress-next-line PhanThrowTypeAbsentForCall hopefully impossible - return Type::fromFullyQualifiedString( - '\\' . $name - )->asUnionType(); - } catch (FQSENException $e) { - $this->emitIssue( - $e instanceof EmptyFQSENException ? Issue::EmptyFQSENInClasslike : Issue::InvalidFQSENInClasslike, - $node->lineno, - $e->getFQSEN() - ); - return UnionType::empty(); - } - } - - /** - * Visit a node with kind `\ast\AST_TYPE` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - * - * @throws AssertionError if the type flags were unknown - */ - public function visitType(Node $node) : UnionType - { - switch ($node->flags) { - case \ast\flags\TYPE_ARRAY: - return ArrayType::instance(false)->asUnionType(); - case \ast\flags\TYPE_BOOL: - return BoolType::instance(false)->asUnionType(); - case \ast\flags\TYPE_CALLABLE: - return CallableType::instance(false)->asUnionType(); - case \ast\flags\TYPE_DOUBLE: - return FloatType::instance(false)->asUnionType(); - case \ast\flags\TYPE_ITERABLE: - return IterableType::instance(false)->asUnionType(); - case \ast\flags\TYPE_LONG: - return IntType::instance(false)->asUnionType(); - case \ast\flags\TYPE_NULL: - return NullType::instance(false)->asUnionType(); - case \ast\flags\TYPE_OBJECT: - return ObjectType::instance(false)->asUnionType(); - case \ast\flags\TYPE_STRING: - return StringType::instance(false)->asUnionType(); - case \ast\flags\TYPE_VOID: - return VoidType::instance(false)->asUnionType(); - default: - throw new AssertionError("All flags must match. Found " - . Debug::astFlagDescription($node->flags ?? 0, $node->kind)); - } - } - - /** - * Visit a node with kind `\ast\AST_TYPE` representing - * a nullable type such as `?string`. - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitNullableType(Node $node) : UnionType - { - // Get the type - $union_type = $this->__invoke($node->children['type']); - - // Make each nullable - return $union_type->asMappedUnionType(static function (Type $type) : Type { - return $type->withIsNullable(true); - }); - } - - /** - * @param int|float|string|Node $node - * @return ?UnionType - */ - public static function unionTypeFromLiteralOrConstant(CodeBase $code_base, Context $context, $node) - { - if ($node instanceof Node) { - // TODO: Could check for arrays of constants or literals, and convert those to the generic array types - if ($node->kind === \ast\AST_CONST || $node->kind === \ast\AST_CLASS_CONST) { - try { - return UnionTypeVisitor::unionTypeFromNode($code_base, $context, $node, false); - } catch (IssueException $_) { - return null; - } - } - return null; - } - // Otherwise, this is an int/float/string. - if (!is_scalar($node)) { - throw new TypeError('node must be Node or scalar'); - } - return Type::fromObject($node)->asUnionType(); - } - - /** - * Returns the union type from a type in a parameter/return signature of a function-like. - * This preserves `self` and `static` - * @param Node $node - */ - public function fromTypeInSignature($node) : UnionType - { - $is_nullable = $node->kind === ast\AST_NULLABLE_TYPE; - if ($is_nullable) { - $node = $node->children['type']; - if (!$node instanceof Node) { - // Work around bug (in polyfill parser?) - return UnionType::empty(); - } - } - $kind = $node->kind; - if ($kind === ast\AST_TYPE) { - $result = $this->visitType($node); - } else { - if ($kind !== ast\AST_NAME) { - throw new AssertionError("Expected either a type or a name in the signature: node: " . Debug::nodeToString($node)); - } - if ($this->context->getScope()->isInTraitScope()) { - $name = \strtolower($node->children['name']); - if ($name === 'self') { - return SelfType::instance($is_nullable)->asUnionType(); - } elseif ($name === 'static') { - return StaticType::instance($is_nullable)->asUnionType(); - } - } - $result = $this->visitName($node); - } - if ($is_nullable) { - return $result->nullableClone(); - } - return $result; - } - - /** - * @param int|float|string|Node $cond - * @return ?bool - */ - public static function checkCondUnconditionalTruthiness($cond) - { - if ($cond instanceof Node) { - if ($cond->kind === \ast\AST_CONST) { - $name = $cond->children['name']; - if ($name->kind === \ast\AST_NAME) { - switch (\strtolower($name->children['name'])) { - case 'true': - return true; - case 'false': - return false; - case 'null': - return false; - default: - // Could add heuristics based on internal/user-defined constant values, but that is unreliable. - // (E.g. feature flags for an extension may be true or false, depending on the environment) - // (and Phan doesn't store constant values for user-defined constants, only the types) - return null; - } - } - } - return null; - } - // Otherwise, this is an int/float/string. - // Use the exact same truthiness rules as PHP to check if the conditional is truthy. - // (e.g. "0" and 0.0 and '' are false) - if (!is_scalar($cond)) { - throw new TypeError('$cond must be Node or scalar'); - } - return (bool)$cond; - } - - /** - * Visit a node with kind `\ast\AST_CONDITIONAL` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitConditional(Node $node) : UnionType - { - $cond_node = $node->children['cond']; - $cond_truthiness = self::checkCondUnconditionalTruthiness($cond_node); - // For the shorthand $a ?: $b, the cond node will be the truthy value. - // Note: an ast node will never be null(can be unset), it will be a const AST node with the name null. - $true_node = $node->children['true'] ?? $cond_node; - - // Rarely, a conditional will always be true or always be false. - if ($cond_truthiness !== null) { - // TODO: Add no-op checks in another PR, if they don't already exist for conditional. - if ($cond_truthiness === true) { - // The condition is unconditionally true - return UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $true_node - ); - } else { - // The condition is unconditionally false - - // Add the type for the 'false' side - return UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['false'] ?? '' - ); - } - } - if ($true_node !== $cond_node) { - // Visit the condition to check for undefined variables. - UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $cond_node - ); - } - // TODO: emit no-op if $cond_node is a literal, such as `if (2)` - // - Also note that some things such as `true` and `false` are \ast\AST_NAME nodes. - - if ($cond_node instanceof Node) { - $base_context = $this->context; - // TODO: Use different contexts and merge those, in case there were assignments or assignments by reference in both sides of the conditional? - // Reuse the BranchScope (sort of unintuitive). The ConditionVisitor returns a clone and doesn't modify the original. - $base_context_scope = $this->context->getScope(); - if ($base_context_scope instanceof GlobalScope) { - $base_context = $base_context->withScope(new BranchScope($base_context_scope)); - } - $true_context = (new ConditionVisitor( - $this->code_base, - isset($node->children['true']) ? $base_context : $this->context // special case: $c = (($d = foo()) ?: 'fallback') - ))->__invoke($cond_node); - $false_context = (new NegatedConditionVisitor( - $this->code_base, - $base_context - ))->__invoke($cond_node); - - if (!isset($node->children['true'])) { - $true_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $true_context, - $true_node - ); - - $false_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $false_context, - $node->children['false'] ?? '' - ); - $true_type_is_empty = $true_type->isEmpty(); - if (!$false_type->isEmpty()) { - // E.g. `foo() ?: 2` where foo is nullable or possibly false. - if ($true_type->containsFalsey()) { - $true_type = $true_type->nonFalseyClone(); - } - } - - // Add the type for the 'true' side to the 'false' side - $union_type = $true_type->withUnionType($false_type); - - // If one side has an unknown type but the other doesn't - // we can't let the unseen type get erased. Unfortunately, - // we need to add 'mixed' in so that we know it could be - // anything at all. - // - // See Issue #104 - if ($true_type_is_empty xor $false_type->isEmpty()) { - $union_type = $union_type->withType( - MixedType::instance(false) - ); - } - - return $union_type; - } - } else { - $true_context = $this->context; - $false_context = $this->context; - } - // Postcondition: This is (cond_expr) ? (true_expr) : (false_expr) - - $true_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $true_context, - $true_node - ); - - $false_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $false_context, - $node->children['false'] ?? '' - ); - - // Add the type for the 'true' side to the 'false' side - $union_type = $true_type->withUnionType($false_type); - - // If one side has an unknown type but the other doesn't - // we can't let the unseen type get erased. Unfortunately, - // we need to add 'mixed' in so that we know it could be - // anything at all. - // - // See Issue #104 - if ($true_type->isEmpty() xor $false_type->isEmpty()) { - $union_type = $union_type->withType( - MixedType::instance(false) - ); - } - - return $union_type; - } - - /** - * Visit a node with kind `\ast\AST_ARRAY` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitArray(Node $node) : UnionType - { - $children = $node->children; - if (\count($children) > 0) { - $value_types_builder = new UnionTypeBuilder(); - - $key_set = $this->getEquivalentArraySet($node); - if (\is_array($key_set) && \count($key_set) === \count($children)) { - return $this->createArrayShapeType($children, $key_set)->asUnionType(); - } - - foreach ($children as $child) { - if (!($child instanceof Node)) { - // Skip this, we already emitted a syntax error. - continue; - } - $value = $child->children['value']; - if ($value instanceof Node) { - $element_value_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $value, - $this->should_catch_issue_exception - ); - if ($element_value_type->isEmpty()) { - $value_types_builder->addType(MixedType::instance(false)); - } else { - $value_types_builder->addUnionType($element_value_type); - } - } else { - $value_types_builder->addType(Type::fromObject($value)); - } - } - // TODO: Normalize value_types, e.g. false+true=bool, array<int,T>+array<string,T>=array<mixed,T> - $key_type_enum = GenericArrayType::getKeyTypeOfArrayNode($this->code_base, $this->context, $node, $this->should_catch_issue_exception); - return $value_types_builder->getUnionType()->asNonEmptyGenericArrayTypes($key_type_enum); - } - - // TODO: Also return types such as array<int, mixed>? - // TODO: Fix or suppress false positives PhanTypeArraySuspicious caused by loops... - return ArrayShapeType::empty(false)->asUnionType(); - } - - /** - * Visit a node with kind `\ast\AST_YIELD` - * - * @param Node $unused_node - * A yield node. Does not affect the union type - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitYield(Node $unused_node) : UnionType - { - $context = $this->context; - if (!$context->isInFunctionLikeScope()) { - return UnionType::empty(); - } - - // Get the method/function/closure we're in - $method = $context->getFunctionLikeInScope($this->code_base); - $method_generator_type = $method->getReturnTypeAsGeneratorTemplateType(); - $type_list = $method_generator_type->getTemplateParameterTypeList(); - if (\count($type_list) < 3 || \count($type_list) > 4) { - return UnionType::empty(); - } - // Return TSend of Generator<TKey,TValue,TSend[,TReturn]> - return $type_list[2]; - } - - /** - * @return ?array<int|string,true> - * Caller should check if the result size is too small and handle it (for duplicate keys) - * Returns null if one or more keys could not be resolved - * - * @see ContextNode::getEquivalentPHPArrayElements() - */ - private function getEquivalentArraySet(Node $node) - { - $elements = []; - $context_node = null; - foreach ($node->children as $child_node) { - if (!($child_node instanceof Node)) { - ContextNode::warnAboutEmptyArrayElements($this->code_base, $this->context, $node); - continue; - } - $key_node = $child_node->children['key']; - // NOTE: this has some overlap with DuplicateKeyPlugin - if ($key_node === null) { - $elements[] = true; - } elseif (is_scalar($key_node)) { - $elements[$key_node] = true; // Check for float? - } else { - if ($context_node === null) { - $context_node = new ContextNode($this->code_base, $this->context, null); - } - $key = $context_node->getEquivalentPHPValueForNode($key_node, ContextNode::RESOLVE_CONSTANTS); - if (is_scalar($key)) { - $elements[$key] = true; - } else { - return null; - } - } - } - return $elements; - } - - /** - * @param array<int,Node> $children - * @param array<int|string,true> $key_set - */ - private function createArrayShapeType(array $children, array $key_set) : ArrayShapeType - { - \reset($key_set); - $field_types = []; - - foreach ($children as $child) { - $value = $child->children['value']; - $key = \key($key_set); - \next($key_set); - - if ($value instanceof Node) { - $element_value_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $value, - $this->should_catch_issue_exception - ); - $field_types[$key] = $element_value_type->isEmpty() ? MixedType::instance(false)->asUnionType() : $element_value_type; - } else { - $field_types[$key] = Type::fromObject($value)->asUnionType(); - } - } - return ArrayShapeType::fromFieldTypes($field_types, false); - } - - /** - * Visit a node with kind `\ast\AST_BINARY_OP` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitBinaryOp(Node $node) : UnionType - { - return (new BinaryOperatorFlagVisitor( - $this->code_base, - $this->context, - $this->should_catch_issue_exception - ))->__invoke($node); - } - - /** - * Visit a node with kind `\ast\AST_ASSIGN_OP` (E.g. $x .= 'suffix') - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitAssignOp(Node $node) : UnionType - { - return (new AssignOperatorFlagVisitor( - $this->code_base, - $this->context - ))->__invoke($node); - } - - /** - * Visit a node with kind `\ast\AST_CAST` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - * - * @throws NodeException if the flags are a value we aren't expecting - */ - public function visitCast(Node $node) : UnionType - { - // TODO: Check if the cast is allowed based on the right side type - $expr_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $node->children['expr']); - switch ($node->flags) { - case \ast\flags\TYPE_NULL: - return NullType::instance(false)->asUnionType(); - case \ast\flags\TYPE_BOOL: - return BoolType::instance(false)->asUnionType(); - case \ast\flags\TYPE_LONG: - return IntType::instance(false)->asUnionType(); - case \ast\flags\TYPE_DOUBLE: - return FloatType::instance(false)->asUnionType(); - case \ast\flags\TYPE_STRING: - return StringType::instance(false)->asUnionType(); - case \ast\flags\TYPE_ARRAY: - return ArrayType::instance(false)->asUnionType(); - case \ast\flags\TYPE_OBJECT: - if ($expr_type->isExclusivelyArray()) { - return UnionType::fromFullyQualifiedString('\stdClass'); - } - return ObjectType::instance(false)->asUnionType(); - default: - throw new NodeException( - $node, - 'Unknown type (' . $node->flags . ') in cast' - ); - } - } - - /** - * Visit a node with kind `\ast\AST_NEW` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitNew(Node $node) : UnionType - { - $class_node = $node->children['class']; - if (!($class_node instanceof Node)) { - $this->emitIssue( - Issue::InvalidNode, - $node->lineno, - "Invalid ClassName for new ClassName()" - ); - return ObjectType::instance(false)->asUnionType(); - } - $union_type = $this->visitClassNameNode($class_node); - if ($union_type->isEmpty()) { - return ObjectType::instance(false)->asUnionType(); - } - - // TODO: re-use the underlying type set in the common case - // Maybe UnionType::fromMap - - // For any types that are templates, map them to concrete - // types based on the parameters passed in. - return UnionType::of(\array_map(function (Type $type) use ($node) : Type { - - // Get a fully qualified name for the type - // TODO: Add a test of `new $closure()` warning. - $fqsen = FullyQualifiedClassName::fromType($type); - - // If we don't have the class, we'll catch that problem - // elsewhere - if (!$this->code_base->hasClassWithFQSEN($fqsen)) { - return $type; - } - - - $class = $this->code_base->getClassByFQSEN($fqsen); - - // If this class doesn't have any generics on it, we're - // fine as we are with this Type - if (!$class->isGeneric()) { - return $type; - } - - // Now things are interesting. We need to map the - // arguments to the generic types and return a special - // kind of type. - - // Map each argument to its type - /** @param Node|string|int|float $arg_node */ - $arg_type_list = \array_map(function ($arg_node) : UnionType { - return UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $arg_node - ); - }, $node->children['args']->children); - - // Get closures to extract template types based on the types of the constructor - // so that we can figure out what template types we're going to be mapping - $template_type_resolvers = $class->getGenericConstructorBuilder($this->code_base); - - // And use those closures to infer the (possibly transformed) types - $template_type_list = []; - foreach ($template_type_resolvers as $template_type_resolver) { - $template_type_list[] = $template_type_resolver($arg_type_list, $this->context); - } - - // Create a new type that assigns concrete - // types to template type identifiers. - return Type::fromType($type, $template_type_list); - }, $union_type->getTypeSet())); - } - - /** - * Visit a node with kind `\ast\AST_INSTANCEOF` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitInstanceOf(Node $node) : UnionType - { - $code_base = $this->code_base; - $context = $this->context; - // Check to make sure the left side is valid - UnionTypeVisitor::unionTypeFromNode($code_base, $context, $node->children['expr']); - // Get the type that we're checking it against, check if it is valid. - $class_node = $node->children['class']; - if (!($class_node instanceof Node)) { - return BoolType::instance(false)->asUnionType(); - } - $type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $class_node - ); - // TODO: Unify UnionTypeVisitor, AssignmentVisitor, and PostOrderAnalysisVisitor - if (!$type->isEmpty() && !$type->hasObjectTypes()) { - if ($class_node->kind !== \ast\AST_NAME && - !$type->canCastToUnionType(StringType::instance(false)->asUnionType())) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeInvalidInstanceof, - $context->getLineNumberStart(), - (string)$type - ); - } - } - - return BoolType::instance(false)->asUnionType(); - } - - /** @internal - Duplicated for performance. Use PhanAnnotationAdder instead */ - const FLAG_IGNORE_NULLABLE = 1 << 29; - - /** - * Visit a node with kind `\ast\AST_DIM` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - * - * @throws IssueException - * if the dimension access is invalid - */ - public function visitDim(Node $node) : UnionType - { - $union_type = self::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'], - $this->should_catch_issue_exception - ); - - if ($union_type->isEmpty()) { - return $union_type; - } - - // If none of the types we found were arrays with elements, - // then check for ArrayAccess - static $array_access_type; - static $simple_xml_element_type; // SimpleXMLElement doesn't `implement` ArrayAccess, but can be accessed that way. See #542 - static $null_type; - static $string_type; - static $int_union_type; - static $int_or_string_union_type; - - if ($array_access_type === null) { - // array offsets work on strings, unfortunately - // Double check that any classes in the type don't - // have ArrayAccess - $array_access_type = - Type::fromNamespaceAndName('\\', 'ArrayAccess', false); - $simple_xml_element_type = - Type::fromNamespaceAndName('\\', 'SimpleXMLElement', false); - $null_type = NullType::instance(false); - $string_type = StringType::instance(false); - $int_union_type = IntType::instance(false)->asUnionType(); - $int_or_string_union_type = new UnionType([IntType::instance(false), StringType::instance(false)], true); - } - - if ($union_type->hasTopLevelArrayShapeTypeInstances()) { - $element_type = $this->resolveArrayShapeElementTypes($node, $union_type); - if ($element_type !== null) { - return $element_type; - } - } - - $dim_type = self::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['dim'], - true - ); - - // Figure out what the types of accessed array - // elements would be. - $generic_types = $union_type->genericArrayElementTypes(); - - // If we have generics, we're all set - if (!$generic_types->isEmpty()) { - if (!($node->flags & self::FLAG_IGNORE_NULLABLE) && self::isSuspiciousNullable($union_type)) { - $this->emitIssue( - Issue::TypeArraySuspiciousNullable, - $node->lineno, - (string)$union_type - ); - } - - if (!$dim_type->isEmpty()) { - try { - $should_check = !$union_type->hasMixedType() && !$union_type->asExpandedTypes($this->code_base)->hasArrayAccess(); - } catch (RecursionDepthException $_) { - $should_check = false; - } - if ($should_check) { - if (Config::getValue('scalar_array_key_cast')) { - $expected_key_type = $int_or_string_union_type; - } else { - $expected_key_type = GenericArrayType::unionTypeForKeyType( - GenericArrayType::keyTypeFromUnionTypeKeys($union_type), - GenericArrayType::CONVERT_KEY_MIXED_TO_INT_OR_STRING_UNION_TYPE - ); - } - - if (!$dim_type->canCastToUnionType($expected_key_type)) { - $issue_type = Issue::TypeMismatchDimFetch; - - if ($dim_type->containsNullable() && $dim_type->nonNullableClone()->canCastToUnionType($expected_key_type)) { - $issue_type = Issue::TypeMismatchDimFetchNullable; - } - - if ($this->should_catch_issue_exception) { - $this->emitIssue( - $issue_type, - $node->lineno, - (string)$union_type, - (string)$dim_type, - (string)$expected_key_type - ); - return $generic_types; - } - - throw new IssueException( - Issue::fromType($issue_type)( - $this->context->getFile(), - $node->lineno, - [(string)$union_type, (string)$dim_type, (string)$expected_key_type] - ) - ); - } - } - } - return $generic_types; - } - - // If the only type is null, we don't know what - // accessed items will be - if ($union_type->isType($null_type)) { - return UnionType::empty(); - } - - $element_types = UnionType::empty(); - - // You can access string characters via array index, - // so we'll add the string type to the result if we're - // indexing something that could be a string - if ($union_type->isNonNullStringType() - || ($union_type->canCastToUnionType($string_type->asUnionType()) && !$union_type->hasMixedType()) - ) { - if (Config::get_closest_target_php_version_id() < 70100 && $union_type->isNonNullStringType()) { - $this->analyzeNegativeStringOffsetCompatibility($node, $dim_type); - } - - if (!$dim_type->isEmpty() && !$dim_type->canCastToUnionType($int_union_type)) { - // TODO: Efficient implementation of asExpandedTypes()->hasArrayAccess()? - if (!$union_type->isEmpty() && !$union_type->asExpandedTypes($this->code_base)->hasArrayLike()) { - $this->emitIssue( - Issue::TypeMismatchDimFetch, - $node->lineno, - $union_type, - (string)$dim_type, - $int_union_type - ); - } - } - $element_types = $element_types->withType($string_type); - } - - if ($element_types->isEmpty()) { - // Hunt for any types that are viable class names and - // see if they inherit from ArrayAccess - try { - foreach ($union_type->asClassList($this->code_base, $this->context) as $class) { - $expanded_types = $class->getUnionType()->asExpandedTypes($this->code_base); - if ($expanded_types->hasType($array_access_type) || - $expanded_types->hasType($simple_xml_element_type)) { - return $element_types; - } - } - } catch (CodeBaseException $_) { - } catch (RecursionDepthException $_) { - } - - if (!$union_type->hasArrayLike()) { - $this->emitIssue( - Issue::TypeArraySuspicious, - $node->lineno, - (string)$union_type - ); - } - } - - return $element_types; - } - - private static function isSuspiciousNullable(UnionType $union_type) : bool - { - foreach ($union_type->getTypeSet() as $type) { - if ($type->getIsNullable() && ($type instanceof ArrayType || $type instanceof StringType)) { - return true; - } - } - return false; - } - - /** - * @return ?UnionType - */ - private function resolveArrayShapeElementTypes(Node $node, UnionType $union_type) - { - $dim_node = $node->children['dim']; - $dim_value = $dim_node instanceof Node ? (new ContextNode($this->code_base, $this->context, $dim_node))->getEquivalentPHPScalarValue() : $dim_node; - // TODO: detect and warn about null - if (!is_scalar($dim_value)) { - return null; - } - - $resulting_element_type = self::resolveArrayShapeElementTypesForOffset($union_type, $dim_value); - - if ($resulting_element_type === null) { - return null; - } - if ($resulting_element_type === false) { - $this->emitIssue( - Issue::TypeInvalidDimOffset, - $dim_node->lineno ?? $node->lineno, - StringUtil::jsonEncode($dim_value), - (string)$union_type - ); - // $union_type is exclusively array shape types, but those don't contain the field $dim_value. - // It's undefined (which becomes null) - return NullType::instance(false)->asUnionType(); - } - return $resulting_element_type; - } - - /** - * @param UnionType $union_type a union type with at least one top-level array shape type - * @param int|string|float|bool $dim_value a scalar dimension. TODO: Warn about null? - * @return ?UnionType|?false - * returns false if there the offset was invalid and there are no ways to get that offset - * returns null if the dim_value offset could not be found, but there were other generic array types - */ - public static function resolveArrayShapeElementTypesForOffset(UnionType $union_type, $dim_value) - { - /** - * @var bool $has_non_array_shape_type this will be true if there are types that support array access - * but have unknown array shapes in $union_type - */ - $has_non_array_shape_type = false; - $resulting_element_type = null; - foreach ($union_type->getTypeSet() as $type) { - if (!($type instanceof ArrayShapeType)) { - if ($type instanceof StringType) { - if (\is_int($dim_value)) { - // If we request a string offset from a string, that's not valid. Only accept integer dimensions as valid. - // in php, indices of strings can be negative - if ($resulting_element_type !== null) { - $resulting_element_type = $resulting_element_type->withType(StringType::instance(false)); - } else { - $resulting_element_type = StringType::instance(false)->asUnionType(); - } - $has_non_array_shape_type = true; - } else { - // TODO: Warn about string indices of strings? - } - } elseif ($type->isArrayLike() || $type->isObject() || $type instanceof MixedType) { - // TODO: Could be more precise about check for ArrayAccess - $has_non_array_shape_type = true; - continue; - } - continue; - } - $element_type = $type->getFieldTypes()[$dim_value] ?? null; - if ($element_type !== null) { - // $element_type may be non-null but $element_type->isEmpty() may be true. - // So, we use null to indicate failure below - if ($resulting_element_type !== null) { - $resulting_element_type = $resulting_element_type->withUnionType($element_type); - } else { - $resulting_element_type = $element_type; - } - } - } - if ($resulting_element_type === null) { - if (!$has_non_array_shape_type) { - // This is exclusively array shape types. - // Return false to indicate that the offset doesn't exist in any of those array shape types. - return false; - } - return null; - } - return $resulting_element_type; - } - - /** - * Visit a node with kind `\ast\AST_UNPACK` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - * - * @throws IssueException - * if the unpack is on an invalid expression - */ - public function visitUnpack(Node $node) : UnionType - { - $union_type = self::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'], - $this->should_catch_issue_exception - ); - - if ($union_type->isEmpty()) { - return $union_type; - } - - // Figure out what the types of accessed array - // elements would be - // TODO: Account for Traversable once there are generics for Traversable - $generic_types = - $union_type->genericArrayElementTypes(); - - // If we have generics, we're all set - if ($generic_types->isEmpty()) { - if (!$union_type->asExpandedTypes($this->code_base)->hasIterable() && !$union_type->hasType(MixedType::instance(false))) { - throw new IssueException( - Issue::fromType(Issue::TypeMismatchUnpackValue)( - $this->context->getFile(), - $node->lineno, - [(string)$union_type] - ) - ); - } - return $generic_types; - } - // TODO: Once we have generic template types for Traversable and subclasses, rewrite this check to account for `new ArrayObject([2])`, etc. - if (GenericArrayType::KEY_STRING === GenericArrayType::keyTypeFromUnionTypeKeys($union_type)) { - throw new IssueException( - Issue::fromType(Issue::TypeMismatchUnpackKey)( - $this->context->getFile(), - $node->lineno, - [(string)$union_type, 'string'] - ) - ); - } - return $generic_types; - } - - /** - * Visit a node with kind `\ast\AST_CLOSURE` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitClosure(Node $node) : UnionType - { - // The type of a closure is the fqsen pointing - // at its definition - $closure_fqsen = - FullyQualifiedFunctionName::fromClosureInContext( - $this->context, - $node - ); - - if ($this->code_base->hasFunctionWithFQSEN($closure_fqsen)) { - $func = $this->code_base->getFunctionByFQSEN($closure_fqsen); - } else { - $func = null; - } - - return ClosureType::instanceWithClosureFQSEN( - $closure_fqsen, - $func - )->asUnionType(); - } - - /** - * Visit a node with kind `\ast\AST_VAR` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - * - * @throws IssueException - * if variable is undefined and being fetched - */ - public function visitVar(Node $node) : UnionType - { - // $$var or ${...} (whose idea was that anyway?) - $name_node = $node->children['name']; - if (($name_node instanceof Node)) { - // This is nonsense. Give up. - $name_node_type = $this->__invoke($name_node); - static $int_or_string_type; - if ($int_or_string_type === null) { - $int_or_string_type = new UnionType([ - StringType::instance(false), - IntType::instance(false), - NullType::instance(false) - ]); - } - if (!$name_node_type->canCastToUnionType($int_or_string_type)) { - Issue::maybeEmit($this->code_base, $this->context, Issue::TypeSuspiciousIndirectVariable, $name_node->lineno, (string)$name_node_type); - return MixedType::instance(false)->asUnionType(); - } - $name_node = $name_node_type->asSingleScalarValueOrNull(); - if ($name_node === null) { - return MixedType::instance(false)->asUnionType(); - } - // fall through - } - - // foo(${42}) is technically valid PHP code, avoid TypeError - $variable_name = - (string)$name_node; - - if (!$this->context->getScope()->hasVariableWithName($variable_name)) { - if (Variable::isHardcodedVariableInScopeWithName($variable_name, $this->context->isInGlobalScope())) { - // @phan-suppress-next-line PhanTypeMismatchReturnNullable variable existence was checked - return Variable::getUnionTypeOfHardcodedGlobalVariableWithName($variable_name); - } - if (!Config::getValue('ignore_undeclared_variables_in_global_scope') - || !$this->context->isInGlobalScope() - ) { - throw new IssueException( - Issue::fromType(Issue::UndeclaredVariable)( - $this->context->getFile(), - $node->lineno, - [$variable_name], - IssueFixSuggester::suggestVariableTypoFix($this->code_base, $this->context, $variable_name) - ) - ); - } - } else { - $variable = $this->context->getScope()->getVariableByName( - $variable_name - ); - - return $variable->getUnionType(); - } - - return UnionType::empty(); - } - - /** - * Visit a node with kind `\ast\AST_ENCAPS_LIST` - * - * @param Node $node (@phan-unused-param) - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitEncapsList(Node $node) : UnionType - { - $result = ''; - foreach ($node->children as $part) { - $part_string = $part instanceof Node ? UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $part - )->asSingleScalarValueOrNullOrSelf() : $part; - if (\is_object($part_string)) { - return StringType::instance(false)->asUnionType(); - } - $result .= $part_string; - } - return LiteralStringType::instanceForValue($result, false)->asUnionType(); - } - - /** - * Visit a node with kind `\ast\AST_CONST` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitConst(Node $node) : UnionType - { - if ($node->children['name']->kind == \ast\AST_NAME) { - $name = $node->children['name']->children['name']; - - // Figure out the name of the constant if it's - // a string. - $constant_name = $name ?? ''; - - // If the constant is referring to the current - // class, return that as a type - if (Type::isSelfTypeString($constant_name) || Type::isStaticTypeString($constant_name)) { - return Type::fromStringInContext($constant_name, $this->context, Type::FROM_NODE)->asUnionType(); - } - - try { - $constant = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getConst(); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - return UnionType::empty(); - } - - return $constant->getUnionType(); - } - - return UnionType::empty(); - } - - /** - * Visit a node with kind `\ast\AST_CLASS_CONST` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - * - * @throws IssueException - * An exception is thrown if we can't find the constant - */ - public function visitClassConst(Node $node) : UnionType - { - try { - $constant = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getClassConst(); - - return $constant->getUnionType(); - } catch (NodeException $_) { - // ignore, this should warn elsewhere - } - - return UnionType::empty(); - } - - /** - * Visit a node with kind `\ast\AST_PROP` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitProp(Node $node) : UnionType - { - return $this->analyzeProp($node, false); - } - - /** - * Analyzes a node with kind `\ast\AST_PROP` or `\ast\AST_STATIC_PROP` - * - * @param Node $node - * The instance/static property access node. - * - * @param bool $is_static - * True if this is a static property fetch, - * false if this is an instance property fetch. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - private function analyzeProp(Node $node, bool $is_static) : UnionType - { - try { - $property = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getProperty($is_static); - - if ($property->isWriteOnly()) { - $this->emitIssue( - $property->isFromPHPDoc() ? Issue::AccessWriteOnlyMagicProperty : Issue::AccessWriteOnlyProperty, - $node->lineno, - $property->asPropertyFQSENString(), - $property->getContext()->getFile(), - $property->getContext()->getLineNumberStart() - ); - } - - $expr_node = $node->children['expr'] ?? null; - if ($expr_node instanceof Node && - $expr_node->kind === ast\AST_VAR && - $expr_node->children['name'] === 'this') { - $override_union_type = $this->context->getThisPropertyIfOverridden($property->getName()); - if ($override_union_type) { - // There was an earlier expression such as `$this->prop = 2;` - // fwrite(STDERR, "Saw override '$override_union_type' for $property\n"); - return $override_union_type; - } - } - - $union_type = $property->getUnionType()->withStaticResolvedInContext($property->getContext()); - // Map template types to concrete types - if ($union_type->hasTemplateTypeRecursive()) { - // Get the type of the object calling the property - $expression_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $expr_node - ); - - $union_type = $union_type->withTemplateParameterTypeMap( - $expression_type->getTemplateParameterTypeMap($this->code_base) - ); - - return $union_type; - } - - return $union_type; - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - } catch (CodeBaseException $exception) { - $exception_fqsen = $exception->getFQSEN(); - $suggestion = null; - $property_name = $node->children['prop']; - if ($exception_fqsen instanceof FullyQualifiedClassName && $this->code_base->hasClassWithFQSEN($exception_fqsen)) { - $suggestion_class = $this->code_base->getClassByFQSEN($exception_fqsen); - $suggestion = IssueFixSuggester::suggestSimilarProperty( - $this->code_base, - $this->context, - $suggestion_class, - $property_name, - false - ); - } - $this->emitIssueWithSuggestion( - Issue::UndeclaredProperty, - $node->lineno, - ["{$exception_fqsen}->{$property_name}"], - $suggestion - ); - } catch (UnanalyzableException $_) { - // Swallow it. There are some constructs that we - // just can't figure out. - } catch (NodeException $_) { - // Swallow it. There are some constructs that we - // just can't figure out. - } - - return UnionType::empty(); - } - - /** - * Visit a node with kind `\ast\AST_STATIC_PROP` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitStaticProp(Node $node) : UnionType - { - return $this->analyzeProp($node, true); - } - - - /** - * Visit a node with kind `\ast\AST_CALL` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - * - * @throws FQSENException if the fqsen for the called function is empty/invalid - */ - public function visitCall(Node $node) : UnionType - { - $expression = $node->children['expr']; - $function_list_generator = (new ContextNode( - $this->code_base, - $this->context, - $expression - ))->getFunctionFromNode(); - - $possible_types = UnionType::empty(); - foreach ($function_list_generator as $function) { - $function->analyzeReturnTypes($this->code_base); // For daemon/server mode, call this to consistently ensure accurate return types. - - if ($function->hasDependentReturnType()) { - $function_types = $function->getDependentReturnType($this->code_base, $this->context, $node->children['args']->children); - } else { - $function_types = $function->getUnionType(); - } - $possible_types = $possible_types->withUnionType($function_types); - } - - return $possible_types; - } - - /** - * Visit a node with kind `\ast\AST_STATIC_CALL` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitStaticCall(Node $node) : UnionType - { - return $this->visitMethodCall($node); - } - - /** - * Visit a node with kind `\ast\AST_METHOD_CALL` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitMethodCall(Node $node) : UnionType - { - $method_name = $node->children['method'] ?? ''; - - // Give up on any complicated nonsense where the - // method name is a variable such as in - // `$variable->$function_name()`. - // - // TODO: - if ($method_name instanceof Node) { - return UnionType::empty(); - } - - // Method names can some times turn up being - // other method calls. - if (!is_string($method_name)) { - $method_name = (string)$method_name; - } - - try { - $class_node = $node->children['class'] ?? $node->children['expr']; - if (!($class_node instanceof Node)) { - // E.g. `'string_literal'->method()` - // Other places will also emit NonClassMethodCall for the same node - $this->emitIssue( - Issue::NonClassMethodCall, - $node->lineno, - $method_name, - UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $class_node) - ); - return UnionType::empty(); - } - foreach ($this->classListFromNode($class_node) as $class) { - if (!$class->hasMethodWithName( - $this->code_base, - $method_name - )) { - continue; - } - - try { - $method = $class->getMethodByName( - $this->code_base, - $method_name - ); - $method->analyzeReturnTypes($this->code_base); // For daemon/server mode, call this to consistently ensure accurate return types. - - if ($method->hasTemplateType()) { - try { - $method = $method->resolveTemplateType( - $this->code_base, - UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $class_node) - ); - } catch (RecursionDepthException $_) { - } - } - - if ($method->hasDependentReturnType()) { - $union_type = $method->getDependentReturnType($this->code_base, $this->context, $node->children['args']->children); - } else { - $union_type = $method->getUnionType(); - } - - // Map template types to concrete types - // TODO: When the template types are part of the method doc comment, don't look it up in the class union type - if (isset($node->children['expr']) && $union_type->hasTemplateTypeRecursive()) { - // Get the type of the object calling the method - $expression_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'] - ); - - // Map template types to concrete types - $union_type = $union_type->withTemplateParameterTypeMap( - $expression_type->getTemplateParameterTypeMap($this->code_base) - ); - } - - // Remove any references to \static or \static[] - // once we're talking about the method's return - // type outside of its class - // TODO: Convert static[] to array or object[] - foreach ($union_type->getTypeSet() as $type) { - if ($type->hasStaticOrSelfTypesRecursive($this->code_base)) { - $union_type = $union_type->withoutType($type); - } - } - - return $union_type; - } catch (IssueException $_) { - return UnionType::empty(); - } - } - } catch (IssueException $_) { - // Swallow it - } catch (CodeBaseException $exception) { - $exception_fqsen = $exception->getFQSEN(); - $this->emitIssueWithSuggestion( - Issue::UndeclaredClassMethod, - $node->lineno, - [$method_name, (string)$exception->getFQSEN()], - ($exception_fqsen instanceof FullyQualifiedClassName - ? IssueFixSuggester::suggestSimilarClassForMethod($this->code_base, $this->context, $exception_fqsen, $method_name, $node->kind === \ast\AST_STATIC_CALL) - : null) - ); - } - - return UnionType::empty(); - } - - /** - * Visit a node with kind `\ast\AST_ASSIGN` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitAssign(Node $node) : UnionType - { - return self::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'] - ); - } - - /** - * Visit a node with kind `\ast\AST_UNARY_OP` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - */ - public function visitUnaryOp(Node $node) : UnionType - { - // Shortcut some easy operators - $flags = $node->flags; - if ($flags === \ast\flags\UNARY_BOOL_NOT) { - return BoolType::instance(false)->asUnionType(); - } - - $result = self::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'] - ); - if ($flags === \ast\flags\UNARY_MINUS) { - $this->warnAboutInvalidUnaryOp( - $node, - static function (Type $type) : bool { - return $type->isValidNumericOperand(); - }, - $result, - '-', - Issue::TypeInvalidUnaryOperandNumeric - ); - return $result->applyUnaryMinusOperator(); - } elseif ($flags === \ast\flags\UNARY_PLUS) { - $this->warnAboutInvalidUnaryOp( - $node, - static function (Type $type) : bool { - // NOTE: Don't be as strict because this is a way to cast to a number - return $type->isValidNumericOperand() || \get_class($type) === StringType::class; - }, - $result, - '+', - Issue::TypeInvalidUnaryOperandNumeric - ); - return $result->applyUnaryPlusOperator(); - } elseif ($flags === \ast\flags\UNARY_BITWISE_NOT) { - $this->warnAboutInvalidUnaryOp( - $node, - static function (Type $type) : bool { - // Adding $type instanceof StringType in case it becomes necessary later - return $type->isValidNumericOperand() || $type instanceof StringType; - }, - $result, - '~', - Issue::TypeInvalidUnaryOperandBitwiseNot - ); - return $result->applyUnaryBitwiseNotOperator(); - } - // UNARY_SILENCE - return $result; - } - - /** - * @param Node $node with type AST_BINARY_OP - * @param Closure(Type):bool $is_valid_type - * @return void - */ - private function warnAboutInvalidUnaryOp( - Node $node, - Closure $is_valid_type, - UnionType $type, - string $operator, - string $issue_type - ) { - if ($type->isEmpty()) { - return; - } - if (!$type->hasTypeMatchingCallback($is_valid_type)) { - $this->emitIssue( - $issue_type, - $node->children['left']->lineno ?? $node->lineno, - $operator, - $type - ); - } - } - - /** - * `print($str)` always returns 1. - * See https://secure.php.net/manual/en/function.print.php#refsect1-function.print-returnvalues - * @param Node $node @phan-unused-param - */ - public function visitPrint(Node $node) : UnionType - { - return IntType::instance(false)->asUnionType(); - } - - /* - * @param Node $node - * A node holding a class name - * - * @return UnionType - * The set of types that are possibly produced by the - * given node - * - * @throws IssueException - * An exception is thrown if we can't find a class for - * the given type - */ - private function visitClassNameNode(Node $node) : UnionType - { - $kind = $node->kind; - // Anonymous class of form `new class { ... }` - if ($kind === \ast\AST_CLASS - && ($node->flags & \ast\flags\CLASS_ANONYMOUS) - ) { - // Generate a stable name for the anonymous class - $anonymous_class_name = - (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getUnqualifiedNameForAnonymousClass(); - - // Turn that into a fully qualified name, and that into a union type - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - $fqsen = FullyQualifiedClassName::fromStringInContext( - $anonymous_class_name, - $this->context - ); - - // Turn that into a union type - return $fqsen->asUnionType(); - } - - // Things of the form `new $className()`, `new $obj()`, `new (foo())()`, etc. - if ($kind !== \ast\AST_NAME) { - return $this->classTypesForNonName($node); - } - - // Get the name of the class - $class_name = $node->children['name']; - - // If this is a straight-forward class name, recurse into the - // class node and get its type - $is_static_type_string = Type::isStaticTypeString($class_name); - if (!($is_static_type_string || Type::isSelfTypeString($class_name))) { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - return self::unionTypeFromClassNode( - $this->code_base, - $this->context, - $node - ); - } - - // This node references `self` or `static` - if (!$this->context->isInClassScope()) { - $this->emitIssue( - Issue::ContextNotObject, - $node->lineno, - $class_name - ); - - return UnionType::empty(); - } - - // Reference to a parent class - if ($class_name === 'parent') { - $class = $this->context->getClassInScope( - $this->code_base - ); - - $parent_type_option = $class->getParentTypeOption(); - if (!$parent_type_option->isDefined()) { - $this->emitIssue( - Issue::ParentlessClass, - $node->lineno, - (string)$class->getFQSEN() - ); - - return UnionType::empty(); - } - - return $parent_type_option->get()->asUnionType(); - } - - $result = $this->context->getClassFQSEN()->asUnionType(); - - if ($is_static_type_string) { - $result = $result->withType(StaticType::instance(false)); - } - return $result; - } - - private function classTypesForNonName(Node $node) : UnionType - { - $node_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node - ); - if ($node_type->isEmpty()) { - return UnionType::empty(); - } - $result = UnionType::empty(); - $is_valid = true; - foreach ($node_type->getTypeSet() as $sub_type) { - if ($sub_type instanceof LiteralStringType) { - $value = $sub_type->getValue(); - if (!\preg_match('/\\\\?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff\\\]*/', $value)) { - $is_valid = false; - continue; - } - try { - $fqsen = FullyQualifiedClassName::fromFullyQualifiedString($value); - } catch (FQSENException $e) { - $this->emitIssue( - $e instanceof EmptyFQSENException ? Issue::EmptyFQSENInClasslike : Issue::InvalidFQSENInClasslike, - $node->lineno, - $e->getFQSEN() - ); - continue; - } - if (!$this->code_base->hasClassWithFQSEN($fqsen)) { - $is_valid = false; - continue; - } - $result = $result->withType($fqsen->asType()); - } elseif (\get_class($sub_type) === Type::class || $sub_type instanceof ClosureType) { - $result = $result->withType($sub_type); - } elseif ($is_valid) { - if ($sub_type instanceof StringType) { - if ($sub_type instanceof ClassStringType) { - $result = $result->withUnionType($sub_type->getClassUnionType()); - } - continue; - } - if (!($sub_type instanceof MixedType)) { - $is_valid = false; - } - } - } - if ($result->isEmpty() && !$is_valid) { - // See https://github.com/phan/phan/issues/1926 - `new $obj()` is valid PHP and documented in the manual. - $this->emitIssue( - Issue::TypeExpectedObjectOrClassName, - $node->lineno, - $node_type - ); - } - return $result; - } - - /** - * @param CodeBase $code_base - * The code base within which we're operating - * - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - * - * @param Node|mixed $node - * The node which we'd like to determine the type of. - * - * @return UnionType - * The UnionType associated with the given node - * in the given Context within the given CodeBase - * - * @throws IssueException - * An exception is thrown if we can't find a class for - * the given type - * - * @throws FQSENException - * An exception is thrown if we can find a class name, - * but it is empty/invalid - */ - public static function unionTypeFromClassNode( - CodeBase $code_base, - Context $context, - $node - ) : UnionType { - - // If this is a list, build a union type by - // recursively visiting the child nodes - if ($node instanceof Node - && $node->kind == \ast\AST_NAME_LIST - ) { - $union_type = UnionType::empty(); - foreach ($node->children as $child_node) { - $union_type = $union_type->withUnionType( - self::unionTypeFromClassNode( - $code_base, - $context, - $child_node - ) - ); - } - return $union_type; - } - - // For simple nodes or very complicated nodes, - // recurse - if (!($node instanceof Node) - || $node->kind != \ast\AST_NAME - ) { - return self::unionTypeFromNode( - $code_base, - $context, - $node - ); - } - - $class_name = (string)$node->children['name']; - - if (\strcasecmp('parent', $class_name) === 0) { - if (!$context->isInClassScope()) { - throw new IssueException( - Issue::fromType(Issue::ContextNotObject)( - $context->getFile(), - $node->lineno ?? $context->getLineNumberStart(), - [$class_name] - ) - ); - } - - $class = $context->getClassInScope($code_base); - - if ($class->isTrait()) { - throw new IssueException( - Issue::fromType(Issue::TraitParentReference)( - $context->getFile(), - $node->lineno ?? $context->getLineNumberStart(), - [(string)$context->getClassFQSEN() ] - ) - ); - } - - if (!$class->hasParentType()) { - throw new IssueException( - Issue::fromType(Issue::ParentlessClass)( - $context->getFile(), - $node->lineno ?? $context->getLineNumberStart(), - [ (string)$context->getClassFQSEN() ] - ) - ); - } - - $parent_class_fqsen = $class->getParentClassFQSEN(); - - if (!$code_base->hasClassWithFQSEN($parent_class_fqsen)) { - throw new IssueException( - Issue::fromType(Issue::UndeclaredClass)( - $context->getFile(), - $node->lineno ?? $context->getLineNumberStart(), - [ (string)$parent_class_fqsen ], - IssueFixSuggester::suggestSimilarClass($code_base, $context, $parent_class_fqsen) - ) - ); - } else { - $parent_class = $code_base->getClassByFQSEN( - $parent_class_fqsen - ); - - return $parent_class->getUnionType(); - } - } - - // We're going to convert the class reference to a type - - // Check to see if the name is fully qualified - if ($node->flags & \ast\flags\NAME_NOT_FQ) { - self::checkValidClassFQSEN($class_name); - $type = Type::fromStringInContext( - $class_name, - $context, - Type::FROM_NODE - ); - } elseif ($node->flags & \ast\flags\NAME_RELATIVE) { - // Relative to current namespace - if (0 !== \strpos($class_name, '\\')) { - $class_name = '\\' . $class_name; - } - - $type = Type::fromFullyQualifiedString( - $context->getNamespace() . $class_name - ); - } else { - // Fully qualified - if (0 !== \strpos($class_name, '\\')) { - $class_name = '\\' . $class_name; - } - - self::checkValidClassFQSEN($class_name); - $type = Type::fromFullyQualifiedString( - $class_name - ); - } - - return $type->asUnionType(); - } - - /** - * @throws FQSENException if invalid - */ - private static function checkValidClassFQSEN(string $class_name) - { - // @phan-suppress-next-line PhanAccessClassConstantInternal - if (\preg_match(FullyQualifiedGlobalStructuralElement::VALID_STRUCTURAL_ELEMENT_REGEX, $class_name)) { - return; - } - if ($class_name === '\\') { - throw new EmptyFQSENException("empty fqsen", $class_name); - } else { - throw new InvalidFQSENException("invalid fqsen", $class_name); - } - } - - /** - * @return \Generator|Clazz[] - */ - public static function classListFromNodeAndContext(CodeBase $code_base, Context $context, Node $node) - { - return (new UnionTypeVisitor($code_base, $context, true))->classListFromNode($node); - } - - /** - * @phan-return \Generator<Clazz> - * @return \Generator|Clazz[] - * A list of classes associated with the given node - * - * @throws IssueException - * An exception is thrown if we can't find a class for - * the given type - */ - private function classListFromNode(Node $node) - { - // Get the types associated with the node - $union_type = self::unionTypeFromNode( - $this->code_base, - $this->context, - $node - )->withStaticResolvedInContext($this->context); - - // Iterate over each viable class type to see if any - // have the constant we're looking for - foreach ($union_type->nonNativeTypes()->getTypeSet() as $class_type) { - // Get the class FQSEN - $class_fqsen = FullyQualifiedClassName::fromType($class_type); - - // See if the class exists - if (!$this->code_base->hasClassWithFQSEN($class_fqsen)) { - throw new IssueException( - Issue::fromType(Issue::UndeclaredClassReference)( - $this->context->getFile(), - $node->lineno, - [ (string)$class_fqsen ] - ) - ); - } - - yield $this->code_base->getClassByFQSEN($class_fqsen); - } - } - - /** - * @param CodeBase $code_base - * @param Context $context - * @param int|string|float|Node $node the node to fetch CallableType instances for. - * @param bool $log_error whether or not to log errors while searching @phan-unused-param - * @return array<int,FunctionInterface> - * TODO: use log_error - */ - public static function functionLikeListFromNodeAndContext(CodeBase $code_base, Context $context, $node, bool $log_error) : array - { - try { - $function_fqsens = (new UnionTypeVisitor($code_base, $context, true))->functionLikeFQSENListFromNode($node); - } catch (FQSENException $e) { - Issue::maybeEmit( - $code_base, - $context, - $e instanceof EmptyFQSENException ? Issue::EmptyFQSENInCallable : Issue::InvalidFQSENInCallable, - $context->getLineNumberStart(), - $e->getFQSEN() - ); - return []; - } catch (\InvalidArgumentException $_) { - Issue::maybeEmit( - $code_base, - $context, - Issue::InvalidFQSENInCallable, - $context->getLineNumberStart(), - '(unknown)' - ); - return []; - } - $functions = []; - foreach ($function_fqsens as $fqsen) { - if ($fqsen instanceof FullyQualifiedMethodName) { - if (!$code_base->hasMethodWithFQSEN($fqsen)) { - // TODO: error PhanArrayMapClosure - continue; - } - $functions[] = $code_base->getMethodByFQSEN($fqsen); - } else { - if (!($fqsen instanceof FullyQualifiedFunctionName)) { - throw new TypeError('Expected fqsen to be a FullyQualifiedFunctionName or FullyQualifiedMethodName'); - } - if (!$code_base->hasFunctionWithFQSEN($fqsen)) { - // TODO: error PhanArrayMapClosure - continue; - } - $functions[] = $code_base->getFunctionByFQSEN($fqsen); - } - } - return $functions; - } - - /** - * Fetch known classes for a place where a class name was provided as a string or string expression. - * Warn if this is an invalid class name. - * @param \ast\Node|string|int|float $node - * @return array<int,Clazz> - */ - public static function classListFromClassNameNode(CodeBase $code_base, Context $context, $node) : array - { - $results = []; - $strings = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $node)->asStringScalarValues(); - foreach ($strings as $string) { - try { - $fqsen = FullyQualifiedClassName::fromFullyQualifiedString($string); - } catch (FQSENException $e) { - Issue::maybeEmit( - $code_base, - $context, - $e instanceof EmptyFQSENException ? Issue::EmptyFQSENInClasslike : Issue::InvalidFQSENInClasslike, - $context->getLineNumberStart(), - $e->getFQSEN() - ); - continue; - } catch (\InvalidArgumentException $_) { - Issue::maybeEmit( - $code_base, - $context, - Issue::InvalidFQSENInClasslike, - $context->getLineNumberStart(), - '(unknown)' - ); - continue; - } - if (!$code_base->hasClassWithFQSEN($fqsen)) { - // TODO: Different issue type? - Issue::maybeEmit( - $code_base, - $context, - Issue::UndeclaredClassReference, - $context->getLineNumberStart(), - (string)$fqsen - ); - continue; - } - $results[] = $code_base->getClassByFQSEN($fqsen); - } - return $results; - } - - /** - * @param CodeBase $code_base - * @param Context $context - * @param string|Node $node the node to fetch CallableType instances for. - * @return array<int,FullyQualifiedFunctionLikeName> - * @suppress PhanUnreferencedPublicMethod may be used in the future. - */ - public static function functionLikeFQSENListFromNodeAndContext(CodeBase $code_base, Context $context, $node) : array - { - return (new UnionTypeVisitor($code_base, $context, true))->functionLikeFQSENListFromNode($node); - } - - /** - * @param string|Node $class_or_expr - * @param string $method_name - * - * @return array<int,FullyQualifiedMethodName> - * A list of CallableTypes associated with the given node - */ - private function methodFQSENListFromObjectAndMethodName($class_or_expr, $method_name) : array - { - $code_base = $this->code_base; - $context = $this->context; - - $union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $class_or_expr); - if ($union_type->isEmpty()) { - return []; - } - $object_types = $union_type->objectTypes(); - if ($object_types->isEmpty()) { - if (!$union_type->canCastToUnionType(StringType::instance(false)->asUnionType())) { - $this->emitIssue( - Issue::TypeInvalidCallableObjectOfMethod, - $context->getLineNumberStart(), - (string)$union_type, - $method_name - ); - } - return []; - } - $result_types = []; - $class = null; - foreach ($object_types->getTypeSet() as $object_type) { - // TODO: support templates here. - if ($object_type instanceof ObjectType || $object_type instanceof TemplateType) { - continue; - } - $class_fqsen = FullyQualifiedClassName::fromType($object_type); - if ($object_type instanceof StaticOrSelfType) { - if (!$context->isInClassScope()) { - $this->emitIssue( - Issue::ContextNotObjectInCallable, - $context->getLineNumberStart(), - (string)$class_fqsen, - "$class_fqsen::$method_name" - ); - continue; - } - $class_fqsen = $context->getClassFQSEN(); - } - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - $this->emitIssue( - Issue::UndeclaredClassInCallable, - $context->getLineNumberStart(), - (string)$class_fqsen, - "$class_fqsen::$method_name" - ); - continue; - } - $class = $code_base->getClassByFQSEN($class_fqsen); - if (!$class->hasMethodWithName($code_base, $method_name)) { - // emit error below - continue; - } - $method_fqsen = FullyQualifiedMethodName::make( - $class_fqsen, - $method_name - ); - $result_types[] = $method_fqsen; - } - if (\count($result_types) === 0 && $class instanceof Clazz) { - // TODO: Include suggestion for method name - $this->emitIssue( - Issue::UndeclaredMethodInCallable, - $context->getLineNumberStart(), - $method_name, - (string)$union_type - ); - } - return $result_types; - } - - /** - * @param string $class_name (may also be 'self', 'parent', or 'static') - * @return ?FullyQualifiedClassName - * @throws FQSENException - */ - private function lookupClassOfCallableByName(string $class_name) - { - switch (\strtolower($class_name)) { - case 'self': - case 'static': - $context = $this->context; - if (!$context->isInClassScope()) { - $this->emitIssue( - Issue::ContextNotObject, - $context->getLineNumberStart(), - \strtolower($class_name) - ); - return null; - } - return $context->getClassFQSEN(); - case 'parent': - $context = $this->context; - if (!$context->isInClassScope()) { - $this->emitIssue( - Issue::ContextNotObject, - $context->getLineNumberStart(), - \strtolower($class_name) - ); - return null; - } - $class = $context->getClassInScope($this->code_base); - if ($class->isTrait()) { - $this->emitIssue( - Issue::TraitParentReference, - $context->getLineNumberStart(), - (string)$class->getFQSEN() - ); - return null; - } - if (!$class->hasParentType()) { - $this->emitIssue( - Issue::ParentlessClass, - $context->getLineNumberStart(), - (string)$class->getFQSEN() - ); - return null; - } - return $class->getParentClassFQSEN(); // may or may not exist. - default: - // TODO: Reject invalid/empty class names earlier - return FullyQualifiedClassName::fromFullyQualifiedString($class_name); - } - } - - /** - * @param string $class_name - * @param string $method_name - * @return void - */ - private function emitNonObjectContextInCallableIssue(string $class_name, string $method_name) - { - $this->emitIssue( - Issue::ContextNotObjectInCallable, - $this->context->getLineNumberStart(), - $class_name, - "$class_name::$method_name" - ); - } - - /** - * @param string|Node $class_or_expr - * @param string|Node $method_name - * - * @return array<int,FullyQualifiedMethodName> - * A list of CallableTypes associated with the given node - */ - private function methodFQSENListFromParts($class_or_expr, $method_name) : array - { - $code_base = $this->code_base; - $context = $this->context; - - if (!is_string($method_name)) { - if (!($method_name instanceof Node)) { - $method_name = UnionTypeVisitor::anyStringLiteralForNode($this->code_base, $this->context, $method_name); - } - $method_name = (new ContextNode($code_base, $context, $method_name))->getEquivalentPHPScalarValue(); - if (!is_string($method_name)) { - $method_name_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $method_name); - if (!$method_name_type->canCastToUnionType(StringType::instance(false)->asUnionType())) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeInvalidCallableMethodName, - $method_name->lineno ?? $this->context->getLineNumberStart(), - $method_name_type - ); - } - return []; - } - } - try { - if (is_string($class_or_expr)) { - if (\in_array(\strtolower($class_or_expr), ['static', 'self', 'parent'], true)) { - // Allow 'static' but not '\static' - if (!$context->isInClassScope()) { - $this->emitNonObjectContextInCallableIssue($class_or_expr, $method_name); - return []; - } - $class_fqsen = $context->getClassFQSEN(); - } else { - $class_fqsen = $this->lookupClassOfCallableByName($class_or_expr); - if (!$class_fqsen) { - return []; - } - } - } else { - $class_fqsen = (new ContextNode($code_base, $context, $class_or_expr))->resolveClassNameInContext(); - if (!$class_fqsen) { - return $this->methodFQSENListFromObjectAndMethodName($class_or_expr, $method_name); - } - if (\in_array(\strtolower($class_fqsen->getName()), ['static', 'self', 'parent'], true)) { - if (!$context->isInClassScope()) { - $this->emitNonObjectContextInCallableIssue((string)$class_fqsen, $method_name); - return []; - } - $class_fqsen = $context->getClassFQSEN(); - } - } - } catch (FQSENException $e) { - $this->emitIssue( - $e instanceof EmptyFQSENException ? Issue::EmptyFQSENInClasslike : Issue::InvalidFQSENInClasslike, - $context->getLineNumberStart(), - $e->getFQSEN() - ); - return []; - } - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - $this->emitIssue( - Issue::UndeclaredClassInCallable, - $context->getLineNumberStart(), - (string)$class_fqsen, - "$class_fqsen::$method_name" - ); - return []; - } - $class = $code_base->getClassByFQSEN($class_fqsen); - if (!$class->hasMethodWithName($code_base, $method_name)) { - $this->emitIssue( - Issue::UndeclaredStaticMethodInCallable, - $context->getLineNumberStart(), - "$class_fqsen::$method_name" - ); - return []; - } - $method = $class->getMethodByName($code_base, $method_name); - if (!$method->isStatic()) { - $this->emitIssue( - Issue::StaticCallToNonStatic, - $context->getLineNumberStart(), - (string)$method->getFQSEN(), - $method->getFileRef()->getFile(), - (string)$method->getFileRef()->getLineNumberStart() - ); - } - return [$method->getFQSEN()]; - } - - /** - * @see ContextNode::getFunction() for a similar function - * @return array<int,FullyQualifiedFunctionName> - */ - private function functionFQSENListFromFunctionName(string $function_name) : array - { - // TODO: Catch invalid code such as call_user_func('\\\\x\\\\y') - try { - $function_fqsen = FullyQualifiedFunctionName::fromFullyQualifiedString($function_name); - } catch (FQSENException $e) { - $this->emitIssue( - $e instanceof EmptyFQSENException ? Issue::EmptyFQSENInCallable : Issue::InvalidFQSENInCallable, - $this->context->getLineNumberStart(), - $function_name - ); - return []; - } - if (!$this->code_base->hasFunctionWithFQSEN($function_fqsen)) { - $this->emitIssue( - Issue::UndeclaredFunctionInCallable, - $this->context->getLineNumberStart(), - $function_name - ); - return []; - } - return [$function_fqsen]; - } - - /** - * @param string|Node $node - * - * @return array<int,FullyQualifiedFunctionLikeName> - * A list of CallableTypes associated with the given node - * - * @throws IssueException - * An exception is thrown if we can't find a class for - * the given type - */ - private function functionLikeFQSENListFromNode($node) : array - { - $orig_node = $node; - if ($node instanceof Node) { - $node = (new ContextNode($this->code_base, $this->context, $node))->getEquivalentPHPValue(); - } - if (is_string($node)) { - if (\stripos($node, '::') !== false) { - list($class_name, $method_name) = \explode('::', $node, 2); - return $this->methodFQSENListFromParts($class_name, $method_name); - } - return $this->functionFQSENListFromFunctionName($node); - } - if (\is_array($node)) { - if (\count($node) !== 2) { - $this->emitIssue( - Issue::TypeInvalidCallableArraySize, - $orig_node->lineno ?? $this->context->getLineNumberStart(), - \count($node) - ); - return []; - } - $i = 0; - foreach ($node as $key => $_) { - if ($key !== $i) { - $this->emitIssue( - Issue::TypeInvalidCallableArrayKey, - $orig_node->lineno ?? $this->context->getLineNumberStart(), - $i - ); - return []; - } - $i++; - } - return $this->methodFQSENListFromParts($node[0], $node[1]); - } - if (!($node instanceof Node)) { - // TODO: Warn? - return []; - } - - // Get the types associated with the node - $union_type = self::unionTypeFromNode( - $this->code_base, - $this->context, - $node - ); - - $closure_types = []; - foreach ($union_type->getTypeSet() as $type) { - if ($type instanceof ClosureType && $type->hasKnownFQSEN()) { - // TODO: Support class instances with __invoke() - $fqsen = $type->asFQSEN(); - if (!($fqsen instanceof FullyQualifiedFunctionLikeName)) { - throw new AssertionError('Expected fqsen of closure to be a FullyQualifiedFunctionLikeName'); - } - $closure_types[] = $fqsen; - } - } - return $closure_types; - } - - /** - * @param CodeBase $code_base - * @param Context $context - * @param Node|string|float|int $node - * - * @return ?UnionType (Returns null when mixed) - * TODO: Add an equivalent for Traversable and subclasses, once we have template support for Traversable<Key,T> - */ - public static function unionTypeOfArrayKeyForNode(CodeBase $code_base, Context $context, $node) - { - $arg_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $node); - return self::arrayKeyUnionTypeOfUnionType($arg_type); - } - - /** - * @return ?UnionType (Returns null when mixed) - * TODO: Add an equivalent for Traversable and subclasses, once we have template support for Traversable<Key,T> - * TODO: Move into UnionType? - */ - public static function arrayKeyUnionTypeOfUnionType(UnionType $union_type) - { - if ($union_type->isEmpty()) { - return null; - } - static $int_type; - static $string_type; - static $int_or_string_type; - if ($int_type === null) { - $int_type = IntType::instance(false); - $string_type = StringType::instance(false); - $int_or_string_type = new UnionType([$int_type, $string_type], true); - } - $key_enum_type = GenericArrayType::keyTypeFromUnionTypeKeys($union_type); - switch ($key_enum_type) { - case GenericArrayType::KEY_INT: - return $int_type->asUnionType(); - case GenericArrayType::KEY_STRING: - return $string_type->asUnionType(); - default: - foreach ($union_type->getTypeSet() as $type) { - // The exact class Type is potentially invalid (includes objects) but not the subclass NativeType. - // The subclass IterableType of Native type is invalid, but ArrayType is a valid subclass of IterableType. - // And we just ignore scalars. - // And mixed could be a Traversable. - // So, don't infer anything if the union type contains any instances of the four classes. - // TODO: Check the expanded union type instead of anything with a class of exactly Type, searching for Traversable? - if (\in_array(\get_class($type), [Type::class, IterableType::class, TemplateType::class, MixedType::class])) { - return null; - } - } - return $int_or_string_type; - } - } - - /** - * @param Node|array|string|bool|float|int|null $node - * @return ?string - One of the values for the LiteralStringType, or null - */ - public static function anyStringLiteralForNode( - CodeBase $code_base, - Context $context, - $node - ) { - if (!($node instanceof Node)) { - return is_string($node) ? $node : null; - } - $node_type = self::unionTypeFromNode( - $code_base, - $context, - $node - ); - foreach ($node_type->getTypeSet() as $type) { - if ($type instanceof LiteralStringType) { - // Arbitrarily return only the first value. - // TODO: Rewrite code using this to work with lists of possible values? - return $type->getValue(); - } - } - return null; - } - - /** - * @param Node $node - * @return void - */ - private function analyzeNegativeStringOffsetCompatibility(Node $node, UnionType $dim_type) - { - $dim_value = $dim_type->asSingleScalarValueOrNull(); - if (!\is_int($dim_value) || $dim_value >= 0) { - return; - } - $this->emitIssue( - Issue::CompatibleNegativeStringOffset, - $node->children['dim']->lineno ?? $node->lineno - ); - } -} diff --git a/vendor/phan/phan/src/Phan/AST/Visitor/Element.php b/vendor/phan/phan/src/Phan/AST/Visitor/Element.php deleted file mode 100644 index 472e775..0000000 --- a/vendor/phan/phan/src/Phan/AST/Visitor/Element.php +++ /dev/null @@ -1,381 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\Visitor; - -use AssertionError; -use ast; -use ast\flags; -use ast\Node; -use Phan\Debug; - -/** - * This contains functionality needed by various visitor implementations - * (visitors on Node->kind, Node->flags for a specific kind, etc) - * - * For performance, many callers manually inline the implementation of these methods - */ -class Element -{ - use \Phan\Profile; - - /** - * @var Node The node which this Visitor will have $this->visit*() called on. - */ - private $node; - - /** - * @param Node $node - * Any AST node. - */ - public function __construct(Node $node) - { - $this->node = $node; - } - - // TODO: Revert this change back to the switch statement - // when php 7.2 is released and Phan supports php 7.2. - // TODO: Also look into initializing mappings of ast\Node->kind to ReflectionMethod->getClosure for those methods, - // it may be more efficient. - // See https://github.com/php/php-src/pull/2427/files - // This decreased the duration of running phan by about 4% - const VISIT_LOOKUP_TABLE = [ - ast\AST_ARG_LIST => 'visitArgList', - ast\AST_ARRAY => 'visitArray', - ast\AST_ARRAY_ELEM => 'visitArrayElem', - ast\AST_ASSIGN => 'visitAssign', - ast\AST_ASSIGN_OP => 'visitAssignOp', - ast\AST_ASSIGN_REF => 'visitAssignRef', - ast\AST_BINARY_OP => 'visitBinaryOp', - ast\AST_BREAK => 'visitBreak', - ast\AST_CALL => 'visitCall', - ast\AST_CAST => 'visitCast', - ast\AST_CATCH => 'visitCatch', - ast\AST_CLASS => 'visitClass', - ast\AST_CLASS_CONST => 'visitClassConst', - ast\AST_CLASS_CONST_DECL => 'visitClassConstDecl', - ast\AST_CLOSURE => 'visitClosure', - ast\AST_CLOSURE_USES => 'visitClosureUses', - ast\AST_CLOSURE_VAR => 'visitClosureVar', - ast\AST_CONST => 'visitConst', - ast\AST_CONST_DECL => 'visitConstDecl', - ast\AST_CONST_ELEM => 'visitConstElem', - ast\AST_DECLARE => 'visitDeclare', - ast\AST_DIM => 'visitDim', - ast\AST_DO_WHILE => 'visitDoWhile', - ast\AST_ECHO => 'visitEcho', - ast\AST_EMPTY => 'visitEmpty', - ast\AST_ENCAPS_LIST => 'visitEncapsList', - ast\AST_EXIT => 'visitExit', - ast\AST_EXPR_LIST => 'visitExprList', - ast\AST_FOREACH => 'visitForeach', - ast\AST_FUNC_DECL => 'visitFuncDecl', - ast\AST_ISSET => 'visitIsset', - ast\AST_GLOBAL => 'visitGlobal', - ast\AST_GROUP_USE => 'visitGroupUse', - ast\AST_IF => 'visitIf', - ast\AST_IF_ELEM => 'visitIfElem', - ast\AST_INSTANCEOF => 'visitInstanceof', - ast\AST_MAGIC_CONST => 'visitMagicConst', - ast\AST_METHOD => 'visitMethod', - ast\AST_METHOD_CALL => 'visitMethodCall', - ast\AST_NAME => 'visitName', - ast\AST_NAMESPACE => 'visitNamespace', - ast\AST_NEW => 'visitNew', - ast\AST_PARAM => 'visitParam', - ast\AST_PARAM_LIST => 'visitParamList', - ast\AST_PRE_INC => 'visitPreInc', - ast\AST_PRINT => 'visitPrint', - ast\AST_PROP => 'visitProp', - ast\AST_PROP_DECL => 'visitPropDecl', - ast\AST_PROP_ELEM => 'visitPropElem', - ast\AST_RETURN => 'visitReturn', - ast\AST_STATIC => 'visitStatic', - ast\AST_STATIC_CALL => 'visitStaticCall', - ast\AST_STATIC_PROP => 'visitStaticProp', - ast\AST_STMT_LIST => 'visitStmtList', - ast\AST_SWITCH => 'visitSwitch', - ast\AST_SWITCH_CASE => 'visitSwitchCase', - ast\AST_SWITCH_LIST => 'visitSwitchList', - ast\AST_TYPE => 'visitType', - ast\AST_NULLABLE_TYPE => 'visitNullableType', - ast\AST_UNARY_OP => 'visitUnaryOp', - ast\AST_USE => 'visitUse', - ast\AST_USE_ELEM => 'visitUseElem', - ast\AST_USE_TRAIT => 'visitUseTrait', - ast\AST_VAR => 'visitVar', - ast\AST_WHILE => 'visitWhile', - ast\AST_CATCH_LIST => 'visitCatchList', - ast\AST_CLONE => 'visitClone', - ast\AST_CONDITIONAL => 'visitConditional', - ast\AST_CONTINUE => 'visitContinue', - ast\AST_FOR => 'visitFor', - ast\AST_GOTO => 'visitGoto', - ast\AST_HALT_COMPILER => 'visitHaltCompiler', - ast\AST_INCLUDE_OR_EVAL => 'visitIncludeOrEval', - ast\AST_LABEL => 'visitLabel', - ast\AST_METHOD_REFERENCE => 'visitMethodReference', - ast\AST_NAME_LIST => 'visitNameList', - ast\AST_POST_DEC => 'visitPostDec', - ast\AST_POST_INC => 'visitPostInc', - ast\AST_PRE_DEC => 'visitPreDec', - ast\AST_REF => 'visitRef', - ast\AST_SHELL_EXEC => 'visitShellExec', - ast\AST_THROW => 'visitThrow', - ast\AST_TRAIT_ADAPTATIONS => 'visitTraitAdaptations', - ast\AST_TRAIT_ALIAS => 'visitTraitAlias', - ast\AST_TRAIT_PRECEDENCE => 'visitTraitPrecedence', - ast\AST_TRY => 'visitTry', - ast\AST_UNPACK => 'visitUnpack', - ast\AST_UNSET => 'visitUnset', - ast\AST_YIELD => 'visitYield', - ast\AST_YIELD_FROM => 'visitYieldFrom', - ]; - - /** - * Accepts a visitor that differentiates on the kind value - * of the AST node. - * - * NOTE: This was turned into a static method for performance - * because it was called extremely frequently. - * - * @return mixed - The type depends on the subclass of KindVisitor being used. - * @suppress PhanUnreferencedPublicMethod Phan's code inlines this, but may be useful for some plugins - */ - public static function acceptNodeAndKindVisitor(Node $node, KindVisitor $visitor) - { - $fn_name = self::VISIT_LOOKUP_TABLE[$node->kind] ?? null; - if (\is_string($fn_name)) { - return $visitor->{$fn_name}($node); - } else { - Debug::printNode($node); - throw new AssertionError('All node kinds must match'); - } - } - - const VISIT_BINARY_LOOKUP_TABLE = [ - flags\BINARY_ADD => 'visitBinaryAdd', - flags\BINARY_BITWISE_AND => 'visitBinaryBitwiseAnd', - flags\BINARY_BITWISE_OR => 'visitBinaryBitwiseOr', - flags\BINARY_BITWISE_XOR => 'visitBinaryBitwiseXor', - flags\BINARY_BOOL_XOR => 'visitBinaryBoolXor', - flags\BINARY_CONCAT => 'visitBinaryConcat', - flags\BINARY_DIV => 'visitBinaryDiv', - flags\BINARY_IS_EQUAL => 'visitBinaryIsEqual', - flags\BINARY_IS_IDENTICAL => 'visitBinaryIsIdentical', - flags\BINARY_IS_NOT_EQUAL => 'visitBinaryIsNotEqual', - flags\BINARY_IS_NOT_IDENTICAL => 'visitBinaryIsNotIdentical', - flags\BINARY_IS_SMALLER => 'visitBinaryIsSmaller', - flags\BINARY_IS_SMALLER_OR_EQUAL => 'visitBinaryIsSmallerOrEqual', - flags\BINARY_MOD => 'visitBinaryMod', - flags\BINARY_MUL => 'visitBinaryMul', - flags\BINARY_POW => 'visitBinaryPow', - flags\BINARY_SHIFT_LEFT => 'visitBinaryShiftLeft', - flags\BINARY_SHIFT_RIGHT => 'visitBinaryShiftRight', - flags\BINARY_SPACESHIP => 'visitBinarySpaceship', - flags\BINARY_SUB => 'visitBinarySub', - flags\BINARY_BOOL_AND => 'visitBinaryBoolAnd', - flags\BINARY_BOOL_OR => 'visitBinaryBoolOr', - flags\BINARY_COALESCE => 'visitBinaryCoalesce', - flags\BINARY_IS_GREATER => 'visitBinaryIsGreater', - flags\BINARY_IS_GREATER_OR_EQUAL => 'visitBinaryIsGreaterOrEqual', - ]; - - /** - * Accepts a visitor that differentiates on the flag value - * of the AST node. - * @return mixed - The type depends on the subclass of FlagVisitor - */ - public static function acceptBinaryFlagVisitor(Node $node, FlagVisitor $visitor) - { - $fn_name = self::VISIT_BINARY_LOOKUP_TABLE[$node->flags] ?? null; - if (\is_string($fn_name)) { - return $visitor->{$fn_name}($node); - } else { - Debug::printNode($node); - throw new AssertionError("All flags must match. Found " . self::flagDescription($node)); - } - } - - /** - * Accepts a visitor that differentiates on the flag value - * of the AST node. - * - * @return mixed - The type depends on the subclass of FlagVisitor - * @suppress PhanUnreferencedPublicMethod - */ - public function acceptClassFlagVisitor(FlagVisitor $visitor) - { - switch ($this->node->flags) { - case flags\CLASS_ABSTRACT: - return $visitor->visitClassAbstract($this->node); - case flags\CLASS_FINAL: - return $visitor->visitClassFinal($this->node); - case flags\CLASS_INTERFACE: - return $visitor->visitClassInterface($this->node); - case flags\CLASS_TRAIT: - return $visitor->visitClassTrait($this->node); - case flags\CLASS_ANONYMOUS: - return $visitor->visitClassAnonymous($this->node); - default: - throw new AssertionError("All flags must match. Found " . self::flagDescription($this->node)); - } - } - - /** - * Accepts a visitor that differentiates on the flag value - * of the AST node. - * - * @return mixed - The type depends on the subclass of FlagVisitor - * @suppress PhanUnreferencedPublicMethod - */ - public function acceptNameFlagVisitor(FlagVisitor $visitor) - { - switch ($this->node->flags) { - case flags\NAME_FQ: - return $visitor->visitNameFq($this->node); - case flags\NAME_NOT_FQ: - return $visitor->visitNameNotFq($this->node); - case flags\NAME_RELATIVE: - return $visitor->visitNameRelative($this->node); - default: - throw new AssertionError("All flags must match. Found " . self::flagDescription($this->node)); - } - } - - /** - * Accepts a visitor that differentiates on the flag value - * of the AST node. - * - * @return mixed - The type depends on the subclass of FlagVisitor - * @suppress PhanUnreferencedPublicMethod - */ - public function acceptTypeFlagVisitor(FlagVisitor $visitor) - { - switch ($this->node->flags) { - case flags\TYPE_ARRAY: - return $visitor->visitUnionTypeArray($this->node); - case flags\TYPE_BOOL: - return $visitor->visitUnionTypeBool($this->node); - case flags\TYPE_CALLABLE: - return $visitor->visitUnionTypeCallable($this->node); - case flags\TYPE_DOUBLE: - return $visitor->visitUnionTypeDouble($this->node); - case flags\TYPE_LONG: - return $visitor->visitUnionTypeLong($this->node); - case flags\TYPE_NULL: - return $visitor->visitUnionTypeNull($this->node); - case flags\TYPE_OBJECT: - return $visitor->visitUnionTypeObject($this->node); - case flags\TYPE_STRING: - return $visitor->visitUnionTypeString($this->node); - default: - throw new AssertionError("All flags must match. Found " . self::flagDescription($this->node)); - } - } - - /** - * Accepts a visitor that differentiates on the flag value - * of the AST node. - * - * @return mixed - The type depends on the subclass of FlagVisitor - * @suppress PhanUnreferencedPublicMethod - */ - public function acceptUnaryFlagVisitor(FlagVisitor $visitor) - { - switch ($this->node->flags) { - case flags\UNARY_BITWISE_NOT: - return $visitor->visitUnaryBitwiseNot($this->node); - case flags\UNARY_BOOL_NOT: - return $visitor->visitUnaryBoolNot($this->node); - case flags\UNARY_SILENCE: - return $visitor->visitUnarySilence($this->node); - default: - throw new AssertionError("All flags must match. Found " . self::flagDescription($this->node)); - } - } - - /** - * Accepts a visitor that differentiates on the flag value - * of the AST node. - * - * @return mixed - The type depends on the subclass of FlagVisitor - * @suppress PhanUnreferencedPublicMethod - */ - public function acceptExecFlagVisitor(FlagVisitor $visitor) - { - switch ($this->node->flags) { - case flags\EXEC_EVAL: - return $visitor->visitExecEval($this->node); - case flags\EXEC_INCLUDE: - return $visitor->visitExecInclude($this->node); - case flags\EXEC_INCLUDE_ONCE: - return $visitor->visitExecIncludeOnce($this->node); - case flags\EXEC_REQUIRE: - return $visitor->visitExecRequire($this->node); - case flags\EXEC_REQUIRE_ONCE: - return $visitor->visitExecRequireOnce($this->node); - default: - throw new AssertionError("All flags must match. Found " . self::flagDescription($this->node)); - } - } - - /** - * Accepts a visitor that differentiates on the flag value - * of the AST node. - * - * @return mixed - The type depends on the subclass of FlagVisitor - * @suppress PhanUnreferencedPublicMethod - */ - public function acceptMagicFlagVisitor(FlagVisitor $visitor) - { - switch ($this->node->flags) { - case flags\MAGIC_CLASS: - return $visitor->visitMagicClass($this->node); - case flags\MAGIC_DIR: - return $visitor->visitMagicDir($this->node); - case flags\MAGIC_FILE: - return $visitor->visitMagicFile($this->node); - case flags\MAGIC_FUNCTION: - return $visitor->visitMagicFunction($this->node); - case flags\MAGIC_LINE: - return $visitor->visitMagicLine($this->node); - case flags\MAGIC_METHOD: - return $visitor->visitMagicMethod($this->node); - case flags\MAGIC_NAMESPACE: - return $visitor->visitMagicNamespace($this->node); - case flags\MAGIC_TRAIT: - return $visitor->visitMagicTrait($this->node); - default: - throw new AssertionError("All flags must match. Found " . self::flagDescription($this->node)); - } - } - - /** - * Accepts a visitor that differentiates on the flag value - * of the AST node. - * - * @return mixed - The type depends on the subclass of FlagVisitor - * @suppress PhanUnreferencedPublicMethod - */ - public function acceptUseFlagVisitor(FlagVisitor $visitor) - { - switch ($this->node->flags) { - case flags\USE_CONST: - return $visitor->visitUseConst($this->node); - case flags\USE_FUNCTION: - return $visitor->visitUseFunction($this->node); - case flags\USE_NORMAL: - return $visitor->visitUseNormal($this->node); - default: - throw new AssertionError("All flags must match. Found " . self::flagDescription($this->node)); - } - } - - /** - * Helper method to get a tag describing the flags for a given Node kind. - */ - public static function flagDescription(Node $node) : string - { - return Debug::astFlagDescription($node->flags ?? 0, $node->kind); - } -} diff --git a/vendor/phan/phan/src/Phan/AST/Visitor/FlagVisitor.php b/vendor/phan/phan/src/Phan/AST/Visitor/FlagVisitor.php deleted file mode 100644 index e031e45..0000000 --- a/vendor/phan/phan/src/Phan/AST/Visitor/FlagVisitor.php +++ /dev/null @@ -1,366 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\Visitor; - -use ast\Node; - -/** - * A visitor of AST nodes based on the node's flag value - * @phan-file-suppress PhanPluginUnknownMethodReturnType - TODO: Make this and FlagVisitorImplementation use Phan templates? - */ -interface FlagVisitor -{ - /** - * Visit a node with flag `\ast\flags\BINARY_ADD` - */ - public function visitBinaryAdd(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_BITWISE_AND` - */ - public function visitBinaryBitwiseAnd(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_BITWISE_OR` - */ - public function visitBinaryBitwiseOr(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_BITWISE_XOR` - */ - public function visitBinaryBitwiseXor(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_BOOL_XOR` - */ - public function visitBinaryBoolXor(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_CONCAT` - */ - public function visitBinaryConcat(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_DIV` - */ - public function visitBinaryDiv(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_IS_EQUAL` - */ - public function visitBinaryIsEqual(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_IS_IDENTICAL` - */ - public function visitBinaryIsIdentical(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_IS_NOT_EQUAL` - */ - public function visitBinaryIsNotEqual(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_IS_NOT_IDENTICAL` - */ - public function visitBinaryIsNotIdentical(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_IS_SMALLER` - */ - public function visitBinaryIsSmaller(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_IS_SMALLER_OR_EQUAL` - */ - public function visitBinaryIsSmallerOrEqual(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_MOD` - */ - public function visitBinaryMod(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_MUL` - */ - public function visitBinaryMul(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_POW` - */ - public function visitBinaryPow(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_SHIFT_LEFT` - */ - public function visitBinaryShiftLeft(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_SHIFT_RIGHT` - */ - public function visitBinaryShiftRight(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_SPACESHIP` - */ - public function visitBinarySpaceship(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_SUB` - */ - public function visitBinarySub(Node $node); - - /** - * Visit a node with flag `\ast\flags\CLASS_ABSTRACT` - */ - public function visitClassAbstract(Node $node); - - /** - * Visit a node with flag `\ast\flags\CLASS_FINAL` - */ - public function visitClassFinal(Node $node); - - /** - * Visit a node with flag `\ast\flags\CLASS_INTERFACE` - */ - public function visitClassInterface(Node $node); - - /** - * Visit a node with flag `\ast\flags\CLASS_TRAIT` - */ - public function visitClassTrait(Node $node); - - /** - * Visit a node with flag `\ast\flags\MODIFIER_ABSTRACT` - */ - public function visitModifierAbstract(Node $node); - - /** - * Visit a node with flag `\ast\flags\MODIFIER_FINAL` - */ - public function visitModifierFinal(Node $node); - - /** - * Visit a node with flag `\ast\flags\MODIFIER_PRIVATE` - */ - public function visitModifierPrivate(Node $node); - - /** - * Visit a node with flag `\ast\flags\MODIFIER_PROTECTED` - */ - public function visitModifierProtected(Node $node); - - /** - * Visit a node with flag `\ast\flags\MODIFIER_PUBLIC` - */ - public function visitModifierPublic(Node $node); - - /** - * Visit a node with flag `\ast\flags\MODIFIER_STATIC` - */ - public function visitModifierStatic(Node $node); - - /** - * Visit a node with flag `\ast\flags\NAME_FQ` - */ - public function visitNameFq(Node $node); - - /** - * Visit a node with flag `\ast\flags\NAME_NOT_FQ` - */ - public function visitNameNotFq(Node $node); - - /** - * Visit a node with flag `\ast\flags\NAME_RELATIVE` - */ - public function visitNameRelative(Node $node); - - /** - * Visit a node with flag `\ast\flags\PARAM_REF` - */ - public function visitParamRef(Node $node); - - /** - * Visit a node with flag `\ast\flags\PARAM_VARIADIC` - */ - public function visitParamVariadic(Node $node); - - /** - * Visit a node with flag `\ast\flags\FUNC_RETURNS_REF` - */ - public function visitReturnsRef(Node $node); - - /** - * Visit a node with flag `\ast\flags\TYPE_ARRAY` - */ - public function visitUnionTypeArray(Node $node); - - /** - * Visit a node with flag `\ast\flags\TYPE_BOOL` - */ - public function visitUnionTypeBool(Node $node); - - /** - * Visit a node with flag `\ast\flags\TYPE_CALLABLE` - */ - public function visitUnionTypeCallable(Node $node); - - /** - * Visit a node with flag `\ast\flags\TYPE_DOUBLE` - */ - public function visitUnionTypeDouble(Node $node); - - /** - * Visit a node with flag `\ast\flags\TYPE_LONG` - */ - public function visitUnionTypeLong(Node $node); - - /** - * Visit a node with flag `\ast\flags\TYPE_NULL` - */ - public function visitUnionTypeNull(Node $node); - - /** - * Visit a node with flag `\ast\flags\TYPE_OBJECT` - */ - public function visitUnionTypeObject(Node $node); - - /** - * Visit a node with flag `\ast\flags\TYPE_STRING` - */ - public function visitUnionTypeString(Node $node); - - /** - * Visit a node with flag `\ast\flags\UNARY_BITWISE_NOT` - */ - public function visitUnaryBitwiseNot(Node $node); - - /** - * Visit a node with flag `\ast\flags\UNARY_BOOL_NOT` - */ - public function visitUnaryBoolNot(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_BOOL_AND` - */ - public function visitBinaryBoolAnd(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_BOOL_OR` - */ - public function visitBinaryBoolOr(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_COALESCE` - */ - public function visitBinaryCoalesce(Node $node); - /** - * Visit a node with flag `\ast\flags\BINARY_IS_GREATER` - */ - public function visitBinaryIsGreater(Node $node); - - /** - * Visit a node with flag `\ast\flags\BINARY_IS_GREATER_OR_EQUAL` - */ - public function visitBinaryIsGreaterOrEqual(Node $node); - - /** - * Visit a node with flag `\ast\flags\CLASS_ANONYMOUS` - */ - public function visitClassAnonymous(Node $node); - - /** - * Visit a node with flag `\ast\flags\EXEC_EVAL` - */ - public function visitExecEval(Node $node); - - /** - * Visit a node with flag `\ast\flags\EXEC_INCLUDE` - */ - public function visitExecInclude(Node $node); - - /** - * Visit a node with flag `\ast\flags\EXEC_INCLUDE_ONCE` - */ - public function visitExecIncludeOnce(Node $node); - - /** - * Visit a node with flag `\ast\flags\EXEC_REQUIRE` - */ - public function visitExecRequire(Node $node); - - /** - * Visit a node with flag `\ast\flags\EXEC_REQUIRE_ONCE` - */ - public function visitExecRequireOnce(Node $node); - - /** - * Visit a node with flag `\ast\flags\MAGIC_CLASS` - */ - public function visitMagicClass(Node $node); - - /** - * Visit a node with flag `\ast\flags\MAGIC_DIR` - */ - public function visitMagicDir(Node $node); - - /** - * Visit a node with flag `\ast\flags\MAGIC_FILE` - */ - public function visitMagicFile(Node $node); - - /** - * Visit a node with flag `\ast\flags\MAGIC_FUNCTION` - */ - public function visitMagicFunction(Node $node); - - /** - * Visit a node with flag `\ast\flags\MAGIC_LINE` - */ - public function visitMagicLine(Node $node); - - /** - * Visit a node with flag `\ast\flags\MAGIC_METHOD` - */ - public function visitMagicMethod(Node $node); - - /** - * Visit a node with flag `\ast\flags\MAGIC_NAMESPACE` - */ - public function visitMagicNamespace(Node $node); - - /** - * Visit a node with flag `\ast\flags\MAGIC_TRAIT` - */ - public function visitMagicTrait(Node $node); - - /** - * Visit a node with flag `\ast\flags\UNARY_MINUS` - */ - public function visitUnaryMinus(Node $node); - - /** - * Visit a node with flag `\ast\flags\UNARY_PLUS` - */ - public function visitUnaryPlus(Node $node); - - /** - * Visit a node with flag `\ast\flags\UNARY_SILENCE` - */ - public function visitUnarySilence(Node $node); - - /** - * Visit a node with flag `\ast\flags\USE_CONST` - */ - public function visitUseConst(Node $node); - - /** - * Visit a node with flag `\ast\flags\USE_FUNCTION` - */ - public function visitUseFunction(Node $node); - - /** - * Visit a node with flag `\ast\flags\USE_NORMAL` - */ - public function visitUseNormal(Node $node); -} diff --git a/vendor/phan/phan/src/Phan/AST/Visitor/FlagVisitorImplementation.php b/vendor/phan/phan/src/Phan/AST/Visitor/FlagVisitorImplementation.php deleted file mode 100644 index 9e391e2..0000000 --- a/vendor/phan/phan/src/Phan/AST/Visitor/FlagVisitorImplementation.php +++ /dev/null @@ -1,384 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\Visitor; - -use ast\Node; - -/** - * A visitor of AST nodes based on the node's flag value - * which does nothing upon visiting a node - * @phan-file-suppress PhanPluginUnknownMethodReturnType - TODO: Make this and FlagVisitorImplementation use Phan templates? - */ -abstract class FlagVisitorImplementation implements FlagVisitor -{ - - /** - * This is called to analyze nodes in FlagVisitorImplementation subclasses - * that don't define more specific `visit*()` methods for the Node's kind. - */ - abstract public function visit(Node $node); - - public function visitBinaryAdd(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryBitwiseAnd(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryBitwiseOr(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryBitwiseXor(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryBoolXor(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryConcat(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryDiv(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryIsEqual(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryIsIdentical(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryIsNotEqual(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryIsNotIdentical(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryIsSmaller(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryIsSmallerOrEqual(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryMod(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryMul(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryPow(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryShiftLeft(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryShiftRight(Node $node) - { - return $this->visit($node); - } - - public function visitBinarySpaceship(Node $node) - { - return $this->visit($node); - } - - public function visitBinarySub(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryBoolAnd(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryBoolOr(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryCoalesce(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryIsGreater(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryIsGreaterOrEqual(Node $node) - { - return $this->visit($node); - } - - public function visitClassAbstract(Node $node) - { - return $this->visit($node); - } - - public function visitClassFinal(Node $node) - { - return $this->visit($node); - } - - public function visitClassInterface(Node $node) - { - return $this->visit($node); - } - - public function visitClassTrait(Node $node) - { - return $this->visit($node); - } - - public function visitModifierAbstract(Node $node) - { - return $this->visit($node); - } - - public function visitModifierFinal(Node $node) - { - return $this->visit($node); - } - - public function visitModifierPrivate(Node $node) - { - return $this->visit($node); - } - - public function visitModifierProtected(Node $node) - { - return $this->visit($node); - } - - public function visitModifierPublic(Node $node) - { - return $this->visit($node); - } - - public function visitModifierStatic(Node $node) - { - return $this->visit($node); - } - - public function visitNameFq(Node $node) - { - return $this->visit($node); - } - - public function visitNameNotFq(Node $node) - { - return $this->visit($node); - } - - public function visitNameRelative(Node $node) - { - return $this->visit($node); - } - - public function visitParamRef(Node $node) - { - return $this->visit($node); - } - - public function visitParamVariadic(Node $node) - { - return $this->visit($node); - } - - public function visitReturnsRef(Node $node) - { - return $this->visit($node); - } - - public function visitUnionTypeArray(Node $node) - { - return $this->visit($node); - } - - public function visitUnionTypeBool(Node $node) - { - return $this->visit($node); - } - - public function visitUnionTypeCallable(Node $node) - { - return $this->visit($node); - } - - public function visitUnionTypeDouble(Node $node) - { - return $this->visit($node); - } - - public function visitUnionTypeLong(Node $node) - { - return $this->visit($node); - } - - public function visitUnionTypeNull(Node $node) - { - return $this->visit($node); - } - - public function visitUnionTypeObject(Node $node) - { - return $this->visit($node); - } - - public function visitUnionTypeString(Node $node) - { - return $this->visit($node); - } - - public function visitUnaryBitwiseNot(Node $node) - { - return $this->visit($node); - } - - public function visitUnaryBoolNot(Node $node) - { - return $this->visit($node); - } - - public function visitClassAnonymous(Node $node) - { - return $this->visit($node); - } - - public function visitExecEval(Node $node) - { - return $this->visit($node); - } - - public function visitExecInclude(Node $node) - { - return $this->visit($node); - } - - public function visitExecIncludeOnce(Node $node) - { - return $this->visit($node); - } - - public function visitExecRequire(Node $node) - { - return $this->visit($node); - } - - public function visitExecRequireOnce(Node $node) - { - return $this->visit($node); - } - - public function visitMagicClass(Node $node) - { - return $this->visit($node); - } - - public function visitMagicDir(Node $node) - { - return $this->visit($node); - } - - public function visitMagicFile(Node $node) - { - return $this->visit($node); - } - - public function visitMagicFunction(Node $node) - { - return $this->visit($node); - } - - public function visitMagicLine(Node $node) - { - return $this->visit($node); - } - - public function visitMagicMethod(Node $node) - { - return $this->visit($node); - } - - public function visitMagicNamespace(Node $node) - { - return $this->visit($node); - } - - public function visitMagicTrait(Node $node) - { - return $this->visit($node); - } - - /** - * Visit a node with kind `ast\AST_UNARY_OP` and flags `ast\flags\UNARY_MINUS` - */ - public function visitUnaryMinus(Node $node) - { - return $this->visit($node); - } - - /** - * Visit a node with kind `ast\AST_UNARY_OP` and flags `ast\flags\UNARY_PLUS` - */ - public function visitUnaryPlus(Node $node) - { - return $this->visit($node); - } - - /** - * Visit a node with kind `ast\AST_UNARY_OP` and flags `ast\flags\UNARY_SILENCE` - */ - public function visitUnarySilence(Node $node) - { - return $this->visit($node); - } - - public function visitUseConst(Node $node) - { - return $this->visit($node); - } - - public function visitUseFunction(Node $node) - { - return $this->visit($node); - } - - public function visitUseNormal(Node $node) - { - return $this->visit($node); - } -} diff --git a/vendor/phan/phan/src/Phan/AST/Visitor/KindVisitor.php b/vendor/phan/phan/src/Phan/AST/Visitor/KindVisitor.php deleted file mode 100644 index f0f7270..0000000 --- a/vendor/phan/phan/src/Phan/AST/Visitor/KindVisitor.php +++ /dev/null @@ -1,463 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\Visitor; - -use ast\Node; - -/** - * A visitor of AST nodes based on the node's kind value - * @phan-file-suppress PhanPluginUnknownMethodReturnType - TODO: Make this and FlagVisitorImplementation use Phan templates? - */ -interface KindVisitor -{ - - /** - * Visit a node with kind `\ast\AST_ARRAY` - */ - public function visitArgList(Node $node); - - /** - * Visit a node with kind `\ast\AST_ARRAY` - */ - public function visitArray(Node $node); - - /** - * Visit a node with kind `ast\AST_ARRAY_ELEM` - */ - public function visitArrayElem(Node $node); - - /** - * Visit a node with kind `\ast\AST_ASSIGN` - */ - public function visitAssign(Node $node); - - /** - * Visit a node with kind `\ast\AST_ASSIGN_OP` - */ - public function visitAssignOp(Node $node); - - /** - * Visit a node with kind `\ast\AST_ASSIGN_REF` - */ - public function visitAssignRef(Node $node); - - /** - * Visit a node with kind `\ast\AST_BINARY_OP` - */ - public function visitBinaryOp(Node $node); - - /** - * Visit a node with kind `\ast\AST_BINARY_OP` - */ - public function visitBreak(Node $node); - - /** - * Visit a node with kind `\ast\AST_CALL` - */ - public function visitCall(Node $node); - - /** - * Visit a node with kind `\ast\AST_CAST` - */ - public function visitCast(Node $node); - - /** - * Visit a node with kind `\ast\AST_CATCH` - */ - public function visitCatch(Node $node); - - /** - * Visit a node with kind `\ast\AST_CLASS` - */ - public function visitClass(Node $node); - - /** - * Visit a node with kind `\ast\AST_CLASS_CONST` - */ - public function visitClassConst(Node $node); - - /** - * Visit a node with kind `\ast\AST_CLASS_CONST_DECL` - */ - public function visitClassConstDecl(Node $node); - - /** - * Visit a node with kind `\ast\AST_CLOSURE` - */ - public function visitClosure(Node $node); - - /** - * Visit a node with kind `\ast\AST_CLOSURE_USES` - */ - public function visitClosureUses(Node $node); - - /** - * Visit a node with kind `\ast\AST_CLOSURE_VAR` - */ - public function visitClosureVar(Node $node); - - /** - * Visit a node with kind `\ast\AST_CONST` - */ - public function visitConst(Node $node); - - /** - * Visit a node with kind `\ast\AST_CONST_DECL` - */ - public function visitConstDecl(Node $node); - - /** - * Visit a node with kind `\ast\AST_CONST_ELEM` - */ - public function visitConstElem(Node $node); - - /** - * Visit a node with kind `\ast\AST_DECLARE` - */ - public function visitDeclare(Node $node); - - /** - * Visit a node with kind `\ast\AST_DIM` - */ - public function visitDim(Node $node); - - /** - * Visit a node with kind `\ast\AST_DO_WHILE` - */ - public function visitDoWhile(Node $node); - - /** - * Visit a node with kind `\ast\AST_ECHO` - */ - public function visitEcho(Node $node); - /** - * - * Visit a node with kind `\ast\AST_EMPTY` - */ - public function visitEmpty(Node $node); - - /** - * Visit a node with kind `\ast\AST_ENCAPS_LIST` - */ - public function visitEncapsList(Node $node); - - /** - * Visit a node with kind `\ast\AST_EXIT` - */ - public function visitExit(Node $node); - - /** - * Visit a node with kind `\ast\AST_EXPR_LIST` - */ - public function visitExprList(Node $node); - - /** - * Visit a node with kind `\ast\AST_FOREACH` - */ - public function visitForeach(Node $node); - - /** - * Visit a node with kind `\ast\AST_FUNC_DECL` - */ - public function visitFuncDecl(Node $node); - - /** - * Visit a node with kind `\ast\AST_ISSET` - */ - public function visitIsset(Node $node); - - /** - * Visit a node with kind `\ast\AST_GLOBAL` - */ - public function visitGlobal(Node $node); - - /** - * Visit a node with kind `\ast\AST_GROUP_USE` - */ - public function visitGroupUse(Node $node); - - /** - * Visit a node with kind `\ast\AST_IF` - */ - public function visitIf(Node $node); - - /** - * Visit a node with kind `\ast\AST_IF_ELEM` - */ - public function visitIfElem(Node $node); - - /** - * Visit a node with kind `\ast\AST_INSTANCEOF` - */ - public function visitInstanceof(Node $node); - - /** - * Visit a node with kind `\ast\AST_MAGIC_CONST` - */ - public function visitMagicConst(Node $node); - - /** - * Visit a node with kind `\ast\AST_METHOD` - */ - public function visitMethod(Node $node); - - /** - * Visit a node with kind `\ast\AST_METHOD_CALL` - */ - public function visitMethodCall(Node $node); - - /** - * Visit a node with kind `\ast\AST_NAME` - */ - public function visitName(Node $node); - - /** - * Visit a node with kind `\ast\AST_NAMESPACE` - */ - public function visitNamespace(Node $node); - - /** - * Visit a node with kind `\ast\AST_NEW` - */ - public function visitNew(Node $node); - - /** - * Visit a node with kind `\ast\AST_PARAM` - */ - public function visitParam(Node $node); - - /** - * Visit a node with kind `\ast\AST_PARAM_LIST` - */ - public function visitParamList(Node $node); - - /** - * Visit a node with kind `\ast\AST_PRE_INC` - */ - public function visitPreInc(Node $node); - - /** - * Visit a node with kind `\ast\AST_PRINT` - */ - public function visitPrint(Node $node); - - /** - * Visit a node with kind `\ast\AST_PROP` - */ - public function visitProp(Node $node); - - /** - * Visit a node with kind `\ast\AST_PROP_DECL` - */ - public function visitPropDecl(Node $node); - - /** - * Visit a node with kind `\ast\AST_PROP_ELEM` - */ - public function visitPropElem(Node $node); - - /** - * Visit a node with kind `\ast\AST_RETURN` - */ - public function visitReturn(Node $node); - - /** - * Visit a node with kind `\ast\AST_STATIC` - */ - public function visitStatic(Node $node); - - /** - * Visit a node with kind `\ast\AST_STATIC_CALL` - */ - public function visitStaticCall(Node $node); - - /** - * Visit a node with kind `\ast\AST_STATIC_PROP` - */ - public function visitStaticProp(Node $node); - - /** - * Visit a node with kind `\ast\AST_STMT_LIST` - */ - public function visitStmtList(Node $node); - - /** - * Visit a node with kind `\ast\AST_SWITCH` - */ - public function visitSwitch(Node $node); - - /** - * Visit a node with kind `\ast\AST_SWITCH_CASE` - */ - public function visitSwitchCase(Node $node); - - /** - * Visit a node with kind `\ast\AST_SWITCH_LIST` - */ - public function visitSwitchList(Node $node); - - /** - * Visit a node with kind `\ast\AST_TYPE` - */ - public function visitType(Node $node); - - /** - * Visit a node with kind `\ast\AST_NULLABLE_TYPE` - */ - public function visitNullableType(Node $node); - - /** - * Visit a node with kind `\ast\AST_UNARY_OP` - */ - public function visitUnaryOp(Node $node); - - /** - * Visit a node with kind `\ast\AST_USE` - */ - public function visitUse(Node $node); - - /** - * Visit a node with kind `\ast\AST_USE_ELEM` - */ - public function visitUseElem(Node $node); - - /** - * Visit a node with kind `\ast\AST_USE_TRAIT` - */ - public function visitUseTrait(Node $node); - - /** - * Visit a node with kind `\ast\AST_VAR` - */ - public function visitVar(Node $node); - - /** - * Visit a node with kind `\ast\AST_WHILE` - */ - public function visitWhile(Node $node); - - /** - * Visit a node with kind `\ast\AST_CATCH_LIST` - */ - public function visitCatchList(Node $node); - - /** - * Visit a node with kind `\ast\AST_CLONE` - */ - public function visitClone(Node $node); - - /** - * Visit a node with kind `\ast\AST_CONDITIONAL` - */ - public function visitConditional(Node $node); - - /** - * Visit a node with kind `\ast\AST_CONTINUE` - */ - public function visitContinue(Node $node); - - /** - * Visit a node with kind `\ast\AST_FOR` - */ - public function visitFor(Node $node); - - /** - * Visit a node with kind `\ast\AST_GOTO` - */ - public function visitGoto(Node $node); - - /** - * Visit a node with kind `\ast\AST_HALT_COMPILER` - */ - public function visitHaltCompiler(Node $node); - - /** - * Visit a node with kind `\ast\AST_INCLUDE_OR_EVAL` - */ - public function visitIncludeOrEval(Node $node); - - /** - * Visit a node with kind `\ast\AST_LABEL` - */ - public function visitLabel(Node $node); - - /** - * Visit a node with kind `\ast\AST_METHOD_REFERENCE` - */ - public function visitMethodReference(Node $node); - - /** - * Visit a node with kind `\ast\AST_NAME_LIST` - */ - public function visitNameList(Node $node); - - /** - * Visit a node with kind `\ast\AST_POST_DEC` - */ - public function visitPostDec(Node $node); - - /** - * Visit a node with kind `\ast\AST_POST_INC` - */ - public function visitPostInc(Node $node); - - /** - * Visit a node with kind `\ast\AST_PRE_DEC` - */ - public function visitPreDec(Node $node); - - /** - * Visit a node with kind `\ast\AST_REF` - */ - public function visitRef(Node $node); - - /** - * Visit a node with kind `\ast\AST_SHELL_EXEC` - */ - public function visitShellExec(Node $node); - - /** - * Visit a node with kind `\ast\AST_THROW` - */ - public function visitThrow(Node $node); - - /** - * Visit a node with kind `\ast\AST_TRAIT_ADAPTATIONS` - */ - public function visitTraitAdaptations(Node $node); - - /** - * Visit a node with kind `\ast\AST_TRAIT_ALIAS` - */ - public function visitTraitAlias(Node $node); - - /** - * Visit a node with kind `\ast\AST_TRAIT_PRECEDENCE` - */ - public function visitTraitPrecedence(Node $node); - - /** - * Visit a node with kind `\ast\AST_TRY` - */ - public function visitTry(Node $node); - - /** - * Visit a node with kind `\ast\AST_UNPACK` - */ - public function visitUnpack(Node $node); - - /** - * Visit a node with kind `\ast\AST_UNSET` - */ - public function visitUnset(Node $node); - - /** - * Visit a node with kind `\ast\AST_YIELD` - */ - public function visitYield(Node $node); - - /** - * Visit a node with kind `\ast\AST_YIELD_FROM` - */ - public function visitYieldFrom(Node $node); -} diff --git a/vendor/phan/phan/src/Phan/AST/Visitor/KindVisitorImplementation.php b/vendor/phan/phan/src/Phan/AST/Visitor/KindVisitorImplementation.php deleted file mode 100644 index e17b20a..0000000 --- a/vendor/phan/phan/src/Phan/AST/Visitor/KindVisitorImplementation.php +++ /dev/null @@ -1,493 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\AST\Visitor; - -use AssertionError; -use ast\Node; -use Phan\Debug; -use const STDERR; - -/** - * A visitor of AST nodes based on the node's kind value - * which does nothing upon visiting a node of any kind - * @phan-file-suppress PhanPluginUnknownMethodReturnType - TODO: Make this and FlagVisitorImplementation use Phan templates? - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -abstract class KindVisitorImplementation implements KindVisitor -{ - - /** - * The fallback implementation for node kinds where the subclass visitor - * didn't override the more specific `visit*()` method. - */ - abstract public function visit(Node $node); - - /** - * @param Node $node - * A node to visit - */ - public function __invoke(Node $node) - { - $fn_name = Element::VISIT_LOOKUP_TABLE[$node->kind] ?? 'handleMissingNodeKind'; - return $this->{$fn_name}($node); - } - - /** - * @suppress PhanUnreferencedPublicMethod - */ - public function handleMissingNodeKind(Node $node) - { - \fprintf(STDERR, "Unexpected Node kind. Node:\n%s\n", Debug::nodeToString($node)); - throw new AssertionError('All node kinds must match'); - } - - public function visitArgList(Node $node) - { - return $this->visit($node); - } - - public function visitArray(Node $node) - { - return $this->visit($node); - } - - public function visitArrayElem(Node $node) - { - return $this->visit($node); - } - - public function visitAssign(Node $node) - { - return $this->visit($node); - } - - public function visitAssignOp(Node $node) - { - return $this->visit($node); - } - - public function visitAssignRef(Node $node) - { - return $this->visit($node); - } - - public function visitBinaryOp(Node $node) - { - return $this->visit($node); - } - - public function visitBreak(Node $node) - { - return $this->visit($node); - } - - public function visitCall(Node $node) - { - return $this->visit($node); - } - - public function visitCast(Node $node) - { - return $this->visit($node); - } - - public function visitCatch(Node $node) - { - return $this->visit($node); - } - - public function visitClass(Node $node) - { - return $this->visit($node); - } - - public function visitClassConst(Node $node) - { - return $this->visit($node); - } - - public function visitClassConstDecl(Node $node) - { - return $this->visit($node); - } - - public function visitClosure(Node $node) - { - return $this->visit($node); - } - - public function visitClosureUses(Node $node) - { - return $this->visit($node); - } - - public function visitClosureVar(Node $node) - { - return $this->visit($node); - } - - public function visitConst(Node $node) - { - return $this->visit($node); - } - - public function visitConstDecl(Node $node) - { - return $this->visit($node); - } - - public function visitConstElem(Node $node) - { - return $this->visit($node); - } - - public function visitDeclare(Node $node) - { - return $this->visit($node); - } - - public function visitDim(Node $node) - { - return $this->visit($node); - } - - public function visitDoWhile(Node $node) - { - return $this->visit($node); - } - - public function visitEcho(Node $node) - { - return $this->visit($node); - } - - public function visitEmpty(Node $node) - { - return $this->visit($node); - } - - public function visitEncapsList(Node $node) - { - return $this->visit($node); - } - - public function visitExit(Node $node) - { - return $this->visit($node); - } - - public function visitExprList(Node $node) - { - return $this->visit($node); - } - - public function visitForeach(Node $node) - { - return $this->visit($node); - } - - public function visitFuncDecl(Node $node) - { - return $this->visit($node); - } - - public function visitIsset(Node $node) - { - return $this->visit($node); - } - - public function visitGlobal(Node $node) - { - return $this->visit($node); - } - - public function visitGroupUse(Node $node) - { - return $this->visit($node); - } - - public function visitIf(Node $node) - { - return $this->visit($node); - } - - public function visitIfElem(Node $node) - { - return $this->visit($node); - } - - public function visitInstanceof(Node $node) - { - return $this->visit($node); - } - - public function visitMagicConst(Node $node) - { - return $this->visit($node); - } - - public function visitMethod(Node $node) - { - return $this->visit($node); - } - - public function visitMethodCall(Node $node) - { - return $this->visit($node); - } - - public function visitName(Node $node) - { - return $this->visit($node); - } - - public function visitNamespace(Node $node) - { - return $this->visit($node); - } - - public function visitNew(Node $node) - { - return $this->visit($node); - } - - public function visitParam(Node $node) - { - return $this->visit($node); - } - - public function visitParamList(Node $node) - { - return $this->visit($node); - } - - public function visitPreInc(Node $node) - { - return $this->visit($node); - } - - public function visitPrint(Node $node) - { - return $this->visit($node); - } - - public function visitProp(Node $node) - { - return $this->visit($node); - } - - public function visitPropDecl(Node $node) - { - return $this->visit($node); - } - - public function visitPropElem(Node $node) - { - return $this->visit($node); - } - - public function visitReturn(Node $node) - { - return $this->visit($node); - } - - public function visitStatic(Node $node) - { - return $this->visit($node); - } - - public function visitStaticCall(Node $node) - { - return $this->visit($node); - } - - public function visitStaticProp(Node $node) - { - return $this->visit($node); - } - - public function visitStmtList(Node $node) - { - return $this->visit($node); - } - - public function visitSwitch(Node $node) - { - return $this->visit($node); - } - - public function visitSwitchCase(Node $node) - { - return $this->visit($node); - } - - public function visitSwitchList(Node $node) - { - return $this->visit($node); - } - - public function visitType(Node $node) - { - return $this->visit($node); - } - - public function visitNullableType(Node $node) - { - return $this->visit($node); - } - - public function visitUnaryOp(Node $node) - { - return $this->visit($node); - } - - public function visitUse(Node $node) - { - return $this->visit($node); - } - - public function visitUseElem(Node $node) - { - return $this->visit($node); - } - - public function visitUseTrait(Node $node) - { - return $this->visit($node); - } - - public function visitVar(Node $node) - { - return $this->visit($node); - } - - public function visitWhile(Node $node) - { - return $this->visit($node); - } - - public function visitCatchList(Node $node) - { - return $this->visit($node); - } - - public function visitClone(Node $node) - { - return $this->visit($node); - } - - public function visitConditional(Node $node) - { - return $this->visit($node); - } - - public function visitContinue(Node $node) - { - return $this->visit($node); - } - - public function visitFor(Node $node) - { - return $this->visit($node); - } - - public function visitGoto(Node $node) - { - return $this->visit($node); - } - - public function visitHaltCompiler(Node $node) - { - return $this->visit($node); - } - - public function visitIncludeOrEval(Node $node) - { - return $this->visit($node); - } - - public function visitLabel(Node $node) - { - return $this->visit($node); - } - - public function visitMethodReference(Node $node) - { - return $this->visit($node); - } - - public function visitNameList(Node $node) - { - return $this->visit($node); - } - - public function visitPostDec(Node $node) - { - return $this->visit($node); - } - - public function visitPostInc(Node $node) - { - return $this->visit($node); - } - - public function visitPreDec(Node $node) - { - return $this->visit($node); - } - - public function visitRef(Node $node) - { - return $this->visit($node); - } - - public function visitShellExec(Node $node) - { - return $this->visit($node); - } - - public function visitThrow(Node $node) - { - return $this->visit($node); - } - - public function visitTraitAdaptations(Node $node) - { - return $this->visit($node); - } - - public function visitTraitAlias(Node $node) - { - return $this->visit($node); - } - - public function visitTraitPrecedence(Node $node) - { - return $this->visit($node); - } - - public function visitTry(Node $node) - { - return $this->visit($node); - } - - public function visitUnpack(Node $node) - { - return $this->visit($node); - } - - public function visitUnset(Node $node) - { - return $this->visit($node); - } - - public function visitYield(Node $node) - { - return $this->visit($node); - } - - public function visitYieldFrom(Node $node) - { - return $this->visit($node); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis.php b/vendor/phan/phan/src/Phan/Analysis.php deleted file mode 100644 index a6ecc08..0000000 --- a/vendor/phan/phan/src/Phan/Analysis.php +++ /dev/null @@ -1,586 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use ast; -use ast\Node; -use CompileError; -use InvalidArgumentException; -use ParseError; -use Phan\Analysis\DuplicateFunctionAnalyzer; -use Phan\Analysis\ParameterTypesAnalyzer; -use Phan\Analysis\ReferenceCountsAnalyzer; -use Phan\Analysis\ThrowsTypesAnalyzer; -use Phan\AST\ASTSimplifier; -use Phan\AST\Parser; -use Phan\AST\PhanAnnotationAdder; -use Phan\AST\TolerantASTConverter\ParseException; -use Phan\AST\Visitor\Element; -use Phan\Daemon\Request; -use Phan\Exception\FQSENException; -use Phan\Exception\RecursionDepthException; -use Phan\Language\Context; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Method; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Library\FileCache; -use Phan\Library\StringUtil; -use Phan\Parse\ParseVisitor; -use Phan\Plugin\ConfigPluginSet; -use Throwable; - -use function strlen; - -use const STDERR; - -/** - * This class is the entry point into the static analyzer. - */ -class Analysis -{ - /** - * This first pass parses code and looks for the subset - * of issues that can be found without having to have - * an understanding of the entire code base. - * - * @param CodeBase $code_base - * The CodeBase represents state across the entire - * code base. This is a mutable object which is - * populated as we parse files - * - * @param string $file_path - * The full path to a file we'd like to parse - * - * @param bool $suppress_parse_errors - * - * @param ?string $override_contents - * If this is not null, this function will act as if $file_path's contents - * were $override_contents - * - * @param bool $is_php_internal_stub - * If this is true, this function will act as though the parsed constants, functions, and classes are actually part of PHP or it's extension's internals. - * See autoload_internal_extension_signatures. - * - * @return Context - * - * @throws InvalidArgumentException for invalid stub files - */ - public static function parseFile(CodeBase $code_base, string $file_path, bool $suppress_parse_errors = false, string $override_contents = null, bool $is_php_internal_stub = false) : Context - { - $original_file_path = $file_path; - $code_base->setCurrentParsedFile($file_path); - if ($is_php_internal_stub) { - /** @see \Phan\Language\FileRef::isPHPInternal() */ - $file_path = 'internal'; - } - $context = (new Context())->withFile($file_path); - - // Convert the file to an Abstract Syntax Tree - // before passing it on to the recursive version - // of this method - - $real_file_path = Config::projectPath($original_file_path); - if (\is_string($override_contents)) { - // TODO: Make $override_contents a persistent entry in FileCache, make Request and language server manage this - $cache_entry = FileCache::addEntry($real_file_path, $override_contents); - } else { - $cache_entry = FileCache::getOrReadEntry($real_file_path); - } - $file_contents = $cache_entry->getContents(); - if ($file_contents === '') { - if ($is_php_internal_stub) { - throw new InvalidArgumentException("Unexpected empty php file for autoload_internal_extension_signatures: path=" . StringUtil::jsonEncode($original_file_path)); - } - // php-ast would return null for 0 byte files as an implementation detail. - // Make Phan consistently emit this warning. - Issue::maybeEmit( - $code_base, - $context, - Issue::EmptyFile, - 0, - $original_file_path - ); - - return $context; - } - try { - $node = Parser::parseCode($code_base, $context, null, $file_path, $file_contents, $suppress_parse_errors); - } catch (ParseError $_) { - return $context; - } catch (CompileError $_) { - return $context; - } catch (ParseException $_) { - return $context; - } - - if (Config::getValue('dump_ast')) { - echo $file_path . "\n" - . \str_repeat("\u{00AF}", strlen($file_path)) - . "\n"; - Debug::printNode($node); - return $context; - } - - if (!$node) { - // php-ast would return an empty node for 0 byte files in older releases. - Issue::maybeEmit( - $code_base, - $context, - Issue::EmptyFile, - 0, - $original_file_path - ); - - return $context; - } - - if (Config::getValue('simplify_ast')) { - try { - // Transform the original AST, and if successful, then analyze the new AST instead of the original - $node = ASTSimplifier::applyStatic($node); - } catch (\Exception $e) { - Issue::maybeEmit( - $code_base, - $context, - Issue::SyntaxError, // Not the right kind of error. I don't think it would throw, anyway. - $e->getLine(), - $e->getMessage() - ); - } - } - - $context = self::parseNodeInContext( - $code_base, - $context, - $node - ); - // @phan-suppress-next-line PhanAccessMethodInternal - $code_base->addParsedNamespaceMap($context->getFile(), $context->getNamespace(), $context->getNamespaceId(), $context->getNamespaceMap()); - return $context; - } - - /** - * Parse the given node in the given context populating - * the code base within the context as a side effect. The - * returned context is the new context from within the - * given node. - * - * NOTE: This is called extremely frequently, so the real signature types were omitted for performance. - * - * @param CodeBase $code_base - * The global code base in which we store all - * state - * - * @param Context $context - * The context in which this node exists - * - * @param Node $node - * A node to parse and scan for errors - * - * @return Context - * The context from within the node is returned - */ - public static function parseNodeInContext(CodeBase $code_base, Context $context, Node $node) - { - $kind = $node->kind; - $context->setLineNumberStart($node->lineno); - - // Visit the given node populating the code base - // with anything we learn and get a new context - // indicating the state of the world within the - // given node. - // NOTE: This is called extremely frequently - // (E.g. on a large number of the analyzed project's vendor dependencies, - // proportionally to the node count in the files), so code style was sacrificed for performance. - // Equivalent to (new ParseVisitor(...))($node), which uses ParseVisitor->__invoke - $inner_context = (new ParseVisitor( - $code_base, - $context - ))->{Element::VISIT_LOOKUP_TABLE[$kind] ?? 'handleMissingNodeKind'}($node); - - // ast\AST_GROUP_USE has ast\AST_USE as a child. - // We don't want to use block twice in the parse phase. - // (E.g. `use MyNS\{const A, const B}` would lack the MyNs part if this were to recurse. - // And ast\AST_DECLARE has AST_CONST_DECL as a child, so don't parse a constant declaration either. - if ($kind === ast\AST_GROUP_USE) { - return $inner_context; - } - if ($kind === ast\AST_DECLARE) { - // Check for class declarations, etc. within the statements of a declare directive. - $child_node = $node->children['stmts']; - if ($child_node !== null) { - // Step into each child node and get an - // updated context for the node - return self::parseNodeInContext($code_base, $inner_context, $child_node); - } - return $inner_context; - } - - // Recurse into each child node - $child_context = $inner_context; - foreach ($node->children as $child_node) { - // Skip any non Node children. - if (\is_object($child_node)) { - // Step into each child node and get an - // updated context for the node - $child_context = self::parseNodeInContext($code_base, $child_context, $child_node); - } - } - - // For closed context elements (that have an inner scope) - // return the outer context instead of their inner context - // after we finish parsing their children. - if (\in_array($kind, [ - ast\AST_CLASS, - ast\AST_METHOD, - ast\AST_FUNC_DECL, - ast\AST_CLOSURE, - ], true)) { - return $context; - } - if ($kind === ast\AST_STMT_LIST) { - // Workaround that ensures that the context from namespace blocks gets passed to the caller. - return $child_context; - } - - // Pass the context back up to our parent - return $inner_context; - } - - /** - * Take a pass over all functions verifying various states. - * - * @param ?array<string,mixed> $file_filter if non-null, limit analysis to functions and methods declared in this array - * @return void - */ - public static function analyzeFunctions(CodeBase $code_base, array $file_filter = null) - { - $plugin_set = ConfigPluginSet::instance(); - $has_function_or_method_plugins = $plugin_set->hasAnalyzeFunctionPlugins() || $plugin_set->hasAnalyzeMethodPlugins(); - $show_progress = CLI::shouldShowProgress(); - $analyze_function_or_method = static function (FunctionInterface $function_or_method) use ( - $code_base, - $plugin_set, - $has_function_or_method_plugins, - $file_filter - ) { - if ($function_or_method->isPHPInternal()) { - return; - } - // Phan always has to call this, to add default values to types of parameters. - $function_or_method->ensureScopeInitialized($code_base); - - // If there is an array limiting the set of files, skip this file if it's not in the list. - if (\is_array($file_filter) && !isset($file_filter[$function_or_method->getContext()->getFile()])) { - return; - } - - DuplicateFunctionAnalyzer::analyzeDuplicateFunction( - $code_base, - $function_or_method - ); - - // This is the most time consuming step. - // Can probably apply this to other functions, but this was the slowest. - ParameterTypesAnalyzer::analyzeParameterTypes( - $code_base, - $function_or_method - ); - - // Infer more accurate return types - // For daemon mode/the language server, we also call this whenever we use the return type of a function/method. - $function_or_method->analyzeReturnTypes($code_base); - - ThrowsTypesAnalyzer::analyzeThrowsTypes( - $code_base, - $function_or_method - ); - // Let any plugins analyze the methods or functions - // XXX: Add a way to run plugins on all functions/methods, this was limited for speed. - // Assumes that the given plugins will emit an issue in the same file as the function/method, - // which isn't necessarily the case. - // 0.06 - if ($has_function_or_method_plugins) { - if ($function_or_method instanceof Func) { - $plugin_set->analyzeFunction( - $code_base, - $function_or_method - ); - } elseif ($function_or_method instanceof Method) { - $plugin_set->analyzeMethod( - $code_base, - $function_or_method - ); - } - } - }; - - // Analyze user-defined method declarations. - // Plugins may also analyze user-defined methods here. - $i = 0; - if ($show_progress) { - CLI::progress('function', 0.0, null); - } - $function_map = $code_base->getFunctionMap(); - foreach ($function_map as $function) { // iterate, ignoring $fqsen - if ($show_progress) { - CLI::progress('function', (++$i) / (\count($function_map)), $function); - } - $analyze_function_or_method($function); - } - - // Analyze user-defined method declarations. - // Plugins may also analyze user-defined methods here. - $i = 0; - $method_set = $code_base->getMethodSet(); - if ($show_progress) { - CLI::progress('method', 0.0, null); - } - foreach ($method_set as $method) { - if ($show_progress) { - // I suspect that method analysis is hydrating some of the classes, - // adding even more inherited methods to the end of the set. - // This recalculation is needed so that the progress bar is accurate. - CLI::progress('method', (++$i) / (\count($method_set)), $method); - } - $analyze_function_or_method($method); - } - } - - /** - * Loads extra logic for analyzing function and method calls. - * - * @return void - */ - public static function loadMethodPlugins(CodeBase $code_base) - { - $plugin_set = ConfigPluginSet::instance(); - foreach ($plugin_set->getReturnTypeOverrides($code_base) as $fqsen_string => $closure) { - try { - if (\stripos($fqsen_string, '::') !== false) { - $fqsen = FullyQualifiedMethodName::fromFullyQualifiedString($fqsen_string); - $class_fqsen = $fqsen->getFullyQualifiedClassName(); - // We have to call hasClassWithFQSEN before calling hasMethodWithFQSEN in order to autoload the internal function signatures. - // TODO: Move class autoloading into hasMethodWithFQSEN()? - if ($code_base->hasClassWithFQSEN($class_fqsen)) { - // This is an override of a method. - if ($code_base->hasMethodWithFQSEN($fqsen)) { - $method = $code_base->getMethodByFQSEN($fqsen); - $method->setDependentReturnTypeClosure($closure); - } - } - } else { - // This is an override of a function. - $fqsen = FullyQualifiedFunctionName::fromFullyQualifiedString($fqsen_string); - if ($code_base->hasFunctionWithFQSEN($fqsen)) { - $function = $code_base->getFunctionByFQSEN($fqsen); - $function->setDependentReturnTypeClosure($closure); - } - } - } catch (FQSENException $e) { - \fprintf(STDERR, "getReturnTypeOverrides returned an invalid FQSEN %s: %s\n", $fqsen_string, $e->getMessage()); - } catch (InvalidArgumentException $e) { - \fprintf(STDERR, "getReturnTypeOverrides returned an invalid FQSEN %s: %s\n", $fqsen_string, $e->getMessage()); - } - } - - foreach ($plugin_set->getAnalyzeFunctionCallClosures($code_base) as $fqsen_string => $closure) { - try { - if (\stripos($fqsen_string, '::') !== false) { - // This is an override of a method. - list($class, $method_name) = \explode('::', $fqsen_string, 2); - $class_fqsen = FullyQualifiedClassName::fromFullyQualifiedString($class); - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - continue; - } - $class = $code_base->getClassByFQSEN($class_fqsen); - // Note: This is used because it will create methods such as __construct if they do not exist. - if ($class->hasMethodWithName($code_base, $method_name, false)) { - $method = $class->getMethodByName($code_base, $method_name); - $method->setFunctionCallAnalyzer($closure); - } - } else { - // This is an override of a function. - $fqsen = FullyQualifiedFunctionName::fromFullyQualifiedString($fqsen_string); - if ($code_base->hasFunctionWithFQSEN($fqsen)) { - $function = $code_base->getFunctionByFQSEN($fqsen); - $function->setFunctionCallAnalyzer($closure); - } - } - } catch (FQSENException $e) { - \fprintf(STDERR, "getAnalyzeFunctionCallClosures returned an invalid FQSEN %s\n", $e->getFQSEN()); - } - } - } - - /** - * Take a pass over all classes/traits/interfaces - * verifying various states. - * - * @param ?array<string,mixed> $path_filter if non-null, limit analysis to classes in this array - * @return void - */ - public static function analyzeClasses(CodeBase $code_base, array $path_filter = null) - { - $classes = $code_base->getUserDefinedClassMap(); - if (\is_array($path_filter)) { - // If a list of files is provided, then limit analysis to classes defined in those files. - $old_classes = $classes; - $classes = []; - foreach ($old_classes as $class) { - if (isset($path_filter[$class->getContext()->getFile()])) { - $classes[] = $class; - } - } - } - foreach ($classes as $class) { - try { - $class->analyze($code_base); - } catch (RecursionDepthException $_) { - continue; - } - } - } - - /** - * Take a look at all globally accessible elements and see if - * we can find any dead code that is never referenced - * - * @return void - */ - public static function analyzeDeadCode(CodeBase $code_base) - { - // Check to see if dead code detection is enabled. Keep - // in mind that the results here are just a guess and - // we can't tell with certainty that anything is - // definitely unreferenced. - if (!Config::getValue('dead_code_detection')) { - return; - } - - ReferenceCountsAnalyzer::analyzeReferenceCounts($code_base); - } - - /** - * Once we know what the universe looks like we - * can scan for more complicated issues. - * - * @param CodeBase $code_base - * The global code base holding all state - * - * @param ?Request $request - * A daemon mode request if in daemon mode. May affect the parser used for $file_path - * - * @param ?string $override_contents - * If this is not null, this function will act as if $file_path's contents - * were $override_contents - * - * @return Context - */ - public static function analyzeFile( - CodeBase $code_base, - string $file_path, - $request, - string $override_contents = null - ) : Context { - // Set the file on the context - $context = (new Context())->withFile($file_path); - // @phan-suppress-next-line PhanAccessMethodInternal - $context->importNamespaceMapFromParsePhase($code_base); - - $code_base->setCurrentAnalyzedFile($file_path); - - // Convert the file to an Abstract Syntax Tree - // before passing it on to the recursive version - // of this method - try { - $real_file_path = Config::projectPath($file_path); - if (\is_string($override_contents)) { - $cache_entry = FileCache::addEntry($real_file_path, $override_contents); - } else { - $cache_entry = FileCache::getOrReadEntry($real_file_path); - } - $file_contents = $cache_entry->getContents(); - if ($file_contents === '') { - // php-ast would return null for 0 byte files as an implementation detail. - // Make Phan consistently emit this warning. - Issue::maybeEmit( - $code_base, - $context, - Issue::EmptyFile, - 0, - $file_path - ); - - return $context; - } - $node = Parser::parseCode($code_base, $context, $request, $file_path, $file_contents, false); - } catch (ParseException $parse_error) { - Issue::maybeEmit( - $code_base, - $context, - Issue::SyntaxError, - $parse_error->getLineNumberStart(), // getLineNumberStart() is what differs from emitSyntaxError - $parse_error->getMessage() - ); - return $context; - } catch (ParseError $parse_error) { - self::emitSyntaxError($code_base, $context, $parse_error); - return $context; - } catch (CompileError $parse_error) { - self::emitSyntaxError($code_base, $context, $parse_error); - return $context; - } - - // Ensure we have some content - if (!$node) { - Issue::maybeEmit( - $code_base, - $context, - Issue::EmptyFile, - 0, - $file_path - ); - return $context; - } - - if (Config::getValue('simplify_ast')) { - try { - // Transform the original AST, and if successful, then analyze the new AST instead of the original - $node = ASTSimplifier::applyStatic($node); - } catch (\Exception $e) { - // Not the right kind of Issue to show to the user. I don't think it would throw, anyway. - self::emitSyntaxError($code_base, $context, $e); - } - } - PhanAnnotationAdder::applyFull($node); - - ConfigPluginSet::instance()->beforeAnalyzeFile($code_base, $context, $file_contents, $node); - - $context = (new BlockAnalysisVisitor($code_base, $context))($node); - $context->warnAboutUnusedUseElements($code_base); - - ConfigPluginSet::instance()->afterAnalyzeFile($code_base, $context, $file_contents, $node); - return $context; - } - - /** - * @return void - */ - private static function emitSyntaxError( - CodeBase $code_base, - Context $context, - Throwable $e - ) { - Issue::maybeEmit( - $code_base, - $context, - Issue::SyntaxError, - $e->getLine(), - $e->getMessage() - ); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/AbstractMethodAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/AbstractMethodAnalyzer.php deleted file mode 100644 index add7cac..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/AbstractMethodAnalyzer.php +++ /dev/null @@ -1,59 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use Phan\CodeBase; -use Phan\Issue; -use Phan\Language\Element\Clazz; - -/** - * This verifies that the inherited abstract methods are all implemented on non-abstract classes. - * NOTE: This step must be run after adding methods from this class and each of its ancestors. - */ -class AbstractMethodAnalyzer -{ - - /** - * Check to see if signatures match - * - * @return void - */ - public static function analyzeAbstractMethodsAreImplemented( - CodeBase $code_base, - Clazz $class - ) { - // Don't worry about internal classes - if ($class->isPHPInternal()) { - return; - } - // Don't worry about traits or abstract classes, those can have abstract methods - if ($class->isAbstract() || $class->isTrait() || $class->isInterface()) { - return; - } - foreach ($class->getMethodMap($code_base) as $method) { - if ($method->isAbstract()) { - if ($method->isPHPInternal()) { - Issue::maybeEmit( - $code_base, - $class->getContext(), - Issue::ClassContainsAbstractMethodInternal, - $class->getFileRef()->getLineNumberStart(), - (string)$class->getFQSEN(), - (string)$method->getDefiningFQSEN() - ); - } else { - Issue::maybeEmit( - $code_base, - $class->getContext(), - Issue::ClassContainsAbstractMethod, - $class->getFileRef()->getLineNumberStart(), - (string)$class->getFQSEN(), - (string)$method->getDefiningFQSEN(), - $method->getFileRef()->getFile(), - $method->getFileRef()->getLineNumberStart() - ); - } - } - } - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/Analyzable.php b/vendor/phan/phan/src/Phan/Analysis/Analyzable.php deleted file mode 100644 index fab2efb..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/Analyzable.php +++ /dev/null @@ -1,153 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use ast\Node; -use Phan\AST\PhanAnnotationAdder; -use Phan\BlockAnalysisVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Context; - -/** - * Objects implementing this trait store a handle to - * the AST node that defines them and allows us to - * reanalyze them later on - */ -trait Analyzable -{ - - /** - * @var Node - * The AST Node defining this object. We keep a - * reference to this so that we can come to it - * and - */ - private $node = null; - - /** - * @var int - * The depth of recursion on this analyzable - * object - */ - private static $recursion_depth = 0; - - /** - * Keep a reference to the Node which declared this analyzable object so that we can use it later. - * - * @param Node $node - * The AST Node defining this object. - * @return void - */ - public function setNode(Node $node) - { - // Don't waste the memory if we're in quick mode - if (Config::get_quick_mode()) { - return; - } - - $this->node = $node; - } - - /** - * @return bool - * True if we have a node defined on this object - */ - public function hasNode() : bool - { - return $this->node !== null; - } - - /** - * @return Node - * The AST node associated with this object - */ - public function getNode() - { - return $this->node; - } - - /** - * Ensure that annotations about what flags a function declaration has have been added - * - * @return void - * @suppress PhanUndeclaredProperty deliberately using dynamic properties - */ - public static function ensureDidAnnotate(Node $node) - { - if (!isset($node->did_annotate_node)) { - // Set this to true to indicate that this node has already - // been annotated with any extra information - // from the class. - // (Nodes for a FunctionInterface can be both from the parse phase and the analysis phase) - $node->did_annotate_node = true; - PhanAnnotationAdder::applyToScope($node); - } - } - - /** - * @return Context - * Analyze the node associated with this object - * in the given context - */ - public function analyze(Context $context, CodeBase $code_base) : Context - { - // Don't do anything if we care about being - // fast - if (Config::get_quick_mode()) { - return $context; - } - - $definition_node = $this->node; - if (!$definition_node) { - return $context; - } - self::ensureDidAnnotate($definition_node); - - // Closures depend on the context surrounding them such - // as for getting `use(...)` variables. Since we don't - // have them, we can't re-analyze them until we change - // that. - // - // TODO: Store the parent context on Analyzable objects - if ($definition_node->kind === \ast\AST_CLOSURE) { - // TODO: Pick up 'uses' when this is a closure invoked inline (e.g. array_map(function($x) use($localVar) {...}, args - // TODO: Investigate replacing the types of these with 'mixed' for quick mode re-analysis, or checking if the type will never vary. - if (isset($definition_node->children['uses'])) { - return $context; - } - } - // Stop upon reaching the maximum depth - if (self::$recursion_depth >= self::getMaxRecursionDepth()) { - return $context; - } - - self::$recursion_depth++; - - try { - // Analyze the node in a cloned context so that we - // don't overwrite anything - return (new BlockAnalysisVisitor($code_base, clone($context)))->__invoke( - $definition_node - ); - } finally { - self::$recursion_depth--; - } - } - - /** - * Gets the recursion depth. Starts at 0, increases the deeper the recursion goes - */ - public function getRecursionDepth() : int - { - return self::$recursion_depth; - } - - /** - * Gets the maximum recursion depth. - */ - public static function getMaxRecursionDepth() : int - { - return Config::getValue('maximum_recursion_depth'); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ArgumentType.php b/vendor/phan/phan/src/Phan/Analysis/ArgumentType.php deleted file mode 100644 index 53ae232..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ArgumentType.php +++ /dev/null @@ -1,884 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use AssertionError; -use ast\Node; -use Closure; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\CodeBaseException; -use Phan\Exception\IssueException; -use Phan\Exception\RecursionDepthException; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Method; -use Phan\Language\Element\Parameter; -use Phan\Language\Element\Variable; -use Phan\Language\Type; -use Phan\Language\Type\FalseType; -use Phan\Language\Type\NullType; -use Phan\Language\UnionType; -use Phan\PluginV2\StopParamAnalysisException; - -use function is_string; - -/** - * This visitor analyzes arguments of calls to methods, functions, and closures - * and emits issues for incorrect argument types. - * - * @phan-file-suppress PhanPartialTypeMismatchArgument - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -final class ArgumentType -{ - - /** - * @param FunctionInterface $method - * The function/method we're analyzing arguments for - * - * @param Node $node - * The node holding the method call we're looking at - * - * @param Context $context - * The context in which we see the call - * - * @param CodeBase $code_base - * The global code base - * - * @return void - */ - public static function analyze( - FunctionInterface $method, - Node $node, - Context $context, - CodeBase $code_base - ) { - self::checkIsDeprecatedOrInternal($code_base, $context, $method); - if ($method->hasFunctionCallAnalyzer()) { - try { - $method->analyzeFunctionCall($code_base, $context->withLineNumberStart($node->lineno ?? 0), $node->children['args']->children); - } catch (StopParamAnalysisException $_) { - return; - } - } - - // Emit an issue if this is an externally accessed internal method - $arglist = $node->children['args']; - $argcount = \count($arglist->children); - - // Make sure we have enough arguments - if ($argcount < $method->getNumberOfRequiredParameters() && !self::isUnpack($arglist->children)) { - $alternate_found = false; - foreach ($method->alternateGenerator($code_base) as $alternate_method) { - $alternate_found = $alternate_found || ( - $argcount >= - $alternate_method->getNumberOfRequiredParameters() - ); - } - - if (!$alternate_found) { - if ($method->isPHPInternal()) { - Issue::maybeEmit( - $code_base, - $context, - Issue::ParamTooFewInternal, - $node->lineno ?? 0, - $argcount, - $method->getRepresentationForIssue(), - $method->getNumberOfRequiredParameters() - ); - } else { - Issue::maybeEmit( - $code_base, - $context, - Issue::ParamTooFew, - $node->lineno ?? 0, - $argcount, - $method->getRepresentationForIssue(), - $method->getNumberOfRequiredParameters(), - $method->getFileRef()->getFile(), - $method->getFileRef()->getLineNumberStart() - ); - } - } - } - - // Make sure we don't have too many arguments - if ($argcount > $method->getNumberOfParameters() && !self::isVarargs($code_base, $method)) { - $alternate_found = false; - foreach ($method->alternateGenerator($code_base) as $alternate_method) { - if ($argcount <= $alternate_method->getNumberOfParameters()) { - $alternate_found = true; - break; - } - } - - if (!$alternate_found) { - self::emitParamTooMany($code_base, $context, $method, $node, $argcount); - } - } - - // Check the parameter types - self::analyzeParameterList( - $code_base, - $method, - $arglist, - $context - ); - } - - private static function emitParamTooMany( - CodeBase $code_base, - Context $context, - FunctionInterface $method, - Node $node, - int $argcount - ) { - $max = $method->getNumberOfParameters(); - $caused_by_variadic = $argcount === $max + 1 && (\end($node->children['args']->children)->kind ?? null) === \ast\AST_UNPACK; - if ($method->isPHPInternal()) { - Issue::maybeEmit( - $code_base, - $context, - $caused_by_variadic ? Issue::ParamTooManyUnpackInternal : Issue::ParamTooManyInternal, - $node->lineno ?? 0, - $caused_by_variadic ? $max : $argcount, - $method->getRepresentationForIssue(), - $max - ); - } else { - Issue::maybeEmit( - $code_base, - $context, - $caused_by_variadic ? Issue::ParamTooManyUnpack : Issue::ParamTooMany, - $node->lineno ?? 0, - $caused_by_variadic ? $max : $argcount, - $method->getRepresentationForIssue(), - $max, - $method->getFileRef()->getFile(), - $method->getFileRef()->getLineNumberStart() - ); - } - } - - /** - * @return void - */ - private static function checkIsDeprecatedOrInternal(CodeBase $code_base, Context $context, FunctionInterface $method) - { - // Special common cases where we want slightly - // better multi-signature error messages - if ($method->isPHPInternal()) { - // Emit an error if this internal method is marked as deprecated - if ($method->isDeprecated()) { - Issue::maybeEmit( - $code_base, - $context, - Issue::DeprecatedFunctionInternal, - $context->getLineNumberStart(), - $method->getRepresentationForIssue() - ); - } - } else { - // Emit an error if this user-defined method is marked as deprecated - if ($method->isDeprecated()) { - Issue::maybeEmit( - $code_base, - $context, - Issue::DeprecatedFunction, - $context->getLineNumberStart(), - $method->getRepresentationForIssue(), - $method->getFileRef()->getFile(), - $method->getFileRef()->getLineNumberStart() - ); - } - } - - // Emit an issue if this is an externally accessed internal method - if ($method->isNSInternal($code_base) - && !$method->isNSInternalAccessFromContext( - $code_base, - $context - ) - ) { - Issue::maybeEmit( - $code_base, - $context, - Issue::AccessMethodInternal, - $context->getLineNumberStart(), - $method->getRepresentationForIssue(), - $method->getElementNamespace() ?: '\\', - $method->getFileRef()->getFile(), - $method->getFileRef()->getLineNumberStart(), - ($context->getNamespace()) ?: '\\' - ); - } - } - - private static function isVarargs(CodeBase $code_base, FunctionInterface $method) : bool - { - foreach ($method->alternateGenerator($code_base) as $alternate_method) { - foreach ($alternate_method->getParameterList() as $parameter) { - if ($parameter->isVariadic()) { - return true; - } - } - } - return false; - } - - /** - * Figure out if any of the arguments are a call to unpack() - * @param array<mixed,Node|int|string|float> $children - */ - private static function isUnpack(array $children) : bool - { - foreach ($children as $child) { - if ($child instanceof Node) { - if ($child->kind === \ast\AST_UNPACK) { - return true; - } - } - } - return false; - } - - /** - * @param FunctionInterface $method - * The function/method we're analyzing arguments for - * - * @param array<int,Node|string|int|float> $arg_nodes $node - * The node holding the arguments of the call we're looking at - * - * @param Context $context - * The context in which we see the call - * - * @param CodeBase $code_base - * The global code base - * - * @param Closure $get_argument_type (Node|string|int $node, int $i) -> UnionType - * Fetches the types of individual arguments. - */ - public static function analyzeForCallback( - FunctionInterface $method, - array $arg_nodes, - Context $context, - CodeBase $code_base, - Closure $get_argument_type - ) { - // Special common cases where we want slightly - // better multi-signature error messages - self::checkIsDeprecatedOrInternal($code_base, $context, $method); - // TODO: analyzeInternalArgumentType - - $argcount = \count($arg_nodes); - - // Make sure we have enough arguments - if ($argcount < $method->getNumberOfRequiredParameters() && !self::isUnpack($arg_nodes)) { - $alternate_found = false; - foreach ($method->alternateGenerator($code_base) as $alternate_method) { - $alternate_found = $alternate_found || ( - $argcount >= - $alternate_method->getNumberOfRequiredParameters() - ); - } - - if (!$alternate_found) { - Issue::maybeEmit( - $code_base, - $context, - Issue::ParamTooFewCallable, - $context->getLineNumberStart(), - $argcount, - $method->getRepresentationForIssue(), - $method->getNumberOfRequiredParameters(), - $method->getFileRef()->getFile(), - $method->getFileRef()->getLineNumberStart() - ); - } - } - - // Make sure we don't have too many arguments - if ($argcount > $method->getNumberOfParameters() && !self::isVarargs($code_base, $method)) { - $alternate_found = false; - foreach ($method->alternateGenerator($code_base) as $alternate_method) { - if ($argcount <= $alternate_method->getNumberOfParameters()) { - $alternate_found = true; - break; - } - } - - if (!$alternate_found) { - $max = $method->getNumberOfParameters(); - Issue::maybeEmit( - $code_base, - $context, - Issue::ParamTooManyCallable, - $context->getLineNumberStart(), - $argcount, - $method->getRepresentationForIssue(), - $max, - $method->getFileRef()->getFile(), - $method->getFileRef()->getLineNumberStart() - ); - } - } - - // Check the parameter types - self::analyzeParameterListForCallback( - $code_base, - $method, - $arg_nodes, - $context, - $get_argument_type - ); - } - - /** - * @param CodeBase $code_base - * The global code base - * - * @param FunctionInterface $method - * The method we're analyzing arguments for - * - * @param array<int,Node|string|int|float> $arg_nodes $node - * The node holding the arguments of the call we're looking at - * - * @param Context $context - * The context in which we see the call - * - * @param Closure $get_argument_type (Node|string|int $node, int $i) -> UnionType - * - * @return void - */ - private static function analyzeParameterListForCallback( - CodeBase $code_base, - FunctionInterface $method, - array $arg_nodes, - Context $context, - Closure $get_argument_type - ) { - // There's nothing reasonable we can do here - if ($method instanceof Method) { - if ($method->getIsMagicCall() || $method->getIsMagicCallStatic()) { - return; - } - } - - foreach ($arg_nodes as $i => $argument) { - // Get the parameter associated with this argument - $parameter = $method->getParameterForCaller($i); - - // This issue should be caught elsewhere - if (!$parameter) { - continue; - } - - // TODO: Warnings about call-by-reference are different for array_map, etc. - - // Get the type of the argument. We'll check it against - // the parameter in a moment - $argument_type = $get_argument_type($argument, $i); - self::analyzeParameter($code_base, $context, $method, $argument_type, $argument->lineno ?? $context->getLineNumberStart(), $i); - if ($parameter->isPassByReference()) { - if ($argument instanceof Node) { - // @phan-suppress-next-line PhanUndeclaredProperty this is added for analyzers - $argument->is_reference = true; - } - } - } - } - - /** - * These node types are guaranteed to be usable as references - * @internal - */ - const REFERENCE_NODE_KINDS = [ - \ast\AST_VAR, - \ast\AST_DIM, - \ast\AST_PROP, - \ast\AST_STATIC_PROP, - ]; - - /** - * @param CodeBase $code_base - * The global code base - * - * @param FunctionInterface $method - * The method we're analyzing arguments for - * - * @param Node $node - * The node holding the arguments of the function/method call we're looking at - * - * @param Context $context - * The context in which we see the call - * - * @return void - */ - private static function analyzeParameterList( - CodeBase $code_base, - FunctionInterface $method, - Node $node, - Context $context - ) { - // There's nothing reasonable we can do here - if ($method instanceof Method) { - if ($method->getIsMagicCall() || $method->getIsMagicCallStatic()) { - return; - } - } - - foreach ($node->children as $i => $argument) { - if (!\is_int($i)) { - throw new AssertionError("Expected argument index to be an integer"); - } - - // Get the parameter associated with this argument - $parameter = $method->getParameterForCaller($i); - - // This issue should be caught elsewhere - if (!$parameter) { - continue; - } - - $argument_kind = $argument->kind ?? 0; - - // If this is a pass-by-reference parameter, make sure - // we're passing an allowable argument - if ($parameter->isPassByReference()) { - if ((!$argument instanceof Node) || !\in_array($argument_kind, self::REFERENCE_NODE_KINDS, true)) { - $is_possible_reference = self::isExpressionReturningReference($code_base, $context, $argument); - - if (!$is_possible_reference) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeNonVarPassByRef, - $argument->lineno ?? $node->lineno ?? 0, - ($i + 1), - $method->getRepresentationForIssue() - ); - } - } else { - $variable_name = (new ContextNode( - $code_base, - $context, - $argument - ))->getVariableName(); - - if (Type::isSelfTypeString($variable_name) - && !$context->isInClassScope() - && ($argument_kind === \ast\AST_STATIC_PROP || $argument_kind === \ast\AST_PROP) - ) { - Issue::maybeEmit( - $code_base, - $context, - Issue::ContextNotObject, - $argument->lineno ?? $node->lineno ?? 0, - "$variable_name" - ); - } - } - } - - // Get the type of the argument. We'll check it against - // the parameter in a moment - $argument_type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $argument, - true - ); - self::analyzeParameter($code_base, $context, $method, $argument_type, $argument->lineno ?? $node->lineno ?? 0, $i); - if ($parameter->isPassByReference()) { - if ($argument instanceof Node) { - // @phan-suppress-next-line PhanUndeclaredProperty this is added for analyzers - $argument->is_reference = true; - } - } - if ($argument_kind === \ast\AST_UNPACK) { - self::analyzeRemainingParametersForVariadic($code_base, $context, $method, $i + 1, $node, $argument, $argument_type); - } - } - } - - /** - * @return void - */ - private static function analyzeRemainingParametersForVariadic( - CodeBase $code_base, - Context $context, - FunctionInterface $method, - int $start_index, - Node $node, - Node $argument, - UnionType $argument_type - ) { - // Check the remaining required parameters for this variadic argument. - // To avoid false positives, don't check optional parameters for now. - - // TODO: Could do better (e.g. warn about too few/many params, warn about individual types) - // if the array shape type is known or available in phpdoc. - $param_count = $method->getNumberOfRequiredParameters(); - for ($i = $start_index; $i < $param_count; $i++) { - // Get the parameter associated with this argument - $parameter = $method->getParameterForCaller($i); - - // Shouldn't be possible? - if (!$parameter) { - return; - } - - $argument_kind = $argument->kind; - - // If this is a pass-by-reference parameter, make sure - // we're passing an allowable argument - if ($parameter->isPassByReference()) { - if (!\in_array($argument_kind, self::REFERENCE_NODE_KINDS, true)) { - $is_possible_reference = self::isExpressionReturningReference($code_base, $context, $argument); - - if (!$is_possible_reference) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeNonVarPassByRef, - $argument->lineno ?? $node->lineno ?? 0, - ($i + 1), - $method->getRepresentationForIssue() - ); - } - } - // Omit ContextNotObject check, this was checked for the first matching parameter - } - - self::analyzeParameter($code_base, $context, $method, $argument_type, $argument->lineno, $i); - if ($parameter->isPassByReference()) { - // @phan-suppress-next-line PhanUndeclaredProperty this is added for analyzers - $argument->is_reference = true; - } - } - } - - /** - * @param CodeBase $code_base - * @param Context $context - * @param FunctionInterface $method - * @param UnionType $argument_type - * @param int $lineno - * @return void - */ - public static function analyzeParameter(CodeBase $code_base, Context $context, FunctionInterface $method, UnionType $argument_type, int $lineno, int $i) - { - // Expand it to include all parent types up the chain - try { - $argument_type_expanded = - $argument_type->asExpandedTypes($code_base); - } catch (RecursionDepthException $_) { - return; - } - - // Check the method to see if it has the correct - // parameter types. If not, keep hunting through - // alternates of the method until we find one that - // takes the correct types - $alternate_parameter = null; - - foreach ($method->alternateGenerator($code_base) as $alternate_method) { - // Get the parameter associated with this argument - $candidate_alternate_parameter = $alternate_method->getParameterForCaller($i); - if (\is_null($candidate_alternate_parameter)) { - continue; - } - - $alternate_parameter = $candidate_alternate_parameter; - if (!($alternate_parameter instanceof Variable)) { - throw new AssertionError('Expected alternate_parameter to be Variable or subclass'); - } - - // See if the argument can be cast to the - // parameter - if ($argument_type_expanded->canCastToUnionType( - $alternate_parameter->getNonVariadicUnionType() - )) { - if (Config::get_strict_param_checking() && $argument_type->typeCount() > 1) { - self::analyzeParameterStrict($code_base, $context, $method, $argument_type, $alternate_parameter, $lineno, $i); - } - return; - } - } - - if (!($alternate_parameter instanceof Parameter)) { - return; // skip type check - is this possible? - } - - if ($alternate_parameter->isPassByReference() && $alternate_parameter->getReferenceType() === Parameter::REFERENCE_WRITE_ONLY) { - return; - } - - $parameter_type = $alternate_parameter->getNonVariadicUnionType(); - - if ($parameter_type->hasTemplateTypeRecursive()) { - // Don't worry about **unresolved** template types. - // We resolve them if possible in ContextNode->getMethod() - return; - } - if ($parameter_type->hasTemplateParameterTypes()) { - // TODO: Make the check for templates recursive - $argument_type_expanded_templates = $argument_type->asExpandedTypesPreservingTemplate($code_base); - if ($argument_type_expanded_templates->canCastToUnionTypeHandlingTemplates($parameter_type, $code_base)) { - // - can cast MyClass<\stdClass> to MyClass<mixed> - // - can cast Some<\stdClass> to Option<\stdClass> - // - cannot cast Some<\SomeOtherClass> to Option<\stdClass> - return; - } - // echo "Debug: $argument_type $argument_type_expanded_templates cannot cast to $parameter_type\n"; - } - - if ($method->isPHPInternal()) { - // If we are not in strict mode and we accept a string parameter - // and the argument we are passing has a __toString method then it is ok - if (!$context->getIsStrictTypes() && $parameter_type->hasNonNullStringType()) { - try { - foreach ($argument_type_expanded->asClassList($code_base, $context) as $clazz) { - if ($clazz->hasMethodWithName($code_base, "__toString")) { - return; - } - } - } catch (CodeBaseException $_) { - // Swallow "Cannot find class", go on to emit issue - } - } - } - // Check suppressions and emit the issue - self::warnInvalidArgumentType($code_base, $context, $method, $alternate_parameter, $argument_type_expanded, $lineno, $i); - } - - /** - * @return void - */ - private static function warnInvalidArgumentType( - CodeBase $code_base, - Context $context, - FunctionInterface $method, - Parameter $alternate_parameter, - UnionType $argument_type_expanded, - int $lineno, - int $i - ) { - $parameter_type = $alternate_parameter->getNonVariadicUnionType(); - /** - * @return ?string - */ - $choose_issue_type = static function (string $issue_type, string $nullable_issue_type) use ($argument_type_expanded, $parameter_type, $code_base, $context, $lineno) { - // @phan-suppress-next-line PhanAccessMethodInternal - if (!$argument_type_expanded->canCastToUnionTypeIfNonNull($parameter_type)) { - return $issue_type; - } - if (Issue::shouldSuppressIssue($code_base, $context, $issue_type, $lineno, [])) { - return null; - } - return $nullable_issue_type; - }; - - if ($method->isPHPInternal()) { - $issue_type = $choose_issue_type(Issue::TypeMismatchArgumentInternal, Issue::TypeMismatchArgumentNullableInternal); - if (!$issue_type) { - return; - } - Issue::maybeEmit( - $code_base, - $context, - // @phan-suppress-next-line PhanAccessMethodInternal - $issue_type, - $lineno, - ($i + 1), - $alternate_parameter->getName(), - $argument_type_expanded, - $method->getRepresentationForIssue(), - (string)$parameter_type - ); - return; - } - $issue_type = $choose_issue_type(Issue::TypeMismatchArgument, Issue::TypeMismatchArgumentNullable); - if (!$issue_type) { - return; - } - Issue::maybeEmit( - $code_base, - $context, - $issue_type, - $lineno, - ($i + 1), - $alternate_parameter->getName(), - $argument_type_expanded, - $method->getRepresentationForIssue(), - (string)$parameter_type, - $method->getFileRef()->getFile(), - $method->getFileRef()->getLineNumberStart() - ); - } - - private static function analyzeParameterStrict(CodeBase $code_base, Context $context, FunctionInterface $method, UnionType $argument_type, Variable $alternate_parameter, int $lineno, int $i) - { - if ($alternate_parameter instanceof Parameter && $alternate_parameter->isPassByReference() && $alternate_parameter->getReferenceType() === Parameter::REFERENCE_WRITE_ONLY) { - return; - } - $type_set = $argument_type->getTypeSet(); - if (\count($type_set) < 2) { - throw new AssertionError("Expected to have at least two parameter types when checking if parameter types match in strict mode"); - } - - $parameter_type = $alternate_parameter->getNonVariadicUnionType(); - - $mismatch_type_set = UnionType::empty(); - $mismatch_expanded_types = null; - - // For the strict - foreach ($type_set as $type) { - // Expand it to include all parent types up the chain - $individual_type_expanded = $type->asExpandedTypes($code_base); - - // See if the argument can be cast to the - // parameter - if (!$individual_type_expanded->canCastToUnionType( - $parameter_type - )) { - if ($method->isPHPInternal()) { - // If we are not in strict mode and we accept a string parameter - // and the argument we are passing has a __toString method then it is ok - if (!$context->getIsStrictTypes() && $parameter_type->hasNonNullStringType()) { - if ($individual_type_expanded->hasClassWithToStringMethod($code_base, $context)) { - continue; // don't warn about $type - } - } - } - $mismatch_type_set = $mismatch_type_set->withType($type); - if ($mismatch_expanded_types === null) { - // Warn about the first type - $mismatch_expanded_types = $individual_type_expanded; - } - } - } - - - if ($mismatch_expanded_types === null) { - // No mismatches - return; - } - - if ($method->isPHPInternal()) { - Issue::maybeEmit( - $code_base, - $context, - self::getStrictArgumentIssueType($mismatch_type_set, true), - $lineno, - ($i + 1), - $alternate_parameter->getName(), - $argument_type, - $method->getRepresentationForIssue(), - (string)$parameter_type, - $mismatch_expanded_types - ); - return; - } - Issue::maybeEmit( - $code_base, - $context, - self::getStrictArgumentIssueType($mismatch_type_set, false), - $lineno, - ($i + 1), - $alternate_parameter->getName(), - $argument_type, - $method->getRepresentationForIssue(), - (string)$parameter_type, - $mismatch_expanded_types, - $method->getFileRef()->getFile(), - $method->getFileRef()->getLineNumberStart() - ); - } - - private static function getStrictArgumentIssueType(UnionType $union_type, bool $is_internal) : string - { - if ($union_type->typeCount() === 1) { - $type = $union_type->getTypeSet()[0]; - if ($type instanceof NullType) { - return $is_internal ? Issue::PossiblyNullTypeArgumentInternal : Issue::PossiblyNullTypeArgument; - } - if ($type instanceof FalseType) { - return $is_internal ? Issue::PossiblyFalseTypeArgumentInternal : Issue::PossiblyFalseTypeArgument; - } - } - return $is_internal ? Issue::PartialTypeMismatchArgumentInternal : Issue::PartialTypeMismatchArgument; - } - - /** - * Used to check if a place expecting a reference is actually getting a reference from a node. - * Obvious types which are always references (properties, variables) must be checked for before calling this. - * - * @param Node|string|int|float $node - * - * @return bool - True if this node is a call to a function that may return a reference? - */ - private static function isExpressionReturningReference(CodeBase $code_base, Context $context, $node) : bool - { - if (!($node instanceof Node)) { - return false; - } - $node_kind = $node->kind; - if (\in_array($node_kind, self::REFERENCE_NODE_KINDS, true)) { - return true; - } - if ($node_kind === \ast\AST_UNPACK) { - return self::isExpressionReturningReference($code_base, $context, $node->children['expr']); - } - if ($node_kind === \ast\AST_CALL) { - foreach ((new ContextNode( - $code_base, - $context, - $node->children['expr'] - ))->getFunctionFromNode() as $function) { - if ($function->returnsRef()) { - return true; - } - } - } elseif ($node_kind === \ast\AST_STATIC_CALL || $node_kind === \ast\AST_METHOD_CALL) { - $method_name = $node->children['method'] ?? null; - if (is_string($method_name)) { - $class_node = $node->children['class'] ?? $node->children['expr']; - if (!($class_node instanceof Node)) { - return false; - } - try { - foreach (UnionTypeVisitor::classListFromNodeAndContext( - $code_base, - $context, - $class_node - ) as $class) { - if (!$class->hasMethodWithName( - $code_base, - $method_name - )) { - continue; - } - - $method = $class->getMethodByName( - $code_base, - $method_name - ); - // Return true if any of the possible methods (expect that just one is found) returns a reference. - if ($method->returnsRef()) { - return true; - } - } - } catch (IssueException $_) { - // Swallow any issue exceptions here. They'll be caught elsewhere. - } - } - } - return false; - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/AssignOperatorAnalysisVisitor.php b/vendor/phan/phan/src/Phan/Analysis/AssignOperatorAnalysisVisitor.php deleted file mode 100644 index 3c5fe8c..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/AssignOperatorAnalysisVisitor.php +++ /dev/null @@ -1,566 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use ast; -use ast\Node; -use Closure; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\AST\Visitor\Element; -use Phan\AST\Visitor\FlagVisitorImplementation; -use Phan\CodeBase; -use Phan\Exception\IssueException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Variable; -use Phan\Language\Type; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\FloatType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\ScalarType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; - -/** - * This visitor determines the returned union type of an assignment operation. - * - * TODO: Improve analysis of bitwise operations, warn if non-int is provided and consistently return int if it's guaranteed - */ -class AssignOperatorAnalysisVisitor extends FlagVisitorImplementation -{ - - /** - * @var CodeBase The code base within which we're operating - */ - private $code_base; - - /** - * @var Context The context in which we are analyzing an assignment operator - */ - private $context; - - /** - * Create a new AssignOperatorFlagVisitor - */ - public function __construct( - CodeBase $code_base, - Context $context - ) { - $this->code_base = $code_base; - $this->context = $context; - } - - /** - * @param Node $node - * A node to visit - * @return Context - */ - public function __invoke(Node $node) - { - // NOTE: Some operations currently don't exist in any php version, such as `$x ||= 2;`, `$x xor= 2;` - return Element::acceptBinaryFlagVisitor($node, $this); - } - - /** - * Default visitor for node kinds that do not have - * an overriding method - * - * @param Node $node - * A node to check types on - * - * @return Context - */ - public function visit(Node $node) - { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::Unanalyzable, - $node->lineno ?? 0 - ); - return $this->context; - } - - /** - * @param Node $node a node of kind AST_VAR - * @param Closure(UnionType):UnionType $get_type - * @return Context - */ - private function updateTargetVariableWithType(Node $node, Closure $get_type) - { - try { - $variable_name = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getVariableName(); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - return $this->context; - } - // Don't analyze variables when we can't determine their names. - if ($variable_name === '') { - return $this->context; - } - if ($this->context->getScope()->hasVariableWithName( - $variable_name - )) { - $variable = - $this->context->getScope()->getVariableByName( - $variable_name - ); - $variable->setUnionType($get_type($variable->getUnionType())); - } else { - if (Variable::isHardcodedVariableInScopeWithName($variable_name, $this->context->isInGlobalScope())) { - return $this->context; - } - // no such variable exists, warn about this - // TODO: Add Suggestions - Issue::maybeEmitWithParameters( - $this->code_base, - $this->context, - Issue::UndeclaredVariableAssignOp, - $node->lineno ?? 0, - [$variable_name], - IssueFixSuggester::suggestVariableTypoFix($this->code_base, $this->context, $variable_name) - ); - } - return $this->context; - } - - /** - * @param Node $node - * @param Closure(UnionType):UnionType $get_type - * @return Context - */ - private function updateTargetWithType(Node $node, Closure $get_type) : Context - { - $left = $node->children['var']; - // The left can be a non-Node for an invalid AST - $kind = $left->kind ?? null; - if ($kind === ast\AST_VAR) { - return $this->updateTargetVariableWithType($node, $get_type); - } - // TODO: Could check types of other expressions, such as properties - // TODO: Could check for `@property-read` (invalid to pass to assignment operator), etc. - return $this->context; - } - - /** - * @return Context - * - * @see BinaryOperatorFlagVisitor::visitBinaryAdd() for analysis of "+", which is similar to "+=" - */ - public function visitBinaryAdd(Node $node) - { - return $this->updateTargetWithType($node, function (UnionType $left) use ($node) : UnionType { - $code_base = $this->code_base; - $context = $this->context; - - $right = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node->children['expr'] - ); - - // fast-track common cases - if ($left->isNonNullIntType() && $right->isNonNullIntType()) { - return IntType::instance(false)->asUnionType(); - } - - // If both left and right are arrays, then this is array - // concatenation. - if ($left->isGenericArray() && $right->isGenericArray()) { - if ($left->isEqualTo($right)) { - return $left; - } - return ArrayType::combineArrayTypesOverriding($left, $right); - } - - $this->warnAboutInvalidUnionType( - $node, - static function (Type $type) : bool { - // TODO: Stricten this to warn about strings based on user config. - return $type instanceof ScalarType || $type instanceof ArrayType || $type instanceof MixedType; - }, - $left, - $right, - Issue::TypeInvalidLeftOperandOfAdd, - Issue::TypeInvalidRightOperandOfAdd - ); - - static $float_type = null; - static $array_type = null; - static $int_or_float_union_type = null; - if ($int_or_float_union_type === null) { - $float_type = FloatType::instance(false); - $array_type = ArrayType::instance(false); - $int_or_float_union_type = new UnionType([ - IntType::instance(false), - $float_type - ]); - } - - if ($left->isNonNullNumberType() && $right->isNonNullNumberType()) { - if (!$left->hasNonNullIntType() || !$right->hasNonNullIntType()) { - // Heuristic: If one or more of the sides is a float, the result is always a float. - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $float_type->asUnionType(); - } - return $int_or_float_union_type; - } - - $left_is_array = ( - !$left->genericArrayElementTypes()->isEmpty() - && $left->nonArrayTypes()->isEmpty() - ) || $left->isType($array_type); - // @phan-suppress-previous-line PhanTypeMismatchArgumentNullable false positive from static init - - $right_is_array = ( - !$right->genericArrayElementTypes()->isEmpty() - && $right->nonArrayTypes()->isEmpty() - ) || $right->isType($array_type); - // @phan-suppress-previous-line PhanTypeMismatchArgumentNullable false positive from static init - - if ($left_is_array || $right_is_array) { - if ($left_is_array && $right_is_array) { - // TODO: Make the right types for array offsets completely override the left types? - return ArrayType::combineArrayTypesOverriding($left, $right); - } - - if ($left_is_array - && !$right->canCastToUnionType( - ArrayType::instance(false)->asUnionType() - ) - ) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeInvalidRightOperand, - $node->lineno ?? 0 - ); - return UnionType::empty(); - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - } elseif ($right_is_array && !$left->canCastToUnionType($array_type->asUnionType())) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeInvalidLeftOperand, - $node->lineno ?? 0 - ); - return UnionType::empty(); - } - // If it is a '+' and we know one side is an array - // and the other is unknown, assume array - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $array_type->asUnionType(); - } - - return $int_or_float_union_type; - }); - } - - /** - * @return Context - */ - public function visitBinaryCoalesce(Node $node) - { - $var_node = $node->children['var']; - $new_node = new ast\Node(ast\AST_BINARY_OP, $node->lineno, [ - 'left' => $var_node, - 'right' => $node->children['expr'], - ], ast\flags\BINARY_COALESCE); - - $new_type = (new BinaryOperatorFlagVisitor( - $this->code_base, - $this->context, - true - ))->visitBinaryCoalesce($new_node); - return (new AssignmentVisitor( - $this->code_base, - $this->context, - $var_node, - $new_type - ))->__invoke($var_node); - } - - private function analyzeNumericArithmeticOp(Node $node, bool $combination_is_int) : Context - { - return $this->updateTargetWithType($node, function (UnionType $left) use ($node, $combination_is_int) : UnionType { - $code_base = $this->code_base; - $context = $this->context; - - $right = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node->children['expr'] - ); - - static $float_type = null; - static $int_or_float_union_type = null; - if ($int_or_float_union_type === null) { - $float_type = FloatType::instance(false); - $int_or_float_union_type = new UnionType([ - IntType::instance(false), - $float_type - ]); - } - - // fast-track common cases - if ($left->isNonNullIntType() && $right->isNonNullIntType()) { - if ($combination_is_int) { - return IntType::instance(false)->asUnionType(); - } else { - return $int_or_float_union_type; - } - } - - $this->warnAboutInvalidUnionType( - $node, - static function (Type $type) : bool { - // TODO: Stricten this to warn about strings based on user config. - return $type instanceof ScalarType || $type instanceof MixedType; - }, - $left, - $right, - Issue::TypeInvalidLeftOperandOfNumericOp, - Issue::TypeInvalidRightOperandOfNumericOp - ); - - if ($left->isNonNullNumberType() && $right->isNonNullNumberType()) { - if (!$left->hasNonNullIntType() || !$right->hasNonNullIntType()) { - // Heuristic: If one or more of the sides is a float, the result is always a float. - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $float_type->asUnionType(); - } - return $int_or_float_union_type; - } - - // TODO: warn about subtracting to/from non-number - - return $int_or_float_union_type; - }); - } - - /** - * @param Node $node with type AST_BINARY_OP - * @param Closure(Type):bool $is_valid_type - * @return void - * - * TODO: Deduplicate and move to a trait? - */ - private function warnAboutInvalidUnionType( - Node $node, - Closure $is_valid_type, - UnionType $left, - UnionType $right, - string $left_issue_type, - string $right_issue_type - ) { - if (!$left->isEmpty()) { - if (!$left->hasTypeMatchingCallback($is_valid_type)) { - Issue::maybeEmit( - $this->code_base, - $this->context, - $left_issue_type, - $node->children['var']->lineno ?? $node->lineno, - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags] . '=', - $left - ); - } - } - if (!$right->isEmpty()) { - if (!$right->hasTypeMatchingCallback($is_valid_type)) { - Issue::maybeEmit( - $this->code_base, - $this->context, - $right_issue_type, - $node->children['expr']->lineno ?? $node->lineno, - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags] . '=', - $right - ); - } - } - } - - private function analyzeBitwiseOperation(Node $node) : Context - { - return $this->updateTargetWithType($node, function (UnionType $left_type) use ($node) : UnionType { - // TODO: Warn about invalid left and right-hand sides here and in BinaryOperatorFlagVisitor. - // Expect int|string - - $right_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $node->children['expr']); - if ($right_type->hasStringType() || $left_type->hasStringType()) { - if ($right_type->isNonNullStringType() && $left_type->isNonNullStringType()) { - return StringType::instance(false)->asUnionType(); - } - return UnionType::fromFullyQualifiedString('int|string'); - } - return IntType::instance(false)->asUnionType(); - }); - } - - /** - * @return Context - */ - public function visitBinaryBitwiseAnd(Node $node) - { - return $this->analyzeBitwiseOperation($node); - } - - /** - * @return Context - */ - public function visitBinaryBitwiseOr(Node $node) - { - return $this->analyzeBitwiseOperation($node); - } - - /** - * @return Context - */ - public function visitBinaryBitwiseXor(Node $node) - { - return $this->analyzeBitwiseOperation($node); - } - - /** - * @return Context - */ - public function visitBinaryConcat(Node $node) - { - return $this->updateTargetWithType($node, static function (UnionType $unused_left) : UnionType { - // TODO: Check if both sides can cast to string and warn if they can't. - return StringType::instance(false)->asUnionType(); - }); - } - - /** - * @return Context - */ - public function visitBinaryDiv(Node $node) - { - return $this->analyzeNumericArithmeticOp($node, false); - } - - /** - * @return Context - */ - public function visitBinaryMod(Node $node) - { - $this->warnForInvalidOperandsOfNumericOp($node); - return $this->updateTargetWithType($node, static function (UnionType $unused_left) : UnionType { - // TODO: Check if both sides can cast to string and warn if they can't. - return IntType::instance(false)->asUnionType(); - }); - } - - /** - * @return Context - */ - public function visitBinaryMul(Node $node) - { - return $this->analyzeNumericArithmeticOp($node, true); - } - - /** - * @return Context - */ - public function visitBinaryPow(Node $node) - { - // TODO: 2 ** (-2) is a float - return $this->analyzeNumericArithmeticOp($node, true); - } - - /** - * @return Context - * TODO: There's an RFC to make binary shift left/right apply to strings. - */ - public function visitBinaryShiftLeft(Node $node) - { - $this->analyzeBinaryShift($node); - return $this->updateTargetWithType($node, static function (UnionType $unused_left) : UnionType { - // TODO: Check if both sides can cast to int and warn if they can't. - // TODO: Handle both sides being literals - return IntType::instance(false)->asUnionType(); - }); - } - - /** - * @return Context - */ - public function visitBinaryShiftRight(Node $node) - { - $this->analyzeBinaryShift($node); - return $this->updateTargetWithType($node, static function (UnionType $unused_left) : UnionType { - // TODO: Check if both sides can cast to int and warn if they can't. - // TODO: Handle both sides being literals - return IntType::instance(false)->asUnionType(); - }); - } - - private function analyzeBinaryShift(Node $node) - { - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['var'] - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'] - ); - $this->warnAboutInvalidUnionType( - $node, - static function (Type $type) : bool { - return $type instanceof IntType && !$type->getIsNullable(); - }, - $left, - $right, - Issue::TypeInvalidLeftOperandOfIntegerOp, - Issue::TypeInvalidRightOperandOfIntegerOp - ); - } - - private function warnForInvalidOperandsOfNumericOp(Node $node) - { - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['var'] - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'] - ); - $this->warnAboutInvalidUnionType( - $node, - static function (Type $type) : bool { - return $type->isValidNumericOperand(); - }, - $left, - $right, - Issue::TypeInvalidLeftOperandOfNumericOp, - Issue::TypeInvalidRightOperandOfNumericOp - ); - } - - /** - * @return Context - */ - public function visitBinarySub(Node $node) - { - return $this->analyzeNumericArithmeticOp($node, true); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/AssignOperatorFlagVisitor.php b/vendor/phan/phan/src/Phan/Analysis/AssignOperatorFlagVisitor.php deleted file mode 100644 index 8809743..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/AssignOperatorFlagVisitor.php +++ /dev/null @@ -1,375 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use ast; -use ast\Node; -use Phan\AST\UnionTypeVisitor; -use Phan\AST\Visitor\Element; -use Phan\AST\Visitor\FlagVisitorImplementation; -use Phan\CodeBase; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\FloatType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; - -/** - * This visitor returns a Context with the updated changes caused by an assignment operation (e.g. changes to Variables, Variable types) - * - * TODO: Improve analysis of bitwise operations, warn if non-int is provided and consistently return int if it's guaranteed - */ -class AssignOperatorFlagVisitor extends FlagVisitorImplementation -{ - - /** - * @var CodeBase The code base within which we're operating - */ - private $code_base; - - /** - * @var Context The context in which we are determining the union type of the result of an assignment operator - */ - private $context; - - /** - * Create a new AssignOperatorFlagVisitor - */ - public function __construct( - CodeBase $code_base, - Context $context - ) { - $this->code_base = $code_base; - $this->context = $context; - } - - /** - * @param Node $node - * A node to visit - * @return UnionType - */ - public function __invoke(Node $node) - { - // NOTE: Some operations currently don't exist in any php version, such as `$x ||= 2;`, `$x xor= 2;` - return Element::acceptBinaryFlagVisitor($node, $this); - } - - /** - * Default visitor for node kinds that do not have - * an overriding method - * - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visit(Node $node) : UnionType - { - // TODO: For some types (e.g. xor, bitwise or), set the type of the variable? - // Or should that be done in PreOrderAnalysisVisitor? - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['var'] - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'] - ); - - if ($left->isExclusivelyArray() - || $right->isExclusivelyArray() - ) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeArrayOperator, - $node->lineno ?? 0, - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags], - $left, - $right - ); - - return UnionType::empty(); - } elseif ($left->hasNonNullIntType() - && $right->hasNonNullIntType() - ) { - return IntType::instance(false)->asUnionType(); - } elseif ($left->hasType(FloatType::instance(false)) - && $right->hasType(FloatType::instance(false)) - ) { - return FloatType::instance(false)->asUnionType(); - } - - static $int_or_float; - return $int_or_float ?? ($int_or_float = new UnionType([ - IntType::instance(false), - FloatType::instance(false) - ])); - } - - /** - * @return UnionType - */ - public function visitBinaryCoalesce(Node $node) - { - $var_node = $node->children['var']; - $new_node = new ast\Node(ast\AST_BINARY_OP, $node->lineno, [ - 'left' => $var_node, - 'right' => $node->children['expr'], - ], ast\flags\BINARY_COALESCE); - - return (new BinaryOperatorFlagVisitor( - $this->code_base, - $this->context, - true - ))->visitBinaryCoalesce($new_node); - } - /** - * @return UnionType for the `&` operator - */ - public function visitBinaryBitwiseAnd(Node $node) - { - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['var'] - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'] - ); - if ($left->hasNonNullIntType() - && $right->hasNonNullIntType() - ) { - return IntType::instance(false)->asUnionType(); - } elseif ($left->hasNonNullStringType() && - $right->hasNonNullStringType()) { - // $x = 'a'; $x &= 'c'; - return StringType::instance(false)->asUnionType(); - } - return IntType::instance(false)->asUnionType(); - } - - /** - * @return UnionType for the `|` operator - */ - public function visitBinaryBitwiseOr(Node $node) - { - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['var'] - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'] - ); - if ($left->hasNonNullIntType() - && $right->hasNonNullIntType() - ) { - return IntType::instance(false)->asUnionType(); - } elseif ($left->hasNonNullStringType() && - $right->hasNonNullStringType()) { - // $x = 'a'; $x |= 'c'; - return StringType::instance(false)->asUnionType(); - } - return IntType::instance(false)->asUnionType(); - } - - /** - * Analyze the bitwise xor operator. - * - * NOTE: Code can bitwise xor strings byte by byte in PHP - * - * @return UnionType for the `^` operator - */ - public function visitBinaryBitwiseXor(Node $node) - { - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['var'] - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'] - ); - - // TODO: check for other invalid types - if ($left->isExclusivelyArray() - || $right->isExclusivelyArray() - ) { - // TODO: Move these checks into AssignOperatorAnalysisVisitor - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeArrayOperator, - $node->lineno ?? 0, - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags], - $left, - $right - ); - - return UnionType::empty(); - } elseif ($left->hasNonNullIntType() - && $right->hasNonNullIntType() - ) { - return IntType::instance(false)->asUnionType(); - } elseif ($left->hasNonNullStringType() - && $right->hasNonNullStringType() - ) { - return StringType::instance(false)->asUnionType(); - } - - return IntType::instance(false)->asUnionType(); - } - - /** - * @param Node $node @phan-unused-param - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryConcat(Node $node) : UnionType - { - return StringType::instance(false)->asUnionType(); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryAdd(Node $node) : UnionType - { - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['var'] - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'] - ); - - // fast-track common cases - if ($left->isNonNullIntType() - && $right->isNonNullIntType() - ) { - return IntType::instance(false)->asUnionType(); - } - - // If both left and right are arrays, then this is array - // concatenation. - if ($left->isGenericArray() && $right->isGenericArray()) { - if ($left->isEqualTo($right)) { - return $left; - } - - return ArrayType::instance(false)->asUnionType(); - } - - // TODO: isNonNullNumberType - if (($left->isNonNullIntType() - || $left->isType(FloatType::instance(false))) - && ($right->isNonNullIntType() - || $right->isType(FloatType::instance(false))) - ) { - return FloatType::instance(false)->asUnionType(); - } - - $left_is_array = ( - !$left->genericArrayElementTypes()->isEmpty() - && $left->nonArrayTypes()->isEmpty() - ) || $left->isType(ArrayType::instance(false)); - - $right_is_array = ( - !$right->genericArrayElementTypes()->isEmpty() - && $right->nonArrayTypes()->isEmpty() - ) || $right->isType(ArrayType::instance(false)); - - if ($left_is_array - && !$right->canCastToUnionType( - ArrayType::instance(false)->asUnionType() - ) - ) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeInvalidRightOperand, - $node->lineno ?? 0 - ); - return UnionType::empty(); - } elseif ($right_is_array - && !$left->canCastToUnionType(ArrayType::instance(false)->asUnionType()) - ) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeInvalidLeftOperand, - $node->lineno ?? 0 - ); - return UnionType::empty(); - } elseif ($left_is_array || $right_is_array) { - // If it is a '+' and we know one side is an array - // and the other is unknown, assume array - return ArrayType::instance(false)->asUnionType(); - } - - static $int_or_float; - return $int_or_float ?? ($int_or_float = new UnionType([ - IntType::instance(false), - FloatType::instance(false) - ])); - } - - /** @override */ - public function visitBinaryDiv(Node $_) : UnionType - { - // analyzed in AssignOperatorAnalysisVisitor - return FloatType::instance(false)->asUnionType(); - } - - /** @override */ - public function visitBinaryMod(Node $_) : UnionType - { - // analyzed in AssignOperatorAnalysisVisitor - return IntType::instance(false)->asUnionType(); - } - - /** @override */ - public function visitBinaryPow(Node $_) : UnionType - { - // analyzed in AssignOperatorAnalysisVisitor - return FloatType::instance(false)->asUnionType(); - } - - /** @override */ - public function visitBinaryShiftLeft(Node $_) : UnionType - { - return IntType::instance(false)->asUnionType(); - } - - /** @override */ - public function visitBinaryShiftRight(Node $_) : UnionType - { - return IntType::instance(false)->asUnionType(); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/AssignmentVisitor.php b/vendor/phan/phan/src/Phan/Analysis/AssignmentVisitor.php deleted file mode 100644 index 6d618dd..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/AssignmentVisitor.php +++ /dev/null @@ -1,1330 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use AssertionError; -use ast\Node; -use Phan\AST\AnalysisVisitor; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\CodeBaseException; -use Phan\Exception\IssueException; -use Phan\Exception\NodeException; -use Phan\Exception\RecursionDepthException; -use Phan\Exception\UnanalyzableException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Method; -use Phan\Language\Element\Parameter; -use Phan\Language\Element\PassByReferenceVariable; -use Phan\Language\Element\Property; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type; -use Phan\Language\Type\ArrayShapeType; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\FalseType; -use Phan\Language\Type\GenericArrayType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; -use Phan\Library\StringUtil; -use function strcasecmp; - -/** - * Analyzes assignments. - */ -class AssignmentVisitor extends AnalysisVisitor -{ - /** - * @var Node - * The AST node containing the assignment - */ - private $assignment_node; - - /** - * @var UnionType - * The type of the element on the right side of the assignment - */ - private $right_type; - - /** - * @var int - * Depth of array parameters in this assignment, e.g. this is - * 1 for `$foo[3] = 42`, 0 for `$x = 2;`, etc. - * We need to know this in order to decide - * if we're replacing the union type - * or if we're adding a type to the union type. - */ - private $dim_depth; - - /** - * @var ?UnionType - * Non-null if this assignment is to an array parameter such as - * in `$foo[3] = 42` (type would be int). We need to know this in order to decide - * to type check the assignment (e.g. array keys are int|string, string offsets are int) - * type to the union type. - * - * Null for `$foo[] = 42` or when dim_depth is 0 - */ - private $dim_type; - - /** - * @param CodeBase $code_base - * The global code base we're operating within - * - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - * - * @param Node $assignment_node - * The AST node containing the assignment - * - * @param UnionType $right_type - * The type of the element on the right side of the assignment - * - * @param int $dim_depth - * Positive if this assignment is to an array parameter such as - * in `$foo[3] = 42`. We need to know this in order to decide - * if we're replacing the union type or if we're adding a - * type to the union type. - * - * @param ?UnionType $dim_type - * The type of the dimension. - */ - public function __construct( - CodeBase $code_base, - Context $context, - Node $assignment_node, - UnionType $right_type, - int $dim_depth = 0, - UnionType $dim_type = null - ) { - parent::__construct($code_base, $context); - - $this->assignment_node = $assignment_node; - $this->right_type = $right_type->withSelfResolvedInContext($context); - $this->dim_depth = $dim_depth; - $this->dim_type = $dim_type; // null for `$x[] =` or when dim_depth is 0. - } - - /** - * Default visitor for node kinds that do not have - * an overriding method - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * - * @throws UnanalyzableException - */ - public function visit(Node $node) : Context - { - // TODO: Add more details. - // This should only happen when the polyfill parser is used on invalid ASTs - $this->emitIssue( - Issue::Unanalyzable, - $node->lineno - ); - return $this->context; - } - - /** - * The following is an example of how this would happen. - * (TODO: Check if the right-hand side is an object with offsetSet() or a reference? - * - * ```php - * class C { - * function f() { - * return [ 24 ]; - * } - * } - * (new C)->f()[1] = 42; - * ``` - * - * @param Node $unused_node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitMethodCall(Node $unused_node) : Context - { - return $this->context; - } - - /** - * The following is an example of how this would happen. - * TODO: Check that the left-hand side is a reference or defines offsetSet()? - * - * ```php - * function &f() { - * $x = [ 24 ]; return $x; - * } - * f()[1] = 42; - * ``` - * - * @param Node $unused_node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitCall(Node $unused_node) : Context - { - return $this->context; - } - - /** - * The following is an example of how this would happen. - * - * ```php - * class A{ - * function &f() { - * $x = [ 24 ]; return $x; - * } - * } - * A::f()[1] = 42; - * ``` - * - * @param Node $unused_node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitStaticCall(Node $unused_node) : Context - { - return $this->context; - } - - /** - * This happens for code like the following - * ``` - * list($a) = [1, 2, 3]; - * ``` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitArray(Node $node) : Context - { - if ($this->right_type->hasTopLevelArrayShapeTypeInstances()) { - $this->analyzeShapedArrayAssignment($node); - } else { - // common case - $this->analyzeGenericArrayAssignment($node); - } - return $this->context; - } - - /** - * Analyzes code such as list($a) = [1, 2, 3]; - * @return void - * @see self::visitArray() - */ - private function analyzeShapedArrayAssignment(Node $node) - { - // Figure out the type of elements in the list - $fallback_element_type = null; - $get_fallback_element_type = function () use (&$fallback_element_type) : UnionType { - return $fallback_element_type ?? ($fallback_element_type = $this->right_type->genericArrayElementTypes()); - }; - - $expect_string_keys_lineno = false; - $expect_int_keys_lineno = false; - - $key_set = []; - - foreach ($node->children ?? [] as $child_node) { - // Some times folks like to pass a null to - // a list to throw the element away. I'm not - // here to judge. - if (!($child_node instanceof Node)) { - // Track the element that was thrown away. - $key_set[] = true; - continue; - } - - // Get the key and value nodes for each - // array element we're assigning to - // TODO: Check key types are valid? - $key_node = $child_node->children['key']; - - if ($key_node === null) { - $key_set[] = true; - \end($key_set); - $key_value = \key($key_set); - - $expect_int_keys_lineno = $child_node->lineno; // list($x, $y) = ... is equivalent to list(0 => $x, 1 => $y) = ... - } else { - if ($key_node instanceof Node) { - $key_value = (new ContextNode($this->code_base, $this->context, $key_node))->getEquivalentPHPScalarValue(); - } else { - $key_value = $key_node; - } - if (\is_scalar($key_value)) { - $key_set[$key_value] = true; - if (\is_int($key_value)) { - $expect_int_keys_lineno = $child_node->lineno; - } elseif (\is_string($key_value)) { - $expect_string_keys_lineno = $child_node->lineno; - } - } else { - $key_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $key_node); - $key_type_enum = GenericArrayType::keyTypeFromUnionTypeValues($key_type); - // TODO: Warn about types that can't cast to int|string - if ($key_type_enum === GenericArrayType::KEY_INT) { - $expect_int_keys_lineno = $child_node->lineno; - } elseif ($key_type_enum === GenericArrayType::KEY_STRING) { - $expect_string_keys_lineno = $child_node->lineno; - } - } - } - - if (\is_scalar($key_value)) { - $element_type = UnionTypeVisitor::resolveArrayShapeElementTypesForOffset($this->right_type, $key_value); - if ($element_type === null) { - $element_type = $get_fallback_element_type(); - } elseif ($element_type === false) { - $this->emitIssue( - Issue::TypeInvalidDimOffsetArrayDestructuring, - $child_node->lineno, - StringUtil::jsonEncode($key_value), - (string)$this->right_type - ); - $element_type = $get_fallback_element_type(); - } - } else { - $element_type = $get_fallback_element_type(); - } - - $this->analyzeValueNodeOfShapedArray($element_type, $child_node->children['value']); - } - - if (!Config::getValue('scalar_array_key_cast')) { - $this->checkMismatchArrayDestructuringKey($expect_int_keys_lineno, $expect_string_keys_lineno); - } - } - - /** - * @param Node|string|int|float $value_node - * @return void - */ - private function analyzeValueNodeOfShapedArray( - UnionType $element_type, - $value_node - ) { - if (!$value_node instanceof Node) { - return; - } - $kind = $value_node->kind; - if ($kind === \ast\AST_REF) { - $value_node = $value_node->children['expr']; - if (!$value_node instanceof Node) { - return; - } - } - if ($kind === \ast\AST_VAR) { - $variable = Variable::fromNodeInContext( - $value_node, - $this->context, - $this->code_base, - false - ); - - // Set the element type on each element of - // the list - $variable->setUnionType($element_type); - - // Note that we're not creating a new scope, just - // adding variables to the existing scope - $this->context->addScopeVariable($variable); - } elseif ($kind === \ast\AST_PROP) { - try { - $property = (new ContextNode( - $this->code_base, - $this->context, - $value_node - ))->getProperty(false); - - // Set the element type on each element of - // the list - $property->setUnionType($element_type); - } catch (UnanalyzableException $_) { - // Ignore it. There's nothing we can do. - } catch (NodeException $_) { - // Ignore it. There's nothing we can do. - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - return; - } - } else { - $this->context = (new AssignmentVisitor( - $this->code_base, - $this->context, - $value_node, - $element_type, - 0 - ))->__invoke($value_node); - } - } // TODO: Warn if $value_node is not a node. NativeSyntaxCheckPlugin already does this. - - /** - * Analyzes code such as list($a) = function_returning_array(); - * @return void - * @see self::visitArray() - */ - private function analyzeGenericArrayAssignment(Node $node) - { - // Figure out the type of elements in the list - $right_type = $this->right_type; - if ($right_type->isEmpty()) { - $element_type = UnionType::empty(); - } else { - $array_access_types = $right_type->asArrayOrArrayAccessSubTypes($this->code_base); - if ($array_access_types->isEmpty()) { - $this->emitIssue( - Issue::TypeInvalidExpressionArrayDestructuring, - $node->lineno, - $right_type, - 'array|ArrayAccess' - ); - } - $element_type = - $array_access_types->genericArrayElementTypes(); - } - - $expect_string_keys_lineno = false; - $expect_int_keys_lineno = false; - - $scalar_array_key_cast = Config::getValue('scalar_array_key_cast'); - - foreach ($node->children ?? [] as $child_node) { - // Some times folks like to pass a null to - // a list to throw the element away. I'm not - // here to judge. - if (!($child_node instanceof Node)) { - continue; - } - - // Get the key and value nodes for each - // array element we're assigning to - // TODO: Check key types are valid? - $key_node = $child_node->children['key']; - if (!$scalar_array_key_cast) { - if ($key_node === null) { - $expect_int_keys_lineno = $child_node->lineno; // list($x, $y) = ... is equivalent to list(0 => $x, 1 => $y) = ... - } else { - $key_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $key_node); - $key_type_enum = GenericArrayType::keyTypeFromUnionTypeValues($key_type); - // TODO: Warn about types that can't cast to int|string - if ($key_type_enum === GenericArrayType::KEY_INT) { - $expect_int_keys_lineno = $child_node->lineno; - } elseif ($key_type_enum === GenericArrayType::KEY_STRING) { - $expect_string_keys_lineno = $child_node->lineno; - } - } - } - - $value_node = $child_node->children['value']; - if (!($value_node instanceof Node)) { - // Skip non-nodes to avoid crash - // TODO: Emit a new issue type for https://github.com/phan/phan/issues/1693 - } elseif ($value_node->kind === \ast\AST_VAR) { - $variable = Variable::fromNodeInContext( - $value_node, - $this->context, - $this->code_base, - false - ); - - // Set the element type on each element of - // the list - $variable->setUnionType($element_type); - - // Note that we're not creating a new scope, just - // adding variables to the existing scope - $this->context->addScopeVariable($variable); - } elseif ($value_node->kind === \ast\AST_PROP) { - try { - $property = (new ContextNode( - $this->code_base, - $this->context, - $value_node - ))->getProperty(false); - - // Set the element type on each element of - // the list - $property->setUnionType($element_type); - } catch (UnanalyzableException $exception) { - // Ignore it. There's nothing we can do. - } catch (NodeException $exception) { - // Ignore it. There's nothing we can do. - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - continue; - } - } else { - $this->context = (new AssignmentVisitor( - $this->code_base, - $this->context, - $value_node, - $element_type, - 0 - ))->__invoke($value_node); - } - } - - $this->checkMismatchArrayDestructuringKey($expect_int_keys_lineno, $expect_string_keys_lineno); - } - - /** - * @param int|false $expect_int_keys_lineno - * @param int|false $expect_string_keys_lineno - * @return void - */ - private function checkMismatchArrayDestructuringKey($expect_int_keys_lineno, $expect_string_keys_lineno) - { - if ($expect_int_keys_lineno !== false || $expect_string_keys_lineno !== false) { - $right_hand_key_type = GenericArrayType::keyTypeFromUnionTypeKeys($this->right_type); - if ($expect_int_keys_lineno !== false && ($right_hand_key_type & GenericArrayType::KEY_INT) === 0) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeMismatchArrayDestructuringKey, - $expect_int_keys_lineno, - 'int', - 'string' - ); - } elseif ($expect_string_keys_lineno !== false && ($right_hand_key_type & GenericArrayType::KEY_STRING) === 0) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeMismatchArrayDestructuringKey, - $expect_string_keys_lineno, - 'string', - 'int' - ); - } - } - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitDim(Node $node) : Context - { - $expr_node = $node->children['expr']; - if (!($expr_node instanceof Node)) { - $this->emitIssue( - Issue::InvalidWriteToTemporaryExpression, - $node->lineno, - Type::fromObject($expr_node) - ); - return $this->context; - } - if ($expr_node->kind == \ast\AST_VAR) { - $variable_name = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getVariableName(); - - if (Variable::isHardcodedVariableInScopeWithName($variable_name, $this->context->isInGlobalScope())) { - return $this->analyzeSuperglobalDim($node, $variable_name); - } - } - - // TODO: Check if the unionType is valid for the [] - // For most types, it should be int|string, but SplObjectStorage and a few user-defined types will be exceptions. - // Infer it from offsetSet? - $dim_node = $node->children['dim']; - if ($dim_node instanceof Node) { - // TODO: Use ContextNode to infer dim_value - $dim_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $dim_node - ); - $dim_value = $dim_type->asSingleScalarValueOrNullOrSelf(); - } elseif (\is_scalar($dim_node)) { - $dim_value = $dim_node; - $dim_type = Type::fromObject($dim_node)->asUnionType(); - } else { - // TODO: If the array shape has only one set of keys, then appending should add to that shape? Possibly not a common use case. - $dim_type = null; - $dim_value = null; - } - - if ($dim_type !== null && !\is_object($dim_value)) { - $right_type = ArrayShapeType::fromFieldTypes([ - $dim_value => $this->right_type, - ], false)->asUnionType(); - } else { - // Make the right type a generic (i.e. int -> int[]) - if ($dim_type !== null) { - $key_type_enum = GenericArrayType::keyTypeFromUnionTypeValues($dim_type); - } elseif ($dim_node !== null) { - $key_type_enum = GenericArrayType::KEY_MIXED; - } else { - $key_type_enum = GenericArrayType::KEY_INT; - } - $right_inner_type = $this->right_type; - if ($right_inner_type->isEmpty()) { - if ($key_type_enum === GenericArrayType::KEY_MIXED) { - $right_type = ArrayType::instance(false)->asUnionType(); - } else { - $right_type = GenericArrayType::fromElementType(MixedType::instance(false), false, $key_type_enum)->asUnionType(); - } - } else { - $right_type = $right_inner_type->asGenericArrayTypes($key_type_enum); - } - } - - // Recurse into whatever we're []'ing - $context = (new AssignmentVisitor( - $this->code_base, - $this->context, - $node, - $right_type, - $this->dim_depth + 1, - $dim_type - ))->__invoke($expr_node); - - return $context; - } - - /** - * Analyze an assignment where $variable_name is a superglobal, and return the new context. - * May create a new variable in $this->context. - * TODO: Emit issues if the assignment is incompatible with the pre-existing type? - */ - private function analyzeSuperglobalDim(Node $node, string $variable_name) : Context - { - $dim = $node->children['dim']; - if ('GLOBALS' === $variable_name) { - if (!\is_string($dim)) { - // You're not going to believe this, but I just - // found a piece of code like $GLOBALS[mt_rand()]. - // Super weird, right? - return $this->context; - } - - if (Variable::isHardcodedVariableInScopeWithName($dim, $this->context->isInGlobalScope())) { - // Don't override types of superglobals such as $_POST, $argv through $_GLOBALS['_POST'] = expr either. TODO: Warn. - return $this->context; - } - - $variable = new Variable( - $this->context, - $dim, - $this->right_type, - 0 - ); - - $this->context->addGlobalScopeVariable( - $variable - ); - } - // TODO: Assignment sanity checks. - return $this->context; - } - - /** - * @param Node $node - * A node to parse, for an instance property. - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitProp(Node $node) : Context - { - // Get class list first, warn if the class list is invalid. - try { - $class_list = (new ContextNode( - $this->code_base, - $this->context, - $node->children['expr'] - ))->getClassList(false, ContextNode::CLASS_LIST_ACCEPT_OBJECT, Issue::TypeExpectedObjectPropAccess); - } catch (CodeBaseException $exception) { - // This really shouldn't happen since the code - // parsed cleanly. This should fatal. - // throw $exception; - return $this->context; - } catch (\Exception $exception) { - // If we can't figure out what kind of a class - // this is, don't worry about it - return $this->context; - } - - $property_name = $node->children['prop']; - - // Things like $foo->$bar - if (!\is_string($property_name)) { - return $this->context; - } - - foreach ($class_list as $clazz) { - // Check to see if this class has the property or - // a setter - if (!$clazz->hasPropertyWithName($this->code_base, $property_name)) { - if (!$clazz->hasMethodWithName($this->code_base, '__set')) { - continue; - } - } - - try { - $property = $clazz->getPropertyByNameInContext( - $this->code_base, - $property_name, - $this->context, - false, - $node - ); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - return $this->context; - } - try { - return $this->analyzePropAssignment($clazz, $property, $node); - } catch (RecursionDepthException $_) { - return $this->context; - } - } - - // Check if it is a built in class with dynamic properties but (possibly) no __set, such as SimpleXMLElement or stdClass or V8Js - $is_class_with_arbitrary_types = isset($class_list[0]) ? $class_list[0]->getHasDynamicProperties($this->code_base) : false; - - if ($is_class_with_arbitrary_types || Config::getValue('allow_missing_properties')) { - try { - // Create the property - $property = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getOrCreateProperty($property_name, false); - - $this->addTypesToProperty($property, $node); - } catch (\Exception $_) { - // swallow it - } - } elseif (\count($class_list) > 0) { - $first_class = $class_list[0]; - $this->emitIssueWithSuggestion( - Issue::UndeclaredProperty, - $node->lineno ?? 0, - ["{$first_class->getFQSEN()}->$property_name"], - IssueFixSuggester::suggestSimilarProperty( - $this->code_base, - $this->context, - $first_class, - $property_name, - false - ) - ); - } else { - // If we hit this part, we couldn't figure out - // the class, so we ignore the issue - } - - return $this->context; - } - - /** - * This analyzes an assignment to an instance or static property. - * - * @param Node $node the left hand side of the assignment - */ - private function analyzePropAssignment(Clazz $clazz, Property $property, Node $node) : Context - { - if ($property->isReadOnly()) { - $this->analyzeAssignmentToReadOnlyProperty($property, $node); - } - // TODO: Iterate over individual types, don't look at the whole type at once? - - // If we're assigning to an array element then we don't - // know what the array structure of the parameter is - // outside of the scope of this assignment, so we add to - // its union type rather than replace it. - $property_union_type = $property->getUnionType(); - if ($this->dim_depth > 0) { - if ($this->right_type->canCastToExpandedUnionType( - $property_union_type, - $this->code_base - )) { - $this->addTypesToProperty($property, $node); - if (Config::get_strict_property_checking() && $this->right_type->typeCount() > 1) { - $this->analyzePropertyAssignmentStrict($property, $this->right_type, $node); - } - } elseif ($property_union_type->asExpandedTypes($this->code_base)->hasArrayAccess()) { - // Add any type if this is a subclass with array access. - $this->addTypesToProperty($property, $node); - } else { - // Convert array shape types to generic arrays to reduce false positive PhanTypeMismatchProperty instances. - - // TODO: If the codebase explicitly sets a phpdoc array shape type on a property assignment, - // then preserve the array shape type. - $new_types = $this->typeCheckDimAssignment($property_union_type, $node) - ->withFlattenedArrayShapeOrLiteralTypeInstances(); - - // TODO: More precise than canCastToExpandedUnionType - if (!$new_types->canCastToExpandedUnionType( - $property_union_type, - $this->code_base - )) { - // TODO: Don't emit if array shape type is compatible with the original value of $property_union_type - $this->emitIssue( - Issue::TypeMismatchProperty, - $node->lineno ?? 0, - (string)$new_types, - $property->getRepresentationForIssue(), - (string)$property_union_type - ); - } else { - if (Config::get_strict_property_checking() && $this->right_type->typeCount() > 1) { - $this->analyzePropertyAssignmentStrict($property, $this->right_type, $node); - } - $this->right_type = $new_types; - $this->addTypesToProperty($property, $node); - } - } - return $this->context; - } elseif ($clazz->isPHPInternal() && $clazz->getFQSEN() !== FullyQualifiedClassName::getStdClassFQSEN()) { - // We don't want to modify the types of internal classes such as \ast\Node even if they are compatible - // This would result in unpredictable results, and types which are more specific than they really are. - // stdClass is an exception to this, for issues such as https://github.com/phan/phan/pull/700 - return $this->context; - } else { - if (($node->children['expr']->kind ?? null) === \ast\AST_VAR && $node->children['expr']->children['name'] === 'this') { - $this->handleThisPropertyAssignmentInLocalScope($property); - } - // This is a regular assignment, not an assignment to an offset - if (!$this->right_type->canCastToExpandedUnionType( - $property_union_type, - $this->code_base - ) - && !($this->right_type->hasTypeInBoolFamily() && $property_union_type->hasTypeInBoolFamily()) - && !$clazz->getHasDynamicProperties($this->code_base) - ) { - if ($this->right_type->nonNullableClone()->canCastToExpandedUnionType($property_union_type, $this->code_base) && - !$this->right_type->isType(NullType::instance(false))) { - if ($this->shouldSuppressIssue(Issue::TypeMismatchProperty, $node->lineno)) { - return $this->context; - } - $this->emitIssue( - Issue::PossiblyNullTypeMismatchProperty, - $node->lineno, - (string)$this->right_type, - $property->getRepresentationForIssue(), - (string)$property_union_type, - 'null' - ); - } else { - // TODO: optionally, change the message from "::" to "->"? - $this->emitIssue( - Issue::TypeMismatchProperty, - $node->lineno, - (string)$this->right_type, - $property->getRepresentationForIssue(), - (string)$property_union_type - ); - } - return $this->context; - } - - if (Config::get_strict_property_checking() && $this->right_type->typeCount() > 1) { - $this->analyzePropertyAssignmentStrict($property, $this->right_type, $node); - } - } - - // After having checked it, add this type to it - $this->addTypesToProperty($property, $node); - - return $this->context; - } - - /** - * Modifies $this->context (if needed) to track the assignment to a property of $this within a function-like. - * This handles conditional branches. - * - * @return void - */ - private function handleThisPropertyAssignmentInLocalScope(Property $property) - { - $this->context = $this->context->withThisPropertySetToType($property, $this->right_type); - } - - private function analyzeAssignmentToReadOnlyProperty(Property $property, Node $node) - { - $is_from_phpdoc = $property->isFromPHPDoc(); - $context = $property->getContext(); - if (!$is_from_phpdoc && $this->context->isInFunctionLikeScope()) { - $method = $this->context->getFunctionLikeInScope($this->code_base); - if ($method instanceof Method && strcasecmp($method->getName(), '__construct') === 0) { - $class_type = $method->getClassFQSEN()->asType(); - if ($class_type->asExpandedTypes($this->code_base)->hasType($property->getClassFQSEN()->asType())) { - // This is a constructor setting its own properties or a base class's properties. - // TODO: Could support private methods - return; - } - } - } - $this->emitIssue( - $is_from_phpdoc ? Issue::AccessReadOnlyMagicProperty : Issue::AccessReadOnlyProperty, - $node->lineno ?? 0, - $property->asPropertyFQSENString(), - $context->getFile(), - $context->getLineNumberStart() - ); - } - - private function analyzePropertyAssignmentStrict(Property $property, UnionType $assignment_type, Node $node) - { - $type_set = $assignment_type->getTypeSet(); - if (\count($type_set) < 2) { - throw new AssertionError('Expected to have at least two types when checking if types match in strict mode'); - } - - $property_union_type = $property->getUnionType(); - if ($property_union_type->hasTemplateTypeRecursive()) { - $property_union_type = $property_union_type->asExpandedTypes($this->code_base); - } - - $mismatch_type_set = UnionType::empty(); - $mismatch_expanded_types = null; - - // For the strict - foreach ($type_set as $type) { - // Expand it to include all parent types up the chain - $individual_type_expanded = $type->asExpandedTypes($this->code_base); - - // See if the argument can be cast to the - // parameter - if (!$individual_type_expanded->canCastToUnionType( - $property_union_type - )) { - $mismatch_type_set = $mismatch_type_set->withType($type); - if ($mismatch_expanded_types === null) { - // Warn about the first type - $mismatch_expanded_types = $individual_type_expanded; - } - } - } - - - if ($mismatch_expanded_types === null) { - // No mismatches - return; - } - if ($this->shouldSuppressIssue(Issue::TypeMismatchProperty, $node->lineno)) { - // TypeMismatchProperty also suppresses PhanPossiblyNullTypeMismatchProperty, etc. - return; - } - - $this->emitIssue( - self::getStrictPropertyMismatchIssueType($mismatch_type_set), - $node->lineno ?? 0, - (string)$this->right_type, - $property->getRepresentationForIssue(), - (string)$property_union_type, - (string)$mismatch_expanded_types - ); - } - - private static function getStrictPropertyMismatchIssueType(UnionType $union_type) : string - { - if ($union_type->typeCount() === 1) { - $type = $union_type->getTypeSet()[0]; - if ($type instanceof NullType) { - return Issue::PossiblyNullTypeMismatchProperty; - } - if ($type instanceof FalseType) { - return Issue::PossiblyFalseTypeMismatchProperty; - } - } - return Issue::PartialTypeMismatchProperty; - } - - /** - * @param Property $property - The property which should have types added to it - * - * @return void - */ - private function addTypesToProperty(Property $property, Node $node) - { - $original_property_types = $property->getUnionType(); - if ($original_property_types->isEmpty()) { - // TODO: Be more precise? - $property->setUnionType($this->right_type->withFlattenedArrayShapeOrLiteralTypeInstances()); - return; - } - - if ($this->dim_depth > 0) { - $new_types = $this->typeCheckDimAssignment($original_property_types, $node); - } else { - $new_types = $this->right_type; - } - $has_literals = $original_property_types->hasLiterals(); - $new_types = $new_types->withFlattenedArrayShapeTypeInstances(); - - $updated_property_types = $original_property_types; - foreach ($new_types->getTypeSet() as $new_type) { - if ($new_type instanceof MixedType) { - // Don't add MixedType to a non-empty property - It makes inferences on that property useless. - continue; - } - - // Only allow compatible types to be added to declared properties. - // Allow anything to be added to dynamic properties. - // TODO: Be more permissive about declared properties without phpdoc types. - if (!$new_type->asExpandedTypes($this->code_base)->canCastToUnionType($original_property_types) && !$property->isDynamicProperty()) { - continue; - } - - // Check for adding a specific array to as generic array as a workaround for #1783 - if (\get_class($new_type) === ArrayType::class && $original_property_types->hasGenericArray()) { - continue; - } - if (!$has_literals) { - $new_type = $new_type->asNonLiteralType(); - } - $updated_property_types = $updated_property_types->withType($new_type); - } - - // TODO: Add an option to check individual types, not just the whole union type? - // If that is implemented, verify that generic arrays will properly cast to regular arrays (public $x = [];) - $property->setUnionType($updated_property_types); - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * - * @see self::visitProp() - */ - public function visitStaticProp(Node $node) : Context - { - $property_name = $node->children['prop']; - - // Things like self::${$x} - if (!\is_string($property_name)) { - return $this->context; - } - - try { - $class_list = (new ContextNode( - $this->code_base, - $this->context, - $node->children['class'] - ))->getClassList(false, ContextNode::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME, Issue::TypeExpectedObjectStaticPropAccess); - } catch (CodeBaseException $exception) { - // This really shouldn't happen since the code - // parsed cleanly. This should fatal. - // throw $exception; - return $this->context; - } catch (\Exception $exception) { - // If we can't figure out what kind of a class - // this is, don't worry about it - return $this->context; - } - - foreach ($class_list as $clazz) { - // Check to see if this class has the property - if (!$clazz->hasPropertyWithName($this->code_base, $property_name)) { - continue; - } - - try { - // Look for static properties with that $property_name - $property = $clazz->getPropertyByNameInContext( - $this->code_base, - $property_name, - $this->context, - true - ); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - return $this->context; - } - - try { - return $this->analyzePropAssignment($clazz, $property, $node); - } catch (RecursionDepthException $_) { - return $this->context; - } - } - - if (\count($class_list) > 0) { - $this->emitIssue( - Issue::UndeclaredStaticProperty, - $node->lineno ?? 0, - $property_name, - (string)$class_list[0]->getFQSEN() - ); - } else { - // If we hit this part, we couldn't figure out - // the class, so we ignore the issue - } - - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitVar(Node $node) : Context - { - try { - $variable_name = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getVariableName(); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - return $this->context; - } - // Don't analyze variables when we can't determine their names. - if ($variable_name === '') { - return $this->context; - } - - // Check to see if the variable already exists - if ($this->context->getScope()->hasVariableWithName( - $variable_name - )) { - $variable = - $this->context->getScope()->getVariableByName( - $variable_name - ); - - // If the variable isn't a pass-by-reference parameter - // we clone it so as to not disturb its previous types - // as we replace it. - // TODO: Do a better job of analyzing references - if ($variable instanceof Parameter) { - if (!$variable->isPassByReference()) { - $variable = clone($variable); - } - } elseif (!($variable instanceof PassByReferenceVariable)) { - $variable = clone($variable); - } - - // If we're assigning to an array element then we don't - // know what the array structure of the parameter is - // outside of the scope of this assignment, so we add to - // its union type rather than replace it. - if ($this->dim_depth > 0) { - $old_variable_union_type = $variable->getUnionType(); - $right_type = $this->typeCheckDimAssignment($old_variable_union_type, $node); - if ($old_variable_union_type->isEmpty()) { - $old_variable_union_type = ArrayType::instance(false)->asUnionType(); - } - // TODO: Make the behavior more precise for $x['a']['b'] = ...; when $x is an array shape. - if ($this->dim_depth > 1 || ($old_variable_union_type->hasTopLevelNonArrayShapeTypeInstances() || $right_type->hasTopLevelNonArrayShapeTypeInstances() || $right_type->isEmpty())) { - $variable->setUnionType($old_variable_union_type->withUnionType( - $right_type - )); - } else { - $variable->setUnionType(ArrayType::combineArrayTypesOverriding( - $right_type, - $old_variable_union_type - )); - } - } else { - $variable->setUnionType($this->right_type); - } - - $this->context->addScopeVariable( - $variable - ); - - return $this->context; - } else { - // no such variable exists, check for invalid array Dim access - if ($this->dim_depth > 0) { - $this->emitIssue( - Issue::UndeclaredVariableDim, - $node->lineno ?? 0, - $variable_name - ); - } - } - - $variable = Variable::fromNodeInContext( - $this->assignment_node, - $this->context, - $this->code_base, - false - ); - if ($this->dim_depth > 0) { - // Reduce false positives: If $variable did not already exist, assume it may already have other array fields - // (e.g. in a loop, or in the global scope) - $variable->setUnionType($this->right_type->withType(ArrayType::instance(false))); - } else { - // Set that type on the variable - $variable->setUnionType( - $this->right_type - ); - } - - // Note that we're not creating a new scope, just - // adding variables to the existing scope - $this->context->addScopeVariable($variable); - - return $this->context; - } - - /** - * @param UnionType $assign_type - The type which is being added to - * @return UnionType - Usually the unmodified UnionType. Sometimes, the adjusted type, e.g. for string modification. - */ - public function typeCheckDimAssignment(UnionType $assign_type, Node $node) : UnionType - { - static $int_or_string_type = null; - static $mixed_type = null; - static $string_array_type = null; - static $simple_xml_element_type = null; - - if ($int_or_string_type === null) { - $int_or_string_type = UnionType::fromFullyQualifiedString('int|string'); - $mixed_type = MixedType::instance(false); - $string_array_type = UnionType::fromFullyQualifiedString('string[]'); - $simple_xml_element_type = - Type::fromNamespaceAndName('\\', 'SimpleXMLElement', false); - } - $dim_type = $this->dim_type; - $right_type = $this->right_type; - if ($assign_type->isEmpty() || ($assign_type->hasGenericArray() && !$assign_type->asExpandedTypes($this->code_base)->hasArrayAccess())) { - // For empty union types or 'array', expect the provided dimension to be able to cast to int|string - if ($dim_type && !$dim_type->isEmpty() && !$dim_type->canCastToUnionType($int_or_string_type)) { - $this->emitIssue( - Issue::TypeMismatchDimAssignment, - $node->lineno ?? 0, - (string)$assign_type, - (string)$dim_type, - (string)$int_or_string_type - ); - } - return $right_type; - } - $assign_type_expanded = $assign_type->asExpandedTypes($this->code_base); - //echo "$assign_type_expanded : " . json_encode($assign_type_expanded->hasArrayLike()) . "\n"; - - // TODO: Better heuristic to deal with false positives on ArrayAccess subclasses - if ($assign_type_expanded->hasArrayAccess() && !$assign_type_expanded->hasGenericArray()) { - return UnionType::empty(); - } - - if (!$assign_type_expanded->hasArrayLike()) { - if ($assign_type->hasNonNullStringType()) { - // Are we assigning to a variable/property of type 'string' (with no ArrayAccess or array types)? - if (\is_null($dim_type)) { - $this->emitIssue( - Issue::TypeMismatchDimEmpty, - $node->lineno ?? 0, - (string)$assign_type, - 'int' - ); - } elseif (!$dim_type->isEmpty() && !$dim_type->hasNonNullIntType()) { - $this->emitIssue( - Issue::TypeMismatchDimAssignment, - $node->lineno, - (string)$assign_type, - (string)$dim_type, - 'int' - ); - } else { - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable false positive for static - if ($right_type->canCastToUnionType($string_array_type)) { - // e.g. $a = 'aaa'; $a[0] = 'x'; - // (Currently special casing this, not handling deeper dimensions) - return StringType::instance(false)->asUnionType(); - } - } - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable false positive for static - } elseif (!$assign_type->hasType($mixed_type) && !$assign_type->hasType($simple_xml_element_type)) { - // Imitate the check in UnionTypeVisitor, don't warn for mixed, etc. - $this->emitIssue( - Issue::TypeArraySuspicious, - $node->lineno, - (string)$assign_type - ); - } - } - return $right_type; - } - - /** - * @param Node $node - * A node to parse of type AST_REF (found only in foreach) - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitRef(Node $node) : Context - { - // Note: AST_REF is only ever generated in AST_FOREACH, so this should be fine. - $var = $node->children['var']; - if ($var instanceof Node) { - return $this->__invoke($var); - } - $this->emitIssue( - Issue::Unanalyzable, - $node->lineno - ); - return $this->context; - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/BinaryOperatorFlagVisitor.php b/vendor/phan/phan/src/Phan/Analysis/BinaryOperatorFlagVisitor.php deleted file mode 100644 index 4fbdb2a..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/BinaryOperatorFlagVisitor.php +++ /dev/null @@ -1,880 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use AssertionError; -use ast; -use ast\Node; -use Closure; -use Phan\AST\UnionTypeVisitor; -use Phan\AST\Visitor\Element; -use Phan\AST\Visitor\FlagVisitorImplementation; -use Phan\CodeBase; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\FQSEN; -use Phan\Language\Type; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\BoolType; -use Phan\Language\Type\FloatType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\LiteralIntType; -use Phan\Language\Type\LiteralStringType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; - -use function is_int; - -/** - * This implements Phan's analysis of the type of binary operators (Node->kind=ast\AST_BINARY_OP). - * The visit* method invoked is based on Node->flags. - * - * This returns the union type of the binary operator. - * It emits issues as a side effect, usually based on $should_catch_issue_exception - * - * TODO: Improve analysis of bitwise operations, warn if non-int is provided and consistently return int if it's guaranteed - */ -final class BinaryOperatorFlagVisitor extends FlagVisitorImplementation -{ - - /** - * @var CodeBase The code base within which we're operating - */ - private $code_base; - - /** - * @var Context The context in which we are determining the union type of the result of a binary operator - */ - private $context; - - /** - * @var bool should we catch issue exceptions while analyzing and proceed with the best guess at the resulting union type? - * If false, exceptions will be propagated to the caller. - */ - private $should_catch_issue_exception; - - /** - * Create a new BinaryOperatorFlagVisitor - */ - public function __construct( - CodeBase $code_base, - Context $context, - bool $should_catch_issue_exception = false - ) { - $this->code_base = $code_base; - $this->context = $context; - $this->should_catch_issue_exception = $should_catch_issue_exception; - } - - /** - * @param Node $node - * A node to visit - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function __invoke(Node $node) - { - return $this->{Element::VISIT_BINARY_LOOKUP_TABLE[$node->flags] ?? 'handleMissing'}($node); - } - - /** - * @throws AssertionError - * @suppress PhanUnreferencedPrivateMethod this is referenced by __invoke - */ - private function handleMissing(Node $node) - { - throw new AssertionError("All flags must match. Found " . Element::flagDescription($node)); - } - - /** - * Default visitor for node kinds that do not have - * an overriding method - * - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visit(Node $node) : UnionType - { - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['left'], - $this->should_catch_issue_exception - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['right'], - $this->should_catch_issue_exception - ); - static $int_or_float = null; - - if ($left->isExclusivelyArray() - || $right->isExclusivelyArray() - ) { - return UnionType::empty(); - } elseif ($left->hasType(FloatType::instance(false)) - || $right->hasType(FloatType::instance(false)) - ) { - if ($left->hasTypeMatchingCallback( - static function (Type $type) : bool { - return !($type instanceof FloatType); - } - ) && $right->hasTypeMatchingCallback( - static function (Type $type) : bool { - return !($type instanceof FloatType); - } - )) { - return $int_or_float ?? ($int_or_float = new UnionType([ - IntType::instance(false), - FloatType::instance(false) - ])); - } - - return FloatType::instance(false)->asUnionType(); - } elseif ($left->hasNonNullIntType() - && $right->hasNonNullIntType() - ) { - return IntType::instance(false)->asUnionType(); - } - - return $int_or_float ?? ($int_or_float = new UnionType([ - IntType::instance(false), - FloatType::instance(false) - ])); - } - - /** - * Analyzes the `<=>` operator. - * - * @param Node $node @phan-unused-param - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinarySpaceship(Node $node) : UnionType - { - // TODO: Any sanity checks should go here. - - // <=> returns -1, 0, or 1 - return IntType::instance(false)->asUnionType(); - } - - /** - * Analyzes the `<<` operator. - * - * @param Node $node @phan-unused-param - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryShiftLeft(Node $node) : UnionType - { - // TODO: Any sanity checks should go here. - return IntType::instance(false)->asUnionType(); - } - - /** - * Analyzes the `>>` operator. - * - * @param Node $node @phan-unused-param - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryShiftRight(Node $node) : UnionType - { - // TODO: Any sanity checks should go here. - return IntType::instance(false)->asUnionType(); - } - - /** - * Code can bitwise xor strings byte by byte (or integers by value) in PHP - * @override - */ - public function visitBinaryBitwiseXor(Node $node) : UnionType - { - return $this->analyzeBinaryBitwiseCommon($node); - } - - /** - * @override - */ - public function visitBinaryBitwiseOr(Node $node) : UnionType - { - return $this->analyzeBinaryBitwiseCommon($node); - } - - /** - * @override - */ - public function visitBinaryBitwiseAnd(Node $node) : UnionType - { - return $this->analyzeBinaryBitwiseCommon($node); - } - - private function analyzeBinaryBitwiseCommon(Node $node) : UnionType - { - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['left'], - $this->should_catch_issue_exception - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['right'], - $this->should_catch_issue_exception - ); - - if ($left->hasNonNullIntType()) { - if ($right->hasNonNullIntType()) { - return self::computeIntegerOperationResult($node, $left, $right); - } - if ($right->hasNonNullStringType()) { - $this->emitIssue( - Issue::TypeMismatchBitwiseBinaryOperands, - $node->lineno ?? 0, - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags], - $left, - $right - ); - } - } elseif ($left->hasNonNullStringType()) { - if ($right->hasNonNullStringType()) { - return StringType::instance(false)->asUnionType(); - } - if ($right->hasNonNullIntType()) { - $this->emitIssue( - Issue::TypeMismatchBitwiseBinaryOperands, - $node->lineno ?? 0, - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags], - $left, - $right - ); - } - } - if (!$left->hasValidBitwiseOperand() || !$right->hasValidBitwiseOperand()) { - $this->emitIssue( - Issue::TypeInvalidBitwiseBinaryOperator, - $node->lineno ?? 0, - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags], - $left, - $right - ); - } - - return IntType::instance(false)->asUnionType(); - } - - private static function computeIntegerOperationResult( - Node $node, - UnionType $left, - UnionType $right - ) : UnionType { - $left_value = $left->asSingleScalarValueOrNull(); - if (is_int($left_value)) { - $right_value = $right->asSingleScalarValueOrNull(); - if (is_int($right_value)) { - switch ($node->flags) { - case ast\flags\BINARY_BITWISE_OR: - return LiteralIntType::instanceForValue($left_value | $right_value, false)->asUnionType(); - case ast\flags\BINARY_BITWISE_AND: - return LiteralIntType::instanceForValue($left_value & $right_value, false)->asUnionType(); - case ast\flags\BINARY_BITWISE_XOR: - return LiteralIntType::instanceForValue($left_value ^ $right_value, false)->asUnionType(); - case ast\flags\BINARY_MUL: - $value = $left_value * $right_value; - return is_int($value) ? LiteralIntType::instanceForValue($value, false)->asUnionType() - : FloatType::instance(false)->asUnionType(); - case ast\flags\BINARY_SUB: - $value = $left_value - $right_value; - return is_int($value) ? LiteralIntType::instanceForValue($value, false)->asUnionType() - : FloatType::instance(false)->asUnionType(); - case ast\flags\BINARY_ADD: - $value = $left_value + $right_value; - return is_int($value) ? LiteralIntType::instanceForValue($value, false)->asUnionType() - : FloatType::instance(false)->asUnionType(); - case ast\flags\BINARY_POW: - $value = $left_value ** $right_value; - return is_int($value) ? LiteralIntType::instanceForValue($value, false)->asUnionType() - : FloatType::instance(false)->asUnionType(); - } - } - } - - return IntType::instance(false)->asUnionType(); - } - - /** - * @param string $issue_type - * The type of issue to emit such as Issue::ParentlessClass - * - * @param int $lineno - * The line number where the issue was found - * - * @param int|string|FQSEN|UnionType|Type ...$parameters - * Template parameters for the issue's error message - * - * @return void - */ - protected function emitIssue( - string $issue_type, - int $lineno, - ...$parameters - ) { - Issue::maybeEmitWithParameters( - $this->code_base, - $this->context, - $issue_type, - $lineno, - $parameters - ); - } - - /** - * @param Node $unused_node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryBoolAnd(Node $unused_node) : UnionType - { - return BoolType::instance(false)->asUnionType(); - } - - /** - * @param Node $unused_node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryBoolXor(Node $unused_node) : UnionType - { - return BoolType::instance(false)->asUnionType(); - } - - /** - * @param Node $unused_node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryBoolOr(Node $unused_node) : UnionType - { - return BoolType::instance(false)->asUnionType(); - } - - /** - * @param Node $node A node to check types on (@phan-unused-param) - * - * TODO: Check that both types can cast to string or scalars? - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryConcat(Node $node) : UnionType - { - $left_node = $node->children['left']; - $left_value = $left_node instanceof Node ? UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $left_node, - $this->should_catch_issue_exception - )->asSingleScalarValueOrNullOrSelf() : $left_node; - if (\is_object($left_value)) { - return StringType::instance(false)->asUnionType(); - } - $right_node = $node->children['right']; - $right_value = $right_node instanceof Node ? UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $right_node, - $this->should_catch_issue_exception - )->asSingleScalarValueOrNullOrSelf() : $right_node; - if (\is_object($right_value)) { - return StringType::instance(false)->asUnionType(); - } - return LiteralStringType::instanceForValue($left_value . $right_value, false)->asUnionType(); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - private function visitBinaryOpCommon(Node $node) - { - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['left'], - $this->should_catch_issue_exception - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['right'], - $this->should_catch_issue_exception - ); - - $left_is_array_like = $left->isExclusivelyArrayLike(); - $right_is_array_like = $right->isExclusivelyArrayLike(); - - $left_can_cast_to_array = $left->canCastToUnionType( - ArrayType::instance(false)->asUnionType() - ); - - $right_can_cast_to_array = $right->canCastToUnionType( - ArrayType::instance(false)->asUnionType() - ); - - if ($left_is_array_like - && !$right->hasArrayLike() - && !$right_can_cast_to_array - && !$right->isEmpty() - && !$right->containsNullable() - && !$left->hasAnyType($right->getTypeSet()) // TODO: Strict canCastToUnionType() variant? - ) { - $this->emitIssue( - Issue::TypeComparisonFromArray, - $node->lineno ?? 0, - (string)$right->asNonLiteralType() - ); - } elseif ($right_is_array_like - && !$left->hasArrayLike() - && !$left_can_cast_to_array - && !$left->isEmpty() - && !$left->containsNullable() - && !$right->hasAnyType($left->getTypeSet()) // TODO: Strict canCastToUnionType() variant? - - ) { - $this->emitIssue( - Issue::TypeComparisonToArray, - $node->lineno ?? 0, - (string)$left->asNonLiteralType() - ); - } - - return BoolType::instance(false)->asUnionType(); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryIsIdentical(Node $node) : UnionType - { - return $this->visitBinaryOpCommon($node); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryIsNotIdentical(Node $node) : UnionType - { - return $this->visitBinaryOpCommon($node); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryIsEqual(Node $node) : UnionType - { - return $this->visitBinaryOpCommon($node); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryIsNotEqual(Node $node) : UnionType - { - return $this->visitBinaryOpCommon($node); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryIsSmaller(Node $node) : UnionType - { - return $this->visitBinaryOpCommon($node); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryIsSmallerOrEqual(Node $node) : UnionType - { - return $this->visitBinaryOpCommon($node); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryIsGreater(Node $node) : UnionType - { - return $this->visitBinaryOpCommon($node); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryIsGreaterOrEqual(Node $node) : UnionType - { - return $this->visitBinaryOpCommon($node); - } - - /** - * @param Node $node with type AST_BINARY_OP - * @param Closure(Type):bool $is_valid_type - * @return void - */ - private function warnAboutInvalidUnionType( - Node $node, - Closure $is_valid_type, - UnionType $left, - UnionType $right, - string $left_issue_type, - string $right_issue_type - ) { - if (!$left->isEmpty()) { - if (!$left->hasTypeMatchingCallback($is_valid_type)) { - $this->emitIssue( - $left_issue_type, - $node->children['left']->lineno ?? $node->lineno, - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags], - $left - ); - } - } - if (!$right->isEmpty()) { - if (!$right->hasTypeMatchingCallback($is_valid_type)) { - $this->emitIssue( - $right_issue_type, - $node->children['right']->lineno ?? $node->lineno, - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags], - $right - ); - } - } - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - * @suppress PhanTypeMismatchArgumentNullable false positives for static initializing - */ - public function visitBinaryAdd(Node $node) : UnionType - { - $code_base = $this->code_base; - $context = $this->context; - $left = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node->children['left'], - $this->should_catch_issue_exception - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node->children['right'], - $this->should_catch_issue_exception - ); - - // fast-track common cases - if ($left->isNonNullIntType() && $right->isNonNullIntType()) { - return self::computeIntegerOperationResult($node, $left, $right); - } - - // If both left and right union types are arrays, then this is array - // concatenation. - if ($left->isGenericArray() && $right->isGenericArray()) { - if ($left->isEqualTo($right)) { - return $left; - } - return ArrayType::combineArrayTypesOverriding($left, $right); - } - - $this->warnAboutInvalidUnionType( - $node, - static function (Type $type) : bool { - return $type->isValidNumericOperand() || $type instanceof ArrayType; - }, - $left, - $right, - Issue::TypeInvalidLeftOperandOfAdd, - Issue::TypeInvalidRightOperandOfAdd - ); - - static $float_type = null; - static $array_type = null; - static $int_or_float_union_type = null; - if ($int_or_float_union_type === null) { - $float_type = FloatType::instance(false); - $array_type = ArrayType::instance(false); - $int_or_float_union_type = new UnionType([ - IntType::instance(false), - $float_type - ]); - } - - if ($left->isNonNullNumberType() && $right->isNonNullNumberType()) { - if (!$left->hasNonNullIntType() || !$right->hasNonNullIntType()) { - // Heuristic: If one or more of the sides is a float, the result is always a float. - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $float_type->asUnionType(); - } - return $int_or_float_union_type; - } - - $left_is_array = ( - !$left->genericArrayElementTypes()->isEmpty() - && $left->nonArrayTypes()->isEmpty() - ) || $left->isType($array_type); - // @phan-suppress-previous-line PhanTypeMismatchArgumentNullable false positive for static initialization - - $right_is_array = ( - !$right->genericArrayElementTypes()->isEmpty() - && $right->nonArrayTypes()->isEmpty() - ) || $right->isType($array_type); - // @phan-suppress-previous-line PhanTypeMismatchArgumentNullable false positive for static initialization - - if ($left_is_array || $right_is_array) { - if ($left_is_array && $right_is_array) { - // TODO: Make the right types for array offsets completely override the left types? - return ArrayType::combineArrayTypesOverriding($left, $right); - } - - if ($left_is_array - && !$right->canCastToUnionType( - ArrayType::instance(false)->asUnionType() - ) - ) { - $this->emitIssue( - Issue::TypeInvalidRightOperand, - $node->lineno ?? 0 - ); - return UnionType::empty(); - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - } elseif ($right_is_array && !$left->canCastToUnionType($array_type->asUnionType())) { - $this->emitIssue( - Issue::TypeInvalidLeftOperand, - $node->lineno ?? 0 - ); - return UnionType::empty(); - } - // If it is a '+' and we know one side is an array - // and the other is unknown, assume array - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $array_type->asUnionType(); - } - - return $int_or_float_union_type; - } - - /** - * Analyzes the result of a floating-point or integer arithmetic operation. - * The result will be a combination of 'int' or 'float' - * - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - private function getTypeOfNumericArithmeticOp(Node $node) : UnionType - { - $code_base = $this->code_base; - $context = $this->context; - $left = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node->children['left'], - $this->should_catch_issue_exception - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node->children['right'], - $this->should_catch_issue_exception - ); - - // fast-track common cases - if ($left->isNonNullIntType() && $right->isNonNullIntType()) { - return self::computeIntegerOperationResult($node, $left, $right); - } - - $this->warnAboutInvalidUnionType( - $node, - static function (Type $type) : bool { - // TODO: Stricten this to warn about strings based on user config. - return $type->isValidNumericOperand(); - }, - $left, - $right, - Issue::TypeInvalidLeftOperandOfNumericOp, - Issue::TypeInvalidRightOperandOfNumericOp - ); - - static $float_type = null; - static $int_or_float_union_type = null; - if ($int_or_float_union_type === null) { - $float_type = FloatType::instance(false); - $int_or_float_union_type = new UnionType([ - IntType::instance(false), - $float_type - ]); - } - - if ($left->isNonNullNumberType() && $right->isNonNullNumberType()) { - if (!$left->hasNonNullIntType() || !$right->hasNonNullIntType()) { - // Heuristic: If one or more of the sides is a float, the result is always a float. - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $float_type->asUnionType(); - } - return $int_or_float_union_type; - } - - // TODO: warn about subtracting to/from non-number - - return $int_or_float_union_type; - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinarySub(Node $node) : UnionType - { - return $this->getTypeOfNumericArithmeticOp($node); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryMul(Node $node) : UnionType - { - return $this->getTypeOfNumericArithmeticOp($node); - } - - /** - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryPow(Node $node) : UnionType - { - return $this->getTypeOfNumericArithmeticOp($node); - } - - /** - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryMod(Node $unused_node) - { - // TODO: Warn about invalid left or right side - return IntType::instance(false)->asUnionType(); - } - - /** - * Common visitor for binary boolean operations - * - * @param Node $node - * A node to check types on - * - * @return UnionType - * The resulting type(s) of the binary operation - */ - public function visitBinaryCoalesce(Node $node) : UnionType - { - $left_node = $node->children['left']; - $left_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $left_node, - $this->should_catch_issue_exception - ); - if (!($left_node instanceof Node)) { - // TODO: Warn about this being an unnecessary coalesce operation - // TODO: Be more aggressive for constants, etc, when we are very sure the type is accurate. - return $left_type; - } - - $right_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['right'], - $this->should_catch_issue_exception - ); - - // On the left side, remove null and replace '?T' with 'T' - // Don't bother if the right side contains null. - if (!$right_type->isEmpty() && $left_type->containsNullable() && !$right_type->containsNullable()) { - $left_type = $left_type->nonNullableClone(); - } - - return $left_type->withUnionType($right_type); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/BlockExitStatusChecker.php b/vendor/phan/phan/src/Phan/Analysis/BlockExitStatusChecker.php deleted file mode 100644 index bff814b..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/BlockExitStatusChecker.php +++ /dev/null @@ -1,651 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use AssertionError; -use ast\Node; -use Phan\AST\Visitor\KindVisitorImplementation; - -use function count; - -/** - * This checks what exit statuses are possible for AST nodes: `break;`, `continue;`, `throw`, `return`, proceeding, etc. - * - * This caches the status for AST nodes, so references to this object - * should be removed once the source transformation of a file/function is complete. - * - * This uses the \ast\Node's themselves in order to cache the status. - * It reuses $node->flags whenever possible in order to avoid keeping around \ast\Node - * instances for longer than those would be used. - * This assumes that Nodes aren't manipulated, or manipulations to Nodes will preserve the semantics (including computed exit status) or clear $node->flags. - * - * - Creating an additional object property would increase overall memory usage, which is why properties are used. - * - AST_IF, AST_IF_ELEM, AST_DO_WHILE, AST_FOR, AST_WHILE, AST_STMT_LIST, - * etc (e.g. switch and switch case, try/finally). - * are node types which are known to not have flags in AST version 40. - * - In the future, add a new property such as $node->children['__exitStatus'] if used for a node type with flags, or use the higher bits. - * - * TODO: Change to AnalysisVisitor if this ever emits issues. - * TODO: Analyze switch (if there is a default) in another PR (And handle fallthrough) - * - * @phan-file-suppress PhanUnusedPublicFinalMethodParameter - * @phan-file-suppress PhanPartialTypeMismatchArgument - */ -final class BlockExitStatusChecker extends KindVisitorImplementation -{ - // These should be at most 1 << 31, in order to work in 32-bit php. - // NOTE: Any exit status must be a combination of at least one of these bits - // E.g. if STATUS_PROCEED is mixed with STATUS_RETURN, it would mean it is possible both to go to completion or return. - const STATUS_PROCEED = (1 << 20); // At least one branch continues to completion. - const STATUS_GOTO = (1 << 21); // At least one branch leads to a goto statement - const STATUS_CONTINUE = (1 << 22); // At least one branch leads to a continue statement - const STATUS_BREAK = (1 << 23); // At least one branch leads to a break statement - const STATUS_THROW = (1 << 24); // At least one branch leads to a throw statement - const STATUS_RETURN = (1 << 25); // At least one branch leads to a return/exit() statement (or an infinite loop) - - const STATUS_THROW_OR_RETURN_BITMASK = - self::STATUS_THROW | - self::STATUS_RETURN; - - // Any status which doesn't lead to proceeding. - const STATUS_NOT_PROCEED_BITMASK = - self::STATUS_GOTO | - self::STATUS_CONTINUE | - self::STATUS_BREAK | - self::STATUS_THROW | - self::STATUS_RETURN; - - const STATUS_BITMASK = - self::STATUS_PROCEED | - self::STATUS_NOT_PROCEED_BITMASK; - - const STATUS_MAYBE_PROCEED = - self::STATUS_PROCEED | - self::STATUS_GOTO; - - public function __construct() - { - } - - /** - * Computes the bitmask representing the possible ways this block of code might exit. - * - * This currently does not handle goto or `break N` comprehensively. - */ - public function check(Node $node = null) : int - { - if (!$node) { - return self::STATUS_PROCEED; - } - $result = $this->__invoke($node); - if (!\is_int($result) || $result <= 0) { - throw new AssertionError('Expected positive int'); - } - return $result; - } - - /** - * If we don't know how to analyze a node type (or left it out), assume it always proceeds - * @return int - The status bitmask corresponding to always proceeding - */ - public function visit(Node $node) - { - return self::STATUS_PROCEED; - } - - /** - * @param Node|string|int|float $cond - */ - private static function isTruthyLiteral($cond) : bool - { - if ($cond instanceof Node) { - // TODO: Could look up values for remaining constants and inline expressions, but doing that has low value. - if ($cond->kind === \ast\AST_CONST) { - $cond_name = $cond->children['name']; - if ($cond_name->kind === \ast\AST_NAME) { - $cond_name_string = $cond_name->children['name']; - return \is_string($cond_name_string) && \strcasecmp($cond_name_string, 'true') === 0; - } - } - return false; - } - // Cast string, int, etc. literal to a bool - return (bool)$cond; - } - - /** - * A break statement unconditionally breaks out of a loop/switch - * @return int the corresponding status code - */ - public function visitBreak(Node $node) - { - return self::STATUS_BREAK; - } - - /** - * A continue statement unconditionally continues out of a loop/switch. - * TODO: Make this account for levels - * @return int the corresponding status code - */ - public function visitContinue(Node $node) - { - return self::STATUS_CONTINUE; - } - - /** - * A throw statement unconditionally throws - * @return int the corresponding status code - */ - public function visitThrow(Node $node) - { - return self::STATUS_THROW; - } - - /** - * @return int the corresponding status code for the try/catch/finally block - */ - public function visitTry(Node $node) - { - $status = $node->flags & self::STATUS_BITMASK; - if ($status) { - return $status; - } - $status = $this->computeStatusOfTry($node); - $node->flags = $status; - return $status; - } - - private function computeStatusOfTry(Node $node) : int - { - $main_status = $this->check($node->children['try']); - // Finding good heuristics is difficult. - // e.g. "return someFunctionThatMayThrow()" in try{} block would be inferred as STATUS_RETURN, but may actually be STATUS_THROW - - $finally_node = $node->children['finally']; - if ($finally_node) { - $finally_status = $this->check($finally_node); - // TODO: Could emit an issue as a side effect - // Having any sort of status in a finally statement is - // likely to have unintuitive behavior. - if ($finally_status & (~self::STATUS_THROW_OR_RETURN_BITMASK) === 0) { - return $finally_status; - } - } else { - $finally_status = self::STATUS_PROCEED; - } - $catches_node = $node->children['catches']; - if (\count($catches_node->children) == 0) { - return self::mergeFinallyStatus($main_status, $finally_status); - } - // TODO: Could enhance slightly by checking for catch nodes with the exact same types (or subclasses) as names of exception thrown. - $combined_status = self::mergeFinallyStatus($main_status, $finally_status) | $this->visitCatchList($catches_node); - if (($finally_status & self::STATUS_PROCEED) === 0) { - $combined_status &= ~self::STATUS_PROCEED; - } - // No idea. - return $combined_status; - } - - /** - * @return int the corresponding status code - */ - public function visitCatchList(Node $node) - { - $status = $node->flags & self::STATUS_BITMASK; - if ($status) { - return $status; - } - $status = $this->computeStatusOfCatchList($node); - $node->flags = $status; - return $status; - } - - private function computeStatusOfCatchList(Node $node) : int - { - $catch_list = $node->children; - if (count($catch_list) === 0) { - return self::STATUS_PROCEED; // status probably won't matter - } - // TODO: Could enhance slightly by checking for catch nodes with the exact same types (or subclasses) as names of exception thrown. - $combined_status = 0; - // Try to cover all possible cases, such as try { return throwsException(); } catch(Exception $e) { break; } - foreach ($node->children as $catch_node) { - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this is never null for catch nodes - $catch_node_status = $this->visitStmtList($catch_node->children['stmts']); - $combined_status |= $catch_node_status; - } - // No idea. - return $combined_status; - } - - private static function mergeFinallyStatus(int $try_status, int $finally_status) : int - { - // If at least one of try or finally are guaranteed not to proceed to completion, - // then combine those possibilities. - if (($try_status & $finally_status & self::STATUS_PROCEED) === 0) { - return ($try_status | $finally_status) & ~self::STATUS_PROCEED; - } - return $try_status | $finally_status; - } - - /** - * @return int the corresponding status code - */ - public function visitSwitch(Node $node) - { - $status = $node->flags & self::STATUS_BITMASK; - if ($status) { - return $status; - } - $status = $this->computeStatusOfSwitch($node); - $node->flags = $status; - return $status; - } - - private function computeStatusOfSwitch(Node $node) : int - { - $switch_stmt_case_nodes = $node->children['stmts']->children; - if (\count($switch_stmt_case_nodes) === 0) { - return self::STATUS_PROCEED; - } - $has_default = false; - $combined_statuses = 0; - foreach ($switch_stmt_case_nodes as $index => $case_node) { - if ($case_node->children['cond'] === null) { - $has_default = true; - } - $case_status = self::getStatusOfSwitchCase($case_node, $index, $switch_stmt_case_nodes); - if (($case_status & self::STATUS_CONTINUE_OR_BREAK) !== 0) { - // Ignore statuses such as break/continue. They take effect inside, but are a proceed status outside - $case_status = ($case_status & ~self::STATUS_CONTINUE_OR_BREAK) | self::STATUS_PROCEED; - } - $combined_statuses |= $case_status; - } - if (!$has_default) { - $combined_statuses |= self::STATUS_PROCEED; - } - return $combined_statuses; - } - - /** - * @param array<int,Node> $siblings - */ - private function getStatusOfSwitchCase(Node $case_node, int $index, array $siblings) : int - { - $status = $case_node->flags & self::STATUS_BITMASK; - if ($status) { - return $status; - } - $status = $this->computeStatusOfSwitchCase($case_node, $index, $siblings); - $case_node->flags = $status; - return $status; - } - - /** - * @param array<mixed,Node|int|string|float> $siblings - */ - private function computeStatusOfSwitchCase(Node $case_node, int $index, array $siblings) : int - { - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this is never null - $status = $this->visitStmtList($case_node->children['stmts']); - if (($status & self::STATUS_PROCEED) === 0) { - // Check if the current switch case will not fall through. - return $status; - } - $next_sibling = $siblings[$index + 1] ?? null; - if (!$next_sibling) { - return $status; - } - $next_status = self::getStatusOfSwitchCase($next_sibling, $index + 1, $siblings); - // Combine the possibilities. - // e.g. `case 1: if (cond()) { return; } case 2: throw;`, case 1 will either break or throw, - // but won't proceed normally to the outside of the switch statement. - return ($status & ~self::STATUS_PROCEED) | $next_status; - } - - const UNEXITABLE_LOOP_INNER_STATUS = self::STATUS_PROCEED | self::STATUS_CONTINUE; - - const STATUS_CONTINUE_OR_BREAK = self::STATUS_CONTINUE | self::STATUS_BREAK; - - /** - * @return int - */ - public function visitForeach(Node $node) - { - // We assume foreach loops are over a finite sequence, and that it's possible for that sequence to have at least one element. - $inner_status = $this->check($node->children['stmts']); - - - // 1. break/continue apply to the inside of a loop, not outside. Not going to analyze "break 2;", may emit an info level issue in the future. - // 2. We assume that it's possible that any given loop can have 0 iterations. - // A TODO exists above to check for special cases. - return ($inner_status & ~self::STATUS_CONTINUE_OR_BREAK) | self::STATUS_PROCEED; - } - - /** - * @return int - */ - public function visitWhile(Node $node) - { - $inner_status = $this->check($node->children['stmts']); - // TODO: Check for unconditionally false conditions. - if (self::isTruthyLiteral($node->children['cond'])) { - // Use a special case to analyze "while (1) {exprs}" or "for (; true; ) {exprs}" - // TODO: identify infinite loops, mark those as STATUS_NO_PROCEED or STATUS_RETURN. - return self::computeDerivedStatusOfInfiniteLoop($inner_status); - } - // This is (to our awareness) **not** an infinite loop - - - // 1. break/continue apply to the inside of a loop, not outside. Not going to analyze "break 2;", may emit an info level issue in the future. - // 2. We assume that it's possible that any given loop can have 0 iterations. - // A TODO exists above to check for special cases. - return ($inner_status & ~self::STATUS_CONTINUE_OR_BREAK) | self::STATUS_PROCEED; - } - - /** - * @return int the corresponding status code - */ - public function visitFor(Node $node) - { - $inner_status = $this->check($node->children['stmts']); - // for loops have an expression list as a condition. - $cond_nodes = $node->children['cond']->children ?? []; // NOTE: $node->children['cond'] is null for the expression `for (;;)` - // TODO: Check for unconditionally false conditions. - if (count($cond_nodes) === 0 || self::isTruthyLiteral(\end($cond_nodes))) { - // Use a special case to analyze "while (1) {exprs}" or "for (; true; ) {exprs}" - // TODO: identify infinite loops, mark those as STATUS_NO_PROCEED or STATUS_RETURN. - return self::computeDerivedStatusOfInfiniteLoop($inner_status); - } - // This is (to our awareness) **not** an infinite loop - - - // 1. break/continue apply to the inside of a loop, not outside. Not going to analyze "break 2;", may emit an info level issue in the future. - // 2. We assume that it's possible that any given loop can have 0 iterations. - // A TODO exists above to check for special cases. - return ($inner_status & ~self::STATUS_CONTINUE_OR_BREAK) | self::STATUS_PROCEED; - // TODO: Improve this by checking for loops which almost definitely have at least one iteration, - // such as "foreach ([$val] as $v)" or "for ($i = 0; $i < 10; $i++)" - - // if (($inner_status & ~self::STATUS_THROW_OR_RETURN_BITMASK) === 0) { - // // The inside of the loop will unconditionally throw or return. - // return $inner_status - // } - } - - // Logic to determine status of "while (1) {exprs}" or "for (; true; ) {exprs}" - // TODO: identify infinite loops, mark those as STATUS_NO_PROCEED or STATUS_RETURN. - private static function computeDerivedStatusOfInfiniteLoop(int $inner_status) : int - { - $status = $inner_status & ~self::UNEXITABLE_LOOP_INNER_STATUS; - if ($status === 0) { - return self::STATUS_RETURN; // this is an infinite loop, it didn't contain break/throw/return statements? - } - if (($status & self::STATUS_BREAK) !== 0) { - // if the inside of "while (true) {} contains a break statement, - // then execution can proceed past the end of the loop. - return ($status & ~self::STATUS_BREAK) | self::STATUS_PROCEED; - } - return $status; - } - - /** - * A return statement unconditionally returns (Assume expression passed in doesn't throw) - * @return int the corresponding status code - */ - public function visitReturn(Node $node) - { - return self::STATUS_RETURN; - } - - /** - * An exit statement unconditionally exits (Assume expression passed in doesn't throw) - * @return int the corresponding status code - */ - public function visitExit(Node $node) - { - return self::STATUS_RETURN; - } - - /** - * @return int the corresponding status code - */ - public function visitUnaryOp(Node $node) - { - // Don't modify $node->flags, use unmodified flags here - if ($node->flags !== \ast\flags\UNARY_SILENCE) { - return self::STATUS_PROCEED; - } - // Analyze exit status of `@expr` like `expr` (e.g. @trigger_error()) - $expr = $node->children['expr']; - if (!($expr instanceof Node)) { - return self::STATUS_PROCEED; - } - return $this->__invoke($expr); - } - - /** - * Determines the exit status of a function call, such as trigger_error() - * - * NOTE: A trigger_error() statement may or may not exit, depending on the constant and user configuration. - * @return int the corresponding status code - */ - public function visitCall(Node $node) - { - $status = $node->flags & self::STATUS_BITMASK; - if ($status) { - return $status; - } - $status = $this->computeStatusOfCall($node); - $node->flags = $status; - return $status; - } - - private function computeStatusOfCall(Node $node) : int - { - $expression = $node->children['expr']; - if ($expression instanceof Node) { - if ($expression->kind !== \ast\AST_NAME) { - return self::STATUS_PROCEED; // best guess - } - $function_name = $expression->children['name']; - if (!\is_string($function_name)) { - return self::STATUS_PROCEED; - } - } else { - if (!\is_string($expression)) { - return self::STATUS_THROW; // Probably impossible. - } - $function_name = $expression; - } - if (!$function_name) { - return self::STATUS_THROW; // nonsense such as ''(); - } - if ($function_name[0] === '\\') { - $function_name = \substr($function_name, 1); - } - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - if (\strcasecmp($function_name, 'trigger_error') === 0) { - return self::computeTriggerErrorStatusCodeForConstant($node->children['args']->children[1] ?? null); - } - // TODO: Could allow .phan/config.php or plugins to define additional behaviors, e.g. for methods. - // E.g. if (!$var) {HttpFramework::generate_302_and_die(); } - return self::STATUS_PROCEED; - } - - /** - * @param Node|string|int|float $constant_ast - */ - private static function computeTriggerErrorStatusCodeForConstant($constant_ast) : int - { - // return PROCEED if this can't be determined. - // TODO: Could check for integer literals - if (!($constant_ast instanceof Node)) { - return self::STATUS_PROCEED; - } - if ($constant_ast->kind !== \ast\AST_CONST) { - return self::STATUS_PROCEED; - } - $name = $constant_ast->children['name']->children['name'] ?? null; - if (!\is_string($name)) { - return self::STATUS_PROCEED; - } - if (\in_array($name, ['E_ERROR', 'E_PARSE', 'E_CORE_ERROR', 'E_COMPILE_ERROR', 'E_USER_ERROR'], true)) { - return self::STATUS_RETURN; - } - if ($name === 'E_RECOVERABLE_ERROR') { - return self::STATUS_THROW; - } - - return self::STATUS_PROCEED; // Assume this is a warning or notice? - } - - /** - * A statement list has the weakest return status out of all of the (non-PROCEEDing) statements. - * FIXME: This is buggy, doesn't account for one statement having STATUS_CONTINUE some of the time but not all of it. - * (We don't check for STATUS_CONTINUE yet, so this doesn't matter yet.) - * @return int the corresponding status code - */ - public function visitStmtList(Node $node) - { - $status = $node->flags & self::STATUS_BITMASK; - if ($status) { - return $status; - } - $status = $this->computeStatusOfBlock($node->children); - $node->flags = $status; - return $status; - } - - /** - * Analyzes a node with kind \ast\AST_IF - * @return int the exit status of a block (whether or not it would unconditionally exit, return, throw, etc. - * @override - */ - public function visitIf(Node $node) - { - $status = $node->flags & self::STATUS_BITMASK; - if ($status) { - return $status; - } - $status = $this->computeStatusOfIf($node); - $node->flags = $status; - return $status; - } - - private function computeStatusOfIf(Node $node) : int - { - $has_if_elems_for_all_cases = false; - $combined_statuses = 0; - foreach ($node->children as $child_node) { - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this is never null - $status = $this->visitStmtList($child_node->children['stmts']); - $combined_statuses |= $status; - - $cond_node = $child_node->children['cond']; - // check for "else" or "elseif (true)" - if ($cond_node === null || self::isTruthyLiteral($cond_node)) { - $has_if_elems_for_all_cases = true; - break; - } - } - if (!$has_if_elems_for_all_cases) { - $combined_statuses |= self::STATUS_PROCEED; - } - return $combined_statuses; - } - - - /** - * Analyzes a node with kind \ast\AST_DO_WHILE - * @return int the exit status of a block (whether or not it would unconditionally exit, return, throw, etc. - */ - public function visitDoWhile(Node $node) - { - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this is never null - $inner_status = $this->visitStmtList($node->children['stmts']); - if (($inner_status & ~self::STATUS_THROW_OR_RETURN_BITMASK) === 0) { - // The inner block throws or returns before the end can be reached. - return $inner_status; - } - // TODO: Check for unconditionally false conditions. - if (self::isTruthyLiteral($node->children['cond'])) { - // Use a special case to analyze "while (1) {exprs}" or "for (; true; ) {exprs}" - // TODO: identify infinite loops, mark those as STATUS_NO_PROCEED or STATUS_RETURN. - return $this->computeDerivedStatusOfInfiniteLoop($inner_status); - } - // This is (to our awareness) **not** an infinite loop - - - // 1. break/continue apply to the inside of a loop, not outside. Not going to analyze "break 2;", may emit an info level issue in the future. - // 2. We assume that it's possible that any given loop can have 0 iterations. - // A TODO exists above to check for special cases. - return ($inner_status & ~self::STATUS_CONTINUE_OR_BREAK) | self::STATUS_PROCEED; - } - - /** - * Analyzes a node with kind \ast\AST_IF_ELEM - * @return int the exit status of a block (whether or not it would unconditionally exit, return, throw, etc. - */ - public function visitIfElem(Node $node) - { - $status = $node->flags & self::STATUS_BITMASK; - if ($status) { - return $status; - } - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this is never null - $status = $this->visitStmtList($node->children['stmts']); - $node->flags = $status; - return $status; - } - - /** - * @return int the corresponding status code - */ - public function visitGoto(Node $node) - { - return self::STATUS_GOTO; - } - - /** - * @param array<int,Node> $block - * @return int the exit status of a block (whether or not it would unconditionally exit, return, throw, etc. - */ - private function computeStatusOfBlock(array $block) : int - { - $maybe_status = 0; - foreach ($block as $child) { - if ($child === null) { - continue; - } - // e.g. can be non-Node for statement lists such as `if ($a) { return; }echo "X";2;` (under unknown conditions) - if (!($child instanceof Node)) { - continue; - } - $status = $this->check($child); - if (($status & self::STATUS_PROCEED) === 0) { - // If it's guaranteed we won't stop after this statement, - // then skip the subsequent statements. - return $status | ($maybe_status & ~self::STATUS_PROCEED); - } - $maybe_status |= $status; - } - return self::STATUS_PROCEED | $maybe_status; - } - - /** - * Will the node $node unconditionally never fall through to the following statement? - */ - public static function willUnconditionallySkipRemainingStatements(Node $node) : bool - { - return ((new self())->__invoke($node) & self::STATUS_MAYBE_PROCEED) === 0; - } - - /** - * Will the node $node unconditionally throw or return (or exit), - */ - public static function willUnconditionallyThrowOrReturn(Node $node) : bool - { - return ((new self())->__invoke($node) & ~self::STATUS_THROW_OR_RETURN_BITMASK) === 0; - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ClassInheritanceAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/ClassInheritanceAnalyzer.php deleted file mode 100644 index af33817..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ClassInheritanceAnalyzer.php +++ /dev/null @@ -1,170 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use Phan\CodeBase; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Element\Clazz; -use Phan\Language\FQSEN\FullyQualifiedClassName; - -/** - * A checker for whether the given Clazz(class/trait/interface) properly inherits - * from its classes, traits, and/or interfaces. - */ -class ClassInheritanceAnalyzer -{ - /** - * Checks if the given Clazz(class/trait/interface) properly inherits - * from its classes, traits, and/or interfaces - * - * @return void - */ - public static function analyzeClassInheritance( - CodeBase $code_base, - Clazz $clazz - ) { - - // Don't worry about internal classes - if ($clazz->isPHPInternal()) { - return; - } - - if ($clazz->hasParentType()) { - $class_exists = self::fqsenExistsForClass( - $clazz->getParentClassFQSEN(), - $code_base, - $clazz, - Issue::UndeclaredExtendedClass - ); - - if ($class_exists) { - self::testClassAccess( - $clazz, - $clazz->getParentClass($code_base), - $code_base - ); - } - } - - foreach ($clazz->getInterfaceFQSENList() as $fqsen) { - $class_exists = self::fqsenExistsForClass( - $fqsen, - $code_base, - $clazz, - Issue::UndeclaredInterface - ); - - if ($class_exists) { - self::testClassAccess( - $clazz, - $code_base->getClassByFQSEN($fqsen), - $code_base - ); - } - } - - foreach ($clazz->getTraitFQSENList() as $fqsen) { - $class_exists = self::fqsenExistsForClass( - $fqsen, - $code_base, - $clazz, - Issue::UndeclaredTrait - ); - if ($class_exists) { - self::testClassAccess( - $clazz, - $code_base->getClassByFQSEN($fqsen), - $code_base - ); - } - } - } - - /** - * @return bool - * True if the FQSEN exists. If not, a log line is emitted - */ - private static function fqsenExistsForClass( - FullyQualifiedClassName $fqsen, - CodeBase $code_base, - Clazz $clazz, - string $issue_type - ) : bool { - if (!$code_base->hasClassWithFQSEN($fqsen)) { - $filter = null; - switch ($issue_type) { - case Issue::UndeclaredExtendedClass: - $filter = IssueFixSuggester::createFQSENFilterForClasslikeCategories($code_base, true, false, false); - break; - case Issue::UndeclaredTrait: - $filter = IssueFixSuggester::createFQSENFilterForClasslikeCategories($code_base, false, true, false); - break; - case Issue::UndeclaredInterface: - $filter = IssueFixSuggester::createFQSENFilterForClasslikeCategories($code_base, false, false, true); - break; - } - $suggestion = IssueFixSuggester::suggestSimilarClass($code_base, $clazz->getContext(), $fqsen, $filter); - - Issue::maybeEmitWithParameters( - $code_base, - $clazz->getContext(), - $issue_type, - $clazz->getFileRef()->getLineNumberStart(), - [(string)$fqsen], - $suggestion - ); - - return false; - } - - return true; - } - - /** - * @param Clazz $source_class - * The class accessing the $target_class - * - * @param Clazz $target_class - * The class being accessed from the $source_class - * - * @param CodeBase $code_base - * The code base in which both classes exist - */ - private static function testClassAccess( - Clazz $source_class, - Clazz $target_class, - CodeBase $code_base - ) { - if ($target_class->isNSInternal($code_base) - && !$target_class->isNSInternalAccessFromContext( - $code_base, - $source_class->getContext() - ) - ) { - Issue::maybeEmit( - $code_base, - $source_class->getContext(), - Issue::AccessClassInternal, - $source_class->getFileRef()->getLineNumberStart(), - (string)$target_class, - $target_class->getFileRef()->getFile(), - (string)$target_class->getFileRef()->getLineNumberStart() - ); - } - - /* - if ($target_class->isDeprecated()) { - Issue::maybeEmit( - $code_base, - $source_class->getContext(), - Issue::DeprecatedClass, - $source_class->getFileRef()->getLineNumberStart(), - (string)$target_class->getFQSEN(), - $target_class->getFileRef()->getFile(), - (string)$target_class->getFileRef()->getLineNumberStart() - ); - } - */ - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/CompositionAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/CompositionAnalyzer.php deleted file mode 100644 index 5809a9a..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/CompositionAnalyzer.php +++ /dev/null @@ -1,111 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use Phan\CodeBase; -use Phan\Exception\IssueException; -use Phan\Issue; -use Phan\Language\Element\Clazz; -use Phan\Language\UnionType; - -use function count; - -/** - * This analyzer checks if the signatures of inherited properties match - */ -class CompositionAnalyzer -{ - - /** - * Check to see if the signatures of inherited properties match - * - * @return void - */ - public static function analyzeComposition( - CodeBase $code_base, - Clazz $class - ) { - // Get the list of all inherited classes. - $inherited_class_list = - $class->getAncestorClassList($code_base); - - // No chance of failed composition if we don't inherit from - // lots of stuff. - if (count($inherited_class_list) < 2) { - return; - } - - // Since we're not necessarily getting this list of classes - // via getClass, we need to ensure that hydration has occurred. - $class->hydrate($code_base); - - // For each property, find out every inherited class that defines it - // and check to see if the types line up. - foreach ($class->getPropertyMap($code_base) as $property) { - try { - $property_union_type = $property->getUnionType(); - } catch (IssueException $_) { - $property_union_type = UnionType::empty(); - } - - // Check for that property on each inherited - // class/trait/interface - foreach ($inherited_class_list as $inherited_class) { - // Skip any classes/traits/interfaces not defining that - // property - if (!$inherited_class->hasPropertyWithName($code_base, $property->getName())) { - continue; - } - - // We don't call `getProperty` because that will create - // them in some circumstances. - $inherited_property_map = - $inherited_class->getPropertyMap($code_base); - - if (!isset($inherited_property_map[$property->getName()])) { - continue; - } - - // Get the inherited property - $inherited_property = - $inherited_property_map[$property->getName()]; - - // Figure out if this property type can cast to the - // inherited definition's type. - try { - $inherited_property_union_type = $inherited_property->getUnionType(); - } catch (IssueException $_) { - $inherited_property_union_type = UnionType::empty(); - } - $can_cast = - $property_union_type->canCastToExpandedUnionType( - $inherited_property_union_type, - $code_base - ); - - if ($can_cast) { - continue; - } - - // Don't emit an issue if the property suppresses the issue - // NOTE: The current context is the class, not either of the properties. - if ($property->checkHasSuppressIssueAndIncrementCount(Issue::IncompatibleCompositionProp)) { - continue; - } - - Issue::maybeEmit( - $code_base, - $property->getContext(), - Issue::IncompatibleCompositionProp, - $property->getFileRef()->getLineNumberStart(), - (string)$class->getFQSEN(), - (string)$inherited_class->getFQSEN(), - $property->getName(), - (string)$class->getFQSEN(), - $class->getFileRef()->getFile(), - $class->getFileRef()->getLineNumberStart() - ); - } - } - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor.php b/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor.php deleted file mode 100644 index 0c35fda..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor.php +++ /dev/null @@ -1,1073 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use ast; -use ast\flags; -use ast\Node; -use Closure; -use Phan\Analysis\ConditionVisitor\HasTypeCondition; -use Phan\Analysis\ConditionVisitor\NotHasTypeCondition; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\AST\Visitor\KindVisitorImplementation; -use Phan\BlockAnalysisVisitor; -use Phan\CodeBase; -use Phan\Exception\FQSENException; -use Phan\Exception\IssueException; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\BoolType; -use Phan\Language\Type\CallableType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\IterableType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\ObjectType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; -use Phan\Language\UnionTypeBuilder; -use Phan\Library\StringUtil; -use ReflectionMethod; - -/** - * A visitor that takes a Context and a Node for a condition and returns a Context that has been updated with that condition. - * - * @phan-file-suppress PhanUnusedClosureParameter - * TODO: if (a || b || c || d) might get really slow, due to creating both ConditionVisitor and NegatedConditionVisitor - */ -class ConditionVisitor extends KindVisitorImplementation implements ConditionVisitorInterface -{ - use ConditionVisitorUtil; - - /** - * @var Context - * The context in which the node we're going to be looking - * at exits. - */ - protected $context; - - /** - * @param CodeBase $code_base - * A code base needs to be passed in because we require - * it to be initialized before any classes or files are - * loaded. - * - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - */ - public function __construct( - CodeBase $code_base, - Context $context - ) { - $this->code_base = $code_base; - $this->context = $context; - } - - /** - * Default visitor for node kinds that do not have - * an overriding method - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visit(Node $node) : Context - { - $this->checkVariablesDefined($node); - return $this->context; - } - - /** - * Check if variables from within a generic condition are defined. - * @param Node $node - * A node to parse - * @return void - */ - private function checkVariablesDefined(Node $node) - { - while ($node->kind === ast\AST_UNARY_OP) { - $node = $node->children['expr']; - if (!($node instanceof Node)) { - return; - } - } - // Get the type just to make sure everything - // is defined. - UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node, - true - ); - } - - /** - * Check if variables from within isset are defined. - * @param Node $node - * A node to parse - * @return void - */ - private function checkVariablesDefinedInIsset(Node $node) - { - while ($node->kind === ast\AST_UNARY_OP) { - $node = $node->children['expr']; - if (!($node instanceof Node)) { - return; - } - } - if ($node->kind === ast\AST_DIM) { - $this->checkArrayAccessDefined($node); - return; - } - // Get the type just to make sure everything - // is defined. - UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node, - true - ); - } - - /** - * Analyzes (isset($x['field'])) - * @return void - * - * TODO: Add to NegatedConditionVisitor - */ - private function checkArrayAccessDefined(Node $node) - { - $code_base = $this->code_base; - $context = $this->context; - - // TODO: Infer that the offset exists after this check - UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node->children['dim'], - true - ); - // Check the array type to trigger TypeArraySuspicious - /* $array_type = */ - UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node->children['expr'], - true - ); - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitBinaryOp(Node $node) : Context - { - $flags = $node->flags; - switch ($flags) { - case flags\BINARY_BOOL_AND: - return $this->analyzeShortCircuitingAnd($node->children['left'], $node->children['right']); - case flags\BINARY_BOOL_OR: - return $this->analyzeShortCircuitingOr($node->children['left'], $node->children['right']); - case flags\BINARY_IS_IDENTICAL: - case flags\BINARY_IS_EQUAL: - // TODO: Could be more precise, and preserve 0, [], etc. for `$x == null` - $this->checkVariablesDefined($node); - return $this->analyzeAndUpdateToBeIdentical($node->children['left'], $node->children['right']); - case flags\BINARY_IS_NOT_IDENTICAL: - $this->checkVariablesDefined($node); - return $this->analyzeAndUpdateToBeNotIdentical($node->children['left'], $node->children['right']); - case flags\BINARY_IS_NOT_EQUAL: - return $this->analyzeAndUpdateToBeNotEqual($node->children['left'], $node->children['right']); - case flags\BINARY_IS_GREATER: - case flags\BINARY_IS_GREATER_OR_EQUAL: - case flags\BINARY_IS_SMALLER: - case flags\BINARY_IS_SMALLER_OR_EQUAL: - $this->checkVariablesDefined($node); - return $this->analyzeAndUpdateToBeCompared($node->children['left'], $node->children['right'], $flags); - default: - $this->checkVariablesDefined($node); - return $this->context; - } - } - - /** - * Helper method - * @param Node|mixed $left - * a Node or non-node to parse (possibly an AST literal) - * - * @param Node|mixed $right - * a Node or non-node to parse (possibly an AST literal) - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - private function analyzeShortCircuitingAnd($left, $right) : Context - { - // Aside: If left/right is not a node, left/right is a literal such as a number/string, and is either always truthy or always falsey. - // Inside of this conditional may be dead or redundant code. - if ($left instanceof Node) { - $this->context = $this->__invoke($left); - } - // TODO: Warn if !$left - if ($right instanceof Node) { - return $this->__invoke($right); - } - return $this->context; - } - - /** - * Helper method - * @param Node|mixed $left - * a Node or non-node to parse (possibly an AST literal) - * - * @param Node|mixed $right - * a Node or non-node to parse (possibly an AST literal) - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - private function analyzeShortCircuitingOr($left, $right) : Context - { - // Aside: If left/right is not a node, left/right is a literal such as a number/string, and is either always truthy or always falsey. - // Inside of this conditional may be dead or redundant code. - if (!($left instanceof Node)) { - if ($left) { - return $this->context; - } - return $this->__invoke($right); - } - if (!($right instanceof Node)) { - if ($right) { - return $this->context; - } - return $this->__invoke($left); - } - $code_base = $this->code_base; - $context = $this->context; - $left_false_context = (new NegatedConditionVisitor($code_base, $context))->__invoke($left); - $left_true_context = (new ConditionVisitor($code_base, $context))->__invoke($left); - // We analyze the right-hand side of `cond($x) || cond2($x)` as if `cond($x)` was false. - $right_true_context = (new ConditionVisitor($code_base, $left_false_context))->__invoke($right); - // When the ConditionVisitor is true, at least one of the left or right contexts must be true. - return (new ContextMergeVisitor($context, [$left_true_context, $right_true_context]))->combineChildContextList(); - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitUnaryOp(Node $node) : Context - { - $expr_node = $node->children['expr']; - $flags = $node->flags; - if ($flags !== flags\UNARY_BOOL_NOT) { - // TODO: Emit dead code issue for non-nodes - if ($expr_node instanceof Node) { - if ($flags === flags\UNARY_SILENCE) { - return $this->__invoke($expr_node); - } - $this->checkVariablesDefined($expr_node); - } - return $this->context; - } - // TODO: Emit dead code issue for non-nodes - if ($expr_node instanceof Node) { - return (new NegatedConditionVisitor($this->code_base, $this->context))->__invoke($expr_node); - } - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitIsset(Node $node) : Context - { - $var_node = $node->children['var']; - if (!($var_node instanceof Node)) { - return $this->context; - } - if ($var_node->kind !== ast\AST_VAR) { - return $this->checkComplexIsset($var_node); - } - - $var_name = $var_node->children['name']; - if (!\is_string($var_name)) { - $this->checkVariablesDefinedInIsset($var_node); - return $this->context; - } - return $this->withSetVariable($var_name, $var_node); - } - - /** - * From isset($var), infer that $var is non-null - * From isset($obj->prop['field']), infer that $obj is non-null - * Also infer that $obj is an object (don't do that for $obj['field']->prop) - */ - private function withSetVariable(string $var_name, Node $var_node) : Context - { - $context = $this->context; - $is_object = $var_node->kind === ast\AST_PROP; - - $scope = $context->getScope(); - if (!$scope->hasVariableWithName($var_name)) { - // Support analyzing cases such as `if (isset($x)) { use($x); }`, or `assert(isset($x))` - return $context->withScopeVariable(new Variable( - $context->withLineNumberStart($var_node->lineno ?? 0), - $var_name, - $is_object ? ObjectType::instance(false)->asUnionType() : UnionType::empty(), - 0 - )); - } - if ($is_object) { - $variable = clone($context->getScope()->getVariableByName($var_name)); - $this->analyzeIsObjectAssertion($variable); - $context = $this->modifyPropertySimple($var_node, static function (UnionType $type) : UnionType { - return $type->nonNullableClone(); - }, $context); - return $context->withScopeVariable($variable); - } - return $this->removeNullFromVariable($var_node, $context, true); - } - - /** - * @param Node $node a node that is NOT of type ast\AST_VAR - */ - private function checkComplexIsset(Node $node) : Context - { - // Loop to support getting the var name in is_array($x['field'][0]) - $has_prop_access = false; - $context = $this->context; - $var_node = $node; - $parent_node = $node; - while (true) { - $kind = $var_node->kind; - if ($kind === ast\AST_VAR) { - break; - } - $parent_node = $var_node; - if ($kind === ast\AST_DIM) { - $var_node = $var_node->children['expr']; - if (!$var_node instanceof Node) { - return $context; - } - continue; - } elseif ($kind == ast\AST_PROP) { - $has_prop_access = true; - $var_node = $var_node->children['expr']; - if (!$var_node instanceof Node) { - return $context; - } - continue; - } - - // TODO: Handle more than one level of nesting - return $context; - } - $var_name = $var_node->children['name']; - if (!is_string($var_name)) { - return $context; - } - if ($has_prop_access) { - // For `$x->prop['field'][0]`, $parent_node would be `$x->prop`. - // And for that expression, phan would infer that $var_name was non-null AND an object. - return $this->withSetVariable($var_name, $parent_node); - } - - // This is $x['field'] or $x[$i][something] - - if (!$context->getScope()->hasVariableWithName($var_name)) { - // Support analyzing cases such as `if (isset($x['key'])) { use($x); }`, or `assert(isset($x['key']))` - return $context->withScopeVariable(new Variable( - $context->withLineNumberStart($node->lineno ?? 0), - $var_name, - ArrayType::instance(false)->asUnionType(), - 0 - )); - } - $context = $this->removeNullFromVariable($var_node, $context, true); - - $variable = $context->getScope()->getVariableByName($var_name); - $var_node_union_type = $variable->getUnionType(); - - if ($var_node_union_type->hasTopLevelArrayShapeTypeInstances()) { - $new_union_type = $this->withSetArrayShapeTypes($var_node_union_type, $parent_node->children['dim'], $context, true); - if ($new_union_type !== $var_node_union_type) { - $variable = clone($variable); - $variable->setUnionType($new_union_type); - $context = $context->withScopeVariable($variable); - } - } - $this->context = $context; - return $context; - } - - /** - * @param UnionType $union_type the type being modified by inferences from isset or array_key_exists - * @param Node|string|float|int|bool $dim_node represents the dimension being accessed. (E.g. can be a literal or an AST_CONST, etc. - * @param Context $context the context with inferences made prior to this condition - * - * @param bool $non_nullable if an offset is created, will it be non-nullable? - */ - private function withSetArrayShapeTypes(UnionType $union_type, $dim_node, Context $context, bool $non_nullable) : UnionType - { - $dim_value = $dim_node instanceof Node ? (new ContextNode($this->code_base, $context, $dim_node))->getEquivalentPHPScalarValue() : $dim_node; - // TODO: detect and warn about null - if (!\is_scalar($dim_value)) { - return $union_type; - } - - $dim_union_type = UnionTypeVisitor::resolveArrayShapeElementTypesForOffset($union_type, $dim_value); - if (!$dim_union_type) { - // There are other types, this dimension does not exist yet - if (!$union_type->hasTopLevelArrayShapeTypeInstances()) { - return $union_type; - } - return ArrayType::combineArrayShapeTypesWithField($union_type, $dim_value, MixedType::instance(false)->asUnionType()); - } elseif ($dim_union_type->containsNullableOrUndefined()) { - if (!$non_nullable) { - // The offset in question already exists in the array shape type, and we won't be changing it. - // (E.g. array_key_exists('key', $x) where $x is array{key:?int,other:string}) - return $union_type; - } - - return ArrayType::combineArrayShapeTypesWithField($union_type, $dim_value, $dim_union_type->nonNullableClone()); - } - return $union_type; - } - - /** - * @param Node $node - * A node to parse, with kind ast\AST_VAR - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitVar(Node $node) : Context - { - $this->checkVariablesDefined($node); - return $this->removeFalseyFromVariable($node, $this->context, false); - } - - /** - * @param Node $node - * A node to parse, with kind ast\AST_PROP (e.g. `if ($this->prop_name)`) - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitProp(Node $node) : Context - { - $expr_node = $node->children['expr']; - if (!($expr_node instanceof Node)) { - return $this->context; - } - if ($expr_node->kind !== ast\AST_VAR || $expr_node->children['name'] !== 'this') { - return $this->context; - } - if (!\is_string($node->children['prop'])) { - return $this->context; - } - return $this->modifyPropertyOfThisSimple( - $node, - static function (UnionType $type) : UnionType { - return $type->nonFalseyClone(); - }, - $this->context - ); - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitInstanceof(Node $node) : Context - { - //$this->checkVariablesDefined($node); - // Only look at things of the form - // `$variable instanceof ClassName` - $context = $this->context; - $class_node = $node->children['class']; - if (!($class_node instanceof Node)) { - return $context; - } - $expr_node = $node->children['expr']; - if (!($expr_node instanceof Node) || $expr_node->kind !== ast\AST_VAR) { - return $this->modifyComplexExpression( - $expr_node, - /** - * @param array<int,mixed> $args - * @return void - */ - function (CodeBase $code_base, Context $context, Variable $variable, array $args) use ($class_node) { - $this->setInstanceofVariableType($variable, $class_node); - }, - $context, - [] - ); - } - - - try { - // Get the variable we're operating on - $variable = $this->getVariableFromScope($expr_node, $context); - if (\is_null($variable)) { - return $context; - } - // Make a copy of the variable - $variable = clone($variable); - $this->setInstanceofVariableType($variable, $class_node); - // Overwrite the variable with its new type - $context = $context->withScopeVariable( - $variable - ); - } catch (IssueException $exception) { - Issue::maybeEmitInstance($this->code_base, $context, $exception->getIssueInstance()); - } catch (\Exception $_) { - // Swallow it - } - - return $context; - } - - /** - * Modifies the union type of $variable in place - */ - private function setInstanceofVariableType(Variable $variable, Node $class_node) - { - // Get the type that we're checking it against - $type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $class_node - ); - $object_types = $type->objectTypes(); - if (!$object_types->isEmpty()) { - // We know that the variable is the provided object type (or a subclass) - // See https://secure.php.net/instanceof - - - // Add the type to the variable - $variable->setUnionType(self::calculateNarrowedUnionType($this->code_base, $variable->getUnionType(), $object_types)); - } else { - // We know that variable is some sort of object if this condition is true. - if ($class_node->kind !== ast\AST_NAME && - !$type->canCastToUnionType(StringType::instance(false)->asUnionType())) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeInvalidInstanceof, - $this->context->getLineNumberStart(), - (string)$type->asNonLiteralType() - ); - } - self::analyzeIsObjectAssertion($variable); - } - } - - /** - * E.g. Given subclass1|subclass2|false and base_class/base_interface, returns subclass1|subclass2 - * E.g. Given subclass1|mixed|false and base_class/base_interface, returns base_class/base_interface - */ - private static function calculateNarrowedUnionType(CodeBase $code_base, UnionType $old_type, UnionType $asserted_object_type) : UnionType - { - $result = UnionType::empty(); - foreach ($old_type->getTypeSet() as $type) { - if ($type instanceof MixedType) { - return $asserted_object_type; - } - if (!$type->isObject()) { - // ignore non-object types - continue; - } - if (!$type->isObjectWithKnownFQSEN()) { - return $asserted_object_type; - } - $type = $type->withIsNullable(false); - if (!$type->asExpandedTypes($code_base)->canCastToUnionType($asserted_object_type)) { - return $asserted_object_type; - } - $result = $result->withType($type); - } - if ($result->isEmpty()) { - return $asserted_object_type; - } - return $result; - } - - /** - * @param Variable $variable (Node argument in a call to is_object) - * @return void - */ - private static function analyzeIsObjectAssertion(Variable $variable) - { - // Change the type to match is_object relationship - // If we already have the `object` type or generic object types, then keep those - // (E.g. T|false becomes T, T[]|iterable|null becomes Traversable, object|bool becomes object) - $new_type_builder = new UnionTypeBuilder(); - foreach ($variable->getUnionType()->getTypeSet() as $type) { - if ($type->isObject()) { - $new_type_builder->addType($type->withIsNullable(false)); - continue; - } - if (\get_class($type) === IterableType::class) { - // An iterable is either an array or a Traversable. - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - $new_type_builder->addType(Type::traversableInstance()); - } - } - $variable->setUnionType($new_type_builder->isEmpty() ? ObjectType::instance(false)->asUnionType() : $new_type_builder->getUnionType()); - } - - /** - * This function is called once, and returns closures to modify the types of variables. - * - * This contains Phan's logic for inferring the resulting union types of variables, e.g. in \is_array($x). - * - * @return array<string,Closure> - The closures to call for a given global function - * @phan-return array<string,Closure(CodeBase, Context, Variable, array):void> - */ - private static function initTypeModifyingClosuresForVisitCall() : array - { - $make_basic_assertion_callback = static function (string $union_type_string) : Closure { - $asserted_union_type = UnionType::fromFullyQualifiedString( - $union_type_string - ); - $asserted_union_type_set = $asserted_union_type->getTypeSet(); - $empty_type = UnionType::empty(); - - /** - * @param array<int,Node|mixed> $args - * @return void - */ - return static function (CodeBase $unused_code_base, Context $unused_context, Variable $variable, array $args) use ($asserted_union_type, $asserted_union_type_set, $empty_type) { - $new_types = $empty_type; - foreach ($variable->getUnionType()->getTypeSet() as $type) { - $type = $type->withIsNullable(false); - if ($type->canCastToAnyTypeInSet($asserted_union_type_set)) { - $new_types = $new_types->withType($type); - } - } - - // Otherwise, overwrite the type for any simple - // primitive types. - $variable->setUnionType($new_types->isEmpty() ? $asserted_union_type : $new_types); - }; - }; - $make_direct_assertion_callback = static function (string $union_type_string) : Closure { - $asserted_union_type = UnionType::fromFullyQualifiedString( - $union_type_string - ); - /** - * @param array<int,Node|mixed> $args - * @return void - */ - return static function (CodeBase $unused_code_base, Context $unused_context, Variable $variable, array $args) use ($asserted_union_type) { - // Otherwise, overwrite the type for any simple - // primitive types. - $variable->setUnionType($asserted_union_type); - }; - }; - - $array_type = ArrayType::instance(false); - /** - * @param array<int,Node|mixed> $args - * @return void - */ - $array_callback = static function (CodeBase $code_base, Context $context, Variable $variable, array $args) use ($array_type) { - // Change the type to match the is_a relationship - // If we already have generic array types, then keep those - // (E.g. T[]|false becomes T[], ?array|null becomes array) - $new_type_builder = new UnionTypeBuilder(); - foreach ($variable->getUnionType()->getTypeSet() as $type) { - if ($type instanceof ArrayType) { - $new_type_builder->addType($type->withIsNullable(false)); - continue; - } - if (\get_class($type) === IterableType::class) { - // An iterable is either an array or a Traversable. - $new_type_builder->addType($array_type); - } - } - $variable->setUnionType($new_type_builder->isEmpty() ? $array_type->asUnionType() : $new_type_builder->getUnionType()); - }; - - /** - * @param array<int,Node|mixed> $args - * @return void - */ - $object_callback = static function (CodeBase $unused_code_base, Context $unused_context, Variable $variable, array $args) { - self::analyzeIsObjectAssertion($variable); - }; - /** - * @param array<int,Node|mixed> $args - * @return void - */ - $is_a_callback = static function (CodeBase $code_base, Context $context, Variable $variable, array $args) use ($object_callback) { - $class_name = $args[1] ?? null; - if ($class_name instanceof Node) { - $class_name = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $class_name)->asSingleScalarValueOrNull(); - } - if (!\is_string($class_name)) { - // Limit the types of $variable to an object if we can't infer the class name. - $object_callback($code_base, $context, $variable, $args); - return; - } - try { - $fqsen = FullyQualifiedClassName::fromFullyQualifiedString($class_name); - } catch (FQSENException $_) { - throw new IssueException(Issue::fromType(Issue::TypeComparisonToInvalidClass)( - $context->getFile(), - $context->getLineNumberStart(), - [StringUtil::encodeValue($class_name)] - )); - } - // TODO: validate argument - $class_type = $fqsen->asType()->asUnionType(); - $variable->setUnionType(self::calculateNarrowedUnionType($code_base, $variable->getUnionType(), $class_type)); - }; - - /** - * @param array<int,Node|mixed> $args - * @return void - */ - $scalar_callback = static function (CodeBase $unused_code_base, Context $unused_context, Variable $variable, array $args) { - // Change the type to match the is_a relationship - // If we already have possible scalar types, then keep those - // (E.g. T|false becomes bool, T becomes int|float|bool|string|null) - $new_type = $variable->getUnionType()->scalarTypes(); - if ($new_type->containsNullable()) { - $new_type = $new_type->nonNullableClone(); - } - if ($new_type->isEmpty()) { - // If there are no inferred types, or the only type we saw was 'null', - // assume there this can be any possible scalar. - // (Excludes `resource`, which is technically a scalar) - $new_type = UnionType::fromFullyQualifiedString('int|float|bool|string'); - } - $variable->setUnionType($new_type); - }; - /** - * @param string $extract_types - * @param UnionType $default_if_empty - * @return Closure(CodeBase,Context,Variable,array):void - */ - $make_callback = static function (string $extract_types, UnionType $default_if_empty) : Closure { - $method = new ReflectionMethod(UnionType::class, $extract_types); - /** - * @param array<int,Node|mixed> $args - * @return void - */ - return static function (CodeBase $unused_code_base, Context $unused_context, Variable $variable, array $args) use ($method, $default_if_empty) { - // Change the type to match the is_a relationship - // If we already have possible callable types, then keep those - // (E.g. Closure|false becomes Closure) - $new_type = $method->invoke($variable->getUnionType()); - if ($new_type->isEmpty()) { - // If there are no inferred types, or the only type we saw was 'null', - // assume there this can be any possible scalar. - // (Excludes `resource`, which is technically a scalar) - $new_type = $default_if_empty; - } elseif ($new_type->containsNullable()) { - $new_type = $new_type->nonNullableClone(); - } - $variable->setUnionType($new_type); - }; - }; - /** @return void */ - $callable_callback = $make_callback('callableTypes', CallableType::instance(false)->asUnionType()); - $bool_callback = $make_callback('getTypesInBoolFamily', BoolType::instance(false)->asUnionType()); - $int_callback = $make_callback('intTypes', IntType::instance(false)->asUnionType()); - $string_callback = $make_callback('stringTypes', StringType::instance(false)->asUnionType()); - $numeric_callback = $make_callback('numericTypes', UnionType::fromFullyQualifiedString('string|int|float')); - - // Note: LiteralIntType exists, but LiteralFloatType doesn't, which is why these are different. - $float_callback = $make_direct_assertion_callback('float'); - $null_callback = $make_direct_assertion_callback('null'); - // Note: isset() is handled in visitIsset() - - return [ - 'is_a' => $is_a_callback, - 'is_array' => $array_callback, - 'is_bool' => $bool_callback, - 'is_callable' => $callable_callback, - 'is_double' => $float_callback, - 'is_float' => $float_callback, - 'is_int' => $int_callback, - 'is_integer' => $int_callback, - 'is_iterable' => $make_basic_assertion_callback('iterable'), // TODO: Could keep basic array types and classes extending iterable - 'is_long' => $int_callback, - 'is_null' => $null_callback, - 'is_numeric' => $numeric_callback, - 'is_object' => $object_callback, - 'is_real' => $float_callback, - 'is_resource' => $make_direct_assertion_callback('resource'), - 'is_scalar' => $scalar_callback, - 'is_string' => $string_callback, - 'empty' => $null_callback, - ]; - } - - /** - * Look at elements of the form `is_array($v)` and modify - * the type of the variable. - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitCall(Node $node) : Context - { - $raw_function_name = self::getFunctionName($node); - if (!\is_string($raw_function_name)) { - return $this->context; - } - $args = $node->children['args']->children; - $first_arg = $args[0] ?? null; - - // Translate the function name into the UnionType it asserts - static $map = null; - - if ($map === null) { - $map = self::initTypeModifyingClosuresForVisitCall(); - } - - // Only look at things of the form - // `\is_string($variable)` - if (!($first_arg instanceof Node && $first_arg->kind === ast\AST_VAR)) { - if (\strcasecmp($raw_function_name, 'array_key_exists') === 0 && \count($args) === 2) { - // @phan-suppress-next-line PhanPartialTypeMismatchArgument - return $this->analyzeArrayKeyExists($args); - } - $type_modification_callback = $map[\strtolower($raw_function_name)] ?? null; - if (!$type_modification_callback) { - return $this->context; - } - // @phan-suppress-next-line PhanPartialTypeMismatchArgument - return $this->modifyComplexExpression($first_arg, $type_modification_callback, $this->context, $args); - } - - if (\count($args) !== 1) { - if (!(\strcasecmp($raw_function_name, 'is_a') === 0 && \count($args) === 2)) { - return $this->context; - } - } - - $function_name = \strtolower($raw_function_name); - $type_modification_callback = $map[$function_name] ?? null; - if ($type_modification_callback === null) { - return $this->context; - } - - $context = $this->context; - - try { - // Get the variable we're operating on - $variable = $this->getVariableFromScope($first_arg, $context); - - if (\is_null($variable)) { - return $context; - } - - // Make a copy of the variable - $variable = clone($variable); - - // Modify the types of that variable. - $type_modification_callback($this->code_base, $context, $variable, $args); - - // Overwrite the variable with its new type in this - // scope without overwriting other scopes - $context = $context->withScopeVariable( - $variable - ); - } catch (IssueException $exception) { - Issue::maybeEmitInstance($this->code_base, $context, $exception->getIssueInstance()); - } catch (\Exception $_) { - // Swallow it (E.g. IssueException for undefined variable) - } - - return $context; - } - - /** - * @param array<int,Node|string|int|float> $args - */ - private function analyzeArrayKeyExists(array $args) : Context - { - if (\count($args) !== 2) { - return $this->context; - } - $var_node = $args[1]; - if (!($var_node instanceof Node)) { - return $this->context; - } - return $this->updateVariableWithConditionalFilter( - $var_node, - $this->context, - static function (UnionType $_) : bool { - return true; - }, - function (UnionType $type) use ($args) : UnionType { - $type = $type->nonNullableClone(); - if ($type->hasTopLevelArrayShapeTypeInstances()) { - return $this->withSetArrayShapeTypes($type, $args[0], $this->context, false); - } - return $type; - }, - true - ); - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitEmpty(Node $node) : Context - { - $var_node = $node->children['expr']; - if (!($var_node instanceof Node)) { - return $this->context; - } - // Should always be a node for valid ASTs, tolerant-php-parser may produce invalid nodes - if (\in_array($var_node->kind, [ast\AST_VAR, ast\AST_PROP, ast\AST_DIM], true)) { - // Don't emit notices for if (empty($x)) {}, etc. - return $this->removeTruthyFromVariable($var_node, $this->context, true); - } - $this->checkVariablesDefinedInIsset($var_node); - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitExprList(Node $node) : Context - { - $children = $node->children; - $count = \count($children); - if ($count > 1) { - foreach ($children as $sub_node) { - --$count; - if ($count > 0 && $sub_node instanceof Node) { - $this->checkVariablesDefined($sub_node); - } - } - } - // Only analyze the last expression in the expression list for conditions. - $last_expression = \end($node->children); - if ($last_expression instanceof Node) { - return $this->__invoke($last_expression); - } else { - // Other code should warn about this invalid AST - return $this->context; - } - } - - /** - * Useful for analyzing `if ($x = foo() && $x->method())` - * TODO: Remove empty/false/null types from $x - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitAssign(Node $node) : Context - { - $context = (new BlockAnalysisVisitor($this->code_base, $this->context))->visitAssign($node); - $left = $node->children['var']; - if (!($left instanceof Node)) { - // Other code should warn about this invalid AST - return $context; - } - return (new self($this->code_base, $context))->__invoke($left); - } - - /** - * Useful for analyzing `if ($x = foo() && $x->method())` - * TODO: Remove empty/false/null types from $x - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitAssignRef(Node $node) : Context - { - $context = (new BlockAnalysisVisitor($this->code_base, $this->context))->visitAssignRef($node); - $left = $node->children['var']; - if (!($left instanceof Node)) { - // TODO: Ensure this always warns - return $context; - } - return (new self($this->code_base, $context))->__invoke($left); - } - - /** - * Update the variable represented by $expression to have the type $type. - */ - public static function updateToHaveType(CodeBase $code_base, Context $context, Node $expression, UnionType $type) : Context - { - $cv = new ConditionVisitor($code_base, $context); - return $cv->analyzeBinaryConditionPattern( - $expression, - 0, - new HasTypeCondition($type) - ); - } - - /** - * Update the variable represented by $expression to not have the type $type. - */ - public static function updateToNotHaveType(CodeBase $code_base, Context $context, Node $expression, UnionType $type) : Context - { - $cv = new ConditionVisitor($code_base, $context); - return $cv->analyzeBinaryConditionPattern( - $expression, - 0, - new NotHasTypeCondition($type) - ); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/BinaryCondition.php b/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/BinaryCondition.php deleted file mode 100644 index a33d45d..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/BinaryCondition.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis\ConditionVisitor; - -use ast\Node; -use Phan\Analysis\ConditionVisitorInterface; -use Phan\Language\Context; - -/** - * This represents an assertion implementation acting on two sides of a condition (!=, ==, ===, etc) - */ -interface BinaryCondition -{ - /** - * Assert that this condition applies to the variable $var (i.e. $var OPERATION $expr) - * - * @param Node $var - * @param Node|int|string|float $expr - * @return Context - */ - public function analyzeVar(ConditionVisitorInterface $visitor, Node $var, $expr) : Context; - - /** - * Assert that this condition applies to the variable $object (i.e. get_class($object) OPERATION $expr) - * - * @param Node|int|string|float $object - * @param Node|int|string|float $expr - * @return Context - */ - public function analyzeClassCheck(ConditionVisitorInterface $visitor, $object, $expr) : Context; - - /** - * Assert that this condition applies to the function call $call_node (i.e. is_string($object) OPERATION $expr) - * - * @param Node $call_node a node of kind AST_CALL - * @param Node|string|int|float $expr - * @return ?Context - */ - public function analyzeCall(ConditionVisitorInterface $visitor, $call_node, $expr); -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/ComparisonCondition.php b/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/ComparisonCondition.php deleted file mode 100644 index a90db04..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/ComparisonCondition.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis\ConditionVisitor; - -use ast\Node; -use Phan\Analysis\ConditionVisitorInterface; -use Phan\Language\Context; - -/** - * This represents a relative comparison assertion implementation acting on two sides of a condition (<, <=, >, >=) - */ -class ComparisonCondition implements BinaryCondition -{ - /** @var int the value of ast\Node->flags */ - private $flags; - - public function __construct(int $flags) - { - $this->flags = $flags; - } - - /** - * Assert that this condition applies to the variable $var (i.e. $var < $expr) - * - * @param Node $var - * @param Node|int|string|float $expr - * @return Context - * @override - */ - public function analyzeVar(ConditionVisitorInterface $visitor, Node $var, $expr) : Context - { - return $visitor->updateVariableToBeCompared($var, $expr, $this->flags); - } - - /** - * Assert that this condition applies to the variable $object (i.e. get_class($object) === $expr) - * - * @param Node|int|string|float $object - * @param Node|int|string|float $expr - * @return Context - * @suppress PhanUnusedPublicMethodParameter - */ - public function analyzeClassCheck(ConditionVisitorInterface $visitor, $object, $expr) : Context - { - return $visitor->getContext(); - } - - /** - * @suppress PhanUnusedPublicMethodParameter - */ - public function analyzeCall(ConditionVisitorInterface $visitor, $call_node, $expr) - { - return null; - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/HasTypeCondition.php b/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/HasTypeCondition.php deleted file mode 100644 index bd6f531..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/HasTypeCondition.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis\ConditionVisitor; - -use ast\Node; -use Phan\Analysis\ConditionVisitorInterface; -use Phan\Language\Context; -use Phan\Language\UnionType; - -/** - * An expression with the side effect that the given node has type T - */ -class HasTypeCondition implements BinaryCondition -{ - /** @var UnionType the type that this is asserting it has */ - private $type; - - public function __construct(UnionType $type) - { - $this->type = $type; - } - /** - * Assert that this condition applies to the variable $var (i.e. $var has type $union_type) - * - * @param Node $var - * @param Node|int|string|float $unused_expr - * @return Context - * @override - */ - public function analyzeVar(ConditionVisitorInterface $visitor, Node $var, $unused_expr) : Context - { - // Get the variable we're operating on - $context = $visitor->getContext(); - try { - $variable = $visitor->getVariableFromScope($var, $context); - } catch (\Exception $_) { - return $context; - } - if (\is_null($variable)) { - return $context; - } - - // Make a copy of the variable - $variable = clone($variable); - - $variable->setUnionType($this->type); - - // Overwrite the variable with its new type in this - // scope without overwriting other scopes - return $context->withScopeVariable( - $variable - ); - } - - /** - * Assert that this condition applies to the variable $object (i.e. get_class($object) === $expr) - * - * @param Node|int|string|float $object - * @param Node|int|string|float $unused_expr - * @return Context - */ - public function analyzeClassCheck(ConditionVisitorInterface $visitor, $object, $unused_expr) : Context - { - $class_string = $this->type->asSingleScalarValueOrNull(); - if ($class_string === null) { - return $visitor->getContext(); - } - return $visitor->analyzeClassAssertion($object, $class_string) ?? $visitor->getContext(); - } - - /** - * @suppress PhanUnusedPublicMethodParameter - */ - public function analyzeCall(ConditionVisitorInterface $visitor, $call_node, $expr) - { - return null; - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/IdenticalCondition.php b/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/IdenticalCondition.php deleted file mode 100644 index 2960039..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/IdenticalCondition.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis\ConditionVisitor; - -use ast\Node; -use Phan\Analysis\ConditionVisitor; -use Phan\Analysis\ConditionVisitorInterface; -use Phan\Analysis\NegatedConditionVisitor; -use Phan\AST\UnionTypeVisitor; -use Phan\Language\Context; - -/** - * This represents an identical/equals assertion implementation acting on two sides of a condition (===) - */ -class IdenticalCondition implements BinaryCondition -{ - /** - * Assert that this condition applies to the variable $var (i.e. $var === $expr) - * - * @param Node $var - * @param Node|int|string|float $expr - * @return Context - * @override - */ - public function analyzeVar(ConditionVisitorInterface $visitor, Node $var, $expr) : Context - { - return $visitor->updateVariableToBeIdentical($var, $expr); - } - - /** - * Assert that this condition applies to the variable $object (i.e. get_class($object) === $expr) - * - * @param Node|int|string|float $object - * @param Node|int|string|float $expr - * @return Context - */ - public function analyzeClassCheck(ConditionVisitorInterface $visitor, $object, $expr) : Context - { - return $visitor->analyzeClassAssertion($object, $expr) ?? $visitor->getContext(); - } - - public function analyzeCall(ConditionVisitorInterface $visitor, $call_node, $expr) - { - if (!$expr instanceof Node) { - return null; - } - $code_base = $visitor->getCodeBase(); - $context = $visitor->getContext(); - $value = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $expr)->asSingleScalarValueOrNullOrSelf(); - if (!\is_bool($value)) { - return null; - } - if ($value) { - // e.g. `if (is_string($x) === true)` - return (new ConditionVisitor($code_base, $context))->visitCall($call_node); - } else { - // e.g. `if (is_string($x) === false)` - return (new NegatedConditionVisitor($code_base, $context))->visitCall($call_node); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotEqualsCondition.php b/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotEqualsCondition.php deleted file mode 100644 index 90c6af2..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotEqualsCondition.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis\ConditionVisitor; - -use ast\Node; -use Phan\Analysis\ConditionVisitor; -use Phan\Analysis\ConditionVisitorInterface; -use Phan\Analysis\NegatedConditionVisitor; -use Phan\AST\UnionTypeVisitor; -use Phan\Language\Context; - -/** - * This represents a not equals assertion implementation acting on two sides of a condition (!=) - */ -class NotEqualsCondition implements BinaryCondition -{ - /** - * Assert that this condition applies to the variable $var (i.e. $var != $expr) - * - * @param Node $var - * @param Node|int|string|float $expr - * @return Context - * @override - */ - public function analyzeVar(ConditionVisitorInterface $visitor, Node $var, $expr) : Context - { - return $visitor->updateVariableToBeNotEqual($var, $expr); - } - - /** - * Assert that this condition applies to the variable $object (i.e. get_class($object) != $expr) - * - * @param Node $object - * @param Node|int|string|float $expr - * @return Context - * @override - * @suppress PhanUnusedPublicMethodParameter - */ - public function analyzeClassCheck(ConditionVisitorInterface $visitor, $object, $expr) : Context - { - return $visitor->getContext(); - } - - /** - * @suppress PhanUnusedPublicMethodParameter - */ - public function analyzeCall(ConditionVisitorInterface $visitor, $call_node, $expr) - { - if (!$expr instanceof Node) { - return null; - } - $code_base = $visitor->getCodeBase(); - $context = $visitor->getContext(); - $value = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $expr)->asSingleScalarValueOrNullOrSelf(); - if (\is_object($value)) { - return null; - } - $is_true = $value == true; - $is_false = $value == false; - if ($is_true === $is_false) { - return null; - } - if ($is_true) { - // e.g. `if (is_string($x) != true)` - return (new NegatedConditionVisitor($code_base, $context))->visitCall($call_node); - } else { - // e.g. `if (is_string($x) != false)` - return (new ConditionVisitor($code_base, $context))->visitCall($call_node); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotHasTypeCondition.php b/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotHasTypeCondition.php deleted file mode 100644 index 7cd08c1..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotHasTypeCondition.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis\ConditionVisitor; - -use ast\Node; -use Phan\Analysis\ConditionVisitorInterface; -use Phan\Analysis\ConditionVisitorUtil; -use Phan\Language\Context; -use Phan\Language\UnionType; - -/** - * An expression with the side effect that the given node does not have type T - */ -class NotHasTypeCondition implements BinaryCondition -{ - /** @var UnionType the type that this is asserting an argument does not have */ - private $type; - - public function __construct(UnionType $type) - { - $this->type = $type; - } - - /** - * Assert that this condition applies to the variable $var (i.e. $var does not have type $union_type) - * - * @param Node $var - * @param Node|int|string|float $unused_expr - * @return Context - * @override - */ - public function analyzeVar(ConditionVisitorInterface $visitor, Node $var, $unused_expr) : Context - { - // Get the variable we're operating on - $context = $visitor->getContext(); - try { - $variable = $visitor->getVariableFromScope($var, $context); - } catch (\Exception $_) { - return $context; - } - if (\is_null($variable)) { - return $context; - } - - // Make a copy of the variable - $variable = clone($variable); - $code_base = $visitor->getCodeBase(); - $result_type = ConditionVisitorUtil::excludeMatchingTypes($code_base, $variable->getUnionType(), $this->type); - - $variable->setUnionType($result_type); - - // Overwrite the variable with its new type in this - // scope without overwriting other scopes - return $context->withScopeVariable( - $variable - ); - } - - /** - * Assert that this condition applies to the variable $object. Unimplemented. - * - * @param Node|int|string|float $unused_object - * @param Node|int|string|float $unused_expr - * @return Context - */ - public function analyzeClassCheck(ConditionVisitorInterface $visitor, $unused_object, $unused_expr) : Context - { - // Unimplemented, Not likely to be commonly used. - return $visitor->getContext(); - } - - public function analyzeCall(ConditionVisitorInterface $unused_visitor, $unused_call_node, $unused_expr) - { - return null; - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotIdenticalCondition.php b/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotIdenticalCondition.php deleted file mode 100644 index c238f3c..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitor/NotIdenticalCondition.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis\ConditionVisitor; - -use ast\Node; -use Phan\Analysis\ConditionVisitor; -use Phan\Analysis\ConditionVisitorInterface; -use Phan\Analysis\NegatedConditionVisitor; -use Phan\AST\UnionTypeVisitor; -use Phan\Language\Context; - -/** - * This represents a not identical assertion implementation acting on two sides of a condition (!==) - */ -class NotIdenticalCondition implements BinaryCondition -{ - /** - * Assert that this condition applies to the variable $var (i.e. $var !== $expr) - * - * @param Node $var - * @param Node|int|string|float $expr - * @return Context - * @override - */ - public function analyzeVar(ConditionVisitorInterface $visitor, Node $var, $expr) : Context - { - return $visitor->updateVariableToBeNotIdentical($var, $expr); - } - - /** - * Assert that this condition applies to the variable $object (i.e. get_class($object) !== $expr) - * - * @param Node $object - * @param Node|int|string|float $expr - * @return Context - * @suppress PhanUnusedPublicMethodParameter - */ - public function analyzeClassCheck(ConditionVisitorInterface $visitor, $object, $expr) : Context - { - return $visitor->getContext(); - } - - public function analyzeCall(ConditionVisitorInterface $visitor, $call_node, $expr) - { - if (!$expr instanceof Node) { - return null; - } - $code_base = $visitor->getCodeBase(); - $context = $visitor->getContext(); - $value = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $expr)->asSingleScalarValueOrNullOrSelf(); - if (!\is_bool($value)) { - return null; - } - if ($value) { - // e.g. `if (!(is_string($x) === true))` - return (new NegatedConditionVisitor($code_base, $context))->visitCall($call_node); - } else { - // e.g. `if (!(is_string($x) === false))` - return (new ConditionVisitor($code_base, $context))->visitCall($call_node); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitorInterface.php b/vendor/phan/phan/src/Phan/Analysis/ConditionVisitorInterface.php deleted file mode 100644 index 11f1bbe..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitorInterface.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use ast\Node; -use Phan\CodeBase; -use Phan\Exception\IssueException; -use Phan\Language\Context; -use Phan\Language\Element\Variable; - -/** - * This implements common functionality to update variables based on checks within a conditional (of an if/elseif/else/while/for/assert(), etc.) - * - * Classes using ConditionVisitorUtil must implement this trait. - */ -interface ConditionVisitorInterface -{ - /** - * Returns this ConditionVisitorInterface's CodeBase. - * This is needed by subclasses of BinaryCondition. - */ - public function getCodeBase() : CodeBase; - - /** - * Returns this ConditionVisitorInterface's Context. - * This is needed by subclasses of BinaryCondition. - */ - public function getContext() : Context; - - /** - * @param Node $var_node - * @param Node|int|float|string $expr - * @return Context - Constant after inferring type from an expression such as `if ($x === 'literal')` - */ - public function updateVariableToBeIdentical( - Node $var_node, - $expr, - Context $context = null - ) : Context; - - /** - * @param Node $var_node - * @param Node|int|float|string $expr - * @return Context - Constant after inferring type from an expression such as `if ($x == 'literal')` - */ - public function updateVariableToBeNotIdentical( - Node $var_node, - $expr, - Context $context = null - ) : Context; - - /** - * @param Node $var_node - * @param Node|int|float|string $expr - * @param int $flags (e.g. \ast\flags\BINARY_IS_SMALLER) - * @return Context - Constant after inferring type from an expression such as `if ($x === 'literal')` - */ - public function updateVariableToBeCompared( - Node $var_node, - $expr, - int $flags - ) : Context; - - /** - * @param Node $var_node - * @param Node|int|float|string $expr - * @return Context - Constant after inferring type from an expression such as `if ($x != 'literal')` - */ - public function updateVariableToBeNotEqual( - Node $var_node, - $expr, - Context $context = null - ) : Context; - - /** - * Returns a context where the variable for $object_node has the class found in $expr_node - * - * @param Node|string|int|float $object_node - * @param Node|string|int|float|bool $expr_node - * @return ?Context - */ - public function analyzeClassAssertion($object_node, $expr_node); - - /** - * @return ?Variable - Returns null if the variable is undeclared and ignore_undeclared_variables_in_global_scope applies. - * or if assertions won't be applied? - * @throws IssueException if variable is undeclared and not ignored. - * @see UnionTypeVisitor::visitVar() - * - * TODO: support assertions on superglobals, within the current file scope? - */ - public function getVariableFromScope(Node $var_node, Context $context); -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitorUtil.php b/vendor/phan/phan/src/Phan/Analysis/ConditionVisitorUtil.php deleted file mode 100644 index e7c2c00..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ConditionVisitorUtil.php +++ /dev/null @@ -1,1064 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use ast; -use ast\Node; -use Closure; -use Phan\Analysis\ConditionVisitor\BinaryCondition; -use Phan\Analysis\ConditionVisitor\ComparisonCondition; -use Phan\Analysis\ConditionVisitor\IdenticalCondition; -use Phan\Analysis\ConditionVisitor\NotEqualsCondition; -use Phan\Analysis\ConditionVisitor\NotIdenticalCondition; -use Phan\AST\UnionTypeVisitor; -use Phan\BlockAnalysisVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\FQSENException; -use Phan\Exception\IssueException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type; -use Phan\Language\Type\FalseType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\LiteralIntType; -use Phan\Language\Type\LiteralStringType; -use Phan\Language\Type\LiteralTypeInterface; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\StringType; -use Phan\Language\Type\TrueType; -use Phan\Language\UnionType; -use Phan\Library\StringUtil; -use function is_int; -use function is_string; - -/** - * This implements common functionality to update variables based on checks within a conditional (of an if/elseif/else/while/for/assert(), etc.) - * - * Classes implementing this must also implement ConditionVisitorInterface - * - * @see ConditionVisitor - * @see NegatedConditionVisitor - * @see ConditionVisitorInterface - * - * @phan-file-suppress PhanPartialTypeMismatchArgumentInternal - */ -trait ConditionVisitorUtil -{ - /** @var CodeBase The code base within which we're operating */ - protected $code_base; - - /** - * @var Context - * The context in which the node we're going to be looking - * at exits. - */ - protected $context; - - /** - * Remove any types which are definitely truthy from that variable (objects, TrueType, ResourceType, etc.) - * E.g. if (empty($x)) {} would result in this. - * Note that Phan can't know some scalars are not an int/string/float, since 0/""/"0"/0.0/[] are empty. - * (Remove arrays anyway) - */ - final protected function removeTruthyFromVariable(Node $var_node, Context $context, bool $suppress_issues) : Context - { - return $this->updateVariableWithConditionalFilter( - $var_node, - $context, - static function (UnionType $type) : bool { - return $type->containsTruthy(); - }, - static function (UnionType $type) : UnionType { - return $type->nonTruthyClone(); - }, - $suppress_issues - ); - } - - // Remove any types which are definitely falsey from that variable (NullType, FalseType) - final protected function removeFalseyFromVariable(Node $var_node, Context $context, bool $suppress_issues) : Context - { - return $this->updateVariableWithConditionalFilter( - $var_node, - $context, - static function (UnionType $type) : bool { - return $type->containsFalsey(); - }, - static function (UnionType $type) : UnionType { - return $type->nonFalseyClone(); - }, - $suppress_issues - ); - } - - - final protected function removeNullFromVariable(Node $var_node, Context $context, bool $suppress_issues) : Context - { - return $this->updateVariableWithConditionalFilter( - $var_node, - $context, - static function (UnionType $type) : bool { - return $type->containsNullable(); - }, - static function (UnionType $type) : UnionType { - return $type->nonNullableClone(); - }, - $suppress_issues - ); - } - - /** - * @param int|string|float $value - */ - final protected function removeLiteralScalarFromVariable( - Node $var_node, - Context $context, - $value, - bool $strict_equality - ) : Context { - if (!is_int($value) && !is_string($value)) { - return $context; - } - if ($strict_equality) { - if (is_int($value)) { - $cb = static function (Type $type) use ($value) : bool { - return $type instanceof LiteralIntType && $type->getValue() === $value; - }; - } else { // string - $cb = static function (Type $type) use ($value) : bool { - return $type instanceof LiteralStringType && $type->getValue() === $value; - }; - } - } else { - $cb = static function (Type $type) use ($value) : bool { - return $type instanceof LiteralTypeInterface && $type->getValue() == $value; - }; - } - return $this->updateVariableWithConditionalFilter( - $var_node, - $context, - static function (UnionType $union_type) use ($cb) : bool { - return $union_type->hasTypeMatchingCallback($cb); - }, - static function (UnionType $union_type) use ($cb) : UnionType { - $has_nullable = false; - foreach ($union_type->getTypeSet() as $type) { - if ($cb($type)) { - $union_type = $union_type->withoutType($type); - $has_nullable = $has_nullable || $type->getIsNullable(); - } - } - if ($has_nullable) { - if ($union_type->isEmpty()) { - return NullType::instance(false)->asUnionType(); - } - return $union_type->nullableClone(); - } - return $union_type; - }, - false - ); - } - - final protected function removeFalseFromVariable(Node $var_node, Context $context) : Context - { - return $this->updateVariableWithConditionalFilter( - $var_node, - $context, - static function (UnionType $type) : bool { - return $type->containsFalse(); - }, - static function (UnionType $type) : UnionType { - return $type->nonFalseClone(); - }, - false - ); - } - - final protected function removeTrueFromVariable(Node $var_node, Context $context) : Context - { - return $this->updateVariableWithConditionalFilter( - $var_node, - $context, - static function (UnionType $type) : bool { - return $type->containsTrue(); - }, - static function (UnionType $type) : UnionType { - return $type->nonTrueClone(); - }, - false - ); - } - - /** - * If the inferred UnionType makes $should_filter_cb return true - * (indicating there are Types to be removed from the UnionType or altered), - * then replace the UnionType with the modified UnionType which $filter_union_type_cb returns, - * and update the context. - * - * Note: It's expected that $should_filter_cb returns false on the new UnionType of that variable. - * - * @param Node $var_node a node of kind ast\AST_VAR, ast\AST_PROP, or ast\AST_DIM - * @param Closure(UnionType):bool $should_filter_cb - * @param Closure(UnionType):UnionType $filter_union_type_cb - */ - final protected function updateVariableWithConditionalFilter( - Node $var_node, - Context $context, - Closure $should_filter_cb, - Closure $filter_union_type_cb, - bool $suppress_issues - ) : Context { - try { - // Get the variable we're operating on - $variable = $this->getVariableFromScope($var_node, $context); - if (\is_null($variable)) { - if ($var_node->kind === ast\AST_DIM) { - return $this->updateDimExpressionWithConditionalFilter($var_node, $context, $should_filter_cb, $filter_union_type_cb, $suppress_issues); - } elseif ($var_node->kind === ast\AST_PROP) { - return $this->updatePropertyExpressionWithConditionalFilter($var_node, $context, $should_filter_cb, $filter_union_type_cb, $suppress_issues); - } - return $context; - } - - $union_type = $variable->getUnionType(); - if (!$should_filter_cb($union_type)) { - return $context; - } - - // Make a copy of the variable - $variable = clone($variable); - - $variable->setUnionType( - $filter_union_type_cb($union_type) - ); - - // Overwrite the variable with its new type in this - // scope without overwriting other scopes - $context = $context->withScopeVariable( - $variable - ); - } catch (IssueException $exception) { - if (!$suppress_issues) { - Issue::maybeEmitInstance($this->code_base, $context, $exception->getIssueInstance()); - } - } catch (\Exception $_) { - // Swallow it - } - return $context; - } - - /** - * @param Node $node a node of kind ast\AST_DIM - */ - final protected function updateDimExpressionWithConditionalFilter( - Node $node, - Context $context, - Closure $should_filter_cb, - Closure $filter_union_type_cb, - bool $suppress_issues - ) : Context { - $var_name = self::getVarNameOfDimNode($node->children['expr']); - if (!is_string($var_name)) { - return $context; - } - try { - // Get the type of the field we're operating on - $old_field_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $context, $node); - if (!$should_filter_cb($old_field_type)) { - return $context; - } - - // Give the field an unused stub name and compute the new type - $new_field_type = $filter_union_type_cb($old_field_type); - if ($old_field_type->isEqualTo($new_field_type)) { - return $context; - } - - return (new AssignmentVisitor( - $this->code_base, - // We clone the original context to avoid affecting the original context for the elseif. - // AssignmentVisitor modifies the provided context in place. - // - // There is a difference between `if (is_string($x['field']))` and `$x['field'] = remove_string_types($x['field'])` for the way the `elseif` should be analyzed. - $context->withClonedScope(), - $node, - $new_field_type - ))->__invoke($node); - } catch (IssueException $exception) { - if (!$suppress_issues) { - Issue::maybeEmitInstance($this->code_base, $context, $exception->getIssueInstance()); - } - } catch (\Exception $_) { - // Swallow it - } - return $context; - } - - /** - * @param Node|mixed $node - */ - protected static function isThisVarNode($node) : bool - { - return $node instanceof Node && $node->kind === ast\AST_VAR && - $node->children['name'] === 'this'; - } - - /** - * Analyze an expression such as `assert(!is_int($this->prop_name))` - * and infer the effects on $this->prop_name in the local scope. - * - * @param Node $node a node of kind ast\AST_PROP - */ - final protected function updatePropertyExpressionWithConditionalFilter( - Node $node, - Context $context, - Closure $should_filter_cb, - Closure $filter_union_type_cb, - bool $unused_suppress_issues - ) : Context { - if (!self::isThisVarNode($node->children['expr'])) { - return $context; - } - $property_name = $node->children['prop']; - if (!is_string($property_name)) { - return $context; - } - return $this->modifyPropertyOfThisSimple( - $node, - static function (UnionType $type) use ($should_filter_cb, $filter_union_type_cb) : UnionType { - if (!$should_filter_cb($type)) { - return $type; - } - return $filter_union_type_cb($type); - }, - $context - ); - } - - final protected function updateVariableWithNewType( - Node $var_node, - Context $context, - UnionType $new_union_type, - bool $suppress_issues - ) : Context { - if ($var_node->kind === ast\AST_PROP) { - return $this->modifyPropertySimple($var_node, static function (UnionType $unused) use ($new_union_type) : UnionType { - return $new_union_type; - }, $context); - } - // TODO: Support ast\AST_DIM - try { - // Get the variable we're operating on - $variable = $this->getVariableFromScope($var_node, $context); - if (\is_null($variable)) { - return $context; - } - - // Make a copy of the variable - $variable = clone($variable); - - $variable->setUnionType( - $new_union_type - ); - - // Overwrite the variable with its new type in this - // scope without overwriting other scopes - $context = $context->withScopeVariable( - $variable - ); - } catch (IssueException $exception) { - if (!$suppress_issues) { - Issue::maybeEmitInstance($this->code_base, $context, $exception->getIssueInstance()); - } - } catch (\Exception $_) { - // Swallow it - } - return $context; - } - - /** - * @param Node $var_node - * @param Node|int|float|string $expr - * @return Context - Constant after inferring type from an expression such as `if ($x === 'literal')` - * @suppress PhanUnreferencedPublicMethod referenced in ConditionVisitorInterface - */ - final public function updateVariableToBeIdentical( - Node $var_node, - $expr, - Context $context = null - ) : Context { - $context = $context ?? $this->context; - try { - $expr_type = UnionTypeVisitor::unionTypeFromLiteralOrConstant($this->code_base, $context, $expr); - if (!$expr_type) { - return $context; - } - } catch (\Exception $_) { - return $context; - } - return $this->updateVariableWithNewType($var_node, $context, $expr_type, true); - } - - /** - * @param Node $var_node - * @param Node|int|float|string $expr - * @param int $flags (e.g. \ast\flags\BINARY_IS_SMALLER) - * @return Context - Constant after inferring type from an expression such as `if ($x === 'literal')` - * @suppress PhanUnreferencedPublicMethod referenced in ConditionVisitorInterface - */ - final public function updateVariableToBeCompared( - Node $var_node, - $expr, - int $flags - ) : Context { - $context = $this->context; - $var_name = $var_node->children['name'] ?? null; - // Don't analyze variables such as $$a - if (\is_string($var_name) && $var_name) { - try { - $expr_type = UnionTypeVisitor::unionTypeFromLiteralOrConstant($this->code_base, $context, $expr); - if (!$expr_type) { - return $context; - } - $expr_value = $expr_type->asSingleScalarValueOrNullOrSelf(); - if (\is_object($expr_value)) { - return $context; - } - // Get the variable we're operating on - $variable = $this->getVariableFromScope($var_node, $context); - if (\is_null($variable)) { - return $context; - } - - // Make a copy of the variable - $variable = clone($variable); - - // TODO: Filter out nullable types - $union_type = $variable->getUnionType()->makeFromFilter(static function (Type $type) use ($expr_value, $flags) : bool { - // @phan-suppress-next-line PhanAccessMethodInternal - return $type->canSatisfyComparison($expr_value, $flags); - }); - if ($union_type->containsNullable()) { - // @phan-suppress-next-line PhanAccessMethodInternal - if (!Type::performComparison(null, $expr_value, $flags)) { - // E.g. $x > 0 will remove the type null. - $union_type = $union_type->nonNullableClone(); - } - } - $variable->setUnionType($union_type); - - // Overwrite the variable with its new type in this - // scope without overwriting other scopes - $context = $context->withScopeVariable( - $variable - ); - return $context; - } catch (\Exception $_) { - // Swallow it (E.g. IssueException for undefined variable) - } - } - return $context; - } - - /** - * @param Node $var_node a node of type ast\AST_VAR, ast\AST_DIM (planned), or ast\AST_PROP - * @param Node|int|float|string $expr - * @return Context - Constant after inferring type from an expression such as `if ($x !== 'literal')` - * @suppress PhanUnreferencedPublicMethod referenced in ConditionVisitorInterface - */ - final public function updateVariableToBeNotIdentical( - Node $var_node, - $expr, - Context $context = null - ) : Context { - $context = $context ?? $this->context; - try { - if ($expr instanceof Node) { - if ($expr->kind === ast\AST_CONST) { - $expr_name_node = $expr->children['name']; - if ($expr_name_node->kind === ast\AST_NAME) { - // Currently, only add this inference when we're absolutely sure this is a check rejecting null/false/true - $expr_name = $expr_name_node->children['name']; - switch (\strtolower($expr_name)) { - case 'null': - return $this->removeNullFromVariable($var_node, $context, false); - case 'false': - return $this->removeFalseFromVariable($var_node, $context); - case 'true': - return $this->removeTrueFromVariable($var_node, $context); - } - } - } - } else { - return $this->removeLiteralScalarFromVariable($var_node, $context, $expr, true); - } - } catch (\Exception $_) { - // Swallow it (E.g. IssueException for undefined variable) - } - return $context; - } - - /** - * @param Node $var_node - * @param Node|int|float|string $expr - * @return Context - Constant after inferring type from an expression such as `if ($x != 'literal')` - * @suppress PhanUnreferencedPublicMethod referenced in ConditionVisitorInterface - */ - final public function updateVariableToBeNotEqual( - Node $var_node, - $expr, - Context $context = null - ) : Context { - $context = $context ?? $this->context; - - $var_name = $var_node->children['name'] ?? null; - // http://php.net/manual/en/types.comparisons.php#types.comparisions-loose @phan-suppress-current-line PhanPluginPossibleTypoComment, UnusedSuppression - if (\is_string($var_name)) { - try { - if ($expr instanceof Node) { - if ($expr->kind === ast\AST_CONST) { - $expr_name_node = $expr->children['name']; - if ($expr_name_node->kind === ast\AST_NAME) { - // Currently, only add this inference when we're absolutely sure this is a check rejecting null/false/true - $expr_name = $expr_name_node->children['name']; - switch (\strtolower($expr_name)) { - case 'null': - case 'false': - return $this->removeFalseyFromVariable($var_node, $context, false); - case 'true': - return $this->removeTrueFromVariable($var_node, $context); - } - } - } - return $context; - } - // Remove all of the types which are loosely equal - if (is_int($expr) || is_string($expr)) { - $context = $this->removeLiteralScalarFromVariable($var_node, $context, $expr, false); - } - - if ($expr == false) { - if ($expr == null) { - return $this->removeFalseyFromVariable($var_node, $context, false); - } - return $this->removeFalseFromVariable($var_node, $context); - } elseif ($expr == null) { - $context = $this->removeNullFromVariable($var_node, $context, false); - } elseif ($expr == true) { // e.g. 1, "1", -1 - return $this->removeTrueFromVariable($var_node, $context); - } - } catch (\Exception $_) { - // Swallow it (E.g. IssueException for undefined variable) - } - } - return $context; - } - - /** - * @param Node|int|float|string $left - * @param Node|int|float|string $right - * @return Context - Constant after inferring type from an expression such as `if ($x !== false)` - * - * TODO: Could improve analysis by adding analyzeAndUpdateToBeEqual for `==` - */ - protected function analyzeAndUpdateToBeIdentical($left, $right) : Context - { - return $this->analyzeBinaryConditionPattern( - $left, - $right, - new IdenticalCondition() - ); - } - - /** - * @param Node|int|float|string $left - * @param Node|int|float|string $right - * @return Context - Constant after inferring type from an expression such as `if ($x !== false)` - */ - protected function analyzeAndUpdateToBeNotIdentical($left, $right) : Context - { - return $this->analyzeBinaryConditionPattern( - $left, - $right, - new NotIdenticalCondition() - ); - } - - /** - * @param Node|int|float|string $left - * @param Node|int|float|string $right - * @param BinaryCondition $condition - */ - protected function analyzeBinaryConditionPattern($left, $right, BinaryCondition $condition) : Context - { - if ($left instanceof Node) { - $result = $this->analyzeBinaryConditionSide($left, $right, $condition); - if ($result !== null) { - return $result; - } - } - if ($right instanceof Node) { - $result = $this->analyzeBinaryConditionSide($right, $left, $condition); - if ($result !== null) { - return $result; - } - } - return $this->context; - } - - /** - * @param Node $var_node - * @param Node|int|string|float $expr_node - * @param BinaryCondition $condition - * @return ?Context - * @suppress PhanPartialTypeMismatchArgument - */ - private function analyzeBinaryConditionSide(Node $var_node, $expr_node, BinaryCondition $condition) - { - '@phan-var ConditionVisitorUtil|ConditionVisitorInterface $this'; - $kind = $var_node->kind; - if ($kind === ast\AST_VAR || $kind === ast\AST_DIM) { - return $condition->analyzeVar($this, $var_node, $expr_node); - } - if ($kind === ast\AST_PROP) { - if (self::isThisVarNode($var_node->children['expr']) && is_string($var_node->children['prop'])) { - return $condition->analyzeVar($this, $var_node, $expr_node); - } - return null; - } - if ($kind === ast\AST_CALL) { - $name = $var_node->children['expr']->children['name'] ?? null; - if (\is_string($name)) { - $name = \strtolower($name); - if ($name === 'get_class') { - return $condition->analyzeClassCheck($this, $var_node->children['args']->children[0] ?? null, $expr_node); - } - return $condition->analyzeCall($this, $var_node, $expr_node); - } - } - $tmp = $var_node; - while (\in_array($kind, [ast\AST_ASSIGN, ast\AST_ASSIGN_OP, ast\AST_ASSIGN_REF], true)) { - $var = $tmp->children['var'] ?? null; - if (!$var instanceof Node) { - break; - } - $kind = $var->kind; - if ($kind === ast\AST_VAR) { - $this->context = (new BlockAnalysisVisitor($this->code_base, $this->context))->__invoke($tmp); - return $condition->analyzeVar($this, $var, $expr_node); - } - $tmp = $var; - } - return null; - } - - /** - * Returns a context where the variable for $object_node has the class found in $expr_node - * - * @param Node|string|int|float $object_node - * @param Node|string|int|float|bool $expr_node - * @return ?Context - * @suppress PhanUnreferencedPublicMethod referenced in ConditionVisitorInterface - */ - public function analyzeClassAssertion($object_node, $expr_node) - { - if (!($object_node instanceof Node)) { - return null; - } - if ($expr_node instanceof Node) { - $expr_value = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $expr_node)->asSingleScalarValueOrNull(); - } else { - $expr_value = $expr_node; - } - if (!is_string($expr_value)) { - $expr_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $expr_node); - if (!$expr_type->canCastToUnionType(UnionType::fromFullyQualifiedString('string|false'))) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeComparisonToInvalidClassType, - $this->context->getLineNumberStart(), - $expr_type, - 'false|string' - ); - } - // TODO: Could warn about invalid assertions - return null; - } - $fqsen_string = '\\' . $expr_value; - try { - $fqsen = FullyQualifiedClassName::fromFullyQualifiedString($fqsen_string); - } catch (FQSENException $_) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeComparisonToInvalidClass, - $this->context->getLineNumberStart(), - StringUtil::encodeValue($expr_value) - ); - - return null; - } - $expr_type = $fqsen->asType()->asUnionType(); - - $var_name = $object_node->children['name'] ?? null; - // Don't analyze variables such as $$a - if (!(\is_string($var_name) && $var_name)) { - return null; - } - try { - // Get the variable we're operating on - $variable = $this->getVariableFromScope($object_node, $this->context); - if (\is_null($variable)) { - return null; - } - // Make a copy of the variable - $variable = clone($variable); - - $variable->setUnionType($expr_type); - - // Overwrite the variable with its new type in this - // scope without overwriting other scopes - return $this->context->withScopeVariable( - $variable - ); - } catch (\Exception $_) { - // Swallow it (E.g. IssueException for undefined variable) - } - } - - /** - * @param Node|int|float|string $left - * @param Node|int|float|string $right - * @return Context - Constant after inferring type from an expression such as `if ($x == 'literal')` - */ - protected function analyzeAndUpdateToBeNotEqual($left, $right) : Context - { - return $this->analyzeBinaryConditionPattern( - $left, - $right, - new NotEqualsCondition() - ); - } - - /** - * @param Node|int|float|string $left - * @param Node|int|float|string $right - * @return Context - Constant after inferring type from an expression such as `if ($x > 0)` - */ - protected function analyzeAndUpdateToBeCompared($left, $right, int $flags) : Context - { - return $this->analyzeBinaryConditionPattern( - $left, - $right, - new ComparisonCondition($flags) - ); - } - - - /** - * @return ?Variable - Returns null if the variable is undeclared and ignore_undeclared_variables_in_global_scope applies. - * or if assertions won't be applied? - * @throws IssueException if variable is undeclared and not ignored. - * @see UnionTypeVisitor::visitVar() - * - * TODO: support assertions on superglobals, within the current file scope? - */ - final public function getVariableFromScope(Node $var_node, Context $context) - { - if ($var_node->kind !== ast\AST_VAR) { - return null; - } - $var_name_node = $var_node->children['name'] ?? null; - - if ($var_name_node instanceof Node) { - // This is nonsense. Give up, but check if it's a type other than int/string. - // (e.g. to catch typos such as $$this->foo = bar;) - $name_node_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $context, $var_name_node, true); - static $int_or_string_type; - if ($int_or_string_type === null) { - $int_or_string_type = new UnionType([ - StringType::instance(false), - IntType::instance(false), - NullType::instance(false), - ]); - } - if (!$name_node_type->canCastToUnionType($int_or_string_type)) { - Issue::maybeEmit($this->code_base, $context, Issue::TypeSuspiciousIndirectVariable, $var_name_node->lineno ?? 0, (string)$name_node_type); - } - - return null; - } - - $var_name = (string)$var_name_node; - - if (!$context->getScope()->hasVariableWithName($var_name)) { - if (Variable::isHardcodedVariableInScopeWithName($var_name, $context->isInGlobalScope())) { - return null; - } - if (!($context->isInGlobalScope() && Config::getValue('ignore_undeclared_variables_in_global_scope'))) { - throw new IssueException( - Issue::fromType(Issue::UndeclaredVariable)( - $context->getFile(), - $var_node->lineno ?? 0, - [$var_name], - IssueFixSuggester::suggestVariableTypoFix($this->code_base, $context, $var_name) - ) - ); - } - $variable = new Variable( - $context, - $var_name, - UnionType::empty(), - 0 - ); - $context->addScopeVariable($variable); - return $variable; - } - return $context->getScope()->getVariableByName( - $var_name - ); - } - - /** - * @param array<mixed,Node|mixed> $args - */ - final protected static function isArgumentListWithVarAsFirstArgument(array $args) : bool - { - if (\count($args) >= 1) { - $arg = $args[0]; - // Phan also supports `if (!is_array($x['field']))` and `if (!is_array($this->propName))` - return ($arg instanceof Node) && (\in_array($arg->kind, [ast\AST_VAR, ast\AST_DIM, ast\AST_PROP], true)); - } - return false; - } - - /** - * Fetches the function name. Does not check for function uses or namespaces. - * @return ?string (null if function name could not be found) - */ - final protected static function getFunctionName(Node $node) - { - $expr = $node->children['expr']; - if (!($expr instanceof Node)) { - return null; - } - $raw_function_name = $expr->children['name'] ?? null; - if (!(\is_string($raw_function_name) && $raw_function_name)) { - return null; - } - return $raw_function_name; - } - - /** - * Generate a union type by excluding matching types in $excluded_type from $affected_type - */ - public static function excludeMatchingTypes(CodeBase $code_base, UnionType $affected_type, UnionType $excluded_type) : UnionType - { - if ($affected_type->isEmpty() || $excluded_type->isEmpty()) { - return $affected_type; - } - - foreach ($excluded_type->getTypeSet() as $type) { - if ($type instanceof NullType) { - $affected_type = $affected_type->nonNullableClone(); - } elseif ($type instanceof FalseType) { - $affected_type = $affected_type->nonFalseClone(); - } elseif ($type instanceof TrueType) { - $affected_type = $affected_type->nonTrueClone(); - } else { - continue; - } - // TODO: Do a better job handling LiteralStringType and LiteralIntType - $excluded_type = $excluded_type->withoutType($type); - } - if ($excluded_type->isEmpty()) { - return $affected_type; - } - return $affected_type->makeFromFilter(static function (Type $type) use ($code_base, $excluded_type) : bool { - return $type instanceof MixedType || !$type->asExpandedTypes($code_base)->canCastToUnionType($excluded_type); - }); - } - - /** - * Returns this ConditionVisitorUtil's CodeBase. - * This is needed by subclasses of BinaryCondition. - * @suppress PhanUnreferencedPublicMethod - */ - public function getCodeBase() : CodeBase - { - return $this->code_base; - } - - /** - * Returns this ConditionVisitorUtil's Context. - * This is needed by subclasses of BinaryCondition. - */ - public function getContext() : Context - { - return $this->context; - } - - /** - * @param Node|mixed $node - * @param Closure(CodeBase,Context,Variable,array<int,mixed>):void $type_modification_callback - * A closure acting on a Variable instance (not really a variable) to modify its type - * @param Context $context - * @param array<int,mixed> $args - * @return Context - */ - protected function modifyComplexExpression($node, Closure $type_modification_callback, Context $context, array $args) : Context - { - if (!$node instanceof Node) { - return $context; - } - if ($node->kind === ast\AST_DIM) { - return $this->modifyComplexDimExpression($node, $type_modification_callback, $context, $args); - } elseif ($node->kind === ast\AST_PROP) { - if (self::isThisVarNode($node->children['expr'])) { - return $this->modifyPropertyOfThis($node, $type_modification_callback, $context, $args); - } - } - return $context; - } - - /** - * @param Node $node a node of kind ast\AST_DIM (e.g. the argument of is_array($x['field'])) - * @param Closure(CodeBase,Context,Variable,array<int,mixed>):void $type_modification_callback - * A closure acting on a Variable instance (not really a variable) to modify its type - * - * This is a function such as is_array, is_null (questionable), etc. - * @param Context $context - * @param array<int,mixed> $args - */ - protected function modifyComplexDimExpression(Node $node, Closure $type_modification_callback, Context $context, array $args) : Context - { - $var_name = $this->getVarNameOfDimNode($node->children['expr']); - if (!is_string($var_name)) { - return $context; - } - // Give the field an unused stub name and compute the new type - $old_field_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $context, $node); - $field_variable = new Variable($context, "__phan", $old_field_type, 0); - $type_modification_callback($this->code_base, $context, $field_variable, $args); - $new_field_type = $field_variable->getUnionType(); - if ($new_field_type->isEqualTo($old_field_type)) { - return $context; - } - // Treat if (is_array($x['field'])) similarly to `$x['field'] = some_function_returning_array() - // (But preserve anything known about array types of $x['field']) - return (new AssignmentVisitor( - $this->code_base, - // We clone the original context to avoid affecting the original context for the elseif. - // AssignmentVisitor modifies the provided context in place. - // - // There is a difference between `if (is_string($x['field']))` and `$x['field'] = (some string)` for the way the `elseif` should be analyzed. - $context->withClonedScope(), - $node, - $new_field_type - ))->__invoke($node); - } - - /** - * Return a context with overrides for the type of a property in the local scope. - * - * @param Node $node a node of kind ast\AST_PROP (e.g. the argument of is_array($this->prop_name)) - * @param Closure(CodeBase,Context,Variable,array<int,mixed>):void $type_modification_callback - * A closure acting on a Variable instance (not really a variable) to modify its type - * - * This is a function such as is_array, is_null, etc. - * @param Context $context - * @param array<int,mixed> $args - */ - protected function modifyPropertyOfThis(Node $node, Closure $type_modification_callback, Context $context, array $args) : Context - { - $property_name = $node->children['prop']; - if (!is_string($property_name)) { - return $context; - } - // Give the property a type and compute the new type - $old_property_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $context, $node); - $property_variable = new Variable($context, "__phan", $old_property_type, 0); - $type_modification_callback($this->code_base, $context, $property_variable, $args); - $new_property_type = $property_variable->getUnionType(); - if ($new_property_type->isEqualTo($old_property_type)) { - // This didn't change anything - return $context; - } - return $context->withThisPropertySetToTypeByName($property_name, $new_property_type); - } - - /** - * Return a context with overrides for the type of a property in the local scope. - * - * @param Node $node a node of kind ast\AST_PROP (e.g. the argument of is_array($this->prop_name)) - * @param Closure(UnionType):UnionType $type_mapping_callback - * Given a union type, returns the resulting union type. - * @param Context $context - */ - protected function modifyPropertyOfThisSimple(Node $node, Closure $type_mapping_callback, Context $context) : Context - { - $property_name = $node->children['prop']; - if (!is_string($property_name)) { - return $context; - } - // Give the property a type and compute the new type - $old_property_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $context, $node); - $new_property_type = $type_mapping_callback($old_property_type); - if ($new_property_type->isEqualTo($old_property_type)) { - // This didn't change anything - return $context; - } - return $context->withThisPropertySetToTypeByName($property_name, $new_property_type); - } - - /** - * @param Node $node a node of kind ast\AST_PROP (e.g. the argument of is_array($this->prop_name)) - * This is a no-op of the expression is not $this. - * @param Closure(UnionType):UnionType $type_mapping_callback - * Given a union type, returns the resulting union type. - * @param Context $context - */ - protected function modifyPropertySimple(Node $node, Closure $type_mapping_callback, Context $context) : Context - { - if (!self::isThisVarNode($node->children['expr'])) { - return $context; - } - return self::modifyPropertyOfThisSimple($node, $type_mapping_callback, $context); - } - - /** - * @param Node|mixed $node - * @return ?string the name of the variable in a chain of field accesses such as $varName['field'][$i] - */ - private static function getVarNameOfDimNode($node) - { - // Loop to support getting the var name in is_array($x['field'][0]) - while (true) { - if (!($node instanceof Node)) { - return null; - } - if ($node->kind === ast\AST_VAR) { - break; - } - if ($node->kind === ast\AST_DIM) { - $node = $node->children['expr']; - if (!$node instanceof Node) { - return null; - } - continue; - } - - // TODO: Handle more than one level of nesting - return null; - } - $var_name = $node->children['name']; - return is_string($var_name) ? $var_name : null; - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ContextMergeVisitor.php b/vendor/phan/phan/src/Phan/Analysis/ContextMergeVisitor.php deleted file mode 100644 index e073941..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ContextMergeVisitor.php +++ /dev/null @@ -1,389 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use AssertionError; -use ast\Node; -use Phan\AST\Visitor\KindVisitorImplementation; -use Phan\Language\Context; -use Phan\Language\Scope; -use Phan\Language\Type\NullType; -use Phan\Language\UnionType; - -/** - * This will merge inferred variable types from multiple contexts in branched control structures - * (E.g. if/elseif/else, try/catch, loops, ternary operators, etc. - */ -class ContextMergeVisitor extends KindVisitorImplementation -{ - /** - * @var Context - * The context in which the node we're going to be looking - * at exits. - */ - private $context; - - /** - * @var array<int,Context> - * A list of the contexts returned after depth-first - * parsing of all first-level children of this node - */ - private $child_context_list; - - /** - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - * - * @param array<int,Context> $child_context_list - * A list of the contexts returned after depth-first - * parsing of all first-level children of this node - */ - public function __construct( - Context $context, - array $child_context_list - ) { - $this->context = $context; - $this->child_context_list = $child_context_list; - } - - /** - * Default visitor for node kinds that do not have - * an overriding method - * - * @param Node $unused_node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visit(Node $unused_node) : Context - { - // TODO: if ($this->context->isInGlobalScope()) { - // copy local to global - // } - - return \end($this->child_context_list) ?: $this->context; - } - - /** - * Merges the only try block of a try/catch node into the parent context. - * This acts as though the entire block succeeds or throws on the first statement, which isn't necessarily the case. - * - * visitTry() was split out into multiple functions for the following reasons: - * - * 1. The try{} block affects the Context of catch blocks (and finally block), if any - * 2. The catch blocks affect the Context of the finally block, if any - * - * TODO: Look at ways to improve accuracy based on inferences of the exit status of the node? - */ - public function mergeTryContext(Node $node) : Context - { - if (\count($this->child_context_list) !== 1) { - throw new AssertionError("Expected one child context in " . __METHOD__); - } - - // Get the list of scopes for each branch of the - // conditional - $context = $this->context; - $try_context = $this->child_context_list[0]; - - if (self::willRemainingStatementsBeAnalyzedAsIfTryMightFail($node)) { - return $this->combineScopeList([ - $context->getScope(), - $try_context->getScope() - ]); - } - return $try_context; - } - - private static function willRemainingStatementsBeAnalyzedAsIfTryMightFail(Node $node) : bool - { - if ($node->children['finally'] !== null) { - // We want to analyze finally as if the try block (and one or more of the catch blocks) was or wasn't executed. - // ... This isn't optimal. - // A better solution would be to analyze finally{} twice, - // 1. As if try could fail - // 2. As if try did not fail, using the latter to analyze statements after the finally{}. - return true; - } - // E.g. after analyzing the following code: - // try { $x = expr(); } catch (Exception $e) { echo "Caught"; return; } catch (OtherException $e) { continue; } - // Phan should infer that $x is guaranteed to be defined. - foreach ($node->children['catches']->children ?? [] as $catch_node) { - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this is never null - if (BlockExitStatusChecker::willUnconditionallySkipRemainingStatements($catch_node->children['stmts'])) { - return true; - } - } - return false; - } - - /** - * Returns a context resulting from merging the possible variable types from the catch statements - * that will fall through. - */ - public function mergeCatchContext(Node $node) : Context - { - if (\count($this->child_context_list) < 2) { - throw new AssertionError("Expected at least two contexts in " . __METHOD__); - } - // Get the list of scopes for each branch of the - // conditional - $scope_list = \array_map(static function (Context $context) : Scope { - return $context->getScope(); - }, $this->child_context_list); - - $catch_scope_list = []; - $catch_nodes = $node->children['catches']->children; - foreach ($catch_nodes as $i => $catch_node) { - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this is never null - if (!BlockExitStatusChecker::willUnconditionallySkipRemainingStatements($catch_node->children['stmts'])) { - $catch_scope_list[] = $scope_list[$i + 1]; - } - } - // TODO: Check if try node unconditionally returns. - - // Merge in the types for any variables found in a catch. - // if ($node->children['finally'] !== null) { - // If we have to analyze a finally statement later, - // then be conservative and assume the try statement may or may not have failed. - // E.g. the below example must have a inferred type of string|false - // $x = new stdClass(); try {...; $x = (string)fn(); } catch(Exception $e) { $x = false; } - // $try_scope = $this->context->getScope(); - // } else { - // If we don't have to worry about analyzing the finally statement, then assume that the entire try statement succeeded or the a catch statement succeeded. - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - $try_scope = \reset($this->child_context_list)->getScope(); - // } - - if (\count($catch_scope_list) === 0) { - // All of the catch statements will unconditionally rethrow or return. - // So, after the try and catch blocks (finally is analyzed separately), - // the context is the same as if the try block finished successfully. - return $this->context->withScope($try_scope); - } - - foreach ($try_scope->getVariableMap() as $variable_name => $variable) { - $variable_name = (string)$variable_name; // e.g. ${42} - foreach ($catch_scope_list as $catch_scope) { - // Merge types if try and catch have a variable in common - if ($catch_scope->hasVariableWithName($variable_name)) { - $catch_variable = $catch_scope->getVariableByName( - $variable_name - ); - - $variable->setUnionType($variable->getUnionType()->withUnionType( - $catch_variable->getUnionType() - )); - } - } - } - - // Look for variables that exist in catch, but not try - foreach ($catch_scope_list as $catch_scope) { - foreach ($catch_scope->getVariableMap() as $variable_name => $variable) { - $variable_name = (string)$variable_name; - if (!$try_scope->hasVariableWithName($variable_name)) { - // Note that it can be null - $variable->setUnionType($variable->getUnionType()->withType( - NullType::instance(false) - )); - - // Add it to the try scope - $try_scope->addVariable($variable); - } - } - } - - // Set the new scope with only the variables and types - // that are common to all branches - return $this->context->withScope($try_scope); - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitIf(Node $node) : Context - { - // Get the list of scopes for each branch of the - // conditional - $scope_list = \array_map(static function (Context $context) : Scope { - return $context->getScope(); - }, $this->child_context_list); - - $has_else = self::hasElse($node->children); - - // If we're not guaranteed to hit at least one - // branch, mark the incoming scope as a possibility - if (!$has_else) { - $scope_list[] = $this->context->getScope(); - } - - // If there weren't multiple branches, continue on - // as if the conditional never happened - if (\count($scope_list) < 2) { - // @phan-suppress-next-line PhanPossiblyFalseTypeReturn child_context_list is not empty - return \reset($this->child_context_list); - } - - return $this->combineScopeList($scope_list); - } - - /** - * @param array<mixed,Node|mixed> $children children of a Node of kind AST_IF - */ - private static function hasElse(array $children) : bool - { - foreach ($children as $child_node) { - if ($child_node instanceof Node - && \is_null($child_node->children['cond'])) { - return true; - } - } - return false; - } - - /** - * A generic helper method to merge multiple Contexts. (e.g. for use outside of BlockAnalysisVisitor) - * If you wish to include the base context, add it to $child_context_list in the constructor of ContextMergeVisitor. - */ - public function combineChildContextList() : Context - { - $child_context_list = $this->child_context_list; - if (\count($child_context_list) < 2) { - throw new AssertionError("Expected at least two child contexts in " . __METHOD__); - } - $scope_list = \array_map(static function (Context $context) : Scope { - return $context->getScope(); - }, $child_context_list); - return $this->combineScopeList($scope_list); - } - - /** - * Returns a new scope which combines the parent scope with a list of 2 or more child scopes - * (one of those scopes is permitted to be the parent scope) - * @param array<int,Scope> $scope_list - */ - public function combineScopeList(array $scope_list) : Context - { - if (\count($scope_list) < 2) { - throw new AssertionError("Expected at least two child contexts in " . __METHOD__); - } - // Get a list of all variables in all scopes - $variable_map = []; - foreach ($scope_list as $scope) { - foreach ($scope->getVariableMap() as $name => $variable) { - $variable_map[$name] = $variable; - } - } - - // A function that determines if a variable is defined on - // every branch - $is_defined_on_all_branches = - /** @return bool */ - static function (string $variable_name) use ($scope_list) { - foreach ($scope_list as $scope) { - if (!$scope->hasVariableWithName($variable_name)) { - return false; - } - } - return true; - }; - - // Get the intersection of all types for all versions of - // the variable from every side of the branch - $union_type = - /** @return UnionType */ - static function (string $variable_name) use ($scope_list) { - $previous_type = null; - $type_list = []; - // Get a list of all variables with the given name from - // each scope - foreach ($scope_list as $scope) { - if (!$scope->hasVariableWithName($variable_name)) { - continue; - } - - $type = $scope->getVariableByName($variable_name)->getUnionType(); - // Frequently, a branch won't even modify a variable's type. - // The immutable UnionType might have the exact same instance - if ($type !== $previous_type) { - $type_list[] = $type; - - $previous_type = $type; - } - } - - if (\count($type_list) < 2) { - $result = \reset($type_list) ?: UnionType::empty(); - } else { - // compute the un-normalized types - $result = UnionType::merge($type_list); - } - - $result_count = $result->typeCount(); - foreach ($type_list as $type) { - if ($type->typeCount() < $result_count) { - // normalize it if any of the types varied - // (i.e. one of the types lacks types in the type union) - // - // This is useful to avoid ending up with "bool|?false|true" (Will convert to "?bool") - return $result->asNormalizedTypes(); - } - } - // Otherwise, don't normalize it - The different contexts didn't differ in the union types - return $result; - }; - - // Clone the incoming scope so we can modify it - // with the outgoing merged scope - $scope = clone($this->context->getScope()); - - foreach ($variable_map as $name => $variable) { - $name = (string)$name; - // Skip variables that are only partially defined - if (!$is_defined_on_all_branches($name)) { - if ($this->context->getIsStrictTypes()) { - continue; - } else { - // Limit the type of the variable to the subset - // of types that are common to all branches - // Record that it can be null, as the best available equivalent for undefined. - $variable = clone($variable); - - $variable->setUnionType( - $union_type($name)->withType( - NullType::instance(false) - ) - ); - - // Add the variable to the outgoing scope - $scope->addVariable($variable); - continue; - } - } - - // Limit the type of the variable to the subset - // of types that are common to all branches - $variable = clone($variable); - - $variable->setUnionType( - $union_type($name) - ); - - // Add the variable to the outgoing scope - $scope->addVariable($variable); - } - - // Set the new scope with only the variables and types - // that are common to all branches - return $this->context->withScope($scope); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/DuplicateClassAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/DuplicateClassAnalyzer.php deleted file mode 100644 index 672009f..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/DuplicateClassAnalyzer.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use Phan\CodeBase; -use Phan\Issue; -use Phan\Language\Element\Clazz; - -/** - * Analyzer that checks for duplicate classes/traits/interfaces. - */ -class DuplicateClassAnalyzer -{ - /** - * Check to see if the given Clazz is a duplicate - * - * @return void - */ - public static function analyzeDuplicateClass( - CodeBase $code_base, - Clazz $clazz - ) { - // Determine if its a duplicate by looking to see if - // the FQSEN is suffixed with an alternate ID. - - if (!$clazz->getFQSEN()->isAlternate()) { - return; - } - - $original_fqsen = $clazz->getFQSEN()->getCanonicalFQSEN(); - - // @phan-suppress-next-line PhanPartialTypeMismatchArgument static method has ambiguity - if (!$code_base->hasClassWithFQSEN($original_fqsen)) { - // If there's a missing class we'll catch that - // elsewhere - return; - } - - // Get the original class - // @phan-suppress-next-line PhanPartialTypeMismatchArgument static method has ambiguity - $original_class = $code_base->getClassByFQSEN($original_fqsen); - - // Check to see if the original definition was from - // an internal class - if ($original_class->isPHPInternal()) { - if (!$clazz->checkHasSuppressIssueAndIncrementCount(Issue::RedefineClassInternal)) { - Issue::maybeEmit( - $code_base, - $clazz->getContext(), - Issue::RedefineClassInternal, - $clazz->getFileRef()->getLineNumberStart(), - (string)$clazz, - $clazz->getFileRef()->getFile(), - $clazz->getFileRef()->getLineNumberStart(), - (string)$original_class - ); - } - - // Otherwise, print the coordinates of the original - // definition - } else { - if (!$clazz->checkHasSuppressIssueAndIncrementCount(Issue::RedefineClass)) { - Issue::maybeEmit( - $code_base, - $clazz->getContext(), - Issue::RedefineClass, - $clazz->getFileRef()->getLineNumberStart(), - (string)$clazz, - $clazz->getFileRef()->getFile(), - $clazz->getFileRef()->getLineNumberStart(), - (string)$original_class, - $original_class->getFileRef()->getFile(), - $original_class->getFileRef()->getLineNumberStart() - ); - } - } - - return; - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/DuplicateFunctionAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/DuplicateFunctionAnalyzer.php deleted file mode 100644 index 445d9e2..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/DuplicateFunctionAnalyzer.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use Phan\CodeBase; -use Phan\Issue; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; - -/** - * Checks to see if the given method is a duplicate of another method - */ -class DuplicateFunctionAnalyzer -{ - - /** - * Check to see if the given FunctionInterface is a duplicate - * - * @return void - */ - public static function analyzeDuplicateFunction( - CodeBase $code_base, - FunctionInterface $method - ) { - $fqsen = $method->getFQSEN(); - - if (!$fqsen->isAlternate()) { - return; - } - - $original_fqsen = $fqsen->getCanonicalFQSEN(); - - if ($original_fqsen instanceof FullyQualifiedFunctionName) { - if (!$code_base->hasFunctionWithFQSEN($original_fqsen)) { - return; - } - - $original_method = $code_base->getFunctionByFQSEN( - $original_fqsen - ); - } else { - if (!$code_base->hasMethodWithFQSEN($original_fqsen)) { - return; - } - - $original_method = $code_base->getMethodByFQSEN($original_fqsen); - } - - $method_name = $method->getName(); - - if ($original_method->isPHPInternal()) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::RedefineFunctionInternal, - $method->getFileRef()->getLineNumberStart(), - $method_name, - $method->getFileRef()->getFile(), - $method->getFileRef()->getLineNumberStart() - ); - } else { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::RedefineFunction, - $method->getFileRef()->getLineNumberStart(), - $method_name, - $method->getFileRef()->getFile(), - $method->getFileRef()->getLineNumberStart(), - $original_method->getFileRef()->getFile(), - $original_method->getFileRef()->getLineNumberStart() - ); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/GotoAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/GotoAnalyzer.php deleted file mode 100644 index 0ab2983..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/GotoAnalyzer.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use ast; -use ast\Node; - -/** - * Analyzes uses of goto - */ -class GotoAnalyzer -{ - /** - * Finds the label set for the scope of a node with parent node list $parent_node_list - * @param array<int,Node> $parent_node_list - * @return array<string,true> - */ - public static function getLabelSet(array $parent_node_list) : array - { - // Find the AST_STMT_LIST that is the root of the function-like - $prev_node = null; - for ($i = \count($parent_node_list) - 1; $i >= 0; $i--) { - $node = $parent_node_list[$i]; - if (\in_array($node->kind, [ast\AST_FUNC_DECL, ast\AST_CLOSURE, ast\AST_METHOD], true)) { - break; - } - $prev_node = $node; - } - if (!$prev_node) { - return []; - } - // $prev_node is the AST_STMT_LIST in the global scope or the nearest function-like scope. - // @phan-suppress-next-line PhanUndeclaredProperty deliberately adding this to a dynamic property to avoid recomputing it for large function bodies. - return $prev_node->used_label_set ?? ($prev_node->used_label_set = self::computeLabelSet($prev_node)); - } - - /** - * @return array<string,true> the set of labels that are used by "goto label" in this function-like scope or global scope. - */ - private static function computeLabelSet(Node $node) : array - { - $result = []; - $nodes = []; - while (true) { - $kind = $node->kind; - // fprintf(STDERR, "Processing node of kind %s\n", ast\get_kind_name($kind)); - switch ($kind) { - case ast\AST_FUNC_DECL: - case ast\AST_CLOSURE: - case ast\AST_METHOD: - case ast\AST_CLASS: - break; - case ast\AST_GOTO: - $result[(string)$node->children['label']] = true; - break; - default: - foreach ($node->children as $child_node) { - if ($child_node instanceof Node) { - $nodes[] = $child_node; - } - } - } - if (\count($nodes) === 0) { - return $result; - } - $node = \array_pop($nodes); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/NegatedConditionVisitor.php b/vendor/phan/phan/src/Phan/Analysis/NegatedConditionVisitor.php deleted file mode 100644 index d2db45a..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/NegatedConditionVisitor.php +++ /dev/null @@ -1,1012 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use ast; -use ast\flags; -use ast\Node; -use Closure; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\AST\Visitor\KindVisitorImplementation; -use Phan\BlockAnalysisVisitor; -use Phan\CodeBase; -use Phan\Exception\IssueException; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\Variable; -use Phan\Language\Type; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\FloatType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\IterableType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\ResourceType; -use Phan\Language\Type\ScalarType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; -use Phan\Language\UnionTypeBuilder; - -/** - * A visitor that takes a Context and a Node for a condition and returns a Context that has been updated with the negation of that condition. - */ -class NegatedConditionVisitor extends KindVisitorImplementation implements ConditionVisitorInterface -{ - // TODO: if (a || b || c || d) might get really slow, due to creating both ConditionVisitor and NegatedConditionVisitor - use ConditionVisitorUtil; - - /** - * @var Context - * The context in which the node we're going to be looking - * at exits. - */ - protected $context; - - /** - * @param CodeBase $code_base - * A code base needs to be passed in because we require - * it to be initialized before any classes or files are - * loaded. - * - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - */ - public function __construct( - CodeBase $code_base, - Context $context - ) { - $this->code_base = $code_base; - $this->context = $context; - } - - /** - * Default visitor for node kinds that do not have - * an overriding method - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visit(Node $node) : Context - { - $this->checkVariablesDefined($node); - return $this->context; - } - - /** - * Check if variables from within a generic condition are defined. - * @param Node $node - * A node to parse - * @return void - */ - private function checkVariablesDefined(Node $node) - { - while ($node->kind === ast\AST_UNARY_OP) { - $node = $node->children['expr']; - if (!($node instanceof Node)) { - return; - } - } - // Get the type just to make sure everything - // is defined. - UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node, - true - ); - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitBinaryOp(Node $node) : Context - { - $flags = $node->flags ?? 0; - switch ($flags) { - case flags\BINARY_BOOL_OR: - return $this->analyzeShortCircuitingOr($node->children['left'], $node->children['right']); - case flags\BINARY_BOOL_AND: - return $this->analyzeShortCircuitingAnd($node->children['left'], $node->children['right']); - case flags\BINARY_IS_IDENTICAL: - $this->checkVariablesDefined($node); - return $this->analyzeAndUpdateToBeNotIdentical($node->children['left'], $node->children['right']); - case flags\BINARY_IS_EQUAL: - $this->checkVariablesDefined($node); - return $this->analyzeAndUpdateToBeNotEqual($node->children['left'], $node->children['right']); - case flags\BINARY_IS_NOT_IDENTICAL: - case flags\BINARY_IS_NOT_EQUAL: - $this->checkVariablesDefined($node); - // TODO: Add a different function for IS_NOT_EQUAL, e.g. analysis of != null should be different from !== null (First would remove FalseType) - return $this->analyzeAndUpdateToBeIdentical($node->children['left'], $node->children['right']); - case flags\BINARY_IS_GREATER: - $this->checkVariablesDefined($node); - return $this->analyzeAndUpdateToBeCompared($node->children['left'], $node->children['right'], flags\BINARY_IS_SMALLER_OR_EQUAL); - case flags\BINARY_IS_GREATER_OR_EQUAL: - $this->checkVariablesDefined($node); - return $this->analyzeAndUpdateToBeCompared($node->children['left'], $node->children['right'], flags\BINARY_IS_SMALLER); - case flags\BINARY_IS_SMALLER: - $this->checkVariablesDefined($node); - return $this->analyzeAndUpdateToBeCompared($node->children['left'], $node->children['right'], flags\BINARY_IS_GREATER_OR_EQUAL); - case flags\BINARY_IS_SMALLER_OR_EQUAL: - $this->checkVariablesDefined($node); - return $this->analyzeAndUpdateToBeCompared($node->children['left'], $node->children['right'], flags\BINARY_IS_GREATER); - default: - $this->checkVariablesDefined($node); - return $this->context; - } - } - - /** - * Helper method - * @param Node|mixed $left - * a Node or non-node to parse (possibly an AST literal) - * - * @param Node|mixed $right - * a Node or non-node to parse (possibly an AST literal) - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - private function analyzeShortCircuitingAnd($left, $right) : Context - { - // Analyze expressions such as if (!(is_string($x) || is_int($x))) - // which would be equivalent to if (!is_string($x)) { if (!is_int($x)) { ... }} - - // Aside: If left/right is not a node, left/right is a literal such as a number/string, and is either always truthy or always falsey. - // Inside of this conditional may be dead or redundant code. - - // Aside: If left/right is not a node, left/right is a literal such as a number/string, and is either always truthy or always falsey. - // Inside of this conditional may be dead or redundant code. - if (!($left instanceof Node)) { - if (!$left) { - return $this->context; - } - return $this($right); - } - if (!($right instanceof Node)) { - if (!$right) { - return $this->context; - } - return $this($left); - } - $code_base = $this->code_base; - $context = $this->context; - $left_false_context = (new NegatedConditionVisitor($code_base, $context))($left); - $left_true_context = (new ConditionVisitor($code_base, $context))($left); - // We analyze the right-hand side of `cond($x) && cond2($x)` as if `cond($x)` was true. - $right_false_context = (new NegatedConditionVisitor($code_base, $left_true_context))($right); - // When the NegatedConditionVisitor is false, at least one of the left or right contexts must be false. - // (NegatedConditionVisitor returns a context for when the input Node's value was falsey) - return (new ContextMergeVisitor($context, [$left_false_context, $right_false_context]))->combineChildContextList(); - } - - /** - * Helper method - * @param Node|mixed $left - * a Node or non-node to parse (possibly an AST literal) - * - * @param Node|mixed $right - * a Node or non-node to parse (possibly an AST literal) - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - private function analyzeShortCircuitingOr($left, $right) : Context - { - // Analyze expressions such as if (!(is_string($x) || is_int($x))) - // which would be equivalent to if (!is_string($x)) { if (!is_int($x)) { ... }} - - // Aside: If left/right is not a node, left/right is a literal such as a number/string, and is either always truthy or always falsey. - // Inside of this conditional may be dead or redundant code. - if ($left instanceof Node) { - $this->context = $this($left); - } - if ($right instanceof Node) { - return $this($right); - } - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitUnaryOp(Node $node) : Context - { - $expr_node = $node->children['expr']; - $flags = $node->flags; - if ($flags !== flags\UNARY_BOOL_NOT) { - if ($expr_node instanceof Node) { - if ($flags === flags\UNARY_SILENCE) { - return $this->__invoke($expr_node); - } - $this->checkVariablesDefined($expr_node); - } - return $this->context; - } - // TODO: Emit dead code issue for non-nodes - if ($expr_node instanceof Node) { - // The negated version of a NegatedConditionVisitor is a ConditionVisitor. - return (new ConditionVisitor($this->code_base, $this->context))($expr_node); - } - return $this->context; - } - - /** - * Look at elements of the form `is_array($v)` and modify - * the type of the variable to negate that check. - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitCall(Node $node) - { - $raw_function_name = self::getFunctionName($node); - if (!\is_string($raw_function_name)) { - return $this->context; - } - $args = $node->children['args']->children; - - $context = $this->context; - $function_name = \strtolower(\ltrim($raw_function_name, '\\')); - if (self::isArgumentListWithVarAsFirstArgument($args)) { - if (\count($args) !== 1) { - /*if (\strcasecmp($function_name, 'is_a') === 0) { - return $this->analyzeNegationOfVariableIsA($args, $context); - }*/ - return $context; - } - static $map; - if ($map === null) { - $map = self::createNegationCallbackMap(); - } - // TODO: Make this generic to all type assertions? E.g. if (!is_string($x)) removes 'string' from type, makes '?string' (nullable) into 'null'. - // This may be redundant in some places if AST canonicalization is used, but still useful in some places - // TODO: Make this generic so that it can be used in the 'else' branches? - $callback = $map[$function_name] ?? null; - if ($callback === null) { - return $context; - } - return $callback( - $this, - $args[0], // @phan-suppress-current-line PhanPartialTypeMismatchArgument - $context - ); - } - if ($function_name === 'array_key_exists') { - // @phan-suppress-next-line PhanPartialTypeMismatchArgument - return $this->analyzeArrayKeyExistsNegation($args); - } - return $context; - } - - /** - * @return Context - */ - public function visitVar(Node $node) - { - $this->checkVariablesDefined($node); - return $this->removeTruthyFromVariable($node, $this->context, false); - } - - /** - * @param Node $node - * A node to parse, with kind ast\AST_PROP (e.g. `if (!$this->prop_name)`) - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitProp(Node $node) : Context - { - $expr_node = $node->children['expr']; - if (!($expr_node instanceof Node)) { - return $this->context; - } - if ($expr_node->kind !== ast\AST_VAR || $expr_node->children['name'] !== 'this') { - return $this->context; - } - if (!\is_string($node->children['prop'])) { - return $this->context; - } - return $this->modifyPropertyOfThisSimple( - $node, - static function (UnionType $type) : UnionType { - return $type->nonTruthyClone(); - }, - $this->context - ); - } - - /** - * @param array<int,Node|string|int|float> $args - */ - private function analyzeArrayKeyExistsNegation(array $args) : Context - { - if (\count($args) !== 2) { - return $this->context; - } - $var_node = $args[1]; - if (!($var_node instanceof Node)) { - return $this->context; - } - return $this->updateVariableWithConditionalFilter( - $var_node, - $this->context, - static function (UnionType $_) : bool { - return true; - }, - function (UnionType $type) use ($args) : UnionType { - if ($type->hasTopLevelArrayShapeTypeInstances()) { - return $this->withNullOrUnsetArrayShapeTypes($type, $args[0], $this->context, true); - } - return $type; - }, - true - ); - } - - // TODO: empty, isset - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitInstanceof(Node $node) : Context - { - //$this->checkVariablesDefined($node); - // Only look at things of the form - // `$variable instanceof ClassName` - $expr_node = $node->children['expr']; - $context = $this->context; - if (!($expr_node instanceof Node)) { - return $context; - } - $class_node = $node->children['class']; - if (!($class_node instanceof Node)) { - return $context; - } - if ($expr_node->kind !== ast\AST_VAR) { - return $this->modifyComplexExpression( - $expr_node, - /** - * @param array<int,mixed> $args - * @return void - * @suppress PhanUnusedClosureParameter - */ - function (CodeBase $code_base, Context $context, Variable $variable, array $args) use ($class_node) { - $union_type = $this->computeNegatedInstanceofType($variable->getUnionType(), $class_node); - if ($union_type) { - $variable->setUnionType($union_type); - } - }, - $context, - [] - ); - } - - $code_base = $this->code_base; - - try { - // Get the variable we're operating on - $variable = $this->getVariableFromScope($expr_node, $context); - if (\is_null($variable)) { - return $context; - } - - // Get the type that we're checking it against - $new_variable_type = $this->computeNegatedInstanceofType($variable->getUnionType(), $class_node); - if (!$new_variable_type) { - // We don't know what it asserted it wasn't. - return $context; - } - - // TODO: Assert that instanceof right-hand type is valid in NegatedConditionVisitor as well - - // Make a copy of the variable - $variable = clone($variable); - // See https://secure.php.net/instanceof - - $variable->setUnionType($new_variable_type); - - // Overwrite the variable with its new type - $context = $context->withScopeVariable( - $variable - ); - } catch (IssueException $exception) { - Issue::maybeEmitInstance($code_base, $context, $exception->getIssueInstance()); - } catch (\Exception $_) { - // Swallow it - } - - return $context; - } - - /** - * Compute the type of $union_type after asserting `!(expr instanceof $class_node)` - * @param Node|mixed $class_node - * @return ?UnionType - */ - private function computeNegatedInstanceofType(UnionType $union_type, $class_node) - { - $right_hand_union_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $class_node - )->objectTypes(); - - if ($right_hand_union_type->typeCount() !== 1) { - return null; - } - $right_hand_type = $right_hand_union_type->getTypeSet()[0]; - return $union_type->withoutSubclassesOf($this->code_base, $right_hand_type); - } - - /* - private function analyzeNegationOfVariableIsA(array $args, Context $context) : Context - { - // TODO: implement - return $context; - } - */ - - /** - * @return array<string,Closure> (NegatedConditionVisitor $cv, Node $var_node, Context $context) -> Context - * @phan-return array<string,Closure(NegatedConditionVisitor,Node|int|string|float,Context):Context> - */ - private static function createNegationCallbackMap() : array - { - $remove_null_cb = static function (NegatedConditionVisitor $cv, Node $var_node, Context $context) : Context { - return $cv->removeNullFromVariable($var_node, $context, false); - }; - - // Remove any Types from UnionType that are subclasses of $base_class_name - $make_basic_negated_assertion_callback = static function (string $base_class_name) : Closure { - return static function (NegatedConditionVisitor $cv, Node $var_node, Context $context) use ($base_class_name) : Context { - return $cv->updateVariableWithConditionalFilter( - $var_node, - $context, - static function (UnionType $union_type) use ($base_class_name) : bool { - return $union_type->hasTypeMatchingCallback(static function (Type $type) use ($base_class_name) : bool { - return $type instanceof $base_class_name; - }); - }, - static function (UnionType $union_type) use ($base_class_name) : UnionType { - $new_type_builder = new UnionTypeBuilder(); - $has_null = false; - $has_other_nullable_types = false; - // Add types which are not instances of $base_class_name - foreach ($union_type->getTypeSet() as $type) { - if ($type instanceof $base_class_name) { - $has_null = $has_null || $type->getIsNullable(); - continue; - } - $has_other_nullable_types = $has_other_nullable_types || $type->getIsNullable(); - $new_type_builder->addType($type); - } - // Add Null if some of the rejected types were were nullable, and none of the accepted types were nullable - if ($has_null && !$has_other_nullable_types) { - $new_type_builder->addType(NullType::instance(false)); - } - return $new_type_builder->getUnionType(); - }, - false - ); - }; - }; - $remove_float_callback = $make_basic_negated_assertion_callback(FloatType::class); - $remove_int_callback = $make_basic_negated_assertion_callback(IntType::class); - /** - * @param Closure(Type):bool $type_filter - * @return Closure(NegatedConditionVisitor,Node,Context):Context - */ - $remove_conditional_function_callback = static function (Closure $type_filter) : Closure { - return static function (NegatedConditionVisitor $cv, Node $var_node, Context $context) use ($type_filter) : Context { - return $cv->updateVariableWithConditionalFilter( - $var_node, - $context, - static function (UnionType $union_type) use ($type_filter) : bool { - return $union_type->hasTypeMatchingCallback($type_filter); - }, - static function (UnionType $union_type) use ($type_filter) : UnionType { - $new_type_builder = new UnionTypeBuilder(); - $has_null = false; - $has_other_nullable_types = false; - // Add types which are not scalars - foreach ($union_type->getTypeSet() as $type) { - if ($type_filter($type)) { - $has_null = $has_null || $type->getIsNullable(); - continue; - } - $has_other_nullable_types = $has_other_nullable_types || $type->getIsNullable(); - $new_type_builder->addType($type); - } - // Add Null if some of the rejected types were were nullable, and none of the accepted types were nullable - if ($has_null && !$has_other_nullable_types) { - $new_type_builder->addType(NullType::instance(false)); - } - return $new_type_builder->getUnionType(); - }, - false - ); - }; - }; - $remove_scalar_callback = $remove_conditional_function_callback(static function (Type $type) : bool { - return $type instanceof ScalarType && !($type instanceof NullType); - }); - $remove_numeric_callback = $remove_conditional_function_callback(static function (Type $type) : bool { - return $type instanceof IntType || $type instanceof FloatType; - }); - $remove_bool_callback = $remove_conditional_function_callback(static function (Type $type) : bool { - return $type->getIsInBoolFamily(); - }); - $remove_callable_callback = static function (NegatedConditionVisitor $cv, Node $var_node, Context $context) : Context { - return $cv->updateVariableWithConditionalFilter( - $var_node, - $context, - // if (!is_callable($x)) removes non-callable/closure types from $x. - // TODO: Could check for __invoke() - static function (UnionType $union_type) : bool { - return $union_type->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->isCallable(); - }); - }, - static function (UnionType $union_type) : UnionType { - $new_type_builder = new UnionTypeBuilder(); - $has_null = false; - $has_other_nullable_types = false; - // Add types which are not callable - foreach ($union_type->getTypeSet() as $type) { - if ($type->isCallable()) { - $has_null = $has_null || $type->getIsNullable(); - continue; - } - $has_other_nullable_types = $has_other_nullable_types || $type->getIsNullable(); - $new_type_builder->addType($type); - } - // Add Null if some of the rejected types were were nullable, and none of the accepted types were nullable - if ($has_null && !$has_other_nullable_types) { - $new_type_builder->addType(NullType::instance(false)); - } - return $new_type_builder->getUnionType(); - }, - false - ); - }; - // The implementation of Traversable may change in the future (e.g. to support generics). - // So use fromFullyQualifiedString() - $traversable_type = Type::traversableInstance(); - $remove_array_callback = static function (NegatedConditionVisitor $cv, Node $var_node, Context $context) use ($traversable_type) : Context { - return $cv->updateVariableWithConditionalFilter( - $var_node, - $context, - // if (!is_callable($x)) removes non-callable/closure types from $x. - // TODO: Could check for __invoke() - static function (UnionType $union_type) : bool { - return $union_type->hasIterable(); - }, - static function (UnionType $union_type) use ($traversable_type) : UnionType { - $new_type_builder = new UnionTypeBuilder(); - $has_null = false; - $has_other_nullable_types = false; - // Add types which are not callable - foreach ($union_type->getTypeSet() as $type) { - if ($type instanceof ArrayType) { - $has_null = $has_null || $type->getIsNullable(); - continue; - } - - $has_other_nullable_types = $has_other_nullable_types || $type->getIsNullable(); - - if (\get_class($type) === IterableType::class) { - // An iterable that is not an object must be an array - $new_type_builder->addType($traversable_type->withIsNullable($type->getIsNullable())); - continue; - } - $new_type_builder->addType($type); - } - // Add Null if some of the rejected types were were nullable, and none of the accepted types were nullable - if ($has_null && !$has_other_nullable_types) { - $new_type_builder->addType(NullType::instance(false)); - } - return $new_type_builder->getUnionType(); - }, - false - ); - }; - $remove_object_callback = static function (NegatedConditionVisitor $cv, Node $var_node, Context $context) : Context { - return $cv->updateVariableWithConditionalFilter( - $var_node, - $context, - // if (!is_callable($x)) removes non-callable/closure types from $x. - // TODO: Could check for __invoke() - static function (UnionType $union_type) : bool { - return $union_type->hasPossiblyObjectTypes(); - }, - static function (UnionType $union_type) : UnionType { - $new_type_builder = new UnionTypeBuilder(); - $has_null = false; - $has_other_nullable_types = false; - // Add types which are not callable - foreach ($union_type->getTypeSet() as $type) { - if ($type->isObject()) { - $has_null = $has_null || $type->getIsNullable(); - continue; - } - $has_other_nullable_types = $has_other_nullable_types || $type->getIsNullable(); - - if (\get_class($type) === IterableType::class) { - // An iterable that is not an array must be a Traversable - $new_type_builder->addType(ArrayType::instance($type->getIsNullable())); - continue; - } - $new_type_builder->addType($type); - } - // Add Null if some of the rejected types were were nullable, and none of the accepted types were nullable - if ($has_null && !$has_other_nullable_types) { - $new_type_builder->addType(NullType::instance(false)); - } - return $new_type_builder->getUnionType(); - }, - false - ); - }; - - return [ - 'is_null' => $remove_null_cb, - 'is_array' => $remove_array_callback, - 'is_bool' => $remove_bool_callback, - 'is_callable' => $remove_callable_callback, - 'is_double' => $remove_float_callback, - 'is_float' => $remove_float_callback, - 'is_int' => $remove_int_callback, - 'is_integer' => $remove_int_callback, - 'is_iterable' => $make_basic_negated_assertion_callback(IterableType::class), // TODO: Could keep basic array types and classes extending iterable - 'is_long' => $remove_int_callback, - 'is_numeric' => $remove_numeric_callback, - 'is_object' => $remove_object_callback, - 'is_real' => $remove_float_callback, - 'is_resource' => $make_basic_negated_assertion_callback(ResourceType::class), - 'is_scalar' => $remove_scalar_callback, - 'is_string' => $make_basic_negated_assertion_callback(StringType::class), - ]; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitIsset(Node $node) : Context - { - $var_node = $node->children['var']; - if (!($var_node instanceof Node)) { - return $this->context; - } - if (($var_node->kind ?? null) !== ast\AST_VAR) { - return $this->checkComplexIsset($var_node); - } - // if (!isset($x)) - return $this->updateVariableWithNewType($var_node, $this->context, NullType::instance(false)->asUnionType(), true); - } - - /** - * Analyze expressions such as $x['offset'] inside of a negated isset type check - * @return Context - */ - public function checkComplexIsset(Node $var_node) - { - $context = $this->context; - if ($var_node->kind === ast\AST_DIM) { - $expr_node = $var_node; - do { - $parent_node = $expr_node; - $expr_node = $expr_node->children['expr']; - if (!($expr_node instanceof Node)) { - return $context; - } - } while ($expr_node->kind === ast\AST_DIM); - - if ($expr_node->kind === ast\AST_VAR) { - $var_name = $expr_node->children['name']; - if (!\is_string($var_name)) { - return $context; - } - if (!$context->getScope()->hasVariableWithName($var_name)) { - // e.g. assert(!isset($x['key'])) - $x may still be undefined. - return $context; - } - $variable = $context->getScope()->getVariableByName($var_name); - $var_node_union_type = $variable->getUnionType(); - - if ($var_node_union_type->hasTopLevelArrayShapeTypeInstances()) { - $new_union_type = $this->withNullOrUnsetArrayShapeTypes($var_node_union_type, $parent_node->children['dim'], $context, false); - if ($new_union_type !== $var_node_union_type) { - $variable = clone($variable); - $variable->setUnionType($new_union_type); - $context = $context->withScopeVariable($variable); - } - $this->context = $context; - } - } - } elseif ($var_node->kind === ast\AST_PROP) { - $context = $this->modifyPropertySimple($var_node, static function (UnionType $_) : UnionType { - return NullType::instance(false)->asUnionType(); - }, $context); - } - return $context; - } - - /** - * @param UnionType $union_type the union type being modified by inferences from negated isset or array_key_exists - * @param Node|string|float|int|bool $dim_node represents the dimension being accessed. (E.g. can be a literal or an AST_CONST, etc. - * @param Context $context the context with inferences made prior to this condition - */ - private function withNullOrUnsetArrayShapeTypes(UnionType $union_type, $dim_node, Context $context, bool $remove_offset) : UnionType - { - $dim_value = $dim_node instanceof Node ? (new ContextNode($this->code_base, $context, $dim_node))->getEquivalentPHPScalarValue() : $dim_node; - // TODO: detect and warn about null - if (!\is_scalar($dim_value)) { - return $union_type; - } - - $dim_union_type = UnionTypeVisitor::resolveArrayShapeElementTypesForOffset($union_type, $dim_value); - if (!$dim_union_type) { - // There are other types, this dimension does not exist yet. - // Whether or not the union type already has array shape types, don't change the type - return $union_type; - } - if ($remove_offset) { - return $union_type->withoutArrayShapeField($dim_value); - } else { - static $null_and_possibly_undefined = null; - if ($null_and_possibly_undefined === null) { - $null_and_possibly_undefined = NullType::instance(false)->asUnionType()->withIsPossiblyUndefined(true); - } - - return ArrayType::combineArrayShapeTypesWithField($union_type, $dim_value, $null_and_possibly_undefined); - } - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitEmpty(Node $node) : Context - { - $context = $this->context; - $var_node = $node->children['expr']; - if (!($var_node instanceof Node)) { - return $context; - } - // e.g. if (!empty($x)) - if ($var_node->kind === ast\AST_VAR) { - // Don't check if variables are defined - don't emit notices for if (!empty($x)) {}, etc. - $var_name = $var_node->children['name']; - if (\is_string($var_name)) { - if (!$context->getScope()->hasVariableWithName($var_name)) { - // Support analyzing cases such as `if (!empty($x)) { use($x); }`, or `assert(!empty($x))` - // (In the PHP language, empty($x) is equivalent to (!isset($x) || !$x)) - $context->setScope($context->getScope()->withVariable(new Variable( - $context->withLineNumberStart($var_node->lineno ?? 0), - $var_name, - UnionType::empty(), - 0 - ))); - } - return $this->removeFalseyFromVariable($var_node, $context, true); - } - } elseif ($var_node->kind === ast\AST_PROP) { - return $this->removeFalseyFromVariable($var_node, $context, true); - } else { - $context = $this->checkComplexNegatedEmpty($var_node); - } - $this->checkVariablesDefined($node); - return $context; - } - - /** - * @return Context - */ - private function checkComplexNegatedEmpty(Node $var_node) - { - $context = $this->context; - // TODO: !empty($obj->prop['offset']) should imply $obj is not null (removeNullFromVariable) - if ($var_node->kind === ast\AST_DIM) { - $expr_node = $var_node; - do { - $parent_node = $expr_node; - $expr_node = $expr_node->children['expr']; - if (!($expr_node instanceof Node)) { - return $context; - } - } while ($expr_node->kind === ast\AST_DIM); - - if ($expr_node->kind === ast\AST_VAR) { - $var_name = $expr_node->children['name']; - if (!\is_string($var_name)) { - return $context; - } - if (!$context->getScope()->hasVariableWithName($var_name)) { - // Support analyzing cases such as `if (!empty($x['key'])) { use($x); }`, or `assert(!empty($x['key']))` - // (Assume that this is an array, not ArrayAccess, as a heuristic) - $context->setScope($context->getScope()->withVariable(new Variable( - $context->withLineNumberStart($expr_node->lineno ?? 0), - $var_name, - ArrayType::instance(false)->asUnionType(), - 0 - ))); - return $context; - } - $context = $this->removeFalseyFromVariable($expr_node, $context, true); - - $variable = $context->getScope()->getVariableByName($var_name); - $var_node_union_type = $variable->getUnionType(); - - if ($var_node_union_type->hasTopLevelArrayShapeTypeInstances()) { - $context = $this->withNonFalseyArrayShapeTypes($variable, $parent_node->children['dim'], $context, true); - } - $this->context = $context; - } - } - return $this->context; - } - - /** - * @param Variable $variable the variable being modified by inferences from !empty - * @param Node|string|float|int|bool $dim_node represents the dimension being accessed. (E.g. can be a literal or an AST_CONST, etc. - * @param Context $context the context with inferences made prior to this condition - * - * @param bool $non_nullable if an offset is created, will it be non-nullable? - */ - private function withNonFalseyArrayShapeTypes(Variable $variable, $dim_node, Context $context, bool $non_nullable) : Context - { - $dim_value = $dim_node instanceof Node ? (new ContextNode($this->code_base, $this->context, $dim_node))->getEquivalentPHPScalarValue() : $dim_node; - // TODO: detect and warn about null - if (!\is_scalar($dim_value)) { - return $context; - } - - $union_type = $variable->getUnionType(); - $dim_union_type = UnionTypeVisitor::resolveArrayShapeElementTypesForOffset($union_type, $dim_value); - if (!$dim_union_type) { - // There are other types, this dimension does not exist yet - if (!$union_type->hasTopLevelArrayShapeTypeInstances()) { - return $context; - } - $new_union_type = ArrayType::combineArrayShapeTypesWithField($union_type, $dim_value, MixedType::instance(false)->asUnionType()); - $variable = clone($variable); - $variable->setUnionType($new_union_type); - return $context->withScopeVariable( - $variable - ); - // TODO finish - } elseif ($dim_union_type->containsNullableOrUndefined()) { - if (!$non_nullable) { - // The offset in question already exists in the array shape type, and we won't be changing it. - // (E.g. array_key_exists('key', $x) where $x is array{key:?int,other:string}) - return $context; - } - - $variable = clone($variable); - - $variable->setUnionType( - ArrayType::combineArrayShapeTypesWithField($union_type, $dim_value, $dim_union_type->nonFalseyClone()) - ); - - // Overwrite the variable with its new type in this - // scope without overwriting other scopes - return $context->withScopeVariable( - $variable - ); - // TODO finish - } - return $context; - } - - /** - * @param Node $node - * A node to parse - * (Should be useful when analyzing for loops with no breaks (`for (; !is_string($x); ){...}, in the future)) - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitExprList(Node $node) : Context - { - $children = $node->children; - $count = \count($children); - if ($count > 1) { - foreach ($children as $sub_node) { - --$count; - if ($count > 0 && $sub_node instanceof Node) { - $this->checkVariablesDefined($sub_node); - } - } - } - // Only analyze the last expression in the expression list for (negation of) conditions. - $last_expression = \end($node->children); - if ($last_expression instanceof Node) { - return $this($last_expression); - } else { - // TODO: emit no-op warning - return $this->context; - } - } - - /** - * Useful for analyzing `if ($x = foo() && $x->method())` - * - * TODO: Convert $x to empty/false/null types - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitAssign(Node $node) : Context - { - $context = (new BlockAnalysisVisitor($this->code_base, $this->context))->visitAssign($node); - $left = $node->children['var']; - if (!($left instanceof Node)) { - // Other code should warn about this invalid AST - return $context; - } - return (new self($this->code_base, $context))->__invoke($left); - } - - /** - * Useful for analyzing `if ($x =& foo() && $x->method())` - * TODO: Convert $x to empty/false/null types - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitAssignRef(Node $node) : Context - { - $context = (new BlockAnalysisVisitor($this->code_base, $this->context))->visitAssignRef($node); - $left = $node->children['var']; - if (!($left instanceof Node)) { - // Other code should warn about this invalid AST - return $context; - } - return (new self($this->code_base, $context))->__invoke($left); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ParameterTypesAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/ParameterTypesAnalyzer.php deleted file mode 100644 index ca7007d..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ParameterTypesAnalyzer.php +++ /dev/null @@ -1,1231 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\CodeBaseException; -use Phan\Exception\RecursionDepthException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Comment\Parameter as CommentParameter; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Method; -use Phan\Language\Element\Parameter; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type\IterableType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\ObjectType; -use Phan\Language\Type\StaticOrSelfType; -use Phan\Language\Type\TemplateType; -use Phan\Language\Type\VoidType; -use Phan\Language\UnionType; -use function array_merge; -use function strcasecmp; - -/** - * Analyzer of the parameters of function/closure/method signatures. - * - * This will modify union types of parameter declarations based on available information - * such as inheritance, parameter defaults, etc. - * - * This will also warn if inherited parameters are invalid. - * - * (Depends on configuration settings) - */ -class ParameterTypesAnalyzer -{ - - /** - * Check function, closure, and method parameters to make sure they're valid - * - * This will also warn if method parameters are incompatible with the parameters of ancestor methods. - * - * @return void - */ - public static function analyzeParameterTypes( - CodeBase $code_base, - FunctionInterface $method - ) { - try { - self::analyzeParameterTypesInner($code_base, $method); - } catch (RecursionDepthException $_) { - } - } - - /** - * @see analyzeParameterTypes - */ - private static function analyzeParameterTypesInner( - CodeBase $code_base, - FunctionInterface $method - ) { - if (Config::getValue('check_docblock_signature_param_type_match')) { - self::analyzeParameterTypesDocblockSignaturesMatch($code_base, $method); - } - - self::checkCommentParametersAreInOrder($code_base, $method); - $target_php_version = Config::get_closest_target_php_version_id(); - if ($target_php_version < 70200 && !$method->isFromPHPDoc()) { - self::analyzeRealSignatureCompatibility($code_base, $method, $target_php_version); - } - - // Look at each parameter to make sure their types - // are valid - $is_optional_seen = false; - foreach ($method->getParameterList() as $parameter) { - $union_type = $parameter->getUnionType(); - - if ($parameter->isOptional()) { - $is_optional_seen = true; - } else { - if ($is_optional_seen) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::ParamReqAfterOpt, - $parameter->getFileRef()->getLineNumberStart() - ); - } - } - - // Look at each type in the parameter's Union Type - foreach ($union_type->getReferencedClasses() as $outer_type => $type) { - // If it's a reference to self, its OK - if ($method instanceof Method && $type instanceof StaticOrSelfType) { - continue; - } - - if ($type instanceof TemplateType) { - if ($method instanceof Method) { - if ($method->isStatic() && !$method->declaresTemplateTypeInComment($type)) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::TemplateTypeStaticMethod, - $parameter->getFileRef()->getLineNumberStart(), - (string)$method->getFQSEN() - ); - } - } - } else { - // Make sure the class exists - $type_fqsen = FullyQualifiedClassName::fromType($type); - if (!$code_base->hasClassWithFQSEN($type_fqsen)) { - Issue::maybeEmitWithParameters( - $code_base, - $method->getContext(), - Issue::UndeclaredTypeParameter, - $parameter->getFileRef()->getLineNumberStart(), - [$parameter->getName(), (string)$outer_type], - IssueFixSuggester::suggestSimilarClass( - $code_base, - $method->getContext(), - $type_fqsen, - null, - IssueFixSuggester::DEFAULT_CLASS_SUGGESTION_PREFIX, - IssueFixSuggester::CLASS_SUGGEST_CLASSES_AND_TYPES - ) - ); - } - } - } - } - foreach ($method->getRealParameterList() as $parameter) { - $union_type = $parameter->getUnionType(); - foreach ($union_type->getTypeSet() as $type) { - if (!$type->isObjectWithKnownFQSEN()) { - continue; - } - $type_fqsen = FullyQualifiedClassName::fromType($type); - if (!$code_base->hasClassWithFQSEN($type_fqsen)) { - // We should have already warned - continue; - } - $class = $code_base->getClassByFQSEN($type_fqsen); - if ($class->isTrait()) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::TypeInvalidTraitParam, - $parameter->getFileRef()->getLineNumberStart(), - $method->getNameForIssue(), - $parameter->getName(), - $type_fqsen->__toString() - ); - } - } - } - - if ($method instanceof Method) { - if ($method->getName() === '__construct') { - $class = $method->getClass($code_base); - if ($class->isGeneric()) { - $class->hydrate($code_base); - // Call this to emit any warnings about missing template params - $class->getGenericConstructorBuilder($code_base); - } - } - self::analyzeOverrideSignature($code_base, $method); - } - } - - /** - * Precondition: $target_php_version < 70200 - */ - private static function analyzeRealSignatureCompatibility(CodeBase $code_base, FunctionInterface $method, int $target_php_version) - { - $php70_checks = $target_php_version < 70100; - - foreach ($method->getRealParameterList() as $real_parameter) { - foreach ($real_parameter->getUnionType()->getTypeSet() as $type) { - $type_class = \get_class($type); - if ($php70_checks) { - if ($type->getIsNullable()) { - if ($real_parameter->getIsUsingNullableSyntax()) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::CompatibleNullableTypePHP70, - $real_parameter->getFileRef()->getLineNumberStart(), - (string)$type - ); - } - } - if ($type_class === IterableType::class) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::CompatibleIterableTypePHP70, - $real_parameter->getFileRef()->getLineNumberStart(), - (string)$type - ); - } - } - if ($type_class === ObjectType::class) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::CompatibleObjectTypePHP71, - $real_parameter->getFileRef()->getLineNumberStart(), - (string)$type - ); - } - } - } - foreach ($method->getRealReturnType()->getTypeSet() as $type) { - $type_class = \get_class($type); - if ($php70_checks) { - if ($type->getIsNullable()) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::CompatibleNullableTypePHP70, - $method->getFileRef()->getLineNumberStart(), - (string)$type - ); - } - // Could check for use statements, but `php7.1 -l path/to/file.php` would do that already. - if ($type_class === VoidType::class) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::CompatibleVoidTypePHP70, - $method->getFileRef()->getLineNumberStart(), - (string)$type - ); - } elseif ($type_class === IterableType::class) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::CompatibleIterableTypePHP70, - $method->getFileRef()->getLineNumberStart(), - (string)$type - ); - } - } - if ($type_class === ObjectType::class) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::CompatibleObjectTypePHP71, - $method->getFileRef()->getLineNumberStart(), - (string)$type - ); - } - } - } - - /** - * @return void - */ - private static function checkCommentParametersAreInOrder(CodeBase $code_base, FunctionInterface $method) - { - $comment = $method->getComment(); - if ($comment === null) { - return; - } - $parameter_map = $comment->getParameterMap(); - if (\count($parameter_map) < 2) { - // There have to be at least two comment parameters for the parameters to be out of order - return; - } - $prev_index = -1; - $prev_name = -1; - $comment_parameter_map = $comment->getParameterMap(); - $expected_parameter_order = \array_flip(\array_keys($comment_parameter_map)); - foreach ($method->getParameterList() as $parameter) { - $parameter_name = $parameter->getName(); - $parameter_index_in_comment = $expected_parameter_order[$parameter_name] ?? null; - if ($parameter_index_in_comment === null) { - continue; - } - if ($parameter_index_in_comment < $prev_index) { - $comment_param = $comment_parameter_map[$parameter_name] ?? null; - $line = $comment_param ? $comment_param->getLineno() : $method->getFileRef()->getLineNumberStart(); - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::CommentParamOutOfOrder, - $line, - $prev_name, - $parameter_name - ); - return; - } - $prev_name = $parameter_name; - $prev_index = $parameter_index_in_comment; - } - } - - /** - * Make sure signatures line up between methods and the - * methods they override - * - * @see https://en.wikipedia.org/wiki/Liskov_substitution_principle - */ - private static function analyzeOverrideSignature( - CodeBase $code_base, - Method $method - ) { - if (!Config::getValue('analyze_signature_compatibility')) { - return; - } - - // Hydrate the class this method is coming from in - // order to understand if its an override or not - $class = $method->getClass($code_base); - $class->hydrate($code_base); - - // Check to see if the method is an override - // $method->analyzeOverride($code_base); - - // Make sure we're actually overriding something - // TODO(in another PR): check that signatures of magic methods are valid, if not done already (e.g. __get expects one param, most can't define return types, etc.)? - $is_actually_override = $method->getIsOverride(); - - if (!$is_actually_override && $method->isOverrideIntended()) { - self::analyzeOverrideComment($code_base, $method); - } - - if (!$is_actually_override) { - return; - } - - // Get the method(s) that are being overridden - // E.g. if the subclass, the parent class, and an interface the subclass implements implement a method, - // then this has to check two different overrides (Subclass overriding parent class, and subclass overriding abstract method in interface) - try { - $o_method_list = $method->getOverriddenMethods($code_base); - } catch (CodeBaseException $_) { - if (strcasecmp($method->getDefiningFQSEN()->getName(), $method->getFQSEN()->getName()) !== 0) { - // Give up, this is probably a renamed trait method that overrides another trait method. - return; - } - // TODO: Remove if no edge cases are seen. - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::UnanalyzableInheritance, - $method->getFileRef()->getLineNumberStart(), - $method->getFQSEN() - ); - return; - } - foreach ($o_method_list as $o_method) { - self::analyzeOverrideSignatureForOverriddenMethod($code_base, $method, $class, $o_method); - } - } - - /** - * @return void - */ - private static function analyzeOverrideComment(CodeBase $code_base, Method $method) - { - if ($method->getIsMagic()) { - return; - } - // Only emit this issue on the base class, not for the subclass which inherited it - if ($method->getDefiningFQSEN() !== $method->getFQSEN()) { - return; - } - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::CommentOverrideOnNonOverrideMethod, - $method->getFileRef()->getLineNumberStart(), - $method->getFQSEN() - ); - } - - /** - * Make sure signatures line up between methods and a method it overrides. - * - * @see https://en.wikipedia.org/wiki/Liskov_substitution_principle - * - * @param CodeBase $code_base - * @param Method $method the overriding method. - * @param Clazz $class the subclass where the overrides take place. - * @param Method $o_method the overridden method. - */ - private static function analyzeOverrideSignatureForOverriddenMethod( - CodeBase $code_base, - Method $method, - Clazz $class, - Method $o_method - ) { - if ($o_method->isFinal()) { - // Even if it is a constructor, verify that a method doesn't override a final method. - // TODO: different warning for trait (#1126) - self::warnOverridingFinalMethod($code_base, $method, $class, $o_method); - } - - // Unless it is an abstract constructor, - // don't worry about signatures lining up on - // constructors. We just want to make sure that - // calling a method on a subclass won't cause - // a runtime error. We usually know what we're - // constructing at instantiation time, so there - // is less of a risk. - if ($method->getName() === '__construct') { - if (!$o_method->isAbstract()) { - return; - } - } - - // Don't bother warning about incompatible signatures for private methods. - // (But it is an error to override a private final method) - if ($o_method->isPrivate()) { - return; - } - - // Get the class that the overridden method lives on - $o_class = $o_method->getClass($code_base); - - // A lot of analyzeOverrideRealSignature is redundant. - // However, phan should consistently emit both issue types if one of them is suppressed. - self::analyzeOverrideRealSignature($code_base, $method, $class, $o_method, $o_class); - - // Phan needs to complain in some cases, such as a trait existing for an abstract method defined in the class. - // PHP also checks if a trait redefines a method in the class. - if ($o_class->isTrait() && $method->getDefiningFQSEN()->getFullyQualifiedClassName() === $class->getFQSEN()) { - // Give up on analyzing if the class **directly** overrides any (abstract OR non-abstract) method defined by the trait - // TODO: Fix edge cases caused by hack changing FQSEN of private methods - return; - } - - // Get the parameters for that method - $o_parameter_list = $o_method->getParameterList(); - - // If we have a parent type defined, map the method's - // return type and parameter types through it - $type_option = $class->getParentTypeOption(); - - // Map overridden method parameter types through any - // template type parameters we may have - if ($type_option->isDefined()) { - $o_parameter_list = - \array_map(static function (Parameter $parameter) use ($type_option, $code_base) : Parameter { - - if (!$parameter->getUnionType()->hasTemplateTypeRecursive()) { - return $parameter; - } - - $mapped_parameter = clone($parameter); - - $mapped_parameter->setUnionType( - $mapped_parameter->getUnionType()->withTemplateParameterTypeMap( - $type_option->get()->getTemplateParameterTypeMap( - $code_base - ) - ) - ); - - return $mapped_parameter; - }, $o_parameter_list); - } - - // Map overridden method return type through any template - // type parameters we may have - $o_return_union_type = $o_method->getUnionType(); - if ($type_option->isDefined() - && $o_return_union_type->hasTemplateTypeRecursive() - ) { - $o_return_union_type = - $o_return_union_type->withTemplateParameterTypeMap( - $type_option->get()->getTemplateParameterTypeMap( - $code_base - ) - ); - } - - // Determine if the signatures match up - $signatures_match = true; - - // Make sure the count of parameters matches - if ($method->getNumberOfRequiredParameters() - > $o_method->getNumberOfRequiredParameters() - ) { - $signatures_match = false; - } elseif ($method->getNumberOfParameters() - < $o_method->getNumberOfParameters() - ) { - $signatures_match = false; - - // If parameter counts match, check their types - } else { - $real_parameter_list = $method->getRealParameterList(); - $o_real_parameter_list = $o_method->getRealParameterList(); - - foreach ($method->getParameterList() as $i => $parameter) { - if (!isset($o_parameter_list[$i])) { - continue; - } - - $o_parameter = $o_parameter_list[$i]; - - // Changing pass by reference is not ok - // @see https://3v4l.org/Utuo8 - if ($parameter->isPassByReference() != $o_parameter->isPassByReference()) { - $signatures_match = false; - break; - } - - // Variadic parameters must match up. - if ($o_parameter->isVariadic() !== $parameter->isVariadic()) { - $signatures_match = false; - break; - } - - // Check for the presence of real types first, warn if the override has a type but the original doesn't. - $o_real_parameter = $o_real_parameter_list[$i] ?? null; - $real_parameter = $real_parameter_list[$i] ?? null; - if ($o_real_parameter !== null && $real_parameter !== null && !$real_parameter->getUnionType()->isEmpty() && $o_real_parameter->getUnionType()->isEmpty()) { - $signatures_match = false; - break; - } - - // A stricter type on an overriding method is cool - if ($parameter->getUnionType()->isEmpty() - || $parameter->getUnionType()->isType(MixedType::instance(false)) - ) { - continue; - } - - if ($o_parameter->getUnionType()->isEmpty() || $o_parameter->getUnionType()->isType(MixedType::instance(false))) { - continue; - } - - // In php 7.2, it's ok to have a more relaxed type on an overriding method. - // In earlier versions it isn't. - // Because this check is analyzing phpdoc types, so it's fine for php < 7.2 as well. Use `PhanParamSignatureRealMismatch*` for detecting **real** mismatches. - // - // https://3v4l.org/XTm3P - - // If we have types, make sure they line up - // - // TODO: should we be expanding the types on $o_parameter - // via ->asExpandedTypes($code_base)? - // - // @see https://3v4l.org/ke3kp - if (!$o_parameter->getUnionType()->canCastToUnionType( - $parameter->getUnionType() - )) { - $signatures_match = false; - break; - } - } - } - - // Return types should be mappable for LSP - // Note: PHP requires return types to be identical - // The return type should be stricter than or identical to the overridden union type. - // E.g. there is no issue if the overridden return type is empty. - // See https://github.com/phan/phan/issues/1397 - if (!$o_return_union_type->isEmpty()) { - if (!$method->getUnionType()->asExpandedTypes($code_base)->canCastToUnionType( - $o_return_union_type - )) { - $signatures_match = false; - } - } - - // Static or non-static should match - if ($method->isStatic() != $o_method->isStatic()) { - if ($o_method->isStatic()) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::AccessStaticToNonStatic, - $method->getFileRef()->getLineNumberStart(), - $o_method->getFQSEN() - ); - } else { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::AccessNonStaticToStatic, - $method->getFileRef()->getLineNumberStart(), - $o_method->getFQSEN() - ); - } - } - - - if ($o_method->returnsRef() && !$method->returnsRef()) { - $signatures_match = false; - } - - if (!$signatures_match) { - if ($o_method->isPHPInternal()) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::ParamSignatureMismatchInternal, - $method->getFileRef()->getLineNumberStart(), - $method, - $o_method - ); - } else { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::ParamSignatureMismatch, - $method->getFileRef()->getLineNumberStart(), - $method, - $o_method, - $o_method->getFileRef()->getFile(), - $o_method->getFileRef()->getLineNumberStart() - ); - } - } - - // Access must be compatible - if ($o_method->isStrictlyMoreVisibleThan($method)) { - if ($o_method->isPHPInternal()) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::AccessSignatureMismatchInternal, - $method->getFileRef()->getLineNumberStart(), - $method, - $o_method - ); - } else { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::AccessSignatureMismatch, - $method->getFileRef()->getLineNumberStart(), - $method, - $o_method, - $o_method->getFileRef()->getFile(), - $o_method->getFileRef()->getLineNumberStart() - ); - } - } - } - - /** - * Previously, Phan bases the analysis off of phpdoc. - * Keeping that around(e.g. to check that string[] is compatible with string[]) - * and also checking the **real**(non-phpdoc) types. - * - * @param $code_base - * @param $method - The overriding method - * @param $o_method - The overridden method. E.g. if a subclass overrid a base class implementation, then $o_method would be from the base class. - * @param $o_class the overridden class - * @return void - */ - private static function analyzeOverrideRealSignature( - CodeBase $code_base, - Method $method, - Clazz $class, - Method $o_method, - Clazz $o_class - ) { - if ($o_class->isTrait() && $method->getDefiningFQSEN()->getFullyQualifiedClassName() === $class->getFQSEN()) { - // Give up on analyzing if the class **directly** overrides any (abstract OR non-abstract) method defined by the trait - // TODO: Fix edge cases caused by hack changing FQSEN of private methods - return; - } - - // Get the parameters for that method - $o_parameter_list = $o_method->getRealParameterList(); - - // Make sure the count of parameters matches - if ($method->getNumberOfRequiredRealParameters() - > $o_method->getNumberOfRequiredRealParameters() - ) { - self::emitSignatureRealMismatchIssue( - $code_base, - $method, - $o_method, - Issue::ParamSignatureRealMismatchTooManyRequiredParameters, - Issue::ParamSignatureRealMismatchTooManyRequiredParametersInternal, - Issue::ParamSignaturePHPDocMismatchTooManyRequiredParameters, - null, - $method->getNumberOfRequiredRealParameters(), - $o_method->getNumberOfRequiredRealParameters() - ); - return; - } elseif ($method->getNumberOfRealParameters() - < $o_method->getNumberOfRealParameters() - ) { - self::emitSignatureRealMismatchIssue( - $code_base, - $method, - $o_method, - Issue::ParamSignatureRealMismatchTooFewParameters, - Issue::ParamSignatureRealMismatchTooFewParametersInternal, - Issue::ParamSignaturePHPDocMismatchTooFewParameters, - null, - $method->getNumberOfRealParameters(), - $o_method->getNumberOfRealParameters() - ); - return; - // If parameter counts match, check their types - } - $is_possibly_compatible = true; - - // TODO: Stricter checks for parameter types when this is a magic method? - // - If the overriding method is magic, then compare the magic method phpdoc types against the phpdoc+real types of the parent - foreach ($method->getRealParameterList() as $i => $parameter) { - $offset = $i + 1; - // TODO: check if variadic - if (!isset($o_parameter_list[$i])) { - continue; - } - - // TODO: check that the variadic types match up? - $o_parameter = $o_parameter_list[$i]; - - // Changing pass by reference is not ok - // @see https://3v4l.org/Utuo8 - if ($parameter->isPassByReference() != $o_parameter->isPassByReference()) { - $is_reference = $parameter->isPassByReference(); - self::emitSignatureRealMismatchIssue( - $code_base, - $method, - $o_method, - ($is_reference ? Issue::ParamSignatureRealMismatchParamIsReference : Issue::ParamSignatureRealMismatchParamIsNotReference), - ($is_reference ? Issue::ParamSignatureRealMismatchParamIsReferenceInternal : Issue::ParamSignatureRealMismatchParamIsNotReferenceInternal), - ($is_reference ? Issue::ParamSignaturePHPDocMismatchParamIsReference : Issue::ParamSignaturePHPDocMismatchParamIsNotReference), - self::guessCommentParamLineNumber($method, $parameter), - $offset - ); - return; - } - - // Changing variadic to/from non-variadic is not ok? - // (Not absolutely sure about that) - if ($parameter->isVariadic() != $o_parameter->isVariadic()) { - $is_variadic = $parameter->isVariadic(); - self::emitSignatureRealMismatchIssue( - $code_base, - $method, - $o_method, - ($is_variadic ? Issue::ParamSignatureRealMismatchParamVariadic : Issue::ParamSignatureRealMismatchParamNotVariadic), - ($is_variadic ? Issue::ParamSignatureRealMismatchParamVariadicInternal : Issue::ParamSignatureRealMismatchParamNotVariadicInternal), - ($is_variadic ? Issue::ParamSignaturePHPDocMismatchParamVariadic : Issue::ParamSignaturePHPDocMismatchParamNotVariadic), - self::guessCommentParamLineNumber($method, $parameter), - $offset - ); - return; - } - - // Either 0 or both of the params must have types for the signatures to be compatible. - $o_parameter_union_type = $o_parameter->getUnionType(); - $parameter_union_type = $parameter->getUnionType(); - if ($parameter_union_type->isEmpty() != $o_parameter_union_type->isEmpty()) { - if ($parameter_union_type->isEmpty()) { - if (Config::getValue('allow_method_param_type_widening') === false) { - $is_possibly_compatible = false; - self::emitSignatureRealMismatchIssue( - $code_base, - $method, - $o_method, - Issue::ParamSignatureRealMismatchHasNoParamType, - Issue::ParamSignatureRealMismatchHasNoParamTypeInternal, - Issue::ParamSignaturePHPDocMismatchHasNoParamType, - self::guessCommentParamLineNumber($method, $parameter), - $offset, - (string)$o_parameter_union_type - ); - } - continue; - } else { - $is_possibly_compatible = false; - self::emitSignatureRealMismatchIssue( - $code_base, - $method, - $o_method, - Issue::ParamSignatureRealMismatchHasParamType, - Issue::ParamSignatureRealMismatchHasParamTypeInternal, - Issue::ParamSignaturePHPDocMismatchHasParamType, - self::guessCommentParamLineNumber($method, $parameter), - $offset, - (string)$parameter_union_type - ); - continue; - } - } - - // If both have types, make sure they are identical. - // Non-nullable param types can be substituted with the nullable equivalents. - // E.g. A::foo(?int $x) can override BaseClass::foo(int $x) - if (!$parameter_union_type->isEmpty()) { - if (!$o_parameter_union_type->isEqualTo($parameter_union_type) && - !($parameter_union_type->containsNullable() && $o_parameter_union_type->isEqualTo($parameter_union_type->nonNullableClone())) - ) { - // There is one exception to this in php 7.1 - the pseudo-type "iterable" can replace ArrayAccess/array in a subclass - // TODO: Traversable and array work, but Iterator doesn't. Check for those specific cases? - $is_exception_to_rule = $parameter_union_type->hasIterable() && - $o_parameter_union_type->hasIterable() && - ($parameter_union_type->hasType(IterableType::instance(true)) || - $parameter_union_type->hasType(IterableType::instance(false)) && !$o_parameter_union_type->containsNullable()); - - if (!$is_exception_to_rule) { - $is_possibly_compatible = false; - self::emitSignatureRealMismatchIssue( - $code_base, - $method, - $o_method, - Issue::ParamSignatureRealMismatchParamType, - Issue::ParamSignatureRealMismatchParamTypeInternal, - Issue::ParamSignaturePHPDocMismatchParamType, - self::guessCommentParamLineNumber($method, $parameter), - $offset, - (string)$parameter_union_type, - (string)$o_parameter_union_type - ); - continue; - } - } - } - } - - $o_return_union_type = $o_method->getRealReturnType(); - - $return_union_type = $method->isFromPHPDoc() ? $method->getUnionType() : $method->getRealReturnType(); - // If the parent has a return type, then return types should be equal. - // A non-nullable return type can override a nullable return type of the same type. - if (!$o_return_union_type->isEmpty()) { - if (!($o_return_union_type->isEqualTo($return_union_type) || ( - $o_return_union_type->containsNullable() && ($o_return_union_type->nonNullableClone()->isEqualTo($return_union_type))) - )) { - // There is one exception to this in php 7.1 - the pseudo-type "iterable" can replace ArrayAccess/array in a subclass - // TODO: Traversable and array work, but Iterator doesn't. Check for those specific cases? - $is_exception_to_rule = $return_union_type->hasIterable() && - $o_return_union_type->hasIterable() && - ($o_return_union_type->hasType(IterableType::instance(true)) || - $o_return_union_type->hasType(IterableType::instance(false)) && !$return_union_type->containsNullable()); - if (!$is_exception_to_rule) { - $is_possibly_compatible = false; - - self::emitSignatureRealMismatchIssue( - $code_base, - $method, - $o_method, - Issue::ParamSignatureRealMismatchReturnType, - Issue::ParamSignatureRealMismatchReturnTypeInternal, - Issue::ParamSignaturePHPDocMismatchReturnType, - null, - (string)$return_union_type, - (string)$o_return_union_type - ); - } - } - } - if ($is_possibly_compatible) { - if (Config::getValue('inherit_phpdoc_types')) { - self::inheritPHPDoc($code_base, $method, $o_method); - } - } - } - - /** - * @return array<string,CommentParameter> - */ - private static function extractCommentParameterMap(Method $method) : array - { - $comment = $method->getComment(); - return $comment ? $comment->getParameterMap() : []; - } - /** - * Inherit any missing phpdoc types for (at)return and (at)param of $method from $o_method. - * This is the default behavior, see https://www.phpdoc.org/docs/latest/guides/inheritance.html - * - * @return void - */ - private static function inheritPHPDoc( - CodeBase $code_base, - Method $method, - Method $o_method - ) { - // Get the parameters for that method - $phpdoc_parameter_list = $method->getParameterList(); - $o_phpdoc_parameter_list = $o_method->getParameterList(); - $comment_parameter_map = null; - foreach ($phpdoc_parameter_list as $i => $parameter) { - $parameter_type = $parameter->getNonVariadicUnionType(); - if (!$parameter_type->isEmpty()) { - $comment_parameter_map = $comment_parameter_map ?? self::extractCommentParameterMap($method); - $comment_parameter = $comment_parameter_map[$parameter->getName()] ?? null; - if ($comment_parameter) { - $comment_parameter_type = $comment_parameter->getUnionType(); - if (!$comment_parameter_type->isEmpty()) { - continue; - } - } - } - $parent_parameter = $o_phpdoc_parameter_list[$i] ?? null; - if ($parent_parameter) { - $parent_parameter_type = $parent_parameter->getNonVariadicUnionType(); - if ($parent_parameter_type->isEmpty()) { - continue; - } - if ($parameter_type->isEmpty() || $parent_parameter_type->isExclusivelyNarrowedFormOf($code_base, $parameter_type)) { - $parameter->setUnionType($parent_parameter_type); - } - } - } - - $parent_phpdoc_return_type = $o_method->getUnionType(); - if (!$parent_phpdoc_return_type->isEmpty()) { - $phpdoc_return_type = $method->getUnionType(); - if ($phpdoc_return_type->isEmpty()) { - $method->setUnionType($parent_phpdoc_return_type); - } else { - self::maybeInheritCommentReturnType($code_base, $method, $parent_phpdoc_return_type); - } - } - } - - /** - * @param Method $method a method which has a union type, but is permitted to inherit a more specific type. - * @param UnionType $inherited_union_type a non-empty union type - */ - private static function maybeInheritCommentReturnType(CodeBase $code_base, Method $method, UnionType $inherited_union_type) - { - $comment = $method->getComment(); - if ($comment && $comment->hasReturnUnionType()) { - if (!$comment->getReturnType()->isEmpty()) { - // This comment explicitly specified the desired return type. - // Give up on inheriting - return; - } - } - if ($inherited_union_type->isExclusivelyNarrowedFormOf($code_base, $method->getUnionType())) { - $method->setUnionType($inherited_union_type); - } - } - - /** - * Emit an $issue_type instance corresponding to a potential runtime inheritance warning/error - * - * @param CodeBase $code_base - * @param Method $method - * @param Method $o_method the overridden method - * @param string $issue_type the ParamSignatureRealMismatch* (issue type if overriding user-defined method) - * @param string $internal_issue_type the ParamSignatureRealMismatch* (issue type if overriding internal method) - * @param string $phpdoc_issue_type the ParamSignaturePHPDocMismatch* (issue type if overriding internal method) - * @param ?int $lineno - * @param int|string ...$args - * @return void - */ - private static function emitSignatureRealMismatchIssue( - CodeBase $code_base, - Method $method, - Method $o_method, - string $issue_type, - string $internal_issue_type, - string $phpdoc_issue_type, - $lineno, - ...$args - ) { - if ($method->isFromPHPDoc() || $o_method->isFromPHPDoc()) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - $phpdoc_issue_type, - $lineno ?? $method->getFileRef()->getLineNumberStart(), - $method->toRealSignatureString(), - $o_method->toRealSignatureString(), - ...array_merge($args, [ - $o_method->getFileRef()->getFile(), - $o_method->getFileRef()->getLineNumberStart(), - ]) - ); - } elseif ($o_method->isPHPInternal()) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - $internal_issue_type, - $lineno ?? $method->getFileRef()->getLineNumberStart(), - $method->toRealSignatureString(), - $o_method->toRealSignatureString(), - ...$args - ); - } else { - Issue::maybeEmit( - $code_base, - $method->getContext(), - $issue_type, - $lineno ?? $method->getFileRef()->getLineNumberStart(), - $method->toRealSignatureString(), - $o_method->toRealSignatureString(), - ...array_merge($args, [ - $o_method->getFileRef()->getFile(), - $o_method->getFileRef()->getLineNumberStart(), - ]) - ); - } - } - - /** - * @return void - */ - private static function analyzeParameterTypesDocblockSignaturesMatch( - CodeBase $code_base, - FunctionInterface $method - ) { - $phpdoc_parameter_map = $method->getPHPDocParameterTypeMap(); - if (\count($phpdoc_parameter_map) === 0) { - // nothing to check. - return; - } - $real_parameter_list = $method->getRealParameterList(); - foreach ($real_parameter_list as $i => $parameter) { - $real_param_type = $parameter->getNonVariadicUnionType(); - if ($real_param_type->isEmpty()) { - continue; - } - $phpdoc_param_union_type = $phpdoc_parameter_map[$parameter->getName()] ?? null; - if ($phpdoc_param_union_type && !$phpdoc_param_union_type->isEmpty()) { - self::tryToAssignPHPDocTypeToParameter($code_base, $method, $i, $parameter, $real_param_type, $phpdoc_param_union_type); - } - } - self::recordOutputReferences($method); - } - - /** - * @return void - */ - private static function tryToAssignPHPDocTypeToParameter( - CodeBase $code_base, - FunctionInterface $method, - int $i, - Parameter $parameter, - UnionType $real_param_type, - UnionType $phpdoc_param_union_type - ) { - $context = $method->getContext(); - $resolved_real_param_type = $real_param_type->withStaticResolvedInContext($context); - $is_exclusively_narrowed = true; - foreach ($phpdoc_param_union_type->getTypeSet() as $phpdoc_type) { - // Make sure that the commented type is a narrowed - // or equivalent form of the syntax-level declared - // return type. - if (!$phpdoc_type->isExclusivelyNarrowedFormOrEquivalentTo( - $resolved_real_param_type, - $context, - $code_base - ) - ) { - $is_exclusively_narrowed = false; - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeMismatchDeclaredParam, - self::guessCommentParamLineNumber($method, $parameter) ?: $context->getLineNumberStart(), - $parameter->getName(), - $method->getName(), - $phpdoc_type->__toString(), - $real_param_type->__toString() - ); - } - } - // TODO: test edge cases of variadic signatures - if ($is_exclusively_narrowed && Config::getValue('prefer_narrowed_phpdoc_param_type')) { - $normalized_phpdoc_param_union_type = self::normalizeNarrowedParamType($phpdoc_param_union_type, $real_param_type); - if ($normalized_phpdoc_param_union_type) { - $param_to_modify = $method->getParameterList()[$i] ?? null; - if ($param_to_modify) { - // TODO: Maybe have two different sets of methods for setUnionType and setCallerUnionType, this is easy to mix up for variadics. - $param_to_modify->setUnionType($normalized_phpdoc_param_union_type); - } - } else { - $comment = $method->getComment(); - if ($comment === null) { - return; - } - // This check isn't urgent to fix, and is specific to nullable casting rules, - // so use a different issue type. - $param_name = $parameter->getName(); - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeMismatchDeclaredParamNullable, - self::guessCommentParamLineNumber($method, $parameter) ?: $context->getLineNumberStart(), - $param_name, - $method->getName(), - $phpdoc_param_union_type->__toString(), - $real_param_type->__toString() - ); - } - } - } - - /** - * @return ?int - */ - private static function guessCommentParamLineNumber(FunctionInterface $method, Parameter $param) - { - $comment = $method->getComment(); - if ($comment === null) { - return null; - } - $parameter_map = $comment->getParameterMap(); - $comment_param = $parameter_map[$param->getName()] ?? null; - if (!$comment_param) { - return null; - } - return $comment_param->getLineno(); - } - - /** - * Guesses the return number of a method's PHPDoc's (at)return statement. - * Returns null if that could not be found. - * - * @return ?int - * @internal - */ - public static function guessCommentReturnLineNumber(FunctionInterface $method) - { - $comment = $method->getComment(); - if ($comment === null) { - return null; - } - if (!$comment->hasReturnUnionType()) { - return null; - } - return $comment->getReturnLineno(); - } - - /** - * @param FunctionInterface $method - */ - private static function recordOutputReferences(FunctionInterface $method) - { - foreach ($method->getOutputReferenceParamNames() as $output_param_name) { - foreach ($method->getRealParameterList() as $parameter) { - // TODO: Emit an issue if the (at)phan-output-reference is on a non-reference (at)param? - if ($parameter->getName() === $output_param_name && $parameter->isPassByReference()) { - $parameter->setIsOutputReference(); - } - } - } - } - - /** - * Forbid these two types of narrowing: - * 1. Forbid inferring a type of null from "(at)param null $x" for foo(?int $x = null) - * The phpdoc is probably nonsense. - * 2. Forbid inferring a type of `T` from "(at)param T $x" for foo(?T $x = null) - * The phpdoc is probably shorthand. - * - * Annotations may be added in the future to support this, e.g. "(at)param T $x (at)phan-not-null" - * - * @return ?UnionType - * - normalized version of $phpdoc_param_union_type (possibly same object) - * if Phan should proceed using phpdoc type instead of real types. (Converting T|null to ?T) - * - null if the type is an invalid narrowing, and Phan should warn. - */ - public static function normalizeNarrowedParamType(UnionType $phpdoc_param_union_type, UnionType $real_param_type) - { - // "@param null $x" is almost always a mistake. Forbid it for now. - // But allow "@param T|null $x" - $has_null = $phpdoc_param_union_type->hasType(NullType::instance(false)); - if ($has_null && $phpdoc_param_union_type->typeCount() === 1) { - // "@param null" - return null; - } - if (!$real_param_type->containsNullable() || $phpdoc_param_union_type->containsNullable()) { - // We already validated that the other casts were supported. - return $phpdoc_param_union_type; - } - if (!$has_null) { - // Attempting to narrow nullable to non-nullable is usually a mistake, currently not supported. - return null; - } - // Create a clone, converting "T|S|null" to "?T|?S" - return $phpdoc_param_union_type->nullableClone()->withoutType(NullType::instance(false)); - } - - /** - * Warns if a method is overriding a final method - * @return void - */ - private static function warnOverridingFinalMethod(CodeBase $code_base, Method $method, Clazz $class, Method $o_method) - { - if ($method->isFromPHPDoc()) { - // TODO: Track phpdoc methods separately from real methods - if ($class->checkHasSuppressIssueAndIncrementCount(Issue::AccessOverridesFinalMethodPHPDoc)) { - return; - } - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::AccessOverridesFinalMethodPHPDoc, - $method->getFileRef()->getLineNumberStart(), - $method->getFQSEN(), - $o_method->getFQSEN(), - $o_method->getFileRef()->getFile(), - $o_method->getFileRef()->getLineNumberStart() - ); - } elseif ($o_method->isPHPInternal()) { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::AccessOverridesFinalMethodInternal, - $method->getFileRef()->getLineNumberStart(), - $method->getFQSEN(), - $o_method->getFQSEN() - ); - } else { - Issue::maybeEmit( - $code_base, - $method->getContext(), - Issue::AccessOverridesFinalMethod, - $method->getFileRef()->getLineNumberStart(), - $method->getFQSEN(), - $o_method->getFQSEN(), - $o_method->getFileRef()->getFile(), - $o_method->getFileRef()->getLineNumberStart() - ); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ParentConstructorCalledAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/ParentConstructorCalledAnalyzer.php deleted file mode 100644 index 208ec9d..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ParentConstructorCalledAnalyzer.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use Phan\CodeBase; -use Phan\Config; -use Phan\Issue; -use Phan\Language\Element\Clazz; - -/** - * Analyzer that checks if the constructor of the given Clazz calls the parent constructor. - */ -class ParentConstructorCalledAnalyzer -{ - - /** - * Checks if the constructor of the given Clazz calls the parent constructor. - * - * @return void - */ - public static function analyzeParentConstructorCalled( - CodeBase $code_base, - Clazz $clazz - ) { - // Only look at classes configured to require a call - // to its parent constructor - if (!\in_array( - $clazz->getName(), - Config::getValue('parent_constructor_required') - ) - ) { - return; - } - - // Don't worry about internal classes - if ($clazz->isPHPInternal()) { - return; - } - - // Don't worry if there's no parent class - if (!$clazz->hasParentType()) { - return; - } - - if (!$code_base->hasClassWithFQSEN( - $clazz->getParentClassFQSEN() - )) { - // This is an error, but its caught elsewhere. We'll - // just roll through looking for other errors - return; - } - - $parent_clazz = $code_base->getClassByFQSEN( - $clazz->getParentClassFQSEN() - ); - - if (!$parent_clazz->isAbstract() - && !$clazz->getIsParentConstructorCalled() - ) { - Issue::maybeEmit( - $code_base, - $clazz->getContext(), - Issue::TypeParentConstructorCalled, - $clazz->getFileRef()->getLineNumberStart(), - (string)$clazz->getFQSEN(), - (string)$parent_clazz->getFQSEN() - ); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/PostOrderAnalysisVisitor.php b/vendor/phan/phan/src/Phan/Analysis/PostOrderAnalysisVisitor.php deleted file mode 100644 index 727ff47..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/PostOrderAnalysisVisitor.php +++ /dev/null @@ -1,3798 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use AssertionError; -use ast; -use ast\flags; -use ast\Node; -use Closure; -use Exception; -use Phan\AST\AnalysisVisitor; -use Phan\AST\ASTSimplifier; -use Phan\AST\ContextNode; -use Phan\AST\PhanAnnotationAdder; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\CodeBaseException; -use Phan\Exception\EmptyFQSENException; -use Phan\Exception\FQSENException; -use Phan\Exception\IssueException; -use Phan\Exception\NodeException; -use Phan\Exception\RecursionDepthException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Method; -use Phan\Language\Element\Parameter; -use Phan\Language\Element\PassByReferenceVariable; -use Phan\Language\Element\Property; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\FalseType; -use Phan\Language\Type\GenericArrayType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\LiteralStringType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\StringType; -use Phan\Language\Type\VoidType; -use Phan\Language\UnionType; -use function implode; - -/** - * PostOrderAnalysisVisitor is where we do the post-order part of the analysis - * during Phan's analysis phase. - * - * This is called in post-order by BlockAnalysisVisitor - * (i.e. this is called after visiting all children of the current node) - * - * @phan-file-suppress PhanPartialTypeMismatchArgument - */ -class PostOrderAnalysisVisitor extends AnalysisVisitor -{ - /** - * @var array<int,Node> a list of parent nodes of the currently analyzed node, - * within the current global or function-like scope - */ - private $parent_node_list; - - /** - * @param CodeBase $code_base - * A code base needs to be passed in because we require - * it to be initialized before any classes or files are - * loaded. - * - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - * - * @param array<int,Node> $parent_node_list - * The parent node list of the node being analyzed - */ - public function __construct( - CodeBase $code_base, - Context $context, - array $parent_node_list - ) { - parent::__construct($code_base, $context); - $this->parent_node_list = $parent_node_list; - } - - /** - * Default visitor for node kinds that do not have - * an overriding method - * - * @param Node $node (@phan-unused-param) - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visit(Node $node) : Context - { - // Many nodes don't change the context and we - // don't need to read them. - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitAssign(Node $node) : Context - { - // Get the type of the right side of the - // assignment - $right_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'], - true - ); - - $var_node = $node->children['var']; - if (!($var_node instanceof Node)) { - // Give up, this should be impossible except with the fallback - $this->emitIssue( - Issue::InvalidNode, - $node->lineno, - "Expected left side of assignment to be a variable" - ); - return $this->context; - } - - if ($right_type->isType(VoidType::instance(false))) { - $this->emitIssue( - Issue::TypeVoidAssignment, - $node->lineno - ); - } - - // Handle the assignment based on the type of the - // right side of the equation and the kind of item - // on the left - $context = (new AssignmentVisitor( - $this->code_base, - $this->context, - $node, - $right_type - ))->__invoke($var_node); - - $expr_node = $node->children['expr']; - if ($expr_node instanceof Node - && $expr_node->kind === ast\AST_CLOSURE - ) { - $method = (new ContextNode( - $this->code_base, - $this->context->withLineNumberStart( - $expr_node->lineno - ), - $expr_node - ))->getClosure(); - - $method->addReference($this->context); - } - - return $context; - } - - /** - * @param Node $node (@phan-unused-param) - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitAssignRef(Node $node) : Context - { - return $this->visitAssign($node); - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * @override - */ - public function visitAssignOp(Node $node) : Context - { - return (new AssignOperatorAnalysisVisitor($this->code_base, $this->context))->__invoke($node); - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitUnset(Node $node) : Context - { - $context = $this->context; - // Get the type of the thing being unset - $var_node = $node->children['var']; - if (!($var_node instanceof Node)) { - return $context; - } - - $kind = $var_node->kind; - if ($kind === ast\AST_VAR) { - $var_name = $var_node->children['name']; - if (\is_string($var_name)) { - // TODO: Make this work in branches - $context->unsetScopeVariable($var_name); - } - // I think DollarDollarPlugin already warns, so don't warn here. - } elseif ($kind === ast\AST_DIM) { - $this->analyzeUnsetDim($var_node); - } elseif ($kind === ast\AST_PROP) { - $this->analyzeUnsetProp($var_node); - } - return $context; - } - - /** - * @param Node $node a node of type AST_DIM in unset() - * @return void - * @see UnionTypeVisitor::resolveArrayShapeElementTypes() - * @see UnionTypeVisitor::visitDim() - */ - private function analyzeUnsetDim(Node $node) - { - $expr_node = $node->children['expr']; - if (!($expr_node instanceof Node)) { - // php -l would warn - return; - } - - // For now, just handle a single level of dimensions for unset($x['field']); - if ($expr_node->kind === ast\AST_VAR) { - $var_name = $expr_node->children['name']; - if (!\is_string($var_name)) { - return; - } - - $context = $this->context; - $scope = $context->getScope(); - if (!$scope->hasVariableWithName($var_name)) { - // TODO: Warn about potentially pointless unset in function scopes? - return; - } - // TODO: Could warn about invalid offsets for isset - $variable = $scope->getVariableByName($var_name); - $union_type = $variable->getUnionType(); - if ($union_type->isEmpty()) { - return; - } - if (!$union_type->asExpandedTypes($this->code_base)->hasArrayLike() && !$union_type->hasMixedType()) { - $this->emitIssue( - Issue::TypeArrayUnsetSuspicious, - $node->lineno, - (string)$union_type - ); - } - if (!$union_type->hasTopLevelArrayShapeTypeInstances()) { - return; - } - $dim_node = $node->children['dim']; - $dim_value = $dim_node instanceof Node ? (new ContextNode($this->code_base, $this->context, $dim_node))->getEquivalentPHPScalarValue() : $dim_node; - // TODO: detect and warn about null - if (!\is_scalar($dim_value)) { - return; - } - $variable = clone($variable); - $context->addScopeVariable($variable); - $variable->setUnionType($variable->getUnionType()->withoutArrayShapeField($dim_value)); - } - } - - /** - * @param Node $node a node of type AST_PROP in unset() - * @return void - * @see UnionTypeVisitor::resolveArrayShapeElementTypes() - * @see UnionTypeVisitor::visitDim() - */ - private function analyzeUnsetProp(Node $node) - { - $expr_node = $node->children['expr']; - if (!($expr_node instanceof Node)) { - // php -l would warn - return; - } - $prop_name = $node->children['prop']; - if (!\is_string($prop_name)) { - $prop_name = (new ContextNode($this->code_base, $this->context, $prop_name))->getEquivalentPHPScalarValue(); - if (!\is_string($prop_name)) { - return; - } - } - - $union_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $expr_node); - $type_fqsens = $union_type->objectTypesWithKnownFQSENs(); - foreach ($type_fqsens->getTypeSet() as $type) { - $fqsen = FullyQualifiedClassName::fromType($type); - if (!$this->code_base->hasClassWithFQSEN($fqsen)) { - continue; - } - $class = $this->code_base->getClassByFQSEN($fqsen); - if ($class->hasPropertyWithName($this->code_base, $prop_name)) { - // NOTE: We deliberately emit this issue whether or not the access is to a public or private variable, - // because unsetting a private variable at runtime is also a (failed) attempt to unset a declared property. - $prop = $class->getPropertyByName($this->code_base, $prop_name); - if ($prop->isFromPHPDoc() || $prop->isDynamicProperty()) { - continue; - } - $this->emitIssue( - Issue::TypeObjectUnsetDeclaredProperty, - $node->lineno, - (string)$type, - $prop_name, - $prop->getFileRef()->getFile(), - $prop->getFileRef()->getLineNumberStart() - ); - } - } - } - - /** - * @param Node $node (@phan-unused-param) - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitIfElem(Node $node) : Context - { - return $this->context; - } - - /** - * @param Node $node @phan-unused-param - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitWhile(Node $node) : Context - { - return $this->context; - } - - /** - * @param Node $node @phan-unused-param - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitSwitch(Node $node) : Context - { - return $this->context; - } - - /** - * @param Node $node @phan-unused-param - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitSwitchCase(Node $node) : Context - { - return $this->context; - } - - /** - * @param Node $node @phan-unused-param - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitExprList(Node $node) : Context - { - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitEncapsList(Node $node) : Context - { - $this->analyzeNoOp($node, Issue::NoopEncapsulatedStringLiteral); - - foreach ($node->children as $child_node) { - // Confirm that variables exists - if (!($child_node instanceof Node)) { - continue; - } - $this->checkExpressionInDynamicString($child_node); - } - - return $this->context; - } - - /** - * @return void - */ - private function checkExpressionInDynamicString(Node $expr_node) - { - $code_base = $this->code_base; - $context = $this->context; - $type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $expr_node, - true - ); - - if (!$type->hasPrintableScalar()) { - if ($type->isType(ArrayType::instance(false)) - || $type->isType(ArrayType::instance(true)) - || $type->isGenericArray() - ) { - $this->emitIssue( - Issue::TypeConversionFromArray, - $expr_node->lineno, - 'string' - ); - return; - } - // Check for __toString(), stringable variables/expressions in encapsulated strings work whether or not strict_types is set - try { - foreach ($type->asExpandedTypes($code_base)->asClassList($code_base, $context) as $clazz) { - if ($clazz->hasMethodWithName($code_base, "__toString")) { - return; - } - } - } catch (CodeBaseException $_) { - // Swallow "Cannot find class", go on to emit issue - } catch (RecursionDepthException $_) { - } - $this->emitIssue( - Issue::TypeSuspiciousStringExpression, - $expr_node->lineno, - (string)$type - ); - } - } - - /** - * Check if a given variable is undeclared. - * @param Node $node Node with kind AST_VAR - * @return void - */ - private function checkForUndeclaredVariable(Node $node) - { - $variable_name = $node->children['name']; - - // Ignore $$var type things - if (!\is_string($variable_name)) { - return; - } - - // Don't worry about non-existent undeclared variables - // in the global scope if configured to do so - if (Config::getValue('ignore_undeclared_variables_in_global_scope') - && $this->context->isInGlobalScope() - ) { - return; - } - - if (!$this->context->getScope()->hasVariableWithName($variable_name) - && !Variable::isHardcodedVariableInScopeWithName($variable_name, $this->context->isInGlobalScope()) - ) { - $this->emitIssueWithSuggestion( - Issue::UndeclaredVariable, - $node->lineno, - [$variable_name], - IssueFixSuggester::suggestVariableTypoFix($this->code_base, $this->context, $variable_name) - ); - } - } - - /** - * @param Node $node (@phan-unused-param) - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitDoWhile(Node $node) : Context - { - return $this->context; - } - - /** - * Visit a node with kind `ast\AST_GLOBAL` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitGlobal(Node $node) : Context - { - $name = $node->children['var']->children['name'] ?? null; - if (!\is_string($name)) { - // Shouldn't happen? - return $this->context; - } - $variable = new Variable( - $this->context->withLineNumberStart($node->lineno), - $name, - UnionType::empty(), - 0 - ); - $variable_name = $variable->getName(); - $optional_global_variable_type = Variable::getUnionTypeOfHardcodedGlobalVariableWithName($variable_name); - if ($optional_global_variable_type) { - $variable->setUnionType($optional_global_variable_type); - } else { - $scope = $this->context->getScope(); - if ($scope->hasGlobalVariableWithName($variable_name)) { - // TODO: Support @global, add a clone to the method context? - $actual_global_variable = clone($scope->getGlobalVariableByName($variable_name)); - $this->context->addScopeVariable($actual_global_variable); - return $this->context; - } - } - - // Note that we're not creating a new scope, just - // adding variables to the existing scope - $this->context->addScopeVariable($variable); - - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitStatic(Node $node) : Context - { - $variable = Variable::fromNodeInContext( - $node->children['var'], - $this->context, - $this->code_base, - false - ); - - // If the element has a default, set its type - // on the variable - if (isset($node->children['default'])) { - $default_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['default'] - ); - - $variable->setUnionType($default_type); - } - - // Note that we're not creating a new scope, just - // adding variables to the existing scope - $this->context->addScopeVariable($variable); - - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitEcho(Node $node) : Context - { - return $this->visitPrint($node); - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitPrint(Node $node) : Context - { - $code_base = $this->code_base; - $context = $this->context; - $expr_node = $node->children['expr']; - $type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $expr_node, - true - ); - - if (!$type->hasPrintableScalar()) { - if ($type->isType(ArrayType::instance(false)) - || $type->isType(ArrayType::instance(true)) - || $type->isGenericArray() - ) { - $this->emitIssue( - Issue::TypeConversionFromArray, - $expr_node->lineno ?? $node->lineno, - 'string' - ); - return $context; - } - if (!$context->getIsStrictTypes()) { - try { - foreach ($type->asExpandedTypes($code_base)->asClassList($code_base, $context) as $clazz) { - if ($clazz->hasMethodWithName($code_base, "__toString")) { - return $context; - } - } - } catch (CodeBaseException $_) { - // Swallow "Cannot find class", go on to emit issue - } - } - $this->emitIssue( - Issue::TypeSuspiciousEcho, - $expr_node->lineno ?? $node->lineno, - (string)$type - ); - } - - return $context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitVar(Node $node) : Context - { - $this->analyzeNoOp($node, Issue::NoopVariable); - $parent_node = \end($this->parent_node_list); - if ($parent_node instanceof Node) { - $parent_kind = $parent_node->kind; - /** - * These types are either types which create variables, - * or types which will be checked in other parts of Phan - */ - static $skip_var_check_types = [ - ast\AST_ARG_LIST => true, // may be a reference - ast\AST_ARRAY_ELEM => true, // [$X, $y] = expr() is an AST_ARRAY_ELEM. visitArray() checks the right-hand side. - ast\AST_ASSIGN_OP => true, // checked in visitAssignOp - ast\AST_ASSIGN_REF => true, // Creates by reference? - ast\AST_ASSIGN => true, // checked in visitAssign - ast\AST_DIM => true, // should be checked elsewhere, as part of check for array access to non-array/string - ast\AST_EMPTY => true, // TODO: Enable this in the future? - ast\AST_GLOBAL => true, // global $var; - ast\AST_ISSET => true, // TODO: Enable this in the future? - ast\AST_PARAM_LIST => true, // this creates the variable - ast\AST_STATIC => true, // static $var; - ast\AST_STMT_LIST => true, // ;$var; (Implicitly creates the variable. Already checked to emit PhanNoopVariable) - ast\AST_USE_ELEM => true, // may be a reference, checked elsewhere - ]; - - if (!\array_key_exists($parent_kind, $skip_var_check_types)) { - $this->checkForUndeclaredVariable($node); - } - } - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitArray(Node $node) : Context - { - $this->analyzeNoOp($node, Issue::NoopArray); - return $this->context; - } - - /** @internal */ - const NAME_FOR_BINARY_OP = [ - flags\BINARY_BOOL_AND => '&&', - flags\BINARY_BOOL_OR => '||', - flags\BINARY_BOOL_XOR => 'xor', - flags\BINARY_BITWISE_OR => '|', - flags\BINARY_BITWISE_AND => '&', - flags\BINARY_BITWISE_XOR => '^', - flags\BINARY_CONCAT => '.', - flags\BINARY_ADD => '+', - flags\BINARY_SUB => '-', - flags\BINARY_MUL => '*', - flags\BINARY_DIV => '/', - flags\BINARY_MOD => '%', - flags\BINARY_POW => '**', - flags\BINARY_SHIFT_LEFT => '<<', - flags\BINARY_SHIFT_RIGHT => '>>', - flags\BINARY_IS_IDENTICAL => '===', - flags\BINARY_IS_NOT_IDENTICAL => '!==', - flags\BINARY_IS_EQUAL => '==', - flags\BINARY_IS_NOT_EQUAL => '!=', - flags\BINARY_IS_SMALLER => '<', - flags\BINARY_IS_SMALLER_OR_EQUAL => '<=', - flags\BINARY_IS_GREATER => '>', - flags\BINARY_IS_GREATER_OR_EQUAL => '>=', - flags\BINARY_SPACESHIP => '<=>', - flags\BINARY_COALESCE => '??', - ]; - - /** - * @param Node $node - * A node of type AST_BINARY_OP to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitBinaryOp(Node $node) : Context - { - $flags = $node->flags; - if ((\end($this->parent_node_list)->kind ?? null) === ast\AST_STMT_LIST) { - if (\in_array($flags, [flags\BINARY_BOOL_AND, flags\BINARY_BOOL_OR, flags\BINARY_COALESCE], true)) { - // @phan-suppress-next-line PhanAccessMethodInternal - if (ASTSimplifier::isExpressionWithoutSideEffects($node->children['right'])) { - $this->emitIssue( - Issue::NoopBinaryOperator, - $node->lineno, - self::NAME_FOR_BINARY_OP[$flags] ?? '' - ); - } - } else { - $this->emitIssue( - Issue::NoopBinaryOperator, - $node->lineno, - self::NAME_FOR_BINARY_OP[$flags] ?? '' - ); - } - } - switch ($flags) { - case flags\BINARY_CONCAT: - $this->analyzeBinaryConcat($node); - break; - case flags\BINARY_DIV: - case flags\BINARY_POW: - case flags\BINARY_MOD: - $this->analyzeBinaryNumericOp($node); - break; - case flags\BINARY_SHIFT_LEFT: - case flags\BINARY_SHIFT_RIGHT: - $this->analyzeBinaryShift($node); - break; - } - return $this->context; - } - - private function analyzeBinaryShift(Node $node) - { - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['left'] - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['right'] - ); - $this->warnAboutInvalidUnionType( - $node, - static function (Type $type) : bool { - return $type instanceof IntType && !$type->getIsNullable(); - }, - $left, - $right, - Issue::TypeInvalidLeftOperandOfIntegerOp, - Issue::TypeInvalidRightOperandOfIntegerOp - ); - } - - private function analyzeBinaryNumericOp(Node $node) - { - $left = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['left'] - ); - - $right = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['right'] - ); - $this->warnAboutInvalidUnionType( - $node, - static function (Type $type) : bool { - return $type->isValidNumericOperand(); - }, - $left, - $right, - Issue::TypeInvalidLeftOperandOfNumericOp, - Issue::TypeInvalidRightOperandOfNumericOp - ); - } - - /** - * @param Node $node with type AST_BINARY_OP - * @param Closure(Type):bool $is_valid_type - * @return void - */ - private function warnAboutInvalidUnionType( - Node $node, - Closure $is_valid_type, - UnionType $left, - UnionType $right, - string $left_issue_type, - string $right_issue_type - ) { - if (!$left->isEmpty()) { - if (!$left->hasTypeMatchingCallback($is_valid_type)) { - $this->emitIssue( - $left_issue_type, - $node->children['left']->lineno ?? $node->lineno, - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags], - $left - ); - } - } - if (!$right->isEmpty()) { - if (!$right->hasTypeMatchingCallback($is_valid_type)) { - $this->emitIssue( - $right_issue_type, - $node->children['right']->lineno ?? $node->lineno, - PostOrderAnalysisVisitor::NAME_FOR_BINARY_OP[$node->flags], - $right - ); - } - } - } - - private function analyzeBinaryConcat(Node $node) - { - $left = $node->children['left']; - if ($left instanceof Node) { - $this->checkExpressionInDynamicString($left); - } - $right = $node->children['right']; - if ($right instanceof Node) { - $this->checkExpressionInDynamicString($right); - } - } - - const NAME_FOR_UNARY_OP = [ - flags\UNARY_BOOL_NOT => '!', - flags\UNARY_BITWISE_NOT => '~', - flags\UNARY_SILENCE => '@', - flags\UNARY_PLUS => '+', - flags\UNARY_MINUS => '-', - ]; - - /** - * @param Node $node - * A node of type AST_EMPTY to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitEmpty(Node $node) : Context - { - if ((\end($this->parent_node_list)->kind ?? null) === ast\AST_STMT_LIST) { - $this->emitIssue( - Issue::NoopEmpty, - $node->lineno - ); - } - return $this->context; - } - - /** - * @internal - * Maps the flags of nodes with kind AST_CAST to their types - */ - const AST_CAST_FLAGS_LOOKUP = [ - flags\TYPE_NULL => 'unset', - flags\TYPE_BOOL => 'bool', - flags\TYPE_LONG => 'int', - flags\TYPE_DOUBLE => 'float', - flags\TYPE_STRING => 'string', - flags\TYPE_ARRAY => 'array', - flags\TYPE_OBJECT => 'object', - ]; - - /** - * @param Node $node - * A node of type AST_EMPTY to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitCast(Node $node) : Context - { - if ((\end($this->parent_node_list)->kind ?? null) === ast\AST_STMT_LIST) { - $this->emitIssue( - Issue::NoopCast, - $node->lineno, - self::AST_CAST_FLAGS_LOOKUP[$node->flags] ?? 'unknown' - ); - } - return $this->context; - } - - /** - * @param Node $node - * A node of type AST_EMPTY to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitIsset(Node $node) : Context - { - if ((\end($this->parent_node_list)->kind ?? null) === ast\AST_STMT_LIST) { - $this->emitIssue( - Issue::NoopIsset, - $node->lineno - ); - } - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitUnaryOp(Node $node) : Context - { - if ($node->flags !== flags\UNARY_SILENCE) { - if ((\end($this->parent_node_list)->kind ?? null) === ast\AST_STMT_LIST) { - $this->emitIssue( - Issue::NoopUnaryOperator, - $node->lineno, - self::NAME_FOR_UNARY_OP[$node->flags] ?? '' - ); - } - } - return $this->context; - } - - /** - * @override - */ - public function visitPreInc(Node $node) : Context - { - return $this->analyzeIncOrDec($node); - } - - /** - * @override - */ - public function visitPostInc(Node $node) : Context - { - return $this->analyzeIncOrDec($node); - } - - /** - * @override - */ - public function visitPreDec(Node $node) : Context - { - return $this->analyzeIncOrDec($node); - } - - /** - * @override - */ - public function visitPostDec(Node $node) : Context - { - return $this->analyzeIncOrDec($node); - } - - const NAME_FOR_INC_OR_DEC_KIND = [ - ast\AST_PRE_INC => '++(expr)', - ast\AST_PRE_DEC => '--(expr)', - ast\AST_POST_INC => '(expr)++', - ast\AST_POST_DEC => '(expr)--', - ]; - - private function analyzeIncOrDec(Node $node) : Context - { - $var = $node->children['var']; - $old_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $var)->withFlattenedArrayShapeOrLiteralTypeInstances(); - if (!$old_type->canCastToUnionType(UnionType::fromFullyQualifiedString('int|string|float'))) { - $this->emitIssue( - Issue::TypeInvalidUnaryOperandIncOrDec, - $node->lineno, - self::NAME_FOR_INC_OR_DEC_KIND[$node->kind], - $old_type - ); - } - // The left can be a non-Node for an invalid AST - $kind = $var->kind ?? null; - if ($kind === \ast\AST_VAR) { - $new_type = $old_type->getTypeAfterIncOrDec(); - if ($old_type === $new_type) { - return $this->context; - } - try { - $variable = (new ContextNode($this->code_base, $this->context, $node->children['var']))->getVariableStrict(); - } catch (IssueException $_) { - return $this->context; - } catch (NodeException $_) { - return $this->context; - } - $variable = clone($variable); - $variable->setUnionType($new_type); - $this->context->addScopeVariable($variable); - } - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitConst(Node $node) : Context - { - $context = $this->context; - try { - $name_node = $node->children['name']; - // Based on UnionTypeVisitor::visitConst - if ($name_node->kind == ast\AST_NAME) { - $constant = (new ContextNode( - $this->code_base, - $context, - $node - ))->getConst(); - - // Mark that this constant has been referenced from - // this context - $constant->addReference($context); - } - } catch (IssueException $exception) { - // We need to do this in order to check keys and (after the first 5) values in AST arrays. - // Other parts of the AST may also not be covered. - // (This issue may be a duplicate) - Issue::maybeEmitInstance( - $this->code_base, - $context, - $exception->getIssueInstance() - ); - } catch (Exception $_) { - // Swallow any other types of exceptions. We'll log the errors - // elsewhere. - } - - // Check to make sure we're doing something with the - // constant - $this->analyzeNoOp($node, Issue::NoopConstant); - - return $context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitClassConst(Node $node) : Context - { - try { - $constant = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getClassConst(); - - // Mark that this class constant has been referenced - // from this context - $constant->addReference($this->context); - } catch (IssueException $exception) { - // We need to do this in order to check keys and (after the first 5) values in AST arrays, possibly other types. - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - } catch (Exception $_) { - // Swallow any other types of exceptions. We'll log the errors - // elsewhere. - } - - // Check to make sure we're doing something with the - // class constant - $this->analyzeNoOp($node, Issue::NoopConstant); - - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitClosure(Node $node) : Context - { - $func = $this->context->getFunctionLikeInScope($this->code_base); - - $return_type = $func->getUnionType(); - - if (!$return_type->isEmpty() - && !$func->getHasReturn() - && !self::declOnlyThrows($node) - && !$return_type->hasType(VoidType::instance(false)) - && !$return_type->hasType(NullType::instance(false)) - ) { - $this->emitIssue( - Issue::TypeMissingReturn, - $node->lineno, - (string)$func->getFQSEN(), - (string)$return_type - ); - } - $this->analyzeNoOp($node, Issue::NoopClosure); - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitReturn(Node $node) : Context - { - $context = $this->context; - // Make sure we're actually returning from a method. - if (!$context->isInFunctionLikeScope()) { - return $context; - } - $code_base = $this->code_base; - - // Check real return types instead of phpdoc return types in traits for #800 - // TODO: Why did Phan originally not analyze return types of traits at all in 4c6956c05222e093b29393ceaa389ffb91041bdc - $is_trait = false; - if ($context->isInClassScope()) { - $clazz = $context->getClassInScope($code_base); - $is_trait = $clazz->isTrait(); - } - - // Get the method/function/closure we're in - $method = $context->getFunctionLikeInScope($code_base); - - if ($method->getHasYield()) { // Function that is syntactically a Generator. - $this->analyzeReturnInGenerator($method, $node); - // TODO: Compare against TReturn of Generator<TKey,TValue,TSend,TReturn> - return $context; // Analysis was completed in PreOrderAnalysisVisitor - } - - // Figure out what we intend to return - // (For traits, lower the false positive rate by comparing against the real return type instead of the phpdoc type (#800)) - $method_return_type = $is_trait ? $method->getRealReturnType()->withAddedClassForResolvedSelf($method->getContext()) : $method->getUnionType(); - - // This leaves functions which aren't syntactically generators. - - // Figure out what is actually being returned - // TODO: Properly check return values of array shapes - foreach ($this->getReturnTypes($context, $node->children['expr'], $node->lineno) as $lineno => $expression_type) { - // If there is no declared type, see if we can deduce - // what it should be based on the return type - if ($method_return_type->isEmpty() - || $method->isReturnTypeUndefined() - ) { - if (!$is_trait) { - $method->setIsReturnTypeUndefined(true); - - // Set the inferred type of the method based - // on what we're returning - $method->setUnionType($method->getUnionType()->withUnionType($expression_type)); - } - - // No point in comparing this type to the - // type we just set - continue; - } - - // Check if the return type is compatible with the declared return type. - if (!$method->isReturnTypeUndefined()) { - // We allow base classes to cast to subclasses, and subclasses to cast to base classes, - // but don't allow subclasses to cast to subclasses on a separate branch of the inheritance tree - if (!self::checkCanCastToReturnType($code_base, $expression_type, $method_return_type)) { - $this->emitTypeMismatchReturnIssue($expression_type, $method, $method_return_type, $lineno); - } elseif (Config::get_strict_return_checking() && $expression_type->typeCount() > 1) { - self::analyzeReturnStrict($code_base, $method, $expression_type, $method_return_type, $lineno); - } - } - // For functions that aren't syntactically Generators, - // update the set/existence of return values. - - if ($method->isReturnTypeUndefined()) { - // Add the new type to the set of values returned by the - // method - $method->setUnionType($method->getUnionType()->withUnionType($expression_type)); - } - - // Mark the method as returning something (even if void) - if (null !== $node->children['expr']) { - $method->setHasReturn(true); - } - } - - return $context; - } - - /** - * Emits Issue::TypeMismatchReturnNullable or TypeMismatchReturn, unless suppressed - * @return void - */ - private function emitTypeMismatchReturnIssue(UnionType $expression_type, FunctionInterface $method, UnionType $method_return_type, int $lineno) - { - if (self::checkCanCastToReturnTypeIfWasNonNullInstead($this->code_base, $expression_type, $method_return_type)) { - if ($this->shouldSuppressIssue(Issue::TypeMismatchReturn, $lineno)) { - // Suppressing TypeMismatchReturn also suppresses TypeMismatchReturnNullable - return; - } - $issue_type = Issue::TypeMismatchReturnNullable; - } else { - $issue_type = Issue::TypeMismatchReturn; - } - $this->emitIssue( - $issue_type, - $lineno, - (string)$expression_type, - $method->getNameForIssue(), - (string)$method_return_type - ); - } - - /** - * @return void - */ - private function analyzeReturnInGenerator( - FunctionInterface $method, - Node $node - ) { - $method_generator_type = $method->getReturnTypeAsGeneratorTemplateType(); - $type_list = $method_generator_type->getTemplateParameterTypeList(); - // Generator<TKey,TValue,TSend,TReturn> - if (\count($type_list) !== 4) { - return; - } - $expected_return_type = $type_list[3]; - if ($expected_return_type->isEmpty()) { - return; - } - - $context = $this->context; - $code_base = $this->code_base; - - foreach ($this->getReturnTypes($context, $node->children['expr'], $node->lineno) as $lineno => $expression_type) { - // We allow base classes to cast to subclasses, and subclasses to cast to base classes, - // but don't allow subclasses to cast to subclasses on a separate branch of the inheritance tree - if (!self::checkCanCastToReturnType($code_base, $expression_type, $expected_return_type)) { - $this->emitTypeMismatchReturnIssue($expression_type, $method, $expected_return_type, $lineno); - } elseif (Config::get_strict_return_checking() && $expression_type->typeCount() > 1) { - self::analyzeReturnStrict($code_base, $method, $expression_type, $expected_return_type, $lineno); - } - } - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitYield(Node $node) : Context - { - $context = $this->context; - // Make sure we're actually returning from a method. - if (!$context->isInFunctionLikeScope()) { - return $context; - } - - // Get the method/function/closure we're in - $method = $context->getFunctionLikeInScope($this->code_base); - - // Figure out what we intend to return - $method_generator_type = $method->getReturnTypeAsGeneratorTemplateType(); - $type_list = $method_generator_type->getTemplateParameterTypeList(); - if (\count($type_list) === 0) { - return $context; - } - return $this->compareYieldAgainstDeclaredType($node, $method, $context, $type_list); - } - - /** - * @param array<int,UnionType> $template_type_list - */ - private function compareYieldAgainstDeclaredType(Node $node, FunctionInterface $method, Context $context, array $template_type_list) : Context - { - $code_base = $this->code_base; - - $type_list_count = \count($template_type_list); - - $yield_value_node = $node->children['value']; - if ($yield_value_node === null) { - $yield_value_type = VoidType::instance(false)->asUnionType(); - } else { - $yield_value_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $yield_value_node); - } - $expected_value_type = $template_type_list[\min(1, $type_list_count - 1)]; - try { - if (!$yield_value_type->asExpandedTypes($code_base)->canCastToUnionType($expected_value_type)) { - $this->emitIssue( - Issue::TypeMismatchGeneratorYieldValue, - $node->lineno, - (string)$yield_value_type, - $method->getNameForIssue(), - (string)$expected_value_type, - '\Generator<' . implode(',', $template_type_list) . '>' - ); - } - } catch (RecursionDepthException $_) { - } - - if ($type_list_count > 1) { - $yield_key_node = $node->children['key']; - if ($yield_key_node === null) { - $yield_key_type = VoidType::instance(false)->asUnionType(); - } else { - $yield_key_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $yield_key_node); - } - // TODO: finalize syntax to indicate the absence of a key or value (e.g. use void instead?) - $expected_key_type = $template_type_list[0]; - if (!$yield_key_type->asExpandedTypes($code_base)->canCastToUnionType($expected_key_type)) { - $this->emitIssue( - Issue::TypeMismatchGeneratorYieldKey, - $node->lineno, - (string)$yield_key_type, - $method->getNameForIssue(), - (string)$expected_key_type, - '\Generator<' . implode(',', $template_type_list) . '>' - ); - } - } - return $context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitYieldFrom(Node $node) : Context - { - $context = $this->context; - // Make sure we're actually returning from a method. - if (!$context->isInFunctionLikeScope()) { - return $context; - } - - // Get the method/function/closure we're in - $method = $context->getFunctionLikeInScope($this->code_base); - $code_base = $this->code_base; - - $yield_from_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $node->children['expr']); - if ($yield_from_type->isEmpty()) { - return $context; - } - $yield_from_expanded_type = $yield_from_type->asExpandedTypes($code_base); - if (!$yield_from_expanded_type->hasIterable() && !$yield_from_expanded_type->hasTraversable()) { - $this->emitIssue( - Issue::TypeInvalidYieldFrom, - $node->lineno, - (string)$yield_from_type - ); - return $context; - } - - - // Figure out what we intend to return - $method_generator_type = $method->getReturnTypeAsGeneratorTemplateType(); - $type_list = $method_generator_type->getTemplateParameterTypeList(); - if (\count($type_list) === 0) { - return $context; - } - return $this->compareYieldFromAgainstDeclaredType($node, $method, $context, $type_list, $yield_from_type); - } - - /** - * @param array<int,UnionType> $template_type_list - */ - private function compareYieldFromAgainstDeclaredType(Node $node, FunctionInterface $method, Context $context, array $template_type_list, UnionType $yield_from_type) : Context - { - $code_base = $this->code_base; - - $type_list_count = \count($template_type_list); - - // TODO: Can do a better job of analyzing expressions that are just arrays or subclasses of Traversable. - // - // A solution would need to check for (at)return Generator|T[] - $yield_from_generator_type = $yield_from_type->asGeneratorTemplateType(); - - $actual_template_type_list = $yield_from_generator_type->getTemplateParameterTypeList(); - $actual_type_list_count = \count($actual_template_type_list); - if ($actual_type_list_count === 0) { - return $context; - } - - $yield_value_type = $actual_template_type_list[\min(1, $actual_type_list_count - 1)]; - $expected_value_type = $template_type_list[\min(1, $type_list_count - 1)]; - if (!$yield_value_type->asExpandedTypes($code_base)->canCastToUnionType($expected_value_type)) { - $this->emitIssue( - Issue::TypeMismatchGeneratorYieldValue, - $node->lineno, - (string)$yield_value_type, - $method->getNameForIssue(), - (string)$expected_value_type, - '\Generator<' . implode(',', $template_type_list) . '>' - ); - } - - if ($type_list_count > 1 && $actual_type_list_count > 1) { - // TODO: finalize syntax to indicate the absence of a key or value (e.g. use void instead?) - $yield_key_type = $actual_template_type_list[0]; - $expected_key_type = $template_type_list[0]; - if (!$yield_key_type->asExpandedTypes($code_base)->canCastToUnionType($expected_key_type)) { - $this->emitIssue( - Issue::TypeMismatchGeneratorYieldKey, - $node->lineno, - (string)$yield_key_type, - $method->getNameForIssue(), - (string)$expected_key_type, - '\Generator<' . implode(',', $template_type_list) . '>' - ); - } - } - return $context; - } - - private static function checkCanCastToReturnType(CodeBase $code_base, UnionType $expression_type, UnionType $method_return_type) : bool - { - if ($method_return_type->hasTemplateParameterTypes()) { - // Perform a check that does a better job understanding rules of templates. - // (E.g. should be able to cast None to Option<MyClass>, but not Some<int> to Option<MyClass> - return $expression_type->asExpandedTypesPreservingTemplate($code_base)->canCastToUnionTypeHandlingTemplates($method_return_type, $code_base) || - $expression_type->canCastToUnionTypeHandlingTemplates($method_return_type->asExpandedTypesPreservingTemplate($code_base), $code_base); - } - // We allow base classes to cast to subclasses, and subclasses to cast to base classes, - // but don't allow subclasses to cast to subclasses on a separate branch of the inheritance tree - try { - return $expression_type->asExpandedTypes($code_base)->canCastToUnionType($method_return_type) || - $expression_type->canCastToUnionType($method_return_type->asExpandedTypes($code_base)); - } catch (RecursionDepthException $_) { - return false; - } - } - - /** - * Precondition: checkCanCastToReturnType is false - */ - private static function checkCanCastToReturnTypeIfWasNonNullInstead(CodeBase $code_base, UnionType $expression_type, UnionType $method_return_type) : bool - { - $nonnull_expression_type = $expression_type->nonNullableClone(); - if ($nonnull_expression_type === $expression_type || $nonnull_expression_type->isEmpty()) { - return false; - } - return self::checkCanCastToReturnType($code_base, $nonnull_expression_type, $method_return_type); - } - - /** - * @return void - */ - private function analyzeReturnStrict( - CodeBase $code_base, - FunctionInterface $method, - UnionType $expression_type, - UnionType $method_return_type, - int $lineno - ) { - $type_set = $expression_type->getTypeSet(); - $context = $this->context; - if (\count($type_set) < 2) { - throw new AssertionError("Expected at least two types for strict return type checks"); - } - - $mismatch_type_set = UnionType::empty(); - $mismatch_expanded_types = null; - - // For the strict - foreach ($type_set as $type) { - // Expand it to include all parent types up the chain - try { - $individual_type_expanded = $type->asExpandedTypes($code_base); - } catch (RecursionDepthException $_) { - continue; - } - - // See if the argument can be cast to the - // parameter - if (!$individual_type_expanded->canCastToUnionType( - $method_return_type - )) { - if ($method->isPHPInternal()) { - // If we are not in strict mode and we accept a string parameter - // and the argument we are passing has a __toString method then it is ok - if (!$context->getIsStrictTypes() && $method_return_type->hasNonNullStringType()) { - if ($individual_type_expanded->hasClassWithToStringMethod($code_base, $context)) { - continue; - } - } - } - $mismatch_type_set = $mismatch_type_set->withType($type); - if ($mismatch_expanded_types === null) { - // Warn about the first type - $mismatch_expanded_types = $individual_type_expanded; - } - } - } - - - if ($mismatch_expanded_types === null) { - // No mismatches - return; - } - - // If we have TypeMismatchReturn already, then also suppress the partial mismatch warnings (e.g. PartialTypeMismatchReturn) as well. - if ($this->context->hasSuppressIssue($code_base, Issue::TypeMismatchReturn)) { - return; - } - $this->emitIssue( - self::getStrictIssueType($mismatch_type_set), - $lineno, - (string)$expression_type, - $method->getNameForIssue(), - (string)$method_return_type, - $mismatch_expanded_types - ); - } - - private static function getStrictIssueType(UnionType $union_type) : string - { - if ($union_type->typeCount() === 1) { - $type = $union_type->getTypeSet()[0]; - if ($type instanceof NullType) { - return Issue::PossiblyNullTypeReturn; - } - if ($type instanceof FalseType) { - return Issue::PossiblyFalseTypeReturn; - } - } - return Issue::PartialTypeMismatchReturn; - } - - /** - * @param ?Node|?string|?int|?float $node - * @return \Generator|array<int,UnionType> - * @phan-return \Generator<int,UnionType> - */ - private function getReturnTypes(Context $context, $node, int $return_lineno) - { - if (!($node instanceof Node)) { - if (null === $node) { - yield $return_lineno => VoidType::instance(false)->asUnionType(); - return; - } - yield $return_lineno => UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $context, - $node, - true - ); - return; - } - $kind = $node->kind; - if ($kind === ast\AST_CONDITIONAL) { - yield from self::deduplicateUnionTypes($this->getReturnTypesOfConditional($context, $node)); - return; - } elseif ($kind === ast\AST_ARRAY) { - $expression_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $context, $node, true); - if ($expression_type->hasTopLevelArrayShapeTypeInstances()) { - yield $return_lineno => $expression_type; - return; - } - - $key_type_enum = GenericArrayType::getKeyTypeOfArrayNode($this->code_base, $context, $node); - foreach (self::deduplicateUnionTypes($this->getReturnTypesOfArray($context, $node)) as $lineno => $elem_type) { - yield $lineno => $elem_type->asGenericArrayTypes($key_type_enum); // TODO: Infer corresponding key types - } - return; - } - - $expression_type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $context, - $node, - true - ); - - if ($expression_type->hasStaticType()) { - $expression_type = - $expression_type->withStaticResolvedInContext( - $context - ); - } - yield $return_lineno => $expression_type; - } - - /** - * @return \Generator|UnionType[] - * @phan-return \Generator<int,UnionType> - */ - private function getReturnTypesOfConditional(Context $context, Node $node) - { - $cond_node = $node->children['cond']; - $cond_truthiness = UnionTypeVisitor::checkCondUnconditionalTruthiness($cond_node); - // For the shorthand $a ?: $b, the cond node will be the truthy value. - // Note: an ast node will never be null(can be unset), it will be a const AST node with the name null. - $true_node = $node->children['true'] ?? $cond_node; - - // Rarely, a conditional will always be true or always be false. - if ($cond_truthiness !== null) { - // TODO: Add no-op checks in another PR, if they don't already exist for conditional. - if ($cond_truthiness === true) { - // The condition is unconditionally true - yield from $this->getReturnTypes($context, $true_node, $node->lineno); - return; - } else { - // The condition is unconditionally false - - // Add the type for the 'false' side - yield from $this->getReturnTypes($context, $node->children['false'], $node->lineno); - return; - } - } - - // TODO: false_context once there is a NegatedConditionVisitor - // TODO: emit no-op if $cond_node is a literal, such as `if (2)` - // - Also note that some things such as `true` and `false` are ast\AST_NAME nodes. - - if ($cond_node instanceof Node) { - // TODO: Use different contexts and merge those, in case there were assignments or assignments by reference in both sides of the conditional? - // Reuse the BranchScope (sort of unintuitive). The ConditionVisitor returns a clone and doesn't modify the original. - $base_context = $this->context; - // We don't bother analyzing visitReturn in PostOrderAnalysisVisitor, right now. - // This may eventually change, just to ensure the expression is checked for issues - $true_context = (new ConditionVisitor( - $this->code_base, - $base_context - ))->__invoke($cond_node); - $false_context = (new NegatedConditionVisitor( - $this->code_base, - $base_context - ))->__invoke($cond_node); - } else { - $true_context = $context; - $false_context = $this->context; - } - - // Allow nested ternary operators, or arrays within ternary operators - if (($node->children['true'] ?? null) !== null) { - yield from $this->getReturnTypes($true_context, $true_node, $true_node->lineno ?? $node->lineno); - } else { - // E.g. From the left-hand side of yield (int|false) ?: default, - // yielding false is impossible. - foreach ($this->getReturnTypes($true_context, $true_node, $true_node->lineno ?? $node->lineno) as $lineno => $raw_union_type) { - if ($raw_union_type->isEmpty() || !$raw_union_type->containsFalsey()) { - yield $lineno => $raw_union_type; - } else { - $raw_union_type = $raw_union_type->nonFalseyClone(); - if (!$raw_union_type->isEmpty()) { - yield $lineno => $raw_union_type; - } - } - } - } - - $false_node = $node->children['false']; - yield from $this->getReturnTypes($false_context, $false_node, $false_node->lineno ?? $node->lineno); - } - - /** - * @param \Generator|UnionType[] $types - * @return \Generator|array<int,UnionType> - * @phan-return \Generator<int,UnionType> - */ - private static function deduplicateUnionTypes($types) - { - $unique_types = []; - foreach ($types as $lineno => $type) { - foreach ($unique_types as $old_type) { - if ($type->isEqualTo($old_type)) { - break; - } - } - yield $lineno => $type; - $unique_types[] = $type; - } - } - - /** - * @return \Generator|UnionType[] - * @phan-return \Generator<int,UnionType> - */ - private function getReturnTypesOfArray(Context $context, Node $node) - { - if (\count($node->children) === 0) { - // Possibly unreachable (array shape would be returned instead) - yield $node->lineno => MixedType::instance(false)->asUnionType(); - return; - } - foreach ($node->children as $elem) { - if (!($elem instanceof Node)) { - // We already emit PhanSyntaxError - continue; - } - // Don't bother recursing more than one level to iterate over possible types. - $value_node = $elem->children['value']; - if ($value_node instanceof Node) { - yield $elem->lineno => UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $context, - $value_node, - true - ); - } else { - yield $elem->lineno => Type::fromObject( - $value_node - )->asUnionType(); - } - } - } - - /** - * @param Node $node (@phan-unused-param) - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitPropDecl(Node $node) : Context - { - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitCall(Node $node) : Context - { - $expression = $node->children['expr']; - try { - $function_list_generator = (new ContextNode( - $this->code_base, - $this->context, - $expression - ))->getFunctionFromNode(); - - foreach ($function_list_generator as $function) { - // Check the call for parameter and argument types - $this->analyzeCallToFunctionLike( - $function, - $node - ); - } - } catch (CodeBaseException $_) { - // ignore it. - } - - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitNew(Node $node) : Context - { - try { - $context_node = new ContextNode( - $this->code_base, - $this->context, - $node - ); - - $method = $context_node->getMethod( - '__construct', - false, - false, - true - ); - - $class_list = $context_node->getClassList(false, ContextNode::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME); - // Add a reference to each class this method - // could be called on - foreach ($class_list as $class) { - $class->addReference($this->context); - if ($class->isDeprecated()) { - $this->emitIssue( - Issue::DeprecatedClass, - $node->lineno, - (string)$class->getFQSEN(), - $class->getContext()->getFile(), - (string)$class->getContext()->getLineNumberStart() - ); - } - foreach ($class->getInterfaceFQSENList() as $interface) { - $clazz = $this->code_base->getClassByFQSEN($interface); - if ($clazz->isDeprecated()) { - $this->emitIssue( - Issue::DeprecatedInterface, - $node->lineno, - (string)$clazz->getFQSEN(), - $clazz->getContext()->getFile(), - (string)$clazz->getContext()->getLineNumberStart() - ); - } - } - foreach ($class->getTraitFQSENList() as $trait) { - $clazz = $this->code_base->getClassByFQSEN($trait); - if ($clazz->isDeprecated()) { - $this->emitIssue( - Issue::DeprecatedTrait, - $node->lineno, - (string)$clazz->getFQSEN(), - $clazz->getContext()->getFile(), - (string)$clazz->getContext()->getLineNumberStart() - ); - } - } - } - - $this->analyzeMethodVisibility( - $method, - $node - ); - - $this->analyzeCallToFunctionLike( - $method, - $node - ); - - foreach ($class_list as $class) { - if ($class->isAbstract() || $class->isInterface() || $class->isTrait()) { - // Check the full list of classes if any of the classes - // are abstract or interfaces. - $this->checkForInvalidNewType($node, $class_list); - break; - } - } - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - } catch (Exception $_) { - // If we can't figure out what kind of a call - // this is, don't worry about it - return $this->context; - } - - return $this->context; - } - - /** - * @param Node $node a node of type AST_NEW - * @param Clazz[] $class_list - */ - private function checkForInvalidNewType(Node $node, array $class_list) - { - // This is either a string (new 'something'()) or a class name (new something()) - $class_node = $node->children['class']; - if (!$class_node instanceof Node) { - foreach ($class_list as $class) { - $this->warnIfInvalidClassForNew($class, $node); - } - return; - } - - if ($class_node->kind === ast\AST_NAME) { - $class_name = $class_node->children['name']; - if (\is_string($class_name) && \strcasecmp('static', $class_name) === 0) { - if ($this->isStaticGuaranteedToBeNonAbstract()) { - return; - } - } - foreach ($class_list as $class) { - $this->warnIfInvalidClassForNew($class, $class_node); - } - return; - } - foreach (UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $class_node)->getTypeSet() as $type) { - if ($type instanceof LiteralStringType) { - try { - $class_fqsen = FullyQualifiedClassName::fromFullyQualifiedString($type->getValue()); - } catch (FQSENException $_) { - // Probably already emitted elsewhere, but emit anyway - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeExpectedObjectOrClassName, - $node->lineno, - $type->getValue() - ); - continue; - } - if (!$this->code_base->hasClassWithFQSEN($class_fqsen)) { - continue; - } - $class = $this->code_base->getClassByFQSEN($class_fqsen); - $this->warnIfInvalidClassForNew($class, $class_node); - } - } - } - - /** - * Given a call to `new static`, is the context likely to be guaranteed to be a non-abstract class? - */ - private function isStaticGuaranteedToBeNonAbstract() : bool - { - if (!$this->context->isInMethodScope()) { - return false; - } - // TODO: Could do a better job with closures inside of methods - $method = $this->context->getFunctionLikeInScope($this->code_base); - if (!($method instanceof Method)) { - if ($method instanceof Func && $method->isClosure()) { - // closures can be rebound - return true; - } - return false; - } - return !$method->isStatic(); - } - - private function warnIfInvalidClassForNew(Clazz $class, Node $node) - { - // Make sure we're not instantiating an abstract - // class - if ($class->isAbstract()) { - $this->emitIssue( - Issue::TypeInstantiateAbstract, - $node->lineno, - (string)$class->getFQSEN() - ); - } elseif ($class->isInterface()) { - // Make sure we're not instantiating an interface - $this->emitIssue( - Issue::TypeInstantiateInterface, - $node->lineno, - (string)$class->getFQSEN() - ); - } elseif ($class->isTrait()) { - // Make sure we're not instantiating a trait - $this->emitIssue( - Issue::TypeInstantiateTrait, - $node->lineno, - (string)$class->getFQSEN() - ); - } - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitInstanceof(Node $node) : Context - { - try { - // Fetch the class list, and emit warnings as a side effect. - // TODO: Unify UnionTypeVisitor, AssignmentVisitor, and PostOrderAnalysisVisitor - (new ContextNode( - $this->code_base, - $this->context, - $node->children['class'] - ))->getClassList(false, ContextNode::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME, Issue::TypeInvalidInstanceof); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - } catch (CodeBaseException $exception) { - $this->emitIssueWithSuggestion( - Issue::UndeclaredClassInstanceof, - $node->lineno, - [(string)$exception->getFQSEN()], - IssueFixSuggester::suggestSimilarClassForGenericFQSEN( - $this->code_base, - $this->context, - $exception->getFQSEN(), - // Only suggest classes/interfaces for alternatives to instanceof checks. Don't suggest traits. - IssueFixSuggester::createFQSENFilterForClasslikeCategories($this->code_base, true, false, true) - ) - ); - } - - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitStaticCall(Node $node) : Context - { - // Get the name of the method being called - $method_name = $node->children['method']; - - // Give up on things like Class::$var - if (!\is_string($method_name)) { - if ($method_name instanceof Node) { - $method_name = UnionTypeVisitor::anyStringLiteralForNode($this->code_base, $this->context, $method_name); - } - if (!\is_string($method_name)) { - $method_name_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $node->children['method']); - if (!$method_name_type->canCastToUnionType(StringType::instance(false)->asUnionType())) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeInvalidStaticMethodName, - $node->lineno, - $method_name_type - ); - } - return $this->context; - } - } - - // Get the name of the static class being referenced - $static_class = ''; - $class_node = $node->children['class']; - if (!($class_node instanceof Node)) { - $static_class = (string)$class_node; - } elseif ($node->children['class']->kind == ast\AST_NAME) { - $static_class = (string)$node->children['class']->children['name']; - } - - $method = $this->getStaticMethodOrEmitIssue($node, $method_name); - - if ($method === null) { - // Short circuit on a constructor being called statically - // on something other than 'parent' - if ($method_name === '__construct' && $static_class !== 'parent') { - $this->emitConstructorWarning($node, $static_class, $method_name); - } - return $this->context; - } - - try { - if ($method_name === '__construct') { - $this->checkNonAncestorConstructCall($node, $static_class, $method_name); - // Even if it exists, continue on and type check the arguments passed. - } - // Get the method that's calling the static method - $calling_method = null; - if ($this->context->isInMethodScope()) { - $calling_function_like = - $this->context->getFunctionLikeInScope($this->code_base); - - if ($calling_function_like instanceof Method) { - $calling_method = $calling_function_like; - } - } - - // If the method being called isn't actually static and it's - // not a call to parent::f from f, we may be in trouble. - if (!$method->isStatic() - - // Allow static calls to parent if we're not in a static - // method or if it's to the overridden method - && !( - ( - 'parent' === $static_class - || 'self' === $static_class - || 'static' === $static_class - ) - && $this->context->isInMethodScope() - && ( - $this->context->getFunctionLikeFQSEN()->getName() == $method->getFQSEN()->getName() - || ($calling_method && !$calling_method->isStatic()) - ) - - // Allow static calls to methods from non-static class methods - ) && !( - $this->context->isInClassScope() - && $this->context->isInFunctionLikeScope() - && ($calling_method && !$calling_method->isStatic()) - // Allow static calls parent methods from closure - ) && !( - $this->context->isInClassScope() - && $this->context->isInFunctionLikeScope() - && $this->context->getFunctionLikeFQSEN()->isClosure() - ) - ) { - $class_list = (new ContextNode( - $this->code_base, - $this->context, - $node->children['class'] - ))->getClassList(); - - if (\count($class_list) > 0) { - $class = \array_values($class_list)[0]; - - $this->emitIssue( - Issue::StaticCallToNonStatic, - $node->lineno, - "{$class->getFQSEN()}::{$method_name}()", - $method->getFileRef()->getFile(), - (string)$method->getFileRef()->getLineNumberStart() - ); - } - } - - $this->analyzeMethodVisibility( - $method, - $node - ); - - // Make sure the parameters look good - $this->analyzeCallToFunctionLike( - $method, - $node - ); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - } catch (Exception $_) { - // If we can't figure out the class for this method - // call, cry YOLO and mark every method with that - // name with a reference. - if (Config::get_track_references() - && Config::getValue('dead_code_detection_prefer_false_negative') - ) { - foreach ($this->code_base->getMethodSetByName( - $method_name - ) as $method) { - $method->addReference($this->context); - } - } - - // If we can't figure out what kind of a call - // this is, don't worry about it - return $this->context; - } - return $this->context; - } - - /** - * Check calling A::__construct (where A is not parent) - * @return void - */ - private function checkNonAncestorConstructCall( - Node $node, - string $static_class, - string $method_name - ) { - // TODO: what about unanalyzable? - if ($node->children['class']->kind !== ast\AST_NAME) { - return; - } - // TODO: check for self/static/<class name of self> and warn about recursion? - // TODO: Only allow calls to __construct from other constructors? - $found_ancestor_constructor = false; - if ($this->context->isInMethodScope()) { - try { - $possible_ancestor_type = UnionTypeVisitor::unionTypeFromClassNode( - $this->code_base, - $this->context, - $node->children['class'] - ); - } catch (FQSENException $e) { - $this->emitIssue( - $e instanceof EmptyFQSENException ? Issue::EmptyFQSENInCallable : Issue::InvalidFQSENInCallable, - $node->lineno, - $e->getFQSEN() - ); - return; - } - // If we can determine the ancestor type, and it's an parent/ancestor class, allow the call without warning. - // (other code should check visibility and existence and args of __construct) - - if (!$possible_ancestor_type->isEmpty()) { - // but forbid 'self::__construct', 'static::__construct' - $type = $this->context->getClassFQSEN()->asUnionType(); - if ($possible_ancestor_type->hasStaticType()) { - $this->emitIssue( - Issue::AccessOwnConstructor, - $node->lineno, - $static_class - ); - $found_ancestor_constructor = true; - } elseif ($type->asExpandedTypes($this->code_base)->canCastToUnionType($possible_ancestor_type)) { - if ($type->canCastToUnionType($possible_ancestor_type)) { - $this->emitIssue( - Issue::AccessOwnConstructor, - $node->lineno, - $static_class - ); - } - $found_ancestor_constructor = true; - } - } - } - - if (!$found_ancestor_constructor) { - // TODO: new issue type? - $this->emitConstructorWarning($node, $static_class, $method_name); - } - } - - /** - * TODO: change to a different issue type in a future phan release? - * @return void - */ - private function emitConstructorWarning(Node $node, string $static_class, string $method_name) - { - $this->emitIssue( - Issue::UndeclaredStaticMethod, - $node->lineno, - "{$static_class}::{$method_name}()" - ); - } - - /** - * gets the static method, or emits an issue. - * @param Node $node - * @param string $method_name - NOTE: The caller should convert constants/class constants/etc in $node->children['method'] to a string. - * @return ?Method - */ - private function getStaticMethodOrEmitIssue(Node $node, string $method_name) - { - try { - // Get a reference to the method being called - $result = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getMethod($method_name, true, true); - - // This didn't throw NonClassMethodCall - if (Config::get_strict_method_checking()) { - $this->checkForPossibleNonObjectAndNonClassInMethod($node, $method_name); - } - - return $result; - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - } catch (Exception $e) { - if ($e instanceof FQSENException) { - Issue::maybeEmit( - $this->code_base, - $this->context, - $e instanceof EmptyFQSENException ? Issue::EmptyFQSENInClasslike : Issue::InvalidFQSENInClasslike, - $node->lineno, - $e->getFQSEN() - ); - } - // We already checked for NonClassMethodCall - if (Config::get_strict_method_checking()) { - $this->checkForPossibleNonObjectAndNonClassInMethod($node, $method_name); - } - - // If we can't figure out the class for this method - // call, cry YOLO and mark every method with that - // name with a reference. - if (Config::get_track_references() - && Config::getValue('dead_code_detection_prefer_false_negative') - ) { - foreach ($this->code_base->getMethodSetByName( - $method_name - ) as $method) { - $method->addReference($this->context); - } - } - - // If we can't figure out what kind of a call - // this is, don't worry about it - } - return null; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitMethod(Node $node) : Context - { - if (!$this->context->isInFunctionLikeScope()) { - throw new AssertionError("Must be in function-like scope to get method"); - } - - $method = $this->context->getFunctionLikeInScope($this->code_base); - - $return_type = $method->getUnionType(); - - if (!($method instanceof Method)) { - throw new AssertionError("Function found where method expected"); - } - - $has_interface_class = false; - try { - $class = $method->getClass($this->code_base); - $has_interface_class = $class->isInterface(); - } catch (Exception $_) { - } - - if (!$method->isAbstract() - && !$method->isFromPHPDoc() - && !$has_interface_class - && !$return_type->isEmpty() - && !$method->getHasReturn() - && !self::declOnlyThrows($node) - && !$return_type->hasType(VoidType::instance(false)) - && !$return_type->hasType(NullType::instance(false)) - ) { - $this->emitIssue( - Issue::TypeMissingReturn, - $node->lineno, - (string)$method->getFQSEN(), - (string)$return_type - ); - } - - if ($method->getHasReturn() && $method->getIsMagicAndVoid()) { - $this->emitIssue( - Issue::TypeMagicVoidWithReturn, - $node->lineno, - (string)$method->getFQSEN() - ); - } - - $parameters_seen = []; - foreach ($method->getParameterList() as $i => $parameter) { - $name = $parameter->getName(); - if (isset($parameters_seen[$name])) { - $this->emitIssue( - Issue::ParamRedefined, - $node->lineno, - '$' . $name - ); - } else { - $parameters_seen[$name] = $i; - } - } - - - return $this->context; - } - - /** - * Visit a node with kind `ast\AST_FUNC_DECL` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitFuncDecl(Node $node) : Context - { - $method = - $this->context->getFunctionLikeInScope($this->code_base); - - if (\strcasecmp($method->getName(), '__autoload') === 0) { - $this->emitIssue( - Issue::CompatibleAutoload, - $node->lineno - ); - } - - $return_type = $method->getUnionType(); - - if (!$return_type->isEmpty() - && !$method->getHasReturn() - && !self::declOnlyThrows($node) - && !$return_type->hasType(VoidType::instance(false)) - && !$return_type->hasType(NullType::instance(false)) - ) { - $this->emitIssue( - Issue::TypeMissingReturn, - $node->lineno, - (string)$method->getFQSEN(), - (string)$return_type - ); - } - - $parameters_seen = []; - foreach ($method->getParameterList() as $i => $parameter) { - if (isset($parameters_seen[$parameter->getName()])) { - $this->emitIssue( - Issue::ParamRedefined, - $node->lineno, - '$' . $parameter->getName() - ); - } else { - $parameters_seen[$parameter->getName()] = $i; - } - } - - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitMethodCall(Node $node) : Context - { - $method_name = $node->children['method']; - - if (!\is_string($method_name)) { - if ($method_name instanceof Node) { - $method_name = UnionTypeVisitor::anyStringLiteralForNode($this->code_base, $this->context, $method_name); - } - if (!\is_string($method_name)) { - $method_name_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $node->children['method']); - if (!$method_name_type->canCastToUnionType(StringType::instance(false)->asUnionType())) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::TypeInvalidMethodName, - $node->lineno, - $method_name_type - ); - } - return $this->context; - } - } - - try { - $method = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getMethod($method_name, false); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - return $this->context; - } catch (NodeException $_) { - // If we can't figure out the class for this method - // call, cry YOLO and mark every method with that - // name with a reference. - if (Config::get_track_references() - && Config::getValue('dead_code_detection_prefer_false_negative') - ) { - foreach ($this->code_base->getMethodSetByName( - $method_name - ) as $method) { - $method->addReference($this->context); - } - } - - // Swallow it - return $this->context; - } - - // We already checked for NonClassMethodCall - if (Config::get_strict_method_checking()) { - $this->checkForPossibleNonObjectInMethod($node, $method_name); - } - - $this->analyzeMethodVisibility( - $method, - $node - ); - - // Check the call for parameter and argument types - $this->analyzeCallToFunctionLike( - $method, - $node - ); - - return $this->context; - } - - private function checkForPossibleNonObjectInMethod(Node $node, string $method_name) - { - $type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $node->children['expr'] ?? $node->children['class']); - if ($type->containsDefiniteNonObjectType()) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::PossiblyNonClassMethodCall, - $node->lineno, - $method_name, - $type - ); - } - } - - private function checkForPossibleNonObjectAndNonClassInMethod(Node $node, string $method_name) - { - $type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $node->children['expr'] ?? $node->children['class']); - if ($type->containsDefiniteNonObjectAndNonClassType()) { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::PossiblyNonClassMethodCall, - $node->lineno, - $method_name, - $type - ); - } - } - - /** - * Visit a node with kind `ast\AST_DIM` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitDim(Node $node) : Context - { - $code_base = $this->code_base; - $context = $this->context; - // Check the dimension type to trigger PhanUndeclaredVariable, etc. - /* $dim_type = */ - UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node->children['dim'], - true - ); - $this->analyzeNoOp($node, Issue::NoopArrayAccess); - - if ($node->flags & PhanAnnotationAdder::FLAG_IGNORE_NULLABLE_AND_UNDEF) { - return $context; - } - // Check the array type to trigger TypeArraySuspicious - try { - /* $array_type = */ - UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node, - false - ); - // TODO: check if array_type has array but not ArrayAccess. - // If that is true, then assert that $dim_type can cast to `int|string` - } catch (IssueException $_) { - // Detect this elsewhere, e.g. want to detect PhanUndeclaredVariableDim but not PhanUndeclaredVariable - } - return $context; - } - - /** - * @param array<int,Node> $parent_node_list - * @return bool true if the union type should skip analysis due to being the left-hand side expression of an assignment - * We skip checks for $x['key'] being valid in expressions such as `$x['key']['key2']['key3'] = 'value';` - * because those expressions will create $x['key'] as a side effect. - * - * Precondition: $parent_node->kind === ast\AST_DIM && $parent_node->children['expr'] is $node - */ - private static function shouldSkipNestedAssignDim(array $parent_node_list) : bool - { - $cur_parent_node = \end($parent_node_list); - for (;; $cur_parent_node = $prev_parent_node) { - $prev_parent_node = \prev($parent_node_list); - switch ($prev_parent_node->kind) { - case ast\AST_DIM: - if ($prev_parent_node->children['expr'] !== $cur_parent_node) { - return false; - } - break; - case ast\AST_ASSIGN: - case ast\AST_ASSIGN_REF: - return $prev_parent_node->children['var'] === $cur_parent_node; - case ast\AST_ARRAY_ELEM: - $prev_parent_node = \prev($parent_node_list); // this becomes AST_ARRAY - break; - case ast\AST_ARRAY: - break; - default: - return false; - } - } - } - - public function visitStaticProp(Node $node) : Context - { - return $this->analyzeProp($node, true); - } - - public function visitProp(Node $node) : Context - { - return $this->analyzeProp($node, false); - } - - /** - * Default visitor for node kinds that do not have - * an overriding method - * - * @param Node $node (@phan-unused-param) - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitClone(Node $node) : Context - { - $type = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $node->children['expr'], - true - ); - if (!$type->isEmpty() && !$type->hasPossiblyObjectTypes()) { - $this->emitIssue( - Issue::TypeInvalidCloneNotObject, - $node->children['expr']->lineno ?? $node->lineno, - $type - ); - } - return $this->context; - } - - /** - * Analyze a node with kind `ast\AST_PROP` or `ast\AST_STATIC_PROP` - * - * @param Node $node - * A node of the type indicated by the method name that we'd - * like to figure out the type that it produces. - * - * @param bool $is_static - * True if fetching a static property. - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function analyzeProp(Node $node, bool $is_static) : Context - { - $exception_or_null = null; - - try { - $property = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getProperty($is_static); - - // Mark that this property has been referenced from - // this context - if (Config::get_track_references()) { - $this->trackPropertyReference($property, $node); - } - } catch (IssueException $exception) { - // We'll check out some reasons it might not exist - // before logging the issue - $exception_or_null = $exception; - } catch (NodeException $exception) { - $exception_or_null = $exception; - } catch (Exception $_) { - // Swallow any exceptions. We'll catch it later. - } - - if (isset($property)) { - // TODO could be more specific about checking if this is a magic property - // Right now it warns if it is magic but (at)property is used, etc. - $this->analyzeNoOp($node, Issue::NoopProperty); - } else { - $expr_or_class_node = $node->children['expr'] ?? $node->children['class']; - if ($expr_or_class_node === null) { - throw new AssertionError( - "Property nodes must either have an expression or class" - ); - } - - $class_list = []; - try { - // Get the set of classes that are being referenced - $class_list = (new ContextNode( - $this->code_base, - $this->context, - $expr_or_class_node - ))->getClassList(true); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - } - - if (!$is_static) { - // Find out of any of them have a __get magic method - // (Only check if looking for instance properties) - $has_getter = $this->hasGetter($class_list); - - // If they don't, then analyze for No-ops. - if (!$has_getter) { - $this->analyzeNoOp($node, Issue::NoopProperty); - - if ($exception_or_null instanceof IssueException) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception_or_null->getIssueInstance() - ); - } - } - } else { - if ($exception_or_null instanceof IssueException) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception_or_null->getIssueInstance() - ); - } - } - } - - return $this->context; - } - - /** @param Clazz[] $class_list */ - private function hasGetter(array $class_list) : bool - { - foreach ($class_list as $class) { - if ($class->hasGetMethod($this->code_base)) { - return true; - } - } - return false; - } - - /** - * @return void - */ - private function trackPropertyReference(Property $property, Node $node) - { - $property->addReference($this->context); - if (!$property->hasReadReference() && !$this->isAssignmentOrNestedAssignment($node)) { - $property->setHasReadReference(); - } - if (!$property->hasWriteReference() && $this->isAssignmentOrNestedAssignmentOrModification($node) !== false) { - $property->setHasWriteReference(); - } - } - - /** - * @return ?bool - * - false if this is a read reference - * - true if this is a write reference - * - null if this is both, e.g. $a =& $b for $a and $b - */ - private function isAssignmentOrNestedAssignment(Node $node) - { - $parent_node_list = $this->parent_node_list; - $parent_node = \end($parent_node_list); - $parent_kind = $parent_node->kind; - // E.g. analyzing [$x] in [$x] = expr() - while ($parent_kind === ast\AST_ARRAY_ELEM) { - if ($parent_node->children['value'] !== $node) { - // e.g. analyzing `$v = [$x => $y];` for $x - return false; - } - \array_pop($parent_node_list); // pop AST_ARRAY_ELEM - $node = \array_pop($parent_node_list); // AST_ARRAY - $parent_node = \array_pop($parent_node_list); - $parent_kind = $parent_node->kind; - } - if ($parent_kind === ast\AST_DIM) { - return $parent_node->children['expr'] === $node && $this->shouldSkipNestedAssignDim($parent_node_list); - } elseif ($parent_kind === ast\AST_ASSIGN || $parent_kind === ast\AST_ASSIGN_OP) { - return $parent_node->children['var'] === $node; - } elseif ($parent_kind === ast\AST_ASSIGN_REF) { - return null; - } - return false; - } - - // An incomplete list of known parent node kinds that simultaneously read and write the given expression - // TODO: ASSIGN_OP? - const _READ_AND_WRITE_KINDS = [ - ast\AST_PRE_INC, - ast\AST_PRE_DEC, - ast\AST_POST_INC, - ast\AST_POST_DEC, - ]; - - /** - * @return ?bool - * - false if this is a read reference - * - true if this is a write reference - * - null if this is both, e.g. $a =& $b for $a and $b - */ - private function isAssignmentOrNestedAssignmentOrModification(Node $node) - { - $parent_node_list = $this->parent_node_list; - $parent_node = \end($parent_node_list); - $parent_kind = $parent_node->kind; - // E.g. analyzing [$x] in [$x] = expr() - while ($parent_kind === ast\AST_ARRAY_ELEM) { - if ($parent_node->children['value'] !== $node) { - // e.g. analyzing `$v = [$x => $y];` for $x - return false; - } - \array_pop($parent_node_list); // pop AST_ARRAY_ELEM - $node = \array_pop($parent_node_list); // AST_ARRAY - $parent_node = \array_pop($parent_node_list); - $parent_kind = $parent_node->kind; - } - if ($parent_kind === ast\AST_DIM) { - return $parent_node->children['expr'] === $node && self::shouldSkipNestedAssignDim($parent_node_list); - } elseif ($parent_kind === ast\AST_ASSIGN || $parent_kind === ast\AST_ASSIGN_OP) { - return $parent_node->children['var'] === $node; - } elseif ($parent_kind === ast\AST_ASSIGN_REF) { - return null; - } else { - return \in_array($parent_kind, self::_READ_AND_WRITE_KINDS, true); - } - } - - /** - * Analyze whether a method is callable - * - * @param Method $method - * @param Node $node - * - * @return void - */ - private function analyzeMethodVisibility( - Method $method, - Node $node - ) { - if ($method->isPublic()) { - return; - } - if ($method->isAccessibleFromClass($this->code_base, $this->context->getClassFQSENOrNull())) { - return; - } - if ($method->isPrivate()) { - $has_call_magic_method = !$method->isStatic() - && $method->getDefiningClass($this->code_base)->hasMethodWithName($this->code_base, '__call'); - - $this->emitIssue( - $has_call_magic_method ? - Issue::AccessMethodPrivateWithCallMagicMethod : Issue::AccessMethodPrivate, - $node->lineno, - (string)$method->getFQSEN(), - $method->getFileRef()->getFile(), - (string)$method->getFileRef()->getLineNumberStart() - ); - } else { - if (Clazz::isAccessToElementOfThis($node)) { - return; - } - $has_call_magic_method = !$method->isStatic() - && $method->getDefiningClass($this->code_base)->hasMethodWithName($this->code_base, '__call'); - - $this->emitIssue( - $has_call_magic_method ? - Issue::AccessMethodProtectedWithCallMagicMethod : Issue::AccessMethodProtected, - $node->lineno, - (string)$method->getFQSEN(), - $method->getFileRef()->getFile(), - (string)$method->getFileRef()->getLineNumberStart() - ); - } - } - - /** - * Analyze the parameters and arguments for a call - * to the given method or function - * - * @param FunctionInterface $method - * @param Node $node - * - * @return void - */ - private function analyzeCallToFunctionLike( - FunctionInterface $method, - Node $node - ) { - $code_base = $this->code_base; - $context = $this->context; - - $method->addReference($context); - - // Create variables for any pass-by-reference - // parameters - $argument_list = $node->children['args']->children; - foreach ($argument_list as $i => $argument) { - if (!$argument instanceof Node) { - continue; - } - - $parameter = $method->getParameterForCaller($i); - if (!$parameter) { - continue; - } - - // If pass-by-reference, make sure the variable exists - // or create it if it doesn't. - if ($parameter->isPassByReference()) { - $this->createPassByReferenceArgumentInCall($argument, $parameter, $method->getRealParameterForCaller($i)); - } - } - - // Confirm the argument types are clean - ArgumentType::analyze( - $method, - $node, - $context, - $code_base - ); - - // Take another pass over pass-by-reference parameters - // and assign types to passed in variables - foreach ($argument_list as $i => $argument) { - if (!$argument instanceof Node) { - continue; - } - $parameter = $method->getParameterForCaller($i); - - if (!$parameter) { - continue; - } - - $kind = $argument->kind; - if ($kind === ast\AST_CLOSURE) { - if (Config::get_track_references()) { - $this->trackReferenceToClosure($argument); - } - } - - // If the parameter is pass-by-reference and we're - // passing a variable in, see if we should pass - // the parameter and variable types to each other - if ($parameter->isPassByReference()) { - self::analyzePassByReferenceArgument( - $code_base, - $context, - $argument, - $argument_list, - $method, - $parameter, - $method->getRealParameterForCaller($i) - ); - } - } - - // If we're in quick mode, don't retest methods based on - // parameter types passed in - if (Config::get_quick_mode()) { - return; - } - - // Don't re-analyze recursive methods. That doesn't go - // well. - if ($context->isInFunctionLikeScope() - && $method->getFQSEN() === $context->getFunctionLikeFQSEN() - ) { - $this->checkForInfiniteRecursion($node, $method); - return; - } - - if (!$method->needsRecursiveAnalysis()) { - return; - } - - // Re-analyze the method with the types of the arguments - // being passed in. - $this->analyzeMethodWithArgumentTypes( - $node->children['args'], - $method - ); - } - - /** - * @param Parameter $parameter the parameter types inferred from combination of real and union type - * - * @param ?Parameter $real_parameter the real parameter type from the type signature - */ - private function createPassByReferenceArgumentInCall(Node $argument, Parameter $parameter, $real_parameter) - { - if ($argument->kind == ast\AST_VAR) { - // We don't do anything with the new variable; just create it - // if it doesn't exist - try { - (new ContextNode( - $this->code_base, - $this->context, - $argument - ))->getOrCreateVariableForReferenceParameter($parameter, $real_parameter); - } catch (NodeException $_) { - return; - } - } elseif ($argument->kind == ast\AST_STATIC_PROP - || $argument->kind == ast\AST_PROP - ) { - $property_name = $argument->children['prop']; - - if (\is_string($property_name)) { - // We don't do anything with it; just create it - // if it doesn't exist - try { - $property = (new ContextNode( - $this->code_base, - $this->context, - $argument - ))->getOrCreateProperty($argument->children['prop'], $argument->kind == ast\AST_STATIC_PROP); - $property->setHasWriteReference(); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $this->code_base, - $this->context, - $exception->getIssueInstance() - ); - } catch (Exception $_) { - // If we can't figure out what kind of a call - // this is, don't worry about it - } - } else { - // This is stuff like `Class->$foo`. I'm ignoring - // it. - } - } - } - - /** - * @param array<int,Node|string|int|float> $argument_list the arguments of the invocation, containing the pass by reference argument - * - * @param Parameter $parameter the parameter types inferred from combination of real and union type - * - * @param ?Parameter $real_parameter the real parameter type from the type signature - * - * @return void - */ - private static function analyzePassByReferenceArgument( - CodeBase $code_base, - Context $context, - Node $argument, - array $argument_list, - FunctionInterface $method, - Parameter $parameter, - $real_parameter - ) { - $variable = null; - $kind = $argument->kind; - if ($kind === ast\AST_VAR) { - try { - $variable = (new ContextNode( - $code_base, - $context, - $argument - ))->getOrCreateVariableForReferenceParameter($parameter, $real_parameter); - } catch (NodeException $_) { - // E.g. `function_accepting_reference(${$varName})` - Phan can't analyze outer type of ${$varName} - return; - } - } elseif ($kind === ast\AST_STATIC_PROP - || $kind === ast\AST_PROP - ) { - $property_name = $argument->children['prop']; - - if (\is_string($property_name)) { - // We don't do anything with it; just create it - // if it doesn't exist - try { - $variable = (new ContextNode( - $code_base, - $context, - $argument - ))->getOrCreateProperty($argument->children['prop'], $argument->kind == ast\AST_STATIC_PROP); - $variable->addReference($context); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $code_base, - $context, - $exception->getIssueInstance() - ); - } catch (Exception $_) { - // If we can't figure out what kind of a call - // this is, don't worry about it - } - } else { - // This is stuff like `Class->$foo`. I'm ignoring - // it. - } - } - - if ($variable) { - $set_variable_type = static function (UnionType $new_type) use ($context, $variable) { - if ($variable instanceof Variable) { - $variable = clone($variable); - $variable->setUnionType($new_type); - $context->addScopeVariable($variable); - } else { - // This is a Property - // TODO: Do a better job of analyzing assignments to properties - $variable->setUnionType($new_type); - } - }; - switch ($parameter->getReferenceType()) { - case Parameter::REFERENCE_WRITE_ONLY: - if ($variable instanceof Variable) { - $variable = clone($variable); - self::analyzeWriteOnlyReference($code_base, $context, $method, $variable, $argument_list, $parameter); - $context->addScopeVariable($variable); - } else { - self::analyzeWriteOnlyReference($code_base, $context, $method, $variable, $argument_list, $parameter); - } - break; - case Parameter::REFERENCE_READ_WRITE: - $reference_parameter_type = $parameter->getNonVariadicUnionType(); - $variable_type = $variable->getUnionType(); - if ($variable_type->isEmpty()) { - // if Phan doesn't know the variable type, - // then guess that the variable is the type of the reference - // when analyzing the following statements. - $set_variable_type($reference_parameter_type); - } elseif (!$variable_type->canCastToUnionType($reference_parameter_type)) { - // Phan already warned about incompatible types. - // But analyze the following statements as if it could have been the type expected, - // to reduce false positives. - $set_variable_type($variable->getUnionType()->withUnionType( - $reference_parameter_type - )); - } - // don't modify - assume the function takes the same type in that it returns, - // and we want to preserve generic array types for sorting functions (May change later on) - // TODO: Check type compatibility earlier, and don't modify? - break; - case Parameter::REFERENCE_DEFAULT: - default: - $reference_parameter_type = $parameter->getNonVariadicUnionType(); - // We have no idea what type of reference this is. - // Probably user defined code. - $set_variable_type($variable->getUnionType()->withUnionType( - $reference_parameter_type - )); - break; - } - } - } - - /** - * @param Property|Variable $variable - * @param array<int,Node|string|int|float> $argument_list - */ - private static function analyzeWriteOnlyReference( - CodeBase $code_base, - Context $context, - FunctionInterface $method, - $variable, - array $argument_list, - Parameter $parameter - ) { - switch ($method->getFQSEN()->__toString()) { - case '\preg_match': - $variable->setUnionType( - RegexAnalyzer::getPregMatchUnionType($code_base, $context, $argument_list) - ); - return; - case '\preg_match_all': - $variable->setUnionType( - RegexAnalyzer::getPregMatchAllUnionType($code_base, $context, $argument_list) - ); - return; - default: - $reference_parameter_type = $parameter->getNonVariadicUnionType(); - - // The previous value is being ignored, and being replaced. - $variable->setUnionType( - $reference_parameter_type - ); - } - } - - /** - * @return void - */ - private function trackReferenceToClosure(Node $argument) - { - try { - $inner_context = $this->context->withLineNumberStart($argument->lineno); - $method = (new ContextNode( - $this->code_base, - $inner_context, - $argument - ))->getClosure(); - - $method->addReference($inner_context); - } catch (Exception $_) { - // Swallow it - } - } - - /** - * Replace the method's parameter types with the argument - * types and re-analyze the method. - * - * This is used when analyzing callbacks and closures, e.g. in array_map. - * - * @param array<int,UnionType> $argument_types - * An AST node listing the arguments - * - * @param FunctionInterface $method - * The method or function being called - * - * @return void - * - * @see analyzeMethodWithArgumentTypes (Which takes AST nodes) - */ - public function analyzeCallableWithArgumentTypes( - array $argument_types, - FunctionInterface $method - ) { - if (!$method->needsRecursiveAnalysis()) { - return; - } - - // Don't re-analyze recursive methods. That doesn't go well. - if ($this->context->isInFunctionLikeScope() - && $method->getFQSEN() === $this->context->getFunctionLikeFQSEN() - ) { - return; - } - - $original_method_scope = $method->getInternalScope(); - $method->setInternalScope(clone($original_method_scope)); - try { - // Even though we don't modify the parameter list, we still need to know the types - // -- as an optimization, we don't run quick mode again if the types didn't change? - $parameter_list = \array_map(/** @return Parameter */ static function (Parameter $parameter) { - return clone($parameter); - }, $method->getParameterList()); - - foreach ($parameter_list as $i => $parameter_clone) { - if (!isset($argument_types[$i]) && $parameter_clone->hasDefaultValue()) { - $parameter_type = $parameter_clone->getDefaultValueType(); - if ($parameter_type->isType(NullType::instance(false))) { - // Treat a parameter default of null the same way as passing null to that parameter - // (Add null to the list of possibilities) - $parameter_clone->addUnionType($parameter_type); - } else { - // For other types (E.g. string), just replace the union type. - $parameter_clone->setUnionType($parameter_type); - } - } - - // Add the parameter to the scope - $method->getInternalScope()->addVariable( - $parameter_clone->asNonVariadic() - ); - - // If there's no parameter at that offset, we may be in - // a ParamTooMany situation. That is caught elsewhere. - if (!isset($argument_types[$i]) - || !$parameter_clone->getNonVariadicUnionType()->isEmpty() - ) { - continue; - } - - $this->updateParameterTypeByArgument( - $method, - $parameter_clone, - null, // TODO: Can array_map/array_filter accept closures with references? Consider warning? - $argument_types, - $parameter_list, - $i - ); - } - foreach ($parameter_list as $parameter_clone) { - if ($parameter_clone->isVariadic()) { - // We're using this parameter clone to analyze the **inside** of the method, it's never seen on the outside. - // Convert it immediately. - // TODO: Add tests of variadic references, fix those if necessary. - $method->getInternalScope()->addVariable( - $parameter_clone->cloneAsNonVariadic() - ); - } - } - - // Now that we know something about the parameters used - // to call the method, we can reanalyze the method with - // the types of the parameter - $method->analyzeWithNewParams($method->getContext(), $this->code_base, $parameter_list); - } finally { - $method->setInternalScope($original_method_scope); - } - } - - /** - * Replace the method's parameter types with the argument - * types and re-analyze the method. - * - * @param Node $argument_list_node - * An AST node listing the arguments - * - * @param FunctionInterface $method - * The method or function being called - * Precondition: $method->needsRecursiveAnalysis() === false - * - * @return void - * - * TODO: deduplicate code. - */ - private function analyzeMethodWithArgumentTypes( - Node $argument_list_node, - FunctionInterface $method - ) { - $original_method_scope = $method->getInternalScope(); - $method->setInternalScope(clone($original_method_scope)); - $method_context = $method->getContext(); - - try { - // Even though we don't modify the parameter list, we still need to know the types - // -- as an optimization, we don't run quick mode again if the types didn't change? - $parameter_list = \array_map(static function (Parameter $parameter) : Parameter { - return $parameter->cloneAsNonVariadic(); - }, $method->getParameterList()); - - // always resolve all arguments outside of quick mode to detect undefined variables, other problems in call arguments. - // Fixes https://github.com/phan/phan/issues/583 - $argument_types = []; - foreach ($argument_list_node->children as $i => $argument) { - // Determine the type of the argument at position $i - $argument_types[$i] = UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $argument, - true - ); - } - - foreach ($parameter_list as $i => $parameter_clone) { - $argument = $argument_list_node->children[$i] ?? null; - - if (!$argument - && $parameter_clone->hasDefaultValue() - ) { - $parameter_type = $parameter_clone->getDefaultValueType(); - if ($parameter_type->isType(NullType::instance(false))) { - // Treat a parameter default of null the same way as passing null to that parameter - // (Add null to the list of possibilities) - $parameter_clone->addUnionType($parameter_type); - } else { - // For other types (E.g. string), just replace the union type. - $parameter_clone->setUnionType($parameter_type); - } - } - - // Add the parameter to the scope - $method->getInternalScope()->addVariable( - $parameter_clone - ); - - // If there's no parameter at that offset, we may be in - // a ParamTooMany situation. That is caught elsewhere. - if (!$argument - || !$parameter_clone->getUnionType()->isEmpty() - ) { - continue; - } - - $this->updateParameterTypeByArgument( - $method, - $parameter_clone, - $argument, - $argument_types, - $parameter_list, - $i - ); - } - foreach ($parameter_list as $parameter_clone) { - if ($parameter_clone->isVariadic()) { - // We're using this parameter clone to analyze the **inside** of the method, it's never seen on the outside. - // Convert it immediately. - // TODO: Add tests of variadic references, fix those if necessary. - $method->getInternalScope()->addVariable( - $parameter_clone->cloneAsNonVariadic() - ); - } - } - - // Now that we know something about the parameters used - // to call the method, we can reanalyze the method with - // the types of the parameter - $method->analyzeWithNewParams($method_context, $this->code_base, $parameter_list); - } finally { - $method->setInternalScope($original_method_scope); - } - } - - /** - * Check if $argument_list_node calling itself is likely to be a case of infinite recursion. - * This is based on heuristics, and will not catch all cases. - */ - private function checkForInfiniteRecursion(Node $node, FunctionInterface $method) - { - $argument_list_node = $node->children['args']; - if ($node->kind === ast\AST_METHOD_CALL) { - $expr = $node->children['expr']; - if (($expr->kind ?? null) !== ast\AST_VAR || $expr->children['name'] !== 'this') { - return; - } - } - $nearest_function_like = null; - foreach ($this->parent_node_list as $c) { - if (\in_array($c->kind, [ast\AST_FUNC_DECL, ast\AST_METHOD, ast\AST_CLOSURE], true)) { - $nearest_function_like = $c; - } - } - if (!$nearest_function_like) { - return; - } - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this is never null - if (ReachabilityChecker::willUnconditionallyBeReached($nearest_function_like->children['stmts'], $argument_list_node)) { - $this->emitIssue( - Issue::InfiniteRecursion, - $argument_list_node->lineno, - $method->getNameForIssue() - ); - } - } - - /** - * @param FunctionInterface $method - * The method that we're updating parameter types for - * - * @param Parameter $parameter - * The parameter that we're updating - * - * @param Node|mixed $argument - * The argument whose type we'd like to replace the - * parameter type with. - * - * @param array<int,UnionType> $argument_types - * The type of arguments - * - * @param array<int,Parameter> &$parameter_list - * The parameter list - types are modified by reference - * - * @param int $parameter_offset - * The offset of the parameter on the method's - * signature. - * - * @return void - */ - private function updateParameterTypeByArgument( - FunctionInterface $method, - Parameter $parameter, - $argument, - array $argument_types, - array &$parameter_list, - int $parameter_offset - ) { - $argument_type = $argument_types[$parameter_offset]; - if ($parameter->isVariadic()) { - for ($i = $parameter_offset + 1; $i < \count($argument_types); $i++) { - $argument_type = $argument_type->withUnionType($argument_types[$i]); - } - } - // Then set the new type on that parameter based - // on the argument's type. We'll use this to - // retest the method with the passed in types - // TODO: if $argument_type is non-empty and !isType(NullType), instead use setUnionType? - - // For https://github.com/phan/phan/issues/1525 : Collapse array shapes into generic arrays before recursively analyzing a method. - if (!$parameter->isCloneOfVariadic()) { - $parameter->addUnionType( - $argument_type->withFlattenedArrayShapeOrLiteralTypeInstances() - ); - } else { - $parameter->addUnionType( - $argument_type->withFlattenedArrayShapeOrLiteralTypeInstances()->asGenericArrayTypes(GenericArrayType::KEY_INT) - ); - } - - // If we're passing by reference, get the variable - // we're dealing with wrapped up and shoved into - // the scope of the method - if (!$parameter->isPassByReference()) { - // Overwrite the method's variable representation - // of the parameter with the parameter with the - // new type - $method->getInternalScope()->addVariable( - $parameter - ); - - return; - } - - // At this point we're dealing with a pass-by-reference - // parameter. - - // For now, give up and work on it later. - // - // TODO (Issue #376): It's possible to have a - // parameter `&...$args`. Analyzing that is going to - // be a problem. Is it possible to create - // `PassByReferenceVariableCollection extends Variable` - // or something similar? - if ($parameter->isVariadic()) { - return; - } - - if (!$argument instanceof Node) { - return; - } - - $variable = null; - if ($argument->kind == ast\AST_VAR) { - try { - $variable = (new ContextNode( - $this->code_base, - $this->context, - $argument - ))->getOrCreateVariableForReferenceParameter($parameter, $method->getRealParameterForCaller($parameter_offset)); - } catch (NodeException $_) { - // Could not figure out the node name - return; - } - } elseif ($argument->kind == ast\AST_STATIC_PROP) { - try { - $variable = (new ContextNode( - $this->code_base, - $this->context, - $argument - ))->getProperty( - true - ); - } catch (IssueException $_) { - // Hopefully caught elsewhere - } catch (NodeException $_) { - // Hopefully caught elsewhere - } - } - - // If we couldn't find a variable, give up - if (!$variable) { - return; - } - - $pass_by_reference_variable = - new PassByReferenceVariable( - $parameter, - $variable - ); - - // Add it to the (cloned) scope of the function wrapped - // in a way that makes it addressable as the - // parameter its mimicking - $method->getInternalScope()->addVariable( - $pass_by_reference_variable - ); - $parameter_list[$parameter_offset] = $pass_by_reference_variable; - } - - /** - * @param Node $node - * A node to check to see if it's a no-op - * - * @param string $issue_type - * A message to emit if it's a no-op - * - * @return void - */ - private function analyzeNoOp(Node $node, string $issue_type) - { - if ((\end($this->parent_node_list)->kind ?? null) === ast\AST_STMT_LIST) { - $this->emitIssue( - $issue_type, - $node->lineno - ); - } - } - - const LOOP_SCOPE_KINDS = [ - ast\AST_FOR => true, - ast\AST_FOREACH => true, - ast\AST_WHILE => true, - ast\AST_DO_WHILE => true, - ast\AST_SWITCH => true, - ]; - - /** - * Analyzes a `break;` or `break N;` statement. - * Checks if there are enough loops to break out of. - */ - public function visitBreak(Node $node) : Context - { - $depth = $node->children['depth'] ?? 1; - if (!\is_int($depth)) { - return $this->context; - } - foreach ($this->parent_node_list as $iter_node) { - if (\array_key_exists($iter_node->kind, self::LOOP_SCOPE_KINDS)) { - $depth--; - if ($depth <= 0) { - return $this->context; - } - } - } - $this->warnBreakOrContinueWithoutLoop($node); - return $this->context; - } - - /** - * Analyzes a `continue;` or `continue N;` statement. - * Checks for http://php.net/manual/en/migration73.incompatible.php#migration73.incompatible.core.continue-targeting-switch - * and similar issues. - */ - public function visitContinue(Node $node) : Context - { - $nodes = $this->parent_node_list; - $depth = $node->children['depth'] ?? 1; - if (!\is_int($depth)) { - return $this->context; - } - for ($iter_node = \end($nodes); $iter_node instanceof Node; $iter_node = \prev($nodes)) { - switch ($iter_node->kind) { - case ast\AST_FOR: - case ast\AST_FOREACH: - case ast\AST_WHILE: - case ast\AST_DO_WHILE: - $depth--; - if ($depth <= 0) { - return $this->context; - } - break; - case ast\AST_SWITCH: - $depth--; - if ($depth <= 0) { - $this->emitIssue( - Issue::ContinueTargetingSwitch, - $node->lineno - ); - return $this->context; - } - break; - } - } - $this->warnBreakOrContinueWithoutLoop($node); - return $this->context; - } - - /** - * Visit a node of kind AST_LABEL to check for unused labels. - * @override - */ - public function visitLabel(Node $node) : Context - { - $label = $node->children['name']; - $used_labels = GotoAnalyzer::getLabelSet($this->parent_node_list); - if (!isset($used_labels[$label])) { - $this->emitIssue( - Issue::UnusedGotoLabel, - $node->lineno, - $label - ); - } - return $this->context; - } - - /** - * @return void - */ - private function warnBreakOrContinueWithoutLoop(Node $node) - { - $depth = $node->children['depth'] ?? 1; - $name = $node->kind === ast\AST_BREAK ? 'break' : 'continue'; - if ($depth !== 1) { - $this->emitIssue( - Issue::ContinueOrBreakTooManyLevels, - $node->lineno, - $name, - $depth - ); - return; - } - $this->emitIssue( - Issue::ContinueOrBreakNotInLoop, - $node->lineno, - $name - ); - } - - /** - * @param Node $node - * A decl to check to see if it's only effect - * is the throw an exception - * - * @return bool - * True when the decl can only throw an exception or return or exit() - */ - private static function declOnlyThrows(Node $node) : bool - { - // Work around fallback parser generating methods without statements list. - // Otherwise, 'stmts' would always be a Node due to preconditions. - $stmts_node = $node->children['stmts']; - return $stmts_node instanceof Node && BlockExitStatusChecker::willUnconditionallyThrowOrReturn($stmts_node); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/PreOrderAnalysisVisitor.php b/vendor/phan/phan/src/Phan/Analysis/PreOrderAnalysisVisitor.php deleted file mode 100644 index 3dbeed2..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/PreOrderAnalysisVisitor.php +++ /dev/null @@ -1,883 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use AssertionError; -use ast; -use ast\Node; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\CodeBaseException; -use Phan\Exception\NodeException; -use Phan\Exception\RecursionDepthException; -use Phan\Exception\UnanalyzableException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\Scope\ClosureScope; -use Phan\Language\Type; -use Phan\Language\Type\VoidType; -use Phan\Language\UnionType; - -/** - * PreOrderAnalysisVisitor is where we do the pre-order part of the analysis - * during Phan's analysis phase. - * - * This is called in pre-order by BlockAnalysisVisitor - * (i.e. this is called before visiting all children of the current node) - */ -class PreOrderAnalysisVisitor extends ScopeVisitor -{ - /** - * @param CodeBase $code_base - * The code base in which we're analyzing code - * - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - */ - /* - public function __construct( - CodeBase $code_base, - Context $context - ) { - parent::__construct($code_base, $context); - } - */ - - /** @param Node $unused_node implementation for unhandled nodes */ - public function visit(Node $unused_node) : Context - { - return $this->context; - } - - /** - * Visit a node with kind `ast\AST_CLASS` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * - * @throws UnanalyzableException - * if the class name is unexpectedly empty - * - * @throws CodeBaseException - * if the class could not be located - */ - public function visitClass(Node $node) : Context - { - if ($node->flags & ast\flags\CLASS_ANONYMOUS) { - $class_name = - (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getUnqualifiedNameForAnonymousClass(); - } else { - $class_name = (string)$node->children['name']; - } - - if (!$class_name) { - // Should only occur with --use-fallback-parser - throw new UnanalyzableException($node, "Class name cannot be empty"); - } - - $alternate_id = 0; - - // Hunt for the alternate of this class defined - // in this file - do { - // @phan-suppress-next-line PhanThrowTypeMismatchForCall - $class_fqsen = FullyQualifiedClassName::fromStringInContext( - $class_name, - $this->context - )->withAlternateId($alternate_id++); - - if (!$this->code_base->hasClassWithFQSEN($class_fqsen)) { - throw new CodeBaseException( - $class_fqsen, - "Can't find class {$class_fqsen} - aborting" - ); - } - - $clazz = $this->code_base->getClassByFQSEN( - $class_fqsen - ); - } while ($this->context->getProjectRelativePath() - != $clazz->getFileRef()->getProjectRelativePath() - || $node->children['__declId'] != $clazz->getDeclId() - || $this->context->getLineNumberStart() != $clazz->getFileRef()->getLineNumberStart() - ); - - return $clazz->getContext()->withScope( - $clazz->getInternalScope() - ); - } - - /** - * Visit a node with kind `ast\AST_METHOD` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * - * @throws CodeBaseException if the method could not be found - */ - public function visitMethod(Node $node) : Context - { - $method_name = (string)$node->children['name']; - $code_base = $this->code_base; - $context = $this->context; - - if (!($context->isInClassScope())) { - throw new AssertionError("Must be in class context to see a method"); - } - - $clazz = $this->getContextClass(); - - if (!$clazz->hasMethodWithName( - $code_base, - $method_name - )) { - throw new CodeBaseException( - null, - "Can't find method {$clazz->getFQSEN()}::$method_name() - aborting" - ); - } - - $method = $clazz->getMethodByName( - $code_base, - $method_name - ); - $method->ensureScopeInitialized($code_base); - // Fix #2504 - add flags to ensure that DimOffset warnings aren't emitted inside closures - Analyzable::ensureDidAnnotate($node); - - // Parse the comment above the method to get - // extra meta information about the method. - $comment = $method->getComment(); - - $context = $this->context->withScope( - $method->getInternalScope() - ); - - // For any @var references in the method declaration, - // add them as variables to the method's scope - if ($comment !== null) { - foreach ($comment->getVariableList() as $parameter) { - $context->addScopeVariable( - $parameter->asVariable($this->context) - ); - } - } - - // Add $this to the scope of non-static methods - if (!($node->flags & ast\flags\MODIFIER_STATIC)) { - if (!($clazz->getInternalScope()->hasVariableWithName('this'))) { - throw new AssertionError("Classes must have a \$this variable."); - } - - $context->addScopeVariable( - $clazz->getInternalScope()->getVariableByName('this') - ); - } - - // Add each method parameter to the scope. We clone it - // so that changes to the variable don't alter the - // parameter definition - if ($method->getRecursionDepth() === 0) { - // Add each method parameter to the scope. We clone it - // so that changes to the variable don't alter the - // parameter definition - foreach ($method->getParameterList() as $parameter) { - $context->addScopeVariable( - $parameter->cloneAsNonVariadic() - ); - } - } - - // TODO: Why is the check for yield in PreOrderAnalysisVisitor? - if ($method->getHasYield()) { - $this->setReturnTypeOfGenerator($method, $node); - } - - return $context; - } - - /** - * Visit a node with kind `ast\AST_FUNC_DECL` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * @throws CodeBaseException - * if this function declaration could not be found - */ - public function visitFuncDecl(Node $node) : Context - { - $function_name = (string)$node->children['name']; - $code_base = $this->code_base; - $original_context = $this->context; - - // This really ought not to throw given that - // we already successfully parsed the code - // base (the AST names should be valid) - // @phan-suppress-next-line PhanThrowTypeMismatchForCall - $canonical_function = (new ContextNode( - $code_base, - $original_context, - $node - ))->getFunction($function_name, true); - - // Hunt for the alternate associated with the file we're - // looking at currently in this context. - $function = null; - foreach ($canonical_function->alternateGenerator($code_base) as $alternate_function) { - if ($alternate_function->getFileRef()->getProjectRelativePath() - === $original_context->getProjectRelativePath() - ) { - $function = $alternate_function; - break; - } - } - - if (!($function instanceof Func)) { - // No alternate was found - throw new CodeBaseException( - null, - "Can't find function {$function_name} in context {$this->context} - aborting" - ); - } - - $function->ensureScopeInitialized($code_base); - // Fix #2504 - add flags to ensure that DimOffset warnings aren't emitted inside closures - Analyzable::ensureDidAnnotate($node); - - $context = $original_context->withScope( - $function->getInternalScope() - ); - - // Parse the comment above the function to get - // extra meta information about the function. - // TODO: Investigate caching information from Comment::fromStringInContext? - $comment = $function->getComment(); - - // For any @var references in the function declaration, - // add them as variables to the function's scope - if ($comment !== null) { - foreach ($comment->getVariableList() as $parameter) { - $context->addScopeVariable( - $parameter->asVariable($this->context) - ); - } - } - - if ($function->getRecursionDepth() === 0) { - // Add each method parameter to the scope. We clone it - // so that changes to the variable don't alter the - // parameter definition - foreach ($function->getParameterList() as $parameter) { - $context->addScopeVariable( - $parameter->cloneAsNonVariadic() - ); - } - } - - if ($function->getHasYield()) { - $this->setReturnTypeOfGenerator($function, $node); - } - if (!$function->getHasReturn() && $function->getUnionType()->isEmpty()) { - $function->setUnionType(VoidType::instance(false)->asUnionType()); - } - - return $context; - } - - /** - * @return ?FullyQualifiedClassName - */ - private static function getOverrideClassFQSEN(CodeBase $code_base, Func $func) - { - $closure_scope = $func->getInternalScope(); - if ($closure_scope instanceof ClosureScope) { - $class_fqsen = $closure_scope->getOverrideClassFQSEN(); - if (!$class_fqsen) { - return null; - } - - // Postponed the check for undeclared closure scopes to the analysis phase, - // because classes are still being parsed in the parse phase. - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - $func_context = $func->getContext(); - Issue::maybeEmit( - $code_base, - $func_context, - Issue::UndeclaredClosureScope, - $func_context->getLineNumberStart(), - (string)$class_fqsen - ); - $closure_scope->overrideClassFQSEN(null); // Avoid an uncaught CodeBaseException due to missing class for @phan-closure-scope - return null; - } - return $class_fqsen; - } - return null; - } - - /** - * If a Closure overrides the scope(class) it will be executed in (via doc comment) - * then return a context with the new scope instead. - * @return void - */ - private static function addThisVariableToInternalScope( - CodeBase $code_base, - Context $context, - Func $func - ) { - // skip adding $this to internal scope if the closure is a static one - if ($func->getFlags() == ast\flags\MODIFIER_STATIC) { - return; - } - - $override_this_fqsen = self::getOverrideClassFQSEN($code_base, $func); - if ($override_this_fqsen !== null) { - if ($context->getScope()->hasVariableWithName('this') || !$context->isInClassScope()) { - // Handle @phan-closure-scope - Should set $this to the overridden class, as well as handling self:: and parent:: - $func->getInternalScope()->addVariable( - new Variable( - $context, - 'this', - $override_this_fqsen->asUnionType(), - 0 - ) - ); - } - return; - } - // If we have a 'this' variable in our current scope, - // pass it down into the closure - if ($context->getScope()->hasVariableWithName('this')) { - // Normal case: Closures inherit $this from parent scope. - $this_var_from_scope = $context->getScope()->getVariableByName('this'); - $func->getInternalScope()->addVariable($this_var_from_scope); - } - } - - - /** - * Visit a node with kind `ast\AST_CLOSURE` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitClosure(Node $node) : Context - { - $code_base = $this->code_base; - $context = $this->context; - $closure_fqsen = FullyQualifiedFunctionName::fromClosureInContext( - $context->withLineNumberStart($node->lineno), - $node - ); - $func = $code_base->getFunctionByFQSEN($closure_fqsen); - $func->ensureScopeInitialized($code_base); - // Fix #2504 - add flags to ensure that DimOffset warnings aren't emitted inside closures - Analyzable::ensureDidAnnotate($node); - - // If we have a 'this' variable in our current scope, - // pass it down into the closure - self::addThisVariableToInternalScope($code_base, $context, $func); - - // Make the closure reachable by FQSEN from anywhere - $code_base->addFunction($func); - - if (($node->children['uses']->kind ?? null) == ast\AST_CLOSURE_USES) { - $uses = $node->children['uses']; - foreach ($uses->children as $use) { - if (!($use instanceof Node) || $use->kind != ast\AST_CLOSURE_VAR) { - $this->emitIssue( - Issue::VariableUseClause, - $node->lineno - ); - continue; - } - - $variable_name = (new ContextNode( - $code_base, - $context, - $use->children['name'] - ))->getVariableName(); - - if (!$variable_name) { - continue; - } - - $variable = null; - - // Check to see if the variable exists in this scope - if (!$context->getScope()->hasVariableWithName( - $variable_name - )) { - // If this is not pass-by-reference variable we - // have a problem - if (!($use->flags & ast\flags\PARAM_REF)) { - Issue::maybeEmitWithParameters( - $this->code_base, - clone($context)->withLineNumberStart($use->lineno), - Issue::UndeclaredVariable, - $node->lineno, - [$variable_name], - IssueFixSuggester::suggestVariableTypoFix($this->code_base, $context, $variable_name) - ); - continue; - } else { - // If the variable doesn't exist, but it's - // a pass-by-reference variable, we can - // just create it - $variable = Variable::fromNodeInContext( - $use, - $context, - $this->code_base, - false - ); - // And add it to the scope of the parent (For https://github.com/phan/phan/issues/367) - $context->addScopeVariable($variable); - } - } else { - $variable = $context->getScope()->getVariableByName( - $variable_name - ); - - // If this isn't a pass-by-reference variable, we - // clone the variable so state within this scope - // doesn't update the outer scope - if (!($use->flags & ast\flags\PARAM_REF)) { - $variable = clone($variable); - } - } - - // Pass the variable into a new scope - $func->getInternalScope()->addVariable($variable); - } - } - if (!$func->getHasReturn() && $func->getUnionType()->isEmpty()) { - $func->setUnionType(VoidType::instance(false)->asUnionType()); - } - - // Add parameters to the context. - $context = $context->withScope($func->getInternalScope()); - - $comment = $func->getComment(); - - // For any @var references in the method declaration, - // add them as variables to the method's scope - if ($comment !== null) { - foreach ($comment->getVariableList() as $parameter) { - $context->addScopeVariable( - $parameter->asVariable($this->context) - ); - } - } - if ($func->getRecursionDepth() === 0) { - // Add each closure parameter to the scope. We clone it - // so that changes to the variable don't alter the - // parameter definition - foreach ($func->getParameterList() as $parameter) { - $context->addScopeVariable( - $parameter->cloneAsNonVariadic() - ); - } - } - - if ($func->getHasYield()) { - $this->setReturnTypeOfGenerator($func, $node); - } - - return $context; - } - - /** - * The return type of the given FunctionInterface to a Generator. - * Emit an Issue if the documented return type is incompatible with that. - * @return void - */ - private function setReturnTypeOfGenerator(FunctionInterface $func, Node $node) - { - // Currently, there is no way to describe the types passed to - // a Generator in phpdoc. - // So, nothing bothers recording the types beyond \Generator. - $func->setHasReturn(true); // Returns \Generator, technically - $func->setHasYield(true); - if ($func->getUnionType()->isEmpty()) { - $func->setIsReturnTypeUndefined(true); - $func->setUnionType($func->getUnionType()->withType(Type::fromNamespaceAndName('\\', 'Generator', false))); - } - if (!$func->isReturnTypeUndefined()) { - $func_return_type = $func->getUnionType(); - try { - $func_return_type_can_cast = $func_return_type->canCastToExpandedUnionType( - Type::fromNamespaceAndName('\\', 'Generator', false)->asUnionType(), - $this->code_base - ); - } catch (RecursionDepthException $_) { - return; - } - if (!$func_return_type_can_cast) { - // At least one of the documented return types must - // be Generator, Iterable, or Traversable. - // Check for the issue here instead of in visitReturn/visitYield so that - // the check is done exactly once. - $this->emitIssue( - Issue::TypeMismatchReturn, - $node->lineno, - '\\Generator', - $func->getNameForIssue(), - (string)$func_return_type - ); - } - } - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * An unchanged context resulting from parsing the node - */ - public function visitAssign(Node $node) : Context - { - $var_node = $node->children['var']; - if (Config::get_closest_target_php_version_id() < 70100 && $var_node instanceof Node && $var_node->kind === ast\AST_ARRAY) { - $this->analyzeArrayAssignBackwardsCompatibility($var_node); - } - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * - * @throws NodeException - * if the key is invalid - */ - public function visitForeach(Node $node) : Context - { - $code_base = $this->code_base; - $context = $this->context; - - $expression_union_type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node->children['expr'] - ); - - // Check the expression type to make sure it's - // something we can iterate over - $this->checkCanIterate($expression_union_type, $node); - - $value_node = $node->children['value']; - if (!($value_node instanceof Node)) { - return $context; - } - if ($value_node->kind == ast\AST_ARRAY) { - if (Config::get_closest_target_php_version_id() < 70100) { - $this->analyzeArrayAssignBackwardsCompatibility($value_node); - } - } - - $context = (new AssignmentVisitor( - $code_base, - $context, - $value_node, - $expression_union_type->iterableValueUnionType($code_base) - ))->__invoke($value_node); - - // If there's a key, make a variable out of that too - $key_node = $node->children['key']; - if ($key_node instanceof Node) { - if ($key_node->kind === ast\AST_ARRAY) { - $this->emitIssue( - Issue::InvalidNode, - $key_node->lineno, - "Can't use list() as a key element - aborting" - ); - } else { - // TODO: Support Traversable<Key, T> then return Key. - // If we see array<int,T> or array<string,T> and no other array types, we're reasonably sure the foreach key is an integer or a string, so set it. - // (Or if we see iterable<int,T> - $context = (new AssignmentVisitor( - $code_base, - $context, - $key_node, - $expression_union_type->iterableKeyUnionType($code_base) - ))->__invoke($key_node); - } - } - - // Note that we're not creating a new scope, just - // adding variables to the existing scope - return $context; - } - - /** - * @param UnionType $union_type the type of $node->children['expr'] - * @param Node $node a node of kind AST_FOREACH - */ - private function checkCanIterate(UnionType $union_type, Node $node) - { - if ($union_type->isScalar()) { - $this->emitIssue( - Issue::TypeMismatchForeach, - $node->children['expr']->lineno ?? $node->lineno, - (string)$union_type - ); - } - foreach ($union_type->getTypeSet() as $type) { - try { - if ($type->asExpandedTypes($this->code_base)->hasTraversable()) { - continue; - } - } catch (RecursionDepthException $_) { - } - if (!$type->isObjectWithKnownFQSEN()) { - continue; - } - $this->warnAboutNonTraversableType($node, $type); - } - } - - private function warnAboutNonTraversableType(Node $node, Type $type) - { - $fqsen = FullyQualifiedClassName::fromType($type); - if (!$this->code_base->hasClassWithFQSEN($fqsen)) { - return; - } - if ($fqsen->__toString() === '\stdClass') { - // stdClass is the only non-Traversable that I'm aware of that's commonly traversed over. - return; - } - $class = $this->code_base->getClassByFQSEN($fqsen); - $status = $class->checkCanIterateFromContext( - $this->code_base, - $this->context - ); - switch ($status) { - case Clazz::CAN_ITERATE_STATUS_NO_ACCESSIBLE_PROPERTIES: - $issue = Issue::TypeNoAccessiblePropertiesForeach; - break; - case Clazz::CAN_ITERATE_STATUS_NO_PROPERTIES: - $issue = Issue::TypeNoPropertiesForeach; - break; - default: - $issue = Issue::TypeSuspiciousNonTraversableForeach; - break; - } - - $this->emitIssue( - $issue, - $node->children['expr']->lineno ?? $node->lineno, - $type - ); - } - - private function analyzeArrayAssignBackwardsCompatibility(Node $node) - { - if ($node->flags !== ast\flags\ARRAY_SYNTAX_LIST) { - $this->emitIssue( - Issue::CompatibleShortArrayAssignPHP70, - $node->lineno - ); - } - foreach ($node->children as $array_elem) { - if (isset($array_elem->children['key'])) { - $this->emitIssue( - Issue::CompatibleKeyedArrayAssignPHP70, - $array_elem->lineno - ); - break; - } - } - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitCatch(Node $node) : Context - { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - $union_type = UnionTypeVisitor::unionTypeFromClassNode( - $this->code_base, - $this->context, - $node->children['class'] - ); - - try { - $class_list = \iterator_to_array($union_type->asClassList($this->code_base, $this->context)); - - if (Config::get_closest_target_php_version_id() < 70100 && \count($class_list) > 1) { - $this->emitIssue( - Issue::CompatibleMultiExceptionCatchPHP70, - $node->lineno - ); - } - - foreach ($class_list as $class) { - $class->addReference($this->context); - } - } catch (CodeBaseException $exception) { - Issue::maybeEmitWithParameters( - $this->code_base, - $this->context, - Issue::UndeclaredClassCatch, - $node->lineno, - [(string)$exception->getFQSEN()], - IssueFixSuggester::suggestSimilarClassForGenericFQSEN($this->code_base, $this->context, $exception->getFQSEN()) - ); - } - - $throwable_type = Type::throwableInstance(); - if ($union_type->isEmpty() || !$union_type->asExpandedTypes($this->code_base)->hasType($throwable_type)) { - $union_type = $union_type->withType($throwable_type); - } - - $variable_name = (new ContextNode( - $this->code_base, - $this->context, - $node->children['var'] - ))->getVariableName(); - - if ($variable_name) { - $variable = Variable::fromNodeInContext( - $node->children['var'], - $this->context, - $this->code_base, - false - ); - - if (!$union_type->isEmpty()) { - $variable->setUnionType($union_type); - } - - $this->context->addScopeVariable($variable); - } - - return $this->context; - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitIfElem(Node $node) : Context - { - $cond = $node->children['cond'] ?? null; - if (!($cond instanceof Node)) { - return $this->context; - } - - // Look to see if any proofs we do within the condition - // can say anything about types within the statement - // list. - return (new ConditionVisitor( - $this->code_base, - $this->context - ))->__invoke($cond); - } - - // visitWhile is unnecessary, this has special logic in BlockAnalysisVisitor to handle conditions assigning variables to the loop - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitFor(Node $node) : Context - { - $cond = $node->children['cond']; - if (!($cond instanceof Node)) { - return $this->context; - } - - // Look to see if any proofs we do within the condition of the while - // can say anything about types within the statement - // list. - return (new ConditionVisitor( - $this->code_base, - $this->context - ))->__invoke($cond); - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitCall(Node $node) : Context - { - $name = $node->children['expr']->children['name'] ?? null; - // Look only at nodes of the form `assert(expr, ...)`. - if ($name !== 'assert') { - return $this->context; - } - $args_first_child = $node->children['args']->children[0] ?? null; - if (!($args_first_child instanceof Node)) { - return $this->context; - } - - // Look to see if the asserted expression says anything about - // the types of any variables. - return (new ConditionVisitor( - $this->code_base, - $this->context - ))->__invoke($args_first_child); - } - - /** - * @return Clazz - * Get the class on this scope or fail real hard - */ - private function getContextClass() : Clazz - { - return $this->context->getClassInScope($this->code_base); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/PropertyTypesAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/PropertyTypesAnalyzer.php deleted file mode 100644 index 174f754..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/PropertyTypesAnalyzer.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use Phan\CodeBase; -use Phan\Exception\IssueException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Element\Clazz; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type\TemplateType; - -/** - * An analyzer that checks a class's properties for issues. - */ -class PropertyTypesAnalyzer -{ - - /** - * Check to see if the given class's properties have issues. - * - * @return void - */ - public static function analyzePropertyTypes(CodeBase $code_base, Clazz $clazz) - { - foreach ($clazz->getPropertyMap($code_base) as $property) { - // This phase is done before the analysis phase, so there aren't any dynamic properties to filter out. - - // Get the union type of this property. This may throw (e.g. it can refers to missing elements). - try { - $union_type = $property->getUnionType(); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $code_base, - $property->getContext(), - $exception->getIssueInstance() - ); - continue; - } - - // Look at each type in the parameter's Union Type - foreach ($union_type->withFlattenedArrayShapeOrLiteralTypeInstances()->getTypeSet() as $outer_type) { - foreach ($outer_type->getReferencedClasses() as $type) { - // If it's a reference to self, its OK - if ($type->isSelfType()) { - continue; - } - - if ($type instanceof TemplateType) { - if ($property->isStatic()) { - Issue::maybeEmit( - $code_base, - $property->getContext(), - Issue::TemplateTypeStaticProperty, - $property->getFileRef()->getLineNumberStart(), - $property->asPropertyFQSENString() - ); - } - continue; - } - - // Make sure the class exists - $type_fqsen = FullyQualifiedClassName::fromType($type); - - if (!$code_base->hasClassWithFQSEN($type_fqsen) - && !($type instanceof TemplateType) - && ( - !$property->hasDefiningFQSEN() - || $property->getDefiningFQSEN() == $property->getFQSEN() - ) - ) { - Issue::maybeEmitWithParameters( - $code_base, - $property->getContext(), - Issue::UndeclaredTypeProperty, - $property->getFileRef()->getLineNumberStart(), - [$property->asPropertyFQSENString(), (string)$outer_type], - IssueFixSuggester::suggestSimilarClass($code_base, $property->getContext(), $type_fqsen, null, 'Did you mean', IssueFixSuggester::CLASS_SUGGEST_CLASSES_AND_TYPES) - ); - } - } - } - } - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ReachabilityChecker.php b/vendor/phan/phan/src/Phan/Analysis/ReachabilityChecker.php deleted file mode 100644 index e6625f6..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ReachabilityChecker.php +++ /dev/null @@ -1,303 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use ast\Node; -use Phan\AST\Visitor\KindVisitorImplementation; - -/** - * This checks if $inner is unconditionally reachable from the passed in node. - * - * This returns false if the node is not even a descendent node. - * - * @see BlockExitStatusChecker - * @internal - This is specialized for AST_ARG_LIST right now. - */ -final class ReachabilityChecker extends KindVisitorImplementation -{ - /** @var Node the node we're checking for reachability. */ - private $inner; - - public function __construct(Node $inner) - { - $this->inner = $inner; - } - - /** - * @return ?bool - */ - public function visitArgList(Node $node) - { - if ($node === $this->inner) { - return true; - } - return $this->visit($node); - } - - /** - * If we don't know how to analyze a node type (or left it out), assume it always proceeds - * @return ?bool - The status bitmask corresponding to always proceeding - */ - public function visit(Node $node) - { - foreach ($node->children as $child) { - if (!($child instanceof Node)) { - continue; - } - $result = $this->__invoke($child); - if ($result !== null) { - return $result; - } - } - return null; - } - - /** - * @return ?bool this gives up on analyzing catch lists - */ - public function visitCatchList(Node $_) - { - return null; - } - - /** - * @return ?bool this gives up on analyzing switches, except for the condition - */ - public function visitSwitch(Node $node) - { - $cond = $node->children['cond']; - if ($cond instanceof Node) { - return $this->__invoke($cond); - } - return null; - } - - /** - * @return ?bool this gives up on analyzing for loops, except for the initializer and condition - */ - public function visitFor(Node $node) - { - $init = $node->children['init']; - if ($init instanceof Node) { - $result = $this->__invoke($init); - if ($result !== null) { - return $result; - } - } - $cond = $node->children['cond']; - if ($cond instanceof Node) { - return $this->__invoke($cond); - } - return null; - } - - /** - * @return ?bool this gives up on analyzing loops, except for the condition - */ - public function visitWhile(Node $node) - { - $cond = $node->children['cond']; - if ($cond instanceof Node) { - return $this->__invoke($cond); - } - return null; - } - - /** - * @return ?bool this gives up on analyzing loops, except for the condition - */ - public function visitForeach(Node $node) - { - $expr = $node->children['expr']; - if ($expr instanceof Node) { - return $this->__invoke($expr); - } - return null; - } - - /** - * @return ?bool - */ - public function visitBreak(Node $_) - { - return false; - } - - /** - * @return ?bool - */ - public function visitContinue(Node $_) - { - return false; - } - - /** - * @return bool - */ - public function visitReturn(Node $node) - { - $expr = $node->children['expr']; - if (!($expr instanceof Node)) { - return false; - } - return $this->__invoke($expr) ?? false; - } - - /** - * @return ?bool - * @override - */ - public function visitClosure(Node $_) - { - return null; - } - - /** - * @return ?bool - * @override - */ - public function visitFuncDecl(Node $_) - { - return null; - } - - /** - * @return ?bool - * @override - */ - public function visitClass(Node $node) - { - $args = $node->children['args'] ?? null; - if (!$args instanceof Node) { - return null; - } - return $this->__invoke($args); - } - - /** - * @return bool - */ - public function visitThrow(Node $node) - { - $expr = $node->children['expr']; - if (!($expr instanceof Node)) { - return false; - } - return $this->__invoke($expr) ?? false; - } - - /** - * @return bool - */ - public function visitExit(Node $node) - { - $expr = $node->children['expr']; - if (!($expr instanceof Node)) { - return false; - } - return $this->__invoke($expr) ?? false; - } - - /** - * @return ?bool the first result seen for any statement, or null. - */ - public function visitStmtList(Node $node) - { - foreach ($node->children as $child) { - if (!($child instanceof Node)) { - continue; - } - $result = $this->__invoke($child); - if ($result !== null) { - return $result; - } - $status = (new BlockExitStatusChecker())->__invoke($child); - if ($status !== BlockExitStatusChecker::STATUS_PROCEED) { - if ($status & BlockExitStatusChecker::STATUS_THROW_OR_RETURN_BITMASK) { - return false; - } - continue; - } - } - return null; - } - - /** - * Analyzes a node with kind \ast\AST_IF - * @return ?bool the result seen for an if statement (if $node contains $this->inner or causes this to give up), or null - * @override - */ - public function visitIf(Node $node) - { - foreach ($node->children as $i => $child) { - // TODO could check first if element (not important) - // @phan-suppress-next-line PhanPartialTypeMismatchArgument - $result = $this->visitIfElem($child); - if ($result !== null) { - return $result && $i === 0; - } - } - return null; - } - - /** - * Analyzes a node with kind \ast\AST_IF_ELEM - * @return ?bool the result seen for an if statement element (if $node contains $this->inner or causes this to give up), or null - */ - public function visitIfElem(Node $node) - { - $cond = $node->children['cond'] ?? null; - if ($cond instanceof Node) { - $result = $this->__invoke($cond); - if ($result !== null) { - return $result; - } - } - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this is never null - $result = $this->__invoke($node->children['stmts']); - if ($result !== null) { - // This is a conditional; it's not guaranteed to work - return false; - } - return null; - } - - /** - * Analyzes a node with kind \ast\AST_CONDITIONAL - * @return ?bool the result seen for a conditional - */ - public function visitConditional(Node $node) - { - $cond = $node->children['cond']; - if ($cond instanceof Node) { - $result = $this->__invoke($cond); - if ($result !== null) { - return $result; - } - } - foreach (['true', 'false'] as $sub_node_name) { - $value = $node->children[$sub_node_name]; - if (!($value instanceof Node)) { - continue; - } - $result = $this->__invoke($value); - if ($result !== null) { - // This is a conditional; it's not guaranteed to work - return false; - } - } - return null; - } - - /** - * Returns true if there are no break/return/throw/etc statements - * within the method that would prevent $inner (a descendant node of $node) - * to be reached from the start of evaluating the statements in $node. - * - * This does not attempt to check if any statements in $node might indirectly throw. - */ - public static function willUnconditionallyBeReached(Node $node, Node $inner) : bool - { - return (new self($inner))->__invoke($node) ?? false; - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ReferenceCountsAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/ReferenceCountsAnalyzer.php deleted file mode 100644 index 6005c7a..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ReferenceCountsAnalyzer.php +++ /dev/null @@ -1,520 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use Phan\CLI; -use Phan\CodeBase; -use Phan\CodeBase\ClassMap; -use Phan\Config; -use Phan\Issue; -use Phan\Language\Element\AddressableElement; -use Phan\Language\Element\ClassConstant; -use Phan\Language\Element\ClassElement; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\Method; -use Phan\Language\Element\Property; -use Phan\Language\FQSEN\FullyQualifiedClassConstantName; -use Phan\Language\FQSEN\FullyQualifiedClassElement; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedGlobalConstantName; -use Phan\Language\FQSEN\FullyQualifiedGlobalStructuralElement; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\FQSEN\FullyQualifiedPropertyName; -use Phan\Library\Map; -use TypeError; - -/** - * This emits PhanUnreferenced* issues for class-likes, constants, properties, and functions/methods. - * - * TODO: Make references to methods of interfaces also count as references to traits which are used by classes to implement those methods. - * (Maybe track these in addMethod when checking for inheritance?) - */ -class ReferenceCountsAnalyzer -{ - /** - * Take a look at all globally accessible elements and see if - * we can find any dead code that is never referenced - * - * @return void - */ - public static function analyzeReferenceCounts(CodeBase $code_base) - { - // Check to see if dead code detection is enabled. Keep - // in mind that the results here are just a guess and - // we can't tell with certainty that anything is - // definitely unreferenced. - if (!Config::getValue('dead_code_detection')) { - return; - } - - // Get the count of all known elements - $total_count = $code_base->totalElementCount(); - $i = 0; - - // Functions - self::analyzeGlobalElementListReferenceCounts( - $code_base, - $code_base->getFunctionMap(), - Issue::UnreferencedFunction, - $total_count, - $i - ); - - // Constants - self::analyzeGlobalElementListReferenceCounts( - $code_base, - $code_base->getGlobalConstantMap(), - Issue::UnreferencedConstant, - $total_count, - $i - ); - - // Classes - self::analyzeGlobalElementListReferenceCounts( - $code_base, - $code_base->getUserDefinedClassMap(), - Issue::UnreferencedClass, - $total_count, - $i - ); - - // Class Maps - $elements_to_analyze = []; - foreach ($code_base->getClassMapMap() as $class_map) { - foreach (self::getElementsFromClassMapForDeferredAnalysis( - $code_base, - $class_map, - $total_count, - $i - ) as $element) { - $elements_to_analyze[] = $element; - } - } - - static $issue_types = [ - ClassConstant::class => Issue::UnreferencedPublicClassConstant, // This is overridden - Method::class => Issue::UnreferencedPublicMethod, // This is overridden - Property::class => Issue::UnreferencedPublicProperty, // This is overridden - ]; - - foreach ($elements_to_analyze as $element) { - $issue_type = $issue_types[\get_class($element)]; - self::analyzeElementReferenceCounts($code_base, $element, $issue_type); - } - } - - /** - * @param CodeBase $code_base - * @param ClassMap $class_map - * @param int $total_count - * @param int $i - * - * @return \Generator|ClassElement[] - * @phan-return \Generator<ClassElement> - */ - private static function getElementsFromClassMapForDeferredAnalysis( - CodeBase $code_base, - ClassMap $class_map, - int $total_count, - int &$i - ) { - // Constants - yield from self::getElementsFromElementListForDeferredAnalysis( - $code_base, - $class_map->getClassConstantMap(), - $total_count, - $i - ); - - // Properties - yield from self::getElementsFromElementListForDeferredAnalysis( - $code_base, - $class_map->getPropertyMap(), - $total_count, - $i - ); - - // Methods - yield from self::getElementsFromElementListForDeferredAnalysis( - $code_base, - $class_map->getMethodMap(), - $total_count, - $i - ); - } - - /** - * @param CodeBase $code_base - * @param Map|AddressableElement[] $element_list - * @param string $issue_type - * @param int $total_count - * @param int $i - * - * @return void - */ - private static function analyzeGlobalElementListReferenceCounts( - CodeBase $code_base, - $element_list, - string $issue_type, - int $total_count, - int &$i - ) { - foreach ($element_list as $element) { - CLI::progress('dead code', (++$i) / $total_count, $element); - // Don't worry about internal elements - if ($element->isPHPInternal() || $element->getContext()->isPHPInternal()) { - // The extra check of the context is necessary for code in internal_stubs - // which aren't exactly internal to PHP. - continue; - } - self::analyzeElementReferenceCounts($code_base, $element, $issue_type); - } - } - - /** - * @param CodeBase $code_base - * @param Map|ClassElement[] $element_list - * @param int $total_count - * @param int $i - * - * @return \Generator|ClassElement[] - * @phan-return \Generator<ClassElement> - */ - private static function getElementsFromElementListForDeferredAnalysis( - CodeBase $code_base, - $element_list, - int $total_count, - int &$i - ) { - foreach ($element_list as $element) { - CLI::progress('dead code', (++$i) / $total_count, $element); - // Don't worry about internal elements - if ($element->isPHPInternal()) { - continue; - } - // Currently, deferred analysis is only needed for class elements, which can be inherited - // (And we may track the references to the inherited version of the original) - if (!$element instanceof ClassElement) { - throw new TypeError("Expected an iterable of ClassElement values"); - } - // should not warn about self::class - if (\strcasecmp($element->getName(), 'class') === 0) { - continue; - } - $fqsen = $element->getFQSEN(); - if ($element instanceof Method || $element instanceof Property) { - $defining_fqsen = $element->getRealDefiningFQSEN(); - } else { - $defining_fqsen = $element->getDefiningFQSEN(); - } - - // copy references to methods, properties, and constants into the defining trait or class. - if ($fqsen !== $defining_fqsen) { - if ($element->getReferenceCount($code_base) > 0) { - $defining_element = null; - if ($defining_fqsen instanceof FullyQualifiedMethodName) { - if ($code_base->hasMethodWithFQSEN($defining_fqsen)) { - $defining_element = $code_base->getMethodByFQSEN($defining_fqsen); - } - } elseif ($defining_fqsen instanceof FullyQualifiedPropertyName) { - if ($code_base->hasPropertyWithFQSEN($defining_fqsen)) { - $defining_element = $code_base->getPropertyByFQSEN($defining_fqsen); - } - } elseif ($defining_fqsen instanceof FullyQualifiedClassConstantName) { - if ($code_base->hasClassConstantWithFQSEN($defining_fqsen)) { - $defining_element = $code_base->getClassConstantByFQSEN($defining_fqsen); - } - } - if ($defining_element !== null) { - $defining_element->copyReferencesFrom($element); - } - } - continue; - } - - // Don't analyze elements defined in a parent class. - // We copy references to methods, properties, and constants into the defining trait or class before this. - if ($element->getIsOverride()) { - continue; - } - - $defining_class = - $element->getClass($code_base); - - if ($element instanceof Method) { - // Ignore magic methods - if ($element->getIsMagic()) { - continue; - } - // Don't analyze abstract methods, as they're uncallable. - // (Every method on an interface is abstract) - if ($element->isAbstract() || $defining_class->isInterface()) { - continue; - } - } elseif ($element instanceof Property) { - // Skip properties on classes that were derived from (at)property annotations on classes - // or were automatically generated for classes with __get or __set methods - // (or undeclared properties that were automatically added depending on configs) - if ($element->isDynamicProperty()) { - continue; - } - // TODO: may want to continue to skip `if ($defining_class->hasGetOrSetMethod($code_base)) {` - // E.g. a __get() method that is implemented as `return $this->"_$name"`. - // (at)phan-file-suppress is an easy enough workaround, though - } - yield $element; - } - } - - /** - * Check to see if the given AddressableElement is a duplicate - * - * @return void - */ - private static function analyzeElementReferenceCounts( - CodeBase $code_base, - AddressableElement $element, - string $issue_type - ) { - /* - print "digraph G {\n"; - foreach ($element->getReferenceList() as $file_ref) { - print "\t\"{$file_ref->getFile()}\" -> \"{$element->getFileRef()->getFile()}\";\n"; - } - print "}\n"; - */ - - // Make issue types granular so that these can be fixed in smaller steps. - // E.g. composer libraries may have unreferenced but used public methods, properties, and class constants, - // and those would have higher false positives than private/protected elements. - // - // Make $issue_type specific **first**, so that issue suppressions are checked against the proper issue type - if ($element instanceof ClassElement) { - if ($element instanceof Method) { - if ($element->isPrivate()) { - $issue_type = Issue::UnreferencedPrivateMethod; - } elseif ($element->isProtected()) { - $issue_type = Issue::UnreferencedProtectedMethod; - } else { - $issue_type = Issue::UnreferencedPublicMethod; - } - } elseif ($element instanceof Property) { - if ($element->isFromPHPDoc()) { - $issue_type = Issue::UnreferencedPHPDocProperty; - } elseif ($element->isPrivate()) { - $issue_type = Issue::UnreferencedPrivateProperty; - } elseif ($element->isProtected()) { - $issue_type = Issue::UnreferencedProtectedProperty; - } else { - $issue_type = Issue::UnreferencedPublicProperty; - } - } elseif ($element instanceof ClassConstant) { - if ($element->isPrivate()) { - $issue_type = Issue::UnreferencedPrivateClassConstant; - } elseif ($element->isProtected()) { - $issue_type = Issue::UnreferencedProtectedClassConstant; - } else { - $issue_type = Issue::UnreferencedPublicClassConstant; - } - } - } elseif ($element instanceof Func) { - if (\strcasecmp($element->getName(), "__autoload") === 0) { - return; - } - if ($element->getFQSEN()->isClosure()) { - if (self::hasSuppressionForUnreferencedClosure($code_base, $element)) { - // $element->getContext() is the context within the closure - We also want to check the context of the function-like outside of the closure(s). - return; - } - $issue_type = Issue::UnreferencedClosure; - } - } elseif ($element instanceof Clazz) { - if ($element->isAnonymous()) { - // This can't be referenced by name in type signatures, etc. - return; - } - } - - - // If we're suppressing this element type being unreferenced, then exit early. - if ($element->checkHasSuppressIssueAndIncrementCount($issue_type)) { - return; - } - - if ($element->getReferenceCount($code_base) >= 1) { - if ($element instanceof Property) { - if (!$element->hasReadReference()) { - self::maybeWarnWriteOnlyProperty($code_base, $element); - } elseif (!$element->hasWriteReference()) { - self::maybeWarnReadOnlyProperty($code_base, $element); - } - } - return; - } - // getReferenceCount === 0 - - $element_alt = self::findAlternateReferencedElementDeclaration($code_base, $element); - if (!\is_null($element_alt)) { - if ($element_alt->getReferenceCount($code_base) >= 1) { - if ($element_alt instanceof Property) { - if (!$element_alt->hasReadReference()) { - self::maybeWarnWriteOnlyProperty($code_base, $element_alt); - } elseif (!($element_alt->hasWriteReference())) { - self::maybeWarnReadOnlyProperty($code_base, $element_alt); - } - } - // If there is a reference to the "canonical" declaration (the one which was parsed first), - // then also treat it as a reference to the duplicate. - return; - } - if ($element_alt->isPHPInternal()) { - // For efficiency, Phan doesn't track references to internal classes. - // Phan already emitted a warning about duplicating an internal class. - return; - } - } - // If there are duplicate declarations, display issues for unreferenced elements on each declaration. - Issue::maybeEmit( - $code_base, - $element->getContext(), - $issue_type, - $element->getFileRef()->getLineNumberStart(), - $element->getRepresentationForIssue() - ); - } - - private static function hasSuppressionForUnreferencedClosure(CodeBase $code_base, Func $func) : bool - { - $context = $func->getContext(); - return $context->withScope($context->getScope()->getParentScope())->hasSuppressIssue($code_base, Issue::UnreferencedClosure); - } - - private static function maybeWarnWriteOnlyProperty(CodeBase $code_base, Property $property) - { - if ($property->isWriteOnly()) { - // Handle annotations such as property-write and phan-write-only - return; - } - if ($property->isFromPHPDoc()) { - $issue_type = Issue::WriteOnlyPHPDocProperty; - } elseif ($property->isPrivate()) { - $issue_type = Issue::WriteOnlyPrivateProperty; - } elseif ($property->isProtected()) { - $issue_type = Issue::WriteOnlyProtectedProperty; - } else { - $issue_type = Issue::WriteOnlyPublicProperty; - } - if ($property->checkHasSuppressIssueAndIncrementCount($issue_type)) { - return; - } - $property_alt = self::findAlternateReferencedElementDeclaration($code_base, $property); - if ($property_alt instanceof Property) { - if ($property_alt->hasReadReference()) { - return; - } - } - Issue::maybeEmit( - $code_base, - $property->getContext(), - $issue_type, - $property->getFileRef()->getLineNumberStart(), - $property->getRepresentationForIssue() - ); - } - - private static function maybeWarnReadOnlyProperty(CodeBase $code_base, Property $property) - { - if ($property->isReadOnly()) { - // Handle annotations such as property-read and phan-read-only. - return; - } - if ($property->isFromPHPDoc()) { - $issue_type = Issue::ReadOnlyPHPDocProperty; - } elseif ($property->isPrivate()) { - $issue_type = Issue::ReadOnlyPrivateProperty; - } elseif ($property->isProtected()) { - $issue_type = Issue::ReadOnlyProtectedProperty; - } else { - $issue_type = Issue::ReadOnlyPublicProperty; - } - if ($property->checkHasSuppressIssueAndIncrementCount($issue_type)) { - return; - } - $property_alt = self::findAlternateReferencedElementDeclaration($code_base, $property); - if ($property_alt instanceof Property) { - if ($property_alt->hasWriteReference()) { - return; - } - } - // echo "known references to $property: " . implode(array_map('strval', $property->getReferenceList())) . "\n"; - Issue::maybeEmit( - $code_base, - $property->getContext(), - $issue_type, - $property->getFileRef()->getLineNumberStart(), - $property->getRepresentationForIssue() - ); - } - - /** - * Find Elements with FQSENs that are the same as $element's FQSEN, - * apart from the alternate id. - * (i.e. duplicate declarations) - * @return ?AddressableElement - */ - public static function findAlternateReferencedElementDeclaration( - CodeBase $code_base, - AddressableElement $element - ) { - $old_fqsen = $element->getFQSEN(); - if ($old_fqsen instanceof FullyQualifiedGlobalStructuralElement) { - $fqsen = $old_fqsen->getCanonicalFQSEN(); - if ($fqsen === $old_fqsen) { - return null; // $old_fqsen was not an alternative - } - if ($fqsen instanceof FullyQualifiedFunctionName) { - if ($code_base->hasFunctionWithFQSEN($fqsen)) { - return $code_base->getFunctionByFQSEN($fqsen); - } - return null; - } elseif ($fqsen instanceof FullyQualifiedClassName) { - if ($code_base->hasClassWithFQSEN($fqsen)) { - return $code_base->getClassByFQSEN($fqsen); - } - return null; - } elseif ($fqsen instanceof FullyQualifiedGlobalConstantName) { - if ($code_base->hasGlobalConstantWithFQSEN($fqsen)) { - return $code_base->getGlobalConstantByFQSEN($fqsen); - } - return null; - } - } elseif ($old_fqsen instanceof FullyQualifiedClassElement) { - // If this needed to be more thorough, - // the code adding references could treat uses from within the classes differently from outside. - $fqsen = $old_fqsen->getCanonicalFQSEN(); - if ($fqsen === $old_fqsen) { - return null; // $old_fqsen was not an alternative - } - - if ($fqsen instanceof FullyQualifiedMethodName) { - if ($code_base->hasMethodWithFQSEN($fqsen)) { - return $code_base->getMethodByFQSEN($fqsen); - } - return null; - } elseif ($fqsen instanceof FullyQualifiedPropertyName) { - if ($code_base->hasPropertyWithFQSEN($fqsen)) { - return $code_base->getPropertyByFQSEN($fqsen); - } - return null; - } elseif ($fqsen instanceof FullyQualifiedClassConstantName) { - if ($code_base->hasClassConstantWithFQSEN($fqsen)) { - return $code_base->getClassConstantByFQSEN($fqsen); - } - return null; - } - } - return null; - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/RegexAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/RegexAnalyzer.php deleted file mode 100644 index 8f87ccb..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/RegexAnalyzer.php +++ /dev/null @@ -1,130 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use ast\Node; -use InvalidArgumentException; -use Phan\AST\ContextNode; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Type\ArrayShapeType; -use Phan\Language\Type\GenericArrayType; -use Phan\Language\UnionType; -use Phan\Library\RegexKeyExtractor; - -/** - * This infers the union type of $matches in preg_match, - * including the number of potential groups if that can be inferred. - * - * @see PregRegexPlugin for the plugin that actually emits warnings about invalid regexes - */ -class RegexAnalyzer -{ - /** - * Returns the union type of the matches output parameter in a call to `preg_match()` - * with the nodes in $argument_list. - * - * @param array<int,Node|string|float|int> $argument_list - */ - public static function getPregMatchUnionType( - CodeBase $code_base, - Context $context, - array $argument_list - ) : UnionType { - static $string_array_type = null; - static $string_type = null; - static $array_type = null; - static $shape_array_type = null; - static $shape_array_inner_type = null; - if ($string_array_type === null) { - // Note: Patterns **can** have named subpatterns - $string_array_type = UnionType::fromFullyQualifiedString('string[]'); - $string_type = UnionType::fromFullyQualifiedString('string'); - $array_type = UnionType::fromFullyQualifiedString('array'); - $shape_array_type = UnionType::fromFullyQualifiedString('array{0:string,1:int}[]'); - $shape_array_inner_type = UnionType::fromFullyQualifiedString('array{0:string,1:int}'); - } - $regex_node = $argument_list[0]; - $regex = $regex_node instanceof Node ? (new ContextNode($code_base, $context, $regex_node))->getEquivalentPHPScalarValue() : $regex_node; - try { - $regex_group_keys = RegexKeyExtractor::getKeys($regex); - } catch (InvalidArgumentException $_) { - $regex_group_keys = null; - } - if (\count($argument_list) > 3) { - $offset_flags_node = $argument_list[3]; - $bit = (new ContextNode($code_base, $context, $offset_flags_node))->getEquivalentPHPScalarValue(); - } else { - $bit = 0; - } - - if (!\is_int($bit)) { - // @phan-suppress-next-line PhanTypeMismatchReturnNullable false positive for static init - return $array_type; - } - // TODO: Support PREG_UNMATCHED_AS_NULL - if ($bit & \PREG_OFFSET_CAPTURE) { - if (\is_array($regex_group_keys)) { - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable false positive for static init - return self::makeArrayShape($regex_group_keys, $shape_array_inner_type); - } - // @phan-suppress-next-line PhanTypeMismatchReturnNullable false positive for static init - return $shape_array_type; - } - - if (\is_array($regex_group_keys)) { - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable false positive for static init - return self::makeArrayShape($regex_group_keys, $string_type); - } - // @phan-suppress-next-line PhanTypeMismatchReturnNullable false positive for static init - return $string_array_type; - } - - /** - * Returns the union type of the matches output parameter in a call to `preg_match_all()` - * with the nodes in $argument_list. - * - * @param array<int,Node|string|float|int> $argument_list - */ - public static function getPregMatchAllUnionType( - CodeBase $code_base, - Context $context, - array $argument_list - ) : UnionType { - if (\count($argument_list) > 3) { - $offset_flags_node = $argument_list[3]; - $bit = (new ContextNode($code_base, $context, $offset_flags_node))->getEquivalentPHPScalarValue(); - } else { - $bit = 0; - } - - if (!\is_int($bit)) { - return UnionType::fromFullyQualifiedString('array[]'); - } - - $shape_array_type = self::getPregMatchUnionType($code_base, $context, $argument_list); - if ($bit & \PREG_SET_ORDER) { - return $shape_array_type->asGenericArrayTypes(GenericArrayType::KEY_INT); - } - return $shape_array_type->withMappedElementTypes(static function (UnionType $type) : UnionType { - return $type->elementTypesToGenericArray(GenericArrayType::KEY_INT); - }); - } - - /** - * @param array<int|string,true> $regex_group_keys - */ - private static function makeArrayShape( - array $regex_group_keys, - UnionType $type - ) : UnionType { - $field_types = \array_map( - /** @param true $_ */ - static function ($_) use ($type) : UnionType { - return $type; - }, - $regex_group_keys - ); - return ArrayShapeType::fromFieldTypes($field_types, false)->asUnionType(); - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ScopeVisitor.php b/vendor/phan/phan/src/Phan/Analysis/ScopeVisitor.php deleted file mode 100644 index 4cb18d1..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ScopeVisitor.php +++ /dev/null @@ -1,322 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use AssertionError; -use ast; -use ast\Node; -use Phan\AST\AnalysisVisitor; -use Phan\Config; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\FQSEN; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedGlobalConstantName; -use Phan\Language\FQSEN\FullyQualifiedGlobalStructuralElement; -use function implode; -use function rtrim; - -/** - * An abstract visitor with methods to track elements in the current scope. - * - * This tracks the current namespace and adds namespace and `use` information to the current scope. - * - * @phan-file-suppress PhanPartialTypeMismatchArgument - * @phan-file-suppress PhanPartialTypeMismatchArgumentInternal - */ -abstract class ScopeVisitor extends AnalysisVisitor -{ - - /** - * @param CodeBase $code_base - * The global code base holding all state - * - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - */ - /* - public function __construct( - CodeBase $code_base, - Context $context - ) { - parent::__construct($code_base, $context); - } - */ - - /** - * Default visitor for node kinds that do not have - * an overriding method - * - * @param Node $node @phan-unused-param - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visit(Node $node) : Context - { - // Many nodes don't change the context and we - // don't need to read them. - return $this->context; - } - - /** - * Visit a node with kind `\ast\AST_DECLARE` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitDeclare(Node $node) : Context - { - $declares = $node->children['declares']; - $context = $this->context; - foreach ($declares->children as $elem) { - $name = $elem->children['name']; - $value = $elem->children['value']; - if ('strict_types' === $name && \is_int($value)) { - $context = $context->withStrictTypes($value); - } - } - - return $context; - } - - /** - * Visit a node with kind `\ast\AST_NAMESPACE` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new context resulting from parsing the node - */ - public function visitNamespace(Node $node) : Context - { - $namespace = '\\' . (string)$node->children['name']; - return $this->context->withNamespace($namespace); - } - - /** - * Visit a node with kind `\ast\AST_GROUP_USE` - * such as `use \ast\Node;`. - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitGroupUse(Node $node) : Context - { - $children = $node->children; - - $prefix = \array_shift($children); - - $context = $this->context; - - $alias_target_map = self::aliasTargetMapFromUseNode( - $children['uses'], - $prefix, - $node->flags ?? 0 - ); - foreach ($alias_target_map as $alias => list($flags, $target, $lineno)) { - $context = $context->withNamespaceMap( - $flags, - $alias, - $target, - $lineno - ); - } - - return $context; - } - - /** - * Visit a node with kind `\ast\AST_USE` - * such as `use \ast\Node;`. - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitUse(Node $node) : Context - { - $context = $this->context; - $target_php_version = Config::get_closest_target_php_version_id(); - - foreach (self::aliasTargetMapFromUseNode($node) as $alias => list($flags, $target, $lineno)) { - $flags = $node->flags ?: $flags; - if ($flags === \ast\flags\USE_NORMAL && $target_php_version < 70200) { - self::analyzeUseElemCompatibility($alias, $target, $target_php_version, $lineno); - } - if (\strcasecmp($target->getNamespace(), $context->getNamespace()) === 0) { - $this->maybeWarnSameNamespaceUse($alias, $target, $flags, $lineno); - } - $context = $context->withNamespaceMap( - $flags, - $alias, - $target, - $lineno - ); - } - - return $context; - } - - private function maybeWarnSameNamespaceUse(string $alias, FullyQualifiedGlobalStructuralElement $target, int $flags, int $lineno) - { - if (\strcasecmp($alias, $target->getName()) !== 0) { - return; - } - if ($flags === ast\flags\USE_FUNCTION) { - if ($target->getNamespace() !== '\\') { - return; - } - $issue_type = Issue::UseFunctionNoEffect; - } elseif ($flags === ast\flags\USE_CONST) { - if ($target->getNamespace() !== '\\') { - return; - } - $issue_type = Issue::UseConstantNoEffect; - } else { - if ($target->getNamespace() !== '\\') { - if (!Config::getValue('warn_about_relative_include_statement')) { - return; - } - $issue_type = Issue::UseNormalNamespacedNoEffect; - } else { - $issue_type = Issue::UseNormalNoEffect; - } - } - $this->emitIssue( - $issue_type, - $lineno, - $target - ); - } - - /** @return void */ - private function analyzeUseElemCompatibility( - string $alias, - FQSEN $target, - int $target_php_version, - int $lineno - ) { - $alias_lower = \strtolower($alias); - if ($target_php_version < 70100) { - if ($alias_lower === 'void') { - Issue::maybeEmit( - $this->code_base, - $this->context, - Issue::CompatibleUseVoidPHP70, - $lineno, - $target - ); - return; - } - } - if ($alias_lower === 'iterable' || $alias === 'object') { - Issue::maybeEmit( - $this->code_base, - $this->context, - $alias_lower === 'iterable' ? Issue::CompatibleUseIterablePHP71 : Issue::CompatibleUseObjectPHP71, - $lineno, - $target - ); - } - } - - /** - * @param Node $node - * The node with the use statement - * - * @param int $flags - * An optional node flag specifying the type - * of the use clause. - * - * @return array<string,array{0:int,1:FullyQualifiedGlobalStructuralElement,2:int}> - * A map from alias to target - * - * @suppress PhanPartialTypeMismatchReturn TODO: investigate - * @suppress PhanPossiblyFalseTypeArgument - * @suppress PhanThrowTypeAbsentForCall - */ - public static function aliasTargetMapFromUseNode( - Node $node, - string $prefix = '', - int $flags = 0 - ) : array { - if ($node->kind !== \ast\AST_USE) { - throw new AssertionError('Method takes AST_USE nodes'); - } - - $map = []; - foreach ($node->children as $child_node) { - $target = $child_node->children['name']; - - if (isset($child_node->children['alias'])) { - $alias = $child_node->children['alias']; - } else { - if (($pos = \strrpos($target, '\\')) !== false) { - $alias = \substr($target, $pos + 1); - } else { - $alias = $target; - } - } - if (!\is_string($alias)) { - // Should be impossible - continue; - } - - // if AST_USE does not have any flags set, then its AST_USE_ELEM - // children will (this will be for AST_GROUP_USE) - - // The 'use' type can be defined on the `AST_GROUP_USE` node, the - // `AST_USE_ELEM` or on the child element. - $use_flag = $flags ?: $node->flags ?: $child_node->flags; - - if ($use_flag === \ast\flags\USE_FUNCTION) { - $parts = \explode('\\', $target); - $function_name = \array_pop($parts); - $target = FullyQualifiedFunctionName::make( - rtrim($prefix, '\\') . '\\' . implode('\\', $parts), - $function_name - ); - } elseif ($use_flag === \ast\flags\USE_CONST) { - $parts = \explode('\\', $target); - $name = \array_pop($parts); - $target = FullyQualifiedGlobalConstantName::make( - rtrim($prefix, '\\') . '\\' . implode('\\', $parts), - $name - ); - } elseif ($use_flag === \ast\flags\USE_NORMAL) { - $target = FullyQualifiedClassName::fromFullyQualifiedString( - rtrim($prefix, '\\') . '\\' . $target - ); - } else { - // If we get to this spot and don't know what - // kind of a use clause we're dealing with, its - // likely that this is a `USE` node which is - // a child of a `GROUP_USE` and we already - // handled it when analyzing the parent - // node. - continue; - } - - $map[$alias] = [$use_flag, $target, $child_node->lineno]; - } - - return $map; - } -} diff --git a/vendor/phan/phan/src/Phan/Analysis/ThrowsTypesAnalyzer.php b/vendor/phan/phan/src/Phan/Analysis/ThrowsTypesAnalyzer.php deleted file mode 100644 index 8f9f4e5..0000000 --- a/vendor/phan/phan/src/Phan/Analysis/ThrowsTypesAnalyzer.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Analysis; - -use Phan\CodeBase; -use Phan\Exception\RecursionDepthException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Method; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type; -use Phan\Language\Type\ObjectType; -use Phan\Language\Type\TemplateType; -use Phan\Suggestion; - -/** - * An analyzer that checks method phpdoc (at)throws types of function-likes to make sure they're valid - */ -class ThrowsTypesAnalyzer -{ - - /** - * Check phpdoc (at)throws types of function-likes to make sure they're valid - * - * @return void - */ - public static function analyzeThrowsTypes( - CodeBase $code_base, - FunctionInterface $method - ) { - try { - foreach ($method->getThrowsUnionType()->getTypeSet() as $type) { - // TODO: When analyzing the method body, only check the valid exceptions - self::analyzeSingleThrowType($code_base, $method, $type); - } - } catch (RecursionDepthException $_) { - } - } - - /** - * Check a throw type to make sure it's valid - * - * @return bool - True if the type can be thrown - */ - private static function analyzeSingleThrowType( - CodeBase $code_base, - FunctionInterface $method, - Type $type - ) { - /** - * @param array<int,int|string|Type> $args - */ - $maybe_emit_for_method = static function (string $issue_type, array $args, Suggestion $suggestion = null) use ($code_base, $method) { - Issue::maybeEmitWithParameters( - $code_base, - $method->getContext(), - $issue_type, - $method->getContext()->getLineNumberStart(), - $args, - $suggestion - ); - }; - if (!$type->isObject()) { - $maybe_emit_for_method( - Issue::TypeInvalidThrowsNonObject, - [$method->getName(), (string)$type] - ); - return false; - } - if ($type instanceof TemplateType) { - // TODO: Add unit tests of templates for return types and checks. - // E.g. should warn if passing in something that can't cast to throwable - if ($method instanceof Method && $method->isStatic() && !$method->declaresTemplateTypeInComment($type)) { - $maybe_emit_for_method( - Issue::TemplateTypeStaticMethod, - [(string)$method->getFQSEN()] - ); - } - return false; - } - if ($type instanceof ObjectType) { - // (at)throws object is valid and should be treated like Throwable - // NOTE: catch (object $o) does nothing in php 7.2. - return true; - } - static $throwable; - if ($throwable === null) { - $throwable = Type::throwableInstance(); - } - if ($type === $throwable) { - // allow (at)throws Throwable. - return true; - } - - $type_fqsen = FullyQualifiedClassName::fromType($type); - if (!$code_base->hasClassWithFQSEN($type_fqsen)) { - $maybe_emit_for_method( - Issue::UndeclaredTypeThrowsType, - [$method->getName(), $type], - self::suggestSimilarClassForThrownClass($code_base, $method->getContext(), $type_fqsen) - ); - return false; - } - $exception_class = $code_base->getClassByFQSEN($type_fqsen); - if ($exception_class->isTrait() || $exception_class->isInterface()) { - $maybe_emit_for_method( - $exception_class->isTrait() ? Issue::TypeInvalidThrowsIsTrait : Issue::TypeInvalidThrowsIsInterface, - [$method->getName(), $type], - self::suggestSimilarClassForThrownClass($code_base, $method->getContext(), $type_fqsen) - ); - return $exception_class->isInterface(); - } - - if (!($type->asExpandedTypes($code_base)->hasType($throwable))) { - $maybe_emit_for_method( - Issue::TypeInvalidThrowsNonThrowable, - [$method->getName(), $type], - self::suggestSimilarClassForThrownClass($code_base, $method->getContext(), $type_fqsen) - ); - } - return true; - } - - /** - * @return ?Suggestion - */ - protected static function suggestSimilarClassForThrownClass( - CodeBase $code_base, - Context $context, - FullyQualifiedClassName $type_fqsen - ) { - return IssueFixSuggester::suggestSimilarClass( - $code_base, - $context, - $type_fqsen, - IssueFixSuggester::createFQSENFilterFromClassFilter($code_base, static function (Clazz $class) use ($code_base) : bool { - if ($class->isTrait()) { - return false; - } - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - return $class->getFQSEN()->asType()->asExpandedTypes($code_base)->hasType(Type::throwableInstance()); - }) - ); - } -} diff --git a/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php b/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php deleted file mode 100644 index e0cbed1..0000000 --- a/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php +++ /dev/null @@ -1,1685 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use AssertionError; -use ast; -use ast\Node; -use Closure; -use Phan\Analysis\BlockExitStatusChecker; -use Phan\Analysis\ConditionVisitor; -use Phan\Analysis\ContextMergeVisitor; -use Phan\Analysis\NegatedConditionVisitor; -use Phan\Analysis\PostOrderAnalysisVisitor; -use Phan\Analysis\PreOrderAnalysisVisitor; -use Phan\AST\AnalysisVisitor; -use Phan\AST\UnionTypeVisitor; -use Phan\AST\Visitor\Element; -use Phan\Exception\IssueException; -use Phan\Language\Context; -use Phan\Language\Element\Comment\Builder; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedPropertyName; -use Phan\Language\Scope\BranchScope; -use Phan\Language\Scope\GlobalScope; -use Phan\Language\Scope\PropertyScope; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Library\StringUtil; -use Phan\Plugin\ConfigPluginSet; - -use function array_map; -use function count; -use function end; -use function explode; -use function preg_match; -use function rtrim; - -/** - * Analyze blocks of code - * - * - Uses `\Phan\Analysis\PreOrderAnalysisVisitor` for pre-order analysis of a node (E.g. entering a function to analyze) - * - Recursively analyzes child nodes - * - Uses `\Phan\Analysis\PostOrderAnalysisVisitor` for post-order analysis of a node (E.g. analyzing a statement with the updated Context and emitting issues) - * - If there is more than one possible child context, merges state from them (variable types) - * - * @see self::visit() - * - * @phan-file-suppress PhanPartialTypeMismatchArgument - */ -class BlockAnalysisVisitor extends AnalysisVisitor -{ - - /** - * @var Node[] - * The parent of the current node - */ - private $parent_node_list = []; - - /** - * @param CodeBase $code_base - * The code base within which we're operating - * - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - * - * @param ?Node $parent_node - * The parent of the node being analyzed - */ - public function __construct( - CodeBase $code_base, - Context $context, - Node $parent_node = null - ) { - parent::__construct($code_base, $context); - if ($parent_node) { - $this->parent_node_list[] = $parent_node; - } - } - - // No-ops for frequent node types - public function visitVar(Node $node) : Context - { - $context = $this->context->withLineNumberStart( - $node->lineno - ); - - // Let any configured plugins do a pre-order - // analysis of the node. - ConfigPluginSet::instance()->preAnalyzeNode( - $this->code_base, - $context, - $node - ); - - // With a context that is inside of the node passed - // to this method, we analyze all children of the - // node. - $name_node = $node->children['name']; - // E.g. ${expr()} is valid PHP. Recurse if that's a node. - if ($name_node instanceof Node) { - // Step into each child node and get an - // updated context for the node - $context = $this->analyzeAndGetUpdatedContext($context, $node, $name_node); - } - - $context = $this->postOrderAnalyze($context, $node); - - return $context; - } - - /** - * @param Node $node @phan-unused-param this was analyzed in visitUse - */ - public function visitUseElem(Node $node) : Context - { - // Could invoke plugins, but not right now - return $this->context; - } - - /** - * Analyzes a namespace block or statement (e.g. `namespace NS\SubNS;` or `namespace OtherNS { ... }`) - * @param Node $node a node of type AST_NAMESPACE - */ - public function visitNamespace(Node $node) : Context - { - $context = $this->context->withLineNumberStart( - $node->lineno - ); - - // If there are multiple namespaces in the file, have to warn about unused entries in the current namespace first. - // If this is the first namespace, then there wouldn't be any use statements yet. - // TODO: This may not be the case if the language server is used - // @phan-suppress-next-line PhanAccessMethodInternal - $context->warnAboutUnusedUseElements($this->code_base); - - // Visit the given node populating the code base - // with anything we learn and get a new context - // indicating the state of the world within the - // given node - $context = (new PreOrderAnalysisVisitor( - $this->code_base, - $context - ))->visitNamespace($node); - - // We already imported namespace constants earlier; use those. - // @phan-suppress-next-line PhanAccessMethodInternal - $context->importNamespaceMapFromParsePhase($this->code_base); - - // Let any configured plugins do a pre-order - // analysis of the node. - ConfigPluginSet::instance()->preAnalyzeNode( - $this->code_base, - $context, - $node - ); - - // The namespace may either have a list of statements (`namespace Foo {}`) - // or be null (`namespace Foo;`) - $stmts_node = $node->children['stmts']; - if ($stmts_node instanceof Node) { - $context = $this->analyzeAndGetUpdatedContext($context, $node, $stmts_node); - } - - return $this->postOrderAnalyze($context, $node); - } - - /** - * Analyzes a node with type AST_NAME (Relative or fully qualified name) - */ - public function visitName(Node $node) : Context - { - $context = $this->context; - // Only invoke post-order plugins, needed for NodeSelectionPlugin. - // PostOrderAnalysisVisitor and PreOrderAnalysisVisitor don't do anything. - // Optimized because this is frequently called - ConfigPluginSet::instance()->postAnalyzeNode( - $this->code_base, - $context, - $node, - $this->parent_node_list - ); - return $context; - } - - /** - * For non-special nodes such as statement lists (AST_STMT_LIST), - * we propagate the context and scope from the parent, - * through the individual statements, and return a Context with the modified scope. - * - * │ - * ▼ - * ┌──● - * │ - * ●──●──● - * │ - * ●──┘ - * │ - * ▼ - */ - public function visitStmtList(Node $node) : Context - { - $context = $this->context; - $plugin_set = ConfigPluginSet::instance(); - $plugin_set->preAnalyzeNode( - $this->code_base, - $context, - $node - ); - foreach ($node->children as $child_node) { - // Skip any non Node children. - if (!($child_node instanceof Node)) { - $this->handleScalarStmt($node, $context, $child_node); - continue; - } - $context->clearCachedUnionTypes(); - - // Step into each child node and get an - // updated context for the node - try { - $context = $this->analyzeAndGetUpdatedContext($context, $node, $child_node); - } catch (IssueException $e) { - // This is a fallback - Exceptions should be caught at a deeper level if possible - Issue::maybeEmitInstance($this->code_base, $context, $e->getIssueInstance()); - } - } - $plugin_set->postAnalyzeNode( - $this->code_base, - $context, - $node, - $this->parent_node_list - ); - return $context; - } - - /** - * @param Node $node - * @param Context $context - * @param int|float|string|null $child_node (probably not null) - * @return void - */ - private function handleScalarStmt(Node $node, Context $context, $child_node) - { - if (\is_string($child_node)) { - if (\strpos($child_node, '@phan-') !== false) { - // Add @phan-var and @phan-suppress annotations in string literals to the local scope - $this->analyzeSubstituteVarAssert($this->code_base, $context, $child_node); - } else { - Issue::maybeEmit( - $this->code_base, - $context, - Issue::NoopStringLiteral, - $context->getLineNumberStart() ?: $this->getLineNumberOfParent() ?: $node->lineno, - StringUtil::jsonEncode($child_node) - ); - } - } elseif (\is_scalar($child_node)) { - Issue::maybeEmit( - $this->code_base, - $context, - Issue::NoopNumericLiteral, - $context->getLineNumberStart() ?: $this->getLineNumberOfParent() ?: $node->lineno, - \var_export($child_node, true) - ); - } - } - - private function getLineNumberOfParent() : int - { - $parent = end($this->parent_node_list); - if (!($parent instanceof Node)) { - return 0; - } - return $parent->lineno; - } - - const PHAN_FILE_SUPPRESS_REGEX = - '/@phan-file-suppress\s+' . Builder::SUPPRESS_ISSUE_LIST . '/'; // @phan-suppress-current-line PhanAccessClassConstantInternal - - - const PHAN_VAR_REGEX = - '/@(phan-var(?:-force)?)\b\s*(' . UnionType::union_type_regex . ')\s*&?\\$' . Builder::WORD_REGEX . '/'; - // @phan-suppress-previous-line PhanAccessClassConstantInternal - - /** - * Parses annotations such as "(at)phan-var int $myVar" and "(at)phan-var-force ?MyClass $varName" annotations from inline string literals. - * (php-ast isn't able to parse inline doc comments, so string literals are used for rare edge cases where assert/if statements don't work) - * - * Modifies the type of the variable (in the scope of $context) to be identical to the annotated union type. - * @return void - */ - private function analyzeSubstituteVarAssert(CodeBase $code_base, Context $context, string $text) - { - $has_known_annotations = false; - if (\preg_match_all(self::PHAN_VAR_REGEX, $text, $matches, \PREG_SET_ORDER) > 0) { - $has_known_annotations = true; - foreach ($matches as $group) { - $annotation_name = $group[1]; - $type_string = $group[2]; - $var_name = $group[16]; - $type = UnionType::fromStringInContext($type_string, $context, Type::FROM_PHPDOC); - self::createVarForInlineComment($code_base, $context, $var_name, $type, $annotation_name === 'phan-var-force'); - } - } - - if (\preg_match_all(self::PHAN_FILE_SUPPRESS_REGEX, $text, $matches, \PREG_SET_ORDER) > 0) { - $has_known_annotations = true; - if (!Config::getValue('disable_file_based_suppression')) { - foreach ($matches as $group) { - $issue_name_list = $group[1]; - foreach (array_map('trim', explode(',', $issue_name_list)) as $issue_name) { - $code_base->addFileLevelSuppression($context->getFile(), $issue_name); - } - } - } - } - - if (!$has_known_annotations && preg_match('/@phan-.*/', $text, $match) > 0) { - Issue::maybeEmit( - $code_base, - $context, - Issue::UnextractableAnnotation, - $context->getLineNumberStart(), - rtrim($match[0]) - ); - } - return; - } - - /** - * @return void - * @see ConditionVarUtil::getVariableFromScope() - */ - private static function createVarForInlineComment(CodeBase $code_base, Context $context, string $var_name, UnionType $type, bool $create_variable) - { - if (!$context->getScope()->hasVariableWithName($var_name)) { - if (Variable::isHardcodedVariableInScopeWithName($var_name, $context->isInGlobalScope())) { - return; - } - if (!$create_variable && !($context->isInGlobalScope() && Config::getValue('ignore_undeclared_variables_in_global_scope'))) { - Issue::maybeEmitWithParameters( - $code_base, - $context, - Issue::UndeclaredVariable, - $context->getLineNumberStart(), - [$var_name], - IssueFixSuggester::suggestVariableTypoFix($code_base, $context, $var_name) - ); - return; - } - $variable = new Variable( - $context, - $var_name, - $type, - 0 - ); - $context->addScopeVariable($variable); - return; - } - $variable = clone($context->getScope()->getVariableByName( - $var_name - )); - $variable->setUnionType($type); - $context->addScopeVariable($variable); - } - - /** - * For non-special nodes, we propagate the context and scope - * from the parent, through the children and return the - * modified scope, - * - * │ - * ▼ - * ┌──● - * │ - * ●──●──● - * │ - * ●──┘ - * │ - * ▼ - * - * @param Node $node - * An AST node we'd like to analyze the statements for - * - * @return Context - * The updated context after visiting the node - */ - public function visit(Node $node) : Context - { - $context = $this->context; - $context->setLineNumberStart($node->lineno); - - // Visit the given node populating the code base - // with anything we learn and get a new context - // indicating the state of the world within the - // given node - $context = (new PreOrderAnalysisVisitor( - $this->code_base, - $context - ))->{Element::VISIT_LOOKUP_TABLE[$node->kind] ?? 'handleMissingNodeKind'}($node); - - // Let any configured plugins do a pre-order - // analysis of the node. - ConfigPluginSet::instance()->preAnalyzeNode( - $this->code_base, - $context, - $node - ); - - // With a context that is inside of the node passed - // to this method, we analyze all children of the - // node. - foreach ($node->children as $child_node) { - // Skip any non Node children. - if (!($child_node instanceof Node)) { - continue; - } - - // Step into each child node and get an - // updated context for the node - $context = $this->analyzeAndGetUpdatedContext($context, $node, $child_node); - } - - return $this->postOrderAnalyze($context, $node); - } - - /** - * This is an abstraction for getting a new, updated context for a child node. - * - * Effectively the same as (new BlockAnalysisVisitor(..., $context, $node, ...)child_node)) - * but is much less repetitive and verbose, and slightly more efficient. - * - * NOTE: This is called extremely frequently, so the real signature types were omitted for performance. - * - * @param Context $context - The original context for $node, before analyzing $child_node - * - * @param Node $node - The parent node of $child_node - * - * @param Node $child_node - The node which will be analyzed to create the updated context. - * - * @return Context (The unmodified $context, or a different Context instance with modifications) - */ - private function analyzeAndGetUpdatedContext($context, $node, $child_node) - { - // Modify the original object instead of creating a new BlockAnalysisVisitor. - // this is slightly more efficient, especially if a large number of unchanged parameters would exist. - $old_context = $this->context; - $this->context = $context; - $this->parent_node_list[] = $node; - try { - return $this->{Element::VISIT_LOOKUP_TABLE[$child_node->kind] ?? 'handleMissingNodeKind'}($child_node); - } finally { - $this->context = $old_context; - \array_pop($this->parent_node_list); - } - } - - /** - * For "for loop" nodes, we analyze the components in the following order as a heuristic: - * - * 1. propagate the context and scope from the parent, - * 2. Update the scope with the initializer of the loop, - * 3. Update the scope with the side effects (e.g. assignments) of the condition of the loop - * 4. Update the scope with the child statements both inside and outside the loop (ignoring branches which will continue/break), - * 5. Update the scope with the statement evaluated after the loop - * - * Then, Phan returns the context with the modified scope. - * - * TODO: merge the contexts together, for better analysis of possibly undefined variables - * - * │ - * cond ▼ - * ●──────●────● init - * │ - * │ (TODO: merge contexts instead) - * ●──●──▶● - * stmts │ - * │ - * ● 'loop' child node (after inner statements) - * │ - * ▼ - * - * Note: Loop analysis uses heuristics for performance and simplicity. - * If we analyzed the stmts of the inner loop body another time, - * we might discover even more possible types of input/resulting variables. - * - * Current limitations: - * - * - contexts from individual break/continue stmts aren't merged - * - contexts from individual break/continue stmts aren't merged - * - * @param Node $node - * An AST node (for a for loop) we'd like to analyze the statements for - * - * @return Context - * The updated context after visiting the node - */ - public function visitFor(Node $node) : Context - { - $context = $this->context->withLineNumberStart( - $node->lineno - ); - - $init_node = $node->children['init']; - if ($init_node instanceof Node) { - $context = $this->analyzeAndGetUpdatedContext( - $context->withLineNumberStart($init_node->lineno), - $node, - $init_node - ); - } - - $condition_node = $node->children['cond']; - if ($condition_node instanceof Node) { - // The typical case is `for (init; $x; loop) {}` - // But `for (init; $x, $y; loop) {}` is rare but possible, which requires evaluating those in order. - // Evaluate the list of cond expressions in order. - foreach ($condition_node->children as $condition_subnode) { - if ($condition_subnode instanceof Node) { - $context = $this->analyzeAndGetUpdatedContext( - $context->withLineNumberStart($condition_subnode->lineno), - $node, // TODO: condition_node? - $condition_subnode - ); - } - } - } - - if ($stmts_node = $node->children['stmts']) { - // Look to see if any proofs we do within the condition of the for - // can say anything about types within the statement - // list. - // TODO: Distinguish between inner and outer context. - // E.g. `for (; $x = cond(); ) {}` will have truthy $x within the loop - // but falsey outside the loop, if there are no breaks. - if ($condition_node instanceof Node) { - $context = (new ConditionVisitor( - $this->code_base, - $context - ))->__invoke($condition_node); - } - if ($stmts_node instanceof Node) { - $context = $this->analyzeAndGetUpdatedContext( - $context->withScope( - new BranchScope($context->getScope()) - )->withLineNumberStart($stmts_node->lineno), - $node, - $stmts_node - ); - } - } - // Analyze the loop after analyzing the statements, in case it uses variables defined within the statements. - $loop_node = $node->children['loop']; - if ($loop_node instanceof Node) { - $context = $this->analyzeAndGetUpdatedContext( - $context->withLineNumberStart($loop_node->lineno), - $node, - $loop_node - ); - } - - // Now that we know all about our context (like what - // 'self' means), we can analyze statements like - // assignments and method calls. - $context = $this->postOrderAnalyze($context, $node); - - // When coming out of a scoped element, we pop the - // context to be the incoming context. Otherwise, - // we pass our new context up to our parent - return $context; - } - - /** - * For "while loop" nodes, we analyze the components in the following order as a heuristic: - * (This is pretty much the same as analyzing a for loop with the 'init' and 'loop' nodes left blank) - * - * 1. propagate the context and scope from the parent, - * 2. Update the scope with the side effects (e.g. assignments) of the condition of the loop - * 3. Update the scope with the child statements both inside and outside the loop (ignoring branches which will continue/break), - * - * Then, Phan returns the context with the modified scope. - * - * TODO: merge the contexts together, for better analysis of possibly undefined variables - * - * NOTE: "Do while" loops are just handled by visit(), Phan sees and analyzes 'stmts' before 'cond'. - * - * - * │ - * ▼ - * ●──────● cond - * │ - * │ (TODO: merge contexts instead) - * ●──●──▶● - * stmts │ - * │ - * │ - * │ - * ▼ - * - * @param Node $node - * An AST node (for a while loop) we'd like to analyze the statements for - * - * @return Context - * The updated context after visiting the node - */ - public function visitWhile(Node $node) : Context - { - $context = $this->context->withLineNumberStart( - $node->lineno - ); - - // Let any configured plugins do a pre-order - // analysis of the node. - ConfigPluginSet::instance()->preAnalyzeNode( - $this->code_base, - $context, - $node - ); - - $condition_node = $node->children['cond']; - if ($condition_node instanceof Node) { - // Analyze the cond expression. - $context = $this->analyzeAndGetUpdatedContext( - $context->withLineNumberStart($condition_node->lineno), - $node, - $condition_node - ); - } - - if ($stmts_node = $node->children['stmts']) { - // Look to see if any proofs we do within the condition of the while - // can say anything about types within the statement - // list. - // TODO: Distinguish between inner and outer context. - // E.g. `while ($x = cond()) {}` will have truthy $x within the loop - // but falsey outside the loop, if there are no breaks. - if ($condition_node instanceof Node) { - $context = (new ConditionVisitor( - $this->code_base, - $this->context - ))->__invoke($condition_node); - } - - if ($stmts_node instanceof Node) { - $context = $this->analyzeAndGetUpdatedContext( - $context->withScope( - new BranchScope($context->getScope()) - )->withLineNumberStart($stmts_node->lineno), - $node, - $stmts_node - ); - } - } - - // Now that we know all about our context (like what - // 'self' means), we can analyze statements like - // assignments and method calls. - $context = $this->postOrderAnalyze($context, $node); - - // When coming out of a scoped element, we pop the - // context to be the incoming context. Otherwise, - // we pass our new context up to our parent - return $context; - } - - /** - * @param Node $node - * An AST node we'd like to analyze the statements for - * - * @return Context - * The updated context after visiting the node - */ - public function visitIfElem(Node $node) : Context - { - $context = $this->context->withLineNumberStart( - $node->lineno - ); - - // NOTE: This is different from other analysis visitors because analyzing 'cond' with `||` has side effects - // after supporting `BlockAnalysisVisitor->visitBinaryOp()` - // TODO: Calling analyzeAndGetUpdatedContext before preOrderAnalyze is a hack. - - // TODO: This is redundant and has worse knowledge of the specific types of blocks than ConditionVisitor does. - // TODO: Implement a hybrid BlockAnalysisVisitor+ConditionVisitor that will do a better job of inferences and reducing false positives? (and reduce the redundant work) - - // E.g. the below code would update the context of BlockAnalysisVisitor in BlockAnalysisVisitor->visitBinaryOp() - // - // if (!(is_string($x) || $x === null)) {} - // - // But we want to let BlockAnalysisVisitor modify the context for cases such as the below: - // - // $result = !($x instanceof User) || $x->meetsCondition() - $condition_node = $node->children['cond']; - if ($condition_node instanceof Node) { - $context = $this->analyzeAndGetUpdatedContext( - $context->withLineNumberStart($condition_node->lineno), - $node, - $condition_node - ); - } - - $context = $this->preOrderAnalyze($context, $node); - - if ($stmts_node = $node->children['stmts']) { - if ($stmts_node instanceof Node) { - $context = $this->analyzeAndGetUpdatedContext( - $context->withScope( - new BranchScope($context->getScope()) - )->withLineNumberStart($stmts_node->lineno), - $node, - $stmts_node - ); - } - } - - // Now that we know all about our context (like what - // 'self' means), we can analyze statements like - // assignments and method calls. - $context = $this->postOrderAnalyze($context, $node); - - // When coming out of a scoped element, we pop the - // context to be the incoming context. Otherwise, - // we pass our new context up to our parent - return $context; - } - - /** - * For 'closed context' items (classes, methods, functions, - * closures), we analyze children in the parent context, but - * then return the parent context itself unmodified by the - * children. - * - * │ - * ▼ - * ┌──●────┐ - * │ │ - * ●──●──● │ - * ┌────┘ - * ● - * │ - * ▼ - * - * @param Node $node - * An AST node we'd like to analyze the statements for - * - * @return Context - * The updated context after visiting the node - */ - public function visitClosedContext(Node $node) : Context - { - // Make a copy of the internal context so that we don't - // leak any changes within the closed context to the - // outer scope - $context = $this->context; - $context->setLineNumberStart($node->lineno); - $context = $this->preOrderAnalyze(clone($context), $node); - - // We collect all child context so that the - // PostOrderAnalysisVisitor can optionally operate on - // them - $child_context_list = []; - - $child_context = $context; - - // With a context that is inside of the node passed - // to this method, we analyze all children of the - // node. - foreach ($node->children as $child_node) { - // Skip any non Node children. - if (!($child_node instanceof Node)) { - continue; - } - - // Step into each child node and get an - // updated context for the node - $child_context = $this->analyzeAndGetUpdatedContext($child_context, $node, $child_node); - - $child_context_list[] = $child_context; - } - - // For if statements, we need to merge the contexts - // of all child context into a single scope based - // on any possible branching structure - $context = (new ContextMergeVisitor( - $context, - $child_context_list - ))->__invoke($node); - - $this->postOrderAnalyze($context, $node); - - // Return the initial context as we exit - return $this->context; - } - - /** - * @param Node $node - * An AST node we'd like to analyze the statements for - * - * @return Context - * The updated context after visiting the node - */ - public function visitSwitchList(Node $node) : Context - { - // Make a copy of the internal context so that we don't - // leak any changes within the closed context to the - // outer scope - $context = $this->context; - $context->setLineNumberStart($node->lineno); - $context = $this->preOrderAnalyze(clone($context), $node); - - $scope = $context->getScope(); - $child_context_list = []; - - // TODO: Improve inferences in switch statements? - // TODO: Behave differently if switch lists don't cover every case (e.g. if there is no default) - $has_default = false; - list($switch_variable_node, $switch_variable_condition) = $this->createSwitchConditionAnalyzer( - end($this->parent_node_list)->children['cond'] - ); - $previous_child_context = null; - foreach ($node->children as $i => $child_node) { - $cond_node = $child_node->children['cond']; - // Step into each child node and get an - // updated context for the node - $child_context = $context->withScope(new BranchScope($scope)); - $child_context->withLineNumberStart($child_node->lineno); - if ($cond_node !== null) { - if ($switch_variable_condition) { - // Add the variable type from the above case statements, if it was possible for it to fall through - // TODO: Also support switch(get_class($variable)) - $visitor = new ConditionVisitor($this->code_base, $child_context); - $child_context = $switch_variable_condition($child_context, $cond_node); - if ($previous_child_context !== null) { - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this being non-null is implied by switch_variable_condition - $variable = $visitor->getVariableFromScope($switch_variable_node, $child_context); - if ($variable) { - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this being non-null is implied by switch_variable_condition - $old_variable = $visitor->getVariableFromScope($switch_variable_node, $previous_child_context); - - if ($old_variable) { - $variable = clone($variable); - $variable->setUnionType($variable->getUnionType()->withUnionType($old_variable->getUnionType())); - $child_context->addScopeVariable($variable); - } - } - } - } - } - - $child_context = $this->analyzeAndGetUpdatedContext($child_context, $node, $child_node); - - if ($cond_node === null) { - $has_default = true; - } - // We can improve analysis of `case` blocks by using - // a BlockExitStatusChecker to avoid propagating invalid inferences. - $stmts_node = $child_node->children['stmts']; - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this is never null - $block_exit_status = (new BlockExitStatusChecker())->__invoke($stmts_node); - // equivalent to !willUnconditionallyThrowOrReturn() - $previous_child_context = null; - if (($block_exit_status & ~BlockExitStatusChecker::STATUS_THROW_OR_RETURN_BITMASK)) { - // Skip over case statements that only ever throw or return - if (count($stmts_node->children ?? []) !== 0 || $i === count($node->children) - 1) { - // and skip over empty statement lists, unless they're the last in a long line of empty statement lists - $child_context_list[] = $child_context; - } - - if ($block_exit_status & BlockExitStatusChecker::STATUS_PROCEED) { - $previous_child_context = $child_context; - } - } - } - - if (count($child_context_list) > 0) { - if (!$has_default) { - $child_context_list[] = $context; - } - if (count($child_context_list) >= 2) { - // For case statements, we need to merge the contexts - // of all child context into a single scope based - // on any possible branching structure - $context = (new ContextMergeVisitor( - $context, - $child_context_list - ))->combineChildContextList(); - } else { - $context = $child_context_list[0]; - } - } - - return $this->postOrderAnalyze($context, $node); - } - - /** - * @param Node|int|string|float $switch_case_node - * @return array{0:?Node,1:?Closure} - */ - private function createSwitchConditionAnalyzer($switch_case_node) : array - { - if (!$switch_case_node instanceof Node) { - return [null, null]; - } - $switch_kind = ($switch_case_node->kind ?? null); - try { - if ($switch_kind === ast\AST_VAR) { - $switch_variable = (new ConditionVisitor($this->code_base, $this->context))->getVariableFromScope($switch_case_node, $this->context); - if (!$switch_variable) { - return [null, null]; - } - return [ - $switch_case_node, - /** - * @param Node|string|int|float $cond_node - */ - function (Context $child_context, $cond_node) use ($switch_case_node) : Context { - $visitor = new ConditionVisitor($this->code_base, $child_context); - return $visitor->updateVariableToBeIdentical($switch_case_node, $cond_node, $child_context); - }, - ]; - } elseif ($switch_kind === ast\AST_CALL) { - $name = $switch_case_node->children['expr']->children['name'] ?? null; - if (\is_string($name)) { - $name = \strtolower($name); - if ($name === 'get_class') { - $switch_variable_node = $switch_case_node->children['args']->children[0] ?? null; - if (($switch_variable_node->kind ?? null) !== ast\AST_VAR) { - return [null, null]; - } - $switch_variable = (new ConditionVisitor($this->code_base, $this->context))->getVariableFromScope($switch_variable_node, $this->context); - if (!$switch_variable) { - return [null, null]; - } - return [ - $switch_variable_node, - /** - * @param Node|string|int|float $cond_node - */ - function (Context $child_context, $cond_node) use ($switch_variable_node) : Context { - $visitor = new ConditionVisitor($this->code_base, $child_context); - return $visitor->analyzeClassAssertion( - $switch_variable_node, - $cond_node - ) ?? $child_context; - }, - ]; - } - } - } - } catch (IssueException $_) { - // do nothing, we warn elsewhere - } - return [null, null]; - } - - /** - * @param Node $node - * An AST node we'd like to analyze the statements - * - * @return Context - * The updated context after visiting the node - */ - public function visitIf(Node $node) : Context - { - $context = $this->context->withLineNumberStart( - $node->lineno - ); - - $context = $this->preOrderAnalyze($context, $node); - - // We collect all child context so that the - // PostOrderAnalysisVisitor can optionally operate on - // them - $child_context_list = []; - - $scope = $context->getScope(); - if ($scope instanceof GlobalScope) { - $fallthrough_context = $context->withScope(new BranchScope($scope)); - } else { - $fallthrough_context = $context; - } - - $child_nodes = $node->children; - $excluded_elem_count = 0; - - // With a context that is inside of the node passed - // to this method, we analyze all children of the - // node. - foreach ($child_nodes as $child_node) { - // The conditions need to communicate to the outer - // scope for things like assigning variables. - $child_context = clone($fallthrough_context); - - $child_context->withLineNumberStart( - $child_node->lineno - ); - - // Step into each child node and get an - // updated context for the node - $child_context = $this->analyzeAndGetUpdatedContext($child_context, $node, $child_node); - - // Issue #406: We can improve analysis of `if` blocks by using - // a BlockExitStatusChecker to avoid propagating invalid inferences. - // TODO: we may wish to check for a try block between this line's scope - // and the parent function's (or global) scope, - // to reduce false positives. - // (Variables will be available in `catch` and `finally`) - // This is mitigated by finally and catch blocks being unaware of new variables from try{} blocks. - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable this is never null - if (BlockExitStatusChecker::willUnconditionallySkipRemainingStatements($child_node->children['stmts'])) { - // e.g. "if (!is_string($x)) { return; }" - $excluded_elem_count++; - } else { - $child_context_list[] = $child_context; - } - - $cond_node = $child_node->children['cond']; - if ($cond_node instanceof Node) { - $fallthrough_context = (new NegatedConditionVisitor($this->code_base, $fallthrough_context))($cond_node); - } - // If cond_node was null, it would be an else statement. - } - - if ($excluded_elem_count === count($child_nodes)) { - // If all of the AST_IF_ELEM bodies would unconditionally throw or return, - // then analyze the remaining statements with the negation of all of the conditions. - $context = $fallthrough_context; - } else { - // For if statements, we need to merge the contexts - // of all child context into a single scope based - // on any possible branching structure - - // ContextMergeVisitor will include the incoming scope($context) if the if elements aren't comprehensive - $context = (new ContextMergeVisitor( - $fallthrough_context, // e.g. "if (!is_string($x)) { $x = ''; }" should result in inferring $x is a string. - $child_context_list - ))->visitIf($node); - } - - $context = $this->postOrderAnalyze($context, $node); - - // When coming out of a scoped element, we pop the - // context to be the incoming context. Otherwise, - // we pass our new context up to our parent - return $context; - } - - /** - * TODO: Diagram similar to visit() for this and other visitors handling branches? - * - * @param Node $node - * An AST node we'd like to analyze the statements for - * - * @return Context - * The updated context after visiting the node - */ - public function visitTry(Node $node) : Context - { - $context = $this->context->withLineNumberStart( - $node->lineno - ); - - $context = $this->preOrderAnalyze($context, $node); - - // With a context that is inside of the node passed - // to this method, we analyze all children of the - // node. - - $try_node = $node->children['try']; - - // The conditions need to communicate to the outer - // scope for things like assigning variables. - $try_context = $context->withScope( - new BranchScope($context->getScope()) - ); - - $try_context->withLineNumberStart( - $try_node->lineno - ); - - // Step into each try node and get an - // updated context for the node - $try_context = $this->analyzeAndGetUpdatedContext($try_context, $node, $try_node); - - // Analyze the catch blocks and finally blocks with a mix of the types - // from the try block and the catch blocks. - // NOTE: when strict_mode = 1, variables that are only defined in some Contexts - // but not others will be treated as absent. - // TODO: Improve in future releases - // NOTE: We let ContextMergeVisitor->visitTry decide if the block exit status is valid. - $context = (new ContextMergeVisitor( - $context, - [$try_context] - ))->mergeTryContext($node); - - // We collect all child context so that the - // PostOrderAnalysisVisitor can optionally operate on - // them - $catch_context_list = [$try_context]; - - $catch_nodes = $node->children['catches']->children ?? []; - - foreach ($catch_nodes as $catch_node) { - // Note: ContextMergeVisitor expects to get each individual catch - if (!$catch_node instanceof Node) { - throw new AssertionError("Expected catch_node to be a Node"); - } - - // The conditions need to communicate to the outer - // scope for things like assigning variables. - $catch_context = $context->withScope( - new BranchScope($context->getScope()) - ); - - $catch_context->withLineNumberStart( - $catch_node->lineno - ); - - // Step into each catch node and get an - // updated context for the node - $catch_context = $this->analyzeAndGetUpdatedContext($catch_context, $node, $catch_node); - // NOTE: We let ContextMergeVisitor->mergeCatchContext decide if the block exit status is valid. - $catch_context_list[] = $catch_context; - } - - $this->checkUnreachableCatch($catch_nodes, $context); - - // first context is the try. If there's a second context, it's a catch. - if (count($catch_context_list) >= 2) { - // For switch/try statements, we need to merge the contexts - // of all child context into a single scope based - // on any possible branching structure - $context = (new ContextMergeVisitor( - $context, - $catch_context_list - ))->mergeCatchContext($node); - } - - $finally_node = $node->children['finally'] ?? null; - if ($finally_node) { - if (!($finally_node instanceof Node)) { - throw new AssertionError("Expected non-null finally node to be a Node"); - } - // Because finally is always executed, we reuse $context - - // The conditions need to communicate to the outer - // scope for things like assigning variables. - $context = $context->withScope( - new BranchScope($context->getScope()) - ); - - $context->withLineNumberStart( - $finally_node->lineno - ); - - // Step into each finally node and get an - // updated context for the node. - // Don't bother checking if finally unconditionally returns here - // If it does, dead code detection would also warn. - $context = $this->analyzeAndGetUpdatedContext($context, $node, $finally_node); - } - - $context = $this->postOrderAnalyze($context, $node); - - // When coming out of a scoped element, we pop the - // context to be the incoming context. Otherwise, - // we pass our new context up to our parent - return $context; - } - - /** - * @param array<int,Node> $catch_nodes - * @param Context $context - * @return void - */ - private function checkUnreachableCatch(array $catch_nodes, Context $context) - { - if (count($catch_nodes) <= 1) { - return; - } - $caught_union_types = []; - $code_base = $this->code_base; - - foreach ($catch_nodes as $catch_node) { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall should be impossible to throw - $union_type = UnionTypeVisitor::unionTypeFromClassNode( - $code_base, - $context, - $catch_node->children['class'] - )->objectTypesWithKnownFQSENs(); - - $catch_line = $catch_node->lineno; - - foreach ($union_type->getTypeSet() as $type) { - foreach ($type->asExpandedTypes($code_base)->getTypeSet() as $ancestor_type) { - // Check if any of the ancestors were already caught by a previous catch statement - $line = $caught_union_types[\spl_object_id($ancestor_type)] ?? null; - - if ($line !== null) { - Issue::maybeEmit( - $code_base, - $context, - Issue::UnreachableCatch, - $catch_line, - (string)$type, - $line, - (string)$ancestor_type - ); - break; - } - } - } - foreach ($union_type->getTypeSet() as $type) { - // Track where this ancestor type was thrown - $caught_union_types[\spl_object_id($type)] = $catch_line; - } - } - } - - /** - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitBinaryOp(Node $node) : Context - { - $flags = $node->flags; - if ($flags === ast\flags\BINARY_BOOL_AND) { - return $this->analyzeBinaryBoolAnd($node); - } elseif ($flags === ast\flags\BINARY_BOOL_OR) { - return $this->analyzeBinaryBoolOr($node); - } - return $this->visit($node); - } - - /** - * @param Node $node - * A node to parse (for `&&` or `and` operator) - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function analyzeBinaryBoolAnd(Node $node) : Context - { - $context = $this->context->withLineNumberStart( - $node->lineno - ); - - ConfigPluginSet::instance()->preAnalyzeNode( - $this->code_base, - $context, - $node - ); - - $left_node = $node->children['left']; - $right_node = $node->children['right']; - - // With (left) && (right) - // 1. Update context with any side effects of left - // 2. Create a context to analyze the right-hand side with any inferences possible from left (e.g. ($x instanceof MyClass) && $x->foo() - // 3. Analyze the right-hand side - // 4. Merge the possibly evaluated $right_context for the right-hand side into the original context. (The left_node is guaranteed to have been evaluated, so it becomes $context) - - // TODO: Warn about non-node, they're guaranteed to be always false or true - if ($left_node instanceof Node) { - $context = $this->analyzeAndGetUpdatedContext($context, $node, $left_node); - - $base_context = $context; - $base_context_scope = $base_context->getScope(); - if ($base_context_scope instanceof GlobalScope) { - $base_context = $context->withScope(new BranchScope($base_context_scope)); - } - $context_with_left_condition = (new ConditionVisitor( - $this->code_base, - $base_context - ))->__invoke($left_node); - $context_with_false_left_condition = (new NegatedConditionVisitor( - $this->code_base, - $base_context - ))->__invoke($left_node); - } else { - $context_with_left_condition = $context; - $context_with_false_left_condition = $context; - } - - if ($right_node instanceof Node) { - $right_context = $this->analyzeAndGetUpdatedContext($context_with_left_condition, $node, $right_node); - $context = (new ContextMergeVisitor( - $context, - [$context, $context_with_false_left_condition, $right_context] - ))->combineChildContextList(); - } - - $context = $this->postOrderAnalyze($context, $node); - - return $context; - } - - /** - * @param Node $node - * A node to parse (for `||` or `or` operator) - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function analyzeBinaryBoolOr(Node $node) : Context - { - $context = $this->context->withLineNumberStart( - $node->lineno - ); - - ConfigPluginSet::instance()->preAnalyzeNode( - $this->code_base, - $context, - $node - ); - - $left_node = $node->children['left']; - $right_node = $node->children['right']; - - // With (left) || (right) - // 1. Update context with any side effects of left - // 2. Create a context to analyze the right-hand side with any inferences possible from left (e.g. (!($x instanceof MyClass)) || $x->foo() - // 3. Analyze the right-hand side - // 4. Merge the possibly evaluated $right_context for the right-hand side into the original context. (The left_node is guaranteed to have been evaluated, so it becomes $context) - - // TODO: Warn about non-node, they're guaranteed to be always false or true - if ($left_node instanceof Node) { - $context = $this->analyzeAndGetUpdatedContext($context, $node, $left_node); - - $base_context = $context; - $base_context_scope = $base_context->getScope(); - if ($base_context_scope instanceof GlobalScope) { - $base_context = $context->withScope(new BranchScope($base_context_scope)); - } - $context_with_false_left_condition = (new NegatedConditionVisitor( - $this->code_base, - $base_context - ))($left_node); - $context_with_true_left_condition = (new ConditionVisitor( - $this->code_base, - $base_context - ))($left_node); - } else { - $context_with_false_left_condition = $context; - $context_with_true_left_condition = $context; - } - - if ($right_node instanceof Node) { - $right_context = $this->analyzeAndGetUpdatedContext($context_with_false_left_condition, $node, $right_node); - $context = (new ContextMergeVisitor( - $context, - [$context, $context_with_true_left_condition, $right_context] - ))->combineChildContextList(); - } - - $context = $this->postOrderAnalyze($context, $node); - - return $context; - } - - public function visitConditional(Node $node) : Context - { - $context = $this->context->withLineNumberStart( - $node->lineno - ); - - // Visit the given node populating the code base - // with anything we learn and get a new context - // indicating the state of the world within the - // given node - // NOTE: unused for AST_CONDITIONAL - // $context = (new PreOrderAnalysisVisitor( - // $this->code_base, $context - // ))($node); - - // Let any configured plugins do a pre-order - // analysis of the node. - ConfigPluginSet::instance()->preAnalyzeNode( - $this->code_base, - $context, - $node - ); - - $true_node = $node->children['true'] ?? null; - $false_node = $node->children['false'] ?? null; - - $cond_node = $node->children['cond']; - if ($cond_node instanceof Node) { - // Step into each child node and get an - // updated context for the node - // (e.g. there may be assignments such as '($x = foo()) ? $a : $b) - $context = $this->analyzeAndGetUpdatedContext($context, $node, $cond_node); - - // TODO: Use different contexts and merge those, in case there were assignments or assignments by reference in both sides of the conditional? - // Reuse the BranchScope (sort of unintuitive). The ConditionVisitor returns a clone and doesn't modify the original. - $base_context = $context; - $base_context_scope = $base_context->getScope(); - if ($base_context_scope instanceof GlobalScope) { - $base_context = $context->withScope(new BranchScope($base_context_scope)); - } - $true_context = (new ConditionVisitor( - $this->code_base, - isset($true_node) ? $base_context : $context // special case: (($d = foo()) ?: 'fallback') - ))->__invoke($cond_node); - $false_context = (new NegatedConditionVisitor( - $this->code_base, - $base_context - ))->__invoke($cond_node); - } else { - $true_context = $context; - $false_context = $context; - } - - $child_context_list = []; - // In the long form, there's a $true_node, but in the short form (?:), - // $cond_node is the (already processed) value for truthy. - if ($true_node instanceof Node) { - $child_context = $this->analyzeAndGetUpdatedContext($true_context, $node, $true_node); - $child_context_list[] = $child_context; - } - - if ($false_node instanceof Node) { - $child_context = $this->analyzeAndGetUpdatedContext($false_context, $node, $false_node); - $child_context_list[] = $child_context; - } - if (count($child_context_list) >= 1) { - if (count($child_context_list) < 2) { - $child_context_list[] = $context; - } - $context = (new ContextMergeVisitor( - $context, - $child_context_list - ))->combineChildContextList(); - } - - $context = $this->postOrderAnalyze($context, $node); - - return $context; - } - - /** - * @param Node $node - * An AST node we'd like to analyze the statements for - * - * @return Context - * The updated context after visiting the node - * - * @see self::visitClosedContext() - */ - public function visitClass(Node $node) : Context - { - return $this->visitClosedContext($node); - } - - /** - * @param Node $node - * An AST node we'd like to analyze the statements for - * - * @return Context - * The updated context after visiting the node - * - * @see self::visitClosedContext() - */ - public function visitMethod(Node $node) : Context - { - // Make a copy of the internal context so that we don't - // leak any changes within the method to the - // outer scope - $context = $this->context; - $context->setLineNumberStart($node->lineno); - $context = $this->preOrderAnalyze(clone($context), $node); - - // With a context that is inside of the node passed - // to this method, we analyze all children of the - // node. - foreach ($node->children as $child_node) { - // Skip any non Node children. - if (!($child_node instanceof Node)) { - continue; - } - - // Step into each child node and get an - // updated context for the node - $this->analyzeAndGetUpdatedContext($context, $node, $child_node); - } - - $this->postOrderAnalyze($context, $node); - - // Return the initial context as we exit - return $this->context; - } - - /** - * @param Node $node - * An AST node we'd like to analyze the statements for - * - * @return Context - * The updated context after visiting the node - * - * @see self::visitClosedContext() - */ - public function visitFuncDecl(Node $node) : Context - { - // Analyze nodes with AST_FUNC_DECL the same way as AST_METHOD - return $this->visitMethod($node); - } - - /** - * @param Node $node - * An AST node we'd like to analyze the statements for - * - * @return Context - * The updated context after visiting the node - * - * @see self::visitClosedContext() - */ - public function visitClosure(Node $node) : Context - { - return $this->visitClosedContext($node); - } - - /** - * Run the common steps for pre-order analysis phase of a Node. - * - * 1. Run the pre-order analysis steps, updating the context and scope - * 2. Run plugins with pre-order steps, usually (but not always) updating the context and scope. - * - * @param Context $context - The context before pre-order analysis - * - * @param Node $node - * An AST node we'd like to analyze the statements for - * - * @return Context - * The updated context after pre-order analysis of the node - */ - private function preOrderAnalyze(Context $context, Node $node) : Context - { - // Visit the given node populating the code base - // with anything we learn and get a new context - // indicating the state of the world within the - // given node - // Equivalent to (new PostOrderAnalysisVisitor(...)($node)) but faster than using __invoke() - $context = (new PreOrderAnalysisVisitor( - $this->code_base, - $context - ))->{Element::VISIT_LOOKUP_TABLE[$node->kind] ?? 'handleMissingNodeKind'}($node); - - // Let any configured plugins do a pre-order - // analysis of the node. - ConfigPluginSet::instance()->preAnalyzeNode( - $this->code_base, - $context, - $node - ); - return $context; - } - - /** - * Common options for post-order analysis phase of a Node. - * - * 1. Run analysis steps and update the scope and context - * 2. Run plugins (usually (but not always) without updating the scope) - * - * @param Context $context - The context before post-order analysis - * - * @param Node $node - * An AST node we'd like to analyze the statements for - * - * @return Context - * The updated context after post-order analysis of the node - */ - private function postOrderAnalyze(Context $context, Node $node) : Context - { - // Now that we know all about our context (like what - // 'self' means), we can analyze statements like - // assignments and method calls. - // Equivalent to (new PostOrderAnalysisVisitor(...)($node)) but faster than using __invoke() - $context = (new PostOrderAnalysisVisitor( - $this->code_base, - $context->withLineNumberStart($node->lineno), - $this->parent_node_list - ))->{Element::VISIT_LOOKUP_TABLE[$node->kind] ?? 'handleMissingNodeKind'}($node); - - // let any configured plugins analyze the node - ConfigPluginSet::instance()->postAnalyzeNode( - $this->code_base, - $context, - $node, - $this->parent_node_list - ); - return $context; - } - - /** - * Analyzes a node of type \ast\AST_GROUP_USE - * This is the same as visit(), but does not recurse into the child nodes. - * - * If this function override didn't exist, - * then visit() would recurse into \ast\AST_USE, - * which would lack part of the namespace. - * (E.g. for use \NS\{const X, const Y}, we don't want to analyze const X or const Y - * without the preceding \NS\) - */ - public function visitGroupUse(Node $node) : Context - { - $context = $this->context->withLineNumberStart( - $node->lineno - ); - - // Visit the given node populating the code base - // with anything we learn and get a new context - // indicating the state of the world within the - // given node - $context = (new PreOrderAnalysisVisitor( - $this->code_base, - $context - ))->{Element::VISIT_LOOKUP_TABLE[$node->kind] ?? 'handleMissingNodeKind'}($node); - - // Let any configured plugins do a pre-order - // analysis of the node. - ConfigPluginSet::instance()->preAnalyzeNode( - $this->code_base, - $context, - $node - ); - - $context = $this->postOrderAnalyze($context, $node); - - return $context; - } - - /** - * @param Node $node - * An AST node we'd like to analyze the statements for - * @see self::visit() - This is similar to visit() except that the check if $is_static requires parent_node, - * so PreOrderAnalysisVisitor can't be used to modify the Context. - * - * @return Context - * The updated context after visiting the node - */ - public function visitPropElem(Node $node) : Context - { - $prop_name = (string)$node->children['name']; - - $context = $this->context; - $class = $context->getClassInScope($this->code_base); - - $context = $this->context->withScope(new PropertyScope( - $context->getScope(), - FullyQualifiedPropertyName::make($class->getFQSEN(), $prop_name) - ))->withLineNumberStart( - $node->lineno - ); - - // Don't bother calling PreOrderAnalysisVisitor, it does nothing - - // Let any configured plugins do a pre-order - // analysis of the node. - ConfigPluginSet::instance()->preAnalyzeNode( - $this->code_base, - $context, - $node - ); - - // With a context that is inside of the node passed - // to this method, we analyze all children of the - // node. - $default = $node->children['default'] ?? null; - if ($default instanceof Node) { - // Step into each child node and get an - // updated context for the node - $context = $this->analyzeAndGetUpdatedContext($context, $node, $default); - } - - $context = $this->postOrderAnalyze($context, $node); - - return $context; - } -} diff --git a/vendor/phan/phan/src/Phan/Bootstrap.php b/vendor/phan/phan/src/Phan/Bootstrap.php deleted file mode 100644 index 7554f57..0000000 --- a/vendor/phan/phan/src/Phan/Bootstrap.php +++ /dev/null @@ -1,254 +0,0 @@ -<?php declare(strict_types=1); - -use Phan\CLI; -use Phan\CodeBase; -use Phan\Config; - -// Listen for all errors -error_reporting(E_ALL); - -// Take as much memory as we need -ini_set("memory_limit", '-1'); - -// Add the root to the include path -define('CLASS_DIR', __DIR__ . '/../'); -set_include_path(get_include_path() . PATH_SEPARATOR . CLASS_DIR); - -// Use the composer autoloader -$found_autoloader = false; -foreach ([ - dirname(__DIR__, 2) . '/vendor/autoload.php', // autoloader is in this project (we're in src/Phan and want vendor/autoload.php) - dirname(__DIR__, 5) . '/vendor/autoload.php', // autoloader is in parent project (we're in vendor/phan/phan/src/Phan/Bootstrap.php and want autoload.php - ] as $file) { - if (file_exists($file)) { - require_once($file); - $found_autoloader = true; - break; - } -} -if (!$found_autoloader) { - fwrite(STDERR, "Could not locate the autoloader\n"); -} - -define('EXIT_SUCCESS', 0); -define('EXIT_FAILURE', 1); -define('EXIT_ISSUES_FOUND', EXIT_FAILURE); - -// Throw exceptions so asserts can be linked to the code being analyzed -ini_set('assert.exception', '1'); -// Set a substitute character for StringUtil::asUtf8() -ini_set('mbstring.substitute_character', (string)0xFFFD); - -// Explicitly set each option in case INI is set otherwise -assert_options(ASSERT_ACTIVE, true); -assert_options(ASSERT_WARNING, false); -assert_options(ASSERT_BAIL, false); -// ASSERT_QUIET_EVAL has been removed starting with PHP 8 -if (defined('ASSERT_QUIET_EVAL')) { - assert_options(ASSERT_QUIET_EVAL, false); // @phan-suppress-current-line PhanUndeclaredConstant, UnusedPluginSuppression -} -assert_options(ASSERT_CALLBACK, ''); // Can't explicitly set ASSERT_CALLBACK to null? - -/** - * Print more of the backtrace than is done by default - * @suppress PhanAccessMethodInternal - */ -set_exception_handler(static function (Throwable $throwable) { - error_log("$throwable\n"); - if (class_exists(CodeBase::class, false)) { - $most_recent_file = CodeBase::getMostRecentlyParsedOrAnalyzedFile(); - if (is_string($most_recent_file)) { - error_log(sprintf("(Phan %s crashed due to an uncaught Throwable when parsing/analyzing '%s')\n", CLI::PHAN_VERSION, $most_recent_file)); - } else { - error_log(sprintf("(Phan %s crashed due to an uncaught Throwable)\n", CLI::PHAN_VERSION)); - } - } - error_log("\n(This bug may have been fixed in Phan 2, which has the latest features and bug fixes (supports execution with PHP 7.1+))\n"); - exit(EXIT_FAILURE); -}); - -/** - * Executes $closure with Phan's default error handler disabled. - * - * This is useful in cases where PHP notices are unavoidable, - * e.g. notices in preg_match() when checking if a regex is valid - * and you don't want the default behavior of terminating the program. - * - * @template T - * @param Closure():T $closure - * @return T - * @see PregRegexCheckerPlugin - */ -function with_disabled_phan_error_handler(Closure $closure) -{ - global $__no_echo_phan_errors; - $__no_echo_phan_errors = true; - try { - return $closure(); - } finally { - $__no_echo_phan_errors = false; - } -} - -/** - * The error handler for PHP notices, etc. - * This is a named function instead of a closure to make stack traces easier to read. - * - * @suppress PhanAccessMethodInternal - * @param int $errno - * @param string $errstr - * @param string $errfile - * @param int $errline - * @return bool - */ -function phan_error_handler($errno, $errstr, $errfile, $errline) -{ - global $__no_echo_phan_errors; - if ($__no_echo_phan_errors) { - return false; - } - // php-src/ext/standard/streamsfuncs.c suggests that this is the only error caused by signal handlers and there are no translations - if ($errno === E_WARNING && preg_match('/^stream_select.*unable to select/', $errstr)) { - // Don't execute the PHP internal error handler - return true; - } - if ($errno === E_DEPRECATED && preg_match('/ast\\\\parse_/', $errstr)) { - static $did_warn = false; - if (!$did_warn) { - $did_warn = true; - if (!getenv('PHAN_SUPPRESS_AST_DEPRECATION')) { - fprintf( - STDERR, - "php-ast AST version %d used by Phan %s has been deprecated. Check if a newer version of Phan is available." . PHP_EOL, - Config::AST_VERSION, - CLI::PHAN_VERSION - ); - fwrite(STDERR, "(Set PHAN_SUPPRESS_AST_DEPRECATION=1 to suppress this message)" . PHP_EOL); - } - } - // Don't execute the PHP internal error handler - return true; - } - fwrite(STDERR, "$errfile:$errline [$errno] $errstr\n"); - if (error_reporting() === 0) { - // https://secure.php.net/manual/en/language.operators.errorcontrol.php - // Don't make Phan terminate if the @-operator was being used on an expression. - return false; - } - - if (class_exists(CodeBase::class, false)) { - $most_recent_file = CodeBase::getMostRecentlyParsedOrAnalyzedFile(); - if (is_string($most_recent_file)) { - fprintf(STDERR, "(Phan %s crashed when parsing/analyzing '%s')" . PHP_EOL, CLI::PHAN_VERSION, $most_recent_file); - } else { - fprintf(STDERR, "(Phan %s crashed)" . PHP_EOL, CLI::PHAN_VERSION); - } - } - ob_start(); - debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - fwrite(STDERR, rtrim(ob_get_clean() ?: "failed to dump backtrace") . PHP_EOL); - - $frames = debug_backtrace(); - if (isset($frames[1])) { - fwrite(STDERR, 'More details:' . PHP_EOL); - if (class_exists(Config::class, false)) { - $max_frame_length = max(100, Config::getValue('debug_max_frame_length')); - } else { - $max_frame_length = 1000; - } - $truncated = false; - foreach ($frames as $i => $frame) { - if ($i == 0) { - continue; - } - $frame_details = \Phan\Debug\Frame::frameToString($frame); - if (strlen($frame_details) > $max_frame_length) { - $truncated = true; - if (function_exists('mb_substr')) { - $frame_details = mb_substr($frame_details, 0, $max_frame_length) . '...'; - } else { - $frame_details = substr($frame_details, 0, $max_frame_length) . '...'; - } - } - fprintf(STDERR, '#%d: %s' . PHP_EOL, $i, $frame_details); - } - if ($truncated) { - fwrite(STDERR, "(Some long strings (usually JSON of AST Nodes) were truncated. To print more details for some stack frames of this crash, " . - "increase the Phan config setting debug_max_frame_length)" . PHP_EOL); - } - } - fwrite(STDERR, PHP_EOL . "(This bug may have been fixed in Phan 2, which has the latest features and bug fixes (supports execution with PHP 7.1+))" . PHP_EOL); - - exit(EXIT_FAILURE); -} -set_error_handler('phan_error_handler'); - -if (!class_exists(CompileError::class)) { - /** - * For self-analysis, add CompileError if it was not already declared. - * - * In PHP 7.3, a new CompileError class was introduced, and ParseError was turned into a subclass of CompileError. - * - * Phan handles both of those separately, so that Phan will work with 7.0-7.3. - * - * @suppress PhanRedefineClassInternal - */ - // phpcs:ignore PSR1.Classes.ClassDeclaration.MissingNamespace - class CompileError extends Error - { - } -} - -if (extension_loaded('ast')) { - // Warn if the php-ast version is too low. - $ast_version = (new ReflectionExtension('ast'))->getVersion(); - if (version_compare($ast_version, '1.0.0') <= 0) { - if (PHP_VERSION_ID >= 70400) { - fwrite(STDERR, "Phan is being run with php-ast version $ast_version." . PHP_EOL); - fwrite(STDERR, "However, when run with PHP 7.4+, Phan requires php-ast 1.0.1 or newer. Older versions of php-ast will crash Phan." . PHP_EOL); - fwrite(STDERR, "Alternately, to run this version of Phan with PHP 7.4 without upgrading php-ast, uninstall/disable php-ast in php.ini," - . " then add the CLI option --allow-polyfill-parser (which is noticeably slower)" . PHP_EOL); - exit(EXIT_FAILURE); - } - if (!getenv('PHAN_SUPPRESS_AST_UPGRADE_NOTICE')) { - fprintf( - STDERR, - "Phan 2 is out, and it requires php-ast 1.0.1+ for AST version 70. php-ast %s is installed." . PHP_EOL, - $ast_version - ); - fwrite(STDERR, "(Set PHAN_SUPPRESS_AST_UPGRADE_NOTICE=1 to suppress this message)" . PHP_EOL); - } - } - if (version_compare($ast_version, '0.1.5') < 0) { - fprintf(STDERR, "Phan supports php-ast version 0.1.5 or newer, but the installed php-ast version is %s. You may see bugs in some edge cases" . PHP_EOL, $ast_version); - } -} -if (PHP_VERSION_ID < 70100) { - if (!getenv('PHAN_SUPPRESS_PHP_UPGRADE_NOTICE')) { - fprintf( - STDERR, - "The latest Phan release (Phan 2) requires PHP 7.1+ to run, but PHP %s and Phan %s are installed." . PHP_EOL, - PHP_VERSION, - CLI::PHAN_VERSION - ); - fwrite(STDERR, "PHP 7.0 reached its end of life in December 2018." . PHP_EOL); - fwrite(STDERR, "(Set PHAN_SUPPRESS_PHP_UPGRADE_NOTICE=1 to suppress this message)" . PHP_EOL); - } -} elseif (PHP_VERSION_ID >= 70400) { - if (!getenv('PHAN_SUPPRESS_PHP_UPGRADE_NOTICE')) { - fprintf( - STDERR, - "Phan %s does not support PHP 7.4+ (PHP %s is installed)" . PHP_EOL, - CLI::PHAN_VERSION, - PHP_VERSION - ); - fwrite( - STDERR, - "Phan 2.0.0 or newer is required to properly parse and analyze PHP code when Phan is executed with PHP 7.4+." . PHP_EOL - ); - fwrite( - STDERR, - "Executing anyway (Phan may crash)." . PHP_EOL - ); - } -} diff --git a/vendor/phan/phan/src/Phan/CLI.php b/vendor/phan/phan/src/Phan/CLI.php deleted file mode 100644 index 688835f..0000000 --- a/vendor/phan/phan/src/Phan/CLI.php +++ /dev/null @@ -1,1789 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use AssertionError; -use InvalidArgumentException; -use Phan\Config\Initializer; -use Phan\Daemon\ExitException; -use Phan\Exception\UsageException; -use Phan\Language\Element\AddressableElement; -use Phan\Language\Element\Comment\Builder; -use Phan\Language\FQSEN; -use Phan\Library\StringUtil; -use Phan\Output\Collector\BufferingCollector; -use Phan\Output\Filter\CategoryIssueFilter; -use Phan\Output\Filter\ChainedIssueFilter; -use Phan\Output\Filter\FileIssueFilter; -use Phan\Output\Filter\MinimumSeverityFilter; -use Phan\Output\PrinterFactory; -use Phan\Plugin\ConfigPluginSet; -use Phan\Plugin\Internal\MethodSearcherPlugin; -use ReflectionExtension; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\StreamOutput; -use Symfony\Component\Console\Terminal; -use function array_slice; -use function count; -use function in_array; -use function is_array; -use function is_resource; -use function is_string; -use function str_repeat; -use function strlen; -use const DIRECTORY_SEPARATOR; -use const EXIT_FAILURE; -use const EXIT_SUCCESS; -use const FILE_IGNORE_NEW_LINES; -use const FILE_SKIP_EMPTY_LINES; -use const FILTER_VALIDATE_INT; -use const FILTER_VALIDATE_IP; -use const PHP_OS; -use const STDERR; -use const STR_PAD_LEFT; - -/** - * Contains methods for parsing CLI arguments to Phan, - * outputting to the CLI, as well as helper methods to retrieve files/folders - * for the analyzed project. - * - * @phan-file-suppress PhanPartialTypeMismatchArgumentInternal - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class CLI -{ - /** - * This should be updated to x.y.z-dev after every release, and x.y.z before a release. - */ - const PHAN_VERSION = '1.3.5'; - - /** - * List of short flags passed to getopt - * still available: g,n,t,u,w - * @internal - */ - const GETOPT_SHORT_OPTIONS = 'f:m:o:c:k:aeqbr:pid:3:y:l:xj:zhvs:SCP:I:D'; - - /** - * List of long flags passed to getopt - * @internal - */ - const GETOPT_LONG_OPTIONS = [ - 'allow-polyfill-parser', - 'automatic-fix', - 'backward-compatibility-checks', - 'color', - 'config-file:', - 'constant-variable-detection', - 'daemonize-socket:', - 'daemonize-tcp-host:', - 'daemonize-tcp-port:', - 'dead-code-detection', - 'debug', - 'directory:', - 'disable-cache', - 'disable-plugins', - 'dump-ast', - 'dump-parsed-file-list', - 'dump-signatures-file:', - 'find-signature:', - 'exclude-directory-list:', - 'exclude-file:', - 'extended-help', - 'file-list:', - 'file-list-only:', - 'force-polyfill-parser', - 'help', - 'help-annotations', - 'ignore-undeclared', - 'include-analysis-file-list:', - 'init', - 'init-level:', - 'init-analyze-dir:', - 'init-analyze-file:', - 'init-no-composer', - 'init-overwrite', - 'language-server-analyze-only-on-save', - 'language-server-on-stdin', - 'language-server-tcp-connect:', - 'language-server-tcp-server:', - 'language-server-verbose', - 'language-server-disable-output-filter', - 'language-server-hide-category', - 'language-server-allow-missing-pcntl', - 'language-server-force-missing-pcntl', - 'language-server-require-pcntl', - 'language-server-disable-go-to-definition', - 'language-server-disable-hover', - 'language-server-disable-completion', - 'language-server-enable', - 'language-server-enable-go-to-definition', - 'language-server-enable-hover', - 'language-server-enable-completion', - 'language-server-completion-vscode', - 'markdown-issue-messages', - 'memory-limit:', - 'minimum-severity:', - 'output:', - 'output-mode:', - 'parent-constructor-required:', - 'polyfill-parse-all-element-doc-comments', - 'plugin:', - 'print-memory-usage-summary', - 'processes:', - 'progress-bar', - 'project-root-directory:', - 'quick', - 'require-config-exists', - 'signature-compatibility', - 'strict-method-checking', - 'strict-param-checking', - 'strict-property-checking', - 'strict-return-checking', - 'strict-type-checking', - 'target-php-version:', - 'unused-variable-detection', - 'use-fallback-parser', - 'version', - ]; - - /** - * @var OutputInterface used for outputting the formatted issue messages. - */ - private $output; - - /** - * @return OutputInterface - * @suppress PhanUnreferencedPublicMethod not used yet. - */ - public function getOutput() : OutputInterface - { - return $this->output; - } - - /** - * @var array<int,string> - * The set of file names to analyze - */ - private $file_list_in_config = []; - - /** - * @var array<int,string> - * The set of file names to analyze - */ - private $file_list = []; - - /** - * @var bool - * Set to true to ignore all files and directories - * added by means other than -file-list-only on the CLI - */ - private $file_list_only = false; - - /** - * @var string|null - * A possibly null path to the config file to load - */ - private $config_file = null; - - /** - * @param string|string[] $value - * @return array<int,string> - */ - public static function readCommaSeparatedListOrLists($value) : array - { - if (is_array($value)) { - $value = \implode(',', $value); - } - $value_set = []; - foreach (\explode(',', (string)$value) as $file) { - if ($file === '') { - continue; - } - $value_set[$file] = true; - } - return \array_map('strval', \array_keys($value_set)); - } - - /** - * @param array<string,mixed> $opts - * @param array<int,string> $argv - * @throws UsageException - */ - private static function checkAllArgsUsed(array $opts, array &$argv) - { - $pruneargv = []; - foreach ($opts as $opt => $value) { - foreach ($argv as $key => $chunk) { - $regex = '/^' . (isset($opt[1]) ? '--' : '-') . \preg_quote((string) $opt, '/') . '/'; - - if (in_array($chunk, is_array($value) ? $value : [$value]) - && $argv[$key - 1][0] == '-' - || \preg_match($regex, $chunk) - ) { - $pruneargv[] = $key; - } - } - } - - while (count($pruneargv) > 0) { - $key = \array_pop($pruneargv); - unset($argv[$key]); - } - - foreach ($argv as $arg) { - if ($arg[0] == '-') { - throw new UsageException("Unknown option '{$arg}'", EXIT_FAILURE); - } - } - } - - /** - * Creates a CLI object from argv - */ - public static function fromArgv() : CLI - { - global $argv; - - // Parse command line args - $opts = \getopt(self::GETOPT_SHORT_OPTIONS, self::GETOPT_LONG_OPTIONS); - $opts = $opts ?? []; - - try { - return new self($opts, $argv); - } catch (UsageException $e) { - self::usage($e->getMessage(), (int)$e->getCode(), $e->print_extended_help); - exit((int)$e->getCode()); // unreachable - } catch (ExitException $e) { - $message = $e->getMessage(); - if ($message) { - \fwrite(STDERR, $message); - } - exit($e->getCode()); - } - } - - /** - * Create and read command line arguments, configuring - * \Phan\Config as a side effect. - * - * @param array<string,string|array<int,mixed>|false> $opts - * @param array<int,string> $argv - * @return CLI - * @throws ExitException - * @throws UsageException - * @internal - used for unit tests only - */ - public static function fromRawValues(array $opts, array $argv) : CLI - { - return new self($opts, $argv); - } - - /** - * Create and read command line arguments, configuring - * \Phan\Config as a side effect. - * - * @param array<string,string|array<int,mixed>|false> $opts - * @param array<int,string> $argv - * @return void - * @throws ExitException - * @throws UsageException - */ - private function __construct(array $opts, array $argv) - { - if (\array_key_exists('extended-help', $opts)) { - throw new UsageException('', EXIT_SUCCESS, true); // --help prints help and calls exit(0) - } - if (\array_key_exists('h', $opts) || \array_key_exists('help', $opts)) { - throw new UsageException(); // --help prints help and calls exit(0) - } - if (\array_key_exists('help-annotations', $opts)) { - $result = "See https://github.com/phan/phan/wiki/Annotating-Your-Source-Code for more details." . \PHP_EOL . \PHP_EOL; - - $result .= "Annotations specific to Phan:" . \PHP_EOL; - // @phan-suppress-next-line PhanAccessClassConstantInternal - foreach (Builder::SUPPORTED_ANNOTATIONS as $key => $_) { - $result .= "- " . $key . \PHP_EOL; - } - throw new ExitException($result, EXIT_SUCCESS); - } - if (\array_key_exists('v', $opts ?? []) || \array_key_exists('version', $opts ?? [])) { - \printf("Phan %s\n", self::PHAN_VERSION); - - if (PHP_VERSION_ID >= 70100 && PHP_VERSION_ID < 70400 && !getenv('PHAN_SUPPRESS_PHP_UPGRADE_NOTICE')) { - fwrite(STDERR, "(Consider upgrading to Phan 2, which has the latest features and bug fixes (supports execution with PHP 7.1+))\n"); - } - throw new ExitException('', EXIT_SUCCESS); - } - - // Determine the root directory of the project from which - // we route all relative paths passed in as args - $overridden_project_root_directory = $opts['d'] ?? $opts['project-root-directory'] ?? null; - if (\is_string($overridden_project_root_directory)) { - if (!\is_dir($overridden_project_root_directory)) { - throw new UsageException(StringUtil::jsonEncode($overridden_project_root_directory) . ' is not a directory', EXIT_FAILURE); - } - // Set the current working directory so that relative paths within the project will work. - // TODO: Add an option to allow searching ancestor directories? - \chdir($overridden_project_root_directory); - } - $cwd = \getcwd(); - if (!is_string($cwd)) { - \fwrite(STDERR, "Failed to find current working directory\n"); - exit(1); - } - Config::setProjectRootDirectory($cwd); - - if (\array_key_exists('init', $opts)) { - $exit_code = Initializer::initPhanConfig($opts); - if ($exit_code === 0) { - exit($exit_code); - } - throw new UsageException('', $exit_code); - } - - // Before reading the config, check for an override on - // the location of the config file path. - $config_file_override = $opts['k'] ?? $opts['config-file'] ?? null; - if ($config_file_override !== null) { - if (!is_string($config_file_override)) { - // Doesn't work for a mix of -k and --config-file, but low priority - throw new ExitException("Expected exactly one file for --config-file, but saw " . StringUtil::jsonEncode($config_file_override) . "\n", 1); - } - if (!\is_file($config_file_override)) { - throw new ExitException("Could not find the config file override " . StringUtil::jsonEncode($config_file_override) . "\n", 1); - } - $this->config_file = $config_file_override; - } - - if (isset($opts['language-server-force-missing-pcntl'])) { - Config::setValue('language_server_use_pcntl_fallback', true); - } elseif (!isset($opts['language-server-require-pcntl'])) { - // --language-server-allow-missing-pcntl is now the default - if (!\extension_loaded('pcntl')) { - Config::setValue('language_server_use_pcntl_fallback', true); - } - } - - // Now that we have a root directory, attempt to read a - // configuration file `.phan/config.php` if it exists - $this->maybeReadConfigFile(\array_key_exists('require-config-exists', $opts)); - - $this->output = new ConsoleOutput(); - $factory = new PrinterFactory(); - $printer_type = 'text'; - $minimum_severity = Config::getValue('minimum_severity'); - $mask = -1; - - foreach ($opts as $key => $value) { - $key = (string)$key; - switch ($key) { - case 'r': - case 'file-list-only': - // Mark it so that we don't load files through - // other mechanisms. - $this->file_list_only = true; - - // Empty out the file list - $this->file_list_in_config = []; - - // Intentionally fall through to load the - // file list - case 'f': - case 'file-list': - $file_list = \is_array($value) ? $value : [$value]; - foreach ($file_list as $file_name) { - if (!is_string($file_name)) { - \error_log("invalid argument for --file-list"); - continue; - } - $file_path = Config::projectPath($file_name); - if (\is_file($file_path) && \is_readable($file_path)) { - $lines = \file(Config::projectPath($file_name), FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - if (is_array($lines)) { - $this->file_list_in_config = \array_merge( - $this->file_list_in_config, - $lines - ); - continue; - } - } - \error_log("Unable to read file $file_path"); - } - break; - case 'l': - case 'directory': - if (!$this->file_list_only) { - $directory_list = \is_array($value) ? $value : [$value]; - foreach ($directory_list as $directory_name) { - if (!is_string($directory_name)) { - \error_log("Invalid --directory setting"); - return; - } - $this->file_list_in_config = \array_merge( - $this->file_list_in_config, - \array_values($this->directoryNameToFileList( - $directory_name - )) - ); - } - } - break; - case 'k': - case 'config-file': - break; - case 'm': - case 'output-mode': - if (!is_string($value) || !in_array($value, $factory->getTypes(), true)) { - throw new UsageException( - \sprintf( - 'Unknown output mode %s. Known values are [%s]', - StringUtil::jsonEncode($value), - \implode(',', $factory->getTypes()) - ), - EXIT_FAILURE - ); - } - $printer_type = $value; - break; - case 'c': - case 'parent-constructor-required': - Config::setValue('parent_constructor_required', \explode(',', $value)); - break; - case 'q': - case 'quick': - Config::setValue('quick_mode', true); - break; - case 'b': - case 'backward-compatibility-checks': - Config::setValue('backward_compatibility_checks', true); - break; - case 'p': - case 'progress-bar': - Config::setValue('progress_bar', true); - break; - case 'D': - case 'debug': - Config::setValue('debug_output', true); - break; - case 'a': - case 'dump-ast': - Config::setValue('dump_ast', true); - break; - case 'dump-parsed-file-list': - Config::setValue('dump_parsed_file_list', true); - break; - case 'dump-signatures-file': - Config::setValue('dump_signatures_file', $value); - break; - case 'find-signature': - try { - if (!is_string($value)) { - throw new InvalidArgumentException("Expected a string, got " . \json_encode($value)); - } - // @phan-suppress-next-line PhanAccessMethodInternal - MethodSearcherPlugin::setSearchString($value); - } catch (InvalidArgumentException $e) { - throw new UsageException("Invalid argument '$value' to --find-signature. Error: " . $e->getMessage() . "\n", EXIT_FAILURE); - } - - Config::setValue('plugins', \array_merge( - Config::getValue('plugins'), - [__DIR__ . '/Plugin/Internal/MethodSearcherPluginLoader.php'] - )); - break; - case 'automatic-fix': - Config::setValue('plugins', \array_merge( - Config::getValue('plugins'), - [__DIR__ . '/Plugin/Internal/IssueFixingPlugin.php'] - )); - break; - case 'o': - case 'output': - if (!is_string($value)) { - throw new UsageException(\sprintf("Invalid arguments to --output: args=%s\n", StringUtil::jsonEncode($value)), EXIT_FAILURE); - } - $output_file = \fopen($value, 'w'); - if (!is_resource($output_file)) { - throw new UsageException("Failed to open output file '$value'\n", EXIT_FAILURE); - } - $this->output = new StreamOutput($output_file); - break; - case 'i': - case 'ignore-undeclared': - $mask &= ~Issue::CATEGORY_UNDEFINED; - break; - case '3': - case 'exclude-directory-list': - // @phan-suppress-next-line PhanPossiblyFalseTypeArgument - Config::setValue('exclude_analysis_directory_list', self::readCommaSeparatedListOrLists($value)); - break; - case 'exclude-file': - Config::setValue('exclude_file_list', \array_merge( - Config::getValue('exclude_file_list'), - \is_array($value) ? $value : [$value] - )); - break; - case 'I': - case 'include-analysis-file-list': - // @phan-suppress-next-line PhanPossiblyFalseTypeArgument - Config::setValue('include_analysis_file_list', self::readCommaSeparatedListOrLists($value)); - break; - case 'j': - case 'processes': - Config::setValue('processes', (int)$value); - break; - case 'z': - case 'signature-compatibility': - Config::setValue('analyze_signature_compatibility', (bool)$value); - break; - case 'y': - case 'minimum-severity': - $minimum_severity = (int)$value; - break; - case 'target-php-version': - Config::setValue('target_php_version', $value); - break; - case 'polyfill-parse-all-element-doc-comments': - Config::setValue('polyfill_parse_all_element_doc_comments', true); - break; - case 'd': - case 'project-root-directory': - // We handle this flag before parsing options so - // that we can get the project root directory to - // base other config flags values on - break; - case 'require-config-exists': - break; // handled earlier. - case 'language-server-allow-missing-pcntl': - case 'language-server-force-missing-pcntl': - case 'language-server-require-pcntl': - break; // handled earlier - case 'language-server-hide-category': - Config::setValue('language_server_hide_category_of_issues', true); - break; - case 'disable-cache': - Config::setValue('cache_polyfill_asts', false); - break; - case 'disable-plugins': - // Slightly faster, e.g. for daemon mode with lowest latency (along with --quick). - Config::setValue('plugins', []); - break; - case 'P': - case 'plugin': - if (!is_array($value)) { - $value = [$value]; - } - Config::setValue( - 'plugins', - \array_unique(\array_merge(Config::getValue('plugins'), $value)) - ); - break; - case 'use-fallback-parser': - Config::setValue('use_fallback_parser', true); - break; - case 'strict-method-checking': - Config::setValue('strict_method_checking', true); - break; - case 'strict-param-checking': - Config::setValue('strict_param_checking', true); - break; - case 'strict-property-checking': - Config::setValue('strict_property_checking', true); - break; - case 'strict-return-checking': - Config::setValue('strict_return_checking', true); - break; - case 'S': - case 'strict-type-checking': - Config::setValue('strict_method_checking', true); - Config::setValue('strict_param_checking', true); - Config::setValue('strict_property_checking', true); - Config::setValue('strict_return_checking', true); - break; - case 's': - case 'daemonize-socket': - self::checkCanDaemonize('unix', $key); - if (!is_string($value)) { - throw new UsageException(\sprintf("Invalid arguments to --daemonize-socket: args=%s", StringUtil::jsonEncode($value)), EXIT_FAILURE); - } - $socket_dirname = \realpath(\dirname($value)); - if (!is_string($socket_dirname) || !\file_exists($socket_dirname) || !\is_dir($socket_dirname)) { - $msg = \sprintf( - 'Requested to create Unix socket server in %s, but folder %s does not exist', - StringUtil::jsonEncode($value), - StringUtil::jsonEncode($socket_dirname) - ); - throw new UsageException($msg, 1); - } else { - Config::setValue('daemonize_socket', $value); // Daemonize. Assumes the file list won't change. Accepts requests over a Unix socket, or some other IPC mechanism. - } - break; - // TODO(possible idea): HTTP server binding to 127.0.0.1, daemonize-http-port. - case 'daemonize-tcp-host': - $this->checkCanDaemonize('tcp', $key); - Config::setValue('daemonize_tcp', true); - $host = \filter_var($value, FILTER_VALIDATE_IP); - if (\strcasecmp($value, 'default') !== 0 && !$host) { - throw new UsageException("daemonize-tcp-host must be the string 'default' or a valid hostname, got '$value'", 1); - } - if ($host) { - Config::setValue('daemonize_tcp_host', $host); - } - break; - case 'daemonize-tcp-port': - $this->checkCanDaemonize('tcp', $key); - Config::setValue('daemonize_tcp', true); - $port = \filter_var($value, FILTER_VALIDATE_INT); - if (\strcasecmp($value, 'default') !== 0 && !($port >= 1024 && $port <= 65535)) { - throw new UsageException("daemonize-tcp-port must be the string 'default' or a value between 1024 and 65535, got '$value'", 1); - } - if ($port) { - Config::setValue('daemonize_tcp_port', $port); - } - break; - case 'language-server-on-stdin': - Config::setValue('language_server_config', ['stdin' => true]); - break; - case 'language-server-tcp-server': - // TODO: could validate? - Config::setValue('language_server_config', ['tcp-server' => $value]); - break; - case 'language-server-tcp-connect': - Config::setValue('language_server_config', ['tcp' => $value]); - break; - case 'language-server-analyze-only-on-save': - Config::setValue('language_server_analyze_only_on_save', true); - break; - case 'language-server-disable-go-to-definition': - Config::setValue('language_server_enable_go_to_definition', false); - break; - case 'language-server-enable-go-to-definition': - Config::setValue('language_server_enable_go_to_definition', true); - break; - case 'language-server-disable-hover': - Config::setValue('language_server_enable_hover', false); - break; - case 'language-server-enable-hover': - Config::setValue('language_server_enable_hover', true); - break; - case 'language-server-completion-vscode': - break; - case 'language-server-disable-completion': - Config::setValue('language_server_enable_completion', false); - break; - case 'language-server-enable-completion': - Config::setValue( - 'language_server_enable_completion', - isset($opts['language-server-completion-vscode']) ? Config::COMPLETION_VSCODE : true - ); - break; - case 'language-server-verbose': - Config::setValue('language_server_debug_level', 'info'); - break; - case 'language-server-disable-output-filter': - Config::setValue('language_server_disable_output_filter', true); - break; - case 'x': - case 'dead-code-detection': - Config::setValue('dead_code_detection', true); - break; - case 'unused-variable-detection': - Config::setValue('unused_variable_detection', true); - break; - case 'constant-variable-detection': - Config::setValue('constant_variable_detection', true); - Config::setValue('unused_variable_detection', true); - break; - case 'allow-polyfill-parser': - // Just check if it's installed and of a new enough version. - // Assume that if there is an installation, it works, and warn later in ensureASTParserExists() - if (!\extension_loaded('ast')) { - Config::setValue('use_polyfill_parser', true); - break; - } - $ast_version = (new ReflectionExtension('ast'))->getVersion(); - if (\version_compare($ast_version, '0.1.5') < 0) { - Config::setValue('use_polyfill_parser', true); - break; - } - break; - case 'force-polyfill-parser': - Config::setValue('use_polyfill_parser', true); - break; - case 'memory-limit': - if (\preg_match('@^([1-9][0-9]*)([KMG])?$@', $value, $match)) { - \ini_set('memory_limit', $value); - } else { - \fwrite(STDERR, "Invalid --memory-limit '$value', ignoring\n"); - } - break; - case 'print-memory-usage-summary': - Config::setValue('print_memory_usage_summary', true); - break; - case 'markdown-issue-messages': - Config::setValue('markdown_issue_messages', true); - break; - case 'C': - case 'color': - Config::setValue('color_issue_messages', true); - break; - default: - throw new UsageException("Unknown option '-$key'" . self::getFlagSuggestionString($key), EXIT_FAILURE); - } - } - - self::checkPluginsExist(); - self::ensureASTParserExists(); - - $output = $this->output; - $printer = $factory->getPrinter($printer_type, $output); - $filter = new ChainedIssueFilter([ - new FileIssueFilter(new Phan()), - new MinimumSeverityFilter($minimum_severity), - new CategoryIssueFilter($mask) - ]); - $collector = new BufferingCollector($filter); - - self::checkAllArgsUsed($opts, $argv); - - Phan::setPrinter($printer); - Phan::setIssueCollector($collector); - if (!$this->file_list_only) { - // Merge in any remaining args on the CLI - $this->file_list_in_config = \array_merge( - $this->file_list_in_config, - array_slice($argv, 1) - ); - } - - $this->recomputeFileList(); - - // We can't run dead code detection on multiple cores because - // we need to update reference lists in a globally accessible - // way during analysis. With our parallelization mechanism, there - // is no shared state between processes, making it impossible to - // have a complete set of reference lists. - if (Config::getValue('processes') !== 1 - && Config::getValue('dead_code_detection')) { - throw new AssertionError("We cannot run dead code detection on more than one core."); - } - if (Config::get_closest_target_php_version_id() >= 70400 && PHP_VERSION_ID < 70400) { - // Either warn in bootstrap about using php 7.4, or here about analyzing a codebase's support for php 7.4+, but not both. - if (!getenv('PHAN_SUPPRESS_PHP_UPGRADE_NOTICE')) { - fwrite(STDERR, "Phan 1.x (and AST version 50) has incomplete support for analyze codebases using php 7.4 syntax or function signatures.\n"); - fwrite(STDERR, "To correctly analyze PHP 7.4+ codebases, upgrading to Phan 2 is strongly recommended.\n"); - fwrite(STDERR, "(Set PHAN_SUPPRESS_PHP_UPGRADE_NOTICE=1 to disable this notice)\n"); - } - } - } - - private static function checkPluginsExist() - { - $all_plugins_exist = true; - foreach (Config::getValue('plugins') as $plugin_path_or_name) { - // @phan-suppress-next-line PhanAccessMethodInternal - $plugin_file_name = ConfigPluginSet::normalizePluginPath($plugin_path_or_name); - if (!\is_file($plugin_file_name)) { - if ($plugin_file_name === $plugin_path_or_name) { - $details = ''; - } else { - $details = ' (Referenced as ' . StringUtil::jsonEncode($plugin_path_or_name) . ')'; - $details .= self::getPluginSuggestionText($plugin_path_or_name); - } - \fprintf( - STDERR, - "Phan could not find plugin %s%s\n", - StringUtil::jsonEncode($plugin_file_name), - $details - ); - $all_plugins_exist = false; - } - } - if (!$all_plugins_exist) { - \fwrite(STDERR, "Exiting due to invalid plugin config.\n"); - exit(1); - } - } - - /** - * @internal (visible for tests) - */ - public static function getPluginSuggestionText(string $plugin_path_or_name) : string - { - $plugin_dirname = ConfigPluginSet::getBuiltinPluginDirectory(); - $candidates = []; - foreach (\scandir($plugin_dirname) as $basename) { - if (\substr($basename, -4) !== '.php') { - continue; - } - $plugin_name = \substr($basename, 0, -4); - $candidates[$plugin_name] = $plugin_name; - } - $suggestions = IssueFixSuggester::getSuggestionsForStringSet($plugin_path_or_name, $candidates); - if (!$suggestions) { - return ''; - } - return ' (Did you mean ' . \implode(' or ', $suggestions) . '?)'; - } - - /** - * @return void - */ - public function recomputeFileList() - { - $this->file_list = $this->file_list_in_config; - - if (!$this->file_list_only) { - // Merge in any files given in the config - /** @var array<int,string> */ - $this->file_list = \array_merge( - $this->file_list, - Config::getValue('file_list') - ); - - // Merge in any directories given in the config - foreach (Config::getValue('directory_list') as $directory_name) { - $this->file_list = \array_merge( - $this->file_list, - \array_values(self::directoryNameToFileList($directory_name)) - ); - } - - // Don't scan anything twice - $this->file_list = \array_unique($this->file_list); - } - - // Exclude any files that should be excluded from - // parsing and analysis (not read at all) - if (count(Config::getValue('exclude_file_list')) > 0) { - $exclude_file_set = []; - foreach (Config::getValue('exclude_file_list') as $file) { - $normalized_file = \str_replace('\\', '/', $file); - $exclude_file_set[$normalized_file] = true; - $exclude_file_set["./$normalized_file"] = true; - } - - $this->file_list = \array_filter( - $this->file_list, - static function (string $file) use ($exclude_file_set) : bool { - // Handle edge cases such as 'mydir/subdir\subsubdir' on Windows, if mydir/subdir was in the Phan config. - return !isset($exclude_file_set[\str_replace('\\', '/', $file)]); - } - ); - } - } - - /** - * @return void - exits on usage error - * @throws UsageException - */ - private static function checkCanDaemonize(string $protocol, string $opt) - { - $opt = strlen($opt) >= 2 ? "--$opt" : "-$opt"; - if (!in_array($protocol, \stream_get_transports())) { - throw new UsageException("The $protocol:///path/to/file schema is not supported on this system, cannot create a daemon with $opt", 1); - } - if (!Config::getValue('language_server_use_pcntl_fallback') && !\function_exists('pcntl_fork')) { - throw new UsageException("The pcntl extension is not available to fork a new process, so $opt will not be able to create workers to respond to requests.", 1); - } - if ($opt === '--daemonize-socket' && Config::getValue('daemonize_tcp')) { - throw new UsageException('Can specify --daemonize-socket or --daemonize-tcp-port only once', 1); - } elseif (($opt === '--daemonize-tcp-host' || $opt === '--daemonize-tcp-port') && Config::getValue('daemonize_socket')) { - throw new UsageException("Can specify --daemonize-socket or $opt only once", 1); - } - } - - /** - * @return array<int,string> - * Get the set of files to analyze - */ - public function getFileList() : array - { - return $this->file_list; - } - - const INIT_HELP = <<<'EOT' - --init - [--init-level=3] - [--init-analyze-dir=path/to/src] - [--init-analyze-file=path/to/file.php] - [--init-no-composer] - - Generates a `.phan/config.php` in the current directory - based on the project's composer.json. - The logic used to generate the config file is currently very simple. - Some third party classes (e.g. in vendor/) - will need to be manually added to 'directory_list' or excluded, - and you may end up with a large number of issues to be manually suppressed. - See https://github.com/phan/phan/wiki/Tutorial-for-Analyzing-a-Large-Sloppy-Code-Base - - [--init-level] affects the generated settings in `.phan/config.php` - (e.g. null_casts_as_array). - `--init-level` can be set to 1 (strictest) to 5 (least strict) - [--init-analyze-dir] can be used as a relative path alongside directories - that Phan infers from composer.json's "autoload" settings - [--init-analyze-file] can be used as a relative path alongside files - that Phan infers from composer.json's "bin" settings - [--init-no-composer] can be used to tell Phan that the project - is not a composer project. - Phan will not check for composer.json or vendor/, - and will not include those paths in the generated config. - [--init-overwrite] will allow 'phan --init' to overwrite .phan/config.php. - -EOT; - - // FIXME: If I stop using defined() in UnionTypeVisitor, - // this will warn about the undefined constant EXIT_SUCCESS when a - // user-defined constant is used in parse phase in a function declaration - private static function usage(string $msg = '', int $exit_code = EXIT_SUCCESS, bool $print_extended_help = false) - { - global $argv; - - if ($msg !== '') { - echo "$msg\n"; - } - - $init_help = self::INIT_HELP; - echo <<<EOB -Usage: {$argv[0]} [options] [files...] - -f, --file-list <filename> - A file containing a list of PHP files to be analyzed - - -l, --directory <directory> - A directory that should be parsed for class and - method information. After excluding the directories - defined in --exclude-directory-list, the remaining - files will be statically analyzed for errors. - - Thus, both first-party and third-party code being used by - your application should be included in this list. - - You may include multiple `--directory DIR` options. - - --exclude-file <file> - A file that should not be parsed or analyzed (or read - at all). This is useful for excluding hopelessly - unanalyzable files. - - -3, --exclude-directory-list <dir_list> - A comma-separated list of directories that defines files - that will be excluded from static analysis, but whose - class and method information should be included. - (can be repeated, ignored if --include-analysis-directory-list is used) - - Generally, you'll want to include the directories for - third-party code (such as "vendor/") in this list. - - -I, --include-analysis-file-list <file_list> - A comma-separated list of files that will be included in - static analysis. All others won't be analyzed. - (can be repeated) - - This is primarily intended for performing standalone - incremental analysis. - - -d, --project-root-directory </path/to/project> - Hunt for a directory named `.phan` in the provided directory - and read configuration file `.phan/config.php` from that path. - - -r, --file-list-only - A file containing a list of PHP files to be analyzed to the - exclusion of any other directories or files passed in. This - is unlikely to be useful. - - -k, --config-file - A path to a config file to load (instead of the default of - `.phan/config.php`). - - -m <mode>, --output-mode - Output mode from 'text', 'json', 'csv', 'codeclimate', 'checkstyle', or 'pylint' - - -o, --output <filename> - Output filename - -$init_help - -C, --color - Add colors to the outputted issues. Tested in Unix. - This is recommended for only the default --output-mode ('text') - - -p, --progress-bar - Show progress bar - - -D, --debug - Print debugging output to stderr. Useful for looking into performance issues or crashes. - - -q, --quick - Quick mode - doesn't recurse into all function calls - - -b, --backward-compatibility-checks - Check for potential PHP 5 -> PHP 7 BC issues - - --target-php-version {7.0,7.1,7.2,7.3,7.4,native} - The PHP version that the codebase will be checked for compatibility against. - For best results, the PHP binary used to run Phan should have the same PHP version. - (Phan relies on Reflection for some param counts - and checks for undefined classes/methods/functions) - - -i, --ignore-undeclared - Ignore undeclared functions and classes - - -y, --minimum-severity <level in {0,5,10}> - Minimum severity level (low=0, normal=5, critical=10) to report. - Defaults to 0. - - -c, --parent-constructor-required - Comma-separated list of classes that require - parent::__construct() to be called - - -x, --dead-code-detection - Emit issues for classes, methods, functions, constants and - properties that are probably never referenced and can - be removed. This implies `--unused-variable-detection`. - - --unused-variable-detection - Emit issues for variables, parameters and closure use variables - that are probably never referenced. - This has a few known false positives, e.g. for loops or branches. - - -j, --processes <int> - The number of parallel processes to run during the analysis - phase. Defaults to 1. - - -z, --signature-compatibility - Analyze signatures for methods that are overrides to ensure - compatibility with what they're overriding. - - --disable-cache - Don't cache any ASTs from the polyfill/fallback. - - ASTs from the native parser (php-ast) don't need to be cached. - - This is useful if Phan will be run only once and php-ast is unavailable (e.g. in Travis) - - --disable-plugins - Don't run any plugins. Slightly faster. - - -P, --plugin <pluginName|path/to/Plugin.php> - Add a plugin to run. This flag can be repeated. - (Either pass the name of the plugin or a relative/absolute path to the plugin) - - --strict-method-checking - Warn if any type in a method invocation's object is definitely not an object, - or any type in an invoked expression is not a callable. - (Enables the config option `strict_method_checking`) - - --strict-param-checking - Warn if any type in an argument's union type cannot be cast to - the parameter's expected union type. - (Enables the config option `strict_param_checking`) - - --strict-property-checking - Warn if any type in a property assignment's union type - cannot be cast to a type in the property's declared union type. - (Enables the config option `strict_property_checking`) - - --strict-return-checking - Warn if any type in a returned value's union type - cannot be cast to the declared return type. - (Enables the config option `strict_return_checking`) - - -S, --strict-type-checking - Equivalent to - `--strict-method-checking --strict-param-checking --strict-property-checking --strict-return-checking`. - - --use-fallback-parser - If a file to be analyzed is syntactically invalid - (i.e. "php --syntax-check path/to/file" would emit a syntax error), - then retry, using a different, slower error tolerant parser to parse it. - (And phan will then analyze what could be parsed). - This flag is experimental and may result in unexpected exceptions or errors. - This flag does not affect excluded files and directories. - - --allow-polyfill-parser - If the `php-ast` extension isn't available or is an outdated version, - then use a slower parser (based on tolerant-php-parser) instead. - Note that https://github.com/Microsoft/tolerant-php-parser - has some known bugs which may result in false positive parse errors. - - --force-polyfill-parser - Use a slower parser (based on tolerant-php-parser) instead of the native parser, - even if the native parser is available. - Useful mainly for debugging. - - -s, --daemonize-socket </path/to/file.sock> - Unix socket for Phan to listen for requests on, in daemon mode. - - --daemonize-tcp-host - TCP hostname for Phan to listen for JSON requests on, in daemon mode. - (e.g. 'default', which is an alias for host 127.0.0.1, or `0.0.0.0` for - usage with Docker). `phan_client` can be used to communicate with the Phan Daemon. - - --daemonize-tcp-port <default|1024-65535> - TCP port for Phan to listen for JSON requests on, in daemon mode. - (e.g. 'default', which is an alias for port 4846.) - `phan_client` can be used to communicate with the Phan Daemon. - - -v, --version - Print Phan's version number - - -h, --help - This help information - - --extended-help - This help information, plus less commonly used flags - (E.g. for daemon mode) - -EOB; - if ($print_extended_help) { - echo <<<EOB - -Extended help: - -a, --dump-ast - Emit an AST for each file rather than analyze. - - --dump-parsed-file-list - Emit a newline-separated list of files Phan would parse to stdout. - This is useful to verify that options such as exclude_file_regex are - properly set up, or to run other checks on the files Phan would parse. - - --dump-signatures-file <filename> - Emit JSON serialized signatures to the given file. - This uses a method signature format similar to FunctionSignatureMap.php. - - --automatic-fix - Automatically fix any issues Phan is capable of fixing. - NOTE: This is a work in progress and limited to a small subset of issues - (e.g. unused imports on their own line) - - --find-signature 'paramUnionType1->paramUnionType2->returnUnionType' - Find a signature in the analyzed codebase that is similar to the argument. - See tool/phoogle for examples. - - --memory-limit <memory_limit> - Sets the memory limit for analysis (per process). - This is useful when developing or when you want guarantees on memory limits. - K, M, and G are optional suffixes (Kilobytes, Megabytes, Gigabytes). - - --print-memory-usage-summary - Prints a summary of memory usage and maximum memory usage. - This is accurate when there is one analysis process. - - --markdown-issue-messages - Emit issue messages with markdown formatting. - - --polyfill-parse-all-element-doc-comments - Makes the polyfill aware of doc comments on class constants and declare statements - even when imitating parsing a PHP 7.0 codebase. - - --constant-variable-detection - Emit issues for variables that could be replaced with literals or constants. - (i.e. they are declared once (as a constant expression) and never modified). - This is almost entirely false positives for most coding styles. - Implies --unused-variable-detection - - --language-server-on-stdin - Start the language server (For the Language Server protocol). - This is a different protocol from --daemonize, clients for various IDEs already exist. - - --language-server-tcp-server <addr> - Start the language server listening for TCP connections on <addr> (e.g. 127.0.0.1:<port>) - - --language-server-tcp-connect <addr> - Start the language server and connect to the client listening on <addr> (e.g. 127.0.0.1:<port>) - - --language-server-analyze-only-on-save - Prevent the client from sending change notifications (Only notify the language server when the user saves a document) - This significantly reduces CPU usage, but clients won't get notifications about issues immediately. - - --language-server-disable-go-to-definition, --language-server-enable-go-to-definition - Disables/Enables support for "Go To Definition" and "Go To Type Definition" in the Phan Language Server. - Disabled by default. - - --language-server-disable-hover, --language-server-enable-hover - Disables/Enables support for "Hover" in the Phan Language Server. - Disabled by default. - - --language-server-disable-completion, --language-server-enable-completion - Disables/Enables support for "Completion" in the Phan Language Server. - Disabled by default. - - --language-server-completion-vscode - Adds a workaround to make completion of variables and static properties - that are compatible with language clients such as VS Code. - - --language-server-verbose - Emit verbose logging messages related to the language server implementation to stderr. - This is useful when developing or debugging language server clients. - - --language-server-disable-output-filter - Emit all issues detected from the language server (e.g. invalid phpdoc in parsed files), - not just issues in files currently open in the editor/IDE. - This can be very verbose and has more false positives. - - This is useful when developing or debugging language server clients. - - --language-server-allow-missing-pcntl - No-op (This is the default behavior). - Allow the fallback that doesn't use pcntl (New and experimental) to be used if the pcntl extension is not installed. - This is useful for running the language server on Windows. - - --language-server-hide-category - Remove the Phan issue category from diagnostic messages. - Makes issue messages slightly shorter. - - --language-server-force-missing-pcntl - Force Phan to use the fallback for when pcntl is absent (New and experimental). Useful for debugging that fallback. - - --language-server-require-pcntl - Don't start the language server if PCNTL isn't installed (don't use the fallback). Useful for debugging. - - --require-config-exists - Exit immediately with an error code if `.phan/config.php` does not exist. - - --help-annotations - Print details on annotations supported by Phan - -EOB; - } - if (PHP_VERSION_ID >= 70100 && PHP_VERSION_ID < 70400) { - if (!getenv('PHAN_SUPPRESS_PHP_UPGRADE_NOTICE')) { - fprintf(STDERR, "\nPhan %s is installed (supporting execution with PHP 7.0+), but Phan 2 (supporting execution with PHP 7.1+) has the latest features and bug fixes.\n", CLI::PHAN_VERSION); - } - } - exit($exit_code); - } - - /** - * Finds potentially misspelled flags and returns them as a string - * - * This will use levenshtein distance, showing the first one or two flags - * which match with a distance of <= 5 - * - * @param string $key Misspelled key to attempt to correct - * @return string - * @internal - */ - public static function getFlagSuggestionString( - string $key - ) : string { - $trim = static function (string $s) : string { - return \rtrim($s, ':'); - }; - $generate_suggestion = static function (string $suggestion) : string { - return (strlen($suggestion) === 1 ? '-' : '--') . $suggestion; - }; - $generate_suggestion_text = static function (string $suggestion, string ...$other_suggestions) use ($generate_suggestion) : string { - $suggestions = \array_merge([$suggestion], $other_suggestions); - return ' (did you mean ' . \implode(' or ', \array_map($generate_suggestion, $suggestions)) . '?)'; - }; - $short_options = \array_filter(\array_map($trim, \str_split(self::GETOPT_SHORT_OPTIONS))); - if (strlen($key) === 1) { - $alternate = \ctype_lower($key) ? \strtoupper($key) : \strtolower($key); - if (in_array($alternate, $short_options)) { - return $generate_suggestion_text($alternate); - } - return ''; - } elseif ($key === '') { - return ''; - } - // include short options in case a typo is made like -aa instead of -a - $known_flags = \array_merge(self::GETOPT_LONG_OPTIONS, $short_options); - - $known_flags = \array_map($trim, $known_flags); - - $similarities = []; - - $key_lower = \strtolower($key); - foreach ($known_flags as $flag) { - if (strlen($flag) === 1 && \stripos($key, $flag) === false) { - // Skip over suggestions of flags that have no common characters - continue; - } - $distance = \levenshtein($key_lower, \strtolower($flag)); - // distance > 5 is to far off to be a typo - // Make sure that if two flags have the same distance, ties are sorted alphabetically - if ($distance <= 5) { - $similarities[$flag] = [$distance, "x" . \strtolower($flag), $flag]; - } - } - - \asort($similarities); // retain keys and sort descending - $similarity_values = \array_values($similarities); - - if (count($similarity_values) >= 2 && ($similarity_values[1][0] <= $similarity_values[0][0] + 1)) { - // If the next-closest suggestion isn't close to as similar as the closest suggestion, just return the closest suggestion - return $generate_suggestion_text($similarity_values[0][2], $similarity_values[1][2]); - } elseif (count($similarity_values) >= 1) { - return $generate_suggestion_text($similarity_values[0][2]); - } - return ''; - } - - /** - * Checks if a file (not a folder) which has potentially not yet been created on disk should be parsed. - * @param string $file_path a relative path to a file within the project - */ - public static function shouldParse(string $file_path) : bool - { - $exclude_file_regex = Config::getValue('exclude_file_regex'); - if ($exclude_file_regex && self::isPathExcludedByRegex($exclude_file_regex, $file_path)) { - return false; - } - $file_extensions = Config::getValue('analyzed_file_extensions'); - - if (!\is_array($file_extensions) || count($file_extensions) === 0) { - return false; - } - $extension = \pathinfo($file_path, \PATHINFO_EXTENSION); - if (!$extension || !in_array($extension, $file_extensions)) { - return false; - } - - $directory_regex = Config::getValue('__directory_regex'); - return $directory_regex && \preg_match($directory_regex, $file_path) > 0; - } - - /** - * @param string $directory_name - * The name of a directory to scan for files ending in `.php`. - * - * @return array<string,string> - * A list of PHP files in the given directory - * - * @throws InvalidArgumentException - * if there is nothing to analyze - */ - private static function directoryNameToFileList( - string $directory_name - ) : array { - $file_list = []; - - try { - $file_extensions = Config::getValue('analyzed_file_extensions'); - - if (!\is_array($file_extensions) || count($file_extensions) === 0) { - throw new InvalidArgumentException( - 'Empty list in config analyzed_file_extensions. Nothing to analyze.' - ); - } - - $exclude_file_regex = Config::getValue('exclude_file_regex'); - $iterator = new \CallbackFilterIterator( - new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator( - $directory_name, - \RecursiveDirectoryIterator::FOLLOW_SYMLINKS - ) - ), - static function (\SplFileInfo $file_info) use ($file_extensions, $exclude_file_regex) : bool { - if (!in_array($file_info->getExtension(), $file_extensions, true)) { - return false; - } - - if (!$file_info->isFile() || !$file_info->isReadable()) { - $file_path = $file_info->getRealPath(); - \error_log("Unable to read file {$file_path}"); - return false; - } - - // Compare exclude_file_regex against the relative path within the project - // (E.g. src/foo.php) - if ($exclude_file_regex && self::isPathExcludedByRegex($exclude_file_regex, $file_info->getPathname())) { - return false; - } - - return true; - } - ); - - $file_list = \array_keys(\iterator_to_array($iterator)); - } catch (\Exception $exception) { - \error_log($exception->getMessage()); - } - - // Normalize leading './' in paths. - $normalized_file_list = []; - foreach ($file_list as $file_path) { - $file_path = \preg_replace('@^(\.[/\\\\]+)+@', '', $file_path); - $normalized_file_list[$file_path] = $file_path; - } - \usort($normalized_file_list, static function (string $a, string $b) : int { - // Sort lexicographically by paths **within the results for a directory**, - // to work around some file systems not returning results lexicographically. - // Keep directories together by replacing directory separators with the null byte - // (E.g. "a.b" is lexicographically less than "a/b", but "aab" is greater than "a/b") - return \strcmp(\preg_replace("@[/\\\\]+@", "\0", $a), \preg_replace("@[/\\\\]+@", "\0", $b)); - }); - - return $normalized_file_list; - } - - /** - * Returns true if the progress bar was requested and it makes sense to display. - */ - public static function shouldShowProgress() : bool - { - return (Config::getValue('progress_bar') || Config::getValue('debug_output')) && - !Config::getValue('dump_ast') && - !self::isDaemonOrLanguageServer(); - } - - /** - * Returns true if this is a daemon or language server responding to requests - */ - public static function isDaemonOrLanguageServer() : bool - { - return Config::getValue('daemonize_tcp') || - Config::getValue('daemonize_socket') || - Config::getValue('language_server_config'); - } - - /** - * Should this show --debug output - */ - public static function shouldShowDebugOutput() : bool - { - return Config::getValue('debug_output') && !self::isDaemonOrLanguageServer(); - } - - /** - * Check if a path name is excluded by regex, in a platform independent way. - * Normalizes $path_name on Windows so that '/' is always the directory separator. - * - * @param string $exclude_file_regex - PHP regex - * @param string $path_name - path name within project, beginning with user-provided directory name. - * On windows, may contain '\'. - * - * @return bool - True if the user's configured regex is meant to exclude $path_name - */ - private static function isPathExcludedByRegex( - string $exclude_file_regex, - string $path_name - ) : bool { - // Make this behave the same way on Linux/Unix and on Windows. - if (DIRECTORY_SEPARATOR === '\\') { - $path_name = \str_replace(DIRECTORY_SEPARATOR, '/', $path_name); - } - return \preg_match($exclude_file_regex, $path_name) > 0; - } - - // Bound the percentage to [0, 1] - private static function boundPercentage(float $p) : float - { - return \min(\max($p, 0.0), 1.0); - } - - /** - * Update a progress bar on the screen - * - * @param string $msg - * A short message to display with the progress - * meter - * - * @param float $p - * The percentage to display - * - * @param ?(string|FQSEN|AddressableElement) $details - * Details about what is being analyzed within the phase for $msg - * - * @return void - */ - public static function progress( - string $msg, - float $p, - $details = null - ) { - if (self::shouldShowDebugOutput()) { - self::debugProgress($msg, $p, $details); - return; - } - if (!self::shouldShowProgress()) { - return; - } - - // Bound the percentage to [0, 1] - $p = self::boundPercentage($p); - - static $previous_update_time = 0.0; - $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 files. - if ($time - $previous_update_time < Config::getValue('progress_bar_sample_interval')) { - // Make sure to output 100% if this is one of the last phases, to avoid confusion. - // https://github.com/phan/phan/issues/2694 - if ($p < 1.0 || in_array($msg, ['parse', 'method', 'function'], true)) { - return; - } - } - $previous_update_time = $time; - - $memory = \memory_get_usage() / 1024 / 1024; - $peak = \memory_get_peak_usage() / 1024 / 1024; - - $left_side = \str_pad($msg, 10, ' ', STR_PAD_LEFT) . ' '; - $right_side = - " " . \sprintf("%1$ 3d", (int)(100 * $p)) . "%" . - \sprintf(' %0.2dMB/%0.2dMB', $memory, $peak); - - static $columns = null; - if ($columns === null) { - // Only call this once per process, since it can be rather expensive - $columns = (new Terminal())->getWidth(); - } - // strlen(" 99% 999MB/999MB") == 17 - $used_length = strlen($left_side) + \max(17, strlen($right_side)); - $remaining_length = $columns - $used_length; - $remaining_length = \min(60, \max(0, $remaining_length)); - if ($remaining_length > 0) { - $progress_bar = self::renderInnerProgressBar($remaining_length, $p); - } else { - $progress_bar = ''; - $right_side = \ltrim($right_side); - } - - // Build up a string, then make a single call to fwrite(). Should be slightly faster and smoother to render to the console. - $msg = $left_side . - $progress_bar . - $right_side . - "\r"; - \fwrite(STDERR, $msg); - } - - /** - * Print an end to progress bars or debug output - * @return void - */ - public static function endProgressBar() - { - static $did_end = false; - if ($did_end) { - // Overkill as a sanity check - return; - } - $did_end = true; - if (self::shouldShowDebugOutput()) { - \fwrite(STDERR, "Phan's analysis is complete\n"); - return; - } - if (self::shouldShowProgress()) { - // Print a newline to stderr to visuall separate stderr from stdout - \fwrite(STDERR, \PHP_EOL); - \fflush(\STDOUT); - } - } - - /** - * @return void - * @param ?(string|FQSEN|AddressableElement) $details - */ - public static function debugProgress(string $msg, float $p, $details) - { - $pct = \sprintf("%d%%", (int)(100 * self::boundPercentage($p))); - - if ($details === null) { - return; - } - if ($details instanceof AddressableElement) { - $details = $details->getFQSEN(); - } - switch ($msg) { - case 'parse': - case 'analyze': - $line = "Going to $msg '$details' ($pct)"; - break; - case 'method': - case 'function': - $line = "Going to analyze $msg $details() ($pct)"; - break; - default: - $line = "In $msg phase, processing '$details' ($pct)"; - break; - } - self::debugOutput($line); - } - - /** - * @return void - */ - public static function debugOutput(string $line) - { - \fwrite(STDERR, $line . "\n"); - } - - /** - * 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 > 1.0 / 3) { - // The between character is "Full block" or "Medium shade" or "solid shade". - // The remaining characters on the right are "Full block" (darkest) - $first = $delta > 2.0 / 3 ? "\u{2593}" : "\u{2592}"; - $progress_bar .= $first . str_repeat("\u{2591}", $rest - 1); - } else { - $progress_bar .= str_repeat("\u{2591}", $rest); - } - return $progress_bar; - } - - /** - * Guess if the terminal supports utf-8. - * In some locales, windows is set to a non-utf-8 codepoint. - * - * @see https://github.com/phan/phan/issues/2572 - * @see https://en.wikipedia.org/wiki/Code_page#Windows_code_pages - * @suppress PhanUndeclaredFunction, UnusedSuppression the function exists only in Windows. - */ - public static function doesTerminalSupportUtf8() : bool - { - if (\strtoupper(\substr(PHP_OS, 0, 3)) === 'WIN') { - if (!\function_exists('sapi_windows_cp_is_utf8') || !sapi_windows_cp_is_utf8()) { - return false; - } - } - return true; - } - - /** - * Look for a `.phan/config` file up to a few directories - * up the hierarchy and apply anything in there to - * the configuration. - * @throws UsageException - */ - private function maybeReadConfigFile(bool $require_config_exists) - { - - // If the file doesn't exist here, try a directory up - $config_file_name = $this->config_file; - $config_file_name = - $config_file_name - ? \realpath($config_file_name) - : \implode(DIRECTORY_SEPARATOR, [ - Config::getProjectRootDirectory(), - '.phan', - 'config.php' - ]); - - // Totally cool if the file isn't there - if ($config_file_name === false || !\file_exists($config_file_name)) { - if ($require_config_exists) { - // But if the CLI option --require-config-exists is provided, exit immediately. - // (Include extended help documenting that option) - if ($config_file_name !== false) { - throw new UsageException("Could not find a config file at '$config_file_name', but --require-config-exists was set", EXIT_FAILURE, true); - } else { - $msg = \sprintf( - "Could not figure out the path for config file %s, but --require-config-exists was set", - StringUtil::encodeValue($this->config_file) - ); - throw new UsageException($msg, EXIT_FAILURE, true); - } - } - return; - } - - // Read the configuration file - $config = require($config_file_name); - - // Write each value to the config - foreach ($config as $key => $value) { - Config::setValue($key, $value); - } - } - - /** - * This will assert that ast\parse_code or a polyfill can be called. - * @return void - * @throws AssertionError on failure - */ - private static function ensureASTParserExists() - { - if (Config::getValue('use_polyfill_parser')) { - return; - } - if (!\extension_loaded('ast')) { - \fwrite( - STDERR, - // phpcs:ignore Generic.Files.LineLength.MaxExceeded - "The php-ast extension must be loaded in order for Phan to work. See https://github.com/phan/phan#getting-started for more details. Alternately, invoke Phan with the CLI option --allow-polyfill-parser (which is noticeably slower)\n" - ); - exit(EXIT_FAILURE); - } - - try { - // Split up the opening PHP tag to fix highlighting in vim. - \ast\parse_code( - '<' . '?php 42;', - Config::AST_VERSION - ); - } catch (\LogicException $_) { - \fwrite( - STDERR, - 'Unknown AST version (' - . Config::AST_VERSION - . ') in configuration. ' - . "You may need to rebuild the latest version of the php-ast extension.\n" - . "(You are using php-ast " . (new ReflectionExtension('ast'))->getVersion() . ". Alternately, test with --force-polyfill-parser (which is noticeably slower))\n" - ); - exit(EXIT_FAILURE); - } - - // Workaround for https://github.com/nikic/php-ast/issues/79 - try { - \ast\parse_code( - '<' . '?php syntaxerror', - Config::AST_VERSION - ); - \fwrite( - STDERR, - 'Expected ast\\parse_code to throw ParseError on invalid inputs. Configured AST version: ' - . Config::AST_VERSION - . '. ' - . "You may need to rebuild the latest version of the php-ast extension.\n" - ); - exit(EXIT_FAILURE); - } catch (\ParseError $_) { - // error message may validate with locale and version, don't validate that. - } - } - - /** - * Returns a string that can be used to check if dev-master versions changed (approximately). - * - * This is useful for checking if caches (e.g. of ASTs) should be invalidated. - */ - public static function getDevelopmentVersionId() : string - { - $news_path = \dirname(__DIR__) . '/NEWS.md'; - $version = self::PHAN_VERSION; - if (\file_exists($news_path)) { - $version .= '-' . \filesize($news_path); - } - return $version; - } -} diff --git a/vendor/phan/phan/src/Phan/CodeBase.php b/vendor/phan/phan/src/Phan/CodeBase.php deleted file mode 100644 index 881d2f1..0000000 --- a/vendor/phan/phan/src/Phan/CodeBase.php +++ /dev/null @@ -1,2078 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use AssertionError; -use Closure; -use Exception; -use InvalidArgumentException; -use Phan\CodeBase\ClassMap; -use Phan\CodeBase\UndoTracker; -use Phan\Exception\FQSENException; -use Phan\Language\Context; -use Phan\Language\Element\ClassAliasRecord; -use Phan\Language\Element\ClassConstant; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionFactory; -use Phan\Language\Element\GlobalConstant; -use Phan\Language\Element\Method; -use Phan\Language\Element\Parameter; -use Phan\Language\Element\Property; -use Phan\Language\FQSEN\FullyQualifiedClassConstantName; -use Phan\Language\FQSEN\FullyQualifiedClassElement; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedGlobalConstantName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\FQSEN\FullyQualifiedPropertyName; -use Phan\Language\NamespaceMapEntry; -use Phan\Language\UnionType; -use Phan\Library\Map; -use Phan\Library\Set; -use Phan\Plugin\ConfigPluginSet; -use ReflectionClass; - -use function count; -use function strlen; -use function strtolower; - -use const STDERR; - -/** - * A CodeBase represents the known state of a code base - * we're analyzing. - * - * In order to understand internal classes, interfaces, - * traits and functions, a CodeBase needs to be - * initialized with the list of those elements begotten - * before any classes are loaded. - * - * # Example - * - * ```php - * // Grab these before we define our own classes - * $internal_class_name_list = get_declared_classes(); - * $internal_interface_name_list = get_declared_interfaces(); - * $internal_trait_name_list = get_declared_traits(); - * $internal_function_name_list = get_defined_functions()['internal']; - * - * // Load any required code ... - * - * $code_base = new CodeBase( - * $internal_class_name_list, - * $internal_interface_name_list, - * $internal_trait_name_list, - * CodeBase::getPHPInternalConstantNameList(), - * $internal_function_name_list - * ); - * - * // Do stuff ... - * ``` - * - * This supports undoing some operations in the parse phase, - * for a background daemon analyzing single files. (Phan\CodeBase\UndoTracker) - * - * @phan-file-suppress PhanPartialTypeMismatchReturn the way generic objects is type hinted is inadequate, etc. - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class CodeBase -{ - /** - * @var Map<FullyQualifiedClassName,Clazz> - * A map from FQSEN to an internal or user defined class - * - * TODO: Improve Phan's self-analysis, allow the shorthand array access set syntax to be used without making bad inferences - * (e.g. $this->fqsen_class_map[$fqsen] = $clazz; - */ - private $fqsen_class_map; - - /** - * @var Map<FullyQualifiedClassName,Clazz> - * A map from FQSEN to a user defined class - */ - private $fqsen_class_map_user_defined; - - /** - * @var Map<FullyQualifiedClassName,Clazz> - * A map from FQSEN to an internal class - */ - private $fqsen_class_map_internal; - - /** - * @var Map<FullyQualifiedClassName,ReflectionClass> - * A map from FQSEN to a ReflectionClass - */ - private $fqsen_class_map_reflection; - - /** - * @var Map<FullyQualifiedClassName,ClassAliasRecord> - * A map from FQSEN to set of ClassAliasRecord objects - */ - private $fqsen_alias_map; - - /** - * @var Map<FullyQualifiedGlobalConstantName,GlobalConstant> - * A map from FQSEN to a global constant - */ - private $fqsen_global_constant_map; - - /** - * @var Map<FullyQualifiedFunctionName,Func> - * A map from FQSEN to function - */ - private $fqsen_func_map; - - /** - * @var Set<FullyQualifiedFunctionName> - * A set of internal function FQSENs to lazily initialize. - * Entries are removed as new entries get added to fqsen_func_map. - */ - private $internal_function_fqsen_set; - - /** - * @var Set<Method> - * The set of all methods - */ - private $method_set; - - /** - * @var Map<FullyQualifiedClassName,ClassMap> - * A map from FullyQualifiedClassName to a ClassMap, - * an object that holds properties, methods and class - * constants. - */ - private $class_fqsen_class_map_map; - - /** - * @var array<string,Set<Method>> - * A map from a string method name to a Set of - * Methods - */ - private $name_method_map = []; - - /** - * @var array<string,array<string,array<int,array<string,NamespaceMapEntry>>>> - * Maps the file and namespace identifier to the use statements found in that namespace - */ - private $parsed_namespace_maps = []; - - /** - * @var array<string,array<string,int>> - * Maps file paths to a set of file-level suppressions (E.g. 'PhanUnreferencedUseNormal', etc.) - * The corresponding value is the number of times the issue was suppressed - */ - private $file_level_suppression_set = []; - - /** - * @var bool - * If true, elements will be ensured to be hydrated - * on demand as they are requested. - */ - private $should_hydrate_requested_elements = false; - - /** - * @var UndoTracker|null - undoes the addition of global constants, classes, functions, and methods. - */ - private $undo_tracker; - - /** - * @var bool is the undo tracker currently enabled? - * - * If the Phan Language Server or Daemon Mode is enabled, - * the undo tracker will be enabled prior to the analysis phase, and disabled afterwards. - */ - private $has_enabled_undo_tracker = false; - - /** - * @var bool should Phan expect files contents for any path to be changed frequently - * (i.e. running as Daemon or the language server) - */ - private $expect_changes_to_file_contents = false; - - /** - * @var ?string (The currently parsed or analyzed file, if any. Used only for the crash reporting output) - */ - private static $current_file = null; - - /** - * Initialize a new CodeBase - * TODO: Remove internal_function_name_list completely? - * @param string[] $internal_class_name_list - * @param string[] $internal_interface_name_list - * @param string[] $internal_trait_name_list - * @param string[] $internal_constant_name_list - * @param string[] $internal_function_name_list - */ - public function __construct( - array $internal_class_name_list, - array $internal_interface_name_list, - array $internal_trait_name_list, - array $internal_constant_name_list, - array $internal_function_name_list - ) { - $this->fqsen_class_map = new Map(); - $this->fqsen_class_map_internal = new Map(); - $this->fqsen_class_map_reflection = new Map(); - $this->fqsen_class_map_user_defined = new Map(); - $this->fqsen_alias_map = new Map(); - $this->fqsen_global_constant_map = new Map(); - $this->fqsen_func_map = new Map(); - $this->class_fqsen_class_map_map = new Map(); - $this->method_set = new Set(); - $this->internal_function_fqsen_set = new Set(); - - // Add any pre-defined internal classes, interfaces, - // constants, traits and functions - $this->addClassesByNames($internal_class_name_list); - $this->addClassesByNames($internal_interface_name_list); - $this->addClassesByNames($internal_trait_name_list); - $this->addGlobalConstantsByNames($internal_constant_name_list); - // We initialize the FQSENs early on so that they show up - // in the proper casing. - $this->addInternalFunctionsByNames($internal_function_name_list); - } - - /** - * @return void - */ - public function enableUndoTracking() - { - if ($this->has_enabled_undo_tracker) { - throw new \RuntimeException("Undo tracking already enabled"); - } - $this->has_enabled_undo_tracker = true; - $this->undo_tracker = new UndoTracker(); - } - - /** - * @return void - */ - public function disableUndoTracking() - { - if (!$this->has_enabled_undo_tracker) { - throw new \RuntimeException("Undo tracking was never enabled"); - } - $this->undo_tracker = null; - } - - /** - * @return bool is undo tracking enabled (i.e. are there closures that will revert the side effect of adding a file?) - */ - public function isUndoTrackingEnabled() : bool - { - return $this->undo_tracker !== null; - } - - /** - * @return void - */ - public function setShouldHydrateRequestedElements( - bool $should_hydrate_requested_elements - ) { - $this->should_hydrate_requested_elements = - $should_hydrate_requested_elements; - } - - /** - * @return array<int,string> - The list of files which are successfully parsed. - * This changes whenever the file list is reloaded from disk. - * This also includes files which don't declare classes or functions or globals, - * because those files use classes/functions/constants. - * - * (This is the list prior to any analysis exclusion or whitelisting steps) - */ - public function getParsedFilePathList() : array - { - if ($this->undo_tracker) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $this->undo_tracker->getParsedFilePathList(); - } - throw new \RuntimeException("Calling getParsedFilePathList without an undo tracker"); - } - - /** - * @return int The size of $this->getParsedFilePathList() - */ - public function getParsedFilePathCount() : int - { - if ($this->undo_tracker) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $this->undo_tracker->getParsedFilePathCount(); - } - throw new \RuntimeException("Calling getParsedFilePathCount without an undo tracker"); - } - - /** - * @param string|null $current_parsed_file - * @return void - */ - public function setCurrentParsedFile($current_parsed_file) - { - self::$current_file = $current_parsed_file; - if ($this->undo_tracker) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - $this->undo_tracker->setCurrentParsedFile($current_parsed_file); - } - } - - /** - * Record that changes to file contents should be expected from now onwards, e.g. this is running as a language server or in daemon mode. - * - * E.g. this would disable caching ASTs of the polyfill/fallback to disk. - * - * @return void - */ - public function setExpectChangesToFileContents() - { - $this->expect_changes_to_file_contents = true; - } - - /** - * Returns true if changes to file contents should be expected frequently. - * - * E.g. this is called to check if Phan should disable caching ASTs of the polyfill/fallback to disk. - * - * @return bool - */ - public function getExpectChangesToFileContents() : bool - { - return $this->expect_changes_to_file_contents; - } - - /** - * Sets the currently analyzed file, to improve Phan's crash reporting. - * @param string|null $current_analyzed_file - * @return void - */ - public function setCurrentAnalyzedFile($current_analyzed_file) - { - self::$current_file = $current_analyzed_file; - } - - /** - * Returns the most recently parsed or analyzed file. - * @return ?string - * @internal - For use only by the phan error handler, to help with debugging crashes - */ - public static function getMostRecentlyParsedOrAnalyzedFile() - { - return self::$current_file; - } - - /** - * Called when a file is unparsable. - * Removes the classes and functions, etc. from an older version of the file, if one exists. - * @return void - */ - public function recordUnparsableFile(string $current_parsed_file) - { - if ($this->undo_tracker) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - $this->undo_tracker->recordUnparsableFile($this, $current_parsed_file); - } - } - - /** - * @param string[] $class_name_list - * A list of class names to load type information for - * - * @return void - */ - private function addClassesByNames(array $class_name_list) - { - foreach ($class_name_list as $class_name) { - $reflection_class = new \ReflectionClass($class_name); - if (!$reflection_class->isUserDefined()) { - // include internal classes, but not external classes such as composer - $this->addReflectionClass($reflection_class); - } - } - } - - /** - * @param string[] $const_name_list - * A list of global constant names to load type information for - * - * @return void - */ - private function addGlobalConstantsByNames(array $const_name_list) - { - foreach ($const_name_list as $const_name) { - if (!$const_name) { - // #1015 workaround for empty constant names ('' and '0'). - \fprintf(STDERR, "Saw constant with empty name of %s. There may be a bug in a PECL extension you are using (php -m will list those)\n", \var_export($const_name, true)); - continue; - } - try { - $const_obj = GlobalConstant::fromGlobalConstantName($const_name); - $this->addGlobalConstant($const_obj); - } catch (FQSENException $e) { - $this->handleGlobalConstantException($const_name, $e); - } catch (InvalidArgumentException $e) { - self::handleGlobalConstantException($const_name, $e); - } - } - } - - private static function handleGlobalConstantException(string $const_name, Exception $e) - { - // Workaround for windows bug in #1011 - if (\strncmp($const_name, "\0__COMPILER_HALT_OFFSET__\0", 26) === 0) { - return; - } - // e.g. "\000apc_register_serializer-" APC_SERIALIZER_ABI - if (\strncmp($const_name, "\x00apc_", 5) === 0) { - return; - } - \fprintf(STDERR, "Failed to load global constant value for %s, continuing: %s\n", \var_export($const_name, true), $e->getMessage()); - } - - /** - * @param array<int,string> $new_file_list - * @param array<string,string> $file_mapping_contents maps relative path to absolute paths - * @param ?(string[]) $reanalyze_files files to re-analyze - * @return array<int,string> - Subset of $new_file_list which changed on disk and has to be parsed again. Automatically unparses the old versions of files which were modified. - */ - public function updateFileList(array $new_file_list, array $file_mapping_contents = [], array $reanalyze_files = null) - { - if ($this->undo_tracker) { - $this->invalidateDependentCacheEntries(); - - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $this->undo_tracker->updateFileList($this, $new_file_list, $file_mapping_contents, $reanalyze_files); - } - throw new \RuntimeException("Calling updateFileList without undo tracker"); - } - - /** - * @param string $file_name - * @return bool - true if caller should replace contents - */ - public function beforeReplaceFileContents(string $file_name) - { - if ($this->undo_tracker) { - $this->invalidateDependentCacheEntries(); - - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $this->undo_tracker->beforeReplaceFileContents($this, $file_name); - } - throw new \RuntimeException("Calling replaceFileContents without undo tracker"); - } - - /** - * @return void - */ - public function eagerlyLoadAllSignatures() - { - $this->getInternalClassMap(); // Force initialization of remaining internal php classes to reduce latency of future analysis requests. - $this->forceLoadingInternalFunctions(); // Force initialization of internal functions to reduce latency of future analysis requests. - } - - /** - * @return void - */ - public function forceLoadingInternalFunctions() - { - $internal_function_fqsen_set = $this->internal_function_fqsen_set; - $this->internal_function_fqsen_set = new Set(); // Don't need to track these any more. - foreach ($internal_function_fqsen_set as $function_fqsen) { - // hasFunctionWithFQSEN will automatically load $function_name, **unless** we don't have a signature for that function. - if (!$this->hasFunctionWithFQSEN($function_fqsen)) { - // Force loading these even if automatic loading failed. - // (Shouldn't happen, the function list is fetched from reflection by callers. - $function_alternate_generator = FunctionFactory::functionListFromReflectionFunction( - $function_fqsen, - new \ReflectionFunction($function_fqsen->getNamespacedName()) - ); - foreach ($function_alternate_generator as $function) { - $this->addFunction($function); - } - } - } - } - - /** - * @param string[] $internal_function_name_list - * @return void - * @suppress PhanThrowTypeAbsentForCall - */ - private function addInternalFunctionsByNames(array $internal_function_name_list) - { - foreach ($internal_function_name_list as $function_name) { - $this->internal_function_fqsen_set->attach(FullyQualifiedFunctionName::fromFullyQualifiedString($function_name)); - } - } - - /** - * Clone dependent objects when cloning this object. - */ - public function __clone() - { - $this->fqsen_class_map = - $this->fqsen_class_map->deepCopyValues(); - - $this->fqsen_class_map_user_defined = - new Map(); - - $this->fqsen_class_map_internal = - new Map(); - - foreach ($this->fqsen_class_map as $fqsen => $clazz) { - if ($clazz->isPHPInternal()) { - $this->fqsen_class_map_internal->offsetSet($fqsen, $clazz); - } else { - $this->fqsen_class_map_user_defined->offsetSet($fqsen, $clazz); - } - } - - $this->fqsen_class_map_reflection = - clone($this->fqsen_class_map_reflection); - - $this->fqsen_alias_map = - $this->fqsen_alias_map->deepCopyValues(); - - $this->fqsen_global_constant_map = - $this->fqsen_global_constant_map->deepCopyValues(); - - $this->fqsen_func_map = - $this->fqsen_func_map->deepCopyValues(); - - // NOTE: If this were to become a deep copy, this would also have to update class_map. - // (That also has references to Method, which should be shared in the resulting clone) - $this->method_set = clone($this->method_set); - - $this->class_fqsen_class_map_map = - $this->class_fqsen_class_map_map->deepCopyValues(); - - $this->internal_function_fqsen_set = - clone($this->internal_function_fqsen_set); - - $name_method_map = $this->name_method_map; - $this->name_method_map = []; - foreach ($name_method_map as $name => $method_map) { - $this->name_method_map[$name] = $method_map->deepCopy(); - } - } - - /** - * @param array{clone:CodeBase,callbacks:?(Closure():void)[]} $restore_point - * @return void - */ - public function restoreFromRestorePoint(array $restore_point) - { - $clone = $restore_point['clone']; - - // TODO: Restore the inner state of Clazz objects as well - // (e.g. memoizations, types added in method/analysis phases, plugin changes, etc. - // NOTE: Type::clearAllMemoizations is called elsewhere already. - // @phan-suppress-next-line PhanTypeSuspiciousNonTraversableForeach this is intentionally iterating over the private properties of $clone - foreach ($clone as $key => $value) { - $this->{$key} = $value; - } - - foreach ($restore_point['callbacks'] as $callback) { - if ($callback) { - $callback(); - } - } - } - - /** - * For use by daemon mode when running without pcntl - * Returns a serialized representation of everything in this CodeBase. - * @internal - * @return array{clone:CodeBase,callbacks:(?Closure():void)[]} - */ - public function createRestorePoint() : array - { - // Create a deep copy of this CodeBase - $clone = clone($this); - // make a deep copy of the NamespaceMapEntry objects within parsed_namespace_maps - $clone->parsed_namespace_maps = \unserialize(\serialize($clone->parsed_namespace_maps)); - /** @var array<int,?Closure()> */ - $callbacks = []; - // Create callbacks to restore classes - foreach ($this->fqsen_class_map as $class) { - $callbacks[] = $class->createRestoreCallback(); - } - // Create callbacks to restore methods and global functions - foreach ($this->fqsen_func_map as $func) { - $callbacks[] = $func->createRestoreCallback(); - } - // Create callbacks to back up global constants - // (They may refer to constants from other files. - // The other files may change.) - foreach ($this->fqsen_global_constant_map as $const) { - $callbacks[] = $const->createRestoreCallback(); - } - // Create callbacks to back up global constants - // (They may refer to constants from other files. - // The other files may change.) - foreach ($this->class_fqsen_class_map_map as $class_map) { - // Create callbacks to back up class constants and properties. - // Methods were already backed up. - foreach ($class_map->getClassConstantMap() as $const) { - $callbacks[] = $const->createRestoreCallback(); - } - foreach ($class_map->getPropertyMap() as $property) { - $callbacks[] = $property->createRestoreCallback(); - } - } - - return [ - 'clone' => $clone, - 'callbacks' => $callbacks, - ]; - } - - /** - * @return CodeBase - * A new code base is returned which is a shallow clone - * of this one, which is to say that the sets and maps - * of elements themselves are cloned, but the keys and - * values within those sets and maps are not cloned. - * - * Updates to elements will bleed through code bases - * with only shallow clones. See - * https://github.com/phan/phan/issues/257 - */ - public function shallowClone() : CodeBase - { - $code_base = new CodeBase([], [], [], [], []); - $code_base->fqsen_class_map = - clone($this->fqsen_class_map); - $code_base->fqsen_class_map_user_defined = - clone($this->fqsen_class_map_user_defined); - $code_base->fqsen_class_map_internal = - clone($this->fqsen_class_map_internal); - $code_base->fqsen_class_map_reflection = - clone($this->fqsen_class_map_reflection); - $code_base->fqsen_alias_map = - clone($this->fqsen_alias_map); - - $code_base->fqsen_global_constant_map = - clone($this->fqsen_global_constant_map); - $code_base->fqsen_func_map = - clone($this->fqsen_func_map); - $code_base->internal_function_fqsen_set = - clone($this->internal_function_fqsen_set); - $code_base->class_fqsen_class_map_map = - clone($this->class_fqsen_class_map_map); - $code_base->method_set = - clone($this->method_set); - return $code_base; - } - - /** - * @param Clazz $class - * A class to add. - * - * @return void - */ - public function addClass(Clazz $class) - { - // Map the FQSEN to the class - $fqsen = $class->getFQSEN(); - $this->fqsen_class_map->offsetSet($fqsen, $class); - $this->fqsen_class_map_user_defined->offsetSet($fqsen, $class); - if ($this->undo_tracker) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - $this->undo_tracker->recordUndo(static function (CodeBase $inner) use ($fqsen) { - Daemon::debugf("Undoing addClass %s\n", $fqsen); - $inner->fqsen_class_map->offsetUnset($fqsen); - $inner->fqsen_class_map_user_defined->offsetUnset($fqsen); - // unset($inner->fqsen_class_map_reflection[$fqsen]); // should not be necessary - $inner->class_fqsen_class_map_map->offsetUnset($fqsen); - }); - } - } - - /** - * This should be called in the parse phase - * - * @param array<int,array<string,NamespaceMapEntry>> $namespace_map - * - * @return void - * @internal - */ - public function addParsedNamespaceMap(string $file, string $namespace, int $id, array $namespace_map) - { - $key = "$namespace@$id"; - // print("Adding $file $key count=" .count($namespace_map) . "\n"); - // debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - $this->parsed_namespace_maps[$file][$key] = $namespace_map; - if ($this->undo_tracker) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - $this->undo_tracker->recordUndo(static function (CodeBase $inner) use ($file, $key) { - Daemon::debugf("Undoing addParsedNamespaceMap file = %s namespace = %s\n", $file, $key); - unset($inner->parsed_namespace_maps[$file][$key]); - // Hack: addParsedNamespaceMap is called at least once per each file, so unset file-level suppressions at the same time in daemon mode - unset($inner->file_level_suppression_set[$file]); - }); - } - } - - /** - * This should be called in the analysis phase. - * It retrieves the NamespaceMapEntry built in the parse phase - * (This is implemented this way to allow Phan to know if 'use Foo\Bar' was ever used and warn if it wasn't.) - * - * @param string $file the value of $context->getFile() - * @param string $namespace the namespace value. Probably redundant. - * @param int $id (An incrementing counter for namespaces. 0 or 1 in single namespace/absent namespace files) - * @return array<int,array<string,NamespaceMapEntry>> $namespace_map - * @internal - */ - public function getNamespaceMapFromParsePhase(string $file, string $namespace, int $id) - { - $key = "$namespace@$id"; - - // I'd hope that this is always defined when this is called. - // However, it may not be if files rapidly change and add/remove namespaces? - return $this->parsed_namespace_maps[$file][$key] ?? []; - } - - /** - * @param ReflectionClass $class - * A class to add, lazily. - * - * @return void - */ - public function addReflectionClass(ReflectionClass $class) - { - // Map the FQSEN to the class - try { - $class_fqsen = FullyQualifiedClassName::fromFullyQualifiedString($class->getName()); - $this->fqsen_class_map_reflection->offsetSet($class_fqsen, $class); - } catch (FQSENException $_) { - // Fixes uncaught Phan\Exception\InvalidFQSENException for #2222 - // Just give up on analyzing uses of the class "OCI-Lob" and anything similar - It's invalid because of the hyphen. - } - } - - /** - * Call this to record the existence of a class_alias in the global scope. - * After parse phase is complete (And daemonize has split off a new process), - * call resolveClassAliases() to create FQSEN entries. - * - * @param FullyQualifiedClassName $original - * an existing class to alias to - * - * @param FullyQualifiedClassName $alias - * a name to alias $original to - * - * - * @return void - */ - public function addClassAlias( - FullyQualifiedClassName $original, - FullyQualifiedClassName $alias, - Context $context, - int $lineno - ) { - if (!$this->fqsen_alias_map->offsetExists($original)) { - $this->fqsen_alias_map->offsetSet($original, new Set()); - } - $alias_record = new ClassAliasRecord($alias, $context, $lineno); - $this->fqsen_alias_map->offsetGet($original)->attach($alias_record); - - if ($this->undo_tracker) { - // TODO: Track a count of aliases instead? This doesn't work in daemon mode if multiple files add the same alias to the same class. - // TODO: Allow .phan/config.php to specify aliases or precedences for aliases? - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - $this->undo_tracker->recordUndo(static function (CodeBase $inner) use ($original, $alias_record) { - $fqsen_alias_map = $inner->fqsen_alias_map[$original] ?? null; - if ($fqsen_alias_map) { - $fqsen_alias_map->detach($alias_record); - if ($fqsen_alias_map->count() == 0) { - unset($inner->fqsen_alias_map[$original]); - } - } - }); - } - } - - /** - * @return void - */ - public function resolveClassAliases() - { - if ($this->undo_tracker) { - throw new AssertionError('should only call this after daemon mode is finished'); - } - // loop through fqsen_alias_map and add entries to fqsen_class_map. - foreach ($this->fqsen_alias_map as $original_fqsen => $alias_set) { - $this->resolveClassAliasesForAliasSet($original_fqsen, $alias_set); - } - } - - /** - * @return void - */ - private function resolveClassAliasesForAliasSet(FullyQualifiedClassName $original_fqsen, Set $alias_set) - { - if (!$this->hasClassWithFQSEN($original_fqsen)) { - // The original class does not exist. - // Emit issues at the point of every single class_alias call with that original class. - foreach ($alias_set as $alias_record) { - if (!($alias_record instanceof ClassAliasRecord)) { - throw new AssertionError("Expected instances of ClassAliasRecord in alias_set"); - } - $suggestion = IssueFixSuggester::suggestSimilarClass($this, $alias_record->context, $original_fqsen); - - Issue::maybeEmitWithParameters( - $this, - $alias_record->context, - Issue::UndeclaredClassAliasOriginal, - $alias_record->lineno, - [$original_fqsen, $alias_record->alias_fqsen], - $suggestion - ); - } - return; - } - // The original class exists. Attempt to create aliases of the original class. - $class = $this->getClassByFQSEN($original_fqsen); - foreach ($alias_set as $alias_record) { - if (!($alias_record instanceof ClassAliasRecord)) { - throw new AssertionError("Expected instances of ClassAliasRecord in alias_set"); - } - $alias_fqsen = $alias_record->alias_fqsen; - // Don't do anything if there is a real class, or if an earlier class_alias created an alias. - if ($this->hasClassWithFQSEN($alias_fqsen)) { - // Emit a different issue type to make filtering out false positives easier. - $clazz = $this->getClassByFQSEN($alias_fqsen); - Issue::maybeEmit( - $this, - $alias_record->context, - Issue::RedefineClassAlias, - $alias_record->lineno, - $alias_fqsen, - $alias_record->context->getFile(), - $alias_record->lineno, - $clazz->getFQSEN(), - $clazz->getFileRef()->getFile(), - $clazz->getFileRef()->getLineNumberStart() - ); - } else { - $this->fqsen_class_map->offsetSet($alias_fqsen, $class); - } - } - } - - /** - * @return bool - * True if a Clazz with the given FQSEN exists - */ - public function hasClassWithFQSEN( - FullyQualifiedClassName $fqsen - ) : bool { - if ($this->fqsen_class_map->offsetExists($fqsen)) { - return true; - } - return $this->lazyLoadPHPInternalClassWithFQSEN($fqsen); - } - - /** - * @return bool - * True if a Clazz with the given FQSEN was created - */ - private function lazyLoadPHPInternalClassWithFQSEN( - FullyQualifiedClassName $fqsen - ) : bool { - if ($this->fqsen_class_map_reflection->offsetExists($fqsen)) { - $reflection_class = $this->fqsen_class_map_reflection->offsetGet($fqsen); - $this->loadPHPInternalClassWithFQSEN($fqsen, $reflection_class); - return true; - } - return false; - } - - /** @return void */ - private function loadPHPInternalClassWithFQSEN( - FullyQualifiedClassName $fqsen, - ReflectionClass $reflection_class - ) { - $class = Clazz::fromReflectionClass($this, $reflection_class); - $this->fqsen_class_map->offsetSet($fqsen, $class); - $this->fqsen_class_map_internal->offsetSet($fqsen, $class); - $this->fqsen_class_map_reflection->offsetUnset($fqsen); - } - - /** - * @param FullyQualifiedClassName $fqsen - * The FQSEN of a class to get - * - * @return Clazz - * A class with the given FQSEN - */ - public function getClassByFQSEN( - FullyQualifiedClassName $fqsen - ) : Clazz { - $clazz = $this->fqsen_class_map->offsetGet($fqsen); - - // This is an optimization that saves us a few minutes - // on very large code bases. - // - // Instead of 'hydrating' all classes (expanding their - // types and importing parent methods, properties, etc.) - // all in one go, we just do it on the fly as they're - // requested. When running as multiple processes this - // lets us avoid a significant amount of hydration per - // process. - if ($this->should_hydrate_requested_elements) { - $clazz->hydrate($this); - } - - return $clazz; - } - - /** - * @param FullyQualifiedClassName $fqsen - * The FQSEN of a class to get - * - * @return Clazz - * A class with the given FQSEN - */ - public function getClassByFQSENWithoutHydrating( - FullyQualifiedClassName $fqsen - ) : Clazz { - return $this->fqsen_class_map->offsetGet($fqsen); - } - - /** - * @param FullyQualifiedClassName $original - * The FQSEN of class to get aliases of - * - * @return ClassAliasRecord[] - * A list of all aliases of $original (and their definitions) - */ - public function getClassAliasesByFQSEN( - FullyQualifiedClassName $original - ) : array { - if ($this->fqsen_alias_map->offsetExists($original)) { - return $this->fqsen_alias_map->offsetGet($original)->toArray(); - } - - return []; - } - - - /** - * @return Map<FullyQualifiedClassName,Clazz> - * A map from FQSENs to classes which are internal. - */ - public function getUserDefinedClassMap() : Map - { - return $this->fqsen_class_map_user_defined; - } - - /** - * @return Map<FullyQualifiedClassName,Clazz> - * A list of all classes which are internal. - */ - public function getInternalClassMap() : Map - { - if (\count($this->fqsen_class_map_reflection) > 0) { - $fqsen_class_map_reflection = $this->fqsen_class_map_reflection; - // Free up memory used by old class map. Prevent it from being freed before we can load it manually. - $this->fqsen_class_map_reflection = new Map(); - foreach ($fqsen_class_map_reflection as $fqsen => $reflection_class) { - $this->loadPHPInternalClassWithFQSEN($fqsen, $reflection_class); - } - } - // TODO: Resolve internal classes and optimize the implementation. - return $this->fqsen_class_map_internal; - } - - /** - * @param Method $method - * A method to add to the code base - * - * @return void - */ - public function addMethod(Method $method) - { - // Add the method to the map - $this->getClassMapByFQSEN( - $method->getFQSEN() - )->addMethod($method); - - $this->method_set->attach($method); - - // If we're doing dead code detection(or something else) and this is a - // method, map the name to the FQSEN so we can do hail- - // mary references. - if (Config::get_track_references()) { - if (!isset($this->name_method_map[$method->getFQSEN()->getNameWithAlternateId()])) { - $this->name_method_map[$method->getFQSEN()->getNameWithAlternateId()] = new Set(); - } - $this->name_method_map[$method->getFQSEN()->getNameWithAlternateId()]->attach($method); - } - if ($this->undo_tracker) { - // The addClass's recordUndo should remove the class map. Only need to remove it from method_set - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - $this->undo_tracker->recordUndo(static function (CodeBase $inner) use ($method) { - $inner->method_set->detach($method); - }); - } - } - - /** - * @return bool - * True if an element with the given FQSEN exists - */ - public function hasMethodWithFQSEN( - FullyQualifiedMethodName $fqsen - ) : bool { - return $this->getClassMapByFullyQualifiedClassName( - $fqsen->getFullyQualifiedClassName() - )->hasMethodWithName( - $fqsen->getNameWithAlternateId() - ); - } - - /** - * @param FullyQualifiedMethodName $fqsen - * The FQSEN of a method to get - * - * @return Method - * A method with the given FQSEN - */ - public function getMethodByFQSEN( - FullyQualifiedMethodName $fqsen - ) : Method { - return $this->getClassMapByFullyQualifiedClassName( - $fqsen->getFullyQualifiedClassName() - )->getMethodByName( - $fqsen->getNameWithAlternateId() - ); - } - - /** - * @return array<string,Method> - * The set of methods associated with the given class - */ - public function getMethodMapByFullyQualifiedClassName( - FullyQualifiedClassName $fqsen - ) : array { - return $this->getClassMapByFullyQualifiedClassName( - $fqsen - )->getMethodMap(); - } - - /** - * @return Set<Method> - * A set of all known methods with the given name - */ - public function getMethodSetByName(string $name) : Set - { - if (!Config::get_track_references()) { - throw new AssertionError( - __METHOD__ . ' can only be called when dead code ' - . ' detection (or force_tracking_references) is enabled.' - ); - } - - return $this->name_method_map[$name] ?? new Set(); - } - - /** - * @return Set<Func|Method> - * The set of all methods and functions - * - * This is slow and should be used only for debugging. - */ - private function getFunctionAndMethodSet() : Set - { - $set = clone($this->method_set); - foreach ($this->fqsen_func_map as $value) { - $set->attach($value); - } - return $set; - } - - /** - * @return Set<Method> - * The set of all methods that Phan is tracking. - */ - public function getMethodSet() : Set - { - return $this->method_set; - } - - /** - * @return array<string,array<string,string>> - * A human readable encoding of $this->func_and_method_set [string $function_or_method_name => [int|string $pos => string $spec]] - * Excludes internal functions and methods. - * - * This can be used for debugging Phan's inference - */ - public function exportFunctionAndMethodSet() : array - { - $result = []; - foreach ($this->getFunctionAndMethodSet() as $function_or_method) { - if ($function_or_method->isPHPInternal()) { - continue; - } - $fqsen = $function_or_method->getFQSEN(); - $function_or_method_name = (string)$fqsen; - $signature = [(string)$function_or_method->getUnionType()]; - foreach ($function_or_method->getParameterList() as $param) { - $name = $param->getName(); - $param_type = (string)$param->getUnionType(); - if ($param->isVariadic()) { - $name = '...' . $name; - } - if ($param->isPassByReference()) { - $name = '&' . $name; - } - if ($param->isOptional()) { - $name .= '='; - } - $signature[$name] = $param_type; - } - $result[$function_or_method_name] = $signature; - } - \ksort($result); - return $result; - } - - /** - * @param Func $function - * A function to add to the code base - * - * @return void - */ - public function addFunction(Func $function) - { - // Add it to the map of functions - $this->fqsen_func_map[$function->getFQSEN()] = $function; - - if ($this->undo_tracker) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - $this->undo_tracker->recordUndo(static function (CodeBase $inner) use ($function) { - Daemon::debugf("Undoing addFunction on %s\n", $function->getFQSEN()); - unset($inner->fqsen_func_map[$function->getFQSEN()]); - }); - } - } - - /** - * @return bool - * True if an element with the given FQSEN exists - */ - public function hasFunctionWithFQSEN( - FullyQualifiedFunctionName $fqsen - ) : bool { - $has_function = $this->fqsen_func_map->contains($fqsen); - - if ($has_function) { - return true; - } - - // Make the following checks: - // - // 1. this is an internal function that hasn't been loaded yet. - // 2. Unless 'ignore_undeclared_functions_with_known_signatures' is true, require that the current php binary or it's extensions define this function before that. - return $this->hasInternalFunctionWithFQSEN($fqsen); - } - - /** - * @param FullyQualifiedFunctionName $fqsen - * The FQSEN of a function to get - * - * @return Func - * A function with the given FQSEN - */ - public function getFunctionByFQSEN( - FullyQualifiedFunctionName $fqsen - ) : Func { - return $this->fqsen_func_map[$fqsen]; - } - - /** - * @return Map<FullyQualifiedFunctionName,Func> - */ - public function getFunctionMap() : Map - { - return $this->fqsen_func_map; - } - - /** - * @param ClassConstant $class_constant - * A class constant to add to the code base - * - * @return void - */ - public function addClassConstant(ClassConstant $class_constant) - { - $this->getClassMapByFullyQualifiedClassName( - $class_constant->getClassFQSEN() - )->addClassConstant($class_constant); - } - - /** - * @return bool - * True if an element with the given FQSEN exists - */ - public function hasClassConstantWithFQSEN( - FullyQualifiedClassConstantName $fqsen - ) : bool { - return $this->getClassMapByFullyQualifiedClassName( - $fqsen->getFullyQualifiedClassName() - )->hasClassConstantWithName($fqsen->getNameWithAlternateId()); - } - - /** - * @param FullyQualifiedClassConstantName $fqsen - * The FQSEN of a class constant to get - * - * @return ClassConstant - * A class constant with the given FQSEN - */ - public function getClassConstantByFQSEN( - FullyQualifiedClassConstantName $fqsen - ) : ClassConstant { - return $this->getClassMapByFullyQualifiedClassName( - $fqsen->getFullyQualifiedClassName() - )->getClassConstantByName($fqsen->getNameWithAlternateId()); - } - - /** - * @return ClassConstant[] - * The set of class constants associated with the given class - */ - public function getClassConstantMapByFullyQualifiedClassName( - FullyQualifiedClassName $fqsen - ) : array { - return $this->getClassMapByFullyQualifiedClassName( - $fqsen - )->getClassConstantMap(); - } - - /** - * @param GlobalConstant $global_constant - * A global constant to add to the code base - * - * @return void - */ - public function addGlobalConstant(GlobalConstant $global_constant) - { - $this->fqsen_global_constant_map[ - $global_constant->getFQSEN() - ] = $global_constant; - if ($this->undo_tracker) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - $this->undo_tracker->recordUndo(static function (CodeBase $inner) use ($global_constant) { - Daemon::debugf("Undoing addGlobalConstant on %s\n", $global_constant->getFQSEN()); - unset($inner->fqsen_global_constant_map[$global_constant->getFQSEN()]); - }); - } - } - - /** - * @return bool - * True if an element with the given FQSEN exists - */ - public function hasGlobalConstantWithFQSEN( - FullyQualifiedGlobalConstantName $fqsen - ) : bool { - return $this->fqsen_global_constant_map->offsetExists($fqsen); - } - - /** - * @param FullyQualifiedGlobalConstantName $fqsen - * The FQSEN of a global constant to get - * - * @return GlobalConstant - * A global constant with the given FQSEN - */ - public function getGlobalConstantByFQSEN( - FullyQualifiedGlobalConstantName $fqsen - ) : GlobalConstant { - return $this->fqsen_global_constant_map[$fqsen]; - } - - /** - * @return Map<FullyQualifiedGlobalConstantName,GlobalConstant> - */ - public function getGlobalConstantMap() : Map - { - return $this->fqsen_global_constant_map; - } - - /** - * @param Property $property - * A property to add to the code base - * - * @return void - */ - public function addProperty(Property $property) - { - return $this->getClassMapByFullyQualifiedClassName( - $property->getClassFQSEN() - )->addProperty($property); - } - - /** - * @return bool - * True if an element with the given FQSEN exists - */ - public function hasPropertyWithFQSEN( - FullyQualifiedPropertyName $fqsen - ) : bool { - return $this->getClassMapByFullyQualifiedClassName( - $fqsen->getFullyQualifiedClassName() - )->hasPropertyWithName($fqsen->getNameWithAlternateId()); - } - - /** - * @param FullyQualifiedPropertyName $fqsen - * The FQSEN of a property to get - * - * @return Property - * A property with the given FQSEN - */ - public function getPropertyByFQSEN( - FullyQualifiedPropertyName $fqsen - ) : Property { - return $this->getClassMapByFullyQualifiedClassName( - $fqsen->getFullyQualifiedClassName() - )->getPropertyByName($fqsen->getNameWithAlternateId()); - } - - /** - * @return Property[] - * The set of properties associated with the given class - */ - public function getPropertyMapByFullyQualifiedClassName( - FullyQualifiedClassName $fqsen - ) : array { - return $this->getClassMapByFullyQualifiedClassName( - $fqsen - )->getPropertyMap(); - } - - /** - * @param FullyQualifiedClassElement $fqsen - * The FQSEN of a class element - * - * @return ClassMap - * Get the class map for an FQSEN representing - * a class element - */ - private function getClassMapByFQSEN( - FullyQualifiedClassElement $fqsen - ) : ClassMap { - return $this->getClassMapByFullyQualifiedClassName( - $fqsen->getFullyQualifiedClassName() - ); - } - - /** - * @param FullyQualifiedClassName $fqsen - * The FQSEN of a class - * - * @return ClassMap - * Get the class map for an FQSEN representing - * a class element - */ - private function getClassMapByFullyQualifiedClassName( - FullyQualifiedClassName $fqsen - ) : ClassMap { - $class_fqsen_class_map_map = $this->class_fqsen_class_map_map; - if ($class_fqsen_class_map_map->offsetExists($fqsen)) { - return $class_fqsen_class_map_map->offsetGet($fqsen); - } - $class_fqsen_class_map_map->offsetSet($fqsen, new ClassMap()); - return $class_fqsen_class_map_map->offsetGet($fqsen); - } - - /** - * @return Map<FullyQualifiedClassName,ClassMap> - */ - public function getClassMapMap() : Map - { - return $this->class_fqsen_class_map_map; - } - - /** - * @param FullyQualifiedFunctionName $fqsen - * The FQSEN of a function we'd like to look up - * - * @return bool - * If the FQSEN represents an internal function that - * hasn't been loaded yet, true is returned. - */ - private function hasInternalFunctionWithFQSEN( - FullyQualifiedFunctionName $fqsen - ) : bool { - $canonical_fqsen = $fqsen->withAlternateId(0); - $found = isset($this->internal_function_fqsen_set[$canonical_fqsen]); - if (!$found) { - // Act as though functions don't exist if they aren't loaded into the php binary - // running phan (or that binary's extensions), even if the signature map contains them. - // (All of the functions were loaded during initialization) - // - // Also, skip over user-defined global functions defined **by Phan** and its dependencies for analysis - if (!Config::getValue('ignore_undeclared_functions_with_known_signatures')) { - return false; - } - // If we already created the alternates, do nothing. - // TODO: This assumes we call hasFunctionWithFQSEN before adding. - if ($this->fqsen_func_map->offsetExists($canonical_fqsen)) { - return false; - } - } - - $name = $canonical_fqsen->getName(); - if ($canonical_fqsen->getNamespace() !== '\\') { - $name = \ltrim($canonical_fqsen->getNamespace(), '\\') . '\\' . $name; - } - - // For elements in the root namespace, check to see if - // there's a static method signature for something that - // hasn't been loaded into memory yet and create a - // method out of it as it's requested - - $function_signature_map = - UnionType::internalFunctionSignatureMap(Config::get_closest_target_php_version_id()); - - // Don't need to track this any more - unset($this->internal_function_fqsen_set[$canonical_fqsen]); - - if (isset($function_signature_map[$name])) { - $signature = $function_signature_map[$name]; - - // Add each method returned for the signature - foreach (FunctionFactory::functionListFromSignature( - $canonical_fqsen, - $signature - ) as $function) { - if ($found) { - $reflection_function = new \ReflectionFunction($name); - $function->setIsDeprecated($reflection_function->isDeprecated()); - $function->setRealReturnType(UnionType::fromReflectionType($reflection_function->getReturnType())); - $function->setRealParameterList(Parameter::listFromReflectionParameterList($reflection_function->getParameters())); - } - $this->addFunction($function); - $this->updatePluginsOnLazyLoadInternalFunction($function); - } - - return true; - } elseif ($found) { - // Phan doesn't have extended information for the signature for this function, but the function exists. - foreach (FunctionFactory::functionListFromReflectionFunction( - $canonical_fqsen, - new \ReflectionFunction($name) - ) as $function) { - $this->addFunction($function); - $this->updatePluginsOnLazyLoadInternalFunction($function); - } - - return true; - } - return false; - } - - private function updatePluginsOnLazyLoadInternalFunction(Func $function) - { - ConfigPluginSet::instance()->handleLazyLoadInternalFunction($this, $function); - } - - /** - * @return int - * The total number of elements of all types in the - * code base. - */ - public function totalElementCount() : int - { - $sum = ( - \count($this->getFunctionMap()) - + \count($this->getGlobalConstantMap()) - + \count($this->getUserDefinedClassMap()) - + \count($this->fqsen_class_map_internal) // initialized internal classes - + \count($this->fqsen_class_map_reflection) // uninitialized internal classes - ); - - foreach ($this->getClassMapMap() as $class_map) { - $sum += ( - \count($class_map->getClassConstantMap()) - + \count($class_map->getPropertyMap()) - + \count($class_map->getMethodMap()) - ); - } - - return $sum; - } - - /** - * @param string $file_path @phan-unused-param - * @return void - */ - public function flushDependenciesForFile(string $file_path) - { - // TODO: ... - } - - /** - * @param string $file_path @phan-unused-param - * @return string[] - * The list of files that depend on the code in the given - * file path - */ - public function dependencyListForFile(string $file_path) : array - { - // TODO: ... - return []; - } - - /** - * @return array<int,string> every constant name except user-defined constants. - */ - public static function getPHPInternalConstantNameList() : array - { - // Unit tests call this on every test case. Cache the **internal** constants in a static variable for efficiency; those won't change. - static $constant_name_list = null; - if ($constant_name_list === null) { - // 'true', 'false', and 'null' aren't actually defined constants, they're keywords? Add them so that analysis won't break. - $constant_name_list = \array_keys(\array_merge(['true' => true, 'false' => false, 'null' => null], ...\array_values( - \array_diff_key(\get_defined_constants(true), ['user' => []]) - ))); - } - return $constant_name_list; - } - - /** - * @param string $file path to a file - * @param string $issue_type (e.g. 'PhanUnreferencedUseNormal') - * @return void - */ - public function addFileLevelSuppression(string $file, string $issue_type) - { - // TODO: Modify the implementation so that it can be checked by UnusedSuppressionPlugin. - if (!isset($this->file_level_suppression_set[$file][$issue_type])) { - $this->file_level_suppression_set[$file][$issue_type] = 0; - } - } - - /** - * @param string $file path to a file - * @param string $issue_type (e.g. 'PhanUnreferencedUseNormal') - */ - public function hasFileLevelSuppression(string $file, string $issue_type) : bool - { - // TODO: Modify the implementation so that it can be checked by UnusedSuppressionPlugin. - if (isset($this->file_level_suppression_set[$file][$issue_type])) { - ++$this->file_level_suppression_set[$file][$issue_type]; - return true; - } - return false; - } - - /** - * @var array<string,array<string,string>>|null - * Maps lowercase class name to (lowercase namespace => namespace) - */ - private $namespaces_for_class_names = null; - - /** - * @var array<string,array<string,string>>|null - * Maps lowercase function name to (lowercase namespace => namespace) - */ - private $namespaces_for_function_names = null; - - /** - * @var array<string,array<string,string>>|null - * Maps lowercase class name to (lowercase class => class) - */ - private $class_names_in_namespace = null; - - /** - * @var array<string,array<string,string>>|null - * Maps lowercase function name to (lowercase function => function) - */ - private $function_names_in_namespace = null; - - /** - * @var array<string,array<int,array<string,string>>>|null - * Maps lowercase class name to (requested approximate length to (lowercase class => class)) - */ - private $class_names_near_strlen_in_namespace = null; - - /** - * @var array<string,array<int,array<string,string>>>|null - * Maps lowercase function name to (requested approximate length to (lowercase function => function)) - */ - private $function_names_near_strlen_in_namespace = null; - - private function invalidateDependentCacheEntries() - { - // TODO: Should refactor suggestions logic into a separate class - $this->namespaces_for_class_names = null; - $this->namespaces_for_function_names = null; - $this->class_names_in_namespace = null; - $this->function_names_in_namespace = null; - $this->class_names_near_strlen_in_namespace = null; - $this->function_names_near_strlen_in_namespace = null; - $this->constant_lookup_map_for_name = null; - } - - /** - * @return array<string,array<string,string>> - */ - private function getNamespacesForClassNames() - { - return $this->namespaces_for_class_names ?? ($this->namespaces_for_class_names = $this->computeNamespacesForClassNames()); - } - - /** - * @return array<string,array<string,string>> - */ - private function getNamespacesForFunctionNames() - { - return $this->namespaces_for_function_names ?? ($this->namespaces_for_function_names = $this->computeNamespacesForFunctionNames()); - } - - /** - * @return array<string,array<string,string>> a list of namespaces which have each class name - */ - private function computeNamespacesForClassNames() : array - { - $class_fqsen_list = []; - // NOTE: This helper performs shallow clones to avoid interfering with the iteration pointer - // in other iterations over these class maps - foreach (clone($this->fqsen_class_map_user_defined) as $class_fqsen => $_) { - $class_fqsen_list[] = $class_fqsen; - } - foreach (clone($this->fqsen_class_map_internal) as $class_fqsen => $_) { - $class_fqsen_list[] = $class_fqsen; - } - - $suggestion_set = []; - foreach ($class_fqsen_list as $class_fqsen) { - $namespace = $class_fqsen->getNamespace(); - $suggestion_set[strtolower($class_fqsen->getName())][strtolower($namespace)] = $namespace; - } - foreach (clone($this->fqsen_class_map_reflection) as $reflection_class) { - $namespace = '\\' . $reflection_class->getNamespaceName(); - // https://secure.php.net/manual/en/reflectionclass.getnamespacename.php - $suggestion_set[strtolower($reflection_class->getShortName())][strtolower($namespace)] = $namespace; - } - return $suggestion_set; - } - - /** - * @return array<string,array<string,string>> a list of namespaces which have each function name - */ - private function computeNamespacesForFunctionNames() : array - { - $function_fqsen_list = []; - // NOTE: This helper performs shallow clones to avoid interfering with the iteration pointer - // in other iterations over these function maps - foreach (clone($this->fqsen_func_map) as $function_fqsen => $_) { - $function_fqsen_list[] = $function_fqsen; - } - foreach (clone($this->internal_function_fqsen_set) as $function_fqsen) { - $function_fqsen_list[] = $function_fqsen; - } - - $suggestion_set = []; - foreach ($function_fqsen_list as $function_fqsen) { - $namespace = $function_fqsen->getNamespace(); - $suggestion_set[strtolower($function_fqsen->getName())][strtolower($namespace)] = $namespace; - } - return $suggestion_set; - } - - /** - * @return array<int,FullyQualifiedClassName> (Don't rely on unique names) - */ - private function getClassFQSENList() - { - $class_fqsen_list = []; - // NOTE: This helper performs shallow clones to avoid interfering with the iteration pointer - // in other iterations over these class maps - foreach (clone($this->fqsen_class_map_user_defined) as $class_fqsen => $_) { - $class_fqsen_list[] = $class_fqsen; - } - foreach (clone($this->fqsen_class_map_internal) as $class_fqsen => $_) { - $class_fqsen_list[] = $class_fqsen; - } - return $class_fqsen_list; - } - - /** - * @return array<string,array<string,string>> a list of namespaces which have each class name - */ - private function getClassNamesInNamespaceMap() : array - { - return $this->class_names_in_namespace ?? ($this->class_names_in_namespace = $this->computeClassNamesInNamespace()); - } - - /** - * @return array<string,array<string,string>> a list of namespaces which have each function name - */ - private function getFunctionNamesInNamespaceMap() : array - { - return $this->function_names_in_namespace ?? ($this->function_names_in_namespace = $this->computeFunctionNamesInNamespace()); - } - - /** - * @return array<string,string> a list of class names in $namespace - */ - public function getClassNamesOfNamespace(string $namespace) : array - { - $namespace = strtolower($namespace); - if (\substr($namespace, 0, 1) !== '\\') { - $namespace = "\\$namespace"; - } - return $this->getClassNamesInNamespaceMap()[$namespace] ?? []; - } - - /** - * @return array<string,string> a list of function names in $namespace - */ - public function getFunctionNamesOfNamespace(string $namespace) : array - { - $namespace = strtolower($namespace); - if (\substr($namespace, 0, 1) !== '\\') { - $namespace = "\\$namespace"; - } - return $this->getFunctionNamesInNamespaceMap()[$namespace] ?? []; - } - - /** - * This limits the suggested class names from getClassNamesOfNamespace for $namespace_lower to - * the names which are similar enough in length to be a potential suggestion - * @return array<string,string> - */ - private function getSimilarLengthClassNamesForNamespace(string $namespace, int $strlen) : array - { - $namespace = strtolower($namespace); - $class_names = $this->getClassNamesOfNamespace($namespace); - if (count($class_names) === 0) { - return []; - } - return $this->class_names_near_strlen_in_namespace[$namespace][$strlen] - ?? ($this->class_names_near_strlen_in_namespace[$namespace][$strlen] = self::computeSimilarLengthClassNamesForNamespace($class_names, $strlen)); - } - - /** - * This limits the suggested function names from getFunctionNamesOfNamespace for $namespace_lower to - * the names which are similar enough in length to be a potential suggestion - * @return array<string,string> - */ - private function getSimilarLengthFunctionNamesForNamespace(string $namespace, int $strlen) : array - { - $namespace = strtolower($namespace); - $function_names = $this->getFunctionNamesOfNamespace($namespace); - if (count($function_names) === 0) { - return []; - } - return $this->function_names_near_strlen_in_namespace[$namespace][$strlen] - ?? ($this->function_names_near_strlen_in_namespace[$namespace][$strlen] = self::computeSimilarLengthFunctionNamesForNamespace($function_names, $strlen)); - } - - /** - * For use with IssueFixSuggester::getSuggestionsForStringSet - * @param array<string,string> $class_names - * @return array<string,string> similar matches - */ - private static function computeSimilarLengthClassNamesForNamespace(array $class_names, int $strlen) - { - $max_levenshtein_distance = (int)(1 + $strlen / 6); - $results = []; - - foreach ($class_names as $name_lower => $name) { - if (\abs(strlen($name) - $strlen) <= $max_levenshtein_distance) { - $results[$name_lower] = $name; - } - } - return $results; - } - - /** - * For use with IssueFixSuggester::getSuggestionsForStringSet - * @param array<string,string> $function_names - * @return array<string,string> similar matches - */ - private function computeSimilarLengthFunctionNamesForNamespace(array $function_names, int $strlen) - { - // Currently behaves the same way - return $this->computeSimilarLengthClassNamesForNamespace($function_names, $strlen); - } - - /** - * @return array<string,array<string,string>> maps namespace name to unique classes in that namespace. - */ - private function computeClassNamesInNamespace() : array - { - $class_fqsen_list = $this->getClassFQSENList(); - - $suggestion_set = []; - foreach ($class_fqsen_list as $class_fqsen) { - $namespace = $class_fqsen->getNamespace(); - $name = $class_fqsen->getName(); - $suggestion_set[strtolower($namespace)][strtolower($name)] = $name; - } - foreach (clone($this->fqsen_class_map_reflection) as $reflection_class) { - $namespace = '\\' . $reflection_class->getNamespaceName(); - $name = '\\' . $reflection_class->getName(); - // https://secure.php.net/manual/en/reflectionclass.getnamespacename.php - $suggestion_set[strtolower($namespace)][strtolower($name)] = $name; - } - return $suggestion_set; - } - - /** - * @return array<string,array<string,string>> maps namespace name to unique functions in that namespace. - */ - private function computeFunctionNamesInNamespace() : array - { - $suggestion_set = []; - foreach (clone($this->fqsen_func_map) as $function_fqsen => $_) { - $namespace = $function_fqsen->getNamespace(); - $name = $function_fqsen->getName(); - $suggestion_set[strtolower($namespace)][strtolower($name)] = $name; - } - foreach (clone($this->internal_function_fqsen_set) as $function_fqsen) { - $namespace = $function_fqsen->getNamespace(); - $name = $function_fqsen->getName(); - $suggestion_set[strtolower($namespace)][strtolower($name)] = $name; - } - return $suggestion_set; - } - - /** - * @return array<int,FullyQualifiedClassName> 0 or more namespaced class names found in this code base - */ - public function suggestSimilarClassInOtherNamespace( - FullyQualifiedClassName $missing_class, - Context $unused_context - ) : array { - $class_name = $missing_class->getName(); - $class_name_lower = strtolower($class_name); - $namespaces_for_class_names = $this->getNamespacesForClassNames(); - - $namespaces_for_class = $namespaces_for_class_names[$class_name_lower] ?? []; - if (count($namespaces_for_class) === 0) { - return []; - } - // We're looking for similar names, not identical ones - unset($namespaces_for_class[strtolower($missing_class->getNamespace())]); - $namespaces_for_class = \array_values($namespaces_for_class); - - \usort($namespaces_for_class, 'strcmp'); - - /** @suppress PhanThrowTypeAbsentForCall */ - return \array_map(static function (string $namespace_name) use ($class_name) : FullyQualifiedClassName { - return FullyQualifiedClassName::make($namespace_name, $class_name); - }, $namespaces_for_class); - } - - /** - * @return array<int,FullyQualifiedFunctionName> 0 or more namespaced function names found in this code base with the same name but different namespaces - */ - public function suggestSimilarGlobalFunctionInOtherNamespace( - string $namespace, - string $function_name, - Context $unused_context, - bool $include_same_namespace = false - ) : array { - $function_name_lower = strtolower($function_name); - $namespaces_for_function_names = $this->getNamespacesForFunctionNames(); - - $namespaces_for_function = $namespaces_for_function_names[$function_name_lower] ?? []; - if (count($namespaces_for_function) === 0) { - return []; - } - if (!$include_same_namespace) { - // We're looking for similar names, not identical ones - unset($namespaces_for_function[strtolower($namespace)]); - } - $namespaces_for_function = \array_values($namespaces_for_function); - - \usort($namespaces_for_function, 'strcmp'); - - /** @suppress PhanThrowTypeAbsentForCall */ - return \array_map(static function (string $namespace_name) use ($function_name) : FullyQualifiedFunctionName { - return FullyQualifiedFunctionName::make($namespace_name, $function_name); - }, $namespaces_for_function); - } - - /** - * @internal - */ - const _NON_CLASS_TYPE_SUGGESTION_SET = [ - 'array' => 'array', - 'bool' => 'bool', - 'callable' => 'callable', - 'false' => 'false', - 'float' => 'float', - 'int' => 'int', - 'iterable' => 'iterable', - 'mixed' => 'mixed', - 'null' => 'null', - 'object' => 'object', - 'resource' => 'resource', - 'scalar' => 'scalar', - 'self' => 'self', - 'static' => 'static', - 'string' => 'string', - 'true' => 'true', - // 'void' only makes sense for return type suggestions - ]; - - /** - * @return array<int,FullyQualifiedFunctionName|string> 0 or more namespaced function names found in this code base - */ - public function suggestSimilarGlobalFunctionInSameNamespace( - string $namespace, - string $name, - Context $context, - bool $suggest_in_global_namespace - ) : array { - $suggestions = $this->suggestSimilarGlobalFunctionForNamespaceAndName($namespace, $name, $context); - if ($namespace !== "\\" && $suggest_in_global_namespace) { - $suggestions = \array_merge( - $suggestions, - $this->suggestSimilarGlobalFunctionForNamespaceAndName("\\", $name, $context) - ); - } - return $suggestions; - } - - /** - * @return array<int,FullyQualifiedGlobalConstantName> an array of constants similar to the missing constant. - */ - public function suggestSimilarConstantsToConstant(string $name) - { - $map = $this->getConstantLookupMapForName(); - $results = $map[strtolower($name)] ?? []; - return \array_values($results); - } - - /** - * @var ?array<string,array<string,FullyQualifiedGlobalConstantName>> maps lowercase name to FQSEN to constant - */ - private $constant_lookup_map_for_name; - - /** @return array<string,array<string,FullyQualifiedGlobalConstantName>> maps name to namespace to constant */ - private function getConstantLookupMapForName() : array - { - return $this->constant_lookup_map_for_name ?? ($this->constant_lookup_map_for_name = $this->computeConstantLookupMapForName()); - } - - /** @return array<string,array<string,FullyQualifiedGlobalConstantName>> maps name to namespace to constant */ - private function computeConstantLookupMapForName() : array - { - $result = []; - foreach ($this->fqsen_global_constant_map as $fqsen => $_) { - $result[strtolower($fqsen->getName())][$fqsen->__toString()] = $fqsen; - } - return $result; - } - - /** - * @return array<int,FullyQualifiedFunctionName> 0 or more namespaced function names found in this code base - */ - public function suggestSimilarGlobalFunctionForNamespaceAndName( - string $namespace, - string $name, - Context $unused_context - ) : array { - $function_name_lower = strtolower($name); - - $function_names_in_namespace = $this->getSimilarLengthFunctionNamesForNamespace($namespace, strlen($function_name_lower)); - - if (count($function_names_in_namespace) > Config::getValue('suggestion_check_limit')) { - return []; - } - - $suggestion_set = $function_names_in_namespace; - unset($suggestion_set[$function_name_lower]); - if (count($suggestion_set) === 0) { - return []; - } - - // We're looking for similar names, not identical names - $suggested_function_names = \array_keys( - IssueFixSuggester::getSuggestionsForStringSet($function_name_lower, $suggestion_set) - ); - - if (\count($suggested_function_names) === 0) { - return []; - } - \usort($suggested_function_names, 'strcmp'); - - /** - * @suppress PhanThrowTypeAbsentForCall - */ - return \array_map(static function (string $function_name_lower) use ($namespace, $function_names_in_namespace) : FullyQualifiedFunctionName { - $function_name = $function_names_in_namespace[$function_name_lower]; - return FullyQualifiedFunctionName::make($namespace, $function_name); - }, $suggested_function_names); - } - - /** - * @param int $class_suggest_type value from IssueFixSuggester::CLASS_SUGGEST_* - * - * @return array<int,FullyQualifiedClassName|string> 0 or more namespaced class names found in this code base - * - * NOTE: Non-classes are always represented as strings (and will be suggested even if there is a namespace), - * classes are always represented as FullyQualifiedClassName - */ - public function suggestSimilarClassInSameNamespace( - FullyQualifiedClassName $missing_class, - Context $unused_context, - int $class_suggest_type = IssueFixSuggester::CLASS_SUGGEST_ONLY_CLASSES - ) : array { - $namespace = $missing_class->getNamespace(); - $class_name_lower = strtolower($missing_class->getName()); - - $class_names_in_namespace = $this->getSimilarLengthClassNamesForNamespace($namespace, strlen($class_name_lower)); - - if (count($class_names_in_namespace) > Config::getValue('suggestion_check_limit')) { - return []; - } - - $suggestion_set = $class_names_in_namespace; - if ($class_suggest_type !== IssueFixSuggester::CLASS_SUGGEST_ONLY_CLASSES) { - // TODO: Could limit earlier here and precompute (based on similar string length) - $suggestion_set += self::_NON_CLASS_TYPE_SUGGESTION_SET; - if ($class_suggest_type === IssueFixSuggester::CLASS_SUGGEST_CLASSES_AND_TYPES_AND_VOID) { - $suggestion_set['void'] = 'void'; - } - } - unset($suggestion_set[$class_name_lower]); - if (count($suggestion_set) === 0) { - return []; - } - - // We're looking for similar names, not identical names - $suggested_class_names = \array_keys( - IssueFixSuggester::getSuggestionsForStringSet($class_name_lower, $suggestion_set) - ); - - if (\count($suggested_class_names) === 0) { - return []; - } - \usort($suggested_class_names, 'strcmp'); - - /** - * @return string|FullyQualifiedClassName - * @suppress PhanThrowTypeAbsentForCall - */ - return \array_map(static function (string $class_name_lower) use ($namespace, $class_names_in_namespace) { - if (!\array_key_exists($class_name_lower, $class_names_in_namespace)) { - // This is a builtin type - return $class_name_lower; - } - $class_name = $class_names_in_namespace[$class_name_lower]; - return FullyQualifiedClassName::make($namespace, $class_name); - }, $suggested_class_names); - } -} diff --git a/vendor/phan/phan/src/Phan/CodeBase/ClassMap.php b/vendor/phan/phan/src/Phan/CodeBase/ClassMap.php deleted file mode 100644 index 0080db9..0000000 --- a/vendor/phan/phan/src/Phan/CodeBase/ClassMap.php +++ /dev/null @@ -1,134 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\CodeBase; - -use Phan\Language\Element\ClassConstant; -use Phan\Language\Element\Method; -use Phan\Language\Element\Property; - -/** - * Maps for elements associated with an individual class - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class ClassMap -{ - /** - * @var array<string,ClassConstant> - * A map from name to ClassConstant - */ - private $class_constant_map = []; - - /** - * @var array<string,Property> - * A map from name to Property - */ - private $property_map = []; - - /** - * @var array<string,Method> - * A map from name to Method - */ - private $method_map = []; - - /** - * @return void - */ - public function addClassConstant(ClassConstant $constant) - { - $this->class_constant_map[ - $constant->getFQSEN()->getNameWithAlternateId() - ] = $constant; - } - - /** - * @return bool does this class have a constant with name $name - */ - public function hasClassConstantWithName(string $name) : bool - { - return isset($this->class_constant_map[$name]); - } - - /** - * Gets the class constant $name of this class - */ - public function getClassConstantByName(string $name) : ClassConstant - { - return $this->class_constant_map[$name]; - } - - /** - * @return array<string,ClassConstant> - */ - public function getClassConstantMap() : array - { - return $this->class_constant_map; - } - - /** - * @return void - */ - public function addProperty(Property $property) - { - $this->property_map[ - $property->getFQSEN()->getNameWithAlternateId() - ] = $property; - } - - /** - * @return bool - */ - public function hasPropertyWithName(string $name) : bool - { - return isset($this->property_map[$name]); - } - - /** - * @return Property - */ - public function getPropertyByName(string $name) : Property - { - return $this->property_map[$name]; - } - - /** - * @return array<string,Property> - */ - public function getPropertyMap() : array - { - return $this->property_map; - } - - /** - * @return void - */ - public function addMethod(Method $method) - { - $this->method_map[\strtolower( - $method->getFQSEN()->getNameWithAlternateId() - )] = $method; - } - - /** - * @return bool - */ - public function hasMethodWithName(string $name) : bool - { - return isset($this->method_map[\strtolower($name)]); - } - - /** - * @return Method - */ - public function getMethodByName(string $name) : Method - { - return $this->method_map[\strtolower($name)]; - } - - /** - * @return array<string,Method> - */ - public function getMethodMap() : array - { - return $this->method_map; - } -} diff --git a/vendor/phan/phan/src/Phan/CodeBase/UndoTracker.php b/vendor/phan/phan/src/Phan/CodeBase/UndoTracker.php deleted file mode 100644 index 949b17a..0000000 --- a/vendor/phan/phan/src/Phan/CodeBase/UndoTracker.php +++ /dev/null @@ -1,221 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\CodeBase; - -use Closure; -use Phan\CodeBase; -use Phan\Daemon; -use Phan\Phan; - -use function count; -use function in_array; - -/** - * UndoTracker maps a file path to a list of operations(e.g. Closures) that must be executed to - * remove all traces of a file from the CodeBase, etc. if a file was removed or edited. - * This is done to support running phan in daemon mode. - * - Files will have to be re-parsed to get the new function signatures, check for new parse/analysis errors, - * and to update the class/function/method/property/constant/etc. definitions that would have to be created. - * - * If a file is edited, its contributions are undone, then it is parsed yet again. - * - * (We don't garbage collect reference cycles, so this attempts to work in a way that avoids cycles. - * Haven't verified that it does that as expected, yet) - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class UndoTracker -{ - - /** - * @var ?string absolute path to currently parsed file, when in parse phase. - * TODO: Does the Context->getFile() make keeping this redundant? - */ - private $current_parsed_file; - - /** - * @var array<string,array<int,Closure>> operations to undo for a current path - * @phan-var array<string,array<int,Closure(CodeBase):void>> - */ - private $undo_operations_for_path = []; - - /** - * @var array<string,?string> Maps file paths to the modification dates and file size of the paths. - On ext4, milliseconds are available, but php APIs all return seconds. - */ - private $file_modification_state = []; - - public function __construct() - { - } - - /** - * @return array<int,string> - The list of files which are successfully parsed. - * This changes whenever the file list is reloaded from disk. - * This also includes files which don't declare classes or functions or globals, - * because those files use classes/functions/constants. - * - * (This is the list prior to any analysis exclusion or whitelisting steps) - */ - public function getParsedFilePathList() : array - { - return \array_keys($this->file_modification_state); - } - - /** - * @return int The size of $this->getParsedFilePathList() - */ - public function getParsedFilePathCount() : int - { - return count($this->file_modification_state); - } - - /** - * @param ?string $current_parsed_file - * @return void - */ - public function setCurrentParsedFile($current_parsed_file) - { - if (\is_string($current_parsed_file)) { - Daemon::debugf("Recording file modification state for %s", $current_parsed_file); - // This shouldn't be null. TODO: Figure out what to do if it is. - $this->file_modification_state[$current_parsed_file] = self::getFileState($current_parsed_file); - } - $this->current_parsed_file = $current_parsed_file; - } - - - /** - * @return ?string - This string should change when the file is modified. Returns null if the file somehow doesn't exist - */ - public static function getFileState(string $path) - { - \clearstatcache(true, $path); // TODO: does this work properly with symlinks? seems to. - $real = \realpath($path); - if (!$real) { - return null; - } - if (!\file_exists($real)) { - return null; - } - $stat = @\stat($real); // Double check: suppress to prevent Phan's error_handler from terminating on error. - if (!$stat) { - return null; // It was missing or unreadable. - } - return \sprintf('%d_%d', $stat['mtime'], $stat['size']); - } - - /** - * Called when a file is unparsable. - * Removes the classes and functions, etc. from an older version of the file, if one exists. - * @return void - */ - public function recordUnparsableFile(CodeBase $code_base, string $current_parsed_file) - { - Daemon::debugf("%s was unparsable, had a syntax error", $current_parsed_file); - Phan::getIssueCollector()->removeIssuesForFiles([$current_parsed_file]); - $this->undoFileChanges($code_base, $current_parsed_file); - unset($this->file_modification_state[$current_parsed_file]); - } - - /** - * Undoes all of the changes for the relative path at $path - * @return void - */ - private function undoFileChanges(CodeBase $code_base, string $path) - { - Daemon::debugf("Undoing file changes for $path"); - foreach ($this->undo_operations_for_path[$path] ?? [] as $undo_operation) { - $undo_operation($code_base); - } - unset($this->undo_operations_for_path[$path]); - } - - /** - * @param \Closure $undo_operation - a closure expecting 1 param - inner. It undoes a change caused by a parsed file. - * Ideally, this would extend to all changes. (e.g. including dead code detection) - * - * @return void - */ - public function recordUndo(\Closure $undo_operation) - { - $file = $this->current_parsed_file; - if (!\is_string($file)) { - throw new \RuntimeException("Called recordUndo in CodeBaseMutable, but not parsing a file"); - } - if (!isset($this->undo_operations_for_path[$file])) { - $this->undo_operations_for_path[$file] = []; - } - $this->undo_operations_for_path[$file][] = $undo_operation; - } - - /** - * @param CodeBase $code_base - code base owning this tracker - * @param array<int,string> $new_file_list - * @param array<string,string> $file_mapping_contents - * @param ?(string[]) $reanalyze_files files to re-parse before re-running analysis. - * This fixes #1921 - * @return array<int,string> - Subset of $new_file_list which changed on disk and has to be parsed again. Automatically unparses the old versions of files which were modified. - */ - public function updateFileList(CodeBase $code_base, array $new_file_list, array $file_mapping_contents, array $reanalyze_files = null) - { - $new_file_set = []; - foreach ($new_file_list as $path) { - $new_file_set[$path] = true; - } - foreach ($file_mapping_contents as $path => $_) { - $new_file_set[$path] = true; - } - unset($new_file_list); - $removed_file_list = []; - $changed_or_added_file_list = []; - foreach ($new_file_set as $path => $_) { - if (!isset($this->file_modification_state[$path])) { - $changed_or_added_file_list[] = $path; - } - } - foreach ($this->file_modification_state as $path => $state) { - if (!isset($new_file_set[$path])) { - $this->undoFileChanges($code_base, $path); - $removed_file_list[] = $path; - unset($this->file_modification_state[$path]); - continue; - } - // TODO: Always invalidate the parsed file if we're about to analyze it? - if (isset($file_mapping_contents[$path])) { - // TODO: Move updateFileList to be called before fork()? - $new_state = 'daemon:' . \sha1($file_mapping_contents[$path]); - } else { - $new_state = self::getFileState($path); - } - if ($new_state !== $state || in_array($path, $reanalyze_files ?? [])) { - $removed_file_list[] = $path; - $this->undoFileChanges($code_base, $path); - // TODO: This will call stat() twice as much as necessary for the modified files. Not important. - unset($this->file_modification_state[$path]); - if ($new_state !== null) { - $changed_or_added_file_list[] = $path; - } - } - } - if (count($removed_file_list) > 0) { - Phan::getIssueCollector()->removeIssuesForFiles($removed_file_list); - } - return $changed_or_added_file_list; - } - - /** - * @param CodeBase $code_base - code base owning this tracker - * @param string $file_path - * @return bool - true if the file existed - */ - public function beforeReplaceFileContents(CodeBase $code_base, string $file_path) - { - if (!isset($this->file_modification_state[$file_path])) { - Daemon::debugf("Tried to replace contents of '$file_path', but that path does not yet exist"); - return false; - } - Phan::getIssueCollector()->removeIssuesForFiles([$file_path]); - $this->undoFileChanges($code_base, $file_path); - unset($this->file_modification_state[$file_path]); - return true; - } -} diff --git a/vendor/phan/phan/src/Phan/Config.php b/vendor/phan/phan/src/Phan/Config.php deleted file mode 100644 index e3d506f..0000000 --- a/vendor/phan/phan/src/Phan/Config.php +++ /dev/null @@ -1,1355 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use Phan\Library\Paths; -use function array_key_exists; -use function gettype; -use function is_array; -use function is_bool; -use function is_float; -use function is_int; -use function is_null; -use function is_string; -use const PHP_EOL; -use const PHP_VERSION; -use const STDERR; - -/** - * Program configuration. - * - * Many of the settings in this class can be overridden in .phan/config.php. - * - * Some configuration can be overridden on the command line. - * See `./phan -h` for command line usage, or take a - * look at \Phan\CLI.php for more details on CLI usage. - * - * For efficiency, all of these methods are static methods. - * Configuration is fetched frequently, and static methods were much faster than magic __get(). - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class Config -{ - /** - * The version of the AST (defined in php-ast) that we're using. - * Older versions are likely to have edge cases we no longer support, - * and version 50 got rid of Decl. - * - * TODO: Switch to version 70 in the next major Phan release. - */ - const AST_VERSION = 50; - - /** - * The version of the Phan plugin system. - * Plugin files that wish to be backwards compatible may check this and - * return different classes based on its existence and - * the results of version_compare. - * PluginV2 will correspond to 2.x.y, PluginV3 will correspond to 3.x.y, etc. - * New features increment minor versions, and bug fixes increment patch versions. - * @suppress PhanUnreferencedPublicClassConstant - */ - const PHAN_PLUGIN_VERSION = '2.9.0'; - - /** - * @var string|null - * The root directory of the project. This is used to - * store canonical path names and find project resources - */ - private static $project_root_directory = null; - - /** - * Configuration options - */ - private static $configuration = self::DEFAULT_CONFIGURATION; - - // The most commonly accessed configs: - /** @var bool mirror of configuration with the same name */ - private static $null_casts_as_any_type = false; - - /** @var bool replicates configuration with the same name */ - private static $null_casts_as_array = false; - - /** @var bool replicates configuration with the same name */ - private static $array_casts_as_null = false; - - /** @var bool replicates configuration with the same name */ - private static $strict_method_checking = false; - - /** @var bool replicates configuration with the same name */ - private static $strict_param_checking = false; - - /** @var bool replicates configuration with the same name */ - private static $strict_property_checking = false; - - /** @var bool replicates configuration with the same name */ - private static $strict_return_checking = false; - - /** @var bool replicates configuration with the same name */ - private static $track_references = false; - - /** @var bool replicates configuration with the same name */ - private static $backward_compatibility_checks = false; - - /** @var bool replicates configuration with the same name */ - private static $quick_mode = false; - // End of the most commonly accessed configs. - - /** @var int the 5-digit PHP version id which is closest to matching the PHP_VERSION_ID for the 'target_php_version' string */ - private static $closest_target_php_version_id; - - /** - * This constant contains the default values for Phan's configuration settings. - * - * Both your project's `.phan/config.php` file and the CLI flags used to invoke Phan - * will override these defaults. - * - * NOTE: The line comments for individual configuration settings are written in markdown. - * They are extracted by `\Phan\Config\Initializer` and used in the following places: - * - * 1. The configuration automatically generated by `phan --init`. - * 2. The GitHub Wiki documentation generated by `internal/update_wiki_config_types.php`. - */ - const DEFAULT_CONFIGURATION = [ - // Supported values: `'5.6'`, `'7.0'`, `'7.1'`, `'7.2'`, `'7.3'`, `'7.4'`, `null`. - // If this is set to `null`, - // then Phan assumes the PHP version which is closest to the minor version - // of the php executable used to execute Phan. - // - // Note that the **only** effect of choosing `'5.6'` is to infer that functions removed in php 7.0 exist. - // (See `backward_compatibility_checks` for additional options) - 'target_php_version' => null, - - // Default: true. If this is set to true, - // and `target_php_version` is newer than the version used to run Phan, - // Phan will act as though functions added in newer PHP versions exist. - // - // NOTE: Currently, this only affects `Closure::fromCallable()` - 'pretend_newer_core_methods_exist' => true, - - // Make the tolerant-php-parser polyfill generate doc comments - // for all types of elements, even if php-ast wouldn't (for an older PHP version) - 'polyfill_parse_all_element_doc_comments' => true, - - // A list of individual files to include in analysis - // with a path relative to the root directory of the - // project. - 'file_list' => [], - - // A list of directories that should be parsed for class and - // method information. After excluding the directories - // defined in `exclude_analysis_directory_list`, the remaining - // files will be statically analyzed for errors. - // - // Thus, both first-party and third-party code being used by - // your application should be included in this list. - 'directory_list' => [], - - // For internal use by Phan to quickly check for membership in directory_list. - '__directory_regex' => null, - - // Whether to enable debugging output to stderr - 'debug_output' => false, - - // List of case-insensitive file extensions supported by Phan. - // (e.g. `['php', 'html', 'htm']`) - 'analyzed_file_extensions' => ['php'], - - // A regular expression to match files to be excluded - // from parsing and analysis and will not be read at all. - // - // This is useful for excluding groups of test or example - // directories/files, unanalyzable files, or files that - // can't be removed for whatever reason. - // (e.g. `'@Test\.php$@'`, or `'@vendor/.*/(tests|Tests)/@'`) - 'exclude_file_regex' => '', - - // A file list that defines files that will be excluded - // from parsing and analysis and will not be read at all. - // - // This is useful for excluding hopelessly unanalyzable - // files that can't be removed for whatever reason. - 'exclude_file_list' => [], - - // Enable this to enable checks of require/include statements referring to valid paths. - 'enable_include_path_checks' => false, - - // A list of [include paths](https://secure.php.net/manual/en/ini.core.php#ini.include-path) to check when checking if `require_once`, `include`, etc. are pointing to valid files. - // - // To refer to the directory of the file being analyzed, use `'.'` - // To refer to the project root directory, use \Phan\Config::getProjectRootDirectory() - // - // (E.g. `['.', \Phan\Config::getProjectRootDirectory() . '/src/folder-added-to-include_path']`) - // - // This is ignored if `enable_include_path_checks` is not `true`. - 'include_paths' => ['.'], - - // Enable this to warn about the use of relative paths in `require_once`, `include`, etc. - // Relative paths are harder to reason about, and opcache may have issues with relative paths in edge cases. - // - // This is ignored if `enable_include_path_checks` is not `true`. - 'warn_about_relative_include_statement' => false, - - // A directory list that defines files that will be excluded - // from static analysis, but whose class and method - // information should be included. - // - // Generally, you'll want to include the directories for - // third-party code (such as "vendor/") in this list. - // - // n.b.: If you'd like to parse but not analyze 3rd - // party code, directories containing that code - // should be added to the `directory_list` as well as - // to `exclude_analysis_directory_list`. - 'exclude_analysis_directory_list' => [], - - // This is set internally by Phan based on exclude_analysis_directory_list - '__exclude_analysis_regex' => null, - - // A file list that defines files that will be included - // in static analysis, to the exclusion of others. - 'include_analysis_file_list' => [], - - // Backwards Compatibility Checking. This is slow - // and expensive, but you should consider running - // it before upgrading your version of PHP to a - // new version that has backward compatibility - // breaks. - // - // If you are migrating from PHP 5 to PHP 7, - // you should also look into using - // [php7cc (no longer maintained)](https://github.com/sstalle/php7cc) - // and [php7mar](https://github.com/Alexia/php7mar), - // which have different backwards compatibility checks. - 'backward_compatibility_checks' => true, - - // A set of fully qualified class-names for which - // a call to `parent::__construct()` is required. - 'parent_constructor_required' => [], - - // If true, this runs a quick version of checks that takes less - // time at the cost of not running as thorough - // of an analysis. You should consider setting this - // to true only when you wish you had more **undiagnosed** issues - // to fix in your code base. - // - // In quick-mode the scanner doesn't rescan a function - // or a method's code block every time a call is seen. - // This means that the problem here won't be detected: - // - // ```php - // <?php - // function test($arg):int { - // return $arg; - // } - // test("abc"); - // ``` - // - // This would normally generate: - // - // ``` - // test.php:3 PhanTypeMismatchReturn Returning type string but test() is declared to return int - // ``` - // - // The initial scan of the function's code block has no - // type information for `$arg`. It isn't until we see - // the call and rescan `test()`'s code block that we can - // detect that it is actually returning the passed in - // `string` instead of an `int` as declared. - 'quick_mode' => false, - - // The maximum recursion depth that can be reached when analyzing the code. - // This setting only takes effect when quick_mode is disabled. - // A higher limit will make the analysis more accurate, but could possibly - // make it harder to track the code bit where a detected issue originates. - // As long as this is kept relatively low, performance is usually not affected - // by changing this setting. - 'maximum_recursion_depth' => 2, - - // If enabled, check all methods that override a - // parent method to make sure its signature is - // compatible with the parent's. - // - // This check can add quite a bit of time to the analysis. - // - // This will also check if final methods are overridden, etc. - 'analyze_signature_compatibility' => true, - - // Set this to true to allow contravariance in real parameter types of method overrides - // (Users may enable this if analyzing projects that support only php 7.2+) - // - // See [this note about PHP 7.2's new features](https://secure.php.net/manual/en/migration72.new-features.php#migration72.new-features.param-type-widening). - // This is false by default. (By default, Phan will warn if real parameter types are omitted in an override) - // - // If this is overridden to be null, this will be inferred from `target_php_version`. - 'allow_method_param_type_widening' => false, - - // Set this to true to make Phan guess that undocumented parameter types - // (for optional parameters) have the same type as default values - // (Instead of combining that type with `mixed`). - // - // E.g. `function my_method($x = 'val')` would make Phan infer that `$x` had a type of `string`, not `string|mixed`. - // Phan will not assume it knows specific types if the default value is `false` or `null`. - 'guess_unknown_parameter_type_using_default' => false, - - // If enabled, inherit any missing phpdoc for types from - // the parent method if none is provided. - // - // NOTE: This step will only be performed if `analyze_signature_compatibility` is also enabled. - 'inherit_phpdoc_types' => true, - - // The minimum severity level to report on. This can be - // set to `Issue::SEVERITY_LOW`, `Issue::SEVERITY_NORMAL` or - // `Issue::SEVERITY_CRITICAL`. Setting it to only - // critical issues is a good place to start on a big - // sloppy mature code base. - 'minimum_severity' => Issue::SEVERITY_LOW, - - // If enabled, missing properties will be created when - // they are first seen. If false, we'll report an - // error message if there is an attempt to write - // to a class property that wasn't explicitly - // defined. - 'allow_missing_properties' => false, - - // If enabled, allow null to be cast as any array-like type. - // - // This is an incremental step in migrating away from `null_casts_as_any_type`. - // If `null_casts_as_any_type` is true, this has no effect. - 'null_casts_as_array' => false, - - // If enabled, allow any array-like type to be cast to null. - // This is an incremental step in migrating away from `null_casts_as_any_type`. - // If `null_casts_as_any_type` is true, this has no effect. - 'array_casts_as_null' => false, - - // If enabled, null can be cast to any type and any - // type can be cast to null. Setting this to true - // will cut down on false positives. - 'null_casts_as_any_type' => false, - - // If enabled, Phan will warn if **any** type in a method invocation's object - // is definitely not an object, - // or if **any** type in an invoked expression is not a callable. - // Setting this to true will introduce numerous false positives - // (and reveal some bugs). - 'strict_method_checking' => false, - - // If enabled, Phan will warn if **any** type in the argument's union type - // cannot be cast to a type in the parameter's expected union type. - // Setting this to true will introduce numerous false positives - // (and reveal some bugs). - 'strict_param_checking' => false, - - // If enabled, Phan will warn if **any** type in a property assignment's union type - // cannot be cast to a type in the property's declared union type. - // Setting this to true will introduce numerous false positives - // (and reveal some bugs). - 'strict_property_checking' => false, - - // If enabled, Phan will warn if **any** type in a returned value's union type - // cannot be cast to the declared return type. - // Setting this to true will introduce numerous false positives - // (and reveal some bugs). - 'strict_return_checking' => false, - - // If enabled, scalars (int, float, bool, string, null) - // are treated as if they can cast to each other. - // This does not affect checks of array keys. See `scalar_array_key_cast`. - 'scalar_implicit_cast' => false, - - // If enabled, any scalar array keys (int, string) - // are treated as if they can cast to each other. - // E.g. `array<int,stdClass>` can cast to `array<string,stdClass>` and vice versa. - // Normally, a scalar type such as int could only cast to/from int and mixed. - 'scalar_array_key_cast' => false, - - // If this has entries, scalars (int, float, bool, string, null) - // are allowed to perform the casts listed. - // - // E.g. `['int' => ['float', 'string'], 'float' => ['int'], 'string' => ['int'], 'null' => ['string']]` - // allows casting null to a string, but not vice versa. - // (subset of `scalar_implicit_cast`) - 'scalar_implicit_partial' => [], - - // If true, seemingly undeclared variables in the global - // scope will be ignored. - // - // This is useful for projects with complicated cross-file - // globals that you have no hope of fixing. - 'ignore_undeclared_variables_in_global_scope' => false, - - // If true, check to make sure the return type declared - // in the doc-block (if any) matches the return type - // declared in the method signature. - 'check_docblock_signature_return_type_match' => true, - - // If true, check to make sure the param types declared - // in the doc-block (if any) matches the param types - // declared in the method signature. - 'check_docblock_signature_param_type_match' => true, - - // If true, make narrowed types from phpdoc params override - // the real types from the signature, when real types exist. - // (E.g. allows specifying desired lists of subclasses, - // or to indicate a preference for non-nullable types over nullable types) - // - // Affects analysis of the body of the method and the param types passed in by callers. - // - // (*Requires `check_docblock_signature_param_type_match` to be true*) - 'prefer_narrowed_phpdoc_param_type' => true, - - // (*Requires `check_docblock_signature_return_type_match` to be true*) - // - // If true, make narrowed types from phpdoc returns override - // the real types from the signature, when real types exist. - // - // (E.g. allows specifying desired lists of subclasses, - // or to indicate a preference for non-nullable types over nullable types) - // - // This setting affects the analysis of return statements in the body of the method and the return types passed in by callers. - 'prefer_narrowed_phpdoc_return_type' => true, - - // Set to true in order to attempt to detect dead - // (unreferenced) code. Keep in mind that the - // results will only be a guess given that classes, - // properties, constants and methods can be referenced - // as variables (like `$class->$property` or - // `$class->$method()`) in ways that we're unable - // to make sense of. - 'dead_code_detection' => false, - - // Set to true in order to attempt to detect unused variables. - // `dead_code_detection` will also enable unused variable detection. - // - // This has a few known false positives, e.g. for loops or branches. - 'unused_variable_detection' => false, - - // Set to true in order to attempt to detect variables that could be replaced with constants or literals. - // (i.e. they are declared once (as a constant expression) and never modified) - // This is almost entirely false positives for most coding styles. - // - // This is intended to be used to check for bugs where a variable such as a boolean was declared but is no longer (or was never) modified. - 'constant_variable_detection' => false, - - // Set to true in order to emit issues such as `PhanUnusedPublicMethodParameter` instead of `PhanUnusedPublicNoOverrideMethodParameter` - // (i.e. assume any non-final non-private method can have overrides). - // This is useful in situations when parsing only a subset of the available files. - 'unused_variable_detection_assume_override_exists' => false, - - // Set this to true in order to aggressively assume class elements aren't overridden when analyzing uses of classes. - // This is useful for standalone applications which have all code analyzed by Phan. - // - // Currently, this just affects inferring that methods without return statements have type `void` - 'assume_no_external_class_overrides' => false, - - // Set to true in order to force tracking references to elements - // (functions/methods/consts/protected). - // - // `dead_code_detection` is another option which also causes references - // to be tracked. - 'force_tracking_references' => false, - - // If true, the dead code detection rig will - // prefer false negatives (not report dead code) to - // false positives (report dead code that is not - // actually dead). - // - // In other words, the graph of references will have - // too many edges rather than too few edges when guesses - // have to be made about what references what. - 'dead_code_detection_prefer_false_negative' => true, - - // If true, then before analysis, try to simplify AST into a form - // which improves Phan's type inference in edge cases. - // - // This may conflict with `dead_code_detection`. - // When this is true, this slows down analysis slightly. - // - // E.g. rewrites `if ($a = value() && $a > 0) {...}` - // into `$a = value(); if ($a) { if ($a > 0) {...}}` - 'simplify_ast' => true, - - // Enable this to warn about harmless redundant use for classes and namespaces such as `use Foo\bar` in namespace Foo. - // - // Note: This does not affect warnings about redundant uses in the global namespace. - 'warn_about_redundant_use_namespaced_class' => false, - - // If true, Phan will read `class_alias()` calls in the global scope, then - // - // 1. create aliases from the *parsed* files if no class definition was found, and - // 2. emit issues in the global scope if the source or target class is invalid. - // (If there are multiple possible valid original classes for an aliased class name, - // the one which will be created is unspecified.) - // - // NOTE: THIS IS EXPERIMENTAL, and the implementation may change. - 'enable_class_alias_support' => false, - - // If disabled, Phan will not read docblock type - // annotation comments for `@property`. - // - // - When enabled, in addition to inferring existence of magic properties, - // Phan will also warn when writing to `@property-read` and reading from `@property-read`. - // Phan will warn when writing to read-only properties and reading from write-only properties. - // - // Note: `read_type_annotations` must also be enabled. - 'read_magic_property_annotations' => true, - - // If disabled, Phan will not read docblock type - // annotation comments for `@method`. - // - // Note: `read_type_annotations` must also be enabled. - 'read_magic_method_annotations' => true, - - // If disabled, Phan will not read docblock type - // annotation comments (such as for `@return`, `@param`, - // `@var`, `@suppress`, `@deprecated`) and only rely on - // types expressed in code. - 'read_type_annotations' => true, - - // If enabled, Phan will cache ASTs generated by the polyfill/fallback to disk - // (except when running in the background as a language server/daemon) - // - // ASTs generated by the native AST library (php-ast) are never cached, - // because php-ast is faster than loading and unserializing data from the cache. - // - // Disabling this is faster when the cache won't be reused, - // e.g. if this would be run in a docker image without mounting the cache as a volume. - // - // The cache can be found at `sys_get_tmp_dir() . "/phan-$USERNAME"`. - 'cache_polyfill_asts' => true, - - // If enabled, warn about throw statement where the exception types - // are not documented in the PHPDoc of functions, methods, and closures. - 'warn_about_undocumented_throw_statements' => false, - - // If enabled (and `warn_about_undocumented_throw_statements` is enabled), - // Phan will warn about function/closure/method invocations that have `@throws` - // that aren't caught or documented in the invoking method. - - 'warn_about_undocumented_exceptions_thrown_by_invoked_functions' => false, - - // Phan will not warn about lack of documentation of `@throws` for any of the configured classes or their subclasses. - // This only matters when `warn_about_undocumented_throw_statements` is true. - // The default is the empty array (Don't suppress any warnings) - // - // (E.g. `['RuntimeException', 'AssertionError', 'TypeError']`) - 'exception_classes_with_optional_throws_phpdoc' => [ ], - - // This setting maps case-insensitive strings to union types. - // - // This is useful if a project uses phpdoc that differs from the phpdoc2 standard. - // - // If the corresponding value is the empty string, - // then Phan will ignore that union type (E.g. can ignore 'the' in `@return the value`) - // - // If the corresponding value is not empty, - // then Phan will act as though it saw the corresponding UnionTypes(s) - // when the keys show up in a UnionType of `@param`, `@return`, `@var`, `@property`, etc. - // - // This matches the **entire string**, not parts of the string. - // (E.g. `@return the|null` will still look for a class with the name `the`, but `@return the` will be ignored with the below setting) - // - // (These are not aliases, this setting is ignored outside of doc comments). - // (Phan does not check if classes with these names exist) - // - // Example setting: `['unknown' => '', 'number' => 'int|float', 'char' => 'string', 'long' => 'int', 'the' => '']` - 'phpdoc_type_mapping' => [ ], - - // Set to true in order to ignore issue suppression. - // This is useful for testing the state of your code, but - // unlikely to be useful outside of that. - 'disable_suppression' => false, - - // Set to true in order to ignore line-based issue suppressions. - // Disabling both line and file-based suppressions is mildly faster. - 'disable_line_based_suppression' => false, - - // Set to true in order to ignore file-based issue suppressions. - 'disable_file_based_suppression' => false, - - // If set to true, we'll dump the AST instead of - // analyzing files - 'dump_ast' => false, - - // If set to a string, we'll dump the fully qualified lowercase - // function and method signatures instead of analyzing files. - 'dump_signatures_file' => null, - - // If set to true, we'll dump the list of files to parse - // to stdout instead of parsing and analyzing files. - 'dump_parsed_file_list' => false, - - // Include a progress bar in the output. - 'progress_bar' => false, - - // If this much time (in seconds) has passed since the last update, - // then update the progress bar. - 'progress_bar_sample_interval' => 0.1, - - // The number of processes to fork off during the analysis - // phase. - 'processes' => 1, - - // Set to true to emit profiling data on how long various - // parts of Phan took to run. You likely don't care to do - // this. - 'profiler_enabled' => false, - - // Phan will give up on suggesting a different name in issue messages - // if the number of candidates (for a given suggestion category) is greater than `suggestion_check_limit`. - // - // Set this to `0` to disable most suggestions for similar names, and only suggest identical names in other namespaces. - // Set this to `PHP_INT_MAX` (or other large value) to always suggest similar names and identical names in other namespaces. - // - // Phan will be a bit slower when this config setting is large. - // A lower value such as 50 works for suggesting misspelled classes/constants in namespaces, - // but won't give you suggestions for globally namespaced functions. - 'suggestion_check_limit' => 1000, - - // Set this to true to disable suggestions for what to use instead of undeclared variables/classes/etc. - 'disable_suggestions' => false, - - // Add any issue types (such as `'PhanUndeclaredMethod'`) - // to this black-list to inhibit them from being reported. - 'suppress_issue_types' => [ - // 'PhanUndeclaredMethod', - ], - - // If empty, no filter against issues types will be applied. - // If this white-list is non-empty, only issues within the list - // will be emitted by Phan. - // - // See https://github.com/phan/phan/wiki/Issue-Types-Caught-by-Phan - // for the full list of issues that Phan detects. - // - // Phan is capable of detecting hundreds of types of issues. - // Projects should almost always use `suppress_issue_types` instead. - 'whitelist_issue_types' => [ - // 'PhanUndeclaredClass', - ], - - // A custom list of additional superglobals and their types. **Only needed by projects using runkit/runkit7.** - // - // (Corresponding keys are declared in `runkit.superglobal` ini directive) - // - // `globals_type_map` should be set for setting the types of these superglobals. - // E.g `['_FOO']`; - 'runkit_superglobals' => [], - - // Override to hardcode existence and types of (non-builtin) globals in the global scope. - // Class names should be prefixed with `\`. - // - // (E.g. `['_FOO' => '\FooClass', 'page' => '\PageClass', 'userId' => 'int']`) - 'globals_type_map' => [], - - // Enable this to emit issue messages with markdown formatting. - 'markdown_issue_messages' => false, - - // Emit colorized issue messages. - // NOTE: it is strongly recommended to enable this via the `--color` CLI flag instead, - // since this is incompatible with most output formatters. - 'color_issue_messages' => false, - - // Allow overriding color scheme in `.phan/config.php` for printing issues, for individual types. - // - // See the keys of `Phan\Output\Colorizing::STYLES` for valid color names, - // and the keys of `Phan\Output\Colorizing::DEFAULT_COLOR_FOR_TEMPLATE` for valid color names. - // - // E.g. to change the color for the file (of an issue instance) to red, set this to `['FILE' => 'red']` - // - // E.g. to use the terminal's default color for the line (of an issue instance), set this to `['LINE' => 'none']` - 'color_scheme' => [], - - // Enable or disable support for generic templated - // class types. - 'generic_types_enabled' => true, - - // Assign files to be analyzed on random processes - // in random order. You very likely don't want to - // set this to true. This is meant for debugging - // and fuzz testing purposes only. - 'randomize_file_order' => false, - - // Setting this to true makes the process assignment for file analysis - // as predictable as possible, using consistent hashing. - // - // Even if files are added or removed, or process counts change, - // relatively few files will move to a different group. - // (use when the number of files is much larger than the process count) - // - // NOTE: If you rely on Phan parsing files/directories in the order - // that they were provided in this config, don't use this. - // See [this note in Phan's wiki](https://github.com/phan/phan/wiki/Different-Issue-Sets-On-Different-Numbers-of-CPUs). - 'consistent_hashing_file_order' => false, - - // Set by `--print-memory-usage-summary`. Prints a memory usage summary to stderr after analysis. - 'print_memory_usage_summary' => false, - - // By default, Phan will log error messages to stdout if PHP is using options that slow the analysis. - // (e.g. PHP is compiled with `--enable-debug` or when using XDebug) - 'skip_slow_php_options_warning' => false, - - // By default, Phan will warn if the 'tokenizer' module isn't installed and enabled. - 'skip_missing_tokenizer_warning' => false, - - // This is the maximum frame length for crash reports - 'debug_max_frame_length' => 1000, - - // You can put paths to stubs of internal extensions in this config option. - // If the corresponding extension is **not** loaded, then Phan will use the stubs instead. - // Phan will continue using its detailed type annotations, - // but load the constants, classes, functions, and classes (and their Reflection types) - // from these stub files (doubling as valid php files). - // Use a different extension from php to avoid accidentally loading these. - // The `tools/make_stubs` script can be used to generate your own stubs (compatible with php 7.0+ right now) - // - // (e.g. `['xdebug' => '.phan/internal_stubs/xdebug.phan_php']`) - 'autoload_internal_extension_signatures' => [ - ], - - // Set this to false to emit `PhanUndeclaredFunction` issues for internal functions that Phan has signatures for, - // but aren't available in the codebase, or the internal functions used to run Phan - // (may lead to false positives if an extension isn't loaded) - // - // If this is true(default), then Phan will not warn. - 'ignore_undeclared_functions_with_known_signatures' => true, - - // If a file to be analyzed can't be parsed, - // then use a slower PHP substitute for php-ast to try to parse the files. - // This setting is ignored if a file is excluded from analysis. - // - // NOTE: it is strongly recommended to enable this via the `--use-fallback-parser` CLI flag instead, - // since this may result in strange error messages for invalid files (e.g. if parsed but not analyzed). - 'use_fallback_parser' => false, - - // Use the polyfill parser based on tolerant-php-parser instead of the possibly missing native implementation - // - // NOTE: This makes parsing several times slower than the native implementation. - // - // NOTE: it is strongly recommended to enable this via the `--use-polyfill-parser` or `--force-polyfill-parser` - // since this may result in strange error messages for invalid files (e.g. if parsed but not analyzed). - 'use_polyfill_parser' => false, - - // Path to a Unix socket for a daemon to listen to files to analyze. Use command line option instead. - 'daemonize_socket' => false, - - // If a daemon should listen to files to analyze over TCP. - // This setting is mutually exclusive with `daemonize_socket`. - 'daemonize_tcp' => false, - - // TCP host for a daemon to listen to files to analyze. - 'daemonize_tcp_host' => '127.0.0.1', - - // TCP port (from 1024 to 65535) for a daemon to listen to files to analyze. - 'daemonize_tcp_port' => 4846, - - // If this is an array, it configures the way clients will communicate with the Phan language server. - // Possibilities: Exactly one of - // - // 1. `['stdin' => true]` - // 2. `['tcp-server' => string (address this server should listen on)]` - // 3. `['tcp' => string (address client is listening on)]` - 'language_server_config' => false, - - // Valid values: false, true. Should only be set via CLI (`--language-server-analyze-only-on-save`) - 'language_server_analyze_only_on_save' => false, - - // Valid values: null, 'info'. Used when developing or debugging a language server client of Phan. - 'language_server_debug_level' => null, - - // Set this to true to emit all issues detected from the language server (e.g. invalid phpdoc in parsed files), - // not just issues in files currently open in the editor/IDE. - // This can be very verbose and has more false positives. - 'language_server_disable_output_filter' => false, - - // This should only be set by CLI (`--language-server-force-missing-pcntl` or `language-server-require-pcntl`), which will set this to true for debugging. - // When true, this will manually back up the state of the PHP process and restore it. - 'language_server_use_pcntl_fallback' => false, - - // This should only be set via CLI (`--language-server-enable-go-to-definition`) - // Affects "go to definition" and "go to type definition" of LSP. - 'language_server_enable_go_to_definition' => false, - - // This should only be set via CLI (`--language-server-enable-hover`) - // Affects "hover" of LSP. - 'language_server_enable_hover' => false, - - // This should only be set via CLI (`--language-server-enable-completion`) - // Affects "completion" of LSP. - 'language_server_enable_completion' => false, - - // Don't show the category name in issue messages. - // This makes error messages slightly shorter. - // Use `--language-server-hide-category` if you want to enable this. - 'language_server_hide_category_of_issues' => false, - - // Set this to false to disable the plugins that Phan uses to infer more accurate return types of `array_map`, `array_filter`, and many other functions. - // - // Phan is slightly faster when these are disabled. - 'enable_internal_return_type_plugins' => true, - - // Set this to true to enable the plugins that Phan uses to infer more accurate return types of `implode`, `json_decode`, and many other functions. - // - // Phan is slightly faster when these are disabled. - 'enable_extended_internal_return_type_plugins' => false, - - // If a literal string type exceeds this length, - // then Phan converts it to a regular string type. - // This setting cannot be less than 50. - // - // This setting can be overridden if users wish to store strings that are even longer than 50 bytes. - 'max_literal_string_type_length' => 200, - - 'dump_matching_functions' => false, - - // A list of plugin files to execute. - // - // Plugins which are bundled with Phan can be added here by providing their name (e.g. `'AlwaysReturnPlugin'`) - // - // Documentation about available bundled plugins can be found [here](https://github.com/phan/phan/tree/master/.phan/plugins). - // - // Alternately, you can pass in the full path to a PHP file with the plugin's implementation (e.g. `'vendor/phan/phan/.phan/plugins/AlwaysReturnPlugin.php'`) - 'plugins' => [ - ], - - // This can be used by third-party plugins that expect configuration. - // - // E.g. this is used by `InvokePHPNativeSyntaxCheckPlugin` - 'plugin_config' => [ - ], - ]; - - const COMPLETION_VSCODE = 'vscode'; - - /** - * Disallow the constructor. - */ - private function __construct() - { - } - - /** - * @return string - * Get the root directory of the project that we're - * scanning - * @suppress PhanPossiblyFalseTypeReturn getcwd() can technically be false, but we should have checked earlier - */ - public static function getProjectRootDirectory() : string - { - return self::$project_root_directory ?? \getcwd(); - } - - /** - * @param string $project_root_directory - * Set the root directory of the project that we're - * scanning - * - * @return void - */ - public static function setProjectRootDirectory( - string $project_root_directory - ) { - self::$project_root_directory = $project_root_directory; - } - - /** - * @return void - */ - public static function init() - { - static $did_init = false; - if ($did_init) { - return; - } - $did_init = true; - self::initOnce(); - } - - private static function initOnce() - { - // Trigger magic setters - foreach (self::$configuration as $name => $v) { - self::setValue($name, $v); - } - } - - /** - * @return array<string,mixed> - * A map of configuration keys and their values - */ - public static function toArray() : array - { - return self::$configuration; - } - - // method naming is deliberate to make these getters easier to search. - // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps - - /** - * Allow null to be cast as any type and for any - * type to be cast to null. - */ - public static function get_null_casts_as_any_type() : bool - { - return self::$null_casts_as_any_type; - } - - /** - * If enabled, Phan will warn if **any** type in a method's object expression - * is definitely not an object, - * or if **any** type in an invoked expression is not a callable. - */ - public static function get_strict_method_checking() : bool - { - return self::$strict_method_checking; - } - - /** - * If enabled, Phan will warn if **any** type in the argument's type - * cannot be cast to a type in the parameter's expected type. - */ - public static function get_strict_param_checking() : bool - { - return self::$strict_param_checking; - } - - /** - * If enabled, Phan will warn if **any** type in a property assignment's type - * cannot be cast to a type in the property's expected type. - */ - public static function get_strict_property_checking() : bool - { - return self::$strict_property_checking; - } - - /** - * If enabled, Phan will warn if **any** type in the return statement's union type - * cannot be cast to a type in the method's declared return type. - */ - public static function get_strict_return_checking() : bool - { - return self::$strict_return_checking; - } - - /** If enabled, allow null to cast to any array-like type. */ - public static function get_null_casts_as_array() : bool - { - return self::$null_casts_as_array; - } - - /** If enabled, allow any array-like type to be cast to null. */ - public static function get_array_casts_as_null() : bool - { - return self::$array_casts_as_null; - } - - /** If true, then Phan tracks references to elements */ - public static function get_track_references() : bool - { - return self::$track_references; - } - - /** If true, then Phan enables backwards compatibility checking. */ - public static function get_backward_compatibility_checks() : bool - { - return self::$backward_compatibility_checks; - } - - /** - * If true, then Phan runs a quick version of checks that takes less - * time at the cost of not running as thorough - * of an analysis. - */ - public static function get_quick_mode() : bool - { - return self::$quick_mode; - } - - /** @return int the 5-digit PHP version id which is closest to matching the PHP_VERSION_ID for the 'target_php_version' string */ - public static function get_closest_target_php_version_id() : int - { - return self::$closest_target_php_version_id; - } - // phpcs:enable PSR1.Methods.CamelCapsMethodName.NotCamelCaps - - /** - * @return mixed - */ - public static function getValue(string $name) - { - return self::$configuration[$name]; - } - - /** - * Resets the configuration to the initial state, prior to parsing config files and CLI arguments. - * @return void - * @internal - this should only be used in unit tests. - */ - public static function reset() - { - self::$configuration = self::DEFAULT_CONFIGURATION; - // Trigger magic behavior - self::initOnce(); - } - - /** - * @param string $name - * @param mixed $value - * @return void - */ - public static function setValue(string $name, $value) - { - self::$configuration[$name] = $value; - switch ($name) { - case 'null_casts_as_any_type': - self::$null_casts_as_any_type = $value; - break; - case 'null_casts_as_array': - self::$null_casts_as_array = $value; - break; - case 'array_casts_as_null': - self::$array_casts_as_null = $value; - break; - case 'strict_method_checking': - self::$strict_method_checking = $value; - break; - case 'strict_param_checking': - self::$strict_param_checking = $value; - break; - case 'strict_property_checking': - self::$strict_property_checking = $value; - break; - case 'strict_return_checking': - self::$strict_return_checking = $value; - break; - case 'dead_code_detection': - case 'force_tracking_references': - self::$track_references = self::getValue('dead_code_detection') || self::getValue('force_tracking_references'); - break; - case 'backward_compatibility_checks': - self::$backward_compatibility_checks = $value; - break; - case 'quick_mode': - self::$quick_mode = $value; - break; - case 'allow_method_param_type_widening': - self::$configuration['allow_method_param_type_widening_original'] = $value; - if ($value === null) { - // If this setting is set to null, infer it based on the closest php version id. - self::$configuration[$name] = self::$closest_target_php_version_id >= 70200; - } - break; - case 'target_php_version': - if (is_float($value)) { - $value = \sprintf("%.1f", $value); - } - $value = (string) ($value ?: PHP_VERSION); - if (\strtolower($value) === 'native') { - $value = PHP_VERSION; - } - - self::$closest_target_php_version_id = self::computeClosestTargetPHPVersionId($value); - if ((self::$configuration['allow_method_param_type_widening_original'] ?? null) === null) { - self::$configuration['allow_method_param_type_widening'] = self::$closest_target_php_version_id >= 70200; - } - break; - case 'exclude_analysis_directory_list': - self::$configuration['__exclude_analysis_regex'] = self::generateDirectoryListRegex($value); - break; - case 'directory_list': - self::$configuration['__directory_regex'] = self::generateDirectoryListRegex($value); - break; - } - } - - /** - * @param string[] $value - * @return ?string - */ - private static function generateDirectoryListRegex(array $value) - { - if (!$value) { - return null; - } - $parts = array_map(static function (string $path) : string { - $path = \str_replace('\\', '/', $path); // Normalize \\ to / in configs - $path = \rtrim($path, '\//'); // remove trailing / from directory - $path = \preg_replace('@^(\./)+@', '', $path); // Remove any number of leading ./ sections - return \preg_quote($path, '@'); // Quote this - }, $value); - - return '@^(\./)*(' . implode('|', $parts) . ')([/\\\\]|$)@'; - } - - private static function computeClosestTargetPHPVersionId(string $version) : int - { - if (\version_compare($version, '6.0') < 0) { - return 50600; - } elseif (\version_compare($version, '7.1') < 0) { - return 70000; - } elseif (\version_compare($version, '7.2') < 0) { - return 70100; - } elseif (\version_compare($version, '7.3') < 0) { - return 70200; - } elseif (\version_compare($version, '7.4') < 0) { - return 70300; - } elseif (\version_compare($version, '8.0') < 0) { - return 70400; - } else { - return 80000; - } - } - - /** - * @return string - * The relative path appended to the project root directory. (i.e. the absolute path) - * - * @suppress PhanUnreferencedPublicMethod - * @see FileRef::getProjectRelativePathForPath() for converting to relative paths - */ - public static function projectPath(string $relative_path) : string - { - return Paths::toAbsolutePath(self::getProjectRootDirectory(), $relative_path); - } - - /** - * @param mixed $value - */ - private static function errSuffixGotType($value) : string - { - return ", but got type '" . gettype($value) . "'"; - } - - /** - * @param array<string,mixed> $configuration - * @return array<int,string> a list of 0 or more error messages for invalid config settings - */ - public static function getConfigErrors(array $configuration) : array - { - /** - * @param mixed $value - * @return ?string - */ - $is_scalar = static function ($value) { - if (is_null($value) || \is_scalar($value)) { - return null; - } - return 'Expected a scalar' . self::errSuffixGotType($value); - }; - /** - * @param mixed $value - * @return ?string - */ - $is_bool = static function ($value) { - if (is_bool($value)) { - return null; - } - return 'Expected a boolean' . self::errSuffixGotType($value); - }; - /** - * @param mixed $value - * @return ?string - */ - $is_string_or_null = static function ($value) { - if (is_null($value) || is_string($value)) { - return null; - } - return 'Expected a string' . self::errSuffixGotType($value); - }; - /** - * @param mixed $value - * @return ?string - */ - $is_string = static function ($value) { - if (is_string($value)) { - return null; - } - return 'Expected a string' . self::errSuffixGotType($value); - }; - /** - * @param mixed $value - * @return ?string - */ - $is_array = static function ($value) { - if (is_array($value)) { - return null; - } - return 'Expected an array' . self::errSuffixGotType($value); - }; - /** - * @param mixed $value - * @return ?string - */ - $is_int_strict = static function ($value) { - if (is_int($value)) { - return null; - } - return 'Expected an integer' . self::errSuffixGotType($value); - }; - /** - * @param mixed $value - * @return ?string - */ - $is_string_list = static function ($value) { - if (!is_array($value)) { - return 'Expected a list of strings' . self::errSuffixGotType($value); - } - foreach ($value as $i => $element) { - if (!is_string($element)) { - return "Expected a list of strings: index $i is type '" . gettype($element) . "'"; - } - } - return null; - }; - /** - * @param mixed $value - * @return ?string - */ - $is_associative_string_array = static function ($value) { - if (!is_array($value)) { - return 'Expected an associative array mapping strings to strings' . self::errSuffixGotType($value); - } - foreach ($value as $i => $element) { - if (!is_string($element)) { - return "Expected an associative array mapping strings to strings: index $i is '" . gettype($element) . "'"; - } - } - return null; - }; - $config_checks = [ - 'allow_method_param_type_widening' => $is_bool, - 'allow_missing_properties' => $is_bool, - 'analyzed_file_extensions' => $is_string_list, - 'analyze_signature_compatibility' => $is_bool, - 'array_casts_as_null' => $is_bool, - 'autoload_internal_extension_signatures' => $is_associative_string_array, - 'backward_compatibility_checks' => $is_bool, - 'cache_polyfill_asts' => $is_bool, - 'check_docblock_signature_param_type_match' => $is_bool, - 'check_docblock_signature_return_type_match' => $is_bool, - 'color_issue_messages' => $is_bool, - 'color_scheme' => $is_associative_string_array, - 'consistent_hashing_file_order' => $is_bool, - 'daemonize_socket' => $is_scalar, - 'daemonize_tcp_host' => $is_string, - 'daemonize_tcp' => $is_bool, - 'daemonize_tcp_port' => $is_int_strict, - 'dead_code_detection' => $is_bool, - 'dead_code_detection_prefer_false_negative' => $is_bool, - 'directory_list' => $is_string_list, - 'disable_line_based_suppression' => $is_bool, - 'disable_suggestions' => $is_bool, - 'disable_suppression' => $is_bool, - 'dump_ast' => $is_bool, - 'dump_matching_functions' => $is_bool, - 'dump_parsed_file_list' => $is_bool, - 'dump_signatures_file' => $is_string_or_null, - 'enable_class_alias_support' => $is_bool, - 'enable_include_path_checks' => $is_bool, - 'enable_internal_return_type_plugins' => $is_bool, - 'exception_classes_with_optional_throws_phpdoc' => $is_string_list, - 'exclude_analysis_directory_list' => $is_string_list, - 'exclude_file_list' => $is_string_list, - 'exclude_file_regex' => $is_string_or_null, - 'file_list' => $is_string_list, - 'force_tracking_references' => $is_bool, - 'generic_types_enabled' => $is_bool, - 'globals_type_map' => $is_associative_string_array, - 'guess_unknown_parameter_type_using_default' => $is_bool, - 'ignore_undeclared_functions_with_known_signatures' => $is_bool, - 'ignore_undeclared_variables_in_global_scope' => $is_bool, - 'include_analysis_file_list' => $is_string_list, - 'include_paths' => $is_string_list, - 'inherit_phpdoc_types' => $is_bool, - 'language_server_analyze_only_on_save' => $is_bool, - // 'language_server_config' => array|false, // should not be set directly - 'language_server_debug_level' => $is_string_or_null, - 'language_server_disable_output_filter' => $is_bool, - 'language_server_enable_completion' => $is_scalar, - 'language_server_enable_go_to_definition' => $is_bool, - 'language_server_enable_hover' => $is_bool, - 'language_server_hide_category_of_issues' => $is_bool, - 'language_server_use_pcntl_fallback' => $is_bool, - 'markdown_issue_messages' => $is_bool, - 'max_literal_string_type_length' => $is_int_strict, - 'minimum_severity' => $is_int_strict, - 'null_casts_as_any_type' => $is_bool, - 'null_casts_as_array' => $is_bool, - 'parent_constructor_required' => $is_string_list, - 'phpdoc_type_mapping' => $is_associative_string_array, - 'plugin_config' => $is_array, - 'plugins' => $is_string_list, - 'polyfill_parse_all_element_doc_comments' => $is_bool, - 'prefer_narrowed_phpdoc_param_type' => $is_bool, - 'prefer_narrowed_phpdoc_return_type' => $is_bool, - 'pretend_newer_core_methods_exist' => $is_bool, - 'print_memory_usage_summary' => $is_bool, - 'processes' => $is_int_strict, - 'profiler_enabled' => $is_bool, - 'progress_bar' => $is_bool, - 'progress_bar_sample_interval' => $is_scalar, - 'quick_mode' => $is_bool, - 'randomize_file_order' => $is_bool, - 'read_magic_method_annotations' => $is_bool, - 'read_magic_property_annotations' => $is_bool, - 'read_type_annotations' => $is_bool, - 'runkit_superglobals' => $is_string_list, - 'scalar_array_key_cast' => $is_bool, - 'scalar_implicit_cast' => $is_bool, - 'scalar_implicit_partial' => $is_array, - 'simplify_ast' => $is_bool, - 'skip_missing_tokenizer_warning' => $is_bool, - 'skip_slow_php_options_warning' => $is_bool, - 'strict_method_checking' => $is_bool, - 'strict_param_checking' => $is_bool, - 'strict_property_checking' => $is_bool, - 'strict_return_checking' => $is_bool, - 'suggestion_check_limit' => $is_int_strict, - 'suppress_issue_types' => $is_string_list, - 'target_php_version' => $is_scalar, - 'unused_variable_detection' => $is_bool, - 'use_fallback_parser' => $is_bool, - 'use_polyfill_parser' => $is_bool, - 'warn_about_redundant_use_namespaced_class' => $is_bool, - 'warn_about_relative_include_statement' => $is_bool, - 'warn_about_undocumented_exceptions_thrown_by_invoked_functions' => $is_bool, - 'warn_about_undocumented_throw_statements' => $is_bool, - 'whitelist_issue_types' => $is_string_list, - ]; - $result = []; - foreach ($config_checks as $config_name => $check_closure) { - if (!array_key_exists($config_name, $configuration)) { - continue; - } - $value = $configuration[$config_name]; - $error = $check_closure($value); - if ($error) { - $result[] = "Invalid config value for '$config_name': $error"; - } - } - return $result; - } - - /** - * Prints errors to stderr if any config options are definitely invalid. - * @return void - */ - public static function warnIfInvalid() - { - $errors = self::getConfigErrors(self::$configuration); - foreach ($errors as $error) { - \fwrite(STDERR, $error . PHP_EOL); - } - } - - /** - * Check if the issue fixing plugin (from --automatic-fix) is enabled. - */ - public static function isIssueFixingPluginEnabled() : bool - { - return \in_array(__DIR__ . '/Plugin/Internal/IssueFixingPlugin.php', Config::getValue('plugins')); - } -} - -// Call init() to trigger the magic setters. -Config::init(); diff --git a/vendor/phan/phan/src/Phan/Config/InitializedSettings.php b/vendor/phan/phan/src/Phan/Config/InitializedSettings.php deleted file mode 100644 index b9d6306..0000000 --- a/vendor/phan/phan/src/Phan/Config/InitializedSettings.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Config; - -/** - * This class is used by 'phan --init' - * as a representation of the data to use to create a phan config for a composer project. - */ -class InitializedSettings -{ - /** @var array<string,mixed> the values for setting names*/ - public $settings; - - /** @var array<string,array<int,string>> comments for settings */ - public $comment_lines; - - /** @var int the init-level CLI option used to generate the settings. Smaller numbers mean a stricter config. */ - public $init_level; - - /** - * @param array<string,mixed> $data - * @param array<string,array<int,string>> $comment_lines - */ - public function __construct( - array $data, - array $comment_lines, - int $init_level - ) { - $this->settings = $data; - $this->comment_lines = $comment_lines; - $this->init_level = $init_level; - } -} diff --git a/vendor/phan/phan/src/Phan/Config/Initializer.php b/vendor/phan/phan/src/Phan/Config/Initializer.php deleted file mode 100644 index 87c0e88..0000000 --- a/vendor/phan/phan/src/Phan/Config/Initializer.php +++ /dev/null @@ -1,593 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Config; - -use ast\Node; -use Closure; -use Composer\Semver\Constraint\ConstraintInterface; -use Composer\Semver\VersionParser; -use Phan\AST\Parser; -use Phan\CodeBase; -use Phan\Config; -use Phan\Issue; -use Phan\Language\Context; -use TypeError; -use function count; -use function is_array; -use function is_int; -use function is_null; -use function is_string; -use const FILTER_VALIDATE_INT; -use const STDERR; - -/** - * This class is used by 'phan --init' to generate a phan config for a composer project. - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class Initializer -{ - /** - * @param array{init-overwrite?:mixed,init-no-composer?:mixed,init-level?:(int|string)} $opts - * Returns a process exit code for `phan --init` - */ - public static function initPhanConfig(array $opts) : int - { - Config::setValue('use_polyfill_parser', true); - $cwd = \getcwd(); - - $config_path = "$cwd/.phan/config.php"; - if (!isset($opts['init-overwrite'])) { - if (\file_exists($config_path)) { - \fwrite(STDERR, "phan --init refuses to run: The Phan config already exists at '$config_path'\n(Can pass --init-overwrite to force Phan to overwrite that file)\n"); - return 1; - } - } - if (isset($opts['init-no-composer'])) { - $composer_settings = []; - $vendor_path = null; - } else { - $composer_json_path = "$cwd/composer.json"; - if (!\file_exists($composer_json_path)) { - \fwrite(STDERR, "phan --init assumes that there will be a composer.json file (at '$composer_json_path')\n(Can pass --init-no-composer if this is not a composer project)\n"); - return 1; - } - $contents = \file_get_contents($composer_json_path); - if (!$contents) { - \fwrite(STDERR, "phan --init failed to read contents of $composer_json_path\n"); - return 1; - } - $composer_settings = \json_decode($contents, true); - if (!is_array($composer_settings)) { - \fwrite(STDERR, "Failed to load '$composer_json_path'\n"); - return 1; - } - - $vendor_path = $composer_settings['config']['vendor-dir'] ?? "$cwd/vendor"; - - if (!\is_dir($vendor_path)) { - \fwrite(STDERR, "phan --init assumes that 'composer.phar install' was run already (expected to find '$vendor_path')\n"); - return 1; - } - } - $phan_settings = self::createPhanSettingsForComposerSettings($composer_settings, $vendor_path, $opts); - if (!($phan_settings instanceof InitializedSettings)) { - \fwrite(STDERR, "phan --init failed to generate settings\n"); - return 1; - } - - $phan_dir = \dirname($config_path); - if (!\file_exists($phan_dir)) { - if (!\mkdir($phan_dir)) { - echo "Failed to create directory '$phan_dir'\n"; - return 1; - } - } - $settings_file_contents = self::generatePhanConfigFileContents($phan_settings); - \file_put_contents($config_path, $settings_file_contents); - echo "Successfully initialized '$config_path' with the following contents\n\n"; - echo $settings_file_contents; - return 0; - } - - /** - * @return array<string,string[]> maps a config name to a list of comment lines about that config - */ - public static function computeCommentNameDocumentationMap() : array - { - // Hackish way of extracting comment lines from Config::DEFAULT_CONFIGURATION - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - $config_file_lines = \explode("\n", \file_get_contents(\dirname(__DIR__) . '/Config.php')); - $prev_lines = []; - $result = []; - foreach ($config_file_lines as $line) { - if (\preg_match("/^ (['\"])([a-z0-9A-Z_]+)\\1\s*=>/", $line, $matches)) { - $config_name = $matches[2]; - if (count($prev_lines) > 0) { - $result[$config_name] = $prev_lines; - } - $prev_lines = []; - continue; - } - if (\preg_match('@^\s*//@', $line)) { - $prev_lines[] = \trim($line); - } else { - $prev_lines = []; - } - } - return $result; - } - - /** - * Returns indented PHP comment lines to use for the comment on $setting_name. - * Returns the empty string if nothing could be generated. - */ - public static function generateCommentForSetting(string $setting_name) : string - { - static $comment_source = null; - if (is_null($comment_source)) { - $comment_source = self::computeCommentNameDocumentationMap(); - } - $lines = $comment_source[$setting_name] ?? null; - if ($lines === null) { - return ''; - } - return \implode('', \array_map(static function (string $line) : string { - return " $line\n"; - }, $lines)); - } - - /** - * @param string $setting_name - * @param string|int|float|bool|array|null $setting_value - * @param array<int,string> $additional_comment_lines - */ - public static function generateEntrySnippetForSetting(string $setting_name, $setting_value, array $additional_comment_lines) : string - { - $source = self::generateCommentForSetting($setting_name); - foreach ($additional_comment_lines as $line) { - $source .= " // $line\n"; - } - $source .= ' '; - $source .= \var_export($setting_name, true) . ' => '; - if (is_array($setting_value)) { - if (count($setting_value) > 0) { - $source .= "[\n"; - foreach ($setting_value as $key => $element) { - if (!is_int($key)) { - throw new TypeError("Expected setting default for $setting_name to have consecutive integer keys"); - } - $source .= ' ' . \var_export($element, true) . ",\n"; - } - $source .= " ],\n"; - } else { - $source .= "[],\n"; - } - } else { - $encoded_value = \var_export($setting_value, true); - if ($setting_name === 'minimum_severity') { - switch ($setting_value) { - case Issue::SEVERITY_LOW: - $encoded_value = 'Issue::SEVERITY_LOW'; - break; - case Issue::SEVERITY_NORMAL: - $encoded_value = 'Issue::SEVERITY_NORMAL'; - break; - case Issue::SEVERITY_CRITICAL: - $encoded_value = 'Issue::SEVERITY_CRITICAL'; - break; - } - } - - $source .= "$encoded_value,\n"; - } - return $source; - } - - /** - * Returns a string containing the full source to use for the generated `.phan/config.php` - */ - public static function generatePhanConfigFileContents(InitializedSettings $settings_object) : string - { - $phan_settings = $settings_object->settings; - $init_level = $settings_object->init_level; - $comment_lines = $settings_object->comment_lines; - - $source = <<<EOT -<?php - -use Phan\Issue; - -/** - * This configuration file was automatically generated by 'phan --init --init-level=$init_level' - * - * TODOs (added by 'phan --init'): - * - * - Go through this file and verify that there are no missing/unnecessary files/directories. - * (E.g. this only includes direct composer dependencies - You may have to manually add indirect composer dependencies to 'directory_list') - * - Look at 'plugins' and add or remove plugins if appropriate (see https://github.com/phan/phan/tree/master/.phan/plugins#plugins) - * - Add global suppressions for pre-existing issues to suppress_issue_types (https://github.com/phan/phan/wiki/Tutorial-for-Analyzing-a-Large-Sloppy-Code-Base) - * - * This configuration will be read and overlaid on top of the - * default configuration. Command line arguments will be applied - * after this file is read. - * - * @see src/Phan/Config.php - * See Config for all configurable options. - * - * A Note About Paths - * ================== - * - * Files referenced from this file should be defined as - * - * ``` - * Config::projectPath('relative_path/to/file') - * ``` - * - * where the relative path is relative to the root of the - * project which is defined as either the working directory - * of the phan executable or a path passed in via the CLI - * '-d' flag. - */ -return [ - -EOT; - foreach ($phan_settings as $setting_name => $setting_value) { - $source .= "\n"; - $source .= self::generateEntrySnippetForSetting($setting_name, $setting_value, $comment_lines[$setting_name] ?? []); - } - $source .= "];\n"; - return $source; - } - - const LEVEL_MAP = [ - 'strict' => 1, - 'strong' => 2, - 'average' => 3, - 'normal' => 3, - 'weak' => 4, - 'weakest' => 5, - ]; - - /** - * @param array<string,mixed> $composer_settings (can be empty for --init-no-composer) - * @param ?string $vendor_path (can be null for --init-no-composer) - * @param array{init-analyze-file?:string,init-overwrite?:mixed,init-no-composer?:mixed,init-level?:(int|string)} $opts parsed from getopt - * @return ?InitializedSettings - * @internal - */ - public static function createPhanSettingsForComposerSettings(array $composer_settings, $vendor_path, array $opts) - { - $level = $opts['init-level'] ?? 3; - $level = self::LEVEL_MAP[\strtolower((string)$level)] ?? $level; - if (\filter_var($level, FILTER_VALIDATE_INT) === false) { - echo "Invalid --init-level=$level\n"; - return null; - } - $level = \max(1, \min(5, (int)$level)); - $is_strongest_level = $level === 1; - $is_strong_or_weaker_level = $level >= 2; - $is_average_level = $level >= 3; - $is_weak_level = $level >= 4; - $is_weakest_level = $level >= 5; - - $cwd = \getcwd(); - list($project_directory_list, $project_file_list) = self::extractAutoloadFilesAndDirectories('', $composer_settings); - if ($vendor_path !== null && count($project_directory_list) === 0 && count($project_file_list) === 0) { - echo "phan --init expects composer.json to contain 'autoload' psr-4 directories\n"; - return null; - } - $minimum_severity = $is_weak_level ? Issue::SEVERITY_NORMAL : Issue::SEVERITY_LOW; - if ($is_weakest_level) { - $plugins = []; - } elseif ($is_average_level) { - $plugins = [ - 'AlwaysReturnPlugin', - 'PregRegexCheckerPlugin', - 'UnreachableCodePlugin', - ]; - } else { - $plugins = [ - 'AlwaysReturnPlugin', - 'DollarDollarPlugin', - 'DuplicateArrayKeyPlugin', - 'DuplicateExpressionPlugin', - 'PregRegexCheckerPlugin', - 'PrintfCheckerPlugin', - 'SleepCheckerPlugin', - 'UnreachableCodePlugin', - 'UseReturnValuePlugin', - ]; - } - - $comments = []; - list($target_php_version, $comments['target_php_version']) = self::determineTargetPHPVersion($composer_settings); - - $phan_settings = [ - 'target_php_version' => $target_php_version, - 'allow_missing_properties' => $is_weak_level, - 'null_casts_as_any_type' => $is_weak_level, - 'null_casts_as_array' => $is_average_level, - 'array_casts_as_null' => $is_average_level, - 'scalar_implicit_cast' => $is_weak_level, - 'scalar_array_key_cast' => $is_average_level, - // TODO: Migrate to a smaller subset scalar_implicit_partial as analysis gets stricter? - 'scalar_implicit_partial' => [], - 'strict_method_checking' => !$is_average_level, - // strict param/return checking has a lot of false positives. Limit it to the strongest analysis level. - 'strict_param_checking' => $is_strongest_level, - 'strict_return_checking' => $is_strongest_level, - 'strict_property_checking' => $is_strongest_level, - 'ignore_undeclared_variables_in_global_scope' => $is_average_level, - 'ignore_undeclared_functions_with_known_signatures' => $is_strong_or_weaker_level, - 'backward_compatibility_checks' => false, // this is slow - 'check_docblock_signature_return_type_match' => !$is_average_level, - 'prefer_narrowed_phpdoc_param_type' => true, - 'prefer_narrowed_phpdoc_return_type' => true, - 'analyze_signature_compatibility' => !$is_weak_level, - 'phpdoc_type_mapping' => [], - 'dead_code_detection' => false, // this is slow - 'unused_variable_detection' => !$is_average_level, - 'quick_mode' => $is_weakest_level, - 'simplify_ast' => true, - 'generic_types_enabled' => true, - 'globals_type_map' => [], - 'minimum_severity' => $minimum_severity, - 'suppress_issue_types' => [], - 'exclude_file_regex' => $vendor_path !== null ? '@^vendor/.*/(tests?|Tests?)/@' : null, - 'exclude_file_list' => [], - 'exclude_analysis_directory_list' => $vendor_path !== null ? [ - 'vendor/' - ] : [], - 'enable_include_path_checks' => !$is_weak_level, - 'processes' => 1, - 'analyzed_file_extensions' => ['php'], - 'autoload_internal_extension_signatures' => [], - 'plugins' => $plugins, - ]; - - $phan_directory_list = $project_directory_list; - $phan_file_list = $project_file_list; - - // TODO: Figure out which require-dev directories can be skipped - $require_directories = $composer_settings['require'] ?? []; - $require_dev_directories = $composer_settings['require-dev'] ?? []; - foreach (\array_merge($require_directories, $require_dev_directories) as $requirement => $_) { - if (\substr_count($requirement, '/') !== 1) { - // e.g. ext-ast, php >= 7.0, etc. - continue; - } - $path_to_require = "$vendor_path/$requirement"; - if (!\is_dir($path_to_require)) { - $requirement = \strtolower($requirement); - $path_to_require = "$vendor_path/$requirement"; - if (!\is_dir($path_to_require)) { - echo "Warning: $path_to_require does not exist, continuing\n"; - continue; - } - } - $path_to_composer_json = "$path_to_require/composer.json"; - if (!\file_exists($path_to_composer_json)) { - echo "Warning: $path_to_composer_json does not exist, continuing\n"; - continue; - } - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - $library_composer_settings = \json_decode(\file_get_contents($path_to_composer_json), true); - if (!is_array($library_composer_settings)) { - echo "Warning: $path_to_composer_json is invalid JSON, continuing\n"; - continue; - } - - list($library_directory_list, $library_file_list) = self::extractAutoloadFilesAndDirectories("vendor/$requirement", $library_composer_settings); - $phan_directory_list = \array_merge($phan_directory_list, $library_directory_list); - $phan_file_list = \array_merge($phan_file_list, $library_file_list); - } - foreach (self::getArrayOption($opts, 'init-analyze-dir') as $extra_dir) { - $path_to_require = "$cwd/$extra_dir"; - if (!\is_dir($path_to_require)) { - echo "phan --init-analyze-dir was given a missing/invalid relative directory '$extra_dir'\n"; - return null; - } - $phan_directory_list[] = $extra_dir; - } - - foreach ($composer_settings['bin'] ?? [] as $relative_path_to_binary) { - if (self::isPHPBinary($relative_path_to_binary)) { - $phan_file_list[] = $relative_path_to_binary; - } - } - foreach (self::getArrayOption($opts, 'init-analyze-file') as $extra_file) { - $path_to_require = "$cwd/$extra_file"; - if (!\is_file($path_to_require)) { - echo "phan --init-analyze-file was given a missing/invalid relative file '$extra_file'\n"; - return null; - } - $phan_file_list[] = $extra_file; - } - - if (count($phan_file_list) === 0 && count($phan_directory_list) === 0) { - echo "phan --init failed to find any directories or files to analyze, giving up.\n"; - return null; - } - \sort($phan_directory_list); - \sort($phan_file_list); - - $phan_settings['directory_list'] = \array_unique($phan_directory_list); - $phan_settings['file_list'] = \array_unique($phan_file_list); - return new InitializedSettings($phan_settings, $comments, $level); - } - - /** - * @param array<string,mixed> $composer_settings parsed from composer.json - * @return array{0:?string,1:array<int,string>} - */ - public static function determineTargetPHPVersion(array $composer_settings) : array - { - $php_version_constraint = $composer_settings['require']['php'] ?? null; - if (!$php_version_constraint || !is_string($php_version_constraint)) { - return [null, ['TODO: Choose a target_php_version for this project, or leave as null and remove this comment']]; - } - try { - $version_constraint = self::parseConstraintsForRange($php_version_constraint); - } catch (\UnexpectedValueException $_) { - return [null, ['TODO: Choose a target_php_version for this project, or leave as null and remove this comment']]; - } - // Not going to suggest 5.6 - analyzing with 7.0 might detect some functions that were removed - if ($version_constraint->matches(self::parseConstraintsForRange('<7.1-dev'))) { - $version_guess = '7.0'; - } elseif ($version_constraint->matches(self::parseConstraintsForRange('<7.2-dev'))) { - $version_guess = '7.1'; - } elseif ($version_constraint->matches(self::parseConstraintsForRange('<7.3-dev'))) { - $version_guess = '7.2'; - } elseif ($version_constraint->matches(self::parseConstraintsForRange('>= 7.3-dev'))) { - $version_guess = '7.3'; - } else { - return [null, ['TODO: Choose a target_php_version for this project, or leave as null and remove this comment']]; - } - return [$version_guess, ['Automatically inferred from composer.json requirement for "php" of ' . \json_encode($php_version_constraint)]]; - } - - private static function parseConstraintsForRange(string $constraints) : ConstraintInterface - { - return (new VersionParser())->parseConstraints($constraints); - } - - /** - * @param array<string,mixed> $composer_settings settings parsed from composer.json - * @return array<int,array<int,string>> [$directory_list, $file_list] - */ - private static function extractAutoloadFilesAndDirectories(string $relative_dir, array $composer_settings) - { - $directory_list = []; - $file_list = []; - $autoload_setting = $composer_settings['autoload'] ?? []; - $autoload_directories = \array_merge( - $autoload_setting['psr-4'] ?? [], - $autoload_setting['psr-0'] ?? [], - $autoload_setting['classmap'] ?? [] - ); - - foreach ($autoload_directories as $lib_list) { - if (is_string($lib_list)) { - $lib_list = [$lib_list]; - } - foreach ($lib_list as $lib) { - if (!is_string($lib)) { - echo "Warning: unexpected autoload field in '$relative_dir/composer.json'\n"; - continue; - } - $composer_lib_relative_path = "$relative_dir/$lib"; - $composer_lib_absolute_path = \getcwd() . "/$composer_lib_relative_path"; - if (!\file_exists($composer_lib_absolute_path)) { - echo "Warning: could not find '$composer_lib_relative_path'\n"; - continue; - } - - $composer_lib_relative_path = \preg_replace('@(/\.)+$@', '', $composer_lib_relative_path); - if (\is_dir($composer_lib_absolute_path)) { - $directory_list[] = \trim($composer_lib_relative_path, '/'); - } elseif (\is_file($composer_lib_relative_path)) { - $file_list[] = \trim($composer_lib_relative_path, '/'); - } - } - } - return self::filterDirectoryAndFileList($directory_list, $file_list); - } - - /** - * Sort and return the unique directories and files to be added to the Phan config. - * (don't return directories/files within other directories) - * - * @param array<int,string> $directory_list - * @param array<int,string> $file_list - * @return array<int,array<int,string>> [$directory_list, $file_list] - */ - public static function filterDirectoryAndFileList(array $directory_list, array $file_list) : array - { - \sort($directory_list); - \sort($file_list); - if (count($directory_list) > 0) { - $filter = self::createNotInDirectoryFilter($directory_list); - $directory_list = \array_filter($directory_list, $filter); - $file_list = \array_filter($file_list, $filter); - } - return [ - \array_values(\array_unique($directory_list)), - \array_values(\array_unique($file_list)) - ]; - } - - /** - * @param string[] $directory_list - * @return Closure(string):bool a closure that returns true if the passed in file is not within any folders in $directory_list - */ - private static function createNotInDirectoryFilter(array $directory_list) : Closure - { - $parts = \array_map(static function (string $path) : string { - return \preg_quote($path, '@'); - }, $directory_list); - $prefix_filter = '@^(' . \implode($parts, '|') . ')[\\\\/]@'; - return static function (string $path) use ($prefix_filter) : bool { - return !\preg_match($prefix_filter, $path); - }; - } - - /** - * @param array<string,mixed> $opts - * @return array<int,string> - */ - private static function getArrayOption(array $opts, string $key) - { - $values = $opts[$key] ?? []; - if (is_string($values)) { - return [$values]; - } - return is_array($values) ? $values : []; - } - - /** - * Returns true if there is at least one statement that is parseable and not an inline HTML echo statement. - * - * This indicates that $relative_path points to a PHP binary file that should be analyzed. - */ - public static function isPHPBinary(string $relative_path) : bool - { - $cwd = \getcwd(); - $absolute_path = "$cwd/$relative_path"; - if (!\file_exists($absolute_path)) { - \printf("Failed to find '%s', continuing\n", $absolute_path); - return false; - } - $contents = \file_get_contents($absolute_path); - if (!is_string($contents)) { - \printf("Failed to read '%s', continuing\n", $absolute_path); - return false; - } - try { - // PHP binaries can have many forms, may begin with #/usr/bin/env php. - // We assume that if it's parsable and contains at least one PHP executable line, it's valid. - $ast = Parser::parseCode( - new CodeBase([], [], [], [], []), - new Context(), - null, - $relative_path, - $contents, - true - ); - if (!($ast instanceof Node)) { - return false; - } - $child_nodes = $ast->children; - if (count($child_nodes) !== 1) { - return true; - } - $node = $child_nodes[0]; - return $node->kind !== \ast\AST_ECHO || !is_string($node->children['expr']); - } catch (\ParseError $_) { - return false; - } catch (\CompileError $_) { - return false; - } catch (\Phan\AST\TolerantASTConverter\ParseException $_) { - return false; - } - } -} diff --git a/vendor/phan/phan/src/Phan/Daemon.php b/vendor/phan/phan/src/Phan/Daemon.php deleted file mode 100644 index 470de0d..0000000 --- a/vendor/phan/phan/src/Phan/Daemon.php +++ /dev/null @@ -1,270 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use AssertionError; -use Closure; -use Exception; -use InvalidArgumentException; -use Phan\Daemon\ExitException; -use Phan\Daemon\Request; -use Phan\Daemon\Transport\StreamResponder; -use RuntimeException; - -/** - * A simple analyzing daemon that can be used by IDEs. (see `phan_client`) - * Accepts requests (Currently only JSON blobs) over a Unix socket or TCP socket. - * - * @see \Phan\LanguageServer\LanguageServer for an implementation of the Language Server Protocol - */ -class Daemon -{ - /** - * This creates an analyzing daemon, to be used by IDEs. - * Format: - * - * - Read over TCP socket, e.g. with JSON - * - Respond over TCP socket, e.g. with JSON - * - * @param CodeBase $code_base (Must have undo tracker enabled) - * - * @param Closure $file_path_lister - * Returns string[] - A list of files to scan. This may be different from the previous contents. - * - * @return Request|null - A writable request, which has been fully read from. - * Callers should close after they are finished writing. - * - * @throws Exception if analysis fails unexpectedly - */ - public static function run(CodeBase $code_base, Closure $file_path_lister) - { - if (Config::getValue('language_server_use_pcntl_fallback')) { - self::runWithoutPcntl($code_base, $file_path_lister); - // Not reachable - exit(0); - } - if (!$code_base->isUndoTrackingEnabled()) { - throw new AssertionError("Expected undo tracking to be enabled when starting daemon mode"); - } - - // example requests over TCP - // Assumes that clients send and close the their requests quickly, then wait for a response. - - // {"method":"analyze","files":["/path/to/file1.php","/path/to/file2.php"]} - - $socket_server = self::createDaemonStreamSocketServer(); - // TODO: Limit the maximum number of active processes to a small number(4?) - try { - $got_signal = false; - - if (\function_exists('pcntl_signal')) { - \pcntl_signal( - \SIGCHLD, - /** - * @param int $signo - * @param int|null $status - * @param int|null $pid - * @return void - */ - static function ($signo, $status = null, $pid = null) use (&$got_signal) { - $got_signal = true; - Request::childSignalHandler($signo, $status, $pid); - } - ); - } - while (true) { - $got_signal = false; // reset this. - // We get an error from stream_socket_accept. After the RuntimeException is thrown, pcntl_signal is called. - /** - * @param int $severity - * @param string $message - * @param string $file - * @param int $line - * @return bool - */ - $previous_error_handler = \set_error_handler(static function ($severity, $message, $file, $line) use (&$previous_error_handler) { - self::debugf("In new error handler '$message'"); - if (!\preg_match('/stream_socket_accept/i', $message)) { - return $previous_error_handler($severity, $message, $file, $line); - } - throw new RuntimeException("Got signal"); - }); - - $conn = false; - try { - $conn = \stream_socket_accept($socket_server, -1); - } catch (RuntimeException $_) { - self::debugf("Got signal"); - \pcntl_signal_dispatch(); - self::debugf("done processing signals"); - if ($got_signal) { - continue; // Ignore notices from stream_socket_accept if it's due to being interrupted by a child process terminating. - } - } finally { - \restore_error_handler(); - } - - if (!\is_resource($conn)) { - // If we didn't get a connection, and it wasn't due to a signal from a child process, then stop the daemon. - break; - } - $request = Request::accept( - $code_base, - $file_path_lister, - new StreamResponder($conn, true), - true - ); - if ($request instanceof Request) { - return $request; // We forked off a worker process successfully, and this is the worker process - } - } - \error_log("Stopped accepting connections"); - } finally { - \restore_error_handler(); - } - return null; - } - - /** - * @return void - A writable request, which has been fully read from. - * Callers should close after they are finished writing. - * - * @throws Exception if analysis failed in an unexpected way - */ - private static function runWithoutPcntl(CodeBase $code_base, Closure $file_path_lister) - { - // This is a single threaded server, it only analyzes one TCP request at a time - $socket_server = self::createDaemonStreamSocketServer(); - try { - while (true) { - // We get an error from stream_socket_accept. After the RuntimeException is thrown, pcntl_signal is called. - $previous_error_handler = \set_error_handler( - /** - * @param int $severity - * @param string $message - * @param string $file - * @param int $line - * @return bool - */ - static function ($severity, $message, $file, $line) use (&$previous_error_handler) { - self::debugf("In new error handler '$message'"); - if (!\preg_match('/stream_socket_accept/i', $message)) { - return $previous_error_handler($severity, $message, $file, $line); - } - throw new RuntimeException("Got signal"); - } - ); - - $conn = false; - try { - $conn = \stream_socket_accept($socket_server, -1); - } catch (RuntimeException $_) { - self::debugf("Got signal"); - \pcntl_signal_dispatch(); - self::debugf("done processing signals"); - } finally { - \restore_error_handler(); - } - - if (!\is_resource($conn)) { - // If we didn't get a connection, and it wasn't due to a signal from a child process, then stop the daemon. - break; - } - // We **are** the only process. Imitate the worker process - $request = Request::accept( - $code_base, - $file_path_lister, - new StreamResponder($conn, true), - false // This is not a fork, do not call exit($status) - ); - if ($request instanceof Request) { - self::debugf("Calling analyzeDaemonRequestOnMainThread\n"); - // This did not fork, and will not fork (Unless --processes N was used) - self::analyzeDaemonRequestOnMainThread($code_base, $request); - // Force garbage collection in case it didn't respond - $request = null; - self::debugf("Finished call to analyzeDaemonRequestOnMainThread\n"); - // We did not terminate, we keep accepting - } - } - \error_log("Stopped accepting connections"); - } finally { - \restore_error_handler(); - } - } - - /** - * @return void - * @throws Exception if analysis throws - */ - private static function analyzeDaemonRequestOnMainThread(CodeBase $code_base, Request $request) - { - $restore_point = $code_base->createRestorePoint(); - - // Stop tracking undo operations, now that the parse phase is done. - // TODO: Save and reset $code_base in place - $analyze_file_path_list = $request->filterFilesToAnalyze($code_base->getParsedFilePathList()); - $code_base->disableUndoTracking(); - Phan::setPrinter($request->getPrinter()); - if (\count($analyze_file_path_list) === 0) { - // Nothing to do, don't start analysis - $request->respondWithNoFilesToAnalyze(); // respond and exit. - return; - } - $temporary_file_mapping = $request->getTemporaryFileMapping(); - - try { - Phan::finishAnalyzingRemainingStatements($code_base, $request, $analyze_file_path_list, $temporary_file_mapping); - } catch (ExitException $_) { - // This is normal and expected, do nothing - } finally { - $code_base->restoreFromRestorePoint($restore_point); - } - } - - /** - * @return resource (resource is not a reserved keyword) - * @throws InvalidArgumentException if the config does not specify a method. (should not happen) - */ - private static function createDaemonStreamSocketServer() - { - if (Config::getValue('daemonize_socket')) { - $listen_url = 'unix://' . Config::getValue('daemonize_socket'); - } elseif (Config::getValue('daemonize_tcp')) { - $listen_url = \sprintf('tcp://%s:%d', Config::getValue('daemonize_tcp_host'), Config::getValue('daemonize_tcp_port')); - } else { - throw new InvalidArgumentException("Should not happen, no port/socket for daemon to listen on."); - } - \printf( - "Listening for Phan analysis requests at %s\nAwaiting analysis requests for directory %s\n", - $listen_url, - \var_export(Config::getProjectRootDirectory(), true) - ); - $socket_server = \stream_socket_server($listen_url, $errno, $errstr); - if (!$socket_server) { - \error_log("Failed to create Unix socket server $listen_url: $errstr ($errno)\n"); - exit(1); - } - return $socket_server; - } - - /** - * Debug (non-error) statement related to the daemon. - * Uncomment this when debugging issues (E.g. changes not being picked up) - * - * @param string $format - printf style format string @phan-unused-param - * @param mixed ...$args - printf args @phan-unused-param - * @return void - */ - public static function debugf(string $format, ...$args) - { - /* - if (count($args) > 0) { - $message = sprintf($format, ...$args); - } else { - $message = $format; - } - error_log($message); - */ - } -} diff --git a/vendor/phan/phan/src/Phan/Daemon/ExitException.php b/vendor/phan/phan/src/Phan/Daemon/ExitException.php deleted file mode 100644 index c279ac0..0000000 --- a/vendor/phan/phan/src/Phan/Daemon/ExitException.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Daemon; - -/** - * An exception thrown to indicate that the caller should exit() with the given error code. - * - * This is thrown instead of directly calling exit() - * so that code that exits can be unit tested, - * or so that the forked processes of Phan language servers - * can clean up and finish reporting analysis results. - */ -class ExitException extends \Exception -{ -} diff --git a/vendor/phan/phan/src/Phan/Daemon/Request.php b/vendor/phan/phan/src/Phan/Daemon/Request.php deleted file mode 100644 index 45f4fa3..0000000 --- a/vendor/phan/phan/src/Phan/Daemon/Request.php +++ /dev/null @@ -1,736 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Daemon; - -use Closure; -use Phan\Analysis; -use Phan\AST\TolerantASTConverter\TolerantASTConverter; -use Phan\CodeBase; -use Phan\Config; -use Phan\Daemon; -use Phan\Daemon\Transport\Responder; -use Phan\Language\FileRef; -use Phan\Language\Type; -use Phan\LanguageServer\CompletionRequest; -use Phan\LanguageServer\FileMapping; -use Phan\LanguageServer\GoToDefinitionRequest; -use Phan\LanguageServer\NodeInfoRequest; -use Phan\Library\FileCache; -use Phan\Library\StringUtil; -use Phan\Output\IssuePrinterInterface; -use Phan\Output\Printer\FilteringPrinter; -use Phan\Output\PrinterFactory; -use Symfony\Component\Console\Output\BufferedOutput; - -use function count; -use function get_class; -use function in_array; -use function is_array; -use function is_string; -use function strlen; - -use const DEBUG_BACKTRACE_IGNORE_ARGS; -use const SIGCHLD; -use const SORT_STRING; -use const WNOHANG; - -/** - * Represents the state of a client request to a daemon, and contains methods for sending formatted responses. - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class Request -{ - const METHOD_ANALYZE_FILES = 'analyze_files'; // has shorthand analyze_file with param 'file' - - const PARAM_METHOD = 'method'; - const PARAM_FILES = 'files'; - const PARAM_FORMAT = 'format'; - const PARAM_COLOR = 'color'; - const PARAM_TEMPORARY_FILE_MAPPING_CONTENTS = 'temporary_file_mapping_contents'; - - // success codes - const STATUS_OK = 'ok'; // unrecognized output format - const STATUS_NO_FILES = 'no_files'; // none of the requested files were in this project's config directories - - // failure codes - const STATUS_INVALID_FORMAT = 'invalid_format'; // unrecognized requested output "format" - const STATUS_ERROR_UNKNOWN = 'error_unknown'; - const STATUS_INVALID_FILES = 'invalid_files'; // expected a valid string for 'files'/'file' - const STATUS_INVALID_METHOD = 'invalid_method'; // expected 'method' to be analyze_files or - const STATUS_INVALID_REQUEST = 'invalid_request'; // expected a valid string for 'files'/'file' - - /** @var Responder|null - Null after the response is sent. */ - private $responder; - - /** - * @var array{method:string,files:array<int,string>,format:string,temporary_file_mapping_contents:array<string,string>} - * - * The configuration passed in with the request to the daemon. - */ - private $request_config; - - /** @var BufferedOutput this collects the serialized issues emitted by this worker to be sent back to the master process */ - private $buffered_output; - - /** @var string the method of the daemon being invoked */ - private $method; - - /** @var array<int,string>|null the list of files the client has requested to be analyzed */ - private $files = null; - - /** - * A set of process ids of child processes - * @var array<int,true> - */ - private static $child_pids = []; - - /** - * A set of process ids of child processes - * @var array<int,int> - */ - private static $exited_pid_status = []; - - - /** - * The most recent Language Server Protocol request to look up what an element is - * (e.g. "go to definition", "go to type definition", "hover") - * - * @var ?NodeInfoRequest - */ - private $most_recent_node_info_request; - - /** - * If true, this process will exit() after finishing. - * If false, this class will instead throw ExitException to be caught by the caller - * (E.g. if pcntl is unavailable) - * - * @var bool - */ - private $should_exit; - - /** - * @param array{method:string,files:array<int,string>,format:string,temporary_file_mapping_contents:array<string,string>} $config - * @param ?NodeInfoRequest $most_recent_node_info_request - */ - private function __construct(Responder $responder, array $config, $most_recent_node_info_request, bool $should_exit) - { - $this->responder = $responder; - $this->request_config = $config; - $this->buffered_output = new BufferedOutput(); - $this->method = $config[self::PARAM_METHOD]; - if ($this->method === self::METHOD_ANALYZE_FILES) { - $this->files = $config[self::PARAM_FILES]; - } - $this->most_recent_node_info_request = $most_recent_node_info_request; - $this->should_exit = $should_exit; - } - - /** - * @param string $file_path an absolute or relative path to be analyzed - */ - public function shouldUseMappingPolyfill(string $file_path) : bool - { - if ($this->most_recent_node_info_request) { - return $this->most_recent_node_info_request->getPath() === Config::projectPath($file_path); - } - return false; - } - - /** - * @param string $file_path an absolute or relative path to be analyzed - */ - public function shouldAddPlaceholdersForPath(string $file_path) : bool - { - if ($this->most_recent_node_info_request instanceof CompletionRequest) { - return $this->most_recent_node_info_request->getPath() === Config::projectPath($file_path); - } - return false; - } - - /** - * @return int - */ - public function getTargetByteOffset(string $file_contents) : int - { - if ($this->most_recent_node_info_request) { - $position = $this->most_recent_node_info_request->getPosition(); - return $position->toOffset($file_contents); - } - return -1; - } - - /** - * @return void (unreachable) - * @throws ExitException to imitate an exit without actually exiting - */ - public function exit(int $exit_code) - { - if ($this->should_exit) { - Daemon::debugf("Exiting"); - exit($exit_code); - } - throw new ExitException("done", $exit_code); - } - - /** - * @param Responder $responder (e.g. a socket to write a response on) - * @param array<int,string> $file_names absolute path of file(s) to analyze - * @param CodeBase $code_base (for refreshing parse state) - * @param Closure $file_path_lister (for refreshing parse state) - * @param FileMapping $file_mapping object tracking the overrides made by a client. - * @param ?NodeInfoRequest $most_recent_node_info_request contains a promise that we want the resolution of - * @param bool $should_exit - If this is true, calling $this->exit() will terminate the program. If false, ExitException will be thrown. - */ - public static function makeLanguageServerAnalysisRequest( - Responder $responder, - array $file_names, - CodeBase $code_base, - Closure $file_path_lister, - FileMapping $file_mapping, - $most_recent_node_info_request, - bool $should_exit - ) : Request { - FileCache::clear(); - $file_mapping_contents = self::normalizeFileMappingContents($file_mapping->getOverrides(), $error_message); - if ($most_recent_node_info_request instanceof CompletionRequest) { - $file_mapping_contents = self::adjustFileMappingContentsForCompletionRequest($file_mapping_contents, $most_recent_node_info_request); - } - // Use the temporary contents if they're available - Request::reloadFilePathListForDaemon($code_base, $file_path_lister, $file_mapping_contents, $file_names); - if ($error_message !== null) { - Daemon::debugf($error_message); - } - $result = new self( - $responder, - [ - self::PARAM_FORMAT => 'json', - self::PARAM_METHOD => self::METHOD_ANALYZE_FILES, - self::PARAM_FILES => $file_names, - self::PARAM_TEMPORARY_FILE_MAPPING_CONTENTS => $file_mapping_contents, - ], - $most_recent_node_info_request, - $should_exit - ); - return $result; - } - - /** - * When a user types :: or -> and requests code completion at the end of a line, - * then add __INCOMPLETE_PROPERTY__ or __INCOMPLETE_CLASS_CONST__ so that this - * can get parsed and completed. - * @param array<string,string> $file_mapping_contents old map from relative file paths to contents. - * @return array<string,string> - */ - private static function adjustFileMappingContentsForCompletionRequest( - array $file_mapping_contents, - CompletionRequest $completion_request - ) { - $file = FileRef::getProjectRelativePathForPath($completion_request->getPath()); - // fwrite(STDERR, "\nSaw $file in " . json_encode(array_keys($file_mapping_contents)) . "\n"); - $contents = $file_mapping_contents[$file] ?? null; - if ($contents) { - $position = $completion_request->getPosition(); - $lines = \explode("\n", $contents); - $line = $lines[$position->line] ?? null; - // $len = strlen($line ?? ''); fwrite(STDERR, "Looking at $line : $position of $len\n"); - if (is_string($line) && strlen($line) === $position->character + 1 && $position->character > 0) { - // fwrite(STDERR, "cursor at the end of the line\n"); - if (\preg_match('/(::|->)$/', $line, $matches)) { - // fwrite(STDERR, "Updating the file\n"); - if ($matches[1] === '::') { - $addition = TolerantASTConverter::INCOMPLETE_CLASS_CONST; - } else { - $addition = TolerantASTConverter::INCOMPLETE_PROPERTY; - } - $lines[$position->line] .= $addition; - $new_contents = \implode("\n", $lines); - $file_mapping_contents[$file] = $new_contents; - // fwrite(STDERR, "Going to complete\n$new_contents\n====\nA"); - } - } - } - return $file_mapping_contents; - } - - /** - * Returns a printer that will be used to send JSON serialized data to the daemon client (i.e. `phan_client`). - */ - public function getPrinter() : IssuePrinterInterface - { - $this->handleClientColorOutput(); - - $factory = new PrinterFactory(); - $format = $this->request_config[self::PARAM_FORMAT] ?? 'json'; - if (!in_array($format, $factory->getTypes())) { - $this->sendJSONResponse([ - "status" => self::STATUS_INVALID_FORMAT, - ]); - exit(0); - } - // In both the Language Server and the Daemon, - // this deliberately sends only analysis results of the files that are currently open. - // - // Otherwise, there might be an overwhelming number of issues to solve in some projects before using this in the IDE (e.g. PhanUnreferencedUseNormal) - $printer = $factory->getPrinter($format, $this->buffered_output); - $files = $this->request_config[self::PARAM_FILES] ?? null; - if (is_array($files) && count($files) > 0 && !Config::getValue('language_server_disable_output_filter')) { - return new FilteringPrinter($files, $printer); - } - return $printer; - } - - /** - * Handle a request created by the client with `phan_client --color` - */ - private function handleClientColorOutput() - { - // Back up the original state: If pcntl isn't used, we don't want subsequent requests to be accidentally colorized. - static $original_color = null; - if ($original_color === null) { - $original_color = (bool)Config::getValue('color_issue_messages'); - } - $new_color = $this->request_config[self::PARAM_COLOR] ?? $original_color; - Config::setValue('color_issue_messages', $new_color); - } - - /** - * Respond with issues in the requested format - * @return void - * @see LanguageServer::handleJSONResponseFromWorker() for one possible usage of this - */ - public function respondWithIssues(int $issue_count) - { - $raw_issues = $this->buffered_output->fetch(); - if (($this->request_config[self::PARAM_FORMAT] ?? null) === 'json') { - $issues = \json_decode($raw_issues, true); - if (!\is_array($issues)) { - $issues = "(Failed to decode) " . \json_last_error_msg() . ': ' . $raw_issues; - } - } else { - $issues = $raw_issues; - } - $response = [ - "status" => self::STATUS_OK, - "issue_count" => $issue_count, - "issues" => $issues, - ]; - $most_recent_node_info_request = $this->most_recent_node_info_request; - if ($most_recent_node_info_request instanceof GoToDefinitionRequest) { - $response['definitions'] = $most_recent_node_info_request->getDefinitionLocations(); - $response['hover_response'] = $most_recent_node_info_request->getHoverResponse(); - } elseif ($most_recent_node_info_request instanceof CompletionRequest) { - $response['completions'] = $most_recent_node_info_request->getCompletions(); - } - $this->sendJSONResponse($response); - } - - /** - * @return void - */ - public function respondWithNoFilesToAnalyze() - { - // The mentioned file wasn't in .phan/config.php's list of files to analyze. - $this->sendJSONResponse([ - "status" => self::STATUS_NO_FILES, - ]); - } - - /** - * @param array<int,string> $analyze_file_path_list - * @return array<int,string> - */ - public function filterFilesToAnalyze(array $analyze_file_path_list) : array - { - if (\is_null($this->files)) { - Daemon::debugf("No files to filter in filterFilesToAnalyze"); - return $analyze_file_path_list; - } - - $analyze_file_path_set = \array_flip($analyze_file_path_list); - $filtered_files = []; - foreach ($this->files as $file) { - // Must be relative to project, allow absolute paths to be passed in. - $file = FileRef::getProjectRelativePathForPath($file); - - if (\array_key_exists($file, $analyze_file_path_set)) { - $filtered_files[] = $file; - } else { - // TODO: Reload file list once before processing request? - // TODO: Change this to also support analyzing files that would normally be parsed but not analyzed? - Daemon::debugf("Failed to find requested file '%s' in parsed file list", $file, StringUtil::jsonEncode($analyze_file_path_list)); - } - } - Daemon::debugf("Returning file set: %s", StringUtil::jsonEncode($filtered_files)); - return $filtered_files; - } - - /** - * TODO: convert absolute path to file contents - * @return array<string,string> - Maps original relative file paths to contents. - */ - public function getTemporaryFileMapping() : array - { - $mapping = $this->request_config[self::PARAM_TEMPORARY_FILE_MAPPING_CONTENTS] ?? []; - if (!is_array($mapping)) { - $mapping = []; - } - Daemon::debugf("Have the following files in mapping: %s", StringUtil::jsonEncode(\array_keys($mapping))); - return $mapping; - } - - /** - * @return ?NodeInfoRequest - */ - public function getMostRecentNodeInfoRequest() - { - return $this->most_recent_node_info_request; - } - - /** - * @return void - */ - public function rejectLanguageServerRequestsRequiringAnalysis() - { - if ($this->most_recent_node_info_request) { - $this->most_recent_node_info_request->finalize(); - $this->most_recent_node_info_request = null; - } - } - - /** - * Send a response and close the connection, for the given socket's protocol. - * Currently supports only JSON. - * TODO: HTTP protocol. - * - * @param array<string,mixed> $response - * @return void - */ - public function sendJSONResponse(array $response) - { - if (!$this->responder) { - Daemon::debugf("Already sent response"); - return; - } - $this->responder->sendResponseAndClose($response); - $this->responder = null; - } - - public function __destruct() - { - if ($this->responder) { - $this->responder->sendResponseAndClose([ - 'status' => self::STATUS_ERROR_UNKNOWN, - 'message' => 'failed to send a response - Possibly encountered an exception. See daemon output: ' . StringUtil::jsonEncode(\debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)), - ]); - $this->responder = null; - } - } - - /** - * @param int $signo - * @param int|null $status - * @param int|null $pid - * @return void - */ - public static function childSignalHandler($signo, $status = null, $pid = null) - { - // test - if ($signo !== SIGCHLD) { - return; - } - if (!$pid) { - $pid = \pcntl_waitpid(-1, $status, WNOHANG); - } - Daemon::debugf("Got signal pid=%s", StringUtil::jsonEncode($pid)); - - // Add additional check for Phan - pid > 0 implies status is non-null - while ($pid > 0 && $status !== null) { - if (\array_key_exists($pid, self::$child_pids)) { - $exit_code = \pcntl_wexitstatus($status); - if ($exit_code != 0) { - \error_log(\sprintf("child process %d exited with status %d\n", $pid, $exit_code)); - } else { - Daemon::debugf("child process %d completed successfully", $pid); - } - unset(self::$child_pids[$pid]); - } elseif ($pid > 0) { - self::$exited_pid_status[$pid] = $status; - } - $pid = \pcntl_waitpid(-1, $status, WNOHANG); - } - } - - /** - * @param array<string,string> $file_mapping_contents - * @param ?string &$error_message @phan-output-reference - * @return array<string,string> - */ - public static function normalizeFileMappingContents($file_mapping_contents, &$error_message) : array - { - $error_message = null; - if (!\is_array($file_mapping_contents)) { - $error_message = 'Invalid value of temporary_file_mapping_contents'; - return []; - } - $new_file_mapping_contents = []; - foreach ($file_mapping_contents ?? [] as $file => $contents) { - if (!\is_string($file)) { - $error_message = 'Passed non-string in list of files to map'; - return []; - } elseif (!\is_string($contents)) { - $error_message = 'Passed non-string in as new file contents'; - return []; - } - $new_file_mapping_contents[FileRef::getProjectRelativePathForPath($file)] = $contents; - } - return $new_file_mapping_contents; - } - /** - * @param CodeBase $code_base - * @param \Closure $file_path_lister lists all files that will be parsed by Phan - * @param Responder $responder - * @return ?Request - non-null if this is a worker process with work to do. null if request failed or this is the master. - */ - public static function accept(CodeBase $code_base, \Closure $file_path_lister, Responder $responder, bool $fork) - { - FileCache::clear(); - - $request = $responder->getRequestData(); - - if (!\is_array($request)) { - $responder->sendResponseAndClose([ - 'status' => self::STATUS_INVALID_REQUEST, - 'message' => 'malformed JSON', - ]); - return null; - } - $new_file_mapping_contents = []; - $method = $request['method'] ?? ''; - $files = null; - switch ($method) { - case 'analyze_all': - // Analyze the default list of files. No expected params. - break; - case 'analyze_file': - $method = 'analyze_files'; - $request = [ - self::PARAM_METHOD => $method, - self::PARAM_FILES => [$request['file']], - self::PARAM_FORMAT => $request[self::PARAM_FORMAT] ?? 'json', - ]; - // Fall through, this is an alias of analyze_files - case 'analyze_files': - // Analyze the list of strings provided in "files" - $files = $request[self::PARAM_FILES] ?? null; - $request[self::PARAM_FORMAT] = $request[self::PARAM_FORMAT] ?? 'json'; - $error_message = null; - if (\is_array($files) && count($files)) { - foreach ($files as $file) { - if (!\is_string($file)) { - $error_message = 'Passed non-string in list of files'; - break; - } - } - } else { - $error_message = 'Must pass a non-empty array of file paths for field files'; - } - if (\is_null($error_message)) { - $file_mapping_contents = $request[self::PARAM_TEMPORARY_FILE_MAPPING_CONTENTS] ?? []; - if (is_array($file_mapping_contents)) { - $new_file_mapping_contents = self::normalizeFileMappingContents($file_mapping_contents, $error_message); - $request[self::PARAM_TEMPORARY_FILE_MAPPING_CONTENTS] = $new_file_mapping_contents; - } else { - $error_message = 'Must pass an optional array or null for temporary_file_mapping_contents'; - } - } - if ($error_message !== null) { - Daemon::debugf($error_message); - $responder->sendResponseAndClose([ - 'status' => self::STATUS_INVALID_FILES, - 'message' => $error_message, - ]); - return null; - } - break; - // TODO(optional): add APIs to resolve types of variables/properties/etc (e.g. accept byte offset or line/column offset) - default: - $message = \sprintf("expected method to be analyze_all or analyze_files, got %s", StringUtil::jsonEncode($method)); - Daemon::debugf($message); - $responder->sendResponseAndClose([ - 'status' => self::STATUS_INVALID_METHOD, - 'message' => $message, - ]); - return null; - } - - // Re-parse the file list - self::reloadFilePathListForDaemon($code_base, $file_path_lister, $new_file_mapping_contents, $files); - - // Analyze the files that are open in the IDE (If pcntl is available, the analysis is done in a forked process) - - if (!$fork) { - Daemon::debugf("This is the main process pretending to be the fork"); - self::$child_pids = []; - // This is running on the only thread, so configure $request_obj to throw ExitException instead of calling exit() - // @phan-suppress-next-line PhanPartialTypeMismatchArgument pre-existing - $request_obj = new self($responder, $request, null, false); - $temporary_file_mapping = $request_obj->getTemporaryFileMapping(); - if (count($temporary_file_mapping) > 0) { - self::applyTemporaryFileMappingForParsePhase($code_base, $temporary_file_mapping); - } - return $request_obj; - } - - $fork_result = \pcntl_fork(); - if ($fork_result < 0) { - \error_log("The daemon failed to fork. Going to terminate"); - } elseif ($fork_result == 0) { - Daemon::debugf("This is the fork"); - self::handleBecomingChildAnalysisProcess(); - // @phan-suppress-next-line PhanPartialTypeMismatchArgument pre-existing - $request_obj = new self($responder, $request, null, true); - $temporary_file_mapping = $request_obj->getTemporaryFileMapping(); - if (count($temporary_file_mapping) > 0) { - self::applyTemporaryFileMappingForParsePhase($code_base, $temporary_file_mapping); - } - return $request_obj; - } else { - $pid = $fork_result; - self::handleBecomingParentOfChildAnalysisProcess($pid); - } - return null; - } - - /** - * @param int $pid the child PID of this process that is performing analysis - * @return void - */ - public static function handleBecomingParentOfChildAnalysisProcess(int $pid) - { - $status = self::$exited_pid_status[$pid] ?? null; - if (isset($status)) { - Daemon::debugf("child process %d already exited", $pid); - self::childSignalHandler(SIGCHLD, $status, $pid); - unset(self::$exited_pid_status[$pid]); - } else { - self::$child_pids[$pid] = true; - } - - // TODO: Use http://php.net/manual/en/book.inotify.php if available, watch all directories if available. - // Daemon continues to execute. - Daemon::debugf("Created a child pid %d", $pid); - } - - /** - * @return void - */ - public static function handleBecomingChildAnalysisProcess() - { - self::$child_pids = []; - } - - /** - * Reloads the file path list. - * @param array<string,string> $file_mapping_contents maps relative paths to file contents - * @param ?array<int,string> $file_names - * @return void - */ - public static function reloadFilePathListForDaemon(CodeBase $code_base, \Closure $file_path_lister, array $file_mapping_contents, array $file_names = null) - { - $old_count = $code_base->getParsedFilePathCount(); - - $file_list = $file_path_lister(true); - - if (Config::getValue('consistent_hashing_file_order')) { - // Parse the files in lexicographic order. - // If there are duplicate class/function definitions, - // this ensures they are added to the maps in the same order. - \sort($file_list, SORT_STRING); - } - - $changed_or_added_files = $code_base->updateFileList($file_list, $file_mapping_contents, $file_names); - // Daemon::debugf("Parsing modified files: New files = %s", StringUtil::jsonEncode($changed_or_added_files)); - if (count($changed_or_added_files) > 0 || $code_base->getParsedFilePathCount() !== $old_count) { - // Only clear memoizations if it is determined at least one file to parse was added/removed/modified. - // - file path count changes if files were deleted or added - // - changed_or_added_files has an entry for every added/modified file. - // (would be 0 if a client analyzes one file, then analyzes a different file) - Type::clearAllMemoizations(); - } - // A progress bar doesn't make sense in a daemon which can theoretically process multiple requests at once. - foreach ($changed_or_added_files as $file_path) { - // Kick out anything we read from the former version - // of this file - $code_base->flushDependenciesForFile($file_path); - - // If we have an override for the contents of this file, assume it's open in the IDE. - // (even if it doesn't exist on disk) - $file_contents_override = $file_mapping_contents[$file_path] ?? null; - if (!is_string($file_contents_override)) { - // If the file is gone, no need to continue - $real = \realpath($file_path); - if ($real === false || !\file_exists($real)) { - Daemon::debugf("file $file_path does not exist"); - continue; - } - } - Daemon::debugf("Parsing %s yet again", $file_path); - try { - // Parse the file - Analysis::parseFile($code_base, $file_path, false, $file_contents_override); - } catch (\Throwable $throwable) { - \error_log(\sprintf("Analysis::parseFile threw %s for %s: %s\n%s", get_class($throwable), $file_path, $throwable->getMessage(), $throwable->getTraceAsString())); - } - } - Daemon::debugf("Done parsing modified files"); - } - - /** - * Substitutes files. We assume that the original file path exists already, and reject it if it doesn't. - * (i.e. it was returned by $file_path_lister in the past) - * - * @param array<string,string> $temporary_file_mapping_contents - * @return void - */ - private static function applyTemporaryFileMappingForParsePhase(CodeBase $code_base, array $temporary_file_mapping_contents) - { - if (count($temporary_file_mapping_contents) === 0) { - return; - } - - // too verbose - Daemon::debugf("Parsing temporary file mapping contents: New contents = %s", StringUtil::jsonEncode($temporary_file_mapping_contents)); - - $changes_to_add = []; - foreach ($temporary_file_mapping_contents as $file_name => $contents) { - if ($code_base->beforeReplaceFileContents($file_name)) { - $changes_to_add[$file_name] = $contents; - } - } - Daemon::debugf("Done setting temporary file contents: Will replace contents of the following files: %s", StringUtil::jsonEncode(\array_keys($changes_to_add))); - if (count($changes_to_add) === 0) { - return; - } - Type::clearAllMemoizations(); - - foreach ($changes_to_add as $file_path => $new_contents) { - // Kick out anything we read from the former version - // of this file - $code_base->flushDependenciesForFile($file_path); - - // If the file is gone, no need to continue - $real = \realpath($file_path); - if ($real === false || !\file_exists($real)) { - Daemon::debugf("file $file_path no longer exists on disk, but we tried to replace it?"); - continue; - } - Daemon::debugf("Parsing temporary file instead of %s", $file_path); - try { - // Parse the file - Analysis::parseFile($code_base, $file_path, false, $new_contents); - } catch (\Throwable $throwable) { - \error_log(\sprintf("Analysis::parseFile threw %s for %s: %s\n%s", get_class($throwable), $file_path, $throwable->getMessage(), $throwable->getTraceAsString())); - } - } - } -} diff --git a/vendor/phan/phan/src/Phan/Daemon/Transport/CapturerResponder.php b/vendor/phan/phan/src/Phan/Daemon/Transport/CapturerResponder.php deleted file mode 100644 index 049d28b..0000000 --- a/vendor/phan/phan/src/Phan/Daemon/Transport/CapturerResponder.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Daemon\Transport; - -use Phan\Library\StringUtil; - -/** - * Instead of sending the data over a stream, - * this just keeps the raw array - */ -class CapturerResponder implements Responder -{ - /** @var array<string,mixed> the data for getRequestData() */ - private $request_data; - - /** @var ?array<string,mixed> the data sent via sendAndClose */ - private $response_data; - - /** @param array<string,mixed> $data the data for getRequestData() */ - public function __construct(array $data) - { - $this->request_data = $data; - } - - /** - * @return array<string,mixed> the request data - */ - public function getRequestData() - { - return $this->request_data; - } - - /** - * @param array<string,mixed> $data - * @return void - * @throws \RuntimeException if called twice - */ - public function sendResponseAndClose(array $data) - { - if (\is_array($this->response_data)) { - throw new \RuntimeException("Called sendResponseAndClose twice: data = " . StringUtil::jsonEncode($data)); - } - $this->response_data = $data; - } - - /** - * @return ?array<string,mixed> the raw response data that the analysis would have sent back serialized if this was actually a fork. - */ - public function getResponseData() - { - return $this->response_data; - } -} diff --git a/vendor/phan/phan/src/Phan/Daemon/Transport/Responder.php b/vendor/phan/phan/src/Phan/Daemon/Transport/Responder.php deleted file mode 100644 index 65a2e4f..0000000 --- a/vendor/phan/phan/src/Phan/Daemon/Transport/Responder.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Daemon\Transport; - -/** - * This is an interface abstracting the transport which the worker process uses to send a response. - * - * StreamResponder is used for pcntl when this process is the fork - * CapturerResponder is used when a single process is run - */ -interface Responder -{ - - /** - * @return ?array<string,mixed> the request data(E.g. returns null if JSON is malformed) - */ - public function getRequestData(); - - /** - * This must be called exactly once - * @param array<string,mixed> $data the response fields - * @return void - */ - public function sendResponseAndClose(array $data); -} diff --git a/vendor/phan/phan/src/Phan/Daemon/Transport/StreamResponder.php b/vendor/phan/phan/src/Phan/Daemon/Transport/StreamResponder.php deleted file mode 100644 index 02e82ca..0000000 --- a/vendor/phan/phan/src/Phan/Daemon/Transport/StreamResponder.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Daemon\Transport; - -use Phan\Daemon; -use Phan\Library\StringUtil; - -use TypeError; - -/** - * Sends json encoded data over a socket stream. - */ -class StreamResponder implements Responder -{ - /** @var ?resource a stream */ - private $connection; - - /** @var ?array<string,mixed> the request data */ - private $request_data; - - /** @var bool did this process already finish reading the data of the request? */ - private $did_read_request_data = false; - - /** @param resource $connection a stream */ - public function __construct($connection, bool $expect_request) - { - if (!\is_resource($connection)) { - throw new TypeError("Expected connection to be resource, saw " . \gettype($connection)); - } - $this->connection = $connection; - if (!$expect_request) { - $this->did_read_request_data = true; - $this->request_data = []; - } - } - - /** - * @return ?array<string,mixed> the request data(E.g. returns null if JSON is malformed) - */ - public function getRequestData() - { - if (!$this->did_read_request_data) { - $response_connection = $this->connection; - if (!$response_connection) { - Daemon::debugf("Should not happen, missing a response connection"); // debugging code - return null; - } - Daemon::debugf("Got a connection"); // debugging code - $request_bytes = ''; - while (!\feof($response_connection)) { - $request_bytes .= \fgets($response_connection); - } - $request = \json_decode($request_bytes, true); - if (!\is_array($request)) { - Daemon::debugf("Received invalid request, expected JSON: %s", StringUtil::jsonEncode($request_bytes)); - $request = null; - } - $this->did_read_request_data = true; - $this->request_data = $request; - } - return $this->request_data; - } - - /** - * @param array<string,mixed> $data the response fields - * @return void - * @throws \RuntimeException if called twice - */ - public function sendResponseAndClose(array $data) - { - $connection = $this->connection; - if (!$this->did_read_request_data) { - throw new \RuntimeException("Called sendAndClose before calling getRequestData"); - } - if ($connection === null) { - throw new \RuntimeException("Called sendAndClose twice: data = " . StringUtil::jsonEncode($data)); - } - \fwrite($connection, StringUtil::jsonEncode($data) . "\n"); - // disable further receptions and transmissions - // Note: This is likely a giant hack, - // and pcntl and sockets may break in the future if used together. (multiple processes owning a single resource). - // Not sure how to do that safely. - \stream_socket_shutdown($connection, \STREAM_SHUT_RDWR); - \fclose($connection); - $this->connection = null; - } -} diff --git a/vendor/phan/phan/src/Phan/Debug.php b/vendor/phan/phan/src/Phan/Debug.php deleted file mode 100644 index 8037140..0000000 --- a/vendor/phan/phan/src/Phan/Debug.php +++ /dev/null @@ -1,431 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use ast; -use ast\flags; -use ast\Node; -use Phan\Analysis\BlockExitStatusChecker; - -/** - * Debug utilities - * - * Mostly utilities for printing representations of AST nodes. - * Also see `Debug/` - */ -class Debug -{ - // option for self::astDump - const AST_DUMP_LINENOS = 1; - - /** - * Print a lil' something to the console to - * see if a thing is called - * - * @suppress PhanUnreferencedPublicMethod - * @return void - */ - public static function mark() - { - print "mark\n"; - } - - /** - * Print an AST node - * - * @param string|int|float|Node|null $node - * An AST node - * - * @return void - * - * @suppress PhanUnreferencedPublicMethod - */ - public static function printNode($node) - { - print self::nodeToString($node); - } - - /** - * Print the name of a node to the terminal - * - * @suppress PhanUnreferencedPublicMethod - * @param Node|string|null $node - * @param int $indent - * @return void - */ - public static function printNodeName($node, $indent = 0) - { - print \str_repeat("\t", $indent); - print self::nodeName($node); - print "\n"; - } - - /** - * Print $message with the given indent level - * - * @return void - * @suppress PhanUnreferencedPublicMethod - */ - public static function print(string $message, int $indent = 0) - { - print \str_repeat("\t", $indent); - print $message . "\n"; - } - - /** - * Return the name of a node - * - * @param Node|string|null $node - * @return string The name of the node - */ - public static function nodeName($node) : string - { - if (\is_string($node)) { - return "string"; - } - - if (!$node) { - return 'null'; - } - - $kind = $node->kind; - if (\is_string($kind)) { - // For placeholders created by tolerant-php-parser-to-php-ast - return "string ($kind)"; - } - return ast\get_kind_name($kind); - } - - /** - * Convert an AST node to a compact string representation of that node. - * - * @param string|int|float|Node|null $node - * An AST node - * - * @param int|float|string|null $name - * The name of the node (if this node has a parent) - * - * @param int $indent - * The indentation level for the string - * - * @return string - * A string representation of an AST node - */ - public static function nodeToString( - $node, - $name = null, - int $indent = 0 - ) : string { - $string = \str_repeat("\t", $indent); - - if ($name !== null) { - $string .= "$name => "; - } - - if (\is_string($node)) { - return $string . $node . "\n"; - } - - if ($node === null) { - return $string . 'null' . "\n"; - } - - if (!\is_object($node)) { - return $string . $node . "\n"; - } - $kind = $node->kind; - - $string .= self::nodeName($node); - - $string .= ' [' - . (\is_int($kind) ? self::astFlagDescription($node->flags ?? 0, $kind) : 'unknown') - . ']'; - - if (isset($node->lineno)) { - $string .= ' #' . $node->lineno; - } - - $end_lineno = $node->endLineno ?? null; - if (!\is_null($end_lineno)) { - $string .= ':' . $end_lineno; - } - - $string .= "\n"; - - foreach ($node->children as $name => $child_node) { - if (\is_string($name) && \strncmp($name, 'phan', 4) === 0) { - // Dynamic property added by Phan - continue; - } - $string .= self::nodeToString( - $child_node, - $name, - $indent + 1 - ); - } - - return $string; - } - - /** - * Computes a string representation of AST node flags such as - * 'ASSIGN_DIV|TYPE_ARRAY' - * - * @return string - * - * @see self::formatFlags() for a similar function also printing the integer flag value. - */ - public static function astFlagDescription(int $flags, int $kind) : string - { - list($exclusive, $combinable) = self::getFlagInfo(); - $flag_names = []; - if (isset($exclusive[$kind])) { - $flag_info = $exclusive[$kind]; - if (isset($flag_info[$flags])) { - $flag_names[] = $flag_info[$flags]; - } - } elseif (isset($combinable[$kind])) { - $flag_info = $combinable[$kind]; - foreach ($flag_info as $flag => $name) { - if ($flags & $flag) { - $flag_names[] = $name; - } - } - } - - return \implode('|', $flag_names); - } - - /** - * @return string - * Get a string representation of AST node flags such as - * 'ASSIGN_DIV (26)' - * Source: https://github.com/nikic/php-ast/blob/master/util.php - */ - public static function formatFlags(int $kind, int $flags) : string - { - list($exclusive, $combinable) = self::getFlagInfo(); - if (isset($exclusive[$kind])) { - $flag_info = $exclusive[$kind]; - if (isset($flag_info[$flags])) { - return "{$flag_info[$flags]} ($flags)"; - } - } elseif (isset($combinable[$kind])) { - $flag_info = $combinable[$kind]; - $names = []; - foreach ($flag_info as $flag => $name) { - if ($flags & $flag) { - $names[] = $name; - } - } - if (\count($names) > 0) { - return \implode(" | ", $names) . " ($flags)"; - } - } - return (string) $flags; - } - - - /** - * @return void - * Pretty-printer for debug_backtrace - * - * @suppress PhanUnreferencedPublicMethod - */ - public static function backtrace(int $levels = 0) - { - $bt = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, $levels + 1); - foreach ($bt as $level => $context) { - if (!$level) { - continue; - } - $file = $context['file'] ?? 'unknown'; - $line = $context['line'] ?? 1; - $class = $context['class'] ?? 'global'; - $function = $context['function'] ?? ''; - - echo "#" . ($level - 1) . " $file:$line $class "; - if (isset($context['type'])) { - echo $context['class'] . $context['type']; - } - echo $function; - echo "\n"; - } - } - - /** - * Dumps abstract syntax tree - * Source: https://github.com/nikic/php-ast/blob/master/util.php - * @param Node|string|int|float|null $ast - * @param int $options (self::AST_DUMP_*) - */ - public static function astDump($ast, int $options = 0) : string - { - if ($ast instanceof Node) { - $result = ast\get_kind_name($ast->kind); - - if ($options & self::AST_DUMP_LINENOS) { - $result .= " @ $ast->lineno"; - $end_lineno = $ast->endLineno ?? null; - if (!\is_null($end_lineno)) { - $result .= "-$end_lineno"; - } - } - - if (ast\kind_uses_flags($ast->kind)) { - $flags_without_phan_additions = $ast->flags & ~BlockExitStatusChecker::STATUS_BITMASK; - if ($flags_without_phan_additions != 0) { - $result .= "\n flags: " . self::formatFlags($ast->kind, $ast->flags); - } - } - foreach ($ast->children as $i => $child) { - $result .= "\n $i: " . \str_replace("\n", "\n ", self::astDump($child, $options)); - } - return $result; - } elseif ($ast === null) { - return 'null'; - } elseif (\is_string($ast)) { - return "\"$ast\""; - } else { - return (string) $ast; - } - } - - /** - * Source: https://github.com/nikic/php-ast/blob/master/util.php - * - * Returns the information necessary to map the node id to the flag id to the name. - * - * @return array<int,array<int,array<int,string>>> - * Returns [string[][] $exclusive, string[][] $combinable]. - */ - private static function getFlagInfo() : array - { - // TODO: Use AST's built in flag info if available. - static $exclusive, $combinable; - if ($exclusive !== null) { - return [$exclusive, $combinable]; - } - - $modifiers = [ - flags\MODIFIER_PUBLIC => 'MODIFIER_PUBLIC', - flags\MODIFIER_PROTECTED => 'MODIFIER_PROTECTED', - flags\MODIFIER_PRIVATE => 'MODIFIER_PRIVATE', - flags\MODIFIER_STATIC => 'MODIFIER_STATIC', - flags\MODIFIER_ABSTRACT => 'MODIFIER_ABSTRACT', - flags\MODIFIER_FINAL => 'MODIFIER_FINAL', - flags\FUNC_RETURNS_REF => 'FUNC_RETURNS_REF', - flags\FUNC_GENERATOR => 'FUNC_GENERATOR', - ]; - $types = [ - flags\TYPE_NULL => 'TYPE_NULL', - flags\TYPE_BOOL => 'TYPE_BOOL', - flags\TYPE_LONG => 'TYPE_LONG', - flags\TYPE_DOUBLE => 'TYPE_DOUBLE', - flags\TYPE_STRING => 'TYPE_STRING', - flags\TYPE_ARRAY => 'TYPE_ARRAY', - flags\TYPE_OBJECT => 'TYPE_OBJECT', - flags\TYPE_CALLABLE => 'TYPE_CALLABLE', - flags\TYPE_VOID => 'TYPE_VOID', - flags\TYPE_ITERABLE => 'TYPE_ITERABLE', - ]; - $use_types = [ - flags\USE_NORMAL => 'USE_NORMAL', - flags\USE_FUNCTION => 'USE_FUNCTION', - flags\USE_CONST => 'USE_CONST', - ]; - $shared_binary_ops = [ - flags\BINARY_BITWISE_OR => 'BINARY_BITWISE_OR', - flags\BINARY_BITWISE_AND => 'BINARY_BITWISE_AND', - flags\BINARY_BITWISE_XOR => 'BINARY_BITWISE_XOR', - flags\BINARY_CONCAT => 'BINARY_CONCAT', - flags\BINARY_ADD => 'BINARY_ADD', - flags\BINARY_SUB => 'BINARY_SUB', - flags\BINARY_MUL => 'BINARY_MUL', - flags\BINARY_DIV => 'BINARY_DIV', - flags\BINARY_MOD => 'BINARY_MOD', - flags\BINARY_POW => 'BINARY_POW', - flags\BINARY_SHIFT_LEFT => 'BINARY_SHIFT_LEFT', - flags\BINARY_SHIFT_RIGHT => 'BINARY_SHIFT_RIGHT', - ]; - - $exclusive = [ - ast\AST_NAME => [ - flags\NAME_FQ => 'NAME_FQ', - flags\NAME_NOT_FQ => 'NAME_NOT_FQ', - flags\NAME_RELATIVE => 'NAME_RELATIVE', - ], - ast\AST_CLASS => [ - flags\CLASS_ABSTRACT => 'CLASS_ABSTRACT', - flags\CLASS_FINAL => 'CLASS_FINAL', - flags\CLASS_TRAIT => 'CLASS_TRAIT', - flags\CLASS_INTERFACE => 'CLASS_INTERFACE', - flags\CLASS_ANONYMOUS => 'CLASS_ANONYMOUS', - ], - ast\AST_PARAM => [ - flags\PARAM_REF => 'PARAM_REF', - flags\PARAM_VARIADIC => 'PARAM_VARIADIC', - ], - ast\AST_TYPE => $types, - ast\AST_CAST => $types, - ast\AST_UNARY_OP => [ - flags\UNARY_BOOL_NOT => 'UNARY_BOOL_NOT', - flags\UNARY_BITWISE_NOT => 'UNARY_BITWISE_NOT', - flags\UNARY_MINUS => 'UNARY_MINUS', - flags\UNARY_PLUS => 'UNARY_PLUS', - flags\UNARY_SILENCE => 'UNARY_SILENCE', - ], - ast\AST_BINARY_OP => $shared_binary_ops + [ - flags\BINARY_BOOL_AND => 'BINARY_BOOL_AND', - flags\BINARY_BOOL_OR => 'BINARY_BOOL_OR', - flags\BINARY_BOOL_XOR => 'BINARY_BOOL_XOR', - flags\BINARY_IS_IDENTICAL => 'BINARY_IS_IDENTICAL', - flags\BINARY_IS_NOT_IDENTICAL => 'BINARY_IS_NOT_IDENTICAL', - flags\BINARY_IS_EQUAL => 'BINARY_IS_EQUAL', - flags\BINARY_IS_NOT_EQUAL => 'BINARY_IS_NOT_EQUAL', - flags\BINARY_IS_SMALLER => 'BINARY_IS_SMALLER', - flags\BINARY_IS_SMALLER_OR_EQUAL => 'BINARY_IS_SMALLER_OR_EQUAL', - flags\BINARY_IS_GREATER => 'BINARY_IS_GREATER', - flags\BINARY_IS_GREATER_OR_EQUAL => 'BINARY_IS_GREATER_OR_EQUAL', - flags\BINARY_SPACESHIP => 'BINARY_SPACESHIP', - flags\BINARY_COALESCE => 'BINARY_COALESCE', - ], - ast\AST_ASSIGN_OP => $shared_binary_ops, - ast\AST_MAGIC_CONST => [ - flags\MAGIC_LINE => 'MAGIC_LINE', - flags\MAGIC_FILE => 'MAGIC_FILE', - flags\MAGIC_DIR => 'MAGIC_DIR', - flags\MAGIC_NAMESPACE => 'MAGIC_NAMESPACE', - flags\MAGIC_FUNCTION => 'MAGIC_FUNCTION', - flags\MAGIC_METHOD => 'MAGIC_METHOD', - flags\MAGIC_CLASS => 'MAGIC_CLASS', - flags\MAGIC_TRAIT => 'MAGIC_TRAIT', - ], - ast\AST_USE => $use_types, - ast\AST_GROUP_USE => $use_types, - ast\AST_USE_ELEM => $use_types, - ast\AST_INCLUDE_OR_EVAL => [ - flags\EXEC_EVAL => 'EXEC_EVAL', - flags\EXEC_INCLUDE => 'EXEC_INCLUDE', - flags\EXEC_INCLUDE_ONCE => 'EXEC_INCLUDE_ONCE', - flags\EXEC_REQUIRE => 'EXEC_REQUIRE', - flags\EXEC_REQUIRE_ONCE => 'EXEC_REQUIRE_ONCE', - ], - ast\AST_ARRAY => [ - flags\ARRAY_SYNTAX_LIST => 'ARRAY_SYNTAX_LIST', - flags\ARRAY_SYNTAX_LONG => 'ARRAY_SYNTAX_LONG', - flags\ARRAY_SYNTAX_SHORT => 'ARRAY_SYNTAX_SHORT', - ], - ast\AST_CLOSURE_VAR => [ - flags\CLOSURE_USE_REF => 'CLOSURE_USE_REF', - ], - ]; - - $combinable = []; - $combinable[ast\AST_METHOD] = $combinable[ast\AST_FUNC_DECL] = $combinable[ast\AST_CLOSURE] - = $combinable[ast\AST_PROP_DECL] = $combinable[ast\AST_CLASS_CONST_DECL] - = $combinable[ast\AST_TRAIT_ALIAS] = $modifiers; - - return [$exclusive, $combinable]; - } -} diff --git a/vendor/phan/phan/src/Phan/Debug/Breakpoint.php b/vendor/phan/phan/src/Phan/Debug/Breakpoint.php deleted file mode 100644 index 01c50d8..0000000 --- a/vendor/phan/phan/src/Phan/Debug/Breakpoint.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Debug; - -/** - * @return array<int,string> - */ -\readline_completion_function(static function (string $input) : array { - $matches = []; - foreach (\get_declared_classes() as $class_name) { - if (\strpos($class_name, $input) == 0) { - $matches[] = $class_name; - } - } - return $matches; -}); - -print "\n"; -do { - /** @var string|null */ - $input = \readline("breakpoint> "); - - if (\is_string($input)) { - \readline_add_history($input); - } - - if (\in_array($input, [ - 'quit', - 'exit', - 'continue', - 'run', - 'c' - ])) { - break; - } - try { - eval($input . ';'); - } catch (\ParseError $exception) { - print "Parse error in `$input`\n"; - } catch (\CompileError $exception) { - print "Compile error in `$input`\n"; - } catch (\Throwable $exception) { - print $exception->getMessage() . "\n"; - print $exception->getTraceAsString() . "\n"; - } - print "\n"; -} while (true); diff --git a/vendor/phan/phan/src/Phan/Debug/DebugUnionType.php b/vendor/phan/phan/src/Phan/Debug/DebugUnionType.php deleted file mode 100644 index 71b8b27..0000000 --- a/vendor/phan/phan/src/Phan/Debug/DebugUnionType.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Debug; - -use Phan\Language\Type; -use Phan\Language\UnionType; - -use const DEBUG_BACKTRACE_IGNORE_ARGS; - -/** - * Utility for debugging assignments to a given union type. - * This can be used when creating a union type to figure out the causes of unexpected error messages. - * - * Not used as part of normal phan operations. - */ -class DebugUnionType extends UnionType -{ - - /** - * Add a type name to the list of types - * - * @return UnionType - * @override - */ - public function withType(Type $type) : UnionType - { - \printf("%s: Adding type %s to %s", \spl_object_hash($this), (string)$type, (string)$this); - \debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - return parent::withType($type); - } - - /** - * Add the given types to this type - * - * @return UnionType - */ - public function withUnionType(UnionType $union_type) : UnionType - { - \printf("%s: Adding union type %s to %s", \spl_object_hash($this), (string)$union_type, (string)$this); - \debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - return parent::withUnionType($union_type); - } -} diff --git a/vendor/phan/phan/src/Phan/Debug/Frame.php b/vendor/phan/phan/src/Phan/Debug/Frame.php deleted file mode 100644 index 2259427..0000000 --- a/vendor/phan/phan/src/Phan/Debug/Frame.php +++ /dev/null @@ -1,143 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Debug; - -use Phan\IssueInstance; -use Phan\Language\Context; -use Phan\Language\Element\AddressableElement; -use Phan\Language\Element\UnaddressableTypedElement; -use Phan\Language\FQSEN; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Library\None; -use Phan\Library\Some; -use Phan\Library\StringUtil; -use function count; -use function get_class; -use function is_array; -use function is_object; -use function is_resource; - -/** - * Debug utilities for working with frames of debug_backtrace() - * - * Mostly utilities for better crash reports. - */ -class Frame -{ - /** - * Utilities to encode values might be seen in Phan or its plugins in a crash. - * @param mixed $value - */ - public static function encodeValue($value, int $max_depth = 2) : string - { - if (is_object($value)) { - if ($value instanceof IssueInstance) { - return "IssueInstance($value)"; - } - if ($value instanceof FQSEN) { - return get_class($value) . '(' . $value . ')'; - } - if ($value instanceof \Closure) { - return 'Closure'; - } - if ($value instanceof Some) { - return 'Some(' . self::encodeValue($value->get()) . ')'; - } - if ($value instanceof None) { - return 'None'; - } - - if ($value instanceof AddressableElement - || $value instanceof UnaddressableTypedElement - || $value instanceof UnionType - || $value instanceof Context - || $value instanceof Type) { - return get_class($value) . '(' . $value . ')'; - } - return get_class($value) . '(' . StringUtil::jsonEncode($value) . ')'; - } - if (!is_array($value)) { - if (is_resource($value)) { - \ob_start(); - \var_dump($value); - return \trim(\ob_get_clean() ?: 'resource'); - } - return StringUtil::jsonEncode($value); - } - if ($max_depth <= 0) { - return count($value) > 0 ? '[...]' : '[]'; - } - $is_consecutive = true; - $i = 0; - foreach ($value as $key => $_) { - if ($key !== $i) { - $is_consecutive = false; - break; - } - $i++; - } - - if ($is_consecutive) { - $result = []; - foreach ($value as $i => $inner_value) { - if ($i >= 10) { - $result[] = '... ' . (count($value) - 10) . ' more element(s)'; - break; - } - $result[] = self::encodeValue($inner_value); - } - return '[' . \implode(', ', $result) . ']'; - } - $result = []; - $i = 0; - foreach ($value as $key => $inner_value) { - $i++; - if ($i > 10) { - $result[] = '... ' . (count($value) - 10) . ' more field(s)'; - break; - } - $result[] = StringUtil::jsonEncode($key) . ':' . self::encodeValue($inner_value); - } - return '{' . \implode(', ', $result) . '}'; - } - - /** - * Utility to show more information about an unexpected error - * @param array<string,mixed> $frame the frame from debug_backtrace() - */ - public static function frameToString(array $frame) : string - { - return \with_disabled_phan_error_handler(static function () use ($frame) : string { - $invocation = $frame['function'] ?? '(unknown)'; - if (isset($frame['class'])) { - $invocation = $frame['class'] . ($frame['type'] ?? '::') . $invocation; - } - $result = $invocation . '()'; - $args = $frame['args'] ?? null; - if ($args) { - $result .= ' Args: ' . self::encodeValue($args); - } - return $result; - }); - } - - /** - * Returns details about a call to asExpandedTypes that hit a RecursionDepthException - */ - public static function getExpandedTypesDetails() : string - { - $result = []; - foreach (\debug_backtrace() as $frame) { - if (($frame['function'] ?? null) === 'asExpandedTypes' && isset($frame['object'])) { - $object = $frame['object']; - if ($object instanceof Type) { - $result[] = 'when expanding type (' . (string)$object . ')'; - } elseif ($object instanceof UnionType) { - $result[] = 'when expanding union type (' . (string)$object . ')'; - } - } - } - return \implode("\n", $result); - } -} diff --git a/vendor/phan/phan/src/Phan/Exception/CodeBaseException.php b/vendor/phan/phan/src/Phan/Exception/CodeBaseException.php deleted file mode 100644 index 9aac16a..0000000 --- a/vendor/phan/phan/src/Phan/Exception/CodeBaseException.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Exception; - -use AssertionError; -use Phan\Language\FQSEN; - -/** - * Thrown to indicate that retrieving the element for an FQSEN from the CodeBase failed. - */ -class CodeBaseException extends \Exception -{ - - /** @var FQSEN|null the FQSEN that cannot be found in the code base */ - private $missing_fqsen; - - /** - * @param FQSEN|null $missing_fqsen - * The FQSEN that cannot be found in the code base - * - * @param string $message - * The error message - */ - public function __construct( - FQSEN $missing_fqsen = null, - string $message = "" - ) { - parent::__construct($message); - $this->missing_fqsen = $missing_fqsen; - } - - /** - * @return bool - * True if we have an FQSEN defined - * - * @suppress PhanUnreferencedPublicMethod - */ - public function hasFQSEN() : bool - { - return !\is_null($this->missing_fqsen); - } - - /** - * @return FQSEN - * The missing FQSEN - */ - public function getFQSEN() : FQSEN - { - $fqsen = $this->missing_fqsen; - if (!$fqsen) { - throw new AssertionError('Should check CodeBaseException->hasFQSEN()'); - } - return $fqsen; - } -} diff --git a/vendor/phan/phan/src/Phan/Exception/EmptyFQSENException.php b/vendor/phan/phan/src/Phan/Exception/EmptyFQSENException.php deleted file mode 100644 index 7c4320d..0000000 --- a/vendor/phan/phan/src/Phan/Exception/EmptyFQSENException.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Exception; - -/** - * Thrown to indicate that an empty FQSEN was used where a valid FQSEN was expected. - */ -class EmptyFQSENException extends FQSENException -{ -} diff --git a/vendor/phan/phan/src/Phan/Exception/FQSENException.php b/vendor/phan/phan/src/Phan/Exception/FQSENException.php deleted file mode 100644 index 2667c75..0000000 --- a/vendor/phan/phan/src/Phan/Exception/FQSENException.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Exception; - -use Exception; - -/** - * Thrown to indicate that an empty/invalid FQSEN was used where a valid FQSEN was expected. - * @see InvalidFQSENException - * @see EmptyFQSENException - */ -class FQSENException extends Exception -{ - /** @var string the empty/invalid, unparseable FQSEN */ - private $fqsen; - - /** - * @param string $message - * The error message - * @param string $fqsen - * the empty/invalid, unparseable FQSEN - */ - public function __construct( - string $message, - string $fqsen - ) { - parent::__construct($message . " for FQSEN '$fqsen'"); - $this->fqsen = $fqsen; - } - - /** - * @return string the empty, unparseable FQSEN input that caused this exception - */ - public function getFQSEN() : string - { - return $this->fqsen; - } -} diff --git a/vendor/phan/phan/src/Phan/Exception/InvalidFQSENException.php b/vendor/phan/phan/src/Phan/Exception/InvalidFQSENException.php deleted file mode 100644 index 476ad85..0000000 --- a/vendor/phan/phan/src/Phan/Exception/InvalidFQSENException.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Exception; - -/** - * Thrown to indicate that an invalid FQSEN was used where a valid FQSEN was expected. - */ -class InvalidFQSENException extends FQSENException -{ -} diff --git a/vendor/phan/phan/src/Phan/Exception/IssueException.php b/vendor/phan/phan/src/Phan/Exception/IssueException.php deleted file mode 100644 index 99d9bfa..0000000 --- a/vendor/phan/phan/src/Phan/Exception/IssueException.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Exception; - -use Exception; -use Phan\IssueInstance; - -/** - * # Example Usage - * ``` - * throw new IssueException( - * Issue::fromType( - * Issue::UndeclaredClassReference - * )( - * $context->getFile(), - * $node->getLine() ?? 0 - * ) - * ); - * ``` - */ -class IssueException extends Exception -{ - - /** - * @var IssueInstance - * An instance of an issue that was found but can't be - * reported on immediately. - */ - private $issue_instance; - - /** - * @param IssueInstance $issue_instance - * An instance of an issue that was found but can't be - * reported on immediately. - */ - public function __construct( - IssueInstance $issue_instance - ) { - parent::__construct(); - $this->issue_instance = $issue_instance; - } - - /** - * @return IssueInstance - * The issue that was found - */ - public function getIssueInstance() : IssueInstance - { - return $this->issue_instance; - } - - /** - * @override - */ - public function __toString() - { - return \sprintf( - "IssueException at %s:%d: %s\n%s", - $this->getFile(), - $this->getLine(), - (string)$this->issue_instance, - $this->getTraceAsString() - ); - } -} diff --git a/vendor/phan/phan/src/Phan/Exception/NodeException.php b/vendor/phan/phan/src/Phan/Exception/NodeException.php deleted file mode 100644 index 5166278..0000000 --- a/vendor/phan/phan/src/Phan/Exception/NodeException.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Exception; - -use ast\Node; -use Exception; - -/** - * Thrown to indicate that the given Node could not be analyzed. - * - * Rarely thrown for most valid code. - * This can be thrown for code Phan doesn't know how to analyze - * or for Nodes generated by the fallback parser for unparsable code. - */ -class NodeException extends Exception -{ - - /** - * @var Node - * The node causing the exception - */ - private $node; - - /** - * @param Node $node - * The node causing the exception - * - * @param string $message - * The error message - */ - public function __construct( - Node $node, - string $message = '' - ) { - parent::__construct($message); - $this->node = $node; - } - - /** - * @return Node - * The node for which we have an exception - * - * @suppress PhanUnreferencedPublicMethod - */ - public function getNode() : Node - { - return $this->node; - } -} diff --git a/vendor/phan/phan/src/Phan/Exception/RecursionDepthException.php b/vendor/phan/phan/src/Phan/Exception/RecursionDepthException.php deleted file mode 100644 index 024a19a..0000000 --- a/vendor/phan/phan/src/Phan/Exception/RecursionDepthException.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Exception; - -use RuntimeException; - -/** - * Thrown to indicate that recursion exceeded the limits of what Phan supports - */ -class RecursionDepthException extends RuntimeException -{ -} diff --git a/vendor/phan/phan/src/Phan/Exception/UnanalyzableException.php b/vendor/phan/phan/src/Phan/Exception/UnanalyzableException.php deleted file mode 100644 index a512e08..0000000 --- a/vendor/phan/phan/src/Phan/Exception/UnanalyzableException.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Exception; - -/** - * Thrown when Phan unexpectedly fails to analyze a given Node and cannot proceed. - */ -class UnanalyzableException extends NodeException -{ -} diff --git a/vendor/phan/phan/src/Phan/Exception/UsageException.php b/vendor/phan/phan/src/Phan/Exception/UsageException.php deleted file mode 100644 index 8ff1aa6..0000000 --- a/vendor/phan/phan/src/Phan/Exception/UsageException.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Exception; - -use Phan\Daemon\ExitException; - -/** - * Thrown to indicate that retrieving the element for an FQSEN from the CodeBase failed. - */ -class UsageException extends ExitException -{ - /** @var bool */ - public $print_extended_help; - - /** - * @param string $message - * an optional error message to print - * - * @param int $code - * the exit code of the program - * - * @param bool $print_extended_help - * whether to print extended help messages - */ - public function __construct( - string $message = "", - int $code = \EXIT_SUCCESS, - bool $print_extended_help = false - ) { - parent::__construct($message, $code); - $this->print_extended_help = $print_extended_help; - } -} diff --git a/vendor/phan/phan/src/Phan/ForkPool.php b/vendor/phan/phan/src/Phan/ForkPool.php deleted file mode 100644 index 009636e..0000000 --- a/vendor/phan/phan/src/Phan/ForkPool.php +++ /dev/null @@ -1,277 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use AssertionError; -use Closure; -use InvalidArgumentException; - -use function count; -use function gettype; -use function intval; -use function strlen; - -use const EXIT_FAILURE; -use const EXIT_SUCCESS; - -/** - * Fork off to n-processes and divide up tasks between - * each process. - */ -class ForkPool -{ - - /** @var array<int,int> a list of process ids that have been forked*/ - private $child_pid_list = []; - - /** @var array<int,resource> a list of read strings for $this->child_pid_list */ - private $read_streams = []; - - /** @var bool did any of the child processes fail (e.g. crash or send data that couldn't be unserialized) */ - private $did_have_error = false; - - /** - * @param array<int,array> $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 $task_closure - * A method to execute on each task data. - * This closure must return an array (to be gathered). - * - * @param Closure $shutdown_closure - * A closure to execute upon shutting down a child - * @throws InvalidArgumentException if count($process_task_data_iterator) < 2 - * @throws AssertionError if pcntl is disabled before using this - */ - public function __construct( - array $process_task_data_iterator, - Closure $startup_closure, - Closure $task_closure, - Closure $shutdown_closure - ) { - - $pool_size = count($process_task_data_iterator); - - if ($pool_size < 2) { - throw new InvalidArgumentException('The pool size must be >= 2 to use the fork pool.'); - } - - if (!\extension_loaded('pcntl')) { - throw new AssertionError('The pcntl extension must be loaded in order for Phan to be able to fork.'); - } - - // 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; - - // 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(EXIT_FAILURE); - } - - // Fork - $pid = \pcntl_fork(); - if ($pid < 0) { - \error_log(\posix_strerror(\posix_get_last_error())); - exit(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]; - foreach ($task_data_iterator as $i => $task_data) { - $task_closure($i, $task_data); - } - - // 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. - \fwrite($write_stream, \serialize($results ?: [])); - - \fclose($write_stream); - - // Children exit after completing their work - exit(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 array<int,resource> $sockets the socket pair for IPC - * @return resource - */ - private static function streamForParent(array $sockets) - { - list($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(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 array<int,resource> $sockets the socket pair for IPC. - * @return resource - */ - private static function streamForChild(array $sockets) - { - list($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. - * - * @return array[] - */ - private function readResultsFromChildren() - { - // Create an array of all active streams, indexed by - // resource id. - $streams = []; - foreach ($this->read_streams as $stream) { - $streams[intval($stream)] = $stream; - } - - // Create an array for the content received on each stream, - // indexed by resource id. - $content = \array_fill_keys(\array_keys($streams), ''); - - // 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) { - \error_log("unable to select on read stream"); - exit(EXIT_FAILURE); - } - - // For each stream that was ready, read the content. - foreach ($needs_read as $file) { - $buffer = \fread($file, 1024); - if ($buffer === false) { - \error_log("unable to read from stream of worker process"); - exit(EXIT_FAILURE); - } - if (strlen($buffer) > 0) { - $content[intval($file)] .= $buffer; - } - - // If the stream has closed, stop trying to select on it. - if (\feof($file)) { - \fclose($file); - unset($streams[intval($file)]); - } - } - } - - // Unmarshal the content into its original form. - /** - * @param string $data - * @return mixed[] - */ - return \array_values(\array_map(function ($data) { - $result = \unserialize($data); - if (!\is_array($result)) { - \error_log("Child terminated without returning a serialized array (threw or crashed - not enough memory?): response type=" . gettype($result)); - $this->did_have_error = true; - } - return $result; - }, $content)); - } - - /** - * Wait for all child processes to complete - * @return array[] - */ - public function wait() - { - // Read all the streams from child processes into an array. - $content = $this->readResultsFromChildren(); - - // Wait for all children to return - foreach ($this->child_pid_list as $child_pid) { - 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 (\pcntl_wifsignaled($status)) { - $return_code = \pcntl_wexitstatus($status); - $term_sig = \pcntl_wtermsig($status); - $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/phan/phan/src/Phan/Issue.php b/vendor/phan/phan/src/Phan/Issue.php deleted file mode 100644 index b0b459b..0000000 --- a/vendor/phan/phan/src/Phan/Issue.php +++ /dev/null @@ -1,4250 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use AssertionError; -use InvalidArgumentException; -use Phan\Language\Context; -use Phan\Language\Element\TypedElement; -use Phan\Language\Element\UnaddressableTypedElement; -use Phan\Language\FQSEN; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Library\ConversionSpec; -use Phan\Plugin\ConfigPluginSet; - -/** - * An issue emitted during analysis. - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - * @SuppressWarnings(PHPMD.ConstantNamingConventions) these constant names are deliberately used to match the values - */ -class Issue -{ - // phpcs:disable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase - // this is deliberate for issue names - // Issue::CATEGORY_SYNTAX - const SyntaxError = 'PhanSyntaxError'; - const InvalidConstantExpression = 'PhanInvalidConstantExpression'; - const InvalidNode = 'PhanInvalidNode'; - const InvalidWriteToTemporaryExpression = 'PhanInvalidWriteToTemporaryExpression'; - const InvalidTraitUse = 'PhanInvalidTraitUse'; - const ContinueTargetingSwitch = 'PhanContinueTargetingSwitch'; - const ContinueOrBreakNotInLoop = 'PhanContinueOrBreakNotInLoop'; - const ContinueOrBreakTooManyLevels = 'PhanContinueOrBreakTooManyLevels'; - - // Issue::CATEGORY_UNDEFINED - const AmbiguousTraitAliasSource = 'PhanAmbiguousTraitAliasSource'; - const ClassContainsAbstractMethodInternal = 'PhanClassContainsAbstractMethodInternal'; - const ClassContainsAbstractMethod = 'PhanClassContainsAbstractMethod'; - const EmptyFile = 'PhanEmptyFile'; - const MissingRequireFile = 'PhanMissingRequireFile'; - const InvalidRequireFile = 'PhanInvalidRequireFile'; - const ParentlessClass = 'PhanParentlessClass'; - const RequiredTraitNotAdded = 'PhanRequiredTraitNotAdded'; - const TraitParentReference = 'PhanTraitParentReference'; - const UndeclaredAliasedMethodOfTrait = 'PhanUndeclaredAliasedMethodOfTrait'; - const UndeclaredClass = 'PhanUndeclaredClass'; - const UndeclaredClassAliasOriginal = 'PhanUndeclaredClassAliasOriginal'; - const UndeclaredClassCatch = 'PhanUndeclaredClassCatch'; - const UndeclaredClassConstant = 'PhanUndeclaredClassConstant'; - const UndeclaredClassInstanceof = 'PhanUndeclaredClassInstanceof'; - const UndeclaredClassMethod = 'PhanUndeclaredClassMethod'; - const UndeclaredClassProperty = 'PhanUndeclaredClassProperty'; - const UndeclaredClassReference = 'PhanUndeclaredClassReference'; - const UndeclaredClassStaticProperty = 'PhanUndeclaredClassStaticProperty'; - const UndeclaredClosureScope = 'PhanUndeclaredClosureScope'; - const UndeclaredConstant = 'PhanUndeclaredConstant'; - const UndeclaredMagicConstant = 'PhanUndeclaredMagicConstant'; - const UndeclaredExtendedClass = 'PhanUndeclaredExtendedClass'; - const UndeclaredFunction = 'PhanUndeclaredFunction'; - const UndeclaredInterface = 'PhanUndeclaredInterface'; - const UndeclaredMethod = 'PhanUndeclaredMethod'; - const UndeclaredProperty = 'PhanUndeclaredProperty'; - const UndeclaredStaticMethod = 'PhanUndeclaredStaticMethod'; - const UndeclaredStaticProperty = 'PhanUndeclaredStaticProperty'; - const UndeclaredTrait = 'PhanUndeclaredTrait'; - const UndeclaredTypeParameter = 'PhanUndeclaredTypeParameter'; - const UndeclaredTypeReturnType = 'PhanUndeclaredTypeReturnType'; - const UndeclaredTypeProperty = 'PhanUndeclaredTypeProperty'; - const UndeclaredTypeThrowsType = 'PhanUndeclaredTypeThrowsType'; - const UndeclaredVariable = 'PhanUndeclaredVariable'; - const UndeclaredVariableDim = 'PhanUndeclaredVariableDim'; - const UndeclaredVariableAssignOp = 'PhanUndeclaredVariableAssignOp'; - const UndeclaredClassInCallable = 'PhanUndeclaredClassInCallable'; - const UndeclaredStaticMethodInCallable = 'PhanUndeclaredStaticMethodInCallable'; - const UndeclaredFunctionInCallable = 'PhanUndeclaredFunctionInCallable'; - const UndeclaredMethodInCallable = 'PhanUndeclaredMethodInCallable'; - const UndeclaredInvokeInCallable = 'PhanUndeclaredInvokeInCallable'; - const EmptyFQSENInCallable = 'PhanEmptyFQSENInCallable'; - const InvalidFQSENInCallable = 'PhanInvalidFQSENInCallable'; - const EmptyFQSENInClasslike = 'PhanEmptyFQSENInClasslike'; - const InvalidFQSENInClasslike = 'PhanInvalidFQSENInClasslike'; - - // Issue::CATEGORY_TYPE - const NonClassMethodCall = 'PhanNonClassMethodCall'; - const PossiblyNonClassMethodCall = 'PhanPossiblyNonClassMethodCall'; - const TypeArrayOperator = 'PhanTypeArrayOperator'; - const TypeInvalidBitwiseBinaryOperator = 'PhanTypeInvalidBitwiseBinaryOperator'; - const TypeMismatchBitwiseBinaryOperands = 'PhanTypeMismatchBitwiseBinaryOperands'; - const TypeArraySuspicious = 'PhanTypeArraySuspicious'; - const TypeArrayUnsetSuspicious = 'PhanTypeArrayUnsetSuspicious'; - const TypeArraySuspiciousNullable = 'PhanTypeArraySuspiciousNullable'; - const TypeSuspiciousIndirectVariable = 'PhanTypeSuspiciousIndirectVariable'; - const TypeObjectUnsetDeclaredProperty = 'PhanTypeObjectUnsetDeclaredProperty'; - const TypeComparisonFromArray = 'PhanTypeComparisonFromArray'; - const TypeComparisonToArray = 'PhanTypeComparisonToArray'; - const TypeConversionFromArray = 'PhanTypeConversionFromArray'; - const TypeInstantiateAbstract = 'PhanTypeInstantiateAbstract'; - const TypeInstantiateInterface = 'PhanTypeInstantiateInterface'; - const TypeInstantiateTrait = 'PhanTypeInstantiateTrait'; - const TypeInvalidCloneNotObject = 'PhanTypeInvalidCloneNotObject'; - const TypeInvalidClosureScope = 'PhanTypeInvalidClosureScope'; - const TypeInvalidLeftOperand = 'PhanTypeInvalidLeftOperand'; - const TypeInvalidRightOperand = 'PhanTypeInvalidRightOperand'; - const TypeInvalidLeftOperandOfAdd = 'PhanTypeInvalidLeftOperandOfAdd'; - const TypeInvalidRightOperandOfAdd = 'PhanTypeInvalidRightOperandOfAdd'; - const TypeInvalidLeftOperandOfNumericOp = 'PhanTypeInvalidLeftOperandOfNumericOp'; - const TypeInvalidRightOperandOfNumericOp = 'PhanTypeInvalidRightOperandOfNumericOp'; - const TypeInvalidLeftOperandOfIntegerOp = 'PhanTypeInvalidLeftOperandOfIntegerOp'; - const TypeInvalidRightOperandOfIntegerOp = 'PhanTypeInvalidRightOperandOfIntegerOp'; - const TypeInvalidUnaryOperandNumeric = 'PhanTypeInvalidUnaryOperandNumeric'; - const TypeInvalidUnaryOperandBitwiseNot = 'PhanTypeInvalidUnaryOperandBitwiseNot'; - const TypeInvalidUnaryOperandIncOrDec = 'PhanTypeInvalidUnaryOperandIncOrDec'; - const TypeInvalidInstanceof = 'PhanTypeInvalidInstanceof'; - const TypeInvalidDimOffset = 'PhanTypeInvalidDimOffset'; - const TypeInvalidDimOffsetArrayDestructuring = 'PhanTypeInvalidDimOffsetArrayDestructuring'; - const TypeInvalidExpressionArrayDestructuring = 'PhanTypeInvalidExpressionArrayDestructuring'; - const TypeInvalidThrowsNonObject = 'PhanTypeInvalidThrowsNonObject'; - const TypeInvalidThrowsNonThrowable = 'PhanTypeInvalidThrowsNonThrowable'; - const TypeInvalidThrowsIsTrait = 'PhanTypeInvalidThrowsIsTrait'; - const TypeInvalidThrowsIsInterface = 'PhanTypeInvalidThrowsIsInterface'; - const TypeMagicVoidWithReturn = 'PhanTypeMagicVoidWithReturn'; - const TypeMismatchArgument = 'PhanTypeMismatchArgument'; - const TypeMismatchArgumentNullable = 'PhanTypeMismatchArgumentNullable'; - const TypeMismatchArgumentInternal = 'PhanTypeMismatchArgumentInternal'; - const TypeMismatchArgumentNullableInternal = 'PhanTypeMismatchArgumentNullableInternal'; - const PartialTypeMismatchArgument = 'PhanPartialTypeMismatchArgument'; - const PartialTypeMismatchArgumentInternal = 'PhanPartialTypeMismatchArgumentInternal'; - const PossiblyNullTypeArgument = 'PhanPossiblyNullTypeArgument'; - const PossiblyNullTypeArgumentInternal = 'PhanPossiblyNullTypeArgumentInternal'; - const PossiblyFalseTypeArgument = 'PhanPossiblyFalseTypeArgument'; - const PossiblyFalseTypeArgumentInternal = 'PhanPossiblyFalseTypeArgumentInternal'; - - const TypeMismatchDefault = 'PhanTypeMismatchDefault'; - const TypeMismatchDimAssignment = 'PhanTypeMismatchDimAssignment'; - const TypeMismatchDimEmpty = 'PhanTypeMismatchDimEmpty'; - const TypeMismatchDimFetch = 'PhanTypeMismatchDimFetch'; - const TypeMismatchDimFetchNullable = 'PhanTypeMismatchDimFetchNullable'; - const TypeMismatchUnpackKey = 'PhanTypeMismatchUnpackKey'; - const TypeMismatchUnpackValue = 'PhanTypeMismatchUnpackValue'; - const TypeMismatchArrayDestructuringKey = 'PhanTypeMismatchArrayDestructuringKey'; - const TypeMismatchVariadicComment = 'PhanMismatchVariadicComment'; - const TypeMismatchVariadicParam = 'PhanMismatchVariadicParam'; - const TypeMismatchForeach = 'PhanTypeMismatchForeach'; - const TypeNoAccessiblePropertiesForeach = 'PhanTypeNoAccessiblePropertiesForeach'; - const TypeNoPropertiesForeach = 'PhanTypeNoPropertiesForeach'; - const TypeSuspiciousNonTraversableForeach = 'PhanTypeSuspiciousNonTraversableForeach'; - const TypeMismatchProperty = 'PhanTypeMismatchProperty'; - const PossiblyNullTypeMismatchProperty = 'PhanPossiblyNullTypeMismatchProperty'; - const PossiblyFalseTypeMismatchProperty = 'PhanPossiblyFalseTypeMismatchProperty'; - const PartialTypeMismatchProperty = 'PhanPartialTypeMismatchProperty'; - const TypeMismatchReturn = 'PhanTypeMismatchReturn'; - const TypeMismatchReturnNullable = 'PhanTypeMismatchReturnNullable'; - const PartialTypeMismatchReturn = 'PhanPartialTypeMismatchReturn'; - const PossiblyNullTypeReturn = 'PhanPossiblyNullTypeReturn'; - const PossiblyFalseTypeReturn = 'PhanPossiblyFalseTypeReturn'; - const TypeMismatchDeclaredReturn = 'PhanTypeMismatchDeclaredReturn'; - const TypeMismatchDeclaredReturnNullable = 'PhanTypeMismatchDeclaredReturnNullable'; - const TypeMismatchDeclaredParam = 'PhanTypeMismatchDeclaredParam'; - const TypeMismatchDeclaredParamNullable = 'PhanTypeMismatchDeclaredParamNullable'; - const TypeMissingReturn = 'PhanTypeMissingReturn'; - const TypeNonVarPassByRef = 'PhanTypeNonVarPassByRef'; - const TypeParentConstructorCalled = 'PhanTypeParentConstructorCalled'; - const TypeSuspiciousEcho = 'PhanTypeSuspiciousEcho'; - const TypeSuspiciousStringExpression = 'PhanTypeSuspiciousStringExpression'; - const TypeVoidAssignment = 'PhanTypeVoidAssignment'; - const TypePossiblyInvalidCallable = 'PhanTypePossiblyInvalidCallable'; - const TypeInvalidCallable = 'PhanTypeInvalidCallable'; - const TypeInvalidCallableArraySize = 'PhanTypeInvalidCallableArraySize'; - const TypeInvalidCallableArrayKey = 'PhanTypeInvalidCallableArrayKey'; - const TypeInvalidCallableObjectOfMethod = 'PhanTypeInvalidCallableObjectOfMethod'; - const TypeExpectedObject = 'PhanTypeExpectedObject'; - const TypeExpectedObjectOrClassName = 'PhanTypeExpectedObjectOrClassName'; - const TypeExpectedObjectPropAccess = 'PhanTypeExpectedObjectPropAccess'; - const TypeExpectedObjectPropAccessButGotNull = 'PhanTypeExpectedObjectPropAccessButGotNull'; - const TypeExpectedObjectStaticPropAccess = 'PhanTypeExpectedObjectStaticPropAccess'; - - const TypeMismatchGeneratorYieldValue = 'PhanTypeMismatchGeneratorYieldValue'; - const TypeMismatchGeneratorYieldKey = 'PhanTypeMismatchGeneratorYieldKey'; - const TypeInvalidYieldFrom = 'PhanTypeInvalidYieldFrom'; - const TypeInvalidMethodName = 'PhanTypeInvalidMethodName'; - const TypeInvalidStaticMethodName = 'PhanTypeInvalidStaticMethodName'; - const TypeInvalidCallableMethodName = 'PhanTypeInvalidCallableMethodName'; - const TypeInvalidRequire = 'PhanTypeInvalidRequire'; - const TypeInvalidEval = 'PhanTypeInvalidEval'; - const RelativePathUsed = 'PhanRelativePathUsed'; - const TypeInvalidTraitReturn = 'PhanTypeInvalidTraitReturn'; - const TypeInvalidTraitParam = 'PhanTypeInvalidTraitParam'; - const InfiniteRecursion = 'PhanInfiniteRecursion'; - const TypeComparisonToInvalidClass = 'PhanTypeComparisonToInvalidClass'; - const TypeComparisonToInvalidClassType = 'PhanTypeComparisonToInvalidClassType'; - const TypeInvalidPropertyName = 'PhanTypeInvalidPropertyName'; - const TypeInvalidStaticPropertyName = 'PhanTypeInvalidStaticPropertyName'; - const TypeErrorInInternalCall = 'PhanTypeErrorInInternalCall'; - - // Issue::CATEGORY_ANALYSIS - const Unanalyzable = 'PhanUnanalyzable'; - const UnanalyzableInheritance = 'PhanUnanalyzableInheritance'; - const InvalidConstantFQSEN = 'PhanInvalidConstantFQSEN'; - const ReservedConstantName = 'PhanReservedConstantName'; - - // Issue::CATEGORY_VARIABLE - const VariableUseClause = 'PhanVariableUseClause'; - - // Issue::CATEGORY_STATIC - const StaticCallToNonStatic = 'PhanStaticCallToNonStatic'; - const StaticPropIsStaticType = 'PhanStaticPropIsStaticType'; - - // Issue::CATEGORY_CONTEXT - const ContextNotObject = 'PhanContextNotObject'; - const ContextNotObjectInCallable = 'PhanContextNotObjectInCallable'; - const ContextNotObjectUsingSelf = 'PhanContextNotObjectUsingSelf'; - - // Issue::CATEGORY_DEPRECATED - const DeprecatedClass = 'PhanDeprecatedClass'; - const DeprecatedInterface = 'PhanDeprecatedInterface'; - const DeprecatedTrait = 'PhanDeprecatedTrait'; - const DeprecatedFunction = 'PhanDeprecatedFunction'; - const DeprecatedFunctionInternal = 'PhanDeprecatedFunctionInternal'; - const DeprecatedProperty = 'PhanDeprecatedProperty'; - const DeprecatedClassConstant = 'PhanDeprecatedClassConstant'; - const DeprecatedCaseInsensitiveDefine = 'PhanDeprecatedCaseInsensitiveDefine'; - - // Issue::CATEGORY_PARAMETER - const ParamReqAfterOpt = 'PhanParamReqAfterOpt'; - const ParamSpecial1 = 'PhanParamSpecial1'; - const ParamSpecial2 = 'PhanParamSpecial2'; - const ParamSpecial3 = 'PhanParamSpecial3'; - const ParamSpecial4 = 'PhanParamSpecial4'; - const ParamSuspiciousOrder = 'PhanParamSuspiciousOrder'; - const ParamTooFew = 'PhanParamTooFew'; - const ParamTooFewInternal = 'PhanParamTooFewInternal'; - const ParamTooFewCallable = 'PhanParamTooFewCallable'; - const ParamTooMany = 'PhanParamTooMany'; - const ParamTooManyUnpack = 'PhanParamTooManyUnpack'; - const ParamTooManyInternal = 'PhanParamTooManyInternal'; - const ParamTooManyUnpackInternal = 'PhanParamTooManyUnpackInternal'; - const ParamTooManyCallable = 'PhanParamTooManyCallable'; - const ParamTypeMismatch = 'PhanParamTypeMismatch'; - const ParamSignatureMismatch = 'PhanParamSignatureMismatch'; - const ParamSignatureMismatchInternal = 'PhanParamSignatureMismatchInternal'; - const ParamRedefined = 'PhanParamRedefined'; - const ParamMustBeUserDefinedClassname = 'PhanParamMustBeUserDefinedClassname'; - - const ParamSignatureRealMismatchReturnType = 'PhanParamSignatureRealMismatchReturnType'; - const ParamSignatureRealMismatchReturnTypeInternal = 'PhanParamSignatureRealMismatchReturnTypeInternal'; - const ParamSignaturePHPDocMismatchReturnType = 'PhanParamSignaturePHPDocMismatchReturnType'; - const ParamSignatureRealMismatchTooManyRequiredParameters = 'PhanParamSignatureRealMismatchTooManyRequiredParameters'; - const ParamSignatureRealMismatchTooManyRequiredParametersInternal = 'PhanParamSignatureRealMismatchTooManyRequiredParametersInternal'; - const ParamSignaturePHPDocMismatchTooManyRequiredParameters = 'PhanParamSignaturePHPDocMismatchTooManyRequiredParameters'; - const ParamSignatureRealMismatchTooFewParameters = 'PhanParamSignatureRealMismatchTooFewParameters'; - const ParamSignatureRealMismatchTooFewParametersInternal = 'PhanParamSignatureRealMismatchTooFewParametersInternal'; - const ParamSignaturePHPDocMismatchTooFewParameters = 'PhanParamSignaturePHPDocMismatchTooFewParameters'; - const ParamSignatureRealMismatchHasParamType = 'PhanParamSignatureRealMismatchHasParamType'; - const ParamSignatureRealMismatchHasParamTypeInternal = 'PhanParamSignatureRealMismatchHasParamTypeInternal'; - const ParamSignaturePHPDocMismatchHasParamType = 'PhanParamSignaturePHPDocMismatchHasParamType'; - const ParamSignatureRealMismatchHasNoParamType = 'PhanParamSignatureRealMismatchHasNoParamType'; - const ParamSignatureRealMismatchHasNoParamTypeInternal = 'PhanParamSignatureRealMismatchHasNoParamTypeInternal'; - const ParamSignaturePHPDocMismatchHasNoParamType = 'PhanParamSignaturePHPDocMismatchHasNoParamType'; - const ParamSignatureRealMismatchParamIsReference = 'PhanParamSignatureRealMismatchParamIsReference'; - const ParamSignatureRealMismatchParamIsReferenceInternal = 'PhanParamSignatureRealMismatchParamIsReferenceInternal'; - const ParamSignaturePHPDocMismatchParamIsReference = 'PhanParamSignaturePHPDocMismatchParamIsReference'; - const ParamSignatureRealMismatchParamIsNotReference = 'PhanParamSignatureRealMismatchParamIsNotReference'; - const ParamSignatureRealMismatchParamIsNotReferenceInternal = 'PhanParamSignatureRealMismatchParamIsNotReferenceInternal'; - const ParamSignaturePHPDocMismatchParamIsNotReference = 'PhanParamSignaturePHPDocMismatchParamIsNotReference'; - const ParamSignatureRealMismatchParamVariadic = 'PhanParamSignatureRealMismatchParamVariadic'; - const ParamSignatureRealMismatchParamVariadicInternal = 'PhanParamSignatureRealMismatchParamVariadicInternal'; - const ParamSignaturePHPDocMismatchParamVariadic = 'PhanParamSignaturePHPDocMismatchParamVariadic'; - const ParamSignatureRealMismatchParamNotVariadic = 'PhanParamSignatureRealMismatchParamNotVariadic'; - const ParamSignatureRealMismatchParamNotVariadicInternal = 'PhanParamSignatureRealMismatchParamNotVariadicInternal'; - const ParamSignaturePHPDocMismatchParamNotVariadic = 'PhanParamSignaturePHPDocMismatchParamNotVariadic'; - const ParamSignatureRealMismatchParamType = 'PhanParamSignatureRealMismatchParamType'; - const ParamSignatureRealMismatchParamTypeInternal = 'PhanParamSignatureRealMismatchParamTypeInternal'; - const ParamSignaturePHPDocMismatchParamType = 'PhanParamSignaturePHPDocMismatchParamType'; - - // Issue::CATEGORY_NOOP - const NoopArray = 'PhanNoopArray'; - const NoopClosure = 'PhanNoopClosure'; - const NoopConstant = 'PhanNoopConstant'; - const NoopProperty = 'PhanNoopProperty'; - const NoopArrayAccess = 'PhanNoopArrayAccess'; - const NoopVariable = 'PhanNoopVariable'; - const NoopUnaryOperator = 'PhanNoopUnaryOperator'; - const NoopBinaryOperator = 'PhanNoopBinaryOperator'; - const NoopStringLiteral = 'PhanNoopStringLiteral'; - const NoopEncapsulatedStringLiteral = 'PhanNoopEncapsulatedStringLiteral'; - const NoopNumericLiteral = 'PhanNoopNumericLiteral'; - const NoopEmpty = 'PhanNoopEmpty'; - const NoopIsset = 'PhanNoopIsset'; - const NoopCast = 'PhanNoopCast'; - const UnreachableCatch = 'PhanUnreachableCatch'; - const UnreferencedClass = 'PhanUnreferencedClass'; - const UnreferencedFunction = 'PhanUnreferencedFunction'; - const UnreferencedPublicMethod = 'PhanUnreferencedPublicMethod'; - const UnreferencedProtectedMethod = 'PhanUnreferencedProtectedMethod'; - const UnreferencedPrivateMethod = 'PhanUnreferencedPrivateMethod'; - const UnreferencedPublicProperty = 'PhanUnreferencedPublicProperty'; - const UnreferencedProtectedProperty = 'PhanUnreferencedProtectedProperty'; - const UnreferencedPrivateProperty = 'PhanUnreferencedPrivateProperty'; - const UnreferencedPHPDocProperty = 'PhanUnreferencedPHPDocProperty'; - const ReadOnlyPublicProperty = 'PhanReadOnlyPublicProperty'; - const ReadOnlyProtectedProperty = 'PhanReadOnlyProtectedProperty'; - const ReadOnlyPrivateProperty = 'PhanReadOnlyPrivateProperty'; - const ReadOnlyPHPDocProperty = 'PhanReadOnlyPHPDocProperty'; - const WriteOnlyPublicProperty = 'PhanWriteOnlyPublicProperty'; - const WriteOnlyProtectedProperty = 'PhanWriteOnlyProtectedProperty'; - const WriteOnlyPrivateProperty = 'PhanWriteOnlyPrivateProperty'; - const WriteOnlyPHPDocProperty = 'PhanWriteOnlyPHPDocProperty'; - const UnreferencedConstant = 'PhanUnreferencedConstant'; - const UnreferencedPublicClassConstant = 'PhanUnreferencedPublicClassConstant'; - const UnreferencedProtectedClassConstant = 'PhanUnreferencedProtectedClassConstant'; - const UnreferencedPrivateClassConstant = 'PhanUnreferencedPrivateClassConstant'; - const UnreferencedClosure = 'PhanUnreferencedClosure'; - const UnreferencedUseNormal = 'PhanUnreferencedUseNormal'; - const UnreferencedUseFunction = 'PhanUnreferencedUseFunction'; - const UnreferencedUseConstant = 'PhanUnreferencedUseConstant'; - const UseNormalNoEffect = 'PhanUseNormalNoEffect'; - const UseNormalNamespacedNoEffect = 'PhanUseNormalNamespacedNoEffect'; - const UseFunctionNoEffect = 'PhanUseFunctionNoEffect'; - const UseConstantNoEffect = 'PhanUseConstantNoEffect'; - - const UnusedVariable = 'PhanUnusedVariable'; - const UnusedPublicMethodParameter = 'PhanUnusedPublicMethodParameter'; - const UnusedPublicFinalMethodParameter = 'PhanUnusedPublicFinalMethodParameter'; - const UnusedPublicNoOverrideMethodParameter = 'PhanUnusedPublicNoOverrideMethodParameter'; - const UnusedProtectedMethodParameter = 'PhanUnusedProtectedMethodParameter'; - const UnusedProtectedFinalMethodParameter = 'PhanUnusedProtectedFinalMethodParameter'; - const UnusedProtectedNoOverrideMethodParameter = 'PhanUnusedProtectedNoOverrideMethodParameter'; - const UnusedPrivateMethodParameter = 'PhanUnusedPrivateMethodParameter'; - const UnusedPrivateFinalMethodParameter = 'PhanUnusedPrivateFinalMethodParameter'; - const UnusedClosureUseVariable = 'PhanUnusedClosureUseVariable'; - const UnusedClosureParameter = 'PhanUnusedClosureParameter'; - const UnusedGlobalFunctionParameter = 'PhanUnusedGlobalFunctionParameter'; - const UnusedVariableValueOfForeachWithKey = 'PhanUnusedVariableValueOfForeachWithKey'; // has higher false positive rates than UnusedVariable - const UnusedVariableCaughtException = 'PhanUnusedVariableCaughtException'; // has higher false positive rates than UnusedVariable - const UnusedGotoLabel = 'PhanUnusedGotoLabel'; - const UnusedVariableReference = 'PhanUnusedVariableReference'; - const UnusedVariableStatic = 'PhanUnusedVariableStatic'; - const UnusedVariableGlobal = 'PhanUnusedVariableGlobal'; - const VariableDefinitionCouldBeConstant = 'PhanVariableDefinitionCouldBeConstant'; - const VariableDefinitionCouldBeConstantEmptyArray = 'PhanVariableDefinitionCouldBeConstantEmptyArray'; - const VariableDefinitionCouldBeConstantString = 'PhanVariableDefinitionCouldBeConstantString'; - const VariableDefinitionCouldBeConstantFloat = 'PhanVariableDefinitionCouldBeConstantFloat'; - const VariableDefinitionCouldBeConstantInt = 'PhanVariableDefinitionCouldBeConstantInt'; - const VariableDefinitionCouldBeConstantTrue = 'PhanVariableDefinitionCouldBeConstantTrue'; - const VariableDefinitionCouldBeConstantFalse = 'PhanVariableDefinitionCouldBeConstantFalse'; - const VariableDefinitionCouldBeConstantNull = 'PhanVariableDefinitionCouldBeConstantNull'; - - // Issue::CATEGORY_REDEFINE - const RedefineClass = 'PhanRedefineClass'; - const RedefineClassAlias = 'PhanRedefineClassAlias'; - const RedefineClassInternal = 'PhanRedefineClassInternal'; - const RedefineFunction = 'PhanRedefineFunction'; - const RedefineFunctionInternal = 'PhanRedefineFunctionInternal'; - const RedefineClassConstant = 'PhanRedefineClassConstant'; - const RedefineProperty = 'PhanRedefineProperty'; - const IncompatibleCompositionProp = 'PhanIncompatibleCompositionProp'; - const IncompatibleCompositionMethod = 'PhanIncompatibleCompositionMethod'; - const RedefinedUsedTrait = 'PhanRedefinedUsedTrait'; - const RedefinedInheritedInterface = 'PhanRedefinedInheritedInterface'; - const RedefinedExtendedClass = 'PhanRedefinedExtendedClass'; - - // Issue::CATEGORY_ACCESS - const AccessPropertyPrivate = 'PhanAccessPropertyPrivate'; - const AccessPropertyProtected = 'PhanAccessPropertyProtected'; - - const AccessReadOnlyProperty = 'PhanAccessReadOnlyProperty'; - const AccessWriteOnlyProperty = 'PhanAccessWriteOnlyProperty'; - const AccessReadOnlyMagicProperty = 'PhanAccessReadOnlyMagicProperty'; - const AccessWriteOnlyMagicProperty = 'PhanAccessWriteOnlyMagicProperty'; - - const AccessMethodPrivate = 'PhanAccessMethodPrivate'; - const AccessMethodPrivateWithCallMagicMethod = 'PhanAccessMethodPrivateWithCallMagicMethod'; - const AccessMethodProtected = 'PhanAccessMethodProtected'; - const AccessMethodProtectedWithCallMagicMethod = 'PhanAccessMethodProtectedWithCallMagicMethod'; - const AccessSignatureMismatch = 'PhanAccessSignatureMismatch'; - const AccessSignatureMismatchInternal = 'PhanAccessSignatureMismatchInternal'; - const PropertyAccessSignatureMismatch = 'PhanPropertyAccessSignatureMismatch'; - const PropertyAccessSignatureMismatchInternal = 'PhanPropertyAccessSignatureMismatchInternal'; - const ConstantAccessSignatureMismatch = 'PhanConstantAccessSignatureMismatch'; - const ConstantAccessSignatureMismatchInternal = 'PhanConstantAccessSignatureMismatchInternal'; - const AccessStaticToNonStatic = 'PhanAccessStaticToNonStatic'; - const AccessNonStaticToStatic = 'PhanAccessNonStaticToStatic'; - const AccessStaticToNonStaticProperty = 'PhanAccessStaticToNonStaticProperty'; - const AccessNonStaticToStaticProperty = 'PhanAccessNonStaticToStaticProperty'; - const AccessClassConstantPrivate = 'PhanAccessClassConstantPrivate'; - const AccessClassConstantProtected = 'PhanAccessClassConstantProtected'; - const AccessPropertyStaticAsNonStatic = 'PhanAccessPropertyStaticAsNonStatic'; - const AccessPropertyNonStaticAsStatic = 'PhanAccessPropertyNonStaticAsStatic'; - const AccessOwnConstructor = 'PhanAccessOwnConstructor'; - - const AccessConstantInternal = 'PhanAccessConstantInternal'; - const AccessClassInternal = 'PhanAccessClassInternal'; - const AccessClassConstantInternal = 'PhanAccessClassConstantInternal'; - const AccessPropertyInternal = 'PhanAccessPropertyInternal'; - const AccessMethodInternal = 'PhanAccessMethodInternal'; - const AccessWrongInheritanceCategory = 'PhanAccessWrongInheritanceCategory'; - const AccessWrongInheritanceCategoryInternal = 'PhanAccessWrongInheritanceCategoryInternal'; - const AccessExtendsFinalClass = 'PhanAccessExtendsFinalClass'; - const AccessExtendsFinalClassInternal = 'PhanAccessExtendsFinalClassInternal'; - const AccessOverridesFinalMethod = 'PhanAccessOverridesFinalMethod'; - const AccessOverridesFinalMethodInternal = 'PhanAccessOverridesFinalMethodInternal'; - const AccessOverridesFinalMethodPHPDoc = 'PhanAccessOverridesFinalMethodPHPDoc'; - - // Issue::CATEGORY_COMPATIBLE - const CompatibleExpressionPHP7 = 'PhanCompatibleExpressionPHP7'; - const CompatiblePHP7 = 'PhanCompatiblePHP7'; - const CompatibleNullableTypePHP70 = 'PhanCompatibleNullableTypePHP70'; - const CompatibleShortArrayAssignPHP70 = 'PhanCompatibleShortArrayAssignPHP70'; - const CompatibleKeyedArrayAssignPHP70 = 'PhanCompatibleKeyedArrayAssignPHP70'; - const CompatibleVoidTypePHP70 = 'PhanCompatibleVoidTypePHP70'; - const CompatibleIterableTypePHP70 = 'PhanCompatibleIterableTypePHP70'; - const CompatibleObjectTypePHP71 = 'PhanCompatibleNullableTypePHP71'; - const CompatibleUseVoidPHP70 = 'PhanCompatibleUseVoidPHP70'; - const CompatibleUseIterablePHP71 = 'PhanCompatibleUseIterablePHP71'; - const CompatibleUseObjectPHP71 = 'PhanCompatibleUseObjectPHP71'; - const CompatibleMultiExceptionCatchPHP70 = 'PhanCompatibleMultiExceptionCatchPHP70'; - const CompatibleNegativeStringOffset = 'PhanCompatibleNegativeStringOffset'; - const CompatibleAutoload = 'PhanCompatibleAutoload'; - - // Issue::CATEGORY_GENERIC - const TemplateTypeConstant = 'PhanTemplateTypeConstant'; - const TemplateTypeStaticMethod = 'PhanTemplateTypeStaticMethod'; - const TemplateTypeStaticProperty = 'PhanTemplateTypeStaticProperty'; - const GenericGlobalVariable = 'PhanGenericGlobalVariable'; - const GenericConstructorTypes = 'PhanGenericConstructorTypes'; - const TemplateTypeNotUsedInFunctionReturn = 'PhanTemplateTypeNotUsedInFunctionReturn'; - const TemplateTypeNotDeclaredInFunctionParams = 'PhanTemplateTypeNotDeclaredInFunctionParams'; - - // Issue::CATEGORY_COMMENT - const InvalidCommentForDeclarationType = 'PhanInvalidCommentForDeclarationType'; - const MisspelledAnnotation = 'PhanMisspelledAnnotation'; - const UnextractableAnnotation = 'PhanUnextractableAnnotation'; - const UnextractableAnnotationPart = 'PhanUnextractableAnnotationPart'; - const UnextractableAnnotationSuffix = 'PhanUnextractableAnnotationSuffix'; - const UnextractableAnnotationElementName = 'PhanUnextractableAnnotationElementName'; - const CommentParamWithoutRealParam = 'PhanCommentParamWithoutRealParam'; - const CommentParamAssertionWithoutRealParam = 'PhanCommentParamAssertionWithoutRealParam'; - const CommentParamOnEmptyParamList = 'PhanCommentParamOnEmptyParamList'; - const CommentOverrideOnNonOverrideMethod = 'PhanCommentOverrideOnNonOverrideMethod'; - const CommentOverrideOnNonOverrideConstant = 'PhanCommentOverrideOnNonOverrideConstant'; - const CommentParamOutOfOrder = 'PhanCommentParamOutOfOrder'; - const ThrowTypeAbsent = 'PhanThrowTypeAbsent'; - const ThrowTypeAbsentForCall = 'PhanThrowTypeAbsentForCall'; - const ThrowTypeMismatch = 'PhanThrowTypeMismatch'; - const ThrowTypeMismatchForCall = 'PhanThrowTypeMismatchForCall'; - const CommentAmbiguousClosure = 'PhanCommentAmbiguousClosure'; - const CommentDuplicateParam = 'PhanCommentDuplicateParam'; - const CommentDuplicateMagicMethod = 'PhanCommentDuplicateMagicMethod'; - const CommentDuplicateMagicProperty = 'PhanCommentDuplicateMagicProperty'; - // phpcs:enable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase - // end of issue name constants - - /** This category of issue is emitted when you're trying to access things that you can't access. */ - const CATEGORY_ACCESS = 1 << 1; - /** This category will be emitted when Phan doesn't know how to analyze something. */ - const CATEGORY_ANALYSIS = 1 << 2; - /** This category of issue is emitted when there are compatibility issues between PHP versions */ - const CATEGORY_COMPATIBLE = 1 << 3; - /** This category of issue is for when you're doing stuff out of the context in which you're allowed to do it, e.g. referencing `self` or `parent` when not in a class, interface or trait. */ - const CATEGORY_CONTEXT = 1 << 4; - /** This category of issue comes up when you're accessing deprecated elements (as marked by the `(at)deprecated` comment). */ - const CATEGORY_DEPRECATED = 1 << 5; - /** Issues in this category are emitted when you have reasonable code but it isn't doing anything. */ - const CATEGORY_NOOP = 1 << 6; - /** This category of error comes up when you're messing up your method or function parameters in some way. */ - const CATEGORY_PARAMETER = 1 << 7; - /** This category of issue comes up when more than one thing of whatever type have the same name and namespace. */ - const CATEGORY_REDEFINE = 1 << 8; - /** Static access to non-static methods, etc. */ - const CATEGORY_STATIC = 1 << 9; - /** This category of issue come from using incorrect types or types that cannot cast to the expected types. */ - const CATEGORY_TYPE = 1 << 10; - /** This category of issue comes up when there are references to undefined things. */ - const CATEGORY_UNDEFINED = 1 << 11; - /** This category is for using non-variables where variables are expected. */ - const CATEGORY_VARIABLE = 1 << 12; - /** This category is for plugins. */ - const CATEGORY_PLUGIN = 1 << 13; - /** This category contains issues related to [Phan's generic type support](https://github.com/phan/phan/wiki/Generic-Types). */ - const CATEGORY_GENERIC = 1 << 14; - /** This issue category comes up when there is an attempt to access an `(at)internal` element outside of the namespace in which it's defined. */ - const CATEGORY_INTERNAL = 1 << 15; - /** This is emitted for some (but not all) comments which Phan thinks are invalid or unparsable. */ - const CATEGORY_COMMENT = 1 << 16; - /** Emitted for syntax errors. */ - const CATEGORY_SYNTAX = 1 << 17; - - const CATEGORY_NAME = [ - self::CATEGORY_ACCESS => 'AccessError', - self::CATEGORY_ANALYSIS => 'Analysis', - self::CATEGORY_COMMENT => 'CommentError', - self::CATEGORY_COMPATIBLE => 'CompatError', - self::CATEGORY_CONTEXT => 'Context', - self::CATEGORY_DEPRECATED => 'DeprecatedError', - self::CATEGORY_GENERIC => 'Generic', - self::CATEGORY_INTERNAL => 'Internal', - self::CATEGORY_NOOP => 'NOOPError', - self::CATEGORY_PARAMETER => 'ParamError', - self::CATEGORY_PLUGIN => 'Plugin', - self::CATEGORY_REDEFINE => 'RedefineError', - self::CATEGORY_STATIC => 'StaticCallError', - self::CATEGORY_SYNTAX => 'Syntax', - self::CATEGORY_TYPE => 'TypeError', - self::CATEGORY_UNDEFINED => 'UndefError', - self::CATEGORY_VARIABLE => 'VarError', - ]; - - /** Low severity. E.g. documentation errors or code that would cause a (typically harmless) PHP notice. */ - const SEVERITY_LOW = 0; - /** Normal severity. E.g. something that may cause a minor bug. */ - const SEVERITY_NORMAL = 5; - /** Highest severity. Likely to cause an uncaught Error, Exception, or fatal error at runtime. */ - const SEVERITY_CRITICAL = 10; - - // See https://docs.codeclimate.com/v1.0/docs/remediation - // TODO: Decide on a way to estimate these and bring these up to date once codeclimate updates phan. - // Right now, almost everything is REMEDIATION_B. - const REMEDIATION_A = 1000000; - const REMEDIATION_B = 3000000; - /** @suppress PhanUnreferencedPublicClassConstant */ - const REMEDIATION_C = 6000000; - /** @suppress PhanUnreferencedPublicClassConstant */ - const REMEDIATION_D = 12000000; - /** @suppress PhanUnreferencedPublicClassConstant */ - const REMEDIATION_E = 16000000; - /** @suppress PhanUnreferencedPublicClassConstant */ - const REMEDIATION_F = 18000000; - - // type id constants. - const TYPE_ID_UNKNOWN = 999; - - // Keep sorted and in sync with Colorizing::default_color_for_template - const UNCOLORED_FORMAT_STRING_FOR_TEMPLATE = [ - 'CLASS' => '%s', - 'CLASSLIKE' => '%s', - 'CODE' => '%s', // A snippet from the code - 'COMMENT' => '%s', // contents of a phpdoc comment - 'CONST' => '%s', - 'COUNT' => '%d', - 'DETAILS' => '%s', // additional details about an error - 'FILE' => '%s', - 'FUNCTIONLIKE' => '%s', - 'FUNCTION' => '%s', - 'INDEX' => '%d', - 'INTERFACE' => '%s', - 'ISSUETYPE' => '%s', // used by Phan\Output\Printer, for minor issues. - 'ISSUETYPE_CRITICAL' => '%s', // for critical issues - 'ISSUETYPE_NORMAL' => '%s', // for normal issues - 'LINE' => '%d', - 'METHOD' => '%s', - 'NAMESPACE' => '%s', - 'OPERATOR' => '%s', - 'PARAMETER' => '%s', - 'PROPERTY' => '%s', - 'SCALAR' => '%s', // A scalar from the code - 'STRING_LITERAL' => '%s', // A string literal from the code - 'SUGGESTION' => '%s', - 'TYPE' => '%s', - 'TRAIT' => '%s', - 'VARIABLE' => '%s', - ]; - - /** @var string the type of this issue */ - private $type; - - /** - * @var int (a preferably unique integer for $type, for the pylint output formatter) - * Built in issue types must have a unique type id. - */ - private $type_id; - - /** @var int the category of this issue (self::CATEGORY_*) */ - private $category; - - /** @var int the severity of this issue (self::SEVERITY_*) */ - private $severity; - - /** @var string The format string for this issue type. Contains a mix of {CLASS} and %s/%d annotations. Used for colorizing option. */ - private $template_raw; - - /** @var string The printf format string for this issue type. If --color is enabled, this will have unix color codes. */ - private $template; - - /** @var int the expected number of arguments to the format string $this->template */ - private $argument_count; - - /** @var int self::REMEDIATION_* */ - private $remediation_difficulty; - - /** - * @param string $type the type of this issue - * @param int $category the category of this issue (self::CATEGORY_*) - * @param int $severity the severity of this issue (self::SEVERITY_*) - * @param string $template_raw the template string for issue messages. Contains a mix of {CLASS} and %s/%d annotations. - * @param int $remediation_difficulty self::REMEDIATION_* - * @param int $type_id (unique integer id for $type) - */ - public function __construct( - string $type, - int $category, - int $severity, - string $template_raw, - int $remediation_difficulty, - int $type_id - ) { - $this->type = $type; - $this->category = $category; - $this->severity = $severity; - $this->template_raw = $template_raw; - $this->template = self::templateToFormatString($template_raw); - $this->remediation_difficulty = $remediation_difficulty; - $this->type_id = $type_id; - } - - /** - * Converts the Phan template string to a regular format string. - */ - public static function templateToFormatString( - string $template - ) : string { - /** @param array<int,string> $matches */ - return \preg_replace_callback('/{([A-Z_]+)}/', static function (array $matches) use ($template): string { - $key = $matches[1]; - $replacement_exists = \array_key_exists($key, self::UNCOLORED_FORMAT_STRING_FOR_TEMPLATE); - if (!$replacement_exists) { - \error_log(\sprintf( - "No coloring info for issue message (%s), key {%s}. Valid template types: %s", - $template, - $key, - \implode(', ', \array_keys(self::UNCOLORED_FORMAT_STRING_FOR_TEMPLATE)) - )); - return '%s'; - } - return self::UNCOLORED_FORMAT_STRING_FOR_TEMPLATE[$key]; - }, $template); - } - - /** - * @return array<string,Issue> - */ - public static function issueMap() - { - static $error_map; - - if (\is_array($error_map)) { - return $error_map; - } - - // phpcs:disable Generic.Files.LineLength - /** - * @var array<int,Issue> - * Note: All type ids should be unique, and be grouped by the category. - * (E.g. If the category is (1 << x), then the type_id should be x*1000 + y - * If new type ids are added, existing ones should not be changed. - */ - $error_list = [ - // Issue::CATEGORY_SYNTAX - new Issue( - self::SyntaxError, - self::CATEGORY_SYNTAX, - self::SEVERITY_CRITICAL, - "%s", - self::REMEDIATION_A, - 17000 - ), - new Issue( - self::InvalidConstantExpression, - self::CATEGORY_SYNTAX, - self::SEVERITY_CRITICAL, - "Constant expression contains invalid operations", - self::REMEDIATION_A, - 17001 - ), - new Issue( - self::InvalidNode, - self::CATEGORY_SYNTAX, - self::SEVERITY_CRITICAL, - "%s", - self::REMEDIATION_A, - 17002 - ), - new Issue( - self::InvalidWriteToTemporaryExpression, - self::CATEGORY_SYNTAX, - self::SEVERITY_CRITICAL, - "Cannot use temporary expression (of type {TYPE}) in write context", - self::REMEDIATION_A, - 17003 - ), - new Issue( - self::InvalidTraitUse, - self::CATEGORY_SYNTAX, - self::SEVERITY_CRITICAL, - 'Invalid trait use: {DETAILS}', - self::REMEDIATION_A, - 17004 - ), - // Could try to make a better suggestion, optionally - new Issue( - self::ContinueTargetingSwitch, - self::CATEGORY_SYNTAX, - self::SEVERITY_NORMAL, - '"continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?', - self::REMEDIATION_A, - 17005 - ), - new Issue( - self::ContinueOrBreakNotInLoop, - self::CATEGORY_SYNTAX, - self::SEVERITY_CRITICAL, - '\'{OPERATOR}\' not in the \'loop\' or \'switch\' context.', - self::REMEDIATION_A, - 17006 - ), - new Issue( - self::ContinueOrBreakTooManyLevels, - self::CATEGORY_SYNTAX, - self::SEVERITY_CRITICAL, - 'Cannot \'{OPERATOR}\' {INDEX} levels.', - self::REMEDIATION_A, - 17007 - ), - - // Issue::CATEGORY_UNDEFINED - new Issue( - self::EmptyFile, - self::CATEGORY_UNDEFINED, - self::SEVERITY_LOW, - "Empty file {FILE}", - self::REMEDIATION_B, - 11000 - ), - new Issue( - self::MissingRequireFile, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Missing required file {FILE}", - self::REMEDIATION_B, - 11040 - ), - new Issue( - self::InvalidRequireFile, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Required file {FILE} is not a file", - self::REMEDIATION_B, - 11041 - ), - new Issue( - self::ParentlessClass, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Reference to parent of class {CLASS} that does not extend anything", - self::REMEDIATION_B, - 11001 - ), - new Issue( - self::UndeclaredClass, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Reference to undeclared class {CLASS}", - self::REMEDIATION_B, - 11002 - ), - new Issue( - self::UndeclaredExtendedClass, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Class extends undeclared class {CLASS}", - self::REMEDIATION_B, - 11003 - ), - new Issue( - self::UndeclaredInterface, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Class implements undeclared interface {INTERFACE}", - self::REMEDIATION_B, - 11004 - ), - new Issue( - self::UndeclaredTrait, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Class uses undeclared trait {TRAIT}", - self::REMEDIATION_B, - 11005 - ), - new Issue( - self::UndeclaredClassCatch, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Catching undeclared class {CLASS}", - self::REMEDIATION_B, - 11006 - ), - new Issue( - self::UndeclaredClassConstant, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Reference to constant {CONST} from undeclared class {CLASS}", - self::REMEDIATION_B, - 11007 - ), - new Issue( - self::UndeclaredClassInstanceof, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Checking instanceof against undeclared class {CLASS}", - self::REMEDIATION_B, - 11008 - ), - new Issue( - self::UndeclaredClassMethod, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Call to method {METHOD} from undeclared class {CLASS}", - self::REMEDIATION_B, - 11009 - ), - new Issue( - self::UndeclaredClassProperty, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Reference to instance property {PROPERTY} from undeclared class {CLASS}", - self::REMEDIATION_B, - 11038 - ), - new Issue( - self::UndeclaredClassStaticProperty, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Reference to static property {PROPERTY} from undeclared class {CLASS}", - self::REMEDIATION_B, - 11039 - ), - new Issue( - self::UndeclaredClassReference, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Reference to undeclared class {CLASS}", - self::REMEDIATION_B, - 11010 - ), - new Issue( - self::UndeclaredConstant, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Reference to undeclared constant {CONST}", - self::REMEDIATION_B, - 11011 - ), - new Issue( - self::UndeclaredFunction, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Call to undeclared function {FUNCTION}", - self::REMEDIATION_B, - 11012 - ), - new Issue( - self::UndeclaredMethod, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Call to undeclared method {METHOD}", - self::REMEDIATION_B, - 11013 - ), - new Issue( - self::UndeclaredStaticMethod, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Static call to undeclared method {METHOD}", - self::REMEDIATION_B, - 11014 - ), - new Issue( - self::UndeclaredProperty, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Reference to undeclared property {PROPERTY}", - self::REMEDIATION_B, - 11015 - ), - new Issue( - self::UndeclaredStaticProperty, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Static property '{PROPERTY}' on {CLASS} is undeclared", - self::REMEDIATION_B, - 11016 - ), - new Issue( - self::TraitParentReference, - self::CATEGORY_UNDEFINED, - self::SEVERITY_LOW, - "Reference to parent from trait {TRAIT}", - self::REMEDIATION_B, - 11017 - ), - new Issue( - self::UndeclaredVariable, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Variable \${VARIABLE} is undeclared", - self::REMEDIATION_B, - 11018 - ), - new Issue( - self::UndeclaredTypeParameter, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Parameter \${PARAMETER} has undeclared type {TYPE}", - self::REMEDIATION_B, - 11019 - ), - new Issue( - self::UndeclaredTypeProperty, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Property {PROPERTY} has undeclared type {TYPE}", - self::REMEDIATION_B, - 11020 - ), - new Issue( - self::UndeclaredClosureScope, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Reference to undeclared class {CLASS} in @phan-closure-scope", - self::REMEDIATION_B, - 11021 - ), - new Issue( - self::ClassContainsAbstractMethod, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "non-abstract class {CLASS} contains abstract method {METHOD} declared at {FILE}:{LINE}", - self::REMEDIATION_B, - 11022 - ), - new Issue( - self::ClassContainsAbstractMethodInternal, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "non-abstract class {CLASS} contains abstract internal method {METHOD}", - self::REMEDIATION_B, - 11023 - ), - new Issue( - self::UndeclaredAliasedMethodOfTrait, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Alias {METHOD} was defined for a method {METHOD} which does not exist in trait {TRAIT}", - self::REMEDIATION_B, - 11024 - ), - new Issue( - self::RequiredTraitNotAdded, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Required trait {TRAIT} for trait adaptation was not added to class", - self::REMEDIATION_B, - 11025 - ), - new Issue( - self::AmbiguousTraitAliasSource, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Trait alias {METHOD} has an ambiguous source method {METHOD} with more than one possible source trait. Possibilities: {TRAIT}", - self::REMEDIATION_B, - 11026 - ), - new Issue( - self::UndeclaredVariableDim, - self::CATEGORY_UNDEFINED, - self::SEVERITY_LOW, - "Variable \${VARIABLE} was undeclared, but array fields are being added to it.", - self::REMEDIATION_B, - 11027 - ), - new Issue( - self::UndeclaredVariableAssignOp, - self::CATEGORY_UNDEFINED, - self::SEVERITY_LOW, - "Variable \${VARIABLE} was undeclared, but it is being used as the left-hand side of an assignment operation", - self::REMEDIATION_B, - 11037 - ), - new Issue( - self::UndeclaredTypeReturnType, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Return type of {METHOD} is undeclared type {TYPE}", - self::REMEDIATION_B, - 11028 - ), - new Issue( - self::UndeclaredTypeThrowsType, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "@throws type of {METHOD} has undeclared type {TYPE}", - self::REMEDIATION_B, - 11034 - ), - new Issue( - self::UndeclaredClassAliasOriginal, - self::CATEGORY_UNDEFINED, - self::SEVERITY_CRITICAL, - "Reference to undeclared class {CLASS} for the original class of a class_alias for {CLASS}", - self::REMEDIATION_B, - 11029 - ), - new Issue( - self::UndeclaredClassInCallable, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Reference to undeclared class {CLASS} in callable {METHOD}", - self::REMEDIATION_B, - 11030 - ), - new Issue( - self::UndeclaredStaticMethodInCallable, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Reference to undeclared static method {METHOD} in callable", - self::REMEDIATION_B, - 11031 - ), - new Issue( - self::UndeclaredFunctionInCallable, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Call to undeclared function {FUNCTION} in callable", - self::REMEDIATION_B, - 11032 - ), - new Issue( - self::UndeclaredMethodInCallable, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Call to undeclared method {METHOD} in callable. Possible object type(s) for that method are {TYPE}", - self::REMEDIATION_B, - 11033 - ), - new Issue( - self::EmptyFQSENInCallable, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Possible call to a function '{FUNCTIONLIKE}' with an empty FQSEN.", - self::REMEDIATION_B, - 11035 - ), - new Issue( - self::EmptyFQSENInClasslike, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Possible use of a classlike '{CLASSLIKE}' with an empty FQSEN.", - self::REMEDIATION_B, - 11036 - ), - new Issue( - self::InvalidFQSENInCallable, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Possible call to a function '{FUNCTIONLIKE}' with an invalid FQSEN.", - self::REMEDIATION_B, - 11042 - ), - new Issue( - self::InvalidFQSENInClasslike, - self::CATEGORY_UNDEFINED, - self::SEVERITY_NORMAL, - "Possible use of a classlike '{CLASSLIKE}' with an invalid FQSEN.", - self::REMEDIATION_B, - 11043 - ), - new Issue( - self::UndeclaredMagicConstant, - self::CATEGORY_UNDEFINED, - self::SEVERITY_LOW, - "Reference to magic constant {CONST} that is undeclared in the current scope", - self::REMEDIATION_B, - 11044 - ), - new Issue( - self::UndeclaredInvokeInCallable, - self::CATEGORY_UNDEFINED, - self::SEVERITY_LOW, - "Possible attempt to access missing magic method {FUNCTIONLIKE} of '{CLASS}'", - self::REMEDIATION_B, - 11045 - ), - - // Issue::CATEGORY_ANALYSIS - new Issue( - self::Unanalyzable, - self::CATEGORY_ANALYSIS, - self::SEVERITY_LOW, - "Expression is unanalyzable or feature is unimplemented. Please create an issue at https://github.com/phan/phan/issues/new.", - self::REMEDIATION_B, - 2000 - ), - new Issue( - self::UnanalyzableInheritance, - self::CATEGORY_ANALYSIS, - self::SEVERITY_LOW, - "Unable to determine the method(s) which {METHOD} overrides, but Phan inferred that it did override something earlier. Please create an issue at https://github.com/phan/phan/issues/new with a test case.", - self::REMEDIATION_B, - 2001 - ), - new Issue( - self::InvalidConstantFQSEN, - self::CATEGORY_ANALYSIS, - self::SEVERITY_NORMAL, - "'{CONST}' is an invalid FQSEN for a constant", - self::REMEDIATION_B, - 2002 - ), - new Issue( - self::ReservedConstantName, - self::CATEGORY_ANALYSIS, - self::SEVERITY_NORMAL, - "'{CONST}' has a reserved keyword in the constant name", - self::REMEDIATION_B, - 2003 - ), - - // Issue::CATEGORY_TYPE - new Issue( - self::TypeMismatchProperty, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Assigning {TYPE} to property but {PROPERTY} is {TYPE}", - self::REMEDIATION_B, - 10001 - ), - new Issue( - self::PartialTypeMismatchProperty, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Assigning {TYPE} to property but {PROPERTY} is {TYPE} ({TYPE} is incompatible)", - self::REMEDIATION_B, - 10063 - ), - new Issue( - self::PossiblyNullTypeMismatchProperty, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Assigning {TYPE} to property but {PROPERTY} is {TYPE} ({TYPE} is incompatible)", - self::REMEDIATION_B, - 10064 - ), - new Issue( - self::PossiblyFalseTypeMismatchProperty, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Assigning {TYPE} to property but {PROPERTY} is {TYPE} ({TYPE} is incompatible)", - self::REMEDIATION_B, - 10065 - ), - new Issue( - self::TypeMismatchDefault, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Default value for {TYPE} \${VARIABLE} can't be {TYPE}", - self::REMEDIATION_B, - 10002 - ), - new Issue( - self::TypeMismatchVariadicComment, - self::CATEGORY_TYPE, - self::SEVERITY_LOW, - "{PARAMETER} is variadic in comment, but not variadic in param ({PARAMETER})", - self::REMEDIATION_B, - 10021 - ), - new Issue( - self::TypeMismatchVariadicParam, - self::CATEGORY_TYPE, - self::SEVERITY_LOW, - "{PARAMETER} is not variadic in comment, but variadic in param ({PARAMETER})", - self::REMEDIATION_B, - 10023 - ), - new Issue( - self::TypeMismatchArgument, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Argument {INDEX} ({VARIABLE}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 10003 - ), - new Issue( - self::TypeMismatchArgumentNullable, - self::CATEGORY_TYPE, - self::SEVERITY_LOW, - "Argument {INDEX} ({VARIABLE}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE} defined at {FILE}:{LINE} (expected type to be non-nullable)", - self::REMEDIATION_B, - 10105 - ), - new Issue( - self::TypeMismatchArgumentInternal, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Argument {INDEX} ({VARIABLE}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE}", - self::REMEDIATION_B, - 10004 - ), - new Issue( - self::TypeMismatchArgumentNullableInternal, - self::CATEGORY_TYPE, - self::SEVERITY_LOW, - "Argument {INDEX} ({VARIABLE}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE} (expected type to be non-nullable)", - self::REMEDIATION_B, - 10106 - ), - new Issue( - self::TypeMismatchGeneratorYieldValue, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Yield statement has a value with type {TYPE} but {FUNCTIONLIKE} is declared to yield values of type {TYPE} in {TYPE}", - self::REMEDIATION_B, - 10067 - ), - new Issue( - self::TypeMismatchGeneratorYieldKey, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Yield statement has a key with type {TYPE} but {FUNCTIONLIKE} is declared to yield keys of type {TYPE} in {TYPE}", - self::REMEDIATION_B, - 10068 - ), - new Issue( - self::TypeInvalidYieldFrom, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - "Yield from statement was passed an invalid expression of type {TYPE} (expected Traversable/array)", - self::REMEDIATION_B, - 10069 - ), - new Issue( - self::PartialTypeMismatchArgument, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Argument {INDEX} ({VARIABLE}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE} ({TYPE} is incompatible) defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 10054 - ), - new Issue( - self::PartialTypeMismatchArgumentInternal, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Argument {INDEX} ({VARIABLE}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE} ({TYPE} is incompatible)", - self::REMEDIATION_B, - 10055 - ), - new Issue( - self::PossiblyNullTypeArgument, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Argument {INDEX} ({VARIABLE}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE} ({TYPE} is incompatible) defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 10056 - ), - new Issue( - self::PossiblyNullTypeArgumentInternal, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Argument {INDEX} ({VARIABLE}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE} ({TYPE} is incompatible)", - self::REMEDIATION_B, - 10057 - ), - new Issue( - self::PossiblyFalseTypeArgument, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Argument {INDEX} ({VARIABLE}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE} ({TYPE} is incompatible) defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 10058 - ), - new Issue( - self::PossiblyFalseTypeArgumentInternal, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Argument {INDEX} ({VARIABLE}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE} ({TYPE} is incompatible)", - self::REMEDIATION_B, - 10059 - ), - new Issue( - self::TypeMismatchReturn, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Returning type {TYPE} but {FUNCTIONLIKE} is declared to return {TYPE}", - self::REMEDIATION_B, - 10005 - ), - new Issue( - self::TypeMismatchReturnNullable, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Returning type {TYPE} but {FUNCTIONLIKE} is declared to return {TYPE} (expected returned value to be non-nullable)", - self::REMEDIATION_B, - 10107 - ), - new Issue( - self::PartialTypeMismatchReturn, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Returning type {TYPE} but {FUNCTIONLIKE} is declared to return {TYPE} ({TYPE} is incompatible)", - self::REMEDIATION_B, - 10060 - ), - new Issue( - self::PossiblyNullTypeReturn, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Returning type {TYPE} but {FUNCTIONLIKE} is declared to return {TYPE} ({TYPE} is incompatible)", - self::REMEDIATION_B, - 10061 - ), - new Issue( - self::PossiblyFalseTypeReturn, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Returning type {TYPE} but {FUNCTIONLIKE} is declared to return {TYPE} ({TYPE} is incompatible)", - self::REMEDIATION_B, - 10062 - ), - new Issue( - self::TypeMismatchDeclaredReturn, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Doc-block of {METHOD} contains declared return type {TYPE} which is incompatible with the return type {TYPE} declared in the signature", - self::REMEDIATION_B, - 10020 - ), - new Issue( - self::TypeMismatchDeclaredReturnNullable, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Doc-block of {METHOD} has declared return type {TYPE} which is not a permitted replacement of the nullable return type {TYPE} declared in the signature ('?T' should be documented as 'T|null' or '?T')", - self::REMEDIATION_B, - 10028 - ), - new Issue( - self::TypeMismatchDeclaredParam, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Doc-block of \${VARIABLE} in {METHOD} contains phpdoc param type {TYPE} which is incompatible with the param type {TYPE} declared in the signature", - self::REMEDIATION_B, - 10022 - ), - new Issue( - self::TypeMismatchDeclaredParamNullable, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Doc-block of \${VARIABLE} in {METHOD} is phpdoc param type {TYPE} which is not a permitted replacement of the nullable param type {TYPE} declared in the signature ('?T' should be documented as 'T|null' or '?T')", - self::REMEDIATION_B, - 10027 - ), - new Issue( - self::TypeMissingReturn, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Method {METHOD} is declared to return {TYPE} but has no return value", - self::REMEDIATION_B, - 10006 - ), - new Issue( - self::TypeMismatchForeach, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "{TYPE} passed to foreach instead of array", - self::REMEDIATION_B, - 10007 - ), - new Issue( - self::TypeArrayOperator, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid array operand provided to operator '{OPERATOR}' between types {TYPE} and {TYPE}", - self::REMEDIATION_B, - 10008 - ), - new Issue( - self::TypeArraySuspicious, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Suspicious array access to {TYPE}", - self::REMEDIATION_B, - 10009 - ), - new Issue( - self::TypeArrayUnsetSuspicious, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Suspicious attempt to unset an offset of a value of type {TYPE}", - self::REMEDIATION_B, - 10048 - ), - new Issue( - self::TypeComparisonToArray, - self::CATEGORY_TYPE, - self::SEVERITY_LOW, - "{TYPE} to array comparison", - self::REMEDIATION_B, - 10010 - ), - new Issue( - self::TypeComparisonFromArray, - self::CATEGORY_TYPE, - self::SEVERITY_LOW, - "array to {TYPE} comparison", - self::REMEDIATION_B, - 10011 - ), - new Issue( - self::TypeConversionFromArray, - self::CATEGORY_TYPE, - self::SEVERITY_LOW, - "array to {TYPE} conversion", - self::REMEDIATION_B, - 10012 - ), - new Issue( - self::TypeInstantiateAbstract, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Instantiation of abstract class {CLASS}", - self::REMEDIATION_B, - 10013 - ), - new Issue( - self::TypeInstantiateInterface, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Instantiation of interface {INTERFACE}", - self::REMEDIATION_B, - 10014 - ), - new Issue( - self::TypeInstantiateTrait, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Instantiation of trait {TRAIT}", - self::REMEDIATION_B, - 10074 - ), - new Issue( - self::TypeInvalidClosureScope, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid @phan-closure-scope: expected a class name, got {TYPE}", - self::REMEDIATION_B, - 10024 - ), - new Issue( - self::TypeInvalidRightOperand, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid operator: left operand is array and right is not", - self::REMEDIATION_B, - 10015 - ), - new Issue( - self::TypeInvalidLeftOperand, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid operator: right operand is array and left is not", - self::REMEDIATION_B, - 10016 - ), - new Issue( - self::TypeInvalidRightOperandOfAdd, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid operator: right operand of {OPERATOR} is {TYPE} (expected array or number)", - self::REMEDIATION_B, - 10070 - ), - new Issue( - self::TypeInvalidLeftOperandOfAdd, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid operator: left operand of {OPERATOR} is {TYPE} (expected array or number)", - self::REMEDIATION_B, - 10071 - ), - new Issue( - self::TypeInvalidRightOperandOfNumericOp, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid operator: right operand of {OPERATOR} is {TYPE} (expected number)", - self::REMEDIATION_B, - 10072 - ), - new Issue( - self::TypeInvalidLeftOperandOfNumericOp, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid operator: left operand of {OPERATOR} is {TYPE} (expected number)", - self::REMEDIATION_B, - 10073 - ), - new Issue( - self::TypeInvalidRightOperandOfIntegerOp, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid operator: right operand of {OPERATOR} is {TYPE} (expected int)", - self::REMEDIATION_B, - 10100 - ), - new Issue( - self::TypeInvalidLeftOperandOfIntegerOp, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid operator: left operand of {OPERATOR} is {TYPE} (expected int)", - self::REMEDIATION_B, - 10101 - ), - new Issue( - self::TypeInvalidUnaryOperandNumeric, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid operator: unary operand of {STRING_LITERAL} is {TYPE} (expected number)", - self::REMEDIATION_B, - 10075 - ), - new Issue( - self::TypeInvalidUnaryOperandBitwiseNot, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid operator: unary operand of {STRING_LITERAL} is {TYPE} (expected number or string)", - self::REMEDIATION_B, - 10076 - ), - new Issue( - self::TypeParentConstructorCalled, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Must call parent::__construct() from {CLASS} which extends {CLASS}", - self::REMEDIATION_B, - 10017 - ), - new Issue( - self::TypeNonVarPassByRef, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Only variables can be passed by reference at argument {INDEX} of {FUNCTIONLIKE}", - self::REMEDIATION_B, - 10018 - ), - new Issue( - self::NonClassMethodCall, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - "Call to method {METHOD} on non-class type {TYPE}", - self::REMEDIATION_B, - 10019 - ), - new Issue( - self::TypeVoidAssignment, - self::CATEGORY_TYPE, - self::SEVERITY_LOW, - "Cannot assign void return value", - self::REMEDIATION_B, - 10000 - ), - new Issue( - self::TypeSuspiciousIndirectVariable, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Indirect variable ${(expr)} has invalid inner expression type {TYPE}, expected string/integer', - self::REMEDIATION_B, - 10025 - ), - new Issue( - self::TypeMagicVoidWithReturn, - self::CATEGORY_TYPE, - self::SEVERITY_LOW, - 'Found a return statement with a value in the implementation of the magic method {METHOD}, expected void return type', - self::REMEDIATION_B, - 10026 - ), - new Issue( - self::TypeInvalidInstanceof, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Found an instanceof class name of type {TYPE}, but class name must be a valid object or a string', - self::REMEDIATION_B, - 10029 - ), - new Issue( - self::TypeMismatchDimAssignment, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'When appending to a value of type {TYPE}, found an array access index of type {TYPE}, but expected the index to be of type {TYPE}', - self::REMEDIATION_B, - 10030 - ), - new Issue( - self::TypeMismatchDimEmpty, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - 'Assigning to an empty array index of a value of type {TYPE}, but expected the index to exist and be of type {TYPE}', - self::REMEDIATION_B, - 10031 - ), - new Issue( - self::TypeMismatchDimFetch, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'When fetching an array index from a value of type {TYPE}, found an array index of type {TYPE}, but expected the index to be of type {TYPE}', - self::REMEDIATION_B, - 10032 - ), - new Issue( - self::TypeMismatchDimFetchNullable, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'When fetching an array index from a value of type {TYPE}, found an array index of type {TYPE}, but expected the index to be of the non-nullable type {TYPE}', - self::REMEDIATION_B, - 10044 - ), - new Issue( - self::TypeInvalidCallableArraySize, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'In a place where phan was expecting a callable, saw an array of size {COUNT}, but callable arrays must be of size 2', - self::REMEDIATION_B, - 10033 - ), - new Issue( - self::TypeInvalidCallableArrayKey, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'In a place where phan was expecting a callable, saw an array with an unexpected key for element #{INDEX} (expected [$class_or_expr, $method_name])', - self::REMEDIATION_B, - 10034 - ), - new Issue( - self::TypeInvalidCallableObjectOfMethod, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'In a place where phan was expecting a callable, saw a two-element array with a class or expression with an unexpected type {TYPE} (expected a class type or string). Method name was {METHOD}', - self::REMEDIATION_B, - 10035 - ), - new Issue( - self::TypeExpectedObject, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Expected an object instance but saw expression with type {TYPE}', - self::REMEDIATION_B, - 10036 - ), - new Issue( - self::TypeExpectedObjectOrClassName, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Expected an object instance or the name of a class but saw expression with type {TYPE}', - self::REMEDIATION_B, - 10037 - ), - new Issue( - self::TypeExpectedObjectPropAccess, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - 'Expected an object instance when accessing an instance property, but saw an expression with type {TYPE}', - self::REMEDIATION_B, - 10038 - ), - new Issue( - self::TypeExpectedObjectStaticPropAccess, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Expected an object instance or a class name when accessing a static property, but saw an expression with type {TYPE}', - self::REMEDIATION_B, - 10039 - ), - new Issue( - self::TypeExpectedObjectPropAccessButGotNull, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Expected an object instance when accessing an instance property, but saw an expression with type {TYPE}', - self::REMEDIATION_B, - 10040 - ), - new Issue( - self::TypeMismatchUnpackKey, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'When unpacking a value of type {TYPE}, the value\'s keys were of type {TYPE}, but the keys should be consecutive integers starting from 0', - self::REMEDIATION_B, - 10041 - ), - new Issue( - self::TypeMismatchUnpackValue, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Attempting to unpack a value of type {TYPE} which does not contain any subtypes of iterable (such as array or Traversable)', - self::REMEDIATION_B, - 10042 - ), - new Issue( - self::TypeMismatchArrayDestructuringKey, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Attempting an array destructing assignment with a key of type {TYPE} but the only key types of the right-hand side are of type {TYPE}', - self::REMEDIATION_B, - 10043 - ), - new Issue( - self::TypeArraySuspiciousNullable, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Suspicious array access to nullable {TYPE}", - self::REMEDIATION_B, - 10045 - ), - new Issue( - self::TypeInvalidDimOffset, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid offset {SCALAR} of array type {TYPE}", - self::REMEDIATION_B, - 10046 - ), - new Issue( - self::TypeInvalidDimOffsetArrayDestructuring, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid offset {SCALAR} of array type {TYPE} in an array destructuring assignment", - self::REMEDIATION_B, - 10047 - ), - new Issue( - self::TypeInvalidExpressionArrayDestructuring, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid value of type {TYPE} in an array destructuring assignment, expected {TYPE}", - self::REMEDIATION_B, - 10077 - ), - new Issue( - self::TypeSuspiciousEcho, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Suspicious argument {TYPE} for an echo/print statement", - self::REMEDIATION_B, - 10049 - ), - - new Issue( - self::TypeInvalidThrowsNonObject, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "@throws annotation of {FUNCTIONLIKE} has invalid non-object type {TYPE}, expected a class", - self::REMEDIATION_B, - 10050 - ), - new Issue( - self::TypeInvalidThrowsIsTrait, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "@throws annotation of {FUNCTIONLIKE} has invalid trait type {TYPE}, expected a class", - self::REMEDIATION_B, - 10051 - ), - new Issue( - self::TypeInvalidThrowsIsInterface, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "@throws annotation of {FUNCTIONLIKE} has suspicious interface type {TYPE} for an @throws annotation, expected class (PHP allows interfaces to be caught, so this might be intentional)", - self::REMEDIATION_B, - 10052 - ), - new Issue( - self::TypeInvalidThrowsNonThrowable, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "@throws annotation of {FUNCTIONLIKE} has suspicious class type {TYPE}, which does not extend Error/Exception", - self::REMEDIATION_B, - 10053 - ), - new Issue( - self::TypeSuspiciousStringExpression, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Suspicious type {TYPE} of a variable or expression used to build a string. (Expected type to be able to cast to a string)", - self::REMEDIATION_B, - 10066 - ), - new Issue( - self::TypeInvalidMethodName, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - "Instance method name must be a string, got {TYPE}", - self::REMEDIATION_B, - 10078 - ), - new Issue( - self::TypeInvalidStaticMethodName, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - "Static method name must be a string, got {TYPE}", - self::REMEDIATION_B, - 10079 - ), - new Issue( - self::TypeInvalidCallableMethodName, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - "Method name of callable must be a string, got {TYPE}", - self::REMEDIATION_B, - 10080 - ), - new Issue( - self::TypeObjectUnsetDeclaredProperty, - self::CATEGORY_TYPE, - self::SEVERITY_LOW, // There are valid reasons to do this, e.g. for the typed properties V2 RFC or to change serialization - "Suspicious attempt to unset class {TYPE}'s property {PROPERTY} declared at {FILE}:{LINE} (This can be done, but is more commonly done for dynamic properties and Phan does not expect this)", - self::REMEDIATION_B, - 10081 - ), - new Issue( - self::TypeNoAccessiblePropertiesForeach, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Class {TYPE} was passed to foreach, but it does not extend Traversable and none of its declared properties are accessible from this context. (This check excludes dynamic properties)", - self::REMEDIATION_B, - 10082 - ), - new Issue( - self::TypeNoPropertiesForeach, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Class {TYPE} was passed to foreach, but it does not extend Traversable and doesn't have any declared properties. (This check excludes dynamic properties)", - self::REMEDIATION_B, - 10083 - ), - new Issue( - self::TypeSuspiciousNonTraversableForeach, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Class {TYPE} was passed to foreach, but it does not extend Traversable. This may be intentional, because some of that class's declared properties are accessible from this context. (This check excludes dynamic properties)", - self::REMEDIATION_B, - 10084 - ), - new Issue( - self::TypeInvalidRequire, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - "Require statement was passed an invalid expression of type {TYPE} (expected a string)", - self::REMEDIATION_B, - 10085 - ), - new Issue( - self::TypeInvalidEval, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - "Eval statement was passed an invalid expression of type {TYPE} (expected a string)", - self::REMEDIATION_B, - 10086 - ), - new Issue( - self::RelativePathUsed, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "{FUNCTION}() statement was passed a relative path {STRING_LITERAL} instead of an absolute path", - self::REMEDIATION_B, - 10087 - ), - new Issue( - self::TypeInvalidCloneNotObject, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - "Expected an object to be passed to clone() but got {TYPE}", - self::REMEDIATION_B, - 10088 - ), - new Issue( - self::TypeInvalidTraitReturn, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - "Expected a class or interface (or built-in type) to be the real return type of {FUNCTIONLIKE} but got trait {TRAIT}", - self::REMEDIATION_B, - 10089 - ), - new Issue( - self::TypeInvalidTraitParam, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, - "{FUNCTIONLIKE} is declared to have a parameter \${PARAMETER} with a real type of trait {TYPE} (expected a class or interface or built-in type)", - self::REMEDIATION_B, - 10090 - ), - new Issue( - self::TypeInvalidBitwiseBinaryOperator, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid non-int/non-string operand provided to operator '{OPERATOR}' between types {TYPE} and {TYPE}", - self::REMEDIATION_B, - 10091 - ), - new Issue( - self::TypeMismatchBitwiseBinaryOperands, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Unexpected mix of int and string operands provided to operator '{OPERATOR}' between types {TYPE} and {TYPE} (expected one type but not both)", - self::REMEDIATION_B, - 10092 - ), - new Issue( - self::InfiniteRecursion, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "{FUNCTIONLIKE} is calling itself in a way that may cause infinite recursion.", - self::REMEDIATION_B, - 10093 - ), - new Issue( - self::PossiblyNonClassMethodCall, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Call to method {METHOD} on type {TYPE} that could be a non-object", - self::REMEDIATION_B, - 10094 - ), - new Issue( - self::TypeInvalidCallable, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Saw type {TYPE} which cannot be a callable', - self::REMEDIATION_B, - 10095 - ), - new Issue( - self::TypePossiblyInvalidCallable, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Saw type {TYPE} which is possibly not a callable', - self::REMEDIATION_B, - 10096 - ), - new Issue( - self::TypeComparisonToInvalidClass, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Saw code asserting that an expression has a class, but that class is an invalid/impossible FQSEN {STRING_LITERAL}', - self::REMEDIATION_B, - 10097 - ), - new Issue( - self::TypeComparisonToInvalidClassType, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - 'Saw code asserting that an expression has a class, but saw an invalid/impossible union type {TYPE} (expected {TYPE})', - self::REMEDIATION_B, - 10098 - ), - new Issue( - self::TypeInvalidUnaryOperandIncOrDec, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, - "Invalid operator: unary operand of {STRING_LITERAL} is {TYPE} (expected int or string or float)", - self::REMEDIATION_B, - 10099 - ), - new Issue( - self::TypeInvalidPropertyName, - self::CATEGORY_TYPE, - self::SEVERITY_NORMAL, // Not a runtime Error for an instance property - "Saw a dynamic usage of an instance property with a name of type {TYPE} but expected the name to be a string", - self::REMEDIATION_B, - 10102 - ), - new Issue( - self::TypeInvalidStaticPropertyName, - self::CATEGORY_TYPE, - self::SEVERITY_CRITICAL, // Likely to be an Error for a static property - "Saw a dynamic usage of a static property with a name of type {TYPE} but expected the name to be a string", - self::REMEDIATION_B, - 10103 - ), - new Issue( - self::TypeErrorInInternalCall, - self::CATEGORY_TYPE, - self::SEVERITY_LOW, - "Saw a call to an internal function {FUNCTION}() with what would be invalid arguments in strict mode, when trying to infer the return value literal type: {DETAILS}", - self::REMEDIATION_B, - 10104 - ), - // Issue::CATEGORY_VARIABLE - new Issue( - self::VariableUseClause, - self::CATEGORY_VARIABLE, - self::SEVERITY_NORMAL, - "Non-variables not allowed within use clause", - self::REMEDIATION_B, - 12000 - ), - - // Issue::CATEGORY_STATIC - new Issue( - self::StaticCallToNonStatic, - self::CATEGORY_STATIC, - self::SEVERITY_NORMAL, - "Static call to non-static method {METHOD} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 9000 - ), - new Issue( - self::StaticPropIsStaticType, - self::CATEGORY_STATIC, - self::SEVERITY_LOW, - "Static property {PROPERTY} is declared to have type {TYPE}, but the only instance is shared among all subclasses (Did you mean {TYPE})", - self::REMEDIATION_A, - 9001 - ), - - // Issue::CATEGORY_CONTEXT - new Issue( - self::ContextNotObject, - self::CATEGORY_CONTEXT, - self::SEVERITY_CRITICAL, - "Cannot access {CLASS} when not in object context", - self::REMEDIATION_B, - 4000 - ), - new Issue( - self::ContextNotObjectInCallable, - self::CATEGORY_CONTEXT, - self::SEVERITY_NORMAL, - "Cannot access {CLASS} when not in object context, but code is using callable {METHOD}", - self::REMEDIATION_B, - 4001 - ), - new Issue( - self::ContextNotObjectUsingSelf, - self::CATEGORY_CONTEXT, - self::SEVERITY_NORMAL, - 'Cannot use {CLASS} as type when not in object context in {FUNCTION}', - self::REMEDIATION_B, - 4002 - ), - - // Issue::CATEGORY_DEPRECATED - new Issue( - self::DeprecatedFunction, - self::CATEGORY_DEPRECATED, - self::SEVERITY_NORMAL, - "Call to deprecated function {FUNCTIONLIKE} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 5000 - ), - new Issue( - self::DeprecatedFunctionInternal, - self::CATEGORY_DEPRECATED, - self::SEVERITY_NORMAL, - "Call to deprecated function {FUNCTIONLIKE}", - self::REMEDIATION_B, - 5005 - ), - new Issue( - self::DeprecatedClass, - self::CATEGORY_DEPRECATED, - self::SEVERITY_NORMAL, - "Call to deprecated class {CLASS} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 5001 - ), - new Issue( - self::DeprecatedProperty, - self::CATEGORY_DEPRECATED, - self::SEVERITY_NORMAL, - "Reference to deprecated property {PROPERTY} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 5002 - ), - new Issue( - self::DeprecatedClassConstant, - self::CATEGORY_DEPRECATED, - self::SEVERITY_NORMAL, - "Reference to deprecated property {PROPERTY} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 5007 - ), - new Issue( - self::DeprecatedInterface, - self::CATEGORY_DEPRECATED, - self::SEVERITY_NORMAL, - "Using a deprecated interface {INTERFACE} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 5003 - ), - new Issue( - self::DeprecatedTrait, - self::CATEGORY_DEPRECATED, - self::SEVERITY_NORMAL, - "Using a deprecated trait {TRAIT} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 5004 - ), - new Issue( - self::DeprecatedCaseInsensitiveDefine, - self::CATEGORY_DEPRECATED, - self::SEVERITY_NORMAL, - "Creating case-insensitive constants with define() has been deprecated in PHP 7.3", - self::REMEDIATION_B, - 5006 - ), - - // Issue::CATEGORY_PARAMETER - new Issue( - self::ParamReqAfterOpt, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Required argument follows optional", - self::REMEDIATION_B, - 7000 - ), - new Issue( - self::ParamTooMany, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Call with {COUNT} arg(s) to {FUNCTIONLIKE} which only takes {COUNT} arg(s) defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 7001 - ), - new Issue( - self::ParamTooManyInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Call with {COUNT} arg(s) to {FUNCTIONLIKE} which only takes {COUNT} arg(s)", - self::REMEDIATION_B, - 7002 - ), - new Issue( - self::ParamTooManyCallable, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Call with {COUNT} arg(s) to {FUNCTIONLIKE} (As a provided callable) which only takes {COUNT} arg(s) defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 7043 - ), - new Issue( - self::ParamTooFew, - self::CATEGORY_PARAMETER, - self::SEVERITY_CRITICAL, - "Call with {COUNT} arg(s) to {FUNCTIONLIKE} which requires {COUNT} arg(s) defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 7003 - ), - new Issue( - self::ParamTooFewInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_CRITICAL, - "Call with {COUNT} arg(s) to {FUNCTIONLIKE} which requires {COUNT} arg(s)", - self::REMEDIATION_B, - 7004 - ), - new Issue( - self::ParamTooFewCallable, - self::CATEGORY_PARAMETER, - self::SEVERITY_CRITICAL, - "Call with {COUNT} arg(s) to {FUNCTIONLIKE} (as a provided callable) which requires {COUNT} arg(s) defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 7044 - ), - new Issue( - self::ParamSpecial1, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Argument {INDEX} ({PARAMETER}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE} when argument {INDEX} is {TYPE}", - self::REMEDIATION_B, - 7005 - ), - new Issue( - self::ParamSpecial2, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Argument {INDEX} ({PARAMETER}) is {TYPE} but {FUNCTIONLIKE} takes {TYPE} when passed only one argument", - self::REMEDIATION_B, - 7006 - ), - new Issue( - self::ParamSpecial3, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "The last argument to {FUNCTIONLIKE} must be of type {TYPE}", - self::REMEDIATION_B, - 7007 - ), - new Issue( - self::ParamSpecial4, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "The second to last argument to {FUNCTIONLIKE} must be of type {TYPE}", - self::REMEDIATION_B, - 7008 - ), - new Issue( - self::ParamTypeMismatch, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Argument {INDEX} is {TYPE} but {FUNCTIONLIKE} takes {TYPE}", - self::REMEDIATION_B, - 7009 - ), - new Issue( - self::ParamSignatureMismatch, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with {METHOD} defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7010 - ), - new Issue( - self::ParamSignatureMismatchInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with internal {METHOD}", - self::REMEDIATION_B, - 7011 - ), - new Issue( - self::ParamRedefined, - self::CATEGORY_PARAMETER, - self::SEVERITY_CRITICAL, - "Redefinition of parameter {PARAMETER}", - self::REMEDIATION_B, - 7012 - ), - // TODO: Optionally, change the other message to say that it's based off of phpdoc and LSP in a future PR. - // NOTE: Incompatibilities in the param list are SEVERITY_NORMAL, because the php interpreter emits a notice. - // Incompatibilities in the return types are SEVERITY_CRITICAL, because the php interpreter will throw an Error. - new Issue( - self::ParamSignatureRealMismatchReturnType, - self::CATEGORY_PARAMETER, - self::SEVERITY_CRITICAL, - "Declaration of {METHOD} should be compatible with {METHOD} (method returning '{TYPE}' cannot override method returning '{TYPE}') defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7013 - ), - new Issue( - self::ParamSignatureRealMismatchReturnTypeInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_CRITICAL, - "Declaration of {METHOD} should be compatible with internal {METHOD} (method returning '{TYPE}' cannot override method returning '{TYPE}')", - self::REMEDIATION_B, - 7014 - ), - // NOTE: Incompatibilities in param types does not cause the php interpreter to throw an error. - // It emits a warning instead, so these are SEVERITY_NORMAL. - new Issue( - self::ParamSignaturePHPDocMismatchReturnType, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Declaration of real/@method {METHOD} should be compatible with real/@method {METHOD} (method returning '{TYPE}' cannot override method returning '{TYPE}') defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7033 - ), - new Issue( - self::ParamSignatureRealMismatchParamType, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with {METHOD} (parameter #{INDEX} of type '{TYPE}' cannot replace original parameter of type '{TYPE}') defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7015 - ), - new Issue( - self::ParamSignatureRealMismatchParamTypeInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with internal {METHOD} (parameter #{INDEX} of type '{TYPE}' cannot replace original parameter of type '{TYPE}')", - self::REMEDIATION_B, - 7016 - ), - new Issue( - self::ParamSignaturePHPDocMismatchParamType, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Declaration of real/@method {METHOD} should be compatible with real/@method {METHOD} (parameter #{INDEX} of type '{TYPE}' cannot replace original parameter of type '{TYPE}') defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7034 - ), - new Issue( - self::ParamSignatureRealMismatchHasParamType, - self::CATEGORY_PARAMETER, - self::SEVERITY_CRITICAL, - "Declaration of {METHOD} should be compatible with {METHOD} (parameter #{INDEX} has type '{TYPE}' which cannot replace original parameter with no type) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7017 - ), - new Issue( - self::ParamSignatureRealMismatchHasParamTypeInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with internal {METHOD} (parameter #{INDEX} has type '{TYPE}' which cannot replace original parameter with no type)", - self::REMEDIATION_B, - 7018 - ), - new Issue( - self::ParamSignaturePHPDocMismatchHasParamType, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Declaration of real/@method {METHOD} should be compatible with real/@method {METHOD} (parameter #{INDEX} has type '{TYPE}' which cannot replace original parameter with no type) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7035 - ), - new Issue( - self::ParamSignatureRealMismatchHasNoParamType, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, // NOTE: See allow_method_param_type_widening - "Declaration of {METHOD} should be compatible with {METHOD} (parameter #{INDEX} with no type cannot replace original parameter with type '{TYPE}') defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7019 - ), - new Issue( - self::ParamSignatureRealMismatchHasNoParamTypeInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with internal {METHOD} (parameter #{INDEX} with no type cannot replace original parameter with type '{TYPE}')", - self::REMEDIATION_B, - 7020 - ), - new Issue( - self::ParamSignaturePHPDocMismatchHasNoParamType, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Declaration of real/@method {METHOD} should be compatible with real/@method {METHOD} (parameter #{INDEX} with no type cannot replace original parameter with type '{TYPE}') defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7036 - ), - new Issue( - self::ParamSignatureRealMismatchParamVariadic, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with {METHOD} (parameter #{INDEX} is a variadic parameter replacing a non-variadic parameter) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7021 - ), - new Issue( - self::ParamSignatureRealMismatchParamVariadicInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with internal {METHOD} (parameter #{INDEX} is a variadic parameter replacing a non-variadic parameter)", - self::REMEDIATION_B, - 7022 - ), - new Issue( - self::ParamSignaturePHPDocMismatchParamVariadic, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Declaration of real/@method {METHOD} should be compatible with real/@method {METHOD} (parameter #{INDEX} is a variadic parameter replacing a non-variadic parameter) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7037 - ), - new Issue( - self::ParamSignatureRealMismatchParamNotVariadic, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with {METHOD} (parameter #{INDEX} is a non-variadic parameter replacing a variadic parameter) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7023 - ), - new Issue( - self::ParamSignatureRealMismatchParamNotVariadicInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with internal {METHOD} (parameter #{INDEX} is a non-variadic parameter replacing a variadic parameter)", - self::REMEDIATION_B, - 7024 - ), - new Issue( - self::ParamSignaturePHPDocMismatchParamNotVariadic, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Declaration of real/@method {METHOD} should be compatible with real/@method {METHOD} (parameter #{INDEX} is a non-variadic parameter replacing a variadic parameter) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7038 - ), - new Issue( - self::ParamSignatureRealMismatchParamIsReference, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with {METHOD} (parameter #{INDEX} is a reference parameter overriding a non-reference parameter) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7025 - ), - new Issue( - self::ParamSignatureRealMismatchParamIsReferenceInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with internal {METHOD} (parameter #{INDEX} is a reference parameter overriding a non-reference parameter)", - self::REMEDIATION_B, - 7026 - ), - new Issue( - self::ParamSignaturePHPDocMismatchParamIsReference, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Declaration of real/@method {METHOD} should be compatible with real/@method {METHOD} (parameter #{INDEX} is a reference parameter overriding a non-reference parameter) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7039 - ), - new Issue( - self::ParamSignatureRealMismatchParamIsNotReference, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with {METHOD} (parameter #{INDEX} is a non-reference parameter overriding a reference parameter) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7027 - ), - new Issue( - self::ParamSignatureRealMismatchParamIsNotReferenceInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with internal {METHOD} (parameter #{INDEX} is a non-reference parameter overriding a reference parameter)", - self::REMEDIATION_B, - 7028 - ), - new Issue( - self::ParamSignaturePHPDocMismatchParamIsNotReference, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Declaration of real/@method {METHOD} should be compatible with real/@method {METHOD} (parameter #{INDEX} is a non-reference parameter overriding a reference parameter) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7040 - ), - new Issue( - self::ParamSignatureRealMismatchTooFewParameters, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with {METHOD} (the method override accepts {COUNT} parameter(s), but the overridden method can accept {COUNT}) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7029 - ), - new Issue( - self::ParamSignatureRealMismatchTooFewParametersInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with internal {METHOD} (the method override accepts {COUNT} parameter(s), but the overridden method can accept {COUNT})", - self::REMEDIATION_B, - 7030 - ), - new Issue( - self::ParamSignaturePHPDocMismatchTooFewParameters, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Declaration of real/@method {METHOD} should be compatible with real/@method {METHOD} (the method override accepts {COUNT} parameter(s), but the overridden method can accept {COUNT}) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7041 - ), - new Issue( - self::ParamSignatureRealMismatchTooManyRequiredParameters, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with {METHOD} (the method override requires {COUNT} parameter(s), but the overridden method requires only {COUNT}) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7031 - ), - new Issue( - self::ParamSignatureRealMismatchTooManyRequiredParametersInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} should be compatible with internal {METHOD} (the method override requires {COUNT} parameter(s), but the overridden method requires only {COUNT})", - self::REMEDIATION_B, - 7032 - ), - new Issue( - self::ParamSignaturePHPDocMismatchTooManyRequiredParameters, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Declaration of real/@method {METHOD} should be compatible with real/@method {METHOD} (the method override requires {COUNT} parameter(s), but the overridden method requires only {COUNT}) defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 7042 - ), - new Issue( - self::ParamSuspiciousOrder, - self::CATEGORY_PARAMETER, - self::SEVERITY_NORMAL, - "Argument #{INDEX} of this call to {FUNCTIONLIKE} is typically a literal or constant but isn't, but argument #{INDEX} (which is typically a variable) is a literal or constant. The arguments may be in the wrong order.", - self::REMEDIATION_B, - 7045 - ), - new Issue( - self::ParamTooManyUnpack, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Call with {COUNT} or more args to {FUNCTIONLIKE} which only takes {COUNT} arg(s) defined at {FILE}:{LINE} (argument unpacking was used)", - self::REMEDIATION_B, - 7046 - ), - new Issue( - self::ParamTooManyUnpackInternal, - self::CATEGORY_PARAMETER, - self::SEVERITY_LOW, - "Call with {COUNT} or more args to {FUNCTIONLIKE} which only takes {COUNT} arg(s) (argument unpacking was used)", - self::REMEDIATION_B, - 7047 - ), - new Issue( - self::ParamMustBeUserDefinedClassname, - self::CATEGORY_PARAMETER, - self::SEVERITY_CRITICAL, - "First argument of class_alias() must be a name of user defined class ('{CLASS}' attempted)", - self::REMEDIATION_B, - 7048 - ), - - // Issue::CATEGORY_NOOP - new Issue( - self::NoopProperty, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused property", - self::REMEDIATION_B, - 6000 - ), - new Issue( - self::NoopArray, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused array", - self::REMEDIATION_B, - 6001 - ), - new Issue( - self::NoopConstant, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused constant", - self::REMEDIATION_B, - 6002 - ), - new Issue( - self::NoopClosure, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused closure", - self::REMEDIATION_B, - 6003 - ), - new Issue( - self::NoopVariable, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused variable", - self::REMEDIATION_B, - 6004 - ), - new Issue( - self::NoopUnaryOperator, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused result of a unary '{OPERATOR}' operator", - self::REMEDIATION_B, - 6020 - ), - new Issue( - self::NoopBinaryOperator, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused result of a binary '{OPERATOR}' operator", - self::REMEDIATION_B, - 6021 - ), - new Issue( - self::NoopStringLiteral, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused result of a string literal {STRING_LITERAL} near this line", - self::REMEDIATION_B, - 6029 - ), - new Issue( - self::NoopEmpty, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused result of an empty(expr) check", - self::REMEDIATION_B, - 6051 - ), - new Issue( - self::NoopIsset, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused result of an isset(expr) check", - self::REMEDIATION_B, - 6052 - ), - new Issue( - self::NoopCast, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused result of a ({TYPE})(expr) cast", - self::REMEDIATION_B, - 6053 - ), - new Issue( - self::NoopEncapsulatedStringLiteral, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused result of an encapsulated string literal", - self::REMEDIATION_B, - 6030 - ), - new Issue( - self::NoopNumericLiteral, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused result of a numeric literal {STRING_LITERAL} near this line", - self::REMEDIATION_B, - 6031 - ), - new Issue( - self::UnreferencedClass, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to class {CLASS}", - self::REMEDIATION_B, - 6005 - ), - new Issue( - self::UnreferencedConstant, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to global constant {CONST}", - self::REMEDIATION_B, - 6008 - ), - new Issue( - self::UnreferencedFunction, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to function {FUNCTION}", - self::REMEDIATION_B, - 6009 - ), - new Issue( - self::UnreferencedClosure, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to {FUNCTION}", - self::REMEDIATION_B, - 6010 - ), - new Issue( - self::UnreferencedPublicMethod, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to public method {METHOD}", - self::REMEDIATION_B, - 6011 - ), - new Issue( - self::UnreferencedProtectedMethod, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to protected method {METHOD}", - self::REMEDIATION_B, - 6012 - ), - new Issue( - self::UnreferencedPrivateMethod, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to private method {METHOD}", - self::REMEDIATION_B, - 6013 - ), - new Issue( - self::UnreferencedPublicProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to public property {PROPERTY}", - self::REMEDIATION_B, - 6014 - ), - new Issue( - self::UnreferencedPHPDocProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to PHPDoc @property {PROPERTY}", - self::REMEDIATION_B, - 6056 - ), - new Issue( - self::UnreferencedProtectedProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to protected property {PROPERTY}", - self::REMEDIATION_B, - 6015 - ), - new Issue( - self::UnreferencedPrivateProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to private property {PROPERTY}", - self::REMEDIATION_B, - 6016 - ), - new Issue( - self::ReadOnlyPublicProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero write references to public property {PROPERTY}", - self::REMEDIATION_B, - 6032 - ), - new Issue( - self::ReadOnlyProtectedProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero write references to protected property {PROPERTY}", - self::REMEDIATION_B, - 6033 - ), - new Issue( - self::ReadOnlyPrivateProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero write references to private property {PROPERTY}", - self::REMEDIATION_B, - 6034 - ), - new Issue( - self::ReadOnlyPHPDocProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero write references to PHPDoc @property {PROPERTY}", - self::REMEDIATION_B, - 6058 - ), - new Issue( - self::WriteOnlyPublicProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero read references to public property {PROPERTY}", - self::REMEDIATION_B, - 6025 - ), - new Issue( - self::WriteOnlyProtectedProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero read references to protected property {PROPERTY}", - self::REMEDIATION_B, - 6026 - ), - new Issue( - self::WriteOnlyPrivateProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero read references to private property {PROPERTY}", - self::REMEDIATION_B, - 6027 - ), - new Issue( - self::WriteOnlyPHPDocProperty, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero read references to PHPDoc @property {PROPERTY}", - self::REMEDIATION_B, - 6057 - ), - new Issue( - self::UnreferencedPublicClassConstant, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to public class constant {CONST}", - self::REMEDIATION_B, - 6017 - ), - new Issue( - self::UnreferencedProtectedClassConstant, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to protected class constant {CONST}", - self::REMEDIATION_B, - 6018 - ), - new Issue( - self::UnreferencedPrivateClassConstant, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to private class constant {CONST}", - self::REMEDIATION_B, - 6019 - ), - new Issue( - self::UnreferencedUseNormal, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to use statement for classlike/namespace {CLASSLIKE} ({CLASSLIKE})", - self::REMEDIATION_B, - 6022 - ), - new Issue( - self::UnreferencedUseFunction, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to use statement for function {FUNCTION} ({FUNCTION})", - self::REMEDIATION_B, - 6023 - ), - new Issue( - self::UnreferencedUseConstant, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Possibly zero references to use statement for constant {CONST} ({CONST})", - self::REMEDIATION_B, - 6024 - ), - new Issue( - self::UnreachableCatch, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - "Catch statement for {CLASSLIKE} is unreachable. An earlier catch statement at line {LINE} caught the ancestor class/interface {CLASSLIKE}", - self::REMEDIATION_B, - 6028 - ), - new Issue( - self::UnusedVariable, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Unused definition of variable ${VARIABLE}', - self::REMEDIATION_B, - 6035 - ), - new Issue( - self::UnusedPublicMethodParameter, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Parameter ${PARAMETER} is never used', - self::REMEDIATION_B, - 6036 - ), - new Issue( - self::UnusedPublicFinalMethodParameter, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Parameter ${PARAMETER} is never used', - self::REMEDIATION_B, - 6037 - ), - new Issue( - self::UnusedPublicNoOverrideMethodParameter, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Parameter ${PARAMETER} is never used', - self::REMEDIATION_B, - 6060 - ), - new Issue( - self::UnusedProtectedMethodParameter, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Parameter ${PARAMETER} is never used', - self::REMEDIATION_B, - 6038 - ), - new Issue( - self::UnusedProtectedNoOverrideMethodParameter, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Parameter ${PARAMETER} is never used', - self::REMEDIATION_B, - 6059 - ), - new Issue( - self::UnusedProtectedFinalMethodParameter, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Parameter ${PARAMETER} is never used', - self::REMEDIATION_B, - 6039 - ), - new Issue( - self::UnusedPrivateMethodParameter, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Parameter ${PARAMETER} is never used', - self::REMEDIATION_B, - 6040 - ), - new Issue( - self::UnusedPrivateFinalMethodParameter, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Parameter ${PARAMETER} is never used', - self::REMEDIATION_B, - 6041 - ), - new Issue( - self::UnusedClosureUseVariable, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Closure use variable ${VARIABLE} is never used', - self::REMEDIATION_B, - 6042 - ), - new Issue( - self::UnusedClosureParameter, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Parameter ${PARAMETER} is never used', - self::REMEDIATION_B, - 6043 - ), - new Issue( - self::UnusedGlobalFunctionParameter, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Parameter ${PARAMETER} is never used', - self::REMEDIATION_B, - 6044 - ), - new Issue( - self::UnusedVariableValueOfForeachWithKey, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - 'Unused definition of variable ${VARIABLE} as the value of a foreach loop that included keys', - self::REMEDIATION_B, - 6045 - ), - new Issue( - self::UnusedVariableCaughtException, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - 'Unused definition of variable ${VARIABLE} as a caught exception', - self::REMEDIATION_B, - 6046 - ), - new Issue( - self::UnusedVariableReference, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Unused definition of variable ${VARIABLE} as a reference', - self::REMEDIATION_B, - 6069 - ), - new Issue( - self::UnusedVariableStatic, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Unreferenced definition of variable ${VARIABLE} as a static variable', - self::REMEDIATION_B, - 6070 - ), - new Issue( - self::UnusedVariableGlobal, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'Unreferenced definition of variable ${VARIABLE} as a global variable', - self::REMEDIATION_B, - 6071 - ), - new Issue( - self::UseNormalNamespacedNoEffect, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - 'The use statement for class/namespace {CLASS} in a namespace has no effect', - self::REMEDIATION_A, - 6047 - ), - new Issue( - self::UseNormalNoEffect, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'The use statement for class/namespace {CLASS} in the global namespace has no effect', - self::REMEDIATION_A, - 6048 - ), - new Issue( - self::UseFunctionNoEffect, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'The use statement for function {FUNCTION} has no effect', - self::REMEDIATION_A, - 6049 - ), - new Issue( - self::UseConstantNoEffect, - self::CATEGORY_NOOP, - self::SEVERITY_NORMAL, - 'The use statement for constant {CONST} has no effect', - self::REMEDIATION_A, - 6050 - ), - new Issue( - self::NoopArrayAccess, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused array offset fetch", - self::REMEDIATION_B, - 6054 - ), - new Issue( - self::UnusedGotoLabel, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - "Unused goto label {CODE}", - self::REMEDIATION_B, - 6055 - ), - new Issue( - self::VariableDefinitionCouldBeConstant, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - 'Uses of ${VARIABLE} could probably be replaced with a literal or constant', - self::REMEDIATION_B, - 6061 - ), - new Issue( - self::VariableDefinitionCouldBeConstantEmptyArray, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - 'Uses of ${VARIABLE} could probably be replaced with an empty array', - self::REMEDIATION_B, - 6062 - ), - new Issue( - self::VariableDefinitionCouldBeConstantString, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - 'Uses of ${VARIABLE} could probably be replaced with a literal or constant string', - self::REMEDIATION_B, - 6063 - ), - new Issue( - self::VariableDefinitionCouldBeConstantFloat, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - 'Uses of ${VARIABLE} could probably be replaced with a literal or constant float', - self::REMEDIATION_B, - 6064 - ), - new Issue( - self::VariableDefinitionCouldBeConstantInt, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - 'Uses of ${VARIABLE} could probably be replaced with literal integer or a named constant', - self::REMEDIATION_B, - 6065 - ), - new Issue( - self::VariableDefinitionCouldBeConstantTrue, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - 'Uses of ${VARIABLE} could probably be replaced with true or a named constant', - self::REMEDIATION_B, - 6066 - ), - new Issue( - self::VariableDefinitionCouldBeConstantFalse, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - 'Uses of ${VARIABLE} could probably be replaced with false or a named constant', - self::REMEDIATION_B, - 6067 - ), - new Issue( - self::VariableDefinitionCouldBeConstantNull, - self::CATEGORY_NOOP, - self::SEVERITY_LOW, - 'Uses of ${VARIABLE} could probably be replaced with null or a named constant', - self::REMEDIATION_B, - 6068 - ), - - // Issue::CATEGORY_REDEFINE - new Issue( - self::RedefineClass, - self::CATEGORY_REDEFINE, - self::SEVERITY_NORMAL, - "{CLASS} defined at {FILE}:{LINE} was previously defined as {CLASS} at {FILE}:{LINE}", - self::REMEDIATION_B, - 8000 - ), - new Issue( - self::RedefineClassInternal, - self::CATEGORY_REDEFINE, - self::SEVERITY_NORMAL, - "{CLASS} defined at {FILE}:{LINE} was previously defined as {CLASS} internally", - self::REMEDIATION_B, - 8001 - ), - // TODO: Split into RedefineMethod, which would be fatal - new Issue( - self::RedefineFunction, - self::CATEGORY_REDEFINE, - self::SEVERITY_NORMAL, - "Function {FUNCTION} defined at {FILE}:{LINE} was previously defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 8002 - ), - new Issue( - self::RedefineFunctionInternal, - self::CATEGORY_REDEFINE, - self::SEVERITY_NORMAL, - "Function {FUNCTION} defined at {FILE}:{LINE} was previously defined internally", - self::REMEDIATION_B, - 8003 - ), - new Issue( - self::IncompatibleCompositionProp, - self::CATEGORY_REDEFINE, - self::SEVERITY_NORMAL, - "{TRAIT} and {TRAIT} define the same property ({PROPERTY}) in the composition of {CLASS}. However, the definition differs and is considered incompatible. Class was composed in {FILE} on line {LINE}", - self::REMEDIATION_B, - 8004 - ), - new Issue( - self::IncompatibleCompositionMethod, - self::CATEGORY_REDEFINE, - self::SEVERITY_NORMAL, - "Declaration of {METHOD} must be compatible with {METHOD} in {FILE} on line {LINE}", - self::REMEDIATION_B, - 8005 - ), - new Issue( - self::RedefineClassAlias, - self::CATEGORY_REDEFINE, - self::SEVERITY_NORMAL, - "{CLASS} aliased at {FILE}:{LINE} was previously defined as {CLASS} at {FILE}:{LINE}", - self::REMEDIATION_B, - 8006 - ), - new Issue( - self::RedefinedUsedTrait, - self::CATEGORY_REDEFINE, - self::SEVERITY_NORMAL, - "{CLASS} uses {TRAIT} declared at {FILE}:{LINE} which is also declared at {FILE}:{LINE}. This may lead to confusing errors.", - self::REMEDIATION_B, - 8007 - ), - new Issue( - self::RedefinedInheritedInterface, - self::CATEGORY_REDEFINE, - self::SEVERITY_NORMAL, - "{CLASS} inherits {INTERFACE} declared at {FILE}:{LINE} which is also declared at {FILE}:{LINE}. This may lead to confusing errors.", - self::REMEDIATION_B, - 8008 - ), - new Issue( - self::RedefinedExtendedClass, - self::CATEGORY_REDEFINE, - self::SEVERITY_NORMAL, - "{CLASS} extends {CLASS} declared at {FILE}:{LINE} which is also declared at {FILE}:{LINE}. This may lead to confusing errors.", - self::REMEDIATION_B, - 8009 - ), - new Issue( - self::RedefineClassConstant, - self::CATEGORY_REDEFINE, - self::SEVERITY_CRITICAL, - "Class constant {CONST} defined at {FILE}:{LINE} was previously defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 8010 - ), - new Issue( - self::RedefineProperty, - self::CATEGORY_REDEFINE, - self::SEVERITY_CRITICAL, - 'Property ${PROPERTY} defined at {FILE}:{LINE} was previously defined at {FILE}:{LINE}', - self::REMEDIATION_B, - 8011 - ), - - // Issue::CATEGORY_ACCESS - new Issue( - self::AccessPropertyProtected, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot access protected property {PROPERTY} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 1000 - ), - new Issue( - self::AccessPropertyPrivate, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot access private property {PROPERTY} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 1001 - ), - new Issue( - self::AccessReadOnlyProperty, - self::CATEGORY_ACCESS, - self::SEVERITY_LOW, - "Cannot modify read-only property {PROPERTY} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 1028 - ), - new Issue( - self::AccessWriteOnlyProperty, - self::CATEGORY_ACCESS, - self::SEVERITY_LOW, - "Cannot read write-only property {PROPERTY} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 1029 - ), - new Issue( - self::AccessReadOnlyMagicProperty, - self::CATEGORY_ACCESS, - self::SEVERITY_NORMAL, - "Cannot modify read-only magic property {PROPERTY} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 1030 - ), - new Issue( - self::AccessWriteOnlyMagicProperty, - self::CATEGORY_ACCESS, - self::SEVERITY_NORMAL, - "Cannot read write-only magic property {PROPERTY} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 1031 - ), - new Issue( - self::AccessMethodProtected, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot access protected method {METHOD} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 1002 - ), - new Issue( - self::AccessMethodPrivate, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot access private method {METHOD} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 1003 - ), - new Issue( - self::AccessSignatureMismatch, - self::CATEGORY_ACCESS, - self::SEVERITY_NORMAL, - "Access level to {METHOD} must be compatible with {METHOD} defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 1004 - ), - new Issue( - self::AccessSignatureMismatchInternal, - self::CATEGORY_ACCESS, - self::SEVERITY_NORMAL, - "Access level to {METHOD} must be compatible with internal {METHOD}", - self::REMEDIATION_B, - 1005 - ), - new Issue( - self::PropertyAccessSignatureMismatch, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Access level to {PROPERTY} must be compatible with {PROPERTY} defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 1022 - ), - new Issue( - self::PropertyAccessSignatureMismatchInternal, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Access level to {PROPERTY} must be compatible with internal {PROPERTY}", - self::REMEDIATION_B, - 1023 - ), - new Issue( - self::ConstantAccessSignatureMismatch, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Access level to {CONST} must be compatible with {CONST} defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 1024 - ), - new Issue( - self::ConstantAccessSignatureMismatchInternal, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Access level to {CONST} must be compatible with internal {CONST}", - self::REMEDIATION_B, - 1025 - ), - new Issue( - self::AccessStaticToNonStaticProperty, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot make static property {PROPERTY} into the non static property {PROPERTY}", - self::REMEDIATION_B, - 1026 - ), - new Issue( - self::AccessNonStaticToStaticProperty, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot make non static property {PROPERTY} into the static property {PROPERTY}", - self::REMEDIATION_B, - 1027 - ), - new Issue( - self::AccessStaticToNonStatic, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot make static method {METHOD}() non static", - self::REMEDIATION_B, - 1006 - ), - new Issue( - self::AccessNonStaticToStatic, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot make non static method {METHOD}() static", - self::REMEDIATION_B, - 1007 - ), - new Issue( - self::AccessClassConstantPrivate, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot access private class constant {CONST} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 1008 - ), - new Issue( - self::AccessClassConstantProtected, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot access protected class constant {CONST} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 1009 - ), - new Issue( - self::AccessPropertyStaticAsNonStatic, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Accessing static property {PROPERTY} as non static", - self::REMEDIATION_B, - 1010 - ), - new Issue( - self::AccessOwnConstructor, - self::CATEGORY_ACCESS, - self::SEVERITY_NORMAL, - "Accessing own constructor directly via {CLASS}::__construct", - self::REMEDIATION_B, - 1020 - ), - new Issue( - self::AccessMethodProtectedWithCallMagicMethod, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot access protected method {METHOD} defined at {FILE}:{LINE} (if this call should be handled by __call, consider adding a @method tag to the class)", - self::REMEDIATION_B, - 1011 - ), - new Issue( - self::AccessMethodPrivateWithCallMagicMethod, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Cannot access private method {METHOD} defined at {FILE}:{LINE} (if this call should be handled by __call, consider adding a @method tag to the class)", - self::REMEDIATION_B, - 1012 - ), - new Issue( - self::AccessWrongInheritanceCategory, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Attempting to inherit {CLASSLIKE} defined at {FILE}:{LINE} as if it were a {CLASSLIKE}", - self::REMEDIATION_B, - 1013 - ), - new Issue( - self::AccessWrongInheritanceCategoryInternal, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Attempting to inherit internal {CLASSLIKE} as if it were a {CLASSLIKE}", - self::REMEDIATION_B, - 1014 - ), - new Issue( - self::AccessExtendsFinalClass, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Attempting to extend from final class {CLASS} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 1015 - ), - new Issue( - self::AccessExtendsFinalClassInternal, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Attempting to extend from final internal class {CLASS}", - self::REMEDIATION_B, - 1016 - ), - new Issue( - self::AccessOverridesFinalMethod, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Declaration of method {METHOD} overrides final method {METHOD} defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 1017 - ), - new Issue( - self::AccessOverridesFinalMethodInternal, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Declaration of method {METHOD} overrides final internal method {METHOD}", - self::REMEDIATION_B, - 1018 - ), - new Issue( - self::AccessOverridesFinalMethodPHPDoc, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Declaration of phpdoc method {METHOD} is an unnecessary override of final method {METHOD} defined in {FILE}:{LINE}", - self::REMEDIATION_B, - 1019 - ), - new Issue( - self::AccessPropertyNonStaticAsStatic, - self::CATEGORY_ACCESS, - self::SEVERITY_CRITICAL, - "Accessing non static property {PROPERTY} as static", - self::REMEDIATION_B, - 1021 - ), - - // Issue::CATEGORY_COMPATIBLE - new Issue( - self::CompatiblePHP7, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_NORMAL, - "Expression may not be PHP 7 compatible", - self::REMEDIATION_B, - 3000 - ), - new Issue( - self::CompatibleExpressionPHP7, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_NORMAL, - "{CLASS} expression may not be PHP 7 compatible", - self::REMEDIATION_B, - 3001 - ), - new Issue( - self::CompatibleNullableTypePHP70, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_CRITICAL, - "Nullable type '{TYPE}' is not compatible with PHP 7.0", - self::REMEDIATION_B, - 3002 - ), - new Issue( - self::CompatibleShortArrayAssignPHP70, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_CRITICAL, - "Square bracket syntax for an array destructuring assignment is not compatible with PHP 7.0", - self::REMEDIATION_A, - 3003 - ), - new Issue( - self::CompatibleKeyedArrayAssignPHP70, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_CRITICAL, - "Using array keys in an array destructuring assignment is not compatible with PHP 7.0", - self::REMEDIATION_B, - 3004 - ), - new Issue( - self::CompatibleVoidTypePHP70, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_CRITICAL, - "Return type '{TYPE}' means the absence of a return value starting in PHP 7.1. In PHP 7.0, void refers to a class/interface with the name 'void'", - self::REMEDIATION_B, - 3005 - ), - new Issue( - self::CompatibleIterableTypePHP70, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_CRITICAL, - "Return type '{TYPE}' means a Traversable/array value starting in PHP 7.1. In PHP 7.0, iterable refers to a class/interface with the name 'iterable'", - self::REMEDIATION_B, - 3006 - ), - new Issue( - self::CompatibleObjectTypePHP71, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_CRITICAL, - "Type '{TYPE}' refers to any object starting in PHP 7.2. In PHP 7.1 and earlier, it refers to a class/interface with the name 'object'", - self::REMEDIATION_B, - 3007 - ), - new Issue( - self::CompatibleUseVoidPHP70, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_CRITICAL, - "Using '{TYPE}' as void will be a syntax error in PHP 7.1 (void becomes the absence of a return type).", - self::REMEDIATION_B, - 3008 - ), - new Issue( - self::CompatibleUseIterablePHP71, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_CRITICAL, - "Using '{TYPE}' as iterable will be a syntax error in PHP 7.2 (iterable becomes a native type with subtypes Array and Iterator).", - self::REMEDIATION_B, - 3009 - ), - new Issue( - self::CompatibleUseObjectPHP71, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_CRITICAL, - "Using '{TYPE}' as object will be a syntax error in PHP 7.2 (object becomes a native type that accepts any class instance).", - self::REMEDIATION_B, - 3010 - ), - new Issue( - self::CompatibleMultiExceptionCatchPHP70, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_CRITICAL, - "Catching multiple exceptions is not supported before PHP 7.1", - self::REMEDIATION_B, - 3011 - ), - new Issue( - self::CompatibleNegativeStringOffset, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_NORMAL, - "Using negative string offsets is not supported before PHP 7.1 (emits an 'Uninitialized string offset' notice)", - self::REMEDIATION_B, - 3012 - ), - // TODO: Increase the severity when PHP 8.0 alphas are released - new Issue( - self::CompatibleAutoload, - self::CATEGORY_COMPATIBLE, - self::SEVERITY_NORMAL, - "Declaring an autoloader with function __autoload() was deprecated in PHP 7.2 and will become a fatal error in PHP 8.0. Use spl_autoload_register() instead (supported since PHP 5.1).", - self::REMEDIATION_B, - 3013 - ), - - // Issue::CATEGORY_GENERIC - new Issue( - self::TemplateTypeConstant, - self::CATEGORY_GENERIC, - self::SEVERITY_NORMAL, - "constant {CONST} may not have a template type", - self::REMEDIATION_B, - 14000 - ), - new Issue( - self::TemplateTypeStaticMethod, - self::CATEGORY_GENERIC, - self::SEVERITY_NORMAL, - "static method {METHOD} does not declare template type in its own comment and may not use the template type of class instances", - self::REMEDIATION_B, - 14001 - ), - new Issue( - self::TemplateTypeStaticProperty, - self::CATEGORY_GENERIC, - self::SEVERITY_NORMAL, - "static property {PROPERTY} may not have a template type", - self::REMEDIATION_B, - 14002 - ), - new Issue( - self::GenericGlobalVariable, - self::CATEGORY_GENERIC, - self::SEVERITY_NORMAL, - "Global variable {VARIABLE} may not be assigned an instance of a generic class", - self::REMEDIATION_B, - 14003 - ), - new Issue( - self::GenericConstructorTypes, - self::CATEGORY_GENERIC, - self::SEVERITY_NORMAL, - "Missing template parameter for type {TYPE} on constructor for generic class {CLASS}", - self::REMEDIATION_B, - 14004 - ), - // TODO: Reword this if template types can be used for phan-assert or for compatibility with other arguments - new Issue( - self::TemplateTypeNotUsedInFunctionReturn, - self::CATEGORY_GENERIC, - self::SEVERITY_NORMAL, - "Template type {TYPE} not used in return value of function/method {FUNCTIONLIKE}", - self::REMEDIATION_B, - 14005 - ), - new Issue( - self::TemplateTypeNotDeclaredInFunctionParams, - self::CATEGORY_GENERIC, - self::SEVERITY_NORMAL, - "Template type {TYPE} not declared in parameters of function/method {FUNCTIONLIKE} (or Phan can't extract template types for this use case)", - self::REMEDIATION_B, - 14006 - ), - - // Issue::CATEGORY_INTERNAL - new Issue( - self::AccessConstantInternal, - self::CATEGORY_INTERNAL, - self::SEVERITY_NORMAL, - "Cannot access internal constant {CONST} of namespace {NAMESPACE} defined at {FILE}:{LINE} from namespace {NAMESPACE}", - self::REMEDIATION_B, - 15000 - ), - new Issue( - self::AccessClassInternal, - self::CATEGORY_INTERNAL, - self::SEVERITY_NORMAL, - "Cannot access internal {CLASS} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 15001 - ), - new Issue( - self::AccessClassConstantInternal, - self::CATEGORY_INTERNAL, - self::SEVERITY_NORMAL, - "Cannot access internal class constant {CONST} defined at {FILE}:{LINE}", - self::REMEDIATION_B, - 15002 - ), - new Issue( - self::AccessPropertyInternal, - self::CATEGORY_INTERNAL, - self::SEVERITY_NORMAL, - "Cannot access internal property {PROPERTY} of namespace {NAMESPACE} defined at {FILE}:{LINE} from namespace {NAMESPACE}", - self::REMEDIATION_B, - 15003 - ), - new Issue( - self::AccessMethodInternal, - self::CATEGORY_INTERNAL, - self::SEVERITY_NORMAL, - "Cannot access internal method {METHOD} of namespace {NAMESPACE} defined at {FILE}:{LINE} from namespace {NAMESPACE}", - self::REMEDIATION_B, - 15004 - ), - - // Issue::CATEGORY_COMMENT - new Issue( - self::InvalidCommentForDeclarationType, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "The phpdoc comment for {COMMENT} cannot occur on a {TYPE}", - self::REMEDIATION_B, - 16000 - ), - new Issue( - self::MisspelledAnnotation, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Saw misspelled annotation {COMMENT}. {SUGGESTION}", - self::REMEDIATION_B, - 16001 - ), - new Issue( - self::UnextractableAnnotation, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Saw unextractable annotation for comment '{COMMENT}'", - self::REMEDIATION_B, - 16002 - ), - new Issue( - self::UnextractableAnnotationPart, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Saw unextractable annotation for a fragment of comment '{COMMENT}': '{COMMENT}'", - self::REMEDIATION_B, - 16003 - ), - new Issue( - self::UnextractableAnnotationSuffix, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Saw a token Phan may have failed to parse after '{COMMENT}': after {TYPE}, saw '{COMMENT}'", - self::REMEDIATION_B, - 16009 - ), - new Issue( - self::UnextractableAnnotationElementName, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Saw possibly unextractable annotation for a fragment of comment '{COMMENT}': after {TYPE}, did not see an element name (will guess based on comment order)", - self::REMEDIATION_B, - 16010 - ), - new Issue( - self::CommentParamWithoutRealParam, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Saw an @param annotation for {VARIABLE}, but it was not found in the param list of {FUNCTIONLIKE}", - self::REMEDIATION_B, - 16004 - ), - new Issue( - self::CommentParamAssertionWithoutRealParam, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Saw an @phan-assert annotation for {VARIABLE}, but it was not found in the param list of {FUNCTIONLIKE}", - self::REMEDIATION_B, - 16019 - ), - new Issue( - self::CommentParamOnEmptyParamList, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Saw an @param annotation for {VARIABLE}, but the param list of {FUNCTIONLIKE} is empty", - self::REMEDIATION_B, - 16005 - ), - new Issue( - self::CommentOverrideOnNonOverrideMethod, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Saw an @override annotation for method {METHOD}, but could not find an overridden method and it is not a magic method", - self::REMEDIATION_B, - 16006 - ), - new Issue( - self::CommentOverrideOnNonOverrideConstant, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Saw an @override annotation for class constant {CONST}, but could not find an overridden constant", - self::REMEDIATION_B, - 16007 - ), - new Issue( - self::CommentParamOutOfOrder, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Expected @param annotation for {VARIABLE} to be before the @param annotation for {VARIABLE}", - self::REMEDIATION_A, - 16008 - ), - new Issue( - self::ThrowTypeAbsent, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "{FUNCTIONLIKE} can throw {TYPE} here, but has no '@throws' declarations for that class", - self::REMEDIATION_A, - 16011 - ), - new Issue( - self::ThrowTypeAbsentForCall, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "{FUNCTIONLIKE} can throw {TYPE} because it calls {FUNCTIONLIKE}, but has no '@throws' declarations for that class", - self::REMEDIATION_A, - 16012 - ), - new Issue( - self::ThrowTypeMismatch, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "{FUNCTIONLIKE} throws {TYPE}, but it only has declarations of '@throws {TYPE}'", - self::REMEDIATION_A, - 16013 - ), - new Issue( - self::ThrowTypeMismatchForCall, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "{FUNCTIONLIKE} throws {TYPE} because it calls {FUNCTIONLIKE}, but it only has declarations of '@throws {TYPE}'", - self::REMEDIATION_A, - 16014 - ), - new Issue( - self::CommentAmbiguousClosure, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - "Comment {STRING_LITERAL} refers to {TYPE} instead of \\Closure - Assuming \\Closure", - self::REMEDIATION_A, - 16015 - ), - new Issue( - self::CommentDuplicateParam, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - 'Comment declares @param ${PARAMETER} multiple times', - self::REMEDIATION_A, - 16016 - ), - new Issue( - self::CommentDuplicateMagicProperty, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - 'Comment declares @property* ${PROPERTY} multiple times', - self::REMEDIATION_A, - 16017 - ), - // TODO: Support declaring both instance and static methods of the same name - new Issue( - self::CommentDuplicateMagicMethod, - self::CATEGORY_COMMENT, - self::SEVERITY_LOW, - 'Comment declares @method {METHOD} multiple times', - self::REMEDIATION_A, - 16018 - ), - ]; - // phpcs:enable Generic.Files.LineLength - - self::sanityCheckErrorList($error_list); - // Verified the error meets preconditions, now add it. - foreach ($error_list as $error) { - $error_type = $error->getType(); - $error_map[$error_type] = $error; - } - - return $error_map; - } - - /** - * @param array<int,Issue> $issue_list the declared Issue types - */ - private static function getNextTypeId(array $issue_list, int $invalid_type_id) : int - { - for ($id = $invalid_type_id + 1; true; $id++) { - foreach ($issue_list as $error) { - if ($error->getTypeId() === $id) { - continue 2; - } - } - return $id; - } - } - - /** - * @param array<int,Issue> $error_list - * @return void - */ - private static function sanityCheckErrorList(array $error_list) - { - $error_map = []; - $unique_type_id_set = []; - foreach ($error_list as $error) { - $error_type = $error->getType(); - if (\array_key_exists($error_type, $error_map)) { - throw new AssertionError("Issue of type $error_type has multiple definitions"); - } - - if (\strncmp($error_type, 'Phan', 4) !== 0) { - throw new AssertionError("Issue of type $error_type should begin with 'Phan'"); - } - - $error_type_id = $error->getTypeId(); - if (\array_key_exists($error_type_id, $unique_type_id_set)) { - throw new AssertionError("Multiple issues exist with pylint error id $error_type_id - The next available id is " . - self::getNextTypeId($error_list, $error_type_id)); - } - $unique_type_id_set[$error_type_id] = $error; - $category = $error->getCategory(); - $expected_category_for_type_id_bitpos = (int)\floor($error_type_id / 1000); - $expected_category_for_type_id = 1 << $expected_category_for_type_id_bitpos; - if ($category !== $expected_category_for_type_id) { - throw new AssertionError(\sprintf( - "Expected error %s of type %d to be category %d(1<<%d), got 1<<%d\n", - $error_type, - $error_type_id, - $category, - (int)\round(\log($category, 2)), - $expected_category_for_type_id_bitpos - )); - } - $error_map[$error_type] = $error; - } - } - - - /** - * @return string - */ - public function getType() : string - { - return $this->type; - } - - /** - * @return int (Unique integer code corresponding to getType()) - */ - public function getTypeId() : int - { - return $this->type_id; - } - - /** - * @return int - */ - public function getCategory() : int - { - return $this->category; - } - - /** - * @return string - * The name of this issue's category - */ - public function getCategoryName() : string - { - return self::getNameForCategory($this->getCategory()); - } - - /** - * @return string - * The name of the category - */ - public static function getNameForCategory(int $category) : string - { - return self::CATEGORY_NAME[$category] ?? ''; - } - - /** - * @return int - */ - public function getSeverity() : int - { - return $this->severity; - } - - /** - * @return string - * A descriptive name of the severity of the issue - */ - public function getSeverityName() : string - { - switch ($this->getSeverity()) { - case self::SEVERITY_LOW: - return 'low'; - case self::SEVERITY_NORMAL: - return 'normal'; - case self::SEVERITY_CRITICAL: - return 'critical'; - default: - throw new \AssertionError('Unknown severity ' . $this->getSeverity()); - } - } - - /** - * @return int - * @suppress PhanUnreferencedPublicMethod (no reporters use this right now) - */ - public function getRemediationDifficulty() : int - { - return $this->remediation_difficulty; - } - - /** - * @return string - */ - public function getTemplate() : string - { - return $this->template; - } - - /** - * Returns the number of arguments expected for the format string $this->getTemplate() - */ - public function getExpectedArgumentCount() : int - { - return $this->argument_count ?? $this->argument_count = ConversionSpec::computeExpectedArgumentCount($this->template); - } - - /** - * @return string - template with the information needed to colorize this. - */ - public function getTemplateRaw() : string - { - return $this->template_raw; - } - - /** - * @param array<int,mixed> $template_parameters - * @return IssueInstance - */ - public function __invoke( - string $file, - int $line, - array $template_parameters = [], - Suggestion $suggestion = null - ) : IssueInstance { - // TODO: Add callable to expanded union types instead - return new IssueInstance( - $this, - $file, - $line, - $template_parameters, - $suggestion - ); - } - - /** - * @throws InvalidArgumentException - */ - public static function fromType(string $type) : Issue - { - $error_map = self::issueMap(); - - if (!isset($error_map[$type])) { - throw new InvalidArgumentException("Undefined error type $type"); - } - - return $error_map[$type]; - } - - /** - * @param string $type - * The type of the issue - * - * @param string $file - * The name of the file where the issue was found - * - * @param int $line - * The line number (start) where the issue was found - * - * @param string|int|float|bool|Type|UnionType|FQSEN|TypedElement|UnaddressableTypedElement ...$template_parameters - * Any template parameters required for the issue - * message - * - * @return void - * @suppress PhanUnreferencedPublicMethod - */ - public static function emit( - string $type, - string $file, - int $line, - ...$template_parameters - ) { - self::emitWithParameters( - $type, - $file, - $line, - $template_parameters - ); - } - - /** - * @param string $type - * The type of the issue - * - * @param string $file - * The name of the file where the issue was found - * - * @param int $line - * The line number (start) where the issue was found - * - * @param array<int,string|int|float|bool|Type|UnionType|FQSEN|TypedElement|UnaddressableTypedElement> $template_parameters - * Any template parameters required for the issue - * message - * - * @param ?Suggestion $suggestion (optional details on fixing this) - * - * @return void - */ - public static function emitWithParameters( - string $type, - string $file, - int $line, - array $template_parameters, - Suggestion $suggestion = null - ) { - $issue = self::fromType($type); - - self::emitInstance( - $issue($file, $line, $template_parameters, $suggestion) - ); - } - - /** - * @param IssueInstance $issue_instance - * An issue instance to emit - * - * @return void - */ - public static function emitInstance( - IssueInstance $issue_instance - ) { - Phan::getIssueCollector()->collectIssue($issue_instance); - } - - /** - * @param CodeBase $code_base - * The code base within which we're operating - * - * @param Context $context - * The context in which the instance was found - * - * @param IssueInstance $issue_instance - * An issue instance to emit - * - * @return void - */ - public static function maybeEmitInstance( - CodeBase $code_base, - Context $context, - IssueInstance $issue_instance - ) { - // If this issue type has been suppressed in - // the config, ignore it - - $issue = $issue_instance->getIssue(); - if (self::shouldSuppressIssue( - $code_base, - $context, - $issue->getType(), - $issue_instance->getLine(), - $issue_instance->getTemplateParameters(), - $issue_instance->getSuggestion() - )) { - return; - } - - self::emitInstance($issue_instance); - } - - /** - * @param CodeBase $code_base - * The code base within which we're operating - * - * @param Context $context - * The context in which the node we're going to be looking - * at exits. - * - * @param string $issue_type - * The type of issue to emit such as Issue::ParentlessClass - * - * @param int $lineno - * The line number where the issue was found - * - * @param string|int|float|bool|Type|UnionType|FQSEN|TypedElement|UnaddressableTypedElement ...$parameters - * Template parameters for the issue's error message. - * If these are objects, they should define __toString() - * - * @return void - */ - public static function maybeEmit( - CodeBase $code_base, - Context $context, - string $issue_type, - int $lineno, - ...$parameters - ) { - self::maybeEmitWithParameters( - $code_base, - $context, - $issue_type, - $lineno, - $parameters - ); - } - - /** - * @param CodeBase $code_base - * The code base within which we're operating - * - * @param Context $context - * The context in which the node we're going to be looking - * at exits. - * - * @param string $issue_type - * The type of issue to emit such as Issue::ParentlessClass - * - * @param int $lineno - * The line number where the issue was found - * - * @param array<int,string|int|float|bool|Type|UnionType|FQSEN|TypedElement|UnaddressableTypedElement> $parameters - * @param ?Suggestion $suggestion (optional) - * - * Template parameters for the issue's error message - * - * @return void - */ - public static function maybeEmitWithParameters( - CodeBase $code_base, - Context $context, - string $issue_type, - int $lineno, - array $parameters, - Suggestion $suggestion = null - ) { - if (self::shouldSuppressIssue( - $code_base, - $context, - $issue_type, - $lineno, - $parameters, - $suggestion - )) { - return; - } - - Issue::emitWithParameters( - $issue_type, - $context->getFile(), - $lineno, - $parameters, - $suggestion - ); - } - - /** - * @param array<int,mixed> $parameters - */ - public static function shouldSuppressIssue( - CodeBase $code_base, - Context $context, - string $issue_type, - int $lineno, - array $parameters, - Suggestion $suggestion = null - ) : bool { - if (Config::getValue('disable_suppression')) { - return false; - } - // If this issue type has been suppressed in - // the config, ignore it - if (\in_array($issue_type, Config::getValue('suppress_issue_types') ?? [])) { - return true; - } - // If a white-list of allowed issue types is defined, - // only emit issues on the white-list - $whitelist_issue_types = Config::getValue('whitelist_issue_types') ?? []; - if (\count($whitelist_issue_types) > 0 && - !\in_array($issue_type, $whitelist_issue_types)) { - return true; - } - - if ($context->hasSuppressIssue($code_base, $issue_type)) { - return true; - } - - return ConfigPluginSet::instance()->shouldSuppressIssue( - $code_base, - $context, - $issue_type, - $lineno, - $parameters, - $suggestion - ); - } -} diff --git a/vendor/phan/phan/src/Phan/IssueFixSuggester.php b/vendor/phan/phan/src/Phan/IssueFixSuggester.php deleted file mode 100644 index 27a0126..0000000 --- a/vendor/phan/phan/src/Phan/IssueFixSuggester.php +++ /dev/null @@ -1,636 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use Closure; -use Phan\Language\Context; -use Phan\Language\Element\ClassConstant; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Method; -use Phan\Language\Element\Property; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN; -use Phan\Language\FQSEN\FullyQualifiedClassConstantName; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedGlobalConstantName; -use function count; -use function strlen; -use function strtolower; - -/** - * Utilities to suggest fixes for emitted Issues - * - * Commonly used methods: - * - * self::suggestSimilarClass(CodeBase, Context, FullyQualifiedClassName, Closure $filter = null, string $prefix = 'Did you mean') - * self::suggestSimilarGlobalFunction( - * CodeBase $code_base, - * Context $context, - * FullyQualifiedFunctionName $function_fqsen, - * bool $suggest_in_global_namespace = true, - * string $prefix = 'Did you mean' - * ) - * self::suggestVariableTypoFix(CodeBase, Context, string $variable_name, string $prefix = 'Did you mean') - * self::suggestSimilarMethod(CodeBase, Context, Clazz, string $wanted_method_name, bool $is_static) - * self::suggestSimilarProperty(CodeBase, Context, Clazz, string $wanted_property_name, bool $is_static) - * self::suggestSimilarClassConstant(CodeBase, Context, FullyQualifiedClassConstantName) - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class IssueFixSuggester -{ - /** - * @param Closure(Clazz):bool $class_closure - * @return Closure(FullyQualifiedClassName):bool - */ - public static function createFQSENFilterFromClassFilter(CodeBase $code_base, Closure $class_closure) - { - /** - * @param FullyQualifiedClassName $alternate_fqsen - */ - return static function ($alternate_fqsen) use ($code_base, $class_closure) : bool { - if (!($alternate_fqsen instanceof FullyQualifiedClassName)) { - return false; - } - if (!$code_base->hasClassWithFQSEN($alternate_fqsen)) { - return false; - } - return $class_closure($code_base->getClassByFQSEN($alternate_fqsen)); - }; - } - - /** - * @return Closure(FullyQualifiedClassName):bool - */ - public static function createFQSENFilterForClasslikeCategories(CodeBase $code_base, bool $allow_class, bool $allow_trait, bool $allow_interface) - { - return self::createFQSENFilterFromClassFilter($code_base, static function (Clazz $class) use ($allow_class, $allow_trait, $allow_interface) : bool { - if ($class->isTrait()) { - return $allow_trait; - } elseif ($class->isInterface()) { - return $allow_interface; - } else { - return $allow_class; - } - }); - } - - /** - * @return ?Suggestion - */ - public static function suggestSimilarClassForMethod(CodeBase $code_base, Context $context, FullyQualifiedClassName $class_fqsen, string $method_name, bool $is_static) - { - $filter = null; - if (strtolower($method_name) === '__construct') { - // Constructed objects have to be classes - $filter = self::createFQSENFilterForClasslikeCategories($code_base, true, false, false); - } elseif ($is_static) { - // Static methods can be parts of classes or traits, but not interfaces - $filter = self::createFQSENFilterForClasslikeCategories($code_base, true, true, false); - } - return self::suggestSimilarClass($code_base, $context, $class_fqsen, $filter); - } - - /** - * @return ?Suggestion - */ - public static function suggestSimilarGlobalFunction( - CodeBase $code_base, - Context $context, - FullyQualifiedFunctionName $function_fqsen, - bool $suggest_in_global_namespace = true, - string $prefix = "" - ) { - if (!$prefix) { - $prefix = self::DEFAULT_FUNCTION_SUGGESTION_PREFIX; - } - $namespace = $function_fqsen->getNamespace(); - $name = $function_fqsen->getName(); - $suggested_fqsens = \array_merge( - $code_base->suggestSimilarGlobalFunctionInOtherNamespace($namespace, $name, $context), - $code_base->suggestSimilarGlobalFunctionInSameNamespace($namespace, $name, $context, $suggest_in_global_namespace) - ); - if (count($suggested_fqsens) === 0) { - return null; - } - - /** - * @param string|FullyQualifiedFunctionName $fqsen - */ - $generate_type_representation = static function ($fqsen) : string { - return $fqsen . '()'; - }; - $suggestion_text = $prefix . ' ' . \implode(' or ', \array_map($generate_type_representation, $suggested_fqsens)); - - return Suggestion::fromString($suggestion_text); - } - - const DEFAULT_CLASS_SUGGESTION_PREFIX = 'Did you mean'; - const DEFAULT_FUNCTION_SUGGESTION_PREFIX = 'Did you mean'; - - const CLASS_SUGGEST_ONLY_CLASSES = 0; - const CLASS_SUGGEST_CLASSES_AND_TYPES = 1; - const CLASS_SUGGEST_CLASSES_AND_TYPES_AND_VOID = 2; - - /** - * Returns a message suggesting a class name that is similar to the provided undeclared class - * - * @param ?Closure(FullyQualifiedClassName):bool $filter - * @param int $class_suggest_type whether to include non-classes such as 'int', 'callable', etc. - * @return ?Suggestion - */ - public static function suggestSimilarClass( - CodeBase $code_base, - Context $context, - FullyQualifiedClassName $class_fqsen, - $filter = null, - string $prefix = null, - int $class_suggest_type = self::CLASS_SUGGEST_ONLY_CLASSES - ) { - if (!$prefix) { - $prefix = self::DEFAULT_CLASS_SUGGESTION_PREFIX; - } - $suggested_fqsens = \array_merge( - $code_base->suggestSimilarClassInOtherNamespace($class_fqsen, $context), - $code_base->suggestSimilarClassInSameNamespace($class_fqsen, $context, $class_suggest_type) - ); - if ($filter) { - $suggested_fqsens = \array_filter($suggested_fqsens, $filter); - } - if (count($suggested_fqsens) === 0) { - return null; - } - - /** - * @param FullyQualifiedClassName|string $fqsen - */ - $generate_type_representation = static function ($fqsen) use ($code_base) : string { - if (\is_string($fqsen)) { - return $fqsen; // Not a class name, e.g. 'int', 'callable', etc. - } - $category = 'classlike'; - if ($code_base->hasClassWithFQSEN($fqsen)) { - $class = $code_base->getClassByFQSEN($fqsen); - if ($class->isInterface()) { - $category = 'interface'; - } elseif ($class->isTrait()) { - $category = 'trait'; - } else { - $category = 'class'; - } - } - return $category . ' ' . $fqsen->__toString(); - }; - $suggestion_text = $prefix . ' ' . \implode(' or ', \array_map($generate_type_representation, $suggested_fqsens)); - - return Suggestion::fromString($suggestion_text); - } - - /** - * @return ?Suggestion - */ - public static function suggestSimilarMethod(CodeBase $code_base, Context $context, Clazz $class, string $wanted_method_name, bool $is_static) - { - if (Config::getValue('disable_suggestions')) { - return null; - } - $method_set = self::suggestSimilarMethodMap($code_base, $context, $class, $wanted_method_name, $is_static); - if (count($method_set) === 0) { - return null; - } - \uksort($method_set, 'strcmp'); - $suggestions = []; - foreach ($method_set as $method) { - // We lose the original casing of the method name in the array keys, so use $method->getName() - $prefix = $method->isStatic() ? 'expr::' : 'expr->' ; - $suggestions[] = $prefix . $method->getName() . '()'; - } - return Suggestion::fromString( - 'Did you mean ' . \implode(' or ', $suggestions) - ); - } - - /** - * @return array<string,Method> - */ - public static function suggestSimilarMethodMap(CodeBase $code_base, Context $context, Clazz $class, string $wanted_method_name, bool $is_static) : array - { - $methods = $class->getMethodMap($code_base); - if (count($methods) > Config::getValue('suggestion_check_limit')) { - return []; - } - $usable_methods = self::filterSimilarMethods($code_base, $context, $methods, $is_static); - return self::getSuggestionsForStringSet($wanted_method_name, $usable_methods); - } - - /** - * @return ?FullyQualifiedClassName - * @internal - */ - public static function maybeGetClassInCurrentScope(Context $context) - { - if ($context->isInClassScope()) { - return $context->getClassFQSEN(); - } - return null; - } - - /** - * @param array<string,Method> $methods - * @return array<string,Method> a subset of those methods - * @internal - */ - public static function filterSimilarMethods(CodeBase $code_base, Context $context, array $methods, bool $is_static) - { - $class_fqsen_in_current_scope = self::maybeGetClassInCurrentScope($context); - - $candidates = []; - foreach ($methods as $method_name => $method) { - if ($is_static && !$method->isStatic()) { - // Don't suggest instance methods to replace static methods - continue; - } - if (!$method->isAccessibleFromClass($code_base, $class_fqsen_in_current_scope)) { - // Don't suggest inaccessible private or protected methods. - continue; - } - $candidates[$method_name] = $method; - } - return $candidates; - } - - /** - * @param ?\Closure(FullyQualifiedClassName):bool $filter - * @return ?Suggestion - */ - public static function suggestSimilarClassForGenericFQSEN(CodeBase $code_base, Context $context, FQSEN $fqsen, $filter = null, string $prefix = 'Did you mean') - { - if (Config::getValue('disable_suggestions')) { - return null; - } - if (!($fqsen instanceof FullyQualifiedClassName)) { - return null; - } - return self::suggestSimilarClass($code_base, $context, $fqsen, $filter, $prefix); - } - - /** - * @return ?Suggestion - */ - public static function suggestSimilarProperty(CodeBase $code_base, Context $context, Clazz $class, string $wanted_property_name, bool $is_static) - { - if (Config::getValue('disable_suggestions')) { - return null; - } - if (strlen($wanted_property_name) <= 1) { - return null; - } - $property_set = self::suggestSimilarPropertyMap($code_base, $context, $class, $wanted_property_name, $is_static); - $suggestions = []; - if ($is_static) { - if ($class->hasConstantWithName($code_base, $wanted_property_name)) { - $suggestions[] = $class->getFQSEN() . '::' . $wanted_property_name; - } - } - if ($class->hasMethodWithName($code_base, $wanted_property_name)) { - $method = $class->getMethodByName($code_base, $wanted_property_name); - $suggestions[] = $class->getFQSEN() . ($method->isStatic() ? '::' : '->') . $wanted_property_name . '()'; - } - foreach ($property_set as $property_name => $_) { - $prefix = $is_static ? 'expr::$' : 'expr->' ; - $suggestions[] = $prefix . $property_name; - } - foreach (self::getVariableNamesInScopeWithSimilarName($context, $wanted_property_name) as $variable_name) { - $suggestions[] = $variable_name; - } - - if (count($suggestions) === 0) { - return null; - } - \uksort($suggestions, 'strcmp'); - return Suggestion::fromString( - 'Did you mean ' . \implode(' or ', $suggestions) - ); - } - - /** - * @return array<string,Property> - */ - public static function suggestSimilarPropertyMap(CodeBase $code_base, Context $context, Clazz $class, string $wanted_property_name, bool $is_static) : array - { - $property_map = $class->getPropertyMap($code_base); - if (count($property_map) > Config::getValue('suggestion_check_limit')) { - return []; - } - $usable_property_map = self::filterSimilarProperties($code_base, $context, $property_map, $is_static); - return self::getSuggestionsForStringSet($wanted_property_name, $usable_property_map); - } - - /** - * @param array<string,Property> $property_map - * @return array<string,Property> a subset of those methods - * @internal - */ - public static function filterSimilarProperties(CodeBase $code_base, Context $context, array $property_map, bool $is_static) - { - $class_fqsen_in_current_scope = self::maybeGetClassInCurrentScope($context); - $candidates = []; - foreach ($property_map as $property_name => $property) { - if ($is_static !== $property->isStatic()) { - // Don't suggest instance properties to replace static properties - continue; - } - if (!$property->isAccessibleFromClass($code_base, $class_fqsen_in_current_scope)) { - // Don't suggest inaccessible private or protected properties. - continue; - } - // TODO: Check for access to protected outside of a class - if ($property->isDynamicProperty()) { - // Skip dynamically added properties - continue; - } - $candidates[$property_name] = $property; - } - return $candidates; - } - - /** - * @return ?Suggestion - */ - public static function suggestSimilarClassConstant(CodeBase $code_base, Context $context, FullyQualifiedClassConstantName $class_constant_fqsen) - { - if (Config::getValue('disable_suggestions')) { - return null; - } - $constant_name = $class_constant_fqsen->getName(); - if (strlen($constant_name) <= 1) { - return null; - } - $class_fqsen = $class_constant_fqsen->getFullyQualifiedClassName(); - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - return null; - } - $class = $code_base->getClassByFQSEN($class_fqsen); - $class_constant_map = self::suggestSimilarClassConstantMap($code_base, $context, $class, $constant_name); - if (count($class_constant_map) === 0) { - return null; - } - \uksort($class_constant_map, 'strcmp'); - $suggestions = []; - foreach ($class_constant_map as $constant_name => $_) { - $suggestions[] = $class_fqsen . '::' . $constant_name; - } - return Suggestion::fromString( - 'Did you mean ' . \implode(' or ', $suggestions) - ); - } - - /** - * @return ?Suggestion with values similar to the given constant - */ - public static function suggestSimilarGlobalConstant(CodeBase $code_base, Context $context, FullyQualifiedGlobalConstantName $fqsen) - { - if (Config::getValue('disable_suggestions')) { - return null; - } - $constant_name = $fqsen->getName(); - if (strlen($constant_name) <= 1) { - return null; - } - $suggestions = \array_merge( - self::suggestSimilarFunctionsToConstant($code_base, $context, $fqsen), - self::suggestSimilarClassConstantsToGlobalConstant($code_base, $context, $fqsen), - self::suggestSimilarClassPropertiesToGlobalConstant($code_base, $context, $fqsen), - $code_base->suggestSimilarConstantsToConstant($constant_name), - self::suggestSimilarVariablesToGlobalConstant($context, $fqsen) - ); - if (count($suggestions) === 0) { - return null; - } - $suggestions = \array_map('strval', $suggestions); - return Suggestion::fromString( - 'Did you mean ' . \implode(' or ', $suggestions) - ); - } - - /** - * @return array<int,string> - */ - private static function suggestSimilarFunctionsToConstant(CodeBase $code_base, Context $context, FullyQualifiedGlobalConstantName $fqsen) : array - { - $suggested_fqsens = $code_base->suggestSimilarGlobalFunctionInOtherNamespace( - $fqsen->getNamespace(), - $fqsen->getName(), - $context, - true - ); - return \array_map(static function (FullyQualifiedFunctionName $fqsen) : string { - return $fqsen . '()'; - }, $suggested_fqsens); - } - - /** - * Suggests accessible class constants of the current class that are similar to the passed in global constant FQSEN - * @return array<int,string> - */ - private static function suggestSimilarClassConstantsToGlobalConstant(CodeBase $code_base, Context $context, FullyQualifiedGlobalConstantName $fqsen) : array - { - if (!$context->isInClassScope()) { - return []; - } - if (\ltrim($fqsen->getNamespace(), '\\') !== '') { - return []; - } - try { - $class = $context->getClassInScope($code_base); - $name = $fqsen->getName(); - if ($class->hasConstantWithName($code_base, $name)) { - return ["self::$name"]; - } - } catch (\Exception $_) { - // ignore - } - return []; - } - - /** - * Suggests accessible class properties of the current class that are similar to the passed in global constant FQSEN - * @return array<int,string> - */ - private static function suggestSimilarClassPropertiesToGlobalConstant(CodeBase $code_base, Context $context, FullyQualifiedGlobalConstantName $fqsen) : array - { - if (!$context->isInClassScope()) { - return []; - } - if (\ltrim($fqsen->getNamespace(), '\\') !== '') { - return []; - } - $name = $fqsen->getName(); - try { - $class = $context->getClassInScope($code_base); - if (!$class->hasPropertyWithName($code_base, $name)) { - return []; - } - $property = $class->getPropertyByName($code_base, $name); - if (!$property->isAccessibleFromClass($code_base, $class->getFQSEN())) { - return []; - } - if ($property->isStatic()) { - return ['self::$' . $name]; - } else { - return ['$this->' . $name]; - } - } catch (\Exception $_) { - // ignore - } - return []; - } - - /** - * @return array<int,string> returns array variable names prefixed with '$' with a similar name, or an empty array if that wouldn't make sense or there would be too many suggestions - */ - private static function suggestSimilarVariablesToGlobalConstant(Context $context, FullyQualifiedGlobalConstantName $fqsen) : array - { - if ($context->isInGlobalScope()) { - return []; - } - if (\ltrim($fqsen->getNamespace(), '\\') !== '') { - // Give up if requesting a namespaced constant - // TODO: Better heuristics - return []; - } - return self::getVariableNamesInScopeWithSimilarName($context, $fqsen->getName()); - } - - /** - * @return array<string,ClassConstant> - */ - private static function suggestSimilarClassConstantMap(CodeBase $code_base, Context $context, Clazz $class, string $constant_name) : array - { - $constant_map = $class->getConstantMap($code_base); - if (count($constant_map) > Config::getValue('suggestion_check_limit')) { - return []; - } - $usable_constant_map = self::filterSimilarConstants($code_base, $context, $constant_map); - $result = self::getSuggestionsForStringSet($constant_name, $usable_constant_map); - return $result; - } - - /** - * @param array<string,ClassConstant> $constant_map - * @return array<string,ClassConstant> a subset of those methods - * @internal - */ - public static function filterSimilarConstants(CodeBase $code_base, Context $context, array $constant_map) : array - { - $class_fqsen_in_current_scope = self::maybeGetClassInCurrentScope($context); - - $candidates = []; - foreach ($constant_map as $constant_name => $constant) { - if (!$constant->isAccessibleFromClass($code_base, $class_fqsen_in_current_scope)) { - // Don't suggest inherited private properties - continue; - } - // TODO: Check for access to protected outside of a class - $candidates[$constant_name] = $constant; - } - return $candidates; - } - - /** - * @return ?Suggestion - */ - public static function suggestVariableTypoFix(CodeBase $code_base, Context $context, string $variable_name, string $prefix = 'Did you mean') - { - if (Config::getValue('disable_suggestions')) { - return null; - } - if ($variable_name === '') { - return null; - } - if (!$context->isInFunctionLikeScope()) { - // Don't bother suggesting globals for now - return null; - } - $suggestions = self::getVariableNamesInScopeWithSimilarName($context, $variable_name); - if ($context->isInClassScope()) { - // TODO: Does this need to check for static closures - $class_in_scope = $context->getClassInScope($code_base); - if ($class_in_scope->hasPropertyWithName($code_base, $variable_name)) { - $property = $class_in_scope->getPropertyByName($code_base, $variable_name); - - if (!$property->isDynamicProperty()) { - // Don't suggest inherited private properties that can't be accessed - // - This doesn't need to be checking if the visibility is protected, - // because it's looking for properties of the current class - if (!$property->isPrivate() || $property->getDefiningClassFQSEN() === $class_in_scope->getFQSEN()) { - $suggestion_prefix = $property->isStatic() ? 'self::$' : '$this->'; - $suggestions[] = $suggestion_prefix . $variable_name; - } - } - } - } - if (count($suggestions) === 0) { - return null; - } - \sort($suggestions); - - return Suggestion::fromString( - $prefix . ' ' . \implode(' or ', $suggestions) - ); - } - - /** - * @return array<int,string> Suggestions for variable names, prefixed with "$" - */ - private static function getVariableNamesInScopeWithSimilarName(Context $context, string $variable_name) : array - { - $suggestions = []; - if (strlen($variable_name) > 1) { - $variable_candidates = $context->getScope()->getVariableMap(); - if (count($variable_candidates) <= Config::getValue('suggestion_check_limit')) { - $variable_candidates = \array_merge($variable_candidates, Variable::_BUILTIN_SUPERGLOBAL_TYPES); - $variable_suggestions = self::getSuggestionsForStringSet($variable_name, $variable_candidates); - - foreach ($variable_suggestions as $suggested_variable_name => $_) { - $suggestions[] = '$' . $suggested_variable_name; - } - } - } - return $suggestions; - } - /** - * A very simple way to get the closest case-insensitive string matches. - * - * @param array<string,mixed> $potential_candidates - * @return array<string,mixed> a subset of $potential_candidates - */ - public static function getSuggestionsForStringSet(string $target, array $potential_candidates) : array - { - if (count($potential_candidates) === 0) { - return []; - } - $search_name = strtolower($target); - $target_length = strlen($search_name); - $max_levenshtein_distance = (int)(1 + strlen($search_name) / 6); - $best_matches = []; - $min_found_distance = $max_levenshtein_distance; - - foreach ($potential_candidates as $name => $_) { - $name = (string)$name; - - if (\abs(strlen($name) - $target_length) > $max_levenshtein_distance) { - continue; - } - $distance = \levenshtein(strtolower($name), $search_name); - if ($distance <= $min_found_distance) { - if ($distance < $min_found_distance) { - $min_found_distance = $distance; - $best_matches = []; - } - $best_matches[$name] = $_; - } - } - return $best_matches; - } -} diff --git a/vendor/phan/phan/src/Phan/IssueInstance.php b/vendor/phan/phan/src/Phan/IssueInstance.php deleted file mode 100644 index f4b2adf..0000000 --- a/vendor/phan/phan/src/Phan/IssueInstance.php +++ /dev/null @@ -1,205 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use Phan\Language\Element\TypedElementInterface; -use Phan\Language\Element\UnaddressableTypedElement; -use Phan\Language\FQSEN; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Library\StringUtil; -use Phan\Output\Colorizing; - -/** - * Represents an instance of an issue at a given file and line for the given template parameters. - * - * Some IssueInstances are created with suggestions for how they can be fixed - * - * @see Issue for how these are emitted. Visitors and plugins often have helper methods to emit issues. - * @see OutputPrinter for how this is converted to various output formats - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class IssueInstance -{ - /** @var Issue the generic category of issues */ - private $issue; - - /** @var string the file in which this issue was emitted. */ - private $file; - - /** @var int the line in which this issue was emitted. */ - private $line; - - /** @var string the formatted issue message */ - private $message; - - /** @var ?Suggestion If this is non-null, this contains suggestions on how to resolve the error. */ - private $suggestion; - - /** @var array<int,string|int|float> $template_parameters If this is non-null, this contains suggestions on how to resolve the error. */ - private $template_parameters; - - /** - * @param Issue $issue - * @param string $file - * @param int $line - * @param array<int,string|int|float|FQSEN|Type|UnionType|TypedElementInterface|UnaddressableTypedElement> $template_parameters - * @param ?Suggestion $suggestion - */ - public function __construct( - Issue $issue, - string $file, - int $line, - array $template_parameters, - Suggestion $suggestion = null - ) { - $this->issue = $issue; - $this->file = $file; - $this->line = $line; - $this->suggestion = $suggestion; - - if ($issue->getExpectedArgumentCount() !== \count($template_parameters)) { - \fprintf(\STDERR, "Unexpected argument count for %s: Expected %d args, got %d\n", $issue->getTemplate(), $issue->getExpectedArgumentCount(), \count($template_parameters)); - } - // color_issue_message will interfere with some formatters, such as xml. - if (Config::getValue('color_issue_messages')) { - $this->message = self::generateColorizedMessage($issue, $template_parameters); - } else { - $this->message = self::generatePlainMessage($issue, $template_parameters); - } - // The terminal color codes are valid utf-8 (all control code bytes <= 127) - $this->message = StringUtil::asSingleLineUtf8($this->message); - - // Fixes #1754 : Some issue template parameters might not be serializable (for passing to ForkPool) - - /** - * @param string|float|int|FQSEN|Type|UnionType|TypedElementInterface|UnaddressableTypedElement $parameter - * @return string|float|int - */ - $this->template_parameters = \array_map(static function ($parameter) { - if (\is_object($parameter)) { - return (string)$parameter; - } - return $parameter; - }, $template_parameters); - } - - /** - * @param array<int,string|int|float|bool|object> $template_parameters - */ - private static function generatePlainMessage( - Issue $issue, - array $template_parameters - ) : string { - $template = $issue->getTemplate(); - - // markdown_issue_messages doesn't make sense with color, unless you add <span style="color:red">msg</span> - // Not sure if codeclimate supports that. - if (Config::getValue('markdown_issue_messages')) { - $template = \preg_replace( - '/([^ ]*%s[^ ]*)/', - '`\1`', - $template - ); - } - // @phan-suppress-next-line PhanPluginPrintfVariableFormatString the template is provided by Phan/its plugins - return \vsprintf( - $template, - $template_parameters - ); - } - - /** - * @param array<int,string|int|float|FQSEN|Type|UnionType|TypedElementInterface|UnaddressableTypedElement> $template_parameters - */ - private static function generateColorizedMessage( - Issue $issue, - array $template_parameters, - string $suggestion = null - ) : string { - $template = $issue->getTemplateRaw(); - - $result = Colorizing::colorizeTemplate($template, $template_parameters); - if ($suggestion) { - $result .= Colorizing::colorizeTemplate(" ({SUGGESTION})", [$suggestion]); - } - return $result; - } - - /** - * @return ?Suggestion If this is non-null, this contains suggestions on how to resolve the error. - */ - public function getSuggestion() - { - return $this->suggestion; - } - - /** @return array<int,string|int|float|FQSEN|Type|UnionType> $template_parameters */ - public function getTemplateParameters() : array - { - return $this->template_parameters; - } - - /** @return ?string */ - public function getSuggestionMessage() - { - if (!$this->suggestion) { - return null; - } - $text = $this->suggestion->getMessage(); - if (!$text) { - return null; - } - return StringUtil::asSingleLineUtf8($text); - } - - /** - * @return Issue - */ - public function getIssue() : Issue - { - return $this->issue; - } - - /** - * @return string - */ - public function getFile() : string - { - return $this->file; - } - - /** - * @return int - */ - public function getLine() : int - { - return $this->line; - } - - /** - * @return string - */ - public function getMessage() : string - { - return $this->message; - } - - /** - * @return string - */ - public function getMessageAndMaybeSuggestion() : string - { - $message = $this->getMessage(); - $suggestion = $this->getSuggestionMessage(); - if ($suggestion) { - return $message . ' (' . $suggestion . ')'; - } - return $message; - } - - public function __toString() : string - { - return "{$this->getFile()}:{$this->getLine()} {$this->getMessageAndMaybeSuggestion()}"; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/AnnotatedUnionType.php b/vendor/phan/phan/src/Phan/Language/AnnotatedUnionType.php deleted file mode 100644 index d016ae7..0000000 --- a/vendor/phan/phan/src/Phan/Language/AnnotatedUnionType.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language; - -/** - * This is used to represent a union type that has various annotations. - * Currently, the only annotation is is_possibly_undefined, which is used in optional fields of array shapes. - * (It might eventually be used for variables that are defined in some branches but not others) - * - * NOTE: Instances should be immutable after UnionType returns them. - * They are not unique for combination of types and options. - * - * The internal representation may change in the future. - */ -class AnnotatedUnionType extends UnionType -{ - /** - * @var bool is this union type possibly undefined - * (e.g. a possibly undefined array shape offset) - */ - protected $is_possibly_undefined = false; - - /** - * @override - */ - public function withIsPossiblyUndefined(bool $is_possibly_undefined) : UnionType - { - if (!$is_possibly_undefined) { - return UnionType::ofUniqueTypes($this->getTypeSet()); - } - if (!$this->is_possibly_undefined) { - return $this; - } - $result = clone($this); - $result->is_possibly_undefined = $is_possibly_undefined; - return $result; - } - - public function asSingleScalarValueOrNull() - { - if ($this->is_possibly_undefined) { - return null; - } - return parent::asSingleScalarValueOrNull(); - } - - public function asSingleScalarValueOrNullOrSelf() - { - if ($this->is_possibly_undefined) { - return $this; - } - return parent::asSingleScalarValueOrNullOrSelf(); - } - - public function asValueOrNullOrSelf() - { - if ($this->is_possibly_undefined) { - return $this; - } - return parent::asValueOrNullOrSelf(); - } - public function getIsPossiblyUndefined() : bool - { - return $this->is_possibly_undefined; - } - - public function __toString() : string - { - $result = parent::__toString(); - if ($this->is_possibly_undefined) { - return $result . '='; - } - return $result; - } - - /** - * Add a type name to the list of types - * - * @return UnionType - * @override - */ - public function withType(Type $type) - { - return parent::withType($type)->withIsPossiblyUndefined(false); - } - - /** - * Add a type name to the list of types - * - * @return UnionType - * @override - */ - public function withoutType(Type $type) - { - return parent::withoutType($type)->withIsPossiblyUndefined(false); - } - - /** - * Returns a union type which add the given types to this type - * - * @return UnionType - * @override - */ - public function withUnionType(UnionType $union_type) - { - return parent::withUnionType($union_type)->withIsPossiblyUndefined(false); - } - - /** - * @return bool - True if not empty, not possibly undefined, and at least one type is NullType or nullable. - * @override - */ - public function containsNullableOrUndefined() : bool - { - return $this->is_possibly_undefined || $this->containsNullable(); - } - - /** - * @override - */ - public function generateUniqueId() : string - { - $id = parent::generateUniqueId(); - if ($this->is_possibly_undefined) { - return $id . '='; - } - return $id; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Context.php b/vendor/phan/phan/src/Phan/Language/Context.php deleted file mode 100644 index 9f2d0bb..0000000 --- a/vendor/phan/phan/src/Phan/Language/Context.php +++ /dev/null @@ -1,915 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language; - -use AssertionError; -use Phan\CodeBase; -use Phan\Exception\CodeBaseException; -use Phan\Issue; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Property; -use Phan\Language\Element\TypedElement; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionLikeName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedGlobalConstantName; -use Phan\Language\FQSEN\FullyQualifiedGlobalStructuralElement; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\FQSEN\FullyQualifiedPropertyName; -use Phan\Language\Scope\GlobalScope; -use Phan\Language\Type\ArrayShapeType; -use RuntimeException; - -/** - * An object representing the context in which any - * structural element (such as a class or method) lives. - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class Context extends FileRef -{ - /** - * @var string - * The namespace of the file. - * To be consistent with what ScopeVisitor sets in visitNamespace(), this is '\\' for the root namespace as well. - */ - private $namespace = '\\'; - - /** - * @var int - * The id of the namespace - */ - private $namespace_id = 0; - - /** - * @var array<int,array<string,NamespaceMapEntry>> - * Maps [int flags => [string name/namespace => NamespaceMapEntry(fqsen, is_used)]] - * Note that for \ast\USE_CONST (global constants), this is case-sensitive, - * but the remaining types are case-insensitive (stored with lowercase name). - */ - private $namespace_map = []; - - /** - * @var array<int,array<string,NamespaceMapEntry>> - * Maps [int flags => [string name/namespace => NamespaceMapEntry(fqsen, is_used)]] - * - * (This is used in the analysis phase after the parse phase) - * @see self::$namespace_map - */ - private $parse_namespace_map = []; - - /** - * @var int - * strict_types setting for the file - */ - protected $strict_types = 0; - - /** - * @var Scope - * The current scope in this context - */ - private $scope; - - /** - * @var array<mixed,mixed> - * caches union types for a given node - */ - private $cache = []; - - /** - * Create a new context - */ - public function __construct() - { - $this->scope = new GlobalScope(); - } - - /** - * @param string $namespace - * The namespace of the file - * - * @return Context - * A clone of this context with the given value is returned - */ - public function withNamespace(string $namespace) : Context - { - $context = clone($this); - $context->namespace = $namespace; - $context->namespace_id += 1; // Assumes namespaces are walked in order - $context->namespace_map = []; - return $context; - } - - /** - * @return string - * The namespace of the file - */ - public function getNamespace() : string - { - return $this->namespace; - } - - /** - * @return int - * The namespace id within the file (incrementing starting from 0) - * Used because a file can have duplicate identical namespace declarations. - */ - public function getNamespaceId() : int - { - return $this->namespace_id; - } - - /** - * @return bool - * True if we have a mapped NS for the given named element - */ - public function hasNamespaceMapFor(int $flags, string $name) : bool - { - // Look for the mapping on the part before a - // slash - $name_parts = \explode('\\', $name, 2); - if (\count($name_parts) > 1) { - // We're looking for a namespace if there's more than one part - // Namespaces are case-insensitive. - $namespace_map_key = \strtolower($name_parts[0]); - $flags = \ast\flags\USE_NORMAL; - } else { - if ($flags !== \ast\flags\USE_CONST) { - $namespace_map_key = \strtolower($name); - } else { - // Constants are case-sensitive, and stored in a case-sensitive manner. - $namespace_map_key = $name; - } - } - return isset($this->namespace_map[$flags][$namespace_map_key]); - } - - /** - * @return FullyQualifiedGlobalStructuralElement - * The namespace mapped name for the given flags and name - */ - public function getNamespaceMapFor( - int $flags, - string $name - ) : FullyQualifiedGlobalStructuralElement { - - // Look for the mapping on the part before a - // slash - $name_parts = \explode('\\', $name, 2); - if (\count($name_parts) > 1) { - $name = \strtolower($name_parts[0]); - $suffix = $name_parts[1]; - // In php, namespaces, functions, and classes are case-insensitive. - // However, constants are almost always case-insensitive. - if ($flags !== \ast\flags\USE_CONST) { - $suffix = \strtolower($suffix); - } - // The name we're looking for is a namespace(USE_NORMAL). - // The suffix has type $flags - $map_flags = \ast\flags\USE_NORMAL; - } else { - $suffix = ''; - $map_flags = $flags; - if ($flags !== \ast\flags\USE_CONST) { - $name = \strtolower($name); - } - } - - $namespace_map_entry = $this->namespace_map[$map_flags][$name] ?? null; - - if (!$namespace_map_entry) { - throw new AssertionError('No namespace defined for name'); - } - $fqsen = $namespace_map_entry->fqsen; - $namespace_map_entry->is_used = true; - - // Create something of the corresponding type (which may or may not be within a suffix) - if (!$suffix) { - return $fqsen; - } - - switch ($flags) { - case \ast\flags\USE_NORMAL: - // @phan-suppress-next-line PhanThrowTypeAbsentForCall This and the suffix should have already been validated - return FullyQualifiedClassName::fromFullyQualifiedString( - $fqsen->__toString() . '\\' . $suffix - ); - case \ast\flags\USE_FUNCTION: - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - return FullyQualifiedFunctionName::fromFullyQualifiedString( - $fqsen->__toString() . '\\' . $suffix - ); - case \ast\flags\USE_CONST: - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - return FullyQualifiedGlobalConstantName::fromFullyQualifiedString( - $fqsen->__toString() . '\\' . $suffix - ); - } - - throw new AssertionError("Unknown flag $flags"); - } - - /** - * @return Context - * This context with the given value is returned - */ - public function withNamespaceMap( - int $flags, - string $alias, - FullyQualifiedGlobalStructuralElement $target, - int $lineno - ) : Context { - $original_alias = $alias; - if ($flags !== \ast\flags\USE_CONST) { - $alias = \strtolower($alias); - } else { - $last_part_index = \strrpos($alias, '\\'); - if ($last_part_index !== false) { - // Convert the namespace to lowercase, but not the constant name. - $alias = \strtolower(\substr($alias, 0, $last_part_index + 1)) . \substr($alias, $last_part_index + 1); - } - } - // we may have imported this namespace map from the parse phase, making the target already exist - // TODO: Warn if namespace_map already exists? Then again, `php -l` already does. - $parse_entry = $this->parse_namespace_map[$flags][$alias] ?? null; - if ($parse_entry !== null) { - // We add entries to namespace_map only after encountering them - // This is because statements can appear before 'use Foo\Bar;' (and those don't use the 'use' statement.) - $this->namespace_map[$flags][$alias] = $parse_entry; - return $this; - } - $this->namespace_map[$flags][$alias] = new NamespaceMapEntry($target, $original_alias, $lineno); - return $this; - } - - /** - * @param int $strict_types - * The strict_type setting for the file - * - * @return Context - * This context with the given value is returned - */ - public function withStrictTypes(int $strict_types) : Context - { - $this->strict_types = $strict_types; - return $this; - } - - /** - * @return bool - * True if strict_types is set to 1 in this - * context. - */ - public function getIsStrictTypes() : bool - { - return (1 === $this->strict_types); - } - - /** - * @return Scope - * An object describing the contents of the current - * scope. - */ - public function getScope() : Scope - { - return $this->scope; - } - - /** - * Set the scope on the context - * - * @return void - */ - public function setScope(Scope $scope) - { - $this->scope = $scope; - // TODO: Less aggressive? ConditionVisitor creates a lot of scopes - $this->cache = []; - } - - /** - * @return Context - * A new context with the given scope - */ - public function withScope(Scope $scope) : Context - { - $context = clone($this); - $context->setScope($scope); - return $context; - } - - /** - * @return Context - * - * A new context with the a clone of the current scope. - * This is useful when using AssignmentVisitor for things that aren't actually assignment operations. - * (AssignmentVisitor modifies the passed in scope variables in place) - */ - public function withClonedScope() : Context - { - $context = clone($this); - $context->scope = clone($context->scope); - return $context; - } - - /** - * @param Variable $variable - * A variable to add to the scope for the new - * context - * - * @return Context - * A new context based on this with a variable - * as defined by the parameters in scope - */ - public function withScopeVariable( - Variable $variable - ) : Context { - return $this->withScope( - $this->scope->withVariable($variable) - ); - } - - /** - * @param Variable $variable - * A variable to add to the scope for the new - * context - * - * @return void - */ - public function addGlobalScopeVariable(Variable $variable) - { - $this->scope->addGlobalVariable($variable); - } - - /** - * Add a variable to this context's scope. Note that - * this does not create a new context. You're actually - * injecting the variable into the context. Use with - * caution. - * - * @param Variable $variable - * A variable to inject into this context - * - * @return void - */ - public function addScopeVariable( - Variable $variable - ) { - $this->scope->addVariable($variable); - } - - /** - * Unset a variable in this context's scope. Note that - * this does not create a new context. You're actually - * removing the variable from the context. Use with - * caution. - * - * @param string $variable_name - * The name of a variable to remove from the context. - * - * @return void - */ - public function unsetScopeVariable( - string $variable_name - ) { - $this->scope->unsetVariable($variable_name); - } - - /** - * Returns a string representing this Context for debugging - * @suppress PhanUnreferencedPublicMethod kept around to make it easy to dump variables in a context - */ - public function toDebugString() : string - { - $result = (string)$this; - foreach ($this->getScope()->getVariableMap() as $variable) { - $result .= "\n$variable"; - } - return $result; - } - - /** - * @return bool - * True if this context is currently within a class - * scope, else false. - */ - public function isInClassScope() : bool - { - return $this->scope->isInClassScope(); - } - - /** - * @return FullyQualifiedClassName - * A fully-qualified structural element name describing - * the current class in scope. - */ - public function getClassFQSEN() : FullyQualifiedClassName - { - return $this->scope->getClassFQSEN(); - } - - /** - * @return ?FullyQualifiedClassName - */ - public function getClassFQSENOrNull() - { - return $this->scope->getClassFQSENOrNull(); - } - - /** - * @return bool - * True if this context is currently within a property - * scope, else false. - * @suppress PhanUnreferencedPublicMethod - */ - public function isInPropertyScope() : bool - { - return $this->scope->isInPropertyScope(); - } - - /** - * @return FullyQualifiedPropertyName - * A fully-qualified structural element name describing - * the current property in scope. - */ - public function getPropertyFQSEN() : FullyQualifiedPropertyName - { - return $this->scope->getPropertyFQSEN(); - } - - /** - * @param CodeBase $code_base - * The global code base holding all state - * - * @return Clazz - * Get the class in this scope, or fail real hard - * - * @throws CodeBaseException - * Thrown if we can't find the class in scope within the - * given codebase. - */ - public function getClassInScope(CodeBase $code_base) : Clazz - { - if (!$this->scope->isInClassScope()) { - throw new AssertionError("Must be in class scope to get class"); - } - - if (!$code_base->hasClassWithFQSEN($this->getClassFQSEN())) { - throw new CodeBaseException( - $this->getClassFQSEN(), - "Cannot find class with FQSEN {$this->getClassFQSEN()} in context {$this}" - ); - } - - return $code_base->getClassByFQSEN( - $this->getClassFQSEN() - ); - } - - /** - * @param CodeBase $code_base - * The global code base holding all state - * - * @return Property - * Get the property in this scope, or fail real hard - * - * @throws CodeBaseException - * Thrown if we can't find the property in scope within the - * given codebase. - */ - public function getPropertyInScope(CodeBase $code_base) : Property - { - if (!$this->scope->isInPropertyScope()) { - throw new AssertionError("Must be in property scope to get property"); - } - - $property_fqsen = $this->getPropertyFQSEN(); - if (!$code_base->hasPropertyWithFQSEN($property_fqsen)) { - throw new CodeBaseException( - $property_fqsen, - "Cannot find class with FQSEN {$property_fqsen} in context {$this}" - ); - } - - return $code_base->getPropertyByFQSEN( - $property_fqsen - ); - } - - /** - * @return bool - * True if this context is currently within a method, - * function or closure scope. - */ - public function isInFunctionLikeScope() : bool - { - return $this->scope->isInFunctionLikeScope(); - } - - /** - * @return bool - * True if this context is currently within a method. - */ - public function isInMethodScope() : bool - { - return $this->scope->isInMethodLikeScope(); - } - - /** - * @return FullyQualifiedFunctionLikeName|FullyQualifiedMethodName|FullyQualifiedFunctionName - * A fully-qualified structural element name describing - * the current function or method in scope. - */ - public function getFunctionLikeFQSEN() - { - $scope = $this->scope; - if (!$scope->isInFunctionLikeScope()) { - throw new AssertionError("Must be in function-like scope to get function-like FQSEN"); - } - return $scope->getFunctionLikeFQSEN(); - } - - /** - * @param CodeBase $code_base - * The global code base holding all state - * - * @return Element\Func|Element\Method - * Get the method in this scope or fail real hard - */ - public function getFunctionLikeInScope( - CodeBase $code_base - ) : FunctionInterface { - $fqsen = $this->getFunctionLikeFQSEN(); - - if ($fqsen instanceof FullyQualifiedFunctionName) { - if (!$code_base->hasFunctionWithFQSEN($fqsen)) { - throw new RuntimeException("The function $fqsen does not exist, but Phan is in that function's scope"); - } - return $code_base->getFunctionByFQSEN($fqsen); - } - - if ($fqsen instanceof FullyQualifiedMethodName) { - if (!$code_base->hasMethodWithFQSEN($fqsen)) { - throw new RuntimeException("Method does not exist"); - } - return $code_base->getMethodByFQSEN($fqsen); - } - - throw new AssertionError("FQSEN must be for a function or method"); - } - - /** - * @return bool - * True if we're within the scope of a class, method, - * function or closure. False if we're in the global - * scope - * @suppress PhanUnreferencedPublicMethod - */ - public function isInElementScope() : bool - { - return $this->scope->isInElementScope(); - } - - /** - * @return bool - * True if we're in the global scope (not in a class, - * method, function, closure). - */ - public function isInGlobalScope() : bool - { - return !$this->scope->isInElementScope(); - } - - /** - * @param CodeBase $code_base - * The code base from which to retrieve the TypedElement - * - * @return TypedElement - * The element whose scope we're in. If we're in the global - * scope this method will go down in flames and take your - * process with it. - * - * @throws CodeBaseException if this was called without first checking - * if this context is in an element scope - */ - public function getElementInScope(CodeBase $code_base) : TypedElement - { - if ($this->scope->isInFunctionLikeScope()) { - return $this->getFunctionLikeInScope($code_base); - } elseif ($this->scope->isInPropertyScope()) { - return $this->getPropertyInScope($code_base); - } elseif ($this->scope->isInClassScope()) { - return $this->getClassInScope($code_base); - } - - throw new CodeBaseException( - null, - "Cannot get element in scope if we're in the global scope" - ); - } - - /** - * @param CodeBase $code_base - * The code base from which to retrieve a possible TypedElement - * that contains an issue suppression list - * - * @return bool - * True if issues with the given name are suppressed within - * this context. - */ - public function hasSuppressIssue( - CodeBase $code_base, - string $issue_name - ) : bool { - if ($code_base->hasFileLevelSuppression($this->getFile(), $issue_name)) { - return true; - } - if (!$this->scope->isInElementScope()) { - return false; - } - - $has_suppress_issue = - $this->getElementInScope($code_base)->hasSuppressIssue( - $issue_name - ); - - // Increment the suppression use count - if ($has_suppress_issue) { - $this->getElementInScope($code_base)->incrementSuppressIssueCount($issue_name); - } - - return $has_suppress_issue; - } - - /** - * $this->cache is reused for multiple types of caches - * We xor the node ids with the following bits so that the values don't overlap. - * (The node id is based on \spl_object_id(), which is the object ID number. - * - * (This caching scheme makes a reasonable assumption - * that there are less than 1 billion Node objects on 32-bit systems, - * (It'd run out of memory with more than 4 bytes needed per Node) - * and less than (1 << 62) objects on 64-bit systems.) - * - * It also assumes that nodes won't be freed while this Context still exists - * - * 0x00(node_id) is used for getUnionTypeOfNodeIfCached(int $node_id, false) - * 0x10(node_id) is used for getUnionTypeOfNodeIfCached(int $node_id, true) - * 0x01(node_id) is used for getCachedClassListOfNode(int $node_id) - */ - const HIGH_BIT_1 = (1 << (\PHP_INT_SIZE * 8) - 1); - const HIGH_BIT_2 = (1 << (\PHP_INT_SIZE * 8) - 2); - - /** - * @param int $node_id \spl_object_id($node) - * @param bool $should_catch_issue_exception the value passed to UnionTypeVisitor - * @return ?UnionType - */ - public function getUnionTypeOfNodeIfCached(int $node_id, bool $should_catch_issue_exception) - { - if ($should_catch_issue_exception) { - return $this->cache[$node_id] ?? null; - } - return $this->cache[$node_id ^ self::HIGH_BIT_1] ?? null; - } - - /** - * TODO: This may be unsafe? Clear the cache after a function goes out of scope. - * - * A UnionType is only cached if there is no exception. - * - * @param int $node_id \spl_object_id($node) - * @param UnionType $type the type to cache. - * @param bool $should_catch_issue_exception the value passed to UnionTypeVisitor - * @return void - */ - public function setCachedUnionTypeOfNode(int $node_id, UnionType $type, bool $should_catch_issue_exception) - { - if (!$should_catch_issue_exception) { - $this->cache[$node_id ^ self::HIGH_BIT_1] = $type; - // If we weren't suppressing exceptions and setCachedUnionTypeOfNode was called, - // that would mean that there were no exceptions to catch. - // So, that means the UnionType for should_catch_issue_exception = true will be the same - } - $this->cache[$node_id] = $type; - } - - /** - * @param int $node_id - * @return ?array{0:UnionType,1:Clazz[]} $result - * @suppress PhanPartialTypeMismatchReturn cache is mixed with other cache objects - */ - public function getCachedClassListOfNode(int $node_id) - { - return $this->cache[$node_id ^ self::HIGH_BIT_2] ?? null; - } - - /** - * TODO: This may be unsafe? Clear the cache after a function goes out of scope. - * @param int $node_id \spl_object_id($node) - * @param array{0:UnionType,1:Clazz[]} $result - * @return void - */ - public function setCachedClassListOfNode(int $node_id, array $result) - { - $this->cache[$node_id ^ self::HIGH_BIT_2] = $result; - } - - /** - * @return void - */ - public function clearCachedUnionTypes() - { - $this->cache = []; - } - - /** - * Gets Phan's internal representation of all of the 'use elem;' statements in a namespace. - * Use hasNamespaceMapFor and getNamespaceMapFor instead. - * - * @internal - * - * @return array<int,array<string,NamespaceMapEntry>> - */ - public function getNamespaceMap() : array - { - return $this->namespace_map; - } - - /** - * Warn about any unused \ast\AST_USE or \ast\AST_GROUP_USE nodes (`use Foo\Bar;`) - * This should be called after analyzing the end of a namespace (And before analyzing the next namespace) - * - * @param CodeBase $code_base - * The code base within which we're operating - * - * @internal - * - * @return void - */ - public function warnAboutUnusedUseElements(CodeBase $code_base) - { - foreach ($this->namespace_map as $flags => $entries_for_flag) { - foreach ($entries_for_flag as $namespace_map_entry) { - if ($namespace_map_entry->is_used) { - continue; - } - switch ($flags) { - case \ast\flags\USE_NORMAL: - default: - $issue_type = Issue::UnreferencedUseNormal; - break; - case \ast\flags\USE_FUNCTION: - $issue_type = Issue::UnreferencedUseFunction; - break; - case \ast\flags\USE_CONST: - $issue_type = Issue::UnreferencedUseConstant; - break; - } - Issue::maybeEmit( - $code_base, - $this, - $issue_type, - $namespace_map_entry->lineno, - $namespace_map_entry->original_name, - (string)$namespace_map_entry->fqsen - ); - } - } - } - - /** - * @return void - * @internal - * @suppress PhanAccessMethodInternal - */ - public function importNamespaceMapFromParsePhase(CodeBase $code_base) - { - $this->parse_namespace_map = $code_base->getNamespaceMapFromParsePhase($this->getFile(), $this->namespace, $this->namespace_id); - } - - /** - * Copy private properties of $other to this - * @suppress PhanTypeSuspiciousNonTraversableForeach - * @return void - */ - final protected function copyPropertiesFrom(Context $other) - { - foreach ($other as $k => $v) { - $this->{$k} = $v; - } - } - - /** - * This name is internally used by Phan to track the properties of $this similarly to the way array shapes are represented. - */ - const VAR_NAME_THIS_PROPERTIES = "phan\0\$this"; - - /** - * Analyzes the side effects of setting the type of $this->property to $type - */ - public function withThisPropertySetToType(Property $property, UnionType $type) : Context - { - $old_union_type = $property->getUnionType(); - if ($this->scope->hasVariableWithName(self::VAR_NAME_THIS_PROPERTIES)) { - $variable = clone($this->scope->getVariableByName(self::VAR_NAME_THIS_PROPERTIES)); - $old_type = $variable->getUnionType(); - $override_type = ArrayShapeType::fromFieldTypes([$property->getName() => $type], false); - $override_type = self::addArrayShapeTypes($override_type, $old_type->getTypeSet()); - - $variable->setUnionType($override_type->asUnionType()); - } else { - // There is nothing inferred about any type - - if ($old_union_type->isEqualTo($type)) { - // And this new type is what we already inferred, so there's nothing to do - return $this; - } - $override_type = ArrayShapeType::fromFieldTypes([$property->getName() => $type], false); - $variable = new Variable( - $this, - self::VAR_NAME_THIS_PROPERTIES, - $override_type->asUnionType(), - 0 - ); - } - return $this->withScopeVariable($variable); - } - - /** - * Analyzes the side effects of setting the type of $this->property_name to $type - * - * The caller should check if it is necessary to do this. - */ - public function withThisPropertySetToTypeByName(string $property_name, UnionType $type) : Context - { - if ($this->scope->hasVariableWithName(self::VAR_NAME_THIS_PROPERTIES)) { - $variable = clone($this->scope->getVariableByName(self::VAR_NAME_THIS_PROPERTIES)); - $old_type = $variable->getUnionType(); - $override_type = ArrayShapeType::fromFieldTypes([$property_name => $type], false); - $override_type = self::addArrayShapeTypes($override_type, $old_type->getTypeSet()); - - $variable->setUnionType($override_type->asUnionType()); - } else { - // There is nothing inferred about any type - - $override_type = ArrayShapeType::fromFieldTypes([$property_name => $type], false); - $variable = new Variable( - $this, - self::VAR_NAME_THIS_PROPERTIES, - $override_type->asUnionType(), - 0 - ); - } - return $this->withScopeVariable($variable); - } - - /** - * @param array<int,Type> $type_set - */ - private static function addArrayShapeTypes(ArrayShapeType $override_type, array $type_set) : ArrayShapeType - { - if (!$type_set) { - return $override_type; - } - $array_shape_type_set = []; - foreach ($type_set as $type) { - if ($type instanceof ArrayShapeType) { - $array_shape_type_set[] = $type; - } - } - if ($array_shape_type_set) { - // Add in all of the locally known types for other properties - $override_type = ArrayShapeType::combineWithPrecedence($override_type, ArrayShapeType::union($array_shape_type_set)); - } - return $override_type; - } - - /** - * @return ?UnionType - */ - public function getThisPropertyIfOverridden(string $name) - { - if (!$this->scope->hasVariableWithName(self::VAR_NAME_THIS_PROPERTIES)) { - return null; - } - $types = $this->scope->getVariableByName(self::VAR_NAME_THIS_PROPERTIES)->getUnionType(); - if ($types->isEmpty()) { - return null; - } - - $result = UnionType::empty(); - foreach ($types->getTypeSet() as $type) { - if (!$type instanceof ArrayShapeType) { - return null; - } - $extra = $type->getFieldTypes()[$name] ?? null; - if (!$extra || $extra->getIsPossiblyUndefined()) { - return null; - } - $result = $result->withUnionType($extra); - } - return $result; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/AddressableElement.php b/vendor/phan/phan/src/Phan/Language/Element/AddressableElement.php deleted file mode 100644 index 137e3d0..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/AddressableElement.php +++ /dev/null @@ -1,339 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use AssertionError; -use Closure; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Context; -use Phan\Language\FileRef; -use Phan\Language\FQSEN; -use Phan\Language\FQSEN\FullyQualifiedGlobalStructuralElement; -use Phan\Language\UnionType; -use Phan\Memoize; - -/** - * An addressable element is a TypedElement with an FQSEN. - * (E.g. a class, property, function, method, etc.) - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -abstract class AddressableElement extends TypedElement implements AddressableElementInterface -{ - use Memoize; - - /** - * @var FQSEN - * A fully qualified name for the element - */ - protected $fqsen; - - /** - * @var array<string,FileRef> - * A list of locations in which this typed structural - * element is referenced from. - * References from the same file and line are deduplicated to save memory. - */ - protected $reference_list = []; - - /** - * @var ?string - * The doc comment of the element - */ - protected $doc_comment; - - /** - * @var bool - * Has this element been hydrated yet? - * (adding information from ancestor classes for more detailed type information) - */ - protected $is_hydrated = false; - - /** - * @param Context $context - * The context in which the structural element lives - * - * @param string $name - * The name of the typed structural element - * - * @param UnionType $type - * A '|' delimited set of types satisfied by this - * typed structural element. - * - * @param int $flags - * The flags property contains node specific flags. It is - * always defined, but for most nodes it is always zero. - * ast\kind_uses_flags() can be used to determine whether - * a certain kind has a meaningful flags value. - * - * @param FQSEN $fqsen - * A fully qualified name for the element - */ - public function __construct( - Context $context, - string $name, - UnionType $type, - int $flags, - FQSEN $fqsen - ) { - parent::__construct( - $context, - $name, - $type, - $flags - ); - - $this->setFQSEN($fqsen); - } - - /** - * @return FQSEN - * The fully-qualified structural element name of this - * structural element - */ - public function getFQSEN() - { - return $this->fqsen; - } - - /** - * @param FQSEN $fqsen - * A fully qualified structural element name to set on - * this element - * - * @return void - */ - public function setFQSEN(FQSEN $fqsen) - { - $this->fqsen = $fqsen; - } - - /** - * @return bool true if this element's visibility - * is strictly more visible than $other (public > protected > private) - */ - public function isStrictlyMoreVisibleThan(AddressableElementInterface $other) : bool - { - if ($this->isPrivate()) { - return false; - } // $this is public or protected - - if ($other->isPrivate()) { - return true; - } - - if ($other->isProtected()) { - // True if this is public. - return !$this->isProtected(); - } - // $other is public - return false; - } - - /** - * @return bool - * True if this is a public property - */ - public function isPublic() : bool - { - return !( - $this->isProtected() || $this->isPrivate() - ); - } - - /** - * @return bool - * True if this is a protected element - */ - public function isProtected() : bool - { - return $this->getFlagsHasState(\ast\flags\MODIFIER_PROTECTED); - } - - /** - * @return bool - * True if this is a private element - */ - public function isPrivate() : bool - { - return $this->getFlagsHasState(\ast\flags\MODIFIER_PRIVATE); - } - - /** - * @param CodeBase $code_base (@phan-unused-param, this is used by subclasses) - * The code base in which this element exists. - * - * @return bool - * True if this is marked as an `(at)internal` element - */ - public function isNSInternal(CodeBase $code_base) : bool - { - return $this->getPhanFlagsHasState(Flags::IS_NS_INTERNAL); - } - - /** - * Set this element as being `internal`. - * @return void - */ - public function setIsNSInternal(bool $is_internal) - { - $this->setPhanFlags(Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_NS_INTERNAL, - $is_internal - )); - } - - /** - * @param CodeBase $code_base (@phan-unused-param, this is used by subclasses) - * The code base in which this element exists. - * - * @return bool - * True if this element is intern - */ - public function isNSInternalAccessFromContext( - CodeBase $code_base, - Context $context - ) : bool { - // Figure out which namespace this element is within - $element_namespace = $this->getElementNamespace() ?: '\\'; - - // Get our current namespace from the context - $context_namespace = $context->getNamespace() ?: '\\'; - - // Test to see if the context is within the same - // namespace as where the element is defined - return (0 === \strcasecmp($context_namespace, $element_namespace)); - } - - /** - * @param FileRef $file_ref - * A reference to a location in which this typed structural - * element is referenced. - * - * @return void - */ - public function addReference(FileRef $file_ref) - { - if (Config::get_track_references()) { - // Currently, we don't need to track references to PHP-internal methods/functions/constants - // such as PHP_VERSION, strlen(), Closure::bind(), etc. - // This may change in the future. - if ($this->isPHPInternal()) { - return; - } - $this->reference_list[$file_ref->__toString()] = $file_ref; - } - } - - /** - * Copy addressable references from an element of the same subclass - * @return void - */ - public function copyReferencesFrom(AddressableElement $element) - { - if ($this === $element) { - // Should be impossible - return; - } - foreach ($element->reference_list as $key => $file_ref) { - $this->reference_list[$key] = $file_ref; - } - } - - /** - * @return array<string,FileRef> - * A list of references to this typed structural element. - */ - public function getReferenceList() : array - { - return $this->reference_list; - } - - /** - * @param CodeBase $code_base (@phan-unused-param) - * Some elements may need access to the code base to - * figure out their total reference count. - * - * @return int - * The number of references to this typed structural element - */ - public function getReferenceCount( - CodeBase $code_base - ) : int { - return \count($this->reference_list); - } - - /** - * This method must be called before analysis - * begins. - * - * @return void - * @override - */ - public function hydrate(CodeBase $code_base) - { - if ($this->is_hydrated) { // Same as isFirstExecution(), inlined due to being called frequently. - return; - } - $this->is_hydrated = true; - - $this->hydrateOnce($code_base); - } - - /** - * @return void - */ - protected function hydrateOnce(CodeBase $unused_code_base) - { - // Do nothing unless overridden - } - - /** - * Returns the namespace in which this element was declared - */ - public function getElementNamespace() : string - { - $element_fqsen = $this->getFQSEN(); - if (!$element_fqsen instanceof FullyQualifiedGlobalStructuralElement) { - throw new AssertionError('Expected $this->element_fqsen to be FullyQualifiedGlobalStructuralElement'); - } - - // Figure out which namespace this element is within - return $element_fqsen->getNamespace(); - } - - /** - * Used by daemon mode to restore an element to the state it had before parsing. - * @internal - * @return ?Closure - */ - abstract public function createRestoreCallback(); - - /** - * @param ?string $doc_comment the 'docComment' for this element, if any exists. - * @return void - */ - public function setDocComment(string $doc_comment = null) - { - $this->doc_comment = $doc_comment; - } - - /** - * @return ?string the 'docComment' for this element, if any exists. - */ - public function getDocComment() - { - return $this->doc_comment; - } - - /** - * @return string the representation of this FQSEN for issue messages. - * Overridden in some subclasses - * @suppress PhanUnreferencedPublicMethod (inference error?) - */ - public function getRepresentationForIssue() : string - { - return $this->getFQSEN()->__toString(); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/AddressableElementInterface.php b/vendor/phan/phan/src/Phan/Language/Element/AddressableElementInterface.php deleted file mode 100644 index 44b6144..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/AddressableElementInterface.php +++ /dev/null @@ -1,173 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\FileRef; -use Phan\Language\FQSEN; - -/** - * An AddressableElementInterface is a TypedElementInterface with an FQSEN. - * (e.g. represents a class, property, function, etc.) - */ -interface AddressableElementInterface extends TypedElementInterface -{ - /** - * @return FQSEN - * The fully-qualified structural element name of this - * structural element - */ - public function getFQSEN(); - - /** - * Sets the fully qualified structural element name of this element. - * @param FQSEN $fqsen - * @return void - */ - public function setFQSEN(FQSEN $fqsen); - - /** - * @return bool true if this element's visibility - * is strictly more visible than $other (public > protected > private) - */ - public function isStrictlyMoreVisibleThan(AddressableElementInterface $other) : bool; - - /** - * @return bool - * True if this is a public property - */ - public function isPublic() : bool; - - /** - * @return bool - * True if this is a protected property - */ - public function isProtected() : bool; - - /** - * @return bool - * True if this is a private property - */ - public function isPrivate() : bool; - - /** - * Track a location $file_ref in which this typed structural element - * is referenced. - * - * @param FileRef $file_ref - * @return void - */ - public function addReference(FileRef $file_ref); - - /** - * @return FileRef[] - * A list of references to this typed structural element. - */ - public function getReferenceList() : array; - - /** - * @param CodeBase $code_base - * Some elements may need access to the code base to - * figure out their total reference count. - * - * @return int - * The number of references to this typed structural element - */ - public function getReferenceCount( - CodeBase $code_base - ) : int; - - /** - * @return string For use in the language server protocol. - */ - public function getMarkupDescription() : string; - - /** - * @return ?string the 'docComment' for this element, if any exists. - */ - public function getDocComment(); - - /** - * @return Context - * The context in which this structural element exists - */ - public function getContext() : Context; - - /** - * @return bool - * True if this element is marked as deprecated - */ - public function isDeprecated() : bool; - - /** - * Set this element as deprecated or not deprecated - * - * @param bool $is_deprecated - * - * @return void - */ - public function setIsDeprecated(bool $is_deprecated); - - /** - * Set the list of issue names ($suppress_issue_list) to suppress - * - * @param array<int,string> $suppress_issue_list - * - * @return void - * @deprecated - */ - public function setSuppressIssueList(array $suppress_issue_list); - - /** - * Set the set of issue names ($suppress_issue_list) to suppress - * - * @param array<string,int> $suppress_issue_set - * - * @return void - */ - public function setSuppressIssueSet(array $suppress_issue_set); - - /** - * @return array<string,int> - * Returns a map from issue name to count of suppressions - */ - public function getSuppressIssueList() : array; - - /** - * Increments the number of times $issue_name was suppressed. - * @return void - */ - public function incrementSuppressIssueCount(string $issue_name); - - /** - * return bool - * True if this element would like to suppress the given - * issue name - */ - public function hasSuppressIssue(string $issue_name) : bool; - - /** - * @return bool - * True if this element would like to suppress the given - * issue name. - * - * If this is true, this automatically calls incrementSuppressIssueCount. - * Most callers should use this, except for uses similar to UnusedSuppressionPlugin - */ - public function checkHasSuppressIssueAndIncrementCount(string $issue_name) : bool; - - /** - * @return bool - * True if this was an internal PHP object - */ - public function isPHPInternal() : bool; - - /** - * This method must be called before analysis - * begins. - * - * @return void - */ - public function hydrate(CodeBase $code_base); -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/ClassAliasRecord.php b/vendor/phan/phan/src/Phan/Language/Element/ClassAliasRecord.php deleted file mode 100644 index 81e19b4..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/ClassAliasRecord.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\Language\Context; -use Phan\Language\FQSEN\FullyQualifiedClassName; - -/** - * A ClassAliasRecord represents the information Phan parsed from calls - * to class_alias() within the codebase (FQSEN and location of alias creation) - * - * The original class is mapped to a set of ClassAliasRecord - */ -class ClassAliasRecord -{ - - /** @var FullyQualifiedClassName the FQSEN of the alias that will be created. */ - public $alias_fqsen; - - /** @var Context - the context of the class_alias() call */ - public $context; - - /** @var int - the line number of the class_alias() call */ - public $lineno; - - public function __construct(FullyQualifiedClassName $alias_fqsen, Context $context, int $lineno) - { - $this->alias_fqsen = $alias_fqsen; - $this->context = $context; - $this->lineno = $lineno; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/ClassConstant.php b/vendor/phan/phan/src/Phan/Language/Element/ClassConstant.php deleted file mode 100644 index 133cc26..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/ClassConstant.php +++ /dev/null @@ -1,183 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\AST\ASTReverter; -use Phan\Language\Context; -use Phan\Language\FQSEN\FullyQualifiedClassConstantName; -use Phan\Language\UnionType; - -/** - * ClassConstant represents the information Phan has - * about the declaration of a class constant. - */ -class ClassConstant extends ClassElement implements ConstantInterface -{ - use ConstantTrait; - - /** - * @param Context $context - * The context in which the structural element lives - * - * @param string $name - * The name of the typed structural element - * - * @param UnionType $type - * A '|' delimited set of types satisfied by this - * typed structural element. - * - * @param int $flags - * The flags property contains node specific flags. It is - * always defined, but for most nodes it is always zero. - * ast\kind_uses_flags() can be used to determine whether - * a certain kind has a meaningful flags value. - * - * @param FullyQualifiedClassConstantName $fqsen - * A fully qualified name for the class constant - */ - public function __construct( - Context $context, - string $name, - UnionType $type, - int $flags, - FullyQualifiedClassConstantName $fqsen - ) { - parent::__construct( - $context, - $name, - $type, - $flags, - $fqsen - ); - - // Presume that this is the original definition - // of this class constant, and let it be overwritten - // if it isn't. - $this->setDefiningFQSEN($fqsen); - } - - /** - * Override the default getter to fill in a future - * union type if available. - * - * @return UnionType - */ - public function getUnionType() : UnionType - { - if (null !== ($union_type = $this->getFutureUnionType())) { - $this->setUnionType($this->getUnionType()->withUnionType($union_type)); - } - - return parent::getUnionType(); - } - - /** - * @return FullyQualifiedClassConstantName - * The fully-qualified structural element name of this - * structural element - */ - public function getFQSEN() : FullyQualifiedClassConstantName - { - return $this->fqsen; - } - - public function __toString() : string - { - return $this->getVisibilityName() . ' const ' . $this->getName(); - } - - /** - * Used for generating issue messages - */ - public function asVisibilityAndFQSENString() : string - { - return $this->getVisibilityName() . ' ' . - $this->getClassFQSEN()->__toString() . - '::' . - $this->getName(); - } - - /** - * @return bool - * True if this class constant is intended to be an override of another class constant (contains (at)override) - */ - public function isOverrideIntended() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_OVERRIDE_INTENDED); - } - - /** - * Records whether or not this class constant is intended to be an override of another class constant (contains (at)override in PHPDoc) - * @param bool $is_override_intended - - * @return void - */ - public function setIsOverrideIntended(bool $is_override_intended) - { - $this->setPhanFlags( - Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_OVERRIDE_INTENDED, - $is_override_intended - ) - ); - } - - public function getMarkupDescription() : string - { - $string = ''; - - if ($this->isProtected()) { - $string .= 'protected '; - } elseif ($this->isPrivate()) { - $string .= 'private '; - } - - $string .= 'const ' . $this->getName() . ' = '; - $value_node = $this->getNodeForValue(); - $string .= ASTReverter::toShortString($value_node); - return $string; - } - - /** - * Returns the visibility of this class constant - * (either 'public', 'protected', or 'private') - */ - public function getVisibilityName() : string - { - if ($this->isPrivate()) { - return 'private'; - } elseif ($this->isProtected()) { - return 'protected'; - } else { - return 'public'; - } - } - - /** - * Converts this class constant to a stub php snippet that can be used by `tool/make_stubs` - */ - public function toStub() : string - { - $string = ' '; - if ($this->isPrivate()) { - $string .= 'private '; - } elseif ($this->isProtected()) { - $string .= 'protected '; - } - - // For PHP 7.0 compatibility of stubs, - // show public class constants as 'const', not 'public const'. - // Also, PHP modules probably won't have private/protected constants. - $string .= 'const ' . $this->getName() . ' = '; - $fqsen = $this->getFQSEN()->__toString(); - if (\defined($fqsen)) { - // TODO: Could start using $this->getNodeForValue()? - // NOTE: This is used by tool/make_stubs, which is why it uses reflection instead of getting a node. - $string .= \var_export(\constant($fqsen), true) . ';'; - } else { - $string .= "null; // could not find"; - } - return $string; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/ClassElement.php b/vendor/phan/phan/src/Phan/Language/Element/ClassElement.php deleted file mode 100644 index 2bab316..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/ClassElement.php +++ /dev/null @@ -1,299 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use AssertionError; -use Phan\CodeBase; -use Phan\Exception\CodeBaseException; -use Phan\Exception\RecursionDepthException; -use Phan\Language\Context; -use Phan\Language\FQSEN; -use Phan\Language\FQSEN\FullyQualifiedClassElement; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\UnionType; -use TypeError; - -/** - * ClassElement is a base class of an element belonging to a class/trait/interface - * (such as properties, methods, and class constants) - */ -abstract class ClassElement extends AddressableElement -{ - /** @var FullyQualifiedClassName the FQSEN of the class this ClassElement belongs to */ - private $class_fqsen; - - public function __construct( - Context $context, - string $name, - UnionType $type, - int $flags, - FullyQualifiedClassElement $fqsen - ) { - parent::__construct($context, $name, $type, $flags, $fqsen); - $this->class_fqsen = $fqsen->getFullyQualifiedClassName(); - } - - /** - * @param FullyQualifiedClassElement $fqsen - * @return void - * @override - * @suppress PhanParamSignatureMismatch deliberately more specific - */ - public function setFQSEN(FQSEN $fqsen) - { - if (!($fqsen instanceof FullyQualifiedClassElement)) { - throw new TypeError('Expected $fqsen to be a subclass of Phan\Language\Element\FullyQualifiedClassElement'); - } - parent::setFQSEN($fqsen); - $this->class_fqsen = $fqsen->getFullyQualifiedClassName(); - } - - /** - * @var FullyQualifiedClassElement|null - * The FQSEN of this element where it is originally - * defined. - */ - private $defining_fqsen = null; - - /** - * @return bool - * True if this element has a defining FQSEN defined - */ - public function hasDefiningFQSEN() : bool - { - return ($this->defining_fqsen != null); - } - - /** - * @return FullyQualifiedClassElement - * The FQSEN of this class element from where it was - * originally defined - */ - public function getDefiningFQSEN() : FullyQualifiedClassElement - { - if ($this->defining_fqsen === null) { - throw new AssertionError('should check hasDefiningFQSEN'); - } - return $this->defining_fqsen; - } - - /** - * Gets the real defining FQSEN. - * This differs from getDefiningFQSEN() if the definition was from a trait. - * - * @return FullyQualifiedClassElement - */ - public function getRealDefiningFQSEN() - { - return $this->getDefiningFQSEN(); - } - - /** - * @return FullyQualifiedClassName - * The FQSEN of this class element from where it was - * originally defined - * - * @throws CodeBaseException if this was called without first checking - * if hasDefiningFQSEN() - */ - public function getDefiningClassFQSEN() : FullyQualifiedClassName - { - if (\is_null($this->defining_fqsen)) { - throw new CodeBaseException( - $this->getFQSEN(), - "No defining class for {$this->getFQSEN()}" - ); - } - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $this->defining_fqsen->getFullyQualifiedClassName(); - } - - /** - * Sets the FQSEN of the class element in the location in which - * the element was originally defined. - * - * @param FullyQualifiedClassElement $defining_fqsen - * @return void - */ - public function setDefiningFQSEN( - FullyQualifiedClassElement $defining_fqsen - ) { - $this->defining_fqsen = $defining_fqsen; - } - - /** - * @return Clazz - * The class on which this element was originally defined - * @throws CodeBaseException if hasDefiningFQSEN is false - */ - public function getDefiningClass(CodeBase $code_base) : Clazz - { - $class_fqsen = $this->getDefiningClassFQSEN(); - - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - throw new CodeBaseException( - $class_fqsen, - "Defining class $class_fqsen for {$this->getFQSEN()} not found" - ); - } - - return $code_base->getClassByFQSEN($class_fqsen); - } - - /** - * @return FullyQualifiedClassName - * The FQSEN of the class on which this element lives - */ - public function getClassFQSEN() : FullyQualifiedClassName - { - return $this->class_fqsen; - } - - /** - * @param CodeBase $code_base - * The code base with which to look for classes - * - * @return Clazz - * The class that defined this element - * - * @throws CodeBaseException - * An exception may be thrown if we can't find the - * class - */ - public function getClass( - CodeBase $code_base - ) : Clazz { - $class_fqsen = $this->class_fqsen; - - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - throw new CodeBaseException( - $class_fqsen, - "Defining class $class_fqsen for {$this->getFQSEN()} not found" - ); - } - - return $code_base->getClassByFQSEN($class_fqsen); - } - - /** - * @return bool - * True if this element overrides another element - */ - public function getIsOverride() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_OVERRIDE); - } - - /** - * Sets whether this element overrides another element - * - * @param bool $is_override - * True if this element overrides another element - * - * @return void - */ - public function setIsOverride(bool $is_override) - { - $this->setPhanFlags(Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_OVERRIDE, - $is_override - )); - } - - /** - * @return bool - * True if this is a static element - */ - public function isStatic() : bool - { - return $this->getFlagsHasState(\ast\flags\MODIFIER_STATIC); - } - - /** - * @param CodeBase $code_base - * The code base in which this element exists. - * - * @return bool - * True if this is an internal element - */ - public function isNSInternal(CodeBase $code_base) : bool - { - return ( - parent::isNSInternal($code_base) - || $this->getClass($code_base)->isNSInternal($code_base) - ); - } - - public function getElementNamespace() : string - { - // Get the namespace that the class is within - return $this->getClassFQSEN()->getNamespace() ?: '\\'; - } - - /** - * @param CodeBase $code_base used for access checks to protected properties - * @param ?FullyQualifiedClassName $accessing_class_fqsen the class FQSEN of the current scope. - * null if in the global scope. - * @return bool true if this can be accessed from the scope of $accessing_class_fqsen - */ - public function isAccessibleFromClass(CodeBase $code_base, $accessing_class_fqsen) : bool - { - if ($this->isPublic()) { - return true; - } - if (!$accessing_class_fqsen) { - // Accesses from outside class scopes can only access public FQSENs - return false; - } - $defining_fqsen = $this->getDefiningClassFQSEN(); - if ($defining_fqsen === $accessing_class_fqsen) { - return true; - } - $real_defining_fqsen = $this->getRealDefiningFQSEN()->getFullyQualifiedClassName(); - if ($real_defining_fqsen === $accessing_class_fqsen) { - return true; - } - if ($this->isPrivate()) { - if ($code_base->hasClassWithFQSEN($defining_fqsen)) { - $defining_class = $code_base->getClassByFQSEN($defining_fqsen); - foreach ($defining_class->getTraitFQSENList() as $trait_fqsen) { - if ($trait_fqsen === $accessing_class_fqsen) { - return true; - } - } - } - return false; - } - return self::checkCanAccessProtectedElement($code_base, $defining_fqsen, $accessing_class_fqsen); - } - - /** - * Check if a class can access a protected property defined in another class. - * - * Precondition: The property in $defining_fqsen is protected. - */ - private static function checkCanAccessProtectedElement(CodeBase $code_base, FullyQualifiedClassName $defining_fqsen, FullyQualifiedClassName $accessing_class_fqsen) : bool - { - $accessing_class_type = $accessing_class_fqsen->asType(); - $type_of_class_of_property = $defining_fqsen->asType(); - - // If the definition of the property is protected, - // then the subclasses of the defining class can access it. - try { - foreach ($accessing_class_type->asExpandedTypes($code_base)->getTypeSet() as $type) { - if ($type->canCastToType($type_of_class_of_property)) { - return true; - } - } - // and base classes of the defining class can access it - foreach ($type_of_class_of_property->asExpandedTypes($code_base)->getTypeSet() as $type) { - if ($type->canCastToType($accessing_class_type)) { - return true; - } - } - } catch (RecursionDepthException $_) { - } - return false; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Clazz.php b/vendor/phan/phan/src/Phan/Language/Element/Clazz.php deleted file mode 100644 index 6fbe968..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Clazz.php +++ /dev/null @@ -1,3259 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use ast; -use ast\Node; -use Closure; -use LogicException; -use Phan\Analysis\AbstractMethodAnalyzer; -use Phan\Analysis\ClassInheritanceAnalyzer; -use Phan\Analysis\CompositionAnalyzer; -use Phan\Analysis\DuplicateClassAnalyzer; -use Phan\Analysis\ParentConstructorCalledAnalyzer; -use Phan\Analysis\PropertyTypesAnalyzer; -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\CodeBaseException; -use Phan\Exception\IssueException; -use Phan\Exception\RecursionDepthException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Comment\Property as CommentProperty; -use Phan\Language\ElementContext; -use Phan\Language\FileRef; -use Phan\Language\FQSEN\FullyQualifiedClassConstantName; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\FQSEN\FullyQualifiedPropertyName; -use Phan\Language\Scope\ClassScope; -use Phan\Language\Scope\GlobalScope; -use Phan\Language\Type; -use Phan\Language\Type\IterableType; -use Phan\Language\Type\LiteralStringType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\TemplateType; -use Phan\Language\UnionType; -use Phan\Library\None; -use Phan\Library\Option; -use Phan\Library\Some; -use Phan\Memoize; -use Phan\Plugin\ConfigPluginSet; -use ReflectionClass; -use ReflectionProperty; -use RuntimeException; - -use function count; -use function is_string; - -/** - * Clazz represents the information Phan knows about a class, trait, or interface, - * the state of Phan populating that information (hydration), - * and methods to access that information. - * - * @see CodeBase for the data structures used for looking up classes or elements of classes (properties, methods, constants, etc) - * - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class Clazz extends AddressableElement -{ - use Memoize; - use ClosedScopeElement; - - /** - * @var Type|null - * The type of the parent of this class if it extends - * anything, else null. - */ - private $parent_type = null; - - /** - * @var int - * The line number of the parent of this class if it extends - * anything, else 0 if unknown/missing. - */ - private $parent_type_lineno = 0; - - /** - * @var array<int,FullyQualifiedClassName> - * A possibly empty list of interfaces implemented - * by this class - */ - private $interface_fqsen_list = []; - - /** - * @var array<int,int> - * Line numbers for indices of interface_fqsen_list. - */ - private $interface_fqsen_lineno = []; - - /** - * @var array<int,FullyQualifiedClassName> - * A possibly empty list of traits used by this class - */ - private $trait_fqsen_list = []; - - /** - * @var array<int,int> - * Line numbers for indices of trait_fqsen_list - */ - private $trait_fqsen_lineno = []; - - /** - * @var array<string,TraitAdaptations> - * Maps lowercase fqsen of a method to the trait names which are hidden - * and the trait aliasing info - */ - private $trait_adaptations_map = []; - - /** - * @var bool - hydrate() will check for this to avoid prematurely hydrating while looking for values of class constants. - */ - private $did_finish_parsing = true; - - /** - * @var ?UnionType for Type->asExpandedTypes() - * - * TODO: This won't reverse in daemon mode? - */ - private $additional_union_types = null; - - /** - * An additional id to disambiguate classes on the same line - * https://github.com/phan/phan/issues/1988 - */ - private $decl_id = 0; - - /** - * @param Context $context - * The context in which the structural element lives - * - * @param string $name - * The name of the typed structural element - * - * @param UnionType $type - * A '|' delimited set of types satisfied by this - * typed structural element. - * - * @param int $flags - * The flags property contains node specific flags. It is - * always defined, but for most nodes it is always zero. - * ast\kind_uses_flags() can be used to determine whether - * a certain kind has a meaningful flags value. - * - * @param FullyQualifiedClassName $fqsen - * A fully qualified name for this class - * - * @param Type|null $parent_type - * @param array<int,FullyQualifiedClassName> $interface_fqsen_list - * @param array<int,FullyQualifiedClassName> $trait_fqsen_list - */ - public function __construct( - Context $context, - string $name, - UnionType $type, - int $flags, - FullyQualifiedClassName $fqsen, - Type $parent_type = null, - array $interface_fqsen_list = [], - array $trait_fqsen_list = [] - ) { - parent::__construct( - $context, - $name, - $type, - $flags, - $fqsen - ); - - $this->parent_type = $parent_type; - $this->interface_fqsen_list = $interface_fqsen_list; - $this->trait_fqsen_list = $trait_fqsen_list; - - $this->setInternalScope(new ClassScope( - $context->getScope(), - $fqsen, - $flags - )); - } - - private static function getASTFlagsForReflectionProperty(ReflectionProperty $prop) : int - { - if ($prop->isPrivate()) { - return \ast\flags\MODIFIER_PRIVATE; - } elseif ($prop->isProtected()) { - return \ast\flags\MODIFIER_PROTECTED; - } - return 0; - } - - /** - * @param CodeBase $code_base - * A reference to the entire code base in which this - * context exists - * - * @param ReflectionClass $class - * A reflection class representing a builtin class. - * - * @return Clazz - * A Class structural element representing the given named - * builtin. - */ - public static function fromReflectionClass( - CodeBase $code_base, - ReflectionClass $class - ) : Clazz { - // Build a set of flags based on the constitution - // of the built-in class - $flags = 0; - if ($class->isFinal()) { - $flags = \ast\flags\CLASS_FINAL; - } elseif ($class->isInterface()) { - $flags = \ast\flags\CLASS_INTERFACE; - } elseif ($class->isTrait()) { - $flags = \ast\flags\CLASS_TRAIT; - } - if ($class->isAbstract()) { - $flags |= \ast\flags\CLASS_ABSTRACT; - } - - $context = new Context(); - - $class_name = $class->getName(); - // @phan-suppress-next-line PhanThrowTypeAbsentForCall should be valid if extension is valid - $class_fqsen = FullyQualifiedClassName::fromFullyQualifiedString($class_name); - - // Build a base class element - $clazz = new Clazz( - $context, - $class_name, - UnionType::fromFullyQualifiedString('\\' . $class_name), - $flags, - $class_fqsen - ); - - // If this class has a parent class, add it to the - // class info - if (($parent_class = $class->getParentClass())) { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall should be valid if extension is valid - $parent_class_fqsen = FullyQualifiedClassName::fromFullyQualifiedString( - '\\' . $parent_class->getName() - ); - - $parent_type = $parent_class_fqsen->asType(); - - $clazz->setParentType($parent_type); - } - - if ($class_name === "Traversable") { - // Make sure that canCastToExpandedUnionType() works as expected for Traversable and its subclasses - $clazz->addAdditionalType(IterableType::instance(false)); - } - - $class_scope = new ClassScope(new GlobalScope(), $class_fqsen, $flags); - - // Note: If there are multiple calls to Clazz->addProperty(), - // the UnionType from the first one will be used, subsequent calls to addProperty() - // will have no effect. - // As a result, we set the types from Phan's documented internal property types first, - // preferring them over the default values (which may be null, etc.). - foreach (UnionType::internalPropertyMapForClassName( - $clazz->getName() - ) as $property_name => $property_type_string) { - // An asterisk indicates that the class supports - // dynamic properties - if ($property_name === '*') { - $clazz->setHasDynamicProperties(true); - continue; - } - - $property_context = $context->withScope($class_scope); - - $property_type = - UnionType::fromStringInContext( - $property_type_string, - new Context(), - Type::FROM_TYPE - ); - - $property_fqsen = FullyQualifiedPropertyName::make( - $clazz->getFQSEN(), - $property_name - ); - - $flags = 0; - if ($class->hasProperty($property_name)) { - $flags = self::getASTFlagsForReflectionProperty($class->getProperty($property_name)); - } - - $property = new Property( - $property_context, - $property_name, - $property_type, - $flags, - $property_fqsen - ); - - $clazz->addProperty($code_base, $property, new None()); - } - - // n.b.: public properties on internal classes don't get - // listed via reflection until they're set unless - // they have a default value. Therefore, we don't - // bother iterating over `$class->getProperties()` - // `$class->getStaticProperties()`. - - foreach ($class->getDefaultProperties() as $name => $default_value) { - $property_context = $context->withScope($class_scope); - - $property_fqsen = FullyQualifiedPropertyName::make( - $clazz->getFQSEN(), - $name - ); - - if ($clazz->hasPropertyWithName($code_base, $name)) { - continue; - } - $flags = 0; - if ($class->hasProperty($name)) { - $flags = self::getASTFlagsForReflectionProperty($class->getProperty($name)); - } - $property = new Property( - $property_context, - $name, - Type::fromObject($default_value)->asUnionType(), - $flags, - $property_fqsen - ); - - $clazz->addProperty($code_base, $property, new None()); - } - - foreach ($class->getInterfaceNames() as $name) { - $clazz->addInterfaceClassFQSEN( - // @phan-suppress-next-line PhanThrowTypeAbsentForCall should be valid if extension is valid - FullyQualifiedClassName::fromFullyQualifiedString( - '\\' . $name - ) - ); - } - - foreach ($class->getTraitNames() as $name) { - // TODO: optionally, support getTraitAliases()? This is low importance for internal PHP modules, - // it would be uncommon to see traits in internal PHP modules. - $clazz->addTraitFQSEN( - // @phan-suppress-next-line PhanThrowTypeAbsentForCall should be valid if extension is valid - FullyQualifiedClassName::fromFullyQualifiedString( - '\\' . $name - ) - ); - } - - foreach ($class->getConstants() as $name => $value) { - $constant_fqsen = FullyQualifiedClassConstantName::make( - $clazz->getFQSEN(), - $name - ); - - $constant = new ClassConstant( - $context, - $name, - Type::fromObject($value)->asUnionType(), - 0, - $constant_fqsen - ); - $constant->setNodeForValue($value); - - $clazz->addConstant($code_base, $constant); - } - - foreach ($class->getMethods() as $reflection_method) { - $method_context = $context->withScope($class_scope); - - $method_list = - FunctionFactory::methodListFromReflectionClassAndMethod( - $method_context, - $class, - $reflection_method - ); - - foreach ($method_list as $method) { - $clazz->addMethod($code_base, $method, new None()); - } - } - self::addTargetedPHPVersionMethodsToInternalClass($code_base, $clazz); - - return $clazz; - } - - private static function addTargetedPHPVersionMethodsToInternalClass(CodeBase $code_base, Clazz $clazz) - { - if (Config::get_closest_target_php_version_id() >= 70100 && \PHP_VERSION_ID < 70100) { - self::addPHP71MethodsToInternalClass($code_base, $clazz); - } - } - - /** - * TODO: Store all of the classes and methods to modify in a config. Maybe reuse the delta files - * @return void - */ - private static function addPHP71MethodsToInternalClass(CodeBase $code_base, Clazz $clazz) - { - if (!Config::getValue('pretend_newer_core_methods_exist')) { - return; - } - $class_fqsen = $clazz->getFQSEN(); - $class_fqsen_string = \strtolower($class_fqsen->__toString()); - if ($class_fqsen_string === '\closure') { - $parameter_list = [ - new Parameter($clazz->getContext(), 'callable', UnionType::fromFullyQualifiedString('callable'), 0) - ]; - $method = new Method( - $clazz->getContext(), - 'fromCallable', - UnionType::fromFullyQualifiedString('\Closure'), - \ast\flags\MODIFIER_STATIC, - FullyQualifiedMethodName::make($class_fqsen, 'fromCallable'), - $parameter_list - ); - $method->setNumberOfRequiredParameters(1); - $method->setNumberOfOptionalParameters(0); - $method->setRealParameterList($parameter_list); - $method->setUnionType(UnionType::fromFullyQualifiedString('\Closure')); - $clazz->addMethod($code_base, $method, new None()); - } - } - - /** - * @param Type $parent_type - * The type of the parent (extended) class of this class. - * - * @return void - */ - public function setParentType(Type $parent_type, int $lineno = 0) - { - if ($this->getInternalScope()->hasAnyTemplateType()) { - // Get a reference to the local list of templated - // types. We'll use this to map templated types on the - // parent to locally templated types. - $template_type_map = - $this->getInternalScope()->getTemplateTypeMap(); - - // Figure out if the given parent type contains any template - // types. - $contains_templated_type = false; - foreach ($parent_type->getTemplateParameterTypeList() as $union_type) { - foreach ($union_type->getTypeSet() as $type) { - if (isset($template_type_map[$type->getName()])) { - $contains_templated_type = true; - break 2; - } - } - } - - // If necessary, map the template parameter type list through the - // local list of templated types. - if ($contains_templated_type) { - $parent_type = Type::fromType( - $parent_type, - \array_map(static function (UnionType $union_type) use ($template_type_map) : UnionType { - return UnionType::of( - \array_map(static function (Type $type) use ($template_type_map) : Type { - return $template_type_map[$type->getName()] ?? $type; - }, $union_type->getTypeSet()) - ); - }, $parent_type->getTemplateParameterTypeList()) - ); - } - } - - $this->parent_type = $parent_type; - $this->parent_type_lineno = $lineno; - - // Add the parent to the union type of this class - $this->addAdditionalType($parent_type); - } - - /** - * @return bool - * True if this class has a parent class - */ - public function hasParentType() : bool - { - return $this->parent_type !== null; - } - - /** - * @return Option<Type> - * If a parent type is defined, get Some<Type>, else None. - */ - public function getParentTypeOption() - { - if ($this->parent_type !== null) { - return new Some($this->parent_type); - } - - return new None(); - } - - /** - * @return FullyQualifiedClassName - * The parent class of this class if one exists - * - * @throws LogicException - * An exception is thrown if this class has no parent - */ - public function getParentClassFQSEN() : FullyQualifiedClassName - { - $parent_type_option = $this->getParentTypeOption(); - - if (!$parent_type_option->isDefined()) { - throw new LogicException("Class $this has no parent"); - } - - return FullyQualifiedClassName::fromType($parent_type_option->get()); - } - - /** - * @return Clazz - * The parent class of this class if defined - * - * @throws LogicException|RuntimeException - * An exception is thrown if this class has no parent - */ - public function getParentClass(CodeBase $code_base) : Clazz - { - $parent_type_option = $this->getParentTypeOption(); - - if (!$parent_type_option->isDefined()) { - throw new LogicException("Class $this has no parent"); - } - - $parent_fqsen = FullyQualifiedClassName::fromType($parent_type_option->get()); - - // invoking hasClassWithFQSEN also has the side effect of lazily loading the parent class definition. - if (!$code_base->hasClassWithFQSEN($parent_fqsen)) { - throw new RuntimeException("Failed to load parent Class $parent_fqsen of Class $this"); - } - - return $code_base->getClassByFQSEN( - $parent_fqsen - ); - } - - /** - * @return Clazz - * The parent class of this class if defined - * - * @throws LogicException|RuntimeException - * An exception is thrown if this class has no parent - */ - private function getParentClassWithoutHydrating(CodeBase $code_base) : Clazz - { - $parent_type_option = $this->getParentTypeOption(); - - if (!$parent_type_option->isDefined()) { - throw new LogicException("Class $this has no parent"); - } - - $parent_fqsen = FullyQualifiedClassName::fromType($parent_type_option->get()); - - // invoking hasClassWithFQSEN also has the side effect of lazily loading the parent class definition. - if (!$code_base->hasClassWithFQSEN($parent_fqsen)) { - throw new RuntimeException("Failed to load parent Class $parent_fqsen of Class $this"); - } - - return $code_base->getClassByFQSENWithoutHydrating( - $parent_fqsen - ); - } - - /** - * Is this a subclass of $other? - * - * This only checks parent classes. - * It should not be used for traits or interfaces. - * - * This returns false if $this === $other - */ - public function isSubclassOf(CodeBase $code_base, Clazz $other) : bool - { - if (!$this->hasParentType()) { - return false; - } - - if (!$code_base->hasClassWithFQSEN( - $this->getParentClassFQSEN() - )) { - // Let this emit an issue elsewhere for the - // parent not existing - return false; - } - - // Get the parent class - $parent = $this->getParentClass($code_base); - - if ($parent === $other) { - return true; - } - - return $parent->isSubclassOf($code_base, $other); - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return int - * This class's depth in the class hierarchy - */ - public function getHierarchyDepth(CodeBase $code_base) : int - { - if (!$this->hasParentType()) { - return 0; - } - - if (!$code_base->hasClassWithFQSEN( - $this->getParentClassFQSEN() - )) { - // Let this emit an issue elsewhere for the - // parent not existing - return 0; - } - - // Get the parent class - $parent = $this->getParentClass($code_base); - - // Prevent infinite loops - if ($parent === $this) { - return 0; - } - - return (1 + $parent->getHierarchyDepth($code_base)); - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return FullyQualifiedClassName - * The FQSEN of the root class on this class's hierarchy - */ - public function getHierarchyRootFQSEN( - CodeBase $code_base - ) : FullyQualifiedClassName { - if (!$this->hasParentType()) { - return $this->getFQSEN(); - } - - if (!$code_base->hasClassWithFQSEN( - $this->getParentClassFQSEN() - )) { - // Let this emit an issue elsewhere for the - // parent not existing - return $this->getFQSEN(); - } - - // Get the parent class - $parent = $this->getParentClass($code_base); - - // Prevent infinite loops - if ($parent === $this) { - return $this->getFQSEN(); - } - - return $parent->getHierarchyRootFQSEN($code_base); - } - - /** - * Add the given FQSEN to the list of implemented - * interfaces for this class. - * - * @param FullyQualifiedClassName $fqsen - * @return void - */ - public function addInterfaceClassFQSEN(FullyQualifiedClassName $fqsen, int $lineno = 0) - { - $this->interface_fqsen_lineno[count($this->interface_fqsen_list)] = $lineno; - $this->interface_fqsen_list[] = $fqsen; - - // Add the interface to the union type of this - // class - $this->addAdditionalType($fqsen->asType()); - } - - /** - * Get the list of interfaces implemented by this class - * @return array<int,FullyQualifiedClassName> - */ - public function getInterfaceFQSENList() : array - { - return $this->interface_fqsen_list; - } - - /** - * Add a property to this class - * - * @param CodeBase $code_base - * A reference to the code base in which the ancestor exists - * - * @param Property $property - * The property to copy onto this class - * - * @param Option<Type>|None $type_option - * A possibly defined type used to define template - * parameter types when importing the property - * - * @param bool $from_trait - * - * @return void - */ - public function addProperty( - CodeBase $code_base, - Property $property, - $type_option, - bool $from_trait = false - ) { - // Ignore properties we already have - // TODO: warn about private properties in subclass overriding ancestor private property. - $property_name = $property->getName(); - if ($this->hasPropertyWithName($code_base, $property_name)) { - // TODO: Check if trait properties would be inherited first. - // TODO: Figure out semantics and use $from_trait? - self::checkPropertyCompatibility( - $code_base, - $property, - $this->getPropertyByName($code_base, $property_name) - ); - return; - } - - $property_fqsen = FullyQualifiedPropertyName::make( - $this->getFQSEN(), - $property_name - ); - - // TODO: defer template properties until the analysis phase? They might not be parsed or resolved yet. - $original_property_fqsen = $property->getFQSEN(); - if ($original_property_fqsen !== $property_fqsen) { - $property = clone($property); - $property->setFQSEN($property_fqsen); - if ($property->getHasStaticInUnionType()) { - $property->inheritStaticUnionType($original_property_fqsen->getFullyQualifiedClassName(), $this->getFQSEN()); - } - - // Private properties of traits are accessible from the class that used that trait - // (as well as from within the trait itself). - // Also, for inheritance purposes, treat protected properties the same way. - if ($from_trait && !$property->isPublic()) { - $property->setDefiningFQSEN($property_fqsen); - } - - try { - // If we have a parent type defined, map the property's - // type through it - if ($type_option->isDefined() - && !$property->hasUnresolvedFutureUnionType() - && $property->getUnionType()->hasTemplateType() - ) { - $property->setUnionType( - $property->getUnionType()->withTemplateParameterTypeMap( - $type_option->get()->getTemplateParameterTypeMap( - $code_base - ) - ) - ); - } - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $code_base, - $property->getContext(), - $exception->getIssueInstance() - ); - } - } - - $code_base->addProperty($property); - } - - /** - * @return void - */ - private static function checkPropertyCompatibility( - CodeBase $code_base, - Property $inherited_property, - Property $overriding_property - ) { - if ($inherited_property->isFromPHPDoc() || $inherited_property->isDynamicProperty() || - $overriding_property->isFromPHPDoc() || $overriding_property->isDynamicProperty()) { - return; - } - - if ($inherited_property->isStrictlyMoreVisibleThan($overriding_property)) { - if ($inherited_property->isPHPInternal()) { - if (!$overriding_property->checkHasSuppressIssueAndIncrementCount(Issue::PropertyAccessSignatureMismatchInternal)) { - Issue::maybeEmit( - $code_base, - new ElementContext($overriding_property), - Issue::PropertyAccessSignatureMismatchInternal, - $overriding_property->getFileRef()->getLineNumberStart(), - $overriding_property->asVisibilityAndFQSENString(), - $inherited_property->asVisibilityAndFQSENString() - ); - } - } else { - if (!$overriding_property->checkHasSuppressIssueAndIncrementCount(Issue::PropertyAccessSignatureMismatchInternal)) { - Issue::maybeEmit( - $code_base, - new ElementContext($overriding_property), - Issue::PropertyAccessSignatureMismatch, - $overriding_property->getFileRef()->getLineNumberStart(), - $overriding_property, - $inherited_property, - $inherited_property->getFileRef()->getFile(), - $inherited_property->getFileRef()->getLineNumberStart() - ); - } - } - } - // original_property is the one that the class is using. - // We added $property after that (so it likely in a base class, or a trait's property added after this property was added) - if ($overriding_property->isStatic() != $inherited_property->isStatic()) { - Issue::maybeEmit( - $code_base, - new ElementContext($overriding_property), - $overriding_property->isStatic() ? Issue::AccessNonStaticToStaticProperty : Issue::AccessStaticToNonStaticProperty, - $overriding_property->getFileRef()->getLineNumberStart(), - $inherited_property->asPropertyFQSENString(), - $overriding_property->asPropertyFQSENString() - ); - } - } - - /** - * @param array<string,CommentProperty> $magic_property_map mapping from property name to property - * @param CodeBase $code_base - * @return bool whether or not we defined it. - */ - public function setMagicPropertyMap( - array $magic_property_map, - CodeBase $code_base - ) : bool { - if (count($magic_property_map) === 0) { - return true; // Vacuously true. - } - $class_fqsen = $this->getFQSEN(); - $context = $this->getContext()->withScope( - $this->getInternalScope() - ); - foreach ($magic_property_map as $comment_parameter) { - // $phan_flags can be used to indicate if something is property-read or property-write - $phan_flags = $comment_parameter->getFlags(); - $property_name = $comment_parameter->getName(); - $property_fqsen = FullyQualifiedPropertyName::make( - $class_fqsen, - $property_name - ); - $original_union_type = $comment_parameter->getUnionType(); - $union_type = $original_union_type->withStaticResolvedInContext($context); - $property = new Property( - clone($context)->withLineNumberStart($comment_parameter->getLine()), - $property_name, - $union_type, - 0, - $property_fqsen - ); - if ($original_union_type !== $union_type) { - $phan_flags |= Flags::HAS_STATIC_UNION_TYPE; - } - $property->setPhanFlags($phan_flags | Flags::IS_FROM_PHPDOC); - - $this->addProperty($code_base, $property, new None()); - } - return true; - } - - /** - * @param array<string,\Phan\Language\Element\Comment\Method> $magic_method_map mapping from method name to this. - * @param CodeBase $code_base - * @return bool whether or not we defined it. - */ - public function setMagicMethodMap( - array $magic_method_map, - CodeBase $code_base - ) : bool { - if (count($magic_method_map) === 0) { - return true; // Vacuously true. - } - $class_fqsen = $this->getFQSEN(); - $context = $this->getContext()->withScope( - $this->getInternalScope() - ); - foreach ($magic_method_map as $comment_method) { - // $flags is the same as the flags for `public` and non-internal? - // Or \ast\flags\MODIFIER_PUBLIC. - $flags = \ast\flags\MODIFIER_PUBLIC; - if ($comment_method->isStatic()) { - $flags |= \ast\flags\MODIFIER_STATIC; - } - $method_name = $comment_method->getName(); - if ($this->hasMethodWithName($code_base, $method_name)) { - // No point, and this would hurt inference accuracy. - continue; - } - $method_fqsen = FullyQualifiedMethodName::make( - $class_fqsen, - $method_name - ); - $method_context = clone($context)->withLineNumberStart($comment_method->getLine()); - $real_parameter_list = \array_map(static function (\Phan\Language\Element\Comment\Parameter $parameter) use ($method_context) : Parameter { - return $parameter->asRealParameter($method_context); - }, $comment_method->getParameterList()); - $method = new Method( - $method_context, - $method_name, - $comment_method->getUnionType(), - $flags, - $method_fqsen, - $real_parameter_list - ); - - $method->setRealParameterList($real_parameter_list); - $method->setNumberOfRequiredParameters($comment_method->getNumberOfRequiredParameters()); - $method->setNumberOfOptionalParameters($comment_method->getNumberOfOptionalParameters()); - $method->setIsFromPHPDoc(true); - - $this->addMethod($code_base, $method, new None()); - } - return true; - } - - /** - * @return bool - */ - public function hasPropertyWithName( - CodeBase $code_base, - string $name - ) : bool { - return $code_base->hasPropertyWithFQSEN( - FullyQualifiedPropertyName::make( - $this->getFQSEN(), - $name - ) - ); - } - - /** - * Returns the property $name of this class. - * @see self::hasPropertyWithName() - */ - public function getPropertyByName( - CodeBase $code_base, - string $name - ) : Property { - return $code_base->getPropertyByFQSEN( - FullyQualifiedPropertyName::make( - $this->getFQSEN(), - $name - ) - ); - } - - /** - * @param CodeBase $code_base - * A reference to the entire code base in which the - * property exists. - * - * @param string $name - * The name of the property - * - * @param Context $context - * The context of the caller requesting the property - * - * @return Property - * A property with the given name. - * Callers can check if the property is read-only when writing, - * or write-only when reading. - * - * @throws IssueException - * An exception may be thrown if the caller does not - * have access to the given property from the given - * context - */ - public function getPropertyByNameInContext( - CodeBase $code_base, - string $name, - Context $context, - bool $is_static, - Node $node = null - ) : Property { - - // Get the FQSEN of the property we're looking for - $property_fqsen = FullyQualifiedPropertyName::make( - $this->getFQSEN(), - $name - ); - - $property = null; - - // Figure out if we have the property and - // figure out if the property is accessible. - $is_property_accessible = false; - if ($code_base->hasPropertyWithFQSEN($property_fqsen)) { - $property = $code_base->getPropertyByFQSEN( - $property_fqsen - ); - if ($is_static !== $property->isStatic()) { - if ($is_static) { - throw new IssueException( - Issue::fromType(Issue::AccessPropertyNonStaticAsStatic)( - $context->getFile(), - $context->getLineNumberStart(), - [$property->asPropertyFQSENString()] - ) - ); - } else { - throw new IssueException( - Issue::fromType(Issue::AccessPropertyStaticAsNonStatic)( - $context->getFile(), - $context->getLineNumberStart(), - [$property->asPropertyFQSENString()] - ) - ); - } - } - - $is_property_accessible = $property->isAccessibleFromClass( - $code_base, - $context->getClassFQSENOrNull() - ); - } - - // If the property exists and is accessible, return it - if ($is_property_accessible) { - // @phan-suppress-next-line PhanTypeMismatchReturnNullable is_property_accessible ensures that this is non-null - return $property; - } - - // Check to see if we can use a __get magic method - // TODO: What about __set? - if (!$is_static && $this->hasMethodWithName($code_base, '__get')) { - $method = $this->getMethodByName($code_base, '__get'); - - // Make sure the magic method is accessible - // TODO: Add defined at %s:%d for the property definition - if ($method->isPrivate()) { - throw new IssueException( - Issue::fromType(Issue::AccessPropertyPrivate)( - $context->getFile(), - $context->getLineNumberStart(), - [ - $property ? $property->asPropertyFQSENString() : $property_fqsen, - $method->getContext()->getFile(), - $method->getContext()->getLineNumberStart() - ] - ) - ); - } elseif ($method->isProtected()) { - if (!self::isAccessToElementOfThis($node)) { - throw new IssueException( - Issue::fromType(Issue::AccessPropertyProtected)( - $context->getFile(), - $context->getLineNumberStart(), - [ - $property ? $property->asPropertyFQSENString() : $property_fqsen, - $method->getContext()->getFile(), - $method->getContext()->getLineNumberStart() - ] - ) - ); - } - } - - $property = new Property( - $context, - $name, - $method->getUnionType(), - 0, - $property_fqsen - ); - $property->setIsDynamicProperty(true); - - $this->addProperty($code_base, $property, new None()); - - return $property; - } elseif ($property) { - // If we have a property, but it's inaccessible, emit - // an issue - if ($property->isPrivate()) { - throw new IssueException( - Issue::fromType(Issue::AccessPropertyPrivate)( - $context->getFile(), - $context->getLineNumberStart(), - [$property->asPropertyFQSENString(), $property->getContext()->getFile(), $property->getContext()->getLineNumberStart() ] - ) - ); - } - if ($property->isProtected()) { - if (self::isAccessToElementOfThis($node)) { - return $property; - } - throw new IssueException( - Issue::fromType(Issue::AccessPropertyProtected)( - $context->getFile(), - $context->getLineNumberStart(), - [$property->asPropertyFQSENString(), $property->getContext()->getFile(), $property->getContext()->getLineNumberStart() ] - ) - ); - } - } - - // Check to see if missing properties are allowed - // or we're working with a class with dynamic - // properties such as stdClass. - if (!$is_static && (Config::getValue('allow_missing_properties') - || $this->getHasDynamicProperties($code_base)) - ) { - $property = new Property( - $context, - $name, - UnionType::empty(), - 0, - $property_fqsen - ); - $property->setIsDynamicProperty(true); - - $this->addProperty($code_base, $property, new None()); - - return $property; - } - - throw new IssueException( - Issue::fromType(Issue::UndeclaredProperty)( - $context->getFile(), - $context->getLineNumberStart(), - [$this->getFQSEN() . ($is_static ? '::$' : '->') . $name], - IssueFixSuggester::suggestSimilarProperty($code_base, $context, $this, $name, $is_static) - ) - ); - } - - /** - * Returns true if this is an access to a property or method of self/static/$this - * - * @param ?Node $node - */ - public static function isAccessToElementOfThis($node) : bool - { - if (!($node instanceof Node)) { - return false; - } - $node = $node->children['expr'] ?? $node->children['class']; - switch ($node->kind) { - case ast\AST_VAR: - $name = $node->children['name']; - return is_string($name) && $name === 'this'; - case ast\AST_CONST: - $name = $node->children['name']->children['name'] ?? null; - return is_string($name) && \strcasecmp($name, 'static') === 0; - default: - return false; - } - } - - /** - * @return array<string,Property> - * The list of properties on this class - */ - public function getPropertyMap(CodeBase $code_base) : array - { - return $code_base->getPropertyMapByFullyQualifiedClassName( - $this->getFQSEN() - ); - } - - /** - * Inherit a class constant from an ancestor class - * - * @return void - */ - public function inheritConstant( - CodeBase $code_base, - ClassConstant $constant - ) { - $constant_fqsen = FullyQualifiedClassConstantName::make( - $this->getFQSEN(), - $constant->getName() - ); - - if ($code_base->hasClassConstantWithFQSEN($constant_fqsen)) { - // If the constant with that name already exists, mark it as an override. - $overriding_constant = $code_base->getClassConstantByFQSEN($constant_fqsen); - $overriding_constant->setIsOverride(true); - self::checkConstantCompatibility( - $code_base, - $constant, - $code_base->getClassConstantByFQSEN( - $constant_fqsen - ) - ); - return; - } - - // Update the FQSEN if its not associated with this - // class yet (always true) - if ($constant->getFQSEN() !== $constant_fqsen) { - $constant = clone($constant); - $constant->setFQSEN($constant_fqsen); - } - - $code_base->addClassConstant($constant); - } - - /** - * @return void - */ - private static function checkConstantCompatibility( - CodeBase $code_base, - ClassConstant $inherited_constant, - ClassConstant $overriding_constant - ) { - // Traits don't have constants, thankfully, so the logic is simple. - if ($inherited_constant->isStrictlyMoreVisibleThan($overriding_constant)) { - if ($inherited_constant->isPHPInternal()) { - if (!$overriding_constant->checkHasSuppressIssueAndIncrementCount(Issue::ConstantAccessSignatureMismatchInternal)) { - Issue::maybeEmit( - $code_base, - $overriding_constant->getContext(), - Issue::ConstantAccessSignatureMismatchInternal, - $overriding_constant->getFileRef()->getLineNumberStart(), - $overriding_constant->asVisibilityAndFQSENString(), - $inherited_constant->asVisibilityAndFQSENString() - ); - } - } else { - if (!$overriding_constant->checkHasSuppressIssueAndIncrementCount(Issue::ConstantAccessSignatureMismatchInternal)) { - Issue::maybeEmit( - $code_base, - $overriding_constant->getContext(), - Issue::ConstantAccessSignatureMismatch, - $overriding_constant->getFileRef()->getLineNumberStart(), - $overriding_constant->asVisibilityAndFQSENString(), - $inherited_constant->asVisibilityAndFQSENString(), - $inherited_constant->getFileRef()->getFile(), - $inherited_constant->getFileRef()->getLineNumberStart() - ); - } - } - } - } - - - /** - * Add a class constant - * - * @return void - */ - public function addConstant( - CodeBase $code_base, - ClassConstant $constant - ) { - $constant_fqsen = FullyQualifiedClassConstantName::make( - $this->getFQSEN(), - $constant->getName() - ); - - // Update the FQSEN if its not associated with this - // class yet - if ($constant->getFQSEN() !== $constant_fqsen) { - $constant = clone($constant); - $constant->setFQSEN($constant_fqsen); - } - - $code_base->addClassConstant($constant); - } - - /** - * @return bool - * True if a constant with the given name is defined - * on this class. - */ - public function hasConstantWithName( - CodeBase $code_base, - string $name - ) : bool { - if ($code_base->hasClassConstantWithFQSEN( - FullyQualifiedClassConstantName::make( - $this->getFQSEN(), - $name - ) - )) { - return true; - } - if (!$this->hydrateConstantsIndicatingFirstTime($code_base)) { - return false; - } - return $code_base->hasClassConstantWithFQSEN( - FullyQualifiedClassConstantName::make( - $this->getFQSEN(), - $name - ) - ); - } - - /** - * @param CodeBase $code_base - * A reference to the entire code base in which the - * property exists. - * - * @param string $name - * The name of the class constant - * - * @param Context $context - * The context of the caller requesting the property - * - * @return ClassConstant - * A constant with the given name - * - * @throws IssueException - * An exception may be thrown if the caller does not - * have access to the given property from the given - * context - */ - public function getConstantByNameInContext( - CodeBase $code_base, - string $name, - Context $context - ) : ClassConstant { - - $constant_fqsen = FullyQualifiedClassConstantName::make( - $this->getFQSEN(), - $name - ); - - if (!$code_base->hasClassConstantWithFQSEN($constant_fqsen)) { - throw new IssueException( - Issue::fromType(Issue::UndeclaredConstant)( - $context->getFile(), - $context->getLineNumberStart(), - [ - (string)$constant_fqsen, - (string)$this->getFQSEN() - ], - IssueFixSuggester::suggestSimilarClassConstant($code_base, $context, $constant_fqsen) - ) - ); - } - - $constant = $code_base->getClassConstantByFQSEN( - $constant_fqsen - ); - - if ($constant->isPublic()) { - // Most constants are public, check that first. - return $constant; - } - - // Visibility checks for private/protected class constants: - - // Are we within a class referring to the class - // itself? - $is_local_access = ( - $context->isInClassScope() - && $context->getClassInScope($code_base) === $constant->getClass($code_base) - ); - - if ($is_local_access) { - // Classes can always access constants declared in the same class - return $constant; - } - - if ($constant->isPrivate()) { - // This is attempting to access a private constant from outside of the class - throw new IssueException( - Issue::fromType(Issue::AccessClassConstantPrivate)( - $context->getFile(), - $context->getLineNumberStart(), - [ - (string)$constant_fqsen, - $constant->getContext()->getFile(), - $constant->getContext()->getLineNumberStart() - ] - ) - ); - } - - // We now know that $constant is a protected constant - - // Are we within a class or an extending sub-class - // referring to the class? - $is_remote_access = $context->isInClassScope() - && $context->getClassInScope($code_base) - ->getUnionType()->canCastToExpandedUnionType( - $this->getUnionType(), - $code_base - ); - - if (!$is_remote_access) { - // And the access is not from anywhere on the class hierarchy, so throw - throw new IssueException( - Issue::fromType(Issue::AccessClassConstantProtected)( - $context->getFile(), - $context->getLineNumberStart(), - [ - (string)$constant_fqsen, - $constant->getContext()->getFile(), - $constant->getContext()->getLineNumberStart() - ] - ) - ); - } - - // Valid access to a protected constant. - return $constant; - } - - /** - * @return array<string,ClassConstant> - * The constants associated with this class - */ - public function getConstantMap(CodeBase $code_base) : array - { - return $code_base->getClassConstantMapByFullyQualifiedClassName( - $this->getFQSEN() - ); - } - - /** - * Add a method to this class - * - * @param CodeBase $code_base - * A reference to the code base in which the ancestor exists - * - * @param Method $method - * The method to copy onto this class - * - * @param Option<Type>|None $type_option - * A possibly defined type used to define template - * parameter types when importing the method - * - * @return void - */ - public function addMethod( - CodeBase $code_base, - Method $method, - $type_option - ) { - $method_fqsen = FullyQualifiedMethodName::make( - $this->getFQSEN(), - $method->getName(), - $method->getFQSEN()->getAlternateId() - ); - - $is_override = $code_base->hasMethodWithFQSEN($method_fqsen); - // Don't overwrite overridden methods with - // parent methods - if ($is_override) { - // Note that we're overriding something - // (but only do this if it's abstract) - // TODO: Consider all permutations of abstract and real methods on classes, interfaces, and traits. - $existing_method = - $code_base->getMethodByFQSEN($method_fqsen); - $existing_method_defining_fqsen = $existing_method->getDefiningFQSEN(); - // Note: For private/protected methods, the defining FQSEN is set to the FQSEN of the inheriting class. - // So, when multiple traits are inherited, they may identical defining FQSENs, but some may be abstract, and others may be implemented. - if ($method->getDefiningFQSEN() === $existing_method_defining_fqsen) { - if ($method->isAbstract() === $existing_method->isAbstract()) { - return; - } - } else { - self::markMethodAsOverridden($code_base, $existing_method_defining_fqsen); - } - - if ($method->isAbstract() || !$existing_method->isAbstract() || $existing_method->getIsNewConstructor()) { - // TODO: What if both of these are abstract, and those get combined into an abstract class? - // Should phan check compatibility of the abstract methods it inherits? - $existing_method->setIsOverride(true); - self::markMethodAsOverridden($code_base, $method->getDefiningFQSEN()); - - // Don't add the method - return; - } - } - - if ($method->getFQSEN() !== $method_fqsen) { - $original_method = $method; - $method = clone($method); - $method->setFQSEN($method_fqsen); - // When we inherit it from the ancestor class, it may be an override in the ancestor class, - // but that doesn't imply it's an override in *this* class. - $method->setIsOverride($is_override); - - // Clone the parameter list, so that modifying the parameters on the first call won't modify the others. - $method->cloneParameterList(); - $method->ensureClonesReturnType($original_method); - - // If we have a parent type defined, map the method's - // return type and parameter types through it - if ($type_option->isDefined()) { - // Map the method's return type - if ($method->getUnionType()->hasTemplateType()) { - $method->setUnionType( - $method->getUnionType()->withTemplateParameterTypeMap( - $type_option->get()->getTemplateParameterTypeMap( - $code_base - ) - ) - ); - } - - // Map each method parameter - $method->setParameterList( - \array_map(static function (Parameter $parameter) use ($type_option, $code_base) : Parameter { - - if (!$parameter->getUnionType()->hasTemplateType()) { - return $parameter; - } - - $mapped_parameter = clone($parameter); - - $mapped_parameter->setUnionType( - $mapped_parameter->getUnionType()->withTemplateParameterTypeMap( - $type_option->get()->getTemplateParameterTypeMap( - $code_base - ) - ) - ); - - return $mapped_parameter; - }, $method->getParameterList()) - ); - } - } - if ($method->getHasYield()) { - // There's no phpdoc standard for template types of Generators at the moment. - $new_type = UnionType::fromFullyQualifiedString('\\Generator'); - if (!$new_type->canCastToUnionType($method->getUnionType())) { - $method->setUnionType($new_type); - } - } - - // Methods defined on interfaces are always abstract, but don't have that flag set. - // NOTE: __construct is special for the following reasons: - // 1. We automatically add __construct to class-like definitions (Not sure why it's done for interfaces) - // 2. If it's abstract, then PHP would enforce that signatures are compatible - if ($this->isInterface() && !$method->getIsNewConstructor()) { - $method->setFlags(Flags::bitVectorWithState($method->getFlags(), \ast\flags\MODIFIER_ABSTRACT, true)); - } - - if ($is_override) { - $method->setIsOverride(true); - } - - $code_base->addMethod($method); - } - - /** - * @return bool - * True if this class has a method with the given name - */ - public function hasMethodWithName( - CodeBase $code_base, - string $name, - bool $is_direct_invocation = false - ) : bool { - // All classes have a constructor even if it hasn't - // been declared yet - if (!$is_direct_invocation && ('__construct' === \strtolower($name) && !$this->isTrait())) { - return true; - } - - $method_fqsen = FullyQualifiedMethodName::make( - $this->getFQSEN(), - $name - ); - - if ($code_base->hasMethodWithFQSEN($method_fqsen)) { - return true; - } - if (!$this->hydrateIndicatingFirstTime($code_base)) { - return false; - } - return $code_base->hasMethodWithFQSEN($method_fqsen); - } - - /** - * @return Method - * The method with the given name - * - * @throws CodeBaseException if the method (or a placeholder) could not be found (or created) - */ - public function getMethodByName( - CodeBase $code_base, - string $name - ) : Method { - $method_fqsen = FullyQualifiedMethodName::make( - $this->getFQSEN(), - $name - ); - - if (!$code_base->hasMethodWithFQSEN($method_fqsen)) { - if ('__construct' === $name) { - // Create a default constructor if its requested - // but doesn't exist yet - $default_constructor = - Method::defaultConstructorForClass( - $this, - $code_base - ); - - $this->addMethod($code_base, $default_constructor, $this->getParentTypeOption()); - - return $default_constructor; - } - - throw new CodeBaseException( - $method_fqsen, - "Method with name $name does not exist for class {$this->getFQSEN()}." - ); - } - - return $code_base->getMethodByFQSEN($method_fqsen); - } - - /** - * @return array<string,Method> - * A list of methods on this class - */ - public function getMethodMap(CodeBase $code_base) : array - { - return $code_base->getMethodMapByFullyQualifiedClassName( - $this->getFQSEN() - ); - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return bool - * True if this class has a magic '__call' method - */ - public function hasCallMethod(CodeBase $code_base) : bool - { - return $this->hasMethodWithName($code_base, '__call'); - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return bool - * True if this class has a magic '__call' method, - * and (at)phan-forbid-undeclared-magic-methods doesn't exist on this class or ancestors - */ - public function allowsCallingUndeclaredInstanceMethod(CodeBase $code_base) - { - return $this->hasCallMethod($code_base) && - !$this->getForbidUndeclaredMagicMethods($code_base); - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return Method - * The magic `__call` method - */ - public function getCallMethod(CodeBase $code_base) - { - return $this->getMethodByName($code_base, '__call'); - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return bool - * True if this class has a magic '__callStatic' method - */ - public function hasCallStaticMethod(CodeBase $code_base) : bool - { - return $this->hasMethodWithName($code_base, '__callStatic'); - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return bool - * True if this class has a magic '__callStatic' method, - * and (at)phan-forbid-undeclared-magic-methods doesn't exist on this class or ancestors. - */ - public function allowsCallingUndeclaredStaticMethod(CodeBase $code_base) - { - return $this->hasCallStaticMethod($code_base) && - !$this->getForbidUndeclaredMagicMethods($code_base); - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return Method - * The magic `__callStatic` method - */ - public function getCallStaticMethod(CodeBase $code_base) - { - return $this->getMethodByName($code_base, '__callStatic'); - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return bool - * True if this class has a magic '__get' method - */ - public function hasGetMethod(CodeBase $code_base) : bool - { - return $this->hasMethodWithName($code_base, '__get'); - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return bool - * True if this class has a magic '__set' method - */ - public function hasSetMethod(CodeBase $code_base) : bool - { - return $this->hasMethodWithName($code_base, '__set'); - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return bool - * True if this class has a magic '__get' or '__set' - * method - * @suppress PhanUnreferencedPublicMethod - */ - public function hasGetOrSetMethod(CodeBase $code_base) - { - return ( - $this->hasGetMethod($code_base) - || $this->hasSetMethod($code_base) - ); - } - - /** - * @return void - */ - public function addTraitFQSEN(FullyQualifiedClassName $fqsen, int $lineno = 0) - { - $this->trait_fqsen_lineno[count($this->trait_fqsen_list)] = $lineno; - $this->trait_fqsen_list[] = $fqsen; - - // Add the trait to the union type of this class - $this->addAdditionalType($fqsen->asType()); - } - - /** - * @return void - */ - public function addTraitAdaptations(TraitAdaptations $trait_adaptations) - { - $this->trait_adaptations_map[\strtolower($trait_adaptations->getTraitFQSEN()->__toString())] = $trait_adaptations; - } - - /** - * @return array<int,FullyQualifiedClassName> - * A list of FQSENs for included traits - */ - public function getTraitFQSENList() : array - { - return $this->trait_fqsen_list; - } - - /** - * @return bool - * True if this class calls its parent constructor - */ - public function getIsParentConstructorCalled() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_PARENT_CONSTRUCTOR_CALLED); - } - - /** - * @return void - */ - public function setIsParentConstructorCalled( - bool $is_parent_constructor_called - ) { - $this->setPhanFlags(Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_PARENT_CONSTRUCTOR_CALLED, - $is_parent_constructor_called - )); - } - - /** - * Check if this class or its ancestors forbids undeclared magic properties. - */ - public function getForbidUndeclaredMagicProperties(CodeBase $code_base) : bool - { - return ( - $this->getPhanFlagsHasState(Flags::CLASS_FORBID_UNDECLARED_MAGIC_PROPERTIES) - || - ( - $this->hasParentType() - && $code_base->hasClassWithFQSEN($this->getParentClassFQSEN()) - && $this->getParentClass($code_base)->getForbidUndeclaredMagicProperties($code_base) - ) - ); - } - - /** - * Set whether undeclared magic properties are forbidden - * (properties accessed through __get or __set, with no (at)property annotation on parent class) - * @param bool $forbid_undeclared_dynamic_properties - set to true to forbid. - * @return void - */ - public function setForbidUndeclaredMagicProperties( - bool $forbid_undeclared_dynamic_properties - ) { - $this->setPhanFlags(Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::CLASS_FORBID_UNDECLARED_MAGIC_PROPERTIES, - $forbid_undeclared_dynamic_properties - )); - } - - /** - * Check if this class or its ancestors forbids undeclared magic methods. - */ - public function getForbidUndeclaredMagicMethods(CodeBase $code_base) : bool - { - return ( - $this->getPhanFlagsHasState(Flags::CLASS_FORBID_UNDECLARED_MAGIC_METHODS) - || - ( - $this->hasParentType() - && $code_base->hasClassWithFQSEN($this->getParentClassFQSEN()) - && $this->getParentClass($code_base)->getForbidUndeclaredMagicMethods($code_base) - ) - ); - } - - /** - * Set whether undeclared magic methods are forbidden - * (methods accessed through __call or __callStatic, with no (at)method annotation on class) - * @param bool $forbid_undeclared_magic_methods - set to true to forbid. - * @return void - */ - public function setForbidUndeclaredMagicMethods( - bool $forbid_undeclared_magic_methods - ) { - $this->setPhanFlags(Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::CLASS_FORBID_UNDECLARED_MAGIC_METHODS, - $forbid_undeclared_magic_methods - )); - } - - /** - * @return bool - * True if this class has dynamic properties. (e.g. stdClass) - */ - public function getHasDynamicProperties(CodeBase $code_base) : bool - { - return ( - $this->getPhanFlagsHasState(Flags::CLASS_HAS_DYNAMIC_PROPERTIES) - || - ( - $this->hasParentType() - && $code_base->hasClassWithFQSEN($this->getParentClassFQSEN()) - && $this->getParentClass($code_base)->getHasDynamicProperties($code_base) - ) - ); - } - - /** - * @return void - */ - public function setHasDynamicProperties( - bool $has_dynamic_properties - ) { - $this->setPhanFlags(Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::CLASS_HAS_DYNAMIC_PROPERTIES, - $has_dynamic_properties - )); - } - - - /** - * @return bool - * True if this is a final class - */ - public function isFinal() : bool - { - return $this->getFlagsHasState(\ast\flags\CLASS_FINAL); - } - - /** - * @return bool - * True if this is an abstract class - */ - public function isAbstract() : bool - { - return $this->getFlagsHasState(\ast\flags\CLASS_ABSTRACT); - } - - /** - * @return bool - * True if this is an interface - */ - public function isInterface() : bool - { - return $this->getFlagsHasState(\ast\flags\CLASS_INTERFACE); - } - - /** - * @return bool - * True if this class is a trait - */ - public function isTrait() : bool - { - return $this->getFlagsHasState(\ast\flags\CLASS_TRAIT); - } - - /** - * @return bool - * True if this class is anonymous - */ - public function isAnonymous() : bool - { - return ($this->getFlags() & \ast\flags\CLASS_ANONYMOUS) > 0; - } - - /** - * @return FullyQualifiedClassName - */ - public function getFQSEN() : FullyQualifiedClassName - { - return $this->fqsen; - } - - /** - * @return array<int,FullyQualifiedClassName> - */ - public function getNonParentAncestorFQSENList() - { - return \array_merge( - $this->getInterfaceFQSENList(), - $this->getTraitFQSENList() - ); - } - - /** - * @return array<int,FullyQualifiedClassName> - */ - public function getAncestorFQSENList() - { - $ancestor_list = $this->getNonParentAncestorFQSENList(); - - if ($this->hasParentType()) { - $ancestor_list[] = $this->getParentClassFQSEN(); - } - - return $ancestor_list; - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @param array<int,FullyQualifiedClassName> $fqsen_list - * A list of class FQSENs to turn into a list of - * Clazz objects - * - * @return array<int,Clazz> - */ - private static function getClassListFromFQSENList( - CodeBase $code_base, - array $fqsen_list - ) : array { - $class_list = []; - foreach ($fqsen_list as $fqsen) { - if ($code_base->hasClassWithFQSEN($fqsen)) { - $class_list[] = $code_base->getClassByFQSEN($fqsen); - } - } - return $class_list; - } - - /** - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return array<int,Clazz> - */ - public function getAncestorClassList(CodeBase $code_base) - { - return self::getClassListFromFQSENList( - $code_base, - $this->getAncestorFQSENList() - ); - } - - /** - * Add properties, constants and methods from all - * ancestors (parents, traits, ...) to this class - * - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return void - */ - public function importConstantsFromAncestorClasses(CodeBase $code_base) - { - if (!$this->isFirstExecution(__METHOD__)) { - return; - } - - foreach ($this->getInterfaceFQSENList() as $fqsen) { - if (!$code_base->hasClassWithFQSEN($fqsen)) { - continue; - } - - $ancestor = $code_base->getClassByFQSENWithoutHydrating($fqsen); - $this->importConstantsFromAncestorClass( - $code_base, - $ancestor - ); - } - - foreach ($this->getTraitFQSENList() as $fqsen) { - if (!$code_base->hasClassWithFQSEN($fqsen)) { - continue; - } - - $ancestor = $code_base->getClassByFQSENWithoutHydrating($fqsen); - $this->importConstantsFromAncestorClass( - $code_base, - $ancestor - ); - } - - // Copy information from the parent(s) - $this->importConstantsFromParentClass($code_base); - } - - /** - * Add properties, constants and methods from all - * ancestors (parents, traits, ...) to this class - * - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return void - */ - public function importAncestorClasses(CodeBase $code_base) - { - if (!$this->isFirstExecution(__METHOD__)) { - return; - } - $this->importConstantsFromAncestorClasses($code_base); - - foreach ($this->getInterfaceFQSENList() as $i => $fqsen) { - if (!$code_base->hasClassWithFQSEN($fqsen)) { - continue; - } - - $ancestor = $code_base->getClassByFQSEN($fqsen); - - if (!$ancestor->isInterface()) { - $this->emitWrongInheritanceCategoryWarning($code_base, $ancestor, 'Interface', $this->interface_fqsen_lineno[$i] ?? 0); - } - - $this->importAncestorClass( - $code_base, - $ancestor, - new None() - ); - } - - foreach ($this->getTraitFQSENList() as $i => $fqsen) { - if (!$code_base->hasClassWithFQSEN($fqsen)) { - continue; - } - - $ancestor = $code_base->getClassByFQSEN($fqsen); - if (!$ancestor->isTrait()) { - $this->emitWrongInheritanceCategoryWarning($code_base, $ancestor, 'Trait', $this->trait_fqsen_lineno[$i] ?? 0); - } - - $this->importAncestorClass( - $code_base, - $ancestor, - new None() - ); - } - - // Copy information from the parent(s) - $this->importParentClass($code_base); - } - - /* - * Add properties, constants and methods from the - * parent of this class - * - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return void - */ - private function importConstantsFromParentClass(CodeBase $code_base) - { - if (!$this->isFirstExecution(__METHOD__)) { - return; - } - - if (!$this->hasParentType()) { - return; - } - - if ($this->getParentClassFQSEN() === $this->getFQSEN()) { - return; - } - - // Let the parent class finder worry about this - if (!$code_base->hasClassWithFQSEN( - $this->getParentClassFQSEN() - )) { - return; - } - - // Get the parent class - $parent = $this->getParentClassWithoutHydrating($code_base); - - // import constants from that class - $this->importConstantsFromAncestorClass($code_base, $parent); - } - - /* - * Add properties, constants and methods from the - * parent of this class - * - * @param CodeBase $code_base - * The entire code base from which we'll find ancestor - * details - * - * @return void - */ - private function importParentClass(CodeBase $code_base) - { - if (!$this->isFirstExecution(__METHOD__)) { - return; - } - - if (!$this->hasParentType()) { - return; - } - - if ($this->getParentClassFQSEN() === $this->getFQSEN()) { - return; - } - - // Let the parent class finder worry about this - if (!$code_base->hasClassWithFQSEN( - $this->getParentClassFQSEN() - )) { - return; - } - - // Get the parent class - $parent = $this->getParentClass($code_base); - - if ($parent->isTrait() || $parent->isInterface()) { - $this->emitWrongInheritanceCategoryWarning($code_base, $parent, 'Class', $this->parent_type_lineno); - } - if ($parent->isFinal()) { - $this->emitExtendsFinalClassWarning($code_base, $parent); - } - - // Tell the parent to import its own parents first - - // Import elements from the parent - $this->importAncestorClass( - $code_base, - $parent, - $this->getParentTypeOption() - ); - } - - /** - * @return void - */ - private function emitWrongInheritanceCategoryWarning( - CodeBase $code_base, - Clazz $ancestor, - string $expected_inheritance_category, - int $lineno - ) { - $context = $this->getContext(); - if ($ancestor->isPHPInternal()) { - if (!$this->checkHasSuppressIssueAndIncrementCount(Issue::AccessWrongInheritanceCategoryInternal)) { - Issue::maybeEmit( - $code_base, - $context, - Issue::AccessWrongInheritanceCategoryInternal, - $lineno ?: $context->getLineNumberStart(), - (string)$ancestor, - $expected_inheritance_category - ); - } - } else { - if (!$this->checkHasSuppressIssueAndIncrementCount(Issue::AccessWrongInheritanceCategory)) { - Issue::maybeEmit( - $code_base, - $context, - Issue::AccessWrongInheritanceCategory, - $lineno ?: $context->getLineNumberStart(), - (string)$ancestor, - $ancestor->getFileRef()->getFile(), - $ancestor->getFileRef()->getLineNumberStart(), - $expected_inheritance_category - ); - } - } - } - - /** - * @return void - */ - private function emitExtendsFinalClassWarning( - CodeBase $code_base, - Clazz $ancestor - ) { - $context = $this->getContext(); - if ($ancestor->isPHPInternal()) { - if (!$this->checkHasSuppressIssueAndIncrementCount(Issue::AccessExtendsFinalClassInternal)) { - Issue::maybeEmit( - $code_base, - $context, - Issue::AccessExtendsFinalClassInternal, - $this->parent_type_lineno ?: $context->getLineNumberStart(), - (string)$ancestor->getFQSEN() - ); - } - } else { - if (!$this->checkHasSuppressIssueAndIncrementCount(Issue::AccessExtendsFinalClass)) { - Issue::maybeEmit( - $code_base, - $context, - Issue::AccessExtendsFinalClass, - $this->parent_type_lineno ?: $context->getLineNumberStart(), - (string)$ancestor->getFQSEN(), - $ancestor->getFileRef()->getFile(), - $ancestor->getFileRef()->getLineNumberStart() - ); - } - } - } - - /** - * Add constants from the given class to this. - * - * @param CodeBase $code_base - * A reference to the code base in which the ancestor exists - * - * @param Clazz $class - * A class to import from - * - * @return void - */ - public function importConstantsFromAncestorClass( - CodeBase $code_base, - Clazz $class - ) { - $key = \strtolower((string)$class->getFQSEN()); - if (!$this->isFirstExecution( - __METHOD__ . ':' . $key - )) { - return; - } - - $class->addReference($this->getContext()); - - // Make sure that the class imports its parents' constants first - // (And **only** the constants) - $class->hydrateConstants($code_base); - - // Copy constants - foreach ($class->getConstantMap($code_base) as $constant) { - $this->inheritConstant($code_base, $constant); - } - } - - /** - * @param FileRef $file_ref - * A reference to a location in which this typed structural - * element is referenced. - * - * @return void - * @override - */ - public function addReference(FileRef $file_ref) - { - if (Config::get_track_references()) { - // Currently, we don't need to track references to PHP-internal methods/functions/constants - // such as PHP_VERSION, strlen(), Closure::bind(), etc. - // This may change in the future. - if ($this->isPHPInternal()) { - return; - } - if ($file_ref instanceof Context) { - if ($file_ref->getClassFQSENOrNull() === $this->fqsen) { - // Don't count references declared within MyClass as references to MyClass for dead code detection - return; - } - } - $this->reference_list[$file_ref->__toString()] = $file_ref; - } - } - - /** - * Add properties, constants and methods from the given - * class to this. - * - * @param CodeBase $code_base - * A reference to the code base in which the ancestor exists - * - * @param Clazz $class - * A class to import from - * - * @param Option<Type>|None $type_option - * A possibly defined ancestor type used to define template - * parameter types when importing ancestor properties and - * methods - * - * @return void - */ - public function importAncestorClass( - CodeBase $code_base, - Clazz $class, - $type_option - ) { - $class_fqsen = $class->getFQSEN(); - $key = \strtolower($class_fqsen->__toString()); - if (!$this->isFirstExecution( - __METHOD__ . ':' . $key - )) { - return; - } - $next_class_fqsen = $class_fqsen->withAlternateId($class_fqsen->getAlternateId() + 1); - if (!$this->isPHPInternal() && $code_base->hasClassWithFQSEN($next_class_fqsen)) { - $this->warnAboutAmbiguousInheritance($code_base, $class, $next_class_fqsen); - } - - // Constants should have been imported earlier, but call it again just in case - $this->importConstantsFromAncestorClass($code_base, $class); - - // Make sure that the class imports its parents first - // NOTE: We already imported constants from $class in importConstantsFromAncestorClass - $class->hydrate($code_base); - $is_trait = $class->isTrait(); - $trait_adaptations = $is_trait ? ($this->trait_adaptations_map[$key] ?? null) : null; - - // Copy properties - foreach ($class->getPropertyMap($code_base) as $property) { - // TODO: check for conflicts in visibility and default values for traits. - // TODO: Check for ancestor classes with the same private property? - $this->addProperty( - $code_base, - $property, - $type_option, - $is_trait - ); - } - - // Copy methods - foreach ($class->getMethodMap($code_base) as $method) { - if (!\is_null($trait_adaptations) && count($trait_adaptations->hidden_methods) > 0) { - $method_name_key = \strtolower($method->getName()); - if (isset($trait_adaptations->hidden_methods[$method_name_key])) { - // TODO: Record that the method was hidden, and check later on that all method that were hidden were actually defined? - continue; - } - } - // Workaround: For private methods, copy the method with a new defining class. - // If you import a trait's private method, it becomes private **to the class which used the trait** in PHP code. - // (But preserving the defining FQSEN is fine for this) - if ($is_trait) { - $method = $this->adaptInheritedMethodFromTrait($method); - } - $this->addMethod( - $code_base, - $method, - $type_option - ); - } - - if (!\is_null($trait_adaptations)) { - $this->importTraitAdaptations($code_base, $class, $trait_adaptations, $type_option); - } - } - - private function adaptInheritedMethodFromTrait(Method $method) : Method - { - $method_flags = $method->getFlags(); - if (Flags::bitVectorHasState($method_flags, \ast\flags\MODIFIER_PRIVATE)) { - $method = $method->createUseAlias($this, $method->getName(), \ast\flags\MODIFIER_PRIVATE); - } elseif (Flags::bitVectorHasState($method_flags, \ast\flags\MODIFIER_PROTECTED)) { - $method = $method->createUseAlias($this, $method->getName(), \ast\flags\MODIFIER_PROTECTED); - } else { - $method = $method->createUseAlias($this, $method->getName(), \ast\flags\MODIFIER_PUBLIC); - } - $context = $this->getContext()->withScope($this->internal_scope); - $method->setUnionType( - $method->getUnionTypeWithUnmodifiedStatic()->withSelfResolvedInContext($context) - ); - $method->setRealReturnType( - $method->getRealReturnType()->withSelfResolvedInContext($context) - ); - $parameter_list = $method->getParameterList(); - $changed = false; - foreach ($parameter_list as $i => $parameter) { - $old_type = $parameter->getNonVariadicUnionType(); - $type = $old_type->withSelfResolvedInContext($context); - if ($type->hasStaticType()) { - $type = $type->withType($this->getFQSEN()->asType()); - } - if ($old_type !== $type) { - $changed = true; - $parameter = clone($parameter); - $parameter->setUnionType($type); - $parameter_list[$i] = $parameter; - } - } - if ($changed) { - $method->setParameterList($parameter_list); - } - - $real_parameter_list = $method->getRealParameterList(); - $changed = false; - foreach ($real_parameter_list as $i => $parameter) { - $old_type = $parameter->getNonVariadicUnionType(); - $type = $old_type->withSelfResolvedInContext($context); - if ($type->hasStaticType()) { - $type = $type->withType($this->getFQSEN()->asType()); - } - if ($old_type !== $type) { - $changed = true; - $parameter = clone($parameter); - $parameter->setUnionType($type); - $real_parameter_list[$i] = $parameter; - } - } - if ($changed) { - $method->setRealParameterList($parameter_list); - } - - return $method; - } - - /** - * @param CodeBase $code_base - * @param Clazz $class - * @param TraitAdaptations $trait_adaptations - * @param Option<Type>|None $type_option - * A possibly defined ancestor type used to define template - * parameter types when importing ancestor properties and - * methods - * - * @return void - */ - private function importTraitAdaptations( - CodeBase $code_base, - Clazz $class, - TraitAdaptations $trait_adaptations, - $type_option - ) { - foreach ($trait_adaptations->alias_methods ?? [] as $alias_method_name => $original_trait_alias_source) { - $source_method_name = $original_trait_alias_source->getSourceMethodName(); - if (!$class->hasMethodWithName($code_base, $source_method_name)) { - Issue::maybeEmit( - $code_base, - $this->getContext(), - Issue::UndeclaredAliasedMethodOfTrait, - $original_trait_alias_source->getAliasLineno(), // TODO: Track line number in TraitAdaptation - \sprintf('%s::%s', (string)$this->getFQSEN(), $alias_method_name), - \sprintf('%s::%s', (string)$class->getFQSEN(), $source_method_name), - $class->getName() - ); - continue; - } - $source_method = $class->getMethodByName($code_base, $source_method_name); - $alias_method = $source_method->createUseAlias( - $this, - $alias_method_name, - $original_trait_alias_source->getAliasVisibilityFlags() - ); - $this->addMethod($code_base, $alias_method, $type_option); - } - } - - /** - * @return void - */ - private function warnAboutAmbiguousInheritance( - CodeBase $code_base, - Clazz $inherited_class, - FullyQualifiedClassName $alternate_class_fqsen - ) { - $alternate_class = $code_base->getClassByFQSEN($alternate_class_fqsen); - if ($inherited_class->isTrait()) { - $issue_type = Issue::RedefinedUsedTrait; - } elseif ($inherited_class->isInterface()) { - $issue_type = Issue::RedefinedInheritedInterface; - } else { - $issue_type = Issue::RedefinedExtendedClass; - } - if ($this->checkHasSuppressIssueAndIncrementCount($issue_type)) { - return; - } - $first_context = $inherited_class->getContext(); - $second_context = $alternate_class->getContext(); - - Issue::maybeEmit( - $code_base, - $this->getContext(), - $issue_type, - $this->getContext()->getLineNumberStart(), - $this->getFQSEN(), - $inherited_class->__toString(), - $first_context->getFile(), - $first_context->getLineNumberStart(), - $second_context->getFile(), - $second_context->getLineNumberStart() - ); - } - - /** - * @return int - * The number of references to this typed structural element - */ - public function getReferenceCount( - CodeBase $code_base - ) : int { - $count = parent::getReferenceCount($code_base); - - /** - * A function that maps a list of elements to the - * total reference count for all elements - * @param array<string,AddressableElement> $list - */ - $list_count = function (array $list) : int { - return \array_reduce($list, function ( - int $count, - ClassElement $element - ) : int { - foreach ($element->reference_list as $reference) { - if ($reference instanceof Context && $reference->getClassFQSENOrNull() === $this->fqsen) { - continue; - } - $count++; - } - return $count; - }, 0); - }; - - // Sum up counts for all dependent elements - $count += $list_count($this->getPropertyMap($code_base)); - $count += $list_count($this->getMethodMap($code_base)); - $count += $list_count($this->getConstantMap($code_base)); - - return $count; - } - - /** - * @return bool - * True if this class contains generic types - */ - public function isGeneric() : bool - { - return $this->getInternalScope()->hasAnyTemplateType(); - } - - /** - * @return array<string,TemplateType> - * The set of all template types parameterizing this generic - * class - */ - public function getTemplateTypeMap() : array - { - return $this->getInternalScope()->getTemplateTypeMap(); - } - - /** - * @return string - * A string describing this class - */ - public function __toString() : string - { - $string = ''; - - if ($this->isFinal()) { - $string .= 'final '; - } - - if ($this->isAbstract()) { - $string .= 'abstract '; - } - - if ($this->isInterface()) { - $string .= 'Interface '; - } elseif ($this->isTrait()) { - $string .= 'Trait '; - } else { - $string .= 'Class '; - } - - $string .= (string)$this->getFQSEN()->getCanonicalFQSEN(); - - return $string; - } - - private function toStubSignature(CodeBase $code_base) : string - { - $string = ''; - - if ($this->isFinal()) { - $string .= 'final '; - } - - if ($this->isAbstract() && !$this->isInterface()) { - $string .= 'abstract '; - } - - if ($this->isInterface()) { - $string .= 'interface '; - } elseif ($this->isTrait()) { - $string .= 'trait '; - } else { - $string .= 'class '; - } - - $string .= $this->getFQSEN()->getName(); - - $extend_types = []; - $implements_types = []; - $parent_implements_types = []; - - if ($this->parent_type) { - $extend_types[] = FullyQualifiedClassName::fromType($this->parent_type); - $parent_class = $this->getParentClass($code_base); - $parent_implements_types = $parent_class->interface_fqsen_list; - } - - if (count($this->interface_fqsen_list) > 0) { - if ($this->isInterface()) { - $extend_types = \array_merge($extend_types, $this->interface_fqsen_list); - } else { - $implements_types = $this->interface_fqsen_list; - if (count($parent_implements_types) > 0) { - $implements_types = \array_diff($implements_types, $parent_implements_types); - } - } - } - if (count($extend_types) > 0) { - $string .= ' extends ' . \implode(', ', $extend_types); - } - if (count($implements_types) > 0) { - $string .= ' implements ' . \implode(', ', $implements_types); - } - return $string; - } - - public function getMarkupDescription() : string - { - $fqsen = $this->getFQSEN(); - $string = ''; - $namespace = \ltrim($fqsen->getNamespace(), '\\'); - if ($namespace !== '') { - // Render the namespace one line above the class - $string .= "namespace $namespace;\n"; - } - - if ($this->isFinal()) { - $string .= 'final '; - } - - if ($this->isAbstract() && !$this->isInterface()) { - $string .= 'abstract '; - } - - if ($this->isInterface()) { - $string .= 'interface '; - } elseif ($this->isTrait()) { - $string .= 'trait '; - } else { - $string .= 'class '; - } - - if ($this->isAnonymous()) { - $string .= 'anonymous_class'; - } else { - $string .= $fqsen->getName(); - } - return $string; - } - - - /** - * @suppress PhanUnreferencedPublicMethod (toStubInfo is used by callers for more flexibility) - */ - public function toStub(CodeBase $code_base) : string - { - list($namespace, $string) = $this->toStubInfo($code_base); - $namespace_text = $namespace === '' ? '' : "$namespace "; - $string = \sprintf("namespace %s{\n%s}\n", $namespace_text, $string); - return $string; - } - - /** @return array{0:string,1:string} [string $namespace, string $text] */ - public function toStubInfo(CodeBase $code_base) : array - { - $signature = $this->toStubSignature($code_base); - - $stub = $signature; - - $stub .= " {"; - - $constant_map = $this->getConstantMap($code_base); - if (count($constant_map) > 0) { - $stub .= "\n\n // constants\n"; - $stub .= \implode("\n", \array_map(static function (ClassConstant $constant) : string { - return $constant->toStub(); - }, $constant_map)); - } - - $property_map = $this->getPropertyMap($code_base); - if (count($property_map) > 0) { - $stub .= "\n\n // properties\n"; - - $stub .= \implode("\n", \array_map(static function (Property $property) : string { - return $property->toStub(); - }, $property_map)); - } - $reflection_class = new \ReflectionClass((string)$this->getFQSEN()); - $method_map = \array_filter($this->getMethodMap($code_base), static function (Method $method) use ($reflection_class) : bool { - if ($method->getFQSEN()->isAlternate()) { - return false; - } - $reflection_method = $reflection_class->getMethod($method->getName()); - if ($reflection_method->getDeclaringClass()->getName() !== $reflection_class->getName()) { - return false; - } - return true; - }); - if (count($method_map) > 0) { - $stub .= "\n\n // methods\n"; - - $is_interface = $this->isInterface(); - $stub .= \implode("\n", \array_map(static function (Method $method) use ($is_interface) : string { - return $method->toStub($is_interface); - }, $method_map)); - } - - $stub .= "\n}\n\n"; - $namespace = \ltrim($this->getFQSEN()->getNamespace(), '\\'); - return [$namespace, $stub]; - } - - /** - * @return void - */ - protected function hydrateConstantsOnce(CodeBase $code_base) - { - foreach ($this->getAncestorFQSENList() as $fqsen) { - if ($code_base->hasClassWithFQSEN($fqsen)) { - $code_base->getClassByFQSENWithoutHydrating( - $fqsen - )->hydrateConstants($code_base); - } - } - - // Create the 'class' constant - $class_constant_value = \ltrim($this->getFQSEN()->__toString(), '\\'); - $class_constant = new ClassConstant( - $this->getContext(), - 'class', - LiteralStringType::instanceForValue( - $class_constant_value, - false - )->asUnionType(), - 0, - FullyQualifiedClassConstantName::make( - $this->getFQSEN(), - 'class' - ) - ); - $class_constant->setNodeForValue($class_constant_value); - $this->addConstant($code_base, $class_constant); - - // Add variable '$this' to the scope - $this->getInternalScope()->addVariable( - new Variable( - $this->getContext(), - 'this', - $this->getUnionType(), - 0 - ) - ); - - // Fetch the constants declared within the class, to check if they have override annotations later. - $original_declared_class_constants = $this->getConstantMap($code_base); - - // Load parent methods, properties, constants - $this->importConstantsFromAncestorClasses($code_base); - - self::analyzeClassConstantOverrides($code_base, $original_declared_class_constants); - } - - /** - * This method must be called before analysis - * begins. - * - * @return void - */ - protected function hydrateOnce(CodeBase $code_base) - { - // Ensure that we hydrate constants before hydrating properties and methods - $this->hydrateConstants($code_base); - - foreach ($this->getAncestorFQSENList() as $fqsen) { - if ($code_base->hasClassWithFQSEN($fqsen)) { - $code_base->getClassByFQSENWithoutHydrating( - $fqsen - )->hydrate($code_base); - } - } - - $this->importAncestorClasses($code_base); - - // Make sure there are no abstract methods on non-abstract classes - AbstractMethodAnalyzer::analyzeAbstractMethodsAreImplemented( - $code_base, - $this - ); - } - - /** - * @param ClassConstant[] $original_declared_class_constants - * @return void - */ - private static function analyzeClassConstantOverrides(CodeBase $code_base, array $original_declared_class_constants) - { - foreach ($original_declared_class_constants as $constant) { - if ($constant->isOverrideIntended() && !$constant->getIsOverride()) { - if ($constant->checkHasSuppressIssueAndIncrementCount(Issue::CommentOverrideOnNonOverrideConstant)) { - continue; - } - $context = $constant->getContext(); - Issue::maybeEmit( - $code_base, - $context, - Issue::CommentOverrideOnNonOverrideConstant, - $context->getLineNumberStart(), - (string)$constant->getFQSEN() - ); - } - } - } - - /** - * This method should be called after hydration - * - * @return void - * @throws RecursionDepthException for deep class hierarchies - */ - final public function analyze(CodeBase $code_base) - { - if ($this->isPHPInternal()) { - return; - } - - // Make sure the parent classes exist - ClassInheritanceAnalyzer::analyzeClassInheritance( - $code_base, - $this - ); - - DuplicateClassAnalyzer::analyzeDuplicateClass( - $code_base, - $this - ); - - ParentConstructorCalledAnalyzer::analyzeParentConstructorCalled( - $code_base, - $this - ); - - PropertyTypesAnalyzer::analyzePropertyTypes( - $code_base, - $this - ); - - // Analyze this class to make sure that we don't have conflicting - // types between similar inherited methods. - CompositionAnalyzer::analyzeComposition( - $code_base, - $this - ); - - // Let any configured plugins analyze the class - ConfigPluginSet::instance()->analyzeClass( - $code_base, - $this - ); - } - - /** - * @return void - */ - public function setDidFinishParsing(bool $did_finish_parsing) - { - $this->did_finish_parsing = $did_finish_parsing; - } - - /** - * @var bool have the class constants been hydrated - * (must be done before hydrating properties and methods to avoid recursive dependencies) - */ - protected $are_constants_hydrated; - - /** - * This method must be called before analysis - * begins. It hydrates constants, but not properties/methods. - * - * @return void - */ - protected function hydrateConstants(CodeBase $code_base) - { - if (!$this->did_finish_parsing) { - return; - } - if ($this->are_constants_hydrated) { // Same as isFirstExecution(), inlined due to being called frequently. - return; - } - $this->are_constants_hydrated = true; - - $this->hydrateConstantsOnce($code_base); - } - - /** - * This method must be called before analysis begins. - * This is identical to hydrateConstants(), - * but returns true only if this is the first time the element was hydrated. - * (i.e. true if there may be newly added constants) - */ - public function hydrateConstantsIndicatingFirstTime(CodeBase $code_base) : bool - { - if (!$this->did_finish_parsing) { - return false; - } - if ($this->are_constants_hydrated) { // Same as isFirstExecution(), inlined due to being called frequently. - return false; - } - $this->are_constants_hydrated = true; - - $this->hydrateConstantsOnce($code_base); - return true; - } - - /** - * This method must be called before analysis - * begins. - * - * @return void - * @override - */ - public function hydrate(CodeBase $code_base) - { - if (!$this->did_finish_parsing) { - return; - } - if ($this->is_hydrated) { // Same as isFirstExecution(), inlined due to being called frequently. - return; - } - $this->is_hydrated = true; - - $this->hydrateOnce($code_base); - } - - /** - * This method must be called before analysis begins. - * This is identical to hydrate(), but returns true only if this is the first time the element was hydrated. - */ - private function hydrateIndicatingFirstTime(CodeBase $code_base) : bool - { - if (!$this->did_finish_parsing) { - return false; - } - if ($this->is_hydrated) { // Same as isFirstExecution(), inlined due to being called frequently. - return false; - } - $this->is_hydrated = true; - - $this->hydrateOnce($code_base); - return true; - } - - /** - * Used by daemon mode to restore an element to the state it had before parsing. - * @return Closure - */ - public function createRestoreCallback() - { - // NOTE: Properties, Methods, and closures are restored separately. - $original_this = clone($this); - $original_union_type = $this->getUnionType(); - - return function () use ($original_union_type, $original_this) { - // @phan-suppress-next-line PhanTypeSuspiciousNonTraversableForeach this is intentionally iterating over private properties of the clone. - foreach ($original_this as $key => $value) { - $this->{$key} = $value; - } - $this->setUnionType($original_union_type); - $this->memoizeFlushAll(); - }; - } - - /** - * @return void - */ - public function addAdditionalType(Type $type) - { - $this->additional_union_types = ($this->additional_union_types ?? UnionType::empty())->withType($type); - } - - /** - * @return ?UnionType - */ - public function getAdditionalTypes() - { - return $this->additional_union_types; - } - - /** - * @param array<string,UnionType> $template_parameter_type_map - */ - public function resolveParentTemplateType(array $template_parameter_type_map) : UnionType - { - if (\count($template_parameter_type_map) === 0) { - return UnionType::empty(); - } - if ($this->parent_type === null) { - return UnionType::empty(); - } - if (!$this->parent_type->hasTemplateParameterTypes()) { - return UnionType::empty(); - } - $parent_template_parameter_type_list = $this->parent_type->getTemplateParameterTypeList(); - $changed = false; - foreach ($parent_template_parameter_type_list as $i => $template_type) { - $new_template_type = $template_type->withTemplateParameterTypeMap($template_parameter_type_map); - if ($template_type === $new_template_type) { - continue; - } - $parent_template_parameter_type_list[$i] = $new_template_type; - $changed = true; - } - if (!$changed) { - return UnionType::empty(); - } - return Type::fromType($this->parent_type, $parent_template_parameter_type_list)->asUnionType(); - } - - /** - * @return array<string,Property> - */ - public function getPropertyMapExcludingDynamicAndMagicProperties(CodeBase $code_base) : array - { - return $this->memoize(__METHOD__, /** @return array<string,Property> */ function () use ($code_base) : array { - // TODO: This won't work if a class declares both a real property and a magic property of the same name. - // Low priority because that is uncommon - return \array_filter( - $this->getPropertyMap($code_base), - static function (Property $property) : bool { - return !$property->isDynamicOrFromPHPDoc(); - } - ); - }); - } - - const CAN_ITERATE_STATUS_NO_PROPERTIES = 0; - const CAN_ITERATE_STATUS_NO_ACCESSIBLE_PROPERTIES = 1; - const CAN_ITERATE_STATUS_HAS_ACCESSIBLE_PROPERTIES = 2; - - /** - * Returns an enum value (self::CAN_ITERATE_STATUS_*) indicating whether - * analyzed code iterating over an instance of this class has potential bugs. - * (and what type of bug it would be) - */ - public function checkCanIterateFromContext( - CodeBase $code_base, - Context $context - ) : int { - $accessing_class = $context->getClassFQSENOrNull(); - return $this->memoize( - 'can_iterate:' . (string)$accessing_class, - function () use ($accessing_class, $code_base) : int { - $properties = $this->getPropertyMapExcludingDynamicAndMagicProperties($code_base); - foreach ($properties as $property) { - if ($property->isAccessibleFromClass($code_base, $accessing_class)) { - return self::CAN_ITERATE_STATUS_HAS_ACCESSIBLE_PROPERTIES; - } - } - if (count($properties) > 0) { - return self::CAN_ITERATE_STATUS_NO_ACCESSIBLE_PROPERTIES; - } - return self::CAN_ITERATE_STATUS_NO_PROPERTIES; - } - ); - } - - /** - * @return array<int,Closure(array<int,mixed>, Context):UnionType> - */ - public function getGenericConstructorBuilder(CodeBase $code_base) - { - return $this->memoize( - 'template_type_resolvers', - /** - * @return array<int,Closure(array<int,mixed>):UnionType> - */ - function () use ($code_base) : array { - // Get the constructor so that we can figure out what - // template types we're going to be mapping - $constructor_method = - $this->getMethodByName($code_base, '__construct'); - - $template_type_resolvers = []; - foreach ($this->getTemplateTypeMap() as $template_type) { - $template_type_resolver = $constructor_method->getTemplateTypeExtractorClosure( - $code_base, - $template_type - ); - if (!$template_type_resolver) { - // PhanTemplateTypeNotDeclaredInFunctionParams can be suppressed both on the class and on __construct() - if (!$this->checkHasSuppressIssueAndIncrementCount(Issue::TemplateTypeNotDeclaredInFunctionParams)) { - Issue::maybeEmit( - $code_base, - $constructor_method->getContext(), - Issue::GenericConstructorTypes, - $constructor_method->getContext()->getLineNumberStart(), - $template_type, - $this->getFQSEN() - ); - } - /** @param array<int,\ast\Node|mixed> $unused_arg_list */ - $template_type_resolver = static function (array $unused_arg_list) : UnionType { - return MixedType::instance(false)->asUnionType(); - }; - } - $template_type_resolvers[] = $template_type_resolver; - } - return $template_type_resolvers; - } - ); - } - - /** - * Given the FQSEN of an ancestor class and an element definition, - * return the overridden element's definition or null if this didn't override anything. - * - * TODO: Handle renamed elements from traits. - * - * @return ?ClassElement if non-null, this is of the same type as $element - */ - public static function getAncestorElement(CodeBase $code_base, FullyQualifiedClassName $ancestor_fqsen, ClassElement $element) - { - if (!$code_base->hasClassWithFQSEN($ancestor_fqsen)) { - return null; - } - $ancestor_class = $code_base->getClassByFQSEN($ancestor_fqsen); - $name = $element->getName(); - if ($element instanceof Method) { - if (!$ancestor_class->hasMethodWithName($code_base, $name)) { - return null; - } - return $ancestor_class->getMethodByName($code_base, $name); - } elseif ($element instanceof ClassConstant) { - if (!$ancestor_class->hasConstantWithName($code_base, $name)) { - return null; - } - $constant_fqsen = FullyQualifiedClassConstantName::make( - $ancestor_fqsen, - $name - ); - return $code_base->getClassConstantByFQSEN($constant_fqsen); - } elseif ($element instanceof Property) { - if (!$ancestor_class->hasPropertyWithName($code_base, $name)) { - return null; - } - return $ancestor_class->getPropertyByName($code_base, $name); - } - return null; - } - - private static function markMethodAsOverridden(CodeBase $code_base, FullyQualifiedMethodName $method_fqsen) - { - if (!$code_base->hasMethodWithFQSEN($method_fqsen)) { - return; - } - $method = $code_base->getMethodByFQSEN($method_fqsen); - $method->setIsOverriddenByAnother(true); - } - - /** - * Sets the declaration id of the node containing this user-defined class - * @return void - */ - public function setDeclId(int $id) - { - $this->decl_id = $id; - } - - /** - * Gets the declaration id of the node containing this user-defined class. - * Returns 0 for internal classes. - */ - public function getDeclId() : int - { - return $this->decl_id; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/ClosedScopeElement.php b/vendor/phan/phan/src/Phan/Language/Element/ClosedScopeElement.php deleted file mode 100644 index 3a153c0..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/ClosedScopeElement.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\Language\Scope\ClosedScope; - -/** - * A trait for closed scope elements (classes, functions, methods, - * closures). - */ -trait ClosedScopeElement -{ - - /** - * @var ClosedScope the scope within this closed scope element. - */ - private $internal_scope; - - /** - * Sets the internal scope of this closed scope element. - * @return void - */ - public function setInternalScope(ClosedScope $internal_scope) - { - $this->internal_scope = $internal_scope; - } - - /** - * @return ClosedScope - * The internal scope of this closed scope element - */ - public function getInternalScope() : ClosedScope - { - return $this->internal_scope; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Comment.php b/vendor/phan/phan/src/Phan/Language/Element/Comment.php deleted file mode 100644 index 9811ccc..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Comment.php +++ /dev/null @@ -1,684 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Language\Element; - -use AssertionError; -use Phan\CodeBase; -use Phan\Config; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\Comment\Assertion; -use Phan\Language\Element\Comment\Builder; -use Phan\Language\Element\Comment\Method as CommentMethod; -use Phan\Language\Element\Comment\NullComment; -use Phan\Language\Element\Comment\Parameter as CommentParameter; -use Phan\Language\Element\Comment\Property as CommentProperty; -use Phan\Language\Element\Comment\ReturnComment; -use Phan\Language\Type; -use Phan\Language\Type\TemplateType; -use Phan\Language\UnionType; -use Phan\Library\None; -use Phan\Library\Option; - -/** - * Handles extracting information(param types, return types, magic methods/properties, etc.) from phpdoc comments. - * Instances of Comment contain the extracted information. - * - * @see Builder for the logic to create an instance of this class. - */ -class Comment -{ - const ON_CLASS = 1; - const ON_VAR = 2; - const ON_PROPERTY = 3; - const ON_CONST = 4; - // TODO: Add another type for closure. (e.g. (at)phan-closure-scope) - const ON_METHOD = 5; - const ON_FUNCTION = 6; - - // List of types that are function-like (e.g. have params and function body) - const FUNCTION_LIKE = [ - self::ON_METHOD, - self::ON_FUNCTION, - ]; - - // Lists of types that can have (at)var annotations. - const HAS_VAR_ANNOTATION = [ - self::ON_METHOD, - self::ON_FUNCTION, - self::ON_VAR, - self::ON_PROPERTY, - self::ON_CONST, - ]; - - const HAS_TEMPLATE_ANNOTATION = [ - self::ON_CLASS, - self::ON_FUNCTION, - self::ON_METHOD, - ]; - - const NAME_FOR_TYPE = [ - self::ON_CLASS => 'class', - self::ON_VAR => 'variable', - self::ON_PROPERTY => 'property', - self::ON_CONST => 'constant', - self::ON_METHOD => 'method', - self::ON_FUNCTION => 'function', - ]; - - /** - * @deprecated use Builder::WORD_REGEX - */ - const WORD_REGEX = '([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)'; - // @phan-suppress-previous-line PhanUnreferencedPublicClassConstant - - /** - * @var int - contains a subset of flags to set on elements - * Flags::CLASS_FORBID_UNDECLARED_MAGIC_PROPERTIES - * Flags::CLASS_FORBID_UNDECLARED_MAGIC_METHODS - * Flags::IS_READ_ONLY - * Flags::IS_WRITE_ONLY - * Flags::IS_DEPRECATED - */ - protected $comment_flags = 0; - - /** - * @var array<int,CommentParameter> - * A list of CommentParameters from var declarations - */ - protected $variable_list = []; - - /** - * @var array<int,CommentParameter> - * A list of CommentParameters from param declarations - */ - protected $parameter_list = []; - - /** - * @var array<string,CommentParameter> - * A map from variable name to CommentParameters from - * param declarations - */ - protected $parameter_map = []; - - /** - * @var array<int,TemplateType> - * A list of template types parameterizing a generic class - */ - protected $template_type_list = []; - - /** - * @var Option<Type>|None - * Classes may specify their inherited type explicitly - * via `(at)inherits Type`. - */ - protected $inherited_type; - - /** - * @var ReturnComment|null - * the representation of an (at)return directive - */ - protected $return_comment = null; - - /** - * @var array<string,int> - * A set of issue types to be suppressed - */ - protected $suppress_issue_set = []; - - /** - * @var array<string,CommentProperty> - * A mapping from magic property parameters to types. - */ - protected $magic_property_map = []; - - /** - * @var array<string,CommentMethod> - * A mapping from magic methods to parsed parameters, name, and return types. - */ - protected $magic_method_map = []; - - /** - * @var UnionType a list of types for (at)throws annotations - */ - protected $throw_union_type; - - /** - * @var Option<Type>|None - * An optional class name defined by an (at)phan-closure-scope directive. - * (overrides the class in which it is analyzed) - */ - protected $closure_scope; - - /** - * @var array<string,Assertion> - * An optional assertion on a parameter's type - */ - protected $param_assertion_map = []; - - /** - * A private constructor meant to ingest a parsed comment - * docblock. - * - * @param int $comment_flags uses the following flags - * - Flags::IS_DEPRECATED - * Set to true if the comment contains a 'deprecated' - * directive. - * - Flags::CLASS_FORBID_UNDECLARED_MAGIC_PROPERTIES - * - Flags::CLASS_FORBID_UNDECLARED_MAGIC_METHODS - * - * @param array<int,CommentParameter> $variable_list - * - * @param array<int,CommentParameter> $parameter_list - * - * @param array<int,TemplateType> $template_type_list - * A list of template types parameterizing a generic class - * - * @param Option<Type>|None $inherited_type (Note: some issues with templates and narrowing signature types to phpdoc type, added None as a workaround) - * An override on the type of the extended class - * - * @param ?ReturnComment $return_comment - * - * @param array<string,int> $suppress_issue_set - * A set of tags for error type to be suppressed - * - * @param array<int,CommentProperty> $magic_property_list - * - * @param array<int,CommentMethod> $magic_method_list - * - * @param array<string,mixed> $phan_overrides - * - * @param Option<Type>|None $closure_scope - * For closures: Allows us to document the class of the object - * to which a closure will be bound. - * - * @param UnionType $throw_union_type - * - * @param array<string,Assertion> $param_assertion_map - * - * @internal - */ - public function __construct( - int $comment_flags, - array $variable_list, - array $parameter_list, - array $template_type_list, - Option $inherited_type, - $return_comment, - array $suppress_issue_set, - array $magic_property_list, - array $magic_method_list, - array $phan_overrides, - Option $closure_scope, - UnionType $throw_union_type, - array $param_assertion_map, - CodeBase $code_base, - Context $context - ) { - $this->comment_flags = $comment_flags; - $this->variable_list = $variable_list; - $this->parameter_list = $parameter_list; - $this->template_type_list = $template_type_list; - $this->inherited_type = $inherited_type; - $this->return_comment = $return_comment; - $this->suppress_issue_set = $suppress_issue_set; - $this->closure_scope = $closure_scope; - $this->throw_union_type = $throw_union_type; - $this->param_assertion_map = $param_assertion_map; - - foreach ($this->parameter_list as $i => $parameter) { - $name = $parameter->getName(); - if ($name) { - if (isset($this->parameter_map[$name])) { - Issue::maybeEmit( - $code_base, - $context, - Issue::CommentDuplicateParam, - $context->getLineNumberStart(), - $name - ); - } - // Add it to the named map - $this->parameter_map[$name] = $parameter; - - // Remove it from the offset map - unset($this->parameter_list[$i]); - } - } - foreach ($magic_property_list as $property) { - $name = $property->getName(); - if ($name) { - if (isset($this->magic_property_map[$name])) { - // Emit warning for duplicates. - Issue::maybeEmit( - $code_base, - $context, - Issue::CommentDuplicateMagicProperty, - $context->getLineNumberStart(), - $name - ); - } - // Add it to the named map - $this->magic_property_map[$name] = $property; - } - } - foreach ($magic_method_list as $method) { - $name = $method->getName(); - if ($name) { - if (isset($this->magic_method_map[$name])) { - // Emit warning for duplicates. - Issue::maybeEmit( - $code_base, - $context, - Issue::CommentDuplicateMagicMethod, - $context->getLineNumberStart(), - $name - ); - } - // Add it to the named map - $this->magic_method_map[$name] = $method; - } - } - foreach ($phan_overrides as $key => $override_value) { - $this->applyOverride($key, $override_value); - } - } - - /** - * @param mixed $value - * @return void - */ - private function applyOverride(string $key, $value) - { - switch ($key) { - case 'param': - foreach ($value as $parameter) { - $name = $parameter->getName(); - if ($name) { - // Add it to the named map - // TODO: could check that @phan-param is compatible with the original @param - $this->parameter_map[$name] = $parameter; - } - } - return; - case 'return': - // TODO: could check that @phan-return is compatible with the original @return - $this->return_comment = $value; - return; - case 'var': - // TODO: Remove pre-existing entries. - $this->mergeVariableList($value); - return; - case 'property': - foreach ($value as $property) { - $name = $property->getName(); - if ($name) { - // Override or add the entry in the named map - $this->magic_property_map[$name] = $property; - } - } - return; - case 'method': - foreach ($value as $method) { - $name = $method->getName(); - if ($name) { - // Override or add the entry in the named map - $this->magic_method_map[$name] = $method; - } - } - return; - case 'template': - $this->template_type_list = $value; - return; - case 'inherits': - case 'extends': - $this->inherited_type = $value; - return; - } - } - - /** - * @param array<int,CommentParameter> $override_comment_vars - * A list of CommentParameters from var declarations - */ - private function mergeVariableList(array $override_comment_vars) - { - $known_names = []; - foreach ($override_comment_vars as $override_var) { - $known_names[$override_var->getName()] = true; - } - foreach ($this->variable_list as $i => $var) { - if (isset($known_names[$var->getName()])) { - unset($this->variable_list[$i]); - } - } - $this->variable_list = \array_merge($this->variable_list, $override_comment_vars); - } - - - /** - * @param string $comment full text of doc comment - * @param CodeBase $code_base - * @param Context $context - * @param int $comment_type self::ON_* (the type of comment this is) - * @return Comment - * A comment built by parsing the given doc block - * string. - * - * suppress PhanTypeMismatchArgument - Still need to work out issues with prefer_narrowed_phpdoc_param_type - */ - public static function fromStringInContext( - string $comment, - CodeBase $code_base, - Context $context, - int $lineno, - int $comment_type - ) : Comment { - - // Don't parse the comment if this doesn't need to. - if (!$comment || !Config::getValue('read_type_annotations') || \strpos($comment, '@') === false) { - return NullComment::instance(); - } - - // @phan-suppress-next-line PhanAccessMethodInternal - return (new Builder( - $comment, - $code_base, - $context, - $lineno, - $comment_type - ))->build(); - } - - // TODO: Is `@return &array` valid phpdoc2? - - /** - * @return bool - * Set to true if the comment contains a 'deprecated' - * directive. - */ - public function isDeprecated() : bool - { - return ($this->comment_flags & Flags::IS_DEPRECATED) != 0; - } - - /** - * @return bool - * Set to true if the comment contains an 'override' - * directive. - */ - public function isOverrideIntended() : bool - { - return ($this->comment_flags & Flags::IS_OVERRIDE_INTENDED) != 0; - } - - /** - * @return bool - * Set to true if the comment contains an 'internal' - * directive. - */ - public function isNSInternal() : bool - { - return ($this->comment_flags & Flags::IS_NS_INTERNAL) != 0; - } - - /** - * @internal - */ - const FLAGS_FOR_PROPERTY = Flags::IS_NS_INTERNAL | Flags::IS_DEPRECATED | Flags::IS_READ_ONLY | Flags::IS_WRITE_ONLY; - - /** - * Gets the subset of the bitmask that applies to properties. - */ - public function getPhanFlagsForProperty() : int - { - return $this->comment_flags & self::FLAGS_FOR_PROPERTY; - } - - /** - * @return bool - * Set to true if the comment contains a 'phan-forbid-undeclared-magic-properties' - * directive. - */ - public function getForbidUndeclaredMagicProperties() : bool - { - return ($this->comment_flags & Flags::CLASS_FORBID_UNDECLARED_MAGIC_PROPERTIES) != 0; - } - - /** - * @return bool - * Set to true if the comment contains a 'phan-forbid-undeclared-magic-methods' - * directive. - */ - public function getForbidUndeclaredMagicMethods() : bool - { - return ($this->comment_flags & Flags::CLASS_FORBID_UNDECLARED_MAGIC_METHODS) != 0; - } - - /** - * @return UnionType - * A UnionType defined by a (at)return directive - */ - public function getReturnType() : UnionType - { - if (!$this->return_comment) { - throw new AssertionError('Should check hasReturnUnionType'); - } - return $this->return_comment->getType(); - } - - /** - * @return int - * A line of a (at)return directive - */ - public function getReturnLineno() : int - { - if (!$this->return_comment) { - throw new AssertionError('Should check hasReturnUnionType'); - } - return $this->return_comment->getLineno(); - } - - /** - * @return bool - * True if this doc block contains a (at)return - * directive specifying a type. - */ - public function hasReturnUnionType() : bool - { - return $this->return_comment !== null; - } - - /** - * @return Option<Type> - * An optional Type defined by a (at)phan-closure-scope - * directive specifying a single type. - * - * @suppress PhanPartialTypeMismatchReturn (Null) - */ - public function getClosureScopeOption() : Option - { - return $this->closure_scope; - } - - /** - * @return array<int,CommentParameter> (The leftover parameters without a name) - * - * @suppress PhanUnreferencedPublicMethod - */ - public function getParameterList() : array - { - return $this->parameter_list; - } - - /** - * @return array<string,CommentParameter> (maps the names of parameters to their values. Does not include parameters which didn't provide names) - */ - public function getParameterMap() : array - { - return $this->parameter_map; - } - - /** - * @return array<int,TemplateType> - * A list of template types parameterizing a generic class - */ - public function getTemplateTypeList() : array - { - return $this->template_type_list; - } - - /** - * @return Option<Type> - * An optional type declaring what a class extends. - * @suppress PhanPartialTypeMismatchReturn (Null) - */ - public function getInheritedTypeOption() : Option - { - return $this->inherited_type; - } - - /** - * @return array<int,string> - * A set of issue names like 'PhanUnreferencedPublicMethod' to suppress - * @deprecated - */ - public function getSuppressIssueList() : array - { - return array_keys($this->suppress_issue_set); - } - - /** - * @return array<string,int> - * A set of issue names like 'PhanUnreferencedPublicMethod' to suppress. - * If the values of fields are 0, the suppressions were not used yet. - */ - public function getSuppressIssueSet() : array - { - return $this->suppress_issue_set; - } - - /** - * @return bool - * True if we have a parameter at the given offset - */ - public function hasParameterWithNameOrOffset( - string $name, - int $offset - ) : bool { - if (isset($this->parameter_map[$name])) { - return true; - } - - return isset($this->parameter_list[$offset]); - } - - /** - * @return CommentParameter - * The parameter at the given offset - */ - public function getParameterWithNameOrOffset( - string $name, - int $offset - ) : CommentParameter { - if (isset($this->parameter_map[$name])) { - return $this->parameter_map[$name]; - } - - return $this->parameter_list[$offset]; - } - - /** - * @unused - * @return bool - * True if we have a magic property with the given name - */ - public function hasMagicPropertyWithName( - string $name - ) : bool { - return isset($this->magic_property_map[$name]); - } - - /** - * Returns the magic property with the given name. - * May or may not have a type. - * @unused - * @suppress PhanUnreferencedPublicMethod not used right now, but making it available for plugins - */ - public function getMagicPropertyWithName( - string $name - ) : CommentProperty { - return $this->magic_property_map[$name]; - } - - /** - * @return array<string,CommentProperty> map from parameter name to parameter - */ - public function getMagicPropertyMap() : array - { - return $this->magic_property_map; - } - - /** - * @return array<string,CommentMethod> map from method name to method info - */ - public function getMagicMethodMap() : array - { - return $this->magic_method_map; - } - - /** - * @return UnionType list of types for throws statements - */ - public function getThrowsUnionType() : UnionType - { - return $this->throw_union_type; - } - - /** - * @return array<int,CommentParameter> the list of (at)var annotations - */ - public function getVariableList() : array - { - return $this->variable_list; - } - - /** - * @return array<string,Assertion> maps parameter names to assertions about those parameters - */ - public function getParamAssertionMap() : array - { - return $this->param_assertion_map; - } - - public function __toString() : string - { - // TODO: add new properties of Comment to this method - // (magic methods, magic properties, custom @phan directives, etc.)) - $string = "/**\n"; - - if (($this->comment_flags & Flags::IS_DEPRECATED) != 0) { - $string .= " * @deprecated\n"; - } - - foreach ($this->variable_list as $variable) { - $string .= " * @var $variable\n"; - } - - foreach ($this->parameter_list as $parameter) { - $string .= " * @param $parameter\n"; - } - - if ($this->return_comment) { - $string .= " * @return {$this->return_comment->getType()}\n"; - } - foreach ($this->throw_union_type->getTypeSet() as $type) { - $string .= " * @throws {$type}\n"; - } - - $string .= " */\n"; - - return $string; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Comment/Assertion.php b/vendor/phan/phan/src/Phan/Language/Element/Comment/Assertion.php deleted file mode 100644 index 19e5c43..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Comment/Assertion.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Language\Element\Comment; - -use Phan\Language\UnionType; - -/** - * Represents an assertion on a parameter type. - * - * @internal - */ -class Assertion -{ - const IS_OF_TYPE = 1; - const IS_NOT_OF_TYPE = 2; - const IS_TRUE = 3; - const IS_FALSE = 4; - - /** @var UnionType the type that is used in this assertion */ - public $union_type; - /** @var string the parameter name that the assertion affects */ - public $param_name; - /** @var 1|2|3|4 an enum self::IS_* */ - public $assertion_type; - - /** - * @param 1|2|3|4 $assertion_type - */ - public function __construct(UnionType $union_type, string $param_name, int $assertion_type) - { - $this->union_type = $union_type; - $this->param_name = $param_name; - $this->assertion_type = $assertion_type; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Comment/Builder.php b/vendor/phan/phan/src/Phan/Language/Element/Comment/Builder.php deleted file mode 100644 index 3b47a69..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Comment/Builder.php +++ /dev/null @@ -1,1294 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Language\Element\Comment; - -use Phan\CodeBase; -use Phan\Config; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Comment; -use Phan\Language\Element\Flags; -use Phan\Language\FQSEN; -use Phan\Language\Scope\TemplateScope; -use Phan\Language\Type; -use Phan\Language\Type\TemplateType; -use Phan\Language\Type\VoidType; -use Phan\Language\UnionType; -use Phan\Library\FileCache; -use Phan\Library\None; -use Phan\Library\Option; -use Phan\Library\Some; -use Phan\Suggestion; - -use function count; - -/** - * This constructs comments from doc comments (or other comment types). - * - * @internal - For use only by Comment.php - */ -final class Builder -{ - /** @var string the original raw comment */ - public $comment; - /** @var array<int,string> the list of lines of the doc comment */ - public $lines; - /** @var int count($this->lines) */ - public $comment_lines_count; - /** @var CodeBase The code base within which we're operating. */ - public $code_base; - /** @var Context the context of the parser at the comment we're reading */ - public $context; - /** @var int the line number of the element this doc comment belongs to */ - public $lineno; - /** @var int an enum value from Comment::ON_* */ - public $comment_type; - /** @var array<int,Parameter> the list of extracted (at)var annotations*/ - public $variable_list = []; - /** @var array<int,Parameter> the list of extracted (at)param annotations */ - public $parameter_list = []; - /** @var array<string,TemplateType> the list of extracted (at)template annotations */ - public $template_type_list = []; - /** @var Option<Type> the (at)inherits annotation */ - public $inherited_type; - // TODO: Warn about multiple (at)returns - /** @var ?ReturnComment the (at)return annotation details */ - public $return_comment; - /** - * @var array<string,int> the set of issue names from (at)suppress annotations - */ - public $suppress_issue_set = []; - /** @var array<int,Property> the list of (at)property annotations (and property-read, property-write) */ - public $magic_property_list = []; - /** @var array<int,Method> the list of (at)method annotations */ - public $magic_method_list = []; - /** @var Option<Type> the type a closure will be bound to */ - public $closure_scope; - /** @var int combination of flags from \Phan\Flags */ - public $comment_flags = 0; - /** @var array<string,mixed> annotations for Phan that override the standardized version of those annotations. Used for compatibility with other tools. */ - public $phan_overrides = []; - /** @var UnionType the union type of the set of (at)throws annotations */ - public $throw_union_type; - /** @var array<string,Assertion> assertions about each parameter */ - public $param_assertion_map = []; - - /** @var bool did we add template types already */ - protected $did_add_template_types; - - /** - * A list of issues detected in the comment being built. - * This is stored instead of immediately emitting the issue because later lines might suppress these issues. - * - * @var array<int,array{0:string,1:int,2:array<int,mixed>,3:?Suggestion}> - */ - private $issues = []; - - public function __construct( - string $comment, - CodeBase $code_base, - Context $context, - int $lineno, - int $comment_type, - bool $did_add_template_types = false - ) { - $this->comment = $comment; - $this->lines = \explode("\n", $comment); - $this->comment_lines_count = \count($this->lines); - $this->code_base = $code_base; - $this->context = $context; - $this->lineno = $lineno; - $this->comment_type = $comment_type; - $this->did_add_template_types = $did_add_template_types; - - $this->inherited_type = new None(); - $this->return_comment = null; - $this->closure_scope = new None(); - $this->throw_union_type = UnionType::empty(); - } - - /** @internal */ - const PARAM_COMMENT_REGEX = - '/@(?:phan-)?(param|var)\b\s*(' . UnionType::union_type_regex . ')?(?:\s*(\.\.\.)?\s*&?(?:\\$' . self::WORD_REGEX . '))?/'; - - /** - * @param string $line - * An individual line of a comment - * - * @param bool $is_var - * True if this is parsing a variable, false if parsing a parameter. - * - * @return Parameter - * A Parameter associated with a line that has a var - * or param reference. - * - * TODO: account for difference between (at)var and (at)param - */ - private function parameterFromCommentLine( - string $line, - bool $is_var, - int $i - ) { - $matched = \preg_match(self::PARAM_COMMENT_REGEX, $line, $match); - // Parse https://docs.phpdoc.org/references/phpdoc/tags/param.html - // Exceptions: Deliberately allow "&" in "@param int &$x" when documenting references. - // Warn if there is neither a union type nor a variable - if ($matched && (isset($match[2]) || isset($match[17]))) { - if (!isset($match[2])) { - return new Parameter('', UnionType::empty(), $this->guessActualLineLocation($i)); - } - if (!$is_var && !isset($match[17])) { - $this->checkParamWithoutVarName($line, $match[0], $match[2], $i); - } - $original_type = $match[2]; - - $is_variadic = ($match[16] ?? '') === '...'; - - if ($is_var && $is_variadic) { - $variable_name = ''; // "@var int ...$x" is nonsense and invalid phpdoc. - } else { - $variable_name = $match[17] ?? ''; - if ($is_var && $variable_name === '' && $this->comment_type === Comment::ON_PROPERTY) { - $char_at_end_offset = $line[\strpos($line, $match[0]) + \strlen($match[0])] ?? ' '; - if (\ord($char_at_end_offset) > 32) { // Not a control character or space - $this->emitIssue( - Issue::UnextractableAnnotationSuffix, - $this->guessActualLineLocation($i), - \trim($line), - $original_type, - $char_at_end_offset - ); - } - } - } - // Fix typos or non-standard phpdoc tags, according to the user's configuration. - // Does nothing by default. - $type = self::rewritePHPDocType($original_type); - - // If the type looks like a variable name, make it an - // empty type so that other stuff can match it. We can't - // just skip it or we'd mess up the parameter order. - if (0 !== \strpos($type, '$')) { - $union_type = - UnionType::fromStringInContext( - $type, - $this->context, - Type::FROM_PHPDOC, - $this->code_base - ); - } else { - $union_type = UnionType::empty(); - } - $is_output_parameter = \stripos($line, '@phan-output-reference') !== false; - - return new Parameter( - $variable_name, - $union_type, - $this->guessActualLineLocation($i), - $is_variadic, - false, // has_default_value - $is_output_parameter - ); - } - - // Don't warn about @param $x Description of $x goes here - // TODO: extract doc comment of @param &$x? - // TODO: Use the right for the name of the comment parameter? - // (don't see a benefit, would create a type if it was (at)var on a function-like) - if (!\preg_match('/@(param|var)\s+(\.\.\.)?\s*(\\$\S+)/', $line)) { - $this->emitIssue( - Issue::UnextractableAnnotation, - $this->guessActualLineLocation($i), - \trim($line) - ); - } - - return new Parameter('', UnionType::empty()); - } - - /** @internal */ - const RETURN_COMMENT_REGEX = '/@(?:phan-)?(?:return|throws)\s+(&\s*)?(' . UnionType::union_type_regex_or_this . ')/'; - - /** - * @param string $line - * An individual line of a comment - * - * @return UnionType - * The declared return type - */ - private function returnTypeFromCommentLine( - string $line, - int $i - ) { - $return_union_type_string = ''; - - if (\preg_match(self::RETURN_COMMENT_REGEX, $line, $match)) { - $return_union_type_string = $match[2]; - $raw_match = $match[0]; - $char_at_end_offset = $line[\strpos($line, $raw_match) + \strlen($raw_match)] ?? ' '; - if (\ord($char_at_end_offset) > 32) { // Not a control character or space - $this->emitIssue( - Issue::UnextractableAnnotationSuffix, - $this->guessActualLineLocation($i), - \trim($line), - $return_union_type_string, - $char_at_end_offset - ); - } - } else { - $this->emitIssue( - Issue::UnextractableAnnotation, - $this->guessActualLineLocation($i), - \trim($line) - ); - } - // Not emitting any issues about failing to extract, e.g. `@return - Description of what this returns` is a valid comment. - $return_union_type_string = self::rewritePHPDocType($return_union_type_string); - - $return_union_type = UnionType::fromStringInContext( - $return_union_type_string, - $this->context, - Type::FROM_PHPDOC, - $this->code_base - ); - - return $return_union_type; - } - - private static function rewritePHPDocType( - string $original_type - ) : string { - // TODO: Would need to pass in CodeBase to emit an issue: - $type = Config::getValue('phpdoc_type_mapping')[\strtolower($original_type)] ?? null; - if (\is_string($type)) { - return $type; - } - return $original_type; - } - - - /** - * This should be uncommon: $line is a parameter for which a parameter name could not be parsed - */ - private function checkParamWithoutVarName( - string $line, - string $raw_match, - string $union_type_string, - int $i - ) { - - $match_offset = \strpos($line, $raw_match); - $end_offset = $match_offset + \strlen($raw_match); - - $char_at_end_offset = $line[$end_offset] ?? ' '; - $issue_line = $this->guessActualLineLocation($i); - if (\ord($char_at_end_offset) > 32) { // Not a control character or space - $this->emitIssue( - Issue::UnextractableAnnotationSuffix, - $issue_line, - \trim($line), - $union_type_string, - $char_at_end_offset - ); - } - - $this->emitIssue( - Issue::UnextractableAnnotationElementName, - $issue_line, - \trim($line), - $union_type_string - ); - } - - /** - * Extracts information from the doc comment instance, - * parses it, and creates a Comment representing the extracted information. - */ - public function build() : Comment - { - foreach ($this->lines as $i => $line) { - if (\strpos($line, '@') === false) { - continue; - } - $this->parseCommentLine($i, \trim($line)); - } - - if (\count($this->template_type_list)) { - if (!$this->did_add_template_types) { - return $this->buildWithTemplateTypes(); - } - } - if ($this->issues) { - $this->emitDeferredIssues(); - } - - // @phan-suppress-next-line PhanAccessMethodInternal - return new Comment( - $this->comment_flags, - $this->variable_list, - $this->parameter_list, - \array_values($this->template_type_list), - $this->inherited_type, - $this->return_comment, - $this->suppress_issue_set, - $this->magic_property_list, - $this->magic_method_list, - $this->phan_overrides, - $this->closure_scope, - $this->throw_union_type, - $this->param_assertion_map, - // NOTE: The code base and context are used for emitting issues, and are not saved - $this->code_base, - $this->context - ); - } - - private function buildWithTemplateTypes() : Comment - { - $old_scope = $this->context->getScope(); - $new_scope = new TemplateScope($old_scope, $this->template_type_list); - $new_context = $this->context->withScope($new_scope); - // $result = Type::fromStringInContext('T', $new_context, Type::FROM_PHPDOC, $this->code_base); - return (new self( - $this->comment, - $this->code_base, - $new_context, - $this->lineno, - $this->comment_type, - true - ))->build(); - } - - /** - * @return void - */ - private function parseCommentLine(int $i, string $line) - { - // https://secure.php.net/manual/en/regexp.reference.internal-options.php - // (?i) makes this case-sensitive, (?-1) makes it case-insensitive - // phpcs:ignore Generic.Files.LineLength.MaxExceeded - if (\preg_match('/@((?i)param|var|return|throws|throw|returns|inherits|extends|suppress|phan-[a-z0-9_-]*(?-i)|method|property|property-read|property-write|template|PhanClosureScope)(?:[^a-zA-Z0-9_\x7f-\xff-]|$)/', $line, $matches)) { - $case_sensitive_type = $matches[1]; - $type = \strtolower($case_sensitive_type); - - if ($type === 'param') { - $this->parseParamLine($i, $line); - } elseif ($type === 'var') { - $this->maybeParseVarLine($i, $line); - } elseif ($type === 'template') { - $this->maybeParseTemplateType($i, $line); - } elseif ($type === 'inherits' || $type === 'extends') { - $this->maybeParseInherits($i, $line, $type); - } elseif ($type === 'return') { - $this->maybeParseReturn($i, $line); - } elseif ($type === 'returns') { - $this->emitIssue( - Issue::MisspelledAnnotation, - $this->guessActualLineLocation($i), - '@returns', - 'Did you mean @return?' - ); - } elseif ($type === 'throws') { - $this->maybeParseThrows($i, $line); - } elseif ($type === 'throw') { - $this->emitIssue( - Issue::MisspelledAnnotation, - $this->guessActualLineLocation($i), - '@throw', - 'Did you mean @throws?' - ); - } elseif ($type === 'suppress') { - $this->maybeParseSuppress($i, $line); - } elseif ($type === 'property' || $type === 'property-read' || $type === 'property-write') { - $this->maybeParseProperty($i, $line); - } elseif ($type === 'method') { - $this->maybeParseMethod($i, $line); - } elseif ($type === 'phanclosurescope' || $type === 'phan-closure_scope') { - $this->maybeParsePhanClosureScope($i, $line); - } elseif (\strpos($type, 'phan-') === 0) { - $this->maybeParsePhanCustomAnnotation($i, $line, $type, $case_sensitive_type); - } - } - - if (\strpos($line, '@deprecated') !== false) { - if (\preg_match('/@deprecated\b/', $line, $match)) { - $this->comment_flags |= Flags::IS_DEPRECATED; - } - } - - if (\strpos($line, '@internal') !== false) { - if (\preg_match('/@internal\b/', $line, $match)) { - $this->comment_flags |= Flags::IS_NS_INTERNAL; - } - } - - if (\stripos($line, 'override') !== false) { - if (\preg_match('/@([Oo]verride)\b/', $line, $match)) { - // TODO: split class const and global const. - $this->checkCompatible('@override', [Comment::ON_METHOD, Comment::ON_CONST], $i); - $this->comment_flags |= Flags::IS_OVERRIDE_INTENDED; - } - } - } - - private function parseParamLine(int $i, string $line) - { - $this->checkCompatible('@param', Comment::FUNCTION_LIKE, $i); - $this->parameter_list[] = - self::parameterFromCommentLine($line, false, $i); - } - - private function maybeParseVarLine(int $i, string $line) - { - $this->checkCompatible('@var', Comment::HAS_VAR_ANNOTATION, $i); - $comment_var = self::parameterFromCommentLine($line, true, $i); - if (\in_array($this->comment_type, Comment::FUNCTION_LIKE)) { - if ($comment_var->getName() !== '') { - $this->variable_list[] = $comment_var; - } else { - $this->emitIssue( - Issue::UnextractableAnnotation, - $this->guessActualLineLocation($i), - \trim($line) - ); - } - } else { - $this->variable_list[] = $comment_var; - } - } - - private function maybeParseTemplateType(int $i, string $line) - { - // Make sure support for generic types is enabled - if (Config::getValue('generic_types_enabled')) { - $this->checkCompatible('@template', Comment::HAS_TEMPLATE_ANNOTATION, $i); - $template_type = $this->templateTypeFromCommentLine($line); - if ($template_type) { - $this->template_type_list[$template_type->getName()] = $template_type; - } - } - } - - private function maybeParseInherits(int $i, string $line, string $type) - { - $this->checkCompatible('@' . $type, [Comment::ON_CLASS], $i); - // Make sure support for generic types is enabled - if (Config::getValue('generic_types_enabled')) { - $this->inherited_type = $this->inheritsFromCommentLine($line); - } - } - - private function maybeParsePhanInherits(int $i, string $line, string $type) - { - $this->checkCompatible('@' . $type, [Comment::ON_CLASS], $i); - // Make sure support for generic types is enabled - if (Config::getValue('generic_types_enabled')) { - $this->phan_overrides['inherits'] = $this->inheritsFromCommentLine($line); - } - } - - /** - * @internal - */ - const ASSERT_REGEX = '/@phan-assert(?:(-true-condition|-false-condition)|\s+(!?)(' . UnionType::union_type_regex . '))\s+\$' . self::WORD_REGEX . '/'; - /** - * @return ?Assertion - */ - private function assertFromCommentLine(string $line) - { - if (!\preg_match(self::ASSERT_REGEX, $line, $match)) { - return null; - } - $extra_text = $match[1]; - if ($extra_text) { - $assertion_type = $extra_text === '-true-condition' ? Assertion::IS_TRUE : Assertion::IS_FALSE; - $union_type = UnionType::empty(); - } else { - $assertion_type = $match[2] === '!' ? Assertion::IS_NOT_OF_TYPE : Assertion::IS_OF_TYPE; - $type_string = $match[3]; - $union_type = UnionType::fromStringInContext( - $type_string, - $this->context, - Type::FROM_PHPDOC, - $this->code_base - ); - } - $param_name = $match[17]; - - return new Assertion($union_type, $param_name, $assertion_type); - } - - /** - * @return void - */ - private function maybeParsePhanAssert(int $i, string $line) - { - $this->checkCompatible('@phan-assert', Comment::FUNCTION_LIKE, $i); - // Make sure support for generic types is enabled - $assert = $this->assertFromCommentLine($line); - if ($assert) { - $this->param_assertion_map[$assert->param_name] = $assert; - } - } - - private function setPhanAccessFlag(int $i, bool $write_only) - { - // Make sure support for generic types is enabled - if ($this->comment_type === Comment::ON_PROPERTY) { - $this->comment_flags |= ($write_only ? Flags::IS_WRITE_ONLY : Flags::IS_READ_ONLY); - } else { - // Emit warning message - $this->checkCompatible($write_only ? '@phan-write-only' : '@phan-read-only', [Comment::ON_PROPERTY], $i); - } - } - - private function maybeParseReturn(int $i, string $line) - { - $this->checkCompatible('@return', Comment::FUNCTION_LIKE, $i); - $return_comment = $this->return_comment; - $new_type = $this->returnTypeFromCommentLine($line, $i); - if ($return_comment) { - $return_comment->setType($return_comment->getType()->withUnionType($new_type)); - } else { - $this->return_comment = new ReturnComment($new_type, $this->guessActualLineLocation($i)); - } - } - - private function maybeParseThrows(int $i, string $line) - { - $this->checkCompatible('@throws', Comment::FUNCTION_LIKE, $i); - $this->throw_union_type = $this->throw_union_type->withUnionType( - $this->returnTypeFromCommentLine($line, $i) - ); - } - - private function maybeParseSuppress(int $i, string $line) - { - $suppress_issue_types = $this->suppressIssuesFromCommentLine($line); - if (count($suppress_issue_types) > 0) { - foreach ($suppress_issue_types as $issue_type) { - $this->suppress_issue_set[$issue_type] = 0; - } - } else { - $this->emitIssue( - Issue::UnextractableAnnotation, - $this->guessActualLineLocation($i), - \trim($line) - ); - } - } - - private function maybeParseProperty(int $i, string $line) - { - $this->checkCompatible('@property', [Comment::ON_CLASS], $i); - // Make sure support for magic properties is enabled. - if (Config::getValue('read_magic_property_annotations')) { - $magic_property = $this->magicPropertyFromCommentLine($line, $i); - if ($magic_property !== null) { - $this->magic_property_list[] = $magic_property; - } - } - } - - private function maybeParseMethod(int $i, string $line) - { - // Make sure support for magic methods is enabled. - if (Config::getValue('read_magic_method_annotations')) { - $this->checkCompatible('@method', [Comment::ON_CLASS], $i); - $magic_method = $this->magicMethodFromCommentLine($line, $i); - if ($magic_method !== null) { - $this->magic_method_list[] = $magic_method; - } - } - } - - private function maybeParsePhanClosureScope(int $i, string $line) - { - // TODO: different type for closures - $this->checkCompatible('@phan-closure-scope', Comment::FUNCTION_LIKE, $i); - $this->closure_scope = $this->getPhanClosureScopeFromCommentLine($line, $i); - } - - private function maybeParsePhanCustomAnnotation(int $i, string $line, string $type, string $case_sensitive_type) - { - switch ($type) { - case 'phan-forbid-undeclared-magic-properties': - $this->checkCompatible('@phan-forbid-undeclared-magic-properties', [Comment::ON_CLASS], $i); - $this->comment_flags |= Flags::CLASS_FORBID_UNDECLARED_MAGIC_PROPERTIES; - return; - case 'phan-forbid-undeclared-magic-methods': - $this->checkCompatible('@phan-forbid-undeclared-magic-methods', [Comment::ON_CLASS], $i); - $this->comment_flags |= Flags::CLASS_FORBID_UNDECLARED_MAGIC_METHODS; - return; - case 'phan-closure-scope': - $this->checkCompatible('@phan-closure-scope', Comment::FUNCTION_LIKE, $i); - $this->closure_scope = $this->getPhanClosureScopeFromCommentLine($line, $i); - return; - case 'phan-param': - $this->checkCompatible('@phan-param', Comment::FUNCTION_LIKE, $i); - $this->phan_overrides['param'][] = - $this->parameterFromCommentLine($line, false, $i); - return; - case 'phan-return': - $this->checkCompatible('@phan-return', Comment::FUNCTION_LIKE, $i); - $this->phan_overrides['return'] = new ReturnComment($this->returnTypeFromCommentLine($line, $i), $this->guessActualLineLocation($i)); - return; - case 'phan-override': - $this->checkCompatible('@override', [Comment::ON_METHOD, Comment::ON_CONST], $i); - $this->comment_flags |= Flags::IS_OVERRIDE_INTENDED; - return; - case 'phan-var': - $this->checkCompatible('@phan-var', Comment::HAS_VAR_ANNOTATION, $i); - $comment_var = $this->parameterFromCommentLine($line, true, $i); - if (\in_array($this->comment_type, Comment::FUNCTION_LIKE)) { - if ($comment_var->getName() !== '') { - $this->phan_overrides['var'][] = $comment_var; - } else { - $this->emitIssue( - Issue::UnextractableAnnotation, - $this->guessActualLineLocation($i), - \trim($line) - ); - } - } else { - $this->phan_overrides['var'][] = $comment_var; - } - return; - case 'phan-file-suppress': - // See BuiltinSuppressionPlugin - return; - case 'phan-suppress': - $this->maybeParseSuppress($i, $line); - return; - case 'phan-property': - case 'phan-property-read': - case 'phan-property-write': - $this->parsePhanProperty($i, $line); - return; - case 'phan-method': - $this->parsePhanMethod($i, $line); - return; - case 'phan-suppress-next-line': - case 'phan-suppress-next-next-line': - case 'phan-suppress-current-line': - case 'phan-suppress-previous-line': - // Do nothing, see BuiltinSuppressionPlugin - return; - case 'phan-template': - $this->maybeParseTemplateType($i, $line); - return; - case 'phan-inherits': - case 'phan-extends': - $this->maybeParsePhanInherits($i, $line, (string)\substr($type, 5)); - return; - case 'phan-read-only': - $this->setPhanAccessFlag($i, false); - return; - case 'phan-write-only': - $this->setPhanAccessFlag($i, true); - return; - case 'phan-transient': - // Do nothing, see SleepCheckerPlugin - return; - case 'phan-assert': - case 'phan-assert-true-condition': - case 'phan-assert-false-condition': - $this->maybeParsePhanAssert($i, $line); - return; - default: - $this->emitIssueWithSuggestion( - Issue::MisspelledAnnotation, - $this->guessActualLineLocation($i), - [ - '@' . $case_sensitive_type, - "The annotations that this version of Phan supports can be seen by running 'phan --help-annotations' or by visiting https://github.com/phan/phan/wiki/Annotating-Your-Source-Code", - ], - self::generateSuggestionForMisspelledAnnotation($case_sensitive_type) - ); - return; - } - } - - /** - * @return ?Suggestion - */ - private static function generateSuggestionForMisspelledAnnotation(string $annotation) - { - $suggestions = IssueFixSuggester::getSuggestionsForStringSet('@' . $annotation, self::SUPPORTED_ANNOTATIONS); - if (!$suggestions) { - return null; - } - return Suggestion::fromString('Did you mean ' . implode(' or ', array_keys($suggestions))); - } - - /** - * Maps supported annotations starting with phan- to the empty string or a description - */ - const SUPPORTED_ANNOTATIONS = [ - '@phan-assert' => '', - '@phan-assert-true-condition' => '', - '@phan-assert-false-condition' => '', - '@phan-closure-scope' => '', - '@phan-extends' => '', - '@phan-file-suppress' => '', - '@phan-forbid-undeclared-magic-methods' => '', - '@phan-forbid-undeclared-magic-properties' => '', - '@phan-inherits' => '', - '@phan-method' => '', - '@phan-override' => '', - '@phan-param' => '', - '@phan-property' => '', - '@phan-property-read' => '', - '@phan-property-write' => '', - '@phan-read-only' => '', - '@phan-return' => '', - '@phan-suppress' => '', - '@phan-suppress-current-line' => '', - '@phan-suppress-next-line' => '', - '@phan-suppress-next-next-line' => '', - '@phan-suppress-previous-line' => '', - '@phan-template' => '', - '@phan-var' => '', - '@phan-write-only' => '', - ]; - - private function parsePhanProperty(int $i, string $line) - { - $this->checkCompatible('@phan-property', [Comment::ON_CLASS], $i); - // Make sure support for magic properties is enabled. - if (Config::getValue('read_magic_property_annotations')) { - $magic_property = $this->magicPropertyFromCommentLine($line, $i); - if ($magic_property !== null) { - $this->phan_overrides['property'][] = $magic_property; - } - } - } - - private function parsePhanMethod(int $i, string $line) - { - // Make sure support for magic methods is enabled. - if (Config::getValue('read_magic_method_annotations')) { - $this->checkCompatible('@phan-method', [Comment::ON_CLASS], $i); - $magic_method = $this->magicMethodFromCommentLine($line, $i); - if ($magic_method !== null) { - $this->phan_overrides['method'][] = $magic_method; - } - } - } - - private function guessActualLineLocation(int $i) : int - { - $path = Config::projectPath($this->context->getFile()); - $entry = FileCache::getEntry($path); - $declaration_lineno = $this->lineno; - if (!$entry) { - return $declaration_lineno; - } - // $lineno_search <= $declaration_lineno - $lineno_search = $declaration_lineno - ($this->comment_lines_count - $i - 1); - // Search up to 10 lines before $lineno_search - $lineno_stop = \max(1, $lineno_search - 9); - $lines_array = $entry->getLines(); - - $line = $this->lines[$i]; - for ($check_lineno = $lineno_search; $check_lineno >= $lineno_stop; $check_lineno--) { - $cur_line = $lines_array[$check_lineno]; - if (\stripos($cur_line, $line) !== false) { - // Better heuristic: Lines in the middle of phpdoc are guaranteed to be complete, including a few newlines at the end. - $j = $i - ($lineno_search - $check_lineno); - if ($j > 0 && $j < $this->comment_lines_count - 1) { - if (\trim($line) !== \trim($cur_line)) { - continue; - } - } - return $check_lineno; - } - } - // We couldn't identify the line; - return $declaration_lineno; - } - - - /** - * @param array<int,int> $valid_types - */ - private function checkCompatible(string $param_name, array $valid_types, int $i) - { - if (!\in_array($this->comment_type, $valid_types, true)) { - $this->emitInvalidCommentForDeclarationType( - $param_name, - $this->guessActualLineLocation($i) - ); - } - } - - /** - * @return void - */ - private function emitInvalidCommentForDeclarationType( - string $annotation_type, - int $issue_lineno - ) { - $this->emitIssue( - Issue::InvalidCommentForDeclarationType, - $issue_lineno, - $annotation_type, - Comment::NAME_FOR_TYPE[$this->comment_type] - ); - } - - /** - * @param string $line - * An individual line of a comment - * - * @return TemplateType|null - * A generic type identifier or null if a valid type identifier - * wasn't found. - */ - private static function templateTypeFromCommentLine( - string $line - ) { - // Backslashes or nested templates wouldn't make sense, so use WORD_REGEX. - if (\preg_match('/@(?:phan-)?template\s+(' . self::WORD_REGEX . ')/', $line, $match)) { - $template_type_identifier = $match[1]; - return TemplateType::instanceForId($template_type_identifier, false); - } - - return null; - } - - /** - * @param string $line - * An individual line of a comment - * - * @return Option<Type> - * An optional type overriding the extended type of the class - */ - private function inheritsFromCommentLine( - string $line - ) { - $match = []; - if (\preg_match('/@(?:phan-)?(?:inherits|extends)\s+(' . Type::type_regex . ')/', $line, $match)) { - $type_string = $match[1]; - - $type = new Some(Type::fromStringInContext( - $type_string, - $this->context, - Type::FROM_PHPDOC, - $this->code_base - )); - - return $type; - } - - return new None(); - } - - /** - * This regex contains a single pattern, which matches a valid PHP identifier. - * (e.g. for variable names, magic property names, etc.) - * This does not allow backslashes. - */ - const WORD_REGEX = '([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)'; - - /** - * This regex contains a single pattern, which matches a reasonable Phan issue name - * (e.g. for variable names, magic property names, etc.) - * - * E.g. "PhanPluginSomeIssueName" (preferred), "PhanPlugin_some_issue_name", and "PhanPlugin-some-issue-name". - * - * Note that Phan doesn't forbid using names not matching this regex in the Issue constructor at the time of writing. - */ - const ISSUE_REGEX = '([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(-[a-zA-Z0-9_\x7f-\xff]+)*)'; - - /** - * @internal - */ - const SUPPRESS_ISSUE_LIST = '(' . self::ISSUE_REGEX . '(,\s*' . self::ISSUE_REGEX . ')*)'; - - /** - * @internal - */ - const PHAN_SUPPRESS_REGEX = '/@(?:phan-)?suppress\s+' . self::SUPPRESS_ISSUE_LIST . '/'; - - /** - * @param string $line - * An individual line of a comment - * - * @return array<int,string> - * 0 or more issue names to suppress - */ - private static function suppressIssuesFromCommentLine( - string $line - ) : array { - if (\preg_match(self::PHAN_SUPPRESS_REGEX, $line, $match)) { - return \array_map('trim', \explode(',', $match[1])); - } - - return []; - } - - /** @internal */ - const MAGIC_PARAM_REGEX = '/^(' . UnionType::union_type_regex . ')?\s*(?:(\.\.\.)\s*)?(?:\$' . self::WORD_REGEX . ')?((?:\s*=.*)?)$/'; - - /** - * Parses a magic method based on https://phpdoc.org/docs/latest/references/phpdoc/tags/method.html - * @return ?Parameter - if null, the phpdoc magic method was invalid. - */ - private function magicParamFromMagicMethodParamString( - string $param_string, - int $param_index, - int $comment_line_offset - ) { - $param_string = \trim($param_string); - // Don't support trailing commas, or omitted params. Provide at least one of [type] or [parameter] - if ($param_string === '') { - return null; - } - // Parse an entry for [type] [parameter] - Assume both of those are optional. - // https://github.com/phpDocumentor/phpDocumentor2/pull/1271/files - phpdoc allows passing an default value. - // Phan allows `=.*`, to indicate that a parameter is optional - // TODO: in another PR, check that optional parameters aren't before required parameters. - if (\preg_match(self::MAGIC_PARAM_REGEX, $param_string, $param_match)) { - // Note: a magic method parameter can be variadic, but it can't be pass-by-reference? (No support in __call) - $union_type_string = $param_match[1]; - $union_type = UnionType::fromStringInContext( - $union_type_string, - $this->context, - Type::FROM_PHPDOC, - $this->code_base - ); - $is_variadic = $param_match[15] === '...'; - $default_str = $param_match[17]; - $has_default_value = $default_str !== ''; - if ($has_default_value) { - $default_value_repr = \trim(\explode('=', $default_str, 2)[1]); - if (\strcasecmp($default_value_repr, 'null') === 0) { - $union_type = $union_type->nullableClone(); - } - } - $var_name = $param_match[16]; - if ($var_name === '') { - // placeholder names are p1, p2, ... - $var_name = 'p' . ($param_index + 1); - } - return new Parameter($var_name, $union_type, $this->guessActualLineLocation($comment_line_offset), $is_variadic, $has_default_value); - } - return null; - } - - /** - * @param string $line - * An individual line of a comment - * - * @return ?Method - * magic method with the parameter types, return types, and name. - */ - private function magicMethodFromCommentLine( - string $line, - int $comment_line_offset - ) { - // https://phpdoc.org/docs/latest/references/phpdoc/tags/method.html - // > Going to assume "static" is a magic keyword, based on https://github.com/phpDocumentor/phpDocumentor2/issues/822 - // > TODO: forbid in trait? - // TODO: finish writing the regex. - // Syntax: - // @method [return type] [name]([[type] [parameter]<, ...>]) [<description>] - // Assumes the parameters end at the first ")" after "(" - // As an exception, allows one level of matching brackets - // to support old style arrays such as $x = array(), $x = array(2) (Default values are ignored) - if (\preg_match('/@(?:phan-)?method(?:\s+(static))?(?:(?:\s+(' . UnionType::union_type_regex_or_this . '))?)\s+' . self::WORD_REGEX . '\s*\(((?:[^()]|\([()]*\))*)\)\s*(.*)/', $line, $match)) { - $is_static = $match[1] === 'static'; - $return_union_type_string = $match[2]; - if ($return_union_type_string !== '') { - $return_union_type = - UnionType::fromStringInContext( - $return_union_type_string, - $this->context, - Type::FROM_PHPDOC, - $this->code_base - ); - } else { - // From https://phpdoc.org/docs/latest/references/phpdoc/tags/method.html - // > When the intended method does not have a return value then the return type MAY be omitted; in which case 'void' is implied. - $return_union_type = VoidType::instance(false)->asUnionType(); - } - $method_name = $match[22]; - - $arg_list = \trim($match[23]); - $comment_params = []; - // Special check if param list has 0 params. - if ($arg_list !== '') { - // TODO: Would need to use a different approach if templates were ever supported - // e.g. The magic method parsing doesn't support commas? - $params_strings = self::extractMethodParts($arg_list); - $failed = false; - foreach ($params_strings as $i => $param_string) { - $param = $this->magicParamFromMagicMethodParamString($param_string, $i, $comment_line_offset); - if ($param === null) { - $this->emitIssue( - Issue::UnextractableAnnotationPart, - $this->guessActualLineLocation($comment_line_offset), - \trim($line), - $param_string - ); - $failed = true; - } - $comment_params[] = $param; - } - if ($failed) { - // Emit everything that was wrong with the parameters of the @method annotation at once, then reject it. - return null; - } - } - - return new Method( - $method_name, - $return_union_type, - $comment_params, - $is_static, - $this->guessActualLineLocation($comment_line_offset) - ); - } else { - $this->emitIssue( - Issue::UnextractableAnnotation, - $this->guessActualLineLocation($comment_line_offset), - \trim($line) - ); - } - - return null; - } - - /** - * @return array<int,string> - */ - private static function extractMethodParts(string $type_string) : array - { - $parts = []; - foreach (\explode(',', $type_string) as $part) { - $parts[] = \trim($part); - } - - if (\count($parts) <= 1) { - return $parts; - } - if (!\preg_match('/[<({]/', $type_string)) { - return $parts; - } - return self::mergeMethodParts($parts); - } - - /** - * @param string[] $parts (already trimmed) - * @return string[] - * @see Type::extractTemplateParameterTypeNameList() (Similar method) - */ - private static function mergeMethodParts(array $parts) : array - { - $prev_parts = []; - $delta = 0; - $results = []; - foreach ($parts as $part) { - if (\count($prev_parts) > 0) { - $prev_parts[] = $part; - $delta += \substr_count($part, '<') + \substr_count($part, '(') + \substr_count($part, '{') - \substr_count($part, '>') - \substr_count($part, ')') - \substr_count($part, '}'); - if ($delta <= 0) { - if ($delta === 0) { - $results[] = \implode(',', $prev_parts); - } // ignore unparsable data such as "<T,T2>>" - $prev_parts = []; - $delta = 0; - continue; - } - continue; - } - $bracket_count = \substr_count($part, '<') + \substr_count($part, '(') + \substr_count($part, '{'); - if ($bracket_count === 0) { - $results[] = $part; - continue; - } - $delta = $bracket_count - \substr_count($part, '>') - \substr_count($part, ')') - \substr_count($part, '}'); - if ($delta === 0) { - $results[] = $part; - } elseif ($delta > 0) { - $prev_parts[] = $part; - } // otherwise ignore unparsable data such as ">" (should be impossible) - } - return $results; - } - - /** - * @param string $line - * An individual line of a comment - * Analysis will handle (at)property-read and (at)property-write differently from - * (at)property. - * - * @return Property|null - * magic property with the union type. - */ - private function magicPropertyFromCommentLine( - string $line, - int $i - ) { - // Note that the type of a property can be left out (@property $myVar) - This is equivalent to @property mixed $myVar - // TODO: properly handle duplicates... - if (\preg_match('/@(?:phan-)?(property|property-read|property-write)(?:\s+(' . UnionType::union_type_regex . '))?(?:\s+(?:\\$' . self::WORD_REGEX . '))/', $line, $match)) { - $category = $match[1]; - if ($category === 'property-read') { - $flags = Flags::IS_READ_ONLY; - } elseif ($category === 'property-write') { - $flags = Flags::IS_WRITE_ONLY; - } else { - $flags = 0; - } - $type = $match[2] ?? ''; - - $property_name = $match[16] ?? ''; - if ($property_name === '') { - return null; - } - - // If the type looks like a property name, make it an - // empty type so that other stuff can match it. - $union_type = - UnionType::fromStringInContext( - $type, - $this->context, - Type::FROM_PHPDOC, - $this->code_base - ); - - return new Property( - $property_name, - $union_type, - $this->guessActualLineLocation($i), - $flags - ); - } else { - $this->emitIssue( - Issue::UnextractableAnnotation, - $this->guessActualLineLocation($i), - \trim($line) - ); - } - - return null; - } - - /** - * The context in which the comment line appears - * - * @param string $line - * An individual line of a comment - * - * @return Option<Type> - * A class/interface to use as a context for a closure. - * (Phan expects a ClassScope to have exactly one type) - */ - private function getPhanClosureScopeFromCommentLine( - string $line, - int $comment_line_offset - ) : Option { - $closure_scope_union_type_string = ''; - - // https://secure.php.net/manual/en/closure.bindto.php - // There wasn't anything in the phpdoc standard to indicate the class to which - // a Closure would be bound with bind() or bindTo(), so using a custom tag. - // - // TODO: Also add a version which forbids using $this in the closure? - if (\preg_match('/@(PhanClosureScope|phan-closure-scope)\s+(' . Type::type_regex . ')/', $line, $match)) { - $closure_scope_union_type_string = $match[2]; - } - - if ($closure_scope_union_type_string !== '') { - return new Some(Type::fromStringInContext( - $closure_scope_union_type_string, - $this->context, - Type::FROM_PHPDOC, - $this->code_base - )); - } - $this->emitIssue( - Issue::UnextractableAnnotation, - $this->guessActualLineLocation($comment_line_offset), - \trim($line) - ); - return new None(); - } - - /** - * @param string $issue_type - * The type of issue to emit such as Issue::ParentlessClass - * - * @param int $issue_lineno - * The line number where the issue was found - * - * @param int|string|FQSEN|UnionType|Type ...$parameters - * Template parameters for the issue's error message - * - * @return void - */ - protected function emitIssue( - string $issue_type, - int $issue_lineno, - ...$parameters - ) { - $this->issues[] = [ - $issue_type, - $issue_lineno, - $parameters, - null, - ]; - } - - /** - * @param string $issue_type - * The type of issue to emit such as Issue::ParentlessClass - * - * @param int $issue_lineno - * The line number where the issue was found - * - * @param array<int,int|string|FQSEN|UnionType|Type> $parameters - * Template parameters for the issue's error message - * - * @param ?Suggestion $suggestion - * - * @return void - */ - protected function emitIssueWithSuggestion( - string $issue_type, - int $issue_lineno, - array $parameters, - Suggestion $suggestion = null - ) { - $this->issues[] = [ - $issue_type, - $issue_lineno, - $parameters, - $suggestion - ]; - } - - protected function emitDeferredIssues() - { - foreach ($this->issues as list($issue_type, $issue_lineno, $parameters, $suggestion)) { - if (\array_key_exists($issue_type, $this->suppress_issue_set)) { - // Record that this suppression has been used. - $this->suppress_issue_set[$issue_type] = 1; - continue; - } - Issue::maybeEmitWithParameters( - $this->code_base, - $this->context, - $issue_type, - $issue_lineno, - $parameters, - $suggestion - ); - } - $this->issues = []; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Comment/Method.php b/vendor/phan/phan/src/Phan/Language/Element/Comment/Method.php deleted file mode 100644 index 3fb80b4..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Comment/Method.php +++ /dev/null @@ -1,167 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Language\Element\Comment; - -use Phan\Language\UnionType; - -/** - * Phan's representation of a magic method - * (i.e. an (at)method declaration on a class-like's doc comment) - */ -class Method -{ - - /** - * @var string - * The name of the method - */ - private $name; - - /** - * @var UnionType - * The return type of the magic method - */ - private $type; - - /** - * @var array<int,Parameter> - * A list of phpdoc parameters - */ - private $parameters; - - /** - * @var bool - * Whether or not this is a static magic method - */ - private $is_static; - - /** - * @var int - * The line of this method - */ - private $line; - - /** - * @param string $name - * The name of the method - * - * @param UnionType $type - * The return type of the method - * - * @param array<int,Parameter> $parameters - * 0 or more comment parameters for this magic method - * - * @param bool $is_static - * Whether this method is static - * - * @param int $line - * The line of this method - */ - public function __construct( - string $name, - UnionType $type, - array $parameters, - bool $is_static, - int $line - ) { - $this->name = $name; - $this->type = $type; - $this->parameters = $parameters; - $this->is_static = $is_static; - $this->line = $line; - } - - /** - * @return string - * The name of the magic method - */ - public function getName() : string - { - return $this->name; - } - - /** - * @return UnionType - * The return type of the magic method - */ - public function getUnionType() : UnionType - { - return $this->type; - } - - /** - * @return array<int,Parameter> - comment parameters of magic method, from phpdoc. - */ - public function getParameterList() : array - { - return $this->parameters; - } - - /** - * @return bool - * Whether or not the magic method is static - */ - public function isStatic() : bool - { - return $this->is_static; - } - - /** - * @return int - * The line of this method - */ - public function getLine() : int - { - return $this->line; - } - - /** - * @return int - * Number of required parameters of this method - */ - public function getNumberOfRequiredParameters() : int - { - return \array_reduce( - $this->parameters, - static function (int $carry, Parameter $parameter) : int { - return ($carry + ($parameter->isRequired() ? 1 : 0)); - }, - 0 - ); - } - - /** - * @return int - * Number of optional parameters of this method - */ - public function getNumberOfOptionalParameters() : int - { - return \array_reduce( - $this->parameters, - static function (int $carry, Parameter $parameter) : int { - return ($carry + ($parameter->isOptional() ? 1 : 0)); - }, - 0 - ); - } - - public function __toString() : string - { - if ($this->isStatic()) { - $string = 'static function '; - } else { - $string = 'function '; - } - // Magic methods can't be by ref? - $string .= $this->getName(); - - $string .= '(' . \implode(', ', $this->getParameterList()) . ')'; - - if (!$this->getUnionType()->isEmpty()) { - $string .= ' : ' . (string)$this->getUnionType(); - } - - return $string; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Comment/NullComment.php b/vendor/phan/phan/src/Phan/Language/Element/Comment/NullComment.php deleted file mode 100644 index 1a577be..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Comment/NullComment.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Language\Element\Comment; - -use Phan\Language\Element\Comment; -use Phan\Language\UnionType; -use Phan\Library\None; - -/** - * A comment for an empty doc-block or when comment parsing is disabled - */ -final class NullComment extends Comment -{ - public function __construct() - { - $none = new None(); - $this->throw_union_type = UnionType::empty(); - $this->closure_scope = $none; - $this->inherited_type = $none; - } - - /** @var NullComment the only instance of NullComment. Will be immutable. */ - private static $instance; - - /** - * Returns the immutable NullComment. - */ - public static function instance() : NullComment - { - return self::$instance; - } - - /** - * Ensures the static property is set, for users of this class - * @internal - */ - public static function init() - { - self::$instance = new NullComment(); - } -} -NullComment::init(); diff --git a/vendor/phan/phan/src/Phan/Language/Element/Comment/Parameter.php b/vendor/phan/phan/src/Phan/Language/Element/Comment/Parameter.php deleted file mode 100644 index add4835..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Comment/Parameter.php +++ /dev/null @@ -1,200 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Language\Element\Comment; - -use Phan\Language\Context; -use Phan\Language\Element\Variable; -use Phan\Language\UnionType; - -/** - * Stores information Phan knows about the PHPDoc parameter of a given function-like. - * (e.g. of the doc comment of a method, function, closure, or magic method) - */ -class Parameter -{ - - /** - * @var string - * The name of the comment parameter - */ - private $name; - - /** - * @var UnionType - * The type of the parameter - */ - private $type; - - /** - * @var int - * Get the line number. - */ - private $lineno; - - /** - * @var bool - * Whether or not the parameter is variadic (in the comment) - */ - private $is_variadic; - - /** - * @var bool - * Whether or not the parameter is optional (Note: only applies to the comment for (at)method.) - */ - private $has_default_value; - - /** - * @var bool - * True if a given parameter is an output-only parameter and ignores the passed in type. - */ - private $is_output_reference; - - /** - * @param string $name - * The name of the parameter - * - * @param UnionType $type - * The type of the parameter - */ - public function __construct( - string $name, - UnionType $type, - int $lineno = 0, - bool $is_variadic = false, - bool $has_default_value = false, - bool $is_output_reference = false - ) { - $this->name = $name; - $this->type = $type; - $this->lineno = $lineno; - $this->is_variadic = $is_variadic; - $this->has_default_value = $has_default_value; - $this->is_output_reference = $is_output_reference; - } - - /** - * Returns this comment parameter as a real variable. - */ - public function asVariable( - Context $context - ) : Variable { - return new Variable( - $context, - $this->getName(), - $this->getUnionType(), - 0 - ); - } - - /** - * Converts this parameter to a real parameter, - * using only the information from the comment. - * - * Useful for comments extracted from (at)method, etc. - */ - public function asRealParameter( - Context $context - ) : \Phan\Language\Element\Parameter { - $flags = 0; - if ($this->isVariadic()) { - $flags |= \ast\flags\PARAM_VARIADIC; - } - $union_type = $this->getUnionType(); - $param = \Phan\Language\Element\Parameter::create( - $context, - $this->getName(), - $union_type, - $flags - ); - if ($this->has_default_value) { - $param->setDefaultValueType($union_type); - // TODO: could setDefaultValue in a future PR. Would have to run \ast\parse_code on the default value, catch ParseError/CompileError if necessary. - // If given '= "Default"', then extract the default from '<?php ("Default");' - // Then get the type from UnionTypeVisitor, for defaults such as SomeClass::CONST. - } - return $param; - } - - /** - * @return string - * The name of the parameter - */ - public function getName() : string - { - return $this->name; - } - - /** - * @return UnionType - * The type of the parameter - */ - public function getUnionType() : UnionType - { - return $this->type; - } - - /** - * @return int - * The line number of the parameter - */ - public function getLineno() : int - { - return $this->lineno; - } - /** - * @return bool - * Whether or not the parameter is variadic - */ - public function isVariadic() : bool - { - return $this->is_variadic; - } - - /** - * @return bool - * Whether or not the parameter is an output reference - */ - public function isOutputReference() : bool - { - return $this->is_output_reference; - } - - /** - * @return bool - * Whether or not the parameter is required - */ - public function isRequired() : bool - { - return !$this->isOptional(); - } - - /** - * @return bool - * Whether or not the parameter is optional - */ - public function isOptional() : bool - { - return $this->has_default_value || $this->is_variadic; - } - - public function __toString() : string - { - $string = ''; - - if (!$this->type->isEmpty()) { - $string .= "{$this->type} "; - } - if ($this->is_variadic) { - $string .= '...'; - } - - $string .= '$' . $this->name; - - if ($this->has_default_value) { - $string .= ' = default'; - } - - return $string; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Comment/Property.php b/vendor/phan/phan/src/Phan/Language/Element/Comment/Property.php deleted file mode 100644 index ae2589b..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Comment/Property.php +++ /dev/null @@ -1,108 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Language\Element\Comment; - -use Phan\Language\UnionType; - -/** - * Represents information about a given (at)property annotation in a PHPDoc comment - */ -class Property -{ - - /** - * @var string - * The name of the property - */ - private $name; - - /** - * @var UnionType - * The type of the property - */ - private $type; - - /** - * @var int - * The line of this comment property - */ - private $line; - - /** - * @var int - * The flags of this comment property - * (0 or IS_READ_ONLY_PROPERTY or IS_WRITE_ONLY_PROPERTY) - */ - private $flags; - - /** - * @param string $name - * The name of the property - * - * @param UnionType $type - * The type of the property - * - * @param int $flags - * Additional flags added to a property - */ - public function __construct( - string $name, - UnionType $type, - int $line, - int $flags - ) { - $this->name = $name; - $this->type = $type; - $this->line = $line; - $this->flags = $flags; - } - - /** - * @return string - * The name of the property - */ - public function getName() : string - { - return $this->name; - } - - /** - * @return UnionType - * The type of the property - */ - public function getUnionType() : UnionType - { - return $this->type; - } - - /** - * @return int - * The line of the property - */ - public function getLine() : int - { - return $this->line; - } - - /** - * @return int - * The flags of the property - */ - public function getFlags() : int - { - return $this->flags; - } - - public function __toString() : string - { - $string = ''; - - if (!$this->type->isEmpty()) { - $string .= "{$this->type} "; - } - $string .= '$' . $this->name; - - return $string; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Comment/ReturnComment.php b/vendor/phan/phan/src/Phan/Language/Element/Comment/ReturnComment.php deleted file mode 100644 index b71af27..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Comment/ReturnComment.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Language\Element\Comment; - -use Phan\Language\UnionType; - -/** - * The representation of an (at)return comment - */ -class ReturnComment -{ - /** @var UnionType the return type of the comment*/ - private $type; - - /** @var int the line number of the comment */ - private $lineno; - - public function __construct(UnionType $type, int $lineno) - { - $this->type = $type; - $this->lineno = $lineno; - } - - /** - * Gets the type of this (at)return comment - */ - public function getType() : UnionType - { - return $this->type; - } - - /** - * Sets the type of this (at)return comment - * @return void - */ - public function setType(UnionType $type) - { - $this->type = $type; - } - - /** - * Gets the line number of this (at)return comment's declaration in PHPDoc - */ - public function getLineno() : int - { - return $this->lineno; - } - - /** - * Helper for debugging - */ - public function __toString() : string - { - return "ReturnComment(type=$this->type)"; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/ConstantInterface.php b/vendor/phan/phan/src/Phan/Language/Element/ConstantInterface.php deleted file mode 100644 index 2157bdc..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/ConstantInterface.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use ast\Node; -use Phan\Language\FQSEN; -use Phan\Language\FutureUnionType; - -/** - * Represents APIs used when Phan is setting up/analyzing - * the representation of a given global or class constant. - * @method FQSEN getFQSEN() return type covariance isn't supported in php 7.0, I think - */ -interface ConstantInterface -{ - - /** - * Sets a value that can be used to resolve the union type of this constant later. - * Used if it cannot be resolved immediately while parsing. - * - * @return void - */ - public function setFutureUnionType(FutureUnionType $future_union_type); - - /** - * Sets the node with the AST representing the value of this constant. - * - * @param Node|string|float|int $node - * @return void - */ - public function setNodeForValue($node); - - /** - * Gets the node with the AST representing the value of this constant. - * - * @return Node|string|float|int - */ - public function getNodeForValue(); -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/ConstantTrait.php b/vendor/phan/phan/src/Phan/Language/Element/ConstantTrait.php deleted file mode 100644 index 42b1c4e..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/ConstantTrait.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use ast\Node; -use Closure; - -/** - * Represents functionality common to GlobalConstant and ClassConstant - * for APIs Phan has for representations of constants. - * - * @see ConstantInterface - Classes using this trait use this interface - */ -trait ConstantTrait -{ - use ElementFutureUnionType; - - /** @var Node|string|float|int the node which defined the value of this constant. */ - protected $defining_node; - - /** - * @return string - * The (not fully-qualified) name of this element. - */ - abstract public function getName() : string; - - public function __toString() : string - { - return 'const ' . $this->getName(); - } - - /** - * Sets the node with the AST representing the value of this constant. - * - * @param Node|string|float|int $node Either a node or a constant to be used as the value of the constant. - * @return void - */ - public function setNodeForValue($node) - { - $this->defining_node = $node; - } - - /** - * Gets the node with the AST representing the value of this constant. - * - * @return Node|string|float|int - */ - public function getNodeForValue() - { - return $this->defining_node; - } - - /** - * Used by daemon mode to restore an element to the state it had before parsing. - * @internal - * @return ?Closure - */ - public function createRestoreCallback() - { - $future_union_type = $this->future_union_type; - if ($future_union_type === null) { - // We already inferred the type for this class constant/global constant. - // Nothing to do. - return null; - } - // If this refers to a class constant in another file, - // the resolved union type might change if that file changes. - return function () use ($future_union_type) { - $this->future_union_type = $future_union_type; - // Probably don't need to call setUnionType(mixed) again... - }; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/ElementFutureUnionType.php b/vendor/phan/phan/src/Phan/Language/Element/ElementFutureUnionType.php deleted file mode 100644 index 7cc693c..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/ElementFutureUnionType.php +++ /dev/null @@ -1,94 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\Exception\IssueException; -use Phan\Language\FutureUnionType; -use Phan\Language\Type\NullType; -use Phan\Language\UnionType; - -/** - * Implements functionality of an element with a union type that is evaluated lazily. - * - * This lets Phan deal with elements (e.g. properties, constants) - * where the default type is another constant with a type - * that is not yet known during parsing. - */ -trait ElementFutureUnionType -{ - - /** - * @var FutureUnionType|null - * A FutureUnionType is evaluated lazily only when - * the type is actually needed. - * This lets Phan deal with elements (e.g. properties, constants) - * where the default type is another constant with a type - * that is not yet known during parsing. - */ - protected $future_union_type = null; - - /** - * Set the type of this element - * @param UnionType $type - * - * @return void - */ - abstract public function setUnionType(UnionType $type); - - /** - * Sets a value that can be used once parsing/hydration is completed, - * to resolve the union type of this element. - * - * @return void - */ - public function setFutureUnionType( - FutureUnionType $future_union_type - ) { - $this->future_union_type = $future_union_type; - } - - /** - * @return bool - * Returns true if this element has an unresolved union type. - * - * @internal because this is mostly useful for Phan internals - * (e.g. a property with an unresolved future union type can't have a template type) - */ - public function hasUnresolvedFutureUnionType() : bool - { - return $this->future_union_type !== null; - } - - /** - * @return UnionType|null - * Get the UnionType from a future union type defined - * on this object or null if there is no future - * union type. - */ - public function getFutureUnionType() - { - $future_union_type = $this->future_union_type; - if ($future_union_type === null) { - return null; - } - - // null out the future_union_type before - // we compute it to avoid unbounded - // recursion - $this->future_union_type = null; - - try { - $union_type = $future_union_type->get(); - } catch (IssueException $_) { - $union_type = UnionType::empty(); - } - - // Don't set 'null' as the type if that's the default - // given that its the default. - if ($union_type->isType(NullType::instance(false))) { - $union_type = UnionType::empty(); - } - - return $union_type; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Flags.php b/vendor/phan/phan/src/Phan/Language/Element/Flags.php deleted file mode 100644 index 2bd2d4f..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Flags.php +++ /dev/null @@ -1,100 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -/** - * Flags contains bit flags that Phan adds to elements - * and methods for manipulating those bit flags. - * - * (manipulated by Element->getPhanFlags(), ElementPhanFlags()) - */ -class Flags -{ - const IS_DEPRECATED = (1 << 1); - const IS_PHP_INTERNAL = (1 << 2); - - const IS_PARENT_CONSTRUCTOR_CALLED = (1 << 3); - - const IS_RETURN_TYPE_UNDEFINED = (1 << 4); - const HAS_RETURN = (1 << 5); - const IS_OVERRIDE = (1 << 6); - const HAS_YIELD = (1 << 7); - - const CLASS_HAS_DYNAMIC_PROPERTIES = (1 << 8); - const IS_CLONE_OF_VARIADIC = (1 << 9); - const CLASS_FORBID_UNDECLARED_MAGIC_PROPERTIES = (1 << 10); - const CLASS_FORBID_UNDECLARED_MAGIC_METHODS = (1 << 11); - - const IS_NS_INTERNAL = (1 << 12); - const IS_FROM_PHPDOC = (1 << 13); - - // These can be combined in 3 ways, see Parameter->getReferenceType() - const IS_READ_REFERENCE = (1 << 14); - const IS_WRITE_REFERENCE = (1 << 15); - // End of reference types - - // This will be compared against IS_OVERRIDE - const IS_OVERRIDE_INTENDED = (1 << 16); - - const IS_PARAM_USING_NULLABLE_SYNTAX = (1 << 17); - - // For dead code detection - const WAS_PROPERTY_READ = (1 << 18); - const WAS_PROPERTY_WRITTEN = (1 << 19); - - const IS_DYNAMIC_PROPERTY = (1 << 20); - // A property can be read-only, write-only, or neither, but not both. - // This is independent of being a magic property. - const IS_READ_ONLY = (1 << 21); - const IS_WRITE_ONLY = (1 << 22); - const HAS_STATIC_UNION_TYPE = (1 << 23); - const HAS_TEMPLATE_TYPE = (1 << 24); - - const IS_OVERRIDDEN_BY_ANOTHER = (1 << 25); - - /** - * Either enable or disable the given flag on - * the given bit vector. - * - * @param int $bit_vector - * The bit vector we're operating on - * - * @param int $flag - * The flag we're setting on the bit vector such - * as Flags::IS_DEPRECATED. - * - * @param bool $value - * True to or the flag in, false to & the bit vector - * with the flags negation - * - * @return int - * A new bit vector with the given flag set or unset - */ - public static function bitVectorWithState( - int $bit_vector, - int $flag, - bool $value - ) : int { - return $value - ? ($bit_vector | $flag) - : ($bit_vector & (~$flag)); - } - - /** - * @param int $bit_vector - * The bit vector we'd like to get the state for - * - * @param int $flag - * The flag we'd like to get the state for - * - * @return bool - * True if all bits in the flag are enabled in the bit - * vector, else false. - */ - public static function bitVectorHasState( - int $bit_vector, - int $flag - ) : bool { - return (($bit_vector & $flag) === $flag); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Func.php b/vendor/phan/phan/src/Phan/Language/Element/Func.php deleted file mode 100644 index cd898d5..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Func.php +++ /dev/null @@ -1,484 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use AssertionError; -use ast; -use ast\flags; -use ast\Node; -use Phan\Analysis\Analyzable; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\ElementContext; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\Scope\ClosureScope; -use Phan\Language\Scope\FunctionLikeScope; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Memoize; - -/** - * Phan's representation of a closure or global function. - * - * @phan-file-suppress PhanPartialTypeMismatchArgument - */ -class Func extends AddressableElement implements FunctionInterface -{ - use Analyzable; - use Memoize; - use FunctionTrait; - use ClosedScopeElement; - - /** - * @param Context $context - * The context in which the structural element lives - * - * @param string $name - * The name of the typed structural element - * - * @param UnionType $type - * A '|' delimited set of types satisfied by this - * typed structural element. - * - * @param int $flags - * The flags property contains node specific flags. It is - * always defined, but for most nodes it is always zero. - * ast\kind_uses_flags() can be used to determine whether - * a certain kind has a meaningful flags value. - * - * @param ?array<int,Parameter> $parameter_list - * A list of parameters to set on this method - */ - public function __construct( - Context $context, - string $name, - UnionType $type, - int $flags, - FullyQualifiedFunctionName $fqsen, - $parameter_list - ) { - if ($fqsen->isClosure()) { - $internal_scope = new ClosureScope( - $context->getScope(), - $fqsen - ); - } else { - $internal_scope = new FunctionLikeScope( - $context->getScope(), - $fqsen - ); - } - $context = $context->withScope($internal_scope); - parent::__construct( - $context, - $name, - $type, - $flags, - $fqsen - ); - - // TODO: Is internal scope even necessary to track separately?? - $this->setInternalScope($internal_scope); - - if ($parameter_list !== null) { - $this->setParameterList($parameter_list); - } - } - - /** - * If a Closure overrides the scope(class) it will be executed in (via doc comment) - * then return a context with the new scope instead. - * - * @param CodeBase $code_base - * @param Context $context - The outer context in which the closure was declared. - * Either this (or a new context for the other class) will be returned. - * @return ?FullyQualifiedClassName - * - * Postcondition: if return value !== null, then $Type is the type of a class which exists in the codebase. - */ - private static function getClosureOverrideFQSEN( - CodeBase $code_base, - Context $context, - Type $closure_scope_type, - Node $node - ) { - if ($node->kind !== ast\AST_CLOSURE) { - return null; - } - if ($closure_scope_type->isNativeType()) { - // TODO: Handle final internal classes (Can't call bindTo on those) - // TODO: What about 'null' (for code planning to bindTo(null)) - // Emit an error - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeInvalidClosureScope, - $node->lineno ?? 0, - (string)$closure_scope_type - ); - return null; - } else { - // TODO: handle 'parent'? - // TODO: Check if isInClassScope - if ($closure_scope_type->isSelfType() || $closure_scope_type->isStaticType()) { - // nothing to do. - return null; - } - } - - return FullyQualifiedClassName::fromType($closure_scope_type); - } - - - /** - * @param Context $context - * The context in which the node appears - * - * @param CodeBase $code_base - * - * @param Node $node - * An AST node representing a function - * - * @param FullyQualifiedFunctionName $fqsen - * A fully qualified name for the function - * - * @return Func - * A Func representing the AST node in the - * given context - */ - public static function fromNode( - Context $context, - CodeBase $code_base, - Node $node, - FullyQualifiedFunctionName $fqsen - ) : Func { - // Create the skeleton function object from what - // we know so far - $func = new Func( - $context, - (string)$node->children['name'], - UnionType::empty(), - $node->flags ?? 0, - $fqsen, - null - ); - $doc_comment = $node->children['docComment'] ?? ''; - $func->setDocComment($doc_comment); - - // Parse the comment above the function to get - // extra meta information about the function. - $comment = Comment::fromStringInContext( - $doc_comment, - $code_base, - $context, - $node->lineno ?? 0, - Comment::ON_FUNCTION - ); - - // Defer adding params to the local scope for user functions. (FunctionTrait::addParamsToScopeOfFunctionOrMethod) - // See PreOrderAnalysisVisitor->visitFuncDecl and visitClosure - $func->setComment($comment); - - $element_context = new ElementContext($func); - - // @var array<int,Parameter> - // The list of parameters specified on the - // method - $parameter_list = Parameter::listFromNode( - $element_context, - $code_base, - $node->children['params'] - ); - $func->setParameterList($parameter_list); - - // Redefine the function's internal scope to point to the new class before adding any variables to the scope. - - $closure_scope_option = $comment->getClosureScopeOption(); - if ($closure_scope_option->isDefined()) { - $override_class_fqsen = self::getClosureOverrideFQSEN($code_base, $context, $closure_scope_option->get(), $node); - if ($override_class_fqsen !== null) { - // TODO: Allow Null? - $scope = $func->getInternalScope(); - if (!($scope instanceof ClosureScope)) { - throw new AssertionError('Expected scope of a closure to be a ClosureScope'); - } - $scope->overrideClassFQSEN($override_class_fqsen); - $func->getContext()->setScope($scope); - } - } - - // Add each parameter to the scope of the function - // NOTE: it's important to clone this, - // because we don't want anything to modify the original Parameter - foreach ($parameter_list as $parameter) { - $func->getInternalScope()->addVariable( - $parameter->cloneAsNonVariadic() - ); - } - - if (!$func->isPHPInternal()) { - // If the function is Analyzable, set the node so that - // we can come back to it whenever we like and - // rescan it - $func->setNode($node); - } - foreach ($comment->getTemplateTypeList() as $template_type) { - $func->getInternalScope()->addTemplateType($template_type); - } - - // Keep an copy of the original parameter list, to check for fatal errors later on. - $func->setRealParameterList($parameter_list); - - $func->setNumberOfRequiredParameters(\array_reduce( - $parameter_list, - static function (int $carry, Parameter $parameter) : int { - return ($carry + ($parameter->isRequired() ? 1 : 0)); - }, - 0 - )); - - $func->setNumberOfOptionalParameters(\array_reduce( - $parameter_list, - static function (int $carry, Parameter $parameter) : int { - return ($carry + ($parameter->isOptional() ? 1 : 0)); - }, - 0 - )); - - // Check to see if the comment specifies that the - // function is deprecated - $func->setIsDeprecated($comment->isDeprecated()); - - // Set whether or not the element is internal to - // the namespace. - $func->setIsNSInternal($comment->isNSInternal()); - - $func->setSuppressIssueSet( - $comment->getSuppressIssueSet() - ); - - // Take a look at function return types - if ($node->children['returnType'] !== null) { - // Get the type of the parameter - $union_type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node->children['returnType'] - ); - $func->setRealReturnType($union_type); - - $func->setUnionType($func->getUnionType()->withUnionType($union_type)); - } - - if ($comment->hasReturnUnionType()) { - // See if we have a return type specified in the comment - $union_type = $comment->getReturnType(); - - // FIXME properly handle self/static in closures declared within methods. - if ($union_type->hasSelfType()) { - $union_type = $union_type->makeFromFilter(static function (Type $type) : bool { - return !$type->isSelfType(); - }); - if ($context->isInClassScope()) { - $union_type = $union_type->withType( - $context->getClassFQSEN()->asType() - ); - } else { - Issue::maybeEmit( - $code_base, - $context, - Issue::ContextNotObjectUsingSelf, - $comment->getReturnLineno(), - 'self', - $fqsen - ); - } - } - - $func->setUnionType($func->getUnionType()->withUnionType($union_type)); - $func->setPHPDocReturnType($union_type); - } - $element_context->freeElementReference(); - - return $func; - } - - /** - * @return FullyQualifiedFunctionName - */ - public function getFQSEN() : FullyQualifiedFunctionName - { - return $this->fqsen; - } - - /** - * @return \Generator - * @phan-return \Generator<Func> - * The set of all alternates to this function - */ - public function alternateGenerator(CodeBase $code_base) : \Generator - { - $alternate_id = 0; - $fqsen = $this->getFQSEN(); - - while ($code_base->hasFunctionWithFQSEN($fqsen)) { - yield $code_base->getFunctionByFQSEN($fqsen); - $fqsen = $fqsen->withAlternateId(++$alternate_id); - } - } - - /** - * @return string - * A string representation of this function signature - */ - public function __toString() : string - { - $string = ''; - - $string .= 'function ' . $this->getName(); - - $string .= '(' . \implode(', ', $this->getParameterList()) . ')'; - - if (!$this->getUnionType()->isEmpty()) { - $string .= ' : ' . (string)$this->getUnionType(); - } - - $string .= ';'; - - return $string; - } - - /** - * @return bool - * True if this function returns a reference - */ - public function returnsRef() : bool - { - return $this->getFlagsHasState(flags\FUNC_RETURNS_REF); - } - - /** - * @return bool Always false for global functions. - */ - public function isFromPHPDoc() : bool - { - return false; - } - - /** - * True if this is a closure - */ - public function isClosure() : bool - { - return $this->getFQSEN()->isClosure(); - } - - /** - * Returns a string that can be used as a standalone PHP stub for this global function. - * @suppress PhanUnreferencedPublicMethod (toStubInfo is used by callers for more flexibility) - */ - public function toStub() : string - { - list($namespace, $string) = $this->toStubInfo(); - $namespace_text = $namespace === '' ? '' : "$namespace "; - $string = \sprintf("namespace %s{\n%s}\n", $namespace_text, $string); - return $string; - } - - public function getMarkupDescription() : string - { - $fqsen = $this->getFQSEN(); - $namespace = \ltrim($fqsen->getNamespace(), '\\'); - $stub = ''; - if ($namespace) { - $stub = "namespace $namespace;\n"; - } - $stub .= 'function '; - if ($this->returnsRef()) { - $stub .= '&'; - } - $stub .= $fqsen->getName(); - - $stub .= '(' . $this->getParameterStubText() . ')'; - - $return_type = $this->getUnionType(); - if (!$return_type->isEmpty()) { - $stub .= ' : ' . (string)$return_type; - } - return $stub; - } - - /** - * Returns stub info for `tool/make_stubs` - * @return array{0:string,1:string} [string $namespace, string $text] - */ - public function toStubInfo() : array - { - $fqsen = $this->getFQSEN(); - $stub = 'function '; - if ($this->returnsRef()) { - $stub .= '&'; - } - $stub .= $fqsen->getName(); - - $stub .= '(' . $this->getRealParameterStubText() . ')'; - - $return_type = $this->real_return_type; - if ($return_type && !$return_type->isEmpty()) { - $stub .= ' : ' . (string)$return_type; - } - $stub .= " {}\n"; - $namespace = \ltrim($fqsen->getNamespace(), '\\'); - return [$namespace, $stub]; - } - - public function getUnionTypeWithUnmodifiedStatic() : UnionType - { - return $this->getUnionType(); - } - - /** - * @return string - * The fully-qualified structural element name of this - * structural element (or something else for closures and callables) - * @override - */ - public function getRepresentationForIssue() : string - { - if ($this->isClosure()) { - return $this->getStubForClosure(); - } - return $this->getFQSEN()->__toString() . '()'; - } - - private function getStubForClosure() : string - { - $stub = 'Closure'; - if ($this->returnsRef()) { - $stub .= '&'; - } - $stub .= '(' . \implode(', ', \array_map(static function (Parameter $parameter) : string { - return $parameter->toStubString(); - }, $this->getRealParameterList())) . ')'; - if ($this->real_return_type && !$this->getRealReturnType()->isEmpty()) { - $stub .= ' : ' . (string)$this->getRealReturnType(); - } - return $stub; - } - - /** - * @return string - * The name of this structural element (without namespace/class), - * or a string for FunctionLikeDeclarationType (or a closure) which lacks a real FQSEN - */ - public function getNameForIssue() : string - { - if ($this->isClosure()) { - return $this->getStubForClosure(); - } - return $this->getName() . '()'; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/FunctionFactory.php b/vendor/phan/phan/src/Phan/Language/Element/FunctionFactory.php deleted file mode 100644 index 649b15e..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/FunctionFactory.php +++ /dev/null @@ -1,261 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\Language\Context; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\Type; -use Phan\Language\Type\NullType; -use Phan\Language\UnionType; - -/** - * This returns internal function declarations for a given function/method FQSEN, - * using Reflection and/or Phan's internal function signature map. - */ -class FunctionFactory -{ - /** - * @return array<int,Func> - * One or more (alternate) functions begotten from - * reflection info and internal functions data - */ - public static function functionListFromReflectionFunction( - FullyQualifiedFunctionName $fqsen, - \ReflectionFunction $reflection_function - ) : array { - - $context = new Context(); - - $function = new Func( - $context, - $fqsen->getNamespacedName(), - UnionType::empty(), - 0, - $fqsen, - null - ); - - $function->setNumberOfRequiredParameters( - $reflection_function->getNumberOfRequiredParameters() - ); - - $function->setNumberOfOptionalParameters( - $reflection_function->getNumberOfParameters() - - $reflection_function->getNumberOfRequiredParameters() - ); - $function->setIsDeprecated($reflection_function->isDeprecated()); - $function->setRealReturnType(UnionType::fromReflectionType($reflection_function->getReturnType())); - $function->setRealParameterList(Parameter::listFromReflectionParameterList($reflection_function->getParameters())); - - return self::functionListFromFunction($function); - } - - /** - * @param string[] $signature - * @return array<int,Func> - * One or more (alternate) methods begotten from - * reflection info and internal method data - */ - public static function functionListFromSignature( - FullyQualifiedFunctionName $fqsen, - array $signature - ) : array { - - $context = new Context(); - - $return_type = UnionType::fromStringInContext( - $signature[0], - $context, - Type::FROM_TYPE - ); - unset($signature[0]); - - $func = new Func( - $context, - $fqsen->getNamespacedName(), - $return_type, - 0, - $fqsen, - [] // will be filled in by functionListFromFunction - ); - - return self::functionListFromFunction($func); - } - - /** - * @return array<int,Method> a list of 1 or more method signatures from a ReflectionMethod - * and Phan's alternate signatures for that method's FQSEN in FunctionSignatureMap. - */ - public static function methodListFromReflectionClassAndMethod( - Context $context, - \ReflectionClass $class, - \ReflectionMethod $reflection_method - ) : array { - $class_name = $class->getName(); - $method_fqsen = FullyQualifiedMethodName::make( - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - FullyQualifiedClassName::fromFullyQualifiedString($class_name), - $reflection_method->getName() - ); - - - $method = new Method( - $context, - $reflection_method->name, - UnionType::empty(), - $reflection_method->getModifiers(), - $method_fqsen, - null - ); - - $method->setNumberOfRequiredParameters( - $reflection_method->getNumberOfRequiredParameters() - ); - - $method->setNumberOfOptionalParameters( - $reflection_method->getNumberOfParameters() - - $reflection_method->getNumberOfRequiredParameters() - ); - - if ($method->getIsMagicCall() || $method->getIsMagicCallStatic()) { - $method->setNumberOfOptionalParameters(FunctionInterface::INFINITE_PARAMETERS); - $method->setNumberOfRequiredParameters(0); - } - $method->setIsDeprecated($reflection_method->isDeprecated()); - // https://github.com/phan/phan/issues/888 - Reflection for that class's parameters causes php to throw/hang - if ($class_name !== 'ServerResponse') { - $method->setRealReturnType(UnionType::fromReflectionType($reflection_method->getReturnType())); - $method->setRealParameterList(Parameter::listFromReflectionParameterList($reflection_method->getParameters())); - } - - return self::functionListFromFunction($method); - } - - /** - * @param FunctionInterface $function - * Get a list of methods hydrated with type information - * for the given partial method - * - * @return array<int,FunctionInterface> - * A list of typed functions/methods based on the given method - */ - public static function functionListFromFunction( - FunctionInterface $function - ) : array { - // See if we have any type information for this - // internal function - $map_list = UnionType::internalFunctionSignatureMapForFQSEN( - $function->getFQSEN() - ); - - if (!$map_list) { - return [$function]; - } - - $alternate_id = 0; - /** - * @param array<string,mixed> $map - * @suppress PhanPossiblyFalseTypeArgumentInternal, PhanPossiblyFalseTypeArgument - */ - return \array_map(static function ($map) use ( - $function, - &$alternate_id - ) : FunctionInterface { - $alternate_function = clone($function); - - $alternate_function->setFQSEN( - $alternate_function->getFQSEN()->withAlternateId( - $alternate_id++ - ) - ); - - // Set the return type if one is defined - if (isset($map['return_type'])) { - $alternate_function->setUnionType($map['return_type']); - } - $alternate_function->clearParameterList(); - - // Load parameter types if defined - foreach ($map['parameter_name_type_map'] ?? [] as $parameter_name => $parameter_type) { - $flags = 0; - $phan_flags = 0; - $is_optional = false; - - // Check to see if its a pass-by-reference parameter - if (($parameter_name[0] ?? '') === '&') { - $flags |= \ast\flags\PARAM_REF; - $parameter_name = \substr($parameter_name, 1); - if (\strncmp($parameter_name, 'rw_', 3) === 0) { - $phan_flags |= Flags::IS_READ_REFERENCE | Flags::IS_WRITE_REFERENCE; - $parameter_name = \substr($parameter_name, 3); - } elseif (\strncmp($parameter_name, 'w_', 2) === 0) { - $phan_flags |= Flags::IS_WRITE_REFERENCE; - $parameter_name = \substr($parameter_name, 2); - } - } - - // Check to see if its variadic - if (\strpos($parameter_name, '...') !== false) { - $flags |= \ast\flags\PARAM_VARIADIC; - $parameter_name = \str_replace('...', '', $parameter_name); - } - - // Check to see if its an optional parameter - if (\strpos($parameter_name, '=') !== false) { - $is_optional = true; - $parameter_name = \str_replace('=', '', $parameter_name); - } - - $parameter = Parameter::create( - $function->getContext(), - $parameter_name, - $parameter_type, - $flags - ); - $parameter->enablePhanFlagBits($phan_flags); - - if ($is_optional) { - // TODO: could check isDefaultValueAvailable and getDefaultValue, for a better idea. - // I don't see any cases where this will be used for internal types, though. - $parameter->setDefaultValueType( - NullType::instance(false)->asUnionType() - ); - } - - // Add the parameter - $alternate_function->appendParameter($parameter); - } - - // TODO: Store the "real" number of required parameters, - // if this is out of sync with the extension's ReflectionMethod->getParameterList()? - // (e.g. third party extensions may add more required parameters?) - $alternate_function->setNumberOfRequiredParameters( - \array_reduce( - $alternate_function->getParameterList(), - static function (int $carry, Parameter $parameter) : int { - return ($carry + ( - $parameter->isOptional() ? 0 : 1 - )); - }, - 0 - ) - ); - - $alternate_function->setNumberOfOptionalParameters( - \count($alternate_function->getParameterList()) - - $alternate_function->getNumberOfRequiredParameters() - ); - - if ($alternate_function instanceof Method) { - if ($alternate_function->getIsMagicCall() || $alternate_function->getIsMagicCallStatic()) { - $alternate_function->setNumberOfOptionalParameters(999); - $alternate_function->setNumberOfRequiredParameters(0); - } - } - - return $alternate_function; - }, $map_list); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/FunctionInterface.php b/vendor/phan/phan/src/Phan/Language/Element/FunctionInterface.php deleted file mode 100644 index 9160824..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/FunctionInterface.php +++ /dev/null @@ -1,448 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use ast\Node; -use Closure; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\Scope\ClosedScope; -use Phan\Language\Type; -use Phan\Language\Type\FunctionLikeDeclarationType; -use Phan\Language\Type\TemplateType; -use Phan\Language\UnionType; - -/** - * Interface defining the behavior of both Methods and Functions - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -interface FunctionInterface extends AddressableElementInterface -{ - /** - * An easy workaround to mark a function-like as accepting an infinite number of optional parameters - * TODO: Distinguish between __call and __callStatic invoked manually and via magic (See uses of this constant) - */ - const INFINITE_PARAMETERS = 999999; - - /** - * @return FullyQualifiedMethodName|FullyQualifiedFunctionName - * The fully-qualified structural element name of this - * structural element - */ - public function getFQSEN(); - - /** - * @return string - * The fully-qualified structural element name of this - * structural element, or a string for FunctionLikeDeclarationType which lacks a real FQSEN - */ - public function getRepresentationForIssue() : string; - - /** - * @return string - * The name of this structural element (without namespace/class), - * or a string for FunctionLikeDeclarationType (or a closure) which lacks a real FQSEN - */ - public function getNameForIssue() : string; - - /** - * Sets the scope within this function-like element's body, - * for tracking variables within the function-like. - * @return void - */ - public function setInternalScope(ClosedScope $internal_scope); - - /** - * @return ClosedScope - * The internal scope of this closed scope element - */ - public function getInternalScope() : ClosedScope; - - /** - * @return int - * The number of optional parameters on this method - */ - public function getNumberOfOptionalParameters() : int; - - /** - * The number of optional parameters - * - * @return void - */ - public function setNumberOfOptionalParameters(int $number); - - /** - * @return int - * The number of optional real parameters on this function/method. - * This may differ from getNumberOfOptionalParameters() - * for internal modules lacking proper reflection info, - * or if the installed module version's API changed from what Phan's stubs used, - * or if a function/method uses variadics/func_get_arg*() - */ - public function getNumberOfOptionalRealParameters() : int; - - /** - * @return int - * The maximum number of parameters to this method - */ - public function getNumberOfParameters() : int; - - /** - * @return int - * The number of required parameters on this method - */ - public function getNumberOfRequiredParameters() : int; - - /** - * The number of required parameters - * - * @return void - */ - public function setNumberOfRequiredParameters(int $number); - - /** - * @return int - * The number of required real parameters on this function/method. - * This may differ for internal modules lacking proper reflection info, - * or if the installed module version's API changed from what Phan's stubs used. - */ - public function getNumberOfRequiredRealParameters() : int; - - /** - * @return bool - * True if this method had no return type defined when it - * was defined (either in the signature itself or in the - * docblock). - */ - public function isReturnTypeUndefined() : bool; - - /** - * Sets whether this method had no return type defined when it - * was defined (either in the signature itself or in the - * docblock). - * - * @param bool $is_return_type_undefined - * True if it was undefined - * - * @return void - */ - public function setIsReturnTypeUndefined( - bool $is_return_type_undefined - ); - - /** - * @return bool - * True if this method returns a value - */ - public function getHasReturn() : bool; - /** - * @param bool $has_return - * Set to true to mark this method as having a - * return value (Only through `return`) - * - * @return void - */ - public function setHasReturn(bool $has_return); - - /** - * @param bool $has_yield - * Set to true to mark this method as having a - * yield statement (Only through `yield`) - * This implies that it has a return value of \Generator. - * (or a parent interface) - * - * @return void - */ - public function setHasYield(bool $has_yield); - - /** - * @return array<int,Parameter> - * A list of parameters on the method - */ - public function getParameterList(); - - /** - * Gets the $ith parameter for the **caller**. - * In the case of variadic arguments, an infinite number of parameters exist. - * (The callee would see variadic arguments(T ...$args) as a single variable of type T[], - * while the caller sees a place expecting an expression of type T. - * - * @param int $i - offset of the parameter. - * @return Parameter|null The parameter type that the **caller** observes. - */ - public function getParameterForCaller(int $i); - - /** - * Gets the $ith real parameter for the **caller**. - * In the case of variadic arguments, an infinite number of parameters exist. - * (The callee would see variadic arguments(T ...$args) as a single variable of type T[], - * while the caller sees a place expecting an expression of type T. - * - * @param int $i - offset of the parameter. - * @return Parameter|null The parameter type that the **caller** observes. - */ - public function getRealParameterForCaller(int $i); - - /** - * @param Parameter $parameter - * A parameter to append to the parameter list - * - * @return void - */ - public function appendParameter(Parameter $parameter); - - /** - * @return void - * - * Call this before calling appendParameter, if parameters were already added. - */ - public function clearParameterList(); - - /** - * Records the fact that $parameter_name is an output-only reference. - * @param string $parameter_name - * @return void - */ - public function recordOutputReferenceParamName(string $parameter_name); - - /** - * @return array<int,string> list of output references (annotated with (at)phan-output-reference. Usually empty. - */ - public function getOutputReferenceParamNames() : array; - - /** - * @return \Generator - * The set of all alternates to this function - */ - public function alternateGenerator(CodeBase $code_base) : \Generator; - - /** - * @param CodeBase $code_base - * The code base in which this element exists. - * - * @return bool - * True if this is marked as an element internal to - * its namespace - */ - public function isNSInternal(CodeBase $code_base) : bool; - - /** - * @param CodeBase $code_base - * The code base in which this element exists. - * - * @return bool - * True if this element is internal to the namespace - */ - public function isNSInternalAccessFromContext( - CodeBase $code_base, - Context $context - ) : bool; - - /** - * @return Context - * Analyze the node associated with this object - * in the given context - */ - public function analyze(Context $context, CodeBase $code_base) : Context; - - /** - * @return Context - * Analyze the node associated with this object - * in the given context. - * This function's parameter list may or may not have been modified. - * @param array<int,Parameter> $parameter_list - */ - public function analyzeWithNewParams(Context $context, CodeBase $code_base, array $parameter_list) : Context; - - /** - * @return string the namespace in which this function interface was declared. - * - * Used for checking (at)internal annotations, etc. - */ - public function getElementNamespace() : string; - - /** - * @return UnionType - * The type of this method in its given context. - */ - public function getRealReturnType() : UnionType; - - /** - * @return array<int,Parameter> - * A list of parameters on the method, with types from the method signature. - */ - public function getRealParameterList(); - - /** - * @param array<string,UnionType> $parameter_map maps a subset of param names to the unmodified phpdoc parameter types. - * Will differ from real parameter types (ideally narrower) - * @return void - */ - public function setPHPDocParameterTypeMap(array $parameter_map); - - /** - * @return array<string,UnionType> maps a subset of param names to the unmodified phpdoc parameter types. - */ - public function getPHPDocParameterTypeMap(); - - /** - * @param ?UnionType $union_type the raw phpdoc union type - * @return void - */ - public function setPHPDocReturnType($union_type); - - /** - * @return ?UnionType the raw phpdoc union type - */ - public function getPHPDocReturnType(); - - /** - * @return bool - * True if this function or method returns a reference - */ - public function returnsRef() : bool; - - /** - * Returns true if the return type depends on the argument, and a plugin makes Phan aware of that. - */ - public function hasDependentReturnType() : bool; - - /** - * Returns a union type based on $args_node and $context - * @param CodeBase $code_base - * @param Context $context - * @param array<int,Node|int|string|float> $args - */ - public function getDependentReturnType(CodeBase $code_base, Context $context, array $args) : UnionType; - - /** - * Make calculation of the return type of this function/method use $closure - * @return void - */ - public function setDependentReturnTypeClosure(\Closure $closure); - - /** - * Returns true if this function or method has additional analysis logic for invocations (From internal and user defined plugins) - * @see getDependentReturnType - */ - public function hasFunctionCallAnalyzer() : bool; - - /** - * Perform additional analysis logic for invocations (From internal and user defined plugins) - * - * @param CodeBase $code_base - * @param Context $context - * @param array<int,Node|int|string> $args - * @return void - */ - public function analyzeFunctionCall(CodeBase $code_base, Context $context, array $args); - - /** - * Make additional analysis logic of this function/method use $closure - * If callers need to invoke multiple closures, they should pass in a closure to invoke multiple closures or use addFunctionCallAnalyzer. - * @return void - */ - public function setFunctionCallAnalyzer(\Closure $closure); - - /** - * If callers need to invoke multiple closures, they should pass in a closure to invoke multiple closures. - * @return void - */ - public function addFunctionCallAnalyzer(\Closure $closure); - - /** - * Initialize the inner scope of this method with variables created from the parameters. - * - * Deferred until the parse phase because getting the UnionType of parameter defaults requires having all class constants be known. - * - * @return void - */ - public function ensureScopeInitialized(CodeBase $code_base); - - /** @return Node|null */ - public function getNode(); - - /** - * @return ?Comment - Not set for internal functions/methods - */ - public function getComment(); - - /** - * @param Comment $comment - * @return void - */ - public function setComment(Comment $comment); - - /** - * @return UnionType of 0 or more types from (at)throws annotations on this function-like - */ - public function getThrowsUnionType() : UnionType; - - /** - * @return bool - * True if this is a magic phpdoc method (declared via (at)method on class declaration phpdoc) - * Always false for global functions(Func). - */ - public function isFromPHPDoc() : bool; - - /** - * Clone the parameter list, so that modifying the parameters on the first call won't modify the others. - * TODO: If parameters were changed to be immutable, they can be shared without cloning with less worry. - * @internal - * @return void - */ - public function cloneParameterList(); - - /** - * @return bool - Does any parameter type possibly require recursive analysis if more specific types are provided? - * - * If this returns true, there is at least one parameter and at least one of those can be overridden with a more specific type. - */ - public function needsRecursiveAnalysis() : bool; - - /** - * Returns a FunctionLikeDeclarationType based on phpdoc+real types. - * The return value is used for type casting rule checking. - */ - public function asFunctionLikeDeclarationType() : FunctionLikeDeclarationType; - - /** - * @return array<mixed,string> in the same format as FunctionSignatureMap.php - */ - public function toFunctionSignatureArray() : array; - - /** - * Precondition: This function is a generator type - * Converts Generator|T[] to Generator<T> - * Converts Generator|array<int,stdClass> to Generator<int,stdClass>, etc. - */ - public function getReturnTypeAsGeneratorTemplateType() : Type; - - /** - * Returns this function's union type without resolving `static` in the function declaration's context. - */ - public function getUnionTypeWithUnmodifiedStatic() : UnionType; - - /** - * Check this method's return types (phpdoc and real) to make sure they're valid, - * and infer a return type from the combination of the signature and phpdoc return types. - * - * @return void - */ - public function analyzeReturnTypes(CodeBase $code_base); - - /** - * Does this function/method declare an (at)template type for this type? - */ - public function declaresTemplateTypeInComment(TemplateType $template_type) : bool; - - /** - * Create any plugins that exist due to doc comment annotations. - * Must be called after adding this FunctionInterface to the $code_base, so that issues can be emitted if needed. - * @return ?Closure(CodeBase, Context, array):UnionType - * @internal - */ - public function getCommentParamAssertionClosure(CodeBase $code_base); -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/FunctionTrait.php b/vendor/phan/phan/src/Phan/Language/Element/FunctionTrait.php deleted file mode 100644 index c0d05f6..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/FunctionTrait.php +++ /dev/null @@ -1,1740 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use AssertionError; -use ast\Node; -use Closure; -use Phan\Analysis\ConditionVisitor; -use Phan\Analysis\NegatedConditionVisitor; -use Phan\Analysis\ParameterTypesAnalyzer; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\RecursionDepthException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Comment\Assertion; -use Phan\Language\FileRef; -use Phan\Language\FQSEN; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\BoolType; -use Phan\Language\Type\ClosureDeclarationParameter; -use Phan\Language\Type\ClosureDeclarationType; -use Phan\Language\Type\FalseType; -use Phan\Language\Type\FunctionLikeDeclarationType; -use Phan\Language\Type\GenericArrayType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\StaticOrSelfType; -use Phan\Language\Type\TemplateType; -use Phan\Language\Type\TrueType; -use Phan\Language\Type\VoidType; -use Phan\Language\UnionType; -use Phan\Plugin\ConfigPluginSet; - -use function count; - -/** - * This contains functionality common to global functions, closures, and methods - * @see FunctionInterface - Classes using this trait use that interface - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -trait FunctionTrait -{ - /** - * @var Comment|null This is reused when quick mode is off. - */ - protected $comment; - - /** - * Did we initialize the inner scope of this method? - * Deferred because hydrating parameter defaults requires having all class constants be known - * @var bool This is set to null immediately after scope initialization is finished. - */ - protected $is_inner_scope_initialized = false; - - /** @return int flags from \Phan\Language\Element\Flags */ - abstract public function getPhanFlags() : int; - - /** @return bool true if all of the bits in $bits is true in $this->getPhanFlags() */ - abstract public function getPhanFlagsHasState(int $bits) : bool; - - /** - * @param int $phan_flags - * - * @return void - */ - abstract public function setPhanFlags(int $phan_flags); - - /** - * @return string - * The (not fully-qualified) name of this element. - */ - abstract public function getName() : string; - - /** - * @return FQSEN - * The fully-qualified structural element name of this - * structural element - */ - abstract public function getFQSEN(); - - /** - * @return string - * The fully-qualified structural element name of this - * structural element - */ - public function getRepresentationForIssue() : string - { - return $this->getFQSEN()->__toString() . '()'; - } - - /** - * @return string - * The name of this structural element (without namespace/class), - * or a string for FunctionLikeDeclarationType which lacks a real FQSEN - * @suppress PhanUnreferencedPublicMethod bad inference? - */ - public function getNameForIssue() : string - { - return $this->getName() . '()'; - } - - /** - * @var int - * The number of required parameters for the method - */ - private $number_of_required_parameters = 0; - - /** - * @var int - * The number of optional parameters for the method. - * Note that this is set to a large number in methods using varargs or func_get_arg*() - */ - private $number_of_optional_parameters = 0; - - /** - * @var int - * The number of required (real) parameters for the method declaration. - * For internal methods, ignores Phan's annotations. - */ - private $number_of_required_real_parameters = 0; - - /** - * @var int - * The number of optional (real) parameters for the method declaration. - * For internal methods, ignores Phan's annotations. - * For user-defined methods, ignores presence of func_get_arg*() - */ - private $number_of_optional_real_parameters = 0; - - /** - * @var bool|null - * Does any parameter type possibly require recursive analysis if more specific types are provided? - * Caches the return value for $this->needsRecursiveAnalysis() - */ - private $needs_recursive_analysis = null; - - /** - * @var array<int,Parameter> - * The list of parameters for this method - * This will change while the method is being analyzed when the config quick_mode is false. - */ - private $parameter_list = []; - - /** - * @var ?int - * The hash of the types for the list of parameters for this function/method. - */ - private $parameter_list_hash = null; - - /** - * @var ?bool - * Whether or not this function/method has any pass by reference parameters. - */ - private $has_pass_by_reference_parameters = null; - - /** - * @var array<int,int> - * If the types for a parameter list were checked, - * this contains the recursion depth for a given integer hash (smaller is earlier in recursion) - */ - private $checked_parameter_list_hashes = []; - - /** - * @var array<int,Parameter> - * The list of *real* (not from phpdoc) parameters for this method. - * This does not change after initialization. - */ - private $real_parameter_list = []; - - /** - * @var array<string,UnionType> - * The list of unmodified *phpdoc* parameter types for this method. - * This does not change after initialization. - */ - private $phpdoc_parameter_type_map = []; - - /** - * @var array<int,string> - * A list of parameter names that are output-only references - */ - private $phpdoc_output_references = []; - - /** - * @var ?UnionType - * The unmodified *phpdoc* union type for this method. - * Will be null without any (at)return statements. - */ - private $phpdoc_return_type; - - /** - * @var UnionType - * The *real* (not from phpdoc) return type from this method. - * This does not change after initialization. - */ - private $real_return_type; - - /** - * @var Closure|null (CodeBase, Context, Func|Method $func, Node[]|string[]|int[] $arg_list) => UnionType - */ - private $return_type_callback = null; - - /** - * @var Closure|null (CodeBase, Context, Func|Method $func, Node[]|string[]|int[] $arg_list) => void - */ - private $function_call_analyzer_callback = null; - - /** - * @var FunctionLikeDeclarationType|null (Lazily generated) - */ - private $as_closure_declaration_type; - - /** - * @var Type|null (Lazily generated) - */ - private $as_generator_template_type; - - /** - * @return int - * The number of optional real parameters on this function/method. - * This may differ from getNumberOfOptionalParameters() - * for internal modules lacking proper reflection info, - * or if the installed module version's API changed from what Phan's stubs used, - * or if a function/method uses variadics/func_get_arg*() - */ - public function getNumberOfOptionalRealParameters() : int - { - return $this->number_of_optional_real_parameters; - } - - /** - * @return int - * The number of optional parameters on this method - */ - public function getNumberOfOptionalParameters() : int - { - return $this->number_of_optional_parameters; - } - - /** - * The number of optional parameters - * - * @return void - */ - public function setNumberOfOptionalParameters(int $number) - { - $this->number_of_optional_parameters = $number; - } - - /** - * @return int - * The number of parameters in this function/method declaration. - * Variadic parameters are counted only once. - * TODO: Specially handle variadic parameters, either here or in ParameterTypesAnalyzer::analyzeOverrideRealSignature - */ - public function getNumberOfRealParameters() : int - { - return ( - $this->getNumberOfRequiredRealParameters() - + $this->getNumberOfOptionalRealParameters() - ); - } - - /** - * @return int - * The maximum number of parameters to this function/method - */ - public function getNumberOfParameters() : int - { - return ( - $this->getNumberOfRequiredParameters() - + $this->getNumberOfOptionalParameters() - ); - } - - /** - * @return int - * The number of required real parameters on this function/method. - * This may differ for internal modules lacking proper reflection info, - * or if the installed module version's API changed from what Phan's stubs used. - */ - public function getNumberOfRequiredRealParameters() : int - { - return $this->number_of_required_real_parameters; - } - - /** - * @return int - * The number of required parameters on this function/method - */ - public function getNumberOfRequiredParameters() : int - { - return $this->number_of_required_parameters; - } - - /** - * - * The number of required parameters - * - * @return void - */ - public function setNumberOfRequiredParameters(int $number) - { - $this->number_of_required_parameters = $number; - } - - /** - * @return bool - * True if this method had no return type defined when it - * was defined (either in the signature itself or in the - * docblock). - */ - public function isReturnTypeUndefined() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_RETURN_TYPE_UNDEFINED); - } - - /** - * @param bool $is_return_type_undefined - * True if this method had no return type defined when it - * was defined (either in the signature itself or in the - * docblock). - * - * @return void - */ - public function setIsReturnTypeUndefined( - bool $is_return_type_undefined - ) { - $this->setPhanFlags(Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_RETURN_TYPE_UNDEFINED, - $is_return_type_undefined - )); - } - - /** - * @return bool - * True if this method returns a value - * (i.e. it has a return with an expression) - */ - public function getHasReturn() : bool - { - return $this->getPhanFlagsHasState(Flags::HAS_RETURN); - } - - /** - * @return bool - * True if this method yields any value(i.e. it is a \Generator) - */ - public function getHasYield() : bool - { - return $this->getPhanFlagsHasState(Flags::HAS_YIELD); - } - - /** - * @param bool $has_return - * Set to true to mark this method as having a - * return value - * - * @return void - */ - public function setHasReturn(bool $has_return) - { - $this->setPhanFlags(Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::HAS_RETURN, - $has_return - )); - } - - /** - * @param bool $has_yield - * Set to true to mark this method as having a - * yield value - * - * @return void - */ - public function setHasYield(bool $has_yield) - { - // TODO: In a future release of php-ast, this information will be part of the function node's flags. - // (PHP 7.1+ only, not supported in PHP 7.0) - $this->setPhanFlags(Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::HAS_YIELD, - $has_yield - )); - } - - /** - * @return array<int,Parameter> - * A list of parameters on the method - */ - public function getParameterList() - { - return $this->parameter_list; - } - - /** - * @return bool - Does any parameter type possibly require recursive analysis if more specific types are provided? - * - * If this returns true, there is at least one parameter and at least one of those can be overridden with a more specific type. - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function needsRecursiveAnalysis() : bool - { - return $this->needs_recursive_analysis ?? ($this->needs_recursive_analysis = $this->computeNeedsRecursiveAnalysis()); - } - - private function computeNeedsRecursiveAnalysis() : bool - { - if (!$this->getNode()) { - // E.g. this can be the case for magic methods, internal methods, stubs, etc. - return false; - } - - foreach ($this->parameter_list as $parameter) { - if ($parameter->getNonVariadicUnionType()->shouldBeReplacedBySpecificTypes()) { - return true; - } - if ($parameter->isPassByReference() && $parameter->getReferenceType() !== Flags::IS_WRITE_REFERENCE) { - return true; - } - } - return false; - } - - /** - * Gets the $ith parameter for the **caller**. - * In the case of variadic arguments, an infinite number of parameters exist. - * (The callee would see variadic arguments(T ...$args) as a single variable of type T[], - * while the caller sees a place expecting an expression of type T. - * - * @param int $i - offset of the parameter. - * @return Parameter|null The parameter type that the **caller** observes. - */ - public function getParameterForCaller(int $i) - { - $list = $this->parameter_list; - if (count($list) === 0) { - return null; - } - $parameter = $list[$i] ?? null; - if ($parameter) { - return $parameter->asNonVariadic(); - } - $last_parameter = $list[count($list) - 1]; - if ($last_parameter->isVariadic()) { - return $last_parameter->asNonVariadic(); - } - return null; - } - - /** - * Gets the $ith parameter for the **caller**. - * In the case of variadic arguments, an infinite number of parameters exist. - * (The callee would see variadic arguments(T ...$args) as a single variable of type T[], - * while the caller sees a place expecting an expression of type T. - * - * @param int $i - offset of the parameter. - * @return Parameter|null The real parameter type (from php signature) that the **caller** observes. - * @suppress PhanUnreferencedPublicMethod false positive - this is referenced in FunctionInterface. - */ - public function getRealParameterForCaller(int $i) - { - $list = $this->real_parameter_list; - if (count($list) === 0) { - return null; - } - $parameter = $list[$i] ?? null; - if ($parameter) { - return $parameter->asNonVariadic(); - } - $last_parameter = $list[count($list) - 1]; - if ($last_parameter->isVariadic()) { - return $last_parameter->asNonVariadic(); - } - return null; - } - - /** - * @param array<int,Parameter> $parameter_list - * A list of parameters to set on this method - * (When quick_mode is false, this is also called to temporarily - * override parameter types, etc.) - * - * @return void - * @internal - */ - public function setParameterList(array $parameter_list) - { - $this->parameter_list = $parameter_list; - if ($this->parameter_list_hash === null) { - $this->initParameterListInfo(); - } - } - - /** - * Called to lazily initialize properties of $this derived from $this->parameter_list - */ - private function initParameterListInfo() - { - $parameter_list = $this->parameter_list; - $this->parameter_list_hash = self::computeParameterListHash($parameter_list); - $has_pass_by_reference_parameters = false; - foreach ($parameter_list as $param) { - if ($param->isPassByReference()) { - $has_pass_by_reference_parameters = true; - break; - } - } - $this->has_pass_by_reference_parameters = $has_pass_by_reference_parameters; - } - - /** - * Called to generate a hash of a given parameter list, to avoid calling this on the same parameter list twice. - * - * @param array<int,Parameter> $parameter_list - * - * @return int 32-bit or 64-bit hash. Not likely to collide unless there are around 2^16 possible union types on 32-bit, or around 2^32 on 64-bit. - * (Collisions aren't a concern; The memory/runtime would probably be a bigger issue than collisions in non-quick mode.) - */ - private static function computeParameterListHash(array $parameter_list) : int - { - // Choosing a small value to fit inside of a packed array. - if (\count($parameter_list) === 0) { - return 0; - } - if (Config::get_quick_mode()) { - return 0; - } - $param_repr = ''; - foreach ($parameter_list as $param) { - $param_repr .= $param->getUnionType()->__toString() . ','; - } - $raw_bytes = \md5($param_repr, true); - return \unpack(\PHP_INT_SIZE === 8 ? 'q' : 'l', $raw_bytes)[1]; - } - - /** - * @return array<int,Parameter> $parameter_list - * A list of parameters (not from phpdoc) that were set on this method. The parameters will be cloned. - */ - public function getRealParameterList() - { - // Excessive cloning, to ensure that this stays immutable. - return \array_map(/** @return Parameter */ static function (Parameter $param) { - return clone($param); - }, $this->real_parameter_list); - } - - /** - * @param array<int,Parameter> $parameter_list - * A list of parameters (not from phpdoc) to set on this method. The parameters will be cloned. - * - * @return void - */ - public function setRealParameterList(array $parameter_list) - { - $this->real_parameter_list = \array_map(/** @return Parameter */ static function (Parameter $param) { - return clone($param); - }, $parameter_list); - - $required_count = 0; - $optional_count = 0; - foreach ($parameter_list as $parameter) { - if ($parameter->isOptional()) { - $optional_count++; - } else { - $required_count++; - } - } - $this->number_of_required_real_parameters = $required_count; - $this->number_of_optional_real_parameters = $optional_count; - } - - /** - * @param UnionType $union_type - * The real (non-phpdoc) return type of this method in its given context. - * - * @return void - */ - public function setRealReturnType(UnionType $union_type) - { - // TODO: was `self` properly resolved already? What about in subclasses? - $this->real_return_type = $union_type; - } - - /** - * @return UnionType - * The type of this method in its given context. - */ - public function getRealReturnType() : UnionType - { - if (!$this->real_return_type) { - // Incomplete patch for https://github.com/phan/phan/issues/670 - return UnionType::empty(); - // throw new \Error(sprintf("Failed to get real return type in %s method %s", (string)$this->getClassFQSEN(), (string)$this)); - } - // Clone the union type, to be certain it will remain immutable. - return $this->real_return_type; - } - - /** - * @param Parameter $parameter - * A parameter to append to the parameter list - * - * @return void - * @internal - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function appendParameter(Parameter $parameter) - { - $this->parameter_list[] = $parameter; - } - - /** - * @return void - * - * Call this before calling appendParameter, if parameters were already added. - * @internal - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function clearParameterList() - { - $this->parameter_list = []; - $this->parameter_list_hash = null; - } - - /** - * Adds types from comments to the params of a user-defined function or method. - * Also adds the types from defaults, and emits warnings for certain violations. - * - * Conceptually, Func and Method should have defaults/comments analyzed in the same way. - * - * This does nothing if $function is for an internal method. - * - * @param Context $context - * The context in which the node appears - * - * @param CodeBase $code_base - * - * @param FunctionInterface $function - A Func or Method to add params to the local scope of. - * - * @param Comment $comment - processed doc comment of $node, with params - * - * @return void - */ - public static function addParamsToScopeOfFunctionOrMethod( - Context $context, - CodeBase $code_base, - FunctionInterface $function, - Comment $comment - ) { - if ($function->isPHPInternal()) { - return; - } - $parameter_offset = 0; - $function_parameter_list = $function->getParameterList(); - $real_parameter_name_map = []; - foreach ($function_parameter_list as $parameter) { - $real_parameter_name_map[$parameter->getName()] = $parameter; - self::addParamToScopeOfFunctionOrMethod( - $context, - $code_base, - $function, - $comment, - $parameter_offset, - $parameter - ); - ++$parameter_offset; - } - - $valid_comment_parameter_type_map = []; - foreach ($comment->getParameterMap() as $comment_parameter_name => $comment_parameter) { - if (!\array_key_exists($comment_parameter_name, $real_parameter_name_map)) { - Issue::maybeEmit( - $code_base, - $context, - count($real_parameter_name_map) > 0 ? Issue::CommentParamWithoutRealParam : Issue::CommentParamOnEmptyParamList, - $comment_parameter->getLineno(), - $comment_parameter_name, - (string)$function - ); - continue; - } - // Record phpdoc types to check if they are narrower than real types, later. - // Only keep non-empty types. - $comment_parameter_type = $comment_parameter->getUnionType(); - if (!$comment_parameter_type->isEmpty()) { - $valid_comment_parameter_type_map[$comment_parameter_name] = $comment_parameter_type; - } - if ($comment_parameter->isOutputReference()) { - $real_parameter_name_map[$comment_parameter_name]->setIsOutputReference(); - } - } - $function->setPHPDocParameterTypeMap($valid_comment_parameter_type_map); - if ($function instanceof Method) { - $function->checkForTemplateTypes(); - } - // Special, for libraries which use this for to document variadic param lists. - } - - /** - * Internally used. - * @return void - */ - public static function addParamToScopeOfFunctionOrMethod( - Context $context, - CodeBase $code_base, - FunctionInterface $function, - Comment $comment, - int $parameter_offset, - Parameter $parameter - ) { - if ($function->isPHPInternal()) { - return; - } - $parameter_name = $parameter->getName(); - if ($parameter->getUnionType()->isEmpty()) { - // If there is no type specified in PHP, check - // for a docComment with @param declarations. We - // assume order in the docComment matches the - // parameter order in the code - if ($comment->hasParameterWithNameOrOffset( - $parameter_name, - $parameter_offset - )) { - $comment_param = $comment->getParameterWithNameOrOffset( - $parameter_name, - $parameter_offset - ); - $comment_param_type = $comment_param->getUnionType(); - if ($parameter->isVariadic() !== $comment_param->isVariadic()) { - Issue::maybeEmit( - $code_base, - $context, - $parameter->isVariadic() ? Issue::TypeMismatchVariadicParam : Issue::TypeMismatchVariadicComment, - $comment_param->getLineno(), - $comment_param->__toString(), - $parameter->__toString() - ); - } - - // if ($parameter->isCloneOfVariadic()) { throw new \Error("Impossible\n"); } - $parameter->addUnionType($comment_param_type); - } - } - - // If there's a default value on the parameter, check to - // see if the type of the default is cool with the - // specified type. - if ($parameter->hasDefaultValue()) { - $default_type = $parameter->getDefaultValueType(); - $default_is_null = $default_type->isType(NullType::instance(false)); - // If the default type isn't null and can't cast - // to the parameter's declared type, emit an - // issue. - if (!$default_is_null) { - if (!$default_type->canCastToUnionType( - $parameter->getUnionType() - )) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeMismatchDefault, - $function->getFileRef()->getLineNumberStart(), - (string)$parameter->getUnionType(), - $parameter_name, - (string)$default_type - ); - } - } - - // If there are no types on the parameter, the - // default shouldn't be treated as the one - // and only allowable type. - $was_empty = $parameter->getUnionType()->isEmpty(); - - // If we have no other type info about a parameter, - // just because it has a default value of null - // doesn't mean that is its type. Any type can default - // to null - if ($default_is_null) { - if ($was_empty) { - $parameter->addUnionType(MixedType::instance(false)->asUnionType()); - } - // The parameter constructor or above check for wasEmpty already took care of null default case - } else { - $default_type = $default_type->withFlattenedArrayShapeOrLiteralTypeInstances(); - if ($was_empty) { - $parameter->addUnionType(self::inferNormalizedTypesOfDefault($default_type)); - if (!Config::getValue('guess_unknown_parameter_type_using_default')) { - $parameter->addUnionType(MixedType::instance(false)->asUnionType()); - } - } else { - // Don't add both `int` and `?int` to the same set. - foreach ($default_type->getTypeSet() as $default_type_part) { - if (!$parameter->getNonvariadicUnionType()->hasType($default_type_part->withIsNullable(true))) { - // if ($parameter->isCloneOfVariadic()) { throw new \Error("Impossible\n"); } - $parameter->addType($default_type_part); - } - } - } - } - } - } - - private static function inferNormalizedTypesOfDefault(UnionType $default_type) : UnionType - { - $type_set = $default_type->getTypeSet(); - if (\count($type_set) === 0) { - return $default_type; - } - $normalized_default_type = UnionType::empty(); - foreach ($type_set as $type) { - if ($type instanceof FalseType || $type instanceof NullType) { - return MixedType::instance(false)->asUnionType(); - } elseif ($type instanceof GenericArrayType) { - // Ideally should be the **only** type. - $normalized_default_type = $normalized_default_type->withType(ArrayType::instance(false)); - } elseif ($type instanceof TrueType) { - // e.g. for `function myFn($x = true) { }, $x is probably of type bool, but we're less sure about the type of $x from `$x = false` - $normalized_default_type = $normalized_default_type->withType(BoolType::instance(false)); - } else { - $normalized_default_type = $normalized_default_type->withType($type); - } - } - return $normalized_default_type; - } - - /** - * @param array<string,UnionType> $parameter_map maps a subset of param names to the unmodified phpdoc parameter types. This may differ from real parameter types. - * @return void - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function setPHPDocParameterTypeMap(array $parameter_map) - { - $this->phpdoc_parameter_type_map = $parameter_map; - } - - /** - * Records the fact that $parameter_name is an output-only reference. - * @param string $parameter_name - * @return void - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function recordOutputReferenceParamName(string $parameter_name) - { - $this->phpdoc_output_references[] = $parameter_name; - } - - /** - * @return array<int,string> list of output references. Usually empty. - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function getOutputReferenceParamNames() : array - { - return $this->phpdoc_output_references; - } - - /** - * @return array<string,UnionType> maps a subset of param names to the unmodified phpdoc parameter types. - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function getPHPDocParameterTypeMap() - { - return $this->phpdoc_parameter_type_map; - } - - /** - * @param ?UnionType $type the raw phpdoc union type - * @return void - */ - public function setPHPDocReturnType($type) - { - $this->phpdoc_return_type = $type; - } - - /** - * @return ?UnionType the raw phpdoc union type - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function getPHPDocReturnType() - { - return $this->phpdoc_return_type; - } - - /** - * Returns true if the param list has an instance of PassByReferenceVariable - * If it does, the method has to be analyzed even if the same parameter types were analyzed already - * @param array<int,Variable> $parameter_list - */ - private function hasPassByReferenceVariable(array $parameter_list) : bool - { - // Common case: function doesn't have any references in parameter list - if ($this->has_pass_by_reference_parameters === false) { - return false; - } - foreach ($parameter_list as $param) { - if ($param instanceof PassByReferenceVariable) { - return true; - } - } - return false; - } - - /** - * analyzeWithNewParams is called only when the quick_mode config is false. - * The new types are inferred based on the caller's types. - * As an optimization, this refrains from re-analyzing the method/function it has already been analyzed for those param types - * (With an equal or larger remaining recursion depth) - * - * @param array<int,Parameter> $parameter_list - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function analyzeWithNewParams(Context $context, CodeBase $code_base, array $parameter_list) : Context - { - $hash = $this->computeParameterListHash($parameter_list); - $has_pass_by_reference_variable = null; - // Nothing to do, except if PassByReferenceVariable was used - if ($hash === $this->parameter_list_hash) { - if (!$this->hasPassByReferenceVariable($parameter_list)) { - // Have to analyze pass by reference variables anyway - return $context; - } - $has_pass_by_reference_variable = true; - } - // Check if we've already analyzed this method with those given types, - // with as much or even more depth left in the recursion. - // (getRecursionDepth() increases as the program recurses downward) - $old_recursion_depth_for_hash = $this->checked_parameter_list_hashes[$hash] ?? null; - $new_recursion_depth_for_hash = $this->getRecursionDepth(); - if ($old_recursion_depth_for_hash !== null) { - if ($new_recursion_depth_for_hash >= $old_recursion_depth_for_hash) { - if (!($has_pass_by_reference_variable ?? $this->hasPassByReferenceVariable($parameter_list))) { - return $context; - } - // Have to analyze pass by reference variables anyway - $new_recursion_depth_for_hash = $old_recursion_depth_for_hash; - } - } - // Record the fact that it has already been analyzed, - // along with the depth of recursion so far. - $this->checked_parameter_list_hashes[$hash] = $new_recursion_depth_for_hash; - return $this->analyze($context, $code_base); - } - - /** - * Analyze this with original parameter types or types from arguments. - */ - abstract public function analyze(Context $context, CodeBase $code_base) : Context; - - /** @return int the current depth of recursive non-quick analysis. */ - abstract public function getRecursionDepth() : int; - - /** @return Node|null the node of this function-like's declaration, if any exist and were kept for recursive non-quick analysis. */ - abstract public function getNode(); - - /** @return Context location and scope where this was declared. */ - abstract public function getContext() : Context; - - /** @return FileRef location where this was declared. */ - abstract public function getFileRef() : FileRef; - - /** - * Returns true if the return type depends on the argument, and a plugin makes Phan aware of that. - */ - public function hasDependentReturnType() : bool - { - return $this->return_type_callback !== null; - } - - /** - * Returns a union type based on $args_node and $context - * - * @param CodeBase $code_base - * @param Context $context - * @param array<int,Node|int|string|float> $args - */ - public function getDependentReturnType(CodeBase $code_base, Context $context, array $args) : UnionType - { - // @phan-suppress-next-line PhanTypePossiblyInvalidCallable - Callers should check hasDependentReturnType - return ($this->return_type_callback)($code_base, $context, $this, $args); - } - - /** - * @return void - */ - public function setDependentReturnTypeClosure(Closure $closure) - { - $this->return_type_callback = $closure; - } - - /** - * Returns true if this function or method has additional analysis logic for invocations (From internal and user defined plugins) - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function hasFunctionCallAnalyzer() : bool - { - return $this->function_call_analyzer_callback !== null; - } - - /** - * Perform additional analysis logic for invocations (From internal and user defined plugins) - * - * @param CodeBase $code_base - * @param Context $context - * @param array<int,Node|int|string|float> $args - * @return void - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function analyzeFunctionCall(CodeBase $code_base, Context $context, array $args) - { - // @phan-suppress-next-line PhanTypePossiblyInvalidCallable - Callers should check hasFunctionCallAnalyzer - ($this->function_call_analyzer_callback)($code_base, $context, $this, $args); - } - - /** - * Make additional analysis logic of this function/method use $closure - * If callers need to invoke multiple closures, they should pass in a closure to invoke multiple closures or use addFunctionCallAnalyzer. - * @return void - */ - public function setFunctionCallAnalyzer(Closure $closure) - { - $this->function_call_analyzer_callback = $closure; - } - - /** - * Make additional analysis logic of this function/method use $closure in addition to any other closures. - * @return void - */ - public function addFunctionCallAnalyzer(Closure $closure) - { - $old_closure = $this->function_call_analyzer_callback; - if ($old_closure) { - $closure = ConfigPluginSet::mergeAnalyzeFunctionCallClosures($old_closure, $closure); - } - $this->function_call_analyzer_callback = $closure; - } - - /** - * @return ?Comment - Not set for internal functions/methods - */ - public function getComment() - { - return $this->comment; - } - - /** - * @param Comment $comment - * @return void - */ - public function setComment(Comment $comment) - { - $this->comment = $comment; - } - - /** - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function getThrowsUnionType() : UnionType - { - $comment = $this->comment; - return $comment ? $comment->getThrowsUnionType() : UnionType::empty(); - } - - /** - * Initialize the inner scope of this method with variables created from the parameters. - * - * Deferred until the parse phase because getting the UnionType of parameter defaults requires having all class constants be known. - * - * @return void - */ - public function ensureScopeInitialized(CodeBase $code_base) - { - if ($this->is_inner_scope_initialized) { - return; - } - $this->is_inner_scope_initialized = true; - $comment = $this->comment; - // $comment can be null for magic methods from `@method` - if ($comment !== null) { - if (!($this instanceof FunctionInterface)) { - throw new AssertionError('Expected any class using FunctionTrait to implement FunctionInterface'); - } - FunctionTrait::addParamsToScopeOfFunctionOrMethod($this->getContext(), $code_base, $this, $comment); - } - } - - /** @return void */ - abstract public function memoizeFlushAll(); - - /** @return UnionType union type this function-like's declared return type (from PHPDoc, signatures, etc.) */ - abstract public function getUnionType() : UnionType; - - /** @return void */ - abstract public function setUnionType(UnionType $type); - - /** - * Creates a callback that can restore this element to the state it had before parsing. - * @internal - Used by daemon mode - * @return Closure - */ - public function createRestoreCallback() - { - $clone_this = clone($this); - foreach ($clone_this->parameter_list as $i => $parameter) { - $clone_this->parameter_list[$i] = clone($parameter); - } - foreach ($clone_this->real_parameter_list as $i => $parameter) { - $clone_this->real_parameter_list[$i] = clone($parameter); - } - $union_type = $this->getUnionType(); - - return function () use ($clone_this, $union_type) { - $this->memoizeFlushAll(); - // @phan-suppress-next-line PhanTypeSuspiciousNonTraversableForeach this is intentionally iterating over private properties of the clone. - foreach ($clone_this as $key => $value) { - $this->{$key} = $value; - } - $this->setUnionType($union_type); - }; - } - - /** - * Clone the parameter list, so that modifying the parameters on the first call won't modify the others. - * TODO: If they're immutable, they can be shared without cloning with less worry. - * @internal - * @return void - */ - public function cloneParameterList() - { - $this->setParameterList( - \array_map( - static function (Parameter $parameter) : Parameter { - return clone($parameter); - }, - $this->getParameterList() - ) - ); - } - - /** - * Returns a FunctionLikeDeclarationType based on phpdoc+real types. - * The return value is used for type casting rule checking. - * @suppress PhanUnreferencedPublicMethod Phan knows FunctionInterface's method is referenced, but can't associate that yet. - */ - public function asFunctionLikeDeclarationType() : FunctionLikeDeclarationType - { - return $this->as_closure_declaration_type ?? ($this->as_closure_declaration_type = $this->createFunctionLikeDeclarationType()); - } - - /** - * Does this function-like return a reference? - */ - abstract public function returnsRef() : bool; - - private function createFunctionLikeDeclarationType() : FunctionLikeDeclarationType - { - $params = \array_map(static function (Parameter $parameter) : ClosureDeclarationParameter { - return $parameter->asClosureDeclarationParameter(); - }, $this->getParameterList()); - - $return_type = $this->getUnionType(); - if ($return_type->isEmpty()) { - $return_type = MixedType::instance(false)->asUnionType(); - } - return new ClosureDeclarationType( - $this->getFileRef(), - $params, - $return_type, - $this->returnsRef(), - false - ); - } - - /** - * @return array<mixed,string> in the same format as FunctionSignatureMap.php - * @throws \InvalidArgumentException if this function has invalid parameters for generating a stub (e.g. param names, types, etc.) - */ - public function toFunctionSignatureArray() : array - { - $return_type = $this->getUnionType(); - $stub = [$return_type->__toString()]; - '@phan-var array<mixed,string> $stub'; // TODO: Should not warn about PhanTypeMismatchDimFetch in isset below - foreach ($this->getParameterList() as $parameter) { - $name = $parameter->getName(); - if (!$name || isset($stub[$name])) { - throw new \InvalidArgumentException("Invalid name '$name' for {$this->getFQSEN()}"); - } - if ($parameter->isOptional()) { - $name .= '='; - } - $type_string = $parameter->getUnionType()->__toString(); - if ($parameter->isVariadic()) { - $name = '...' . $name; - } - if ($parameter->isPassByReference()) { - $name = '&' . $name; - } - $stub[$name] = $type_string; - } - return $stub; - } - - /** - * Precondition: This function is a generator type - * Converts Generator|T[] to Generator<T> - * Converts Generator|array<int,stdClass> to Generator<int,stdClass>, etc. - */ - public function getReturnTypeAsGeneratorTemplateType() : Type - { - return $this->as_generator_template_type ?? ($this->as_generator_template_type = $this->getUnionType()->asGeneratorTemplateType()); - } - - /** - * @var bool have the return types (both real and PHPDoc) of this method been analyzed and combined yet? - */ - protected $did_analyze_return_types = false; - - /** - * Check this method's return types (phpdoc and real) to make sure they're valid, - * and infer a return type from the combination of the signature and phpdoc return types. - * - * @return void - */ - public function analyzeReturnTypes(CodeBase $code_base) - { - if ($this->did_analyze_return_types) { - return; - } - $this->did_analyze_return_types = true; - try { - $this->analyzeReturnTypesInner($code_base); - } catch (RecursionDepthException $_) { - } - } - - /** - * Is this internal? - */ - abstract public function isPHPInternal() : bool; - - /** - * Returns this function's union type without resolving `static` in the function declaration's context. - */ - abstract public function getUnionTypeWithUnmodifiedStatic() : UnionType; - - private function analyzeReturnTypesInner(CodeBase $code_base) - { - if ($this->isPHPInternal()) { - // nothing to do, no known Node - return; - } - $return_type = $this->getUnionTypeWithUnmodifiedStatic(); - $real_return_type = $this->getRealReturnType(); - $phpdoc_return_type = $this->getPHPDocReturnType(); - $context = $this->getContext(); - // TODO: use method->getPHPDocUnionType() to check compatibility, like analyzeParameterTypesDocblockSignaturesMatch - - // Look at each parameter to make sure their types - // are valid - - // Look at each type in the function's return union type - foreach ($return_type->withFlattenedArrayShapeOrLiteralTypeInstances()->getTypeSet() as $outer_type) { - foreach ($outer_type->getReferencedClasses() as $type) { - // If its a reference to self, its OK - if ($this instanceof Method && $type instanceof StaticOrSelfType) { - continue; - } - - if ($type instanceof TemplateType) { - if ($this instanceof Method) { - if ($this->isStatic() && !$this->declaresTemplateTypeInComment($type)) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TemplateTypeStaticMethod, - $this->getFileRef()->getLineNumberStart(), - (string)$this->getFQSEN() - ); - } - } - continue; - } - // Make sure the class exists - $type_fqsen = FullyQualifiedClassName::fromType($type); - if (!$code_base->hasClassWithFQSEN($type_fqsen)) { - Issue::maybeEmitWithParameters( - $code_base, - $this->getContext(), - Issue::UndeclaredTypeReturnType, - $this->getFileRef()->getLineNumberStart(), - [$this->getNameForIssue(), (string)$outer_type], - IssueFixSuggester::suggestSimilarClass($code_base, $this->getContext(), $type_fqsen, null, 'Did you mean', IssueFixSuggester::CLASS_SUGGEST_CLASSES_AND_TYPES_AND_VOID) - ); - } - } - } - if (Config::getValue('check_docblock_signature_return_type_match') && !$real_return_type->isEmpty() && ($phpdoc_return_type instanceof UnionType) && !$phpdoc_return_type->isEmpty()) { - $resolved_real_return_type = $real_return_type->withStaticResolvedInContext($context); - foreach ($phpdoc_return_type->getTypeSet() as $phpdoc_type) { - $is_exclusively_narrowed = $phpdoc_type->isExclusivelyNarrowedFormOrEquivalentTo( - $resolved_real_return_type, - $context, - $code_base - ); - // Make sure that the commented type is a narrowed - // or equivalent form of the syntax-level declared - // return type. - if (!$is_exclusively_narrowed) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeMismatchDeclaredReturn, - // @phan-suppress-next-line PhanAccessMethodInternal, PhanPartialTypeMismatchArgument TODO: Support inferring this is FunctionInterface - ParameterTypesAnalyzer::guessCommentReturnLineNumber($this) ?? $context->getLineNumberStart(), - $this->getName(), - $phpdoc_type->__toString(), - $real_return_type->__toString() - ); - } - if ($is_exclusively_narrowed && Config::getValue('prefer_narrowed_phpdoc_return_type')) { - $normalized_phpdoc_return_type = ParameterTypesAnalyzer::normalizeNarrowedParamType($phpdoc_return_type, $real_return_type); - if ($normalized_phpdoc_return_type) { - // TODO: How does this currently work when there are multiple types in the union type that are compatible? - $this->setUnionType($normalized_phpdoc_return_type); - } else { - // This check isn't urgent to fix, and is specific to nullable casting rules, - // so use a different issue type. - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeMismatchDeclaredReturnNullable, - // @phan-suppress-next-line PhanAccessMethodInternal, PhanPartialTypeMismatchArgument TODO: Support inferring this is FunctionInterface - ParameterTypesAnalyzer::guessCommentReturnLineNumber($this) ?? $context->getLineNumberStart(), - $this->getName(), - $phpdoc_type->__toString(), - $real_return_type->__toString() - ); - } - } - } - } - if ($return_type->isEmpty() && !$this->getHasReturn()) { - if ($this instanceof Func || ($this instanceof Method && ($this->isPrivate() || $this->isEffectivelyFinal() || $this->getIsMagicAndVoid() || $this->getClass($code_base)->isFinal()))) { - $this->setUnionType(VoidType::instance(false)->asUnionType()); - } - } - foreach ($real_return_type->getTypeSet() as $type) { - if (!$type->isObjectWithKnownFQSEN()) { - continue; - } - $type_fqsen = FullyQualifiedClassName::fromType($type); - if (!$code_base->hasClassWithFQSEN($type_fqsen)) { - // We should have already warned - continue; - } - $class = $code_base->getClassByFQSEN($type_fqsen); - if ($class->isTrait()) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeInvalidTraitReturn, - $this->getFileRef()->getLineNumberStart(), - $this->getNameForIssue(), - $type_fqsen->__toString() - ); - } - } - if ($this->comment) { - // Add plugins **after** the phpdoc and real comment types were merged. - // Plugins affecting return types (for template in (at)return) - $template_type_list = $this->comment->getTemplateTypeList(); - if ($template_type_list) { - $this->addClosureForDependentTemplateType($code_base, $context, $template_type_list); - } - } - } - - /** - * Does this function/method declare an (at)template type for this type? - */ - public function declaresTemplateTypeInComment(TemplateType $template_type) : bool - { - if ($this->comment) { - // Template types are identical if they have the same name. See TemplateType::instanceForId. - return \in_array($template_type, $this->comment->getTemplateTypeList(), true); - } - return false; - } - - private function isTemplateTypeUsed(TemplateType $type) : bool - { - if ($this->getUnionType()->usesTemplateType($type)) { - // used in `@return` - return true; - } - - if ($this->comment) { - foreach ($this->comment->getParamAssertionMap() as $assertion) { - // @phan-suppress-next-line PhanAccessPropertyInternal - if ($assertion->union_type->usesTemplateType($type)) { - // used in `@phan-assert` - return true; - } - } - } - return false; - } - - /** - * @param TemplateType[] $template_type_list - */ - private function addClosureForDependentTemplateType(CodeBase $code_base, Context $context, array $template_type_list) - { - if ($this->hasDependentReturnType()) { - // We already added this or this conflicts with a plugin. - return; - } - if (!$template_type_list) { - // Shouldn't happen - return; - } - $parameter_extractor_map = []; - $has_all_templates = true; - foreach ($template_type_list as $template_type) { - if (!$this->isTemplateTypeUsed($template_type)) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TemplateTypeNotUsedInFunctionReturn, - $context->getLineNumberStart(), - $template_type, - $this->getNameForIssue() - ); - $has_all_templates = false; - continue; - } - $parameter_extractor = $this->getTemplateTypeExtractorClosure($code_base, $template_type); - if (!$parameter_extractor) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TemplateTypeNotDeclaredInFunctionParams, - $context->getLineNumberStart(), - $template_type, - $this->getNameForIssue() - ); - $has_all_templates = false; - continue; - } - $parameter_extractor_map[$template_type->getName()] = $parameter_extractor; - } - if (!$has_all_templates) { - return; - } - /** - * Resolve the template types based on the parameters passed to the function - * @param array<int,Node|mixed> $args - */ - $analyzer = static function (CodeBase $code_base, Context $context, FunctionInterface $function, array $args) use ($parameter_extractor_map) : UnionType { - $args_types = \array_map( - /** - * @param mixed $node - */ - static function ($node) use ($code_base, $context) : UnionType { - return UnionTypeVisitor::unionTypeFromNode($code_base, $context, $node); - }, - $args - ); - $template_type_map = []; - foreach ($parameter_extractor_map as $name => $closure) { - $template_type_map[$name] = $closure ? $closure($args_types, $context) : UnionType::empty(); - } - return $function->getUnionType()->withTemplateParameterTypeMap($template_type_map); - }; - $this->setDependentReturnTypeClosure($analyzer); - } - - /** - * @param TemplateType $template_type the template type that this function is looking for references to in parameters - * - * @return ?Closure(array<int,Node|string|int|float|UnionType>, Context):UnionType - */ - public function getTemplateTypeExtractorClosure(CodeBase $code_base, TemplateType $template_type, int $skip_index = null) - { - $closure = null; - foreach ($this->parameter_list as $i => $parameter) { - if ($i === $skip_index) { - continue; - } - $closure_for_type = $parameter->getUnionType()->getTemplateTypeExtractorClosure($code_base, $template_type); - if (!$closure_for_type) { - continue; - } - $closure = TemplateType::combineParameterClosures( - $closure, - /** - * @param array<int,Node|UnionType|mixed> $parameters - */ - static function (array $parameters, Context $context) use ($code_base, $i, $closure_for_type) : UnionType { - $param_value = $parameters[$i] ?? null; - if ($param_value !== null) { - if ($param_value instanceof UnionType) { - // This helper method has two callers - one passes in an array of union types, another passes in the raw nodes. - $param_type = $param_value; - } else { - $param_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $param_value); - } - return $closure_for_type($param_type, $context); - } - return UnionType::empty(); - } - ); - } - return $closure; - } - - /** - * Returns the index of the parameter with name $name. - * @return ?int - */ - public function getParamIndexForName(string $name) - { - foreach ($this->getParameterList() as $i => $param) { - if ($param->getName() === $name) { - return $i; - } - } - return null; - } - - /** - * Adds a plugin that will ensure postconditions in the comments take effect. - * This adds closures the same way getAnalyzeFunctionCallClosures in a plugin would. - * - * @param array<string, Assertion> $param_assertion_map - * @return ?Closure(CodeBase, Context, FunctionInterface, array):void - * @internal - */ - private function getPluginForParamAssertionMap(CodeBase $code_base, array $param_assertion_map) - { - $closure = null; - foreach ($param_assertion_map as $param_name => $assertion) { - $i = $this->getParamIndexForName($param_name); - if ($i === null) { - Issue::maybeEmit( - $code_base, - $this->getContext(), - Issue::CommentParamAssertionWithoutRealParam, - $this->getContext()->getLineNumberStart(), - $param_name, - $this->getNameForIssue() - ); - continue; - } - $new_closure = $this->createClosureForAssertion($code_base, $assertion, $i); - if ($new_closure) { - $closure = ConfigPluginSet::mergeAnalyzeFunctionCallClosures($new_closure, $closure); - } - } - return $closure; - } - - /** - * @param int $i the index of the parameter which $assertion acts upon. - * @return ?Closure(CodeBase, Context, FunctionInterface, array):void - * @suppress PhanAccessPropertyInternal - * @internal - */ - public function createClosureForAssertion(CodeBase $code_base, Assertion $assertion, int $i) - { - $union_type = $assertion->union_type; - if ($union_type->hasTemplateTypeRecursive()) { - $union_type_extractor = $this->makeAssertionUnionTypeExtractor($code_base, $union_type, $i); - if (!$union_type_extractor) { - return; - } - } else { - /** - * @param array<int,Node|mixed> $unused_args - */ - $union_type_extractor = static function (CodeBase $unused_code_base, Context $unused_context, array $unused_args) use ($union_type) : UnionType { - return $union_type; - }; - } - return self::createClosureForUnionTypeExtractorAndAssertionType($union_type_extractor, $assertion->assertion_type, $i); - } - - /** - * @internal - * @suppress PhanAccessClassConstantInternal - * @param Closure(CodeBase, Context, array):UnionType $union_type_extractor - * @return ?Closure(CodeBase, Context, FunctionInterface, array):void - */ - public static function createClosureForUnionTypeExtractorAndAssertionType(Closure $union_type_extractor, int $assertion_type, int $i) - { - switch ($assertion_type) { - case Assertion::IS_OF_TYPE: - /** - * @param array<int,Node|mixed> $args - */ - return static function (CodeBase $code_base, Context $context, FunctionInterface $unused_function, array $args) use ($i, $union_type_extractor) { - $arg = $args[$i] ?? null; - if (!($arg instanceof Node)) { - return; - } - $union_type = $union_type_extractor($code_base, $context, $args); - $new_context = ConditionVisitor::updateToHaveType($code_base, $context, $arg, $union_type); - // NOTE: This is hackish. This modifies the passed in context's scope. - $context->setScope($new_context->getScope()); - }; - case Assertion::IS_NOT_OF_TYPE: - /** - * @param array<int,Node|mixed> $args - */ - return static function (CodeBase $code_base, Context $context, FunctionInterface $unused_function, array $args) use ($i, $union_type_extractor) { - $arg = $args[$i] ?? null; - if (!($arg instanceof Node)) { - return; - } - $union_type = $union_type_extractor($code_base, $context, $args); - $new_context = ConditionVisitor::updateToNotHaveType($code_base, $context, $arg, $union_type); - // NOTE: This is hackish. This modifies the passed in context's scope. - $context->setScope($new_context->getScope()); - }; - case Assertion::IS_TRUE: - /** - * @param array<int,Node|mixed> $args - */ - return static function (CodeBase $code_base, Context $context, FunctionInterface $unused_function, array $args) use ($i) { - $arg = $args[$i] ?? null; - if (!($arg instanceof Node)) { - return; - } - $new_context = (new ConditionVisitor($code_base, $context))->__invoke($arg); - // NOTE: This is hackish. This modifies the passed in context's scope. - $context->setScope($new_context->getScope()); - }; - case Assertion::IS_FALSE: - /** - * @param array<int,Node|mixed> $args - */ - return static function (CodeBase $code_base, Context $context, FunctionInterface $unused_function, array $args) use ($i) { - $arg = $args[$i] ?? null; - if (!($arg instanceof Node)) { - return; - } - $new_context = (new NegatedConditionVisitor($code_base, $context))->__invoke($arg); - // NOTE: This is hackish. This modifies the passed in context's scope. - $context->setScope($new_context->getScope()); - }; - } - // TODO: Support and test combining these closures - return null; - } - - /** - * Creates a closure that can extract real types from template types used in (at)phan-assert. - * - * @return ?Closure(CodeBase, Context, array):UnionType - */ - private function makeAssertionUnionTypeExtractor(CodeBase $code_base, UnionType $type, int $asserted_param_index) - { - $comment = $this->getComment(); - if (!$comment) { - return null; - } - $parameter_extractor_map = []; - foreach ($comment->getTemplateTypeList() as $template_type) { - if (!$type->usesTemplateType($template_type)) { - continue; - } - $param_closure = $this->getTemplateTypeExtractorClosure($code_base, $template_type, $asserted_param_index); - if (!$param_closure) { - // TODO: Warn - return null; - } - $parameter_extractor_map[$template_type->getName()] = $param_closure; - } - if (!$parameter_extractor_map) { - return null; - } - /** - * @param array<int,Node|mixed> $args - */ - return static function (CodeBase $unused_code_base, Context $context, array $args) use ($type, $parameter_extractor_map) : UnionType { - $template_type_map = []; - foreach ($parameter_extractor_map as $template_type_name => $closure) { - $template_type_map[$template_type_name] = $closure($args, $context); - } - return $type->withTemplateParameterTypeMap($template_type_map); - }; - } - - /** - * Create any plugins that exist due to doc comment annotations. - * Must be called after adding this FunctionInterface to the $code_base, so that issues can be emitted if needed. - * @return ?Closure(CodeBase, Context, array):UnionType - * @internal - * @suppress PhanUnreferencedPublicMethod referenced in FunctionTrait - */ - public function getCommentParamAssertionClosure(CodeBase $code_base) - { - $comment = $this->getComment(); - if (!$comment) { - return null; - } - $param_assertion_map = $comment->getParamAssertionMap(); - if ($param_assertion_map) { - return $this->getPluginForParamAssertionMap($code_base, $param_assertion_map); - } - return null; - } - - /** - * Returns stub text for the phpdoc parameters that can be used in markdown - */ - protected function getParameterStubText() : string - { - return \implode(', ', \array_map(function (Parameter $parameter) : string { - return $parameter->toStubString($this->isPHPInternal()); - }, $this->getParameterList())); - } - - /** - * Returns stub text for the real parameters that can be used in `tool/make_stubs` - */ - protected function getRealParameterStubText() : string - { - return \implode(', ', \array_map(static function (Parameter $parameter) : string { - return $parameter->toStubString(); - }, $this->getRealParameterList())); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/GlobalConstant.php b/vendor/phan/phan/src/Phan/Language/Element/GlobalConstant.php deleted file mode 100644 index fc3bfe5..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/GlobalConstant.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use InvalidArgumentException; -use Phan\AST\ASTReverter; -use Phan\Exception\FQSENException; -use Phan\Language\Context; -use Phan\Language\FQSEN\FullyQualifiedGlobalConstantName; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * Phan's representation of a global constant - */ -class GlobalConstant extends AddressableElement implements ConstantInterface -{ - use ConstantTrait; - - /** - * Override the default getter to fill in a future - * union type if available. - * - * @return UnionType - */ - public function getUnionType() : UnionType - { - if (null !== ($union_type = $this->getFutureUnionType())) { - $this->setUnionType(parent::getUnionType()->withUnionType($union_type)); - } - - return parent::getUnionType(); - } - - /** - * @return FullyQualifiedGlobalConstantName - * The fully-qualified structural element name of this - * structural element - */ - public function getFQSEN() : FullyQualifiedGlobalConstantName - { - return $this->fqsen; - } - - /** - * @param string $name - * The name of a builtin constant to build a new GlobalConstant structural - * element from. - * - * @return GlobalConstant - * A GlobalConstant structural element representing the given named - * builtin constant. - * - * @throws InvalidArgumentException - * If reflection could not locate the builtin constant. - * - * @throws FQSENException - * If a module declares an invalid constant FQSEN - */ - public static function fromGlobalConstantName( - string $name - ) : GlobalConstant { - if (!\defined($name)) { - throw new InvalidArgumentException(\sprintf("This should not happen, defined(%s) is false, but the constant was returned by get_defined_constants()", \var_export($name, true))); - } - $value = \constant($name); - $constant_fqsen = FullyQualifiedGlobalConstantName::fromFullyQualifiedString( - '\\' . $name - ); - $result = new self( - new Context(), - $name, - Type::fromObject($value)->asUnionType(), - 0, - $constant_fqsen - ); - $result->setNodeForValue($value); - return $result; - } - - /** - * Returns a standalone stub of PHP code for this global constant. - * @suppress PhanUnreferencedPublicMethod toStubInfo is used by callers instead - */ - public function toStub() : string - { - list($namespace, $string) = $this->toStubInfo(); - $namespace_text = $namespace === '' ? '' : "$namespace "; - $string = \sprintf("namespace %s{\n%s}\n", $namespace_text, $string); - return $string; - } - - public function getMarkupDescription() : string - { - $string = 'const ' . $this->getName() . ' = '; - $value_node = $this->getNodeForValue(); - $string .= ASTReverter::toShortString($value_node); - return $string; - } - - /** @return array{0:string,1:string} [string $namespace, string $text] */ - public function toStubInfo() : array - { - $fqsen = (string)$this->getFQSEN(); - $pos = \strrpos($fqsen, '\\'); - if ($pos !== false) { - $name = (string)\substr($fqsen, $pos + 1); - } else { - $name = $fqsen; - } - - $is_defined = \defined($fqsen); - if ($is_defined) { - $repr = \var_export(\constant($fqsen), true); - $comment = ''; - } else { - $repr = 'null'; - $comment = ' // could not find'; - } - $namespace = \ltrim($this->getFQSEN()->getNamespace(), '\\'); - if (\preg_match('@^[a-zA-Z_\x7f-\xff\\\][a-zA-Z0-9_\x7f-\xff\\\]*$@', $name)) { - $string = "const $name = $repr;$comment\n"; - } else { - // Internal extension defined a constant with an invalid identifier. - $string = \sprintf("define(%s, %s);%s\n", \var_export($name, true), $repr, $comment); - } - return [$namespace, $string]; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/MarkupDescription.php b/vendor/phan/phan/src/Phan/Language/Element/MarkupDescription.php deleted file mode 100644 index 78572f3..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/MarkupDescription.php +++ /dev/null @@ -1,498 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Exception; -use Phan\CodeBase; -use Phan\Language\Element\Comment\Builder; -use Phan\Language\UnionType; - -use function count; - -/** - * APIs for generating markup (markdown) description of elements - * - * This is used by the language server to send markup to the language client (e.g. for hover text of an element). - */ -class MarkupDescription -{ - /** - * Generates a markup snippet with a description of the declaration of $element, - * and its doc comment summary and description. - */ - public static function buildForElement( - AddressableElementInterface $element, - CodeBase $code_base - ) : string { - // TODO: Use the doc comments of the ancestors if unavailable or if (at)inheritDoc is used. - $markup = $element->getMarkupDescription(); - $result = "```php\n$markup\n```"; - $extracted_doc_comment = self::extractDescriptionFromDocCommentOrAncestor($element, $code_base); - if ($extracted_doc_comment) { - $result .= "\n\n" . $extracted_doc_comment; - } - - return $result; - } - - /** - * @template T - * @param array<string,T> $signatures - * @return array<string,T> - */ - private static function signaturesToLower(array $signatures) : array - { - $result = []; - foreach ($signatures as $fqsen => $summary) { - $result[\strtolower($fqsen)] = $summary; - } - return $result; - } - - /** - * Eagerly load all of the hover signatures into memory before potentially forking. - * - * @return void - */ - public static function eagerlyLoadAllDescriptionMaps() - { - if (!\extension_loaded('pcntl')) { - // There's no forking, so descriptions will always be available after the first time they're loaded. - // No need to force phan to load these prior to forking. - return; - } - self::loadClassDescriptionMap(); - self::loadConstantDescriptionMap(); - self::loadFunctionDescriptionMap(); - self::loadPropertyDescriptionMap(); - } - - /** - * @return array<string,string> mapping lowercase function/method FQSENs to short summaries. - * @internal - The data format may change - */ - public static function loadFunctionDescriptionMap() : array - { - static $descriptions = null; - if (\is_array($descriptions)) { - return $descriptions; - } - return $descriptions = self::signaturesToLower(require(\dirname(__DIR__) . '/Internal/FunctionDocumentationMap.php')); - } - - /** - * @return array<string,string> mapping lowercase constant/class constant FQSENs to short summaries. - * @internal - The data format may change - */ - public static function loadConstantDescriptionMap() : array - { - static $descriptions = null; - if (\is_array($descriptions)) { - return $descriptions; - } - return $descriptions = self::signaturesToLower(require(\dirname(__DIR__) . '/Internal/ConstantDocumentationMap.php')); - } - - /** - * @return array<string,string> mapping class FQSENs to short summaries. - * @internal - The data format may change - */ - public static function loadClassDescriptionMap() : array - { - static $descriptions = null; - if (\is_array($descriptions)) { - return $descriptions; - } - return $descriptions = self::signaturesToLower(require(\dirname(__DIR__) . '/Internal/ClassDocumentationMap.php')); - } - - /** - * @return array<string,string> mapping property FQSENs to short summaries. - * @internal - The data format may change - */ - public static function loadPropertyDescriptionMap() : array - { - static $descriptions = null; - if (\is_array($descriptions)) { - return $descriptions; - } - return $descriptions = self::signaturesToLower(require(\dirname(__DIR__) . '/Internal/PropertyDocumentationMap.php')); - } - - /** - * Extracts a plaintext description of the element from the doc comment of an element or its ancestor. - * (or from FunctionDocumentationMap.php) - * - * @param array<string,true> $checked_class_fqsens - * - * @return ?string - */ - public static function extractDescriptionFromDocCommentOrAncestor( - AddressableElementInterface $element, - CodeBase $code_base, - array &$checked_class_fqsens = [] - ) { - $extracted_doc_comment = self::extractDescriptionFromDocComment($element, $code_base); - if ($extracted_doc_comment) { - return $extracted_doc_comment; - } - if ($element instanceof ClassElement) { - try { - $fqsen_string = $element->getClassFQSEN()->__toString(); - if (isset($checked_class_fqsens[$fqsen_string])) { - // We already checked this and either succeeded or returned null - return null; - } - $checked_class_fqsens[$fqsen_string] = true; - return self::extractDescriptionFromDocCommentOfAncestorOfClassElement($element, $code_base); - } catch (Exception $_) { - // ignore - } - } - return null; - } - - /** - * @param array<string,true> $checked_class_fqsens - * @return ?string - */ - private static function extractDescriptionFromDocCommentOfAncestorOfClassElement( - ClassElement $element, - CodeBase $code_base, - array &$checked_class_fqsens = [] - ) { - if (!$element->getIsOverride() && $element->getRealDefiningFQSEN() === $element->getFQSEN()) { - return null; - } - $class_fqsen = $element->getDefiningClassFQSEN(); - $class = $code_base->getClassByFQSEN($class_fqsen); - foreach ($class->getAncestorFQSENList() as $ancestor_fqsen) { - $ancestor_element = Clazz::getAncestorElement($code_base, $ancestor_fqsen, $element); - if (!$ancestor_element) { - continue; - } - - $extracted_doc_comment = self::extractDescriptionFromDocCommentOrAncestor($ancestor_element, $code_base, $checked_class_fqsens); - if ($extracted_doc_comment) { - return $extracted_doc_comment; - } - $extracted_doc_comment = self::extractDescriptionFromDocCommentOfAncestorOfClassElement($ancestor_element, $code_base, $checked_class_fqsens); - } - } - - /** - * Extracts a plaintext description of the element from the doc comment of an element. - * (or from FunctionDocumentationMap.php) - * - * @return ?string - */ - public static function extractDescriptionFromDocComment( - AddressableElementInterface $element, - CodeBase $code_base = null - ) { - $extracted_doc_comment = self::extractDescriptionFromDocCommentRaw($element); - if ($extracted_doc_comment) { - return $extracted_doc_comment; - } - - // This is an element internal to PHP. - if ($element->isPHPInternal()) { - if ($element instanceof FunctionInterface) { - // This is a function/method - Use Phan's FunctionDocumentationMap.php to try to load a markup description. - if ($element instanceof Method) { - $fqsen = $element->getDefiningFQSEN(); - } else { - $fqsen = $element->getFQSEN(); - } - $key = \strtolower(\ltrim((string)$fqsen, '\\')); - $result = self::loadFunctionDescriptionMap()[$key] ?? null; - if ($result) { - return $result; - } - if ($code_base && $element instanceof Method) { - try { - if (\strtolower($element->getName()) === '__construct') { - $class = $element->getClass($code_base); - $class_description = self::extractDescriptionFromDocComment($class, $code_base); - if ($class_description) { - return "Construct an instance of `{$class->getFQSEN()}`.\n\n$class_description"; - } - } - } catch (Exception $_) { - } - } - } elseif ($element instanceof ConstantInterface) { - // This is a class or global constant - Use Phan's ConstantDocumentationMap.php to try to load a markup description. - if ($element instanceof ClassConstant) { - $fqsen = $element->getDefiningFQSEN(); - } else { - $fqsen = $element->getFQSEN(); - } - $key = \strtolower(\ltrim((string)$fqsen, '\\')); - return self::loadConstantDescriptionMap()[$key] ?? null; - } elseif ($element instanceof Clazz) { - $key = \strtolower(\ltrim((string)$element->getFQSEN(), '\\')); - return self::loadClassDescriptionMap()[$key] ?? null; - } elseif ($element instanceof Property) { - $key = \strtolower(\ltrim((string)$element->getDefiningFQSEN(), '\\')); - return self::loadPropertyDescriptionMap()[$key] ?? null; - } - } - return null; - } - - /** - * @return ?string - */ - private static function extractDescriptionFromDocCommentRaw(AddressableElementInterface $element) - { - $doc_comment = $element->getDocComment(); - if (!$doc_comment) { - return null; - } - $comment_category = null; - if ($element instanceof Property) { - $comment_category = Comment::ON_PROPERTY; - } elseif ($element instanceof ConstantInterface) { - $comment_category = Comment::ON_CONST; - } elseif ($element instanceof FunctionInterface) { - $comment_category = Comment::ON_FUNCTION; - } - $extracted_doc_comment = self::extractDocComment($doc_comment, $comment_category, $element->getUnionType()); - return $extracted_doc_comment ?: null; - } - - /** - * @return array<string,string> information about the param tags - */ - public static function extractParamTagsFromDocComment(AddressableElementInterface $element, bool $with_param_details = true) : array - { - $doc_comment = $element->getDocComment(); - if (!$doc_comment) { - return []; - } - if (\strpos($doc_comment, '@param') === false) { - return []; - } - // Trim the start and the end of the doc comment. - // - // We leave in the second `*` of `/**` so that every single non-empty line - // of a typical doc comment will begin with a `*` - $doc_comment = \preg_replace('@(^/\*)|(\*/$)@', '', $doc_comment); - - $results = []; - $lines = \explode("\n", $doc_comment); - foreach ($lines as $i => $line) { - $line = self::trimLine($line); - if (\preg_match('/^\s*@param(\s|$)/', $line) > 0) { - // Extract all of the (at)param annotations. - $param_tag_summary = self::extractTagSummary($lines, $i); - if (\end($param_tag_summary) === '') { - \array_pop($param_tag_summary); - } - $full_comment = \implode("\n", self::trimLeadingWhitespace($param_tag_summary)); - // @phan-suppress-next-line PhanAccessClassConstantInternal - $matched = \preg_match(Builder::PARAM_COMMENT_REGEX, $full_comment, $match); - if (!$matched) { - continue; - } - if (!isset($match[17])) { - continue; - } - - $name = $match[17]; - if ($with_param_details) { - // Keep the param details and put them in a markdown quote - // @phan-suppress-next-line PhanAccessClassConstantInternal - $full_comment = \preg_replace(Builder::PARAM_COMMENT_REGEX, '`\0`', $full_comment); - } else { - // Drop the param details - // @phan-suppress-next-line PhanAccessClassConstantInternal - $full_comment = \trim(\preg_replace(Builder::PARAM_COMMENT_REGEX, '', $full_comment)); - } - $results[$name] = $full_comment; - } - } - return $results; - } - - /** - * Returns a doc comment with: - * - * - leading `/**` and trailing `*\/` removed - * - leading/trailing space on lines removed, - * - blank lines removed from the beginning and end. - * - * @return string simplified version of the doc comment, with leading `*` on lines preserved. - */ - public static function getDocCommentWithoutWhitespace(string $doc_comment) : string - { - // Trim the start and the end of the doc comment. - // - // We leave in the second `*` of `/**` so that every single non-empty line - // of a typical doc comment will begin with a `*` - $doc_comment = \preg_replace('@(^/\*)|(\*/$)@', '', $doc_comment); - - $lines = \explode("\n", $doc_comment); - $lines = \array_map('trim', $lines); - $lines = MarkupDescription::trimLeadingWhitespace($lines); - while (\in_array(\end($lines), ['*', ''], true)) { - \array_pop($lines); - } - while (\in_array(\reset($lines), ['*', ''], true)) { - \array_shift($lines); - } - return \implode("\n", $lines); - } - - /** - * Returns a markup string with the extracted description of this element (known to be a comment of an element with type $comment_category). - * On success, this is a non-empty string. - * - * @return string markup string - * @internal - */ - public static function extractDocComment(string $doc_comment, int $comment_category = null, UnionType $element_type = null) : string - { - // Trim the start and the end of the doc comment. - // - // We leave in the second `*` of `/**` so that every single non-empty line - // of a typical doc comment will begin with a `*` - $doc_comment = \preg_replace('@(^/\*)|(\*/$)@', '', $doc_comment); - - $results = []; - $lines = \explode("\n", $doc_comment); - $saw_phpdoc_tag = false; - $did_build_from_phpdoc_tag = false; - - foreach ($lines as $i => $line) { - $line = self::trimLine($line); - if (\preg_match('/^\s*@/', $line) > 0) { - $saw_phpdoc_tag = true; - if (count($results) === 0) { - // Special cases: - if (\in_array($comment_category, [Comment::ON_PROPERTY, Comment::ON_CONST])) { - // Treat `@var T description of T` as a valid single-line comment of constants and properties. - // Variables don't currently have associated comments - if (\preg_match('/^\s*@var\s/', $line) > 0) { - $new_lines = self::extractTagSummary($lines, $i); - if (isset($new_lines[0])) { - $did_build_from_phpdoc_tag = true; - // @phan-suppress-next-line PhanAccessClassConstantInternal - $new_lines[0] = \preg_replace(Builder::PARAM_COMMENT_REGEX, '`\0`', $new_lines[0]); - } - $results = \array_merge($results, $new_lines); - } - } elseif (\in_array($comment_category, Comment::FUNCTION_LIKE)) { - // Treat `@return T description of return value` as a valid single-line comment of closures, functions, and methods. - // Variables don't currently have associated comments - if (\preg_match('/^\s*@return(\s|$)/', $line) > 0) { - $new_lines = self::extractTagSummary($lines, $i); - if (isset($new_lines[0])) { - // @phan-suppress-next-line PhanAccessClassConstantInternal - $new_lines[0] = \preg_replace(Builder::RETURN_COMMENT_REGEX, '`\0`', $new_lines[0]); - } - $results = \array_merge($results, $new_lines); - } - } - } - } - if ($saw_phpdoc_tag) { - continue; - } - if (\trim($line) === '') { - $line = ''; - if (\in_array(\end($results), ['', false], true)) { - continue; - } - } - $results[] = $line; - } - if (\end($results) === '') { - \array_pop($results); - } - $results = self::trimLeadingWhitespace($results); - $str = \implode("\n", $results); - if ($comment_category === Comment::ON_PROPERTY && !$did_build_from_phpdoc_tag) { - if ($element_type && !$element_type->isEmpty()) { - $str = \trim("`@var $element_type` $str"); - } - } - return $str; - } - - private static function trimLine(string $line) : string - { - $line = \rtrim($line); - $pos = \stripos($line, '*'); - if ($pos !== false) { - return (string)\substr($line, $pos + 1); - } else { - return \ltrim($line, "\n\t "); - } - } - - /** - * @param array<int,string> $lines - * @param int $i the offset of the tag in $lines - * @return array<int,string> the trimmed lines - * @internal - */ - public static function extractTagSummary(array $lines, int $i): array - { - $summary = []; - $summary[] = self::trimLine($lines[$i]); - for ($j = $i + 1; $j < count($lines); $j++) { - $line = self::trimLine($lines[$j]); - if (\preg_match('/^\s*\{?@/', $line)) { - // Break on other annotations such as (at)internal, {(at)inheritDoc}, etc. - break; - } - if ($line === '' && \end($summary) === '') { - continue; - } - $summary[] = $line; - } - if (\end($summary) === '') { - \array_pop($summary); - } - if (count($summary) === 1 && count(\preg_split('/\s+/', \trim($summary[0]))) <= 2) { - // For something uninformative such as "* (at)return int" (and nothing else), - // don't treat it as a summary. - // - // The caller would already show the return type - return []; - } - return $summary; - } - - /** - * @param array<int,string> $lines - * @return array<int,string> - */ - private static function trimLeadingWhitespace(array $lines) : array - { - if (count($lines) === 0) { - return []; - } - $min_whitespace = \PHP_INT_MAX; - foreach ($lines as $line) { - if ($line === '') { - continue; - } - $min_whitespace = \min($min_whitespace, \strspn($line, ' ', 0, $min_whitespace)); - if ($min_whitespace === 0) { - return $lines; - } - } - if ($min_whitespace > 0) { - foreach ($lines as $i => $line) { - if ($line === '') { - continue; - } - $lines[$i] = (string)\substr($line, $min_whitespace); - } - } - return $lines; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Method.php b/vendor/phan/phan/src/Phan/Language/Element/Method.php deleted file mode 100644 index 88a2bec..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Method.php +++ /dev/null @@ -1,938 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -// Note: This file uses both class Phan\Language\Element\Flags and namespace ast\flags -use ast; -use ast\Node; -use Phan\Analysis\Analyzable; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\CodeBaseException; -use Phan\Language\Context; -use Phan\Language\ElementContext; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\Scope\FunctionLikeScope; -use Phan\Language\Type\GenericArrayType; -use Phan\Language\UnionType; -use Phan\Memoize; - -/** - * Phan's representation of a class's method. - * - * @phan-file-suppress PhanPartialTypeMismatchArgument - * @method FullyQualifiedMethodName getDefiningFQSEN() @phan-suppress-current-line PhanParamSignaturePHPDocMismatchReturnType - */ -class Method extends ClassElement implements FunctionInterface -{ - use Analyzable; - use Memoize; - use FunctionTrait; - use ClosedScopeElement; - - /** - * @var ?FullyQualifiedMethodName If this was originally defined in a trait, this is the trait's defining fqsen. - * This is tracked separately from getDefiningFQSEN() in order to not break access checks on protected/private methods. - * Used for dead code detection. - */ - private $real_defining_fqsen; - - /** - * @var ?Method The defining method, if this method was inherited. - * This is only set if this is needed to recursively infer method types - do not use this. - * - * This may become out of date in language server mode. - */ - private $defining_method_for_type_fetching; - - /** - * @param Context $context - * The context in which the structural element lives - * - * @param string $name - * The name of the typed structural element - * - * @param UnionType $type - * A '|' delimited set of types satisfied by this - * typed structural element. - * - * @param int $flags - * The flags property contains node specific flags. It is - * always defined, but for most nodes it is always zero. - * ast\kind_uses_flags() can be used to determine whether - * a certain kind has a meaningful flags value. - * - * @param FullyQualifiedMethodName $fqsen - * A fully qualified name for the element - * - * @param ?array<int,Parameter> $parameter_list - * A list of parameters to set on this method - */ - public function __construct( - Context $context, - string $name, - UnionType $type, - int $flags, - FullyQualifiedMethodName $fqsen, - $parameter_list - ) { - $internal_scope = new FunctionLikeScope( - $context->getScope(), - $fqsen - ); - $context = $context->withScope($internal_scope); - if ($type->hasTemplateType()) { - $this->recordHasTemplateType(); - } - parent::__construct( - $context, - FullyQualifiedMethodName::canonicalName($name), - $type, - $flags, - $fqsen - ); - - // Presume that this is the original definition - // of this method, and let it be overwritten - // if it isn't. - $this->setDefiningFQSEN($fqsen); - $this->real_defining_fqsen = $fqsen; - - // Record the FQSEN of this method (With the current Clazz), - // to prevent recursing from a method into itself in non-quick mode. - $this->setInternalScope($internal_scope); - - if ($parameter_list !== null) { - $this->setParameterList($parameter_list); - } - $this->checkForTemplateTypes(); - } - - /** - * Sets hasTemplateType to true if it finds any template types in the parameters or methods - * @return void - */ - public function checkForTemplateTypes() - { - if ($this->getUnionType()->hasTemplateTypeRecursive()) { - $this->recordHasTemplateType(); - return; - } - foreach ($this->parameter_list as $parameter) { - if ($parameter->getUnionType()->hasTemplateTypeRecursive()) { - $this->recordHasTemplateType(); - return; - } - } - } - - /** - * @return bool - * True if this is a magic phpdoc method (declared via (at)method on class declaration phpdoc) - */ - public function isFromPHPDoc() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_FROM_PHPDOC); - } - - /** - * Sets whether this is a magic phpdoc method (declared via (at)method on class declaration phpdoc) - * @param bool $from_phpdoc - True if this is a magic phpdoc method - * @return void - */ - public function setIsFromPHPDoc(bool $from_phpdoc) - { - $this->setPhanFlags( - Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_FROM_PHPDOC, - $from_phpdoc - ) - ); - } - - /** - * @return bool - * True if this method is intended to be an override of another method (contains (at)override) - */ - public function isOverrideIntended() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_OVERRIDE_INTENDED); - } - - /** - * Sets whether this method is intended to be an override of another method (contains (at)override) - * @param bool $is_override_intended - - * @return void - */ - public function setIsOverrideIntended(bool $is_override_intended) - { - $this->setPhanFlags( - Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_OVERRIDE_INTENDED, - $is_override_intended - ) - ); - } - - /** - * @return bool - * True if this element is overridden by at least one other element - */ - public function getIsOverriddenByAnother() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_OVERRIDDEN_BY_ANOTHER); - } - - /** - * Sets whether this method is overridden by another method - * - * @param bool $is_overridden_by_another - * True if this method is overridden by another method - * - * @return void - */ - public function setIsOverriddenByAnother(bool $is_overridden_by_another) - { - $this->setPhanFlags(Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_OVERRIDDEN_BY_ANOTHER, - $is_overridden_by_another - )); - } - - /** - * @return bool - * True if this is an abstract method - */ - public function isAbstract() : bool - { - return $this->getFlagsHasState(ast\flags\MODIFIER_ABSTRACT); - } - - /** - * @return bool - * True if this is a final method - */ - public function isFinal() : bool - { - return $this->getFlagsHasState(ast\flags\MODIFIER_FINAL); - } - - /** - * @return bool - * True if this should be analyzed as if it is a final method - */ - public function isEffectivelyFinal() : bool - { - if ($this->isFinal()) { - return true; - } - return Config::getValue('assume_no_external_class_overrides') - && !$this->getIsOverriddenByAnother() - && !$this->isAbstract(); - } - - /** - * @return bool - * True if this method returns a reference - */ - public function returnsRef() : bool - { - return $this->getFlagsHasState(ast\flags\FUNC_RETURNS_REF); - } - - /** - * @return bool - * True if this is a magic method - * (Names are all normalized in FullyQualifiedMethodName::make()) - */ - public function getIsMagic() : bool - { - return \array_key_exists($this->getName(), FullyQualifiedMethodName::MAGIC_METHOD_NAME_SET); - } - - /** - * @return bool - * True if this is a magic method which should have return type of void - * (Names are all normalized in FullyQualifiedMethodName::make()) - */ - public function getIsMagicAndVoid() : bool - { - return \array_key_exists($this->getName(), FullyQualifiedMethodName::MAGIC_VOID_METHOD_NAME_SET); - } - - /** - * @return bool - * True if this is the `__construct` method - * (Does not return true for php4 constructors) - */ - public function getIsNewConstructor() : bool - { - return ($this->getName() === '__construct'); - } - - /** - * @return bool - * True if this is the magic `__call` method - */ - public function getIsMagicCall() : bool - { - return ($this->getName() === '__call'); - } - - /** - * @return bool - * True if this is the magic `__callStatic` method - */ - public function getIsMagicCallStatic() : bool - { - return ($this->getName() === '__callStatic'); - } - - /** - * @return Method - * A default constructor for the given class - */ - public static function defaultConstructorForClass( - Clazz $clazz, - CodeBase $code_base - ) : Method { - if ($clazz->getFQSEN()->getNamespace() === '\\' && $clazz->hasMethodWithName($code_base, $clazz->getName())) { - $old_style_constructor = $clazz->getMethodByName($code_base, $clazz->getName()); - } else { - $old_style_constructor = null; - } - - $method_fqsen = FullyQualifiedMethodName::make( - $clazz->getFQSEN(), - '__construct' - ); - - $method = new Method( - $old_style_constructor ? $old_style_constructor->getContext() : $clazz->getContext(), - '__construct', - $clazz->getUnionType(), - 0, - $method_fqsen, - $old_style_constructor ? $old_style_constructor->getParameterList() : null - ); - - if ($old_style_constructor) { - $method->setRealParameterList($old_style_constructor->getRealParameterList()); - $method->setNumberOfRequiredParameters($old_style_constructor->getNumberOfRequiredParameters()); - $method->setNumberOfOptionalParameters($old_style_constructor->getNumberOfOptionalParameters()); - $method->setRealReturnType($old_style_constructor->getRealReturnType()); - $method->setUnionType($old_style_constructor->getUnionType()); - } - - return $method; - } - - /** - * @param Clazz $clazz - The class to treat as the defining class of the alias. (i.e. the inheriting class) - * @param string $alias_method_name - The alias method name. - * @param int $new_visibility_flags (0 if unchanged) - * @return Method - * - * An alias from a trait use, which is treated as though it was defined in $clazz - * E.g. if you import a trait's method as private/protected, it becomes private/protected **to the class which used the trait** - * - * The resulting alias doesn't inherit the Node of the method body, so aliases won't have a redundant analysis step. - */ - public function createUseAlias( - Clazz $clazz, - string $alias_method_name, - int $new_visibility_flags - ) : Method { - - $method_fqsen = FullyQualifiedMethodName::make( - $clazz->getFQSEN(), - $alias_method_name - ); - - $method = new Method( - $this->getContext(), - $alias_method_name, - $this->getUnionTypeWithUnmodifiedStatic(), - $this->getFlags(), - $method_fqsen, - $this->getParameterList() - ); - $method->setPhanFlags($this->getPhanFlags()); - switch ($new_visibility_flags) { - case ast\flags\MODIFIER_PUBLIC: - case ast\flags\MODIFIER_PROTECTED: - case ast\flags\MODIFIER_PRIVATE: - // Replace the visibility with the new visibility. - $method->setFlags(Flags::bitVectorWithState( - Flags::bitVectorWithState( - $method->getFlags(), - ast\flags\MODIFIER_PUBLIC | ast\flags\MODIFIER_PROTECTED | ast\flags\MODIFIER_PRIVATE, - false - ), - $new_visibility_flags, - true - )); - break; - default: - break; - } - - $defining_fqsen = $this->getDefiningFQSEN(); - if ($method->isPublic()) { - $method->setDefiningFQSEN($defining_fqsen); - } - $method->real_defining_fqsen = $defining_fqsen; - - $method->setRealParameterList($this->getRealParameterList()); - $method->setRealReturnType($this->getRealReturnType()); - $method->setNumberOfRequiredParameters($this->getNumberOfRequiredParameters()); - $method->setNumberOfOptionalParameters($this->getNumberOfOptionalParameters()); - // Copy the comment so that features such as templates will work - $method->comment = $this->comment; - - return $method; - } - - /** - * @param Context $context - * The context in which the node appears - * - * @param CodeBase $code_base - * - * @param Node $node - * An AST node representing a method - * - * @return Method - * A Method representing the AST node in the - * given context - */ - public static function fromNode( - Context $context, - CodeBase $code_base, - Node $node, - FullyQualifiedMethodName $fqsen - ) : Method { - - // Create the skeleton method object from what - // we know so far - $method = new Method( - $context, - (string)$node->children['name'], - UnionType::empty(), - $node->flags ?? 0, - $fqsen, - null - ); - $doc_comment = $node->children['docComment'] ?? ''; - $method->setDocComment($doc_comment); - - // Parse the comment above the method to get - // extra meta information about the method. - $comment = Comment::fromStringInContext( - $doc_comment, - $code_base, - $context, - $node->lineno ?? 0, - Comment::ON_METHOD - ); - - // Defer adding params to the local scope for user functions. (FunctionTrait::addParamsToScopeOfFunctionOrMethod) - // See PostOrderAnalysisVisitor->analyzeCallToMethod - $method->setComment($comment); - - $element_context = new ElementContext($method); - // @var array<int,Parameter> - // The list of parameters specified on the - // method - $parameter_list = Parameter::listFromNode( - $element_context, - $code_base, - $node->children['params'] - ); - $method->setParameterList($parameter_list); - foreach ($parameter_list as $parameter) { - if ($parameter->getUnionType()->hasTemplateTypeRecursive()) { - $method->recordHasTemplateType(); - break; - } - } - - // Add each parameter to the scope of the function - // NOTE: it's important to clone this, - // because we don't want any assignments to modify the original Parameter - foreach ($parameter_list as $parameter) { - $method->getInternalScope()->addVariable( - $parameter->cloneAsNonVariadic() - ); - } - foreach ($comment->getTemplateTypeList() as $template_type) { - $method->getInternalScope()->addTemplateType($template_type); - } - - if (!$method->isPHPInternal()) { - // If the method is Analyzable, set the node so that - // we can come back to it whenever we like and - // rescan it - $method->setNode($node); - } - - // Keep an copy of the original parameter list, to check for fatal errors later on. - $method->setRealParameterList($parameter_list); - - $method->setNumberOfRequiredParameters(\array_reduce( - $parameter_list, - static function (int $carry, Parameter $parameter) : int { - return ($carry + ($parameter->isRequired() ? 1 : 0)); - }, - 0 - )); - - $method->setNumberOfOptionalParameters(\array_reduce( - $parameter_list, - static function (int $carry, Parameter $parameter) : int { - return ($carry + ($parameter->isOptional() ? 1 : 0)); - }, - 0 - )); - - // Check to see if the comment specifies that the - // method is deprecated - $method->setIsDeprecated($comment->isDeprecated()); - - // Set whether or not the element is internal to - // the namespace. - $method->setIsNSInternal($comment->isNSInternal()); - - // Set whether or not the comment indicates that the method is intended - // to override another method. - $method->setIsOverrideIntended($comment->isOverrideIntended()); - $method->setSuppressIssueSet($comment->getSuppressIssueSet()); - - if ($method->getIsMagicCall() || $method->getIsMagicCallStatic()) { - $method->setNumberOfOptionalParameters(FunctionInterface::INFINITE_PARAMETERS); - $method->setNumberOfRequiredParameters(0); - } - - $is_trait = $context->getScope()->isInTraitScope(); - // Add the syntax-level return type to the method's union type - // if it exists - if ($node->children['returnType'] !== null) { - // TODO: Avoid resolving this, but only in traits - $return_union_type = (new UnionTypeVisitor($code_base, $context))->fromTypeInSignature( - $node->children['returnType'] - ); - $method->setUnionType($method->getUnionType()->withUnionType($return_union_type)); - // TODO: Replace 'self' with the real class when not in a trait - } else { - $return_union_type = UnionType::empty(); - } - $method->setRealReturnType($return_union_type); - - // If available, add in the doc-block annotated return type - // for the method. - if ($comment->hasReturnUnionType()) { - $comment_return_union_type = $comment->getReturnType(); - if (!$is_trait) { - $comment_return_union_type = $comment_return_union_type->withSelfResolvedInContext($context); - } - - $method->setUnionType($method->getUnionType()->withUnionType($comment_return_union_type)); - $method->setPHPDocReturnType($comment_return_union_type); - } - $element_context->freeElementReference(); - - return $method; - } - - /** - * Ensure that this clone will use the return type of the ancestor method - * @return void - */ - public function ensureClonesReturnType(Method $original_method) - { - if ($this->defining_method_for_type_fetching) { - return; - } - // Get the real ancestor of C::method() if C extends B and B extends A - $original_method = $original_method->defining_method_for_type_fetching ?? $original_method; - - // Don't bother with methods that can't have types inferred recursively - if ($original_method->isAbstract() || $original_method->isFromPHPDoc() || $original_method->isPHPInternal()) { - return; - } - - if (!$original_method->getUnionType()->isEmpty() || !$original_method->getRealReturnType()->isEmpty()) { - // This heuristic is used as little as possible. - // It will only use this fallback of directly using the (possibly modified) - // parent's type if the parent method declaration had no phpdoc return type and no real return type (and nothing was guessed such as `void`). - return; - } - $this->defining_method_for_type_fetching = $original_method; - } - - public function setUnionType(UnionType $union_type) - { - $this->defining_method_for_type_fetching = null; - parent::setUnionType($union_type); - } - - /** - * @return UnionType - * The return type of this method in its given context. - */ - public function getUnionType() : UnionType - { - if ($this->defining_method_for_type_fetching) { - return $this->defining_method_for_type_fetching->getUnionType(); - } - $union_type = parent::getUnionType(); - - // If the type is 'static', add this context's class - // to the return type - if ($union_type->hasStaticType()) { - $union_type = $union_type->withType( - $this->getFQSEN()->getFullyQualifiedClassName()->asType() - ); - } - - // If the type is a generic array of 'static', add - // a generic array of this context's class to the return type - if ($union_type->genericArrayElementTypes()->hasStaticType()) { - // TODO: Base this on the static array type... - $key_type_enum = GenericArrayType::keyTypeFromUnionTypeKeys($union_type); - $union_type = $union_type->withType( - $this->getFQSEN()->getFullyQualifiedClassName()->asType()->asGenericArrayType($key_type_enum) - ); - } - - return $union_type; - } - - public function getUnionTypeWithUnmodifiedStatic() : UnionType - { - return parent::getUnionType(); - } - - /** - * @return FullyQualifiedMethodName - */ - public function getFQSEN() : FullyQualifiedMethodName - { - return $this->fqsen; - } - - /** - * @return \Generator - * @phan-return \Generator<Method> - * The set of all alternates to this method - */ - public function alternateGenerator(CodeBase $code_base) : \Generator - { - // Workaround so that methods of generic classes will have the resolved template types - yield $this; - $fqsen = $this->getFQSEN(); - $alternate_id = $fqsen->getAlternateId() + 1; - - $fqsen = $fqsen->withAlternateId($alternate_id); - - while ($code_base->hasMethodWithFQSEN($fqsen)) { - yield $code_base->getMethodByFQSEN($fqsen); - $fqsen = $fqsen->withAlternateId(++$alternate_id); - } - } - - /** - * @param CodeBase $code_base - * The code base with which to look for classes - * - * @return Method[] - * The Methods that this Method is overriding - * (Abstract methods are returned before concrete methods) - * - * @throws CodeBaseException if 0 methods were found. - */ - public function getOverriddenMethods( - CodeBase $code_base - ) : array { - // Get the class that defines this method - $class = $this->getClass($code_base); - - // Get the list of ancestors of that class - $ancestor_class_list = $class->getAncestorClassList( - $code_base - ); - - $defining_fqsen = $this->getDefiningFQSEN(); - - $method_list = []; - $abstract_method_list = []; - // Hunt for any ancestor classes that define a method with - // the same name as this one. - foreach ($ancestor_class_list as $ancestor_class) { - // TODO: Handle edge cases in traits. - // A trait may be earlier in $ancestor_class_list than the parent, but the parent may define abstract classes. - // TODO: What about trait aliasing rules? - if ($ancestor_class->hasMethodWithName($code_base, $this->getName())) { - $method = $ancestor_class->getMethodByName( - $code_base, - $this->getName() - ); - if ($method->getDefiningFQSEN() === $defining_fqsen) { - // Skip it, this method **is** the one which defined this. - continue; - } - // We initialize the overridden method's scope to ensure that - // analyzers are aware of the full param/return types of the overridden method. - $method->ensureScopeInitialized($code_base); - if ($method->isAbstract()) { - // TODO: check for trait conflicts, etc. - $abstract_method_list[] = $method; - continue; - } - $method_list[] = $method; - } - } - // Return abstract methods before concrete methods, in order to best check method compatibility. - $method_list = \array_merge($abstract_method_list, $method_list); - if (\count($method_list) > 0) { - return $method_list; - } - - // Throw an exception if this method doesn't override - // anything - throw new CodeBaseException( - $this->getFQSEN(), - "Method $this with FQSEN {$this->getFQSEN()} does not override another method" - ); - } - - /** - * @return FullyQualifiedMethodName the FQSEN with the original definition (Even if this is private/protected and inherited from a trait). Used for dead code detection. - * Inheritance tests use getDefiningFQSEN() so that access checks won't break. - * - * @suppress PhanPartialTypeMismatchReturn TODO: Allow subclasses to make property types more specific - */ - public function getRealDefiningFQSEN() : FullyQualifiedMethodName - { - return $this->real_defining_fqsen ?? $this->getDefiningFQSEN(); - } - - /** - * @return string - * A string representation of this method signature (preferring phpdoc types) - */ - public function __toString() : string - { - $string = ''; - // TODO: should this representation and other representations include visibility? - - $string .= 'function '; - if ($this->returnsRef()) { - $string .= '&'; - } - $string .= $this->getName(); - - $string .= '(' . \implode(', ', $this->getParameterList()) . ')'; - - $union_type = $this->getUnionTypeWithUnmodifiedStatic(); - if (!$union_type->isEmpty()) { - $string .= ' : ' . (string)$union_type; - } - - return $string; - } - - /** - * @return string - * A string representation of this method signature - * (Based on real types only, instead of phpdoc+real types) - */ - public function toRealSignatureString() : string - { - $string = ''; - - $string .= 'function '; - if ($this->returnsRef()) { - $string .= '&'; - } - $string .= $this->getName(); - - $string .= '(' . \implode(', ', $this->getRealParameterList()) . ')'; - - if (!$this->getRealReturnType()->isEmpty()) { - $string .= ' : ' . (string)$this->getRealReturnType(); - } - - return $string; - } - - public function getMarkupDescription() : string - { - $string = ''; - // It's an error to have visibility or abstract in an interface's stub (e.g. JsonSerializable) - if ($this->isPrivate()) { - $string .= 'private '; - } elseif ($this->isProtected()) { - $string .= 'protected '; - } else { - $string .= 'public '; - } - - if ($this->isAbstract()) { - $string .= 'abstract '; - } - - if ($this->isStatic()) { - $string .= 'static '; - } - - $string .= 'function '; - if ($this->returnsRef()) { - $string .= '&'; - } - $string .= $this->getName(); - - $string .= '(' . $this->getParameterStubText() . ')'; - - if ($this->isPHPInternal()) { - $return_type = $this->getUnionType(); - } else { - $return_type = $this->real_return_type; - } - if ($return_type && !$return_type->isEmpty()) { - $string .= ' : ' . (string)$return_type; - } - - return $string; - } - - /** - * Returns this method's visibility ('private', 'protected', or 'public') - */ - public function getVisibilityName() : string - { - if ($this->isPrivate()) { - return 'private'; - } elseif ($this->isProtected()) { - return 'protected'; - } else { - return 'public'; - } - } - - /** - * Returns a PHP stub that can be used in the output of `tool/make_stubs` - */ - public function toStub(bool $class_is_interface = false) : string - { - $string = ' '; - // It's an error to have visibility or abstract in an interface's stub (e.g. JsonSerializable) - if (!$class_is_interface) { - $string .= $this->getVisibilityName() . ' '; - - if ($this->isAbstract()) { - $string .= 'abstract '; - } - } - - if ($this->isStatic()) { - $string .= 'static '; - } - - $string .= 'function '; - if ($this->returnsRef()) { - $string .= '&'; - } - $string .= $this->getName(); - - $string .= '(' . $this->getRealParameterStubText() . ')'; - - if (!$this->getRealReturnType()->isEmpty()) { - $string .= ' : ' . (string)$this->getRealReturnType(); - } - if ($this->isAbstract()) { - $string .= ';'; - } else { - $string .= ' {}'; - } - - return $string; - } - - /** - * Does this method have template types anywhere in its parameters or return type? - * (This check is recursive) - */ - public function hasTemplateType() : bool - { - return $this->getPhanFlagsHasState(Flags::HAS_TEMPLATE_TYPE); - } - - private function recordHasTemplateType() - { - $this->setPhanFlags($this->getPhanFlags() | Flags::HAS_TEMPLATE_TYPE); - } - - /** - * Attempt to convert this template method into a method with concrete types - * Either returns the original method or a clone of the method with more type information. - */ - public function resolveTemplateType( - CodeBase $code_base, - UnionType $object_union_type - ) : Method { - $defining_fqsen = $this->getDefiningClassFQSEN(); - $defining_class = $code_base->getClassByFQSEN($defining_fqsen); - if (!$defining_class->isGeneric()) { - // ??? - return $this; - } - $expected_type = $defining_fqsen->asType(); - - foreach ($object_union_type->getTypeSet() as $type) { - if (!$type->hasTemplateParameterTypes()) { - continue; - } - if (!$type->isObjectWithKnownFQSEN()) { - continue; - } - $expanded_type = $type->withIsNullable(false)->asExpandedTypes($code_base); - foreach ($expanded_type->getTypeSet() as $candidate) { - if (!$candidate->isTemplateSubtypeOf($expected_type)) { - continue; - } - // $candidate is $expected_type<T...> - $result = $this->cloneWithTemplateParameterTypeMap($candidate->getTemplateParameterTypeMap($code_base)); - return $result; - } - } - return $this; - } - - /** - * @param array<string,UnionType> $template_type_map - * A map from template type identifier to a concrete type - */ - private function cloneWithTemplateParameterTypeMap(array $template_type_map) : Method - { - $result = clone($this); - $result->cloneParameterList(); - foreach ($result->parameter_list as $parameter) { - $parameter->setUnionType($parameter->getUnionType()->withTemplateParameterTypeMap($template_type_map)); - } - $result->setUnionType($result->getUnionType()->withTemplateParameterTypeMap($template_type_map)); - $result->setPhanFlags($result->getPhanFlags() & ~Flags::HAS_TEMPLATE_TYPE); - if (Config::get_track_references()) { - // Quick and dirty fix to make dead code detection work on this clone. - // Consider making this an object instead. - // @see AddressableElement::addReference() - $result->reference_list = &$this->reference_list; - } - return $result; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Parameter.php b/vendor/phan/phan/src/Phan/Language/Element/Parameter.php deleted file mode 100644 index 98f1963..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Parameter.php +++ /dev/null @@ -1,629 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use AssertionError; -use ast\Node; -use InvalidArgumentException; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Exception\IssueException; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\Comment\Builder; -use Phan\Language\FileRef; -use Phan\Language\FutureUnionType; -use Phan\Language\Type; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\BoolType; -use Phan\Language\Type\ClosureDeclarationParameter; -use Phan\Language\Type\FalseType; -use Phan\Language\Type\FloatType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\StringType; -use Phan\Language\Type\TrueType; -use Phan\Language\UnionType; -use Phan\Parse\ParseVisitor; - -/** - * Represents the information Phan has about a function-like's Parameter - * (e.g. of a function, closure, method, a PHPDoc closure/callable signature such as `Closure(MyClass=):void`, or phpdoc method. - * - * @phan-file-suppress PhanPartialTypeMismatchArgument - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class Parameter extends Variable -{ - const REFERENCE_DEFAULT = 1; - const REFERENCE_READ_WRITE = 2; - const REFERENCE_WRITE_ONLY = 3; - - // __construct(FileRef $file_ref, string $name, UnionType $type, int $flags) inherited from Variable - - /** - * @var UnionType|null - * The type of the default value, if any - */ - private $default_value_type = null; - - /** - * @var FutureUnionType|null - * The type of the default value if any - */ - private $default_value_future_type = null; - - /** - * @var mixed - * The value of the default, if one is set - */ - private $default_value = null; - - /** - * @return static - */ - public static function create( - FileRef $context, - string $name, - UnionType $type, - int $flags - ) { - if (Flags::bitVectorHasState($flags, \ast\flags\PARAM_VARIADIC)) { - return new VariadicParameter($context, $name, $type, $flags); - } - return new Parameter($context, $name, $type, $flags); - } - - /** - * @return bool - * True if this parameter has a type for its - * default value - */ - public function hasDefaultValue() : bool - { - return $this->default_value_type !== null; - } - - /** - * @param UnionType $type - * The type of the default value for this parameter - * - * @return void - */ - public function setDefaultValueType(UnionType $type) - { - $this->default_value_type = $type; - } - - /** - * @param FutureUnionType $type - * The future type of the default value for this parameter - * - * @return void - */ - public function setDefaultValueFutureType(FutureUnionType $type) - { - $this->default_value_future_type = $type; - } - - /** - * @return UnionType - * The type of the default value for this parameter - * if it exists - */ - public function getDefaultValueType() : UnionType - { - $future_type = $this->default_value_future_type; - if ($future_type !== null) { - // Only attempt to resolve the future type once. - try { - $this->default_value_type = $future_type->get()->asNonLiteralType(); - } catch (IssueException $exception) { - // Ignore exceptions - Issue::maybeEmitInstance( - $future_type->getCodebase(), // @phan-suppress-current-line PhanAccessMethodInternal - $future_type->getContext(), // @phan-suppress-current-line PhanAccessMethodInternal - $exception->getIssueInstance() - ); - } finally { - // Only try to resolve the FutureType once. - $this->default_value_future_type = null; - } - } - // @phan-suppress-next-line PhanPossiblyNullTypeReturn callers should check hasDefaultType - return $this->default_value_type; - } - - /** - * @param mixed $value - * The value of the default for this parameter - * - * @return void - */ - public function setDefaultValue($value) - { - $this->default_value = $value; - } - - /** - * If the value's default is null, or a constant evaluating to null, - * then the parameter type should be converted to nullable - * (E.g. `int $x = null` and `?int $x = null` are equivalent. - * @return void - */ - public function handleDefaultValueOfNull() - { - if ($this->default_value_type && $this->default_value_type->isType(NullType::instance(false))) { - // If it isn't already nullable, convert the parameter type to nullable. - $this->convertToNullable(); - } - } - - /** - * @return mixed - * The value of the default for this parameter if one - * is defined, otherwise null. - */ - public function getDefaultValue() - { - return $this->default_value; - } - - /** - * @return array<int,Parameter> - * A list of parameters from an AST node. - */ - public static function listFromNode( - Context $context, - CodeBase $code_base, - Node $node - ) : array { - $parameter_list = []; - foreach ($node->children as $child_node) { - $parameter = - Parameter::fromNode($context, $code_base, $child_node); - - $parameter_list[] = $parameter; - } - - return $parameter_list; - } - - /** - * @param array<int,\ReflectionParameter> $reflection_parameters - * @return array<int,Parameter> - */ - public static function listFromReflectionParameterList( - array $reflection_parameters - ) : array { - return \array_map([self::class, 'fromReflectionParameter'], $reflection_parameters); - } - - /** - * Creates a parameter signature for a function-like from the name, type, etc. of the passed in reflection parameter - */ - public static function fromReflectionParameter( - \ReflectionParameter $reflection_parameter - ) : Parameter { - $flags = 0; - // Check to see if its a pass-by-reference parameter - if ($reflection_parameter->isPassedByReference()) { - $flags |= \ast\flags\PARAM_REF; - } - - // Check to see if its variadic - if ($reflection_parameter->isVariadic()) { - $flags |= \ast\flags\PARAM_VARIADIC; - } - $parameter = self::create( - new Context(), - $reflection_parameter->getName() ?? "arg", - UnionType::fromReflectionType($reflection_parameter->getType()), - $flags - ); - if ($reflection_parameter->isOptional()) { - $parameter->setDefaultValueType( - NullType::instance(false)->asUnionType() - ); - } - return $parameter; - } - - /** - * @param Node|string|float|int $node - * @return ?UnionType - Returns if we know the exact type of $node and can easily resolve it - */ - private static function maybeGetKnownDefaultValueForNode($node) - { - if (!($node instanceof Node)) { - return Type::nonLiteralFromObject($node)->asUnionType(); - } - if ($node->kind === \ast\AST_CONST) { - $name = $node->children['name']->children['name'] ?? null; - if (\is_string($name)) { - switch (\strtolower($name)) { - case 'false': - return FalseType::instance(false)->asUnionType(); - case 'true': - return TrueType::instance(false)->asUnionType(); - case 'null': - return NullType::instance(false)->asUnionType(); - } - } - } - return null; - } - - /** - * @return Parameter - * A parameter built from a node - */ - public static function fromNode( - Context $context, - CodeBase $code_base, - Node $node - ) : Parameter { - // Get the type of the parameter - $type_node = $node->children['type']; - if ($type_node) { - try { - $union_type = (new UnionTypeVisitor($code_base, $context))->fromTypeInSignature($type_node); - } catch (IssueException $e) { - Issue::maybeEmitInstance($code_base, $context, $e->getIssueInstance()); - $union_type = UnionType::empty(); - } - } else { - $union_type = UnionType::empty(); - } - - // Create the skeleton parameter from what we know so far - $parameter = Parameter::create( - $context, - (string)$node->children['name'], - $union_type, - $node->flags ?? 0 - ); - if (($type_node->kind ?? null) === \ast\AST_NULLABLE_TYPE) { - $parameter->setIsUsingNullableSyntax(); - } - - // If there is a default value, store it and its type - $default_node = $node->children['default']; - if ($default_node !== null) { - // Set the actual value of the default - $parameter->setDefaultValue($default_node); - try { - // @phan-suppress-next-line PhanAccessMethodInternal - ParseVisitor::checkIsAllowedInConstExpr($default_node); - - // We can't figure out default values during the - // parsing phase, unfortunately - $has_error = false; - } catch (InvalidArgumentException $_) { - // If the parameter default is an invalid constant expression, - // then don't use that value elsewhere. - Issue::maybeEmit( - $code_base, - $context, - Issue::InvalidConstantExpression, - $default_node->lineno ?? 0 - ); - $has_error = true; - } - $default_value_union_type = $has_error ? null : self::maybeGetKnownDefaultValueForNode($default_node); - - if ($default_value_union_type !== null) { - // Set the default value - $parameter->setDefaultValueType($default_value_union_type); - } else { - if (!($default_node instanceof Node)) { - throw new AssertionError("Somehow failed to infer type for the default_node - not a scalar or a Node"); - } - - if ($default_node->kind === \ast\AST_ARRAY) { - // We know the parameter default is some sort of array, but we don't know any more (e.g. key types, value types). - // When the future type is resolved, we'll know something more specific. - $default_value_union_type = ArrayType::instance(false)->asUnionType(); - } else { - static $possible_parameter_default_union_type = null; - if ($possible_parameter_default_union_type === null) { - // These can be constants or literals (or null/true/false) - $possible_parameter_default_union_type = new UnionType([ - ArrayType::instance(false), - BoolType::instance(false), - FloatType::instance(false), - IntType::instance(false), - StringType::instance(false), - NullType::instance(false), - ]); - } - $default_value_union_type = $possible_parameter_default_union_type; - } - $parameter->setDefaultValueType($default_value_union_type); - if (!$has_error) { - $parameter->setDefaultValueFutureType(new FutureUnionType( - $code_base, - clone($context)->withLineNumberStart($default_node->lineno ?? 0), - $default_node - )); - } - } - $parameter->handleDefaultValueOfNull(); - } - - return $parameter; - } - - /** - * @return bool - * True if this is an optional parameter - */ - public function isOptional() : bool - { - return $this->hasDefaultValue(); - } - - /** - * @return bool - * True if this is a required parameter - */ - public function isRequired() : bool - { - return !$this->isOptional(); - } - - /** - * @return bool - * True if this parameter is variadic, i.e. can - * take an unlimited list of parameters and express - * them as an array. - */ - public function isVariadic() : bool - { - return false; - } - - /** - * Returns the Parameter in the form expected by a caller. - * - * If this parameter is variadic (e.g. `DateTime ...$args`), then this - * would return a parameter with the type of the elements (e.g. `DateTime`) - * - * If this parameter is not variadic, returns $this. - * - * @return static (usually $this) - */ - public function asNonVariadic() - { - return $this; - } - - /** - * If this Parameter is variadic, calling `getUnionType` - * will return an array type such as `DateTime[]`. This - * method will return the element type (such as `DateTime`) - * for variadic parameters. - */ - public function getNonVariadicUnionType() : UnionType - { - return self::getUnionType(); - } - - /** - * @return bool - True when this is a non-variadic clone of a variadic parameter. - * (We avoid bugs by adding new types to a variadic parameter if this is cloned.) - * However, error messages still need to convert variadic parameters to a string. - */ - public function isCloneOfVariadic() : bool - { - return false; - } - - /** - * Add the given union type to this parameter's union type - * - * @param UnionType $union_type - * The type to add to this parameter's union type - * - * @return void - */ - public function addUnionType(UnionType $union_type) - { - parent::setUnionType(self::getUnionType()->withUnionType($union_type)); - } - - /** - * Add the given type to this parameter's union type - * - * @param Type $type - * The type to add to this parameter's union type - * - * @return void - */ - public function addType(Type $type) - { - parent::setUnionType(self::getUnionType()->withType($type)); - } - - /** - * @return bool - * True if this parameter is pass-by-reference - * i.e. prefixed with '&'. - */ - public function isPassByReference() : bool - { - return $this->getFlagsHasState(\ast\flags\PARAM_REF); - } - - /** - * Returns an enum value indicating how this reference parameter is changed by the caller. - * - * E.g. for REFERENCE_WRITE_ONLY, the reference parameter ignores the passed in value and always replaces it with another type. - * (added with (at)phan-output-parameter in PHPDoc or with special prefixes in FunctionSignatureMap.php) - */ - public function getReferenceType() : int - { - $flags = $this->getPhanFlags(); - if (Flags::bitVectorHasState($flags, Flags::IS_READ_REFERENCE)) { - return self::REFERENCE_READ_WRITE; - } elseif (Flags::bitVectorHasState($flags, Flags::IS_WRITE_REFERENCE)) { - return self::REFERENCE_WRITE_ONLY; - } - return self::REFERENCE_DEFAULT; - } - - /** - * @return void - */ - public function setIsOutputReference() - { - $this->enablePhanFlagBits(Flags::IS_WRITE_REFERENCE); - $this->disablePhanFlagBits(Flags::IS_READ_REFERENCE); - } - - /** - * @return void - */ - private function setIsUsingNullableSyntax() - { - $this->enablePhanFlagBits(Flags::IS_PARAM_USING_NULLABLE_SYNTAX); - } - - /** - * Is this a parameter that uses the nullable `?` syntax in the actual declaration? - * - * E.g. this will be true for `?int $myParam = null`, but false for `int $myParam = null` - * - * This is needed to deal with edge cases of analysis. - */ - public function getIsUsingNullableSyntax() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_PARAM_USING_NULLABLE_SYNTAX); - } - - public function __toString() : string - { - $string = ''; - - $union_type = $this->getNonVariadicUnionType(); - if (!$union_type->isEmpty()) { - $string .= $union_type->__toString() . ' '; - } - - if ($this->isPassByReference()) { - $string .= '&'; - } - - if ($this->isVariadic()) { - $string .= '...'; - } - - $string .= "\${$this->getName()}"; - - if ($this->hasDefaultValue() && !$this->isVariadic()) { - $default_value = $this->getDefaultValue(); - if ($default_value instanceof Node) { - $string .= ' = null'; - } else { - $string .= ' = ' . \var_export($default_value, true); - } - } - - return $string; - } - - /** - * Convert this parameter to a stub that can be used by `tool/make_stubs` - * - * @param bool $is_internal is this being requested for the language server instead of real PHP code? - * @suppress PhanAccessClassConstantInternal - */ - public function toStubString(bool $is_internal = false) : string - { - $string = ''; - - $union_type = $this->getNonVariadicUnionType(); - if (!$union_type->isEmpty()) { - $string .= $union_type->__toString() . ' '; - } - - if ($this->isPassByReference()) { - $string .= '&'; - } - - if ($this->isVariadic()) { - $string .= '...'; - } - - $name = $this->getName(); - if (!\preg_match('@' . Builder::WORD_REGEX . '@', $name)) { - // Some PECL extensions have invalid parameter names. - // Replace invalid characters with U+FFFD replacement character. - $name = \preg_replace('@[^a-zA-Z0-9_\x7f-\xff]@', '�', $name); - if (!\preg_match('@' . Builder::WORD_REGEX . '@', $name)) { - $name = '_' . $name; - } - } - - $string .= "\$$name"; - - if ($this->hasDefaultValue() && !$this->isVariadic()) { - $default_value = $this->getDefaultValue(); - if ($default_value instanceof Node) { - $kind = $default_value->kind; - if ($kind === \ast\AST_NAME) { - $default_repr = (string)$default_value->children['name']; - } elseif ($kind === \ast\AST_ARRAY) { - $default_repr = '[]'; - } else { - $default_repr = 'null'; - } - } else { - $default_repr = \var_export($this->getDefaultValue(), true); - } - if (\strtolower($default_repr) === 'null') { - $default_repr = 'null'; - // If we're certain the parameter isn't nullable, - // then render the default as `default`, not `null` - if ($is_internal) { - if (!$union_type->isEmpty() && !$union_type->containsNullable()) { - $default_repr = 'default'; - } - } - } - $string .= ' = ' . $default_repr; - } - - return $string; - } - - /** - * Converts this to a ClosureDeclarationParameter that can be used in FunctionLikeDeclarationType instances. - * - * E.g. when analyzing code such as `$x = Closure::fromCallable('some_function')`, - * this is used on parameters of `some_function()` to infer the create the parameter types of the inferred type. - */ - public function asClosureDeclarationParameter() : ClosureDeclarationParameter - { - $param_type = $this->getNonVariadicUnionType(); - if ($param_type->isEmpty()) { - $param_type = MixedType::instance(false)->asUnionType(); - } - return new ClosureDeclarationParameter( - $param_type, - $this->isVariadic(), - $this->isPassByReference(), - $this->isOptional() - ); - } - - /** - * @param FunctionInterface $function - The function that has this Parameter. - * @return Context a Context with the line number of this parameter - */ - public function createContext(FunctionInterface $function) : Context - { - return clone($function->getContext())->withLineNumberStart($this->getFileRef()->getLineNumberStart()); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/PassByReferenceVariable.php b/vendor/phan/phan/src/Phan/Language/Element/PassByReferenceVariable.php deleted file mode 100644 index 2d799a5..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/PassByReferenceVariable.php +++ /dev/null @@ -1,127 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\Language\Context; -use Phan\Language\FileRef; -use Phan\Language\UnionType; - -/** - * This class wraps a parameter and an element and proxies - * calls to the element but keeps the name of the parameter - * allowing us to pass an element into a method as a - * pass-by-reference parameter so that its value can be - * updated when re-analyzing the method. - */ -class PassByReferenceVariable extends Variable -{ - - /** - * @var Variable the parameter which accepts references - */ - private $parameter; - - /** - * The element that was passed in as an argument (e.g. variable or static property) - * @var TypedElement|UnaddressableTypedElement - * TODO: Make a common interface which has methods implemented - */ - private $element; - - /** @param TypedElement|UnaddressableTypedElement $element */ - public function __construct( - Variable $parameter, - $element - ) { - $this->parameter = $parameter; - $this->element = $element; - } - - public function getName() : string - { - return $this->parameter->getName(); - } - - /** - * Variables can't be variadic. This is the same as getUnionType for - * variables, but not necessarily for subclasses. Method will return - * the element type (such as `DateTime`) for variadic parameters. - */ - public function getNonVariadicUnionType() : UnionType - { - return $this->element->getNonVariadicUnionType(); - } - - public function getUnionType() : UnionType - { - return $this->element->getUnionType(); - } - - public function setUnionType(UnionType $type) - { - $this->element->setUnionType($type); - } - - public function getFlags() : int - { - return $this->element->getFlags(); - } - - public function getFlagsHasState(int $bits) : bool - { - return $this->element->getFlagsHasState($bits); - } - - public function setFlags(int $flags) - { - $this->element->setFlags($flags); - } - - public function getPhanFlags() : int - { - return $this->element->getPhanFlags(); - } - - public function getPhanFlagsHasState(int $bits) : bool - { - return $this->element->getPhanFlagsHasState($bits); - } - - public function setPhanFlags(int $phan_flags) - { - $this->element->setPhanFlags($phan_flags); - } - - /** - * Returns the context in which the element this is a reference to - * was declared. - */ - public function getContext() : Context - { - return $this->element->getContext(); - } - - public function getFileRef() : FileRef - { - return $this->element->getFileRef(); - } - - /** - * Is the variable/property this is referring to part of a PHP module? - * (only possible for properties) - */ - public function isPHPInternal() : bool - { - return $this->element->isPHPInternal(); - } - - /** - * Get the argument passed in to this object. - * @return TypedElement|UnaddressableTypedElement - * @suppress PhanUnreferencedPublicMethod - */ - public function getElement() - { - return $this->element; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Property.php b/vendor/phan/phan/src/Phan/Language/Element/Property.php deleted file mode 100644 index 4245723..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Property.php +++ /dev/null @@ -1,413 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Closure; -use Phan\Exception\IssueException; -use Phan\Language\Context; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedPropertyName; -use Phan\Language\Scope\PropertyScope; -use Phan\Language\UnionType; -use TypeError; - -/** - * Phan's representation of a class/trait/interface's property (including magic and dynamic properties) - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class Property extends ClassElement -{ - use ElementFutureUnionType; - use ClosedScopeElement; - - /** - * @var ?FullyQualifiedPropertyName If this was originally defined in a trait, this is the trait's defining fqsen. - * This is tracked separately from getDefiningFQSEN() in order to not break access checks on protected/private properties. - * Used for dead code detection. - */ - private $real_defining_fqsen; - - /** - * @param Context $context - * The context in which the structural element lives - * - * @param string $name - * The name of the typed structural element - * - * @param UnionType $type - * A '|' delimited set of types satisfied by this - * typed structural element. - * - * @param int $flags - * The flags property contains node specific flags. It is - * always defined, but for most nodes it is always zero. - * ast\kind_uses_flags() can be used to determine whether - * a certain kind has a meaningful flags value. - */ - public function __construct( - Context $context, - string $name, - UnionType $type, - int $flags, - FullyQualifiedPropertyName $fqsen - ) { - parent::__construct( - $context, - $name, - $type, - $flags, - $fqsen - ); - - // Presume that this is the original definition - // of this property, and let it be overwritten - // if it isn't. - $this->setDefiningFQSEN($fqsen); - $this->real_defining_fqsen = $fqsen; - - // Set an internal scope, so that issue suppressions can be placed on property doc comments. - // (plugins acting on properties would then pick those up). - // $fqsen is used to locate this property. - $this->setInternalScope(new PropertyScope( - $context->getScope(), - $fqsen - )); - } - - /** - * @return FullyQualifiedPropertyName the FQSEN with the original definition (Even if this is private/protected and inherited from a trait). Used for dead code detection. - * Inheritance tests use getDefiningFQSEN() so that access checks won't break. - * - * @suppress PhanPartialTypeMismatchReturn TODO: Allow subclasses to make property types more specific - */ - public function getRealDefiningFQSEN() : FullyQualifiedPropertyName - { - return $this->real_defining_fqsen ?? $this->getDefiningFQSEN(); - } - - /** - * Returns the visibility for this property (for issue messages and stubs) - */ - public function getVisibilityName() : string - { - if ($this->isPrivate()) { - return 'private'; - } elseif ($this->isProtected()) { - return 'protected'; - } else { - return 'public'; - } - } - - public function __toString() : string - { - $string = $this->getVisibilityName() . ' '; - - if ($this->isStatic()) { - $string .= 'static '; - } - - // Since the UnionType can be a future, and that - // can throw an exception, we catch it and ignore it - try { - $union_type = $this->getUnionType()->__toString(); - if ($union_type !== '') { - $string .= "$union_type "; - } // Don't emit 2 spaces if there is no union type - } catch (\Exception $_) { - // do nothing - } - - $string .= "\${$this->getName()}"; - - return $string; - } - - /** - * Used for generating issue messages - */ - public function asVisibilityAndFQSENString() : string - { - return $this->getVisibilityName() . ' ' . $this->asPropertyFQSENString(); - } - - /** - * Used for generating issue messages - */ - public function asPropertyFQSENString() : string - { - return $this->getClassFQSEN()->__toString() . - ($this->isStatic() ? '::$' : '->') . - $this->getName(); - } - - /** - * @return string the representation of this FQSEN for issue messages. - * @override - */ - public function getRepresentationForIssue() : string - { - return $this->asPropertyFQSENString(); - } - - /** - * Override the default getter to fill in a future - * union type if available. - * @throws IssueException if getFutureUnionType fails. - */ - public function getUnionType() : UnionType - { - if (null !== ($union_type = $this->getFutureUnionType())) { - $this->setUnionType(parent::getUnionType()->withUnionType($union_type->asNonLiteralType())); - } - - return parent::getUnionType(); - } - - /** - * @return FullyQualifiedPropertyName - * The fully-qualified structural element name of this - * structural element - */ - public function getFQSEN() : FullyQualifiedPropertyName - { - return $this->fqsen; - } - - public function getMarkupDescription() : string - { - $string = $this->getVisibilityName() . ' '; - - if ($this->isStatic()) { - $string .= 'static '; - } - - $string .= "\${$this->getName()}"; - - return $string; - } - - - /** - * Returns a stub declaration for this property that can be used to build a class stub - * in `tool/make_stubs`. - */ - public function toStub() : string - { - $string = ' ' . $this->getVisibilityName() . ' '; - - if ($this->isStatic()) { - $string .= 'static '; - } - - $string .= "\${$this->getName()}"; - $string .= ';'; - - return $string; - } - - /** - * Used by daemon mode to restore an element to the state it had before parsing. - * @internal - * @return ?Closure - */ - public function createRestoreCallback() - { - $future_union_type = $this->future_union_type; - if ($future_union_type === null) { - // We already inferred the type for this class constant/global constant. - // Nothing to do. - return null; - } - // If this refers to a class constant in another file, - // the resolved union type might change if that file changes. - return function () use ($future_union_type) { - $this->future_union_type = $future_union_type; - // Probably don't need to call setUnionType(mixed) again... - }; - } - - /** - * Returns true if at least one of the references to this property was **reading** the property - * - * Precondition: Config::get_track_references() === true - */ - public function hasReadReference() : bool - { - return $this->getPhanFlagsHasState(Flags::WAS_PROPERTY_READ); - } - - /** - * @return void - */ - public function setHasReadReference() - { - $this->enablePhanFlagBits(Flags::WAS_PROPERTY_READ); - } - - /** - * Returns true if at least one of the references to this property was **writing** the property - * - * Precondition: Config::get_track_references() === true - */ - public function hasWriteReference() : bool - { - return $this->getPhanFlagsHasState(Flags::WAS_PROPERTY_WRITTEN); - } - - /** - * @return void - */ - public function setHasWriteReference() - { - $this->enablePhanFlagBits(Flags::WAS_PROPERTY_WRITTEN); - } - - /** - * Copy addressable references from an element of the same subclass - * @override - * @return void - */ - public function copyReferencesFrom(AddressableElement $element) - { - if ($this === $element) { - // Should be impossible - return; - } - if (!($element instanceof Property)) { - throw new TypeError('Expected $element to be Phan\Language\Element\Property in ' . __METHOD__); - } - foreach ($element->reference_list as $key => $file_ref) { - $this->reference_list[$key] = $file_ref; - } - if ($element->hasReadReference()) { - $this->setHasReadReference(); - } - if ($element->hasWriteReference()) { - $this->setHasWriteReference(); - } - } - - /** - * @internal - */ - const _IS_DYNAMIC_OR_MAGIC = Flags::IS_FROM_PHPDOC | Flags::IS_DYNAMIC_PROPERTY; - - /** - * Equivalent to $this->isDynamicProperty() || $this->isFromPHPDoc() - * i.e. this is a property that is not created from an AST_PROP_ELEM Node. - */ - public function isDynamicOrFromPHPDoc() : bool - { - return ($this->getPhanFlags() & self::_IS_DYNAMIC_OR_MAGIC) !== 0; - } - - /** - * @return bool - * True if this is a magic phpdoc property (declared via (at)property (-read,-write,) on class declaration phpdoc) - */ - public function isFromPHPDoc() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_FROM_PHPDOC); - } - - /** - * @param bool $from_phpdoc - True if this is a magic phpdoc property (declared via (at)property (-read,-write,) on class declaration phpdoc) - * @return void - * @suppress PhanUnreferencedPublicMethod the caller now just sets all phan flags at once (including IS_READ_ONLY) - */ - public function setIsFromPHPDoc(bool $from_phpdoc) - { - $this->setPhanFlags( - Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_FROM_PHPDOC, - $from_phpdoc - ) - ); - } - - /** - * Record whether this property contains `static` anywhere in the original union type. - * - * @param bool $has_static - * @return void - */ - public function setHasStaticInUnionType(bool $has_static) - { - $this->setPhanFlags( - Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::HAS_STATIC_UNION_TYPE, - $has_static - ) - ); - } - - /** - * Does this property contain `static` anywhere in the original union type? - */ - public function getHasStaticInUnionType() : bool - { - return $this->getPhanFlagsHasState(Flags::HAS_STATIC_UNION_TYPE); - } - - /** - * Was this property undeclared (and created at runtime)? - */ - public function isDynamicProperty() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_DYNAMIC_PROPERTY); - } - - /** - * Is this parameter declared in a way hinting that it should only be written to? - * (E.g. magic properties declared as (at)property-read, regular properties with (at)phan-read-only) - */ - public function isReadOnly() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_READ_ONLY); - } - - /** - * Is this parameter declared in a way hinting that it should only be written to? - * (E.g. magic properties declared as (at)property-write, regular properties with (at)phan-write-only) - */ - public function isWriteOnly() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_WRITE_ONLY); - } - - /** - * @return void - */ - public function setIsDynamicProperty(bool $is_dynamic) - { - $this->setPhanFlags( - Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_DYNAMIC_PROPERTY, - $is_dynamic - ) - ); - } - - /** - * @return void - */ - public function inheritStaticUnionType(FullyQualifiedClassName $old, FullyQualifiedClassName $new) - { - $union_type = $this->getUnionType(); - foreach ($union_type->getTypeSet() as $type) { - if (!$type->isObjectWithKnownFQSEN()) { - continue; - } - if (FullyQualifiedClassName::fromType($type) === $old) { - $union_type = $union_type - ->withoutType($type) - ->withType($new->asType()->withIsNullable($type->getIsNullable())); - } - } - $this->setUnionType($union_type); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/TraitAdaptations.php b/vendor/phan/phan/src/Phan/Language/Element/TraitAdaptations.php deleted file mode 100644 index e82d97f..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/TraitAdaptations.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\Language\FQSEN\FullyQualifiedClassName; - -/** - * This contains info for a single sub-node of a node of type \ast\AST_USE_TRAIT - * (Which aliases of methods exist for this trait, which `insteadof` exist, etc) - */ -class TraitAdaptations -{ - /** - * @var FullyQualifiedClassName - * the FQSEN of the trait - */ - private $trait_fqsen; - - /** - * @var array<string,TraitAliasSource> - * maps alias methods from this trait - * to the info about the source method - */ - public $alias_methods = []; - - /** - * @var array<string,bool> Has an entry mapping name to true if a method with a given name is hidden. - */ - public $hidden_methods = []; - - public function __construct(FullyQualifiedClassName $trait_fqsen) - { - $this->trait_fqsen = $trait_fqsen; - } - - /** - * Gets the trait's FQSEN - */ - public function getTraitFQSEN() : FullyQualifiedClassName - { - return $this->trait_fqsen; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/TraitAliasSource.php b/vendor/phan/phan/src/Phan/Language/Element/TraitAliasSource.php deleted file mode 100644 index e1ef8bf..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/TraitAliasSource.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -/** - * This contains info for the source method of a trait alias. - */ -class TraitAliasSource -{ - /** - * @var int line number where this trait method alias was created - * (in the class using traits). - */ - private $alias_lineno; - - /** - * @var string source method name - */ - private $source_method_name; - - /** - * @var int the overridden visibility modifier, or 0 if the visibility didn't change - */ - private $alias_visibility_flags; - - public function __construct(string $source_method_name, int $alias_lineno, int $alias_visibility_flags) - { - $this->source_method_name = $source_method_name; - $this->alias_lineno = $alias_lineno; - $this->alias_visibility_flags = $alias_visibility_flags; - } - - /** - * Returns the name of the method which this is an alias of. - */ - public function getSourceMethodName() : string - { - return $this->source_method_name; - } - - /** - * Returns the line number where this trait method alias was created - * (in the class using traits). - */ - public function getAliasLineno() : int - { - return $this->alias_lineno; - } - - /** - * Returns the overridden visibility modifier, or 0 if the visibility didn't change - */ - public function getAliasVisibilityFlags() : int - { - return $this->alias_visibility_flags; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/TypedElement.php b/vendor/phan/phan/src/Phan/Language/Element/TypedElement.php deleted file mode 100644 index 2dca645..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/TypedElement.php +++ /dev/null @@ -1,376 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\FileRef; -use Phan\Language\UnionType; - -/** - * Any PHP structural element that also has a type and is - * addressable such as a class, method, closure, property, - * constant, variable, ... - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -abstract class TypedElement implements TypedElementInterface -{ - /** - * @var string - * The name of the typed structural element - */ - private $name; - - /** - * @var UnionType - * A set of types satisfied by this typed structural - * element. - */ - private $type; - - /** - * @var int - * The flags property contains node specific flags. It is - * always defined, but for most nodes it is always zero. - * ast\kind_uses_flags() can be used to determine whether - * a certain kind has a meaningful flags value. - */ - private $flags = 0; - - /** - * @var int - * The Phan flags property contains node specific flags that - * are internal to Phan. - */ - private $phan_flags = 0; - - /** - * @var Context - * The context in which the structural element lives - */ - private $context; - - /** - * @var array<string,int> - * A set of issues types to be suppressed. - * Maps to the number of times an issue type was suppressed. - */ - private $suppress_issue_list = []; - - /** - * @param Context $context - * The context in which the structural element lives - * - * @param string $name - * The name of the typed structural element - * - * @param UnionType $type - * A '|' delimited set of types satisfied by this - * typed structural element. - * - * @param int $flags - * The flags property contains node specific flags. It is - * always defined, but for most nodes it is always zero. - * ast\kind_uses_flags() can be used to determine whether - * a certain kind has a meaningful flags value. - */ - public function __construct( - Context $context, - string $name, - UnionType $type, - int $flags - ) { - $this->context = clone($context); - $this->name = $name; - $this->type = $type; - $this->flags = $flags; - $this->setIsPHPInternal($context->isPHPInternal()); - } - - /** - * After a clone is called on this object, clone our - * type and fqsen so that they survive copies intact - * - * @return null - */ - public function __clone() - { - $this->context = clone($this->context); - } - - /** - * @return string - * The (not fully-qualified) name of this element. - */ - public function getName() : string - { - return $this->name; - } - - /** - * @return UnionType - * Get the type of this structural element - */ - public function getUnionType() : UnionType - { - return $this->type; - } - - /** - * @param UnionType $type - * Set the type of this element - * - * TODO: A helper addUnionType(), accounting for variadic - * - * @return void - */ - public function setUnionType(UnionType $type) - { - $this->type = $type; - } - - /** - * Variables can't be variadic. This is the same as getUnionType for - * variables, but not necessarily for subclasses. Method will return - * the element type (such as `DateTime`) for variadic parameters. - */ - public function getNonVariadicUnionType() : UnionType - { - return $this->getUnionType(); - } - - /** - * @return int - */ - public function getFlags() : int - { - return $this->flags; - } - - /** - * @param int $flag - * The flag we'd like to get the state for - * - * @return bool - * True if all bits in the flag are enabled in the bit - * vector, else false. - */ - public function getFlagsHasState(int $flag) : bool - { - return ($this->flags & $flag) === $flag; - } - - - /** - * @param int $flags - * - * @return void - */ - public function setFlags(int $flags) - { - $this->flags = $flags; - } - - /** - * @return int - */ - public function getPhanFlags() : int - { - return $this->phan_flags; - } - - /** - * @param int $flag - * The flag we'd like to get the state for - * - * @return bool - * True if all bits in the flag are enabled in the bit - * vector, else false. - */ - public function getPhanFlagsHasState(int $flag) : bool - { - return ($this->phan_flags & $flag) === $flag; - } - - /** - * @param int $phan_flags - * - * @return void - */ - public function setPhanFlags(int $phan_flags) - { - $this->phan_flags = $phan_flags; - } - - /** - * @param int $bits combination of flags from Flags::* constants to enable - * - * @return void - */ - public function enablePhanFlagBits(int $bits) - { - $this->phan_flags |= $bits; - } - - /** - * @param int $bits combination of flags from Flags::* constants to disable - * - * @return void - * @suppress PhanUnreferencedPublicMethod keeping this for consistency - */ - public function disablePhanFlagBits(int $bits) - { - $this->phan_flags &= (~$bits); - } - - /** - * @return Context - * The context in which this structural element exists - */ - public function getContext() : Context - { - return $this->context; - } - - /** - * @return FileRef - * A reference to where this element was found - */ - public function getFileRef() : FileRef - { - // TODO: Kill the context and make this a pure - // FileRef. - return $this->context; - } - - /** - * @return bool - * True if this element is marked as deprecated - */ - public function isDeprecated() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_DEPRECATED); - } - - /** - * @param bool $is_deprecated - * Set this element as deprecated - * - * @return void - */ - public function setIsDeprecated(bool $is_deprecated) - { - $this->setPhanFlags(Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_DEPRECATED, - $is_deprecated - )); - } - - /** - * @param string[] $suppress_issue_list a list - * Set the list of issue names to suppress - * - * @return void - * @deprecated - * @suppress PhanUnreferencedPublicMethod - */ - public function setSuppressIssueList(array $suppress_issue_list) - { - $this->suppress_issue_list = []; - foreach ($suppress_issue_list as $issue_name) { - $this->suppress_issue_list[$issue_name] = 0; - } - } - - /** - * Set the set of issue names to suppress. - * If the values are 0, the suppressions haven't been used yet. - * - * @param array<string,int> $suppress_issue_set - * @return void - */ - public function setSuppressIssueSet(array $suppress_issue_set) - { - $this->suppress_issue_list = $suppress_issue_set; - } - - /** - * @return array<string,int> - */ - public function getSuppressIssueList() : array - { - return $this->suppress_issue_list ?: []; - } - - /** - * Increments the number of times $issue_name was suppressed. - * @return void - */ - public function incrementSuppressIssueCount(string $issue_name) - { - ++$this->suppress_issue_list[$issue_name]; - } - - /** - * @return bool - * True if this element would like to suppress the given - * issue name - * @see self::checkHasSuppressIssueAndIncrementCount() for the most common usage - */ - public function hasSuppressIssue(string $issue_name) : bool - { - return isset($this->suppress_issue_list[$issue_name]); - } - - /** - * @return bool - * True if this element would like to suppress the given - * issue name. - * - * If this is true, this automatically calls incrementSuppressIssueCount. - * Most callers should use this, except for uses similar to UnusedSuppressionPlugin. - */ - public function checkHasSuppressIssueAndIncrementCount(string $issue_name) : bool - { - if ($this->hasSuppressIssue($issue_name)) { - $this->incrementSuppressIssueCount($issue_name); - return true; - } - return false; - } - - /** - * @return bool - * True if this was an internal PHP object - */ - public function isPHPInternal() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_PHP_INTERNAL); - } - - /** - * @return void - */ - private function setIsPHPInternal(bool $is_internal) - { - $this->setPhanFlags( - Flags::bitVectorWithState( - $this->getPhanFlags(), - Flags::IS_PHP_INTERNAL, - $is_internal - ) - ); - } - - /** - * This method must be called before analysis - * begins. - * - * @return void - */ - public function hydrate(CodeBase $unused_code_base) - { - // Do nothing unless overridden - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/TypedElementInterface.php b/vendor/phan/phan/src/Phan/Language/Element/TypedElementInterface.php deleted file mode 100644 index 1bf8ec9..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/TypedElementInterface.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\Language\FileRef; -use Phan\Language\UnionType; - -/** - * Any PHP structural element that also has a type and is - * addressable such as a class, method, closure, property, - * constant, variable, ... - */ -interface TypedElementInterface -{ - /** - * @return string - * The (not fully-qualified) name of this element. - */ - public function getName() : string; - - /** - * @return UnionType - * Get the type of this structural element - */ - public function getUnionType() : UnionType; - - /** - * Set the type of this element - * @param UnionType $type - * - * @return void - */ - public function setUnionType(UnionType $type); - - /** - * @return FileRef - * A reference to where this element was found - */ - public function getFileRef() : FileRef; -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/UnaddressableTypedElement.php b/vendor/phan/phan/src/Phan/Language/Element/UnaddressableTypedElement.php deleted file mode 100644 index ba78bf9..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/UnaddressableTypedElement.php +++ /dev/null @@ -1,226 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\Language\FileRef; -use Phan\Language\UnionType; - -/** - * Any PHP structural element that also has a type and is - * does not store a reference to its context (such as a variable). - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -abstract class UnaddressableTypedElement -{ - /** - * @var FileRef - * Reference to the file and line number in which the structural element lives - */ - private $file_ref; - - /** - * @var string - * The name of the typed structural element - */ - private $name; - - /** - * @var UnionType - * A set of types satisfied by this typed structural - * element. - * Prefer using getUnionType() over $this->type - getUnionType() is overridden by VariadicParameter - */ - protected $type; - - /** - * @var int - * The flags property contains node specific flags. It is - * always defined, but for most nodes it is always zero. - * ast\kind_uses_flags() can be used to determine whether - * a certain kind has a meaningful flags value. - */ - private $flags = 0; - - /** - * @var int - * This property contains node specific flags that - * are internal to Phan. - */ - private $phan_flags = 0; - - /** - * @param FileRef $file_ref - * The Context or FileRef in which the structural element lives - * (Will be converted to FileRef, to avoid creating a reference - * cycle that can't be garbage collected) - * - * @param string $name - * The name of the typed structural element - * - * @param UnionType $type - * A '|' delimited set of types satisfied by this - * typed structural element. - * - * @param int $flags - * The flags property contains node specific flags. It is - * always defined, but for most nodes it is always zero. - * ast\kind_uses_flags() can be used to determine whether - * a certain kind has a meaningful flags value. - */ - public function __construct( - FileRef $file_ref, - string $name, - UnionType $type, - int $flags - ) { - $this->file_ref = FileRef::copyFileRef($file_ref); - $this->name = $name; - $this->type = $type; - $this->flags = $flags; - } - - /** - * @return string - * The (not fully-qualified) name of this element. - */ - public function getName() : string - { - return $this->name; - } - - /** - * @return UnionType - * Get the type of this structural element - */ - public function getUnionType() : UnionType - { - return $this->type; - } - - /** - * @return UnionType - * Get the type of this structural element - * - * @suppress PhanUnreferencedPublicMethod possibly used by PassByReferenceVariable - */ - public function getNonVariadicUnionType() : UnionType - { - return $this->type; - } - - /** - * @param UnionType $type - * Set the type of this element - * - * @return void - */ - public function setUnionType(UnionType $type) - { - $this->type = $type; - } - - /** - * @return void - */ - protected function convertToNullable() - { - // Avoid a redundant clone of nonNullableClone() - $type = $this->type; - if ($type->isEmpty() || $type->containsNullable()) { - return; - } - $this->type = $type->nullableClone(); - } - - /** - * @return int - */ - public function getFlags() : int - { - return $this->flags; - } - - /** - * @param int $flag - * The flag we'd like to get the state for - * - * @return bool - * True if all bits in the flag are enabled in the bit - * vector, else false. - */ - public function getFlagsHasState(int $flag) : bool - { - return ($this->flags & $flag) === $flag; - } - - - /** - * @param int $flags - * - * @return void - * @suppress PhanUnreferencedPublicMethod unused, other modifiers are used by Phan right now - */ - public function setFlags(int $flags) - { - $this->flags = $flags; - } - - /** - * @return int - */ - public function getPhanFlags() : int - { - return $this->phan_flags; - } - - /** - * @param int $flag - * The flag we'd like to get the state for - * - * @return bool - * True if all bits in the flag are enabled in the bit - * vector, else false. - */ - public function getPhanFlagsHasState(int $flag) : bool - { - return ($this->phan_flags & $flag) === $flag; - } - - /** - * @param int $phan_flags - * - * @return void - * @suppress PhanUnreferencedPublicMethod potentially used in the future - */ - public function setPhanFlags(int $phan_flags) - { - $this->phan_flags = $phan_flags; - } - - /** - * @return void - */ - public function enablePhanFlagBits(int $new_bits) - { - $this->phan_flags |= $new_bits; - } - - /** - * @return void - */ - public function disablePhanFlagBits(int $new_bits) - { - $this->phan_flags &= (~$new_bits); - } - - /** - * @return FileRef - * A reference to where this element was found - */ - public function getFileRef() : FileRef - { - return $this->file_ref; - } - - abstract public function __toString() : string; -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/Variable.php b/vendor/phan/phan/src/Phan/Language/Element/Variable.php deleted file mode 100644 index ca14709..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/Variable.php +++ /dev/null @@ -1,245 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use ast\Node; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Exception\IssueException; -use Phan\Language\Context; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * Phan's representation of a Variable, as well as methods for accessing and modifying variables. - * - * This has subclasses for parameters, etc. - */ -class Variable extends UnaddressableTypedElement implements TypedElementInterface -{ - /** - * @access private - * @var array<string,string> - Maps from a built in superglobal name to a UnionType spec string. - * The string array keys **can** be integers in edge cases, but those should be rare. - * (e.g. ${4} = 'x'; adds 4 to $GLOBALS. - * And user-provided input of integer representations of strings as keys would also become integers. - */ - const _BUILTIN_SUPERGLOBAL_TYPES = [ - '_GET' => 'array<string,string|string[]>', - '_POST' => 'array<string,string|string[]>', - '_COOKIE' => 'array<string,string|string[]>', - '_REQUEST' => 'array<string,string|string[]>', - '_SERVER' => 'array<string,mixed>', - '_ENV' => 'array<string,string>', - '_FILES' => 'array<string,array<string,int|string|array<string,int|string>>>', // Can have multiple files with the same name. - '_SESSION' => 'array<string,mixed>', - 'GLOBALS' => 'array<string,mixed>', - 'http_response_header' => 'array<int,string>|null', // Revisit when we implement sub-block type refining - ]; - - /** - * @var array<string,string> - * - * NOTE: The string array keys of superglobals **can** be integers in edge cases, but those should be rare. - * (e.g. ${4} = 'x'; adds 4 to $GLOBALS. - * And user-provided input of integer representations of strings as keys would also become integers. - */ - const _BUILTIN_GLOBAL_TYPES = [ - '_GET' => 'array<string,string|string[]>', - '_POST' => 'array<string,string|string[]>', - '_COOKIE' => 'array<string,string|string[]>', - '_REQUEST' => 'array<string,string|string[]>', - '_SERVER' => 'array<string,mixed>', - '_ENV' => 'array<string,string>', - '_FILES' => 'array<string,array<string,int>>|array<string,array<string,string>>|array<string,array<string,array<int,int>>>|array<string,array<string,array<int,string>>>', // Can have multiple files with the same name. - '_SESSION' => 'array<string,mixed>', - 'GLOBALS' => 'array<string,mixed>', - 'http_response_header' => 'array<int,string>|null', // Revisit when we implement sub-block type refining - 'argv' => 'array<int,string>', - 'argc' => 'int', - ]; - - /** - public function __construct( - FileRef $file_ref, - string $name, - UnionType $type, - int $flags - ) { - parent::__construct( - $file_ref, - $name, - $type, - $flags - ); - } - */ - - /** - * @return bool - * This will always return false in so far as variables - * cannot be passed by reference. - */ - public function isPassByReference() - { - return false; - } - - /** - * @return bool - * This will always return false in so far as variables - * cannot be variadic - */ - public function isVariadic() - { - return false; - } - - /** - * @param Node $node - * An AST_VAR node - * - * @param Context $context - * The context in which the variable is found - * - * @param CodeBase $code_base - * - * @return Variable - * A variable begotten from a node - * - * @throws IssueException - */ - public static function fromNodeInContext( - Node $node, - Context $context, - CodeBase $code_base, - bool $should_check_type = true - ) : Variable { - - $variable_name = (new ContextNode( - $code_base, - $context, - $node - ))->getVariableName(); - - - // Get the type of the assignment - $union_type = $should_check_type - ? UnionTypeVisitor::unionTypeFromNode($code_base, $context, $node) - : UnionType::empty(); - - $variable = new Variable( - $context - ->withLineNumberStart($node->lineno ?? 0), - $variable_name, - $union_type, - 0 - ); - - return $variable; - } - - /** - * @return bool - * True if the variable with the given name is a - * superglobal - * Implies Variable::isHardcodedGlobalVariableWithName($name) is true - */ - public static function isSuperglobalVariableWithName( - string $name - ) : bool { - if (\array_key_exists($name, self::_BUILTIN_SUPERGLOBAL_TYPES)) { - return true; - } - return \in_array($name, Config::getValue('runkit_superglobals')); - } - - /** - * Is $name a valid variable identifier? - */ - public static function isValidIdentifier( - string $name - ) : bool { - return \preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $name) > 0; - } - - /** - * Returns true for all superglobals and variables in globals_type_map. - */ - public static function isHardcodedGlobalVariableWithName( - string $name - ) : bool { - return self::isSuperglobalVariableWithName($name) || - \array_key_exists($name, self::_BUILTIN_GLOBAL_TYPES) || - \array_key_exists($name, Config::getValue('globals_type_map')); - } - - /** - * Returns true for all superglobals (if is_in_global_scope, also for variables in globals_type_map/built in globals) - */ - public static function isHardcodedVariableInScopeWithName( - string $name, - bool $is_in_global_scope - ) : bool { - return $is_in_global_scope ? self::isHardcodedGlobalVariableWithName($name) - : self::isSuperglobalVariableWithName($name); - } - - /** - * @return ?UnionType - * Returns UnionType (Possible with empty set) if and only - * if isHardcodedGlobalVariableWithName is true. Returns null - * otherwise. - */ - public static function getUnionTypeOfHardcodedGlobalVariableWithName( - string $name - ) { - if (\array_key_exists($name, self::_BUILTIN_GLOBAL_TYPES)) { - // More efficient than using context. - return UnionType::fromFullyQualifiedString(self::_BUILTIN_GLOBAL_TYPES[$name]); - } - - if (\array_key_exists($name, Config::getValue('globals_type_map')) - || \in_array($name, Config::getValue('runkit_superglobals')) - ) { - $type_string = Config::getValue('globals_type_map')[$name] ?? ''; - // Want to allow 'resource' or 'mixed' as a type here, - return UnionType::fromStringInContext($type_string, new Context(), Type::FROM_PHPDOC); - } - - return null; - } - - /** - * Variables can't be variadic. This is the same as - * getUnionType for variables, but not necessarily - * for subclasses. Method will return the element - * type (such as `DateTime`) for variadic parameters. - */ - public function getNonVariadicUnionType() : UnionType - { - return parent::getUnionType(); - } - - /** - * @return static - A clone of this object, where isVariadic() is false - * Used for analyzing the context **inside** of this method - */ - public function cloneAsNonVariadic() - { - return clone($this); - } - - public function __toString() : string - { - $string = ''; - - if (!$this->getUnionType()->isEmpty()) { - $string .= "{$this->getUnionType()} "; - } - - return "$string\${$this->getName()}"; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Element/VariadicParameter.php b/vendor/phan/phan/src/Phan/Language/Element/VariadicParameter.php deleted file mode 100644 index aa63589..0000000 --- a/vendor/phan/phan/src/Phan/Language/Element/VariadicParameter.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Element; - -use Phan\Language\Type\GenericArrayType; -use Phan\Language\UnionType; - -/** - * Contains Phan's representation of a variadic parameter of a method declaration, and methods to access/modify/use the variadic parameters. - */ -class VariadicParameter extends Parameter -{ - // __construct inherited from Parameter - - /** - * @return static - non-variadic clone which can be modified. - * @override - */ - public function cloneAsNonVariadic() - { - $result = clone($this); - if (!$result->isCloneOfVariadic()) { - $result->convertToNonVariadic(); - $result->enablePhanFlagBits(Flags::IS_CLONE_OF_VARIADIC); - } - return $result; - } - - /** - * @return void - */ - private function convertToNonVariadic() - { - // Avoid a redundant clone of toGenericArray() - $this->type = $this->getUnionType(); - } - - /** - * @return bool - True when this is a non-variadic clone of a variadic parameter. - * (We avoid bugs by adding new types to a variadic parameter if this is cloned.) - * However, error messages still need to convert variadic parameters to a string. - * @override - */ - public function isCloneOfVariadic() : bool - { - return $this->getPhanFlagsHasState(Flags::IS_CLONE_OF_VARIADIC); - } - - /** - * @return bool - * True if this parameter is variadic, i.e. can - * take an unlimited list of parameters and express - * them as an array. - * @override - */ - public function isVariadic() : bool - { - return true; - } - - /** - * @return bool - * True if this is an optional parameter (true because this is variadic) - * @override - */ - public function isOptional() : bool - { - return true; - } - - /** - * @return bool - * True if this is a required parameter (false because this is variadic) - * @override - */ - public function isRequired() : bool - { - return false; - } - - /** - * Returns the Parameter in the form expected by a caller. - * - * If this parameter is variadic (e.g. `DateTime ...$args`), then this - * would return a parameter with the type of the elements (e.g. `DateTime`) - * - * If this parameter is not variadic, returns $this. - * - * @return static - * @override - */ - public function asNonVariadic() - { - // TODO: Is it possible to cache this while maintaining - // correctness? PostOrderAnalysisVisitor clones the - // value to avoid it being reused. - // - // Also, figure out if the cloning still working correctly - // after this PR for fixing variadic args. Create a single - // Parameter instance for analyzing callers of the - // corresponding method/function. - // e.g. $this->getUnionType() is of type T[] - // $this->non_variadic->getUnionType() is of type T - return new Parameter( - $this->getFileRef(), - $this->getName(), - $this->type, - Flags::bitVectorWithState($this->getFlags(), \ast\flags\PARAM_VARIADIC, false) - ); - } - - /** - * If this Parameter is variadic, calling `getUnionType` - * will return an array type such as `DateTime[]`. This - * method will return the element type (such as `DateTime`) - * for variadic parameters. - */ - public function getNonVariadicUnionType() : UnionType - { - return $this->type; - } - - /** - * If this parameter is variadic (e.g. `DateTime ...$args`), - * then this returns the corresponding array type(s) of $args. - * (e.g. `array<int,DateTime>`) - * - * NOTE: For analyzing the code within a function, - * code should pass $param->cloneAsNonVariadic() instead. - * Modifying/analyzing the clone should work without any bugs. - * - * TODO(Issue #376) : We will probably want to be able to modify - * the underlying variable, e.g. by creating - * `class UnionTypeGenericArrayView extends UnionType`. - * Otherwise, type inference of `...$args` based on the function - * source will be less effective without phpdoc types. - * - * @override - */ - public function getUnionType() : UnionType - { - if (!$this->isCloneOfVariadic()) { - // TODO: Figure out why asNonEmptyGenericArrayTypes() causes test failures - return parent::getUnionType()->asGenericArrayTypes(GenericArrayType::KEY_INT); - } - return $this->type; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/ElementContext.php b/vendor/phan/phan/src/Phan/Language/ElementContext.php deleted file mode 100644 index 1ea003f..0000000 --- a/vendor/phan/phan/src/Phan/Language/ElementContext.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language; - -use Phan\CodeBase; -use Phan\Language\Element\AddressableElement; -use Phan\Language\Element\TypedElement; - -/** - * A context referring to an element that hasn't been created yet. - * This is used when issues can be emitted before an object is added to the codebase. - */ -class ElementContext extends Context -{ - /** @var ?AddressableElement $element */ - private $element; - public function __construct(AddressableElement $element) - { - $this->copyPropertiesFrom($element->getContext()); - $this->element = $element; - } - - public function isInElementScope() : bool - { - return true; - } - - /** - * Manually free the element reference to avoid the gc loop of - * Element -> Parameter -> ElementContext -> Element - * - * (Phan runs without garbage collection for performance reasons) - * @return void - */ - public function freeElementReference() - { - $this->element = null; - } - - public function getElementInScope(CodeBase $code_base) : TypedElement - { - return $this->element ?? parent::getElementInScope($code_base); - } - - public function isInGlobalScope() : bool - { - return false; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/EmptyUnionType.php b/vendor/phan/phan/src/Phan/Language/EmptyUnionType.php deleted file mode 100644 index 0d68fa3..0000000 --- a/vendor/phan/phan/src/Phan/Language/EmptyUnionType.php +++ /dev/null @@ -1,1289 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language; - -use Closure; -use Generator; -use Phan\CodeBase; -use Phan\Exception\CodeBaseException; -use Phan\Exception\IssueException; -use Phan\Language\Element\Clazz; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\TemplateType; - -/** - * NOTE: there may also be instances of UnionType that are empty, due to the constructor being public - * - * @phan-file-suppress PhanUnusedPublicFinalMethodParameter the results don't depend on passed in parameters - */ -final class EmptyUnionType extends UnionType -{ - /** - * An optional list of types represented by this union - * @internal - */ - public function __construct() - { - parent::__construct([], true); - } - - /** - * Use UnionType::empty() instead elsewhere in the codebase. - */ - protected static function instance() : EmptyUnionType - { - static $self = null; - return $self ?? ($self = new EmptyUnionType()); - } - - /** - * @return Type[] - * The list of simple types associated with this - * union type. Keys are consecutive. - * @override - */ - public function getTypeSet() : array - { - return []; - } - - /** - * Add a type name to the list of types - * - * @return UnionType - * @override - */ - public function withType(Type $type) - { - return $type->asUnionType(); - } - - /** - * Returns a new union type - * which removes this type from the list of types, - * keeping the keys in a consecutive order. - * - * Each type in $this->type_set occurs exactly once. - * - * @return UnionType - * @override - */ - public function withoutType(Type $type) - { - return $this; - } - - /** - * @return bool - * True if this union type contains the given named - * type. - * @override - */ - public function hasType(Type $type) : bool - { - return false; - } - - /** - * Returns a union type which add the given types to this type - * - * @return UnionType - * @override - */ - public function withUnionType(UnionType $union_type) - { - return $union_type; - } - - /** - * @return bool - * True if this type has a type referencing the - * class context in which it exists such as 'self' - * or '$this' - * @override - */ - public function hasSelfType() : bool - { - return false; - } - - /** - * @return bool - * True if this union type has any types that are bool/false/true types - * @override - */ - public function hasTypeInBoolFamily() : bool - { - return false; - } - - /** - * Returns the types for which is_bool($x) would be true. - * - * @return UnionType - * A UnionType with known bool types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function getTypesInBoolFamily() : UnionType - { - return $this; - } - - /** - * @param CodeBase $code_base - * The code base to look up classes against - * - * TODO: Defer resolving the template parameters until parse ends. Low priority. - * - * @return UnionType[] - * A map from template type identifiers to the UnionType - * to replace it with - */ - public function getTemplateParameterTypeMap( - CodeBase $code_base - ) : array { - return []; - } - - - /** - * @param UnionType[] $template_parameter_type_map - * A map from template type identifiers to concrete types - * - * @return UnionType - * This UnionType with any template types contained herein - * mapped to concrete types defined in the given map. - */ - public function withTemplateParameterTypeMap( - array $template_parameter_type_map - ) : UnionType { - return $this; - } - - /** - * @return bool - * True if this union type has any types that are generic - * types - * @override - */ - public function hasTemplateType() : bool - { - return false; - } - - /** @override */ - public function hasTemplateTypeRecursive() : bool - { - return false; - } - - /** @override */ - public function withoutTemplateTypeRecursive() : UnionType - { - return $this; - } - - /** - * @return bool - * True if this union type has any types that have generic - * types - * @override - */ - public function hasTemplateParameterTypes() : bool - { - return false; - } - - /** - * @return bool - * True if this type has a type referencing the - * class context 'static'. - * @override - */ - public function hasStaticType() : bool - { - return false; - } - - /** - * @return bool - * True if this type has a type referencing the - * class context 'static' or 'self'. - */ - public function hasStaticOrSelfType() : bool - { - return false; - } - - /** - * @return UnionType - * A new UnionType with any references to 'static' resolved - * in the given context. - */ - public function withStaticResolvedInContext( - Context $context - ) : UnionType { - return $this; - } - - /** - * @return UnionType - * A new UnionType *plus* any references to 'self' (but not 'static') resolved - * in the given context. - */ - public function withAddedClassForResolvedSelf( - Context $context - ) : UnionType { - return $this; - } - - /** - * @return UnionType - * A new UnionType with any references to 'self' (but not 'static') resolved - * in the given context. (the type of 'self' is replaced) - */ - public function withSelfResolvedInContext( - Context $context - ) : UnionType { - return $this; - } - - /** - * @return bool - * True if and only if this UnionType contains - * the given type and no others. - * @override - */ - public function isType(Type $type) : bool - { - return false; - } - - /** - * @return bool - * True if this UnionType is exclusively native - * types - * @override - */ - public function isNativeType() : bool - { - return false; - } - - /** - * @return bool - * True iff this union contains the exact set of types - * represented in the given union type. - * @override - */ - public function isEqualTo(UnionType $union_type) : bool - { - return $union_type->isEmpty(); - } - - /** - * @return bool - * True iff this union contains a type that's also in - * the other union type. - */ - public function hasCommonType(UnionType $union_type) : bool - { - return false; - } - - /** - * @return bool - True if not empty and at least one type is NullType or nullable. - */ - public function containsNullable() : bool - { - return false; - } - - /** - * @return bool - True if empty or at least one type is NullType or nullable. - */ - public function containsNullableOrIsEmpty() : bool - { - return true; - } - - /** - * @return bool - True if not empty, not possibly undefined, and at least one type is NullType or nullable. - */ - public function containsNullableOrUndefined() : bool - { - return false; - } - - /** @override */ - public function nonNullableClone() : UnionType - { - return $this; - } - - /** @override */ - public function nullableClone() : UnionType - { - return $this; - } - - /** @override */ - public function withIsNullable(bool $is_nullable) : UnionType - { - return $this; - } - - /** - * @return bool - True if type set is not empty and at least one type is NullType or nullable or FalseType or BoolType. - * (I.e. the type is always falsey, or both sometimes falsey with a non-falsey type it can be narrowed down to) - * This does not include values such as `IntType`, since there is currently no `NonZeroIntType`. - * @override - */ - public function containsFalsey() : bool - { - return false; - } - - /** @override */ - public function nonFalseyClone() : UnionType - { - return $this; - } - - /** - * @return bool - True if type set is not empty and at least one type is NullType or nullable or FalseType or BoolType. - * (I.e. the type is always falsey, or both sometimes falsey with a non-falsey type it can be narrowed down to) - * This does not include values such as `IntType`, since there is currently no `NonZeroIntType`. - * @override - */ - public function containsTruthy() : bool - { - return false; - } - - /** @override */ - public function nonTruthyClone() : UnionType - { - return $this; - } - - /** - * @return bool - True if type set is not empty and at least one type is BoolType or FalseType - * @override - */ - public function containsFalse() : bool - { - return false; - } - - /** - * @return bool - True if type set is not empty and at least one type is BoolType or TrueType - * @override - */ - public function containsTrue() : bool - { - return false; - } - - public function nonFalseClone() : UnionType - { - return $this; - } - - public function nonTrueClone() : UnionType - { - return $this; - } - - public function isExclusivelyNarrowedFormOf(CodeBase $code_base, UnionType $other) : bool - { - return $other->isEmpty(); - } - - /** - * @param Type[] $type_list - * A list of types - * - * @return bool - * True if this union type contains any of the given - * named types - */ - public function hasAnyType(array $type_list) : bool - { - return false; - } - - /** - * @return bool - * True if this type has any subtype of `iterable` type (e.g. Traversable, Array). - */ - public function hasIterable() : bool - { - return false; - } - - /** - * @return int - * The number of types in this union type - */ - public function typeCount() : int - { - return 0; - } - - /** - * @return bool - * True if this Union has no types - */ - public function isEmpty() : bool - { - return true; - } - - /** - * @param UnionType $target - * The type we'd like to see if this type can cast - * to - * - * @param CodeBase $code_base - * The code base used to expand types - * - * @return bool - * Test to see if this type can be cast to the - * given type after expanding both union types - * to include all ancestor types - * - * TODO: ensure that this is only called after the parse phase is over. - */ - public function canCastToExpandedUnionType( - UnionType $target, - CodeBase $code_base - ) : bool { - return true; // Empty can cast to anything. - } - - /** - * @param UnionType $target - * A type to check to see if this can cast to it - * - * @return bool - * True if this type is allowed to cast to the given type - * i.e. int->float is allowed while float->int is not. - */ - public function canCastToUnionType( - UnionType $target - ) : bool { - return true; // Empty can cast to anything. See parent implementation. - } - - /** - * Precondition: $this->canCastToUnionType() is false. - * - * This tells us if it would have succeeded if the source type was not nullable. - * - * @internal - * @override - */ - public function canCastToUnionTypeIfNonNull(UnionType $target) : bool - { - return false; - } - - public function canCastToUnionTypeHandlingTemplates( - UnionType $target, - CodeBase $code_base - ) : bool { - return true; - } - - /** - * @return bool - * True if all types in this union are scalars - */ - public function isScalar() : bool - { - return false; - } - - /** - * @return bool - * True if any types in this union are a printable scalar, or this is the empty union type - */ - public function hasPrintableScalar() : bool - { - return true; - } - - /** - * @return bool - * True if any types in this union are a printable scalar, or this is the empty union type - */ - public function hasValidBitwiseOperand() : bool - { - return true; - } - - /** - * @return bool - * True if this union has array-like types (is of type array, is - * a generic array, or implements ArrayAccess). - */ - public function hasArrayLike() : bool - { - return false; - } - - public function asArrayOrArrayAccessSubTypes(CodeBase $unused_code_base) : UnionType - { - return $this; - } - - /** - * @return bool - * True if this union has array-like types (is of type array, is - * a generic array, or implements ArrayAccess). - */ - public function hasGenericArray() : bool - { - return false; - } - - /** - * @return bool - * True if this union contains the ArrayAccess type. - * (Call asExpandedTypes() first to check for subclasses of ArrayAccess) - */ - public function hasArrayAccess() : bool - { - return false; - } - - /** - * @return bool - * True if this union contains the Traversable type. - * (Call asExpandedTypes() first to check for subclasses of Traversable) - */ - public function hasTraversable() : bool - { - return false; - } - - /** - * @return bool - * True if this union type represents types that are - * array-like, and nothing else (e.g. can't be null). - * If any of the array-like types are nullable, this returns false. - */ - public function isExclusivelyArrayLike() : bool - { - return false; - } - - /** - * @return bool - * True if this union type represents types that are arrays - * or generic arrays, but nothing else. - * @override - */ - public function isExclusivelyArray() : bool - { - return false; - } - - /** - * @return UnionType - * Get the subset of types which are not native - */ - public function nonNativeTypes() : UnionType - { - return $this; - } - - /** - * A memory efficient way to create a UnionType from a filter operation. - * If this the filter preserves everything, returns $this instead - */ - public function makeFromFilter(Closure $cb) : UnionType - { - return $this; // filtering empty results in empty - } - - /** - * @param Context $context - * The context in which we're resolving this union - * type. - * - * @return Generator<FullyQualifiedClassName> - * @suppress PhanTypeMismatchGeneratorYieldValue (deliberate empty stub code) - * - * A list of class FQSENs representing the non-native types - * associated with this UnionType - * - * @throws CodeBaseException - * An exception is thrown if a non-native type does not have - * an associated class - * - * @throws IssueException - * An exception is thrown if static is used as a type outside of an object - * context - * - * TODO: Add a method to ContextNode to directly get FQSEN instead? - */ - public function asClassFQSENList( - Context $context - ) { - if (false) { - yield; - } - } - - /** - * @param CodeBase $code_base - * The code base in which to find classes - * - * @param Context $context - * The context in which we're resolving this union - * type. - * - * @return Generator<Clazz> - * - * A list of classes representing the non-native types - * associated with this UnionType - * - * @throws CodeBaseException - * An exception is thrown if a non-native type does not have - * an associated class - * - * @throws IssueException - * An exception is thrown if static is used as a type outside of an object - * context - */ - public function asClassList( - CodeBase $code_base, - Context $context - ) { - yield from []; - } - - /** - * Takes "a|b[]|c|d[]|e" and returns "a|c|e" - * - * @return UnionType - * A UnionType with generic array types filtered out - * - * @override - */ - public function nonGenericArrayTypes() : UnionType - { - return $this; - } - - /** - * Takes "a|b[]|c|d[]|e" and returns "b[]|d[]" - * - * @return UnionType - * A UnionType with generic array types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function genericArrayTypes() : UnionType - { - return $this; - } - - /** - * Takes "MyClass|int|array|?object" and returns "MyClass|?object" - * - * @return UnionType - * A UnionType with known object types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function objectTypes() : UnionType - { - return $this; - } - - /** - * Takes "MyClass|int|array|?object" and returns "MyClass|?object" - * - * @return UnionType - * A UnionType with known object types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function objectTypesWithKnownFQSENs() : UnionType - { - return $this; - } - - /** - * Returns true if objectTypes would be non-empty. - * - * @return bool - */ - public function hasObjectTypes() : bool - { - return false; - } - - /** - * Returns the types for which is_scalar($x) would be true. - * This means null/nullable is removed. - * Takes "MyClass|int|?bool|array|?object" and returns "int|bool" - * Takes "?MyClass" and returns an empty union type. - * - * @return UnionType - * A UnionType with known scalar types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function scalarTypes() : UnionType - { - return $this; - } - - /** - * Returns the types for which is_callable($x) would be true. - * TODO: Check for __invoke()? - * Takes "Closure|false" and returns "Closure" - * Takes "?MyClass" and returns an empty union type. - * - * @return UnionType - * A UnionType with known callable types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function callableTypes() : UnionType - { - return $this; - } - - /** - * Returns true if this has one or more callable types - * TODO: Check for __invoke()? - * Takes "Closure|false" and returns true - * Takes "?MyClass" and returns false - * - * @return bool - * A UnionType with known callable types kept, other types filtered out. - * - * @see self::callableTypes() - * - * @override - */ - public function hasCallableType() : bool - { - return false; // has no types - } - - /** - * Returns the types for which is_int($x) would be true. - * - * @return UnionType - * A UnionType with known int types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function intTypes() : UnionType - { - return $this; - } - - /** - * Returns the types for which is_string($x) would be true. - * - * @return UnionType - * A UnionType with known string types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function stringTypes() : UnionType - { - return $this; - } - - /** - * Returns the types for which is_numeric($x) is possibly true. - * - * @return UnionType - * A UnionType with known numeric types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function numericTypes() : UnionType - { - return $this; - } - - /** - * Returns true if every type in this type is callable. - * TODO: Check for __invoke()? - * Takes "callable" and returns true - * Takes "callable|false" and returns false - * - * @return bool - * A UnionType with known callable types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function isExclusivelyCallable() : bool - { - return true; // !$this->hasTypeMatchingCallback(empty) - } - - /** - * Takes "a|b[]|c|d[]|e|array|ArrayAccess" and returns "a|c|e|ArrayAccess" - * - * @return UnionType - * A UnionType with generic types(as well as the non-generic type "array") - * filtered out. - * - * @see nonGenericArrayTypes - */ - public function nonArrayTypes() : UnionType - { - return $this; - } - - public function arrayTypes() : UnionType - { - return $this; - } - - /** - * @return bool - * True if this is exclusively generic types - */ - public function isGenericArray() : bool - { - return false; // empty - } - - /** - * @return bool - * True if any of the types in this UnionType made $matcher_callback return true - */ - public function hasTypeMatchingCallback(Closure $matcher_callback) : bool - { - return false; - } - - /** - * @return Type|false - * Returns the first type in this UnionType made $matcher_callback return true - */ - public function findTypeMatchingCallback(Closure $matcher_callback) - { - return false; // empty, no types - } - - /** - * Takes "a|b[]|c|d[]|e" and returns "b|d" - * - * @return UnionType - * The subset of types in this - */ - public function genericArrayElementTypes() : UnionType - { - return $this; // empty - } - - /** - * Takes "b|d[]" and returns "b[]|d[][]" - * - * @param int $key_type - * Corresponds to the type of the array keys. Set this to a GenericArrayType::KEY_* constant. - * - * @return UnionType - * The subset of types in this - */ - public function elementTypesToGenericArray(int $key_type) : UnionType - { - return $this; - } - - /** - * @param Closure(Type):Type $closure - * A closure mapping `Type` to `Type` - * - * @return UnionType - * A new UnionType with each type mapped through the - * given closure - * @override - */ - public function asMappedUnionType(Closure $closure) : UnionType - { - return $this; // empty - } - - /** - * @param Closure(UnionType):UnionType $closure - * @override - */ - public function withMappedElementTypes(Closure $closure) : UnionType - { - return $this; - } - - /** - * @param int $key_type - * Corresponds to the type of the array keys. Set this to a GenericArrayType::KEY_* constant. - * - * @return UnionType - * Get a new type for each type in this union which is - * the generic array version of this type. For instance, - * 'int|float' will produce 'int[]|float[]'. - * - * If $this is an empty UnionType, this method will produce an empty UnionType - */ - public function asGenericArrayTypes(int $key_type) : UnionType - { - return $this; // empty - } - - /** - * @return UnionType - * Get a new type for each type in this union which is - * the generic array version of this type. For instance, - * 'int|float' will produce 'int[]|float[]'. - * - * If $this is an empty UnionType, this method will produce 'array' - */ - public function asNonEmptyGenericArrayTypes(int $key_type) : UnionType - { - return ArrayType::instance(false)->asUnionType(); - } - - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param int $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands all class types to all inherited classes returning - * a superset of this type. - */ - public function asExpandedTypes( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - return $this; - } - - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param int $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands all class types to all inherited classes returning - * a superset of this type. - */ - public function asExpandedTypesPreservingTemplate( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - return $this; - } - - public function replaceWithTemplateTypes(UnionType $template_union_type) : UnionType - { - return $template_union_type; - } - - public function hasTypeWithFQSEN(Type $other) : bool - { - return false; - } - - public function getTypesWithFQSEN(Type $other) : UnionType - { - return $this; - } - - /** - * As per the Serializable interface - * - * @return string - * A serialized representation of this type - * - * @see \Serializable - */ - public function serialize() : string - { - return ''; - } - - /** - * @return string - * A human-readable string representation of this union - * type - */ - public function __toString() : string - { - return ''; - } - - /** - * @return UnionType - A normalized version of this union type (May or may not be the same object, if no modifications were made) - * - * The following normalization rules apply - * - * 1. If one of the types is null or nullable, convert all types to nullable and remove "null" from the union type - * 2. If both "true" and "false" (possibly nullable) coexist, or either coexists with "bool" (possibly nullable), - * then remove "true" and "false" - */ - public function asNormalizedTypes() : UnionType - { - return $this; - } - - public function hasTopLevelArrayShapeTypeInstances() : bool - { - return false; - } - - /** @override */ - public function hasArrayShapeOrLiteralTypeInstances() : bool - { - return false; - } - - /** @override */ - public function hasArrayShapeTypeInstances() : bool - { - return false; - } - - /** @override */ - public function hasMixedType() : bool - { - return false; - } - - /** @override */ - public function withFlattenedArrayShapeTypeInstances() : UnionType - { - return $this; - } - - /** @override */ - public function withFlattenedArrayShapeOrLiteralTypeInstances() : UnionType - { - return $this; - } - - public function hasPossiblyObjectTypes() : bool - { - return false; - } - - public function isExclusivelyBoolTypes() : bool - { - return false; - } - - public function generateUniqueId() : string - { - return ''; - } - - public function hasTopLevelNonArrayShapeTypeInstances() : bool - { - return false; - } - - public function shouldBeReplacedBySpecificTypes() : bool - { - return true; - } - - /** - * @param int|string|float|bool $field_key - */ - public function withoutArrayShapeField($field_key) : UnionType - { - return $this; - } - - public function withoutSubclassesOf(CodeBase $code_base, Type $object_type) : UnionType - { - return $this; - } - - public function canStrictCastToUnionType(CodeBase $code_base, UnionType $target) : bool - { - return true; - } - - public function hasArray() : bool - { - return false; - } - - public function hasClassWithToStringMethod(CodeBase $code_base, Context $context) : bool - { - return false; - } - - /** @suppress PhanThrowTypeAbsentForCall */ - public function asGeneratorTemplateType() : Type - { - return Type::fromFullyQualifiedString('\Generator'); - } - - public function iterableKeyUnionType(CodeBase $unused_code_base) : UnionType - { - return $this; - } - - public function iterableValueUnionType(CodeBase $unused_code_base) : UnionType - { - return $this; - } - - /** - * @return Generator<Type,Type> - * @suppress PhanTypeMismatchGeneratorYieldValue (deliberate empty stub code) - * @suppress PhanTypeMismatchGeneratorYieldKey (deliberate empty stub code) - */ - public function getReferencedClasses() : Generator - { - if (false) { - yield; - } - } - - public function hasNonNullIntType() : bool - { - return false; - } - - public function isNonNullIntType() : bool - { - return false; - } - - public function isNonNullNumberType() : bool - { - return false; - } - - public function hasStringType() : bool - { - return false; - } - - public function hasNonNullStringType() : bool - { - return false; - } - - public function isNonNullStringType() : bool - { - return false; - } - - public function hasLiterals() : bool - { - return false; - } - - public function asNonLiteralType() : UnionType - { - return $this; - } - - public function applyUnaryMinusOperator() : UnionType - { - return $this; - } - - public function applyUnaryBitwiseNotOperator() : UnionType - { - return IntType::instance(false)->asUnionType(); - } - - public function applyUnaryPlusOperator() : UnionType - { - return UnionType::fromFullyQualifiedString('int|float'); - } - - /** @return null */ - public function asSingleScalarValueOrNull() - { - return null; - } - - public function asSingleScalarValueOrNullOrSelf() - { - return $this; - } - - public function asValueOrNullOrSelf() - { - return $this; - } - - public function asStringScalarValues() : array - { - return []; - } - - public function asIntScalarValues() : array - { - return []; - } - - public function asScalarValues() : array - { - return []; - } - - public function containsDefiniteNonObjectType() : bool - { - return false; - } - - public function containsDefiniteNonObjectAndNonClassType() : bool - { - return false; - } - - public function containsDefiniteNonCallableType() : bool - { - return false; - } - - public function hasPossiblyCallableType() : bool - { - return true; - } - - public function getTypeAfterIncOrDec() : UnionType - { - return $this; - } - - public function getTemplateTypeExtractorClosure(CodeBase $code_base, TemplateType $template_type) - { - return null; - } - - public function usesTemplateType(TemplateType $template_type) : bool - { - return false; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN.php b/vendor/phan/phan/src/Phan/Language/FQSEN.php deleted file mode 100644 index ab828d0..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language; - -/** - * A Fully-Qualified Structural Element Name - */ -interface FQSEN -{ - - /** - * Constructs an FQSEN from a FQSEN string such as '\Namespace\Class::method' or - * 'Class' or 'Class::method'. - * - * The case depends on the case of the first FQSEN string this was called with. - * - * @param string $fully_qualified_string - * - * @return static - */ - public static function fromFullyQualifiedString( - string $fully_qualified_string - ); - - /** - * Constructs an FQSEN from an FQSEN string such as '\Namespace\Class::method' or - * 'Class' or 'Class::method', using namespace uses from the current context. - * - * @param string $fqsen_string - * - * @param Context $context - * The context in which the FQSEN string was found - * - * @return static - */ - public static function fromStringInContext( - string $fqsen_string, - Context $context - ); - - /** - * @return string - * The class associated with this FQSEN or - * null if not defined - */ - public function getName() : string; - - /** - * @return string - * The canonical representation of the name of the object. Functions - * and Methods, for instance, lowercase their names. - */ - public static function canonicalName(string $name) : string; - - /** - * @return static - * Get the canonical (non-alternate) FQSEN associated - * with this FQSEN - */ - public function getCanonicalFQSEN(); - - /** - * @return string - * A string representation of this fully-qualified - * structural element name. - */ - public function __toString() : string; -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/AbstractFQSEN.php b/vendor/phan/phan/src/Phan/Language/FQSEN/AbstractFQSEN.php deleted file mode 100644 index 122f092..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/AbstractFQSEN.php +++ /dev/null @@ -1,124 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -use Error; -use Phan\Language\Context; -use Phan\Language\FQSEN; -use Serializable; - -/** - * A Fully-Qualified Name - * - * Serialization and cloning are forbidden. - */ -abstract class AbstractFQSEN implements FQSEN, Serializable -{ - - /** - * @var string - * The name of this structural element - */ - private $name = ''; - - /** - * @param string $name - * The name of this structural element - */ - protected function __construct(string $name) - { - $this->name = $name; - } - - /** - * @param string $fully_qualified_string - * An FQSEN string like '\Namespace\Class::method' or - * 'Class' or 'Class::method'. - * - * @return FQSEN - */ - abstract public static function fromFullyQualifiedString( - string $fully_qualified_string - ); - - /** - * @param string $fqsen_string - * An FQSEN string like '\Namespace\Class::method' or - * 'Class' or 'Class::method'. - * - * @param Context $context - * The context in which the FQSEN string was found - * - * @return FQSEN - */ - abstract public static function fromStringInContext( - string $fqsen_string, - Context $context - ); - - /** - * @return string - * The class associated with this FQSEN - */ - public function getName() : string - { - return $this->name; - } - - /** - * @return string - * The canonical representation of the name of the object. Functions - * and Methods, for instance, lowercase their names. - */ - public static function canonicalName(string $name) : string - { - return $name; - } - - /** - * @return string - * The canonical representation of the name of the object, - * for use in array key lookups for singletons, namespace maps, etc. - * This should not be used directly or indirectly in issue output - * If an FQSEN is case-sensitive, this should return $name - */ - public static function canonicalLookupKey(string $name) : string - { - return \strtolower($name); - } - - /** - * @return string - * A string representation of this fully-qualified - * structural element name. - */ - abstract public function __toString() : string; - - /** - * @throws Error to prevent accidentally calling this - */ - public function __clone() - { - // We compare and look up FQSENs by their identity - throw new Error("cloning an FQSEN (" . (string)$this . ") is forbidden\n"); - } - - /** - * @throws Error to prevent accidentally calling this - */ - public function serialize() - { - // We compare and look up FQSENs by their identity - throw new Error("serializing an FQSEN (" . (string)$this . ") is forbidden\n"); - } - - /** - * @param string $unused_serialized - * @throws Error to prevent accidentally calling this - */ - public function unserialize($unused_serialized) - { - // We compare and look up FQSENs by their identity - throw new Error("unserializing an FQSEN ($unused_serialized) is forbidden\n"); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/Alternatives.php b/vendor/phan/phan/src/Phan/Language/FQSEN/Alternatives.php deleted file mode 100644 index 1eb1944..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/Alternatives.php +++ /dev/null @@ -1,94 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -use Phan\Language\FQSEN; - -/** - * This trait allows an FQSEN to have an alternate ID for when - * there are multiple colliding definitions of the same name. - * An alternate ID will be appended to a name such as in - * `\Name\Space\class,1` or `\Name\Space\class::function,1` - * or when composed as `\Name\Space\class,1::function,1`. - */ -trait Alternatives -{ - - /** - * Implementers must have a getName() method - */ - abstract public function getName() : string; - - /** - * Implementers should use the \Phan\Memoize trait - * @return void - */ - abstract protected function memoizeFlushAll(); - - /** - * @var int - * An alternate ID for the element for use when - * there are multiple definitions of the element - */ - protected $alternate_id = 0; - - /** - * @return int - * An alternate identifier associated with this - * FQSEN or zero if none if this is not an - * alternative. - */ - public function getAlternateId() : int - { - return $this->alternate_id; - } - - /** - * @return string - * Get the name of this element with its alternate id - * attached - */ - public function getNameWithAlternateId() : string - { - if ($this->alternate_id) { - return "{$this->getName()},{$this->alternate_id}"; - } - - return $this->getName(); - } - - /** - * @return bool - * True if this is an alternate - */ - public function isAlternate() : bool - { - return (0 !== $this->alternate_id); - } - - /** - * @return static - * A FQSEN with the given alternate_id set - * @suppress PhanTypeMismatchDeclaredReturn (static vs FQSEN) - */ - abstract public function withAlternateId( - int $alternate_id - ) : FQSEN; - - /** - * @return static - * Get the canonical (non-alternate) FQSEN associated - * with this FQSEN - * - * @suppress PhanTypeMismatchDeclaredReturn (static vs FQSEN) - * @suppress PhanTypeMismatchReturn (Alternatives is a trait, cannot directly implement the FQSEN interface. Related to #800) - */ - public function getCanonicalFQSEN() : FQSEN - { - if ($this->alternate_id == 0) { - return $this; - } - - return $this->withAlternateId(0); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassConstantName.php b/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassConstantName.php deleted file mode 100644 index 793cb38..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassConstantName.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -/** - * A Fully-Qualified Class Constant Name - */ -class FullyQualifiedClassConstantName extends FullyQualifiedClassElement implements FullyQualifiedConstantName -{ - /** - * @return string - * The canonical representation of the name of the object, - * for use in array key lookups for singletons, namespace maps, etc. - * This should not be used directly or indirectly in issue output - * If an FQSEN is case-sensitive, this should return $name - */ - public static function canonicalLookupKey(string $name) : string - { - return $name; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassElement.php b/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassElement.php deleted file mode 100644 index d00bbd6..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassElement.php +++ /dev/null @@ -1,266 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -use AssertionError; -use InvalidArgumentException; -use Phan\Exception\FQSENException; -use Phan\Language\Context; -use Phan\Language\FQSEN; - -/** - * A Fully-Qualified Class Name - */ -abstract class FullyQualifiedClassElement extends AbstractFQSEN -{ - use \Phan\Language\FQSEN\Alternatives; - use \Phan\Memoize; - - /** - * @var FullyQualifiedClassName - * A fully qualified class name for the class in - * which this element exists - */ - private $fully_qualified_class_name; - - /** - * @param FullyQualifiedClassName $fully_qualified_class_name - * The fully qualified class name of the class in which - * this element exists - * - * @param string $name - * A name if one is in scope or the empty string otherwise. - * - * @param int $alternate_id - * An alternate ID for the element for use when - * there are multiple definitions of the element - */ - protected function __construct( - FullyQualifiedClassName $fully_qualified_class_name, - string $name, - int $alternate_id = 0 - ) { - parent::__construct($name); - - $this->fully_qualified_class_name = - $fully_qualified_class_name; - $this->alternate_id = $alternate_id; - } - - /** - * Construct a fully-qualified class element from the class, - * the element name in the class. - * (and an alternate id to account for duplicate element definitions) - * - * @param FullyQualifiedClassName $fully_qualified_class_name - * The fully qualified class name of the class in which - * this element exists - * - * @param string $name - * A name if one is in scope or the empty string otherwise. - * - * @param int $alternate_id - * An alternate ID for the element for use when - * there are multiple definitions of the element - * - * @return static - * @suppress PhanTypeInstantiateAbstract this error is correct, but this should never be called directly - */ - public static function make( - FullyQualifiedClassName $fully_qualified_class_name, - string $name, - int $alternate_id = 0 - ) { - $name = static::canonicalName($name); - - $key = $fully_qualified_class_name . '::' . $name . ',' . $alternate_id . - '|' . static::class; - - static $cache = []; - return $cache[$key] ?? ($cache[$key] = new static( - $fully_qualified_class_name, - $name, - $alternate_id - )); - } - - /** - * @return static - * Get the canonical (non-alternate) FQSEN associated - * with this FQSEN - */ - public function getCanonicalFQSEN() : FQSEN - { - $old_fully_qualified_class_name = $this->getFullyQualifiedClassName(); - $fully_qualified_class_name = $old_fully_qualified_class_name->getCanonicalFQSEN(); - if ($this->alternate_id == 0 && $fully_qualified_class_name === $old_fully_qualified_class_name) { - return $this; - } - return static::make( - $fully_qualified_class_name, // @phan-suppress-current-line PhanPartialTypeMismatchArgument - $this->getName(), - 0 - ); - } - - /** - * @param $fully_qualified_string - * An FQSEN string like '\Namespace\Class::methodName' - * - * @return static - * - * @throws InvalidArgumentException if the $fully_qualified_string doesn't have a '::' delimiter - * - * @throws FQSENException if the class or element FQSEN is invalid - */ - public static function fromFullyQualifiedString( - string $fully_qualified_string - ) { - $parts = \explode('::', $fully_qualified_string); - if (\count($parts) !== 2) { - throw new InvalidArgumentException("Fully qualified class element lacks '::' delimiter"); - } - - list( - $fully_qualified_class_name_string, - $name_string - ) = $parts; - - $fully_qualified_class_name = - FullyQualifiedClassName::fromFullyQualifiedString( - $fully_qualified_class_name_string - ); - - // Split off the alternate ID - $parts = \explode(',', $name_string); - $name = $parts[0]; - $alternate_id = (int)($parts[1] ?? 0); - - return static::make( - $fully_qualified_class_name, - $name, - $alternate_id - ); - } - - /** - * @param string $fqsen_string - * An FQSEN string like '\Namespace\Class::methodName' - * - * @param Context $context - * The context in which the FQSEN string was found - * - * @return static - * - * @throws InvalidArgumentException if $fqsen_string is invalid in $context - * - * @throws FQSENException if $fqsen_string is invalid - */ - public static function fromStringInContext( - string $fqsen_string, - Context $context - ) { - $parts = \explode('::', $fqsen_string); - - // Test to see if we have a class defined - if (\count($parts) === 1) { - if (!$context->isInClassScope()) { - throw new InvalidArgumentException("Cannot reference class element without class name when not in class scope."); - } - - $fully_qualified_class_name = $context->getClassFQSEN(); - } else { - if (\count($parts) > 2) { - throw new InvalidArgumentException("Too many '::' in $fqsen_string"); - } - list( - $class_name_string, - $fqsen_string - ) = $parts; - - $fully_qualified_class_name = - FullyQualifiedClassName::fromStringInContext( - $class_name_string, - $context - ); - } - - // Split off the alternate ID - $parts = \explode(',', $fqsen_string); - $name = $parts[0]; - $alternate_id = (int)($parts[1] ?? 0); - - return static::make( - $fully_qualified_class_name, - $name, - $alternate_id - ); - } - - /** - * @return FullyQualifiedClassName - * The fully qualified class name associated with this - * class element. - */ - public function getFullyQualifiedClassName() : FullyQualifiedClassName - { - return $this->fully_qualified_class_name; - } - - /** - * @return static - * A FQSEN with the given alternate_id set - */ - public function withAlternateId( - int $alternate_id - ) { - - if ($alternate_id >= 1000) { - throw new AssertionError("Your alternate IDs have run away"); - } - - return static::make( - $this->getFullyQualifiedClassName(), - $this->getName(), - $alternate_id - ); - } - - /** - * @return string - * A string representation of the given values - */ - public static function toString( - FullyQualifiedClassName $fqsen, - string $name, - int $alternate_id - ) : string { - $fqsen_string = ((string)$fqsen) . '::' . $name; - - if ($alternate_id) { - $fqsen_string .= ",$alternate_id"; - } - - return $fqsen_string; - } - - /** - * @return string - * A string representation of this fully-qualified - * structural element name. - */ - public function __toString() : string - { - $fqsen_string = $this->memoize(__METHOD__, /** @return string */ function () { - return self::toString( - $this->getFullyQualifiedClassName(), - $this->getName(), - $this->alternate_id - ); - }); - - // print $fqsen_string . '|' . spl_object_hash($this) . "\n"; - - return $fqsen_string; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassName.php b/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassName.php deleted file mode 100644 index 637d059..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedClassName.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -use Phan\Exception\FQSENException; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Memoize; - -use function preg_match; - -/** - * A Fully-Qualified Class Name - */ -class FullyQualifiedClassName extends FullyQualifiedGlobalStructuralElement -{ - use Memoize; - - /** - * @return int - * The namespace map type such as \ast\flags\USE_NORMAL or \ast\flags\USE_FUNCTION - */ - protected static function getNamespaceMapType() : int - { - return \ast\flags\USE_NORMAL; - } - - /** - * @return string - * The canonical representation of the name of the object. Functions - * and Methods, for instance, lowercase their names. - * TODO: Separate the function used to render names in phan errors - * from the ones used for generating array keys. - */ - public static function canonicalName(string $name) : string - { - return $name; - } - - /** - * @return FullyQualifiedClassName - * A fully qualified class name from the given type - */ - public static function fromType(Type $type) : FullyQualifiedClassName - { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - return self::fromFullyQualifiedString( - $type->asFQSENString() - ); - } - - /** @internal */ - const VALID_CLASS_REGEX = '/^\\\\?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*$/'; - - /** - * Asserts that something is a valid class FQSEN in PHPDoc. - * Use this for FQSENs passed in from the analyzed code. - * @suppress PhanUnreferencedPublicMethod - */ - public static function isValidClassFQSEN(string $type) : bool - { - return preg_match(self::VALID_CLASS_REGEX, $type) > 0; - } - - /** - * Parses a FQSEN from a string - * - * @param $fully_qualified_string - * An fully qualified string like '\Namespace\Class' - * - * @return static - * - * @throws FQSENException on failure. - * @deprecated use self::fromFullyQualifiedString() - * @suppress PhanUnreferencedPublicMethod - */ - public static function fromFullyQualifiedUserProvidedString(string $fully_qualified_string) : FullyQualifiedClassName - { - return self::fromFullyQualifiedString($fully_qualified_string); - } - - /** - * @return Type - * The type of this class - */ - public function asType() : Type - { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall the creation of FullyQualifiedClassName checks for FQSENException. - return Type::fromFullyQualifiedString( - $this->__toString() - ); - } - - /** - * @return UnionType - * The union type of just this class type - */ - public function asUnionType() : UnionType - { - return $this->asType()->asUnionType(); - } - - /** - * @return FullyQualifiedClassName - * The FQSEN for \stdClass. - */ - public static function getStdClassFQSEN() : FullyQualifiedClassName - { - return self::memoizeStatic(__METHOD__, static function () : FullyQualifiedClassName { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - return self::fromFullyQualifiedString("\stdClass"); - }); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedConstantName.php b/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedConstantName.php deleted file mode 100644 index f480411..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedConstantName.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -use Phan\Language\FQSEN; - -/** - * A Fully-Qualified Constant Name - */ -interface FullyQualifiedConstantName extends FQSEN -{ -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedFunctionLikeName.php b/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedFunctionLikeName.php deleted file mode 100644 index 43d3556..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedFunctionLikeName.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -/** - * A Fully-Qualified Method Name - */ -interface FullyQualifiedFunctionLikeName -{ - /** - * @return bool - * True if this FQSEN represents a closure - */ - public function isClosure() : bool; -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedFunctionName.php b/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedFunctionName.php deleted file mode 100644 index acf4b93..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedFunctionName.php +++ /dev/null @@ -1,118 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -use ast\Node; -use Phan\Exception\EmptyFQSENException; -use Phan\Exception\FQSENException; -use Phan\Language\Context; - -/** - * A Fully-Qualified Function Name - */ -class FullyQualifiedFunctionName extends FullyQualifiedGlobalStructuralElement implements FullyQualifiedFunctionLikeName -{ - - /** - * @return int - * The namespace map type such as \ast\flags\USE_NORMAL or \ast\flags\USE_FUNCTION - */ - protected static function getNamespaceMapType() : int - { - return \ast\flags\USE_FUNCTION; - } - - /** - * @return string - * The canonical representation of the name of the object. Functions - * and Methods, for instance, lowercase their names. - * TODO: Separate the function used to render names in phan errors - * from the ones used for generating array keys. - */ - public static function canonicalName(string $name) : string - { - return $name; - } - - /** - * @param string $fqsen_string - * An FQSEN string like '\Namespace\myfunction' - * - * @param Context $context - * The context in which the FQSEN string was found - * - * @throws FQSENException - * if $fqsen_string has an empty/invalid name component. - */ - public static function fromStringInContext( - string $fqsen_string, - Context $context - ) : FullyQualifiedFunctionName { - - // Check to see if we're fully qualified - if (0 === \strpos($fqsen_string, '\\')) { - return static::fromFullyQualifiedString($fqsen_string); - } - - // Split off the alternate ID - $parts = \explode(',', $fqsen_string); - $fqsen_string = $parts[0]; - $alternate_id = (int)($parts[1] ?? 0); - - $parts = \explode('\\', $fqsen_string); - $name = \array_pop($parts); - - if ($name === '' || $name === false) { - throw new EmptyFQSENException("The name cannot be empty", $fqsen_string); - } - - // Check for a name map - if ($context->hasNamespaceMapFor(static::getNamespaceMapType(), $fqsen_string)) { - return $context->getNamespaceMapFor( - static::getNamespaceMapType(), - $fqsen_string - ); - } - - // For functions we don't use the context's namespace if - // there is no NS on the call. - $namespace = \implode('\\', \array_filter($parts)); - - return static::make( - $namespace, - $name, - $alternate_id - ); - } - - /** - * Generates a deterministic FQSEN for the closure of the passed in node. - * @param Node $node a Node type AST_CLOSURE, within the file $context->getFile() - */ - public static function fromClosureInContext( - Context $context, - Node $node - ) : FullyQualifiedFunctionName { - $hash_material = - $context->getFile() . '|' . - $node->lineno . '|' . - $node->children['__declId']; - - $name = 'closure_' . \substr(\md5($hash_material), 0, 12); - - // @phan-suppress-next-line PhanThrowTypeAbsentForCall this is valid - return static::fromStringInContext( - $name, - $context - ); - } - - /** - * @return bool - * True if this FQSEN represents a closure - */ - public function isClosure() : bool - { - return (\preg_match('/^closure_/', $this->getName()) === 1); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedGlobalConstantName.php b/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedGlobalConstantName.php deleted file mode 100644 index 157968e..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedGlobalConstantName.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -/** - * A Fully-Qualified Constant Name - */ -class FullyQualifiedGlobalConstantName extends FullyQualifiedGlobalStructuralElement implements FullyQualifiedConstantName -{ - /** - * @return int - * The namespace map type such as \ast\flags\USE_NORMAL or \ast\flags\USE_FUNCTION - */ - protected static function getNamespaceMapType() : int - { - return \ast\flags\USE_CONST; - } - - /** - * @return string - * The canonical representation of the name of the object, - * for use in array key lookups for singletons, namespace maps, etc. - * This should not be used directly or indirectly in issue output - * If an FQSEN is case-sensitive, this should return $name - */ - public static function canonicalLookupKey(string $name) : string - { - return $name; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedGlobalStructuralElement.php b/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedGlobalStructuralElement.php deleted file mode 100644 index ae880a8..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedGlobalStructuralElement.php +++ /dev/null @@ -1,403 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -use AssertionError; -use Phan\Exception\EmptyFQSENException; -use Phan\Exception\FQSENException; -use Phan\Exception\InvalidFQSENException; -use Phan\Language\Context; - -use function array_slice; - -/** - * A Fully-Qualified Global Structural Element - */ -abstract class FullyQualifiedGlobalStructuralElement extends AbstractFQSEN -{ - use \Phan\Language\FQSEN\Alternatives; - use \Phan\Memoize; - - /** - * @var string - * The namespace in this elements scope - */ - private $namespace = '\\'; - - /** - * @param string $namespace - * The namespace in this element's scope - * - * @param string $name - * The name of this structural element - * - * @param int $alternate_id - * An alternate ID for the element for use when - * there are multiple definitions of the element - * - * @throws EmptyFQSENException - * if the name component of this FullyQualifiedGlobalStructuralElement is empty - * - * @throws EmptyFQSENException - * if the namespace of this FullyQualifiedGlobalStructuralElement is empty - * - * @throws InvalidFQSENException - * if the namespace begins with an invalid character - */ - protected function __construct( - string $namespace, - string $name, - int $alternate_id = 0 - ) { - if ($name === '') { - throw new EmptyFQSENException("The name of an FQSEN cannot be empty", \rtrim($namespace, '\\') . '\\'); - } - - if ($namespace === '') { - throw new EmptyFQSENException("The namespace cannot be empty", $name); - } - - if ($namespace[0] !== '\\') { - throw new InvalidFQSENException("The first character of a namespace must be \\", $namespace . "\\" . $name); - } - - parent::__construct($name); - $this->namespace = $namespace; - $this->alternate_id = $alternate_id; - } - - /** @internal */ - const VALID_STRUCTURAL_ELEMENT_REGEX = '/^\\\\?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*$/'; - /** @internal */ - const VALID_STRUCTURAL_ELEMENT_REGEX_PART = '/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/'; - - /** - * Construct a fully-qualified global structural element from a namespace and name. - * - * @param string $namespace - * The namespace in this element's scope - * - * @param string $name - * The name of this structural element (additional namespace prefixes here are properly handled) - * - * @param int $alternate_id - * An alternate ID for the element for use when - * there are multiple definitions of the element - * - * @return static - * - * @throws FQSENException on invalid/empty FQSEN - */ - public static function make( - string $namespace, - string $name, - int $alternate_id = 0 - ) { - // Transfer any relative namespace stuff from the - // name to the namespace. - $name_parts = \explode('\\', $name); - $name = (string)\array_pop($name_parts); - if ($name === '') { - throw new EmptyFQSENException( - "Empty name of fqsen", - \rtrim($namespace, "\\") . "\\" . \implode("\\", \array_merge($name_parts, [$name])) - ); - } - foreach ($name_parts as $i => $part) { - if ($part === '') { - if ($i > 0) { - throw new InvalidFQSENException( - "Invalid part '' of fqsen", - \rtrim($namespace, "\\") . "\\" . \implode('\\', \array_merge(array_slice($name_parts, $i), [$name])) - ); - } - continue; - } - if (!\preg_match(self::VALID_STRUCTURAL_ELEMENT_REGEX_PART, $part)) { - throw new InvalidFQSENException( - "Invalid part '$part' of fqsen", - \rtrim($namespace, "\\") . "\\$part\\" . \implode('\\', \array_merge(array_slice($name_parts, $i), [$name])) - ); - } - if ($namespace === '\\') { - $namespace = '\\' . $part; - } else { - $namespace .= '\\' . $part; - } - } - $namespace = self::cleanNamespace($namespace); - if (!\preg_match(self::VALID_STRUCTURAL_ELEMENT_REGEX, \rtrim($namespace, '\\') . '\\' . $name)) { - throw new InvalidFQSENException("Invalid namespaced name", \rtrim($namespace, '\\') . '\\' . $name); - } - - // use the canonicalName for $name instead of strtolower - Some subclasses(constants) are case-sensitive. - $key = static::class . '|' . - static::toString(\strtolower($namespace), static::canonicalLookupKey($name), $alternate_id); - - $fqsen = self::memoizeStatic($key, /** @return FullyQualifiedGlobalStructuralElement */ static function () use ($namespace, $name, $alternate_id) { - return new static( - $namespace, - $name, - $alternate_id - ); - }); - - return $fqsen; - } - - /** - * @param $fully_qualified_string - * An fully qualified string like '\Namespace\Class' - * - * @return static - * - * @throws FQSENException on failure. - */ - public static function fromFullyQualifiedString( - string $fully_qualified_string - ) { - - $key = static::class . '|' . $fully_qualified_string; - - return self::memoizeStatic( - $key, - /** - * @return FullyQualifiedGlobalStructuralElement - * @throws FQSENException - */ - static function () use ($fully_qualified_string) { - // Split off the alternate_id - $parts = \explode(',', $fully_qualified_string); - $fqsen_string = $parts[0]; - $alternate_id = (int)($parts[1] ?? 0); - - $parts = \explode('\\', $fqsen_string); - if ($parts[0] === '') { - \array_shift($parts); - if (\count($parts) === 0) { - throw new EmptyFQSENException("The name cannot be empty", $fqsen_string); - } - } - $name = (string)\array_pop($parts); - - if ($name === '') { - throw new EmptyFQSENException("The name cannot be empty", $fqsen_string); - } - - $namespace = '\\' . \implode('\\', $parts); - if ($namespace !== '\\') { - if (!\preg_match(self::VALID_STRUCTURAL_ELEMENT_REGEX, $namespace)) { - throw new InvalidFQSENException("The namespace $namespace is invalid", $fqsen_string); - } - } elseif (\count($parts) > 0) { - // E.g. from `\\stdClass` with two backslashes - throw new InvalidFQSENException("The namespace cannot have empty parts", $fqsen_string); - } - - return static::make( - $namespace, - $name, - $alternate_id - ); - } - ); - } - - /** - * @param $fqsen_string - * An FQSEN string like '\Namespace\Class' - * - * @param Context $context - * The context in which the FQSEN string was found - * - * @return static - * - * @throws FQSENException if the $fqsen_string is invalid or empty - */ - public static function fromStringInContext( - string $fqsen_string, - Context $context - ) { - // Check to see if we're fully qualified - if (($fqsen_string[0] ?? '') === '\\') { - return static::fromFullyQualifiedString($fqsen_string); - } - $namespace_map_type = static::getNamespaceMapType(); - if ($namespace_map_type === \ast\AST_CONST && \in_array(\strtolower($fqsen_string), ['true', 'false', 'null'], true)) { - return static::fromFullyQualifiedString($fqsen_string); - } - - // Split off the alternate ID - $parts = \explode(',', $fqsen_string); - $fqsen_string = $parts[0]; - $alternate_id = (int)($parts[1] ?? 0); - - $parts = \explode('\\', $fqsen_string); - // Split the parts into the namespace(0 or more components) and the last name. - $name = \array_pop($parts); - - if (!$name) { - throw new InvalidFQSENException("The name cannot be empty", $fqsen_string); - } - - // Check for a name map - if ($context->hasNamespaceMapFor($namespace_map_type, $fqsen_string)) { - return $context->getNamespaceMapFor( - $namespace_map_type, - $fqsen_string - ); - } - - $namespace = \implode('\\', \array_filter($parts)); - - // n.b.: Functions must override this method because - // they don't prefix the namespace for naked - // calls - if (!$namespace) { - $namespace = $context->getNamespace(); - } - - return static::make( - $namespace, - $name, - $alternate_id - ); - } - - /** - * @return int - * The namespace map type such as \ast\flags\USE_NORMAL or \ast\flags\USE_FUNCTION - */ - abstract protected static function getNamespaceMapType() : int; - - /** - * @return string - * The namespace associated with this FQSEN - */ - public function getNamespace() : string - { - return $this->namespace; - } - - /** - * @return string - * The namespace+name associated with this FQSEN. - * (e.g. 'ast\parse_code') - */ - public function getNamespacedName() : string - { - if ($this->namespace === '\\') { - return $this->getName(); - } - return \ltrim($this->namespace, '\\') . '\\' . $this->getName(); - } - - /** - * @return static a copy of this global structural element with a different namespace - * @suppress PhanUnreferencedPublicMethod - */ - public function withNamespace( - string $namespace - ) { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall the class name was already validated - return static::make( - self::cleanNamespace($namespace), - $this->getName(), - $this->getAlternateId() - ); - } - - /** - * @return static - * A FQSEN with the given alternate_id set - */ - public function withAlternateId( - int $alternate_id - ) { - if ($this->getAlternateId() === $alternate_id) { - return $this; - } - - if ($alternate_id >= 1000) { - throw new AssertionError("Your alternate IDs have run away"); - } - - // @phan-suppress-next-line PhanThrowTypeAbsentForCall the class name was already validated - return static::make( - $this->getNamespace(), - $this->getName(), - $alternate_id - ); - } - - /** - * @param string $namespace (can be empty) - * - * @return string - * A cleaned version of the given namespace such that - * its always prefixed with a '\' and never ends in a - * '\', and is the string "\" if there is no namespace. - */ - protected static function cleanNamespace(string $namespace) : string - { - if ($namespace === '' - || $namespace === '\\' - ) { - return '\\'; - } - - // Ensure that the first character of the namespace - // is always a '\' - if ($namespace[0] !== '\\') { - $namespace = '\\' . $namespace; - } - - // Ensure that we don't have a trailing '\' on the - // namespace - return \rtrim($namespace, '\\'); - } - - /** - * @return string - * A string representation of this fully-qualified - * structural element name. - */ - public static function toString( - string $namespace, - string $name, - int $alternate_id - ) : string { - $fqsen_string = $namespace; - - if ($fqsen_string && $fqsen_string !== '\\') { - $fqsen_string .= '\\'; - } - - $fqsen_string .= static::canonicalName($name); - - // Append an alternate ID if we need to disambiguate - // multiple definitions - if ($alternate_id) { - $fqsen_string .= ',' . $alternate_id; - } - - return $fqsen_string; - } - - /** @var string|null caches the value of $this->__toString() */ - private $as_string = null; - - /** - * @return string - * A string representation of this fully-qualified - * structural element name. - */ - public function __toString() : string - { - return $this->as_string ?? $this->as_string = static::toString( - $this->getNamespace(), - $this->getName(), - $this->getAlternateId() - ); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedMethodName.php b/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedMethodName.php deleted file mode 100644 index 9f61128..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedMethodName.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -/** - * A Fully-Qualified Method Name - */ -class FullyQualifiedMethodName extends FullyQualifiedClassElement implements FullyQualifiedFunctionLikeName -{ - /** - * Maps lowercase versions of function names to their canonical names, for magic methods. - * This makes checks for magic method names more reliable. - */ - const CANONICAL_NAMES = [ - '__call' => '__call', - '__callstatic' => '__callStatic', - '__clone' => '__clone', - '__construct' => '__construct', - '__debuginfo' => '__debugInfo', - '__destruct' => '__destruct', - '__get' => '__get', - '__invoke' => '__invoke', - '__isset' => '__isset', - '__set' => '__set', - '__set_state' => '__set_state', - '__sleep' => '__sleep', - '__tostring' => '__toString', - '__unset' => '__unset', - '__wakeup' => '__wakeup', - ]; - - const MAGIC_METHOD_NAME_SET = [ - '__call' => true, - '__callStatic' => true, - '__clone' => true, - '__construct' => true, - '__debugInfo' => true, - '__destruct' => true, - '__get' => true, - '__invoke' => true, - '__isset' => true, - '__set' => true, - '__set_state' => true, - '__sleep' => true, - '__toString' => true, - '__unset' => true, - '__wakeup' => true, - ]; - - /** - * A list of magic methods which should have a return type of void - */ - const MAGIC_VOID_METHOD_NAME_SET = [ - '__clone' => true, - '__construct' => true, - '__destruct' => true, - '__set' => true, - '__unset' => true, - '__wakeup' => true, - ]; - - /** - * @return string - * The canonical representation of the name of the object. Functions - * and Methods, for instance, lowercase their names. - */ - public static function canonicalName(string $name) : string - { - return self::CANONICAL_NAMES[\strtolower($name)] ?? $name; - } - - /** - * @return bool - * True if this FQSEN represents a closure - */ - public function isClosure() : bool - { - return false; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedPropertyName.php b/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedPropertyName.php deleted file mode 100644 index 1d61875..0000000 --- a/vendor/phan/phan/src/Phan/Language/FQSEN/FullyQualifiedPropertyName.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\FQSEN; - -/** - * A Fully-Qualified Property Name - */ -class FullyQualifiedPropertyName extends FullyQualifiedClassElement -{ -} diff --git a/vendor/phan/phan/src/Phan/Language/FileRef.php b/vendor/phan/phan/src/Phan/Language/FileRef.php deleted file mode 100644 index 6c8704a..0000000 --- a/vendor/phan/phan/src/Phan/Language/FileRef.php +++ /dev/null @@ -1,193 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language; - -use Phan\Config; - -/** - * An object representing the context in which any - * structural element (such as a class or method) lives. - */ -class FileRef implements \Serializable -{ - - /** - * @var string - * The path to the file in which this element is defined - */ - protected $file = 'internal'; - - /** - * @var int - * The starting line number of the element within the $file - */ - protected $line_number_start = 0; - - /** - * @var int - * The ending line number of the element within the $file - */ - protected $line_number_end = 0; - - /** - * @param string $file - * The path to the file in which this element is defined - * - * @return static - * This context with the given value is returned - */ - public function withFile(string $file) - { - $context = clone($this); - $context->file = $file; - return $context; - } - - /** - * @return string - * The path to the file in which the element is defined - */ - public function getFile() : string - { - return $this->file; - } - - /** - * @return string - * The path of the file relative to the project - * root directory - */ - public function getProjectRelativePath() : string - { - return self::getProjectRelativePathForPath($this->file); - } - - /** - * @param string $cwd_relative_path (relative or absolute path) - * @return string - * The path of the file relative to the project - * root directory - * @see Config::getProjectRootDirectory() for converting paths to absolute paths - */ - public static function getProjectRelativePathForPath($cwd_relative_path) - { - // Get a path relative to the project root - $path = \str_replace( - Config::getProjectRootDirectory(), - '', - \realpath($cwd_relative_path) ?: $cwd_relative_path - ); - - // Strip any beginning directory separators - if (0 === ($pos = \strpos($path, \DIRECTORY_SEPARATOR))) { - // Work around substr being pedantic - $path = (string)\substr($path, $pos + 1); - } - - return $path; - } - - /** - * @return bool - * True if this object is internal to PHP - */ - public function isPHPInternal() : bool - { - return ('internal' === $this->getFile()); - } - - /** - * @return bool - * True if this object refers to the same file and line number. - */ - public function equals(FileRef $other) : bool - { - return $this->getLineNumberStart() === $other->getLineNumberStart() && $this->getFile() === $other->getFile(); - } - - /** - * @var int $line_number - * The starting line number of the element within the file - * - * @return static - * This context with the given line number is returned - */ - public function withLineNumberStart(int $line_number) - { - $this->line_number_start = $line_number; - return $this; - } - - /** - * @var int $line_number - * The starting line number of the element within the file - * - * @return void - * Both this and withLineNumberStart modify the original context. - */ - public function setLineNumberStart(int $line_number) - { - $this->line_number_start = $line_number; - } - - /** - * @return int - * The starting line number of the element within the file - */ - public function getLineNumberStart() : int - { - return $this->line_number_start; - } - - /** - * @param int $line_number - * The ending line number of the element within the $file - * - * @return static - * This context with the given value is returned - */ - public function withLineNumberEnd(int $line_number) - { - $this->line_number_end = $line_number; - return $this; - } - - /** - * Get a string representation of the context - * - * @return string - */ - public function __toString() : string - { - return $this->file . ':' . $this->line_number_start; - } - - public function serialize() - { - return $this->__toString(); - } - - /** - * @param string $serialized - */ - public function unserialize($serialized) - { - $map = \explode(':', $serialized); - $this->file = $map[0]; - $this->line_number_start = (int)$map[1]; - $this->line_number_end = (int)($map[2] ?? 0); - } - - /** - * @param FileRef $other - An instance of FileRef or a subclass such as Context - * @return FileRef - A plain file ref, with no other information - */ - public static function copyFileRef(FileRef $other) : FileRef - { - $file_ref = new FileRef(); - $file_ref->file = $other->file; - $file_ref->line_number_start = $other->line_number_start; - $file_ref->line_number_end = $other->line_number_end; - return $file_ref; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/FutureUnionType.php b/vendor/phan/phan/src/Phan/Language/FutureUnionType.php deleted file mode 100644 index 4224f2b..0000000 --- a/vendor/phan/phan/src/Phan/Language/FutureUnionType.php +++ /dev/null @@ -1,82 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language; - -use ast\Node; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Exception\IssueException; - -/** - * A FutureUnionType is a UnionType that is lazily loaded. - * Call `get()` in order force the type to be figured. - */ -class FutureUnionType -{ - - /** @var CodeBase The code base within which we're operating */ - private $code_base; - - /** @var Context the context from which we're fetching types for $this->node */ - private $context; - - /** @var Node|string|int|bool|float the node which we will be fetching the type of. */ - private $node; - - /** - * @param CodeBase $code_base - * @param Context $context - * @param Node|string|int|bool|float $node - */ - public function __construct( - CodeBase $code_base, - Context $context, - $node - ) { - $this->code_base = $code_base; - $this->context = $context; - $this->node = $node; - } - - /** - * Force the future to figure out the type of the - * given object or throw an IssueException if it - * is unable to do so - * - * @return UnionType - * The type of the future - * - * @throws IssueException - * An exception is thrown if we are unable to determine - * the type at the time this method is called - */ - public function get() : UnionType - { - return UnionTypeVisitor::unionTypeFromNode( - $this->code_base, - $this->context, - $this->node, - false - ); - } - - /** - * Gets the codebase singleton which created this FutureUnionType. - * (used to resolve class references, constants, etc.) - * @internal (May rethink exposing the codebase in the future) - */ - public function getCodebase() : CodeBase - { - return $this->code_base; - } - - /** - * Gets the context in which this FutureUnionType was created - * (used to resolve class references, constants, etc.) - * @internal (May rethink exposing the codebase in the future) - */ - public function getContext() : Context - { - return $this->context; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Internal/ClassDocumentationMap.php b/vendor/phan/phan/src/Phan/Language/Internal/ClassDocumentationMap.php deleted file mode 100644 index 7ba53e6..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/ClassDocumentationMap.php +++ /dev/null @@ -1,1243 +0,0 @@ -<?php // phpcs:ignoreFile -namespace Phan\Language\Internal; - -/** - * This contains descriptions used by Phan for hover text of internal classes and interfaces - * - * Format - * - * '<class_name>' => 'documentation', - * - * NOTE: This format will very likely change as information is added and should not be used directly. - * - * Sources of function/method summary info: - * - * 1. 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 - * 2. Various websites documenting individual extensions (e.g. php-ast) - * 3. PHPStorm stubs (for anything missing from the above sources) - * - * Available from https://github.com/JetBrains/phpstorm-stubs under the [Apache 2 license](https://www.apache.org/licenses/LICENSE-2.0) - * - * - * CONTRIBUTING: - * - * Running `internal/internalstubs.php` can be used to update signature maps - * - * There are no plans for these signatures to diverge from what the above upstream sources contain. - * - * - If the descriptions cause Phan to crash, bug reports are welcome - * - If Phan improperly extracted text from a summary (and this affects multiple signatures), patches fixing the extraction will be accepted. - * - Otherwise, fixes for typos/grammar/inaccuracies in the summary will only be accepted once they are contributed upstream and can be regenerated (e.g. to the svn repo for docs.php.net). - * - * Note that the summaries are used in a wide variety of contexts (e.g. PHP's online documentation), - * and what makes sense for Phan may not make sense for those projects, and vice versa. - */ -return [ -'AMQPBasicProperties' => 'stub class representing AMQPBasicProperties from pecl-amqp', -'AMQPChannel' => 'stub class representing AMQPChannel from pecl-amqp', -'AMQPChannelException' => 'stub class representing AMQPChannelException from pecl-amqp', -'AMQPConnection' => 'stub class representing AMQPConnection from pecl-amqp', -'AMQPConnectionException' => 'stub class representing AMQPConnectionException from pecl-amqp', -'AMQPDecimal' => 'stub class representing AMQPDecimal from pecl-amqp', -'AMQPEnvelope' => 'stub class representing AMQPEnvelope from pecl-amqp', -'AMQPEnvelopeException' => 'stub class representing AMQPEnvelopeException from pecl-amqp', -'AMQPException' => 'stub class representing AMQPException from pecl-amqp', -'AMQPExchange' => 'stub class representing AMQPExchange from pecl-amqp', -'AMQPExchangeException' => 'stub class representing AMQPExchangeException from pecl-amqp', -'AMQPExchangeValue' => 'stub class representing AMQPExchangeValue from pecl-amqp', -'AMQPQueue' => 'stub class representing AMQPQueue from pecl-amqp', -'AMQPQueueException' => 'stub class representing AMQPQueueException from pecl-amqp', -'AMQPTimestamp' => 'stub class representing AMQPTimestamp from pecl-amqp', -'APCIterator' => 'The `APCIterator` class makes it easier to iterate over large APC caches. This is helpful as it allows iterating over large caches in steps, while grabbing a defined number of entries per lock instance, so it frees the cache locks for other activities rather than hold up the entire cache to grab 100 (the default) entries. Also, using regular expression matching is more efficient as it\'s been moved to the C level.', -'APCUIterator' => 'The `APCUIterator` class makes it easier to iterate over large APCu caches. This is helpful as it allows iterating over large caches in steps, while grabbing a defined number of entries per lock instance, so it frees the cache locks for other activities rather than hold up the entire cache to grab 100 (the default) entries. Also, using regular expression matching is more efficient as it\'s been moved to the C level.', -'AppendIterator' => 'An Iterator that iterates over several iterators one after the other.', -'ArgumentCountError' => '`ArgumentCountError` is thrown when too few arguments are passed to a user-defined function or method.', -'ArithmeticError' => '`ArithmeticError` is thrown when an error occurs while performing mathematical operations. In PHP 7.0, these errors include attempting to perform a bitshift by a negative amount, and any call to `intdiv` that would result in a value outside the possible bounds of an `integer`.', -'ArrayIterator' => 'This iterator allows to unset and modify values and keys while iterating over Arrays and Objects. - -When you want to iterate over the same array multiple times you need to instantiate ArrayObject and let it create ArrayIterator instances that refer to it either by using `foreach` or by calling its getIterator() method manually.', -'ArrayObject' => 'This class allows objects to work as arrays.', -'AssertionError' => '`AssertionError` is thrown when an assertion made via `assert` fails.', -'ast\Metadata' => 'Metadata entry for a single AST kind, as returned by ast\get_metadata().', -'ast\Node' => 'This class describes a single node in a PHP AST.', -'BadFunctionCallException' => 'Exception thrown if a callback refers to an undefined function or if some arguments are missing.', -'BadMethodCallException' => 'Exception thrown if a callback refers to an undefined method or if some arguments are missing.', -'CachingIterator' => 'This object supports cached iteration over another iterator.', -'Cairo' => 'Simple class with some static helper methods.', -'CairoAntialias' => 'Enum class that specifies the type of antialiasing to do when rendering text or shapes.', -'CairoContent' => '`CairoContent` is used to describe the content that a surface will contain, whether color information, alpha information (translucence vs. opacity), or both. - -Note: The large values here are designed to keep `CairoContent` values distinct from `CairoContent` values so that the implementation can detect the error if users confuse the two types.', -'CairoContext' => 'Context is the main object used when drawing with cairo. To draw with cairo, you create a `CairoContext`, set the target `CairoSurface`, and drawing options for the `CairoContext`, create shapes with functions . like `CairoContext::moveTo` and `CairoContext::lineTo`, and then draw shapes with `CairoContext::stroke` or `CairoContext::fill`. Contexts can be pushed to a stack via `CairoContext::save`. They may then safely be changed, without losing the current state. Use `CairoContext::restore` to restore to the saved state.', -'CairoException' => '`Exception` class thrown by `Cairo` functions and methods', -'CairoFillRule' => 'A `CairoFillRule` is used to select how paths are filled. For both fill rules, whether or not a point is included in the fill is determined by taking a ray from that point to infinity and looking at intersections with the path. The ray can be in any direction, as long as it doesn\'t pass through the end point of a segment or have a tricky intersection such as intersecting tangent to the path. (Note that filling is not actually implemented in this way. This is just a description of the rule that is applied.) - -The default fill rule is `CairoFillRule::WINDING`.', -'CairoFilter' => 'A `CairoFilter` is used to indicate what filtering should be applied when reading pixel values from patterns. See `CairoPattern::setSource` or `cairo_pattern_set_source` for indicating the desired filter to be used with a particular pattern.', -'CairoFontFace' => 'CairoFontFace abstract class represents a particular font at a particular weight, slant, and other characteristic but no transformation or size. - -Note: This class can not be instantiated directly, it is created by `CairoContext::getFontFace` or `cairo_scaled_font_get_font_face`.', -'CairoFontOptions' => 'An opaque structure holding all options that are used when rendering fonts. - -Individual features of a cairo_font_options_t can be set or accessed using functions named cairo_font_options_set_feature_name and cairo_font_options_get_feature_name, like cairo_font_options_set_antialias() and cairo_font_options_get_antialias(). - -New features may be added to `CairoFontOptions` in the future. For this reason `CairoFontOptions::copy`, `CairoFontOptions::equal`, `CairoFontOptions::merge`, `CairoFontOptions::hash` (cairo_font_options_copy(), cairo_font_options_equal(), cairo_font_options_merge(), and cairo_font_options_hash() in procedural way) should be used to copy, check for equality, merge, or compute a hash value of `CairoFontOptions` objects.', -'CairoFontSlant' => 'Specifies variants of a font face based on their slant.', -'CairoFontType' => 'CairoFontType class is an abstract final class that contains constants used to describe the type of a given `CairoFontFace` or `CairoScaledFont`. The font types are also known as "font backends" within cairo. - -The type of a CairoFontFace is determined by the how it is created, an example would be the `CairoToyFontFace::__construct`. The `CairoFontFace` type can be queried with `CairoFontFace::getType` or `cairo_font_face_get_type` - -The various `CairoFontFace` functions can be used with a font face of any type. - -The type of a `CairoScaledFont` is determined by the type of the `CairoFontFace` passed to `CairoScaledFont::__construct` or `cairo_scaled_font_create`. The scaled font type can be queried with `CairoScaledFont::getType` or `cairo_scaled_font_get_type`.', -'CairoFontWeight' => 'Specifies variants of a font face based on their weight.', -'CairoFormat' => 'CairoFormat enums are used to identify the memory format of the image data.', -'CairoGradientPattern' => '`CairoGradientPattern` is an abstract base class from which other Pattern classes derive. It cannot be instantiated directly.', -'CairoHintMetrics' => 'Specifies whether to hint font metrics; hinting font metrics means quantizing them so that they are integer values in device space. Doing this improves the consistency of letter and line spacing, however it also means that text will be laid out differently at different zoom factors.', -'CairoHintStyle' => 'Specifies the type of hinting to do on font outlines. Hinting is the process of fitting outlines to the pixel grid in order to improve the appearance of the result. Since hinting outlines involves distorting them, it also reduces the faithfulness to the original outline shapes. Not all of the outline hinting styles are supported by all font backends.', -'CairoImageSurface' => 'CairoImageSurface provide the ability to render to memory buffers either allocated by cairo or by the calling code. The supported image formats are those defined in `CairoFormat`.', -'CairoLinearGradient' => 'Create a new CairoLinearGradient along the line defined', -'CairoLineCap' => 'Specifies how to render the endpoints of the path when stroking. - -The default line cap style is `CairoLineCap::BUTT`.', -'CairoMatrix' => 'Matrices are used throughout cairo to convert between different coordinate spaces.', -'CairoOperator' => 'This is used to set the compositing operator for all cairo drawing operations. - -The default operator is `CairoOperator::OVER` - -The operators marked as unbounded modify their destination even outside of the mask layer (that is, their effect is not bound by the mask layer). However, their effect can still be limited by way of clipping. - -To keep things simple, the operator descriptions here document the behavior for when both source and destination are either fully transparent or fully opaque. The actual implementation works for translucent layers too. For a more detailed explanation of the effects of each operator, including the mathematical definitions, see http://cairographics.org/operators/.', -'CairoPath' => 'Note: CairoPath class cannot be instantiated directly, doing so will result in Fatal Error if used or passed', -'CairoPattern' => '`CairoPattern` is the abstract base class from which all the other pattern classes derive. It cannot be instantiated directly', -'CairoPatternType' => '`CairoPatternType` is used to describe the type of a given pattern. - -The type of a pattern is determined by the function used to create it. The `cairo_pattern_create_rgb` and `cairo_pattern_create_rgba` functions create `CairoPatternType::SOLID` patterns. The remaining cairo_pattern_create_* functions map to pattern types in obvious ways.', -'CairoStatus' => '`CairoStatus` is used to indicate errors that can occur when using Cairo. In some cases it is returned directly by functions. but when using `CairoContext`, the last error, if any, is stored in the object and can be retrieved with `CairoContext::status` or `cairo_status`. New entries may be added in future versions. - -Use `Cairo::statusToString` or `cairo_status_to_string` to get a human-readable representation of an error message.', -'CairoSurface' => 'This is the base-class for all other Surface types. CairoSurface is the abstract type representing all different drawing targets that cairo can render to. The actual drawings are performed using a CairoContext.', -'CairoSvgSurface' => 'Svg specific surface class, uses the SVG (standard vector graphics) surface backend.', -'CairoToyFontFace' => 'The `CairoToyFontFace` class can be used instead of `CairoContext::selectFontFace` to create a toy font independently of a context.', -'chdb' => 'Represents a loaded chdb file.', -'classObj' => 'Class Objects can be returned by the `layerObj`_ class, or can be -created using:', -'clusterObj' => 'Instance of clusterObj is always embedded inside the `layerObj`_.', -'Collator' => 'Provides string comparison capability with support for appropriate locale-sensitive sort orderings.', -'Collectable' => 'Represents a garbage-collectable object.', -'colorObj' => 'Instances of colorObj are always embedded inside other classes.', -'COM' => 'The COM class allows you to instantiate an OLE compatible COM object and call its methods and access its properties.', -'CommonMark\CQL' => 'CommonMark Query Language is a DSL for describing how to travel through a CommonMark Node tree implemented as a parser and compiler for a small set of instructions, and a virtual machine for executing those instructions.', -'CommonMark\Node' => 'Represents an Abstract Node, this final abstract is not for direct use by the programmer.', -'CommonMark\Parser' => 'Provides an incremental parser as an alternative to the simple Parsing API function', -'CompileError' => '`CompileError` is thrown for some compilation errors, which formerly issued a fatal error.', -'Componere\Abstract\Definition' => 'This final abstract represents a class entry, and should not be used by the programmer.', -'Componere\Definition' => 'The Definition class allows the programmer to build and register a type at runtime. - -Should a Definition replace an existing class, the existing class will be restored when the Definition is destroyed.', -'Componere\Method' => 'A Method represents a function with modifiable accessibility flags', -'Componere\Patch' => 'The Patch class allows the programmer to change the type of an instance at runtime without registering a new Definition - -When a Patch is destroyed it is reverted, so that instances that were patched during the lifetime of the Patch are restored to their formal type.', -'Componere\Value' => 'A Value represents a PHP variable of all types, including undefined', -'Cond' => 'The static methods contained in the Cond class provide direct access to Posix Condition Variables.', -'Couchbase\AnalyticsQuery' => 'Represents a Analytics query (currently experimental support).', -'Couchbase\Authenticator' => 'Interface of authentication containers.', -'Couchbase\BooleanFieldSearchQuery' => 'A FTS query that queries fields explicitly indexed as boolean.', -'Couchbase\BooleanSearchQuery' => 'A compound FTS query that allows various combinations of sub-queries.', -'Couchbase\Bucket' => 'Represents connection to the Couchbase Server', -'Couchbase\BucketManager' => 'Provides management capabilities for the Couchbase Bucket', -'Couchbase\ClassicAuthenticator' => 'Authenticator based on login/password credentials. - -This authenticator uses separate credentials for Cluster management interface -as well as for each bucket.', -'Couchbase\Cluster' => 'Represents a Couchbase Server Cluster. - -It is an entry point to the library, and in charge of opening connections to the Buckets. -In addition it can instantiate \Couchbase\ClusterManager to perform cluster-wide operations.', -'Couchbase\ClusterManager' => 'Provides management capabilities for a Couchbase Server Cluster', -'Couchbase\ConjunctionSearchQuery' => 'A compound FTS query that performs a logical AND between all its sub-queries (conjunction).', -'Couchbase\DateRangeSearchFacet' => 'A facet that categorizes hits inside date ranges (or buckets) provided by the user.', -'Couchbase\DateRangeSearchQuery' => 'A FTS query that matches documents on a range of values. At least one bound is required, and the -inclusiveness of each bound can be configured.', -'Couchbase\DisjunctionSearchQuery' => 'A compound FTS query that performs a logical OR between all its sub-queries (disjunction). It requires that a -minimum of the queries match. The minimum is configurable (default 1).', -'Couchbase\DocIdSearchQuery' => 'A FTS query that matches on Couchbase document IDs. Useful to restrict the search space to a list of keys (by using -this in a compound query).', -'Couchbase\Document' => 'Represents Couchbase Document, which stores metadata and the value. - -The instances of this class returned by K/V commands of the \Couchbase\Bucket', -'Couchbase\DocumentFragment' => 'A fragment of a JSON Document returned by the sub-document API.', -'Couchbase\Exception' => 'Exception represeting all errors generated by the extension', -'Couchbase\GeoBoundingBoxSearchQuery' => 'A FTS query which allows to match geo bounding boxes.', -'Couchbase\GeoDistanceSearchQuery' => 'A FTS query that finds all matches from a given location (point) within the given distance. - -Both the point and the distance are required.', -'Couchbase\LookupInBuilder' => 'A builder for subdocument lookups. In order to perform the final set of operations, use the -execute() method. - -Instances of this builder should be obtained through \Couchbase\Bucket->lookupIn()', -'Couchbase\MatchAllSearchQuery' => 'A FTS query that matches all indexed documents (usually for debugging purposes).', -'Couchbase\MatchNoneSearchQuery' => 'A FTS query that matches 0 document (usually for debugging purposes).', -'Couchbase\MatchPhraseSearchQuery' => 'A FTS query that matches several given terms (a "phrase"), applying further processing -like analyzers to them.', -'Couchbase\MatchSearchQuery' => 'A FTS query that matches a given term, applying further processing to it -like analyzers, stemming and even #fuzziness(int).', -'Couchbase\MutateInBuilder' => 'A builder for subdocument mutations. In order to perform the final set of operations, use the -execute() method. - -Instances of this builder should be obtained through \Couchbase\Bucket->mutateIn()', -'Couchbase\MutationState' => 'Container for mutation tokens.', -'Couchbase\MutationToken' => 'An object which contains meta information of the document needed to enforce query consistency.', -'Couchbase\N1qlIndex' => 'Represents N1QL index definition', -'Couchbase\N1qlQuery' => 'Represents a N1QL query', -'Couchbase\NumericRangeSearchFacet' => 'A facet that categorizes hits into numerical ranges (or buckets) provided by the user.', -'Couchbase\NumericRangeSearchQuery' => 'A FTS query that matches documents on a range of values. At least one bound is required, and the -inclusiveness of each bound can be configured.', -'Couchbase\PasswordAuthenticator' => 'Authenticator based on RBAC feature of Couchbase Server 5+. - -This authenticator uses single credentials for all operations (data and management).', -'Couchbase\PhraseSearchQuery' => 'A FTS query that matches several terms (a "phrase") as is. The order of the terms matter and no further processing is -applied to them, so they must appear in the index exactly as provided. Usually for debugging purposes, prefer -MatchPhraseQuery.', -'Couchbase\PrefixSearchQuery' => 'A FTS query that allows for simple matching on a given prefix.', -'Couchbase\QueryStringSearchQuery' => 'A FTS query that performs a search according to the "string query" syntax.', -'Couchbase\RegexpSearchQuery' => 'A FTS query that allows for simple matching of regular expressions.', -'Couchbase\SearchFacet' => 'Common interface for all search facets', -'Couchbase\SearchQuery' => 'Represents full text search query', -'Couchbase\SearchQueryPart' => 'Common interface for all classes, which could be used as a body of SearchQuery', -'Couchbase\SearchSort' => 'Base class for all FTS sort options in querying.', -'Couchbase\SearchSortField' => 'Sort by a field in the hits.', -'Couchbase\SearchSortGeoDistance' => 'Sort by a location and unit in the hits.', -'Couchbase\SearchSortId' => 'Sort by the document identifier.', -'Couchbase\SearchSortScore' => 'Sort by the hit score.', -'Couchbase\SpatialViewQuery' => 'Represents spatial Couchbase Map/Reduce View query', -'Couchbase\TermRangeSearchQuery' => 'A FTS query that matches documents on a range of values. At least one bound is required, and the -inclusiveness of each bound can be configured.', -'Couchbase\TermSearchFacet' => 'A facet that gives the number of occurrences of the most recurring terms in all hits.', -'Couchbase\TermSearchQuery' => 'A facet that gives the number of occurrences of the most recurring terms in all hits.', -'Couchbase\UserSettings' => 'Represents settings for new/updated user.', -'Couchbase\ViewQuery' => 'Represents regular Couchbase Map/Reduce View query', -'Couchbase\ViewQueryEncodable' => 'Common interface for all View queries', -'Couchbase\WildcardSearchQuery' => 'A FTS query that allows for simple matching using wildcard characters (* and ?).', -'Countable' => 'Classes implementing `Countable` can be used with the `count` function.', -'CURLFile' => '`CURLFile` should be used to upload a file with `CURLOPT_POSTFIELDS`.', -'DateInterval' => 'Represents a date interval. - -A date interval stores either a fixed amount of time (in years, months, days, hours etc) or a relative time string in the format that `DateTime`\'s constructor supports.', -'DatePeriod' => 'Represents a date period. - -A date period allows iteration over a set of dates and times, recurring at regular intervals, over a given period.', -'DateTime' => 'Representation of date and time.', -'DateTimeImmutable' => 'This class behaves the same as `DateTime` except it never modifies itself but returns a new object instead.', -'DateTimeInterface' => 'DateTimeInterface is meant so that both DateTime and DateTimeImmutable can be type hinted for. It is not possible to implement this interface with userland classes.', -'DateTimeZone' => 'Representation of time zone.', -'Directory' => 'Instances of `Directory` are created by calling the `dir` function, not by the new operator.', -'DirectoryIterator' => 'The DirectoryIterator class provides a simple interface for viewing the contents of filesystem directories.', -'DivisionByZeroError' => '`DivisionByZeroError` is thrown when an attempt is made to divide a number by zero.', -'DomainException' => 'Exception thrown if a value does not adhere to a defined valid data domain.', -'DOMAttr' => '`DOMAttr` represents an attribute in the `DOMElement` object.', -'DOMCdataSection' => 'The `DOMCdataSection` inherits from `DOMText` for textural representation of CData constructs.', -'DOMCharacterData' => 'Represents nodes with character data. No nodes directly correspond to this class, but other nodes do inherit from it.', -'DOMComment' => 'Represents comment nodes, characters delimited by `<!--` and `-->`.', -'DOMDocument' => 'Represents an entire HTML or XML document; serves as the root of the document tree.', -'DOMDocumentType' => 'Each `DOMDocument` has a `doctype` attribute whose value is either `null` or a `DOMDocumentType` object.', -'DOMEntity' => 'This interface represents a known entity, either parsed or unparsed, in an XML document.', -'DOMException' => 'DOM operations raise exceptions under particular circumstances, i.e., when an operation is impossible to perform for logical reasons. - -See also the PHP manual\'s section on language.exceptions.', -'DOMImplementation' => 'The `DOMImplementation` interface provides a number of methods for performing operations that are independent of any particular instance of the document object model.', -'DOMText' => 'The `DOMText` class inherits from `DOMCharacterData` and represents the textual content of a `DOMElement` or `DOMAttr`.', -'DOMXPath' => 'Supports XPath 1.0', -'DOTNET' => 'The DOTNET class allows you to instantiate a class from a .Net assembly and call its methods and access its properties.', -'Ds\Collection' => '`Collection` is the base interface which covers functionality common to all the data structures in this library. It guarantees that all structures are traversable, countable, and can be converted to json using `json_encode`.', -'Ds\Deque' => 'A Deque (pronounced “deck”) is a sequence of values in a contiguous buffer that grows and shrinks automatically. The name is a common abbreviation of “double-ended queue” and is used internally by `Ds\Queue`. - -Two pointers are used to keep track of a head and a tail. The pointers can “wrap around” the end of the buffer, which avoids the need to move other values around to make room. This makes shift and unshift very fast —  something a `Ds\Vector` can’t compete with. - -Accessing a value by index requires a translation between the index and its corresponding position in the buffer: `((head + position) % capacity)`.', -'Ds\Hashable' => 'Hashable is an interface which allows objects to be used as keys. It’s an alternative to `spl_object_hash`, which determines an object’s hash based on its handle: this means that two objects that are considered equal by an implicit definition would not treated as equal because they are not the same instance. - -`hash` is used to return a scalar value to be used as the object\'s hash value, which determines where it goes in the hash table. While this value does not have to be unique, objects which are equal must have the same hash value. - -`equals` is used to determine if two objects are equal. It\'s guaranteed that the comparing object will be an instance of the same class as the subject.', -'Ds\Map' => 'A Map is a sequential collection of key-value pairs, almost identical to an `array` used in a similar context. Keys can be any type, but must be unique. Values are replaced if added to the map using the same key.', -'Ds\Pair' => 'A pair is used by `Ds\Map` to pair keys with values.', -'Ds\PriorityQueue' => 'A PriorityQueue is very similar to a Queue. Values are pushed into the queue with an assigned priority, and the value with the highest priority will always be at the front of the queue. - -Implemented using a max heap.', -'Ds\Queue' => 'A Queue is a “first in, first out” or “FIFO” collection that only allows access to the value at the front of the queue and iterates in that order, destructively.', -'Ds\Sequence' => 'A Sequence describes the behaviour of values arranged in a single, linear dimension. Some languages refer to this as a "List". It’s similar to an array that uses incremental integer keys, with the exception of a few characteristics: Values will always be indexed as [0, 1, 2, …, size - 1]. Only allowed to access values by index in the range [0, size - 1]. - -Use cases: Wherever you would use an array as a list (not concerned with keys). A more efficient alternative to `SplDoublyLinkedList` and `SplFixedArray`.', -'Ds\Set' => 'A Set is a sequence of unique values. This implementation uses the same hash table as `Ds\Map`, where values are used as keys and the mapped value is ignored.', -'Ds\Stack' => 'A Stack is a “last in, first out” or “LIFO” collection that only allows access to the value at the top of the structure and iterates in that order, destructively. - -Uses a `Ds\Vector` internally.', -'Ds\Vector' => 'A Vector is a sequence of values in a contiguous buffer that grows and shrinks automatically. It’s the most efficient sequential structure because a value’s index is a direct mapping to its index in the buffer, and the growth factor isn\'t bound to a specific multiple or exponent.', -'EmptyIterator' => 'The EmptyIterator class for an empty iterator.', -'Ev' => 'Ev is a static class providing access to the default loop and to some common operations.', -'EvCheck' => '`EvPrepare` and `EvCheck` watchers are usually used in pairs. `EvPrepare` watchers get invoked before the process blocks, `EvCheck` afterwards. - -It is not allowed to call `EvLoop::run` or similar methods or functions that enter the current event loop from either `EvPrepare` or `EvCheck` watchers. Other loops than the current one are fine, however. The rationale behind this is that one don\'t need to check for recursion in those watchers, i.e. the sequence will always be: `EvPrepare` -> blocking -> `EvCheck` , so having a watcher of each kind they will always be called in pairs bracketing the blocking call. - -The main purpose is to integrate other event mechanisms into *libev* and their use is somewhat advanced. They could be used, for example, to track variable changes, implement custom watchers, integrate net-snmp or a coroutine library and lots more. They are also occasionally useful to cache some data and want to flush it before blocking. - -It is recommended to give `EvCheck` watchers highest( `Ev::MAXPRI` ) priority, to ensure that they are being run before any other watchers after the poll (this doesn’t matter for `EvPrepare` watchers). - -Also, `EvCheck` watchers should not activate/feed events. While *libev* fully supports this, they might get executed before other `EvCheck` watchers did their job.', -'EvChild' => '`EvChild` watchers trigger when the process receives a `SIGCHLD` in response to some child status changes (most typically when a child dies or exits). It is permissible to install an `EvChild` watcher after the child has been forked(which implies it might have already exited), as long as the event loop isn\'t entered(or is continued from a watcher), i.e. forking and then immediately registering a watcher for the child is fine, but forking and registering a watcher a few event loop iterations later or in the next callback invocation is not. - -It is allowed to register `EvChild` watchers in the *default loop* only.', -'EvEmbed' => 'Used to embed one event loop into another.', -'Event' => '`Event` class represents and event firing on a file descriptor being ready to read from or write to; a file descriptor becoming ready to read from or write to(edge-triggered I/O only); a timeout expiring; a signal occurring; a user-triggered event. - -Every event is associated with `EventBase` . However, event will never fire until it is *added* (via `Event::add` ). An added event remains in *pending* state until the registered event occurs, thus turning it to *active* state. To handle events user may register a callback which is called when event becomes active. If event is configured *persistent* , it remains pending. If it is not persistent, it stops being pending when it\'s callback runs. `Event::del` method *deletes* event, thus making it non-pending. By means of `Event::add` method it could be added again.', -'EventBase' => '`EventBase` class represents libevent\'s event base structure. It holds a set of events and can poll to determine which events are active. - -Each event base has a *method* , or a *backend* that it uses to determine which events are ready. The recognized methods are: `select` , `poll` , `epoll` , `kqueue` , `devpoll` , `evport` and `win32` . - -To configure event base to use, or avoid specific backend `EventConfig` class can be used.', -'EventBuffer' => '`EventBuffer` represents Libevent\'s "evbuffer", an utility functionality for buffered I/O. - -Event buffers are meant to be generally useful for doing the "buffer" part of buffered network I/O.', -'EventBufferEvent' => 'Represents Libevent\'s buffer event. - -Usually an application wants to perform some amount of data buffering in addition to just responding to events. When we want to write data, for example, the usual pattern looks like: - -This buffered I/O pattern is common enough that Libevent provides a generic mechanism for it. A "buffer event" consists of an underlying transport (like a socket), a read buffer, and a write buffer. Instead of regular events, which give callbacks when the underlying transport is ready to be read or written, a buffer event invokes its user-supplied callbacks when it has read or written enough data.', -'EventConfig' => 'Represents configuration structure which could be used in construction of the `EventBase` .', -'EventDnsBase' => 'Represents Libevent\'s DNS base structure. Used to resolve DNS asynchronously, parse configuration files like resolv.conf etc.', -'EventHttp' => 'Represents HTTP server.', -'EventHttpConnection' => 'Represents an HTTP connection.', -'EventHttpRequest' => 'Represents an HTTP request.', -'EventListener' => 'Represents a connection listener.', -'EventSslContext' => 'Represents `SSL_CTX` structure. Provides methods and properties to configure the SSL context.', -'EventUtil' => '`EventUtil` is a singleton with supplimentary methods and constants.', -'EvFork' => 'Fork watchers are called when a `fork()` was detected (usually because whoever signalled *libev* about it by calling `EvLoop::fork` ). The invocation is done before the event loop blocks next and before `EvCheck` watchers are being called, and only in the child after the fork. Note, that if whoever calling `EvLoop::fork` calls it in the wrong process, the fork handlers will be invoked, too.', -'EvIdle' => '`EvIdle` watchers trigger events when no other events of the same or higher priority are pending ( `EvPrepare` , `EvCheck` and other `EvIdle` watchers do not count as receiving *events* ). - -Thus, as long as the process is busy handling sockets or timeouts(or even signals) of the same or higher priority it will not be triggered. But when the process is in idle(or only lower-priority watchers are pending), the `EvIdle` watchers are being called once per event loop iteration - until stopped, that is, or the process receives more events and becomes busy again with higher priority stuff. - -Apart from keeping the process non-blocking(which is a useful on its own sometimes), `EvIdle` watchers are a good place to do *"pseudo-background processing"* , or delay processing stuff to after the event loop has handled all outstanding events. - -The most noticeable effect is that as long as any *idle* watchers are active, the process will *not* block when waiting for new events.', -'EvIo' => '`EvIo` watchers check whether a file descriptor(or socket, or a stream castable to numeric file descriptor) is readable or writable in each iteration of the event loop, or, more precisely, when reading would not block the process and writing would at least be able to write some data. This behaviour is called *level-triggering* because events are kept receiving as long as the condition persists. To stop receiving events just stop the watcher. - -The number of read and/or write event watchers per fd is unlimited. Setting all file descriptors to non-blocking mode is also usually a good idea(but not required). - -Another thing to watch out for is that it is quite easy to receive false readiness notifications, i.e. the callback might be called with `Ev::READ` but a subsequent *read()* will actually block because there is no data. It is very easy to get into this situation. Thus it is best to always use non-blocking I/O: An extra *read()* returning `EAGAIN` (or similar) is far preferable to a program hanging until some data arrives. - -If for some reason it is impossible to run the fd in non-blocking mode, then separately re-test whether a file descriptor is really ready. Some people additionally use `SIGALRM` and an interval timer, just to be sure thry won\'t block infinitely. - -Always consider using non-blocking mode.', -'EvLoop' => 'Represents an event loop that is always distinct from the *default loop* . Unlike the *default loop* , it cannot handle `EvChild` watchers. - -Having threads we have to create a loop per thread, and use the *default loop* in the parent thread. - -The *default event loop* is initialized automatically by *Ev* . It is accessible via methods of the `Ev` class, or via `EvLoop::defaultLoop` method.', -'EvPeriodic' => 'Periodic watchers are also timers of a kind, but they are very versatile. - -Unlike `EvTimer` , `EvPeriodic` watchers are not based on real time(or relative time, the physical time that passes) but on wall clock time(absolute time, calendar or clock). The difference is that wall clock time can run faster or slower than real time, and time jumps are not uncommon(e.g. when adjusting it). - -`EvPeriodic` watcher can be configured to trigger after some specific point in time. For example, if an `EvPeriodic` watcher is configured to trigger *"in 10 seconds"* (e.g. `EvLoop::now` + `10.0` , i.e. an absolute time, not a delay), and the system clock is reset to *January of the previous year* , then it will take a year or more to trigger the event (unlike an `EvTimer` , which would still trigger roughly `10` seconds after starting it as it uses a relative timeout). - -As with timers, the callback is guaranteed to be invoked only when the point in time where it is supposed to trigger has passed. If multiple timers become ready during the same loop iteration then the ones with earlier time-out values are invoked before ones with later time-out values (but this is no longer true when a callback calls `EvLoop::run` recursively).', -'EvPrepare' => 'Class EvPrepare - -EvPrepare and EvCheck watchers are usually used in pairs. EvPrepare watchers get invoked before the process blocks, -EvCheck afterwards. - -It is not allowed to call EvLoop::run() or similar methods or functions that enter the current event loop from either -EvPrepare or EvCheck watchers. Other loops than the current one are fine, however. The rationale behind this is that -one don\'t need to check for recursion in those watchers, i.e. the sequence will always be: EvPrepare -> blocking -> -EvCheck, so having a watcher of each kind they will always be called in pairs bracketing the blocking call. - -The main purpose is to integrate other event mechanisms into libev and their use is somewhat advanced. They could be -used, for example, to track variable changes, implement custom watchers, integrate net-snmp or a coroutine library -and lots more. They are also occasionally useful to cache some data and want to flush it before blocking. - -It is recommended to give EvCheck watchers highest (Ev::MAXPRI) priority, to ensure that they are being run before -any other watchers after the poll (this doesn’t matter for EvPrepare watchers). - -Also, EvCheck watchers should not activate/feed events. While libev fully supports this, they might get executed -before other EvCheck watchers did their job.', -'EvSignal' => '`EvSignal` watchers will trigger an event when the process receives a specific signal one or more times. Even though signals are very asynchronous, *libev* will try its best to deliver signals synchronously, i.e. as part of the normal event processing, like any other event. - -There is no limit for the number of watchers for the same signal, but only within the same loop, i.e. one can watch for `SIGINT` in the default loop and for `SIGIO` in another loop, but it is not allowed to watch for `SIGINT` in both the default loop and another loop at the same time. At the moment, `SIGCHLD` is permanently tied to the default loop. - -If possible and supported, *libev* will install its handlers with `SA_RESTART` (or equivalent) behaviour enabled, so system calls should not be unduly interrupted. In case of a problem with system calls getting interrupted by signals, all the signals can be blocked in an `EvCheck` watcher and unblocked in a `EvPrepare` watcher.', -'EvStat' => '`EvStat` monitors a file system path for attribute changes. It calls *stat()* on that path in regular intervals(or when the OS signals it changed) and sees if it changed compared to the last time, invoking the callback if it did. - -The path does not need to exist: changing from "path exists" to "path does not exist" is a status change like any other. The condition "path does not exist" is signified by the `\'nlink\'` item being 0(returned by `EvStat::attr` method). - -The path must not end in a slash or contain special components such as `\'.\'` or `..` . The path should be absolute: if it is relative and the working directory changes, then the behaviour is undefined. - -Since there is no portable change notification interface available, the portable implementation simply calls *stat()* regularly on the path to see if it changed somehow. For this case a recommended polling interval can be specified. If one specifies a polling interval of `0.0 ` (highly recommended) then a suitable, unspecified default value will be used(which could be expected to be around 5 seconds, although this might change dynamically). *libev* will also impose a minimum interval which is currently around `0.1` , but that’s usually overkill. - -This watcher type is not meant for massive numbers of `EvStat` watchers, as even with OS-supported change notifications, this can be resource-intensive.', -'EvTimer' => '`EvTimer` watchers are simple relative timers that generate an event after a given time, and optionally repeating in regular intervals after that. - -The timers are based on real time, that is, if one registers an event that times out after an hour and resets the system clock to *January last year* , it will still time out after(roughly) one hour. "Roughly" because detecting time jumps is hard, and some inaccuracies are unavoidable. - -The callback is guaranteed to be invoked only after its timeout has passed (not at, so on systems with very low-resolution clocks this might introduce a small delay). If multiple timers become ready during the same loop iteration then the ones with earlier time-out values are invoked before ones of the same priority with later time-out values (but this is no longer true when a callback calls `EvLoop::run` recursively). - -The timer itself will do a best-effort at avoiding drift, that is, if a timer is configured to trigger every `10` seconds, then it will normally trigger at exactly `10` second intervals. If, however, the script cannot keep up with the timer because it takes longer than those `10` seconds to do) the timer will not fire more than once per event loop iteration.', -'EvWatcher' => '`EvWatcher` is a base class for all watchers( `EvCheck` , `EvChild` etc.). Since `EvWatcher` \'s constructor is abstract , one can\'t(and don\'t need to) create EvWatcher objects directly.', -'FANNConnection' => '`FANNConnection` is used for the neural network connection. The objects of this class are used in `fann_get_connection_array` and `fann_set_weight_array`.', -'FFI' => 'FFI class provides access to a simple way to call native functions, -access native variables and create/access data structures defined -in C language.', -'FFI\CData' => 'Proxy object that provides access to compiled structures.', -'FFI\CType' => 'Class containing C type information.', -'FilesystemIterator' => 'The Filesystem iterator', -'FilterIterator' => 'This abstract iterator filters out unwanted values. This class should be extended to implement custom iterator filters. The `FilterIterator::accept` must be implemented in the subclass.', -'finfo' => 'This class provides an object oriented interface into the fileinfo functions.', -'GearmanClient' => 'Represents a class for connecting to a Gearman job server and making requests to perform some function on provided data. The function performed must be one registered by a Gearman worker and the data passed is opaque to the job server.', -'GearmanException' => 'Class: GearmanException', -'GearmanJob' => 'Class: GearmanJob', -'GearmanTask' => 'Class: GearmanTask', -'GearmanWorker' => 'Class: GearmanWorker', -'GlobIterator' => 'Iterates through a file system in a similar fashion to `glob`.', -'GmagickException' => 'GmagickException class', -'GMP' => 'A GMP number. These objects support overloaded arithmetic, bitwise and comparison operators.', -'gnupg' => 'GNUPG Encryption Class', -'gridObj' => 'The grid is always embedded inside a layer object defined as -a grid (layer->connectiontype = MS_GRATICULE) -(for more docs : https://github.com/mapserver/mapserver/wiki/MapServerGrid) -A layer can become a grid layer by adding a grid object to it using : -ms_newGridObj(layerObj layer) -$oLayer = ms_newlayerobj($oMap); -$oLayer->set("name", "GRID"); -ms_newgridobj($oLayer); -$oLayer->grid->set("labelformat", "DDMMSS");', -'Grpc\Call' => 'Class Call', -'Grpc\CallCredentials' => 'Class CallCredentials', -'Grpc\Channel' => 'Class Channel', -'Grpc\ChannelCredentials' => 'Class ChannelCredentials', -'Grpc\Server' => 'Class Server', -'Grpc\ServerCredentials' => 'Class ServerCredentials', -'Grpc\Timeval' => 'Class Timeval', -'HaruAnnotation' => 'Haru PDF Annotation Class.', -'HaruDestination' => 'Haru PDF Destination Class.', -'HaruDoc' => 'Haru PDF Document Class.', -'HaruEncoder' => 'Haru PDF Encoder Class.', -'HaruException' => 'Haru PDF Exception Class.', -'HaruFont' => 'Haru PDF Font Class.', -'HaruImage' => 'Haru PDF Image Class.', -'HaruOutline' => 'Haru PDF Outline Class.', -'HaruPage' => 'Haru PDF Page Class.', -'hashTableObj' => 'Instance of hashTableObj is always embedded inside the `classObj`_, -`layerObj`_, `mapObj`_ and `webObj`_. It is uses a read only. -$hashTable = $oLayer->metadata; -$key = null; -while ($key = $hashTable->nextkey($key)) -echo "Key: ".$key." value: ".$hashTable->get($key)."<br/>";', -'http\Client' => 'The HTTP client. See http\Client\Curl’s options which is the only driver currently supported.', -'http\Client\Curl\User' => 'Interface to an user event loop implementation for http\Client::configure()\'s $use_eventloop option.', -'http\Client\Request' => 'The http\Client\Request class provides an HTTP message implementation tailored to represent a request message to be sent by the client. - -See http\Client::enqueue().', -'http\Client\Response' => 'The http\Client\Response class represents an HTTP message the client returns as answer from a server to an http\Client\Request.', -'http\Cookie' => 'A class representing a list of cookies with specific attributes.', -'http\Encoding\Stream' => 'Base class for encoding stream implementations.', -'http\Encoding\Stream\Debrotli' => 'A [brotli](https://brotli.org) decoding stream.', -'http\Encoding\Stream\Dechunk' => 'A stream decoding data encoded with chunked transfer encoding.', -'http\Encoding\Stream\Deflate' => 'A deflate stream supporting deflate, zlib and gzip encodings.', -'http\Encoding\Stream\Enbrotli' => 'A [brotli](https://brotli.org) encoding stream.', -'http\Encoding\Stream\Inflate' => 'A inflate stream supporting deflate, zlib and gzip encodings.', -'http\Env' => 'The http\Env class provides static methods to manipulate and inspect the server’s current request’s HTTP environment', -'http\Env\Request' => 'The http\Env\Request class\' instances represent the server’s current HTTP request. - -See http\Message for inherited members.', -'http\Env\Response' => 'Class Response - -The http\Env\Response class\' instances represent the server’s current HTTP response. - -See http\Message for inherited members.', -'http\Env\Url' => 'URL class using the HTTP environment by default. - -Always adds http\Url::FROM_ENV to the $flags constructor argument. See also http\Url.', -'http\Exception' => 'The http extension\'s Exception interface. - -Use it to catch any Exception thrown by pecl/http. - -The individual exception classes extend their equally named native PHP extensions, if such exist, and implement this empty interface. For example the http\Exception\BadMethodCallException extends SPL\'s BadMethodCallException.', -'http\Exception\BadConversionException' => 'A bad conversion (e.g. character conversion) was encountered.', -'http\Exception\BadHeaderException' => 'A bad HTTP header was encountered.', -'http\Exception\BadMessageException' => 'A bad HTTP message was encountered.', -'http\Exception\BadMethodCallException' => 'A method was called on an object, which was in an invalid or unexpected state.', -'http\Exception\BadQueryStringException' => 'A bad querystring was encountered.', -'http\Exception\BadUrlException' => 'A bad HTTP URL was encountered.', -'http\Exception\InvalidArgumentException' => 'One or more invalid arguments were passed to a method.', -'http\Exception\RuntimeException' => 'A generic runtime exception.', -'http\Exception\UnexpectedValueException' => 'An unexpected value was encountered.', -'http\Header' => 'The http\Header class provides methods to manipulate, match, negotiate and serialize HTTP headers.', -'http\Header\Parser' => 'The parser which is underlying http\Header and http\Message.', -'http\Message' => 'The message class builds the foundation for any request and response message. - -See http\Client\Request and http\Client\Response, as well as http\Env\Request and http\Env\Response.', -'http\Message\Body' => 'The message body, represented as a PHP (temporary) stream.', -'http\Message\Parser' => 'The parser which is underlying http\Message.', -'http\Params' => 'Parse, interpret and compose HTTP (header) parameters.', -'http\QueryString' => 'The http\QueryString class provides versatile facilities to retrieve, use and manipulate query strings and form data.', -'http\Url' => 'The http\Url class provides versatile means to parse, construct and manipulate URLs.', -'imageObj' => 'Instances of imageObj are always created by the `mapObj`_ class methods.', -'InfiniteIterator' => 'The `InfiniteIterator` allows one to infinitely iterate over an iterator without having to manually rewind the iterator upon reaching its end.', -'IntlBreakIterator' => 'A “break iterator” is an ICU object that exposes methods for locating boundaries in text (e.g. word or sentence boundaries). The PHP `IntlBreakIterator` serves as the base class for all types of ICU break iterators. Where extra functionality is available, the intl extension may expose the ICU break iterator with suitable subclasses, such as `IntlRuleBasedBreakIterator` or `IntlCodePointBreakIterator`. - -This class implements `Traversable`. Traversing an `IntlBreakIterator` yields non-negative integer values representing the successive locations of the text boundaries, expressed as UTF-8 code units (byte) counts, taken from the beginning of the text (which has the location `0`). The keys yielded by the iterator simply form the sequence of natural numbers `{0, 1, 2, …}`.', -'IntlChar' => '`IntlChar` provides access to a number of utility methods that can be used to access information about Unicode characters. - -The methods and constants adhere closely to the names and behavior used by the underlying ICU library.', -'IntlCodePointBreakIterator' => 'This break iterator identifies the boundaries between UTF-8 code points.', -'IntlException' => 'This class is used for generating exceptions when errors occur inside intl functions. Such exceptions are only generated when intl.use_exceptions is enabled.', -'IntlIterator' => 'This class represents iterator objects throughout the intl extension whenever the iterator cannot be identified with any other object provided by the extension. The distinct iterator object used internally by the `foreach` construct can only be obtained (in the relevant part here) from objects, so objects of this class serve the purpose of providing the hook through which this internal object can be obtained. As a convenience, this class also implements the `Iterator` interface, allowing the collection of values to be navigated using the methods defined in that interface. Both these methods and the internal iterator objects provided to `foreach` are backed by the same state (e.g. the position of the iterator and its current value). - -Subclasses may provide richer functionality.', -'IntlPartsIterator' => 'Objects of this class can be obtained from `IntlBreakIterator` objects. While the break iterators provide a sequence of boundary positions when iterated, `IntlPartsIterator` objects provide, as a convenience, the text fragments comprehended between two successive boundaries. - -The keys may represent the offset of the left boundary, right boundary, or they may just the sequence of non-negative integers. See `IntlBreakIterator::getPartsIterator`.', -'IntlRuleBasedBreakIterator' => 'A subclass of `IntlBreakIterator` that encapsulates ICU break iterators whose behavior is specified using a set of rules. This is the most common kind of break iterators. - -These rules are described in the ICU Boundary Analysis User Guide.', -'InvalidArgumentException' => 'Exception thrown if an argument is not of the expected type.', -'IteratorIterator' => 'This iterator wrapper allows the conversion of anything that is Traversable into an Iterator. It is important to understand that most classes that do not implement Iterators have reasons as most likely they do not allow the full Iterator feature set. If so, techniques should be provided to prevent misuse, otherwise expect exceptions or fatal errors.', -'JsonException' => 'Exception thrown if `JSON_THROW_ON_ERROR` option is set for `json_encode` or `json_decode`.', -'JsonSerializable' => 'Objects implementing `JsonSerializable` can customize their JSON representation when encoded with `json_encode`.', -'Judy' => 'The Judy class implements the ArrayAccess interface and the Iterator interface. This class, once instantiated, can be accessed like a PHP array. - -A PHP Judy object (or Judy Array) can be one of the following type : Judy::BITSET Judy::INT_TO_INT Judy::INT_TO_MIXED Judy::STRING_TO_INT Judy::STRING_TO_MIXED - -Judy array example ]]>', -'KTaglib_ID3v2_AttachedPictureFrame' => 'Represents an ID3v2 frame that can hold a picture.', -'KTaglib_ID3v2_Frame' => 'The base class for ID3v2 frames. ID3v2 tags are separated in various specialized frames. Some frames can exists multiple times.', -'KTaglib_ID3v2_Tag' => 'Represents and ID3v2 tag. It provides a list of ID3v2 frames and can be used to add and remove additional frames.', -'KTaglib_MPEG_Audioproperties' => 'Represents the audio properties of a MPEG file, like length, bitrate or samplerate.', -'KTaglib_MPEG_File' => 'Represents an MPEG file. MPEG files can have ID3v1, ID3v2 tags and audio properties.', -'KTaglib_Tag' => 'Base class for ID3v1 or ID3v2 tags', -'labelObj' => 'labelObj are always embedded inside other classes.', -'Lapack' => 'LAPACK is written in Fortran 90 and provides routines for solving systems of simultaneous linear equations, least-squares solutions of linear systems of equations, eigenvalue problems, and singular value problems. This extension wraps the LAPACKE C bindings to allow access to several processes exposed by the library. Most functions work with arrays of arrays, representing rectangular matrices in row major order - so a two by two matrix [1 2; 3 4] would be array(array(1, 2), array(3, 4)). - -All of the functions are called statically, for example $eig = Lapack::eigenvalues($a);', -'lapackexception' => 'Exception thrown when an error is caught in the LAPACK functions', -'layerObj' => 'Layer Objects can be returned by the `mapObj`_ class, or can be -created using: -A second optional argument can be given to ms_newLayerObj() to create -the new layer as a copy of an existing layer. If a layer is given as -argument then all members of a this layer will be copied in the new -layer created.', -'legendObj' => 'Instances of legendObj are always are always embedded inside the `mapObj`_.', -'LengthException' => 'Exception thrown if a length is invalid.', -'libXMLError' => 'Contains various information about errors thrown by libxml. The error codes are described within the official xmlError API documentation.', -'LimitIterator' => 'The `LimitIterator` class allows iteration over a limited subset of items in an `Iterator`.', -'Locale' => 'Examples of identifiers include: en-US (English, United States) zh-Hant-TW (Chinese, Traditional Script, Taiwan) fr-CA, fr-FR (French for Canada and France respectively)', -'LogicException' => 'Exception that represents error in the program logic. This kind of exception should lead directly to a fix in your code.', -'LuaClosure' => 'LuaClosure is a wrapper class for LUA_TFUNCTION which could be return from calling to Lua function.', -'Memcache' => 'Represents a connection to a set of memcache servers.', -'Memcached' => 'Represents a connection to a set of memcached servers.', -'Mongo' => 'A connection between PHP and MongoDB. - -This class extends `MongoClient` and provides access to several deprecated methods. - -For backwards compatibility, it also defaults the `"w"` option of its constructor argument to `0`, which does not require write operations to be acknowledged by the server. See `MongoClient::__construct` for more information.', -'MongoBinData' => 'An object that can be used to store or retrieve binary data from the database. - -The maximum size of a single object that can be inserted into the database is 16MB. For data that is larger than this (movies, music, Henry Kissinger\'s autobiography), use `MongoGridFS`. For data that is smaller than 16MB, you may find it easier to embed it within the document using `MongoBinData`. - -For example, to embed an image in a document, one could write: - -This class contains a type field, which currently gives no additional functionality in the PHP driver or the database. There are seven predefined types, which are defined as class constants below. For backwards compatibility, the PHP driver uses `MongoBinData::BYTE_ARRAY` as the default; however, this may change to `MongoBinData::GENERIC` in the future. Users are encouraged to specify a type in `MongoBinData::__construct`.', -'MongoClient' => 'A connection manager for PHP and MongoDB. - -This class is used to create and manage connections. A typical use is: `MongoClient` basic usage foo; // get the database named "foo" ?> ]]> - -See `MongoClient::__construct` and the section on connecting for more information about creating connections.', -'MongoCode' => 'Represents JavaScript code for the database. - -MongoCode objects are composed of two parts: a string of code and an optional scope. The string of code must be valid JavaScript. The scope is a associative array of variable name/value pairs.', -'MongoCollection' => 'Represents a MongoDB collection. - -Collection names can use any character in the ASCII set. Some valid collection names are "", "...", "my collection", and "*&#@". - -User-defined collection names cannot contain the $ symbol. There are certain system collections which use a $ in their names (e.g., local.oplog.$main), but it is a reserved character. If you attempt to create and use a collection with a $ in the name, MongoDB will assert.', -'MongoCommandCursor' => 'A command cursor is similar to a `MongoCursor` except that you use it for iterating through the results of a database command instead of a normal query. Command cursors are useful for iterating over large result sets that might exceed the document size limit (currently 16MB) of a single `MongoDB::command` response. - -While you can create command cursors using `MongoCommandCursor::__construct` or the `MongoCommandCursor::createFromDocument` factory method, you will generally want to use command-specific helpers such as `MongoCollection::aggregateCursor`. - -Note that the cursor does not "contain" the database command\'s results; it just manages iteration through them. Thus, if you print a cursor (f.e. with `var_dump` or `print_r`), you will see the cursor object but not the result documents.', -'MongoConnectionException' => 'Thrown when the driver fails to connect to the database. - -There are a number of possible error messages to help you diagnose the connection problem. These are: - -If the error message is not listed above, it is probably an error from the C socket, and you can search the web for its usual cause.', -'MongoCursor' => 'A cursor is used to iterate through the results of a database query. For example, to query the database and see all results, you could do: `MongoCursor` basic usage find(); var_dump(iterator_to_array($cursor)); ?> ]]> - -You don\'t generally create cursors using the `MongoCursor` constructor, you get a new cursor by calling `MongoCollection::find` (as shown above). - -Suppose that, in the example above, `$collection` was a 50GB collection. We certainly wouldn\'t want to load that into memory all at once, which is what a cursor is for: allowing the client to access the collection in dribs and drabs. - -If we have a large result set, we can iterate through it, loading a few megabytes of results into memory at a time. For example, we could do: Iterating over `MongoCursor` find(); foreach ($cursor as $doc) { // do something to each document } ?> ]]> This will go through each document in the collection, loading and garbage collecting documents as needed. - -Note that this means that a cursor does not "contain" the database results, it just manages them. Thus, if you print a cursor (with, say, `var_dump` or `print_r`), you\'ll just get the cursor object, not your documents. To get the documents themselves, you can use one of the methods shown above.', -'MongoCursorException' => 'Caused by accessing a cursor incorrectly or a error receiving a reply. Note that this can be thrown by any database request that receives a reply, not just queries. Writes, commands, and any other operation that sends information to the database and waits for a response can throw a `MongoCursorException`. The only exception is `new MongoClient()` (creating a new connection), which will only throw `MongoConnectionException`s. - -This returns a specific error message to help diagnose the problem and a numeric error code associated with the cause of the exception. - -For example, suppose you tried to insert two documents with the same _id: insert(array("_id" => 1), array("w" => 1)); $collection->insert(array("_id" => 1), array("w" => 1)); } catch (MongoCursorException $e) { echo "error message: ".$e->getMessage()."\n"; echo "error code: ".$e->getCode()."\n"; } ?> ]]> This would produce output like: Note that the MongoDB error code (11000) is used for the PHP error code. The PHP driver uses the "native" error code wherever possible. - -The following is a list of common errors, codes, and causes. Exact errors are in italics, errors where the message can vary are described in obliques.', -'MongoCursorInterface' => 'Interface for cursors, which can be used to iterate through results of a database query or command. This interface is implemented by the `MongoCursor` and `MongoCommandCursor` classes.', -'MongoCursorTimeoutException' => 'Caused by a query timing out. You can set the length of time to wait before this exception is thrown by calling `MongoCursor::timeout` on the cursor or setting `MongoCursor::$timeout`. The static variable is useful for queries such as database commands and `MongoCollection::findOne`, both of which implicitly use cursors.', -'MongoDate' => 'Represent date objects for the database. This class should be used to save dates to the database and to query for dates. For example: - -MongoDB stores dates as milliseconds past the epoch. This means that dates *do not* contain timezone information. Timezones must be stored in a separate field if needed. Second, this means that any precision beyond milliseconds will be lost when the document is sent to/from the database.', -'MongoDB' => 'Instances of this class are used to interact with a database. To get a database: Selecting a database selectDB("example"); ?> ]]> Database names can use almost any character in the ASCII range. However, they cannot contain " ", "." or be the empty string. The name "system" is also reserved. - -A few unusual, but valid, database names: "null", "[x,y]", "3", "\"", "/". - -Unlike collection names, database names may contain "$".', -'MongoDB\BSON\Binary' => 'BSON type for binary data (i.e. array of bytes). Binary values also have a subtype, which is used to indicate what kind of data is in the byte array. Subtypes from zero to 127 are predefined or reserved. Subtypes from 128-255 are user-defined.', -'MongoDB\BSON\BinaryInterface' => 'This interface is implemented by `MongoDB\BSON\Binary` but may also be used for type-hinting and userland classes.', -'MongoDB\BSON\DBPointer' => 'BSON type for the "DBPointer" type. This BSON type is deprecated, and this class can not be instantiated. It will be created from a BSON DBPointer type while converting BSON to PHP, and can also be converted back into BSON while storing documents in the database.', -'MongoDB\BSON\Decimal128' => 'BSON type for the Decimal128 floating-point format, which supports numbers with up to 34 decimal digits (i.e. significant digits) and an exponent range of −6143 to +6144. - -Unlike the double BSON type (i.e. `float` in PHP), which only stores an approximation of the decimal values, the decimal data type stores the exact value. For example, `MongoDB\BSON\Decimal128(\'9.99\')` has a precise value of 9.99 where as a double 9.99 would have an approximate value of 9.9900000000000002131628….', -'MongoDB\BSON\Decimal128Interface' => 'This interface is implemented by `MongoDB\BSON\Decimal128` but may also be used for type-hinting and userland classes.', -'MongoDB\BSON\Int64' => 'BSON type for a 64-bit integer. This class cannot be instantiated and is only created during BSON decoding when a 64-bit integer cannot be represented as a PHP integer on a 32-bit platform. Versions of the driver before 1.5.0 would throw an exception when attempting to decode a 64-bit integer on a 32-bit platform. - -During BSON encoding, objects of this class will convert back to a 64-bit integer type. This allows 64-bit integers to be roundtripped through a 32-bit PHP environment without any loss of precision. The __toString() method allows the 64-bit integer value to be accessed as a string.', -'MongoDB\BSON\Javascript' => 'BSON type for Javascript code. An optional scope document may be specified that maps identifiers to values and defines the scope in which the code should be evaluated by the server.', -'MongoDB\BSON\JavascriptInterface' => 'This interface is implemented by `MongoDB\BSON\Javascript` but may also be used for type-hinting and userland classes.', -'MongoDB\BSON\MaxKey' => 'Special BSON type which compares higher than all other possible BSON element values.', -'MongoDB\BSON\MaxKeyInterface' => 'This interface is implemented by `MongoDB\BSON\MaxKey` but may also be used for type-hinting and userland classes.', -'MongoDB\BSON\MinKey' => 'Special BSON type which compares lower than all other possible BSON element values.', -'MongoDB\BSON\MinKeyInterface' => 'This interface is implemented by `MongoDB\BSON\MinKey` but may also be used for type-hinting and userland classes.', -'MongoDB\BSON\ObjectId' => 'BSON type for an ObjectId. The value consists of 12 bytes, where the first four bytes are a timestamp that reflect the ObjectId\'s creation. Specifically, the value consists of: - -In MongoDB, each document stored in a collection requires a unique `_id` field that acts as a primary key. If an inserted document omits the `_id` field, the driver automatically generates an ObjectId for the `_id` field. - -Using ObjectIds for the `_id` field provides the following additional benefits:', -'MongoDB\BSON\ObjectIdInterface' => 'This interface is implemented by `MongoDB\BSON\ObjectId` but may also be used for type-hinting and userland classes.', -'MongoDB\BSON\Persistable' => 'Classes may implement this interface to take advantage of automatic ODM (object document mapping) behavior in the driver. During serialization, the driver will inject a `__pclass` property containing the PHP class name into the data returned by `MongoDB\BSON\Serializable::bsonSerialize`. During unserialization, the same `__pclass` property will then be used to infer the PHP class (independent of any type map configuration) to be constructed before `MongoDB\BSON\Unserializable::bsonUnserialize` is invoked. See the PHP manual\'s section on mongodb.persistence for additional information.', -'MongoDB\BSON\Regex' => 'BSON type for a regular expression pattern and optional flags.', -'MongoDB\BSON\RegexInterface' => 'This interface is implemented by `MongoDB\BSON\Regex` but may also be used for type-hinting and userland classes.', -'MongoDB\BSON\Serializable' => 'Classes that implement this interface may return data to be serialized as a BSON array or document in lieu of the object\'s public properties.', -'MongoDB\BSON\Symbol' => 'BSON type for the "Symbol" type. This BSON type is deprecated, and this class can not be instantiated. It will be created from a BSON symbol type while converting BSON to PHP, and can also be converted back into BSON while storing documents in the database.', -'MongoDB\BSON\Timestamp' => 'Represents a BSON timestamp, The value consists of a 4-byte timestamp (i.e. seconds since the epoch) and a 4-byte increment.', -'MongoDB\BSON\TimestampInterface' => 'This interface is implemented by `MongoDB\BSON\Timestamp` but may also be used for type-hinting and userland classes.', -'MongoDB\BSON\Type' => 'Abstract base interface that should not be implemented directly.', -'MongoDB\BSON\Undefined' => 'BSON type for the "Undefined" type. This BSON type is deprecated, and this class can not be instantiated. It will be created from a BSON undefined type while converting BSON to PHP, and can also be converted back into BSON while storing documents in the database.', -'MongoDB\BSON\Unserializable' => 'Classes that implement this interface may be specified in a type map for unserializing BSON arrays and documents (both root and embedded).', -'MongoDB\BSON\UTCDateTime' => 'Represents a BSON date. The value is a 64-bit integer that represents the number of milliseconds since the Unix epoch (Jan 1, 1970). Negative values represent dates before 1970.', -'MongoDB\BSON\UTCDateTimeInterface' => 'This interface is implemented by `MongoDB\BSON\UTCDateTime` but may also be used for type-hinting and userland classes.', -'MongoDB\Driver\BulkWrite' => 'The `MongoDB\Driver\BulkWrite` collects one or more write operations that should be sent to the server. After adding any number of insert, update, and delete operations, the collection may be executed via `MongoDB\Driver\Manager::executeBulkWrite`. - -Write operations may either be ordered (default) or unordered. Ordered write operations are sent to the server, in the order provided, for serial execution. If a write fails, any remaining operations will be aborted. Unordered operations are sent to the server in an arbitrary order where they may be executed in parallel. Any errors that occur are reported after all operations have been attempted.', -'MongoDB\Driver\Command' => 'The `MongoDB\Driver\Command` class is a value object that represents a database command. - -To provide Command Helpers the `MongoDB\Driver\Command` object should be composed.', -'MongoDB\Driver\Cursor' => 'The `MongoDB\Driver\Cursor` class encapsulates the results of a MongoDB command or query and may be returned by `MongoDB\Driver\Manager::executeCommand` or `MongoDB\Driver\Manager::executeQuery`, respectively.', -'MongoDB\Driver\CursorId' => 'The `MongoDB\Driver\CursorID` class is a value object that represents a cursor ID. Instances of this class are returned by `MongoDB\Driver\Cursor::getId`.', -'MongoDB\Driver\Exception\AuthenticationException' => 'Thrown when the driver fails to authenticate with the server.', -'MongoDB\Driver\Exception\BulkWriteException' => 'Thrown when a bulk write operation fails.', -'MongoDB\Driver\Exception\CommandException' => 'Thrown when a command fails.', -'MongoDB\Driver\Exception\ConnectionException' => 'Base class for exceptions thrown when the driver fails to establish a database connection.', -'MongoDB\Driver\Exception\ConnectionTimeoutException' => 'Thrown when the driver fails to establish a database connection within a specified time limit (connectTimeoutMS) or server selection fails (serverSelectionTimeoutMS).', -'MongoDB\Driver\Exception\Exception' => 'Common interface for all driver exceptions. This may be used to catch only exceptions originating from the driver itself.', -'MongoDB\Driver\Exception\ExecutionTimeoutException' => 'Thrown when a query or command fails to complete within a specified time limit (e.g. maxTimeMS).', -'MongoDB\Driver\Exception\InvalidArgumentException' => 'Thrown when a driver method is given invalid arguments (e.g. invalid option types).', -'MongoDB\Driver\Exception\LogicException' => 'Thrown when the driver is incorrectly used (e.g. rewinding a cursor).', -'MongoDB\Driver\Exception\RuntimeException' => 'Thrown when the driver encounters a runtime error (e.g. internal error from libmongoc).', -'MongoDB\Driver\Exception\ServerException' => 'Base class for exceptions thrown by the server. The code of this exception and its subclasses will correspond to the original error code from the server.', -'MongoDB\Driver\Exception\SSLConnectionException' => 'Thrown when the driver fails to establish an SSL connection with the server.', -'MongoDB\Driver\Exception\UnexpectedValueException' => 'Thrown when the driver encounters an unexpected value (e.g. during BSON serialization or deserialization).', -'MongoDB\Driver\Exception\WriteException' => 'Base class for exceptions thrown by a failed write operation. The exception encapsulates a `MongoDB\Driver\WriteResult` object.', -'MongoDB\Driver\Manager' => 'The `MongoDB\Driver\Manager` is the main entry point to the extension. It is responsible for maintaining connections to MongoDB (be it standalone server, replica set, or sharded cluster). - -No connection to MongoDB is made upon instantiating the Manager. This means the `MongoDB\Driver\Manager` can always be constructed, even though one or more MongoDB servers are down. - -Any write or query can throw connection exceptions as connections are created lazily. A MongoDB server may also become unavailable during the life time of the script. It is therefore important that all actions on the Manager to be wrapped in try/catch statements.', -'MongoDB\Driver\Monitoring\CommandFailedEvent' => 'The `MongoDB\Driver\Monitoring\CommandFailedEvent` class encapsulates information about a failed command.', -'MongoDB\Driver\Monitoring\CommandStartedEvent' => 'The `MongoDB\Driver\Monitoring\CommandStartedEvent` class encapsulates information about a started command.', -'MongoDB\Driver\Monitoring\CommandSubscriber' => 'Classes may implement this interface to register an event subscriber that is notified for each started, successful, and failed command event. See the PHP manual\'s section on mongodb.tutorial.apm for additional information.', -'MongoDB\Driver\Monitoring\CommandSucceededEvent' => 'The `MongoDB\Driver\Monitoring\CommandSucceededEvent` class encapsulates information about a successful command.', -'MongoDB\Driver\Monitoring\Subscriber' => 'Base interface for event subscribers. This is used for type-hinting `MongoDB\Driver\Monitoring\addSubscriber` and `MongoDB\Driver\Monitoring\removeSubscriber` and should not be implemented directly.', -'MongoDB\Driver\Query' => 'The `MongoDB\Driver\Query` class is a value object that represents a database query.', -'MongoDB\Driver\ReadConcern' => '`MongoDB\Driver\ReadConcern` controls the level of isolation for read operations for replica sets and replica set shards. This option requires MongoDB 3.2 or later.', -'MongoDB\Driver\ReadPreference' => 'Class ReadPreference', -'MongoDB\Driver\Session' => 'The `MongoDB\Driver\Session` class represents a client session and is returned by `MongoDB\Driver\Manager::startSession`. Commands, queries, and write operations may then be associated the session.', -'MongoDB\Driver\WriteConcern' => '`MongoDB\Driver\WriteConcern` describes the level of acknowledgement requested from MongoDB for write operations to a standalone `mongod` or to replica sets or to sharded clusters. In sharded clusters, `mongos` instances will pass the write concern on to the shards.', -'MongoDB\Driver\WriteConcernError' => 'The `MongoDB\Driver\WriteConcernError` class encapsulates information about a write concern error and may be returned by `MongoDB\Driver\WriteResult::getWriteConcernError`.', -'MongoDB\Driver\WriteError' => 'The `MongoDB\Driver\WriteError` class encapsulates information about a write error and may be returned as an array element from `MongoDB\Driver\WriteResult::getWriteErrors`.', -'MongoDB\Driver\WriteResult' => 'The `MongoDB\Driver\WriteResult` class encapsulates information about an executed `MongoDB\Driver\BulkWrite` and may be returned by `MongoDB\Driver\Manager::executeBulkWrite`.', -'MongoDBRef' => 'This class can be used to create lightweight links between objects in different collections. - -*Motivation*: Suppose we need to refer to a document in another collection. The easiest way is to create a field in the current document. For example, if we had a "people" collection and an "addresses" collection, we might want to create a link between each person document and an address document: Linking documents people; $addresses = $db->addresses; $myAddress = array("line 1" => "123 Main Street", "line 2" => null, "city" => "Springfield", "state" => "Vermont", "country" => "USA"); // save the address $addresses->insert($myAddress); // save a person with a reference to the address $me = array("name" => "Fred", "address" => $myAddress[\'_id\']); $people->insert($me); ?> ]]> - -Then, later on, we can find the person\'s address by querying the "addresses" collection with the `MongoId` we saved in the "people" collection. - -Suppose now that we have a more general case, where we don\'t know which collection (or even which database) contains the referenced document. `MongoDBRef` is a good choice for this case, as it is a common format that all of the drivers and the database understand. - -If each person had a list of things they liked which could come from multiple collections, such as "hobbies", "sports", "books", etc., we could use `MongoDBRef`s to keep track of what "like" went with what collection: Creating MongoDBRef links selectCollection("people"); // model trains are in the "hobbies" collection $trainRef = MongoDBRef::create("hobbies", $modelTrains[\'_id\']); // soccer is in the "sports" collection $soccerRef = MongoDBRef::create("sports", $soccer[\'_id\']); // now we\'ll know what collections the items in the "likes" array came from when // we retrieve this document $people->insert(array("name" => "Fred", "likes" => array($trainRef, $soccerRef))); ?> ]]> - -Database references can be thought of as hyperlinks: they give the unique address of another document, but they do not load it or automatically follow the link/reference. - -A database reference is just a normal associative array, not an instance of `MongoDBRef`, so this class is a little different than the other data type classes. This class contains exclusively static methods for manipulating database references.', -'MongoDeleteBatch' => 'Constructs a batch of DELETE operations. See `MongoWriteBatch`.', -'MongoDuplicateKeyException' => 'Thrown when attempting to insert a document into a collection which already contains the same values for the unique keys.', -'MongoException' => 'Default Mongo exception. - -This covers a bunch of different error conditions that may eventually be moved to more specific exceptions, but will always extend `MongoException`.', -'MongoExecutionTimeoutException' => 'Thrown when a operation times out server side (i.e. in MongoDB). - -To configure the operation timeout threshold, use `MongoCursor::maxTimeMS` or the `"maxTimeMS"` command option.', -'MongoGridFS' => 'Utilities for storing and retrieving files from the database. - -GridFS is a storage specification all supported drivers implement. Basically, it defines two collections: `files`, for file metadata, and `chunks`, for file content. If the file is large, it will automatically be split into smaller chunks and each chunk will be saved as a document in the chunks collection. - -Each document in the files collection contains the filename, upload date, and md5 hash. It also contains a unique `_id` field, which can be used to query the chunks collection for the file\'s content. Each document in the chunks collection contains a chunk of binary data, a `files_id` field that matches its file\'s `_id`, and the position of this chunk in the overall file. - -For example, the files document is something like: 123456789, "filename" => "foo.txt", "chunkSize" => 3, "length" => 12); ?> ]]> and the chunks documents look like: 123456789, "n" => 0, "data" => new MongoBinData("abc")); array("files_id" => 123456789, "n" => 1, "data" => new MongoBinData("def")); array("files_id" => 123456789, "n" => 2, "data" => new MongoBinData("ghi")); array("files_id" => 123456789, "n" => 3, "data" => new MongoBinData("jkl")); ?> ]]> Of course, the default chunk size is thousands of bytes, but that makes an unwieldy example.', -'MongoGridFSCursor' => 'Cursor for database file results.', -'MongoGridFSException' => 'Thrown when there are errors reading or writing files to or from the database.', -'MongoGridFSFile' => 'A database file object.', -'MongoId' => 'A unique identifier created for database objects. If an object is inserted into the database without an _id field, an _id field will be added to it with a `MongoId` instance as its value. If the data has a naturally occurring unique field (e.g. username or timestamp) it is fine to use this as the _id field instead, and it will not be replaced with a `MongoId`. - -Instances of the `MongoId` class fulfill the role that autoincrementing does in a relational database: to provide a unique key if the data does not naturally have one. Autoincrementing does not work well with a sharded database, as it is difficult to determine the next number in the sequence. This class fulfills the constraints of quickly generating a value that is unique across shards. - -Each MongoId is 12 bytes (making its string form 24 hexadecimal characters). The first four bytes are a timestamp, the next three are a hash of the client machine\'s hostname, the next two are the two least significant bytes of the process id running the script, and the last three bytes are an incrementing value. - -`MongoId`s are serializable/unserializable. Their serialized form is similar to their string form:', -'MongoInsertBatch' => 'Constructs a batch of INSERT operations. See `MongoWriteBatch`.', -'MongoInt32' => 'The class can be used to save 32-bit integers to the database on a 64-bit system.', -'MongoInt64' => 'The class can be used to save 64-bit integers to the database on a 32-bit system.', -'MongoLog' => 'Logging can be used to get detailed information about what the driver is doing. Logging is disabled by default, but this class allows you to activate specific levels of logging for various parts of the driver. Some examples:', -'MongoMaxKey' => '`MongoMaxKey` is an special type used by the database that compares greater than all other possible BSON values. Thus, if a query is sorted by a given field in ascending order, any document with a `MongoMaxKey` as its value will be returned last. - -`MongoMaxKey` has no associated fields, methods, or constants. It is merely the "greatest" value that can be represented in the database.', -'MongoMinKey' => '`MongoMinKey` is an special type used by the database that compares less than all other possible BSON values. Thus, if a query is sorted by a given field in ascending order, any document with a `MongoMinKey` as its value will be returned first. - -`MongoMinKey` has no associated fields, methods, or constants. It is merely the "smallest" value that can be represented in the database.', -'MongoProtocolException' => 'When talking to MongoDB 2.6.0, and later, certain operations (such as writes) may throw MongoProtocolException when the response from the server did not make sense - for example during network failure (we could read the entire response) or data corruption. - -This exception is also thrown when attempting to talk newer protocols then the server supports, for example using the `MongoWriteBatch` when talking to a MongoDB server prior to 2.6.0.', -'MongoRegex' => 'This class can be used to create regular expressions. Typically, these expressions will be used to query the database and find matching strings. More unusually, they can be saved to the database and retrieved. - -Regular expressions consist of four parts. First a `/` as starting delimiter, then the pattern, another `/` and finally a string containing flags. - -Regular expression pattern - -MongoDB recognizes six regular expression flags:', -'MongoResultException' => 'The MongoResultException is thrown by several command helpers (such as `MongoCollection::findAndModify`) in the event of failure. The original result document is available through `MongoResultException::getDocument`.', -'MongoTimestamp' => '`MongoTimestamp` is an internal type used by MongoDB for replication and sharding. It consists of a 4-byte timestamp (i.e. seconds since the epoch) and a 4-byte increment. This type is not intended for storing time or date values (e.g. a "createdAt" field on a document).', -'MongoUpdateBatch' => 'Constructs a batch of UPDATE operations. See `MongoWriteBatch`.', -'MongoWriteBatch' => 'MongoWriteBatch is the base class for the `MongoInsertBatch`, `MongoUpdateBatch` and `MongoDeleteBatch` classes. - -MongoWriteBatch allows you to "batch up" multiple operations (of same type) and shipping them all to MongoDB at the same time. This can be especially useful when operating on many documents at the same time to reduce roundtrips. - -Prior to version 1.5.0 of the driver it was possible to use `MongoCollection::batchInsert`, however, as of 1.5.0 that method is now discouraged. - -Note: This class is only available when talking to MongoDB 2.6.0 (and later) servers. It will throw `MongoProtocolException` if attempting to use it on older MongoDB servers.', -'MongoWriteConcernException' => 'MongoWriteConcernException is thrown when a write fails. See the PHP manual\'s section on mongo.writeconcerns for how to set failure thresholds. - -Prior to MongoDB 2.6.0, the getLastError command would determine whether a write failed.', -'MultipleIterator' => 'An Iterator that sequentially iterates over all attached iterators', -'Mutex' => 'The static methods contained in the Mutex class provide direct access to Posix Mutex functionality.', -'mysql_xdevapi\Table' => 'Provides access to the table through INSERT/SELECT/UPDATE/DELETE statements.', -'mysql_xdevapi\TableDelete' => 'A statement for delete operations on Table.', -'mysql_xdevapi\TableInsert' => 'A statement for insert operations on Table.', -'mysql_xdevapi\TableSelect' => 'A statement for record retrieval operations on a Table.', -'mysql_xdevapi\TableUpdate' => 'A statement for record update operations on a Table.', -'mysqli' => 'Represents a connection between PHP and a MySQL database.', -'mysqli_driver' => 'MySQLi Driver.', -'mysqli_result' => 'Represents the result set obtained from a query against the database. - -`Changelog`*', -'mysqli_sql_exception' => 'The mysqli exception handling class.', -'mysqli_stmt' => 'Represents a prepared statement.', -'mysqli_warning' => 'Represents a MySQL warning.', -'NoRewindIterator' => 'This iterator cannot be rewound.', -'Normalizer' => 'The Unicode Consortium has defined a number of normalization forms reflecting the various needs of applications: Normalization Form D (NFD) - Canonical Decomposition Normalization Form C (NFC) - Canonical Decomposition followed by Canonical Composition Normalization Form KD (NFKD) - Compatibility Decomposition Normalization Form KC (NFKC) - Compatibility Decomposition followed by Canonical Composition The different forms are defined in terms of a set of transformations on the text, transformations that are expressed by both an algorithm and a set of data files.', -'NumberFormatter' => 'For currencies you can use currency format type to create a formatter that returns a string with the formatted number and the appropriate currency sign. Of course, the NumberFormatter class is unaware of exchange rates so, the number output is the same regardless of the specified currency. This means that the same number has different monetary values depending on the currency locale. If the number is 9988776.65 the results will be: 9 988 776,65 € in France 9.988.776,65 € in Germany $9,988,776.65 in the United States', -'OAuth' => 'The OAuth extension provides a simple interface to interact with data providers using the OAuth HTTP specification to protect private resources.', -'OAuthException' => 'This exception is thrown when exceptional errors occur while using the OAuth extension and contains useful debugging information.', -'OAuthProvider' => 'Manages an OAuth provider class. - -See also an external in-depth tutorial titled Writing an OAuth Provider Service, which takes a hands-on approach to providing this service. There are also OAuth provider examples within the OAuth extensions sources.', -'OCI-Collection' => 'OCI8 Collection functionality.', -'OCI-Lob' => 'OCI8 LOB functionality for large binary (BLOB) and character (CLOB) objects.', -'OCI_Collection' => 'OCI8 Collection functionality.', -'OCI_Lob' => 'OCI8 LOB functionality for large binary (BLOB) and character (CLOB) objects.', -'OuterIterator' => 'Classes implementing `OuterIterator` can be used to iterate over iterators.', -'OutOfBoundsException' => 'Exception thrown if a value is not a valid key. This represents errors that cannot be detected at compile time.', -'OutOfRangeException' => 'Exception thrown when an illegal index was requested. This represents errors that should be detected at compile time.', -'outputformatObj' => 'Instance of outputformatObj is always embedded inside the `mapObj`_. -It is uses a read only. -No constructor available (coming soon, see ticket 979)', -'OverflowException' => 'Exception thrown when adding an element to a full container.', -'ParentIterator' => 'This extended `FilterIterator` allows a recursive iteration using `RecursiveIteratorIterator` that only shows those elements which have children.', -'Parle\ErrorInfo' => 'The class represents detailed error information as supplied by `Parle\Parser::errorInfo`', -'Parle\Lexer' => 'Single state lexer class. Lexemes can be defined on the fly. If the particular lexer instance is meant to be used with `Parle\Parser`, the token IDs need to be taken from there. Otherwise, arbitrary token IDs can be supplied. This lexer can give a certain performance advantage over `Parle\RLexer`, if no multiple states are required. Note, that `Parle\RParser` is not compatible with this lexer.', -'Parle\Parser' => 'Parser class. Rules can be defined on the fly. Once finalized, a `Parle\Lexer` instance is required to deliver the token stream.', -'Parle\RLexer' => 'Multistate lexer class. Lexemes can be defined on the fly. If the particular lexer instance is meant to be used with `Parle\RParser`, the token IDs need to be taken from there. Otherwise, arbitrary token IDs can be supplied. Note, that `Parle\Parser` is not compatible with this lexer.', -'Parle\RParser' => 'Parser class. Rules can be defined on the fly. Once finalized, a `Parle\RLexer` instance is required to deliver the token stream.', -'Parle\Stack' => '`Parle\Stack` is a LIFO stack. The elements are inserted and and removed only from one end.', -'Parle\Token' => 'This class represents a token. Lexer returns instances of this class.', -'ParseError' => '`ParseError` is thrown when an error occurs while parsing PHP code, such as when `eval` is called.', -'PDO' => 'Represents a connection between PHP and a database server.', -'PDOException' => 'Represents an error raised by PDO. You should not throw a `PDOException` from your own code. See Exceptions for more information about Exceptions in PHP.', -'PDOStatement' => 'Represents a prepared statement and, after the statement is executed, an associated result set.', -'Phar' => 'The Phar class provides a high-level interface to accessing and creating phar archives.', -'PharData' => 'The PharData class provides a high-level interface to accessing and creating non-executable tar and zip archives. Because these archives do not contain a stub and cannot be executed by the phar extension, it is possible to create and manipulate regular zip and tar files using the PharData class even if `phar.readonly` php.ini setting is `1`.', -'PharException' => 'The PharException class provides a phar-specific exception class for try/catch blocks.', -'PharFileInfo' => 'The PharFileInfo class provides a high-level interface to the contents and attributes of a single file within a phar archive.', -'php_user_filter' => 'Children of this class are passed to `stream_filter_register`.', -'pht\AtomicInteger' => 'The `pht\AtomicInteger` class is currently the only supported atomic value. It allows for an integer to be safely passed around between, and manipulated, by multiple threads. The methods exposed by this class do not need mutex locking, since they will acquire the internal mutex lock implicitly. `pht\AtomicInteger::lock` and `pht\AtomicInteger::unlock` are still exposed, however, for when multiple operations involving the same `pht\AtomicInteger` object need to be grouped together. - -The mutex locks of the atomic values are reentrant safe.', -'pht\HashTable' => 'The `pht\HashTable` class is one of the Inter-Thread Communication (ITC) data structures exposed by pht. It can be safely passed around between threads, and manipulated by multiple threads using the mutex locks that have been packed in with the data structure. It is reference-counted across threads, and so it does not need to be explicitly destroyed. - -The `pht\HashTable` class enables for array access upon its objects (along with the `isset` and `unset` functions). The `ArrayAccess` interface is not explicitly implemented, however, because it is only needed for such abilities by userland classes.', -'pht\Queue' => 'The `pht\Queue` class is one of the Inter-Thread Communication (ITC) data structures exposed by pht. It can be safely passed around between threads, and manipulated by multiple threads using the mutex locks that have been packed in with the data structure. It is reference-counted across threads, and so it does not need to be explicitly destroyed.', -'pht\Runnable' => 'The `pht\Runnable` interface enforces the implementation of a run() method on classes that should be threaded. This method acts as the entry point of the threaded class.', -'pht\Thread' => 'The `pht\Thread` class abstracts away a native thread. It has an internal task queue, where the methods `pht\Thread::addClassTask`, `pht\Thread::addFunctionTask`, and `pht\Thread::addFileTask` push new tasks onto this queue. Invoking the `pht\Thread::start` method will cause the new thread to be spawned, where it will then begin working through the task queue. A thread may be reused for any number of tasks.', -'pht\Threaded' => 'The `pht\Threaded` interface is an internal interface used by the Inter-Thread Communication (ITC) data structures (`pht\HashTable`, `pht\Queue`, and `pht\Vector`). It allows those data structures to be threaded and ensures that the mutex locking API (`pht\Threaded::lock` and `pht\Threaded::unlock`) is implemented by each of the ITC data structures. It is not implementable by userland classes (since standalone mutex locks are not exposed).', -'pht\Vector' => 'The `pht\Vector` class is one of the Inter-Thread Communication (ITC) data structures exposed by pht. It can be safely passed around between threads, and manipulated by multiple threads using the mutex locks that have been packed in with the data structure. It is reference-counted across threads, and so is does not need to be explicitly destroyed. - -The `pht\Vector` class enables for array access upon its objects (along with the `isset` and `unset` functions). The `ArrayAccess` interface is not explicitly implemented, however, because it is only needed for such abilities by userland classes.', -'Pool' => 'A Pool is a container for, and controller of, an adjustable number of Workers. - -Pooling provides a higher level abstraction of the Worker functionality, including the management of references in the way required by pthreads.', -'querymapObj' => 'Instances of querymapObj are always are always embedded inside the -`mapObj`_.', -'QuickHashIntHash' => 'This class wraps around a hash containing integer numbers, where the values are also integer numbers. Hashes are also available as implementation of the ArrayAccess interface. - -Hashes can also be iterated over with foreach as the Iterator interface is implemented as well. The order of which elements are returned in is not guaranteed.', -'QuickHashIntSet' => 'This class wraps around a set containing integer numbers. - -Sets can also be iterated over with foreach as the Iterator interface is implemented as well. The order of which elements are returned in is not guaranteed.', -'QuickHashIntStringHash' => 'This class wraps around a hash containing integer numbers, where the values are strings. Hashes are also available as implementation of the ArrayAccess interface. - -Hashes can also be iterated over with foreach as the Iterator interface is implemented as well. The order of which elements are returned in is not guaranteed.', -'QuickHashStringIntHash' => 'This class wraps around a hash containing strings, where the values are integer numbers. Hashes are also available as implementation of the ArrayAccess interface. - -Hashes can also be iterated over with foreach as the Iterator interface is implemented as well. The order of which elements are returned in is not guaranteed.', -'RangeException' => 'Exception thrown to indicate range errors during program execution. Normally this means there was an arithmetic error other than under/overflow. This is the runtime version of `DomainException`.', -'RarArchive' => 'This class represents a RAR archive, which may be formed by several volumes (parts) and which contains a number of RAR entries (i.e., files, directories and other special objects such as symbolic links). - -Objects of this class can be traversed, yielding the entries stored in the respective RAR archive. Those entries can also be obtained through `RarArchive::getEntry` and `RarArchive::getEntries`.', -'RarEntry' => 'A RAR entry, representing a directory or a compressed file inside a RAR archive.', -'RarException' => 'This class serves two purposes: it is the type of the exceptions thrown by the RAR extension functions and methods and it allows, through static methods to query and define the error behaviour of the extension, i.e., whether exceptions are thrown or only warnings are emitted. - -The following error codes are used:', -'RdKafka\Conf' => 'Configuration reference: https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md', -'RdKafka\TopicConf' => 'Configuration reference: https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md', -'rectObj' => 'rectObj are sometimes embedded inside other objects. New ones can -also be created with:', -'RecursiveArrayIterator' => 'This iterator allows to unset and modify values and keys while iterating over Arrays and Objects in the same way as the `ArrayIterator`. Additionally it is possible to iterate over the current iterator entry.', -'RecursiveCachingIterator' => '...', -'RecursiveDirectoryIterator' => 'The `RecursiveDirectoryIterator` provides an interface for iterating recursively over filesystem directories.', -'RecursiveFilterIterator' => 'This abstract iterator filters out unwanted values for a `RecursiveIterator`. This class should be extended to implement custom filters. The `RecursiveFilterIterator::accept` must be implemented in the subclass.', -'RecursiveIterator' => 'Classes implementing `RecursiveIterator` can be used to iterate over iterators recursively.', -'RecursiveIteratorIterator' => 'Can be used to iterate through recursive iterators.', -'RecursiveRegexIterator' => 'This recursive iterator can filter another recursive iterator via a regular expression.', -'RecursiveTreeIterator' => 'Allows iterating over a `RecursiveIterator` to generate an ASCII graphic tree.', -'referenceMapObj' => 'Instances of referenceMapObj are always embedded inside the `mapObj`_.', -'Reflection' => 'The reflection class.', -'ReflectionClass' => 'The `ReflectionClass` class reports information about a class.', -'ReflectionClassConstant' => 'The `ReflectionClassConstant` class reports information about a class constant.', -'ReflectionException' => 'The ReflectionException class.', -'ReflectionExtension' => 'The `ReflectionExtension` class reports information about an extension.', -'ReflectionFunction' => 'The `ReflectionFunction` class reports information about a function.', -'ReflectionFunctionAbstract' => 'A parent class to `ReflectionFunction`, read its description for details.', -'ReflectionGenerator' => 'The `ReflectionGenerator` class reports information about a generator.', -'ReflectionMethod' => 'The `ReflectionMethod` class reports information about a method.', -'ReflectionObject' => 'The `ReflectionObject` class reports information about an `object`.', -'ReflectionParameter' => 'The `ReflectionParameter` class retrieves information about function\'s or method\'s parameters. - -To introspect function parameters, first create an instance of the `ReflectionFunction` or `ReflectionMethod` classes and then use their `ReflectionFunctionAbstract::getParameters` method to retrieve an array of parameters.', -'ReflectionProperty' => 'The `ReflectionProperty` class reports information about classes properties.', -'ReflectionType' => 'The `ReflectionType` class reports information about a function\'s return type.', -'Reflector' => '`Reflector` is an interface implemented by all exportable Reflection classes.', -'RegexIterator' => 'This iterator can be used to filter another iterator based on a regular expression.', -'RRDCreator' => 'Class for creation of RRD database file.', -'RRDGraph' => 'Class for exporting data from RRD database to image file.', -'RRDUpdater' => 'Class for updating RDD database file.', -'RuntimeException' => 'Exception thrown if an error which can only be found on runtime occurs.', -'scalebarObj' => 'Instances of scalebarObj are always embedded inside the `mapObj`_.', -'SeekableIterator' => 'The Seekable iterator.', -'SessionHandler' => '`SessionHandler` is a special class that can be used to expose the current internal PHP session save handler by inheritance. There are seven methods which wrap the seven internal session save handler callbacks (open, close, read, write, destroy, gc and create_sid). By default, this class will wrap whatever internal save handler is set as defined by the session.save_handler configuration directive which is usually files by default. Other internal session save handlers are provided by PHP extensions such as SQLite (as sqlite), Memcache (as memcache), and Memcached (as memcached). - -When a plain instance of `SessionHandler` is set as the save handler using `session_set_save_handler` it will wrap the current save handlers. A class extending from `SessionHandler` allows you to override the methods or intercept or filter them by calls the parent class methods which ultimately wrap the internal PHP session handlers. - -This allows you, for example, to intercept the read and write methods to encrypt/decrypt the session data and then pass the result to and from the parent class. Alternatively one might chose to entirely override a method like the garbage collection callback gc. - -Because the `SessionHandler` wraps the current internal save handler methods, the above example of encryption can be applied to any internal save handler without having to know the internals of the handlers. - -To use this class, first set the save handler you wish to expose using session.save_handler and then pass an instance of `SessionHandler` or one extending it to `session_set_save_handler`. - -Please note the callback methods of this class are designed to be called internally by PHP and are not meant to be called from user-space code. The return values are equally processed internally by PHP. For more information on the session workflow, please refer `session_set_save_handler`.', -'SessionHandlerInterface' => '`SessionHandlerInterface` is an interface which defines a prototype for creating a custom session handler. In order to pass a custom session handler to `session_set_save_handler` using its `OOP` invocation, the class must implement this interface. - -Please note the callback methods of this class are designed to be called internally by PHP and are not meant to be called from user-space code.', -'SimpleXMLElement' => 'Represents an element in an XML document.', -'SimpleXMLIterator' => 'The SimpleXMLIterator provides recursive iteration over all nodes of a `SimpleXMLElement` object.', -'SNMP' => 'Represents SNMP session.', -'SNMPException' => 'Represents an error raised by SNMP. You should not throw a `SNMPException` from your own code. See Exceptions for more information about Exceptions in PHP.', -'SoapClient' => 'The SoapClient class provides a client for SOAP 1.1, SOAP 1.2 servers. It can be used in WSDL or non-WSDL mode.', -'SoapFault' => 'Represents a SOAP fault.', -'SoapHeader' => 'Represents a SOAP header.', -'SoapParam' => 'Represents parameter to a SOAP call.', -'SoapServer' => 'The SoapServer class provides a server for the SOAP 1.1 and SOAP 1.2 protocols. It can be used with or without a WSDL service description.', -'SoapVar' => 'A class representing a variable or object for use with SOAP services.', -'SolrClient' => 'Used to send requests to a Solr server. Currently, cloning and serialization of SolrClient instances is not supported.', -'SolrClientException' => 'An exception thrown when there is an error while making a request to the server from the client.', -'SolrCollapseFunction' => 'Class SolrCollapseFunction', -'SolrDisMaxQuery' => 'Version not present on php.net documentation, determined here by using PECL solr changelog: -https://pecl.php.net/package-changelog.php?package=solr&release=2.1.0 <br/> -Class SolrDisMaxQuery<br/>', -'SolrDocument' => 'Represents a Solr document retrieved from a query response.', -'SolrDocumentField' => 'This represents a field in a Solr document. All its properties are read-only.', -'SolrException' => 'This is the base class for all exception thrown by the Solr extension classes.', -'SolrGenericResponse' => 'Represents a response from the solr server.', -'SolrIllegalArgumentException' => 'This object is thrown when an illegal or invalid argument is passed to a method.', -'SolrIllegalOperationException' => 'This object is thrown when an illegal or unsupported operation is performed on an object.', -'SolrInputDocument' => 'This class represents a Solr document that is about to be submitted to the Solr index.', -'SolrMissingMandatoryParameterException' => 'Class SolrMissingMandatoryParameterException<br/>', -'SolrModifiableParams' => 'Represents a collection of name-value pairs sent to the Solr server during a request.', -'SolrObject' => 'This is an object whose properties can also by accessed using the array syntax. All its properties are read-only.', -'SolrParams' => 'Represents a collection of name-value pairs sent to the Solr server during a request.', -'SolrPingResponse' => 'Represents a response to a ping request to the server', -'SolrQuery' => 'Represents a collection of name-value pairs sent to the Solr server during a request.', -'SolrQueryResponse' => 'Represents a response to a query request.', -'SolrResponse' => 'Represents a response from the Solr server.', -'SolrServerException' => 'An exception thrown when there is an error produced by the Solr Server itself.', -'SolrUpdateResponse' => 'Represents a response to an update request.', -'SolrUtils' => 'Contains utility methods for retrieving the current extension version and preparing query phrases. - -Also contains method for escaping query strings and parsing XML responses.', -'SphinxClient' => 'The SphinxClient class provides object-oriented interface to Sphinx.', -'SplBool' => 'The SplBool class is used to enforce strong typing of the bool type.', -'SplDoublyLinkedList' => 'The SplDoublyLinkedList class provides the main functionalities of a doubly linked list.', -'SplEnum' => 'SplEnum gives the ability to emulate and create enumeration objects natively in PHP.', -'SplFileInfo' => 'The SplFileInfo class offers a high-level object oriented interface to information for an individual file.', -'SplFileObject' => 'The SplFileObject class offers an object oriented interface for a file.', -'SplFixedArray' => '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 allows a faster array implementation.', -'SplFloat' => 'The SplFloat class is used to enforce strong typing of the float type.', -'SplHeap' => 'The SplHeap class provides the main functionalities of a Heap.', -'SplInt' => 'The SplInt class is used to enforce strong typing of the integer type.', -'SplMaxHeap' => 'The SplMaxHeap class provides the main functionalities of a heap, keeping the maximum on the top.', -'SplMinHeap' => 'The SplMinHeap class provides the main functionalities of a heap, keeping the minimum on the top.', -'SplObjectStorage' => '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.', -'SplObserver' => 'The `SplObserver` interface is used alongside `SplSubject` to implement the Observer Design Pattern.', -'SplPriorityQueue' => 'The SplPriorityQueue class provides the main functionalities of a prioritized queue, implemented using a max heap.', -'SplQueue' => 'The SplQueue class provides the main functionalities of a queue implemented using a doubly linked list.', -'SplStack' => 'The SplStack class provides the main functionalities of a stack implemented using a doubly linked list.', -'SplString' => 'The SplString class is used to enforce strong typing of the string type.', -'SplSubject' => 'The `SplSubject` interface is used alongside `SplObserver` to implement the Observer Design Pattern.', -'SplTempFileObject' => 'The SplTempFileObject class offers an object oriented interface for a temporary file.', -'SplType' => 'Parent class for all SPL types.', -'Spoofchecker' => 'This class is provided because Unicode contains large number of characters and incorporates the varied writing systems of the world and their incorrect usage can expose programs or systems to possible security attacks using characters similarity. - -Provided methods allow to check whether an individual string is likely an attempt at confusing the reader (`spoof detection`), such as "pаypаl" spelled with Cyrillic \'а\' characters.', -'SQLite3' => 'A class that interfaces SQLite 3 databases.', -'SQLite3Result' => 'A class that handles result sets for the SQLite 3 extension.', -'SQLite3Stmt' => 'A class that handles prepared statements for the SQLite 3 extension.', -'SQLiteUnbuffered' => 'Represents an unbuffered SQLite result set. Unbuffered results sets are sequential, forward-seeking only.', -'Stackable' => 'Stackable is an alias of Threaded. This class name was used in pthreads until -version 2.0.0', -'Stomp' => 'Represents a connection between PHP and a Stomp compliant Message Broker.', -'StompException' => 'Represents an error raised by the stomp extension. See Exceptions for more information about Exceptions in PHP.', -'StompFrame' => 'Represents a message which was sent or received from a Stomp compliant Message Broker.', -'streamWrapper' => 'Allows you to implement your own protocol handlers and streams for use with all the other filesystem functions (such as `fopen`, `fread` etc.). - -An instance of this class is initialized as soon as a stream function tries to access the protocol it is associated with.', -'StubTests\Parsers\Visitors\ParentConnector' => 'The visitor is required to provide "parent" attribute to nodes', -'styleObj' => 'Instances of styleObj are always embedded inside a `classObj`_ or `labelObj`_.', -'SVMException' => 'The exception object thrown on errors from the SVM and SVMModel classes.', -'SVMModel' => 'The SVMModel is the end result of the training process. It can be used to classify previously unseen data.', -'SWFAction' => 'SWFAction.', -'SWFBitmap' => 'SWFBitmap.', -'SWFButton' => 'SWFButton.', -'SWFDisplayItem' => 'SWFDisplayItem.', -'SWFFill' => 'The `SWFFill` object allows you to transform (scale, skew, rotate) bitmap and gradient fills. - -`swffill` objects are created by the `SWFShape::addFill` method.', -'SWFFont' => 'The `SWFFont` object represent a reference to the font definition, for us with `SWFText::setFont` and `SWFTextField::setFont`.', -'SWFFontChar' => 'SWFFontChar.', -'SWFGradient' => 'SWFGradient.', -'SWFMorph' => 'The methods here are sort of weird. It would make more sense to just have newSWFMorph(shape1, shape2);, but as things are now, shape2 needs to know that it\'s the second part of a morph. (This, because it starts writing its output as soon as it gets drawing commands- if it kept its own description of its shapes and wrote on completion this and some other things would be much easier.)', -'SWFMovie' => '`SWFMovie` is a movie object representing an SWF movie.', -'SWFPrebuiltClip' => 'SWFPrebuiltClip.', -'SWFShape' => 'SWFShape.', -'SWFSound' => 'SWFSound.', -'SWFSoundInstance' => '`SWFSoundInstance` objects are returned by the `SWFSprite::startSound` and `SWFMovie::startSound` methods.', -'SWFSprite' => 'An `SWFSprite` is also known as a "movie clip", this allows one to create objects which are animated in their own timelines. Hence, the sprite has most of the same methods as the movie.', -'SWFText' => 'SWFText.', -'SWFTextField' => 'SWFTextField.', -'SWFVideoStream' => 'SWFVideoStream.', -'SyncEvent' => 'A cross-platform, native implementation of named and unnamed event objects. Both automatic and manual event objects are supported. - -An event object waits, without polling, for the object to be fired/set. One instance waits on the event object while another instance fires/sets the event. Event objects are useful wherever a long-running process would otherwise poll a resource (e.g. checking to see if uploaded data needs to be processed).', -'SyncMutex' => 'A cross-platform, native implementation of named and unnamed countable mutex objects. - -A mutex is a mutual exclusion object that restricts access to a shared resource (e.g. a file) to a single instance. Countable mutexes acquire the mutex a single time and internally track the number of times the mutex is locked. The mutex is unlocked as soon as it goes out of scope or is unlocked the same number of times that it was locked.', -'SyncReaderWriter' => 'A cross-platform, native implementation of named and unnamed reader-writer objects. - -A reader-writer object allows many readers or one writer to access a resource. This is an efficient solution for managing resources where access will primarily be read-only but exclusive write access is occasionally necessary.', -'SyncSemaphore' => 'A cross-platform, native implementation of named and unnamed semaphore objects. - -A semaphore restricts access to a limited resource to a limited number of instances. Semaphores differ from mutexes in that they can allow more than one instance to access a resource at one time while a mutex only allows one instance at a time.', -'SyncSharedMemory' => 'A cross-platform, native, consistent implementation of named shared memory objects. - -Shared memory lets two separate processes communicate without the need for complex pipes or sockets. There are several integer-based shared memory implementations for PHP. Named shared memory is an alternative. - -Synchronization objects (e.g. SyncMutex) are still required to protect most uses of shared memory.', -'Thread' => 'When the start method of a Thread is invoked, the run method code will be executed in separate Thread, in parallel. - -After the run method is executed the Thread will exit immediately, it will be joined with the creating Thread at the appropriate time.', -'Threaded' => 'Threaded objects form the basis of pthreads ability to execute user code in parallel; they expose synchronization methods and various useful interfaces. - -Threaded objects, most importantly, provide implicit safety for the programmer; all operations on the object scope are safe.', -'tidy' => 'An HTML node in an HTML file, as detected by tidy.', -'tidyNode' => 'An HTML node in an HTML file, as detected by tidy.', -'TokyoTyrant' => 'The main Tokyo Tyrant class', -'tokyotyrantexception' => 'TokyoTyrantException', -'TokyoTyrantIterator' => 'Provides an iterator for TokyoTyrant and TokyoTyrantTable objects. The iterator iterates over all keys and values in the database. TokyoTyrantIterator was added in version 0.2.0.', -'TokyoTyrantQuery' => 'This class is used to query the table databases', -'TokyoTyrantTable' => 'Provides an API to the table databases. A table database can be create using the following command: `ttserver -port 1979 /tmp/tt_table.tct`. In Tokyo Tyrant the table API is a schemaless database which can store arbitrary amount of key-value pairs under a single primary key.', -'Traversable' => 'Interface to detect if a class is traversable using `foreach`. - -Abstract base interface that cannot be implemented alone. Instead it must be implemented by either `IteratorAggregate` or `Iterator`.', -'TypeError' => 'There are three scenarios where a `TypeError` may be thrown. The first is where the argument type being passed to a function does not match its corresponding declared parameter type. The second is where a value being returned from a function does not match the declared function return type. The third is where an invalid number of arguments are passed to a built-in PHP function (strict mode only).', -'UI\Area' => 'An Area represents a canvas which can be used to draw, and respond to mouse and key events.', -'UI\Control' => 'This is the closed base class for all UI Controls.', -'UI\Controls\Box' => 'A Box allows the arrangement of other controls', -'UI\Controls\Button' => 'Represents a labelled clickable button', -'UI\Controls\Check' => 'A Check is a labelled checkable box', -'UI\Controls\ColorButton' => 'A Color Button is a button which displays a color picker when clicked', -'UI\Controls\Combo' => 'A Combo control represents a list of options, like the familiar select HTML element.', -'UI\Controls\EditableCombo' => 'An Editable Combo is a Combo which allows the user to enter custom options', -'UI\Controls\Entry' => 'An Entry is a text entry control, suitable for entering plain text, passwords, or search terms.', -'UI\Controls\Form' => 'A Form is a control which allows the arrangement of other controls into a familiar layout (the form).', -'UI\Controls\Grid' => 'A Grid is a control which is allows the arrangement of children into a grid', -'UI\Controls\Group' => 'A Group is a titled container for child controls', -'UI\Controls\Label' => 'A Label is a single line of text, meant to identify, for the user, some element of the interface.', -'UI\Controls\MultilineEntry' => 'A Multiline Entry is a text entry control able to hold multiple lines of text, with or without wrapping.', -'UI\Controls\Picker' => 'A Picker represents a button which when clicked presents a native Date/Time/DateTime Picker interface to the user.', -'UI\Controls\Progress' => 'A Progress control is a familiar Progress bar: It represents progress as a percentage, with a possible range of 0 to 100 (inclusive).', -'UI\Controls\Radio' => 'A Radio is similar to the radio input type familiar from HTML', -'UI\Controls\Separator' => 'A Separator represents a control separator, it has no other function.', -'UI\Controls\Slider' => 'A Slider is a control which represents a range, and a current value in the range. The sliding element of the control (sometimes called the "thumb") reflects the value, and can be adjusted within the range.', -'UI\Controls\Spin' => 'A Spin box is a text box with an up-down control which changes the integer value in the box, within a defined range', -'UI\Controls\Tab' => 'A Tab can contain many pages of Controls, each with a title, each selectable by the user.', -'UI\Draw\Brush' => 'Represents a solid color brush', -'UI\Draw\Brush\Gradient' => 'Abstract for gradient brushes', -'UI\Draw\Color' => 'Represents RGBA colours, individual channels are accessible via public properties.', -'UI\Draw\Path' => 'A Draw Path guides a Draw Pen, telling the Pen where to draw on an Area.', -'UI\Draw\Pen' => 'The Pen is passed to the Area Draw event handler, it is used for clipping, filling, stroking, and writing to Draw Paths.', -'UI\Draw\Stroke' => 'Holds the configuration for the Pen to perform a stroke', -'UI\Draw\Text\Font' => 'Loads a described font', -'UI\Draw\Text\Font\Descriptor' => 'Describes a font', -'UI\Draw\Text\Layout' => 'A Text Layout represents the layout of text which will be drawn by the Pen', -'UI\Executor' => 'This facility schedules repetitive execution of a callback, useful for animations and other such activities.', -'UI\Menu' => 'Menus must be constructed before the first Window, and can be shown on any Window', -'UI\MenuItem' => 'Menu Items should only be created by the Menu', -'UI\Point' => 'Points are used throughout UI to represent co-ordinates on a screen, control, or area.', -'UI\Size' => 'Sizes are used throughout UI to represent the size of a screen, control, or area.', -'UI\Window' => 'Represents a UI Window', -'UnderflowException' => 'Exception thrown when performing an invalid operation on an empty container, such as removing an element.', -'UnexpectedValueException' => 'Exception thrown if a value does not match with a set of values. Typically this happens when a function calls another function and expects the return value to be of a certain type or value not including arithmetic or buffer related errors.', -'V8Js' => 'This is the core class for V8Js extension. Each instance created from this class has own context in which all JavaScript is compiled and executed. - -See `V8Js::__construct` for more information.', -'VARIANT' => 'The VARIANT is COM\'s equivalent of the PHP zval; it is a structure that can contain a value with a range of different possible types. The VARIANT class provided by the COM extension allows you to have more control over the way that PHP passes values to and from COM.', -'Volatile' => 'The `Volatile` class is new to pthreads v3. Its introduction is a consequence of the new immutability semantics of `Threaded` members of `Threaded` classes. The `Volatile` class enables for mutability of its `Threaded` members, and is also used to store PHP arrays in `Threaded` contexts.', -'Vtiful\Kernel\Excel' => 'Create xlsx files and set cells and output xlsx files', -'Vtiful\Kernel\Format' => 'Create a cell format object', -'WeakRef' => 'The WeakRef class provides a gateway to objects without preventing the garbage collector from freeing those objects. It also provides a way to turn a weak reference into a strong one.', -'webObj' => 'Instances of webObj are always are always embedded inside the `mapObj`_.', -'wkhtmltox\Image\Converter' => 'Converts an HTML input into various image formats', -'wkhtmltox\PDF\Converter' => 'Converts an HTML input, or set of HTML inputs, into PDF output', -'wkhtmltox\PDF\Object' => 'Represents an HTML document, input to PDF converter', -'Worker' => 'Worker Threads have a persistent context, as such should be used over Threads in most cases. - -When a Worker is started, the run method will be executed, but the Thread will not leave until one of the following conditions are met: - -This means the programmer can reuse the context throughout execution; placing objects on the stack of the Worker will cause the Worker to execute the stacked objects run method.', -'XMLDiff\Base' => 'Base abstract class for all the comparison classes in the extension.', -'XMLReader' => 'The XMLReader extension is an XML Pull parser. The reader acts as a cursor going forward on the document stream and stopping at each node on the way.', -'Yaconf' => 'Yaconf is a configurations container, it parses INIT files, stores the result in PHP when PHP is started, the result lives with the whole PHP lifecycle.', -'Yaf\Action_Abstract' => '<p>A action can be defined in a separate file in Yaf(see \Yaf\Controller_Abstract). that is a action method can also be a <b>\Yaf\Action_Abstract</b> class.</P> -<br/> -<p>Since there should be a entry point which can be called by Yaf (as of PHP 5.3, there is a new magic method __invoke, but Yaf is not only works with PHP 5.3+, Yaf choose another magic method execute), you must implement the abstract method \Yaf\Action_Abstract::execute() in your custom action class.</p>', -'Yaf\Application' => '\Yaf\Application provides a bootstrapping facility for applications which provides reusable resources, common- and module-based bootstrap classes and dependency checking. -<br/> -<b>Note:</b> -<p> -\Yaf\Application implements the singleton pattern, and \Yaf\Application can not be serialized or un-serialized which will cause problem when you try to use PHPUnit to write some test case for Yaf.<br/> -You may use @backupGlobals annotation of PHPUnit to control the backup and restore operations for global variables. thus can solve this problem. -</p>', -'Yaf\Bootstrap_Abstract' => '<p>Bootstrap is a mechanism used to do some initial config before a Application run.<br/><br/></p> -<p>User may define their own Bootstrap class by inheriting <b>\Yaf\Bootstrap_Abstract</b><br/><br/></p> -<p>Any method declared in Bootstrap class with leading "_init", will be called by \Yaf\Application::bootstrap() one by one according to their defined order<br/><br/></p>', -'Yaf\Config\Ini' => '<p>\Yaf\Config\Ini enables developers to store configuration data in a familiar INI format and read them in the application by using nested object property syntax. The INI format is specialized to provide both the ability to have a hierarchy of configuration data keys and inheritance between configuration data sections. Configuration data hierarchies are supported by separating the keys with the dot or period character ("."). A section may extend or inherit from another section by following the section name with a colon character (":") and the name of the section from which data are to be inherited.</p><br/> -<b>Note:</b> -<p>\Yaf\Config\Ini utilizes the » parse_ini_file() PHP function. Please review this documentation to be aware of its specific behaviors, which propagate to \Yaf\Config\Ini, such as how the special values of "TRUE", "FALSE", "yes", "no", and "NULL" are handled.</p>', -'Yaf\Controller_Abstract' => '<p><b>\Yaf\Controller_Abstract</b> is the heart of Yaf\'s system. MVC stands for Model-View-Controller and is a design pattern targeted at separating application logic from display logic.</p> -<br/> -<p>Every custom controller shall inherit <b>\Yaf\Controller_Abstract</b>.</p> -<br/> -<p>You will find that you can not define __construct function for your custom controller, thus, <b>\Yaf\Controller_Abstract</b> provides a magic method: \Yaf\Controller_Abstract::init().</p> -<br/> -<p>If you have defined a init() method in your custom controller, it will be called as long as the controller was instantiated.</p> -<br/> -<p>Action may have arguments, when a request coming, if there are the same name variable in the request parameters(see \Yaf\Request_Abstract::getParam()) after routed, Yaf will pass them to the action method (see \Yaf\Action_Abstract::execute()).</p> -<br/> -<b>Note:</b> -<p>These arguments are directly fetched without filtering, it should be carefully processed before use them.</p>', -'Yaf\Dispatcher' => '<p><b>\Yaf\Dispatcher</b> purpose is to initialize the request environment, route the incoming request, and then dispatch any discovered actions; it aggregates any responses and returns them when the process is complete.</p><br/> -<p><b>\Yaf\Dispatcher</b> also implements the Singleton pattern, meaning only a single instance of it may be available at any given time. This allows it to also act as a registry on which the other objects in the dispatch process may draw.</p>', -'Yaf\Loader' => '<p><b>\Yaf\Loader</b> introduces a comprehensive autoloading solution for Yaf.</p> -<br/> -<p>The first time an instance of \Yaf\Application is retrieved, <b>\Yaf\Loader</b> will instance a singleton, and registers itself with spl_autoload. You retrieve an instance using the \Yaf\Loader::getInstance()</p> -<br/> -<p><b>\Yaf\Loader</b> attempt to load a class only one shot, if failed, depend on yaf.use_spl_autoload, if this config is On \Yaf\Loader::autoload() will return FALSE, thus give the chance to other autoload function. if it is Off (by default), \Yaf\Loader::autoload() will return TRUE, and more important is that a very useful warning will be triggered (very useful to find out why a class could not be loaded).</p> -<br/> -<b>Note:</b> -<p>Please keep yaf.use_spl_autoload Off unless there is some library have their own autoload mechanism and impossible to rewrite it.</p> -<br/> -<p>If you want <b>\Yaf\Loader</b> search some classes(libraries) in the local class directory(which is defined in application.ini, and by default, it is application.directory . "/library"), you should register the class prefix using the \Yaf\Loader::registerLocalNameSpace()</p>', -'Yaf\Plugin_Abstract' => '<p>Plugins allow for easy extensibility and customization of the framework.</p> -<br/> -<p>Plugins are classes. The actual class definition will vary based on the component -- you may need to implement this interface, but the fact remains that the plugin is itself a class.</p> -<br/> -<p>A plugin could be loaded into Yaf by using \Yaf\Dispatcher::registerPlugin(), after registered, All the methods which the plugin implemented according to this interface, will be called at the proper time.</p>', -'Yaf\Registry' => '<p>All methods of <b>\Yaf\Registry</b> declared as static, making it universally accessible. This provides the ability to get or set any custom data from anyway in your code as necessary.</p>', -'Yaf\Request\Simple' => '<b>\Yaf\Request\Simple</b> is particularly used for test purpose. ie. simulate a spacial request under CLI mode.', -'Yaf\Route\Map' => '<p><b>\Yaf\Route\Map</b> is a built-in route, it simply convert a URI endpoint (that part of the URI which comes after the base URI: see \Yaf\Request_Abstract::setBaseUri()) to a controller name or action name(depends on the parameter passed to \Yaf\Route\Map::__construct()) in following rule: A => controller A. A/B/C => controller A_B_C. A/B/C/D/E => controller A_B_C_D_E.</p> -<br/> -<p>If the second parameter of \Yaf\Route\Map::__construct() is specified, then only the part before delimiter of URI will used to routing, the part after it is used to routing request parameters (see the example section of \Yaf\Route\Map::__construct()).</p>', -'Yaf\Route\Regex' => '<p><b>\Yaf\Route\Regex</b> is the most flexible route among the Yaf built-in routes.</p>', -'Yaf\Route\Rewrite' => '<p>For usage, please see the example section of \Yaf\Route\Rewrite::__construct()</p>', -'Yaf\Route\Simple' => '<p><b>\Yaf\Route\Simple</b> will match the query string, and find the route info.</p> -<br/> -<p>all you need to do is tell <b>\Yaf\Route\Simple</b> what key in the $_GET is module, what key is controller, and what key is action.</p> -<br/> -<p>\Yaf\Route\Simple::route() will always return TRUE, so it is important put <b>\Yaf\Route\Simple</b> in the front of the Route stack, otherwise all the other routes will not be called</p>', -'Yaf\Route_Interface' => '<b>\Yaf\Route_Interface</b> used for developer defined their custom route.', -'Yaf\Route_Static' => '<p>by default, \Yaf\Router only have a <b>\Yaf\Route_Static</b> as its default route.</p> -<br/> -<p><b>\Yaf\Route_Static</b> is designed to handle 80% of normal requirements.</p> -<br/> -<b>Note:</b> -<p> it is unnecessary to instance a <b>\Yaf\Route_Static</b>, also unnecessary to add it into \Yaf\Router\'s routes stack, since there is always be one in \Yaf\Router\'s routes stack, and always be called at the last time.</p>', -'Yaf\Router' => '<p><b>\Yaf\Router</b> is the standard framework router. Routing is the process of taking a URI endpoint (that part of the URI which comes after the base URI: see \Yaf\Request_Abstract::setBaseUri()) and decomposing it into parameters to determine which module, controller, and action of that controller should receive the request. This values of the module, controller, action and other parameters are packaged into a \Yaf\Request_Abstract object which is then processed by \Yaf\Dispatcher. Routing occurs only once: when the request is initially received and before the first controller is dispatched. \Yaf\Router is designed to allow for mod_rewrite-like functionality using pure PHP structures. It is very loosely based on Ruby on Rails routing and does not require any prior knowledge of webserver URL rewriting</p> -<br/> -<b>Default Route</b> -<br/> -<p><b>\Yaf\Router</b> comes pre-configured with a default route \Yaf\Route_Static, which will match URIs in the shape of controller/action. Additionally, a module name may be specified as the first path element, allowing URIs of the form module/controller/action. Finally, it will also match any additional parameters appended to the URI by default - controller/action/var1/value1/var2/value2.</p> -<br/> -<b>Note:</b> -<p>Module name must be defined in config, considering application.module="Index,Foo,Bar", in this case, only index, foo and bar can be considered as a module name. if doesn\'t config, there is only one module named "Index".</p> -<br/> -<p>** See examples by opening the external documentation</p>', -'Yaf\View\Simple' => '<b>\Yaf\View\Simple</b> is the built-in template engine in Yaf, it is a simple but fast template engine, and only support PHP script template.', -'Yaf\View_Interface' => 'Yaf provides a ability for developers to use custom view engine instead of built-in engine which is \Yaf\View\Simple. There is a example to explain how to do this, please see \Yaf\Dispatcher::setView()', -'Yaf_Action_Abstract' => 'A action can be defined in a separate file in Yaf(see `Yaf_Controller_Abstract`). that is a action method can also be a `Yaf_Action_Abstract` class. - -Since there should be a entry point which can be called by Yaf (as of PHP 5.3, there is a new magic method __invoke, but Yaf is not only works with PHP 5.3+, Yaf choose another magic method execute), you must implement the abstract method `Yaf_Action_Abstract::execute` in your custom action class.', -'Yaf_Application' => '`Yaf_Application` provides a bootstrapping facility for applications which provides reusable resources, common- and module-based bootstrap classes and dependency checking. - -`Yaf_Application` implements the singleton pattern, and `Yaf_Application` can not be serialized or unserialized which will cause problem when you try to use PHPUnit to write some test case for Yaf. You may use @backupGlobals annotation of PHPUnit to control the backup and restore operations for global variables. thus can solve this problem.', -'Yaf_Bootstrap_Abstract' => 'Bootstrap is a mechanism used to do some initial config before a Application run. - -User may define their own Bootstrap class by inheriting `Yaf_Bootstrap_Abstract` - -Any method declared in Bootstrap class with leading "_init", will be called by `Yaf_Application::bootstrap` one by one according to their defined order.', -'Yaf_Config_Ini' => 'Yaf_Config_Ini enables developers to store configuration data in a familiar INI format and read them in the application by using nested object property syntax. The INI format is specialized to provide both the ability to have a hierarchy of configuration data keys and inheritance between configuration data sections. Configuration data hierarchies are supported by separating the keys with the dot or period character ("."). A section may extend or inherit from another section by following the section name with a colon character (":") and the name of the section from which data are to be inherited. Yaf_Config_Ini utilizes the » parse_ini_file() PHP function. Please review this documentation to be aware of its specific behaviors, which propagate to Yaf_Config_Ini, such as how the special values of "`true`", "`false`", "yes", "no", and "`null`" are handled.', -'Yaf_Controller_Abstract' => '`Yaf_Controller_Abstract` is the heart of Yaf\'s system. MVC stands for Model-View-Controller and is a design pattern targeted at separating application logic from display logic. - -Every custom controller shall inherit `Yaf_Controller_Abstract`. - -You will find that you can not define __construct function for your custom controller, thus, `Yaf_Controller_Abstract` provides a magic method: `Yaf_Controller_Abstract::init`. - -If you have defined a init() method in your custom controller, it will be called as long as the controller was instantiated. - -Action may have arguments, when a request coming, if there are the same name variable in the request parameters(see `Yaf_Request_Abstract::getParam`) after routed, Yaf will pass them to the action method (see `Yaf_Action_Abstract::execute`). These arguments are directly fetched without filtering, it should be carefully processed before use them.', -'Yaf_Dispatcher' => '`Yaf_Dispatcher` purpose is to initialize the request environment, route the incoming request, and then dispatch any discovered actions; it aggregates any responses and returns them when the process is complete. - -`Yaf_Dispatcher` also implements the Singleton pattern, meaning only a single instance of it may be available at any given time. This allows it to also act as a registry on which the other objects in the dispatch process may draw.', -'Yaf_Loader' => '`Yaf_Loader` introduces a comprehensive autoloading solution for Yaf. - -The first time an instance of `Yaf_Application` is retrieved, `Yaf_Loader` will instance a singleton, and registers itself with spl_autoload. You retrieve an instance using the `Yaf_Loader::getInstance` - -`Yaf_Loader` attempt to load a class only one shot, if failed, depend on yaf.use_spl_auload, if this config is On `Yaf_Loader::autoload` will return `false`, thus give the chance to other autoload function. if it is Off (by default), `Yaf_Loader::autoload` will return `true`, and more important is that a very useful warning will be triggered (very useful to find out why a class could not be loaded). Please keep yaf.use_spl_autoload Off unless there is some library have their own autoload mechanism and impossible to rewrite it. - -By default, `Yaf_Loader` assume all library (class defined script) store in the global library directory, which is defined in the php.ini(yaf.library). - -If you want `Yaf_Loader` search some classes(libraries) in the local class directory(which is defined in application.ini, and by default, it is application.directory . "/library"), you should register the class prefix using the `Yaf_Loader::registerLocalNameSpace` - -Let\'s see some examples(assuming APPLICATION_PATH is application.directory): Config example Assuming the following local name space registered: Register localnamespace registerLocalNameSpace(array("Foo", "Bar")); } ?> ]]> Then the autoload examples: Load class example // APPLICATION_PATH/library/Foo/Bar/Test.php class GLO_Name => // /global_dir/Glo/Name.php class BarNon_Test // /global_dir/Barnon/Test.php ]]> As of PHP 5.3, you can use namespace: Load namespace class example // APPLICATION_PATH/library/Foo/Bar/Dummy.php class \FooBar\Bar\Dummy => // /global_dir/FooBar/Bar/Dummy.php ]]> - -You may noticed that all the folder with the first letter capitalized, you can make them lowercase by set yaf.lowcase_path = On in php.ini - -`Yaf_Loader` is also designed to load the MVC classes, and the rule is: MVC class loading example // APPLICATION_PATH/controllers/ Model Classes => // APPLICATION_PATH/models/ Plugin Classes => // APPLICATION_PATH/plugins/ ]]> Yaf identify a class\'s suffix(this is by default, you can also change to the prefix by change the configure yaf.name_suffix) to decide whether it is a MVC class: MVC class distinctions // ***Controller Model Classes => // ***Model Plugin Classes => // ***Plugin ]]> some examples: MVC loading example // APPLICATION_PATH/models/Data.php class DummyPlugin => // APPLICATION_PATH/plugins/Dummy.php class A_B_TestModel => // APPLICATION_PATH/models/A/B/Test.php ]]> As of 2.1.18, Yaf supports Controllers autoloading for user script side, (which means the autoloading triggered by user php script, eg: access a controller static property in Bootstrap or Plugins), but autoloader only try to locate controller class script under the default module folder, which is "APPLICATION_PATH/controllers/". also, the directory will be affected by yaf.lowcase_path.', -'Yaf_Plugin_Abstract' => 'Plugins allow for easy extensibility and customization of the framework. - -Plugins are classes. The actual class definition will vary based on the component -- you may need to implement this interface, but the fact remains that the plugin is itself a class. - -A plugin could be loaded into Yaf by using `Yaf_Dispatcher::registerPlugin`, after registering, All the methods which the plugin implemented according to this interface, will be called at the proper time.', -'Yaf_Registry' => 'All methods of `Yaf_Registry` declared as static, making it unversally accessible. This provides the ability to get or set any custom data from anyway in your code as necessary.', -'Yaf_Request_Http' => 'Any request from client is initialized as a `Yaf_Request_Http`. you can get the request information like, uri query and post parameters via methods of this class. For security, $_GET/$_POST are readonly in Yaf, which means if you set a value to these global variables, you can not get it from `Yaf_Request_Http::getQuery` or `Yaf_Request_Http::getPost`. But there do is some usage need such feature, like unit testing. thus Yaf can be built with --enable-yaf-debug, which will allow Yaf read the value user set via script. in such case, Yaf will throw a E_STRICT warning to remind you about that: Strict Standards: you are running yaf in debug mode', -'Yaf_Request_Simple' => '`Yaf_Request_Simple` is particularlly used for test puporse. ie. simulate some espacial request under CLI mode.', -'Yaf_Route_Interface' => '`Yaf_Route_Interface` used for developer defined their custom route.', -'Yaf_Route_Map' => '`Yaf_Route_Map` is a built-in route, it simply convert a URI endpoint (that part of the URI which comes after the base URI: see `Yaf_Request_Abstract::setBaseUri`) to a controller name or action name(depends on the parameter passed to `Yaf_Route_Map::__construct`) in following rule: A => controller A. A/B/C => controller A_B_C. A/B/C/D/E => controller A_B_C_D_E. - -If the second parameter of `Yaf_Route_Map::__construct` is specified, then only the part before delimiter of URI will used to routing, the part after it is used to routing request parameters (see the example section of `Yaf_Route_Map::__construct`).', -'Yaf_Route_Regex' => '`Yaf_Route_Regex` is the most flexible route among the Yaf built-in routes.', -'Yaf_Route_Rewrite' => 'For usage, please see the example section of `Yaf_Route_Rewrite::__construct`', -'Yaf_Route_Simple' => '`Yaf_Route_Simple` will match the query string, and find the route info. - -all you need to do is tell `Yaf_Route_Simple` what key in the $_GET is module, what key is controller, and what key is action. - -`Yaf_Route_Simple::route` will always return `true`, so it is important put `Yaf_Route_Simple` in the front of the Route stack, otherwise all the other routes will not be called.', -'Yaf_Route_Static' => 'Defaultly, `Yaf_Router` only have a `Yaf_Route_Static` as its default route. - -And `Yaf_Route_Static` is designed to handle the 80% requirement. - -please *NOTE* that it is unnecessary to instance a `Yaf_Route_Static`, also unecesary to add it into `Yaf_Router`\'s routes stack, since there is always be one in `Yaf_Router`\'s routes stack, and always be called at the last time.', -'Yaf_Router' => '`Yaf_Router` is the standard framework router. Routing is the process of taking a URI endpoint (that part of the URI which comes after the base URI: see `Yaf_Request_Abstract::setBaseUri`) and decomposing it into parameters to determine which module, controller, and action of that controller should receive the request. This values of the module, controller, action and other parameters are packaged into a `Yaf_Request_Abstract` object which is then processed by `Yaf_Dispatcher`. Routing occurs only once: when the request is initially received and before the first controller is dispatched. `Yaf_Router` is designed to allow for mod_rewrite-like functionality using pure PHP structures. It is very loosely based on Ruby on Rails routing and does not require any prior knowledge of webserver URL rewriting. It is designed to work with a single Apache mod_rewrite rule (one of): Rewrite rule for Apache or (preferred): Rewrite rule for Apache If using Lighttpd, the following rewrite rule is valid: Rewrite rule for Lighttpd "/index.php?$1", ".*\.(js|ico|gif|jpg|png|css|html)$" => "$0", "" => "/index.php" ) ]]> If using Nginx, use the following rewrite rule: Rewrite rule for Nginx', -'Yaf_View_Interface' => 'Yaf provides a ability for developers to use coustom view engine instead of built-in engine which is `Yaf_View_Simple`. There is a example to explain how to do this, please see `Yaf_Dispatcher::setView`.', -'Yaf_View_Simple' => '`Yaf_View_Simple` is the built-in template engine in Yaf, it is a simple but fast template engine, and only support PHP script template.', -'Yar_Client_Exception' => 'Class Yar_Client_Exception -Date 2018/6/9 下午3:05', -'Yar_Server' => 'Class Yar_Server -Date 2018/6/9 下午3:02', -'Yar_Server_Exception' => 'If service threw exceptions, A Yar_Server_Exception will be threw in client side.', -'ZendAPI_Job' => 'Describing a job in a queue -In order to add/modify a job in the queue, a Job class must be created/retrieved and than saved in a queue - -For simplicity, a job can be added directly to a queue and without creating an instant of a Queue object', -'ZipArchive' => 'A file archive, compressed with Zip.', -'ZMQ' => 'Class ZMQ', -'ZMQContext' => 'Class ZMQContext', -'ZMQDevice' => 'Class ZMQDevice', -'ZMQPoll' => 'Class ZMQPoll', -'ZMQSocket' => 'Class ZMQSocket', -'Zookeeper' => 'Represents ZooKeeper session.', -'ZookeeperAuthenticationException' => 'The ZooKeeper authentication exception handling class.', -'ZookeeperConfig' => 'The ZooKeeper Config handling class.', -'ZookeeperConnectionException' => 'The ZooKeeper connection exception handling class.', -'ZookeeperException' => 'The ZooKeeper exception handling class.', -'ZookeeperMarshallingException' => 'The ZooKeeper exception (while marshalling or unmarshalling data) handling class.', -'ZookeeperNoNodeException' => 'The ZooKeeper exception (when node does not exist) handling class.', -'ZookeeperOperationTimeoutException' => 'The ZooKeeper operation timeout exception handling class.', -'ZookeeperSessionException' => 'The ZooKeeper session exception handling class.', -]; diff --git a/vendor/phan/phan/src/Phan/Language/Internal/ConstantDocumentationMap.php b/vendor/phan/phan/src/Phan/Language/Internal/ConstantDocumentationMap.php deleted file mode 100644 index 75877d5..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/ConstantDocumentationMap.php +++ /dev/null @@ -1,3097 +0,0 @@ -<?php // phpcs:ignoreFile -namespace Phan\Language\Internal; - -/** - * This contains descriptions used by Phan for hover text of internal constants (global and class constants) in the language server mode. - * - * Format - * - * '<constant_name>' => 'documentation', - * - * NOTE: This format will very likely change as information is added and should not be used directly. - * - * Sources of function/method summary info: - * - * 1. 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 - * 2. Various websites documenting individual extensions (e.g. php-ast) - * 3. 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) - * - * - * CONTRIBUTING: - * - * Running `internal/internalstubs.php` can be used to update signature maps - * - * There are no plans for these signatures to diverge from what the above upstream sources contain. - * - * - If the descriptions cause Phan to crash, bug reports are welcome - * - If Phan improperly extracted text from a summary (and this affects multiple signatures), patches fixing the extraction will be accepted. - * - Otherwise, fixes for typos/grammar/inaccuracies in the summary will only be accepted once they are contributed upstream and can be regenerated (e.g. to the svn repo for docs.php.net). - * - * Note that the summaries are used in a wide variety of contexts, and what makes sense for Phan may not make sense for those projects, and vice versa. - */ -return [ -'__COMPILER_HALT_OFFSET__' => 'Available since PHP 5.1.0', -'AF_INET6' => 'Only available if compiled with IPv6 support.', -'AL_BITS' => 'Buffer Setting', -'AL_BUFFER' => 'Source/Listener Setting (Integer)', -'AL_CHANNELS' => 'Buffer Setting', -'AL_CONE_INNER_ANGLE' => 'Source/Listener Setting (Float)', -'AL_CONE_OUTER_ANGLE' => 'Source/Listener Setting (Float)', -'AL_CONE_OUTER_GAIN' => 'Source/Listener Setting (Float)', -'AL_DIRECTION' => 'Source/Listener Setting (Float Vector)', -'AL_FALSE' => 'Boolean value recognized by OpenAL', -'AL_FORMAT_MONO16' => 'PCM Format', -'AL_FORMAT_MONO8' => 'PCM Format', -'AL_FORMAT_STEREO16' => 'PCM Format', -'AL_FORMAT_STEREO8' => 'PCM Format', -'AL_FREQUENCY' => 'Buffer Setting', -'AL_GAIN' => 'Source/Listener Setting (Float)', -'AL_INITIAL' => 'Source State', -'AL_LOOPING' => 'Source State', -'AL_MAX_DISTANCE' => 'Source/Listener Setting (Float)', -'AL_MAX_GAIN' => 'Source/Listener Setting (Float)', -'AL_MIN_GAIN' => 'Source/Listener Setting (Float)', -'AL_ORIENTATION' => 'Source/Listener Setting (Float Vector)', -'AL_PAUSED' => 'Source State', -'AL_PITCH' => 'Source/Listener Setting (Float)', -'AL_PLAYING' => 'Source State', -'AL_POSITION' => 'Source/Listener Setting (Float Vector)', -'AL_REFERENCE_DISTANCE' => 'Source/Listener Setting (Float)', -'AL_ROLLOFF_FACTOR' => 'Source/Listener Setting (Float)', -'AL_SIZE' => 'Buffer Setting', -'AL_SOURCE_RELATIVE' => 'Source/Listener Setting (Integer)', -'AL_SOURCE_STATE' => 'Source/Listener Setting (Integer)', -'AL_STOPPED' => 'Source State', -'AL_TRUE' => 'Boolean value recognized by OpenAL', -'AL_VELOCITY' => 'Source/Listener Setting (Float Vector)', -'ALC_FREQUENCY' => 'Context Attribute', -'ALC_REFRESH' => 'Context Attribute', -'ALC_SYNC' => 'Context Attribute', -'ARRAY_FILTER_USE_BOTH' => '`ARRAY_FILTER_USE_BOTH` is used with `array_filter` to pass both value and key to the given callback function. Added in PHP 5.6.0.', -'ARRAY_FILTER_USE_KEY' => '`ARRAY_FILTER_USE_KEY` is used with `array_filter` to pass each key as the first argument to the given callback function. Added in PHP 5.6.0.', -'ast\AST_ARG_LIST' => 'numerically indexed children of an argument list of a function/method invocation', -'ast\AST_ARRAY' => 'numerically indexed children of an array literal.', -'ast\AST_ARRAY_ELEM' => 'An element of an array literal. The key is `null` if there is no key (children: value, key)', -'ast\AST_ASSIGN' => 'An assignment of the form `var = expr` (children: var, expr)', -'ast\AST_ASSIGN_OP' => 'An assignment operation of the form `var op= expr`. The operation is determined by the flags `ast\flags\BINARY_*` (children: var, expr)', -'ast\AST_ASSIGN_REF' => 'An assignment by reference, of the form `var =& expr`. (children: var, expr)', -'ast\AST_BINARY_OP' => 'A binary operation of the form `left op right`. The operation is determined by the flags `ast\flags\BINARY_*` (children: left, right)', -'ast\AST_BREAK' => 'A break statement. The depth is null or an integer. (children: depth)', -'ast\AST_CALL' => 'A global function invocation of the form `expr(args)` (children: expr, args)', -'ast\AST_CAST' => 'A cast operation of the form `(type)expr`. The flags are the type: `ast\flags\TYPE_*` (children: expr)', -'ast\AST_CATCH' => 'An individual catch block catching an `ast\AST_CLASS_LIST` of possible classes. This is of the form `catch(class var) { stmts }`. (children: class, var, stmts)', -'ast\AST_CATCH_LIST' => 'A list of 1 or more `ast\AST_CATCH` nodes for a try statement. (numerically indexed children)', -'ast\AST_CLASS' => 'A class declaration of the form `docComment name EXTENDS extends IMPLEMENTS implements { stmts }` (children: name, docComment, extends, implements, stmts)', -'ast\AST_CLASS_CONST' => 'A class constant usage of the form `class::const`. (children: class, const)', -'ast\AST_CLASS_CONST_DECL' => 'A class constant declaration with one or more class constants. (numerically indexed children)', -'ast\AST_CLASS_NAME' => 'A usage of `class::CLASS` in AST version 70 (children: class)', -'ast\AST_CLONE' => 'An expression cloning an object, of the form `clone(expr)`. (children: expr)', -'ast\AST_CLOSURE' => 'A closure declaration. (children: name, docComment, params, uses, stmts, returnType)', -'ast\AST_CLOSURE_USES' => 'A list of one or more nodes of type `ast\AST_CLOSURE_VAR` for a closure declaration. (numerically indexed children)', -'ast\AST_CLOSURE_VAR' => 'A variable in the list of `uses` of a closure declaration. (children: name)', -'ast\AST_CONDITIONAL' => 'A conditional expression of the form `cond ? true : false` or `cond ?: false`. (children: cond, true, false)', -'ast\AST_CONST' => 'A usage of a global constant `name`. (children: name)', -'ast\AST_CONST_DECL' => 'A declaration of a group of class constants of kind `ast\AST_CONST_ELEM`. (numerically indexed children)', -'ast\AST_CONST_ELEM' => 'A declaration of a class constant. (children: name, value, docComment)', -'ast\AST_CONTINUE' => 'A continue statement with a depth of `null` or an integer. (children: depth)', -'ast\AST_DECLARE' => 'A declare statement at the top of a php file (children: declares, stmts)', -'ast\AST_DIM' => 'A usage of an array/array-like field, of the form `expr[dim]` (children: expr, dim)', -'ast\AST_DO_WHILE' => 'A do-while statement of the form `do {stmts} while (cond);`. (children: stmts, cond)', -'ast\AST_ECHO' => 'An echo statement or inline HTML (children: expr)', -'ast\AST_EMPTY' => 'An `empty(expr)` expression (children: expr)', -'ast\AST_ENCAPS_LIST' => 'interpolated string with non-literals, e.g. `"foo$bar"` or heredoc (numerically indexed children)', -'ast\AST_EXIT' => 'An `exit`/`die` statement. (children: expr)', -'ast\AST_EXPR_LIST' => 'A comma separated list of expressions, e.g. for the condition of a `for` loop. (numerically indexed children)', -'ast\AST_FOR' => 'A for loop of the form `for (init; cond; loop) { stmts; }`. (children: init, cond, loop, stmts)', -'ast\AST_FOREACH' => 'A foreach loop of the form `foreach (expr as [key =>] value) {stmts} (children: expr, value, key, stmts)', -'ast\AST_FUNC_DECL' => 'A global function declaration. (children: name, docComment, params, stmts, returnType)', -'ast\AST_GLOBAL' => 'A usage of a global variable of the form `global var`. (children: var)', -'ast\AST_GOTO' => 'A goto statement of the form `goto label;` (children: label)', -'ast\AST_GROUP_USE' => 'A use statement (for classes, namespaces, functions, and/or constants) containing a list of one or more elements. (children: prefix, uses)', -'ast\AST_HALT_COMPILER' => 'A `__halt_compiler;` statement. (children: offset)', -'ast\AST_IF' => 'A list of `ast\AST_IF_ELEM` nodes for a chain of 1 or more `if`/`elseif`/`else` statements (numerically indexed children)', -'ast\AST_IF_ELEM' => 'An `if`/`elseif`/`elseif` statement of the form `if (cond) stmts` (children: cond, stmts)', -'ast\AST_INCLUDE_OR_EVAL' => 'An `include*(expr)`, `require*(expr)`, or `eval(expr)` statement. The type can be determined from the flags (`ast\flags\EXEC_*`). (children: expr)', -'ast\AST_INSTANCEOF' => 'An `expr instanceof class` expression. (children: expr, class)', -'ast\AST_ISSET' => 'An `isset(var)` expression. (children: var)', -'ast\AST_LABEL' => 'A `name:` expression (a target for `goto name`). (children: name)', -'ast\AST_LIST' => 'Used for `list() = ` unpacking, etc. Predates AST version 50. (numerically indexed children)', -'ast\AST_MAGIC_CONST' => 'A magic constant (depends on flags that are one of `ast\flags\MAGIC_*`)', -'ast\AST_METHOD' => 'A method declaration. (children: name, docComment, params, stmts, returnType)', -'ast\AST_METHOD_CALL' => 'An invocation of an instance method, of the form `expr->method(args)` (children: expr, method, args)', -'ast\AST_METHOD_REFERENCE' => 'A reference to a method when using a trait inside a class declaration. (children: class, method)', -'ast\AST_NAME' => 'A name token (e.g. of a constant/class/class type) (children: name)', -'ast\AST_NAME_LIST' => 'A list of names (e.g. for catching multiple classes in a `catch` statement) (numerically indexed children)', -'ast\AST_NAMESPACE' => 'A namespace declaration of the form `namespace name;` or `namespace name { stmts }`. (children: name, stmts)', -'ast\AST_NEW' => 'An object creation expression of the form `new class(args)` (children: class, args)', -'ast\AST_NULLABLE_TYPE' => 'A nullable node with a child node of kind `ast\AST_TYPE` or `ast\AST_NAME` (children: type)', -'ast\AST_PARAM' => 'A parameter of a function, closure, or method declaration. (children: type, name, default)', -'ast\AST_PARAM_LIST' => 'The list of parameters of a function, closure, or method declaration. (numerically indexed children)', -'ast\AST_POST_DEC' => 'A `var--` expression. (children: var)', -'ast\AST_POST_INC' => 'A `var++` expression. (children: var)', -'ast\AST_PRE_DEC' => 'A `--var` expression. (children: var)', -'ast\AST_PRE_INC' => 'A `++var` expression. (children: var)', -'ast\AST_PRINT' => 'A `print expr` expression. (children: expr)', -'ast\AST_PROP' => 'An instance property usage of the form `expr->prop` (children: expr, prop)', -'ast\AST_PROP_DECL' => 'A single group of property declarations inside a class. (numerically indexed children)', -'ast\AST_PROP_ELEM' => 'A class property declaration. (children: name, default, docComment)', -'ast\AST_PROP_GROUP' => 'A class property group declaration with optional type information for the group (in PHP 7.4+). Used in AST version 70+ (children: type, props)', -'ast\AST_REF' => 'only used for `&$v` in `foreach ($a as &$v)` (children: var)', -'ast\AST_RETURN' => 'A `return;` or `return expr` statement. (children: expr)', -'ast\AST_SHELL_EXEC' => 'A `\`some_shell_command\`` expression. (children: expr)', -'ast\AST_STATIC' => 'A declaration of a static local variable of the form `static var = default`. (children: var, default)', -'ast\AST_STATIC_CALL' => 'A call of a static method, of the form `class::method(args)`. (children: class, method, args)', -'ast\AST_STATIC_PROP' => 'A usage of a static property, of the form `class::prop`. (children: class, prop)', -'ast\AST_STMT_LIST' => 'A list of statements. The statements are usually nodes but can be non-nodes, e.g. `;2;`. (numerically indexed children)', -'ast\AST_SWITCH' => 'A switch statement of the form `switch(cond) { stmts }`. `stmts` is a node of the kind `ast\AST_SWITCH_LIST`. (children: cond, stmts)', -'ast\AST_SWITCH_CASE' => 'A case statement of a switch, of the form `case cond: stmts` (children: cond, stmts)', -'ast\AST_SWITCH_LIST' => 'The full list of nodes inside a switch statement body, each of kind `ast\AST_SWITCH_CASE`. (numerically indexed children)', -'ast\AST_THROW' => 'A throw statement of the form `throw expr;` (children: expr)', -'ast\AST_TRAIT_ADAPTATIONS' => 'The optional adaptations to a statement using a trait inside a class (numerically indexed children)', -'ast\AST_TRAIT_ALIAS' => 'Adds an alias inside of a use of a trait (`method as alias`) (children: method, alias)', -'ast\AST_TRAIT_PRECEDENCE' => 'Indicates the precedent of a trait over another trait (`method INSTEADOF insteadof`) (children: method, insteadof)', -'ast\AST_TRY' => 'A try/catch(es)/finally block. (children: try, catches, finally)', -'ast\AST_TYPE' => 'A type such as `bool`. Other types such as specific classes are represented as `ast\AST_NAME`s (depends on flags of `ast\flags\TYPE_*`)', -'ast\AST_UNARY_OP' => 'A unary operation of the form `op expr` (e.g. `-expr`, the flags can be one of `ast\flags\UNARY_*`) (children: expr)', -'ast\AST_UNPACK' => 'An expression unpacking an array/iterable (i.e. `...expr`) (children: expr)', -'ast\AST_UNSET' => '`unset(var)` - A statement unsetting the expression `var` (children: var)', -'ast\AST_USE' => 'A list of uses of classes/namespaces, functions, and constants. The child nodes are of the kind `ast\AST_USE_ELEM` (numerically indexed children)', -'ast\AST_USE_ELEM' => 'A single use statement for a group of (children: name, alias)', -'ast\AST_USE_TRAIT' => 'Represents `use traits {[adaptations]}` within a class declaration (children: traits, adaptations)', -'ast\AST_VAR' => 'An occurence of a variable `$name` or `${name}`. (children: name)', -'ast\AST_WHILE' => 'A while loop of the form `while (cond) { stmts }` (children: cond, stmts)', -'ast\AST_YIELD' => 'An expression of the form `yield [key =>] value` (children: value, key)', -'ast\AST_YIELD_FROM' => 'An expression of the form `yield from expr` (children: expr)', -'BBCODE_ARG_DOUBLE_QUOTE' => 'This is a parser option allowing argument quoting with double quotes (`"`)', -'BBCODE_ARG_HTML_QUOTE' => 'This is a parser option allowing argument quoting with HTML version of double quotes (`&quot;`)', -'BBCODE_ARG_QUOTE_ESCAPING' => 'This is a parser option allowing argument quotes to be escaped this permit the quote delimiter to be found in the string escaping character is \ it can escape any quoting character or itself, if found in front of a non escapable character, it will be dropped. Default behaviour is not to use escaping.', -'BBCODE_ARG_SINGLE_QUOTE' => 'This is a parser option allowing argument quoting with single quotes (`\'`)', -'BBCODE_AUTO_CORRECT' => 'This is a parser option changing the way errors are treated. It automatically closes tag in the order they are opened. And treat tags with only an open tag as if there were a close tag present.', -'BBCODE_CORRECT_REOPEN_TAGS' => 'This is a parser option changing the way errors are treated. It automatically reopens tag if close tags are not in the good order.', -'BBCODE_DEFAULT_SMILEYS_OFF' => 'This is a parser option setting smileys to OFF if no flag is given at tag level.', -'BBCODE_DEFAULT_SMILEYS_ON' => 'This is a parser option setting smileys to ON if no flag is given at tag level.', -'BBCODE_DISABLE_TREE_BUILD' => 'This is a parser option disabling the BBCode parsing it can be useful if only the "smiley" replacement must be used.', -'BBCODE_FLAGS_ARG_PARSING' => 'This BBCode tag require argument sub-parsing (the argument is also parsed by the BBCode extension). As Of 0.10.2 another parser can be used as argument parser.', -'BBCODE_FLAGS_CDATA_NOT_ALLOWED' => 'This BBCode Tag does not accept content (it voids it automatically).', -'BBCODE_FLAGS_DENY_REOPEN_CHILD' => 'This BBCode Tag does not allow unclosed children to reopen when automatically closed.', -'BBCODE_FLAGS_ONE_OPEN_PER_LEVEL' => 'This BBCode Tag automatically closes if another tag of the same type is found at the same nesting level.', -'BBCODE_FLAGS_REMOVE_IF_EMPTY' => 'This BBCode Tag is automatically removed if content is empty it allows to produce lighter HTML.', -'BBCODE_FLAGS_SMILEYS_OFF' => 'This BBCode Tag does not accept smileys.', -'BBCODE_FLAGS_SMILEYS_ON' => 'This BBCode Tag accepts smileys.', -'BBCODE_FORCE_SMILEYS_OFF' => 'This is a parser option disabling completely the smileys parsing.', -'BBCODE_SET_FLAGS_ADD' => 'This permits to switch a flag set ON on a parser.', -'BBCODE_SET_FLAGS_REMOVE' => 'This permits to switch a flag set OFF on a parser.', -'BBCODE_SET_FLAGS_SET' => 'This permits to SET the complete flag set on a parser.', -'BBCODE_SMILEYS_CASE_INSENSITIVE' => 'Use a case insensitive Detection for smileys instead of a simple binary search.', -'BBCODE_TYPE_ARG' => 'This BBCode tag need an argument.', -'BBCODE_TYPE_NOARG' => 'This BBCode tag does not accept any arguments.', -'BBCODE_TYPE_OPTARG' => 'This BBCode tag accept an optional argument.', -'BBCODE_TYPE_ROOT' => 'This BBCode tag is the special tag root (nesting level 0).', -'BBCODE_TYPE_SINGLE' => 'This BBCode tag does not have a corresponding close tag.', -'BUS_ADRALN' => 'Available since PHP 5.3.0.', -'BUS_ADRERR' => 'Available since PHP 5.3.0.', -'BUS_OBJERR' => 'Available since PHP 5.3.0.', -'CAL_DOW_DAYNO' => 'For `jddayofweek`: the day of the week as `integer`, where `0` means Sunday and `6` means Saturday.', -'CAL_DOW_LONG' => 'For `jddayofweek`: the English name of the day of the week.', -'CAL_DOW_SHORT' => 'For `jddayofweek`: the abbreviated English name of the day of the week.', -'CAL_EASTER_ALWAYS_GREGORIAN' => 'For `easter_days`: calculate Easter according to the proleptic Gregorian calendar.', -'CAL_EASTER_ALWAYS_JULIAN' => 'For `easter_days`: calculate Easter according to the Julian calendar.', -'CAL_EASTER_DEFAULT' => 'For `easter_days`: calculate Easter for years before 1753 according to the Julian calendar, and for later years according to the Gregorian calendar.', -'CAL_EASTER_ROMAN' => 'For `easter_days`: calculate Easter for years before 1583 according to the Julian calendar, and for later years according to the Gregorian calendar.', -'CAL_FRENCH' => 'For `cal_days_in_month`, `cal_from_jd`, `cal_info` and `cal_to_jd`: use the French Repuclican calendar.', -'CAL_GREGORIAN' => 'For `cal_days_in_month`, `cal_from_jd`, `cal_info` and `cal_to_jd`: use the proleptic Gregorian calendar.', -'CAL_JEWISH' => 'For `cal_days_in_month`, `cal_from_jd`, `cal_info` and `cal_to_jd`: use the Jewish calendar.', -'CAL_JEWISH_ADD_ALAFIM' => 'For `jdtojewish`: adds the word alafim as thousands separator to the year number.', -'CAL_JEWISH_ADD_ALAFIM_GERESH' => 'For `jdtojewish`: adds a geresh symbol (which resembles a single-quote mark) as thousands separator to the year number.', -'CAL_JEWISH_ADD_GERESHAYIM' => 'For `jdtojewish`: add a gershayim symbol (which resembles a double-quote mark) before the final letter of the day and year numbers.', -'CAL_JULIAN' => 'For `cal_days_in_month`, `cal_from_jd`, `cal_info` and `cal_to_jd`: use the Julian calendar.', -'CAL_MONTH_FRENCH' => 'For `jdmonthname`: the French Republican month name.', -'CAL_MONTH_GREGORIAN_LONG' => 'For `jdmonthname`: the Gregorian month name.', -'CAL_MONTH_GREGORIAN_SHORT' => 'For `jdmonthname`: the abbreviated Gregorian month name.', -'CAL_MONTH_JEWISH' => 'For `jdmonthname`: the Jewish month name.', -'CAL_MONTH_JULIAN_LONG' => 'For `jdmonthname`: the Julian month name.', -'CAL_MONTH_JULIAN_SHORT' => 'For `jdmonthname`: the abbreviated Julian month name.', -'CAL_NUM_CALS' => 'The number of available calendars.', -'CASE_LOWER' => '`CASE_LOWER` is used with `array_change_key_case` and is used to convert array keys to lower case. This is also the default case for `array_change_key_case`.', -'CASE_UPPER' => '`CASE_UPPER` is used with `array_change_key_case` and is used to convert array keys to upper case.', -'CL_EXPUNGE' => 'silently expunge the mailbox before closing when calling `imap_close`', -'CLASSKIT_ACC_PRIVATE' => 'Marks the method `private`', -'CLASSKIT_ACC_PROTECTED' => 'Marks the method `protected`', -'CLASSKIT_ACC_PUBLIC' => 'Marks the method `public`', -'CLASSKIT_AGGREGATE_OVERRIDE' => 'PHP 5 specific flag to `classkit_import` Only defined when classkit compatibility is enabled.', -'CLASSKIT_VERSION' => 'Defined to the current version of the runkit package. Only defined when classkit compatibility is enabled.', -'CLD_CONTINUED' => 'Available since PHP 5.3.0.', -'CLD_DUMPED' => 'Available since PHP 5.3.0.', -'CLD_EXITED' => 'Available since PHP 5.3.0.', -'CLD_KILLED' => 'Available since PHP 5.3.0.', -'CLD_STOPPED' => 'Available since PHP 5.3.0.', -'CLD_TRAPPED' => 'Available since PHP 5.3.0.', -'Couchbase\Bucket::PINGSVC_FTS' => 'Ping full text search (FTS) service.', -'Couchbase\Bucket::PINGSVC_KV' => 'Ping data (Key/Value) service.', -'Couchbase\Bucket::PINGSVC_N1QL' => 'Ping query (N1QL) service.', -'Couchbase\Bucket::PINGSVC_VIEWS' => 'Ping views (Map/Reduce) service.', -'Couchbase\ClusterManager::RBAC_DOMAIN_EXTERNAL' => 'The user account managed by external system (e.g. LDAP).', -'Couchbase\ClusterManager::RBAC_DOMAIN_LOCAL' => 'The user account managed by Couchbase Cluster.', -'Couchbase\N1qlQuery::NOT_BOUNDED' => 'This is the default (for single-statement requests). -No timestamp vector is used in the index scan. -This is also the fastest mode, because we avoid the cost of obtaining the vector, -and we also avoid any wait for the index to catch up to the vector.', -'Couchbase\N1qlQuery::PROFILE_NONE' => 'Disables profiling. This is the default', -'Couchbase\N1qlQuery::PROFILE_PHASES' => 'Enables phase profiling.', -'Couchbase\N1qlQuery::PROFILE_TIMINGS' => 'Enables general timing profiling.', -'Couchbase\N1qlQuery::REQUEST_PLUS' => 'This implements strong consistency per request. -Before processing the request, a current vector is obtained. -The vector is used as a lower bound for the statements in the request. -If there are DML statements in the request, RYOW is also applied within the request.', -'Couchbase\N1qlQuery::STATEMENT_PLUS' => 'This implements strong consistency per statement. -Before processing each statement, a current vector is obtained -and used as a lower bound for that statement.', -'Couchbase\ViewQuery::UPDATE_AFTER' => 'Allow stale view, update view after it has been accessed.', -'Couchbase\ViewQuery::UPDATE_BEFORE' => 'Force a view update before returning data', -'Couchbase\ViewQuery::UPDATE_NONE' => 'Allow stale views', -'CP_MOVE' => 'Delete the messages from the current mailbox after copying with `imap_mail_copy`', -'CP_UID' => 'the sequence numbers contain UIDS', -'CURL_HTTP_VERSION_2' => 'Available since PHP 7.0.7 and cURL 7.43.0', -'CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE' => 'Available since PHP 7.0.7 and cURL 7.49.0', -'CURL_HTTP_VERSION_2TLS' => 'Available since PHP 7.0.7 and cURL 7.47.0', -'CURL_MAX_READ_SIZE' => 'Available since PHP 7.3.0 and cURL 7.53.0', -'CURL_PUSH_DENY' => 'Available since PHP 7.1.0 and cURL 7.44.0', -'CURL_PUSH_OK' => 'Available since PHP 7.1.0 and cURL 7.44.0', -'CURL_REDIR_POST_301' => 'Available since PHP 7.0.7 and cURL 7.18.2', -'CURL_REDIR_POST_302' => 'Available since PHP 7.0.7 and cURL 7.18.2', -'CURL_REDIR_POST_303' => 'Available since PHP 7.0.7 and cURL 7.25.1', -'CURL_REDIR_POST_ALL' => 'Available since PHP 7.0.7 and cURL 7.18.2', -'CURL_SSLVERSION_MAX_DEFAULT' => 'Available since PHP 7.3.0 and cURL 7.54.0', -'CURL_SSLVERSION_MAX_NONE' => 'Available since PHP 7.3.0 and cURL 7.54.0', -'CURL_SSLVERSION_MAX_TLSv1_0' => 'Available since PHP 7.3.0 and cURL 7.54.0', -'CURL_SSLVERSION_MAX_TLSv1_1' => 'Available since PHP 7.3.0 and cURL 7.54.0', -'CURL_SSLVERSION_MAX_TLSv1_2' => 'Available since PHP 7.3.0 and cURL 7.54.0', -'CURL_SSLVERSION_MAX_TLSv1_3' => 'Available since PHP 7.3.0 and cURL 7.54.0', -'CURL_SSLVERSION_TLSv1_0' => 'Available since PHP 5.5.19 and 5.6.3', -'CURL_SSLVERSION_TLSv1_1' => 'Available since PHP 5.5.19 and 5.6.3', -'CURL_SSLVERSION_TLSv1_2' => 'Available since PHP 5.5.19 and 5.6.3', -'CURL_SSLVERSION_TLSv1_3' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURL_VERSION_HTTP2' => 'Available since PHP 5.5.24 and 5.6.8 and cURL 7.33.0', -'CURL_VERSION_HTTPS_PROXY' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURL_VERSION_KERBEROS5' => 'Available since PHP 7.0.7 and cURL 7.40.0', -'CURL_VERSION_PSL' => 'Available since PHP 7.0.7 and cURL 7.47.0', -'CURL_VERSION_UNIX_SOCKETS' => 'Available since PHP 7.0.7 and cURL 7.40.0', -'CURL_WRAPPERS_ENABLED' => 'Defined if PHP was configured with --with-curlwrappers. Moved to PECL in PHP 5.5.0.', -'CURLAUTH_GSSAPI' => 'Available since PHP 7.3.0 and cURL 7.54.1', -'CURLAUTH_NEGOTIATE' => 'Available since PHP 7.0.7 and cURL 7.38.0.', -'CURLAUTH_NTLM_WB' => 'Available since PHP 7.0.7 and cURL 7.22.0', -'CURLCLOSEPOLICY_CALLBACK' => 'Removed in PHP 5.6.0.', -'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' => 'Removed in PHP 5.6.0.', -'CURLCLOSEPOLICY_LEAST_TRAFFIC' => 'Removed in PHP 5.6.0.', -'CURLCLOSEPOLICY_OLDEST' => 'Removed in PHP 5.6.0.', -'CURLCLOSEPOLICY_SLOWEST' => 'Removed in PHP 5.6.0.', -'CURLE_SSH' => 'Available since PHP 5.3.0 and cURL 7.16.1.', -'CURLE_WEIRD_SERVER_REPLY' => 'Available since PHP 7.3.0 and cURL 7.51.0', -'CURLFTP_CREATE_DIR' => 'Available since PHP 7.0.7 and cURL 7.19.3', -'CURLFTP_CREATE_DIR_NONE' => 'Available since PHP 7.0.7 and cURL 7.19.3', -'CURLFTP_CREATE_DIR_RETRY' => 'Available since PHP 7.0.7 and cURL 7.19.3', -'CURLFTPAUTH_DEFAULT' => 'Available since PHP 5.1.0', -'CURLFTPAUTH_SSL' => 'Available since PHP 5.1.0', -'CURLFTPAUTH_TLS' => 'Available since PHP 5.1.0', -'CURLFTPSSL_ALL' => 'Available since PHP 5.2.0', -'CURLFTPSSL_CONTROL' => 'Available since PHP 5.2.0', -'CURLFTPSSL_NONE' => 'Available since PHP 5.2.0', -'CURLFTPSSL_TRY' => 'Available since PHP 5.2.0', -'CURLHEADER_SEPARATE' => 'Available since PHP 7.0.7 and cURL 7.37.0.', -'CURLHEADER_UNIFIED' => 'Available since PHP 7.0.7 and cURL 7.37.0.', -'CURLINFO_CONTENT_LENGTH_DOWNLOAD_T' => 'Available since PHP 7.3.0 and cURL 7.55.0', -'CURLINFO_CONTENT_LENGTH_UPLOAD_T' => 'Available since PHP 7.3.0 and cURL 7.55.0', -'CURLINFO_HEADER_OUT' => 'Available since PHP 5.1.3', -'CURLINFO_HTTP_CODE' => 'As of PHP 5.5.0 and cURL 7.10.8, this is a legacy alias of `CURLINFO_RESPONSE_CODE`', -'CURLINFO_HTTP_VERSION' => 'Available since PHP 7.3.0 and cURL 7.50.0', -'CURLINFO_LOCAL_IP' => 'Available since PHP 5.4.7', -'CURLINFO_LOCAL_PORT' => 'Available since PHP 5.4.7', -'CURLINFO_PRIMARY_IP' => 'Available since PHP 5.4.7', -'CURLINFO_PRIMARY_PORT' => 'Available since PHP 5.4.7', -'CURLINFO_PRIVATE' => 'Available since PHP 5.2.4', -'CURLINFO_PROTOCOL' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLINFO_PROXY_SSL_VERIFYRESULT' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLINFO_REDIRECT_URL' => 'Available since PHP 5.3.7', -'CURLINFO_RESPONSE_CODE' => 'Available since PHP 5.5.0 and cURL 7.10.8', -'CURLINFO_SCHEME' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLINFO_SIZE_DOWNLOAD_T' => 'Available since PHP 7.3.0 and cURL 7.50.0', -'CURLINFO_SIZE_UPLOAD_T' => 'Available since PHP 7.3.0 and cURL 7.50.0', -'CURLINFO_SPEED_DOWNLOAD_T' => 'Available since PHP 7.3.0 and cURL 7.50.0', -'CURLINFO_SPEED_UPLOAD_T' => 'Available since PHP 7.3.0 and cURL 7.50.0', -'CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE' => 'Available since PHP 7.0.7 and cURL 7.30.0', -'CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE' => 'Available since PHP 7.0.7 and cURL 7.30.0', -'CURLMOPT_MAX_HOST_CONNECTIONS' => 'Available since PHP 7.0.7 and cURL 7.30.0', -'CURLMOPT_MAX_PIPELINE_LENGTH' => 'Available since PHP 7.0.7 and cURL 7.30.0', -'CURLMOPT_MAX_TOTAL_CONNECTIONS' => 'Available since PHP 7.0.7 and cURL 7.30.0', -'CURLMOPT_MAXCONNECTS' => 'Available since PHP 5.5.0 and cURL 7.16.3.', -'CURLMOPT_PIPELINING' => 'Available since PHP 5.5.0 and cURL 7.16.0.', -'CURLMOPT_PUSHFUNCTION' => 'Available since PHP 7.1.0 and cURL 7.44.0', -'CURLOPT_ABSTRACT_UNIX_SOCKET' => 'Available since PHP 7.3.0 and cURL 7.53.0', -'CURLOPT_AUTOREFERER' => 'Available since PHP 5.1.0', -'CURLOPT_CLOSEPOLICY' => 'Removed in PHP 5.6.0.', -'CURLOPT_CONNECT_TO' => 'Available since PHP 7.0.7 and cURL 7.49.0', -'CURLOPT_COOKIESESSION' => 'Available since PHP 5.1.0', -'CURLOPT_DEFAULT_PROTOCOL' => 'Available since PHP 7.0.7 and cURL 7.45.0', -'CURLOPT_DNS_INTERFACE' => 'Available since PHP 7.0.7 and cURL 7.33.0', -'CURLOPT_DNS_LOCAL_IP4' => 'Available since PHP 7.0.7 and cURL 7.33.0', -'CURLOPT_DNS_LOCAL_IP6' => 'Available since PHP 7.0.7 and cURL 7.33.0', -'CURLOPT_EXPECT_100_TIMEOUT_MS' => 'Available since PHP 7.0.7 and cURL 7.36.0', -'CURLOPT_FOLLOWLOCATION' => 'This constant is not available when open_basedir or safe_mode are enabled.', -'CURLOPT_FTP_SSL' => 'Available since PHP 5.2.0', -'CURLOPT_FTPSSLAUTH' => 'Available since PHP 5.1.0', -'CURLOPT_HEADEROPT' => 'Available since PHP 7.0.7 and cURL 7.37.0', -'CURLOPT_KEEP_SENDING_ON_ERROR' => 'Available since PHP 7.3.0 and cURL 7.51.0', -'CURLOPT_LOGIN_OPTIONS' => 'Available since PHP 7.0.7 and cURL 7.34.0', -'CURLOPT_MAX_RECV_SPEED_LARGE' => 'Available since PHP 5.4.0 and cURL 7.15.5', -'CURLOPT_MAX_SEND_SPEED_LARGE' => 'Available since PHP 5.4.0 and cURL 7.15.5', -'CURLOPT_PATH_AS_IS' => 'Available since PHP 7.0.7 and cURL 7.42.0', -'CURLOPT_PINNEDPUBLICKEY' => 'Available since PHP 7.0.7 and cURL 7.39.0', -'CURLOPT_PIPEWAIT' => 'Available since PHP 7.0.7 and cURL 7.43.0', -'CURLOPT_PRE_PROXY' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PRIVATE' => 'Available since PHP 5.2.4', -'CURLOPT_PROGRESSFUNCTION' => 'Available since PHP 5.3.0', -'CURLOPT_PROXY_CAINFO' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_CAPATH' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_CRLFILE' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_KEYPASSWD' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_PINNEDPUBLICKEY' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_SERVICE_NAME' => 'Available since PHP 7.0.7 and cURL 7.43.0', -'CURLOPT_PROXY_SSL_CIPHER_LIST' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_SSL_OPTIONS' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_SSL_VERIFYHOST' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_SSL_VERIFYPEER' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_SSLCERT' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_SSLCERTTYPE' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_SSLKEY' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_SSLKEYTYPE' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_SSLVERSION' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_TLSAUTH_PASSWORD' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_TLSAUTH_TYPE' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXY_TLSAUTH_USERNAME' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLOPT_PROXYHEADER' => 'Available since PHP 7.0.7 and cURL 7.37.0', -'CURLOPT_PROXYTYPE' => 'Available as of cURL 7.10.', -'CURLOPT_REQUEST_TARGET' => 'Available since PHP 7.3.0 and cURL 7.55.0.', -'CURLOPT_SASL_IR' => 'Available since PHP 7.0.7 and cURL 7.31.0', -'CURLOPT_SERVICE_NAME' => 'Available since PHP 7.0.7 and cURL 7.43.0', -'CURLOPT_SOCKS5_AUTH' => 'Available since PHP 7.3.0 and cURL 7.55.0', -'CURLOPT_SSL_ENABLE_ALPN' => 'Available since PHP 7.0.7 and cURL 7.36.0', -'CURLOPT_SSL_ENABLE_NPN' => 'Available since PHP 7.0.7 and cURL 7.36.0', -'CURLOPT_SSL_FALSESTART' => 'Available since PHP 7.0.7 and cURL 7.42.0', -'CURLOPT_SSL_OPTIONS' => 'Available since PHP 5.5.0 and cURL 7.25.0', -'CURLOPT_SSL_VERIFYSTATUS' => 'Available since PHP 7.0.7 and cURL 7.41.0', -'CURLOPT_STREAM_WEIGHT' => 'Available since PHP 7.0.7 and cURL 7.46.0', -'CURLOPT_SUPPRESS_CONNECT_HEADERS' => 'Available since PHP 7.3.0 and cURL 7.54.0', -'CURLOPT_TCP_FASTOPEN' => 'Available since PHP 7.0.7 and cURL 7.49.0', -'CURLOPT_TCP_NODELAY' => 'Available since PHP 5.2.1', -'CURLOPT_TFTP_NO_OPTIONS' => 'Available since PHP 7.0.7 and cURL 7.48.0', -'CURLOPT_UNIX_SOCKET_PATH' => 'Available since PHP 7.0.7 and cURL 7.40.0', -'CURLOPT_USERNAME' => 'Available since PHP 5.5.0 and cURL 7.19.1', -'CURLOPT_XOAUTH2_BEARER' => 'Available since PHP 7.0.7 and cURL 7.33.0', -'CURLPAUSE_ALL' => 'Available since PHP 5.5.0 and cURL 7.18.0.', -'CURLPAUSE_CONT' => 'Available since PHP 5.5.0 and cURL 7.18.0.', -'CURLPAUSE_RECV' => 'Available since PHP 5.5.0 and cURL 7.18.0.', -'CURLPAUSE_RECV_CONT' => 'Available since PHP 5.5.0 and cURL 7.18.0.', -'CURLPAUSE_SEND' => 'Available since PHP 5.5.0 and cURL 7.18.0.', -'CURLPAUSE_SEND_CONT' => 'Available since PHP 5.5.0 and cURL 7.18.0.', -'CURLPIPE_HTTP1' => 'Available since PHP 7.0.0 and cURL 7.43.0.', -'CURLPIPE_MULTIPLEX' => 'Available since PHP 7.0.0 and cURL 7.43.0.', -'CURLPIPE_NOTHING' => 'Available since PHP 7.0.0 and cURL 7.43.0.', -'CURLPROTO_SMB' => 'Available since PHP 7.0.7 and cURL 7.40.0.', -'CURLPROTO_SMBS' => 'Available since PHP 7.0.7 and cURL 7.40.0.', -'CURLPROXY_HTTP' => 'Available since cURL 7.10.', -'CURLPROXY_HTTP_1_0' => 'Available since PHP 7.0.7 and cURL 7.19.3', -'CURLPROXY_HTTPS' => 'Available since PHP 7.3.0 and cURL 7.52.0', -'CURLPROXY_SOCKS4' => 'Available since PHP 5.2.10 and cURL 7.10.', -'CURLPROXY_SOCKS4A' => 'Available since PHP 5.5.23 and PHP 5.6.7 and cURL 7.18.0.', -'CURLPROXY_SOCKS5' => 'Available since cURL 7.10.', -'CURLPROXY_SOCKS5_HOSTNAME' => 'Available since PHP 5.5.23 and PHP 5.6.7 and cURL 7.18.0.', -'CURLSSH_AUTH_AGENT' => 'Available since PHP 7.0.7 and cURL 7.28.0', -'CURLSSLOPT_ALLOW_BEAST' => 'Available since PHP 5.5.0 and cURL 7.25.0', -'CURLSSLOPT_NO_REVOKE' => 'Available since PHP 7.0.7 and cURL 7.44.0', -'DB2_AUTOCOMMIT_OFF' => 'Specifies that autocommit should be turned off.', -'DB2_AUTOCOMMIT_ON' => 'Specifies that autocommit should be turned on.', -'DB2_BINARY' => 'Specifies that binary data shall be returned as is. This is the default mode.', -'DB2_CASE_LOWER' => 'Specifies that column names will be returned in lower case.', -'DB2_CASE_NATURAL' => 'Specifies that column names will be returned in their natural case.', -'DB2_CASE_UPPER' => 'Specifies that column names will be returned in upper case.', -'DB2_CHAR' => 'Specifies that the variable should be bound as a CHAR or VARCHAR data type.', -'DB2_CONVERT' => 'Specifies that binary data shall be converted to a hexadecimal encoding and returned as an ASCII string.', -'DB2_DEFERRED_PREPARE_OFF' => 'Specifies that deferred prepare should be turned off for the specified statement resource.', -'DB2_DEFERRED_PREPARE_ON' => 'Specifies that deferred prepare should be turned on for the specified statement resource.', -'DB2_DOUBLE' => 'Specifies that the variable should be bound as a DOUBLE, FLOAT, or REAL data type.', -'DB2_FORWARD_ONLY' => 'Specifies a forward-only cursor for a statement resource. This is the default cursor type and is supported on all database servers.', -'DB2_LONG' => 'Specifies that the variable should be bound as a SMALLINT, INTEGER, or BIGINT data type.', -'DB2_PARAM_FILE' => 'Specifies that the column should be bound directly to a file for input.', -'DB2_PARAM_IN' => 'Specifies the PHP variable should be bound as an IN parameter for a stored procedure.', -'DB2_PARAM_INOUT' => 'Specifies the PHP variable should be bound as an INOUT parameter for a stored procedure.', -'DB2_PARAM_OUT' => 'Specifies the PHP variable should be bound as an OUT parameter for a stored procedure.', -'DB2_PASSTHRU' => 'Specifies that binary data shall be converted to a `null` value.', -'DB2_SCROLLABLE' => 'Specifies a scrollable cursor for a statement resource. This mode enables random access to rows in a result set, but currently is supported only by IBM DB2 Universal Database.', -'DBASE_RDONLY' => 'Open database for reading only. Used with `dbase_open`. (Available as of dbase 7.0.0)', -'DBASE_RDWR' => 'Open database for reading and writing. Used with `dbase_open`. (Available as of dbase 7.0.0)', -'DBASE_TYPE_DBASE' => 'Create dBASE style database. Used with `dbase_create`. (Available as of dbase 7.0.0)', -'DBASE_TYPE_FOXPRO' => 'Create FoxPro style database. Used with `dbase_create`. (Available as of dbase 7.0.0)', -'DBASE_VERSION' => 'The extension version. (Available as of dbase 7.0.0)', -'E_ALL' => 'Error reporting constant', -'E_COMPILE_ERROR' => 'Error reporting constant', -'E_COMPILE_WARNING' => 'Error reporting constant', -'E_CORE_ERROR' => 'Error reporting constant', -'E_CORE_WARNING' => 'Error reporting constant', -'E_DEPRECATED' => 'Error reporting constant. Available since PHP 5.3.0', -'E_ERROR' => 'Error reporting constant', -'E_NOTICE' => 'Error reporting constant', -'E_PARSE' => 'Error reporting constant', -'E_RECOVERABLE_ERROR' => 'Error reporting constant. Available since PHP 5.2.0', -'E_STRICT' => 'Error reporting constant', -'E_USER_DEPRECATED' => 'Error reporting constant. Available since PHP 5.3.0', -'E_USER_ERROR' => 'Error reporting constant', -'E_USER_NOTICE' => 'Error reporting constant', -'E_USER_WARNING' => 'Error reporting constant', -'E_WARNING' => 'Error reporting constant', -'EIO_DT_BLK' => 'Node type', -'EIO_DT_CHR' => 'Node type', -'EIO_DT_CMP' => 'HP-UX network special node type', -'EIO_DT_DIR' => 'Directory node type', -'EIO_DT_DOOR' => 'Solaris door node type', -'EIO_DT_FIFO' => 'FIFO node type', -'EIO_DT_LNK' => 'Link node type', -'EIO_DT_MAX' => 'Highest node type value', -'EIO_DT_MPB' => 'Multiplexed block device (v7+coherent)', -'EIO_DT_MPC' => 'Multiplexed char device (v7+coherent) node type', -'EIO_DT_NAM' => 'Xenix special named file node type', -'EIO_DT_REG' => 'Node type', -'EIO_DT_SOCK' => 'Socket node type', -'EIO_DT_UNKNOWN' => 'Unknown node type(very common). Further `stat` needed.', -'EIO_DT_WHT' => 'Node type', -'EIO_PRI_DEFAULT' => 'Request default prioriry', -'EIO_PRI_MAX' => 'Request maximal prioriry', -'EIO_PRI_MIN' => 'Request minimal prioriry', -'EIO_READDIR_DENTS' => '`eio_readdir` flag. If specified, the result argument of the callback becomes an array with the following keys: `\'names\'` - array of directory names `\'dents\'` - array of `struct eio_dirent`-like arrays having the following keys each: `\'name\'` - the directory name; `\'type\'` - one of *EIO_DT_** constants; `\'inode\'` - the inode number, if available, otherwise unspecified;', -'EIO_READDIR_DIRS_FIRST' => 'When this flag is specified, the names will be returned in an order where likely directories come first, in optimal stat order.', -'EIO_READDIR_STAT_ORDER' => 'When this flag is specified, then the names will be returned in an order suitable for `stat`\'ing each one. When planning to `stat` all files in the given directory, the returned order will likely be fastest.', -'EIO_SEEK_CUR' => 'The offset is set to its current location plus offset bytes.', -'EIO_SEEK_END' => 'The offset is set to the size of the file plus offset bytes.', -'EIO_SEEK_SET' => 'The offset is set to specified number of bytes(offset).', -'ENC7BIT' => 'Body encoding: 7 bit SMTP semantic data', -'ENC8BIT' => 'Body encoding: 8 bit SMTP semantic data', -'ENCBASE64' => 'Body encoding: base-64 encoded data', -'ENCBINARY' => 'Body encoding: 8 bit binary data', -'ENCHANT_ISPELL' => 'Dictionary type for Ispell. Used with `enchant_broker_get_dict_path` and `enchant_broker_set_dict_path`.', -'ENCHANT_MYSPELL' => 'Dictionary type for MySpell. Used with `enchant_broker_get_dict_path` and `enchant_broker_set_dict_path`.', -'ENCOTHER' => 'Body encoding: unknown', -'ENCQUOTEDPRINTABLE' => 'Body encoding: human-readable 8-as-7 bit data', -'Ev::BACKEND_ALL' => 'Try all backends(even currupted ones). It\'s not recommended to use it explicitly. Bitwise operators should be -applied here(e.g. Ev::BACKEND_ALL & ~ Ev::BACKEND_KQUEUE ) Use Ev::recommendedBackends() , or don\'t specify any -backends at all.', -'Ev::BACKEND_DEVPOLL' => 'Solaris 8 backend. This is not implemented yet.', -'Ev::BACKEND_EPOLL' => 'Linux-specific epoll(7) backend for both pre- and post-2.6.9 kernels', -'Ev::BACKEND_KQUEUE' => 'kqueue backend used on most BSD systems. EvEmbed watcher could be used to embed one loop(with kqueue backend) -into another. For instance, one can try to create an event loop with kqueue backend and use it for sockets only.', -'Ev::BACKEND_MASK' => 'Not a backend, but a mask to select all backend bits from flags value to mask out any backends(e.g. when -modifying the LIBEV_FLAGS environment variable).', -'Ev::BACKEND_POLL' => 'poll(2) backend', -'Ev::BACKEND_PORT' => 'Solaris 10 event port mechanism with a good scaling.', -'Ev::BACKEND_SELECT' => 'select(2) backend', -'Ev::BREAK_ALL' => 'Flag passed to Ev::stop() or EvLoop::stop(): Makes all nested Ev::run() or EvLoop::run() calls return.', -'Ev::BREAK_CANCEL' => 'Flag passed to Ev::stop() or EvLoop::stop(): Cancel the break operation.', -'Ev::BREAK_ONE' => 'Flag passed to Ev::stop() or EvLoop::stop(): Makes the innermost Ev::run() or EvLoop::run() call return.', -'Ev::CHECK' => 'Event bitmask: All EvCheck watchers are queued just after Ev::run() has gathered the new events, but before it -queues any callbacks for any received events. Thus, EvCheck watchers will be invoked before any other watchers -of the same or lower priority within an event loop iteration.', -'Ev::CHILD' => 'Event bitmask: The pid specified in EvChild::__construct() has received a status change.', -'Ev::CUSTOM' => 'Event bitmask: Not ever sent(or otherwise used) by libev itself, but can be freely used by libev users to signal -watchers (e.g. via EvWatcher::feed() ).', -'Ev::EMBED' => 'Event bitmask: The embedded event loop specified in the EvEmbed watcher needs attention.', -'Ev::ERROR' => 'Event bitmask: An unspecified error has occurred, the watcher has been stopped. This might happen because the -watcher could not be properly started because libev ran out of memory, a file descriptor was found to be closed -or any other problem. Libev considers these application bugs.', -'Ev::FLAG_AUTO' => 'Flag passed to create a loop: The default flags value', -'Ev::FLAG_FORKCHECK' => 'Flag passed to create a loop: Makes libev check for a fork in each iteration, instead of calling EvLoop::fork() -manually. This works by calling getpid() on every iteration of the loop, and thus this might slow down the event -loop with lots of loop iterations, but usually is not noticeable. This flag setting cannot be overridden or -specified in the LIBEV_FLAGS environment variable.', -'Ev::FLAG_NOENV' => 'Flag passed to create a loop: If this flag used(or the program runs setuid or setgid), libev won\'t look at the -environment variable LIBEV_FLAGS. Otherwise(by default), LIBEV_FLAGS will override the flags completely if it is -found. Useful for performance tests and searching for bugs.', -'Ev::FLAG_NOINOTIFY' => 'Flag passed to create a loop: When this flag is specified, libev won\'t attempt to use the inotify API for its -ev_stat watchers. The flag can be useful to conserve inotify file descriptors, as otherwise each loop using -ev_stat watchers consumes one inotify handle.', -'Ev::FLAG_NOSIGMASK' => 'Flag passed to create a loop: When this flag is specified, libev will avoid to modify the signal mask. -Specifically, this means having to make sure signals are unblocked before receiving them. - -This behaviour is useful for custom signal handling, or handling signals only in specific threads.', -'Ev::FLAG_SIGNALFD' => 'Flag passed to create a loop: When this flag is specified, libev will attempt to use the signalfd API for its -ev_signal (and ev_child ) watchers. This API delivers signals synchronously, which makes it both faster and might -make it possible to get the queued signal data. It can also simplify signal handling with threads, as long as -signals are properly blocked in threads. Signalfd will not be used by default.', -'Ev::IDLE' => 'Event bitmask: EvIdle watcher works when there is nothing to do with other watchers.', -'Ev::MAXPRI' => 'Highest allowed watcher priority.', -'Ev::MINPRI' => 'Lowest allowed watcher priority.', -'Ev::PERIODIC' => 'Event bitmask: EvPeriodic watcher has been timed out.', -'Ev::PREPARE' => 'Event bitmask: All EvPrepare watchers are invoked just before Ev::run() starts. Thus, EvPrepare watchers are the -last watchers invoked before the event loop sleeps or polls for new events.', -'Ev::READ' => 'Event bitmask: The file descriptor in the EvIo watcher has become readable.', -'Ev::RUN_NOWAIT' => 'Flag passed to Ev::run() or EvLoop::run(): Means that event loop will look for new events, will handle those -events and any already outstanding ones, but will not wait and block the process in case there are no events and -will return after one iteration of the loop. This is sometimes useful to poll and handle new events while doing -lengthy calculations, to keep the program responsive.', -'Ev::RUN_ONCE' => 'Flag passed to Ev::run() or EvLoop::run(): Means that event loop will look for new events (waiting if necessary) -and will handle those and any already outstanding ones. It will block the process until at least one new event -arrives (which could be an event internal to libev itself, so there is no guarantee that a user-registered -callback will be called), and will return after one iteration of the loop.', -'Ev::SIGNAL' => 'Event bitmask: A signal specified in EvSignal::__construct() has been received.', -'Ev::STAT' => 'Event bitmask: The path specified in EvStat watcher changed its attributes.', -'Ev::TIMER' => 'Event bitmask: EvTimer watcher has been timed out.', -'Ev::WRITE' => 'Event bitmask: The file descriptor in the EvIo watcher has become writable.', -'EXIF_USE_MBSTRING' => 'This constant have a value of `1` if the mbstring is enabled, otherwise the value is `0`.', -'EXP_EOF' => 'Value, returned by `expect_expectl`, when EOF is reached.', -'EXP_EXACT' => 'Indicates that the pattern is an exact string.', -'EXP_FULLBUFFER' => 'Value, returned by `expect_expectl` if no pattern have been matched.', -'EXP_GLOB' => 'Indicates that the pattern is a glob-style string pattern.', -'EXP_REGEXP' => 'Indicates that the pattern is a regexp-style string pattern.', -'EXP_TIMEOUT' => 'Value, returned by `expect_expectl` upon timeout of seconds, specified in value of expect.timeout', -'FANN_COS' => 'Periodical cosinus activation function.', -'FANN_COS_SYMMETRIC' => 'Periodical cosinus activation function.', -'FANN_E_CANT_ALLOCATE_MEM' => 'Unable to allocate memory.', -'FANN_E_CANT_OPEN_CONFIG_R' => 'Unable to open configuration file for reading.', -'FANN_E_CANT_OPEN_CONFIG_W' => 'Unable to open configuration file for writing.', -'FANN_E_CANT_OPEN_TD_R' => 'Unable to open train data file for reading.', -'FANN_E_CANT_OPEN_TD_W' => 'Unable to open train data file for writing.', -'FANN_E_CANT_READ_CONFIG' => 'Error reading info from configuration file.', -'FANN_E_CANT_READ_CONNECTIONS' => 'Error reading connections from configuration file.', -'FANN_E_CANT_READ_NEURON' => 'Error reading neuron info from configuration file.', -'FANN_E_CANT_READ_TD' => 'Error reading training data from file.', -'FANN_E_CANT_TRAIN_ACTIVATION' => 'Unable to train with the selected activation function.', -'FANN_E_CANT_USE_ACTIVATION' => 'Unable to use the selected activation function.', -'FANN_E_CANT_USE_TRAIN_ALG' => 'Unable to use the selected training algorithm.', -'FANN_E_INDEX_OUT_OF_BOUND' => 'Index is out of bound.', -'FANN_E_INPUT_NO_MATCH' => 'The number of input neurons in the ann data do not match', -'FANN_E_NO_ERROR' => 'No error.', -'FANN_E_OUTPUT_NO_MATCH' => 'The number of output neurons in the ann and data do not match.', -'FANN_E_SCALE_NOT_PRESENT' => 'Scaling parameters not present.', -'FANN_E_TRAIN_DATA_MISMATCH' => 'Irreconcilable differences between two struct fann_train_data structures.', -'FANN_E_TRAIN_DATA_SUBSET' => 'Trying to take subset which is not within the training set.', -'FANN_E_WRONG_CONFIG_VERSION' => 'Wrong version of configuration file.', -'FANN_E_WRONG_NUM_CONNECTIONS' => 'Number of connections not equal to the number expected.', -'FANN_ELLIOT' => 'Fast (sigmoid like) activation function defined by David Elliott.', -'FANN_ELLIOT_SYMMETRIC' => 'Fast (symmetric sigmoid like) activation function defined by David Elliott.', -'FANN_ERRORFUNC_LINEAR' => 'Standard linear error function.', -'FANN_ERRORFUNC_TANH' => 'Tanh error function, usually better but can require a lower learning rate. This error function aggressively targets outputs that differ much from the desired, while not targeting outputs that only differ a little that much. This activation function is not recommended for cascade training and incremental training.', -'FANN_GAUSSIAN' => 'Gaussian activation function.', -'FANN_GAUSSIAN_STEPWISE' => 'Stepwise gaussian activation function.', -'FANN_GAUSSIAN_SYMMETRIC' => 'Symmetric gaussian activation function.', -'FANN_LINEAR' => 'Linear activation function.', -'FANN_LINEAR_PIECE' => 'Bounded linear activation function.', -'FANN_LINEAR_PIECE_SYMMETRIC' => 'Bounded linear activation function.', -'FANN_NETTYPE_LAYER' => 'Each layer only has connections to the next layer.', -'FANN_NETTYPE_SHORTCUT' => 'Each layer has connections to all following layers', -'FANN_SIGMOID' => 'Sigmoid activation function.', -'FANN_SIGMOID_STEPWISE' => 'Stepwise linear approximation to sigmoid.', -'FANN_SIGMOID_SYMMETRIC' => 'Symmetric sigmoid activation function, aka. tanh.', -'FANN_SIGMOID_SYMMETRIC_STEPWISE' => 'Stepwise linear approximation to symmetric sigmoid', -'FANN_SIN' => 'Periodical sinus activation function.', -'FANN_SIN_SYMMETRIC' => 'Periodical sinus activation function.', -'FANN_STOPFUNC_BIT' => 'Stop criteria is number of bits that fail. The number of bits means the number of output neurons which differs more than the bit fail limit (see fann_get_bit_fail_limit, fann_set_bit_fail_limit). The bits are counted in all of the training data, so this number can be higher than the number of training data.', -'FANN_STOPFUNC_MSE' => 'Stop criteria is Mean Square Error (MSE) value.', -'FANN_THRESHOLD' => 'Threshold activation function.', -'FANN_THRESHOLD_SYMMETRIC' => 'Threshold activation function.', -'FANN_TRAIN_BATCH' => 'Standard backpropagation algorithm, where the weights are updated after calculating the mean square error for the whole training set. This means that the weights are only updated once during a epoch. For this reason some problems, will train slower with this algorithm. But since the mean square error is calculated more correctly than in incremental training, some problems will reach a better solutions with this algorithm.', -'FANN_TRAIN_INCREMENTAL' => 'Standard backpropagation algorithm, where the weights are updated after each training pattern. This means that the weights are updated many times during a single epoch. For this reason some problems, will train very fast with this algorithm, while other more advanced problems will not train very well.', -'FANN_TRAIN_QUICKPROP' => 'A more advanced batch training algorithm which achieves good results for many problems. The quickprop training algorithm uses the learning_rate parameter along with other more advanced parameters, but it is only recommended to change these advanced parameters, for users with insight in how the quickprop training algorithm works. The quickprop training algorithm is described by [Fahlman, 1988].', -'FANN_TRAIN_RPROP' => 'A more advanced batch training algorithm which achieves good results for many problems. The RPROP training algorithm is adaptive, and does therefore not use the learning_rate. Some other parameters can however be set to change the way the RPROP algorithm works, but it is only recommended for users with insight in how the RPROP training algorithm works. The RPROP training algorithm is described by [Riedmiller and Braun, 1993], but the actual learning algorithm used here is the iRPROP- training algorithm which is described by [Igel and Husken, 2000] which is an variety of the standard RPROP training algorithm.', -'FANN_TRAIN_SARPROP' => 'Even more advance training algorithm. Only for version 2.2', -'FILE_APPEND' => 'Append content to existing file.', -'FILE_IGNORE_NEW_LINES' => 'Strip EOL characters.', -'FILE_SKIP_EMPTY_LINES' => 'Skip empty lines.', -'FILE_USE_INCLUDE_PATH' => 'Search for filename in include_path.', -'FILEINFO_COMPRESS' => 'Decompress compressed files. - -Disabled since PHP 5.3.0 due to thread safety issues.', -'FILEINFO_CONTINUE' => 'Return all matches, not just the first.', -'FILEINFO_DEVICES' => 'Look at the contents of blocks or character special devices.', -'FILEINFO_EXTENSION' => 'Returns the file extension appropriate for a the MIME type detected in the file. - -For types that commonly have multiple file extensions, such as `JPEG` images, then the return value is multiple extensions separated by a forward slash e.g.: `"jpeg/jpg/jpe/jfif"`. For unknown types not available in the magic.mime database, then return value is `"???"`. - -Available since PHP 7.2.0.', -'FILEINFO_MIME' => 'Return the mime type and mime encoding as defined by RFC 2045.', -'FILEINFO_MIME_ENCODING' => 'Return the mime encoding of the file. - -Available since PHP 5.3.0.', -'FILEINFO_MIME_TYPE' => 'Return the mime type. - -Available since PHP 5.3.0.', -'FILEINFO_NONE' => 'No special handling.', -'FILEINFO_PRESERVE_ATIME' => 'If possible preserve the original access time.', -'FILEINFO_RAW' => 'Don\'t translate unprintable characters to a `\ooo` octal representation.', -'FILEINFO_SYMLINK' => 'Follow symlinks.', -'FILTER_CALLBACK' => 'ID of "callback" filter.', -'FILTER_DEFAULT' => 'ID of default ("unsafe_raw") filter. This is equivalent to `FILTER_UNSAFE_RAW`.', -'FILTER_FLAG_ALLOW_FRACTION' => 'Allow fractional part in "number_float" filter.', -'FILTER_FLAG_ALLOW_HEX' => 'Allow hex notation (`0x[0-9a-fA-F]+`) in "int" filter.', -'FILTER_FLAG_ALLOW_OCTAL' => 'Allow octal notation (`0[0-7]+`) in "int" filter.', -'FILTER_FLAG_ALLOW_SCIENTIFIC' => 'Allow scientific notation (`e`, `E`) in "number_float" filter.', -'FILTER_FLAG_ALLOW_THOUSAND' => 'Allow thousand separator (`,`) in "number_float" filter.', -'FILTER_FLAG_EMAIL_UNICODE' => 'Accepts Unicode characters in the local part in "validate_email" filter. (Available as of PHP 7.1.0)', -'FILTER_FLAG_EMPTY_STRING_NULL' => '(No use for now.)', -'FILTER_FLAG_ENCODE_AMP' => 'Encode `&`.', -'FILTER_FLAG_ENCODE_HIGH' => 'Encode characters with ASCII value greater than 127.', -'FILTER_FLAG_ENCODE_LOW' => 'Encode characters with ASCII value less than 32.', -'FILTER_FLAG_IPV4' => 'Allow only IPv4 address in "validate_ip" filter.', -'FILTER_FLAG_IPV6' => 'Allow only IPv6 address in "validate_ip" filter.', -'FILTER_FLAG_NO_ENCODE_QUOTES' => 'Don\'t encode `\'` and `"`.', -'FILTER_FLAG_NO_PRIV_RANGE' => 'Deny private addresses in "validate_ip" filter.', -'FILTER_FLAG_NO_RES_RANGE' => 'Deny reserved addresses in "validate_ip" filter.', -'FILTER_FLAG_NONE' => 'No flags.', -'FILTER_FLAG_PATH_REQUIRED' => 'Require path in "validate_url" filter.', -'FILTER_FLAG_QUERY_REQUIRED' => 'Require query in "validate_url" filter.', -'FILTER_FLAG_STRIP_HIGH' => 'Strip characters with ASCII value greater than 127.', -'FILTER_FLAG_STRIP_LOW' => 'Strip characters with ASCII value less than 32.', -'FILTER_FORCE_ARRAY' => 'Always returns an array.', -'FILTER_NULL_ON_FAILURE' => 'Use NULL instead of FALSE on failure.', -'FILTER_REQUIRE_ARRAY' => 'Require an array as input.', -'FILTER_REQUIRE_SCALAR' => 'Flag used to require scalar as input', -'FILTER_SANITIZE_EMAIL' => 'ID of "email" filter.', -'FILTER_SANITIZE_ENCODED' => 'ID of "encoded" filter.', -'FILTER_SANITIZE_MAGIC_QUOTES' => 'ID of "magic_quotes" filter.', -'FILTER_SANITIZE_NUMBER_FLOAT' => 'ID of "number_float" filter.', -'FILTER_SANITIZE_NUMBER_INT' => 'ID of "number_int" filter.', -'FILTER_SANITIZE_SPECIAL_CHARS' => 'ID of "special_chars" filter.', -'FILTER_SANITIZE_STRING' => 'ID of "string" filter.', -'FILTER_SANITIZE_STRIPPED' => 'ID of "stripped" filter.', -'FILTER_SANITIZE_URL' => 'ID of "url" filter.', -'FILTER_UNSAFE_RAW' => 'ID of "unsafe_raw" filter.', -'FILTER_VALIDATE_BOOLEAN' => 'ID of "boolean" filter.', -'FILTER_VALIDATE_EMAIL' => 'ID of "validate_email" filter.', -'FILTER_VALIDATE_FLOAT' => 'ID of "float" filter.', -'FILTER_VALIDATE_INT' => 'ID of "int" filter.', -'FILTER_VALIDATE_IP' => 'ID of "validate_ip" filter.', -'FILTER_VALIDATE_MAC' => 'ID of "validate_mac_address" filter. (Available as of PHP 5.5.0)', -'FILTER_VALIDATE_REGEXP' => 'ID of "validate_regexp" filter.', -'FILTER_VALIDATE_URL' => 'ID of "validate_url" filter.', -'FNM_CASEFOLD' => 'Caseless match. Part of the GNU extension.', -'FNM_NOESCAPE' => 'Disable backslash escaping.', -'FNM_PATHNAME' => 'Slash in string only matches slash in the given pattern.', -'FNM_PERIOD' => 'Leading period in string must be exactly matched by period in the given pattern.', -'FPE_FLTDIV' => 'Available since PHP 5.3.0.', -'FPE_FLTINV' => 'Available since PHP 5.3.0.', -'FPE_FLTOVF' => 'Available since PHP 5.3.0.', -'FPE_FLTRES' => 'Available since PHP 5.3.0.', -'FPE_FLTSUB' => 'Available since PHP 5.3.0.', -'FPE_FLTUND' => 'Available since PHP 5.3.0.', -'FPE_INTDIV' => 'Available since PHP 5.3.0.', -'FPE_INTOVF' => 'Available since PHP 5.3.0.', -'FRIBIDI_AUTO' => 'Autodetect the base direction', -'FRIBIDI_CHARSET_8859_6' => 'Arabic', -'FRIBIDI_CHARSET_8859_8' => 'Hebrew', -'FRIBIDI_CHARSET_CAP_RTL' => 'Used for test purposes, will treat CAPS as non-English letters', -'FRIBIDI_CHARSET_CP1255' => 'Hebrew/Yiddish', -'FRIBIDI_CHARSET_CP1256' => 'Arabic', -'FRIBIDI_CHARSET_ISIRI_3342' => 'Persian', -'FRIBIDI_CHARSET_UTF8' => 'Unicode', -'FRIBIDI_LTR' => 'Left to right', -'FRIBIDI_RTL' => 'Right to left', -'FT_INTERNAL' => 'The return string is in internal format, will not canonicalize to CRLF.', -'FT_PEEK' => 'Do not set the \Seen flag if not already set', -'FT_UID' => 'The parameter is a UID', -'GD_BUNDLED' => 'When the bundled version of GD is used this is 1 otherwise its set to 0.', -'GD_EXTRA_VERSION' => 'The GD "extra" version (beta/rc..) PHP was compiled against. (Available as of PHP 5.2.4)', -'GD_MAJOR_VERSION' => 'The GD major version PHP was compiled against. (Available as of PHP 5.2.4)', -'GD_MINOR_VERSION' => 'The GD minor version PHP was compiled against. (Available as of PHP 5.2.4)', -'GD_RELEASE_VERSION' => 'The GD release version PHP was compiled against. (Available as of PHP 5.2.4)', -'GD_VERSION' => 'The GD version PHP was compiled against. (Available as of PHP 5.2.4)', -'GEARMAN_CLIENT_FREE_TASKS' => 'Automatically free task objects once they are complete. This is the default setting in this extension to prevent memory leaks.', -'GEARMAN_CLIENT_GENERATE_UNIQUE' => 'Generate a unique id (UUID) for each task.', -'GEARMAN_CLIENT_NON_BLOCKING' => 'Run the cient in a non-blocking mode.', -'GEARMAN_CLIENT_UNBUFFERED_RESULT' => 'Allow the client to read data in chunks rather than have the library buffer the entire data result and pass that back.', -'GEARMAN_COULD_NOT_CONNECT' => 'Failed to connect to servers.', -'GEARMAN_ECHO_DATA_CORRUPTION' => 'After `GearmanClient::echo` or `GearmanWorker::echo` the data returned doesn\'t match the data sent.', -'GEARMAN_ERRNO' => 'A system error. Check `GearmanClient::errno` or `GearmanWorker::errno` for the system error code that was returned.', -'GEARMAN_GETADDRINFO' => 'DNS resolution failed (invalid host, port, etc).', -'GEARMAN_INVALID_FUNCTION_NAME' => 'Trying to register a function name of NULL or using the callback interface without specifying callbacks.', -'GEARMAN_INVALID_WORKER_FUNCTION' => 'Trying to register a function with a NULL callback function.', -'GEARMAN_IO_WAIT' => 'When in non-blocking mode, an event is hit that would have blocked.', -'GEARMAN_LOST_CONNECTION' => 'Lost a connection during a request.', -'GEARMAN_MEMORY_ALLOCATION_FAILURE' => 'Memory allocation failed (ran out of memory).', -'GEARMAN_NEED_WORKLOAD_FN' => 'When the client opted to stream the workload of a task, but did not specify a workload callback function.', -'GEARMAN_NO_ACTIVE_FDS' => '`GearmanClient::wait` or `GearmanWorker` was called with no connections.', -'GEARMAN_NO_JOBS' => 'For a non-blocking worker, when `GearmanWorker::work` does not have any active jobs.', -'GEARMAN_NO_REGISTERED_FUNCTIONS' => 'When a worker gets a job for a function it did not register.', -'GEARMAN_NO_SERVERS' => 'Did not call `GearmanClient::addServer` before submitting jobs or tasks.', -'GEARMAN_PAUSE' => 'For the non-blocking client task interface, can be returned from the task callback to "pause" the call and return from `GearmanClient::runTasks`. Call `GearmanClient::runTasks` again to continue.', -'GEARMAN_SEND_BUFFER_TOO_SMALL' => 'Internal error: trying to flush more data in one atomic chunk than is possible due to hard-coded buffer sizes.', -'GEARMAN_SERVER_ERROR' => 'Something went wrong in the Gearman server and it could not handle the request gracefully.', -'GEARMAN_SUCCESS' => 'Whatever action was taken was successful.', -'GEARMAN_TIMEOUT' => 'Hit the timeout limit set by the client/worker.', -'GEARMAN_UNEXPECTED_PACKET' => 'Indicates something going very wrong in gearmand. Applies only to `GearmanWorker`.', -'GEARMAN_UNKNOWN_STATE' => 'Internal client/worker state error.', -'GEARMAN_WORK_DATA' => 'Notice return code obtained with `GearmanClient::returnCode` when using `GearmanClient::do`. Sent to update the client with data from a running job. A worker uses this when it needs to send updates, send partial results, or flush data during long running jobs.', -'GEARMAN_WORK_EXCEPTION' => 'Notice return code obtained with `GearmanClient::returnCode` when using `GearmanClient::do`. Indicates that a job failed with a given exception.', -'GEARMAN_WORK_FAIL' => 'Notice return code obtained with `GearmanClient::returnCode` when using `GearmanClient::do`. Indicates that the job failed.', -'GEARMAN_WORK_STATUS' => 'Notice return code obtained with `GearmanClient::returnCode` when using `GearmanClient::do`. Sent to update the status of a long running job. Use `GearmanClient::doStatus` to obtain the percentage complete of the task.', -'GEARMAN_WORK_WARNING' => 'Notice return code obtained with `GearmanClient::returnCode` when using `GearmanClient::do`. Updates the client with a warning. The behavior is just like `GEARMAN_WORK_DATA`, but should be treated as a warning instead of normal response data.', -'GEARMAN_WORKER_GRAB_UNIQ' => 'Return the client assigned unique ID in addition to the job handle.', -'GEARMAN_WORKER_NON_BLOCKING' => 'Run the worker in non-blocking mode.', -'Gmagick::COLOR_ALPHA' => 'Alpha', -'Gmagick::COLOR_BLACK' => 'Black', -'Gmagick::COLOR_BLUE' => 'Blue', -'Gmagick::COLOR_CYAN' => 'Cyan', -'Gmagick::COLOR_FUZZ' => 'Fuzz', -'Gmagick::COLOR_GREEN' => 'Green', -'Gmagick::COLOR_MAGENTA' => 'Magenta', -'Gmagick::COLOR_OPACITY' => 'Opacity', -'Gmagick::COLOR_RED' => 'Red', -'Gmagick::COLOR_YELLOW' => 'Yellow', -'Gmagick::COMPOSITE_ADD' => 'The result of image + image', -'Gmagick::COMPOSITE_ATOP' => 'The result is the same shape as image, with composite image obscuring image where the image shapes overlap', -'Gmagick::COMPOSITE_BLEND' => 'Blends the image', -'Gmagick::COMPOSITE_BUMPMAP' => 'The same as COMPOSITE_MULTIPLY, except the source is converted to grayscale first.', -'Gmagick::COMPOSITE_CLEAR' => 'Makes the target image transparent', -'Gmagick::COMPOSITE_COLORBURN' => 'Darkens the destination image to reflect the source image', -'Gmagick::COMPOSITE_COLORDODGE' => 'Brightens the destination image to reflect the source image', -'Gmagick::COMPOSITE_COLORIZE' => 'Colorizes the target image using the composite image', -'Gmagick::COMPOSITE_COPY' => 'Copies the source image on the target image', -'Gmagick::COMPOSITE_COPYBLACK' => 'Copies black from the source to target', -'Gmagick::COMPOSITE_COPYBLUE' => 'Copies blue from the source to target', -'Gmagick::COMPOSITE_COPYCYAN' => 'Copies cyan from the source to target', -'Gmagick::COMPOSITE_COPYGREEN' => 'Copies green from the source to target', -'Gmagick::COMPOSITE_COPYMAGENTA' => 'Copies magenta from the source to target', -'Gmagick::COMPOSITE_COPYOPACITY' => 'Copies opacity from the source to target', -'Gmagick::COMPOSITE_COPYRED' => 'Copies red from the source to target', -'Gmagick::COMPOSITE_COPYYELLOW' => 'Copies yellow from the source to target', -'Gmagick::COMPOSITE_DARKEN' => 'Darkens the target image', -'Gmagick::COMPOSITE_DEFAULT' => 'The default composite operator', -'Gmagick::COMPOSITE_DIFFERENCE' => 'Subtracts the darker of the two constituent colors from the lighter', -'Gmagick::COMPOSITE_DISPLACE' => 'Shifts target image pixels as defined by the source', -'Gmagick::COMPOSITE_DISSOLVE' => 'Dissolves the source in to the target', -'Gmagick::COMPOSITE_DST' => 'The target is left untouched', -'Gmagick::COMPOSITE_DSTATOP' => 'The part of the destination lying inside of the source is composited over the source and replaces the destination', -'Gmagick::COMPOSITE_DSTIN' => 'The parts inside the source replace the target', -'Gmagick::COMPOSITE_DSTOUT' => 'The parts outside the source replace the target', -'Gmagick::COMPOSITE_DSTOVER' => 'Target replaces the source', -'Gmagick::COMPOSITE_EXCLUSION' => 'Produces an effect similar to that of Gmagick::COMPOSITE_DIFFERENCE, but appears as lower contrast', -'Gmagick::COMPOSITE_HARDLIGHT' => 'Multiplies or screens the colors, dependent on the source color value', -'Gmagick::COMPOSITE_HUE' => 'Modifies the hue of the target as defined by source', -'Gmagick::COMPOSITE_IN' => 'Composites source into the target', -'Gmagick::COMPOSITE_LIGHTEN' => 'Lightens the target as defined by source', -'Gmagick::COMPOSITE_LUMINIZE' => 'Luminizes the target as defined by source', -'Gmagick::COMPOSITE_MINUS' => 'Subtracts the source from the target', -'Gmagick::COMPOSITE_MODULATE' => 'Modulates the target brightness, saturation and hue as defined by source', -'Gmagick::COMPOSITE_MULTIPLY' => 'Multiplies the target to the source', -'Gmagick::COMPOSITE_NO' => 'No composite operator defined', -'Gmagick::COMPOSITE_OUT' => 'Composites outer parts of the source on the target', -'Gmagick::COMPOSITE_OVER' => 'Composites source over the target', -'Gmagick::COMPOSITE_OVERLAY' => 'Overlays the source on the target', -'Gmagick::COMPOSITE_PLUS' => 'Adds the source to the target', -'Gmagick::COMPOSITE_REPLACE' => 'Replaces the target with the source', -'Gmagick::COMPOSITE_SATURATE' => 'Saturates the target as defined by the source', -'Gmagick::COMPOSITE_SCREEN' => 'The source and destination are complemented and then multiplied and then replace the destination', -'Gmagick::COMPOSITE_SOFTLIGHT' => 'Darkens or lightens the colors, dependent on the source', -'Gmagick::COMPOSITE_SRC' => 'The source is copied to the destination', -'Gmagick::COMPOSITE_SRCATOP' => 'The part of the source lying inside of the destination is composited onto the destination', -'Gmagick::COMPOSITE_SRCIN' => 'The part of the source lying inside of the destination replaces the destination', -'Gmagick::COMPOSITE_SRCOUT' => 'The part of the source lying outside of the destination replaces the destination', -'Gmagick::COMPOSITE_SRCOVER' => 'The source replaces the destination', -'Gmagick::COMPOSITE_SUBTRACT' => 'Subtract the colors in the source image from the destination image', -'Gmagick::COMPOSITE_THRESHOLD' => 'The source is composited on the target as defined by source threshold', -'Gmagick::COMPOSITE_UNDEFINED' => 'Undefined composite operator', -'Gmagick::COMPOSITE_XOR' => 'The part of the source that lies outside of the destination is combined with the part of the destination that lies outside of the source', -'GMP_VERSION' => 'The GMP library version', -'Grpc\CALL_ERROR' => 'something failed, we don\'t know what', -'Grpc\CALL_ERROR_ALREADY_ACCEPTED' => 'this method must be called before server_accept', -'Grpc\CALL_ERROR_ALREADY_FINISHED' => 'this call is already finished -(writes_done or write_status has already been called)', -'Grpc\CALL_ERROR_ALREADY_INVOKED' => 'this method must be called before invoke', -'Grpc\CALL_ERROR_BATCH_TOO_BIG' => 'this batch of operations leads to more operations than allowed', -'Grpc\CALL_ERROR_INVALID_FLAGS' => 'the flags value was illegal for this call', -'Grpc\CALL_ERROR_INVALID_MESSAGE' => 'invalid message was passed to this call', -'Grpc\CALL_ERROR_INVALID_METADATA' => 'invalid metadata was passed to this call', -'Grpc\CALL_ERROR_NOT_INVOKED' => 'this method must be called after invoke', -'Grpc\CALL_ERROR_NOT_ON_CLIENT' => 'this method is not available on the client', -'Grpc\CALL_ERROR_NOT_ON_SERVER' => 'this method is not available on the server', -'Grpc\CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE' => 'completion queue for notification has not been registered with the -server', -'Grpc\CALL_ERROR_PAYLOAD_TYPE_MISMATCH' => 'payload type requested is not the type registered', -'Grpc\CALL_ERROR_TOO_MANY_OPERATIONS' => 'there is already an outstanding read/write operation on the call', -'Grpc\CALL_OK' => 'everything went ok', -'Grpc\CHANNEL_CONNECTING' => 'channel is connecting', -'Grpc\CHANNEL_IDLE' => 'channel is idle', -'Grpc\CHANNEL_READY' => 'channel is ready for work', -'Grpc\CHANNEL_SHUTDOWN' => 'channel has seen a failure that it cannot recover from', -'Grpc\CHANNEL_TRANSIENT_FAILURE' => 'channel has seen a failure but expects to recover', -'Grpc\OP_RECV_CLOSE_ON_SERVER' => 'Receive close on the server: one and only one must be made on the -server. -This op completes after the close has been received by the server. -This operation always succeeds, meaning ops paired with this operation -will also appear to succeed, even though they may not have.', -'Grpc\OP_RECV_INITIAL_METADATA' => 'Receive initial metadata: one and only one MUST be made on the client, -must not be made on the server. -This op completes after all initial metadata has been read from the -peer.', -'Grpc\OP_RECV_MESSAGE' => 'Receive a message: 0 or more of these operations can occur for each call. -This op completes after all bytes of the received message have been -read, or after a half-close has been received on this call.', -'Grpc\OP_RECV_STATUS_ON_CLIENT' => 'Receive status on the client: one and only one must be made on the client. -This operation always succeeds, meaning ops paired with this operation -will also appear to succeed, even though they may not have. In that case -the status will indicate some failure. -This op completes after all activity on the call has completed.', -'Grpc\OP_SEND_CLOSE_FROM_CLIENT' => 'Send a close from the client: one and only one instance MUST be sent from -the client, unless the call was cancelled - in which case this can be -skipped. -This op completes after all bytes for the call (including the close) -have passed outgoing flow control.', -'Grpc\OP_SEND_INITIAL_METADATA' => 'Send initial metadata: one and only one instance MUST be sent for each -call, unless the call was cancelled - in which case this can be skipped. -This op completes after all bytes of metadata have been accepted by -outgoing flow control.', -'Grpc\OP_SEND_MESSAGE' => 'Send a message: 0 or more of these operations can occur for each call. -This op completes after all bytes for the message have been accepted by -outgoing flow control.', -'Grpc\OP_SEND_STATUS_FROM_SERVER' => 'Send status from the server: one and only one instance MUST be sent from -the server unless the call was cancelled - in which case this can be -skipped. -This op completes after all bytes for the call (including the status) -have passed outgoing flow control.', -'Grpc\STATUS_ABORTED' => 'The operation was aborted, typically due to a concurrency issue -like sequencer check failures, transaction aborts, etc. - -See litmus test above for deciding between FAILED_PRECONDITION, -ABORTED, and UNAVAILABLE.', -'Grpc\STATUS_CANCELLED' => 'The operation was cancelled (typically by the caller).', -'Grpc\STATUS_DATA_LOSS' => 'Unrecoverable data loss or corruption.', -'Grpc\STATUS_DEADLINE_EXCEEDED' => 'Deadline expired before operation could complete. For operations -that change the state of the system, this error may be returned -even if the operation has completed successfully. For example, a -successful response from a server could have been delayed long -enough for the deadline to expire.', -'Grpc\STATUS_FAILED_PRECONDITION' => 'Operation was rejected because the system is not in a state -required for the operation\'s execution. For example, directory -to be deleted may be non-empty, an rmdir operation is applied to -a non-directory, etc. - -A litmus test that may help a service implementor in deciding -between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE: - (a) Use UNAVAILABLE if the client can retry just the failing call. - (b) Use ABORTED if the client should retry at a higher-level - (e.g., restarting a read-modify-write sequence). - (c) Use FAILED_PRECONDITION if the client should not retry until - the system state has been explicitly fixed. E.g., if an "rmdir" - fails because the directory is non-empty, FAILED_PRECONDITION - should be returned since the client should not retry unless - they have first fixed up the directory by deleting files from it. - (d) Use FAILED_PRECONDITION if the client performs conditional - REST Get/Update/Delete on a resource and the resource on the - server does not match the condition. E.g., conflicting - read-modify-write on the same resource.', -'Grpc\STATUS_INTERNAL' => 'Internal errors. Means some invariants expected by underlying - system has been broken. If you see one of these errors, - something is very broken.', -'Grpc\STATUS_INVALID_ARGUMENT' => 'Client specified an invalid argument. Note that this differs -from FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments -that are problematic regardless of the state of the system -(e.g., a malformed file name).', -'Grpc\STATUS_NOT_FOUND' => 'Some requested entity (e.g., file or directory) was not found.', -'Grpc\STATUS_OK' => 'Not an error; returned on success', -'Grpc\STATUS_OUT_OF_RANGE' => 'Operation was attempted past the valid range. E.g., seeking or -reading past end of file. - -Unlike INVALID_ARGUMENT, this error indicates a problem that may -be fixed if the system state changes. For example, a 32-bit file -system will generate INVALID_ARGUMENT if asked to read at an -offset that is not in the range [0,2^32-1], but it will generate -OUT_OF_RANGE if asked to read from an offset past the current -file size. - -There is a fair bit of overlap between FAILED_PRECONDITION and -OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific -error) when it applies so that callers who are iterating through -a space can easily look for an OUT_OF_RANGE error to detect when -they are done.', -'Grpc\STATUS_PERMISSION_DENIED' => 'The caller does not have permission to execute the specified -operation. PERMISSION_DENIED must not be used for rejections -caused by exhausting some resource (use RESOURCE_EXHAUSTED -instead for those errors). PERMISSION_DENIED must not be -used if the caller can not be identified (use UNAUTHENTICATED -instead for those errors).', -'Grpc\STATUS_RESOURCE_EXHAUSTED' => 'Some resource has been exhausted, perhaps a per-user quota, or -perhaps the entire file system is out of space.', -'Grpc\STATUS_UNAUTHENTICATED' => 'The request does not have valid authentication credentials for the -operation.', -'Grpc\STATUS_UNAVAILABLE' => 'The service is currently unavailable. This is a most likely a -transient condition and may be corrected by retrying with -a backoff. - -See litmus test above for deciding between FAILED_PRECONDITION, -ABORTED, and UNAVAILABLE.', -'Grpc\STATUS_UNIMPLEMENTED' => 'Operation is not implemented or not supported/enabled in this service.', -'Grpc\STATUS_UNKNOWN' => 'Unknown error. An example of where this error may be returned is -if a Status value received from another address space belongs to -an error-space that is not known in this address space. Also -errors raised by APIs that do not return enough error information -may be converted to this error.', -'Grpc\WRITE_BUFFER_HINT' => 'Hint that the write may be buffered and need not go out on the wire -immediately. GRPC is free to buffer the message until the next non-buffered -write, or until writes_done, but it need not buffer completely or at all.', -'Grpc\WRITE_NO_COMPRESS' => 'Force compression to be disabled for a particular write -(start_write/add_metadata). Illegal on invoke/accept.', -'GSLC_SSL_NO_AUTH' => 'SSL Authentication Mode - No authentication required. (Only for Oracle LDAP)', -'GSLC_SSL_ONEWAY_AUTH' => 'SSL Authentication Mode - Only server authentication required. (Only for Oracle LDAP)', -'GSLC_SSL_TWOWAY_AUTH' => 'SSL Authentication Mode - Both server and client authentication required. (Only for Oracle LDAP)', -'HASH_HMAC' => 'Optional flag for `hash_init`. Indicates that the HMAC digest-keying algorithm should be applied to the current hashing context.', -'http\Client::DEBUG_BODY' => 'Debug callback\'s $data contains a body part.', -'http\Client::DEBUG_HEADER' => 'Debug callback\'s $data contains headers.', -'http\Client::DEBUG_IN' => 'Debug callback\'s $data contains data received.', -'http\Client::DEBUG_INFO' => 'Debug callback\'s $data contains human readable text.', -'http\Client::DEBUG_OUT' => 'Debug callback\'s $data contains data sent.', -'http\Client::DEBUG_SSL' => 'Debug callback\'s $data contains SSL data.', -'http\Client\Curl\AUTH_ANY' => 'Use any authentication.', -'http\Client\Curl\AUTH_BASIC' => 'Use Basic authentication.', -'http\Client\Curl\AUTH_DIGEST' => 'Use Digest authentication.', -'http\Client\Curl\AUTH_DIGEST_IE' => 'Use IE (lower v7) quirks with Digest authentication. Available if libcurl is v7.19.3 or more recent.', -'http\Client\Curl\AUTH_GSSNEG' => 'Use GSS-Negotiate authentication.', -'http\Client\Curl\AUTH_NTLM' => 'Use NTLM authentication.', -'http\Client\Curl\AUTH_SPNEGO' => 'Use HTTP Netgotiate authentication (SPNEGO, RFC4559). Available if libcurl is v7.38.0 or more recent.', -'http\Client\Curl\FEATURES' => 'Bitmask of available libcurl features. - See http\Client\Curl\Features namespace.', -'http\Client\Curl\Features\ASYNCHDNS' => 'Whether libcurl supports asynchronous domain name resolution.', -'http\Client\Curl\Features\GSSAPI' => 'Whether libcurl supports the Generic Security Services Application Program Interface. Available if libcurl is v7.38.0 or more recent.', -'http\Client\Curl\Features\GSSNEGOTIATE' => 'Whether libcurl supports HTTP Generic Security Services negotiation.', -'http\Client\Curl\Features\HTTP2' => 'Whether libcurl supports the HTTP/2 protocol. Available if libcurl is v7.33.0 or more recent.', -'http\Client\Curl\Features\IDN' => 'Whether libcurl supports international domain names.', -'http\Client\Curl\Features\IPV6' => 'Whether libcurl supports IPv6.', -'http\Client\Curl\Features\KERBEROS4' => 'Whether libcurl supports the old Kerberos protocol.', -'http\Client\Curl\Features\KERBEROS5' => 'Whether libcurl supports the more recent Kerberos v5 protocol. Available if libcurl is v7.40.0 or more recent.', -'http\Client\Curl\Features\LARGEFILE' => 'Whether libcurl supports large files.', -'http\Client\Curl\Features\LIBZ' => 'Whether libcurl supports gzip/deflate compression.', -'http\Client\Curl\Features\NTLM' => 'Whether libcurl supports the NT Lan Manager authentication.', -'http\Client\Curl\Features\NTLM_WB' => 'Whether libcurl supports NTLM delegation to a winbind helper. Available if libcurl is v7.22.0 or more recent.', -'http\Client\Curl\Features\PSL' => 'Whether libcurl supports the Public Suffix List for cookie host handling. Available if libcurl is v7.47.0 or more recent.', -'http\Client\Curl\Features\SPNEGO' => 'Whether libcurl supports the Simple and Protected GSSAPI Negotiation Mechanism.', -'http\Client\Curl\Features\SSL' => 'Whether libcurl supports SSL/TLS protocols.', -'http\Client\Curl\Features\SSPI' => 'Whether libcurl supports the Security Support Provider Interface.', -'http\Client\Curl\Features\TLSAUTH_SRP' => 'Whether libcurl supports TLS Secure Remote Password authentication. Available if libcurl is v7.21.4 or more recent.', -'http\Client\Curl\Features\UNIX_SOCKETS' => 'Whether libcurl supports connections to unix sockets. Available if libcurl is v7.40.0 or more recent.', -'http\Client\Curl\HTTP_VERSION_1_0' => 'Use HTTP/1.0 protocol version.', -'http\Client\Curl\HTTP_VERSION_1_1' => 'Use HTTP/1.1 protocol version.', -'http\Client\Curl\HTTP_VERSION_2_0' => 'Attempt to use HTTP/2 protocol version. Available if libcurl is v7.33.0 or more recent and was built with nghttp2 support.', -'http\Client\Curl\HTTP_VERSION_2TLS' => 'Attempt to use version 2 for HTTPS, version 1.1 for HTTP. Available if libcurl is v7.47.0 or more recent and was built with nghttp2 support.', -'http\Client\Curl\HTTP_VERSION_ANY' => 'Use any HTTP protocol version.', -'http\Client\Curl\IPRESOLVE_ANY' => 'Use any resolver.', -'http\Client\Curl\IPRESOLVE_V4' => 'Use IPv4 resolver.', -'http\Client\Curl\IPRESOLVE_V6' => 'Use IPv6 resolver.', -'http\Client\Curl\POSTREDIR_301' => 'Keep POSTing on 301 redirects. Available if libcurl is v7.19.1 or more recent.', -'http\Client\Curl\POSTREDIR_302' => 'Keep POSTing on 302 redirects. Available if libcurl is v7.19.1 or more recent.', -'http\Client\Curl\POSTREDIR_303' => 'Keep POSTing on 303 redirects. Available if libcurl is v7.19.1 or more recent.', -'http\Client\Curl\POSTREDIR_ALL' => 'Keep POSTing on any redirect. Available if libcurl is v7.19.1 or more recent.', -'http\Client\Curl\PROXY_HTTP' => 'Use HTTP/1.1 proxy protocol.', -'http\Client\Curl\PROXY_HTTP_1_0' => 'Use HTTP/1.0 proxy protocol. Available if libcurl is v7.19.4 or more recent.', -'http\Client\Curl\PROXY_SOCKS4' => 'Use SOCKSv4 proxy protocol.', -'http\Client\Curl\PROXY_SOCKS4A' => 'Use SOCKSv4a proxy protocol.', -'http\Client\Curl\PROXY_SOCKS5' => 'Use SOCKS5 proxy protoccol.', -'http\Client\Curl\PROXY_SOCKS5_HOSTNAME' => 'Use SOCKS5h proxy protocol.', -'http\Client\Curl\SSL_VERSION_ANY' => 'Use any encryption.', -'http\Client\Curl\SSL_VERSION_SSLv2' => 'Use SSL v2 encryption.', -'http\Client\Curl\SSL_VERSION_SSLv3' => 'Use SSL v3 encryption.', -'http\Client\Curl\SSL_VERSION_TLSv1' => 'Use any TLS v1 encryption.', -'http\Client\Curl\SSL_VERSION_TLSv1_0' => 'Use TLS v1.0 encryption.', -'http\Client\Curl\SSL_VERSION_TLSv1_1' => 'Use TLS v1.1 encryption.', -'http\Client\Curl\SSL_VERSION_TLSv1_2' => 'Use TLS v1.2 encryption.', -'http\Client\Curl\TLSAUTH_SRP' => 'Use TLS SRP authentication. Available if libcurl is v7.21.4 or more recent and was built with gnutls or openssl with TLS-SRP support.', -'http\Client\Curl\User::POLL_IN' => 'Poll for read readiness.', -'http\Client\Curl\User::POLL_INOUT' => 'Poll for read/write readiness.', -'http\Client\Curl\User::POLL_NONE' => 'No action.', -'http\Client\Curl\User::POLL_OUT' => 'Poll for write readiness.', -'http\Client\Curl\User::POLL_REMOVE' => 'Stop polling for activity on this descriptor.', -'http\Client\Curl\VERSIONS' => 'List of library versions of or linked into libcurl, - e.g. "libcurl/7.50.0 OpenSSL/1.0.2h zlib/1.2.8 libidn/1.32 nghttp2/1.12.0". - See http\Client\Curl\Versions namespace.', -'http\Client\Curl\Versions\ARES' => 'Version string of the c-ares library, e.g. "1.11.0".', -'http\Client\Curl\Versions\CURL' => 'Version string of libcurl, e.g. "7.50.0".', -'http\Client\Curl\Versions\IDN' => 'Version string of the IDN library, e.g. "1.32".', -'http\Client\Curl\Versions\LIBZ' => 'Version string of the zlib compression library, e.g. "1.2.8".', -'http\Client\Curl\Versions\SSL' => 'Version string of the SSL/TLS library, e.g. "OpenSSL/1.0.2h".', -'http\Client\Request::TYPE_NONE' => 'No specific type of message.', -'http\Client\Request::TYPE_REQUEST' => 'A request message.', -'http\Client\Request::TYPE_RESPONSE' => 'A response message.', -'http\Client\Response::TYPE_NONE' => 'No specific type of message.', -'http\Client\Response::TYPE_REQUEST' => 'A request message.', -'http\Client\Response::TYPE_RESPONSE' => 'A response message.', -'http\Cookie::HTTPONLY' => 'The cookies\' flags have the httpOnly attribute set.', -'http\Cookie::PARSE_RAW' => 'Do not decode cookie contents.', -'http\Cookie::SECURE' => 'The cookies\' flags have the secure attribute set.', -'http\Encoding\Stream::FLUSH_FULL' => 'Flush at each IO operation.', -'http\Encoding\Stream::FLUSH_NONE' => 'Do no intermittent flushes.', -'http\Encoding\Stream::FLUSH_SYNC' => 'Flush at appropriate transfer points.', -'http\Encoding\Stream\Debrotli::FLUSH_FULL' => 'Flush at each IO operation.', -'http\Encoding\Stream\Debrotli::FLUSH_NONE' => 'Do no intermittent flushes.', -'http\Encoding\Stream\Debrotli::FLUSH_SYNC' => 'Flush at appropriate transfer points.', -'http\Encoding\Stream\Dechunk::FLUSH_FULL' => 'Flush at each IO operation.', -'http\Encoding\Stream\Dechunk::FLUSH_NONE' => 'Do no intermittent flushes.', -'http\Encoding\Stream\Dechunk::FLUSH_SYNC' => 'Flush at appropriate transfer points.', -'http\Encoding\Stream\Deflate::FLUSH_FULL' => 'Flush at each IO operation.', -'http\Encoding\Stream\Deflate::FLUSH_NONE' => 'Do no intermittent flushes.', -'http\Encoding\Stream\Deflate::FLUSH_SYNC' => 'Flush at appropriate transfer points.', -'http\Encoding\Stream\Deflate::LEVEL_DEF' => 'Default compression level.', -'http\Encoding\Stream\Deflate::LEVEL_MAX' => 'Greatest compression level.', -'http\Encoding\Stream\Deflate::LEVEL_MIN' => 'Least compression level.', -'http\Encoding\Stream\Deflate::STRATEGY_DEF' => 'Default compression strategy.', -'http\Encoding\Stream\Deflate::STRATEGY_FILT' => 'Filtered compression strategy.', -'http\Encoding\Stream\Deflate::STRATEGY_FIXED' => 'Encoding with fixed Huffman codes only. - -> **A note on the compression strategy:** -> -> The strategy parameter is used to tune the compression algorithm. -> -> Use the value DEFAULT_STRATEGY for normal data, FILTERED for data produced by a filter (or predictor), HUFFMAN_ONLY to force Huffman encoding only (no string match), or RLE to limit match distances to one (run-length encoding). -> -> Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between DEFAULT_STRATEGY and HUFFMAN_ONLY. -> -> RLE is designed to be almost as fast as HUFFMAN_ONLY, but give better compression for PNG image data. -> -> FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. -> -> The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. -> ->_Source: [zlib Manual](http://www.zlib.net/manual.html)_', -'http\Encoding\Stream\Deflate::STRATEGY_HUFF' => 'Huffman strategy only.', -'http\Encoding\Stream\Deflate::STRATEGY_RLE' => 'Run-length encoding strategy.', -'http\Encoding\Stream\Deflate::TYPE_GZIP' => 'Gzip encoding. RFC1952', -'http\Encoding\Stream\Deflate::TYPE_RAW' => 'Deflate encoding. RFC1951', -'http\Encoding\Stream\Deflate::TYPE_ZLIB' => 'Zlib encoding. RFC1950', -'http\Encoding\Stream\Enbrotli::FLUSH_FULL' => 'Flush at each IO operation.', -'http\Encoding\Stream\Enbrotli::FLUSH_NONE' => 'Do no intermittent flushes.', -'http\Encoding\Stream\Enbrotli::FLUSH_SYNC' => 'Flush at appropriate transfer points.', -'http\Encoding\Stream\Enbrotli::LEVEL_DEF' => 'Default compression level.', -'http\Encoding\Stream\Enbrotli::LEVEL_MAX' => 'Greatest compression level.', -'http\Encoding\Stream\Enbrotli::LEVEL_MIN' => 'Least compression level.', -'http\Encoding\Stream\Enbrotli::MODE_FONT' => 'Compression mode used in WOFF 2.0.', -'http\Encoding\Stream\Enbrotli::MODE_GENERIC' => 'Default compression mode.', -'http\Encoding\Stream\Enbrotli::MODE_TEXT' => 'Compression mode for UTF-8 formatted text.', -'http\Encoding\Stream\Enbrotli::WBITS_DEF' => 'Default window bits.', -'http\Encoding\Stream\Enbrotli::WBITS_MAX' => 'Maximum window bits.', -'http\Encoding\Stream\Enbrotli::WBITS_MIN' => 'Minimum window bits.', -'http\Encoding\Stream\Inflate::FLUSH_FULL' => 'Flush at each IO operation.', -'http\Encoding\Stream\Inflate::FLUSH_NONE' => 'Do no intermittent flushes.', -'http\Encoding\Stream\Inflate::FLUSH_SYNC' => 'Flush at appropriate transfer points.', -'http\Env\Request::TYPE_NONE' => 'No specific type of message.', -'http\Env\Request::TYPE_REQUEST' => 'A request message.', -'http\Env\Request::TYPE_RESPONSE' => 'A response message.', -'http\Env\Response::CACHE_HIT' => 'The cache was hit.', -'http\Env\Response::CACHE_MISS' => 'The cache was missed.', -'http\Env\Response::CACHE_NO' => 'No caching info available.', -'http\Env\Response::CONTENT_ENCODING_GZIP' => 'Support "Accept-Encoding" requests with gzip and deflate encoding.', -'http\Env\Response::CONTENT_ENCODING_NONE' => 'Do not use content encoding.', -'http\Env\Response::TYPE_NONE' => 'No specific type of message.', -'http\Env\Response::TYPE_REQUEST' => 'A request message.', -'http\Env\Response::TYPE_RESPONSE' => 'A response message.', -'http\Header::MATCH_CASE' => 'Perform case sensitive matching.', -'http\Header::MATCH_FULL' => 'Match the complete string.', -'http\Header::MATCH_LOOSE' => 'None of the following match constraints applies.', -'http\Header::MATCH_STRICT' => 'Case sensitively match the full string (same as MATCH_CASE|MATCH_FULL).', -'http\Header::MATCH_WORD' => 'Match only on word boundaries (according by CType alpha-numeric).', -'http\Header\Parser::CLEANUP' => 'Finish up parser at end of (incomplete) input.', -'http\Header\Parser::STATE_DONE' => 'Finished parsing the headers. - -> ***NOTE:*** -> Most of this states won\'t be returned to the user, because the parser immediately jumps to the next expected state.', -'http\Header\Parser::STATE_FAILURE' => 'Parse failure.', -'http\Header\Parser::STATE_HEADER_DONE' => 'A header was completed.', -'http\Header\Parser::STATE_KEY' => 'Expecting a key or already parsing a key.', -'http\Header\Parser::STATE_START' => 'Expecting HTTP info (request/response line) or headers.', -'http\Header\Parser::STATE_VALUE' => 'Expecting a value or already parsing the value.', -'http\Header\Parser::STATE_VALUE_EX' => 'At EOL of an header, checking whether a folded header line follows.', -'http\Message::TYPE_NONE' => 'No specific type of message.', -'http\Message::TYPE_REQUEST' => 'A request message.', -'http\Message::TYPE_RESPONSE' => 'A response message.', -'http\Message\Parser::CLEANUP' => 'Finish up parser at end of (incomplete) input.', -'http\Message\Parser::DUMB_BODIES' => 'Soak up the rest of input if no entity length is deducible.', -'http\Message\Parser::EMPTY_REDIRECTS' => 'Redirect messages do not contain any body despite of indication of such.', -'http\Message\Parser::GREEDY' => 'Continue parsing while input is available.', -'http\Message\Parser::STATE_BODY' => 'Parsing the body.', -'http\Message\Parser::STATE_BODY_CHUNKED' => 'Parsing `chunked` encoded body.', -'http\Message\Parser::STATE_BODY_DONE' => 'Finished parsing the body.', -'http\Message\Parser::STATE_BODY_DUMB' => 'Soaking up all input as body.', -'http\Message\Parser::STATE_BODY_LENGTH' => 'Reading body as indicated by `Content-Length` or `Content-Range`.', -'http\Message\Parser::STATE_DONE' => 'Finished parsing the message. - -> ***NOTE:*** -> Most of this states won\'t be returned to the user, because the parser immediately jumps to the next expected state.', -'http\Message\Parser::STATE_FAILURE' => 'Parse failure.', -'http\Message\Parser::STATE_HEADER' => 'Parsing headers.', -'http\Message\Parser::STATE_HEADER_DONE' => 'Completed parsing headers.', -'http\Message\Parser::STATE_START' => 'Expecting HTTP info (request/response line) or headers.', -'http\Message\Parser::STATE_UPDATE_CL' => 'Updating Content-Length based on body size.', -'http\Params::COOKIE_PARAM_SEP' => 'Empty param separator to parse cookies.', -'http\Params::DEF_ARG_SEP' => 'The default argument separator (";").', -'http\Params::DEF_PARAM_SEP' => 'The default parameter separator (",").', -'http\Params::DEF_VAL_SEP' => 'The default value separator ("=").', -'http\Params::PARSE_DEFAULT' => 'Interpret input as default formatted parameters.', -'http\Params::PARSE_DIMENSION' => 'Parse sub dimensions indicated by square brackets.', -'http\Params::PARSE_ESCAPED' => 'Parse backslash escaped (quoted) strings.', -'http\Params::PARSE_QUERY' => 'Parse URL querystring (same as http\Params::PARSE_URLENCODED|http\Params::PARSE_DIMENSION).', -'http\Params::PARSE_RAW' => 'Do not interpret the parsed parameters.', -'http\Params::PARSE_RFC5987' => 'Parse [RFC5987](http://tools.ietf.org/html/rfc5987) style encoded character set and language information embedded in HTTP header params.', -'http\Params::PARSE_RFC5988' => 'Parse [RFC5988](http://tools.ietf.org/html/rfc5988) (Web Linking) tags of Link headers.', -'http\Params::PARSE_URLENCODED' => 'Urldecode single units of parameters, arguments and values.', -'http\QueryString::TYPE_ARRAY' => 'Cast requested value to an array.', -'http\QueryString::TYPE_BOOL' => 'Cast requested value to bool.', -'http\QueryString::TYPE_FLOAT' => 'Cast requested value to float.', -'http\QueryString::TYPE_INT' => 'Cast requested value to int.', -'http\QueryString::TYPE_OBJECT' => 'Cast requested value to an object.', -'http\QueryString::TYPE_STRING' => 'Cast requested value to string.', -'http\Url::FROM_ENV' => 'Import initial URL parts from the SAPI environment.', -'http\Url::IGNORE_ERRORS' => 'Continue parsing when encountering errors.', -'http\Url::JOIN_PATH' => 'Whether a relative path should be joined into the old path.', -'http\Url::JOIN_QUERY' => 'Whether the querystrings should be joined.', -'http\Url::PARSE_MBLOC' => 'Parse locale encoded multibyte sequences (on systems with wide character support).', -'http\Url::PARSE_MBUTF8' => 'Parse UTF-8 encoded multibyte sequences.', -'http\Url::PARSE_TOIDN' => 'Parse and convert multibyte hostnames according to IDNA (with IDNA support).', -'http\Url::PARSE_TOIDN_2003' => 'Explicitly request IDNA2003 implementation if available (libidn, idnkit or ICU).', -'http\Url::PARSE_TOIDN_2008' => 'Explicitly request IDNA2008 implementation if available (libidn2, idnkit2 or ICU).', -'http\Url::PARSE_TOPCT' => 'Percent encode multibyte sequences in the userinfo, path, query and fragment parts of the URL.', -'http\Url::REPLACE' => 'Replace parts of the old URL with parts of the new.', -'http\Url::SANITIZE_PATH' => 'Whether to sanitize the URL path (consolidate double slashes, directory jumps etc.)', -'http\Url::SILENT_ERRORS' => 'Suppress errors/exceptions.', -'http\Url::STDFLAGS' => 'Standard flags used by default internally for e.g. http\Message::setRequestUrl(). - Enables joining path and query, sanitizing path, multibyte/unicode, international domain names and transient percent encoding.', -'http\Url::STRIP_ALL' => 'Strip everything except scheme and host information.', -'http\Url::STRIP_AUTH' => 'Strip user and password information from URL (same as STRIP_USER|STRIP_PASS).', -'http\Url::STRIP_FRAGMENT' => 'Strip the fragment (hash) from the URL.', -'http\Url::STRIP_PASS' => 'Strip the password from the URL.', -'http\Url::STRIP_PATH' => 'Do not include the URL path.', -'http\Url::STRIP_PORT' => 'Do not include the port.', -'http\Url::STRIP_QUERY' => 'Do not include the URL querystring.', -'http\Url::STRIP_USER' => 'Strip the user information from the URL.', -'IBASE_BKP_CONVERT' => 'Options to `ibase_backup`', -'IBASE_RES_USE_ALL_SPACE' => 'Options to `ibase_restore`', -'IBASE_RPR_SWEEP_DB' => 'Options to `ibase_maintain_db`', -'IBASE_STS_SYS_RELATIONS' => 'Options to `ibase_db_info`', -'IBASE_SVC_GET_USERS' => 'Options to `ibase_server_info`', -'ID3_BEST' => '`ID3_BEST` is used if would like to let the id3 functions determine which tag version should be used.', -'ID3_V1_0' => '`ID3_V1_0` is used if you are working with ID3 V1.0 tags. These tags may contain the fields title, artist, album, genre, year and comment.', -'ID3_V1_1' => '`ID3_V1_1` is used if you are working with ID3 V1.1 tags. These tags may all information contained in v1.0 tags plus the track number.', -'ID3_V2_1' => '`ID3_V2_1` is used if you are working with ID3 V2.1 tags.', -'ID3_V2_2' => '`ID3_V2_2` is used if you are working with ID3 V2.2 tags.', -'ID3_V2_3' => '`ID3_V2_3` is used if you are working with ID3 V2.3 tags.', -'ID3_V2_4' => '`ID3_V2_4` is used if you are working with ID3 V2.4 tags.', -'IDNA_ALLOW_UNASSIGNED' => 'Allow processing of unassigned codepoints in the input for IDN functions.', -'IDNA_CHECK_BIDI' => 'Check whether the input conforms to the BiDi rules. Ignored by the IDNA2003 implementation, which always performs this check.', -'IDNA_CHECK_CONTEXTJ' => 'Check whether the input conforms to the CONTEXTJ rules. Ignored by the IDNA2003 implementation, as this check is new in IDNA2008.', -'IDNA_DEFAULT' => 'Prohibit processing of unassigned codepoints in the input for IDN functions and do not check if the input conforms to domain name ASCII rules.', -'IDNA_ERROR_EMPTY_LABEL' => 'Errors reported in a bitset returned by the UTS #46 algorithm in `idn_to_utf8` and `idn_to_ascii`.', -'IDNA_NONTRANSITIONAL_TO_ASCII' => 'Option for nontransitional processing in `idn_to_ascii`. Transitional processing is activated by default. This option is ignored by the IDNA2003 implementation.', -'IDNA_NONTRANSITIONAL_TO_UNICODE' => 'Option for nontransitional processing in `idn_to_utf8`. Transitional processing is activated by default. This option is ignored by the IDNA2003 implementation.', -'IDNA_USE_STD3_RULES' => 'Check if the input for IDN functions conforms to domain name ASCII rules.', -'ILL_BADSTK' => 'Available since PHP 5.3.0.', -'ILL_COPROC' => 'Available since PHP 5.3.0.', -'ILL_ILLADR' => 'Available since PHP 5.3.0.', -'ILL_ILLOPC' => 'Available since PHP 5.3.0.', -'ILL_ILLOPN' => 'Available since PHP 5.3.0.', -'ILL_ILLTRP' => 'Available since PHP 5.3.0.', -'ILL_PRVOPC' => 'Available since PHP 5.3.0.', -'ILL_PRVREG' => 'Available since PHP 5.3.0.', -'IMAGETYPE_ICO' => '(Available as of PHP 5.3.0)', -'IMAGETYPE_WEBP' => '(Available as of PHP 7.1.0)', -'imagick::ALPHACHANNEL_ACTIVATE' => '`imagick.constant.available` 6.3.8 or higher.', -'imagick::ALPHACHANNEL_COPY' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::ALPHACHANNEL_DEACTIVATE' => '`imagick.constant.available` 6.3.8 or higher.', -'imagick::ALPHACHANNEL_EXTRACT' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::ALPHACHANNEL_OPAQUE' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::ALPHACHANNEL_RESET' => '`imagick.constant.available` 6.3.8 or higher.', -'imagick::ALPHACHANNEL_SET' => '`imagick.constant.available` 6.3.8 or higher.', -'imagick::ALPHACHANNEL_SHAPE' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::ALPHACHANNEL_TRANSPARENT' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::ALPHACHANNEL_UNDEFINED' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::COLOR_ALPHA' => 'Color\'s alpha', -'imagick::COLOR_BLACK' => 'Black color', -'imagick::COLOR_BLUE' => 'Blue color', -'imagick::COLOR_CYAN' => 'Cyan color', -'imagick::COLOR_FUZZ' => 'Color\'s fuzz', -'imagick::COLOR_GREEN' => 'Green color', -'imagick::COLOR_MAGENTA' => 'Magenta color', -'imagick::COLOR_OPACITY' => 'Color\'s opacity', -'imagick::COLOR_RED' => 'Red color', -'imagick::COLOR_YELLOW' => 'Yellow color', -'imagick::COLORSPACE_CMY' => '`imagick.constant.available` 6.4.2 or higher.', -'imagick::COMPOSITE_ADD' => 'The result of image + image', -'imagick::COMPOSITE_ATOP' => 'The result is the same shape as image, with composite image obscuring image where the image shapes overlap', -'imagick::COMPOSITE_BLEND' => 'Blends the image', -'imagick::COMPOSITE_BUMPMAP' => 'The same as COMPOSITE_MULTIPLY, except the source is converted to grayscale first.', -'imagick::COMPOSITE_CLEAR' => 'Makes the target image transparent', -'imagick::COMPOSITE_COLORBURN' => 'Darkens the destination image to reflect the source image', -'imagick::COMPOSITE_COLORDODGE' => 'Brightens the destination image to reflect the source image', -'imagick::COMPOSITE_COLORIZE' => 'Colorizes the target image using the composite image', -'imagick::COMPOSITE_COPY' => 'Copies the source image on the target image', -'imagick::COMPOSITE_COPYBLACK' => 'Copies black from the source to target', -'imagick::COMPOSITE_COPYBLUE' => 'Copies blue from the source to target', -'imagick::COMPOSITE_COPYCYAN' => 'Copies cyan from the source to target', -'imagick::COMPOSITE_COPYGREEN' => 'Copies green from the source to target', -'imagick::COMPOSITE_COPYMAGENTA' => 'Copies magenta from the source to target', -'imagick::COMPOSITE_COPYOPACITY' => 'Copies opacity from the source to target', -'imagick::COMPOSITE_COPYRED' => 'Copies red from the source to target', -'imagick::COMPOSITE_COPYYELLOW' => 'Copies yellow from the source to target', -'imagick::COMPOSITE_DARKEN' => 'Darkens the target image', -'imagick::COMPOSITE_DEFAULT' => 'The default composite operator', -'imagick::COMPOSITE_DIFFERENCE' => 'Subtracts the darker of the two constituent colors from the lighter', -'imagick::COMPOSITE_DISPLACE' => 'Shifts target image pixels as defined by the source', -'imagick::COMPOSITE_DISSOLVE' => 'Dissolves the source in to the target', -'imagick::COMPOSITE_DST' => 'The target is left untouched', -'imagick::COMPOSITE_DSTATOP' => 'The part of the destination lying inside of the source is composited over the source and replaces the destination', -'imagick::COMPOSITE_DSTIN' => 'The parts inside the source replace the target', -'imagick::COMPOSITE_DSTOUT' => 'The parts outside the source replace the target', -'imagick::COMPOSITE_DSTOVER' => 'Target replaces the source', -'imagick::COMPOSITE_EXCLUSION' => 'Produces an effect similar to that of imagick::COMPOSITE_DIFFERENCE, but appears as lower contrast', -'imagick::COMPOSITE_HARDLIGHT' => 'Multiplies or screens the colors, dependent on the source color value', -'imagick::COMPOSITE_HUE' => 'Modifies the hue of the target as defined by source', -'imagick::COMPOSITE_IN' => 'Composites source into the target', -'imagick::COMPOSITE_LIGHTEN' => 'Lightens the target as defined by source', -'imagick::COMPOSITE_LUMINIZE' => 'Luminizes the target as defined by source', -'imagick::COMPOSITE_MINUS' => 'Subtracts the source from the target', -'imagick::COMPOSITE_MODULATE' => 'Modulates the target brightness, saturation and hue as defined by source', -'imagick::COMPOSITE_MULTIPLY' => 'Multiplies the target to the source', -'imagick::COMPOSITE_NO' => 'No composite operator defined', -'imagick::COMPOSITE_OUT' => 'Composites outer parts of the source on the target', -'imagick::COMPOSITE_OVER' => 'Composites source over the target', -'imagick::COMPOSITE_OVERLAY' => 'Overlays the source on the target', -'imagick::COMPOSITE_PLUS' => 'Adds the source to the target', -'imagick::COMPOSITE_REPLACE' => 'Replaces the target with the source', -'imagick::COMPOSITE_SATURATE' => 'Saturates the target as defined by the source', -'imagick::COMPOSITE_SCREEN' => 'The source and destination are complemented and then multiplied and then replace the destination', -'imagick::COMPOSITE_SOFTLIGHT' => 'Darkens or lightens the colors, dependent on the source', -'imagick::COMPOSITE_SRC' => 'The source is copied to the destination', -'imagick::COMPOSITE_SRCATOP' => 'The part of the source lying inside of the destination is composited onto the destination', -'imagick::COMPOSITE_SRCIN' => 'The part of the source lying inside of the destination replaces the destination', -'imagick::COMPOSITE_SRCOUT' => 'The part of the source lying outside of the destination replaces the destination', -'imagick::COMPOSITE_SRCOVER' => 'The source replaces the destination', -'imagick::COMPOSITE_SUBTRACT' => 'Subtract the colors in the source image from the destination image', -'imagick::COMPOSITE_THRESHOLD' => 'The source is composited on the target as defined by source threshold', -'imagick::COMPOSITE_UNDEFINED' => 'Undefined composite operator', -'imagick::COMPOSITE_XOR' => 'The part of the source that lies outside of the destination is combined with the part of the destination that lies outside of the source', -'imagick::COMPRESSION_DXT1' => '`imagick.constant.available` 6.4.0 or higher.', -'imagick::COMPRESSION_DXT3' => '`imagick.constant.available` 6.4.0 or higher.', -'imagick::COMPRESSION_DXT5' => '`imagick.constant.available` 6.4.0 or higher.', -'imagick::DISPOSE_BACKGROUND' => 'Dispose background', -'imagick::DISPOSE_NONE' => 'No dispose type defined', -'imagick::DISPOSE_PREVIOUS' => 'Dispose previous', -'imagick::DISPOSE_UNDEFINED' => 'Undefined dispose type', -'imagick::DISPOSE_UNRECOGNIZED' => 'Unrecognized dispose type', -'imagick::DISTORTION_AFFINE' => '`imagick.constant.available` 6.3.6 or higher.', -'imagick::DISTORTION_AFFINEPROJECTION' => '`imagick.constant.available` 6.3.6 or higher.', -'imagick::DISTORTION_ARC' => '`imagick.constant.available` 6.3.6 or higher.', -'imagick::DISTORTION_BARREL' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::DISTORTION_BARRELINVERSE' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::DISTORTION_BILINEAR' => '`imagick.constant.available` 6.3.6 or higher.', -'imagick::DISTORTION_DEPOLAR' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::DISTORTION_PERSPECTIVE' => '`imagick.constant.available` 6.3.6 or higher.', -'imagick::DISTORTION_PERSPECTIVEPROJECTION' => '`imagick.constant.available` 6.3.6 or higher.', -'imagick::DISTORTION_POLAR' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::DISTORTION_POLYNOMIAL' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::DISTORTION_SCALEROTATETRANSLATE' => '`imagick.constant.available` 6.3.6 or higher.', -'imagick::DISTORTION_SENTINEL' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::DISTORTION_SHEPARDS' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::DISTORTION_UNDEFINED' => '`imagick.constant.available` 6.3.6 or higher.', -'imagick::DITHERMETHOD_FLOYDSTEINBERG' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::DITHERMETHOD_NO' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::DITHERMETHOD_RIEMERSMA' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::DITHERMETHOD_UNDEFINED' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::EVALUATE_ADDMODULUS' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_COSINE' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_GAUSSIANNOISE' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_IMPULSENOISE' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_LAPLACIANNOISE' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_LOG' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_MULTIPLICATIVENOISE' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_POISSONNOISE' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_POW' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_SINE' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_THRESHOLD' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_THRESHOLDBLACK' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_THRESHOLDWHITE' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::EVALUATE_UNIFORMNOISE' => '`imagick.constant.available` 6.4.4 or higher.', -'imagick::FUNCTION_POLYNOMIAL' => '`imagick.constant.available` 6.4.9 or higher.', -'imagick::FUNCTION_SINUSOID' => '`imagick.constant.available` 6.4.9 or higher.', -'imagick::FUNCTION_UNDEFINED' => '`imagick.constant.available` 6.4.9 or higher.', -'imagick::INTERLACE_GIF' => '`imagick.constant.available` 6.3.4 or higher.', -'imagick::INTERPOLATE_AVERAGE' => '`imagick.constant.available` 6.3.2 or higher.', -'imagick::INTERPOLATE_BICUBIC' => '`imagick.constant.available` 6.3.2 or higher.', -'imagick::INTERPOLATE_BILINEAR' => '`imagick.constant.available` 6.3.2 or higher.', -'imagick::INTERPOLATE_FILTER' => '`imagick.constant.available` 6.3.2 or higher.', -'imagick::INTERPOLATE_INTEGER' => '`imagick.constant.available` 6.3.2 or higher.', -'imagick::INTERPOLATE_MESH' => '`imagick.constant.available` 6.3.2 or higher.', -'imagick::INTERPOLATE_NEARESTNEIGHBOR' => '`imagick.constant.available` 6.3.2 or higher.', -'imagick::INTERPOLATE_SPLINE' => '`imagick.constant.available` 6.3.4 or higher.', -'imagick::INTERPOLATE_UNDEFINED' => '`imagick.constant.available` 6.3.2 or higher.', -'imagick::LAYERMETHOD_COALESCE' => '`imagick.constant.available` 6.2.9 or higher.', -'imagick::LAYERMETHOD_COMPAREANY' => '`imagick.constant.available` 6.2.9 or higher.', -'imagick::LAYERMETHOD_COMPARECLEAR' => '`imagick.constant.available` 6.2.9 or higher.', -'imagick::LAYERMETHOD_COMPAREOVERLAY' => '`imagick.constant.available` 6.2.9 or higher.', -'imagick::LAYERMETHOD_COMPOSITE' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::LAYERMETHOD_DISPOSE' => '`imagick.constant.available` 6.2.9 or higher.', -'imagick::LAYERMETHOD_FLATTEN' => '`imagick.constant.available` 6.3.7 or higher.', -'imagick::LAYERMETHOD_MERGE' => '`imagick.constant.available` 6.3.7 or higher.', -'imagick::LAYERMETHOD_MOSAIC' => '`imagick.constant.available` 6.3.7 or higher.', -'imagick::LAYERMETHOD_OPTIMIZE' => '`imagick.constant.available` 6.2.9 or higher.', -'imagick::LAYERMETHOD_OPTIMIZEIMAGE' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::LAYERMETHOD_OPTIMIZEPLUS' => '`imagick.constant.available` 6.2.9 or higher.', -'imagick::LAYERMETHOD_OPTIMIZETRANS' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::LAYERMETHOD_REMOVEDUPS' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::LAYERMETHOD_REMOVEZERO' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::LAYERMETHOD_UNDEFINED' => '`imagick.constant.available` 6.2.9 or higher.', -'imagick::NOISE_RANDOM' => '`imagick.constant.available` 6.3.6 or higher.', -'imagick::ORIENTATION_BOTTOMLEFT' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::ORIENTATION_BOTTOMRIGHT' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::ORIENTATION_LEFTBOTTOM' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::ORIENTATION_LEFTTOP' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::ORIENTATION_RIGHTBOTTOM' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::ORIENTATION_RIGHTTOP' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::ORIENTATION_TOPLEFT' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::ORIENTATION_TOPRIGHT' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::ORIENTATION_UNDEFINED' => '`imagick.constant.available` 6.3.0 or higher.', -'imagick::RESOURCETYPE_AREA' => 'Set the maximum width * height of an image that can reside in the pixel cache memory.', -'imagick::RESOURCETYPE_DISK' => 'Set maximum amount of disk space in bytes permitted for use by the pixel cache.', -'imagick::RESOURCETYPE_FILE' => 'Set maximum number of open pixel cache files.', -'imagick::RESOURCETYPE_MAP' => 'Set maximum amount of memory map in bytes to allocate for the pixel cache.', -'imagick::RESOURCETYPE_MEMORY' => 'Set maximum amount of memory in bytes to allocate for the pixel cache from the heap.', -'imagick::RESOURCETYPE_THREAD' => 'Set maximum parallel threads. `imagick.constant.available` 6.7.8 or higher.', -'imagick::SPARSECOLORMETHOD_BARYCENTRIC' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::SPARSECOLORMETHOD_BILINEAR' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::SPARSECOLORMETHOD_POLYNOMIAL' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::SPARSECOLORMETHOD_SPEPARDS' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::SPARSECOLORMETHOD_UNDEFINED' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::SPARSECOLORMETHOD_VORONOI' => '`imagick.constant.available` 6.4.6 or higher.', -'imagick::VIRTUALPIXELMETHOD_BLACK' => '`imagick.constant.available` 6.4.2 or higher.', -'imagick::VIRTUALPIXELMETHOD_GRAY' => '`imagick.constant.available` 6.4.2 or higher.', -'imagick::VIRTUALPIXELMETHOD_HORIZONTALTILE' => '`imagick.constant.available` 6.4.3 or higher.', -'imagick::VIRTUALPIXELMETHOD_MASK' => '`imagick.constant.available` 6.4.2 or higher.', -'imagick::VIRTUALPIXELMETHOD_VERTICALTILE' => '`imagick.constant.available` 6.4.3 or higher.', -'imagick::VIRTUALPIXELMETHOD_WHITE' => '`imagick.constant.available` 6.4.2 or higher.', -'IMAP_GC_ELT' => 'Garbage collector, clear message cache elements.', -'IMAP_GC_ENV' => 'Garbage collector, clear envelopes and bodies.', -'IMAP_GC_TEXTS' => 'Garbage collector, clear texts.', -'IMG_FILTER_PIXELATE' => '(Available as of PHP 5.3.0)', -'IMG_WEBP' => 'Available as of PHP 5.6.25 and PHP 7.0.10, respectively.', -'IN_ACCESS' => 'File was accessed (read) (*)', -'IN_ALL_EVENTS' => 'Bitmask of all the above constants', -'IN_ATTRIB' => 'Metadata changed (e.g. permissions, mtime, etc.) (*)', -'IN_CLOSE' => 'Equals to IN_CLOSE_WRITE | IN_CLOSE_NOWRITE', -'IN_CLOSE_NOWRITE' => 'File not opened for writing was closed (*)', -'IN_CLOSE_WRITE' => 'File opened for writing was closed (*)', -'IN_CREATE' => 'File or directory created in watched directory (*)', -'IN_DELETE' => 'File or directory deleted in watched directory (*)', -'IN_DELETE_SELF' => 'Watched file or directory was deleted', -'IN_DONT_FOLLOW' => 'Do not dereference pathname if it is a symlink (Since Linux 2.6.15)', -'IN_IGNORED' => 'Watch was removed (explicitly by `inotify_rm_watch` or because file was removed or filesystem unmounted', -'IN_ISDIR' => 'Subject of this event is a directory', -'IN_MASK_ADD' => 'Add events to watch mask for this pathname if it already exists (instead of replacing mask).', -'IN_MODIFY' => 'File was modified (*)', -'IN_MOVE' => 'Equals to IN_MOVED_FROM | IN_MOVED_TO', -'IN_MOVE_SELF' => 'Watch file or directory was moved', -'IN_MOVED_FROM' => 'File moved out of watched directory (*)', -'IN_MOVED_TO' => 'File moved into watched directory (*)', -'IN_ONESHOT' => 'Monitor pathname for one event, then remove from watch list.', -'IN_ONLYDIR' => 'Only watch pathname if it is a directory (Since Linux 2.6.15)', -'IN_OPEN' => 'File was opened (*)', -'IN_Q_OVERFLOW' => 'Event queue overflowed (wd is -1 for this event)', -'IN_UNMOUNT' => 'File system containing watched object was unmounted', -'INGRES_API_VERSION' => 'Specifies the version of Ingres OpenAPI that the extension was built against. Available since version 1.2.0 of the PECL extension.', -'INGRES_ASSOC' => 'Columns are returned into the array having the fieldname as the array index. Used with `ingres_fetch_array`.', -'INGRES_BOTH' => 'Columns are returned into the array having both a numerical index and the fieldname as the array index. Used with `ingres_fetch_array`.', -'INGRES_CURSOR_READONLY' => 'Specifies that Ingres cursors should be opened in "readonly" mode. Available since version 1.2.0 of the PECL extension. Used with ingres.cursor_mode.', -'INGRES_CURSOR_UPDATE' => 'Specifies that Ingres cursors should be opened "for update." Available since version 1.2.0 of the PECL extension. Used with ingres.cursor_mode.', -'INGRES_DATE_DMY' => 'Equivalent to the II_DATE_FORMAT setting of DMY. Available since version 1.2.0 of the PECL extension. Used with `ingres_connect`, `ingres_pconnect` and `ingres_set_environment`. See options in `ingres_set_environment`.', -'INGRES_DATE_FINNISH' => 'Equivalent to the II_DATE_FORMAT setting of FINNISH. Available since version 1.2.0 of the PECL extension. Used with `ingres_connect`, `ingres_pconnect` and `ingres_set_environment`. See options in `ingres_set_environment`.', -'INGRES_DATE_GERMAN' => 'Equivalent to the II_DATE_FORMAT setting of GERMAN. Available since version 1.2.0 of the PECL extension. Used with `ingres_connect`, `ingres_pconnect` and `ingres_set_environment`. See options in `ingres_set_environment`.', -'INGRES_DATE_ISO' => 'Equivalent to the II_DATE_FORMAT setting of ISO. Available since version 1.2.0 of the PECL extension. Used with `ingres_connect`, `ingres_pconnect` and `ingres_set_environment`. See options in `ingres_set_environment`.', -'INGRES_DATE_ISO4' => 'Equivalent to the II_DATE_FORMAT setting of ISO4. Available since version 1.2.0 of the PECL extension. Used with `ingres_connect`, `ingres_pconnect` and `ingres_set_environment`. See options in `ingres_set_environment`.', -'INGRES_DATE_MDY' => 'Equivalent to the II_DATE_FORMAT setting of MDY. Available since version 1.2.0 of the PECL extension. Used with `ingres_connect`, `ingres_pconnect` and `ingres_set_environment`. See options in `ingres_set_environment`.', -'INGRES_DATE_MULTINATIONAL' => 'Equivalent to the II_DATE_FORMAT setting of MULTINATIONAL. Available since version 1.2.0 of the PECL extension. Used with `ingres_connect`, `ingres_pconnect` and `ingres_set_environment`. See options in `ingres_set_environment`.', -'INGRES_DATE_MULTINATIONAL4' => 'Equivalent to the II_DATE_FORMAT setting of MULTINATIONAL4. Available since version 1.2.0 of the PECL extension. Used with `ingres_connect`, `ingres_pconnect` and `ingres_set_environment`. See options in `ingres_set_environment`.', -'INGRES_DATE_YMD' => 'Equivalent to the II_DATE_FORMAT setting of YMD. Available since version 1.2.0 of the PECL extension. Used with `ingres_connect`, `ingres_pconnect` and `ingres_set_environment`. See options in `ingres_set_environment`.', -'INGRES_EXT_VERSION' => 'Specifies the version of the Ingres Extension. Available since version 1.2.0 of the PECL extension.', -'INGRES_MONEY_LEADING' => 'Specifies the currency character that should be placed at the start of a money value. Equivalent to setting II_MONEY_FORMAT to "L:". Available since version 1.2.0 of the PECL extension. Used with `ingres_connect`, `ingres_pconnect` and `ingres_set_environment`. See options in `ingres_set_environment`.', -'INGRES_MONEY_TRAILING' => 'Specifies the currency character that should be placed at the end of a money value. Equivalent to setting II_MONEY_FORMAT to "T:". Available since version 1.2.0 of the PECL extension. Used with `ingres_connect`, `ingres_pconnect` and `ingres_set_environment`. See options in `ingres_set_environment`.', -'INGRES_NUM' => 'Columns are returned into the array having a numerical index to the fields. By default this index starts at 1, the first field in the result. To change this value, see ingres.array_index_start. Used with `ingres_fetch_array`.', -'INGRES_STRUCTURE_BTREE' => 'Specifies the default table or index structure to BTREE when used in combination with the options or index_structure option when connecting. Available since version 1.4.0 of the PECL extension. Used with `ingres_connect` and `ingres_pconnect`. See options in `ingres_connect`.', -'INGRES_STRUCTURE_CBTREE' => 'Specifies the default table or index structure to COMPRESSED BTREE when used in combination with the options or index_structure option when connecting. Available since version 1.4.0 of the PECL extension. Used with `ingres_connect` and `ingres_pconnect`. See options in `ingres_connect`.', -'INGRES_STRUCTURE_CHASH' => 'Specifies the default table or index structure to COMPRESSED HASH when used in combination with the options or index_structure option when connecting. Available since version 1.4.0 of the PECL extension. Used with `ingres_connect` and `ingres_pconnect`. See options in `ingres_connect`.', -'INGRES_STRUCTURE_CHEAP' => 'Specifies the default table structure to COMPRESSED HEAP when used in combination with the options option when connecting. Available since version 1.4.0 of the PECL extension. Used with `ingres_connect` and `ingres_pconnect`. See options in `ingres_connect`.', -'INGRES_STRUCTURE_CISAM' => 'Specifies the default table or index structure to COMPRESSED ISAM when used in combination with the options or index_structure option when connecting. Available since version 1.4.0 of the PECL extension. Used with `ingres_connect` and `ingres_pconnect`. See options in `ingres_connect`.', -'INGRES_STRUCTURE_HASH' => 'Specifies the default table or index structure to HASH when used in combination with the options or index_structure option when connecting. Available since version 1.4.0 of the PECL extension. Used with `ingres_connect` and `ingres_pconnect`. See options in `ingres_connect`.', -'INGRES_STRUCTURE_HEAP' => 'Specifies the default table structure to HEAP when used in combination with the options option when connecting. Available since version 1.4.0 of the PECL extension. Used with `ingres_connect` and `ingres_pconnect`. See options in `ingres_connect`.', -'INGRES_STRUCTURE_ISAM' => 'Specifies the default table or index structure to ISAM when used in combination with the options or index_structure option when connecting. Available since version 1.4.0 of the PECL extension. Used with `ingres_connect` and `ingres_pconnect`. See options in `ingres_connect`.', -'INI_SCANNER_NORMAL' => 'Normal INI scanner mode (since PHP 5.3).', -'INI_SCANNER_RAW' => 'Raw INI scanner mode (since PHP 5.3).', -'INI_SCANNER_TYPED' => 'Typed INI scanner mode (since PHP 5.6.1).', -'INPUT_COOKIE' => 'COOKIE variables.', -'INPUT_ENV' => 'ENV variables.', -'INPUT_GET' => 'GET variables.', -'INPUT_POST' => 'POST variables.', -'INPUT_REQUEST' => 'REQUEST variables. (not implemented yet)', -'INPUT_SERVER' => 'SERVER variables.', -'INPUT_SESSION' => 'SESSION variables. (not implemented yet)', -'INTL_IDNA_VARIANT_2003' => 'Use IDNA 2003 algorithm in `idn_to_utf8` and `idn_to_ascii`. This is the default. This constant and using the default has been deprecated as of PHP 7.2.0.', -'INTL_IDNA_VARIANT_UTS46' => 'Use UTS #46 algorithm in `idn_to_utf8` and `idn_to_ascii`. Available as of ICU 4.6.', -'INTL_MAX_LOCALE_LEN' => 'Limit on locale length, set to 80 in PHP code. Locale names longer than this limit will not be accepted.', -'JSON_BIGINT_AS_STRING' => 'Decodes large integers as their original string value. Available since PHP 5.4.0.', -'JSON_ERROR_CTRL_CHAR' => 'Control character error, possibly incorrectly encoded. Available since PHP 5.3.0.', -'JSON_ERROR_DEPTH' => 'The maximum stack depth has been exceeded. Available since PHP 5.3.0.', -'JSON_ERROR_INF_OR_NAN' => 'The value passed to `json_encode` includes either `NAN` or `INF`. If the `JSON_PARTIAL_OUTPUT_ON_ERROR` option was given, `0` will be encoded in the place of these special numbers. Available since PHP 5.5.0.', -'JSON_ERROR_INVALID_PROPERTY_NAME' => 'A key starting with \u0000 character was in the string passed to `json_decode` when decoding a JSON object into a PHP object. Available since PHP 7.0.0.', -'JSON_ERROR_NONE' => 'No error has occurred. Available since PHP 5.3.0.', -'JSON_ERROR_RECURSION' => 'The object or array passed to `json_encode` include recursive references and cannot be encoded. If the `JSON_PARTIAL_OUTPUT_ON_ERROR` option was given, `null` will be encoded in the place of the recursive reference. Available since PHP 5.5.0.', -'JSON_ERROR_STATE_MISMATCH' => 'Occurs with underflow or with the modes mismatch. Available since PHP 5.3.0.', -'JSON_ERROR_SYNTAX' => 'Syntax error. Available since PHP 5.3.0.', -'JSON_ERROR_UNSUPPORTED_TYPE' => 'A value of an unsupported type was given to `json_encode`, such as a `resource`. If the `JSON_PARTIAL_OUTPUT_ON_ERROR` option was given, `null` will be encoded in the place of the unsupported value. Available since PHP 5.5.0.', -'JSON_ERROR_UTF16' => 'Single unpaired UTF-16 surrogate in unicode escape contained in the JSON string passed to `json_encode`. Available since PHP 7.0.0.', -'JSON_ERROR_UTF8' => 'Malformed UTF-8 characters, possibly incorrectly encoded. Available since PHP 5.3.3.', -'JSON_FORCE_OBJECT' => 'Outputs an object rather than an array when a non-associative array is used. Especially useful when the recipient of the output is expecting an object and the array is empty. Available since PHP 5.3.0.', -'JSON_HEX_AMP' => 'All &s are converted to \u0026. Available since PHP 5.3.0.', -'JSON_HEX_APOS' => 'All \' are converted to \u0027. Available since PHP 5.3.0.', -'JSON_HEX_QUOT' => 'All " are converted to \u0022. Available since PHP 5.3.0.', -'JSON_HEX_TAG' => 'All < and > are converted to \u003C and \u003E. Available since PHP 5.3.0.', -'JSON_NUMERIC_CHECK' => 'Encodes numeric strings as numbers. Available since PHP 5.3.3.', -'JSON_OBJECT_AS_ARRAY' => 'Decodes JSON objects as PHP array. This option can be added automatically by calling `json_decode` with the second parameter equal to `true`. Available since PHP 5.4.0.', -'JSON_PARTIAL_OUTPUT_ON_ERROR' => 'Substitute some unencodable values instead of failing. Available since PHP 5.5.0.', -'JSON_PRESERVE_ZERO_FRACTION' => 'Ensures that `float` values are always encoded as a float value. Available since PHP 5.6.6.', -'JSON_PRETTY_PRINT' => 'Use whitespace in returned data to format it. Available since PHP 5.4.0.', -'JSON_THROW_ON_ERROR' => 'Throws `JsonException` if an error occurs instead of setting the global error state that is retrieved with `json_last_error`. `JSON_PARTIAL_OUTPUT_ON_ERROR` takes precedence over `JSON_THROW_ON_ERROR`. Available since PHP 7.3.0.', -'JSON_UNESCAPED_LINE_TERMINATORS' => 'The line terminators are kept unescaped when `JSON_UNESCAPED_UNICODE` is supplied. It uses the same behaviour as it was before PHP 7.1 without this constant. Available since PHP 7.1.0.', -'JSON_UNESCAPED_SLASHES' => 'Don\'t escape `/`. Available since PHP 5.4.0.', -'JSON_UNESCAPED_UNICODE' => 'Encode multibyte Unicode characters literally (default is to escape as \uXXXX). Available since PHP 5.4.0.', -'Judy::BITSET' => 'Define the Judy Array as a Bitset with keys as Integer and Values as a Boolean.', -'Judy::INT_TO_INT' => 'Define the Judy Array with key/values as Integer, and Integer only.', -'Judy::INT_TO_MIXED' => 'Define the Judy Array with keys as Integer and Values of any type.', -'Judy::STRING_TO_INT' => 'Define the Judy Array with keys as a String and Values as Integer, and Integer only.', -'Judy::STRING_TO_MIXED' => 'Define the Judy Array with keys as a String and Values of any type.', -'KTaglib_ID3v2_AttachedPictureFrame::Artist' => 'Picture type Artist', -'KTaglib_ID3v2_AttachedPictureFrame::BackCover' => 'Picture type BackCover', -'KTaglib_ID3v2_AttachedPictureFrame::Band' => 'Picture type Band', -'KTaglib_ID3v2_AttachedPictureFrame::BandLogo' => 'Picture type BandLogo', -'KTaglib_ID3v2_AttachedPictureFrame::ColouredFish' => 'Picture type ColouredFish', -'KTaglib_ID3v2_AttachedPictureFrame::Composer' => 'Picture type Composer', -'KTaglib_ID3v2_AttachedPictureFrame::Conductor' => 'Picture type Conductor', -'KTaglib_ID3v2_AttachedPictureFrame::DuringPerformance' => 'Picture type DuringPerformance', -'KTaglib_ID3v2_AttachedPictureFrame::DuringRecording' => 'Picture type DuringRecording', -'KTaglib_ID3v2_AttachedPictureFrame::FileIcon' => 'Picture type FileIcon', -'KTaglib_ID3v2_AttachedPictureFrame::FrontCover' => 'Picture type FrontCover', -'KTaglib_ID3v2_AttachedPictureFrame::Illustration' => 'Picture type Illustration', -'KTaglib_ID3v2_AttachedPictureFrame::LeadArtist' => 'Picture type LeadArtist', -'KTaglib_ID3v2_AttachedPictureFrame::LeafletPage' => 'Picture type LeafletPage', -'KTaglib_ID3v2_AttachedPictureFrame::Lyricist' => 'Picture type Lyricist', -'KTaglib_ID3v2_AttachedPictureFrame::Media' => 'Picture type Media', -'KTaglib_ID3v2_AttachedPictureFrame::MovieScreenCapture' => 'Picture type MovieScreenCapture', -'KTaglib_ID3v2_AttachedPictureFrame::Other' => 'Picture type Other', -'KTaglib_ID3v2_AttachedPictureFrame::OtherFileIcon' => 'Picture type OtherFileIcon', -'KTaglib_ID3v2_AttachedPictureFrame::RecordingLocation' => 'Picture type RecordingLocation', -'KTaglib_MPEG_Header::Version1' => 'ID3 version is 1.0', -'KTaglib_MPEG_Header::Version2' => 'ID3 version is 2.0', -'KTaglib_MPEG_Header::Version2_5' => 'ID3 version is 2.5', -'LATT_HASCHILDREN' => 'This mailbox has selectable inferiors.', -'LATT_HASNOCHILDREN' => 'This mailbox has no selectable inferiors.', -'LATT_MARKED' => 'This mailbox is marked. Only used by UW-IMAPD.', -'LATT_NOINFERIORS' => 'This mailbox has no "children" (there are no mailboxes below this one).', -'LATT_NOSELECT' => 'This is only a container, not a mailbox - you cannot open it.', -'LATT_REFERRAL' => 'This container has a referral to a remote mailbox.', -'LATT_UNMARKED' => 'This mailbox is not marked. Only used by UW-IMAPD.', -'LDAP_CONTROL_ASSERT' => 'Control Constant - Assertion (RFC 4528). Available as of PHP 7.3.0.', -'LDAP_CONTROL_AUTHZID_REQUEST' => 'Control Constant - Authorization Identity Request (RFC 3829). Available as of PHP 7.3.0.', -'LDAP_CONTROL_AUTHZID_RESPONSE' => 'Control Constant - Authorization Identity Response (RFC 3829). Available as of PHP 7.3.0.', -'LDAP_CONTROL_DONTUSECOPY' => 'Control Constant - Don\'t Use Copy (RFC 6171). Available as of PHP 7.3.0.', -'LDAP_CONTROL_MANAGEDSAIT' => 'Control Constant - Manage DSA IT (RFC 3296). Available as of PHP 7.3.0.', -'LDAP_CONTROL_PAGEDRESULTS' => 'Control Constant - Paged results (RFC 2696). Available as of PHP 7.3.0.', -'LDAP_CONTROL_PASSWORDPOLICYREQUEST' => 'Control Constant - Password Policy Request. Available as of PHP 7.3.0.', -'LDAP_CONTROL_PASSWORDPOLICYRESPONSE' => 'Control Constant - Password Policy Response. Available as of PHP 7.3.0.', -'LDAP_CONTROL_POST_READ' => 'Control Constant - Post read (RFC 4527). Available as of PHP 7.3.0.', -'LDAP_CONTROL_PRE_READ' => 'Control Constant - Pre read (RFC 4527). Available as of PHP 7.3.0.', -'LDAP_CONTROL_PROXY_AUTHZ' => 'Control Constant - Proxied Authorization (RFC 4370). Available as of PHP 7.3.0.', -'LDAP_CONTROL_SORTREQUEST' => 'Control Constant - Sort request (RFC 2891). Available as of PHP 7.3.0.', -'LDAP_CONTROL_SORTRESPONSE' => 'Control Constant - Sort response (RFC 2891). Available as of PHP 7.3.0.', -'LDAP_CONTROL_SUBENTRIES' => 'Control Constant - Subentries (RFC 3672). Available as of PHP 7.3.0.', -'LDAP_CONTROL_SYNC' => 'Control Constant - Content Synchronization Operation (RFC 4533). Available as of PHP 7.3.0.', -'LDAP_CONTROL_SYNC_DONE' => 'Control Constant - Content Synchronization Operation Done (RFC 4533). Available as of PHP 7.3.0.', -'LDAP_CONTROL_SYNC_STATE' => 'Control Constant - Content Synchronization Operation State (RFC 4533). Available as of PHP 7.3.0.', -'LDAP_CONTROL_VALUESRETURNFILTER' => 'Control Constant - Filter returned values (RFC 3876). Available as of PHP 7.3.0.', -'LDAP_CONTROL_VLVREQUEST' => 'Control Constant - Virtual List View Request. Available as of PHP 7.3.0.', -'LDAP_CONTROL_VLVRESPONSE' => 'Control Constant - Virtual List View Response. Available as of PHP 7.3.0.', -'LDAP_CONTROL_X_DOMAIN_SCOPE' => 'Control Constant - Active Directory Domain Scope. Available as of PHP 7.3.0.', -'LDAP_CONTROL_X_EXTENDED_DN' => 'Control Constant - Active Directory Extended DN. Available as of PHP 7.3.0.', -'LDAP_CONTROL_X_INCREMENTAL_VALUES' => 'Control Constant - Active Directory Incremental Values. Available as of PHP 7.3.0.', -'LDAP_CONTROL_X_PERMISSIVE_MODIFY' => 'Control Constant - Active Directory Permissive Modify. Available as of PHP 7.3.0.', -'LDAP_CONTROL_X_SEARCH_OPTIONS' => 'Control Constant - Active Directory Search Options. Available as of PHP 7.3.0.', -'LDAP_CONTROL_X_TREE_DELETE' => 'Control Constant - Active Directory Tree Delete. Available as of PHP 7.3.0.', -'LDAP_DEREF_ALWAYS' => 'Alias dereferencing rule - Always.', -'LDAP_DEREF_FINDING' => 'Alias dereferencing rule - Finding.', -'LDAP_DEREF_NEVER' => 'Alias dereferencing rule - Never.', -'LDAP_DEREF_SEARCHING' => 'Alias dereferencing rule - Searching.', -'LDAP_EXOP_MODIFY_PASSWD' => 'Extended Operation constant - Modify password (RFC 3062).', -'LDAP_EXOP_REFRESH' => 'Extended Operation Constant - Refresh (RFC 2589).', -'LDAP_EXOP_START_TLS' => 'Extended Operation constant - Start TLS (RFC 4511).', -'LDAP_EXOP_TURN' => 'Extended Operation Constant - Turn (RFC 4531).', -'LDAP_EXOP_WHO_AM_I' => 'Extended Operation Constant - WHOAMI (RFC 4532).', -'LDAP_OPT_CLIENT_CONTROLS' => 'Specifies a default list of client controls to be processed with each request.', -'LDAP_OPT_DEBUG_LEVEL' => 'Specifies a bitwise level for debug traces.', -'LDAP_OPT_DEREF' => 'Specifies alternative rules for following aliases at the server.', -'LDAP_OPT_DIAGNOSTIC_MESSAGE' => 'Gets the latest session error message.', -'LDAP_OPT_ERROR_NUMBER' => 'Latest session error number.', -'LDAP_OPT_ERROR_STRING' => 'Alias of `LDAP_OPT_DIAGNOSTIC_MESSAGE`.', -'LDAP_OPT_HOST_NAME' => 'Sets/gets a space-separated of hosts when trying to connect.', -'LDAP_OPT_MATCHED_DN' => 'Sets/gets the matched DN associated with the connection.', -'LDAP_OPT_NETWORK_TIMEOUT' => 'Option for `ldap_set_option` to allow setting network timeout. (Available as of PHP 5.3.0)', -'LDAP_OPT_PROTOCOL_VERSION' => 'Specifies the LDAP protocol to be used (V2 or V3).', -'LDAP_OPT_REFERRALS' => 'Specifies whether to automatically follow referrals returned by the LDAP server.', -'LDAP_OPT_RESTART' => 'Determines whether or not the connection should be implicitly restarted.', -'LDAP_OPT_SERVER_CONTROLS' => 'Specifies a default list of server controls to be sent with each request.', -'LDAP_OPT_TIMELIMIT' => 'Specifies the number of seconds to wait for search results.', -'LDAP_OPT_X_KEEPALIVE_IDLE' => 'Specifies the number of seconds a connection needs to remain idle before TCP starts sending keepalive probes.', -'LDAP_OPT_X_KEEPALIVE_INTERVAL' => 'Specifies the interval in seconds between individual keepalive probes.', -'LDAP_OPT_X_KEEPALIVE_PROBES' => 'Specifies the maximum number of keepalive probes TCP should send before dropping the connection.', -'LDAP_OPT_X_TLS_CACERTDIR' => 'Specifies the path of the directory containing CA certificates.', -'LDAP_OPT_X_TLS_CACERTFILE' => 'Specifies the full-path of the CA certificate file.', -'LDAP_OPT_X_TLS_CERTFILE' => 'Specifies the full-path of the certificate file.', -'LDAP_OPT_X_TLS_CIPHER_SUITE' => 'Specifies the allowed cipher suite.', -'LDAP_OPT_X_TLS_CRLCHECK' => 'Specifies the CRL evaluation strategy. This must be one of: `LDAP_OPT_X_TLS_CRL_NONE`,`LDAP_OPT_X_TLS_CRL_PEER`, `LDAP_OPT_X_TLS_CRL_ALL`.', -'LDAP_OPT_X_TLS_CRLFILE' => 'Specifies the full-path of the CRL file.', -'LDAP_OPT_X_TLS_DHFILE' => 'Specifies the full-path of the file containing the parameters for Diffie-Hellman ephemeral key exchange.', -'LDAP_OPT_X_TLS_KEYFILE' => 'Specifies the full-path of the certificate key file.', -'LDAP_OPT_X_TLS_PROTOCOL_MIN' => 'Specifies the minimum protocol version. This can be one of: `LDAP_OPT_X_TLS_PROTOCOL_SSL2`,`LDAP_OPT_X_TLS_PROTOCOL_SSL3`, `LDAP_OPT_X_TLS_PROTOCOL_TLS1_0`, `LDAP_OPT_X_TLS_PROTOCOL_TLS1_1`, `LDAP_OPT_X_TLS_PROTOCOL_TLS1_2`', -'LDAP_OPT_X_TLS_RANDOM_FILE' => 'Sets/gets the random file when one of the system default ones are not available.', -'LDAP_OPT_X_TLS_REQUIRE_CERT' => 'Specifies the certificate checking checking strategy. This must be one of: `LDAP_OPT_X_TLS_NEVER`,`LDAP_OPT_X_TLS_HARD`, `LDAP_OPT_X_TLS_DEMAND`, `LDAP_OPT_X_TLS_ALLOW`, `LDAP_OPT_X_TLS_TRY`. (Available as of PHP 7.0.0)', -'LIBEXSLT_DOTTED_VERSION' => 'libexslt version like 1.1.17. Available as of PHP 5.1.2.', -'LIBEXSLT_VERSION' => 'libexslt version like 813. Available as of PHP 5.1.2.', -'LIBXML_BIGLINES' => 'Allows line numbers greater than 65535 to be reported correctly.', -'LIBXML_COMPACT' => 'Activate small nodes allocation optimization. This may speed up your application without needing to change the code.', -'LIBXML_DOTTED_VERSION' => 'libxml version like 2.6.5 or 2.6.17', -'LIBXML_DTDATTR' => 'Default DTD attributes', -'LIBXML_DTDLOAD' => 'Load the external subset', -'LIBXML_DTDVALID' => 'Validate with the DTD', -'LIBXML_ERR_ERROR' => 'A recoverable error', -'LIBXML_ERR_FATAL' => 'A fatal error', -'LIBXML_ERR_NONE' => 'No errors', -'LIBXML_ERR_WARNING' => 'A simple warning', -'LIBXML_HTML_NODEFDTD' => 'Sets HTML_PARSE_NODEFDTD flag, which prevents a default doctype being added when one is not found.', -'LIBXML_HTML_NOIMPLIED' => 'Sets HTML_PARSE_NOIMPLIED flag, which turns off the automatic adding of implied html/body... elements.', -'LIBXML_NOBLANKS' => 'Remove blank nodes', -'LIBXML_NOCDATA' => 'Merge CDATA as text nodes', -'LIBXML_NOEMPTYTAG' => 'Expand empty tags (e.g. `<br/>` to `<br></br>`)', -'LIBXML_NOENT' => 'Substitute entities', -'LIBXML_NOERROR' => 'Suppress error reports', -'LIBXML_NONET' => 'Disable network access when loading documents', -'LIBXML_NOWARNING' => 'Suppress warning reports', -'LIBXML_NOXMLDECL' => 'Drop the XML declaration when saving a document', -'LIBXML_NSCLEAN' => 'Remove redundant namespace declarations', -'LIBXML_PARSEHUGE' => 'Sets XML_PARSE_HUGE flag, which relaxes any hardcoded limit from the parser. This affects limits like maximum depth of a document or the entity recursion, as well as limits of the size of text nodes.', -'LIBXML_PEDANTIC' => 'Sets XML_PARSE_PEDANTIC flag, which enables pedantic error reporting.', -'LIBXML_SCHEMA_CREATE' => 'Create default/fixed value nodes during XSD schema validation', -'LIBXML_VERSION' => 'libxml version like 20605 or 20617', -'LIBXML_XINCLUDE' => 'Implement XInclude substitution', -'LIBXSLT_DOTTED_VERSION' => 'libxslt version like 1.1.17. Available as of PHP 5.1.2.', -'LIBXSLT_VERSION' => 'libxslt version like 10117. Available as of PHP 5.1.2.', -'MB_CASE_FOLD' => 'Available since PHP 7.3.', -'MB_CASE_FOLD_SIMPLE' => 'Used by case-insensitive operations. Available since PHP 7.3.', -'MB_CASE_LOWER_SIMPLE' => 'Available since PHP 7.3.', -'MB_CASE_TITLE_SIMPLE' => 'Available since PHP 7.3.', -'Memcached::DISTRIBUTION_CONSISTENT' => '<p>Consistent hashing key distribution algorithm (based on libketama).</p>', -'Memcached::DISTRIBUTION_MODULA' => '<p>Modulo-based key distribution algorithm.</p>', -'Memcached::GET_PRESERVE_ORDER' => '<p>A flag for <b>Memcached::getMulti</b> and -<b>Memcached::getMultiByKey</b> to ensure that the keys are -returned in the same order as they were requested in. Non-existing keys -get a default value of NULL.</p>', -'Memcached::HASH_CRC' => '<p>CRC item key hashing algorithm.</p>', -'Memcached::HASH_DEFAULT' => '<p>The default (Jenkins one-at-a-time) item key hashing algorithm.</p>', -'Memcached::HASH_FNV1_32' => '<p>FNV1_32 item key hashing algorithm.</p>', -'Memcached::HASH_FNV1_64' => '<p>FNV1_64 item key hashing algorithm.</p>', -'Memcached::HASH_FNV1A_32' => '<p>FNV1_32A item key hashing algorithm.</p>', -'Memcached::HASH_FNV1A_64' => '<p>FNV1_64A item key hashing algorithm.</p>', -'Memcached::HASH_HSIEH' => '<p>Hsieh item key hashing algorithm.</p>', -'Memcached::HASH_MD5' => '<p>MD5 item key hashing algorithm.</p>', -'Memcached::HASH_MURMUR' => '<p>Murmur item key hashing algorithm.</p>', -'Memcached::HAVE_IGBINARY' => '<p>Indicates whether igbinary serializer support is available.</p> -<p>Type: boolean.</p>', -'Memcached::HAVE_JSON' => '<p>Indicates whether JSON serializer support is available.</p> -<p>Type: boolean.</p>', -'Memcached::OPT_BINARY_PROTOCOL' => '<p>Enable the use of the binary protocol. Please note that you cannot -toggle this option on an open connection.</p> -<p>Type: boolean, default: <b>FALSE</b>.</p>', -'Memcached::OPT_BUFFER_WRITES' => '<p>Enables or disables buffered I/O. Enabling buffered I/O causes -storage commands to "buffer" instead of being sent. Any action that -retrieves data causes this buffer to be sent to the remote connection. -Quitting the connection or closing down the connection will also cause -the buffered data to be pushed to the remote connection.</p> -<p>Type: boolean, default: <b>FALSE</b>.</p>', -'Memcached::OPT_CACHE_LOOKUPS' => '<p>Enables or disables caching of DNS lookups.</p> -<p>Type: boolean, default: <b>FALSE</b>.</p>', -'Memcached::OPT_COMPRESSION' => '<p>Enables or disables payload compression. When enabled, -item values longer than a certain threshold (currently 100 bytes) will be -compressed during storage and decompressed during retrieval -transparently.</p> -<p>Type: boolean, default: <b>TRUE</b>.</p>', -'Memcached::OPT_CONNECT_TIMEOUT' => '<p>In non-blocking mode this set the value of the timeout during socket -connection, in milliseconds.</p> -<p>Type: integer, default: 1000.</p>', -'Memcached::OPT_DISTRIBUTION' => '<p>Specifies the method of distributing item keys to the servers. -Currently supported methods are modulo and consistent hashing. Consistent -hashing delivers better distribution and allows servers to be added to -the cluster with minimal cache losses.</p> -<p>Type: integer, default: <b>Memcached::DISTRIBUTION_MODULA.</b></p>', -'Memcached::OPT_HASH' => '<p>Specifies the hashing algorithm used for the item keys. The valid -values are supplied via <b>Memcached::HASH_*</b> constants. -Each hash algorithm has its advantages and its disadvantages. Go with the -default if you don\'t know or don\'t care.</p> -<p>Type: integer, default: <b>Memcached::HASH_DEFAULT</b></p>', -'Memcached::OPT_LIBKETAMA_COMPATIBLE' => '<p>Enables or disables compatibility with libketama-like behavior. When -enabled, the item key hashing algorithm is set to MD5 and distribution is -set to be weighted consistent hashing distribution. This is useful -because other libketama-based clients (Python, Ruby, etc.) with the same -server configuration will be able to access the keys transparently. -</p> -<p> -It is highly recommended to enable this option if you want to use -consistent hashing, and it may be enabled by default in future -releases. -</p> -<p>Type: boolean, default: <b>FALSE</b>.</p>', -'Memcached::OPT_NO_BLOCK' => '<p>Enables or disables asynchronous I/O. This is the fastest transport -available for storage functions.</p> -<p>Type: boolean, default: <b>FALSE</b>.</p>', -'Memcached::OPT_POLL_TIMEOUT' => '<p>Timeout for connection polling, in milliseconds.</p> -<p>Type: integer, default: 1000.</p>', -'Memcached::OPT_PREFIX_KEY' => '<p>This can be used to create a "domain" for your item keys. The value -specified here will be prefixed to each of the keys. It cannot be -longer than 128 characters and will reduce the -maximum available key size. The prefix is applied only to the item keys, -not to the server keys.</p> -<p>Type: string, default: "".</p>', -'Memcached::OPT_RECV_TIMEOUT' => '<p>Socket reading timeout, in microseconds. In cases where you cannot -use non-blocking I/O this will allow you to still have timeouts on the -reading of data.</p> -<p>Type: integer, default: 0.</p>', -'Memcached::OPT_RETRY_TIMEOUT' => '<p>The amount of time, in seconds, to wait until retrying a failed -connection attempt.</p> -<p>Type: integer, default: 0.</p>', -'Memcached::OPT_SEND_TIMEOUT' => '<p>Socket sending timeout, in microseconds. In cases where you cannot -use non-blocking I/O this will allow you to still have timeouts on the -sending of data.</p> -<p>Type: integer, default: 0.</p>', -'Memcached::OPT_SERIALIZER' => '<p> -Specifies the serializer to use for serializing non-scalar values. -The valid serializers are <b>Memcached::SERIALIZER_PHP</b> -or <b>Memcached::SERIALIZER_IGBINARY</b>. The latter is -supported only when memcached is configured with ---enable-memcached-igbinary option and the -igbinary extension is loaded. -</p> -<p>Type: integer, default: <b>Memcached::SERIALIZER_PHP</b>.</p>', -'Memcached::OPT_SERVER_FAILURE_LIMIT' => '<p>Specifies the failure limit for server connection attempts. The -server will be removed after this many continuous connection -failures.</p> -<p>Type: integer, default: 0.</p>', -'Memcached::OPT_SOCKET_RECV_SIZE' => '<p>The maximum socket receive buffer in bytes.</p> -<p>Type: integer, default: varies by platform/kernel -configuration.</p>', -'Memcached::OPT_SOCKET_SEND_SIZE' => '<p>The maximum socket send buffer in bytes.</p> -<p>Type: integer, default: varies by platform/kernel -configuration.</p>', -'Memcached::OPT_TCP_NODELAY' => '<p>Enables or disables the no-delay feature for connecting sockets (may -be faster in some environments).</p> -<p>Type: boolean, default: <b>FALSE</b>.</p>', -'Memcached::RES_BAD_KEY_PROVIDED' => '<p>Bad key.</p>', -'Memcached::RES_BUFFERED' => '<p>The operation was buffered.</p>', -'Memcached::RES_CLIENT_ERROR' => '<p>Error on the client side.</p>', -'Memcached::RES_CONNECTION_SOCKET_CREATE_FAILURE' => '<p>Failed to create network socket.</p>', -'Memcached::RES_DATA_EXISTS' => '<p>Failed to do compare-and-swap: item you are trying to store has been -modified since you last fetched it.</p>', -'Memcached::RES_END' => '<p>End of result set.</p>', -'Memcached::RES_ERRNO' => '<p>System error.</p>', -'Memcached::RES_FAILURE' => '<p>The operation failed in some fashion.</p>', -'Memcached::RES_HOST_LOOKUP_FAILURE' => '<p>DNS lookup failed.</p>', -'Memcached::RES_NO_SERVERS' => '<p>Server list is empty.</p>', -'Memcached::RES_NOTFOUND' => '<p>Item with this key was not found (with "get" operation or "case" -operations).</p>', -'Memcached::RES_NOTSTORED' => '<p>Item was not stored: but not because of an error. This normally -means that either the condition for an "add" or a "replace" command -wasn\'t met, or that the item is in a delete queue.</p>', -'Memcached::RES_PARTIAL_READ' => '<p>Partial network data read error.</p>', -'Memcached::RES_PAYLOAD_FAILURE' => '<p>Payload failure: could not compress/decompress or serialize/unserialize the value.</p>', -'Memcached::RES_PROTOCOL_ERROR' => '<p>Bad command in memcached protocol.</p>', -'Memcached::RES_SERVER_ERROR' => '<p>Error on the server side.</p>', -'Memcached::RES_SOME_ERRORS' => '<p>Some errors occurred during multi-get.</p>', -'Memcached::RES_SUCCESS' => '<p>The operation was successful.</p>', -'Memcached::RES_TIMEOUT' => '<p>The operation timed out.</p>', -'Memcached::RES_UNKNOWN_READ_FAILURE' => '<p>Failed to read network data.</p>', -'Memcached::RES_WRITE_FAILURE' => '<p>Failed to write network data.</p>', -'Memcached::SERIALIZER_IGBINARY' => '<p>The igbinary serializer. -Instead of textual representation it stores PHP data structures in a -compact binary form, resulting in space and time gains.</p>', -'Memcached::SERIALIZER_JSON' => '<p>The JSON serializer. Requires PHP 5.2.10+.</p>', -'Memcached::SERIALIZER_PHP' => '<p>The default PHP serializer.</p>', -'MONGO_STREAMS' => 'Alias of `MONGO_SUPPORTS_STREAMS`', -'MONGO_SUPPORTS_AUTH_MECHANISM_GSSAPI' => '1 when GSSAPI authentication is compiled in.', -'MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_CR' => '1 when MongoDB-Challenge/Response authentication is compiled in.', -'MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_X509' => '1 when x.509 authentication is compiled in.', -'MONGO_SUPPORTS_AUTH_MECHANISM_PLAIN' => '1 when PLAIN authentication is compiled in.', -'MONGO_SUPPORTS_SSL' => '1 when the PHP manual\'s section on book.openssl is enabled and available.', -'MONGO_SUPPORTS_STREAMS' => '1 when compiled against PHP Streams (default since 1.4.0).', -'MongoBinData::BYTE_ARRAY' => 'Generic binary data (deprecated in favor of MongoBinData::GENERIC)', -'MongoBinData::CUSTOM' => 'User-defined type', -'MongoBinData::FUNC' => 'Function', -'MongoBinData::GENERIC' => 'Generic binary data.', -'MongoBinData::MD5' => 'MD5', -'MongoBinData::UUID' => 'Universally unique identifier (deprecated in favor of MongoBinData::UUID_RFC4122)', -'MongoBinData::UUID_RFC4122' => 'Universally unique identifier (according to » RFC 4122)', -'MongoDB::PROFILING_OFF' => 'Profiling is off.', -'MongoDB::PROFILING_ON' => 'Profiling is on for all operations.', -'MongoDB::PROFILING_SLOW' => 'Profiling is on for slow operations (>100 ms).', -'MongoDB\Driver\WriteConcern::MAJORITY' => 'Majority of all the members in the set; arbiters, non-voting members, passive members, hidden members and delayed members are all included in the definition of majority write concern.', -'MONGODB_STABILITY' => 'Current stability (alpha/beta/stable)', -'MONGODB_VERSION' => 'x.y.z style version number of the extension', -'MS_TRUE' => 'Mapscript extension (version 7.0.*) -Parsed from documentation -Generated at 2017-08-24 16:06:54', -'MSG_EOF' => 'Not available on Windows platforms.', -'MSG_EOR' => 'Not available on Windows platforms.', -'MSSQL_ASSOC' => 'Return an associative array. Used on `mssql_fetch_array`\'s `result_type` parameter.', -'MSSQL_BOTH' => 'Return an array with both numeric keys and keys with their field name. This is the default value for `mssql_fetch_array`\'s `result_type` parameter.', -'MSSQL_NUM' => 'Return an array with numeric keys. Used on `mssql_fetch_array`\'s `result_type` parameter.', -'MYSQLND_MEMCACHE_DEFAULT_REGEXP' => 'Default regular expression (PCRE style) used for matching `SELECT` statements that will be mapped into a MySQL Memcache Plugin access point, if possible. - -It is also possible to use `mysqlnd_memcache_set`, but the default approach is using this regular expression for pattern matching.', -'MYSQLND_MEMCACHE_VERSION' => 'Plugin version string, for example, 1.0.0-alpha.', -'MYSQLND_MEMCACHE_VERSION_ID' => 'Plugin version number, for example, 10000.', -'MYSQLND_MS_LAST_USED_SWITCH' => 'SQL hint used to send a query to the last used MySQL server. The last used MySQL server can either be a master or a slave server in a MySQL replication setup.', -'MYSQLND_MS_MASTER_SWITCH' => 'SQL hint used to send a query to the MySQL replication master server.', -'MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL' => 'Use to request the service level eventual consistency from the `mysqlnd_ms_set_qos`. Eventual consistency is the default quality of service when reading from an asynchronous MySQL replication slave. Data returned in this service level may or may not be stale, depending on whether the selected slaves happen to have replicated the latest changes from the MySQL replication master or not.', -'MYSQLND_MS_QOS_CONSISTENCY_SESSION' => 'Use to request the service level session consistency from the `mysqlnd_ms_set_qos`. Session consistency is defined as read your writes. The client is guaranteed to see his latest changes.', -'MYSQLND_MS_QOS_CONSISTENCY_STRONG' => 'Use to request the service level strong consistency from the `mysqlnd_ms_set_qos`. Strong consistency is used to ensure all clients see each others changes.', -'MYSQLND_MS_QOS_OPTION_AGE' => 'Used as a service level option with `mysqlnd_ms_set_qos` to parameterize eventual consistency.', -'MYSQLND_MS_QOS_OPTION_GTID' => 'Used as a service level option with `mysqlnd_ms_set_qos` to parameterize session consistency.', -'MYSQLND_MS_QUERY_USE_LAST_USED' => 'If `mysqlnd_ms_is_select` returns `MYSQLND_MS_QUERY_USE_LAST_USED` for a given query, the built-in read/write split mechanism recommends sending the query to the last used server.', -'MYSQLND_MS_QUERY_USE_MASTER' => 'If `mysqlnd_ms_is_select` returns `MYSQLND_MS_QUERY_USE_MASTER` for a given query, the built-in read/write split mechanism recommends sending the query to a MySQL replication master server.', -'MYSQLND_MS_QUERY_USE_SLAVE' => 'If `mysqlnd_ms_is_select` returns `MYSQLND_MS_QUERY_USE_SLAVE` for a given query, the built-in read/write split mechanism recommends sending the query to a MySQL replication slave server.', -'MYSQLND_MS_SLAVE_SWITCH' => 'SQL hint used to send a query to one of the MySQL replication slave servers.', -'MYSQLND_MS_VERSION' => 'Plugin version string, for example, 1.0.0-prototype.', -'MYSQLND_MS_VERSION_ID' => 'Plugin version number, for example, 10000.', -'MYSQLND_MUX_VERSION' => 'Plugin version string, for example, 1.0.0-prototype.', -'MYSQLND_MUX_VERSION_ID' => 'Plugin version number, for example, 10000.', -'MYSQLND_QC_CONDITION_META_SCHEMA_PATTERN' => 'Used as a parameter of `mysqlnd_qc_set_cache_condition` to set conditions for schema based automatic caching.', -'MYSQLND_QC_DISABLE_SWITCH' => 'SQL hint used to disable caching of a query if `mysqlnd_qc.cache_by_default = 1`.', -'MYSQLND_QC_ENABLE_SWITCH' => 'SQL hint used to enable caching of a query.', -'MYSQLND_QC_SERVER_ID_SWITCH' => 'This SQL hint should not be used in general. - -It is needed by PECL/mysqlnd_ms to group cache entries for one statement but originating from different physical connections. If the hint is used connection settings such as user, hostname and charset are not considered for generating a cache key of a query. Instead the given value and the query string are used as input to the hashing function that generates the key. - -PECL/mysqlnd_ms may, if instructed, cache results from MySQL Replication slaves. Because it can hold many connections to the slave the cache key shall not be formed from the user, hostname or other settings that may vary for the various slave connections. Instead, PECL/mysqlnd_ms provides an identifier which refers to the group of slave connections that shall be enabled to share cache entries no matter which physical slave connection was to generate the cache entry. - -Use of this feature outside of PECL/mysqlnd_ms is not recommended.', -'MYSQLND_QC_TTL_SWITCH' => 'SQL hint used to set the TTL of a result set.', -'MYSQLND_QC_VERSION' => 'Plugin version string, for example, 1.0.0-prototype.', -'MYSQLND_QC_VERSION_ID' => 'Plugin version number, for example, 10000.', -'MYSQLND_UH_MYSQLND_CHG_USER_RESP_PACKET' => 'MySQL Client Server protocol packet: change user response.', -'MYSQLND_UH_MYSQLND_CLOSE_DISCONNECTED' => 'Connection error.', -'MYSQLND_UH_MYSQLND_CLOSE_EXPLICIT' => 'User has called mysqlnd to close the connection.', -'MYSQLND_UH_MYSQLND_CLOSE_IMPLICIT' => 'Implicitly closed, for example, during garbage connection.', -'MYSQLND_UH_MYSQLND_CLOSE_LAST' => 'No practical meaning. Last entry marker of internal C data structure list.', -'MYSQLND_UH_MYSQLND_COM_BINLOG_DUMP' => 'MySQL Client Server protocol command: COM_BINLOG_DUMP.', -'MYSQLND_UH_MYSQLND_COM_CHANGE_USER' => 'MySQL Client Server protocol command: COM_CHANGE_USER.', -'MYSQLND_UH_MYSQLND_COM_CONNECT' => 'MySQL Client Server protocol command: COM_CONNECT.', -'MYSQLND_UH_MYSQLND_COM_CONNECT_OUT' => 'MySQL Client Server protocol command: COM_CONNECT_OUT.', -'MYSQLND_UH_MYSQLND_COM_CREATE_DB' => 'MySQL Client Server protocol command: COM_CREATE_DB.', -'MYSQLND_UH_MYSQLND_COM_DAEMON' => 'MySQL Client Server protocol command: COM_DAEMON.', -'MYSQLND_UH_MYSQLND_COM_DEBUG' => 'MySQL Client Server protocol command: COM_DEBUG.', -'MYSQLND_UH_MYSQLND_COM_DELAYED_INSERT' => 'MySQL Client Server protocol command: COM_DELAYED_INSERT.', -'MYSQLND_UH_MYSQLND_COM_DROP_DB' => 'MySQL Client Server protocol command: COM_DROP_DB.', -'MYSQLND_UH_MYSQLND_COM_END' => 'MySQL Client Server protocol command: COM_END.', -'MYSQLND_UH_MYSQLND_COM_FIELD_LIST' => 'MySQL Client Server protocol command: COM_FIELD_LIST.', -'MYSQLND_UH_MYSQLND_COM_INIT_DB' => 'MySQL Client Server protocol command: COM_INIT_DB.', -'MYSQLND_UH_MYSQLND_COM_PING' => 'MySQL Client Server protocol command: COM_PING.', -'MYSQLND_UH_MYSQLND_COM_PROCESS_INFO' => 'MySQL Client Server protocol command: COM_PROCESS_INFO.', -'MYSQLND_UH_MYSQLND_COM_PROCESS_KILL' => 'MySQL Client Server protocol command: COM_PROCESS_KILL.', -'MYSQLND_UH_MYSQLND_COM_QUERY' => 'MySQL Client Server protocol command: COM_QUERY.', -'MYSQLND_UH_MYSQLND_COM_QUIT' => 'MySQL Client Server protocol command: COM_QUIT.', -'MYSQLND_UH_MYSQLND_COM_REFRESH' => 'MySQL Client Server protocol command: COM_REFRESH.', -'MYSQLND_UH_MYSQLND_COM_REGISTER_SLAVED' => 'MySQL Client Server protocol command: COM_REGISTER_SLAVED.', -'MYSQLND_UH_MYSQLND_COM_SET_OPTION' => 'MySQL Client Server protocol command: COM_SET_OPTION.', -'MYSQLND_UH_MYSQLND_COM_SHUTDOWN' => 'MySQL Client Server protocol command: COM_SHUTDOWN.', -'MYSQLND_UH_MYSQLND_COM_SLEEP' => 'MySQL Client Server protocol command: COM_SLEEP.', -'MYSQLND_UH_MYSQLND_COM_STATISTICS' => 'MySQL Client Server protocol command: COM_STATISTICS.', -'MYSQLND_UH_MYSQLND_COM_STMT_CLOSE' => 'MySQL Client Server protocol command: COM_STMT_CLOSE.', -'MYSQLND_UH_MYSQLND_COM_STMT_EXECUTE' => 'MySQL Client Server protocol command: COM_STMT_EXECUTE.', -'MYSQLND_UH_MYSQLND_COM_STMT_FETCH' => 'MySQL Client Server protocol command: COM_STMT_FETCH.', -'MYSQLND_UH_MYSQLND_COM_STMT_PREPARE' => 'MySQL Client Server protocol command: COM_STMT_PREPARE.', -'MYSQLND_UH_MYSQLND_COM_STMT_RESET' => 'MySQL Client Server protocol command: COM_STMT_RESET.', -'MYSQLND_UH_MYSQLND_COM_STMT_SEND_LONG_DATA' => 'MySQL Client Server protocol command: COM_STMT_SEND_LONG_DATA.', -'MYSQLND_UH_MYSQLND_COM_TABLE_DUMP' => 'MySQL Client Server protocol command: COM_TABLE_DUMP.', -'MYSQLND_UH_MYSQLND_COM_TIME' => 'MySQL Client Server protocol command: COM_TIME.', -'MYSQLND_UH_MYSQLND_OPT_AUTH_PROTOCOL' => 'Option: TODO. Available as of `PHP 5.4.0`.', -'MYSQLND_UH_MYSQLND_OPT_GUESS_CONNECTION' => 'TODO', -'MYSQLND_UH_MYSQLND_OPT_INT_AND_FLOAT_NATIVE' => 'Option: make mysqlnd return integer and float columns as long even when using the MySQL Client Server text protocol. Only available with a custom build of mysqlnd.', -'MYSQLND_UH_MYSQLND_OPT_LOCAL_INFILE' => 'Option: Whether to allow `LOAD DATA LOCAL INFILE` use.', -'MYSQLND_UH_MYSQLND_OPT_MAX_ALLOWED_PACKET' => 'Option: maximum allowed packet size. Available as of `PHP 5.4.0`.', -'MYSQLND_UH_MYSQLND_OPT_NET_CMD_BUFFER_SIZE' => 'Option: mysqlnd network buffer size for commands.', -'MYSQLND_UH_MYSQLND_OPT_NET_READ_BUFFER_SIZE' => 'Option: mysqlnd network buffer size for reading from the server.', -'MYSQLND_UH_MYSQLND_OPT_PROTOCOL' => 'Option: supported protocol version.', -'MYSQLND_UH_MYSQLND_OPT_READ_TIMEOUT' => 'Option: connection read timeout.', -'MYSQLND_UH_MYSQLND_OPT_RECONNECT' => 'Option: Whether to reconnect automatically.', -'MYSQLND_UH_MYSQLND_OPT_SSL_CA' => 'Option: SSL CA.', -'MYSQLND_UH_MYSQLND_OPT_SSL_CAPATH' => 'Option: Path to SSL CA.', -'MYSQLND_UH_MYSQLND_OPT_SSL_CERT' => 'Option: SSL certificate.', -'MYSQLND_UH_MYSQLND_OPT_SSL_CIPHER' => 'Option: SSL cipher.', -'MYSQLND_UH_MYSQLND_OPT_SSL_KEY' => 'Option: SSL key.', -'MYSQLND_UH_MYSQLND_OPT_SSL_PASSPHRASE' => 'Option: SSL passphrase.', -'MYSQLND_UH_MYSQLND_OPT_SSL_VERIFY_SERVER_CERT' => 'Option: TODO', -'MYSQLND_UH_MYSQLND_OPT_USE_EMBEDDED_CONNECTION' => 'Embedded server related.', -'MYSQLND_UH_MYSQLND_OPT_USE_REMOTE_CONNECTION' => 'Embedded server related.', -'MYSQLND_UH_MYSQLND_OPT_USE_RESULT' => 'Option: unbuffered result sets.', -'MYSQLND_UH_MYSQLND_OPT_WRITE_TIMEOUT' => 'Option: connection write timeout.', -'MYSQLND_UH_MYSQLND_OPTION_INIT_COMMAND' => 'Option: init command to execute upon connect.', -'MYSQLND_UH_MYSQLND_OPTION_OPT_COMPRESS' => 'Option: whether the MySQL compressed protocol is to be used.', -'MYSQLND_UH_MYSQLND_OPTION_OPT_CONNECT_TIMEOUT' => 'Option: connection timeout.', -'MYSQLND_UH_MYSQLND_OPTION_OPT_NAMED_PIPE' => 'Option: named pipe to use for connection (Windows).', -'MYSQLND_UH_MYSQLND_PREPARE_RESP_PACKET' => 'MySQL Client Server protocol packet: prepare response.', -'MYSQLND_UH_MYSQLND_PROT_AUTH_PACKET' => 'MySQL Client Server protocol packet: authentication.', -'MYSQLND_UH_MYSQLND_PROT_CMD_PACKET' => 'MySQL Client Server protocol packet: command.', -'MYSQLND_UH_MYSQLND_PROT_EOF_PACKET' => 'MySQL Client Server protocol packet: EOF.', -'MYSQLND_UH_MYSQLND_PROT_GREET_PACKET' => 'MySQL Client Server protocol packet: greeting.', -'MYSQLND_UH_MYSQLND_PROT_LAST' => 'No practical meaning. Last entry marker of internal C data structure list.', -'MYSQLND_UH_MYSQLND_PROT_OK_PACKET' => 'MySQL Client Server protocol packet: OK.', -'MYSQLND_UH_MYSQLND_PROT_ROW_PACKET' => 'MySQL Client Server protocol packet: row.', -'MYSQLND_UH_MYSQLND_PROT_RSET_FLD_PACKET' => 'MySQL Client Server protocol packet: resultset field.', -'MYSQLND_UH_MYSQLND_PROT_RSET_HEADER_PACKET' => 'MySQL Client Server protocol packet: result set header.', -'MYSQLND_UH_MYSQLND_PROT_STATS_PACKET' => 'MySQL Client Server protocol packet: stats.', -'MYSQLND_UH_MYSQLND_READ_DEFAULT_FILE' => 'Option: MySQL server default file to read upon connect.', -'MYSQLND_UH_MYSQLND_READ_DEFAULT_GROUP' => 'Option: MySQL server default file group to read upon connect.', -'MYSQLND_UH_MYSQLND_REPORT_DATA_TRUNCATION' => 'Option: Whether to report data truncation.', -'MYSQLND_UH_MYSQLND_SECURE_AUTH' => 'TODO', -'MYSQLND_UH_MYSQLND_SET_CHARSET_DIR' => 'Option: charset description files directory.', -'MYSQLND_UH_MYSQLND_SET_CHARSET_NAME' => 'Option: charset name.', -'MYSQLND_UH_MYSQLND_SET_CLIENT_IP' => 'TODO', -'MYSQLND_UH_MYSQLND_SHARED_MEMORY_BASE_NAME' => 'Option: shared memory base name for shared memory connections.', -'MYSQLND_UH_SERVER_OPTION_DEFAULT_AUTH' => 'Option: default authentication method.', -'MYSQLND_UH_SERVER_OPTION_MULTI_STATEMENTS_OFF' => 'Option: disables multi statement support.', -'MYSQLND_UH_SERVER_OPTION_MULTI_STATEMENTS_ON' => 'Option: enables multi statement support.', -'MYSQLND_UH_SERVER_OPTION_PLUGIN_DIR' => 'Option: server plugin directory.', -'MYSQLND_UH_SERVER_OPTION_SET_CLIENT_IP' => 'TODO', -'MYSQLND_UH_VERSION' => 'Plugin version string, for example, 1.0.0-alpha.', -'MYSQLND_UH_VERSION_ID' => 'Plugin version number, for example, 10000.', -'OAUTH_BAD_NONCE' => 'The *oauth_nonce* value was used in a previous request, therefore it cannot be used now.', -'OAUTH_BAD_TIMESTAMP' => 'The *oauth_timestamp* value was not accepted by the service provider. In this case, the response should also contain the *oauth_acceptable_timestamps* parameter.', -'OAUTH_CONSUMER_KEY_REFUSED' => 'The consumer key was refused.', -'OAUTH_CONSUMER_KEY_UNKNOWN' => 'The *oauth_consumer_key* is temporarily unacceptable to the service provider. For example, the service provider may be throttling the consumer.', -'OAUTH_HTTP_METHOD_DELETE' => 'Use the *DELETE* method for the OAuth request.', -'OAUTH_INVALID_SIGNATURE' => 'The *oauth_signature* is invalid, as it does not match the signature computed by the service provider.', -'OAUTH_OK' => 'Life is good.', -'OAUTH_PARAMETER_ABSENT' => 'A required parameter was not received. In this case, the response should also contain the *oauth_parameters_absent* parameter.', -'OAUTH_REQENGINE_CURL' => 'Used by `OAuth::setRequestEngine` to set the engine to Curl, as opposed to `OAUTH_REQENGINE_STREAMS` for PHP streams.', -'OAUTH_REQENGINE_STREAMS' => 'Used by `OAuth::setRequestEngine` to set the engine to PHP streams, as opposed to `OAUTH_REQENGINE_CURL` for Curl.', -'OAUTH_SIG_METHOD_HMACSHA256' => 'OAuth *HMAC-SHA256* signature method.', -'OAUTH_SIG_METHOD_RSASHA1' => 'OAuth *RSA-SHA1* signature method.', -'OAUTH_SIGNATURE_METHOD_REJECTED' => 'The *oauth_signature_method* was not accepted by service provider.', -'OAUTH_TOKEN_EXPIRED' => 'The *oauth_token* has expired.', -'OAUTH_TOKEN_REJECTED' => 'The *oauth_token* was not accepted by the service provider. The reason is not known, but it might be because the token was never issued, already consumed, expired, and/or forgotten by the service provider.', -'OAUTH_TOKEN_REVOKED' => 'The *oauth_token* has been revoked, and will never be accepted.', -'OAUTH_TOKEN_USED' => 'The *oauth_token* has been consumed. It can no longer be used because it has already been used in the previous request(s).', -'OAUTH_VERIFIER_INVALID' => 'The *oauth_verifier* is incorrect.', -'OP_ANONYMOUS' => 'Don\'t use or update a .newsrc for news (NNTP only)', -'OP_HALFOPEN' => 'For IMAP and NNTP names, open a connection but don\'t open a mailbox.', -'OP_READONLY' => 'Open mailbox read-only', -'OPENSSL_ALGO_MD2' => 'As of PHP 5.2.13 and PHP 5.3.2, this constant is only available if PHP is compiled with MD2 support. This requires passing in the -DHAVE_OPENSSL_MD2_H CFLAG when compiling PHP, and enable-md2 when compiling OpenSSL 1.0.0+.', -'OPENSSL_ALGO_SHA1' => 'Used as default algorithm by `openssl_sign` and `openssl_verify`.', -'OPENSSL_KEYTYPE_EC' => 'This constant is only available when PHP is compiled with OpenSSL 0.9.8+.', -'OPENSSL_TLSEXT_SERVER_NAME' => 'Whether SNI support is available or not.', -'Parle\INTERNAL_UTF32' => 'Flag whether the internal UTF-32 support is compiled in. Available since parle 0.7.2.', -'Parle\Token::EOI' => 'End of input token id.', -'Parle\Token::SKIP' => 'Skip token id.', -'Parle\Token::UNKNOWN' => 'Unknown token id.', -'PARSEKIT_EXTENDED_VALUE' => 'Opnode Flag', -'PARSEKIT_IS_CONST' => 'Node Type', -'PARSEKIT_IS_TMP_VAR' => 'Node Type', -'PARSEKIT_IS_UNUSED' => 'Node Type', -'PARSEKIT_IS_VAR' => 'Node Type', -'PARSEKIT_QUIET' => 'Return full detail, but without unnecessary NULL entries.', -'PARSEKIT_RESULT_CONST' => 'Opnode Flag', -'PARSEKIT_RESULT_EA_TYPE' => 'Opnode Flag', -'PARSEKIT_RESULT_JMP_ADDR' => 'Opnode Flag', -'PARSEKIT_RESULT_OPARRAY' => 'Opnode Flag', -'PARSEKIT_RESULT_OPLINE' => 'Opnode Flag', -'PARSEKIT_RESULT_VAR' => 'Opnode Flag', -'PARSEKIT_SIMPLE' => 'Return shorthand opcode notation.', -'PARSEKIT_USAGE_UNKNOWN' => 'Opnode Flag', -'PARSEKIT_ZEND_ADD' => 'Opcode', -'PARSEKIT_ZEND_ADD_ARRAY_ELEMENT' => 'Opcode', -'PARSEKIT_ZEND_ADD_CHAR' => 'Opcode', -'PARSEKIT_ZEND_ADD_INTERFACE' => 'Opcode', -'PARSEKIT_ZEND_ADD_STRING' => 'Opcode', -'PARSEKIT_ZEND_ADD_VAR' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_ADD' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_BW_AND' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_BW_OR' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_BW_XOR' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_CONCAT' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_DIM' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_DIV' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_MOD' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_MUL' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_OBJ' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_REF' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_SL' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_SR' => 'Opcode', -'PARSEKIT_ZEND_ASSIGN_SUB' => 'Opcode', -'PARSEKIT_ZEND_BEGIN_SILENCE' => 'Opcode', -'PARSEKIT_ZEND_BOOL' => 'Opcode', -'PARSEKIT_ZEND_BOOL_NOT' => 'Opcode', -'PARSEKIT_ZEND_BOOL_XOR' => 'Opcode', -'PARSEKIT_ZEND_BRK' => 'Opcode', -'PARSEKIT_ZEND_BW_AND' => 'Opcode', -'PARSEKIT_ZEND_BW_NOT' => 'Opcode', -'PARSEKIT_ZEND_BW_OR' => 'Opcode', -'PARSEKIT_ZEND_BW_XOR' => 'Opcode', -'PARSEKIT_ZEND_CASE' => 'Opcode', -'PARSEKIT_ZEND_CAST' => 'Opcode', -'PARSEKIT_ZEND_CATCH' => 'Opcode', -'PARSEKIT_ZEND_CLONE' => 'Opcode', -'PARSEKIT_ZEND_CONCAT' => 'Opcode', -'PARSEKIT_ZEND_CONT' => 'Opcode', -'PARSEKIT_ZEND_DECLARE_CLASS' => 'Opcode', -'PARSEKIT_ZEND_DECLARE_FUNCTION' => 'Opcode', -'PARSEKIT_ZEND_DECLARE_INHERITED_CLASS' => 'Opcode', -'PARSEKIT_ZEND_DIV' => 'Opcode', -'PARSEKIT_ZEND_DO_FCALL' => 'Opcode', -'PARSEKIT_ZEND_DO_FCALL_BY_NAME' => 'Opcode', -'PARSEKIT_ZEND_ECHO' => 'Opcode', -'PARSEKIT_ZEND_END_SILENCE' => 'Opcode', -'PARSEKIT_ZEND_EVAL_CODE' => 'Function Type', -'PARSEKIT_ZEND_EXIT' => 'Opcode', -'PARSEKIT_ZEND_EXT_FCALL_BEGIN' => 'Opcode', -'PARSEKIT_ZEND_EXT_FCALL_END' => 'Opcode', -'PARSEKIT_ZEND_EXT_NOP' => 'Opcode', -'PARSEKIT_ZEND_EXT_STMT' => 'Opcode', -'PARSEKIT_ZEND_FE_FETCH' => 'Opcode', -'PARSEKIT_ZEND_FE_RESET' => 'Opcode', -'PARSEKIT_ZEND_FETCH_CLASS' => 'Opcode', -'PARSEKIT_ZEND_FETCH_CONSTANT' => 'Opcode', -'PARSEKIT_ZEND_FETCH_DIM_FUNC_ARG' => 'Opcode', -'PARSEKIT_ZEND_FETCH_DIM_IS' => 'Opcode', -'PARSEKIT_ZEND_FETCH_DIM_R' => 'Opcode', -'PARSEKIT_ZEND_FETCH_DIM_RW' => 'Opcode', -'PARSEKIT_ZEND_FETCH_DIM_TMP_VAR' => 'Opcode', -'PARSEKIT_ZEND_FETCH_DIM_UNSET' => 'Opcode', -'PARSEKIT_ZEND_FETCH_DIM_W' => 'Opcode', -'PARSEKIT_ZEND_FETCH_FUNC_ARG' => 'Opcode', -'PARSEKIT_ZEND_FETCH_IS' => 'Opcode', -'PARSEKIT_ZEND_FETCH_OBJ_FUNC_ARG' => 'Opcode', -'PARSEKIT_ZEND_FETCH_OBJ_IS' => 'Opcode', -'PARSEKIT_ZEND_FETCH_OBJ_R' => 'Opcode', -'PARSEKIT_ZEND_FETCH_OBJ_RW' => 'Opcode', -'PARSEKIT_ZEND_FETCH_OBJ_UNSET' => 'Opcode', -'PARSEKIT_ZEND_FETCH_OBJ_W' => 'Opcode', -'PARSEKIT_ZEND_FETCH_R' => 'Opcode', -'PARSEKIT_ZEND_FETCH_RW' => 'Opcode', -'PARSEKIT_ZEND_FETCH_UNSET' => 'Opcode', -'PARSEKIT_ZEND_FETCH_W' => 'Opcode', -'PARSEKIT_ZEND_FREE' => 'Opcode', -'PARSEKIT_ZEND_HANDLE_EXCEPTION' => 'Opcode', -'PARSEKIT_ZEND_IMPORT_CLASS' => 'Opcode', -'PARSEKIT_ZEND_IMPORT_CONST' => 'Opcode', -'PARSEKIT_ZEND_IMPORT_FUNCTION' => 'Opcode', -'PARSEKIT_ZEND_INCLUDE_OR_EVAL' => 'Opcode', -'PARSEKIT_ZEND_INIT_ARRAY' => 'Opcode', -'PARSEKIT_ZEND_INIT_CTOR_CALL' => 'Opcode', -'PARSEKIT_ZEND_INIT_FCALL_BY_NAME' => 'Opcode', -'PARSEKIT_ZEND_INIT_METHOD_CALL' => 'Opcode', -'PARSEKIT_ZEND_INIT_STATIC_METHOD_CALL' => 'Opcode', -'PARSEKIT_ZEND_INIT_STRING' => 'Opcode', -'PARSEKIT_ZEND_INSTANCEOF' => 'Opcode', -'PARSEKIT_ZEND_INTERNAL_CLASS' => 'Class Type', -'PARSEKIT_ZEND_INTERNAL_FUNCTION' => 'Function Type', -'PARSEKIT_ZEND_IS_EQUAL' => 'Opcode', -'PARSEKIT_ZEND_IS_IDENTICAL' => 'Opcode', -'PARSEKIT_ZEND_IS_NOT_EQUAL' => 'Opcode', -'PARSEKIT_ZEND_IS_NOT_IDENTICAL' => 'Opcode', -'PARSEKIT_ZEND_IS_SMALLER' => 'Opcode', -'PARSEKIT_ZEND_IS_SMALLER_OR_EQUAL' => 'Opcode', -'PARSEKIT_ZEND_ISSET_ISEMPTY' => 'Opcode', -'PARSEKIT_ZEND_ISSET_ISEMPTY_DIM_OBJ' => 'Opcode', -'PARSEKIT_ZEND_ISSET_ISEMPTY_PROP_OBJ' => 'Opcode', -'PARSEKIT_ZEND_ISSET_ISEMPTY_VAR' => 'Opcode', -'PARSEKIT_ZEND_JMP' => 'Opcode', -'PARSEKIT_ZEND_JMP_NO_CTOR' => 'Opcode', -'PARSEKIT_ZEND_JMPNZ' => 'Opcode', -'PARSEKIT_ZEND_JMPNZ_EX' => 'Opcode', -'PARSEKIT_ZEND_JMPZ' => 'Opcode', -'PARSEKIT_ZEND_JMPZ_EX' => 'Opcode', -'PARSEKIT_ZEND_JMPZNZ' => 'Opcode', -'PARSEKIT_ZEND_MOD' => 'Opcode', -'PARSEKIT_ZEND_MUL' => 'Opcode', -'PARSEKIT_ZEND_NEW' => 'Opcode', -'PARSEKIT_ZEND_NOP' => 'Opcode', -'PARSEKIT_ZEND_OP_DATA' => 'Opcode', -'PARSEKIT_ZEND_OVERLOADED_FUNCTION' => 'Function Type', -'PARSEKIT_ZEND_OVERLOADED_FUNCTION_TEMPORARY' => 'Function Type', -'PARSEKIT_ZEND_POST_DEC' => 'Opcode', -'PARSEKIT_ZEND_POST_DEC_OBJ' => 'Opcode', -'PARSEKIT_ZEND_POST_INC' => 'Opcode', -'PARSEKIT_ZEND_POST_INC_OBJ' => 'Opcode', -'PARSEKIT_ZEND_PRE_DEC' => 'Opcode', -'PARSEKIT_ZEND_PRE_DEC_OBJ' => 'Opcode', -'PARSEKIT_ZEND_PRE_INC' => 'Opcode', -'PARSEKIT_ZEND_PRE_INC_OBJ' => 'Opcode', -'PARSEKIT_ZEND_PRINT' => 'Opcode', -'PARSEKIT_ZEND_QM_ASSIGN' => 'Opcode', -'PARSEKIT_ZEND_RAISE_ABSTRACT_ERROR' => 'Opcode', -'PARSEKIT_ZEND_RECV' => 'Opcode', -'PARSEKIT_ZEND_RECV_INIT' => 'Opcode', -'PARSEKIT_ZEND_RETURN' => 'Opcode', -'PARSEKIT_ZEND_SEND_REF' => 'Opcode', -'PARSEKIT_ZEND_SEND_VAL' => 'Opcode', -'PARSEKIT_ZEND_SEND_VAR' => 'Opcode', -'PARSEKIT_ZEND_SEND_VAR_NO_REF' => 'Opcode', -'PARSEKIT_ZEND_SL' => 'Opcode', -'PARSEKIT_ZEND_SR' => 'Opcode', -'PARSEKIT_ZEND_SUB' => 'Opcode', -'PARSEKIT_ZEND_SWITCH_FREE' => 'Opcode', -'PARSEKIT_ZEND_THROW' => 'Opcode', -'PARSEKIT_ZEND_TICKS' => 'Opcode', -'PARSEKIT_ZEND_UNSET_DIM_OBJ' => 'Opcode', -'PARSEKIT_ZEND_UNSET_VAR' => 'Opcode', -'PARSEKIT_ZEND_USER_CLASS' => 'Class Type', -'PARSEKIT_ZEND_USER_FUNCTION' => 'Function Type', -'PARSEKIT_ZEND_VERIFY_ABSTRACT_CLASS' => 'Opcode', -'PATH_SEPARATOR' => 'Semicolon on Windows, colon otherwise.', -'PATHINFO_FILENAME' => 'Since PHP 5.2.0.', -'PDO::ATTR_AUTOCOMMIT' => 'If this value is `false`, PDO attempts to disable autocommit so that the connection begins a transaction.', -'PDO::ATTR_CASE' => 'Force column names to a specific case specified by the `PDO::CASE_*` constants.', -'PDO::ATTR_CLIENT_VERSION' => 'This is a read only attribute; it will return information about the version of the client libraries that the PDO driver is using.', -'PDO::ATTR_CURSOR' => 'Selects the cursor type. PDO currently supports either `PDO::CURSOR_FWDONLY` and `PDO::CURSOR_SCROLL`. Stick with `PDO::CURSOR_FWDONLY` unless you know that you need a scrollable cursor.', -'PDO::ATTR_CURSOR_NAME' => 'Get or set the name to use for a cursor. Most useful when using scrollable cursors and positioned updates.', -'PDO::ATTR_DEFAULT_FETCH_MODE' => 'Available since PHP 5.2.0', -'PDO::ATTR_DEFAULT_STR_PARAM' => 'Sets the default string parameter type, this can be one of `PDO::PARAM_STR_NATL` and `PDO::PARAM_STR_CHAR`. - -Available since PHP 7.2.0.', -'PDO::ATTR_DRIVER_NAME' => 'Returns the name of the driver.', -'PDO::ATTR_EMULATE_PREPARES' => 'Available since PHP 5.1.3.', -'PDO::ATTR_ERRMODE' => 'See the Errors and error handling section for more information about this attribute.', -'PDO::ATTR_FETCH_CATALOG_NAMES' => 'Prepend the containing catalog name to each column name returned in the result set. The catalog name and column name are separated by a decimal (.) character. Support of this attribute is at the driver level; it may not be supported by your driver.', -'PDO::ATTR_FETCH_TABLE_NAMES' => 'Prepend the containing table name to each column name returned in the result set. The table name and column name are separated by a decimal (.) character. Support of this attribute is at the driver level; it may not be supported by your driver.', -'PDO::ATTR_MAX_COLUMN_LEN' => 'Sets the maximum column name length.', -'PDO::ATTR_ORACLE_NULLS' => 'Convert empty strings to SQL NULL values on data fetches.', -'PDO::ATTR_PERSISTENT' => 'Request a persistent connection, rather than creating a new connection. See Connections and Connection management for more information on this attribute.', -'PDO::ATTR_PREFETCH' => 'Setting the prefetch size allows you to balance speed against memory usage for your application. Not all database/driver combinations support setting of the prefetch size. A larger prefetch size results in increased performance at the cost of higher memory usage.', -'PDO::ATTR_SERVER_INFO' => 'This is a read only attribute; it will return some meta information about the database server to which PDO is connected.', -'PDO::ATTR_SERVER_VERSION' => 'This is a read only attribute; it will return information about the version of the database server to which PDO is connected.', -'PDO::ATTR_STATEMENT_CLASS' => 'Sets the class name of which statements are returned as.', -'PDO::ATTR_STRINGIFY_FETCHES' => 'Forces all values fetched to be treated as strings.', -'PDO::ATTR_TIMEOUT' => 'Sets the timeout value in seconds for communications with the database.', -'PDO::CASE_LOWER' => 'Force column names to lower case.', -'PDO::CASE_NATURAL' => 'Leave column names as returned by the database driver.', -'PDO::CASE_UPPER' => 'Force column names to upper case.', -'PDO::CURSOR_FWDONLY' => 'Create a `PDOStatement` object with a forward-only cursor. This is the default cursor choice, as it is the fastest and most common data access pattern in PHP.', -'PDO::CURSOR_SCROLL' => 'Create a `PDOStatement` object with a scrollable cursor. Pass the `PDO::FETCH_ORI_*` constants to control the rows fetched from the result set.', -'PDO::ERR_NONE' => 'Corresponds to SQLSTATE \'00000\', meaning that the SQL statement was successfully issued with no errors or warnings. This constant is for your convenience when checking `PDO::errorCode` or `PDOStatement::errorCode` to determine if an error occurred. You will usually know if this is the case by examining the return code from the method that raised the error condition anyway.', -'PDO::ERRMODE_EXCEPTION' => 'Throw a `PDOException` if an error occurs. See Errors and error handling for more information about this attribute.', -'PDO::ERRMODE_SILENT' => 'Do not raise an error or exception if an error occurs. The developer is expected to explicitly check for errors. This is the default mode. See Errors and error handling for more information about this attribute.', -'PDO::ERRMODE_WARNING' => 'Issue a PHP `E_WARNING` message if an error occurs. See Errors and error handling for more information about this attribute.', -'PDO::FETCH_ASSOC' => 'Specifies that the fetch method shall return each row as an array indexed by column name as returned in the corresponding result set. If the result set contains multiple columns with the same name, `PDO::FETCH_ASSOC` returns only a single value per column name.', -'PDO::FETCH_BOTH' => 'Specifies that the fetch method shall return each row as an array indexed by both column name and number as returned in the corresponding result set, starting at column 0.', -'PDO::FETCH_BOUND' => 'Specifies that the fetch method shall return TRUE and assign the values of the columns in the result set to the PHP variables to which they were bound with the `PDOStatement::bindParam` or `PDOStatement::bindColumn` methods.', -'PDO::FETCH_CLASS' => 'Specifies that the fetch method shall return a new instance of the requested class, mapping the columns to named properties in the class.', -'PDO::FETCH_CLASSTYPE' => 'Determine the class name from the value of first column.', -'PDO::FETCH_COLUMN' => 'Specifies that the fetch method shall return only a single requested column from the next row in the result set.', -'PDO::FETCH_FUNC' => 'Allows completely customize the way data is treated on the fly (only valid inside `PDOStatement::fetchAll`).', -'PDO::FETCH_GROUP' => 'Group return by values. Usually combined with `PDO::FETCH_COLUMN` or `PDO::FETCH_KEY_PAIR`.', -'PDO::FETCH_INTO' => 'Specifies that the fetch method shall update an existing instance of the requested class, mapping the columns to named properties in the class.', -'PDO::FETCH_KEY_PAIR' => 'Fetch a two-column result into an array where the first column is a key and the second column is the value. Available since PHP 5.2.3.', -'PDO::FETCH_LAZY' => 'Specifies that the fetch method shall return each row as an object with variable names that correspond to the column names returned in the result set. `PDO::FETCH_LAZY` creates the object variable names as they are accessed. Not valid inside `PDOStatement::fetchAll`.', -'PDO::FETCH_NAMED' => 'Specifies that the fetch method shall return each row as an array indexed by column name as returned in the corresponding result set. If the result set contains multiple columns with the same name, `PDO::FETCH_NAMED` returns an array of values per column name.', -'PDO::FETCH_NUM' => 'Specifies that the fetch method shall return each row as an array indexed by column number as returned in the corresponding result set, starting at column 0.', -'PDO::FETCH_OBJ' => 'Specifies that the fetch method shall return each row as an object with property names that correspond to the column names returned in the result set.', -'PDO::FETCH_ORI_ABS' => 'Fetch the requested row by row number from the result set. Valid only for scrollable cursors.', -'PDO::FETCH_ORI_FIRST' => 'Fetch the first row in the result set. Valid only for scrollable cursors.', -'PDO::FETCH_ORI_LAST' => 'Fetch the last row in the result set. Valid only for scrollable cursors.', -'PDO::FETCH_ORI_NEXT' => 'Fetch the next row in the result set. Valid only for scrollable cursors.', -'PDO::FETCH_ORI_PRIOR' => 'Fetch the previous row in the result set. Valid only for scrollable cursors.', -'PDO::FETCH_ORI_REL' => 'Fetch the requested row by relative position from the current position of the cursor in the result set. Valid only for scrollable cursors.', -'PDO::FETCH_PROPS_LATE' => 'Call the constructor before setting properties. Available since PHP 5.2.0.', -'PDO::FETCH_SERIALIZE' => 'As `PDO::FETCH_INTO` but object is provided as a serialized string. Available since PHP 5.1.0. Since PHP 5.3.0 the class constructor is never called if this flag is set.', -'PDO::FETCH_UNIQUE' => 'Fetch only the unique values.', -'PDO::MYSQL_ATTR_USE_BUFFERED_QUERY' => 'If this attribute is set to `true` on a `PDOStatement`, the MySQL driver will use the buffered versions of the MySQL API. If you\'re writing portable code, you should use `PDOStatement::fetchAll` instead.', -'PDO::PARAM_BOOL' => 'Represents a boolean data type.', -'PDO::PARAM_EVT_ALLOC' => 'Allocation event', -'PDO::PARAM_EVT_EXEC_POST' => 'Event triggered subsequent to execution of a prepared statement.', -'PDO::PARAM_EVT_EXEC_PRE' => 'Event triggered prior to execution of a prepared statement.', -'PDO::PARAM_EVT_FETCH_POST' => 'Event triggered subsequent to fetching a result from a resultset.', -'PDO::PARAM_EVT_FETCH_PRE' => 'Event triggered prior to fetching a result from a resultset.', -'PDO::PARAM_EVT_FREE' => 'Deallocation event', -'PDO::PARAM_EVT_NORMALIZE' => 'Event triggered during bound parameter registration allowing the driver to normalize the parameter name.', -'PDO::PARAM_INPUT_OUTPUT' => 'Specifies that the parameter is an INOUT parameter for a stored procedure. You must bitwise-OR this value with an explicit PDO::PARAM_* data type.', -'PDO::PARAM_INT' => 'Represents the SQL INTEGER data type.', -'PDO::PARAM_LOB' => 'Represents the SQL large object data type.', -'PDO::PARAM_NULL' => 'Represents the SQL NULL data type.', -'PDO::PARAM_STMT' => 'Represents a recordset type. Not currently supported by any drivers.', -'PDO::PARAM_STR' => 'Represents the SQL CHAR, VARCHAR, or other string data type.', -'PDO::PARAM_STR_CHAR' => 'Flag to denote a string uses the regular character set. - -Available since PHP 7.2.0', -'PDO::PARAM_STR_NATL' => 'Flag to denote a string uses the national character set. - -Available since PHP 7.2.0', -'PDO::SQLITE_DETERMINISTIC' => 'Specifies that a function created with `PDO::sqliteCreateFunction` is deterministic, i.e. it always returns the same result given the same inputs within a single SQL statement. (Available as of PHP 7.1.4.)', -'PDO::SQLSRV_ATTR_DIRECT_QUERY' => 'Indicates that a query should be executed directly, without being prepared. This constant can be passed to PDO::setAttribute, and PDO::prepare. For more information, see Direct and Prepared Statement Execution.', -'PDO::SQLSRV_ATTR_QUERY_TIMEOUT' => 'A non-negative integer representing the timeout period, in seconds. Zero (0) is the default and means no timeout. This constant can be passed to PDOStatement::setAttribute, PDO::setAttribute, and PDO::prepare.', -'PDO::SQLSRV_ENCODING_BINARY' => 'Specifies that data is sent/retrieved as a raw byte stream to/from the server without performing encoding or translation. This constant can be passed to PDOStatement::setAttribute, PDO::prepare, PDOStatement::bindColumn, and PDOStatement::bindParam.', -'PDO::SQLSRV_ENCODING_DEFAULT' => 'Specifies that data is sent/retrieved to/from the server according to PDO::SQLSRV_ENCODING_SYSTEM if specified during connection. The connection\'s encoding is used if specified in a prepare statement. This constant can be passed to PDOStatement::setAttribute, PDO::setAttribute, PDO::prepare, PDOStatement::bindColumn, and PDOStatement::bindParam.', -'PDO::SQLSRV_ENCODING_SYSTEM' => 'Specifies that data is sent/retrieved to/from the server as 8-bit characters as specified in the code page of the Windows locale that is set on the system. Any multi-byte characters or characters that do not map into this code page are substituted with a single byte question mark (?) character. This constant can be passed to PDOStatement::setAttribute, PDO::setAttribute, PDO::prepare, PDOStatement::bindColumn, and PDOStatement::bindParam.', -'PDO::SQLSRV_ENCODING_UTF8' => 'Specifies that data is sent/retrieved to/from the server in UTF-8 encoding. This is the default encoding. This constant can be passed to PDOStatement::setAttribute, PDO::setAttribute, PDO::prepare, PDOStatement::bindColumn, and PDOStatement::bindParam.', -'PDO::SQLSRV_TXN_READ_COMMITTED' => 'This constant is an acceptable value for the SQLSRV DSN key TransactionIsolation. This constant sets the transaction isolation level for the connection to Read Committed.', -'PDO::SQLSRV_TXN_READ_UNCOMMITTED' => 'This constant is an acceptable value for the SQLSRV DSN key TransactionIsolation. This constant sets the transaction isolation level for the connection to Read Uncommitted.', -'PDO::SQLSRV_TXN_REPEATABLE_READ' => 'This constant is an acceptable value for the SQLSRV DSN key TransactionIsolation. This constant sets the transaction isolation level for the connection to Repeateable Read.', -'PDO::SQLSRV_TXN_SERIALIZABLE' => 'This constant is an acceptable value for the SQLSRV DSN key TransactionIsolation. This constant sets the transaction isolation level for the connection to Serializable.', -'PDO::SQLSRV_TXN_SNAPSHOT' => 'This constant is an acceptable value for the SQLSRV DSN key TransactionIsolation. This constant sets the transaction isolation level for the connection to Snapshot.', -'PGSQL_ASSOC' => 'Passed to `pg_fetch_array`. Return an associative array of field names and values.', -'PGSQL_BAD_RESPONSE' => 'Returned by `pg_result_status`. The server\'s response was not understood.', -'PGSQL_BOTH' => 'Passed to `pg_fetch_array`. Return an array of field values that is both numerically indexed (by field number) and associated (by field name).', -'PGSQL_COMMAND_OK' => 'Returned by `pg_result_status`. Successful completion of a command returning no data.', -'PGSQL_CONNECT_ASYNC' => 'Passed to `pg_connect` to create an asynchronous connection. Added in PHP 5.6.0.', -'PGSQL_CONNECT_FORCE_NEW' => 'Passed to `pg_connect` to force the creation of a new connection, rather than re-using an existing identical connection.', -'PGSQL_CONNECTION_BAD' => 'Returned by `pg_connection_status` indicating that the database connection is in an invalid state.', -'PGSQL_CONNECTION_OK' => 'Returned by `pg_connection_status` indicating that the database connection is in a valid state.', -'PGSQL_CONV_FORCE_NULL' => 'Passed to `pg_convert`. Use SQL `NULL` in place of an empty `string`.', -'PGSQL_CONV_IGNORE_DEFAULT' => 'Passed to `pg_convert`. Ignore default values in the table during conversion.', -'PGSQL_CONV_IGNORE_NOT_NULL' => 'Passed to `pg_convert`. Ignore conversion of `null` into SQL `NOT NULL` columns.', -'PGSQL_COPY_IN' => 'Returned by `pg_result_status`. Copy In (to server) data transfer started.', -'PGSQL_COPY_OUT' => 'Returned by `pg_result_status`. Copy Out (from server) data transfer started.', -'PGSQL_DIAG_CONTEXT' => 'Passed to `pg_result_error_field`. An indication of the context in which the error occurred. Presently this includes a call stack traceback of active procedural language functions and internally-generated queries. The trace is one entry per line, most recent first.', -'PGSQL_DIAG_INTERNAL_POSITION' => 'Passed to `pg_result_error_field`. This is defined the same as the `PG_DIAG_STATEMENT_POSITION` field, but it is used when the cursor position refers to an internally generated command rather than the one submitted by the client. The `PG_DIAG_INTERNAL_QUERY` field will always appear when this field appears.', -'PGSQL_DIAG_INTERNAL_QUERY' => 'Passed to `pg_result_error_field`. The text of a failed internally-generated command. This could be, for example, a SQL query issued by a PL/pgSQL function.', -'PGSQL_DIAG_MESSAGE_DETAIL' => 'Passed to `pg_result_error_field`. Detail: an optional secondary error message carrying more detail about the problem. May run to multiple lines.', -'PGSQL_DIAG_MESSAGE_HINT' => 'Passed to `pg_result_error_field`. Hint: an optional suggestion what to do about the problem. This is intended to differ from detail in that it offers advice (potentially inappropriate) rather than hard facts. May run to multiple lines.', -'PGSQL_DIAG_MESSAGE_PRIMARY' => 'Passed to `pg_result_error_field`. The primary human-readable error message (typically one line). Always present.', -'PGSQL_DIAG_SEVERITY' => 'Passed to `pg_result_error_field`. The severity; the field contents are `ERROR`, `FATAL`, or `PANIC` (in an error message), or `WARNING`, `NOTICE`, `DEBUG`, `INFO`, or `LOG` (in a notice message), or a localized translation of one of these. Always present.', -'PGSQL_DIAG_SEVERITY_NONLOCALIZED' => 'The severity; the field contents are ERROR, FATAL, or PANIC (in an error message), or WARNING, NOTICE, DEBUG, INFO, or LOG (in a notice message). This is identical to the PG_DIAG_SEVERITY field except that the contents are never localized. This is present only in versions 9.6 and later.', -'PGSQL_DIAG_SOURCE_FILE' => 'Passed to `pg_result_error_field`. The file name of the PostgreSQL source-code location where the error was reported.', -'PGSQL_DIAG_SOURCE_FUNCTION' => 'Passed to `pg_result_error_field`. The name of the PostgreSQL source-code function reporting the error.', -'PGSQL_DIAG_SOURCE_LINE' => 'Passed to `pg_result_error_field`. The line number of the PostgreSQL source-code location where the error was reported.', -'PGSQL_DIAG_SQLSTATE' => 'Passed to `pg_result_error_field`. The SQLSTATE code for the error. The SQLSTATE code identifies the type of error that has occurred; it can be used by front-end applications to perform specific operations (such as error handling) in response to a particular database error. This field is not localizable, and is always present.', -'PGSQL_DIAG_STATEMENT_POSITION' => 'Passed to `pg_result_error_field`. A string containing a decimal integer indicating an error cursor position as an index into the original statement string. The first character has index 1, and positions are measured in characters not bytes.', -'PGSQL_DML_ASYNC' => 'Passed to `pg_insert`, `pg_select`, `pg_update` and `pg_delete`. Execute asynchronous query by these functions.', -'PGSQL_DML_ESCAPE' => 'Passed to `pg_insert`, `pg_select`, `pg_update` and `pg_delete`. Apply escape to all parameters instead of calling `pg_convert` internally. This option omits meta data look up. Query could be as fast as `pg_query` and `pg_send_query`.', -'PGSQL_DML_EXEC' => 'Passed to `pg_insert`, `pg_select`, `pg_update` and `pg_delete`. Execute query by these functions.', -'PGSQL_DML_NO_CONV' => 'Passed to `pg_insert`, `pg_select`, `pg_update` and `pg_delete`. All parameters passed as is. Manual escape is required if parameters contain user supplied data. Use `pg_escape_string` for it.', -'PGSQL_DML_STRING' => 'Passed to `pg_insert`, `pg_select`, `pg_update` and `pg_delete`. Return executed query string.', -'PGSQL_EMPTY_QUERY' => 'Returned by `pg_result_status`. The string sent to the server was empty.', -'PGSQL_ERRORS_DEFAULT' => 'Passed to `pg_set_error_verbosity`. The default mode produces messages that include the above plus any detail, hint, or context fields (these may span multiple lines).', -'PGSQL_ERRORS_TERSE' => 'Passed to `pg_set_error_verbosity`. Specified that returned messages include severity, primary text, and position only; this will normally fit on a single line.', -'PGSQL_ERRORS_VERBOSE' => 'Passed to `pg_set_error_verbosity`. The verbose mode includes all available fields.', -'PGSQL_FATAL_ERROR' => 'Returned by `pg_result_status`. A fatal error occurred.', -'PGSQL_LIBPQ_VERSION' => 'Short libpq version that contains only numbers and dots.', -'PGSQL_LIBPQ_VERSION_STR' => 'Long libpq version that includes compiler information.', -'PGSQL_NONFATAL_ERROR' => 'Returned by `pg_result_status`. A nonfatal error (a notice or warning) occurred.', -'PGSQL_NOTICE_ALL' => 'Used by `pg_last_notice`. Available since PHP 7.1.0.', -'PGSQL_NOTICE_CLEAR' => 'Used by `pg_last_notice`. Available since PHP 7.1.0.', -'PGSQL_NOTICE_LAST' => 'Used by `pg_last_notice`. Available since PHP 7.1.0.', -'PGSQL_NUM' => 'Passed to `pg_fetch_array`. Return a numerically indexed array of field numbers and values.', -'PGSQL_POLLING_ACTIVE' => 'Returned by `pg_connect_poll` to indicate that the connection is currently active.', -'PGSQL_POLLING_FAILED' => 'Returned by `pg_connect_poll` to indicate that the connection attempt failed.', -'PGSQL_POLLING_OK' => 'Returned by `pg_connect_poll` to indicate that the connection is ready to be used.', -'PGSQL_POLLING_READING' => 'Returned by `pg_connect_poll` to indicate that the connection is waiting for the PostgreSQL socket to be readable.', -'PGSQL_POLLING_WRITING' => 'Returned by `pg_connect_poll` to indicate that the connection is waiting for the PostgreSQL socket to be writable.', -'PGSQL_SEEK_CUR' => 'Passed to `pg_lo_seek`. Seek operation is to begin from the current position.', -'PGSQL_SEEK_END' => 'Passed to `pg_lo_seek`. Seek operation is to begin from the end of the object.', -'PGSQL_SEEK_SET' => 'Passed to `pg_lo_seek`. Seek operation is to begin from the start of the object.', -'PGSQL_STATUS_LONG' => 'Passed to `pg_result_status`. Indicates that numerical result code is desired.', -'PGSQL_STATUS_STRING' => 'Passed to `pg_result_status`. Indicates that textual result command tag is desired.', -'PGSQL_TRANSACTION_ACTIVE' => 'Returned by `pg_transaction_status`. A command is in progress on the connection. A query has been sent via the connection and not yet completed.', -'PGSQL_TRANSACTION_IDLE' => 'Returned by `pg_transaction_status`. Connection is currently idle, not in a transaction.', -'PGSQL_TRANSACTION_INERROR' => 'Returned by `pg_transaction_status`. The connection is idle, in a failed transaction block.', -'PGSQL_TRANSACTION_INTRANS' => 'Returned by `pg_transaction_status`. The connection is idle, in a transaction block.', -'PGSQL_TRANSACTION_UNKNOWN' => 'Returned by `pg_transaction_status`. The connection is bad.', -'PGSQL_TUPLES_OK' => 'Returned by `pg_result_status`. Successful completion of a command returning data (such as a `SELECT` or `SHOW`).', -'PHP_BINARY' => 'Specifies the PHP binary path during script execution. Available since PHP 5.4.', -'PHP_BINDIR' => 'Specifies where the binaries were installed into.', -'PHP_DEBUG' => 'Available since PHP 5.2.7.', -'PHP_EOL' => 'The correct \'End Of Line\' symbol for this platform. Available since PHP 5.0.2', -'PHP_EXTRA_VERSION' => 'The current PHP "extra" version as a string (e.g., \'-extra\' from version "5.2.7-extra"). Often used by distribution vendors to indicate a package version. Available since PHP 5.2.7.', -'PHP_FD_SETSIZE' => 'The maximum number of file descriptors for select system calls. Available as of PHP 7.1.0.', -'PHP_FLOAT_DIG' => 'Number of decimal digits that can be rounded into a float and back without precision loss. Available as of PHP 7.2.0.', -'PHP_FLOAT_EPSILON' => 'Smallest representable positive number x, so that `x + 1.0 != 1.0`. Available as of PHP 7.2.0.', -'PHP_FLOAT_MAX' => 'Largest representable floating point number. Available as of PHP 7.2.0.', -'PHP_FLOAT_MIN' => 'Smallest representable floating point number. Available as of PHP 7.2.0.', -'PHP_INT_MAX' => 'The largest integer supported in this build of PHP. Usually int(2147483647) in 32 bit systems and int(9223372036854775807) in 64 bit systems. Available since PHP 5.0.5', -'PHP_INT_MIN' => 'The smallest integer supported in this build of PHP. Usually int(-2147483648) in 32 bit systems and int(-9223372036854775808) in 64 bit systems. Available since PHP 7.0.0. Usually, PHP_INT_MIN === ~PHP_INT_MAX.', -'PHP_INT_SIZE' => 'The size of an integer in bytes in this build of PHP. Available since PHP 5.0.5', -'PHP_MAJOR_VERSION' => 'The current PHP "major" version as an integer (e.g., int(5) from version "5.2.7-extra"). Available since PHP 5.2.7.', -'PHP_MANDIR' => 'Specifies where the manpages were installed into. Available since PHP 5.3.7.', -'PHP_MAXPATHLEN' => 'The maximum length of filenames (including path) supported by this build of PHP. Available since PHP 5.3.0.', -'PHP_MINOR_VERSION' => 'The current PHP "minor" version as an integer (e.g., int(2) from version "5.2.7-extra"). Available since PHP 5.2.7.', -'PHP_OS' => 'The operating system PHP was built for.', -'PHP_OS_FAMILY' => 'The operating system family PHP was built for. Either of `\'Windows\'`, `\'BSD\'`, `\'Darwin\'`, `\'Solaris\'`, `\'Linux\'` or `\'Unknown\'`. Available as of PHP 7.2.0.', -'PHP_PREFIX' => 'The value "--prefix" was set to at configure.', -'PHP_QUERY_RFC1738' => 'Encoding is performed per RFC 1738 and the `application/x-www-form-urlencoded` media type, which implies that spaces are encoded as plus (`+`) signs.', -'PHP_QUERY_RFC3986' => 'Encoding is performed according to RFC 3986, and spaces will be percent encoded (`%20`).', -'PHP_RELEASE_VERSION' => 'The current PHP "release" version as an integer (e.g., int(7) from version "5.2.7-extra"). Available since PHP 5.2.7.', -'PHP_SAPI' => 'The Server API for this build of PHP. See also `php_sapi_name`.', -'PHP_SESSION_ACTIVE' => 'Since PHP 5.4.0. Return value of `session_status` if sessions are enabled, and a session exists.', -'PHP_SESSION_DISABLED' => 'Since PHP 5.4.0. Return value of `session_status` if sessions are disabled.', -'PHP_SESSION_NONE' => 'Since PHP 5.4.0. Return value of `session_status` if sessions are enabled, but no session exists.', -'PHP_SHLIB_SUFFIX' => 'The build-platform\'s shared library suffix, such as "so" (most Unixes) or "dll" (Windows).', -'PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS' => 'Custom property for ignoring SSL cert verification errors', -'PHP_URL_FRAGMENT' => 'Outputs the fragment (string after the hashmark #) of the URL parsed.', -'PHP_URL_HOST' => 'Outputs the hostname of the URL parsed.', -'PHP_URL_PASS' => 'Outputs the password of the URL parsed.', -'PHP_URL_PATH' => 'Outputs the path of the URL parsed.', -'PHP_URL_PORT' => 'Outputs the port of the URL parsed.', -'PHP_URL_QUERY' => 'Outputs the query string of the URL parsed.', -'PHP_URL_USER' => 'Outputs the user of the URL parsed.', -'PHP_VERSION' => 'The current PHP version as a string in "major.minor.release[extra]" notation.', -'PHP_VERSION_ID' => 'The current PHP version as an integer, useful for version comparisons (e.g., int(50207) from version "5.2.7-extra"). Available since PHP 5.2.7.', -'PHP_ZTS' => 'Available since PHP 5.2.7.', -'PHPDBG_FILE' => 'Removed as of PHP 7.3.0.', -'PHPDBG_FUNC' => 'Removed as of PHP 7.3.0.', -'PHPDBG_LINENO' => 'Removed as of PHP 7.3.0.', -'PHPDBG_METHOD' => 'Removed as of PHP 7.3.0.', -'POLL_ERR' => 'Available since PHP 5.3.0.', -'POLL_HUP' => 'Available since PHP 5.3.0.', -'POLL_IN' => 'Available since PHP 5.3.0.', -'POLL_MSG' => 'Available since PHP 5.3.0.', -'POLL_OUT' => 'Available since PHP 5.3.0.', -'POLL_PRI' => 'Available since PHP 5.3.0.', -'POSIX_F_OK' => 'Check whether the file exists.', -'POSIX_R_OK' => 'Check whether the file exists and has read permissions.', -'POSIX_RLIMIT_AS' => 'The maximum size of the process\'s address space in bytes. See also PHP\'s memory_limit configuration directive.', -'POSIX_RLIMIT_CORE' => 'The maximum size of a core file. If the limit is set to 0, no core file will be generated.', -'POSIX_RLIMIT_CPU' => 'The maximum amount of CPU time that the process can use, in seconds. When the soft limit is hit, a `SIGXCPU` signal will be sent, which can be caught with `pcntl_signal`. Depending on the operating system, additional `SIGXCPU` signals may be sent each second until the hard limit is hit, at which point an uncatchable `SIGKILL` signal is sent. - -See also `set_time_limit`.', -'POSIX_RLIMIT_DATA' => 'The maximum size of the process\'s data segment, in bytes. It is extremely unlikely that this will have any effect on the execution of PHP unless an extension is in use that calls `brk` or `sbrk`.', -'POSIX_RLIMIT_FSIZE' => 'The maximum size of files that the process can create, in bytes.', -'POSIX_RLIMIT_INFINITY' => 'Used to indicate an infinite value for a resource limit.', -'POSIX_RLIMIT_LOCKS' => 'The maximum number of locks that the process can create. This is only supported on extremely old Linux kernels.', -'POSIX_RLIMIT_MEMLOCK' => 'The maximum number of bytes that can be locked into memory.', -'POSIX_RLIMIT_MSGQUEUE' => 'The maximum number of bytes that can be allocated for POSIX message queues. PHP does not ship with support for POSIX message queues, so this limit will not have any effect unless you are using an extension that implements that support.', -'POSIX_RLIMIT_NICE' => 'The maximum value to which the process can be reniced to. The value that will be used will be `20 - limit`, as resource limit values cannot be negative.', -'POSIX_RLIMIT_NOFILE' => 'A value one greater than the maximum file descriptor number that can be opened by this process.', -'POSIX_RLIMIT_NPROC' => 'The maximum number of processes (and/or threads, on some operating systems) that can be created for the real user ID of the process.', -'POSIX_RLIMIT_RSS' => 'The maximum size of the process\'s resident set, in pages.', -'POSIX_RLIMIT_RTPRIO' => 'The maximum real time priority that can be set via the `sched_setscheduler` and `sched_setparam` system calls.', -'POSIX_RLIMIT_RTTIME' => 'The maximum amount of CPU time, in microseconds, that the process can consume without making a blocking system call if it is using real time scheduling.', -'POSIX_RLIMIT_SIGPENDING' => 'The maximum number of signals that can be queued for the real user ID of the process.', -'POSIX_RLIMIT_STACK' => 'The maximum size of the process stack, in bytes.', -'POSIX_S_IFBLK' => 'Block special file', -'POSIX_S_IFCHR' => 'Character special file', -'POSIX_S_IFIFO' => 'FIFO (named pipe) special file', -'POSIX_S_IFREG' => 'Normal file', -'POSIX_S_IFSOCK' => 'Socket', -'POSIX_W_OK' => 'Check whether the file exists and has write permissions.', -'POSIX_X_OK' => 'Check whether the file exists and has execute permissions.', -'PTHREADS_ALLOW_HEADERS' => 'Allow new Threads to send headers to standard output (normally prohibited)', -'PTHREADS_INHERIT_ALL' => 'The default options for all Threads, causes pthreads to copy the environment when new Threads are started', -'PTHREADS_INHERIT_CLASSES' => 'Inherit user declared classes when new Threads are started', -'PTHREADS_INHERIT_COMMENTS' => 'Inherit all comments when new Threads are started', -'PTHREADS_INHERIT_CONSTANTS' => 'Inherit user declared constants when new Threads are started', -'PTHREADS_INHERIT_FUNCTIONS' => 'Inherit user declared functions when new Threads are started', -'PTHREADS_INHERIT_INCLUDES' => 'Inherit included file information when new Threads are started', -'PTHREADS_INHERIT_INI' => 'Inherit INI entries when new Threads are started', -'PTHREADS_INHERIT_NONE' => 'Do not inherit anything when new Threads are started', -'RADIUS_MPPE_KEY_LEN' => 'The maximum length of MPPE keys.', -'RAR_HOST_BEOS' => 'Use `RarEntry::HOST_BEOS` instead.', -'RAR_HOST_MSDOS' => 'Use `RarEntry::HOST_MSDOS` instead.', -'RAR_HOST_OS2' => 'Use `RarEntry::HOST_OS2` instead.', -'RAR_HOST_UNIX' => 'Use `RarEntry::HOST_UNIX` instead.', -'RAR_HOST_WIN32' => 'Use `RarEntry::HOST_WIN32` instead.', -'RarEntry::ATTRIBUTE_UNIX_BLOCK_DEV' => 'Unix block devices will have attributes whose last four bits have this value. To be used with -{@see RarEntry::getAttr()} on entries whose host OS is UNIX and with the constant -{@see RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET}.', -'RarEntry::ATTRIBUTE_UNIX_CHAR_DEV' => 'Unix character devices will have attributes whose last four bits have this value. To be used with -{@see RarEntry::getAttr()} on entries whose host OS is UNIX and with the constant -{@see RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET}.', -'RarEntry::ATTRIBUTE_UNIX_DIRECTORY' => 'Unix directories will have attributes whose last four bits have this value. To be used with -{@see RarEntry::getAttr()} on entries whose host OS is UNIX and with the constant -{@see RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET}. - -See also {@see RarEntry::isDirectory()}, which also works with entries that were added in other operating -systems.', -'RarEntry::ATTRIBUTE_UNIX_FIFO' => 'Unix FIFOs will have attributes whose last four bits have this value. To be used with {@see RarEntry::getAttr()} -on entries whose host OS is UNIX and with the constant {@see RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET}.', -'RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET' => 'Mask to isolate the last four bits (nibble) of UNIX attributes (_S_IFMT, the type of file mask). To be used with -{@see RarEntry::getAttr()} on entries whose host OS is UNIX and with the constants -{@see RarEntry::ATTRIBUTE_UNIX_FIFO}, {@see RarEntry::ATTRIBUTE_UNIX_CHAR_DEV}, -{@see RarEntry::ATTRIBUTE_UNIX_DIRECTORY}, {@see RarEntry::ATTRIBUTE_UNIX_BLOCK_DEV}, -{@see RarEntry::ATTRIBUTE_UNIX_REGULAR_FILE}, -{@see RarEntry::ATTRIBUTE_UNIX_SYM_LINK} and {@see RarEntry::ATTRIBUTE_UNIX_SOCKET}.', -'RarEntry::ATTRIBUTE_UNIX_GROUP_EXECUTE' => 'Bit that represents a UNIX entry that is group executable. To be used with {@see RarEntry::getAttr()} on entries -whose host OS is UNIX.', -'RarEntry::ATTRIBUTE_UNIX_GROUP_READ' => 'Bit that represents a UNIX entry that is group readable. To be used with {@see RarEntry::getAttr()} on entries -whose host OS is UNIX.', -'RarEntry::ATTRIBUTE_UNIX_GROUP_WRITE' => 'Bit that represents a UNIX entry that is group writable. To be used with {@see RarEntry::getAttr()} on entries -whose host OS is UNIX.', -'RarEntry::ATTRIBUTE_UNIX_OWNER_EXECUTE' => 'Bit that represents a UNIX entry that is owner executable. To be used with {@see RarEntry::getAttr()} on entries -whose host OS is UNIX.', -'RarEntry::ATTRIBUTE_UNIX_OWNER_READ' => 'Bit that represents a UNIX entry that is owner readable. To be used with {@see RarEntry::getAttr()} on entries -whose host OS is UNIX.', -'RarEntry::ATTRIBUTE_UNIX_OWNER_WRITE' => 'Bit that represents a UNIX entry that is owner writable. To be used with {@see RarEntry::getAttr()} on entries -whose host OS is UNIX.', -'RarEntry::ATTRIBUTE_UNIX_REGULAR_FILE' => 'Unix regular files (not directories) will have attributes whose last four bits have this value. To be used with -{@see RarEntry::getAttr()} on entries whose host OS is UNIX and with the constant -{@see RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET}. See also {@see RarEntry::isDirectory()}, which also works with -entries that were added in other operating systems.', -'RarEntry::ATTRIBUTE_UNIX_SETGID' => 'Bit that represents the UNIX setgid attribute. To be used with {@see RarEntry::getAttr()} on entries whose host -OS is UNIX.', -'RarEntry::ATTRIBUTE_UNIX_SETUID' => 'Bit that represents the UNIX setuid attribute. To be used with {@see RarEntry::getAttr()} on entries whose host -OS is UNIX.', -'RarEntry::ATTRIBUTE_UNIX_SOCKET' => 'Unix sockets will have attributes whose last four bits have this value. To be used with -{@see RarEntry::getAttr()} on entries whose host OS is UNIX and with the constant -{@see RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET}.', -'RarEntry::ATTRIBUTE_UNIX_STICKY' => 'Bit that represents the UNIX sticky bit. To be used with {@see RarEntry::getAttr()} on entries whose host OS is -UNIX.', -'RarEntry::ATTRIBUTE_UNIX_SYM_LINK' => 'Unix symbolic links will have attributes whose last four bits have this value. To be used with -{@see RarEntry::getAttr()} on entries whose host OS is UNIX and with the constant -{@see RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET}.', -'RarEntry::ATTRIBUTE_UNIX_WORLD_EXECUTE' => 'Bit that represents a UNIX entry that is world executable. To be used with {@see RarEntry::getAttr()} on entries -whose host OS is UNIX.', -'RarEntry::ATTRIBUTE_UNIX_WORLD_READ' => 'Bit that represents a UNIX entry that is world readable. To be used with {@see RarEntry::getAttr()} on entries -whose host OS is UNIX.', -'RarEntry::ATTRIBUTE_UNIX_WORLD_WRITE' => 'Bit that represents a UNIX entry that is world writable. To be used with {@see RarEntry::getAttr()} on entries -whose host OS is UNIX.', -'RarEntry::ATTRIBUTE_WIN_ARCHIVE' => 'Bit that represents a Windows entry with an archive attribute. To be used with {@see RarEntry::getAttr()} on -entries whose host OS is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_COMPRESSED' => 'Bit that represents a Windows entry with a compressed attribute (NTFS only). To be used with -{@see RarEntry::getAttr()} on entries whose host OS is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_DEVICE' => 'Bit that represents a Windows entry with a device attribute. To be used with {@see RarEntry::getAttr()} on -entries whose host OS is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_DIRECTORY' => 'Bit that represents a Windows entry with a directory attribute (entry is a directory). To be used with -{@see RarEntry::getAttr()} on entries whose host OS is Microsoft Windows. See also -{@see RarEntry::isDirectory()}, which also works with entries that were not added in WinRAR.', -'RarEntry::ATTRIBUTE_WIN_ENCRYPTED' => 'Bit that represents a Windows entry with an encrypted attribute (NTFS only). To be used with -{@see RarEntry::getAttr()} on entries whose host OS is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_HIDDEN' => 'Bit that represents a Windows entry with a hidden attribute. To be used with {@see RarEntry::getAttr()} on -entries whose host OS is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_NORMAL' => 'Bit that represents a Windows entry with a normal file attribute (entry is NOT a directory). To be used with -{@see RarEntry::getAttr()} on entries whose host OS is Microsoft Windows. See also -{@see RarEntry::isDirectory()}, which also works with entries that were not added in WinRAR.', -'RarEntry::ATTRIBUTE_WIN_NOT_CONTENT_INDEXED' => 'Bit that represents a Windows entry with a not content indexed attribute (entry is to be indexed). To be used -with {@see RarEntry::getAttr()} on entries whose host OS is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_OFFLINE' => 'Bit that represents a Windows entry with an offline attribute (entry is offline and not accessible). To be used -with {@see RarEntry::getAttr()} on entries whose host OS is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_READONLY' => 'Bit that represents a Windows entry with a read-only attribute. To be used with {@see RarEntry::getAttr()} on -entries whose host OS is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_REPARSE_POINT' => 'Bit that represents a Windows entry with a reparse point attribute (entry is an NTFS reparse point, e.g. a -directory junction or a mount file system). To be used with {@see RarEntry::getAttr()} on entries whose host OS -is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_SPARSE_FILE' => 'Bit that represents a Windows entry with a sparse file attribute (file is an NTFS sparse file). To be used with -{@see RarEntry::getAttr()} on entries whose host OS is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_SYSTEM' => 'Bit that represents a Windows entry with a system attribute. To be used with {@see RarEntry::getAttr()} on -entries whose host OS is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_TEMPORARY' => 'Bit that represents a Windows entry with a temporary attribute. To be used with {@see RarEntry::getAttr()} on -entries whose host OS is Microsoft Windows.', -'RarEntry::ATTRIBUTE_WIN_VIRTUAL' => 'Bit that represents a Windows entry with a virtual attribute. To be used with {@see RarEntry::getAttr()} -on entries whose host OS is Microsoft Windows.', -'RarEntry::HOST_BEOS' => 'If the return value of {@see RarEntry::getHostOs()} equals this constant, BeOS was used to add this entry. -Intended to replace {@see RAR_HOST_BEOS}.', -'RarEntry::HOST_MACOS' => 'If the return value of {@see RarEntry::getHostOs()} equals this constant, Mac OS was used to add this entry.', -'RarEntry::HOST_MSDOS' => 'If the return value of {@see RarEntry::getHostOs()} equals this constant, MS-DOS was used to add this entry. -Use instead of {@see RAR_HOST_MSDOS}.', -'RarEntry::HOST_OS2' => 'If the return value of {@see RarEntry::getHostOs()} equals this constant, OS/2 was used to add this entry. -Intended to replace {@see RAR_HOST_OS2}.', -'RarEntry::HOST_UNIX' => 'If the return value of {@see RarEntry::getHostOs()} equals this constant, an unspecified UNIX OS was used to add -this entry. Intended to replace {@see RAR_HOST_UNIX}.', -'RarEntry::HOST_WIN32' => 'If the return value of {@see RarEntry::getHostOs()} equals this constant, Microsoft Windows was used to add this entry. -Intended to replace {@see RAR_HOST_WIN32}', -'RPMREADER_BASENAMES' => 'The list of the names of files in the RPM package without path information. This tag is used in conjunction with RPMREADER_DIRINDEXES and RPMREADER_DIRNAMES to reconstruct filenames in the RPM package stored with the new "CompressedFileNames" method in RPM.', -'RPMREADER_BUILDHOST' => 'The name of the host on which the RPM package was built.', -'RPMREADER_BUILDTIME' => 'The date and time when the RPM package was built.', -'RPMREADER_CHANGELOGNAME' => 'The list of changelog entry names.', -'RPMREADER_CHANGELOGTEXT' => 'The list of the text from changelog entries.', -'RPMREADER_CHANGELOGTIME' => 'The list of dates from changelog entries.', -'RPMREADER_DESCRIPTION' => 'The full description text of the RPM package.', -'RPMREADER_DIRINDEXES' => 'The list of indices that relate directory names to files in the RPM package. This tag is used in conjunction with RPMREADER_BASENAMES and RPMREADER_DIRNAMES to reconstruct filenames in the RPM package stored with the new "CompressedFileNames" method in RPM.', -'RPMREADER_DIRNAMES' => 'The list of directory names used by files in the RPM package. This tag is used in conjunction with RPMREADER_BASENAMES and RPMREADER_DIRINDEXES to reconstruct filenames in the RPM package stored with the new "CompressedFileNames" method in RPM.', -'RPMREADER_MAXIMUM' => 'The maximum valid value of any RPM tag number.', -'RPMREADER_MINIMUM' => 'The minimum valid value of any RPM tag number.', -'RPMREADER_NAME' => 'The name of the RPM package.', -'RPMREADER_OLDFILENAMES' => 'The list of files in an RPM package (deprecated format). The correct way is now to use a combination of 3 tags (RPMREADER_BASENAMES, RPMREADER_DIRINDEXES, RPMREADER_DIRNAMES) in what RPM now calls "CompressedFileNames". This tag is still used in older RPM files that did not use the "CompressedFileNames" method and is maintained for backward compatibility.', -'RPMREADER_RELEASE' => 'The release of the RPM package.', -'RPMREADER_SIZE' => 'The size of the RPM package.', -'RPMREADER_SUMMARY' => 'The summary text of the RPM package.', -'RPMREADER_VERSION' => 'The version of the RPM package.', -'RUNKIT_ACC_PRIVATE' => 'PHP 5 specific flag to `runkit_method_add` and `runkit_method_redefine`', -'RUNKIT_ACC_PROTECTED' => 'PHP 5 specific flag to `runkit_method_add` and `runkit_method_redefine`', -'RUNKIT_ACC_PUBLIC' => 'PHP 5 specific flag to `runkit_method_add` and `runkit_method_redefine`', -'RUNKIT_ACC_STATIC' => 'PHP 5 specific flag to `runkit_method_add` and `runkit_method_redefine`. Available since Runkit 1.0.1.', -'RUNKIT_IMPORT_CLASS_CONSTS' => '`runkit_import` flag indicating that class constants should be imported from the specified file. Note that this flag is only meaningful in PHP versions 5.1.0 and above.', -'RUNKIT_IMPORT_CLASS_METHODS' => '`runkit_import` flag indicating that class methods should be imported from the specified file.', -'RUNKIT_IMPORT_CLASS_PROPS' => '`runkit_import` flag indicating that class standard properties should be imported from the specified file.', -'RUNKIT_IMPORT_CLASS_STATIC_PROPS' => '`runkit_import` flag indicating that class static properties should be imported from the specified file. Available since Runkit 1.0.1.', -'RUNKIT_IMPORT_CLASSES' => '`runkit_import` flag representing a bitwise OR of the `RUNKIT_IMPORT_CLASS_*` constants.', -'RUNKIT_IMPORT_FUNCTIONS' => '`runkit_import` flag indicating that normal functions should be imported from the specified file.', -'RUNKIT_IMPORT_OVERRIDE' => '`runkit_import` flag indicating that if any of the imported functions, methods, constants, or properties already exist, they should be replaced with the new definitions. If this flag is not set, then any imported definitions which already exist will be discarded.', -'RUNKIT_VERSION' => 'Defined to the current version of the runkit package.', -'SAM_AUTO' => 'Automatic behaviour', -'SAM_BOOLEAN' => 'Type specifier used when setting properties on SAM_Message objects.', -'SAM_BUS' => 'Connect attribute used to set the name of the enterprise service bus to connect to.', -'SAM_BYTE' => 'Type specifier used when setting properties on SAM_Message objects.', -'SAM_BYTES' => 'Message body type descriptor.', -'SAM_CORRELID' => 'Attribute used on receive, send and remove requests to identify specific messages.', -'SAM_DELIVERYMODE' => 'Message header property.', -'SAM_DOUBLE' => 'Type specifier used when setting properties on SAM_Message objects.', -'SAM_ENDPOINTS' => 'Connect attribute used to define the possible endpoints to connect to.', -'SAM_FLOAT' => 'Type specifier used when setting properties on SAM_Message objects.', -'SAM_HOST' => 'Connect attribute used to set the hostname of the required messaging server.', -'SAM_INT' => 'Type specifier used when setting properties on SAM_Message objects.', -'SAM_LONG' => 'Type specifier used when setting properties on SAM_Message objects.', -'SAM_MANUAL' => 'Manual (script controlled) behaviour', -'SAM_MESSAGEID' => 'Attribute used on receive and remove requests to identify specific messages.', -'SAM_MQTT' => 'Connect protocol definition for selecting the MQTT (MQ Telemetry Transport) protocol.', -'SAM_MQTT_CLEANSTART' => 'Optional connect option to indicate to an MQTT server that all previous connection data for this client should be removed and that subscriptions should be deleted when the client disconnects explicitly or unexpectedly.', -'SAM_NON_PERSISTENT' => 'Connect attribute value used to request messages are not made persistent on the messaging server.', -'SAM_PASSWORD' => 'Connect attribute used to define the password to be used for the user account being used to connect to a messaging server that requires authorisation for connections.', -'SAM_PERSISTENT' => 'Connect attribute value used to request messages are made persistent on the messaging server to protect against loss of messages in the event of failure.', -'SAM_PORT' => 'Connect attribute used to set the port number on which to communicate with the messaging server.', -'SAM_PRIORITY' => 'Option name used on send requests to specify a delivery priority value.', -'SAM_REPLY_TO' => 'Message property used to specify the queue identity on to which the script expects response or reply messages to be posted.', -'SAM_RTT' => 'Connect protocol definition for selecting the IBM Realtime Transport protocol for communication with a business integration messaging server.', -'SAM_STRING' => 'Type specifier used when setting properties on SAM_Message objects.', -'SAM_TARGETCHAIN' => 'Connection attribute used to set the required target chain identifier.', -'SAM_TEXT' => 'Message body type descriptor.', -'SAM_TIMETOLIVE' => 'Message send option name used to specify the length of time a message should be retained in milliseconds.', -'SAM_TRANSACTIONS' => 'Connection attribute used to set required transactional behaviour. May be set to SAM_AUTO (default) or SAM_MANUAL.', -'SAM_USERID' => 'Connect attribute used to define the account to being used to connect to a messaging server that requires authorisation for connections.', -'SAM_WAIT' => 'Receive property used to specify the wait timeout to be used when receiving a message from a queue or subscription.', -'SAM_WMQ' => 'Connect protocol definition for selecting the IBM WebSphere MQSeries protocol for communication with the desired messaging server.', -'SAM_WMQ_BINDINGS' => 'Connect protocol definition for selecting the IBM WebSphere MQSeries protocol for communication with a local messaging server.', -'SAM_WMQ_CLIENT' => 'Connect protocol definition for selecting the IBM WebSphere MQSeries protocol for communication with a remote messaging server.', -'SAM_WMQ_TARGET_CLIENT' => 'Option name used on send requests to specify the target client mode. This can either be default to \'jms\' or \'mq\'. The default is \'jms\' which means an RFH2 header is sent with the message whereas the \'mq\' setting means no RFH2 is included.', -'SAM_WPM' => 'Connect protocol definition for selecting the IBM WebSphere Platform Messaging protocol for communication with a WebSphere Application Server messaging server.', -'SCANDIR_SORT_ASCENDING' => 'Available since PHP 5.4.0.', -'SCANDIR_SORT_DESCENDING' => 'Available since PHP 5.4.0.', -'SCANDIR_SORT_NONE' => 'Available since PHP 5.4.0.', -'SDO_DAS_ChangeSummary::ADDITION' => 'Represents a change type of \'addition\'.', -'SDO_DAS_ChangeSummary::DELETION' => 'Represents a change type of \'deletion\'.', -'SDO_DAS_ChangeSummary::MODIFICATION' => 'Represents a change type of \'modification\'.', -'SDO_DAS_ChangeSummary::NONE' => 'Represents a change type of \'none\'.', -'SE_NOPREFETCH' => 'Don\'t prefetch searched messages', -'SE_UID' => 'Return UIDs instead of sequence numbers', -'SEASLOG_ALERT' => '"ALERT" - Action must be taken immediately.Immediate attention should be given to relevant personnel for emergency repairs.', -'SEASLOG_ALL' => '"ALL"', -'SEASLOG_APPENDER_FILE' => '1', -'SEASLOG_APPENDER_TCP' => '2', -'SEASLOG_APPENDER_UDP' => '3', -'SEASLOG_CLOSE_LOGGER_STREAM_MOD_ALL' => '1', -'SEASLOG_CLOSE_LOGGER_STREAM_MOD_ASSIGN' => '2', -'SEASLOG_CRITICAL' => '"CRITICAL" - Critical conditions.Need to be repaired immediately, and the program component is unavailable.', -'SEASLOG_DEBUG' => '"DEBUG" - Detailed debug information.Fine-grained information events.', -'SEASLOG_DETAIL_ORDER_ASC' => '1', -'SEASLOG_DETAIL_ORDER_DESC' => '2', -'SEASLOG_EMERGENCY' => '"EMERGENCY" - System is unusable.', -'SEASLOG_ERROR' => '"ERROR" - Runtime errors that do not require immediate action but should typically.', -'SEASLOG_INFO' => '"INFO" - Interesting events.Emphasizes the running process of the application.', -'SEASLOG_NOTICE' => '"NOTICE" - Normal but significant events.Information that is more important than the INFO level during execution.', -'SEASLOG_REQUEST_VARIABLE_CLIENT_IP' => '4', -'SEASLOG_REQUEST_VARIABLE_DOMAIN_PORT' => '1', -'SEASLOG_REQUEST_VARIABLE_REQUEST_METHOD' => '3', -'SEASLOG_REQUEST_VARIABLE_REQUEST_URI' => '2', -'SEASLOG_WARNING' => '"WARNING" - Exceptional occurrences that are not errors.Potentially aberrant information that needs attention and needs to be repaired.', -'SEGV_ACCERR' => 'Available since PHP 5.3.0.', -'SEGV_MAPERR' => 'Available since PHP 5.3.0.', -'SI_ASYNCIO' => 'Available since PHP 5.3.0.', -'SI_KERNEL' => 'Available since PHP 5.3.0.', -'SI_MSGGQ' => 'Available since PHP 5.3.0.', -'SI_NOINFO' => 'Available since PHP 5.3.0.', -'SI_QUEUE' => 'Available since PHP 5.3.0.', -'SI_SIGIO' => 'Available since PHP 5.3.0.', -'SI_TIMER' => 'Available since PHP 5.3.0.', -'SI_TKILL' => 'Available since PHP 5.3.0.', -'SI_USER' => 'Available since PHP 5.3.0.', -'SID' => 'Constant containing either the session name and session ID in the form of `"name=ID"` or empty string if session ID was set in an appropriate session cookie. This is the same id as the one returned by `session_id`.', -'SIG_BLOCK' => 'Available since PHP 5.3.0.', -'SIG_SETMASK' => 'Available since PHP 5.3.0.', -'SIG_UNBLOCK' => 'Available since PHP 5.3.0.', -'SNMP_OID_OUTPUT_FULL' => 'As of 5.2.0', -'SNMP_OID_OUTPUT_MODULE' => 'As of 5.4.0', -'SNMP_OID_OUTPUT_NONE' => 'As of 5.4.0', -'SNMP_OID_OUTPUT_NUMERIC' => 'As of 5.2.0', -'SNMP_OID_OUTPUT_SUFFIX' => 'As of 5.4.0', -'SNMP_OID_OUTPUT_UCD' => 'As of 5.4.0', -'SO_REUSEPORT' => 'This constant is only available in PHP 5.4.10 or later on platforms that support the `SO_REUSEPORT` socket option: this includes macOS and FreeBSD, but does not include Linux or Windows.', -'SOCKET_ADDRINUSE' => 'Address already in use.', -'SOCKET_E2BIG' => 'Arg list too long.', -'SOCKET_EACCES' => 'Permission denied.', -'SOCKET_EADDRNOTAVAIL' => 'Cannot assign requested address.', -'SOCKET_EADV' => 'Advertise error.', -'SOCKET_EAFNOSUPPORT' => 'Address family not supported by protocol.', -'SOCKET_EAGAIN' => 'Try again.', -'SOCKET_EALREADY' => 'Operation already in progress.', -'SOCKET_EBADE' => 'Invalid exchange.', -'SOCKET_EBADF' => 'Bad file number.', -'SOCKET_EBADFD' => 'File descriptor in bad state.', -'SOCKET_EBADMSG' => 'Not a data message.', -'SOCKET_EBADR' => 'Invalid request descriptor.', -'SOCKET_EBADRQC' => 'Invalid request code.', -'SOCKET_EBADSLT' => 'Invalid slot.', -'SOCKET_EBUSY' => 'Device or resource busy.', -'SOCKET_ECHRNG' => 'Channel number out of range.', -'SOCKET_ECOMM' => 'Communication error on send.', -'SOCKET_ECONNABORTED' => 'Software caused connection abort.', -'SOCKET_ECONNREFUSED' => 'Connection refused.', -'SOCKET_ECONNRESET' => 'Connection reset by peer.', -'SOCKET_EDESTADDRREQ' => 'Destination address required.', -'SOCKET_EDQUOT' => 'Quota exceeded.', -'SOCKET_EEXIST' => 'File exists.', -'SOCKET_EFAULT' => 'Bad address.', -'SOCKET_EHOSTDOWN' => 'Host is down.', -'SOCKET_EHOSTUNREACH' => 'No route to host.', -'SOCKET_EIDRM' => 'Identifier removed.', -'SOCKET_EINPROGRESS' => 'Operation now in progress.', -'SOCKET_EINTR' => 'Interrupted system call.', -'SOCKET_EINVAL' => 'Invalid argument.', -'SOCKET_EIO' => 'I/O error.', -'SOCKET_EISCONN' => 'Transport endpoint is already connected.', -'SOCKET_EISDIR' => 'Is a directory.', -'SOCKET_EISNAM' => 'Is a named type file.', -'SOCKET_EL2HLT' => 'Level 2 halted.', -'SOCKET_EL2NSYNC' => 'Level 2 not synchronized.', -'SOCKET_EL3HLT' => 'Level 3 halted.', -'SOCKET_EL3RST' => 'Level 3 reset.', -'SOCKET_ELNRNG' => 'Link number out of range.', -'SOCKET_ELOOP' => 'Too many symbolic links encountered.', -'SOCKET_EMEDIUMTYPE' => 'Wrong medium type.', -'SOCKET_EMFILE' => 'Too many open files.', -'SOCKET_EMLINK' => 'Too many links.', -'SOCKET_EMSGSIZE' => 'Message too long.', -'SOCKET_EMULTIHOP' => 'Multihop attempted.', -'SOCKET_ENAMETOOLONG' => 'File name too long.', -'SOCKET_ENETDOWN' => 'Network is down.', -'SOCKET_ENETRESET' => 'Network dropped connection because of reset.', -'SOCKET_ENETUNREACH' => 'Network is unreachable.', -'SOCKET_ENFILE' => 'File table overflow.', -'SOCKET_ENOANO' => 'No anode.', -'SOCKET_ENOBUFS' => 'No buffer space available.', -'SOCKET_ENOCSI' => 'No CSI structure available.', -'SOCKET_ENODATA' => 'No data available.', -'SOCKET_ENODEV' => 'No such device.', -'SOCKET_ENOENT' => 'No such file or directory.', -'SOCKET_ENOLCK' => 'No record locks available.', -'SOCKET_ENOLINK' => 'Link has been severed.', -'SOCKET_ENOMEDIUM' => 'No medium found.', -'SOCKET_ENOMEM' => 'Out of memory.', -'SOCKET_ENOMSG' => 'No message of desired type.', -'SOCKET_ENONET' => 'Machine is not on the network.', -'SOCKET_ENOSPC' => 'No space left on device.', -'SOCKET_ENOSR' => 'Out of streams resources.', -'SOCKET_ENOSTR' => 'Device not a stream.', -'SOCKET_ENOSYS' => 'Function not implemented.', -'SOCKET_ENOTBLK' => 'Block device required.', -'SOCKET_ENOTCONN' => 'Transport endpoint is not connected.', -'SOCKET_ENOTDIR' => 'Not a directory.', -'SOCKET_ENOTEMPTY' => 'Directory not empty.', -'SOCKET_ENOTSOCK' => 'Socket operation on non-socket.', -'SOCKET_ENOTTY' => 'Not a typewriter.', -'SOCKET_ENOTUNIQ' => 'Name not unique on network.', -'SOCKET_ENXIO' => 'No such device or address.', -'SOCKET_EOPNOTSUPP' => 'Operation not supported on transport endpoint.', -'SOCKET_EPERM' => 'Operation not permitted.', -'SOCKET_EPFNOSUPPORT' => 'Protocol family not supported.', -'SOCKET_EPIPE' => 'Broken pipe.', -'SOCKET_EPROTO' => 'Protocol error.', -'SOCKET_EPROTONOSUPPORT' => 'Protocol not supported.', -'SOCKET_EPROTOOPT' => 'Protocol not available.', -'SOCKET_EPROTOTYPE' => 'Protocol wrong type for socket.', -'SOCKET_EREMCHG' => 'Remote address changed.', -'SOCKET_EREMOTE' => 'Object is remote.', -'SOCKET_EREMOTEIO' => 'Remote I/O error.', -'SOCKET_ERESTART' => 'Interrupted system call should be restarted.', -'SOCKET_EROFS' => 'Read-only file system.', -'SOCKET_ESHUTDOWN' => 'Cannot send after transport endpoint shutdown.', -'SOCKET_ESOCKTNOSUPPORT' => 'Socket type not supported.', -'SOCKET_ESPIPE' => 'Illegal seek.', -'SOCKET_ESRMNT' => 'Srmount error.', -'SOCKET_ESTRPIPE' => 'Streams pipe error.', -'SOCKET_ETIME' => 'Timer expired.', -'SOCKET_ETIMEDOUT' => 'Connection timed out.', -'SOCKET_ETOOMANYREFS' => 'Too many references: cannot splice.', -'SOCKET_EUNATCH' => 'Protocol driver not attached.', -'SOCKET_EUSERS' => 'Too many users.', -'SOCKET_EWOULDBLOCK' => 'Operation would block.', -'SOCKET_EXDEV' => 'Cross-device link.', -'SOCKET_EXFULL' => 'Exchange full.', -'Sodium\CRYPTO_AEAD_AES256GCM_KEYBYTES' => 'To silence the phpstorm "unknown namespace" errors.', -'SolrClient::DEFAULT_PING_SERVLET' => 'This is the initial value for the ping servlet.', -'SolrClient::DEFAULT_SEARCH_SERVLET' => 'This is the initial value for the search servlet.', -'SolrClient::DEFAULT_SYSTEM_SERVLET' => 'This is the initial value for the system servlet used to obtain Solr Server information.', -'SolrClient::DEFAULT_TERMS_SERVLET' => 'This is the initial value for the terms servlet used for the TermsComponent.', -'SolrClient::DEFAULT_THREADS_SERVLET' => 'This is the initial value for the threads servlet.', -'SolrClient::DEFAULT_UPDATE_SERVLET' => 'This is the initial value for the update servlet.', -'SolrClient::PING_SERVLET_TYPE' => 'Used when updating the ping servlet.', -'SolrClient::SEARCH_SERVLET_TYPE' => 'Used when updating the search servlet.', -'SolrClient::SYSTEM_SERVLET_TYPE' => 'Used when retrieving system information from the system servlet.', -'SolrClient::TERMS_SERVLET_TYPE' => 'Used when updating the terms servlet.', -'SolrClient::THREADS_SERVLET_TYPE' => 'Used when updating the threads servlet.', -'SolrClient::UPDATE_SERVLET_TYPE' => 'Used when updating the update servlet.', -'SolrDisMaxQuery::FACET_SORT_COUNT' => 'Used to specify that the facet should sort by count', -'SolrDisMaxQuery::FACET_SORT_INDEX' => 'Used to specify that the facet should sort by index', -'SolrDisMaxQuery::ORDER_ASC' => 'Used to specify that the sorting should be in acending order', -'SolrDisMaxQuery::ORDER_DESC' => 'Used to specify that the sorting should be in descending order', -'SolrDisMaxQuery::TERMS_SORT_COUNT' => 'Used in the TermsComponent', -'SolrDisMaxQuery::TERMS_SORT_INDEX' => 'Used in the TermsComponent', -'SolrDocument::SORT_ASC' => 'Sorts the fields in ascending order.', -'SolrDocument::SORT_DEFAULT' => 'Sorts the fields in ascending order.', -'SolrDocument::SORT_DESC' => 'Sorts the fields in descending order.', -'SolrDocument::SORT_FIELD_BOOST_VALUE' => 'Sorts the fields by boost value.', -'SolrDocument::SORT_FIELD_NAME' => 'Sorts the fields by name', -'SolrDocument::SORT_FIELD_VALUE_COUNT' => 'Sorts the fields by number of values.', -'SolrGenericResponse::PARSE_SOLR_DOC' => 'Documents should be parsed as SolrDocument instances.', -'SolrGenericResponse::PARSE_SOLR_OBJ' => 'Documents should be parsed as SolrObject instances', -'SolrInputDocument::SORT_ASC' => 'Sorts the fields in ascending order.', -'SolrInputDocument::SORT_DEFAULT' => 'Sorts the fields in ascending order.', -'SolrInputDocument::SORT_DESC' => 'Sorts the fields in descending order.', -'SolrInputDocument::SORT_FIELD_BOOST_VALUE' => 'Sorts the fields by boost value.', -'SolrInputDocument::SORT_FIELD_NAME' => 'Sorts the fields by name', -'SolrInputDocument::SORT_FIELD_VALUE_COUNT' => 'Sorts the fields by number of values.', -'SolrPingResponse::PARSE_SOLR_DOC' => 'Documents should be parsed as SolrDocument instances.', -'SolrPingResponse::PARSE_SOLR_OBJ' => 'Documents should be parsed as SolrObject instances', -'SolrQuery::FACET_SORT_COUNT' => 'Used to specify that the facet should sort by count', -'SolrQuery::FACET_SORT_INDEX' => 'Used to specify that the facet should sort by index', -'SolrQuery::ORDER_ASC' => 'Used to specify that the sorting should be in acending order', -'SolrQuery::ORDER_DESC' => 'Used to specify that the sorting should be in descending order', -'SolrQuery::TERMS_SORT_COUNT' => 'Used in the TermsComponent', -'SolrQuery::TERMS_SORT_INDEX' => 'Used in the TermsComponent', -'SolrQueryResponse::PARSE_SOLR_DOC' => 'Documents should be parsed as SolrDocument instances.', -'SolrQueryResponse::PARSE_SOLR_OBJ' => 'Documents should be parsed as SolrObject instances', -'SolrResponse::PARSE_SOLR_DOC' => 'Documents should be parsed as SolrDocument instances.', -'SolrResponse::PARSE_SOLR_OBJ' => 'Documents should be parsed as SolrObject instances', -'SolrUpdateResponse::PARSE_SOLR_DOC' => 'Documents should be parsed as SolrDocument instances.', -'SolrUpdateResponse::PARSE_SOLR_OBJ' => 'Documents should be parsed as SolrObject instances', -'SORT_ASC' => '`SORT_ASC` is used with `array_multisort` to sort in ascending order.', -'SORT_DESC' => '`SORT_DESC` is used with `array_multisort` to sort in descending order.', -'SORT_FLAG_CASE' => '`SORT_FLAG_CASE` can be combined (bitwise OR) with `SORT_STRING` or `SORT_NATURAL` to sort strings case-insensitively. Added in PHP 5.4.0.', -'SORT_LOCALE_STRING' => '`SORT_LOCALE_STRING` is used to compare items as strings, based on the current locale. Added in PHP 5.0.2.', -'SORT_NATURAL' => '`SORT_NATURAL` is used to compare items as strings using "natural ordering" like `natsort`. Added in PHP 5.4.0.', -'SORT_NUMERIC' => '`SORT_NUMERIC` is used to compare items numerically.', -'SORT_REGULAR' => '`SORT_REGULAR` is used to compare items normally.', -'SORT_STRING' => '`SORT_STRING` is used to compare items as strings.', -'SORTARRIVAL' => 'Sort criteria for `imap_sort`: arrival date', -'SORTCC' => 'Sort criteria for `imap_sort`: mailbox in first cc address', -'SORTDATE' => 'Sort criteria for `imap_sort`: message Date', -'SORTFROM' => 'Sort criteria for `imap_sort`: mailbox in first From address', -'SORTSIZE' => 'Sort criteria for `imap_sort`: size of message in octets', -'SORTSUBJECT' => 'Sort criteria for `imap_sort`: message subject', -'SORTTO' => 'Sort criteria for `imap_sort`: mailbox in first To address', -'SplType::__default' => 'Default value', -'SQLBIT' => 'Indicates the \'`BIT`\' type in MSSQL, used by `mssql_bind`\'s `type` parameter.', -'SQLCHAR' => 'Indicates the \'`CHAR`\' type in MSSQL, used by `mssql_bind`\'s `type` parameter.', -'SQLFLT4' => 'Represents an four byte float.', -'SQLFLT8' => 'Represents an eight byte float.', -'SQLINT1' => 'Represents one byte, with a range of -128 to 127.', -'SQLINT2' => 'Represents two bytes, with a range of -32768 to 32767.', -'SQLINT4' => 'Represents four bytes, with a range of -2147483648 to 2147483647.', -'SQLITE3_ASSOC' => 'Specifies that the `Sqlite3Result::fetchArray` method shall return an array indexed by column name as returned in the corresponding result set.', -'SQLITE3_BLOB' => 'Represents the SQLite3 BLOB storage class.', -'SQLITE3_BOTH' => 'Specifies that the `Sqlite3Result::fetchArray` method shall return an array indexed by both column name and number as returned in the corresponding result set, starting at column 0.', -'SQLITE3_DETERMINISTIC' => 'Specifies that a function created with `SQLite3::createFunction` is deterministic, i.e. it always returns the same result given the same inputs within a single SQL statement. (Available as of PHP 7.1.4.)', -'SQLITE3_FLOAT' => 'Represents the SQLite3 REAL (FLOAT) storage class.', -'SQLITE3_INTEGER' => 'Represents the SQLite3 INTEGER storage class.', -'SQLITE3_NULL' => 'Represents the SQLite3 NULL storage class.', -'SQLITE3_NUM' => 'Specifies that the `Sqlite3Result::fetchArray` method shall return an array indexed by column number as returned in the corresponding result set, starting at column 0.', -'SQLITE3_OPEN_CREATE' => 'Specifies that the SQLite3 database be created if it does not already exist.', -'SQLITE3_OPEN_READONLY' => 'Specifies that the SQLite3 database be opened for reading only.', -'SQLITE3_OPEN_READWRITE' => 'Specifies that the SQLite3 database be opened for reading and writing.', -'SQLITE3_TEXT' => 'Represents the SQLite3 TEXT storage class.', -'SQLITE_ABORT' => 'Callback routine requested an abort.', -'SQLITE_ASSOC' => 'Columns are returned into the array having the field name as the array index.', -'SQLITE_AUTH' => 'Authorized failed.', -'SQLITE_BOTH' => 'Columns are returned into the array having both a numerical index and the field name as the array index.', -'SQLITE_BUSY' => 'The database file is locked.', -'SQLITE_CANTOPEN' => 'Unable to open the database file.', -'SQLITE_CONSTRAINT' => 'Abort due to constraint violation.', -'SQLITE_CORRUPT' => 'The database disk image is malformed.', -'SQLITE_DONE' => 'Internal process has finished executing.', -'SQLITE_EMPTY' => '(Internal) Database table is empty.', -'SQLITE_ERROR' => 'SQL error or missing database.', -'SQLITE_FORMAT' => 'Auxiliary database format error.', -'SQLITE_FULL' => 'Insertion failed because database is full.', -'SQLITE_INTERNAL' => 'An internal logic error in SQLite.', -'SQLITE_INTERRUPT' => 'Operation terminated internally.', -'SQLITE_IOERR' => 'Disk I/O error occurred.', -'SQLITE_LOCKED' => 'A table in the database is locked.', -'SQLITE_MISMATCH' => 'Data type mismatch.', -'SQLITE_MISUSE' => 'Library used incorrectly.', -'SQLITE_NOLFS' => 'Uses of OS features not supported on host.', -'SQLITE_NOMEM' => 'Memory allocation failed.', -'SQLITE_NOTADB' => 'File opened that is not a database file.', -'SQLITE_NOTFOUND' => '(Internal) Table or record not found.', -'SQLITE_NUM' => 'Columns are returned into the array having a numerical index to the fields. This index starts with 0, the first field in the result.', -'SQLITE_OK' => 'Successful result.', -'SQLITE_PERM' => 'Access permission denied.', -'SQLITE_PROTOCOL' => 'Database lock protocol error.', -'SQLITE_READONLY' => 'Attempt to write a readonly database.', -'SQLITE_ROW' => 'Internal process has another row ready.', -'SQLITE_SCHEMA' => 'The database schema changed.', -'SQLITE_TOOBIG' => 'Too much data for one row of a table.', -'SQLSRV_CURSOR_BUFFERED' => 'Creates a client-side cursor query. Lets you access rows in any order. For usage information, see Specifying a Cursor Type and Selecting Rows.', -'SQLSRV_CURSOR_DYNAMIC' => 'Indicates a dynamic cursor. For usage information, see Specifying a Cursor Type and Selecting Rows.', -'SQLSRV_CURSOR_FORWARD' => 'Indicates a forward-only cursor. For usage information, see Specifying a Cursor Type and Selecting Rows.', -'SQLSRV_CURSOR_KEYSET' => 'Indicates a keyset cursor. For usage information, see Specifying a Cursor Type and Selecting Rows.', -'SQLSRV_CURSOR_STATIC' => 'Indicates a static cursor. For usage information, see Specifying a Cursor Type and Selecting Rows.', -'SQLSRV_ENC_BINARY' => 'Specifies that data is returned as a raw byte stream from the server without performing encoding or translation. For usage information, see How to: Specify PHP Types.', -'SQLSRV_ENC_CHAR' => 'Data is returned in 8-bit characters as specified in the code page of the Windows locale that is set on the system. Any multi-byte characters or characters that do not map into this code page are substituted with a single byte question mark (?) character. This is the default encoding. For usage information, see How to: Specify PHP Types.', -'SQLSRV_ERR_ALL' => 'Forces `sqlsrv_errors` to return both errors and warings when passed as a parameter (the default behavior).', -'SQLSRV_ERR_ERRORS' => 'Forces `sqlsrv_errors` to return errors only (no warnings) when passed as a parameter.', -'SQLSRV_ERR_WARNINGS' => 'Forces `sqlsrv_errors` to return warnings only (no errors) when passed as a parameter.', -'SQLSRV_FETCH_ASSOC' => 'Forces `sqlsrv_fetch_array` to return an associative array when passed as a parameter.', -'SQLSRV_FETCH_BOTH' => 'Forces `sqlsrv_fetch_array` to return an array with both associative and numeric keys when passed as a parameter (the default behavior).', -'SQLSRV_FETCH_NUMERIC' => 'Forces `sqlsrv_fetch_array` to return an array with numeric when passed as a parameter.', -'SQLSRV_LOG_SEVERITY_ALL' => 'Specifies that errors, warnings, and notices will be logged when passed to `sqlsrv_configure` as a parameter.', -'SQLSRV_LOG_SEVERITY_ERROR' => 'Specifies that errors will be logged when passed to `sqlsrv_configure` as a parameter.', -'SQLSRV_LOG_SEVERITY_NOTICE' => 'Specifies that notices will be logged when passed to `sqlsrv_configure` as a parameter.', -'SQLSRV_LOG_SEVERITY_WARNING' => 'Specifies that warnings will be logged when passed to `sqlsrv_configure` as a parameter.', -'SQLSRV_LOG_SYSTEM_ALL' => 'Turns on logging of all subsystems when passed to `sqlsrv_configure` as a parameter.', -'SQLSRV_LOG_SYSTEM_CONN' => 'Turns on logging of connection activity when passed to `sqlsrv_configure` as a parameter.', -'SQLSRV_LOG_SYSTEM_INIT' => 'Turns on logging of initialization activity when passed to `sqlsrv_configure` as a parameter.', -'SQLSRV_LOG_SYSTEM_OFF' => 'Turns off logging of all subsystems when passed to `sqlsrv_configure` as a parameter.', -'SQLSRV_LOG_SYSTEM_STMT' => 'Turns on logging of statement activity when passed to `sqlsrv_configure` as a parameter.', -'SQLSRV_LOG_SYSTEM_UTIL' => 'Turns on logging of error function activity when passed to `sqlsrv_configure` as a parameter.', -'SQLSRV_NULLABLE_NO' => 'Indicates that a column is not nullable.', -'SQLSRV_NULLABLE_UNKNOWN' => 'Indicates that it is not known if a column is nullable.', -'SQLSRV_NULLABLE_YES' => 'Indicates that a column is nullable.', -'SQLSRV_PARAM_IN' => 'Indicates an input parameter when passed to `sqlsrv_query` or `sqlsrv_prepare`.', -'SQLSRV_PARAM_INOUT' => 'Indicates a bidirectional parameter when passed to `sqlsrv_query` or `sqlsrv_prepare`.', -'SQLSRV_PARAM_OUT' => 'Indicates an output parameter when passed to `sqlsrv_query` or `sqlsrv_prepare`.', -'SQLSRV_PHPTYPE_DATETIME' => 'Specifies a datetime PHP data type. For usage information, see How to: Specify PHP Types.', -'SQLSRV_PHPTYPE_FLOAT' => 'Specifies a float PHP data type. For usage information, see How to: Specify PHP Types.', -'SQLSRV_PHPTYPE_INT' => 'Specifies an integer PHP data type. For usage information, see How to: Specify PHP Types.', -'SQLSRV_PHPTYPE_STREAM' => 'Specifies a PHP stream. This constant works like a function and accepts an encoding constant. See the SQLSRV_ENC_* constants. For usage information, see How to: Specify PHP Types.', -'SQLSRV_PHPTYPE_STRING' => 'Specifies a string PHP data type. This constant works like a function and accepts an encoding constant. See the SQLSRV_ENC_* constants. For usage information, see How to: Specify PHP Types.', -'SQLSRV_SCROLL_ABSOLUTE' => 'Specifies which row to select in a result set. For usage information, see Specifying a Cursor Type and Selecting Rows.', -'SQLSRV_SCROLL_FIRST' => 'Specifies which row to select in a result set. For usage information, see Specifying a Cursor Type and Selecting Rows.', -'SQLSRV_SCROLL_LAST' => 'Specifies which row to select in a result set. For usage information, see Specifying a Cursor Type and Selecting Rows.', -'SQLSRV_SCROLL_NEXT' => 'Specifies which row to select in a result set. For usage information, see Specifying a Cursor Type and Selecting Rows.', -'SQLSRV_SCROLL_PRIOR' => 'Specifies which row to select in a result set. For usage information, see Specifying a Cursor Type and Selecting Rows.', -'SQLSRV_SCROLL_RELATIVE' => 'Specifies which row to select in a result set. For usage information, see Specifying a Cursor Type and Selecting Rows.', -'SQLSRV_SQLTYPE_BIGINT' => 'Describes the bigint SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_BINARY' => 'Describes the binary SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_BIT' => 'Describes the bit SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_CHAR' => 'Describes the char SQL Server data type. This constant works like a function and accepts a parameter indicating the number characters. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_DATE' => 'Describes the date SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_DATETIME' => 'Describes the datetime SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_DATETIME2' => 'Describes the datetime2 SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_DATETIMEOFFSET' => 'Describes the datetimeoffset SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_DECIMAL' => 'Describes the decimal SQL Server data type. This constant works like a function and accepts two parameters indicating (in order) precision and scale. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_FLOAT' => 'Describes the float SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_IMAGE' => 'Describes the image SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_INT' => 'Describes the int SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_MONEY' => 'Describes the money SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_NCHAR' => 'Describes the nchar SQL Server data type. This constant works like a function and accepts a single parameter indicating the character count. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_NTEXT' => 'Describes the ntext SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_NUMERIC' => 'Describes the numeric SQL Server data type. This constant works like a function and accepts two parameter indicating (in order) precision and scale. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_NVARCHAR' => 'Describes the nvarchar(MAX) SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_REAL' => 'Describes the real SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_SMALLDATETIME' => 'Describes the smalldatetime SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_SMALLINT' => 'Describes the smallint SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_SMALLMONEY' => 'Describes the smallmoney SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_TEXT' => 'Describes the text SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_TIME' => 'Describes the time SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_TIMESTAMP' => 'Describes the timestamp SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_TINYINT' => 'Describes the tinyint SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_UDT' => 'Describes the UDT SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_UNIQUEIDENTIFIER' => 'Describes the uniqueidentifier SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_VARBINARY' => 'Describes the varbinary(MAX) SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_VARCHAR' => 'Describes the varchar(MAX) SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_SQLTYPE_XML' => 'Describes the XML SQL Server data type. For usage information, see How to: Specify SQL Types.', -'SQLSRV_TXN_READ_COMMITTED' => 'Indicates a transaction isolation level of READ COMMITTED. This value is used to set the TransactionIsolation level in the $connectionOptions array passed to `sqlsrv_connect`.', -'SQLSRV_TXN_READ_SERIALIZABLE' => 'Indicates a transaction isolation level of SERIALIZABLE. This value is used to set the TransactionIsolation level in the $connectionOptions array passed to `sqlsrv_connect`.', -'SQLSRV_TXN_READ_UNCOMMITTED' => 'Indicates a transaction isolation level of READ UNCOMMITTED. This value is used to set the TransactionIsolation level in the $connectionOptions array passed to `sqlsrv_connect`.', -'SQLSRV_TXN_REPEATABLE_READ' => 'Indicates a transaction isolation level of REPEATABLE READ. This value is used to set the TransactionIsolation level in the $connectionOptions array passed to `sqlsrv_connect`.', -'SQLSRV_TXN_SNAPSHOT' => 'Indicates a transaction isolation level of SNAPSHOT. This value is used to set the TransactionIsolation level in the $connectionOptions array passed to `sqlsrv_connect`.', -'SQLTEXT' => 'Indicates the \'`TEXT`\' type in MSSQL, used by `mssql_bind`\'s `type` parameter.', -'SQLVARCHAR' => 'Indicates the \'`VARCHAR`\' type in MSSQL, used by `mssql_bind`\'s `type` parameter.', -'SSH2_DEFAULT_TERM_HEIGHT' => 'Default terminal height requested by `ssh2_shell`.', -'SSH2_DEFAULT_TERM_UNIT' => 'Default terminal units requested by `ssh2_shell`.', -'SSH2_DEFAULT_TERM_WIDTH' => 'Default terminal width requested by `ssh2_shell`.', -'SSH2_DEFAULT_TERMINAL' => 'Default terminal type (e.g. vt102, ansi, xterm, vanilla) requested by `ssh2_shell`.', -'SSH2_FINGERPRINT_HEX' => 'Flag to `ssh2_fingerprint` requesting hostkey fingerprint as a string of hexits.', -'SSH2_FINGERPRINT_MD5' => 'Flag to `ssh2_fingerprint` requesting hostkey fingerprint as an MD5 hash.', -'SSH2_FINGERPRINT_RAW' => 'Flag to `ssh2_fingerprint` requesting hostkey fingerprint as a raw string of 8-bit characters.', -'SSH2_FINGERPRINT_SHA1' => 'Flag to `ssh2_fingerprint` requesting hostkey fingerprint as an SHA1 hash.', -'SSH2_STREAM_STDERR' => 'Flag to `ssh2_fetch_stream` requesting STDERR subchannel.', -'SSH2_STREAM_STDIO' => 'Flag to `ssh2_fetch_stream` requesting STDIO subchannel.', -'SSH2_TERM_UNIT_CHARS' => 'Flag to `ssh2_shell` specifying that width and height are provided as character sizes.', -'SSH2_TERM_UNIT_PIXELS' => 'Flag to `ssh2_shell` specifying that width and height are provided in pixel units.', -'ST_UID' => 'The sequence argument contains UIDs instead of sequence numbers', -'SUNFUNCS_RET_DOUBLE' => 'Hours as floating point number (example 8.75)', -'SUNFUNCS_RET_STRING' => 'Hours:minutes (example: 08:02)', -'SUNFUNCS_RET_TIMESTAMP' => 'Timestamp', -'SVN_AUTH_PARAM_DEFAULT_PASSWORD' => 'Property for default password to use when performing basic authentication', -'SVN_AUTH_PARAM_DEFAULT_USERNAME' => 'Property for default username to use when performing basic authentication', -'SVN_FS_CONFIG_FS_TYPE' => 'Configuration key that determines filesystem type', -'SVN_FS_TYPE_BDB' => 'Filesystem is Berkeley-DB implementation', -'SVN_FS_TYPE_FSFS' => 'Filesystem is native-filesystem implementation', -'SVN_NODE_DIR' => 'Directory', -'SVN_NODE_FILE' => 'File', -'SVN_NODE_NONE' => 'Absent', -'SVN_NODE_UNKNOWN' => 'Something Subversion cannot identify', -'SVN_PROP_REVISION_AUTHOR' => 'svn:author', -'SVN_PROP_REVISION_DATE' => 'svn:date', -'SVN_PROP_REVISION_LOG' => 'svn:log', -'SVN_PROP_REVISION_ORIG_DATE' => 'svn:original-date', -'SVN_REVISION_HEAD' => 'Magic number (-1) specifying the HEAD revision', -'SVN_WC_STATUS_ADDED' => 'Item is scheduled for addition', -'SVN_WC_STATUS_CONFLICTED' => 'Item\'s local modifications conflicted with repository modifications', -'SVN_WC_STATUS_DELETED' => 'Item is scheduled for deletion', -'SVN_WC_STATUS_EXTERNAL' => 'Unversioned path that is populated using svn:externals', -'SVN_WC_STATUS_IGNORED' => 'Item is unversioned but configured to be ignored', -'SVN_WC_STATUS_INCOMPLETE' => 'Directory does not contain complete entries list', -'SVN_WC_STATUS_MERGED' => 'Item\'s local modifications were merged with repository modifications', -'SVN_WC_STATUS_MISSING' => 'Item is versioned but missing from the working copy', -'SVN_WC_STATUS_MODIFIED' => 'Item (text or properties) was modified', -'SVN_WC_STATUS_NONE' => 'Status does not exist', -'SVN_WC_STATUS_NORMAL' => 'Item exists, nothing else is happening', -'SVN_WC_STATUS_OBSTRUCTED' => 'Unversioned item is in the way of a versioned resource', -'SVN_WC_STATUS_REPLACED' => 'Item was deleted and then re-added', -'SVN_WC_STATUS_UNVERSIONED' => 'Item is not versioned in working copy', -'TCP_NODELAY' => 'Used to disable Nagle TCP algorithm. Added in PHP 5.2.7.', -'TRAP_BRKPT' => 'Available since PHP 5.3.0.', -'TRAP_TRACE' => 'Available since PHP 5.3.0.', -'TYPEAPPLICATION' => 'Primary body type: application data', -'TYPEAUDIO' => 'Primary body type: audio', -'TYPEIMAGE' => 'Primary body type: static image', -'TYPEMESSAGE' => 'Primary body type: encapsulated message', -'TYPEMODEL' => 'Primary body type: model', -'TYPEMULTIPART' => 'Primary body type: multiple part', -'TYPEOTHER' => 'Primary body type: unknown', -'TYPETEXT' => 'Primary body type: unformatted text', -'TYPEVIDEO' => 'Primary body type: video', -'UTF-8' => 'Specifies that data is returned with UTF-8 encoding. For usage information, see How to: Specify PHP Types.', -'XATTR_CREATE' => 'Function will fail if extended attribute already exists.', -'XATTR_DONTFOLLOW' => 'Do not follow the symbolic link but operate on symbolic link itself.', -'XATTR_REPLACE' => 'Function will fail if extended attribute doesn\'t exist.', -'XATTR_ROOT' => 'Set attribute in root (trusted) namespace. Requires root privileges.', -'XDIFF_PATCH_NORMAL' => 'This flag indicates that `xdiff_string_patch` and `xdiff_file_patch` functions should create result by applying patch to original content thus creating newer version of file. This is the default mode of operation.', -'XDIFF_PATCH_REVERSE' => 'This flag indicated that `xdiff_string_patch` and `xdiff_file_patch` functions should create result by reversing patch changed from newer content thus creating original version.', -'XHPROF_FLAGS_CPU' => 'Used to add CPU profiling information to the output.', -'XHPROF_FLAGS_MEMORY' => 'Used to add memory profiling information to the output.', -'XHPROF_FLAGS_NO_BUILTINS' => 'Used to skip all built-in (internal) functions.', -'XML_SAX_IMPL' => 'Holds the SAX implementation method. Can be `libxml` or `expat`.', -'XSL_SECPREF_CREATE_DIRECTORY' => 'Disallows creating directories.', -'XSL_SECPREF_DEFAULT' => 'Disallows all write access, i.e. a bitmask of `XSL_SECPREF_WRITE_NETWORK` | `XSL_SECPREF_CREATE_DIRECTORY` | `XSL_SECPREF_WRITE_FILE`.', -'XSL_SECPREF_NONE' => 'Deactivate all security restrictions.', -'XSL_SECPREF_READ_FILE' => 'Disallows reading files.', -'XSL_SECPREF_READ_NETWORK' => 'Disallows reading network files.', -'XSL_SECPREF_WRITE_FILE' => 'Disallows writing files.', -'XSL_SECPREF_WRITE_NETWORK' => 'Disallows writing network files.', -'YAML_ANY_BREAK' => 'Let emitter choose linebreak character.', -'YAML_ANY_ENCODING' => 'Let the emitter choose an encoding.', -'YAML_BOOL_TAG' => '"tag:yaml.org,2002:bool"', -'YAML_CR_BREAK' => 'Use `\r` as break character (Mac style).', -'YAML_CRLN_BREAK' => 'Use `\r\n` as break character (DOS style).', -'YAML_FLOAT_TAG' => '"tag:yaml.org,2002:float"', -'YAML_INT_TAG' => '"tag:yaml.org,2002:int"', -'YAML_LN_BREAK' => 'Use `\n` as break character (Unix style).', -'YAML_MAP_TAG' => '"tag:yaml.org,2002:map"', -'YAML_NULL_TAG' => '"tag:yaml.org,2002:null"', -'YAML_PHP_TAG' => '"!php/object"', -'YAML_SEQ_TAG' => '"tag:yaml.org,2002:seq"', -'YAML_STR_TAG' => '"tag:yaml.org,2002:str"', -'YAML_TIMESTAMP_TAG' => '"tag:yaml.org,2002:timestamp"', -'YAML_UTF16BE_ENCODING' => 'Encode as UTF16BE.', -'YAML_UTF16LE_ENCODING' => 'Encode as UTF16LE.', -'YAML_UTF8_ENCODING' => 'Encode as UTF8.', -'YAR_OPT_HEADER' => 'Since 2.0.4', -'YPERR_ACCESS' => 'access violation (this has only been added recently and is only available from PECL SVN for now)', -'YPERR_BADARGS' => 'The function arguments are bad', -'YPERR_BADDB' => 'YP database is bad', -'YPERR_BUSY' => 'Database busy', -'YPERR_DOMAIN' => 'cannot bind to server in this domain', -'YPERR_KEY' => 'no such key in map', -'YPERR_MAP' => 'no such map in server\'s domain', -'YPERR_NODOM' => 'Local domain name not set', -'YPERR_NOMORE' => 'No more records in map database', -'YPERR_PMAP' => 'Can\'t communicate with portmapper', -'YPERR_RESRC' => 'resource allocation failure', -'YPERR_RPC' => 'RPC failure - domain has been unbound', -'YPERR_VERS' => 'YP version mismatch', -'YPERR_YPBIND' => 'Can\'t communicate with ypbind', -'YPERR_YPERR' => 'internal yp server or client error', -'YPERR_YPSERV' => 'Can\'t communicate with ypserv', -'ZEND_ACC_ABSTRACT' => 'Mark function as abstract', -'ZEND_ACC_CLASS' => 'Dummy registered for consistency, the default kind of class entry. Removed as of uopz 5.0.0.', -'ZEND_ACC_FETCH' => 'Used for getting flags only. Removed as of uopz 5.0.0.', -'ZEND_ACC_FINAL' => 'Mark function as final', -'ZEND_ACC_INTERFACE' => 'Mark class as interface. Removed as of uopz 5.0.0.', -'ZEND_ACC_PRIVATE' => 'Mark function as private', -'ZEND_ACC_PROTECTED' => 'Mark function as protected', -'ZEND_ACC_PUBLIC' => 'Mark function as public, the default', -'ZEND_ACC_STATIC' => 'Mark function as static', -'ZEND_ACC_TRAIT' => 'Mark class as trait. Removed as of uopz 5.0.0.', -'ZEND_ADD_INTERFACE' => 'Invoked upon composure, receives the class the interface is being added to as the first argument, and the name of the interface as the second argument', -'ZEND_ADD_TRAIT' => 'Invoked upon composure, receives the class the trait is being added to as the first argument, and the name of the trait as the second argument', -'ZEND_EXIT' => 'Invoked by exit() and die(), receives no arguments. Return boolean `true` to exit, `false` to continue', -'ZEND_FETCH_CLASS' => 'Invoked upon composure, receives the class the name of the class being fetched as the only argument', -'ZEND_INSTANCEOF' => 'Invoked by instanceof operator, receives the object being verified as the first argument, and the name of the class which that object should be as the second argument', -'ZEND_NEW' => 'Invoked by object construction, receives the class of object being created as the only argument', -'ZEND_THROW' => 'Invoked by the throw construct, receives the class of exception being thrown as the only argument', -'ZEND_USER_OPCODE_CONTINUE' => 'Advance 1 opcode and continuue', -'ZEND_USER_OPCODE_DISPATCH' => 'Dispatch to original opcode handler', -'ZEND_USER_OPCODE_DISPATCH_TO' => 'Dispatch to a specific handler (OR\'d with ZEND opcode constant)', -'ZEND_USER_OPCODE_ENTER' => 'Enter into new op_array without recursion', -'ZEND_USER_OPCODE_LEAVE' => 'Return to calling op_array within the same executor', -'ZEND_USER_OPCODE_RETURN' => 'Exit from executor (return from function)', -'ZipArchive::CHECKCONS' => 'Perform additional consistency checks on the archive, and error if they fail.', -'ZipArchive::CM_BZIP2' => 'BZIP2 algorithm', -'ZipArchive::CM_DEFAULT' => 'better of deflate or store.', -'ZipArchive::CM_DEFLATE' => 'deflated', -'ZipArchive::CM_DEFLATE64' => 'deflate64', -'ZipArchive::CM_IMPLODE' => 'imploded', -'ZipArchive::CM_PKWARE_IMPLODE' => 'PKWARE imploding', -'ZipArchive::CM_REDUCE_1' => 'reduced with factor 1', -'ZipArchive::CM_REDUCE_2' => 'reduced with factor 2', -'ZipArchive::CM_REDUCE_3' => 'reduced with factor 3', -'ZipArchive::CM_REDUCE_4' => 'reduced with factor 4', -'ZipArchive::CM_SHRINK' => 'shrunk', -'ZipArchive::CM_STORE' => 'stored (uncompressed).', -'ZipArchive::CREATE' => 'Create the archive if it does not exist.', -'ZipArchive::EM_AES_128' => 'AES 128 encryption, since PHP 7.2.0, PECL zip 1.14.0', -'ZipArchive::EM_AES_192' => 'AES 1192 encryption, since PHP 7.2.0, PECL zip 1.14.0', -'ZipArchive::EM_AES_256' => 'AES 256 encryption, since PHP 7.2.0, PECL zip 1.14.0', -'ZipArchive::EM_NONE' => 'No encryption, since PHP 7.2.0, PECL zip 1.14.0', -'ZipArchive::ER_CHANGED' => 'Entry has been changed', -'ZipArchive::ER_CLOSE' => 'Closing zip archive failed', -'ZipArchive::ER_COMPNOTSUPP' => 'Compression method not supported.', -'ZipArchive::ER_CRC' => 'CRC error', -'ZipArchive::ER_DELETED' => 'Entry has been deleted', -'ZipArchive::ER_EOF' => 'Premature EOF', -'ZipArchive::ER_EXISTS' => 'File already exists', -'ZipArchive::ER_INCONS' => 'Zip archive inconsistent', -'ZipArchive::ER_INTERNAL' => 'Internal error', -'ZipArchive::ER_INVAL' => 'Invalid argument', -'ZipArchive::ER_MEMORY' => 'Memory allocation failure', -'ZipArchive::ER_MULTIDISK' => 'Multi-disk zip archives not supported.', -'ZipArchive::ER_NOENT' => 'No such file.', -'ZipArchive::ER_NOZIP' => 'Not a zip archive', -'ZipArchive::ER_OK' => 'No error.', -'ZipArchive::ER_OPEN' => 'Can\'t open file', -'ZipArchive::ER_READ' => 'Read error', -'ZipArchive::ER_REMOVE' => 'Can\'t remove file', -'ZipArchive::ER_RENAME' => 'Renaming temporary file failed.', -'ZipArchive::ER_SEEK' => 'Seek error', -'ZipArchive::ER_TMPOPEN' => 'Failure to create temporary file.', -'ZipArchive::ER_WRITE' => 'Write error', -'ZipArchive::ER_ZIPCLOSED' => 'Containing zip archive was closed', -'ZipArchive::ER_ZLIB' => 'Zlib error', -'ZipArchive::EXCL' => 'Error if archive already exists.', -'ZipArchive::FL_COMPRESSED' => 'Read compressed data', -'ZipArchive::FL_ENC_CP437' => 'String is CP437 encoded. Available as of PHP 7.0.8.', -'ZipArchive::FL_ENC_GUESS' => 'Guess string encoding (is default). Available as of PHP 7.0.8.', -'ZipArchive::FL_ENC_RAW' => 'Get unmodified string. Available as of PHP 7.0.8.', -'ZipArchive::FL_ENC_STRICT' => 'Follow specification strictly. Available as of PHP 7.0.8.', -'ZipArchive::FL_ENC_UTF_8' => 'String is UTF-8 encoded. Available as of PHP 7.0.8.', -'ZipArchive::FL_NOCASE' => 'Ignore case on name lookup', -'ZipArchive::FL_NODIR' => 'Ignore directory component', -'ZipArchive::FL_UNCHANGED' => 'Use original data, ignoring changes.', -'ZipArchive::OPSYS_DOS' => 'Since PHP 5.6.0, PECL zip 1.12.4', -'ZipArchive::OVERWRITE' => 'If archive exists, ignore its current contents. In other words, handle it the same way as an empty archive.', -'ZLIB_BLOCK' => 'Available as of PHP 7.0.0.', -'ZLIB_DEFAULT_STRATEGY' => 'Available as of PHP 7.0.0.', -'ZLIB_ENCODING_DEFLATE' => 'ZLIB compression algorithm as per RFC 1950. Available as of PHP 7.0.0.', -'ZLIB_ENCODING_GZIP' => 'GZIP algorithm as per RFC 1952. Available as of PHP 7.0.0.', -'ZLIB_ENCODING_RAW' => 'DEFLATE algorithm as per RFC 1951. Available as of PHP 7.0.0.', -'ZLIB_FILTERED' => 'Available as of PHP 7.0.0.', -'ZLIB_FINISH' => 'Available as of PHP 7.0.0.', -'ZLIB_FIXED' => 'Available as of PHP 7.0.0.', -'ZLIB_FULL_FLUSH' => 'Available as of PHP 7.0.0.', -'ZLIB_HUFFMAN_ONLY' => 'Available as of PHP 7.0.0.', -'ZLIB_NO_FLUSH' => 'Available as of PHP 7.0.0.', -'ZLIB_PARTIAL_FLUSH' => 'Available as of PHP 7.0.0.', -'ZLIB_RLE' => 'Available as of PHP 7.0.0.', -'ZLIB_SYNC_FLUSH' => 'Available as of PHP 7.0.0.', -'ZMQ::CTXOPT_MAX_SOCKETS' => 'The socket limit for this context. -Available if compiled against ZeroMQ 3.x or higher', -'ZMQ::DEVICE_FORWARDER' => 'Forwarder device', -'ZMQ::DEVICE_QUEUE' => 'Queue device', -'ZMQ::DEVICE_STREAMER' => 'Streamer device', -'ZMQ::ERR_EAGAIN' => 'Implies that the operation would block when ZMQ::MODE_DONTWAIT is used', -'ZMQ::ERR_EFSM' => 'The operation can not be executed because the socket is not in correct state', -'ZMQ::ERR_ENOTSUP' => 'The operation is not supported by the socket type', -'ZMQ::ERR_ETERM' => 'The context has been terminated', -'ZMQ::ERR_INTERNAL' => 'ZMQ extension internal error', -'ZMQ::MODE_DONTWAIT' => 'Non-blocking operation', -'ZMQ::MODE_NOBLOCK' => 'Non-blocking operation.', -'ZMQ::MODE_SNDMORE' => 'Send multi-part message', -'ZMQ::POLL_IN' => 'Poll for incoming data', -'ZMQ::POLL_OUT' => 'Poll for outgoing data', -'ZMQ::SOCKET_DEALER' => 'Extended REQ socket that load balances to all connected peers', -'ZMQ::SOCKET_PAIR' => 'Exclusive pair pattern', -'ZMQ::SOCKET_PUB' => 'Publisher socket', -'ZMQ::SOCKET_PULL' => 'Pipeline downstream pull socket', -'ZMQ::SOCKET_PUSH' => 'Pipeline upstream push socket', -'ZMQ::SOCKET_REP' => 'Reply socket', -'ZMQ::SOCKET_REQ' => 'Request socket', -'ZMQ::SOCKET_ROUTER' => 'Extended REP socket that can route replies to requesters', -'ZMQ::SOCKET_STREAM' => 'Used to send and receive TCP data from a non-ØMQ peer. -Available if compiled against ZeroMQ 4.x or higher.', -'ZMQ::SOCKET_SUB' => 'Subscriber socket', -'ZMQ::SOCKET_XPUB' => 'Similar to SOCKET_PUB, except you can receive subscriptions as messages. -The subscription message is 0 (unsubscribe) or 1 (subscribe) followed by the topic.', -'ZMQ::SOCKET_XREP' => 'Alias for SOCKET_ROUTER', -'ZMQ::SOCKET_XREQ' => 'Alias for SOCKET_DEALER', -'ZMQ::SOCKET_XSUB' => 'Similar to SOCKET_SUB, except you can send subscriptions as messages. See SOCKET_XPUB for format.', -'ZMQ::SOCKOPT_AFFINITY' => 'Set I/O thread affinity', -'ZMQ::SOCKOPT_BACKLOG' => 'The SOCKOPT_BACKLOG option shall set the maximum length of the queue of outstanding peer connections -for the specified socket; this only applies to connection-oriented transports.', -'ZMQ::SOCKOPT_DELAY_ATTACH_ON_CONNECT' => 'Set a CIDR string to match against incoming TCP connections. -Available if compiled against ZeroMQ 3.x or higher', -'ZMQ::SOCKOPT_HWM' => 'The high water mark for inbound and outbound messages is a hard -limit on the maximum number of outstanding messages ØMQ shall queue in memory -for any single peer that the specified socket is communicating with. -Setting this option on a socket will only affect connections made after the option has been set. -On ZeroMQ 3.x this is a wrapper for setting both SNDHWM and RCVHWM.', -'ZMQ::SOCKOPT_IDENTITY' => 'Set socket identity', -'ZMQ::SOCKOPT_IPV4ONLY' => 'Disable IPV6 support if 1. -Available if compiled against ZeroMQ 3.x', -'ZMQ::SOCKOPT_IPV6' => 'Enable IPV6. -Available if compiled against ZeroMQ 4.0 or higher', -'ZMQ::SOCKOPT_LAST_ENDPOINT' => 'Retrieve the last connected endpoint - for use with * wildcard ports. -Available if compiled against ZeroMQ 3.x or higher', -'ZMQ::SOCKOPT_LINGER' => 'The linger value of the socket. -Specifies how long the socket blocks trying flush messages after it has been closed', -'ZMQ::SOCKOPT_MAXMSGSIZE' => 'Limits the maximum size of the inbound message. Value -1 means no limit. -Available if compiled against ZeroMQ 3.x or higher', -'ZMQ::SOCKOPT_MCAST_LOOP' => 'Control multicast loopback (Value: int >= 0)', -'ZMQ::SOCKOPT_RATE' => 'Set rate for multicast sockets (pgm) (Value: int >= 0)', -'ZMQ::SOCKOPT_RCVBUF' => 'Set kernel receive buffer size (Value: int >= 0)', -'ZMQ::SOCKOPT_RCVHWM' => 'The ZMQ_SNDHWM option shall set the high water mark for inbound messages on the specified socket. -Available if compiled against ZeroMQ 3.x or higher.', -'ZMQ::SOCKOPT_RCVMORE' => 'Receive multi-part messages', -'ZMQ::SOCKOPT_RCVTIMEO' => 'Sets the timeout for receive operation on the socket. Value -1 means no limit. -Available if compiled against ZeroMQ 3.x or higher', -'ZMQ::SOCKOPT_RECONNECT_IVL' => 'Set the initial reconnection interval (Value: int >= 0)', -'ZMQ::SOCKOPT_RECONNECT_IVL_MAX' => 'Set the max reconnection interval (Value: int >= 0)', -'ZMQ::SOCKOPT_RECOVERY_IVL' => 'Set multicast recovery interval (Value: int >= 0)', -'ZMQ::SOCKOPT_ROUTER_RAW' => 'Sets the raw mode on the ROUTER, when set to 1. -In raw mode when using tcp:// transport the socket will read and write without ZeroMQ framing. -Available if compiled against ZeroMQ 4.0 or higher', -'ZMQ::SOCKOPT_SNDBUF' => 'Set kernel transmit buffer size (Value: int >= 0)', -'ZMQ::SOCKOPT_SNDHWM' => 'The ZMQ_SNDHWM option shall set the high water mark for outbound messages on the specified socket. -Available if compiled against ZeroMQ 3.x or higher.', -'ZMQ::SOCKOPT_SNDTIMEO' => 'Sets the timeout for send operation on the socket. Value -1 means no limit. -Available if compiled against ZeroMQ 3.x or higher', -'ZMQ::SOCKOPT_SUBSCRIBE' => 'Establish message filter. Valid for subscriber socket', -'ZMQ::SOCKOPT_TCP_ACCEPT_FILTER' => 'Set a CIDR string to match against incoming TCP connections. -Available if compiled against ZeroMQ 3.x or higher', -'ZMQ::SOCKOPT_TCP_KEEPALIVE_CNT' => 'Count time for TCP keepalive. -Available if compiled against ZeroMQ 3.x or higher', -'ZMQ::SOCKOPT_TCP_KEEPALIVE_IDLE' => 'Idle time for TCP keepalive. -Available if compiled against ZeroMQ 3.x or higher', -'ZMQ::SOCKOPT_TCP_KEEPALIVE_INTVL' => 'Interval for TCP keepalive. -Available if compiled against ZeroMQ 3.x or higher', -'ZMQ::SOCKOPT_TYPE' => 'Get the socket type. Valid for getSockOpt', -'ZMQ::SOCKOPT_UNSUBSCRIBE' => 'Remove message filter. Valid for subscriber socket', -'ZMQ::SOCKOPT_XPUB_VERBOSE' => 'Set the XPUB to receive an application message on each instance of a subscription. -Available if compiled against ZeroMQ 3.x or higher', -]; diff --git a/vendor/phan/phan/src/Phan/Language/Internal/DynamicPropertyMap.php b/vendor/phan/phan/src/Phan/Language/Internal/DynamicPropertyMap.php deleted file mode 100644 index 5c2d468..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/DynamicPropertyMap.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Internal; - -/** - * A list of classes that support dynamic properties. These have - * been manually entered. - */ -return [ - 'stdclass', - 'simplexmlelement', - 'solrobject', - 'v8js', -]; diff --git a/vendor/phan/phan/src/Phan/Language/Internal/FunctionDocumentationMap.php b/vendor/phan/phan/src/Phan/Language/Internal/FunctionDocumentationMap.php deleted file mode 100644 index 72c3b5f..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/FunctionDocumentationMap.php +++ /dev/null @@ -1,16360 +0,0 @@ -<?php // phpcs:ignoreFile -namespace Phan\Language\Internal; - -/** - * This contains descriptions used by Phan for hover text of internal functions and methods in the language server mode. - * - * Format - * - * '<function_name>' => 'documentation', - * - * NOTE: This format will very likely change as information is added and should not be used directly. - * - * Sources of function/method summary info: - * - * 1. 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 - * 2. Various websites documenting individual extensions (e.g. php-ast) - * 3. 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) - * - * CONTRIBUTING: - * - * Running `internal/internalstubs.php` can be used to update signature maps - * - * There are no plans for these signatures to diverge from what the above upstream sources contain. - * - * - If the descriptions cause Phan to crash, bug reports are welcome - * - If Phan improperly extracted text from a summary (and this affects multiple signatures), patches fixing the extraction will be accepted. - * - Otherwise, fixes for typos/grammar/inaccuracies in the summary will only be accepted once they are contributed upstream and can be regenerated (e.g. to the svn repo for docs.php.net). - * - * Note that the summaries are used in a wide variety of contexts, and what makes sense for Phan may not make sense for those projects, and vice versa. - */ -return [ -'__halt_compiler' => 'Halts the compiler execution', -'abs' => 'Absolute value', -'acos' => 'Arc cosine', -'acosh' => 'Inverse hyperbolic cosine', -'addcslashes' => 'Quote string with slashes in a C style', -'addslashes' => 'Quote string with slashes', -'AMQPBasicProperties::getAppId' => 'Get the application id of the message.', -'AMQPBasicProperties::getClusterId' => 'Get the cluster id of the message.', -'AMQPBasicProperties::getContentEncoding' => 'Get the content encoding of the message.', -'AMQPBasicProperties::getContentType' => 'Get the message content type.', -'AMQPBasicProperties::getCorrelationId' => 'Get the message correlation id.', -'AMQPBasicProperties::getDeliveryMode' => 'Get the delivery mode of the message.', -'AMQPBasicProperties::getExpiration' => 'Get the expiration of the message.', -'AMQPBasicProperties::getHeaders' => 'Get the headers of the message.', -'AMQPBasicProperties::getMessageId' => 'Get the message id of the message.', -'AMQPBasicProperties::getPriority' => 'Get the priority of the message.', -'AMQPBasicProperties::getReplyTo' => 'Get the reply-to address of the message.', -'AMQPBasicProperties::getTimestamp' => 'Get the timestamp of the message.', -'AMQPBasicProperties::getType' => 'Get the message type.', -'AMQPBasicProperties::getUserId' => 'Get the message user id.', -'AMQPChannel::__construct' => 'Create an instance of an AMQPChannel object.', -'AMQPChannel::basicRecover' => 'Redeliver unacknowledged messages.', -'AMQPChannel::close' => 'Closes the channel.', -'AMQPChannel::commitTransaction' => 'Commit a pending transaction.', -'AMQPChannel::confirmSelect' => 'Set the channel to use publisher acknowledgements. This can only used on a non-transactional channel.', -'AMQPChannel::getChannelId' => 'Return internal channel ID', -'AMQPChannel::getConnection' => 'Get the AMQPConnection object in use', -'AMQPChannel::getConsumers' => 'Return array of current consumers where key is consumer and value is AMQPQueue consumer is running on', -'AMQPChannel::getPrefetchCount' => 'Get the number of messages to prefetch from the broker.', -'AMQPChannel::getPrefetchSize' => 'Get the window size to prefetch from the broker.', -'AMQPChannel::isConnected' => 'Check the channel connection.', -'AMQPChannel::qos' => 'Set the Quality Of Service settings for the given channel. - -Specify the amount of data to prefetch in terms of window size (octets) -or number of messages from a queue during a AMQPQueue::consume() or -AMQPQueue::get() method call. The client will prefetch data up to size -octets or count messages from the server, whichever limit is hit first. -Setting either value to 0 will instruct the client to ignore that -particular setting. A call to AMQPChannel::qos() will overwrite any -values set by calling AMQPChannel::setPrefetchSize() and -AMQPChannel::setPrefetchCount(). If the call to either -AMQPQueue::consume() or AMQPQueue::get() is done with the AMQP_AUTOACK -flag set, the client will not do any prefetching of data, regardless of -the QOS settings.', -'AMQPChannel::rollbackTransaction' => 'Rollback a transaction. - -Rollback an existing transaction. AMQPChannel::startTransaction() must -be called prior to this.', -'AMQPChannel::setConfirmCallback' => 'Set callback to process basic.ack and basic.nac AMQP server methods (applicable when channel in confirm mode).', -'AMQPChannel::setPrefetchCount' => 'Set the number of messages to prefetch from the broker. - -Set the number of messages to prefetch from the broker during a call to -AMQPQueue::consume() or AMQPQueue::get(). Any call to this method will -automatically set the prefetch window size to 0, meaning that the -prefetch window size setting will be ignored.', -'AMQPChannel::setPrefetchSize' => 'Set the window size to prefetch from the broker. - -Set the prefetch window size, in octets, during a call to -AMQPQueue::consume() or AMQPQueue::get(). Any call to this method will -automatically set the prefetch message count to 0, meaning that the -prefetch message count setting will be ignored. If the call to either -AMQPQueue::consume() or AMQPQueue::get() is done with the AMQP_AUTOACK -flag set, this setting will be ignored.', -'AMQPChannel::setReturnCallback' => 'Set callback to process basic.return AMQP server method', -'AMQPChannel::startTransaction' => 'Start a transaction. - -This method must be called on the given channel prior to calling -AMQPChannel::commitTransaction() or AMQPChannel::rollbackTransaction().', -'AMQPChannel::waitForBasicReturn' => 'Start wait loop for basic.return AMQP server methods', -'AMQPChannel::waitForConfirm' => 'Wait until all messages published since the last call have been either ack\'d or nack\'d by the broker. - -Note, this method also catch all basic.return message from server.', -'AMQPConnection::__construct' => 'Create an instance of AMQPConnection. - -Creates an AMQPConnection instance representing a connection to an AMQP -broker. A connection will not be established until -AMQPConnection::connect() is called. - - $credentials = array( - \'host\' => amqp.host The host to connect too. Note: Max 1024 characters. - \'port\' => amqp.port Port on the host. - \'vhost\' => amqp.vhost The virtual host on the host. Note: Max 128 characters. - \'login\' => amqp.login The login name to use. Note: Max 128 characters. - \'password\' => amqp.password Password. Note: Max 128 characters. - \'read_timeout\' => Timeout in for income activity. Note: 0 or greater seconds. May be fractional. - \'write_timeout\' => Timeout in for outcome activity. Note: 0 or greater seconds. May be fractional. - \'connect_timeout\' => Connection timeout. Note: 0 or greater seconds. May be fractional. - - Connection tuning options (see https://www.rabbitmq.com/amqp-0-9-1-reference.html#connection.tune for details): - \'channel_max\' => Specifies highest channel number that the server permits. 0 means standard extension limit - (see PHP_AMQP_MAX_CHANNELS constant) - \'frame_max\' => The largest frame size that the server proposes for the connection, including frame header - and end-byte. 0 means standard extension limit (depends on librabbimq default frame size limit) - \'heartbeat\' => The delay, in seconds, of the connection heartbeat that the server wants. - 0 means the server does not want a heartbeat. Note, librabbitmq has limited heartbeat support, - which means heartbeats checked only during blocking calls. - - TLS support (see https://www.rabbitmq.com/ssl.html for details): - \'cacert\' => Path to the CA cert file in PEM format.. - \'cert\' => Path to the client certificate in PEM format. - \'key\' => Path to the client key in PEM format. - \'verify\' => Enable or disable peer verification. If peer verification is enabled then the common name in the - server certificate must match the server name. Peer verification is enabled by default. -)', -'AMQPConnection::connect' => 'Establish a transient connection with the AMQP broker. - -This method will initiate a connection with the AMQP broker.', -'AMQPConnection::disconnect' => 'Closes the transient connection with the AMQP broker. - -This method will close an open connection with the AMQP broker.', -'AMQPConnection::getCACert' => 'Get path to the CA cert file in PEM format', -'AMQPConnection::getCert' => 'Get path to the client certificate in PEM format', -'AMQPConnection::getHeartbeatInterval' => 'Get number of seconds between heartbeats of the connection in seconds. - -When connection is connected, effective connection value returned, which is normally the same as original -correspondent value passed to constructor, otherwise original value passed to constructor returned.', -'AMQPConnection::getHost' => 'Get the configured host.', -'AMQPConnection::getKey' => 'Get path to the client key in PEM format', -'AMQPConnection::getLogin' => 'Get the configured login.', -'AMQPConnection::getMaxChannels' => 'Get the maximum number of channels the connection can handle. - -When connection is connected, effective connection value returned, which is normally the same as original -correspondent value passed to constructor, otherwise original value passed to constructor returned.', -'AMQPConnection::getMaxFrameSize' => 'Get max supported frame size per connection in bytes. - -When connection is connected, effective connection value returned, which is normally the same as original -correspondent value passed to constructor, otherwise original value passed to constructor returned.', -'AMQPConnection::getPassword' => 'Get the configured password.', -'AMQPConnection::getPort' => 'Get the configured port.', -'AMQPConnection::getReadTimeout' => 'Get the configured interval of time to wait for income activity -from AMQP broker', -'AMQPConnection::getTimeout' => 'Get the configured interval of time to wait for income activity -from AMQP broker', -'AMQPConnection::getUsedChannels' => 'Return last used channel id during current connection session.', -'AMQPConnection::getVerify' => 'Get whether peer verification enabled or disabled', -'AMQPConnection::getVhost' => 'Get the configured vhost.', -'AMQPConnection::getWriteTimeout' => 'Get the configured interval of time to wait for outcome activity -to AMQP broker', -'AMQPConnection::isConnected' => 'Check whether the connection to the AMQP broker is still valid. - -It does so by checking the return status of the last connect-command.', -'AMQPConnection::isPersistent' => 'Whether connection persistent. - -When connection is not connected, boolean false always returned', -'AMQPConnection::pconnect' => 'Establish a persistent connection with the AMQP broker. - -This method will initiate a connection with the AMQP broker -or reuse an existing one if present.', -'AMQPConnection::pdisconnect' => 'Closes a persistent connection with the AMQP broker. - -This method will close an open persistent connection with the AMQP -broker.', -'AMQPConnection::preconnect' => 'Close any open persistent connections and initiate a new one with the AMQP broker.', -'AMQPConnection::reconnect' => 'Close any open transient connections and initiate a new one with the AMQP broker.', -'AMQPConnection::setCACert' => 'Set path to the CA cert file in PEM format', -'AMQPConnection::setCert' => 'Set path to the client certificate in PEM format', -'AMQPConnection::setHost' => 'Set the hostname used to connect to the AMQP broker.', -'AMQPConnection::setKey' => 'Set path to the client key in PEM format', -'AMQPConnection::setLogin' => 'Set the login string used to connect to the AMQP broker.', -'AMQPConnection::setPassword' => 'Set the password string used to connect to the AMQP broker.', -'AMQPConnection::setPort' => 'Set the port used to connect to the AMQP broker.', -'AMQPConnection::setReadTimeout' => 'Sets the interval of time to wait for income activity from AMQP broker', -'AMQPConnection::setTimeout' => 'Sets the interval of time to wait for income activity from AMQP broker', -'AMQPConnection::setVerify' => 'Enable or disable peer verification', -'AMQPConnection::setVhost' => 'Sets the virtual host to which to connect on the AMQP broker.', -'AMQPConnection::setWriteTimeout' => 'Sets the interval of time to wait for outcome activity to AMQP broker', -'AMQPEnvelope::getAppId' => 'Get the application id of the message.', -'AMQPEnvelope::getBody' => 'Get the body of the message.', -'AMQPEnvelope::getClusterId' => 'Get the cluster id of the message.', -'AMQPEnvelope::getConsumerTag' => 'Get the consumer tag of the message.', -'AMQPEnvelope::getContentEncoding' => 'Get the content encoding of the message.', -'AMQPEnvelope::getContentType' => 'Get the message content type.', -'AMQPEnvelope::getCorrelationId' => 'Get the message correlation id.', -'AMQPEnvelope::getDeliveryMode' => 'Get the delivery mode of the message.', -'AMQPEnvelope::getDeliveryTag' => 'Get the delivery tag of the message.', -'AMQPEnvelope::getExchangeName' => 'Get the exchange name on which the message was published.', -'AMQPEnvelope::getExpiration' => 'Get the expiration of the message.', -'AMQPEnvelope::getHeader' => 'Get a specific message header.', -'AMQPEnvelope::getHeaders' => 'Get the headers of the message.', -'AMQPEnvelope::getMessageId' => 'Get the message id of the message.', -'AMQPEnvelope::getPriority' => 'Get the priority of the message.', -'AMQPEnvelope::getReplyTo' => 'Get the reply-to address of the message.', -'AMQPEnvelope::getRoutingKey' => 'Get the routing key of the message.', -'AMQPEnvelope::getTimestamp' => 'Get the timestamp of the message.', -'AMQPEnvelope::getType' => 'Get the message type.', -'AMQPEnvelope::getUserId' => 'Get the message user id.', -'AMQPEnvelope::hasHeader' => 'Check whether specific message header exists.', -'AMQPEnvelope::isRedelivery' => 'Whether this is a redelivery of the message. - -Whether this is a redelivery of a message. If this message has been -delivered and AMQPEnvelope::nack() was called, the message will be put -back on the queue to be redelivered, at which point the message will -always return TRUE when this method is called.', -'AMQPExchange::__construct' => 'Create an instance of AMQPExchange. - -Returns a new instance of an AMQPExchange object, associated with the -given AMQPChannel object.', -'AMQPExchange::bind' => 'Bind to another exchange. - -Bind an exchange to another exchange using the specified routing key.', -'AMQPExchange::declareExchange' => 'Declare a new exchange on the broker.', -'AMQPExchange::delete' => 'Delete the exchange from the broker.', -'AMQPExchange::getArgument' => 'Get the argument associated with the given key.', -'AMQPExchange::getArguments' => 'Get all arguments set on the given exchange.', -'AMQPExchange::getChannel' => 'Get the AMQPChannel object in use', -'AMQPExchange::getConnection' => 'Get the AMQPConnection object in use', -'AMQPExchange::getFlags' => 'Get all the flags currently set on the given exchange.', -'AMQPExchange::getName' => 'Get the configured name.', -'AMQPExchange::getType' => 'Get the configured type.', -'AMQPExchange::hasArgument' => 'Check whether argument associated with the given key exists.', -'AMQPExchange::publish' => 'Publish a message to an exchange. - -Publish a message to the exchange represented by the AMQPExchange object.', -'AMQPExchange::setArgument' => 'Set the value for the given key.', -'AMQPExchange::setArguments' => 'Set all arguments on the exchange.', -'AMQPExchange::setFlags' => 'Set the flags on an exchange.', -'AMQPExchange::setName' => 'Set the name of the exchange.', -'AMQPExchange::setType' => 'Set the type of the exchange. - -Set the type of the exchange. This can be any of AMQP_EX_TYPE_DIRECT, -AMQP_EX_TYPE_FANOUT, AMQP_EX_TYPE_HEADERS or AMQP_EX_TYPE_TOPIC.', -'AMQPExchange::unbind' => 'Remove binding to another exchange. - -Remove a routing key binding on an another exchange from the given exchange.', -'AMQPQueue::__construct' => 'Create an instance of an AMQPQueue object.', -'AMQPQueue::ack' => 'Acknowledge the receipt of a message. - -This method allows the acknowledgement of a message that is retrieved -without the AMQP_AUTOACK flag through AMQPQueue::get() or -AMQPQueue::consume()', -'AMQPQueue::bind' => 'Bind the given queue to a routing key on an exchange.', -'AMQPQueue::cancel' => 'Cancel a queue that is already bound to an exchange and routing key.', -'AMQPQueue::consume' => 'Consume messages from a queue. - -Blocking function that will retrieve the next message from the queue as -it becomes available and will pass it off to the callback.', -'AMQPQueue::declareQueue' => 'Declare a new queue on the broker.', -'AMQPQueue::delete' => 'Delete a queue from the broker. - -This includes its entire contents of unread or unacknowledged messages.', -'AMQPQueue::get' => 'Retrieve the next message from the queue. - -Retrieve the next available message from the queue. If no messages are -present in the queue, this function will return FALSE immediately. This -is a non blocking alternative to the AMQPQueue::consume() method. -Currently, the only supported flag for the flags parameter is -AMQP_AUTOACK. If this flag is passed in, then the message returned will -automatically be marked as acknowledged by the broker as soon as the -frames are sent to the client.', -'AMQPQueue::getArgument' => 'Get the argument associated with the given key.', -'AMQPQueue::getArguments' => 'Get all set arguments as an array of key/value pairs.', -'AMQPQueue::getChannel' => 'Get the AMQPChannel object in use', -'AMQPQueue::getConnection' => 'Get the AMQPConnection object in use', -'AMQPQueue::getConsumerTag' => 'Get latest consumer tag. If no consumer available or the latest on was canceled null will be returned.', -'AMQPQueue::getFlags' => 'Get all the flags currently set on the given queue.', -'AMQPQueue::getName' => 'Get the configured name.', -'AMQPQueue::hasArgument' => 'Check whether a queue has specific argument.', -'AMQPQueue::nack' => 'Mark a message as explicitly not acknowledged. - -Mark the message identified by delivery_tag as explicitly not -acknowledged. This method can only be called on messages that have not -yet been acknowledged, meaning that messages retrieved with by -AMQPQueue::consume() and AMQPQueue::get() and using the AMQP_AUTOACK -flag are not eligible. When called, the broker will immediately put the -message back onto the queue, instead of waiting until the connection is -closed. This method is only supported by the RabbitMQ broker. The -behavior of calling this method while connected to any other broker is -undefined.', -'AMQPQueue::purge' => 'Purge the contents of a queue.', -'AMQPQueue::reject' => 'Mark one message as explicitly not acknowledged. - -Mark the message identified by delivery_tag as explicitly not -acknowledged. This method can only be called on messages that have not -yet been acknowledged, meaning that messages retrieved with by -AMQPQueue::consume() and AMQPQueue::get() and using the AMQP_AUTOACK -flag are not eligible.', -'AMQPQueue::setArgument' => 'Set a queue argument.', -'AMQPQueue::setArguments' => 'Set all arguments on the given queue. - -All other argument settings will be wiped.', -'AMQPQueue::setFlags' => 'Set the flags on the queue.', -'AMQPQueue::setName' => 'Set the queue name.', -'AMQPQueue::unbind' => 'Remove a routing key binding on an exchange from the given queue.', -'apache_child_terminate' => 'Terminate apache process after this request', -'apache_get_modules' => 'Get a list of loaded Apache modules', -'apache_get_version' => 'Fetch Apache version', -'apache_getenv' => 'Get an Apache subprocess_env variable', -'apache_lookup_uri' => 'Perform a partial request for the specified URI and return all info about it', -'apache_note' => 'Get and set apache request notes', -'apache_request_headers' => 'Fetch all HTTP request headers', -'apache_reset_timeout' => 'Reset the Apache write timer', -'apache_response_headers' => 'Fetch all HTTP response headers', -'apache_setenv' => 'Set an Apache subprocess_env variable', -'apc_add' => 'Cache a new variable in the data store', -'apc_bin_dump' => 'Get a binary dump of the given files and user variables', -'apc_bin_dumpfile' => 'Output a binary dump of cached files and user variables to a file', -'apc_bin_load' => 'Load a binary dump into the APC file/user cache', -'apc_bin_loadfile' => 'Load a binary dump from a file into the APC file/user cache', -'apc_cache_info' => 'Retrieves cached information from APC\'s data store', -'apc_cas' => 'Updates an old value with a new value', -'apc_clear_cache' => 'Clears the APC cache', -'apc_compile_file' => 'Stores a file in the bytecode cache, bypassing all filters', -'apc_dec' => 'Decrease a stored number', -'apc_define_constants' => 'Defines a set of constants for retrieval and mass-definition', -'apc_delete' => 'Removes a stored variable from the cache', -'apc_delete_file' => 'Deletes files from the opcode cache', -'apc_exists' => 'Checks if APC key exists', -'apc_fetch' => 'Fetch a stored variable from the cache', -'apc_inc' => 'Increase a stored number', -'apc_load_constants' => 'Loads a set of constants from the cache', -'apc_sma_info' => 'Retrieves APC\'s Shared Memory Allocation information', -'apc_store' => 'Cache a variable in the data store', -'apciterator::__construct' => 'Constructs an APCIterator iterator object', -'apciterator::current' => 'Get current item', -'apciterator::getTotalCount' => 'Get total count', -'apciterator::getTotalHits' => 'Get total cache hits', -'apciterator::getTotalSize' => 'Get total cache size', -'apciterator::key' => 'Get iterator key', -'apciterator::next' => 'Move pointer to next item', -'apciterator::rewind' => 'Rewinds iterator', -'apciterator::valid' => 'Checks if current position is valid', -'apcu_add' => 'Cache a new variable in the data store', -'apcu_cache_info' => 'Retrieves cached information from APCu\'s data store', -'apcu_cas' => 'Updates an old value with a new value', -'apcu_clear_cache' => 'Clears the APCu cache', -'apcu_dec' => 'Decrease a stored number', -'apcu_delete' => 'Removes a stored variable from the cache', -'apcu_entry' => 'Atomically fetch or generate a cache entry', -'apcu_exists' => 'Checks if entry exists', -'apcu_fetch' => 'Fetch a stored variable from the cache', -'apcu_inc' => 'Increase a stored number', -'apcu_sma_info' => 'Retrieves APCu Shared Memory Allocation information', -'apcu_store' => 'Cache a variable in the data store', -'apcuiterator::__construct' => 'Constructs an APCUIterator iterator object', -'apcuiterator::current' => 'Get current item', -'apcuiterator::getTotalCount' => 'Get total count', -'apcuiterator::getTotalHits' => 'Get total cache hits', -'apcuiterator::getTotalSize' => 'Get total cache size', -'apcuiterator::key' => 'Get iterator key', -'apcuiterator::next' => 'Move pointer to next item', -'apcuiterator::rewind' => 'Rewinds iterator', -'apcuiterator::valid' => 'Checks if current position is valid', -'apd_breakpoint' => 'Stops the interpreter and waits on a CR from the socket', -'apd_callstack' => 'Returns the current call stack as an array', -'apd_clunk' => 'Throw a warning and a callstack', -'apd_continue' => 'Restarts the interpreter', -'apd_croak' => 'Throw an error, a callstack and then exit', -'apd_dump_function_table' => 'Outputs the current function table', -'apd_dump_persistent_resources' => 'Return all persistent resources as an array', -'apd_dump_regular_resources' => 'Return all current regular resources as an array', -'apd_echo' => 'Echo to the debugging socket', -'apd_get_active_symbols' => 'Get an array of the current variables names in the local scope', -'apd_set_pprof_trace' => 'Starts the session debugging', -'apd_set_session' => 'Changes or sets the current debugging level', -'apd_set_session_trace' => 'Starts the session debugging', -'apd_set_session_trace_socket' => 'Starts the remote session debugging', -'appenditerator::__construct' => 'Constructs an AppendIterator', -'appenditerator::append' => 'Appends an iterator', -'appenditerator::current' => 'Gets the current value', -'appenditerator::getArrayIterator' => 'Gets the ArrayIterator', -'appenditerator::getInnerIterator' => 'Gets the inner iterator', -'appenditerator::getIteratorIndex' => 'Gets an index of iterators', -'appenditerator::key' => 'Gets the current key', -'appenditerator::next' => 'Moves to the next element', -'appenditerator::rewind' => 'Rewinds the Iterator', -'appenditerator::valid' => 'Checks validity of the current element', -'array_change_key_case' => 'Changes the case of all keys in an array', -'array_chunk' => 'Split an array into chunks', -'array_column' => 'Return the values from a single column in the input array', -'array_combine' => 'Creates an array by using one array for keys and another for its values', -'array_count_values' => 'Counts all the values of an array', -'array_diff' => 'Computes the difference of arrays', -'array_diff_assoc' => 'Computes the difference of arrays with additional index check', -'array_diff_key' => 'Computes the difference of arrays using keys for comparison', -'array_diff_uassoc' => 'Computes the difference of arrays with additional index check which is performed by a user supplied callback function', -'array_diff_ukey' => 'Computes the difference of arrays using a callback function on the keys for comparison', -'array_fill' => 'Fill an array with values', -'array_fill_keys' => 'Fill an array with values, specifying keys', -'array_filter' => 'Filters elements of an array using a callback function', -'array_flip' => 'Exchanges all keys with their associated values in an array', -'array_intersect' => 'Computes the intersection of arrays', -'array_intersect_assoc' => 'Computes the intersection of arrays with additional index check', -'array_intersect_key' => 'Computes the intersection of arrays using keys for comparison', -'array_intersect_uassoc' => 'Computes the intersection of arrays with additional index check, compares indexes by a callback function', -'array_intersect_ukey' => 'Computes the intersection of arrays using a callback function on the keys for comparison', -'array_key_exists' => 'Checks if the given key or index exists in the array', -'array_key_first' => 'Gets the first key of an array', -'array_key_last' => 'Gets the last key of an array', -'array_keys' => 'Return all the keys or a subset of the keys of an array', -'array_map' => 'Applies the callback to the elements of the given arrays', -'array_merge' => 'Merge one or more arrays', -'array_merge_recursive' => 'Merge one or more arrays recursively', -'array_multisort' => 'Sort multiple or multi-dimensional arrays', -'array_pad' => 'Pad array to the specified length with a value', -'array_pop' => 'Pop the element off the end of array', -'array_product' => 'Calculate the product of values in an array', -'array_push' => 'Push one or more elements onto the end of array', -'array_rand' => 'Pick one or more random keys out of an array', -'array_reduce' => 'Iteratively reduce the array to a single value using a callback function', -'array_replace' => 'Replaces elements from passed arrays into the first array', -'array_replace_recursive' => 'Replaces elements from passed arrays into the first array recursively', -'array_reverse' => 'Return an array with elements in reverse order', -'array_search' => 'Searches the array for a given value and returns the first corresponding key if successful', -'array_shift' => 'Shift an element off the beginning of array', -'array_slice' => 'Extract a slice of the array', -'array_splice' => 'Remove a portion of the array and replace it with something else', -'array_sum' => 'Calculate the sum of values in an array', -'array_udiff' => 'Computes the difference of arrays by using a callback function for data comparison', -'array_udiff_assoc' => 'Computes the difference of arrays with additional index check, compares data by a callback function', -'array_udiff_uassoc' => 'Computes the difference of arrays with additional index check, compares data and indexes by a callback function', -'array_uintersect' => 'Computes the intersection of arrays, compares data by a callback function', -'array_uintersect_assoc' => 'Computes the intersection of arrays with additional index check, compares data by a callback function', -'array_uintersect_uassoc' => 'Computes the intersection of arrays with additional index check, compares data and indexes by separate callback functions', -'array_unique' => 'Removes duplicate values from an array', -'array_unshift' => 'Prepend one or more elements to the beginning of an array', -'array_values' => 'Return all the values of an array', -'array_walk' => 'Apply a user supplied function to every member of an array', -'array_walk_recursive' => 'Apply a user function recursively to every member of an array', -'ArrayAccess::offsetExists' => 'Whether a offset exists', -'ArrayAccess::offsetGet' => 'Offset to retrieve', -'ArrayAccess::offsetSet' => 'Offset to set', -'ArrayAccess::offsetUnset' => 'Offset to unset', -'arrayiterator::__construct' => 'Construct an ArrayIterator', -'arrayiterator::append' => 'Append an element', -'arrayiterator::asort' => 'Sort array by values', -'arrayiterator::count' => 'Count elements', -'arrayiterator::current' => 'Return current array entry', -'arrayiterator::getArrayCopy' => 'Get array copy', -'arrayiterator::getFlags' => 'Get behavior flags', -'arrayiterator::key' => 'Return current array key', -'arrayiterator::ksort' => 'Sort array by keys', -'arrayiterator::natcasesort' => 'Sort an array naturally, case insensitive', -'arrayiterator::natsort' => 'Sort an array naturally', -'arrayiterator::next' => 'Move to next entry', -'arrayiterator::offsetExists' => 'Check if offset exists', -'arrayiterator::offsetGet' => 'Get value for an offset', -'arrayiterator::offsetSet' => 'Set value for an offset', -'arrayiterator::offsetUnset' => 'Unset value for an offset', -'arrayiterator::rewind' => 'Rewind array back to the start', -'arrayiterator::seek' => 'Seek to position', -'arrayiterator::serialize' => 'Serialize', -'arrayiterator::setFlags' => 'Set behaviour flags', -'arrayiterator::uasort' => 'Sort with a user-defined comparison function and maintain index association', -'arrayiterator::uksort' => 'Sort by keys using a user-defined comparison function', -'arrayiterator::unserialize' => 'Unserialize', -'arrayiterator::valid' => 'Check whether array contains more entries', -'arrayobject::__construct' => 'Construct a new array object', -'arrayobject::append' => 'Appends the value', -'arrayobject::asort' => 'Sort the entries by value', -'arrayobject::count' => 'Get the number of public properties in the ArrayObject', -'arrayobject::exchangeArray' => 'Exchange the array for another one', -'arrayobject::getArrayCopy' => 'Creates a copy of the ArrayObject', -'arrayobject::getFlags' => 'Gets the behavior flags', -'arrayobject::getIterator' => 'Create a new iterator from an ArrayObject instance', -'arrayobject::getIteratorClass' => 'Gets the iterator classname for the ArrayObject', -'arrayobject::ksort' => 'Sort the entries by key', -'arrayobject::natcasesort' => 'Sort an array using a case insensitive "natural order" algorithm', -'arrayobject::natsort' => 'Sort entries using a "natural order" algorithm', -'arrayobject::offsetExists' => 'Returns whether the requested index exists', -'arrayobject::offsetGet' => 'Returns the value at the specified index', -'arrayobject::offsetSet' => 'Sets the value at the specified index to newval', -'arrayobject::offsetUnset' => 'Unsets the value at the specified index', -'arrayobject::serialize' => 'Serialize an ArrayObject', -'arrayobject::setFlags' => 'Sets the behavior flags', -'arrayobject::setIteratorClass' => 'Sets the iterator classname for the ArrayObject', -'arrayobject::uasort' => 'Sort the entries with a user-defined comparison function and maintain key association', -'arrayobject::uksort' => 'Sort the entries by keys using a user-defined comparison function', -'arrayobject::unserialize' => 'Unserialize an ArrayObject', -'arsort' => 'Sort an array in reverse order and maintain index association', -'asin' => 'Arc sine', -'asinh' => 'Inverse hyperbolic sine', -'asort' => 'Sort an array and maintain index association', -'assert' => 'Checks if assertion is `false`', -'assert_options' => 'Set/get the various assert flags', -'ast\get_kind_name' => 'Get string representation of AST kind value', -'ast\get_metadata' => 'Provides metadata for the AST kinds', -'ast\get_supported_versions' => 'Returns currently supported AST versions.', -'ast\kind_uses_flags' => 'Check if AST kind uses flags', -'ast\parse_code' => 'Parses code string and returns AST root node.', -'ast\parse_file' => 'Parses code file and returns AST root node.', -'atan' => 'Arc tangent', -'atan2' => 'Arc tangent of two variables', -'atanh' => 'Inverse hyperbolic tangent', -'base64_decode' => 'Decodes data encoded with MIME base64', -'base64_encode' => 'Encodes data with MIME base64', -'base_convert' => 'Convert a number between arbitrary bases', -'basename' => 'Returns trailing name component of path', -'bbcode_add_element' => 'Adds a bbcode element', -'bbcode_add_smiley' => 'Adds a smiley to the parser', -'bbcode_create' => 'Create a BBCode Resource', -'bbcode_destroy' => 'Close BBCode_container resource', -'bbcode_parse' => 'Parse a string following a given rule set', -'bbcode_set_arg_parser' => 'Attach another parser in order to use another rule set for argument parsing', -'bbcode_set_flags' => 'Set or alter parser options', -'bcadd' => 'Add two arbitrary precision numbers', -'bccomp' => 'Compare two arbitrary precision numbers', -'bcdiv' => 'Divide two arbitrary precision numbers', -'bcmod' => 'Get modulus of an arbitrary precision number', -'bcmul' => 'Multiply two arbitrary precision numbers', -'bcompiler_load' => 'Reads and creates classes from a bz compressed file', -'bcompiler_load_exe' => 'Reads and creates classes from a bcompiler exe file', -'bcompiler_parse_class' => 'Reads the bytecodes of a class and calls back to a user function', -'bcompiler_read' => 'Reads and creates classes from a filehandle', -'bcompiler_write_class' => 'Writes a defined class as bytecodes', -'bcompiler_write_constant' => 'Writes a defined constant as bytecodes', -'bcompiler_write_exe_footer' => 'Writes the start pos, and sig to the end of a exe type file', -'bcompiler_write_file' => 'Writes a php source file as bytecodes', -'bcompiler_write_footer' => 'Writes the single character \x00 to indicate End of compiled data', -'bcompiler_write_function' => 'Writes a defined function as bytecodes', -'bcompiler_write_functions_from_file' => 'Writes all functions defined in a file as bytecodes', -'bcompiler_write_header' => 'Writes the bcompiler header', -'bcompiler_write_included_filename' => 'Writes an included file as bytecodes', -'bcpow' => 'Raise an arbitrary precision number to another', -'bcpowmod' => 'Raise an arbitrary precision number to another, reduced by a specified modulus', -'bcscale' => 'Set or get default scale parameter for all bc math functions', -'bcsqrt' => 'Get the square root of an arbitrary precision number', -'bcsub' => 'Subtract one arbitrary precision number from another', -'bin2hex' => 'Convert binary data into hexadecimal representation', -'bind_textdomain_codeset' => 'Specify the character encoding in which the messages from the DOMAIN message catalog will be returned', -'bindec' => 'Binary to decimal', -'bindtextdomain' => 'Sets the path for a domain', -'blenc_encrypt' => 'Encrypt a PHP script with BLENC', -'boolval' => 'Get the boolean value of a variable', -'bson_decode' => 'Deserializes a BSON object into a PHP array', -'bson_encode' => 'Serializes a PHP variable into a BSON string', -'bzclose' => 'Close a bzip2 file', -'bzcompress' => 'Compress a string into bzip2 encoded data', -'bzdecompress' => 'Decompresses bzip2 encoded data', -'bzerrno' => 'Returns a bzip2 error number', -'bzerror' => 'Returns the bzip2 error number and error string in an array', -'bzerrstr' => 'Returns a bzip2 error string', -'bzflush' => 'Force a write of all buffered data', -'bzopen' => 'Opens a bzip2 compressed file', -'bzread' => 'Binary safe bzip2 file read', -'bzwrite' => 'Binary safe bzip2 file write', -'cachingiterator::__construct' => 'Construct a new CachingIterator object for the iterator', -'cachingiterator::__toString' => 'Return the string representation of the current element', -'cachingiterator::count' => 'The number of elements in the iterator', -'cachingiterator::current' => 'Return the current element', -'cachingiterator::getCache' => 'Retrieve the contents of the cache', -'cachingiterator::getFlags' => 'Get flags used', -'cachingiterator::getInnerIterator' => 'Returns the inner iterator', -'cachingiterator::hasNext' => 'Check whether the inner iterator has a valid next element', -'cachingiterator::key' => 'Return the key for the current element', -'cachingiterator::next' => 'Move the iterator forward', -'cachingiterator::offsetExists' => 'The offsetExists purpose', -'cachingiterator::offsetGet' => 'The offsetGet purpose', -'cachingiterator::offsetSet' => 'The offsetSet purpose', -'cachingiterator::offsetUnset' => 'The offsetUnset purpose', -'cachingiterator::rewind' => 'Rewind the iterator', -'cachingiterator::setFlags' => 'The setFlags purpose', -'cachingiterator::valid' => 'Check whether the current element is valid', -'cairo::availableFonts' => 'Retrieves the availables font types', -'cairo::availableSurfaces' => 'Retrieves all available surfaces', -'cairo::statusToString' => 'Retrieves the current status as string', -'cairo::version' => 'Retrieves cairo\'s library version', -'cairo::versionString' => 'Retrieves cairo version as string', -'cairo_create' => 'Returns a new CairoContext object on the requested surface', -'cairo_matrix_create_scale' => 'Alias of CairoMatrix::initScale', -'cairo_matrix_create_translate' => 'Alias of CairoMatrix::initTranslate', -'cairocontext::__construct' => 'Creates a new CairoContext', -'cairocontext::appendPath' => 'Appends a path to current path', -'cairocontext::arc' => 'Adds a circular arc', -'cairocontext::arcNegative' => 'Adds a negative arc', -'cairocontext::clip' => 'Establishes a new clip region', -'cairocontext::clipExtents' => 'Computes the area inside the current clip', -'cairocontext::clipPreserve' => 'Establishes a new clip region from the current clip', -'cairocontext::clipRectangleList' => 'Retrieves the current clip as a list of rectangles', -'cairocontext::closePath' => 'Closes the current path', -'cairocontext::copyPage' => 'Emits the current page', -'cairocontext::copyPath' => 'Creates a copy of the current path', -'cairocontext::copyPathFlat' => 'Gets a flattened copy of the current path', -'cairocontext::curveTo' => 'Adds a curve', -'cairocontext::deviceToUser' => 'Transform a coordinate', -'cairocontext::deviceToUserDistance' => 'Transform a distance', -'cairocontext::fill' => 'Fills the current path', -'cairocontext::fillExtents' => 'Computes the filled area', -'cairocontext::fillPreserve' => 'Fills and preserve the current path', -'cairocontext::fontExtents' => 'Get the font extents', -'cairocontext::getAntialias' => 'Retrieves the current antialias mode', -'cairocontext::getCurrentPoint' => 'The getCurrentPoint purpose', -'cairocontext::getDash' => 'The getDash purpose', -'cairocontext::getDashCount' => 'The getDashCount purpose', -'cairocontext::getFillRule' => 'The getFillRule purpose', -'cairocontext::getFontFace' => 'The getFontFace purpose', -'cairocontext::getFontMatrix' => 'The getFontMatrix purpose', -'cairocontext::getFontOptions' => 'The getFontOptions purpose', -'cairocontext::getGroupTarget' => 'The getGroupTarget purpose', -'cairocontext::getLineCap' => 'The getLineCap purpose', -'cairocontext::getLineJoin' => 'The getLineJoin purpose', -'cairocontext::getLineWidth' => 'The getLineWidth purpose', -'cairocontext::getMatrix' => 'The getMatrix purpose', -'cairocontext::getMiterLimit' => 'The getMiterLimit purpose', -'cairocontext::getOperator' => 'The getOperator purpose', -'cairocontext::getScaledFont' => 'The getScaledFont purpose', -'cairocontext::getSource' => 'The getSource purpose', -'cairocontext::getTarget' => 'The getTarget purpose', -'cairocontext::getTolerance' => 'The getTolerance purpose', -'cairocontext::glyphPath' => 'The glyphPath purpose', -'cairocontext::hasCurrentPoint' => 'The hasCurrentPoint purpose', -'cairocontext::identityMatrix' => 'The identityMatrix purpose', -'cairocontext::inFill' => 'The inFill purpose', -'cairocontext::inStroke' => 'The inStroke purpose', -'cairocontext::lineTo' => 'The lineTo purpose', -'cairocontext::mask' => 'The mask purpose', -'cairocontext::maskSurface' => 'The maskSurface purpose', -'cairocontext::moveTo' => 'The moveTo purpose', -'cairocontext::newPath' => 'The newPath purpose', -'cairocontext::newSubPath' => 'The newSubPath purpose', -'cairocontext::paint' => 'The paint purpose', -'cairocontext::paintWithAlpha' => 'The paintWithAlpha purpose', -'cairocontext::pathExtents' => 'The pathExtents purpose', -'cairocontext::popGroup' => 'The popGroup purpose', -'cairocontext::popGroupToSource' => 'The popGroupToSource purpose', -'cairocontext::pushGroup' => 'The pushGroup purpose', -'cairocontext::pushGroupWithContent' => 'The pushGroupWithContent purpose', -'cairocontext::rectangle' => 'The rectangle purpose', -'cairocontext::relCurveTo' => 'The relCurveTo purpose', -'cairocontext::relLineTo' => 'The relLineTo purpose', -'cairocontext::relMoveTo' => 'The relMoveTo purpose', -'cairocontext::resetClip' => 'The resetClip purpose', -'cairocontext::restore' => 'The restore purpose', -'cairocontext::rotate' => 'The rotate purpose', -'cairocontext::save' => 'The save purpose', -'cairocontext::scale' => 'The scale purpose', -'cairocontext::selectFontFace' => 'The selectFontFace purpose', -'cairocontext::setAntialias' => 'The setAntialias purpose', -'cairocontext::setDash' => 'The setDash purpose', -'cairocontext::setFillRule' => 'The setFillRule purpose', -'cairocontext::setFontFace' => 'The setFontFace purpose', -'cairocontext::setFontMatrix' => 'The setFontMatrix purpose', -'cairocontext::setFontOptions' => 'The setFontOptions purpose', -'cairocontext::setFontSize' => 'The setFontSize purpose', -'cairocontext::setLineCap' => 'The setLineCap purpose', -'cairocontext::setLineJoin' => 'The setLineJoin purpose', -'cairocontext::setLineWidth' => 'The setLineWidth purpose', -'cairocontext::setMatrix' => 'The setMatrix purpose', -'cairocontext::setMiterLimit' => 'The setMiterLimit purpose', -'cairocontext::setOperator' => 'The setOperator purpose', -'cairocontext::setScaledFont' => 'The setScaledFont purpose', -'cairocontext::setSource' => 'The setSource purpose', -'cairocontext::setSourceRGB' => 'The setSourceRGB purpose', -'cairocontext::setSourceRGBA' => 'The setSourceRGBA purpose', -'cairocontext::setSourceSurface' => 'The setSourceSurface purpose', -'cairocontext::setTolerance' => 'The setTolerance purpose', -'cairocontext::showPage' => 'The showPage purpose', -'cairocontext::showText' => 'The showText purpose', -'cairocontext::status' => 'The status purpose', -'cairocontext::stroke' => 'The stroke purpose', -'cairocontext::strokeExtents' => 'The strokeExtents purpose', -'cairocontext::strokePreserve' => 'The strokePreserve purpose', -'cairocontext::textExtents' => 'The textExtents purpose', -'cairocontext::textPath' => 'The textPath purpose', -'cairocontext::transform' => 'The transform purpose', -'cairocontext::translate' => 'The translate purpose', -'cairocontext::userToDevice' => 'The userToDevice purpose', -'cairocontext::userToDeviceDistance' => 'The userToDeviceDistance purpose', -'cairofontface::__construct' => 'Creates a new CairoFontFace object', -'cairofontface::getType' => 'Retrieves the font face type', -'cairofontface::status' => 'Check for CairoFontFace errors', -'cairofontoptions::__construct' => 'The __construct purpose', -'cairofontoptions::equal' => 'The equal purpose', -'cairofontoptions::getAntialias' => 'The getAntialias purpose', -'cairofontoptions::getHintMetrics' => 'The getHintMetrics purpose', -'cairofontoptions::getHintStyle' => 'The getHintStyle purpose', -'cairofontoptions::getSubpixelOrder' => 'The getSubpixelOrder purpose', -'cairofontoptions::hash' => 'The hash purpose', -'cairofontoptions::merge' => 'The merge purpose', -'cairofontoptions::setAntialias' => 'The setAntialias purpose', -'cairofontoptions::setHintMetrics' => 'The setHintMetrics purpose', -'cairofontoptions::setHintStyle' => 'The setHintStyle purpose', -'cairofontoptions::setSubpixelOrder' => 'The setSubpixelOrder purpose', -'cairofontoptions::status' => 'The status purpose', -'cairoformat::strideForWidth' => 'Provides an appropriate stride to use', -'cairogradientpattern::addColorStopRgb' => 'The addColorStopRgb purpose', -'cairogradientpattern::addColorStopRgba' => 'The addColorStopRgba purpose', -'cairogradientpattern::getColorStopCount' => 'The getColorStopCount purpose', -'cairogradientpattern::getColorStopRgba' => 'The getColorStopRgba purpose', -'cairogradientpattern::getExtend' => 'The getExtend purpose', -'cairogradientpattern::setExtend' => 'The setExtend purpose', -'cairoimagesurface::__construct' => 'Creates a new CairoImageSurface', -'cairoimagesurface::createForData' => 'The createForData purpose', -'cairoimagesurface::createFromPng' => 'Creates a new CairoImageSurface form a png image file', -'cairoimagesurface::getData' => 'Gets the image data as string', -'cairoimagesurface::getFormat' => 'Get the image format', -'cairoimagesurface::getHeight' => 'Retrieves the height of the CairoImageSurface', -'cairoimagesurface::getStride' => 'The getStride purpose', -'cairoimagesurface::getWidth' => 'Retrieves the width of the CairoImageSurface', -'cairolineargradient::__construct' => 'The __construct purpose', -'cairolineargradient::getPoints' => 'The getPoints purpose', -'cairomatrix::__construct' => 'Creates a new CairoMatrix object', -'cairomatrix::initIdentity' => 'Creates a new identity matrix', -'cairomatrix::initRotate' => 'Creates a new rotated matrix', -'cairomatrix::initScale' => 'Creates a new scaling matrix', -'cairomatrix::initTranslate' => 'Creates a new translation matrix', -'cairomatrix::invert' => 'The invert purpose', -'cairomatrix::multiply' => 'The multiply purpose', -'cairomatrix::rotate' => 'The rotate purpose', -'cairomatrix::scale' => 'Applies scaling to a matrix', -'cairomatrix::transformDistance' => 'The transformDistance purpose', -'cairomatrix::transformPoint' => 'The transformPoint purpose', -'cairomatrix::translate' => 'The translate purpose', -'cairopattern::__construct' => 'The __construct purpose', -'cairopattern::getMatrix' => 'The getMatrix purpose', -'cairopattern::getType' => 'The getType purpose', -'cairopattern::setMatrix' => 'The setMatrix purpose', -'cairopattern::status' => 'The status purpose', -'cairopdfsurface::__construct' => 'The __construct purpose', -'cairopdfsurface::setSize' => 'The setSize purpose', -'cairopssurface::__construct' => 'The __construct purpose', -'cairopssurface::dscBeginPageSetup' => 'The dscBeginPageSetup purpose', -'cairopssurface::dscBeginSetup' => 'The dscBeginSetup purpose', -'cairopssurface::dscComment' => 'The dscComment purpose', -'cairopssurface::getEps' => 'The getEps purpose', -'cairopssurface::getLevels' => 'The getLevels purpose', -'cairopssurface::levelToString' => 'The levelToString purpose', -'cairopssurface::restrictToLevel' => 'The restrictToLevel purpose', -'cairopssurface::setEps' => 'The setEps purpose', -'cairopssurface::setSize' => 'The setSize purpose', -'cairoradialgradient::__construct' => 'The __construct purpose', -'cairoradialgradient::getCircles' => 'The getCircles purpose', -'cairoscaledfont::__construct' => 'The __construct purpose', -'cairoscaledfont::extents' => 'The extents purpose', -'cairoscaledfont::getCtm' => 'The getCtm purpose', -'cairoscaledfont::getFontFace' => 'The getFontFace purpose', -'cairoscaledfont::getFontMatrix' => 'The getFontMatrix purpose', -'cairoscaledfont::getFontOptions' => 'The getFontOptions purpose', -'cairoscaledfont::getScaleMatrix' => 'The getScaleMatrix purpose', -'cairoscaledfont::getType' => 'The getType purpose', -'cairoscaledfont::glyphExtents' => 'The glyphExtents purpose', -'cairoscaledfont::status' => 'The status purpose', -'cairoscaledfont::textExtents' => 'The textExtents purpose', -'cairosolidpattern::__construct' => 'The __construct purpose', -'cairosolidpattern::getRgba' => 'The getRgba purpose', -'cairosurface::__construct' => 'The __construct purpose', -'cairosurface::copyPage' => 'The copyPage purpose', -'cairosurface::createSimilar' => 'The createSimilar purpose', -'cairosurface::finish' => 'The finish purpose', -'cairosurface::flush' => 'The flush purpose', -'cairosurface::getContent' => 'The getContent purpose', -'cairosurface::getDeviceOffset' => 'The getDeviceOffset purpose', -'cairosurface::getFontOptions' => 'The getFontOptions purpose', -'cairosurface::getType' => 'The getType purpose', -'cairosurface::markDirty' => 'The markDirty purpose', -'cairosurface::markDirtyRectangle' => 'The markDirtyRectangle purpose', -'cairosurface::setDeviceOffset' => 'The setDeviceOffset purpose', -'cairosurface::setFallbackResolution' => 'The setFallbackResolution purpose', -'cairosurface::showPage' => 'The showPage purpose', -'cairosurface::status' => 'The status purpose', -'cairosurface::writeToPng' => 'The writeToPng purpose', -'cairosurfacepattern::__construct' => 'The __construct purpose', -'cairosurfacepattern::getExtend' => 'The getExtend purpose', -'cairosurfacepattern::getFilter' => 'The getFilter purpose', -'cairosurfacepattern::getSurface' => 'The getSurface purpose', -'cairosurfacepattern::setExtend' => 'The setExtend purpose', -'cairosurfacepattern::setFilter' => 'The setFilter purpose', -'cairosvgsurface::__construct' => 'The __construct purpose', -'cairosvgsurface::getVersions' => 'Used to retrieve a list of supported SVG versions', -'cairosvgsurface::restrictToVersion' => 'The restrictToVersion purpose', -'cairosvgsurface::versionToString' => 'The versionToString purpose', -'cal_days_in_month' => 'Return the number of days in a month for a given year and calendar', -'cal_from_jd' => 'Converts from Julian Day Count to a supported calendar', -'cal_info' => 'Returns information about a particular calendar', -'cal_to_jd' => 'Converts from a supported calendar to Julian Day Count', -'call_user_func' => 'Call the callback given by the first parameter', -'call_user_func_array' => 'Call a callback with an array of parameters', -'call_user_method' => 'Call a user method on an specific object', -'call_user_method_array' => 'Call a user method given with an array of parameters', -'callbackfilteriterator::__construct' => 'Create a filtered iterator from another iterator', -'callbackfilteriterator::accept' => 'Calls the callback with the current value, the current key and the inner iterator as arguments', -'CallbackFilterIterator::current' => 'Get the current element value', -'CallbackFilterIterator::getInnerIterator' => 'Get the inner iterator', -'CallbackFilterIterator::key' => 'Get the current key', -'CallbackFilterIterator::next' => 'Move the iterator forward', -'CallbackFilterIterator::rewind' => 'Rewind the iterator', -'CallbackFilterIterator::valid' => 'Check whether the current element is valid', -'ceil' => 'Round fractions up', -'chdb::__construct' => 'Creates a chdb instance', -'chdb::get' => 'Gets the value associated with a key', -'chdb_create' => 'Creates a chdb file', -'chdir' => 'Change directory', -'checkdate' => 'Validate a Gregorian date', -'checkdnsrr' => 'Check DNS records corresponding to a given Internet host name or IP address', -'chgrp' => 'Changes file group', -'chmod' => 'Changes file mode', -'chop' => 'Alias of rtrim', -'chown' => 'Changes file owner', -'chr' => 'Generate a single-byte string from a number', -'chroot' => 'Change the root directory', -'chunk_split' => 'Split a string into smaller chunks', -'class_alias' => 'Creates an alias for a class', -'class_exists' => 'Checks if the class has been defined', -'class_implements' => 'Return the interfaces which are implemented by the given class or interface', -'class_parents' => 'Return the parent classes of the given class', -'class_uses' => 'Return the traits used by the given class', -'classkit_import' => 'Import new class method definitions from a file', -'classkit_method_add' => 'Dynamically adds a new method to a given class', -'classkit_method_copy' => 'Copies a method from class to another', -'classkit_method_redefine' => 'Dynamically changes the code of the given method', -'classkit_method_remove' => 'Dynamically removes the given method', -'classkit_method_rename' => 'Dynamically changes the name of the given method', -'classObj::__construct' => 'The second argument class is optional. If given, the new class -created will be a copy of this class.', -'classObj::addLabel' => 'Add a labelObj to the classObj and return its index in the labels -array. -.. versionadded:: 6.2', -'classObj::convertToString' => 'Saves the object to a string. Provides the inverse option for -updateFromString.', -'classObj::createLegendIcon' => 'Draw the legend icon and return a new imageObj.', -'classObj::deletestyle' => 'Delete the style specified by the style index. If there are any -style that follow the deleted style, their index will decrease by 1.', -'classObj::drawLegendIcon' => 'Draw the legend icon on im object at dstX, dstY. -Returns MS_SUCCESS/MS_FAILURE.', -'classObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the -resources.', -'classObj::getExpressionString' => 'Returns the :ref:`expression <expressions>` string for the class -object.', -'classObj::getLabel' => 'Return a reference to the labelObj at *index* in the labels array. -See the labelObj_ section for more details on multiple class -labels. -.. versionadded:: 6.2', -'classObj::getMetaData' => 'Fetch class metadata entry by name. Returns "" if no entry -matches the name. Note that the search is case sensitive. -.. note:: -getMetaData\'s query is case sensitive.', -'classObj::getStyle' => 'Return the style object using an index. index >= 0 && -index < class->numstyles.', -'classObj::getTextString' => 'Returns the text string for the class object.', -'classObj::movestyledown' => 'The style specified by the style index will be moved down into -the array of classes. Returns MS_SUCCESS or MS_FAILURE. -ex class->movestyledown(0) will have the effect of moving style 0 -up to position 1, and the style at position 1 will be moved -to position 0.', -'classObj::movestyleup' => 'The style specified by the style index will be moved up into -the array of classes. Returns MS_SUCCESS or MS_FAILURE. -ex class->movestyleup(1) will have the effect of moving style 1 -up to position 0, and the style at position 0 will be moved -to position 1.', -'classObj::ms_newClassObj' => 'Old style constructor', -'classObj::removeLabel' => 'Remove the labelObj at *index* from the labels array and return a -reference to the labelObj. numlabels is decremented, and the -array is updated. -.. versionadded:: 6.2', -'classObj::removeMetaData' => 'Remove a metadata entry for the class. Returns MS_SUCCESS/MS_FAILURE.', -'classObj::set' => 'Set object property to a new value.', -'classObj::setExpression' => 'Set the :ref:`expression <expressions>` string for the class -object.', -'classObj::setMetaData' => 'Set a metadata entry for the class. Returns MS_SUCCESS/MS_FAILURE.', -'classObj::settext' => 'Set the text string for the class object.', -'classObj::updateFromString' => 'Update a class from a string snippet. Returns MS_SUCCESS/MS_FAILURE. -.. code-block:: php -set the color -$oClass->updateFromString(\'CLASS STYLE COLOR 255 0 255 END END\');', -'clearstatcache' => 'Clears file status cache', -'cli_get_process_title' => 'Returns the current process title', -'cli_set_process_title' => 'Sets the process title', -'closedir' => 'Close directory handle', -'closelog' => 'Close connection to system logger', -'Closure::__construct' => 'This method exists only to disallow instantiation of the Closure class. -Objects of this class are created in the fashion described on the anonymous functions page.', -'Closure::__invoke' => 'This is for consistency with other classes that implement calling magic, -as this method is not used for calling the function.', -'Closure::bind' => 'This method is a static version of Closure::bindTo(). -See the documentation of that method for more information.', -'Closure::bindTo' => 'Duplicates the closure with a new bound object and class scope', -'Closure::call' => 'Temporarily binds the closure to newthis, and calls it with any given parameters.', -'clusterObj::convertToString' => 'Saves the object to a string. Provides the inverse option for -updateFromString.', -'clusterObj::getFilterString' => 'Returns the :ref:`expression <expressions>` for this cluster -filter or NULL on error.', -'clusterObj::getGroupString' => 'Returns the :ref:`expression <expressions>` for this cluster group -or NULL on error.', -'clusterObj::setFilter' => 'Set layer filter :ref:`expression <expressions>`.', -'clusterObj::setGroup' => 'Set layer group :ref:`expression <expressions>`.', -'collator::__construct' => 'Create a collator', -'collator::asort' => 'Sort array maintaining index association', -'collator::compare' => 'Compare two Unicode strings', -'collator::create' => 'Create a collator', -'collator::getAttribute' => 'Get collation attribute value', -'collator::getErrorCode' => 'Get collator\'s last error code', -'collator::getErrorMessage' => 'Get text for collator\'s last error code', -'collator::getLocale' => 'Get the locale name of the collator', -'collator::getSortKey' => 'Get sorting key for a string', -'collator::getStrength' => 'Get current collation strength', -'collator::setAttribute' => 'Set collation attribute', -'collator::setStrength' => 'Set collation strength', -'collator::sort' => 'Sort array using specified collator', -'collator::sortWithSortKeys' => 'Sort array using specified collator and sort keys', -'collectable::isGarbage' => 'Determine whether an object has been marked as garbage', -'collectable::setGarbage' => 'Mark an object as garbage', -'colorObj::setHex' => 'Set red, green, blue and alpha values. The hex string should have the form -"#rrggbb" (alpha will be set to 255) or "#rrggbbaa". Returns MS_SUCCESS.', -'colorObj::toHex' => 'Get the color as a hex string "#rrggbb" or (if alpha is not 255) -"#rrggbbaa".', -'COM::__construct' => 'COM class constructor.', -'com_create_guid' => 'Generate a globally unique identifier (GUID)', -'com_event_sink' => 'Connect events from a COM object to a PHP object', -'com_get_active_object' => 'Returns a handle to an already running instance of a COM object', -'com_load_typelib' => 'Loads a Typelib', -'com_message_pump' => 'Process COM messages, sleeping for up to timeoutms milliseconds', -'com_print_typeinfo' => 'Print out a PHP class definition for a dispatchable interface', -'commonmark\cql::__construct' => 'CQL Construction', -'commonmark\cql::__invoke' => 'CQL Execution', -'commonmark\interfaces\ivisitable::accept' => 'Visitation', -'commonmark\interfaces\ivisitor::enter' => 'Visitation', -'commonmark\interfaces\ivisitor::leave' => 'Visitation', -'commonmark\node::accept' => 'Visitation', -'commonmark\node::appendChild' => 'AST Manipulation', -'commonmark\node::insertAfter' => 'AST Manipulation', -'commonmark\node::insertBefore' => 'AST Manipulation', -'commonmark\node::prependChild' => 'AST Manipulation', -'commonmark\node::replace' => 'AST Manipulation', -'commonmark\node::unlink' => 'AST Manipulation', -'commonmark\node\bulletlist::__construct' => 'BulletList Construction', -'commonmark\node\codeblock::__construct' => 'CodeBlock Construction', -'commonmark\node\heading::__construct' => 'Heading Construction', -'commonmark\node\image::__construct' => 'Image Construction', -'commonmark\node\link::__construct' => 'Link Construction', -'commonmark\node\orderedlist::__construct' => 'OrderedList Construction', -'commonmark\node\text::__construct' => 'Text Construction', -'commonmark\parse' => 'Parsing', -'commonmark\parser::__construct' => 'Parsing', -'commonmark\parser::finish' => 'Parsing', -'commonmark\parser::parse' => 'Parsing', -'commonmark\render' => 'Rendering', -'commonmark\render\html' => 'Rendering', -'commonmark\render\latex' => 'Rendering', -'commonmark\render\man' => 'Rendering', -'commonmark\render\xml' => 'Rendering', -'compact' => 'Create array containing variables and their values', -'componere\abstract\definition::addInterface' => 'Add Interface', -'componere\abstract\definition::addMethod' => 'Add Method', -'componere\abstract\definition::addTrait' => 'Add Trait', -'componere\abstract\definition::getReflector' => 'Reflection', -'componere\cast' => 'Casting', -'componere\cast_by_ref' => 'Casting', -'componere\definition::__construct' => 'Definition Construction', -'componere\definition::addConstant' => 'Add Constant', -'componere\definition::addProperty' => 'Add Property', -'componere\definition::getClosure' => 'Get Closure', -'componere\definition::getClosures' => 'Get Closures', -'componere\definition::isRegistered' => 'State Detection', -'componere\definition::register' => 'Registration', -'componere\method::__construct' => 'Method Construction', -'componere\method::getReflector' => 'Reflection', -'componere\method::setPrivate' => 'Accessibility Modification', -'componere\method::setProtected' => 'Accessibility Modification', -'componere\method::setStatic' => 'Accessibility Modification', -'componere\patch::__construct' => 'Patch Construction', -'componere\patch::apply' => 'Application', -'componere\patch::derive' => 'Patch Derivation', -'componere\patch::getClosure' => 'Get Closure', -'componere\patch::getClosures' => 'Get Closures', -'componere\patch::isApplied' => 'State Detection', -'componere\patch::revert' => 'Reversal', -'componere\value::__construct' => 'Value Construction', -'componere\value::hasDefault' => 'Value Interaction', -'componere\value::isPrivate' => 'Accessibility Detection', -'componere\value::isProtected' => 'Accessibility Detection', -'componere\value::isStatic' => 'Accessibility Detection', -'componere\value::setPrivate' => 'Accessibility Modification', -'componere\value::setProtected' => 'Accessibility Modification', -'componere\value::setStatic' => 'Accessibility Modification', -'cond::broadcast' => 'Broadcast a Condition', -'cond::create' => 'Create a Condition', -'cond::destroy' => 'Destroy a Condition', -'cond::signal' => 'Signal a Condition', -'cond::wait' => 'Wait for Condition', -'connection_aborted' => 'Check whether client disconnected', -'connection_status' => 'Returns connection status bitfield', -'constant' => 'Returns the value of a constant', -'convert_cyr_string' => 'Convert from one Cyrillic character set to another', -'convert_uudecode' => 'Decode a uuencoded string', -'convert_uuencode' => 'Uuencode a string', -'copy' => 'Copies file', -'cos' => 'Cosine', -'cosh' => 'Hyperbolic cosine', -'Couchbase\AnalyticsQuery::fromString' => 'Creates new AnalyticsQuery instance directly from the string.', -'Couchbase\basicDecoderV1' => 'Decodes value according to Common Flags (RFC-20)', -'Couchbase\basicEncoderV1' => 'Encodes value according to Common Flags (RFC-20)', -'Couchbase\Bucket::append' => 'Appends content to a document. - -On the server side it just contatenate passed value to the existing one. -Note that this might make the value un-decodable. Consider sub-document API -for partial updates of the JSON documents.', -'Couchbase\Bucket::counter' => 'Increments or decrements a key (based on $delta)', -'Couchbase\Bucket::decryptFields' => 'Decrypt fields inside specified document.', -'Couchbase\Bucket::diag' => 'Collect and return information about state of internal network connections.', -'Couchbase\Bucket::encryptFields' => 'Encrypt fields inside specified document.', -'Couchbase\Bucket::get' => 'Retrieves a document', -'Couchbase\Bucket::getAndLock' => 'Retrieves a document and locks it. - -After the document has been locked on the server, its CAS would be masked, -and all mutations of it will be rejected until the server unlocks the document -automatically or it will be done manually with \Couchbase\Bucket::unlock() operation.', -'Couchbase\Bucket::getAndTouch' => 'Retrieves a document and updates its expiration time.', -'Couchbase\Bucket::getFromReplica' => 'Retrieves a document from a replica.', -'Couchbase\Bucket::getName' => 'Returns the name of the bucket for current connection', -'Couchbase\Bucket::insert' => 'Inserts a document. This operation will fail if the document already exists on the cluster.', -'Couchbase\Bucket::listExists' => 'Check if the list contains specified value', -'Couchbase\Bucket::listGet' => 'Get an element at the given position', -'Couchbase\Bucket::listPush' => 'Add an element to the end of the list', -'Couchbase\Bucket::listRemove' => 'Remove an element at the given position', -'Couchbase\Bucket::listSet' => 'Set an element at the given position', -'Couchbase\Bucket::listShift' => 'Add an element to the beginning of the list', -'Couchbase\Bucket::listSize' => 'Returns size of the list', -'Couchbase\Bucket::lookupIn' => 'Returns a builder for reading subdocument API.', -'Couchbase\Bucket::manager' => 'Returns an instance of a CouchbaseBucketManager for performing management operations against a bucket.', -'Couchbase\Bucket::mapAdd' => 'Add key to the map', -'Couchbase\Bucket::mapGet' => 'Get an item from a map', -'Couchbase\Bucket::mapRemove' => 'Removes key from the map', -'Couchbase\Bucket::mapSize' => 'Returns size of the map', -'Couchbase\Bucket::mutateIn' => 'Returns a builder for writing subdocument API.', -'Couchbase\Bucket::ping' => 'Try to reach specified services, and measure network latency.', -'Couchbase\Bucket::prepend' => 'Prepends content to a document. - -On the server side it just contatenate existing value to the passed one. -Note that this might make the value un-decodable. Consider sub-document API -for partial updates of the JSON documents.', -'Couchbase\Bucket::query' => 'Performs a query to Couchbase Server', -'Couchbase\Bucket::queueAdd' => 'Add an element to the beginning of the queue', -'Couchbase\Bucket::queueExists' => 'Checks if the queue contains specified value', -'Couchbase\Bucket::queueRemove' => 'Remove the element at the end of the queue and return it', -'Couchbase\Bucket::queueSize' => 'Returns size of the queue', -'Couchbase\Bucket::remove' => 'Removes the document.', -'Couchbase\Bucket::replace' => 'Replaces a document. This operation will fail if the document does not exists on the cluster.', -'Couchbase\Bucket::retrieveIn' => 'Retrieves specified paths in JSON document - -This is essentially a shortcut for `lookupIn($id)->get($paths)->execute()`.', -'Couchbase\Bucket::setAdd' => 'Add value to the set - -Note, that currently only primitive values could be stored in the set (strings, integers and booleans).', -'Couchbase\Bucket::setExists' => 'Check if the value exists in the set', -'Couchbase\Bucket::setRemove' => 'Remove value from the set', -'Couchbase\Bucket::setSize' => 'Returns size of the set', -'Couchbase\Bucket::setTranscoder' => 'Sets custom encoder and decoder functions for handling serialization.', -'Couchbase\Bucket::touch' => 'Updates document\'s expiration time.', -'Couchbase\Bucket::unlock' => 'Unlocks previously locked document', -'Couchbase\Bucket::upsert' => 'Inserts or updates a document, depending on whether the document already exists on the cluster.', -'Couchbase\BucketManager::createN1qlIndex' => 'Create secondary N1QL index.', -'Couchbase\BucketManager::createN1qlPrimaryIndex' => 'Create a primary N1QL index.', -'Couchbase\BucketManager::dropN1qlIndex' => 'Drop the given secondary index', -'Couchbase\BucketManager::dropN1qlPrimaryIndex' => 'Drop the given primary index', -'Couchbase\BucketManager::flush' => 'Flushes the bucket (clears all data)', -'Couchbase\BucketManager::getDesignDocument' => 'Get design document by its name', -'Couchbase\BucketManager::info' => 'Returns information about the bucket - -Returns an associative array of status information as seen by the cluster for -this bucket. The exact structure of the returned data can be seen in the Couchbase -Manual by looking at the bucket /info endpoint.', -'Couchbase\BucketManager::insertDesignDocument' => 'Inserts design document and fails if it is exist already.', -'Couchbase\BucketManager::listDesignDocuments' => 'Returns all design documents of the bucket.', -'Couchbase\BucketManager::listN1qlIndexes' => 'List all N1QL indexes that are registered for the current bucket.', -'Couchbase\BucketManager::removeDesignDocument' => 'Removes design document by its name', -'Couchbase\BucketManager::upsertDesignDocument' => 'Creates or replaces design document.', -'Couchbase\ClassicAuthenticator::bucket' => 'Registers bucket credentials in the container', -'Couchbase\ClassicAuthenticator::cluster' => 'Registers cluster management credentials in the container', -'Couchbase\Cluster::__construct' => 'Create cluster object', -'Couchbase\Cluster::authenticate' => 'Associate authenticator with Cluster', -'Couchbase\Cluster::authenticateAs' => 'Create \Couchbase\PasswordAuthenticator from given credentials and associate it with Cluster', -'Couchbase\Cluster::manager' => 'Open management connection to the Couchbase cluster.', -'Couchbase\Cluster::openBucket' => 'Open connection to the Couchbase bucket', -'Couchbase\ClusterManager::createBucket' => 'Creates new bucket', -'Couchbase\ClusterManager::getUser' => 'Fetch single user by its name', -'Couchbase\ClusterManager::info' => 'Provides information about the cluster. - -Returns an associative array of status information as seen on the cluster. The exact structure of the returned -data can be seen in the Couchbase Manual by looking at the cluster /info endpoint.', -'Couchbase\ClusterManager::listBuckets' => 'Lists all buckets on this cluster.', -'Couchbase\ClusterManager::listUsers' => 'Lists all users on this cluster.', -'Couchbase\ClusterManager::removeBucket' => 'Removes a bucket identified by its name.', -'Couchbase\ClusterManager::removeUser' => 'Removes a user identified by its name.', -'Couchbase\ClusterManager::upsertUser' => 'Creates new user', -'Couchbase\defaultDecoder' => 'Decodes value using \Couchbase\basicDecoderV1. - -It passes `couchbase.decoder.*` INI properties as $options.', -'Couchbase\defaultEncoder' => 'Encodes value using \Couchbase\basicDecoderV1. - -It passes `couchbase.encoder.*` INI properties as $options.', -'Couchbase\fastlzCompress' => 'Compress input using FastLZ algorithm.', -'Couchbase\fastlzDecompress' => 'Decompress input using FastLZ algorithm.', -'Couchbase\LookupInBuilder::execute' => 'Perform several lookup operations inside a single existing JSON document, using a specific timeout', -'Couchbase\LookupInBuilder::exists' => 'Check if a value exists inside the document. - -This doesn\'t transmit the value on the wire if it exists, saving the corresponding byte overhead.', -'Couchbase\LookupInBuilder::get' => 'Get a value inside the JSON document.', -'Couchbase\LookupInBuilder::getCount' => 'Get a count of values inside the JSON document. - -This method is only available with Couchbase Server 5.0 and later.', -'Couchbase\MutateInBuilder::arrayAddUnique' => 'Insert a value in an existing array only if the value -isn\'t already contained in the array (by way of string comparison).', -'Couchbase\MutateInBuilder::arrayAppend' => 'Append to an existing array, pushing the value to the back/last position in the array.', -'Couchbase\MutateInBuilder::arrayAppendAll' => 'Append multiple values at once in an existing array. - -Push all values in the collection\'s iteration order to the back/end of the array. -For example given an array [A, B, C], appending the values X and Y yields [A, B, C, X, Y] -and not [A, B, C, [X, Y]].', -'Couchbase\MutateInBuilder::arrayInsert' => 'Insert into an existing array at a specific position - -Position denoted in the path, eg. "sub.array[2]".', -'Couchbase\MutateInBuilder::arrayInsertAll' => 'Insert multiple values at once in an existing array at a specified position. - -Position denoted in the path, eg. "sub.array[2]"), inserting all values in the collection\'s iteration order -at the given position and shifting existing values beyond the position by the number of elements in the -collection. - -For example given an array [A, B, C], inserting the values X and Y at position 1 yields [A, B, X, Y, C] -and not [A, B, [X, Y], C].', -'Couchbase\MutateInBuilder::arrayPrepend' => 'Prepend to an existing array, pushing the value to the front/first position in the array.', -'Couchbase\MutateInBuilder::arrayPrependAll' => 'Prepend multiple values at once in an existing array. - -Push all values in the collection\'s iteration order to the front/start of the array. -For example given an array [A, B, C], prepending the values X and Y yields [X, Y, A, B, C] -and not [[X, Y], A, B, C].', -'Couchbase\MutateInBuilder::counter' => 'Increment/decrement a numerical fragment in a JSON document. - -If the value (last element of the path) doesn\'t exist the counter -is created and takes the value of the delta.', -'Couchbase\MutateInBuilder::execute' => 'Perform several mutation operations inside a single existing JSON document.', -'Couchbase\MutateInBuilder::insert' => 'Insert a fragment provided the last element of the path doesn\'t exists.', -'Couchbase\MutateInBuilder::modeDocument' => 'Select mode for new full-document operations. - -It defines behaviour of MutateInBuilder#upsert() method. The $mode -could take one of three modes: - * FULLDOC_REPLACE: complain when document does not exist - * FULLDOC_INSERT: complain when document does exist - * FULLDOC_UPSERT: unconditionally set value for the document', -'Couchbase\MutateInBuilder::remove' => 'Remove an entry in a JSON document. - -Scalar, array element, dictionary entry, whole array or dictionary, depending on the path.', -'Couchbase\MutateInBuilder::replace' => 'Replace an existing value by the given fragment', -'Couchbase\MutateInBuilder::upsert' => 'Insert a fragment, replacing the old value if the path exists. - -When only one argument supplied, the library will handle it as full-document -upsert, and treat this argument as value. See MutateInBuilder#modeDocument()', -'Couchbase\MutateInBuilder::withExpiry' => 'Change the expiry of the enclosing document as part of the mutation.', -'Couchbase\MutationState::add' => 'Update container with the given mutation token holders.', -'Couchbase\MutationState::from' => 'Create container from the given mutation token holders.', -'Couchbase\MutationToken::bucketName' => 'Returns bucket name', -'Couchbase\MutationToken::from' => 'Creates new mutation token', -'Couchbase\MutationToken::sequenceNumber' => 'Returns the sequence number inside partition', -'Couchbase\MutationToken::vbucketId' => 'Returns partition number', -'Couchbase\MutationToken::vbucketUuid' => 'Returns UUID of the partition', -'Couchbase\N1qlQuery::adhoc' => 'Allows to specify if this query is adhoc or not. - -If it is not adhoc (so performed often), the client will try to perform optimizations -transparently based on the server capabilities, like preparing the statement and -then executing a query plan instead of the raw query.', -'Couchbase\N1qlQuery::consistency' => 'Specifies the consistency level for this query', -'Couchbase\N1qlQuery::consistentWith' => 'Sets mutation state the query should be consistent with', -'Couchbase\N1qlQuery::crossBucket' => 'Allows to pull credentials from the Authenticator', -'Couchbase\N1qlQuery::fromString' => 'Creates new N1qlQuery instance directly from the N1QL string.', -'Couchbase\N1qlQuery::maxParallelism' => 'Allows to override the default maximum parallelism for the query execution on the server side.', -'Couchbase\N1qlQuery::namedParams' => 'Specify associative array of named parameters - -The supplied array of key/value pairs will be merged with already existing named parameters. -Note: carefully choose type of quotes for the query string, because PHP also uses `$` -(dollar sign) for variable interpolation. If you are using double quotes, make sure -that N1QL parameters properly escaped.', -'Couchbase\N1qlQuery::pipelineBatch' => 'Advanced: Controls the number of items execution operators can batch for Fetch from the KV.', -'Couchbase\N1qlQuery::pipelineCap' => 'Advanced: Maximum number of items each execution operator can buffer between various operators.', -'Couchbase\N1qlQuery::positionalParams' => 'Specify array of positional parameters - -Previously specified positional parameters will be replaced. -Note: carefully choose type of quotes for the query string, because PHP also uses `$` -(dollar sign) for variable interpolation. If you are using double quotes, make sure -that N1QL parameters properly escaped.', -'Couchbase\N1qlQuery::profile' => 'Controls the profiling mode used during query execution', -'Couchbase\N1qlQuery::readonly' => 'If set to true, it will signal the query engine on the server that only non-data modifying requests -are allowed. Note that this rule is enforced on the server and not the SDK side. - -Controls whether a query can change a resulting record set. - -If readonly is true, then the following statements are not allowed: - - CREATE INDEX - - DROP INDEX - - INSERT - - MERGE - - UPDATE - - UPSERT - - DELETE', -'Couchbase\N1qlQuery::scanCap' => 'Advanced: Maximum buffered channel size between the indexer client and the query service for index scans. - -This parameter controls when to use scan backfill. Use 0 or a negative number to disable.', -'Couchbase\passthruDecoder' => 'Returns value as it received from the server without any transformations. - -It is useful for debug purpose to inspect bare value.', -'Couchbase\passthruEncoder' => 'Returns the value, which has been passed and zero as flags and datatype. - -It is useful for debug purposes, or when the value known to be a string, otherwise behavior is not defined (most -likely it will generate error).', -'Couchbase\PasswordAuthenticator::password' => 'Sets password', -'Couchbase\PasswordAuthenticator::username' => 'Sets username', -'Couchbase\SearchQuery::__construct' => 'Prepare an FTS SearchQuery on an index. - -Top level query parameters can be set after that by using the fluent API.', -'Couchbase\SearchQuery::addFacet' => 'Adds one SearchFacet to the query - -This is an additive operation (the given facets are added to any facet previously requested), -but if an existing facet has the same name it will be replaced. - -Note that to be faceted, a field\'s value must be stored in the FTS index.', -'Couchbase\SearchQuery::boolean' => 'Prepare boolean search query', -'Couchbase\SearchQuery::booleanField' => 'Prepare boolean field search query', -'Couchbase\SearchQuery::conjuncts' => 'Prepare compound conjunction search query', -'Couchbase\SearchQuery::consistentWith' => 'Sets the consistency to consider for this FTS query to AT_PLUS and -uses the MutationState to parameterize the consistency. - -This replaces any consistency tuning previously set.', -'Couchbase\SearchQuery::dateRange' => 'Prepare date range search query', -'Couchbase\SearchQuery::dateRangeFacet' => 'Prepare date range search facet', -'Couchbase\SearchQuery::disjuncts' => 'Prepare compound disjunction search query', -'Couchbase\SearchQuery::docId' => 'Prepare document ID search query', -'Couchbase\SearchQuery::explain' => 'Activates the explanation of each result hit in the response', -'Couchbase\SearchQuery::fields' => 'Configures the list of fields for which the whole value should be included in the response. - -If empty, no field values are included. This drives the inclusion of the fields in each hit. -Note that to be highlighted, the fields must be stored in the FTS index.', -'Couchbase\SearchQuery::geoBoundingBox' => 'Prepare geo bounding box search query', -'Couchbase\SearchQuery::geoDistance' => 'Prepare geo distance search query', -'Couchbase\SearchQuery::highlight' => 'Configures the highlighting of matches in the response', -'Couchbase\SearchQuery::limit' => 'Add a limit to the query on the number of hits it can return', -'Couchbase\SearchQuery::match' => 'Prepare match search query', -'Couchbase\SearchQuery::matchAll' => 'Prepare match all search query', -'Couchbase\SearchQuery::matchNone' => 'Prepare match non search query', -'Couchbase\SearchQuery::matchPhrase' => 'Prepare phrase search query', -'Couchbase\SearchQuery::numericRange' => 'Prepare numeric range search query', -'Couchbase\SearchQuery::numericRangeFacet' => 'Prepare numeric range search facet', -'Couchbase\SearchQuery::prefix' => 'Prepare prefix search query', -'Couchbase\SearchQuery::queryString' => 'Prepare query string search query', -'Couchbase\SearchQuery::regexp' => 'Prepare regexp search query', -'Couchbase\SearchQuery::serverSideTimeout' => 'Sets the server side timeout in milliseconds', -'Couchbase\SearchQuery::skip' => 'Set the number of hits to skip (eg. for pagination).', -'Couchbase\SearchQuery::sort' => 'Configures the list of fields (including special fields) which are used for sorting purposes. -If empty, the default sorting (descending by score) is used by the server. - -The list of sort fields can include actual fields (like "firstname" but then they must be stored in the -index, configured in the server side mapping). Fields provided first are considered first and in a "tie" case -the next sort field is considered. So sorting by "firstname" and then "lastname" will first sort ascending by -the firstname and if the names are equal then sort ascending by lastname. Special fields like "_id" and -"_score" can also be used. If prefixed with "-" the sort order is set to descending. - -If no sort is provided, it is equal to sort("-_score"), since the server will sort it by score in descending -order.', -'Couchbase\SearchQuery::term' => 'Prepare term search query', -'Couchbase\SearchQuery::termFacet' => 'Prepare term search facet', -'Couchbase\SearchQuery::termRange' => 'Prepare term range search query', -'Couchbase\SearchQuery::wildcard' => 'Prepare wildcard search query', -'Couchbase\SearchSort::field' => 'Sort by a field in the hits.', -'Couchbase\SearchSort::geoDistance' => 'Sort by geo location.', -'Couchbase\SearchSort::id' => 'Sort by the document identifier.', -'Couchbase\SearchSort::score' => 'Sort by the hit score.', -'Couchbase\SearchSortField::descending' => 'Direction of the sort', -'Couchbase\SearchSortField::field' => 'Sort by a field in the hits.', -'Couchbase\SearchSortField::geoDistance' => 'Sort by geo location.', -'Couchbase\SearchSortField::id' => 'Sort by the document identifier.', -'Couchbase\SearchSortField::jsonSerialize' => 'Specify data which should be serialized to JSON', -'Couchbase\SearchSortField::missing' => 'Set where the hits with missing field will be inserted', -'Couchbase\SearchSortField::mode' => 'Set mode of the sort', -'Couchbase\SearchSortField::score' => 'Sort by the hit score.', -'Couchbase\SearchSortField::type' => 'Set type of the field', -'Couchbase\SearchSortGeoDistance::descending' => 'Direction of the sort', -'Couchbase\SearchSortGeoDistance::field' => 'Sort by a field in the hits.', -'Couchbase\SearchSortGeoDistance::geoDistance' => 'Sort by geo location.', -'Couchbase\SearchSortGeoDistance::id' => 'Sort by the document identifier.', -'Couchbase\SearchSortGeoDistance::jsonSerialize' => 'Specify data which should be serialized to JSON', -'Couchbase\SearchSortGeoDistance::score' => 'Sort by the hit score.', -'Couchbase\SearchSortGeoDistance::unit' => 'Name of the units', -'Couchbase\SearchSortId::descending' => 'Direction of the sort', -'Couchbase\SearchSortId::field' => 'Sort by a field in the hits.', -'Couchbase\SearchSortId::geoDistance' => 'Sort by geo location.', -'Couchbase\SearchSortId::id' => 'Sort by the document identifier.', -'Couchbase\SearchSortId::jsonSerialize' => 'Specify data which should be serialized to JSON', -'Couchbase\SearchSortId::score' => 'Sort by the hit score.', -'Couchbase\SearchSortScore::descending' => 'Direction of the sort', -'Couchbase\SearchSortScore::field' => 'Sort by a field in the hits.', -'Couchbase\SearchSortScore::geoDistance' => 'Sort by geo location.', -'Couchbase\SearchSortScore::id' => 'Sort by the document identifier.', -'Couchbase\SearchSortScore::jsonSerialize' => 'Specify data which should be serialized to JSON', -'Couchbase\SearchSortScore::score' => 'Sort by the hit score.', -'Couchbase\SpatialViewQuery::bbox' => 'Specifies the bounding box to search within. - -Note, using bbox() is discouraged, startRange/endRange is more flexible and should be preferred.', -'Couchbase\SpatialViewQuery::consistency' => 'Specifies the mode of updating to perorm before and after executing the query', -'Couchbase\SpatialViewQuery::custom' => 'Specifies custom options to pass to the server. - -Note that these options are expected to be already encoded.', -'Couchbase\SpatialViewQuery::encode' => 'Returns associative array, representing the View query.', -'Couchbase\SpatialViewQuery::endRange' => 'Specify end range for query', -'Couchbase\SpatialViewQuery::limit' => 'Limits the result set to a specified number rows.', -'Couchbase\SpatialViewQuery::order' => 'Orders the results by key as specified', -'Couchbase\SpatialViewQuery::skip' => 'Skips a number o records rom the beginning of the result set', -'Couchbase\SpatialViewQuery::startRange' => 'Specify start range for query', -'Couchbase\UserSettings::fullName' => 'Sets full name of the user (optional).', -'Couchbase\UserSettings::password' => 'Sets password of the user.', -'Couchbase\UserSettings::role' => 'Adds role to the list of the accessible roles of the user.', -'Couchbase\ViewQuery::consistency' => 'Specifies the mode of updating to perorm before and after executing the query', -'Couchbase\ViewQuery::custom' => 'Specifies custom options to pass to the server. - -Note that these options are expected to be already encoded.', -'Couchbase\ViewQuery::encode' => 'Returns associative array, representing the View query.', -'Couchbase\ViewQuery::from' => 'Creates a new Couchbase ViewQuery instance for performing a view query.', -'Couchbase\ViewQuery::fromSpatial' => 'Creates a new Couchbase ViewQuery instance for performing a spatial query.', -'Couchbase\ViewQuery::group' => 'Group the results using the reduce function to a group or single row. - -Important: this setter and groupLevel should not be used together in the -same ViewQuery. It is sufficient to only set the grouping level only and -use this setter in cases where you always want the highest group level -implicitly.', -'Couchbase\ViewQuery::groupLevel' => 'Specify the group level to be used. - -Important: group() and this setter should not be used together in the -same ViewQuery. It is sufficient to only use this setter and use group() -in cases where you always want the highest group level implicitly.', -'Couchbase\ViewQuery::idRange' => 'Specifies start and end document IDs in addition to range limits. - -This might be needed for more precise pagination with a lot of documents -with the same key selected into the same page.', -'Couchbase\ViewQuery::key' => 'Restict results of the query to the specified key', -'Couchbase\ViewQuery::keys' => 'Restict results of the query to the specified set of keys', -'Couchbase\ViewQuery::limit' => 'Limits the result set to a specified number rows.', -'Couchbase\ViewQuery::order' => 'Orders the results by key as specified', -'Couchbase\ViewQuery::range' => 'Specifies a range of the keys to return from the index.', -'Couchbase\ViewQuery::reduce' => 'Specifies whether the reduction function should be applied to results of the query.', -'Couchbase\ViewQuery::skip' => 'Skips a number o records rom the beginning of the result set', -'Couchbase\ViewQueryEncodable::encode' => 'Returns associative array, representing the View query.', -'Couchbase\zlibCompress' => 'Compress input using zlib. Raises Exception when extension compiled without zlib support.', -'Couchbase\zlibDecompress' => 'Compress input using zlib. Raises Exception when extension compiled without zlib support.', -'count' => 'Count all elements in an array, or something in an object', -'count_chars' => 'Return information about characters used in a string', -'countable::count' => 'Count elements of an object', -'crack_check' => 'Performs an obscure check with the given password', -'crack_closedict' => 'Closes an open CrackLib dictionary', -'crack_getlastmessage' => 'Returns the message from the last obscure check', -'crack_opendict' => 'Opens a new CrackLib dictionary', -'crc32' => 'Calculates the crc32 polynomial of a string', -'create_function' => 'Create an anonymous (lambda-style) function', -'crypt' => 'One-way string hashing', -'ctype_alnum' => 'Check for alphanumeric character(s)', -'ctype_alpha' => 'Check for alphabetic character(s)', -'ctype_cntrl' => 'Check for control character(s)', -'ctype_digit' => 'Check for numeric character(s)', -'ctype_graph' => 'Check for any printable character(s) except space', -'ctype_lower' => 'Check for lowercase character(s)', -'ctype_print' => 'Check for printable character(s)', -'ctype_punct' => 'Check for any printable character which is not whitespace or an alphanumeric character', -'ctype_space' => 'Check for whitespace character(s)', -'ctype_upper' => 'Check for uppercase character(s)', -'ctype_xdigit' => 'Check for character(s) representing a hexadecimal digit', -'cubrid_bind' => 'Bind variables to a prepared statement as parameters', -'cubrid_close_prepare' => 'Close the request handle', -'cubrid_close_request' => 'Close the request handle', -'cubrid_col_get' => 'Get contents of collection type column using OID', -'cubrid_col_size' => 'Get the number of elements in collection type column using OID', -'cubrid_column_names' => 'Get the column names in result', -'cubrid_column_types' => 'Get column types in result', -'cubrid_commit' => 'Commit a transaction', -'cubrid_connect' => 'Open a connection to a CUBRID Server', -'cubrid_connect_with_url' => 'Establish the environment for connecting to CUBRID server', -'cubrid_current_oid' => 'Get OID of the current cursor location', -'cubrid_disconnect' => 'Close a database connection', -'cubrid_drop' => 'Delete an instance using OID', -'cubrid_error_code' => 'Get error code for the most recent function call', -'cubrid_error_code_facility' => 'Get the facility code of error', -'cubrid_error_msg' => 'Get last error message for the most recent function call', -'cubrid_execute' => 'Execute a prepared SQL statement', -'cubrid_fetch' => 'Fetch the next row from a result set', -'cubrid_free_result' => 'Free the memory occupied by the result data', -'cubrid_get' => 'Get a column using OID', -'cubrid_get_autocommit' => 'Get auto-commit mode of the connection', -'cubrid_get_charset' => 'Return the current CUBRID connection charset', -'cubrid_get_class_name' => 'Get the class name using OID', -'cubrid_get_client_info' => 'Return the client library version', -'cubrid_get_db_parameter' => 'Returns the CUBRID database parameters', -'cubrid_get_query_timeout' => 'Get the query timeout value of the request', -'cubrid_get_server_info' => 'Return the CUBRID server version', -'cubrid_insert_id' => 'Return the ID generated for the last updated AUTO_INCREMENT column', -'cubrid_is_instance' => 'Check whether the instance pointed by OID exists', -'cubrid_lob2_bind' => 'Bind a lob object or a string as a lob object to a prepared statement as parameters', -'cubrid_lob2_close' => 'Close LOB object', -'cubrid_lob2_export' => 'Export the lob object to a file', -'cubrid_lob2_import' => 'Import BLOB/CLOB data from a file', -'cubrid_lob2_new' => 'Create a lob object', -'cubrid_lob2_read' => 'Read from BLOB/CLOB data', -'cubrid_lob2_seek' => 'Move the cursor of a lob object', -'cubrid_lob2_seek64' => 'Move the cursor of a lob object', -'cubrid_lob2_size' => 'Get a lob object\'s size', -'cubrid_lob2_size64' => 'Get a lob object\'s size', -'cubrid_lob2_tell' => 'Tell the cursor position of the LOB object', -'cubrid_lob2_tell64' => 'Tell the cursor position of the LOB object', -'cubrid_lob2_write' => 'Write to a lob object', -'cubrid_lob_close' => 'Close BLOB/CLOB data', -'cubrid_lob_export' => 'Export BLOB/CLOB data to file', -'cubrid_lob_get' => 'Get BLOB/CLOB data', -'cubrid_lob_send' => 'Read BLOB/CLOB data and send straight to browser', -'cubrid_lob_size' => 'Get BLOB/CLOB data size', -'cubrid_lock_read' => 'Set a read lock on the given OID', -'cubrid_lock_write' => 'Set a write lock on the given OID', -'cubrid_move_cursor' => 'Move the cursor in the result', -'cubrid_next_result' => 'Get result of next query when executing multiple SQL statements', -'cubrid_num_cols' => 'Return the number of columns in the result set', -'cubrid_num_rows' => 'Get the number of rows in the result set', -'cubrid_pconnect' => 'Open a persistent connection to a CUBRID server', -'cubrid_pconnect_with_url' => 'Open a persistent connection to CUBRID server', -'cubrid_prepare' => 'Prepare a SQL statement for execution', -'cubrid_put' => 'Update a column using OID', -'cubrid_rollback' => 'Roll back a transaction', -'cubrid_schema' => 'Get the requested schema information', -'cubrid_seq_drop' => 'Delete an element from sequence type column using OID', -'cubrid_seq_insert' => 'Insert an element to a sequence type column using OID', -'cubrid_seq_put' => 'Update the element value of sequence type column using OID', -'cubrid_set_add' => 'Insert a single element to set type column using OID', -'cubrid_set_autocommit' => 'Set autocommit mode of the connection', -'cubrid_set_db_parameter' => 'Sets the CUBRID database parameters', -'cubrid_set_drop' => 'Delete an element from set type column using OID', -'cubrid_set_query_timeout' => 'Set the timeout time of query execution', -'cubrid_version' => 'Get the CUBRID PHP module\'s version', -'curl_close' => 'Close a cURL session', -'curl_copy_handle' => 'Copy a cURL handle along with all of its preferences', -'curl_errno' => 'Return the last error number', -'curl_error' => 'Return a string containing the last error for the current session', -'curl_escape' => 'URL encodes the given string', -'curl_exec' => 'Perform a cURL session', -'curl_file_create' => 'Create a CURLFile object', -'curl_getinfo' => 'Get information regarding a specific transfer', -'curl_init' => 'Initialize a cURL session', -'curl_multi_add_handle' => 'Add a normal cURL handle to a cURL multi handle', -'curl_multi_close' => 'Close a set of cURL handles', -'curl_multi_errno' => 'Return the last multi curl error number', -'curl_multi_exec' => 'Run the sub-connections of the current cURL handle', -'curl_multi_getcontent' => 'Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set', -'curl_multi_info_read' => 'Get information about the current transfers', -'curl_multi_init' => 'Returns a new cURL multi handle', -'curl_multi_remove_handle' => 'Remove a multi handle from a set of cURL handles', -'curl_multi_select' => 'Wait for activity on any curl_multi connection', -'curl_multi_setopt' => 'Set an option for the cURL multi handle', -'curl_multi_strerror' => 'Return string describing error code', -'curl_pause' => 'Pause and unpause a connection', -'curl_reset' => 'Reset all options of a libcurl session handle', -'curl_setopt' => 'Set an option for a cURL transfer', -'curl_setopt_array' => 'Set multiple options for a cURL transfer', -'curl_share_close' => 'Close a cURL share handle', -'curl_share_errno' => 'Return the last share curl error number', -'curl_share_init' => 'Initialize a cURL share handle', -'curl_share_setopt' => 'Set an option for a cURL share handle', -'curl_share_strerror' => 'Return string describing the given error code', -'curl_strerror' => 'Return string describing the given error code', -'curl_unescape' => 'Decodes the given URL encoded string', -'curl_version' => 'Gets cURL version information', -'curlfile::__construct' => 'Create a CURLFile object', -'curlfile::__wakeup' => 'Unserialization handler', -'curlfile::getFilename' => 'Get file name', -'curlfile::getMimeType' => 'Get MIME type', -'curlfile::getPostFilename' => 'Get file name for POST', -'curlfile::setMimeType' => 'Set MIME type', -'curlfile::setPostFilename' => 'Set file name for POST', -'current' => 'Return the current element in an array', -'cyrus_authenticate' => 'Authenticate against a Cyrus IMAP server', -'cyrus_bind' => 'Bind callbacks to a Cyrus IMAP connection', -'cyrus_close' => 'Close connection to a Cyrus IMAP server', -'cyrus_connect' => 'Connect to a Cyrus IMAP server', -'cyrus_query' => 'Send a query to a Cyrus IMAP server', -'cyrus_unbind' => 'Unbind ...', -'date' => 'Format a local time/date', -'date_add' => 'Alias of DateTime::add', -'date_create' => 'Alias of DateTime::__construct', -'date_create_from_format' => 'Alias of DateTime::createFromFormat', -'date_create_immutable' => 'Alias of DateTimeImmutable::__construct', -'date_create_immutable_from_format' => 'Alias of DateTimeImmutable::createFromFormat', -'date_date_set' => 'Alias of DateTime::setDate', -'date_default_timezone_get' => 'Gets the default timezone used by all date/time functions in a script', -'date_default_timezone_set' => 'Sets the default timezone used by all date/time functions in a script', -'date_diff' => 'Alias of DateTime::diff', -'date_format' => 'Alias of DateTime::format', -'date_get_last_errors' => 'Alias of DateTime::getLastErrors', -'date_interval_create_from_date_string' => 'Alias of DateInterval::createFromDateString', -'date_interval_format' => 'Alias of DateInterval::format', -'date_isodate_set' => 'Alias of DateTime::setISODate', -'date_modify' => 'Alias of DateTime::modify', -'date_offset_get' => 'Alias of DateTime::getOffset', -'date_parse' => 'Returns associative array with detailed info about given date', -'date_parse_from_format' => 'Get info about given date formatted according to the specified format', -'date_sub' => 'Alias of DateTime::sub', -'date_sun_info' => 'Returns an array with information about sunset/sunrise and twilight begin/end', -'date_sunrise' => 'Returns time of sunrise for a given day and location', -'date_sunset' => 'Returns time of sunset for a given day and location', -'date_time_set' => 'Alias of DateTime::setTime', -'date_timestamp_get' => 'Alias of DateTime::getTimestamp', -'date_timestamp_set' => 'Alias of DateTime::setTimestamp', -'date_timezone_get' => 'Alias of DateTime::getTimezone', -'date_timezone_set' => 'Alias of DateTime::setTimezone', -'dateinterval::__construct' => 'Creates a new DateInterval object', -'dateinterval::createFromDateString' => 'Sets up a DateInterval from the relative parts of the string', -'dateinterval::format' => 'Formats the interval', -'dateperiod::__construct' => 'Creates a new DatePeriod object', -'dateperiod::getDateInterval' => 'Gets the interval', -'dateperiod::getEndDate' => 'Gets the end date', -'dateperiod::getRecurrences' => 'Gets the number of recurrences', -'dateperiod::getStartDate' => 'Gets the start date', -'datetime::__construct' => 'Returns new DateTime object', -'datetime::__set_state' => 'The __set_state handler', -'datetime::add' => 'Adds an amount of days, months, years, hours, minutes and seconds to a DateTime object', -'datetime::createFromFormat' => 'Parses a time string according to a specified format', -'DateTime::diff' => 'Returns the difference between two DateTime objects represented as a DateInterval.', -'DateTime::format' => 'Returns date formatted according to given format.', -'datetime::getLastErrors' => 'Returns the warnings and errors', -'DateTime::getOffset' => 'Returns the timezone offset', -'DateTime::getTimestamp' => 'Gets the Unix timestamp.', -'DateTime::getTimezone' => 'Get the TimeZone associated with the DateTime', -'datetime::modify' => 'Alters the timestamp', -'datetime::setDate' => 'Sets the date', -'datetime::setISODate' => 'Sets the ISO date', -'datetime::setTime' => 'Sets the time', -'datetime::setTimestamp' => 'Sets the date and time based on an Unix timestamp', -'datetime::setTimezone' => 'Sets the time zone for the DateTime object', -'datetime::sub' => 'Subtracts an amount of days, months, years, hours, minutes and seconds from a DateTime object', -'datetimeimmutable::__construct' => 'Returns new DateTimeImmutable object', -'datetimeimmutable::__set_state' => 'The __set_state handler', -'DateTimeImmutable::__wakeup' => 'The __wakeup handler', -'datetimeimmutable::add' => 'Adds an amount of days, months, years, hours, minutes and seconds', -'datetimeimmutable::createFromFormat' => 'Parses a time string according to a specified format', -'datetimeimmutable::createFromMutable' => 'Returns new DateTimeImmutable object encapsulating the given DateTime object', -'DateTimeImmutable::diff' => 'Returns the difference between two DateTime objects', -'DateTimeImmutable::format' => 'Returns date formatted according to given format', -'datetimeimmutable::getLastErrors' => 'Returns the warnings and errors', -'DateTimeImmutable::getOffset' => 'Returns the timezone offset', -'DateTimeImmutable::getTimestamp' => 'Gets the Unix timestamp', -'DateTimeImmutable::getTimezone' => 'Return time zone relative to given DateTime', -'datetimeimmutable::modify' => 'Creates a new object with modified timestamp', -'datetimeimmutable::setDate' => 'Sets the date', -'datetimeimmutable::setISODate' => 'Sets the ISO date', -'datetimeimmutable::setTime' => 'Sets the time', -'datetimeimmutable::setTimestamp' => 'Sets the date and time based on a Unix timestamp', -'datetimeimmutable::setTimezone' => 'Sets the time zone', -'datetimeimmutable::sub' => 'Subtracts an amount of days, months, years, hours, minutes and seconds', -'DateTimeInterface::__wakeup' => 'The __wakeup handler', -'DateTimeInterface::diff' => 'Returns the difference between two DateTime objects', -'DateTimeInterface::format' => 'Returns date formatted according to given format', -'DateTimeInterface::getOffset' => 'Returns the timezone offset', -'DateTimeInterface::getTimestamp' => 'Gets the Unix timestamp', -'DateTimeInterface::getTimezone' => 'Return time zone relative to given DateTime', -'datetimezone::__construct' => 'Creates new DateTimeZone object', -'datetimezone::getLocation' => 'Returns location information for a timezone', -'datetimezone::getName' => 'Returns the name of the timezone', -'datetimezone::getOffset' => 'Returns the timezone offset from GMT', -'datetimezone::getTransitions' => 'Returns all transitions for the timezone', -'datetimezone::listAbbreviations' => 'Returns associative array containing dst, offset and the timezone name', -'datetimezone::listIdentifiers' => 'Returns a numerically indexed array containing all defined timezone identifiers', -'db2_autocommit' => 'Returns or sets the AUTOCOMMIT state for a database connection', -'db2_bind_param' => 'Binds a PHP variable to an SQL statement parameter', -'db2_client_info' => 'Returns an object with properties that describe the DB2 database client', -'db2_close' => 'Closes a database connection', -'db2_column_privileges' => 'Returns a result set listing the columns and associated privileges for a table', -'db2_columns' => 'Returns a result set listing the columns and associated metadata for a table', -'db2_commit' => 'Commits a transaction', -'db2_conn_error' => 'Returns a string containing the SQLSTATE returned by the last connection attempt', -'db2_conn_errormsg' => 'Returns the last connection error message and SQLCODE value', -'db2_connect' => 'Returns a connection to a database', -'db2_cursor_type' => 'Returns the cursor type used by a statement resource', -'db2_escape_string' => 'Used to escape certain characters', -'db2_exec' => 'Executes an SQL statement directly', -'db2_execute' => 'Executes a prepared SQL statement', -'db2_fetch_array' => 'Returns an array, indexed by column position, representing a row in a result set', -'db2_fetch_assoc' => 'Returns an array, indexed by column name, representing a row in a result set', -'db2_fetch_both' => 'Returns an array, indexed by both column name and position, representing a row in a result set', -'db2_fetch_object' => 'Returns an object with properties representing columns in the fetched row', -'db2_fetch_row' => 'Sets the result set pointer to the next row or requested row', -'db2_field_display_size' => 'Returns the maximum number of bytes required to display a column', -'db2_field_name' => 'Returns the name of the column in the result set', -'db2_field_num' => 'Returns the position of the named column in a result set', -'db2_field_precision' => 'Returns the precision of the indicated column in a result set', -'db2_field_scale' => 'Returns the scale of the indicated column in a result set', -'db2_field_type' => 'Returns the data type of the indicated column in a result set', -'db2_field_width' => 'Returns the width of the current value of the indicated column in a result set', -'db2_foreign_keys' => 'Returns a result set listing the foreign keys for a table', -'db2_free_result' => 'Frees resources associated with a result set', -'db2_free_stmt' => 'Frees resources associated with the indicated statement resource', -'db2_get_option' => 'Retrieves an option value for a statement resource or a connection resource', -'db2_last_insert_id' => 'Returns the auto generated ID of the last insert query that successfully executed on this connection', -'db2_lob_read' => 'Gets a user defined size of LOB files with each invocation', -'db2_next_result' => 'Requests the next result set from a stored procedure', -'db2_num_fields' => 'Returns the number of fields contained in a result set', -'db2_num_rows' => 'Returns the number of rows affected by an SQL statement', -'db2_pclose' => 'Closes a persistent database connection', -'db2_pconnect' => 'Returns a persistent connection to a database', -'db2_prepare' => 'Prepares an SQL statement to be executed', -'db2_primary_keys' => 'Returns a result set listing primary keys for a table', -'db2_procedure_columns' => 'Returns a result set listing stored procedure parameters', -'db2_procedures' => 'Returns a result set listing the stored procedures registered in a database', -'db2_result' => 'Returns a single column from a row in the result set', -'db2_rollback' => 'Rolls back a transaction', -'db2_server_info' => 'Returns an object with properties that describe the DB2 database server', -'db2_set_option' => 'Set options for connection or statement resources', -'db2_special_columns' => 'Returns a result set listing the unique row identifier columns for a table', -'db2_statistics' => 'Returns a result set listing the index and statistics for a table', -'db2_stmt_error' => 'Returns a string containing the SQLSTATE returned by an SQL statement', -'db2_stmt_errormsg' => 'Returns a string containing the last SQL statement error message', -'db2_table_privileges' => 'Returns a result set listing the tables and associated privileges in a database', -'db2_tables' => 'Returns a result set listing the tables and associated metadata in a database', -'dba_close' => 'Close a DBA database', -'dba_delete' => 'Delete DBA entry specified by key', -'dba_exists' => 'Check whether key exists', -'dba_fetch' => 'Fetch data specified by key', -'dba_firstkey' => 'Fetch first key', -'dba_handlers' => 'List all the handlers available', -'dba_insert' => 'Insert entry', -'dba_key_split' => 'Splits a key in string representation into array representation', -'dba_list' => 'List all open database files', -'dba_nextkey' => 'Fetch next key', -'dba_open' => 'Open database', -'dba_optimize' => 'Optimize database', -'dba_popen' => 'Open database persistently', -'dba_replace' => 'Replace or insert entry', -'dba_sync' => 'Synchronize database', -'dbase_add_record' => 'Adds a record to a database', -'dbase_close' => 'Closes a database', -'dbase_create' => 'Creates a database', -'dbase_delete_record' => 'Deletes a record from a database', -'dbase_get_header_info' => 'Gets the header info of a database', -'dbase_get_record' => 'Gets a record from a database as an indexed array', -'dbase_get_record_with_names' => 'Gets a record from a database as an associative array', -'dbase_numfields' => 'Gets the number of fields of a database', -'dbase_numrecords' => 'Gets the number of records in a database', -'dbase_open' => 'Opens a database', -'dbase_pack' => 'Packs a database', -'dbase_replace_record' => 'Replaces a record in a database', -'dbplus_add' => 'Add a tuple to a relation', -'dbplus_aql' => 'Perform AQL query', -'dbplus_chdir' => 'Get/Set database virtual current directory', -'dbplus_close' => 'Close a relation', -'dbplus_curr' => 'Get current tuple from relation', -'dbplus_errcode' => 'Get error string for given errorcode or last error', -'dbplus_errno' => 'Get error code for last operation', -'dbplus_find' => 'Set a constraint on a relation', -'dbplus_first' => 'Get first tuple from relation', -'dbplus_flush' => 'Flush all changes made on a relation', -'dbplus_freealllocks' => 'Free all locks held by this client', -'dbplus_freelock' => 'Release write lock on tuple', -'dbplus_freerlocks' => 'Free all tuple locks on given relation', -'dbplus_getlock' => 'Get a write lock on a tuple', -'dbplus_getunique' => 'Get an id number unique to a relation', -'dbplus_info' => 'Get information about a relation', -'dbplus_last' => 'Get last tuple from relation', -'dbplus_lockrel' => 'Request write lock on relation', -'dbplus_next' => 'Get next tuple from relation', -'dbplus_open' => 'Open relation file', -'dbplus_prev' => 'Get previous tuple from relation', -'dbplus_rchperm' => 'Change relation permissions', -'dbplus_rcreate' => 'Creates a new DB++ relation', -'dbplus_rcrtexact' => 'Creates an exact but empty copy of a relation including indices', -'dbplus_rcrtlike' => 'Creates an empty copy of a relation with default indices', -'dbplus_resolve' => 'Resolve host information for relation', -'dbplus_restorepos' => 'Restore position', -'dbplus_rkeys' => 'Specify new primary key for a relation', -'dbplus_ropen' => 'Open relation file local', -'dbplus_rquery' => 'Perform local (raw) AQL query', -'dbplus_rrename' => 'Rename a relation', -'dbplus_rsecindex' => 'Create a new secondary index for a relation', -'dbplus_runlink' => 'Remove relation from filesystem', -'dbplus_rzap' => 'Remove all tuples from relation', -'dbplus_savepos' => 'Save position', -'dbplus_setindex' => 'Set index', -'dbplus_setindexbynumber' => 'Set index by number', -'dbplus_sql' => 'Perform SQL query', -'dbplus_tcl' => 'Execute TCL code on server side', -'dbplus_tremove' => 'Remove tuple and return new current tuple', -'dbplus_undo' => 'Undo', -'dbplus_undoprepare' => 'Prepare undo', -'dbplus_unlockrel' => 'Give up write lock on relation', -'dbplus_unselect' => 'Remove a constraint from relation', -'dbplus_update' => 'Update specified tuple in relation', -'dbplus_xlockrel' => 'Request exclusive lock on relation', -'dbplus_xunlockrel' => 'Free exclusive lock on relation', -'dbx_close' => 'Close an open connection/database', -'dbx_compare' => 'Compare two rows for sorting purposes', -'dbx_connect' => 'Open a connection/database', -'dbx_error' => 'Report the error message of the latest function call in the module', -'dbx_escape_string' => 'Escape a string so it can safely be used in an sql-statement', -'dbx_fetch_row' => 'Fetches rows from a query-result that had the DBX_RESULT_UNBUFFERED flag set', -'dbx_query' => 'Send a query and fetch all results (if any)', -'dbx_sort' => 'Sort a result from a dbx_query by a custom sort function', -'dcgettext' => 'Overrides the domain for a single lookup', -'dcngettext' => 'Plural version of dcgettext', -'debug_backtrace' => 'Generates a backtrace', -'debug_print_backtrace' => 'Prints a backtrace', -'debug_zval_dump' => 'Dumps a string representation of an internal zend value to output', -'decbin' => 'Decimal to binary', -'dechex' => 'Decimal to hexadecimal', -'decoct' => 'Decimal to octal', -'define' => 'Defines a named constant', -'define_syslog_variables' => 'Initializes all syslog related variables', -'defined' => 'Checks whether a given named constant exists', -'deflate_add' => 'Incrementally deflate data', -'deflate_init' => 'Initialize an incremental deflate context', -'deg2rad' => 'Converts the number in degrees to the radian equivalent', -'delete' => 'See unlink or unset', -'dgettext' => 'Override the current domain', -'die' => 'Equivalent to exit', -'dio_close' => 'Closes the file descriptor given by fd', -'dio_fcntl' => 'Performs a c library fcntl on fd', -'dio_open' => 'Opens a file (creating it if necessary) at a lower level than the C library input/output stream functions allow', -'dio_read' => 'Reads bytes from a file descriptor', -'dio_seek' => 'Seeks to pos on fd from whence', -'dio_stat' => 'Gets stat information about the file descriptor fd', -'dio_tcsetattr' => 'Sets terminal attributes and baud rate for a serial port', -'dio_truncate' => 'Truncates file descriptor fd to offset bytes', -'dio_write' => 'Writes data to fd with optional truncation at length', -'dir' => 'Return an instance of the Directory class', -'directory::close' => 'Close directory handle', -'directory::read' => 'Read entry from directory handle', -'directory::rewind' => 'Rewind directory handle', -'DirectoryIterator::__construct' => 'Constructs a new directory iterator from a path', -'DirectoryIterator::__toString' => 'Get file name as a string', -'DirectoryIterator::current' => 'Return the current DirectoryIterator item', -'DirectoryIterator::getATime' => 'Get last access time of the current DirectoryIterator item', -'DirectoryIterator::getBasename' => 'Get base name of current DirectoryIterator item', -'DirectoryIterator::getCTime' => 'Get inode change time of the current DirectoryIterator item', -'DirectoryIterator::getExtension' => 'Gets the file extension', -'DirectoryIterator::getFileInfo' => 'Gets an SplFileInfo object for the file', -'DirectoryIterator::getFilename' => 'Return file name of current DirectoryIterator item', -'DirectoryIterator::getGroup' => 'Get group for the current DirectoryIterator item', -'DirectoryIterator::getInode' => 'Get inode for the current DirectoryIterator item', -'DirectoryIterator::getLinkTarget' => 'Gets the target of a link', -'DirectoryIterator::getMTime' => 'Get last modification time of current DirectoryIterator item', -'DirectoryIterator::getOwner' => 'Get owner of current DirectoryIterator item', -'DirectoryIterator::getPath' => 'Get path of current Iterator item without filename', -'DirectoryIterator::getPathInfo' => 'Gets an SplFileInfo object for the path', -'DirectoryIterator::getPathname' => 'Return path and file name of current DirectoryIterator item', -'DirectoryIterator::getPerms' => 'Get the permissions of current DirectoryIterator item', -'DirectoryIterator::getRealPath' => 'Gets absolute path to file', -'DirectoryIterator::getSize' => 'Get size of current DirectoryIterator item', -'DirectoryIterator::getType' => 'Determine the type of the current DirectoryIterator item', -'DirectoryIterator::isDir' => 'Determine if current DirectoryIterator item is a directory', -'DirectoryIterator::isDot' => 'Determine if current DirectoryIterator item is \'.\' or \'..\'', -'DirectoryIterator::isExecutable' => 'Determine if current DirectoryIterator item is executable', -'DirectoryIterator::isFile' => 'Determine if current DirectoryIterator item is a regular file', -'DirectoryIterator::isLink' => 'Determine if current DirectoryIterator item is a symbolic link', -'DirectoryIterator::isReadable' => 'Determine if current DirectoryIterator item can be read', -'DirectoryIterator::isWritable' => 'Determine if current DirectoryIterator item can be written to', -'DirectoryIterator::key' => 'Return the key for the current DirectoryIterator item', -'DirectoryIterator::next' => 'Move forward to next DirectoryIterator item', -'DirectoryIterator::openFile' => 'Gets an SplFileObject object for the file', -'DirectoryIterator::rewind' => 'Rewind the DirectoryIterator back to the start', -'DirectoryIterator::seek' => 'Seek to a DirectoryIterator item', -'DirectoryIterator::setFileClass' => 'Sets the class used with SplFileInfo::openFile', -'DirectoryIterator::setInfoClass' => 'Sets the class used with SplFileInfo::getFileInfo and SplFileInfo::getPathInfo', -'DirectoryIterator::valid' => 'Check whether current DirectoryIterator position is a valid file', -'dirname' => 'Returns a parent directory\'s path', -'disk_free_space' => 'Returns available space on filesystem or disk partition', -'disk_total_space' => 'Returns the total size of a filesystem or disk partition', -'diskfreespace' => 'Alias of disk_free_space', -'dl' => 'Loads a PHP extension at runtime', -'dngettext' => 'Plural version of dgettext', -'dns_check_record' => 'Alias of checkdnsrr', -'dns_get_mx' => 'Alias of getmxrr', -'dns_get_record' => 'Fetch DNS Resource Records associated with a hostname', -'dom_import_simplexml' => 'Gets a DOMElement object from a SimpleXMLElement object', -'domattr::__construct' => 'Creates a new DOMAttr object', -'DOMAttr::appendChild' => 'Adds new child at the end of the children', -'DOMAttr::C14N' => 'Canonicalize nodes to a string', -'DOMAttr::C14NFile' => 'Canonicalize nodes to a file', -'DOMAttr::cloneNode' => 'Clones a node', -'DOMAttr::getLineNo' => 'Get line number for a node', -'DOMAttr::getNodePath' => 'Get an XPath for a node', -'DOMAttr::hasAttributes' => 'Checks if node has attributes', -'DOMAttr::hasChildNodes' => 'Checks if node has children', -'DOMAttr::insertBefore' => 'Adds a new child before a reference node', -'DOMAttr::isDefaultNamespace' => 'Checks if the specified namespaceURI is the default namespace or not', -'domattr::isId' => 'Checks if attribute is a defined ID', -'DOMAttr::isSameNode' => 'Indicates if two nodes are the same node', -'DOMAttr::isSupported' => 'Checks if feature is supported for specified version', -'DOMAttr::lookupNamespaceUri' => 'Gets the namespace URI of the node based on the prefix', -'DOMAttr::lookupPrefix' => 'Gets the namespace prefix of the node based on the namespace URI', -'DOMAttr::normalize' => 'Normalizes the node', -'DOMAttr::removeChild' => 'Removes child from list of children', -'DOMAttr::replaceChild' => 'Replaces a child', -'domcdatasection::__construct' => 'Constructs a new DOMCdataSection object', -'DOMCdataSection::appendData' => 'Append the string to the end of the character data of the node', -'DOMCdataSection::deleteData' => 'Remove a range of characters from the node', -'DOMCdataSection::insertData' => 'Insert a string at the specified 16-bit unit offset', -'DOMCdataSection::isElementContentWhitespace' => 'Returns whether this text node contains whitespace in element content', -'DOMCdataSection::isWhitespaceInElementContent' => 'Indicates whether this text node contains whitespace', -'DOMCdataSection::replaceData' => 'Replace a substring within the DOMCharacterData node', -'DOMCdataSection::splitText' => 'Breaks this node into two nodes at the specified offset', -'DOMCdataSection::substringData' => 'Extracts a range of data from the node', -'DOMCharacterData::appendChild' => 'Adds new child at the end of the children', -'domcharacterdata::appendData' => 'Append the string to the end of the character data of the node', -'DOMCharacterData::C14N' => 'Canonicalize nodes to a string', -'DOMCharacterData::C14NFile' => 'Canonicalize nodes to a file', -'DOMCharacterData::cloneNode' => 'Clones a node', -'domcharacterdata::deleteData' => 'Remove a range of characters from the node', -'DOMCharacterData::getLineNo' => 'Get line number for a node', -'DOMCharacterData::getNodePath' => 'Get an XPath for a node', -'DOMCharacterData::hasAttributes' => 'Checks if node has attributes', -'DOMCharacterData::hasChildNodes' => 'Checks if node has children', -'DOMCharacterData::insertBefore' => 'Adds a new child before a reference node', -'domcharacterdata::insertData' => 'Insert a string at the specified 16-bit unit offset', -'DOMCharacterData::isDefaultNamespace' => 'Checks if the specified namespaceURI is the default namespace or not', -'DOMCharacterData::isSameNode' => 'Indicates if two nodes are the same node', -'DOMCharacterData::isSupported' => 'Checks if feature is supported for specified version', -'DOMCharacterData::lookupNamespaceUri' => 'Gets the namespace URI of the node based on the prefix', -'DOMCharacterData::lookupPrefix' => 'Gets the namespace prefix of the node based on the namespace URI', -'DOMCharacterData::normalize' => 'Normalizes the node', -'DOMCharacterData::removeChild' => 'Removes child from list of children', -'DOMCharacterData::replaceChild' => 'Replaces a child', -'domcharacterdata::replaceData' => 'Replace a substring within the DOMCharacterData node', -'domcharacterdata::substringData' => 'Extracts a range of data from the node', -'domcomment::__construct' => 'Creates a new DOMComment object', -'DOMComment::appendChild' => 'Adds new child at the end of the children', -'DOMComment::appendData' => 'Append the string to the end of the character data of the node', -'DOMComment::C14N' => 'Canonicalize nodes to a string', -'DOMComment::C14NFile' => 'Canonicalize nodes to a file', -'DOMComment::cloneNode' => 'Clones a node', -'DOMComment::deleteData' => 'Remove a range of characters from the node', -'DOMComment::getLineNo' => 'Get line number for a node', -'DOMComment::getNodePath' => 'Get an XPath for a node', -'DOMComment::hasAttributes' => 'Checks if node has attributes', -'DOMComment::hasChildNodes' => 'Checks if node has children', -'DOMComment::insertBefore' => 'Adds a new child before a reference node', -'DOMComment::insertData' => 'Insert a string at the specified 16-bit unit offset', -'DOMComment::isDefaultNamespace' => 'Checks if the specified namespaceURI is the default namespace or not', -'DOMComment::isSameNode' => 'Indicates if two nodes are the same node', -'DOMComment::isSupported' => 'Checks if feature is supported for specified version', -'DOMComment::lookupNamespaceUri' => 'Gets the namespace URI of the node based on the prefix', -'DOMComment::lookupPrefix' => 'Gets the namespace prefix of the node based on the namespace URI', -'DOMComment::normalize' => 'Normalizes the node', -'DOMComment::removeChild' => 'Removes child from list of children', -'DOMComment::replaceChild' => 'Replaces a child', -'DOMComment::replaceData' => 'Replace a substring within the DOMCharacterData node', -'DOMComment::substringData' => 'Extracts a range of data from the node', -'domdocument::__construct' => 'Creates a new DOMDocument object', -'DOMDocument::appendChild' => 'Adds new child at the end of the children', -'DOMDocument::C14N' => 'Canonicalize nodes to a string', -'DOMDocument::C14NFile' => 'Canonicalize nodes to a file', -'DOMDocument::cloneNode' => 'Clones a node', -'domdocument::createAttribute' => 'Create new attribute', -'domdocument::createAttributeNS' => 'Create new attribute node with an associated namespace', -'domdocument::createCDATASection' => 'Create new cdata node', -'domdocument::createComment' => 'Create new comment node', -'domdocument::createDocumentFragment' => 'Create new document fragment', -'domdocument::createElement' => 'Create new element node', -'domdocument::createElementNS' => 'Create new element node with an associated namespace', -'domdocument::createEntityReference' => 'Create new entity reference node', -'domdocument::createProcessingInstruction' => 'Creates new PI node', -'domdocument::createTextNode' => 'Create new text node', -'domdocument::getElementById' => 'Searches for an element with a certain id', -'domdocument::getElementsByTagName' => 'Searches for all elements with given local tag name', -'domdocument::getElementsByTagNameNS' => 'Searches for all elements with given tag name in specified namespace', -'DOMDocument::getLineNo' => 'Get line number for a node', -'DOMDocument::getNodePath' => 'Get an XPath for a node', -'DOMDocument::hasAttributes' => 'Checks if node has attributes', -'DOMDocument::hasChildNodes' => 'Checks if node has children', -'domdocument::importNode' => 'Import node into current document', -'DOMDocument::insertBefore' => 'Adds a new child before a reference node', -'DOMDocument::isDefaultNamespace' => 'Checks if the specified namespaceURI is the default namespace or not', -'DOMDocument::isSameNode' => 'Indicates if two nodes are the same node', -'DOMDocument::isSupported' => 'Checks if feature is supported for specified version', -'domdocument::load' => 'Load XML from a file', -'domdocument::loadHTML' => 'Load HTML from a string', -'domdocument::loadHTMLFile' => 'Load HTML from a file', -'domdocument::loadXML' => 'Load XML from a string', -'DOMDocument::lookupNamespaceUri' => 'Gets the namespace URI of the node based on the prefix', -'DOMDocument::lookupPrefix' => 'Gets the namespace prefix of the node based on the namespace URI', -'DOMDocument::normalize' => 'Normalizes the node', -'domdocument::normalizeDocument' => 'Normalizes the document', -'domdocument::registerNodeClass' => 'Register extended class used to create base node type', -'domdocument::relaxNGValidate' => 'Performs relaxNG validation on the document', -'domdocument::relaxNGValidateSource' => 'Performs relaxNG validation on the document', -'DOMDocument::removeChild' => 'Removes child from list of children', -'DOMDocument::replaceChild' => 'Replaces a child', -'domdocument::save' => 'Dumps the internal XML tree back into a file', -'domdocument::saveHTML' => 'Dumps the internal document into a string using HTML formatting', -'domdocument::saveHTMLFile' => 'Dumps the internal document into a file using HTML formatting', -'domdocument::saveXML' => 'Dumps the internal XML tree back into a string', -'domdocument::schemaValidate' => 'Validates a document based on a schema', -'domdocument::schemaValidateSource' => 'Validates a document based on a schema', -'domdocument::validate' => 'Validates the document based on its DTD', -'domdocument::xinclude' => 'Substitutes XIncludes in a DOMDocument Object', -'DOMDocumentFragment::appendChild' => 'Adds new child at the end of the children', -'domdocumentfragment::appendXML' => 'Append raw XML data', -'DOMDocumentFragment::C14N' => 'Canonicalize nodes to a string', -'DOMDocumentFragment::C14NFile' => 'Canonicalize nodes to a file', -'DOMDocumentFragment::cloneNode' => 'Clones a node', -'DOMDocumentFragment::getLineNo' => 'Get line number for a node', -'DOMDocumentFragment::getNodePath' => 'Get an XPath for a node', -'DOMDocumentFragment::hasAttributes' => 'Checks if node has attributes', -'DOMDocumentFragment::hasChildNodes' => 'Checks if node has children', -'DOMDocumentFragment::insertBefore' => 'Adds a new child before a reference node', -'DOMDocumentFragment::isDefaultNamespace' => 'Checks if the specified namespaceURI is the default namespace or not', -'DOMDocumentFragment::isSameNode' => 'Indicates if two nodes are the same node', -'DOMDocumentFragment::isSupported' => 'Checks if feature is supported for specified version', -'DOMDocumentFragment::lookupNamespaceUri' => 'Gets the namespace URI of the node based on the prefix', -'DOMDocumentFragment::lookupPrefix' => 'Gets the namespace prefix of the node based on the namespace URI', -'DOMDocumentFragment::normalize' => 'Normalizes the node', -'DOMDocumentFragment::removeChild' => 'Removes child from list of children', -'DOMDocumentFragment::replaceChild' => 'Replaces a child', -'domelement::__construct' => 'Creates a new DOMElement object', -'DOMElement::appendChild' => 'Adds new child at the end of the children', -'DOMElement::C14N' => 'Canonicalize nodes to a string', -'DOMElement::C14NFile' => 'Canonicalize nodes to a file', -'DOMElement::cloneNode' => 'Clones a node', -'domelement::getAttribute' => 'Returns value of attribute', -'domelement::getAttributeNode' => 'Returns attribute node', -'domelement::getAttributeNodeNS' => 'Returns attribute node', -'domelement::getAttributeNS' => 'Returns value of attribute', -'domelement::getElementsByTagName' => 'Gets elements by tagname', -'domelement::getElementsByTagNameNS' => 'Get elements by namespaceURI and localName', -'DOMElement::getLineNo' => 'Get line number for a node', -'DOMElement::getNodePath' => 'Get an XPath for a node', -'domelement::hasAttribute' => 'Checks to see if attribute exists', -'domelement::hasAttributeNS' => 'Checks to see if attribute exists', -'DOMElement::hasAttributes' => 'Checks if node has attributes', -'DOMElement::hasChildNodes' => 'Checks if node has children', -'DOMElement::insertBefore' => 'Adds a new child before a reference node', -'DOMElement::isDefaultNamespace' => 'Checks if the specified namespaceURI is the default namespace or not', -'DOMElement::isSameNode' => 'Indicates if two nodes are the same node', -'DOMElement::isSupported' => 'Checks if feature is supported for specified version', -'DOMElement::lookupNamespaceUri' => 'Gets the namespace URI of the node based on the prefix', -'DOMElement::lookupPrefix' => 'Gets the namespace prefix of the node based on the namespace URI', -'DOMElement::normalize' => 'Normalizes the node', -'domelement::removeAttribute' => 'Removes attribute', -'domelement::removeAttributeNode' => 'Removes attribute', -'domelement::removeAttributeNS' => 'Removes attribute', -'DOMElement::removeChild' => 'Removes child from list of children', -'DOMElement::replaceChild' => 'Replaces a child', -'domelement::setAttribute' => 'Adds new attribute', -'domelement::setAttributeNode' => 'Adds new attribute node to element', -'domelement::setAttributeNodeNS' => 'Adds new attribute node to element', -'domelement::setAttributeNS' => 'Adds new attribute', -'domelement::setIdAttribute' => 'Declares the attribute specified by name to be of type ID', -'domelement::setIdAttributeNode' => 'Declares the attribute specified by node to be of type ID', -'domelement::setIdAttributeNS' => 'Declares the attribute specified by local name and namespace URI to be of type ID', -'domentityreference::__construct' => 'Creates a new DOMEntityReference object', -'DOMEntityReference::appendChild' => 'Adds new child at the end of the children', -'DOMEntityReference::C14N' => 'Canonicalize nodes to a string', -'DOMEntityReference::C14NFile' => 'Canonicalize nodes to a file', -'DOMEntityReference::cloneNode' => 'Clones a node', -'DOMEntityReference::getLineNo' => 'Get line number for a node', -'DOMEntityReference::getNodePath' => 'Get an XPath for a node', -'DOMEntityReference::hasAttributes' => 'Checks if node has attributes', -'DOMEntityReference::hasChildNodes' => 'Checks if node has children', -'DOMEntityReference::insertBefore' => 'Adds a new child before a reference node', -'DOMEntityReference::isDefaultNamespace' => 'Checks if the specified namespaceURI is the default namespace or not', -'DOMEntityReference::isSameNode' => 'Indicates if two nodes are the same node', -'DOMEntityReference::isSupported' => 'Checks if feature is supported for specified version', -'DOMEntityReference::lookupNamespaceUri' => 'Gets the namespace URI of the node based on the prefix', -'DOMEntityReference::lookupPrefix' => 'Gets the namespace prefix of the node based on the namespace URI', -'DOMEntityReference::normalize' => 'Normalizes the node', -'DOMEntityReference::removeChild' => 'Removes child from list of children', -'DOMEntityReference::replaceChild' => 'Replaces a child', -'domimplementation::__construct' => 'Creates a new DOMImplementation object', -'domimplementation::createDocument' => 'Creates a DOMDocument object of the specified type with its document element', -'domimplementation::createDocumentType' => 'Creates an empty DOMDocumentType object', -'domimplementation::hasFeature' => 'Test if the DOM implementation implements a specific feature', -'domnamednodemap::count' => 'Get number of nodes in the map', -'domnamednodemap::getNamedItem' => 'Retrieves a node specified by name', -'domnamednodemap::getNamedItemNS' => 'Retrieves a node specified by local name and namespace URI', -'domnamednodemap::item' => 'Retrieves a node specified by index', -'domnode::appendChild' => 'Adds new child at the end of the children', -'domnode::C14N' => 'Canonicalize nodes to a string', -'domnode::C14NFile' => 'Canonicalize nodes to a file', -'domnode::cloneNode' => 'Clones a node', -'domnode::getLineNo' => 'Get line number for a node', -'domnode::getNodePath' => 'Get an XPath for a node', -'domnode::hasAttributes' => 'Checks if node has attributes', -'domnode::hasChildNodes' => 'Checks if node has children', -'domnode::insertBefore' => 'Adds a new child before a reference node', -'domnode::isDefaultNamespace' => 'Checks if the specified namespaceURI is the default namespace or not', -'domnode::isSameNode' => 'Indicates if two nodes are the same node', -'domnode::isSupported' => 'Checks if feature is supported for specified version', -'domnode::lookupNamespaceUri' => 'Gets the namespace URI of the node based on the prefix', -'domnode::lookupPrefix' => 'Gets the namespace prefix of the node based on the namespace URI', -'domnode::normalize' => 'Normalizes the node', -'domnode::removeChild' => 'Removes child from list of children', -'domnode::replaceChild' => 'Replaces a child', -'domnodelist::count' => 'Get number of nodes in the list', -'domnodelist::item' => 'Retrieves a node specified by index', -'domprocessinginstruction::__construct' => 'Creates a new DOMProcessingInstruction object', -'DOMProcessingInstruction::appendChild' => 'Adds new child at the end of the children', -'DOMProcessingInstruction::C14N' => 'Canonicalize nodes to a string', -'DOMProcessingInstruction::C14NFile' => 'Canonicalize nodes to a file', -'DOMProcessingInstruction::cloneNode' => 'Clones a node', -'DOMProcessingInstruction::getLineNo' => 'Get line number for a node', -'DOMProcessingInstruction::getNodePath' => 'Get an XPath for a node', -'DOMProcessingInstruction::hasAttributes' => 'Checks if node has attributes', -'DOMProcessingInstruction::hasChildNodes' => 'Checks if node has children', -'DOMProcessingInstruction::insertBefore' => 'Adds a new child before a reference node', -'DOMProcessingInstruction::isDefaultNamespace' => 'Checks if the specified namespaceURI is the default namespace or not', -'DOMProcessingInstruction::isSameNode' => 'Indicates if two nodes are the same node', -'DOMProcessingInstruction::isSupported' => 'Checks if feature is supported for specified version', -'DOMProcessingInstruction::lookupNamespaceUri' => 'Gets the namespace URI of the node based on the prefix', -'DOMProcessingInstruction::lookupPrefix' => 'Gets the namespace prefix of the node based on the namespace URI', -'DOMProcessingInstruction::normalize' => 'Normalizes the node', -'DOMProcessingInstruction::removeChild' => 'Removes child from list of children', -'DOMProcessingInstruction::replaceChild' => 'Replaces a child', -'domtext::__construct' => 'Creates a new DOMText object', -'DOMText::appendChild' => 'Adds new child at the end of the children', -'DOMText::appendData' => 'Append the string to the end of the character data of the node', -'DOMText::C14N' => 'Canonicalize nodes to a string', -'DOMText::C14NFile' => 'Canonicalize nodes to a file', -'DOMText::cloneNode' => 'Clones a node', -'DOMText::deleteData' => 'Remove a range of characters from the node', -'DOMText::getLineNo' => 'Get line number for a node', -'DOMText::getNodePath' => 'Get an XPath for a node', -'DOMText::hasAttributes' => 'Checks if node has attributes', -'DOMText::hasChildNodes' => 'Checks if node has children', -'DOMText::insertBefore' => 'Adds a new child before a reference node', -'DOMText::insertData' => 'Insert a string at the specified 16-bit unit offset', -'DOMText::isDefaultNamespace' => 'Checks if the specified namespaceURI is the default namespace or not', -'domtext::isElementContentWhitespace' => 'Returns whether this text node contains whitespace in element content', -'DOMText::isSameNode' => 'Indicates if two nodes are the same node', -'DOMText::isSupported' => 'Checks if feature is supported for specified version', -'domtext::isWhitespaceInElementContent' => 'Indicates whether this text node contains whitespace', -'DOMText::lookupNamespaceUri' => 'Gets the namespace URI of the node based on the prefix', -'DOMText::lookupPrefix' => 'Gets the namespace prefix of the node based on the namespace URI', -'DOMText::normalize' => 'Normalizes the node', -'DOMText::removeChild' => 'Removes child from list of children', -'DOMText::replaceChild' => 'Replaces a child', -'DOMText::replaceData' => 'Replace a substring within the DOMCharacterData node', -'domtext::splitText' => 'Breaks this node into two nodes at the specified offset', -'DOMText::substringData' => 'Extracts a range of data from the node', -'domxpath::__construct' => 'Creates a new DOMXPath object', -'domxpath::evaluate' => 'Evaluates the given XPath expression and returns a typed result if possible', -'domxpath::query' => 'Evaluates the given XPath expression', -'domxpath::registerNamespace' => 'Registers the namespace with the DOMXPath object', -'domxpath::registerPhpFunctions' => 'Register PHP functions as XPath functions', -'DOTNET::__construct' => 'COM class constructor.', -'doubleval' => 'Alias of floatval', -'ds\collection::clear' => 'Removes all values', -'ds\collection::copy' => 'Returns a shallow copy of the collection', -'ds\collection::isEmpty' => 'Returns whether the collection is empty', -'ds\collection::toArray' => 'Converts the collection to an `array`', -'ds\deque::__construct' => 'Creates a new instance', -'ds\deque::allocate' => 'Allocates enough memory for a required capacity', -'ds\deque::apply' => 'Updates all values by applying a callback function to each value', -'ds\deque::capacity' => 'Returns the current capacity', -'ds\deque::clear' => 'Removes all values from the deque', -'ds\deque::contains' => 'Determines if the deque contains given values', -'ds\deque::copy' => 'Returns a shallow copy of the deque', -'ds\deque::count' => 'Returns the number of values in the collection', -'ds\deque::filter' => 'Creates a new deque using a callable to determine which values to include', -'ds\deque::find' => 'Attempts to find a value\'s index', -'ds\deque::first' => 'Returns the first value in the deque', -'ds\deque::get' => 'Returns the value at a given index', -'ds\deque::insert' => 'Inserts values at a given index', -'ds\deque::isEmpty' => 'Returns whether the deque is empty', -'ds\deque::join' => 'Joins all values together as a string', -'ds\deque::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'ds\deque::last' => 'Returns the last value', -'ds\deque::map' => 'Returns the result of applying a callback to each value', -'ds\deque::merge' => 'Returns the result of adding all given values to the deque', -'ds\deque::pop' => 'Removes and returns the last value', -'ds\deque::push' => 'Adds values to the end of the deque', -'ds\deque::reduce' => 'Reduces the deque to a single value using a callback function', -'ds\deque::remove' => 'Removes and returns a value by index', -'ds\deque::reverse' => 'Reverses the deque in-place', -'ds\deque::reversed' => 'Returns a reversed copy', -'ds\deque::rotate' => 'Rotates the deque by a given number of rotations', -'ds\deque::set' => 'Updates a value at a given index', -'ds\deque::shift' => 'Removes and returns the first value', -'ds\deque::slice' => 'Returns a sub-deque of a given range', -'ds\deque::sort' => 'Sorts the deque in-place', -'ds\deque::sorted' => 'Returns a sorted copy', -'ds\deque::sum' => 'Returns the sum of all values in the deque', -'ds\deque::toArray' => 'Converts the deque to an `array`', -'ds\deque::unshift' => 'Adds values to the front of the deque', -'ds\hashable::equals' => 'Determines whether an object is equal to the current instance', -'ds\hashable::hash' => 'Returns a scalar value to be used as a hash value', -'ds\map::__construct' => 'Creates a new instance', -'ds\map::allocate' => 'Allocates enough memory for a required capacity', -'ds\map::apply' => 'Updates all values by applying a callback function to each value', -'ds\map::capacity' => 'Returns the current capacity', -'ds\map::clear' => 'Removes all values', -'ds\map::copy' => 'Returns a shallow copy of the map', -'ds\map::count' => 'Returns the number of values in the map', -'ds\map::diff' => 'Creates a new map using keys that aren\'t in another map', -'ds\map::filter' => 'Creates a new map using a callable to determine which pairs to include', -'ds\map::first' => 'Returns the first pair in the map', -'ds\map::get' => 'Returns the value for a given key', -'ds\map::hasKey' => 'Determines whether the map contains a given key', -'ds\map::hasValue' => 'Determines whether the map contains a given value', -'ds\map::intersect' => 'Creates a new map by intersecting keys with another map', -'ds\map::isEmpty' => 'Returns whether the map is empty', -'ds\map::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'ds\map::keys' => 'Returns a set of the map\'s keys', -'ds\map::ksort' => 'Sorts the map in-place by key', -'ds\map::ksorted' => 'Returns a copy, sorted by key', -'ds\map::last' => 'Returns the last pair of the map', -'ds\map::map' => 'Returns the result of applying a callback to each value', -'ds\map::merge' => 'Returns the result of adding all given associations', -'ds\map::pairs' => 'Returns a sequence containing all the pairs of the map', -'ds\map::put' => 'Associates a key with a value', -'ds\map::putAll' => 'Associates all key-value pairs of a traversable object or array', -'ds\map::reduce' => 'Reduces the map to a single value using a callback function', -'ds\map::remove' => 'Removes and returns a value by key', -'ds\map::reverse' => 'Reverses the map in-place', -'ds\map::reversed' => 'Returns a reversed copy', -'ds\map::skip' => 'Returns the pair at a given positional index', -'ds\map::slice' => 'Returns a subset of the map defined by a starting index and length', -'ds\map::sort' => 'Sorts the map in-place by value', -'ds\map::sorted' => 'Returns a copy, sorted by value', -'ds\map::sum' => 'Returns the sum of all values in the map', -'ds\map::toArray' => 'Converts the map to an `array`', -'ds\map::union' => 'Creates a new map using values from the current instance and another map', -'ds\map::values' => 'Returns a sequence of the map\'s values', -'ds\map::xor' => 'Creates a new map using keys of either the current instance or of another map, but not of both', -'ds\pair::__construct' => 'Creates a new instance', -'ds\pair::clear' => 'Removes all values', -'ds\pair::copy' => 'Returns a shallow copy of the pair', -'ds\pair::isEmpty' => 'Returns whether the pair is empty', -'ds\pair::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'ds\pair::toArray' => 'Converts the pair to an `array`', -'ds\priorityqueue::__construct' => 'Creates a new instance', -'ds\priorityqueue::allocate' => 'Allocates enough memory for a required capacity', -'ds\priorityqueue::capacity' => 'Returns the current capacity', -'ds\priorityqueue::clear' => 'Removes all values', -'ds\priorityqueue::copy' => 'Returns a shallow copy of the queue', -'ds\priorityqueue::count' => 'Returns the number of values in the queue', -'ds\priorityqueue::isEmpty' => 'Returns whether the queue is empty', -'ds\priorityqueue::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'ds\priorityqueue::peek' => 'Returns the value at the front of the queue', -'ds\priorityqueue::pop' => 'Removes and returns the value with the highest priority', -'ds\priorityqueue::push' => 'Pushes values into the queue', -'ds\priorityqueue::toArray' => 'Converts the queue to an `array`', -'ds\queue::__construct' => 'Creates a new instance', -'ds\queue::allocate' => 'Allocates enough memory for a required capacity', -'ds\queue::capacity' => 'Returns the current capacity', -'ds\queue::clear' => 'Removes all values', -'ds\queue::copy' => 'Returns a shallow copy of the queue', -'ds\queue::count' => 'Returns the number of values in the queue', -'ds\queue::isEmpty' => 'Returns whether the queue is empty', -'ds\queue::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'ds\queue::peek' => 'Returns the value at the front of the queue', -'ds\queue::pop' => 'Removes and returns the value at the front of the queue', -'ds\queue::push' => 'Pushes values into the queue', -'ds\queue::toArray' => 'Converts the queue to an `array`', -'ds\sequence::allocate' => 'Allocates enough memory for a required capacity', -'ds\sequence::apply' => 'Updates all values by applying a callback function to each value', -'ds\sequence::capacity' => 'Returns the current capacity', -'ds\sequence::contains' => 'Determines if the sequence contains given values', -'ds\sequence::filter' => 'Creates a new sequence using a callable to determine which values to include', -'ds\sequence::find' => 'Attempts to find a value\'s index', -'ds\sequence::first' => 'Returns the first value in the sequence', -'ds\sequence::get' => 'Returns the value at a given index', -'ds\sequence::insert' => 'Inserts values at a given index', -'ds\sequence::join' => 'Joins all values together as a string', -'ds\sequence::last' => 'Returns the last value', -'ds\sequence::map' => 'Returns the result of applying a callback to each value', -'ds\sequence::merge' => 'Returns the result of adding all given values to the sequence', -'ds\sequence::pop' => 'Removes and returns the last value', -'ds\sequence::push' => 'Adds values to the end of the sequence', -'ds\sequence::reduce' => 'Reduces the sequence to a single value using a callback function', -'ds\sequence::remove' => 'Removes and returns a value by index', -'ds\sequence::reverse' => 'Reverses the sequence in-place', -'ds\sequence::reversed' => 'Returns a reversed copy', -'ds\sequence::rotate' => 'Rotates the sequence by a given number of rotations', -'ds\sequence::set' => 'Updates a value at a given index', -'ds\sequence::shift' => 'Removes and returns the first value', -'ds\sequence::slice' => 'Returns a sub-sequence of a given range', -'ds\sequence::sort' => 'Sorts the sequence in-place', -'ds\sequence::sorted' => 'Returns a sorted copy', -'ds\sequence::sum' => 'Returns the sum of all values in the sequence', -'ds\sequence::unshift' => 'Adds values to the front of the sequence', -'ds\set::__construct' => 'Creates a new instance', -'ds\set::add' => 'Adds values to the set', -'ds\set::allocate' => 'Allocates enough memory for a required capacity', -'ds\set::capacity' => 'Returns the current capacity', -'ds\set::clear' => 'Removes all values', -'ds\set::contains' => 'Determines if the set contains all values', -'ds\set::copy' => 'Returns a shallow copy of the set', -'ds\set::count' => 'Returns the number of values in the set', -'ds\set::diff' => 'Creates a new set using values that aren\'t in another set', -'ds\set::filter' => 'Creates a new set using a callable to determine which values to include', -'ds\set::first' => 'Returns the first value in the set', -'ds\set::get' => 'Returns the value at a given index', -'ds\set::intersect' => 'Creates a new set by intersecting values with another set', -'ds\set::isEmpty' => 'Returns whether the set is empty', -'ds\set::join' => 'Joins all values together as a string', -'ds\set::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'ds\set::last' => 'Returns the last value in the set', -'ds\set::merge' => 'Returns the result of adding all given values to the set', -'ds\set::reduce' => 'Reduces the set to a single value using a callback function', -'ds\set::remove' => 'Removes all given values from the set', -'ds\set::reverse' => 'Reverses the set in-place', -'ds\set::reversed' => 'Returns a reversed copy', -'ds\set::slice' => 'Returns a sub-set of a given range', -'ds\set::sort' => 'Sorts the set in-place', -'ds\set::sorted' => 'Returns a sorted copy', -'ds\set::sum' => 'Returns the sum of all values in the set', -'ds\set::toArray' => 'Converts the set to an `array`', -'ds\set::union' => 'Creates a new set using values from the current instance and another set', -'ds\set::xor' => 'Creates a new set using values in either the current instance or in another set, but not in both', -'ds\stack::__construct' => 'Creates a new instance', -'ds\stack::allocate' => 'Allocates enough memory for a required capacity', -'ds\stack::capacity' => 'Returns the current capacity', -'ds\stack::clear' => 'Removes all values', -'ds\stack::copy' => 'Returns a shallow copy of the stack', -'ds\stack::count' => 'Returns the number of values in the stack', -'ds\stack::isEmpty' => 'Returns whether the stack is empty', -'ds\stack::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'ds\stack::peek' => 'Returns the value at the top of the stack', -'ds\stack::pop' => 'Removes and returns the value at the top of the stack', -'ds\stack::push' => 'Pushes values onto the stack', -'ds\stack::toArray' => 'Converts the stack to an `array`', -'ds\vector::__construct' => 'Creates a new instance', -'ds\vector::allocate' => 'Allocates enough memory for a required capacity', -'ds\vector::apply' => 'Updates all values by applying a callback function to each value', -'ds\vector::capacity' => 'Returns the current capacity', -'ds\vector::clear' => 'Removes all values', -'ds\vector::contains' => 'Determines if the vector contains given values', -'ds\vector::copy' => 'Returns a shallow copy of the vector', -'ds\vector::count' => 'Returns the number of values in the collection', -'ds\vector::filter' => 'Creates a new vector using a callable to determine which values to include', -'ds\vector::find' => 'Attempts to find a value\'s index', -'ds\vector::first' => 'Returns the first value in the vector', -'ds\vector::get' => 'Returns the value at a given index', -'ds\vector::insert' => 'Inserts values at a given index', -'ds\vector::isEmpty' => 'Returns whether the vector is empty', -'ds\vector::join' => 'Joins all values together as a string', -'ds\vector::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'ds\vector::last' => 'Returns the last value', -'ds\vector::map' => 'Returns the result of applying a callback to each value', -'ds\vector::merge' => 'Returns the result of adding all given values to the vector', -'ds\vector::pop' => 'Removes and returns the last value', -'ds\vector::push' => 'Adds values to the end of the vector', -'ds\vector::reduce' => 'Reduces the vector to a single value using a callback function', -'ds\vector::remove' => 'Removes and returns a value by index', -'ds\vector::reverse' => 'Reverses the vector in-place', -'ds\vector::reversed' => 'Returns a reversed copy', -'ds\vector::rotate' => 'Rotates the vector by a given number of rotations', -'ds\vector::set' => 'Updates a value at a given index', -'ds\vector::shift' => 'Removes and returns the first value', -'ds\vector::slice' => 'Returns a sub-vector of a given range', -'ds\vector::sort' => 'Sorts the vector in-place', -'ds\vector::sorted' => 'Returns a sorted copy', -'ds\vector::sum' => 'Returns the sum of all values in the vector', -'ds\vector::toArray' => 'Converts the vector to an `array`', -'ds\vector::unshift' => 'Adds values to the front of the vector', -'each' => 'Return the current key and value pair from an array and advance the array cursor', -'easter_date' => 'Get Unix timestamp for midnight on Easter of a given year', -'easter_days' => 'Get number of days after March 21 on which Easter falls for a given year', -'echo' => 'Output one or more strings', -'eio_busy' => 'Artificially increase load. Could be useful in tests, benchmarking', -'eio_cancel' => 'Cancels a request', -'eio_chmod' => 'Change file/direcrory permissions', -'eio_chown' => 'Change file/direcrory permissions', -'eio_close' => 'Close file', -'eio_custom' => 'Execute custom request like any other eio_* call', -'eio_dup2' => 'Duplicate a file descriptor', -'eio_event_loop' => 'Polls libeio until all requests proceeded', -'eio_fallocate' => 'Allows the caller to directly manipulate the allocated disk space for a file', -'eio_fchmod' => 'Change file permissions', -'eio_fchown' => 'Change file ownership', -'eio_fdatasync' => 'Synchronize a file\'s in-core state with storage device', -'eio_fstat' => 'Get file status', -'eio_fstatvfs' => 'Get file system statistics', -'eio_fsync' => 'Synchronize a file\'s in-core state with storage device', -'eio_ftruncate' => 'Truncate a file', -'eio_futime' => 'Change file last access and modification times', -'eio_get_event_stream' => 'Get stream representing a variable used in internal communications with libeio', -'eio_get_last_error' => 'Returns string describing the last error associated with a request resource', -'eio_grp' => 'Creates a request group', -'eio_grp_add' => 'Adds a request to the request group', -'eio_grp_cancel' => 'Cancels a request group', -'eio_grp_limit' => 'Set group limit', -'eio_init' => '(Re-)initialize Eio', -'eio_link' => 'Create a hardlink for file', -'eio_lstat' => 'Get file status', -'eio_mkdir' => 'Create directory', -'eio_mknod' => 'Create a special or ordinary file', -'eio_nop' => 'Does nothing, except go through the whole request cycle', -'eio_npending' => 'Returns number of finished, but unhandled requests', -'eio_nready' => 'Returns number of not-yet handled requests', -'eio_nreqs' => 'Returns number of requests to be processed', -'eio_nthreads' => 'Returns number of threads currently in use', -'eio_open' => 'Opens a file', -'eio_poll' => 'Can be to be called whenever there are pending requests that need finishing', -'eio_read' => 'Read from a file descriptor at given offset', -'eio_readahead' => 'Perform file readahead into page cache', -'eio_readdir' => 'Reads through a whole directory', -'eio_readlink' => 'Read value of a symbolic link', -'eio_realpath' => 'Get the canonicalized absolute pathname', -'eio_rename' => 'Change the name or location of a file', -'eio_rmdir' => 'Remove a directory', -'eio_seek' => 'Repositions the offset of the open file associated with the fd argument to the argument offset according to the directive whence', -'eio_sendfile' => 'Transfer data between file descriptors', -'eio_set_max_idle' => 'Set maximum number of idle threads', -'eio_set_max_parallel' => 'Set maximum parallel threads', -'eio_set_max_poll_reqs' => 'Set maximum number of requests processed in a poll', -'eio_set_max_poll_time' => 'Set maximum poll time', -'eio_set_min_parallel' => 'Set minimum parallel thread number', -'eio_stat' => 'Get file status', -'eio_statvfs' => 'Get file system statistics', -'eio_symlink' => 'Create a symbolic link', -'eio_sync' => 'Commit buffer cache to disk', -'eio_sync_file_range' => 'Sync a file segment with disk', -'eio_syncfs' => 'Calls Linux\' syncfs syscall, if available', -'eio_truncate' => 'Truncate a file', -'eio_unlink' => 'Delete a name and possibly the file it refers to', -'eio_utime' => 'Change file last access and modification times', -'eio_write' => 'Write to file', -'empty' => 'Determine whether a variable is empty', -'emptyiterator::current' => 'The current() method', -'emptyiterator::key' => 'The key() method', -'emptyiterator::next' => 'The next() method', -'emptyiterator::rewind' => 'The rewind() method', -'emptyiterator::valid' => 'The valid() method', -'enchant_broker_describe' => 'Enumerates the Enchant providers', -'enchant_broker_dict_exists' => 'Whether a dictionary exists or not. Using non-empty tag', -'enchant_broker_free' => 'Free the broker resource and its dictionnaries', -'enchant_broker_free_dict' => 'Free a dictionary resource', -'enchant_broker_get_dict_path' => 'Get the directory path for a given backend', -'enchant_broker_get_error' => 'Returns the last error of the broker', -'enchant_broker_init' => 'Create a new broker object capable of requesting', -'enchant_broker_list_dicts' => 'Returns a list of available dictionaries', -'enchant_broker_request_dict' => 'Create a new dictionary using a tag', -'enchant_broker_request_pwl_dict' => 'Creates a dictionary using a PWL file', -'enchant_broker_set_dict_path' => 'Set the directory path for a given backend', -'enchant_broker_set_ordering' => 'Declares a preference of dictionaries to use for the language', -'enchant_dict_add_to_personal' => 'Add a word to personal word list', -'enchant_dict_add_to_session' => 'Add \'word\' to this spell-checking session', -'enchant_dict_check' => 'Check whether a word is correctly spelled or not', -'enchant_dict_describe' => 'Describes an individual dictionary', -'enchant_dict_get_error' => 'Returns the last error of the current spelling-session', -'enchant_dict_is_in_session' => 'Whether or not \'word\' exists in this spelling-session', -'enchant_dict_quick_check' => 'Check the word is correctly spelled and provide suggestions', -'enchant_dict_store_replacement' => 'Add a correction for a word', -'enchant_dict_suggest' => 'Will return a list of values if any of those pre-conditions are not met', -'end' => 'Set the internal pointer of an array to its last element', -'ereg' => 'Regular expression match', -'ereg_replace' => 'Replace regular expression', -'eregi' => 'Case insensitive regular expression match', -'eregi_replace' => 'Replace regular expression case insensitive', -'Error::__clone' => 'Clone the error -Error can not be clone, so this method results in fatal error.', -'Error::__construct' => 'Construct the error object.', -'Error::__toString' => 'Gets a string representation of the thrown object', -'Error::getCode' => 'Gets the exception code', -'Error::getFile' => 'Gets the file in which the exception occurred', -'Error::getLine' => 'Gets the line on which the object was instantiated', -'Error::getPrevious' => 'Returns the previous Throwable', -'Error::getTrace' => 'Gets the stack trace', -'Error::getTraceAsString' => 'Gets the stack trace as a string', -'error_clear_last' => 'Clear the most recent error', -'error_get_last' => 'Get the last occurred error', -'error_log' => 'Send an error message to the defined error handling routines', -'error_reporting' => 'Sets which PHP errors are reported', -'ErrorException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'ErrorException::__construct' => 'Constructs the exception', -'ErrorException::__toString' => 'String representation of the exception', -'ErrorException::getCode' => 'Gets the Exception code', -'ErrorException::getFile' => 'Gets the file in which the exception occurred', -'ErrorException::getLine' => 'Gets the line in which the exception occurred', -'ErrorException::getMessage' => 'Gets the Exception message', -'ErrorException::getPrevious' => 'Returns previous Exception', -'ErrorException::getSeverity' => 'Gets the exception severity', -'ErrorException::getTrace' => 'Gets the stack trace', -'ErrorException::getTraceAsString' => 'Gets the stack trace as a string', -'escapeshellarg' => 'Escape a string to be used as a shell argument', -'escapeshellcmd' => 'Escape shell metacharacters', -'ev::backend' => 'Returns an integer describing the backend used by libev', -'ev::depth' => 'Returns recursion depth', -'ev::embeddableBackends' => 'Returns the set of backends that are embeddable in other event loops', -'ev::feedSignal' => 'Feed a signal event info Ev', -'ev::feedSignalEvent' => 'Feed signal event into the default loop', -'ev::iteration' => 'Return the number of times the default event loop has polled for new events', -'ev::now' => 'Returns the time when the last iteration of the default event loop has started', -'ev::nowUpdate' => 'Establishes the current time by querying the kernel, updating the time returned by Ev::now in the progress', -'ev::recommendedBackends' => 'Returns a bit mask of recommended backends for current platform', -'ev::resume' => 'Resume previously suspended default event loop', -'ev::run' => 'Begin checking for events and calling callbacks for the default loop', -'ev::sleep' => 'Block the process for the given number of seconds', -'ev::stop' => 'Stops the default event loop', -'ev::supportedBackends' => 'Returns the set of backends supported by current libev configuration', -'ev::suspend' => 'Suspend the default event loop', -'ev::time' => 'Returns the current time in fractional seconds since the epoch', -'ev::verify' => 'Performs internal consistency checks(for debugging)', -'eval' => 'Evaluate a string as PHP code', -'evcheck::__construct' => 'Constructs the EvCheck watcher object', -'EvCheck::clear' => 'Clear watcher pending status. - -If the watcher is pending, this method clears its pending status and returns its revents bitset (as if its -callback was invoked). If the watcher isn\'t pending it does nothing and returns 0. - -Sometimes it can be useful to "poll" a watcher instead of waiting for its callback to be invoked, which can be -accomplished with this function.', -'evcheck::createStopped' => 'Create instance of a stopped EvCheck watcher', -'EvCheck::feed' => 'Feeds the given revents set into the event loop. - -Feeds the given revents set into the event loop, as if the specified event had happened for the watcher.', -'EvCheck::getLoop' => 'Returns the loop responsible for the watcher.', -'EvCheck::invoke' => 'Invokes the watcher callback with the given received events bit mask.', -'EvCheck::keepAlive' => 'Configures whether to keep the loop from returning. - -Configures whether to keep the loop from returning. With keepalive value set to FALSE the watcher won\'t keep -Ev::run() / EvLoop::run() from returning even though the watcher is active. - -Watchers have keepalive value TRUE by default. - -Clearing keepalive status is useful when returning from Ev::run() / EvLoop::run() just because of the watcher -is undesirable. It could be a long running UDP socket watcher or so.', -'EvCheck::setCallback' => 'Sets new callback for the watcher.', -'EvCheck::start' => 'Starts the watcher. - -Marks the watcher as active. Note that only active watchers will receive events.', -'EvCheck::stop' => 'Stops the watcher. - -Marks the watcher as inactive. Note that only active watchers will receive events.', -'evchild::__construct' => 'Constructs the EvChild watcher object', -'EvChild::clear' => 'Clear watcher pending status. - -If the watcher is pending, this method clears its pending status and returns its revents bitset (as if its -callback was invoked). If the watcher isn\'t pending it does nothing and returns 0. - -Sometimes it can be useful to "poll" a watcher instead of waiting for its callback to be invoked, which can be -accomplished with this function.', -'evchild::createStopped' => 'Create instance of a stopped EvCheck watcher', -'EvChild::feed' => 'Feeds the given revents set into the event loop. - -Feeds the given revents set into the event loop, as if the specified event had happened for the watcher.', -'EvChild::getLoop' => 'Returns the loop responsible for the watcher.', -'EvChild::invoke' => 'Invokes the watcher callback with the given received events bit mask.', -'EvChild::keepAlive' => 'Configures whether to keep the loop from returning. - -Configures whether to keep the loop from returning. With keepalive value set to FALSE the watcher won\'t keep -Ev::run() / EvLoop::run() from returning even though the watcher is active. - -Watchers have keepalive value TRUE by default. - -Clearing keepalive status is useful when returning from Ev::run() / EvLoop::run() just because of the watcher -is undesirable. It could be a long running UDP socket watcher or so.', -'evchild::set' => 'Configures the watcher', -'EvChild::setCallback' => 'Sets new callback for the watcher.', -'EvChild::start' => 'Starts the watcher. - -Marks the watcher as active. Note that only active watchers will receive events.', -'EvChild::stop' => 'Stops the watcher. - -Marks the watcher as inactive. Note that only active watchers will receive events.', -'evembed::__construct' => 'Constructs the EvEmbed object', -'EvEmbed::clear' => 'Clear watcher pending status. - -If the watcher is pending, this method clears its pending status and returns its revents bitset (as if its -callback was invoked). If the watcher isn\'t pending it does nothing and returns 0. - -Sometimes it can be useful to "poll" a watcher instead of waiting for its callback to be invoked, which can be -accomplished with this function.', -'evembed::createStopped' => 'Create stopped EvEmbed watcher object', -'EvEmbed::feed' => 'Feeds the given revents set into the event loop. - -Feeds the given revents set into the event loop, as if the specified event had happened for the watcher.', -'EvEmbed::getLoop' => 'Returns the loop responsible for the watcher.', -'EvEmbed::invoke' => 'Invokes the watcher callback with the given received events bit mask.', -'EvEmbed::keepAlive' => 'Configures whether to keep the loop from returning. - -Configures whether to keep the loop from returning. With keepalive value set to FALSE the watcher won\'t keep -Ev::run() / EvLoop::run() from returning even though the watcher is active. - -Watchers have keepalive value TRUE by default. - -Clearing keepalive status is useful when returning from Ev::run() / EvLoop::run() just because of the watcher -is undesirable. It could be a long running UDP socket watcher or so.', -'evembed::set' => 'Configures the watcher', -'EvEmbed::setCallback' => 'Sets new callback for the watcher.', -'EvEmbed::start' => 'Starts the watcher. - -Marks the watcher as active. Note that only active watchers will receive events.', -'EvEmbed::stop' => 'Stops the watcher. - -Marks the watcher as inactive. Note that only active watchers will receive events.', -'evembed::sweep' => 'Make a single, non-blocking sweep over the embedded loop', -'event::__construct' => 'Constructs Event object', -'event::add' => 'Makes event pending', -'event::addSignal' => 'Makes signal event pending', -'event::addTimer' => 'Makes timer event pending', -'event::del' => 'Makes event non-pending', -'event::delSignal' => 'Makes signal event non-pending', -'event::delTimer' => 'Makes timer event non-pending', -'event::free' => 'Make event non-pending and free resources allocated for this event', -'event::getSupportedMethods' => 'Returns array with of the names of the methods supported in this version of Libevent', -'event::pending' => 'Detects whether event is pending or scheduled', -'event::set' => 'Re-configures event', -'event::setPriority' => 'Set event priority', -'event::setTimer' => 'Re-configures timer event', -'event::signal' => 'Constructs signal event object', -'event::timer' => 'Constructs timer event object', -'event_add' => 'Add an event to the set of monitored events', -'event_base_free' => 'Destroy event base', -'event_base_loop' => 'Handle events', -'event_base_loopbreak' => 'Abort event loop', -'event_base_loopexit' => 'Exit loop after a time', -'event_base_new' => 'Create and initialize new event base', -'event_base_priority_init' => 'Set the number of event priority levels', -'event_base_reinit' => 'Reinitialize the event base after a fork', -'event_base_set' => 'Associate event base with an event', -'event_buffer_base_set' => 'Associate buffered event with an event base', -'event_buffer_disable' => 'Disable a buffered event', -'event_buffer_enable' => 'Enable a buffered event', -'event_buffer_fd_set' => 'Change a buffered event file descriptor', -'event_buffer_free' => 'Destroy buffered event', -'event_buffer_new' => 'Create new buffered event', -'event_buffer_priority_set' => 'Assign a priority to a buffered event', -'event_buffer_read' => 'Read data from a buffered event', -'event_buffer_set_callback' => 'Set or reset callbacks for a buffered event', -'event_buffer_timeout_set' => 'Set read and write timeouts for a buffered event', -'event_buffer_watermark_set' => 'Set the watermarks for read and write events', -'event_buffer_write' => 'Write data to a buffered event', -'event_del' => 'Remove an event from the set of monitored events', -'event_free' => 'Free event resource', -'event_new' => 'Create new event', -'event_priority_set' => 'Assign a priority to an event', -'event_set' => 'Prepare an event', -'event_timer_add' => 'Alias of event_add', -'event_timer_del' => 'Alias of event_del', -'event_timer_new' => 'Alias of event_new', -'event_timer_set' => 'Prepare a timer event', -'eventbase::__construct' => 'Constructs EventBase object', -'eventbase::dispatch' => 'Dispatch pending events', -'eventbase::exit' => 'Stop dispatching events', -'eventbase::free' => 'Free resources allocated for this event base', -'eventbase::getFeatures' => 'Returns bitmask of features supported', -'eventbase::getMethod' => 'Returns event method in use', -'eventbase::getTimeOfDayCached' => 'Returns the current event base time', -'eventbase::gotExit' => 'Checks if the event loop was told to exit', -'eventbase::gotStop' => 'Checks if the event loop was told to exit', -'eventbase::loop' => 'Dispatch pending events', -'eventbase::priorityInit' => 'Sets number of priorities per event base', -'eventbase::reInit' => 'Re-initialize event base(after a fork)', -'eventbase::stop' => 'Tells event_base to stop dispatching events', -'eventbuffer::__construct' => 'Constructs EventBuffer object', -'eventbuffer::add' => 'Append data to the end of an event buffer', -'eventbuffer::addBuffer' => 'Move all data from a buffer provided to the current instance of EventBuffer', -'eventbuffer::appendFrom' => 'Moves the specified number of bytes from a source buffer to the end of the current buffer', -'eventbuffer::copyout' => 'Copies out specified number of bytes from the front of the buffer', -'eventbuffer::drain' => 'Removes specified number of bytes from the front of the buffer without copying it anywhere', -'EventBuffer::enableLocking' => 'enableLocking.', -'eventbuffer::expand' => 'Reserves space in buffer', -'eventbuffer::freeze' => 'Prevent calls that modify an event buffer from succeeding', -'eventbuffer::lock' => 'Acquires a lock on buffer', -'eventbuffer::prepend' => 'Prepend data to the front of the buffer', -'eventbuffer::prependBuffer' => 'Moves all data from source buffer to the front of current buffer', -'eventbuffer::pullup' => 'Linearizes data within buffer and returns it\'s contents as a string', -'eventbuffer::read' => 'Read data from an evbuffer and drain the bytes read', -'eventbuffer::readFrom' => 'Read data from a file onto the end of the buffer', -'eventbuffer::readLine' => 'Extracts a line from the front of the buffer', -'eventbuffer::search' => 'Scans the buffer for an occurrence of a string', -'eventbuffer::searchEol' => 'Scans the buffer for an occurrence of an end of line', -'eventbuffer::substr' => 'Substracts a portion of the buffer data', -'eventbuffer::unfreeze' => 'Re-enable calls that modify an event buffer', -'eventbuffer::unlock' => 'Releases lock acquired by EventBuffer::lock', -'eventbuffer::write' => 'Write contents of the buffer to a file or socket', -'eventbufferevent::__construct' => 'Constructs EventBufferEvent object', -'eventbufferevent::close' => 'Closes file descriptor associated with the current buffer event', -'eventbufferevent::connect' => 'Connect buffer event\'s file descriptor to given address or UNIX socket', -'eventbufferevent::connectHost' => 'Connects to a hostname with optionally asynchronous DNS resolving', -'eventbufferevent::createPair' => 'Creates two buffer events connected to each other', -'eventbufferevent::disable' => 'Disable events read, write, or both on a buffer event', -'eventbufferevent::enable' => 'Enable events read, write, or both on a buffer event', -'eventbufferevent::free' => 'Free a buffer event', -'eventbufferevent::getDnsErrorString' => 'Returns string describing the last failed DNS lookup attempt', -'eventbufferevent::getEnabled' => 'Returns bitmask of events currently enabled on the buffer event', -'eventbufferevent::getInput' => 'Returns underlying input buffer associated with current buffer event', -'eventbufferevent::getOutput' => 'Returns underlying output buffer associated with current buffer event', -'eventbufferevent::read' => 'Read buffer\'s data', -'eventbufferevent::readBuffer' => 'Drains the entire contents of the input buffer and places them into buf', -'eventbufferevent::setCallbacks' => 'Assigns read, write and event(status) callbacks', -'eventbufferevent::setPriority' => 'Assign a priority to a bufferevent', -'eventbufferevent::setTimeouts' => 'Set the read and write timeout for a buffer event', -'eventbufferevent::setWatermark' => 'Adjusts read and/or write watermarks', -'eventbufferevent::sslError' => 'Returns most recent OpenSSL error reported on the buffer event', -'eventbufferevent::sslFilter' => 'Create a new SSL buffer event to send its data over another buffer event', -'eventbufferevent::sslGetCipherInfo' => 'Returns a textual description of the cipher', -'eventbufferevent::sslGetCipherName' => 'Returns the current cipher name of the SSL connection', -'eventbufferevent::sslGetCipherVersion' => 'Returns version of cipher used by current SSL connection', -'eventbufferevent::sslGetProtocol' => 'Returns the name of the protocol used for current SSL connection', -'eventbufferevent::sslRenegotiate' => 'Tells a bufferevent to begin SSL renegotiation', -'eventbufferevent::sslSocket' => 'Creates a new SSL buffer event to send its data over an SSL on a socket', -'eventbufferevent::write' => 'Adds data to a buffer event\'s output buffer', -'eventbufferevent::writeBuffer' => 'Adds contents of the entire buffer to a buffer event\'s output buffer', -'eventconfig::__construct' => 'Constructs EventConfig object', -'eventconfig::avoidMethod' => 'Tells libevent to avoid specific event method', -'eventconfig::requireFeatures' => 'Enters a required event method feature that the application demands', -'eventconfig::setMaxDispatchInterval' => 'Prevents priority inversion', -'eventdnsbase::__construct' => 'Constructs EventDnsBase object', -'eventdnsbase::addNameserverIp' => 'Adds a nameserver to the DNS base', -'eventdnsbase::addSearch' => 'Adds a domain to the list of search domains', -'eventdnsbase::clearSearch' => 'Removes all current search suffixes', -'eventdnsbase::countNameservers' => 'Gets the number of configured nameservers', -'eventdnsbase::loadHosts' => 'Loads a hosts file (in the same format as /etc/hosts) from hosts file', -'eventdnsbase::parseResolvConf' => 'Scans the resolv.conf-formatted file', -'eventdnsbase::setOption' => 'Set the value of a configuration option', -'eventdnsbase::setSearchNdots' => 'Set the \'ndots\' parameter for searches', -'eventhttp::__construct' => 'Constructs EventHttp object(the HTTP server)', -'eventhttp::accept' => 'Makes an HTTP server accept connections on the specified socket stream or resource', -'eventhttp::addServerAlias' => 'Adds a server alias to the HTTP server object', -'eventhttp::bind' => 'Binds an HTTP server on the specified address and port', -'eventhttp::removeServerAlias' => 'Removes server alias', -'eventhttp::setAllowedMethods' => 'Sets the what HTTP methods are supported in requests accepted by this server, and passed to user callbacks', -'eventhttp::setCallback' => 'Sets a callback for specified URI', -'eventhttp::setDefaultCallback' => 'Sets default callback to handle requests that are not caught by specific callbacks', -'eventhttp::setMaxBodySize' => 'Sets maximum request body size', -'eventhttp::setMaxHeadersSize' => 'Sets maximum HTTP header size', -'eventhttp::setTimeout' => 'Sets the timeout for an HTTP request', -'eventhttpconnection::__construct' => 'Constructs EventHttpConnection object', -'eventhttpconnection::getBase' => 'Returns event base associated with the connection', -'eventhttpconnection::getPeer' => 'Gets the remote address and port associated with the connection', -'eventhttpconnection::makeRequest' => 'Makes an HTTP request over the specified connection', -'eventhttpconnection::setCloseCallback' => 'Set callback for connection close', -'eventhttpconnection::setLocalAddress' => 'Sets the IP address from which HTTP connections are made', -'eventhttpconnection::setLocalPort' => 'Sets the local port from which connections are made', -'eventhttpconnection::setMaxBodySize' => 'Sets maximum body size for the connection', -'eventhttpconnection::setMaxHeadersSize' => 'Sets maximum header size', -'eventhttpconnection::setRetries' => 'Sets the retry limit for the connection', -'eventhttpconnection::setTimeout' => 'Sets the timeout for the connection', -'eventhttprequest::__construct' => 'Constructs EventHttpRequest object', -'eventhttprequest::addHeader' => 'Adds an HTTP header to the headers of the request', -'eventhttprequest::cancel' => 'Cancels a pending HTTP request', -'eventhttprequest::clearHeaders' => 'Removes all output headers from the header list of the request', -'eventhttprequest::closeConnection' => 'Closes associated HTTP connection', -'eventhttprequest::findHeader' => 'Finds the value belonging a header', -'eventhttprequest::free' => 'Frees the object and removes associated events', -'eventhttprequest::getBufferEvent' => 'Returns EventBufferEvent object', -'eventhttprequest::getCommand' => 'Returns the request command(method)', -'eventhttprequest::getConnection' => 'Returns EventHttpConnection object', -'eventhttprequest::getHost' => 'Returns the request host', -'eventhttprequest::getInputBuffer' => 'Returns the input buffer', -'eventhttprequest::getInputHeaders' => 'Returns associative array of the input headers', -'eventhttprequest::getOutputBuffer' => 'Returns the output buffer of the request', -'eventhttprequest::getOutputHeaders' => 'Returns associative array of the output headers', -'eventhttprequest::getResponseCode' => 'Returns the response code', -'eventhttprequest::getUri' => 'Returns the request URI', -'eventhttprequest::removeHeader' => 'Removes an HTTP header from the headers of the request', -'eventhttprequest::sendError' => 'Send an HTML error message to the client', -'eventhttprequest::sendReply' => 'Send an HTML reply to the client', -'eventhttprequest::sendReplyChunk' => 'Send another data chunk as part of an ongoing chunked reply', -'eventhttprequest::sendReplyEnd' => 'Complete a chunked reply, freeing the request as appropriate', -'eventhttprequest::sendReplyStart' => 'Initiate a chunked reply', -'eventlistener::__construct' => 'Creates new connection listener associated with an event base', -'eventlistener::disable' => 'Disables an event connect listener object', -'eventlistener::enable' => 'Enables an event connect listener object', -'eventlistener::getBase' => 'Returns event base associated with the event listener', -'eventlistener::getSocketName' => 'Retreives the current address to which the listener\'s socket is bound', -'eventlistener::setCallback' => 'The setCallback purpose', -'eventlistener::setErrorCallback' => 'Set event listener\'s error callback', -'eventsslcontext::__construct' => 'Constructs an OpenSSL context for use with Event classes', -'eventutil::__construct' => 'The abstract constructor', -'eventutil::getLastSocketErrno' => 'Returns the most recent socket error number', -'eventutil::getLastSocketError' => 'Returns the most recent socket error', -'eventutil::getSocketFd' => 'Returns numeric file descriptor of a socket, or stream', -'eventutil::getSocketName' => 'Retreives the current address to which the socket is bound', -'eventutil::setSocketOption' => 'Sets socket options', -'eventutil::sslRandPoll' => 'Generates entropy by means of OpenSSL\'s RAND_poll()', -'evfork::__construct' => 'Constructs the EvFork watcher object', -'EvFork::clear' => 'Clear watcher pending status. - -If the watcher is pending, this method clears its pending status and returns its revents bitset (as if its -callback was invoked). If the watcher isn\'t pending it does nothing and returns 0. - -Sometimes it can be useful to "poll" a watcher instead of waiting for its callback to be invoked, which can be -accomplished with this function.', -'evfork::createStopped' => 'Creates a stopped instance of EvFork watcher class', -'EvFork::feed' => 'Feeds the given revents set into the event loop. - -Feeds the given revents set into the event loop, as if the specified event had happened for the watcher.', -'EvFork::getLoop' => 'Returns the loop responsible for the watcher.', -'EvFork::invoke' => 'Invokes the watcher callback with the given received events bit mask.', -'EvFork::keepAlive' => 'Configures whether to keep the loop from returning. - -Configures whether to keep the loop from returning. With keepalive value set to FALSE the watcher won\'t keep -Ev::run() / EvLoop::run() from returning even though the watcher is active. - -Watchers have keepalive value TRUE by default. - -Clearing keepalive status is useful when returning from Ev::run() / EvLoop::run() just because of the watcher -is undesirable. It could be a long running UDP socket watcher or so.', -'EvFork::setCallback' => 'Sets new callback for the watcher.', -'EvFork::start' => 'Starts the watcher. - -Marks the watcher as active. Note that only active watchers will receive events.', -'EvFork::stop' => 'Stops the watcher. - -Marks the watcher as inactive. Note that only active watchers will receive events.', -'evidle::__construct' => 'Constructs the EvIdle watcher object', -'EvIdle::clear' => 'Clear watcher pending status. - -If the watcher is pending, this method clears its pending status and returns its revents bitset (as if its -callback was invoked). If the watcher isn\'t pending it does nothing and returns 0. - -Sometimes it can be useful to "poll" a watcher instead of waiting for its callback to be invoked, which can be -accomplished with this function.', -'evidle::createStopped' => 'Creates instance of a stopped EvIdle watcher object', -'EvIdle::feed' => 'Feeds the given revents set into the event loop. - -Feeds the given revents set into the event loop, as if the specified event had happened for the watcher.', -'EvIdle::getLoop' => 'Returns the loop responsible for the watcher.', -'EvIdle::invoke' => 'Invokes the watcher callback with the given received events bit mask.', -'EvIdle::keepAlive' => 'Configures whether to keep the loop from returning. - -Configures whether to keep the loop from returning. With keepalive value set to FALSE the watcher won\'t keep -Ev::run() / EvLoop::run() from returning even though the watcher is active. - -Watchers have keepalive value TRUE by default. - -Clearing keepalive status is useful when returning from Ev::run() / EvLoop::run() just because of the watcher -is undesirable. It could be a long running UDP socket watcher or so.', -'EvIdle::setCallback' => 'Sets new callback for the watcher.', -'EvIdle::start' => 'Starts the watcher. - -Marks the watcher as active. Note that only active watchers will receive events.', -'EvIdle::stop' => 'Stops the watcher. - -Marks the watcher as inactive. Note that only active watchers will receive events.', -'evio::__construct' => 'Constructs EvIo watcher object', -'EvIo::clear' => 'Clear watcher pending status. - -If the watcher is pending, this method clears its pending status and returns its revents bitset (as if its -callback was invoked). If the watcher isn\'t pending it does nothing and returns 0. - -Sometimes it can be useful to "poll" a watcher instead of waiting for its callback to be invoked, which can be -accomplished with this function.', -'evio::createStopped' => 'Create stopped EvIo watcher object', -'EvIo::feed' => 'Feeds the given revents set into the event loop. - -Feeds the given revents set into the event loop, as if the specified event had happened for the watcher.', -'EvIo::getLoop' => 'Returns the loop responsible for the watcher.', -'EvIo::invoke' => 'Invokes the watcher callback with the given received events bit mask.', -'EvIo::keepAlive' => 'Configures whether to keep the loop from returning. - -Configures whether to keep the loop from returning. With keepalive value set to FALSE the watcher won\'t keep -Ev::run() / EvLoop::run() from returning even though the watcher is active. - -Watchers have keepalive value TRUE by default. - -Clearing keepalive status is useful when returning from Ev::run() / EvLoop::run() just because of the watcher -is undesirable. It could be a long running UDP socket watcher or so.', -'evio::set' => 'Configures the watcher', -'EvIo::setCallback' => 'Sets new callback for the watcher.', -'EvIo::start' => 'Starts the watcher. - -Marks the watcher as active. Note that only active watchers will receive events.', -'EvIo::stop' => 'Stops the watcher. - -Marks the watcher as inactive. Note that only active watchers will receive events.', -'evloop::__construct' => 'Constructs the event loop object', -'evloop::backend' => 'Returns an integer describing the backend used by libev', -'evloop::check' => 'Creates EvCheck object associated with the current event loop instance', -'evloop::child' => 'Creates EvChild object associated with the current event loop', -'evloop::defaultLoop' => 'Returns or creates the default event loop', -'evloop::embed' => 'Creates an instance of EvEmbed watcher associated with the current EvLoop object', -'evloop::fork' => 'Creates EvFork watcher object associated with the current event loop instance', -'evloop::idle' => 'Creates EvIdle watcher object associated with the current event loop instance', -'evloop::invokePending' => 'Invoke all pending watchers while resetting their pending state', -'evloop::io' => 'Create EvIo watcher object associated with the current event loop instance', -'evloop::loopFork' => 'Must be called after a fork', -'evloop::now' => 'Returns the current "event loop time"', -'evloop::nowUpdate' => 'Establishes the current time by querying the kernel, updating the time returned by EvLoop::now in the progress', -'evloop::periodic' => 'Creates EvPeriodic watcher object associated with the current event loop instance', -'evloop::prepare' => 'Creates EvPrepare watcher object associated with the current event loop instance', -'evloop::resume' => 'Resume previously suspended default event loop', -'evloop::run' => 'Begin checking for events and calling callbacks for the loop', -'evloop::signal' => 'Creates EvSignal watcher object associated with the current event loop instance', -'evloop::stat' => 'Creates EvStat watcher object associated with the current event loop instance', -'evloop::stop' => 'Stops the event loop', -'evloop::suspend' => 'Suspend the loop', -'evloop::timer' => 'Creates EvTimer watcher object associated with the current event loop instance', -'evloop::verify' => 'Performs internal consistency checks(for debugging)', -'evperiodic::__construct' => 'Constructs EvPeriodic watcher object', -'evperiodic::again' => 'Simply stops and restarts the periodic watcher again', -'evperiodic::at' => 'Returns the absolute time that this watcher is supposed to trigger next', -'EvPeriodic::clear' => 'Clear watcher pending status. - -If the watcher is pending, this method clears its pending status and returns its revents bitset (as if its -callback was invoked). If the watcher isn\'t pending it does nothing and returns 0. - -Sometimes it can be useful to "poll" a watcher instead of waiting for its callback to be invoked, which can be -accomplished with this function.', -'evperiodic::createStopped' => 'Create a stopped EvPeriodic watcher', -'EvPeriodic::feed' => 'Feeds the given revents set into the event loop. - -Feeds the given revents set into the event loop, as if the specified event had happened for the watcher.', -'EvPeriodic::getLoop' => 'Returns the loop responsible for the watcher.', -'EvPeriodic::invoke' => 'Invokes the watcher callback with the given received events bit mask.', -'EvPeriodic::keepAlive' => 'Configures whether to keep the loop from returning. - -Configures whether to keep the loop from returning. With keepalive value set to FALSE the watcher won\'t keep -Ev::run() / EvLoop::run() from returning even though the watcher is active. - -Watchers have keepalive value TRUE by default. - -Clearing keepalive status is useful when returning from Ev::run() / EvLoop::run() just because of the watcher -is undesirable. It could be a long running UDP socket watcher or so.', -'evperiodic::set' => 'Configures the watcher', -'EvPeriodic::setCallback' => 'Sets new callback for the watcher.', -'EvPeriodic::start' => 'Starts the watcher. - -Marks the watcher as active. Note that only active watchers will receive events.', -'EvPeriodic::stop' => 'Stops the watcher. - -Marks the watcher as inactive. Note that only active watchers will receive events.', -'evprepare::__construct' => 'Constructs EvPrepare watcher object', -'EvPrepare::clear' => 'Clear watcher pending status. - -If the watcher is pending, this method clears its pending status and returns its revents bitset (as if its -callback was invoked). If the watcher isn\'t pending it does nothing and returns 0. - -Sometimes it can be useful to "poll" a watcher instead of waiting for its callback to be invoked, which can be -accomplished with this function.', -'evprepare::createStopped' => 'Creates a stopped instance of EvPrepare watcher', -'EvPrepare::feed' => 'Feeds the given revents set into the event loop. - -Feeds the given revents set into the event loop, as if the specified event had happened for the watcher.', -'EvPrepare::getLoop' => 'Returns the loop responsible for the watcher.', -'EvPrepare::invoke' => 'Invokes the watcher callback with the given received events bit mask.', -'EvPrepare::keepAlive' => 'Configures whether to keep the loop from returning. - -Configures whether to keep the loop from returning. With keepalive value set to FALSE the watcher won\'t keep -Ev::run() / EvLoop::run() from returning even though the watcher is active. - -Watchers have keepalive value TRUE by default. - -Clearing keepalive status is useful when returning from Ev::run() / EvLoop::run() just because of the watcher -is undesirable. It could be a long running UDP socket watcher or so.', -'EvPrepare::setCallback' => 'Sets new callback for the watcher.', -'EvPrepare::start' => 'Starts the watcher. - -Marks the watcher as active. Note that only active watchers will receive events.', -'EvPrepare::stop' => 'Stops the watcher. - -Marks the watcher as inactive. Note that only active watchers will receive events.', -'evsignal::__construct' => 'Constructs EvSignal watcher object', -'EvSignal::clear' => 'Clear watcher pending status. - -If the watcher is pending, this method clears its pending status and returns its revents bitset (as if its -callback was invoked). If the watcher isn\'t pending it does nothing and returns 0. - -Sometimes it can be useful to "poll" a watcher instead of waiting for its callback to be invoked, which can be -accomplished with this function.', -'evsignal::createStopped' => 'Create stopped EvSignal watcher object', -'EvSignal::feed' => 'Feeds the given revents set into the event loop. - -Feeds the given revents set into the event loop, as if the specified event had happened for the watcher.', -'EvSignal::getLoop' => 'Returns the loop responsible for the watcher.', -'EvSignal::invoke' => 'Invokes the watcher callback with the given received events bit mask.', -'EvSignal::keepAlive' => 'Configures whether to keep the loop from returning. - -Configures whether to keep the loop from returning. With keepalive value set to FALSE the watcher won\'t keep -Ev::run() / EvLoop::run() from returning even though the watcher is active. - -Watchers have keepalive value TRUE by default. - -Clearing keepalive status is useful when returning from Ev::run() / EvLoop::run() just because of the watcher -is undesirable. It could be a long running UDP socket watcher or so.', -'evsignal::set' => 'Configures the watcher', -'EvSignal::setCallback' => 'Sets new callback for the watcher.', -'EvSignal::start' => 'Starts the watcher. - -Marks the watcher as active. Note that only active watchers will receive events.', -'EvSignal::stop' => 'Stops the watcher. - -Marks the watcher as inactive. Note that only active watchers will receive events.', -'evstat::__construct' => 'Constructs EvStat watcher object', -'evstat::attr' => 'Returns the values most recently detected by Ev', -'EvStat::clear' => 'Clear watcher pending status. - -If the watcher is pending, this method clears its pending status and returns its revents bitset (as if its -callback was invoked). If the watcher isn\'t pending it does nothing and returns 0. - -Sometimes it can be useful to "poll" a watcher instead of waiting for its callback to be invoked, which can be -accomplished with this function.', -'evstat::createStopped' => 'Create a stopped EvStat watcher object', -'EvStat::feed' => 'Feeds the given revents set into the event loop. - -Feeds the given revents set into the event loop, as if the specified event had happened for the watcher.', -'EvStat::getLoop' => 'Returns the loop responsible for the watcher.', -'EvStat::invoke' => 'Invokes the watcher callback with the given received events bit mask.', -'EvStat::keepAlive' => 'Configures whether to keep the loop from returning. - -Configures whether to keep the loop from returning. With keepalive value set to FALSE the watcher won\'t keep -Ev::run() / EvLoop::run() from returning even though the watcher is active. - -Watchers have keepalive value TRUE by default. - -Clearing keepalive status is useful when returning from Ev::run() / EvLoop::run() just because of the watcher -is undesirable. It could be a long running UDP socket watcher or so.', -'evstat::prev' => 'Returns the previous set of values returned by EvStat::attr', -'evstat::set' => 'Configures the watcher', -'EvStat::setCallback' => 'Sets new callback for the watcher.', -'EvStat::start' => 'Starts the watcher. - -Marks the watcher as active. Note that only active watchers will receive events.', -'evstat::stat' => 'Initiates the stat call', -'EvStat::stop' => 'Stops the watcher. - -Marks the watcher as inactive. Note that only active watchers will receive events.', -'evtimer::__construct' => 'Constructs an EvTimer watcher object', -'evtimer::again' => 'Restarts the timer watcher', -'EvTimer::clear' => 'Clear watcher pending status. - -If the watcher is pending, this method clears its pending status and returns its revents bitset (as if its -callback was invoked). If the watcher isn\'t pending it does nothing and returns 0. - -Sometimes it can be useful to "poll" a watcher instead of waiting for its callback to be invoked, which can be -accomplished with this function.', -'evtimer::createStopped' => 'Creates EvTimer stopped watcher object', -'EvTimer::feed' => 'Feeds the given revents set into the event loop. - -Feeds the given revents set into the event loop, as if the specified event had happened for the watcher.', -'EvTimer::getLoop' => 'Returns the loop responsible for the watcher.', -'EvTimer::invoke' => 'Invokes the watcher callback with the given received events bit mask.', -'EvTimer::keepAlive' => 'Configures whether to keep the loop from returning. - -Configures whether to keep the loop from returning. With keepalive value set to FALSE the watcher won\'t keep -Ev::run() / EvLoop::run() from returning even though the watcher is active. - -Watchers have keepalive value TRUE by default. - -Clearing keepalive status is useful when returning from Ev::run() / EvLoop::run() just because of the watcher -is undesirable. It could be a long running UDP socket watcher or so.', -'evtimer::set' => 'Configures the watcher', -'EvTimer::setCallback' => 'Sets new callback for the watcher.', -'EvTimer::start' => 'Starts the watcher. - -Marks the watcher as active. Note that only active watchers will receive events.', -'EvTimer::stop' => 'Stops the watcher. - -Marks the watcher as inactive. Note that only active watchers will receive events.', -'evwatcher::__construct' => 'Abstract constructor of a watcher object', -'evwatcher::clear' => 'Clear watcher pending status', -'evwatcher::feed' => 'Feeds the given revents set into the event loop', -'evwatcher::getLoop' => 'Returns the loop responsible for the watcher', -'evwatcher::invoke' => 'Invokes the watcher callback with the given received events bit mask', -'evwatcher::keepalive' => 'Configures whether to keep the loop from returning', -'evwatcher::setCallback' => 'Sets new callback for the watcher', -'evwatcher::start' => 'Starts the watcher', -'evwatcher::stop' => 'Stops the watcher', -'Exception::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'Exception::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'Exception::__toString' => 'String representation of the exception', -'Exception::getCode' => 'Gets the Exception code', -'Exception::getFile' => 'Gets the file in which the exception occurred', -'Exception::getLine' => 'Gets the line in which the exception occurred', -'Exception::getMessage' => 'Gets the Exception message', -'Exception::getPrevious' => 'Returns previous Exception', -'Exception::getTrace' => 'Gets the stack trace', -'Exception::getTraceAsString' => 'Gets the stack trace as a string', -'exec' => 'Execute an external program', -'exif_imagetype' => 'Determine the type of an image', -'exif_read_data' => 'Reads the EXIF headers from an image file', -'exif_tagname' => 'Get the header name for an index', -'exif_thumbnail' => 'Retrieve the embedded thumbnail of an image', -'exit' => 'Output a message and terminate the current script', -'exp' => 'Calculates the exponent of e', -'expect_expectl' => 'Waits until the output from a process matches one of the patterns, a specified time period has passed, or an EOF is seen', -'expect_popen' => 'Execute command via Bourne shell, and open the PTY stream to the process', -'explode' => 'Split a string by a string', -'expm1' => 'Returns exp(number) - 1, computed in a way that is accurate even when the value of number is close to zero', -'expression' => 'Bind prepared statement variables as parameters', -'extension_loaded' => 'Find out whether an extension is loaded', -'extract' => 'Import variables into the current symbol table from an array', -'ezmlm_hash' => 'Calculate the hash value needed by EZMLM', -'fam_cancel_monitor' => 'Terminate monitoring', -'fam_close' => 'Close FAM connection', -'fam_monitor_collection' => 'Monitor a collection of files in a directory for changes', -'fam_monitor_directory' => 'Monitor a directory for changes', -'fam_monitor_file' => 'Monitor a regular file for changes', -'fam_next_event' => 'Get next pending FAM event', -'fam_open' => 'Open connection to FAM daemon', -'fam_pending' => 'Check for pending FAM events', -'fam_resume_monitor' => 'Resume suspended monitoring', -'fam_suspend_monitor' => 'Temporarily suspend monitoring', -'fann_cascadetrain_on_data' => 'Trains on an entire dataset, for a period of time using the Cascade2 training algorithm', -'fann_cascadetrain_on_file' => 'Trains on an entire dataset read from file, for a period of time using the Cascade2 training algorithm', -'fann_clear_scaling_params' => 'Clears scaling parameters', -'fann_copy' => 'Creates a copy of a fann structure', -'fann_create_from_file' => 'Constructs a backpropagation neural network from a configuration file', -'fann_create_shortcut' => 'Creates a standard backpropagation neural network which is not fully connectected and has shortcut connections', -'fann_create_shortcut_array' => 'Creates a standard backpropagation neural network which is not fully connectected and has shortcut connections', -'fann_create_sparse' => 'Creates a standard backpropagation neural network, which is not fully connected', -'fann_create_sparse_array' => 'Creates a standard backpropagation neural network, which is not fully connected using an array of layer sizes', -'fann_create_standard' => 'Creates a standard fully connected backpropagation neural network', -'fann_create_standard_array' => 'Creates a standard fully connected backpropagation neural network using an array of layer sizes', -'fann_create_train' => 'Creates an empty training data struct', -'fann_create_train_from_callback' => 'Creates the training data struct from a user supplied function', -'fann_descale_input' => 'Scale data in input vector after get it from ann based on previously calculated parameters', -'fann_descale_output' => 'Scale data in output vector after get it from ann based on previously calculated parameters', -'fann_descale_train' => 'Descale input and output data based on previously calculated parameters', -'fann_destroy' => 'Destroys the entire network and properly freeing all the associated memory', -'fann_destroy_train' => 'Destructs the training data', -'fann_duplicate_train_data' => 'Returns an exact copy of a fann train data', -'fann_get_activation_function' => 'Returns the activation function', -'fann_get_activation_steepness' => 'Returns the activation steepness for supplied neuron and layer number', -'fann_get_bias_array' => 'Get the number of bias in each layer in the network', -'fann_get_bit_fail' => 'The number of fail bits', -'fann_get_bit_fail_limit' => 'Returns the bit fail limit used during training', -'fann_get_cascade_activation_functions' => 'Returns the cascade activation functions', -'fann_get_cascade_activation_functions_count' => 'Returns the number of cascade activation functions', -'fann_get_cascade_activation_steepnesses' => 'Returns the cascade activation steepnesses', -'fann_get_cascade_activation_steepnesses_count' => 'The number of activation steepnesses', -'fann_get_cascade_candidate_change_fraction' => 'Returns the cascade candidate change fraction', -'fann_get_cascade_candidate_limit' => 'Return the candidate limit', -'fann_get_cascade_candidate_stagnation_epochs' => 'Returns the number of cascade candidate stagnation epochs', -'fann_get_cascade_max_cand_epochs' => 'Returns the maximum candidate epochs', -'fann_get_cascade_max_out_epochs' => 'Returns the maximum out epochs', -'fann_get_cascade_min_cand_epochs' => 'Returns the minimum candidate epochs', -'fann_get_cascade_min_out_epochs' => 'Returns the minimum out epochs', -'fann_get_cascade_num_candidate_groups' => 'Returns the number of candidate groups', -'fann_get_cascade_num_candidates' => 'Returns the number of candidates used during training', -'fann_get_cascade_output_change_fraction' => 'Returns the cascade output change fraction', -'fann_get_cascade_output_stagnation_epochs' => 'Returns the number of cascade output stagnation epochs', -'fann_get_cascade_weight_multiplier' => 'Returns the weight multiplier', -'fann_get_connection_array' => 'Get connections in the network', -'fann_get_connection_rate' => 'Get the connection rate used when the network was created', -'fann_get_errno' => 'Returns the last error number', -'fann_get_errstr' => 'Returns the last errstr', -'fann_get_layer_array' => 'Get the number of neurons in each layer in the network', -'fann_get_learning_momentum' => 'Returns the learning momentum', -'fann_get_learning_rate' => 'Returns the learning rate', -'fann_get_mse' => 'Reads the mean square error from the network', -'fann_get_network_type' => 'Get the type of neural network it was created as', -'fann_get_num_input' => 'Get the number of input neurons', -'fann_get_num_layers' => 'Get the number of layers in the neural network', -'fann_get_num_output' => 'Get the number of output neurons', -'fann_get_quickprop_decay' => 'Returns the decay which is a factor that weights should decrease in each iteration during quickprop training', -'fann_get_quickprop_mu' => 'Returns the mu factor', -'fann_get_rprop_decrease_factor' => 'Returns the increase factor used during RPROP training', -'fann_get_rprop_delta_max' => 'Returns the maximum step-size', -'fann_get_rprop_delta_min' => 'Returns the minimum step-size', -'fann_get_rprop_delta_zero' => 'Returns the initial step-size', -'fann_get_rprop_increase_factor' => 'Returns the increase factor used during RPROP training', -'fann_get_sarprop_step_error_shift' => 'Returns the sarprop step error shift', -'fann_get_sarprop_step_error_threshold_factor' => 'Returns the sarprop step error threshold factor', -'fann_get_sarprop_temperature' => 'Returns the sarprop temperature', -'fann_get_sarprop_weight_decay_shift' => 'Returns the sarprop weight decay shift', -'fann_get_total_connections' => 'Get the total number of connections in the entire network', -'fann_get_total_neurons' => 'Get the total number of neurons in the entire network', -'fann_get_train_error_function' => 'Returns the error function used during training', -'fann_get_train_stop_function' => 'Returns the stop function used during training', -'fann_get_training_algorithm' => 'Returns the training algorithm', -'fann_init_weights' => 'Initialize the weights using Widrow + Nguyen’s algorithm', -'fann_length_train_data' => 'Returns the number of training patterns in the train data', -'fann_merge_train_data' => 'Merges the train data', -'fann_num_input_train_data' => 'Returns the number of inputs in each of the training patterns in the train data', -'fann_num_output_train_data' => 'Returns the number of outputs in each of the training patterns in the train data', -'fann_print_error' => 'Prints the error string', -'fann_randomize_weights' => 'Give each connection a random weight between min_weight and max_weight', -'fann_read_train_from_file' => 'Reads a file that stores training data', -'fann_reset_errno' => 'Resets the last error number', -'fann_reset_errstr' => 'Resets the last error string', -'fann_reset_mse' => 'Resets the mean square error from the network', -'fann_run' => 'Will run input through the neural network', -'fann_save' => 'Saves the entire network to a configuration file', -'fann_save_train' => 'Save the training structure to a file', -'fann_scale_input' => 'Scale data in input vector before feed it to ann based on previously calculated parameters', -'fann_scale_input_train_data' => 'Scales the inputs in the training data to the specified range', -'fann_scale_output' => 'Scale data in output vector before feed it to ann based on previously calculated parameters', -'fann_scale_output_train_data' => 'Scales the outputs in the training data to the specified range', -'fann_scale_train' => 'Scale input and output data based on previously calculated parameters', -'fann_scale_train_data' => 'Scales the inputs and outputs in the training data to the specified range', -'fann_set_activation_function' => 'Sets the activation function for supplied neuron and layer', -'fann_set_activation_function_hidden' => 'Sets the activation function for all of the hidden layers', -'fann_set_activation_function_layer' => 'Sets the activation function for all the neurons in the supplied layer', -'fann_set_activation_function_output' => 'Sets the activation function for the output layer', -'fann_set_activation_steepness' => 'Sets the activation steepness for supplied neuron and layer number', -'fann_set_activation_steepness_hidden' => 'Sets the steepness of the activation steepness for all neurons in the all hidden layers', -'fann_set_activation_steepness_layer' => 'Sets the activation steepness for all of the neurons in the supplied layer number', -'fann_set_activation_steepness_output' => 'Sets the steepness of the activation steepness in the output layer', -'fann_set_bit_fail_limit' => 'Set the bit fail limit used during training', -'fann_set_callback' => 'Sets the callback function for use during training', -'fann_set_cascade_activation_functions' => 'Sets the array of cascade candidate activation functions', -'fann_set_cascade_activation_steepnesses' => 'Sets the array of cascade candidate activation steepnesses', -'fann_set_cascade_candidate_change_fraction' => 'Sets the cascade candidate change fraction', -'fann_set_cascade_candidate_limit' => 'Sets the candidate limit', -'fann_set_cascade_candidate_stagnation_epochs' => 'Sets the number of cascade candidate stagnation epochs', -'fann_set_cascade_max_cand_epochs' => 'Sets the max candidate epochs', -'fann_set_cascade_max_out_epochs' => 'Sets the maximum out epochs', -'fann_set_cascade_min_cand_epochs' => 'Sets the min candidate epochs', -'fann_set_cascade_min_out_epochs' => 'Sets the minimum out epochs', -'fann_set_cascade_num_candidate_groups' => 'Sets the number of candidate groups', -'fann_set_cascade_output_change_fraction' => 'Sets the cascade output change fraction', -'fann_set_cascade_output_stagnation_epochs' => 'Sets the number of cascade output stagnation epochs', -'fann_set_cascade_weight_multiplier' => 'Sets the weight multiplier', -'fann_set_error_log' => 'Sets where the errors are logged to', -'fann_set_input_scaling_params' => 'Calculate input scaling parameters for future use based on training data', -'fann_set_learning_momentum' => 'Sets the learning momentum', -'fann_set_learning_rate' => 'Sets the learning rate', -'fann_set_output_scaling_params' => 'Calculate output scaling parameters for future use based on training data', -'fann_set_quickprop_decay' => 'Sets the quickprop decay factor', -'fann_set_quickprop_mu' => 'Sets the quickprop mu factor', -'fann_set_rprop_decrease_factor' => 'Sets the decrease factor used during RPROP training', -'fann_set_rprop_delta_max' => 'Sets the maximum step-size', -'fann_set_rprop_delta_min' => 'Sets the minimum step-size', -'fann_set_rprop_delta_zero' => 'Sets the initial step-size', -'fann_set_rprop_increase_factor' => 'Sets the increase factor used during RPROP training', -'fann_set_sarprop_step_error_shift' => 'Sets the sarprop step error shift', -'fann_set_sarprop_step_error_threshold_factor' => 'Sets the sarprop step error threshold factor', -'fann_set_sarprop_temperature' => 'Sets the sarprop temperature', -'fann_set_sarprop_weight_decay_shift' => 'Sets the sarprop weight decay shift', -'fann_set_scaling_params' => 'Calculate input and output scaling parameters for future use based on training data', -'fann_set_train_error_function' => 'Sets the error function used during training', -'fann_set_train_stop_function' => 'Sets the stop function used during training', -'fann_set_training_algorithm' => 'Sets the training algorithm', -'fann_set_weight' => 'Set a connection in the network', -'fann_set_weight_array' => 'Set connections in the network', -'fann_shuffle_train_data' => 'Shuffles training data, randomizing the order', -'fann_subset_train_data' => 'Returns an copy of a subset of the train data', -'fann_test' => 'Test with a set of inputs, and a set of desired outputs', -'fann_test_data' => 'Test a set of training data and calculates the MSE for the training data', -'fann_train' => 'Train one iteration with a set of inputs, and a set of desired outputs', -'fann_train_epoch' => 'Train one epoch with a set of training data', -'fann_train_on_data' => 'Trains on an entire dataset for a period of time', -'fann_train_on_file' => 'Trains on an entire dataset, which is read from file, for a period of time', -'fannconnection::__construct' => 'The connection constructor', -'fannconnection::getFromNeuron' => 'Returns the positions of starting neuron', -'fannconnection::getToNeuron' => 'Returns the positions of terminating neuron', -'fannconnection::getWeight' => 'Returns the connection weight', -'fannconnection::setWeight' => 'Sets the connections weight', -'fastcgi_finish_request' => 'Flushes all response data to the client', -'fbsql_affected_rows' => 'Get number of affected rows in previous FrontBase operation', -'fbsql_autocommit' => 'Enable or disable autocommit', -'fbsql_blob_size' => 'Get the size of a BLOB', -'fbsql_change_user' => 'Change logged in user of the active connection', -'fbsql_clob_size' => 'Get the size of a CLOB', -'fbsql_close' => 'Close FrontBase connection', -'fbsql_commit' => 'Commits a transaction to the database', -'fbsql_connect' => 'Open a connection to a FrontBase Server', -'fbsql_create_blob' => 'Create a BLOB', -'fbsql_create_clob' => 'Create a CLOB', -'fbsql_create_db' => 'Create a FrontBase database', -'fbsql_data_seek' => 'Move internal result pointer', -'fbsql_database' => 'Get or set the database name used with a connection', -'fbsql_database_password' => 'Sets or retrieves the password for a FrontBase database', -'fbsql_db_query' => 'Send a FrontBase query', -'fbsql_db_status' => 'Get the status for a given database', -'fbsql_drop_db' => 'Drop (delete) a FrontBase database', -'fbsql_errno' => 'Returns the error number from previous operation', -'fbsql_error' => 'Returns the error message from previous operation', -'fbsql_fetch_array' => 'Fetch a result row as an associative array, a numeric array, or both', -'fbsql_fetch_assoc' => 'Fetch a result row as an associative array', -'fbsql_fetch_field' => 'Get column information from a result and return as an object', -'fbsql_fetch_lengths' => 'Get the length of each output in a result', -'fbsql_fetch_object' => 'Fetch a result row as an object', -'fbsql_fetch_row' => 'Get a result row as an enumerated array', -'fbsql_field_flags' => 'Get the flags associated with the specified field in a result', -'fbsql_field_len' => 'Returns the length of the specified field', -'fbsql_field_name' => 'Get the name of the specified field in a result', -'fbsql_field_seek' => 'Set result pointer to a specified field offset', -'fbsql_field_table' => 'Get name of the table the specified field is in', -'fbsql_field_type' => 'Get the type of the specified field in a result', -'fbsql_free_result' => 'Free result memory', -'fbsql_hostname' => 'Get or set the host name used with a connection', -'fbsql_insert_id' => 'Get the id generated from the previous INSERT operation', -'fbsql_list_dbs' => 'List databases available on a FrontBase server', -'fbsql_list_fields' => 'List FrontBase result fields', -'fbsql_list_tables' => 'List tables in a FrontBase database', -'fbsql_next_result' => 'Move the internal result pointer to the next result', -'fbsql_num_fields' => 'Get number of fields in result', -'fbsql_num_rows' => 'Get number of rows in result', -'fbsql_password' => 'Get or set the user password used with a connection', -'fbsql_pconnect' => 'Open a persistent connection to a FrontBase Server', -'fbsql_query' => 'Send a FrontBase query', -'fbsql_read_blob' => 'Read a BLOB from the database', -'fbsql_read_clob' => 'Read a CLOB from the database', -'fbsql_result' => 'Get result data', -'fbsql_rollback' => 'Rollback a transaction to the database', -'fbsql_rows_fetched' => 'Get the number of rows affected by the last statement', -'fbsql_select_db' => 'Select a FrontBase database', -'fbsql_set_characterset' => 'Change input/output character set', -'fbsql_set_lob_mode' => 'Set the LOB retrieve mode for a FrontBase result set', -'fbsql_set_password' => 'Change the password for a given user', -'fbsql_set_transaction' => 'Set the transaction locking and isolation', -'fbsql_start_db' => 'Start a database on local or remote server', -'fbsql_stop_db' => 'Stop a database on local or remote server', -'fbsql_table_name' => 'Get table name of field', -'fbsql_tablename' => 'Alias of fbsql_table_name', -'fbsql_username' => 'Get or set the username for the connection', -'fbsql_warnings' => 'Enable or disable FrontBase warnings', -'fclose' => 'Closes an open file pointer', -'fdf_add_doc_javascript' => 'Adds javascript code to the FDF document', -'fdf_add_template' => 'Adds a template into the FDF document', -'fdf_close' => 'Close an FDF document', -'fdf_create' => 'Create a new FDF document', -'fdf_enum_values' => 'Call a user defined function for each document value', -'fdf_errno' => 'Return error code for last fdf operation', -'fdf_error' => 'Return error description for FDF error code', -'fdf_get_ap' => 'Get the appearance of a field', -'fdf_get_attachment' => 'Extracts uploaded file embedded in the FDF', -'fdf_get_encoding' => 'Get the value of the /Encoding key', -'fdf_get_file' => 'Get the value of the /F key', -'fdf_get_flags' => 'Gets the flags of a field', -'fdf_get_opt' => 'Gets a value from the opt array of a field', -'fdf_get_status' => 'Get the value of the /STATUS key', -'fdf_get_value' => 'Get the value of a field', -'fdf_get_version' => 'Gets version number for FDF API or file', -'fdf_header' => 'Sets FDF-specific output headers', -'fdf_next_field_name' => 'Get the next field name', -'fdf_open' => 'Open a FDF document', -'fdf_open_string' => 'Read a FDF document from a string', -'fdf_remove_item' => 'Sets target frame for form', -'fdf_save' => 'Save a FDF document', -'fdf_save_string' => 'Returns the FDF document as a string', -'fdf_set_ap' => 'Set the appearance of a field', -'fdf_set_encoding' => 'Sets FDF character encoding', -'fdf_set_file' => 'Set PDF document to display FDF data in', -'fdf_set_flags' => 'Sets a flag of a field', -'fdf_set_javascript_action' => 'Sets an javascript action of a field', -'fdf_set_on_import_javascript' => 'Adds javascript code to be executed when Acrobat opens the FDF', -'fdf_set_opt' => 'Sets an option of a field', -'fdf_set_status' => 'Set the value of the /STATUS key', -'fdf_set_submit_form_action' => 'Sets a submit form action of a field', -'fdf_set_target_frame' => 'Set target frame for form display', -'fdf_set_value' => 'Set the value of a field', -'fdf_set_version' => 'Sets version number for a FDF file', -'feof' => 'Tests for end-of-file on a file pointer', -'FFI::addr' => 'Returns C pointer to the given C data structure. The pointer is -not "owned" and won\'t be free. Anyway, this is a potentially -unsafe operation, because the life-time of the returned pointer -may be longer than life-time of the source object, and this may -cause dangling pointer dereference (like in regular C).', -'FFI::alignof' => 'Returns size of C data type of the given FFI\CData or FFI\CType.', -'FFI::arrayType' => 'Constructs a new C array type with elements of $type and -dimensions specified by $dimensions.', -'FFI::cast' => 'Casts given $pointer to another C type, specified by C declaration -string or FFI\CType object. - -This function may be called statically and use only predefined -types, or as a method of previously created FFI object. In last -case the first argument may reuse all type and tag names -defined in FFI::cdef().', -'FFI::cdef' => 'The method creates a binding on the existing C function. - -All variables and functions defined by first arguments are bound -to corresponding native symbols in DSO library and then may be -accessed as FFI object methods and properties. C types of argument, -return value and variables are automatically converted to/from PHP -types (if possible). Otherwise, they are wrapped in a special CData -proxy object and may be accessed by elements.', -'FFI::free' => 'Manually removes previously created "not-owned" data structure.', -'FFI::load' => '<p>Instead of embedding of a long C definition into PHP string, -and creating FFI through FFI::cdef(), it\'s possible to separate -it into a C header file. Note, that C preprocessor directives -(e.g. #define or #ifdef) are not supported. And only a couple of -special macros may be used especially for FFI.</p> - -<code> - #define FFI_LIB "libc.so.6" - - int printf(const char *format, ...); -</code> - -Here, FFI_LIB specifies, that the given library should be loaded. - -<code> - $ffi = FFI::load(__DIR__ . "/printf.h"); - $ffi->printf("Hello world!\n"); -</code>', -'FFI::memcmp' => 'Compares $size bytes from memory area $a and $b.', -'FFI::memcpy' => 'Copies $size bytes from memory area $source to memory area $target. -$source may be any native data structure (FFI\CData) or PHP string.', -'FFI::memset' => 'Fills the $size bytes of the memory area pointed to by $target with -the constant byte $byte.', -'FFI::new' => 'Method that creates an arbitrary C structure.', -'FFI::scope' => 'FFI definition parsing and shared library loading may take -significant time. It\'s not useful to do it on each HTTP request in -WEB environment. However, it\'s possible to pre-load FFI definitions -and libraries at php startup, and instantiate FFI objects when -necessary. Header files may be extended with FFI_SCOPE define -(default pre-loading scope is "C"). This name is going to be -used as FFI::scope() argument. It\'s possible to pre-load few -files into a single scope. - -<code> - #define FFI_LIB "libc.so.6" - #define FFI_SCOPE "libc" - - int printf(const char *format, ...); -</code> - -These files are loaded through the same FFI::load() load function, -executed from file loaded by opcache.preload php.ini directive. - -<code> - ffi.preload=/etc/php/ffi/printf.h -</code> - -Finally, FFI::scope() instantiate an FFI object, that implements -all C definition from the given scope. - -<code> - $ffi = FFI::scope("libc"); - $ffi->printf("Hello world!\n"); -</code>', -'FFI::sizeof' => 'Returns size of C data type of the given FFI\CData or FFI\CType.', -'FFI::string' => 'Creates a PHP string from $size bytes of memory area pointed by -$source. If size is omitted, $source must be zero terminated -array of C chars.', -'FFI::type' => 'This function creates and returns a FFI\CType object, representng -type of the given C type declaration string. - -FFI::type() may be called statically and use only predefined types, -or as a method of previously created FFI object. In last case the -first argument may reuse all type and tag names defined in -FFI::cdef().', -'FFI::typeof' => 'This function returns a FFI\CType object, representing the type of -the given FFI\CData object.', -'fflush' => 'Flushes the output to a file', -'ffmpeg_animated_gif::addFrame' => 'Add a frame to the end of the animated gif.', -'ffmpeg_frame::__construct' => 'NOTE: This function will not be available if GD is not enabled.', -'ffmpeg_frame::crop' => 'Crop the frame.', -'ffmpeg_frame::getHeight' => 'Return the height of the frame.', -'ffmpeg_frame::getPresentationTimestamp' => 'Return the presentation time stamp of the frame.', -'ffmpeg_frame::getPTS' => 'Return the presentation time stamp of the frame.', -'ffmpeg_frame::getWidth' => 'Return the width of the frame.', -'ffmpeg_frame::resize' => 'Resize and optionally crop the frame. (Cropping is built into ffmpeg resizing so I\'m providing it here for completeness.)', -'ffmpeg_frame::toGDImage' => 'Returns a truecolor GD image of the frame. -NOTE: This function will not be available if GD is not enabled.', -'ffmpeg_movie::__construct' => 'Open a video or audio file and return it as an object.', -'ffmpeg_movie::getArtist' => 'Return the author field from the movie or the artist ID3 field from an mp3 file.', -'ffmpeg_movie::getAudioBitRate' => 'Return the audio bit rate of the media file in bits per second.', -'ffmpeg_movie::getAudioChannels' => 'Return the number of audio channels in this movie as an integer.', -'ffmpeg_movie::getAudioCodec' => 'Return the name of the audio codec used to encode this movie as a string.', -'ffmpeg_movie::getAudioSampleRate' => 'Return the audio sample rate of the media file in bits per second.', -'ffmpeg_movie::getAuthor' => 'Return the author field from the movie or the artist ID3 field from an mp3 file.', -'ffmpeg_movie::getBitRate' => 'Return the bit rate of the movie or audio file in bits per second.', -'ffmpeg_movie::getComment' => 'Return the comment field from the movie or audio file.', -'ffmpeg_movie::getCopyright' => 'Return the copyright field from the movie or audio file.', -'ffmpeg_movie::getDuration' => 'Return the duration of a movie or audio file in seconds.', -'ffmpeg_movie::getFilename' => 'Return the path and name of the movie file or audio file.', -'ffmpeg_movie::getFrame' => 'Returns a frame from the movie as an ffmpeg_frame object. Returns false if the frame was not found.', -'ffmpeg_movie::getFrameCount' => 'Return the number of frames in a movie or audio file.', -'ffmpeg_movie::getFrameHeight' => 'Return the height of the movie in pixels.', -'ffmpeg_movie::getFrameNumber' => 'Return the current frame index.', -'ffmpeg_movie::getFrameRate' => 'Return the frame rate of a movie in fps.', -'ffmpeg_movie::getFrameWidth' => 'Return the width of the movie in pixels.', -'ffmpeg_movie::getGenre' => 'Return the genre ID3 field from an mp3 file.', -'ffmpeg_movie::getNextKeyFrame' => 'Returns the next key frame from the movie as an ffmpeg_frame object. Returns false if the frame was not found.', -'ffmpeg_movie::getPixelFormat' => 'Return the pixel format of the movie.', -'ffmpeg_movie::getTitle' => 'Return the title field from the movie or audio file.', -'ffmpeg_movie::getTrackNumber' => 'Return the track ID3 field from an mp3 file.', -'ffmpeg_movie::getVideoBitRate' => 'Return the bit rate of the video in bits per second. -NOTE: This only works for files with constant bit rate.', -'ffmpeg_movie::getVideoCodec' => 'Return the name of the video codec used to encode this movie as a string.', -'ffmpeg_movie::getYear' => 'Return the year ID3 field from an mp3 file.', -'ffmpeg_movie::hasAudio' => 'Return boolean value indicating whether the movie has an audio stream.', -'ffmpeg_movie::hasVideo' => 'Return boolean value indicating whether the movie has a video stream.', -'fgetc' => 'Gets character from file pointer', -'fgetcsv' => 'Gets line from file pointer and parse for CSV fields', -'fgets' => 'Gets line from file pointer', -'fgetss' => 'Gets line from file pointer and strip HTML tags', -'file' => 'Reads entire file into an array', -'file_exists' => 'Checks whether a file or directory exists', -'file_get_contents' => 'Reads entire file into a string', -'file_put_contents' => 'Write data to a file', -'fileatime' => 'Gets last access time of file', -'filectime' => 'Gets inode change time of file', -'filegroup' => 'Gets file group', -'fileinode' => 'Gets file inode', -'filemtime' => 'Gets file modification time', -'fileowner' => 'Gets file owner', -'fileperms' => 'Gets file permissions', -'filepro' => 'Read and verify the map file', -'filepro_fieldcount' => 'Find out how many fields are in a filePro database', -'filepro_fieldname' => 'Gets the name of a field', -'filepro_fieldtype' => 'Gets the type of a field', -'filepro_fieldwidth' => 'Gets the width of a field', -'filepro_retrieve' => 'Retrieves data from a filePro database', -'filepro_rowcount' => 'Find out how many rows are in a filePro database', -'filesize' => 'Gets file size', -'FilesystemIterator::__construct' => 'Constructs a new filesystem iterator', -'FilesystemIterator::__toString' => 'Get file name as a string', -'FilesystemIterator::current' => 'The current file', -'FilesystemIterator::getATime' => 'Get last access time of the current DirectoryIterator item', -'FilesystemIterator::getBasename' => 'Get base name of current DirectoryIterator item', -'FilesystemIterator::getCTime' => 'Get inode change time of the current DirectoryIterator item', -'FilesystemIterator::getExtension' => 'Gets the file extension', -'FilesystemIterator::getFileInfo' => 'Gets an SplFileInfo object for the file', -'FilesystemIterator::getFilename' => 'Return file name of current DirectoryIterator item', -'FilesystemIterator::getFlags' => 'Get the handling flags', -'FilesystemIterator::getGroup' => 'Get group for the current DirectoryIterator item', -'FilesystemIterator::getInode' => 'Get inode for the current DirectoryIterator item', -'FilesystemIterator::getLinkTarget' => 'Gets the target of a link', -'FilesystemIterator::getMTime' => 'Get last modification time of current DirectoryIterator item', -'FilesystemIterator::getOwner' => 'Get owner of current DirectoryIterator item', -'FilesystemIterator::getPath' => 'Get path of current Iterator item without filename', -'FilesystemIterator::getPathInfo' => 'Gets an SplFileInfo object for the path', -'FilesystemIterator::getPathname' => 'Return path and file name of current DirectoryIterator item', -'FilesystemIterator::getPerms' => 'Get the permissions of current DirectoryIterator item', -'FilesystemIterator::getRealPath' => 'Gets absolute path to file', -'FilesystemIterator::getSize' => 'Get size of current DirectoryIterator item', -'FilesystemIterator::getType' => 'Determine the type of the current DirectoryIterator item', -'FilesystemIterator::isDir' => 'Determine if current DirectoryIterator item is a directory', -'FilesystemIterator::isDot' => 'Determine if current DirectoryIterator item is \'.\' or \'..\'', -'FilesystemIterator::isExecutable' => 'Determine if current DirectoryIterator item is executable', -'FilesystemIterator::isFile' => 'Determine if current DirectoryIterator item is a regular file', -'FilesystemIterator::isLink' => 'Determine if current DirectoryIterator item is a symbolic link', -'FilesystemIterator::isReadable' => 'Determine if current DirectoryIterator item can be read', -'FilesystemIterator::isWritable' => 'Determine if current DirectoryIterator item can be written to', -'FilesystemIterator::key' => 'Retrieve the key for the current file', -'FilesystemIterator::next' => 'Move to the next file', -'FilesystemIterator::openFile' => 'Gets an SplFileObject object for the file', -'FilesystemIterator::rewind' => 'Rewinds back to the beginning', -'FilesystemIterator::seek' => 'Seek to a DirectoryIterator item', -'FilesystemIterator::setFileClass' => 'Sets the class used with SplFileInfo::openFile', -'FilesystemIterator::setFlags' => 'Sets handling flags', -'FilesystemIterator::setInfoClass' => 'Sets the class used with SplFileInfo::getFileInfo and SplFileInfo::getPathInfo', -'FilesystemIterator::valid' => 'Check whether current DirectoryIterator position is a valid file', -'filetype' => 'Gets file type', -'filter_has_var' => 'Checks if variable of specified type exists', -'filter_id' => 'Returns the filter ID belonging to a named filter', -'filter_input' => 'Gets a specific external variable by name and optionally filters it', -'filter_input_array' => 'Gets external variables and optionally filters them', -'filter_list' => 'Returns a list of all supported filters', -'filter_var' => 'Filters a variable with a specified filter', -'filter_var_array' => 'Gets multiple variables and optionally filters them', -'filteriterator::__construct' => 'Construct a filterIterator', -'filteriterator::accept' => 'Check whether the current element of the iterator is acceptable', -'filteriterator::current' => 'Get the current element value', -'filteriterator::getInnerIterator' => 'Get the inner iterator', -'filteriterator::key' => 'Get the current key', -'filteriterator::next' => 'Move the iterator forward', -'filteriterator::rewind' => 'Rewind the iterator', -'filteriterator::valid' => 'Check whether the current element is valid', -'finfo::__construct' => 'Alias of finfo_open', -'finfo::buffer' => 'Alias of finfo_buffer()', -'finfo::file' => 'Alias of finfo_file()', -'finfo::set_flags' => 'Alias of finfo_set_flags()', -'finfo_close' => 'Close fileinfo resource', -'floatval' => 'Get float value of a variable', -'flock' => 'Portable advisory file locking', -'floor' => 'Round fractions down', -'flush' => 'Flush system output buffer', -'fmod' => 'Returns the floating point remainder (modulo) of the division of the arguments', -'fnmatch' => 'Match filename against a pattern', -'fopen' => 'Opens file or URL', -'forward_static_call' => 'Call a static method', -'forward_static_call_array' => 'Call a static method and pass the arguments as array', -'fpassthru' => 'Output all remaining data on a file pointer', -'fprintf' => 'Write a formatted string to a stream', -'fputcsv' => 'Format line as CSV and write to file pointer', -'fputs' => 'Alias of fwrite', -'fread' => 'Binary-safe file read', -'frenchtojd' => 'Converts a date from the French Republican Calendar to a Julian Day Count', -'fribidi_log2vis' => 'Convert a logical string to a visual one', -'fscanf' => 'Parses input from a file according to a format', -'fseek' => 'Seeks on a file pointer', -'fsockopen' => 'Open Internet or Unix domain socket connection', -'fstat' => 'Gets information about a file using an open file pointer', -'ftell' => 'Returns the current position of the file read/write pointer', -'ftok' => 'Convert a pathname and a project identifier to a System V IPC key', -'ftp_alloc' => 'Allocates space for a file to be uploaded', -'ftp_append' => 'Append content of a file a another file on the FTP server', -'ftp_cdup' => 'Changes to the parent directory', -'ftp_chdir' => 'Changes the current directory on a FTP server', -'ftp_chmod' => 'Set permissions on a file via FTP', -'ftp_close' => 'Closes an FTP connection', -'ftp_connect' => 'Opens an FTP connection', -'ftp_delete' => 'Deletes a file on the FTP server', -'ftp_exec' => 'Requests execution of a command on the FTP server', -'ftp_fget' => 'Downloads a file from the FTP server and saves to an open file', -'ftp_fput' => 'Uploads from an open file to the FTP server', -'ftp_get' => 'Downloads a file from the FTP server', -'ftp_get_option' => 'Retrieves various runtime behaviours of the current FTP stream', -'ftp_login' => 'Logs in to an FTP connection', -'ftp_mdtm' => 'Returns the last modified time of the given file', -'ftp_mkdir' => 'Creates a directory', -'ftp_mlsd' => 'Returns a list of files in the given directory', -'ftp_nb_continue' => 'Continues retrieving/sending a file (non-blocking)', -'ftp_nb_fget' => 'Retrieves a file from the FTP server and writes it to an open file (non-blocking)', -'ftp_nb_fput' => 'Stores a file from an open file to the FTP server (non-blocking)', -'ftp_nb_get' => 'Retrieves a file from the FTP server and writes it to a local file (non-blocking)', -'ftp_nb_put' => 'Stores a file on the FTP server (non-blocking)', -'ftp_nlist' => 'Returns a list of files in the given directory', -'ftp_pasv' => 'Turns passive mode on or off', -'ftp_put' => 'Uploads a file to the FTP server', -'ftp_pwd' => 'Returns the current directory name', -'ftp_quit' => 'Alias of ftp_close', -'ftp_raw' => 'Sends an arbitrary command to an FTP server', -'ftp_rawlist' => 'Returns a detailed list of files in the given directory', -'ftp_rename' => 'Renames a file or a directory on the FTP server', -'ftp_rmdir' => 'Removes a directory', -'ftp_set_option' => 'Set miscellaneous runtime FTP options', -'ftp_site' => 'Sends a SITE command to the server', -'ftp_size' => 'Returns the size of the given file', -'ftp_ssl_connect' => 'Opens a Secure SSL-FTP connection', -'ftp_systype' => 'Returns the system type identifier of the remote FTP server', -'ftruncate' => 'Truncates a file to a given length', -'func_get_arg' => 'Return an item from the argument list', -'func_get_args' => 'Returns an array comprising a function\'s argument list', -'func_num_args' => 'Returns the number of arguments passed to the function', -'function_exists' => 'Return `true` if the given function has been defined', -'fwrite' => 'Binary-safe file write', -'gc_collect_cycles' => 'Forces collection of any existing garbage cycles', -'gc_disable' => 'Deactivates the circular reference collector', -'gc_enable' => 'Activates the circular reference collector', -'gc_enabled' => 'Returns status of the circular reference collector', -'gc_mem_caches' => 'Reclaims memory used by the Zend Engine memory manager', -'gc_status' => 'Gets information about the garbage collector', -'gd_info' => 'Retrieve information about the currently installed GD library', -'gearmanclient::__construct' => 'Create a GearmanClient instance', -'gearmanclient::addOptions' => 'Add client options', -'gearmanclient::addServer' => 'Add a job server to the client', -'gearmanclient::addServers' => 'Add a list of job servers to the client', -'gearmanclient::addTask' => 'Add a task to be run in parallel', -'gearmanclient::addTaskBackground' => 'Add a background task to be run in parallel', -'gearmanclient::addTaskHigh' => 'Add a high priority task to run in parallel', -'gearmanclient::addTaskHighBackground' => 'Add a high priority background task to be run in parallel', -'gearmanclient::addTaskLow' => 'Add a low priority task to run in parallel', -'gearmanclient::addTaskLowBackground' => 'Add a low priority background task to be run in parallel', -'gearmanclient::addTaskStatus' => 'Add a task to get status', -'gearmanclient::clearCallbacks' => 'Clear all task callback functions', -'gearmanclient::clone' => 'Create a copy of a GearmanClient object', -'gearmanclient::context' => 'Get the application context', -'gearmanclient::data' => 'Get the application data (deprecated)', -'gearmanclient::do' => 'Run a single task and return a result [deprecated]', -'gearmanclient::doBackground' => 'Run a task in the background', -'gearmanclient::doHigh' => 'Run a single high priority task', -'gearmanclient::doHighBackground' => 'Run a high priority task in the background', -'gearmanclient::doJobHandle' => 'Get the job handle for the running task', -'gearmanclient::doLow' => 'Run a single low priority task', -'gearmanclient::doLowBackground' => 'Run a low priority task in the background', -'gearmanclient::doNormal' => 'Run a single task and return a result', -'gearmanclient::doStatus' => 'Get the status for the running task', -'gearmanclient::echo' => 'Send data to all job servers to see if they echo it back [deprecated]', -'gearmanclient::error' => 'Returns an error string for the last error encountered', -'gearmanclient::getErrno' => 'Get an errno value', -'gearmanclient::jobStatus' => 'Get the status of a background job', -'gearmanclient::ping' => 'Send data to all job servers to see if they echo it back', -'gearmanclient::removeOptions' => 'Remove client options', -'gearmanclient::returnCode' => 'Get the last Gearman return code', -'gearmanclient::runTasks' => 'Run a list of tasks in parallel', -'gearmanclient::setClientCallback' => 'Callback function when there is a data packet for a task (deprecated)', -'gearmanclient::setCompleteCallback' => 'Set a function to be called on task completion', -'gearmanclient::setContext' => 'Set application context', -'gearmanclient::setCreatedCallback' => 'Set a callback for when a task is queued', -'gearmanclient::setData' => 'Set application data (deprecated)', -'gearmanclient::setDataCallback' => 'Callback function when there is a data packet for a task', -'gearmanclient::setExceptionCallback' => 'Set a callback for worker exceptions', -'gearmanclient::setFailCallback' => 'Set callback for job failure', -'gearmanclient::setOptions' => 'Set client options', -'gearmanclient::setStatusCallback' => 'Set a callback for collecting task status', -'gearmanclient::setTimeout' => 'Set socket I/O activity timeout', -'gearmanclient::setWarningCallback' => 'Set a callback for worker warnings', -'gearmanclient::setWorkloadCallback' => 'Set a callback for accepting incremental data updates', -'gearmanclient::timeout' => 'Get current socket I/O activity timeout value', -'gearmanjob::__construct' => 'Create a GearmanJob instance', -'gearmanjob::complete' => 'Send the result and complete status (deprecated)', -'gearmanjob::data' => 'Send data for a running job (deprecated)', -'gearmanjob::exception' => 'Send exception for running job (deprecated)', -'gearmanjob::fail' => 'Send fail status (deprecated)', -'gearmanjob::functionName' => 'Get function name', -'gearmanjob::handle' => 'Get the job handle', -'gearmanjob::returnCode' => 'Get last return code', -'gearmanjob::sendComplete' => 'Send the result and complete status', -'gearmanjob::sendData' => 'Send data for a running job', -'gearmanjob::sendException' => 'Send exception for running job (exception)', -'gearmanjob::sendFail' => 'Send fail status', -'gearmanjob::sendStatus' => 'Send status', -'gearmanjob::sendWarning' => 'Send a warning', -'gearmanjob::setReturn' => 'Set a return value', -'gearmanjob::status' => 'Send status (deprecated)', -'gearmanjob::unique' => 'Get the unique identifier', -'gearmanjob::warning' => 'Send a warning (deprecated)', -'gearmanjob::workload' => 'Get workload', -'gearmanjob::workloadSize' => 'Get size of work load', -'gearmantask::__construct' => 'Create a GearmanTask instance', -'gearmantask::create' => 'Create a task (deprecated)', -'gearmantask::data' => 'Get data returned for a task', -'gearmantask::dataSize' => 'Get the size of returned data', -'gearmantask::function' => 'Get associated function name (deprecated)', -'gearmantask::functionName' => 'Get associated function name', -'gearmantask::isKnown' => 'Determine if task is known', -'gearmantask::isRunning' => 'Test whether the task is currently running', -'gearmantask::jobHandle' => 'Get the job handle', -'gearmantask::recvData' => 'Read work or result data into a buffer for a task', -'gearmantask::returnCode' => 'Get the last return code', -'gearmantask::sendData' => 'Send data for a task (deprecated)', -'gearmantask::sendWorkload' => 'Send data for a task', -'gearmantask::taskDenominator' => 'Get completion percentage denominator', -'gearmantask::taskNumerator' => 'Get completion percentage numerator', -'gearmantask::unique' => 'Get the unique identifier for a task', -'gearmantask::uuid' => 'Get the unique identifier for a task (deprecated)', -'gearmanworker::__construct' => 'Create a GearmanWorker instance', -'gearmanworker::addFunction' => 'Register and add callback function', -'gearmanworker::addOptions' => 'Add worker options', -'gearmanworker::addServer' => 'Add a job server', -'gearmanworker::addServers' => 'Add job servers', -'gearmanworker::clone' => 'Create a copy of the worker', -'gearmanworker::echo' => 'Test job server response', -'gearmanworker::error' => 'Get the last error encountered', -'gearmanworker::getErrno' => 'Get errno', -'gearmanworker::options' => 'Get worker options', -'gearmanworker::register' => 'Register a function with the job server', -'gearmanworker::removeOptions' => 'Remove worker options', -'gearmanworker::returnCode' => 'Get last Gearman return code', -'gearmanworker::setId' => 'Give the worker an identifier so it can be tracked when asking gearmand for the list of available workers', -'gearmanworker::setOptions' => 'Set worker options', -'gearmanworker::setTimeout' => 'Set socket I/O activity timeout', -'gearmanworker::timeout' => 'Get socket I/O activity timeout', -'gearmanworker::unregister' => 'Unregister a function name with the job servers', -'gearmanworker::unregisterAll' => 'Unregister all function names with the job servers', -'gearmanworker::wait' => 'Wait for activity from one of the job servers', -'gearmanworker::work' => 'Wait for and perform jobs', -'gender\gender::__construct' => 'Construct the Gender object', -'gender\gender::connect' => 'Connect to an external name dictionary', -'gender\gender::country' => 'Get textual country representation', -'gender\gender::get' => 'Get gender of a name', -'gender\gender::isNick' => 'Check if the name0 is an alias of the name1', -'gender\gender::similarNames' => 'Get similar names', -'Generator::__wakeup' => 'Serialize callback -Throws an exception as generators can\'t be serialized.', -'Generator::current' => 'Returns whatever was passed to yield or null if nothing was passed or the generator is already closed.', -'Generator::getReturn' => 'Returns whatever was passed to return or null if nothing. -Throws an exception if the generator is still valid.', -'Generator::key' => 'Returns the yielded key or, if none was specified, an auto-incrementing key or null if the generator is already closed.', -'Generator::next' => 'Resumes the generator (unless the generator is already closed).', -'Generator::rewind' => 'Throws an exception if the generator is currently after the first yield.', -'Generator::send' => 'Sets the return value of the yield expression and resumes the generator (unless the generator is already closed).', -'Generator::valid' => 'Returns false if the generator has been closed, true otherwise.', -'geoip_asnum_by_name' => 'Get the Autonomous System Numbers (ASN)', -'geoip_continent_code_by_name' => 'Get the two letter continent code', -'geoip_country_code3_by_name' => 'Get the three letter country code', -'geoip_country_code_by_name' => 'Get the two letter country code', -'geoip_country_name_by_name' => 'Get the full country name', -'geoip_database_info' => 'Get GeoIP Database information', -'geoip_db_avail' => 'Determine if GeoIP Database is available', -'geoip_db_filename' => 'Returns the filename of the corresponding GeoIP Database', -'geoip_db_get_all_info' => 'Returns detailed information about all GeoIP database types', -'geoip_domain_by_name' => 'Get the second level domain name', -'geoip_id_by_name' => 'Get the Internet connection type', -'geoip_isp_by_name' => 'Get the Internet Service Provider (ISP) name', -'geoip_netspeedcell_by_name' => 'Get the Internet connection speed', -'geoip_org_by_name' => 'Get the organization name', -'geoip_record_by_name' => 'Returns the detailed City information found in the GeoIP Database', -'geoip_region_by_name' => 'Get the country code and region', -'geoip_region_name_by_code' => 'Returns the region name for some country and region code combo', -'geoip_setup_custom_directory' => 'Set a custom directory for the GeoIP database', -'geoip_time_zone_by_country_and_region' => 'Returns the time zone for some country and region code combo', -'get_browser' => 'Tells what the user\'s browser is capable of', -'get_called_class' => 'The "Late Static Binding" class name', -'get_cfg_var' => 'Gets the value of a PHP configuration option', -'get_class' => 'Returns the name of the class of an object', -'get_class_methods' => 'Gets the class methods\' names', -'get_class_vars' => 'Get the default properties of the class', -'get_current_user' => 'Gets the name of the owner of the current PHP script', -'get_declared_classes' => 'Returns an array with the name of the defined classes', -'get_declared_interfaces' => 'Returns an array of all declared interfaces', -'get_declared_traits' => 'Returns an array of all declared traits', -'get_defined_constants' => 'Returns an associative array with the names of all the constants and their values', -'get_defined_functions' => 'Returns an array of all defined functions', -'get_defined_vars' => 'Returns an array of all defined variables', -'get_extension_funcs' => 'Returns an array with the names of the functions of a module', -'get_headers' => 'Fetches all the headers sent by the server in response to an HTTP request', -'get_html_translation_table' => 'Returns the translation table used by htmlspecialchars and htmlentities', -'get_include_path' => 'Gets the current include_path configuration option', -'get_included_files' => 'Returns an array with the names of included or required files', -'get_loaded_extensions' => 'Returns an array with the names of all modules compiled and loaded', -'get_magic_quotes_gpc' => 'Gets the current configuration setting of magic_quotes_gpc', -'get_magic_quotes_runtime' => 'Gets the current active configuration setting of magic_quotes_runtime', -'get_meta_tags' => 'Extracts all meta tag content attributes from a file and returns an array', -'get_object_vars' => 'Gets the properties of the given object', -'get_parent_class' => 'Retrieves the parent class name for object or class', -'get_required_files' => 'Alias of get_included_files', -'get_resource_type' => 'Returns the resource type', -'get_resources' => 'Returns active resources', -'getallheaders' => 'Fetch all HTTP request headers', -'getcwd' => 'Gets the current working directory', -'getdate' => 'Get date/time information', -'getenv' => 'Gets the value of an environment variable', -'gethostbyaddr' => 'Get the Internet host name corresponding to a given IP address', -'gethostbyname' => 'Get the IPv4 address corresponding to a given Internet host name', -'gethostbynamel' => 'Get a list of IPv4 addresses corresponding to a given Internet host name', -'gethostname' => 'Gets the host name', -'getimagesize' => 'Get the size of an image', -'getimagesizefromstring' => 'Get the size of an image from a string', -'getlastmod' => 'Gets time of last page modification', -'getmxrr' => 'Get MX records corresponding to a given Internet host name', -'getmygid' => 'Get PHP script owner\'s GID', -'getmyinode' => 'Gets the inode of the current script', -'getmypid' => 'Gets PHP\'s process ID', -'getmyuid' => 'Gets PHP script owner\'s UID', -'getopt' => 'Gets options from the command line argument list', -'getprotobyname' => 'Get protocol number associated with protocol name', -'getprotobynumber' => 'Get protocol name associated with protocol number', -'getrandmax' => 'Show largest possible random value', -'getrusage' => 'Gets the current resource usages', -'getservbyname' => 'Get port number associated with an Internet service and protocol', -'getservbyport' => 'Get Internet service which corresponds to port and protocol', -'getsession' => 'Connect to a MySQL server', -'gettext' => 'Lookup a message in the current domain', -'gettimeofday' => 'Get current time', -'gettype' => 'Get the type of a variable', -'glob' => 'Find pathnames matching a pattern', -'globiterator::__construct' => 'Construct a directory using glob', -'GlobIterator::__toString' => 'Get file name as a string', -'globiterator::count' => 'Get the number of directories and files', -'GlobIterator::current' => 'The current file', -'GlobIterator::getATime' => 'Get last access time of the current DirectoryIterator item', -'GlobIterator::getBasename' => 'Get base name of current DirectoryIterator item', -'GlobIterator::getCTime' => 'Get inode change time of the current DirectoryIterator item', -'GlobIterator::getExtension' => 'Gets the file extension', -'GlobIterator::getFilename' => 'Return file name of current DirectoryIterator item', -'GlobIterator::getFlags' => 'Get the handling flags', -'GlobIterator::getGroup' => 'Get group for the current DirectoryIterator item', -'GlobIterator::getInode' => 'Get inode for the current DirectoryIterator item', -'GlobIterator::getMTime' => 'Get last modification time of current DirectoryIterator item', -'GlobIterator::getOwner' => 'Get owner of current DirectoryIterator item', -'GlobIterator::getPath' => 'Get path of current Iterator item without filename', -'GlobIterator::getPathname' => 'Return path and file name of current DirectoryIterator item', -'GlobIterator::getPerms' => 'Get the permissions of current DirectoryIterator item', -'GlobIterator::getSize' => 'Get size of current DirectoryIterator item', -'GlobIterator::getType' => 'Determine the type of the current DirectoryIterator item', -'GlobIterator::isDir' => 'Determine if current DirectoryIterator item is a directory', -'GlobIterator::isDot' => 'Determine if current DirectoryIterator item is \'.\' or \'..\'', -'GlobIterator::isExecutable' => 'Determine if current DirectoryIterator item is executable', -'GlobIterator::isFile' => 'Determine if current DirectoryIterator item is a regular file', -'GlobIterator::isLink' => 'Determine if current DirectoryIterator item is a symbolic link', -'GlobIterator::isReadable' => 'Determine if current DirectoryIterator item can be read', -'GlobIterator::isWritable' => 'Determine if current DirectoryIterator item can be written to', -'GlobIterator::key' => 'Retrieve the key for the current file', -'GlobIterator::next' => 'Move to the next file', -'GlobIterator::rewind' => 'Rewinds back to the beginning', -'GlobIterator::seek' => 'Seek to a DirectoryIterator item', -'GlobIterator::setFlags' => 'Sets handling flags', -'GlobIterator::valid' => 'Check whether current DirectoryIterator position is a valid file', -'gmagick::__construct' => 'The Gmagick constructor', -'gmagick::addimage' => 'Adds new image to Gmagick object image list', -'gmagick::addnoiseimage' => 'Adds random noise to the image', -'gmagick::annotateimage' => 'Annotates an image with text', -'gmagick::blurimage' => 'Adds blur filter to image', -'gmagick::borderimage' => 'Surrounds the image with a border', -'gmagick::charcoalimage' => 'Simulates a charcoal drawing', -'gmagick::chopimage' => 'Removes a region of an image and trims', -'gmagick::clear' => 'Clears all resources associated to Gmagick object', -'gmagick::commentimage' => 'Adds a comment to your image', -'gmagick::compositeimage' => 'Composite one image onto another', -'gmagick::cropimage' => 'Extracts a region of the image', -'gmagick::cropthumbnailimage' => 'Creates a crop thumbnail', -'gmagick::current' => 'The current purpose', -'gmagick::cyclecolormapimage' => 'Displaces an image\'s colormap', -'gmagick::deconstructimages' => 'Returns certain pixel differences between images', -'gmagick::despeckleimage' => 'The despeckleimage purpose', -'gmagick::destroy' => 'The destroy purpose', -'gmagick::drawimage' => 'Renders the GmagickDraw object on the current image', -'gmagick::edgeimage' => 'Enhance edges within the image', -'gmagick::embossimage' => 'Returns a grayscale image with a three-dimensional effect', -'gmagick::enhanceimage' => 'Improves the quality of a noisy image', -'gmagick::equalizeimage' => 'Equalizes the image histogram', -'gmagick::flipimage' => 'Creates a vertical mirror image', -'gmagick::flopimage' => 'The flopimage purpose', -'gmagick::frameimage' => 'Adds a simulated three-dimensional border', -'gmagick::gammaimage' => 'Gamma-corrects an image', -'gmagick::getcopyright' => 'Returns the GraphicsMagick API copyright as a string', -'gmagick::getfilename' => 'The filename associated with an image sequence', -'gmagick::getimagebackgroundcolor' => 'Returns the image background color', -'gmagick::getimageblueprimary' => 'Returns the chromaticy blue primary point', -'gmagick::getimagebordercolor' => 'Returns the image border color', -'gmagick::getimagechanneldepth' => 'Gets the depth for a particular image channel', -'gmagick::getimagecolors' => 'Returns the color of the specified colormap index', -'gmagick::getimagecolorspace' => 'Gets the image colorspace', -'gmagick::getimagecompose' => 'Returns the composite operator associated with the image', -'gmagick::getimagedelay' => 'Gets the image delay', -'gmagick::getimagedepth' => 'Gets the depth of the image', -'gmagick::getimagedispose' => 'Gets the image disposal method', -'gmagick::getimageextrema' => 'Gets the extrema for the image', -'gmagick::getimagefilename' => 'Returns the filename of a particular image in a sequence', -'gmagick::getimageformat' => 'Returns the format of a particular image in a sequence', -'gmagick::getimagegamma' => 'Gets the image gamma', -'gmagick::getimagegreenprimary' => 'Returns the chromaticy green primary point', -'gmagick::getimageheight' => 'Returns the image height', -'gmagick::getimagehistogram' => 'Gets the image histogram', -'gmagick::getimageindex' => 'Gets the index of the current active image', -'gmagick::getimageinterlacescheme' => 'Gets the image interlace scheme', -'gmagick::getimageiterations' => 'Gets the image iterations', -'gmagick::getimagematte' => 'Check if the image has a matte channel', -'gmagick::getimagemattecolor' => 'Returns the image matte color', -'gmagick::getimageprofile' => 'Returns the named image profile', -'gmagick::getimageredprimary' => 'Returns the chromaticity red primary point', -'gmagick::getimagerenderingintent' => 'Gets the image rendering intent', -'gmagick::getimageresolution' => 'Gets the image X and Y resolution', -'gmagick::getimagescene' => 'Gets the image scene', -'gmagick::getimagesignature' => 'Generates an SHA-256 message digest', -'gmagick::getimagetype' => 'Gets the potential image type', -'gmagick::getimageunits' => 'Gets the image units of resolution', -'gmagick::getimagewhitepoint' => 'Returns the chromaticity white point', -'gmagick::getimagewidth' => 'Returns the width of the image', -'gmagick::getpackagename' => 'Returns the GraphicsMagick package name', -'gmagick::getquantumdepth' => 'Returns the Gmagick quantum depth as a string', -'gmagick::getreleasedate' => 'Returns the GraphicsMagick release date as a string', -'gmagick::getsamplingfactors' => 'Gets the horizontal and vertical sampling factor', -'gmagick::getsize' => 'Returns the size associated with the Gmagick object', -'gmagick::getversion' => 'Returns the GraphicsMagick API version', -'gmagick::hasnextimage' => 'Checks if the object has more images', -'gmagick::haspreviousimage' => 'Checks if the object has a previous image', -'gmagick::implodeimage' => 'Creates a new image as a copy', -'gmagick::labelimage' => 'Adds a label to an image', -'gmagick::levelimage' => 'Adjusts the levels of an image', -'gmagick::magnifyimage' => 'Scales an image proportionally 2x', -'gmagick::mapimage' => 'Replaces the colors of an image with the closest color from a reference image', -'gmagick::medianfilterimage' => 'Applies a digital filter', -'gmagick::minifyimage' => 'Scales an image proportionally to half its size', -'gmagick::modulateimage' => 'Control the brightness, saturation, and hue', -'gmagick::motionblurimage' => 'Simulates motion blur', -'gmagick::newimage' => 'Creates a new image', -'gmagick::nextimage' => 'Moves to the next image', -'gmagick::normalizeimage' => 'Enhances the contrast of a color image', -'gmagick::oilpaintimage' => 'Simulates an oil painting', -'gmagick::previousimage' => 'Move to the previous image in the object', -'gmagick::profileimage' => 'Adds or removes a profile from an image', -'gmagick::quantizeimage' => 'Analyzes the colors within a reference image', -'gmagick::quantizeimages' => 'The quantizeimages purpose', -'gmagick::queryfontmetrics' => 'Returns an array representing the font metrics', -'gmagick::queryfonts' => 'Returns the configured fonts', -'gmagick::queryformats' => 'Returns formats supported by Gmagick', -'gmagick::radialblurimage' => 'Radial blurs an image', -'gmagick::raiseimage' => 'Creates a simulated 3d button-like effect', -'gmagick::read' => 'Reads image from filename', -'gmagick::readimage' => 'Reads image from filename', -'gmagick::readimageblob' => 'Reads image from a binary string', -'gmagick::readimagefile' => 'The readimagefile purpose', -'gmagick::reducenoiseimage' => 'Smooths the contours of an image', -'gmagick::removeimage' => 'Removes an image from the image list', -'gmagick::removeimageprofile' => 'Removes the named image profile and returns it', -'gmagick::resampleimage' => 'Resample image to desired resolution', -'gmagick::resizeimage' => 'Scales an image', -'gmagick::rollimage' => 'Offsets an image', -'gmagick::rotateimage' => 'Rotates an image', -'gmagick::scaleimage' => 'Scales the size of an image', -'gmagick::separateimagechannel' => 'Separates a channel from the image', -'gmagick::setCompressionQuality' => 'Sets the object\'s default compression quality', -'gmagick::setfilename' => 'Sets the filename before you read or write the image', -'gmagick::setimagebackgroundcolor' => 'Sets the image background color', -'gmagick::setimageblueprimary' => 'Sets the image chromaticity blue primary point', -'gmagick::setimagebordercolor' => 'Sets the image border color', -'gmagick::setimagechanneldepth' => 'Sets the depth of a particular image channel', -'gmagick::setimagecolorspace' => 'Sets the image colorspace', -'gmagick::setimagecompose' => 'Sets the image composite operator', -'gmagick::setimagedelay' => 'Sets the image delay', -'gmagick::setimagedepth' => 'Sets the image depth', -'gmagick::setimagedispose' => 'Sets the image disposal method', -'gmagick::setimagefilename' => 'Sets the filename of a particular image in a sequence', -'gmagick::setimageformat' => 'Sets the format of a particular image', -'gmagick::setimagegamma' => 'Sets the image gamma', -'gmagick::setimagegreenprimary' => 'Sets the image chromaticity green primary point', -'gmagick::setimageindex' => 'Set the iterator to the position in the image list specified with the index parameter', -'gmagick::setimageinterlacescheme' => 'Sets the interlace scheme of the image', -'gmagick::setimageiterations' => 'Sets the image iterations', -'gmagick::setimageprofile' => 'Adds a named profile to the Gmagick object', -'gmagick::setimageredprimary' => 'Sets the image chromaticity red primary point', -'gmagick::setimagerenderingintent' => 'Sets the image rendering intent', -'gmagick::setimageresolution' => 'Sets the image resolution', -'gmagick::setimagescene' => 'Sets the image scene', -'gmagick::setimagetype' => 'Sets the image type', -'gmagick::setimageunits' => 'Sets the image units of resolution', -'gmagick::setimagewhitepoint' => 'Sets the image chromaticity white point', -'gmagick::setsamplingfactors' => 'Sets the image sampling factors', -'gmagick::setsize' => 'Sets the size of the Gmagick object', -'gmagick::shearimage' => 'Creating a parallelogram', -'gmagick::solarizeimage' => 'Applies a solarizing effect to the image', -'gmagick::spreadimage' => 'Randomly displaces each pixel in a block', -'gmagick::stripimage' => 'Strips an image of all profiles and comments', -'gmagick::swirlimage' => 'Swirls the pixels about the center of the image', -'gmagick::thumbnailimage' => 'Changes the size of an image', -'gmagick::trimimage' => 'Remove edges from the image', -'gmagick::write' => 'Alias of Gmagick::writeimage', -'gmagick::writeimage' => 'Writes an image to the specified filename', -'gmagickdraw::annotate' => 'Draws text on the image', -'gmagickdraw::arc' => 'Draws an arc', -'gmagickdraw::bezier' => 'Draws a bezier curve', -'gmagickdraw::ellipse' => 'Draws an ellipse on the image', -'gmagickdraw::getfillcolor' => 'Returns the fill color', -'gmagickdraw::getfillopacity' => 'Returns the opacity used when drawing', -'gmagickdraw::getfont' => 'Returns the font', -'gmagickdraw::getfontsize' => 'Returns the font pointsize', -'gmagickdraw::getfontstyle' => 'Returns the font style', -'gmagickdraw::getfontweight' => 'Returns the font weight', -'gmagickdraw::getstrokecolor' => 'Returns the color used for stroking object outlines', -'gmagickdraw::getstrokeopacity' => 'Returns the opacity of stroked object outlines', -'gmagickdraw::getstrokewidth' => 'Returns the width of the stroke used to draw object outlines', -'gmagickdraw::gettextdecoration' => 'Returns the text decoration', -'gmagickdraw::gettextencoding' => 'Returns the code set used for text annotations', -'gmagickdraw::line' => 'The line purpose', -'gmagickdraw::point' => 'Draws a point', -'gmagickdraw::polygon' => 'Draws a polygon', -'gmagickdraw::polyline' => 'Draws a polyline', -'gmagickdraw::rectangle' => 'Draws a rectangle', -'gmagickdraw::rotate' => 'Applies the specified rotation to the current coordinate space', -'gmagickdraw::roundrectangle' => 'Draws a rounded rectangle', -'gmagickdraw::scale' => 'Adjusts the scaling factor', -'gmagickdraw::setfillcolor' => 'Sets the fill color to be used for drawing filled objects', -'gmagickdraw::setfillopacity' => 'The setfillopacity purpose', -'gmagickdraw::setfont' => 'Sets the fully-specified font to use when annotating with text', -'gmagickdraw::setfontsize' => 'Sets the font pointsize to use when annotating with text', -'gmagickdraw::setfontstyle' => 'Sets the font style to use when annotating with text', -'gmagickdraw::setfontweight' => 'Sets the font weight', -'gmagickdraw::setstrokecolor' => 'Sets the color used for stroking object outlines', -'gmagickdraw::setstrokeopacity' => 'Specifies the opacity of stroked object outlines', -'gmagickdraw::setstrokewidth' => 'Sets the width of the stroke used to draw object outlines', -'gmagickdraw::settextdecoration' => 'Specifies a decoration', -'gmagickdraw::settextencoding' => 'Specifies the text code set', -'gmagickpixel::__construct' => 'The GmagickPixel constructor', -'gmagickpixel::getcolor' => 'Returns the color', -'gmagickpixel::getcolorcount' => 'Returns the color count associated with this color', -'gmagickpixel::getcolorvalue' => 'Gets the normalized value of the provided color channel', -'gmagickpixel::setcolor' => 'Sets the color', -'gmagickpixel::setcolorvalue' => 'Sets the normalized value of one of the channels', -'gmdate' => 'Format a GMT/UTC date/time', -'gmmktime' => 'Get Unix timestamp for a GMT date', -'GMP::serialize' => 'String representation of object', -'GMP::unserialize' => 'Constructs the object', -'gmp_abs' => 'Absolute value', -'gmp_add' => 'Add numbers', -'gmp_and' => 'Bitwise AND', -'gmp_binomial' => 'Calculates binomial coefficient', -'gmp_clrbit' => 'Clear bit', -'gmp_cmp' => 'Compare numbers', -'gmp_com' => 'Calculates one\'s complement', -'gmp_div' => 'Alias of gmp_div_q', -'gmp_div_q' => 'Divide numbers', -'gmp_div_qr' => 'Divide numbers and get quotient and remainder', -'gmp_div_r' => 'Remainder of the division of numbers', -'gmp_divexact' => 'Exact division of numbers', -'gmp_export' => 'Export to a binary string', -'gmp_fact' => 'Factorial', -'gmp_gcd' => 'Calculate GCD', -'gmp_gcdext' => 'Calculate GCD and multipliers', -'gmp_hamdist' => 'Hamming distance', -'gmp_import' => 'Import from a binary string', -'gmp_init' => 'Create GMP number', -'gmp_intval' => 'Convert GMP number to integer', -'gmp_invert' => 'Inverse by modulo', -'gmp_jacobi' => 'Jacobi symbol', -'gmp_kronecker' => 'Kronecker symbol', -'gmp_lcm' => 'Calculate GCD', -'gmp_legendre' => 'Legendre symbol', -'gmp_mod' => 'Modulo operation', -'gmp_mul' => 'Multiply numbers', -'gmp_neg' => 'Negate number', -'gmp_nextprime' => 'Find next prime number', -'gmp_or' => 'Bitwise OR', -'gmp_perfect_power' => 'Perfect power check', -'gmp_perfect_square' => 'Perfect square check', -'gmp_popcount' => 'Population count', -'gmp_pow' => 'Raise number into power', -'gmp_powm' => 'Raise number into power with modulo', -'gmp_prob_prime' => 'Check if number is "probably prime"', -'gmp_random' => 'Random number', -'gmp_random_bits' => 'Random number', -'gmp_random_range' => 'Random number', -'gmp_random_seed' => 'Sets the RNG seed', -'gmp_root' => 'Take the integer part of nth root', -'gmp_rootrem' => 'Take the integer part and remainder of nth root', -'gmp_scan0' => 'Scan for 0', -'gmp_scan1' => 'Scan for 1', -'gmp_setbit' => 'Set bit', -'gmp_sign' => 'Sign of number', -'gmp_sqrt' => 'Calculate square root', -'gmp_sqrtrem' => 'Square root with remainder', -'gmp_strval' => 'Convert GMP number to string', -'gmp_sub' => 'Subtract numbers', -'gmp_testbit' => 'Tests if a bit is set', -'gmp_xor' => 'Bitwise XOR', -'gmstrftime' => 'Format a GMT/UTC time/date according to locale settings', -'gnupg::adddecryptkey' => 'Add a key for decryption', -'gnupg::addencryptkey' => 'Add a key for encryption', -'gnupg::addsignkey' => 'Add a key for signing', -'gnupg::cleardecryptkeys' => 'Removes all keys which were set for decryption before', -'gnupg::clearencryptkeys' => 'Removes all keys which were set for encryption before', -'gnupg::clearsignkeys' => 'Removes all keys which were set for signing before', -'gnupg::decrypt' => 'Decrypts a given text', -'gnupg::decryptverify' => 'Decrypts and verifies a given text', -'gnupg::encrypt' => 'Encrypts a given text', -'gnupg::encryptsign' => 'Encrypts and signs a given text', -'gnupg::export' => 'Exports a key', -'gnupg::geterror' => 'Returns the errortext, if a function fails', -'gnupg::getprotocol' => 'Returns the currently active protocol for all operations', -'gnupg::import' => 'Imports a key', -'gnupg::init' => 'Initialize a connection', -'gnupg::keyinfo' => 'Returns an array with information about all keys that matches the given pattern', -'gnupg::setarmor' => 'Toggle armored output', -'gnupg::seterrormode' => 'Sets the mode for error_reporting', -'gnupg::setsignmode' => 'Sets the mode for signing', -'gnupg::sign' => 'Signs a given text', -'gnupg::verify' => 'Verifies a signed text', -'gnupg_adddecryptkey' => 'Add a key for decryption', -'gnupg_addencryptkey' => 'Add a key for encryption', -'gnupg_addsignkey' => 'Add a key for signing', -'gnupg_cleardecryptkeys' => 'Removes all keys which were set for decryption before', -'gnupg_clearencryptkeys' => 'Removes all keys which were set for encryption before', -'gnupg_clearsignkeys' => 'Removes all keys which were set for signing before', -'gnupg_decrypt' => 'Decrypts a given text', -'gnupg_decryptverify' => 'Decrypts and verifies a given text', -'gnupg_encrypt' => 'Encrypts a given text', -'gnupg_encryptsign' => 'Encrypts and signs a given text', -'gnupg_export' => 'Exports a key', -'gnupg_geterror' => 'Returns the errortext, if a function fails', -'gnupg_getprotocol' => 'Returns the currently active protocol for all operations', -'gnupg_import' => 'Imports a key', -'gnupg_init' => 'Initialize a connection', -'gnupg_keyinfo' => 'Returns an array with information about all keys that matches the given pattern', -'gnupg_setarmor' => 'Toggle armored output', -'gnupg_seterrormode' => 'Sets the mode for error_reporting', -'gnupg_setsignmode' => 'Sets the mode for signing', -'gnupg_sign' => 'Signs a given text', -'gnupg_verify' => 'Verifies a signed text', -'gopher_parsedir' => 'Translate a gopher formatted directory entry into an associative array', -'gregoriantojd' => 'Converts a Gregorian date to Julian Day Count', -'gridObj::set' => 'Set object property to a new value.', -'Grpc\Call::__construct' => 'Constructs a new instance of the Call class.', -'Grpc\Call::cancel' => 'Cancel the call. This will cause the call to end with STATUS_CANCELLED if it -has not already ended with another status.', -'Grpc\Call::getPeer' => 'Get the endpoint this call/stream is connected to', -'Grpc\Call::setCredentials' => 'Set the CallCredentials for this call.', -'Grpc\Call::startBatch' => 'Start a batch of RPC actions.', -'Grpc\CallCredentials::createComposite' => 'Create composite credentials from two existing credentials.', -'Grpc\CallCredentials::createFromPlugin' => 'Create a call credentials object from the plugin API', -'Grpc\Channel::__construct' => 'Construct an instance of the Channel class. If the $args array contains a -"credentials" key mapping to a ChannelCredentials object, a secure channel -will be created with those credentials.', -'Grpc\Channel::close' => 'Close the channel', -'Grpc\Channel::getConnectivityState' => 'Get the connectivity state of the channel', -'Grpc\Channel::getTarget' => 'Get the endpoint this call/stream is connected to', -'Grpc\Channel::watchConnectivityState' => 'Watch the connectivity state of the channel until it changed', -'Grpc\ChannelCredentials::createComposite' => 'Create composite credentials from two existing credentials.', -'Grpc\ChannelCredentials::createDefault' => 'Create a default channel credentials object.', -'Grpc\ChannelCredentials::createInsecure' => 'Create insecure channel credentials', -'Grpc\ChannelCredentials::createSsl' => 'Create SSL credentials.', -'Grpc\ChannelCredentials::setDefaultRootsPem' => 'Set default roots pem.', -'Grpc\Server::__construct' => 'Constructs a new instance of the Server class', -'Grpc\Server::addHttp2Port' => 'Add a http2 over tcp listener.', -'Grpc\Server::addSecureHttp2Port' => 'Add a secure http2 over tcp listener.', -'Grpc\Server::requestCall' => 'Request a call on a server. Creates a single GRPC_SERVER_RPC_NEW event.', -'Grpc\Server::start' => 'Start a server - tells all listeners to start listening', -'Grpc\ServerCredentials::createSsl' => 'Create SSL credentials.', -'Grpc\Timeval::__construct' => 'Constructs a new instance of the Timeval class', -'Grpc\Timeval::add' => 'Adds another Timeval to this one and returns the sum. Calculations saturate -at infinities.', -'Grpc\Timeval::compare' => 'Return negative, 0, or positive according to whether a < b, a == b, or a > b -respectively.', -'Grpc\Timeval::infFuture' => 'Returns the infinite future time value as a timeval object', -'Grpc\Timeval::infPast' => 'Returns the infinite past time value as a timeval object', -'Grpc\Timeval::now' => 'Returns the current time as a timeval object', -'Grpc\Timeval::similar' => 'Checks whether the two times are within $threshold of each other', -'Grpc\Timeval::sleepUntil' => 'Sleep until this time, interpreted as an absolute timeout', -'Grpc\Timeval::subtract' => 'Subtracts another Timeval from this one and returns the difference. -Calculations saturate at infinities.', -'Grpc\Timeval::zero' => 'Returns the zero time interval as a timeval object', -'gupnp_context_get_host_ip' => 'Get the IP address', -'gupnp_context_get_port' => 'Get the port', -'gupnp_context_get_subscription_timeout' => 'Get the event subscription timeout', -'gupnp_context_host_path' => 'Start hosting', -'gupnp_context_new' => 'Create a new context', -'gupnp_context_set_subscription_timeout' => 'Sets the event subscription timeout', -'gupnp_context_timeout_add' => 'Sets a function to be called at regular intervals', -'gupnp_context_unhost_path' => 'Stop hosting', -'gupnp_control_point_browse_start' => 'Start browsing', -'gupnp_control_point_browse_stop' => 'Stop browsing', -'gupnp_control_point_callback_set' => 'Set control point callback', -'gupnp_control_point_new' => 'Create a new control point', -'gupnp_device_action_callback_set' => 'Set device callback function', -'gupnp_device_info_get' => 'Get info of root device', -'gupnp_device_info_get_service' => 'Get the service with type', -'gupnp_root_device_get_available' => 'Check whether root device is available', -'gupnp_root_device_get_relative_location' => 'Get the relative location of root device', -'gupnp_root_device_new' => 'Create a new root device', -'gupnp_root_device_set_available' => 'Set whether or not root_device is available', -'gupnp_root_device_start' => 'Start main loop', -'gupnp_root_device_stop' => 'Stop main loop', -'gupnp_service_action_get' => 'Retrieves the specified action arguments', -'gupnp_service_action_return' => 'Return successfully', -'gupnp_service_action_return_error' => 'Return error code', -'gupnp_service_action_set' => 'Sets the specified action return values', -'gupnp_service_freeze_notify' => 'Freeze new notifications', -'gupnp_service_info_get' => 'Get full info of service', -'gupnp_service_info_get_introspection' => 'Get resource introspection of service', -'gupnp_service_introspection_get_state_variable' => 'Returns the state variable data', -'gupnp_service_notify' => 'Notifies listening clients', -'gupnp_service_proxy_action_get' => 'Send action to the service and get value', -'gupnp_service_proxy_action_set' => 'Send action to the service and set value', -'gupnp_service_proxy_add_notify' => 'Sets up callback for variable change notification', -'gupnp_service_proxy_callback_set' => 'Set service proxy callback for signal', -'gupnp_service_proxy_get_subscribed' => 'Check whether subscription is valid to the service', -'gupnp_service_proxy_remove_notify' => 'Cancels the variable change notification', -'gupnp_service_proxy_send_action' => 'Send action with multiple parameters synchronously', -'gupnp_service_proxy_set_subscribed' => '(Un)subscribes to the service', -'gupnp_service_thaw_notify' => 'Sends out any pending notifications and stops queuing of new ones', -'gzclose' => 'Close an open gz-file pointer', -'gzcompress' => 'Compress a string', -'gzdecode' => 'Decodes a gzip compressed string', -'gzdeflate' => 'Deflate a string', -'gzencode' => 'Create a gzip compressed string', -'gzeof' => 'Test for EOF on a gz-file pointer', -'gzfile' => 'Read entire gz-file into an array', -'gzgetc' => 'Get character from gz-file pointer', -'gzgets' => 'Get line from file pointer', -'gzgetss' => 'Get line from gz-file pointer and strip HTML tags', -'gzinflate' => 'Inflate a deflated string', -'gzopen' => 'Open gz-file', -'gzpassthru' => 'Output all remaining data on a gz-file pointer', -'gzputs' => 'Alias of gzwrite', -'gzread' => 'Binary-safe gz-file read', -'gzrewind' => 'Rewind the position of a gz-file pointer', -'gzseek' => 'Seek on a gz-file pointer', -'gztell' => 'Tell gz-file pointer read/write position', -'gzuncompress' => 'Uncompress a compressed string', -'gzwrite' => 'Binary-safe gz-file write', -'haruannotation::setBorderStyle' => 'Set the border style of the annotation', -'haruannotation::setHighlightMode' => 'Set the highlighting mode of the annotation', -'haruannotation::setIcon' => 'Set the icon style of the annotation', -'haruannotation::setOpened' => 'Set the initial state of the annotation', -'harudestination::setFit' => 'Set the appearance of the page to fit the window', -'harudestination::setFitB' => 'Set the appearance of the page to fit the bounding box of the page within the window', -'harudestination::setFitBH' => 'Set the appearance of the page to fit the width of the bounding box', -'harudestination::setFitBV' => 'Set the appearance of the page to fit the height of the boudning box', -'harudestination::setFitH' => 'Set the appearance of the page to fit the window width', -'harudestination::setFitR' => 'Set the appearance of the page to fit the specified rectangle', -'harudestination::setFitV' => 'Set the appearance of the page to fit the window height', -'harudestination::setXYZ' => 'Set the appearance of the page', -'harudoc::__construct' => 'Construct new HaruDoc instance', -'harudoc::addPage' => 'Add new page to the document', -'harudoc::addPageLabel' => 'Set the numbering style for the specified range of pages', -'harudoc::createOutline' => 'Create a HaruOutline instance', -'harudoc::getCurrentEncoder' => 'Get HaruEncoder currently used in the document', -'harudoc::getCurrentPage' => 'Return current page of the document', -'harudoc::getEncoder' => 'Get HaruEncoder instance for the specified encoding', -'harudoc::getFont' => 'Get HaruFont instance', -'harudoc::getInfoAttr' => 'Get current value of the specified document attribute', -'harudoc::getPageLayout' => 'Get current page layout', -'harudoc::getPageMode' => 'Get current page mode', -'harudoc::getStreamSize' => 'Get the size of the temporary stream', -'harudoc::insertPage' => 'Insert new page just before the specified page', -'harudoc::loadJPEG' => 'Load a JPEG image', -'harudoc::loadPNG' => 'Load PNG image and return HaruImage instance', -'harudoc::loadRaw' => 'Load a RAW image', -'harudoc::loadTTC' => 'Load the font with the specified index from TTC file', -'harudoc::loadTTF' => 'Load TTF font file', -'harudoc::loadType1' => 'Load Type1 font', -'harudoc::output' => 'Write the document data to the output buffer', -'harudoc::readFromStream' => 'Read data from the temporary stream', -'harudoc::resetError' => 'Reset error state of the document handle', -'harudoc::resetStream' => 'Rewind the temporary stream', -'harudoc::save' => 'Save the document into the specified file', -'harudoc::saveToStream' => 'Save the document into a temporary stream', -'harudoc::setCompressionMode' => 'Set compression mode for the document', -'harudoc::setCurrentEncoder' => 'Set the current encoder for the document', -'harudoc::setEncryptionMode' => 'Set encryption mode for the document', -'harudoc::setInfoAttr' => 'Set the info attribute of the document', -'harudoc::setInfoDateAttr' => 'Set the datetime info attributes of the document', -'harudoc::setOpenAction' => 'Define which page is shown when the document is opened', -'harudoc::setPageLayout' => 'Set how pages should be displayed', -'harudoc::setPageMode' => 'Set how the document should be displayed', -'harudoc::setPagesConfiguration' => 'Set the number of pages per set of pages', -'harudoc::setPassword' => 'Set owner and user passwords for the document', -'harudoc::setPermission' => 'Set permissions for the document', -'harudoc::useCNSEncodings' => 'Enable Chinese simplified encodings', -'harudoc::useCNSFonts' => 'Enable builtin Chinese simplified fonts', -'harudoc::useCNTEncodings' => 'Enable Chinese traditional encodings', -'harudoc::useCNTFonts' => 'Enable builtin Chinese traditional fonts', -'harudoc::useJPEncodings' => 'Enable Japanese encodings', -'harudoc::useJPFonts' => 'Enable builtin Japanese fonts', -'harudoc::useKREncodings' => 'Enable Korean encodings', -'harudoc::useKRFonts' => 'Enable builtin Korean fonts', -'haruencoder::getByteType' => 'Get the type of the byte in the text', -'haruencoder::getType' => 'Get the type of the encoder', -'haruencoder::getUnicode' => 'Convert the specified character to unicode', -'haruencoder::getWritingMode' => 'Get the writing mode of the encoder', -'harufont::getAscent' => 'Get the vertical ascent of the font', -'harufont::getCapHeight' => 'Get the distance from the baseline of uppercase letters', -'harufont::getDescent' => 'Get the vertical descent of the font', -'harufont::getEncodingName' => 'Get the name of the encoding', -'harufont::getFontName' => 'Get the name of the font', -'harufont::getTextWidth' => 'Get the total width of the text, number of characters, number of words and number of spaces', -'harufont::getUnicodeWidth' => 'Get the width of the character in the font', -'harufont::getXHeight' => 'Get the distance from the baseline of lowercase letters', -'harufont::measureText' => 'Calculate the number of characters which can be included within the specified width', -'haruimage::getBitsPerComponent' => 'Get the number of bits used to describe each color component of the image', -'haruimage::getColorSpace' => 'Get the name of the color space', -'haruimage::getHeight' => 'Get the height of the image', -'haruimage::getSize' => 'Get size of the image', -'haruimage::getWidth' => 'Get the width of the image', -'haruimage::setColorMask' => 'Set the color mask of the image', -'haruimage::setMaskImage' => 'Set the image mask', -'haruoutline::setDestination' => 'Set the destination for the outline', -'haruoutline::setOpened' => 'Set the initial state of the outline', -'harupage::arc' => 'Append an arc to the current path', -'harupage::beginText' => 'Begin a text object and set the current text position to (0,0)', -'harupage::circle' => 'Append a circle to the current path', -'harupage::closePath' => 'Append a straight line from the current point to the start point of the path', -'harupage::concat' => 'Concatenate current transformation matrix of the page and the specified matrix', -'harupage::createDestination' => 'Create new HaruDestination instance', -'harupage::createLinkAnnotation' => 'Create new HaruAnnotation instance', -'harupage::createTextAnnotation' => 'Create new HaruAnnotation instance', -'harupage::createURLAnnotation' => 'Create and return new HaruAnnotation instance', -'harupage::curveTo' => 'Append a Bezier curve to the current path', -'harupage::curveTo2' => 'Append a Bezier curve to the current path', -'harupage::curveTo3' => 'Append a Bezier curve to the current path', -'harupage::drawImage' => 'Show image at the page', -'harupage::ellipse' => 'Append an ellipse to the current path', -'harupage::endPath' => 'End current path object without filling and painting operations', -'harupage::endText' => 'End current text object', -'harupage::eofill' => 'Fill current path using even-odd rule', -'harupage::eoFillStroke' => 'Fill current path using even-odd rule, then paint the path', -'harupage::fill' => 'Fill current path using nonzero winding number rule', -'harupage::fillStroke' => 'Fill current path using nonzero winding number rule, then paint the path', -'harupage::getCharSpace' => 'Get the current value of character spacing', -'harupage::getCMYKFill' => 'Get the current filling color', -'harupage::getCMYKStroke' => 'Get the current stroking color', -'harupage::getCurrentFont' => 'Get the currently used font', -'harupage::getCurrentFontSize' => 'Get the current font size', -'harupage::getCurrentPos' => 'Get the current position for path painting', -'harupage::getCurrentTextPos' => 'Get the current position for text printing', -'harupage::getDash' => 'Get the current dash pattern', -'harupage::getFillingColorSpace' => 'Get the current filling color space', -'harupage::getFlatness' => 'Get the flatness of the page', -'harupage::getGMode' => 'Get the current graphics mode', -'harupage::getGrayFill' => 'Get the current filling color', -'harupage::getGrayStroke' => 'Get the current stroking color', -'harupage::getHeight' => 'Get the height of the page', -'harupage::getHorizontalScaling' => 'Get the current value of horizontal scaling', -'harupage::getLineCap' => 'Get the current line cap style', -'harupage::getLineJoin' => 'Get the current line join style', -'harupage::getLineWidth' => 'Get the current line width', -'harupage::getMiterLimit' => 'Get the value of miter limit', -'harupage::getRGBFill' => 'Get the current filling color', -'harupage::getRGBStroke' => 'Get the current stroking color', -'harupage::getStrokingColorSpace' => 'Get the current stroking color space', -'harupage::getTextLeading' => 'Get the current value of line spacing', -'harupage::getTextMatrix' => 'Get the current text transformation matrix of the page', -'harupage::getTextRenderingMode' => 'Get the current text rendering mode', -'harupage::getTextRise' => 'Get the current value of text rising', -'harupage::getTextWidth' => 'Get the width of the text using current fontsize, character spacing and word spacing', -'harupage::getTransMatrix' => 'Get the current transformation matrix of the page', -'harupage::getWidth' => 'Get the width of the page', -'harupage::getWordSpace' => 'Get the current value of word spacing', -'harupage::lineTo' => 'Draw a line from the current point to the specified point', -'harupage::measureText' => 'Calculate the byte length of characters which can be included on one line of the specified width', -'harupage::moveTextPos' => 'Move text position to the specified offset', -'harupage::moveTo' => 'Set starting point for new drawing path', -'harupage::moveToNextLine' => 'Move text position to the start of the next line', -'harupage::rectangle' => 'Append a rectangle to the current path', -'harupage::setCharSpace' => 'Set character spacing for the page', -'harupage::setCMYKFill' => 'Set filling color for the page', -'harupage::setCMYKStroke' => 'Set stroking color for the page', -'harupage::setDash' => 'Set the dash pattern for the page', -'harupage::setFlatness' => 'Set flatness for the page', -'harupage::setFontAndSize' => 'Set font and fontsize for the page', -'harupage::setGrayFill' => 'Set filling color for the page', -'harupage::setGrayStroke' => 'Sets stroking color for the page', -'harupage::setHeight' => 'Set height of the page', -'harupage::setHorizontalScaling' => 'Set horizontal scaling for the page', -'harupage::setLineCap' => 'Set the shape to be used at the ends of lines', -'harupage::setLineJoin' => 'Set line join style for the page', -'harupage::setLineWidth' => 'Set line width for the page', -'harupage::setMiterLimit' => 'Set the current value of the miter limit of the page', -'harupage::setRGBFill' => 'Set filling color for the page', -'harupage::setRGBStroke' => 'Set stroking color for the page', -'harupage::setRotate' => 'Set rotation angle of the page', -'harupage::setSize' => 'Set size and direction of the page', -'harupage::setSlideShow' => 'Set transition style for the page', -'harupage::setTextLeading' => 'Set text leading (line spacing) for the page', -'harupage::setTextMatrix' => 'Set the current text transformation matrix of the page', -'harupage::setTextRenderingMode' => 'Set text rendering mode for the page', -'harupage::setTextRise' => 'Set the current value of text rising', -'harupage::setWidth' => 'Set width of the page', -'harupage::setWordSpace' => 'Set word spacing for the page', -'harupage::showText' => 'Print text at the current position of the page', -'harupage::showTextNextLine' => 'Move the current position to the start of the next line and print the text', -'harupage::stroke' => 'Paint current path', -'harupage::textOut' => 'Print the text on the specified position', -'harupage::textRect' => 'Print the text inside the specified region', -'hash' => 'Generate a hash value (message digest)', -'hash_algos' => 'Return a list of registered hashing algorithms', -'hash_copy' => 'Copy hashing context', -'hash_equals' => 'Timing attack safe string comparison', -'hash_file' => 'Generate a hash value using the contents of a given file', -'hash_final' => 'Finalize an incremental hash and return resulting digest', -'hash_hkdf' => 'Generate a HKDF key derivation of a supplied key input', -'hash_hmac' => 'Generate a keyed hash value using the HMAC method', -'hash_hmac_algos' => 'Return a list of registered hashing algorithms suitable for hash_hmac', -'hash_hmac_file' => 'Generate a keyed hash value using the HMAC method and the contents of a given file', -'hash_init' => 'Initialize an incremental hashing context', -'hash_pbkdf2' => 'Generate a PBKDF2 key derivation of a supplied password', -'hash_update' => 'Pump data into an active hashing context', -'hash_update_file' => 'Pump data into an active hashing context from a file', -'hash_update_stream' => 'Pump data into an active hashing context from an open stream', -'hashcontext::__construct' => 'Private constructor to disallow direct instantiation', -'hashTableObj::clear' => 'Clear all items in the hashTable (To NULL).', -'hashTableObj::get' => 'Fetch class metadata entry by name. Returns "" if no entry -matches the name. Note that the search is case sensitive.', -'hashTableObj::nextkey' => 'Return the next key or first key if previousKey = NULL. -Return NULL if no item is in the hashTable or end of hashTable is -reached', -'hashTableObj::remove' => 'Remove a metadata entry in the hashTable. Returns MS_SUCCESS/MS_FAILURE.', -'hashTableObj::set' => 'Set a metadata entry in the hashTable. Returns MS_SUCCESS/MS_FAILURE.', -'header' => 'Send a raw HTTP header', -'header_register_callback' => 'Call a header function', -'header_remove' => 'Remove previously set headers', -'headers_list' => 'Returns a list of response headers sent (or ready to send)', -'headers_sent' => 'Checks if or where headers have been sent', -'hebrev' => 'Convert logical Hebrew text to visual text', -'hebrevc' => 'Convert logical Hebrew text to visual text with newline conversion', -'hex2bin' => 'Decodes a hexadecimally encoded binary string', -'hexdec' => 'Hexadecimal to decimal', -'highlight_file' => 'Syntax highlighting of a file', -'highlight_string' => 'Syntax highlighting of a string', -'hrtime' => 'Get the system\'s high resolution time', -'hrtime_performancecounter::getFrequency' => 'Timer frequency in ticks per second', -'hrtime_performancecounter::getTicks' => 'Current ticks from the system', -'hrtime_performancecounter::getTicksSince' => 'Ticks elapsed since the given value', -'hrtime_stopwatch::getElapsedTicks' => 'Get elapsed ticks for all intervals', -'hrtime_stopwatch::getElapsedTime' => 'Get elapsed time for all intervals', -'hrtime_stopwatch::getLastElapsedTicks' => 'Get elapsed ticks for the last interval', -'hrtime_stopwatch::getLastElapsedTime' => 'Get elapsed time for the last interval', -'hrtime_stopwatch::isRunning' => 'Whether the measurement is running', -'hrtime_stopwatch::start' => 'Start time measurement', -'hrtime_stopwatch::stop' => 'Stop time measurement', -'html_entity_decode' => 'Convert HTML entities to their corresponding characters', -'htmlentities' => 'Convert all applicable characters to HTML entities', -'htmlspecialchars' => 'Convert special characters to HTML entities', -'htmlspecialchars_decode' => 'Convert special HTML entities back to characters', -'http\Client::__construct' => 'Create a new HTTP client.', -'http\Client::addCookies' => 'Add custom cookies. -See http\Client::setCookies().', -'http\Client::addSslOptions' => 'Add specific SSL options. -See http\Client::setSslOptions(), http\Client::setOptions() and http\Client\Curl\$ssl options.', -'http\Client::attach' => 'Implements SplSubject. Attach another observer. -Attached observers will be notified with progress of each transfer.', -'http\Client::configure' => 'Configure the client\'s low level options. - -> ***NOTE:*** -> This method has been added in v2.3.0.', -'http\Client::count' => 'Implements Countable. Retrieve the number of enqueued requests. - -> ***NOTE:*** -> The enqueued requests are counted without regard whether they are finished or not.', -'http\Client::dequeue' => 'Dequeue the http\Client\Request $request. - -See http\Client::requeue(), if you want to requeue the request, instead of calling http\Client::dequeue() and then http\Client::enqueue().', -'http\Client::detach' => 'Implements SplSubject. Detach $observer, which has been previously attached.', -'http\Client::enableEvents' => 'Enable usage of an event library like libevent, which might improve performance with big socket sets. - -> ***NOTE:*** -> This method has been deprecated in 2.3.0, please use http\Client::configure() instead.', -'http\Client::enablePipelining' => 'Enable sending pipelined requests to the same host if the driver supports it. - -> ***NOTE:*** -> This method has been deprecated in 2.3.0, please use http\Client::configure() instead.', -'http\Client::enqueue' => 'Add another http\Client\Request to the request queue. -If the optional callback $cb returns true, the request will be automatically dequeued. - -> ***Note:*** -> The http\Client\Response object resulting from the request is always stored -> internally to be retrieved at a later time, __even__ when $cb is used. -> -> If you are about to send a lot of requests and do __not__ need the response -> after executing the callback, you can use http\Client::getResponse() within -> the callback to keep the memory usage level as low as possible. - -See http\Client::dequeue() and http\Client::send().', -'http\Client::getAvailableConfiguration' => 'Get a list of available configuration options and their default values. - -See f.e. the [configuration options for the Curl driver](http/Client/Curl#Configuration:).', -'http\Client::getAvailableDrivers' => 'List available drivers.', -'http\Client::getAvailableOptions' => 'Retrieve a list of available request options and their default values. - -See f.e. the [request options for the Curl driver](http/Client/Curl#Options:).', -'http\Client::getCookies' => 'Get priorly set custom cookies. -See http\Client::setCookies().', -'http\Client::getHistory' => 'Simply returns the http\Message chain representing the request/response history. - -> ***NOTE:*** -> The history is only recorded while http\Client::$recordHistory is true.', -'http\Client::getObservers' => 'Returns the SplObjectStorage holding attached observers.', -'http\Client::getOptions' => 'Get priorly set options. -See http\Client::setOptions().', -'http\Client::getProgressInfo' => 'Retrieve the progress information for $request.', -'http\Client::getResponse' => 'Retrieve the corresponding response of an already finished request, or the last received response if $request is not set. - -> ***NOTE:*** -> If $request is NULL, then the response is removed from the internal storage (stack-like operation).', -'http\Client::getSslOptions' => 'Retrieve priorly set SSL options. -See http\Client::getOptions() and http\Client::setSslOptions().', -'http\Client::getTransferInfo' => 'Get transfer related information for a running or finished request.', -'http\Client::notify' => 'Implements SplSubject. Notify attached observers about progress with $request.', -'http\Client::once' => 'Perform outstanding transfer actions. -See http\Client::wait() for the completing interface.', -'http\Client::requeue' => 'Requeue an http\Client\Request. - -The difference simply is, that this method, in contrast to http\Client::enqueue(), does not throw an http\Exception when the request to queue is already enqueued and dequeues it automatically prior enqueueing it again.', -'http\Client::reset' => 'Reset the client to the initial state.', -'http\Client::send' => 'Send all enqueued requests. -See http\Client::once() and http\Client::wait() for a more fine grained interface.', -'http\Client::setCookies' => 'Set custom cookies. -See http\Client::addCookies() and http\Client::getCookies().', -'http\Client::setDebug' => 'Set client debugging callback. - -> ***NOTE:*** -> This method has been added in v2.6.0, resp. v3.1.0.', -'http\Client::setOptions' => 'Set client options. -See http\Client\Curl. - -> ***NOTE:*** -> Only options specified prior enqueueing a request are applied to the request.', -'http\Client::setSslOptions' => 'Specifically set SSL options. -See http\Client::setOptions() and http\Client\Curl\$ssl options.', -'http\Client::wait' => 'Wait for $timeout seconds for transfers to provide data. -This is the completion call to http\Client::once().', -'http\Client\Curl\User::init' => 'Initialize the event loop.', -'http\Client\Curl\User::once' => 'Run the loop as long as it does not block. - -> ***NOTE:*** -> This method is called by http\Client::once(), so it does not need to have an actual implementation if http\Client::once() is never called.', -'http\Client\Curl\User::send' => 'Run the loop. - -> ***NOTE:*** -> This method is called by http\Client::send(), so it does not need to have an actual implementation if http\Client::send() is never called.', -'http\Client\Curl\User::socket' => 'Register (or deregister) a socket watcher.', -'http\Client\Curl\User::timer' => 'Register a timeout watcher.', -'http\Client\Curl\User::wait' => 'Wait/poll/select (block the loop) until events fire. - -> ***NOTE:*** -> This method is called by http\Client::wait(), so it does not need to have an actual implementation if http\Client::wait() is never called.', -'http\Client\Request::__construct' => 'Create a new client request message to be enqueued and sent by http\Client.', -'http\Client\Request::__toString' => 'Retrieve the message serialized to a string. -Alias of http\Message::toString().', -'http\Client\Request::addBody' => 'Append the data of $body to the message\'s body. -See http\Message::setBody() and http\Message\Body::append().', -'http\Client\Request::addHeader' => 'Add an header, appending to already existing headers. -See http\Message::addHeaders() and http\Message::setHeader().', -'http\Client\Request::addHeaders' => 'Add headers, optionally appending values, if header keys already exist. -See http\Message::addHeader() and http\Message::setHeaders().', -'http\Client\Request::addQuery' => 'Add querystring data. -See http\Client\Request::setQuery() and http\Message::setRequestUrl().', -'http\Client\Request::addSslOptions' => 'Add specific SSL options. -See http\Client\Request::setSslOptions(), http\Client\Request::setOptions() and http\Client\Curl\$ssl options.', -'http\Client\Request::count' => 'Implements Countable.', -'http\Client\Request::current' => 'Implements iterator. -See http\Message::valid() and http\Message::rewind().', -'http\Client\Request::detach' => 'Detach a clone of this message from any message chain.', -'http\Client\Request::getBody' => 'Retrieve the message\'s body. -See http\Message::setBody().', -'http\Client\Request::getContentType' => 'Extract the currently set "Content-Type" header. -See http\Client\Request::setContentType().', -'http\Client\Request::getHeader' => 'Retrieve a single header, optionally hydrated into a http\Header extending class.', -'http\Client\Request::getHeaders' => 'Retrieve all message headers. -See http\Message::setHeaders() and http\Message::getHeader().', -'http\Client\Request::getHttpVersion' => 'Retrieve the HTTP protocol version of the message. -See http\Message::setHttpVersion().', -'http\Client\Request::getInfo' => 'Retrieve the first line of a request or response message. -See http\Message::setInfo and also: - -* http\Message::getType() -* http\Message::getHttpVersion() -* http\Message::getResponseCode() -* http\Message::getResponseStatus() -* http\Message::getRequestMethod() -* http\Message::getRequestUrl()', -'http\Client\Request::getOptions' => 'Get priorly set options. -See http\Client\Request::setOptions().', -'http\Client\Request::getParentMessage' => 'Retrieve any parent message. -See http\Message::reverse().', -'http\Client\Request::getQuery' => 'Retrieve the currently set querystring.', -'http\Client\Request::getRequestMethod' => 'Retrieve the request method of the message. -See http\Message::setRequestMethod() and http\Message::getRequestUrl().', -'http\Client\Request::getRequestUrl' => 'Retrieve the request URL of the message. -See http\Message::setRequestUrl().', -'http\Client\Request::getResponseCode' => 'Retrieve the response code of the message. -See http\Message::setResponseCode() and http\Message::getResponseStatus().', -'http\Client\Request::getResponseStatus' => 'Retrieve the response status of the message. -See http\Message::setResponseStatus() and http\Message::getResponseCode().', -'http\Client\Request::getSslOptions' => 'Retrieve priorly set SSL options. -See http\Client\Request::getOptions() and http\Client\Request::setSslOptions().', -'http\Client\Request::getType' => 'Retrieve the type of the message. -See http\Message::setType() and http\Message::getInfo().', -'http\Client\Request::isMultipart' => 'Check whether this message is a multipart message based on it\'s content type. -If the message is a multipart message and a reference $boundary is given, the boundary string of the multipart message will be stored in $boundary. - -See http\Message::splitMultipartBody().', -'http\Client\Request::key' => 'Implements Iterator. -See http\Message::current() and http\Message::rewind().', -'http\Client\Request::next' => 'Implements Iterator. -See http\Message::valid() and http\Message::rewind().', -'http\Client\Request::prepend' => 'Prepend message(s) $message to this message, or the top most message of this message chain. - -> ***NOTE:*** -> The message chains must not overlap.', -'http\Client\Request::reverse' => 'Reverse the message chain and return the former top-most message. - -> ***NOTE:*** -> Message chains are ordered in reverse-parsed order by default, i.e. the last parsed message is the message you\'ll receive from any call parsing HTTP messages. -> -> This call re-orders the messages of the chain and returns the message that was parsed first with any later parsed messages re-parentized.', -'http\Client\Request::rewind' => 'Implements Iterator.', -'http\Client\Request::serialize' => 'Implements Serializable.', -'http\Client\Request::setBody' => 'Set the message\'s body. -See http\Message::getBody() and http\Message::addBody().', -'http\Client\Request::setContentType' => 'Set the MIME content type of the request message.', -'http\Client\Request::setHeader' => 'Set a single header. -See http\Message::getHeader() and http\Message::addHeader(). - -> ***NOTE:*** -> Prior to v2.5.6/v3.1.0 headers with the same name were merged into a single -> header with values concatenated by comma.', -'http\Client\Request::setHeaders' => 'Set the message headers. -See http\Message::getHeaders() and http\Message::addHeaders(). - -> ***NOTE:*** -> Prior to v2.5.6/v3.1.0 headers with the same name were merged into a single -> header with values concatenated by comma.', -'http\Client\Request::setHttpVersion' => 'Set the HTTP protocol version of the message. -See http\Message::getHttpVersion().', -'http\Client\Request::setInfo' => 'Set the complete message info, i.e. type and response resp. request information, at once. -See http\Message::getInfo().', -'http\Client\Request::setOptions' => 'Set client options. -See http\Client::setOptions() and http\Client\Curl. - -Request specific options override general options which were set in the client. - -> ***NOTE:*** -> Only options specified prior enqueueing a request are applied to the request.', -'http\Client\Request::setQuery' => '(Re)set the querystring. -See http\Client\Request::addQuery() and http\Message::setRequestUrl().', -'http\Client\Request::setRequestMethod' => 'Set the request method of the message. -See http\Message::getRequestMethod() and http\Message::setRequestUrl().', -'http\Client\Request::setRequestUrl' => 'Set the request URL of the message. -See http\Message::getRequestUrl() and http\Message::setRequestMethod().', -'http\Client\Request::setResponseCode' => 'Set the response status code. -See http\Message::getResponseCode() and http\Message::setResponseStatus(). - -> ***NOTE:*** -> This method also resets the response status phrase to the default for that code.', -'http\Client\Request::setResponseStatus' => 'Set the response status phrase. -See http\Message::getResponseStatus() and http\Message::setResponseCode().', -'http\Client\Request::setSslOptions' => 'Specifically set SSL options. -See http\Client\Request::setOptions() and http\Client\Curl\$ssl options.', -'http\Client\Request::setType' => 'Set the message type and reset the message info. -See http\Message::getType() and http\Message::setInfo().', -'http\Client\Request::splitMultipartBody' => 'Splits the body of a multipart message. -See http\Message::isMultipart() and http\Message\Body::addPart().', -'http\Client\Request::toCallback' => 'Stream the message through a callback.', -'http\Client\Request::toStream' => 'Stream the message into stream $stream, starting from $offset, streaming $maxlen at most.', -'http\Client\Request::toString' => 'Retrieve the message serialized to a string.', -'http\Client\Request::unserialize' => 'Implements Serializable.', -'http\Client\Request::valid' => 'Implements Iterator. -See http\Message::current() and http\Message::rewind().', -'http\Client\Response::__construct' => 'Create a new HTTP message.', -'http\Client\Response::__toString' => 'Retrieve the message serialized to a string. -Alias of http\Message::toString().', -'http\Client\Response::addBody' => 'Append the data of $body to the message\'s body. -See http\Message::setBody() and http\Message\Body::append().', -'http\Client\Response::addHeader' => 'Add an header, appending to already existing headers. -See http\Message::addHeaders() and http\Message::setHeader().', -'http\Client\Response::addHeaders' => 'Add headers, optionally appending values, if header keys already exist. -See http\Message::addHeader() and http\Message::setHeaders().', -'http\Client\Response::count' => 'Implements Countable.', -'http\Client\Response::current' => 'Implements iterator. -See http\Message::valid() and http\Message::rewind().', -'http\Client\Response::detach' => 'Detach a clone of this message from any message chain.', -'http\Client\Response::getBody' => 'Retrieve the message\'s body. -See http\Message::setBody().', -'http\Client\Response::getCookies' => 'Extract response cookies. -Parses any "Set-Cookie" response headers into an http\Cookie list. See http\Cookie::__construct().', -'http\Client\Response::getHeader' => 'Retrieve a single header, optionally hydrated into a http\Header extending class.', -'http\Client\Response::getHeaders' => 'Retrieve all message headers. -See http\Message::setHeaders() and http\Message::getHeader().', -'http\Client\Response::getHttpVersion' => 'Retrieve the HTTP protocol version of the message. -See http\Message::setHttpVersion().', -'http\Client\Response::getInfo' => 'Retrieve the first line of a request or response message. -See http\Message::setInfo and also: - -* http\Message::getType() -* http\Message::getHttpVersion() -* http\Message::getResponseCode() -* http\Message::getResponseStatus() -* http\Message::getRequestMethod() -* http\Message::getRequestUrl()', -'http\Client\Response::getParentMessage' => 'Retrieve any parent message. -See http\Message::reverse().', -'http\Client\Response::getRequestMethod' => 'Retrieve the request method of the message. -See http\Message::setRequestMethod() and http\Message::getRequestUrl().', -'http\Client\Response::getRequestUrl' => 'Retrieve the request URL of the message. -See http\Message::setRequestUrl().', -'http\Client\Response::getResponseCode' => 'Retrieve the response code of the message. -See http\Message::setResponseCode() and http\Message::getResponseStatus().', -'http\Client\Response::getResponseStatus' => 'Retrieve the response status of the message. -See http\Message::setResponseStatus() and http\Message::getResponseCode().', -'http\Client\Response::getTransferInfo' => 'Retrieve transfer related information after the request has completed. -See http\Client::getTransferInfo().', -'http\Client\Response::getType' => 'Retrieve the type of the message. -See http\Message::setType() and http\Message::getInfo().', -'http\Client\Response::isMultipart' => 'Check whether this message is a multipart message based on it\'s content type. -If the message is a multipart message and a reference $boundary is given, the boundary string of the multipart message will be stored in $boundary. - -See http\Message::splitMultipartBody().', -'http\Client\Response::key' => 'Implements Iterator. -See http\Message::current() and http\Message::rewind().', -'http\Client\Response::next' => 'Implements Iterator. -See http\Message::valid() and http\Message::rewind().', -'http\Client\Response::prepend' => 'Prepend message(s) $message to this message, or the top most message of this message chain. - -> ***NOTE:*** -> The message chains must not overlap.', -'http\Client\Response::reverse' => 'Reverse the message chain and return the former top-most message. - -> ***NOTE:*** -> Message chains are ordered in reverse-parsed order by default, i.e. the last parsed message is the message you\'ll receive from any call parsing HTTP messages. -> -> This call re-orders the messages of the chain and returns the message that was parsed first with any later parsed messages re-parentized.', -'http\Client\Response::rewind' => 'Implements Iterator.', -'http\Client\Response::serialize' => 'Implements Serializable.', -'http\Client\Response::setBody' => 'Set the message\'s body. -See http\Message::getBody() and http\Message::addBody().', -'http\Client\Response::setHeader' => 'Set a single header. -See http\Message::getHeader() and http\Message::addHeader(). - -> ***NOTE:*** -> Prior to v2.5.6/v3.1.0 headers with the same name were merged into a single -> header with values concatenated by comma.', -'http\Client\Response::setHeaders' => 'Set the message headers. -See http\Message::getHeaders() and http\Message::addHeaders(). - -> ***NOTE:*** -> Prior to v2.5.6/v3.1.0 headers with the same name were merged into a single -> header with values concatenated by comma.', -'http\Client\Response::setHttpVersion' => 'Set the HTTP protocol version of the message. -See http\Message::getHttpVersion().', -'http\Client\Response::setInfo' => 'Set the complete message info, i.e. type and response resp. request information, at once. -See http\Message::getInfo().', -'http\Client\Response::setRequestMethod' => 'Set the request method of the message. -See http\Message::getRequestMethod() and http\Message::setRequestUrl().', -'http\Client\Response::setRequestUrl' => 'Set the request URL of the message. -See http\Message::getRequestUrl() and http\Message::setRequestMethod().', -'http\Client\Response::setResponseCode' => 'Set the response status code. -See http\Message::getResponseCode() and http\Message::setResponseStatus(). - -> ***NOTE:*** -> This method also resets the response status phrase to the default for that code.', -'http\Client\Response::setResponseStatus' => 'Set the response status phrase. -See http\Message::getResponseStatus() and http\Message::setResponseCode().', -'http\Client\Response::setType' => 'Set the message type and reset the message info. -See http\Message::getType() and http\Message::setInfo().', -'http\Client\Response::splitMultipartBody' => 'Splits the body of a multipart message. -See http\Message::isMultipart() and http\Message\Body::addPart().', -'http\Client\Response::toCallback' => 'Stream the message through a callback.', -'http\Client\Response::toStream' => 'Stream the message into stream $stream, starting from $offset, streaming $maxlen at most.', -'http\Client\Response::toString' => 'Retrieve the message serialized to a string.', -'http\Client\Response::unserialize' => 'Implements Serializable.', -'http\Client\Response::valid' => 'Implements Iterator. -See http\Message::current() and http\Message::rewind().', -'http\Cookie::__construct' => 'Create a new cookie list.', -'http\Cookie::__toString' => 'String cast handler. Alias of http\Cookie::toString().', -'http\Cookie::addCookie' => 'Add a cookie. -See http\Cookie::setCookie() and http\Cookie::addCookies().', -'http\Cookie::addCookies' => '(Re)set the cookies. -See http\Cookie::setCookies().', -'http\Cookie::addExtra' => 'Add an extra attribute to the cookie list. -See http\Cookie::setExtra().', -'http\Cookie::addExtras' => 'Add several extra attributes. -See http\Cookie::addExtra().', -'http\Cookie::getCookie' => 'Retrieve a specific cookie value. -See http\Cookie::setCookie().', -'http\Cookie::getCookies' => 'Get the list of cookies. -See http\Cookie::setCookies().', -'http\Cookie::getDomain' => 'Retrieve the effective domain of the cookie list. -See http\Cookie::setDomain().', -'http\Cookie::getExpires' => 'Get the currently set expires attribute. -See http\Cookie::setExpires(). - -> ***NOTE:*** -> A return value of -1 means that the attribute is not set.', -'http\Cookie::getExtra' => 'Retrieve an extra attribute. -See http\Cookie::setExtra().', -'http\Cookie::getExtras' => 'Retrieve the list of extra attributes. -See http\Cookie::setExtras().', -'http\Cookie::getFlags' => 'Get the currently set flags. -See http\Cookie::SECURE and http\Cookie::HTTPONLY constants.', -'http\Cookie::getMaxAge' => 'Get the currently set max-age attribute of the cookie list. -See http\Cookie::setMaxAge(). - -> ***NOTE:*** -> A return value of -1 means that the attribute is not set.', -'http\Cookie::getPath' => 'Retrieve the path the cookie(s) of this cookie list are effective at. -See http\Cookie::setPath().', -'http\Cookie::setCookie' => '(Re)set a cookie. -See http\Cookie::addCookie() and http\Cookie::setCookies(). - -> ***NOTE:*** -> The cookie will be deleted from the list if $cookie_value is NULL.', -'http\Cookie::setCookies' => '(Re)set the cookies. -See http\Cookie::addCookies().', -'http\Cookie::setDomain' => 'Set the effective domain of the cookie list. -See http\Cookie::setPath().', -'http\Cookie::setExpires' => 'Set the traditional expires timestamp. -See http\Cookie::setMaxAge() for a safer alternative.', -'http\Cookie::setExtra' => '(Re)set an extra attribute. -See http\Cookie::addExtra(). - -> ***NOTE:*** -> The attribute will be removed from the extras list if $extra_value is NULL.', -'http\Cookie::setExtras' => '(Re)set the extra attributes. -See http\Cookie::addExtras().', -'http\Cookie::setFlags' => 'Set the flags to specified $value. -See http\Cookie::SECURE and http\Cookie::HTTPONLY constants.', -'http\Cookie::setMaxAge' => 'Set the maximum age the cookie may have on the client side. -This is a client clock departure safe alternative to the "expires" attribute. -See http\Cookie::setExpires().', -'http\Cookie::setPath' => 'Set the path the cookie(s) of this cookie list should be effective at. -See http\Cookie::setDomain().', -'http\Cookie::toArray' => 'Get the cookie list as array.', -'http\Cookie::toString' => 'Retrieve the string representation of the cookie list. -See http\Cookie::toArray().', -'http\Encoding\Stream::__construct' => 'Base constructor for encoding stream implementations.', -'http\Encoding\Stream::done' => 'Check whether the encoding stream is already done.', -'http\Encoding\Stream::finish' => 'Finish and reset the encoding stream. -Returns any pending data.', -'http\Encoding\Stream::flush' => 'Flush the encoding stream. -Returns any pending data.', -'http\Encoding\Stream::update' => 'Update the encoding stream with more input.', -'http\Encoding\Stream\Debrotli::__construct' => 'Base constructor for encoding stream implementations.', -'http\Encoding\Stream\Debrotli::decode' => 'Decode brotli encoded data.', -'http\Encoding\Stream\Debrotli::done' => 'Check whether the encoding stream is already done.', -'http\Encoding\Stream\Debrotli::finish' => 'Finish and reset the encoding stream. -Returns any pending data.', -'http\Encoding\Stream\Debrotli::flush' => 'Flush the encoding stream. -Returns any pending data.', -'http\Encoding\Stream\Debrotli::update' => 'Update the encoding stream with more input.', -'http\Encoding\Stream\Dechunk::__construct' => 'Base constructor for encoding stream implementations.', -'http\Encoding\Stream\Dechunk::decode' => 'Decode chunked encoded data.', -'http\Encoding\Stream\Dechunk::done' => 'Check whether the encoding stream is already done.', -'http\Encoding\Stream\Dechunk::finish' => 'Finish and reset the encoding stream. -Returns any pending data.', -'http\Encoding\Stream\Dechunk::flush' => 'Flush the encoding stream. -Returns any pending data.', -'http\Encoding\Stream\Dechunk::update' => 'Update the encoding stream with more input.', -'http\Encoding\Stream\Deflate::__construct' => 'Base constructor for encoding stream implementations.', -'http\Encoding\Stream\Deflate::done' => 'Check whether the encoding stream is already done.', -'http\Encoding\Stream\Deflate::encode' => 'Encode data with deflate/zlib/gzip encoding.', -'http\Encoding\Stream\Deflate::finish' => 'Finish and reset the encoding stream. -Returns any pending data.', -'http\Encoding\Stream\Deflate::flush' => 'Flush the encoding stream. -Returns any pending data.', -'http\Encoding\Stream\Deflate::update' => 'Update the encoding stream with more input.', -'http\Encoding\Stream\Enbrotli::__construct' => 'Base constructor for encoding stream implementations.', -'http\Encoding\Stream\Enbrotli::done' => 'Check whether the encoding stream is already done.', -'http\Encoding\Stream\Enbrotli::encode' => 'Encode data with brotli encoding.', -'http\Encoding\Stream\Enbrotli::finish' => 'Finish and reset the encoding stream. -Returns any pending data.', -'http\Encoding\Stream\Enbrotli::flush' => 'Flush the encoding stream. -Returns any pending data.', -'http\Encoding\Stream\Enbrotli::update' => 'Update the encoding stream with more input.', -'http\Encoding\Stream\Inflate::__construct' => 'Base constructor for encoding stream implementations.', -'http\Encoding\Stream\Inflate::decode' => 'Decode deflate/zlib/gzip encoded data.', -'http\Encoding\Stream\Inflate::done' => 'Check whether the encoding stream is already done.', -'http\Encoding\Stream\Inflate::finish' => 'Finish and reset the encoding stream. -Returns any pending data.', -'http\Encoding\Stream\Inflate::flush' => 'Flush the encoding stream. -Returns any pending data.', -'http\Encoding\Stream\Inflate::update' => 'Update the encoding stream with more input.', -'http\Env::getRequestBody' => 'Retrieve the current HTTP request\'s body.', -'http\Env::getRequestHeader' => 'Retrieve one or all headers of the current HTTP request.', -'http\Env::getResponseCode' => 'Get the HTTP response code to send.', -'http\Env::getResponseHeader' => 'Get one or all HTTP response headers to be sent.', -'http\Env::getResponseStatusForAllCodes' => 'Retrieve a list of all known HTTP response status.', -'http\Env::getResponseStatusForCode' => 'Retrieve the string representation of specified HTTP response code.', -'http\Env::negotiate' => 'Generic negotiator. For specific client negotiation see http\Env::negotiateContentType() and related methods. - -> ***NOTE:*** -> The first element of $supported serves as a default if no operand matches.', -'http\Env::negotiateCharset' => 'Negotiate the client\'s preferred character set. - -> ***NOTE:*** -> The first element of $supported character sets serves as a default if no character set matches.', -'http\Env::negotiateContentType' => 'Negotiate the client\'s preferred MIME content type. - -> ***NOTE:*** -> The first element of $supported content types serves as a default if no content-type matches.', -'http\Env::negotiateEncoding' => 'Negotiate the client\'s preferred encoding. - -> ***NOTE:*** -> The first element of $supported encodings serves as a default if no encoding matches.', -'http\Env::negotiateLanguage' => 'Negotiate the client\'s preferred language. - -> ***NOTE:*** -> The first element of $supported languages serves as a default if no language matches.', -'http\Env::setResponseCode' => 'Set the HTTP response code to send.', -'http\Env::setResponseHeader' => 'Set a response header, either replacing a prior set header, or appending the new header value, depending on $replace. - -If no $header_value is specified, or $header_value is NULL, then a previously set header with the same key will be deleted from the list. - -If $response_code is not 0, the response status code is updated accordingly.', -'http\Env\Request::__construct' => 'Create an instance of the server\'s current HTTP request. - -Upon construction, the http\Env\Request acquires http\QueryString instances of query parameters ($\_GET) and form parameters ($\_POST). - -It also compiles an array of uploaded files ($\_FILES) more comprehensive than the original $\_FILES array, see http\Env\Request::getFiles() for that matter.', -'http\Env\Request::__toString' => 'Retrieve the message serialized to a string. -Alias of http\Message::toString().', -'http\Env\Request::addBody' => 'Append the data of $body to the message\'s body. -See http\Message::setBody() and http\Message\Body::append().', -'http\Env\Request::addHeader' => 'Add an header, appending to already existing headers. -See http\Message::addHeaders() and http\Message::setHeader().', -'http\Env\Request::addHeaders' => 'Add headers, optionally appending values, if header keys already exist. -See http\Message::addHeader() and http\Message::setHeaders().', -'http\Env\Request::count' => 'Implements Countable.', -'http\Env\Request::current' => 'Implements iterator. -See http\Message::valid() and http\Message::rewind().', -'http\Env\Request::detach' => 'Detach a clone of this message from any message chain.', -'http\Env\Request::getBody' => 'Retrieve the message\'s body. -See http\Message::setBody().', -'http\Env\Request::getCookie' => 'Retrieve an URL query value ($_GET)', -'http\Env\Request::getFiles' => 'Retrieve the uploaded files list ($_FILES)', -'http\Env\Request::getForm' => 'Retrieve a form value ($_POST)', -'http\Env\Request::getHeader' => 'Retrieve a single header, optionally hydrated into a http\Header extending class.', -'http\Env\Request::getHeaders' => 'Retrieve all message headers. -See http\Message::setHeaders() and http\Message::getHeader().', -'http\Env\Request::getHttpVersion' => 'Retrieve the HTTP protocol version of the message. -See http\Message::setHttpVersion().', -'http\Env\Request::getInfo' => 'Retrieve the first line of a request or response message. -See http\Message::setInfo and also: - -* http\Message::getType() -* http\Message::getHttpVersion() -* http\Message::getResponseCode() -* http\Message::getResponseStatus() -* http\Message::getRequestMethod() -* http\Message::getRequestUrl()', -'http\Env\Request::getParentMessage' => 'Retrieve any parent message. -See http\Message::reverse().', -'http\Env\Request::getQuery' => 'Retrieve an URL query value ($_GET)', -'http\Env\Request::getRequestMethod' => 'Retrieve the request method of the message. -See http\Message::setRequestMethod() and http\Message::getRequestUrl().', -'http\Env\Request::getRequestUrl' => 'Retrieve the request URL of the message. -See http\Message::setRequestUrl().', -'http\Env\Request::getResponseCode' => 'Retrieve the response code of the message. -See http\Message::setResponseCode() and http\Message::getResponseStatus().', -'http\Env\Request::getResponseStatus' => 'Retrieve the response status of the message. -See http\Message::setResponseStatus() and http\Message::getResponseCode().', -'http\Env\Request::getType' => 'Retrieve the type of the message. -See http\Message::setType() and http\Message::getInfo().', -'http\Env\Request::isMultipart' => 'Check whether this message is a multipart message based on it\'s content type. -If the message is a multipart message and a reference $boundary is given, the boundary string of the multipart message will be stored in $boundary. - -See http\Message::splitMultipartBody().', -'http\Env\Request::key' => 'Implements Iterator. -See http\Message::current() and http\Message::rewind().', -'http\Env\Request::next' => 'Implements Iterator. -See http\Message::valid() and http\Message::rewind().', -'http\Env\Request::prepend' => 'Prepend message(s) $message to this message, or the top most message of this message chain. - -> ***NOTE:*** -> The message chains must not overlap.', -'http\Env\Request::reverse' => 'Reverse the message chain and return the former top-most message. - -> ***NOTE:*** -> Message chains are ordered in reverse-parsed order by default, i.e. the last parsed message is the message you\'ll receive from any call parsing HTTP messages. -> -> This call re-orders the messages of the chain and returns the message that was parsed first with any later parsed messages re-parentized.', -'http\Env\Request::rewind' => 'Implements Iterator.', -'http\Env\Request::serialize' => 'Implements Serializable.', -'http\Env\Request::setBody' => 'Set the message\'s body. -See http\Message::getBody() and http\Message::addBody().', -'http\Env\Request::setHeader' => 'Set a single header. -See http\Message::getHeader() and http\Message::addHeader(). - -> ***NOTE:*** -> Prior to v2.5.6/v3.1.0 headers with the same name were merged into a single -> header with values concatenated by comma.', -'http\Env\Request::setHeaders' => 'Set the message headers. -See http\Message::getHeaders() and http\Message::addHeaders(). - -> ***NOTE:*** -> Prior to v2.5.6/v3.1.0 headers with the same name were merged into a single -> header with values concatenated by comma.', -'http\Env\Request::setHttpVersion' => 'Set the HTTP protocol version of the message. -See http\Message::getHttpVersion().', -'http\Env\Request::setInfo' => 'Set the complete message info, i.e. type and response resp. request information, at once. -See http\Message::getInfo().', -'http\Env\Request::setRequestMethod' => 'Set the request method of the message. -See http\Message::getRequestMethod() and http\Message::setRequestUrl().', -'http\Env\Request::setRequestUrl' => 'Set the request URL of the message. -See http\Message::getRequestUrl() and http\Message::setRequestMethod().', -'http\Env\Request::setResponseCode' => 'Set the response status code. -See http\Message::getResponseCode() and http\Message::setResponseStatus(). - -> ***NOTE:*** -> This method also resets the response status phrase to the default for that code.', -'http\Env\Request::setResponseStatus' => 'Set the response status phrase. -See http\Message::getResponseStatus() and http\Message::setResponseCode().', -'http\Env\Request::setType' => 'Set the message type and reset the message info. -See http\Message::getType() and http\Message::setInfo().', -'http\Env\Request::splitMultipartBody' => 'Splits the body of a multipart message. -See http\Message::isMultipart() and http\Message\Body::addPart().', -'http\Env\Request::toCallback' => 'Stream the message through a callback.', -'http\Env\Request::toStream' => 'Stream the message into stream $stream, starting from $offset, streaming $maxlen at most.', -'http\Env\Request::toString' => 'Retrieve the message serialized to a string.', -'http\Env\Request::unserialize' => 'Implements Serializable.', -'http\Env\Request::valid' => 'Implements Iterator. -See http\Message::current() and http\Message::rewind().', -'http\Env\Response::__construct' => 'Create a new env response message instance.', -'http\Env\Response::__invoke' => 'Output buffer handler', -'http\Env\Response::__toString' => 'Retrieve the message serialized to a string. -Alias of http\Message::toString().', -'http\Env\Response::addBody' => 'Append the data of $body to the message\'s body. -See http\Message::setBody() and http\Message\Body::append().', -'http\Env\Response::addHeader' => 'Add an header, appending to already existing headers. -See http\Message::addHeaders() and http\Message::setHeader().', -'http\Env\Response::addHeaders' => 'Add headers, optionally appending values, if header keys already exist. -See http\Message::addHeader() and http\Message::setHeaders().', -'http\Env\Response::count' => 'Implements Countable.', -'http\Env\Response::current' => 'Implements iterator. -See http\Message::valid() and http\Message::rewind().', -'http\Env\Response::detach' => 'Detach a clone of this message from any message chain.', -'http\Env\Response::getBody' => 'Retrieve the message\'s body. -See http\Message::setBody().', -'http\Env\Response::getHeader' => 'Retrieve a single header, optionally hydrated into a http\Header extending class.', -'http\Env\Response::getHeaders' => 'Retrieve all message headers. -See http\Message::setHeaders() and http\Message::getHeader().', -'http\Env\Response::getHttpVersion' => 'Retrieve the HTTP protocol version of the message. -See http\Message::setHttpVersion().', -'http\Env\Response::getInfo' => 'Retrieve the first line of a request or response message. -See http\Message::setInfo and also: - -* http\Message::getType() -* http\Message::getHttpVersion() -* http\Message::getResponseCode() -* http\Message::getResponseStatus() -* http\Message::getRequestMethod() -* http\Message::getRequestUrl()', -'http\Env\Response::getParentMessage' => 'Retrieve any parent message. -See http\Message::reverse().', -'http\Env\Response::getRequestMethod' => 'Retrieve the request method of the message. -See http\Message::setRequestMethod() and http\Message::getRequestUrl().', -'http\Env\Response::getRequestUrl' => 'Retrieve the request URL of the message. -See http\Message::setRequestUrl().', -'http\Env\Response::getResponseCode' => 'Retrieve the response code of the message. -See http\Message::setResponseCode() and http\Message::getResponseStatus().', -'http\Env\Response::getResponseStatus' => 'Retrieve the response status of the message. -See http\Message::setResponseStatus() and http\Message::getResponseCode().', -'http\Env\Response::getType' => 'Retrieve the type of the message. -See http\Message::setType() and http\Message::getInfo().', -'http\Env\Response::isCachedByEtag' => 'Manually test the header $header_name of the environment\'s request for a cache hit. -http\Env\Response::send() checks that itself, though.', -'http\Env\Response::isCachedByLastModified' => 'Manually test the header $header_name of the environment\'s request for a cache hit. -http\Env\Response::send() checks that itself, though.', -'http\Env\Response::isMultipart' => 'Check whether this message is a multipart message based on it\'s content type. -If the message is a multipart message and a reference $boundary is given, the boundary string of the multipart message will be stored in $boundary. - -See http\Message::splitMultipartBody().', -'http\Env\Response::key' => 'Implements Iterator. -See http\Message::current() and http\Message::rewind().', -'http\Env\Response::next' => 'Implements Iterator. -See http\Message::valid() and http\Message::rewind().', -'http\Env\Response::prepend' => 'Prepend message(s) $message to this message, or the top most message of this message chain. - -> ***NOTE:*** -> The message chains must not overlap.', -'http\Env\Response::reverse' => 'Reverse the message chain and return the former top-most message. - -> ***NOTE:*** -> Message chains are ordered in reverse-parsed order by default, i.e. the last parsed message is the message you\'ll receive from any call parsing HTTP messages. -> -> This call re-orders the messages of the chain and returns the message that was parsed first with any later parsed messages re-parentized.', -'http\Env\Response::rewind' => 'Implements Iterator.', -'http\Env\Response::send' => 'Send the response through the SAPI or $stream', -'http\Env\Response::serialize' => 'Implements Serializable.', -'http\Env\Response::setBody' => 'Set the message\'s body. -See http\Message::getBody() and http\Message::addBody().', -'http\Env\Response::setCacheControl' => 'Make suggestions to the client how it should cache the response', -'http\Env\Response::setContentDisposition' => 'Set the response’s content disposition parameters', -'http\Env\Response::setContentEncoding' => 'Enable support for “Accept-Encoding” requests with deflate or gzip', -'http\Env\Response::setContentType' => 'Set the MIME content type of the response', -'http\Env\Response::setCookie' => 'Add cookies to the response to send', -'http\Env\Response::setEnvRequest' => 'Override the environment’s request', -'http\Env\Response::setEtag' => 'Override the environment’s request', -'http\Env\Response::setHeader' => 'Set a single header. -See http\Message::getHeader() and http\Message::addHeader(). - -> ***NOTE:*** -> Prior to v2.5.6/v3.1.0 headers with the same name were merged into a single -> header with values concatenated by comma.', -'http\Env\Response::setHeaders' => 'Set the message headers. -See http\Message::getHeaders() and http\Message::addHeaders(). - -> ***NOTE:*** -> Prior to v2.5.6/v3.1.0 headers with the same name were merged into a single -> header with values concatenated by comma.', -'http\Env\Response::setHttpVersion' => 'Set the HTTP protocol version of the message. -See http\Message::getHttpVersion().', -'http\Env\Response::setInfo' => 'Set the complete message info, i.e. type and response resp. request information, at once. -See http\Message::getInfo().', -'http\Env\Response::setLastModified' => 'Override the environment’s request', -'http\Env\Response::setRequestMethod' => 'Set the request method of the message. -See http\Message::getRequestMethod() and http\Message::setRequestUrl().', -'http\Env\Response::setRequestUrl' => 'Set the request URL of the message. -See http\Message::getRequestUrl() and http\Message::setRequestMethod().', -'http\Env\Response::setResponseCode' => 'Set the response status code. -See http\Message::getResponseCode() and http\Message::setResponseStatus(). - -> ***NOTE:*** -> This method also resets the response status phrase to the default for that code.', -'http\Env\Response::setResponseStatus' => 'Set the response status phrase. -See http\Message::getResponseStatus() and http\Message::setResponseCode().', -'http\Env\Response::setThrottleRate' => 'Override the environment’s request', -'http\Env\Response::setType' => 'Set the message type and reset the message info. -See http\Message::getType() and http\Message::setInfo().', -'http\Env\Response::splitMultipartBody' => 'Splits the body of a multipart message. -See http\Message::isMultipart() and http\Message\Body::addPart().', -'http\Env\Response::toCallback' => 'Stream the message through a callback.', -'http\Env\Response::toStream' => 'Stream the message into stream $stream, starting from $offset, streaming $maxlen at most.', -'http\Env\Response::toString' => 'Retrieve the message serialized to a string.', -'http\Env\Response::unserialize' => 'Implements Serializable.', -'http\Env\Response::valid' => 'Implements Iterator. -See http\Message::current() and http\Message::rewind().', -'http\Header::__construct' => 'Create an http\Header instance for use of simple matching or negotiation. If the value of the header is an array it may be compounded to a single comma separated string.', -'http\Header::__toString' => 'String cast handler. Alias of http\Header::serialize().', -'http\Header::getParams' => 'Create a parameter list out of the HTTP header value.', -'http\Header::match' => 'Match the HTTP header\'s value against provided $value according to $flags.', -'http\Header::negotiate' => 'Negotiate the header\'s value against a list of supported values in $supported. -Negotiation operation is adopted according to the header name, i.e. if the -header being negotiated is Accept, then a slash is used as primary type -separator, and if the header is Accept-Language respectively, a hyphen is -used instead. - -> ***NOTE:*** -> The first element of $supported serves as a default if no operand matches.', -'http\Header::parse' => 'Parse HTTP headers. -See also http\Header\Parser.', -'http\Header::serialize' => 'Implements Serializable.', -'http\Header::toString' => 'Convenience method. Alias of http\Header::serialize().', -'http\Header::unserialize' => 'Implements Serializable.', -'http\Header\Parser::getState' => 'Retrieve the current state of the parser. -See http\Header\Parser::STATE_* constants.', -'http\Header\Parser::parse' => 'Parse a string.', -'http\Header\Parser::stream' => 'Parse a stream.', -'http\Message::__construct' => 'Create a new HTTP message.', -'http\Message::__toString' => 'Retrieve the message serialized to a string. -Alias of http\Message::toString().', -'http\Message::addBody' => 'Append the data of $body to the message\'s body. -See http\Message::setBody() and http\Message\Body::append().', -'http\Message::addHeader' => 'Add an header, appending to already existing headers. -See http\Message::addHeaders() and http\Message::setHeader().', -'http\Message::addHeaders' => 'Add headers, optionally appending values, if header keys already exist. -See http\Message::addHeader() and http\Message::setHeaders().', -'http\Message::count' => 'Implements Countable.', -'http\Message::current' => 'Implements iterator. -See http\Message::valid() and http\Message::rewind().', -'http\Message::detach' => 'Detach a clone of this message from any message chain.', -'http\Message::getBody' => 'Retrieve the message\'s body. -See http\Message::setBody().', -'http\Message::getHeader' => 'Retrieve a single header, optionally hydrated into a http\Header extending class.', -'http\Message::getHeaders' => 'Retrieve all message headers. -See http\Message::setHeaders() and http\Message::getHeader().', -'http\Message::getHttpVersion' => 'Retrieve the HTTP protocol version of the message. -See http\Message::setHttpVersion().', -'http\Message::getInfo' => 'Retrieve the first line of a request or response message. -See http\Message::setInfo and also: - -* http\Message::getType() -* http\Message::getHttpVersion() -* http\Message::getResponseCode() -* http\Message::getResponseStatus() -* http\Message::getRequestMethod() -* http\Message::getRequestUrl()', -'http\Message::getParentMessage' => 'Retrieve any parent message. -See http\Message::reverse().', -'http\Message::getRequestMethod' => 'Retrieve the request method of the message. -See http\Message::setRequestMethod() and http\Message::getRequestUrl().', -'http\Message::getRequestUrl' => 'Retrieve the request URL of the message. -See http\Message::setRequestUrl().', -'http\Message::getResponseCode' => 'Retrieve the response code of the message. -See http\Message::setResponseCode() and http\Message::getResponseStatus().', -'http\Message::getResponseStatus' => 'Retrieve the response status of the message. -See http\Message::setResponseStatus() and http\Message::getResponseCode().', -'http\Message::getType' => 'Retrieve the type of the message. -See http\Message::setType() and http\Message::getInfo().', -'http\Message::isMultipart' => 'Check whether this message is a multipart message based on it\'s content type. -If the message is a multipart message and a reference $boundary is given, the boundary string of the multipart message will be stored in $boundary. - -See http\Message::splitMultipartBody().', -'http\Message::key' => 'Implements Iterator. -See http\Message::current() and http\Message::rewind().', -'http\Message::next' => 'Implements Iterator. -See http\Message::valid() and http\Message::rewind().', -'http\Message::prepend' => 'Prepend message(s) $message to this message, or the top most message of this message chain. - -> ***NOTE:*** -> The message chains must not overlap.', -'http\Message::reverse' => 'Reverse the message chain and return the former top-most message. - -> ***NOTE:*** -> Message chains are ordered in reverse-parsed order by default, i.e. the last parsed message is the message you\'ll receive from any call parsing HTTP messages. -> -> This call re-orders the messages of the chain and returns the message that was parsed first with any later parsed messages re-parentized.', -'http\Message::rewind' => 'Implements Iterator.', -'http\Message::serialize' => 'Implements Serializable.', -'http\Message::setBody' => 'Set the message\'s body. -See http\Message::getBody() and http\Message::addBody().', -'http\Message::setHeader' => 'Set a single header. -See http\Message::getHeader() and http\Message::addHeader(). - -> ***NOTE:*** -> Prior to v2.5.6/v3.1.0 headers with the same name were merged into a single -> header with values concatenated by comma.', -'http\Message::setHeaders' => 'Set the message headers. -See http\Message::getHeaders() and http\Message::addHeaders(). - -> ***NOTE:*** -> Prior to v2.5.6/v3.1.0 headers with the same name were merged into a single -> header with values concatenated by comma.', -'http\Message::setHttpVersion' => 'Set the HTTP protocol version of the message. -See http\Message::getHttpVersion().', -'http\Message::setInfo' => 'Set the complete message info, i.e. type and response resp. request information, at once. -See http\Message::getInfo().', -'http\Message::setRequestMethod' => 'Set the request method of the message. -See http\Message::getRequestMethod() and http\Message::setRequestUrl().', -'http\Message::setRequestUrl' => 'Set the request URL of the message. -See http\Message::getRequestUrl() and http\Message::setRequestMethod().', -'http\Message::setResponseCode' => 'Set the response status code. -See http\Message::getResponseCode() and http\Message::setResponseStatus(). - -> ***NOTE:*** -> This method also resets the response status phrase to the default for that code.', -'http\Message::setResponseStatus' => 'Set the response status phrase. -See http\Message::getResponseStatus() and http\Message::setResponseCode().', -'http\Message::setType' => 'Set the message type and reset the message info. -See http\Message::getType() and http\Message::setInfo().', -'http\Message::splitMultipartBody' => 'Splits the body of a multipart message. -See http\Message::isMultipart() and http\Message\Body::addPart().', -'http\Message::toCallback' => 'Stream the message through a callback.', -'http\Message::toStream' => 'Stream the message into stream $stream, starting from $offset, streaming $maxlen at most.', -'http\Message::toString' => 'Retrieve the message serialized to a string.', -'http\Message::unserialize' => 'Implements Serializable.', -'http\Message::valid' => 'Implements Iterator. -See http\Message::current() and http\Message::rewind().', -'http\Message\Body::__construct' => 'Create a new message body, optionally referencing $stream.', -'http\Message\Body::__toString' => 'String cast handler.', -'http\Message\Body::addForm' => 'Add form fields and files to the message body. - -> ***NOTE:*** -> Currently, http\Message\Body::addForm() creates "multipart/form-data" bodies.', -'http\Message\Body::addPart' => 'Add a part to a multipart body.', -'http\Message\Body::append' => 'Append plain bytes to the message body.', -'http\Message\Body::etag' => 'Retrieve the ETag of the body.', -'http\Message\Body::getBoundary' => 'Retrieve any boundary of the message body. -See http\Message::splitMultipartBody().', -'http\Message\Body::getResource' => 'Retrieve the underlying stream resource.', -'http\Message\Body::serialize' => 'Implements Serializable. -Alias of http\Message\Body::__toString().', -'http\Message\Body::stat' => 'Stat size, atime, mtime and/or ctime.', -'http\Message\Body::toCallback' => 'Stream the message body through a callback.', -'http\Message\Body::toStream' => 'Stream the message body into another stream $stream, starting from $offset, streaming $maxlen at most.', -'http\Message\Body::toString' => 'Retrieve the message body serialized to a string. -Alias of http\Message\Body::__toString().', -'http\Message\Body::unserialize' => 'Implements Serializable.', -'http\Message\Parser::getState' => 'Retrieve the current state of the parser. -See http\Message\Parser::STATE_* constants.', -'http\Message\Parser::parse' => 'Parse a string.', -'http\Message\Parser::stream' => 'Parse a stream.', -'http\Params::__construct' => 'Instantiate a new HTTP (header) parameter set.', -'http\Params::__toString' => 'String cast handler. Alias of http\Params::toString(). -Returns a stringified version of the parameters.', -'http\Params::offsetExists' => 'Implements ArrayAccess.', -'http\Params::offsetGet' => 'Implements ArrayAccess.', -'http\Params::offsetSet' => 'Implements ArrayAccess.', -'http\Params::offsetUnset' => 'Implements ArrayAccess.', -'http\Params::toArray' => 'Convenience method that simply returns http\Params::$params.', -'http\Params::toString' => 'Returns a stringified version of the parameters.', -'http\QueryString::__construct' => 'QueryString constructor.', -'http\QueryString::__toString' => 'Get the string representation of the querystring (x-www-form-urlencoded).', -'http\QueryString::get' => 'Retrieve an querystring value', -'http\QueryString::getArray' => 'Retrieve an array value at offset $name', -'http\QueryString::getBool' => 'Retrieve an array value at offset $name', -'http\QueryString::getFloat' => 'Retrieve an array value at offset $name', -'http\QueryString::getGlobalInstance' => 'Retrieve the global querystring instance referencing $_GET', -'http\QueryString::getInt' => 'Retrieve an array value at offset $name', -'http\QueryString::getIterator' => 'Implements IteratorAggregate.', -'http\QueryString::getObject' => 'Retrieve an array value at offset $name', -'http\QueryString::getString' => 'Retrieve an array value at offset $name', -'http\QueryString::mod' => 'Set additional $params to a clone of this instance', -'http\QueryString::offsetExists' => 'Implements ArrayAccess.', -'http\QueryString::offsetGet' => 'Implements ArrayAccess.', -'http\QueryString::offsetSet' => 'Implements ArrayAccess.', -'http\QueryString::offsetUnset' => 'Implements ArrayAccess.', -'http\QueryString::serialize' => 'Implements Serializable. -See http\QueryString::toString().', -'http\QueryString::set' => 'Set additional querystring entries', -'http\QueryString::toArray' => 'Returns http\QueryString::$queryArray', -'http\QueryString::toString' => 'Get the string representation of the querystring (x-www-form-urlencoded)', -'http\QueryString::unserialize' => 'Implements Serializable.', -'http\QueryString::xlate' => 'Translate character encodings of the querystring with ext/iconv', -'http\Url::__construct' => 'Url constructor.', -'http\Url::__toString' => 'Alias of Url::toString()', -'http\Url::mod' => 'Clone this URL and apply $parts to the cloned URL', -'http\Url::toArray' => 'Retrieve the URL parts as array', -'http\Url::toString' => 'Get the string prepresentation of the URL', -'http_build_query' => 'Generate URL-encoded query string', -'http_response_code' => 'Get or Set the HTTP response code', -'HttpDeflateStream::__construct' => 'HttpDeflateStream class constructor', -'HttpDeflateStream::factory' => 'HttpDeflateStream class factory', -'HttpDeflateStream::finish' => 'Finalize deflate stream', -'HttpDeflateStream::flush' => 'Flush deflate stream', -'HttpDeflateStream::update' => 'Update deflate stream', -'HttpInflateStream::__construct' => 'HttpInflateStream class constructor', -'HttpInflateStream::factory' => 'HttpInflateStream class factory', -'HttpInflateStream::finish' => 'Finalize inflate stream', -'HttpInflateStream::flush' => 'Flush inflate stream', -'HttpInflateStream::update' => 'Update inflate stream', -'HttpMessage::__construct' => 'HttpMessage constructor', -'HttpMessage::addHeaders' => 'Add headers', -'HttpMessage::detach' => 'Detach HttpMessage', -'HttpMessage::factory' => 'Create HttpMessage from string', -'HttpMessage::fromEnv' => 'Create HttpMessage from environment', -'HttpMessage::fromString' => 'Create HttpMessage from string', -'HttpMessage::getBody' => 'Get message body', -'HttpMessage::getHeader' => 'Get header', -'HttpMessage::getHeaders' => 'Get message headers', -'HttpMessage::getHttpVersion' => 'Get HTTP version', -'HttpMessage::getParentMessage' => 'Get parent message', -'HttpMessage::getRequestMethod' => 'Get request method', -'HttpMessage::getRequestUrl' => 'Get request URL', -'HttpMessage::getResponseCode' => 'Get response code', -'HttpMessage::getResponseStatus' => 'Get response status', -'HttpMessage::getType' => 'Get message type', -'HttpMessage::guessContentType' => 'Guess content type', -'HttpMessage::prepend' => 'Prepend message(s)', -'HttpMessage::reverse' => 'Reverse message chain', -'HttpMessage::send' => 'Send message', -'HttpMessage::setBody' => 'Set message body', -'HttpMessage::setHeaders' => 'Set headers', -'HttpMessage::setHttpVersion' => 'Set HTTP version', -'HttpMessage::setRequestMethod' => 'Set request method', -'HttpMessage::setRequestUrl' => 'Set request URL', -'HttpMessage::setResponseCode' => 'Set response code', -'HttpMessage::setResponseStatus' => 'Set response status', -'HttpMessage::setType' => 'Set message type', -'HttpMessage::toMessageTypeObject' => 'Create HTTP object regarding message type', -'HttpMessage::toString' => 'Get string representation', -'HttpQueryString::__construct' => 'HttpQueryString constructor', -'HttpQueryString::get' => 'Get (part of) query string', -'HttpQueryString::mod' => 'Modify query string copy', -'HttpQueryString::offsetExists' => 'Whether a offset exists', -'HttpQueryString::offsetGet' => 'Offset to retrieve', -'HttpQueryString::offsetSet' => 'Offset to set', -'HttpQueryString::offsetUnset' => 'Offset to unset', -'HttpQueryString::serialize' => 'String representation of object', -'HttpQueryString::set' => 'Set query string params', -'HttpQueryString::singleton' => 'HttpQueryString singleton', -'HttpQueryString::toArray' => 'Get query string as array', -'HttpQueryString::toString' => 'Get query string', -'HttpQueryString::unserialize' => 'Constructs the object', -'HttpQueryString::xlate' => 'Change query strings charset', -'HttpRequest::__construct' => 'HttpRequest constructor', -'HttpRequest::addCookies' => 'Add cookies', -'HttpRequest::addHeaders' => 'Add headers', -'HttpRequest::addPostFields' => 'Add post fields', -'HttpRequest::addPostFile' => 'Add post file', -'HttpRequest::addPutData' => 'Add put data', -'HttpRequest::addQueryData' => 'Add query data', -'HttpRequest::addRawPostData' => 'Add raw post data', -'HttpRequest::addSslOptions' => 'Add ssl options', -'HttpRequest::clearHistory' => 'Clear history', -'HttpRequest::enableCookies' => 'Enable cookies', -'HttpRequest::getContentType' => 'Get content type', -'HttpRequest::getCookies' => 'Get cookies', -'HttpRequest::getHeaders' => 'Get headers', -'HttpRequest::getHistory' => 'Get history', -'HttpRequest::getMethod' => 'Get method', -'HttpRequest::getOptions' => 'Get options', -'HttpRequest::getPostFields' => 'Get post fields', -'HttpRequest::getPostFiles' => 'Get post files', -'HttpRequest::getPutData' => 'Get put data', -'HttpRequest::getPutFile' => 'Get put file', -'HttpRequest::getQueryData' => 'Get query data', -'HttpRequest::getRawPostData' => 'Get raw post data', -'HttpRequest::getRawRequestMessage' => 'Get raw request message', -'HttpRequest::getRawResponseMessage' => 'Get raw response message', -'HttpRequest::getRequestMessage' => 'Get request message', -'HttpRequest::getResponseBody' => 'Get response body', -'HttpRequest::getResponseCode' => 'Get response code', -'HttpRequest::getResponseCookies' => 'Get response cookie(s)', -'HttpRequest::getResponseData' => 'Get response data', -'HttpRequest::getResponseHeader' => 'Get response header(s)', -'HttpRequest::getResponseInfo' => 'Get response info', -'HttpRequest::getResponseMessage' => 'Get response message', -'HttpRequest::getResponseStatus' => 'Get response status', -'HttpRequest::getSslOptions' => 'Get ssl options', -'HttpRequest::getUrl' => 'Get url', -'HttpRequest::resetCookies' => 'Reset cookies', -'HttpRequest::send' => 'Send request', -'HttpRequest::setContentType' => 'Set content type', -'HttpRequest::setCookies' => 'Set cookies', -'HttpRequest::setHeaders' => 'Set headers', -'HttpRequest::setMethod' => 'Set method', -'HttpRequest::setOptions' => 'Set options', -'HttpRequest::setPostFields' => 'Set post fields', -'HttpRequest::setPostFiles' => 'Set post files', -'HttpRequest::setPutData' => 'Set put data', -'HttpRequest::setPutFile' => 'Set put file', -'HttpRequest::setQueryData' => 'Set query data', -'HttpRequest::setRawPostData' => 'Set raw post data', -'HttpRequest::setSslOptions' => 'Set ssl options', -'HttpRequest::setUrl' => 'Set URL', -'HttpRequestPool::__construct' => 'HttpRequestPool constructor', -'HttpRequestPool::__destruct' => 'HttpRequestPool destructor', -'HttpRequestPool::attach' => 'Attach HttpRequest', -'HttpRequestPool::detach' => 'Detach HttpRequest', -'HttpRequestPool::getAttachedRequests' => 'Get attached requests', -'HttpRequestPool::getFinishedRequests' => 'Get finished requests', -'HttpRequestPool::reset' => 'Reset request pool', -'HttpRequestPool::send' => 'Send all requests', -'HttpRequestPool::socketPerform' => 'Perform socket actions', -'HttpRequestPool::socketSelect' => 'Perform socket select', -'HttpResponse::capture' => 'Capture script output', -'HttpResponse::getBufferSize' => 'Get buffer size', -'HttpResponse::getCache' => 'Get cache', -'HttpResponse::getCacheControl' => 'Get cache control', -'HttpResponse::getContentDisposition' => 'Get content disposition', -'HttpResponse::getContentType' => 'Get content type', -'HttpResponse::getData' => 'Get data', -'HttpResponse::getETag' => 'Get ETag', -'HttpResponse::getFile' => 'Get file', -'HttpResponse::getGzip' => 'Get gzip', -'HttpResponse::getHeader' => 'Get header', -'HttpResponse::getLastModified' => 'Get last modified', -'HttpResponse::getRequestBody' => 'Get request body', -'HttpResponse::getRequestBodyStream' => 'Get request body stream', -'HttpResponse::getRequestHeaders' => 'Get request headers', -'HttpResponse::getStream' => 'Get Stream', -'HttpResponse::getThrottleDelay' => 'Get throttle delay', -'HttpResponse::guessContentType' => 'Guess content type', -'HttpResponse::redirect' => 'Redirect', -'HttpResponse::send' => 'Send response', -'HttpResponse::setBufferSize' => 'Set buffer size', -'HttpResponse::setCache' => 'Set cache', -'HttpResponse::setCacheControl' => 'Set cache control', -'HttpResponse::setContentDisposition' => 'Set content disposition', -'HttpResponse::setContentType' => 'Set content type', -'HttpResponse::setData' => 'Set data', -'HttpResponse::setETag' => 'Set ETag', -'HttpResponse::setFile' => 'Set file', -'HttpResponse::setGzip' => 'Set gzip', -'HttpResponse::setHeader' => 'Set header', -'HttpResponse::setLastModified' => 'Set last modified', -'HttpResponse::setStream' => 'Set stream', -'HttpResponse::setThrottleDelay' => 'Set throttle delay', -'HttpResponse::status' => 'Send HTTP response status', -'hw_api::checkin' => 'Checks in an object', -'hw_api::checkout' => 'Checks out an object', -'hw_api::children' => 'Returns children of an object', -'hw_api::content' => 'Returns content of an object', -'hw_api::copy' => 'Copies physically', -'hw_api::dbstat' => 'Returns statistics about database server', -'hw_api::dcstat' => 'Returns statistics about document cache server', -'hw_api::dstanchors' => 'Returns a list of all destination anchors', -'hw_api::dstofsrcanchor' => 'Returns destination of a source anchor', -'hw_api::find' => 'Search for objects', -'hw_api::ftstat' => 'Returns statistics about fulltext server', -'hw_api::hwstat' => 'Returns statistics about Hyperwave server', -'hw_api::identify' => 'Log into Hyperwave Server', -'hw_api::info' => 'Returns information about server configuration', -'hw_api::insert' => 'Inserts a new object', -'hw_api::insertanchor' => 'Inserts a new object of type anchor', -'hw_api::insertcollection' => 'Inserts a new object of type collection', -'hw_api::insertdocument' => 'Inserts a new object of type document', -'hw_api::link' => 'Creates a link to an object', -'hw_api::lock' => 'Locks an object', -'hw_api::move' => 'Moves object between collections', -'hw_api::object' => 'Retrieve attribute information', -'hw_api::objectbyanchor' => 'Returns the object an anchor belongs to', -'hw_api::parents' => 'Returns parents of an object', -'hw_api::remove' => 'Delete an object', -'hw_api::replace' => 'Replaces an object', -'hw_api::setcommittedversion' => 'Commits version other than last version', -'hw_api::srcanchors' => 'Returns a list of all source anchors', -'hw_api::srcsofdst' => 'Returns source of a destination object', -'hw_api::unlock' => 'Unlocks a locked object', -'hw_api::user' => 'Returns the own user object', -'hw_api::userlist' => 'Returns a list of all logged in users', -'hw_api_attribute::key' => 'Returns key of the attribute', -'hw_api_attribute::langdepvalue' => 'Returns value for a given language', -'hw_api_attribute::value' => 'Returns value of the attribute', -'hw_api_attribute::values' => 'Returns all values of the attribute', -'hw_api_content::mimetype' => 'Returns mimetype', -'hw_api_content::read' => 'Read content', -'hw_api_error::count' => 'Returns number of reasons', -'hw_api_error::reason' => 'Returns reason of error', -'hw_api_object::assign' => 'Clones object', -'hw_api_object::attreditable' => 'Checks whether an attribute is editable', -'hw_api_object::count' => 'Returns number of attributes', -'hw_api_object::insert' => 'Inserts new attribute', -'hw_api_object::remove' => 'Removes attribute', -'hw_api_object::title' => 'Returns the title attribute', -'hw_api_object::value' => 'Returns value of attribute', -'hw_api_reason::description' => 'Returns description of reason', -'hw_api_reason::type' => 'Returns type of reason', -'hwapi_attribute_new' => 'Creates instance of class hw_api_attribute', -'hwapi_content_new' => 'Create new instance of class hw_api_content', -'hwapi_hgcsp' => 'Returns object of class hw_api', -'hwapi_object_new' => 'Creates a new instance of class hwapi_object_new', -'hypot' => 'Calculate the length of the hypotenuse of a right-angle triangle', -'ibase_add_user' => 'Add a user to a security database', -'ibase_affected_rows' => 'Return the number of rows that were affected by the previous query', -'ibase_backup' => 'Initiates a backup task in the service manager and returns immediately', -'ibase_blob_add' => 'Add data into a newly created blob', -'ibase_blob_cancel' => 'Cancel creating blob', -'ibase_blob_close' => 'Close blob', -'ibase_blob_create' => 'Create a new blob for adding data', -'ibase_blob_echo' => 'Output blob contents to browser', -'ibase_blob_get' => 'Get len bytes data from open blob', -'ibase_blob_import' => 'Create blob, copy file in it, and close it', -'ibase_blob_info' => 'Return blob length and other useful info', -'ibase_blob_open' => 'Open blob for retrieving data parts', -'ibase_close' => 'Close a connection to an InterBase database', -'ibase_commit' => 'Commit a transaction', -'ibase_commit_ret' => 'Commit a transaction without closing it', -'ibase_connect' => 'Open a connection to a database', -'ibase_db_info' => 'Request statistics about a database', -'ibase_delete_user' => 'Delete a user from a security database', -'ibase_drop_db' => 'Drops a database', -'ibase_errcode' => 'Return an error code', -'ibase_errmsg' => 'Return error messages', -'ibase_execute' => 'Execute a previously prepared query', -'ibase_fetch_assoc' => 'Fetch a result row from a query as an associative array', -'ibase_fetch_object' => 'Get an object from a InterBase database', -'ibase_fetch_row' => 'Fetch a row from an InterBase database', -'ibase_field_info' => 'Get information about a field', -'ibase_free_event_handler' => 'Cancels a registered event handler', -'ibase_free_query' => 'Free memory allocated by a prepared query', -'ibase_free_result' => 'Free a result set', -'ibase_gen_id' => 'Increments the named generator and returns its new value', -'ibase_maintain_db' => 'Execute a maintenance command on the database server', -'ibase_modify_user' => 'Modify a user to a security database', -'ibase_name_result' => 'Assigns a name to a result set', -'ibase_num_fields' => 'Get the number of fields in a result set', -'ibase_num_params' => 'Return the number of parameters in a prepared query', -'ibase_param_info' => 'Return information about a parameter in a prepared query', -'ibase_pconnect' => 'Open a persistent connection to an InterBase database', -'ibase_prepare' => 'Prepare a query for later binding of parameter placeholders and execution', -'ibase_query' => 'Execute a query on an InterBase database', -'ibase_restore' => 'Initiates a restore task in the service manager and returns immediately', -'ibase_rollback' => 'Roll back a transaction', -'ibase_rollback_ret' => 'Roll back a transaction without closing it', -'ibase_server_info' => 'Request information about a database server', -'ibase_service_attach' => 'Connect to the service manager', -'ibase_service_detach' => 'Disconnect from the service manager', -'ibase_set_event_handler' => 'Register a callback function to be called when events are posted', -'ibase_trans' => 'Begin a transaction', -'ibase_wait_event' => 'Wait for an event to be posted by the database', -'iconv' => 'Convert string to requested character encoding', -'iconv_get_encoding' => 'Retrieve internal configuration variables of iconv extension', -'iconv_mime_decode' => 'Decodes a MIME header field', -'iconv_mime_decode_headers' => 'Decodes multiple MIME header fields at once', -'iconv_mime_encode' => 'Composes a MIME header field', -'iconv_set_encoding' => 'Set current setting for character encoding conversion', -'iconv_strlen' => 'Returns the character count of string', -'iconv_strpos' => 'Finds position of first occurrence of a needle within a haystack', -'iconv_strrpos' => 'Finds the last occurrence of a needle within a haystack', -'iconv_substr' => 'Cut out part of a string', -'id3_get_frame_long_name' => 'Get the long name of an ID3v2 frame', -'id3_get_frame_short_name' => 'Get the short name of an ID3v2 frame', -'id3_get_genre_id' => 'Get the id for a genre', -'id3_get_genre_list' => 'Get all possible genre values', -'id3_get_genre_name' => 'Get the name for a genre id', -'id3_get_tag' => 'Get all information stored in an ID3 tag', -'id3_get_version' => 'Get version of an ID3 tag', -'id3_remove_tag' => 'Remove an existing ID3 tag', -'id3_set_tag' => 'Update information stored in an ID3 tag', -'idate' => 'Format a local time/date as integer', -'ifx_affected_rows' => 'Get number of rows affected by a query', -'ifx_blobinfile_mode' => 'Set the default blob mode for all select queries', -'ifx_byteasvarchar' => 'Set the default byte mode', -'ifx_close' => 'Close Informix connection', -'ifx_connect' => 'Open Informix server connection', -'ifx_copy_blob' => 'Duplicates the given blob object', -'ifx_create_blob' => 'Creates an blob object', -'ifx_create_char' => 'Creates an char object', -'ifx_do' => 'Execute a previously prepared SQL-statement', -'ifx_error' => 'Returns error code of last Informix call', -'ifx_errormsg' => 'Returns error message of last Informix call', -'ifx_fetch_row' => 'Get row as an associative array', -'ifx_fieldproperties' => 'List of SQL fieldproperties', -'ifx_fieldtypes' => 'List of Informix SQL fields', -'ifx_free_blob' => 'Deletes the blob object', -'ifx_free_char' => 'Deletes the char object', -'ifx_free_result' => 'Releases resources for the query', -'ifx_get_blob' => 'Return the content of a blob object', -'ifx_get_char' => 'Return the content of the char object', -'ifx_getsqlca' => 'Get the contents of sqlca.sqlerrd[0..5] after a query', -'ifx_htmltbl_result' => 'Formats all rows of a query into a HTML table', -'ifx_nullformat' => 'Sets the default return value on a fetch row', -'ifx_num_fields' => 'Returns the number of columns in the query', -'ifx_num_rows' => 'Count the rows already fetched from a query', -'ifx_pconnect' => 'Open persistent Informix connection', -'ifx_prepare' => 'Prepare an SQL-statement for execution', -'ifx_query' => 'Send Informix query', -'ifx_textasvarchar' => 'Set the default text mode', -'ifx_update_blob' => 'Updates the content of the blob object', -'ifx_update_char' => 'Updates the content of the char object', -'ifxus_close_slob' => 'Deletes the slob object', -'ifxus_create_slob' => 'Creates an slob object and opens it', -'ifxus_free_slob' => 'Deletes the slob object', -'ifxus_open_slob' => 'Opens an slob object', -'ifxus_read_slob' => 'Reads nbytes of the slob object', -'ifxus_seek_slob' => 'Sets the current file or seek position', -'ifxus_tell_slob' => 'Returns the current file or seek position', -'ifxus_write_slob' => 'Writes a string into the slob object', -'ignore_user_abort' => 'Set whether a client disconnect should abort script execution', -'iis_add_server' => 'Creates a new virtual web server', -'iis_get_dir_security' => 'Gets Directory Security', -'iis_get_script_map' => 'Gets script mapping on a virtual directory for a specific extension', -'iis_get_server_by_comment' => 'Return the instance number associated with the Comment', -'iis_get_server_by_path' => 'Return the instance number associated with the Path', -'iis_get_server_rights' => 'Gets server rights', -'iis_get_service_state' => 'Returns the state for the service defined by ServiceId', -'iis_remove_server' => 'Removes the virtual web server indicated by ServerInstance', -'iis_set_app_settings' => 'Creates application scope for a virtual directory', -'iis_set_dir_security' => 'Sets Directory Security', -'iis_set_script_map' => 'Sets script mapping on a virtual directory', -'iis_set_server_rights' => 'Sets server rights', -'iis_start_server' => 'Starts the virtual web server', -'iis_start_service' => 'Starts the service defined by ServiceId', -'iis_stop_server' => 'Stops the virtual web server', -'iis_stop_service' => 'Stops the service defined by ServiceId', -'image2wbmp' => '`gd.image.output`', -'image_type_to_extension' => 'Get file extension for image type', -'image_type_to_mime_type' => 'Get Mime-Type for image-type returned by getimagesize, exif_read_data, exif_thumbnail, exif_imagetype', -'imageaffine' => 'Return an image containing the affine transformed src image, using an optional clipping area', -'imageaffinematrixconcat' => 'Concatenate two affine transformation matrices', -'imageaffinematrixget' => 'Get an affine transformation matrix', -'imagealphablending' => 'Set the blending mode for an image', -'imageantialias' => 'Should antialias functions be used or not', -'imagearc' => 'Draws an arc', -'imagebmp' => 'Output a BMP image to browser or file', -'imagechar' => 'Draw a character horizontally', -'imagecharup' => 'Draw a character vertically', -'imagecolorallocate' => 'Allocate a color for an image', -'imagecolorallocatealpha' => 'Allocate a color for an image', -'imagecolorat' => 'Get the index of the color of a pixel', -'imagecolorclosest' => 'Get the index of the closest color to the specified color', -'imagecolorclosestalpha' => 'Get the index of the closest color to the specified color + alpha', -'imagecolorclosesthwb' => 'Get the index of the color which has the hue, white and blackness', -'imagecolordeallocate' => 'De-allocate a color for an image', -'imagecolorexact' => 'Get the index of the specified color', -'imagecolorexactalpha' => 'Get the index of the specified color + alpha', -'imagecolormatch' => 'Makes the colors of the palette version of an image more closely match the true color version', -'imagecolorresolve' => 'Get the index of the specified color or its closest possible alternative', -'imagecolorresolvealpha' => 'Get the index of the specified color + alpha or its closest possible alternative', -'imagecolorset' => 'Set the color for the specified palette index', -'imagecolorsforindex' => 'Get the colors for an index', -'imagecolorstotal' => 'Find out the number of colors in an image\'s palette', -'imagecolortransparent' => 'Define a color as transparent', -'imageconvolution' => 'Apply a 3x3 convolution matrix, using coefficient and offset', -'imagecopy' => 'Copy part of an image', -'imagecopymerge' => 'Copy and merge part of an image', -'imagecopymergegray' => 'Copy and merge part of an image with gray scale', -'imagecopyresampled' => 'Copy and resize part of an image with resampling', -'imagecopyresized' => 'Copy and resize part of an image', -'imagecreate' => 'Create a new palette based image', -'imagecreatefrombmp' => '`gd.image.new`', -'imagecreatefromgd' => 'Create a new image from GD file or URL', -'imagecreatefromgd2' => 'Create a new image from GD2 file or URL', -'imagecreatefromgd2part' => 'Create a new image from a given part of GD2 file or URL', -'imagecreatefromgif' => '`gd.image.new`', -'imagecreatefromjpeg' => '`gd.image.new`', -'imagecreatefrompng' => '`gd.image.new`', -'imagecreatefromstring' => 'Create a new image from the image stream in the string', -'imagecreatefromwbmp' => '`gd.image.new`', -'imagecreatefromwebp' => '`gd.image.new`', -'imagecreatefromxbm' => '`gd.image.new`', -'imagecreatefromxpm' => '`gd.image.new`', -'imagecreatetruecolor' => 'Create a new true color image', -'imagecrop' => 'Crop an image to the given rectangle', -'imagecropauto' => 'Crop an image automatically using one of the available modes', -'imagedashedline' => 'Draw a dashed line', -'imagedestroy' => 'Destroy an image', -'imageellipse' => 'Draw an ellipse', -'imagefill' => 'Flood fill', -'imagefilledarc' => 'Draw a partial arc and fill it', -'imagefilledellipse' => 'Draw a filled ellipse', -'imagefilledpolygon' => 'Draw a filled polygon', -'imagefilledrectangle' => 'Draw a filled rectangle', -'imagefilltoborder' => 'Flood fill to specific color', -'imagefilter' => 'Applies a filter to an image', -'imageflip' => 'Flips an image using a given mode', -'imagefontheight' => 'Get font height', -'imagefontwidth' => 'Get font width', -'imageftbbox' => 'Give the bounding box of a text using fonts via freetype2', -'imagefttext' => 'Write text to the image using fonts using FreeType 2', -'imagegammacorrect' => 'Apply a gamma correction to a GD image', -'imagegd' => 'Output GD image to browser or file', -'imagegd2' => 'Output GD2 image to browser or file', -'imagegetclip' => 'Get the clipping rectangle', -'imagegif' => '`gd.image.output`', -'imagegrabscreen' => 'Captures the whole screen', -'imagegrabwindow' => 'Captures a window', -'imageinterlace' => 'Enable or disable interlace', -'imageistruecolor' => 'Finds whether an image is a truecolor image', -'imagejpeg' => '`gd.image.output`', -'imagelayereffect' => 'Set the alpha blending flag to use layering effects', -'imageline' => 'Draw a line', -'imageloadfont' => 'Load a new font', -'imageObj::pasteImage' => 'Copy srcImg on top of the current imageObj. -transparentColorHex is the color (in 0xrrggbb format) from srcImg -that should be considered transparent (i.e. those pixels won\'t -be copied). Pass -1 if you don\'t want any transparent color. -If optional dstx,dsty are provided then it defines the position -where the image should be copied (dstx,dsty = top-left corner -position). -The optional angle is a value between 0 and 360 degrees to rotate -the source image counterclockwise. Note that if an angle is specified -(even if its value is zero) then the dstx and dsty coordinates -specify the CENTER of the destination area. -Note: this function works only with 8 bits GD images (PNG or GIF).', -'imageObj::saveImage' => 'Writes image object to specified filename. -Passing no filename or an empty filename sends output to stdout. In -this case, the PHP header() function should be used to set the -document\'s content-type prior to calling saveImage(). The output -format is the one that is currently selected in the map file. The -second argument oMap is not manadatory. It is usful when saving to -formats like GTIFF that needs georeference information contained in -the map file. On success, it returns either MS_SUCCESS if writing to an -external file, or the number of bytes written if output is sent to -stdout.', -'imageObj::saveWebImage' => 'Writes image to temp directory. Returns image URL. -The output format is the one that is currently selected in the -map file.', -'imageopenpolygon' => 'Draws an open polygon', -'imagepalettecopy' => 'Copy the palette from one image to another', -'imagepalettetotruecolor' => 'Converts a palette based image to true color', -'imagepng' => 'Output a PNG image to either the browser or a file', -'imagepolygon' => 'Draws a polygon', -'imagepsbbox' => 'Give the bounding box of a text rectangle using PostScript Type1 fonts', -'imagepsencodefont' => 'Change the character encoding vector of a font', -'imagepsextendfont' => 'Extend or condense a font', -'imagepsfreefont' => 'Free memory used by a PostScript Type 1 font', -'imagepsloadfont' => 'Load a PostScript Type 1 font from file', -'imagepsslantfont' => 'Slant a font', -'imagepstext' => 'Draws a text over an image using PostScript Type1 fonts', -'imagerectangle' => 'Draw a rectangle', -'imageresolution' => 'Get or set the resolution of the image', -'imagerotate' => 'Rotate an image with a given angle', -'imagesavealpha' => 'Whether to retain full alpha channel information when saving PNG images', -'imagescale' => 'Scale an image using the given new width and height', -'imagesetbrush' => 'Set the brush image for line drawing', -'imagesetclip' => 'Set the clipping rectangle', -'imagesetinterpolation' => 'Set the interpolation method', -'imagesetpixel' => 'Set a single pixel', -'imagesetstyle' => 'Set the style for line drawing', -'imagesetthickness' => 'Set the thickness for line drawing', -'imagesettile' => 'Set the tile image for filling', -'imagestring' => 'Draw a string horizontally', -'imagestringup' => 'Draw a string vertically', -'imagesx' => 'Get image width', -'imagesy' => 'Get image height', -'imagetruecolortopalette' => 'Convert a true color image to a palette image', -'imagettfbbox' => 'Give the bounding box of a text using TrueType fonts', -'imagettftext' => 'Write text to the image using TrueType fonts', -'imagetypes' => 'Return the image types supported by this PHP build', -'imagewbmp' => '`gd.image.output`', -'imagewebp' => 'Output a WebP image to browser or file', -'imagexbm' => 'Output an XBM image to browser or file', -'imagick::__construct' => 'The Imagick constructor', -'imagick::__toString' => 'Returns the image as a string', -'imagick::adaptiveBlurImage' => 'Adds adaptive blur filter to image', -'imagick::adaptiveResizeImage' => 'Adaptively resize image with data dependent triangulation', -'imagick::adaptiveSharpenImage' => 'Adaptively sharpen the image', -'imagick::adaptiveThresholdImage' => 'Selects a threshold for each pixel based on a range of intensity', -'imagick::addImage' => 'Adds new image to Imagick object image list', -'imagick::addNoiseImage' => 'Adds random noise to the image', -'imagick::affineTransformImage' => 'Transforms an image', -'imagick::animateImages' => 'Animates an image or images', -'imagick::annotateImage' => 'Annotates an image with text', -'imagick::appendImages' => 'Append a set of images', -'Imagick::autoGammaImage' => 'Extracts the \'mean\' from the image and adjust the image to try make set its gamma appropriately.', -'Imagick::autoOrient' => 'Adjusts an image so that its orientation is suitable $ for viewing (i.e. top-left orientation).', -'imagick::averageImages' => 'Average a set of images', -'imagick::blackThresholdImage' => 'Forces all pixels below the threshold into black', -'imagick::blurImage' => 'Adds blur filter to image', -'imagick::borderImage' => 'Surrounds the image with a border', -'Imagick::brightnessContrastImage' => 'Change the brightness and/or contrast of an image. It converts the brightness and contrast parameters into slope and intercept and calls a polynomical function to apply to the image.', -'imagick::charcoalImage' => 'Simulates a charcoal drawing', -'imagick::chopImage' => 'Removes a region of an image and trims', -'imagick::clear' => 'Clears all resources associated to Imagick object', -'imagick::clipImage' => 'Clips along the first path from the 8BIM profile', -'imagick::clipPathImage' => 'Clips along the named paths from the 8BIM profile', -'imagick::clone' => 'Makes an exact copy of the Imagick object', -'imagick::clutImage' => 'Replaces colors in the image', -'imagick::coalesceImages' => 'Composites a set of images', -'imagick::colorFloodfillImage' => 'Changes the color value of any pixel that matches target', -'imagick::colorizeImage' => 'Blends the fill color with the image', -'Imagick::colorMatrixImage' => 'Apply color transformation to an image. The method permits saturation changes, hue rotation, luminance to alpha, and various other effects. Although variable-sized transformation matrices can be used, typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA (or RGBA with offsets). -The matrix is similar to those used by Adobe Flash except offsets are in column 6 rather than 5 (in support of CMYKA images) and offsets are normalized (divide Flash offset by 255)', -'imagick::combineImages' => 'Combines one or more images into a single image', -'imagick::commentImage' => 'Adds a comment to your image', -'imagick::compareImageChannels' => 'Returns the difference in one or more images', -'imagick::compareImageLayers' => 'Returns the maximum bounding region between images', -'imagick::compareImages' => 'Compares an image to a reconstructed image', -'imagick::compositeImage' => 'Composite one image onto another', -'Imagick::compositeImageGravity' => 'Composite one image onto another using the specified gravity.', -'imagick::contrastImage' => 'Change the contrast of the image', -'imagick::contrastStretchImage' => 'Enhances the contrast of a color image', -'imagick::convolveImage' => 'Applies a custom convolution kernel to the image', -'imagick::count' => 'Get the number of images', -'imagick::cropImage' => 'Extracts a region of the image', -'imagick::cropThumbnailImage' => 'Creates a crop thumbnail', -'imagick::current' => 'Returns a reference to the current Imagick object', -'imagick::cycleColormapImage' => 'Displaces an image\'s colormap', -'imagick::decipherImage' => 'Deciphers an image', -'imagick::deconstructImages' => 'Returns certain pixel differences between images', -'imagick::deleteImageArtifact' => 'Delete image artifact', -'Imagick::deleteImageProperty' => 'Deletes an image property.', -'imagick::deskewImage' => 'Removes skew from the image', -'imagick::despeckleImage' => 'Reduces the speckle noise in an image', -'imagick::destroy' => 'Destroys the Imagick object', -'imagick::displayImage' => 'Displays an image', -'imagick::displayImages' => 'Displays an image or image sequence', -'imagick::distortImage' => 'Distorts an image using various distortion methods', -'imagick::drawImage' => 'Renders the ImagickDraw object on the current image', -'imagick::edgeImage' => 'Enhance edges within the image', -'imagick::embossImage' => 'Returns a grayscale image with a three-dimensional effect', -'imagick::encipherImage' => 'Enciphers an image', -'imagick::enhanceImage' => 'Improves the quality of a noisy image', -'imagick::equalizeImage' => 'Equalizes the image histogram', -'imagick::evaluateImage' => 'Applies an expression to an image', -'Imagick::evaluateImages' => 'Merge multiple images of the same size together with the selected operator. https://www.imagemagick.org/Usage/layers/#evaluate-sequence', -'imagick::exportImagePixels' => 'Exports raw image pixels', -'imagick::extentImage' => 'Set image size', -'Imagick::filter' => 'Applies a custom convolution kernel to the image.', -'imagick::flattenImages' => 'Merges a sequence of images', -'imagick::flipImage' => 'Creates a vertical mirror image', -'imagick::floodFillPaintImage' => 'Changes the color value of any pixel that matches target', -'imagick::flopImage' => 'Creates a horizontal mirror image', -'Imagick::forwardFourierTransformimage' => 'Implements the discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.', -'imagick::frameImage' => 'Adds a simulated three-dimensional border', -'imagick::functionImage' => 'Applies a function on the image', -'imagick::fxImage' => 'Evaluate expression for each pixel in the image', -'imagick::gammaImage' => 'Gamma-corrects an image', -'imagick::gaussianBlurImage' => 'Blurs an image', -'imagick::getColorspace' => 'Gets the colorspace', -'imagick::getCompression' => 'Gets the object compression type', -'imagick::getCompressionQuality' => 'Gets the object compression quality', -'Imagick::getConfigureOptions' => 'Returns any ImageMagick configure options that match the specified pattern (e.g. "*" for all). Options include NAME, VERSION, LIB_VERSION, etc.', -'imagick::getCopyright' => 'Returns the ImageMagick API copyright as a string', -'Imagick::getFeatures' => 'GetFeatures() returns the ImageMagick features that have been compiled into the runtime.', -'imagick::getFilename' => 'The filename associated with an image sequence', -'imagick::getFont' => 'Gets font', -'imagick::getFormat' => 'Returns the format of the Imagick object', -'imagick::getGravity' => 'Gets the gravity', -'imagick::getHomeURL' => 'Returns the ImageMagick home URL', -'imagick::getImage' => 'Returns a new Imagick object', -'imagick::getImageAlphaChannel' => 'Gets the image alpha channel', -'imagick::getImageArtifact' => 'Get image artifact', -'imagick::getImageBackgroundColor' => 'Returns the image background color', -'imagick::getImageBlob' => 'Returns the image sequence as a blob', -'imagick::getImageBluePrimary' => 'Returns the chromaticy blue primary point', -'imagick::getImageBorderColor' => 'Returns the image border color', -'imagick::getImageChannelDepth' => 'Gets the depth for a particular image channel', -'imagick::getImageChannelDistortion' => 'Compares image channels of an image to a reconstructed image', -'imagick::getImageChannelDistortions' => 'Gets channel distortions', -'imagick::getImageChannelExtrema' => 'Gets the extrema for one or more image channels', -'imagick::getImageChannelKurtosis' => 'The getImageChannelKurtosis purpose', -'imagick::getImageChannelMean' => 'Gets the mean and standard deviation', -'imagick::getImageChannelRange' => 'Gets channel range', -'imagick::getImageChannelStatistics' => 'Returns statistics for each channel in the image', -'imagick::getImageClipMask' => 'Gets image clip mask', -'imagick::getImageColormapColor' => 'Returns the color of the specified colormap index', -'imagick::getImageColors' => 'Gets the number of unique colors in the image', -'imagick::getImageColorspace' => 'Gets the image colorspace', -'imagick::getImageCompose' => 'Returns the composite operator associated with the image', -'imagick::getImageCompression' => 'Gets the current image\'s compression type', -'imagick::getImageCompressionQuality' => 'Gets the current image\'s compression quality', -'imagick::getImageDelay' => 'Gets the image delay', -'imagick::getImageDepth' => 'Gets the image depth', -'imagick::getImageDispose' => 'Gets the image disposal method', -'imagick::getImageDistortion' => 'Compares an image to a reconstructed image', -'imagick::getImageExtrema' => 'Gets the extrema for the image', -'imagick::getImageFilename' => 'Returns the filename of a particular image in a sequence', -'imagick::getImageFormat' => 'Returns the format of a particular image in a sequence', -'imagick::getImageGamma' => 'Gets the image gamma', -'imagick::getImageGeometry' => 'Gets the width and height as an associative array', -'imagick::getImageGravity' => 'Gets the image gravity', -'imagick::getImageGreenPrimary' => 'Returns the chromaticy green primary point', -'imagick::getImageHeight' => 'Returns the image height', -'imagick::getImageHistogram' => 'Gets the image histogram', -'imagick::getImageIndex' => 'Gets the index of the current active image', -'imagick::getImageInterlaceScheme' => 'Gets the image interlace scheme', -'imagick::getImageInterpolateMethod' => 'Returns the interpolation method', -'imagick::getImageIterations' => 'Gets the image iterations', -'imagick::getImageLength' => 'Returns the image length in bytes', -'imagick::getImageMagickLicense' => 'Returns a string containing the ImageMagick license', -'imagick::getImageMatte' => 'Return if the image has a matte channel', -'imagick::getImageMatteColor' => 'Returns the image matte color', -'Imagick::getImageMimeType' => '`@return string` Returns the image mime-type.', -'imagick::getImageOrientation' => 'Gets the image orientation', -'imagick::getImagePage' => 'Returns the page geometry', -'imagick::getImagePixelColor' => 'Returns the color of the specified pixel', -'imagick::getImageProfile' => 'Returns the named image profile', -'imagick::getImageProfiles' => 'Returns the image profiles', -'imagick::getImageProperties' => 'Returns the image properties', -'imagick::getImageProperty' => 'Returns the named image property', -'imagick::getImageRedPrimary' => 'Returns the chromaticity red primary point', -'imagick::getImageRegion' => 'Extracts a region of the image', -'imagick::getImageRenderingIntent' => 'Gets the image rendering intent', -'imagick::getImageResolution' => 'Gets the image X and Y resolution', -'imagick::getImagesBlob' => 'Returns all image sequences as a blob', -'imagick::getImageScene' => 'Gets the image scene', -'imagick::getImageSignature' => 'Generates an SHA-256 message digest', -'imagick::getImageSize' => 'Returns the image length in bytes', -'imagick::getImageTicksPerSecond' => 'Gets the image ticks-per-second', -'imagick::getImageTotalInkDensity' => 'Gets the image total ink density', -'imagick::getImageType' => 'Gets the potential image type', -'imagick::getImageUnits' => 'Gets the image units of resolution', -'imagick::getImageVirtualPixelMethod' => 'Returns the virtual pixel method', -'imagick::getImageWhitePoint' => 'Returns the chromaticity white point', -'imagick::getImageWidth' => 'Returns the image width', -'imagick::getInterlaceScheme' => 'Gets the object interlace scheme', -'imagick::getIteratorIndex' => 'Gets the index of the current active image', -'imagick::getNumberImages' => 'Returns the number of images in the object', -'imagick::getOption' => 'Returns a value associated with the specified key', -'imagick::getPackageName' => 'Returns the ImageMagick package name', -'imagick::getPage' => 'Returns the page geometry', -'imagick::getPixelIterator' => 'Returns a MagickPixelIterator', -'imagick::getPixelRegionIterator' => 'Get an ImagickPixelIterator for an image section', -'imagick::getPointSize' => 'Gets point size', -'Imagick::getQuantum' => 'Returns the ImageMagick quantum range as an integer.', -'imagick::getQuantumDepth' => 'Gets the quantum depth', -'imagick::getQuantumRange' => 'Returns the Imagick quantum range', -'Imagick::getRegistry' => 'Get the StringRegistry entry for the named key or false if not set.', -'imagick::getReleaseDate' => 'Returns the ImageMagick release date', -'imagick::getResource' => 'Returns the specified resource\'s memory usage', -'imagick::getResourceLimit' => 'Returns the specified resource limit', -'imagick::getSamplingFactors' => 'Gets the horizontal and vertical sampling factor', -'imagick::getSize' => 'Returns the size associated with the Imagick object', -'imagick::getSizeOffset' => 'Returns the size offset', -'imagick::getVersion' => 'Returns the ImageMagick API version', -'imagick::haldClutImage' => 'Replaces colors in the image', -'imagick::hasNextImage' => 'Checks if the object has more images', -'imagick::hasPreviousImage' => 'Checks if the object has a previous image', -'Imagick::identifyFormat' => 'Replaces any embedded formatting characters with the appropriate image property and returns the interpreted text. See https://www.imagemagick.org/script/escape.php for escape sequences.', -'imagick::identifyImage' => 'Identifies an image and fetches attributes', -'Imagick::identifyImageType' => 'Identifies the potential image type, returns one of the Imagick::IMGTYPE_* constants', -'imagick::implodeImage' => 'Creates a new image as a copy', -'imagick::importImagePixels' => 'Imports image pixels', -'Imagick::inverseFourierTransformImage' => 'Implements the inverse discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.', -'imagick::labelImage' => 'Adds a label to an image', -'imagick::levelImage' => 'Adjusts the levels of an image', -'imagick::linearStretchImage' => 'Stretches with saturation the image intensity', -'imagick::liquidRescaleImage' => 'Animates an image or images', -'Imagick::listRegistry' => 'List all the registry settings. Returns an array of all the key/value pairs in the registry', -'Imagick::localContrastImage' => 'Attempts to increase the appearance of large-scale light-dark transitions.', -'imagick::magnifyImage' => 'Scales an image proportionally 2x', -'imagick::mapImage' => 'Replaces the colors of an image with the closest color from a reference image', -'imagick::matteFloodfillImage' => 'Changes the transparency value of a color', -'imagick::medianFilterImage' => 'Applies a digital filter', -'imagick::mergeImageLayers' => 'Merges image layers', -'imagick::minifyImage' => 'Scales an image proportionally to half its size', -'imagick::modulateImage' => 'Control the brightness, saturation, and hue', -'imagick::montageImage' => 'Creates a composite image', -'imagick::morphImages' => 'Method morphs a set of images', -'Imagick::morphology' => 'Applies a user supplied kernel to the image according to the given morphology method.', -'imagick::mosaicImages' => 'Forms a mosaic from images', -'imagick::motionBlurImage' => 'Simulates motion blur', -'imagick::negateImage' => 'Negates the colors in the reference image', -'imagick::newImage' => 'Creates a new image', -'imagick::newPseudoImage' => 'Creates a new image', -'imagick::nextImage' => 'Moves to the next image', -'imagick::normalizeImage' => 'Enhances the contrast of a color image', -'imagick::oilPaintImage' => 'Simulates an oil painting', -'imagick::opaquePaintImage' => 'Changes the color value of any pixel that matches target', -'imagick::optimizeImageLayers' => 'Removes repeated portions of images to optimize', -'imagick::orderedPosterizeImage' => 'Performs an ordered dither', -'imagick::paintFloodfillImage' => 'Changes the color value of any pixel that matches target', -'imagick::paintOpaqueImage' => 'Change any pixel that matches color', -'imagick::paintTransparentImage' => 'Changes any pixel that matches color with the color defined by fill', -'imagick::pingImage' => 'Fetch basic attributes about the image', -'imagick::pingImageBlob' => 'Quickly fetch attributes', -'imagick::pingImageFile' => 'Get basic image attributes in a lightweight manner', -'imagick::polaroidImage' => 'Simulates a Polaroid picture', -'imagick::posterizeImage' => 'Reduces the image to a limited number of color level', -'imagick::previewImages' => 'Quickly pin-point appropriate parameters for image processing', -'imagick::previousImage' => 'Move to the previous image in the object', -'imagick::profileImage' => 'Adds or removes a profile from an image', -'imagick::quantizeImage' => 'Analyzes the colors within a reference image', -'imagick::quantizeImages' => 'Analyzes the colors within a sequence of images', -'imagick::queryFontMetrics' => 'Returns an array representing the font metrics', -'imagick::queryFonts' => 'Returns the configured fonts', -'imagick::queryFormats' => 'Returns formats supported by Imagick', -'imagick::radialBlurImage' => 'Radial blurs an image', -'imagick::raiseImage' => 'Creates a simulated 3d button-like effect', -'imagick::randomThresholdImage' => 'Creates a high-contrast, two-color image', -'imagick::readImage' => 'Reads image from filename', -'imagick::readImageBlob' => 'Reads image from a binary string', -'imagick::readImageFile' => 'Reads image from open filehandle', -'imagick::recolorImage' => 'Recolors image', -'imagick::reduceNoiseImage' => 'Smooths the contours of an image', -'imagick::remapImage' => 'Remaps image colors', -'imagick::removeImage' => 'Removes an image from the image list', -'imagick::removeImageProfile' => 'Removes the named image profile and returns it', -'imagick::render' => 'Renders all preceding drawing commands', -'imagick::resampleImage' => 'Resample image to desired resolution', -'imagick::resetImagePage' => 'Reset image page', -'imagick::resizeImage' => 'Scales an image', -'imagick::rollImage' => 'Offsets an image', -'imagick::rotateImage' => 'Rotates an image', -'Imagick::rotationalBlurImage' => 'Rotational blurs an image.', -'imagick::roundCorners' => 'Rounds image corners', -'imagick::sampleImage' => 'Scales an image with pixel sampling', -'imagick::scaleImage' => 'Scales the size of an image', -'imagick::segmentImage' => 'Segments an image', -'Imagick::selectiveBlurImage' => 'Selectively blur an image within a contrast threshold. It is similar to the unsharpen mask that sharpens everything with contrast above a certain threshold.', -'imagick::separateImageChannel' => 'Separates a channel from the image', -'imagick::sepiaToneImage' => 'Sepia tones an image', -'Imagick::setAntiAlias' => 'Set whether antialiasing should be used for operations. On by default.', -'imagick::setBackgroundColor' => 'Sets the object\'s default background color', -'imagick::setColorspace' => 'Set colorspace', -'imagick::setCompression' => 'Sets the object\'s default compression type', -'imagick::setCompressionQuality' => 'Sets the object\'s default compression quality', -'imagick::setFilename' => 'Sets the filename before you read or write the image', -'imagick::setFirstIterator' => 'Sets the Imagick iterator to the first image', -'imagick::setFont' => 'Sets font', -'imagick::setFormat' => 'Sets the format of the Imagick object', -'imagick::setGravity' => 'Sets the gravity', -'imagick::setImage' => 'Replaces image in the object', -'Imagick::setImageAlpha' => 'Sets the image to the specified alpha level. Will replace ImagickDraw::setOpacity()', -'imagick::setImageAlphaChannel' => 'Sets image alpha channel', -'imagick::setImageArtifact' => 'Set image artifact', -'imagick::setImageBackgroundColor' => 'Sets the image background color', -'imagick::setImageBias' => 'Sets the image bias for any method that convolves an image', -'imagick::setImageBluePrimary' => 'Sets the image chromaticity blue primary point', -'imagick::setImageBorderColor' => 'Sets the image border color', -'imagick::setImageChannelDepth' => 'Sets the depth of a particular image channel', -'Imagick::setImageChannelMask' => 'Sets the image channel mask. Returns the previous set channel mask. -Only works with Imagick >=7', -'imagick::setImageClipMask' => 'Sets image clip mask', -'imagick::setImageColormapColor' => 'Sets the color of the specified colormap index', -'imagick::setImageColorspace' => 'Sets the image colorspace', -'imagick::setImageCompose' => 'Sets the image composite operator', -'imagick::setImageCompression' => 'Sets the image compression', -'imagick::setImageCompressionQuality' => 'Sets the image compression quality', -'imagick::setImageDelay' => 'Sets the image delay', -'imagick::setImageDepth' => 'Sets the image depth', -'imagick::setImageDispose' => 'Sets the image disposal method', -'imagick::setImageExtent' => 'Sets the image size', -'imagick::setImageFilename' => 'Sets the filename of a particular image', -'imagick::setImageFormat' => 'Sets the format of a particular image', -'imagick::setImageGamma' => 'Sets the image gamma', -'imagick::setImageGravity' => 'Sets the image gravity', -'imagick::setImageGreenPrimary' => 'Sets the image chromaticity green primary point', -'imagick::setImageIndex' => 'Set the iterator position', -'imagick::setImageInterlaceScheme' => 'Sets the image compression', -'imagick::setImageInterpolateMethod' => 'Sets the image interpolate pixel method', -'imagick::setImageIterations' => 'Sets the image iterations', -'imagick::setImageMatte' => 'Sets the image matte channel', -'imagick::setImageMatteColor' => 'Sets the image matte color', -'imagick::setImageOpacity' => 'Sets the image opacity level', -'imagick::setImageOrientation' => 'Sets the image orientation', -'imagick::setImagePage' => 'Sets the page geometry of the image', -'imagick::setImageProfile' => 'Adds a named profile to the Imagick object', -'imagick::setImageProperty' => 'Sets an image property', -'imagick::setImageRedPrimary' => 'Sets the image chromaticity red primary point', -'imagick::setImageRenderingIntent' => 'Sets the image rendering intent', -'imagick::setImageResolution' => 'Sets the image resolution', -'imagick::setImageScene' => 'Sets the image scene', -'imagick::setImageTicksPerSecond' => 'Sets the image ticks-per-second', -'imagick::setImageType' => 'Sets the image type', -'imagick::setImageUnits' => 'Sets the image units of resolution', -'imagick::setImageVirtualPixelMethod' => 'Sets the image virtual pixel method', -'imagick::setImageWhitePoint' => 'Sets the image chromaticity white point', -'imagick::setInterlaceScheme' => 'Sets the image compression', -'imagick::setIteratorIndex' => 'Set the iterator position', -'imagick::setLastIterator' => 'Sets the Imagick iterator to the last image', -'imagick::setOption' => 'Set an option', -'imagick::setPage' => 'Sets the page geometry of the Imagick object', -'imagick::setPointSize' => 'Sets point size', -'Imagick::setProgressMonitor' => 'Set a callback that will be called during the processing of the Imagick image.', -'Imagick::setRegistry' => 'Sets the ImageMagick registry entry named key to value. This is most useful for setting "temporary-path" which controls where ImageMagick creates temporary images e.g. while processing PDFs.', -'imagick::setResolution' => 'Sets the image resolution', -'imagick::setResourceLimit' => 'Sets the limit for a particular resource', -'imagick::setSamplingFactors' => 'Sets the image sampling factors', -'imagick::setSize' => 'Sets the size of the Imagick object', -'imagick::setSizeOffset' => 'Sets the size and offset of the Imagick object', -'imagick::setType' => 'Sets the image type attribute', -'imagick::shadeImage' => 'Creates a 3D effect', -'imagick::shadowImage' => 'Simulates an image shadow', -'imagick::sharpenImage' => 'Sharpens an image', -'imagick::shaveImage' => 'Shaves pixels from the image edges', -'imagick::shearImage' => 'Creating a parallelogram', -'imagick::sigmoidalContrastImage' => 'Adjusts the contrast of an image', -'Imagick::similarityImage' => 'Is an alias of Imagick::subImageMatch', -'imagick::sketchImage' => 'Simulates a pencil sketch', -'imagick::solarizeImage' => 'Applies a solarizing effect to the image', -'imagick::sparseColorImage' => 'Interpolates colors', -'imagick::spliceImage' => 'Splices a solid color into the image', -'imagick::spreadImage' => 'Randomly displaces each pixel in a block', -'Imagick::statisticImage' => 'Replace each pixel with corresponding statistic from the neighborhood of the specified width and height.', -'imagick::steganoImage' => 'Hides a digital watermark within the image', -'imagick::stereoImage' => 'Composites two images', -'imagick::stripImage' => 'Strips an image of all profiles and comments', -'Imagick::subImageMatch' => 'Searches for a subimage in the current image and returns a similarity image such that an exact match location is -completely white and if none of the pixels match, black, otherwise some gray level in-between. -You can also pass in the optional parameters bestMatch and similarity. After calling the function similarity will -be set to the \'score\' of the similarity between the subimage and the matching position in the larger image, -bestMatch will contain an associative array with elements x, y, width, height that describe the matching region.', -'imagick::swirlImage' => 'Swirls the pixels about the center of the image', -'imagick::textureImage' => 'Repeatedly tiles the texture image', -'imagick::thresholdImage' => 'Changes the value of individual pixels based on a threshold', -'imagick::thumbnailImage' => 'Changes the size of an image', -'imagick::tintImage' => 'Applies a color vector to each pixel in the image', -'imagick::transformImage' => 'Convenience method for setting crop size and the image geometry', -'imagick::transformImageColorspace' => 'Transforms an image to a new colorspace', -'imagick::transparentPaintImage' => 'Paints pixels transparent', -'imagick::transposeImage' => 'Creates a vertical mirror image', -'imagick::transverseImage' => 'Creates a horizontal mirror image', -'imagick::trimImage' => 'Remove edges from the image', -'imagick::uniqueImageColors' => 'Discards all but one of any pixel color', -'imagick::unsharpMaskImage' => 'Sharpens an image', -'imagick::valid' => 'Checks if the current item is valid', -'imagick::vignetteImage' => 'Adds vignette filter to the image', -'imagick::waveImage' => 'Applies wave filter to the image', -'imagick::whiteThresholdImage' => 'Force all pixels above the threshold into white', -'imagick::writeImage' => 'Writes an image to the specified filename', -'imagick::writeImageFile' => 'Writes an image to a filehandle', -'imagick::writeImages' => 'Writes an image or image sequence', -'imagick::writeImagesFile' => 'Writes frames to a filehandle', -'imagickdraw::__construct' => 'The ImagickDraw constructor', -'imagickdraw::affine' => 'Adjusts the current affine transformation matrix', -'imagickdraw::annotation' => 'Draws text on the image', -'imagickdraw::arc' => 'Draws an arc', -'imagickdraw::bezier' => 'Draws a bezier curve', -'imagickdraw::circle' => 'Draws a circle', -'imagickdraw::clear' => 'Clears the ImagickDraw', -'imagickdraw::clone' => 'Makes an exact copy of the specified ImagickDraw object', -'imagickdraw::color' => 'Draws color on image', -'imagickdraw::comment' => 'Adds a comment', -'imagickdraw::composite' => 'Composites an image onto the current image', -'imagickdraw::destroy' => 'Frees all associated resources', -'imagickdraw::ellipse' => 'Draws an ellipse on the image', -'ImagickDraw::getBorderColor' => 'Returns the border color used for drawing bordered objects.', -'imagickdraw::getClipPath' => 'Obtains the current clipping path ID', -'imagickdraw::getClipRule' => 'Returns the current polygon fill rule', -'imagickdraw::getClipUnits' => 'Returns the interpretation of clip path units', -'ImagickDraw::getDensity' => 'Obtains the vertical and horizontal resolution.', -'imagickdraw::getFillColor' => 'Returns the fill color', -'imagickdraw::getFillOpacity' => 'Returns the opacity used when drawing', -'imagickdraw::getFillRule' => 'Returns the fill rule', -'imagickdraw::getFont' => 'Returns the font', -'imagickdraw::getFontFamily' => 'Returns the font family', -'ImagickDraw::getFontResolution' => 'Gets the image X and Y resolution.', -'imagickdraw::getFontSize' => 'Returns the font pointsize', -'imagickdraw::getFontStyle' => 'Returns the font style', -'imagickdraw::getFontWeight' => 'Returns the font weight', -'imagickdraw::getGravity' => 'Returns the text placement gravity', -'ImagickDraw::getOpacity' => 'Returns the opacity used when drawing with the fill or stroke color or texture. Fully opaque is 1.0.', -'imagickdraw::getStrokeAntialias' => 'Returns the current stroke antialias setting', -'imagickdraw::getStrokeColor' => 'Returns the color used for stroking object outlines', -'imagickdraw::getStrokeDashArray' => 'Returns an array representing the pattern of dashes and gaps used to stroke paths', -'imagickdraw::getStrokeDashOffset' => 'Returns the offset into the dash pattern to start the dash', -'imagickdraw::getStrokeLineCap' => 'Returns the shape to be used at the end of open subpaths when they are stroked', -'imagickdraw::getStrokeLineJoin' => 'Returns the shape to be used at the corners of paths when they are stroked', -'imagickdraw::getStrokeMiterLimit' => 'Returns the stroke miter limit', -'imagickdraw::getStrokeOpacity' => 'Returns the opacity of stroked object outlines', -'imagickdraw::getStrokeWidth' => 'Returns the width of the stroke used to draw object outlines', -'imagickdraw::getTextAlignment' => 'Returns the text alignment', -'imagickdraw::getTextAntialias' => 'Returns the current text antialias setting', -'imagickdraw::getTextDecoration' => 'Returns the text decoration', -'ImagickDraw::getTextDirection' => 'Returns the direction that will be used when annotating with text.', -'imagickdraw::getTextEncoding' => 'Returns the code set used for text annotations', -'imagickdraw::getTextUnderColor' => 'Returns the text under color', -'imagickdraw::getVectorGraphics' => 'Returns a string containing vector graphics', -'imagickdraw::line' => 'Draws a line', -'imagickdraw::matte' => 'Paints on the image\'s opacity channel', -'imagickdraw::pathClose' => 'Adds a path element to the current path', -'imagickdraw::pathCurveToAbsolute' => 'Draws a cubic Bezier curve', -'imagickdraw::pathCurveToQuadraticBezierAbsolute' => 'Draws a quadratic Bezier curve', -'imagickdraw::pathCurveToQuadraticBezierRelative' => 'Draws a quadratic Bezier curve', -'imagickdraw::pathCurveToQuadraticBezierSmoothAbsolute' => 'Draws a quadratic Bezier curve', -'imagickdraw::pathCurveToQuadraticBezierSmoothRelative' => 'Draws a quadratic Bezier curve', -'imagickdraw::pathCurveToRelative' => 'Draws a cubic Bezier curve', -'imagickdraw::pathCurveToSmoothAbsolute' => 'Draws a cubic Bezier curve', -'imagickdraw::pathCurveToSmoothRelative' => 'Draws a cubic Bezier curve', -'imagickdraw::pathEllipticArcAbsolute' => 'Draws an elliptical arc', -'imagickdraw::pathEllipticArcRelative' => 'Draws an elliptical arc', -'imagickdraw::pathFinish' => 'Terminates the current path', -'imagickdraw::pathLineToAbsolute' => 'Draws a line path', -'imagickdraw::pathLineToHorizontalAbsolute' => 'Draws a horizontal line path', -'imagickdraw::pathLineToHorizontalRelative' => 'Draws a horizontal line', -'imagickdraw::pathLineToRelative' => 'Draws a line path', -'imagickdraw::pathLineToVerticalAbsolute' => 'Draws a vertical line', -'imagickdraw::pathLineToVerticalRelative' => 'Draws a vertical line path', -'imagickdraw::pathMoveToAbsolute' => 'Starts a new sub-path', -'imagickdraw::pathMoveToRelative' => 'Starts a new sub-path', -'imagickdraw::pathStart' => 'Declares the start of a path drawing list', -'imagickdraw::point' => 'Draws a point', -'imagickdraw::polygon' => 'Draws a polygon', -'imagickdraw::polyline' => 'Draws a polyline', -'imagickdraw::pop' => 'Destroys the current ImagickDraw in the stack, and returns to the previously pushed ImagickDraw', -'imagickdraw::popClipPath' => 'Terminates a clip path definition', -'imagickdraw::popDefs' => 'Terminates a definition list', -'imagickdraw::popPattern' => 'Terminates a pattern definition', -'imagickdraw::push' => 'Clones the current ImagickDraw and pushes it to the stack', -'imagickdraw::pushClipPath' => 'Starts a clip path definition', -'imagickdraw::pushDefs' => 'Indicates that following commands create named elements for early processing', -'imagickdraw::pushPattern' => 'Indicates that subsequent commands up to a ImagickDraw::opPattern() command comprise the definition of a named pattern', -'imagickdraw::rectangle' => 'Draws a rectangle', -'imagickdraw::render' => 'Renders all preceding drawing commands onto the image', -'imagickdraw::rotate' => 'Applies the specified rotation to the current coordinate space', -'imagickdraw::roundRectangle' => 'Draws a rounded rectangle', -'imagickdraw::scale' => 'Adjusts the scaling factor', -'ImagickDraw::setBorderColor' => 'Sets the border color to be used for drawing bordered objects.', -'imagickdraw::setClipPath' => 'Associates a named clipping path with the image', -'imagickdraw::setClipRule' => 'Set the polygon fill rule to be used by the clipping path', -'imagickdraw::setClipUnits' => 'Sets the interpretation of clip path units', -'ImagickDraw::setDensity' => 'Sets the vertical and horizontal resolution.', -'imagickdraw::setFillAlpha' => 'Sets the opacity to use when drawing using the fill color or fill texture', -'imagickdraw::setFillColor' => 'Sets the fill color to be used for drawing filled objects', -'imagickdraw::setFillOpacity' => 'Sets the opacity to use when drawing using the fill color or fill texture', -'imagickdraw::setFillPatternURL' => 'Sets the URL to use as a fill pattern for filling objects', -'imagickdraw::setFillRule' => 'Sets the fill rule to use while drawing polygons', -'imagickdraw::setFont' => 'Sets the fully-specified font to use when annotating with text', -'imagickdraw::setFontFamily' => 'Sets the font family to use when annotating with text', -'ImagickDraw::setFontResolution' => 'Sets the image font resolution.', -'imagickdraw::setFontSize' => 'Sets the font pointsize to use when annotating with text', -'imagickdraw::setFontStretch' => 'Sets the font stretch to use when annotating with text', -'imagickdraw::setFontStyle' => 'Sets the font style to use when annotating with text', -'imagickdraw::setFontWeight' => 'Sets the font weight', -'imagickdraw::setGravity' => 'Sets the text placement gravity', -'ImagickDraw::setOpacity' => 'Sets the opacity to use when drawing using the fill or stroke color or texture. Fully opaque is 1.0.', -'imagickdraw::setStrokeAlpha' => 'Specifies the opacity of stroked object outlines', -'imagickdraw::setStrokeAntialias' => 'Controls whether stroked outlines are antialiased', -'imagickdraw::setStrokeColor' => 'Sets the color used for stroking object outlines', -'imagickdraw::setStrokeDashArray' => 'Specifies the pattern of dashes and gaps used to stroke paths', -'imagickdraw::setStrokeDashOffset' => 'Specifies the offset into the dash pattern to start the dash', -'imagickdraw::setStrokeLineCap' => 'Specifies the shape to be used at the end of open subpaths when they are stroked', -'imagickdraw::setStrokeLineJoin' => 'Specifies the shape to be used at the corners of paths when they are stroked', -'imagickdraw::setStrokeMiterLimit' => 'Specifies the miter limit', -'imagickdraw::setStrokeOpacity' => 'Specifies the opacity of stroked object outlines', -'imagickdraw::setStrokePatternURL' => 'Sets the pattern used for stroking object outlines', -'imagickdraw::setStrokeWidth' => 'Sets the width of the stroke used to draw object outlines', -'imagickdraw::setTextAlignment' => 'Specifies a text alignment', -'imagickdraw::setTextAntialias' => 'Controls whether text is antialiased', -'imagickdraw::setTextDecoration' => 'Specifies a decoration', -'ImagickDraw::setTextDirection' => 'Sets the font style to use when annotating with text. The AnyStyle enumeration acts as a wild-card "don\'t care" option.', -'imagickdraw::setTextEncoding' => 'Specifies the text code set', -'imagickdraw::setTextUnderColor' => 'Specifies the color of a background rectangle', -'imagickdraw::setVectorGraphics' => 'Sets the vector graphics', -'imagickdraw::setViewbox' => 'Sets the overall canvas size', -'imagickdraw::skewX' => 'Skews the current coordinate system in the horizontal direction', -'imagickdraw::skewY' => 'Skews the current coordinate system in the vertical direction', -'imagickdraw::translate' => 'Applies a translation to the current coordinate system', -'ImagickKernel::addKernel' => 'Attach another kernel to this kernel to allow them to both be applied in a single morphology or filter function. Returns the new combined kernel.', -'ImagickKernel::addUnityKernel' => 'Adds a given amount of the \'Unity\' Convolution Kernel to the given pre-scaled and normalized Kernel. This in effect adds that amount of the original image into the resulting convolution kernel. The resulting effect is to convert the defined kernels into blended soft-blurs, unsharp kernels or into sharpening kernels.', -'ImagickKernel::fromBuiltin' => 'Create a kernel from a builtin in kernel. See https://www.imagemagick.org/Usage/morphology/#kernel for examples.<br> -Currently the \'rotation\' symbols are not supported. Example: $diamondKernel = ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DIAMOND, "2");', -'ImagickKernel::fromMatrix' => 'Create a kernel from a builtin in kernel. See https://www.imagemagick.org/Usage/morphology/#kernel for examples.<br> -Currently the \'rotation\' symbols are not supported. Example: $diamondKernel = ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DIAMOND, "2");', -'ImagickKernel::getMatrix' => 'Get the 2d matrix of values used in this kernel. The elements are either float for elements that are used or \'false\' if the element should be skipped.', -'ImagickKernel::scale' => 'ScaleKernelInfo() scales the given kernel list by the given amount, with or without normalization of the sum of the kernel values (as per given flags).<br> -The exact behaviour of this function depends on the normalization type being used please see https://www.imagemagick.org/api/morphology.php#ScaleKernelInfo for details.<br> -Flag should be one of Imagick::NORMALIZE_KERNEL_VALUE, Imagick::NORMALIZE_KERNEL_CORRELATE, Imagick::NORMALIZE_KERNEL_PERCENT or not set.', -'ImagickKernel::seperate' => 'Separates a linked set of kernels and returns an array of ImagickKernels.', -'imagickpixel::__construct' => 'The ImagickPixel constructor', -'imagickpixel::clear' => 'Clears resources associated with this object', -'imagickpixel::destroy' => 'Deallocates resources associated with this object', -'imagickpixel::getColor' => 'Returns the color', -'imagickpixel::getColorAsString' => 'Returns the color as a string', -'imagickpixel::getColorCount' => 'Returns the color count associated with this color', -'ImagickPixel::getColorQuantum' => 'Returns the color of the pixel in an array as Quantum values. If ImageMagick was compiled as HDRI these will be floats, otherwise they will be integers.', -'imagickpixel::getColorValue' => 'Gets the normalized value of the provided color channel', -'imagickpixel::getHSL' => 'Returns the normalized HSL color of the ImagickPixel object', -'imagickpixel::isPixelSimilar' => 'Check the distance between this color and another', -'ImagickPixel::isPixelSimilarQuantum' => 'Returns true if the distance between two colors is less than the specified distance. The fuzz value should be in the range 0-QuantumRange.<br> -The maximum value represents the longest possible distance in the colorspace. e.g. from RGB(0, 0, 0) to RGB(255, 255, 255) for the RGB colorspace', -'imagickpixel::isSimilar' => 'Check the distance between this color and another', -'imagickpixel::setColor' => 'Sets the color', -'ImagickPixel::setColorFromPixel' => 'Sets the color count associated with this color from another ImagickPixel object.', -'imagickpixel::setColorValue' => 'Sets the normalized value of one of the channels', -'imagickpixel::setHSL' => 'Sets the normalized HSL color', -'imagickpixeliterator::__construct' => 'The ImagickPixelIterator constructor', -'imagickpixeliterator::clear' => 'Clear resources associated with a PixelIterator', -'imagickpixeliterator::destroy' => 'Deallocates resources associated with a PixelIterator', -'imagickpixeliterator::getCurrentIteratorRow' => 'Returns the current row of ImagickPixel objects', -'imagickpixeliterator::getIteratorRow' => 'Returns the current pixel iterator row', -'imagickpixeliterator::getNextIteratorRow' => 'Returns the next row of the pixel iterator', -'imagickpixeliterator::getPreviousIteratorRow' => 'Returns the previous row', -'imagickpixeliterator::newPixelIterator' => 'Returns a new pixel iterator', -'imagickpixeliterator::newPixelRegionIterator' => 'Returns a new pixel iterator', -'imagickpixeliterator::resetIterator' => 'Resets the pixel iterator', -'imagickpixeliterator::setIteratorFirstRow' => 'Sets the pixel iterator to the first pixel row', -'imagickpixeliterator::setIteratorLastRow' => 'Sets the pixel iterator to the last pixel row', -'imagickpixeliterator::setIteratorRow' => 'Set the pixel iterator row', -'imagickpixeliterator::syncIterator' => 'Syncs the pixel iterator', -'imap_8bit' => 'Convert an 8bit string to a quoted-printable string', -'imap_alerts' => 'Returns all IMAP alert messages that have occurred', -'imap_append' => 'Append a string message to a specified mailbox', -'imap_base64' => 'Decode BASE64 encoded text', -'imap_binary' => 'Convert an 8bit string to a base64 string', -'imap_body' => 'Read the message body', -'imap_bodystruct' => 'Read the structure of a specified body section of a specific message', -'imap_check' => 'Check current mailbox', -'imap_clearflag_full' => 'Clears flags on messages', -'imap_close' => 'Close an IMAP stream', -'imap_create' => 'Alias of imap_createmailbox', -'imap_createmailbox' => 'Create a new mailbox', -'imap_delete' => 'Mark a message for deletion from current mailbox', -'imap_deletemailbox' => 'Delete a mailbox', -'imap_errors' => 'Returns all of the IMAP errors that have occurred', -'imap_expunge' => 'Delete all messages marked for deletion', -'imap_fetch_overview' => 'Read an overview of the information in the headers of the given message', -'imap_fetchbody' => 'Fetch a particular section of the body of the message', -'imap_fetchheader' => 'Returns header for a message', -'imap_fetchmime' => 'Fetch MIME headers for a particular section of the message', -'imap_fetchstructure' => 'Read the structure of a particular message', -'imap_fetchtext' => 'Alias of imap_body', -'imap_gc' => 'Clears IMAP cache', -'imap_get_quota' => 'Retrieve the quota level settings, and usage statics per mailbox', -'imap_get_quotaroot' => 'Retrieve the quota settings per user', -'imap_getacl' => 'Gets the ACL for a given mailbox', -'imap_getmailboxes' => 'Read the list of mailboxes, returning detailed information on each one', -'imap_getsubscribed' => 'List all the subscribed mailboxes', -'imap_header' => 'Alias of imap_headerinfo', -'imap_headerinfo' => 'Read the header of the message', -'imap_headers' => 'Returns headers for all messages in a mailbox', -'imap_last_error' => 'Gets the last IMAP error that occurred during this page request', -'imap_list' => 'Read the list of mailboxes', -'imap_listmailbox' => 'Alias of imap_list', -'imap_listscan' => 'Returns the list of mailboxes that matches the given text', -'imap_listsubscribed' => 'Alias of imap_lsub', -'imap_lsub' => 'List all the subscribed mailboxes', -'imap_mail' => 'Send an email message', -'imap_mail_compose' => 'Create a MIME message based on given envelope and body sections', -'imap_mail_copy' => 'Copy specified messages to a mailbox', -'imap_mail_move' => 'Move specified messages to a mailbox', -'imap_mailboxmsginfo' => 'Get information about the current mailbox', -'imap_mime_header_decode' => 'Decode MIME header elements', -'imap_msgno' => 'Gets the message sequence number for the given UID', -'imap_mutf7_to_utf8' => 'Decode a modified UTF-7 string to UTF-8', -'imap_num_msg' => 'Gets the number of messages in the current mailbox', -'imap_num_recent' => 'Gets the number of recent messages in current mailbox', -'imap_open' => 'Open an IMAP stream to a mailbox', -'imap_ping' => 'Check if the IMAP stream is still active', -'imap_qprint' => 'Convert a quoted-printable string to an 8 bit string', -'imap_rename' => 'Alias of imap_renamemailbox', -'imap_renamemailbox' => 'Rename an old mailbox to new mailbox', -'imap_reopen' => 'Reopen IMAP stream to new mailbox', -'imap_rfc822_parse_adrlist' => 'Parses an address string', -'imap_rfc822_parse_headers' => 'Parse mail headers from a string', -'imap_rfc822_write_address' => 'Returns a properly formatted email address given the mailbox, host, and personal info', -'imap_savebody' => 'Save a specific body section to a file', -'imap_scan' => 'Alias of imap_listscan', -'imap_scanmailbox' => 'Alias of imap_listscan', -'imap_search' => 'This function returns an array of messages matching the given search criteria', -'imap_set_quota' => 'Sets a quota for a given mailbox', -'imap_setacl' => 'Sets the ACL for a given mailbox', -'imap_setflag_full' => 'Sets flags on messages', -'imap_sort' => 'Gets and sort messages', -'imap_status' => 'Returns status information on a mailbox', -'imap_subscribe' => 'Subscribe to a mailbox', -'imap_thread' => 'Returns a tree of threaded message', -'imap_timeout' => 'Set or fetch imap timeout', -'imap_uid' => 'This function returns the UID for the given message sequence number', -'imap_undelete' => 'Unmark the message which is marked deleted', -'imap_unsubscribe' => 'Unsubscribe from a mailbox', -'imap_utf7_decode' => 'Decodes a modified UTF-7 encoded string', -'imap_utf7_encode' => 'Converts ISO-8859-1 string to modified UTF-7 text', -'imap_utf8' => 'Converts MIME-encoded text to UTF-8', -'imap_utf8_to_mutf7' => 'Encode a UTF-8 string to modified UTF-7', -'implode' => 'Join array elements with a string', -'import_request_variables' => 'Import GET/POST/Cookie variables into the global scope', -'in_array' => 'Checks if a value exists in an array', -'inclued_get_data' => 'Get the inclued data', -'inet_ntop' => 'Converts a packed internet address to a human readable representation', -'inet_pton' => 'Converts a human readable IP address to its packed in_addr representation', -'infiniteiterator::__construct' => 'Constructs an InfiniteIterator', -'InfiniteIterator::current' => 'Get the current value', -'InfiniteIterator::getInnerIterator' => 'Get the inner iterator', -'InfiniteIterator::key' => 'Get the key of the current element', -'infiniteiterator::next' => 'Moves the inner Iterator forward or rewinds it', -'InfiniteIterator::rewind' => 'Rewind to the first element', -'InfiniteIterator::valid' => 'Checks if the iterator is valid', -'inflate_add' => 'Incrementally inflate encoded data', -'inflate_get_read_len' => 'Get number of bytes read so far', -'inflate_get_status' => 'Get decompression status', -'inflate_init' => 'Initialize an incremental inflate context', -'ingres_autocommit' => 'Switch autocommit on or off', -'ingres_autocommit_state' => 'Test if the connection is using autocommit', -'ingres_charset' => 'Returns the installation character set', -'ingres_close' => 'Close an Ingres database connection', -'ingres_commit' => 'Commit a transaction', -'ingres_connect' => 'Open a connection to an Ingres database', -'ingres_cursor' => 'Get a cursor name for a given result resource', -'ingres_errno' => 'Get the last Ingres error number generated', -'ingres_error' => 'Get a meaningful error message for the last error generated', -'ingres_errsqlstate' => 'Get the last SQLSTATE error code generated', -'ingres_escape_string' => 'Escape special characters for use in a query', -'ingres_execute' => 'Execute a prepared query', -'ingres_fetch_array' => 'Fetch a row of result into an array', -'ingres_fetch_assoc' => 'Fetch a row of result into an associative array', -'ingres_fetch_object' => 'Fetch a row of result into an object', -'ingres_fetch_proc_return' => 'Get the return value from a procedure call', -'ingres_fetch_row' => 'Fetch a row of result into an enumerated array', -'ingres_field_length' => 'Get the length of a field', -'ingres_field_name' => 'Get the name of a field in a query result', -'ingres_field_nullable' => 'Test if a field is nullable', -'ingres_field_precision' => 'Get the precision of a field', -'ingres_field_scale' => 'Get the scale of a field', -'ingres_field_type' => 'Get the type of a field in a query result', -'ingres_free_result' => 'Free the resources associated with a result identifier', -'ingres_next_error' => 'Get the next Ingres error', -'ingres_num_fields' => 'Get the number of fields returned by the last query', -'ingres_num_rows' => 'Get the number of rows affected or returned by a query', -'ingres_pconnect' => 'Open a persistent connection to an Ingres database', -'ingres_prepare' => 'Prepare a query for later execution', -'ingres_query' => 'Send an SQL query to Ingres', -'ingres_result_seek' => 'Set the row position before fetching data', -'ingres_rollback' => 'Roll back a transaction', -'ingres_set_environment' => 'Set environment features controlling output options', -'ingres_unbuffered_query' => 'Send an unbuffered SQL query to Ingres', -'ini_alter' => 'Alias of ini_set', -'ini_get' => 'Gets the value of a configuration option', -'ini_get_all' => 'Gets all configuration options', -'ini_restore' => 'Restores the value of a configuration option', -'ini_set' => 'Sets the value of a configuration option', -'inotify_add_watch' => 'Add a watch to an initialized inotify instance', -'inotify_init' => 'Initialize an inotify instance', -'inotify_queue_len' => 'Return a number upper than zero if there are pending events', -'inotify_read' => 'Read events from an inotify instance', -'inotify_rm_watch' => 'Remove an existing watch from an inotify instance', -'intcal_get_maximum' => '(PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)<br/> -Get the global maximum value for a field', -'intdiv' => 'Integer division', -'interface_exists' => 'Checks if the interface has been defined', -'intl_get' => '(PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)<br/> -Get the value for a field', -'intlbreakiterator::__construct' => 'Private constructor for disallowing instantiation', -'intlbreakiterator::createCharacterInstance' => 'Create break iterator for boundaries of combining character sequences', -'intlbreakiterator::createCodePointInstance' => 'Create break iterator for boundaries of code points', -'intlbreakiterator::createLineInstance' => 'Create break iterator for logically possible line breaks', -'intlbreakiterator::createSentenceInstance' => 'Create break iterator for sentence breaks', -'intlbreakiterator::createTitleInstance' => 'Create break iterator for title-casing breaks', -'intlbreakiterator::createWordInstance' => 'Create break iterator for word breaks', -'intlbreakiterator::current' => 'Get index of current position', -'intlbreakiterator::first' => 'Set position to the first character in the text', -'intlbreakiterator::following' => 'Advance the iterator to the first boundary following specified offset', -'intlbreakiterator::getErrorCode' => 'Get last error code on the object', -'intlbreakiterator::getErrorMessage' => 'Get last error message on the object', -'intlbreakiterator::getLocale' => 'Get the locale associated with the object', -'intlbreakiterator::getPartsIterator' => 'Create iterator for navigating fragments between boundaries', -'intlbreakiterator::getText' => 'Get the text being scanned', -'intlbreakiterator::isBoundary' => 'Tell whether an offset is a boundaryʼs offset', -'intlbreakiterator::last' => 'Set the iterator position to index beyond the last character', -'intlbreakiterator::next' => 'Advance the iterator the next boundary', -'intlbreakiterator::preceding' => 'Set the iterator position to the first boundary before an offset', -'intlbreakiterator::previous' => 'Set the iterator position to the boundary immediately before the current', -'intlbreakiterator::setText' => 'Set the text being scanned', -'intlcal_greates_minimum' => '(PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)<br/> -Get the largest local minimum value for a field', -'intlcalendar::__construct' => 'Private constructor for disallowing instantiation', -'intlcalendar::add' => 'Add a (signed) amount of time to a field', -'intlcalendar::after' => 'Whether this objectʼs time is after that of the passed object', -'intlcalendar::before' => 'Whether this objectʼs time is before that of the passed object', -'intlcalendar::clear' => 'Clear a field or all fields', -'intlcalendar::createInstance' => 'Create a new IntlCalendar', -'intlcalendar::equals' => 'Compare time of two IntlCalendar objects for equality', -'intlcalendar::fieldDifference' => 'Calculate difference between given time and this objectʼs time', -'intlcalendar::fromDateTime' => 'Create an IntlCalendar from a DateTime object or string', -'intlcalendar::get' => 'Get the value for a field', -'intlcalendar::getActualMaximum' => 'The maximum value for a field, considering the objectʼs current time', -'intlcalendar::getActualMinimum' => 'The minimum value for a field, considering the objectʼs current time', -'intlcalendar::getAvailableLocales' => 'Get array of locales for which there is data', -'intlcalendar::getDayOfWeekType' => 'Tell whether a day is a weekday, weekend or a day that has a transition between the two', -'intlcalendar::getErrorCode' => 'Get last error code on the object', -'intlcalendar::getErrorMessage' => 'Get last error message on the object', -'intlcalendar::getFirstDayOfWeek' => 'Get the first day of the week for the calendarʼs locale', -'intlcalendar::getGreatestMinimum' => 'Get the largest local minimum value for a field', -'intlcalendar::getKeywordValuesForLocale' => 'Get set of locale keyword values', -'intlcalendar::getLeastMaximum' => 'Get the smallest local maximum for a field', -'intlcalendar::getLocale' => 'Get the locale associated with the object', -'intlcalendar::getMaximum' => 'Get the global maximum value for a field', -'intlcalendar::getMinimalDaysInFirstWeek' => 'Get minimal number of days the first week in a year or month can have', -'intlcalendar::getMinimum' => 'Get the global minimum value for a field', -'intlcalendar::getNow' => 'Get number representing the current time', -'intlcalendar::getRepeatedWallTimeOption' => 'Get behavior for handling repeating wall time', -'intlcalendar::getSkippedWallTimeOption' => 'Get behavior for handling skipped wall time', -'intlcalendar::getTime' => 'Get time currently represented by the object', -'intlcalendar::getTimeZone' => 'Get the objectʼs timezone', -'intlcalendar::getType' => 'Get the calendar type', -'intlcalendar::getWeekendTransition' => 'Get time of the day at which weekend begins or ends', -'intlcalendar::inDaylightTime' => 'Whether the objectʼs time is in Daylight Savings Time', -'intlcalendar::isEquivalentTo' => 'Whether another calendar is equal but for a different time', -'intlcalendar::isLenient' => 'Whether date/time interpretation is in lenient mode', -'intlcalendar::isSet' => 'Whether a field is set', -'intlcalendar::isWeekend' => 'Whether a certain date/time is in the weekend', -'intlcalendar::roll' => 'Add value to field without carrying into more significant fields', -'intlcalendar::set' => 'Set a time field or several common fields at once', -'intlcalendar::setFirstDayOfWeek' => 'Set the day on which the week is deemed to start', -'intlcalendar::setLenient' => 'Set whether date/time interpretation is to be lenient', -'intlcalendar::setMinimalDaysInFirstWeek' => 'Set minimal number of days the first week in a year or month can have', -'intlcalendar::setRepeatedWallTimeOption' => 'Set behavior for handling repeating wall times at negative timezone offset transitions', -'intlcalendar::setSkippedWallTimeOption' => 'Set behavior for handling skipped wall times at positive timezone offset transitions', -'intlcalendar::setTime' => 'Set the calendar time in milliseconds since the epoch', -'intlcalendar::setTimeZone' => 'Set the timezone used by this calendar', -'intlcalendar::toDateTime' => 'Convert an IntlCalendar into a DateTime object', -'intlchar::charAge' => 'Get the "age" of the code point', -'intlchar::charDigitValue' => 'Get the decimal digit value of a decimal digit character', -'intlchar::charDirection' => 'Get bidirectional category value for a code point', -'intlchar::charFromName' => 'Find Unicode character by name and return its code point value', -'intlchar::charMirror' => 'Get the "mirror-image" character for a code point', -'intlchar::charName' => 'Retrieve the name of a Unicode character', -'intlchar::charType' => 'Get the general category value for a code point', -'intlchar::chr' => 'Return Unicode character by code point value', -'intlchar::digit' => 'Get the decimal digit value of a code point for a given radix', -'intlchar::enumCharNames' => 'Enumerate all assigned Unicode characters within a range', -'intlchar::enumCharTypes' => 'Enumerate all code points with their Unicode general categories', -'intlchar::foldCase' => 'Perform case folding on a code point', -'intlchar::forDigit' => 'Get character representation for a given digit and radix', -'intlchar::getBidiPairedBracket' => 'Get the paired bracket character for a code point', -'intlchar::getBlockCode' => 'Get the Unicode allocation block containing a code point', -'intlchar::getCombiningClass' => 'Get the combining class of a code point', -'intlchar::getFC_NFKC_Closure' => 'Get the FC_NFKC_Closure property for a code point', -'intlchar::getIntPropertyMaxValue' => 'Get the max value for a Unicode property', -'intlchar::getIntPropertyMinValue' => 'Get the min value for a Unicode property', -'intlchar::getIntPropertyValue' => 'Get the value for a Unicode property for a code point', -'intlchar::getNumericValue' => 'Get the numeric value for a Unicode code point', -'intlchar::getPropertyEnum' => 'Get the property constant value for a given property name', -'intlchar::getPropertyName' => 'Get the Unicode name for a property', -'intlchar::getPropertyValueEnum' => 'Get the property value for a given value name', -'intlchar::getPropertyValueName' => 'Get the Unicode name for a property value', -'intlchar::getUnicodeVersion' => 'Get the Unicode version', -'intlchar::hasBinaryProperty' => 'Check a binary Unicode property for a code point', -'intlchar::isalnum' => 'Check if code point is an alphanumeric character', -'intlchar::isalpha' => 'Check if code point is a letter character', -'intlchar::isbase' => 'Check if code point is a base character', -'intlchar::isblank' => 'Check if code point is a "blank" or "horizontal space" character', -'intlchar::iscntrl' => 'Check if code point is a control character', -'intlchar::isdefined' => 'Check whether the code point is defined', -'intlchar::isdigit' => 'Check if code point is a digit character', -'intlchar::isgraph' => 'Check if code point is a graphic character', -'intlchar::isIDIgnorable' => 'Check if code point is an ignorable character', -'intlchar::isIDPart' => 'Check if code point is permissible in an identifier', -'intlchar::isIDStart' => 'Check if code point is permissible as the first character in an identifier', -'intlchar::isISOControl' => 'Check if code point is an ISO control code', -'intlchar::isJavaIDPart' => 'Check if code point is permissible in a Java identifier', -'intlchar::isJavaIDStart' => 'Check if code point is permissible as the first character in a Java identifier', -'intlchar::isJavaSpaceChar' => 'Check if code point is a space character according to Java', -'intlchar::islower' => 'Check if code point is a lowercase letter', -'intlchar::isMirrored' => 'Check if code point has the Bidi_Mirrored property', -'intlchar::isprint' => 'Check if code point is a printable character', -'intlchar::ispunct' => 'Check if code point is punctuation character', -'intlchar::isspace' => 'Check if code point is a space character', -'intlchar::istitle' => 'Check if code point is a titlecase letter', -'intlchar::isUAlphabetic' => 'Check if code point has the Alphabetic Unicode property', -'intlchar::isULowercase' => 'Check if code point has the Lowercase Unicode property', -'intlchar::isupper' => 'Check if code point has the general category "Lu" (uppercase letter)', -'intlchar::isUUppercase' => 'Check if code point has the Uppercase Unicode property', -'intlchar::isUWhiteSpace' => 'Check if code point has the White_Space Unicode property', -'intlchar::isWhitespace' => 'Check if code point is a whitespace character according to ICU', -'intlchar::isxdigit' => 'Check if code point is a hexadecimal digit', -'intlchar::ord' => 'Return Unicode code point value of character', -'intlchar::tolower' => 'Make Unicode character lowercase', -'intlchar::totitle' => 'Make Unicode character titlecase', -'intlchar::toupper' => 'Make Unicode character uppercase', -'IntlCodePointBreakIterator::createCharacterInstance' => 'Create break iterator for boundaries of combining character sequences', -'IntlCodePointBreakIterator::createCodePointInstance' => 'Create break iterator for boundaries of code points', -'IntlCodePointBreakIterator::createLineInstance' => 'Create break iterator for logically possible line breaks', -'IntlCodePointBreakIterator::createSentenceInstance' => 'Create break iterator for sentence breaks', -'IntlCodePointBreakIterator::createTitleInstance' => 'Create break iterator for title-casing breaks', -'IntlCodePointBreakIterator::createWordInstance' => 'Create break iterator for word breaks', -'IntlCodePointBreakIterator::current' => 'Get index of current position', -'IntlCodePointBreakIterator::first' => 'Set position to the first character in the text', -'IntlCodePointBreakIterator::following' => 'Advance the iterator to the first boundary following specified offset', -'IntlCodePointBreakIterator::getErrorCode' => 'Get last error code on the object', -'IntlCodePointBreakIterator::getErrorMessage' => 'Get last error message on the object', -'intlcodepointbreakiterator::getLastCodePoint' => 'Get last code point passed over after advancing or receding the iterator', -'IntlCodePointBreakIterator::getLocale' => 'Get the locale associated with the object', -'IntlCodePointBreakIterator::getPartsIterator' => 'Create iterator for navigating fragments between boundaries', -'IntlCodePointBreakIterator::getText' => 'Get the text being scanned', -'IntlCodePointBreakIterator::isBoundary' => 'Tell whether an offset is a boundaryʼs offset', -'IntlCodePointBreakIterator::last' => 'Set the iterator position to index beyond the last character', -'IntlCodePointBreakIterator::next' => 'Advance the iterator the next boundary', -'IntlCodePointBreakIterator::preceding' => 'Set the iterator position to the first boundary before an offset', -'IntlCodePointBreakIterator::previous' => 'Set the iterator position to the boundary immediately before the current', -'IntlCodePointBreakIterator::setText' => 'Set the text being scanned', -'IntlDateFormatter::create' => 'Create a date formatter', -'intldateformatter::format' => 'Format the date/time value as a string', -'intldateformatter::formatObject' => 'Formats an object', -'intldateformatter::getCalendar' => 'Get the calendar type used for the IntlDateFormatter', -'intldateformatter::getCalendarObject' => 'Get copy of formatterʼs calendar object', -'intldateformatter::getDateType' => 'Get the datetype used for the IntlDateFormatter', -'intldateformatter::getErrorCode' => 'Get the error code from last operation', -'intldateformatter::getErrorMessage' => 'Get the error text from the last operation', -'intldateformatter::getLocale' => 'Get the locale used by formatter', -'intldateformatter::getPattern' => 'Get the pattern used for the IntlDateFormatter', -'intldateformatter::getTimeType' => 'Get the timetype used for the IntlDateFormatter', -'intldateformatter::getTimeZone' => 'Get formatterʼs timezone', -'intldateformatter::getTimeZoneId' => 'Get the timezone-id used for the IntlDateFormatter', -'intldateformatter::isLenient' => 'Get the lenient used for the IntlDateFormatter', -'intldateformatter::localtime' => 'Parse string to a field-based time value', -'intldateformatter::parse' => 'Parse string to a timestamp value', -'intldateformatter::setCalendar' => 'Sets the calendar type used by the formatter', -'intldateformatter::setLenient' => 'Set the leniency of the parser', -'intldateformatter::setPattern' => 'Set the pattern used for the IntlDateFormatter', -'intldateformatter::setTimeZone' => 'Sets formatterʼs timezone', -'intldateformatter::setTimeZoneId' => 'Sets the time zone to use', -'intlgregoriancalendar::__construct' => 'Create the Gregorian Calendar class', -'intlgregoriancalendar::getGregorianChange' => 'Get the Gregorian Calendar change date', -'intlgregoriancalendar::isLeapYear' => 'Determine if the given year is a leap year', -'intlgregoriancalendar::setGregorianChange' => 'Set the Gregorian Calendar the change date', -'intliterator::current' => 'Get the current element', -'intliterator::key' => 'Get the current key', -'intliterator::next' => 'Move forward to the next element', -'intliterator::rewind' => 'Rewind the iterator to the first element', -'intliterator::valid' => 'Check if current position is valid', -'intlpartsiterator::getBreakIterator' => 'Get IntlBreakIterator backing this parts iterator', -'intlrulebasedbreakiterator::__construct' => 'Create iterator from ruleset', -'IntlRuleBasedBreakIterator::createCharacterInstance' => 'Create break iterator for boundaries of combining character sequences', -'IntlRuleBasedBreakIterator::createLineInstance' => 'Create break iterator for logically possible line breaks', -'IntlRuleBasedBreakIterator::createSentenceInstance' => 'Create break iterator for sentence breaks', -'IntlRuleBasedBreakIterator::createTitleInstance' => 'Create break iterator for title-casing breaks', -'IntlRuleBasedBreakIterator::createWordInstance' => 'Create break iterator for word breaks', -'IntlRuleBasedBreakIterator::current' => 'Get index of current position', -'IntlRuleBasedBreakIterator::first' => 'Set position to the first character in the text', -'IntlRuleBasedBreakIterator::following' => 'Advance the iterator to the first boundary following specified offset', -'intlrulebasedbreakiterator::getBinaryRules' => 'Get the binary form of compiled rules', -'IntlRuleBasedBreakIterator::getErrorCode' => 'Get last error code on the object', -'IntlRuleBasedBreakIterator::getErrorMessage' => 'Get last error message on the object', -'IntlRuleBasedBreakIterator::getLocale' => 'Get the locale associated with the object', -'IntlRuleBasedBreakIterator::getPartsIterator' => 'Create iterator for navigating fragments between boundaries', -'intlrulebasedbreakiterator::getRules' => 'Get the rule set used to create this object', -'intlrulebasedbreakiterator::getRuleStatus' => 'Get the largest status value from the break rules that determined the current break position', -'intlrulebasedbreakiterator::getRuleStatusVec' => 'Get the status values from the break rules that determined the current break position', -'IntlRuleBasedBreakIterator::getText' => 'Get the text being scanned', -'IntlRuleBasedBreakIterator::isBoundary' => 'Tell whether an offset is a boundaryʼs offset', -'IntlRuleBasedBreakIterator::last' => 'Set the iterator position to index beyond the last character', -'IntlRuleBasedBreakIterator::next' => 'Advance the iterator the next boundary', -'IntlRuleBasedBreakIterator::preceding' => 'Set the iterator position to the first boundary before an offset', -'IntlRuleBasedBreakIterator::previous' => 'Set the iterator position to the boundary immediately before the current', -'IntlRuleBasedBreakIterator::setText' => 'Set the text being scanned', -'intltimezone::countEquivalentIDs' => 'Get the number of IDs in the equivalency group that includes the given ID', -'intltimezone::createDefault' => 'Create a new copy of the default timezone for this host', -'intltimezone::createEnumeration' => 'Get an enumeration over time zone IDs associated with the given country or offset', -'intltimezone::createTimeZone' => 'Create a timezone object for the given ID', -'intltimezone::createTimeZoneIDEnumeration' => 'Get an enumeration over system time zone IDs with the given filter conditions', -'intltimezone::fromDateTimeZone' => 'Create a timezone object from DateTimeZone', -'intltimezone::getCanonicalID' => 'Get the canonical system timezone ID or the normalized custom time zone ID for the given time zone ID', -'intltimezone::getDisplayName' => 'Get a name of this time zone suitable for presentation to the user', -'intltimezone::getDSTSavings' => 'Get the amount of time to be added to local standard time to get local wall clock time', -'intltimezone::getEquivalentID' => 'Get an ID in the equivalency group that includes the given ID', -'intltimezone::getErrorCode' => 'Get last error code on the object', -'intltimezone::getErrorMessage' => 'Get last error message on the object', -'intltimezone::getGMT' => 'Create GMT (UTC) timezone', -'intltimezone::getID' => 'Get timezone ID', -'intltimezone::getIDForWindowsID' => 'Translate a Windows timezone into a system timezone', -'intltimezone::getOffset' => 'Get the time zone raw and GMT offset for the given moment in time', -'intltimezone::getRawOffset' => 'Get the raw GMT offset (before taking daylight savings time into account', -'intltimezone::getRegion' => 'Get the region code associated with the given system time zone ID', -'intltimezone::getTZDataVersion' => 'Get the timezone data version currently used by ICU', -'intltimezone::getUnknown' => 'Get the "unknown" time zone', -'intltimezone::getWindowsID' => 'Translate a system timezone into a Windows timezone', -'intltimezone::hasSameRules' => 'Check if this zone has the same rules and offset as another zone', -'intltimezone::toDateTimeZone' => 'Convert to DateTimeZone object', -'intltimezone::useDaylightTime' => 'Check if this time zone uses daylight savings time', -'intltz_getGMT' => '(PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)<br/> -Create GMT (UTC) timezone', -'intval' => 'Get the integer value of a variable', -'ip2long' => 'Converts a string containing an (IPv4) Internet Protocol dotted address into a long integer', -'iptcembed' => 'Embeds binary IPTC data into a JPEG image', -'iptcparse' => 'Parse a binary IPTC block into single tags', -'is_a' => 'Checks if the object is of this class or has this class as one of its parents', -'is_array' => 'Finds whether a variable is an array', -'is_bool' => 'Finds out whether a variable is a boolean', -'is_callable' => 'Verify that the contents of a variable can be called as a function', -'is_countable' => 'Verify that the contents of a variable is a countable value', -'is_dir' => 'Tells whether the filename is a directory', -'is_double' => 'Alias of is_float', -'is_executable' => 'Tells whether the filename is executable', -'is_file' => 'Tells whether the filename is a regular file', -'is_finite' => 'Finds whether a value is a legal finite number', -'is_float' => 'Finds whether the type of a variable is float', -'is_infinite' => 'Finds whether a value is infinite', -'is_int' => 'Find whether the type of a variable is integer', -'is_integer' => 'Alias of is_int', -'is_iterable' => 'Verify that the contents of a variable is an iterable value', -'is_link' => 'Tells whether the filename is a symbolic link', -'is_long' => 'Alias of is_int', -'is_nan' => 'Finds whether a value is not a number', -'is_null' => 'Finds whether a variable is `null`', -'is_numeric' => 'Finds whether a variable is a number or a numeric string', -'is_object' => 'Finds whether a variable is an object', -'is_readable' => 'Tells whether a file exists and is readable', -'is_real' => 'Alias of is_float', -'is_resource' => 'Finds whether a variable is a resource', -'is_scalar' => 'Finds whether a variable is a scalar', -'is_soap_fault' => 'Checks if a SOAP call has failed', -'is_string' => 'Find whether the type of a variable is string', -'is_subclass_of' => 'Checks if the object has this class as one of its parents or implements it', -'is_tainted' => 'Checks whether a string is tainted', -'is_uploaded_file' => 'Tells whether the file was uploaded via HTTP POST', -'is_writable' => 'Tells whether the filename is writable', -'is_writeable' => 'Alias of is_writable', -'isset' => 'Determine if a variable is set and is not `null`', -'Iterator::current' => 'Return the current element', -'Iterator::key' => 'Return the key of the current element', -'Iterator::next' => 'Move forward to next element', -'Iterator::rewind' => 'Rewind the Iterator to the first element', -'Iterator::valid' => 'Checks if current position is valid', -'iterator_apply' => 'Call a function for every element in an iterator', -'iterator_count' => 'Count the elements in an iterator', -'iterator_to_array' => 'Copy the iterator into an array', -'IteratorAggregate::getIterator' => 'Retrieve an external iterator', -'iteratoriterator::__construct' => 'Create an iterator from anything that is traversable', -'iteratoriterator::current' => 'Get the current value', -'iteratoriterator::getInnerIterator' => 'Get the inner iterator', -'iteratoriterator::key' => 'Get the key of the current element', -'iteratoriterator::next' => 'Forward to the next element', -'iteratoriterator::rewind' => 'Rewind to the first element', -'iteratoriterator::valid' => 'Checks if the iterator is valid', -'java' => 'Create Java object', -'java::java' => 'Create Java object', -'JavaException::getCause' => 'Get Java exception that led to this exception', -'jddayofweek' => 'Returns the day of the week', -'jdmonthname' => 'Returns a month name', -'jdtofrench' => 'Converts a Julian Day Count to the French Republican Calendar', -'jdtogregorian' => 'Converts Julian Day Count to Gregorian date', -'jdtojewish' => 'Converts a Julian day count to a Jewish calendar date', -'jdtojulian' => 'Converts a Julian Day Count to a Julian Calendar Date', -'jdtounix' => 'Convert Julian Day to Unix timestamp', -'jewishtojd' => 'Converts a date in the Jewish Calendar to Julian Day Count', -'join' => 'Alias of implode', -'jpeg2wbmp' => 'Convert JPEG image file to WBMP image file', -'json_decode' => 'Decodes a JSON string', -'json_encode' => 'Returns the JSON representation of a value', -'json_last_error' => 'Returns the last error occurred', -'json_last_error_msg' => 'Returns the error string of the last json_encode() or json_decode() call', -'jsonserializable::jsonSerialize' => 'Specify data which should be serialized to JSON', -'judy::__construct' => 'Construct a new Judy object', -'judy::__destruct' => 'Destruct a Judy object', -'judy::byCount' => 'Locate the Nth index present in the Judy array', -'judy::count' => 'Count the number of elements in the Judy array', -'judy::first' => 'Search for the first index in the Judy array', -'judy::firstEmpty' => 'Search for the first absent index in the Judy array', -'judy::free' => 'Free the entire Judy array', -'judy::getType' => 'Return the type of the current Judy array', -'judy::last' => 'Search for the last index in the Judy array', -'judy::lastEmpty' => 'Search for the last absent index in the Judy array', -'judy::memoryUsage' => 'Return the memory used by the Judy array', -'judy::next' => 'Search for the next index in the Judy array', -'judy::nextEmpty' => 'Search for the next absent index in the Judy array', -'judy::offsetExists' => 'Whether a offset exists', -'judy::offsetGet' => 'Offset to retrieve', -'judy::offsetSet' => 'Offset to set', -'judy::offsetUnset' => 'Offset to unset', -'judy::prev' => 'Search for the previous index in the Judy array', -'judy::prevEmpty' => 'Search for the previous absent index in the Judy array', -'judy::size' => 'Return the size of the current Judy array', -'judy_type' => 'Return the type of a Judy array', -'judy_version' => 'Return or print the current PHP Judy version', -'juliantojd' => 'Converts a Julian Calendar date to Julian Day Count', -'kadm5_chpass_principal' => 'Changes the principal\'s password', -'kadm5_create_principal' => 'Creates a kerberos principal with the given parameters', -'kadm5_delete_principal' => 'Deletes a kerberos principal', -'kadm5_destroy' => 'Closes the connection to the admin server and releases all related resources', -'kadm5_flush' => 'Flush all changes to the Kerberos database', -'kadm5_get_policies' => 'Gets all policies from the Kerberos database', -'kadm5_get_principal' => 'Gets the principal\'s entries from the Kerberos database', -'kadm5_get_principals' => 'Gets all principals from the Kerberos database', -'kadm5_init_with_password' => 'Opens a connection to the KADM5 library', -'kadm5_modify_principal' => 'Modifies a kerberos principal with the given parameters', -'key' => 'Fetch a key from an array', -'key_exists' => 'Alias of array_key_exists', -'krsort' => 'Sort an array by key in reverse order', -'ksort' => 'Sort an array by key', -'ktaglib_id3v2_frame::getDescription' => 'Returns a description for the picture in a picture frame', -'ktaglib_id3v2_frame::getMimeType' => 'Returns the mime type of the picture', -'ktaglib_id3v2_frame::getType' => 'Returns the type of the image', -'ktaglib_id3v2_frame::savePicture' => 'Saves the picture to a file', -'ktaglib_id3v2_frame::setMimeType' => 'Set\'s the mime type of the picture', -'ktaglib_id3v2_frame::setPicture' => 'Sets the frame picture to the given image', -'ktaglib_id3v2_frame::setType' => 'Set the type of the image', -'ktaglib_mpeg_audioproperties::getBitrate' => 'Returns the bitrate of the MPEG file', -'ktaglib_mpeg_audioproperties::getChannels' => 'Returns the amount of channels of a MPEG file', -'ktaglib_mpeg_audioproperties::getLayer' => 'Returns the layer of a MPEG file', -'ktaglib_mpeg_audioproperties::getLength' => 'Returns the length of a MPEG file', -'ktaglib_mpeg_audioproperties::getSampleBitrate' => 'Returns the sample bitrate of a MPEG file', -'ktaglib_mpeg_audioproperties::getVersion' => 'Returns the version of a MPEG file', -'ktaglib_mpeg_audioproperties::isCopyrighted' => 'Returns the copyright status of an MPEG file', -'ktaglib_mpeg_audioproperties::isOriginal' => 'Returns if the file is marked as the original file', -'ktaglib_mpeg_audioproperties::isProtectionEnabled' => 'Returns if protection mechanisms of an MPEG file are enabled', -'ktaglib_mpeg_file::__construct' => 'Opens a new file', -'ktaglib_mpeg_file::getAudioProperties' => 'Returns an object that provides access to the audio properties', -'ktaglib_mpeg_file::getID3v1Tag' => 'Returns an object representing an ID3v1 tag', -'ktaglib_mpeg_file::getID3v2Tag' => 'Returns a ID3v2 object', -'labelcacheObj::freeCache' => 'Free the label cache. Always returns MS_SUCCESS. -Ex : map->labelcache->freeCache();', -'labelObj::convertToString' => 'Saves the object to a string. Provides the inverse option for -updateFromString.', -'labelObj::deleteStyle' => 'Delete the style specified by the style index. If there are any -style that follow the deleted style, their index will decrease by 1.', -'labelObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the -resources.', -'labelObj::getBinding' => 'Get the attribute binding for a specified label property. Returns -NULL if there is no binding for this property. -Example: -.. code-block:: php -$oLabel->setbinding(MS_LABEL_BINDING_COLOR, "FIELD_NAME_COLOR"); -echo $oLabel->getbinding(MS_LABEL_BINDING_COLOR); // FIELD_NAME_COLOR', -'labelObj::getExpressionString' => 'Returns the label expression string.', -'labelObj::getStyle' => 'Return the style object using an index. index >= 0 && -index < label->numstyles.', -'labelObj::getTextString' => 'Returns the label text string.', -'labelObj::moveStyleDown' => 'The style specified by the style index will be moved down into -the array of classes. Returns MS_SUCCESS or MS_FAILURE. -ex label->movestyledown(0) will have the effect of moving style 0 -up to position 1, and the style at position 1 will be moved -to position 0.', -'labelObj::moveStyleUp' => 'The style specified by the style index will be moved up into -the array of classes. Returns MS_SUCCESS or MS_FAILURE. -ex label->movestyleup(1) will have the effect of moving style 1 -up to position 0, and the style at position 0 will be moved -to position 1.', -'labelObj::removeBinding' => 'Remove the attribute binding for a specfiled style property. -Example: -.. code-block:: php -$oStyle->removebinding(MS_LABEL_BINDING_COLOR);', -'labelObj::set' => 'Set object property to a new value.', -'labelObj::setBinding' => 'Set the attribute binding for a specified label property. -Example: -.. code-block:: php -$oLabel->setbinding(MS_LABEL_BINDING_COLOR, "FIELD_NAME_COLOR"); -This would bind the color parameter with the data (ie will extract -the value of the color from the field called "FIELD_NAME_COLOR"', -'labelObj::setExpression' => 'Set the label expression.', -'labelObj::setText' => 'Set the label text.', -'labelObj::updateFromString' => 'Update a label from a string snippet. Returns MS_SUCCESS/MS_FAILURE.', -'lapack::eigenValues' => 'This function returns the eigenvalues for a given square matrix', -'lapack::identity' => 'Return an identity matrix', -'lapack::leastSquaresByFactorisation' => 'Calculate the linear least squares solution of a matrix using QR factorisation', -'lapack::leastSquaresBySVD' => 'Solve the linear least squares problem, using SVD', -'lapack::pseudoInverse' => 'Calculate the inverse of a matrix', -'lapack::singularValues' => 'Calculated the singular values of a matrix', -'lapack::solveLinearEquation' => 'Solve a system of linear equations', -'layerObj::addFeature' => 'Add a new feature in a layer. Returns MS_SUCCESS or MS_FAILURE on -error.', -'layerObj::applySLD' => 'Apply the :ref:`SLD <sld>` document to the layer object. -The matching between the sld document and the layer will be done -using the layer\'s name. -If a namedlayer argument is passed (argument is optional), -the NamedLayer in the sld that matches it will be used to style -the layer. -See :ref:`SLD HowTo <sld>` for more information on the SLD support.', -'layerObj::applySLDURL' => 'Apply the :ref:`SLD <sld>` document pointed by the URL to the -layer object. The matching between the sld document and the layer -will be done using the layer\'s name. If a namedlayer argument is -passed (argument is optional), the NamedLayer in the sld that -matches it will be used to style the layer. See :ref:`SLD HowTo -<sld>` for more information on the SLD support.', -'layerObj::clearProcessing' => 'Clears all the processing strings.', -'layerObj::close' => 'Close layer previously opened with open().', -'layerObj::convertToString' => 'Saves the object to a string. Provides the inverse option for -updateFromString.', -'layerObj::draw' => 'Draw a single layer, add labels to cache if required. -Returns MS_SUCCESS or MS_FAILURE on error.', -'layerObj::drawQuery' => 'Draw query map for a single layer. -string executeWFSGetfeature() -Executes a GetFeature request on a WFS layer and returns the -name of the temporary GML file created. Returns an empty -string on error.', -'layerObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the -resources.', -'layerObj::generateSLD' => 'Returns an SLD XML string based on all the classes found in the -layer (the layer must have `STATUS` `on`).', -'layerObj::getClass' => 'Returns a classObj from the layer given an index value (0=first class)', -'layerObj::getClassIndex' => 'Get the class index of a shape for a given scale. Returns -1 if no -class matches. classgroup is an array of class ids to check -(Optional). numclasses is the number of classes that the classgroup -array contains. By default, all the layer classes will be checked.', -'layerObj::getExtent' => 'Returns the layer\'s data extents or NULL on error. -If the layer\'s EXTENT member is set then this value is used, -otherwise this call opens/closes the layer to read the -extents. This is quick on shapefiles, but can be -an expensive operation on some file formats or data sources. -This function is safe to use on both opened or closed layers: it -is not necessary to call open()/close() before/after calling it.', -'layerObj::getFilterString' => 'Returns the :ref:`expression <expressions>` for this layer or NULL -on error.', -'layerObj::getGridIntersectionCoordinates' => 'Returns an array containing the grid intersection coordinates. If -there are no coordinates, it returns an empty array.', -'layerObj::getItems' => 'Returns an array containing the items. Must call open function first. -If there are no items, it returns an empty array.', -'layerObj::getMetaData' => 'Fetch layer metadata entry by name. Returns "" if no entry -matches the name. Note that the search is case sensitive. -.. note:: -getMetaData\'s query is case sensitive.', -'layerObj::getNumResults' => 'Returns the number of results in the last query.', -'layerObj::getProcessing' => 'Returns an array containing the processing strings. -If there are no processing strings, it returns an empty array.', -'layerObj::getProjection' => 'Returns a string representation of the :ref:`projection <projection>`. -Returns NULL on error or if no projection is set.', -'layerObj::getResult' => 'Returns a resultObj by index from a layer object with -index in the range 0 to numresults-1. -Returns a valid object or FALSE(0) if index is invalid.', -'layerObj::getResultsBounds' => 'Returns the bounding box of the latest result.', -'layerObj::getShape' => 'If the resultObj passed has a valid resultindex, retrieve shapeObj from -a layer\'s resultset. (You get it from the resultObj returned by -getResult() for instance). Otherwise, it will do a single query on -the layer to fetch the shapeindex -.. code-block:: php -$map = new mapObj("gmap75.map"); -$l = $map->getLayerByName("popplace"); -$l->queryByRect($map->extent); -for ($i=0; $i<$l->getNumResults();$i++){ -$s = $l->getShape($l->getResult($i)); -echo $s->getValue($l,"Name"); -echo "\n"; -}', -'layerObj::getWMSFeatureInfoURL' => 'Returns a WMS GetFeatureInfo URL (works only for WMS layers) -clickX, clickY is the location of to query in pixel coordinates -with (0,0) at the top left of the image. -featureCount is the number of results to return. -infoFormat is the format the format in which the result should be -requested. Depends on remote server\'s capabilities. MapServer -WMS servers support only "MIME" (and should support "GML.1" soon). -Returns "" and outputs a warning if layer is not a WMS layer -or if it is not queryable.', -'layerObj::isVisible' => 'Returns MS_TRUE/MS_FALSE depending on whether the layer is -currently visible in the map (i.e. turned on, in scale, etc.).', -'layerObj::moveclassdown' => 'The class specified by the class index will be moved down into -the array of layers. Returns MS_SUCCESS or MS_FAILURE. -ex layer->moveclassdown(0) will have the effect of moving class 0 -up to position 1, and the class at position 1 will be moved -to position 0.', -'layerObj::moveclassup' => 'The class specified by the class index will be moved up into -the array of layers. Returns MS_SUCCESS or MS_FAILURE. -ex layer->moveclassup(1) will have the effect of moving class 1 -up to position 0, and the class at position 0 will be moved -to position 1.', -'layerObj::ms_newLayerObj' => 'Old style constructor', -'layerObj::nextShape' => 'Called after msWhichShapes has been called to actually retrieve -shapes within a given area. Returns a shape object or NULL on -error. -.. code-block:: php -$map = ms_newmapobj("d:/msapps/gmap-ms40/htdocs/gmap75.map"); -$layer = $map->getLayerByName(\'road\'); -$status = $layer->open(); -$status = $layer->whichShapes($map->extent); -while ($shape = $layer->nextShape()) -{ -echo $shape->index ."<br>\n"; -} -$layer->close();', -'layerObj::open' => 'Open the layer for use with getShape(). -Returns MS_SUCCESS/MS_FAILURE.', -'layerObj::queryByAttributes' => 'Query layer for shapes that intersect current map extents. qitem -is the item (attribute) on which the query is performed, and -qstring is the expression to match. The query is performed on all -the shapes that are part of a :ref:`CLASS` that contains a -:ref:`TEMPLATE <template>` value or that match any class in a -layer that contains a :ref:`LAYER` :ref:`TEMPLATE <template>` -value. Note that the layer\'s FILTER/FILTERITEM are ignored by -this function. Mode is MS_SINGLE or MS_MULTIPLE depending on -number of results you want. Returns MS_SUCCESS if shapes were -found or MS_FAILURE if nothing was found or if some other error -happened (note that the error message in case nothing was found -can be avoided in PHP using the \'@\' control operator).', -'layerObj::queryByFeatures' => 'Perform a query set based on a previous set of results from -another layer. At present the results MUST be based on a polygon -layer. -Returns MS_SUCCESS if shapes were found or MS_FAILURE if nothing -was found or if some other error happened (note that the error -message in case nothing was found can be avoided in PHP using -the \'@\' control operator).', -'layerObj::queryByPoint' => 'Query layer at point location specified in georeferenced map -coordinates (i.e. not pixels). -The query is performed on all the shapes that are part of a CLASS -that contains a TEMPLATE value or that match any class in a -layer that contains a LAYER TEMPLATE value. -Mode is MS_SINGLE or MS_MULTIPLE depending on number of results -you want. -Passing buffer -1 defaults to tolerances set in the map file -(in pixels) but you can use a constant buffer (specified in -ground units) instead. -Returns MS_SUCCESS if shapes were found or MS_FAILURE if nothing -was found or if some other error happened (note that the error -message in case nothing was found can be avoided in PHP using -the \'@\' control operator).', -'layerObj::queryByRect' => 'Query layer using a rectangle specified in georeferenced map -coordinates (i.e. not pixels). -The query is performed on all the shapes that are part of a CLASS -that contains a TEMPLATE value or that match any class in a -layer that contains a LAYER TEMPLATE value. -Returns MS_SUCCESS if shapes were found or MS_FAILURE if nothing -was found or if some other error happened (note that the error -message in case nothing was found can be avoided in PHP using -the \'@\' control operator).', -'layerObj::queryByShape' => 'Query layer based on a single shape, the shape has to be a polygon -at this point. -Returns MS_SUCCESS if shapes were found or MS_FAILURE if nothing -was found or if some other error happened (note that the error -message in case nothing was found can be avoided in PHP using -the \'@\' control operator).', -'layerObj::removeClass' => 'Removes the class indicated and returns a copy, or NULL in the case -of a failure. Note that subsequent classes will be renumbered by -this operation. The numclasses field contains the number of classes -available.', -'layerObj::removeMetaData' => 'Remove a metadata entry for the layer. Returns MS_SUCCESS/MS_FAILURE.', -'layerObj::set' => 'Set object property to a new value.', -'layerObj::setConnectionType' => 'Changes the connectiontype of the layer and recreates the vtable -according to the new connection type. This method should be used -instead of setting the connectiontype parameter directly. -In the case when the layer.connectiontype = MS_PLUGIN the plugin_library -parameter should also be specified so as to select the library to -load by MapServer. For the other connection types this parameter -is not used.', -'layerObj::setFilter' => 'Set layer filter :ref:`expression <expressions>`.', -'layerObj::setMetaData' => 'Set a metadata entry for the layer. Returns MS_SUCCESS/MS_FAILURE. -int setProcessing(string) -Add the string to the processing string list for the layer. -The layer->num_processing is incremented by 1. -Returns MS_SUCCESS or MS_FAILURE on error. -.. code-block:: php -$oLayer->setprocessing("SCALE_1=AUTO"); -$oLayer->setprocessing("SCALE_2=AUTO");', -'layerObj::setProjection' => 'Set layer :ref:`projection <projection>` and coordinate system. -Parameters are given as a single string of comma-delimited PROJ.4 -parameters. Returns MS_SUCCESS or MS_FAILURE on error.', -'layerObj::setWKTProjection' => 'Same as setProjection(), but takes an OGC WKT projection -definition string as input. -.. note:: -setWKTProjection requires GDAL support', -'layerObj::updateFromString' => 'Update a layer from a string snippet. Returns MS_SUCCESS/MS_FAILURE. -.. code-block:: php -modify the name -$oLayer->updateFromString(\'LAYER NAME land_fn2 END\'); -add a new class -$oLayer->updateFromString(\'LAYER CLASS STYLE COLOR 255 255 0 END END END\'); -int whichshapes(rectobj) -Performs a spatial, and optionally an attribute based feature -search. The function basically prepares things so that candidate -features can be accessed by query or drawing functions (eg using -nextshape function). Returns MS_SUCCESS, MS_FAILURE or MS_DONE. -MS_DONE is returned if the layer extent does not overlap the -rectObj.', -'lcfirst' => 'Make a string\'s first character lowercase', -'lcg_value' => 'Combined linear congruential generator', -'lchgrp' => 'Changes group ownership of symlink', -'lchown' => 'Changes user ownership of symlink', -'ldap_8859_to_t61' => 'Translate 8859 characters to t61 characters', -'ldap_add' => 'Add entries to LDAP directory', -'ldap_add_ext' => 'Add entries to LDAP directory', -'ldap_bind' => 'Bind to LDAP directory', -'ldap_bind_ext' => 'Bind to LDAP directory', -'ldap_close' => 'Alias of ldap_unbind', -'ldap_compare' => 'Compare value of attribute found in entry specified with DN', -'ldap_connect' => 'Connect to an LDAP server', -'ldap_control_paged_result' => 'Send LDAP pagination control', -'ldap_control_paged_result_response' => 'Retrieve the LDAP pagination cookie', -'ldap_count_entries' => 'Count the number of entries in a search', -'ldap_delete' => 'Delete an entry from a directory', -'ldap_delete_ext' => 'Delete an entry from a directory', -'ldap_dn2ufn' => 'Convert DN to User Friendly Naming format', -'ldap_err2str' => 'Convert LDAP error number into string error message', -'ldap_errno' => 'Return the LDAP error number of the last LDAP command', -'ldap_error' => 'Return the LDAP error message of the last LDAP command', -'ldap_escape' => 'Escape a string for use in an LDAP filter or DN', -'ldap_exop' => 'Performs an extended operation', -'ldap_exop_passwd' => 'PASSWD extended operation helper', -'ldap_exop_refresh' => 'Refresh extended operation helper', -'ldap_exop_whoami' => 'WHOAMI extended operation helper', -'ldap_explode_dn' => 'Splits DN into its component parts', -'ldap_first_attribute' => 'Return first attribute', -'ldap_first_entry' => 'Return first result id', -'ldap_first_reference' => 'Return first reference', -'ldap_free_result' => 'Free result memory', -'ldap_get_attributes' => 'Get attributes from a search result entry', -'ldap_get_dn' => 'Get the DN of a result entry', -'ldap_get_entries' => 'Get all result entries', -'ldap_get_option' => 'Get the current value for given option', -'ldap_get_values' => 'Get all values from a result entry', -'ldap_get_values_len' => 'Get all binary values from a result entry', -'ldap_list' => 'Single-level search', -'ldap_mod_add' => 'Add attribute values to current attributes', -'ldap_mod_add_ext' => 'Add attribute values to current attributes', -'ldap_mod_del' => 'Delete attribute values from current attributes', -'ldap_mod_del_ext' => 'Delete attribute values from current attributes', -'ldap_mod_replace' => 'Replace attribute values with new ones', -'ldap_mod_replace_ext' => 'Replace attribute values with new ones', -'ldap_modify' => 'Alias of ldap_mod_replace', -'ldap_modify_batch' => 'Batch and execute modifications on an LDAP entry', -'ldap_next_attribute' => 'Get the next attribute in result', -'ldap_next_entry' => 'Get next result entry', -'ldap_next_reference' => 'Get next reference', -'ldap_parse_exop' => 'Parse result object from an LDAP extended operation', -'ldap_parse_reference' => 'Extract information from reference entry', -'ldap_parse_result' => 'Extract information from result', -'ldap_read' => 'Read an entry', -'ldap_rename' => 'Modify the name of an entry', -'ldap_rename_ext' => 'Modify the name of an entry', -'ldap_sasl_bind' => 'Bind to LDAP directory using SASL', -'ldap_search' => 'Search LDAP tree', -'ldap_set_option' => 'Set the value of the given option', -'ldap_set_rebind_proc' => 'Set a callback function to do re-binds on referral chasing', -'ldap_sort' => 'Sort LDAP result entries on the client side', -'ldap_start_tls' => 'Start TLS', -'ldap_t61_to_8859' => 'Translate t61 characters to 8859 characters', -'ldap_unbind' => 'Unbind from LDAP directory', -'legendObj::convertToString' => 'Saves the object to a string. Provides the inverse option for -updateFromString.', -'legendObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the -resources.', -'legendObj::set' => 'Set object property to a new value.', -'legendObj::updateFromString' => 'Update a legend from a string snippet. Returns MS_SUCCESS/MS_FAILURE.', -'LevelDB::getProperty' => 'Valid properties: -- leveldb.stats: returns the status of the entire db -- leveldb.num-files-at-level: returns the number of files for each level. For example, you can use leveldb.num-files-at-level0 the number of files for zero level. -- leveldb.sstables: returns current status of sstables', -'LevelDB::set' => 'Alias of LevelDB::put()', -'LevelDB::write' => 'Executes all of the operations added in the write batch.', -'levenshtein' => 'Calculate Levenshtein distance between two strings', -'libxml_clear_errors' => 'Clear libxml error buffer', -'libxml_disable_entity_loader' => 'Disable the ability to load external entities', -'libxml_get_errors' => 'Retrieve array of errors', -'libxml_get_last_error' => 'Retrieve last error from libxml', -'libxml_set_external_entity_loader' => 'Changes the default external entity loader', -'libxml_set_streams_context' => 'Set the streams context for the next libxml document load or write', -'libxml_use_internal_errors' => 'Disable libxml errors and allow user to fetch error information as needed', -'limititerator::__construct' => 'Construct a LimitIterator', -'limititerator::current' => 'Get current element', -'limititerator::getInnerIterator' => 'Get inner iterator', -'limititerator::getPosition' => 'Return the current position', -'limititerator::key' => 'Get current key', -'limititerator::next' => 'Move the iterator forward', -'limititerator::rewind' => 'Rewind the iterator to the specified starting offset', -'limititerator::seek' => 'Seek to the given position', -'limititerator::valid' => 'Check whether the current element is valid', -'lineObj::add' => 'Add a point to the end of line. Returns MS_SUCCESS/MS_FAILURE.', -'lineObj::addXY' => 'Add a point to the end of line. Returns MS_SUCCESS/MS_FAILURE. -.. note:: -the 3rd parameter m is used for measured shape files only. -It is not mandatory.', -'lineObj::addXYZ' => 'Add a point to the end of line. Returns MS_SUCCESS/MS_FAILURE. -.. note:: -the 4th parameter m is used for measured shape files only. -It is not mandatory.', -'lineObj::ms_newLineObj' => 'Old style constructor', -'lineObj::point' => 'Returns a reference to point number i.', -'lineObj::project' => 'Project the line from "in" projection (1st argument) to "out" -projection (2nd argument). Returns MS_SUCCESS/MS_FAILURE.', -'link' => 'Create a hard link', -'linkinfo' => 'Gets information about a link', -'locale::acceptFromHttp' => 'Tries to find out best available locale based on HTTP "Accept-Language" header', -'locale::canonicalize' => 'Canonicalize the locale string', -'locale::composeLocale' => 'Returns a correctly ordered and delimited locale ID', -'locale::filterMatches' => 'Checks if a language tag filter matches with locale', -'locale::getAllVariants' => 'Gets the variants for the input locale', -'locale::getDefault' => 'Gets the default locale value from the INTL global \'default_locale\'', -'locale::getDisplayLanguage' => 'Returns an appropriately localized display name for language of the inputlocale', -'locale::getDisplayName' => 'Returns an appropriately localized display name for the input locale', -'locale::getDisplayRegion' => 'Returns an appropriately localized display name for region of the input locale', -'locale::getDisplayScript' => 'Returns an appropriately localized display name for script of the input locale', -'locale::getDisplayVariant' => 'Returns an appropriately localized display name for variants of the input locale', -'locale::getKeywords' => 'Gets the keywords for the input locale', -'locale::getPrimaryLanguage' => 'Gets the primary language for the input locale', -'locale::getRegion' => 'Gets the region for the input locale', -'locale::getScript' => 'Gets the script for the input locale', -'locale::lookup' => 'Searches the language tag list for the best match to the language', -'locale::parseLocale' => 'Returns a key-value array of locale ID subtag elements', -'locale::setDefault' => 'Sets the default runtime locale', -'localeconv' => 'Get numeric formatting information', -'localtime' => 'Get the local time', -'log' => 'Natural logarithm', -'log10' => 'Base-10 logarithm', -'log1p' => 'Returns log(1 + number), computed in a way that is accurate even when the value of number is close to zero', -'long2ip' => 'Converts an long integer address into a string in (IPv4) Internet standard dotted format', -'lstat' => 'Gives information about a file or symbolic link', -'ltrim' => 'Strip whitespace (or other characters) from the beginning of a string', -'lua::__construct' => 'Lua constructor', -'lua::assign' => 'Assign a PHP variable to Lua', -'Lua::call' => '`@return mixed` Returns result of the called function, null for wrong arguments or FALSE on other failure.', -'lua::eval' => 'Evaluate a string as Lua code', -'lua::getVersion' => 'The getversion purpose', -'lua::include' => 'Parse a Lua script file', -'lua::registerCallback' => 'Register a PHP function to Lua', -'luaclosure::__invoke' => 'Invoke luaclosure', -'lzf_compress' => 'LZF compression', -'lzf_decompress' => 'LZF decompression', -'lzf_optimized_for' => 'Determines what LZF extension was optimized for', -'m_checkstatus' => 'Check to see if a transaction has completed', -'m_completeauthorizations' => 'Number of complete authorizations in queue, returning an array of their identifiers', -'m_connect' => 'Establish the connection to MCVE', -'m_connectionerror' => 'Get a textual representation of why a connection failed', -'m_deletetrans' => 'Delete specified transaction from MCVE_CONN structure', -'m_destroyconn' => 'Destroy the connection and MCVE_CONN structure', -'m_destroyengine' => 'Free memory associated with IP/SSL connectivity', -'m_getcell' => 'Get a specific cell from a comma delimited response by column name', -'m_getcellbynum' => 'Get a specific cell from a comma delimited response by column number', -'m_getcommadelimited' => 'Get the RAW comma delimited data returned from MCVE', -'m_getheader' => 'Get the name of the column in a comma-delimited response', -'m_initconn' => 'Create and initialize an MCVE_CONN structure', -'m_initengine' => 'Ready the client for IP/SSL Communication', -'m_iscommadelimited' => 'Checks to see if response is comma delimited', -'m_maxconntimeout' => 'The maximum amount of time the API will attempt a connection to MCVE', -'m_monitor' => 'Perform communication with MCVE (send/receive data) Non-blocking', -'m_numcolumns' => 'Number of columns returned in a comma delimited response', -'m_numrows' => 'Number of rows returned in a comma delimited response', -'m_parsecommadelimited' => 'Parse the comma delimited response so m_getcell, etc will work', -'m_responsekeys' => 'Returns array of strings which represents the keys that can be used for response parameters on this transaction', -'m_responseparam' => 'Get a custom response parameter', -'m_returnstatus' => 'Check to see if the transaction was successful', -'m_setblocking' => 'Set blocking/non-blocking mode for connection', -'m_setdropfile' => 'Set the connection method to Drop-File', -'m_setip' => 'Set the connection method to IP', -'m_setssl' => 'Set the connection method to SSL', -'m_setssl_cafile' => 'Set SSL CA (Certificate Authority) file for verification of server certificate', -'m_setssl_files' => 'Set certificate key files and certificates if server requires client certificate verification', -'m_settimeout' => 'Set maximum transaction time (per trans)', -'m_sslcert_gen_hash' => 'Generate hash for SSL client certificate verification', -'m_transactionssent' => 'Check to see if outgoing buffer is clear', -'m_transinqueue' => 'Number of transactions in client-queue', -'m_transkeyval' => 'Add key/value pair to a transaction. Replaces deprecated transparam()', -'m_transnew' => 'Start a new transaction', -'m_transsend' => 'Finalize and send the transaction', -'m_uwait' => 'Wait x microsecs', -'m_validateidentifier' => 'Whether or not to validate the passed identifier on any transaction it is passed to', -'m_verifyconnection' => 'Set whether or not to PING upon connect to verify connection', -'m_verifysslcert' => 'Set whether or not to verify the server ssl certificate', -'magic_quotes_runtime' => 'Alias of set_magic_quotes_runtime', -'mail' => 'Send mail', -'mailparse_determine_best_xfer_encoding' => 'Gets the best way of encoding', -'mailparse_msg_create' => 'Create a mime mail resource', -'mailparse_msg_extract_part' => 'Extracts/decodes a message section', -'mailparse_msg_extract_part_file' => 'Extracts/decodes a message section', -'mailparse_msg_extract_whole_part_file' => 'Extracts a message section including headers without decoding the transfer encoding', -'mailparse_msg_free' => 'Frees a MIME resource', -'mailparse_msg_get_part' => 'Returns a handle on a given section in a mimemessage', -'mailparse_msg_get_part_data' => 'Returns an associative array of info about the message', -'mailparse_msg_get_structure' => 'Returns an array of mime section names in the supplied message', -'mailparse_msg_parse' => 'Incrementally parse data into buffer', -'mailparse_msg_parse_file' => 'Parses a file', -'mailparse_rfc822_parse_addresses' => 'Parse RFC 822 compliant addresses', -'mailparse_stream_encode' => 'Streams data from source file pointer, apply encoding and write to destfp', -'mailparse_uudecode_all' => 'Scans the data from fp and extract each embedded uuencoded file', -'main' => 'Dummy for main', -'mapObj::__construct' => 'Returns a new object to deal with a MapServer map file. -Construct a new mapObj from a mapfile string. Returns a new object to deal -with a MapServer map file. -.. note:: -By default, the SYMBOLSET, FONTSET, and other paths in the mapfile -are relative to the mapfile location. If new_map_path is provided -then this directory will be used as the base path for all the -rewlative paths inside the mapfile.', -'mapObj::appendOutputFormat' => 'Appends outputformat object in the map object. -Returns the new numoutputformats value.', -'mapObj::applyconfigoptions' => 'Applies the config options set in the map file. For example -setting the PROJ_LIB using the setconfigoption only modifies -the value in the map object. applyconfigoptions will actually -change the PROJ_LIB value that will be used when dealing with -projection.', -'mapObj::applySLD' => 'Apply the :ref:`SLD` document to the map file. The matching between the -sld document and the map file will be done using the layer\'s name. -See :ref:`SLD HowTo <sld>` for more information on the SLD support.', -'mapObj::applySLDURL' => 'Apply the SLD document pointed by the URL to the map file. The -matching between the sld document and the map file will be done -using the layer\'s name. -See :ref:`SLD HowTo <sld>` for more information on the SLD support.', -'mapObj::convertToString' => 'Saves the object to a string. -.. note:: -The inverse method updateFromString does not exist for the mapObj -.. versionadded:: 6.4', -'mapObj::draw' => 'Render map and return an image object or NULL on error.', -'mapObj::drawLabelCache' => 'Renders the labels for a map. Returns MS_SUCCESS or MS_FAILURE on error.', -'mapObj::drawLegend' => 'Render legend and return an image object.', -'mapObj::drawQuery' => 'Render a query map and return an image object or NULL on error.', -'mapObj::drawReferenceMap' => 'Render reference map and return an image object.', -'mapObj::drawScaleBar' => 'Render scale bar and return an image object.', -'mapObj::embedLegend' => 'embeds a legend. Actually the legend is just added to the label -cache so you must invoke drawLabelCache() to actually do the -rendering (unless postlabelcache is set in which case it is -drawn right away). Returns MS_SUCCESS or MS_FAILURE on error.', -'mapObj::embedScalebar' => 'embeds a scalebar. Actually the scalebar is just added to the label -cache so you must invoke drawLabelCache() to actually do the rendering -(unless postlabelcache is set in which case it is drawn right away). -Returns MS_SUCCESS or MS_FAILURE on error.', -'mapObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the -resources. -void freeQuery(layerindex) -Frees the query result on a specified layer. If the layerindex is -1, -all queries on layers will be freed.', -'mapObj::generateSLD' => 'Returns an SLD XML string based on all the classes found in all -the layers that have `STATUS` `on`.', -'mapObj::getAllGroupNames' => 'Return an array containing all the group names used in the -layers. If there are no groups, it returns an empty array.', -'mapObj::getAllLayerNames' => 'Return an array containing all the layer names. -If there are no layers, it returns an empty array.', -'mapObj::getColorbyIndex' => 'Returns a colorObj corresponding to the color index in the -palette.', -'mapObj::getConfigOption' => 'Returns the config value associated with the key. -Returns an empty string if key not found.', -'mapObj::getLabel' => 'Returns a labelcacheMemberObj from the map given an index value -(0=first label). Labelcache has to be enabled. -.. code-block:: php -while ($oLabelCacheMember = $oMap->getLabel($i)) { - do something with the labelcachemember -++$i; -}', -'mapObj::getLayer' => 'Returns a layerObj from the map given an index value (0=first layer)', -'mapObj::getLayerByName' => 'Returns a layerObj from the map given a layer name. -Returns NULL if layer doesn\'t exist.', -'mapObj::getLayersDrawingOrder' => 'Return an array containing layer\'s index in the order which they -are drawn. If there are no layers, it returns an empty array.', -'mapObj::getLayersIndexByGroup' => 'Return an array containing all the layer\'s indexes given -a group name. If there are no layers, it returns an empty array.', -'mapObj::getMetaData' => 'Fetch metadata entry by name (stored in the :ref:`WEB` object in -the map file). Returns "" if no entry matches the name. -.. note:: -getMetaData\'s query is case sensitive.', -'mapObj::getNumSymbols' => 'Return the number of symbols in map.', -'mapObj::getOutputFormat' => 'Returns the outputformat at index position.', -'mapObj::getProjection' => 'Returns a string representation of the projection. -Returns NULL on error or if no projection is set.', -'mapObj::getSymbolByName' => 'Returns the symbol index using the name.', -'mapObj::getSymbolObjectById' => 'Returns the symbol object using a symbol id. Refer to -the symbol object reference section for more details. -int insertLayer( layerObj layer [, int nIndex=-1 ] ) -Insert a copy of *layer* into the Map at index *nIndex*. The -default value of *nIndex* is -1, which means the last possible -index. Returns the index of the new Layer, or -1 in the case of a -failure.', -'mapObj::loadMapContext' => 'Available only if WMS support is enabled. Load a :ref:`WMS Map -Context <map_context>` XML file into the current mapObj. If the -map already contains some layers then the layers defined in the -WMS Map context document are added to the current map. The 2nd -argument unique_layer_name is optional and if set to MS_TRUE -layers created will have a unique name (unique prefix added to the -name). If set to MS_FALSE the layer name will be the the same name -as in the context. The default value is MS_FALSE. Returns -MS_SUCCESS/MS_FAILURE.', -'mapObj::loadOWSParameters' => 'Load OWS request parameters (BBOX, LAYERS, &c.) into map. Returns -MS_SUCCESS or MS_FAILURE. 2nd argument version is not mandatory. -If not given, the version will be set to 1.1.1 -int loadQuery(filename) -Loads a query from a file. Returns MS_SUCCESS or MS_FAILURE. -To be used with savequery.', -'mapObj::moveLayerDown' => 'Move layer down in the hierarchy of drawing. -Returns MS_SUCCESS or MS_FAILURE on error.', -'mapObj::moveLayerUp' => 'Move layer up in the hierarchy of drawing. -Returns MS_SUCCESS or MS_FAILURE on error.', -'mapObj::ms_newMapObjFromString' => 'Old style constructor', -'mapObj::offsetExtent' => 'Offset the map extent based on the given distances in map coordinates. -Returns MS_SUCCESS or MS_FAILURE.', -'mapObj::owsDispatch' => 'Processes and executes the passed OpenGIS Web Services request on -the map. Returns MS_DONE (2) if there is no valid OWS request in -the req object, MS_SUCCESS (0) if an OWS request was successfully -processed and MS_FAILURE (1) if an OWS request was not -successfully processed. OWS requests include :ref:`WMS -<wms_server>`, :ref:`WFS <wfs_server>`, :ref:`WCS <wcs_server>` -and :ref:`SOS <sos_server>` requests supported by MapServer. -Results of a dispatched request are written to stdout and can be -captured using the msIO services (ie. ms_ioinstallstdouttobuffer() -and ms_iogetstdoutbufferstring())', -'mapObj::prepareImage' => 'Return a blank image object.', -'mapObj::prepareQuery' => 'Calculate the scale of the map and set map->scaledenom.', -'mapObj::processLegendTemplate' => 'Process legend template files and return the result in a buffer. -.. seealso:: -:ref:`processtemplate <processtemplate>`', -'mapObj::processQueryTemplate' => 'Process query template files and return the result in a buffer. -Second argument generateimages is not mandatory. If not given -it will be set to TRUE. -.. seealso:: -:ref:`processtemplate <processtemplate>` -.. _processtemplate:', -'mapObj::processTemplate' => 'Process the template file specified in the web object and return the -result in a buffer. The processing consists of opening the template -file and replace all the tags found in it. Only tags that have an -equivalent element in the map object are replaced (ex [scaledenom]). -The are two exceptions to the previous statement : -- [img], [scalebar], [ref], [legend] would be replaced with the -appropriate url if the parameter generateimages is set to -MS_TRUE. (Note : the images corresponding to the different objects -are generated if the object is set to MS_ON in the map file) -- the user can use the params parameter to specify tags and -their values. For example if the user have a specific tag call -[my_tag] and would like it to be replaced by "value_of_my_tag" -he would do -.. code-block:: php -$tmparray["my_tag"] = "value_of_my_tag"; -$map->processtemplate($tmparray, MS_FALSE);', -'mapObj::queryByFeatures' => 'Perform a query based on a previous set of results from -a layer. At present the results MUST be based on a polygon layer. -Returns MS_SUCCESS if shapes were found or MS_FAILURE if nothing -was found or if some other error happened (note that the error -message in case nothing was found can be avoided in PHP using -the \'@\' control operator).', -'mapObj::queryByIndex' => 'Add a specific shape on a given layer to the query result. -If addtoquery (which is a non mandatory argument) is set to MS_TRUE, -the shape will be added to the existing query list. Default behavior -is to free the existing query list and add only the new shape.', -'mapObj::queryByPoint' => 'Query all selected layers in map at point location specified in -georeferenced map coordinates (i.e. not pixels). -The query is performed on all the shapes that are part of a :ref:`CLASS` -that contains a :ref:`TEMPLATE` value or that match any class in a -layer that contains a :ref:`LAYER` :ref:`TEMPLATE <template>` value. -Mode is MS_SINGLE or MS_MULTIPLE depending on number of results -you want. -Passing buffer -1 defaults to tolerances set in the map file -(in pixels) but you can use a constant buffer (specified in -ground units) instead. -Returns MS_SUCCESS if shapes were found or MS_FAILURE if nothing -was found or if some other error happened (note that the error -message in case nothing was found can be avoided in PHP using -the \'@\' control operator).', -'mapObj::queryByRect' => 'Query all selected layers in map using a rectangle specified in -georeferenced map coordinates (i.e. not pixels). The query is -performed on all the shapes that are part of a :ref:`CLASS` that -contains a :ref:`TEMPLATE` value or that match any class in a -layer that contains a :ref:`LAYER` :ref:`TEMPLATE <template>` -value. Returns MS_SUCCESS if shapes were found or MS_FAILURE if -nothing was found or if some other error happened (note that the -error message in case nothing was found can be avoided in PHP -using the \'@\' control operator).', -'mapObj::queryByShape' => 'Query all selected layers in map based on a single shape, the -shape has to be a polygon at this point. -Returns MS_SUCCESS if shapes were found or MS_FAILURE if nothing -was found or if some other error happened (note that the error -message in case nothing was found can be avoided in PHP using -the \'@\' control operator).', -'mapObj::removeLayer' => 'Remove a layer from the mapObj. The argument is the index of the -layer to be removed. Returns the removed layerObj on success, else -null.', -'mapObj::removeMetaData' => 'Remove a metadata entry for the map (stored in the WEB object in the map -file). Returns MS_SUCCESS/MS_FAILURE.', -'mapObj::removeOutputFormat' => 'Remove outputformat from the map. -Returns MS_SUCCESS/MS_FAILURE.', -'mapObj::save' => 'Save current map object state to a file. Returns -1 on error. -Use absolute path. If a relative path is used, then it will be -relative to the mapfile location.', -'mapObj::saveMapContext' => 'Available only if WMS support is enabled. Save current map object -state in :ref:`WMS Map Context <map_context>` format. Only WMS -layers are saved in the WMS Map Context XML file. Returns -MS_SUCCESS/MS_FAILURE.', -'mapObj::saveQuery' => 'Save the current query in a file. Results determines the save format - -MS_TRUE (or 1/true) saves the query results (tile index and shape index), -MS_FALSE (or 0/false) the query parameters (and the query will be re-run -in loadquery). Returns MS_SUCCESS or MS_FAILURE. Either save format can be -used with loadquery. See RFC 65 and ticket #3647 for details of different -save formats.', -'mapObj::scaleExtent' => 'Scale the map extent using the zoomfactor and ensure the extent -within the minscaledenom and maxscaledenom domain. If -minscaledenom and/or maxscaledenom is 0 then the parameter is not -taken into account. Returns MS_SUCCESS or MS_FAILURE.', -'mapObj::selectOutputFormat' => 'Selects the output format to be used in the map. -Returns MS_SUCCESS/MS_FAILURE. -.. note:: -the type used should correspond to one of the output formats -declared in the map file. The type argument passed is compared -with the mimetype parameter in the output format structure and -then to the name parameter in the structure.', -'mapObj::set' => 'Set map object property to new value.', -'mapObj::setCenter' => 'Set the map center to the given map point. -Returns MS_SUCCESS or MS_FAILURE.', -'mapObj::setConfigOption' => 'Sets a config parameter using the key and the value passed', -'mapObj::setExtent' => 'Set the map extents using the georef extents passed in argument. -Returns MS_SUCCESS or MS_FAILURE on error.', -'mapObj::setFontSet' => 'Load and set a new :ref:`fontset`. -boolean setLayersDrawingOrder(array layeryindex) -Set the layer\'s order array. The argument passed must be a valid -array with all the layer\'s index. -Returns MS_SUCCESS or MS_FAILURE on error.', -'mapObj::setMetaData' => 'Set a metadata entry for the map (stored in the WEB object in the map -file). Returns MS_SUCCESS/MS_FAILURE.', -'mapObj::setProjection' => 'Set map projection and coordinate system. Returns MS_SUCCESS or -MS_FAILURE on error. -Parameters are given as a single string of comma-delimited PROJ.4 -parameters. The argument : bSetUnitsAndExtents is used to -automatically update the map units and extents based on the new -projection. Possible values are MS_TRUE and MS_FALSE. By default it is -set at MS_FALSE.', -'mapObj::setRotation' => 'Set map rotation angle. The map view rectangle (specified in -EXTENTS) will be rotated by the indicated angle in the counter- -clockwise direction. Note that this implies the rendered map -will be rotated by the angle in the clockwise direction. -Returns MS_SUCCESS or MS_FAILURE.', -'mapObj::setSize' => 'Set the map width and height. This method updates the internal -geotransform and other data structures required for map rotation -so it should be used instead of setting the width and height members -directly. -Returns MS_SUCCESS or MS_FAILURE.', -'mapObj::setSymbolSet' => 'Load and set a symbol file dynamically.', -'mapObj::setWKTProjection' => 'Same as setProjection(), but takes an OGC WKT projection -definition string as input. Returns MS_SUCCESS or MS_FAILURE on error. -.. note:: -setWKTProjection requires GDAL support', -'mapObj::zoomPoint' => 'Zoom to a given XY position. Returns MS_SUCCESS or MS_FAILURE on error. -Parameters are -- Zoom factor : positive values do zoom in, negative values -zoom out. Factor of 1 will recenter. -- Pixel position (pointObj) : x, y coordinates of the click, -with (0,0) at the top-left -- Width : width in pixel of the current image. -- Height : Height in pixel of the current image. -- Georef extent (rectObj) : current georef extents. -- MaxGeoref extent (rectObj) : (optional) maximum georef extents. -If provided then it will be impossible to zoom/pan outside of -those extents.', -'mapObj::zoomRectangle' => 'Set the map extents to a given extents. Returns MS_SUCCESS or -MS_FAILURE on error. -Parameters are : -- oPixelExt (rect object) : Pixel Extents -- Width : width in pixel of the current image. -- Height : Height in pixel of the current image. -- Georef extent (rectObj) : current georef extents.', -'mapObj::zoomScale' => 'Zoom in or out to a given XY position so that the map is -displayed at specified scale. Returns MS_SUCCESS or MS_FAILURE on error. -Parameters are : -- ScaleDenom : Scale denominator of the scale at which the map -should be displayed. -- Pixel position (pointObj) : x, y coordinates of the click, -with (0,0) at the top-left -- Width : width in pixel of the current image. -- Height : Height in pixel of the current image. -- Georef extent (rectObj) : current georef extents. -- MaxGeoref extent (rectObj) : (optional) maximum georef extents. -If provided then it will be impossible to zoom/pan outside of -those extents.', -'max' => 'Find highest value', -'maxdb_bind_param' => 'Alias of maxdb_stmt_bind_param', -'maxdb_bind_result' => 'Alias of maxdb_stmt_bind_result', -'maxdb_client_encoding' => 'Alias of maxdb_character_set_name', -'maxdb_connect_errno' => 'Returns the error code from last connect call', -'maxdb_connect_error' => 'Returns a string description of the last connect error', -'maxdb_debug' => 'Performs debugging operations', -'maxdb_disable_rpl_parse' => 'Disable RPL parse', -'maxdb_dump_debug_info' => 'Dump debugging information into the log', -'maxdb_embedded_connect' => 'Open a connection to an embedded MaxDB server', -'maxdb_enable_reads_from_master' => 'Enable reads from master', -'maxdb_enable_rpl_parse' => 'Enable RPL parse', -'maxdb_escape_string' => 'Alias of maxdb_real_escape_string', -'maxdb_execute' => 'Alias of maxdb_stmt_execute', -'maxdb_fetch' => 'Alias of maxdb_stmt_fetch', -'maxdb_get_client_info' => 'Returns the MaxDB client version as a string', -'maxdb_get_client_version' => 'Get MaxDB client info', -'maxdb_get_metadata' => 'Alias of maxdb_stmt_result_metadata', -'maxdb_init' => 'Initializes MaxDB and returns an resource for use with maxdb_real_connect', -'maxdb_master_query' => 'Enforce execution of a query on the master in a master/slave setup', -'maxdb_param_count' => 'Alias of maxdb_stmt_param_count', -'maxdb_report' => 'Enables or disables internal report functions', -'maxdb_rpl_parse_enabled' => 'Check if RPL parse is enabled', -'maxdb_rpl_probe' => 'RPL probe', -'maxdb_send_long_data' => 'Alias of maxdb_stmt_send_long_data', -'maxdb_server_end' => 'Shut down the embedded server', -'maxdb_server_init' => 'Initialize embedded server', -'maxdb_set_opt' => 'Alias of maxdb_options', -'maxdb_stmt_sqlstate' => 'Returns SQLSTATE error from previous statement operation', -'maxdb_thread_safe' => 'Returns whether thread safety is given or not', -'mb_check_encoding' => 'Check if the string is valid for the specified encoding', -'mb_chr' => 'Get a specific character', -'mb_convert_case' => 'Perform case folding on a string', -'mb_convert_encoding' => 'Convert character encoding', -'mb_convert_kana' => 'Convert "kana" one from another ("zen-kaku", "han-kaku" and more)', -'mb_convert_variables' => 'Convert character code in variable(s)', -'mb_decode_mimeheader' => 'Decode string in MIME header field', -'mb_decode_numericentity' => 'Decode HTML numeric string reference to character', -'mb_detect_encoding' => 'Detect character encoding', -'mb_detect_order' => 'Set/Get character encoding detection order', -'mb_encode_mimeheader' => 'Encode string for MIME header', -'mb_encode_numericentity' => 'Encode character to HTML numeric string reference', -'mb_encoding_aliases' => 'Get aliases of a known encoding type', -'mb_ereg' => 'Regular expression match with multibyte support', -'mb_ereg_match' => 'Regular expression match for multibyte string', -'mb_ereg_replace' => 'Replace regular expression with multibyte support', -'mb_ereg_replace_callback' => 'Perform a regular expression search and replace with multibyte support using a callback', -'mb_ereg_search' => 'Multibyte regular expression match for predefined multibyte string', -'mb_ereg_search_getpos' => 'Returns start point for next regular expression match', -'mb_ereg_search_getregs' => 'Retrieve the result from the last multibyte regular expression match', -'mb_ereg_search_init' => 'Setup string and regular expression for a multibyte regular expression match', -'mb_ereg_search_pos' => 'Returns position and length of a matched part of the multibyte regular expression for a predefined multibyte string', -'mb_ereg_search_regs' => 'Returns the matched part of a multibyte regular expression', -'mb_ereg_search_setpos' => 'Set start point of next regular expression match', -'mb_eregi' => 'Regular expression match ignoring case with multibyte support', -'mb_eregi_replace' => 'Replace regular expression with multibyte support ignoring case', -'mb_get_info' => 'Get internal settings of mbstring', -'mb_http_input' => 'Detect HTTP input character encoding', -'mb_http_output' => 'Set/Get HTTP output character encoding', -'mb_internal_encoding' => 'Set/Get internal character encoding', -'mb_language' => 'Set/Get current language', -'mb_list_encodings' => 'Returns an array of all supported encodings', -'mb_ord' => 'Get code point of character', -'mb_output_handler' => 'Callback function converts character encoding in output buffer', -'mb_parse_str' => 'Parse GET/POST/COOKIE data and set global variable', -'mb_preferred_mime_name' => 'Get MIME charset string', -'mb_regex_encoding' => 'Set/Get character encoding for multibyte regex', -'mb_regex_set_options' => 'Set/Get the default options for mbregex functions', -'mb_send_mail' => 'Send encoded mail', -'mb_split' => 'Split multibyte string using regular expression', -'mb_strcut' => 'Get part of string', -'mb_strimwidth' => 'Get truncated string with specified width', -'mb_stripos' => 'Finds position of first occurrence of a string within another, case insensitive', -'mb_stristr' => 'Finds first occurrence of a string within another, case insensitive', -'mb_strlen' => 'Get string length', -'mb_strpos' => 'Find position of first occurrence of string in a string', -'mb_strrchr' => 'Finds the last occurrence of a character in a string within another', -'mb_strrichr' => 'Finds the last occurrence of a character in a string within another, case insensitive', -'mb_strripos' => 'Finds position of last occurrence of a string within another, case insensitive', -'mb_strrpos' => 'Find position of last occurrence of a string in a string', -'mb_strstr' => 'Finds first occurrence of a string within another', -'mb_strtolower' => 'Make a string lowercase', -'mb_strtoupper' => 'Make a string uppercase', -'mb_strwidth' => 'Return width of string', -'mb_substitute_character' => 'Set/Get substitution character', -'mb_substr' => 'Get part of string', -'mb_substr_count' => 'Count the number of substring occurrences', -'mcrypt_cbc' => 'Encrypts/decrypts data in CBC mode', -'mcrypt_cfb' => 'Encrypts/decrypts data in CFB mode', -'mcrypt_create_iv' => 'Creates an initialization vector (IV) from a random source', -'mcrypt_decrypt' => 'Decrypts crypttext with given parameters', -'mcrypt_ecb' => 'Deprecated: Encrypts/decrypts data in ECB mode', -'mcrypt_enc_get_algorithms_name' => 'Returns the name of the opened algorithm', -'mcrypt_enc_get_block_size' => 'Returns the blocksize of the opened algorithm', -'mcrypt_enc_get_iv_size' => 'Returns the size of the IV of the opened algorithm', -'mcrypt_enc_get_key_size' => 'Returns the maximum supported keysize of the opened mode', -'mcrypt_enc_get_modes_name' => 'Returns the name of the opened mode', -'mcrypt_enc_get_supported_key_sizes' => 'Returns an array with the supported keysizes of the opened algorithm', -'mcrypt_enc_is_block_algorithm' => 'Checks whether the algorithm of the opened mode is a block algorithm', -'mcrypt_enc_is_block_algorithm_mode' => 'Checks whether the encryption of the opened mode works on blocks', -'mcrypt_enc_is_block_mode' => 'Checks whether the opened mode outputs blocks', -'mcrypt_enc_self_test' => 'Runs a self test on the opened module', -'mcrypt_encrypt' => 'Encrypts plaintext with given parameters', -'mcrypt_generic' => 'This function encrypts data', -'mcrypt_generic_deinit' => 'This function deinitializes an encryption module', -'mcrypt_generic_end' => 'This function terminates encryption', -'mcrypt_generic_init' => 'This function initializes all buffers needed for encryption', -'mcrypt_get_block_size' => 'Gets the block size of the specified cipher', -'mcrypt_get_cipher_name' => 'Gets the name of the specified cipher', -'mcrypt_get_iv_size' => 'Returns the size of the IV belonging to a specific cipher/mode combination', -'mcrypt_get_key_size' => 'Gets the key size of the specified cipher', -'mcrypt_list_algorithms' => 'Gets an array of all supported ciphers', -'mcrypt_list_modes' => 'Gets an array of all supported modes', -'mcrypt_module_close' => 'Closes the mcrypt module', -'mcrypt_module_get_algo_block_size' => 'Returns the blocksize of the specified algorithm', -'mcrypt_module_get_algo_key_size' => 'Returns the maximum supported keysize of the opened mode', -'mcrypt_module_get_supported_key_sizes' => 'Returns an array with the supported keysizes of the opened algorithm', -'mcrypt_module_is_block_algorithm' => 'This function checks whether the specified algorithm is a block algorithm', -'mcrypt_module_is_block_algorithm_mode' => 'Returns if the specified module is a block algorithm or not', -'mcrypt_module_is_block_mode' => 'Returns if the specified mode outputs blocks or not', -'mcrypt_module_open' => 'Opens the module of the algorithm and the mode to be used', -'mcrypt_module_self_test' => 'This function runs a self test on the specified module', -'mcrypt_ofb' => 'Encrypts/decrypts data in OFB mode', -'md5' => 'Calculate the md5 hash of a string', -'md5_file' => 'Calculates the md5 hash of a given file', -'mdecrypt_generic' => 'Decrypts data', -'memcache::add' => 'Add an item to the server', -'memcache::addServer' => 'Add a memcached server to connection pool', -'memcache::close' => 'Close memcached server connection', -'memcache::connect' => 'Open memcached server connection', -'memcache::decrement' => 'Decrement item\'s value', -'memcache::delete' => 'Delete item from the server', -'memcache::flush' => 'Flush all existing items at the server', -'memcache::get' => 'Retrieve item from the server', -'memcache::getExtendedStats' => 'Get statistics from all servers in pool', -'memcache::getServerStatus' => 'Returns server status', -'memcache::getStats' => 'Get statistics of the server', -'memcache::getVersion' => 'Return version of the server', -'memcache::increment' => 'Increment item\'s value', -'memcache::pconnect' => 'Open memcached server persistent connection', -'memcache::replace' => 'Replace value of the existing item', -'memcache::set' => 'Store data at the server', -'memcache::setCompressThreshold' => 'Enable automatic compression of large values', -'memcache::setServerParams' => 'Changes server parameters and status at runtime', -'memcache_debug' => 'Turn debug output on/off', -'memcached::__construct' => 'Create a Memcached instance', -'memcached::add' => 'Add an item under a new key', -'memcached::addByKey' => 'Add an item under a new key on a specific server', -'memcached::addServer' => 'Add a server to the server pool', -'memcached::addServers' => 'Add multiple servers to the server pool', -'memcached::append' => 'Append data to an existing item', -'memcached::appendByKey' => 'Append data to an existing item on a specific server', -'memcached::cas' => 'Compare and swap an item', -'memcached::casByKey' => 'Compare and swap an item on a specific server', -'memcached::decrement' => 'Decrement numeric item\'s value', -'memcached::decrementByKey' => 'Decrement numeric item\'s value, stored on a specific server', -'memcached::delete' => 'Delete an item', -'memcached::deleteByKey' => 'Delete an item from a specific server', -'memcached::deleteMulti' => 'Delete multiple items', -'memcached::deleteMultiByKey' => 'Delete multiple items from a specific server', -'memcached::fetch' => 'Fetch the next result', -'memcached::fetchAll' => 'Fetch all the remaining results', -'memcached::flush' => 'Invalidate all items in the cache', -'memcached::get' => 'Retrieve an item', -'memcached::getAllKeys' => 'Gets the keys stored on all the servers', -'memcached::getByKey' => 'Retrieve an item from a specific server', -'memcached::getDelayed' => 'Request multiple items', -'memcached::getDelayedByKey' => 'Request multiple items from a specific server', -'memcached::getMulti' => 'Retrieve multiple items', -'memcached::getMultiByKey' => 'Retrieve multiple items from a specific server', -'memcached::getOption' => 'Retrieve a Memcached option value', -'memcached::getResultCode' => 'Return the result code of the last operation', -'memcached::getResultMessage' => 'Return the message describing the result of the last operation', -'memcached::getServerByKey' => 'Map a key to a server', -'memcached::getServerList' => 'Get the list of the servers in the pool', -'memcached::getStats' => 'Get server pool statistics', -'memcached::getVersion' => 'Get server pool version info', -'memcached::increment' => 'Increment numeric item\'s value', -'memcached::incrementByKey' => 'Increment numeric item\'s value, stored on a specific server', -'memcached::isPersistent' => 'Check if a persitent connection to memcache is being used', -'memcached::isPristine' => 'Check if the instance was recently created', -'memcached::prepend' => 'Prepend data to an existing item', -'memcached::prependByKey' => 'Prepend data to an existing item on a specific server', -'memcached::quit' => 'Close any open connections', -'memcached::replace' => 'Replace the item under an existing key', -'memcached::replaceByKey' => 'Replace the item under an existing key on a specific server', -'memcached::resetServerList' => 'Clears all servers from the server list', -'memcached::set' => 'Store an item', -'memcached::setByKey' => 'Store an item on a specific server', -'memcached::setMulti' => 'Store multiple items', -'memcached::setMultiByKey' => 'Store multiple items on a specific server', -'memcached::setOption' => 'Set a Memcached option', -'memcached::setOptions' => 'Set Memcached options', -'memcached::setSaslAuthData' => 'Set the credentials to use for authentication', -'memcached::touch' => 'Set a new expiration on an item', -'memcached::touchByKey' => 'Set a new expiration on an item on a specific server', -'MemcachePool::add' => 'Add an item to the server. If the key already exists, the value will not be added and <b>FALSE</b> will be returned.', -'MemcachePool::addServer' => 'Add a memcached server to connection pool', -'MemcachePool::close' => 'Close memcached server connection', -'MemcachePool::connect' => 'Open memcached server connection', -'MemcachePool::decrement' => 'Decrement item\'s value', -'MemcachePool::delete' => 'Delete item from the server -https://secure.php.net/manual/ru/memcache.delete.php', -'MemcachePool::flush' => 'Flush all existing items at the server', -'MemcachePool::get' => 'Retrieve item from the server', -'MemcachePool::getExtendedStats' => 'Get statistics from all servers in pool', -'MemcachePool::getServerStatus' => 'Returns server status', -'MemcachePool::getStats' => 'Get statistics of the server', -'MemcachePool::getVersion' => 'Return version of the server', -'MemcachePool::increment' => 'Increment item\'s value', -'MemcachePool::replace' => 'Replace value of the existing item', -'MemcachePool::set' => 'Stores an item var with key on the memcached server. Parameter expire is expiration time in seconds. -If it\'s 0, the item never expires (but memcached server doesn\'t guarantee this item to be stored all the time, -it could be deleted from the cache to make place for other items). -You can use MEMCACHE_COMPRESSED constant as flag value if you want to use on-the-fly compression (uses zlib).', -'MemcachePool::setCompressThreshold' => 'Enable automatic compression of large values', -'MemcachePool::setServerParams' => 'Changes server parameters and status at runtime', -'memory_get_peak_usage' => 'Returns the peak of memory allocated by PHP', -'memory_get_usage' => 'Returns the amount of memory allocated to PHP', -'MessageFormatter::__construct' => 'Constructs a new Message Formatter', -'MessageFormatter::create' => 'Constructs a new Message Formatter', -'messageformatter::format' => 'Format the message', -'messageformatter::formatMessage' => 'Quick format message', -'messageformatter::getErrorCode' => 'Get the error code from last operation', -'messageformatter::getErrorMessage' => 'Get the error text from the last operation', -'messageformatter::getLocale' => 'Get the locale for which the formatter was created', -'messageformatter::getPattern' => 'Get the pattern used by the formatter', -'messageformatter::parse' => 'Parse input string according to pattern', -'messageformatter::parseMessage' => 'Quick parse input string', -'messageformatter::setPattern' => 'Set the pattern used by the formatter', -'metaphone' => 'Calculate the metaphone key of a string', -'method_exists' => 'Checks if the class method exists', -'mhash' => 'Computes hash', -'mhash_count' => 'Gets the highest available hash ID', -'mhash_get_block_size' => 'Gets the block size of the specified hash', -'mhash_get_hash_name' => 'Gets the name of the specified hash', -'mhash_keygen_s2k' => 'Generates a key', -'microtime' => 'Return current Unix timestamp with microseconds', -'mime_content_type' => 'Detect MIME Content-type for a file', -'min' => 'Find lowest value', -'ming_keypress' => 'Returns the action flag for keyPress(char)', -'ming_setcubicthreshold' => 'Set cubic threshold', -'ming_setscale' => 'Set the global scaling factor', -'ming_setswfcompression' => 'Sets the SWF output compression', -'ming_useconstants' => 'Use constant pool', -'ming_useswfversion' => 'Sets the SWF version', -'mkdir' => 'Makes directory', -'mktime' => 'Get Unix timestamp for a date', -'money_format' => 'Formats a number as a currency string', -'mongo::__construct' => 'The __construct purpose', -'Mongo::__get' => 'Gets a database', -'Mongo::__toString' => 'String representation of this connection', -'Mongo::close' => 'Closes this database connection -This method does not need to be called, except in unusual circumstances. -The driver will cleanly close the database connection when the Mongo object goes out of scope.', -'Mongo::connect' => 'Connects to a database server', -'mongo::connectUtil' => 'Connects with a database server', -'Mongo::dropDB' => '`@return array` The database response.', -'Mongo::forceError' => 'Creates a database error on the database.', -'Mongo::getConnections' => 'Get connections -Returns an array of all open connections, and information about each of the servers', -'Mongo::getHosts' => 'Get hosts -This method is only useful with a connection to a replica set. It returns the status of all of the hosts in the -set. Without a replica set, it will just return an array with one element containing the host that you are -connected to.', -'mongo::getPoolSize' => 'Get pool size for connection pools', -'Mongo::getReadPreference' => 'Get read preference -Get the read preference for this connection', -'mongo::getSlave' => 'Returns the address being used by this for slaveOkay reads', -'mongo::getSlaveOkay' => 'Get slaveOkay setting for this connection', -'Mongo::getWriteConcern' => 'Get the write concern for this connection', -'Mongo::killCursor' => 'Kills a specific cursor on the server', -'Mongo::lastError' => 'Check if there was an error on the most recent db operation performed', -'Mongo::listDBs' => 'Lists all of the databases available', -'Mongo::pairConnect' => 'Connects to paired database server', -'Mongo::pairPersistConnect' => 'Creates a persistent connection with paired database servers', -'Mongo::persistConnect' => 'Creates a persistent connection with a database server', -'mongo::poolDebug' => 'Returns information about all connection pools', -'Mongo::prevError' => 'Checks for the last error thrown during a database operation', -'Mongo::resetError' => 'Clears any flagged errors on the connection', -'Mongo::selectCollection' => 'Gets a database collection', -'Mongo::selectDB' => 'Gets a database', -'mongo::setPoolSize' => 'Set the size for future connection pools', -'Mongo::setReadPreference' => 'Set read preference', -'mongo::setSlaveOkay' => 'Change slaveOkay setting for this connection', -'mongo::switchSlave' => 'Choose a new secondary for slaveOkay reads', -'mongobindata::__construct' => 'Creates a new binary data object', -'mongobindata::__toString' => 'The string representation of this binary data object', -'mongoclient::__construct' => 'Creates a new database connection object', -'mongoclient::__get' => 'Gets a database', -'mongoclient::__toString' => 'String representation of this connection', -'mongoclient::close' => 'Closes this connection', -'mongoclient::connect' => 'Connects to a database server', -'mongoclient::dropDB' => 'Drops a database [deprecated]', -'mongoclient::getConnections' => 'Return info about all open connections', -'mongoclient::getHosts' => 'Updates status for all associated hosts', -'mongoclient::getReadPreference' => 'Get the read preference for this connection', -'mongoclient::getWriteConcern' => 'Get the write concern for this connection', -'mongoclient::killCursor' => 'Kills a specific cursor on the server', -'mongoclient::listDBs' => 'Lists all of the databases available', -'mongoclient::selectCollection' => 'Gets a database collection', -'mongoclient::selectDB' => 'Gets a database', -'mongoclient::setReadPreference' => 'Set the read preference for this connection', -'mongoclient::setWriteConcern' => 'Set the write concern for this connection', -'MongoClient::switchSlave' => 'Choose a new secondary for slaveOkay reads', -'mongocode::__construct' => 'Creates a new code object', -'mongocode::__toString' => 'Returns this code as a string', -'MongoCollection::__construct' => 'Creates a new collection', -'MongoCollection::__get' => 'Gets a collection', -'MongoCollection::__toString' => 'String representation of this collection', -'MongoCollection::aggregate' => '<p> -The MongoDB -{@link https://docs.mongodb.org/manual/applications/aggregation/ aggregation framework} -provides a means to calculate aggregated values without having to use -MapReduce. While MapReduce is powerful, it is often more difficult than -necessary for many simple aggregation tasks, such as totaling or averaging -field values. -</p> -<p> -This method accepts either a variable amount of pipeline operators, or a -single array of operators constituting the pipeline. -</p>', -'MongoCollection::aggregateCursor' => '<p> -With this method you can execute Aggregation Framework pipelines and retrieve the results -through a cursor, instead of getting just one document back as you would with -{@link https://php.net/manual/en/mongocollection.aggregate.php MongoCollection::aggregate()}. -This method returns a {@link https://php.net/manual/en/class.mongocommandcursor.php MongoCommandCursor} object. -This cursor object implements the {@link https://php.net/manual/en/class.iterator.php Iterator} interface -just like the {@link https://php.net/manual/en/class.mongocursor.php MongoCursor} objects that are returned -by the {@link https://php.net/manual/en/mongocollection.find.php MongoCollection::find()} method -</p>', -'MongoCollection::batchInsert' => 'Inserts multiple documents into this collection', -'MongoCollection::count' => 'Counts the number of documents in this collection', -'MongoCollection::createDBRef' => 'Creates a database reference', -'MongoCollection::createIndex' => 'Creates an index on the given field(s), or does nothing if the index already exists', -'MongoCollection::deleteIndex' => 'Deletes an index from this collection', -'MongoCollection::deleteIndexes' => 'Delete all indexes for this collection', -'MongoCollection::distinct' => 'Retrieve a list of distinct values for the given key across a collection', -'MongoCollection::drop' => 'Drops this collection', -'MongoCollection::ensureIndex' => '`@return boolean` always true', -'MongoCollection::find' => 'Queries this collection', -'MongoCollection::findAndModify' => 'Update a document and return it', -'MongoCollection::findOne' => 'Queries this collection, returning a single element', -'MongoCollection::getDBRef' => 'Fetches the document pointed to by a database reference', -'MongoCollection::getIndexInfo' => 'Returns an array of index names for this collection', -'MongoCollection::getName' => 'Returns this collection\'s name', -'MongoCollection::getSlaveOkay' => '<p> -See {@link https://secure.php.net/manual/en/mongo.queries.php the query section} of this manual for -information on distributing reads to secondaries. -</p>', -'MongoCollection::group' => 'Performs an operation similar to SQL\'s GROUP BY command', -'MongoCollection::insert' => 'Inserts an array into the collection', -'MongoCollection::remove' => 'Remove records from this collection', -'MongoCollection::save' => 'Saves an object to this collection', -'MongoCollection::setSlaveOkay' => '<p> -See {@link https://secure.php.net/manual/en/mongo.queries.php the query section} of this manual for -information on distributing reads to secondaries. -</p>', -'MongoCollection::update' => 'Update records based on a given criteria', -'MongoCollection::validate' => 'Validates this collection', -'mongocommandcursor::__construct' => 'Create a new command cursor', -'mongocommandcursor::batchSize' => 'Limits the number of elements returned in one batch', -'mongocommandcursor::createFromDocument' => 'Create a new command cursor from an existing command response document', -'mongocommandcursor::current' => 'Returns the current element', -'mongocommandcursor::dead' => 'Checks if there are results that have not yet been sent from the database', -'mongocommandcursor::getReadPreference' => 'Get the read preference for this command', -'mongocommandcursor::info' => 'Gets information about the cursor\'s creation and iteration', -'mongocommandcursor::key' => 'Returns the current result\'s index within the result set', -'mongocommandcursor::next' => 'Advances the cursor to the next result', -'mongocommandcursor::rewind' => 'Executes the command and resets the cursor to the start of the result set', -'mongocommandcursor::setReadPreference' => 'Set the read preference for this command', -'mongocommandcursor::timeout' => 'Sets a client-side timeout for this command', -'mongocommandcursor::valid' => 'Checks if the cursor is reading a valid result', -'MongoCursor::__construct' => 'Create a new cursor', -'MongoCursor::addOption' => 'Adds a top-level key/value pair to a query', -'MongoCursor::awaitData' => 'Sets whether this cursor will wait for a while for a tailable cursor to return more data', -'MongoCursor::batchSize' => 'PECL mongo >=1.0.11 -Limits the number of elements returned in one batch. -<p>A cursor typically fetches a batch of result objects and store them locally. -This method sets the batchSize value to configure the amount of documents retrieved from the server in one data packet. -However, it will never return more documents than fit in the max batch size limit (usually 4MB).', -'MongoCursor::count' => 'Counts the number of results for this query', -'MongoCursor::current' => 'Returns the current element', -'MongoCursor::dead' => 'Checks if there are documents that have not been sent yet from the database for this cursor', -'MongoCursor::doQuery' => 'Execute the query', -'MongoCursor::explain' => 'Return an explanation of the query, often useful for optimization and debugging', -'MongoCursor::fields' => 'Sets the fields for a query', -'MongoCursor::getNext' => 'Return the next object to which this cursor points, and advance the cursor', -'MongoCursor::hasNext' => 'Checks if there are any more elements in this cursor', -'MongoCursor::hint' => 'Gives the database a hint about the query', -'MongoCursor::immortal' => 'Sets whether this cursor will timeout', -'MongoCursor::info' => 'Gets the query, fields, limit, and skip for this cursor', -'MongoCursor::key' => 'Returns the current result\'s _id', -'MongoCursor::limit' => 'Limits the number of results returned', -'MongoCursor::maxTimeMS' => '(PECL mongo >=1.5.0) -Sets a server-side timeout for this query', -'MongoCursor::next' => 'Advances the cursor to the next result', -'MongoCursor::reset' => 'Clears the cursor', -'MongoCursor::rewind' => 'Returns the cursor to the beginning of the result set', -'MongoCursor::skip' => 'Skips a number of results', -'MongoCursor::slaveOkay' => 'Sets whether this query can be done on a slave -This method will override the static class variable slaveOkay.', -'MongoCursor::snapshot' => 'Use snapshot mode for the query', -'MongoCursor::sort' => 'Sorts the results by given fields', -'MongoCursor::tailable' => 'Sets whether this cursor will be left open after fetching the last results', -'MongoCursor::timeout' => 'Sets a client-side timeout for this query', -'MongoCursor::valid' => 'Checks if the cursor is reading a valid result.', -'MongoCursorException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'MongoCursorException::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'MongoCursorException::__toString' => 'String representation of the exception', -'MongoCursorException::getCode' => 'Gets the Exception code', -'MongoCursorException::getFile' => 'Gets the file in which the exception occurred', -'mongocursorexception::getHost' => 'The hostname of the server that encountered the error', -'MongoCursorException::getLine' => 'Gets the line in which the exception occurred', -'MongoCursorException::getMessage' => 'Gets the Exception message', -'MongoCursorException::getPrevious' => 'Returns previous Exception', -'MongoCursorException::getTrace' => 'Gets the stack trace', -'MongoCursorException::getTraceAsString' => 'Gets the stack trace as a string', -'mongocursorinterface::batchSize' => 'Limits the number of elements returned in one batch', -'MongoCursorInterface::current' => 'Return the current element', -'mongocursorinterface::dead' => 'Checks if there are results that have not yet been sent from the database', -'mongocursorinterface::getReadPreference' => 'Get the read preference for this query', -'mongocursorinterface::info' => 'Gets information about the cursor\'s creation and iteration', -'MongoCursorInterface::key' => 'Return the key of the current element', -'MongoCursorInterface::next' => 'Move forward to next element', -'MongoCursorInterface::rewind' => 'Rewind the Iterator to the first element', -'mongocursorinterface::setReadPreference' => 'Set the read preference for this query', -'mongocursorinterface::timeout' => 'Sets a client-side timeout for this query', -'MongoCursorInterface::valid' => 'Checks if current position is valid', -'mongodate::__construct' => 'Creates a new date', -'mongodate::__toString' => 'Returns a string representation of this date', -'mongodate::toDateTime' => 'Returns a DateTime object representing this date', -'MongoDB::__construct' => 'Creates a new database -This method is not meant to be called directly. The preferred way to create an instance of MongoDB is through {@see Mongo::__get()} or {@see Mongo::selectDB()}.', -'MongoDB::__get' => 'Gets a collection', -'MongoDB::__toString' => 'The name of this database', -'MongoDB::authenticate' => 'Log in to this database', -'MongoDB::command' => 'Execute a database command', -'MongoDB::createCollection' => 'Creates a collection', -'MongoDB::createDBRef' => 'Creates a database reference', -'MongoDB::drop' => 'Drops this database', -'MongoDB::execute' => 'Runs JavaScript code on the database server.', -'MongoDB::forceError' => 'Creates a database error', -'MongoDB::getDBRef' => 'Fetches the document pointed to by a database reference', -'MongoDB::getGridFS' => 'Fetches toolkit for dealing with files stored in this database', -'MongoDB::getProfilingLevel' => 'Gets this database\'s profiling level', -'MongoDB::getReadPreference' => 'Get the read preference for this database', -'MongoDB::getSlaveOkay' => 'Get slaveOkay setting for this database', -'MongoDB::getWriteConcern' => 'Get the write concern for this database', -'MongoDB::lastError' => 'Check if there was an error on the most recent db operation performed', -'MongoDB::listCollections' => 'Get a list of collections in this database', -'MongoDB::prevError' => 'Checks for the last error thrown during a database operation', -'MongoDB::repair' => 'Repairs and compacts this database', -'MongoDB::resetError' => 'Clears any flagged errors on the database', -'MongoDB::selectCollection' => 'Gets a collection', -'MongoDB::setProfilingLevel' => 'Sets this database\'s profiling level', -'MongoDB::setReadPreference' => 'Set the read preference for this database', -'MongoDB::setSlaveOkay' => 'Change slaveOkay setting for this database', -'mongodb\bson\binary::__construct' => 'Construct a new Binary', -'mongodb\bson\binary::__toString' => 'Returns the Binary\'s data', -'mongodb\bson\binary::getData' => 'Returns the Binary\'s data', -'mongodb\bson\binary::getType' => 'Returns the Binary\'s type', -'mongodb\bson\binary::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\binary::serialize' => 'Serialize a Binary', -'mongodb\bson\binary::unserialize' => 'Unserialize a Binary', -'mongodb\bson\binaryinterface::__toString' => 'Returns the BinaryInterface\'s data', -'mongodb\bson\binaryinterface::getData' => 'Returns the BinaryInterface\'s data', -'mongodb\bson\binaryinterface::getType' => 'Returns the BinaryInterface\'s type', -'mongodb\bson\dbpointer::__construct' => 'Construct a new DBPointer (unused)', -'mongodb\bson\dbpointer::__toString' => 'Returns an empty string', -'mongodb\bson\dbpointer::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\dbpointer::serialize' => 'Serialize a DBPointer', -'mongodb\bson\dbpointer::unserialize' => 'Unserialize a DBPointer', -'mongodb\bson\decimal128::__construct' => 'Construct a new Decimal128', -'mongodb\bson\decimal128::__toString' => 'Returns the string representation of this Decimal128', -'mongodb\bson\decimal128::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\decimal128::serialize' => 'Serialize a Decimal128', -'mongodb\bson\decimal128::unserialize' => 'Unserialize a Decimal128', -'mongodb\bson\decimal128interface::__toString' => 'Returns the string representation of this Decimal128Interface', -'MongoDB\BSON\fromJSON' => 'Returns the BSON representation of a JSON value -Converts an extended JSON string to its BSON representation.', -'MongoDB\BSON\fromPHP' => 'Returns the BSON representation of a PHP value -Serializes a PHP array or object (e.g. document) to its BSON representation. The returned binary string will describe a BSON document.', -'mongodb\bson\int64::__construct' => 'Construct a new Int64 (unused)', -'mongodb\bson\int64::__toString' => 'Returns the string representation of this Int64', -'mongodb\bson\int64::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\int64::serialize' => 'Serialize an Int64', -'mongodb\bson\int64::unserialize' => 'Unserialize an Int64', -'mongodb\bson\javascript::__construct' => 'Construct a new Javascript', -'mongodb\bson\javascript::__toString' => 'Returns the Javascript\'s code', -'mongodb\bson\javascript::getCode' => 'Returns the Javascript\'s code', -'mongodb\bson\javascript::getScope' => 'Returns the Javascript\'s scope document', -'mongodb\bson\javascript::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\javascript::serialize' => 'Serialize a Javascript', -'mongodb\bson\javascript::unserialize' => 'Unserialize a Javascript', -'mongodb\bson\javascriptinterface::__toString' => 'Returns the JavascriptInterface\'s code', -'mongodb\bson\javascriptinterface::getCode' => 'Returns the JavascriptInterface\'s code', -'mongodb\bson\javascriptinterface::getScope' => 'Returns the JavascriptInterface\'s scope document', -'mongodb\bson\maxkey::__construct' => 'Construct a new MaxKey', -'mongodb\bson\maxkey::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\maxkey::serialize' => 'Serialize a MaxKey', -'mongodb\bson\maxkey::unserialize' => 'Unserialize a MaxKey', -'mongodb\bson\minkey::__construct' => 'Construct a new MinKey', -'mongodb\bson\minkey::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\minkey::serialize' => 'Serialize a MinKey', -'mongodb\bson\minkey::unserialize' => 'Unserialize a MinKey', -'mongodb\bson\objectid::__construct' => 'Construct a new ObjectId', -'mongodb\bson\objectid::__toString' => 'Returns the hexadecimal representation of this ObjectId', -'mongodb\bson\objectid::getTimestamp' => 'Returns the timestamp component of this ObjectId', -'mongodb\bson\objectid::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\objectid::serialize' => 'Serialize an ObjectId', -'mongodb\bson\objectid::unserialize' => 'Unserialize an ObjectId', -'mongodb\bson\objectidinterface::__toString' => 'Returns the hexadecimal representation of this ObjectIdInterface', -'mongodb\bson\objectidinterface::getTimestamp' => 'Returns the timestamp component of this ObjectIdInterface', -'mongodb\bson\regex::__construct' => 'Construct a new Regex', -'mongodb\bson\regex::__toString' => 'Returns the string representation of this Regex', -'mongodb\bson\regex::getFlags' => 'Returns the Regex\'s flags', -'mongodb\bson\regex::getPattern' => 'Returns the Regex\'s pattern', -'mongodb\bson\regex::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\regex::serialize' => 'Serialize a Regex', -'mongodb\bson\regex::unserialize' => 'Unserialize a Regex', -'mongodb\bson\regexinterface::__toString' => 'Returns the string representation of this RegexInterface', -'mongodb\bson\regexinterface::getFlags' => 'Returns the RegexInterface\'s flags', -'mongodb\bson\regexinterface::getPattern' => 'Returns the RegexInterface\'s pattern', -'mongodb\bson\serializable::bsonSerialize' => 'Provides an array or document to serialize as BSON', -'mongodb\bson\symbol::__construct' => 'Construct a new Symbol (unused)', -'mongodb\bson\symbol::__toString' => 'Returns the Symbol as a string', -'mongodb\bson\symbol::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\symbol::serialize' => 'Serialize a Symbol', -'mongodb\bson\symbol::unserialize' => 'Unserialize a Symbol', -'mongodb\bson\timestamp::__construct' => 'Construct a new Timestamp', -'mongodb\bson\timestamp::__toString' => 'Returns the string representation of this Timestamp', -'mongodb\bson\timestamp::getIncrement' => 'Returns the increment component of this Timestamp', -'mongodb\bson\timestamp::getTimestamp' => 'Returns the timestamp component of this Timestamp', -'mongodb\bson\timestamp::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\timestamp::serialize' => 'Serialize a Timestamp', -'mongodb\bson\timestamp::unserialize' => 'Unserialize a Timestamp', -'mongodb\bson\timestampinterface::__toString' => 'Returns the string representation of this TimestampInterface', -'mongodb\bson\timestampinterface::getIncrement' => 'Returns the increment component of this TimestampInterface', -'mongodb\bson\timestampinterface::getTimestamp' => 'Returns the timestamp component of this TimestampInterface', -'MongoDB\BSON\toJSON' => 'Returns the JSON representation of a BSON value -Converts a BSON string to its extended JSON representation.', -'MongoDB\BSON\toPHP' => 'Returns the PHP representation of a BSON value -Unserializes a BSON document (i.e. binary string) to its PHP representation. -The typeMap parameter may be used to control the PHP types used for converting BSON arrays and documents (both root and embedded).', -'mongodb\bson\undefined::__construct' => 'Construct a new Undefined (unused)', -'mongodb\bson\undefined::__toString' => 'Returns an empty string', -'mongodb\bson\undefined::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\undefined::serialize' => 'Serialize a Undefined', -'mongodb\bson\undefined::unserialize' => 'Unserialize a Undefined', -'mongodb\bson\unserializable::bsonUnserialize' => 'Constructs the object from a BSON array or document', -'mongodb\bson\utcdatetime::__construct' => 'Construct a new UTCDateTime', -'mongodb\bson\utcdatetime::__toString' => 'Returns the string representation of this UTCDateTime', -'MongoDB\BSON\UTCDateTime::getIncrement' => 'Returns the increment component of this TimestampInterface', -'MongoDB\BSON\UTCDateTime::getTimestamp' => 'Returns the timestamp component of this TimestampInterface', -'mongodb\bson\utcdatetime::jsonSerialize' => 'Returns a representation that can be converted to JSON', -'mongodb\bson\utcdatetime::serialize' => 'Serialize a UTCDateTime', -'mongodb\bson\utcdatetime::toDateTime' => 'Returns the DateTime representation of this UTCDateTime', -'mongodb\bson\utcdatetime::unserialize' => 'Unserialize a UTCDateTime', -'mongodb\bson\utcdatetimeinterface::__toString' => 'Returns the string representation of this UTCDateTimeInterface', -'mongodb\bson\utcdatetimeinterface::toDateTime' => 'Returns the DateTime representation of this UTCDateTimeInterface', -'mongodb\driver\bulkwrite::__construct' => 'Create a new BulkWrite', -'mongodb\driver\bulkwrite::count' => 'Count number of write operations in the bulk', -'mongodb\driver\bulkwrite::delete' => 'Add a delete operation to the bulk', -'mongodb\driver\bulkwrite::insert' => 'Add an insert operation to the bulk', -'mongodb\driver\bulkwrite::update' => 'Add an update operation to the bulk', -'mongodb\driver\command::__construct' => 'Create a new Command', -'mongodb\driver\cursor::__construct' => 'Create a new Cursor (not used)', -'mongodb\driver\cursor::getId' => 'Returns the ID for this cursor', -'mongodb\driver\cursor::getServer' => 'Returns the server associated with this cursor', -'mongodb\driver\cursor::isDead' => 'Checks if the cursor may have additional results', -'mongodb\driver\cursor::setTypeMap' => 'Sets a type map to use for BSON unserialization', -'mongodb\driver\cursor::toArray' => 'Returns an array containing all results for this cursor', -'mongodb\driver\cursorid::__construct' => 'Create a new CursorId (not used)', -'mongodb\driver\cursorid::__toString' => 'String representation of the cursor ID', -'mongodb\driver\exception\commandexception::getResultDocument' => 'Returns the result document for the failed command', -'MongoDB\Driver\Exception\CommandException::hasErrorLabel' => 'Whether the given errorLabel is associated with this exception', -'mongodb\driver\exception\runtimeexception::hasErrorLabel' => 'Returns whether an error label is associated with an exception', -'MongoDB\Driver\Exception\ServerException::hasErrorLabel' => 'Whether the given errorLabel is associated with this exception', -'mongodb\driver\exception\writeexception::getWriteResult' => 'Returns the WriteResult for the failed write operation', -'MongoDB\Driver\Exception\WriteException::hasErrorLabel' => 'Whether the given errorLabel is associated with this exception', -'mongodb\driver\manager::__construct' => 'Create new MongoDB Manager', -'mongodb\driver\manager::executeBulkWrite' => 'Execute one or more write operations', -'mongodb\driver\manager::executeCommand' => 'Execute a database command', -'mongodb\driver\manager::executeQuery' => 'Execute a database query', -'mongodb\driver\manager::executeReadCommand' => 'Execute a database command that reads', -'mongodb\driver\manager::executeReadWriteCommand' => 'Execute a database command that reads and writes', -'mongodb\driver\manager::executeWriteCommand' => 'Execute a database command that writes', -'mongodb\driver\manager::getReadConcern' => 'Return the ReadConcern for the Manager', -'mongodb\driver\manager::getReadPreference' => 'Return the ReadPreference for the Manager', -'mongodb\driver\manager::getServers' => 'Return the servers to which this manager is connected', -'mongodb\driver\manager::getWriteConcern' => 'Return the WriteConcern for the Manager', -'mongodb\driver\manager::selectServer' => 'Select a server matching a read preference', -'mongodb\driver\manager::startSession' => 'Start a new client session for use with this client', -'MongoDB\Driver\Monitoring\addSubscriber' => 'Registers a new monitoring event subscriber with the driver. -Registered subscribers will be notified of monitoring events through specific methods. -Note: If the object is already registered, this function is a no-op.', -'mongodb\driver\monitoring\commandfailedevent::getCommandName' => 'Returns the command name', -'mongodb\driver\monitoring\commandfailedevent::getDurationMicros' => 'Returns the command\'s duration in microseconds', -'mongodb\driver\monitoring\commandfailedevent::getError' => 'Returns the Exception associated with the failed command', -'mongodb\driver\monitoring\commandfailedevent::getOperationId' => 'Returns the command\'s operation ID', -'mongodb\driver\monitoring\commandfailedevent::getReply' => 'Returns the command reply document', -'mongodb\driver\monitoring\commandfailedevent::getRequestId' => 'Returns the command\'s request ID', -'mongodb\driver\monitoring\commandfailedevent::getServer' => 'Returns the Server on which the command was executed', -'mongodb\driver\monitoring\commandstartedevent::getCommand' => 'Returns the command document', -'mongodb\driver\monitoring\commandstartedevent::getCommandName' => 'Returns the command name', -'mongodb\driver\monitoring\commandstartedevent::getDatabaseName' => 'Returns the database on which the command was executed', -'mongodb\driver\monitoring\commandstartedevent::getOperationId' => 'Returns the command\'s operation ID', -'mongodb\driver\monitoring\commandstartedevent::getRequestId' => 'Returns the command\'s request ID', -'mongodb\driver\monitoring\commandstartedevent::getServer' => 'Returns the Server on which the command was executed', -'mongodb\driver\monitoring\commandsubscriber::commandFailed' => 'Notification method for a failed command', -'mongodb\driver\monitoring\commandsubscriber::commandStarted' => 'Notification method for a started command', -'mongodb\driver\monitoring\commandsubscriber::commandSucceeded' => 'Notification method for a successful command', -'mongodb\driver\monitoring\commandsucceededevent::getCommandName' => 'Returns the command name', -'mongodb\driver\monitoring\commandsucceededevent::getDurationMicros' => 'Returns the command\'s duration in microseconds', -'mongodb\driver\monitoring\commandsucceededevent::getOperationId' => 'Returns the command\'s operation ID', -'mongodb\driver\monitoring\commandsucceededevent::getReply' => 'Returns the command reply document', -'mongodb\driver\monitoring\commandsucceededevent::getRequestId' => 'Returns the command\'s request ID', -'mongodb\driver\monitoring\commandsucceededevent::getServer' => 'Returns the Server on which the command was executed', -'MongoDB\Driver\Monitoring\removeSubscriber' => 'Unregisters an existing monitoring event subscriber from the driver. -Unregistered subscribers will no longer be notified of monitoring events. -Note: If the object is not registered, this function is a no-op.', -'mongodb\driver\query::__construct' => 'Create a new Query', -'mongodb\driver\readconcern::__construct' => 'Create a new ReadConcern', -'mongodb\driver\readconcern::bsonSerialize' => 'Returns an object for BSON serialization', -'mongodb\driver\readconcern::getLevel' => 'Returns the ReadConcern\'s "level" option', -'mongodb\driver\readconcern::isDefault' => 'Checks if this is the default read concern', -'mongodb\driver\readpreference::__construct' => 'Create a new ReadPreference', -'mongodb\driver\readpreference::bsonSerialize' => 'Returns an object for BSON serialization', -'mongodb\driver\readpreference::getMaxStalenessSeconds' => 'Returns the ReadPreference\'s "maxStalenessSeconds" option', -'mongodb\driver\readpreference::getMode' => 'Returns the ReadPreference\'s "mode" option', -'mongodb\driver\readpreference::getTagSets' => 'Returns the ReadPreference\'s "tagSets" option', -'mongodb\driver\server::__construct' => 'Create a new Server (not used)', -'mongodb\driver\server::executeBulkWrite' => 'Execute one or more write operations on this server', -'mongodb\driver\server::executeCommand' => 'Execute a database command on this server', -'mongodb\driver\server::executeQuery' => 'Execute a database query on this server', -'mongodb\driver\server::executeReadCommand' => 'Execute a database command that reads on this server', -'mongodb\driver\server::executeReadWriteCommand' => 'Execute a database command that reads and writes on this server', -'mongodb\driver\server::executeWriteCommand' => 'Execute a database command that writes on this server', -'mongodb\driver\server::getHost' => 'Returns the hostname of this server', -'mongodb\driver\server::getInfo' => 'Returns an array of information about this server', -'mongodb\driver\server::getLatency' => 'Returns the latency of this server', -'mongodb\driver\server::getPort' => 'Returns the port on which this server is listening', -'mongodb\driver\server::getTags' => 'Returns an array of tags describing this server in a replica set', -'mongodb\driver\server::getType' => 'Returns an integer denoting the type of this server', -'mongodb\driver\server::isArbiter' => 'Checks if this server is an arbiter member of a replica set', -'mongodb\driver\server::isHidden' => 'Checks if this server is a hidden member of a replica set', -'mongodb\driver\server::isPassive' => 'Checks if this server is a passive member of a replica set', -'mongodb\driver\server::isPrimary' => 'Checks if this server is a primary member of a replica set', -'mongodb\driver\server::isSecondary' => 'Checks if this server is a secondary member of a replica set', -'mongodb\driver\session::__construct' => 'Create a new Session (not used)', -'mongodb\driver\session::abortTransaction' => 'Aborts a transaction', -'mongodb\driver\session::advanceClusterTime' => 'Advances the cluster time for this session', -'mongodb\driver\session::advanceOperationTime' => 'Advances the operation time for this session', -'mongodb\driver\session::commitTransaction' => 'Commits a transaction', -'mongodb\driver\session::endSession' => 'Terminates a session', -'mongodb\driver\session::getClusterTime' => 'Returns the cluster time for this session', -'mongodb\driver\session::getLogicalSessionId' => 'Returns the logical session ID for this session', -'mongodb\driver\session::getOperationTime' => 'Returns the operation time for this session', -'mongodb\driver\session::startTransaction' => 'Starts a transaction', -'mongodb\driver\writeconcern::__construct' => 'Create a new WriteConcern', -'mongodb\driver\writeconcern::bsonSerialize' => 'Returns an object for BSON serialization', -'mongodb\driver\writeconcern::getJournal' => 'Returns the WriteConcern\'s "journal" option', -'mongodb\driver\writeconcern::getW' => 'Returns the WriteConcern\'s "w" option', -'mongodb\driver\writeconcern::getWtimeout' => 'Returns the WriteConcern\'s "wtimeout" option', -'mongodb\driver\writeconcern::isDefault' => 'Checks if this is the default write concern', -'mongodb\driver\writeconcernerror::getCode' => 'Returns the WriteConcernError\'s error code', -'mongodb\driver\writeconcernerror::getInfo' => 'Returns additional metadata for the WriteConcernError', -'mongodb\driver\writeconcernerror::getMessage' => 'Returns the WriteConcernError\'s error message', -'mongodb\driver\writeerror::getCode' => 'Returns the WriteError\'s error code', -'mongodb\driver\writeerror::getIndex' => 'Returns the index of the write operation corresponding to this WriteError', -'mongodb\driver\writeerror::getInfo' => 'Returns additional metadata for the WriteError', -'mongodb\driver\writeerror::getMessage' => 'Returns the WriteError\'s error message', -'mongodb\driver\writeresult::getDeletedCount' => 'Returns the number of documents deleted', -'mongodb\driver\writeresult::getInsertedCount' => 'Returns the number of documents inserted (excluding upserts)', -'mongodb\driver\writeresult::getMatchedCount' => 'Returns the number of documents selected for update', -'mongodb\driver\writeresult::getModifiedCount' => 'Returns the number of existing documents updated', -'mongodb\driver\writeresult::getServer' => 'Returns the server associated with this write result', -'mongodb\driver\writeresult::getUpsertedCount' => 'Returns the number of documents inserted by an upsert', -'mongodb\driver\writeresult::getUpsertedIds' => 'Returns an array of identifiers for upserted documents', -'mongodb\driver\writeresult::getWriteConcernError' => 'Returns any write concern error that occurred', -'mongodb\driver\writeresult::getWriteErrors' => 'Returns any write errors that occurred', -'mongodb\driver\writeresult::isAcknowledged' => 'Returns whether the write was acknowledged', -'mongodbref::create' => 'Creates a new database reference', -'mongodbref::get' => 'Fetches the object pointed to by a reference', -'mongodbref::isRef' => 'Checks if an array is a database reference', -'MongoException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'MongoException::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'MongoException::__toString' => 'String representation of the exception', -'MongoException::getCode' => 'Gets the Exception code', -'MongoException::getFile' => 'Gets the file in which the exception occurred', -'MongoException::getLine' => 'Gets the line in which the exception occurred', -'MongoException::getMessage' => 'Gets the Exception message', -'MongoException::getPrevious' => 'Returns previous Exception', -'MongoException::getTrace' => 'Gets the stack trace', -'MongoException::getTraceAsString' => 'Gets the stack trace as a string', -'MongoGridFS::__construct' => 'Files as stored across two collections, the first containing file meta -information, the second containing chunks of the actual file. By default, -fs.files and fs.chunks are the collection names used.', -'MongoGridFS::__get' => 'Gets a collection', -'MongoGridFS::__toString' => 'String representation of this collection', -'MongoGridFS::aggregate' => '<p> -The MongoDB -{@link https://docs.mongodb.org/manual/applications/aggregation/ aggregation framework} -provides a means to calculate aggregated values without having to use -MapReduce. While MapReduce is powerful, it is often more difficult than -necessary for many simple aggregation tasks, such as totaling or averaging -field values. -</p> -<p> -This method accepts either a variable amount of pipeline operators, or a -single array of operators constituting the pipeline. -</p>', -'MongoGridFS::aggregateCursor' => '<p> -With this method you can execute Aggregation Framework pipelines and retrieve the results -through a cursor, instead of getting just one document back as you would with -{@link https://php.net/manual/en/mongocollection.aggregate.php MongoCollection::aggregate()}. -This method returns a {@link https://php.net/manual/en/class.mongocommandcursor.php MongoCommandCursor} object. -This cursor object implements the {@link https://php.net/manual/en/class.iterator.php Iterator} interface -just like the {@link https://php.net/manual/en/class.mongocursor.php MongoCursor} objects that are returned -by the {@link https://php.net/manual/en/mongocollection.find.php MongoCollection::find()} method -</p>', -'MongoGridFS::batchInsert' => 'Inserts multiple documents into this collection', -'MongoGridFS::count' => 'Counts the number of documents in this collection', -'MongoGridFS::createDBRef' => 'Creates a database reference', -'MongoGridFS::createIndex' => 'Creates an index on the given field(s), or does nothing if the index already exists', -'MongoGridFS::delete' => 'Delete a file from the database', -'MongoGridFS::deleteIndex' => 'Deletes an index from this collection', -'MongoGridFS::deleteIndexes' => 'Delete all indexes for this collection', -'MongoGridFS::distinct' => 'Retrieve a list of distinct values for the given key across a collection', -'MongoGridFS::drop' => 'Drops the files and chunks collections', -'MongoGridFS::ensureIndex' => '`@return boolean` always true', -'MongoGridFS::find' => '`@return MongoGridFSCursor` A MongoGridFSCursor', -'MongoGridFS::findAndModify' => 'Update a document and return it', -'MongoGridFS::findOne' => 'Returns a single file matching the criteria', -'MongoGridFS::get' => 'Retrieve a file from the database', -'MongoGridFS::getDBRef' => 'Fetches the document pointed to by a database reference', -'MongoGridFS::getIndexInfo' => 'Returns an array of index names for this collection', -'MongoGridFS::getName' => 'Returns this collection\'s name', -'MongoGridFS::getSlaveOkay' => '<p> -See {@link https://secure.php.net/manual/en/mongo.queries.php the query section} of this manual for -information on distributing reads to secondaries. -</p>', -'MongoGridFS::group' => 'Performs an operation similar to SQL\'s GROUP BY command', -'MongoGridFS::insert' => 'Inserts an array into the collection', -'MongoGridFS::put' => 'Stores a file in the database', -'MongoGridFS::remove' => 'Removes files from the collections', -'MongoGridFS::save' => 'Saves an object to this collection', -'MongoGridFS::setSlaveOkay' => '<p> -See {@link https://secure.php.net/manual/en/mongo.queries.php the query section} of this manual for -information on distributing reads to secondaries. -</p>', -'MongoGridFS::storeBytes' => 'Chunkifies and stores bytes in the database', -'MongoGridFS::storeFile' => 'Stores a file in the database', -'MongoGridFS::storeUpload' => 'Saves an uploaded file directly from a POST to the database', -'MongoGridFS::update' => 'Update records based on a given criteria', -'MongoGridFS::validate' => 'Validates this collection', -'MongoGridFSCursor::__construct' => 'Create a new cursor', -'MongoGridFSCursor::addOption' => 'Adds a top-level key/value pair to a query', -'MongoGridFSCursor::awaitData' => 'Sets whether this cursor will wait for a while for a tailable cursor to return more data', -'MongoGridFSCursor::batchSize' => 'PECL mongo >=1.0.11 -Limits the number of elements returned in one batch. -<p>A cursor typically fetches a batch of result objects and store them locally. -This method sets the batchSize value to configure the amount of documents retrieved from the server in one data packet. -However, it will never return more documents than fit in the max batch size limit (usually 4MB).', -'MongoGridFSCursor::count' => 'Counts the number of results for this query', -'MongoGridFSCursor::current' => 'Returns the current file', -'MongoGridFSCursor::dead' => 'Checks if there are documents that have not been sent yet from the database for this cursor', -'MongoGridFSCursor::doQuery' => 'Execute the query', -'MongoGridFSCursor::explain' => 'Return an explanation of the query, often useful for optimization and debugging', -'MongoGridFSCursor::fields' => 'Sets the fields for a query', -'MongoGridFSCursor::getNext' => 'Return the next file to which this cursor points, and advance the cursor', -'MongoGridFSCursor::hasNext' => 'Checks if there are any more elements in this cursor', -'MongoGridFSCursor::hint' => 'Gives the database a hint about the query', -'MongoGridFSCursor::immortal' => 'Sets whether this cursor will timeout', -'MongoGridFSCursor::info' => 'Gets the query, fields, limit, and skip for this cursor', -'MongoGridFSCursor::key' => 'Returns the current result\'s filename', -'MongoGridFSCursor::limit' => 'Limits the number of results returned', -'MongoGridFSCursor::maxTimeMS' => '(PECL mongo >=1.5.0) -Sets a server-side timeout for this query', -'MongoGridFSCursor::next' => 'Advances the cursor to the next result', -'MongoGridFSCursor::reset' => 'Clears the cursor', -'MongoGridFSCursor::rewind' => 'Returns the cursor to the beginning of the result set', -'MongoGridFSCursor::skip' => 'Skips a number of results', -'MongoGridFSCursor::slaveOkay' => 'Sets whether this query can be done on a slave -This method will override the static class variable slaveOkay.', -'MongoGridFSCursor::snapshot' => 'Use snapshot mode for the query', -'MongoGridFSCursor::sort' => 'Sorts the results by given fields', -'MongoGridFSCursor::tailable' => 'Sets whether this cursor will be left open after fetching the last results', -'MongoGridFSCursor::timeout' => 'Sets a client-side timeout for this query', -'MongoGridFSCursor::valid' => 'Checks if the cursor is reading a valid result.', -'mongogridfsfile::__construct' => 'Create a new GridFS file', -'mongogridfsfile::getBytes' => 'Returns this file\'s contents as a string of bytes', -'mongogridfsfile::getFilename' => 'Returns this file\'s filename', -'mongogridfsfile::getResource' => 'Returns a resource that can be used to read the stored file', -'mongogridfsfile::getSize' => 'Returns this file\'s size', -'mongogridfsfile::write' => 'Writes this file to the filesystem', -'mongoid::__construct' => 'Creates a new id', -'mongoid::__set_state' => 'Create a dummy MongoId', -'mongoid::__toString' => 'Returns a hexadecimal representation of this id', -'mongoid::getHostname' => 'Gets the hostname being used for this machine\'s ids', -'mongoid::getInc' => 'Gets the incremented value to create this id', -'mongoid::getPID' => 'Gets the process ID', -'mongoid::getTimestamp' => 'Gets the number of seconds since the epoch that this id was created', -'mongoid::isValid' => 'Check if a value is a valid ObjectId', -'mongoint32::__construct' => 'Creates a new 32-bit integer', -'mongoint32::__toString' => 'Returns the string representation of this 32-bit integer', -'mongoint64::__construct' => 'Creates a new 64-bit integer', -'mongoint64::__toString' => 'Returns the string representation of this 64-bit integer', -'mongolog::getCallback' => 'Gets the previously set callback function', -'mongolog::getLevel' => 'Gets the level(s) currently being logged', -'mongolog::getModule' => 'Gets the module(s) currently being logged', -'mongolog::setCallback' => 'Sets a callback function to be invoked for events', -'mongolog::setLevel' => 'Sets the level(s) to be logged', -'mongolog::setModule' => 'Sets the module(s) to be logged', -'mongopool::getSize' => 'Get pool size for connection pools', -'mongopool::info' => 'Returns information about all connection pools', -'mongopool::setSize' => 'Set the size for future connection pools', -'mongoregex::__construct' => 'Creates a new regular expression', -'mongoregex::__toString' => 'A string representation of this regular expression', -'MongoResultException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'MongoResultException::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'MongoResultException::__toString' => 'String representation of the exception', -'MongoResultException::getCode' => 'Gets the Exception code', -'mongoresultexception::getDocument' => 'Retrieve the full result document', -'MongoResultException::getFile' => 'Gets the file in which the exception occurred', -'MongoResultException::getLine' => 'Gets the line in which the exception occurred', -'MongoResultException::getMessage' => 'Gets the Exception message', -'MongoResultException::getPrevious' => 'Returns previous Exception', -'MongoResultException::getTrace' => 'Gets the stack trace', -'MongoResultException::getTraceAsString' => 'Gets the stack trace as a string', -'mongotimestamp::__construct' => 'Creates a new timestamp', -'mongotimestamp::__toString' => 'Returns a string representation of this timestamp', -'MongoUpdateBatch::__construct' => '<p>(PECL mongo >= 1.5.0)</p> -MongoUpdateBatch constructor.', -'MongoUpdateBatch::add' => '<p>(PECL mongo >= 1.5.0)</p> -Adds a write operation to a batch', -'MongoUpdateBatch::execute' => '<p>(PECL mongo >= 1.5.0)</p> -Executes a batch of write operations', -'mongowritebatch::__construct' => 'Creates a new batch of write operations', -'mongowritebatch::add' => 'Adds a write operation to a batch', -'mongowritebatch::execute' => 'Executes a batch of write operations', -'MongoWriteConcernException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'MongoWriteConcernException::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'MongoWriteConcernException::__toString' => 'String representation of the exception', -'MongoWriteConcernException::getCode' => 'Gets the Exception code', -'mongowriteconcernexception::getDocument' => 'Get the error document', -'MongoWriteConcernException::getFile' => 'Gets the file in which the exception occurred', -'MongoWriteConcernException::getLine' => 'Gets the line in which the exception occurred', -'MongoWriteConcernException::getMessage' => 'Gets the Exception message', -'MongoWriteConcernException::getPrevious' => 'Returns previous Exception', -'MongoWriteConcernException::getTrace' => 'Gets the stack trace', -'MongoWriteConcernException::getTraceAsString' => 'Gets the stack trace as a string', -'move_uploaded_file' => 'Moves an uploaded file to a new location', -'mqseries_back' => 'MQSeries MQBACK', -'mqseries_begin' => 'MQseries MQBEGIN', -'mqseries_close' => 'MQSeries MQCLOSE', -'mqseries_cmit' => 'MQSeries MQCMIT', -'mqseries_conn' => 'MQSeries MQCONN', -'mqseries_connx' => 'MQSeries MQCONNX', -'mqseries_disc' => 'MQSeries MQDISC', -'mqseries_get' => 'MQSeries MQGET', -'mqseries_inq' => 'MQSeries MQINQ', -'mqseries_open' => 'MQSeries MQOPEN', -'mqseries_put' => 'MQSeries MQPUT', -'mqseries_put1' => 'MQSeries MQPUT1', -'mqseries_set' => 'MQSeries MQSET', -'mqseries_strerror' => 'Returns the error message corresponding to a result code (MQRC)', -'ms_GetErrorObj' => 'Returns a reference to the head of the list of errorObj.', -'ms_GetVersion' => 'Returns the MapServer version and options in a string. This -string can be parsed to find out which modules were compiled in, -etc.', -'ms_GetVersionInt' => 'Returns the MapServer version number (x.y.z) as an integer -(x*10000 + y*100 + z). (New in v5.0) e.g. V5.4.3 would return -50403.', -'ms_iogetStdoutBufferBytes' => 'Writes the current buffer to stdout. The PHP header() function -should be used to set the documents\'s content-type prior to -calling the function. Returns the number of bytes written if -output is sent to stdout. See :ref:`mapscript_ows` for more info.', -'ms_ResetErrorList' => 'Clear the current error list. -Note that clearing the list invalidates any errorObj handles obtained -via the $error->next() method.', -'ms_TokenizeMap' => 'Preparses a mapfile through the MapServer parser and return an -array with one item for each token from the mapfile. Strings, -logical expressions, regex expressions and comments are returned -as individual tokens.', -'msession_connect' => 'Connect to msession server', -'msession_count' => 'Get session count', -'msession_create' => 'Create a session', -'msession_destroy' => 'Destroy a session', -'msession_disconnect' => 'Close connection to msession server', -'msession_find' => 'Find all sessions with name and value', -'msession_get' => 'Get value from session', -'msession_get_array' => 'Get array of msession variables', -'msession_get_data' => 'Get data session unstructured data', -'msession_inc' => 'Increment value in session', -'msession_list' => 'List all sessions', -'msession_listvar' => 'List sessions with variable', -'msession_lock' => 'Lock a session', -'msession_plugin' => 'Call an escape function within the msession personality plugin', -'msession_randstr' => 'Get random string', -'msession_set' => 'Set value in session', -'msession_set_array' => 'Set msession variables from an array', -'msession_set_data' => 'Set data session unstructured data', -'msession_timeout' => 'Set/get session timeout', -'msession_uniq' => 'Get unique id', -'msession_unlock' => 'Unlock a session', -'msg_get_queue' => 'Create or attach to a message queue', -'msg_queue_exists' => 'Check whether a message queue exists', -'msg_receive' => 'Receive a message from a message queue', -'msg_remove_queue' => 'Destroy a message queue', -'msg_send' => 'Send a message to a message queue', -'msg_set_queue' => 'Set information in the message queue data structure', -'msg_stat_queue' => 'Returns information from the message queue data structure', -'msgpack_pack' => 'Alias of msgpack_serialize', -'msgpack_serialize' => 'Serialize a variable into msgpack format', -'msgpack_unpack' => 'Alias of msgpack_unserialize', -'msgpack_unserialize' => 'Unserialize $str', -'msql' => 'Alias of msql_db_query', -'msql_affected_rows' => 'Returns number of affected rows', -'msql_close' => 'Close mSQL connection', -'msql_connect' => 'Open mSQL connection', -'msql_create_db' => 'Create mSQL database', -'msql_createdb' => 'Alias of msql_create_db', -'msql_data_seek' => 'Move internal row pointer', -'msql_db_query' => 'Send mSQL query', -'msql_dbname' => 'Alias of msql_result', -'msql_drop_db' => 'Drop (delete) mSQL database', -'msql_error' => 'Returns error message of last msql call', -'msql_fetch_array' => 'Fetch row as array', -'msql_fetch_field' => 'Get field information', -'msql_fetch_object' => 'Fetch row as object', -'msql_fetch_row' => 'Get row as enumerated array', -'msql_field_flags' => 'Get field flags', -'msql_field_len' => 'Get field length', -'msql_field_name' => 'Get the name of the specified field in a result', -'msql_field_seek' => 'Set field offset', -'msql_field_table' => 'Get table name for field', -'msql_field_type' => 'Get field type', -'msql_fieldflags' => 'Alias of msql_field_flags', -'msql_fieldlen' => 'Alias of msql_field_len', -'msql_fieldname' => 'Alias of msql_field_name', -'msql_fieldtable' => 'Alias of msql_field_table', -'msql_fieldtype' => 'Alias of msql_field_type', -'msql_free_result' => 'Free result memory', -'msql_list_dbs' => 'List mSQL databases on server', -'msql_list_fields' => 'List result fields', -'msql_list_tables' => 'List tables in an mSQL database', -'msql_num_fields' => 'Get number of fields in result', -'msql_num_rows' => 'Get number of rows in result', -'msql_numfields' => 'Alias of msql_num_fields', -'msql_numrows' => 'Alias of msql_num_rows', -'msql_pconnect' => 'Open persistent mSQL connection', -'msql_query' => 'Send mSQL query', -'msql_regcase' => 'Alias of sql_regcase', -'msql_result' => 'Get result data', -'msql_select_db' => 'Select mSQL database', -'msql_tablename' => 'Alias of msql_result', -'mssql_bind' => 'Adds a parameter to a stored procedure or a remote stored procedure', -'mssql_close' => 'Close MS SQL Server connection', -'mssql_connect' => 'Open MS SQL server connection', -'mssql_data_seek' => 'Moves internal row pointer', -'mssql_execute' => 'Executes a stored procedure on a MS SQL server database', -'mssql_fetch_array' => 'Fetch a result row as an associative array, a numeric array, or both', -'mssql_fetch_assoc' => 'Returns an associative array of the current row in the result', -'mssql_fetch_batch' => 'Returns the next batch of records', -'mssql_fetch_field' => 'Get field information', -'mssql_fetch_object' => 'Fetch row as object', -'mssql_fetch_row' => 'Get row as enumerated array', -'mssql_field_length' => 'Get the length of a field', -'mssql_field_name' => 'Get the name of a field', -'mssql_field_seek' => 'Seeks to the specified field offset', -'mssql_field_type' => 'Gets the type of a field', -'mssql_free_result' => 'Free result memory', -'mssql_free_statement' => 'Free statement memory', -'mssql_get_last_message' => 'Returns the last message from the server', -'mssql_guid_string' => 'Converts a 16 byte binary GUID to a string', -'mssql_init' => 'Initializes a stored procedure or a remote stored procedure', -'mssql_min_error_severity' => 'Sets the minimum error severity', -'mssql_min_message_severity' => 'Sets the minimum message severity', -'mssql_next_result' => 'Move the internal result pointer to the next result', -'mssql_num_fields' => 'Gets the number of fields in result', -'mssql_num_rows' => 'Gets the number of rows in result', -'mssql_pconnect' => 'Open persistent MS SQL connection', -'mssql_query' => 'Send MS SQL query', -'mssql_result' => 'Get result data', -'mssql_rows_affected' => 'Returns the number of records affected by the query', -'mssql_select_db' => 'Select MS SQL database', -'mt_getrandmax' => 'Show largest possible random value', -'mt_rand' => 'Generate a random value via the Mersenne Twister Random Number Generator', -'mt_srand' => 'Seeds the Mersenne Twister Random Number Generator', -'multipleiterator::__construct' => 'Constructs a new MultipleIterator', -'multipleiterator::attachIterator' => 'Attaches iterator information', -'multipleiterator::containsIterator' => 'Checks if an iterator is attached', -'multipleiterator::countIterators' => 'Gets the number of attached iterator instances', -'multipleiterator::current' => 'Gets the registered iterator instances', -'multipleiterator::detachIterator' => 'Detaches an iterator', -'multipleiterator::getFlags' => 'Gets the flag information', -'multipleiterator::key' => 'Gets the registered iterator instances', -'multipleiterator::next' => 'Moves all attached iterator instances forward', -'multipleiterator::rewind' => 'Rewinds all attached iterator instances', -'multipleiterator::setFlags' => 'Sets flags', -'multipleiterator::valid' => 'Checks the validity of sub iterators', -'mutex::create' => 'Create a Mutex', -'mutex::destroy' => 'Destroy Mutex', -'mutex::lock' => 'Acquire Mutex', -'mutex::trylock' => 'Attempt to Acquire Mutex', -'mutex::unlock' => 'Release Mutex', -'mysql_affected_rows' => 'Get number of affected rows in previous MySQL operation', -'mysql_client_encoding' => 'Returns the name of the character set', -'mysql_close' => 'Close MySQL connection', -'mysql_connect' => 'Open a connection to a MySQL Server', -'mysql_create_db' => 'Create a MySQL database', -'mysql_data_seek' => 'Move internal result pointer', -'mysql_db_name' => 'Retrieves database name from the call to mysql_list_dbs', -'mysql_db_query' => 'Selects a database and executes a query on it', -'mysql_drop_db' => 'Drop (delete) a MySQL database', -'mysql_errno' => 'Returns the numerical value of the error message from previous MySQL operation', -'mysql_error' => 'Returns the text of the error message from previous MySQL operation', -'mysql_escape_string' => 'Escapes a string for use in a mysql_query', -'mysql_fetch_array' => 'Fetch a result row as an associative array, a numeric array, or both', -'mysql_fetch_assoc' => 'Fetch a result row as an associative array', -'mysql_fetch_field' => 'Get column information from a result and return as an object', -'mysql_fetch_lengths' => 'Get the length of each output in a result', -'mysql_fetch_object' => 'Fetch a result row as an object', -'mysql_fetch_row' => 'Get a result row as an enumerated array', -'mysql_field_flags' => 'Get the flags associated with the specified field in a result', -'mysql_field_len' => 'Returns the length of the specified field', -'mysql_field_name' => 'Get the name of the specified field in a result', -'mysql_field_seek' => 'Set result pointer to a specified field offset', -'mysql_field_table' => 'Get name of the table the specified field is in', -'mysql_field_type' => 'Get the type of the specified field in a result', -'mysql_free_result' => 'Free result memory', -'mysql_get_client_info' => 'Get MySQL client info', -'mysql_get_host_info' => 'Get MySQL host info', -'mysql_get_proto_info' => 'Get MySQL protocol info', -'mysql_get_server_info' => 'Get MySQL server info', -'mysql_info' => 'Get information about the most recent query', -'mysql_insert_id' => 'Get the ID generated in the last query', -'mysql_list_dbs' => 'List databases available on a MySQL server', -'mysql_list_fields' => 'List MySQL table fields', -'mysql_list_processes' => 'List MySQL processes', -'mysql_list_tables' => 'List tables in a MySQL database', -'mysql_num_fields' => 'Get number of fields in result', -'mysql_num_rows' => 'Get number of rows in result', -'mysql_pconnect' => 'Open a persistent connection to a MySQL server', -'mysql_ping' => 'Ping a server connection or reconnect if there is no connection', -'mysql_query' => 'Send a MySQL query', -'mysql_real_escape_string' => 'Escapes special characters in a string for use in an SQL statement', -'mysql_result' => 'Get result data', -'mysql_select_db' => 'Select a MySQL database', -'mysql_set_charset' => 'Sets the client character set', -'mysql_stat' => 'Get current system status', -'mysql_tablename' => 'Get table name of field', -'mysql_thread_id' => 'Return the current thread ID', -'mysql_unbuffered_query' => 'Send an SQL query to MySQL without fetching and buffering the result rows', -'mysql_xdevapi\baseresult::getWarnings' => 'Fetch warnings from last operation', -'mysql_xdevapi\baseresult::getWarningsCount' => 'Fetch warning count from last operation', -'mysql_xdevapi\collection::__construct' => 'Collection constructor', -'mysql_xdevapi\collection::add' => 'Add collection document', -'mysql_xdevapi\collection::addOrReplaceOne' => 'Add or replace collection document', -'mysql_xdevapi\collection::count' => 'Get document count', -'mysql_xdevapi\collection::createIndex' => 'Create collection index', -'mysql_xdevapi\collection::dropIndex' => 'Drop collection index', -'mysql_xdevapi\collection::existsInDatabase' => 'Check if collection exists in database', -'mysql_xdevapi\collection::find' => 'Search for document', -'mysql_xdevapi\collection::getName' => 'Get collection name', -'mysql_xdevapi\collection::getOne' => 'Get one document', -'mysql_xdevapi\collection::getSchema' => 'Get schema object', -'mysql_xdevapi\collection::getSession' => 'Get session object', -'mysql_xdevapi\collection::modify' => 'Modify collection documents', -'mysql_xdevapi\collection::remove' => 'Remove collection documents', -'mysql_xdevapi\collection::removeOne' => 'Remove one collection document', -'mysql_xdevapi\collection::replaceOne' => 'Replace one collection document', -'mysql_xdevapi\collectionadd::__construct' => 'CollectionAdd constructor', -'mysql_xdevapi\collectionadd::execute' => 'Execute the statement', -'mysql_xdevapi\collectionfind::__construct' => 'CollectionFind constructor', -'mysql_xdevapi\collectionfind::bind' => 'Bind value to query placeholder', -'mysql_xdevapi\collectionfind::execute' => 'Execute the statement', -'mysql_xdevapi\collectionfind::fields' => 'Set document field filter', -'mysql_xdevapi\collectionfind::groupBy' => 'Set grouping criteria', -'mysql_xdevapi\collectionfind::having' => 'Set condition for aggregate functions', -'mysql_xdevapi\collectionfind::limit' => 'Limit number of returned documents', -'mysql_xdevapi\collectionfind::lockExclusive' => 'Execute operation with EXCLUSIVE LOCK', -'mysql_xdevapi\collectionfind::lockShared' => 'Execute operation with SHARED LOCK', -'mysql_xdevapi\collectionfind::offset' => 'Skip given number of elements to be returned', -'mysql_xdevapi\collectionfind::sort' => 'Set the sorting criteria', -'mysql_xdevapi\collectionmodify::__construct' => 'CollectionModify constructor', -'mysql_xdevapi\collectionmodify::arrayAppend' => 'Append element to an array field', -'mysql_xdevapi\collectionmodify::arrayInsert' => 'Insert element into an array field', -'mysql_xdevapi\collectionmodify::bind' => 'Bind value to query placeholder', -'mysql_xdevapi\collectionmodify::execute' => 'Execute modify operation', -'mysql_xdevapi\collectionmodify::limit' => 'Limit number of modified documents', -'mysql_xdevapi\collectionmodify::patch' => 'Patch document', -'mysql_xdevapi\collectionmodify::replace' => 'Replace document field', -'mysql_xdevapi\collectionmodify::set' => 'Set document attribute', -'mysql_xdevapi\collectionmodify::skip' => 'Skip elements', -'mysql_xdevapi\collectionmodify::sort' => 'Set the sorting criteria', -'mysql_xdevapi\collectionmodify::unset' => 'Unset the value of document fields', -'mysql_xdevapi\collectionremove::__construct' => 'CollectionRemove constructor', -'mysql_xdevapi\collectionremove::bind' => 'Bind value to placeholder', -'mysql_xdevapi\collectionremove::execute' => 'Execute remove operation', -'mysql_xdevapi\collectionremove::limit' => 'Limit number of documents to remove', -'mysql_xdevapi\collectionremove::sort' => 'Set the sorting criteria', -'mysql_xdevapi\columnresult::__construct' => 'ColumnResult constructor', -'mysql_xdevapi\columnresult::getCharacterSetName' => 'Get character set', -'mysql_xdevapi\columnresult::getCollationName' => 'Get collation name', -'mysql_xdevapi\columnresult::getColumnLabel' => 'Get column label', -'mysql_xdevapi\columnresult::getColumnName' => 'Get column name', -'mysql_xdevapi\columnresult::getFractionalDigits' => 'Get fractional digit length', -'mysql_xdevapi\columnresult::getLength' => 'Get column field length', -'mysql_xdevapi\columnresult::getSchemaName' => 'Get schema name', -'mysql_xdevapi\columnresult::getTableLabel' => 'Get table label', -'mysql_xdevapi\columnresult::getTableName' => 'Get table name', -'mysql_xdevapi\columnresult::getType' => 'Get column type', -'mysql_xdevapi\columnresult::isNumberSigned' => 'Check if signed type', -'mysql_xdevapi\columnresult::isPadded' => 'Check if padded', -'mysql_xdevapi\crudoperationbindable::bind' => 'Bind value to placeholder', -'mysql_xdevapi\crudoperationlimitable::limit' => 'Set result limit', -'mysql_xdevapi\crudoperationskippable::skip' => 'Number of operations to skip', -'mysql_xdevapi\crudoperationsortable::sort' => 'Sort results', -'mysql_xdevapi\databaseobject::existsInDatabase' => 'Check if object exists in database', -'mysql_xdevapi\databaseobject::getName' => 'Get object name', -'mysql_xdevapi\databaseobject::getSession' => 'Get session name', -'mysql_xdevapi\docresult::__construct' => 'DocResult constructor', -'mysql_xdevapi\docresult::fetchAll' => 'Get all rows', -'mysql_xdevapi\docresult::fetchOne' => 'Get one row', -'mysql_xdevapi\docresult::getWarnings' => 'Get warnings from last operation', -'mysql_xdevapi\docresult::getWarningsCount' => 'Get warning count from last operation', -'mysql_xdevapi\driver::__construct' => 'Driver constructor', -'mysql_xdevapi\executable::execute' => 'Execute statement', -'mysql_xdevapi\executionstatus::__construct' => 'ExecutionStatus constructor', -'mysql_xdevapi\expression::__construct' => 'Expression constructor', -'mysql_xdevapi\fieldmetadata::__construct' => 'FieldMetadata constructor', -'mysql_xdevapi\result::__construct' => 'Result constructor', -'mysql_xdevapi\result::getAutoIncrementValue' => 'Get autoincremented value', -'mysql_xdevapi\result::getGeneratedIds' => 'Get generated ids', -'mysql_xdevapi\result::getWarnings' => 'Get warnings from last operation', -'mysql_xdevapi\result::getWarningsCount' => 'Get warning count from last operation', -'mysql_xdevapi\rowresult::__construct' => 'RowResult constructor', -'mysql_xdevapi\rowresult::fetchAll' => 'Get all rows from result', -'mysql_xdevapi\rowresult::fetchOne' => 'Get row from result', -'mysql_xdevapi\rowresult::getColumnCount' => 'Get column count', -'mysql_xdevapi\rowresult::getColumnNames' => 'Get all column names', -'mysql_xdevapi\rowresult::getColumns' => 'Get column metadata', -'mysql_xdevapi\rowresult::getColumnsCount' => 'Get column count', -'mysql_xdevapi\rowresult::getWarnings' => 'Get warnings from last operation', -'mysql_xdevapi\rowresult::getWarningsCount' => 'Get warning count from last operation', -'mysql_xdevapi\schema::__construct' => 'constructor', -'mysql_xdevapi\schema::createCollection' => 'Add collection to schema', -'mysql_xdevapi\schema::dropCollection' => 'Drop collection from schema', -'mysql_xdevapi\schema::existsInDatabase' => 'Check if exists in database', -'mysql_xdevapi\schema::getCollection' => 'Get collection from schema', -'mysql_xdevapi\schema::getCollectionAsTable' => 'Get collection table object', -'mysql_xdevapi\schema::getCollections' => 'Get all schema collections', -'mysql_xdevapi\schema::getName' => 'Get schema name', -'mysql_xdevapi\schema::getSession' => 'Get schema session', -'mysql_xdevapi\schema::getTable' => 'Get schema table', -'mysql_xdevapi\schema::getTables' => 'Get schema tables', -'mysql_xdevapi\schemaobject::getSchema' => 'Get schema object', -'mysql_xdevapi\session::__construct' => 'Description constructor', -'mysql_xdevapi\session::close' => 'Close session', -'mysql_xdevapi\session::commit' => 'Commit transaction', -'mysql_xdevapi\session::createSchema' => 'Create new schema', -'mysql_xdevapi\session::dropSchema' => 'Drop a schema', -'mysql_xdevapi\session::executeSql' => 'Execute an SQL statement', -'mysql_xdevapi\session::generateUUID' => 'Get new UUID', -'mysql_xdevapi\session::getClientId' => 'Get client ID', -'mysql_xdevapi\session::getSchema' => 'Get a new schema object', -'mysql_xdevapi\session::getSchemas' => 'Get the schemas', -'mysql_xdevapi\session::getServerVersion' => 'Get server version', -'mysql_xdevapi\session::killClient' => 'Kill the client', -'mysql_xdevapi\session::listClients' => 'Get client list', -'mysql_xdevapi\session::quoteName' => 'Add quotes', -'mysql_xdevapi\session::releaseSavepoint' => 'Release set savepoint', -'mysql_xdevapi\session::rollback' => 'Rollback transaction', -'mysql_xdevapi\session::rollbackTo' => 'Rollback transaction to savepoint', -'mysql_xdevapi\session::setSavepoint' => 'Create savepoint', -'mysql_xdevapi\session::sql' => 'Execute SQL query', -'mysql_xdevapi\session::startTransaction' => 'Start transaction', -'mysql_xdevapi\sqlstatement::__construct' => 'Description constructor', -'mysql_xdevapi\sqlstatement::bind' => 'Bind statement parameters', -'mysql_xdevapi\sqlstatement::execute' => 'Execute the operation', -'mysql_xdevapi\sqlstatement::getNextResult' => 'Get next result', -'mysql_xdevapi\sqlstatement::getResult' => 'Get result', -'mysql_xdevapi\sqlstatement::hasMoreResults' => 'Check for more results', -'mysql_xdevapi\sqlstatementresult::__construct' => 'Description constructor', -'mysql_xdevapi\sqlstatementresult::fetchAll' => 'Get all rows', -'mysql_xdevapi\sqlstatementresult::fetchOne' => 'Get single row', -'mysql_xdevapi\sqlstatementresult::getAffectedItemsCount' => 'Get affected row count', -'mysql_xdevapi\sqlstatementresult::getColumnCount' => 'Get column count', -'mysql_xdevapi\sqlstatementresult::getColumnNames' => 'Get column names', -'mysql_xdevapi\sqlstatementresult::getColumns' => 'Get columns', -'mysql_xdevapi\sqlstatementresult::getColumnsCount' => 'Get column count', -'mysql_xdevapi\sqlstatementresult::getGeneratedIds' => 'Get generated ids', -'mysql_xdevapi\sqlstatementresult::getLastInsertId' => 'Get last insert id', -'mysql_xdevapi\sqlstatementresult::getWarnings' => 'Get warnings from last operation', -'mysql_xdevapi\sqlstatementresult::getWarningsCount' => 'Get warning count from last operation', -'mysql_xdevapi\sqlstatementresult::hasData' => 'Check if result has data', -'mysql_xdevapi\sqlstatementresult::nextResult' => 'Get next result', -'mysql_xdevapi\statement::__construct' => 'Description constructor', -'mysql_xdevapi\statement::getNextResult' => 'Get next result', -'mysql_xdevapi\statement::getResult' => 'Get result', -'mysql_xdevapi\statement::hasMoreResults' => 'Check if more results', -'mysql_xdevapi\table::__construct' => 'Table constructor', -'mysql_xdevapi\table::count' => 'Get row count', -'mysql_xdevapi\table::delete' => 'Delete rows from table', -'mysql_xdevapi\table::existsInDatabase' => 'Check if table exists in database', -'mysql_xdevapi\table::getName' => 'Get table name', -'mysql_xdevapi\table::getSchema' => 'Get table schema', -'mysql_xdevapi\table::getSession' => 'Get table session', -'mysql_xdevapi\table::insert' => 'Insert table rows', -'mysql_xdevapi\table::isView' => 'Check if table is view', -'mysql_xdevapi\table::select' => 'Select rows from table', -'mysql_xdevapi\table::update' => 'Update rows in table', -'mysql_xdevapi\tabledelete::__construct' => 'TableDelete constructor', -'mysql_xdevapi\tabledelete::bind' => 'Bind delete query parameters', -'mysql_xdevapi\tabledelete::execute' => 'Execute delete query', -'mysql_xdevapi\tabledelete::limit' => 'Limit deleted rows', -'mysql_xdevapi\tabledelete::offset' => 'Set delete limit offset', -'mysql_xdevapi\tabledelete::orderby' => 'Set delete sort criteria', -'mysql_xdevapi\tabledelete::where' => 'Set delete search condition', -'mysql_xdevapi\tableinsert::__construct' => 'TableInsert constructor', -'mysql_xdevapi\tableinsert::execute' => 'Execute insert query', -'mysql_xdevapi\tableinsert::values' => 'Add insert row values', -'mysql_xdevapi\tableselect::__construct' => 'TableSelect constructor', -'mysql_xdevapi\tableselect::bind' => 'Bind select query parameters', -'mysql_xdevapi\tableselect::execute' => 'Execute select statement', -'mysql_xdevapi\tableselect::groupBy' => 'Set select grouping criteria', -'mysql_xdevapi\tableselect::having' => 'Set select having condition', -'mysql_xdevapi\tableselect::limit' => 'Limit selected rows', -'mysql_xdevapi\tableselect::lockExclusive' => 'Execute EXCLUSIVE LOCK', -'mysql_xdevapi\tableselect::lockShared' => 'Execute SHARED LOCK', -'mysql_xdevapi\tableselect::offset' => 'Set limit offset', -'mysql_xdevapi\tableselect::orderby' => 'Set select sort criteria', -'mysql_xdevapi\tableselect::where' => 'Set select search condition', -'mysql_xdevapi\tableupdate::__construct' => 'TableUpdate constructor', -'mysql_xdevapi\tableupdate::bind' => 'Bind update query parameters', -'mysql_xdevapi\tableupdate::execute' => 'Execute update query', -'mysql_xdevapi\tableupdate::limit' => 'Limit update row count', -'mysql_xdevapi\tableupdate::orderby' => 'Set sorting criteria', -'mysql_xdevapi\tableupdate::set' => 'Add field to be updated', -'mysql_xdevapi\tableupdate::where' => 'Set search filter', -'mysql_xdevapi\warning::__construct' => 'Warning constructor', -'mysql_xdevapi\xsession::__construct' => 'Description constructor', -'mysqli::__construct' => 'Open a new connection to the MySQL server -</p>', -'mysqli::autocommit' => 'Turns on or off auto-committing database modifications', -'mysqli::begin_transaction' => 'Starts a transaction', -'mysqli::change_user' => 'Changes the user of the specified database connection', -'mysqli::character_set_name' => 'Returns the default character set for the database connection', -'mysqli::close' => 'Closes a previously opened database connection', -'mysqli::commit' => 'Commits the current transaction', -'mysqli::debug' => 'Performs debugging operations', -'mysqli::dump_debug_info' => 'Dump debugging information into the log', -'mysqli::escape_string' => 'Escapes special characters in a string for use in an SQL statement, taking into account the current charset of the connection', -'mysqli::get_charset' => 'Returns a character set object', -'mysqli::get_client_info' => 'Get MySQL client info', -'mysqli::get_connection_stats' => 'Returns statistics about the client connection', -'mysqli::get_server_info' => 'Returns the version of the MySQL server', -'mysqli::get_warnings' => 'Get result of SHOW WARNINGS', -'mysqli::init' => 'Initializes MySQLi and returns a resource for use with mysqli_real_connect()', -'mysqli::kill' => 'Asks the server to kill a MySQL thread', -'mysqli::more_results' => 'Check if there are any more query results from a multi query', -'mysqli::multi_query' => 'Performs a query on the database', -'mysqli::next_result' => 'Prepare next result from multi_query', -'mysqli::options' => 'Set options', -'mysqli::ping' => 'Pings a server connection, or tries to reconnect if the connection has gone down', -'mysqli::poll' => 'Poll connections', -'mysqli::prepare' => 'Prepare an SQL statement for execution', -'mysqli::query' => 'Performs a query on the database', -'mysqli::real_connect' => 'Opens a connection to a mysql server', -'mysqli::real_escape_string' => 'Escapes special characters in a string for use in an SQL statement, taking into account the current charset of the connection', -'mysqli::real_query' => 'Execute an SQL query', -'mysqli::reap_async_query' => 'Get result from async query', -'mysqli::refresh' => 'Refreshes', -'mysqli::release_savepoint' => 'Removes the named savepoint from the set of savepoints of the current transaction', -'mysqli::rollback' => 'Rolls back current transaction', -'mysqli::rpl_query_type' => 'Returns RPL query type', -'mysqli::savepoint' => 'Set a named transaction savepoint', -'mysqli::select_db' => 'Selects the default database for database queries', -'mysqli::send_query' => 'Send the query and return', -'mysqli::set_charset' => 'Sets the default client character set', -'mysqli::set_local_infile_default' => 'Unsets user defined handler for load local infile command', -'mysqli::set_local_infile_handler' => 'Set callback function for LOAD DATA LOCAL INFILE command', -'mysqli::ssl_set' => 'Used for establishing secure connections using SSL', -'mysqli::stat' => 'Gets the current system status', -'mysqli::stmt_init' => 'Initializes a statement and returns an object for use with mysqli_stmt_prepare', -'mysqli::store_result' => 'Transfers a result set from the last query', -'mysqli::thread_safe' => 'Returns whether thread safety is given or not', -'mysqli::use_result' => 'Initiate a result set retrieval', -'mysqli_bind_param' => 'Alias for mysqli_stmt_bind_param', -'mysqli_bind_result' => 'Alias for mysqli_stmt_bind_result', -'mysqli_client_encoding' => 'Alias of mysqli_character_set_name', -'mysqli_connect' => 'Alias of mysqli::__construct', -'mysqli_disable_rpl_parse' => 'Disable RPL parse', -'mysqli_driver::embedded_server_end' => 'Stop embedded server', -'mysqli_driver::embedded_server_start' => 'Initialize and start embedded server', -'mysqli_enable_reads_from_master' => 'Enable reads from master', -'mysqli_enable_rpl_parse' => 'Enable RPL parse', -'mysqli_escape_string' => 'Alias of mysqli_real_escape_string', -'mysqli_execute' => 'Alias for mysqli_stmt_execute', -'mysqli_fetch' => 'Alias for mysqli_stmt_fetch', -'mysqli_get_cache_stats' => 'Returns client Zval cache statistics', -'mysqli_get_client_stats' => 'Returns client per-process statistics', -'mysqli_get_links_stats' => 'Return information about open and cached links', -'mysqli_get_metadata' => 'Alias for mysqli_stmt_result_metadata', -'mysqli_master_query' => 'Enforce execution of a query on the master in a master/slave setup', -'mysqli_param_count' => 'Alias for mysqli_stmt_param_count', -'mysqli_report' => 'Alias of mysqli_driver->report_mode', -'mysqli_result::__construct' => 'Constructor (no docs available)', -'mysqli_result::close' => 'Frees the memory associated with a result', -'mysqli_result::data_seek' => 'Adjusts the result pointer to an arbitrary row in the result', -'mysqli_result::fetch_all' => 'Fetches all result rows as an associative array, a numeric array, or both', -'mysqli_result::fetch_array' => 'Fetch a result row as an associative, a numeric array, or both', -'mysqli_result::fetch_assoc' => 'Fetch a result row as an associative array', -'mysqli_result::fetch_field' => 'Returns the next field in the result set', -'mysqli_result::fetch_field_direct' => 'Fetch meta-data for a single field', -'mysqli_result::fetch_fields' => 'Returns an array of objects representing the fields in a result set', -'mysqli_result::fetch_object' => 'Returns the current row of a result set as an object', -'mysqli_result::fetch_row' => 'Get a result row as an enumerated array', -'mysqli_result::field_seek' => 'Set result pointer to a specified field offset', -'mysqli_result::free' => 'Frees the memory associated with a result', -'mysqli_result::free_result' => 'Frees the memory associated with a result', -'mysqli_rpl_parse_enabled' => 'Check if RPL parse is enabled', -'mysqli_rpl_probe' => 'RPL probe', -'mysqli_send_long_data' => 'Alias for mysqli_stmt_send_long_data', -'mysqli_slave_query' => 'Force execution of a query on a slave in a master/slave setup', -'mysqli_stmt::__construct' => 'Constructs a new mysqli_stmt object', -'mysqli_stmt::attr_get' => 'Used to get the current value of a statement attribute', -'mysqli_stmt::attr_set' => 'Used to modify the behavior of a prepared statement', -'mysqli_stmt::bind_param' => 'Binds variables to a prepared statement as parameters', -'mysqli_stmt::bind_result' => 'Binds variables to a prepared statement for result storage', -'mysqli_stmt::close' => 'Closes a prepared statement', -'mysqli_stmt::data_seek' => 'Seeks to an arbitrary row in statement result set', -'mysqli_stmt::execute' => 'Executes a prepared Query', -'mysqli_stmt::fetch' => 'Fetch results from a prepared statement into the bound variables', -'mysqli_stmt::free_result' => 'Frees stored result memory for the given statement handle', -'mysqli_stmt::get_result' => 'Gets a result set from a prepared statement', -'mysqli_stmt::get_warnings' => 'Get result of SHOW WARNINGS', -'mysqli_stmt::more_results' => 'Check if there are more query results from a multiple query', -'mysqli_stmt::next_result' => 'Reads the next result from a multiple query', -'mysqli_stmt::num_rows' => 'Return the number of rows in statements result set', -'mysqli_stmt::prepare' => 'Prepare an SQL statement for execution', -'mysqli_stmt::reset' => 'Resets a prepared statement', -'mysqli_stmt::result_metadata' => 'Returns result set metadata from a prepared statement', -'mysqli_stmt::send_long_data' => 'Send data in blocks', -'mysqli_stmt::stmt' => 'No documentation available', -'mysqli_stmt::store_result' => 'Transfers a result set from a prepared statement', -'mysqli_warning::__construct' => 'The __construct purpose', -'mysqli_warning::next' => 'The next purpose', -'mysqlnd_memcache_get_config' => 'Returns information about the plugin configuration', -'mysqlnd_memcache_set' => 'Associate a MySQL connection with a Memcache connection', -'mysqlnd_ms_dump_servers' => 'Returns a list of currently configured servers', -'mysqlnd_ms_fabric_select_global' => 'Switch to global sharding server for a given table', -'mysqlnd_ms_fabric_select_shard' => 'Switch to shard', -'mysqlnd_ms_get_last_gtid' => 'Returns the latest global transaction ID', -'mysqlnd_ms_get_last_used_connection' => 'Returns an array which describes the last used connection', -'mysqlnd_ms_get_stats' => 'Returns query distribution and connection statistics', -'mysqlnd_ms_match_wild' => 'Finds whether a table name matches a wildcard pattern or not', -'mysqlnd_ms_query_is_select' => 'Find whether to send the query to the master, the slave or the last used MySQL server', -'mysqlnd_ms_set_qos' => 'Sets the quality of service needed from the cluster', -'mysqlnd_ms_set_user_pick_server' => 'Sets a callback for user-defined read/write splitting', -'mysqlnd_ms_xa_begin' => 'Starts a distributed/XA transaction among MySQL servers', -'mysqlnd_ms_xa_commit' => 'Commits a distributed/XA transaction among MySQL servers', -'mysqlnd_ms_xa_gc' => 'Garbage collects unfinished XA transactions after severe errors', -'mysqlnd_ms_xa_rollback' => 'Rolls back a distributed/XA transaction among MySQL servers', -'mysqlnd_qc_clear_cache' => 'Flush all cache contents', -'mysqlnd_qc_get_available_handlers' => 'Returns a list of available storage handler', -'mysqlnd_qc_get_cache_info' => 'Returns information on the current handler, the number of cache entries and cache entries, if available', -'mysqlnd_qc_get_core_stats' => 'Statistics collected by the core of the query cache', -'mysqlnd_qc_get_normalized_query_trace_log' => 'Returns a normalized query trace log for each query inspected by the query cache', -'mysqlnd_qc_get_query_trace_log' => 'Returns a backtrace for each query inspected by the query cache', -'mysqlnd_qc_set_cache_condition' => 'Set conditions for automatic caching', -'mysqlnd_qc_set_is_select' => 'Installs a callback which decides whether a statement is cached', -'mysqlnd_qc_set_storage_handler' => 'Change current storage handler', -'mysqlnd_qc_set_user_handlers' => 'Sets the callback functions for a user-defined procedural storage handler', -'mysqlnd_uh_convert_to_mysqlnd' => 'Converts a MySQL connection handle into a mysqlnd connection handle', -'mysqlnd_uh_set_connection_proxy' => 'Installs a proxy for mysqlnd connections', -'mysqlnd_uh_set_statement_proxy' => 'Installs a proxy for mysqlnd statements', -'mysqlnduhconnection::__construct' => 'The __construct purpose', -'mysqlnduhconnection::changeUser' => 'Changes the user of the specified mysqlnd database connection', -'mysqlnduhconnection::charsetName' => 'Returns the default character set for the database connection', -'mysqlnduhconnection::close' => 'Closes a previously opened database connection', -'mysqlnduhconnection::connect' => 'Open a new connection to the MySQL server', -'mysqlnduhconnection::endPSession' => 'End a persistent connection', -'mysqlnduhconnection::escapeString' => 'Escapes special characters in a string for use in an SQL statement, taking into account the current charset of the connection', -'mysqlnduhconnection::getAffectedRows' => 'Gets the number of affected rows in a previous MySQL operation', -'mysqlnduhconnection::getErrorNumber' => 'Returns the error code for the most recent function call', -'mysqlnduhconnection::getErrorString' => 'Returns a string description of the last error', -'mysqlnduhconnection::getFieldCount' => 'Returns the number of columns for the most recent query', -'mysqlnduhconnection::getHostInformation' => 'Returns a string representing the type of connection used', -'mysqlnduhconnection::getLastInsertId' => 'Returns the auto generated id used in the last query', -'mysqlnduhconnection::getLastMessage' => 'Retrieves information about the most recently executed query', -'mysqlnduhconnection::getProtocolInformation' => 'Returns the version of the MySQL protocol used', -'mysqlnduhconnection::getServerInformation' => 'Returns the version of the MySQL server', -'mysqlnduhconnection::getServerStatistics' => 'Gets the current system status', -'mysqlnduhconnection::getServerVersion' => 'Returns the version of the MySQL server as an integer', -'mysqlnduhconnection::getSqlstate' => 'Returns the SQLSTATE error from previous MySQL operation', -'mysqlnduhconnection::getStatistics' => 'Returns statistics about the client connection', -'mysqlnduhconnection::getThreadId' => 'Returns the thread ID for the current connection', -'mysqlnduhconnection::getWarningCount' => 'Returns the number of warnings from the last query for the given link', -'mysqlnduhconnection::init' => 'Initialize mysqlnd connection', -'mysqlnduhconnection::killConnection' => 'Asks the server to kill a MySQL thread', -'mysqlnduhconnection::listFields' => 'List MySQL table fields', -'mysqlnduhconnection::listMethod' => 'Wrapper for assorted list commands', -'mysqlnduhconnection::moreResults' => 'Check if there are any more query results from a multi query', -'mysqlnduhconnection::nextResult' => 'Prepare next result from multi_query', -'mysqlnduhconnection::ping' => 'Pings a server connection, or tries to reconnect if the connection has gone down', -'mysqlnduhconnection::query' => 'Performs a query on the database', -'mysqlnduhconnection::queryReadResultsetHeader' => 'Read a result set header', -'mysqlnduhconnection::reapQuery' => 'Get result from async query', -'mysqlnduhconnection::refreshServer' => 'Flush or reset tables and caches', -'mysqlnduhconnection::restartPSession' => 'Restart a persistent mysqlnd connection', -'mysqlnduhconnection::selectDb' => 'Selects the default database for database queries', -'mysqlnduhconnection::sendClose' => 'Sends a close command to MySQL', -'mysqlnduhconnection::sendQuery' => 'Sends a query to MySQL', -'mysqlnduhconnection::serverDumpDebugInformation' => 'Dump debugging information into the log for the MySQL server', -'mysqlnduhconnection::setAutocommit' => 'Turns on or off auto-committing database modifications', -'mysqlnduhconnection::setCharset' => 'Sets the default client character set', -'mysqlnduhconnection::setClientOption' => 'Sets a client option', -'mysqlnduhconnection::setServerOption' => 'Sets a server option', -'mysqlnduhconnection::shutdownServer' => 'The shutdownServer purpose', -'mysqlnduhconnection::simpleCommand' => 'Sends a basic COM_* command', -'mysqlnduhconnection::simpleCommandHandleResponse' => 'Process a response for a basic COM_* command send to the client', -'mysqlnduhconnection::sslSet' => 'Used for establishing secure connections using SSL', -'mysqlnduhconnection::stmtInit' => 'Initializes a statement and returns a resource for use with mysqli_statement::prepare', -'mysqlnduhconnection::storeResult' => 'Transfers a result set from the last query', -'mysqlnduhconnection::txCommit' => 'Commits the current transaction', -'mysqlnduhconnection::txRollback' => 'Rolls back current transaction', -'mysqlnduhconnection::useResult' => 'Initiate a result set retrieval', -'mysqlnduhpreparedstatement::__construct' => 'The __construct purpose', -'mysqlnduhpreparedstatement::execute' => 'Executes a prepared Query', -'mysqlnduhpreparedstatement::prepare' => 'Prepare an SQL statement for execution', -'natcasesort' => 'Sort an array using a case insensitive "natural order" algorithm', -'natsort' => 'Sort an array using a "natural order" algorithm', -'ncurses_addch' => 'Add character at current position and advance cursor', -'ncurses_addchnstr' => 'Add attributed string with specified length at current position', -'ncurses_addchstr' => 'Add attributed string at current position', -'ncurses_addnstr' => 'Add string with specified length at current position', -'ncurses_addstr' => 'Output text at current position', -'ncurses_assume_default_colors' => 'Define default colors for color 0', -'ncurses_attroff' => 'Turn off the given attributes', -'ncurses_attron' => 'Turn on the given attributes', -'ncurses_attrset' => 'Set given attributes', -'ncurses_baudrate' => 'Returns baudrate of terminal', -'ncurses_beep' => 'Let the terminal beep', -'ncurses_bkgd' => 'Set background property for terminal screen', -'ncurses_bkgdset' => 'Control screen background', -'ncurses_border' => 'Draw a border around the screen using attributed characters', -'ncurses_bottom_panel' => 'Moves a visible panel to the bottom of the stack', -'ncurses_can_change_color' => 'Checks if terminal color definitions can be changed', -'ncurses_cbreak' => 'Switch off input buffering', -'ncurses_clear' => 'Clear screen', -'ncurses_clrtobot' => 'Clear screen from current position to bottom', -'ncurses_clrtoeol' => 'Clear screen from current position to end of line', -'ncurses_color_content' => 'Retrieves RGB components of a color', -'ncurses_color_set' => 'Set active foreground and background colors', -'ncurses_curs_set' => 'Set cursor state', -'ncurses_def_prog_mode' => 'Saves terminals (program) mode', -'ncurses_def_shell_mode' => 'Saves terminals (shell) mode', -'ncurses_define_key' => 'Define a keycode', -'ncurses_del_panel' => 'Remove panel from the stack and delete it (but not the associated window)', -'ncurses_delay_output' => 'Delay output on terminal using padding characters', -'ncurses_delch' => 'Delete character at current position, move rest of line left', -'ncurses_deleteln' => 'Delete line at current position, move rest of screen up', -'ncurses_delwin' => 'Delete a ncurses window', -'ncurses_doupdate' => 'Write all prepared refreshes to terminal', -'ncurses_echo' => 'Activate keyboard input echo', -'ncurses_echochar' => 'Single character output including refresh', -'ncurses_end' => 'Stop using ncurses, clean up the screen', -'ncurses_erase' => 'Erase terminal screen', -'ncurses_erasechar' => 'Returns current erase character', -'ncurses_filter' => 'Set LINES for iniscr() and newterm() to 1', -'ncurses_flash' => 'Flash terminal screen (visual bell)', -'ncurses_flushinp' => 'Flush keyboard input buffer', -'ncurses_getch' => 'Read a character from keyboard', -'ncurses_getmaxyx' => 'Returns the size of a window', -'ncurses_getmouse' => 'Reads mouse event', -'ncurses_getyx' => 'Returns the current cursor position for a window', -'ncurses_halfdelay' => 'Put terminal into halfdelay mode', -'ncurses_has_colors' => 'Checks if terminal has color capabilities', -'ncurses_has_ic' => 'Check for insert- and delete-capabilities', -'ncurses_has_il' => 'Check for line insert- and delete-capabilities', -'ncurses_has_key' => 'Check for presence of a function key on terminal keyboard', -'ncurses_hide_panel' => 'Remove panel from the stack, making it invisible', -'ncurses_hline' => 'Draw a horizontal line at current position using an attributed character and max. n characters long', -'ncurses_inch' => 'Get character and attribute at current position', -'ncurses_init' => 'Initialize ncurses', -'ncurses_init_color' => 'Define a terminal color', -'ncurses_init_pair' => 'Define a color pair', -'ncurses_insch' => 'Insert character moving rest of line including character at current position', -'ncurses_insdelln' => 'Insert lines before current line scrolling down (negative numbers delete and scroll up)', -'ncurses_insertln' => 'Insert a line, move rest of screen down', -'ncurses_insstr' => 'Insert string at current position, moving rest of line right', -'ncurses_instr' => 'Reads string from terminal screen', -'ncurses_isendwin' => 'Ncurses is in endwin mode, normal screen output may be performed', -'ncurses_keyok' => 'Enable or disable a keycode', -'ncurses_keypad' => 'Turns keypad on or off', -'ncurses_killchar' => 'Returns current line kill character', -'ncurses_longname' => 'Returns terminals description', -'ncurses_meta' => 'Enables/Disable 8-bit meta key information', -'ncurses_mouse_trafo' => 'Transforms coordinates', -'ncurses_mouseinterval' => 'Set timeout for mouse button clicks', -'ncurses_mousemask' => 'Sets mouse options', -'ncurses_move' => 'Move output position', -'ncurses_move_panel' => 'Moves a panel so that its upper-left corner is at [startx, starty]', -'ncurses_mvaddch' => 'Move current position and add character', -'ncurses_mvaddchnstr' => 'Move position and add attributed string with specified length', -'ncurses_mvaddchstr' => 'Move position and add attributed string', -'ncurses_mvaddnstr' => 'Move position and add string with specified length', -'ncurses_mvaddstr' => 'Move position and add string', -'ncurses_mvcur' => 'Move cursor immediately', -'ncurses_mvdelch' => 'Move position and delete character, shift rest of line left', -'ncurses_mvgetch' => 'Move position and get character at new position', -'ncurses_mvhline' => 'Set new position and draw a horizontal line using an attributed character and max. n characters long', -'ncurses_mvinch' => 'Move position and get attributed character at new position', -'ncurses_mvvline' => 'Set new position and draw a vertical line using an attributed character and max. n characters long', -'ncurses_mvwaddstr' => 'Add string at new position in window', -'ncurses_napms' => 'Sleep', -'ncurses_new_panel' => 'Create a new panel and associate it with window', -'ncurses_newpad' => 'Creates a new pad (window)', -'ncurses_newwin' => 'Create a new window', -'ncurses_nl' => 'Translate newline and carriage return / line feed', -'ncurses_nocbreak' => 'Switch terminal to cooked mode', -'ncurses_noecho' => 'Switch off keyboard input echo', -'ncurses_nonl' => 'Do not translate newline and carriage return / line feed', -'ncurses_noqiflush' => 'Do not flush on signal characters', -'ncurses_noraw' => 'Switch terminal out of raw mode', -'ncurses_pair_content' => 'Retrieves foreground and background colors of a color pair', -'ncurses_panel_above' => 'Returns the panel above panel', -'ncurses_panel_below' => 'Returns the panel below panel', -'ncurses_panel_window' => 'Returns the window associated with panel', -'ncurses_pnoutrefresh' => 'Copies a region from a pad into the virtual screen', -'ncurses_prefresh' => 'Copies a region from a pad into the virtual screen', -'ncurses_putp' => 'Apply padding information to the string and output it', -'ncurses_qiflush' => 'Flush on signal characters', -'ncurses_raw' => 'Switch terminal into raw mode', -'ncurses_refresh' => 'Refresh screen', -'ncurses_replace_panel' => 'Replaces the window associated with panel', -'ncurses_reset_prog_mode' => 'Resets the prog mode saved by def_prog_mode', -'ncurses_reset_shell_mode' => 'Resets the shell mode saved by def_shell_mode', -'ncurses_resetty' => 'Restores saved terminal state', -'ncurses_savetty' => 'Saves terminal state', -'ncurses_scr_dump' => 'Dump screen content to file', -'ncurses_scr_init' => 'Initialize screen from file dump', -'ncurses_scr_restore' => 'Restore screen from file dump', -'ncurses_scr_set' => 'Inherit screen from file dump', -'ncurses_scrl' => 'Scroll window content up or down without changing current position', -'ncurses_show_panel' => 'Places an invisible panel on top of the stack, making it visible', -'ncurses_slk_attr' => 'Returns current soft label key attribute', -'ncurses_slk_attroff' => 'Turn off the given attributes for soft function-key labels', -'ncurses_slk_attron' => 'Turn on the given attributes for soft function-key labels', -'ncurses_slk_attrset' => 'Set given attributes for soft function-key labels', -'ncurses_slk_clear' => 'Clears soft labels from screen', -'ncurses_slk_color' => 'Sets color for soft label keys', -'ncurses_slk_init' => 'Initializes soft label key functions', -'ncurses_slk_noutrefresh' => 'Copies soft label keys to virtual screen', -'ncurses_slk_refresh' => 'Copies soft label keys to screen', -'ncurses_slk_restore' => 'Restores soft label keys', -'ncurses_slk_set' => 'Sets function key labels', -'ncurses_slk_touch' => 'Forces output when ncurses_slk_noutrefresh is performed', -'ncurses_standend' => 'Stop using \'standout\' attribute', -'ncurses_standout' => 'Start using \'standout\' attribute', -'ncurses_start_color' => 'Initializes color functionality', -'ncurses_termattrs' => 'Returns a logical OR of all attribute flags supported by terminal', -'ncurses_termname' => 'Returns terminals (short)-name', -'ncurses_timeout' => 'Set timeout for special key sequences', -'ncurses_top_panel' => 'Moves a visible panel to the top of the stack', -'ncurses_typeahead' => 'Specify different filedescriptor for typeahead checking', -'ncurses_ungetch' => 'Put a character back into the input stream', -'ncurses_ungetmouse' => 'Pushes mouse event to queue', -'ncurses_update_panels' => 'Refreshes the virtual screen to reflect the relations between panels in the stack', -'ncurses_use_default_colors' => 'Assign terminal default colors to color id -1', -'ncurses_use_env' => 'Control use of environment information about terminal size', -'ncurses_use_extended_names' => 'Control use of extended names in terminfo descriptions', -'ncurses_vidattr' => 'Display the string on the terminal in the video attribute mode', -'ncurses_vline' => 'Draw a vertical line at current position using an attributed character and max. n characters long', -'ncurses_waddch' => 'Adds character at current position in a window and advance cursor', -'ncurses_waddstr' => 'Outputs text at current position in window', -'ncurses_wattroff' => 'Turns off attributes for a window', -'ncurses_wattron' => 'Turns on attributes for a window', -'ncurses_wattrset' => 'Set the attributes for a window', -'ncurses_wborder' => 'Draws a border around the window using attributed characters', -'ncurses_wclear' => 'Clears window', -'ncurses_wcolor_set' => 'Sets windows color pairings', -'ncurses_werase' => 'Erase window contents', -'ncurses_wgetch' => 'Reads a character from keyboard (window)', -'ncurses_whline' => 'Draws a horizontal line in a window at current position using an attributed character and max. n characters long', -'ncurses_wmouse_trafo' => 'Transforms window/stdscr coordinates', -'ncurses_wmove' => 'Moves windows output position', -'ncurses_wnoutrefresh' => 'Copies window to virtual screen', -'ncurses_wrefresh' => 'Refresh window on terminal screen', -'ncurses_wstandend' => 'End standout mode for a window', -'ncurses_wstandout' => 'Enter standout mode for a window', -'ncurses_wvline' => 'Draws a vertical line in a window at current position using an attributed character and max. n characters long', -'newt_bell' => 'Send a beep to the terminal', -'newt_button' => 'Create a new button', -'newt_button_bar' => 'This function returns a grid containing the buttons created', -'newt_centered_window' => 'Open a centered window of the specified size', -'newt_checkbox_get_value' => 'Retreives value of checkox resource', -'newt_checkbox_set_flags' => 'Configures checkbox resource', -'newt_checkbox_set_value' => 'Sets the value of the checkbox', -'newt_checkbox_tree_add_item' => 'Adds new item to the checkbox tree', -'newt_checkbox_tree_find_item' => 'Finds an item in the checkbox tree', -'newt_checkbox_tree_get_current' => 'Returns checkbox tree selected item', -'newt_clear_key_buffer' => 'Discards the contents of the terminal\'s input buffer without waiting for additional input', -'newt_draw_root_text' => 'Displays the string text at the position indicated', -'newt_finished' => 'Uninitializes newt interface', -'newt_form' => 'Create a form', -'newt_form_add_component' => 'Adds a single component to the form', -'newt_form_add_components' => 'Add several components to the form', -'newt_form_destroy' => 'Destroys a form', -'newt_form_run' => 'Runs a form', -'newt_get_screen_size' => 'Fills in the passed references with the current size of the terminal', -'newt_init' => 'Initialize newt', -'newt_open_window' => 'Open a window of the specified size and position', -'newt_pop_help_line' => 'Replaces the current help line with the one from the stack', -'newt_pop_window' => 'Removes the top window from the display', -'newt_push_help_line' => 'Saves the current help line on a stack, and displays the new line', -'newt_refresh' => 'Updates modified portions of the screen', -'newt_resume' => 'Resume using the newt interface after calling newt_suspend', -'newt_run_form' => 'Runs a form', -'newt_set_suspend_callback' => 'Set a callback function which gets invoked when user presses the suspend key', -'newt_suspend' => 'Tells newt to return the terminal to its initial state', -'newt_wait_for_key' => 'Doesn\'t return until a key has been pressed', -'next' => 'Advance the internal pointer of an array', -'ngettext' => 'Plural version of gettext', -'nl2br' => 'Inserts HTML line breaks before all newlines in a string', -'nl_langinfo' => 'Query language and locale information', -'norewinditerator::__construct' => 'Construct a NoRewindIterator', -'norewinditerator::current' => 'Get the current value', -'norewinditerator::getInnerIterator' => 'Get the inner iterator', -'norewinditerator::key' => 'Get the current key', -'norewinditerator::next' => 'Forward to the next element', -'norewinditerator::rewind' => 'Prevents the rewind operation on the inner iterator', -'norewinditerator::valid' => 'Validates the iterator', -'normalizer::getRawDecomposition' => 'Gets the Decomposition_Mapping property for the given UTF-8 encoded code point', -'normalizer::isNormalized' => 'Checks if the provided string is already in the specified normalization form', -'normalizer::normalize' => 'Normalizes the input provided and returns the normalized string', -'nsapi_request_headers' => 'Fetch all HTTP request headers', -'nsapi_response_headers' => 'Fetch all HTTP response headers', -'nsapi_virtual' => 'Perform an NSAPI sub-request', -'number_format' => 'Format a number with grouped thousands', -'NumberFormatter::create' => 'Create a number formatter', -'numberformatter::format' => 'Format a number', -'numberformatter::formatCurrency' => 'Format a currency value', -'numberformatter::getAttribute' => 'Get an attribute', -'numberformatter::getErrorCode' => 'Get formatter\'s last error code', -'numberformatter::getErrorMessage' => 'Get formatter\'s last error message', -'numberformatter::getLocale' => 'Get formatter locale', -'numberformatter::getPattern' => 'Get formatter pattern', -'numberformatter::getSymbol' => 'Get a symbol value', -'numberformatter::getTextAttribute' => 'Get a text attribute', -'numberformatter::parse' => 'Parse a number', -'numberformatter::parseCurrency' => 'Parse a currency number', -'numberformatter::setAttribute' => 'Set an attribute', -'numberformatter::setPattern' => 'Set formatter pattern', -'numberformatter::setSymbol' => 'Set a symbol value', -'numberformatter::setTextAttribute' => 'Set a text attribute', -'oauth::__construct' => 'Create a new OAuth object', -'oauth::__destruct' => 'The destructor', -'oauth::disableDebug' => 'Turn off verbose debugging', -'oauth::disableRedirects' => 'Turn off redirects', -'oauth::disableSSLChecks' => 'Turn off SSL checks', -'oauth::enableDebug' => 'Turn on verbose debugging', -'oauth::enableRedirects' => 'Turn on redirects', -'oauth::enableSSLChecks' => 'Turn on SSL checks', -'oauth::fetch' => 'Fetch an OAuth protected resource', -'oauth::generateSignature' => 'Generate a signature', -'oauth::getAccessToken' => 'Fetch an access token', -'oauth::getCAPath' => 'Gets CA information', -'oauth::getLastResponse' => 'Get the last response', -'oauth::getLastResponseHeaders' => 'Get headers for last response', -'oauth::getLastResponseInfo' => 'Get HTTP information about the last response', -'oauth::getRequestHeader' => 'Generate OAuth header string signature', -'oauth::getRequestToken' => 'Fetch a request token', -'oauth::setAuthType' => 'Set authorization type', -'oauth::setCAPath' => 'Set CA path and info', -'oauth::setNonce' => 'Set the nonce for subsequent requests', -'oauth::setRequestEngine' => 'The setRequestEngine purpose', -'oauth::setRSACertificate' => 'Set the RSA certificate', -'oauth::setSSLChecks' => 'Tweak specific SSL checks for requests', -'OAuth::setTimeout' => 'Set the timeout', -'oauth::setTimestamp' => 'Set the timestamp', -'oauth::setToken' => 'Sets the token and secret', -'oauth::setVersion' => 'Set the OAuth version', -'oauth_get_sbs' => 'Generate a Signature Base String', -'oauth_urlencode' => 'Encode a URI to RFC 3986', -'oauthprovider::__construct' => 'Constructs a new OAuthProvider object', -'oauthprovider::addRequiredParameter' => 'Add required parameters', -'oauthprovider::callconsumerHandler' => 'Calls the consumerNonceHandler callback', -'oauthprovider::callTimestampNonceHandler' => 'Calls the timestampNonceHandler callback', -'oauthprovider::calltokenHandler' => 'Calls the tokenNonceHandler callback', -'oauthprovider::checkOAuthRequest' => 'Check an oauth request', -'oauthprovider::consumerHandler' => 'Set the consumerHandler handler callback', -'oauthprovider::generateToken' => 'Generate a random token', -'oauthprovider::is2LeggedEndpoint' => 'is2LeggedEndpoint', -'oauthprovider::isRequestTokenEndpoint' => 'Sets isRequestTokenEndpoint', -'oauthprovider::removeRequiredParameter' => 'Remove a required parameter', -'oauthprovider::reportProblem' => 'Report a problem', -'oauthprovider::setParam' => 'Set a parameter', -'oauthprovider::setRequestTokenPath' => 'Set request token path', -'oauthprovider::timestampNonceHandler' => 'Set the timestampNonceHandler handler callback', -'oauthprovider::tokenHandler' => 'Set the tokenHandler handler callback', -'ob_clean' => 'Clean (erase) the output buffer', -'ob_end_clean' => 'Clean (erase) the output buffer and turn off output buffering', -'ob_end_flush' => 'Flush (send) the output buffer and turn off output buffering', -'ob_flush' => 'Flush (send) the output buffer', -'ob_get_clean' => 'Get current buffer contents and delete current output buffer', -'ob_get_contents' => 'Return the contents of the output buffer', -'ob_get_flush' => 'Flush the output buffer, return it as a string and turn off output buffering', -'ob_get_length' => 'Return the length of the output buffer', -'ob_get_level' => 'Return the nesting level of the output buffering mechanism', -'ob_get_status' => 'Get status of output buffers', -'ob_gzhandler' => 'ob_start callback function to gzip output buffer', -'ob_iconv_handler' => 'Convert character encoding as output buffer handler', -'ob_implicit_flush' => 'Turn implicit flush on/off', -'ob_list_handlers' => 'List all output handlers in use', -'ob_start' => 'Turn on output buffering', -'ob_tidyhandler' => 'ob_start callback function to repair the buffer', -'oci_bind_array_by_name' => 'Binds a PHP array to an Oracle PL/SQL array parameter', -'oci_bind_by_name' => 'Binds a PHP variable to an Oracle placeholder', -'oci_cancel' => 'Cancels reading from cursor', -'oci_client_version' => 'Returns the Oracle client library version', -'oci_close' => 'Closes an Oracle connection', -'oci_collection::append' => 'Appends element to the collection', -'oci_collection::assign' => 'Assigns a value to the collection from another existing collection', -'oci_collection::assignElem' => 'Assigns a value to the element of the collection', -'oci_collection::free' => 'Frees the resources associated with the collection object', -'oci_collection::getElem' => 'Returns value of the element', -'oci_collection::max' => 'Returns the maximum number of elements in the collection', -'oci_collection::size' => 'Returns size of the collection', -'oci_collection::trim' => 'Trims elements from the end of the collection', -'oci_commit' => 'Commits the outstanding database transaction', -'oci_connect' => 'Connect to an Oracle database', -'oci_define_by_name' => 'Associates a PHP variable with a column for query fetches', -'oci_error' => 'Returns the last error found', -'oci_execute' => 'Executes a statement', -'oci_fetch' => 'Fetches the next row from a query into internal buffers', -'oci_fetch_all' => 'Fetches multiple rows from a query into a two-dimensional array', -'oci_fetch_array' => 'Returns the next row from a query as an associative or numeric array', -'oci_fetch_assoc' => 'Returns the next row from a query as an associative array', -'oci_fetch_object' => 'Returns the next row from a query as an object', -'oci_fetch_row' => 'Returns the next row from a query as a numeric array', -'oci_field_is_null' => 'Checks if a field in the currently fetched row is `null`', -'oci_field_name' => 'Returns the name of a field from the statement', -'oci_field_precision' => 'Tell the precision of a field', -'oci_field_scale' => 'Tell the scale of the field', -'oci_field_size' => 'Returns field\'s size', -'oci_field_type' => 'Returns a field\'s data type name', -'oci_field_type_raw' => 'Tell the raw Oracle data type of the field', -'oci_free_descriptor' => 'Frees a descriptor', -'oci_free_statement' => 'Frees all resources associated with statement or cursor', -'oci_get_implicit_resultset' => 'Returns the next child statement resource from a parent statement resource that has Oracle Database 12c Implicit Result Sets', -'oci_internal_debug' => 'Enables or disables internal debug output', -'oci_lob::append' => 'Appends data from the large object to another large object', -'oci_lob::close' => 'Closes LOB descriptor', -'oci_lob::eof' => 'Tests for end-of-file on a large object\'s descriptor', -'oci_lob::erase' => 'Erases a specified portion of the internal LOB data', -'oci_lob::export' => 'Exports LOB\'s contents to a file', -'oci_lob::flush' => 'Flushes/writes buffer of the LOB to the server', -'oci_lob::free' => 'Frees resources associated with the LOB descriptor', -'oci_lob::getBuffering' => 'Returns current state of buffering for the large object', -'oci_lob::import' => 'Imports file data to the LOB', -'oci_lob::load' => 'Returns large object\'s contents', -'oci_lob::read' => 'Reads part of the large object', -'oci_lob::rewind' => 'Moves the internal pointer to the beginning of the large object', -'oci_lob::save' => 'Saves data to the large object', -'oci_lob::saveFile' => 'Alias of OCI-Lob::import', -'oci_lob::seek' => 'Sets the internal pointer of the large object', -'oci_lob::setBuffering' => 'Changes current state of buffering for the large object', -'oci_lob::size' => 'Returns size of large object', -'oci_lob::tell' => 'Returns the current position of internal pointer of large object', -'oci_lob::truncate' => 'Truncates large object', -'oci_lob::write' => 'Writes data to the large object', -'oci_lob::writeTemporary' => 'Writes a temporary large object', -'oci_lob::writeToFile' => 'Alias of OCI-Lob::export', -'oci_lob_copy' => 'Copies large object', -'oci_lob_is_equal' => 'Compares two LOB/FILE locators for equality', -'oci_new_collection' => 'Allocates new collection object', -'oci_new_connect' => 'Connect to the Oracle server using a unique connection', -'oci_new_cursor' => 'Allocates and returns a new cursor (statement handle)', -'oci_new_descriptor' => 'Initializes a new empty LOB or FILE descriptor', -'oci_num_fields' => 'Returns the number of result columns in a statement', -'oci_num_rows' => 'Returns number of rows affected during statement execution', -'oci_parse' => 'Prepares an Oracle statement for execution', -'oci_password_change' => 'Changes password of Oracle\'s user', -'oci_pconnect' => 'Connect to an Oracle database using a persistent connection', -'oci_register_taf_callback' => 'Register a user-defined callback function for Oracle Database TAF', -'oci_result' => 'Returns field\'s value from the fetched row', -'oci_rollback' => 'Rolls back the outstanding database transaction', -'oci_server_version' => 'Returns the Oracle Database version', -'oci_set_action' => 'Sets the action name', -'oci_set_call_timeout' => 'Sets a millisecond timeout for database calls', -'oci_set_client_identifier' => 'Sets the client identifier', -'oci_set_client_info' => 'Sets the client information', -'oci_set_db_operation' => 'Sets the database operation', -'oci_set_edition' => 'Sets the database edition', -'oci_set_module_name' => 'Sets the module name', -'oci_set_prefetch' => 'Sets number of rows to be prefetched by queries', -'oci_statement_type' => 'Returns the type of a statement', -'oci_unregister_taf_callback' => 'Unregister a user-defined callback function for Oracle Database TAF', -'ocibindbyname' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_bind_by_name}', -'ocicancel' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_cancel}', -'ocicloselob' => '(PHP 4 >= 4.0.6, PECL OCI8 1.0) -Alias of {@see OCI-Lob::close()}', -'ocicollappend' => '(PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -(@see OCI_Collection::append)', -'ocicollassign' => '(PHP 4 >= 4.0.6, PECL OCI8 1.0) -Alias of {@see OCI-Collection::assign()} -Assigns a value to the collection from another existing collection', -'ocicollassignelem' => '(PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see OCI_Collection::assignElem}', -'ocicollgetelem' => '(PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see OCI_COLLection::getElem}', -'ocicollmax' => '(PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see OCI_COLLection::max}', -'ocicollsize' => '(PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see OCI_COLLection::size}', -'ocicolltrim' => '(PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see OCI_Collection::trim}', -'ocicolumnisnull' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_field_is_null}', -'ocicolumnname' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_field_name}', -'ocicolumnprecision' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_field_precision}', -'ocicolumnscale' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_field_scale}', -'ocicolumnsize' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_field_size}', -'ocicolumntype' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_field_type}', -'ocicolumntyperaw' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_field_type_raw}', -'ocicommit' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see oci_commit}', -'ocidefinebyname' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_define_by_name}', -'ocierror' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see oci_error}', -'ociexecute' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_execute}', -'ocifetch' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_fetch}', -'ocifetchstatement' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_fetch_all}', -'ocifreecollection' => '(PHP 4 >= 4.0.7, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see OCI_Collection::free}', -'ocifreecursor' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see oci_free_statement}', -'ocifreedesc' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see OCI-Lob::free}', -'ocifreestatement' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_free_statement}', -'ociinternaldebug' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_internal_debug}', -'ociloadlob' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see OCI_Lob::load}', -'ocilogoff' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_close}', -'ocilogon' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_connect}', -'ocinewcollection' => '(PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see oci_new_collection}', -'ocinewcursor' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_new_cursor}', -'ocinewdescriptor' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see oci_new_descriptor}', -'ocinlogon' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see oci_new_connect}', -'ocinumcols' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_num_fields}', -'ociparse' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_parse}', -'ocipasswordchange' => '(PHP 5, PECL OCI8 >= 1.1.0)<br/> -Changes password of Oracle\'s user', -'ociplogon' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see oci_pconnect}', -'ociresult' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_result}', -'ocirollback' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see oci_rollback}', -'ocirowcount' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_num_rows}', -'ocisavelob' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see OCI-Lob::save}', -'ocisavelobfile' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see OCI_Lob::import}', -'ociserverversion' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_server_version}', -'ocisetprefetch' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_set_prefetch}', -'ocistatementtype' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of {@see oci_statement_type}', -'ociwritelobtofile' => '(PHP 4, PHP 5, PECL OCI8 >= 1.0.0)<br/> -Alias of -{@see OCI_Lob::export}', -'ociwritetemporarylob' => '(PHP 4 >= 4.0.6, PECL OCI8 1.0) -Writes a temporary large object -Alias of {@see OCI-Lob::writeTemporary()}', -'octdec' => 'Octal to decimal', -'odbc_autocommit' => 'Toggle autocommit behaviour', -'odbc_binmode' => 'Handling of binary column data', -'odbc_close' => 'Close an ODBC connection', -'odbc_close_all' => 'Close all ODBC connections', -'odbc_columnprivileges' => 'Lists columns and associated privileges for the given table', -'odbc_columns' => 'Lists the column names in specified tables', -'odbc_commit' => 'Commit an ODBC transaction', -'odbc_connect' => 'Connect to a datasource', -'odbc_cursor' => 'Get cursorname', -'odbc_data_source' => 'Returns information about a current connection', -'odbc_do' => 'Alias of odbc_exec', -'odbc_error' => 'Get the last error code', -'odbc_errormsg' => 'Get the last error message', -'odbc_exec' => 'Prepare and execute an SQL statement', -'odbc_execute' => 'Execute a prepared statement', -'odbc_fetch_array' => 'Fetch a result row as an associative array', -'odbc_fetch_into' => 'Fetch one result row into array', -'odbc_fetch_object' => 'Fetch a result row as an object', -'odbc_fetch_row' => 'Fetch a row', -'odbc_field_len' => 'Get the length (precision) of a field', -'odbc_field_name' => 'Get the columnname', -'odbc_field_num' => 'Return column number', -'odbc_field_precision' => 'Alias of odbc_field_len', -'odbc_field_scale' => 'Get the scale of a field', -'odbc_field_type' => 'Datatype of a field', -'odbc_foreignkeys' => 'Retrieves a list of foreign keys', -'odbc_free_result' => 'Free resources associated with a result', -'odbc_gettypeinfo' => 'Retrieves information about data types supported by the data source', -'odbc_longreadlen' => 'Handling of LONG columns', -'odbc_next_result' => 'Checks if multiple results are available', -'odbc_num_fields' => 'Number of columns in a result', -'odbc_num_rows' => 'Number of rows in a result', -'odbc_pconnect' => 'Open a persistent database connection', -'odbc_prepare' => 'Prepares a statement for execution', -'odbc_primarykeys' => 'Gets the primary keys for a table', -'odbc_procedurecolumns' => 'Retrieve information about parameters to procedures', -'odbc_procedures' => 'Get the list of procedures stored in a specific data source', -'odbc_result' => 'Get result data', -'odbc_result_all' => 'Print result as HTML table', -'odbc_rollback' => 'Rollback a transaction', -'odbc_setoption' => 'Adjust ODBC settings', -'odbc_specialcolumns' => 'Retrieves special columns', -'odbc_statistics' => 'Retrieve statistics about a table', -'odbc_tableprivileges' => 'Lists tables and the privileges associated with each table', -'odbc_tables' => 'Get the list of table names stored in a specific data source', -'opcache_compile_file' => 'Compiles and caches a PHP script without executing it', -'opcache_get_configuration' => 'Get configuration information about the cache', -'opcache_get_status' => 'Get status information about the cache', -'opcache_invalidate' => 'Invalidates a cached script', -'opcache_is_script_cached' => 'Tells whether a script is cached in OPCache', -'opcache_reset' => 'Resets the contents of the opcode cache', -'openal_buffer_create' => 'Generate OpenAL buffer', -'openal_buffer_data' => 'Load a buffer with data', -'openal_buffer_destroy' => 'Destroys an OpenAL buffer', -'openal_buffer_get' => 'Retrieve an OpenAL buffer property', -'openal_buffer_loadwav' => 'Load a .wav file into a buffer', -'openal_context_create' => 'Create an audio processing context', -'openal_context_current' => 'Make the specified context current', -'openal_context_destroy' => 'Destroys a context', -'openal_context_process' => 'Process the specified context', -'openal_context_suspend' => 'Suspend the specified context', -'openal_device_close' => 'Close an OpenAL device', -'openal_device_open' => 'Initialize the OpenAL audio layer', -'openal_listener_get' => 'Retrieve a listener property', -'openal_listener_set' => 'Set a listener property', -'openal_source_create' => 'Generate a source resource', -'openal_source_destroy' => 'Destroy a source resource', -'openal_source_get' => 'Retrieve an OpenAL source property', -'openal_source_pause' => 'Pause the source', -'openal_source_play' => 'Start playing the source', -'openal_source_rewind' => 'Rewind the source', -'openal_source_set' => 'Set source property', -'openal_source_stop' => 'Stop playing the source', -'openal_stream' => 'Begin streaming on a source', -'opendir' => 'Open directory handle', -'openlog' => 'Open connection to system logger', -'openssl_cipher_iv_length' => 'Gets the cipher iv length', -'openssl_csr_export' => 'Exports a CSR as a string', -'openssl_csr_export_to_file' => 'Exports a CSR to a file', -'openssl_csr_get_public_key' => 'Returns the public key of a CSR', -'openssl_csr_get_subject' => 'Returns the subject of a CSR', -'openssl_csr_new' => 'Generates a CSR', -'openssl_csr_sign' => 'Sign a CSR with another certificate (or itself) and generate a certificate', -'openssl_decrypt' => 'Decrypts data', -'openssl_dh_compute_key' => 'Computes shared secret for public value of remote DH public key and local DH key', -'openssl_digest' => 'Computes a digest', -'openssl_encrypt' => 'Encrypts data', -'openssl_error_string' => 'Return openSSL error message', -'openssl_free_key' => 'Free key resource', -'openssl_get_cert_locations' => 'Retrieve the available certificate locations', -'openssl_get_cipher_methods' => 'Gets available cipher methods', -'openssl_get_curve_names' => 'Gets list of available curve names for ECC', -'openssl_get_md_methods' => 'Gets available digest methods', -'openssl_get_privatekey' => 'Alias of openssl_pkey_get_private', -'openssl_get_publickey' => 'Alias of openssl_pkey_get_public', -'openssl_open' => 'Open sealed data', -'openssl_pbkdf2' => 'Generates a PKCS5 v2 PBKDF2 string', -'openssl_pkcs12_export' => 'Exports a PKCS#12 Compatible Certificate Store File to variable', -'openssl_pkcs12_export_to_file' => 'Exports a PKCS#12 Compatible Certificate Store File', -'openssl_pkcs12_read' => 'Parse a PKCS#12 Certificate Store into an array', -'openssl_pkcs7_decrypt' => 'Decrypts an S/MIME encrypted message', -'openssl_pkcs7_encrypt' => 'Encrypt an S/MIME message', -'openssl_pkcs7_read' => 'Export the PKCS7 file to an array of PEM certificates', -'openssl_pkcs7_sign' => 'Sign an S/MIME message', -'openssl_pkcs7_verify' => 'Verifies the signature of an S/MIME signed message', -'openssl_pkey_export' => 'Gets an exportable representation of a key into a string', -'openssl_pkey_export_to_file' => 'Gets an exportable representation of a key into a file', -'openssl_pkey_free' => 'Frees a private key', -'openssl_pkey_get_details' => 'Returns an array with the key details', -'openssl_pkey_get_private' => 'Get a private key', -'openssl_pkey_get_public' => 'Extract public key from certificate and prepare it for use', -'openssl_pkey_new' => 'Generates a new private key', -'openssl_private_decrypt' => 'Decrypts data with private key', -'openssl_private_encrypt' => 'Encrypts data with private key', -'openssl_public_decrypt' => 'Decrypts data with public key', -'openssl_public_encrypt' => 'Encrypts data with public key', -'openssl_random_pseudo_bytes' => 'Generate a pseudo-random string of bytes', -'openssl_seal' => 'Seal (encrypt) data', -'openssl_sign' => 'Generate signature', -'openssl_spki_export' => 'Exports a valid PEM formatted public key signed public key and challenge', -'openssl_spki_export_challenge' => 'Exports the challenge associated with a signed public key and challenge', -'openssl_spki_new' => 'Generate a new signed public key and challenge', -'openssl_spki_verify' => 'Verifies a signed public key and challenge', -'openssl_verify' => 'Verify signature', -'openssl_x509_check_private_key' => 'Checks if a private key corresponds to a certificate', -'openssl_x509_checkpurpose' => 'Verifies if a certificate can be used for a particular purpose', -'openssl_x509_export' => 'Exports a certificate as a string', -'openssl_x509_export_to_file' => 'Exports a certificate to file', -'openssl_x509_fingerprint' => 'Calculates the fingerprint, or digest, of a given X.509 certificate', -'openssl_x509_free' => 'Free certificate resource', -'openssl_x509_parse' => 'Parse an X509 certificate and return the information as an array', -'openssl_x509_read' => 'Parse an X.509 certificate and return a resource identifier for it', -'ord' => 'Convert the first byte of a string to a value between 0 and 255', -'OuterIterator::current' => 'Return the current element', -'outeriterator::getInnerIterator' => 'Returns the inner iterator for the current entry', -'OuterIterator::key' => 'Return the key of the current element', -'OuterIterator::next' => 'Move forward to next element', -'OuterIterator::rewind' => 'Rewind the Iterator to the first element', -'OuterIterator::valid' => 'Checks if current position is valid', -'output_add_rewrite_var' => 'Add URL rewriter values', -'output_reset_rewrite_vars' => 'Reset URL rewriter values', -'outputformatObj::getOption' => 'Returns the associated value for the format option property passed -as argument. Returns an empty string if property not found.', -'outputformatObj::set' => 'Set object property to a new value.', -'outputformatObj::setOption' => 'Add or Modify the format option list. return true on success. -.. code-block:: php -$oMap->outputformat->setOption("OUTPUT_TYPE", "RASTER");', -'outputformatObj::validate' => 'Checks some internal consistency issues, Returns MS_SUCCESS or -MS_FAILURE. Some problems are fixed up internally. May produce debug -output if issues encountered.', -'override_function' => 'Overrides built-in functions', -'OwsrequestObj::__construct' => 'request = ms_newOwsrequestObj(); -Create a new ows request object.', -'OwsrequestObj::addParameter' => 'Add a request parameter, even if the parameter key was previousely set. -This is useful when multiple parameters with the same key are required. -For example : -.. code-block:: php -$request->addparameter(\'SIZE\', \'x(100)\'); -$request->addparameter(\'SIZE\', \'y(100)\');', -'OwsrequestObj::getName' => 'Return the name of the parameter at *index* in the request\'s array -of parameter names.', -'OwsrequestObj::getValue' => 'Return the value of the parameter at *index* in the request\'s array -of parameter values.', -'OwsrequestObj::getValueByName' => 'Return the value associated with the parameter *name*.', -'OwsrequestObj::loadParams' => 'Initializes the OWSRequest object from the cgi environment variables -REQUEST_METHOD, QUERY_STRING and HTTP_COOKIE. Returns the number of -name/value pairs collected.', -'OwsrequestObj::setParameter' => 'Set a request parameter. For example : -.. code-block:: php -$request->setparameter(\'REQUEST\', \'GetMap\');', -'pack' => 'Pack data into binary string', -'parallel\future::done' => 'State Detection', -'parallel\future::select' => 'Resolution', -'parallel\future::value' => 'Resolution', -'parallel\runtime::__construct' => 'Runtime Construction', -'parallel\runtime::close' => 'Runtime Graceful Join', -'parallel\runtime::kill' => 'Runtime Join', -'parallel\runtime::run' => 'Parallel Execution', -'parentiterator::__construct' => 'Constructs a ParentIterator', -'parentiterator::accept' => 'Determines acceptability', -'ParentIterator::current' => 'Get the current element value', -'parentiterator::getChildren' => 'Return the inner iterator\'s children contained in a ParentIterator', -'ParentIterator::getInnerIterator' => 'Get the inner iterator', -'parentiterator::hasChildren' => 'Check whether the inner iterator\'s current element has children', -'ParentIterator::key' => 'Get the current key', -'parentiterator::next' => 'Move the iterator forward', -'parentiterator::rewind' => 'Rewind the iterator', -'ParentIterator::valid' => 'Check whether the current element is valid', -'parle\lexer::advance' => 'Process next lexer rule', -'parle\lexer::build' => 'Finalize the lexer rule set', -'parle\lexer::callout' => 'Define token callback', -'parle\lexer::consume' => 'Pass the data for processing', -'parle\lexer::dump' => 'Dump the state machine', -'parle\lexer::getToken' => 'Retrieve the current token', -'parle\lexer::insertMacro' => 'Insert regex macro', -'parle\lexer::push' => 'Add a lexer rule', -'parle\lexer::reset' => 'Reset lexer', -'parle\parser::advance' => 'Process next parser rule', -'parle\parser::build' => 'Finalize the grammar rules', -'parle\parser::consume' => 'Consume the data for processing', -'parle\parser::dump' => 'Dump the grammar', -'parle\parser::errorInfo' => 'Retrieve the error information', -'parle\parser::left' => 'Declare a token with left-associativity', -'parle\parser::nonassoc' => 'Declare a token with no associativity', -'parle\parser::precedence' => 'Declare a precedence rule', -'parle\parser::push' => 'Add a grammar rule', -'parle\parser::reset' => 'Reset parser state', -'parle\parser::right' => 'Declare a token with right-associativity', -'parle\parser::sigil' => 'Retrieve a matching part of a rule', -'parle\parser::token' => 'Declare a token', -'parle\parser::tokenId' => 'Get token id', -'parle\parser::trace' => 'Trace the parser operation', -'parle\parser::validate' => 'Validate input', -'parle\rlexer::advance' => 'Process next lexer rule', -'parle\rlexer::build' => 'Finalize the lexer rule set', -'parle\rlexer::callout' => 'Define token callback', -'parle\rlexer::consume' => 'Pass the data for processing', -'parle\rlexer::dump' => 'Dump the state machine', -'parle\rlexer::getToken' => 'Retrieve the current token', -'parle\rlexer::insertMacro' => 'Insert regex macro', -'parle\rlexer::push' => 'Add a lexer rule', -'parle\rlexer::pushState' => 'Push a new start state', -'parle\rlexer::reset' => 'Reset lexer', -'parle\rparser::advance' => 'Process next parser rule', -'parle\rparser::build' => 'Finalize the grammar rules', -'parle\rparser::consume' => 'Consume the data for processing', -'parle\rparser::dump' => 'Dump the grammar', -'parle\rparser::errorInfo' => 'Retrieve the error information', -'parle\rparser::left' => 'Declare a token with left-associativity', -'parle\rparser::nonassoc' => 'Declare a token with no associativity', -'parle\rparser::precedence' => 'Declare a precedence rule', -'parle\rparser::push' => 'Add a grammar rule', -'parle\rparser::reset' => 'Reset parser state', -'parle\rparser::right' => 'Declare a token with right-associativity', -'parle\rparser::sigil' => 'Retrieve a matching part of a rule', -'parle\rparser::token' => 'Declare a token', -'parle\rparser::tokenId' => 'Get token id', -'parle\rparser::trace' => 'Trace the parser operation', -'parle\rparser::validate' => 'Validate input', -'parle\stack::pop' => 'Pop an item from the stack', -'parle\stack::push' => 'Push an item into the stack', -'parse_ini_file' => 'Parse a configuration file', -'parse_ini_string' => 'Parse a configuration string', -'parse_str' => 'Parses the string into variables', -'parse_url' => 'Parse a URL and return its components', -'parsekit_compile_file' => 'Compile a PHP file and return the resulting op array', -'parsekit_compile_string' => 'Compile a string of PHP code and return the resulting op array', -'parsekit_func_arginfo' => 'Return information regarding function argument(s)', -'passthru' => 'Execute an external program and display raw output', -'password_get_info' => 'Returns information about the given hash', -'password_hash' => 'Creates a password hash', -'password_needs_rehash' => 'Checks if the given hash matches the given options', -'password_verify' => 'Verifies that a password matches a hash', -'pathinfo' => 'Returns information about a file path', -'pclose' => 'Closes process file pointer', -'pcntl_alarm' => 'Set an alarm clock for delivery of a signal', -'pcntl_async_signals' => 'Enable/disable asynchronous signal handling or return the old setting', -'pcntl_errno' => 'Alias of pcntl_get_last_error', -'pcntl_exec' => 'Executes specified program in current process space', -'pcntl_fork' => 'Forks the currently running process', -'pcntl_get_last_error' => 'Retrieve the error number set by the last pcntl function which failed', -'pcntl_getpriority' => 'Get the priority of any process', -'pcntl_setpriority' => 'Change the priority of any process', -'pcntl_signal' => 'Installs a signal handler', -'pcntl_signal_dispatch' => 'Calls signal handlers for pending signals', -'pcntl_signal_get_handler' => 'Get the current handler for specified signal', -'pcntl_sigprocmask' => 'Sets and retrieves blocked signals', -'pcntl_sigtimedwait' => 'Waits for signals, with a timeout', -'pcntl_sigwaitinfo' => 'Waits for signals', -'pcntl_strerror' => 'Retrieve the system error message associated with the given errno', -'pcntl_wait' => 'Waits on or returns the status of a forked child', -'pcntl_waitpid' => 'Waits on or returns the status of a forked child', -'pcntl_wexitstatus' => 'Returns the return code of a terminated child', -'pcntl_wifexited' => 'Checks if status code represents a normal exit', -'pcntl_wifsignaled' => 'Checks whether the status code represents a termination due to a signal', -'pcntl_wifstopped' => 'Checks whether the child process is currently stopped', -'pcntl_wstopsig' => 'Returns the signal which caused the child to stop', -'pcntl_wtermsig' => 'Returns the signal which caused the child to terminate', -'pdf_activate_item' => 'Activate structure element or other content item', -'pdf_add_annotation' => 'Add annotation [deprecated]', -'pdf_add_bookmark' => 'Add bookmark for current page [deprecated]', -'pdf_add_launchlink' => 'Add launch annotation for current page [deprecated]', -'pdf_add_locallink' => 'Add link annotation for current page [deprecated]', -'pdf_add_nameddest' => 'Create named destination', -'pdf_add_note' => 'Set annotation for current page [deprecated]', -'pdf_add_outline' => 'Add bookmark for current page [deprecated]', -'pdf_add_pdflink' => 'Add file link annotation for current page [deprecated]', -'pdf_add_table_cell' => 'Add a cell to a new or existing table', -'pdf_add_textflow' => 'Create Textflow or add text to existing Textflow', -'pdf_add_thumbnail' => 'Add thumbnail for current page', -'pdf_add_weblink' => 'Add weblink for current page [deprecated]', -'pdf_arc' => 'Draw a counterclockwise circular arc segment', -'pdf_arcn' => 'Draw a clockwise circular arc segment', -'pdf_attach_file' => 'Add file attachment for current page [deprecated]', -'pdf_begin_document' => 'Create new PDF file', -'pdf_begin_font' => 'Start a Type 3 font definition', -'pdf_begin_glyph' => 'Start glyph definition for Type 3 font', -'pdf_begin_item' => 'Open structure element or other content item', -'pdf_begin_layer' => 'Start layer', -'pdf_begin_page' => 'Start new page [deprecated]', -'pdf_begin_page_ext' => 'Start new page', -'pdf_begin_pattern' => 'Start pattern definition', -'pdf_begin_template' => 'Start template definition [deprecated]', -'pdf_begin_template_ext' => 'Start template definition', -'pdf_circle' => 'Draw a circle', -'pdf_clip' => 'Clip to current path', -'pdf_close' => 'Close pdf resource [deprecated]', -'pdf_close_image' => 'Close image', -'pdf_close_pdi' => 'Close the input PDF document [deprecated]', -'pdf_close_pdi_page' => 'Close the page handle', -'pdf_closepath' => 'Close current path', -'pdf_closepath_fill_stroke' => 'Close, fill and stroke current path', -'pdf_closepath_stroke' => 'Close and stroke path', -'pdf_concat' => 'Concatenate a matrix to the CTM', -'pdf_continue_text' => 'Output text in next line', -'pdf_create_3dview' => 'Create 3D view', -'pdf_create_action' => 'Create action for objects or events', -'pdf_create_annotation' => 'Create rectangular annotation', -'pdf_create_bookmark' => 'Create bookmark', -'pdf_create_field' => 'Create form field', -'pdf_create_fieldgroup' => 'Create form field group', -'pdf_create_gstate' => 'Create graphics state object', -'pdf_create_pvf' => 'Create PDFlib virtual file', -'pdf_create_textflow' => 'Create textflow object', -'pdf_curveto' => 'Draw Bezier curve', -'pdf_define_layer' => 'Create layer definition', -'pdf_delete' => 'Delete PDFlib object', -'pdf_delete_pvf' => 'Delete PDFlib virtual file', -'pdf_delete_table' => 'Delete table object', -'pdf_delete_textflow' => 'Delete textflow object', -'pdf_encoding_set_char' => 'Add glyph name and/or Unicode value', -'pdf_end_document' => 'Close PDF file', -'pdf_end_font' => 'Terminate Type 3 font definition', -'pdf_end_glyph' => 'Terminate glyph definition for Type 3 font', -'pdf_end_item' => 'Close structure element or other content item', -'pdf_end_layer' => 'Deactivate all active layers', -'pdf_end_page' => 'Finish page', -'pdf_end_page_ext' => 'Finish page', -'pdf_end_pattern' => 'Finish pattern', -'pdf_end_template' => 'Finish template', -'pdf_endpath' => 'End current path', -'pdf_fill' => 'Fill current path', -'pdf_fill_imageblock' => 'Fill image block with variable data', -'pdf_fill_pdfblock' => 'Fill PDF block with variable data', -'pdf_fill_stroke' => 'Fill and stroke path', -'pdf_fill_textblock' => 'Fill text block with variable data', -'pdf_findfont' => 'Prepare font for later use [deprecated]', -'pdf_fit_image' => 'Place image or template', -'pdf_fit_pdi_page' => 'Place imported PDF page', -'pdf_fit_table' => 'Place table on page', -'pdf_fit_textflow' => 'Format textflow in rectangular area', -'pdf_fit_textline' => 'Place single line of text', -'pdf_get_apiname' => 'Get name of unsuccessful API function', -'pdf_get_buffer' => 'Get PDF output buffer', -'pdf_get_errmsg' => 'Get error text', -'pdf_get_errnum' => 'Get error number', -'pdf_get_font' => 'Get font [deprecated]', -'pdf_get_fontname' => 'Get font name [deprecated]', -'pdf_get_fontsize' => 'Font handling [deprecated]', -'pdf_get_image_height' => 'Get image height [deprecated]', -'pdf_get_image_width' => 'Get image width [deprecated]', -'pdf_get_majorversion' => 'Get major version number [deprecated]', -'pdf_get_minorversion' => 'Get minor version number [deprecated]', -'pdf_get_parameter' => 'Get string parameter', -'pdf_get_pdi_parameter' => 'Get PDI string parameter [deprecated]', -'pdf_get_pdi_value' => 'Get PDI numerical parameter [deprecated]', -'pdf_get_value' => 'Get numerical parameter', -'pdf_info_font' => 'Query detailed information about a loaded font', -'pdf_info_matchbox' => 'Query matchbox information', -'pdf_info_table' => 'Retrieve table information', -'pdf_info_textflow' => 'Query textflow state', -'pdf_info_textline' => 'Perform textline formatting and query metrics', -'pdf_initgraphics' => 'Reset graphic state', -'pdf_lineto' => 'Draw a line', -'pdf_load_3ddata' => 'Load 3D model', -'pdf_load_font' => 'Search and prepare font', -'pdf_load_iccprofile' => 'Search and prepare ICC profile', -'pdf_load_image' => 'Open image file', -'pdf_makespotcolor' => 'Make spot color', -'pdf_moveto' => 'Set current point', -'pdf_new' => 'Create PDFlib object', -'pdf_open_ccitt' => 'Open raw CCITT image [deprecated]', -'pdf_open_file' => 'Create PDF file [deprecated]', -'pdf_open_gif' => 'Open GIF image [deprecated]', -'pdf_open_image' => 'Use image data [deprecated]', -'pdf_open_image_file' => 'Read image from file [deprecated]', -'pdf_open_jpeg' => 'Open JPEG image [deprecated]', -'pdf_open_memory_image' => 'Open image created with PHP\'s image functions [not supported]', -'pdf_open_pdi' => 'Open PDF file [deprecated]', -'pdf_open_pdi_document' => 'Prepare a pdi document', -'pdf_open_pdi_page' => 'Prepare a page', -'pdf_open_tiff' => 'Open TIFF image [deprecated]', -'pdf_pcos_get_number' => 'Get value of pCOS path with type number or boolean', -'pdf_pcos_get_stream' => 'Get contents of pCOS path with type stream, fstream, or string', -'pdf_pcos_get_string' => 'Get value of pCOS path with type name, string, or boolean', -'pdf_place_image' => 'Place image on the page [deprecated]', -'pdf_place_pdi_page' => 'Place PDF page [deprecated]', -'pdf_process_pdi' => 'Process imported PDF document', -'pdf_rect' => 'Draw rectangle', -'pdf_restore' => 'Restore graphics state', -'pdf_resume_page' => 'Resume page', -'pdf_rotate' => 'Rotate coordinate system', -'pdf_save' => 'Save graphics state', -'pdf_scale' => 'Scale coordinate system', -'pdf_set_border_color' => 'Set border color of annotations [deprecated]', -'pdf_set_border_dash' => 'Set border dash style of annotations [deprecated]', -'pdf_set_border_style' => 'Set border style of annotations [deprecated]', -'pdf_set_char_spacing' => 'Set character spacing [deprecated]', -'pdf_set_duration' => 'Set duration between pages [deprecated]', -'pdf_set_gstate' => 'Activate graphics state object', -'pdf_set_horiz_scaling' => 'Set horizontal text scaling [deprecated]', -'pdf_set_info' => 'Fill document info field', -'pdf_set_info_author' => 'Fill the author document info field [deprecated]', -'pdf_set_info_creator' => 'Fill the creator document info field [deprecated]', -'pdf_set_info_keywords' => 'Fill the keywords document info field [deprecated]', -'pdf_set_info_subject' => 'Fill the subject document info field [deprecated]', -'pdf_set_info_title' => 'Fill the title document info field [deprecated]', -'pdf_set_layer_dependency' => 'Define relationships among layers', -'pdf_set_leading' => 'Set distance between text lines [deprecated]', -'pdf_set_parameter' => 'Set string parameter', -'pdf_set_text_matrix' => 'Set text matrix [deprecated]', -'pdf_set_text_pos' => 'Set text position', -'pdf_set_text_rendering' => 'Determine text rendering [deprecated]', -'pdf_set_text_rise' => 'Set text rise [deprecated]', -'pdf_set_value' => 'Set numerical parameter', -'pdf_set_word_spacing' => 'Set spacing between words [deprecated]', -'pdf_setcolor' => 'Set fill and stroke color', -'pdf_setdash' => 'Set simple dash pattern', -'pdf_setdashpattern' => 'Set dash pattern', -'pdf_setflat' => 'Set flatness', -'pdf_setfont' => 'Set font', -'pdf_setgray' => 'Set color to gray [deprecated]', -'pdf_setgray_fill' => 'Set fill color to gray [deprecated]', -'pdf_setgray_stroke' => 'Set stroke color to gray [deprecated]', -'pdf_setlinecap' => 'Set linecap parameter', -'pdf_setlinejoin' => 'Set linejoin parameter', -'pdf_setlinewidth' => 'Set line width', -'pdf_setmatrix' => 'Set current transformation matrix', -'pdf_setmiterlimit' => 'Set miter limit', -'pdf_setpolydash' => 'Set complicated dash pattern [deprecated]', -'pdf_setrgbcolor' => 'Set fill and stroke rgb color values [deprecated]', -'pdf_setrgbcolor_fill' => 'Set fill rgb color values [deprecated]', -'pdf_setrgbcolor_stroke' => 'Set stroke rgb color values [deprecated]', -'pdf_shading' => 'Define blend', -'pdf_shading_pattern' => 'Define shading pattern', -'pdf_shfill' => 'Fill area with shading', -'pdf_show' => 'Output text at current position', -'pdf_show_boxed' => 'Output text in a box [deprecated]', -'pdf_show_xy' => 'Output text at given position', -'pdf_skew' => 'Skew the coordinate system', -'pdf_stringwidth' => 'Return width of text', -'pdf_stroke' => 'Stroke path', -'pdf_suspend_page' => 'Suspend page', -'pdf_translate' => 'Set origin of coordinate system', -'pdf_utf16_to_utf8' => 'Convert string from UTF-16 to UTF-8', -'pdf_utf32_to_utf16' => 'Convert string from UTF-32 to UTF-16', -'pdf_utf8_to_utf16' => 'Convert string from UTF-8 to UTF-16', -'PDFlib::activate_item' => 'Activates a previously created structure element or other content item.', -'PDFlib::add_launchlink' => 'Adds a link to a web resource.', -'PDFlib::add_locallink' => 'Add a link annotation to a target within the current PDF file.', -'PDFlib::add_nameddest' => 'Creates a named destination on an arbitrary page in the current document.', -'PDFlib::add_note' => 'Sets an annotation for the current page.', -'PDFlib::add_pdflink' => 'Add a file link annotation to a PDF target.', -'PDFlib::add_table_cell' => 'Adds a cell to a new or existing table.', -'PDFlib::add_textflow' => 'Creates a Textflow object, or adds text and explicit options to an existing Textflow.', -'PDFlib::add_thumbnail' => 'Adds an existing image as thumbnail for the current page.', -'PDFlib::add_weblink' => 'Adds a weblink annotation to a target url on the Web.', -'PDFlib::arc' => 'Adds a counterclockwise circular arc', -'PDFlib::arcn' => 'Except for the drawing direction, this function behaves exactly like PDF_arc().', -'PDFlib::attach_file' => 'Adds a file attachment annotation.', -'PDFlib::begin_document' => 'Creates a new PDF file subject to various options.', -'PDFlib::begin_font' => 'Starts a Type 3 font definition.', -'PDFlib::begin_glyph' => 'Starts a glyph definition for a Type 3 font.', -'PDFlib::begin_item' => 'Opens a structure element or other content item with attributes supplied as options.', -'PDFlib::begin_layer' => 'Starts a layer for subsequent output on the page.', -'PDFlib::begin_page' => 'Adds a new page to the document.', -'PDFlib::begin_page_ext' => 'Adds a new page to the document, and specifies various options. The parameters width and height are the dimensions of the new page in points.', -'PDFlib::begin_pattern' => 'Starts a new pattern definition.', -'PDFlib::begin_template_ext' => 'Starts a new template definition.', -'PDFlib::close_pdi_page' => 'Closes the page handle, and frees all page-related resources', -'PDO::__construct' => 'Creates a PDO instance representing a connection to a database', -'PDO::beginTransaction' => 'Initiates a transaction -<p> -Turns off autocommit mode. While autocommit mode is turned off, -changes made to the database via the PDO object instance are not committed -until you end the transaction by calling {@link PDO::commit()}. -Calling {@link PDO::rollBack()} will roll back all changes to the database and -return the connection to autocommit mode. -</p> -<p> -Some databases, including MySQL, automatically issue an implicit COMMIT -when a database definition language (DDL) statement -such as DROP TABLE or CREATE TABLE is issued within a transaction. -The implicit COMMIT will prevent you from rolling back any other changes -within the transaction boundary. -</p>', -'PDO::commit' => 'Commits a transaction', -'PDO::errorCode' => 'Fetch the SQLSTATE associated with the last operation on the database handle', -'PDO::errorInfo' => 'Fetch extended error information associated with the last operation on the database handle', -'PDO::exec' => 'Execute an SQL statement and return the number of affected rows', -'PDO::getAttribute' => 'Retrieve a database connection attribute', -'PDO::getAvailableDrivers' => 'Return an array of available PDO drivers', -'PDO::inTransaction' => 'Checks if inside a transaction', -'PDO::lastInsertId' => 'Returns the ID of the last inserted row or sequence value', -'PDO::prepare' => 'Prepares a statement for execution and returns a statement object', -'PDO::query' => 'Executes an SQL statement, returning a result set as a PDOStatement object', -'PDO::quote' => 'Quotes a string for use in a query.', -'PDO::rollBack' => 'Rolls back a transaction', -'PDO::setAttribute' => 'Set an attribute', -'PDO::sqliteCreateFunction' => 'Registers a User Defined Function for use in SQL statements', -'pdostatement::bindColumn' => 'Bind a column to a PHP variable', -'pdostatement::bindParam' => 'Binds a parameter to the specified variable name', -'pdostatement::bindValue' => 'Binds a value to a parameter', -'pdostatement::closeCursor' => 'Closes the cursor, enabling the statement to be executed again', -'pdostatement::columnCount' => 'Returns the number of columns in the result set', -'pdostatement::debugDumpParams' => 'Dump an SQL prepared command', -'pdostatement::errorCode' => 'Fetch the SQLSTATE associated with the last operation on the statement handle', -'pdostatement::errorInfo' => 'Fetch extended error information associated with the last operation on the statement handle', -'pdostatement::execute' => 'Executes a prepared statement', -'pdostatement::fetch' => 'Fetches the next row from a result set', -'pdostatement::fetchAll' => 'Returns an array containing all of the result set rows', -'pdostatement::fetchColumn' => 'Returns a single column from the next row of a result set', -'pdostatement::fetchObject' => 'Fetches the next row and returns it as an object', -'pdostatement::getAttribute' => 'Retrieve a statement attribute', -'pdostatement::getColumnMeta' => 'Returns metadata for a column in a result set', -'pdostatement::nextRowset' => 'Advances to the next rowset in a multi-rowset statement handle', -'pdostatement::rowCount' => 'Returns the number of rows affected by the last SQL statement', -'pdostatement::setAttribute' => 'Set a statement attribute', -'pdostatement::setFetchMode' => 'Set the default fetch mode for this statement', -'pfsockopen' => 'Open persistent Internet or Unix domain socket connection', -'pg_affected_rows' => 'Returns number of affected records (tuples)', -'pg_cancel_query' => 'Cancel an asynchronous query', -'pg_client_encoding' => 'Gets the client encoding', -'pg_close' => 'Closes a PostgreSQL connection', -'pg_connect' => 'Open a PostgreSQL connection', -'pg_connect_poll' => 'Poll the status of an in-progress asynchronous PostgreSQL connection attempt', -'pg_connection_busy' => 'Get connection is busy or not', -'pg_connection_reset' => 'Reset connection (reconnect)', -'pg_connection_status' => 'Get connection status', -'pg_consume_input' => 'Reads input on the connection', -'pg_convert' => 'Convert associative array values into forms suitable for SQL statements', -'pg_copy_from' => 'Insert records into a table from an array', -'pg_copy_to' => 'Copy a table to an array', -'pg_dbname' => 'Get the database name', -'pg_delete' => 'Deletes records', -'pg_end_copy' => 'Sync with PostgreSQL backend', -'pg_escape_bytea' => 'Escape a string for insertion into a bytea field', -'pg_escape_identifier' => 'Escape a identifier for insertion into a text field', -'pg_escape_literal' => 'Escape a literal for insertion into a text field', -'pg_escape_string' => 'Escape a string for query', -'pg_execute' => 'Sends a request to execute a prepared statement with given parameters, and waits for the result', -'pg_fetch_all' => 'Fetches all rows from a result as an array', -'pg_fetch_all_columns' => 'Fetches all rows in a particular result column as an array', -'pg_fetch_array' => 'Fetch a row as an array', -'pg_fetch_assoc' => 'Fetch a row as an associative array', -'pg_fetch_object' => 'Fetch a row as an object', -'pg_fetch_result' => 'Returns values from a result resource', -'pg_fetch_row' => 'Get a row as an enumerated array', -'pg_field_is_null' => 'Test if a field is SQL NULL', -'pg_field_name' => 'Returns the name of a field', -'pg_field_num' => 'Returns the field number of the named field', -'pg_field_prtlen' => 'Returns the printed length', -'pg_field_size' => 'Returns the internal storage size of the named field', -'pg_field_table' => 'Returns the name or oid of the tables field', -'pg_field_type' => 'Returns the type name for the corresponding field number', -'pg_field_type_oid' => 'Returns the type ID (OID) for the corresponding field number', -'pg_flush' => 'Flush outbound query data on the connection', -'pg_free_result' => 'Free result memory', -'pg_get_notify' => 'Gets SQL NOTIFY message', -'pg_get_pid' => 'Gets the backend\'s process ID', -'pg_get_result' => 'Get asynchronous query result', -'pg_host' => 'Returns the host name associated with the connection', -'pg_insert' => 'Insert array into table', -'pg_last_error' => 'Get the last error message string of a connection', -'pg_last_notice' => 'Returns the last notice message from PostgreSQL server', -'pg_last_oid' => 'Returns the last row\'s OID', -'pg_lo_close' => 'Close a large object', -'pg_lo_create' => 'Create a large object', -'pg_lo_export' => 'Export a large object to file', -'pg_lo_import' => 'Import a large object from file', -'pg_lo_open' => 'Open a large object', -'pg_lo_read' => 'Read a large object', -'pg_lo_read_all' => 'Reads an entire large object and send straight to browser', -'pg_lo_seek' => 'Seeks position within a large object', -'pg_lo_tell' => 'Returns current seek position a of large object', -'pg_lo_truncate' => 'Truncates a large object', -'pg_lo_unlink' => 'Delete a large object', -'pg_lo_write' => 'Write to a large object', -'pg_meta_data' => 'Get meta data for table', -'pg_num_fields' => 'Returns the number of fields in a result', -'pg_num_rows' => 'Returns the number of rows in a result', -'pg_options' => 'Get the options associated with the connection', -'pg_parameter_status' => 'Looks up a current parameter setting of the server', -'pg_pconnect' => 'Open a persistent PostgreSQL connection', -'pg_ping' => 'Ping database connection', -'pg_port' => 'Return the port number associated with the connection', -'pg_prepare' => 'Submits a request to create a prepared statement with the given parameters, and waits for completion', -'pg_put_line' => 'Send a NULL-terminated string to PostgreSQL backend', -'pg_query' => 'Execute a query', -'pg_query_params' => 'Submits a command to the server and waits for the result, with the ability to pass parameters separately from the SQL command text', -'pg_result_error' => 'Get error message associated with result', -'pg_result_error_field' => 'Returns an individual field of an error report', -'pg_result_seek' => 'Set internal row offset in result resource', -'pg_result_status' => 'Get status of query result', -'pg_select' => 'Select records', -'pg_send_execute' => 'Sends a request to execute a prepared statement with given parameters, without waiting for the result(s)', -'pg_send_prepare' => 'Sends a request to create a prepared statement with the given parameters, without waiting for completion', -'pg_send_query' => 'Sends asynchronous query', -'pg_send_query_params' => 'Submits a command and separate parameters to the server without waiting for the result(s)', -'pg_set_client_encoding' => 'Set the client encoding', -'pg_set_error_verbosity' => 'Determines the verbosity of messages returned by pg_last_error and pg_result_error', -'pg_socket' => 'Get a read only handle to the socket underlying a PostgreSQL connection', -'pg_trace' => 'Enable tracing a PostgreSQL connection', -'pg_transaction_status' => 'Returns the current in-transaction status of the server', -'pg_tty' => 'Return the TTY name associated with the connection', -'pg_unescape_bytea' => 'Unescape binary for bytea type', -'pg_untrace' => 'Disable tracing of a PostgreSQL connection', -'pg_update' => 'Update table', -'pg_version' => 'Returns an array with client, protocol and server version (when available)', -'phar::__construct' => 'Construct a Phar archive object', -'phar::addEmptyDir' => 'Add an empty directory to the phar archive', -'phar::addFile' => 'Add a file from the filesystem to the phar archive', -'phar::addFromString' => 'Add a file from a string to the phar archive', -'phar::apiVersion' => 'Returns the api version', -'phar::buildFromDirectory' => 'Construct a phar archive from the files within a directory', -'phar::buildFromIterator' => 'Construct a phar archive from an iterator', -'phar::canCompress' => 'Returns whether phar extension supports compression using either zlib or bzip2', -'phar::canWrite' => 'Returns whether phar extension supports writing and creating phars', -'phar::compress' => 'Compresses the entire Phar archive using Gzip or Bzip2 compression', -'phar::compressAllFilesBZIP2' => 'Compresses all files in the current Phar archive using Bzip2 compression', -'phar::compressAllFilesGZ' => 'Compresses all files in the current Phar archive using Gzip compression', -'phar::compressFiles' => 'Compresses all files in the current Phar archive', -'phar::convertToData' => 'Convert a phar archive to a non-executable tar or zip file', -'phar::convertToExecutable' => 'Convert a phar archive to another executable phar archive file format', -'phar::copy' => 'Copy a file internal to the phar archive to another new file within the phar', -'phar::count' => 'Returns the number of entries (files) in the Phar archive', -'phar::createDefaultStub' => 'Create a phar-file format specific stub', -'Phar::current' => 'The current file', -'phar::decompress' => 'Decompresses the entire Phar archive', -'phar::decompressFiles' => 'Decompresses all files in the current Phar archive', -'phar::delete' => 'Delete a file within a phar archive', -'phar::delMetadata' => 'Deletes the global metadata of the phar', -'phar::extractTo' => 'Extract the contents of a phar archive to a directory', -'phar::getAlias' => 'Get the alias for Phar', -'Phar::getChildren' => 'Returns an iterator for the current entry if it is a directory', -'Phar::getFlags' => 'Get the handling flags', -'phar::getMetadata' => 'Returns phar archive meta-data', -'phar::getModified' => 'Return whether phar was modified', -'phar::getPath' => 'Get the real path to the Phar archive on disk', -'phar::getSignature' => 'Return MD5/SHA1/SHA256/SHA512/OpenSSL signature of a Phar archive', -'phar::getStub' => 'Return the PHP loader or bootstrap stub of a Phar archive', -'Phar::getSubPath' => 'Get sub path', -'Phar::getSubPathname' => 'Get sub path and name', -'phar::getSupportedCompression' => 'Return array of supported compression algorithms', -'phar::getSupportedSignatures' => 'Return array of supported signature types', -'phar::getVersion' => 'Return version info of Phar archive', -'Phar::hasChildren' => 'Returns whether current entry is a directory and not \'.\' or \'..\'', -'phar::hasMetadata' => 'Returns whether phar has global meta-data', -'phar::interceptFileFuncs' => 'Instructs phar to intercept fopen, file_get_contents, opendir, and all of the stat-related functions', -'phar::isBuffering' => 'Used to determine whether Phar write operations are being buffered, or are flushing directly to disk', -'phar::isCompressed' => 'Returns Phar::GZ or PHAR::BZ2 if the entire phar archive is compressed (.tar.gz/tar.bz and so on)', -'phar::isFileFormat' => 'Returns true if the phar archive is based on the tar/phar/zip file format depending on the parameter', -'phar::isValidPharFilename' => 'Returns whether the given filename is a valid phar filename', -'phar::isWritable' => 'Returns true if the phar archive can be modified', -'Phar::key' => 'Retrieve the key for the current file', -'phar::loadPhar' => 'Loads any phar archive with an alias', -'phar::mapPhar' => 'Reads the currently executed file (a phar) and registers its manifest', -'phar::mount' => 'Mount an external path or file to a virtual location within the phar archive', -'phar::mungServer' => 'Defines a list of up to 4 $_SERVER variables that should be modified for execution', -'Phar::next' => 'Move to the next file', -'phar::offsetExists' => 'Determines whether a file exists in the phar', -'phar::offsetGet' => 'Gets a PharFileInfo object for a specific file', -'phar::offsetSet' => 'Set the contents of an internal file to those of an external file', -'phar::offsetUnset' => 'Remove a file from a phar', -'Phar::rewind' => 'Rewinds back to the beginning', -'phar::running' => 'Returns the full path on disk or full phar URL to the currently executing Phar archive', -'Phar::seek' => 'Seek to a DirectoryIterator item', -'phar::setAlias' => 'Set the alias for the Phar archive', -'phar::setDefaultStub' => 'Used to set the PHP loader or bootstrap stub of a Phar archive to the default loader', -'Phar::setFlags' => 'Sets handling flags', -'phar::setMetadata' => 'Sets phar archive meta-data', -'phar::setSignatureAlgorithm' => 'Set the signature algorithm for a phar and apply it', -'phar::setStub' => 'Used to set the PHP loader or bootstrap stub of a Phar archive', -'phar::startBuffering' => 'Start buffering Phar write operations, do not modify the Phar object on disk', -'phar::stopBuffering' => 'Stop buffering write requests to the Phar archive, and save changes to disk', -'phar::uncompressAllFiles' => 'Uncompresses all files in the current Phar archive', -'phar::unlinkArchive' => 'Completely remove a phar archive from disk and from memory', -'Phar::valid' => 'Check whether current DirectoryIterator position is a valid file', -'phar::webPhar' => 'mapPhar for web-based phars. front controller for web applications', -'phardata::__construct' => 'Construct a non-executable tar or zip archive object', -'phardata::addEmptyDir' => 'Add an empty directory to the tar/zip archive', -'phardata::addFile' => 'Add a file from the filesystem to the tar/zip archive', -'phardata::addFromString' => 'Add a file from the filesystem to the tar/zip archive', -'PharData::apiVersion' => 'Returns the api version', -'phardata::buildFromDirectory' => 'Construct a tar/zip archive from the files within a directory', -'phardata::buildFromIterator' => 'Construct a tar or zip archive from an iterator', -'PharData::canCompress' => 'Returns whether phar extension supports compression using either zlib or bzip2', -'PharData::canWrite' => 'Returns whether phar extension supports writing and creating phars', -'phardata::compress' => 'Compresses the entire tar/zip archive using Gzip or Bzip2 compression', -'phardata::compressFiles' => 'Compresses all files in the current tar/zip archive', -'phardata::convertToData' => 'Convert a phar archive to a non-executable tar or zip file', -'phardata::convertToExecutable' => 'Convert a non-executable tar/zip archive to an executable phar archive', -'phardata::copy' => 'Copy a file internal to the phar archive to another new file within the phar', -'PharData::count' => 'Returns the number of entries (files) in the Phar archive', -'PharData::createDefaultStub' => 'Create a phar-file format specific stub', -'PharData::current' => 'The current file', -'phardata::decompress' => 'Decompresses the entire Phar archive', -'phardata::decompressFiles' => 'Decompresses all files in the current zip archive', -'phardata::delete' => 'Delete a file within a tar/zip archive', -'phardata::delMetadata' => 'Deletes the global metadata of a zip archive', -'phardata::extractTo' => 'Extract the contents of a tar/zip archive to a directory', -'PharData::getAlias' => 'Get the alias for Phar', -'PharData::getChildren' => 'Returns an iterator for the current entry if it is a directory', -'PharData::getMetadata' => 'Returns phar archive meta-data', -'PharData::getModified' => 'Return whether phar was modified', -'PharData::getPath' => 'Get the real path to the Phar archive on disk', -'PharData::getSignature' => 'Return MD5/SHA1/SHA256/SHA512/OpenSSL signature of a Phar archive', -'PharData::getStub' => 'Return the PHP loader or bootstrap stub of a Phar archive', -'PharData::getSubPath' => 'Get sub path', -'PharData::getSubPathname' => 'Get sub path and name', -'PharData::getSupportedCompression' => 'Return array of supported compression algorithms', -'PharData::getSupportedSignatures' => 'Return array of supported signature types', -'PharData::getVersion' => 'Return version info of Phar archive', -'PharData::hasChildren' => 'Returns whether current entry is a directory and not \'.\' or \'..\'', -'PharData::hasMetadata' => 'Returns whether phar has global meta-data', -'PharData::interceptFileFuncs' => 'Instructs phar to intercept fopen, file_get_contents, opendir, and all of the stat-related functions', -'PharData::isBuffering' => 'Used to determine whether Phar write operations are being buffered, or are flushing directly to disk', -'PharData::isCompressed' => 'Returns Phar::GZ or PHAR::BZ2 if the entire phar archive is compressed (.tar.gz/tar.bz and so on)', -'PharData::isFileFormat' => 'Returns true if the phar archive is based on the tar/phar/zip file format depending on the parameter', -'PharData::isValidPharFilename' => 'Returns whether the given filename is a valid phar filename', -'phardata::isWritable' => 'Returns true if the tar/zip archive can be modified', -'PharData::key' => 'Retrieve the key for the current file', -'PharData::loadPhar' => 'Loads any phar archive with an alias', -'PharData::mapPhar' => 'Reads the currently executed file (a phar) and registers its manifest', -'PharData::mount' => 'Mount an external path or file to a virtual location within the phar archive', -'PharData::mungServer' => 'Defines a list of up to 4 $_SERVER variables that should be modified for execution', -'PharData::next' => 'Move to the next file', -'phardata::offsetSet' => 'Set the contents of a file within the tar/zip to those of an external file or string', -'phardata::offsetUnset' => 'Remove a file from a tar/zip archive', -'PharData::rewind' => 'Rewinds back to the beginning', -'PharData::running' => 'Returns the full path on disk or full phar URL to the currently executing Phar archive', -'PharData::seek' => 'Seek to a DirectoryIterator item', -'phardata::setAlias' => 'Dummy function (Phar::setAlias is not valid for PharData)', -'phardata::setDefaultStub' => 'Dummy function (Phar::setDefaultStub is not valid for PharData)', -'phardata::setMetadata' => 'Sets phar archive meta-data', -'phardata::setSignatureAlgorithm' => 'Set the signature algorithm for a phar and apply it', -'phardata::setStub' => 'Dummy function (Phar::setStub is not valid for PharData)', -'PharData::startBuffering' => 'Start buffering Phar write operations, do not modify the Phar object on disk', -'PharData::stopBuffering' => 'Stop buffering write requests to the Phar archive, and save changes to disk', -'PharData::unlinkArchive' => 'Completely remove a phar archive from disk and from memory', -'PharData::valid' => 'Check whether current DirectoryIterator position is a valid file', -'PharData::webPhar' => 'mapPhar for web-based phars. front controller for web applications', -'pharfileinfo::__construct' => 'Construct a Phar entry object', -'PharFileInfo::__toString' => 'Returns the path to the file as a string', -'pharfileinfo::chmod' => 'Sets file-specific permission bits', -'pharfileinfo::compress' => 'Compresses the current Phar entry with either zlib or bzip2 compression', -'pharfileinfo::decompress' => 'Decompresses the current Phar entry within the phar', -'pharfileinfo::delMetadata' => 'Deletes the metadata of the entry', -'PharFileInfo::getATime' => 'Gets last access time of the file', -'PharFileInfo::getBasename' => 'Gets the base name of the file', -'pharfileinfo::getCompressedSize' => 'Returns the actual size of the file (with compression) inside the Phar archive', -'pharfileinfo::getContent' => 'Get the complete file contents of the entry', -'pharfileinfo::getCRC32' => 'Returns CRC32 code or throws an exception if CRC has not been verified', -'PharFileInfo::getCTime' => 'Gets the inode change time', -'PharFileInfo::getExtension' => 'Gets the file extension', -'PharFileInfo::getFileInfo' => 'Gets an SplFileInfo object for the file', -'PharFileInfo::getFilename' => 'Gets the filename', -'PharFileInfo::getGroup' => 'Gets the file group', -'PharFileInfo::getInode' => 'Gets the inode for the file', -'PharFileInfo::getLinkTarget' => 'Gets the target of a link', -'pharfileinfo::getMetadata' => 'Returns file-specific meta-data saved with a file', -'PharFileInfo::getMTime' => 'Gets the last modified time', -'PharFileInfo::getOwner' => 'Gets the owner of the file', -'PharFileInfo::getPath' => 'Gets the path without filename', -'PharFileInfo::getPathInfo' => 'Gets an SplFileInfo object for the path', -'PharFileInfo::getPathname' => 'Gets the path to the file', -'PharFileInfo::getPerms' => 'Gets file permissions', -'pharfileinfo::getPharFlags' => 'Returns the Phar file entry flags', -'PharFileInfo::getRealPath' => 'Gets absolute path to file', -'PharFileInfo::getSize' => 'Gets file size', -'PharFileInfo::getType' => 'Gets file type', -'pharfileinfo::hasMetadata' => 'Returns the metadata of the entry', -'pharfileinfo::isCompressed' => 'Returns whether the entry is compressed', -'pharfileinfo::isCompressedBZIP2' => 'Returns whether the entry is compressed using bzip2', -'pharfileinfo::isCompressedGZ' => 'Returns whether the entry is compressed using gz', -'pharfileinfo::isCRCChecked' => 'Returns whether file entry has had its CRC verified', -'PharFileInfo::isDir' => 'Tells if the file is a directory', -'PharFileInfo::isExecutable' => 'Tells if the file is executable', -'PharFileInfo::isFile' => 'Tells if the object references a regular file', -'PharFileInfo::isLink' => 'Tells if the file is a link', -'PharFileInfo::isReadable' => 'Tells if file is readable', -'PharFileInfo::isWritable' => 'Tells if the entry is writable', -'PharFileInfo::openFile' => 'Gets an SplFileObject object for the file', -'pharfileinfo::setCompressedBZIP2' => 'Compresses the current Phar entry within the phar using Bzip2 compression', -'pharfileinfo::setCompressedGZ' => 'Compresses the current Phar entry within the phar using gz compression', -'PharFileInfo::setFileClass' => 'Sets the class used with SplFileInfo::openFile', -'PharFileInfo::setInfoClass' => 'Sets the class used with SplFileInfo::getFileInfo and SplFileInfo::getPathInfo', -'pharfileinfo::setMetadata' => 'Sets file-specific meta-data saved with a file', -'pharfileinfo::setUncompressed' => 'Uncompresses the current Phar entry within the phar, if it is compressed', -'php_check_syntax' => 'Check the PHP syntax of (and execute) the specified file', -'php_ini_loaded_file' => 'Retrieve a path to the loaded php.ini file', -'php_ini_scanned_files' => 'Return a list of .ini files parsed from the additional ini dir', -'php_logo_guid' => 'Gets the logo guid', -'php_sapi_name' => 'Returns the type of interface between web server and PHP', -'php_strip_whitespace' => 'Return source with stripped comments and whitespace', -'php_uname' => 'Returns information about the operating system PHP is running on', -'php_user_filter::filter' => 'Called when applying the filter', -'php_user_filter::onClose' => 'Called when closing the filter', -'php_user_filter::onCreate' => 'Called when creating the filter', -'phpcredits' => 'Prints out the credits for PHP', -'phpdbg_break_file' => 'Inserts a breakpoint at a line in a file', -'phpdbg_break_function' => 'Inserts a breakpoint at entry to a function', -'phpdbg_break_method' => 'Inserts a breakpoint at entry to a method', -'phpdbg_break_next' => 'Inserts a breakpoint at the next opcode', -'phpdbg_clear' => 'Clears all breakpoints', -'phpdbg_color' => 'Sets the color of certain elements', -'phpdbg_exec' => 'Attempts to set the execution context', -'phpdbg_prompt' => 'Sets the command prompt', -'phpinfo' => 'Outputs information about PHP\'s configuration', -'phpversion' => 'Gets the current PHP version', -'pht\atomicinteger::__construct' => 'AtomicInteger creation', -'pht\atomicinteger::dec' => 'Decrements the atomic integer\'s value by one', -'pht\atomicinteger::get' => 'Gets the atomic integer\'s value', -'pht\atomicinteger::inc' => 'Increments the atomic integer\'s value by one', -'pht\atomicinteger::lock' => 'Acquires the atomic integer\'s mutex lock', -'pht\atomicinteger::set' => 'Sets the atomic integer\'s value', -'pht\atomicinteger::unlock' => 'Releases the atomic integer\'s mutex lock', -'pht\hashtable::lock' => 'Acquires the hash table\'s mutex lock', -'pht\hashtable::size' => 'Gets the size of the hash table', -'pht\hashtable::unlock' => 'Releases the hash table\'s mutex lock', -'pht\queue::front' => 'Returns the first value from a queue', -'pht\queue::lock' => 'Acquires the queue\'s mutex lock', -'pht\queue::pop' => 'Pops a value off of the front of a queue', -'pht\queue::push' => 'Pushes a value to the end of a queue', -'pht\queue::size' => 'Gets the size of the queue', -'pht\queue::unlock' => 'Releases the queue\'s mutex lock', -'pht\runnable::run' => 'The entry point of a threaded class', -'pht\thread::addClassTask' => 'Class threading', -'pht\thread::addFileTask' => 'File threading', -'pht\thread::addFunctionTask' => 'Function threading', -'pht\thread::join' => 'Joins a thread', -'pht\thread::start' => 'Starts the new thread', -'pht\thread::taskCount' => 'Gets a thread\'s task count', -'pht\threaded::lock' => 'Acquires the mutex lock', -'pht\threaded::unlock' => 'Releases the mutex lock', -'pht\vector::__construct' => 'Vector creation', -'pht\vector::deleteAt' => 'Deletes a value in the vector', -'pht\vector::insertAt' => 'Inserts a value into the vector', -'pht\vector::lock' => 'Acquires the vector\'s mutex lock', -'pht\vector::pop' => 'Pops a value to the vector', -'pht\vector::push' => 'Pushes a value to the vector', -'pht\vector::resize' => 'Resizes a vector', -'pht\vector::shift' => 'Shifts a value from the vector', -'pht\vector::size' => 'Gets the size of the vector', -'pht\vector::unlock' => 'Releases the vector\'s mutex lock', -'pht\vector::unshift' => 'Unshifts a value to the vector front', -'pht\vector::updateAt' => 'Updates a value in the vector', -'pi' => 'Get value of pi', -'png2wbmp' => 'Convert PNG image file to WBMP image file', -'pointObj::distanceToLine' => 'Calculates distance between a point ad a lined defined by the -two points passed in argument.', -'pointObj::distanceToPoint' => 'Calculates distance between two points.', -'pointObj::distanceToShape' => 'Calculates the minimum distance between a point and a shape.', -'pointObj::draw' => 'Draws the individual point using layer. The class_index is used -to classify the point based on the classes defined for the layer. -The text string is used to annotate the point. (Optional) -Returns MS_SUCCESS/MS_FAILURE.', -'pointObj::ms_newPointObj' => 'Old style constructor', -'pointObj::project' => 'Project the point from "in" projection (1st argument) to "out" -projection (2nd argument). Returns MS_SUCCESS/MS_FAILURE.', -'pointObj::setXY' => 'Set X,Y coordinate values. -.. note:: -the 3rd parameter m is used for measured shape files only. -It is not mandatory.', -'pointObj::setXYZ' => 'Set X,Y,Z coordinate values. -.. note:: -the 4th parameter m is used for measured shape files only. -It is not mandatory.', -'pool::__construct' => 'Creates a new Pool of Workers', -'pool::collect' => 'Collect references to completed tasks', -'pool::resize' => 'Resize the Pool', -'pool::shutdown' => 'Shutdown all workers', -'pool::submit' => 'Submits an object for execution', -'pool::submitTo' => 'Submits a task to a specific worker for execution', -'popen' => 'Opens process file pointer', -'pos' => 'Alias of current', -'posix_access' => 'Determine accessibility of a file', -'posix_ctermid' => 'Get path name of controlling terminal', -'posix_errno' => 'Alias of posix_get_last_error', -'posix_get_last_error' => 'Retrieve the error number set by the last posix function that failed', -'posix_getcwd' => 'Pathname of current directory', -'posix_getegid' => 'Return the effective group ID of the current process', -'posix_geteuid' => 'Return the effective user ID of the current process', -'posix_getgid' => 'Return the real group ID of the current process', -'posix_getgrgid' => 'Return info about a group by group id', -'posix_getgrnam' => 'Return info about a group by name', -'posix_getgroups' => 'Return the group set of the current process', -'posix_getlogin' => 'Return login name', -'posix_getpgid' => 'Get process group id for job control', -'posix_getpgrp' => 'Return the current process group identifier', -'posix_getpid' => 'Return the current process identifier', -'posix_getppid' => 'Return the parent process identifier', -'posix_getpwnam' => 'Return info about a user by username', -'posix_getpwuid' => 'Return info about a user by user id', -'posix_getrlimit' => 'Return info about system resource limits', -'posix_getsid' => 'Get the current sid of the process', -'posix_getuid' => 'Return the real user ID of the current process', -'posix_initgroups' => 'Calculate the group access list', -'posix_isatty' => 'Determine if a file descriptor is an interactive terminal', -'posix_kill' => 'Send a signal to a process', -'posix_mkfifo' => 'Create a fifo special file (a named pipe)', -'posix_mknod' => 'Create a special or ordinary file (POSIX.1)', -'posix_setegid' => 'Set the effective GID of the current process', -'posix_seteuid' => 'Set the effective UID of the current process', -'posix_setgid' => 'Set the GID of the current process', -'posix_setpgid' => 'Set process group id for job control', -'posix_setrlimit' => 'Set system resource limits', -'posix_setsid' => 'Make the current process a session leader', -'posix_setuid' => 'Set the UID of the current process', -'posix_strerror' => 'Retrieve the system error message associated with the given errno', -'posix_times' => 'Get process times', -'posix_ttyname' => 'Determine terminal device name', -'posix_uname' => 'Get system name', -'pow' => 'Exponential expression', -'preg_filter' => 'Perform a regular expression search and replace', -'preg_grep' => 'Return array entries that match the pattern', -'preg_last_error' => 'Returns the error code of the last PCRE regex execution', -'preg_match' => 'Perform a regular expression match', -'preg_match_all' => 'Perform a global regular expression match', -'preg_quote' => 'Quote regular expression characters', -'preg_replace' => 'Perform a regular expression search and replace', -'preg_replace_callback' => 'Perform a regular expression search and replace using a callback', -'preg_replace_callback_array' => 'Perform a regular expression search and replace using callbacks', -'preg_split' => 'Split string by a regular expression', -'prev' => 'Rewind the internal array pointer', -'print' => 'Output a string', -'print_r' => 'Prints human-readable information about a variable', -'printf' => 'Output a formatted string', -'proc_close' => 'Close a process opened by proc_open and return the exit code of that process', -'proc_get_status' => 'Get information about a process opened by proc_open', -'proc_nice' => 'Change the priority of the current process', -'proc_open' => 'Execute a command and open file pointers for input/output', -'proc_terminate' => 'Kills a process opened by proc_open', -'projectionObj::__construct' => 'Creates a projection object based on the projection string passed -as argument. -$projInObj = ms_newprojectionobj("proj=latlong") -will create a geographic projection class. -The following example will convert a lat/long point to an LCC -projection: -$projInObj = ms_newprojectionobj("proj=latlong"); -$projOutObj = ms_newprojectionobj("proj=lcc,ellps=GRS80,lat_0=49,". -"lon_0=-95,lat_1=49,lat_2=77"); -$poPoint = ms_newpointobj(); -$poPoint->setXY(-92.0, 62.0); -$poPoint->project($projInObj, $projOutObj);', -'projectionObj::getUnits' => 'Returns the units of a projection object. Returns -1 on error.', -'projectionObj::ms_newProjectionObj' => 'Old style constructor', -'property_exists' => 'Checks if the object or class has a property', -'ps_add_bookmark' => 'Add bookmark to current page', -'ps_add_launchlink' => 'Adds link which launches file', -'ps_add_locallink' => 'Adds link to a page in the same document', -'ps_add_note' => 'Adds note to current page', -'ps_add_pdflink' => 'Adds link to a page in a second pdf document', -'ps_add_weblink' => 'Adds link to a web location', -'ps_arc' => 'Draws an arc counterclockwise', -'ps_arcn' => 'Draws an arc clockwise', -'ps_begin_page' => 'Start a new page', -'ps_begin_pattern' => 'Start a new pattern', -'ps_begin_template' => 'Start a new template', -'ps_circle' => 'Draws a circle', -'ps_clip' => 'Clips drawing to current path', -'ps_close' => 'Closes a PostScript document', -'ps_close_image' => 'Closes image and frees memory', -'ps_closepath' => 'Closes path', -'ps_closepath_stroke' => 'Closes and strokes path', -'ps_continue_text' => 'Continue text in next line', -'ps_curveto' => 'Draws a curve', -'ps_delete' => 'Deletes all resources of a PostScript document', -'ps_end_page' => 'End a page', -'ps_end_pattern' => 'End a pattern', -'ps_end_template' => 'End a template', -'ps_fill' => 'Fills the current path', -'ps_fill_stroke' => 'Fills and strokes the current path', -'ps_findfont' => 'Loads a font', -'ps_get_buffer' => 'Fetches the full buffer containing the generated PS data', -'ps_get_parameter' => 'Gets certain parameters', -'ps_get_value' => 'Gets certain values', -'ps_hyphenate' => 'Hyphenates a word', -'ps_include_file' => 'Reads an external file with raw PostScript code', -'ps_lineto' => 'Draws a line', -'ps_makespotcolor' => 'Create spot color', -'ps_moveto' => 'Sets current point', -'ps_new' => 'Creates a new PostScript document object', -'ps_open_file' => 'Opens a file for output', -'ps_open_image' => 'Reads an image for later placement', -'ps_open_image_file' => 'Opens image from file', -'ps_open_memory_image' => 'Takes an GD image and returns an image for placement in a PS document', -'ps_place_image' => 'Places image on the page', -'ps_rect' => 'Draws a rectangle', -'ps_restore' => 'Restore previously save context', -'ps_rotate' => 'Sets rotation factor', -'ps_save' => 'Save current context', -'ps_scale' => 'Sets scaling factor', -'ps_set_border_color' => 'Sets color of border for annotations', -'ps_set_border_dash' => 'Sets length of dashes for border of annotations', -'ps_set_border_style' => 'Sets border style of annotations', -'ps_set_info' => 'Sets information fields of document', -'ps_set_parameter' => 'Sets certain parameters', -'ps_set_text_pos' => 'Sets position for text output', -'ps_set_value' => 'Sets certain values', -'ps_setcolor' => 'Sets current color', -'ps_setdash' => 'Sets appearance of a dashed line', -'ps_setflat' => 'Sets flatness', -'ps_setfont' => 'Sets font to use for following output', -'ps_setgray' => 'Sets gray value', -'ps_setlinecap' => 'Sets appearance of line ends', -'ps_setlinejoin' => 'Sets how contected lines are joined', -'ps_setlinewidth' => 'Sets width of a line', -'ps_setmiterlimit' => 'Sets the miter limit', -'ps_setoverprintmode' => 'Sets overprint mode', -'ps_setpolydash' => 'Sets appearance of a dashed line', -'ps_shading' => 'Creates a shading for later use', -'ps_shading_pattern' => 'Creates a pattern based on a shading', -'ps_shfill' => 'Fills an area with a shading', -'ps_show' => 'Output text', -'ps_show2' => 'Output a text at current position', -'ps_show_boxed' => 'Output text in a box', -'ps_show_xy' => 'Output text at given position', -'ps_show_xy2' => 'Output text at position', -'ps_string_geometry' => 'Gets geometry of a string', -'ps_stringwidth' => 'Gets width of a string', -'ps_stroke' => 'Draws the current path', -'ps_symbol' => 'Output a glyph', -'ps_symbol_name' => 'Gets name of a glyph', -'ps_symbol_width' => 'Gets width of a glyph', -'ps_translate' => 'Sets translation', -'pspell_add_to_personal' => 'Add the word to a personal wordlist', -'pspell_add_to_session' => 'Add the word to the wordlist in the current session', -'pspell_check' => 'Check a word', -'pspell_clear_session' => 'Clear the current session', -'pspell_config_create' => 'Create a config used to open a dictionary', -'pspell_config_data_dir' => 'Location of language data files', -'pspell_config_dict_dir' => 'Location of the main word list', -'pspell_config_ignore' => 'Ignore words less than N characters long', -'pspell_config_mode' => 'Change the mode number of suggestions returned', -'pspell_config_personal' => 'Set a file that contains personal wordlist', -'pspell_config_repl' => 'Set a file that contains replacement pairs', -'pspell_config_runtogether' => 'Consider run-together words as valid compounds', -'pspell_config_save_repl' => 'Determine whether to save a replacement pairs list along with the wordlist', -'pspell_new' => 'Load a new dictionary', -'pspell_new_config' => 'Load a new dictionary with settings based on a given config', -'pspell_new_personal' => 'Load a new dictionary with personal wordlist', -'pspell_save_wordlist' => 'Save the personal wordlist to a file', -'pspell_store_replacement' => 'Store a replacement pair for a word', -'pspell_suggest' => 'Suggest spellings of a word', -'putenv' => 'Sets the value of an environment variable', -'px_close' => 'Closes a paradox database', -'px_create_fp' => 'Create a new paradox database', -'px_date2string' => 'Converts a date into a string', -'px_delete' => 'Deletes resource of paradox database', -'px_delete_record' => 'Deletes record from paradox database', -'px_get_field' => 'Returns the specification of a single field', -'px_get_info' => 'Return lots of information about a paradox file', -'px_get_parameter' => 'Gets a parameter', -'px_get_record' => 'Returns record of paradox database', -'px_get_schema' => 'Returns the database schema', -'px_get_value' => 'Gets a value', -'px_insert_record' => 'Inserts record into paradox database', -'px_new' => 'Create a new paradox object', -'px_numfields' => 'Returns number of fields in a database', -'px_numrecords' => 'Returns number of records in a database', -'px_open_fp' => 'Open paradox database', -'px_put_record' => 'Stores record into paradox database', -'px_retrieve_record' => 'Returns record of paradox database', -'px_set_blob_file' => 'Sets the file where blobs are read from', -'px_set_parameter' => 'Sets a parameter', -'px_set_tablename' => 'Sets the name of a table (deprecated)', -'px_set_targetencoding' => 'Sets the encoding for character fields (deprecated)', -'px_set_value' => 'Sets a value', -'px_timestamp2string' => 'Converts the timestamp into a string', -'px_update_record' => 'Updates record in paradox database', -'querymapObj::convertToString' => 'Saves the object to a string. Provides the inverse option for -updateFromString.', -'querymapObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the resources.', -'querymapObj::set' => 'Set object property to a new value.', -'querymapObj::updateFromString' => 'Update a queryMap object from a string snippet. Returns -MS_SUCCESS/MS_FAILURE.', -'quickhashinthash::__construct' => 'Creates a new QuickHashIntHash object', -'quickhashinthash::add' => 'This method adds a new entry to the hash', -'quickhashinthash::delete' => 'This method deletes am entry from the hash', -'quickhashinthash::exists' => 'This method checks whether a key is part of the hash', -'quickhashinthash::get' => 'This method retrieves a value from the hash by its key', -'quickhashinthash::getSize' => 'Returns the number of elements in the hash', -'quickhashinthash::loadFromFile' => 'This factory method creates a hash from a file', -'quickhashinthash::loadFromString' => 'This factory method creates a hash from a string', -'quickhashinthash::saveToFile' => 'This method stores an in-memory hash to disk', -'quickhashinthash::saveToString' => 'This method returns a serialized version of the hash', -'quickhashinthash::set' => 'This method updates an entry in the hash with a new value, or adds a new one if the entry doesn\'t exist', -'quickhashinthash::update' => 'This method updates an entry in the hash with a new value', -'quickhashintset::__construct' => 'Creates a new QuickHashIntSet object', -'quickhashintset::add' => 'This method adds a new entry to the set', -'quickhashintset::delete' => 'This method deletes an entry from the set', -'quickhashintset::exists' => 'This method checks whether a key is part of the set', -'quickhashintset::getSize' => 'Returns the number of elements in the set', -'quickhashintset::loadFromFile' => 'This factory method creates a set from a file', -'quickhashintset::loadFromString' => 'This factory method creates a set from a string', -'quickhashintset::saveToFile' => 'This method stores an in-memory set to disk', -'quickhashintset::saveToString' => 'This method returns a serialized version of the set', -'quickhashintstringhash::__construct' => 'Creates a new QuickHashIntStringHash object', -'quickhashintstringhash::add' => 'This method adds a new entry to the hash', -'quickhashintstringhash::delete' => 'This method deletes am entry from the hash', -'quickhashintstringhash::exists' => 'This method checks whether a key is part of the hash', -'quickhashintstringhash::get' => 'This method retrieves a value from the hash by its key', -'quickhashintstringhash::getSize' => 'Returns the number of elements in the hash', -'quickhashintstringhash::loadFromFile' => 'This factory method creates a hash from a file', -'quickhashintstringhash::loadFromString' => 'This factory method creates a hash from a string', -'quickhashintstringhash::saveToFile' => 'This method stores an in-memory hash to disk', -'quickhashintstringhash::saveToString' => 'This method returns a serialized version of the hash', -'quickhashintstringhash::set' => 'This method updates an entry in the hash with a new value, or adds a new one if the entry doesn\'t exist', -'quickhashintstringhash::update' => 'This method updates an entry in the hash with a new value', -'quickhashstringinthash::__construct' => 'Creates a new QuickHashStringIntHash object', -'quickhashstringinthash::add' => 'This method adds a new entry to the hash', -'quickhashstringinthash::delete' => 'This method deletes am entry from the hash', -'quickhashstringinthash::exists' => 'This method checks whether a key is part of the hash', -'quickhashstringinthash::get' => 'This method retrieves a value from the hash by its key', -'quickhashstringinthash::getSize' => 'Returns the number of elements in the hash', -'quickhashstringinthash::loadFromFile' => 'This factory method creates a hash from a file', -'quickhashstringinthash::loadFromString' => 'This factory method creates a hash from a string', -'quickhashstringinthash::saveToFile' => 'This method stores an in-memory hash to disk', -'quickhashstringinthash::saveToString' => 'This method returns a serialized version of the hash', -'quickhashstringinthash::set' => 'This method updates an entry in the hash with a new value, or adds a new one if the entry doesn\'t exist', -'quickhashstringinthash::update' => 'This method updates an entry in the hash with a new value', -'quoted_printable_decode' => 'Convert a quoted-printable string to an 8 bit string', -'quoted_printable_encode' => 'Convert a 8 bit string to a quoted-printable string', -'quotemeta' => 'Quote meta characters', -'rad2deg' => 'Converts the radian number to the equivalent number in degrees', -'radius_acct_open' => 'Creates a Radius handle for accounting', -'radius_add_server' => 'Adds a server', -'radius_auth_open' => 'Creates a Radius handle for authentication', -'radius_close' => 'Frees all resources', -'radius_config' => 'Causes the library to read the given configuration file', -'radius_create_request' => 'Create accounting or authentication request', -'radius_cvt_addr' => 'Converts raw data to IP-Address', -'radius_cvt_int' => 'Converts raw data to integer', -'radius_cvt_string' => 'Converts raw data to string', -'radius_demangle' => 'Demangles data', -'radius_demangle_mppe_key' => 'Derives mppe-keys from mangled data', -'radius_get_attr' => 'Extracts an attribute', -'radius_get_tagged_attr_data' => 'Extracts the data from a tagged attribute', -'radius_get_tagged_attr_tag' => 'Extracts the tag from a tagged attribute', -'radius_get_vendor_attr' => 'Extracts a vendor specific attribute', -'radius_put_addr' => 'Attaches an IP address attribute', -'radius_put_attr' => 'Attaches a binary attribute', -'radius_put_int' => 'Attaches an integer attribute', -'radius_put_string' => 'Attaches a string attribute', -'radius_put_vendor_addr' => 'Attaches a vendor specific IP address attribute', -'radius_put_vendor_attr' => 'Attaches a vendor specific binary attribute', -'radius_put_vendor_int' => 'Attaches a vendor specific integer attribute', -'radius_put_vendor_string' => 'Attaches a vendor specific string attribute', -'radius_request_authenticator' => 'Returns the request authenticator', -'radius_salt_encrypt_attr' => 'Salt-encrypts a value', -'radius_send_request' => 'Sends the request and waits for a reply', -'radius_server_secret' => 'Returns the shared secret', -'radius_strerror' => 'Returns an error message', -'rand' => 'Generate a random integer', -'random_bytes' => 'Generates cryptographically secure pseudo-random bytes', -'random_int' => 'Generates cryptographically secure pseudo-random integers', -'range' => 'Create an array containing a range of elements', -'rar_wrapper_cache_stats' => 'Cache hits and misses for the URL wrapper', -'rararchive::__toString' => 'Get text representation', -'rararchive::close' => 'Close RAR archive and free all resources', -'rararchive::getComment' => 'Get comment text from the RAR archive', -'rararchive::getEntries' => 'Get full list of entries from the RAR archive', -'rararchive::getEntry' => 'Get entry object from the RAR archive', -'rararchive::isBroken' => 'Test whether an archive is broken (incomplete)', -'rararchive::isSolid' => 'Check whether the RAR archive is solid', -'rararchive::open' => 'Open RAR archive', -'rararchive::setAllowBroken' => 'Whether opening broken archives is allowed', -'rarentry::__toString' => 'Get text representation of entry', -'rarentry::extract' => 'Extract entry from the archive', -'rarentry::getAttr' => 'Get attributes of the entry', -'rarentry::getCrc' => 'Get CRC of the entry', -'rarentry::getFileTime' => 'Get entry last modification time', -'rarentry::getHostOs' => 'Get entry host OS', -'rarentry::getMethod' => 'Get pack method of the entry', -'rarentry::getName' => 'Get name of the entry', -'rarentry::getPackedSize' => 'Get packed size of the entry', -'rarentry::getStream' => 'Get file handler for entry', -'rarentry::getUnpackedSize' => 'Get unpacked size of the entry', -'rarentry::getVersion' => 'Get minimum version of RAR program required to unpack the entry', -'rarentry::isDirectory' => 'Test whether an entry represents a directory', -'rarentry::isEncrypted' => 'Test whether an entry is encrypted', -'RarException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'RarException::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'RarException::__toString' => 'String representation of the exception', -'RarException::getCode' => 'Gets the Exception code', -'RarException::getFile' => 'Gets the file in which the exception occurred', -'RarException::getLine' => 'Gets the line in which the exception occurred', -'RarException::getMessage' => 'Gets the Exception message', -'RarException::getPrevious' => 'Returns previous Exception', -'RarException::getTrace' => 'Gets the stack trace', -'RarException::getTraceAsString' => 'Gets the stack trace as a string', -'rarexception::isUsingExceptions' => 'Check whether error handling with exceptions is in use', -'rarexception::setUsingExceptions' => 'Activate and deactivate error handling with exceptions', -'rawurldecode' => 'Decode URL-encoded strings', -'rawurlencode' => 'URL-encode according to RFC 3986', -'read_exif_data' => 'Alias of exif_read_data', -'readdir' => 'Read entry from directory handle', -'readfile' => 'Outputs a file', -'readgzfile' => 'Output a gz-file', -'readline' => 'Reads a line', -'readline_add_history' => 'Adds a line to the history', -'readline_callback_handler_install' => 'Initializes the readline callback interface and terminal, prints the prompt and returns immediately', -'readline_callback_handler_remove' => 'Removes a previously installed callback handler and restores terminal settings', -'readline_callback_read_char' => 'Reads a character and informs the readline callback interface when a line is received', -'readline_clear_history' => 'Clears the history', -'readline_completion_function' => 'Registers a completion function', -'readline_info' => 'Gets/sets various internal readline variables', -'readline_list_history' => 'Lists the history', -'readline_on_new_line' => 'Inform readline that the cursor has moved to a new line', -'readline_read_history' => 'Reads the history', -'readline_redisplay' => 'Redraws the display', -'readline_write_history' => 'Writes the history', -'readlink' => 'Returns the target of a symbolic link', -'realpath' => 'Returns canonicalized absolute pathname', -'realpath_cache_get' => 'Get realpath cache entries', -'realpath_cache_size' => 'Get realpath cache size', -'recode' => 'Alias of recode_string', -'recode_file' => 'Recode from file to file according to recode request', -'recode_string' => 'Recode a string according to a recode request', -'rectObj::__construct' => '.. note:: the members (minx, miny, maxx ,maxy) are initialized to -1;', -'rectObj::draw' => 'Draws the individual rectangle using layer. The class_index is used -to classify the rectangle based on the classes defined for the layer. -The text string is used to annotate the rectangle. (Optional) -Returns MS_SUCCESS/MS_FAILURE.', -'rectObj::fit' => 'Adjust extents of the rectangle to fit the width/height specified.', -'rectObj::ms_newRectObj' => 'Old style constructor', -'rectObj::project' => 'Project the rectangle from "in" projection (1st argument) to "out" -projection (2nd argument). Returns MS_SUCCESS/MS_FAILURE.', -'rectObj::set' => 'Set object property to a new value.', -'rectObj::setextent' => 'Set the rectangle extents.', -'RecursiveArrayIterator::append' => 'Append an element', -'RecursiveArrayIterator::asort' => 'Sort array by values', -'RecursiveArrayIterator::count' => 'Count elements', -'RecursiveArrayIterator::current' => 'Return current array entry', -'RecursiveArrayIterator::getArrayCopy' => 'Get array copy', -'RecursiveArrayIterator::getChildren' => 'Returns an iterator for the current entry if it is an array or an object', -'RecursiveArrayIterator::getFlags' => 'Get behavior flags', -'RecursiveArrayIterator::hasChildren' => 'Returns whether current entry is an array or an object', -'RecursiveArrayIterator::key' => 'Return current array key', -'RecursiveArrayIterator::ksort' => 'Sort array by keys', -'RecursiveArrayIterator::natcasesort' => 'Sort an array naturally, case insensitive', -'RecursiveArrayIterator::natsort' => 'Sort an array naturally', -'RecursiveArrayIterator::next' => 'Move to next entry', -'RecursiveArrayIterator::offsetExists' => 'Check if offset exists', -'RecursiveArrayIterator::offsetGet' => 'Get value for an offset', -'RecursiveArrayIterator::offsetSet' => 'Set value for an offset', -'RecursiveArrayIterator::offsetUnset' => 'Unset value for an offset', -'RecursiveArrayIterator::rewind' => 'Rewind array back to the start', -'RecursiveArrayIterator::seek' => 'Seek to position', -'RecursiveArrayIterator::serialize' => 'Serialize', -'RecursiveArrayIterator::setFlags' => 'Set behaviour flags', -'RecursiveArrayIterator::uasort' => 'Sort with a user-defined comparison function and maintain index association', -'RecursiveArrayIterator::uksort' => 'Sort by keys using a user-defined comparison function', -'RecursiveArrayIterator::unserialize' => 'Unserialize', -'RecursiveArrayIterator::valid' => 'Check whether array contains more entries', -'RecursiveCachingIterator::__construct' => 'Construct', -'RecursiveCachingIterator::__toString' => 'Return the string representation of the current element', -'RecursiveCachingIterator::count' => 'The number of elements in the iterator', -'RecursiveCachingIterator::current' => 'Return the current element', -'RecursiveCachingIterator::getCache' => 'Retrieve the contents of the cache', -'RecursiveCachingIterator::getChildren' => 'Return the inner iterator\'s children as a RecursiveCachingIterator', -'RecursiveCachingIterator::getFlags' => 'Get flags used', -'RecursiveCachingIterator::getInnerIterator' => 'Returns the inner iterator', -'RecursiveCachingIterator::hasChildren' => 'Check whether the current element of the inner iterator has children', -'RecursiveCachingIterator::hasNext' => 'Check whether the inner iterator has a valid next element', -'RecursiveCachingIterator::key' => 'Return the key for the current element', -'RecursiveCachingIterator::next' => 'Move the iterator forward', -'RecursiveCachingIterator::offsetExists' => 'The offsetExists purpose', -'RecursiveCachingIterator::offsetGet' => 'The offsetGet purpose', -'RecursiveCachingIterator::offsetSet' => 'The offsetSet purpose', -'RecursiveCachingIterator::offsetUnset' => 'The offsetUnset purpose', -'RecursiveCachingIterator::rewind' => 'Rewind the iterator', -'RecursiveCachingIterator::setFlags' => 'The setFlags purpose', -'RecursiveCachingIterator::valid' => 'Check whether the current element is valid', -'RecursiveCallbackFilterIterator::__construct' => 'Create a RecursiveCallbackFilterIterator from a RecursiveIterator', -'RecursiveCallbackFilterIterator::accept' => 'Calls the callback with the current value, the current key and the inner iterator as arguments', -'RecursiveCallbackFilterIterator::current' => 'Get the current element value', -'RecursiveCallbackFilterIterator::getChildren' => 'Return the inner iterator\'s children contained in a RecursiveCallbackFilterIterator', -'RecursiveCallbackFilterIterator::getInnerIterator' => 'Get the inner iterator', -'RecursiveCallbackFilterIterator::hasChildren' => 'Check whether the inner iterator\'s current element has children', -'RecursiveCallbackFilterIterator::key' => 'Get the current key', -'RecursiveCallbackFilterIterator::next' => 'Move the iterator forward', -'RecursiveCallbackFilterIterator::rewind' => 'Rewind the iterator', -'RecursiveCallbackFilterIterator::valid' => 'Check whether the current element is valid', -'RecursiveDirectoryIterator::__construct' => 'Constructs a RecursiveDirectoryIterator', -'RecursiveDirectoryIterator::__toString' => 'Get file name as a string', -'RecursiveDirectoryIterator::current' => 'The current file', -'RecursiveDirectoryIterator::getATime' => 'Get last access time of the current DirectoryIterator item', -'RecursiveDirectoryIterator::getBasename' => 'Get base name of current DirectoryIterator item', -'RecursiveDirectoryIterator::getChildren' => 'Returns an iterator for the current entry if it is a directory', -'RecursiveDirectoryIterator::getCTime' => 'Get inode change time of the current DirectoryIterator item', -'RecursiveDirectoryIterator::getExtension' => 'Gets the file extension', -'RecursiveDirectoryIterator::getFilename' => 'Return file name of current DirectoryIterator item', -'RecursiveDirectoryIterator::getFlags' => 'Get the handling flags', -'RecursiveDirectoryIterator::getGroup' => 'Get group for the current DirectoryIterator item', -'RecursiveDirectoryIterator::getInode' => 'Get inode for the current DirectoryIterator item', -'RecursiveDirectoryIterator::getMTime' => 'Get last modification time of current DirectoryIterator item', -'RecursiveDirectoryIterator::getOwner' => 'Get owner of current DirectoryIterator item', -'RecursiveDirectoryIterator::getPath' => 'Get path of current Iterator item without filename', -'RecursiveDirectoryIterator::getPathname' => 'Return path and file name of current DirectoryIterator item', -'RecursiveDirectoryIterator::getPerms' => 'Get the permissions of current DirectoryIterator item', -'RecursiveDirectoryIterator::getSize' => 'Get size of current DirectoryIterator item', -'RecursiveDirectoryIterator::getSubPath' => 'Get sub path', -'RecursiveDirectoryIterator::getSubPathname' => 'Get sub path and name', -'RecursiveDirectoryIterator::getType' => 'Determine the type of the current DirectoryIterator item', -'RecursiveDirectoryIterator::hasChildren' => 'Returns whether current entry is a directory and not \'.\' or \'..\'', -'RecursiveDirectoryIterator::isDir' => 'Determine if current DirectoryIterator item is a directory', -'RecursiveDirectoryIterator::isDot' => 'Determine if current DirectoryIterator item is \'.\' or \'..\'', -'RecursiveDirectoryIterator::isExecutable' => 'Determine if current DirectoryIterator item is executable', -'RecursiveDirectoryIterator::isFile' => 'Determine if current DirectoryIterator item is a regular file', -'RecursiveDirectoryIterator::isLink' => 'Determine if current DirectoryIterator item is a symbolic link', -'RecursiveDirectoryIterator::isReadable' => 'Determine if current DirectoryIterator item can be read', -'RecursiveDirectoryIterator::isWritable' => 'Determine if current DirectoryIterator item can be written to', -'RecursiveDirectoryIterator::key' => 'Return path and filename of current dir entry', -'RecursiveDirectoryIterator::next' => 'Move to next entry', -'RecursiveDirectoryIterator::rewind' => 'Rewind dir back to the start', -'RecursiveDirectoryIterator::seek' => 'Seek to a DirectoryIterator item', -'RecursiveDirectoryIterator::setFlags' => 'Sets handling flags', -'RecursiveDirectoryIterator::valid' => 'Check whether current DirectoryIterator position is a valid file', -'RecursiveFilterIterator::__construct' => 'Create a RecursiveFilterIterator from a RecursiveIterator', -'RecursiveFilterIterator::accept' => 'Check whether the current element of the iterator is acceptable', -'RecursiveFilterIterator::current' => 'Get the current element value', -'RecursiveFilterIterator::getChildren' => 'Return the inner iterator\'s children contained in a RecursiveFilterIterator', -'RecursiveFilterIterator::getInnerIterator' => 'Get the inner iterator', -'RecursiveFilterIterator::hasChildren' => 'Check whether the inner iterator\'s current element has children', -'RecursiveFilterIterator::key' => 'Get the current key', -'RecursiveFilterIterator::next' => 'Move the iterator forward', -'RecursiveFilterIterator::rewind' => 'Rewind the iterator', -'RecursiveFilterIterator::valid' => 'Check whether the current element is valid', -'RecursiveIterator::current' => 'Return the current element', -'RecursiveIterator::getChildren' => 'Returns an iterator for the current entry', -'RecursiveIterator::hasChildren' => 'Returns if an iterator can be created for the current entry', -'RecursiveIterator::key' => 'Return the key of the current element', -'RecursiveIterator::next' => 'Move forward to next element', -'RecursiveIterator::rewind' => 'Rewind the Iterator to the first element', -'RecursiveIterator::valid' => 'Checks if current position is valid', -'RecursiveIteratorIterator::__construct' => 'Construct a RecursiveIteratorIterator', -'RecursiveIteratorIterator::beginChildren' => 'Begin children', -'RecursiveIteratorIterator::beginIteration' => 'Begin Iteration', -'RecursiveIteratorIterator::callGetChildren' => 'Get children', -'RecursiveIteratorIterator::callHasChildren' => 'Has children', -'RecursiveIteratorIterator::current' => 'Access the current element value', -'RecursiveIteratorIterator::endChildren' => 'End children', -'RecursiveIteratorIterator::endIteration' => 'End Iteration', -'RecursiveIteratorIterator::getDepth' => 'Get the current depth of the recursive iteration', -'RecursiveIteratorIterator::getInnerIterator' => 'Get inner iterator', -'RecursiveIteratorIterator::getMaxDepth' => 'Get max depth', -'RecursiveIteratorIterator::getSubIterator' => 'The current active sub iterator', -'RecursiveIteratorIterator::key' => 'Access the current key', -'RecursiveIteratorIterator::next' => 'Move forward to the next element', -'RecursiveIteratorIterator::nextElement' => 'Next element', -'RecursiveIteratorIterator::rewind' => 'Rewind the iterator to the first element of the top level inner iterator', -'RecursiveIteratorIterator::setMaxDepth' => 'Set max depth', -'RecursiveIteratorIterator::valid' => 'Check whether the current position is valid', -'RecursiveRegexIterator::__construct' => 'Creates a new RecursiveRegexIterator', -'RecursiveRegexIterator::accept' => 'Get accept status', -'RecursiveRegexIterator::current' => 'Get the current element value', -'RecursiveRegexIterator::getChildren' => 'Returns an iterator for the current entry', -'RecursiveRegexIterator::getFlags' => 'Get flags', -'RecursiveRegexIterator::getInnerIterator' => 'Get the inner iterator', -'RecursiveRegexIterator::getMode' => 'Returns operation mode', -'RecursiveRegexIterator::getPregFlags' => 'Returns the regular expression flags', -'RecursiveRegexIterator::getRegex' => 'Returns current regular expression', -'RecursiveRegexIterator::hasChildren' => 'Returns whether an iterator can be obtained for the current entry', -'RecursiveRegexIterator::key' => 'Get the current key', -'RecursiveRegexIterator::next' => 'Move the iterator forward', -'RecursiveRegexIterator::rewind' => 'Rewind the iterator', -'RecursiveRegexIterator::setFlags' => 'Sets the flags', -'RecursiveRegexIterator::setMode' => 'Sets the operation mode', -'RecursiveRegexIterator::setPregFlags' => 'Sets the regular expression flags', -'RecursiveRegexIterator::valid' => 'Check whether the current element is valid', -'RecursiveTreeIterator::__construct' => 'Construct a RecursiveTreeIterator', -'RecursiveTreeIterator::beginChildren' => 'Begin children', -'RecursiveTreeIterator::beginIteration' => 'Begin iteration', -'RecursiveTreeIterator::callGetChildren' => 'Get children', -'RecursiveTreeIterator::callHasChildren' => 'Has children', -'RecursiveTreeIterator::current' => 'Get current element', -'RecursiveTreeIterator::endChildren' => 'End children', -'RecursiveTreeIterator::endIteration' => 'End iteration', -'RecursiveTreeIterator::getDepth' => 'Get the current depth of the recursive iteration', -'RecursiveTreeIterator::getEntry' => 'Get current entry', -'RecursiveTreeIterator::getInnerIterator' => 'Get inner iterator', -'RecursiveTreeIterator::getMaxDepth' => 'Get max depth', -'RecursiveTreeIterator::getPostfix' => 'Get the postfix', -'RecursiveTreeIterator::getPrefix' => 'Get the prefix', -'RecursiveTreeIterator::getSubIterator' => 'The current active sub iterator', -'RecursiveTreeIterator::key' => 'Get the key of the current element', -'RecursiveTreeIterator::next' => 'Move to next element', -'RecursiveTreeIterator::nextElement' => 'Next element', -'RecursiveTreeIterator::rewind' => 'Rewind iterator', -'RecursiveTreeIterator::setMaxDepth' => 'Set max depth', -'RecursiveTreeIterator::setPostfix' => 'Set postfix', -'RecursiveTreeIterator::setPrefixPart' => 'Set a part of the prefix', -'RecursiveTreeIterator::valid' => 'Check validity', -'Redis::__construct' => 'Creates a Redis client', -'Redis::_prefix' => 'A utility method to prefix the value with the prefix setting for phpredis.', -'Redis::_serialize' => 'A utility method to serialize values manually. This method allows you to serialize a value with whatever -serializer is configured, manually. This can be useful for serialization/unserialization of data going in -and out of EVAL commands as phpredis can\'t automatically do this itself. Note that if no serializer is -set, phpredis will change Array values to \'Array\', and Objects to \'Object\'.', -'Redis::_unserialize' => 'A utility method to unserialize data with whatever serializer is set up. If there is no serializer set, the -value will be returned unchanged. If there is a serializer set up, and the data passed in is malformed, an -exception will be thrown. This can be useful if phpredis is serializing values, and you return something from -redis in a LUA script that is serialized.', -'Redis::append' => 'Append specified string to the string stored in specified key.', -'Redis::auth' => 'Authenticate the connection using a password. -Warning: The password is sent in plain-text over the network.', -'Redis::bgrewriteaof' => 'Starts the background rewrite of AOF (Append-Only File)', -'Redis::bgsave' => 'Performs a background save.', -'Redis::bitCount' => 'Count bits in a string.', -'Redis::bitOp' => 'Bitwise operation on multiple keys.', -'Redis::bitpos' => 'Return the position of the first bit set to 1 or 0 in a string. The position is returned, thinking of the -string as an array of bits from left to right, where the first byte\'s most significant bit is at position 0, -the second byte\'s most significant bit is at position 8, and so forth.', -'Redis::blPop' => 'Is a blocking lPop primitive. If at least one of the lists contains at least one element, -the element will be popped from the head of the list and returned to the caller. -Il all the list identified by the keys passed in arguments are empty, blPop will block -during the specified timeout until an element is pushed to one of those lists. This element will be popped.', -'Redis::brPop' => 'Is a blocking rPop primitive. If at least one of the lists contains at least one element, -the element will be popped from the head of the list and returned to the caller. -Il all the list identified by the keys passed in arguments are empty, brPop will -block during the specified timeout until an element is pushed to one of those lists. T -his element will be popped.', -'Redis::brpoplpush' => 'A blocking version of rpoplpush, with an integral timeout in the third parameter.', -'Redis::clearLastError' => 'Clear the last error message', -'Redis::client' => 'Issue the CLIENT command with various arguments.', -'Redis::close' => 'Disconnects from the Redis instance, except when pconnect is used.', -'Redis::config' => 'Get or Set the redis config keys.', -'Redis::connect' => 'Connects to a Redis instance.', -'Redis::dbSize' => 'Returns the current database\'s size.', -'Redis::decr' => 'Decrement the number stored at key by one.', -'Redis::decrBy' => 'Decrement the number stored at key by one. If the second argument is filled, it will be used as the integer -value of the decrement.', -'Redis::del' => 'Remove specified keys.', -'Redis::delete' => '`@return int` Number of keys deleted.', -'Redis::dump' => 'Dump a key out of a redis database, the value of which can later be passed into redis using the RESTORE command. -The data that comes out of DUMP is a binary representation of the key as Redis stores it.', -'Redis::echo' => 'Echo the given string', -'Redis::evalSha' => 'Evaluate a LUA script serverside, from the SHA1 hash of the script instead of the script itself. -In order to run this command Redis will have to have already loaded the script, either by running it or via -the SCRIPT LOAD command.', -'Redis::evaluate' => '`@return mixed` @see eval()', -'Redis::exists' => 'Verify if the specified key/keys exists.', -'Redis::expire' => 'Sets an expiration date (a timeout) on an item.', -'Redis::expireAt' => 'Sets an expiration date (a timestamp) on an item.', -'Redis::flushAll' => 'Removes all entries from all databases.', -'Redis::flushDB' => 'Removes all entries from the current database.', -'Redis::get' => 'Get the value related to the specified key', -'Redis::getBit' => 'Return a single bit out of a larger string', -'Redis::getLastError' => 'The last error message (if any)', -'Redis::getMode' => 'Detect whether we\'re in ATOMIC/MULTI/PIPELINE mode.', -'Redis::getMultiple' => 'Get the values of all the specified keys. If one or more keys don\'t exist, the array will contain FALSE at the -position of the key.', -'Redis::getOption' => 'Get client option', -'Redis::getRange' => 'Return a substring of a larger string', -'Redis::getSet' => 'Sets a value and returns the previous entry at that key.', -'Redis::hDel' => 'Removes a values from the hash stored at key. -If the hash table doesn\'t exist, or the key doesn\'t exist, FALSE is returned.', -'Redis::hExists' => 'Verify if the specified member exists in a key.', -'Redis::hGet' => 'Gets a value from the hash stored at key. -If the hash table doesn\'t exist, or the key doesn\'t exist, FALSE is returned.', -'Redis::hGetAll' => 'Returns the whole hash, as an array of strings indexed by strings.', -'Redis::hIncrBy' => 'Increments the value of a member from a hash by a given amount.', -'Redis::hIncrByFloat' => 'Increment the float value of a hash field by the given amount', -'Redis::hKeys' => 'Returns the keys in a hash, as an array of strings.', -'Redis::hLen' => 'Returns the length of a hash, in number of items', -'Redis::hMGet' => 'Retirieve the values associated to the specified fields in the hash.', -'Redis::hMSet' => 'Fills in a whole hash. Non-string values are converted to string, using the standard (string) cast. -NULL values are stored as empty strings', -'Redis::hScan' => 'Scan a HASH value for members, with an optional pattern and count.', -'Redis::hSet' => 'Adds a value to the hash stored at key. If this value is already in the hash, FALSE is returned.', -'Redis::hSetNx' => 'Adds a value to the hash stored at key only if this field isn\'t already in the hash.', -'Redis::hVals' => 'Returns the values in a hash, as an array of strings.', -'Redis::incr' => 'Increment the number stored at key by one.', -'Redis::incrBy' => 'Increment the number stored at key by one. If the second argument is filled, it will be used as the integer -value of the increment.', -'Redis::incrByFloat' => 'Increment the float value of a key by the given amount', -'Redis::info' => 'Returns an associative array of strings and integers', -'Redis::keys' => 'Returns the keys that match a certain pattern.', -'Redis::lastSave' => 'Returns the timestamp of the last disk save.', -'Redis::lIndex' => 'Return the specified element of the list stored at the specified key. -0 the first element, 1 the second ... -1 the last element, -2 the penultimate ... -Return FALSE in case of a bad index or a key that doesn\'t point to a list.', -'Redis::lInsert' => 'Insert value in the list before or after the pivot value. the parameter options -specify the position of the insert (before or after). If the list didn\'t exists, -or the pivot didn\'t exists, the value is not inserted.', -'Redis::lLen' => 'Returns the size of a list identified by Key. If the list didn\'t exist or is empty, -the command returns 0. If the data type identified by Key is not a list, the command return FALSE.', -'Redis::lPop' => 'Returns and removes the first element of the list.', -'Redis::lPush' => 'Adds the string values to the head (left) of the list. Creates the list if the key didn\'t exist. -If the key exists and is not a list, FALSE is returned.', -'Redis::lPushx' => 'Adds the string value to the head (left) of the list if the list exists.', -'Redis::lRange' => 'Returns the specified elements of the list stored at the specified key in -the range [start, end]. start and stop are interpreted as indices: 0 the first element, -1 the second ... -1 the last element, -2 the penultimate ...', -'Redis::lRem' => 'Removes the first count occurrences of the value element from the list. -If count is zero, all the matching elements are removed. If count is negative, -elements are removed from tail to head.', -'Redis::lSet' => 'Set the list at index with the new value.', -'Redis::lSize' => '`@return int` The size of the list identified by Key exists.', -'Redis::lTrim' => 'Trims an existing list so that it will contain only a specified range of elements.', -'Redis::mget' => 'Returns the values of all specified keys. - -For every key that does not hold a string value or does not exist, -the special value false is returned. Because of this, the operation never fails.', -'Redis::migrate' => 'Migrates a key to a different Redis instance.', -'Redis::move' => 'Moves a key to a different database.', -'Redis::mset' => 'Sets multiple key-value pairs in one atomic command. -MSETNX only returns TRUE if all the keys were set (see SETNX).', -'Redis::msetnx' => '`@return int` 1 (if the keys were set) or 0 (no key was set)', -'Redis::multi' => 'Enter and exit transactional mode.', -'Redis::object' => 'Describes the object pointed to by a key. -The information to retrieve (string) and the key (string). -Info can be one of the following: -- "encoding" -- "refcount" -- "idletime"', -'Redis::pconnect' => 'Connects to a Redis instance or reuse a connection already established with pconnect/popen. - -The connection will not be closed on close or end of request until the php process ends. -So be patient on to many open FD\'s (specially on redis server side) when using persistent connections on -many servers connecting to one redis server. - -Also more than one persistent connection can be made identified by either host + port + timeout -or host + persistent_id or unix socket + timeout. - -This feature is not available in threaded versions. pconnect and popen then working like their non persistent -equivalents.', -'Redis::persist' => 'Remove the expiration timer from a key.', -'Redis::pExpire' => 'Sets an expiration date (a timeout in milliseconds) on an item.', -'Redis::pExpireAt' => 'Sets an expiration date (a timestamp) on an item. Requires a timestamp in milliseconds', -'Redis::pfAdd' => 'Adds all the element arguments to the HyperLogLog data structure stored at the key.', -'Redis::pfCount' => 'When called with a single key, returns the approximated cardinality computed by the HyperLogLog data -structure stored at the specified variable, which is 0 if the variable does not exist.', -'Redis::pfMerge' => 'Merge multiple HyperLogLog values into an unique value that will approximate the cardinality -of the union of the observed Sets of the source HyperLogLog structures.', -'Redis::ping' => 'Check the current connection status', -'Redis::psetex' => 'Set the string value in argument as value of the key, with a time to live.', -'Redis::psubscribe' => 'Subscribe to channels by pattern', -'Redis::pttl' => 'Returns a time to live left for a given key, in milliseconds. - -If the key doesn\'t exist, FALSE is returned.', -'Redis::publish' => 'Publish messages to channels. Warning: this function will probably change in the future.', -'Redis::pubsub' => 'A command allowing you to get information on the Redis pub/sub system.', -'Redis::randomKey' => 'Returns a random key.', -'Redis::rawCommand' => 'Send arbitrary things to the redis server.', -'Redis::rename' => 'Renames a key.', -'Redis::renameNx' => 'Renames a key. - -Same as rename, but will not replace a key if the destination already exists. -This is the same behaviour as setNx.', -'Redis::resetStat' => 'Resets the statistics reported by Redis using the INFO command (`info()` function). -These are the counters that are reset: - - Keyspace hits - - Keyspace misses - - Number of commands processed - - Number of connections received - - Number of expired keys', -'Redis::restore' => 'Restore a key from the result of a DUMP operation.', -'Redis::rPop' => 'Returns and removes the last element of the list.', -'Redis::rpoplpush' => 'Pops a value from the tail of a list, and pushes it to the front of another list. -Also return this value.', -'Redis::rPush' => 'Adds the string values to the tail (right) of the list. Creates the list if the key didn\'t exist. -If the key exists and is not a list, FALSE is returned.', -'Redis::rPushx' => 'Adds the string value to the tail (right) of the list if the list exists. FALSE in case of Failure.', -'Redis::sAdd' => 'Adds a values to the set value stored at key. -If this value is already in the set, FALSE is returned.', -'Redis::sAddArray' => 'Adds a values to the set value stored at key.', -'Redis::save' => 'Performs a synchronous save.', -'Redis::scan' => 'Scan the keyspace for keys.', -'Redis::sCard' => 'Returns the cardinality of the set identified by key.', -'Redis::script' => 'Execute the Redis SCRIPT command to perform various operations on the scripting subsystem.', -'Redis::sDiff' => 'Performs the difference between N sets and returns it.', -'Redis::sDiffStore' => 'Performs the same action as sDiff, but stores the result in the first key', -'Redis::select' => 'Switches to a given database.', -'Redis::set' => 'Set the string value in argument as value of the key.', -'Redis::setBit' => 'Changes a single bit of a string.', -'Redis::setex' => 'Set the string value in argument as value of the key, with a time to live.', -'Redis::setnx' => 'Set the string value in argument as value of the key if the key doesn\'t already exist in the database.', -'Redis::setOption' => 'Set client option.', -'Redis::setRange' => 'Changes a substring of a larger string.', -'Redis::sInter' => 'Returns the members of a set resulting from the intersection of all the sets -held at the specified keys. If just a single key is specified, then this command -produces the members of this set. If one of the keys is missing, FALSE is returned.', -'Redis::sInterStore' => 'Performs a sInter command and stores the result in a new set.', -'Redis::sIsMember' => 'Checks if value is a member of the set stored at the key key.', -'Redis::slaveof' => 'Changes the slave status -Either host and port, or no parameter to stop being a slave.', -'Redis::slowlog' => 'Access the Redis slow log.', -'Redis::sMembers' => 'Returns the contents of a set.', -'Redis::sMove' => 'Moves the specified member from the set at srcKey to the set at dstKey.', -'Redis::sort' => 'Sort', -'Redis::sPop' => 'Removes and returns a random element from the set value at Key.', -'Redis::sRandMember' => 'Returns a random element(s) from the set value at Key, without removing it.', -'Redis::sRem' => 'Removes the specified members from the set value stored at key.', -'Redis::sScan' => 'Scan a set for members.', -'Redis::strlen' => 'Get the length of a string value.', -'Redis::subscribe' => 'Subscribe to channels. Warning: this function will probably change in the future.', -'Redis::substr' => 'Return a substring of a larger string', -'Redis::sUnion' => 'Performs the union between N sets and returns it.', -'Redis::sUnionStore' => 'Performs the same action as sUnion, but stores the result in the first key', -'Redis::time' => 'Return the current Redis server time.', -'Redis::ttl' => 'Returns the time to live left for a given key, in seconds. If the key doesn\'t exist, FALSE is returned.', -'Redis::type' => 'Returns the type of data pointed by a given key.', -'Redis::wait' => 'Blocks the current client until all the previous write commands are successfully transferred and -acknowledged by at least the specified number of slaves.', -'Redis::watch' => 'Watches a key for modifications by another client. If the key is modified between WATCH and EXEC, -the MULTI/EXEC transaction will fail (return FALSE). unwatch cancels all the watching of all keys by this client.', -'Redis::xAck' => 'Acknowledge one or more messages on behalf of a consumer group.', -'Redis::xAdd' => 'Add a message to a stream.', -'Redis::xClaim' => 'Claim ownership of one or more pending messages.', -'Redis::xDel' => 'Delete one or more messages from a stream.', -'Redis::xGroup' => '`@return mixed` This command returns different types depending on the specific XGROUP command executed.', -'Redis::xInfo' => 'Get information about a stream or consumer groups.', -'Redis::xLen' => 'Get the length of a given stream.', -'Redis::xPending' => 'Get information about pending messages in a given stream.', -'Redis::xRange' => 'Get a range of messages from a given stream.', -'Redis::xRead' => 'Read data from one or more streams and only return IDs greater than sent in the command.', -'Redis::xReadGroup' => 'This method is similar to xRead except that it supports reading messages for a specific consumer group.', -'Redis::xRevRange' => 'This is identical to xRange except the results come back in reverse order. Also note that Redis reverses the order of "start" and "end".', -'Redis::xTrim' => 'Trim the stream length to a given maximum. If the "approximate" flag is pasesed, Redis will use your size as a hint but only trim trees in whole nodes (this is more efficient)..', -'Redis::zAdd' => 'Adds the specified member with a given score to the sorted set stored at key.', -'Redis::zCard' => 'Returns the cardinality of an ordered set.', -'Redis::zCount' => 'Returns the number of elements of the sorted set stored at the specified key which have -scores in the range [start,end]. Adding a parenthesis before start or end excludes it -from the range. +inf and -inf are also valid limits.', -'Redis::zDelete' => '`@return int` Number of deleted values', -'Redis::zIncrBy' => 'Increments the score of a member from a sorted set by a given amount.', -'Redis::zInter' => 'Creates an intersection of sorted sets given in second argument. -The result of the union will be stored in the sorted set defined by the first argument. -The third optional argument defines weights to apply to the sorted sets in input. -In this case, the weights will be multiplied by the score of each element in the sorted set -before applying the aggregation. The forth argument defines the AGGREGATE option which -specify how the results of the union are aggregated.', -'Redis::zRange' => 'Returns a range of elements from the ordered set stored at the specified key, -with values in the range [start, end]. start and stop are interpreted as zero-based indices: -0 the first element, -1 the second ... --1 the last element, --2 the penultimate ...', -'Redis::zRangeByLex' => 'Returns a lexigraphical range of members in a sorted set, assuming the members have the same score. The -min and max values are required to start with \'(\' (exclusive), \'[\' (inclusive), or be exactly the values -\'-\' (negative inf) or \'+\' (positive inf). The command must be called with either three *or* five -arguments or will return FALSE.', -'Redis::zRangeByScore' => 'Returns the elements of the sorted set stored at the specified key which have scores in the -range [start,end]. Adding a parenthesis before start or end excludes it from the range. -+inf and -inf are also valid limits. - -zRevRangeByScore returns the same items in reverse order, when the start and end parameters are swapped.', -'Redis::zRank' => 'Returns the rank of a given member in the specified sorted set, starting at 0 for the item -with the smallest score. zRevRank starts at 0 for the item with the largest score.', -'Redis::zRem' => 'Deletes a specified member from the ordered set.', -'Redis::zRemRangeByRank' => 'Deletes the elements of the sorted set stored at the specified key which have rank in the range [start,end].', -'Redis::zRemRangeByScore' => 'Deletes the elements of the sorted set stored at the specified key which have scores in the range [start,end].', -'Redis::zRevRange' => 'Returns the elements of the sorted set stored at the specified key in the range [start, end] -in reverse order. start and stop are interpreted as zero-based indices: -0 the first element, -1 the second ... --1 the last element, --2 the penultimate ...', -'Redis::zRevRank' => '`@return int` the item\'s score', -'Redis::zScan' => 'Scan a sorted set for members, with optional pattern and count.', -'Redis::zScore' => 'Returns the score of a given member in the specified sorted set.', -'Redis::zUnion' => 'Creates an union of sorted sets given in second argument. -The result of the union will be stored in the sorted set defined by the first argument. -The third optionnel argument defines weights to apply to the sorted sets in input. -In this case, the weights will be multiplied by the score of each element in the sorted set -before applying the aggregation. The forth argument defines the AGGREGATE option which -specify how the results of the union are aggregated.', -'RedisArray::__construct' => 'Constructor', -'RedisArray::_function' => '`@return string` the name of the function used to extract key parts during consistent hashing', -'RedisArray::_hosts' => '`@return array` list of hosts for the selected array', -'RedisArray::_rehash' => 'Use this function when a new node is added and keys need to be rehashed.', -'RedisArray::_target' => '`@return string` the host to be used for a certain key', -'RedisCluster::__construct' => 'Creates a Redis Cluster client', -'RedisCluster::_masters' => 'Return all redis master nodes', -'RedisCluster::_prefix' => 'A utility method to prefix the value with the prefix setting for phpredis.', -'RedisCluster::_serialize' => 'A utility method to serialize values manually. This method allows you to serialize a value with whatever -serializer is configured, manually. This can be useful for serialization/unserialization of data going in -and out of EVAL commands as phpredis can\'t automatically do this itself. Note that if no serializer is -set, phpredis will change Array values to \'Array\', and Objects to \'Object\'.', -'RedisCluster::_unserialize' => 'A utility method to unserialize data with whatever serializer is set up. If there is no serializer set, the -value will be returned unchanged. If there is a serializer set up, and the data passed in is malformed, an -exception will be thrown. This can be useful if phpredis is serializing values, and you return something from -redis in a LUA script that is serialized.', -'RedisCluster::append' => 'Append specified string to the string stored in specified key.', -'RedisCluster::bgrewriteaof' => 'Starts the background rewrite of AOF (Append-Only File) at a specific node.', -'RedisCluster::bgsave' => 'Performs a background save at a specific node.', -'RedisCluster::bitCount' => 'Count bits in a string.', -'RedisCluster::bitOp' => 'Bitwise operation on multiple keys.', -'RedisCluster::bitpos' => 'Return the position of the first bit set to 1 or 0 in a string. The position is returned, thinking of the -string as an array of bits from left to right, where the first byte\'s most significant bit is at position 0, -the second byte\'s most significant bit is at position 8, and so forth.', -'RedisCluster::blPop' => 'BLPOP is a blocking list pop primitive. -It is the blocking version of LPOP because it blocks the connection when -there are no elements to pop from any of the given lists. -An element is popped from the head of the first list that is non-empty, -with the given keys being checked in the order that they are given.', -'RedisCluster::brPop' => 'BRPOP is a blocking list pop primitive. -It is the blocking version of RPOP because it blocks the connection when -there are no elements to pop from any of the given lists. -An element is popped from the tail of the first list that is non-empty, -with the given keys being checked in the order that they are given. -See the BLPOP documentation(https://redis.io/commands/blpop) for the exact semantics, -since BRPOP is identical to BLPOP with the only difference being that -it pops elements from the tail of a list instead of popping from the head.', -'RedisCluster::brpoplpush' => 'A blocking version of rpoplpush, with an integral timeout in the third parameter.', -'RedisCluster::clearLastError' => 'Clear the last error message', -'RedisCluster::client' => 'Allows you to get information of the cluster client', -'RedisCluster::close' => 'Disconnects from the Redis instance, except when pconnect is used.', -'RedisCluster::command' => 'Returns Array reply of details about all Redis Cluster commands.', -'RedisCluster::config' => 'Get or Set the redis config keys.', -'RedisCluster::dbSize' => 'Returns the current database\'s size at a specific node.', -'RedisCluster::decr' => 'Decrement the number stored at key by one.', -'RedisCluster::decrBy' => 'Decrement the number stored at key by one. If the second argument is filled, it will be used as the integer -value of the decrement.', -'RedisCluster::del' => 'Remove specified keys.', -'RedisCluster::dump' => 'Dump a key out of a redis database, the value of which can later be passed into redis using the RESTORE command. -The data that comes out of DUMP is a binary representation of the key as Redis stores it.', -'RedisCluster::echo' => 'Returns message.', -'RedisCluster::evalSha' => 'Evaluate a LUA script serverside, from the SHA1 hash of the script instead of the script itself. -In order to run this command Redis will have to have already loaded the script, either by running it or via -the SCRIPT LOAD command.', -'RedisCluster::exists' => 'Verify if the specified key exists.', -'RedisCluster::expire' => 'Sets an expiration date (a timeout) on an item.', -'RedisCluster::expireAt' => 'Sets an expiration date (a timestamp) on an item.', -'RedisCluster::flushAll' => 'Removes all entries from all databases at a specific node.', -'RedisCluster::flushDB' => 'Removes all entries from the current database at a specific node.', -'RedisCluster::geoAdd' => 'Add one or more geospatial items in the geospatial index represented using a sorted set', -'RedisCluster::geoDist' => 'Returns the distance between two members of a geospatial index', -'RedisCluster::geohash' => 'Returns members of a geospatial index as standard geohash strings', -'RedisCluster::geopos' => 'Returns longitude and latitude of members of a geospatial index', -'RedisCluster::geoRadius' => 'Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point', -'RedisCluster::geoRadiusByMember' => 'Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member', -'RedisCluster::get' => 'Get the value related to the specified key', -'RedisCluster::getBit' => 'Return a single bit out of a larger string', -'RedisCluster::getLastError' => 'The last error message (if any)', -'RedisCluster::getMode' => 'Detect whether we\'re in ATOMIC/MULTI/PIPELINE mode.', -'RedisCluster::getOption' => 'Get client option', -'RedisCluster::getRange' => 'Return a substring of a larger string', -'RedisCluster::getSet' => 'Sets a value and returns the previous entry at that key.', -'RedisCluster::hDel' => 'Removes a values from the hash stored at key. -If the hash table doesn\'t exist, or the key doesn\'t exist, FALSE is returned.', -'RedisCluster::hExists' => 'Verify if the specified member exists in a key.', -'RedisCluster::hGet' => 'Gets a value from the hash stored at key. -If the hash table doesn\'t exist, or the key doesn\'t exist, FALSE is returned.', -'RedisCluster::hGetAll' => 'Returns the whole hash, as an array of strings indexed by strings.', -'RedisCluster::hIncrBy' => 'Increments the value of a member from a hash by a given amount.', -'RedisCluster::hIncrByFloat' => 'Increment the float value of a hash field by the given amount', -'RedisCluster::hKeys' => 'Returns the keys in a hash, as an array of strings.', -'RedisCluster::hLen' => 'Returns the length of a hash, in number of items', -'RedisCluster::hMGet' => 'Retirieve the values associated to the specified fields in the hash.', -'RedisCluster::hMSet' => 'Fills in a whole hash. Non-string values are converted to string, using the standard (string) cast. -NULL values are stored as empty strings', -'RedisCluster::hScan' => 'Scan a HASH value for members, with an optional pattern and count.', -'RedisCluster::hSet' => 'Adds a value to the hash stored at key. If this value is already in the hash, FALSE is returned.', -'RedisCluster::hSetNx' => 'Adds a value to the hash stored at key only if this field isn\'t already in the hash.', -'RedisCluster::hVals' => 'Returns the values in a hash, as an array of strings.', -'RedisCluster::incr' => 'Increment the number stored at key by one.', -'RedisCluster::incrBy' => 'Increment the number stored at key by one. If the second argument is filled, it will be used as the integer -value of the increment.', -'RedisCluster::incrByFloat' => 'Increment the float value of a key by the given amount', -'RedisCluster::info' => 'Returns an associative array of strings and integers', -'RedisCluster::keys' => 'Returns the keys that match a certain pattern.', -'RedisCluster::lastSave' => 'Returns the timestamp of the last disk save at a specific node.', -'RedisCluster::lIndex' => 'Return the specified element of the list stored at the specified key. -0 the first element, 1 the second ... -1 the last element, -2 the penultimate ... -Return FALSE in case of a bad index or a key that doesn\'t point to a list.', -'RedisCluster::lInsert' => 'Insert value in the list before or after the pivot value. the parameter options -specify the position of the insert (before or after). If the list didn\'t exists, -or the pivot didn\'t exists, the value is not inserted.', -'RedisCluster::lLen' => 'Returns the size of a list identified by Key. If the list didn\'t exist or is empty, -the command returns 0. If the data type identified by Key is not a list, the command return FALSE.', -'RedisCluster::lPop' => 'Returns and removes the first element of the list.', -'RedisCluster::lPush' => 'Adds the string values to the head (left) of the list. Creates the list if the key didn\'t exist. -If the key exists and is not a list, FALSE is returned.', -'RedisCluster::lPushx' => 'Adds the string value to the head (left) of the list if the list exists.', -'RedisCluster::lRange' => 'Returns the specified elements of the list stored at the specified key in -the range [start, end]. start and stop are interpreted as indices: 0 the first element, -1 the second ... -1 the last element, -2 the penultimate ...', -'RedisCluster::lRem' => 'Removes the first count occurrences of the value element from the list. -If count is zero, all the matching elements are removed. If count is negative, -elements are removed from tail to head.', -'RedisCluster::lSet' => 'Set the list at index with the new value.', -'RedisCluster::lTrim' => 'Trims an existing list so that it will contain only a specified range of elements.', -'RedisCluster::mget' => 'Returns the values of all specified keys. - -For every key that does not hold a string value or does not exist, -the special value false is returned. Because of this, the operation never fails.', -'RedisCluster::mset' => 'Sets multiple key-value pairs in one atomic command. -MSETNX only returns TRUE if all the keys were set (see SETNX).', -'RedisCluster::msetnx' => '`@return int` 1 (if the keys were set) or 0 (no key was set)', -'RedisCluster::multi' => 'Enter and exit transactional mode.', -'RedisCluster::object' => 'Describes the object pointed to by a key. -The information to retrieve (string) and the key (string). -Info can be one of the following: -- "encoding" -- "refcount" -- "idletime"', -'RedisCluster::persist' => 'Remove the expiration timer from a key.', -'RedisCluster::pExpire' => 'Sets an expiration date (a timeout in milliseconds) on an item.', -'RedisCluster::pExpireAt' => 'Sets an expiration date (a timestamp) on an item. Requires a timestamp in milliseconds', -'RedisCluster::pfAdd' => 'Adds all the element arguments to the HyperLogLog data structure stored at the key.', -'RedisCluster::pfCount' => 'When called with a single key, returns the approximated cardinality computed by the HyperLogLog data -structure stored at the specified variable, which is 0 if the variable does not exist.', -'RedisCluster::pfMerge' => 'Merge multiple HyperLogLog values into an unique value that will approximate the cardinality -of the union of the observed Sets of the source HyperLogLog structures.', -'RedisCluster::ping' => 'Check the specified node status', -'RedisCluster::psetex' => 'PSETEX works exactly like SETEX with the sole difference that the expire time is specified in milliseconds -instead of seconds.', -'RedisCluster::psubscribe' => 'Subscribe to channels by pattern', -'RedisCluster::pttl' => 'Returns the remaining time to live of a key that has an expire set, -with the sole difference that TTL returns the amount of remaining time in seconds while PTTL returns it in -milliseconds. In Redis 2.6 or older the command returns -1 if the key does not exist or if the key exist but has -no associated expire. Starting with Redis 2.8 the return value in case of error changed: Returns -2 if the key -does not exist. Returns -1 if the key exists but has no associated expire.', -'RedisCluster::publish' => 'Publish messages to channels. Warning: this function will probably change in the future.', -'RedisCluster::pubsub' => 'A command allowing you to get information on the Redis pub/sub system.', -'RedisCluster::punSubscribe' => 'Unsubscribes the client from the given patterns, or from all of them if none is given.', -'RedisCluster::randomKey' => 'Returns a random key at the specified node', -'RedisCluster::rawCommand' => 'Send arbitrary things to the redis server at the specified node', -'RedisCluster::rename' => 'Renames a key.', -'RedisCluster::renameNx' => 'Renames a key. - -Same as rename, but will not replace a key if the destination already exists. -This is the same behaviour as setNx.', -'RedisCluster::restore' => 'Restore a key from the result of a DUMP operation.', -'RedisCluster::rPop' => 'Returns and removes the last element of the list.', -'RedisCluster::rpoplpush' => 'Pops a value from the tail of a list, and pushes it to the front of another list. -Also return this value.', -'RedisCluster::rPush' => 'Adds the string values to the tail (right) of the list. Creates the list if the key didn\'t exist. -If the key exists and is not a list, FALSE is returned.', -'RedisCluster::rPushx' => 'Adds the string value to the tail (right) of the list if the list exists. FALSE in case of Failure.', -'RedisCluster::sAdd' => 'Adds a values to the set value stored at key. -If this value is already in the set, FALSE is returned.', -'RedisCluster::sAddArray' => 'Adds a values to the set value stored at key. -If this value is already in the set, FALSE is returned.', -'RedisCluster::save' => 'Performs a synchronous save at a specific node.', -'RedisCluster::scan' => 'Scan the keyspace for keys.', -'RedisCluster::sCard' => 'Returns the set cardinality (number of elements) of the set stored at key.', -'RedisCluster::script' => 'Execute the Redis SCRIPT command to perform various operations on the scripting subsystem.', -'RedisCluster::sDiff' => 'Performs the difference between N sets and returns it.', -'RedisCluster::sDiffStore' => 'Performs the same action as sDiff, but stores the result in the first key', -'RedisCluster::set' => 'Set the string value in argument as value of the key.', -'RedisCluster::setBit' => 'Changes a single bit of a string.', -'RedisCluster::setex' => 'Set the string value in argument as value of the key, with a time to live.', -'RedisCluster::setnx' => 'Set the string value in argument as value of the key if the key doesn\'t already exist in the database.', -'RedisCluster::setOption' => 'Set client option.', -'RedisCluster::setRange' => 'Changes a substring of a larger string.', -'RedisCluster::sInter' => 'Returns the members of a set resulting from the intersection of all the sets -held at the specified keys. If just a single key is specified, then this command -produces the members of this set. If one of the keys is missing, FALSE is returned.', -'RedisCluster::sInterStore' => 'Performs a sInter command and stores the result in a new set.', -'RedisCluster::sIsMember' => 'Returns if member is a member of the set stored at key.', -'RedisCluster::slowLog' => 'This function is used in order to read and reset the Redis slow queries log.', -'RedisCluster::sMembers' => 'Returns all the members of the set value stored at key. -This has the same effect as running SINTER with one argument key.', -'RedisCluster::sMove' => 'Moves the specified member from the set at srcKey to the set at dstKey.', -'RedisCluster::sort' => 'Sort', -'RedisCluster::sPop' => 'Removes and returns a random element from the set value at Key.', -'RedisCluster::sRandMember' => 'Returns a random element(s) from the set value at Key, without removing it.', -'RedisCluster::sRem' => 'Removes the specified members from the set value stored at key.', -'RedisCluster::sScan' => 'Scan a set for members.', -'RedisCluster::strlen' => 'Get the length of a string value.', -'RedisCluster::subscribe' => 'Subscribe to channels. Warning: this function will probably change in the future.', -'RedisCluster::sUnion' => 'Performs the union between N sets and returns it.', -'RedisCluster::sUnionStore' => 'Performs the same action as sUnion, but stores the result in the first key', -'RedisCluster::time' => 'Return the specified node server time.', -'RedisCluster::ttl' => 'Returns the remaining time to live of a key that has a timeout. -This introspection capability allows a Redis client to check how many seconds a given key will continue to be -part of the dataset. In Redis 2.6 or older the command returns -1 if the key does not exist or if the key exist -but has no associated expire. Starting with Redis 2.8 the return value in case of error changed: Returns -2 if -the key does not exist. Returns -1 if the key exists but has no associated expire.', -'RedisCluster::type' => 'Returns the type of data pointed by a given key.', -'RedisCluster::unSubscribe' => 'Unsubscribes the client from the given channels, or from all of them if none is given.', -'RedisCluster::watch' => 'Watches a key for modifications by another client. If the key is modified between WATCH and EXEC, -the MULTI/EXEC transaction will fail (return FALSE). unwatch cancels all the watching of all keys by this client.', -'RedisCluster::zAdd' => 'Adds the specified member with a given score to the sorted set stored at key.', -'RedisCluster::zCard' => 'Returns the cardinality of an ordered set.', -'RedisCluster::zCount' => 'Returns the number of elements of the sorted set stored at the specified key which have -scores in the range [start,end]. Adding a parenthesis before start or end excludes it -from the range. +inf and -inf are also valid limits.', -'RedisCluster::zIncrBy' => 'Increments the score of a member from a sorted set by a given amount.', -'RedisCluster::zInterStore' => 'Intersect multiple sorted sets and store the resulting sorted set in a new key', -'RedisCluster::zLexCount' => 'Count the number of members in a sorted set between a given lexicographical range.', -'RedisCluster::zRange' => 'Returns a range of elements from the ordered set stored at the specified key, -with values in the range [start, end]. start and stop are interpreted as zero-based indices: -0 the first element, -1 the second ... --1 the last element, --2 the penultimate ...', -'RedisCluster::zRangeByLex' => 'Returns a range of members in a sorted set, by lexicographical range', -'RedisCluster::zRangeByScore' => 'Returns the elements of the sorted set stored at the specified key which have scores in the -range [start,end]. Adding a parenthesis before start or end excludes it from the range. -+inf and -inf are also valid limits. - -zRevRangeByScore returns the same items in reverse order, when the start and end parameters are swapped.', -'RedisCluster::zRank' => 'Returns the rank of a given member in the specified sorted set, starting at 0 for the item -with the smallest score. zRevRank starts at 0 for the item with the largest score.', -'RedisCluster::zRem' => 'Deletes a specified member from the ordered set.', -'RedisCluster::zRemRangeByLex' => 'Remove all members in a sorted set between the given lexicographical range.', -'RedisCluster::zRemRangeByRank' => 'Deletes the elements of the sorted set stored at the specified key which have rank in the range [start,end].', -'RedisCluster::zRemRangeByScore' => 'Deletes the elements of the sorted set stored at the specified key which have scores in the range [start,end].', -'RedisCluster::zRevRange' => 'Returns the elements of the sorted set stored at the specified key in the range [start, end] -in reverse order. start and stop are interpreted as zero-based indices: -0 the first element, -1 the second ... --1 the last element, --2 the penultimate ...', -'RedisCluster::zRevRank' => '`@return int` the item\'s score', -'RedisCluster::zScan' => 'Scan a sorted set for members, with optional pattern and count.', -'RedisCluster::zScore' => 'Returns the score of a given member in the specified sorted set.', -'RedisCluster::zUnionStore' => 'Add multiple sorted sets and store the resulting sorted set in a new key', -'referenceMapObj::convertToString' => 'Saves the object to a string. Provides the inverse option for -updateFromString.', -'referenceMapObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the -resources.', -'referenceMapObj::set' => 'Set object property to a new value.', -'referenceMapObj::updateFromString' => 'Update a referenceMap object from a string snippet. -Returns MS_SUCCESS/MS_FAILURE.', -'reflection::export' => 'Exports', -'reflection::getModifierNames' => 'Gets modifier names', -'ReflectionClass::__clone' => 'Clones object', -'reflectionclass::__construct' => 'Constructs a ReflectionClass', -'reflectionclass::__toString' => 'Returns the string representation of the ReflectionClass object', -'reflectionclass::export' => 'Exports a class', -'reflectionclass::getConstant' => 'Gets defined constant', -'reflectionclass::getConstants' => 'Gets constants', -'reflectionclass::getConstructor' => 'Gets the constructor of the class', -'reflectionclass::getDefaultProperties' => 'Gets default properties', -'reflectionclass::getDocComment' => 'Gets doc comments', -'reflectionclass::getEndLine' => 'Gets end line', -'reflectionclass::getExtension' => 'Gets a ReflectionExtension object for the extension which defined the class', -'reflectionclass::getExtensionName' => 'Gets the name of the extension which defined the class', -'reflectionclass::getFileName' => 'Gets the filename of the file in which the class has been defined', -'reflectionclass::getInterfaceNames' => 'Gets the interface names', -'reflectionclass::getInterfaces' => 'Gets the interfaces', -'reflectionclass::getMethod' => 'Gets a ReflectionMethod for a class method', -'reflectionclass::getMethods' => 'Gets an array of methods', -'reflectionclass::getModifiers' => 'Gets the class modifiers', -'reflectionclass::getName' => 'Gets class name', -'reflectionclass::getNamespaceName' => 'Gets namespace name', -'reflectionclass::getParentClass' => 'Gets parent class', -'reflectionclass::getProperties' => 'Gets properties', -'reflectionclass::getProperty' => 'Gets a ReflectionProperty for a class\'s property', -'reflectionclass::getReflectionConstant' => 'Gets a ReflectionClassConstant for a class\'s constant', -'reflectionclass::getReflectionConstants' => 'Gets class constants', -'reflectionclass::getShortName' => 'Gets short name', -'reflectionclass::getStartLine' => 'Gets starting line number', -'reflectionclass::getStaticProperties' => 'Gets static properties', -'reflectionclass::getStaticPropertyValue' => 'Gets static property value', -'reflectionclass::getTraitAliases' => 'Returns an array of trait aliases', -'reflectionclass::getTraitNames' => 'Returns an array of names of traits used by this class', -'reflectionclass::getTraits' => 'Returns an array of traits used by this class', -'reflectionclass::hasConstant' => 'Checks if constant is defined', -'reflectionclass::hasMethod' => 'Checks if method is defined', -'reflectionclass::hasProperty' => 'Checks if property is defined', -'reflectionclass::implementsInterface' => 'Implements interface', -'reflectionclass::inNamespace' => 'Checks if in namespace', -'reflectionclass::isAbstract' => 'Checks if class is abstract', -'reflectionclass::isAnonymous' => 'Checks if class is anonymous', -'reflectionclass::isCloneable' => 'Returns whether this class is cloneable', -'reflectionclass::isFinal' => 'Checks if class is final', -'reflectionclass::isInstance' => 'Checks class for instance', -'reflectionclass::isInstantiable' => 'Checks if the class is instantiable', -'reflectionclass::isInterface' => 'Checks if the class is an interface', -'reflectionclass::isInternal' => 'Checks if class is defined internally by an extension, or the core', -'reflectionclass::isIterable' => 'Check whether this class is iterable', -'reflectionclass::isIterateable' => 'Alias of ReflectionClass::isIterable', -'reflectionclass::isSubclassOf' => 'Checks if a subclass', -'reflectionclass::isTrait' => 'Returns whether this is a trait', -'reflectionclass::isUserDefined' => 'Checks if user defined', -'reflectionclass::newInstance' => 'Creates a new class instance from given arguments', -'reflectionclass::newInstanceArgs' => 'Creates a new class instance from given arguments', -'reflectionclass::newInstanceWithoutConstructor' => 'Creates a new class instance without invoking the constructor', -'reflectionclass::setStaticPropertyValue' => 'Sets static property value', -'reflectionclassconstant::__construct' => 'Constructs a ReflectionClassConstant', -'reflectionclassconstant::__toString' => 'Returns the string representation of the ReflectionClassConstant object', -'reflectionclassconstant::export' => 'Export', -'reflectionclassconstant::getDeclaringClass' => 'Gets declaring class', -'reflectionclassconstant::getDocComment' => 'Gets doc comments', -'reflectionclassconstant::getModifiers' => 'Gets the class constant modifiers', -'reflectionclassconstant::getName' => 'Get name of the constant', -'reflectionclassconstant::getValue' => 'Gets value', -'reflectionclassconstant::isPrivate' => 'Checks if class constant is private', -'reflectionclassconstant::isProtected' => 'Checks if class constant is protected', -'reflectionclassconstant::isPublic' => 'Checks if class constant is public', -'reflectionextension::__clone' => 'Clones', -'reflectionextension::__construct' => 'Constructs a ReflectionExtension', -'reflectionextension::__toString' => 'To string', -'reflectionextension::export' => 'Export', -'reflectionextension::getClasses' => 'Gets classes', -'reflectionextension::getClassNames' => 'Gets class names', -'reflectionextension::getConstants' => 'Gets constants', -'reflectionextension::getDependencies' => 'Gets dependencies', -'reflectionextension::getFunctions' => 'Gets extension functions', -'reflectionextension::getINIEntries' => 'Gets extension ini entries', -'reflectionextension::getName' => 'Gets extension name', -'reflectionextension::getVersion' => 'Gets extension version', -'reflectionextension::info' => 'Print extension info', -'reflectionextension::isPersistent' => 'Returns whether this extension is persistent', -'reflectionextension::isTemporary' => 'Returns whether this extension is temporary', -'ReflectionFunction::__clone' => 'Clones function', -'reflectionfunction::__construct' => 'Constructs a ReflectionFunction object', -'reflectionfunction::__toString' => 'To string', -'reflectionfunction::export' => 'Exports function', -'reflectionfunction::getClosure' => 'Returns a dynamically created closure for the function', -'ReflectionFunction::getClosureScopeClass' => 'Returns the scope associated to the closure', -'ReflectionFunction::getClosureThis' => 'Returns this pointer bound to closure', -'ReflectionFunction::getDocComment' => 'Gets doc comment', -'ReflectionFunction::getEndLine' => 'Gets end line number', -'ReflectionFunction::getExtension' => 'Gets extension info', -'ReflectionFunction::getExtensionName' => 'Gets extension name', -'ReflectionFunction::getFileName' => 'Gets file name', -'ReflectionFunction::getName' => 'Gets function name', -'ReflectionFunction::getNamespaceName' => 'Gets namespace name', -'ReflectionFunction::getNumberOfParameters' => 'Gets number of parameters', -'ReflectionFunction::getNumberOfRequiredParameters' => 'Gets number of required parameters', -'ReflectionFunction::getParameters' => 'Gets parameters', -'ReflectionFunction::getReturnType' => 'Gets the specified return type of a function', -'ReflectionFunction::getShortName' => 'Gets function short name', -'ReflectionFunction::getStartLine' => 'Gets starting line number', -'ReflectionFunction::getStaticVariables' => 'Gets static variables', -'ReflectionFunction::hasReturnType' => 'Checks if the function has a specified return type', -'ReflectionFunction::inNamespace' => 'Checks if function in namespace', -'reflectionfunction::invoke' => 'Invokes function', -'reflectionfunction::invokeArgs' => 'Invokes function args', -'ReflectionFunction::isClosure' => 'Checks if closure', -'ReflectionFunction::isDeprecated' => 'Checks if deprecated', -'reflectionfunction::isDisabled' => 'Checks if function is disabled', -'ReflectionFunction::isGenerator' => 'Returns whether this function is a generator', -'ReflectionFunction::isInternal' => 'Checks if is internal', -'ReflectionFunction::isUserDefined' => 'Checks if user defined', -'ReflectionFunction::isVariadic' => 'Checks if the function is variadic', -'ReflectionFunction::returnsReference' => 'Checks if returns reference', -'reflectionfunctionabstract::__clone' => 'Clones function', -'reflectionfunctionabstract::__toString' => 'To string', -'ReflectionFunctionAbstract::export' => 'Exports', -'reflectionfunctionabstract::getClosureScopeClass' => 'Returns the scope associated to the closure', -'reflectionfunctionabstract::getClosureThis' => 'Returns this pointer bound to closure', -'reflectionfunctionabstract::getDocComment' => 'Gets doc comment', -'reflectionfunctionabstract::getEndLine' => 'Gets end line number', -'reflectionfunctionabstract::getExtension' => 'Gets extension info', -'reflectionfunctionabstract::getExtensionName' => 'Gets extension name', -'reflectionfunctionabstract::getFileName' => 'Gets file name', -'reflectionfunctionabstract::getName' => 'Gets function name', -'reflectionfunctionabstract::getNamespaceName' => 'Gets namespace name', -'reflectionfunctionabstract::getNumberOfParameters' => 'Gets number of parameters', -'reflectionfunctionabstract::getNumberOfRequiredParameters' => 'Gets number of required parameters', -'reflectionfunctionabstract::getParameters' => 'Gets parameters', -'reflectionfunctionabstract::getReturnType' => 'Gets the specified return type of a function', -'reflectionfunctionabstract::getShortName' => 'Gets function short name', -'reflectionfunctionabstract::getStartLine' => 'Gets starting line number', -'reflectionfunctionabstract::getStaticVariables' => 'Gets static variables', -'reflectionfunctionabstract::hasReturnType' => 'Checks if the function has a specified return type', -'reflectionfunctionabstract::inNamespace' => 'Checks if function in namespace', -'reflectionfunctionabstract::isClosure' => 'Checks if closure', -'reflectionfunctionabstract::isDeprecated' => 'Checks if deprecated', -'reflectionfunctionabstract::isGenerator' => 'Returns whether this function is a generator', -'reflectionfunctionabstract::isInternal' => 'Checks if is internal', -'reflectionfunctionabstract::isUserDefined' => 'Checks if user defined', -'reflectionfunctionabstract::isVariadic' => 'Checks if the function is variadic', -'reflectionfunctionabstract::returnsReference' => 'Checks if returns reference', -'reflectiongenerator::__construct' => 'Constructs a ReflectionGenerator object', -'reflectiongenerator::getExecutingFile' => 'Gets the file name of the currently executing generator', -'reflectiongenerator::getExecutingGenerator' => 'Gets the executing Generator object', -'reflectiongenerator::getExecutingLine' => 'Gets the currently executing line of the generator', -'reflectiongenerator::getFunction' => 'Gets the function name of the generator', -'reflectiongenerator::getThis' => 'Gets the $this value of the generator', -'reflectiongenerator::getTrace' => 'Gets the trace of the executing generator', -'ReflectionMethod::__clone' => 'Clones function', -'reflectionmethod::__construct' => 'Constructs a ReflectionMethod', -'reflectionmethod::__toString' => 'Returns the string representation of the Reflection method object', -'reflectionmethod::export' => 'Export a reflection method', -'reflectionmethod::getClosure' => 'Returns a dynamically created closure for the method', -'ReflectionMethod::getClosureScopeClass' => 'Returns the scope associated to the closure', -'ReflectionMethod::getClosureThis' => 'Returns this pointer bound to closure', -'reflectionmethod::getDeclaringClass' => 'Gets declaring class for the reflected method', -'ReflectionMethod::getDocComment' => 'Gets doc comment', -'ReflectionMethod::getEndLine' => 'Gets end line number', -'ReflectionMethod::getExtension' => 'Gets extension info', -'ReflectionMethod::getExtensionName' => 'Gets extension name', -'ReflectionMethod::getFileName' => 'Gets file name', -'reflectionmethod::getModifiers' => 'Gets the method modifiers', -'ReflectionMethod::getName' => 'Gets function name', -'ReflectionMethod::getNamespaceName' => 'Gets namespace name', -'ReflectionMethod::getNumberOfParameters' => 'Gets number of parameters', -'ReflectionMethod::getNumberOfRequiredParameters' => 'Gets number of required parameters', -'ReflectionMethod::getParameters' => 'Gets parameters', -'reflectionmethod::getPrototype' => 'Gets the method prototype (if there is one)', -'ReflectionMethod::getReturnType' => 'Gets the specified return type of a function', -'ReflectionMethod::getShortName' => 'Gets function short name', -'ReflectionMethod::getStartLine' => 'Gets starting line number', -'ReflectionMethod::getStaticVariables' => 'Gets static variables', -'ReflectionMethod::hasReturnType' => 'Checks if the function has a specified return type', -'ReflectionMethod::inNamespace' => 'Checks if function in namespace', -'reflectionmethod::invoke' => 'Invoke', -'reflectionmethod::invokeArgs' => 'Invoke args', -'reflectionmethod::isAbstract' => 'Checks if method is abstract', -'ReflectionMethod::isClosure' => 'Checks if closure', -'reflectionmethod::isConstructor' => 'Checks if method is a constructor', -'ReflectionMethod::isDeprecated' => 'Checks if deprecated', -'reflectionmethod::isDestructor' => 'Checks if method is a destructor', -'reflectionmethod::isFinal' => 'Checks if method is final', -'ReflectionMethod::isGenerator' => 'Returns whether this function is a generator', -'ReflectionMethod::isInternal' => 'Checks if is internal', -'reflectionmethod::isPrivate' => 'Checks if method is private', -'reflectionmethod::isProtected' => 'Checks if method is protected', -'reflectionmethod::isPublic' => 'Checks if method is public', -'reflectionmethod::isStatic' => 'Checks if method is static', -'ReflectionMethod::isUserDefined' => 'Checks if user defined', -'ReflectionMethod::isVariadic' => 'Checks if the function is variadic', -'ReflectionMethod::returnsReference' => 'Checks if returns reference', -'reflectionmethod::setAccessible' => 'Set method accessibility', -'reflectionnamedtype::getName' => 'Get the text of the type hint', -'ReflectionObject::__clone' => 'Clones object', -'reflectionobject::__construct' => 'Constructs a ReflectionObject', -'ReflectionObject::__toString' => 'Returns the string representation of the ReflectionClass object', -'reflectionobject::export' => 'Export', -'ReflectionObject::getConstant' => 'Gets defined constant', -'ReflectionObject::getConstants' => 'Gets constants', -'ReflectionObject::getConstructor' => 'Gets the constructor of the class', -'ReflectionObject::getDefaultProperties' => 'Gets default properties', -'ReflectionObject::getDocComment' => 'Gets doc comments', -'ReflectionObject::getEndLine' => 'Gets end line', -'ReflectionObject::getExtension' => 'Gets a ReflectionExtension object for the extension which defined the class', -'ReflectionObject::getExtensionName' => 'Gets the name of the extension which defined the class', -'ReflectionObject::getFileName' => 'Gets the filename of the file in which the class has been defined', -'ReflectionObject::getInterfaceNames' => 'Gets the interface names', -'ReflectionObject::getInterfaces' => 'Gets the interfaces', -'ReflectionObject::getMethod' => 'Gets a ReflectionMethod for a class method', -'ReflectionObject::getMethods' => 'Gets an array of methods', -'ReflectionObject::getModifiers' => 'Gets the class modifiers', -'ReflectionObject::getName' => 'Gets class name', -'ReflectionObject::getNamespaceName' => 'Gets namespace name', -'ReflectionObject::getParentClass' => 'Gets parent class', -'ReflectionObject::getProperties' => 'Gets properties', -'ReflectionObject::getProperty' => 'Gets a ReflectionProperty for a class\'s property', -'ReflectionObject::getReflectionConstant' => 'Gets a ReflectionClassConstant for a class\'s constant', -'ReflectionObject::getReflectionConstants' => 'Gets class constants', -'ReflectionObject::getShortName' => 'Gets short name', -'ReflectionObject::getStartLine' => 'Gets starting line number', -'ReflectionObject::getStaticProperties' => 'Gets static properties', -'ReflectionObject::getStaticPropertyValue' => 'Gets static property value', -'ReflectionObject::getTraitAliases' => 'Returns an array of trait aliases', -'ReflectionObject::getTraitNames' => 'Returns an array of names of traits used by this class', -'ReflectionObject::getTraits' => 'Returns an array of traits used by this class', -'ReflectionObject::hasConstant' => 'Checks if constant is defined', -'ReflectionObject::hasMethod' => 'Checks if method is defined', -'ReflectionObject::hasProperty' => 'Checks if property is defined', -'ReflectionObject::implementsInterface' => 'Implements interface', -'ReflectionObject::inNamespace' => 'Checks if in namespace', -'ReflectionObject::isAbstract' => 'Checks if class is abstract', -'ReflectionObject::isAnonymous' => 'Checks if class is anonymous', -'ReflectionObject::isCloneable' => 'Returns whether this class is cloneable', -'ReflectionObject::isFinal' => 'Checks if class is final', -'ReflectionObject::isInstance' => 'Checks class for instance', -'ReflectionObject::isInstantiable' => 'Checks if the class is instantiable', -'ReflectionObject::isInterface' => 'Checks if the class is an interface', -'ReflectionObject::isInternal' => 'Checks if class is defined internally by an extension, or the core', -'ReflectionObject::isIterable' => 'Check whether this class is iterable', -'ReflectionObject::isIterateable' => 'Alias of ReflectionClass::isIterable', -'ReflectionObject::isSubclassOf' => 'Checks if a subclass', -'ReflectionObject::isTrait' => 'Returns whether this is a trait', -'ReflectionObject::isUserDefined' => 'Checks if user defined', -'ReflectionObject::newInstance' => 'Creates a new class instance from given arguments', -'ReflectionObject::newInstanceArgs' => 'Creates a new class instance from given arguments', -'ReflectionObject::newInstanceWithoutConstructor' => 'Creates a new class instance without invoking the constructor', -'ReflectionObject::setStaticPropertyValue' => 'Sets static property value', -'reflectionparameter::__clone' => 'Clone', -'reflectionparameter::__construct' => 'Construct', -'reflectionparameter::__toString' => 'To string', -'reflectionparameter::allowsNull' => 'Checks if null is allowed', -'reflectionparameter::canBePassedByValue' => 'Returns whether this parameter can be passed by value', -'reflectionparameter::export' => 'Exports', -'reflectionparameter::getClass' => 'Get the type hinted class', -'reflectionparameter::getDeclaringClass' => 'Gets declaring class', -'reflectionparameter::getDeclaringFunction' => 'Gets declaring function', -'reflectionparameter::getDefaultValue' => 'Gets default parameter value', -'reflectionparameter::getDefaultValueConstantName' => 'Returns the default value\'s constant name if default value is constant or null', -'reflectionparameter::getName' => 'Gets parameter name', -'reflectionparameter::getPosition' => 'Gets parameter position', -'reflectionparameter::getType' => 'Gets a parameter\'s type', -'reflectionparameter::hasType' => 'Checks if parameter has a type', -'reflectionparameter::isArray' => 'Checks if parameter expects an array', -'reflectionparameter::isCallable' => 'Returns whether parameter MUST be callable', -'reflectionparameter::isDefaultValueAvailable' => 'Checks if a default value is available', -'reflectionparameter::isDefaultValueConstant' => 'Returns whether the default value of this parameter is a constant', -'reflectionparameter::isOptional' => 'Checks if optional', -'reflectionparameter::isPassedByReference' => 'Checks if passed by reference', -'reflectionparameter::isVariadic' => 'Checks if the parameter is variadic', -'reflectionproperty::__clone' => 'Clone', -'reflectionproperty::__construct' => 'Construct a ReflectionProperty object', -'reflectionproperty::__toString' => 'To string', -'reflectionproperty::export' => 'Export', -'reflectionproperty::getDeclaringClass' => 'Gets declaring class', -'reflectionproperty::getDocComment' => 'Gets the property doc comment', -'reflectionproperty::getModifiers' => 'Gets the property modifiers', -'reflectionproperty::getName' => 'Gets property name', -'reflectionproperty::getValue' => 'Gets value', -'reflectionproperty::isDefault' => 'Checks if property is a default property', -'reflectionproperty::isPrivate' => 'Checks if property is private', -'reflectionproperty::isProtected' => 'Checks if property is protected', -'reflectionproperty::isPublic' => 'Checks if property is public', -'reflectionproperty::isStatic' => 'Checks if property is static', -'reflectionproperty::setAccessible' => 'Set property accessibility', -'reflectionproperty::setValue' => 'Set property value', -'reflectiontype::__toString' => 'To string', -'reflectiontype::allowsNull' => 'Checks if null is allowed', -'ReflectionType::getName' => 'Get type of the parameter.', -'reflectiontype::isBuiltin' => 'Checks if it is a built-in type', -'reflectionzendextension::__clone' => 'Clone handler', -'reflectionzendextension::__construct' => 'Constructor', -'reflectionzendextension::__toString' => 'To string handler', -'reflectionzendextension::export' => 'Export', -'reflectionzendextension::getAuthor' => 'Gets author', -'reflectionzendextension::getCopyright' => 'Gets copyright', -'reflectionzendextension::getName' => 'Gets name', -'reflectionzendextension::getURL' => 'Gets URL', -'reflectionzendextension::getVersion' => 'Gets version', -'reflector::__toString' => 'To string', -'reflector::export' => 'Exports', -'regexiterator::__construct' => 'Create a new RegexIterator', -'regexiterator::accept' => 'Get accept status', -'RegexIterator::current' => 'Get the current element value', -'regexiterator::getFlags' => 'Get flags', -'RegexIterator::getInnerIterator' => 'Get the inner iterator', -'regexiterator::getMode' => 'Returns operation mode', -'regexiterator::getPregFlags' => 'Returns the regular expression flags', -'regexiterator::getRegex' => 'Returns current regular expression', -'RegexIterator::key' => 'Get the current key', -'RegexIterator::next' => 'Move the iterator forward', -'RegexIterator::rewind' => 'Rewind the iterator', -'regexiterator::setFlags' => 'Sets the flags', -'regexiterator::setMode' => 'Sets the operation mode', -'regexiterator::setPregFlags' => 'Sets the regular expression flags', -'RegexIterator::valid' => 'Check whether the current element is valid', -'register_shutdown_function' => 'Register a function for execution on shutdown', -'register_tick_function' => 'Register a function for execution on each tick', -'rename' => 'Renames a file or directory', -'rename_function' => 'Renames orig_name to new_name in the global function table', -'reset' => 'Set the internal pointer of an array to its first element', -'resourcebundle::count' => 'Get number of elements in the bundle', -'ResourceBundle::create' => 'Create a resource bundle', -'resourcebundle::get' => 'Get data from the bundle', -'resourcebundle::getErrorCode' => 'Get bundle\'s last error code', -'resourcebundle::getErrorMessage' => 'Get bundle\'s last error message', -'resourcebundle::getLocales' => 'Get supported locales', -'restore_error_handler' => 'Restores the previous error handler function', -'restore_exception_handler' => 'Restores the previously defined exception handler function', -'restore_include_path' => 'Restores the value of the include_path configuration option', -'resultObj::__construct' => 'or using the `layerObj`_\'s getResult() method.', -'rewind' => 'Rewind the position of a file pointer', -'rewinddir' => 'Rewind directory handle', -'rmdir' => 'Removes directory', -'round' => 'Rounds a float', -'rpm_close' => 'Closes an RPM file', -'rpm_get_tag' => 'Retrieves a header tag from an RPM file', -'rpm_is_valid' => 'Tests a filename for validity as an RPM file', -'rpm_open' => 'Opens an RPM file', -'rpm_version' => 'Returns a string representing the current version of the rpmreader extension', -'rrd_create' => 'Creates rrd database file', -'rrd_error' => 'Gets latest error message', -'rrd_fetch' => 'Fetch the data for graph as array', -'rrd_first' => 'Gets the timestamp of the first sample from rrd file', -'rrd_graph' => 'Creates image from a data', -'rrd_info' => 'Gets information about rrd file', -'rrd_last' => 'Gets unix timestamp of the last sample', -'rrd_lastupdate' => 'Gets information about last updated data', -'rrd_restore' => 'Restores the RRD file from XML dump', -'rrd_tune' => 'Tunes some RRD database file header options', -'rrd_update' => 'Updates the RRD database', -'rrd_version' => 'Gets information about underlying rrdtool library', -'rrd_xport' => 'Exports the information about RRD database', -'rrdc_disconnect' => 'Close any outstanding connection to rrd caching daemon', -'rrdcreator::__construct' => 'Creates new RRDCreator instance', -'rrdcreator::addArchive' => 'Adds RRA - archive of data values for each data source', -'rrdcreator::addDataSource' => 'Adds data source definition for RRD database', -'rrdcreator::save' => 'Saves the RRD database to a file', -'rrdgraph::__construct' => 'Creates new RRDGraph instance', -'rrdgraph::save' => 'Saves the result of query into image', -'rrdgraph::saveVerbose' => 'Saves the RRD database query into image and returns the verbose information about generated graph', -'rrdgraph::setOptions' => 'Sets the options for rrd graph export', -'rrdupdater::__construct' => 'Creates new RRDUpdater instance', -'rrdupdater::update' => 'Update the RRD database file', -'rsort' => 'Sort an array in reverse order', -'rtrim' => 'Strip whitespace (or other characters) from the end of a string', -'runkit_class_adopt' => 'Convert a base class to an inherited class, add ancestral methods when appropriate', -'runkit_class_emancipate' => 'Convert an inherited class to a base class, removes any method whose scope is ancestral', -'runkit_constant_add' => 'Similar to define(), but allows defining in class definitions as well', -'runkit_constant_redefine' => 'Redefine an already defined constant', -'runkit_constant_remove' => 'Remove/Delete an already defined constant', -'runkit_function_add' => 'Add a new function, similar to create_function', -'runkit_function_copy' => 'Copy a function to a new function name', -'runkit_function_redefine' => 'Replace a function definition with a new implementation', -'runkit_function_remove' => 'Remove a function definition', -'runkit_function_rename' => 'Change a function\'s name', -'runkit_import' => 'Process a PHP file importing function and class definitions, overwriting where appropriate', -'runkit_lint' => 'Check the PHP syntax of the specified php code', -'runkit_lint_file' => 'Check the PHP syntax of the specified file', -'runkit_method_add' => 'Dynamically adds a new method to a given class', -'runkit_method_copy' => 'Copies a method from class to another', -'runkit_method_redefine' => 'Dynamically changes the code of the given method', -'runkit_method_remove' => 'Dynamically removes the given method', -'runkit_method_rename' => 'Dynamically changes the name of the given method', -'runkit_return_value_used' => 'Determines if the current functions return value will be used', -'runkit_sandbox_output_handler' => 'Specify a function to capture and/or process output from a runkit sandbox', -'runkit_superglobals' => 'Return numerically indexed array of registered superglobals', -'samconnection::__construct' => 'Creates a new connection to a Messaging Server', -'samconnection::commit' => 'Commits (completes) the current unit of work', -'samconnection::connect' => 'Establishes a connection to a Messaging Server', -'samconnection::disconnect' => 'Disconnects from a Messaging Server', -'samconnection::errno' => 'Contains the unique numeric error code of the last executed SAM operation', -'samconnection::error' => 'Contains the text description of the last failed SAM operation', -'samconnection::isConnected' => 'Queries whether a connection is established to a Messaging Server', -'samconnection::peek' => 'Read a message from a queue without removing it from the queue', -'samconnection::peekAll' => 'Read one or more messages from a queue without removing it from the queue', -'samconnection::receive' => 'Receive a message from a queue or subscription', -'samconnection::remove' => 'Remove a message from a queue', -'samconnection::rollback' => 'Cancels (rolls back) an in-flight unit of work', -'samconnection::send' => 'Send a message to a queue or publish an item to a topic', -'samconnection::setDebug' => 'Turn on or off additional debugging output', -'samconnection::subscribe' => 'Create a subscription to a specified topic', -'samconnection::unsubscribe' => 'Cancel a subscription to a specified topic', -'sammessage::__construct' => 'Creates a new Message object', -'sammessage::body' => 'The body of the message', -'sammessage::header' => 'The header properties of the message', -'sapi_windows_cp_conv' => 'Convert string from one codepage to another', -'sapi_windows_cp_get' => 'Get process codepage', -'sapi_windows_cp_is_utf8' => 'Indicates whether the codepage is UTF-8 compatible', -'sapi_windows_cp_set' => 'Set process codepage', -'sapi_windows_vt100_support' => 'Get or set VT100 support for the specified stream associated to an output buffer of a Windows console.', -'Saxon\SaxonProcessor::__construct' => 'Constructor', -'Saxon\SaxonProcessor::createAtomicValue' => 'Create an Xdm Atomic value from any of the main primitive types (i.e. bool, int, float, double, string)', -'Saxon\SaxonProcessor::newSchemaValidator' => 'Create a {@link SchemaValidator} in the PHP environment. A {@link SchemaValidator} provides capabilities to load and cache XML schema definitions. You can also validate source documents with registered XML schema definitions', -'Saxon\SaxonProcessor::newXPathProcessor' => 'Create an {@link XPathProcessor} in the PHP environment. An {@link XPathProcessor} is used to compile and execute XPath queries', -'Saxon\SaxonProcessor::newXQueryProcessor' => 'Create an {@link XQueryProcessor} in the PHP environment. An {@link XQueryProcessor} is used to compile and execute XQuery queries', -'Saxon\SaxonProcessor::newXsltProcessor' => 'Create an {@link XsltProcessor} in the PHP environment. An {@link XsltProcessor} is used to compile and execute XSLT sytlesheets', -'Saxon\SaxonProcessor::parseXmlFromFile' => 'Create an {@link XdmNode} object.', -'Saxon\SaxonProcessor::parseXmlFromString' => 'Create an {@link XdmNode} object.', -'Saxon\SaxonProcessor::registerPHPFunctions' => 'Enables the ability to use PHP functions as XSLT functions. Accepts as parameter the full path of the Saxon/C PHP Extension library. This is needed to do the callbacks.', -'Saxon\SaxonProcessor::setConfigurationProperty' => 'Set a configuration property specific to the processor in use. Properties specified here are common across all the processors.', -'Saxon\SaxonProcessor::setcwd' => 'Set the current working directory used to resolve against files', -'Saxon\SaxonProcessor::setResourceDirectory' => 'Set the resources directory of where Saxon can locate data folder', -'Saxon\SaxonProcessor::version' => 'Report the Java Saxon version', -'Saxon\SchemaValidator::clearParameters' => 'Clear parameter values set', -'Saxon\SchemaValidator::clearProperties' => 'Clear property values set', -'Saxon\SchemaValidator::exceptionClear' => 'Clear any exception thrown', -'Saxon\SchemaValidator::getErrorCode' => 'Get the $i\'th error code if there are any errors', -'Saxon\SchemaValidator::getErrorMessage' => 'Get the $i\'th error message if there are any errors', -'Saxon\SchemaValidator::getExceptionCount' => 'Get number of error during execution of the validator', -'Saxon\SchemaValidator::getValidationReport' => 'Get the validation report produced after validating the source document. The reporting feature is switched on via setting the property on the {@link SchemaValidator): $validator->setProperty(\'report\', \'true\').', -'Saxon\SchemaValidator::registerSchemaFromFile' => 'Register the Schema which is given as file name.', -'Saxon\SchemaValidator::registerSchemaFromString' => 'Register the Schema which is given as a string representation.', -'Saxon\SchemaValidator::setOutputFile' => 'The instance document to be validated. Supplied file name is resolved and accessed', -'Saxon\SchemaValidator::setParameter' => 'Set the parameters required for XQuery Processor', -'Saxon\SchemaValidator::setProperty' => 'Set properties for Schema Validator.', -'Saxon\SchemaValidator::setSourceNode' => 'The instance document to be validated. Supplied as an Xdm Node', -'Saxon\SchemaValidator::validate' => 'Validate an instance document supplied as a Source object. Assume source document has already been supplied through accessor methods', -'Saxon\SchemaValidator::validateToNode' => 'Validate an instance document supplied as a Source object with the validated document returned to the calling program.', -'Saxon\XdmAtomicValue::addXdmItem' => 'Add item to the sequence at the end.', -'Saxon\XdmAtomicValue::getAtomicValue' => 'Provided the item is an atomic value we return the {@link XdmAtomicValue} otherwise return null', -'Saxon\XdmAtomicValue::getBooleanValue' => 'Get the value converted to a boolean using the XPath casting rules', -'Saxon\XdmAtomicValue::getDoubleValue' => 'Get the value converted to a double using the XPath casting rules. If the value is a string, the XSD 1.1 rules are used, which means that the string "+INF" is recognised', -'Saxon\XdmAtomicValue::getHead' => 'Get the first item in the sequence', -'Saxon\XdmAtomicValue::getLongValue' => 'Get the value converted to an integer using the XPath casting rules', -'Saxon\XdmAtomicValue::getNodeValue' => 'Provided the item is a node value we return the {@link XdmNode} otherwise return null', -'Saxon\XdmAtomicValue::getStringValue' => 'Get the string value of the item. For an atomic value, it has the same effect as casting the value to a string. In all cases the result is the same as applying the XPath string() function.', -'Saxon\XdmAtomicValue::isAtomic' => 'Determine whether the item is an atomic value or a node. Return TRUE if the item is an atomic value', -'Saxon\XdmAtomicValue::isNode' => 'Determine whether the item is a node value or not.', -'Saxon\XdmAtomicValue::itemAt' => 'Get the n\'th item in the value, counting from zero', -'Saxon\XdmAtomicValue::size' => 'Get the number of items in the sequence', -'Saxon\XdmItem::addXdmItem' => 'Add item to the sequence at the end.', -'Saxon\XdmItem::getAtomicValue' => 'Provided the item is an atomic value we return the {@link XdmAtomicValue} otherwise return null', -'Saxon\XdmItem::getHead' => 'Get the first item in the sequence', -'Saxon\XdmItem::getNodeValue' => 'Provided the item is a node value we return the {@link XdmNode} otherwise return null', -'Saxon\XdmItem::getStringValue' => 'Get the string value of the item. For a node, this gets the string value of the node. For an atomic value, it has the same effect as casting the value to a string. In all cases the result is the same as applying the XPath string() function.', -'Saxon\XdmItem::isAtomic' => 'Determine whether the item is an atomic value or not.', -'Saxon\XdmItem::isNode' => 'Determine whether the item is a node value or not.', -'Saxon\XdmItem::itemAt' => 'Get the n\'th item in the value, counting from zero', -'Saxon\XdmItem::size' => 'Get the number of items in the sequence', -'Saxon\XdmNode::addXdmItem' => 'Add item to the sequence at the end.', -'Saxon\XdmNode::getAtomicValue' => 'Provided the item is an atomic value we return the {@link XdmAtomicValue} otherwise return null', -'Saxon\XdmNode::getAttributeCount' => 'Get the count of attribute nodes at this node', -'Saxon\XdmNode::getAttributeNode' => 'Get the n\'th attribute node at this node. If the attribute node selected does not exist then return null', -'Saxon\XdmNode::getAttributeValue' => 'Get the n\'th attribute node value at this node. If the attribute node selected does not exist then return null', -'Saxon\XdmNode::getChildCount' => 'Get the count of child node at this current node', -'Saxon\XdmNode::getChildNode' => 'Get the n\'th child node at this node. If the child node selected does not exist then return null', -'Saxon\XdmNode::getHead' => 'Get the first item in the sequence', -'Saxon\XdmNode::getNodeKind' => 'Get the kind of node', -'Saxon\XdmNode::getNodeName' => 'Get the name of the node, as a EQName', -'Saxon\XdmNode::getNodeValue' => 'Provided the item is a node value we return the {@link XdmNode} otherwise return null', -'Saxon\XdmNode::getParent' => 'Get the parent of this node. If parent node does not exist then return null', -'Saxon\XdmNode::getStringValue' => 'Get the string value of the item. For a node, this gets the string value of the node.', -'Saxon\XdmNode::isAtomic' => 'Determine whether the item is an atomic value or a node. This method will return FALSE as the item is not atomic', -'Saxon\XdmNode::isNode' => 'Determine whether the item is a node value or not.', -'Saxon\XdmNode::itemAt' => 'Get the n\'th item in the value, counting from zero', -'Saxon\XdmNode::size' => 'Get the number of items in the sequence', -'Saxon\XdmValue::addXdmItem' => 'Add item to the sequence at the end.', -'Saxon\XdmValue::getHead' => 'Get the first item in the sequence', -'Saxon\XdmValue::itemAt' => 'Get the n\'th item in the value, counting from zero', -'Saxon\XdmValue::size' => 'Get the number of items in the sequence', -'Saxon\XPathProcessor::clearParameters' => 'Clear parameter values set', -'Saxon\XPathProcessor::clearProperties' => 'Clear property values set', -'Saxon\XPathProcessor::declareNamespace' => 'Declare a namespace binding as part of the static context for XPath expressions compiled using this {@link XPathProcessor}', -'Saxon\XPathProcessor::effectiveBooleanValue' => 'Evaluate the XPath expression, returning the effective boolean value of the result.', -'Saxon\XPathProcessor::evaluate' => 'Compile and evaluate an XPath expression, supplied as a character string. Result is an {@link XdmValue}', -'Saxon\XPathProcessor::evaluateSingle' => 'Compile and evaluate an XPath expression whose result is expected to be a single item, with a given context item. The expression is supplied as a character string.', -'Saxon\XPathProcessor::exceptionClear' => 'Clear any exception thrown', -'Saxon\XPathProcessor::getErrorCode' => 'Get the $i\'th error code if there are any errors', -'Saxon\XPathProcessor::getErrorMessage' => 'Get the $i\'th error message if there are any errors', -'Saxon\XPathProcessor::getExceptionCount' => 'Get number of error during execution or evaluate of stylesheet and query, respectively', -'Saxon\XPathProcessor::setBaseURI' => 'Set the static base URI for XPath expressions compiled using this XQuery Processor. The base URI is part of the static context, and is used to resolve any relative URIS appearing within a query', -'Saxon\XPathProcessor::setContextFile' => 'Set the context item from file', -'Saxon\XPathProcessor::setContextItem' => 'Set the context item from a {@link XdmItem}', -'Saxon\XPathProcessor::setParameter' => 'Set the parameters required for XQuery Processor', -'Saxon\XPathProcessor::setProperty' => 'Set properties for Query.', -'Saxon\XQueryProcessor::clearParameters' => 'Clear parameter values set', -'Saxon\XQueryProcessor::clearProperties' => 'Clear property values set', -'Saxon\XQueryProcessor::declareNamespace' => 'Declare a namespace binding as part of the static context for XPath expressions compiled using this XQuery processor', -'Saxon\XQueryProcessor::exceptionClear' => 'Clear any exception thrown', -'Saxon\XQueryProcessor::getErrorCode' => 'Get the $i\'th error code if there are any errors', -'Saxon\XQueryProcessor::getErrorMessage' => 'Get the $i\'th error message if there are any errors', -'Saxon\XQueryProcessor::getExceptionCount' => 'Get number of error during execution or evaluate of query', -'Saxon\XQueryProcessor::runQueryToFile' => 'Compile and evaluate the query. Save the result to file', -'Saxon\XQueryProcessor::runQueryToString' => 'Compile and evaluate the query. Result returned as string. If there are failures then a null is returned', -'Saxon\XQueryProcessor::runQueryToValue' => 'Compile and evaluate the query. Result returned as an XdmValue object. If there are failures then a null is returned', -'Saxon\XQueryProcessor::setContextItem' => 'Set the initial context item for the query. -Any one of the objects are accepted: {@link XdmValue}, {@link XdmItem}, {@link XdmNode} and {@link XdmAtomicValue}.', -'Saxon\XQueryProcessor::setContextItemFromFile' => 'Set the initial context item for the query. Supplied as filename', -'Saxon\XQueryProcessor::setParameter' => 'Set the parameters required for XQuery Processor', -'Saxon\XQueryProcessor::setProperty' => 'Set properties for Query.', -'Saxon\XQueryProcessor::setQueryBaseURI' => 'Set the static base URI for a query expressions compiled using this XQuery Processor. The base URI is part of the static context, and is used to resolve any relative URIS appearing within a query', -'Saxon\XQueryProcessor::setQueryContent' => 'query supplied as a string', -'Saxon\XQueryProcessor::setQueryFile' => 'query supplied as a file', -'Saxon\XsltProcessor::clearParameters' => 'Clear parameter values set', -'Saxon\XsltProcessor::clearProperties' => 'Clear property values set', -'Saxon\XsltProcessor::compileFromFile' => 'Compile a stylesheet supplied by file name', -'Saxon\XsltProcessor::compileFromString' => 'Compile a stylesheet received as a string.', -'Saxon\XsltProcessor::compileFromValue' => 'Compile a stylesheet received as an {@link XdmNode}.', -'Saxon\XsltProcessor::exceptionClear' => 'Clear any exception thrown', -'Saxon\XsltProcessor::getErrorCode' => 'Get the $i\'th error code if there are any errors', -'Saxon\XsltProcessor::getErrorMessage' => 'Get the $i\'th error message if there are any errors', -'Saxon\XsltProcessor::getExceptionCount' => 'Get number of error during execution or evaluate of stylesheet', -'Saxon\XsltProcessor::setOutputFile' => 'Set the output file name of where the transformation result is sent', -'Saxon\XsltProcessor::setParameter' => 'Set the parameters required for XSLT stylesheet', -'Saxon\XsltProcessor::setProperty' => 'Set properties for the stylesheet.', -'Saxon\XsltProcessor::setSourceFromFile' => 'The source used for a query or stylesheet. Requires a file name as string', -'Saxon\XsltProcessor::setSourceFromXdmValue' => 'The source used for a query or stylesheet. Requires an {@link XdmValue} object', -'Saxon\XsltProcessor::transformFileToFile' => 'Perform a one shot transformation. The result is stored in the supplied outputfile name.', -'Saxon\XsltProcessor::transformFileToString' => 'Perform a one shot transformation. The result is returned as a string. If there are failures then a null is returned.', -'Saxon\XsltProcessor::transformFileToValue' => 'Perform a one shot transformation. The result is returned as an {@link XdmValue}.', -'Saxon\XsltProcessor::transformToFile' => 'Perform the transformation based upon cached stylesheet and source document.', -'Saxon\XsltProcessor::transformToValue' => 'Perform the transformation based upon cached stylesheet and any source document. Result returned as an {@link XdmValue} object. If there are failures then a null is returned', -'sca::createDataObject' => 'Create an SDO', -'sca::getService' => 'Obtain a proxy for a service', -'sca_localproxy::createDataObject' => 'Create an SDO', -'sca_soapproxy::createDataObject' => 'Create an SDO', -'scalebarObj::convertToString' => 'Saves the object to a string. Provides the inverse option for -updateFromString.', -'scalebarObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the -resources.', -'scalebarObj::set' => 'Set object property to a new value.', -'scalebarObj::setImageColor' => 'Sets the imagecolor property (baclground) of the object. -Returns MS_SUCCESS or MS_FAILURE on error.', -'scalebarObj::updateFromString' => 'Update a scalebar from a string snippet. Returns MS_SUCCESS/MS_FAILURE.', -'scandir' => 'List files and directories inside the specified path', -'sdo_das_changesummary::beginLogging' => 'Begin change logging', -'sdo_das_changesummary::endLogging' => 'End change logging', -'sdo_das_changesummary::getChangedDataObjects' => 'Get the changed data objects from a change summary', -'sdo_das_changesummary::getChangeType' => 'Get the type of change made to an SDO_DataObject', -'sdo_das_changesummary::getOldContainer' => 'Get the old container for a deleted SDO_DataObject', -'sdo_das_changesummary::getOldValues' => 'Get the old values for a given changed SDO_DataObject', -'sdo_das_changesummary::isLogging' => 'Test to see whether change logging is switched on', -'sdo_das_datafactory::addPropertyToType' => 'Adds a property to a type', -'sdo_das_datafactory::addType' => 'Add a new type to a model', -'sdo_das_datafactory::getDataFactory' => 'Get a data factory instance', -'sdo_das_dataobject::getChangeSummary' => 'Get a data object\'s change summary', -'sdo_das_relational::__construct' => 'Creates an instance of a Relational Data Access Service', -'sdo_das_relational::applyChanges' => 'Applies the changes made to a data graph back to the database', -'sdo_das_relational::createRootDataObject' => 'Returns the special root object in an otherwise empty data graph. Used when creating a data graph from scratch', -'sdo_das_relational::executePreparedQuery' => 'Executes an SQL query passed as a prepared statement, with a list of values to substitute for placeholders, and return the results as a normalised data graph', -'sdo_das_relational::executeQuery' => 'Executes a given SQL query against a relational database and returns the results as a normalised data graph', -'sdo_das_setting::getListIndex' => 'Get the list index for a changed many-valued property', -'sdo_das_setting::getPropertyIndex' => 'Get the property index for a changed property', -'sdo_das_setting::getPropertyName' => 'Get the property name for a changed property', -'sdo_das_setting::getValue' => 'Get the old value for the changed property', -'sdo_das_setting::isSet' => 'Test whether a property was set prior to being modified', -'sdo_das_xml::addTypes' => 'To load a second or subsequent schema file to a SDO_DAS_XML object', -'sdo_das_xml::create' => 'To create SDO_DAS_XML object for a given schema file', -'sdo_das_xml::createDataObject' => 'Creates SDO_DataObject for a given namespace URI and type name', -'sdo_das_xml::createDocument' => 'Creates an XML Document object from scratch, without the need to load a document from a file or string', -'sdo_das_xml::loadFile' => 'Returns SDO_DAS_XML_Document object for a given path to xml instance document', -'sdo_das_xml::loadString' => 'Returns SDO_DAS_XML_Document for a given xml instance string', -'sdo_das_xml::saveFile' => 'Saves the SDO_DAS_XML_Document object to a file', -'sdo_das_xml::saveString' => 'Saves the SDO_DAS_XML_Document object to a string', -'sdo_das_xml_document::getRootDataObject' => 'Returns the root SDO_DataObject', -'sdo_das_xml_document::getRootElementName' => 'Returns root element\'s name', -'sdo_das_xml_document::getRootElementURI' => 'Returns root element\'s URI string', -'sdo_das_xml_document::setEncoding' => 'Sets the given string as encoding', -'sdo_das_xml_document::setXMLDeclaration' => 'Sets the xml declaration', -'sdo_das_xml_document::setXMLVersion' => 'Sets the given string as xml version', -'sdo_datafactory::create' => 'Create an SDO_DataObject', -'sdo_dataobject::clear' => 'Clear an SDO_DataObject\'s properties', -'sdo_dataobject::createDataObject' => 'Create a child SDO_DataObject', -'sdo_dataobject::getContainer' => 'Get a data object\'s container', -'sdo_dataobject::getSequence' => 'Get the sequence for a data object', -'sdo_dataobject::getTypeName' => 'Return the name of the type for a data object', -'sdo_dataobject::getTypeNamespaceURI' => 'Return the namespace URI of the type for a data object', -'sdo_exception::getCause' => 'Get the cause of the exception', -'sdo_list::insert' => 'Insert into a list', -'sdo_model_property::getContainingType' => 'Get the SDO_Model_Type which contains this property', -'sdo_model_property::getDefault' => 'Get the default value for the property', -'sdo_model_property::getName' => 'Get the name of the SDO_Model_Property', -'sdo_model_property::getType' => 'Get the SDO_Model_Type of the property', -'sdo_model_property::isContainment' => 'Test to see if the property defines a containment relationship', -'sdo_model_property::isMany' => 'Test to see if the property is many-valued', -'sdo_model_reflectiondataobject::__construct' => 'Construct an SDO_Model_ReflectionDataObject', -'sdo_model_reflectiondataobject::export' => 'Get a string describing the SDO_DataObject', -'sdo_model_reflectiondataobject::getContainmentProperty' => 'Get the property which defines the containment relationship to the data object', -'sdo_model_reflectiondataobject::getInstanceProperties' => 'Get the instance properties of the SDO_DataObject', -'sdo_model_reflectiondataobject::getType' => 'Get the SDO_Model_Type for the SDO_DataObject', -'sdo_model_type::getBaseType' => 'Get the base type for this type', -'sdo_model_type::getName' => 'Get the name of the type', -'sdo_model_type::getNamespaceURI' => 'Get the namespace URI of the type', -'sdo_model_type::getProperties' => 'Get the SDO_Model_Property objects defined for the type', -'sdo_model_type::getProperty' => 'Get an SDO_Model_Property of the type', -'sdo_model_type::isAbstractType' => 'Test to see if this SDO_Model_Type is an abstract data type', -'sdo_model_type::isDataType' => 'Test to see if this SDO_Model_Type is a primitive data type', -'sdo_model_type::isInstance' => 'Test for an SDO_DataObject being an instance of this SDO_Model_Type', -'sdo_model_type::isOpenType' => 'Test to see if this type is an open type', -'sdo_model_type::isSequencedType' => 'Test to see if this is a sequenced type', -'sdo_sequence::getProperty' => 'Return the property for the specified sequence index', -'sdo_sequence::insert' => 'Insert into a sequence', -'sdo_sequence::move' => 'Move an item to another sequence position', -'seaslog::alert' => 'Record alert log information', -'seaslog::analyzerCount' => 'Get log count by level, log_path and key_word', -'seaslog::analyzerDetail' => 'Get log detail by level, log_path, key_word, start, limit, order', -'seaslog::closeLoggerStream' => 'Manually release stream flow from logger', -'seaslog::critical' => 'Record critical log information', -'seaslog::debug' => 'Record debug log information', -'seaslog::emergency' => 'Record emergency log information', -'seaslog::error' => 'Record error log information', -'seaslog::flushBuffer' => 'Flush logs buffer, dump to appender file, or send to remote api with tcp/udp', -'seaslog::getBasePath' => 'Get SeasLog base path.', -'seaslog::getBuffer' => 'Get the logs buffer in memory as array', -'seaslog::getBufferEnabled' => 'Determine if buffer enabled', -'seaslog::getDatetimeFormat' => 'Get SeasLog datetime format style', -'seaslog::getLastLogger' => 'Get SeasLog last logger path', -'seaslog::getRequestID' => 'Get SeasLog request_id differentiated requests', -'seaslog::getRequestVariable' => 'Get SeasLog request variable', -'seaslog::info' => 'Record info log information', -'seaslog::log' => 'The Common Record Log Function', -'seaslog::notice' => 'Record notice log information', -'seaslog::setBasePath' => 'Set SeasLog base path', -'seaslog::setDatetimeFormat' => 'Set SeasLog datetime format style', -'seaslog::setLogger' => 'Set SeasLog logger name', -'seaslog::setRequestID' => 'Set SeasLog request_id differentiated requests', -'seaslog::setRequestVariable' => 'Manually set SeasLog request variable', -'seaslog::warning' => 'Record warning log information', -'seaslog_get_author' => 'Get SeasLog author.', -'seaslog_get_version' => 'Get SeasLog version.', -'SeekableIterator::current' => 'Return the current element', -'SeekableIterator::key' => 'Return the key of the current element', -'SeekableIterator::next' => 'Move forward to next element', -'SeekableIterator::rewind' => 'Rewind the Iterator to the first element', -'seekableiterator::seek' => 'Seeks to a position', -'SeekableIterator::valid' => 'Checks if current position is valid', -'sem_acquire' => 'Acquire a semaphore', -'sem_get' => 'Get a semaphore id', -'sem_release' => 'Release a semaphore', -'sem_remove' => 'Remove a semaphore', -'Serializable::serialize' => 'String representation of object', -'Serializable::unserialize' => 'Constructs the object', -'serialize' => 'Generates a storable representation of a value', -'session_abort' => 'Discard session array changes and finish session', -'session_cache_expire' => 'Return current cache expire', -'session_cache_limiter' => 'Get and/or set the current cache limiter', -'session_commit' => 'Alias of session_write_close', -'session_create_id' => 'Create new session id', -'session_decode' => 'Decodes session data from a session encoded string', -'session_destroy' => 'Destroys all data registered to a session', -'session_encode' => 'Encodes the current session data as a session encoded string', -'session_gc' => 'Perform session data garbage collection', -'session_get_cookie_params' => 'Get the session cookie parameters', -'session_id' => 'Get and/or set the current session id', -'session_is_registered' => 'Find out whether a global variable is registered in a session', -'session_module_name' => 'Get and/or set the current session module', -'session_name' => 'Get and/or set the current session name', -'session_pgsql_add_error' => 'Increments error counts and sets last error message', -'session_pgsql_get_error' => 'Returns number of errors and last error message', -'session_pgsql_get_field' => 'Get custom field value', -'session_pgsql_reset' => 'Reset connection to session database servers', -'session_pgsql_set_field' => 'Set custom field value', -'session_pgsql_status' => 'Get current save handler status', -'session_regenerate_id' => 'Update the current session id with a newly generated one', -'session_register' => 'Register one or more global variables with the current session', -'session_register_shutdown' => 'Session shutdown function', -'session_reset' => 'Re-initialize session array with original values', -'session_save_path' => 'Get and/or set the current session save path', -'session_set_cookie_params' => 'Set the session cookie parameters', -'session_set_save_handler' => 'Sets user-level session storage functions', -'session_start' => 'Start new or resume existing session', -'session_status' => 'Returns the current session status', -'session_unregister' => 'Unregister a global variable from the current session', -'session_unset' => 'Free all session variables', -'session_write_close' => 'Write session data and end session', -'sessionhandler::close' => 'Close the session', -'sessionhandler::create_sid' => 'Return a new session ID', -'sessionhandler::destroy' => 'Destroy a session', -'sessionhandler::gc' => 'Cleanup old sessions', -'sessionhandler::open' => 'Initialize session', -'sessionhandler::read' => 'Read session data', -'SessionHandler::updateTimestamp' => 'Update timestamp of a session', -'SessionHandler::validateId' => 'Validate session id', -'sessionhandler::write' => 'Write session data', -'sessionhandlerinterface::close' => 'Close the session', -'sessionhandlerinterface::destroy' => 'Destroy a session', -'sessionhandlerinterface::gc' => 'Cleanup old sessions', -'sessionhandlerinterface::open' => 'Initialize session', -'sessionhandlerinterface::read' => 'Read session data', -'sessionhandlerinterface::write' => 'Write session data', -'sessionidinterface::create_sid' => 'Create session ID', -'sessionupdatetimestamphandlerinterface::updateTimestamp' => 'Update timestamp', -'sessionupdatetimestamphandlerinterface::validateId' => 'Validate ID', -'set_error_handler' => 'Sets a user-defined error handler function', -'set_exception_handler' => 'Sets a user-defined exception handler function', -'set_file_buffer' => 'Alias of stream_set_write_buffer', -'set_include_path' => 'Sets the include_path configuration option', -'set_job_failed' => 'causes a job to fail logically -can be used to indicate an error in the script logic (e.g. database connection problem)', -'set_magic_quotes_runtime' => 'Sets the current active configuration setting of magic_quotes_runtime', -'set_socket_blocking' => 'Alias of stream_set_blocking', -'set_time_limit' => 'Limits the maximum execution time', -'setcookie' => 'Send a cookie', -'setlocale' => 'Set locale information', -'setproctitle' => 'Set the process title', -'setrawcookie' => 'Send a cookie without urlencoding the cookie value', -'setthreadtitle' => 'Set the thread title', -'settype' => 'Set the type of a variable', -'sha1' => 'Calculate the sha1 hash of a string', -'sha1_file' => 'Calculate the sha1 hash of a file', -'sha256' => 'Calculate the sha256 hash of a string', -'sha256_file' => 'Calculate the sha256 hash of given filename', -'shapefileObj::__construct' => 'Opens a shapefile and returns a new object to deal with it. Filename -should be passed with no extension. To create a new file (or -overwrite an existing one), type should be one of MS_SHP_POINT, -MS_SHP_ARC, MS_SHP_POLYGON or MS_SHP_MULTIPOINT. Pass type as -1 to -open an existing file for read-only access, and type=-2 to open an -existing file for update (append).', -'shapefileObj::addPoint' => 'Appends a point to an open shapefile.', -'shapefileObj::addShape' => 'Appends a shape to an open shapefile.', -'shapefileObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the -resources. -.. note:: -The shape file is closed (and changes committed) when -the object is destroyed. You can explicitly close and save -the changes by calling $shapefile->free(); -unset($shapefile), which will also free the php object.', -'shapefileObj::getExtent' => 'Retrieve a shape\'s bounding box by index.', -'shapefileObj::getPoint' => 'Retrieve point by index.', -'shapefileObj::getShape' => 'Retrieve shape by index.', -'shapefileObj::getTransformed' => 'Retrieve shape by index.', -'shapefileObj::ms_newShapefileObj' => 'Old style constructor', -'shapeObj::__construct' => '\'type\' is one of MS_SHAPE_POINT, MS_SHAPE_LINE, MS_SHAPE_POLYGON or -MS_SHAPE_NULL -Creates new shape object from WKT string.', -'shapeObj::add' => 'Add a line (i.e. a part) to the shape.', -'shapeObj::boundary' => 'Returns the boundary of the shape. -Only available if php/mapscript is built with GEOS library. -shapeObj buffer(width) -Returns a new buffered shapeObj based on the supplied distance (given -in the coordinates of the existing shapeObj). -Only available if php/mapscript is built with GEOS library.', -'shapeObj::contains' => 'Returns MS_TRUE if the point is inside the shape, MS_FALSE otherwise.', -'shapeObj::containsShape' => 'Returns true if shape2 passed as argument is entirely within the shape. -Else return false. -Only available if php/mapscript is built with GEOS -library.', -'shapeObj::convexhull' => 'Returns a shape object representing the convex hull of shape. -Only available if php/mapscript is built with GEOS -library.', -'shapeObj::crosses' => 'Returns true if the shape passed as argument crosses the shape. -Else return false. -Only available if php/mapscript is built with GEOS library.', -'shapeObj::difference' => 'Returns a shape object representing the difference of the -shape object with the one passed as parameter. -Only available if php/mapscript is built with GEOS library.', -'shapeObj::disjoint' => 'Returns true if the shape passed as argument is disjoint to the -shape. Else return false. -Only available if php/mapscript is built with GEOS library.', -'shapeObj::draw' => 'Draws the individual shape using layer. -Returns MS_SUCCESS/MS_FAILURE.', -'shapeObj::equals' => 'Returns true if the shape passed as argument is equal to the -shape (geometry only). Else return false. -Only available if php/mapscript is built with GEOS library.', -'shapeObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the resources.', -'shapeObj::getArea' => 'Returns the area of the shape (if applicable). -Only available if php/mapscript is built with GEOS library.', -'shapeObj::getCentroid' => 'Returns a point object representing the centroid of the shape. -Only available if php/mapscript is built with GEOS library.', -'shapeObj::getLabelPoint' => 'Returns a point object with coordinates suitable for labelling -the shape.', -'shapeObj::getLength' => 'Returns the length (or perimeter) of the shape. -Only available if php/mapscript is built with GEOS library. -pointObj getMeasureUsingPoint(pointObj point) -Apply only on Measured shape files. Given an XY Location, find the -nearest point on the shape object. Return a point object -of this point with the m value set.', -'shapeObj::getPointUsingMeasure' => 'Apply only on Measured shape files. Given a measure m, return the -corresponding XY location on the shapeobject.', -'shapeObj::getValue' => 'Returns the value for a given field name.', -'shapeObj::intersection' => 'Returns a shape object representing the intersection of the shape -object with the one passed as parameter. -Only available if php/mapscript is built with GEOS library.', -'shapeObj::intersects' => 'Returns MS_TRUE if the two shapes intersect, MS_FALSE otherwise.', -'shapeObj::line' => 'Returns a reference to line number i.', -'shapeObj::ms_shapeObjFromWkt' => 'Old style constructor', -'shapeObj::overlaps' => 'Returns true if the shape passed as argument overlaps the shape. -Else returns false. -Only available if php/mapscript is built with GEOS library.', -'shapeObj::project' => 'Project the shape from "in" projection (1st argument) to "out" -projection (2nd argument). Returns MS_SUCCESS/MS_FAILURE.', -'shapeObj::set' => 'Set object property to a new value.', -'shapeObj::setBounds' => 'Updates the bounds property of the shape. -Must be called to calculate new bounding box after new parts have been -added.', -'shapeObj::simplify' => 'Given a tolerance, returns a simplified shape object or NULL on -error. Only available if php/mapscript is built with GEOS library -(>=3.0).', -'shapeObj::symdifference' => 'Returns the computed symmetric difference of the supplied and -existing shape. -Only available if php/mapscript is built with GEOS library.', -'shapeObj::topologyPreservingSimplify' => 'Given a tolerance, returns a simplified shape object or NULL on -error. Only available if php/mapscript is built with GEOS library -(>=3.0).', -'shapeObj::touches' => 'Returns true if the shape passed as argument touches the shape. -Else return false. -Only available if php/mapscript is built with GEOS library.', -'shapeObj::toWkt' => 'Returns WKT representation of the shape\'s geometry.', -'shapeObj::union' => 'Returns a shape object representing the union of the shape object -with the one passed as parameter. -Only available if php/mapscript is built with GEOS -library', -'shapeObj::within' => 'Returns true if the shape is entirely within the shape2 passed as -argument. -Else returns false. -Only available if php/mapscript is built with GEOS library.', -'shell_exec' => 'Execute command via shell and return the complete output as a string', -'shm_attach' => 'Creates or open a shared memory segment', -'shm_detach' => 'Disconnects from shared memory segment', -'shm_get_var' => 'Returns a variable from shared memory', -'shm_has_var' => 'Check whether a specific entry exists', -'shm_put_var' => 'Inserts or updates a variable in shared memory', -'shm_remove' => 'Removes shared memory from Unix systems', -'shm_remove_var' => 'Removes a variable from shared memory', -'shmop_close' => 'Close shared memory block', -'shmop_delete' => 'Delete shared memory block', -'shmop_open' => 'Create or open shared memory block', -'shmop_read' => 'Read data from shared memory block', -'shmop_size' => 'Get size of shared memory block', -'shmop_write' => 'Write data into shared memory block', -'show_source' => 'Alias of highlight_file', -'shuffle' => 'Shuffle an array', -'similar_text' => 'Calculate the similarity between two strings', -'simplexml_import_dom' => 'Get a SimpleXMLElement object from a DOM node', -'simplexml_load_file' => 'Interprets an XML file into an object', -'simplexml_load_string' => 'Interprets a string of XML into an object', -'simplexmlelement::__construct' => 'Creates a new SimpleXMLElement object', -'SimpleXMLElement::__get' => 'Provides access to element\'s children', -'simplexmlelement::__toString' => 'Returns the string content', -'simplexmlelement::addAttribute' => 'Adds an attribute to the SimpleXML element', -'simplexmlelement::addChild' => 'Adds a child element to the XML node', -'simplexmlelement::asXML' => 'Return a well-formed XML string based on SimpleXML element', -'simplexmlelement::attributes' => 'Identifies an element\'s attributes', -'simplexmlelement::children' => 'Finds children of given node', -'simplexmlelement::count' => 'Counts the children of an element', -'simplexmlelement::getDocNamespaces' => 'Returns namespaces declared in document', -'simplexmlelement::getName' => 'Gets the name of the XML element', -'simplexmlelement::getNamespaces' => 'Returns namespaces used in document', -'SimpleXMLElement::offsetExists' => 'Class provides access to children by position, and attributes by name', -'SimpleXMLElement::offsetGet' => 'Class provides access to children by position, and attributes by name', -'SimpleXMLElement::offsetSet' => 'Class provides access to children by position, and attributes by name', -'SimpleXMLElement::offsetUnset' => 'Class provides access to children by position, and attributes by name', -'simplexmlelement::registerXPathNamespace' => 'Creates a prefix/ns context for the next XPath query', -'simplexmlelement::saveXML' => 'Alias of SimpleXMLElement::asXML', -'simplexmlelement::xpath' => 'Runs XPath query on XML data', -'SimpleXMLIterator::__toString' => 'Returns the string content', -'SimpleXMLIterator::addAttribute' => 'Adds an attribute to the SimpleXML element', -'SimpleXMLIterator::addChild' => 'Adds a child element to the XML node', -'SimpleXMLIterator::asXML' => 'Return a well-formed XML string based on SimpleXML element', -'SimpleXMLIterator::attributes' => 'Identifies an element\'s attributes', -'SimpleXMLIterator::children' => 'Finds children of given node', -'SimpleXMLIterator::count' => 'Counts the children of an element', -'simplexmliterator::current' => 'Returns the current element', -'simplexmliterator::getChildren' => 'Returns the sub-elements of the current element', -'SimpleXMLIterator::getDocNamespaces' => 'Returns namespaces declared in document', -'SimpleXMLIterator::getName' => 'Gets the name of the XML element', -'SimpleXMLIterator::getNamespaces' => 'Returns namespaces used in document', -'simplexmliterator::hasChildren' => 'Checks whether the current element has sub elements', -'simplexmliterator::key' => 'Return current key', -'simplexmliterator::next' => 'Move to next element', -'SimpleXMLIterator::registerXPathNamespace' => 'Creates a prefix/ns context for the next XPath query', -'simplexmliterator::rewind' => 'Rewind to the first element', -'SimpleXMLIterator::saveXML' => 'Alias of SimpleXMLElement::asXML', -'simplexmliterator::valid' => 'Check whether the current element is valid', -'SimpleXMLIterator::xpath' => 'Runs XPath query on XML data', -'sin' => 'Sine', -'sinh' => 'Hyperbolic sine', -'sizeof' => 'Alias of count', -'sleep' => 'Delay execution', -'snmp2_get' => 'Fetch an SNMP object', -'snmp2_getnext' => 'Fetch the SNMP object which follows the given object id', -'snmp2_real_walk' => 'Return all objects including their respective object ID within the specified one', -'snmp2_set' => 'Set the value of an SNMP object', -'snmp2_walk' => 'Fetch all the SNMP objects from an agent', -'snmp3_get' => 'Fetch an SNMP object', -'snmp3_getnext' => 'Fetch the SNMP object which follows the given object id', -'snmp3_real_walk' => 'Return all objects including their respective object ID within the specified one', -'snmp3_set' => 'Set the value of an SNMP object', -'snmp3_walk' => 'Fetch all the SNMP objects from an agent', -'snmp::__construct' => 'Creates SNMP instance representing session to remote SNMP agent', -'snmp::close' => 'Close SNMP session', -'snmp::get' => 'Fetch an SNMP object', -'snmp::getErrno' => 'Get last error code', -'snmp::getError' => 'Get last error message', -'snmp::getnext' => 'Fetch an SNMP object which follows the given object id', -'snmp::set' => 'Set the value of an SNMP object', -'snmp::setSecurity' => 'Configures security-related SNMPv3 session parameters', -'snmp::walk' => 'Fetch SNMP object subtree', -'snmp_get_quick_print' => 'Fetches the current value of the UCD library\'s quick_print setting', -'snmp_get_valueretrieval' => 'Return the method how the SNMP values will be returned', -'snmp_read_mib' => 'Reads and parses a MIB file into the active MIB tree', -'snmp_set_enum_print' => 'Return all values that are enums with their enum value instead of the raw integer', -'snmp_set_oid_numeric_print' => 'Set the OID output format', -'snmp_set_oid_output_format' => 'Set the OID output format', -'snmp_set_quick_print' => 'Set the value of quick_print within the UCD SNMP library', -'snmp_set_valueretrieval' => 'Specify the method how the SNMP values will be returned', -'snmpget' => 'Fetch an SNMP object', -'snmpgetnext' => 'Fetch the SNMP object which follows the given object id', -'snmprealwalk' => 'Return all objects including their respective object ID within the specified one', -'snmpset' => 'Set the value of an SNMP object', -'snmpwalk' => 'Fetch all the SNMP objects from an agent', -'snmpwalkoid' => 'Query for a tree of information about a network entity', -'soapclient::__call' => 'Calls a SOAP function (deprecated)', -'soapclient::__construct' => 'SoapClient constructor', -'soapclient::__doRequest' => 'Performs a SOAP request', -'soapclient::__getCookies' => 'Get list of cookies', -'soapclient::__getFunctions' => 'Returns list of available SOAP functions', -'soapclient::__getLastRequest' => 'Returns last SOAP request', -'soapclient::__getLastRequestHeaders' => 'Returns the SOAP headers from the last request', -'soapclient::__getLastResponse' => 'Returns last SOAP response', -'soapclient::__getLastResponseHeaders' => 'Returns the SOAP headers from the last response', -'soapclient::__getTypes' => 'Returns a list of SOAP types', -'soapclient::__setCookie' => 'The __setCookie purpose', -'soapclient::__setLocation' => 'Sets the location of the Web service to use', -'soapclient::__setSoapHeaders' => 'Sets SOAP headers for subsequent calls', -'soapclient::__soapCall' => 'Calls a SOAP function', -'soapclient::SoapClient' => 'SoapClient constructor', -'SoapFault::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'soapfault::__construct' => 'SoapFault constructor', -'soapfault::__toString' => 'Obtain a string representation of a SoapFault', -'SoapFault::getCode' => 'Gets the Exception code', -'SoapFault::getFile' => 'Gets the file in which the exception occurred', -'SoapFault::getLine' => 'Gets the line in which the exception occurred', -'SoapFault::getMessage' => 'Gets the Exception message', -'SoapFault::getPrevious' => 'Returns previous Exception', -'SoapFault::getTrace' => 'Gets the stack trace', -'SoapFault::getTraceAsString' => 'Gets the stack trace as a string', -'soapfault::SoapFault' => 'SoapFault constructor', -'soapheader::__construct' => 'SoapHeader constructor', -'soapheader::SoapHeader' => 'SoapHeader constructor', -'soapparam::__construct' => 'SoapParam constructor', -'soapparam::SoapParam' => 'SoapParam constructor', -'soapserver::__construct' => 'SoapServer constructor', -'soapserver::addFunction' => 'Adds one or more functions to handle SOAP requests', -'soapserver::addSoapHeader' => 'Add a SOAP header to the response', -'soapserver::fault' => 'Issue SoapServer fault indicating an error', -'soapserver::getFunctions' => 'Returns list of defined functions', -'soapserver::handle' => 'Handles a SOAP request', -'soapserver::setClass' => 'Sets the class which handles SOAP requests', -'soapserver::setObject' => 'Sets the object which will be used to handle SOAP requests', -'soapserver::setPersistence' => 'Sets SoapServer persistence mode', -'soapserver::SoapServer' => 'SoapServer constructor', -'soapvar::__construct' => 'SoapVar constructor', -'soapvar::SoapVar' => 'SoapVar constructor', -'socket_accept' => 'Accepts a connection on a socket', -'socket_addrinfo_bind' => 'Create and bind to a socket from a given addrinfo', -'socket_addrinfo_connect' => 'Create and connect to a socket from a given addrinfo', -'socket_addrinfo_explain' => 'Get information about addrinfo', -'socket_addrinfo_lookup' => 'Get array with contents of getaddrinfo about the given hostname', -'socket_bind' => 'Binds a name to a socket', -'socket_clear_error' => 'Clears the error on the socket or the last error code', -'socket_close' => 'Closes a socket resource', -'socket_cmsg_space' => 'Calculate message buffer size', -'socket_connect' => 'Initiates a connection on a socket', -'socket_create' => 'Create a socket (endpoint for communication)', -'socket_create_listen' => 'Opens a socket on port to accept connections', -'socket_create_pair' => 'Creates a pair of indistinguishable sockets and stores them in an array', -'socket_export_stream' => 'Export a socket extension resource into a stream that encapsulates a socket', -'socket_get_option' => 'Gets socket options for the socket', -'socket_get_status' => 'Alias of stream_get_meta_data', -'socket_getopt' => 'Alias of socket_get_option', -'socket_getpeername' => 'Queries the remote side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type', -'socket_getsockname' => 'Queries the local side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type', -'socket_import_stream' => 'Import a stream', -'socket_last_error' => 'Returns the last error on the socket', -'socket_listen' => 'Listens for a connection on a socket', -'socket_read' => 'Reads a maximum of length bytes from a socket', -'socket_recv' => 'Receives data from a connected socket', -'socket_recvfrom' => 'Receives data from a socket whether or not it is connection-oriented', -'socket_recvmsg' => 'Read a message', -'socket_select' => 'Runs the select() system call on the given arrays of sockets with a specified timeout', -'socket_send' => 'Sends data to a connected socket', -'socket_sendmsg' => 'Send a message', -'socket_sendto' => 'Sends a message to a socket, whether it is connected or not', -'socket_set_block' => 'Sets blocking mode on a socket resource', -'socket_set_blocking' => 'Alias of stream_set_blocking', -'socket_set_nonblock' => 'Sets nonblocking mode for file descriptor fd', -'socket_set_option' => 'Sets socket options for the socket', -'socket_set_timeout' => 'Alias of stream_set_timeout', -'socket_setopt' => 'Alias of socket_set_option', -'socket_shutdown' => 'Shuts down a socket for receiving, sending, or both', -'socket_strerror' => 'Return a string describing a socket error', -'socket_write' => 'Write to a socket', -'Sodium\add' => 'Add the right operand to the left', -'Sodium\bin2hex' => 'Convert to hex without side-channels', -'Sodium\compare' => 'Compare two strings in constant time', -'Sodium\crypto_aead_aes256gcm_decrypt' => 'Authenticated Encryption with Associated Data (decrypt) -AES-256-GCM', -'Sodium\crypto_aead_aes256gcm_encrypt' => 'Authenticated Encryption with Associated Data (encrypt) -AES-256-GCM', -'Sodium\crypto_aead_aes256gcm_is_available' => 'Can you access AES-256-GCM? This is only available if you have supported -hardware.', -'Sodium\crypto_aead_chacha20poly1305_decrypt' => 'Authenticated Encryption with Associated Data (decrypt) -ChaCha20 + Poly1305', -'Sodium\crypto_aead_chacha20poly1305_encrypt' => 'Authenticated Encryption with Associated Data (encrypt) -ChaCha20 + Poly1305', -'Sodium\crypto_auth' => 'Secret-key message authentication -HMAC SHA-512/256', -'Sodium\crypto_auth_verify' => 'Secret-key message verification -HMAC SHA-512/256', -'Sodium\crypto_box' => 'Public-key authenticated encryption (encrypt) -X25519 + Xsalsa20 + Poly1305', -'Sodium\crypto_box_keypair' => 'Generate an X25519 keypair for use with the crypto_box API', -'Sodium\crypto_box_keypair_from_secretkey_and_publickey' => 'Create an X25519 keypair from an X25519 secret key and X25519 public key', -'Sodium\crypto_box_open' => 'Public-key authenticated encryption (decrypt) -X25519 + Xsalsa20 + Poly1305', -'Sodium\crypto_box_publickey' => 'Get an X25519 public key from an X25519 keypair', -'Sodium\crypto_box_publickey_from_secretkey' => 'Derive an X25519 public key from an X25519 secret key', -'Sodium\crypto_box_seal' => 'Anonymous public-key encryption (encrypt) -X25519 + Xsalsa20 + Poly1305 + BLAKE2b', -'Sodium\crypto_box_seal_open' => 'Anonymous public-key encryption (decrypt) -X25519 + Xsalsa20 + Poly1305 + BLAKE2b', -'Sodium\crypto_box_secretkey' => 'Extract the X25519 secret key from an X25519 keypair', -'Sodium\crypto_box_seed_keypair' => 'Derive an X25519 keypair for use with the crypto_box API from a seed', -'Sodium\crypto_generichash' => 'Fast and secure cryptographic hash', -'Sodium\crypto_generichash_final' => 'Get the final hash -BLAKE2b', -'Sodium\crypto_generichash_init' => 'Create a new hash state (e.g. to use for streams) -BLAKE2b', -'Sodium\crypto_generichash_update' => 'Update the hash state with some data -BLAKE2b', -'Sodium\crypto_kx' => 'Elliptic Curve Diffie Hellman Key Exchange -X25519', -'Sodium\crypto_pwhash' => 'Secure password-based key derivation function -Argon2i', -'Sodium\crypto_pwhash_scryptsalsa208sha256' => 'Secure password-based key derivation function -Scrypt', -'Sodium\crypto_pwhash_scryptsalsa208sha256_str' => 'Get a formatted password hash (for storage) -Scrypt', -'Sodium\crypto_pwhash_scryptsalsa208sha256_str_verify' => 'Verify a password against a hash -Scrypt', -'Sodium\crypto_pwhash_str' => 'Get a formatted password hash (for storage) -Argon2i', -'Sodium\crypto_pwhash_str_verify' => 'Verify a password against a hash -Argon2i', -'Sodium\crypto_scalarmult' => 'Elliptic Curve Diffie Hellman over Curve25519 -X25519', -'Sodium\crypto_scalarmult_base' => 'Scalar multiplication of the base point and your key', -'Sodium\crypto_secretbox' => 'Authenticated secret-key encryption (encrypt) -Xsals20 + Poly1305', -'Sodium\crypto_secretbox_open' => 'Authenticated secret-key encryption (decrypt) -Xsals20 + Poly1305', -'Sodium\crypto_shorthash' => 'A short keyed hash suitable for data structures -SipHash-2-4', -'Sodium\crypto_sign' => 'Digital Signature -Ed25519', -'Sodium\crypto_sign_detached' => 'Digital Signature (detached) -Ed25519', -'Sodium\crypto_sign_ed25519_pk_to_curve25519' => 'Convert an Ed25519 public key to an X25519 public key', -'Sodium\crypto_sign_ed25519_sk_to_curve25519' => 'Convert an Ed25519 secret key to an X25519 secret key', -'Sodium\crypto_sign_keypair' => 'Generate an Ed25519 keypair for use with the crypto_sign API', -'Sodium\crypto_sign_keypair_from_secretkey_and_publickey' => 'Create an Ed25519 keypair from an Ed25519 secret key + Ed25519 public key', -'Sodium\crypto_sign_open' => 'Verify a signed message and return the plaintext', -'Sodium\crypto_sign_publickey' => 'Get the public key from an Ed25519 keypair', -'Sodium\crypto_sign_publickey_from_secretkey' => 'Derive an Ed25519 public key from an Ed25519 secret key', -'Sodium\crypto_sign_secretkey' => 'Get the secret key from an Ed25519 keypair', -'Sodium\crypto_sign_seed_keypair' => 'Derive an Ed25519 keypair for use with the crypto_sign API from a seed', -'Sodium\crypto_sign_verify_detached' => 'Verify a detached signature', -'Sodium\crypto_stream' => 'Create a keystream from a key and nonce -Xsalsa20', -'Sodium\crypto_stream_xor' => 'Encrypt a message using a stream cipher -Xsalsa20', -'Sodium\hex2bin' => 'Convert from hex without side-channels', -'Sodium\increment' => 'Increment a string in little-endian', -'Sodium\library_version_major' => 'Get the true major version of libsodium', -'Sodium\library_version_minor' => 'Get the true minor version of libsodium', -'Sodium\memcmp' => 'Compare two strings in constant time', -'Sodium\memzero' => 'Wipe a buffer', -'Sodium\randombytes_buf' => 'Generate a string of random bytes -/dev/urandom', -'Sodium\randombytes_random16' => 'Generate a 16-bit integer -/dev/urandom', -'Sodium\randombytes_uniform' => 'Generate an unbiased random integer between 0 and a specified value -/dev/urandom', -'Sodium\version_string' => 'Get the version string', -'sodium_add' => 'Add large numbers', -'sodium_bin2hex' => 'Encode to hexadecimal', -'sodium_compare' => 'Compare large numbers', -'sodium_crypto_aead_aes256gcm_decrypt' => 'Decrypt in combined mode with precalculation', -'sodium_crypto_aead_aes256gcm_encrypt' => 'Encrypt in combined mode with precalculation', -'sodium_crypto_aead_aes256gcm_is_available' => 'Check if hardware supports AES256-GCM', -'sodium_crypto_aead_aes256gcm_keygen' => 'Get random bytes for key', -'sodium_crypto_aead_chacha20poly1305_decrypt' => 'Verify that the ciphertext includes a valid tag', -'sodium_crypto_aead_chacha20poly1305_encrypt' => 'Encrypt a message', -'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => 'Verify that the ciphertext includes a valid tag', -'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => 'Encrypt a message', -'sodium_crypto_aead_chacha20poly1305_ietf_keygen' => 'Get random bytes for key', -'sodium_crypto_aead_chacha20poly1305_keygen' => 'Get random bytes for key', -'sodium_crypto_auth' => 'Compute a tag for the message', -'sodium_crypto_auth_keygen' => 'Get random bytes for key', -'sodium_crypto_auth_verify' => 'Verifies that the tag is valid for the message', -'sodium_crypto_box' => 'Encrypt a message', -'sodium_crypto_box_keypair' => 'Randomly generate a secret key and a corresponding public key', -'sodium_crypto_box_open' => 'Verify and decrypt a ciphertext', -'sodium_crypto_box_seal' => 'Encrypt a message', -'sodium_crypto_box_seal_open' => 'Decrypt the ciphertext', -'sodium_crypto_box_seed_keypair' => 'Deterministically derive the key pair from a single key', -'sodium_crypto_generichash' => 'Get a hash of the message', -'sodium_crypto_generichash_final' => 'Complete the hash', -'sodium_crypto_generichash_init' => 'Initialize a hash', -'sodium_crypto_generichash_keygen' => 'Get random bytes for key', -'sodium_crypto_generichash_update' => 'Add message to a hash', -'sodium_crypto_kdf_derive_from_key' => 'Derive a subkey', -'sodium_crypto_kdf_keygen' => 'Get random bytes for key', -'sodium_crypto_kx_keypair' => 'Creates a new sodium keypair', -'sodium_crypto_pwhash' => 'Derive a key from a password', -'sodium_crypto_pwhash_scryptsalsa208sha256' => 'Derives a key from a password', -'sodium_crypto_pwhash_scryptsalsa208sha256_str' => 'Get an ASCII encoded hash', -'sodium_crypto_pwhash_scryptsalsa208sha256_str_verify' => 'Verify that the password is a valid password verification string', -'sodium_crypto_pwhash_str' => 'Get an ASCII-encoded hash', -'sodium_crypto_pwhash_str_verify' => 'Verifies that a password matches a hash', -'sodium_crypto_scalarmult' => 'Compute a shared secret given a user\'s secret key and another user\'s public key', -'sodium_crypto_scalarmult_base' => 'Alias of sodium_crypto_box_publickey_from_secretkey', -'sodium_crypto_secretbox' => 'Encrypt a message', -'sodium_crypto_secretbox_keygen' => 'Get random bytes for key', -'sodium_crypto_secretbox_open' => 'Verify and decrypt a ciphertext', -'sodium_crypto_shorthash' => 'Compute a fixed-size fingerprint for the message', -'sodium_crypto_shorthash_keygen' => 'Get random bytes for key', -'sodium_crypto_sign' => 'Sign a message', -'sodium_crypto_sign_detached' => 'Sign the message', -'sodium_crypto_sign_ed25519_pk_to_curve25519' => 'Convert an Ed25519 public key to a Curve25519 public key', -'sodium_crypto_sign_ed25519_sk_to_curve25519' => 'Convert an Ed25519 secret key to a Curve25519 secret key', -'sodium_crypto_sign_keypair' => 'Randomly generate a secret key and a corresponding public key', -'sodium_crypto_sign_open' => 'Check that the signed message has a valid signature', -'sodium_crypto_sign_publickey_from_secretkey' => 'Extract the public key from the secret key', -'sodium_crypto_sign_seed_keypair' => 'Deterministically derive the key pair from a single key', -'sodium_crypto_sign_verify_detached' => 'Verify signature for the message', -'sodium_crypto_stream' => 'Generate a deterministic sequence of bytes from a seed', -'sodium_crypto_stream_keygen' => 'Get random bytes for key', -'sodium_crypto_stream_xor' => 'Encrypt a message', -'sodium_hex2bin' => 'Decodes a hexadecimally encoded binary string', -'sodium_increment' => 'Increment large number', -'sodium_memcmp' => 'Test for equality in constant-time', -'sodium_memzero' => 'Overwrite buf with zeros', -'sodium_pad' => 'Add padding data', -'sodium_unpad' => 'Remove padding data', -'solr_get_version' => 'Returns the current version of the Apache Solr extension', -'solrclient::__construct' => 'Constructor for the SolrClient object', -'solrclient::__destruct' => 'Destructor for SolrClient', -'solrclient::addDocument' => 'Adds a document to the index', -'solrclient::addDocuments' => 'Adds a collection of SolrInputDocument instances to the index', -'solrclient::commit' => 'Finalizes all add/deletes made to the index', -'solrclient::deleteById' => 'Delete by Id', -'solrclient::deleteByIds' => 'Deletes by Ids', -'solrclient::deleteByQueries' => 'Removes all documents matching any of the queries', -'solrclient::deleteByQuery' => 'Deletes all documents matching the given query', -'solrclient::getById' => 'Get Document By Id. Utilizes Solr Realtime Get (RTG)', -'solrclient::getByIds' => 'Get Documents by their Ids. Utilizes Solr Realtime Get (RTG)', -'solrclient::getDebug' => 'Returns the debug data for the last connection attempt', -'solrclient::getOptions' => 'Returns the client options set internally', -'solrclient::optimize' => 'Defragments the index', -'solrclient::ping' => 'Checks if Solr server is still up', -'solrclient::query' => 'Sends a query to the server', -'solrclient::request' => 'Sends a raw update request', -'solrclient::rollback' => 'Rollbacks all add/deletes made to the index since the last commit', -'solrclient::setResponseWriter' => 'Sets the response writer used to prepare the response from Solr', -'solrclient::setServlet' => 'Changes the specified servlet type to a new value', -'solrclient::system' => 'Retrieve Solr Server information', -'solrclient::threads' => 'Checks the threads status', -'SolrClientException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'SolrClientException::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'SolrClientException::__toString' => 'String representation of the exception', -'SolrClientException::getCode' => 'Gets the Exception code', -'SolrClientException::getFile' => 'Gets the file in which the exception occurred', -'solrclientexception::getInternalInfo' => 'Returns internal information where the Exception was thrown', -'SolrClientException::getLine' => 'Gets the line in which the exception occurred', -'SolrClientException::getMessage' => 'Gets the Exception message', -'SolrClientException::getPrevious' => 'Returns previous Exception', -'SolrClientException::getTrace' => 'Gets the stack trace', -'SolrClientException::getTraceAsString' => 'Gets the stack trace as a string', -'solrcollapsefunction::__construct' => 'Constructor', -'solrcollapsefunction::__toString' => 'Returns a string representing the constructed collapse function', -'solrcollapsefunction::getField' => 'Returns the field that is being collapsed on', -'solrcollapsefunction::getHint' => 'Returns collapse hint', -'solrcollapsefunction::getMax' => 'Returns max parameter', -'solrcollapsefunction::getMin' => 'Returns min parameter', -'solrcollapsefunction::getNullPolicy' => 'Returns null policy', -'solrcollapsefunction::getSize' => 'Returns size parameter', -'solrcollapsefunction::setField' => 'Sets the field to collapse on', -'solrcollapsefunction::setHint' => 'Sets collapse hint', -'solrcollapsefunction::setMax' => 'Selects the group heads by the max value of a numeric field or function query', -'solrcollapsefunction::setMin' => 'Sets the initial size of the collapse data structures when collapsing on a numeric field only', -'solrcollapsefunction::setNullPolicy' => 'Sets the NULL Policy', -'solrcollapsefunction::setSize' => 'Sets the initial size of the collapse data structures when collapsing on a numeric field only', -'solrdismaxquery::__construct' => 'Class Constructor', -'SolrDisMaxQuery::__destruct' => 'Destructor', -'SolrDisMaxQuery::add' => 'This is an alias for SolrParams::addParam', -'solrdismaxquery::addBigramPhraseField' => 'Adds a Phrase Bigram Field (pf2 parameter)', -'solrdismaxquery::addBoostQuery' => 'Adds a boost query field with value and optional boost (bq parameter)', -'SolrDisMaxQuery::addExpandFilterQuery' => 'Overrides main filter query, determines which documents to include in the main group.', -'SolrDisMaxQuery::addExpandSortField' => 'Orders the documents within the expanded groups (expand.sort parameter).', -'SolrDisMaxQuery::addFacetDateField' => 'Maps to facet.date', -'SolrDisMaxQuery::addFacetDateOther' => 'Adds another facet.date.other parameter', -'SolrDisMaxQuery::addFacetField' => 'Adds another field to the facet', -'SolrDisMaxQuery::addFacetQuery' => 'Adds a facet query', -'SolrDisMaxQuery::addField' => 'Specifies which fields to return in the result', -'SolrDisMaxQuery::addFilterQuery' => 'Specifies a filter query', -'SolrDisMaxQuery::addGroupField' => 'Add a field to be used to group results.', -'SolrDisMaxQuery::addGroupFunction' => 'Allows grouping results based on the unique values of a function query (group.func parameter).', -'SolrDisMaxQuery::addGroupQuery' => 'Allows grouping of documents that match the given query.', -'SolrDisMaxQuery::addGroupSortField' => 'Add a group sort field (group.sort parameter).', -'SolrDisMaxQuery::addHighlightField' => 'Maps to hl.fl', -'SolrDisMaxQuery::addMltField' => 'Sets a field to use for similarity', -'SolrDisMaxQuery::addMltQueryField' => 'Maps to mlt.qf', -'SolrDisMaxQuery::addParam' => 'Adds a parameter to the object', -'solrdismaxquery::addPhraseField' => 'Adds a Phrase Field (pf parameter)', -'solrdismaxquery::addQueryField' => 'Add a query field with optional boost (qf parameter)', -'SolrDisMaxQuery::addSortField' => 'Used to control how the results should be sorted', -'SolrDisMaxQuery::addStatsFacet' => 'Requests a return of sub results for values within the given facet', -'SolrDisMaxQuery::addStatsField' => 'Maps to stats.field parameter', -'solrdismaxquery::addTrigramPhraseField' => 'Adds a Trigram Phrase Field (pf3 parameter)', -'solrdismaxquery::addUserField' => 'Adds a field to User Fields Parameter (uf)', -'SolrDisMaxQuery::collapse' => 'Collapses the result set to a single document per group', -'SolrDisMaxQuery::get' => 'This is an alias for SolrParams::getParam', -'SolrDisMaxQuery::getExpand' => 'Returns true if group expanding is enabled', -'SolrDisMaxQuery::getExpandFilterQueries' => 'Returns the expand filter queries', -'SolrDisMaxQuery::getExpandQuery' => 'Returns the expand query expand.q parameter', -'SolrDisMaxQuery::getExpandRows' => 'Returns The number of rows to display in each group (expand.rows)', -'SolrDisMaxQuery::getExpandSortFields' => 'Returns an array of fields', -'SolrDisMaxQuery::getFacet' => 'Returns the value of the facet parameter', -'SolrDisMaxQuery::getFacetDateEnd' => 'Returns the value for the facet.date.end parameter', -'SolrDisMaxQuery::getFacetDateFields' => 'Returns all the facet.date fields', -'SolrDisMaxQuery::getFacetDateGap' => 'Returns the value of the facet.date.gap parameter', -'SolrDisMaxQuery::getFacetDateHardEnd' => 'Returns the value of the facet.date.hardend parameter', -'SolrDisMaxQuery::getFacetDateOther' => 'Returns the value for the facet.date.other parameter', -'SolrDisMaxQuery::getFacetDateStart' => 'Returns the lower bound for the first date range for all date faceting on this field', -'SolrDisMaxQuery::getFacetFields' => 'Returns all the facet fields', -'SolrDisMaxQuery::getFacetLimit' => 'Returns the maximum number of constraint counts that should be returned for the facet fields', -'SolrDisMaxQuery::getFacetMethod' => 'Returns the value of the facet.method parameter', -'SolrDisMaxQuery::getFacetMinCount' => 'Returns the minimum counts for facet fields should be included in the response', -'SolrDisMaxQuery::getFacetMissing' => 'Returns the current state of the facet.missing parameter', -'SolrDisMaxQuery::getFacetOffset' => 'Returns an offset into the list of constraints to be used for pagination', -'SolrDisMaxQuery::getFacetPrefix' => 'Returns the facet prefix', -'SolrDisMaxQuery::getFacetQueries' => 'Returns all the facet queries', -'SolrDisMaxQuery::getFacetSort' => 'Returns the facet sort type', -'SolrDisMaxQuery::getFields' => 'Returns the list of fields that will be returned in the response', -'SolrDisMaxQuery::getFilterQueries' => 'Returns an array of filter queries', -'SolrDisMaxQuery::getGroup' => 'Returns true if grouping is enabled -https://secure.php.net/manual/en/solrquery.getgroup.php', -'SolrDisMaxQuery::getGroupCachePercent' => 'Returns group cache percent value', -'SolrDisMaxQuery::getGroupFacet' => 'Returns the group.facet parameter value', -'SolrDisMaxQuery::getGroupFields' => 'Returns group fields (group.field parameter values)', -'SolrDisMaxQuery::getGroupFormat' => 'Returns the group.format value', -'SolrDisMaxQuery::getGroupFunctions' => 'Returns group functions (group.func parameter values)', -'SolrDisMaxQuery::getGroupLimit' => 'Returns the group.limit value', -'SolrDisMaxQuery::getGroupMain' => 'Returns the group.main value', -'SolrDisMaxQuery::getGroupNGroups' => 'Returns the group.ngroups value', -'SolrDisMaxQuery::getGroupOffset' => 'Returns the group.offset value', -'SolrDisMaxQuery::getGroupQueries' => 'Returns all the group.query parameter values', -'SolrDisMaxQuery::getGroupSortFields' => 'Returns the group.sort value', -'SolrDisMaxQuery::getGroupTruncate' => 'Returns the group.truncate value', -'SolrDisMaxQuery::getHighlight' => 'Returns the state of the hl parameter', -'SolrDisMaxQuery::getHighlightAlternateField' => 'Returns the highlight field to use as backup or default', -'SolrDisMaxQuery::getHighlightFields' => 'Returns all the fields that Solr should generate highlighted snippets for', -'SolrDisMaxQuery::getHighlightFormatter' => 'Returns the formatter for the highlighted output', -'SolrDisMaxQuery::getHighlightFragmenter' => 'Returns the text snippet generator for highlighted text', -'SolrDisMaxQuery::getHighlightFragsize' => 'Returns the number of characters of fragments to consider for highlighting', -'SolrDisMaxQuery::getHighlightHighlightMultiTerm' => 'Returns whether or not to enable highlighting for range/wildcard/fuzzy/prefix queries', -'SolrDisMaxQuery::getHighlightMaxAlternateFieldLength' => 'Returns the maximum number of characters of the field to return', -'SolrDisMaxQuery::getHighlightMaxAnalyzedChars' => 'Returns the maximum number of characters into a document to look for suitable snippets', -'SolrDisMaxQuery::getHighlightMergeContiguous' => 'Returns whether or not the collapse contiguous fragments into a single fragment', -'SolrDisMaxQuery::getHighlightRegexMaxAnalyzedChars' => 'Returns the maximum number of characters from a field when using the regex fragmenter', -'SolrDisMaxQuery::getHighlightRegexPattern' => 'Returns the regular expression for fragmenting', -'SolrDisMaxQuery::getHighlightRegexSlop' => 'Returns the deviation factor from the ideal fragment size', -'SolrDisMaxQuery::getHighlightRequireFieldMatch' => 'Returns if a field will only be highlighted if the query matched in this particular field', -'SolrDisMaxQuery::getHighlightSimplePost' => 'Returns the text which appears after a highlighted term', -'SolrDisMaxQuery::getHighlightSimplePre' => 'Returns the text which appears before a highlighted term', -'SolrDisMaxQuery::getHighlightSnippets' => 'Returns the maximum number of highlighted snippets to generate per field', -'SolrDisMaxQuery::getHighlightUsePhraseHighlighter' => 'Returns the state of the hl.usePhraseHighlighter parameter', -'SolrDisMaxQuery::getMlt' => 'Returns whether or not MoreLikeThis results should be enabled', -'SolrDisMaxQuery::getMltBoost' => 'Returns whether or not the query will be boosted by the interesting term relevance', -'SolrDisMaxQuery::getMltCount' => 'Returns the number of similar documents to return for each result', -'SolrDisMaxQuery::getMltFields' => 'Returns all the fields to use for similarity', -'SolrDisMaxQuery::getMltMaxNumQueryTerms' => 'Returns the maximum number of query terms that will be included in any generated query', -'SolrDisMaxQuery::getMltMaxNumTokens' => 'Returns the maximum number of tokens to parse in each document field that is not stored with TermVector support', -'SolrDisMaxQuery::getMltMaxWordLength' => 'Returns the maximum word length above which words will be ignored', -'SolrDisMaxQuery::getMltMinDocFrequency' => 'Returns the threshold frequency at which words will be ignored which do not occur in at least this many docs', -'SolrDisMaxQuery::getMltMinTermFrequency' => 'Returns the frequency below which terms will be ignored in the source document', -'SolrDisMaxQuery::getMltMinWordLength' => 'Returns the minimum word length below which words will be ignored', -'SolrDisMaxQuery::getMltQueryFields' => 'Returns the query fields and their boosts', -'SolrDisMaxQuery::getParam' => 'Returns a parameter value', -'SolrDisMaxQuery::getParams' => 'Returns an array of non URL-encoded parameters', -'SolrDisMaxQuery::getPreparedParams' => 'Returns an array of URL-encoded parameters', -'SolrDisMaxQuery::getQuery' => 'Returns the main query', -'SolrDisMaxQuery::getRows' => 'Returns the maximum number of documents', -'SolrDisMaxQuery::getSortFields' => 'Returns all the sort fields', -'SolrDisMaxQuery::getStart' => 'Returns the offset in the complete result set', -'SolrDisMaxQuery::getStats' => 'Returns whether or not stats is enabled', -'SolrDisMaxQuery::getStatsFacets' => 'Returns all the stats facets that were set', -'SolrDisMaxQuery::getStatsFields' => 'Returns all the statistics fields', -'SolrDisMaxQuery::getTerms' => 'Returns whether or not the TermsComponent is enabled', -'SolrDisMaxQuery::getTermsField' => 'Returns the field from which the terms are retrieved', -'SolrDisMaxQuery::getTermsIncludeLowerBound' => 'Returns whether or not to include the lower bound in the result set', -'SolrDisMaxQuery::getTermsIncludeUpperBound' => 'Returns whether or not to include the upper bound term in the result set', -'SolrDisMaxQuery::getTermsLimit' => 'Returns the maximum number of terms Solr should return', -'SolrDisMaxQuery::getTermsLowerBound' => 'Returns the term to start at', -'SolrDisMaxQuery::getTermsMaxCount' => 'Returns the maximum document frequency', -'SolrDisMaxQuery::getTermsMinCount' => 'Returns the minimum document frequency to return in order to be included', -'SolrDisMaxQuery::getTermsPrefix' => 'Returns the term prefix', -'SolrDisMaxQuery::getTermsReturnRaw' => 'Whether or not to return raw characters', -'SolrDisMaxQuery::getTermsSort' => 'Returns an integer indicating how terms are sorted', -'SolrDisMaxQuery::getTermsUpperBound' => 'Returns the term to stop at', -'SolrDisMaxQuery::getTimeAllowed' => 'Returns the time in milliseconds allowed for the query to finish', -'solrdismaxquery::removeBigramPhraseField' => 'Removes phrase bigram field (pf2 parameter)', -'solrdismaxquery::removeBoostQuery' => 'Removes a boost query partial by field name (bq)', -'SolrDisMaxQuery::removeExpandFilterQuery' => 'Removes an expand filter query', -'SolrDisMaxQuery::removeExpandSortField' => 'Removes an expand sort field from the expand.sort parameter.', -'SolrDisMaxQuery::removeFacetDateField' => 'Removes one of the facet date fields', -'SolrDisMaxQuery::removeFacetDateOther' => 'Removes one of the facet.date.other parameters', -'SolrDisMaxQuery::removeFacetField' => 'Removes one of the facet.date parameters', -'SolrDisMaxQuery::removeFacetQuery' => 'Removes one of the facet.query parameters', -'SolrDisMaxQuery::removeField' => 'Removes a field from the list of fields', -'SolrDisMaxQuery::removeFilterQuery' => 'Removes a filter query', -'SolrDisMaxQuery::removeHighlightField' => 'Removes one of the fields used for highlighting', -'SolrDisMaxQuery::removeMltField' => 'Removes one of the moreLikeThis fields', -'SolrDisMaxQuery::removeMltQueryField' => 'Removes one of the moreLikeThis query fields', -'solrdismaxquery::removePhraseField' => 'Removes a Phrase Field (pf parameter)', -'solrdismaxquery::removeQueryField' => 'Removes a Query Field (qf parameter)', -'SolrDisMaxQuery::removeSortField' => 'Removes one of the sort fields', -'SolrDisMaxQuery::removeStatsFacet' => 'Removes one of the stats.facet parameters', -'SolrDisMaxQuery::removeStatsField' => 'Removes one of the stats.field parameters', -'solrdismaxquery::removeTrigramPhraseField' => 'Removes a Trigram Phrase Field (pf3 parameter)', -'solrdismaxquery::removeUserField' => 'Removes a field from The User Fields Parameter (uf)', -'SolrDisMaxQuery::serialize' => 'Used for custom serialization', -'SolrDisMaxQuery::set' => 'An alias of SolrParams::setParam', -'solrdismaxquery::setBigramPhraseFields' => 'Sets Bigram Phrase Fields and their boosts (and slops) using pf2 parameter', -'solrdismaxquery::setBigramPhraseSlop' => 'Sets Bigram Phrase Slop (ps2 parameter)', -'solrdismaxquery::setBoostFunction' => 'Sets a Boost Function (bf parameter)', -'solrdismaxquery::setBoostQuery' => 'Directly Sets Boost Query Parameter (bq)', -'SolrDisMaxQuery::setEchoHandler' => 'Toggles the echoHandler parameter', -'SolrDisMaxQuery::setEchoParams' => 'Determines what kind of parameters to include in the response', -'SolrDisMaxQuery::setExpand' => 'Enables/Disables the Expand Component', -'SolrDisMaxQuery::setExpandQuery' => 'Sets the expand.q parameter', -'SolrDisMaxQuery::setExpandRows' => 'Sets the number of rows to display in each group (expand.rows). Server Default 5', -'SolrDisMaxQuery::setExplainOther' => 'Sets the explainOther common query parameter', -'SolrDisMaxQuery::setFacet' => 'Maps to the facet parameter. Enables or disables facetting', -'SolrDisMaxQuery::setFacetDateEnd' => 'Maps to facet.date.end', -'SolrDisMaxQuery::setFacetDateGap' => 'Maps to facet.date.gap', -'SolrDisMaxQuery::setFacetDateHardEnd' => 'Maps to facet.date.hardend', -'SolrDisMaxQuery::setFacetDateStart' => 'Maps to facet.date.start', -'SolrDisMaxQuery::setFacetEnumCacheMinDefaultFrequency' => 'Sets the minimum document frequency used for determining term count', -'SolrDisMaxQuery::setFacetLimit' => 'Maps to facet.limit', -'SolrDisMaxQuery::setFacetMethod' => 'Specifies the type of algorithm to use when faceting a field', -'SolrDisMaxQuery::setFacetMinCount' => 'Maps to facet.mincount', -'SolrDisMaxQuery::setFacetMissing' => 'Maps to facet.missing', -'SolrDisMaxQuery::setFacetOffset' => 'Sets the offset into the list of constraints to allow for pagination', -'SolrDisMaxQuery::setFacetPrefix' => 'Specifies a string prefix with which to limits the terms on which to facet', -'SolrDisMaxQuery::setFacetSort' => 'Determines the ordering of the facet field constraints', -'SolrDisMaxQuery::setGroup' => 'Enable/Disable result grouping (group parameter)', -'SolrDisMaxQuery::setGroupCachePercent' => 'Enables caching for result grouping', -'SolrDisMaxQuery::setGroupFacet' => 'Sets group.facet parameter', -'SolrDisMaxQuery::setGroupFormat' => 'Sets the group format, result structure (group.format parameter).', -'SolrDisMaxQuery::setGroupLimit' => 'Specifies the number of results to return for each group. The server default value is 1.', -'SolrDisMaxQuery::setGroupMain' => 'If true, the result of the first field grouping command is used as the main result list in the response, using -group.format=simple.', -'SolrDisMaxQuery::setGroupNGroups' => 'If true, Solr includes the number of groups that have matched the query in the results.', -'SolrDisMaxQuery::setGroupOffset' => 'Sets the group.offset parameter.', -'SolrDisMaxQuery::setGroupTruncate' => 'If true, facet counts are based on the most relevant document of each group matching the query.', -'SolrDisMaxQuery::setHighlight' => 'Enables or disables highlighting', -'SolrDisMaxQuery::setHighlightAlternateField' => 'Specifies the backup field to use', -'SolrDisMaxQuery::setHighlightFormatter' => 'Specify a formatter for the highlight output', -'SolrDisMaxQuery::setHighlightFragmenter' => 'Sets a text snippet generator for highlighted text', -'SolrDisMaxQuery::setHighlightFragsize' => 'The size of fragments to consider for highlighting', -'SolrDisMaxQuery::setHighlightHighlightMultiTerm' => 'Use SpanScorer to highlight phrase terms', -'SolrDisMaxQuery::setHighlightMaxAlternateFieldLength' => 'Sets the maximum number of characters of the field to return', -'SolrDisMaxQuery::setHighlightMaxAnalyzedChars' => 'Specifies the number of characters into a document to look for suitable snippets', -'SolrDisMaxQuery::setHighlightMergeContiguous' => 'Whether or not to collapse contiguous fragments into a single fragment', -'SolrDisMaxQuery::setHighlightRegexMaxAnalyzedChars' => 'Specify the maximum number of characters to analyze', -'SolrDisMaxQuery::setHighlightRegexPattern' => 'Specify the regular expression for fragmenting', -'SolrDisMaxQuery::setHighlightRegexSlop' => 'Sets the factor by which the regex fragmenter can stray from the ideal fragment size', -'SolrDisMaxQuery::setHighlightRequireFieldMatch' => 'Require field matching during highlighting', -'SolrDisMaxQuery::setHighlightSimplePost' => 'Sets the text which appears after a highlighted term', -'SolrDisMaxQuery::setHighlightSimplePre' => 'Sets the text which appears before a highlighted term', -'SolrDisMaxQuery::setHighlightSnippets' => 'Sets the maximum number of highlighted snippets to generate per field', -'SolrDisMaxQuery::setHighlightUsePhraseHighlighter' => 'Whether to highlight phrase terms only when they appear within the query phrase', -'solrdismaxquery::setMinimumMatch' => 'Set Minimum "Should" Match (mm)', -'SolrDisMaxQuery::setMlt' => 'Enables or disables moreLikeThis', -'SolrDisMaxQuery::setMltBoost' => 'Set if the query will be boosted by the interesting term relevance', -'SolrDisMaxQuery::setMltCount' => 'Set the number of similar documents to return for each result', -'SolrDisMaxQuery::setMltMaxNumQueryTerms' => 'Sets the maximum number of query terms included', -'SolrDisMaxQuery::setMltMaxNumTokens' => 'Specifies the maximum number of tokens to parse', -'SolrDisMaxQuery::setMltMaxWordLength' => 'Sets the maximum word length', -'SolrDisMaxQuery::setMltMinDocFrequency' => 'Sets the mltMinDoc frequency', -'SolrDisMaxQuery::setMltMinTermFrequency' => 'Sets the frequency below which terms will be ignored in the source docs', -'SolrDisMaxQuery::setMltMinWordLength' => 'Sets the minimum word length', -'SolrDisMaxQuery::setOmitHeader' => 'Exclude the header from the returned results', -'SolrDisMaxQuery::setParam' => 'Sets the parameter to the specified value', -'solrdismaxquery::setPhraseFields' => 'Sets Phrase Fields and their boosts (and slops) using pf2 parameter', -'solrdismaxquery::setPhraseSlop' => 'Sets the default slop on phrase queries (ps parameter)', -'SolrDisMaxQuery::setQuery' => 'Sets the search query', -'solrdismaxquery::setQueryAlt' => 'Set Query Alternate (q.alt parameter)', -'solrdismaxquery::setQueryPhraseSlop' => 'Specifies the amount of slop permitted on phrase queries explicitly included in the user\'s query string (qf parameter)', -'SolrDisMaxQuery::setRows' => 'Specifies the maximum number of rows to return in the result', -'SolrDisMaxQuery::setShowDebugInfo' => 'Flag to show debug information', -'SolrDisMaxQuery::setStart' => 'Specifies the number of rows to skip', -'SolrDisMaxQuery::setStats' => 'Enables or disables the Stats component', -'SolrDisMaxQuery::setTerms' => 'Enables or disables the TermsComponent', -'SolrDisMaxQuery::setTermsField' => 'Sets the name of the field to get the Terms from', -'SolrDisMaxQuery::setTermsIncludeLowerBound' => 'Include the lower bound term in the result set', -'SolrDisMaxQuery::setTermsIncludeUpperBound' => 'Include the upper bound term in the result set', -'SolrDisMaxQuery::setTermsLimit' => 'Sets the maximum number of terms to return', -'SolrDisMaxQuery::setTermsLowerBound' => 'Specifies the Term to start from', -'SolrDisMaxQuery::setTermsMaxCount' => 'Sets the maximum document frequency', -'SolrDisMaxQuery::setTermsMinCount' => 'Sets the minimum document frequency', -'SolrDisMaxQuery::setTermsPrefix' => 'Restrict matches to terms that start with the prefix', -'SolrDisMaxQuery::setTermsReturnRaw' => 'Return the raw characters of the indexed term', -'SolrDisMaxQuery::setTermsSort' => 'Specifies how to sort the returned terms', -'SolrDisMaxQuery::setTermsUpperBound' => 'Sets the term to stop at', -'solrdismaxquery::setTieBreaker' => 'Sets Tie Breaker parameter (tie parameter)', -'SolrDisMaxQuery::setTimeAllowed' => 'The time allowed for search to finish', -'solrdismaxquery::setTrigramPhraseFields' => 'Directly Sets Trigram Phrase Fields (pf3 parameter)', -'solrdismaxquery::setTrigramPhraseSlop' => 'Sets Trigram Phrase Slop (ps3 parameter)', -'solrdismaxquery::setUserFields' => 'Sets User Fields parameter (uf)', -'SolrDisMaxQuery::toString' => 'Returns all the name-value pair parameters in the object', -'SolrDisMaxQuery::unserialize' => 'Used for custom serialization', -'solrdismaxquery::useDisMaxQueryParser' => 'Switch QueryParser to be DisMax Query Parser', -'solrdismaxquery::useEDisMaxQueryParser' => 'Switch QueryParser to be EDisMax', -'solrdocument::__clone' => 'Creates a copy of a SolrDocument object', -'solrdocument::__construct' => 'Constructor', -'solrdocument::__destruct' => 'Destructor', -'solrdocument::__get' => 'Access the field as a property', -'solrdocument::__isset' => 'Checks if a field exists', -'solrdocument::__set' => 'Adds another field to the document', -'solrdocument::__unset' => 'Removes a field from the document', -'solrdocument::addField' => 'Adds a field to the document', -'solrdocument::clear' => 'Drops all the fields in the document', -'solrdocument::current' => 'Retrieves the current field', -'solrdocument::deleteField' => 'Removes a field from the document', -'solrdocument::fieldExists' => 'Checks if a field exists in the document', -'solrdocument::getChildDocuments' => 'Returns an array of child documents (SolrDocument)', -'solrdocument::getChildDocumentsCount' => 'Returns the number of child documents', -'solrdocument::getField' => 'Retrieves a field by name', -'solrdocument::getFieldCount' => 'Returns the number of fields in this document', -'solrdocument::getFieldNames' => 'Returns an array of fields names in the document', -'solrdocument::getInputDocument' => 'Returns a SolrInputDocument equivalent of the object', -'solrdocument::hasChildDocuments' => 'Checks whether the document has any child documents', -'solrdocument::key' => 'Retrieves the current key', -'solrdocument::merge' => 'Merges source to the current SolrDocument', -'solrdocument::next' => 'Moves the internal pointer to the next field', -'solrdocument::offsetExists' => 'Checks if a particular field exists', -'solrdocument::offsetGet' => 'Retrieves a field', -'solrdocument::offsetSet' => 'Adds a field to the document', -'solrdocument::offsetUnset' => 'Removes a field', -'solrdocument::reset' => 'This is an alias to SolrDocument::clear()', -'solrdocument::rewind' => 'Resets the internal pointer to the beginning', -'solrdocument::serialize' => 'Used for custom serialization', -'solrdocument::sort' => 'Sorts the fields in the document', -'solrdocument::toArray' => 'Returns an array representation of the document', -'solrdocument::unserialize' => 'Custom serialization of SolrDocument objects', -'solrdocument::valid' => 'Checks if the current position internally is still valid', -'solrdocumentfield::__construct' => 'Constructor', -'solrdocumentfield::__destruct' => 'Destructor', -'SolrException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'SolrException::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'SolrException::__toString' => 'String representation of the exception', -'SolrException::getCode' => 'Gets the Exception code', -'SolrException::getFile' => 'Gets the file in which the exception occurred', -'solrexception::getInternalInfo' => 'Returns internal information where the Exception was thrown', -'SolrException::getLine' => 'Gets the line in which the exception occurred', -'SolrException::getMessage' => 'Gets the Exception message', -'SolrException::getPrevious' => 'Returns previous Exception', -'SolrException::getTrace' => 'Gets the stack trace', -'SolrException::getTraceAsString' => 'Gets the stack trace as a string', -'solrgenericresponse::__construct' => 'Constructor', -'solrgenericresponse::__destruct' => 'Destructor', -'SolrGenericResponse::getDigestedResponse' => 'Returns the XML response as serialized PHP data', -'SolrGenericResponse::getHttpStatus' => 'Returns the HTTP status of the response', -'SolrGenericResponse::getHttpStatusMessage' => 'Returns more details on the HTTP status', -'SolrGenericResponse::getRawRequest' => 'Returns the raw request sent to the Solr server', -'SolrGenericResponse::getRawRequestHeaders' => 'Returns the raw request headers sent to the Solr server', -'SolrGenericResponse::getRawResponse' => 'Returns the raw response from the server', -'SolrGenericResponse::getRawResponseHeaders' => 'Returns the raw response headers from the server', -'SolrGenericResponse::getRequestUrl' => 'Returns the full URL the request was sent to', -'SolrGenericResponse::getResponse' => 'Returns a SolrObject representing the XML response from the server', -'SolrGenericResponse::setParseMode' => 'Sets the parse mode', -'SolrGenericResponse::success' => 'Was the request a success', -'SolrIllegalArgumentException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'SolrIllegalArgumentException::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'SolrIllegalArgumentException::__toString' => 'String representation of the exception', -'SolrIllegalArgumentException::getCode' => 'Gets the Exception code', -'SolrIllegalArgumentException::getFile' => 'Gets the file in which the exception occurred', -'solrillegalargumentexception::getInternalInfo' => 'Returns internal information where the Exception was thrown', -'SolrIllegalArgumentException::getLine' => 'Gets the line in which the exception occurred', -'SolrIllegalArgumentException::getMessage' => 'Gets the Exception message', -'SolrIllegalArgumentException::getPrevious' => 'Returns previous Exception', -'SolrIllegalArgumentException::getTrace' => 'Gets the stack trace', -'SolrIllegalArgumentException::getTraceAsString' => 'Gets the stack trace as a string', -'SolrIllegalOperationException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'SolrIllegalOperationException::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'SolrIllegalOperationException::__toString' => 'String representation of the exception', -'SolrIllegalOperationException::getCode' => 'Gets the Exception code', -'SolrIllegalOperationException::getFile' => 'Gets the file in which the exception occurred', -'solrillegaloperationexception::getInternalInfo' => 'Returns internal information where the Exception was thrown', -'SolrIllegalOperationException::getLine' => 'Gets the line in which the exception occurred', -'SolrIllegalOperationException::getMessage' => 'Gets the Exception message', -'SolrIllegalOperationException::getPrevious' => 'Returns previous Exception', -'SolrIllegalOperationException::getTrace' => 'Gets the stack trace', -'SolrIllegalOperationException::getTraceAsString' => 'Gets the stack trace as a string', -'solrinputdocument::__clone' => 'Creates a copy of a SolrDocument', -'solrinputdocument::__construct' => 'Constructor', -'solrinputdocument::__destruct' => 'Destructor', -'solrinputdocument::addChildDocument' => 'Adds a child document for block indexing', -'solrinputdocument::addChildDocuments' => 'Adds an array of child documents', -'solrinputdocument::addField' => 'Adds a field to the document', -'solrinputdocument::clear' => 'Resets the input document', -'solrinputdocument::deleteField' => 'Removes a field from the document', -'solrinputdocument::fieldExists' => 'Checks if a field exists', -'solrinputdocument::getBoost' => 'Retrieves the current boost value for the document', -'solrinputdocument::getChildDocuments' => 'Returns an array of child documents (SolrInputDocument)', -'solrinputdocument::getChildDocumentsCount' => 'Returns the number of child documents', -'solrinputdocument::getField' => 'Retrieves a field by name', -'solrinputdocument::getFieldBoost' => 'Retrieves the boost value for a particular field', -'solrinputdocument::getFieldCount' => 'Returns the number of fields in the document', -'solrinputdocument::getFieldNames' => 'Returns an array containing all the fields in the document', -'solrinputdocument::hasChildDocuments' => 'Returns true if the document has any child documents', -'solrinputdocument::merge' => 'Merges one input document into another', -'solrinputdocument::reset' => 'This is an alias of SolrInputDocument::clear', -'solrinputdocument::setBoost' => 'Sets the boost value for this document', -'solrinputdocument::setFieldBoost' => 'Sets the index-time boost value for a field', -'solrinputdocument::sort' => 'Sorts the fields within the document', -'solrinputdocument::toArray' => 'Returns an array representation of the input document', -'solrmodifiableparams::__construct' => 'Constructor', -'solrmodifiableparams::__destruct' => 'Destructor', -'SolrModifiableParams::add' => 'This is an alias for SolrParams::addParam', -'SolrModifiableParams::addParam' => 'Adds a parameter to the object', -'SolrModifiableParams::get' => 'This is an alias for SolrParams::getParam', -'SolrModifiableParams::getParam' => 'Returns a parameter value', -'SolrModifiableParams::getParams' => 'Returns an array of non URL-encoded parameters', -'SolrModifiableParams::getPreparedParams' => 'Returns an array of URL-encoded parameters', -'SolrModifiableParams::serialize' => 'Used for custom serialization', -'SolrModifiableParams::set' => 'An alias of SolrParams::setParam', -'SolrModifiableParams::setParam' => 'Sets the parameter to the specified value', -'SolrModifiableParams::toString' => 'Returns all the name-value pair parameters in the object', -'SolrModifiableParams::unserialize' => 'Used for custom serialization', -'solrobject::__construct' => 'Creates Solr object', -'solrobject::__destruct' => 'Destructor', -'solrobject::getPropertyNames' => 'Returns an array of all the names of the properties', -'solrobject::offsetExists' => 'Checks if the property exists', -'solrobject::offsetGet' => 'Used to retrieve a property', -'solrobject::offsetSet' => 'Sets the value for a property', -'solrobject::offsetUnset' => 'Unsets the value for the property', -'solrparams::add' => 'This is an alias for SolrParams::addParam', -'solrparams::addParam' => 'Adds a parameter to the object', -'solrparams::get' => 'This is an alias for SolrParams::getParam', -'solrparams::getParam' => 'Returns a parameter value', -'solrparams::getParams' => 'Returns an array of non URL-encoded parameters', -'solrparams::getPreparedParams' => 'Returns an array of URL-encoded parameters', -'solrparams::serialize' => 'Used for custom serialization', -'solrparams::set' => 'An alias of SolrParams::setParam', -'solrparams::setParam' => 'Sets the parameter to the specified value', -'solrparams::toString' => 'Returns all the name-value pair parameters in the object', -'solrparams::unserialize' => 'Used for custom serialization', -'solrpingresponse::__construct' => 'Constructor', -'solrpingresponse::__destruct' => 'Destructor', -'SolrPingResponse::getDigestedResponse' => 'Returns the XML response as serialized PHP data', -'SolrPingResponse::getHttpStatus' => 'Returns the HTTP status of the response', -'SolrPingResponse::getHttpStatusMessage' => 'Returns more details on the HTTP status', -'SolrPingResponse::getRawRequest' => 'Returns the raw request sent to the Solr server', -'SolrPingResponse::getRawRequestHeaders' => 'Returns the raw request headers sent to the Solr server', -'SolrPingResponse::getRawResponse' => 'Returns the raw response from the server', -'SolrPingResponse::getRawResponseHeaders' => 'Returns the raw response headers from the server', -'SolrPingResponse::getRequestUrl' => 'Returns the full URL the request was sent to', -'solrpingresponse::getResponse' => 'Returns the response from the server', -'SolrPingResponse::setParseMode' => 'Sets the parse mode', -'SolrPingResponse::success' => 'Was the request a success', -'solrquery::__construct' => 'Constructor', -'solrquery::__destruct' => 'Destructor', -'SolrQuery::add' => 'This is an alias for SolrParams::addParam', -'solrquery::addExpandFilterQuery' => 'Overrides main filter query, determines which documents to include in the main group', -'solrquery::addExpandSortField' => 'Orders the documents within the expanded groups (expand.sort parameter)', -'solrquery::addFacetDateField' => 'Maps to facet.date', -'solrquery::addFacetDateOther' => 'Adds another facet.date.other parameter', -'solrquery::addFacetField' => 'Adds another field to the facet', -'solrquery::addFacetQuery' => 'Adds a facet query', -'solrquery::addField' => 'Specifies which fields to return in the result', -'solrquery::addFilterQuery' => 'Specifies a filter query', -'solrquery::addGroupField' => 'Add a field to be used to group results', -'solrquery::addGroupFunction' => 'Allows grouping results based on the unique values of a function query (group.func parameter)', -'solrquery::addGroupQuery' => 'Allows grouping of documents that match the given query', -'solrquery::addGroupSortField' => 'Add a group sort field (group.sort parameter)', -'solrquery::addHighlightField' => 'Maps to hl.fl', -'solrquery::addMltField' => 'Sets a field to use for similarity', -'solrquery::addMltQueryField' => 'Maps to mlt.qf', -'SolrQuery::addParam' => 'Adds a parameter to the object', -'solrquery::addSortField' => 'Used to control how the results should be sorted', -'solrquery::addStatsFacet' => 'Requests a return of sub results for values within the given facet', -'solrquery::addStatsField' => 'Maps to stats.field parameter', -'solrquery::collapse' => 'Collapses the result set to a single document per group', -'SolrQuery::get' => 'This is an alias for SolrParams::getParam', -'solrquery::getExpand' => 'Returns true if group expanding is enabled', -'solrquery::getExpandFilterQueries' => 'Returns the expand filter queries', -'solrquery::getExpandQuery' => 'Returns the expand query expand.q parameter', -'solrquery::getExpandRows' => 'Returns The number of rows to display in each group (expand.rows)', -'solrquery::getExpandSortFields' => 'Returns an array of fields', -'solrquery::getFacet' => 'Returns the value of the facet parameter', -'solrquery::getFacetDateEnd' => 'Returns the value for the facet.date.end parameter', -'solrquery::getFacetDateFields' => 'Returns all the facet.date fields', -'solrquery::getFacetDateGap' => 'Returns the value of the facet.date.gap parameter', -'solrquery::getFacetDateHardEnd' => 'Returns the value of the facet.date.hardend parameter', -'solrquery::getFacetDateOther' => 'Returns the value for the facet.date.other parameter', -'solrquery::getFacetDateStart' => 'Returns the lower bound for the first date range for all date faceting on this field', -'solrquery::getFacetFields' => 'Returns all the facet fields', -'solrquery::getFacetLimit' => 'Returns the maximum number of constraint counts that should be returned for the facet fields', -'solrquery::getFacetMethod' => 'Returns the value of the facet.method parameter', -'solrquery::getFacetMinCount' => 'Returns the minimum counts for facet fields should be included in the response', -'solrquery::getFacetMissing' => 'Returns the current state of the facet.missing parameter', -'solrquery::getFacetOffset' => 'Returns an offset into the list of constraints to be used for pagination', -'solrquery::getFacetPrefix' => 'Returns the facet prefix', -'solrquery::getFacetQueries' => 'Returns all the facet queries', -'solrquery::getFacetSort' => 'Returns the facet sort type', -'solrquery::getFields' => 'Returns the list of fields that will be returned in the response', -'solrquery::getFilterQueries' => 'Returns an array of filter queries', -'solrquery::getGroup' => 'Returns true if grouping is enabled', -'solrquery::getGroupCachePercent' => 'Returns group cache percent value', -'solrquery::getGroupFacet' => 'Returns the group.facet parameter value', -'solrquery::getGroupFields' => 'Returns group fields (group.field parameter values)', -'solrquery::getGroupFormat' => 'Returns the group.format value', -'solrquery::getGroupFunctions' => 'Returns group functions (group.func parameter values)', -'solrquery::getGroupLimit' => 'Returns the group.limit value', -'solrquery::getGroupMain' => 'Returns the group.main value', -'solrquery::getGroupNGroups' => 'Returns the group.ngroups value', -'solrquery::getGroupOffset' => 'Returns the group.offset value', -'solrquery::getGroupQueries' => 'Returns all the group.query parameter values', -'solrquery::getGroupSortFields' => 'Returns the group.sort value', -'solrquery::getGroupTruncate' => 'Returns the group.truncate value', -'solrquery::getHighlight' => 'Returns the state of the hl parameter', -'solrquery::getHighlightAlternateField' => 'Returns the highlight field to use as backup or default', -'solrquery::getHighlightFields' => 'Returns all the fields that Solr should generate highlighted snippets for', -'solrquery::getHighlightFormatter' => 'Returns the formatter for the highlighted output', -'solrquery::getHighlightFragmenter' => 'Returns the text snippet generator for highlighted text', -'solrquery::getHighlightFragsize' => 'Returns the number of characters of fragments to consider for highlighting', -'solrquery::getHighlightHighlightMultiTerm' => 'Returns whether or not to enable highlighting for range/wildcard/fuzzy/prefix queries', -'solrquery::getHighlightMaxAlternateFieldLength' => 'Returns the maximum number of characters of the field to return', -'solrquery::getHighlightMaxAnalyzedChars' => 'Returns the maximum number of characters into a document to look for suitable snippets', -'solrquery::getHighlightMergeContiguous' => 'Returns whether or not the collapse contiguous fragments into a single fragment', -'solrquery::getHighlightRegexMaxAnalyzedChars' => 'Returns the maximum number of characters from a field when using the regex fragmenter', -'solrquery::getHighlightRegexPattern' => 'Returns the regular expression for fragmenting', -'solrquery::getHighlightRegexSlop' => 'Returns the deviation factor from the ideal fragment size', -'solrquery::getHighlightRequireFieldMatch' => 'Returns if a field will only be highlighted if the query matched in this particular field', -'solrquery::getHighlightSimplePost' => 'Returns the text which appears after a highlighted term', -'solrquery::getHighlightSimplePre' => 'Returns the text which appears before a highlighted term', -'solrquery::getHighlightSnippets' => 'Returns the maximum number of highlighted snippets to generate per field', -'solrquery::getHighlightUsePhraseHighlighter' => 'Returns the state of the hl.usePhraseHighlighter parameter', -'solrquery::getMlt' => 'Returns whether or not MoreLikeThis results should be enabled', -'solrquery::getMltBoost' => 'Returns whether or not the query will be boosted by the interesting term relevance', -'solrquery::getMltCount' => 'Returns the number of similar documents to return for each result', -'solrquery::getMltFields' => 'Returns all the fields to use for similarity', -'solrquery::getMltMaxNumQueryTerms' => 'Returns the maximum number of query terms that will be included in any generated query', -'solrquery::getMltMaxNumTokens' => 'Returns the maximum number of tokens to parse in each document field that is not stored with TermVector support', -'solrquery::getMltMaxWordLength' => 'Returns the maximum word length above which words will be ignored', -'solrquery::getMltMinDocFrequency' => 'Returns the threshold frequency at which words will be ignored which do not occur in at least this many docs', -'solrquery::getMltMinTermFrequency' => 'Returns the frequency below which terms will be ignored in the source document', -'solrquery::getMltMinWordLength' => 'Returns the minimum word length below which words will be ignored', -'solrquery::getMltQueryFields' => 'Returns the query fields and their boosts', -'SolrQuery::getParam' => 'Returns a parameter value', -'SolrQuery::getParams' => 'Returns an array of non URL-encoded parameters', -'SolrQuery::getPreparedParams' => 'Returns an array of URL-encoded parameters', -'solrquery::getQuery' => 'Returns the main query', -'solrquery::getRows' => 'Returns the maximum number of documents', -'solrquery::getSortFields' => 'Returns all the sort fields', -'solrquery::getStart' => 'Returns the offset in the complete result set', -'solrquery::getStats' => 'Returns whether or not stats is enabled', -'solrquery::getStatsFacets' => 'Returns all the stats facets that were set', -'solrquery::getStatsFields' => 'Returns all the statistics fields', -'solrquery::getTerms' => 'Returns whether or not the TermsComponent is enabled', -'solrquery::getTermsField' => 'Returns the field from which the terms are retrieved', -'solrquery::getTermsIncludeLowerBound' => 'Returns whether or not to include the lower bound in the result set', -'solrquery::getTermsIncludeUpperBound' => 'Returns whether or not to include the upper bound term in the result set', -'solrquery::getTermsLimit' => 'Returns the maximum number of terms Solr should return', -'solrquery::getTermsLowerBound' => 'Returns the term to start at', -'solrquery::getTermsMaxCount' => 'Returns the maximum document frequency', -'solrquery::getTermsMinCount' => 'Returns the minimum document frequency to return in order to be included', -'solrquery::getTermsPrefix' => 'Returns the term prefix', -'solrquery::getTermsReturnRaw' => 'Whether or not to return raw characters', -'solrquery::getTermsSort' => 'Returns an integer indicating how terms are sorted', -'solrquery::getTermsUpperBound' => 'Returns the term to stop at', -'solrquery::getTimeAllowed' => 'Returns the time in milliseconds allowed for the query to finish', -'solrquery::removeExpandFilterQuery' => 'Removes an expand filter query', -'solrquery::removeExpandSortField' => 'Removes an expand sort field from the expand.sort parameter', -'solrquery::removeFacetDateField' => 'Removes one of the facet date fields', -'solrquery::removeFacetDateOther' => 'Removes one of the facet.date.other parameters', -'solrquery::removeFacetField' => 'Removes one of the facet.date parameters', -'solrquery::removeFacetQuery' => 'Removes one of the facet.query parameters', -'solrquery::removeField' => 'Removes a field from the list of fields', -'solrquery::removeFilterQuery' => 'Removes a filter query', -'solrquery::removeHighlightField' => 'Removes one of the fields used for highlighting', -'solrquery::removeMltField' => 'Removes one of the moreLikeThis fields', -'solrquery::removeMltQueryField' => 'Removes one of the moreLikeThis query fields', -'solrquery::removeSortField' => 'Removes one of the sort fields', -'solrquery::removeStatsFacet' => 'Removes one of the stats.facet parameters', -'solrquery::removeStatsField' => 'Removes one of the stats.field parameters', -'SolrQuery::serialize' => 'Used for custom serialization', -'SolrQuery::set' => 'An alias of SolrParams::setParam', -'solrquery::setEchoHandler' => 'Toggles the echoHandler parameter', -'solrquery::setEchoParams' => 'Determines what kind of parameters to include in the response', -'solrquery::setExpand' => 'Enables/Disables the Expand Component', -'solrquery::setExpandQuery' => 'Sets the expand.q parameter', -'solrquery::setExpandRows' => 'Sets the number of rows to display in each group (expand.rows). Server Default 5', -'solrquery::setExplainOther' => 'Sets the explainOther common query parameter', -'solrquery::setFacet' => 'Maps to the facet parameter. Enables or disables facetting', -'solrquery::setFacetDateEnd' => 'Maps to facet.date.end', -'solrquery::setFacetDateGap' => 'Maps to facet.date.gap', -'solrquery::setFacetDateHardEnd' => 'Maps to facet.date.hardend', -'solrquery::setFacetDateStart' => 'Maps to facet.date.start', -'solrquery::setFacetEnumCacheMinDefaultFrequency' => 'Sets the minimum document frequency used for determining term count', -'solrquery::setFacetLimit' => 'Maps to facet.limit', -'solrquery::setFacetMethod' => 'Specifies the type of algorithm to use when faceting a field', -'solrquery::setFacetMinCount' => 'Maps to facet.mincount', -'solrquery::setFacetMissing' => 'Maps to facet.missing', -'solrquery::setFacetOffset' => 'Sets the offset into the list of constraints to allow for pagination', -'solrquery::setFacetPrefix' => 'Specifies a string prefix with which to limits the terms on which to facet', -'solrquery::setFacetSort' => 'Determines the ordering of the facet field constraints', -'solrquery::setGroup' => 'Enable/Disable result grouping (group parameter)', -'solrquery::setGroupCachePercent' => 'Enables caching for result grouping', -'solrquery::setGroupFacet' => 'Sets group.facet parameter', -'solrquery::setGroupFormat' => 'Sets the group format, result structure (group.format parameter)', -'solrquery::setGroupLimit' => 'Specifies the number of results to return for each group. The server default value is 1', -'solrquery::setGroupMain' => 'If true, the result of the first field grouping command is used as the main result list in the response, using group.format=simple', -'solrquery::setGroupNGroups' => 'If true, Solr includes the number of groups that have matched the query in the results', -'solrquery::setGroupOffset' => 'Sets the group.offset parameter', -'solrquery::setGroupTruncate' => 'If true, facet counts are based on the most relevant document of each group matching the query', -'solrquery::setHighlight' => 'Enables or disables highlighting', -'solrquery::setHighlightAlternateField' => 'Specifies the backup field to use', -'solrquery::setHighlightFormatter' => 'Specify a formatter for the highlight output', -'solrquery::setHighlightFragmenter' => 'Sets a text snippet generator for highlighted text', -'solrquery::setHighlightFragsize' => 'The size of fragments to consider for highlighting', -'solrquery::setHighlightHighlightMultiTerm' => 'Use SpanScorer to highlight phrase terms', -'solrquery::setHighlightMaxAlternateFieldLength' => 'Sets the maximum number of characters of the field to return', -'solrquery::setHighlightMaxAnalyzedChars' => 'Specifies the number of characters into a document to look for suitable snippets', -'solrquery::setHighlightMergeContiguous' => 'Whether or not to collapse contiguous fragments into a single fragment', -'solrquery::setHighlightRegexMaxAnalyzedChars' => 'Specify the maximum number of characters to analyze', -'solrquery::setHighlightRegexPattern' => 'Specify the regular expression for fragmenting', -'solrquery::setHighlightRegexSlop' => 'Sets the factor by which the regex fragmenter can stray from the ideal fragment size', -'solrquery::setHighlightRequireFieldMatch' => 'Require field matching during highlighting', -'solrquery::setHighlightSimplePost' => 'Sets the text which appears after a highlighted term', -'solrquery::setHighlightSimplePre' => 'Sets the text which appears before a highlighted term', -'solrquery::setHighlightSnippets' => 'Sets the maximum number of highlighted snippets to generate per field', -'solrquery::setHighlightUsePhraseHighlighter' => 'Whether to highlight phrase terms only when they appear within the query phrase', -'solrquery::setMlt' => 'Enables or disables moreLikeThis', -'solrquery::setMltBoost' => 'Set if the query will be boosted by the interesting term relevance', -'solrquery::setMltCount' => 'Set the number of similar documents to return for each result', -'solrquery::setMltMaxNumQueryTerms' => 'Sets the maximum number of query terms included', -'solrquery::setMltMaxNumTokens' => 'Specifies the maximum number of tokens to parse', -'solrquery::setMltMaxWordLength' => 'Sets the maximum word length', -'solrquery::setMltMinDocFrequency' => 'Sets the mltMinDoc frequency', -'solrquery::setMltMinTermFrequency' => 'Sets the frequency below which terms will be ignored in the source docs', -'solrquery::setMltMinWordLength' => 'Sets the minimum word length', -'solrquery::setOmitHeader' => 'Exclude the header from the returned results', -'SolrQuery::setParam' => 'Sets the parameter to the specified value', -'solrquery::setQuery' => 'Sets the search query', -'solrquery::setRows' => 'Specifies the maximum number of rows to return in the result', -'solrquery::setShowDebugInfo' => 'Flag to show debug information', -'solrquery::setStart' => 'Specifies the number of rows to skip', -'solrquery::setStats' => 'Enables or disables the Stats component', -'solrquery::setTerms' => 'Enables or disables the TermsComponent', -'solrquery::setTermsField' => 'Sets the name of the field to get the Terms from', -'solrquery::setTermsIncludeLowerBound' => 'Include the lower bound term in the result set', -'solrquery::setTermsIncludeUpperBound' => 'Include the upper bound term in the result set', -'solrquery::setTermsLimit' => 'Sets the maximum number of terms to return', -'solrquery::setTermsLowerBound' => 'Specifies the Term to start from', -'solrquery::setTermsMaxCount' => 'Sets the maximum document frequency', -'solrquery::setTermsMinCount' => 'Sets the minimum document frequency', -'solrquery::setTermsPrefix' => 'Restrict matches to terms that start with the prefix', -'solrquery::setTermsReturnRaw' => 'Return the raw characters of the indexed term', -'solrquery::setTermsSort' => 'Specifies how to sort the returned terms', -'solrquery::setTermsUpperBound' => 'Sets the term to stop at', -'solrquery::setTimeAllowed' => 'The time allowed for search to finish', -'SolrQuery::toString' => 'Returns all the name-value pair parameters in the object', -'SolrQuery::unserialize' => 'Used for custom serialization', -'solrqueryresponse::__construct' => 'Constructor', -'solrqueryresponse::__destruct' => 'Destructor', -'SolrQueryResponse::getDigestedResponse' => 'Returns the XML response as serialized PHP data', -'SolrQueryResponse::getHttpStatus' => 'Returns the HTTP status of the response', -'SolrQueryResponse::getHttpStatusMessage' => 'Returns more details on the HTTP status', -'SolrQueryResponse::getRawRequest' => 'Returns the raw request sent to the Solr server', -'SolrQueryResponse::getRawRequestHeaders' => 'Returns the raw request headers sent to the Solr server', -'SolrQueryResponse::getRawResponse' => 'Returns the raw response from the server', -'SolrQueryResponse::getRawResponseHeaders' => 'Returns the raw response headers from the server', -'SolrQueryResponse::getRequestUrl' => 'Returns the full URL the request was sent to', -'SolrQueryResponse::getResponse' => 'Returns a SolrObject representing the XML response from the server', -'SolrQueryResponse::setParseMode' => 'Sets the parse mode', -'SolrQueryResponse::success' => 'Was the request a success', -'solrresponse::getDigestedResponse' => 'Returns the XML response as serialized PHP data', -'solrresponse::getHttpStatus' => 'Returns the HTTP status of the response', -'solrresponse::getHttpStatusMessage' => 'Returns more details on the HTTP status', -'solrresponse::getRawRequest' => 'Returns the raw request sent to the Solr server', -'solrresponse::getRawRequestHeaders' => 'Returns the raw request headers sent to the Solr server', -'solrresponse::getRawResponse' => 'Returns the raw response from the server', -'solrresponse::getRawResponseHeaders' => 'Returns the raw response headers from the server', -'solrresponse::getRequestUrl' => 'Returns the full URL the request was sent to', -'solrresponse::getResponse' => 'Returns a SolrObject representing the XML response from the server', -'solrresponse::setParseMode' => 'Sets the parse mode', -'solrresponse::success' => 'Was the request a success', -'SolrServerException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'SolrServerException::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'SolrServerException::__toString' => 'String representation of the exception', -'SolrServerException::getCode' => 'Gets the Exception code', -'SolrServerException::getFile' => 'Gets the file in which the exception occurred', -'solrserverexception::getInternalInfo' => 'Returns internal information where the Exception was thrown', -'SolrServerException::getLine' => 'Gets the line in which the exception occurred', -'SolrServerException::getMessage' => 'Gets the Exception message', -'SolrServerException::getPrevious' => 'Returns previous Exception', -'SolrServerException::getTrace' => 'Gets the stack trace', -'SolrServerException::getTraceAsString' => 'Gets the stack trace as a string', -'solrupdateresponse::__construct' => 'Constructor', -'solrupdateresponse::__destruct' => 'Destructor', -'SolrUpdateResponse::getDigestedResponse' => 'Returns the XML response as serialized PHP data', -'SolrUpdateResponse::getHttpStatus' => 'Returns the HTTP status of the response', -'SolrUpdateResponse::getHttpStatusMessage' => 'Returns more details on the HTTP status', -'SolrUpdateResponse::getRawRequest' => 'Returns the raw request sent to the Solr server', -'SolrUpdateResponse::getRawRequestHeaders' => 'Returns the raw request headers sent to the Solr server', -'SolrUpdateResponse::getRawResponse' => 'Returns the raw response from the server', -'SolrUpdateResponse::getRawResponseHeaders' => 'Returns the raw response headers from the server', -'SolrUpdateResponse::getRequestUrl' => 'Returns the full URL the request was sent to', -'SolrUpdateResponse::getResponse' => 'Returns a SolrObject representing the XML response from the server', -'SolrUpdateResponse::setParseMode' => 'Sets the parse mode', -'SolrUpdateResponse::success' => 'Was the request a success', -'solrutils::digestXmlResponse' => 'Parses an response XML string into a SolrObject', -'solrutils::escapeQueryChars' => 'Escapes a lucene query string', -'solrutils::getSolrVersion' => 'Returns the current version of the Solr extension', -'solrutils::queryPhrase' => 'Prepares a phrase from an unescaped lucene string', -'sort' => 'Sort an array', -'soundex' => 'Calculate the soundex key of a string', -'sphinxclient::__construct' => 'Create a new SphinxClient object', -'sphinxclient::addQuery' => 'Add query to multi-query batch', -'sphinxclient::buildExcerpts' => 'Build text snippets', -'sphinxclient::buildKeywords' => 'Extract keywords from query', -'sphinxclient::close' => 'Closes previously opened persistent connection', -'sphinxclient::escapeString' => 'Escape special characters', -'sphinxclient::getLastError' => 'Get the last error message', -'sphinxclient::getLastWarning' => 'Get the last warning', -'sphinxclient::open' => 'Opens persistent connection to the server', -'sphinxclient::query' => 'Execute search query', -'sphinxclient::resetFilters' => 'Clear all filters', -'sphinxclient::resetGroupBy' => 'Clear all group-by settings', -'sphinxclient::runQueries' => 'Run a batch of search queries', -'sphinxclient::setArrayResult' => 'Change the format of result set array', -'sphinxclient::setConnectTimeout' => 'Set connection timeout', -'sphinxclient::setFieldWeights' => 'Set field weights', -'sphinxclient::setFilter' => 'Add new integer values set filter', -'sphinxclient::setFilterFloatRange' => 'Add new float range filter', -'sphinxclient::setFilterRange' => 'Add new integer range filter', -'sphinxclient::setGeoAnchor' => 'Set anchor point for a geosphere distance calculations', -'sphinxclient::setGroupBy' => 'Set grouping attribute', -'sphinxclient::setGroupDistinct' => 'Set attribute name for per-group distinct values count calculations', -'sphinxclient::setIDRange' => 'Set a range of accepted document IDs', -'sphinxclient::setIndexWeights' => 'Set per-index weights', -'sphinxclient::setLimits' => 'Set offset and limit of the result set', -'sphinxclient::setMatchMode' => 'Set full-text query matching mode', -'sphinxclient::setMaxQueryTime' => 'Set maximum query time', -'sphinxclient::setOverride' => 'Sets temporary per-document attribute value overrides', -'sphinxclient::setRankingMode' => 'Set ranking mode', -'sphinxclient::setRetries' => 'Set retry count and delay', -'sphinxclient::setSelect' => 'Set select clause', -'sphinxclient::setServer' => 'Set searchd host and port', -'sphinxclient::setSortMode' => 'Set matches sorting mode', -'sphinxclient::status' => 'Queries searchd status', -'sphinxclient::updateAttributes' => 'Update document attributes', -'spl_autoload' => 'Default implementation for __autoload()', -'spl_autoload_call' => 'Try all registered __autoload() functions to load the requested class', -'spl_autoload_extensions' => 'Register and return default file extensions for spl_autoload', -'spl_autoload_functions' => 'Return all registered __autoload() functions', -'spl_autoload_register' => 'Register given function as __autoload() implementation', -'spl_autoload_unregister' => 'Unregister given function as __autoload() implementation', -'spl_classes' => 'Return available SPL classes', -'spl_object_hash' => 'Return hash id for given object', -'spl_object_id' => 'Return the integer object handle for given object', -'spldoublylinkedlist::__construct' => 'Constructs a new doubly linked list', -'spldoublylinkedlist::add' => 'Add/insert a new value at the specified index', -'spldoublylinkedlist::bottom' => 'Peeks at the node from the beginning of the doubly linked list', -'spldoublylinkedlist::count' => 'Counts the number of elements in the doubly linked list', -'spldoublylinkedlist::current' => 'Return current array entry', -'spldoublylinkedlist::getIteratorMode' => 'Returns the mode of iteration', -'spldoublylinkedlist::isEmpty' => 'Checks whether the doubly linked list is empty', -'spldoublylinkedlist::key' => 'Return current node index', -'spldoublylinkedlist::next' => 'Move to next entry', -'spldoublylinkedlist::offsetExists' => 'Returns whether the requested $index exists', -'spldoublylinkedlist::offsetGet' => 'Returns the value at the specified $index', -'spldoublylinkedlist::offsetSet' => 'Sets the value at the specified $index to $newval', -'spldoublylinkedlist::offsetUnset' => 'Unsets the value at the specified $index', -'spldoublylinkedlist::pop' => 'Pops a node from the end of the doubly linked list', -'spldoublylinkedlist::prev' => 'Move to previous entry', -'spldoublylinkedlist::push' => 'Pushes an element at the end of the doubly linked list', -'spldoublylinkedlist::rewind' => 'Rewind iterator back to the start', -'spldoublylinkedlist::serialize' => 'Serializes the storage', -'spldoublylinkedlist::setIteratorMode' => 'Sets the mode of iteration', -'spldoublylinkedlist::shift' => 'Shifts a node from the beginning of the doubly linked list', -'spldoublylinkedlist::top' => 'Peeks at the node from the end of the doubly linked list', -'spldoublylinkedlist::unserialize' => 'Unserializes the storage', -'spldoublylinkedlist::unshift' => 'Prepends the doubly linked list with an element', -'spldoublylinkedlist::valid' => 'Check whether the doubly linked list contains more nodes', -'SplEnum::__construct' => 'Creates a new value of some type', -'splenum::getConstList' => 'Returns all consts (possible values) as an array', -'splfileinfo::__construct' => 'Construct a new SplFileInfo object', -'splfileinfo::__toString' => 'Returns the path to the file as a string', -'splfileinfo::getATime' => 'Gets last access time of the file', -'splfileinfo::getBasename' => 'Gets the base name of the file', -'splfileinfo::getCTime' => 'Gets the inode change time', -'splfileinfo::getExtension' => 'Gets the file extension', -'splfileinfo::getFileInfo' => 'Gets an SplFileInfo object for the file', -'splfileinfo::getFilename' => 'Gets the filename', -'splfileinfo::getGroup' => 'Gets the file group', -'splfileinfo::getInode' => 'Gets the inode for the file', -'splfileinfo::getLinkTarget' => 'Gets the target of a link', -'splfileinfo::getMTime' => 'Gets the last modified time', -'splfileinfo::getOwner' => 'Gets the owner of the file', -'splfileinfo::getPath' => 'Gets the path without filename', -'splfileinfo::getPathInfo' => 'Gets an SplFileInfo object for the path', -'splfileinfo::getPathname' => 'Gets the path to the file', -'splfileinfo::getPerms' => 'Gets file permissions', -'splfileinfo::getRealPath' => 'Gets absolute path to file', -'splfileinfo::getSize' => 'Gets file size', -'splfileinfo::getType' => 'Gets file type', -'splfileinfo::isDir' => 'Tells if the file is a directory', -'splfileinfo::isExecutable' => 'Tells if the file is executable', -'splfileinfo::isFile' => 'Tells if the object references a regular file', -'splfileinfo::isLink' => 'Tells if the file is a link', -'splfileinfo::isReadable' => 'Tells if file is readable', -'splfileinfo::isWritable' => 'Tells if the entry is writable', -'splfileinfo::openFile' => 'Gets an SplFileObject object for the file', -'splfileinfo::setFileClass' => 'Sets the class used with SplFileInfo::openFile', -'splfileinfo::setInfoClass' => 'Sets the class used with SplFileInfo::getFileInfo and SplFileInfo::getPathInfo', -'splfileobject::__construct' => 'Construct a new file object', -'splfileobject::__toString' => 'Alias of SplFileObject::current', -'splfileobject::current' => 'Retrieve current line of file', -'splfileobject::eof' => 'Reached end of file', -'splfileobject::fflush' => 'Flushes the output to the file', -'splfileobject::fgetc' => 'Gets character from file', -'splfileobject::fgetcsv' => 'Gets line from file and parse as CSV fields', -'splfileobject::fgets' => 'Gets line from file', -'splfileobject::fgetss' => 'Gets line from file and strip HTML tags', -'splfileobject::flock' => 'Portable file locking', -'splfileobject::fpassthru' => 'Output all remaining data on a file pointer', -'splfileobject::fputcsv' => 'Write a field array as a CSV line', -'splfileobject::fread' => 'Read from file', -'splfileobject::fscanf' => 'Parses input from file according to a format', -'splfileobject::fseek' => 'Seek to a position', -'splfileobject::fstat' => 'Gets information about the file', -'splfileobject::ftell' => 'Return current file position', -'splfileobject::ftruncate' => 'Truncates the file to a given length', -'splfileobject::fwrite' => 'Write to file', -'SplFileObject::getATime' => 'Gets last access time of the file', -'SplFileObject::getBasename' => 'Gets the base name of the file', -'splfileobject::getChildren' => 'No purpose', -'splfileobject::getCsvControl' => 'Get the delimiter, enclosure and escape character for CSV', -'SplFileObject::getCTime' => 'Gets the inode change time', -'splfileobject::getCurrentLine' => 'Alias of SplFileObject::fgets', -'SplFileObject::getExtension' => 'Gets the file extension', -'SplFileObject::getFileInfo' => 'Gets an SplFileInfo object for the file', -'SplFileObject::getFilename' => 'Gets the filename', -'splfileobject::getFlags' => 'Gets flags for the SplFileObject', -'SplFileObject::getGroup' => 'Gets the file group', -'SplFileObject::getInode' => 'Gets the inode for the file', -'SplFileObject::getLinkTarget' => 'Gets the target of a link', -'splfileobject::getMaxLineLen' => 'Get maximum line length', -'SplFileObject::getMTime' => 'Gets the last modified time', -'SplFileObject::getOwner' => 'Gets the owner of the file', -'SplFileObject::getPath' => 'Gets the path without filename', -'SplFileObject::getPathInfo' => 'Gets an SplFileInfo object for the path', -'SplFileObject::getPathname' => 'Gets the path to the file', -'SplFileObject::getPerms' => 'Gets file permissions', -'SplFileObject::getRealPath' => 'Gets absolute path to file', -'SplFileObject::getSize' => 'Gets file size', -'SplFileObject::getType' => 'Gets file type', -'splfileobject::hasChildren' => 'SplFileObject does not have children', -'SplFileObject::isDir' => 'Tells if the file is a directory', -'SplFileObject::isExecutable' => 'Tells if the file is executable', -'SplFileObject::isFile' => 'Tells if the object references a regular file', -'SplFileObject::isLink' => 'Tells if the file is a link', -'SplFileObject::isReadable' => 'Tells if file is readable', -'SplFileObject::isWritable' => 'Tells if the entry is writable', -'splfileobject::key' => 'Get line number', -'splfileobject::next' => 'Read next line', -'SplFileObject::openFile' => 'Gets an SplFileObject object for the file', -'splfileobject::rewind' => 'Rewind the file to the first line', -'splfileobject::seek' => 'Seek to specified line', -'splfileobject::setCsvControl' => 'Set the delimiter, enclosure and escape character for CSV', -'SplFileObject::setFileClass' => 'Sets the class used with SplFileInfo::openFile', -'splfileobject::setFlags' => 'Sets flags for the SplFileObject', -'SplFileObject::setInfoClass' => 'Sets the class used with SplFileInfo::getFileInfo and SplFileInfo::getPathInfo', -'splfileobject::setMaxLineLen' => 'Set maximum line length', -'splfileobject::valid' => 'Not at EOF', -'splfixedarray::__construct' => 'Constructs a new fixed array', -'splfixedarray::__wakeup' => 'Reinitialises the array after being unserialised', -'splfixedarray::count' => 'Returns the size of the array', -'splfixedarray::current' => 'Return current array entry', -'splfixedarray::fromArray' => 'Import a PHP array in a SplFixedArray instance', -'splfixedarray::getSize' => 'Gets the size of the array', -'splfixedarray::key' => 'Return current array index', -'splfixedarray::next' => 'Move to next entry', -'splfixedarray::offsetExists' => 'Returns whether the requested index exists', -'splfixedarray::offsetGet' => 'Returns the value at the specified index', -'splfixedarray::offsetSet' => 'Sets a new value at a specified index', -'splfixedarray::offsetUnset' => 'Unsets the value at the specified $index', -'splfixedarray::rewind' => 'Rewind iterator back to the start', -'splfixedarray::setSize' => 'Change the size of an array', -'splfixedarray::toArray' => 'Returns a PHP array from the fixed array', -'splfixedarray::valid' => 'Check whether the array contains more elements', -'splheap::__construct' => 'Constructs a new empty heap', -'splheap::compare' => 'Compare elements in order to place them correctly in the heap while sifting up', -'splheap::count' => 'Counts the number of elements in the heap', -'splheap::current' => 'Return current node pointed by the iterator', -'splheap::extract' => 'Extracts a node from top of the heap and sift up', -'splheap::insert' => 'Inserts an element in the heap by sifting it up', -'splheap::isCorrupted' => 'Tells if the heap is in a corrupted state', -'splheap::isEmpty' => 'Checks whether the heap is empty', -'splheap::key' => 'Return current node index', -'splheap::next' => 'Move to the next node', -'splheap::recoverFromCorruption' => 'Recover from the corrupted state and allow further actions on the heap', -'splheap::rewind' => 'Rewind iterator back to the start (no-op)', -'splheap::top' => 'Peeks at the node from the top of the heap', -'splheap::valid' => 'Check whether the heap contains more nodes', -'split' => 'Split string into array by regular expression', -'spliti' => 'Split string into array by regular expression case insensitive', -'splmaxheap::compare' => 'Compare elements in order to place them correctly in the heap while sifting up', -'SplMaxHeap::count' => 'Counts the number of elements in the heap', -'SplMaxHeap::current' => 'Return current node pointed by the iterator', -'SplMaxHeap::extract' => 'Extracts a node from top of the heap and sift up', -'SplMaxHeap::insert' => 'Inserts an element in the heap by sifting it up', -'SplMaxHeap::isCorrupted' => 'Tells if the heap is in a corrupted state', -'SplMaxHeap::isEmpty' => 'Checks whether the heap is empty', -'SplMaxHeap::key' => 'Return current node index', -'SplMaxHeap::next' => 'Move to the next node', -'SplMaxHeap::recoverFromCorruption' => 'Recover from the corrupted state and allow further actions on the heap', -'SplMaxHeap::rewind' => 'Rewind iterator back to the start (no-op)', -'SplMaxHeap::top' => 'Peeks at the node from the top of the heap', -'SplMaxHeap::valid' => 'Check whether the heap contains more nodes', -'splminheap::compare' => 'Compare elements in order to place them correctly in the heap while sifting up', -'SplMinHeap::count' => 'Counts the number of elements in the heap.', -'SplMinHeap::current' => 'Return current node pointed by the iterator', -'SplMinHeap::extract' => 'Extracts a node from top of the heap and sift up.', -'SplMinHeap::insert' => 'Inserts an element in the heap by sifting it up.', -'SplMinHeap::isCorrupted' => 'Tells if the heap is in a corrupted state', -'SplMinHeap::isEmpty' => 'Checks whether the heap is empty.', -'SplMinHeap::key' => 'Return current node index', -'SplMinHeap::next' => 'Move to the next node', -'SplMinHeap::recoverFromCorruption' => 'Recover from the corrupted state and allow further actions on the heap.', -'SplMinHeap::rewind' => 'Rewind iterator back to the start (no-op)', -'SplMinHeap::top' => 'Peeks at the node from the top of the heap', -'SplMinHeap::valid' => 'Check whether the heap contains more nodes', -'splobjectstorage::addAll' => 'Adds all objects from another storage', -'splobjectstorage::attach' => 'Adds an object in the storage', -'splobjectstorage::contains' => 'Checks if the storage contains a specific object', -'splobjectstorage::count' => 'Returns the number of objects in the storage', -'splobjectstorage::current' => 'Returns the current storage entry', -'splobjectstorage::detach' => 'Removes an object from the storage', -'splobjectstorage::getHash' => 'Calculate a unique identifier for the contained objects', -'splobjectstorage::getInfo' => 'Returns the data associated with the current iterator entry', -'splobjectstorage::key' => 'Returns the index at which the iterator currently is', -'splobjectstorage::next' => 'Move to the next entry', -'splobjectstorage::offsetExists' => 'Checks whether an object exists in the storage', -'splobjectstorage::offsetGet' => 'Returns the data associated with an object', -'splobjectstorage::offsetSet' => 'Associates data to an object in the storage', -'splobjectstorage::offsetUnset' => 'Removes an object from the storage', -'splobjectstorage::removeAll' => 'Removes objects contained in another storage from the current storage', -'splobjectstorage::removeAllExcept' => 'Removes all objects except for those contained in another storage from the current storage', -'splobjectstorage::rewind' => 'Rewind the iterator to the first storage element', -'splobjectstorage::serialize' => 'Serializes the storage', -'splobjectstorage::setInfo' => 'Sets the data associated with the current iterator entry', -'splobjectstorage::unserialize' => 'Unserializes a storage from its string representation', -'splobjectstorage::valid' => 'Returns if the current iterator entry is valid', -'splobserver::update' => 'Receive update from subject', -'splpriorityqueue::__construct' => 'Constructs a new empty queue', -'splpriorityqueue::compare' => 'Compare priorities in order to place elements correctly in the heap while sifting up', -'splpriorityqueue::count' => 'Counts the number of elements in the queue', -'splpriorityqueue::current' => 'Return current node pointed by the iterator', -'splpriorityqueue::extract' => 'Extracts a node from top of the heap and sift up', -'splpriorityqueue::getExtractFlags' => 'Get the flags of extraction', -'splpriorityqueue::insert' => 'Inserts an element in the queue by sifting it up', -'splpriorityqueue::isCorrupted' => 'Tells if the priority queue is in a corrupted state', -'splpriorityqueue::isEmpty' => 'Checks whether the queue is empty', -'splpriorityqueue::key' => 'Return current node index', -'splpriorityqueue::next' => 'Move to the next node', -'splpriorityqueue::recoverFromCorruption' => 'Recover from the corrupted state and allow further actions on the queue', -'splpriorityqueue::rewind' => 'Rewind iterator back to the start (no-op)', -'splpriorityqueue::setExtractFlags' => 'Sets the mode of extraction', -'splpriorityqueue::top' => 'Peeks at the node from the top of the queue', -'splpriorityqueue::valid' => 'Check whether the queue contains more nodes', -'splqueue::__construct' => 'Constructs a new queue implemented using a doubly linked list', -'SplQueue::add' => 'Add/insert a new value at the specified index', -'SplQueue::bottom' => 'Peeks at the node from the beginning of the doubly linked list', -'SplQueue::count' => 'Counts the number of elements in the doubly linked list', -'SplQueue::current' => 'Return current array entry', -'splqueue::dequeue' => 'Dequeues a node from the queue', -'splqueue::enqueue' => 'Adds an element to the queue', -'SplQueue::getIteratorMode' => 'Returns the mode of iteration', -'SplQueue::isEmpty' => 'Checks whether the doubly linked list is empty', -'SplQueue::key' => 'Return current node index', -'SplQueue::next' => 'Move to next entry', -'SplQueue::offsetExists' => 'Returns whether the requested $index exists', -'SplQueue::offsetGet' => 'Returns the value at the specified $index', -'SplQueue::offsetSet' => 'Sets the value at the specified $index to $newval', -'SplQueue::offsetUnset' => 'Unsets the value at the specified $index', -'SplQueue::pop' => 'Pops a node from the end of the doubly linked list', -'SplQueue::prev' => 'Move to previous entry', -'SplQueue::push' => 'Pushes an element at the end of the doubly linked list', -'SplQueue::rewind' => 'Rewind iterator back to the start', -'SplQueue::serialize' => 'Serializes the storage', -'splqueue::setIteratorMode' => 'Sets the mode of iteration', -'SplQueue::shift' => 'Shifts a node from the beginning of the doubly linked list', -'SplQueue::top' => 'Peeks at the node from the end of the doubly linked list', -'SplQueue::unserialize' => 'Unserializes the storage', -'SplQueue::unshift' => 'Prepends the doubly linked list with an element', -'SplQueue::valid' => 'Check whether the doubly linked list contains more nodes', -'splstack::__construct' => 'Constructs a new stack implemented using a doubly linked list', -'SplStack::add' => 'Add/insert a new value at the specified index', -'SplStack::bottom' => 'Peeks at the node from the beginning of the doubly linked list', -'SplStack::count' => 'Counts the number of elements in the doubly linked list', -'SplStack::current' => 'Return current array entry', -'SplStack::getIteratorMode' => 'Returns the mode of iteration', -'SplStack::isEmpty' => 'Checks whether the doubly linked list is empty', -'SplStack::key' => 'Return current node index', -'SplStack::next' => 'Move to next entry', -'SplStack::offsetExists' => 'Returns whether the requested $index exists', -'SplStack::offsetGet' => 'Returns the value at the specified $index', -'SplStack::offsetSet' => 'Sets the value at the specified $index to $newval', -'SplStack::offsetUnset' => 'Unsets the value at the specified $index', -'SplStack::pop' => 'Pops a node from the end of the doubly linked list', -'SplStack::prev' => 'Move to previous entry', -'SplStack::push' => 'Pushes an element at the end of the doubly linked list', -'SplStack::rewind' => 'Rewind iterator back to the start', -'SplStack::serialize' => 'Serializes the storage', -'splstack::setIteratorMode' => 'Sets the mode of iteration', -'SplStack::shift' => 'Shifts a node from the beginning of the doubly linked list', -'SplStack::top' => 'Peeks at the node from the end of the doubly linked list', -'SplStack::unserialize' => 'Unserializes the storage', -'SplStack::unshift' => 'Prepends the doubly linked list with an element', -'SplStack::valid' => 'Check whether the doubly linked list contains more nodes', -'splsubject::attach' => 'Attach an SplObserver', -'splsubject::detach' => 'Detach an observer', -'splsubject::notify' => 'Notify an observer', -'spltempfileobject::__construct' => 'Construct a new temporary file object', -'SplTempFileObject::__toString' => 'Alias of SplTempFileObject::current', -'SplTempFileObject::current' => 'Retrieve current line of file', -'SplTempFileObject::eof' => 'Reached end of file', -'SplTempFileObject::fflush' => 'Flushes the output to the file', -'SplTempFileObject::fgetc' => 'Gets character from file', -'SplTempFileObject::fgetcsv' => 'Gets line from file and parse as CSV fields', -'SplTempFileObject::fgets' => 'Gets line from file', -'SplTempFileObject::fgetss' => 'Gets line from file and strip HTML tags', -'SplTempFileObject::flock' => 'Portable file locking', -'SplTempFileObject::fpassthru' => 'Output all remaining data on a file pointer', -'SplTempFileObject::fputcsv' => 'Write a field array as a CSV line', -'SplTempFileObject::fread' => 'Read from file', -'SplTempFileObject::fscanf' => 'Parses input from file according to a format', -'SplTempFileObject::fseek' => 'Seek to a position', -'SplTempFileObject::fstat' => 'Gets information about the file', -'SplTempFileObject::ftell' => 'Return current file position', -'SplTempFileObject::ftruncate' => 'Truncates the file to a given length', -'SplTempFileObject::fwrite' => 'Write to file', -'SplTempFileObject::getATime' => 'Gets last access time of the file', -'SplTempFileObject::getBasename' => 'Gets the base name of the file', -'SplTempFileObject::getChildren' => 'No purpose', -'SplTempFileObject::getCsvControl' => 'Get the delimiter, enclosure and escape character for CSV', -'SplTempFileObject::getCTime' => 'Gets the inode change time', -'SplTempFileObject::getCurrentLine' => 'Alias of SplTempFileObject::fgets', -'SplTempFileObject::getExtension' => 'Gets the file extension', -'SplTempFileObject::getFileInfo' => 'Gets an SplTempFileInfo object for the file', -'SplTempFileObject::getFilename' => 'Gets the filename', -'SplTempFileObject::getFlags' => 'Gets flags for the SplTempFileObject', -'SplTempFileObject::getGroup' => 'Gets the file group', -'SplTempFileObject::getInode' => 'Gets the inode for the file', -'SplTempFileObject::getLinkTarget' => 'Gets the target of a link', -'SplTempFileObject::getMaxLineLen' => 'Get maximum line length', -'SplTempFileObject::getMTime' => 'Gets the last modified time', -'SplTempFileObject::getOwner' => 'Gets the owner of the file', -'SplTempFileObject::getPath' => 'Gets the path without filename', -'SplTempFileObject::getPathInfo' => 'Gets an SplTempFileInfo object for the path', -'SplTempFileObject::getPathname' => 'Gets the path to the file', -'SplTempFileObject::getPerms' => 'Gets file permissions', -'SplTempFileObject::getRealPath' => 'Gets absolute path to file', -'SplTempFileObject::getSize' => 'Gets file size', -'SplTempFileObject::getType' => 'Gets file type', -'SplTempFileObject::hasChildren' => 'SplTempFileObject does not have children', -'SplTempFileObject::isDir' => 'Tells if the file is a directory', -'SplTempFileObject::isExecutable' => 'Tells if the file is executable', -'SplTempFileObject::isFile' => 'Tells if the object references a regular file', -'SplTempFileObject::isLink' => 'Tells if the file is a link', -'SplTempFileObject::isReadable' => 'Tells if file is readable', -'SplTempFileObject::isWritable' => 'Tells if the entry is writable', -'SplTempFileObject::key' => 'Get line number', -'SplTempFileObject::next' => 'Read next line', -'SplTempFileObject::openFile' => 'Gets an SplTempFileObject object for the file', -'SplTempFileObject::rewind' => 'Rewind the file to the first line', -'SplTempFileObject::seek' => 'Seek to specified line', -'SplTempFileObject::setCsvControl' => 'Set the delimiter, enclosure and escape character for CSV', -'SplTempFileObject::setFileClass' => 'Sets the class used with SplTempFileInfo::openFile', -'SplTempFileObject::setFlags' => 'Sets flags for the SplTempFileObject', -'SplTempFileObject::setInfoClass' => 'Sets the class used with SplTempFileInfo::getFileInfo and SplTempFileInfo::getPathInfo', -'SplTempFileObject::setMaxLineLen' => 'Set maximum line length', -'SplTempFileObject::valid' => 'Not at EOF', -'spltype::__construct' => 'Creates a new value of some type', -'spoofchecker::__construct' => 'Constructor', -'spoofchecker::areConfusable' => 'Checks if given strings can be confused', -'spoofchecker::isSuspicious' => 'Checks if a given text contains any suspicious characters', -'spoofchecker::setAllowedLocales' => 'Locales to use when running checks', -'spoofchecker::setChecks' => 'Set the checks to run', -'sprintf' => 'Return a formatted string', -'sql_regcase' => 'Make regular expression for case insensitive match', -'sqlite3::__construct' => 'Instantiates an SQLite3 object and opens an SQLite 3 database', -'sqlite3::busyTimeout' => 'Sets the busy connection handler', -'sqlite3::changes' => 'Returns the number of database rows that were changed (or inserted or deleted) by the most recent SQL statement', -'sqlite3::close' => 'Closes the database connection', -'sqlite3::createAggregate' => 'Registers a PHP function for use as an SQL aggregate function', -'sqlite3::createCollation' => 'Registers a PHP function for use as an SQL collating function', -'sqlite3::createFunction' => 'Registers a PHP function for use as an SQL scalar function', -'sqlite3::enableExceptions' => 'Enable throwing exceptions', -'sqlite3::escapeString' => 'Returns a string that has been properly escaped', -'sqlite3::exec' => 'Executes a result-less query against a given database', -'sqlite3::lastErrorCode' => 'Returns the numeric result code of the most recent failed SQLite request', -'sqlite3::lastErrorMsg' => 'Returns English text describing the most recent failed SQLite request', -'sqlite3::lastInsertRowID' => 'Returns the row ID of the most recent INSERT into the database', -'sqlite3::loadExtension' => 'Attempts to load an SQLite extension library', -'sqlite3::open' => 'Opens an SQLite database', -'sqlite3::openBlob' => 'Opens a stream resource to read a BLOB', -'sqlite3::prepare' => 'Prepares an SQL statement for execution', -'sqlite3::query' => 'Executes an SQL query', -'sqlite3::querySingle' => 'Executes a query and returns a single result', -'sqlite3::version' => 'Returns the SQLite3 library version as a string constant and as a number', -'sqlite3result::columnName' => 'Returns the name of the nth column', -'sqlite3result::columnType' => 'Returns the type of the nth column', -'sqlite3result::fetchArray' => 'Fetches a result row as an associative or numerically indexed array or both', -'sqlite3result::finalize' => 'Closes the result set', -'sqlite3result::numColumns' => 'Returns the number of columns in the result set', -'sqlite3result::reset' => 'Resets the result set back to the first row', -'sqlite3stmt::bindParam' => 'Binds a parameter to a statement variable', -'sqlite3stmt::bindValue' => 'Binds the value of a parameter to a statement variable', -'sqlite3stmt::clear' => 'Clears all current bound parameters', -'sqlite3stmt::close' => 'Closes the prepared statement', -'sqlite3stmt::execute' => 'Executes a prepared statement and returns a result set object', -'sqlite3stmt::getSQL' => 'Get the SQL of the statement', -'sqlite3stmt::paramCount' => 'Returns the number of parameters within the prepared statement', -'sqlite3stmt::readOnly' => 'Returns whether a statement is definitely read only', -'sqlite3stmt::reset' => 'Resets the prepared statement', -'sqlite_close' => 'Closes an open SQLite database', -'sqlite_error_string' => 'Returns the textual description of an error code', -'sqlite_escape_string' => 'Escapes a string for use as a query parameter', -'sqlite_factory' => 'Opens an SQLite database and returns an SQLiteDatabase object', -'sqlite_fetch_string' => 'Alias of sqlite_fetch_single', -'sqlite_has_more' => 'Finds whether or not more rows are available', -'sqlite_libencoding' => 'Returns the encoding of the linked SQLite library', -'sqlite_libversion' => 'Returns the version of the linked SQLite library', -'sqlite_open' => 'Opens an SQLite database and create the database if it does not exist', -'sqlite_popen' => 'Opens a persistent handle to an SQLite database and create the database if it does not exist', -'sqlite_udf_decode_binary' => 'Decode binary data passed as parameters to an UDF', -'sqlite_udf_encode_binary' => 'Encode binary data before returning it from an UDF', -'SQLiteDatabase::__construct' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)', -'SQLiteDatabase::arrayQuery' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Execute a query against a given database and returns an array', -'SQLiteDatabase::busyTimeout' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Set busy timeout duration, or disable busy handlers', -'SQLiteDatabase::changes' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Returns the number of rows that were changed by the most recent SQL statement', -'SQLiteDatabase::createAggregate' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Register an aggregating UDF for use in SQL statements', -'SQLiteDatabase::createFunction' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Registers a "regular" User Defined Function for use in SQL statements', -'SQLiteDatabase::fetchColumnTypes' => '(PHP 5 < 5.4.0) -Return an array of column types from a particular table', -'SQLiteDatabase::lastError' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Returns the error code of the last error for a database', -'SQLiteDatabase::lastInsertRowid' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Returns the rowid of the most recently inserted row', -'SQLiteDatabase::query' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)', -'SQLiteDatabase::queryExec' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)', -'SQLiteDatabase::singleQuery' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.1) -Executes a query and returns either an array for one single column or the value of the first row', -'SQLiteDatabase::unbufferedQuery' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Execute a query that does not prefetch and buffer all data', -'SQLiteException::__clone' => 'Clone the exception', -'SQLiteException::__construct' => 'Construct the exception', -'SQLiteException::__toString' => 'String representation of the exception', -'SQLiteResult::column' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Fetches a column from the current row of a result set', -'SQLiteResult::count' => 'Count elements of an object', -'SQLiteResult::current' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Fetches the current row from a result set as an array', -'SQLiteResult::fetch' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Fetches the next row from a result set as an array', -'SQLiteResult::fetchAll' => '(PHP 5 < 5.4.0) -Fetches the next row from a result set as an object', -'SQLiteResult::fetchObject' => '(PHP 5 < 5.4.0) -Fetches the next row from a result set as an object', -'SQLiteResult::fetchSingle' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.1) -Fetches the first column of a result set as a string', -'SQLiteResult::fieldName' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Returns the name of a particular field', -'SQLiteResult::hasPrev' => '`@return bool` <p> -Returns <b>TRUE</b> if there are more previous rows available from the -<i>result</i> handle, or <b>FALSE</b> otherwise. -</p>', -'SQLiteResult::key' => 'Return the key of the current element', -'SQLiteResult::next' => 'Seek to the next row number', -'SQLiteResult::numFields' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Returns the number of fields in a result set', -'SQLiteResult::numRows' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Returns the number of rows in a buffered result set', -'SQLiteResult::prev' => 'Seek to the previous row number of a result set', -'SQLiteResult::rewind' => 'Rewind the Iterator to the first element', -'SQLiteResult::seek' => '(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0) -Seek to a particular row number of a buffered result set', -'SQLiteResult::valid' => 'Checks if current position is valid', -'sqlsrv_begin_transaction' => 'Begins a database transaction', -'sqlsrv_cancel' => 'Cancels a statement', -'sqlsrv_client_info' => 'Returns information about the client and specified connection', -'sqlsrv_close' => 'Closes an open connection and releases resourses associated with the connection', -'sqlsrv_commit' => 'Commits a transaction that was begun with sqlsrv_begin_transaction', -'sqlsrv_configure' => 'Changes the driver error handling and logging configurations', -'sqlsrv_connect' => 'Opens a connection to a Microsoft SQL Server database', -'sqlsrv_errors' => 'Returns error and warning information about the last SQLSRV operation performed', -'sqlsrv_execute' => 'Executes a statement prepared with sqlsrv_prepare', -'sqlsrv_fetch' => 'Makes the next row in a result set available for reading', -'sqlsrv_fetch_array' => 'Returns a row as an array', -'sqlsrv_fetch_object' => 'Retrieves the next row of data in a result set as an object', -'sqlsrv_field_metadata' => 'Retrieves metadata for the fields of a statement prepared by sqlsrv_prepare or sqlsrv_query', -'sqlsrv_free_stmt' => 'Frees all resources for the specified statement', -'sqlsrv_get_config' => 'Returns the value of the specified configuration setting', -'sqlsrv_get_field' => 'Gets field data from the currently selected row', -'sqlsrv_has_rows' => 'Indicates whether the specified statement has rows', -'sqlsrv_next_result' => 'Makes the next result of the specified statement active', -'sqlsrv_num_fields' => 'Retrieves the number of fields (columns) on a statement', -'sqlsrv_num_rows' => 'Retrieves the number of rows in a result set', -'SQLSRV_PHPTYPE_STREAM' => 'Specifies the encoding of a stream of data from the server. - -<br />When specifying the PHP data type of a value being returned from the server, this allows you to specify the encoding -used to process the value if the value is a stream.<br /> - -In the documentation this is presented as a constant that accepts an argument.<br /> - -When you use SQLSRV_PHPTYPE_STREAM, the encoding must be specified. If no parameter is supplied, an error will be -returned.<br /> - -Additional Information at: -<ul> -<li>{@link http://msdn.microsoft.com/en-us/library/cc296208.aspx How to: Specify PHP Data Types}</li></li> -<li>{@link http://msdn.microsoft.com/en-us/library/cc296163.aspx How to: Retrieve Character Data as a Stream Using the SQLSRV Driver.}</li> -<li>{@link http://msdn.microsoft.com/en-us/library/cc626307.aspx How to: Send and Retrieve UTF-8 Data Using Built-In UTF-8 Support.}</li> -<li>{@link http://msdn.microsoft.com/en-us/library/cc296152.aspx SQLSRV Driver API Reference}</li></ui>', -'SQLSRV_PHPTYPE_STRING' => 'Specifies the encoding of a string being received form the server. - -<br />When specifying the PHP data type of a value being returned from the server, this allows you to specify the -encoding used to process the value if the value is a string.<br /> - -In the documentation this is presented as a constant that accepts an argument.<br /> - -When you use SQLSRV_PHPTYPE_STRING, the encoding must be specified. If no parameter is supplied, an error will be -returned.<br /> - -Additional Information at: -<ul> -<li>{@link http://msdn.microsoft.com/en-us/library/cc296208.aspx How to: Specify PHP Data Types}</li></li> -<li>{@link http://msdn.microsoft.com/en-us/library/cc296163.aspx How to: Retrieve Character Data as a Stream Using the SQLSRV Driver.}</li> -<li>{@link http://msdn.microsoft.com/en-us/library/cc626307.aspx How to: Send and Retrieve UTF-8 Data Using Built-In UTF-8 Support.}</li> -<li>{@link http://msdn.microsoft.com/en-us/library/cc296152.aspx SQLSRV Driver API Reference}</li></ui>', -'sqlsrv_prepare' => 'Prepares a query for execution', -'sqlsrv_query' => 'Prepares and executes a query', -'sqlsrv_rollback' => 'Rolls back a transaction that was begun with sqlsrv_begin_transaction', -'sqlsrv_rows_affected' => 'Returns the number of rows modified by the last INSERT, UPDATE, or DELETE query executed', -'sqlsrv_send_stream_data' => 'Sends data from parameter streams to the server', -'sqlsrv_server_info' => 'Returns information about the server', -'SQLSRV_SQLTYPE_BINARY' => 'Specifies a SQL Server binary field. - -<br />In the documentation this is presented as a constant that accepts an argument.<br /> - -Additional Information at {@link http://msdn.microsoft.com/en-us/library/cc296152.aspx SQLSRV Driver API Reference}<br />', -'SQLSRV_SQLTYPE_CHAR' => 'Specifies a SQL Server char field. - -<br />In the documentation this is presented as a constant that accepts an argument.<br /> - -Additional Information at {@link http://msdn.microsoft.com/en-us/library/cc296152.aspx SQLSRV Driver API Reference}<br />', -'SQLSRV_SQLTYPE_DECIMAL' => 'Specifies a SQL Server decimal field. - -<br />In the documentation this is presented as a constant that accepts an argument.<br /> - -Additional Information at {@link http://msdn.microsoft.com/en-us/library/cc296152.aspx SQLSRV Driver API Reference}<br />', -'SQLSRV_SQLTYPE_NCHAR' => 'Specifies a SQL Server nchar field. - -<br />In the documentation this is presented as a constant that accepts an argument.<br /> - -Additional Information at {@link http://msdn.microsoft.com/en-us/library/cc296152.aspx SQLSRV Driver API Reference}<br />', -'SQLSRV_SQLTYPE_NUMERIC' => 'Specifies a SQL Server numeric field. - -<br />In the documentation this is presented as a constant that accepts an argument.<br /> - -Additional Information at {@link http://msdn.microsoft.com/en-us/library/cc296152.aspx SQLSRV Driver API Reference}<br />', -'SQLSRV_SQLTYPE_NVARCHAR' => 'Specifies a SQL Server nvarchar field. - -<br />In the documentation this is presented as a constant that accepts an argument.<br /> - -Additional Information at {@link http://msdn.microsoft.com/en-us/library/cc296152.aspx SQLSRV Driver API Reference}<br />', -'SQLSRV_SQLTYPE_VARBINARY' => 'Specifies a SQL Server varbinary field. - -<br />In the documentation this is presented as a constant that accepts an argument.<br /> - -Additional Information at {@link http://msdn.microsoft.com/en-us/library/cc296152.aspx SQLSRV Driver API Reference}<br />', -'SQLSRV_SQLTYPE_VARCHAR' => 'Specifies a SQL Server varchar filed. - -<br />In the documentation this is presented as a constant that accepts an argument.<br /> - -Additional Information at {@link http://msdn.microsoft.com/en-us/library/cc296152.aspx SQLSRV Driver API Reference}<br />', -'sqrt' => 'Square root', -'srand' => 'Seed the random number generator', -'sscanf' => 'Parses input from a string according to a format', -'ssdeep_fuzzy_compare' => 'Calculates the match score between two fuzzy hash signatures', -'ssdeep_fuzzy_hash' => 'Create a fuzzy hash from a string', -'ssdeep_fuzzy_hash_filename' => 'Create a fuzzy hash from a file', -'ssh2_auth_agent' => 'Authenticate over SSH using the ssh agent', -'ssh2_auth_hostbased_file' => 'Authenticate using a public hostkey', -'ssh2_auth_none' => 'Authenticate as "none"', -'ssh2_auth_password' => 'Authenticate over SSH using a plain password', -'ssh2_auth_pubkey_file' => 'Authenticate using a public key', -'ssh2_connect' => 'Connect to an SSH server', -'ssh2_disconnect' => 'Close a connection to a remote SSH server', -'ssh2_exec' => 'Execute a command on a remote server', -'ssh2_fetch_stream' => 'Fetch an extended data stream', -'ssh2_fingerprint' => 'Retrieve fingerprint of remote server', -'ssh2_methods_negotiated' => 'Return list of negotiated methods', -'ssh2_publickey_add' => 'Add an authorized publickey', -'ssh2_publickey_init' => 'Initialize Publickey subsystem', -'ssh2_publickey_list' => 'List currently authorized publickeys', -'ssh2_publickey_remove' => 'Remove an authorized publickey', -'ssh2_scp_recv' => 'Request a file via SCP', -'ssh2_scp_send' => 'Send a file via SCP', -'ssh2_sftp' => 'Initialize SFTP subsystem', -'ssh2_sftp_chmod' => 'Changes file mode', -'ssh2_sftp_lstat' => 'Stat a symbolic link', -'ssh2_sftp_mkdir' => 'Create a directory', -'ssh2_sftp_readlink' => 'Return the target of a symbolic link', -'ssh2_sftp_realpath' => 'Resolve the realpath of a provided path string', -'ssh2_sftp_rename' => 'Rename a remote file', -'ssh2_sftp_rmdir' => 'Remove a directory', -'ssh2_sftp_stat' => 'Stat a file on a remote filesystem', -'ssh2_sftp_symlink' => 'Create a symlink', -'ssh2_sftp_unlink' => 'Delete a file', -'ssh2_shell' => 'Request an interactive shell', -'ssh2_tunnel' => 'Open a tunnel through a remote server', -'stat' => 'Gives information about a file', -'stats_absolute_deviation' => 'Returns the absolute deviation of an array of values', -'stats_cdf_beta' => 'Calculates any one parameter of the beta distribution given values for the others', -'stats_cdf_binomial' => 'Calculates any one parameter of the binomial distribution given values for the others', -'stats_cdf_cauchy' => 'Calculates any one parameter of the Cauchy distribution given values for the others', -'stats_cdf_chisquare' => 'Calculates any one parameter of the chi-square distribution given values for the others', -'stats_cdf_exponential' => 'Calculates any one parameter of the exponential distribution given values for the others', -'stats_cdf_f' => 'Calculates any one parameter of the F distribution given values for the others', -'stats_cdf_gamma' => 'Calculates any one parameter of the gamma distribution given values for the others', -'stats_cdf_laplace' => 'Calculates any one parameter of the Laplace distribution given values for the others', -'stats_cdf_logistic' => 'Calculates any one parameter of the logistic distribution given values for the others', -'stats_cdf_negative_binomial' => 'Calculates any one parameter of the negative binomial distribution given values for the others', -'stats_cdf_noncentral_chisquare' => 'Calculates any one parameter of the non-central chi-square distribution given values for the others', -'stats_cdf_noncentral_f' => 'Calculates any one parameter of the non-central F distribution given values for the others', -'stats_cdf_noncentral_t' => 'Calculates any one parameter of the non-central t-distribution give values for the others', -'stats_cdf_normal' => 'Calculates any one parameter of the normal distribution given values for the others', -'stats_cdf_poisson' => 'Calculates any one parameter of the Poisson distribution given values for the others', -'stats_cdf_t' => 'Calculates any one parameter of the t-distribution given values for the others', -'stats_cdf_uniform' => 'Calculates any one parameter of the uniform distribution given values for the others', -'stats_cdf_weibull' => 'Calculates any one parameter of the Weibull distribution given values for the others', -'stats_covariance' => 'Computes the covariance of two data sets', -'stats_dens_beta' => 'Probability density function of the beta distribution', -'stats_dens_cauchy' => 'Probability density function of the Cauchy distribution', -'stats_dens_chisquare' => 'Probability density function of the chi-square distribution', -'stats_dens_exponential' => 'Probability density function of the exponential distribution', -'stats_dens_f' => 'Probability density function of the F distribution', -'stats_dens_gamma' => 'Probability density function of the gamma distribution', -'stats_dens_laplace' => 'Probability density function of the Laplace distribution', -'stats_dens_logistic' => 'Probability density function of the logistic distribution', -'stats_dens_normal' => 'Probability density function of the normal distribution', -'stats_dens_pmf_binomial' => 'Probability mass function of the binomial distribution', -'stats_dens_pmf_hypergeometric' => 'Probability mass function of the hypergeometric distribution', -'stats_dens_pmf_negative_binomial' => 'Probability density function of the negative binomial distribution', -'stats_dens_pmf_poisson' => 'Probability mass function of the Poisson distribution', -'stats_dens_t' => 'Probability density function of the t-distribution', -'stats_dens_uniform' => 'Probability density function of the uniform distribution', -'stats_dens_weibull' => 'Probability density function of the Weibull distribution', -'stats_harmonic_mean' => 'Returns the harmonic mean of an array of values', -'stats_kurtosis' => 'Computes the kurtosis of the data in the array', -'stats_rand_gen_beta' => 'Generates a random deviate from the beta distribution', -'stats_rand_gen_chisquare' => 'Generates a random deviate from the chi-square distribution', -'stats_rand_gen_exponential' => 'Generates a random deviate from the exponential distribution', -'stats_rand_gen_f' => 'Generates a random deviate from the F distribution', -'stats_rand_gen_funiform' => 'Generates uniform float between low (exclusive) and high (exclusive)', -'stats_rand_gen_gamma' => 'Generates a random deviate from the gamma distribution', -'stats_rand_gen_ibinomial' => 'Generates a random deviate from the binomial distribution', -'stats_rand_gen_ibinomial_negative' => 'Generates a random deviate from the negative binomial distribution', -'stats_rand_gen_int' => 'Generates random integer between 1 and 2147483562', -'stats_rand_gen_ipoisson' => 'Generates a single random deviate from a Poisson distribution', -'stats_rand_gen_iuniform' => 'Generates integer uniformly distributed between LOW (inclusive) and HIGH (inclusive)', -'stats_rand_gen_noncenral_chisquare' => 'Generates a random deviate from the non-central chi-square distribution', -'stats_rand_gen_noncentral_chisquare' => 'Generates a random deviate from the non-central chi-square distribution', -'stats_rand_gen_noncentral_f' => 'Generates a random deviate from the noncentral F distribution', -'stats_rand_gen_noncentral_t' => 'Generates a single random deviate from a non-central t-distribution', -'stats_rand_gen_normal' => 'Generates a single random deviate from a normal distribution', -'stats_rand_gen_t' => 'Generates a single random deviate from a t-distribution', -'stats_rand_get_seeds' => 'Get the seed values of the random number generator', -'stats_rand_phrase_to_seeds' => 'Generate two seeds for the RGN random number generator', -'stats_rand_ranf' => 'Generates a random floating point number between 0 and 1', -'stats_rand_setall' => 'Set seed values to the random generator', -'stats_skew' => 'Computes the skewness of the data in the array', -'stats_standard_deviation' => 'Returns the standard deviation', -'stats_stat_binomial_coef' => 'Returns a binomial coefficient', -'stats_stat_correlation' => 'Returns the Pearson correlation coefficient of two data sets', -'stats_stat_factorial' => 'Returns the factorial of an integer', -'stats_stat_independent_t' => 'Returns the t-value from the independent two-sample t-test', -'stats_stat_innerproduct' => 'Returns the inner product of two vectors', -'stats_stat_paired_t' => 'Returns the t-value of the dependent t-test for paired samples', -'stats_stat_percentile' => 'Returns the percentile value', -'stats_stat_powersum' => 'Returns the power sum of a vector', -'stats_variance' => 'Returns the variance', -'stomp::__construct' => 'Opens a connection', -'stomp::__destruct' => 'Closes stomp connection', -'stomp::abort' => 'Rolls back a transaction in progress', -'stomp::ack' => 'Acknowledges consumption of a message', -'stomp::begin' => 'Starts a transaction', -'stomp::commit' => 'Commits a transaction in progress', -'stomp::error' => 'Gets the last stomp error', -'stomp::getReadTimeout' => 'Gets read timeout', -'stomp::getSessionId' => 'Gets the current stomp session ID', -'stomp::hasFrame' => 'Indicates whether or not there is a frame ready to read', -'stomp::readFrame' => 'Reads the next frame', -'stomp::send' => 'Sends a message', -'stomp::setReadTimeout' => 'Sets read timeout', -'stomp::subscribe' => 'Registers to listen to a given destination', -'stomp::unsubscribe' => 'Removes an existing subscription', -'stomp_connect_error' => 'Returns a string description of the last connect error', -'stomp_version' => 'Gets the current stomp extension version', -'stompexception::getDetails' => 'Get exception details', -'stompframe::__construct' => 'Constructor', -'str_getcsv' => 'Parse a CSV string into an array', -'str_ireplace' => 'Case-insensitive version of str_replace', -'str_pad' => 'Pad a string to a certain length with another string', -'str_repeat' => 'Repeat a string', -'str_replace' => 'Replace all occurrences of the search string with the replacement string', -'str_rot13' => 'Perform the rot13 transform on a string', -'str_shuffle' => 'Randomly shuffles a string', -'str_split' => 'Convert a string to an array', -'str_word_count' => 'Return information about words used in a string', -'strcasecmp' => 'Binary safe case-insensitive string comparison', -'strchr' => 'Alias of strstr', -'strcmp' => 'Binary safe string comparison', -'strcoll' => 'Locale based string comparison', -'strcspn' => 'Find length of initial segment not matching mask', -'stream_bucket_append' => 'Append bucket to brigade', -'stream_bucket_make_writeable' => 'Return a bucket object from the brigade for operating on', -'stream_bucket_new' => 'Create a new bucket for use on the current stream', -'stream_bucket_prepend' => 'Prepend bucket to brigade', -'stream_context_create' => 'Creates a stream context', -'stream_context_get_default' => 'Retrieve the default stream context', -'stream_context_get_options' => 'Retrieve options for a stream/wrapper/context', -'stream_context_get_params' => 'Retrieves parameters from a context', -'stream_context_set_default' => 'Set the default stream context', -'stream_context_set_option' => 'Sets an option for a stream/wrapper/context', -'stream_context_set_params' => 'Set parameters for a stream/wrapper/context', -'stream_copy_to_stream' => 'Copies data from one stream to another', -'stream_filter_append' => 'Attach a filter to a stream', -'stream_filter_prepend' => 'Attach a filter to a stream', -'stream_filter_register' => 'Register a user defined stream filter', -'stream_filter_remove' => 'Remove a filter from a stream', -'stream_get_contents' => 'Reads remainder of a stream into a string', -'stream_get_filters' => 'Retrieve list of registered filters', -'stream_get_line' => 'Gets line from stream resource up to a given delimiter', -'stream_get_meta_data' => 'Retrieves header/meta data from streams/file pointers', -'stream_get_transports' => 'Retrieve list of registered socket transports', -'stream_get_wrappers' => 'Retrieve list of registered streams', -'stream_is_local' => 'Checks if a stream is a local stream', -'stream_isatty' => 'Check if a stream is a TTY', -'stream_notification_callback' => 'A callback function for the notification context parameter', -'stream_register_wrapper' => 'Alias of stream_wrapper_register', -'stream_resolve_include_path' => 'Resolve filename against the include path', -'stream_select' => 'Runs the equivalent of the select() system call on the given arrays of streams with a timeout specified by tv_sec and tv_usec', -'stream_set_blocking' => 'Set blocking/non-blocking mode on a stream', -'stream_set_chunk_size' => 'Set the stream chunk size', -'stream_set_read_buffer' => 'Set read file buffering on the given stream', -'stream_set_timeout' => 'Set timeout period on a stream', -'stream_set_write_buffer' => 'Sets write file buffering on the given stream', -'stream_socket_accept' => 'Accept a connection on a socket created by stream_socket_server', -'stream_socket_client' => 'Open Internet or Unix domain socket connection', -'stream_socket_enable_crypto' => 'Turns encryption on/off on an already connected socket', -'stream_socket_get_name' => 'Retrieve the name of the local or remote sockets', -'stream_socket_pair' => 'Creates a pair of connected, indistinguishable socket streams', -'stream_socket_recvfrom' => 'Receives data from a socket, connected or not', -'stream_socket_sendto' => 'Sends a message to a socket, whether it is connected or not', -'stream_socket_server' => 'Create an Internet or Unix domain server socket', -'stream_socket_shutdown' => 'Shutdown a full-duplex connection', -'stream_supports_lock' => 'Tells whether the stream supports locking', -'stream_wrapper_register' => 'Register a URL wrapper implemented as a PHP class', -'stream_wrapper_restore' => 'Restores a previously unregistered built-in wrapper', -'stream_wrapper_unregister' => 'Unregister a URL wrapper', -'streamWrapper::__construct' => 'Constructs a new stream wrapper', -'streamWrapper::__destruct' => 'Destructs an existing stream wrapper', -'streamWrapper::dir_closedir' => 'Close directory handle', -'streamWrapper::dir_opendir' => 'Open directory handle', -'streamWrapper::dir_readdir' => 'Read entry from directory handle', -'streamWrapper::dir_rewinddir' => 'Rewind directory handle', -'streamWrapper::mkdir' => 'Create a directory', -'streamWrapper::rename' => 'Renames a file or directory', -'streamWrapper::rmdir' => 'Removes a directory', -'streamWrapper::stream_cast' => 'Retrieve the underlaying resource', -'streamWrapper::stream_close' => 'Close a resource', -'streamWrapper::stream_eof' => 'Tests for end-of-file on a file pointer', -'streamWrapper::stream_flush' => 'Flushes the output', -'streamWrapper::stream_lock' => 'Advisory file locking', -'streamWrapper::stream_metadata' => 'Change stream metadata', -'streamWrapper::stream_open' => 'Opens file or URL', -'streamWrapper::stream_read' => 'Read from stream', -'streamWrapper::stream_seek' => 'Seeks to specific location in a stream', -'streamWrapper::stream_set_option' => 'Change stream options', -'streamWrapper::stream_stat' => 'Retrieve information about a file resource', -'streamWrapper::stream_tell' => 'Retrieve the current position of a stream', -'streamWrapper::stream_truncate' => 'Truncate stream', -'streamWrapper::stream_write' => 'Write to stream', -'streamWrapper::unlink' => 'Delete a file', -'streamWrapper::url_stat' => 'Retrieve information about a file', -'strftime' => 'Format a local time/date according to locale settings', -'strip_tags' => 'Strip HTML and PHP tags from a string', -'stripcslashes' => 'Un-quote string quoted with addcslashes', -'stripos' => 'Find the position of the first occurrence of a case-insensitive substring in a string', -'stripslashes' => 'Un-quotes a quoted string', -'stristr' => 'Case-insensitive strstr', -'strlen' => 'Get string length', -'strnatcasecmp' => 'Case insensitive string comparisons using a "natural order" algorithm', -'strnatcmp' => 'String comparisons using a "natural order" algorithm', -'strncasecmp' => 'Binary safe case-insensitive string comparison of the first n characters', -'strncmp' => 'Binary safe string comparison of the first n characters', -'strpbrk' => 'Search a string for any of a set of characters', -'strpos' => 'Find the position of the first occurrence of a substring in a string', -'strptime' => 'Parse a time/date generated with strftime', -'strrchr' => 'Find the last occurrence of a character in a string', -'strrev' => 'Reverse a string', -'strripos' => 'Find the position of the last occurrence of a case-insensitive substring in a string', -'strrpos' => 'Find the position of the last occurrence of a substring in a string', -'strspn' => 'Finds the length of the initial segment of a string consisting entirely of characters contained within a given mask', -'strstr' => 'Find the first occurrence of a string', -'strtok' => 'Tokenize string', -'strtolower' => 'Make a string lowercase', -'strtotime' => 'Parse about any English textual datetime description into a Unix timestamp', -'strtoupper' => 'Make a string uppercase', -'strtr' => 'Translate characters or replace substrings', -'strval' => 'Get string value of a variable', -'StubTests\Model\StubsContainer::getClass' => '`@return PHPClass | null`', -'StubTests\Model\StubsContainer::getInterface' => '`@return PHPInterface | null`', -'StubTests\Parsers\ExpectedFunctionArgumentsInfo::__construct' => 'ExpectedFunctionArgumentsInfo constructor.', -'StubTests\Parsers\StubsParserErrorHandler::handleError' => 'Handle an error generated during lexing, parsing or some other operation.', -'styleObj::__construct' => 'The second argument \'style\' is optional. If given, the new style -created will be a copy of the style passed as argument.', -'styleObj::convertToString' => 'Saves the object to a string. Provides the inverse option for -updateFromString.', -'styleObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the -resources.', -'styleObj::getBinding' => 'Get the attribute binding for a specfiled style property. Returns -NULL if there is no binding for this property. -.. code-block:: php -$oStyle->setbinding(MS_STYLE_BINDING_COLOR, "FIELD_NAME_COLOR"); -echo $oStyle->getbinding(MS_STYLE_BINDING_COLOR); // FIELD_NAME_COLOR', -'styleObj::ms_newStyleObj' => 'Old style constructor', -'styleObj::removeBinding' => 'Remove the attribute binding for a specfiled style property. -Added in MapServer 5.0. -.. code-block:: php -$oStyle->removebinding(MS_STYLE_BINDING_COLOR);', -'styleObj::set' => 'Set object property to a new value.', -'styleObj::setBinding' => 'Set the attribute binding for a specfiled style property. -Added in MapServer 5.0. -.. code-block:: php -$oStyle->setbinding(MS_STYLE_BINDING_COLOR, "FIELD_NAME_COLOR"); -This would bind the color parameter with the data (ie will extract -the value of the color from the field called "FIELD_NAME_COLOR"', -'styleObj::updateFromString' => 'Update a style from a string snippet. Returns MS_SUCCESS/MS_FAILURE.', -'substr' => 'Return part of a string', -'substr_compare' => 'Binary safe comparison of two strings from an offset, up to length characters', -'substr_count' => 'Count the number of substring occurrences', -'substr_replace' => 'Replace text within a portion of a string', -'suhosin_encrypt_cookie' => 'Encrypts a cookie value according to current cookie encrpytion setting', -'suhosin_get_raw_cookies' => 'Returns an array containing the raw cookie values', -'svm::__construct' => 'Construct a new SVM object', -'svm::crossvalidate' => 'Test training params on subsets of the training data', -'svm::getOptions' => 'Return the current training parameters', -'svm::setOptions' => 'Set training parameters', -'svm::train' => 'Create a SVMModel based on training data', -'svmmodel::__construct' => 'Construct a new SVMModel', -'svmmodel::checkProbabilityModel' => 'Returns true if the model has probability information', -'svmmodel::getLabels' => 'Get the labels the model was trained on', -'svmmodel::getNrClass' => 'Returns the number of classes the model was trained with', -'svmmodel::getSvmType' => 'Get the SVM type the model was trained with', -'svmmodel::getSvrProbability' => 'Get the sigma value for regression types', -'svmmodel::load' => 'Load a saved SVM Model', -'svmmodel::predict' => 'Predict a value for previously unseen data', -'svmmodel::predict_probability' => 'Return class probabilities for previous unseen data', -'svmmodel::save' => 'Save a model to a file', -'svn_add' => 'Schedules the addition of an item in a working directory', -'svn_auth_get_parameter' => 'Retrieves authentication parameter', -'svn_auth_set_parameter' => 'Sets an authentication parameter', -'svn_blame' => 'Get the SVN blame for a file', -'svn_cat' => 'Returns the contents of a file in a repository', -'svn_checkout' => 'Checks out a working copy from the repository', -'svn_cleanup' => 'Recursively cleanup a working copy directory, finishing incomplete operations and removing locks', -'svn_client_version' => 'Returns the version of the SVN client libraries', -'svn_commit' => 'Sends changes from the local working copy to the repository', -'svn_delete' => 'Delete items from a working copy or repository', -'svn_diff' => 'Recursively diffs two paths', -'svn_export' => 'Export the contents of a SVN directory', -'svn_fs_abort_txn' => 'Abort a transaction, returns true if everything is okay, false otherwise', -'svn_fs_apply_text' => 'Creates and returns a stream that will be used to replace', -'svn_fs_begin_txn2' => 'Create a new transaction', -'svn_fs_change_node_prop' => 'Return true if everything is ok, false otherwise', -'svn_fs_check_path' => 'Determines what kind of item lives at path in a given repository fsroot', -'svn_fs_contents_changed' => 'Return true if content is different, false otherwise', -'svn_fs_copy' => 'Copies a file or a directory, returns true if all is ok, false otherwise', -'svn_fs_delete' => 'Deletes a file or a directory, return true if all is ok, false otherwise', -'svn_fs_dir_entries' => 'Enumerates the directory entries under path; returns a hash of dir names to file type', -'svn_fs_file_contents' => 'Returns a stream to access the contents of a file from a given version of the fs', -'svn_fs_file_length' => 'Returns the length of a file from a given version of the fs', -'svn_fs_is_dir' => 'Return true if the path points to a directory, false otherwise', -'svn_fs_is_file' => 'Return true if the path points to a file, false otherwise', -'svn_fs_make_dir' => 'Creates a new empty directory, returns true if all is ok, false otherwise', -'svn_fs_make_file' => 'Creates a new empty file, returns true if all is ok, false otherwise', -'svn_fs_node_created_rev' => 'Returns the revision in which path under fsroot was created', -'svn_fs_node_prop' => 'Returns the value of a property for a node', -'svn_fs_props_changed' => 'Return true if props are different, false otherwise', -'svn_fs_revision_prop' => 'Fetches the value of a named property', -'svn_fs_revision_root' => 'Get a handle on a specific version of the repository root', -'svn_fs_txn_root' => 'Creates and returns a transaction root', -'svn_fs_youngest_rev' => 'Returns the number of the youngest revision in the filesystem', -'svn_import' => 'Imports an unversioned path into a repository', -'svn_log' => 'Returns the commit log messages of a repository URL', -'svn_ls' => 'Returns list of directory contents in repository URL, optionally at revision number', -'svn_mkdir' => 'Creates a directory in a working copy or repository', -'svn_repos_create' => 'Create a new subversion repository at path', -'svn_repos_fs' => 'Gets a handle on the filesystem for a repository', -'svn_repos_fs_begin_txn_for_commit' => 'Create a new transaction', -'svn_repos_fs_commit_txn' => 'Commits a transaction and returns the new revision', -'svn_repos_hotcopy' => 'Make a hot-copy of the repos at repospath; copy it to destpath', -'svn_repos_open' => 'Open a shared lock on a repository', -'svn_repos_recover' => 'Run recovery procedures on the repository located at path', -'svn_revert' => 'Revert changes to the working copy', -'svn_status' => 'Returns the status of working copy files and directories', -'svn_update' => 'Update working copy', -'swfaction::__construct' => 'Creates a new SWFAction', -'swfbitmap::__construct' => 'Loads Bitmap object', -'swfbitmap::getHeight' => 'Returns the bitmap\'s height', -'swfbitmap::getWidth' => 'Returns the bitmap\'s width', -'swfbutton::__construct' => 'Creates a new Button', -'swfbutton::addAction' => 'Adds an action', -'swfbutton::addASound' => 'Associates a sound with a button transition', -'swfbutton::addShape' => 'Adds a shape to a button', -'swfbutton::setAction' => 'Sets the action', -'swfbutton::setDown' => 'Alias for addShape(shape, SWFBUTTON_DOWN)', -'swfbutton::setHit' => 'Alias for addShape(shape, SWFBUTTON_HIT)', -'swfbutton::setMenu' => 'Enable track as menu button behaviour', -'swfbutton::setOver' => 'Alias for addShape(shape, SWFBUTTON_OVER)', -'swfbutton::setUp' => 'Alias for addShape(shape, SWFBUTTON_UP)', -'swfdisplayitem::addAction' => 'Adds this SWFAction to the given SWFSprite instance', -'swfdisplayitem::addColor' => 'Adds the given color to this item\'s color transform', -'swfdisplayitem::endMask' => 'Another way of defining a MASK layer', -'swfdisplayitem::move' => 'Moves object in relative coordinates', -'swfdisplayitem::moveTo' => 'Moves object in global coordinates', -'swfdisplayitem::multColor' => 'Multiplies the item\'s color transform', -'swfdisplayitem::remove' => 'Removes the object from the movie', -'swfdisplayitem::rotate' => 'Rotates in relative coordinates', -'swfdisplayitem::rotateTo' => 'Rotates the object in global coordinates', -'swfdisplayitem::scale' => 'Scales the object in relative coordinates', -'swfdisplayitem::scaleTo' => 'Scales the object in global coordinates', -'swfdisplayitem::setDepth' => 'Sets z-order', -'swfdisplayitem::setMaskLevel' => 'Defines a MASK layer at level', -'swfdisplayitem::setMatrix' => 'Sets the item\'s transform matrix', -'swfdisplayitem::setName' => 'Sets the object\'s name', -'swfdisplayitem::setRatio' => 'Sets the object\'s ratio', -'swfdisplayitem::skewX' => 'Sets the X-skew', -'swfdisplayitem::skewXTo' => 'Sets the X-skew', -'swfdisplayitem::skewY' => 'Sets the Y-skew', -'swfdisplayitem::skewYTo' => 'Sets the Y-skew', -'swffill::moveTo' => 'Moves fill origin', -'swffill::rotateTo' => 'Sets fill\'s rotation', -'swffill::scaleTo' => 'Sets fill\'s scale', -'swffill::skewXTo' => 'Sets fill x-skew', -'swffill::skewYTo' => 'Sets fill y-skew', -'swffont::__construct' => 'Loads a font definition', -'swffont::getAscent' => 'Returns the ascent of the font, or 0 if not available', -'swffont::getDescent' => 'Returns the descent of the font, or 0 if not available', -'swffont::getLeading' => 'Returns the leading of the font, or 0 if not available', -'swffont::getShape' => 'Returns the glyph shape of a char as a text string', -'swffont::getUTF8Width' => 'Calculates the width of the given string in this font at full height', -'swffont::getWidth' => 'Returns the string\'s width', -'swffontchar::addChars' => 'Adds characters to a font for exporting font', -'swffontchar::addUTF8Chars' => 'Adds characters to a font for exporting font', -'swfgradient::__construct' => 'Creates a gradient object', -'swfgradient::addEntry' => 'Adds an entry to the gradient list', -'swfmorph::__construct' => 'Creates a new SWFMorph object', -'swfmorph::getShape1' => 'Gets a handle to the starting shape', -'swfmorph::getShape2' => 'Gets a handle to the ending shape', -'swfmovie::__construct' => 'Creates a new movie object, representing an SWF version 4 movie', -'swfmovie::add' => 'Adds any type of data to a movie', -'swfmovie::labelFrame' => 'Labels a frame', -'swfmovie::nextFrame' => 'Moves to the next frame of the animation', -'swfmovie::output' => 'Dumps your lovingly prepared movie out', -'swfmovie::remove' => 'Removes the object instance from the display list', -'swfmovie::save' => 'Saves the SWF movie in a file', -'swfmovie::setbackground' => 'Sets the background color', -'swfmovie::setDimension' => 'Sets the movie\'s width and height', -'swfmovie::setFrames' => 'Sets the total number of frames in the animation', -'swfmovie::setRate' => 'Sets the animation\'s frame rate', -'swfmovie::streamMP3' => 'Streams a MP3 file', -'swfprebuiltclip::__construct' => 'Returns a SWFPrebuiltClip object', -'swfshape::__construct' => 'Creates a new shape object', -'swfshape::addFill' => 'Adds a solid fill to the shape', -'swfshape::drawArc' => 'Draws an arc of radius r centered at the current location, from angle startAngle to angle endAngle measured clockwise from 12 o\'clock', -'swfshape::drawCircle' => 'Draws a circle of radius r centered at the current location, in a counter-clockwise fashion', -'swfshape::drawCubic' => 'Draws a cubic bezier curve using the current position and the three given points as control points', -'swfshape::drawCubicTo' => 'Draws a cubic bezier curve using the current position and the three given points as control points', -'swfshape::drawCurve' => 'Draws a curve (relative)', -'swfshape::drawCurveTo' => 'Draws a curve', -'swfshape::drawGlyph' => 'Draws the first character in the given string into the shape using the glyph definition from the given font', -'swfshape::drawLine' => 'Draws a line (relative)', -'swfshape::drawLineTo' => 'Draws a line', -'swfshape::movePen' => 'Moves the shape\'s pen (relative)', -'swfshape::movePenTo' => 'Moves the shape\'s pen', -'swfshape::setLeftFill' => 'Sets left rasterizing color', -'swfshape::setLine' => 'Sets the shape\'s line style', -'swfshape::setRightFill' => 'Sets right rasterizing color', -'swfsound::__construct' => 'Returns a new SWFSound object from given file', -'swfsprite::__construct' => 'Creates a movie clip (a sprite)', -'swfsprite::add' => 'Adds an object to a sprite', -'swfsprite::labelFrame' => 'Labels frame', -'swfsprite::nextFrame' => 'Moves to the next frame of the animation', -'swfsprite::remove' => 'Removes an object to a sprite', -'swfsprite::setFrames' => 'Sets the total number of frames in the animation', -'swftext::__construct' => 'Creates a new SWFText object', -'swftext::addString' => 'Draws a string', -'swftext::addUTF8String' => 'Writes the given text into this SWFText object at the current pen position, using the current font, height, spacing, and color', -'swftext::getAscent' => 'Returns the ascent of the current font at its current size, or 0 if not available', -'swftext::getDescent' => 'Returns the descent of the current font at its current size, or 0 if not available', -'swftext::getLeading' => 'Returns the leading of the current font at its current size, or 0 if not available', -'swftext::getUTF8Width' => 'Calculates the width of the given string in this text objects current font and size', -'swftext::getWidth' => 'Computes string\'s width', -'swftext::moveTo' => 'Moves the pen', -'swftext::setColor' => 'Sets the current text color', -'swftext::setFont' => 'Sets the current font', -'swftext::setHeight' => 'Sets the current font height', -'swftext::setSpacing' => 'Sets the current font spacing', -'swftextfield::__construct' => 'Creates a text field object', -'swftextfield::addChars' => 'Adds characters to a font that will be available within a textfield', -'swftextfield::addString' => 'Concatenates the given string to the text field', -'swftextfield::align' => 'Sets the text field alignment', -'swftextfield::setBounds' => 'Sets the text field width and height', -'swftextfield::setColor' => 'Sets the color of the text field', -'swftextfield::setFont' => 'Sets the text field font', -'swftextfield::setHeight' => 'Sets the font height of this text field font', -'swftextfield::setIndentation' => 'Sets the indentation of the first line', -'swftextfield::setLeftMargin' => 'Sets the left margin width of the text field', -'swftextfield::setLineSpacing' => 'Sets the line spacing of the text field', -'swftextfield::setMargins' => 'Sets the margins width of the text field', -'swftextfield::setName' => 'Sets the variable name', -'swftextfield::setPadding' => 'Sets the padding of this textfield', -'swftextfield::setRightMargin' => 'Sets the right margin width of the text field', -'swfvideostream::__construct' => 'Returns a SWFVideoStream object', -'swfvideostream::getNumFrames' => 'Returns the number of frames in the video', -'swfvideostream::setDimension' => 'Sets video dimension', -'swish::__construct' => 'Construct a Swish object', -'swish::getMetaList' => 'Get the list of meta entries for the index', -'swish::getPropertyList' => 'Get the list of properties for the index', -'swish::prepare' => 'Prepare a search query', -'swish::query' => 'Execute a query and return results object', -'swishresult::getMetaList' => 'Get a list of meta entries', -'swishresult::stem' => 'Stems the given word', -'swishresults::getParsedWords' => 'Get an array of parsed words', -'swishresults::getRemovedStopwords' => 'Get an array of stopwords removed from the query', -'swishresults::nextResult' => 'Get the next search result', -'swishresults::seekResult' => 'Set current seek pointer to the given position', -'swishsearch::execute' => 'Execute the search and get the results', -'swishsearch::resetLimit' => 'Reset the search limits', -'swishsearch::setLimit' => 'Set the search limits', -'swishsearch::setPhraseDelimiter' => 'Set the phrase delimiter', -'swishsearch::setSort' => 'Set the sort order', -'swishsearch::setStructure' => 'Set the structure flag in the search object', -'swoole\async::dnsLookup' => 'Async and non-blocking hostname to IP lookup.', -'swoole\async::read' => 'Read file stream asynchronously.', -'swoole\async::readFile' => 'Read a file asynchronously.', -'swoole\async::set' => 'Update the async I/O options.', -'swoole\async::write' => 'Write data to a file stream asynchronously.', -'swoole\atomic::__construct' => 'Construct a swoole atomic object.', -'swoole\atomic::add' => 'Add a number to the value to the atomic object.', -'swoole\atomic::cmpset' => 'Compare and set the value of the atomic object.', -'swoole\atomic::get' => 'Get the current value of the atomic object.', -'swoole\atomic::set' => 'Set a new value to the atomic object.', -'swoole\atomic::sub' => 'Subtract a number to the value of the atomic object.', -'swoole\buffer::__construct' => 'Fixed size memory blocks allocation.', -'swoole\buffer::__destruct' => 'Destruct the Swoole memory buffer.', -'swoole\buffer::__toString' => 'Get the string value of the memory buffer.', -'swoole\buffer::append' => 'Append the string or binary data at the end of the memory buffer and return the new size of memory allocated.', -'swoole\buffer::clear' => 'Reset the memory buffer.', -'swoole\buffer::expand' => 'Expand the size of memory buffer.', -'swoole\buffer::read' => 'Read data from the memory buffer based on offset and length.', -'swoole\buffer::recycle' => 'Release the memory to OS which is not used by the memory buffer.', -'swoole\buffer::substr' => 'Read data from the memory buffer based on offset and length. Or remove data from the memory buffer.', -'swoole\buffer::write' => 'Write data to the memory buffer. The memory allocated for the buffer will not be changed.', -'swoole\channel::__construct' => 'Construct a Swoole Channel', -'swoole\channel::__destruct' => 'Destruct a Swoole channel.', -'swoole\channel::pop' => 'Read and pop data from swoole channel.', -'swoole\channel::push' => 'Write and push data into Swoole channel.', -'swoole\channel::stats' => 'Get stats of swoole channel.', -'swoole\client::__construct' => 'Create Swoole sync or async TCP/UDP client, with or without SSL.', -'swoole\client::__destruct' => 'Destruct the Swoole client.', -'swoole\client::close' => 'Close the connection established.', -'swoole\client::connect' => 'Connect to the remote TCP or UDP port.', -'swoole\client::getpeername' => 'Get the remote socket name of the connection.', -'swoole\client::getsockname' => 'Get the local socket name of the connection.', -'swoole\client::isConnected' => 'Check if the connection is established.', -'swoole\client::on' => 'Add callback functions triggered by events.', -'swoole\client::pause' => 'Pause receiving data.', -'swoole\client::pipe' => 'Redirect the data to another file descriptor.', -'swoole\client::recv' => 'Receive data from the remote socket.', -'swoole\client::resume' => 'Resume receiving data.', -'swoole\client::send' => 'Send data to the remote TCP socket.', -'swoole\client::sendfile' => 'Send file to the remote TCP socket.', -'swoole\client::sendto' => 'Send data to the remote UDP address.', -'swoole\client::set' => 'Set the Swoole client parameters before the connection is established.', -'swoole\client::sleep' => 'Remove the TCP client from system event loop.', -'swoole\client::wakeup' => 'Add the TCP client back into the system event loop.', -'swoole\connection\iterator::count' => 'Count connections.', -'swoole\connection\iterator::current' => 'Return current connection entry.', -'swoole\connection\iterator::key' => 'Return key of the current connection.', -'swoole\connection\iterator::next' => 'Move to the next connection.', -'swoole\connection\iterator::offsetExists' => 'Check if offset exists.', -'swoole\connection\iterator::offsetGet' => 'Offset to retrieve.', -'swoole\connection\iterator::offsetSet' => 'Assign a Connection to the specified offset.', -'swoole\connection\iterator::offsetUnset' => 'Unset an offset.', -'swoole\connection\iterator::rewind' => 'Rewinds iterator', -'swoole\connection\iterator::valid' => 'Check if current position is valid.', -'swoole\coroutine::call_user_func' => 'Call a callback given by the first parameter', -'swoole\coroutine::call_user_func_array' => 'Call a callback with an array of parameters', -'swoole\event::add' => 'Add new callback functions of a socket into the EventLoop.', -'swoole\event::defer' => 'Add a callback function to the next event loop.', -'swoole\event::del' => 'Remove all event callback functions of a socket.', -'swoole\event::exit' => 'Exit the eventloop, only available at client side.', -'swoole\event::set' => 'Update the event callback functions of a socket.', -'swoole\event::write' => 'Write data to the socket.', -'swoole\http\client::__construct' => 'Construct the async HTTP client.', -'swoole\http\client::__destruct' => 'Destruct the HTTP client.', -'swoole\http\client::addFile' => 'Add a file to the post form.', -'swoole\http\client::close' => 'Close the http connection.', -'swoole\http\client::download' => 'Download a file from the remote server.', -'swoole\http\client::execute' => 'Send the HTTP request after setting the parameters.', -'swoole\http\client::get' => 'Send GET http request to the remote server.', -'swoole\http\client::isConnected' => 'Check if the HTTP connection is connected.', -'swoole\http\client::on' => 'Register callback function by event name.', -'swoole\http\client::post' => 'Send POST http request to the remote server.', -'swoole\http\client::push' => 'Push data to websocket client.', -'swoole\http\client::set' => 'Update the HTTP client parameters.', -'swoole\http\client::setCookies' => 'Set the http request cookies.', -'swoole\http\client::setData' => 'Set the HTTP request body data.', -'swoole\http\client::setHeaders' => 'Set the HTTP request headers.', -'swoole\http\client::setMethod' => 'Set the HTTP request method.', -'swoole\http\client::upgrade' => 'Upgrade to websocket protocol.', -'swoole\http\request::__destruct' => 'Destruct the HTTP request.', -'swoole\http\request::rawcontent' => 'Get the raw HTTP POST body.', -'swoole\http\response::__destruct' => 'Destruct the HTTP response.', -'swoole\http\response::cookie' => 'Set the cookies of the HTTP response.', -'swoole\http\response::end' => 'Send data for the HTTP request and finish the response.', -'swoole\http\response::gzip' => 'Enable the gzip of response content.', -'swoole\http\response::header' => 'Set the HTTP response headers.', -'swoole\http\response::initHeader' => 'Init the HTTP response header.', -'swoole\http\response::rawcookie' => 'Set the raw cookies to the HTTP response.', -'swoole\http\response::sendfile' => 'Send file through the HTTP response.', -'swoole\http\response::status' => 'Set the status code of the HTTP response.', -'swoole\http\response::write' => 'Append HTTP body content to the HTTP response.', -'swoole\http\server::on' => 'Bind callback function to HTTP server by event name.', -'swoole\http\server::start' => 'Start the swoole http server.', -'swoole\lock::__construct' => 'Construct a memory lock.', -'swoole\lock::__destruct' => 'Destroy a Swoole memory lock.', -'swoole\lock::lock' => 'Try to acquire the lock. It will block if the lock is not available.', -'swoole\lock::lock_read' => 'Lock a read-write lock for reading.', -'swoole\lock::trylock' => 'Try to acquire the lock and return straight away even the lock is not available.', -'swoole\lock::trylock_read' => 'Try to lock a read-write lock for reading and return straight away even the lock is not available.', -'swoole\lock::unlock' => 'Release the lock.', -'swoole\mmap::open' => 'Map a file into memory and return the stream resource which can be used by PHP stream operations.', -'swoole\mysql::__construct' => 'Construct an async MySQL client.', -'swoole\mysql::__destruct' => 'Destroy the async MySQL client.', -'swoole\mysql::close' => 'Close the async MySQL connection.', -'swoole\mysql::connect' => 'Connect to the remote MySQL server.', -'swoole\mysql::on' => 'Register callback function based on event name.', -'swoole\mysql::query' => 'Run the SQL query.', -'swoole\process::__construct' => 'Construct a process.', -'swoole\process::__destruct' => 'Destroy the process.', -'swoole\process::alarm' => 'High precision timer which triggers signal with fixed interval.', -'swoole\process::close' => 'Close the pipe to the child process.', -'swoole\process::daemon' => 'Change the process to be a daemon process.', -'swoole\process::exec' => 'Execute system commands.', -'swoole\process::exit' => 'Stop the child processes.', -'swoole\process::freeQueue' => 'Destroy the message queue created by swoole_process::useQueue.', -'swoole\process::kill' => 'Send signal to the child process.', -'swoole\process::name' => 'Set name of the process.', -'swoole\process::pop' => 'Read and pop data from the message queue.', -'swoole\process::push' => 'Write and push data into the message queue.', -'swoole\process::read' => 'Read data sending to the process.', -'swoole\process::signal' => 'Send signal to the child processes.', -'swoole\process::start' => 'Start the process.', -'swoole\process::statQueue' => 'Get the stats of the message queue used as the communication method between processes.', -'swoole\process::useQueue' => 'Create a message queue as the communication method between the parent process and child processes.', -'swoole\process::wait' => 'Wait for the events of child processes.', -'swoole\process::write' => 'Write data into the pipe and communicate with the parent process or child processes.', -'swoole\serialize::pack' => 'Serialize the data.', -'swoole\serialize::unpack' => 'Unserialize the data.', -'swoole\server::__construct' => 'Construct a Swoole server.', -'swoole\server::addlistener' => 'Add a new listener to the server.', -'swoole\server::addProcess' => 'Add a user defined swoole_process to the server.', -'swoole\server::after' => 'Trigger a callback function after a period of time.', -'swoole\server::bind' => 'Bind the connection to a user defined user ID.', -'swoole\server::clearTimer' => 'Stop and destroy a timer.', -'swoole\server::close' => 'Close a connection to the client.', -'swoole\server::confirm' => 'Check status of the connection.', -'swoole\server::connection_info' => 'Get the connection info by file description.', -'swoole\server::connection_list' => 'Get all of the established connections.', -'swoole\server::defer' => 'Delay execution of the callback function at the end of current EventLoop.', -'swoole\server::exist' => 'Check if the connection is existed.', -'swoole\server::finish' => 'Used in task process for sending result to the worker process when the task is finished.', -'swoole\server::getClientInfo' => 'Get the connection info by file description.', -'swoole\server::getClientList' => 'Get all of the established connections.', -'swoole\server::getLastError' => 'Get the error code of the most recent error.', -'swoole\server::heartbeat' => 'Check all the connections on the server.', -'swoole\server::listen' => 'Listen on the given IP and port, socket type.', -'swoole\server::on' => 'Register a callback function by event name.', -'swoole\server::pause' => 'Stop receiving data from the connection.', -'swoole\server::protect' => 'Set the connection to be protected mode.', -'swoole\server::reload' => 'Restart all the worker process.', -'swoole\server::resume' => 'Start receiving data from the connection.', -'swoole\server::send' => 'Send data to the client.', -'swoole\server::sendfile' => 'Send file to the connection.', -'swoole\server::sendMessage' => 'Send message to worker processes by ID.', -'swoole\server::sendto' => 'Send data to the remote UDP address.', -'swoole\server::sendwait' => 'Send data to the remote socket in the blocking way.', -'swoole\server::set' => 'Set the runtime settings of the swoole server.', -'swoole\server::shutdown' => 'Shutdown the master server process, this function can be called in worker processes.', -'swoole\server::start' => 'Start the Swoole server.', -'swoole\server::stats' => 'Get the stats of the Swoole server.', -'swoole\server::stop' => 'Stop the Swoole server.', -'swoole\server::task' => 'Send data to the task worker processes.', -'swoole\server::taskwait' => 'Send data to the task worker processes in blocking way.', -'swoole\server::taskWaitMulti' => 'Execute multiple tasks concurrently.', -'swoole\server::tick' => 'Repeats a given function at every given time-interval.', -'swoole\server\port::__construct' => 'Construct a server port', -'swoole\server\port::__destruct' => 'Destroy server port', -'swoole\server\port::on' => 'Register callback functions by event.', -'swoole\server\port::set' => 'Set protocol of the server port.', -'swoole\table::__construct' => 'Construct a Swoole memory table with fixed size.', -'swoole\table::column' => 'Set the data type and size of the columns.', -'swoole\table::count' => 'Count the rows in the table, or count all the elements in the table if $mode = 1.', -'swoole\table::create' => 'Create the swoole memory table.', -'swoole\table::current' => 'Get the current row.', -'swoole\table::decr' => 'Decrement the value in the Swoole table by $row_key and $column_key.', -'swoole\table::del' => 'Delete a row in the Swoole table by $row_key.', -'swoole\table::destroy' => 'Destroy the Swoole table.', -'swoole\table::exist' => 'Check if a row is existed by $row_key.', -'swoole\table::get' => 'Get the value in the Swoole table by $row_key and $column_key.', -'swoole\table::incr' => 'Increment the value by $row_key and $column_key.', -'swoole\table::key' => 'Get the key of current row.', -'swoole\table::next' => 'Iterator the next row.', -'swoole\table::rewind' => 'Rewind the iterator.', -'swoole\table::set' => 'Update a row of the table by $row_key.', -'swoole\table::valid' => 'Check current if the current row is valid.', -'swoole\timer::after' => 'Trigger a callback function after a period of time.', -'swoole\timer::clear' => 'Delete a timer by timer ID.', -'swoole\timer::exists' => 'Check if a timer is existed.', -'swoole\timer::tick' => 'Repeats a given function at every given time-interval.', -'swoole\websocket\server::exist' => 'Check if the the file description is existed.', -'swoole\websocket\server::on' => 'Register event callback function', -'swoole\websocket\server::pack' => 'Get a pack of binary data to send in a single frame.', -'swoole\websocket\server::push' => 'Push data to the remote client.', -'swoole\websocket\server::unpack' => 'Unpack the binary data received from the client.', -'swoole_async_dns_lookup' => 'Async and non-blocking hostname to IP lookup', -'swoole_async_read' => 'Read file stream asynchronously', -'swoole_async_readfile' => 'Read a file asynchronously', -'swoole_async_set' => 'Update the async I/O options', -'swoole_async_write' => 'Write data to a file stream asynchronously', -'swoole_async_writefile' => 'Write data to a file asynchronously', -'swoole_client_select' => 'Get the file description which are ready to read/write or error', -'swoole_cpu_num' => 'Get the number of CPU', -'swoole_errno' => 'Get the error code of the latest system call', -'swoole_event_add' => 'Add new callback functions of a socket into the EventLoop', -'swoole_event_defer' => 'Add callback function to the next event loop', -'swoole_event_del' => 'Remove all event callback functions of a socket', -'swoole_event_exit' => 'Exit the eventloop, only available at the client side', -'swoole_event_set' => 'Update the event callback functions of a socket', -'swoole_event_wait' => 'Start the event loop', -'swoole_event_write' => 'Write data to a socket', -'swoole_get_local_ip' => 'Get the IPv4 IP addresses of each NIC on the machine', -'swoole_last_error' => 'Get the latest error message', -'swoole_load_module' => 'Load a swoole extension', -'swoole_select' => 'Select the file descriptions which are ready to read/write or error in the eventloop', -'swoole_set_process_name' => 'Set the process name', -'swoole_strerror' => 'Convert the Errno into error messages', -'swoole_timer_after' => 'Trigger a one time callback function in the future', -'swoole_timer_exists' => 'Check if a timer callback function is existed', -'swoole_timer_tick' => 'Trigger a timer tick callback function by time interval', -'swoole_version' => 'Get the version of Swoole', -'sybase_affected_rows' => 'Gets number of affected rows in last query', -'sybase_close' => 'Closes a Sybase connection', -'sybase_connect' => 'Opens a Sybase server connection', -'sybase_data_seek' => 'Moves internal row pointer', -'sybase_deadlock_retry_count' => 'Sets the deadlock retry count', -'sybase_fetch_array' => 'Fetch row as array', -'sybase_fetch_assoc' => 'Fetch a result row as an associative array', -'sybase_fetch_field' => 'Get field information from a result', -'sybase_fetch_object' => 'Fetch a row as an object', -'sybase_fetch_row' => 'Get a result row as an enumerated array', -'sybase_field_seek' => 'Sets field offset', -'sybase_free_result' => 'Frees result memory', -'sybase_get_last_message' => 'Returns the last message from the server', -'sybase_min_client_severity' => 'Sets minimum client severity', -'sybase_min_error_severity' => 'Sets minimum error severity', -'sybase_min_message_severity' => 'Sets minimum message severity', -'sybase_min_server_severity' => 'Sets minimum server severity', -'sybase_num_fields' => 'Gets the number of fields in a result set', -'sybase_num_rows' => 'Get number of rows in a result set', -'sybase_pconnect' => 'Open persistent Sybase connection', -'sybase_query' => 'Sends a Sybase query', -'sybase_result' => 'Get result data', -'sybase_select_db' => 'Selects a Sybase database', -'sybase_set_message_handler' => 'Sets the handler called when a server message is raised', -'sybase_unbuffered_query' => 'Send a Sybase query and do not block', -'symbolObj::__construct' => 'Creates a new symbol with default values in the symbolist. -.. note:: -Using the new constructor, the symbol is automatically returned. The -If a symbol with the same name exists, it (or its id) will be returned. -$nId = ms_newSymbolObj($map, "symbol-test"); -$oSymbol = $map->getSymbolObjectById($nId);', -'symbolObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the -resources.', -'symbolObj::getPatternArray' => 'Returns an array containing the pattern. If there is no pattern, it -returns an empty array.', -'symbolObj::getPointsArray' => 'Returns an array containing the points of the symbol. Refer to -setpoints to see how the array should be interpreted. If there are no -points, it returns an empty array.', -'symbolObj::ms_newSymbolObj' => 'Old style constructor', -'symbolObj::set' => 'Set object property to a new value.', -'symbolObj::setImagePath' => 'Loads a pixmap symbol specified by the filename. -The file should be of either Gif or Png format.', -'symbolObj::setPattern' => 'Set the pattern of the symbol (used for dash patterns). -Returns MS_SUCCESS/MS_FAILURE.', -'symbolObj::setPoints' => 'Set the points of the symbol. Note that the values passed is an -array containing the x and y values of the points. Returns -MS_SUCCESS/MS_FAILURE. -Example: -.. code-block:: php -$array[0] = 1 # x value of the first point -$array[1] = 0 # y values of the first point -$array[2] = 1 # x value of the 2nd point -....', -'symlink' => 'Creates a symbolic link', -'syncevent::__construct' => 'Constructs a new SyncEvent object', -'syncevent::fire' => 'Fires/sets the event', -'syncevent::reset' => 'Resets a manual event', -'syncevent::wait' => 'Waits for the event to be fired/set', -'syncmutex::__construct' => 'Constructs a new SyncMutex object', -'syncmutex::lock' => 'Waits for an exclusive lock', -'syncmutex::unlock' => 'Unlocks the mutex', -'syncreaderwriter::__construct' => 'Constructs a new SyncReaderWriter object', -'syncreaderwriter::readlock' => 'Waits for a read lock', -'syncreaderwriter::readunlock' => 'Releases a read lock', -'syncreaderwriter::writelock' => 'Waits for an exclusive write lock', -'syncreaderwriter::writeunlock' => 'Releases a write lock', -'syncsemaphore::__construct' => 'Constructs a new SyncSemaphore object', -'syncsemaphore::lock' => 'Decreases the count of the semaphore or waits', -'syncsemaphore::unlock' => 'Increases the count of the semaphore', -'syncsharedmemory::__construct' => 'Constructs a new SyncSharedMemory object', -'syncsharedmemory::first' => 'Check to see if the object is the first instance system-wide of named shared memory', -'syncsharedmemory::read' => 'Copy data from named shared memory', -'syncsharedmemory::size' => 'Returns the size of the named shared memory', -'syncsharedmemory::write' => 'Copy data to named shared memory', -'sys_get_temp_dir' => 'Returns directory path used for temporary files', -'sys_getloadavg' => 'Gets system load average', -'syslog' => 'Generate a system log message', -'system' => 'Execute an external program and display the output', -'taint' => 'Taint a string', -'tan' => 'Tangent', -'tanh' => 'Hyperbolic tangent', -'tcpwrap_check' => 'Performs a tcpwrap check', -'tempnam' => 'Create file with unique file name', -'textdomain' => 'Sets the default domain', -'Thread::addRef' => 'Increments the internal number of references to a Threaded object', -'Thread::chunk' => 'Fetches a chunk of the objects property table of the given size, -optionally preserving keys', -'Thread::count' => 'Returns the number of properties for this object', -'Thread::delRef' => 'Decrements the internal number of references to a Threaded object', -'thread::detach' => 'Execution', -'Thread::extend' => 'Makes thread safe standard class at runtime', -'thread::getCreatorId' => 'Identification', -'thread::getCurrentThread' => 'Identification', -'thread::getCurrentThreadId' => 'Identification', -'Thread::getRefCount' => 'Retrieves the internal number of references to a Threaded object', -'Thread::getTerminationInfo' => 'Retrieves terminal error information from the referenced object', -'thread::getThreadId' => 'Identification', -'thread::globally' => 'Execution', -'thread::isJoined' => 'State Detection', -'Thread::isRunning' => 'Tell if the referenced object is executing', -'thread::isStarted' => 'State Detection', -'Thread::isTerminated' => 'Tell if the referenced object was terminated during execution; suffered -fatal errors, or threw uncaught exceptions', -'Thread::isWaiting' => 'Tell if the referenced object is waiting for notification', -'thread::join' => 'Synchronization', -'thread::kill' => 'Execution', -'Thread::lock' => 'Lock the referenced objects property table', -'Thread::merge' => 'Merges data into the current object', -'Thread::notify' => 'Send notification to the referenced object', -'Thread::notifyOne' => 'Send notification to the referenced object. This unblocks at least one -of the blocked threads (as opposed to unblocking all of them, as seen with -Threaded::notify()).', -'Thread::offsetExists' => 'Whether a offset exists', -'Thread::offsetGet' => 'Offset to retrieve', -'Thread::offsetSet' => 'Offset to set', -'Thread::offsetUnset' => 'Offset to unset', -'Thread::pop' => 'Pops an item from the objects property table', -'Thread::run' => 'The programmer should always implement the run method for objects -that are intended for execution.', -'Thread::shift' => 'Shifts an item from the objects property table', -'thread::start' => 'Execution', -'Thread::synchronized' => 'Executes the block while retaining the referenced objects -synchronization lock for the calling context', -'Thread::unlock' => 'Unlock the referenced objects storage for the calling context', -'Thread::wait' => 'Will cause the calling context to wait for notification from the -referenced object', -'Threaded::addRef' => 'Increments the internal number of references to a Threaded object', -'threaded::chunk' => 'Manipulation', -'threaded::count' => 'Manipulation', -'Threaded::delRef' => 'Decrements the internal number of references to a Threaded object', -'threaded::extend' => 'Runtime Manipulation', -'threaded::from' => 'Creation', -'Threaded::getRefCount' => 'Retrieves the internal number of references to a Threaded object', -'threaded::getTerminationInfo' => 'Error Detection', -'threaded::isRunning' => 'State Detection', -'threaded::isTerminated' => 'State Detection', -'threaded::isWaiting' => 'State Detection', -'threaded::lock' => 'Synchronization', -'threaded::merge' => 'Manipulation', -'threaded::notify' => 'Synchronization', -'threaded::notifyOne' => 'Synchronization', -'threaded::pop' => 'Manipulation', -'threaded::run' => 'Execution', -'threaded::shift' => 'Manipulation', -'threaded::synchronized' => 'Synchronization', -'threaded::unlock' => 'Synchronization', -'threaded::wait' => 'Synchronization', -'Throwable::__toString' => 'Gets a string representation of the thrown object', -'Throwable::getCode' => 'Gets the exception code', -'Throwable::getFile' => 'Gets the file in which the exception occurred', -'Throwable::getLine' => 'Gets the line on which the object was instantiated', -'Throwable::getMessage' => 'Gets the message', -'Throwable::getPrevious' => 'Returns the previous Throwable', -'Throwable::getTrace' => 'Gets the stack trace', -'Throwable::getTraceAsString' => 'Gets the stack trace as a string', -'tidy::__construct' => 'Constructs a new tidy object', -'tidy::body' => 'Returns a tidyNode object starting from the <body> tag of the tidy parse tree', -'tidy::cleanRepair' => 'Execute configured cleanup and repair operations on parsed markup', -'tidy::diagnose' => 'Run configured diagnostics on parsed and repaired markup', -'tidy::getConfig' => 'Get current Tidy configuration', -'tidy::getHtmlVer' => 'Get the Detected HTML version for the specified document', -'tidy::getOpt' => 'Returns the value of the specified configuration option for the tidy document', -'tidy::getOptDoc' => 'Returns the documentation for the given option name', -'tidy::getRelease' => 'Get release date (version) for Tidy library', -'tidy::getStatus' => 'Get status of specified document', -'tidy::head' => 'Returns a tidyNode object starting from the <head> tag of the tidy parse tree', -'tidy::html' => 'Returns a tidyNode object starting from the <html> tag of the tidy parse tree', -'tidy::isXhtml' => 'Indicates if the document is a XHTML document', -'tidy::isXml' => 'Indicates if the document is a generic (non HTML/XHTML) XML document', -'tidy::parseFile' => 'Parse markup in file or URI', -'tidy::parseString' => 'Parse a document stored in a string', -'tidy::repairFile' => 'Repair a file and return it as a string', -'tidy::repairString' => 'Repair a string using an optionally provided configuration file', -'tidy::root' => 'Returns a tidyNode object representing the root of the tidy parse tree', -'tidy_access_count' => 'Returns the Number of Tidy accessibility warnings encountered for specified document', -'tidy_config_count' => 'Returns the Number of Tidy configuration errors encountered for specified document', -'tidy_error_count' => 'Returns the Number of Tidy errors encountered for specified document', -'tidy_get_output' => 'Return a string representing the parsed tidy markup', -'tidy_warning_count' => 'Returns the Number of Tidy warnings encountered for specified document', -'tidynode::__construct' => 'Private constructor to disallow direct instantiation', -'tidynode::getParent' => 'Returns the parent node of the current node', -'tidynode::hasChildren' => 'Checks if a node has children', -'tidynode::hasSiblings' => 'Checks if a node has siblings', -'tidynode::isAsp' => 'Checks if this node is ASP', -'tidynode::isComment' => 'Checks if a node represents a comment', -'tidynode::isHtml' => 'Checks if a node is part of a HTML document', -'tidynode::isJste' => 'Checks if this node is JSTE', -'tidynode::isPhp' => 'Checks if a node is PHP', -'tidynode::isText' => 'Checks if a node represents text (no markup)', -'time' => 'Return current Unix timestamp', -'time_nanosleep' => 'Delay for a number of seconds and nanoseconds', -'time_sleep_until' => 'Make the script sleep until the specified time', -'timezone_abbreviations_list' => 'Alias of DateTimeZone::listAbbreviations', -'timezone_identifiers_list' => 'Alias of DateTimeZone::listIdentifiers', -'timezone_location_get' => 'Alias of DateTimeZone::getLocation', -'timezone_name_from_abbr' => 'Returns the timezone name from abbreviation', -'timezone_name_get' => 'Alias of DateTimeZone::getName', -'timezone_offset_get' => 'Alias of DateTimeZone::getOffset', -'timezone_open' => 'Alias of DateTimeZone::__construct', -'timezone_transitions_get' => 'Alias of DateTimeZone::getTransitions', -'timezone_version_get' => 'Gets the version of the timezonedb', -'tmpfile' => 'Creates a temporary file', -'token_get_all' => 'Split given source into PHP tokens', -'token_name' => 'Get the symbolic name of a given PHP token', -'tokyotyrant::__construct' => 'Construct a new TokyoTyrant object', -'tokyotyrant::add' => 'Adds to a numeric key', -'tokyotyrant::connect' => 'Connect to a database', -'tokyotyrant::connectUri' => 'Connects to a database', -'tokyotyrant::copy' => 'Copies the database', -'tokyotyrant::ext' => 'Execute a remote script', -'tokyotyrant::fwmKeys' => 'Returns the forward matching keys', -'tokyotyrant::get' => 'The get purpose', -'tokyotyrant::getIterator' => 'Get an iterator', -'tokyotyrant::num' => 'Number of records in the database', -'tokyotyrant::out' => 'Removes records', -'tokyotyrant::put' => 'Puts values', -'tokyotyrant::putCat' => 'Concatenates to a record', -'tokyotyrant::putKeep' => 'Puts a record', -'tokyotyrant::putNr' => 'Puts value', -'tokyotyrant::putShl' => 'Concatenates to a record', -'tokyotyrant::restore' => 'Restore the database', -'tokyotyrant::setMaster' => 'Set the replication master', -'tokyotyrant::size' => 'Returns the size of the value', -'tokyotyrant::stat' => 'Get statistics', -'tokyotyrant::sync' => 'Synchronize the database', -'tokyotyrant::tune' => 'Tunes connection values', -'tokyotyrant::vanish' => 'Empties the database', -'tokyotyrantiterator::__construct' => 'Construct an iterator', -'tokyotyrantiterator::current' => 'Get the current value', -'tokyotyrantiterator::key' => 'Returns the current key', -'tokyotyrantiterator::next' => 'Move to next key', -'tokyotyrantiterator::rewind' => 'Rewinds the iterator', -'tokyotyrantiterator::valid' => 'Rewinds the iterator', -'tokyotyrantquery::__construct' => 'Construct a new query', -'tokyotyrantquery::addCond' => 'Adds a condition to the query', -'tokyotyrantquery::count' => 'Counts records', -'tokyotyrantquery::current' => 'Returns the current element', -'tokyotyrantquery::hint' => 'Get the hint string of the query', -'tokyotyrantquery::key' => 'Returns the current key', -'tokyotyrantquery::metaSearch' => 'Retrieve records with multiple queries', -'tokyotyrantquery::next' => 'Moves the iterator to next entry', -'tokyotyrantquery::out' => 'Removes records based on query', -'tokyotyrantquery::rewind' => 'Rewinds the iterator', -'tokyotyrantquery::search' => 'Searches records', -'tokyotyrantquery::setLimit' => 'Limit results', -'tokyotyrantquery::setOrder' => 'Orders results', -'tokyotyrantquery::valid' => 'Checks the validity of current item', -'tokyotyranttable::add' => 'Adds a record', -'tokyotyranttable::genUid' => 'Generate unique id', -'tokyotyranttable::get' => 'Get a row', -'tokyotyranttable::getIterator' => 'Get an iterator', -'tokyotyranttable::getQuery' => 'Get a query object', -'tokyotyranttable::out' => 'Remove records', -'tokyotyranttable::put' => 'Store a row', -'tokyotyranttable::putCat' => 'Concatenates to a row', -'tokyotyranttable::putKeep' => 'Put a new record', -'tokyotyranttable::putNr' => 'Puts value', -'tokyotyranttable::putShl' => 'Concatenates to a record', -'tokyotyranttable::setIndex' => 'Sets index', -'touch' => 'Sets access and modification time of file', -'trader_acos' => 'Vector Trigonometric ACos', -'trader_ad' => 'Chaikin A/D Line', -'trader_add' => 'Vector Arithmetic Add', -'trader_adosc' => 'Chaikin A/D Oscillator', -'trader_adx' => 'Average Directional Movement Index', -'trader_adxr' => 'Average Directional Movement Index Rating', -'trader_apo' => 'Absolute Price Oscillator', -'trader_aroon' => 'Aroon', -'trader_aroonosc' => 'Aroon Oscillator', -'trader_asin' => 'Vector Trigonometric ASin', -'trader_atan' => 'Vector Trigonometric ATan', -'trader_atr' => 'Average True Range', -'trader_avgprice' => 'Average Price', -'trader_bbands' => 'Bollinger Bands', -'trader_beta' => 'Beta', -'trader_bop' => 'Balance Of Power', -'trader_cci' => 'Commodity Channel Index', -'trader_cdl2crows' => 'Two Crows', -'trader_cdl3blackcrows' => 'Three Black Crows', -'trader_cdl3inside' => 'Three Inside Up/Down', -'trader_cdl3linestrike' => 'Three-Line Strike', -'trader_cdl3outside' => 'Three Outside Up/Down', -'trader_cdl3starsinsouth' => 'Three Stars In The South', -'trader_cdl3whitesoldiers' => 'Three Advancing White Soldiers', -'trader_cdlabandonedbaby' => 'Abandoned Baby', -'trader_cdladvanceblock' => 'Advance Block', -'trader_cdlbelthold' => 'Belt-hold', -'trader_cdlbreakaway' => 'Breakaway', -'trader_cdlclosingmarubozu' => 'Closing Marubozu', -'trader_cdlconcealbabyswall' => 'Concealing Baby Swallow', -'trader_cdlcounterattack' => 'Counterattack', -'trader_cdldarkcloudcover' => 'Dark Cloud Cover', -'trader_cdldoji' => 'Doji', -'trader_cdldojistar' => 'Doji Star', -'trader_cdldragonflydoji' => 'Dragonfly Doji', -'trader_cdlengulfing' => 'Engulfing Pattern', -'trader_cdleveningdojistar' => 'Evening Doji Star', -'trader_cdleveningstar' => 'Evening Star', -'trader_cdlgapsidesidewhite' => 'Up/Down-gap side-by-side white lines', -'trader_cdlgravestonedoji' => 'Gravestone Doji', -'trader_cdlhammer' => 'Hammer', -'trader_cdlhangingman' => 'Hanging Man', -'trader_cdlharami' => 'Harami Pattern', -'trader_cdlharamicross' => 'Harami Cross Pattern', -'trader_cdlhighwave' => 'High-Wave Candle', -'trader_cdlhikkake' => 'Hikkake Pattern', -'trader_cdlhikkakemod' => 'Modified Hikkake Pattern', -'trader_cdlhomingpigeon' => 'Homing Pigeon', -'trader_cdlidentical3crows' => 'Identical Three Crows', -'trader_cdlinneck' => 'In-Neck Pattern', -'trader_cdlinvertedhammer' => 'Inverted Hammer', -'trader_cdlkicking' => 'Kicking', -'trader_cdlkickingbylength' => 'Kicking - bull/bear determined by the longer marubozu', -'trader_cdlladderbottom' => 'Ladder Bottom', -'trader_cdllongleggeddoji' => 'Long Legged Doji', -'trader_cdllongline' => 'Long Line Candle', -'trader_cdlmarubozu' => 'Marubozu', -'trader_cdlmatchinglow' => 'Matching Low', -'trader_cdlmathold' => 'Mat Hold', -'trader_cdlmorningdojistar' => 'Morning Doji Star', -'trader_cdlmorningstar' => 'Morning Star', -'trader_cdlonneck' => 'On-Neck Pattern', -'trader_cdlpiercing' => 'Piercing Pattern', -'trader_cdlrickshawman' => 'Rickshaw Man', -'trader_cdlrisefall3methods' => 'Rising/Falling Three Methods', -'trader_cdlseparatinglines' => 'Separating Lines', -'trader_cdlshootingstar' => 'Shooting Star', -'trader_cdlshortline' => 'Short Line Candle', -'trader_cdlspinningtop' => 'Spinning Top', -'trader_cdlstalledpattern' => 'Stalled Pattern', -'trader_cdlsticksandwich' => 'Stick Sandwich', -'trader_cdltakuri' => 'Takuri (Dragonfly Doji with very long lower shadow)', -'trader_cdltasukigap' => 'Tasuki Gap', -'trader_cdlthrusting' => 'Thrusting Pattern', -'trader_cdltristar' => 'Tristar Pattern', -'trader_cdlunique3river' => 'Unique 3 River', -'trader_cdlupsidegap2crows' => 'Upside Gap Two Crows', -'trader_cdlxsidegap3methods' => 'Upside/Downside Gap Three Methods', -'trader_ceil' => 'Vector Ceil', -'trader_cmo' => 'Chande Momentum Oscillator', -'trader_correl' => 'Pearson\'s Correlation Coefficient (r)', -'trader_cos' => 'Vector Trigonometric Cos', -'trader_cosh' => 'Vector Trigonometric Cosh', -'trader_dema' => 'Double Exponential Moving Average', -'trader_div' => 'Vector Arithmetic Div', -'trader_dx' => 'Directional Movement Index', -'trader_ema' => 'Exponential Moving Average', -'trader_errno' => 'Get error code', -'trader_exp' => 'Vector Arithmetic Exp', -'trader_floor' => 'Vector Floor', -'trader_get_compat' => 'Get compatibility mode', -'trader_get_unstable_period' => 'Get unstable period', -'trader_ht_dcperiod' => 'Hilbert Transform - Dominant Cycle Period', -'trader_ht_dcphase' => 'Hilbert Transform - Dominant Cycle Phase', -'trader_ht_phasor' => 'Hilbert Transform - Phasor Components', -'trader_ht_sine' => 'Hilbert Transform - SineWave', -'trader_ht_trendline' => 'Hilbert Transform - Instantaneous Trendline', -'trader_ht_trendmode' => 'Hilbert Transform - Trend vs Cycle Mode', -'trader_kama' => 'Kaufman Adaptive Moving Average', -'trader_linearreg' => 'Linear Regression', -'trader_linearreg_angle' => 'Linear Regression Angle', -'trader_linearreg_intercept' => 'Linear Regression Intercept', -'trader_linearreg_slope' => 'Linear Regression Slope', -'trader_ln' => 'Vector Log Natural', -'trader_log10' => 'Vector Log10', -'trader_ma' => 'Moving average', -'trader_macd' => 'Moving Average Convergence/Divergence', -'trader_macdext' => 'MACD with controllable MA type', -'trader_macdfix' => 'Moving Average Convergence/Divergence Fix 12/26', -'trader_mama' => 'MESA Adaptive Moving Average', -'trader_mavp' => 'Moving average with variable period', -'trader_max' => 'Highest value over a specified period', -'trader_maxindex' => 'Index of highest value over a specified period', -'trader_medprice' => 'Median Price', -'trader_mfi' => 'Money Flow Index', -'trader_midpoint' => 'MidPoint over period', -'trader_midprice' => 'Midpoint Price over period', -'trader_min' => 'Lowest value over a specified period', -'trader_minindex' => 'Index of lowest value over a specified period', -'trader_minmax' => 'Lowest and highest values over a specified period', -'trader_minmaxindex' => 'Indexes of lowest and highest values over a specified period', -'trader_minus_di' => 'Minus Directional Indicator', -'trader_minus_dm' => 'Minus Directional Movement', -'trader_mom' => 'Momentum', -'trader_mult' => 'Vector Arithmetic Mult', -'trader_natr' => 'Normalized Average True Range', -'trader_obv' => 'On Balance Volume', -'trader_plus_di' => 'Plus Directional Indicator', -'trader_plus_dm' => 'Plus Directional Movement', -'trader_ppo' => 'Percentage Price Oscillator', -'trader_roc' => 'Rate of change : ((price/prevPrice)-1)*100', -'trader_rocp' => 'Rate of change Percentage: (price-prevPrice)/prevPrice', -'trader_rocr' => 'Rate of change ratio: (price/prevPrice)', -'trader_rocr100' => 'Rate of change ratio 100 scale: (price/prevPrice)*100', -'trader_rsi' => 'Relative Strength Index', -'trader_sar' => 'Parabolic SAR', -'trader_sarext' => 'Parabolic SAR - Extended', -'trader_set_compat' => 'Set compatibility mode', -'trader_set_unstable_period' => 'Set unstable period', -'trader_sin' => 'Vector Trigonometric Sin', -'trader_sinh' => 'Vector Trigonometric Sinh', -'trader_sma' => 'Simple Moving Average', -'trader_sqrt' => 'Vector Square Root', -'trader_stddev' => 'Standard Deviation', -'trader_stoch' => 'Stochastic', -'trader_stochf' => 'Stochastic Fast', -'trader_stochrsi' => 'Stochastic Relative Strength Index', -'trader_sub' => 'Vector Arithmetic Subtraction', -'trader_sum' => 'Summation', -'trader_t3' => 'Triple Exponential Moving Average (T3)', -'trader_tan' => 'Vector Trigonometric Tan', -'trader_tanh' => 'Vector Trigonometric Tanh', -'trader_tema' => 'Triple Exponential Moving Average', -'trader_trange' => 'True Range', -'trader_trima' => 'Triangular Moving Average', -'trader_trix' => '1-day Rate-Of-Change (ROC) of a Triple Smooth EMA', -'trader_tsf' => 'Time Series Forecast', -'trader_typprice' => 'Typical Price', -'trader_ultosc' => 'Ultimate Oscillator', -'trader_var' => 'Variance', -'trader_wclprice' => 'Weighted Close Price', -'trader_willr' => 'Williams\' %R', -'trader_wma' => 'Weighted Moving Average', -'trait_exists' => 'Checks if the trait exists', -'transliterator::__construct' => 'Private constructor to deny instantiation', -'transliterator::create' => 'Create a transliterator', -'transliterator::createFromRules' => 'Create transliterator from rules', -'transliterator::createInverse' => 'Create an inverse transliterator', -'transliterator::getErrorCode' => 'Get last error code', -'transliterator::getErrorMessage' => 'Get last error message', -'transliterator::listIDs' => 'Get transliterator IDs', -'transliterator::transliterate' => 'Transliterate a string', -'trigger_error' => 'Generates a user-level error/warning/notice message', -'trim' => 'Strip whitespace (or other characters) from the beginning and end of a string', -'uasort' => 'Sort an array with a user-defined comparison function and maintain index association', -'ucfirst' => 'Make a string\'s first character uppercase', -'uconverter::__construct' => 'Create UConverter object', -'uconverter::convert' => 'Convert string from one charset to another', -'uconverter::fromUCallback' => 'Default "from" callback function', -'uconverter::getAliases' => 'Get the aliases of the given name', -'uconverter::getAvailable' => 'Get the available canonical converter names', -'uconverter::getDestinationEncoding' => 'Get the destination encoding', -'uconverter::getDestinationType' => 'Get the destination converter type', -'uconverter::getErrorCode' => 'Get last error code on the object', -'uconverter::getErrorMessage' => 'Get last error message on the object', -'uconverter::getSourceEncoding' => 'Get the source encoding', -'uconverter::getSourceType' => 'Get the source converter type', -'uconverter::getStandards' => 'Get standards associated to converter names', -'uconverter::getSubstChars' => 'Get substitution chars', -'uconverter::reasonText' => 'Get string representation of the callback reason', -'uconverter::setDestinationEncoding' => 'Set the destination encoding', -'uconverter::setSourceEncoding' => 'Set the source encoding', -'uconverter::setSubstChars' => 'Set the substitution chars', -'uconverter::toUCallback' => 'Default "to" callback function', -'uconverter::transcode' => 'Convert string from one charset to another', -'ucwords' => 'Uppercase the first character of each word in a string', -'udm_add_search_limit' => 'Add various search limits', -'udm_alloc_agent' => 'Allocate mnoGoSearch session', -'udm_alloc_agent_array' => 'Allocate mnoGoSearch session', -'udm_api_version' => 'Get mnoGoSearch API version', -'udm_cat_list' => 'Get all the categories on the same level with the current one', -'udm_cat_path' => 'Get the path to the current category', -'udm_check_charset' => 'Check if the given charset is known to mnogosearch', -'udm_clear_search_limits' => 'Clear all mnoGoSearch search restrictions', -'udm_crc32' => 'Return CRC32 checksum of given string', -'udm_errno' => 'Get mnoGoSearch error number', -'udm_error' => 'Get mnoGoSearch error message', -'udm_find' => 'Perform search', -'udm_free_agent' => 'Free mnoGoSearch session', -'udm_free_ispell_data' => 'Free memory allocated for ispell data', -'udm_free_res' => 'Free mnoGoSearch result', -'udm_get_doc_count' => 'Get total number of documents in database', -'udm_get_res_field' => 'Fetch a result field', -'udm_get_res_param' => 'Get mnoGoSearch result parameters', -'udm_hash32' => 'Return Hash32 checksum of given string', -'udm_load_ispell_data' => 'Load ispell data', -'udm_set_agent_param' => 'Set mnoGoSearch agent session parameters', -'ui\area::onDraw' => 'Draw Callback', -'ui\area::onKey' => 'Key Callback', -'ui\area::onMouse' => 'Mouse Callback', -'ui\area::redraw' => 'Redraw Area', -'ui\area::scrollTo' => 'Area Scroll', -'ui\area::setSize' => 'Set Size', -'ui\control::destroy' => 'Destroy Control', -'ui\control::disable' => 'Disable Control', -'ui\control::enable' => 'Enable Control', -'ui\control::getParent' => 'Get Parent Control', -'ui\control::getTopLevel' => 'Get Top Level', -'ui\control::hide' => 'Hide Control', -'ui\control::isEnabled' => 'Determine if Control is enabled', -'ui\control::isVisible' => 'Determine if Control is visible', -'ui\control::setParent' => 'Set Parent Control', -'ui\control::show' => 'Control Show', -'ui\controls\box::__construct' => 'Construct a new Box', -'ui\controls\box::append' => 'Append Control', -'ui\controls\box::delete' => 'Delete Control', -'ui\controls\box::getOrientation' => 'Get Orientation', -'ui\controls\box::isPadded' => 'Padding Detection', -'ui\controls\box::setPadded' => 'Set Padding', -'ui\controls\button::__construct' => 'Construct a new Button', -'ui\controls\button::getText' => 'Get Text', -'ui\controls\button::onClick' => 'Click Handler', -'ui\controls\button::setText' => 'Set Text', -'ui\controls\check::__construct' => 'Construct a new Check', -'ui\controls\check::getText' => 'Get Text', -'ui\controls\check::isChecked' => 'Checked Detection', -'ui\controls\check::onToggle' => 'Toggle Callback', -'ui\controls\check::setChecked' => 'Set Checked', -'ui\controls\check::setText' => 'Set Text', -'ui\controls\colorbutton::getColor' => 'Get Color', -'ui\controls\colorbutton::onChange' => 'Change Handler', -'ui\controls\colorbutton::setColor' => 'Set Color', -'ui\controls\combo::append' => 'Append Option', -'ui\controls\combo::getSelected' => 'Get Selected Option', -'ui\controls\combo::onSelected' => 'Selected Handler', -'ui\controls\combo::setSelected' => 'Set Selected Option', -'ui\controls\editablecombo::append' => 'Append Option', -'ui\controls\editablecombo::getText' => 'Get Text', -'ui\controls\editablecombo::onChange' => 'Change Handler', -'ui\controls\editablecombo::setText' => 'Set Text', -'ui\controls\entry::__construct' => 'Construct a new Entry', -'ui\controls\entry::getText' => 'Get Text', -'ui\controls\entry::isReadOnly' => 'Detect Read Only', -'ui\controls\entry::onChange' => 'Change Handler', -'ui\controls\entry::setReadOnly' => 'Set Read Only', -'ui\controls\entry::setText' => 'Set Text', -'ui\controls\form::append' => 'Append Control', -'ui\controls\form::delete' => 'Delete Control', -'ui\controls\form::isPadded' => 'Padding Detection', -'ui\controls\form::setPadded' => 'Set Padding', -'ui\controls\grid::append' => 'Append Control', -'ui\controls\grid::isPadded' => 'Padding Detection', -'ui\controls\grid::setPadded' => 'Set Padding', -'ui\controls\group::__construct' => 'Construct a new Group', -'ui\controls\group::append' => 'Append Control', -'ui\controls\group::getTitle' => 'Get Title', -'ui\controls\group::hasMargin' => 'Margin Detection', -'ui\controls\group::setMargin' => 'Set Margin', -'ui\controls\group::setTitle' => 'Set Title', -'ui\controls\label::__construct' => 'Construct a new Label', -'ui\controls\label::getText' => 'Get Text', -'ui\controls\label::setText' => 'Set Text', -'ui\controls\multilineentry::__construct' => 'Construct a new Multiline Entry', -'ui\controls\multilineentry::append' => 'Append Text', -'ui\controls\multilineentry::getText' => 'Get Text', -'ui\controls\multilineentry::isReadOnly' => 'Read Only Detection', -'ui\controls\multilineentry::onChange' => 'Change Handler', -'ui\controls\multilineentry::setReadOnly' => 'Set Read Only', -'ui\controls\multilineentry::setText' => 'Set Text', -'ui\controls\picker::__construct' => 'Construct a new Picker', -'ui\controls\progress::getValue' => 'Get Value', -'ui\controls\progress::setValue' => 'Set Value', -'ui\controls\radio::append' => 'Append Option', -'ui\controls\radio::getSelected' => 'Get Selected Option', -'ui\controls\radio::onSelected' => 'Selected Handler', -'ui\controls\radio::setSelected' => 'Set Selected Option', -'ui\controls\separator::__construct' => 'Construct a new Separator', -'ui\controls\slider::__construct' => 'Construct a new Slider', -'ui\controls\slider::getValue' => 'Get Value', -'ui\controls\slider::onChange' => 'Change Handler', -'ui\controls\slider::setValue' => 'Set Value', -'ui\controls\spin::__construct' => 'Construct a new Spin', -'ui\controls\spin::getValue' => 'Get Value', -'ui\controls\spin::onChange' => 'Change Handler', -'ui\controls\spin::setValue' => 'Set Value', -'ui\controls\tab::append' => 'Append Page', -'ui\controls\tab::delete' => 'Delete Page', -'ui\controls\tab::hasMargin' => 'Margin Detection', -'ui\controls\tab::insertAt' => 'Insert Page', -'ui\controls\tab::pages' => 'Page Count', -'ui\controls\tab::setMargin' => 'Set Margin', -'ui\draw\brush.gradient::addStop' => 'Stop Manipulation', -'ui\draw\brush.gradient::delStop' => 'Stop Manipulation', -'ui\draw\brush.gradient::setStop' => 'Stop Manipulation', -'ui\draw\brush.lineargradient::__construct' => 'Construct a Linear Gradient', -'ui\draw\brush.radialgradient::__construct' => 'Construct a new Radial Gradient', -'ui\draw\brush::__construct' => 'Construct a new Brush', -'ui\draw\brush::getColor' => 'Get Color', -'ui\draw\brush::setColor' => 'Set Color', -'ui\draw\color::__construct' => 'Construct new Color', -'ui\draw\color::getChannel' => 'Color Manipulation', -'ui\draw\color::setChannel' => 'Color Manipulation', -'ui\draw\matrix::invert' => 'Invert Matrix', -'ui\draw\matrix::isInvertible' => 'Invertible Detection', -'ui\draw\matrix::multiply' => 'Multiply Matrix', -'ui\draw\matrix::rotate' => 'Rotate Matrix', -'ui\draw\matrix::scale' => 'Scale Matrix', -'ui\draw\matrix::skew' => 'Skew Matrix', -'ui\draw\matrix::translate' => 'Translate Matrix', -'ui\draw\path::__construct' => 'Construct a new Path', -'ui\draw\path::addRectangle' => 'Draw a Rectangle', -'ui\draw\path::arcTo' => 'Draw an Arc', -'ui\draw\path::bezierTo' => 'Draw Bezier Curve', -'ui\draw\path::closeFigure' => 'Close Figure', -'ui\draw\path::end' => 'Finalize Path', -'ui\draw\path::lineTo' => 'Draw a Line', -'ui\draw\path::newFigure' => 'Draw Figure', -'ui\draw\path::newFigureWithArc' => 'Draw Figure with Arc', -'ui\draw\pen::clip' => 'Clip a Path', -'ui\draw\pen::fill' => 'Fill a Path', -'ui\draw\pen::restore' => 'Restore', -'ui\draw\pen::save' => 'Save', -'ui\draw\pen::stroke' => 'Stroke a Path', -'ui\draw\pen::transform' => 'Matrix Transform', -'ui\draw\pen::write' => 'Draw Text at Point', -'ui\draw\stroke::__construct' => 'Construct a new Stroke', -'ui\draw\stroke::getCap' => 'Get Line Cap', -'ui\draw\stroke::getJoin' => 'Get Line Join', -'ui\draw\stroke::getMiterLimit' => 'Get Miter Limit', -'ui\draw\stroke::getThickness' => 'Get Thickness', -'ui\draw\stroke::setCap' => 'Set Line Cap', -'ui\draw\stroke::setJoin' => 'Set Line Join', -'ui\draw\stroke::setMiterLimit' => 'Set Miter Limit', -'ui\draw\stroke::setThickness' => 'Set Thickness', -'ui\draw\text\font::__construct' => 'Construct a new Font', -'ui\draw\text\font::getAscent' => 'Font Metrics', -'ui\draw\text\font::getDescent' => 'Font Metrics', -'ui\draw\text\font::getLeading' => 'Font Metrics', -'ui\draw\text\font::getUnderlinePosition' => 'Font Metrics', -'ui\draw\text\font::getUnderlineThickness' => 'Font Metrics', -'ui\draw\text\font\descriptor::__construct' => 'Construct a new Font Descriptor', -'ui\draw\text\font\descriptor::getFamily' => 'Get Font Family', -'ui\draw\text\font\descriptor::getItalic' => 'Style Detection', -'ui\draw\text\font\descriptor::getSize' => 'Size Detection', -'ui\draw\text\font\descriptor::getStretch' => 'Style Detection', -'ui\draw\text\font\descriptor::getWeight' => 'Weight Detection', -'ui\draw\text\font\fontfamilies' => 'Retrieve Font Families', -'ui\draw\text\layout::__construct' => 'Construct a new Text Layout', -'ui\draw\text\layout::setColor' => 'Set Color', -'ui\draw\text\layout::setWidth' => 'Set Width', -'ui\executor::__construct' => 'Construct a new Executor', -'ui\executor::kill' => 'Stop Executor', -'ui\executor::onExecute' => 'Execution Callback', -'ui\executor::setInterval' => 'Interval Manipulation', -'ui\menu::__construct' => 'Construct a new Menu', -'ui\menu::append' => 'Append Menu Item', -'ui\menu::appendAbout' => 'Append About Menu Item', -'ui\menu::appendCheck' => 'Append Checkable Menu Item', -'ui\menu::appendPreferences' => 'Append Preferences Menu Item', -'ui\menu::appendQuit' => 'Append Quit Menu Item', -'ui\menu::appendSeparator' => 'Append Menu Item Separator', -'ui\menuitem::disable' => 'Disable Menu Item', -'ui\menuitem::enable' => 'Enable Menu Item', -'ui\menuitem::isChecked' => 'Detect Checked', -'ui\menuitem::onClick' => 'On Click Callback', -'ui\menuitem::setChecked' => 'Set Checked', -'ui\point::__construct' => 'Construct a new Point', -'ui\point::at' => 'Size Coercion', -'ui\point::getX' => 'Retrieves X', -'ui\point::getY' => 'Retrieves Y', -'ui\point::setX' => 'Set X', -'ui\point::setY' => 'Set Y', -'ui\quit' => 'Quit UI Loop', -'ui\run' => 'Enter UI Loop', -'ui\size::__construct' => 'Construct a new Size', -'ui\size::getHeight' => 'Retrieves Height', -'ui\size::getWidth' => 'Retrieves Width', -'ui\size::of' => 'Point Coercion', -'ui\size::setHeight' => 'Set Height', -'ui\size::setWidth' => 'Set Width', -'ui\window::__construct' => 'Construct a new Window', -'ui\window::add' => 'Add a Control', -'ui\window::error' => 'Show Error Box', -'ui\window::getSize' => 'Get Window Size', -'ui\window::getTitle' => 'Get Title', -'ui\window::hasBorders' => 'Border Detection', -'ui\window::hasMargin' => 'Margin Detection', -'ui\window::isFullScreen' => 'Full Screen Detection', -'ui\window::msg' => 'Show Message Box', -'ui\window::onClosing' => 'Closing Callback', -'ui\window::open' => 'Open Dialog', -'ui\window::save' => 'Save Dialog', -'ui\window::setBorders' => 'Border Use', -'ui\window::setFullScreen' => 'Full Screen Use', -'ui\window::setMargin' => 'Margin Use', -'ui\window::setSize' => 'Set Size', -'ui\window::setTitle' => 'Window Title', -'uksort' => 'Sort an array by keys using a user-defined comparison function', -'umask' => 'Changes the current umask', -'uniqid' => 'Generate a unique ID', -'unixtojd' => 'Convert Unix timestamp to Julian Day', -'unlink' => 'Deletes a file', -'unpack' => 'Unpack data from binary string', -'unregister_event_handler' => 'Allow you to unregister an event handler.', -'unregister_tick_function' => 'De-register a function for execution on each tick', -'unserialize' => 'Creates a PHP value from a stored representation', -'unset' => 'Unset a given variable', -'untaint' => 'Untaint strings', -'uopz_add_function' => 'Adds non-existent function or method', -'uopz_allow_exit' => 'Allows control over disabled exit opcode', -'uopz_backup' => 'Backup a function', -'uopz_compose' => 'Compose a class', -'uopz_copy' => 'Copy a function', -'uopz_del_function' => 'Deletes previously added function or method', -'uopz_delete' => 'Delete a function', -'uopz_extend' => 'Extend a class at runtime', -'uopz_flags' => 'Get or set flags on function or class', -'uopz_function' => 'Creates a function at runtime', -'uopz_get_exit_status' => 'Retrieve the last set exit status', -'uopz_get_hook' => 'Gets previously set hook on function or method', -'uopz_get_mock' => 'Get the current mock for a class', -'uopz_get_property' => 'Gets value of class or instance property', -'uopz_get_return' => 'Gets a previous set return value for a function', -'uopz_get_static' => 'Gets the static variables from function or method scope', -'uopz_implement' => 'Implements an interface at runtime', -'uopz_overload' => 'Overload a VM opcode', -'uopz_redefine' => 'Redefine a constant', -'uopz_rename' => 'Rename a function at runtime', -'uopz_restore' => 'Restore a previously backed up function', -'uopz_set_hook' => 'Sets hook to execute when entering a function or method', -'uopz_set_mock' => 'Use mock instead of class for new objects', -'uopz_set_property' => 'Sets value of existing class or instance property', -'uopz_set_return' => 'Provide a return value for an existing function', -'uopz_set_static' => 'Sets the static variables in function or method scope', -'uopz_undefine' => 'Undefine a constant', -'uopz_unset_hook' => 'Removes previously set hook on function or method', -'uopz_unset_mock' => 'Unset previously set mock', -'uopz_unset_return' => 'Unsets a previously set return value for a function', -'urldecode' => 'Decodes URL-encoded string', -'urlencode' => 'URL-encodes string', -'use_soap_error_handler' => 'Set whether to use the SOAP error handler', -'user_error' => 'Alias of trigger_error', -'usleep' => 'Delay execution in microseconds', -'usort' => 'Sort an array by values using a user-defined comparison function', -'utf8_decode' => 'Converts a string with ISO-8859-1 characters encoded with UTF-8 to single-byte ISO-8859-1', -'utf8_encode' => 'Encodes an ISO-8859-1 string to UTF-8', -'v8js::__construct' => 'Construct a new V8Js object', -'V8Js::clearPendingException' => 'Clears the uncaught pending exception', -'V8Js::compileString' => 'Compiles a script in object\'s context with optional identifier string.', -'V8Js::createSnapshot' => 'Creates a custom V8 heap snapshot with the provided JavaScript source embedded. -Snapshots are supported by V8 4.3.7 and higher. For older versions of V8 this -extension doesn\'t provide this method.', -'V8Js::executeScript' => 'Executes a precompiled script in object\'s context. -A time limit (milliseconds) and/or memory limit (bytes) can be provided to restrict execution. These options will throw a V8JsTimeLimitException or V8JsMemoryLimitException.', -'v8js::executeString' => 'Execute a string as Javascript code', -'v8js::getExtensions' => 'Return an array of registered extensions', -'v8js::getPendingException' => 'Return pending uncaught Javascript exception', -'v8js::registerExtension' => 'Register Javascript extensions for V8Js', -'V8Js::setAverageObjectSize' => 'Set the average object size (in bytes) for this V8Js object. -V8\'s "amount of external memory" is adjusted by this value for every exported object. V8 triggers a garbage collection once this totals to 192 MB.', -'V8Js::setMemoryLimit' => 'Set the memory limit (in bytes) for this V8Js object', -'V8Js::setModuleLoader' => 'Provide a function or method to be used to load required modules. This can be any valid PHP callable. -The loader function will receive the normalised module path and should return Javascript code to be executed.', -'V8Js::setModuleNormaliser' => 'Provide a function or method to be used to normalise module paths. This can be any valid PHP callable. -This can be used in combination with setModuleLoader to influence normalisation of the module path (which -is normally done by V8Js itself but can be overridden this way). -The normaliser function will receive the base path of the current module (if any; otherwise an empty string) -and the literate string provided to the require method and should return an array of two strings (the new -module base path as well as the normalised name). Both are joined by a \'/\' and then passed on to the -module loader (unless the module was cached before).', -'V8Js::setTimeLimit' => 'Set the time limit (in milliseconds) for this V8Js object -works similar to the set_time_limit php', -'v8jsexception::getJsFileName' => 'The getJsFileName purpose', -'v8jsexception::getJsLineNumber' => 'The getJsLineNumber purpose', -'v8jsexception::getJsSourceLine' => 'The getJsSourceLine purpose', -'v8jsexception::getJsTrace' => 'The getJsTrace purpose', -'V8JsScriptException::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'V8JsScriptException::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'V8JsScriptException::__toString' => 'String representation of the exception', -'V8JsScriptException::getCode' => 'Gets the Exception code', -'V8JsScriptException::getFile' => 'Gets the file in which the exception occurred', -'V8JsScriptException::getLine' => 'Gets the line in which the exception occurred', -'V8JsScriptException::getMessage' => 'Gets the Exception message', -'V8JsScriptException::getPrevious' => 'Returns previous Exception', -'V8JsScriptException::getTrace' => 'Gets the stack trace', -'V8JsScriptException::getTraceAsString' => 'Gets the stack trace as a string', -'var_dump' => 'Dumps information about a variable', -'var_export' => 'Outputs or returns a parsable string representation of a variable', -'VARIANT::__construct' => 'COM class constructor.', -'variant_abs' => 'Returns the absolute value of a variant', -'variant_add' => '"Adds" two variant values together and returns the result', -'variant_and' => 'Performs a bitwise AND operation between two variants', -'variant_cast' => 'Convert a variant into a new variant object of another type', -'variant_cat' => 'Concatenates two variant values together and returns the result', -'variant_cmp' => 'Compares two variants', -'variant_date_from_timestamp' => 'Returns a variant date representation of a Unix timestamp', -'variant_date_to_timestamp' => 'Converts a variant date/time value to Unix timestamp', -'variant_div' => 'Returns the result from dividing two variants', -'variant_eqv' => 'Performs a bitwise equivalence on two variants', -'variant_fix' => 'Returns the integer portion of a variant', -'variant_get_type' => 'Returns the type of a variant object', -'variant_idiv' => 'Converts variants to integers and then returns the result from dividing them', -'variant_imp' => 'Performs a bitwise implication on two variants', -'variant_int' => 'Returns the integer portion of a variant', -'variant_mod' => 'Divides two variants and returns only the remainder', -'variant_mul' => 'Multiplies the values of the two variants', -'variant_neg' => 'Performs logical negation on a variant', -'variant_not' => 'Performs bitwise not negation on a variant', -'variant_or' => 'Performs a logical disjunction on two variants', -'variant_pow' => 'Returns the result of performing the power function with two variants', -'variant_round' => 'Rounds a variant to the specified number of decimal places', -'variant_set' => 'Assigns a new value for a variant object', -'variant_set_type' => 'Convert a variant into another type "in-place"', -'variant_sub' => 'Subtracts the value of the right variant from the left variant value', -'variant_xor' => 'Performs a logical exclusion on two variants', -'varnishadmin::__construct' => 'VarnishAdmin constructor', -'varnishadmin::auth' => 'Authenticate on a varnish instance', -'varnishadmin::ban' => 'Ban URLs using a VCL expression', -'varnishadmin::banUrl' => 'Ban an URL using a VCL expression', -'varnishadmin::clearPanic' => 'Clear varnish instance panic messages', -'varnishadmin::connect' => 'Connect to a varnish instance administration interface', -'varnishadmin::disconnect' => 'Disconnect from a varnish instance administration interface', -'varnishadmin::getPanic' => 'Get the last panic message on a varnish instance', -'varnishadmin::getParams' => 'Fetch current varnish instance configuration parameters', -'varnishadmin::isRunning' => 'Check if the varnish slave process is currently running', -'varnishadmin::setCompat' => 'Set the class compat configuration param', -'varnishadmin::setHost' => 'Set the class host configuration param', -'varnishadmin::setIdent' => 'Set the class ident configuration param', -'varnishadmin::setParam' => 'Set configuration param on the current varnish instance', -'varnishadmin::setPort' => 'Set the class port configuration param', -'varnishadmin::setSecret' => 'Set the class secret configuration param', -'varnishadmin::setTimeout' => 'Set the class timeout configuration param', -'varnishadmin::start' => 'Start varnish worker process', -'varnishadmin::stop' => 'Stop varnish worker process', -'varnishlog::__construct' => 'Varnishlog constructor', -'varnishlog::getLine' => 'Get next log line', -'varnishlog::getTagName' => 'Get the log tag string representation by its index', -'varnishstat::__construct' => 'VarnishStat constructor', -'varnishstat::getSnapshot' => 'Get the current varnish instance statistics snapshot', -'version_compare' => 'Compares two "PHP-standardized" version number strings', -'vfprintf' => 'Write a formatted string to a stream', -'virtual' => 'Perform an Apache sub-request', -'vpopmail_add_alias_domain' => 'Add an alias for a virtual domain', -'vpopmail_add_alias_domain_ex' => 'Add alias to an existing virtual domain', -'vpopmail_add_domain' => 'Add a new virtual domain', -'vpopmail_add_domain_ex' => 'Add a new virtual domain', -'vpopmail_add_user' => 'Add a new user to the specified virtual domain', -'vpopmail_alias_add' => 'Insert a virtual alias', -'vpopmail_alias_del' => 'Deletes all virtual aliases of a user', -'vpopmail_alias_del_domain' => 'Deletes all virtual aliases of a domain', -'vpopmail_alias_get' => 'Get all lines of an alias for a domain', -'vpopmail_alias_get_all' => 'Get all lines of an alias for a domain', -'vpopmail_auth_user' => 'Attempt to validate a username/domain/password', -'vpopmail_del_domain' => 'Delete a virtual domain', -'vpopmail_del_domain_ex' => 'Delete a virtual domain', -'vpopmail_del_user' => 'Delete a user from a virtual domain', -'vpopmail_error' => 'Get text message for last vpopmail error', -'vpopmail_passwd' => 'Change a virtual user\'s password', -'vpopmail_set_user_quota' => 'Sets a virtual user\'s quota', -'vprintf' => 'Output a formatted string', -'vsprintf' => 'Return a formatted string', -'vtiful\kernel\excel::__construct' => 'Vtiful\Kernel\Excel constructor', -'vtiful\kernel\excel::addSheet' => 'Vtiful\Kernel\Excel addSheet', -'vtiful\kernel\excel::autoFilter' => 'Vtiful\Kernel\Excel autoFilter', -'vtiful\kernel\excel::constMemory' => 'Vtiful\Kernel\Excel constMemory', -'vtiful\kernel\excel::data' => 'Vtiful\Kernel\Excel data', -'vtiful\kernel\excel::fileName' => 'Vtiful\Kernel\Excel fileName', -'vtiful\kernel\excel::getHandle' => 'Vtiful\Kernel\Excel getHandle', -'vtiful\kernel\excel::header' => 'Vtiful\Kernel\Excel header', -'vtiful\kernel\excel::insertFormula' => 'Vtiful\Kernel\Excel insertFormula', -'vtiful\kernel\excel::insertImage' => 'Vtiful\Kernel\Excel insertImage', -'vtiful\kernel\excel::insertText' => 'Vtiful\Kernel\Excel insertText', -'vtiful\kernel\excel::mergeCells' => 'Vtiful\Kernel\Excel mergeCells', -'vtiful\kernel\excel::output' => 'Vtiful\Kernel\Excel output', -'vtiful\kernel\excel::setColumn' => 'Vtiful\Kernel\Excel setColumn', -'vtiful\kernel\excel::setRow' => 'Vtiful\Kernel\Excel setRow', -'vtiful\kernel\format::align' => 'Vtiful\Kernel\Format align', -'vtiful\kernel\format::bold' => 'Vtiful\Kernel\Format bold', -'vtiful\kernel\format::italic' => 'Vtiful\Kernel\Format italic', -'vtiful\kernel\format::underline' => 'Vtiful\Kernel\Format underline', -'wddx_add_vars' => 'Add variables to a WDDX packet with the specified ID', -'wddx_deserialize' => 'Unserializes a WDDX packet', -'wddx_packet_end' => 'Ends a WDDX packet with the specified ID', -'wddx_packet_start' => 'Starts a new WDDX packet with structure inside it', -'wddx_serialize_value' => 'Serialize a single value into a WDDX packet', -'wddx_serialize_vars' => 'Serialize variables into a WDDX packet', -'weakmap::__construct' => 'Constructs a new map', -'weakmap::count' => 'Counts the number of live entries in the map', -'weakmap::current' => 'Returns the current value under iteration', -'weakmap::key' => 'Returns the current key under iteration', -'weakmap::next' => 'Advances to the next map element', -'weakmap::offsetExists' => 'Checks whether a certain object is in the map', -'weakmap::offsetGet' => 'Returns the value pointed to by a certain object', -'weakmap::offsetSet' => 'Updates the map with a new key-value pair', -'weakmap::offsetUnset' => 'Removes an entry from the map', -'weakmap::rewind' => 'Rewinds the iterator to the beginning of the map', -'weakmap::valid' => 'Returns whether the iterator is still on a valid map element', -'weakref::__construct' => 'Constructs a new weak reference', -'weakref::acquire' => 'Acquires a strong reference on that object', -'weakref::get' => 'Returns the object pointed to by the weak reference', -'weakref::release' => 'Releases a previously acquired reference', -'weakref::valid' => 'Checks whether the object referenced still exists', -'webObj::convertToString' => 'Saves the object to a string. Provides the inverse option for -updateFromString.', -'webObj::free' => 'Free the object properties and break the internal references. -Note that you have to unset the php variable to free totally the -resources.', -'webObj::set' => 'Set object property to a new value.', -'webObj::updateFromString' => 'Update a web object from a string snippet. Returns -MS_SUCCESS/MS_FAILURE.', -'win32_continue_service' => 'Resumes a paused service', -'win32_create_service' => 'Creates a new service entry in the SCM database', -'win32_delete_service' => 'Deletes a service entry from the SCM database', -'win32_get_last_control_message' => 'Returns the last control message that was sent to this service', -'win32_pause_service' => 'Pauses a service', -'win32_ps_list_procs' => 'List running processes', -'win32_ps_stat_mem' => 'Stat memory utilization', -'win32_ps_stat_proc' => 'Stat process', -'win32_query_service_status' => 'Queries the status of a service', -'win32_send_custom_control' => 'Send a custom control to the service', -'win32_set_service_exit_code' => 'Define or return the exit code for the current running service', -'win32_set_service_exit_mode' => 'Define or return the exit mode for the current running service', -'win32_set_service_status' => 'Update the service status', -'win32_start_service' => 'Starts a service', -'win32_start_service_ctrl_dispatcher' => 'Registers the script with the SCM, so that it can act as the service with the given name', -'win32_stop_service' => 'Stops a service', -'wincache_fcache_fileinfo' => 'Retrieves information about files cached in the file cache', -'wincache_fcache_meminfo' => 'Retrieves information about file cache memory usage', -'wincache_lock' => 'Acquires an exclusive lock on a given key', -'wincache_ocache_fileinfo' => 'Retrieves information about files cached in the opcode cache', -'wincache_ocache_meminfo' => 'Retrieves information about opcode cache memory usage', -'wincache_refresh_if_changed' => 'Refreshes the cache entries for the cached files', -'wincache_rplist_fileinfo' => 'Retrieves information about resolve file path cache', -'wincache_rplist_meminfo' => 'Retrieves information about memory usage by the resolve file path cache', -'wincache_scache_info' => 'Retrieves information about files cached in the session cache', -'wincache_scache_meminfo' => 'Retrieves information about session cache memory usage', -'wincache_ucache_add' => 'Adds a variable in user cache only if variable does not already exist in the cache', -'wincache_ucache_cas' => 'Compares the variable with old value and assigns new value to it', -'wincache_ucache_clear' => 'Deletes entire content of the user cache', -'wincache_ucache_dec' => 'Decrements the value associated with the key', -'wincache_ucache_delete' => 'Deletes variables from the user cache', -'wincache_ucache_exists' => 'Checks if a variable exists in the user cache', -'wincache_ucache_get' => 'Gets a variable stored in the user cache', -'wincache_ucache_inc' => 'Increments the value associated with the key', -'wincache_ucache_info' => 'Retrieves information about data stored in the user cache', -'wincache_ucache_meminfo' => 'Retrieves information about user cache memory usage', -'wincache_ucache_set' => 'Adds a variable in user cache and overwrites a variable if it already exists in the cache', -'wincache_unlock' => 'Releases an exclusive lock on a given key', -'wkhtmltox\image\converter::__construct' => 'Create a new Image converter', -'wkhtmltox\image\converter::convert' => 'Perform Image conversion', -'wkhtmltox\image\converter::getVersion' => 'Determine version of Converter', -'wkhtmltox\pdf\converter::__construct' => 'Create a new PDF converter', -'wkhtmltox\pdf\converter::add' => 'Add an object for conversion', -'wkhtmltox\pdf\converter::convert' => 'Perform PDF conversion', -'wkhtmltox\pdf\converter::getVersion' => 'Determine version of Converter', -'wkhtmltox\pdf\object::__construct' => 'Create a new PDF Object', -'wordwrap' => 'Wraps a string to a given number of characters', -'Worker::addRef' => 'Increments the internal number of references to a Threaded object', -'Worker::chunk' => 'Fetches a chunk of the objects property table of the given size, -optionally preserving keys', -'worker::collect' => 'Collect references to completed tasks', -'Worker::count' => 'Returns the number of properties for this object', -'Worker::delRef' => 'Decrements the internal number of references to a Threaded object', -'Worker::detach' => 'Detaches the referenced Thread from the calling context, dangerous!', -'Worker::extend' => 'Makes thread safe standard class at runtime', -'Worker::getCreatorId' => 'Will return the identity of the Thread that created the referenced Thread', -'Worker::getCurrentThread' => 'Return a reference to the currently executing Thread', -'Worker::getCurrentThreadId' => 'Will return the identity of the currently executing Thread', -'Worker::getRefCount' => 'Retrieves the internal number of references to a Threaded object', -'worker::getStacked' => 'Gets the remaining stack size', -'Worker::getTerminationInfo' => 'Retrieves terminal error information from the referenced object', -'Worker::getThreadId' => 'Will return the identity of the referenced Thread', -'Worker::globally' => 'Will execute a Callable in the global scope', -'Worker::isJoined' => 'Tell if the referenced Thread has been joined', -'Worker::isRunning' => 'Tell if the referenced object is executing', -'worker::isShutdown' => 'State Detection', -'Worker::isStarted' => 'Tell if the referenced Thread was started', -'Worker::isTerminated' => 'Tell if the referenced object was terminated during execution; suffered -fatal errors, or threw uncaught exceptions', -'Worker::isWaiting' => 'Tell if the referenced object is waiting for notification', -'worker::isWorking' => 'State Detection', -'Worker::join' => 'Causes the calling context to wait for the referenced Thread to finish executing', -'Worker::kill' => 'Forces the referenced Thread to terminate', -'Worker::lock' => 'Lock the referenced objects property table', -'Worker::merge' => 'Merges data into the current object', -'Worker::notify' => 'Send notification to the referenced object', -'Worker::notifyOne' => 'Send notification to the referenced object. This unblocks at least one -of the blocked threads (as opposed to unblocking all of them, as seen with -Threaded::notify()).', -'Worker::offsetExists' => 'Whether a offset exists', -'Worker::offsetGet' => 'Offset to retrieve', -'Worker::offsetSet' => 'Offset to set', -'Worker::offsetUnset' => 'Offset to unset', -'Worker::pop' => 'Pops an item from the objects property table', -'Worker::run' => 'The programmer should always implement the run method for objects -that are intended for execution.', -'Worker::shift' => 'Shifts an item from the objects property table', -'worker::shutdown' => 'Shutdown the worker', -'worker::stack' => 'Stacking work', -'Worker::start' => 'Will start a new Thread to execute the implemented run method', -'Worker::synchronized' => 'Executes the block while retaining the referenced objects -synchronization lock for the calling context', -'Worker::unlock' => 'Unlock the referenced objects storage for the calling context', -'worker::unstack' => 'Unstacking work', -'Worker::wait' => 'Will cause the calling context to wait for notification from the -referenced object', -'xattr_get' => 'Get an extended attribute', -'xattr_list' => 'Get a list of extended attributes', -'xattr_remove' => 'Remove an extended attribute', -'xattr_set' => 'Set an extended attribute', -'xattr_supported' => 'Check if filesystem supports extended attributes', -'xdiff_file_bdiff' => 'Make binary diff of two files', -'xdiff_file_bdiff_size' => 'Read a size of file created by applying a binary diff', -'xdiff_file_bpatch' => 'Patch a file with a binary diff', -'xdiff_file_diff' => 'Make unified diff of two files', -'xdiff_file_diff_binary' => 'Alias of xdiff_file_bdiff', -'xdiff_file_merge3' => 'Merge 3 files into one', -'xdiff_file_patch' => 'Patch a file with an unified diff', -'xdiff_file_patch_binary' => 'Alias of xdiff_file_bpatch', -'xdiff_file_rabdiff' => 'Make binary diff of two files using the Rabin\'s polynomial fingerprinting algorithm', -'xdiff_string_bdiff' => 'Make binary diff of two strings', -'xdiff_string_bdiff_size' => 'Read a size of file created by applying a binary diff', -'xdiff_string_bpatch' => 'Patch a string with a binary diff', -'xdiff_string_diff' => 'Make unified diff of two strings', -'xdiff_string_diff_binary' => 'Alias of xdiff_string_bdiff', -'xdiff_string_merge3' => 'Merge 3 strings into one', -'xdiff_string_patch' => 'Patch a string with an unified diff', -'xdiff_string_patch_binary' => 'Alias of xdiff_string_bpatch', -'xdiff_string_rabdiff' => 'Make binary diff of two strings using the Rabin\'s polynomial fingerprinting algorithm', -'xhprof_disable' => 'Stops xhprof profiler', -'xhprof_enable' => 'Start xhprof profiler', -'xhprof_sample_disable' => 'Stops xhprof sample profiler', -'xhprof_sample_enable' => 'Start XHProf profiling in sampling mode', -'xml_error_string' => 'Get XML parser error string', -'xml_get_current_byte_index' => 'Get current byte index for an XML parser', -'xml_get_current_column_number' => 'Get current column number for an XML parser', -'xml_get_current_line_number' => 'Get current line number for an XML parser', -'xml_get_error_code' => 'Get XML parser error code', -'xml_parse' => 'Start parsing an XML document', -'xml_parse_into_struct' => 'Parse XML data into an array structure', -'xml_parser_create' => 'Create an XML parser', -'xml_parser_create_ns' => 'Create an XML parser with namespace support', -'xml_parser_free' => 'Free an XML parser', -'xml_parser_get_option' => 'Get options from an XML parser', -'xml_parser_set_option' => 'Set options in an XML parser', -'xml_set_character_data_handler' => 'Set up character data handler', -'xml_set_default_handler' => 'Set up default handler', -'xml_set_element_handler' => 'Set up start and end element handlers', -'xml_set_end_namespace_decl_handler' => 'Set up end namespace declaration handler', -'xml_set_external_entity_ref_handler' => 'Set up external entity reference handler', -'xml_set_notation_decl_handler' => 'Set up notation declaration handler', -'xml_set_object' => 'Use XML Parser within an object', -'xml_set_processing_instruction_handler' => 'Set up processing instruction (PI) handler', -'xml_set_start_namespace_decl_handler' => 'Set up start namespace declaration handler', -'xml_set_unparsed_entity_decl_handler' => 'Set up unparsed entity declaration handler', -'xmldiff_base::__construct' => 'Constructor', -'xmldiff_base::diff' => 'Produce diff of two XML documents', -'xmldiff_base::merge' => 'Produce new XML document based on diff', -'xmldiff_dom::diff' => 'Diff two DOMDocument objects', -'xmldiff_dom::merge' => 'Produce merged DOMDocument', -'xmldiff_file::diff' => 'Diff two XML files', -'xmldiff_file::merge' => 'Produce merged XML document', -'xmldiff_memory::diff' => 'Diff two XML documents', -'xmldiff_memory::merge' => 'Produce merged XML document', -'xmlreader::close' => 'Close the XMLReader input', -'xmlreader::expand' => 'Returns a copy of the current node as a DOM object', -'xmlreader::getAttribute' => 'Get the value of a named attribute', -'xmlreader::getAttributeNo' => 'Get the value of an attribute by index', -'xmlreader::getAttributeNs' => 'Get the value of an attribute by localname and URI', -'xmlreader::getParserProperty' => 'Indicates if specified property has been set', -'xmlreader::isValid' => 'Indicates if the parsed document is valid', -'xmlreader::lookupNamespace' => 'Lookup namespace for a prefix', -'xmlreader::moveToAttribute' => 'Move cursor to a named attribute', -'xmlreader::moveToAttributeNo' => 'Move cursor to an attribute by index', -'xmlreader::moveToAttributeNs' => 'Move cursor to a named attribute', -'xmlreader::moveToElement' => 'Position cursor on the parent Element of current Attribute', -'xmlreader::moveToFirstAttribute' => 'Position cursor on the first Attribute', -'xmlreader::moveToNextAttribute' => 'Position cursor on the next Attribute', -'xmlreader::next' => 'Move cursor to next node skipping all subtrees', -'xmlreader::open' => 'Set the URI containing the XML to parse', -'xmlreader::read' => 'Move to next node in document', -'xmlreader::readInnerXml' => 'Retrieve XML from current node', -'xmlreader::readOuterXml' => 'Retrieve XML from current node, including itself', -'xmlreader::readString' => 'Reads the contents of the current node as a string', -'xmlreader::setParserProperty' => 'Set parser options', -'xmlreader::setRelaxNGSchema' => 'Set the filename or URI for a RelaxNG Schema', -'xmlreader::setRelaxNGSchemaSource' => 'Set the data containing a RelaxNG Schema', -'xmlreader::setSchema' => 'Validate document against XSD', -'xmlreader::XML' => 'Set the data containing the XML to parse', -'xmlrpc_decode' => 'Decodes XML into native PHP types', -'xmlrpc_decode_request' => 'Decodes XML into native PHP types', -'xmlrpc_encode' => 'Generates XML for a PHP value', -'xmlrpc_encode_request' => 'Generates XML for a method request', -'xmlrpc_get_type' => 'Gets xmlrpc type for a PHP value', -'xmlrpc_is_fault' => 'Determines if an array value represents an XMLRPC fault', -'xmlrpc_parse_method_descriptions' => 'Decodes XML into a list of method descriptions', -'xmlrpc_server_add_introspection_data' => 'Adds introspection documentation', -'xmlrpc_server_call_method' => 'Parses XML requests and call methods', -'xmlrpc_server_create' => 'Creates an xmlrpc server', -'xmlrpc_server_destroy' => 'Destroys server resources', -'xmlrpc_server_register_introspection_callback' => 'Register a PHP function to generate documentation', -'xmlrpc_server_register_method' => 'Register a PHP function to resource method matching method_name', -'xmlrpc_set_type' => 'Sets xmlrpc type, base64 or datetime, for a PHP string value', -'XMLWriter::endAttribute' => 'End attribute', -'XMLWriter::endCdata' => 'End current CDATA', -'XMLWriter::endComment' => 'Create end comment', -'XMLWriter::endDocument' => 'End current document', -'XMLWriter::endDtd' => 'End current DTD', -'XMLWriter::endDtdAttlist' => 'End current DTD AttList', -'XMLWriter::endDtdElement' => 'End current DTD element', -'XMLWriter::endDtdEntity' => 'End current DTD Entity', -'XMLWriter::endElement' => 'End current element', -'XMLWriter::endPi' => 'End current PI', -'XMLWriter::flush' => 'Flush current buffer', -'XMLWriter::fullEndElement' => 'End current element', -'XMLWriter::openMemory' => 'Create new xmlwriter using memory for string output', -'XMLWriter::openUri' => 'Create new xmlwriter using source uri for output', -'XMLWriter::outputMemory' => 'Returns current buffer', -'XMLWriter::setIndent' => 'Toggle indentation on/off', -'XMLWriter::setIndentString' => 'Set string used for indenting', -'XMLWriter::startAttribute' => 'Create start attribute', -'XMLWriter::startAttributeNs' => 'Create start namespaced attribute', -'XMLWriter::startCdata' => 'Create start CDATA tag', -'XMLWriter::startComment' => 'Create start comment', -'XMLWriter::startDocument' => 'Create document tag', -'XMLWriter::startDtd' => 'Create start DTD tag', -'XMLWriter::startDtdAttlist' => 'Create start DTD AttList', -'XMLWriter::startDtdElement' => 'Create start DTD element', -'XMLWriter::startDtdEntity' => 'Create start DTD Entity', -'XMLWriter::startElement' => 'Create start element tag', -'XMLWriter::startElementNs' => 'Create start namespaced element tag', -'XMLWriter::startPi' => 'Create start PI tag', -'XMLWriter::text' => 'Write text', -'XMLWriter::writeAttribute' => 'Write full attribute', -'XMLWriter::writeAttributeNs' => 'Write full namespaced attribute', -'XMLWriter::writeCdata' => 'Write full CDATA tag', -'XMLWriter::writeComment' => 'Write full comment tag', -'XMLWriter::writeDtd' => 'Write full DTD tag', -'XMLWriter::writeDtdAttlist' => 'Write full DTD AttList tag', -'XMLWriter::writeDtdElement' => 'Write full DTD element tag', -'XMLWriter::writeDtdEntity' => 'Write full DTD Entity tag', -'XMLWriter::writeElement' => 'Write full element tag', -'XMLWriter::writeElementNs' => 'Write full namespaced element tag', -'XMLWriter::writePi' => 'Writes a PI', -'XMLWriter::writeRaw' => 'Write a raw XML text', -'xsltprocessor::__construct' => 'Creates a new XSLTProcessor object', -'xsltprocessor::getParameter' => 'Get value of a parameter', -'xsltprocessor::getSecurityPrefs' => 'Get security preferences', -'xsltprocessor::hasExsltSupport' => 'Determine if PHP has EXSLT support', -'xsltprocessor::importStylesheet' => 'Import stylesheet', -'xsltprocessor::registerPHPFunctions' => 'Enables the ability to use PHP functions as XSLT functions', -'xsltprocessor::removeParameter' => 'Remove parameter', -'xsltprocessor::setParameter' => 'Set value for a parameter', -'xsltprocessor::setProfiling' => 'Sets profiling output file', -'xsltprocessor::setSecurityPrefs' => 'Set security preferences', -'xsltprocessor::transformToDoc' => 'Transform to a DOMDocument', -'xsltprocessor::transformToUri' => 'Transform to URI', -'xsltprocessor::transformToXml' => 'Transform to XML', -'yaconf::get' => 'Retrieve a item', -'yaconf::has' => 'Determine if a item exists', -'Yaf\Action_Abstract::__construct' => '<b>\Yaf\Controller_Abstract</b>::__construct() is final, which means it can not be overridden. You may want to see \Yaf\Controller_Abstract::init() instead.', -'Yaf\Action_Abstract::execute' => '<p>user should always define this method for a action, this is the entry point of an action. <b>\Yaf\Action_Abstract::execute()</b> may have arguments.</p> -<br/> -<b>Note:</b> -<p>The value retrieved from the request is not safe. you should do some filtering work before you use it.</p>', -'Yaf\Action_Abstract::forward' => '<p>forward current execution process to other action.</p> -<br/> -<b>Note:</b> -<p>this method doesn\'t switch to the destination action immediately, it will take place after current flow finish.</p> -<br/> -<b>Notice, there are 3 available method signatures:</b> -<p>\Yaf\Controller_Abstract::forward ( string $module , string $controller , string $action [, array $parameters ] )</p> -<p>\Yaf\Controller_Abstract::forward ( string $controller , string $action [, array $parameters ] )</p> -<p>\Yaf\Controller_Abstract::forward ( string $action [, array $parameters ] )</p>', -'Yaf\Action_Abstract::getController' => 'retrieve current controller object.', -'Yaf\Action_Abstract::getModuleName' => 'get the controller\'s module name', -'Yaf\Action_Abstract::getRequest' => 'retrieve current request object', -'Yaf\Action_Abstract::getResponse' => 'retrieve current response object', -'Yaf\Action_Abstract::getView' => 'retrieve view engine', -'Yaf\Action_Abstract::init' => '<p>\Yaf\Controller_Abstract::__construct() is final, which means users can not override it. but users can define <b>\Yaf\Controller_Abstract::init()</b>, which will be called after controller object is instantiated.</p>', -'Yaf\Action_Abstract::redirect' => 'redirect to a URL by sending a 302 header', -'Yaf\Application::app' => 'Retrieve the \Yaf\Application instance, alternatively, we also could use \Yaf\Dispatcher::getApplication().', -'Yaf\Application::bootstrap' => 'Run a Bootstrap, all the methods defined in the Bootstrap and named with prefix "_init" will be called according to their declaration order, if the parameter bootstrap is not supplied, Yaf will look for a Bootstrap under application.directory.', -'Yaf\Application::environ' => 'Retrieve environ which was defined in yaf.environ which has a default value "product".', -'Yaf\Application::execute' => 'This method is typically used to run \Yaf\Application in a crontab work. -Make the crontab work can also use the autoloader and Bootstrap mechanism.', -'Yaf\Application::getModules' => 'Get the modules list defined in config, if no one defined, there will always be a module named "Index".', -'Yaf\Application::run' => 'Run a \Yaf\Application, let the \Yaf\Application accept a request, and route the request, dispatch to controller/action, and render response. -return response to client finally.', -'Yaf\Application::setAppDirectory' => 'Change the application directory', -'Yaf\Controller_Abstract::__construct' => '<b>\Yaf\Controller_Abstract</b>::__construct() is final, which means it can not be overridden. You may want to see \Yaf\Controller_Abstract::init() instead.', -'Yaf\Controller_Abstract::forward' => '<p>forward current execution process to other action.</p> -<br/> -<b>Note:</b> -<p>this method doesn\'t switch to the destination action immediately, it will take place after current flow finish.</p> -<br/> -<b>Notice, there are 3 available method signatures:</b> -<p>\Yaf\Controller_Abstract::forward ( string $module , string $controller , string $action [, array $parameters ] )</p> -<p>\Yaf\Controller_Abstract::forward ( string $controller , string $action [, array $parameters ] )</p> -<p>\Yaf\Controller_Abstract::forward ( string $action [, array $parameters ] )</p>', -'Yaf\Controller_Abstract::getModuleName' => 'get the controller\'s module name', -'Yaf\Controller_Abstract::getRequest' => 'retrieve current request object', -'Yaf\Controller_Abstract::getResponse' => 'retrieve current response object', -'Yaf\Controller_Abstract::getView' => 'retrieve view engine', -'Yaf\Controller_Abstract::init' => '<p>\Yaf\Controller_Abstract::__construct() is final, which means users can not override it. but users can define <b>\Yaf\Controller_Abstract::init()</b>, which will be called after controller object is instantiated.</p>', -'Yaf\Controller_Abstract::redirect' => 'redirect to a URL by sending a 302 header', -'Yaf\Dispatcher::autoRender' => '<p>\Yaf\Dispatcher will render automatically after dispatches an incoming request, you can prevent the rendering by calling this method with $flag TRUE</p><br/> -<b>Note:</b> -<p>you can simply return FALSE in a action to prevent the auto-rendering of that action</p>', -'Yaf\Dispatcher::catchException' => '<p>While the application.dispatcher.throwException is On(you can also calling to <b>\Yaf\Dispatcher::throwException(TRUE)</b> to enable it), Yaf will throw \Exception when error occurs instead of trigger error.</p><br/> -<p>then if you enable <b>\Yaf\Dispatcher::catchException()</b>(also can enabled by set application.dispatcher.catchException), all uncaught \Exceptions will be caught by ErrorController::error if you have defined one.</p>', -'Yaf\Dispatcher::disableView' => '<p>disable view engine, used in some app that user will output by himself</p><br/> -<b>Note:</b> -<p>you can simply return FALSE in a action to prevent the auto-rendering of that action</p>', -'Yaf\Dispatcher::dispatch' => '<p>This method does the heavy work of the \Yaf\Dispatcher. It take a request object.</p><br/> -<p>The dispatch process has three distinct events:</p> -<ul> -<li>Routing</li> -<li>Dispatching</li> -<li>Response</li> -</ul> -<p>Routing takes place exactly once, using the values in the request object when dispatch() is called. Dispatching takes place in a loop; a request may either indicate multiple actions to dispatch, or the controller or a plugin may reset the request object to force additional actions to dispatch(see \Yaf\Plugin_Abstract. When all is done, the \Yaf\Dispatcher returns a response.</p>', -'Yaf\Dispatcher::enableView' => 'enable view rendering', -'Yaf\Dispatcher::flushInstantly' => 'Switch on/off the instant flushing', -'Yaf\Dispatcher::getApplication' => 'Retrieve the \Yaf\Application instance. same as \Yaf\Application::app().', -'Yaf\Dispatcher::initView' => 'Initialize view and return it', -'Yaf\Dispatcher::registerPlugin' => 'Register a plugin(see \Yaf\Plugin_Abstract). Generally, we register plugins in Bootstrap(see \Yaf\Bootstrap_Abstract).', -'Yaf\Dispatcher::setDefaultAction' => 'Change default action name', -'Yaf\Dispatcher::setDefaultController' => 'Change default controller name', -'Yaf\Dispatcher::setDefaultModule' => 'Change default module name', -'Yaf\Dispatcher::setErrorHandler' => '<p>Set error handler for Yaf. when application.dispatcher.throwException is off, Yaf will trigger catch-able error while unexpected errors occurred.</p><br/> -<p>Thus, this error handler will be called while the error raise.</p>', -'Yaf\Dispatcher::setView' => 'This method provides a solution for that if you want use a custom view engine instead of \Yaf\View\Simple', -'Yaf\Dispatcher::throwException' => '<p>Switch on/off exception throwing while unexpected error occurring. When this is on, Yaf will throwing exceptions instead of triggering catchable errors.</p><br/> -<p>You can also use application.dispatcher.throwException to achieve the same purpose.</p>', -'Yaf\Loader::registerLocalNamespace' => '<p>Register local class prefix name, \Yaf\Loader search classes in two library directories, the one is configured via application.library.directory(in application.ini) which is called local library directory; the other is configured via yaf.library (in php.ini) which is called global library directory, since it can be shared by many applications in the same server.</p> -<br/> -<p>When an autoloading is triggered, \Yaf\Loader will determine which library directory should be searched in by examining the prefix name of the missed classname. If the prefix name is registered as a local namespace then look for it in local library directory, otherwise look for it in global library directory.</p> -<br/> -<b>Note:</b> -<p>If yaf.library is not configured, then the global library directory is assumed to be the local library directory. in that case, all autoloading will look for local library directory. But if you want your Yaf application be strong, then always register your own classes as local classes.</p>', -'Yaf\Plugin_Abstract::dispatchLoopShutdown' => 'This is the latest hook in Yaf plugin hook system, if a custom plugin implement this method, then it will be called after the dispatch loop finished.', -'Yaf\Plugin_Abstract::dispatchLoopStartup' => '`@return bool` true', -'Yaf\Plugin_Abstract::postDispatch' => '`@return bool` true', -'Yaf\Plugin_Abstract::preDispatch' => '`@return bool` true', -'Yaf\Plugin_Abstract::preResponse' => '`@return bool` true', -'Yaf\Plugin_Abstract::routerShutdown' => 'This hook will be triggered after the route process finished, this hook is usually used for login check.', -'Yaf\Plugin_Abstract::routerStartup' => 'This is the earliest hook in Yaf plugin hook system, if a custom plugin implement this method, then it will be called before routing a request.', -'Yaf\Registry::get' => 'Retrieve an item from registry', -'Yaf\Registry::has' => 'Check whether an item exists', -'Yaf\Request\Http::get' => 'Retrieve variable from client, this method will search the name in $_REQUEST params, if the name is not found, then will search in $_POST, $_GET, $_COOKIE, $_SERVER', -'Yaf\Request\Http::getCookie' => 'Retrieve $_COOKIE variable', -'Yaf\Request\Http::getEnv' => 'Retrieve $_ENV variable', -'Yaf\Request\Http::getFiles' => 'Retrieve $_FILES variable', -'Yaf\Request\Http::getPost' => 'Retrieve $_POST variable', -'Yaf\Request\Http::getQuery' => 'Retrieve $_GET variable', -'Yaf\Request\Http::getRequest' => 'Retrieve $_REQUEST variable', -'Yaf\Request\Http::getServer' => 'Retrieve $_SERVER variable', -'Yaf\Request\Http::isXmlHttpRequest' => 'Check the request whether it is a Ajax Request - -<br/> -<b>Note:</b> -<p> -This method depends on the request header: HTTP_X_REQUESTED_WITH, some Javascript library doesn\'t set this header while doing Ajax request -</p>', -'Yaf\Request\Http::setBaseUri' => '<p>Set base URI, base URI is used when doing routing, in routing phase request URI is used to route a request, while base URI is used to skip the leading part(base URI) of request URI. That is, if comes a request with request URI a/b/c, then if you set base URI to "a/b", only "/c" will be used in routing phase.</p> -<br/> -<b>Note:</b> -<p>generally, you don\'t need to set this, Yaf will determine it automatically.</p>', -'Yaf\Request\Http::setDispatched' => 'Set request as dispatched', -'Yaf\Request\Http::setRouted' => 'Set request as routed', -'Yaf\Request\Simple::get' => 'Retrieve variable from client, this method will search the name in $_REQUEST params, if the name is not found, then will search in $_POST, $_GET, $_COOKIE, $_SERVER', -'Yaf\Request\Simple::getCookie' => 'Retrieve $_Cookie variable', -'Yaf\Request\Simple::getEnv' => 'Retrieve $_ENV variable', -'Yaf\Request\Simple::getPost' => 'Retrieve $_POST variable', -'Yaf\Request\Simple::getQuery' => 'Retrieve $_GET variable', -'Yaf\Request\Simple::getRequest' => 'Retrieve $_REQUEST variable', -'Yaf\Request\Simple::getServer' => 'Retrieve $_SERVER variable', -'Yaf\Request\Simple::isXmlHttpRequest' => 'Check the request whether it is a Ajax Request - -<br/> -<b>Note:</b> -<p> -This method depends on the request header: HTTP_X_REQUESTED_WITH, some Javascript library doesn\'t set this header while doing Ajax request -</p>', -'Yaf\Request\Simple::setBaseUri' => '<p>Set base URI, base URI is used when doing routing, in routing phase request URI is used to route a request, while base URI is used to skip the leading part(base URI) of request URI. That is, if comes a request with request URI a/b/c, then if you set base URI to "a/b", only "/c" will be used in routing phase.</p> -<br/> -<b>Note:</b> -<p>generally, you don\'t need to set this, Yaf will determine it automatically.</p>', -'Yaf\Request\Simple::setDispatched' => 'Set request as dispatched', -'Yaf\Request\Simple::setRouted' => 'Set request as routed', -'Yaf\Request_Abstract::getEnv' => 'Retrieve $_ENV variable', -'Yaf\Request_Abstract::getServer' => 'Retrieve $_SERVER variable', -'Yaf\Request_Abstract::isXmlHttpRequest' => '`@return bool` false', -'Yaf\Request_Abstract::setBaseUri' => '<p>Set base URI, base URI is used when doing routing, in routing phase request URI is used to route a request, while base URI is used to skip the leading part(base URI) of request URI. That is, if comes a request with request URI a/b/c, then if you set base URI to "a/b", only "/c" will be used in routing phase.</p> -<br/> -<b>Note:</b> -<p>generally, you don\'t need to set this, Yaf will determine it automatically.</p>', -'Yaf\Request_Abstract::setDispatched' => 'Set request as dispatched', -'Yaf\Request_Abstract::setRouted' => 'Set request as routed', -'Yaf\Response\Cli::appendBody' => 'append a content to a exists content block', -'Yaf\Response\Cli::clearBody' => 'Clear existing content', -'Yaf\Response\Cli::getBody' => 'Retrieve an existing content', -'Yaf\Response\Cli::prependBody' => 'prepend a content to a exists content block', -'Yaf\Response\Cli::setBody' => 'Set content to response', -'Yaf\Response\Http::appendBody' => 'append a content to a exists content block', -'Yaf\Response\Http::clearBody' => 'Clear existing content', -'Yaf\Response\Http::getBody' => 'Retrieve an existing content', -'Yaf\Response\Http::prependBody' => 'prepend a content to a exists content block', -'Yaf\Response\Http::response' => 'send response', -'Yaf\Response\Http::setBody' => 'Set content to response', -'Yaf\Response_Abstract::appendBody' => 'append a content to a exists content block', -'Yaf\Response_Abstract::clearBody' => 'Clear existing content', -'Yaf\Response_Abstract::getBody' => 'Retrieve an existing content', -'Yaf\Response_Abstract::prependBody' => 'prepend a content to a exists content block', -'Yaf\Response_Abstract::setBody' => 'Set content to response', -'Yaf\Route\Map::assemble' => '<p><b>\Yaf\Route\Map::assemble()</b> - Assemble a url', -'Yaf\Route\Regex::addConfig' => '<p>Add routes defined by configs into \Yaf\Router\'s route stack</p>', -'Yaf\Route\Regex::addRoute' => '<p>by default, \Yaf\Router using a \Yaf\Route_Static as its default route. you can add new routes into router\'s route stack by calling this method.</p> -<br/> -<p>the newer route will be called before the older(route stack), and if the newer router return TRUE, the router process will be end. otherwise, the older one will be called.</p>', -'Yaf\Route\Regex::assemble' => '<p><b>\Yaf\Route\Regex::assemble()</b> - Assemble a url', -'Yaf\Route\Regex::getCurrentRoute' => '<p>Get the name of the route which is effective in the route process.</p> -<br/> -<b>Note:</b> -<p>You should call this method after the route process finished, since before that, this method will always return NULL.</p>', -'Yaf\Route\Regex::getRoute' => '<p>Retrieve a route by name, see also \Yaf\Router::getCurrentRoute()</p>', -'Yaf\Route\Regex::route' => 'Route a incoming request.', -'Yaf\Route\Rewrite::addConfig' => '<p>Add routes defined by configs into \Yaf\Router\'s route stack</p>', -'Yaf\Route\Rewrite::addRoute' => '<p>by default, \Yaf\Router using a \Yaf\Route_Static as its default route. you can add new routes into router\'s route stack by calling this method.</p> -<br/> -<p>the newer route will be called before the older(route stack), and if the newer router return TRUE, the router process will be end. otherwise, the older one will be called.</p>', -'Yaf\Route\Rewrite::assemble' => '<p><b>\Yaf\Route\Rewrite::assemble()</b> - Assemble a url', -'Yaf\Route\Rewrite::getCurrentRoute' => '<p>Get the name of the route which is effective in the route process.</p> -<br/> -<b>Note:</b> -<p>You should call this method after the route process finished, since before that, this method will always return NULL.</p>', -'Yaf\Route\Rewrite::getRoute' => '<p>Retrieve a route by name, see also \Yaf\Router::getCurrentRoute()</p>', -'Yaf\Route\Simple::__construct' => '<p>\Yaf\Route\Simple will get route info from query string. and the parameters of this constructor will used as keys while searching for the route info in $_GET.</p>', -'Yaf\Route\Simple::assemble' => '<p><b>\Yaf\Route\Simple::assemble()</b> - Assemble a url', -'Yaf\Route\Simple::route' => '<p>see \Yaf\Route\Simple::__construct()</p>', -'Yaf\Route\Supervar::__construct' => '<p>\Yaf\Route\Supervar is similar to \Yaf\Route_Static, the difference is that \Yaf\Route\Supervar will look for path info in query string, and the parameter supervar_name is the key.</p>', -'Yaf\Route\Supervar::assemble' => '<p><b>\Yaf\Route\Supervar::assemble()</b> - Assemble a url', -'Yaf\Route\Supervar::route' => '`@return bool` If there is a key(which was defined in \Yaf\Route\Supervar::__construct()) in $_GET, return TRUE. otherwise return FALSE.', -'Yaf\Route_Interface::assemble' => '<p><b>\Yaf\Route_Interface::assemble()</b> - assemble a request<br/> -<p>this method returns a url according to the argument info, and append query strings to the url according to the argument query.</p> -<p>a route should implement this method according to its own route rules, and do a reverse progress.</p>', -'Yaf\Route_Interface::route' => '<p><b>\Yaf\Route_Interface::route()</b> is the only method that a custom route should implement.</p><br/> -<p>if this method return TRUE, then the route process will be end. otherwise, \Yaf\Router will call next route in the route stack to route request.</p><br/> -<p>This method would set the route result to the parameter request, by calling \Yaf\Request_Abstract::setControllerName(), \Yaf\Request_Abstract::setActionName() and \Yaf\Request_Abstract::setModuleName().</p><br/> -<p>This method should also call \Yaf\Request_Abstract::setRouted() to make the request routed at last.</p>', -'Yaf\Route_Static::assemble' => '<p><b>\Yaf\Route_Static::assemble()</b> - Assemble a url', -'Yaf\Route_Static::route' => '`@return bool` always TRUE', -'Yaf\Router::addConfig' => '<p>Add routes defined by configs into \Yaf\Router\'s route stack</p>', -'Yaf\Router::addRoute' => '<p>by default, \Yaf\Router using a \Yaf\Route_Static as its default route. you can add new routes into router\'s route stack by calling this method.</p> -<br/> -<p>the newer route will be called before the older(route stack), and if the newer router return TRUE, the router process will be end. otherwise, the older one will be called.</p>', -'Yaf\Router::getCurrentRoute' => '<p>Get the name of the route which is effective in the route process.</p> -<br/> -<b>Note:</b> -<p>You should call this method after the route process finished, since before that, this method will always return NULL.</p>', -'Yaf\Router::getRoute' => '<p>Retrieve a route by name, see also \Yaf\Router::getCurrentRoute()</p>', -'Yaf\Router::route' => '`@return bool|\Yaf\Router` return FALSE on failure', -'Yaf\Session::del' => '`@return bool|\Yaf\Session` return FALSE on failure', -'Yaf\Session::set' => '`@return bool|\Yaf\Session` return FALSE on failure', -'Yaf\View\Simple::__get' => '<p>Retrieve assigned variable</p> -<br/> -<b>Note:</b> -<p>$name parameter can be empty since 2.1.11</p>', -'Yaf\View\Simple::__set' => '<p>This is a alternative and easier way to \Yaf\View\Simple::assign().</p>', -'Yaf\View\Simple::assign' => 'assign variable to view engine', -'Yaf\View\Simple::assignRef' => '<p>unlike \Yaf\View\Simple::assign(), this method assign a ref value to engine.</p>', -'Yaf\View\Simple::clear' => 'clear assigned variable', -'Yaf\View\Simple::display' => '<p>Render a template and display the result instantly.</p>', -'Yaf\View_Interface::assign' => 'Assign values to View engine, then the value can access directly by name in template.', -'Yaf\View_Interface::display' => 'Render a template and output the result immediately.', -'Yaf\View_Interface::render' => 'Render a template and return the result.', -'Yaf\View_Interface::setScriptPath' => 'Set the templates base directory, this is usually called by \Yaf\Dispatcher', -'Yaf_Action_Abstract::__construct' => '<b>Yaf_Controller_Abstract</b>::__construct() is final, which means it can not be overridden. You may want to see Yaf_Controller_Abstract::init() instead.', -'yaf_action_abstract::execute' => 'Action entry point', -'Yaf_Action_Abstract::forward' => '<p>forward current execution process to other action.</p> -<br/> -<b>Note:</b> -<p>this method doesn\'t switch to the destination action immediately, it will take place after current flow finish.</p> -<br/> -<b>Notice, there are 3 available method signatures:</b> -<p>Yaf_Controller_Abstract::forward ( string $module , string $controller , string $action [, array $parameters ] )</p> -<p>Yaf_Controller_Abstract::forward ( string $controller , string $action [, array $parameters ] )</p> -<p>Yaf_Controller_Abstract::forward ( string $action [, array $parameters ] )</p>', -'yaf_action_abstract::getController' => 'Retrieve controller object', -'Yaf_Action_Abstract::getModuleName' => 'get the controller\'s module name', -'Yaf_Action_Abstract::getRequest' => 'retrieve current request object', -'Yaf_Action_Abstract::getResponse' => 'retrieve current response object', -'Yaf_Action_Abstract::getView' => 'retrieve view engine', -'Yaf_Action_Abstract::init' => '<p>Yaf_Controller_Abstract::__construct() is final, which means users can not override it. but users can define <b>Yaf_Controller_Abstract::init()</b>, which will be called after controller object is instantiated.</p>', -'Yaf_Action_Abstract::redirect' => 'redirect to a URL by sending a 302 header', -'yaf_application::__clone' => 'Yaf_Application can not be cloned', -'yaf_application::__construct' => 'Yaf_Application constructor', -'yaf_application::__destruct' => 'The __destruct purpose', -'yaf_application::__sleep' => 'Yaf_Application can not be serialized', -'yaf_application::__wakeup' => 'Yaf_Application can not be unserialized', -'yaf_application::app' => 'Retrieve an Application instance', -'yaf_application::bootstrap' => 'Call bootstrap', -'yaf_application::clearLastError' => 'Clear the last error info', -'yaf_application::environ' => 'Retrieve environ', -'yaf_application::execute' => 'Execute a callback', -'yaf_application::getAppDirectory' => 'Get the application directory', -'yaf_application::getConfig' => 'Retrieve the config instance', -'yaf_application::getDispatcher' => 'Get Yaf_Dispatcher instance', -'yaf_application::getLastErrorMsg' => 'Get message of the last occurred error', -'yaf_application::getLastErrorNo' => 'Get code of last occurred error', -'yaf_application::getModules' => 'Get defined module names', -'yaf_application::run' => 'Start Yaf_Application', -'yaf_application::setAppDirectory' => 'Change the application directory', -'yaf_config_abstract::get' => 'Getter', -'yaf_config_abstract::readonly' => 'Find a config whether readonly', -'yaf_config_abstract::set' => 'Setter', -'yaf_config_abstract::toArray' => 'Cast to array', -'yaf_config_ini::__construct' => 'Yaf_Config_Ini constructor', -'yaf_config_ini::__get' => 'Retrieve a element', -'yaf_config_ini::__isset' => 'Determine if a key is exists', -'yaf_config_ini::__set' => 'The __set purpose', -'yaf_config_ini::count' => 'Count all elements in Yaf_Config.ini', -'yaf_config_ini::current' => 'Retrieve the current value', -'yaf_config_ini::key' => 'Fetch current element\'s key', -'yaf_config_ini::next' => 'Advance the internal pointer', -'yaf_config_ini::offsetExists' => 'The offsetExists purpose', -'yaf_config_ini::offsetGet' => 'The offsetGet purpose', -'yaf_config_ini::offsetSet' => 'The offsetSet purpose', -'yaf_config_ini::offsetUnset' => 'The offsetUnset purpose', -'yaf_config_ini::readonly' => 'The readonly purpose', -'yaf_config_ini::rewind' => 'The rewind purpose', -'yaf_config_ini::toArray' => 'Return config as a PHP array', -'yaf_config_ini::valid' => 'The valid purpose', -'yaf_config_simple::__construct' => 'The __construct purpose', -'yaf_config_simple::__get' => 'The __get purpose', -'yaf_config_simple::__isset' => 'The __isset purpose', -'yaf_config_simple::__set' => 'The __set purpose', -'yaf_config_simple::count' => 'The count purpose', -'yaf_config_simple::current' => 'The current purpose', -'yaf_config_simple::key' => 'The key purpose', -'yaf_config_simple::next' => 'The next purpose', -'yaf_config_simple::offsetExists' => 'The offsetExists purpose', -'yaf_config_simple::offsetGet' => 'The offsetGet purpose', -'yaf_config_simple::offsetSet' => 'The offsetSet purpose', -'yaf_config_simple::offsetUnset' => 'The offsetUnset purpose', -'yaf_config_simple::readonly' => 'The readonly purpose', -'yaf_config_simple::rewind' => 'The rewind purpose', -'yaf_config_simple::toArray' => 'Returns a PHP array', -'yaf_config_simple::valid' => 'The valid purpose', -'yaf_controller_abstract::__clone' => 'Yaf_Controller_Abstract can not be cloned', -'yaf_controller_abstract::__construct' => 'Yaf_Controller_Abstract constructor', -'yaf_controller_abstract::display' => 'The display purpose', -'yaf_controller_abstract::forward' => 'Forward to another action', -'yaf_controller_abstract::getInvokeArg' => 'The getInvokeArg purpose', -'yaf_controller_abstract::getInvokeArgs' => 'The getInvokeArgs purpose', -'yaf_controller_abstract::getModuleName' => 'Get module name', -'yaf_controller_abstract::getRequest' => 'Retrieve current request object', -'yaf_controller_abstract::getResponse' => 'Retrieve current response object', -'yaf_controller_abstract::getView' => 'Retrieve the view engine', -'yaf_controller_abstract::getViewpath' => 'The getViewpath purpose', -'yaf_controller_abstract::init' => 'Controller initializer', -'yaf_controller_abstract::initView' => 'The initView purpose', -'yaf_controller_abstract::redirect' => 'Redirect to a URL', -'yaf_controller_abstract::render' => 'Render view template', -'yaf_controller_abstract::setViewpath' => 'The setViewpath purpose', -'yaf_dispatcher::__clone' => 'Yaf_Dispatcher can not be cloned', -'yaf_dispatcher::__construct' => 'Yaf_Dispatcher constructor', -'yaf_dispatcher::__sleep' => 'Yaf_Dispatcher can not be serialized', -'yaf_dispatcher::__wakeup' => 'Yaf_Dispatcher can not be unserialized', -'yaf_dispatcher::autoRender' => 'Switch on/off autorendering', -'yaf_dispatcher::catchException' => 'Switch on/off exception catching', -'yaf_dispatcher::disableView' => 'Disable view rendering', -'yaf_dispatcher::dispatch' => 'Dispatch a request', -'yaf_dispatcher::enableView' => 'Enable view rendering', -'yaf_dispatcher::flushInstantly' => 'Switch on/off the instant flushing', -'yaf_dispatcher::getApplication' => 'Retrieve the application', -'yaf_dispatcher::getInstance' => 'Retrieve the dispatcher instance', -'yaf_dispatcher::getRequest' => 'Retrieve the request instance', -'yaf_dispatcher::getRouter' => 'Retrieve router instance', -'yaf_dispatcher::initView' => 'Initialize view and return it', -'yaf_dispatcher::registerPlugin' => 'Register a plugin', -'yaf_dispatcher::returnResponse' => 'The returnResponse purpose', -'yaf_dispatcher::setDefaultAction' => 'Change default action name', -'yaf_dispatcher::setDefaultController' => 'Change default controller name', -'yaf_dispatcher::setDefaultModule' => 'Change default module name', -'yaf_dispatcher::setErrorHandler' => 'Set error handler', -'yaf_dispatcher::setRequest' => 'The setRequest purpose', -'yaf_dispatcher::setView' => 'Set a custom view engine', -'yaf_dispatcher::throwException' => 'Switch on/off exception throwing', -'yaf_exception::__construct' => 'The __construct purpose', -'yaf_exception::getPrevious' => 'The getPrevious purpose', -'yaf_loader::__clone' => 'The __clone purpose', -'yaf_loader::__construct' => 'The __construct purpose', -'yaf_loader::__sleep' => 'The __sleep purpose', -'yaf_loader::__wakeup' => 'The __wakeup purpose', -'yaf_loader::autoload' => 'The autoload purpose', -'yaf_loader::clearLocalNamespace' => 'The clearLocalNamespace purpose', -'yaf_loader::getInstance' => 'The getInstance purpose', -'yaf_loader::getLibraryPath' => 'Get the library path', -'yaf_loader::getLocalNamespace' => 'The getLocalNamespace purpose', -'yaf_loader::import' => 'The import purpose', -'yaf_loader::isLocalName' => 'The isLocalName purpose', -'yaf_loader::registerLocalNamespace' => 'Register local class prefix', -'yaf_loader::setLibraryPath' => 'Change the library path', -'yaf_plugin_abstract::dispatchLoopShutdown' => 'The dispatchLoopShutdown purpose', -'yaf_plugin_abstract::dispatchLoopStartup' => 'Hook before dispatch loop', -'yaf_plugin_abstract::postDispatch' => 'The postDispatch purpose', -'yaf_plugin_abstract::preDispatch' => 'The preDispatch purpose', -'yaf_plugin_abstract::preResponse' => 'The preResponse purpose', -'yaf_plugin_abstract::routerShutdown' => 'The routerShutdown purpose', -'yaf_plugin_abstract::routerStartup' => 'RouterStartup hook', -'yaf_registry::__clone' => 'The __clone purpose', -'yaf_registry::__construct' => 'Yaf_Registry implements singleton', -'yaf_registry::del' => 'Remove an item from registry', -'yaf_registry::get' => 'Retrieve an item from registry', -'yaf_registry::has' => 'Check whether an item exists', -'yaf_registry::set' => 'Add an item into registry', -'yaf_request_abstract::getActionName' => 'The getActionName purpose', -'yaf_request_abstract::getBaseUri' => 'The getBaseUri purpose', -'yaf_request_abstract::getControllerName' => 'The getControllerName purpose', -'yaf_request_abstract::getEnv' => 'Retrieve ENV varialbe', -'yaf_request_abstract::getException' => 'The getException purpose', -'yaf_request_abstract::getLanguage' => 'Retrieve client\'s preferred language', -'yaf_request_abstract::getMethod' => 'Retrieve the request method', -'yaf_request_abstract::getModuleName' => 'The getModuleName purpose', -'yaf_request_abstract::getParam' => 'Retrieve calling parameter', -'yaf_request_abstract::getParams' => 'Retrieve all calling parameters', -'yaf_request_abstract::getRequestUri' => 'The getRequestUri purpose', -'yaf_request_abstract::getServer' => 'Retrieve SERVER variable', -'yaf_request_abstract::isCli' => 'Determine if request is CLI request', -'yaf_request_abstract::isDispatched' => 'Determine if the request is dispatched', -'yaf_request_abstract::isGet' => 'Determine if request is GET request', -'yaf_request_abstract::isHead' => 'Determine if request is HEAD request', -'yaf_request_abstract::isOptions' => 'Determine if request is OPTIONS request', -'yaf_request_abstract::isPost' => 'Determine if request is POST request', -'yaf_request_abstract::isPut' => 'Determine if request is PUT request', -'yaf_request_abstract::isRouted' => 'Determine if request has been routed', -'yaf_request_abstract::isXmlHttpRequest' => 'Determine if request is AJAX request', -'yaf_request_abstract::setActionName' => 'The setActionName purpose', -'yaf_request_abstract::setBaseUri' => 'Set base URI', -'yaf_request_abstract::setControllerName' => 'The setControllerName purpose', -'yaf_request_abstract::setDispatched' => 'The setDispatched purpose', -'yaf_request_abstract::setModuleName' => 'The setModuleName purpose', -'yaf_request_abstract::setParam' => 'Set a calling parameter to a request', -'yaf_request_abstract::setRequestUri' => 'The setRequestUri purpose', -'yaf_request_abstract::setRouted' => 'The setRouted purpose', -'yaf_request_http::__clone' => 'Yaf_Request_Http can not be cloned', -'yaf_request_http::__construct' => 'Constructor of Yaf_Request_Http', -'yaf_request_http::get' => 'Retrieve variable from client', -'yaf_request_http::getCookie' => 'Retrieve Cookie variable', -'Yaf_Request_Http::getEnv' => 'Retrieve $_ENV variable', -'yaf_request_http::getFiles' => 'The getFiles purpose', -'yaf_request_http::getPost' => 'Retrieve POST variable', -'yaf_request_http::getQuery' => 'Fetch a query parameter', -'yaf_request_http::getRaw' => 'Retrieve Raw request body', -'yaf_request_http::getRequest' => 'The getRequest purpose', -'Yaf_Request_Http::getServer' => 'Retrieve $_SERVER variable', -'yaf_request_http::isXmlHttpRequest' => 'Determine if request is Ajax Request', -'Yaf_Request_Http::setBaseUri' => '<p>Set base URI, base URI is used when doing routing, in routing phase request URI is used to route a request, while base URI is used to skip the leading part(base URI) of request URI. That is, if comes a request with request URI a/b/c, then if you set base URI to "a/b", only "/c" will be used in routing phase.</p> -<br/> -<b>Note:</b> -<p>generally, you don\'t need to set this, Yaf will determine it automatically.</p>', -'Yaf_Request_Http::setDispatched' => 'Set request as dispatched', -'Yaf_Request_Http::setRouted' => 'Set request as routed', -'yaf_request_simple::__clone' => 'The __clone purpose', -'yaf_request_simple::__construct' => 'Constructor of Yaf_Request_Simple', -'yaf_request_simple::get' => 'The get purpose', -'yaf_request_simple::getCookie' => 'The getCookie purpose', -'Yaf_Request_Simple::getEnv' => 'Retrieve $_ENV variable', -'yaf_request_simple::getFiles' => 'The getFiles purpose', -'yaf_request_simple::getPost' => 'The getPost purpose', -'yaf_request_simple::getQuery' => 'The getQuery purpose', -'yaf_request_simple::getRequest' => 'The getRequest purpose', -'Yaf_Request_Simple::getServer' => 'Retrieve $_SERVER variable', -'yaf_request_simple::isXmlHttpRequest' => 'Determine if request is AJAX request', -'Yaf_Request_Simple::setBaseUri' => '<p>Set base URI, base URI is used when doing routing, in routing phase request URI is used to route a request, while base URI is used to skip the leading part(base URI) of request URI. That is, if comes a request with request URI a/b/c, then if you set base URI to "a/b", only "/c" will be used in routing phase.</p> -<br/> -<b>Note:</b> -<p>generally, you don\'t need to set this, Yaf will determine it automatically.</p>', -'Yaf_Request_Simple::setDispatched' => 'Set request as dispatched', -'Yaf_Request_Simple::setRouted' => 'Set request as routed', -'yaf_response_abstract::__clone' => 'The __clone purpose', -'yaf_response_abstract::__construct' => 'The __construct purpose', -'yaf_response_abstract::__destruct' => 'The __destruct purpose', -'yaf_response_abstract::__toString' => 'Retrieve all bodys as string', -'yaf_response_abstract::appendBody' => 'Append to response body', -'yaf_response_abstract::clearBody' => 'Discard all exists response body', -'yaf_response_abstract::clearHeaders' => 'Discard all set headers', -'yaf_response_abstract::getBody' => 'Retrieve a exists content', -'yaf_response_abstract::getHeader' => 'The getHeader purpose', -'yaf_response_abstract::prependBody' => 'The prependBody purpose', -'yaf_response_abstract::response' => 'Send response', -'yaf_response_abstract::setAllHeaders' => 'The setAllHeaders purpose', -'yaf_response_abstract::setBody' => 'Set content to response', -'yaf_response_abstract::setHeader' => 'Set response header', -'yaf_response_abstract::setRedirect' => 'The setRedirect purpose', -'Yaf_Response_Cli::appendBody' => 'append a content to a exists content block', -'Yaf_Response_Cli::clearBody' => 'Clear existing content', -'Yaf_Response_Cli::getBody' => 'Retrieve an existing content', -'Yaf_Response_Cli::prependBody' => 'prepend a content to a exists content block', -'Yaf_Response_Cli::setBody' => 'Set content to response', -'Yaf_Response_Http::appendBody' => 'append a content to a exists content block', -'Yaf_Response_Http::clearBody' => 'Clear existing content', -'Yaf_Response_Http::getBody' => 'Retrieve an existing content', -'Yaf_Response_Http::prependBody' => 'prepend a content to a exists content block', -'Yaf_Response_Http::response' => 'send response', -'Yaf_Response_Http::setBody' => 'Set content to response', -'yaf_route_interface::assemble' => 'Assemble a request', -'yaf_route_interface::route' => 'Route a request', -'yaf_route_map::__construct' => 'The __construct purpose', -'yaf_route_map::assemble' => 'Assemble a url', -'yaf_route_map::route' => 'The route purpose', -'yaf_route_regex::__construct' => 'Yaf_Route_Regex constructor', -'Yaf_Route_Regex::addConfig' => '<p>Add routes defined by configs into Yaf_Router\'s route stack</p>', -'Yaf_Route_Regex::addRoute' => '<p>by default, Yaf_Router using a Yaf_Route_Static as its default route. you can add new routes into router\'s route stack by calling this method.</p> -<br/> -<p>the newer route will be called before the older(route stack), and if the newer router return TRUE, the router process will be end. otherwise, the older one will be called.</p>', -'yaf_route_regex::assemble' => 'Assemble a url', -'Yaf_Route_Regex::getCurrentRoute' => '<p>Get the name of the route which is effective in the route process.</p> -<br/> -<b>Note:</b> -<p>You should call this method after the route process finished, since before that, this method will always return NULL.</p>', -'Yaf_Route_Regex::getRoute' => '<p>Retrieve a route by name, see also Yaf_Router::getCurrentRoute()</p>', -'yaf_route_regex::route' => 'The route purpose', -'yaf_route_rewrite::__construct' => 'Yaf_Route_Rewrite constructor', -'Yaf_Route_Rewrite::addConfig' => '<p>Add routes defined by configs into Yaf_Router\'s route stack</p>', -'Yaf_Route_Rewrite::addRoute' => '<p>by default, Yaf_Router using a Yaf_Route_Static as its default route. you can add new routes into router\'s route stack by calling this method.</p> -<br/> -<p>the newer route will be called before the older(route stack), and if the newer router return TRUE, the router process will be end. otherwise, the older one will be called.</p>', -'yaf_route_rewrite::assemble' => 'Assemble a url', -'Yaf_Route_Rewrite::getCurrentRoute' => '<p>Get the name of the route which is effective in the route process.</p> -<br/> -<b>Note:</b> -<p>You should call this method after the route process finished, since before that, this method will always return NULL.</p>', -'Yaf_Route_Rewrite::getRoute' => '<p>Retrieve a route by name, see also Yaf_Router::getCurrentRoute()</p>', -'yaf_route_rewrite::route' => 'The route purpose', -'yaf_route_simple::__construct' => 'Yaf_Route_Simple constructor', -'yaf_route_simple::assemble' => 'Assemble a url', -'yaf_route_simple::route' => 'Route a request', -'yaf_route_static::assemble' => 'Assemble a url', -'yaf_route_static::match' => 'The match purpose', -'yaf_route_static::route' => 'Route a request', -'yaf_route_supervar::__construct' => 'The __construct purpose', -'yaf_route_supervar::assemble' => 'Assemble a url', -'yaf_route_supervar::route' => 'The route purpose', -'yaf_router::__construct' => 'Yaf_Router constructor', -'yaf_router::addConfig' => 'Add config-defined routes into Router', -'yaf_router::addRoute' => 'Add new Route into Router', -'yaf_router::getCurrentRoute' => 'Get the effective route name', -'yaf_router::getRoute' => 'Retrieve a route by name', -'yaf_router::getRoutes' => 'Retrieve registered routes', -'yaf_router::route' => 'The route purpose', -'yaf_session::__clone' => 'The __clone purpose', -'yaf_session::__construct' => 'Constructor of Yaf_Session', -'yaf_session::__get' => 'The __get purpose', -'yaf_session::__isset' => 'The __isset purpose', -'yaf_session::__set' => 'The __set purpose', -'yaf_session::__sleep' => 'The __sleep purpose', -'yaf_session::__unset' => 'The __unset purpose', -'yaf_session::__wakeup' => 'The __wakeup purpose', -'yaf_session::count' => 'The count purpose', -'yaf_session::current' => 'The current purpose', -'yaf_session::del' => 'The del purpose', -'yaf_session::getInstance' => 'The getInstance purpose', -'yaf_session::has' => 'The has purpose', -'yaf_session::key' => 'The key purpose', -'yaf_session::next' => 'The next purpose', -'yaf_session::offsetExists' => 'The offsetExists purpose', -'yaf_session::offsetGet' => 'The offsetGet purpose', -'yaf_session::offsetSet' => 'The offsetSet purpose', -'yaf_session::offsetUnset' => 'The offsetUnset purpose', -'yaf_session::rewind' => 'The rewind purpose', -'Yaf_Session::set' => '`@return bool|Yaf_Session` return FALSE on failure', -'yaf_session::start' => 'The start purpose', -'yaf_session::valid' => 'The valid purpose', -'yaf_view_interface::assign' => 'Assign value to View engine', -'yaf_view_interface::display' => 'Render and output a template', -'yaf_view_interface::getScriptPath' => 'The getScriptPath purpose', -'yaf_view_interface::render' => 'Render a template', -'yaf_view_interface::setScriptPath' => 'The setScriptPath purpose', -'yaf_view_simple::__construct' => 'Constructor of Yaf_View_Simple', -'yaf_view_simple::__get' => 'Retrieve assigned variable', -'yaf_view_simple::__isset' => 'The __isset purpose', -'yaf_view_simple::__set' => 'Set value to engine', -'yaf_view_simple::assign' => 'Assign values', -'yaf_view_simple::assignRef' => 'The assignRef purpose', -'yaf_view_simple::clear' => 'Clear Assigned values', -'yaf_view_simple::display' => 'Render and display', -'yaf_view_simple::eval' => 'Render template', -'yaf_view_simple::getScriptPath' => 'Get templates directory', -'yaf_view_simple::render' => 'Render template', -'yaf_view_simple::setScriptPath' => 'Set templates directory', -'yaml_emit' => 'Returns the YAML representation of a value', -'yaml_emit_file' => 'Send the YAML representation of a value to a file', -'yaml_parse' => 'Parse a YAML stream', -'yaml_parse_file' => 'Parse a YAML stream from a file', -'yaml_parse_url' => 'Parse a Yaml stream from a URL', -'yar_client::__call' => 'Call service', -'yar_client::__construct' => 'Create a client', -'yar_client::setOpt' => 'Set calling contexts', -'Yar_Client_Exception::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'Yar_Client_Exception::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'Yar_Client_Exception::__toString' => 'String representation of the exception', -'Yar_Client_Exception::getCode' => 'Gets the Exception code', -'Yar_Client_Exception::getFile' => 'Gets the file in which the exception occurred', -'Yar_Client_Exception::getLine' => 'Gets the line in which the exception occurred', -'Yar_Client_Exception::getMessage' => 'Gets the Exception message', -'Yar_Client_Exception::getPrevious' => 'Returns previous Exception', -'Yar_Client_Exception::getTrace' => 'Gets the stack trace', -'Yar_Client_Exception::getTraceAsString' => 'Gets the stack trace as a string', -'yar_client_exception::getType' => 'Retrieve exception\'s type', -'yar_concurrent_client::call' => 'Register a concurrent call', -'yar_concurrent_client::loop' => 'Send all calls', -'yar_concurrent_client::reset' => 'Clean all registered calls', -'yar_server::__construct' => 'Register a server', -'yar_server::handle' => 'Start RPC Server', -'Yar_Server_Exception::__clone' => 'Clone the exception -Tries to clone the Exception, which results in Fatal error.', -'Yar_Server_Exception::__construct' => 'Construct the exception. Note: The message is NOT binary safe.', -'Yar_Server_Exception::__toString' => 'String representation of the exception', -'Yar_Server_Exception::getCode' => 'Gets the Exception code', -'Yar_Server_Exception::getFile' => 'Gets the file in which the exception occurred', -'Yar_Server_Exception::getLine' => 'Gets the line in which the exception occurred', -'Yar_Server_Exception::getMessage' => 'Gets the Exception message', -'Yar_Server_Exception::getPrevious' => 'Returns previous Exception', -'Yar_Server_Exception::getTrace' => 'Gets the stack trace', -'Yar_Server_Exception::getTraceAsString' => 'Gets the stack trace as a string', -'yar_server_exception::getType' => 'Retrieve exception\'s type', -'yaz_addinfo' => 'Returns additional error information', -'yaz_ccl_conf' => 'Configure CCL parser', -'yaz_ccl_parse' => 'Invoke CCL Parser', -'yaz_close' => 'Close YAZ connection', -'yaz_connect' => 'Prepares for a connection to a Z39.50 server', -'yaz_database' => 'Specifies the databases within a session', -'yaz_element' => 'Specifies Element-Set Name for retrieval', -'yaz_errno' => 'Returns error number', -'yaz_error' => 'Returns error description', -'yaz_es' => 'Prepares for an Extended Service Request', -'yaz_es_result' => 'Inspects Extended Services Result', -'yaz_get_option' => 'Returns value of option for connection', -'yaz_hits' => 'Returns number of hits for last search', -'yaz_itemorder' => 'Prepares for Z39.50 Item Order with an ILL-Request package', -'yaz_present' => 'Prepares for retrieval (Z39.50 present)', -'yaz_range' => 'Specifies a range of records to retrieve', -'yaz_record' => 'Returns a record', -'yaz_scan' => 'Prepares for a scan', -'yaz_scan_result' => 'Returns Scan Response result', -'yaz_schema' => 'Specifies schema for retrieval', -'yaz_search' => 'Prepares for a search', -'yaz_set_option' => 'Sets one or more options for connection', -'yaz_sort' => 'Sets sorting criteria', -'yaz_syntax' => 'Specifies the preferred record syntax for retrieval', -'yaz_wait' => 'Wait for Z39.50 requests to complete', -'yp_all' => 'Traverse the map and call a function on each entry', -'yp_cat' => 'Return an array containing the entire map', -'yp_err_string' => 'Returns the error string associated with the given error code', -'yp_errno' => 'Returns the error code of the previous operation', -'yp_first' => 'Returns the first key-value pair from the named map', -'yp_get_default_domain' => 'Fetches the machine\'s default NIS domain', -'yp_master' => 'Returns the machine name of the master NIS server for a map', -'yp_match' => 'Returns the matched line', -'yp_next' => 'Returns the next key-value pair in the named map', -'yp_order' => 'Returns the order number for a map', -'zend_logo_guid' => 'Gets the Zend guid', -'zend_version' => 'Gets the version of the current Zend engine', -'ZendAPI_Job::addJobToQueue' => ' Add the job the the specified queue (without instantiating a JobQueue object) - This function should be used for extreme simplicity of the user when adding a single job, -when the user want to insert more than one job and/or manipulating other jobs (or job tasks) -he should create and use the JobQueue object - Actually what this function do is to create a new JobQueue, login to it (with the given parameters), -add this job to it and logout', -'ZendAPI_Job::getJobStatus' => 'Get the current status of the job -If this job was created and not returned from a queue (using the JobQueue::GetJob() function), - the function will return false -The status is one of the constants with the "JOB_QUEUE_STATUS_" prefix. -E.g. job was performed and failed, job is waiting etc.', -'ZendAPI_Job::getLastPerformedStatus' => 'For recurring job get the status of the last execution. For simple job, -getLastPerformedStatus is equivalent to getJobStatus. -jobs that haven\'t been executed yet will return STATUS_WAITING', -'ZendAPI_Job::getOutput' => 'Get the job output', -'ZendAPI_Job::getProperties' => 'Get the job properties', -'ZendAPI_Job::getTimeToNextRepeat' => 'Get how much seconds there are until the next time the job will run. -If the job is not recurrence or it past its end time, then return 0.', -'ZendAPI_Job::setJobPriority' => 'Set a new priority to the job', -'ZendAPI_Job::ZendAPI_Job' => 'Instantiate a Job object, describe all the information and properties of a job', -'ZendAPI_Queue::addJob' => ' Insert a new job to the queue, the Job is passed by reference because -its new job ID and status will be set in the Job object - If the returned job id is 0 it means the job could be added to the queue', -'ZendAPI_Queue::getAllApplicationIDs' => 'Return all the application ids exists in queue.', -'ZendAPI_Queue::getAllhosts' => 'Return all the hosts that jobs were submitted from.', -'ZendAPI_Queue::getHistoricJobs' => 'Return finished jobs (either failed or successed) between time range allowing paging. -Jobs are sorted by job id descending.', -'ZendAPI_Queue::getJob' => 'Return a Job object that describing a job in the queue', -'ZendAPI_Queue::getJobsInQueue' => 'Return a list of jobs in the queue according to the options given in the filter_options parameter, doesn\'t return jobs in "final states" (failed, complete) -If application id is set for this queue, only jobs with this application id will be returned', -'ZendAPI_Queue::getLastError' => 'Return description of the last error occurred in the queue object. After every - method invoked an error string describing the error is store in the queue object.', -'ZendAPI_Queue::getNumOfJobsInQueue' => 'Return the number of jobs in the queue according to the options given in the filter_options parameter', -'ZendAPI_Queue::getStatistics' => 'returns job statistics', -'ZendAPI_Queue::isScriptExists' => 'Returns whether a script exists in the document root', -'ZendAPI_Queue::isSuspend' => 'Returns whether the queue is suspended', -'ZendAPI_Queue::login' => 'Open a connection to a job queue', -'ZendAPI_Queue::removeJob' => 'Remove a job from the queue', -'ZendAPI_Queue::requeueJob' => 'Requeue failed job back to the queue.', -'ZendAPI_Queue::resumeJob' => 'Resume a suspended job in the queue', -'ZendAPI_Queue::resumeQueue' => 'Resumes queue operation', -'ZendAPI_Queue::setMaxHistoryTime' => 'Sets a new maximum time for keeping historic jobs', -'ZendAPI_Queue::suspendJob' => 'Suspend a job in the queue (without removing it)', -'ZendAPI_Queue::suspendQueue' => 'Suspends queue operation', -'ZendAPI_Queue::updateJob' => ' Update an existing job in the queue with it\'s new properties. If job doesn\'t exists, -a new job will be added. Job is passed by reference and it\'s updated from the queue.', -'ZendAPI_Queue::zendapi_queue' => 'Constructor for a job queue connection', -'zip_close' => 'Close a ZIP file archive', -'zip_entry_close' => 'Close a directory entry', -'zip_entry_compressedsize' => 'Retrieve the compressed size of a directory entry', -'zip_entry_compressionmethod' => 'Retrieve the compression method of a directory entry', -'zip_entry_filesize' => 'Retrieve the actual file size of a directory entry', -'zip_entry_name' => 'Retrieve the name of a directory entry', -'zip_entry_open' => 'Open a directory entry for reading', -'zip_entry_read' => 'Read from an open directory entry', -'zip_open' => 'Open a ZIP file archive', -'zip_read' => 'Read next entry in a ZIP file archive', -'ziparchive::addEmptyDir' => 'Add a new directory', -'ziparchive::addFile' => 'Adds a file to a ZIP archive from the given path', -'ziparchive::addFromString' => 'Add a file to a ZIP archive using its contents', -'ziparchive::addGlob' => 'Add files from a directory by glob pattern', -'ziparchive::addPattern' => 'Add files from a directory by PCRE pattern', -'ziparchive::close' => 'Close the active archive (opened or newly created)', -'ziparchive::count' => 'Counts the number of files in the archive', -'ziparchive::deleteIndex' => 'Delete an entry in the archive using its index', -'ziparchive::deleteName' => 'Delete an entry in the archive using its name', -'ziparchive::extractTo' => 'Extract the archive contents', -'ziparchive::getArchiveComment' => 'Returns the Zip archive comment', -'ziparchive::getCommentIndex' => 'Returns the comment of an entry using the entry index', -'ziparchive::getCommentName' => 'Returns the comment of an entry using the entry name', -'ziparchive::getExternalAttributesIndex' => 'Retrieve the external attributes of an entry defined by its index', -'ziparchive::getExternalAttributesName' => 'Retrieve the external attributes of an entry defined by its name', -'ziparchive::getFromIndex' => 'Returns the entry contents using its index', -'ziparchive::getFromName' => 'Returns the entry contents using its name', -'ziparchive::getNameIndex' => 'Returns the name of an entry using its index', -'ziparchive::getStatusString' => 'Returns the status error message, system and/or zip messages', -'ziparchive::getStream' => 'Get a file handler to the entry defined by its name (read only)', -'ziparchive::locateName' => 'Returns the index of the entry in the archive', -'ziparchive::open' => 'Open a ZIP file archive', -'ziparchive::renameIndex' => 'Renames an entry defined by its index', -'ziparchive::renameName' => 'Renames an entry defined by its name', -'ziparchive::setArchiveComment' => 'Set the comment of a ZIP archive', -'ziparchive::setCommentIndex' => 'Set the comment of an entry defined by its index', -'ziparchive::setCommentName' => 'Set the comment of an entry defined by its name', -'ziparchive::setCompressionIndex' => 'Set the compression method of an entry defined by its index', -'ziparchive::setCompressionName' => 'Set the compression method of an entry defined by its name', -'ziparchive::setEncryptionIndex' => 'Set the encryption method of an entry defined by its index', -'ziparchive::setEncryptionName' => 'Set the encryption method of an entry defined by its name', -'ziparchive::setExternalAttributesIndex' => 'Set the external attributes of an entry defined by its index', -'ziparchive::setExternalAttributesName' => 'Set the external attributes of an entry defined by its name', -'ziparchive::setPassword' => 'Set the password for the active archive', -'ziparchive::statIndex' => 'Get the details of an entry defined by its index', -'ziparchive::statName' => 'Get the details of an entry defined by its name', -'ziparchive::unchangeAll' => 'Undo all changes done in the archive', -'ziparchive::unchangeArchive' => 'Revert all global changes done in the archive', -'ziparchive::unchangeIndex' => 'Revert all changes done to an entry at the given index', -'ziparchive::unchangeName' => 'Revert all changes done to an entry with the given name', -'zlib_decode' => 'Uncompress any raw/gzip/zlib encoded data', -'zlib_encode' => 'Compress data with the specified encoding', -'zlib_get_coding_type' => 'Returns the coding type used for output compression', -'zmq::__construct' => 'ZMQ constructor', -'zmqcontext::__construct' => 'Construct a new ZMQContext object', -'zmqcontext::getOpt' => 'Get context option', -'zmqcontext::getSocket' => 'Create a new socket', -'zmqcontext::isPersistent' => 'Whether the context is persistent', -'zmqcontext::setOpt' => 'Set a socket option', -'zmqdevice::__construct' => 'Construct a new device', -'zmqdevice::getIdleTimeout' => 'Get the idle timeout', -'zmqdevice::getTimerTimeout' => 'Get the timer timeout', -'zmqdevice::run' => 'Run the new device', -'zmqdevice::setIdleCallback' => 'Set the idle callback function', -'zmqdevice::setIdleTimeout' => 'Set the idle timeout', -'zmqdevice::setTimerCallback' => 'Set the timer callback function', -'zmqdevice::setTimerTimeout' => 'Set the timer timeout', -'zmqpoll::add' => 'Add item to the poll set', -'zmqpoll::clear' => 'Clear the poll set', -'zmqpoll::count' => 'Count items in the poll set', -'zmqpoll::getLastErrors' => 'Get poll errors', -'zmqpoll::poll' => 'Poll the items', -'zmqpoll::remove' => 'Remove item from poll set', -'zmqsocket::__construct' => 'Construct a new ZMQSocket', -'zmqsocket::bind' => 'Bind the socket', -'zmqsocket::connect' => 'Connect the socket', -'zmqsocket::disconnect' => 'Disconnect a socket', -'zmqsocket::getEndpoints' => 'Get list of endpoints', -'zmqsocket::getPersistentId' => 'Get the persistent id', -'zmqsocket::getSocketType' => 'Get the socket type', -'zmqsocket::getSockOpt' => 'Get socket option', -'zmqsocket::isPersistent' => 'Whether the socket is persistent', -'zmqsocket::recv' => 'Receives a message', -'zmqsocket::recvMulti' => 'Receives a multipart message', -'zmqsocket::send' => 'Sends a message', -'zmqsocket::sendmulti' => 'Sends a multipart message', -'zmqsocket::setSockOpt' => 'Set a socket option', -'zmqsocket::unbind' => 'Unbind the socket', -'zookeeper::__construct' => 'Create a handle to used communicate with zookeeper', -'zookeeper::addAuth' => 'Specify application credentials', -'zookeeper::close' => 'Close the zookeeper handle and free up any resources', -'zookeeper::connect' => 'Create a handle to used communicate with zookeeper', -'zookeeper::create' => 'Create a node synchronously', -'zookeeper::delete' => 'Delete a node in zookeeper synchronously', -'zookeeper::exists' => 'Checks the existence of a node in zookeeper synchronously', -'zookeeper::get' => 'Gets the data associated with a node synchronously', -'zookeeper::getAcl' => 'Gets the acl associated with a node synchronously', -'zookeeper::getChildren' => 'Lists the children of a node synchronously', -'zookeeper::getClientId' => 'Return the client session id, only valid if the connections is currently connected (ie. last watcher state is ZOO_CONNECTED_STATE)', -'zookeeper::getConfig' => 'Get instance of ZookeeperConfig', -'zookeeper::getRecvTimeout' => 'Return the timeout for this session, only valid if the connections is currently connected (ie. last watcher state is ZOO_CONNECTED_STATE). This value may change after a server re-connect', -'zookeeper::getState' => 'Get the state of the zookeeper connection', -'zookeeper::isRecoverable' => 'Checks if the current zookeeper connection state can be recovered', -'zookeeper::set' => 'Sets the data associated with a node', -'zookeeper::setAcl' => 'Sets the acl associated with a node synchronously', -'zookeeper::setDebugLevel' => 'Sets the debugging level for the library', -'zookeeper::setDeterministicConnOrder' => 'Enable/disable quorum endpoint order randomization', -'zookeeper::setLogStream' => 'Sets the stream to be used by the library for logging', -'zookeeper::setWatcher' => 'Set a watcher function', -'zookeeper_dispatch' => 'Calls callbacks for pending operations', -'zookeeperconfig::add' => 'Add servers to the ensemble', -'zookeeperconfig::get' => 'Gets the last committed configuration of the ZooKeeper cluster as it is known to the server to which the client is connected, synchronously', -'zookeeperconfig::remove' => 'Remove servers from the ensemble', -'zookeeperconfig::set' => 'Change ZK cluster ensemble membership and roles of ensemble peers', -]; diff --git a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap.php b/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap.php deleted file mode 100644 index 2aee5ab..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap.php +++ /dev/null @@ -1,16606 +0,0 @@ -<?php // phpcs:ignoreFile -namespace Phan\Language\Internal; - -/** - * 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' => ['int', 'number'=>'int'], -'abs\'1' => ['float', 'number'=>'float'], -'accelerator_get_configuration' => ['array'], -'accelerator_get_scripts' => ['array'], -'accelerator_get_status' => ['array', 'fetch_scripts'=>'bool'], -'accelerator_reset' => [''], -'accelerator_set_status' => ['void', 'status'=>''], -'acos' => ['float', 'number'=>'float'], -'acosh' => ['float', 'number'=>'float'], -'addcslashes' => ['string', 'str'=>'string', 'charlist'=>'string'], -'addslashes' => ['string', 'str'=>'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|true'], -'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|null'], -'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|null'], -'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' => ['bool|string', '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' => ['bool|int|string', '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|bool', 'flags='=>'int'], -'AMQPQueue::getArgument' => ['bool|int|string', 'key'=>'string'], -'AMQPQueue::getArguments' => ['array'], -'AMQPQueue::getChannel' => ['AMQPChannel'], -'AMQPQueue::getConnection' => ['AMQPConnection'], -'AMQPQueue::getConsumerTag' => ['null|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', 'files='=>'array', 'user_vars='=>'array'], -'apc_bin_dumpfile' => ['int', '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', 'cache_type='=>'string', 'limited='=>'bool'], -'apc_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'], -'apc_clear_cache' => ['bool', 'cache_type='=>'string'], -'apc_compile_file' => ['mixed', 'filename'=>'string', 'atomic='=>'bool'], -'apc_dec' => ['int', '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' => ['mixed', 'keys'=>'mixed'], -'apc_exists' => ['bool', 'keys'=>'string'], -'apc_exists\'1' => ['array', 'keys'=>'string[]'], -'apc_fetch' => ['mixed', 'key'=>'mixed', '&w_success='=>'bool'], -'apc_inc' => ['int', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool'], -'apc_load_constants' => ['bool', 'key'=>'string', 'case_sensitive='=>'bool'], -'apc_sma_info' => ['array', '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'], -'APCIterator::getTotalCount' => ['int'], -'APCIterator::getTotalHits' => ['int'], -'APCIterator::getTotalSize' => ['int'], -'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>', 'limited='=>'bool'], -'apcu_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'], -'apcu_clear_cache' => ['bool'], -'apcu_dec' => ['int', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'], -'apcu_delete' => ['bool', 'key'=>'string|string[]|APCUIterator'], -'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', 'key'=>'string|string[]', '&w_success='=>'bool'], -'apcu_inc' => ['int', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'], -'apcu_key_info' => ['?array', 'key'=>'string'], -'apcu_sma_info' => ['array', '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', 'it'=>'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' => ['array<int,array<string,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' => ['array<int,array<string,mixed>>'], -'ArithmeticError::getTraceAsString' => ['string'], -'array_change_key_case' => ['array', 'input'=>'array', 'case='=>'int'], -'array_chunk' => ['array[]', 'input'=>'array', 'size'=>'int', 'preserve_keys='=>'bool'], -'array_column' => ['array', 'array'=>'array', 'column_key'=>'mixed', 'index_key='=>'mixed'], -'array_combine' => ['array|false', 'keys'=>'string[]|int[]', 'values'=>'array'], -'array_count_values' => ['int[]', 'input'=>'array'], -'array_diff' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'], -'array_diff_assoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'], -'array_diff_key' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'], -'array_diff_uassoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'], -'array_diff_uassoc\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_diff_ukey' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'key_comp_func'=>'callable(mixed,mixed):int'], -'array_diff_ukey\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_fill' => ['array', 'start_key'=>'int', 'num'=>'int', 'val'=>'mixed'], -'array_fill_keys' => ['array', 'keys'=>'array', 'val'=>'mixed'], -'array_filter' => ['array', 'input'=>'array', 'callback='=>'callable(mixed,mixed):bool|callable(mixed):bool', 'flag='=>'int'], -'array_flip' => ['array', 'input'=>'array'], -'array_intersect' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'], -'array_intersect_assoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'], -'array_intersect_key' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'], -'array_intersect_uassoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'], -'array_intersect_uassoc\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'], -'array_intersect_ukey' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'], -'array_intersect_ukey\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'], -'array_key_exists' => ['bool', 'key'=>'string|int', 'search'=>'array'], -'array_key_first' => ['int|string|null', 'array'=>'array'], -'array_key_last' => ['int|string|null', 'array'=>'array'], -'array_keys' => ['array<int,string>|array<int,int>', 'input'=>'array', 'search_value='=>'mixed', 'strict='=>'bool'], -'array_map' => ['array', 'callback'=>'?callable', 'input1'=>'array', '...args='=>'array'], -'array_merge' => ['array', 'arr1'=>'array', '...args='=>'array'], -'array_merge_recursive' => ['array', 'arr1'=>'array', '...args='=>'array'], -'array_multisort' => ['bool', '&rw_array1'=>'array', 'array1_sort_order='=>'array|int', 'array1_sort_flags='=>'array|int', '...args='=>'array|int'], -'array_pad' => ['array', 'input'=>'array', 'pad_size'=>'int', 'pad_value'=>'mixed'], -'array_pop' => ['mixed', '&rw_stack'=>'array'], -'array_product' => ['int|float', 'input'=>'array'], -'array_push' => ['int', '&rw_stack'=>'array', 'var'=>'mixed', '...vars='=>'mixed'], -'array_rand' => ['int|string|array<int,int>|array<int,string>', 'input'=>'array', 'num_req'=>'int'], -'array_rand\'1' => ['int|string', 'input'=>'array'], -'array_reduce' => ['mixed', 'input'=>'array', 'callback'=>'callable(mixed,mixed):mixed', 'initial='=>'mixed'], -'array_replace' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'], -'array_replace_recursive' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'], -'array_reverse' => ['array', 'input'=>'array', 'preserve='=>'bool'], -'array_search' => ['int|string|false', 'needle'=>'mixed', 'haystack'=>'array', 'strict='=>'bool'], -'array_shift' => ['mixed', '&rw_stack'=>'array'], -'array_slice' => ['array', 'input'=>'array', 'offset'=>'int', 'length='=>'?int', 'preserve_keys='=>'bool'], -'array_splice' => ['array', '&rw_input'=>'array', 'offset'=>'int', 'length='=>'int', 'replacement='=>'array|string'], -'array_sum' => ['int|float', 'input'=>'array'], -'array_udiff' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'], -'array_udiff\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_udiff_assoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'key_comp_func'=>'callable(mixed,mixed):int'], -'array_udiff_assoc\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_udiff_uassoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int', 'key_comp_func'=>'callable(mixed,mixed):int'], -'array_udiff_uassoc\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_uintersect' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int'], -'array_uintersect\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_uintersect_assoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int'], -'array_uintersect_assoc\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable', '...rest='=>'array|callable(mixed,mixed):int'], -'array_uintersect_uassoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int', 'key_compare_func'=>'callable(mixed,mixed):int'], -'array_uintersect_uassoc\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_unique' => ['array', 'input'=>'array', 'sort_flags='=>'int'], -'array_unshift' => ['int', '&rw_stack'=>'array', 'var'=>'mixed', '...vars='=>'mixed'], -'array_values' => ['array', 'input'=>'array'], -'array_walk' => ['bool', '&rw_input'=>'array', 'callback'=>'callable', 'userdata='=>'mixed'], -'array_walk_recursive' => ['bool', '&rw_input'=>'array', 'callback'=>'callable', 'userdata='=>'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' => ['void'], -'ArrayIterator::key' => ['int|string|false'], -'ArrayIterator::ksort' => ['void'], -'ArrayIterator::natcasesort' => ['void'], -'ArrayIterator::natsort' => ['void'], -'ArrayIterator::next' => ['void'], -'ArrayIterator::offsetExists' => ['bool', 'index'=>'string'], -'ArrayIterator::offsetGet' => ['mixed', 'index'=>'string'], -'ArrayIterator::offsetSet' => ['void', 'index'=>'string', 'newval'=>'mixed'], -'ArrayIterator::offsetUnset' => ['void', 'index'=>'string'], -'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', '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_arg'=>'array', 'sort_flags='=>'int'], -'asin' => ['float', 'number'=>'float'], -'asinh' => ['float', 'number'=>'float'], -'asort' => ['bool', '&rw_array_arg'=>'array', 'sort_flags='=>'int'], -'assert' => ['int', 'assertion'=>'string|bool', 'description='=>'string|Throwable|null'], -'assert_options' => ['mixed', 'what'=>'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', 'number'=>'float'], -'atan2' => ['float', 'y'=>'float', 'x'=>'float'], -'atanh' => ['float', 'number'=>'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' => ['array'], -'BadFunctionCallException::getTraceAsString' => ['string'], -'BadMethodCallException::__clone' => ['void'], -'BadMethodCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?BadMethodCallException'], -'BadMethodCallException::__toString' => ['string'], -'BadMethodCallException::getCode' => ['int'], -'BadMethodCallException::getFile' => ['string'], -'BadMethodCallException::getLine' => ['int'], -'BadMethodCallException::getMessage' => ['string'], -'BadMethodCallException::getPrevious' => ['?Throwable|?BadMethodCallException'], -'BadMethodCallException::getTrace' => ['array'], -'BadMethodCallException::getTraceAsString' => ['string'], -'base64_decode' => ['string|false', 'str'=>'string', 'strict='=>'bool'], -'base64_encode' => ['string', 'str'=>'string'], -'base_convert' => ['string', 'number'=>'string', 'frombase'=>'int', 'tobase'=>'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' => ['string', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'], -'bccomp' => ['int', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'], -'bcdiv' => ['string', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'], -'bcmod' => ['string', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'], -'bcmul' => ['string', 'left_operand'=>'string', 'right_operand'=>'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' => ['string', 'base'=>'string', 'exponent'=>'string', 'scale='=>'int'], -'bcpowmod' => ['string', 'base'=>'string', 'exponent'=>'string', 'modulus'=>'string', 'scale='=>'int'], -'bcscale' => ['bool', 'scale='=>'int'], -'bcsqrt' => ['string', 'operand'=>'string', 'scale='=>'int'], -'bcsub' => ['string', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'], -'bin2hex' => ['string', 'data'=>'string'], -'bind_textdomain_codeset' => ['string', 'domain'=>'string', 'codeset'=>'string'], -'bindec' => ['int', 'binary_number'=>'string'], -'bindtextdomain' => ['string', 'domain_name'=>'string', 'dir'=>'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', 'var'=>'mixed'], -'bson_decode' => ['array', 'bson'=>'string'], -'bson_encode' => ['string', 'anything'=>'mixed'], -'bzclose' => ['bool', 'bz'=>'resource'], -'bzcompress' => ['string|int', 'source'=>'string', 'blocksize100k='=>'int', 'workfactor='=>'int'], -'bzdecompress' => ['string|int', 'source'=>'string', 'small='=>'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', 'it'=>'iterator', 'flags='=>''], -'CachingIterator::__toString' => ['string'], -'CachingIterator::count' => ['int'], -'CachingIterator::current' => ['void'], -'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' => ['array', 'jd'=>'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', 'function'=>'callable', '...parameters='=>'mixed'], -'call_user_func_array' => ['mixed', 'function'=>'callable', 'parameters'=>'array<int,mixed>'], -'call_user_method' => ['mixed', 'method_name'=>'string', 'obj'=>'object', 'parameter='=>'mixed', '...args='=>'mixed'], -'call_user_method_array' => ['mixed', 'method_name'=>'string', 'obj'=>'object', 'params'=>'array<int,mixed>'], -'CallbackFilterIterator::__construct' => ['void', 'it'=>'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' => ['int|string|float|bool'], -'CallbackFilterIterator::next' => ['void'], -'CallbackFilterIterator::rewind' => ['void'], -'CallbackFilterIterator::valid' => ['bool'], -'ceil' => ['float|int', 'number'=>'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', 'host'=>'string', 'type='=>'string'], -'chgrp' => ['bool', 'filename'=>'string', 'group'=>'string|int'], -'chmod' => ['bool', 'filename'=>'string', 'mode'=>'int'], -'chop' => ['string', 'str'=>'string', 'character_mask='=>'string'], -'chown' => ['bool', 'filename'=>'string', 'user'=>'string|int'], -'chr' => ['string', 'ascii'=>'int'], -'chroot' => ['bool', 'directory'=>'string'], -'chunk_split' => ['string', 'str'=>'string', 'chunklen='=>'int', 'ending='=>'string'], -'class_alias' => ['bool', 'user_class_name'=>'string', 'alias_name'=>'string', 'autoload='=>'bool'], -'class_exists' => ['bool', 'classname'=>'string', 'autoload='=>'bool'], -'class_implements' => ['array<string,string>', 'what'=>'object|string', 'autoload='=>'bool'], -'class_parents' => ['array<string,string>', 'instance'=>'object|string', 'autoload='=>'bool'], -'class_uses' => ['array<string,string>', 'what'=>'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', 'arg'=>'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' => ['array'], -'ClosedGeneratorException::getTraceAsString' => ['string'], -'closedir' => ['void', 'dir_handle='=>'resource'], -'closelog' => ['bool'], -'Closure::__construct' => ['void'], -'Closure::__invoke' => ['', '...args='=>''], -'Closure::bind' => ['Closure', 'old'=>'Closure', 'to'=>'?object', 'scope='=>'object|string'], -'Closure::bindTo' => ['Closure', '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', 'str1'=>'string', 'str2'=>'string'], -'Collator::create' => ['Collator|null', 'locale'=>'string'], -'Collator::getAttribute' => ['int', 'attr'=>'int'], -'Collator::getErrorCode' => ['int'], -'Collator::getErrorMessage' => ['string'], -'Collator::getLocale' => ['string', 'type'=>'int'], -'Collator::getSortKey' => ['string|false', 'str'=>'string'], -'Collator::getStrength' => ['int'], -'Collator::setAttribute' => ['bool', 'attr'=>'int', 'val'=>'int'], -'Collator::setStrength' => ['bool', 'strength'=>'int'], -'Collator::sort' => ['bool', '&rw_arr'=>'array', 'sort_flags='=>'int'], -'Collator::sortWithSortKeys' => ['bool', '&rw_arr'=>'array'], -'collator_asort' => ['bool', 'coll'=>'collator', '&rw_arr'=>'array', 'sort_flag='=>'int'], -'collator_compare' => ['int', 'coll'=>'collator', 'str1'=>'string', 'str2'=>'string'], -'collator_create' => ['Collator', 'locale'=>'string'], -'collator_get_attribute' => ['int', 'coll'=>'collator', 'attr'=>'int'], -'collator_get_error_code' => ['int', 'coll'=>'collator'], -'collator_get_error_message' => ['string', 'coll'=>'collator'], -'collator_get_locale' => ['string', 'coll'=>'collator', 'type'=>'int'], -'collator_get_sort_key' => ['string', 'coll'=>'collator', 'str'=>'string'], -'collator_get_strength' => ['int', 'coll'=>'collator'], -'collator_set_attribute' => ['bool', 'coll'=>'collator', 'attr'=>'int', 'val'=>'int'], -'collator_set_strength' => ['bool', 'coll'=>'collator', 'strength'=>'int'], -'collator_sort' => ['bool', 'coll'=>'collator', '&rw_arr'=>'array', 'sort_flag='=>'int'], -'collator_sort_with_sort_keys' => ['bool', 'coll'=>'collator', '&rw_arr'=>'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', 'comobject'=>'object', 'sinkobject'=>'object', 'sinkinterface='=>'mixed'], -'com_get_active_object' => ['object', 'progid'=>'string', 'code_page='=>'int'], -'com_isenum' => ['bool', 'com_module'=>'variant'], -'com_load_typelib' => ['bool', 'typelib_name'=>'string', 'case_insensitive='=>'int'], -'com_message_pump' => ['bool', 'timeoutms='=>'int'], -'com_print_typeinfo' => ['bool', 'comobject_or_typelib'=>'object', 'dispinterface='=>'string', 'wantsink='=>'bool'], -'commonmark\cql::__invoke' => ['', 'root'=>'CommonMark\Node', 'handler'=>'callable'], -'commonmark\interfaces\ivisitable::accept' => ['void', 'visitor'=>'CommonMark\Interfaces\IVisitor'], -'commonmark\interfaces\ivisitor::enter' => ['?int|IVisitable', 'visitable'=>'IVisitable'], -'commonmark\interfaces\ivisitor::leave' => ['?int|IVisitable', 'visitable'=>'IVisitable'], -'commonmark\node::accept' => ['void', 'visitor'=>'CommonMark\Interfaces\IVisitor'], -'commonmark\node::appendChild' => ['CommonMark\Node', 'child'=>'CommonMark\Node'], -'commonmark\node::insertAfter' => ['CommonMark\Node', 'sibling'=>'CommonMark\Node'], -'commonmark\node::insertBefore' => ['CommonMark\Node', 'sibling'=>'CommonMark\Node'], -'commonmark\node::prependChild' => ['CommonMark\Node', 'child'=>'CommonMark\Node'], -'commonmark\node::replace' => ['CommonMark\Node', 'target'=>'CommonMark\Node'], -'commonmark\node::unlink' => ['void'], -'commonmark\parse' => ['CommonMark\Node', 'content'=>'string', 'options='=>'int'], -'commonmark\parser::finish' => ['CommonMark\Node'], -'commonmark\parser::parse' => ['void', 'buffer'=>'string'], -'commonmark\render' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], -'commonmark\render\html' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int'], -'commonmark\render\latex' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], -'commonmark\render\man' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int', 'width='=>'int'], -'commonmark\render\xml' => ['string', 'node'=>'CommonMark\Node', 'options='=>'int'], -'compact' => ['array', 'var_name'=>'string|array', '...var_names='=>'string|array'], -'COMPersistHelper::__construct' => ['void', 'com_object'=>'object'], -'COMPersistHelper::GetCurFile' => ['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', 'const_name'=>'string'], -'convert_cyr_string' => ['string', 'str'=>'string', 'from'=>'string', 'to'=>'string'], -'convert_uudecode' => ['string', 'data'=>'string'], -'convert_uuencode' => ['string', 'data'=>'string'], -'copy' => ['bool', 'source_file'=>'string', 'destination_file'=>'string', 'context='=>'resource'], -'cos' => ['float', 'number'=>'float'], -'cosh' => ['float', 'number'=>'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|false'], -'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|false', 'defer='=>'bool|false'], -'Couchbase\BucketManager::createN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfExist='=>'bool|false', 'defer='=>'bool|false'], -'Couchbase\BucketManager::dropN1qlIndex' => ['', 'name'=>'string', 'ignoreIfNotExist='=>'bool|false'], -'Couchbase\BucketManager::dropN1qlPrimaryIndex' => ['', 'customName='=>'string', 'ignoreIfNotExist='=>'bool|false'], -'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\DateSearchFacet', '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|false'], -'Couchbase\DateRangeSearchQuery::field' => ['Couchbase\DateRangeSearchQuery', 'field'=>'string'], -'Couchbase\DateRangeSearchQuery::jsonSerialize' => ['array'], -'Couchbase\DateRangeSearchQuery::start' => ['Couchbase\DateRangeSearchQuery', 'start'=>'int|string', 'inclusive='=>'bool|true'], -'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\NumericSearchFacet', '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|false'], -'Couchbase\NumericRangeSearchQuery::min' => ['Couchbase\NumericRangeSearchQuery', 'min'=>'float', 'inclusive='=>'bool|true'], -'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|false'], -'Couchbase\TermRangeSearchQuery::min' => ['Couchbase\TermRangeSearchQuery', 'min'=>'string', 'inclusive='=>'bool|true'], -'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|false'], -'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', 'var'=>'Countable|array', 'mode='=>'int'], -'count_chars' => ['mixed', 'input'=>'string', 'mode='=>'int'], -'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', 'str'=>'string'], -'create_function' => ['string', 'args'=>'string', 'code'=>'string'], -'crypt' => ['string', 'str'=>'string', 'salt='=>'string'], -'ctype_alnum' => ['bool', 'c'=>'string|int'], -'ctype_alpha' => ['bool', 'c'=>'string|int'], -'ctype_cntrl' => ['bool', 'c'=>'string|int'], -'ctype_digit' => ['bool', 'c'=>'string|int'], -'ctype_graph' => ['bool', 'c'=>'string|int'], -'ctype_lower' => ['bool', 'c'=>'string|int'], -'ctype_print' => ['bool', 'c'=>'string|int'], -'ctype_punct' => ['bool', 'c'=>'string|int'], -'ctype_space' => ['bool', 'c'=>'string|int'], -'ctype_upper' => ['bool', 'c'=>'string|int'], -'ctype_xdigit' => ['bool', 'c'=>'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' => ['int', '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'=>'', 'type='=>'int'], -'cubrid_fetch_assoc' => ['array', 'result'=>''], -'cubrid_fetch_field' => ['object', 'result'=>'', 'field_offset='=>'int'], -'cubrid_fetch_lengths' => ['array', 'result'=>''], -'cubrid_fetch_object' => ['object', 'result'=>'', 'class_name='=>'string', 'params='=>'array'], -'cubrid_fetch_row' => ['array', 'result'=>''], -'cubrid_field_flags' => ['string', 'result'=>'', 'field_offset'=>'int'], -'cubrid_field_len' => ['int', 'result'=>'', 'field_offset'=>'int'], -'cubrid_field_name' => ['string', 'result'=>'', 'field_offset'=>'int'], -'cubrid_field_seek' => ['bool', 'result'=>'', 'field_offset='=>'int'], -'cubrid_field_table' => ['string', 'result'=>'', 'field_offset'=>'int'], -'cubrid_field_type' => ['string', 'result'=>'', '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'=>''], -'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', 'len'=>'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'=>''], -'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' => ['int', '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'=>'', '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', 'ch'=>'resource', 'str'=>'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_errno' => ['int', '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', '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', 'code'=>'int'], -'curl_pause' => ['int', 'ch'=>'resource', 'bitmask'=>'int'], -'curl_reset' => ['void', 'ch'=>'resource'], -'curl_setopt' => ['bool', 'ch'=>'resource', 'option'=>'int', 'value'=>'mixed'], -'curl_setopt_array' => ['bool', 'ch'=>'resource', 'options'=>'array'], -'curl_share_close' => ['void', 'sh'=>'resource'], -'curl_share_errno' => ['int', 'sh'=>'resource'], -'curl_share_init' => ['resource'], -'curl_share_setopt' => ['bool', 'sh'=>'resource', 'option'=>'int', 'value'=>'string'], -'curl_share_strerror' => ['string', 'code'=>'int'], -'curl_strerror' => ['string', 'code'=>'int'], -'curl_unescape' => ['string', 'ch'=>'resource', 'str'=>'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'], -'current' => ['mixed', 'array_arg'=>'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', 'time='=>'string', 'timezone='=>'?DateTimeZone'], -'date_create_from_format' => ['DateTime|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'DateTimeZone'], -'date_create_immutable' => ['DateTimeImmutable|false', 'time='=>'string', 'timezone='=>'?DateTimeZone'], -'date_create_immutable_from_format' => ['DateTimeImmutable', 'format'=>'string', 'time'=>'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', 'timezone_identifier'=>'string'], -'date_diff' => ['DateInterval', 'obj1'=>'DateTimeInterface', 'obj2'=>'DateTimeInterface', 'absolute='=>'bool'], -'date_format' => ['string', 'obj'=>'DateTimeInterface', 'format'=>'string'], -'date_get_last_errors' => ['array'], -'date_interval_create_from_date_string' => ['DateInterval', 'time'=>'string'], -'date_interval_format' => ['string', 'object'=>'DateInterval', 'format'=>'string'], -'date_isodate_set' => ['DateTime|false', 'object'=>'DateTime', 'year'=>'int', 'week'=>'int', 'day='=>'int|mixed'], -'date_modify' => ['DateTime|false', 'object'=>'DateTime', 'modify'=>'string'], -'date_offset_get' => ['int', 'obj'=>'DateTimeInterface'], -'date_parse' => ['array', 'date'=>'string'], -'date_parse_from_format' => ['array', 'format'=>'string', 'date'=>'string'], -'date_sub' => ['DateTime|false', 'object'=>'DateTime', 'interval'=>'DateInterval'], -'date_sun_info' => ['array', 'time'=>'int', 'latitude'=>'float', 'longitude'=>'float'], -'date_sunrise' => ['mixed', 'time'=>'int', 'format='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'gmt_offset='=>'float'], -'date_sunset' => ['mixed', 'time'=>'int', 'format='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'gmt_offset='=>'float'], -'date_time_set' => ['DateTime|false', 'object'=>'DateTime', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'], -'date_timestamp_get' => ['int', 'obj'=>'DateTimeInterface'], -'date_timestamp_set' => ['DateTime|false', 'object'=>'DateTime', 'unixtimestamp'=>'int'], -'date_timezone_get' => ['DateTimeZone', 'obj'=>'DateTimeInterface'], -'date_timezone_set' => ['DateTime|false', 'object'=>'DateTime', 'timezone'=>'DateTimeZone'], -'datefmt_create' => ['IntlDateFormatter', 'locale'=>'string', 'datetype'=>'int', 'timetype'=>'int', 'timezone='=>'string|IntlTimeZone|DateTimeZone|null', 'calendar='=>'int|IntlCalendar|null', 'pattern='=>'string'], -'datefmt_format' => ['string', 'fmt'=>'IntlDateFormatter', 'value'=>'DateTime|IntlCalendar|array|int'], -'datefmt_format_object' => ['string', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'], -'datefmt_get_calendar' => ['int', 'fmt'=>'IntlDateFormatter'], -'datefmt_get_calendar_object' => ['IntlCalendar', 'fmt'=>'IntlDateFormatter'], -'datefmt_get_datetype' => ['int', 'fmt'=>'IntlDateFormatter'], -'datefmt_get_error_code' => ['int', 'fmt'=>'IntlDateFormatter'], -'datefmt_get_error_message' => ['string', 'fmt'=>'IntlDateFormatter'], -'datefmt_get_locale' => ['string', 'fmt'=>'IntlDateFormatter', 'which='=>'int'], -'datefmt_get_pattern' => ['string', 'fmt'=>'IntlDateFormatter'], -'datefmt_get_timetype' => ['int', 'fmt'=>'IntlDateFormatter'], -'datefmt_get_timezone' => ['IntlTimeZone'], -'datefmt_get_timezone_id' => ['string', 'fmt'=>'IntlDateFormatter'], -'datefmt_is_lenient' => ['bool', 'fmt'=>'IntlDateFormatter'], -'datefmt_localtime' => ['array|bool', 'fmt'=>'IntlDateFormatter', 'text_to_parse='=>'string', '&rw_parse_pos='=>'int'], -'datefmt_parse' => ['int|false', 'fmt'=>'IntlDateFormatter', 'text_to_parse='=>'string', '&rw_parse_pos='=>'int'], -'datefmt_set_calendar' => ['bool', 'fmt'=>'IntlDateFormatter', 'which'=>'int'], -'datefmt_set_lenient' => ['?bool', 'fmt'=>'IntlDateFormatter', 'lenient'=>'bool'], -'datefmt_set_pattern' => ['bool', 'fmt'=>'IntlDateFormatter', 'pattern'=>'string'], -'datefmt_set_timezone' => ['bool', 'zone'=>'mixed'], -'datefmt_set_timezone_id' => ['bool', 'fmt'=>'IntlDateFormatter', 'zone'=>'string'], -'DateInterval::__construct' => ['void', 'spec'=>'string'], -'DateInterval::__set_state' => ['DateInterval', 'array'=>'array'], -'DateInterval::__wakeup' => ['void'], -'DateInterval::createFromDateString' => ['DateInterval', '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', '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', 'datetime'=>'DateTimeImmutable'], -'DateTime::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], -'DateTime::format' => ['string', 'format'=>'string'], -'DateTime::getLastErrors' => ['array'], -'DateTime::getOffset' => ['int'], -'DateTime::getTimestamp' => ['int'], -'DateTime::getTimezone' => ['DateTimeZone'], -'DateTime::modify' => ['static', 'modify'=>'string'], -'DateTime::setDate' => ['static', 'year'=>'int', 'month'=>'int', 'day'=>'int'], -'DateTime::setISODate' => ['static', 'year'=>'int', 'week'=>'int', 'day='=>'int'], -'DateTime::setTime' => ['static', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'], -'DateTime::setTimestamp' => ['static', 'unixtimestamp'=>'int'], -'DateTime::setTimezone' => ['static', 'timezone'=>'DateTimeZone'], -'DateTime::sub' => ['static', 'interval'=>'DateInterval'], -'DateTimeImmutable::__construct' => ['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'], -'DateTimeImmutable::getOffset' => ['int'], -'DateTimeImmutable::getTimestamp' => ['int'], -'DateTimeImmutable::getTimezone' => ['DateTimeZone'], -'DateTimeImmutable::modify' => ['static', 'modify'=>'string'], -'DateTimeImmutable::setDate' => ['static', 'year'=>'int', 'month'=>'int', 'day'=>'int'], -'DateTimeImmutable::setISODate' => ['static', 'year'=>'int', 'week'=>'int', 'day='=>'int'], -'DateTimeImmutable::setTime' => ['static', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'], -'DateTimeImmutable::setTimestamp' => ['static', 'unixtimestamp'=>'int'], -'DateTimeImmutable::setTimezone' => ['static', 'timezone'=>'DateTimeZone'], -'DateTimeImmutable::sub' => ['static', 'interval'=>'DateInterval'], -'DateTimeInterface::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], -'DateTimeInterface::format' => ['string', 'format'=>'string'], -'DateTimeInterface::getOffset' => ['int'], -'DateTimeInterface::getTimestamp' => ['int'], -'DateTimeInterface::getTimezone' => ['DateTimeZone'], -'DateTimeZone::__construct' => ['void', 'timezone'=>'string'], -'DateTimeZone::__set_state' => ['DateTimeZone', 'array'=>'array'], -'DateTimeZone::__wakeup' => ['void'], -'DateTimeZone::getLocation' => ['array'], -'DateTimeZone::getName' => ['string'], -'DateTimeZone::getOffset' => ['int', 'datetime'=>'DateTimeInterface'], -'DateTimeZone::getTransitions' => ['array', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'], -'DateTimeZone::listAbbreviations' => ['array'], -'DateTimeZone::listIdentifiers' => ['array', 'what='=>'int', 'country='=>'string'], -'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', 'handle'=>'resource'], -'dba_delete' => ['bool', 'key'=>'string', 'handle'=>'resource'], -'dba_exists' => ['bool', 'key'=>'string', 'handle'=>'resource'], -'dba_fetch' => ['string', 'key'=>'string', 'skip'=>'int', 'handle'=>'resource'], -'dba_fetch\'1' => ['string', 'key'=>'string', 'handle'=>'resource'], -'dba_firstkey' => ['string', 'handle'=>'resource'], -'dba_handlers' => ['array', 'full_info='=>'bool'], -'dba_insert' => ['bool', 'key'=>'string', 'value'=>'string', 'handle'=>'resource'], -'dba_key_split' => ['array|false', 'key'=>'string'], -'dba_list' => ['array'], -'dba_nextkey' => ['string', 'handle'=>'resource'], -'dba_open' => ['resource', 'path'=>'string', 'mode'=>'string', 'handlername='=>'string', '...args='=>'string'], -'dba_optimize' => ['bool', 'handle'=>'resource'], -'dba_popen' => ['resource', 'path'=>'string', 'mode'=>'string', 'handlername='=>'string', '...args='=>'string'], -'dba_replace' => ['bool', 'key'=>'string', 'value'=>'string', 'handle'=>'resource'], -'dba_sync' => ['bool', 'handle'=>'resource'], -'dbase_add_record' => ['bool', 'dbase_identifier'=>'int', 'record'=>'array'], -'dbase_close' => ['bool', 'dbase_identifier'=>'int'], -'dbase_create' => ['int', 'filename'=>'string', 'fields'=>'array'], -'dbase_delete_record' => ['bool', 'dbase_identifier'=>'int', 'record_number'=>'int'], -'dbase_get_header_info' => ['array', 'dbase_identifier'=>'int'], -'dbase_get_record' => ['array', 'dbase_identifier'=>'int', 'record_number'=>'int'], -'dbase_get_record_with_names' => ['array', 'dbase_identifier'=>'int', 'record_number'=>'int'], -'dbase_numfields' => ['int', 'dbase_identifier'=>'int'], -'dbase_numrecords' => ['int', 'dbase_identifier'=>'int'], -'dbase_open' => ['int', 'filename'=>'string', 'mode'=>'int'], -'dbase_pack' => ['bool', 'dbase_identifier'=>'int'], -'dbase_replace_record' => ['bool', 'dbase_identifier'=>'int', '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_name'=>'string', 'msgid'=>'string', 'category'=>'int'], -'dcngettext' => ['string', 'domain'=>'string', 'msgid1'=>'string', 'msgid2'=>'string', 'n'=>'int', 'category'=>'int'], -'deaggregate' => ['', 'object'=>'object', 'class_name='=>'string'], -'debug_backtrace' => ['array<int,array>', 'options='=>'int|bool', 'limit='=>'int'], -'debug_print_backtrace' => ['void', 'options='=>'int|bool', 'limit='=>'int'], -'debug_zval_dump' => ['void', '...var'=>'mixed'], -'debugger_connect' => [''], -'debugger_connector_pid' => [''], -'debugger_get_server_start_time' => [''], -'debugger_print' => [''], -'debugger_start_debug' => [''], -'decbin' => ['string', 'decimal_number'=>'int'], -'dechex' => ['string', 'decimal_number'=>'int'], -'decoct' => ['string', 'decimal_number'=>'int'], -'define' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'case_insensitive='=>'bool'], -'define_syslog_variables' => ['void'], -'defined' => ['bool', 'name'=>'string'], -'deflate_add' => ['string|false', 'context'=>'resource', 'data'=>'string', 'flush_mode='=>'int'], -'deflate_init' => ['resource|false', 'encoding'=>'int', 'options='=>'array'], -'deg2rad' => ['float', 'number'=>'float'], -'dgettext' => ['string', 'domain_name'=>'string', 'msgid'=>'string'], -'dio_close' => ['void', 'fd'=>'resource'], -'dio_fcntl' => ['mixed', 'fd'=>'resource', 'cmd'=>'int', 'args='=>'mixed'], -'dio_open' => ['resource', 'filename'=>'string', 'flags'=>'int', 'mode='=>'int'], -'dio_read' => ['string', 'fd'=>'resource', 'len='=>'int'], -'dio_seek' => ['int', 'fd'=>'resource', 'pos'=>'int', 'whence='=>'int'], -'dio_stat' => ['array|null', 'fd'=>'resource'], -'dio_tcsetattr' => ['bool', 'fd'=>'resource', 'options'=>'array'], -'dio_truncate' => ['bool', 'fd'=>'resource', 'offset'=>'int'], -'dio_write' => ['int', 'fd'=>'resource', 'data'=>'string', 'len='=>'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', 'path'=>'string'], -'disk_total_space' => ['float', 'path'=>'string'], -'diskfreespace' => ['float', 'path'=>'string'], -'display_disabled_function' => [''], -'dl' => ['int', 'extension_filename'=>'string'], -'dngettext' => ['string', 'domain'=>'string', 'msgid1'=>'string', 'msgid2'=>'string', 'count'=>'int'], -'dns_check_record' => ['bool', 'host'=>'string', 'type='=>'string'], -'dns_get_mx' => ['bool', 'hostname'=>'string', '&w_mxhosts'=>'array', '&w_weight'=>'array'], -'dns_get_record' => ['array|false', 'hostname'=>'string', 'type='=>'int', '&w_authns='=>'array', '&w_addtl='=>'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|false', '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' => ['array'], -'DomainException::getTraceAsString' => ['string'], -'DOMAttr::__construct' => ['void', 'name'=>'string', 'value='=>'string'], -'DOMAttr::getLineNo' => ['int'], -'DOMAttr::getNodePath' => ['?string'], -'DOMAttr::hasAttributes' => ['bool'], -'DOMAttr::hasChildNodes' => ['bool'], -'DOMAttr::insertBefore' => ['DOMNode', 'newnode'=>'DOMNode', 'refnode='=>'DOMNode'], -'DOMAttr::isDefaultNamespace' => ['bool', 'namespaceuri'=>'string'], -'DOMAttr::isId' => ['bool'], -'DOMAttr::isSameNode' => ['bool', 'node'=>'DOMNode'], -'DOMAttr::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], -'DOMAttr::lookupNamespaceUri' => ['string', 'prefix'=>'string'], -'DOMAttr::lookupPrefix' => ['string', 'namespaceuri'=>'string'], -'DOMAttr::normalize' => ['void'], -'DOMAttr::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], -'DOMAttr::replaceChild' => ['DOMNode', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], -'DomAttribute::name' => ['string'], -'DomAttribute::set_value' => ['bool', 'content'=>'string'], -'DomAttribute::specified' => ['bool'], -'DomAttribute::value' => ['string'], -'DOMCdataSection::__construct' => ['void', 'value'=>'string'], -'DOMCharacterData::appendData' => ['void', 'data'=>'string'], -'DOMCharacterData::deleteData' => ['void', 'offset'=>'int', 'count'=>'int'], -'DOMCharacterData::insertData' => ['void', 'offset'=>'int', 'data'=>'string'], -'DOMCharacterData::replaceData' => ['void', 'offset'=>'int', 'count'=>'int', 'data'=>'string'], -'DOMCharacterData::substringData' => ['string', 'offset'=>'int', 'count'=>'int'], -'DOMComment::__construct' => ['void', 'value='=>'string'], -'DOMDocument::__construct' => ['void', 'version='=>'string', 'encoding='=>'string'], -'DOMDocument::createAttribute' => ['DOMAttr', 'name'=>'string'], -'DOMDocument::createAttributeNS' => ['DOMAttr', 'namespaceuri'=>'string', 'qualifiedname'=>'string'], -'DOMDocument::createCDATASection' => ['DOMCDATASection', 'data'=>'string'], -'DOMDocument::createComment' => ['DOMComment', 'data'=>'string'], -'DOMDocument::createDocumentFragment' => ['DOMDocumentFragment'], -'DOMDocument::createElement' => ['DOMElement', 'name'=>'string', 'value='=>'string'], -'DOMDocument::createElementNS' => ['DOMElement', 'namespaceuri'=>'string', 'qualifiedname'=>'string', 'value='=>'string'], -'DOMDocument::createEntityReference' => ['DOMEntityReference', 'name'=>'string'], -'DOMDocument::createProcessingInstruction' => ['DOMProcessingInstruction', 'target'=>'string', 'data='=>'string'], -'DOMDocument::createTextNode' => ['DOMText', 'content'=>'string'], -'DOMDocument::getElementById' => ['DOMElement|null', 'elementid'=>'string'], -'DOMDocument::getElementsByTagName' => ['DOMNodeList', 'name'=>'string'], -'DOMDocument::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri'=>'string', 'localname'=>'string'], -'DOMDocument::importNode' => ['DOMNode', 'importednode'=>'DOMNode', 'deep='=>'bool'], -'DOMDocument::load' => ['mixed', 'filename'=>'string', 'options='=>'int'], -'DOMDocument::loadHTML' => ['bool', 'source'=>'string', 'options='=>'int'], -'DOMDocument::loadHTMLFile' => ['bool', 'filename'=>'string', 'options='=>'int'], -'DOMDocument::loadXML' => ['mixed', 'source'=>'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', 'filename'=>'string', 'options='=>'int'], -'DOMDocument::saveHTML' => ['string|false', 'node='=>'?DOMNode'], -'DOMDocument::saveHTMLFile' => ['int', 'filename'=>'string'], -'DOMDocument::saveXML' => ['string', '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', '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', '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'], -'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', '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', 'str'=>'string', 'mode='=>'int', 'error='=>'array'], -'domxml_version' => ['string'], -'domxml_xmltree' => ['DomDocument', 'str'=>'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' => ['false|DOMNodeList', 'expression'=>'string', 'contextnode='=>'DOMNode', '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', 'class_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', 'var'=>'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', 'obj'=>'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'=>'mixed'], -'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'], -'each' => ['array', '&rw_arr'=>'array'], -'easter_date' => ['int', 'year='=>'int'], -'easter_days' => ['int', 'year='=>'int', 'method='=>'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', 'str'=>'string', 'length='=>'int', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'], -'empty' => ['bool', 'var'=>'mixed'], -'EmptyIterator::current' => ['mixed'], -'EmptyIterator::key' => ['int|string|float|bool'], -'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' => ['resource', 'dict'=>'resource'], -'enchant_broker_get_dict_path' => ['string', 'broker'=>'resource', 'dict_type'=>'int'], -'enchant_broker_get_error' => ['string', 'broker'=>'resource'], -'enchant_broker_init' => ['resource'], -'enchant_broker_list_dicts' => ['string', 'broker'=>'resource'], -'enchant_broker_request_dict' => ['resource', 'broker'=>'resource', 'tag'=>'string'], -'enchant_broker_request_pwl_dict' => ['resource', 'broker'=>'resource', 'filename'=>'string'], -'enchant_broker_set_dict_path' => ['bool', 'broker'=>'resource', 'dict_type'=>'int', 'value'=>'string'], -'enchant_broker_set_ordering' => ['bool', 'broker'=>'resource', 'tag'=>'string', 'ordering'=>'string'], -'enchant_dict_add_to_personal' => ['void', 'dict'=>'resource', 'word'=>'string'], -'enchant_dict_add_to_session' => ['void', 'dict'=>'resource', 'word'=>'string'], -'enchant_dict_check' => ['bool', 'dict'=>'resource', 'word'=>'string'], -'enchant_dict_describe' => ['array', 'dict'=>'resource'], -'enchant_dict_get_error' => ['string', 'dict'=>'resource'], -'enchant_dict_is_in_session' => ['bool', 'dict'=>'resource', 'word'=>'string'], -'enchant_dict_quick_check' => ['bool', 'dict'=>'resource', 'word'=>'string', '&w_suggestions='=>'array<int,string>'], -'enchant_dict_store_replacement' => ['void', 'dict'=>'resource', 'mis'=>'string', 'cor'=>'string'], -'enchant_dict_suggest' => ['array', 'dict'=>'resource', 'word'=>'string'], -'end' => ['mixed', '&rw_array_arg'=>'array|object'], -'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' => ['array'], -'Error::getTraceAsString' => ['string'], -'error_clear_last' => ['void'], -'error_get_last' => ['?array{type:int,message:string,file:string,line:int}'], -'error_log' => ['bool', 'message'=>'string', 'message_type='=>'int', 'destination='=>'string', 'extra_headers='=>'string'], -'error_reporting' => ['int', 'new_error_level='=>'int'], -'ErrorException::__clone' => ['void'], -'ErrorException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'severity='=>'int', 'filename='=>'string', 'lineno='=>'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' => ['array'], -'ErrorException::getTraceAsString' => ['string'], -'escapeshellarg' => ['string', 'arg'=>'string'], -'escapeshellcmd' => ['string', 'command'=>'string'], -'Ev::backend' => ['int'], -'Ev::depth' => ['int'], -'Ev::embeddableBackends' => ['void'], -'Ev::feedSignal' => ['void', 'signum'=>'int'], -'Ev::feedSignalEvent' => ['void', 'signum'=>'int'], -'Ev::iteration' => ['int'], -'Ev::now' => ['float'], -'Ev::nowUpdate' => ['void'], -'Ev::recommendedBackends' => ['void'], -'Ev::resume' => ['void'], -'Ev::run' => ['void', 'flags='=>'int'], -'Ev::sleep' => ['void', 'seconds'=>'float'], -'Ev::stop' => ['void', 'how='=>'int'], -'Ev::supportedBackends' => ['void'], -'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' => ['object', 'callback'=>'string', 'data='=>'string', 'priority='=>'string'], -'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' => ['object', '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' => ['void', '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'], -'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', 'stream'=>'resource', 'readcb'=>'mixed', 'writecb'=>'mixed', 'errorcb'=>'mixed', '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'], -'event_priority_set' => ['bool', 'event'=>'resource', 'priority'=>'int'], -'event_set' => ['bool', 'event'=>'resource', 'fd'=>'mixed', 'events'=>'int', 'callback'=>'mixed', 'arg='=>'mixed'], -'event_timer_add' => ['bool', 'event'=>'resource', 'timeout='=>'int'], -'event_timer_del' => ['bool', 'event'=>'resource'], -'event_timer_new' => ['bool|resource'], -'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', 'len'=>'int'], -'EventBuffer::copyout' => ['int', '&w_data'=>'string', 'max_bytes'=>'int'], -'EventBuffer::drain' => ['bool', 'len'=>'int'], -'EventBuffer::enableLocking' => ['void'], -'EventBuffer::expand' => ['bool', 'len'=>'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'=>'int'], -'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' => ['object', 'callback'=>'string', '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' => ['object', 'callback'=>'string', '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'=>'mixed', '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'=>'mixed', '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'=>'string', 'data='=>'string', 'priority='=>'string'], -'EvLoop::child' => ['EvChild', 'pid'=>'string', 'trace'=>'string', 'callback'=>'string', 'data='=>'string', 'priority='=>'string'], -'EvLoop::defaultLoop' => ['EvLoop', 'flags='=>'int', 'data='=>'mixed', 'io_interval='=>'float', 'timeout_interval='=>'float'], -'EvLoop::embed' => ['EvEmbed', 'other'=>'string', 'callback='=>'string', 'data='=>'string', 'priority='=>'string'], -'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'=>'mixed', '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' => ['void', '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' => ['void'], -'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' => ['array'], -'Exception::getTraceAsString' => ['string'], -'exec' => ['string', 'command'=>'string', '&w_output='=>'array', '&w_return_value='=>'int'], -'exif_imagetype' => ['int|false', 'imagefile'=>'string'], -'exif_read_data' => ['array|false', 'filename'=>'string', 'sections_needed='=>'string', 'sub_arrays='=>'bool', 'read_thumbnail='=>'bool'], -'exif_tagname' => ['string', 'index'=>'int'], -'exif_thumbnail' => ['string', 'filename'=>'string', '&w_width='=>'int', '&w_height='=>'int', '&w_imagetype='=>'int'], -'exit' => ['', 'status'=>'string|int'], -'exp' => ['float', 'number'=>'float'], -'expect_expectl' => ['int', 'expect'=>'resource', 'cases'=>'array', 'match='=>'array'], -'expect_popen' => ['resource', 'command'=>'string'], -'explode' => ['array<int,string>', 'separator'=>'string', 'str'=>'string', 'limit='=>'int'], -'expm1' => ['float', 'number'=>'float'], -'extension_loaded' => ['bool', 'extension_name'=>'string'], -'extract' => ['int', '&rw_var_array'=>'array', 'extract_type='=>'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', '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', 'ann'=>'resource'], -'fann_create_from_file' => ['resource', 'configuration_file'=>'string'], -'fann_create_shortcut' => ['reference', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], -'fann_create_shortcut_array' => ['resource', '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', 'num_layers'=>'int', 'num_neurons1'=>'int', 'num_neurons2'=>'int', '...args='=>'int'], -'fann_create_standard_array' => ['resource', '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'=>'collable'], -'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', 'ann'=>'resource', 'layer'=>'int', 'neuron'=>'int'], -'fann_get_activation_steepness' => ['float', 'ann'=>'resource', 'layer'=>'int', 'neuron'=>'int'], -'fann_get_bias_array' => ['array', 'ann'=>'resource'], -'fann_get_bit_fail' => ['int', 'ann'=>'resource'], -'fann_get_bit_fail_limit' => ['float', 'ann'=>'resource'], -'fann_get_cascade_activation_functions' => ['array', 'ann'=>'resource'], -'fann_get_cascade_activation_functions_count' => ['int', 'ann'=>'resource'], -'fann_get_cascade_activation_steepnesses' => ['array', 'ann'=>'resource'], -'fann_get_cascade_activation_steepnesses_count' => ['int', 'ann'=>'resource'], -'fann_get_cascade_candidate_change_fraction' => ['float', 'ann'=>'resource'], -'fann_get_cascade_candidate_limit' => ['float', 'ann'=>'resource'], -'fann_get_cascade_candidate_stagnation_epochs' => ['float', 'ann'=>'resource'], -'fann_get_cascade_max_cand_epochs' => ['int', 'ann'=>'resource'], -'fann_get_cascade_max_out_epochs' => ['int', 'ann'=>'resource'], -'fann_get_cascade_min_cand_epochs' => ['int', 'ann'=>'resource'], -'fann_get_cascade_min_out_epochs' => ['int', 'ann'=>'resource'], -'fann_get_cascade_num_candidate_groups' => ['int', 'ann'=>'resource'], -'fann_get_cascade_num_candidates' => ['int', 'ann'=>'resource'], -'fann_get_cascade_output_change_fraction' => ['float', 'ann'=>'resource'], -'fann_get_cascade_output_stagnation_epochs' => ['int', 'ann'=>'resource'], -'fann_get_cascade_weight_multiplier' => ['float', 'ann'=>'resource'], -'fann_get_connection_array' => ['array', 'ann'=>'resource'], -'fann_get_connection_rate' => ['float', 'ann'=>'resource'], -'fann_get_errno' => ['int', 'errdat'=>'resource'], -'fann_get_errstr' => ['string', 'errdat'=>'resource'], -'fann_get_layer_array' => ['array', 'ann'=>'resource'], -'fann_get_learning_momentum' => ['float', 'ann'=>'resource'], -'fann_get_learning_rate' => ['float', 'ann'=>'resource'], -'fann_get_MSE' => ['float', 'ann'=>'resource'], -'fann_get_network_type' => ['int', 'ann'=>'resource'], -'fann_get_num_input' => ['int', 'ann'=>'resource'], -'fann_get_num_layers' => ['int', 'ann'=>'resource'], -'fann_get_num_output' => ['int', 'ann'=>'resource'], -'fann_get_quickprop_decay' => ['float', 'ann'=>'resource'], -'fann_get_quickprop_mu' => ['float', 'ann'=>'resource'], -'fann_get_rprop_decrease_factor' => ['float', 'ann'=>'resource'], -'fann_get_rprop_delta_max' => ['float', 'ann'=>'resource'], -'fann_get_rprop_delta_min' => ['float', 'ann'=>'resource'], -'fann_get_rprop_delta_zero' => ['float|false', 'ann'=>'resource'], -'fann_get_rprop_increase_factor' => ['float', 'ann'=>'resource'], -'fann_get_sarprop_step_error_shift' => ['float', 'ann'=>'resource'], -'fann_get_sarprop_step_error_threshold_factor' => ['float', 'ann'=>'resource'], -'fann_get_sarprop_temperature' => ['float', 'ann'=>'resource'], -'fann_get_sarprop_weight_decay_shift' => ['float', 'ann'=>'resource'], -'fann_get_total_connections' => ['int', 'ann'=>'resource'], -'fann_get_total_neurons' => ['int', 'ann'=>'resource'], -'fann_get_train_error_function' => ['int', 'ann'=>'resource'], -'fann_get_train_stop_function' => ['int', 'ann'=>'resource'], -'fann_get_training_algorithm' => ['int', 'ann'=>'resource'], -'fann_init_weights' => ['bool', 'ann'=>'resource', 'train_data'=>'resource'], -'fann_length_train_data' => ['int', 'data'=>'resource'], -'fann_merge_train_data' => ['resource', 'data1'=>'resource', 'data2'=>'resource'], -'fann_num_input_train_data' => ['int', 'data'=>'resource'], -'fann_num_output_train_data' => ['int', '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', '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'=>'collable'], -'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', 'ann'=>'resource', 'data'=>'resource'], -'fann_train' => ['bool', 'ann'=>'resource', 'input'=>'array', 'desired_output'=>'array'], -'fann_train_epoch' => ['float', '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', 'fp'=>'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', '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', 'str1'=>'string', 'str2'=>'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', 'fp'=>'resource'], -'fflush' => ['bool', 'fp'=>'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', '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'], -'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', 'fp'=>'resource'], -'fgetcsv' => ['?array|?false', 'fp'=>'resource', 'length='=>'int', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'fgets' => ['string|false', 'fp'=>'resource', 'length='=>'int'], -'fgetss' => ['string|false', 'fp'=>'resource', 'length='=>'int', 'allowable_tags='=>'string'], -'file' => ['array<int,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', 'maxlen='=>'int'], -'file_put_contents' => ['int|false', 'file'=>'string', 'data'=>'mixed', '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' => ['string|SplFileInfo|FilesystemIterator'], -'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', 'type'=>'int', 'variable_name'=>'string'], -'filter_id' => ['int|false', 'filtername'=>'string'], -'filter_input' => ['mixed', 'type'=>'int', 'variable_name'=>'string', 'filter='=>'int', 'options='=>'array|int'], -'filter_input_array' => ['mixed', 'type'=>'int', 'definition='=>'int|array', 'add_empty='=>'bool'], -'filter_list' => ['array'], -'filter_var' => ['mixed', 'variable'=>'mixed', 'filter='=>'int', 'options='=>'mixed'], -'filter_var_array' => ['mixed', 'data'=>'array', 'definition='=>'mixed', 'add_empty='=>'bool'], -'FilterIterator::__construct' => ['void', 'it'=>'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::set_flags' => ['bool', 'options'=>'int'], -'finfo_buffer' => ['string|false', 'finfo'=>'resource', 'string'=>'string', 'options='=>'int', 'context='=>'resource'], -'finfo_close' => ['bool', 'finfo'=>'resource'], -'finfo_file' => ['string|false', 'finfo'=>'resource', 'file_name'=>'string', 'options='=>'int', 'context='=>'resource'], -'finfo_open' => ['resource|false', 'options='=>'int', 'arg='=>'string'], -'finfo_set_flags' => ['bool', 'finfo'=>'resource', 'options'=>'int'], -'floatval' => ['float', 'var'=>'mixed'], -'flock' => ['bool', 'fp'=>'resource', 'operation'=>'int', '&w_wouldblock='=>'int'], -'floor' => ['float', 'number'=>'float'], -'flush' => ['void'], -'fmod' => ['float', 'x'=>'float', 'y'=>'float'], -'fnmatch' => ['bool', 'pattern'=>'string', 'filename'=>'string', 'flags='=>'int'], -'fopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], -'forward_static_call' => ['mixed', 'function'=>'callable', '...parameters='=>'mixed'], -'forward_static_call_array' => ['mixed', 'function'=>'callable', 'parameters'=>'array<int,mixed>'], -'fpassthru' => ['int|false', 'fp'=>'resource'], -'fpm_get_status' => ['array'], -'fprintf' => ['int', 'stream'=>'resource', 'format'=>'string', '...args='=>'string|int|float'], -'fputcsv' => ['int|false', 'fp'=>'resource', 'fields'=>'array', 'delimiter='=>'string', 'enclosure='=>'string', 'escape_char='=>'string'], -'fputs' => ['int|false', 'fp'=>'resource', 'str'=>'string', 'length='=>'int'], -'fread' => ['string|false', 'fp'=>'resource', 'length'=>'int'], -'frenchtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], -'fribidi_log2vis' => ['string', 'str'=>'string', 'direction'=>'string', 'charset'=>'int'], -'fscanf' => ['array|int', 'stream'=>'resource', 'format'=>'string', '&...w_vars='=>'string|int|float'], -'fseek' => ['int', 'fp'=>'resource', 'offset'=>'int', 'whence='=>'int'], -'fsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_errno='=>'int', '&w_errstr='=>'string', 'timeout='=>'float'], -'fstat' => ['array|false', 'fp'=>'resource'], -'ftell' => ['int|false', 'fp'=>'resource'], -'ftok' => ['int', 'pathname'=>'string', 'proj'=>'string'], -'ftp_alloc' => ['bool', 'stream'=>'resource', 'size'=>'int', '&w_response='=>'string'], -'ftp_append' => ['bool', 'ftp'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'int'], -'ftp_cdup' => ['bool', 'stream'=>'resource'], -'ftp_chdir' => ['bool', 'stream'=>'resource', 'directory'=>'string'], -'ftp_chmod' => ['int|false', 'stream'=>'resource', 'mode'=>'int', 'filename'=>'string'], -'ftp_close' => ['bool', 'stream'=>'resource'], -'ftp_connect' => ['resource|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], -'ftp_delete' => ['bool', 'stream'=>'resource', 'file'=>'string'], -'ftp_exec' => ['bool', 'stream'=>'resource', 'command'=>'string'], -'ftp_fget' => ['bool', 'stream'=>'resource', 'fp'=>'resource', 'remote_file'=>'string', 'mode='=>'int', 'resumepos='=>'int'], -'ftp_fput' => ['bool', 'stream'=>'resource', 'remote_file'=>'string', 'fp'=>'resource', 'mode='=>'int', 'startpos='=>'int'], -'ftp_get' => ['bool', 'stream'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'mode='=>'int', 'resume_pos='=>'int'], -'ftp_get_option' => ['mixed', 'stream'=>'resource', 'option'=>'int'], -'ftp_login' => ['bool', 'stream'=>'resource', 'username'=>'string', 'password'=>'string'], -'ftp_mdtm' => ['int', 'stream'=>'resource', 'filename'=>'string'], -'ftp_mkdir' => ['string|false', 'stream'=>'resource', 'directory'=>'string'], -'ftp_mlsd' => ['array', 'ftp_stream'=>'resource', 'directory'=>'string'], -'ftp_nb_continue' => ['int', 'stream'=>'resource'], -'ftp_nb_fget' => ['int', 'stream'=>'resource', 'fp'=>'resource', 'remote_file'=>'string', 'mode='=>'int', 'resumepos='=>'int'], -'ftp_nb_fput' => ['int', 'stream'=>'resource', 'remote_file'=>'string', 'fp'=>'resource', 'mode='=>'int', 'startpos='=>'int'], -'ftp_nb_get' => ['int', 'stream'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'mode='=>'int', 'resume_pos='=>'int'], -'ftp_nb_put' => ['int', 'stream'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'int', 'startpos='=>'int'], -'ftp_nlist' => ['array|false', 'stream'=>'resource', 'directory'=>'string'], -'ftp_pasv' => ['bool', 'stream'=>'resource', 'pasv'=>'bool'], -'ftp_put' => ['bool', 'stream'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'int', 'startpos='=>'int'], -'ftp_pwd' => ['string|false', 'stream'=>'resource'], -'ftp_quit' => ['bool', 'stream'=>'resource'], -'ftp_raw' => ['array', 'stream'=>'resource', 'command'=>'string'], -'ftp_rawlist' => ['array|false', 'stream'=>'resource', 'directory'=>'string', 'recursive='=>'bool'], -'ftp_rename' => ['bool', 'stream'=>'resource', 'src'=>'string', 'dest'=>'string'], -'ftp_rmdir' => ['bool', 'stream'=>'resource', 'directory'=>'string'], -'ftp_set_option' => ['bool', 'stream'=>'resource', 'option'=>'int', 'value'=>'mixed'], -'ftp_site' => ['bool', 'stream'=>'resource', 'cmd'=>'string'], -'ftp_size' => ['int', 'stream'=>'resource', 'filename'=>'string'], -'ftp_ssl_connect' => ['resource|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'], -'ftp_systype' => ['string|false', 'stream'=>'resource'], -'ftruncate' => ['bool', 'fp'=>'resource', 'size'=>'int'], -'func_get_arg' => ['mixed', 'arg_num'=>'int'], -'func_get_args' => ['array'], -'func_num_args' => ['int'], -'function_exists' => ['bool', 'function_name'=>'string'], -'fwrite' => ['int|false', 'fp'=>'resource', 'str'=>'string', 'length='=>'int'], -'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', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], -'GearmanClient::addTaskBackground' => ['GearmanTask', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], -'GearmanClient::addTaskHigh' => ['GearmanTask', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], -'GearmanClient::addTaskHighBackground' => ['GearmanTask', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], -'GearmanClient::addTaskLow' => ['GearmanTask', 'function_name'=>'string', 'workload'=>'string', 'context='=>'mixed', 'unique='=>'string'], -'GearmanClient::addTaskLowBackground' => ['GearmanTask', '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'], -'GearmanTask::dataSize' => ['int'], -'GearmanTask::function' => ['string'], -'GearmanTask::functionName' => ['string'], -'GearmanTask::isKnown' => ['bool'], -'GearmanTask::isRunning' => ['bool'], -'GearmanTask::jobHandle' => ['string'], -'GearmanTask::recvData' => ['array', 'data_len'=>'int'], -'GearmanTask::returnCode' => ['int'], -'GearmanTask::sendData' => ['int', 'data'=>'string'], -'GearmanTask::sendWorkload' => ['int', 'data'=>'string'], -'GearmanTask::taskDenominator' => ['int'], -'GearmanTask::taskNumerator' => ['int'], -'GearmanTask::unique' => ['string'], -'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' => [''], -'Generator::getReturn' => [''], -'Generator::key' => [''], -'Generator::next' => [''], -'Generator::rewind' => [''], -'Generator::send' => ['', 'value'=>''], -'Generator::throw' => ['', 'exception'=>'Exception|Throwable'], -'Generator::valid' => ['bool'], -'geoip_asnum_by_name' => ['string', 'hostname'=>'string'], -'geoip_continent_code_by_name' => ['string', 'hostname'=>'string'], -'geoip_country_code3_by_name' => ['string', 'hostname'=>'string'], -'geoip_country_code_by_name' => ['string', 'hostname'=>'string'], -'geoip_country_name_by_name' => ['string', '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', 'hostname'=>'string'], -'geoip_netspeedcell_by_name' => ['string', 'hostname'=>'string'], -'geoip_org_by_name' => ['string', 'hostname'=>'string'], -'geoip_record_by_name' => ['array', 'hostname'=>'string'], -'geoip_region_by_name' => ['array', 'hostname'=>'string'], -'geoip_region_name_by_code' => ['string', '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' => ['mixed', 'browser_name='=>'string', 'return_array='=>'bool'], -'get_call_stack' => [''], -'get_called_class' => ['class-string'], -'get_cfg_var' => ['mixed', 'option_name'=>'string'], -'get_class' => ['class-string', 'object='=>'object'], -'get_class_methods' => ['array<int,string>', 'class'=>'mixed'], -'get_class_vars' => ['array<string,mixed>', 'class_name'=>'string'], -'get_current_user' => ['string'], -'get_declared_classes' => ['array<int,class-string>'], -'get_declared_interfaces' => ['array<int,class-string>'], -'get_declared_traits' => ['array<int,class-string>'], -'get_defined_constants' => ['array<string,int|string|float|bool|null|array|resource>', 'categorize='=>'bool'], -'get_defined_functions' => ['array<string,array<string,string>>', 'exclude_disabled='=>'bool'], -'get_defined_vars' => ['array'], -'get_extension_funcs' => ['array<int,callable-string>', 'extension_name'=>'string'], -'get_headers' => ['array|false', 'url'=>'string', 'format='=>'int', 'context='=>'resource'], -'get_html_translation_table' => ['array', 'table='=>'int', 'flags='=>'int', 'encoding='=>'string'], -'get_include_path' => ['string'], -'get_included_files' => ['array<int,string>'], -'get_loaded_extensions' => ['array<int,string>', 'zend_extensions='=>'bool'], -'get_magic_quotes_gpc' => ['bool'], -'get_magic_quotes_runtime' => ['bool'], -'get_meta_tags' => ['array', 'filename'=>'string', 'use_include_path='=>'bool'], -'get_object_vars' => ['array', 'obj'=>'object'], -'get_parent_class' => ['class-string|false', 'object='=>'mixed'], -'get_required_files' => ['string[]'], -'get_resource_type' => ['string', 'res'=>'resource'], -'get_resources' => ['array<int,resource>', 'resource_type='=>'string'], -'getallheaders' => ['array'], -'getcwd' => ['string|false'], -'getdate' => ['array', 'timestamp='=>'int'], -'getenv' => ['string|false', 'varname'=>'string', 'local_only='=>'bool'], -'getenv\'1' => ['array<string,string>'], -'gethostbyaddr' => ['string|false', 'ip_address'=>'string'], -'gethostbyname' => ['string', 'hostname'=>'string'], -'gethostbynamel' => ['array|false', 'hostname'=>'string'], -'gethostname' => ['string|false'], -'getimagesize' => ['array|false', 'imagefile'=>'string', '&w_info='=>'array'], -'getimagesizefromstring' => ['array|false', 'data'=>'string', '&w_info='=>'array'], -'getlastmod' => ['int'], -'getmxrr' => ['bool', 'hostname'=>'string', '&w_mxhosts'=>'array', '&w_weight='=>'array'], -'getmygid' => ['int'], -'getmyinode' => ['int'], -'getmypid' => ['int|false'], -'getmyuid' => ['int'], -'getopt' => ['array<string,string>|array<string,false>|array<string,array<int,mixed>>', 'options'=>'string', 'longopts='=>'array', '&w_optind='=>'int'], -'getprotobyname' => ['int|false', 'name'=>'string'], -'getprotobynumber' => ['string', 'proto'=>'int'], -'getrandmax' => ['int'], -'getrusage' => ['array', 'who='=>'int'], -'getservbyname' => ['int|false', 'service'=>'string', 'protocol'=>'string'], -'getservbyport' => ['string|false', 'port'=>'int', 'protocol'=>'string'], -'gettext' => ['string', 'msgid'=>'string'], -'gettimeofday' => ['array|float', 'get_as_float='=>'bool'], -'gettype' => ['string', 'var'=>'mixed'], -'glob' => ['array<int, 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' => ['Gmagick'], -'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' => ['mixed'], -'Gmagick::haspreviousimage' => ['mixed'], -'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'], -'GmagickDraw::getfontsize' => ['float'], -'GmagickDraw::getfontstyle' => ['int'], -'GmagickDraw::getfontweight' => ['int'], -'GmagickDraw::getstrokecolor' => ['GmagickPixel'], -'GmagickDraw::getstrokeopacity' => ['float'], -'GmagickDraw::getstrokewidth' => ['float'], -'GmagickDraw::gettextdecoration' => ['int'], -'GmagickDraw::gettextencoding' => ['string'], -'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'], -'gmmktime' => ['int', 'hour='=>'int', 'min='=>'int', 'sec='=>'int', 'mon='=>'int', 'day='=>'int', 'year='=>'int'], -'GMP::__construct' => ['void'], -'GMP::__toString' => ['string'], -'GMP::serialize' => ['string'], -'GMP::unserialize' => ['void', 'serialized'=>'string'], -'gmp_abs' => ['GMP', 'a'=>'GMP|string|int'], -'gmp_add' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_and' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_binomial' => ['GMP', 'n'=>'GMP|string|int', 'k'=>'GMP|string|int'], -'gmp_clrbit' => ['void', 'a'=>'GMP|string|int', 'index'=>'int'], -'gmp_cmp' => ['int', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_com' => ['GMP', 'a'=>'GMP|string|int'], -'gmp_div' => ['resource', 'a'=>'GMP|resource|string', 'b'=>'GMP|resource|string', 'round='=>'int'], -'gmp_div_q' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int', 'round='=>'int'], -'gmp_div_qr' => ['array', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int', 'round='=>'int'], -'gmp_div_r' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int', 'round='=>'int'], -'gmp_divexact' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_export' => ['string', 'gmpnumber'=>'GMP|string|int', 'word_size='=>'int', 'options='=>'int'], -'gmp_fact' => ['GMP', 'a'=>'int'], -'gmp_gcd' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_gcdext' => ['array', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_hamdist' => ['int', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_import' => ['GMP', 'data'=>'string', 'word_size='=>'int', 'options='=>'int'], -'gmp_init' => ['GMP', 'number'=>'int|string', 'base='=>'int'], -'gmp_intval' => ['int', 'gmpnumber'=>'GMP|string|int'], -'gmp_invert' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_jacobi' => ['int', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_kronecker' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_lcm' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_legendre' => ['int', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_mod' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_mul' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_neg' => ['GMP', 'a'=>'GMP|string|int'], -'gmp_nextprime' => ['GMP', 'a'=>'GMP|string|int'], -'gmp_or' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_perfect_power' => ['GMP', 'a'=>'GMP|string|int'], -'gmp_perfect_square' => ['bool', 'a'=>'GMP|string|int'], -'gmp_popcount' => ['int', 'a'=>'GMP|string|int'], -'gmp_pow' => ['GMP', 'base'=>'GMP|string|int', 'exp'=>'int'], -'gmp_powm' => ['GMP', 'base'=>'GMP|string|int', 'exp'=>'GMP|string|int', 'mod'=>'GMP|string|int'], -'gmp_prob_prime' => ['int', 'a'=>'GMP|string|int', 'reps='=>'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' => ['GMP', 'seed'=>'GMP|string|int'], -'gmp_root' => ['GMP', 'a'=>'GMP|string|int', 'nth'=>'int'], -'gmp_rootrem' => ['array<int,GMP>', 'a'=>'GMP|string|int', 'nth'=>'int'], -'gmp_scan0' => ['int', 'a'=>'GMP|string|int', 'start'=>'int'], -'gmp_scan1' => ['int', 'a'=>'GMP|string|int', 'start'=>'int'], -'gmp_setbit' => ['void', 'a'=>'GMP|string|int', 'index'=>'int', 'set_clear='=>'bool'], -'gmp_sign' => ['int', 'a'=>'GMP|string|int'], -'gmp_sqrt' => ['GMP', 'a'=>'GMP|string|int'], -'gmp_sqrtrem' => ['array', 'a'=>'GMP|string|int'], -'gmp_strval' => ['string', 'gmpnumber'=>'GMP|string|int', 'base='=>'int'], -'gmp_sub' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmp_testbit' => ['bool', 'a'=>'GMP|string|int', 'index'=>'int'], -'gmp_xor' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], -'gmstrftime' => ['string', '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', 'text'=>'string'], -'gnupg::decryptverify' => ['array', 'text'=>'string', '&plaintext'=>'string'], -'gnupg::encrypt' => ['string', 'plaintext'=>'string'], -'gnupg::encryptsign' => ['string', 'plaintext'=>'string'], -'gnupg::export' => ['string', 'fingerprint'=>'string'], -'gnupg::geterror' => ['string'], -'gnupg::getprotocol' => ['int'], -'gnupg::import' => ['array', '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', 'plaintext'=>'string'], -'gnupg::verify' => ['array', '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', 'str'=>'string', 'size'=>'int', 'extract_type='=>'int', 'start='=>'int', '&w_next='=>'int'], -'grapheme_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'], -'grapheme_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool'], -'grapheme_strlen' => ['int|false', 'str'=>'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', 'part='=>'bool'], -'grapheme_substr' => ['string|false', 'str'=>'string', 'start'=>'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|false'], -'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', 'zp'=>'resource'], -'gzcompress' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], -'gzdecode' => ['string|false', 'data'=>'string', 'length='=>'int'], -'gzdeflate' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'], -'gzencode' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding_mode='=>'int'], -'gzeof' => ['int', 'zp'=>'resource'], -'gzfile' => ['array', 'filename'=>'string', 'use_include_path='=>'int'], -'gzgetc' => ['string|false', 'zp'=>'resource'], -'gzgets' => ['string|false', 'zp'=>'resource', 'length='=>'int'], -'gzgetss' => ['string|false', 'zp'=>'resource', 'length'=>'int', 'allowable_tags='=>'string'], -'gzinflate' => ['string|false', 'data'=>'string', 'length='=>'int'], -'gzopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'int'], -'gzpassthru' => ['int|false', 'zp'=>'resource'], -'gzputs' => ['int', 'zp'=>'resource', 'string'=>'string', 'length='=>'int'], -'gzread' => ['string', 'zp'=>'resource', 'length'=>'int'], -'gzrewind' => ['bool', 'zp'=>'resource'], -'gzseek' => ['int', 'zp'=>'resource', 'offset'=>'int', 'whence='=>'int'], -'gztell' => ['int|false', 'zp'=>'resource'], -'gzuncompress' => ['string|false', 'data'=>'string', 'length='=>'int'], -'gzwrite' => ['int', 'zp'=>'resource', 'string'=>'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', 'algo'=>'string', 'data'=>'string', 'raw_output='=>'bool'], -'hash_algos' => ['array'], -'hash_copy' => ['HashContext', 'context'=>'HashContext'], -'hash_equals' => ['bool', 'known_string'=>'string', 'user_string'=>'string'], -'hash_file' => ['string', 'algo'=>'string', 'filename'=>'string', 'raw_output='=>'bool'], -'hash_final' => ['string', 'context'=>'HashContext', 'raw_output='=>'bool'], -'hash_hkdf' => ['string', 'algo'=>'string', 'ikm'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'], -'hash_hmac' => ['string', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'raw_output='=>'bool'], -'hash_hmac_algos' => ['array<int,string>'], -'hash_hmac_file' => ['string', 'algo'=>'string', 'filename'=>'string', 'key'=>'string', 'raw_output='=>'bool'], -'hash_init' => ['HashContext', 'algo'=>'string', 'options='=>'int', 'key='=>'string'], -'hash_pbkdf2' => ['string', 'algo'=>'string', 'password'=>'string', 'salt'=>'string', 'iterations'=>'int', 'length='=>'int', 'raw_output='=>'bool'], -'hash_update' => ['bool', 'context'=>'HashContext', 'data'=>'string'], -'hash_update_file' => ['bool', 'context'=>'HashContext', 'filename'=>'string', 'scontext='=>'?HashContext'], -'hash_update_stream' => ['int', 'context'=>'HashContext', 'handle'=>'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', 'http_response_code='=>'int'], -'header_register_callback' => ['bool', 'callback'=>'callable():void'], -'header_remove' => ['void', 'name='=>'string'], -'headers_list' => ['array<int,string>'], -'headers_sent' => ['bool', '&w_file='=>'string', '&w_line='=>'int'], -'hebrev' => ['string', 'str'=>'string', 'max_chars_per_line='=>'int'], -'hebrevc' => ['string', 'str'=>'string', 'max_chars_per_line='=>'int'], -'hex2bin' => ['string|false', 'data'=>'string'], -'hexdec' => ['int|float', 'hexadecimal_number'=>'string'], -'highlight_file' => ['string|bool', 'file_name'=>'string', 'return='=>'bool'], -'highlight_string' => ['string|bool', 'string'=>'string', 'return='=>'bool'], -'hrtime' => ['array{0:int,1:int}|int|false', 'get_as_number='=>'bool'], -'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', 'quote_style='=>'int', 'encoding='=>'string'], -'htmlentities' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string', 'double_encode='=>'bool'], -'htmlspecialchars' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string', 'double_encode='=>'bool'], -'htmlspecialchars_decode' => ['string', 'string'=>'string', 'quote_style='=>'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|false'], -'http\Env\Request::getFiles' => ['array'], -'http\Env\Request::getForm' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool|false'], -'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|false'], -'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|mixed|string', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getArray' => ['array', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getBool' => ['bool', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getFloat' => ['float', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getGlobalInstance' => ['http\QueryString'], -'http\QueryString::getInt' => ['int', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getIterator' => ['IteratorAggregate'], -'http\QueryString::getObject' => ['mixed|object', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::getString' => ['string', 'name'=>'string', 'defval='=>'mixed', 'delete='=>'bool|false'], -'http\QueryString::mod' => ['http\QueryString', 'params='=>'mixed'], -'http\QueryString::offsetExists' => ['bool', 'offset'=>'mixed'], -'http\QueryString::offsetGet' => ['mixed', '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' => ['mixed[]'], -'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', 'querydata'=>'array|object', 'prefix='=>'string', 'arg_separator='=>'string', 'enc_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', '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' => ['object', 'cookie'=>'string', 'flags='=>'int', 'allowed_extras='=>'array'], -'http_parse_headers' => ['array', 'header'=>'string'], -'http_parse_message' => ['object', 'message'=>'string'], -'http_parse_params' => ['object', 'param'=>'string', 'flags='=>'int'], -'http_persistent_handles_clean' => ['string', 'ident='=>'string'], -'http_persistent_handles_count' => ['object'], -'http_persistent_handles_ident' => ['string', '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'=>'', 'options='=>'array', 'info='=>'array'], -'http_redirect' => ['bool', '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', 'fields'=>'array', 'files'=>'array'], -'http_request_method_exists' => ['int', 'method'=>''], -'http_request_method_name' => ['string', 'method'=>'int'], -'http_request_method_register' => ['int', 'method'=>'string'], -'http_request_method_unregister' => ['bool', 'method'=>''], -'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'=>''], -'http_support' => ['int', 'feature='=>'int'], -'http_throttle' => ['', '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', 'data='=>'string'], -'HttpDeflateStream::update' => ['string', 'data'=>'string'], -'HttpInflateStream::__construct' => ['void', 'flags='=>'int'], -'HttpInflateStream::factory' => ['HttpInflateStream', 'flags='=>'int', 'class_name='=>'string'], -'HttpInflateStream::finish' => ['string', 'data='=>'string'], -'HttpInflateStream::flush' => ['string', 'data='=>'string'], -'HttpInflateStream::update' => ['string', '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'], -'HttpMessage::getRequestUrl' => ['string'], -'HttpMessage::getResponseCode' => ['int'], -'HttpMessage::getResponseStatus' => ['string'], -'HttpMessage::getType' => ['int'], -'HttpMessage::guessContentType' => ['string', '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'], -'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' => ['array', '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', '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', 'len'=>'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', 'num1'=>'float', 'num2'=>'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' => ['bool', 'blob_handle'=>'resource', 'data'=>'string'], -'ibase_blob_cancel' => ['bool', 'blob_handle'=>'resource'], -'ibase_blob_close' => ['string', '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', 'blob_handle'=>'resource', 'len'=>'int'], -'ibase_blob_import' => ['string', 'link_identifier'=>'', 'file_handle'=>''], -'ibase_blob_info' => ['array', 'link_identifier'=>'', 'blob_id'=>'string'], -'ibase_blob_info\'1' => ['array', 'blob_id'=>'string'], -'ibase_blob_open' => ['resource', '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', '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'], -'ibase_errmsg' => ['string'], -'ibase_execute' => ['resource', 'query'=>'resource', 'bind_arg='=>'mixed', '...args='=>'mixed'], -'ibase_fetch_assoc' => ['array', 'result'=>'resource', 'fetch_flags='=>'int'], -'ibase_fetch_object' => ['object', 'result'=>'resource', 'fetch_flags='=>'int'], -'ibase_fetch_row' => ['array', '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', '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', 'database='=>'string', 'username='=>'string', 'password='=>'string', 'charset='=>'string', 'buffers='=>'int', 'dialect='=>'int', 'role='=>'string'], -'ibase_prepare' => ['resource', 'link_identifier'=>'', 'query'=>'string', 'trans_identifier'=>''], -'ibase_query' => ['resource', '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', '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', 'in_charset'=>'string', 'out_charset'=>'string', 'str'=>'string'], -'iconv_get_encoding' => ['mixed', 'type='=>'string'], -'iconv_mime_decode' => ['string|false', 'encoded_string'=>'string', 'mode='=>'int', 'charset='=>'string'], -'iconv_mime_decode_headers' => ['array|false', 'headers'=>'string', 'mode='=>'int', 'charset='=>'string'], -'iconv_mime_encode' => ['string|false', 'field_name'=>'string', 'field_value'=>'string', 'preference='=>'array'], -'iconv_set_encoding' => ['bool', 'type'=>'string', 'charset'=>'string'], -'iconv_strlen' => ['int', 'str'=>'string', 'charset='=>'string'], -'iconv_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'charset='=>'string'], -'iconv_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'charset='=>'string'], -'iconv_substr' => ['string|false', 'str'=>'string', 'offset'=>'int', 'length='=>'int', 'charset='=>'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', 'options='=>'int', 'variant='=>'int', '&w_idna_info='=>'array'], -'idn_to_utf8' => ['string|false', 'domain'=>'string', 'options='=>'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'=>''], -'igbinary_unserialize' => ['', 'str'=>'string'], -'ignore_user_abort' => ['int', 'value='=>'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'], -'image_type_to_extension' => ['string', 'imagetype'=>'int', 'include_dot='=>'bool'], -'image_type_to_mime_type' => ['string', 'imagetype'=>'int'], -'imageaffine' => ['resource', 'src'=>'resource', 'affine'=>'array', 'clip='=>'array'], -'imageaffineconcat' => ['array', 'm1'=>'array', 'm2'=>'array'], -'imageaffinematrixconcat' => ['array', 'm1'=>'array', 'm2'=>'array'], -'imageaffinematrixget' => ['array', 'type'=>'int', 'options'=>'array'], -'imagealphablending' => ['bool', 'im'=>'resource', 'on'=>'bool'], -'imageantialias' => ['bool', 'im'=>'resource', 'on'=>'bool'], -'imagearc' => ['bool', 'im'=>'resource', 'cx'=>'int', 'cy'=>'int', 'w'=>'int', 'h'=>'int', 's'=>'int', 'e'=>'int', 'col'=>'int'], -'imagebmp' => ['bool', 'image'=>'resource', 'to='=>'mixed', 'compressed='=>'bool'], -'imagechar' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'c'=>'string', 'col'=>'int'], -'imagecharup' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'c'=>'string', 'col'=>'int'], -'imagecolorallocate' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'imagecolorallocatealpha' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], -'imagecolorat' => ['int', 'im'=>'resource', 'x'=>'int', 'y'=>'int'], -'imagecolorclosest' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'imagecolorclosestalpha' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], -'imagecolorclosesthwb' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'imagecolordeallocate' => ['bool', 'im'=>'resource', 'index'=>'int'], -'imagecolorexact' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'imagecolorexactalpha' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], -'imagecolormatch' => ['bool', 'im1'=>'resource', 'im2'=>'resource'], -'imagecolorresolve' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'], -'imagecolorresolvealpha' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'], -'imagecolorset' => ['void', 'im'=>'resource', 'col'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'], -'imagecolorsforindex' => ['array', 'im'=>'resource', 'col'=>'int'], -'imagecolorstotal' => ['int', 'im'=>'resource'], -'imagecolortransparent' => ['int', 'im'=>'resource', 'col='=>'int'], -'imageconvolution' => ['resource', 'src_im'=>'resource', 'matrix3x3'=>'array', 'div'=>'float', 'offset'=>'float'], -'imagecopy' => ['bool', 'dst_im'=>'resource', 'src_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_w'=>'int', 'src_h'=>'int'], -'imagecopymerge' => ['bool', 'src_im'=>'resource', 'dst_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_w'=>'int', 'src_h'=>'int', 'pct'=>'int'], -'imagecopymergegray' => ['bool', 'src_im'=>'resource', 'dst_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_w'=>'int', 'src_h'=>'int', 'pct'=>'int'], -'imagecopyresampled' => ['bool', 'dst_im'=>'resource', 'src_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_w'=>'int', 'dst_h'=>'int', 'src_w'=>'int', 'src_h'=>'int'], -'imagecopyresized' => ['bool', 'dst_im'=>'resource', 'src_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_w'=>'int', 'dst_h'=>'int', 'src_w'=>'int', 'src_h'=>'int'], -'imagecreate' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'], -'imagecreatefrombmp' => ['resource|false', 'filename'=>'string'], -'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', 'im'=>'resource', 'rect'=>'array'], -'imagecropauto' => ['resource', 'im'=>'resource', 'mode'=>'int', 'threshold'=>'float', 'color'=>'int'], -'imagedashedline' => ['bool', 'im'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'col'=>'int'], -'imagedestroy' => ['bool', 'im'=>'resource'], -'imageellipse' => ['bool', 'im'=>'resource', 'cx'=>'int', 'cy'=>'int', 'w'=>'int', 'h'=>'int', 'color'=>'int'], -'imagefill' => ['bool', 'im'=>'resource', 'x'=>'int', 'y'=>'int', 'col'=>'int'], -'imagefilledarc' => ['bool', 'im'=>'resource', 'cx'=>'int', 'cy'=>'int', 'w'=>'int', 'h'=>'int', 's'=>'int', 'e'=>'int', 'col'=>'int', 'style'=>'int'], -'imagefilledellipse' => ['bool', 'im'=>'resource', 'cx'=>'int', 'cy'=>'int', 'w'=>'int', 'h'=>'int', 'color'=>'int'], -'imagefilledpolygon' => ['bool', 'im'=>'resource', 'point'=>'array', 'num_points'=>'int', 'col'=>'int'], -'imagefilledrectangle' => ['bool', 'im'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'col'=>'int'], -'imagefilltoborder' => ['bool', 'im'=>'resource', 'x'=>'int', 'y'=>'int', 'border'=>'int', 'col'=>'int'], -'imagefilter' => ['bool', 'src_im'=>'resource', 'filtertype'=>'int', 'arg1='=>'int', 'arg2='=>'int', 'arg3='=>'int', 'arg4='=>'int'], -'imageflip' => ['bool', 'im'=>'resource', 'mode'=>'int'], -'imagefontheight' => ['int', 'font'=>'int'], -'imagefontwidth' => ['int', 'font'=>'int'], -'imageftbbox' => ['array', 'size'=>'float', 'angle'=>'float', 'font_file'=>'string', 'text'=>'string', 'extrainfo='=>'array'], -'imagefttext' => ['array', 'im'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'col'=>'int', 'font_file'=>'string', 'text'=>'string', 'extrainfo='=>'array'], -'imagegammacorrect' => ['bool', 'im'=>'resource', 'inputgamma'=>'float', 'outputgamma'=>'float'], -'imagegd' => ['bool', 'im'=>'resource', 'filename='=>'?string'], -'imagegd2' => ['bool', 'im'=>'resource', 'filename='=>'?string', 'chunk_size='=>'int', 'type='=>'int'], -'imagegetclip' => ['array', 'im'=>'resource'], -'imagegif' => ['bool', 'im'=>'resource', 'filename='=>'?string'], -'imagegrabscreen' => ['resource'], -'imagegrabwindow' => ['resource', 'window_handle'=>'int', 'client_area='=>'int'], -'imageinterlace' => ['int', 'im'=>'resource', 'interlace='=>'int'], -'imageistruecolor' => ['bool', 'im'=>'resource'], -'imagejpeg' => ['bool', 'im'=>'resource', 'filename='=>'?string', 'quality='=>'int'], -'imagelayereffect' => ['bool', 'im'=>'resource', 'effect'=>'int'], -'imageline' => ['bool', 'im'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'col'=>'int'], -'imageloadfont' => ['int', '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'=>'resource', 'points'=>'array', 'num_points'=>'int', 'color'=>'int'], -'imagepalettecopy' => ['void', 'dst'=>'resource', 'src'=>'resource'], -'imagepalettetotruecolor' => ['bool', 'src'=>'resource'], -'imagepng' => ['bool', 'im'=>'resource', 'filename='=>'?string', 'quality='=>'int', 'filters='=>'int'], -'imagepolygon' => ['bool', 'im'=>'resource', 'point'=>'array', 'num_points'=>'int', 'col'=>'int'], -'imagerectangle' => ['bool', 'im'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'col'=>'int'], -'imageresolution' => ['mixed', 'image'=>'resource', 'res_x='=>'int', 'res_y='=>'int'], -'imagerotate' => ['resource', 'src_im'=>'resource', 'angle'=>'float', 'bgdcolor'=>'int', 'ignoretransparent='=>'int'], -'imagesavealpha' => ['bool', 'im'=>'resource', 'on'=>'bool'], -'imagescale' => ['resource', 'im'=>'resource', 'new_width'=>'int', 'new_height='=>'int', 'method='=>'int'], -'imagesetbrush' => ['bool', 'image'=>'resource', 'brush'=>'resource'], -'imagesetclip' => ['bool', 'im'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int'], -'imagesetinterpolation' => ['bool', 'im'=>'resource', 'method'=>'int'], -'imagesetpixel' => ['bool', 'im'=>'resource', 'x'=>'int', 'y'=>'int', 'col'=>'int'], -'imagesetstyle' => ['bool', 'im'=>'resource', 'styles'=>'array'], -'imagesetthickness' => ['bool', 'im'=>'resource', 'thickness'=>'int'], -'imagesettile' => ['bool', 'image'=>'resource', 'tile'=>'resource'], -'imagestring' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'str'=>'string', 'col'=>'int'], -'imagestringup' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'str'=>'string', 'col'=>'int'], -'imagesx' => ['int|false', 'im'=>'resource'], -'imagesy' => ['int|false', 'im'=>'resource'], -'imagetruecolortopalette' => ['bool', 'im'=>'resource', 'ditherflag'=>'bool', 'colorswanted'=>'int'], -'imagettfbbox' => ['false|array', 'size'=>'float', 'angle'=>'float', 'font_file'=>'string', 'text'=>'string'], -'imagettftext' => ['false|array', 'im'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'col'=>'int', 'font_file'=>'string', 'text'=>'string'], -'imagetypes' => ['int'], -'imagewbmp' => ['bool', 'im'=>'resource', 'filename='=>'?string', 'foreground='=>'int'], -'imagewebp' => ['bool', 'im'=>'resource', 'filename='=>'?string', 'quality='=>'int'], -'imagexbm' => ['bool', 'im'=>'resource', 'filename'=>'?string', 'foreground='=>'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', 'image'=>'imagick', 'channeltype'=>'int', 'metrictype'=>'int'], -'Imagick::compareImageLayers' => ['Imagick', 'method'=>'int'], -'Imagick::compareImages' => ['array', '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'], -'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' => ['array', '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'], -'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'], -'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', 'channel'=>'int'], -'Imagick::getImageChannelKurtosis' => ['array', 'channel='=>'int'], -'Imagick::getImageChannelMean' => ['array', 'channel'=>'int'], -'Imagick::getImageChannelRange' => ['array', 'channel'=>'int'], -'Imagick::getImageChannelStatistics' => ['array'], -'Imagick::getImageClipMask' => ['Imagick'], -'Imagick::getImageColormapColor' => ['ImagickPixel', 'index'=>'int'], -'Imagick::getImageColors' => ['int'], -'Imagick::getImageColorspace' => ['int'], -'Imagick::getImageCompose' => ['int'], -'Imagick::getImageCompression' => ['int'], -'Imagick::getImageCompressionQuality' => ['int'], -'Imagick::getImageDelay' => ['int'], -'Imagick::getImageDepth' => ['int'], -'Imagick::getImageDispose' => ['int'], -'Imagick::getImageDistortion' => ['float', 'reference'=>'magickwand', 'metric'=>'int'], -'Imagick::getImageExtrema' => ['array'], -'Imagick::getImageFilename' => ['string'], -'Imagick::getImageFormat' => ['string'], -'Imagick::getImageGamma' => ['float'], -'Imagick::getImageGeometry' => ['array'], -'Imagick::getImageGravity' => ['int'], -'Imagick::getImageGreenPrimary' => ['array'], -'Imagick::getImageHeight' => ['int'], -'Imagick::getImageHistogram' => ['array'], -'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'], -'Imagick::getImagePixelColor' => ['ImagickPixel', 'x'=>'int', 'y'=>'int'], -'Imagick::getImageProfile' => ['string', 'name'=>'string'], -'Imagick::getImageProfiles' => ['array', 'pattern='=>'string', 'only_names='=>'bool'], -'Imagick::getImageProperties' => ['array', 'pattern='=>'string', 'only_names='=>'bool'], -'Imagick::getImageProperty' => ['string', 'name'=>'string'], -'Imagick::getImageRedPrimary' => ['array'], -'Imagick::getImageRegion' => ['Imagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'], -'Imagick::getImageRenderingIntent' => ['int'], -'Imagick::getImageResolution' => ['array'], -'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'], -'Imagick::getImageWidth' => ['int'], -'Imagick::getInterlaceScheme' => ['int'], -'Imagick::getIteratorIndex' => ['int'], -'Imagick::getNumberImages' => ['int'], -'Imagick::getOption' => ['string', 'key'=>'string'], -'Imagick::getPackageName' => ['string'], -'Imagick::getPage' => ['array'], -'Imagick::getPixelIterator' => ['ImagickPixelIterator'], -'Imagick::getPixelRegionIterator' => ['ImagickPixelIterator', 'x'=>'int', 'y'=>'int', 'columns'=>'int', 'rows'=>'int'], -'Imagick::getPointSize' => ['float'], -'Imagick::getQuantum' => ['int'], -'Imagick::getQuantumDepth' => ['array'], -'Imagick::getQuantumRange' => ['array'], -'Imagick::getRegistry' => ['string', 'key'=>'string'], -'Imagick::getReleaseDate' => ['string'], -'Imagick::getResource' => ['int', 'type'=>'int'], -'Imagick::getResourceLimit' => ['int', 'type'=>'int'], -'Imagick::getSamplingFactors' => ['array'], -'Imagick::getSize' => ['array'], -'Imagick::getSizeOffset' => ['int'], -'Imagick::getVersion' => ['array'], -'Imagick::haldClutImage' => ['bool', 'clut'=>'imagick', 'channel='=>'int'], -'Imagick::hasNextImage' => ['bool'], -'Imagick::hasPreviousImage' => ['bool'], -'Imagick::identifyFormat' => ['string|false', 'embedText'=>'string'], -'Imagick::identifyImage' => ['array', 'appendrawoutput='=>'bool'], -'Imagick::identifyImageType' => ['int'], -'Imagick::implodeImage' => ['bool', 'radius'=>'float'], -'Imagick::importImagePixels' => ['bool', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int', 'pixels'=>'array'], -'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' => ['bool', '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' => ['array', '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'=>'array'], -'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'=>'array'], -'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'], -'Imagick::tintImage' => ['bool', 'tint'=>'mixed', 'opacity'=>'mixed'], -'Imagick::transformImage' => ['Imagick', 'crop'=>'string', 'geometry'=>'string'], -'Imagick::transformImageColorspace' => ['bool', 'colorspace'=>'int'], -'Imagick::transparentPaintImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float', 'invert'=>'bool'], -'Imagick::transposeImage' => ['bool'], -'Imagick::transverseImage' => ['bool'], -'Imagick::trimImage' => ['bool', 'fuzz'=>'float'], -'Imagick::uniqueImageColors' => ['bool'], -'Imagick::unsharpMaskImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'amount'=>'float', 'threshold'=>'float', 'channel='=>'int'], -'Imagick::valid' => ['bool'], -'Imagick::vignetteImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float', 'x'=>'int', 'y'=>'int'], -'Imagick::waveImage' => ['bool', 'amplitude'=>'float', 'length'=>'float'], -'Imagick::whiteThresholdImage' => ['bool', 'threshold'=>'mixed'], -'Imagick::writeImage' => ['bool', 'filename='=>'string'], -'Imagick::writeImageFile' => ['bool', 'filehandle'=>'resource'], -'Imagick::writeImages' => ['bool', 'filename'=>'string', 'adjoin'=>'bool'], -'Imagick::writeImagesFile' => ['bool', 'filehandle'=>'resource'], -'ImagickDraw::__construct' => ['void'], -'ImagickDraw::affine' => ['bool', 'affine'=>'array'], -'ImagickDraw::annotation' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'], -'ImagickDraw::arc' => ['bool', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float', 'sd'=>'float', 'ed'=>'float'], -'ImagickDraw::bezier' => ['bool', 'coordinates'=>'array'], -'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'], -'ImagickDraw::getClipRule' => ['int'], -'ImagickDraw::getClipUnits' => ['int'], -'ImagickDraw::getDensity' => ['null|string'], -'ImagickDraw::getFillColor' => ['ImagickPixel'], -'ImagickDraw::getFillOpacity' => ['float'], -'ImagickDraw::getFillRule' => ['int'], -'ImagickDraw::getFont' => ['string'], -'ImagickDraw::getFontFamily' => ['string'], -'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'=>'array'], -'ImagickDraw::polyline' => ['bool', 'coordinates'=>'array'], -'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'], -'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'], -'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'=>'string', 'y_resolution'=>'string'], -'ImagickDraw::setStrokeAlpha' => ['bool', 'opacity'=>'float'], -'ImagickDraw::setStrokeAntialias' => ['bool', 'stroke_antialias'=>'bool'], -'ImagickDraw::setStrokeColor' => ['bool', 'stroke_pixel'=>'imagickpixel'], -'ImagickDraw::setStrokeDashArray' => ['bool', 'dasharray'=>'array'], -'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'], -'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'=>'array', 'origin='=>'array'], -'ImagickKernel::getMatrix' => ['array'], -'ImagickKernel::scale' => ['void'], -'ImagickKernel::separate' => ['array'], -'ImagickKernel::seperate' => ['void'], -'ImagickPixel::__construct' => ['void', 'color='=>'string'], -'ImagickPixel::clear' => ['bool'], -'ImagickPixel::clone' => ['void'], -'ImagickPixel::destroy' => ['bool'], -'ImagickPixel::getColor' => ['array', 'normalized='=>'bool'], -'ImagickPixel::getColorAsString' => ['string'], -'ImagickPixel::getColorCount' => ['int'], -'ImagickPixel::getColorQuantum' => ['mixed'], -'ImagickPixel::getColorValue' => ['float', 'color'=>'int'], -'ImagickPixel::getColorValueQuantum' => ['mixed'], -'ImagickPixel::getHSL' => ['array'], -'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', 'text'=>'string'], -'imap_alerts' => ['array|false'], -'imap_append' => ['bool', 'stream_id'=>'resource', 'folder'=>'string', 'message'=>'string', 'options='=>'string', 'internal_date='=>'string'], -'imap_base64' => ['string|false', 'text'=>'string'], -'imap_binary' => ['string|false', 'text'=>'string'], -'imap_body' => ['string|false', 'stream_id'=>'resource', 'msg_no'=>'int', 'options='=>'int'], -'imap_bodystruct' => ['stdClass|false', 'stream_id'=>'resource', 'msg_no'=>'int', 'section'=>'string'], -'imap_check' => ['stdClass|false', 'stream_id'=>'resource'], -'imap_clearflag_full' => ['bool', 'stream_id'=>'resource', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], -'imap_close' => ['bool', 'stream_id'=>'resource', 'options='=>'int'], -'imap_create' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'], -'imap_createmailbox' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'], -'imap_delete' => ['bool', 'stream_id'=>'resource', 'msg_no'=>'int', 'options='=>'int'], -'imap_deletemailbox' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'], -'imap_errors' => ['array|false'], -'imap_expunge' => ['bool', 'stream_id'=>'resource'], -'imap_fetch_overview' => ['array|false', 'stream_id'=>'resource', 'sequence'=>'string', 'options='=>'int'], -'imap_fetchbody' => ['string|false', 'stream_id'=>'resource', 'msg_no'=>'int', 'section'=>'string', 'options='=>'int'], -'imap_fetchheader' => ['string|false', 'stream_id'=>'resource', 'msg_no'=>'int', 'options='=>'int'], -'imap_fetchmime' => ['string|false', 'stream_id'=>'resource', 'msg_no'=>'int', 'section'=>'string', 'options='=>'int'], -'imap_fetchstructure' => ['stdClass|false', 'stream_id'=>'resource', 'msg_no'=>'int', 'options='=>'int'], -'imap_fetchtext' => ['string|false', 'stream_id'=>'resource', 'msg_no'=>'int', 'options='=>'int'], -'imap_gc' => ['bool', 'stream_id'=>'resource', 'flags'=>'int'], -'imap_get_quota' => ['array|false', 'stream_id'=>'resource', 'qroot'=>'string'], -'imap_get_quotaroot' => ['array|false', 'stream_id'=>'resource', 'mbox'=>'string'], -'imap_getacl' => ['array|false', 'stream_id'=>'resource', 'mailbox'=>'string'], -'imap_getmailboxes' => ['array|false', 'stream_id'=>'resource', 'ref'=>'string', 'pattern'=>'string'], -'imap_getsubscribed' => ['array|false', 'stream_id'=>'resource', 'ref'=>'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', 'stream_id'=>'resource', 'msg_no'=>'int', 'from_length='=>'int', 'subject_length='=>'int', 'default_host='=>'string'], -'imap_headers' => ['array|false', 'stream_id'=>'resource'], -'imap_last_error' => ['string|false'], -'imap_list' => ['array|false', 'stream_id'=>'resource', 'ref'=>'string', 'pattern'=>'string'], -'imap_listmailbox' => ['array|false', 'stream_id'=>'resource', 'ref'=>'string', 'pattern'=>'string'], -'imap_listscan' => ['array|false', 'stream_id'=>'resource', 'ref'=>'string', 'pattern'=>'string', 'content'=>'string'], -'imap_listsubscribed' => ['array|false', 'stream_id'=>'resource', 'ref'=>'string', 'pattern'=>'string'], -'imap_lsub' => ['array|false', 'stream_id'=>'resource', 'ref'=>'string', 'pattern'=>'string'], -'imap_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string', 'cc='=>'string', 'bcc='=>'string', 'rpath='=>'string'], -'imap_mail_compose' => ['string|false', 'envelope'=>'array', 'body'=>'array'], -'imap_mail_copy' => ['bool', 'stream_id'=>'resource', 'msglist'=>'string', 'mailbox'=>'string', 'options='=>'int'], -'imap_mail_move' => ['bool', 'stream_id'=>'resource', 'sequence'=>'string', 'mailbox'=>'string', 'options='=>'int'], -'imap_mailboxmsginfo' => ['stdClass|false', 'stream_id'=>'resource'], -'imap_mime_header_decode' => ['array|false', 'str'=>'string'], -'imap_msgno' => ['int|false', 'stream_id'=>'resource', 'unique_msg_id'=>'int'], -'imap_mutf7_to_utf8' => ['string|false', 'in'=>'string'], -'imap_num_msg' => ['int|false', 'stream_id'=>'resource'], -'imap_num_recent' => ['int|false', 'stream_id'=>'resource'], -'imap_open' => ['resource|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'options='=>'int', 'n_retries='=>'int', 'params='=>'?array'], -'imap_ping' => ['bool', 'stream_id'=>'resource'], -'imap_qprint' => ['string|false', 'text'=>'string'], -'imap_rename' => ['bool', 'stream_id'=>'resource', 'old_name'=>'string', 'new_name'=>'string'], -'imap_renamemailbox' => ['bool', 'stream_id'=>'resource', 'old_name'=>'string', 'new_name'=>'string'], -'imap_reopen' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string', 'options='=>'int', 'n_retries='=>'int'], -'imap_rfc822_parse_adrlist' => ['array', 'address_string'=>'string', 'default_host'=>'string'], -'imap_rfc822_parse_headers' => ['stdClass', 'headers'=>'string', 'default_host='=>'string'], -'imap_rfc822_write_address' => ['string|false', 'mailbox'=>'?string', 'host'=>'?string', 'personal'=>'?string'], -'imap_savebody' => ['bool', 'stream_id'=>'resource', 'file'=>'string|resource', 'msg_no'=>'int', 'section='=>'string', 'options='=>'int'], -'imap_scan' => ['array|false', 'stream_id'=>'resource', 'ref'=>'string', 'pattern'=>'string', 'content'=>'string'], -'imap_scanmailbox' => ['array|false', 'stream_id'=>'resource', 'ref'=>'string', 'pattern'=>'string', 'content'=>'string'], -'imap_search' => ['array|false', 'stream_id'=>'resource', 'criteria'=>'string', 'options='=>'int', 'charset='=>'string'], -'imap_set_quota' => ['bool', 'stream_id'=>'resource', 'qroot'=>'string', 'mailbox_size'=>'int'], -'imap_setacl' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string', 'id'=>'string', 'rights'=>'string'], -'imap_setflag_full' => ['bool', 'stream_id'=>'resource', 'sequence'=>'string', 'flag'=>'string', 'options='=>'int'], -'imap_sort' => ['array|false', 'stream_id'=>'resource', 'criteria'=>'int', 'reverse'=>'int', 'options='=>'int', 'search_criteria='=>'string', 'charset='=>'string'], -'imap_status' => ['stdClass|false', 'stream_id'=>'resource', 'mailbox'=>'string', 'options'=>'int'], -'imap_subscribe' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'], -'imap_thread' => ['array', 'stream_id'=>'resource', 'options='=>'int'], -'imap_timeout' => ['mixed', 'timeout_type'=>'int', 'timeout='=>'int'], -'imap_uid' => ['int|false', 'stream_id'=>'resource', 'msg_no'=>'int'], -'imap_undelete' => ['bool', 'stream_id'=>'resource', 'msg_no'=>'int', 'flags='=>'int'], -'imap_unsubscribe' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'], -'imap_utf7_decode' => ['string|false', 'buf'=>'string'], -'imap_utf7_encode' => ['string', 'buf'=>'string'], -'imap_utf8' => ['string', 'mime_encoded_text'=>'string'], -'imap_utf8_to_mutf7' => ['string|false', 'in'=>'string'], -'implode' => ['string', 'glue'=>'string', 'pieces'=>'array'], -'implode\'1' => ['string', 'pieces'=>'array', 'glue='=>'string'], -'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', 'in_addr'=>'string'], -'inet_pton' => ['string|false', 'ip_address'=>'string'], -'InfiniteIterator::__construct' => ['void', 'it'=>'iterator'], -'InfiniteIterator::current' => ['mixed'], -'InfiniteIterator::getInnerIterator' => ['Traversable'], -'InfiniteIterator::key' => ['bool|float|int|string'], -'InfiniteIterator::next' => ['void'], -'InfiniteIterator::rewind' => ['void'], -'InfiniteIterator::valid' => ['bool'], -'inflate_add' => ['string|false', 'context'=>'resource', 'encoded_data'=>'string', 'flush_mode='=>'int'], -'inflate_get_read_len' => ['int|false', 'resource'=>'resource'], -'inflate_get_status' => ['int|false', 'resource'=>'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', 'varname'=>'string', 'newvalue'=>'string|int|float|bool'], -'ini_get' => ['string|false', 'varname'=>'string'], -'ini_get_all' => ['array', 'extension='=>'?string', 'details='=>'bool'], -'ini_restore' => ['void', 'varname'=>'string'], -'ini_set' => ['string|false', 'varname'=>'string', 'newvalue'=>'string'], -'inotify_add_watch' => ['int', 'inotify_instance'=>'resource', 'pathname'=>'string', 'mask'=>'int'], -'inotify_init' => ['resource'], -'inotify_queue_len' => ['int', 'inotify_instance'=>'resource'], -'inotify_read' => ['array', 'inotify_instance'=>'resource'], -'inotify_rm_watch' => ['bool', 'inotify_instance'=>'resource', 'watch_descriptor'=>'int'], -'intdiv' => ['int', 'numerator'=>'int', 'divisor'=>'int'], -'interface_exists' => ['bool', 'classname'=>'string', 'autoload='=>'bool'], -'intl_error_name' => ['string', 'error_code'=>'int'], -'intl_get_error_code' => ['int'], -'intl_get_error_message' => ['string'], -'intl_is_failure' => ['bool', 'error_code'=>'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'=>'string'], -'IntlBreakIterator::getErrorCode' => ['int'], -'IntlBreakIterator::getErrorMessage' => ['string'], -'IntlBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], -'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'string'], -'IntlBreakIterator::getText' => ['string'], -'IntlBreakIterator::isBoundary' => ['bool', 'offset'=>'string'], -'IntlBreakIterator::last' => ['int'], -'IntlBreakIterator::next' => ['int', 'offset='=>'int'], -'IntlBreakIterator::preceding' => ['int', 'offset'=>'int'], -'IntlBreakIterator::previous' => ['int'], -'IntlBreakIterator::setText' => ['bool', 'text'=>'string'], -'intlcal_add' => ['bool', 'cal'=>'IntlCalendar', 'field'=>'int', 'amount'=>'int'], -'intlcal_after' => ['bool', 'cal'=>'IntlCalendar', 'other'=>'IntlCalendar'], -'intlcal_before' => ['bool', 'cal'=>'IntlCalendar', 'other'=>'IntlCalendar'], -'intlcal_clear' => ['bool', 'cal'=>'IntlCalendar', 'field='=>'int'], -'intlcal_create_instance' => ['IntlCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], -'intlcal_equals' => ['bool', 'cal'=>'IntlCalendar', 'other'=>'IntlCalendar'], -'intlcal_field_difference' => ['int', 'cal'=>'IntlCalendar', 'when'=>'float', 'field'=>'int'], -'intlcal_from_date_time' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], -'intlcal_get' => ['int', 'cal'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_actual_maximum' => ['int', 'cal'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_actual_minimum' => ['int', 'cal'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_available_locales' => ['array'], -'intlcal_get_day_of_week_type' => ['int', 'cal'=>'IntlCalendar', 'dayOfWeek'=>'int'], -'intlcal_get_first_day_of_week' => ['int', 'cal'=>'IntlCalendar'], -'intlcal_get_greatest_minimum' => ['int', 'cal'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_keyword_values_for_locale' => ['Iterator', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], -'intlcal_get_least_maximum' => ['int', 'cal'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_locale' => ['string', 'cal'=>'IntlCalendar', 'localeType'=>'int'], -'intlcal_get_maximum' => ['int', 'cal'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_minimal_days_in_first_week' => ['int', 'cal'=>'IntlCalendar'], -'intlcal_get_minimum' => ['int', 'cal'=>'IntlCalendar', 'field'=>'int'], -'intlcal_get_now' => ['float'], -'intlcal_get_repeated_wall_time_option' => ['int', 'cal'=>'IntlCalendar'], -'intlcal_get_skipped_wall_time_option' => ['int', 'cal'=>'IntlCalendar'], -'intlcal_get_time' => ['float', 'cal'=>'IntlCalendar'], -'intlcal_get_time_zone' => ['IntlTimeZone', 'cal'=>'IntlCalendar'], -'intlcal_get_type' => ['string', 'cal'=>'IntlCalendar'], -'intlcal_get_weekend_transition' => ['int', 'cal'=>'IntlCalendar', 'dayOfWeek'=>'string'], -'intlcal_in_daylight_time' => ['bool', 'cal'=>'IntlCalendar'], -'intlcal_is_equivalent_to' => ['bool', 'cal'=>'IntlCalendar', 'other'=>'IntlCalendar'], -'intlcal_is_lenient' => ['bool', 'cal'=>'IntlCalendar'], -'intlcal_is_set' => ['bool', 'cal'=>'IntlCalendar', 'field'=>'int'], -'intlcal_is_weekend' => ['bool', 'cal'=>'IntlCalendar', 'date='=>'float'], -'intlcal_roll' => ['bool', 'cal'=>'IntlCalendar', 'field'=>'int', 'amountOrUpOrDown'=>'mixed'], -'intlcal_set' => ['bool', 'cal'=>'IntlCalendar', 'field'=>'int', 'value'=>'int'], -'intlcal_set\'1' => ['bool', 'cal'=>'IntlCalendar', 'year'=>'int', 'month'=>'int', 'dayOfMonth='=>'int', 'hour='=>'int', 'minute='=>'int', 'second='=>'int'], -'intlcal_set_first_day_of_week' => ['bool', 'cal'=>'IntlCalendar', 'dayOfWeek'=>'int'], -'intlcal_set_lenient' => ['bool', 'cal'=>'IntlCalendar', 'isLenient'=>'bool'], -'intlcal_set_repeated_wall_time_option' => ['bool', 'cal'=>'IntlCalendar', 'wallTimeOption'=>'int'], -'intlcal_set_skipped_wall_time_option' => ['bool', 'cal'=>'IntlCalendar', 'wallTimeOption'=>'int'], -'intlcal_set_time' => ['bool', 'cal'=>'IntlCalendar', 'date'=>'float'], -'intlcal_set_time_zone' => ['bool', 'cal'=>'IntlCalendar', 'timeZone'=>'mixed'], -'intlcal_to_date_time' => ['DateTime', 'cal'=>'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', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], -'IntlCalendar::getLeastMaximum' => ['int', 'field'=>'int'], -'IntlCalendar::getLocale' => ['string', 'localeType'=>'int'], -'IntlCalendar::getMaximum' => ['int', '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'], -'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', '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', 'property'=>'int', 'namechoice='=>'int'], -'IntlChar::getPropertyValueEnum' => ['int', 'property'=>'int', 'name'=>'string'], -'IntlChar::getPropertyValueName' => ['string', 'prop'=>'int', 'val'=>'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', 'locale'=>'string', 'datetype'=>'int', 'timetype'=>'int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'int|IntlCalendar', 'pattern='=>'string'], -'IntlDateFormatter::format' => ['string|false', 'args'=>''], -'IntlDateFormatter::formatObject' => ['string', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'], -'IntlDateFormatter::getCalendar' => ['int'], -'IntlDateFormatter::getCalendarObject' => ['IntlCalendar'], -'IntlDateFormatter::getDateType' => ['int'], -'IntlDateFormatter::getErrorCode' => ['int'], -'IntlDateFormatter::getErrorMessage' => ['string'], -'IntlDateFormatter::getLocale' => ['string'], -'IntlDateFormatter::getPattern' => ['string'], -'IntlDateFormatter::getTimeType' => ['int'], -'IntlDateFormatter::getTimeZone' => ['IntlTimeZone'], -'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' => ['array<int,array<string,mixed>>'], -'IntlException::getTraceAsString' => ['string'], -'intlgregcal_create_instance' => ['IntlGregorianCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], -'intlgregcal_get_gregorian_change' => ['float', 'obj'=>'IntlGregorianCalendar'], -'intlgregcal_is_leap_year' => ['bool', 'year'=>'int'], -'intlgregcal_set_gregorian_change' => ['void', 'obj'=>'IntlGregorianCalendar', 'change'=>'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'=>'string'], -'IntlRuleBasedBreakIterator::getBinaryRules' => ['string'], -'IntlRuleBasedBreakIterator::getErrorCode' => ['int'], -'IntlRuleBasedBreakIterator::getErrorMessage' => ['string'], -'IntlRuleBasedBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], -'IntlRuleBasedBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'string'], -'IntlRuleBasedBreakIterator::getRules' => ['string'], -'IntlRuleBasedBreakIterator::getRuleStatus' => ['int'], -'IntlRuleBasedBreakIterator::getRuleStatusVec' => ['array'], -'IntlRuleBasedBreakIterator::getText' => ['string'], -'IntlRuleBasedBreakIterator::isBoundary' => ['bool', 'offset'=>'string'], -'IntlRuleBasedBreakIterator::last' => ['int'], -'IntlRuleBasedBreakIterator::next' => ['int', 'offset='=>'string'], -'IntlRuleBasedBreakIterator::preceding' => ['int', 'offset'=>'string'], -'IntlRuleBasedBreakIterator::previous' => ['int'], -'IntlRuleBasedBreakIterator::setText' => ['bool', 'text'=>'string'], -'IntlTimeZone::countEquivalentIDs' => ['int', 'zoneId'=>'string'], -'IntlTimeZone::createDefault' => ['IntlTimeZone'], -'IntlTimeZone::createEnumeration' => ['IntlIterator', 'countryOrRawOffset='=>'mixed'], -'IntlTimeZone::createTimeZone' => ['IntlTimeZone', 'zoneId'=>'string'], -'IntlTimeZone::createTimeZoneIDEnumeration' => ['IntlIterator', 'zoneType'=>'int', 'region='=>'string', 'rawOffset='=>'int'], -'IntlTimeZone::fromDateTimeZone' => ['IntlTimeZone', 'zoneId'=>'DateTimeZone'], -'IntlTimeZone::getCanonicalID' => ['string', 'zoneId'=>'string', '&w_isSystemID='=>'bool'], -'IntlTimeZone::getDisplayName' => ['string', 'isDaylight='=>'bool', 'style='=>'int', 'locale='=>'string'], -'IntlTimeZone::getDSTSavings' => ['int'], -'IntlTimeZone::getEquivalentID' => ['string', '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', 'zoneId'=>'string'], -'IntlTimeZone::getTZDataVersion' => ['string'], -'IntlTimeZone::getUnknown' => ['IntlTimeZone'], -'IntlTimeZone::getWindowsID' => ['string', 'timezone'=>'string'], -'IntlTimeZone::hasSameRules' => ['bool', 'otherTimeZone'=>'IntlTimeZone'], -'IntlTimeZone::toDateTimeZone' => ['DateTimeZone'], -'IntlTimeZone::useDaylightTime' => ['bool'], -'intltz_count_equivalent_ids' => ['int', 'zoneId'=>'string'], -'intltz_create_enumeration' => ['IntlIterator', 'countryOrRawOffset'=>'mixed'], -'intltz_create_time_zone' => ['IntlTimeZone', 'zoneId'=>'string'], -'intltz_from_date_time_zone' => ['IntlTimeZone', 'zoneId'=>'DateTimeZone'], -'intltz_get_canonical_id' => ['string', 'zoneId'=>'string', '&isSystemID'=>'bool'], -'intltz_get_display_name' => ['string', 'obj'=>'IntlTimeZone', 'isDaylight'=>'bool', 'style'=>'int', 'locale'=>'string'], -'intltz_get_dst_savings' => ['int', 'obj'=>'IntlTimeZone'], -'intltz_get_equivalent_id' => ['string', 'zoneId'=>'string', 'index'=>'int'], -'intltz_get_error_code' => ['int', 'obj'=>'IntlTimeZone'], -'intltz_get_error_message' => ['string', 'obj'=>'IntlTimeZone'], -'intltz_get_id' => ['string', 'obj'=>'IntlTimeZone'], -'intltz_get_offset' => ['int', 'obj'=>'IntlTimeZone', 'date'=>'float', 'local'=>'bool', '&rawOffset'=>'int', '&dstOffset'=>'int'], -'intltz_get_raw_offset' => ['int', 'obj'=>'IntlTimeZone'], -'intltz_get_tz_data_version' => ['string', 'obj'=>'IntlTimeZone'], -'intltz_getGMT' => ['IntlTimeZone'], -'intltz_has_same_rules' => ['bool', 'obj'=>'IntlTimeZone', 'otherTimeZone'=>'IntlTimeZone'], -'intltz_to_date_time_zone' => ['DateTimeZone', 'obj'=>''], -'intltz_use_daylight_time' => ['bool', 'obj'=>''], -'intlz_create_default' => ['IntlTimeZone'], -'intval' => ['int', 'var'=>'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' => ['array'], -'InvalidArgumentException::getTraceAsString' => ['string'], -'ip2long' => ['int|false', 'ip_address'=>'string'], -'iptcembed' => ['array', 'iptcdata'=>'string', 'jpeg_file_name'=>'string', 'spool='=>'int'], -'iptcparse' => ['array|false', 'iptcdata'=>'string'], -'is_a' => ['bool', 'object_or_string'=>'object|string', 'class_name'=>'string', 'allow_string='=>'bool'], -'is_array' => ['bool', 'var'=>'mixed'], -'is_bool' => ['bool', 'var'=>'mixed'], -'is_callable' => ['bool', 'var'=>'mixed', 'syntax_only='=>'bool', '&w_callable_name='=>'string'], -'is_countable' => ['bool', 'var'=>'mixed'], -'is_dir' => ['bool', 'filename'=>'string'], -'is_double' => ['bool', 'var'=>'mixed'], -'is_executable' => ['bool', 'filename'=>'string'], -'is_file' => ['bool', 'filename'=>'string'], -'is_finite' => ['bool', 'val'=>'float'], -'is_float' => ['bool', 'var'=>'mixed'], -'is_infinite' => ['bool', 'val'=>'float'], -'is_int' => ['bool', 'var'=>'mixed'], -'is_integer' => ['bool', 'var'=>'mixed'], -'is_iterable' => ['bool', 'var'=>'mixed'], -'is_link' => ['bool', 'filename'=>'string'], -'is_long' => ['bool', 'var'=>'mixed'], -'is_nan' => ['bool', 'val'=>'float'], -'is_null' => ['bool', 'var'=>'mixed'], -'is_numeric' => ['bool', 'value'=>'mixed'], -'is_object' => ['bool', 'var'=>'mixed'], -'is_readable' => ['bool', 'filename'=>'string'], -'is_real' => ['bool', 'var'=>'mixed'], -'is_resource' => ['bool', 'var'=>'mixed'], -'is_scalar' => ['bool', 'value'=>'mixed'], -'is_soap_fault' => ['bool', 'object'=>'mixed'], -'is_string' => ['bool', 'var'=>'mixed'], -'is_subclass_of' => ['bool', 'object_or_string'=>'object|string', 'class_name'=>'string', 'allow_string='=>'bool'], -'is_tainted' => ['bool', 'string'=>'string'], -'is_uploaded_file' => ['bool', 'path'=>'string'], -'is_writable' => ['bool', 'filename'=>'string'], -'is_writeable' => ['bool', 'filename'=>'string'], -'isset' => ['bool', 'var'=>'mixed', '...rest='=>'mixed'], -'Iterator::current' => ['mixed'], -'Iterator::key' => ['int|string'], -'Iterator::next' => ['void'], -'Iterator::rewind' => ['void'], -'Iterator::valid' => ['bool'], -'iterator_apply' => ['int', 'it'=>'Traversable', 'function'=>'callable(mixed):bool', 'params='=>'array'], -'iterator_count' => ['int', 'it'=>'Traversable'], -'iterator_to_array' => ['array', 'it'=>'Traversable', 'use_keys='=>'bool'], -'IteratorAggregate::getIterator' => ['Traversable'], -'IteratorIterator::__construct' => ['void', 'it'=>'Traversable'], -'IteratorIterator::current' => ['mixed'], -'IteratorIterator::getInnerIterator' => ['Traversable'], -'IteratorIterator::key' => ['int|string|float|bool'], -'IteratorIterator::next' => ['void'], -'IteratorIterator::rewind' => ['void'], -'IteratorIterator::valid' => ['bool'], -'java_last_exception_clear' => [''], -'java_last_exception_get' => ['object'], -'java_reload' => ['array', 'new_jarpath'=>'new_jarpath'], -'java_require' => ['array', 'new_classpath'=>'new_classpath'], -'java_set_encoding' => ['array', 'encoding'=>'encoding'], -'java_set_ignore_case' => ['void', 'ignore'=>'ignore'], -'java_throw_exceptions' => ['void', 'throw'=>'throw'], -'JavaException::getCause' => ['object'], -'jddayofweek' => ['mixed', 'juliandaycount'=>'int', 'mode='=>'int'], -'jdmonthname' => ['string', 'juliandaycount'=>'int', 'mode'=>'int'], -'jdtofrench' => ['string', 'juliandaycount'=>'int'], -'jdtogregorian' => ['string', 'juliandaycount'=>'int'], -'jdtojewish' => ['string', 'juliandaycount'=>'int', 'hebrew='=>'bool', 'fl='=>'int'], -'jdtojulian' => ['string', 'juliandaycount'=>'int'], -'jdtounix' => ['int|false', 'jday'=>'int'], -'jewishtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'], -'jobqueue_license_info' => ['array'], -'join' => ['string', 'glue'=>'string', 'pieces'=>'array'], -'join\'1' => ['string', 'pieces'=>'array'], -'jpeg2wbmp' => ['bool', 'jpegname'=>'string', 'wbmpname'=>'string', 'dest_height'=>'int', 'dest_width'=>'int', 'threshold'=>'int'], -'json_decode' => ['mixed', 'json'=>'string', 'assoc='=>'bool', 'depth='=>'int', 'options='=>'int'], -'json_encode' => ['string|false', 'data'=>'mixed', 'options='=>'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' => ['array<int,array<string,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' => ['int', 'index='=>'mixed'], -'Judy::free' => ['int'], -'Judy::getType' => ['int'], -'Judy::last' => ['void', 'index='=>'string'], -'Judy::lastEmpty' => ['int', 'index='=>'int'], -'Judy::memoryUsage' => ['int'], -'Judy::next' => ['mixed', 'index'=>'mixed'], -'Judy::nextEmpty' => ['int', 'index'=>'int'], -'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' => ['int', 'index'=>'mixed'], -'Judy::size' => ['void'], -'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_arg'=>'array|object'], -'key_exists' => ['bool', 'key'=>'string|int', 'search'=>'array'], -'krsort' => ['bool', '&rw_array_arg'=>'array', 'sort_flags='=>'int'], -'ksort' => ['bool', '&rw_array_arg'=>'array', 'sort_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', 'str'=>'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', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array'], -'ldap_add_ext' => ['resource', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'serverctrls='=>'array'], -'ldap_bind' => ['bool', 'link_identifier'=>'resource', 'dn='=>'?string', 'password='=>'?string'], -'ldap_bind_ext' => ['resource', 'link_identifier'=>'resource', 'bind_rdn='=>'string', 'bind_password='=>'string'], -'ldap_close' => ['bool', 'link_identifier'=>'resource'], -'ldap_compare' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'attr'=>'string', 'value'=>'string'], -'ldap_connect' => ['resource|false', 'host='=>'string', 'port='=>'int', 'wallet='=>'string', 'wallet_passwd='=>'string', 'authmode='=>'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', 'link_identifier'=>'resource', 'result'=>'resource'], -'ldap_delete' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string'], -'ldap_delete_ext' => ['resource', 'link_identifier'=>'resource', 'dn'=>'string', 'serverctrls='=>'array'], -'ldap_dn2ufn' => ['string', 'dn'=>'string'], -'ldap_err2str' => ['string', 'errno'=>'int'], -'ldap_errno' => ['int', 'link_identifier'=>'resource'], -'ldap_error' => ['string', 'link_identifier'=>'resource'], -'ldap_escape' => ['string', 'value'=>'string', 'ignore='=>'string', 'flags='=>'int'], -'ldap_exop' => ['mixed', 'link'=>'resource', 'reqoid'=>'string', 'reqdata='=>'string', 'servercontrols='=>'array', 'retdata='=>'string', 'retoid='=>'string'], -'ldap_exop_passwd' => ['mixed', 'link'=>'resource', 'user='=>'string', 'oldpw='=>'string', 'newpw='=>'string', 'serverctrls='=>'array'], -'ldap_exop_refresh' => ['int', 'link'=>'resource', 'dn'=>'string', 'ttl'=>'int'], -'ldap_exop_whoami' => ['string|false', 'link'=>'resource'], -'ldap_explode_dn' => ['array|false', 'dn'=>'string', 'with_attrib'=>'int'], -'ldap_first_attribute' => ['string', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'], -'ldap_first_entry' => ['resource|false', 'link_identifier'=>'resource', 'result_identifier'=>'resource'], -'ldap_first_reference' => ['resource|false', 'link_identifier'=>'resource', 'result_identifier'=>'resource'], -'ldap_free_result' => ['bool', 'result_identifier'=>'resource'], -'ldap_get_attributes' => ['array|false', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'], -'ldap_get_dn' => ['string|false', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'], -'ldap_get_entries' => ['array|false', 'link_identifier'=>'resource', 'result_identifier'=>'resource'], -'ldap_get_option' => ['bool', 'link_identifier'=>'resource', 'option'=>'int', '&w_retval'=>'mixed'], -'ldap_get_values' => ['array', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource', 'attribute'=>'string'], -'ldap_get_values_len' => ['array', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource', 'attribute'=>'string'], -'ldap_list' => ['resource|false', 'link'=>'resource|array', 'base_dn'=>'string', 'filter'=>'string', 'attrs='=>'array', 'attrsonly='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], -'ldap_mod_add' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array'], -'ldap_mod_add_ext' => ['resource', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'serverctrls='=>'array'], -'ldap_mod_del' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array'], -'ldap_mod_del_ext' => ['resource', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'serverctrls='=>'array'], -'ldap_mod_replace' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array'], -'ldap_mod_replace_ext' => ['resource', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'serverctrls='=>'array'], -'ldap_modify' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array'], -'ldap_modify_batch' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'modifs'=>'array'], -'ldap_next_attribute' => ['string', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'], -'ldap_next_entry' => ['resource|false', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'], -'ldap_next_reference' => ['resource|false', 'link_identifier'=>'resource', 'reference_entry_identifier'=>'resource'], -'ldap_parse_exop' => ['bool', 'link'=>'resource', 'result'=>'resource', 'retdata='=>'string', 'retoid='=>'string'], -'ldap_parse_reference' => ['bool', 'link_identifier'=>'resource', 'reference_entry_identifier'=>'resource', 'referrals'=>'array'], -'ldap_parse_result' => ['bool', 'link_identifier'=>'resource', 'result'=>'resource', 'errcode'=>'int', 'matcheddn='=>'string', 'errmsg='=>'string', 'referrals='=>'array'], -'ldap_read' => ['resource|false', 'link'=>'resource|array', 'base_dn'=>'string', 'filter'=>'string', 'attrs='=>'array', 'attrsonly='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], -'ldap_rename' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'newrdn'=>'string', 'newparent'=>'string', 'deleteoldrdn'=>'bool'], -'ldap_rename_ext' => ['resource', 'link_identifier'=>'resource', 'dn'=>'string', 'newrdn'=>'string', 'newparent'=>'string', 'deleteoldrdn'=>'bool', 'serverctrls='=>'array'], -'ldap_sasl_bind' => ['bool', 'link_identifier'=>'resource', 'binddn='=>'string', 'password='=>'string', 'sasl_mech='=>'string', 'sasl_realm='=>'string', 'sasl_authc_id='=>'string', 'sasl_authz_id='=>'string', 'props='=>'string'], -'ldap_search' => ['resource|false', 'link_identifier'=>'resource|array', 'base_dn'=>'string', 'filter'=>'string', 'attrs='=>'array', 'attrsonly='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'], -'ldap_set_option' => ['bool', 'link_identifier'=>'resource', 'option'=>'int', 'newval'=>'mixed'], -'ldap_set_rebind_proc' => ['bool', 'link_identifier'=>'resource', 'callback'=>'string'], -'ldap_sort' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', 'sortfilter'=>'string'], -'ldap_start_tls' => ['bool', 'link_identifier'=>'resource'], -'ldap_t61_to_8859' => ['string', 'value'=>'string'], -'ldap_unbind' => ['bool', 'link_identifier'=>'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'], -'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' => ['array'], -'LengthException::getTraceAsString' => ['string'], -'LevelDB::__construct' => ['void', 'name'=>'string', 'options='=>'array', 'read_options='=>'array', 'write_options='=>'array'], -'LevelDB::close' => [''], -'LevelDB::compactRange' => ['', 'start'=>'', 'limit'=>''], -'LevelDB::delete' => ['bool', 'key'=>'string', 'write_options='=>'array'], -'LevelDB::destroy' => ['', 'name'=>'', 'options='=>'array'], -'LevelDB::get' => ['bool|string', 'key'=>'string', 'read_options='=>'array'], -'LevelDB::getApproximateSizes' => ['', 'start'=>'', 'limit'=>''], -'LevelDB::getIterator' => ['LevelDBIterator', 'options='=>'array'], -'LevelDB::getProperty' => ['mixed', 'name'=>'string'], -'LevelDB::getSnapshot' => ['LevelDBSnapshot'], -'LevelDB::put' => ['', 'key'=>'string', 'value'=>'string', 'write_options='=>'array'], -'LevelDB::repair' => ['', 'name'=>'', 'options='=>'array'], -'LevelDB::set' => ['', 'key'=>'string', 'value'=>'string', 'write_options='=>'array'], -'LevelDB::write' => ['', 'batch'=>'LevelDBWriteBatch', 'write_options='=>'array'], -'LevelDBIterator::__construct' => ['void', 'db'=>'LevelDB', 'read_options='=>'array'], -'LevelDBIterator::current' => ['mixed'], -'LevelDBIterator::destroy' => [''], -'LevelDBIterator::getError' => [''], -'LevelDBIterator::key' => ['int|string'], -'LevelDBIterator::last' => [''], -'LevelDBIterator::next' => ['void'], -'LevelDBIterator::prev' => [''], -'LevelDBIterator::rewind' => ['void'], -'LevelDBIterator::seek' => ['', 'key'=>''], -'LevelDBIterator::valid' => ['bool'], -'LevelDBSnapshot::__construct' => ['void', 'db'=>'LevelDB'], -'LevelDBSnapshot::release' => [''], -'LevelDBWriteBatch::__construct' => ['void', 'name'=>'', 'options='=>'array', 'read_options='=>'array', 'write_options='=>'array'], -'LevelDBWriteBatch::clear' => [''], -'LevelDBWriteBatch::delete' => ['', 'key'=>'', 'write_options='=>'array'], -'LevelDBWriteBatch::put' => ['', 'key'=>'', 'value'=>'', 'write_options='=>'array'], -'LevelDBWriteBatch::set' => ['', 'key'=>'', 'value'=>'', 'write_options='=>'array'], -'levenshtein' => ['int', 'str1'=>'string', 'str2'=>'string'], -'levenshtein\'1' => ['int', 'str1'=>'string', 'str2'=>'string', 'cost_ins'=>'int', 'cost_rep'=>'int', 'cost_del'=>'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', 'streams_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', 'filename'=>'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' => ['', 'arg1'=>''], -'locale_compose' => ['string|false', 'subtags'=>'array'], -'locale_filter_matches' => ['bool', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'], -'locale_get_all_variants' => ['array', 'locale'=>'string'], -'locale_get_default' => ['string'], -'locale_get_display_language' => ['string', 'locale'=>'string', 'in_locale='=>'string'], -'locale_get_display_name' => ['string', 'locale'=>'string', 'in_locale='=>'string'], -'locale_get_display_region' => ['string', 'locale'=>'string', 'in_locale='=>'string'], -'locale_get_display_script' => ['string', 'locale'=>'string', 'in_locale='=>'string'], -'locale_get_display_variant' => ['string', 'locale'=>'string', 'in_locale='=>'string'], -'locale_get_keywords' => ['array|false', 'locale'=>'string'], -'locale_get_primary_language' => ['string', 'locale'=>'string'], -'locale_get_region' => ['string', 'locale'=>'string'], -'locale_get_script' => ['string', 'locale'=>'string'], -'locale_lookup' => ['string', 'langtag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'default='=>'string'], -'locale_parse' => ['array', 'locale'=>'string'], -'locale_set_default' => ['bool', 'locale'=>'string'], -'localeconv' => ['array'], -'localtime' => ['array', 'timestamp='=>'int', 'associative_array='=>'bool'], -'log' => ['float', 'number'=>'float', 'base='=>'float'], -'log10' => ['float', 'number'=>'float'], -'log1p' => ['float', 'number'=>'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' => ['array'], -'LogicException::getTraceAsString' => ['string'], -'long2ip' => ['string', 'proper_address'=>'int'], -'lstat' => ['array|false', 'filename'=>'string'], -'ltrim' => ['string', 'str'=>'string', 'character_mask='=>'string'], -'Lua::__call' => ['mixed', 'lua_func'=>'callable', 'args='=>'array', 'use_self='=>'int'], -'Lua::__construct' => ['void', 'lua_script_file'=>'string'], -'Lua::assign' => ['mixed', 'name'=>'string', 'value'=>'string'], -'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' => ['mixed', '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', 'additional_parameters='=>'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', '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' => ['', 'arg1'=>'array'], -'max\'1' => ['', 'arg1'=>'', 'arg2'=>'', '...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'=>'', '&rw_var1'=>'', '&...rw_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'=>'', '&rw_var1'=>'', '&...rw_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', 'var='=>'string', 'encoding='=>'string'], -'mb_chr' => ['string|false', 'cp'=>'int', 'encoding='=>'string'], -'mb_convert_case' => ['string|false', 'sourcestring'=>'string', 'mode'=>'int', 'encoding='=>'string'], -'mb_convert_encoding' => ['string|false', 'str'=>'string', 'to_encoding'=>'string', 'from_encoding='=>'mixed'], -'mb_convert_kana' => ['string|false', 'str'=>'string', 'option='=>'string', 'encoding='=>'string'], -'mb_convert_variables' => ['string|false', 'to_encoding'=>'string', 'from_encoding'=>'array|string', '&rw_vars'=>'string|array|object', '&...rw_vars='=>'string|array|object'], -'mb_decode_mimeheader' => ['string', 'string'=>'string'], -'mb_decode_numericentity' => ['string|false', 'string'=>'string', 'convmap'=>'array', 'encoding='=>'string', 'is_hex='=>'bool'], -'mb_detect_encoding' => ['string|false', 'str'=>'string', 'encoding_list='=>'mixed', 'strict='=>'bool'], -'mb_detect_order' => ['bool|array', 'encoding_list='=>'mixed'], -'mb_encode_mimeheader' => ['string|false', 'str'=>'string', 'charset='=>'string', 'transfer_encoding='=>'string', 'linefeed='=>'string', 'indent='=>'int'], -'mb_encode_numericentity' => ['string|false', 'string'=>'string', 'convmap'=>'array', 'encoding='=>'string', 'is_hex='=>'bool'], -'mb_encoding_aliases' => ['array|false', 'encoding'=>'string'], -'mb_ereg' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_registers='=>'array'], -'mb_ereg_match' => ['bool', 'pattern'=>'string', 'string'=>'string', 'option='=>'string'], -'mb_ereg_replace' => ['string|false', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'option='=>'string'], -'mb_ereg_replace_callback' => ['string|false', 'pattern'=>'string', 'callback'=>'string', 'string'=>'string', 'option='=>'string'], -'mb_ereg_search' => ['bool', 'pattern='=>'string', 'option='=>'string'], -'mb_ereg_search_getpos' => ['int'], -'mb_ereg_search_getregs' => ['array|false'], -'mb_ereg_search_init' => ['bool', 'string'=>'string', 'pattern='=>'string', 'option='=>'string'], -'mb_ereg_search_pos' => ['array|false', 'pattern='=>'string', 'option='=>'string'], -'mb_ereg_search_regs' => ['array|false', 'pattern='=>'string', 'option='=>'string'], -'mb_ereg_search_setpos' => ['bool', 'position'=>'int'], -'mb_eregi' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_registers='=>'array'], -'mb_eregi_replace' => ['string|false', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'option='=>'string'], -'mb_get_info' => ['mixed', 'type='=>'string'], -'mb_http_input' => ['mixed', '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' => ['array'], -'mb_ord' => ['int|false', 'str'=>'string', 'enc='=>'string'], -'mb_output_handler' => ['string', 'contents'=>'string', 'status'=>'int'], -'mb_parse_str' => ['bool', 'encoded_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_scrub' => ['string|false', 'str'=>'string', 'enc='=>'string'], -'mb_send_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string', 'additional_parameter='=>'string'], -'mb_split' => ['array<int,string>', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'], -'mb_strcut' => ['string|false', 'str'=>'string', 'start'=>'int', 'length='=>'int', 'encoding='=>'string'], -'mb_strimwidth' => ['string|false', 'str'=>'string', 'start'=>'int', 'width'=>'int', 'trimmarker='=>'string', 'encoding='=>'string'], -'mb_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], -'mb_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool', 'encoding='=>'string'], -'mb_strlen' => ['int|false', 'str'=>'string', 'encoding='=>'string'], -'mb_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'], -'mb_strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool', 'encoding='=>'string'], -'mb_strrichr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'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', 'part='=>'bool', 'encoding='=>'string'], -'mb_strtolower' => ['string|false', 'str'=>'string', 'encoding='=>'string'], -'mb_strtoupper' => ['string|false', 'str'=>'string', 'encoding='=>'string'], -'mb_strwidth' => ['int|false', 'str'=>'string', 'encoding='=>'string'], -'mb_substitute_character' => ['bool|int|string', 'substchar='=>'mixed'], -'mb_substr' => ['string|false', 'str'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'], -'mb_substr_count' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'], -'mcrypt_cbc' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], -'mcrypt_cfb' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], -'mcrypt_create_iv' => ['string', 'size'=>'int', 'source='=>'int'], -'mcrypt_decrypt' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'string', 'iv='=>'string'], -'mcrypt_ecb' => ['string', 'cipher'=>'string', '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', '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', 'td'=>'resource', 'key'=>'string', 'iv'=>'string'], -'mcrypt_get_block_size' => ['int', 'cipher'=>'string', 'module'=>'string'], -'mcrypt_get_cipher_name' => ['string', 'cipher'=>'string'], -'mcrypt_get_iv_size' => ['int', 'cipher'=>'string', 'module'=>'string'], -'mcrypt_get_key_size' => ['int', 'cipher'=>'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', 'cipher'=>'string', 'cipher_directory'=>'string', 'mode'=>'string', 'mode_directory'=>'string'], -'mcrypt_module_self_test' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'], -'mcrypt_ofb' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'], -'md5' => ['string', 'str'=>'string', 'raw_output='=>'bool'], -'md5_file' => ['string|false', 'filename'=>'string', 'raw_output='=>'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' => ['array', 'key'=>'string', 'flags='=>'array', 'keys='=>'array'], -'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' => ['void'], -'memcache_add_server' => ['void'], -'memcache_append' => ['void'], -'memcache_cas' => ['void'], -'memcache_close' => ['void'], -'memcache_connect' => ['bool', 'host'=>'string', 'port'=>'int', 'timeout='=>'int'], -'memcache_debug' => ['bool', 'on_off'=>'bool'], -'memcache_decrement' => ['void'], -'memcache_delete' => ['void'], -'memcache_flush' => ['void'], -'memcache_get' => ['void'], -'memcache_get_extended_stats' => ['void'], -'memcache_get_server_status' => ['void'], -'memcache_get_stats' => ['void'], -'memcache_get_version' => ['void'], -'memcache_increment' => ['void'], -'memcache_pconnect' => ['Memcache', 'host'=>'', 'port='=>'null', 'timeout='=>'int'], -'memcache_prepend' => ['void'], -'memcache_replace' => ['void'], -'memcache_set' => ['void'], -'memcache_set_compress_threshold' => ['void'], -'memcache_set_failure_callback' => ['void'], -'memcache_set_server_params' => ['void'], -'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' => ['bool', 'keys'=>'array', 'time='=>'int'], -'Memcached::deleteMultiByKey' => ['bool', 'server_key'=>'string', 'keys'=>'array', 'time='=>'int'], -'Memcached::fetch' => ['array'], -'Memcached::fetchAll' => ['array'], -'Memcached::flush' => ['bool', 'delay='=>'int'], -'Memcached::flushBuffers' => [''], -'Memcached::get' => ['mixed', 'key'=>'string', 'cache_cb='=>'?callable', 'flags='=>'int'], -'Memcached::getAllKeys' => ['array|false'], -'Memcached::getByKey' => ['mixed', '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', 'server_key'=>'string', 'keys'=>'array', 'flags='=>'int'], -'Memcached::getOption' => ['mixed', '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|true', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool|true', 'failure_callback='=>'?callable', 'timeoutms='=>'int'], -'MemcachePool::append' => [''], -'MemcachePool::cas' => [''], -'MemcachePool::close' => ['bool'], -'MemcachePool::connect' => ['bool', 'host'=>'string', 'port'=>'int', 'timeout='=>'int'], -'MemcachePool::decrement' => ['bool|int', 'key'=>'', 'value='=>'int|mixed'], -'MemcachePool::delete' => ['bool', 'key'=>'', 'timeout='=>'int|mixed'], -'MemcachePool::findServer' => [''], -'MemcachePool::flush' => ['bool'], -'MemcachePool::get' => ['array|string', 'key'=>'array|string', '&flags='=>'array|int'], -'MemcachePool::getExtendedStats' => ['array|bool', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], -'MemcachePool::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'], -'MemcachePool::getStats' => ['array|bool', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'], -'MemcachePool::getVersion' => ['bool|string'], -'MemcachePool::increment' => ['bool|int', '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|true', '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', 'value'=>'string'], -'MessageFormatter::parseMessage' => ['array', 'locale'=>'string', 'pattern'=>'string', 'source'=>'string'], -'MessageFormatter::setPattern' => ['bool', 'pattern'=>'string'], -'metaphone' => ['string', 'text'=>'string', 'phones='=>'int'], -'method_exists' => ['bool', 'object'=>'object|string', 'method'=>'string'], -'mhash' => ['string', 'hash'=>'int', 'data'=>'string', 'key='=>'string'], -'mhash_count' => ['int'], -'mhash_get_block_size' => ['int', 'hash'=>'int'], -'mhash_get_hash_name' => ['string', 'hash'=>'int'], -'mhash_keygen_s2k' => ['string', 'hash'=>'int', 'input_password'=>'string', 'salt'=>'string', 'bytes'=>'int'], -'microtime' => ['string|float', 'get_as_float='=>'bool'], -'mime_content_type' => ['string|false', 'filename_or_stream'=>'string'], -'min' => ['', 'arg1'=>'array'], -'min\'1' => ['', 'arg1'=>'', 'arg2'=>'', '...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', 'pathname'=>'string', 'mode='=>'int', 'recursive='=>'bool', 'context='=>'resource'], -'mktime' => ['int', 'hour='=>'int', 'min='=>'int', 'sec='=>'int', 'mon='=>'int', 'day='=>'int', 'year='=>'int'], -'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|null'], -'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' => ['mixed', 'a'=>'array', 'options='=>'array'], -'MongoCollection::count' => ['int', 'query='=>'array', 'limit='=>'int', 'skip='=>'int'], -'MongoCollection::createDBRef' => ['array', 'a'=>'array'], -'MongoCollection::createIndex' => ['bool', 'keys'=>'array', 'options='=>'array'], -'MongoCollection::deleteIndex' => ['array', 'keys'=>'string|array'], -'MongoCollection::deleteIndexes' => ['array'], -'MongoCollection::distinct' => ['array', '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', 'options='=>'array'], -'MongoCollection::parallelCollectionScan' => ['MongoCommandCursor[]', 'num_cursors'=>'int'], -'MongoCollection::remove' => ['bool|array', 'criteria='=>'array', 'options='=>'array'], -'MongoCollection::save' => ['mixed', 'a'=>'array', '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'=>'array'], -'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' => ['array'], -'MongoCursorException::getTraceAsString' => ['string'], -'MongoCursorInterface::__construct' => ['void'], -'MongoCursorInterface::batchSize' => ['MongoCursorInterface', 'batchSize'=>'int'], -'MongoCursorInterface::current' => ['mixed'], -'MongoCursorInterface::dead' => ['bool'], -'MongoCursorInterface::getReadPreference' => ['array'], -'MongoCursorInterface::info' => ['array'], -'MongoCursorInterface::key' => ['int|string'], -'MongoCursorInterface::next' => ['void'], -'MongoCursorInterface::rewind' => ['void'], -'MongoCursorInterface::setReadPreference' => ['MongoCursorInterface', 'read_preference'=>'string', 'tags='=>'array'], -'MongoCursorInterface::timeout' => ['MongoCursorInterface', 'ms'=>'int'], -'MongoCursorInterface::valid' => ['bool'], -'MongoDate::__construct' => ['void', 'sec='=>'int', 'usec='=>'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|null'], -'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|null'], -'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' => ['MongoDB\Driver\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\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' => ['array'], -'MongoDB\Driver\Exception\RuntimeException::getTraceAsString' => ['string'], -'mongodb\driver\exception\runtimeexception::hasErrorLabel' => ['bool', 'errorLabel'=>'string'], -'MongoDB\Driver\Exception\WriteException::__clone' => ['void'], -'MongoDB\Driver\Exception\WriteException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?\RuntimeException|?\Throwable'], -'MongoDB\Driver\Exception\WriteException::__toString' => ['string'], -'MongoDB\Driver\Exception\WriteException::__wakeup' => ['void'], -'MongoDB\Driver\Exception\WriteException::getCode' => ['int'], -'MongoDB\Driver\Exception\WriteException::getFile' => ['string'], -'MongoDB\Driver\Exception\WriteException::getLine' => ['int'], -'MongoDB\Driver\Exception\WriteException::getMessage' => ['string'], -'MongoDB\Driver\Exception\WriteException::getPrevious' => ['RuntimeException|Throwable'], -'MongoDB\Driver\Exception\WriteException::getTrace' => ['array'], -'MongoDB\Driver\Exception\WriteException::getTraceAsString' => ['string'], -'MongoDB\Driver\Exception\WriteException::getWriteResult' => ['MongoDB\Driver\WriteResult'], -'MongoDB\Driver\Manager::__construct' => ['void', 'uri'=>'string', 'options='=>'array', 'driverOptions='=>'array'], -'MongoDB\Driver\Manager::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'bulk'=>'MongoDB\Driver\BulkWrite', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], -'MongoDB\Driver\Manager::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'readPreference='=>'MongoDB\Driver\ReadPreference'], -'MongoDB\Driver\Manager::executeDelete' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'deleteOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], -'MongoDB\Driver\Manager::executeInsert' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'document'=>'array|object', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], -'MongoDB\Driver\Manager::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'query'=>'MongoDB\Driver\Query', 'readPreference='=>'MongoDB\Driver\ReadPreference'], -'mongodb\driver\manager::executeReadCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], -'mongodb\driver\manager::executeReadWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], -'MongoDB\Driver\Manager::executeUpdate' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'], -'mongodb\driver\manager::executeWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'array'], -'MongoDB\Driver\Manager::getReadConcern' => ['MongoDB\Driver\ReadConcern'], -'MongoDB\Driver\Manager::getReadPreference' => ['MongoDB\Driver\ReadPreference'], -'MongoDB\Driver\Manager::getServers' => ['array'], -'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' => ['null|string'], -'mongodb\driver\readconcern::isDefault' => ['bool'], -'MongoDB\Driver\ReadPreference::__construct' => ['void', 'readPreference'=>'string', 'tagSets='=>'array', 'options='=>'array'], -'MongoDB\Driver\ReadPreference::bsonSerialize' => ['object'], -'mongodb\driver\readpreference::getMaxStalenessSeconds' => ['int'], -'MongoDB\Driver\ReadPreference::getMode' => ['int'], -'MongoDB\Driver\ReadPreference::getTagSets' => ['array'], -'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'=>'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|null'], -'mongodb\driver\session::getLogicalSessionId' => ['object'], -'mongodb\driver\session::getOperationTime' => ['MongoDB\BSON\Timestamp|null'], -'mongodb\driver\session::startTransaction' => ['void', 'options'=>'array|object'], -'MongoDB\Driver\WriteConcern::__construct' => ['void', 'wstring'=>'string', 'wtimeout='=>'int', 'journal='=>'bool', 'fsync='=>'bool'], -'mongodb\driver\writeconcern::bsonSerialize' => ['object'], -'mongodb\driver\writeconcern::getJournal' => ['boolean|null'], -'MongoDB\Driver\WriteConcern::getJurnal' => ['bool|null'], -'MongoDB\Driver\WriteConcern::getW' => ['int|null|string'], -'MongoDB\Driver\WriteConcern::getWtimeout' => ['int'], -'mongodb\driver\writeconcern::isDefault' => ['bool'], -'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' => ['array'], -'MongoException::getTraceAsString' => ['string'], -'MongoGridFS::__construct' => ['void', 'db'=>'MongoDB', 'prefix='=>'string', 'chunks='=>'mixed'], -'MongoGridFS::__get' => ['MongoCollection', 'name'=>'string'], -'MongoGridFS::__toString' => ['string'], -'MongoGridFS::aggregate' => ['array', 'pipeline'=>'array', 'op'=>'array', 'pipelineOperators'=>'array'], -'MongoGridFS::aggregateCursor' => ['MongoCommandCursor', 'pipeline'=>'array', 'options'=>'array'], -'MongoGridFS::batchInsert' => ['mixed', 'a'=>'array', 'options='=>'array'], -'MongoGridFS::count' => ['int', 'query='=>'stdClass|array'], -'MongoGridFS::createDBRef' => ['array', 'a'=>'array'], -'MongoGridFS::createIndex' => ['array', 'keys'=>'array', 'options='=>'array'], -'MongoGridFS::delete' => ['bool', 'id'=>'mixed'], -'MongoGridFS::deleteIndex' => ['array', 'keys'=>'array|string'], -'MongoGridFS::deleteIndexes' => ['array'], -'MongoGridFS::distinct' => ['array|bool', 'key'=>'string', 'query='=>'?array'], -'MongoGridFS::drop' => ['array'], -'MongoGridFS::ensureIndex' => ['bool', 'keys'=>'array', 'options='=>'array'], -'MongoGridFS::find' => ['MongoGridFSCursor', 'query='=>'array', 'fields='=>'array'], -'MongoGridFS::findAndModify' => ['array', 'query'=>'array', 'update='=>'?array', 'fields='=>'?array', 'options='=>'?array'], -'MongoGridFS::findOne' => ['MongoGridFSFile', 'query='=>'mixed', 'fields='=>'mixed'], -'MongoGridFS::get' => ['MongoGridFSFile', 'id'=>'mixed'], -'MongoGridFS::getDBRef' => ['array', 'ref'=>'array'], -'MongoGridFS::getIndexInfo' => ['array'], -'MongoGridFS::getName' => ['string'], -'MongoGridFS::getReadPreference' => ['array'], -'MongoGridFS::getSlaveOkay' => ['bool'], -'MongoGridFS::group' => ['array', 'keys'=>'mixed', 'initial'=>'array', 'reduce'=>'MongoCode', 'condition='=>'array'], -'MongoGridFS::insert' => ['array|bool', 'a'=>'array|object', 'options='=>'array'], -'MongoGridFS::put' => ['mixed', 'filename'=>'string', 'extra='=>'array'], -'MongoGridFS::remove' => ['bool', 'criteria='=>'array', 'options='=>'array'], -'MongoGridFS::save' => ['array|bool', 'a'=>'array|object', 'options='=>'array'], -'MongoGridFS::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags'=>'array'], -'MongoGridFS::setSlaveOkay' => ['bool', 'ok='=>'bool|true'], -'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|false'], -'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|true'], -'MongoGridFSCursor::batchSize' => ['MongoCursor', 'batchSize'=>'int'], -'MongoGridFSCursor::count' => ['int', 'all='=>'bool|false'], -'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|true'], -'MongoGridFSCursor::info' => ['array'], -'MongoGridFSCursor::key' => ['string'], -'MongoGridFSCursor::limit' => ['MongoCursor', 'num'=>'int'], -'MongoGridFSCursor::maxTimeMS' => ['MongoCursor', 'ms'=>'int'], -'MongoGridFSCursor::next' => ['void'], -'MongoGridFSCursor::partial' => ['MongoCursor', 'okay='=>'bool|true'], -'MongoGridFSCursor::reset' => ['void'], -'MongoGridFSCursor::rewind' => ['void'], -'MongoGridFSCursor::setFlag' => ['MongoCursor', 'flag'=>'int', 'set='=>'bool|true'], -'MongoGridFSCursor::setReadPreference' => ['MongoCursor', 'read_preference'=>'string', 'tags'=>'array'], -'MongoGridFSCursor::skip' => ['MongoCursor', 'num'=>'int'], -'MongoGridFSCursor::slaveOkay' => ['MongoCursor', 'okay='=>'bool|true'], -'MongoGridFSCursor::snapshot' => ['MongoCursor'], -'MongoGridFSCursor::sort' => ['MongoCursor', 'fields'=>'array'], -'MongoGridFSCursor::tailable' => ['MongoCursor', 'tail='=>'bool|true'], -'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' => ['array'], -'MongoResultException::getTraceAsString' => ['string'], -'MongoTimestamp::__construct' => ['void', 'sec='=>'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' => ['array'], -'MongoWriteConcernException::getTraceAsString' => ['string'], -'monitor_custom_event' => ['void', 'class'=>'class', 'text'=>'text', 'severe='=>'severe', 'user_data='=>'user_data'], -'monitor_httperror_event' => ['void', 'error_code'=>'error_code', 'url'=>'url', 'severe='=>'severe'], -'monitor_license_info' => ['array'], -'monitor_pass_error' => ['void', 'errno'=>'', 'errstr'=>'', 'errfile'=>'', 'errline'=>''], -'monitor_set_aggregation_hint' => ['void', 'hint'=>'hint'], -'move_uploaded_file' => ['bool', 'path'=>'string', 'new_path'=>'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', 'val'=>'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', 'perms='=>'int'], -'msg_queue_exists' => ['bool', 'key'=>'int'], -'msg_receive' => ['bool', 'queue'=>'resource', 'desiredmsgtype'=>'int', '&w_msgtype'=>'int', 'maxsize'=>'int', '&w_message'=>'mixed', 'unserialize='=>'bool', 'flags='=>'int', '&w_errorcode='=>'int'], -'msg_remove_queue' => ['bool', 'queue'=>'resource'], -'msg_send' => ['bool', 'queue'=>'resource', 'msgtype'=>'int', 'message'=>'mixed', 'serialize='=>'bool', 'blocking='=>'bool', '&w_errorcode='=>'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', 'fmt'=>'messageformatter', 'args'=>'array'], -'msgfmt_format_message' => ['string', 'locale'=>'string', 'pattern'=>'string', 'args'=>'array'], -'msgfmt_get_error_code' => ['int', 'fmt'=>'messageformatter'], -'msgfmt_get_error_message' => ['string', 'fmt'=>'messageformatter'], -'msgfmt_get_locale' => ['string', 'formatter'=>'messageformatter'], -'msgfmt_get_pattern' => ['string', 'fmt'=>'messageformatter'], -'msgfmt_parse' => ['array', 'fmt'=>'messageformatter', 'value'=>'string'], -'msgfmt_parse_message' => ['array', 'locale'=>'string', 'pattern'=>'string', 'source'=>'string'], -'msgfmt_set_pattern' => ['bool', 'fmt'=>'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'], -'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', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'], -'mysqli::autocommit' => ['bool', 'mode'=>'bool'], -'mysqli::begin_transaction' => ['bool', 'flags='=>'int', 'name='=>'string'], -'mysqli::change_user' => ['bool', 'user'=>'string', 'password'=>'string', 'database'=>'string'], -'mysqli::character_set_name' => ['string'], -'mysqli::close' => ['bool'], -'mysqli::commit' => ['bool', 'flags='=>'int', 'name='=>'string'], -'mysqli::debug' => ['bool', 'message'=>'string'], -'mysqli::disable_reads_from_master' => ['bool'], -'mysqli::dump_debug_info' => ['bool'], -'mysqli::escape_string' => ['string', 'escapestr'=>'string'], -'mysqli::get_charset' => ['object'], -'mysqli::get_client_info' => ['string'], -'mysqli::get_connection_stats' => ['array|false'], -'mysqli::get_warnings' => ['mysqli_warning'], -'mysqli::init' => ['mysqli'], -'mysqli::kill' => ['bool', 'processid'=>'int'], -'mysqli::more_results' => ['bool'], -'mysqli::multi_query' => ['bool', 'query'=>'string'], -'mysqli::next_result' => ['bool'], -'mysqli::options' => ['bool', 'option'=>'int', 'value'=>'mixed'], -'mysqli::ping' => ['bool'], -'mysqli::poll' => ['int|false', '&read'=>'array', '&error'=>'array', '&reject'=>'array', 'sec'=>'int', 'usec='=>'int'], -'mysqli::prepare' => ['mysqli_stmt|false', 'query'=>'string'], -'mysqli::query' => ['bool|mysqli_result', 'query'=>'string', 'resultmode='=>'int'], -'mysqli::real_connect' => ['bool', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string', 'flags='=>'int'], -'mysqli::real_escape_string' => ['string', 'escapestr'=>'string'], -'mysqli::real_query' => ['bool', 'query'=>'string'], -'mysqli::reap_async_query' => ['mysqli_result|false'], -'mysqli::refresh' => ['bool', 'options'=>'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', 'dbname'=>'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::ssl_set' => ['bool', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], -'mysqli::stat' => ['string|false'], -'mysqli::stmt_init' => ['mysqli_stmt'], -'mysqli::store_result' => ['mysqli_result|false', 'option='=>'int'], -'mysqli::thread_safe' => ['bool'], -'mysqli::use_result' => ['mysqli_result|false'], -'mysqli_affected_rows' => ['int', 'link'=>'mysqli'], -'mysqli_autocommit' => ['bool', 'link'=>'mysqli', 'mode'=>'bool'], -'mysqli_begin_transaction' => ['bool', 'link'=>'mysqli', 'flags='=>'int', 'name='=>'string'], -'mysqli_change_user' => ['bool', 'link'=>'mysqli', 'user'=>'string', 'password'=>'string', 'database'=>'string'], -'mysqli_character_set_name' => ['string', 'link'=>'mysqli'], -'mysqli_close' => ['bool', 'link'=>'mysqli'], -'mysqli_commit' => ['bool', 'link'=>'mysqli', 'flags='=>'int', 'name='=>'string'], -'mysqli_connect' => ['mysqli|false', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'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', 'message'=>'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', 'link'=>'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', 'link'=>'mysqli'], -'mysqli_error' => ['string', 'link'=>'mysqli'], -'mysqli_error_list' => ['array', 'connection'=>'mysqli'], -'mysqli_escape_string' => ['string', 'link'=>'mysqli', 'escapestr'=>'string'], -'mysqli_execute' => ['bool', 'stmt'=>'mysqli_stmt'], -'mysqli_fetch_all' => ['array', 'result'=>'mysqli_result', 'resulttype='=>'int'], -'mysqli_fetch_array' => ['array|null', 'result'=>'mysqli_result', 'resulttype='=>'int'], -'mysqli_fetch_assoc' => ['array<string,string>|null', 'result'=>'mysqli_result'], -'mysqli_fetch_field' => ['object|false', 'result'=>'mysqli_result'], -'mysqli_fetch_field_direct' => ['object|false', 'result'=>'mysqli_result', 'fieldnr'=>'int'], -'mysqli_fetch_fields' => ['array|false', 'result'=>'mysqli_result'], -'mysqli_fetch_lengths' => ['array|false', 'result'=>'mysqli_result'], -'mysqli_fetch_object' => ['object|null', 'result'=>'mysqli_result', 'class_name='=>'string', 'params='=>'?array'], -'mysqli_fetch_row' => ['array|null', 'result'=>'mysqli_result'], -'mysqli_field_count' => ['int', 'link'=>'mysqli'], -'mysqli_field_seek' => ['bool', 'result'=>'mysqli_result', 'fieldnr'=>'int'], -'mysqli_field_tell' => ['int', 'result'=>'mysqli_result'], -'mysqli_free_result' => ['void', 'link'=>'mysqli_result'], -'mysqli_get_cache_stats' => ['array'], -'mysqli_get_charset' => ['object', 'link'=>'mysqli'], -'mysqli_get_client_info' => ['string', 'link'=>'mysqli'], -'mysqli_get_client_stats' => ['array|false'], -'mysqli_get_client_version' => ['int', 'link'=>'mysqli'], -'mysqli_get_connection_stats' => ['array|false', 'link'=>'mysqli'], -'mysqli_get_host_info' => ['string', 'link'=>'mysqli'], -'mysqli_get_links_stats' => ['array'], -'mysqli_get_proto_info' => ['int', 'link'=>'mysqli'], -'mysqli_get_server_info' => ['string', 'link'=>'mysqli'], -'mysqli_get_server_version' => ['int', 'link'=>'mysqli'], -'mysqli_get_warnings' => ['mysqli_warning', 'link'=>'mysqli'], -'mysqli_info' => ['?string', 'link'=>'mysqli'], -'mysqli_init' => ['mysqli'], -'mysqli_insert_id' => ['int|string', 'link'=>'mysqli'], -'mysqli_kill' => ['bool', 'link'=>'mysqli', 'processid'=>'int'], -'mysqli_link_construct' => ['object'], -'mysqli_master_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], -'mysqli_more_results' => ['bool', 'link'=>'mysqli'], -'mysqli_multi_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], -'mysqli_next_result' => ['bool', 'link'=>'mysqli'], -'mysqli_num_fields' => ['int', 'link'=>'mysqli_result'], -'mysqli_num_rows' => ['int', 'link'=>'mysqli_result'], -'mysqli_options' => ['bool', 'link'=>'mysqli', 'option'=>'int', 'value'=>'mixed'], -'mysqli_ping' => ['bool', 'link'=>'mysqli'], -'mysqli_poll' => ['int|false', 'read'=>'array', 'error'=>'array', 'reject'=>'array', 'sec'=>'int', 'usec='=>'int'], -'mysqli_prepare' => ['mysqli_stmt|false', 'link'=>'mysqli', 'query'=>'string'], -'mysqli_query' => ['mysqli_result|bool', 'link'=>'mysqli', 'query'=>'string', 'resultmode='=>'int'], -'mysqli_real_connect' => ['bool', 'link='=>'mysqli', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string', 'flags='=>'int'], -'mysqli_real_escape_string' => ['string', 'link'=>'mysqli', 'escapestr'=>'string'], -'mysqli_real_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], -'mysqli_reap_async_query' => ['mysqli_result|false', 'link'=>'mysqli'], -'mysqli_refresh' => ['bool', 'link'=>'mysqli', 'options'=>'int'], -'mysqli_release_savepoint' => ['bool', 'link'=>'mysqli', 'name'=>'string'], -'mysqli_report' => ['bool', 'flags'=>'int'], -'mysqli_result::__construct' => ['void', 'link'=>'mysqli', 'resultmode='=>'int'], -'mysqli_result::close' => ['void'], -'mysqli_result::data_seek' => ['bool', 'offset'=>'int'], -'mysqli_result::fetch_all' => ['array', 'resulttype='=>'int'], -'mysqli_result::fetch_array' => ['array|null', 'resulttype='=>'int'], -'mysqli_result::fetch_assoc' => ['array<string,string>|null'], -'mysqli_result::fetch_field' => ['object|false'], -'mysqli_result::fetch_field_direct' => ['object|false', 'fieldnr'=>'int'], -'mysqli_result::fetch_fields' => ['array|false'], -'mysqli_result::fetch_object' => ['object|null', 'class_name='=>'string', 'params='=>'array'], -'mysqli_result::fetch_row' => ['array|null'], -'mysqli_result::field_seek' => ['bool', 'fieldnr'=>'int'], -'mysqli_result::free' => ['void'], -'mysqli_result::free_result' => ['void'], -'mysqli_rollback' => ['bool', 'link'=>'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', 'link'=>'mysqli', 'name'=>'string'], -'mysqli_savepoint_libmysql' => ['bool'], -'mysqli_select_db' => ['bool', 'link'=>'mysqli', 'dbname'=>'string'], -'mysqli_send_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], -'mysqli_set_charset' => ['bool', 'link'=>'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', 'link'=>'mysqli', 'option'=>'int', 'value'=>'mixed'], -'mysqli_slave_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'], -'mysqli_sqlstate' => ['string', 'link'=>'mysqli'], -'mysqli_ssl_set' => ['bool', 'link'=>'mysqli', 'key'=>'string', 'cert'=>'string', 'ca'=>'string', 'capath'=>'string', 'cipher'=>'string'], -'mysqli_stat' => ['string|false', 'link'=>'mysqli'], -'mysqli_stmt::__construct' => ['void', 'query='=>'string'], -'mysqli_stmt::attr_get' => ['false|int', 'attr'=>'int'], -'mysqli_stmt::attr_set' => ['bool', 'attr'=>'int', 'mode'=>'int'], -'mysqli_stmt::bind_param' => ['bool', 'types'=>'string', '&var1'=>'mixed', '&...args='=>'mixed'], -'mysqli_stmt::bind_result' => ['bool', '&var1'=>'mixed', '&...args='=>'mixed'], -'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_nr'=>'int', 'data'=>'string'], -'mysqli_stmt::store_result' => ['bool'], -'mysqli_stmt_affected_rows' => ['int|string', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_attr_get' => ['int|false', 'stmt'=>'mysqli_stmt', 'attr'=>'int'], -'mysqli_stmt_attr_set' => ['bool', 'stmt'=>'mysqli_stmt', 'attr'=>'int', 'mode'=>'int'], -'mysqli_stmt_bind_param' => ['bool', 'stmt'=>'mysqli_stmt', 'types'=>'string', '&var1'=>'mixed', '&...args='=>'mixed'], -'mysqli_stmt_bind_result' => ['bool', 'stmt'=>'mysqli_stmt', '&var1='=>'mixed', '&...args='=>'mixed'], -'mysqli_stmt_close' => ['bool', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_data_seek' => ['void', 'stmt'=>'mysqli_stmt', 'offset'=>'int'], -'mysqli_stmt_errno' => ['int', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_error' => ['string', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_error_list' => ['array', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_execute' => ['bool', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_fetch' => ['bool', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_field_count' => ['int', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_free_result' => ['void', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_get_result' => ['mysqli_result|false', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_get_warnings' => ['object', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_init' => ['mysqli_stmt', 'link'=>'mysqli'], -'mysqli_stmt_insert_id' => ['', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_more_results' => ['bool', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_next_result' => ['bool', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_num_rows' => ['int', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_param_count' => ['int', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_prepare' => ['bool', 'stmt'=>'mysqli_stmt', 'query'=>'string'], -'mysqli_stmt_reset' => ['bool', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_result_metadata' => ['mysqli_result|false', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_send_long_data' => ['bool', 'stmt'=>'mysqli_stmt', 'param_nr'=>'int', 'data'=>'string'], -'mysqli_stmt_sqlstate' => ['string', 'stmt'=>'mysqli_stmt'], -'mysqli_stmt_store_result' => ['bool', 'stmt'=>'mysqli_stmt'], -'mysqli_store_result' => ['mysqli_result|false', 'link'=>'mysqli', 'option='=>'int'], -'mysqli_thread_id' => ['int', 'link'=>'mysqli'], -'mysqli_thread_safe' => ['bool'], -'mysqli_use_result' => ['mysqli_result|false', 'link'=>'mysqli'], -'mysqli_warning::__construct' => ['void'], -'mysqli_warning::next' => ['void'], -'mysqli_warning_count' => ['int', 'link'=>'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_arg'=>'array'], -'natsort' => ['bool', '&rw_array_arg'=>'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', 'str'=>'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'=>''], -'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' => ['bool'], -'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', 'val'=>'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', '&rw_array_arg'=>'array|object'], -'ngettext' => ['string', 'msgid1'=>'string', 'msgid2'=>'string', 'n'=>'int'], -'nl2br' => ['string', 'str'=>'string', 'is_xhtml='=>'bool'], -'nl_langinfo' => ['string', 'item'=>'int'], -'NoRewindIterator::__construct' => ['void', 'it'=>'iterator'], -'NoRewindIterator::current' => ['mixed'], -'NoRewindIterator::getInnerIterator' => ['iterator'], -'NoRewindIterator::key' => ['mixed'], -'NoRewindIterator::next' => ['void'], -'NoRewindIterator::rewind' => ['void'], -'NoRewindIterator::valid' => ['bool'], -'Normalizer::isNormalized' => ['bool', 'input'=>'string', 'form='=>'int'], -'Normalizer::normalize' => ['string', 'input'=>'string', 'form='=>'int'], -'normalizer_is_normalized' => ['bool', 'input'=>'string', 'form='=>'int'], -'normalizer_normalize' => ['string', 'input'=>'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', 'number'=>'float|int', 'num_decimal_places='=>'int'], -'number_format\'1' => ['string', 'number'=>'float|int', 'num_decimal_places'=>'int', 'dec_separator'=>'string', 'thousands_separator'=>'string'], -'NumberFormatter::__construct' => ['void', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], -'NumberFormatter::create' => ['NumberFormatter', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], -'NumberFormatter::format' => ['string', 'num'=>'', 'type='=>'int'], -'NumberFormatter::formatCurrency' => ['string', 'num'=>'float', 'currency'=>'string'], -'NumberFormatter::getAttribute' => ['int', 'attr'=>'int'], -'NumberFormatter::getErrorCode' => ['int'], -'NumberFormatter::getErrorMessage' => ['string'], -'NumberFormatter::getLocale' => ['string', 'type='=>'int'], -'NumberFormatter::getPattern' => ['string'], -'NumberFormatter::getSymbol' => ['string', 'attr'=>'int'], -'NumberFormatter::getTextAttribute' => ['string', 'attr'=>'int'], -'NumberFormatter::parse' => ['float|false', 'str'=>'string', 'type='=>'int', '&rw_position='=>'int'], -'NumberFormatter::parseCurrency' => ['float', 'str'=>'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', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'], -'numfmt_format' => ['string', 'fmt'=>'numberformatter', 'value'=>'float', 'type='=>'int'], -'numfmt_format_currency' => ['string|false', 'fmt'=>'numberformatter', 'value'=>'float', 'currency'=>'string'], -'numfmt_get_attribute' => ['int', 'fmt'=>'numberformatter', 'attr'=>'int'], -'numfmt_get_error_code' => ['int', 'fmt'=>'numberformatter'], -'numfmt_get_error_message' => ['string', 'fmt'=>'numberformatter'], -'numfmt_get_locale' => ['string', 'fmt'=>'numberformatter', 'type='=>'int'], -'numfmt_get_pattern' => ['string', 'fmt'=>'numberformatter'], -'numfmt_get_symbol' => ['string', 'fmt'=>'numberformatter', 'attr'=>'int'], -'numfmt_get_text_attribute' => ['string', 'fmt'=>'numberformatter', 'attr'=>'int'], -'numfmt_parse' => ['float|false', 'fmt'=>'numberformatter', 'value'=>'string', 'type='=>'int', '&rw_position='=>'int'], -'numfmt_parse_currency' => ['float|false', 'fmt'=>'numberformatter', 'value'=>'string', '&w_currency'=>'string', '&rw_position='=>'int'], -'numfmt_set_attribute' => ['bool', 'fmt'=>'numberformatter', 'attr'=>'int', 'value'=>'int'], -'numfmt_set_pattern' => ['bool', 'fmt'=>'numberformatter', 'pattern'=>'string'], -'numfmt_set_symbol' => ['bool', 'fmt'=>'numberformatter', 'attr'=>'int', 'value'=>'string'], -'numfmt_set_text_attribute' => ['bool', 'fmt'=>'numberformatter', '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'], -'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'], -'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', 'flag='=>'int'], -'ob_inflatehandler' => ['string', 'data'=>'string', 'mode'=>'int'], -'ob_list_handlers' => ['false|array'], -'ob_start' => ['bool', 'user_function='=>'string|array|?callable', 'chunk_size='=>'int', 'flags='=>'int'], -'ob_tidyhandler' => ['string', 'input'=>'string', 'mode='=>'int'], -'oci_bind_array_by_name' => ['bool', 'stmt'=>'resource', 'name'=>'string', '&rw_var'=>'array', 'max_table_length'=>'int', 'max_item_length='=>'int', 'type='=>'int'], -'oci_bind_by_name' => ['bool', 'stmt'=>'resource', 'name'=>'string', '&rw_var'=>'mixed', 'maxlength='=>'int', 'type='=>'int'], -'oci_cancel' => ['bool', 'stmt'=>'resource'], -'oci_client_version' => ['string'], -'oci_close' => ['bool', 'connection'=>'resource'], -'OCI_Collection::append' => ['bool', 'value'=>'mixed'], -'OCI_Collection::assign' => ['bool', 'from'=>'OCI_Collection'], -'OCI_Collection::assignElem' => ['bool', 'index'=>'int', 'value'=>'mixed'], -'OCI_Collection::free' => ['bool'], -'OCI_Collection::getElem' => ['mixed', 'index'=>'int'], -'OCI_Collection::max' => ['int'], -'OCI_Collection::size' => ['int'], -'OCI_Collection::trim' => ['bool', 'num'=>'int'], -'oci_collection_append' => ['bool', 'value'=>'string'], -'oci_collection_assign' => ['bool', 'from'=>'object'], -'oci_collection_element_assign' => ['bool', 'index'=>'int', 'val'=>'string'], -'oci_collection_element_get' => ['string', 'ndx'=>'int'], -'oci_collection_max' => ['int'], -'oci_collection_size' => ['int'], -'oci_collection_trim' => ['bool', 'num'=>'int'], -'oci_commit' => ['bool', 'connection'=>'resource'], -'oci_connect' => ['resource|false', 'user'=>'string', 'pass'=>'string', 'db='=>'string', 'charset='=>'string', 'session_mode='=>'int'], -'oci_define_by_name' => ['bool', 'stmt'=>'resource', 'name'=>'string', '&w_var'=>'mixed', 'type='=>'int'], -'oci_error' => ['array|false', 'resource='=>'resource'], -'oci_execute' => ['bool', 'stmt'=>'resource', 'mode='=>'int'], -'oci_fetch' => ['bool', 'stmt'=>'resource'], -'oci_fetch_all' => ['int|false', 'stmt'=>'resource', '&w_output'=>'array', 'skip='=>'int', 'maxrows='=>'int', 'flags='=>'int'], -'oci_fetch_array' => ['array|false', 'stmt'=>'resource', 'mode='=>'int'], -'oci_fetch_assoc' => ['array|false', 'stmt'=>'resource'], -'oci_fetch_object' => ['object|false', 'stmt'=>'resource'], -'oci_fetch_row' => ['array|false', 'stmt'=>'resource'], -'oci_field_is_null' => ['bool', 'stmt'=>'resource', 'col'=>'mixed'], -'oci_field_name' => ['string|false', 'stmt'=>'resource', 'col'=>'mixed'], -'oci_field_precision' => ['int|false', 'stmt'=>'resource', 'col'=>'mixed'], -'oci_field_scale' => ['int|false', 'stmt'=>'resource', 'col'=>'mixed'], -'oci_field_size' => ['int|false', 'stmt'=>'resource', 'col'=>'mixed'], -'oci_field_type' => ['mixed', 'stmt'=>'resource', 'col'=>'mixed'], -'oci_field_type_raw' => ['int|false', 'stmt'=>'resource', 'col'=>'mixed'], -'oci_free_collection' => ['bool'], -'oci_free_cursor' => ['bool', 'stmt'=>'resource'], -'oci_free_descriptor' => ['bool'], -'oci_free_statement' => ['bool', 'stmt'=>'resource'], -'oci_get_implicit' => ['bool', 'stmt'=>''], -'oci_get_implicit_resultset' => ['resource|false', 'statement'=>'resource'], -'oci_internal_debug' => ['void', 'onoff'=>'bool'], -'OCI_Lob::append' => ['bool', 'lob_from'=>'OCI_Lob'], -'OCI_Lob::close' => ['bool'], -'OCI_Lob::eof' => ['bool'], -'OCI_Lob::erase' => ['int', 'offset='=>'int', 'length='=>'int'], -'OCI_Lob::export' => ['bool', 'filename'=>'string', 'start='=>'int', 'length='=>'int'], -'OCI_Lob::flush' => ['bool', 'flag='=>'int'], -'OCI_Lob::free' => ['bool'], -'OCI_Lob::getbuffering' => ['bool'], -'OCI_Lob::import' => ['bool', 'filename'=>'string'], -'OCI_Lob::load' => ['string'], -'OCI_Lob::read' => ['string', 'length'=>'int'], -'OCI_Lob::rewind' => ['bool'], -'OCI_Lob::save' => ['bool', 'data'=>'string', 'offset='=>'int'], -'OCI_Lob::savefile' => ['bool', 'filename'=>''], -'OCI_Lob::seek' => ['bool', 'offset'=>'int', 'whence='=>'int'], -'OCI_Lob::setbuffering' => ['bool', 'on_off'=>'bool'], -'OCI_Lob::size' => ['int'], -'OCI_Lob::tell' => ['int'], -'OCI_Lob::truncate' => ['bool', 'length='=>'int'], -'OCI_Lob::write' => ['int', 'data'=>'string', 'length='=>'int'], -'OCI_Lob::writeTemporary' => ['bool', 'data'=>'string', 'lob_type='=>'int'], -'OCI_Lob::writetofile' => ['bool', 'filename'=>'', 'start'=>'', 'length'=>''], -'oci_lob_append' => ['bool', 'lob'=>'object'], -'oci_lob_close' => ['bool'], -'oci_lob_copy' => ['bool', 'lob_to'=>'OCI_Lob', 'lob_from'=>'OCI_Lob', 'length='=>'int'], -'oci_lob_eof' => ['bool'], -'oci_lob_erase' => ['int', 'offset'=>'int', 'length'=>'int'], -'oci_lob_export' => ['bool', 'filename'=>'string', 'start'=>'int', 'length'=>'int'], -'oci_lob_flush' => ['bool', 'flag'=>'int'], -'oci_lob_import' => ['bool', 'filename'=>'string'], -'oci_lob_is_equal' => ['bool', 'lob1'=>'OCI_Lob', 'lob2'=>'OCI_Lob'], -'oci_lob_load' => ['string'], -'oci_lob_read' => ['string', 'length'=>'int'], -'oci_lob_rewind' => ['bool'], -'oci_lob_save' => ['bool', 'data'=>'string', 'offset'=>'int'], -'oci_lob_seek' => ['bool', 'offset'=>'int', 'whence'=>'int'], -'oci_lob_size' => ['int'], -'oci_lob_tell' => ['int'], -'oci_lob_truncate' => ['bool', 'length'=>'int'], -'oci_lob_write' => ['int', 'string'=>'string', 'length'=>'int'], -'oci_lob_write_temporary' => ['bool', 'var'=>'string', 'lob_type'=>'int'], -'oci_new_collection' => ['OCI_Collection|false', 'connection'=>'resource', 'tdo'=>'string', 'schema='=>'string'], -'oci_new_connect' => ['resource|false', 'user'=>'string', 'pass'=>'string', 'db='=>'string', 'charset='=>'string', 'session_mode='=>'int'], -'oci_new_cursor' => ['resource|false', 'connection'=>'resource'], -'oci_new_descriptor' => ['OCI_Lob|false', 'connection'=>'resource', 'type='=>'int'], -'oci_num_fields' => ['int|false', 'stmt'=>'resource'], -'oci_num_rows' => ['int|false', 'stmt'=>'resource'], -'oci_parse' => ['resource|false', 'connection'=>'resource', 'statement'=>'string'], -'oci_password_change' => ['bool', 'connection'=>'', 'username'=>'string', 'old_password'=>'string', 'new_password'=>'string'], -'oci_pconnect' => ['resource|false', 'user'=>'string', 'pass'=>'string', 'db='=>'string', 'charset='=>'string', 'session_mode='=>'int'], -'oci_register_taf_callback' => ['bool', 'connection'=>'resource', 'callback='=>'callable'], -'oci_result' => ['string|false', 'stmt'=>'resource', 'column'=>'mixed'], -'oci_rollback' => ['bool', 'connection'=>'resource'], -'oci_server_version' => ['string|false', 'connection'=>'resource'], -'oci_set_action' => ['bool', 'connection'=>'resource', 'value'=>'string'], -'oci_set_call_timeout' => ['bool', 'connection'=>'resource', 'time_out'=>'int'], -'oci_set_client_identifier' => ['bool', 'connection'=>'resource', 'value'=>'string'], -'oci_set_client_info' => ['bool', 'connection'=>'resource', 'value'=>'string'], -'oci_set_db_operation' => ['bool', 'connection'=>'resource', 'value'=>'string'], -'oci_set_edition' => ['bool', 'value'=>'string'], -'oci_set_module_name' => ['bool', 'connection'=>'resource', 'value'=>'string'], -'oci_set_prefetch' => ['bool', 'stmt'=>'resource', 'prefetch_rows'=>'int'], -'oci_statement_type' => ['string|false', 'stmt'=>'resource'], -'oci_unregister_taf_callback' => ['bool', 'connection'=>'resource'], -'ocifetchinto' => ['int', 'stmt'=>'resource', '&w_output'=>'array', 'mode='=>'int'], -'ocigetbufferinglob' => ['bool'], -'ocisetbufferinglob' => ['bool', 'flag'=>'bool'], -'octdec' => ['int', 'octal_number'=>'string'], -'odbc_autocommit' => ['mixed', 'connection_id'=>'resource', 'onoff='=>'bool'], -'odbc_binmode' => ['bool', 'result_id'=>'int', 'mode'=>'int'], -'odbc_close' => ['void', 'connection_id'=>'resource'], -'odbc_close_all' => ['void'], -'odbc_columnprivileges' => ['resource', 'connection_id'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'column'=>'string'], -'odbc_columns' => ['resource', 'connection_id'=>'resource', 'qualifier='=>'string', 'owner='=>'string', 'table_name='=>'string', 'column_name='=>'string'], -'odbc_commit' => ['bool', 'connection_id'=>'resource'], -'odbc_connect' => ['resource', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'], -'odbc_cursor' => ['string', 'result_id'=>'resource'], -'odbc_data_source' => ['array', 'connection_id'=>'resource', 'fetch_type'=>'int'], -'odbc_do' => ['resource', 'connection_id'=>'resource', 'query'=>'string', 'flags='=>'int'], -'odbc_error' => ['string', 'connection_id='=>'resource'], -'odbc_errormsg' => ['string', 'connection_id='=>'resource'], -'odbc_exec' => ['resource', 'connection_id'=>'resource', 'query'=>'string', 'flags='=>'int'], -'odbc_execute' => ['bool', 'result_id'=>'resource', 'parameters_array='=>'array'], -'odbc_fetch_array' => ['array', 'result'=>'resource', 'rownumber='=>'int'], -'odbc_fetch_into' => ['int', 'result_id'=>'resource', '&w_result_array'=>'array', 'rownumber='=>'int'], -'odbc_fetch_object' => ['object', 'result'=>'resource', 'rownumber='=>'int'], -'odbc_fetch_row' => ['bool', 'result_id'=>'resource', 'row_number='=>'int'], -'odbc_field_len' => ['int', 'result_id'=>'resource', 'field_number'=>'int'], -'odbc_field_name' => ['string', 'result_id'=>'resource', 'field_number'=>'int'], -'odbc_field_num' => ['int', 'result_id'=>'resource', 'field_name'=>'string'], -'odbc_field_precision' => ['int', 'result_id'=>'resource', 'field_number'=>'int'], -'odbc_field_scale' => ['int', 'result_id'=>'resource', 'field_number'=>'int'], -'odbc_field_type' => ['string', 'result_id'=>'resource', 'field_number'=>'int'], -'odbc_foreignkeys' => ['resource', 'connection_id'=>'resource', 'pk_qualifier'=>'string', 'pk_owner'=>'string', 'pk_table'=>'string', 'fk_qualifier'=>'string', 'fk_owner'=>'string', 'fk_table'=>'string'], -'odbc_free_result' => ['bool', 'result_id'=>'resource'], -'odbc_gettypeinfo' => ['resource', 'connection_id'=>'resource', 'data_type='=>'int'], -'odbc_longreadlen' => ['bool', 'result_id'=>'int', 'length'=>'int'], -'odbc_next_result' => ['bool', 'result_id'=>'resource'], -'odbc_num_fields' => ['int', 'result_id'=>'resource'], -'odbc_num_rows' => ['int', 'result_id'=>'resource'], -'odbc_pconnect' => ['resource', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'], -'odbc_prepare' => ['resource', 'connection_id'=>'resource', 'query'=>'string'], -'odbc_primarykeys' => ['resource', 'connection_id'=>'resource', 'qualifier'=>'string', 'owner'=>'string', 'table'=>'string'], -'odbc_procedurecolumns' => ['resource', 'connection_id'=>'', 'qualifier'=>'string', 'owner'=>'string', 'proc'=>'string', 'column'=>'string'], -'odbc_procedures' => ['resource', 'connection_id'=>'', 'qualifier'=>'string', 'owner'=>'string', 'name'=>'string'], -'odbc_result' => ['mixed', 'result_id'=>'resource', 'field'=>'mixed'], -'odbc_result_all' => ['int', 'result_id'=>'resource', 'format='=>'string'], -'odbc_rollback' => ['bool', 'connection_id'=>'resource'], -'odbc_setoption' => ['bool', 'result_id'=>'resource', 'which'=>'int', 'option'=>'int', 'value'=>'int'], -'odbc_specialcolumns' => ['resource', 'connection_id'=>'resource', 'type'=>'int', 'qualifier'=>'string', 'owner'=>'string', 'table'=>'string', 'scope'=>'int', 'nullable'=>'int'], -'odbc_statistics' => ['resource', 'connection_id'=>'resource', 'qualifier'=>'string', 'owner'=>'string', 'name'=>'string', 'unique'=>'int', 'accuracy'=>'int'], -'odbc_tableprivileges' => ['resource', 'connection_id'=>'resource', 'qualifier'=>'string', 'owner'=>'string', 'name'=>'string'], -'odbc_tables' => ['resource', 'connection_id'=>'resource', 'qualifier='=>'string', 'owner='=>'string', 'name='=>'string', 'table_types='=>'string'], -'opcache_compile_file' => ['bool', 'file'=>'string'], -'opcache_get_configuration' => ['array'], -'opcache_get_status' => ['array|false', 'get_scripts='=>'bool'], -'opcache_invalidate' => ['bool', 'script'=>'string', 'force='=>'bool'], -'opcache_is_script_cached' => ['bool', 'script'=>'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', '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', 'path'=>'string', 'context='=>'resource'], -'openlog' => ['bool', 'ident'=>'string', 'option'=>'int', 'facility'=>'int'], -'openssl_cipher_iv_length' => ['int|false', 'method'=>'string'], -'openssl_csr_export' => ['bool', 'csr'=>'string|resource', '&w_out'=>'string', 'notext='=>'bool'], -'openssl_csr_export_to_file' => ['bool', 'csr'=>'string|resource', 'outfilename'=>'string', 'notext='=>'bool'], -'openssl_csr_get_public_key' => ['resource|false', 'csr'=>'string|resource', 'use_shortnames='=>'bool'], -'openssl_csr_get_subject' => ['array|false', 'csr'=>'string|resource', 'use_shortnames='=>'bool'], -'openssl_csr_new' => ['resource|false', 'dn'=>'array', '&w_privkey'=>'resource', 'configargs='=>'array', 'extraattribs='=>'array'], -'openssl_csr_sign' => ['resource|false', 'csr'=>'string|resource', 'x509'=>'string|resource|null', 'priv_key'=>'string|resource|array', 'days'=>'int', 'config_args='=>'array', 'serial='=>'int'], -'openssl_decrypt' => ['string|false', 'data'=>'string', 'method'=>'string', 'key'=>'string', 'options='=>'int', 'iv='=>'string', 'tag='=>'string', 'aad='=>'string'], -'openssl_dh_compute_key' => ['string|false', 'pub_key'=>'string', 'dh_key'=>'resource'], -'openssl_digest' => ['string|false', 'data'=>'string', 'method'=>'string', 'raw_output='=>'bool'], -'openssl_encrypt' => ['string|false', 'data'=>'string', 'method'=>'string', 'key'=>'string', 'options='=>'int', 'iv='=>'string', '&w_tag='=>'string', 'aad='=>'string', 'tag_length='=>'int'], -'openssl_error_string' => ['string|false'], -'openssl_free_key' => ['void', 'key_identifier'=>'resource'], -'openssl_get_cert_locations' => ['array'], -'openssl_get_cipher_methods' => ['array', 'aliases='=>'bool'], -'openssl_get_curve_names' => ['array<int,string>'], -'openssl_get_md_methods' => ['array', 'aliases='=>'bool'], -'openssl_get_privatekey' => ['resource|false', 'key'=>'string', 'passphrase='=>'string'], -'openssl_get_publickey' => ['resource|false', 'cert'=>'resource|string'], -'openssl_open' => ['bool', 'sealed_data'=>'string', '&w_open_data'=>'string', 'env_key'=>'string', 'priv_key_id'=>'string|array|resource', 'method='=>'string', 'iv='=>'string'], -'openssl_pbkdf2' => ['string|false', 'password'=>'string', 'salt'=>'string', 'key_length'=>'int', 'iterations'=>'int', 'digest_algorithm='=>'string'], -'openssl_pkcs12_export' => ['bool', 'x509'=>'string|resource', '&w_out'=>'string', 'priv_key'=>'string|array|resource', 'pass'=>'string', 'args='=>'array'], -'openssl_pkcs12_export_to_file' => ['bool', 'x509'=>'string|resource', 'filename'=>'string', 'priv_key'=>'string|array|resource', 'pass'=>'string', 'args='=>'array'], -'openssl_pkcs12_read' => ['bool', 'pkcs12'=>'string', '&w_certs'=>'array', 'pass'=>'string'], -'openssl_pkcs7_decrypt' => ['bool', 'infilename'=>'string', 'outfilename'=>'string', 'recipcert'=>'string|resource', 'recipkey='=>'string|resource|array'], -'openssl_pkcs7_encrypt' => ['bool', 'infile'=>'string', 'outfile'=>'string', 'recipcerts'=>'string|resource|array', 'headers'=>'array', 'flags='=>'int', 'cipherid='=>'int'], -'openssl_pkcs7_read' => ['bool', 'infilename'=>'string', '&certs'=>'array'], -'openssl_pkcs7_sign' => ['bool', 'infile'=>'string', 'outfile'=>'string', 'signcert'=>'string|resource', 'privkey'=>'string|resource|array', 'headers'=>'array', 'flags='=>'int', 'extracerts='=>'string'], -'openssl_pkcs7_verify' => ['bool|int', 'filename'=>'string', 'flags'=>'int', 'outfilename='=>'string', 'cainfo='=>'array', 'extracerts='=>'string', 'content='=>'string', 'p7bfilename='=>'string'], -'openssl_pkey_derive' => ['string', 'peer_pub_key'=>'mixed', 'priv_key'=>'mixed', 'keylen='=>'?int'], -'openssl_pkey_export' => ['bool', 'key'=>'resource', '&w_out'=>'string', 'passphrase='=>'string', 'configargs='=>'array'], -'openssl_pkey_export_to_file' => ['bool', 'key'=>'resource|string|array', 'outfilename'=>'string', 'passphrase='=>'string', 'configargs='=>'array'], -'openssl_pkey_free' => ['void', 'key'=>'resource'], -'openssl_pkey_get_details' => ['array|false', 'key'=>'resource'], -'openssl_pkey_get_private' => ['resource|false', 'key'=>'string', 'passphrase='=>'string'], -'openssl_pkey_get_public' => ['resource|false', 'certificate'=>'resource|string'], -'openssl_pkey_new' => ['resource|false', 'configargs='=>'array'], -'openssl_private_decrypt' => ['bool', 'data'=>'string', '&w_decrypted'=>'string', 'key'=>'string|resource|array', 'padding='=>'int'], -'openssl_private_encrypt' => ['bool', 'data'=>'string', '&w_crypted'=>'string', 'key'=>'string|resource|array', 'padding='=>'int'], -'openssl_public_decrypt' => ['bool', 'data'=>'string', '&w_decrypted'=>'string', 'key'=>'string|resource', 'padding='=>'int'], -'openssl_public_encrypt' => ['bool', 'data'=>'string', '&w_crypted'=>'string', 'key'=>'string|resource', 'padding='=>'int'], -'openssl_random_pseudo_bytes' => ['string|false', 'length'=>'int', '&w_crypto_strong='=>'bool'], -'openssl_seal' => ['int|false', 'data'=>'string', '&w_sealed_data'=>'string', '&rw_env_keys'=>'array', 'pub_key_ids'=>'array', 'method='=>'string', '&iv='=>'string'], -'openssl_sign' => ['bool', 'data'=>'string', '&w_signature'=>'string', 'priv_key_id'=>'resource|string', 'signature_alg='=>'int|string'], -'openssl_spki_export' => ['string|null', 'spkac'=>'string'], -'openssl_spki_export_challenge' => ['string|null', 'spkac'=>'string'], -'openssl_spki_new' => ['string|null', 'privkey'=>'resource', 'challenge'=>'string', 'algorithm='=>'int'], -'openssl_spki_verify' => ['bool', 'spkac'=>'string'], -'openssl_verify' => ['int', 'data'=>'string', 'signature'=>'string', 'pub_key_id'=>'resource|string', 'signature_alg='=>'int|string'], -'openssl_x509_check_private_key' => ['bool', 'cert'=>'string|resource', 'key'=>'string|resource|array'], -'openssl_x509_checkpurpose' => ['bool|int', 'x509cert'=>'string|resource', 'purpose'=>'int', 'cainfo='=>'array', 'untrustedfile='=>'string'], -'openssl_x509_export' => ['bool', 'x509'=>'string|resource', '&w_output'=>'string', 'notext='=>'bool'], -'openssl_x509_export_to_file' => ['bool', 'x509'=>'string|resource', 'outfilename'=>'string', 'notext='=>'bool'], -'openssl_x509_fingerprint' => ['string|false', 'x509'=>'string|resource', 'hash_algorithm='=>'string', 'raw_output='=>'bool'], -'openssl_x509_free' => ['void', 'x509'=>'resource'], -'openssl_x509_parse' => ['array|false', 'x509cert'=>'string|resource', 'shortnames='=>'bool'], -'openssl_x509_read' => ['resource|false', 'x509certdata'=>'string|resource'], -'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' => ['array'], -'OutOfBoundsException::getTraceAsString' => ['string'], -'OutOfRangeException::__clone' => ['void'], -'OutOfRangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?OutOfRangeException'], -'OutOfRangeException::__toString' => ['string'], -'OutOfRangeException::getCode' => ['int'], -'OutOfRangeException::getFile' => ['string'], -'OutOfRangeException::getLine' => ['int'], -'OutOfRangeException::getMessage' => ['string'], -'OutOfRangeException::getPrevious' => ['Throwable|OutOfRangeException|null'], -'OutOfRangeException::getTrace' => ['array'], -'OutOfRangeException::getTraceAsString' => ['string'], -'output_add_rewrite_var' => ['bool', 'name'=>'string', 'value'=>'string'], -'output_cache_disable' => ['void'], -'output_cache_disable_compression' => ['void'], -'output_cache_exists' => ['bool', 'key'=>'', 'lifetime'=>''], -'output_cache_fetch' => ['string', 'key'=>'', 'function'=>'', 'lifetime'=>''], -'output_cache_get' => ['mixed', 'key'=>'', 'lifetime'=>''], -'output_cache_output' => ['expression', 'key'=>'', 'function'=>'', 'lifetime'=>''], -'output_cache_put' => ['bool', 'key'=>'', 'data'=>''], -'output_cache_remove' => ['bool', 'filename'=>''], -'output_cache_remove_key' => ['bool', 'key'=>''], -'output_cache_remove_url' => ['bool', 'url'=>''], -'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' => ['array'], -'OverflowException::getTraceAsString' => ['string'], -'overload' => ['', 'class_name'=>'string'], -'override_function' => ['bool', 'function_name'=>'string', 'function_args'=>'string', 'function_code'=>'string'], -'OwsrequestObj::__construct' => ['void'], -'OwsrequestObj::addParameter' => ['int', 'name'=>'string', 'value'=>'string'], -'OwsrequestObj::getName' => ['string', 'index'=>'int'], -'OwsrequestObj::getValue' => ['string', 'index'=>'int'], -'OwsrequestObj::getValueByName' => ['string', 'name'=>'string'], -'OwsrequestObj::loadParams' => ['int'], -'OwsrequestObj::setParameter' => ['int', 'name'=>'string', 'value'=>'string'], -'pack' => ['string', 'format'=>'string', '...args='=>'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::run' => ['?parallel\Future', 'closure'=>'Closure', 'args='=>'array'], -'parallel\Runtime::kill' => ['void'], -'ParentIterator::__construct' => ['void', 'it'=>'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', 'encoded_string'=>'string', '&w_result='=>'array'], -'parse_url' => ['array{scheme?:string,host?:string,port?:int,user?:string,pass?:string,path?:string,query?:string,fragment?:string}|string|int|false|null', 'url'=>'string', 'url_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' => ['array'], -'ParseError::getTraceAsString' => ['string'], -'parsekit_compile_file' => ['array', 'filename'=>'string', 'errors='=>'array', 'options='=>'int'], -'parsekit_compile_string' => ['array', 'phpcode'=>'string', 'errors='=>'array', 'options='=>'int'], -'parsekit_func_arginfo' => ['array', 'function'=>'mixed'], -'passthru' => ['void', 'command'=>'string', '&w_return_value='=>'int'], -'password_get_info' => ['array', 'hash'=>'string'], -'password_hash' => ['string|false|null', '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', 'options='=>'int'], -'pclose' => ['int', 'fp'=>'resource'], -'pcnlt_sigwaitinfo' => ['int', 'set'=>'array', '&w_siginfo'=>'array'], -'pcntl_alarm' => ['int', 'seconds'=>'int'], -'pcntl_async_signals' => ['bool', 'on='=>'bool'], -'pcntl_errno' => ['int'], -'pcntl_exec' => ['bool', 'path'=>'string', 'args='=>'array', 'envs='=>'array'], -'pcntl_fork' => ['int'], -'pcntl_get_last_error' => ['int'], -'pcntl_getpriority' => ['int', 'pid='=>'int', 'process_identifier='=>'int'], -'pcntl_setpriority' => ['bool', 'priority'=>'int', 'pid='=>'int', 'process_identifier='=>'int'], -'pcntl_signal' => ['bool', 'signo'=>'int', 'handle'=>'callable():void|callable(int):void|callable(int,array):void|int', 'restart_syscalls='=>'bool'], -'pcntl_signal_dispatch' => ['bool'], -'pcntl_signal_get_handler' => ['int|string', 'signo'=>'int'], -'pcntl_sigprocmask' => ['bool', 'how'=>'int', 'set'=>'array', '&w_oldset='=>'array'], -'pcntl_sigtimedwait' => ['int', 'set'=>'array', '&w_siginfo='=>'array', 'seconds='=>'int', 'nanoseconds='=>'int'], -'pcntl_sigwaitinfo' => ['int', 'set'=>'array', '&w_siginfo='=>'array'], -'pcntl_strerror' => ['string', 'errno'=>'int'], -'pcntl_wait' => ['int', '&w_status'=>'int', 'options='=>'int', '&w_rusage='=>'array'], -'pcntl_waitpid' => ['int', 'pid'=>'int', '&w_status'=>'int', 'options='=>'int', '&w_rusage='=>'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', 'len'=>'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', 'len'=>'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' => ['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'], -'PDO::exec' => ['int', 'query'=>'string'], -'PDO::getAttribute' => ['', 'attribute'=>'int'], -'PDO::getAvailableDrivers' => ['array'], -'PDO::inTransaction' => ['bool'], -'PDO::lastInsertId' => ['string', 'seqname='=>'string'], -'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', 'result_type'=>'int', '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', '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' => ['string'], -'PDOException::getFile' => ['string'], -'PDOException::getLine' => ['int'], -'PDOException::getMessage' => ['string'], -'PDOException::getPrevious' => ['?Throwable'], -'PDOException::getTrace' => ['array<int,array<string,mixed>>'], -'PDOException::getTraceAsString' => ['string'], -'PDOStatement::__sleep' => ['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'], -'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|null|false', 'column_number='=>'int'], -'PDOStatement::fetchObject' => ['mixed', 'class_name='=>'string', 'ctor_args='=>'?array'], -'PDOStatement::getAttribute' => ['mixed', 'attribute'=>'int'], -'PDOStatement::getColumnMeta' => ['array', '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'], -'pfsockopen' => ['resource', 'hostname'=>'string', 'port='=>'int', '&w_errno='=>'int', '&w_errstr='=>'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', 'connect_type='=>'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', 'db'=>'resource', 'table'=>'string', 'values'=>'array', 'options='=>'int'], -'pg_copy_from' => ['bool', 'connection'=>'resource', 'table_name'=>'string', 'rows'=>'array', 'delimiter='=>'string', 'null_as='=>'string'], -'pg_copy_to' => ['array', 'connection'=>'resource', 'table_name'=>'string', 'delimiter='=>'string', 'null_as='=>'string'], -'pg_dbname' => ['string', 'connection='=>'resource'], -'pg_delete' => ['mixed', 'db'=>'resource', 'table'=>'string', 'ids'=>'array', 'options='=>'int'], -'pg_end_copy' => ['bool', 'connection='=>'resource'], -'pg_escape_bytea' => ['string', 'connection'=>'resource', 'data'=>'string'], -'pg_escape_bytea\'1' => ['string', 'data'=>'string'], -'pg_escape_identifier' => ['string', 'connection'=>'resource', 'data'=>'string'], -'pg_escape_identifier\'1' => ['string', 'data'=>'string'], -'pg_escape_literal' => ['string', 'connection'=>'resource', 'data'=>'string'], -'pg_escape_literal\'1' => ['string', 'data'=>'string'], -'pg_escape_string' => ['string', 'connection'=>'resource', 'data'=>'string'], -'pg_escape_string\'1' => ['string', 'data'=>'string'], -'pg_execute' => ['resource|false', 'connection'=>'resource', 'stmtname'=>'string', 'params'=>'array'], -'pg_execute\'1' => ['resource|false', 'stmtname'=>'string', 'params'=>'array'], -'pg_fetch_all' => ['array|false', 'result'=>'resource', 'result_type='=>'int'], -'pg_fetch_all_columns' => ['array|false', 'result'=>'resource', 'column_number='=>'int'], -'pg_fetch_array' => ['array|false', 'result'=>'resource', 'row='=>'?int', 'result_type='=>'int'], -'pg_fetch_assoc' => ['array|false', 'result'=>'resource', 'row='=>'?int'], -'pg_fetch_object' => ['object', 'result'=>'', 'row='=>'?int', 'result_type='=>'int'], -'pg_fetch_object\'1' => ['object', 'result'=>'', 'row='=>'?int', 'class_name='=>'string', 'ctor_params='=>'array'], -'pg_fetch_result' => ['', 'result'=>'', 'field_name'=>'string|int'], -'pg_fetch_result\'1' => ['', 'result'=>'', 'row'=>'?int', 'field_name'=>'string|int'], -'pg_fetch_row' => ['array', 'result'=>'resource', 'row='=>'?int', 'result_type='=>'int'], -'pg_field_is_null' => ['int', 'result'=>'', 'field_name_or_number'=>'string|int'], -'pg_field_is_null\'1' => ['int', 'result'=>'', 'row'=>'int', 'field_name_or_number'=>'string|int'], -'pg_field_name' => ['string', 'result'=>'resource', 'field_number'=>'int'], -'pg_field_num' => ['int', 'result'=>'resource', 'field_name'=>'string'], -'pg_field_prtlen' => ['int', 'result'=>'', 'field_name_or_number'=>''], -'pg_field_prtlen\'1' => ['int', 'result'=>'', 'row'=>'int', 'field_name_or_number'=>'string|int'], -'pg_field_size' => ['int', 'result'=>'resource', 'field_number'=>'int'], -'pg_field_table' => ['mixed', 'result'=>'resource', 'field_number'=>'int', 'oid_only='=>'bool'], -'pg_field_type' => ['string', 'result'=>'resource', 'field_number'=>'int'], -'pg_field_type_oid' => ['int|false', 'result'=>'resource', 'field_number'=>'int'], -'pg_flush' => ['mixed', 'connection'=>'resource'], -'pg_free_result' => ['bool', 'result'=>'resource'], -'pg_get_notify' => ['array', 'connection'=>'resource', 'result_type='=>'int'], -'pg_get_pid' => ['int|false', 'connection'=>'resource'], -'pg_get_result' => ['resource|false', 'connection='=>'resource'], -'pg_host' => ['string', 'connection='=>'resource'], -'pg_insert' => ['mixed', 'db'=>'resource', 'table'=>'string', 'values'=>'array', 'options='=>'int'], -'pg_last_error' => ['string', 'connection='=>'resource', 'operation='=>'int'], -'pg_last_notice' => ['string|array|bool', 'connection'=>'resource', 'option='=>'int'], -'pg_last_oid' => ['string', 'result'=>'resource'], -'pg_lo_close' => ['bool', 'large_object'=>'resource'], -'pg_lo_create' => ['int', 'connection='=>'resource', 'large_object_oid='=>''], -'pg_lo_export' => ['bool', 'connection'=>'resource', 'oid'=>'int', 'filename'=>'string'], -'pg_lo_export\'1' => ['bool', 'oid'=>'int', 'pathname'=>'string'], -'pg_lo_import' => ['int', 'connection'=>'resource', 'pathname'=>'string', 'oid'=>''], -'pg_lo_import\'1' => ['int', 'pathname'=>'string', 'oid'=>''], -'pg_lo_open' => ['resource|false', 'connection'=>'resource', 'oid'=>'int', 'mode'=>'string'], -'pg_lo_read' => ['string', 'large_object'=>'resource', 'len='=>'int'], -'pg_lo_read_all' => ['int', 'large_object'=>'resource'], -'pg_lo_seek' => ['bool', 'large_object'=>'resource', 'offset'=>'int', 'whence='=>'int'], -'pg_lo_tell' => ['int', 'large_object'=>'resource'], -'pg_lo_truncate' => ['bool', 'large_object'=>'resource', 'size'=>'int'], -'pg_lo_unlink' => ['bool', 'connection'=>'resource', 'oid'=>'int'], -'pg_lo_write' => ['int', 'large_object'=>'resource', 'data'=>'string', 'len='=>'int'], -'pg_meta_data' => ['array', 'db'=>'resource', 'table'=>'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', 'param_name'=>'string'], -'pg_parameter_status\'1' => ['string|false', 'param_name'=>'string'], -'pg_pconnect' => ['resource|false', 'connection_string'=>'string', 'host='=>'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', 'stmtname'=>'string', 'query'=>'string'], -'pg_prepare\'1' => ['resource|false', 'stmtname'=>'string', 'query'=>'string'], -'pg_put_line' => ['bool', 'connection'=>'resource', 'data'=>'string'], -'pg_put_line\'1' => ['bool', 'data'=>'string'], -'pg_query' => ['resource|false', 'connection'=>'resource', 'query'=>'string'], -'pg_query\'1' => ['resource|false', 'query'=>'string'], -'pg_query_params' => ['resource|false', 'connection'=>'resource', 'query'=>'string', 'params'=>'array'], -'pg_query_params\'1' => ['resource|false', 'query'=>'string', 'params'=>'array'], -'pg_result_error' => ['string|false', 'result'=>'resource'], -'pg_result_error_field' => ['string|?false', 'result'=>'resource', 'fieldcode'=>'int'], -'pg_result_seek' => ['bool', 'result'=>'resource', 'offset'=>'int'], -'pg_result_status' => ['mixed', 'result'=>'resource', 'result_type='=>'int'], -'pg_select' => ['mixed', 'db'=>'resource', 'table'=>'string', 'ids'=>'array', 'options='=>'int', 'result_type='=>'int'], -'pg_send_execute' => ['bool', 'connection'=>'resource', 'stmtname'=>'string', 'params'=>'array'], -'pg_send_prepare' => ['bool', 'connection'=>'resource', 'stmtname'=>'string', 'query'=>'string'], -'pg_send_query' => ['bool', 'connection'=>'resource', 'query'=>'string'], -'pg_send_query_params' => ['bool', 'connection'=>'resource', 'query'=>'string', 'params'=>'array'], -'pg_set_client_encoding' => ['int', 'connection'=>'resource', 'encoding'=>'string'], -'pg_set_client_encoding\'1' => ['int', 'encoding'=>'string'], -'pg_set_error_verbosity' => ['int', 'connection'=>'resource', 'verbosity'=>'int'], -'pg_set_error_verbosity\'1' => ['int', 'verbosity'=>'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_tty\'1' => ['string'], -'pg_unescape_bytea' => ['string', 'data'=>'string'], -'pg_untrace' => ['bool', 'connection='=>'resource'], -'pg_untrace\'1' => ['bool'], -'pg_update' => ['mixed', 'db'=>'resource', 'table'=>'string', 'fields'=>'array', 'ids'=>'array', 'options='=>'int'], -'pg_version' => ['array', 'connection='=>'resource'], -'Phar::__construct' => ['void', 'fname'=>'string', 'flags='=>'int', 'alias='=>'string'], -'Phar::addEmptyDir' => ['', 'dirname'=>'string'], -'Phar::addFile' => ['', 'file'=>'string', 'localname='=>'string'], -'Phar::addFromString' => ['', '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' => ['object', 'compression'=>'int', 'extension='=>'string'], -'Phar::compressAllFilesBZIP2' => ['bool'], -'Phar::compressAllFilesGZ' => ['bool'], -'Phar::compressFiles' => ['', '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' => ['object', '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'], -'Phar::getModified' => ['bool'], -'Phar::getPath' => ['string'], -'Phar::getSignature' => ['array'], -'Phar::getStub' => ['string'], -'Phar::getSupportedCompression' => ['array'], -'Phar::getSupportedSignatures' => ['array'], -'Phar::getVersion' => ['string'], -'Phar::hasMetadata' => ['bool'], -'Phar::interceptFileFuncs' => [''], -'Phar::isBuffering' => ['bool'], -'Phar::isCompressed' => [''], -'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' => ['int', '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' => ['', 'sigtype'=>'int', 'privatekey='=>'string'], -'Phar::setStub' => ['bool', 'stub'=>'string', 'len='=>'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|null', 'alias='=>'string|null', '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' => ['object', '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' => ['object', '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::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', 'len='=>'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'], -'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'], -'php_ini_scanned_files' => ['string'], -'php_logo_guid' => ['string'], -'php_sapi_name' => ['string'], -'php_strip_whitespace' => ['string', 'file_name'=>'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', 'flag='=>'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', 'prompt'=>'string'], -'phpdbg_start_oplog' => ['void'], -'phpinfo' => ['bool', 'what='=>'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\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'], -'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'], -'Pool::__construct' => ['void', 'size'=>'int', 'class'=>'string', 'ctor='=>'array'], -'Pool::collect' => ['void', '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_arg'=>'array'], -'posix_access' => ['bool', 'file'=>'string', 'mode='=>'int'], -'posix_ctermid' => ['string'], -'posix_errno' => ['int'], -'posix_get_last_error' => ['int'], -'posix_getcwd' => ['string'], -'posix_getegid' => ['int'], -'posix_geteuid' => ['int'], -'posix_getgid' => ['int'], -'posix_getgrgid' => ['array', 'gid'=>'int'], -'posix_getgrnam' => ['array|false', 'groupname'=>'string'], -'posix_getgroups' => ['array'], -'posix_getlogin' => ['string'], -'posix_getpgid' => ['int|false', 'pid'=>'int'], -'posix_getpgrp' => ['int'], -'posix_getpid' => ['int'], -'posix_getppid' => ['int'], -'posix_getpwnam' => ['array|false', 'groupname'=>'string'], -'posix_getpwuid' => ['array', 'uid'=>'int'], -'posix_getrlimit' => ['array'], -'posix_getsid' => ['int', 'pid'=>'int'], -'posix_getuid' => ['int'], -'posix_initgroups' => ['bool', 'name'=>'string', 'base_group_id'=>'int'], -'posix_isatty' => ['bool', 'fd'=>'resource|int'], -'posix_kill' => ['bool', 'pid'=>'int', 'sig'=>'int'], -'posix_mkfifo' => ['bool', 'pathname'=>'string', 'mode'=>'int'], -'posix_mknod' => ['bool', 'pathname'=>'string', 'mode'=>'int', 'major='=>'int', 'minor='=>'int'], -'posix_setegid' => ['bool', 'uid'=>'int'], -'posix_seteuid' => ['bool', 'uid'=>'int'], -'posix_setgid' => ['bool', 'uid'=>'int'], -'posix_setpgid' => ['bool', 'pid'=>'int', 'pgid'=>'int'], -'posix_setrlimit' => ['bool', 'resource'=>'int', 'softlimit'=>'int', 'hardlimit'=>'int'], -'posix_setsid' => ['int'], -'posix_setuid' => ['bool', 'uid'=>'int'], -'posix_strerror' => ['string', 'errno'=>'int'], -'posix_times' => ['array'], -'posix_ttyname' => ['string|false', 'fd'=>'resource|int'], -'posix_uname' => ['array'], -'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', 'base'=>'int|float', 'exponent'=>'int|float'], -'preg_filter' => ['mixed', 'regex'=>'mixed', 'replace'=>'mixed', 'subject'=>'mixed', 'limit='=>'int', '&w_count='=>'int'], -'preg_grep' => ['array', 'regex'=>'string', 'input'=>'array', 'flags='=>'int'], -'preg_last_error' => ['int'], -'preg_match' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_subpatterns='=>'string[]', 'flags='=>'int', 'offset='=>'int'], -'preg_match_all' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_subpatterns='=>'array', 'flags='=>'int', 'offset='=>'int'], -'preg_quote' => ['string', 'str'=>'string', 'delim_char='=>'string'], -'preg_replace' => ['string|array|null', 'regex'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], -'preg_replace_callback' => ['string|array', 'regex'=>'string|array', 'callback'=>'callable(array):string', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], -'preg_replace_callback_array' => ['string|array', 'pattern'=>'array<string,callable(array):string>', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], -'preg_split' => ['array<int, string>', 'pattern'=>'string', 'subject'=>'string', 'limit='=>'?int', 'flags='=>'int'], -'prev' => ['mixed', '&rw_array_arg'=>'array|object'], -'print' => ['int', 'arg'=>'string'], -'print_r' => ['string|true', 'var'=>'mixed', 'return='=>'bool'], -'printf' => ['int', 'format'=>'string', '...args='=>'string|int|float'], -'proc_close' => ['int', 'process'=>'resource'], -'proc_get_status' => ['array', 'process'=>'resource'], -'proc_nice' => ['bool', 'priority'=>'int'], -'proc_open' => ['resource|false', 'command'=>'string', 'descriptorspec'=>'array', '&w_pipes'=>'resource[]', 'cwd='=>'?string', 'env='=>'?array', 'other_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_name'=>'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', 'val'=>'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', 'len'=>'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', 'len'=>'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', 'pspell'=>'int', 'word'=>'string'], -'pspell_add_to_session' => ['bool', 'pspell'=>'int', 'word'=>'string'], -'pspell_check' => ['bool', 'pspell'=>'int', 'word'=>'string'], -'pspell_clear_session' => ['bool', 'pspell'=>'int'], -'pspell_config_create' => ['int|false', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string'], -'pspell_config_data_dir' => ['bool', 'conf'=>'int', 'directory'=>'string'], -'pspell_config_dict_dir' => ['bool', 'conf'=>'int', 'directory'=>'string'], -'pspell_config_ignore' => ['bool', 'conf'=>'int', 'ignore'=>'int'], -'pspell_config_mode' => ['bool', 'conf'=>'int', 'mode'=>'int'], -'pspell_config_personal' => ['bool', 'conf'=>'int', 'personal'=>'string'], -'pspell_config_repl' => ['bool', 'conf'=>'int', 'repl'=>'string'], -'pspell_config_runtogether' => ['bool', 'conf'=>'int', 'runtogether'=>'bool'], -'pspell_config_save_repl' => ['bool', 'conf'=>'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', 'personal'=>'string', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string', 'mode='=>'int'], -'pspell_save_wordlist' => ['bool', 'pspell'=>'int'], -'pspell_store_replacement' => ['bool', 'pspell'=>'int', 'misspell'=>'string', 'correct'=>'string'], -'pspell_suggest' => ['array', 'pspell'=>'int', 'word'=>'string'], -'putenv' => ['bool', 'setting'=>'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', 'str'=>'string'], -'quoted_printable_encode' => ['string', 'str'=>'string'], -'quotemeta' => ['string', 'str'=>'string'], -'rad2deg' => ['float', 'number'=>'float'], -'radius_acct_open' => ['resource'], -'radius_add_server' => ['bool', 'radius_handle'=>'resource', 'hostname'=>'string', 'port'=>'int', 'secret'=>'string', 'timeout'=>'int', 'max_tries'=>'int'], -'radius_auth_open' => ['resource'], -'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', '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' => ['string', 'length'=>'int'], -'random_int' => ['int', 'min'=>'int', 'max'=>'int'], -'range' => ['array', 'low'=>'mixed', 'high'=>'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' => ['array'], -'RangeException::getTraceAsString' => ['string'], -'rar_allow_broken_set' => ['bool', 'rarfile'=>'RarArchive', 'allow_broken'=>'bool'], -'rar_broken_is' => ['bool', 'rarfile'=>'rararchive'], -'rar_close' => ['bool', 'rarfile'=>'rararchive'], -'rar_comment_get' => ['string', 'rarfile'=>'rararchive'], -'rar_entry_get' => ['RarEntry', 'entryname'=>'string', 'rarfile'=>'rararchive'], -'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', 'rarfile'=>'rararchive'], -'RarArchive::getComment' => ['string', 'rarfile'=>'rararchive'], -'RarArchive::getEntries' => ['RarArchive', 'rarfile'=>'rararchive'], -'RarArchive::getEntry' => ['RarEntry', 'entryname'=>'string', 'rarfile'=>'rararchive'], -'RarArchive::isBroken' => ['bool', 'rarfile'=>'rararchive'], -'RarArchive::isSolid' => ['bool', 'rarfile'=>'rararchive'], -'RarArchive::open' => ['RarArchive', 'filename'=>'string', 'password='=>'string', 'volume_callback='=>'callable'], -'RarArchive::setAllowBroken' => ['bool', 'allow_broken'=>'bool', 'rarfile'=>'rararchive'], -'RarEntry::__toString' => ['string'], -'RarEntry::extract' => ['bool', 'dir'=>'string', 'filepath='=>'string', 'password='=>'string', 'extended_data='=>'bool'], -'RarEntry::getAttr' => ['int'], -'RarEntry::getCrc' => ['string'], -'RarEntry::getFileTime' => ['string'], -'RarEntry::getHostOs' => ['int'], -'RarEntry::getMethod' => ['int'], -'RarEntry::getName' => ['string'], -'RarEntry::getPackedSize' => ['int'], -'RarEntry::getStream' => ['resource', 'password='=>'string'], -'RarEntry::getUnpackedSize' => ['int'], -'RarEntry::getVersion' => ['int'], -'RarEntry::isDirectory' => ['bool'], -'RarEntry::isEncrypted' => ['bool'], -'RarException::getCode' => ['int'], -'RarException::getFile' => ['string'], -'RarException::getLine' => ['int'], -'RarException::getMessage' => ['string'], -'RarException::getPrevious' => ['Exception|Throwable'], -'RarException::getTrace' => ['array'], -'RarException::getTraceAsString' => ['string'], -'RarException::isUsingExceptions' => ['bool'], -'RarException::setUsingExceptions' => ['RarEntry', 'using_exceptions'=>'bool'], -'rawurldecode' => ['string', 'str'=>'string'], -'rawurlencode' => ['string', 'str'=>'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::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'RdKafka\Topic', 'timeout_ms'=>'int'], -'RdKafka::getOutQLen' => ['int'], -'RdKafka::newQueue' => ['RdKafka\Queue'], -'RdKafka::newTopic' => ['RdKafka\Topic', 'topic_name'=>'string', 'topic_conf='=>'?\RdKafka\TopicConf'], -'RdKafka::poll' => ['void', 'timeout_ms'=>'int'], -'RdKafka::setLogLevel' => ['void', 'level'=>'int'], -'RdKafka\Conf::dump' => ['array'], -'RdKafka\Conf::set' => ['void', 'name'=>'string', 'value'=>'string'], -'RdKafka\Conf::setDefaultTopicConf' => ['void', 'topic_conf'=>'RdKafka\TopicConf'], -'RdKafka\Conf::setDrMsgCb' => ['void', 'callback'=>'callable'], -'RdKafka\Conf::setErrorCb' => ['void', 'callback'=>'callable'], -'RdKafka\Conf::setRebalanceCb' => ['void', 'callback'=>'callable'], -'RdKafka\Conf::setStatsCb' => ['void', 'callback'=>'callable'], -'RdKafka\Consumer::__construct' => ['void', 'conf='=>'?\RdKafka\Conf'], -'RdKafka\Consumer::addBrokers' => ['int', 'broker_list'=>'string'], -'RdKafka\Consumer::getMetadata' => ['RdKafka\Metadata', 'all_topics'=>'bool', 'only_topic='=>'RdKafka\Topic', 'timeout_ms'=>'int'], -'RdKafka\Consumer::getOutQLen' => ['int'], -'RdKafka\Consumer::newQueue' => ['RdKafka\Queue'], -'RdKafka\Consumer::newTopic' => ['RdKafka\ConsumerTopic', 'topic_name'=>'string', 'topic_conf='=>'?\RdKafka\TopicConf'], -'RdKafka\Consumer::poll' => ['void', 'timeout_ms'=>'int'], -'RdKafka\Consumer::setLogLevel' => ['void', 'level'=>'int'], -'RdKafka\ConsumerTopic::__construct' => ['void'], -'RdKafka\ConsumerTopic::consume' => ['RdKafka\Message', 'partition'=>'int', 'timeout_ms'=>'int'], -'RdKafka\ConsumerTopic::consumeQueueStart' => ['void', 'partition'=>'int', 'offset'=>'int', 'queue'=>'RdKafka\Queue'], -'RdKafka\ConsumerTopic::consumeStart' => ['void', 'partition'=>'int', 'offset'=>'int'], -'RdKafka\ConsumerTopic::consumeStop' => ['void', 'partition'=>'int'], -'RdKafka\ConsumerTopic::getName' => ['string'], -'RdKafka\ConsumerTopic::offsetStore' => ['void', 'partition'=>'int', 'offset'=>'int'], -'RdKafka\KafkaConsumer::__construct' => ['void', 'conf'=>'RdKafka\Conf'], -'RdKafka\KafkaConsumer::assign' => ['void', 'topic_partitions='=>'RdKafka\TopicPartition[]'], -'RdKafka\KafkaConsumer::commit' => ['void', 'message_or_offsets='=>'RdKafka\Message|RdKafka\TopicPartition[]|null'], -'RdKafka\KafkaConsumer::commitAsync' => ['void', 'message_or_offsets='=>'string'], -'RdKafka\KafkaConsumer::consume' => ['RdKafka\Message', 'timeout_ms'=>'string'], -'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\Queue::__construct' => ['void'], -'RdKafka\Queue::consume' => ['RdKafka\Message|null', 'timeout_ms'=>'string'], -'RdKafka\Topic::getName' => ['string'], -'RdKafka\TopicConf::dump' => ['array'], -'RdKafka\TopicConf::set' => ['void', 'name'=>'string', 'value'=>'string'], -'RdKafka\TopicConf::setPartitioner' => ['void', 'partitioner'=>'int'], -'RdKafka\TopicPartition::__construct' => ['void', 'topic'=>'string', 'partition'=>'int', 'offset='=>'int'], -'RdKafka\TopicPartition::getOffset' => ['int'], -'RdKafka\TopicPartition::getPartition' => ['int'], -'RdKafka\TopicPartition::getTopic' => ['string'], -'RdKafka\TopicPartition::setOffset' => ['void', 'offset'=>'string'], -'RdKafka\TopicPartition::setPartition' => ['void', 'partition'=>'string'], -'RdKafka\TopicPartition::setTopic' => ['void', 'topic_name'=>'string'], -'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', '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', 'funcname'=>'callable'], -'readline_info' => ['mixed', 'varname='=>'string', 'newvalue='=>'string'], -'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', 'filename'=>'string'], -'realpath' => ['string|false', 'path'=>'string'], -'realpath_cache_get' => ['array'], -'realpath_cache_size' => ['int'], -'recode' => ['string', 'request'=>'string', 'str'=>'string'], -'recode_file' => ['bool', 'request'=>'string', 'input'=>'resource', 'output'=>'resource'], -'recode_string' => ['string', 'request'=>'string', 'str'=>'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', 'it'=>'recursiveiterator', 'func'=>'callable'], -'RecursiveCallbackFilterIterator::accept' => ['bool'], -'RecursiveCallbackFilterIterator::current' => ['mixed'], -'RecursiveCallbackFilterIterator::getChildren' => ['RecursiveCallbackFilterIterator'], -'RecursiveCallbackFilterIterator::getInnerIterator' => ['Iterator'], -'RecursiveCallbackFilterIterator::hasChildren' => ['void'], -'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', 'it'=>'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', 'it'=>'recursiveiterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], -'RecursiveRegexIterator::accept' => ['bool'], -'RecursiveRegexIterator::current' => [''], -'RecursiveRegexIterator::getChildren' => ['RecursiveRegexIterator'], -'RecursiveRegexIterator::getFlags' => ['int'], -'RecursiveRegexIterator::getInnerIterator' => [''], -'RecursiveRegexIterator::getMode' => ['int'], -'RecursiveRegexIterator::getPregFlags' => ['int'], -'RecursiveRegexIterator::getRegex' => ['string'], -'RecursiveRegexIterator::hasChildren' => ['bool'], -'RecursiveRegexIterator::key' => [''], -'RecursiveRegexIterator::next' => [''], -'RecursiveRegexIterator::rewind' => [''], -'RecursiveRegexIterator::setFlags' => ['bool', 'new_flags'=>'int'], -'RecursiveRegexIterator::setMode' => ['bool', 'new_mode'=>'int'], -'RecursiveRegexIterator::setPregFlags' => ['bool', 'new_flags'=>'int'], -'RecursiveRegexIterator::valid' => [''], -'RecursiveTreeIterator::__construct' => ['void', 'it'=>'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'=>'array', 'timeout'=>'int'], -'Redis::brPop' => ['array', 'keys'=>'array', 'timeout'=>'int'], -'Redis::brpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string', 'timeout'=>'int'], -'Redis::clearLastError' => ['bool'], -'Redis::client' => ['mixed', 'command'=>'string', 'arg='=>'string'], -'Redis::close' => ['void'], -'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', 'key'=>'string'], -'Redis::exists\'1' => ['int', 'key'=>'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'], -'Redis::getHost' => ['string'], -'Redis::getKeys' => ['array<int,string>', 'pattern'=>'string'], -'Redis::getLastError' => ['null|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', 'key'=>'string'], -'Redis::lPush' => ['bool|int', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], -'Redis::lPushx' => ['int', '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'], -'Redis::rPop' => ['string', 'key'=>'string'], -'Redis::rpoplpush' => ['string', 'srcKey'=>'string', 'dstKey'=>'string'], -'Redis::rPush' => ['bool|int', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], -'Redis::rPushx' => ['int', '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'=>'string', 'options='=>'array'], -'Redis::set\'1' => ['bool', 'key'=>'string', 'value'=>'string', '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'=>'int|string'], -'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' => ['', 'channels'=>'array', 'callback'=>'string'], -'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::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', 'end'=>'int', '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'=>'int', 'max'=>'int', 'offset='=>'int', 'limit='=>'int'], -'Redis::zRevRangeByScore' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int', 'options='=>'array'], -'Redis::zRevRank' => ['int', 'key'=>'string', 'member'=>'string'], -'Redis::zScan' => ['array|bool', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], -'Redis::zScore' => ['float', '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' => [''], -'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::unwatch' => [''], -'RedisCluster::__construct' => ['void', 'name'=>'string', 'seeds'=>'array', 'timeout='=>'float', 'readTimeout='=>'float', 'persistent='=>'bool|false'], -'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'], -'RedisCluster::bgsave' => ['bool', 'nodeParams'=>'string'], -'RedisCluster::bitCount' => ['int', 'key'=>'string'], -'RedisCluster::bitOp' => ['int', 'operation'=>'string', 'retKey'=>'string', 'key1'=>'string', 'key2'=>'string', 'key3='=>'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', 'srcKey'=>'string', 'dstKey'=>'string', 'timeout'=>'int'], -'RedisCluster::clearLastError' => ['bool'], -'RedisCluster::client' => ['', 'nodeParams'=>'string', 'subCmd'=>'', 'args'=>''], -'RedisCluster::close' => [''], -'RedisCluster::cluster' => ['mixed', 'nodeParams'=>'string', 'command'=>'string', 'arguments'=>'mixed'], -'RedisCluster::command' => ['mixed'], -'RedisCluster::config' => ['array', 'nodeParams'=>'string', 'operation'=>'string', 'key'=>'string', 'value'=>'string'], -'RedisCluster::dbSize' => ['int', 'nodeParams'=>'string'], -'RedisCluster::decr' => ['int', 'key'=>'string'], -'RedisCluster::decrBy' => ['int', 'key'=>'string', 'value'=>'int'], -'RedisCluster::del' => ['int', 'key1'=>'int', 'key2='=>'string', 'key3='=>'string'], -'RedisCluster::discard' => [''], -'RedisCluster::dump' => ['string', 'key'=>'string'], -'RedisCluster::echo' => ['mixed', 'nodeParams'=>'string', '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'], -'RedisCluster::flushDB' => ['bool', 'nodeParams'=>'string'], -'RedisCluster::geoAdd' => ['', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'member'=>'string'], -'RedisCluster::geoDist' => ['', 'key'=>'string', 'member1'=>'string', 'member2'=>'string', 'unit='=>'string'], -'RedisCluster::geohash' => ['', 'key'=>'', 'member1'=>'', 'member2='=>'mixed', 'memberN='=>'mixed'], -'RedisCluster::geopos' => ['', 'key'=>'', 'member1'=>'', 'member2='=>'mixed', 'memberN='=>'mixed'], -'RedisCluster::geoRadius' => ['', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'radius'=>'float', 'radiusUnit'=>'string', 'options'=>'array'], -'RedisCluster::geoRadiusByMember' => ['', 'key'=>'string', 'member'=>'string', 'radius'=>'float', 'radiusUnit'=>'string', 'options'=>'array'], -'RedisCluster::get' => ['bool|string', 'key'=>'string'], -'RedisCluster::getBit' => ['int', 'key'=>'string', 'offset'=>'int'], -'RedisCluster::getLastError' => ['string'], -'RedisCluster::getMode' => ['int'], -'RedisCluster::getOption' => ['int', 'name'=>'string'], -'RedisCluster::getRange' => ['string', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'RedisCluster::getSet' => ['string', 'key'=>'string', 'value'=>'string'], -'RedisCluster::hDel' => ['int', 'key'=>'string', 'hashKey1'=>'string', 'hashKey2='=>'string', 'hashKeyN='=>'string'], -'RedisCluster::hExists' => ['bool', 'key'=>'string', 'hashKey'=>'string'], -'RedisCluster::hGet' => ['string', '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', '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' => ['string', 'option='=>'string'], -'RedisCluster::keys' => ['array', 'pattern'=>'string'], -'RedisCluster::lastSave' => ['int', 'nodeParams'=>'string'], -'RedisCluster::lGet' => ['', 'key'=>'string', 'index'=>'int'], -'RedisCluster::lIndex' => ['string', 'key'=>'string', 'index'=>'int'], -'RedisCluster::lInsert' => ['int', 'key'=>'string', 'position'=>'int', 'pivot'=>'string', 'value'=>'string'], -'RedisCluster::lLen' => ['int', 'key'=>'string'], -'RedisCluster::lPop' => ['string', 'key'=>'string'], -'RedisCluster::lPush' => ['int', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], -'RedisCluster::lPushx' => ['int', 'key'=>'string', 'value'=>'string'], -'RedisCluster::lRange' => ['array', 'key'=>'string', 'start'=>'int', 'end'=>'int'], -'RedisCluster::lRem' => ['int', 'key'=>'string', 'value'=>'string', 'count'=>'int'], -'RedisCluster::lSet' => ['bool', 'key'=>'string', 'index'=>'int', 'value'=>'string'], -'RedisCluster::lTrim' => ['array', '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', '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'], -'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'], -'RedisCluster::rawCommand' => ['mixed', 'nodeParams'=>'string', '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', 'nodeParams'=>'string'], -'RedisCluster::rPop' => ['string', 'key'=>'string'], -'RedisCluster::rpoplpush' => ['string', 'srcKey'=>'string', 'dstKey'=>'string'], -'RedisCluster::rPush' => ['int', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], -'RedisCluster::rPushx' => ['int', 'key'=>'string', 'value'=>'string'], -'RedisCluster::sAdd' => ['int', 'key'=>'string', 'value1'=>'string', 'value2='=>'string', 'valueN='=>'string'], -'RedisCluster::sAddArray' => ['int', 'key'=>'string', 'valueArray'=>'array'], -'RedisCluster::save' => ['bool', 'nodeParams'=>'string'], -'RedisCluster::scan' => ['array', '&iterator'=>'int', 'pattern='=>'string', 'count='=>'int'], -'RedisCluster::sCard' => ['int', 'key'=>'string'], -'RedisCluster::script' => ['mixed', 'nodeParams'=>'string', 'command'=>'string', 'script'=>'string'], -'RedisCluster::sDiff' => ['array', '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', 'name'=>'string', 'value'=>'string'], -'RedisCluster::setRange' => ['string', 'key'=>'string', 'offset'=>'int', 'value'=>'string'], -'RedisCluster::sInter' => ['array', 'key'=>'string', '...other_keys='=>'string'], -'RedisCluster::sInterStore' => ['int', 'dstKey'=>'string', 'key'=>'string', '...other_keys='=>'string'], -'RedisCluster::sIsMember' => ['bool', 'key'=>'string', 'value'=>'string'], -'RedisCluster::slowLog' => ['', 'nodeParams'=>'string', 'command'=>'string', 'argument'=>'mixed', '...other_arguments='=>'mixed'], -'RedisCluster::sMembers' => ['array', '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', 'key'=>'string', '&iterator'=>'int', 'pattern='=>'null', 'count='=>'int'], -'RedisCluster::strlen' => ['int', 'key'=>'string'], -'RedisCluster::subscribe' => ['mixed', 'channels'=>'array', 'callback'=>'string'], -'RedisCluster::sUnion' => ['array', 'key1'=>'string', '...other_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', '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|null', '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|null', 'argument'=>'string|object', 'return='=>'bool'], -'ReflectionClass::getConstant' => ['mixed', 'name'=>'string'], -'ReflectionClass::getConstants' => ['array<string,mixed>'], -'ReflectionClass::getConstructor' => ['ReflectionMethod|null'], -'ReflectionClass::getDefaultProperties' => ['array'], -'ReflectionClass::getDocComment' => ['string|false'], -'ReflectionClass::getEndLine' => ['int|false'], -'ReflectionClass::getExtension' => ['ReflectionExtension|null'], -'ReflectionClass::getExtensionName' => ['string|false'], -'ReflectionClass::getFileName' => ['string|false'], -'ReflectionClass::getInterfaceNames' => ['string[]'], -'ReflectionClass::getInterfaces' => ['array<string, ReflectionClass>'], -'ReflectionClass::getMethod' => ['ReflectionMethod', 'name'=>'string'], -'ReflectionClass::getMethods' => ['ReflectionMethod[]', 'filter='=>'int'], -'ReflectionClass::getModifiers' => ['int'], -'ReflectionClass::getName' => ['class-string'], -'ReflectionClass::getNamespaceName' => ['string'], -'ReflectionClass::getParentClass' => ['ReflectionClass|false'], -'ReflectionClass::getProperties' => ['ReflectionProperty[]', 'filter='=>'int'], -'ReflectionClass::getProperty' => ['ReflectionProperty', 'name'=>'string'], -'ReflectionClass::getReflectionConstant' => ['ReflectionClassConstant|false', 'name'=>'string'], -'ReflectionClass::getReflectionConstants' => ['array<int,ReflectionClassConstant>'], -'ReflectionClass::getShortName' => ['string'], -'ReflectionClass::getStartLine' => ['int|false'], -'ReflectionClass::getStaticProperties' => ['ReflectionProperty[]'], -'ReflectionClass::getStaticPropertyValue' => ['mixed', 'name'=>'string', 'default='=>'mixed'], -'ReflectionClass::getTraitAliases' => ['array<string,string>'], -'ReflectionClass::getTraitNames' => ['array<int,string>'], -'ReflectionClass::getTraits' => ['array<string,ReflectionClass>'], -'ReflectionClass::hasConstant' => ['bool', 'name'=>'string'], -'ReflectionClass::hasMethod' => ['bool', 'name'=>'string'], -'ReflectionClass::hasProperty' => ['bool', 'name'=>'string'], -'ReflectionClass::implementsInterface' => ['bool', 'interface_name'=>'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::isIterable' => ['bool'], -'ReflectionClass::isIterateable' => ['bool'], -'ReflectionClass::isSubclassOf' => ['bool', 'class'=>'string|ReflectionClass'], -'ReflectionClass::isTrait' => ['bool'], -'ReflectionClass::isUserDefined' => ['bool'], -'ReflectionClass::newInstance' => ['object', '...args='=>'mixed'], -'ReflectionClass::newInstanceArgs' => ['object', 'args='=>'array<int,mixed>'], -'ReflectionClass::newInstanceWithoutConstructor' => ['object'], -'ReflectionClass::setStaticPropertyValue' => ['void', 'name'=>'string', 'value'=>'string'], -'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' => ['mixed'], -'ReflectionClassConstant::isPrivate' => ['bool'], -'ReflectionClassConstant::isProtected' => ['bool'], -'ReflectionClassConstant::isPublic' => ['bool'], -'ReflectionExtension::__clone' => ['void'], -'ReflectionExtension::__construct' => ['void', 'name'=>'string'], -'ReflectionExtension::__toString' => ['string'], -'ReflectionExtension::export' => ['string|null', 'name'=>'string', 'return='=>'bool'], -'ReflectionExtension::getClasses' => ['array<string,ReflectionClass>'], -'ReflectionExtension::getClassNames' => ['array<int,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' => ['void'], -'ReflectionExtension::isTemporary' => ['bool'], -'ReflectionFunction::__construct' => ['void', 'name'=>'callable-string|Closure'], -'ReflectionFunction::__toString' => ['string'], -'ReflectionFunction::export' => ['string|null', 'name'=>'string', 'return='=>'bool'], -'ReflectionFunction::getClosure' => ['?Closure'], -'ReflectionFunction::getClosureScopeClass' => ['ReflectionClass'], -'ReflectionFunction::getClosureThis' => ['bool'], -'ReflectionFunction::getDocComment' => ['string|false'], -'ReflectionFunction::getEndLine' => ['int|false'], -'ReflectionFunction::getExtension' => ['ReflectionExtension|null'], -'ReflectionFunction::getExtensionName' => ['string|false'], -'ReflectionFunction::getFileName' => ['string|false'], -'ReflectionFunction::getName' => ['callable-string'], -'ReflectionFunction::getNamespaceName' => ['string'], -'ReflectionFunction::getNumberOfParameters' => ['int'], -'ReflectionFunction::getNumberOfRequiredParameters' => ['int'], -'ReflectionFunction::getParameters' => ['array<int,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'], -'ReflectionFunctionAbstract::getClosureThis' => ['object'], -'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' => ['array<int,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'=>'string|object', 'name'=>'string'], -'ReflectionMethod::__construct\'1' => ['void', 'class_method'=>'string'], -'ReflectionMethod::__toString' => ['string'], -'ReflectionMethod::export' => ['string|null', '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' => ['array<int,\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' => [''], -'ReflectionNamedType::getName' => ['string'], -'ReflectionNamedType::isBuiltin' => [''], -'ReflectionObject::__clone' => ['void'], -'ReflectionObject::__construct' => ['void', 'argument'=>'object'], -'ReflectionObject::__toString' => ['string'], -'ReflectionObject::export' => ['string|null', 'argument'=>'object', 'return='=>'bool'], -'ReflectionObject::getConstant' => ['mixed', 'name'=>'string'], -'ReflectionObject::getConstants' => ['array<string,mixed>'], -'ReflectionObject::getConstructor' => ['ReflectionMethod|null'], -'ReflectionObject::getDefaultProperties' => ['array'], -'ReflectionObject::getDocComment' => ['false|string'], -'ReflectionObject::getEndLine' => ['false|int'], -'ReflectionObject::getExtension' => ['ReflectionExtension|null'], -'ReflectionObject::getExtensionName' => ['false|string'], -'ReflectionObject::getFileName' => ['false|string'], -'ReflectionObject::getInterfaceNames' => ['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' => ['array<int,\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' => ['array<int,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|null', 'function'=>'string', 'parameter'=>'string', 'return='=>'bool'], -'ReflectionParameter::getClass' => ['ReflectionClass|null'], -'ReflectionParameter::getDeclaringClass' => ['ReflectionClass|null'], -'ReflectionParameter::getDeclaringFunction' => ['ReflectionFunctionAbstract'], -'ReflectionParameter::getDefaultValue' => ['mixed'], -'ReflectionParameter::getDefaultValueConstantName' => ['string'], -'ReflectionParameter::getName' => ['string'], -'ReflectionParameter::getPosition' => ['int'], -'ReflectionParameter::getType' => ['ReflectionType|null'], -'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|null', '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::isDefault' => ['bool'], -'ReflectionProperty::isPrivate' => ['bool'], -'ReflectionProperty::isProtected' => ['bool'], -'ReflectionProperty::isPublic' => ['bool'], -'ReflectionProperty::isStatic' => ['bool'], -'ReflectionProperty::setAccessible' => ['void', 'visible'=>'bool'], -'ReflectionProperty::setValue' => ['void', 'object'=>'object', 'value'=>''], -'ReflectionProperty::setValue\'1' => ['void', 'value'=>''], -'ReflectionType::__clone' => ['void'], -'ReflectionType::__toString' => ['string'], -'ReflectionType::allowsNull' => ['bool'], -'ReflectionType::getName' => ['string'], -'ReflectionType::isBuiltin' => ['bool'], -'ReflectionZendExtension::__clone' => ['void'], -'ReflectionZendExtension::__construct' => ['void', 'name'=>'string'], -'ReflectionZendExtension::__toString' => ['string'], -'ReflectionZendExtension::export' => ['string|null', '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', 'it'=>'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' => ['bool', 'new_flags'=>'int'], -'RegexIterator::setMode' => ['bool', 'new_mode'=>'int'], -'RegexIterator::setPregFlags' => ['bool', 'new_flags'=>'int'], -'RegexIterator::valid' => ['bool'], -'register_event_handler' => ['bool', 'event_handler_func'=>'event_handler_func', 'handler_register_name'=>'handler_register_name', 'event_type_mask'=>'event_type_mask'], -'register_shutdown_function' => ['void', 'function'=>'callable():void', '...parameter='=>'mixed'], -'register_tick_function' => ['bool', 'function'=>'callable():void', '...args='=>'mixed'], -'rename' => ['bool', 'old_name'=>'string', 'new_name'=>'string', 'context='=>'resource'], -'rename_function' => ['bool', 'original_name'=>'string', 'new_name'=>'string'], -'reset' => ['mixed', '&rw_array_arg'=>'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', 'r'=>'resourcebundle'], -'resourcebundle_create' => ['?ResourceBundle', 'locale'=>'string', 'bundlename'=>'string', 'fallback='=>'bool'], -'resourcebundle_get' => ['', 'r'=>'resourcebundle', 'index'=>'string|int', 'fallback='=>'bool'], -'resourcebundle_get_error_code' => ['int', 'r'=>'resourcebundle'], -'resourcebundle_get_error_message' => ['string', 'r'=>'resourcebundle'], -'resourcebundle_locales' => ['array', 'bundlename'=>'string'], -'restore_error_handler' => ['bool'], -'restore_exception_handler' => ['bool'], -'restore_include_path' => ['void'], -'rewind' => ['bool', 'fp'=>'resource'], -'rewinddir' => ['void', 'dir_handle='=>'resource'], -'rmdir' => ['bool', 'dirname'=>'string', 'context='=>'resource'], -'round' => ['float', 'number'=>'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', 'filename'=>'string'], -'rpm_version' => ['string'], -'rrd_create' => ['bool', 'filename'=>'string', 'options'=>'array'], -'rrd_disconnect' => ['void'], -'rrd_error' => ['string'], -'rrd_fetch' => ['array', 'filename'=>'string', 'options'=>'array'], -'rrd_first' => ['int', 'file'=>'string', 'raaindex='=>'int'], -'rrd_graph' => ['array', 'filename'=>'string', 'options'=>'array'], -'rrd_info' => ['array', 'filename'=>'string'], -'rrd_last' => ['int', 'filename'=>'string'], -'rrd_lastupdate' => ['array', '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', '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'], -'RRDGraph::saveVerbose' => ['array'], -'RRDGraph::setOptions' => ['void', 'options'=>'array'], -'RRDUpdater::__construct' => ['void', 'path'=>'string'], -'RRDUpdater::update' => ['bool', 'values'=>'array', 'time='=>'string'], -'rsort' => ['bool', '&rw_array_arg'=>'array', 'sort_flags='=>'int'], -'rtrim' => ['string', 'str'=>'string', 'character_mask='=>'string'], -'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'], -'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' => ['array'], -'RuntimeException::getTraceAsString' => ['string'], -'SAMConnection::commit' => ['bool'], -'SAMConnection::connect' => ['bool', 'protocol'=>'string', 'properties='=>'array'], -'SAMConnection::disconnect' => ['bool'], -'SAMConnection::errno' => ['int'], -'SAMConnection::error' => ['string'], -'SAMConnection::isConnected' => ['bool'], -'SAMConnection::peek' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], -'SAMConnection::peekAll' => ['array', 'target'=>'string', 'properties='=>'array'], -'SAMConnection::receive' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], -'SAMConnection::remove' => ['SAMMessage', 'target'=>'string', 'properties='=>'array'], -'SAMConnection::rollback' => ['bool'], -'SAMConnection::send' => ['string', 'target'=>'string', 'msg'=>'sammessage', 'properties='=>'array'], -'SAMConnection::setDebug' => ['', 'switch'=>'bool'], -'SAMConnection::subscribe' => ['string', 'targettopic'=>'string'], -'SAMConnection::unsubscribe' => ['bool', 'subscriptionid'=>'string', 'targettopic='=>'string'], -'SAMMessage::body' => ['string'], -'SAMMessage::header' => ['object'], -'sapi_windows_cp_conv' => ['string', 'in_codepage'=>'int|string', 'out_codepage'=>'int|string', 'subject'=>'string'], -'sapi_windows_cp_get' => ['int'], -'sapi_windows_cp_is_utf8' => ['bool'], -'sapi_windows_cp_set' => ['bool', 'code_page'=>'int'], -'sapi_windows_vt100_support' => ['bool', 'stream'=>'resource', 'enable='=>'bool'], -'Saxon\SaxonProcessor::__construct' => ['void', 'license='=>'bool|false', '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', 'obj'=>'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', 'str'=>'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', 'str'=>'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' => ['array<int,string>|false', 'dir'=>'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', 'sem_identifier'=>'resource', 'nowait='=>'bool'], -'sem_get' => ['resource', 'key'=>'int', 'max_acquire='=>'int', 'perm='=>'int', 'auto_release='=>'int'], -'sem_release' => ['bool', 'sem_identifier'=>'resource'], -'sem_remove' => ['bool', 'sem_identifier'=>'resource'], -'Serializable::__construct' => ['void'], -'Serializable::serialize' => ['string'], -'Serializable::unserialize' => ['void', 'serialized'=>'string'], -'serialize' => ['string', 'variable'=>'mixed'], -'ServerRequest::withInput' => ['ServerRequest', 'input'=>'mixed'], -'ServerRequest::withoutParams' => ['ServerRequest', 'params'=>'int|string'], -'ServerRequest::withParam' => ['ServerRequest', 'key'=>'int|string', 'val'=>'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', 'new_cache_expire='=>'int'], -'session_cache_limiter' => ['string', 'new_cache_limiter='=>'string'], -'session_commit' => ['bool'], -'session_create_id' => ['string', 'prefix='=>'string'], -'session_decode' => ['bool', 'data'=>'string'], -'session_destroy' => ['bool'], -'session_encode' => ['string'], -'session_gc' => ['int'], -'session_get_cookie_params' => ['array'], -'session_id' => ['string', 'newid='=>'string'], -'session_is_registered' => ['bool', 'name'=>'string'], -'session_module_name' => ['string', 'newname='=>'string'], -'session_name' => ['string', 'newname='=>'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', 'newname='=>'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}'], -'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', 'sessionhandler'=>'SessionHandlerInterface', 'register_shutdown='=>'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', 'session_id'=>'string'], -'SessionHandlerInterface::gc' => ['bool', 'maxlifetime'=>'int'], -'SessionHandlerInterface::open' => ['bool', 'save_path'=>'string', 'name'=>'string'], -'SessionHandlerInterface::read' => ['string', 'session_id'=>'string'], -'SessionHandlerInterface::write' => ['bool', 'session_id'=>'string', 'session_data'=>'string'], -'SessionIdInterface::create_sid' => ['string'], -'SessionUpdateTimestampHandler::updateTimestamp' => ['bool', 'id'=>'string', 'data'=>'string'], -'SessionUpdateTimestampHandler::validateId' => ['char', 'id'=>'string'], -'SessionUpdateTimestampHandlerInterface::updateTimestamp' => ['bool', 'key'=>'string', 'val'=>'string'], -'SessionUpdateTimestampHandlerInterface::validateId' => ['bool', 'key'=>'string'], -'set_error_handler' => ['?callable', 'error_handler'=>'null|callable(int,string,string,int,array):bool|callable(int,string,string,int):bool|callable(int,string,string):bool|callable(int,string):bool', 'error_types='=>'int'], -'set_exception_handler' => ['null|callable(Throwable):void', 'exception_handler'=>'null|callable(Throwable):void'], -'set_file_buffer' => ['int', 'fp'=>'resource', 'buffer'=>'int'], -'set_include_path' => ['string', 'new_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'], -'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', 'locale'=>'string', '...args='=>'string'], -'setlocale\'1' => ['string|false', 'category'=>'int', 'locale'=>'?array'], -'setproctitle' => ['void', 'title'=>'string'], -'setrawcookie' => ['bool', 'name'=>'string', 'value='=>'string', 'expires='=>'int', 'path='=>'string', 'domain='=>'string', 'secure='=>'bool', 'httponly='=>'bool'], -'setRightFill' => ['void', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'a='=>'int'], -'setthreadtitle' => ['bool', 'title'=>'string'], -'settype' => ['bool', '&rw_var'=>'mixed', 'type'=>'string'], -'sha1' => ['string', 'str'=>'string', 'raw_output='=>'bool'], -'sha1_file' => ['string|false', 'filename'=>'string', 'raw_output='=>'bool'], -'sha256' => ['string', 'str'=>'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', 'tolerance'=>'float'], -'shapeObj::symdifference' => ['shapeObj', 'shape'=>'shapeObj'], -'shapeObj::topologyPreservingSimplify' => ['shapeObj', 'tolerance'=>'float'], -'shapeObj::touches' => ['int', 'shape'=>'shapeObj'], -'shapeObj::toWkt' => ['string'], -'shapeObj::union' => ['shapeObj', 'shape'=>'shapeObj'], -'shapeObj::within' => ['int', 'shape2'=>'shapeObj'], -'shell_exec' => ['?string', 'cmd'=>'string'], -'shm_attach' => ['resource', 'key'=>'int', 'memsize='=>'int', 'perm='=>'int'], -'shm_detach' => ['bool', 'shm_identifier'=>'resource'], -'shm_get_var' => ['mixed', 'id'=>'resource', 'variable_key'=>'int'], -'shm_has_var' => ['bool', 'shm_identifier'=>'resource', 'variable_key'=>'int'], -'shm_put_var' => ['bool', 'shm_identifier'=>'resource', 'variable_key'=>'int', 'variable'=>'mixed'], -'shm_remove' => ['bool', 'shm_identifier'=>'resource'], -'shm_remove_var' => ['bool', 'shm_identifier'=>'resource', 'variable_key'=>'int'], -'shmop_close' => ['void', 'shmid'=>'resource'], -'shmop_delete' => ['bool', 'shmid'=>'resource'], -'shmop_open' => ['resource|false', 'key'=>'int', 'flags'=>'string', 'mode'=>'int', 'size'=>'int'], -'shmop_read' => ['string', 'shmid'=>'resource', 'start'=>'int', 'count'=>'int'], -'shmop_size' => ['int', 'shmid'=>'resource'], -'shmop_write' => ['int', 'shmid'=>'resource', 'data'=>'string', 'offset'=>'int'], -'show_source' => ['string|bool', 'file_name'=>'string', 'return='=>'bool'], -'shuffle' => ['bool', '&rw_array_arg'=>'array'], -'signeurlpaiement' => ['string', 'clent'=>'string', 'data'=>'string'], -'similar_text' => ['int', 'str1'=>'string', 'str2'=>'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', 'ns='=>'string', 'is_prefix='=>'bool'], -'simplexml_load_string' => ['SimpleXMLElement|false', 'data'=>'string', 'class_name='=>'string', 'options='=>'int', 'ns='=>'string', 'is_prefix='=>'bool'], -'SimpleXMLElement::__construct' => ['void', 'data'=>'string', 'options='=>'int', 'data_is_url='=>'bool', 'ns='=>'string', 'is_prefix='=>'bool'], -'SimpleXMLElement::__toString' => ['string'], -'SimpleXMLElement::addAttribute' => ['void', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], -'SimpleXMLElement::addChild' => ['SimpleXMLElement', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], -'SimpleXMLElement::asXML' => ['string|bool', 'filename='=>'string'], -'SimpleXMLElement::attributes' => ['SimpleXMLElement|null', '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::__construct' => ['void', 'data'=>'string', 'options='=>'int', 'data_is_url='=>'bool', 'ns='=>'string', 'is_prefix='=>'bool'], -'SimpleXMLIterator::__toString' => ['string'], -'SimpleXMLIterator::addAttribute' => ['void', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], -'SimpleXMLIterator::addChild' => ['SimpleXMLElement', 'name'=>'string', 'value='=>'string', 'ns='=>'string'], -'SimpleXMLIterator::asXML' => ['bool|string', 'filename='=>'string'], -'SimpleXMLIterator::attributes' => ['SimpleXMLElement|null', 'ns='=>'string', 'is_prefix='=>'bool'], -'SimpleXMLIterator::children' => ['SimpleXMLElement', 'ns='=>'string', 'is_prefix='=>'bool'], -'SimpleXMLIterator::count' => ['int'], -'SimpleXMLIterator::current' => ['SimpleXMLIterator|null'], -'SimpleXMLIterator::getChildren' => ['SimpleXMLIterator'], -'SimpleXMLIterator::getDocNamespaces' => ['string[]', 'recursive='=>'bool', 'from_root='=>'bool'], -'SimpleXMLIterator::getName' => ['string'], -'SimpleXMLIterator::getNamespaces' => ['string[]', 'recursive='=>'bool'], -'SimpleXMLIterator::hasChildren' => ['bool'], -'SimpleXMLIterator::key' => ['string|false'], -'SimpleXMLIterator::next' => ['void'], -'SimpleXMLIterator::registerXPathNamespace' => ['bool', 'prefix'=>'string', 'ns'=>'string'], -'SimpleXMLIterator::rewind' => ['void'], -'SimpleXMLIterator::saveXML' => ['mixed', 'filename='=>'string'], -'SimpleXMLIterator::valid' => ['bool'], -'SimpleXMLIterator::xpath' => ['SimpleXMLElement[]|false', 'path'=>'string'], -'sin' => ['float', 'number'=>'float'], -'sinh' => ['float', 'number'=>'float'], -'sizeof' => ['int', 'var'=>'Countable|array', 'mode='=>'int'], -'sleep' => ['int|false', 'seconds'=>'int'], -'snmp2_get' => ['string|false', 'host'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp2_getnext' => ['string|false', 'host'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp2_real_walk' => ['array|false', 'host'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp2_set' => ['bool', 'host'=>'string', 'community'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp2_walk' => ['array|false', 'host'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp3_get' => ['string|false', 'host'=>'string', 'sec_name'=>'string', 'sec_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'priv_protocol'=>'string', 'priv_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp3_getnext' => ['string|false', 'host'=>'string', 'sec_name'=>'string', 'sec_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'priv_protocol'=>'string', 'priv_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp3_real_walk' => ['array|false', 'host'=>'string', 'sec_name'=>'string', 'sec_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'priv_protocol'=>'string', 'priv_passphrase'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp3_set' => ['bool', 'host'=>'string', 'sec_name'=>'string', 'sec_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'priv_protocol'=>'string', 'priv_passphrase'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmp3_walk' => ['array|false', 'host'=>'string', 'sec_name'=>'string', 'sec_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'priv_protocol'=>'string', 'priv_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' => ['mixed', 'object_id'=>'mixed', 'preserve_keys'=>'bool'], -'SNMP::getErrno' => ['int'], -'SNMP::getError' => ['int'], -'SNMP::getnext' => ['mixed', 'object_id'=>'mixed'], -'SNMP::set' => ['bool', 'object_id'=>'mixed', 'type'=>'mixed', 'value'=>'mixed'], -'SNMP::setSecurity' => ['bool', 'sec_level'=>'string', 'auth_protocol'=>'string', 'auth_passphrase'=>'string', 'priv_protocol'=>'string', 'priv_passphrase'=>'string', 'contextname'=>'string', 'contextengineid'=>'string'], -'SNMP::walk' => ['array', 'object_id'=>'string', 'suffix_as_key'=>'bool', 'max_repetitions'=>'int', 'non_repeaters'=>'int'], -'snmp_get_quick_print' => ['bool'], -'snmp_get_valueretrieval' => ['int'], -'snmp_read_mib' => ['bool', 'filename'=>'string'], -'snmp_set_enum_print' => ['bool', 'enum_print'=>'int'], -'snmp_set_oid_numeric_print' => ['void', 'oid_format'=>'int'], -'snmp_set_oid_output_format' => ['bool', 'oid_format'=>'int'], -'snmp_set_quick_print' => ['bool', 'quick_print'=>'int'], -'snmp_set_valueretrieval' => ['bool', 'method'=>'int'], -'snmpget' => ['string|false', 'host'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmpgetnext' => ['string|false', 'host'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmprealwalk' => ['array|false', 'host'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], -'snmpset' => ['bool', 'host'=>'string', 'community'=>'string', 'object_id'=>'string', 'type'=>'string', 'value'=>'mixed', 'timeout='=>'int', 'retries='=>'int'], -'snmpwalk' => ['array|false', 'host'=>'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'], -'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='=>'', '&w_output_headers='=>'array'], -'SoapClient::SoapClient' => ['object', 'wsdl'=>'mixed', 'options='=>'array'], -'SoapFault::__clone' => ['void'], -'SoapFault::__construct' => ['void', 'faultcode'=>'string', 'faultstring'=>'string', 'faultactor='=>'string', 'detail='=>'string', 'faultname='=>'string', 'headerfault='=>'string'], -'SoapFault::__toString' => ['string'], -'SoapFault::__wakeup' => ['void'], -'SoapFault::getCode' => ['int'], -'SoapFault::getFile' => ['string'], -'SoapFault::getLine' => ['int'], -'SoapFault::getMessage' => ['string'], -'SoapFault::getPrevious' => ['?\Exception|?\Throwable'], -'SoapFault::getTrace' => ['array'], -'SoapFault::getTraceAsString' => ['string'], -'SoapFault::SoapFault' => ['object', 'faultcode'=>'string', 'faultstring'=>'string', 'faultactor='=>'string', 'detail='=>'string', 'faultname='=>'string', 'headerfault='=>'string'], -'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', 'obj'=>'object'], -'SoapServer::setPersistence' => ['void', 'mode'=>'int'], -'SoapServer::SoapServer' => ['object', 'wsdl'=>'?string', 'options='=>'array'], -'SoapVar::__construct' => ['void', 'data'=>'mixed', 'encoding'=>'int', 'type_name='=>'string', 'type_namespace='=>'string', 'node_name='=>'string', 'node_namespace='=>'string'], -'SoapVar::SoapVar' => ['object', 'data'=>'mixed', 'encoding'=>'int', 'type_name='=>'string', 'type_namespace='=>'string', 'node_name='=>'string', 'node_namespace='=>'string'], -'socket_accept' => ['resource|false', 'socket'=>'resource'], -'socket_addrinfo_bind' => ['resource|null', 'addrinfo'=>'resource'], -'socket_addrinfo_connect' => ['resource|null', 'addrinfo'=>'resource'], -'socket_addrinfo_explain' => ['array', 'addrinfo'=>'resource'], -'socket_addrinfo_lookup' => ['resource[]', 'node'=>'string', 'service='=>'mixed', 'hints='=>'array'], -'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', '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', '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', 'len'=>'int', 'flags'=>'int'], -'socket_recvfrom' => ['int|false', 'socket'=>'resource', '&w_buf'=>'string', 'len'=>'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', 'tv_usec='=>'int'], -'socket_send' => ['int|false', 'socket'=>'resource', 'buf'=>'string', 'len'=>'int', 'flags'=>'int'], -'socket_sendmsg' => ['int|false', 'socket'=>'resource', 'message'=>'array', 'flags'=>'int'], -'socket_sendto' => ['int|false', 'socket'=>'resource', 'buf'=>'string', 'len'=>'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'=>'', 'level'=>'', 'optname'=>'', 'optval'=>''], -'socket_shutdown' => ['bool', 'socket'=>'resource', 'how='=>'int'], -'socket_strerror' => ['string', 'errno'=>'int'], -'socket_write' => ['int|false', 'socket'=>'resource', 'buf'=>'string', 'length='=>'int'], -'socket_wsaprotocol_info_export' => ['string|false', 'sock='=>'resource', 'pid'=>'int'], -'socket_wsaprotocol_info_import' => ['resource|false', 'id'=>'string'], -'socket_wsaprotocol_info_release' => ['bool', 'id'=>'string'], -'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'], -'sodium_add' => ['string', 'string_1'=>'string', 'string_2'=>'string'], -'sodium_base642bin' => ['string', 'base64'=>'string', 'variant'=>'int', 'ignore'=>'string'], -'sodium_bin2base64' => ['string', 'binary'=>'string', 'variant'=>'int'], -'sodium_bin2hex' => ['string', 'binary'=>'string'], -'sodium_compare' => ['int', 'string_1'=>'string', 'string_2'=>'string'], -'sodium_crypto_aead_aes256gcm_decrypt' => ['string|false', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_aes256gcm_encrypt' => ['string', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_aes256gcm_is_available' => ['bool'], -'sodium_crypto_aead_aes256gcm_keygen' => ['string'], -'sodium_crypto_aead_chacha20poly1305_decrypt' => ['string', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_chacha20poly1305_encrypt' => ['string', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => ['string|false', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => ['string', 'confidential_message'=>'string', 'public_message'=>'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', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], -'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => ['string', 'confidential_message'=>'string', 'public_message'=>'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', 'string'=>'string', 'nonce'=>'string', 'key'=>'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', 'message'=>'string', 'nonce'=>'string', 'message_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|false', 'message'=>'string', 'recipient_keypair'=>'string'], -'sodium_crypto_box_secretkey' => ['string', 'keypair'=>'string'], -'sodium_crypto_box_seed_keypair' => ['string', 'seed'=>'string'], -'sodium_crypto_generichash' => ['string', 'msg'=>'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', 'state'=>'string', 'string'=>'string'], -'sodium_crypto_kdf_derive_from_key' => ['string', 'subkey_len'=>'int', 'subkey_id'=>'int', 'context'=>'string', 'key'=>'string'], -'sodium_crypto_kdf_keygen' => ['string'], -'sodium_crypto_kx' => ['string', 'secretkey'=>'string', 'publickey'=>'string', 'client_publickey'=>'string', 'server_publickey'=>'string'], -'sodium_crypto_kx_client_session_keys' => ['string', 'client_keypair'=>'string', 'server_key'=>'string'], -'sodium_crypto_kx_keypair' => ['string'], -'sodium_crypto_kx_publickey' => ['string', 'keypair'=>'string'], -'sodium_crypto_kx_secretkey' => ['string', 'keypair'=>'string'], -'sodium_crypto_kx_seed_keypair' => ['string', 'seed'=>'string'], -'sodium_crypto_kx_server_session_keys' => ['string', 'server_keypair'=>'string', 'client_key'=>'string'], -'sodium_crypto_pwhash' => ['string', 'length'=>'int', 'password'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int', 'alg='=>'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', 'string_1'=>'string', 'string_2'=>'string'], -'sodium_crypto_scalarmult_base' => ['string', 'string_1'=>'string', 'string_2'=>'string'], -'sodium_crypto_secretbox' => ['string', 'plaintext'=>'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', 'state'=>'string', 'c'=>'string', 'ad='=>'string'], -'sodium_crypto_secretstream_xchacha20poly1305_push' => ['string', 'state'=>'string', 'msg'=>'string', 'ad='=>'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', 'secretkey'=>'string'], -'sodium_crypto_sign_detached' => ['string', 'message'=>'string', 'secretkey'=>'string'], -'sodium_crypto_sign_ed25519_pk_to_curve25519' => ['string', 'ed25519pk'=>'string'], -'sodium_crypto_sign_ed25519_sk_to_curve25519' => ['string', 'ed25519sk'=>'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', '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', 'message'=>'string', 'publickey'=>'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', 'hex'=>'string', 'ignore='=>'string'], -'sodium_increment' => ['string', '&binary_string'=>'string'], -'sodium_library_version_major' => ['int'], -'sodium_library_version_minor' => ['int'], -'sodium_memcmp' => ['int', 'string_1'=>'string', 'string_2'=>'string'], -'sodium_memzero' => ['void', '&secret'=>'string'], -'sodium_pad' => ['string', 'unpadded'=>'string', 'length'=>'int'], -'sodium_randombytes_buf' => ['string', 'length'=>'int'], -'sodium_randombytes_random16' => ['int|string'], -'sodium_randombytes_uniform' => ['int', 'upperBoundNonInclusive'=>'int'], -'sodium_unpad' => ['string', 'padded'=>'string', 'length'=>'int'], -'sodium_version_string' => ['string'], -'solid_fetch_prev' => ['bool', 'result_id'=>''], -'solr_get_version' => ['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' => ['void'], -'SolrClient::threads' => ['void'], -'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' => ['array'], -'SolrClientException::getTraceAsString' => ['string'], -'SolrCollapseFunction::__construct' => ['void', 'field'=>'string'], -'SolrCollapseFunction::__toString' => ['string'], -'SolrCollapseFunction::getField' => ['string'], -'SolrCollapseFunction::getHint' => ['string'], -'SolrCollapseFunction::getMax' => ['string'], -'SolrCollapseFunction::getMin' => ['string'], -'SolrCollapseFunction::getNullPolicy' => ['string'], -'SolrCollapseFunction::getSize' => ['int'], -'SolrCollapseFunction::setField' => ['SolrCollapseFunction', 'fieldName'=>'string'], -'SolrCollapseFunction::setHint' => ['SolrCollapseFunction', 'hint'=>'string'], -'SolrCollapseFunction::setMax' => ['SolrCollapseFunction', 'max'=>'string'], -'SolrCollapseFunction::setMin' => ['SolrCollapseFunction', 'min'=>'string'], -'SolrCollapseFunction::setNullPolicy' => ['SolrCollapseFunction', 'nullPolicy'=>'string'], -'SolrCollapseFunction::setSize' => ['SolrCollapseFunction', 'size'=>'int'], -'SolrDisMaxQuery::__construct' => ['void', 'q='=>'string'], -'SolrDisMaxQuery::__destruct' => ['void'], -'SolrDisMaxQuery::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], -'SolrDisMaxQuery::addBigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], -'SolrDisMaxQuery::addBoostQuery' => ['SolrDisMaxQuery', 'field'=>'string', 'value'=>'string', 'boost='=>'string'], -'SolrDisMaxQuery::addExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrDisMaxQuery::addExpandSortField' => ['SolrQuery', 'field'=>'string', 'order'=>'string'], -'SolrDisMaxQuery::addFacetDateField' => ['SolrQuery', 'dateField'=>'string'], -'SolrDisMaxQuery::addFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::addFacetField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addFacetQuery' => ['SolrQuery', 'facetQuery'=>'string'], -'SolrDisMaxQuery::addField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrDisMaxQuery::addGroupField' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::addGroupFunction' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::addGroupQuery' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::addGroupSortField' => ['SolrQuery', 'field'=>'string', 'order'=>'int'], -'SolrDisMaxQuery::addHighlightField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addMltField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addMltQueryField' => ['SolrQuery', 'field'=>'string', 'boost'=>'float'], -'SolrDisMaxQuery::addParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], -'SolrDisMaxQuery::addPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], -'SolrDisMaxQuery::addQueryField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost='=>'string'], -'SolrDisMaxQuery::addSortField' => ['SolrQuery', 'field'=>'string', 'order='=>'int'], -'SolrDisMaxQuery::addStatsFacet' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addStatsField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::addTrigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string', 'boost'=>'string', 'slop='=>'string'], -'SolrDisMaxQuery::addUserField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::collapse' => ['SolrQuery', 'collapseFunction'=>'SolrCollapseFunction'], -'SolrDisMaxQuery::get' => ['mixed', 'param_name'=>'string'], -'SolrDisMaxQuery::getExpand' => ['bool'], -'SolrDisMaxQuery::getExpandFilterQueries' => ['array'], -'SolrDisMaxQuery::getExpandQuery' => ['array'], -'SolrDisMaxQuery::getExpandRows' => ['int'], -'SolrDisMaxQuery::getExpandSortFields' => ['array'], -'SolrDisMaxQuery::getFacet' => ['bool'], -'SolrDisMaxQuery::getFacetDateEnd' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetDateFields' => ['array'], -'SolrDisMaxQuery::getFacetDateGap' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetDateHardEnd' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetDateOther' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetDateStart' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetFields' => ['array'], -'SolrDisMaxQuery::getFacetLimit' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetMethod' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetMinCount' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetMissing' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetOffset' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetPrefix' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getFacetQueries' => ['string'], -'SolrDisMaxQuery::getFacetSort' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getFields' => ['string'], -'SolrDisMaxQuery::getFilterQueries' => ['string'], -'SolrDisMaxQuery::getGroup' => ['bool'], -'SolrDisMaxQuery::getGroupCachePercent' => ['int'], -'SolrDisMaxQuery::getGroupFacet' => ['bool'], -'SolrDisMaxQuery::getGroupFields' => ['array'], -'SolrDisMaxQuery::getGroupFormat' => ['string'], -'SolrDisMaxQuery::getGroupFunctions' => ['array'], -'SolrDisMaxQuery::getGroupLimit' => ['int'], -'SolrDisMaxQuery::getGroupMain' => ['bool'], -'SolrDisMaxQuery::getGroupNGroups' => ['bool'], -'SolrDisMaxQuery::getGroupOffset' => ['bool'], -'SolrDisMaxQuery::getGroupQueries' => ['array'], -'SolrDisMaxQuery::getGroupSortFields' => ['array'], -'SolrDisMaxQuery::getGroupTruncate' => ['bool'], -'SolrDisMaxQuery::getHighlight' => ['bool'], -'SolrDisMaxQuery::getHighlightAlternateField' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightFields' => ['array'], -'SolrDisMaxQuery::getHighlightFormatter' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightFragmenter' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightFragsize' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightHighlightMultiTerm' => ['bool'], -'SolrDisMaxQuery::getHighlightMaxAlternateFieldLength' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightMaxAnalyzedChars' => ['int'], -'SolrDisMaxQuery::getHighlightMergeContiguous' => ['bool', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightRegexMaxAnalyzedChars' => ['int'], -'SolrDisMaxQuery::getHighlightRegexPattern' => ['string'], -'SolrDisMaxQuery::getHighlightRegexSlop' => ['float'], -'SolrDisMaxQuery::getHighlightRequireFieldMatch' => ['bool'], -'SolrDisMaxQuery::getHighlightSimplePost' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightSimplePre' => ['string', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightSnippets' => ['int', 'field_override'=>'string'], -'SolrDisMaxQuery::getHighlightUsePhraseHighlighter' => ['bool'], -'SolrDisMaxQuery::getMlt' => ['bool'], -'SolrDisMaxQuery::getMltBoost' => ['bool'], -'SolrDisMaxQuery::getMltCount' => ['int'], -'SolrDisMaxQuery::getMltFields' => ['array'], -'SolrDisMaxQuery::getMltMaxNumQueryTerms' => ['int'], -'SolrDisMaxQuery::getMltMaxNumTokens' => ['int'], -'SolrDisMaxQuery::getMltMaxWordLength' => ['int'], -'SolrDisMaxQuery::getMltMinDocFrequency' => ['int'], -'SolrDisMaxQuery::getMltMinTermFrequency' => ['int'], -'SolrDisMaxQuery::getMltMinWordLength' => ['int'], -'SolrDisMaxQuery::getMltQueryFields' => ['array'], -'SolrDisMaxQuery::getParam' => ['mixed', 'param_name'=>'string'], -'SolrDisMaxQuery::getParams' => ['array'], -'SolrDisMaxQuery::getPreparedParams' => ['array'], -'SolrDisMaxQuery::getQuery' => ['string'], -'SolrDisMaxQuery::getRows' => ['int'], -'SolrDisMaxQuery::getSortFields' => ['array'], -'SolrDisMaxQuery::getStart' => ['int'], -'SolrDisMaxQuery::getStats' => ['bool'], -'SolrDisMaxQuery::getStatsFacets' => ['array'], -'SolrDisMaxQuery::getStatsFields' => ['array'], -'SolrDisMaxQuery::getTerms' => ['bool'], -'SolrDisMaxQuery::getTermsField' => ['string'], -'SolrDisMaxQuery::getTermsIncludeLowerBound' => ['bool'], -'SolrDisMaxQuery::getTermsIncludeUpperBound' => ['bool'], -'SolrDisMaxQuery::getTermsLimit' => ['int'], -'SolrDisMaxQuery::getTermsLowerBound' => ['string'], -'SolrDisMaxQuery::getTermsMaxCount' => ['int'], -'SolrDisMaxQuery::getTermsMinCount' => ['int'], -'SolrDisMaxQuery::getTermsPrefix' => ['string'], -'SolrDisMaxQuery::getTermsReturnRaw' => ['bool'], -'SolrDisMaxQuery::getTermsSort' => ['int'], -'SolrDisMaxQuery::getTermsUpperBound' => ['string'], -'SolrDisMaxQuery::getTimeAllowed' => ['int'], -'SolrDisMaxQuery::removeBigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeBoostQuery' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeExpandFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrDisMaxQuery::removeExpandSortField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeFacetDateField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeFacetDateOther' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::removeFacetField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeFacetQuery' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::removeField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeFilterQuery' => ['SolrQuery', 'fq'=>'string'], -'SolrDisMaxQuery::removeHighlightField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeMltField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeMltQueryField' => ['SolrQuery', 'queryField'=>'string'], -'SolrDisMaxQuery::removePhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeQueryField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeSortField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeStatsFacet' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::removeStatsField' => ['SolrQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeTrigramPhraseField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::removeUserField' => ['SolrDisMaxQuery', 'field'=>'string'], -'SolrDisMaxQuery::serialize' => ['string'], -'SolrDisMaxQuery::set' => ['SolrParams', 'name'=>'string', 'value'=>''], -'SolrDisMaxQuery::setBigramPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], -'SolrDisMaxQuery::setBigramPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], -'SolrDisMaxQuery::setBoostFunction' => ['SolrDisMaxQuery', 'function'=>'string'], -'SolrDisMaxQuery::setBoostQuery' => ['SolrDisMaxQuery', 'q'=>'string'], -'SolrDisMaxQuery::setEchoHandler' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setEchoParams' => ['SolrQuery', 'type'=>'string'], -'SolrDisMaxQuery::setExpand' => ['SolrQuery', 'value'=>'bool'], -'SolrDisMaxQuery::setExpandQuery' => ['SolrQuery', 'q'=>'string'], -'SolrDisMaxQuery::setExpandRows' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setExplainOther' => ['SolrQuery', 'query'=>'string'], -'SolrDisMaxQuery::setFacet' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setFacetDateEnd' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetDateGap' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetDateHardEnd' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetDateStart' => ['SolrQuery', 'value'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetEnumCacheMinDefaultFrequency' => ['SolrQuery', 'frequency'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetLimit' => ['SolrQuery', 'limit'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetMethod' => ['SolrQuery', 'method'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetMinCount' => ['SolrQuery', 'mincount'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetMissing' => ['SolrQuery', 'flag'=>'bool', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetOffset' => ['SolrQuery', 'offset'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetPrefix' => ['SolrQuery', 'prefix'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setFacetSort' => ['SolrQuery', 'facetSort'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setGroup' => ['SolrQuery', 'value'=>'bool'], -'SolrDisMaxQuery::setGroupCachePercent' => ['SolrQuery', 'percent'=>'int'], -'SolrDisMaxQuery::setGroupFacet' => ['SolrQuery', 'value'=>'bool'], -'SolrDisMaxQuery::setGroupFormat' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::setGroupLimit' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setGroupMain' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::setGroupNGroups' => ['SolrQuery', 'value'=>'bool'], -'SolrDisMaxQuery::setGroupOffset' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setGroupTruncate' => ['SolrQuery', 'value'=>'bool'], -'SolrDisMaxQuery::setHighlight' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setHighlightAlternateField' => ['SolrQuery', 'field'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightFormatter' => ['SolrQuery', 'formatter'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightFragmenter' => ['SolrQuery', 'fragmenter'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightFragsize' => ['SolrQuery', 'size'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightHighlightMultiTerm' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setHighlightMaxAlternateFieldLength' => ['SolrQuery', 'fieldLength'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightMaxAnalyzedChars' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setHighlightMergeContiguous' => ['SolrQuery', 'flag'=>'bool', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightRegexMaxAnalyzedChars' => ['SolrQuery', 'maxAnalyzedChars'=>'int'], -'SolrDisMaxQuery::setHighlightRegexPattern' => ['SolrQuery', 'value'=>'string'], -'SolrDisMaxQuery::setHighlightRegexSlop' => ['SolrQuery', 'factor'=>'float'], -'SolrDisMaxQuery::setHighlightRequireFieldMatch' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setHighlightSimplePost' => ['SolrQuery', 'simplePost'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightSimplePre' => ['SolrQuery', 'simplePre'=>'string', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightSnippets' => ['SolrQuery', 'value'=>'int', 'field_override'=>'string'], -'SolrDisMaxQuery::setHighlightUsePhraseHighlighter' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setMinimumMatch' => ['SolrDisMaxQuery', 'value'=>'string'], -'SolrDisMaxQuery::setMlt' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setMltBoost' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setMltCount' => ['SolrQuery', 'count'=>'int'], -'SolrDisMaxQuery::setMltMaxNumQueryTerms' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setMltMaxNumTokens' => ['SolrQuery', 'value'=>'int'], -'SolrDisMaxQuery::setMltMaxWordLength' => ['SolrQuery', 'maxWordLength'=>'int'], -'SolrDisMaxQuery::setMltMinDocFrequency' => ['SolrQuery', 'minDocFrequency'=>'int'], -'SolrDisMaxQuery::setMltMinTermFrequency' => ['SolrQuery', 'minTermFrequency'=>'int'], -'SolrDisMaxQuery::setMltMinWordLength' => ['SolrQuery', 'minWordLength'=>'int'], -'SolrDisMaxQuery::setOmitHeader' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setParam' => ['SolrParams', 'name'=>'string', 'value'=>''], -'SolrDisMaxQuery::setPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], -'SolrDisMaxQuery::setPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], -'SolrDisMaxQuery::setQuery' => ['SolrQuery', 'query'=>'string'], -'SolrDisMaxQuery::setQueryAlt' => ['SolrDisMaxQuery', 'q'=>'string'], -'SolrDisMaxQuery::setQueryPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], -'SolrDisMaxQuery::setRows' => ['SolrQuery', 'rows'=>'int'], -'SolrDisMaxQuery::setShowDebugInfo' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setStart' => ['SolrQuery', 'start'=>'int'], -'SolrDisMaxQuery::setStats' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setTerms' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setTermsField' => ['SolrQuery', 'fieldname'=>'string'], -'SolrDisMaxQuery::setTermsIncludeLowerBound' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setTermsIncludeUpperBound' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setTermsLimit' => ['SolrQuery', 'limit'=>'int'], -'SolrDisMaxQuery::setTermsLowerBound' => ['SolrQuery', 'lowerBound'=>'string'], -'SolrDisMaxQuery::setTermsMaxCount' => ['SolrQuery', 'frequency'=>'int'], -'SolrDisMaxQuery::setTermsMinCount' => ['SolrQuery', 'frequency'=>'int'], -'SolrDisMaxQuery::setTermsPrefix' => ['SolrQuery', 'prefix'=>'string'], -'SolrDisMaxQuery::setTermsReturnRaw' => ['SolrQuery', 'flag'=>'bool'], -'SolrDisMaxQuery::setTermsSort' => ['SolrQuery', 'sortType'=>'int'], -'SolrDisMaxQuery::setTermsUpperBound' => ['SolrQuery', 'upperBound'=>'string'], -'SolrDisMaxQuery::setTieBreaker' => ['SolrDisMaxQuery', 'tieBreaker'=>'string'], -'SolrDisMaxQuery::setTimeAllowed' => ['SolrQuery', 'timeAllowed'=>'int'], -'SolrDisMaxQuery::setTrigramPhraseFields' => ['SolrDisMaxQuery', 'fields'=>'string'], -'SolrDisMaxQuery::setTrigramPhraseSlop' => ['SolrDisMaxQuery', 'slop'=>'string'], -'SolrDisMaxQuery::setUserFields' => ['SolrDisMaxQuery', 'fields'=>'string'], -'SolrDisMaxQuery::toString' => ['string', 'url_encode='=>'bool|false'], -'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' => ['array'], -'SolrDocument::getChildDocumentsCount' => ['int'], -'SolrDocument::getField' => ['SolrDocumentField', 'fieldname'=>'string'], -'SolrDocument::getFieldCount' => ['int'], -'SolrDocument::getFieldNames' => ['array'], -'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' => ['array'], -'SolrException::getTraceAsString' => ['string'], -'SolrGenericResponse::__construct' => ['void'], -'SolrGenericResponse::__destruct' => ['void'], -'SolrGenericResponse::getDigestedResponse' => ['string'], -'SolrGenericResponse::getHttpStatus' => ['int'], -'SolrGenericResponse::getHttpStatusMessage' => ['string'], -'SolrGenericResponse::getRawRequest' => ['string'], -'SolrGenericResponse::getRawRequestHeaders' => ['string'], -'SolrGenericResponse::getRawResponse' => ['string'], -'SolrGenericResponse::getRawResponseHeaders' => ['string'], -'SolrGenericResponse::getRequestUrl' => ['string'], -'SolrGenericResponse::getResponse' => ['SolrObject'], -'SolrGenericResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], -'SolrGenericResponse::success' => ['bool'], -'SolrIllegalArgumentException::__clone' => ['void'], -'SolrIllegalArgumentException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?\Exception|?\Throwable'], -'SolrIllegalArgumentException::__toString' => ['string'], -'SolrIllegalArgumentException::__wakeup' => ['void'], -'SolrIllegalArgumentException::getCode' => ['int'], -'SolrIllegalArgumentException::getFile' => ['string'], -'SolrIllegalArgumentException::getInternalInfo' => ['array'], -'SolrIllegalArgumentException::getLine' => ['int'], -'SolrIllegalArgumentException::getMessage' => ['string'], -'SolrIllegalArgumentException::getPrevious' => ['Exception|Throwable'], -'SolrIllegalArgumentException::getTrace' => ['array'], -'SolrIllegalArgumentException::getTraceAsString' => ['string'], -'SolrIllegalOperationException::__clone' => ['void'], -'SolrIllegalOperationException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?\Exception|?\Throwable'], -'SolrIllegalOperationException::__toString' => ['string'], -'SolrIllegalOperationException::__wakeup' => ['void'], -'SolrIllegalOperationException::getCode' => ['int'], -'SolrIllegalOperationException::getFile' => ['string'], -'SolrIllegalOperationException::getInternalInfo' => ['array'], -'SolrIllegalOperationException::getLine' => ['int'], -'SolrIllegalOperationException::getMessage' => ['string'], -'SolrIllegalOperationException::getPrevious' => ['Exception|Throwable'], -'SolrIllegalOperationException::getTrace' => ['array'], -'SolrIllegalOperationException::getTraceAsString' => ['string'], -'SolrInputDocument::__clone' => ['void'], -'SolrInputDocument::__construct' => ['void'], -'SolrInputDocument::__destruct' => ['void'], -'SolrInputDocument::addChildDocument' => ['void', 'child'=>'SolrInputDocument'], -'SolrInputDocument::addChildDocuments' => ['void', 'docs'=>'array'], -'SolrInputDocument::addField' => ['bool', 'fieldname'=>'string', 'fieldvalue'=>'string', 'fieldboostvalue='=>'float'], -'SolrInputDocument::clear' => ['bool'], -'SolrInputDocument::deleteField' => ['bool', 'fieldname'=>'string'], -'SolrInputDocument::fieldExists' => ['bool', 'fieldname'=>'string'], -'SolrInputDocument::getBoost' => ['float'], -'SolrInputDocument::getChildDocuments' => ['array'], -'SolrInputDocument::getChildDocumentsCount' => ['int'], -'SolrInputDocument::getField' => ['SolrDocumentField', 'fieldname'=>'string'], -'SolrInputDocument::getFieldBoost' => ['float', 'fieldname'=>'string'], -'SolrInputDocument::getFieldCount' => ['int'], -'SolrInputDocument::getFieldNames' => ['array'], -'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'], -'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|false'], -'SolrModifiableParams::unserialize' => ['void', 'serialized'=>'string'], -'SolrObject::__construct' => ['void'], -'SolrObject::__destruct' => ['void'], -'SolrObject::getPropertyNames' => ['array'], -'SolrObject::offsetExists' => ['bool', 'property_name'=>'string'], -'SolrObject::offsetGet' => ['mixed', 'property_name'=>'string'], -'SolrObject::offsetSet' => ['void', 'property_name'=>'string', 'property_value'=>'string'], -'SolrObject::offsetUnset' => ['void', 'property_name'=>'string'], -'SolrParams::__construct' => ['void'], -'SolrParams::add' => ['SolrParams', 'name'=>'string', 'value'=>'string'], -'SolrParams::addParam' => ['SolrParams', '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' => ['void', 'name'=>'string', 'value'=>'string'], -'SolrParams::setParam' => ['SolrParams', 'name'=>'string', 'value'=>'string'], -'SolrParams::toString' => ['string', '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' => ['array', '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|false'], -'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' => ['array'], -'SolrServerException::getTraceAsString' => ['string'], -'SolrUpdateResponse::__construct' => ['void'], -'SolrUpdateResponse::__destruct' => ['void'], -'SolrUpdateResponse::getDigestedResponse' => ['string'], -'SolrUpdateResponse::getHttpStatus' => ['int'], -'SolrUpdateResponse::getHttpStatusMessage' => ['string'], -'SolrUpdateResponse::getRawRequest' => ['string'], -'SolrUpdateResponse::getRawRequestHeaders' => ['string'], -'SolrUpdateResponse::getRawResponse' => ['string'], -'SolrUpdateResponse::getRawResponseHeaders' => ['string'], -'SolrUpdateResponse::getRequestUrl' => ['string'], -'SolrUpdateResponse::getResponse' => ['SolrObject'], -'SolrUpdateResponse::setParseMode' => ['bool', 'parser_mode='=>'int'], -'SolrUpdateResponse::success' => ['bool'], -'SolrUtils::digestXmlResponse' => ['SolrObject', 'xmlresponse'=>'string', 'parse_mode='=>'int'], -'SolrUtils::escapeQueryChars' => ['string', 'str'=>'string'], -'SolrUtils::getSolrVersion' => ['string'], -'SolrUtils::queryPhrase' => ['string', 'str'=>'string'], -'sort' => ['bool', '&rw_array_arg'=>'array', 'sort_flags='=>'int'], -'soundex' => ['string', 'str'=>'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_name'=>'string', 'file_extensions='=>'string'], -'spl_autoload_call' => ['void', 'class_name'=>'string'], -'spl_autoload_extensions' => ['string', 'file_extensions='=>'string'], -'spl_autoload_functions' => ['false|array'], -'spl_autoload_register' => ['bool', 'autoload_function='=>'callable(string):void', 'throw='=>'bool', 'prepend='=>'bool'], -'spl_autoload_unregister' => ['bool', 'autoload_function'=>'mixed'], -'spl_classes' => ['array'], -'spl_object_hash' => ['string', 'obj'=>'object'], -'spl_object_id' => ['int', 'obj'=>'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' => ['int', '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|true'], -'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' => ['?array|false', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'SplFileObject::fgets' => ['string'], -'SplFileObject::fgetss' => ['string', 'allowable_tags='=>'string'], -'SplFileObject::flock' => ['bool', 'operation'=>'int', '&w_wouldblock='=>'int'], -'SplFileObject::fpassthru' => ['int|false'], -'SplFileObject::fputcsv' => ['int|false', 'fields'=>'array', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'SplFileObject::fread' => ['string|false', 'length'=>'int'], -'SplFileObject::fscanf' => ['bool', 'format'=>'string', '&...w_vars='=>'string|int|float'], -'SplFileObject::fseek' => ['int', 'pos'=>'int', 'whence='=>'int'], -'SplFileObject::fstat' => ['array|false'], -'SplFileObject::ftell' => ['int'], -'SplFileObject::ftruncate' => ['bool', 'size'=>'int'], -'SplFileObject::fwrite' => ['int', 'str'=>'string', 'length='=>'int'], -'SplFileObject::getATime' => ['int'], -'SplFileObject::getBasename' => ['string', 'suffix='=>'string'], -'SplFileObject::getChildren' => ['null'], -'SplFileObject::getCsvControl' => ['array'], -'SplFileObject::getCTime' => ['int'], -'SplFileObject::getCurrentLine' => ['string'], -'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' => ['bool'], -'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' => ['int'], -'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', 'obj'=>'object', 'inf='=>'mixed'], -'SplObjectStorage::contains' => ['bool', 'obj'=>'object'], -'SplObjectStorage::count' => ['int'], -'SplObjectStorage::current' => ['object'], -'SplObjectStorage::detach' => ['void', 'obj'=>'object'], -'SplObjectStorage::getHash' => ['string', 'obj'=>'object'], -'SplObjectStorage::getInfo' => ['mixed'], -'SplObjectStorage::key' => ['int'], -'SplObjectStorage::next' => ['void'], -'SplObjectStorage::offsetExists' => ['bool', 'object'=>'object'], -'SplObjectStorage::offsetGet' => ['mixed', 'obj'=>'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' => ['?array|false', 'delimiter='=>'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', 'delimiter='=>'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|false'], -'SplTempFileObject::ftell' => ['int'], -'SplTempFileObject::ftruncate' => ['bool', 'size'=>'int'], -'SplTempFileObject::fwrite' => ['int', 'str'=>'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'], -'sprintf' => ['string', 'format'=>'string', '...vars='=>'string|int|float'], -'SQLite3::__construct' => ['void', 'filename'=>'string', 'flags='=>'int', 'encryption_key='=>'?string'], -'SQLite3::busyTimeout' => ['bool', 'msecs'=>'int'], -'SQLite3::changes' => ['int'], -'SQLite3::close' => ['bool'], -'SQLite3::createAggregate' => ['bool', 'name'=>'string', 'step_callback'=>'callable', 'final_callback'=>'callable', 'argument_count='=>'int'], -'SQLite3::createCollation' => ['bool', 'name'=>'string', 'callback'=>'callable'], -'SQLite3::createFunction' => ['bool', 'name'=>'string', 'callback'=>'callable', 'argument_count='=>'int', 'flags='=>'int'], -'SQLite3::enableExceptions' => ['bool', 'enableexceptions='=>'bool'], -'SQLite3::escapeString' => ['string', 'value'=>'string'], -'SQLite3::exec' => ['bool', 'query'=>'string'], -'SQLite3::lastErrorCode' => ['int'], -'SQLite3::lastErrorMsg' => ['string'], -'SQLite3::lastInsertRowID' => ['int'], -'SQLite3::loadExtension' => ['bool', 'shared_library'=>'string'], -'SQLite3::open' => ['void', 'filename'=>'string', 'flags='=>'int', 'encryption_key='=>'?string'], -'SQLite3::openBlob' => ['resource', 'table'=>'string', 'column'=>'string', 'rowid'=>'int', 'dbname='=>'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', 'entire_row='=>'bool'], -'SQLite3::version' => ['array'], -'SQLite3Result::__construct' => ['void'], -'SQLite3Result::columnName' => ['string', 'column_number'=>'int'], -'SQLite3Result::columnType' => ['int', 'column_number'=>'int'], -'SQLite3Result::fetchArray' => ['array|bool', 'mode='=>'int'], -'SQLite3Result::finalize' => ['bool'], -'SQLite3Result::numColumns' => ['int'], -'SQLite3Result::reset' => ['bool'], -'SQLite3Stmt::__construct' => ['void', 'dbobject'=>'sqlite3', 'statement'=>'string'], -'SQLite3Stmt::bindParam' => ['bool', 'parameter_name_or_number'=>'string|int', '&rw_parameter'=>'mixed', 'type='=>'int'], -'SQLite3Stmt::bindValue' => ['bool', 'parameter_name_or_number'=>'string|int', 'parameter'=>'mixed', 'type='=>'int'], -'SQLite3Stmt::clear' => ['bool'], -'SQLite3Stmt::close' => ['bool'], -'SQLite3Stmt::execute' => ['SQLite3Result'], -'SQLite3Stmt::getSQL' => ['string', 'expanded='=>'bool'], -'SQLite3Stmt::paramCount' => ['int'], -'SQLite3Stmt::readOnly' => ['bool'], -'SQLite3Stmt::reset' => ['bool'], -'sqlite_array_query' => ['array', 'dbhandle'=>'', 'query'=>'string', 'result_type='=>'int', 'decode_binary='=>'bool'], -'sqlite_busy_timeout' => ['', 'dbhandle'=>'', 'milliseconds'=>'int'], -'sqlite_changes' => ['int', 'dbhandle'=>''], -'sqlite_close' => ['void', 'dbhandle'=>'resource'], -'sqlite_column' => ['', 'result'=>'', 'index_or_name'=>'', 'decode_binary='=>'bool'], -'sqlite_create_aggregate' => ['', 'dbhandle'=>'', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'], -'sqlite_create_function' => ['', 'dbhandle'=>'', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'], -'sqlite_current' => ['array', 'result'=>'', 'result_type='=>'int', 'decode_binary='=>'bool'], -'sqlite_error_string' => ['string', 'error_code'=>'int'], -'sqlite_escape_string' => ['string', 'item'=>'string'], -'sqlite_exec' => ['bool', 'dbhandle'=>'', 'query'=>'string', 'error_msg='=>'string'], -'sqlite_factory' => ['SQLiteDatabase', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], -'sqlite_fetch_all' => ['array', 'result'=>'', 'result_type='=>'int', 'decode_binary='=>'bool'], -'sqlite_fetch_array' => ['array', 'result'=>'', 'result_type='=>'int', 'decode_binary='=>'bool'], -'sqlite_fetch_column_types' => ['array', 'table_name'=>'string', 'dbhandle'=>'', 'result_type='=>'int'], -'sqlite_fetch_object' => ['object', 'result'=>'', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], -'sqlite_fetch_single' => ['string', 'result'=>'', 'decode_binary='=>'bool'], -'sqlite_fetch_string' => ['string', 'result'=>'resource', 'decode_binary'=>'bool'], -'sqlite_field_name' => ['string', 'result'=>'', 'field_index'=>'int'], -'sqlite_has_more' => ['bool', 'result'=>'resource'], -'sqlite_has_prev' => ['bool', 'result'=>''], -'sqlite_key' => ['int', 'result'=>''], -'sqlite_last_error' => ['int', 'dbhandle'=>''], -'sqlite_last_insert_rowid' => ['int', 'dbhandle'=>''], -'sqlite_libencoding' => ['string'], -'sqlite_libversion' => ['string'], -'sqlite_next' => ['bool', 'result'=>''], -'sqlite_num_fields' => ['int', 'result'=>''], -'sqlite_num_rows' => ['int', 'result'=>''], -'sqlite_open' => ['resource', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], -'sqlite_popen' => ['resource', 'filename'=>'string', 'mode='=>'int', 'error_message='=>'string'], -'sqlite_prev' => ['bool', 'result'=>''], -'sqlite_query' => ['SQLiteResult', 'dbhandle'=>'', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], -'sqlite_rewind' => ['bool', 'result'=>''], -'sqlite_seek' => ['bool', 'result'=>'', 'rownum'=>'int'], -'sqlite_single_query' => ['array', 'db'=>'', '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', 'dbhandle'=>'', 'query'=>'string', 'result_type='=>'int', 'error_msg='=>'string'], -'sqlite_valid' => ['bool', 'result'=>''], -'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', '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', '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' => ['array'], -'SQLiteException::getTraceAsString' => ['string'], -'SQLiteResult::__construct' => ['void'], -'SQLiteResult::column' => ['mixed', 'index_or_name'=>'', 'decode_binary='=>'bool'], -'SQLiteResult::count' => ['int'], -'SQLiteResult::current' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], -'SQLiteResult::fetch' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], -'SQLiteResult::fetchAll' => ['array', 'result_type='=>'int', 'decode_binary='=>'bool'], -'SQLiteResult::fetchObject' => ['object', 'class_name='=>'string', 'ctor_params='=>'array', 'decode_binary='=>'bool'], -'SQLiteResult::fetchSingle' => ['string', 'decode_binary='=>'bool'], -'SQLiteResult::fieldName' => ['string', 'field_index'=>'int'], -'SQLiteResult::hasPrev' => ['bool'], -'SQLiteResult::key' => ['int'], -'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|null', 'errorsOrWarnings='=>'int'], -'sqlsrv_execute' => ['bool', 'stmt'=>'resource'], -'sqlsrv_fetch' => ['bool|null', '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|null', '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', 'number'=>'float'], -'srand' => ['void', 'seed='=>'int', 'mode='=>'int'], -'sscanf' => ['mixed', 'str'=>'string', 'format'=>'string', '&...w_vars='=>'string|int|float'], -'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' => ['true|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', 'channel'=>'resource', 'streamid'=>'int'], -'ssh2_fingerprint' => ['string', 'session'=>'resource', 'flags='=>'int'], -'ssh2_forward_accept' => ['void'], -'ssh2_forward_listen' => ['void'], -'ssh2_methods_negotiated' => ['array', 'session'=>'resource'], -'ssh2_poll' => ['void', '&var1'=>''], -'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', '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', 'session'=>'resource'], -'ssh2_sftp_chmod' => ['bool', 'sftp'=>'resource', 'filename'=>'string', 'mode'=>'int'], -'ssh2_sftp_lstat' => ['array', 'sftp'=>'resource', 'path'=>'string'], -'ssh2_sftp_mkdir' => ['bool', 'sftp'=>'resource', 'dirname'=>'string', 'mode='=>'int', 'recursive='=>'bool'], -'ssh2_sftp_readlink' => ['string', 'sftp'=>'resource', 'link'=>'string'], -'ssh2_sftp_realpath' => ['string', '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|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', 'session'=>'resource', 'term_type='=>'string', 'env='=>'array', 'width='=>'int', 'height='=>'int', 'width_height_type='=>'int'], -'ssh2_tunnel' => ['resource', 'session'=>'resource', 'host'=>'string', 'port'=>'int'], -'stat' => ['array|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', 'arr1'=>'array', 'arr2'=>'array'], -'stats_stat_factorial' => ['float', 'n'=>'int'], -'stats_stat_gennch' => ['float', 'n'=>'int'], -'stats_stat_independent_t' => ['float', 'arr1'=>'array', 'arr2'=>'array'], -'stats_stat_innerproduct' => ['float', 'arr1'=>'array', 'arr2'=>'array'], -'stats_stat_noncentral_t' => ['float', 'par1'=>'float', 'par2'=>'float', 'par3'=>'float', 'which'=>'int'], -'stats_stat_paired_t' => ['float', 'arr1'=>'array', 'arr2'=>'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_getcsv' => ['array', 'input'=>'string', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'str_ireplace' => ['string|string[]', 'search'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', '&w_replace_count='=>'int'], -'str_pad' => ['string', 'input'=>'string', 'pad_length'=>'int', 'pad_string='=>'string', 'pad_type='=>'int'], -'str_repeat' => ['string', 'input'=>'string', 'multiplier'=>'int'], -'str_replace' => ['string|array', 'search'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', '&w_replace_count='=>'int'], -'str_rot13' => ['string', 'str'=>'string'], -'str_shuffle' => ['string', 'str'=>'string'], -'str_split' => ['array<int,string>', 'str'=>'string', 'split_length='=>'int'], -'str_word_count' => ['array|int', 'string'=>'string', 'format='=>'int', 'charlist='=>'string'], -'strcasecmp' => ['int', 'str1'=>'string', 'str2'=>'string'], -'strchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'before_needle='=>'bool'], -'strcmp' => ['int', 'str1'=>'string', 'str2'=>'string'], -'strcoll' => ['int', 'str1'=>'string', 'str2'=>'string'], -'strcspn' => ['int', 'str'=>'string', 'mask'=>'string', 'start='=>'int', 'length='=>'int'], -'stream_bucket_append' => ['void', 'brigade'=>'resource', 'bucket'=>'object'], -'stream_bucket_make_writeable' => ['object', 'brigade'=>'resource'], -'stream_bucket_new' => ['resource', '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', 'context'=>'resource'], -'stream_context_get_params' => ['array', 'context'=>'resource'], -'stream_context_set_default' => ['resource', 'options'=>'array'], -'stream_context_set_option' => ['bool', 'context'=>'', 'wrappername'=>'string', 'optionname'=>'string', 'value'=>''], -'stream_context_set_option\'1' => ['bool', 'context'=>'', 'options'=>'array'], -'stream_context_set_params' => ['bool', 'context'=>'resource', 'options'=>'array'], -'stream_copy_to_stream' => ['int|false', 'source'=>'resource', 'dest'=>'resource', 'maxlen='=>'int', 'pos='=>'int'], -'stream_encoding' => ['bool', 'stream'=>'resource', 'encoding='=>'string'], -'stream_filter_append' => ['resource|false', 'stream'=>'resource', 'filtername'=>'string', 'read_write='=>'int', 'filterparams='=>'array'], -'stream_filter_prepend' => ['resource|false', 'stream'=>'resource', 'filtername'=>'string', 'read_write='=>'int', 'filterparams='=>'array'], -'stream_filter_register' => ['bool', 'filtername'=>'string', 'classname'=>'string'], -'stream_filter_remove' => ['bool', 'stream_filter'=>'resource'], -'stream_get_contents' => ['string|false', 'source'=>'resource', 'maxlen='=>'int', 'offset='=>'int'], -'stream_get_filters' => ['array'], -'stream_get_line' => ['string|false', 'stream'=>'resource', 'maxlen'=>'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}|array<string,mixed>', 'fp'=>'resource'], -'stream_get_transports' => ['array'], -'stream_get_wrappers' => ['array'], -'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', 'classname'=>'string', 'flags='=>'int'], -'stream_resolve_include_path' => ['string|false', 'filename'=>'string'], -'stream_select' => ['int|false', '&rw_read_streams'=>'resource[]', '&rw_write_streams'=>'?resource[]', '&rw_except_streams'=>'?resource[]', 'tv_sec'=>'?int', 'tv_usec='=>'?int'], -'stream_set_blocking' => ['bool', 'socket'=>'resource', 'mode'=>'bool'], -'stream_set_chunk_size' => ['int|false', 'fp'=>'resource', 'chunk_size'=>'int'], -'stream_set_read_buffer' => ['int', 'fp'=>'resource', 'buffer'=>'int'], -'stream_set_timeout' => ['bool', 'stream'=>'resource', 'seconds'=>'int', 'microseconds='=>'int'], -'stream_set_write_buffer' => ['int', 'fp'=>'resource', 'buffer'=>'int'], -'stream_socket_accept' => ['resource|false', 'serverstream'=>'resource', 'timeout='=>'float', '&w_peername='=>'string'], -'stream_socket_client' => ['resource|false', 'remoteaddress'=>'string', '&w_errcode='=>'int', '&w_errstring='=>'string', 'timeout='=>'float', 'flags='=>'int', 'context='=>'resource'], -'stream_socket_enable_crypto' => ['int', 'stream'=>'resource', 'enable'=>'bool', 'cryptokind='=>'int', 'sessionstream='=>'resource'], -'stream_socket_get_name' => ['string', 'stream'=>'resource', 'want_peer'=>'bool'], -'stream_socket_pair' => ['resource[]|false', 'domain'=>'int', 'type'=>'int', 'protocol'=>'int'], -'stream_socket_recvfrom' => ['string', 'stream'=>'resource', 'amount'=>'int', 'flags='=>'int', '&w_remote_addr='=>'string'], -'stream_socket_sendto' => ['int', 'stream'=>'resource', 'data'=>'string', 'flags='=>'int', 'target_addr='=>'string'], -'stream_socket_server' => ['resource|false', 'localaddress'=>'string', '&w_errcode='=>'int', '&w_errstring='=>'string', 'flags='=>'int', 'context='=>'resource'], -'stream_socket_shutdown' => ['bool', 'stream'=>'resource', 'how'=>'int'], -'stream_supports_lock' => ['bool', 'stream'=>'resource'], -'stream_wrapper_register' => ['bool', 'protocol'=>'string', 'classname'=>'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', 'format'=>'string', 'timestamp='=>'int'], -'strip_tags' => ['string', 'str'=>'string', 'allowable_tags='=>'string'], -'stripcslashes' => ['string', 'str'=>'string'], -'stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], -'stripslashes' => ['string', 'str'=>'string'], -'stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'mixed', 'before_needle='=>'bool'], -'strlen' => ['int', 'string'=>'string'], -'strnatcasecmp' => ['int', 's1'=>'string', 's2'=>'string'], -'strnatcmp' => ['int', 's1'=>'string', 's2'=>'string'], -'strncasecmp' => ['int', 'str1'=>'string', 'str2'=>'string', 'len'=>'int'], -'strncmp' => ['int', 'str1'=>'string', 'str2'=>'string', 'len'=>'int'], -'strpbrk' => ['string|false', 'haystack'=>'string', 'char_list'=>'string'], -'strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], -'strptime' => ['array|false', 'datestr'=>'string', 'format'=>'string'], -'strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'mixed'], -'strrev' => ['string', 'str'=>'string'], -'strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], -'strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string|int', 'offset='=>'int'], -'strspn' => ['int', 'str'=>'string', 'mask'=>'string', 'start='=>'int', 'len='=>'int'], -'strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'mixed', 'before_needle='=>'bool'], -'strtok' => ['string|false', 'str'=>'string', 'token'=>'string'], -'strtok\'1' => ['string|false', 'token'=>'string'], -'strtolower' => ['string', 'str'=>'string'], -'strtotime' => ['int|false', 'time'=>'string', 'now='=>'int'], -'strtoupper' => ['string', 'str'=>'string'], -'strtr' => ['string', 'str'=>'string', 'from'=>'string', 'to'=>'string'], -'strtr\'1' => ['string', 'str'=>'string', 'replace_pairs'=>'array'], -'strval' => ['string', 'var'=>'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', 'str'=>'string', 'start'=>'int', 'length='=>'int'], -'substr_compare' => ['int|false', 'main_str'=>'string', 'str'=>'string', 'offset'=>'int', 'length='=>'int', 'case_sensitivity='=>'bool'], -'substr_count' => ['int', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'length='=>'int'], -'substr_replace' => ['string|array', 'str'=>'string|array', 'repl'=>'mixed', 'start'=>'mixed', 'length='=>'mixed'], -'suhosin_encrypt_cookie' => ['string', '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|false'], -'svn_propget' => ['mixed', 'path'=>'string', 'property_name'=>'string', 'recurse='=>'bool|false', 'revision'=>'int'], -'svn_proplist' => ['mixed', 'path'=>'string', 'recurse='=>'bool|false', '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', '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', 'str'=>'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', 'str'=>'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' => ['boolean', 'filename'=>'string', 'offset='=>'int'], -'swoole\client::sendto' => ['boolean', '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' => ['boolean', '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' => ['boolean'], -'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' => ['boolean', 'fd'=>'int', 'read_callback'=>'callable', 'write_callback='=>'callable', 'events='=>'string'], -'swoole\event::defer' => ['void', 'callback'=>'mixed'], -'swoole\event::del' => ['boolean', 'fd'=>'string'], -'swoole\event::exit' => ['void'], -'swoole\event::set' => ['boolean', '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' => ['boolean'], -'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='=>'boolean', 'noclose='=>'boolean'], -'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' => ['boolean', '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' => ['boolean', 'key'=>'integer', 'mode='=>'integer'], -'swoole\process::wait' => ['array', 'blocking='=>'boolean'], -'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' => ['boolean', 'process'=>'swoole_process'], -'swoole\server::after' => ['ReturnType', 'after_time_ms'=>'integer', 'callback'=>'callable', 'param='=>'string'], -'swoole\server::bind' => ['boolean', 'fd'=>'integer', 'uid'=>'integer'], -'swoole\server::close' => ['boolean', 'fd'=>'integer', 'reset='=>'boolean'], -'swoole\server::confirm' => ['boolean', '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' => ['boolean', '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'=>'boolean'], -'swoole\server::listen' => ['boolean', '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='=>'boolean'], -'swoole\server::reload' => ['boolean'], -'swoole\server::resume' => ['void', 'fd'=>'integer'], -'swoole\server::send' => ['boolean', 'fd'=>'integer', 'data'=>'string', 'reactor_id='=>'integer'], -'swoole\server::sendfile' => ['boolean', 'fd'=>'integer', 'filename'=>'string', 'offset='=>'integer'], -'swoole\server::sendMessage' => ['boolean', 'worker_id'=>'integer', 'data'=>'string'], -'swoole\server::sendto' => ['boolean', 'ip'=>'string', 'port'=>'integer', 'data'=>'string', 'server_socket='=>'string'], -'swoole\server::sendwait' => ['boolean', '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' => ['boolean', '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' => ['boolean', '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' => ['boolean'], -'swoole\timer::after' => ['void', 'after_time_ms'=>'int', 'callback'=>'callable'], -'swoole\timer::clear' => ['void', 'timer_id'=>'integer'], -'swoole\timer::exists' => ['boolean', 'timer_id'=>'integer'], -'swoole\timer::tick' => ['void', 'interval_ms'=>'integer', 'callback'=>'callable', 'param='=>'string'], -'swoole\websocket\server::exist' => ['boolean', '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='=>'string', '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' => ['bool'], -'SyncSharedMemory::write' => ['int', 'string='=>'string', 'start='=>'int'], -'sys_get_temp_dir' => ['string'], -'sys_getloadavg' => ['array'], -'syslog' => ['bool', 'priority'=>'int', 'message'=>'string'], -'system' => ['string', 'command'=>'string', '&w_return_value='=>'int'], -'taint' => ['bool', '&rw_string'=>'string', '&...w_other_strings='=>'string'], -'tan' => ['float', 'number'=>'float'], -'tanh' => ['float', 'number'=>'float'], -'tcpwrap_check' => ['bool', 'daemon'=>'string', 'address'=>'string', 'user='=>'string', 'nodns='=>'bool'], -'tempnam' => ['string|false', 'dir'=>'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|null'], -'Throwable::getTrace' => ['array'], -'Throwable::getTraceAsString' => ['string'], -'tidy::__construct' => ['void', 'filename='=>'string', 'config='=>'', 'encoding='=>'string', 'use_include_path='=>'bool'], -'tidy::body' => ['tidyNode'], -'tidy::cleanRepair' => ['bool'], -'tidy::diagnose' => ['bool'], -'tidy::getConfig' => ['array'], -'tidy::getHtmlVer' => ['int'], -'tidy::getOpt' => ['', 'option'=>'string'], -'tidy::getOptDoc' => ['string', 'optname'=>'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', 'use_include_path='=>'bool'], -'tidy::parseString' => ['bool', 'input'=>'string', 'config='=>'', 'encoding='=>'string'], -'tidy::repairFile' => ['string', 'filename'=>'string', 'config='=>'', 'encoding='=>'string', 'use_include_path='=>'bool'], -'tidy::repairString' => ['string', 'data'=>'string', 'config='=>'', 'encoding='=>'string'], -'tidy::root' => ['tidyNode'], -'tidy_access_count' => ['int', 'obj'=>'tidy'], -'tidy_clean_repair' => ['bool', 'obj'=>'tidy'], -'tidy_config_count' => ['int', 'obj'=>'tidy'], -'tidy_diagnose' => ['bool', 'obj'=>'tidy'], -'tidy_error_count' => ['int', 'obj'=>'tidy'], -'tidy_get_body' => ['tidyNode', 'obj'=>'tidy'], -'tidy_get_config' => ['array', 'obj'=>'tidy'], -'tidy_get_error_buffer' => ['string', 'obj'=>'tidy'], -'tidy_get_head' => ['tidyNode', 'obj'=>'tidy'], -'tidy_get_html' => ['tidyNode', 'obj'=>'tidy'], -'tidy_get_html_ver' => ['int', 'obj'=>'tidy'], -'tidy_get_opt_doc' => ['string', 'obj'=>'tidy', 'optname'=>'string'], -'tidy_get_output' => ['string', 'obj'=>'tidy'], -'tidy_get_release' => ['string'], -'tidy_get_root' => ['tidyNode', 'obj'=>'tidy'], -'tidy_get_status' => ['int', 'obj'=>'tidy'], -'tidy_getopt' => ['', 'option'=>'string', 'obj'=>'tidy'], -'tidy_is_xhtml' => ['bool', 'obj'=>'tidy'], -'tidy_is_xml' => ['bool', 'obj'=>'tidy'], -'tidy_load_config' => ['void', 'filename'=>'string', 'encoding'=>'string'], -'tidy_parse_file' => ['tidy', 'file'=>'string', 'config_options='=>'', 'encoding='=>'string', 'use_include_path='=>'bool'], -'tidy_parse_string' => ['tidy', 'input'=>'string', 'config_options='=>'', 'encoding='=>'string'], -'tidy_repair_file' => ['string', 'filename'=>'string', 'config_file='=>'', 'encoding='=>'string', 'use_include_path='=>'bool'], -'tidy_repair_string' => ['string', 'data'=>'string', 'config_file='=>'', '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', 'obj'=>'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' => ['int'], -'time_nanosleep' => ['array{0:int,1:int}|bool', 'seconds'=>'int', 'nanoseconds'=>'int'], -'time_sleep_until' => ['bool', 'timestamp'=>'float'], -'timezone_abbreviations_list' => ['array'], -'timezone_identifiers_list' => ['array', 'what='=>'int', 'country='=>'?string'], -'timezone_location_get' => ['array|false', 'object'=>'DateTimeZone'], -'timezone_name_from_abbr' => ['string|false', 'abbr'=>'string', 'gmtoffset='=>'int', 'isdst='=>'int'], -'timezone_name_get' => ['string', 'object'=>'DateTimeZone'], -'timezone_offset_get' => ['int', 'object'=>'DateTimeZone', 'datetime'=>'DateTimeInterface'], -'timezone_open' => ['DateTimeZone', 'timezone'=>'string'], -'timezone_transitions_get' => ['array|false', 'object'=>'DateTimeZone', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'], -'timezone_version_get' => ['string'], -'tmpfile' => ['resource|false'], -'token_get_all' => ['array<int,string|array{0:int,1:string,2:int}>', 'source'=>'string', 'flags='=>'int'], -'token_name' => ['string', 'type'=>'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', 'time='=>'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', 'traitname'=>'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', 'obj'=>'Transliterator'], -'transliterator_get_error_code' => ['int', 'obj'=>'Transliterator'], -'transliterator_get_error_message' => ['string', 'obj'=>'Transliterator'], -'transliterator_list_ids' => ['array'], -'transliterator_transliterate' => ['string|false', 'obj'=>'Transliterator|string', 'subject'=>'string', 'start='=>'int', 'end='=>'int'], -'trigger_error' => ['bool', 'message'=>'string', 'error_type='=>'int'], -'trim' => ['string', 'str'=>'string', 'character_mask='=>'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' => ['array'], -'TypeError::getTraceAsString' => ['string'], -'uasort' => ['bool', '&rw_array_arg'=>'array', 'cmp_function'=>'callable(mixed,mixed):int'], -'ucfirst' => ['string', 'str'=>'string'], -'UConverter::__construct' => ['void', 'destination_encoding='=>'string', 'source_encoding='=>'string'], -'UConverter::convert' => ['string', 'str'=>'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', 'str'=>'string', 'toEncoding'=>'string', 'fromEncoding'=>'string', 'options='=>'?array'], -'ucwords' => ['string', 'str'=>'string', 'delims='=>'string'], -'udm_add_search_limit' => ['bool', 'agent'=>'resource', 'var'=>'int', 'val'=>'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', 'str'=>'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', 'str'=>'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_arg'=>'array', 'cmp_function'=>'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' => ['array'], -'UnderflowException::getTraceAsString' => ['string'], -'UnexpectedValueException::__clone' => ['void'], -'UnexpectedValueException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable|?UnexpectedValueException'], -'UnexpectedValueException::__toString' => ['string'], -'UnexpectedValueException::getCode' => ['int'], -'UnexpectedValueException::getFile' => ['string'], -'UnexpectedValueException::getLine' => ['int'], -'UnexpectedValueException::getMessage' => ['string'], -'UnexpectedValueException::getPrevious' => ['Throwable|UnexpectedValueException|null'], -'UnexpectedValueException::getTrace' => ['array'], -'UnexpectedValueException::getTraceAsString' => ['string'], -'uniqid' => ['string', 'prefix='=>'string', 'more_entropy='=>'bool'], -'unixtojd' => ['int', 'timestamp='=>'int'], -'unlink' => ['bool', 'filename'=>'string', 'context='=>'resource'], -'unpack' => ['array', 'format'=>'string', 'data'=>'string', 'offset='=>'int'], -'unregister_tick_function' => ['void', 'function_name'=>'string'], -'unserialize' => ['mixed', 'variable_representation'=>'string', 'allowed_classes='=>'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' => ['void', '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' => ['mixed'], -'uopz_get_hook' => ['?Closure', 'class'=>'string', 'function'=>'string'], -'uopz_get_hook\'1' => ['?Closure', 'function'=>'string'], -'uopz_get_mock' => ['mixed', 'class'=>'string'], -'uopz_get_property' => ['mixed', 'class'=>'object|string', 'property'=>'string'], -'uopz_get_return' => ['mixed', 'class='=>'string', 'function'=>'string'], -'uopz_get_static' => ['array|null', 'class'=>'string', 'function'=>'string'], -'uopz_implement' => ['void', 'class'=>'string', 'interface'=>'string'], -'uopz_overload' => ['void', 'opcode'=>'int', 'callable'=>'Callable'], -'uopz_redefine' => ['void', 'class'=>'string', 'constant'=>'string', 'value'=>'mixed'], -'uopz_redefine\'1' => ['void', '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' => ['void', 'class'=>'string', 'constant'=>'string'], -'uopz_undefine\'1' => ['void', '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', 'str'=>'string'], -'urlencode' => ['string', 'str'=>'string'], -'use_soap_error_handler' => ['bool', 'handler='=>'bool'], -'user_error' => ['void', 'message'=>'string', 'error_type='=>'int'], -'usleep' => ['void', 'micro_seconds'=>'int'], -'usort' => ['bool', '&rw_array_arg'=>'array', 'cmp_function'=>'callable(mixed,mixed):int'], -'utf8_decode' => ['string', 'data'=>'string'], -'utf8_encode' => ['string', 'data'=>'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' => ['array'], -'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' => ['array'], -'V8JsScriptException::getTraceAsString' => ['string'], -'var_dump' => ['void', 'var'=>'mixed', '...args='=>'mixed'], -'var_export' => ['string|null', 'var'=>'mixed', 'return='=>'bool'], -'VARIANT::__construct' => ['void', 'value='=>'mixed', 'type='=>'int', 'codepage='=>'int'], -'variant_abs' => ['mixed', 'left'=>'mixed'], -'variant_add' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_and' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_cast' => ['object', 'variant'=>'object', 'type'=>'int'], -'variant_cat' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_cmp' => ['int', 'left'=>'mixed', 'right'=>'mixed', 'lcid='=>'int', 'flags='=>'int'], -'variant_date_from_timestamp' => ['object', 'timestamp'=>'int'], -'variant_date_to_timestamp' => ['int', 'variant'=>'object'], -'variant_div' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_eqv' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_fix' => ['mixed', 'left'=>'mixed'], -'variant_get_type' => ['int', 'variant'=>'object'], -'variant_idiv' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_imp' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_int' => ['mixed', 'left'=>'mixed'], -'variant_mod' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_mul' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_neg' => ['mixed', 'left'=>'mixed'], -'variant_not' => ['mixed', 'left'=>'mixed'], -'variant_or' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_pow' => ['mixed', 'left'=>'mixed', 'right'=>'mixed'], -'variant_round' => ['mixed', 'left'=>'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' => ['int|bool', 'ver1'=>'string', 'ver2'=>'string', 'oper='=>'\'\x3c\'|\'lt\'|\'\x3c=\'|\'le\'|\'\x3e\'|\'gt\'|\'\x3e=\'|\'ge\'|\'==\'|\'=\'|\'eq\'|\'!=\'|\'\x3c\x3e\'|\'ne\''], -'vfprintf' => ['int', 'stream'=>'resource', 'format'=>'string', 'args'=>'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', 'args'=>'array'], -'vsprintf' => ['string', 'format'=>'string', 'args'=>'array'], -'Vtiful\Kernel\Excel::__construct' => ['void', 'config'=>'array'], -'Vtiful\Kernel\Excel::addSheet' => ['', 'sheetName'=>'string'], -'Vtiful\Kernel\Excel::autoFilter' => ['', 'scope'=>'string'], -'Vtiful\Kernel\Excel::constMemory' => ['', 'fileName'=>'string', 'sheetName='=>'string'], -'Vtiful\Kernel\Excel::data' => ['', 'data'=>'array'], -'Vtiful\Kernel\Excel::fileName' => ['', 'fileName'=>'string', 'sheetName='=>'string'], -'Vtiful\Kernel\Excel::getHandle' => [''], -'Vtiful\Kernel\Excel::header' => ['', 'headerData'=>'array'], -'Vtiful\Kernel\Excel::insertFormula' => ['', 'row'=>'int', 'column'=>'int', 'formula'=>'string'], -'Vtiful\Kernel\Excel::insertImage' => ['', 'row'=>'int', 'column'=>'int', 'localImagePath'=>'string'], -'Vtiful\Kernel\Excel::insertText' => ['', 'row'=>'int', 'column'=>'int', 'data'=>'string', 'format='=>'string'], -'Vtiful\Kernel\Excel::mergeCells' => ['', 'scope'=>'string', 'data'=>'string'], -'Vtiful\Kernel\Excel::output' => [''], -'Vtiful\Kernel\Excel::setColumn' => ['', 'range'=>'string', 'width'=>'float', 'format='=>'resource'], -'Vtiful\Kernel\Excel::setRow' => ['', 'range'=>'string', 'height'=>'float', 'format='=>'resource'], -'Vtiful\Kernel\Format::align' => ['', 'handle'=>'resource', 'style'=>'int'], -'Vtiful\Kernel\Format::bold' => ['', 'handle'=>'resource'], -'Vtiful\Kernel\Format::italic' => ['', 'handle'=>'resource'], -'Vtiful\Kernel\Format::underline' => ['', 'handle'=>'resource', 'style'=>'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', 'comment='=>'string'], -'wddx_serialize_value' => ['string', 'var'=>'mixed', 'comment='=>'string'], -'wddx_serialize_vars' => ['string', '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', 'servicename'=>'string', 'machine='=>'string'], -'win32_create_service' => ['mixed', 'details'=>'array', 'machine='=>'string'], -'win32_delete_service' => ['mixed', 'servicename'=>'string', 'machine='=>'string'], -'win32_get_last_control_message' => ['int'], -'win32_pause_service' => ['int', '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' => ['mixed', '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', 'status'=>'int', 'checkpoint='=>'int'], -'win32_start_service' => ['int', 'servicename'=>'string', 'machine='=>'string'], -'win32_start_service_ctrl_dispatcher' => ['mixed', 'name'=>'string'], -'win32_stop_service' => ['int', 'servicename'=>'string', 'machine='=>'string'], -'wincache_fcache_fileinfo' => ['array', 'summaryonly='=>'bool'], -'wincache_fcache_meminfo' => ['array'], -'wincache_lock' => ['bool', 'key'=>'string', 'isglobal='=>'bool'], -'wincache_ocache_fileinfo' => ['array', 'summaryonly='=>'bool'], -'wincache_ocache_meminfo' => ['array'], -'wincache_refresh_if_changed' => ['bool', 'files='=>'array'], -'wincache_rplist_fileinfo' => ['array', 'summaryonly='=>'bool'], -'wincache_rplist_meminfo' => ['array'], -'wincache_scache_info' => ['array', 'summaryonly='=>'bool'], -'wincache_scache_meminfo' => ['array'], -'wincache_ucache_add' => ['bool', 'key'=>'string', 'value'=>'', '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' => ['mixed', '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' => ['mixed', 'key'=>'string', 'inc_by='=>'int', 'success='=>'bool'], -'wincache_ucache_info' => ['array', 'summaryonly='=>'bool', 'key='=>'string'], -'wincache_ucache_meminfo' => ['array'], -'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', 'str'=>'string', 'width='=>'int', 'break='=>'string', 'cut='=>'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|false'], -'xcache_coverager_start' => ['void', 'clean='=>'bool|true'], -'xcache_coverager_stop' => ['void', 'clean='=>'bool|false'], -'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|false'], -'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'], -'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|true'], -'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', 'str'=>'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', 'str'=>'string', 'patch'=>'string', 'flags='=>'int', 'error='=>'string'], -'xdiff_string_patch_binary' => ['string', 'str'=>'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'], -'xml_error_string' => ['string', 'code'=>'int'], -'xml_get_current_byte_index' => ['int', 'parser'=>'resource'], -'xml_get_current_column_number' => ['int', 'parser'=>'resource'], -'xml_get_current_line_number' => ['int', 'parser'=>'resource'], -'xml_get_error_code' => ['int', 'parser'=>'resource'], -'xml_parse' => ['int', 'parser'=>'resource', 'data'=>'string', 'isfinal='=>'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', 'sep='=>'string'], -'xml_parser_free' => ['bool', 'parser'=>'resource'], -'xml_parser_get_option' => ['mixed', 'parser'=>'resource', 'option'=>'int'], -'xml_parser_set_option' => ['bool', 'parser'=>'resource', 'option'=>'int', 'value'=>'mixed'], -'xml_set_character_data_handler' => ['bool', 'parser'=>'resource', 'hdl'=>'callable'], -'xml_set_default_handler' => ['bool', 'parser'=>'resource', 'hdl'=>'callable'], -'xml_set_element_handler' => ['bool', 'parser'=>'resource', 'shdl'=>'callable', 'ehdl'=>'callable'], -'xml_set_end_namespace_decl_handler' => ['bool', 'parser'=>'resource', 'hdl'=>'callable'], -'xml_set_external_entity_ref_handler' => ['bool', 'parser'=>'resource', 'hdl'=>'callable'], -'xml_set_notation_decl_handler' => ['bool', 'parser'=>'resource', 'hdl'=>'callable'], -'xml_set_object' => ['bool', 'parser'=>'resource', 'obj'=>'object'], -'xml_set_processing_instruction_handler' => ['bool', 'parser'=>'resource', 'hdl'=>'callable'], -'xml_set_start_namespace_decl_handler' => ['bool', 'parser'=>'resource', 'hdl'=>'callable'], -'xml_set_unparsed_entity_decl_handler' => ['bool', 'parser'=>'resource', 'hdl'=>'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', 'basenode='=>'DOMNode'], -'XMLReader::getAttribute' => ['string|null', 'name'=>'string'], -'XMLReader::getAttributeNo' => ['string|null', 'index'=>'int'], -'XMLReader::getAttributeNs' => ['string|null', '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' => ['?array', '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='=>''], -'XMLWriter::endDTDAttlist' => ['bool'], -'XMLWriter::endDTDElement' => ['bool'], -'XMLWriter::endDTDEntity' => ['bool'], -'XMLWriter::endElement' => ['bool'], -'XMLWriter::endPI' => ['bool'], -'XMLWriter::flush' => ['', 'empty='=>'bool', 'xmlwriter='=>''], -'XMLWriter::fullEndElement' => ['bool'], -'XMLWriter::openMemory' => ['resource'], -'XMLWriter::openURI' => ['resource', 'uri'=>'string'], -'XMLWriter::outputMemory' => ['string', 'flush='=>'bool', 'xmlwriter='=>''], -'XMLWriter::setIndent' => ['bool', 'indent'=>'bool'], -'XMLWriter::setIndentString' => ['bool', 'indentstring'=>'string'], -'XMLWriter::startAttribute' => ['bool', 'name'=>'string'], -'XMLWriter::startAttributeNS' => ['bool', 'prefix'=>'string', 'name'=>'string', 'uri'=>'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', 'uri'=>'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', 'uri'=>'string', 'content'=>'string'], -'XMLWriter::writeCData' => ['bool', 'content'=>'string'], -'XMLWriter::writeComment' => ['bool', 'content'=>'string'], -'XMLWriter::writeDTD' => ['bool', 'name'=>'string', 'publicid='=>'string', 'systemid='=>'string', 'subset='=>'string'], -'XMLWriter::writeDTDAttlist' => ['bool', 'name'=>'string', 'content'=>'string'], -'XMLWriter::writeDTDElement' => ['bool', 'name'=>'string', 'content'=>'string'], -'XMLWriter::writeDTDEntity' => ['bool', 'name'=>'string', 'content'=>'string', 'pe'=>'bool', 'pubid'=>'string', 'sysid'=>'string', 'ndataid'=>'string'], -'XMLWriter::writeElement' => ['bool', 'name'=>'string', 'content='=>'?string'], -'XMLWriter::writeElementNS' => ['bool', 'prefix'=>'string', 'name'=>'string', 'uri'=>'string', 'content='=>'?string'], -'XMLWriter::writePI' => ['bool', 'target'=>'string', 'content'=>'string'], -'XMLWriter::writeRaw' => ['bool', 'content'=>'string'], -'xmlwriter_end_attribute' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_end_cdata' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_end_comment' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_end_document' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_end_dtd' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_end_dtd_attlist' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_end_dtd_element' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_end_dtd_entity' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_end_element' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_end_pi' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_flush' => ['', 'xmlwriter'=>'resource', 'empty='=>'bool'], -'xmlwriter_full_end_element' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_open_memory' => ['resource'], -'xmlwriter_open_uri' => ['resource', 'source'=>'string'], -'xmlwriter_output_memory' => ['string', 'xmlwriter'=>'resource', 'flush='=>'bool'], -'xmlwriter_set_indent' => ['bool', 'xmlwriter'=>'resource', 'indent'=>'bool'], -'xmlwriter_set_indent_string' => ['bool', 'xmlwriter'=>'resource', 'indentstring'=>'string'], -'xmlwriter_start_attribute' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string'], -'xmlwriter_start_attribute_ns' => ['bool', 'xmlwriter'=>'resource', 'prefix'=>'string', 'name'=>'string', 'uri'=>'string'], -'xmlwriter_start_cdata' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_start_comment' => ['bool', 'xmlwriter'=>'resource'], -'xmlwriter_start_document' => ['bool', 'xmlwriter'=>'resource', 'version='=>'string', 'encoding='=>'string', 'standalone='=>'string'], -'xmlwriter_start_dtd' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string', 'pubid='=>'string', 'sysid='=>'string'], -'xmlwriter_start_dtd_attlist' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string'], -'xmlwriter_start_dtd_element' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string'], -'xmlwriter_start_dtd_entity' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string', 'isparam'=>'bool'], -'xmlwriter_start_element' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string'], -'xmlwriter_start_element_ns' => ['bool', 'xmlwriter'=>'resource', 'prefix'=>'string', 'name'=>'string', 'uri'=>'string'], -'xmlwriter_start_pi' => ['bool', 'xmlwriter'=>'resource', 'target'=>'string'], -'xmlwriter_text' => ['bool', 'xmlwriter'=>'resource', 'content'=>'string'], -'xmlwriter_write_attribute' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string', 'content'=>'string'], -'xmlwriter_write_attribute_ns' => ['bool', 'xmlwriter'=>'resource', 'prefix'=>'string', 'name'=>'string', 'uri'=>'string', 'content'=>'string'], -'xmlwriter_write_cdata' => ['bool', 'xmlwriter'=>'resource', 'content'=>'string'], -'xmlwriter_write_comment' => ['bool', 'xmlwriter'=>'resource', 'content'=>'string'], -'xmlwriter_write_dtd' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string', 'pubid='=>'string', 'sysid='=>'string', 'subset='=>'string'], -'xmlwriter_write_dtd_attlist' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string', 'content'=>'string'], -'xmlwriter_write_dtd_element' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string', 'content'=>'string'], -'xmlwriter_write_dtd_entity' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string', 'content'=>'string', 'pe'=>'int', 'pubid'=>'string', 'sysid'=>'string', 'ndataid'=>'string'], -'xmlwriter_write_element' => ['bool', 'xmlwriter'=>'resource', 'name'=>'string', 'content'=>'string'], -'xmlwriter_write_element_ns' => ['bool', 'xmlwriter'=>'resource', 'prefix'=>'string', 'name'=>'string', 'uri'=>'string', 'content'=>'string'], -'xmlwriter_write_pi' => ['bool', 'xmlwriter'=>'resource', 'target'=>'string', 'content'=>'string'], -'xmlwriter_write_raw' => ['bool', 'xmlwriter'=>'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'=>'', 'obj'=>'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', 'namespaceuri'=>'string', 'localname'=>'string'], -'XsltProcessor::getSecurityPrefs' => ['int'], -'XSLTProcessor::hasExsltSupport' => ['bool'], -'XSLTProcessor::importStylesheet' => ['bool', 'stylesheet'=>'object'], -'XSLTProcessor::registerPHPFunctions' => ['void', 'restrict='=>'mixed'], -'XSLTProcessor::removeParameter' => ['bool', 'namespaceuri'=>'string', 'localname'=>'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', 'securityPrefs'=>'int'], -'XSLTProcessor::transformToDoc' => ['DOMDocument', 'doc'=>'DOMNode'], -'XSLTProcessor::transformToURI' => ['int', 'doc'=>'DOMDocument', 'uri'=>'string'], -'XSLTProcessor::transformToXML' => ['string', 'doc'=>'DOMDocument'], -'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|null'], -'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' => ['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' => ['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|false'], -'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|false'], -'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|false', '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|false', '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|bool', 'config'=>'Yaf\Config_Abstract'], -'Yaf\Router::addRoute' => ['Yaf\Router|bool', '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|bool', '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' => ['string[]'], -'Yaf\Session::__unset' => ['void', 'name'=>''], -'Yaf\Session::__wakeup' => ['void'], -'Yaf\Session::count' => ['int'], -'Yaf\Session::current' => ['mixed'], -'Yaf\Session::del' => ['Yaf\Session|bool', '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|bool', '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' => ['', '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::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' => ['string[]'], -'Yaf_Application::__wakeup' => ['void'], -'Yaf_Application::app' => ['void'], -'Yaf_Application::bootstrap' => ['void', 'bootstrap='=>'Yaf_Bootstrap_Abstract'], -'Yaf_Application::clearLastError' => ['Yaf_Application'], -'Yaf_Application::environ' => ['void'], -'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::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' => ['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'=>'call', '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' => ['string[]'], -'Yaf_Loader::__wakeup' => ['void'], -'Yaf_Loader::autoload' => ['void'], -'Yaf_Loader::clearLocalNamespace' => ['void'], -'Yaf_Loader::getInstance' => ['void'], -'Yaf_Loader::getLibraryPath' => ['Yaf_Loader', 'is_global='=>'bool'], -'Yaf_Loader::getLocalNamespace' => ['void'], -'Yaf_Loader::import' => ['void'], -'Yaf_Loader::isLocalName' => ['void'], -'Yaf_Loader::registerLocalNamespace' => ['void', 'prefix'=>'mixed'], -'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::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|false', '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_Abstract'], -'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' => ['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' => ['void'], -'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', 'input'=>'string', 'pos='=>'int', 'ndocs='=>'int', 'callbacks='=>'array'], -'yaml_parse_file' => ['mixed', 'filename'=>'string', 'pos='=>'int', 'ndocs='=>'int', 'callbacks='=>'array'], -'yaml_parse_url' => ['mixed', 'url'=>'string', 'pos='=>'int', 'ndocs='=>'int', 'callbacks='=>'array'], -'Yar_Client::__call' => ['void', 'method'=>'string', 'parameters'=>'array'], -'Yar_Client::__construct' => ['void', 'url'=>'string'], -'Yar_Client::setOpt' => ['bool', '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' => ['array'], -'Yar_Client_Exception::getTraceAsString' => ['string'], -'Yar_Client_Exception::getType' => ['void'], -'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', 'obj'=>'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' => ['array'], -'Yar_Server_Exception::getTraceAsString' => ['string'], -'Yar_Server_Exception::getType' => ['string'], -'yaz_addinfo' => ['string', 'id'=>'resource'], -'yaz_ccl_conf' => ['void', 'id'=>'resource', 'config'=>'array'], -'yaz_ccl_parse' => ['bool', 'id'=>'resource', 'query'=>'string', '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', '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'=>''], -'zend_disk_cache_fetch' => ['mixed|null', 'key'=>''], -'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'=>'license_file', 'override'=>'override'], -'zend_logo_guid' => ['string'], -'zend_obfuscate_class_name' => ['string', 'class_name'=>'class_name'], -'zend_obfuscate_function_name' => ['string', 'function_name'=>'function_name'], -'zend_optimizer_version' => ['string'], -'zend_runtime_obfuscate' => ['void'], -'zend_send_buffer' => ['bool', 'buffer'=>'buffer', 'mime_type'=>'mime_type', 'custom_headers'=>'custom_headers'], -'zend_send_file' => ['bool', 'filename'=>'filename', 'mime_type'=>'mime_type', 'custom_headers'=>'custom_headers'], -'zend_set_configuration_changed' => [''], -'zend_shm_cache_clear' => ['bool', 'namespace='=>'mixed|string'], -'zend_shm_cache_delete' => ['mixed|null', 'key'=>''], -'zend_shm_cache_fetch' => ['mixed|null', 'key'=>''], -'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|false'], -'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', 'zip_entry'=>'resource', 'len='=>'int'], -'zip_open' => ['resource', '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', 'flags='=>'int'], -'ZipArchive::getCommentIndex' => ['string', 'index'=>'int', 'flags='=>'int'], -'ZipArchive::getCommentName' => ['string', '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', 'len='=>'int', 'flags='=>'int'], -'ZipArchive::getFromName' => ['string|false', 'entryname'=>'string', 'len='=>'int', 'flags='=>'int'], -'ZipArchive::getNameIndex' => ['string', 'index'=>'int', 'flags='=>'int'], -'ZipArchive::getStatusString' => ['string'], -'ZipArchive::getStream' => ['resource', 'entryname'=>'string'], -'ZipArchive::locateName' => ['int', 'filename'=>'string', 'flags='=>'int'], -'ZipArchive::open' => ['mixed', 'source'=>'string', 'flags='=>'int'], -'ZipArchive::renameIndex' => ['bool', 'index'=>'int', 'new_name'=>'string'], -'ZipArchive::renameName' => ['bool', 'name'=>'string', 'new_name'=>'string'], -'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::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', 'data'=>'string', 'max_decoded_len='=>'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' => ['mixed', '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' => ['mixed', 'key'=>'string'], -'ZMQSocket::isPersistent' => ['bool'], -'ZMQSocket::recv' => ['string', 'mode='=>'int'], -'ZMQSocket::recvMulti' => ['array', '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/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php70_delta.php b/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php70_delta.php deleted file mode 100644 index ed55262..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php70_delta.php +++ /dev/null @@ -1,209 +0,0 @@ -<?php // phpcs:ignoreFile - -/** - * This contains the information needed to convert the function signatures for php 7.0 to php 5.6 (and vice versa) - * - * This has two sections. - * The 'new' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that do not exist in php7.0 or have different signatures in php 7.1. - * If they were just updated, the function/method will be present in the 'added' signatures. - * The 'old' signatures contains the signatures that are different in php 7.0. - * Functions are expected to be removed only in major releases of php. (e.g. php 7.0 removed various functions that were deprecated in 5.6) - * - * @see FunctionSignatureMap.php - * - * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file) - * - * TODO: Add some way to warn about functions such as intdiv or IntlChar if they aren't in the configured target_php_version - */ -return [ -'new' => [ - 'Closure::call' => ['', 'to'=>'object', '...parameters='=>''], - 'intdiv' => ['int', 'numerator'=>'int', 'divisor'=>'int'], - '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', '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', 'property'=>'int', 'namechoice='=>'int'], - 'IntlChar::getPropertyValueEnum' => ['int', 'property'=>'int', 'name'=>'string'], - 'IntlChar::getPropertyValueName' => ['string', 'prop'=>'int', 'val'=>'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'], - 'preg_replace_callback_array' => ['string|array', 'pattern'=>'array<string,callable(array):string>', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'], - 'random_bytes' => ['string', 'length'=>'int'], - 'random_int' => ['int', 'min'=>'int', 'max'=>'int'], - 'session_start' => ['bool'], - 'unserialize' => ['mixed', 'variable_representation'=>'string', 'allowed_classes='=>'array{allowed_classes?:string[]|bool}'], -], -'old' => [ - 'ereg' => ['int', 'pattern'=>'string', 'string'=>'string', 'regs='=>'array'], - 'ereg_replace' => ['string', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string'], - 'eregi' => ['int', 'pattern'=>'string', 'string'=>'string', 'regs='=>'array'], - 'eregi_replace' => ['string', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string'], - 'imagepsbbox' => ['array', 'text'=>'string', 'font'=>'', 'size'=>'int', 'space'=>'int', 'tightness'=>'int', 'angle'=>'float'], - 'imagepsencodefont' => ['bool', 'font_index'=>'resource', 'encodingfile'=>'string'], - 'imagepsextendfont' => ['bool', 'font_index'=>'resource', 'extend'=>'float'], - 'imagepsfreefont' => ['bool', 'font_index'=>'resource'], - 'imagepsloadfont' => ['resource', 'filename'=>'string'], - 'imagepsslantfont' => ['bool', 'font_index'=>'resource', 'slant'=>'float'], - 'imagepstext' => ['array', 'image'=>'resource', 'text'=>'string', 'font_index'=>'resource', 'size'=>'int', 'foreground'=>'int', 'background'=>'int', 'x'=>'int', 'y'=>'int', 'space='=>'int', 'tightness='=>'int', 'angle='=>'float', 'antialias_steps='=>'int'], - 'mssql_bind' => ['bool', 'stmt'=>'resource', 'param_name'=>'string', 'var'=>'mixed', 'type'=>'int', 'is_output='=>'bool', 'is_null='=>'bool', 'maxlen='=>'int'], - 'mssql_close' => ['bool', 'link_identifier='=>'resource'], - 'mssql_connect' => ['resource', 'servername='=>'string', 'username='=>'string', 'password='=>'string', 'new_link='=>'bool'], - 'mssql_data_seek' => ['bool', 'result_identifier'=>'resource', 'row_number'=>'int'], - 'mssql_execute' => ['mixed', 'stmt'=>'resource', 'skip_results='=>'bool'], - 'mssql_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], - 'mssql_fetch_assoc' => ['array', 'result_id'=>'resource'], - 'mssql_fetch_batch' => ['int', 'result'=>'resource'], - 'mssql_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], - 'mssql_fetch_object' => ['object', 'result'=>'resource'], - 'mssql_fetch_row' => ['array', 'result'=>'resource'], - 'mssql_field_length' => ['int', 'result'=>'resource', 'offset='=>'int'], - 'mssql_field_name' => ['string', 'result'=>'resource', 'offset='=>'int'], - 'mssql_field_seek' => ['bool', 'result'=>'resource', 'field_offset'=>'int'], - 'mssql_field_type' => ['string', 'result'=>'resource', 'offset='=>'int'], - 'mssql_free_result' => ['bool', 'result'=>'resource'], - 'mssql_free_statement' => ['bool', 'stmt'=>'resource'], - 'mssql_get_last_message' => ['string'], - 'mssql_guid_string' => ['string', 'binary'=>'string', 'short_format='=>'bool'], - 'mssql_init' => ['resource', 'sp_name'=>'string', 'link_identifier='=>'resource'], - 'mssql_min_error_severity' => ['void', 'severity'=>'int'], - 'mssql_min_message_severity' => ['void', 'severity'=>'int'], - 'mssql_next_result' => ['bool', 'result_id'=>'resource'], - 'mssql_num_fields' => ['int', 'result'=>'resource'], - 'mssql_num_rows' => ['int', 'result'=>'resource'], - 'mssql_pconnect' => ['resource', 'servername='=>'string', 'username='=>'string', 'password='=>'string', 'new_link='=>'bool'], - 'mssql_query' => ['mixed', 'query'=>'string', 'link_identifier='=>'resource', 'batch_size='=>'int'], - 'mssql_result' => ['string', 'result'=>'resource', 'row'=>'int', 'field'=>'mixed'], - 'mssql_rows_affected' => ['int', 'link_identifier'=>'resource'], - 'mssql_select_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'resource'], - 'mysql_affected_rows' => ['int', 'link_identifier='=>'resource'], - 'mysql_client_encoding' => ['string', 'link_identifier='=>'resource'], - 'mysql_close' => ['bool', 'link_identifier='=>'resource'], - 'mysql_connect' => ['resource', 'server='=>'string', 'username='=>'string', 'password='=>'string', 'new_link='=>'bool', 'client_flags='=>'int'], - 'mysql_create_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'resource'], - 'mysql_data_seek' => ['bool', 'result'=>'resource', 'row_number'=>'int'], - 'mysql_db_name' => ['string', 'result'=>'resource', 'row'=>'int', 'field='=>'mixed'], - 'mysql_db_query' => ['resource', 'database'=>'string', 'query'=>'string', 'link_identifier='=>'resource'], - 'mysql_drop_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'resource'], - 'mysql_errno' => ['int', 'link_identifier='=>'resource'], - 'mysql_error' => ['string', 'link_identifier='=>'resource'], - 'mysql_escape_string' => ['string', 'unescaped_string'=>'string'], - 'mysql_fetch_array' => ['array', 'result'=>'resource', 'result_type='=>'int'], - 'mysql_fetch_assoc' => ['array', 'result'=>'resource'], - 'mysql_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], - 'mysql_fetch_lengths' => ['array', 'result'=>'resource'], - 'mysql_fetch_object' => ['object', 'result'=>'resource', 'class_name='=>'string', 'params='=>'array'], - 'mysql_fetch_row' => ['array', 'result'=>'resource'], - 'mysql_field_flags' => ['string', 'result'=>'resource', 'field_offset'=>'int'], - 'mysql_field_len' => ['int', 'result'=>'resource', 'field_offset'=>'int'], - 'mysql_field_name' => ['string', 'result'=>'resource', 'field_offset'=>'int'], - 'mysql_field_seek' => ['bool', 'result'=>'resource', 'field_offset'=>'int'], - 'mysql_field_table' => ['string', 'result'=>'resource', 'field_offset'=>'int'], - 'mysql_field_type' => ['string', 'result'=>'resource', 'field_offset'=>'int'], - 'mysql_free_result' => ['bool', 'result'=>'resource'], - 'mysql_get_client_info' => ['string'], - 'mysql_get_host_info' => ['string', 'link_identifier='=>'resource'], - 'mysql_get_proto_info' => ['int', 'link_identifier='=>'resource'], - 'mysql_get_server_info' => ['string', 'link_identifier='=>'resource'], - 'mysql_info' => ['string', 'link_identifier='=>'resource'], - 'mysql_insert_id' => ['int', 'link_identifier='=>'resource'], - 'mysql_list_dbs' => ['resource', 'link_identifier='=>'resource'], - 'mysql_list_fields' => ['resource', 'database_name'=>'string', 'table_name'=>'string', 'link_identifier='=>'resource'], - 'mysql_list_processes' => ['resource', 'link_identifier='=>'resource'], - 'mysql_list_tables' => ['resource', 'database'=>'string', 'link_identifier='=>'resource'], - 'mysql_num_fields' => ['int', 'result'=>'resource'], - 'mysql_num_rows' => ['int', 'result'=>'resource'], - 'mysql_pconnect' => ['resource', 'server='=>'string', 'username='=>'string', 'password='=>'string', 'client_flags='=>'int'], - 'mysql_ping' => ['bool', 'link_identifier='=>'resource'], - 'mysql_query' => ['resource', 'query'=>'string', 'link_identifier='=>'resource'], - 'mysql_real_escape_string' => ['string', 'unescaped_string'=>'string', 'link_identifier='=>'resource'], - 'mysql_result' => ['string', 'result'=>'resource', 'row'=>'int', 'field='=>'mixed'], - 'mysql_select_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'resource'], - 'mysql_set_charset' => ['bool', 'charset'=>'string', 'link_identifier='=>'resource'], - 'mysql_stat' => ['string', 'link_identifier='=>'resource'], - 'mysql_tablename' => ['string', 'result'=>'resource', 'i'=>'int'], - 'mysql_thread_id' => ['int', 'link_identifier='=>'resource'], - 'mysql_unbuffered_query' => ['resource', 'query'=>'string', 'link_identifier='=>'resource'], - 'session_start' => ['bool', 'options='=>'array'], - 'split' => ['array<int,string>', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'], - 'spliti' => ['array<int,string>', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'], - 'sql_regcase' => ['string', 'string'=>'string'], - 'sybase_affected_rows' => ['int', 'link_identifier='=>'resource'], - 'sybase_close' => ['bool', 'link_identifier='=>'resource'], - 'sybase_connect' => ['resource', 'servername='=>'string', 'username='=>'string', 'password='=>'string', 'charset='=>'string', 'appname='=>'string', 'new='=>'bool'], - 'sybase_data_seek' => ['bool', 'result_identifier'=>'resource', 'row_number'=>'int'], - 'sybase_deadlock_retry_count' => ['void', 'retry_count'=>'int'], - 'sybase_fetch_array' => ['array', 'result'=>'resource'], - 'sybase_fetch_assoc' => ['array', 'result'=>'resource'], - 'sybase_fetch_field' => ['object', 'result'=>'resource', 'field_offset='=>'int'], - 'sybase_fetch_object' => ['object', 'result'=>'resource', 'object='=>'mixed'], - 'sybase_fetch_row' => ['array', 'result'=>'resource'], - 'sybase_field_seek' => ['bool', 'result'=>'resource', 'field_offset'=>'int'], - 'sybase_free_result' => ['bool', 'result'=>'resource'], - 'sybase_get_last_message' => ['string'], - 'sybase_min_client_severity' => ['void', 'severity'=>'int'], - 'sybase_min_error_severity' => ['void', 'severity'=>'int'], - 'sybase_min_message_severity' => ['void', 'severity'=>'int'], - 'sybase_min_server_severity' => ['void', 'severity'=>'int'], - 'sybase_num_fields' => ['int', 'result'=>'resource'], - 'sybase_num_rows' => ['int', 'result'=>'resource'], - 'sybase_pconnect' => ['resource', 'servername='=>'string', 'username='=>'string', 'password='=>'string', 'charset='=>'string', 'appname='=>'string'], - 'sybase_query' => ['mixed', 'query'=>'string', 'link_identifier='=>'resource'], - 'sybase_result' => ['string', 'result'=>'resource', 'row'=>'int', 'field'=>'mixed'], - 'sybase_select_db' => ['bool', 'database_name'=>'string', 'link_identifier='=>'resource'], - 'sybase_set_message_handler' => ['bool', 'handler'=>'callable', 'connection='=>'resource'], - 'sybase_unbuffered_query' => ['resource', 'query'=>'string', 'link_identifier'=>'resource', 'store_result='=>'bool'], - 'unserialize' => ['mixed', 'variable_representation'=>'string'], -] -]; diff --git a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php71_delta.php b/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php71_delta.php deleted file mode 100644 index fd94d3c..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php71_delta.php +++ /dev/null @@ -1,51 +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 has two sections. - * The 'new' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that do not exist in php7.0 or have different signatures in php 7.1. - * If they were just updated, the function/method will be present in the 'added' signatures. - * The 'old' signatures contains the signatures that are different in php 7.0. - * Functions are expected to be removed only in major releases of php. (e.g. php 7.0 removed various functions that were deprecated in 5.6) - * - * @see FunctionSignatureMap.php - * - * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file) - */ -return [ -'new' => [ - 'Closure::fromCallable' => ['Closure', 'callable'=>'callable'], - 'SQLite3::createFunction' => ['bool', 'name'=>'string', 'callback'=>'callable', 'argument_count='=>'int', 'flags='=>'int'], - 'curl_multi_errno' => ['int', 'mh'=>'resource'], - 'curl_share_errno' => ['int', 'sh'=>'resource'], - 'curl_share_strerror' => ['string', 'code'=>'int'], - 'get_headers' => ['array|false', 'url'=>'string', 'format='=>'int', 'context='=>'resource'], - 'getenv\'1' => ['array<string,string>'], - 'getopt' => ['array<string,string>|array<string,false>|array<string,array<int,string|false>>', 'options'=>'string', 'longopts='=>'array', '&w_optind='=>'int'], - 'hash_hkdf' => ['string', 'algo'=>'string', 'ikm'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'], - 'is_iterable' => ['bool', 'var'=>'mixed'], - 'openssl_get_curve_names' => ['array<int,string>'], - 'pcntl_async_signals' => ['bool', 'on='=>'bool'], - 'pcntl_signal_get_handler' => ['int|string', 'signo'=>'int'], - 'pg_fetch_all' => ['array', 'result'=>'resource', 'result_type='=>'int'], - 'pg_last_error' => ['string', 'connection='=>'resource', 'operation='=>'int'], - 'pg_select' => ['mixed', 'db'=>'resource', 'table'=>'string', 'ids'=>'array', 'options='=>'int', 'result_type='=>'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', 'code_page'=>'int'], - 'session_create_id' => ['string', 'prefix='=>'string'], - 'session_gc' => ['int'], - 'unpack' => ['array', 'format'=>'string', 'data'=>'string', 'offset='=>'int'], -], -'old' => [ - 'SQLite3::createFunction' => ['bool', 'name'=>'string', 'callback'=>'callable', 'argument_count='=>'int'], - 'get_headers' => ['array|false', 'url'=>'string', 'format='=>'int'], - 'getopt' => ['array<string,string>|array<string,false>|array<string,array<int,string|false>>', 'options'=>'string', 'longopts='=>'array'], - 'pg_fetch_all' => ['array', 'result'=>'resource'], - 'pg_last_error' => ['string', 'connection='=>'resource'], - 'pg_select' => ['mixed', 'db'=>'resource', 'table'=>'string', 'ids'=>'array', 'options='=>'int'], - 'unpack' => ['array', 'format'=>'string', 'data'=>'string'], -], -]; diff --git a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php72_delta.php b/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php72_delta.php deleted file mode 100644 index c573b41..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php72_delta.php +++ /dev/null @@ -1,151 +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 has two sections. - * The 'new' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that do not exist in php7.1 or have different signatures in php 7.2. - * If they were just updated, the function/method will be present in the 'added' signatures. - * The 'old' signatures contains the signatures that are different in php 7.1. - * Functions are expected to be removed only in major releases of php. (e.g. php 7.0 removed various functions that were deprecated in 5.6) - * - * @see FunctionSignatureMap.php - * - * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file) - */ -return [ -'new' => [ - 'DOMNodeList::count' => ['int'], - 'ftp_append' => ['bool', 'ftp'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'int'], - 'hash_copy' => ['HashContext', 'context'=>'HashContext'], - 'hash_final' => ['string', 'context'=>'HashContext', 'raw_output='=>'bool'], - 'hash_hmac_algos' => ['array<int,string>'], - 'hash_init' => ['HashContext', 'algo'=>'string', 'options='=>'int', 'key='=>'string'], - 'hash_update' => ['bool', 'context'=>'HashContext', 'data'=>'string'], - 'hash_update_file' => ['bool', 'context='=>'HashContext', 'filename'=>'string', 'scontext='=>'?HashContext'], - 'hash_update_stream' => ['int', 'context'=>'HashContext', 'handle'=>'', 'length='=>'int'], - 'imagebmp' => ['bool', 'image'=>'resource', 'to='=>'mixed', 'compressed='=>'bool'], - 'imagecreatefrombmp' => ['resource', 'filename'=>'string'], - 'imageopenpolygon' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points'=>'int', 'color'=>'int'], - 'imageresolution' => ['mixed', 'image'=>'resource', 'res_x='=>'int', 'res_y='=>'int'], - 'imagesetclip' => ['bool', 'im'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int'], - 'ldap_exop' => ['mixed', 'link'=>'resource', 'reqoid'=>'string', 'reqdata='=>'string', 'servercontrols='=>'array', 'retdata='=>'string', 'retoid='=>'string'], - 'ldap_exop_passwd' => ['mixed', 'link'=>'resource', 'user='=>'string', 'oldpw='=>'string', 'newpw='=>'string', 'serverctrls='=>'array'], - 'ldap_exop_refresh' => ['int', 'link'=>'resource', 'dn'=>'string', 'ttl'=>'int'], - 'ldap_exop_whoami' => ['string', 'link'=>'resource'], - 'ldap_parse_exop' => ['bool', 'link'=>'resource', 'result'=>'resource', 'retdata='=>'string', 'retoid='=>'string'], - 'mb_chr' => ['string', 'cp'=>'int', 'encoding='=>'string'], - 'mb_ord' => ['int', 'str'=>'string', 'enc='=>'string'], - 'mb_scrub' => ['string', 'str'=>'string', 'enc='=>'string'], - 'oci_register_taf_callback' => ['bool', 'connection'=>'resource', 'callback='=>'callable'], - 'oci_set_call_timeout' => ['bool', 'connection'=>'resource', 'time_out'=>'int'], - 'oci_unregister_taf_callback' => ['bool', 'connection'=>'resource'], - 'ReflectionClass::isIterable' => ['bool'], - 'SQLite3::openBlob' => ['resource', 'table'=>'string', 'column'=>'string', 'rowid'=>'int', 'dbname'=>'string', 'flags='=>'int'], - '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' => ['string', 'string_1'=>'string', 'string_2'=>'string'], - 'sodium_base642bin' => ['string', 'base64'=>'string', 'variant'=>'int', 'ignore'=>'string'], - 'sodium_bin2base64' => ['string', 'binary'=>'string', 'variant'=>'int'], - 'sodium_bin2hex' => ['string', 'binary'=>'string'], - 'sodium_compare' => ['int', 'string_1'=>'string', 'string_2'=>'string'], - 'sodium_crypto_aead_aes256gcm_decrypt' => ['string|false', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_aes256gcm_encrypt' => ['string', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_aes256gcm_is_available' => ['bool'], - 'sodium_crypto_aead_aes256gcm_keygen' => ['string'], - 'sodium_crypto_aead_chacha20poly1305_decrypt' => ['string', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_chacha20poly1305_encrypt' => ['string', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => ['string|false', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => ['string', 'confidential_message'=>'string', 'public_message'=>'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', 'confidential_message'=>'string', 'public_message'=>'string', 'nonce'=>'string', 'key'=>'string'], - 'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => ['string', 'confidential_message'=>'string', 'public_message'=>'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', 'string'=>'string', 'nonce'=>'string', 'key'=>'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', 'message'=>'string', 'nonce'=>'string', 'message_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|false', 'message'=>'string', 'recipient_keypair'=>'string'], - 'sodium_crypto_box_secretkey' => ['string', 'keypair'=>'string'], - 'sodium_crypto_box_seed_keypair' => ['string', 'seed'=>'string'], - 'sodium_crypto_generichash' => ['string', 'msg'=>'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', 'state'=>'string', 'string'=>'string'], - 'sodium_crypto_kdf_derive_from_key' => ['string', 'subkey_len'=>'int', 'subkey_id'=>'int', 'context'=>'string', 'key'=>'string'], - 'sodium_crypto_kdf_keygen' => ['string'], - 'sodium_crypto_kx_client_session_keys' => ['string', 'client_keypair'=>'string', 'server_key'=>'string'], - 'sodium_crypto_kx_keypair' => ['string'], - 'sodium_crypto_kx_publickey' => ['string', 'keypair'=>'string'], - 'sodium_crypto_kx_secretkey' => ['string', 'keypair'=>'string'], - 'sodium_crypto_kx_seed_keypair' => ['string', 'seed'=>'string'], - 'sodium_crypto_kx_server_session_keys' => ['string', 'server_keypair'=>'string', 'client_key'=>'string'], - 'sodium_crypto_pwhash' => ['string', 'length'=>'int', 'password'=>'string', 'salt'=>'string', 'opslimit'=>'int', 'memlimit'=>'int', 'alg='=>'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', 'string_1'=>'string', 'string_2'=>'string'], - 'sodium_crypto_scalarmult_base' => ['string', 'string_1'=>'string', 'string_2'=>'string'], - 'sodium_crypto_secretbox' => ['string', 'plaintext'=>'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', 'state'=>'string', 'c'=>'string', 'ad='=>'string'], - 'sodium_crypto_secretstream_xchacha20poly1305_push' => ['string', 'state'=>'string', 'msg'=>'string', 'ad='=>'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', 'secretkey'=>'string'], - 'sodium_crypto_sign_detached' => ['string', 'message'=>'string', 'secretkey'=>'string'], - 'sodium_crypto_sign_ed25519_pk_to_curve25519' => ['string', 'ed25519pk'=>'string'], - 'sodium_crypto_sign_ed25519_sk_to_curve25519' => ['string', 'ed25519sk'=>'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', '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', 'message'=>'string', 'publickey'=>'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', 'hex'=>'string', 'ignore='=>'string'], - 'sodium_increment' => ['string', '&binary_string'=>'string'], - 'sodium_memcmp' => ['int', 'string_1'=>'string', 'string_2'=>'string'], - 'sodium_memzero' => ['void', '&secret'=>'string'], - 'sodium_pad' => ['string', 'unpadded'=>'string', 'length'=>'int'], - 'sodium_unpad' => ['string', 'padded'=>'string', 'length'=>'int'], - 'stream_isatty' => ['bool', 'stream'=>'resource'], - 'ZipArchive::count' => ['int'], - 'ZipArchive::setEncryptionIndex' => ['bool', 'index'=>'int', 'method'=>'string', 'password='=>'string'], - 'ZipArchive::setEncryptionName' => ['bool', 'name'=>'string', 'method'=>'int', 'password='=>'string'], -], -'old' => [ - 'hash_copy' => ['resource', 'context'=>'resource'], - 'hash_final' => ['string', 'context'=>'resource', 'raw_output='=>'bool'], - 'hash_hkdf' => ['string', 'algo'=>'string', 'ikm'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'], - 'hash_init' => ['resource', 'algo'=>'string', 'options='=>'int', 'key='=>'string'], - 'hash_pbkdf2' => ['string', 'algo'=>'string', 'password'=>'string', 'salt'=>'string', 'iterations'=>'int', 'length='=>'int', 'raw_output='=>'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'], - 'SQLite3::openBlob' => ['resource', 'table'=>'string', 'column'=>'string', 'rowid'=>'int', 'dbname'=>'string'], -] -]; diff --git a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php73_delta.php b/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php73_delta.php deleted file mode 100644 index 13dade8..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php73_delta.php +++ /dev/null @@ -1,59 +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 has two sections. - * The 'new' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that do not exist in php7.2 or have different signatures in php 7.3. - * If they were just updated, the function/method will be present in the 'added' signatures. - * The 'old' signatures contains the signatures that are different in php 7.2. - * Functions are expected to be removed only in major releases of php. (e.g. php 7.0 removed various functions that were deprecated in 5.6) - * - * @see FunctionSignatureMap.php - * - * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file) - * - * TODO: Fix GMP signatures for gmp_div in 7.2, update other deltas. - */ -return [ -'new' => [ - 'array_key_first' => ['int|string|null', 'array'=>'array'], - 'array_key_last' => ['int|string|null', 'array'=>'array'], - 'DateTime::createFromImmutable' => ['static', 'datetime'=>'DateTimeImmutable'], - 'fpm_get_status' => ['array'], - 'gmp_binomial' => ['GMP', 'n'=>'GMP|string|int', 'k'=>'GMP|string|int'], - 'gmp_lcm' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], - 'gmp_perfect_power' => ['GMP', 'a'=>'GMP|string|int'], - 'gmp_kronecker' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'], - 'gc_status' => ['array{runs:int,collected:int,threshold:int,roots:int}'], - 'hrtime' => ['array{0:int,1:int}|int|false', 'get_as_num='=>'bool'], - 'is_countable' => ['bool', 'var'=>'mixed'], - 'JsonException::__clone' => [''], - 'JsonException::__construct' => [''], - 'JsonException::getCode' => [''], - 'JsonException::getFile' => [''], - 'JsonException::getLine' => [''], - 'JsonException::getMessage' => [''], - 'JsonException::getPrevious' => [''], - 'JsonException::getTrace' => [''], - 'JsonException::getTraceAsString' => [''], - 'JsonException::__toString' => [''], - 'JsonException::__wakeup' => [''], - 'ldap_add_ext' => ['resource', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'serverctrls='=>'array'], - 'ldap_bind_ext' => ['resource', 'link_identifier'=>'resource', 'bind_rdn='=>'string', 'bind_password='=>'string'], - 'ldap_mod_add_ext' => ['resource', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'serverctrls='=>'array'], - 'ldap_mod_del_ext' => ['resource', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'serverctrls='=>'array'], - 'ldap_mod_replace_ext' => ['resource', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'serverctrls='=>'array'], - 'ldap_rename_ext' => ['resource', 'link_identifier'=>'resource', 'dn'=>'string', 'newrdn'=>'string', 'newparent'=>'string', 'deleteoldrdn'=>'bool', 'serverctrls='=>'array'], - 'net_get_interfaces' => ['array<string,array<string,mixed>>|false'], - 'oci_set_call_timeout' => ['bool', 'connection'=>'resource', 'time_out'=>'int'], - 'openssl_pkey_derive' => ['string', 'peer_pub_key'=>'mixed', 'priv_key'=>'mixed', 'keylen='=>'?int'], - 'session_set_cookie_params\'1' => ['bool', 'options'=>'array{lifetime?:int,path?:string,domain?:?string,secure?:bool,httponly?:bool}'], - 'socket_wsaprotocol_info_export' => ['string|false', 'sock='=>'resource','pid'=>'int'], - 'socket_wsaprotocol_info_import' => ['resource|false', 'id'=>'string'], - 'socket_wsaprotocol_info_release' => ['bool', 'id'=>'string'], - 'SplPriorityQueue::isCorrupted' => ['bool'], -], -'old' => [ -] -]; diff --git a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php74_delta.php b/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php74_delta.php deleted file mode 100644 index a4ab16f..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php74_delta.php +++ /dev/null @@ -1,40 +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 has two sections. - * The 'new' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that do not exist in php7.3 or have different signatures in php 7.4. - * If they were just updated, the function/method will be present in the 'added' signatures. - * The 'old' signatures contains the signatures that are different in php 7.3. - * Functions are expected to be removed only in major releases of php. - * - * @see FunctionSignatureMap.php - * - * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file) - */ -return [ -'new' => [ -'FFI::addr' => ['FFI\CData', '&ptr'=>'FFI\CData'], -'FFI::alignof' => ['int', '&ptr'=>'mixed'], -'FFI::arrayType' => ['FFI\CType', 'type'=>'string|FFI\CType', 'dims'=>'array<int,int>'], -'FFI::cast' => ['FFI\CData', 'type'=>'string|FFI\CType', '&ptr'=>''], -'FFI::cdef' => ['FFI', 'code='=>'string', 'lib='=>'?string'], -'FFI::free' => ['void', '&ptr'=>'FFI\CData'], -'FFI::load' => ['FFI', 'filename'=>'string'], -'FFI::memcmp' => ['int', '&ptr1'=>'FFI\CData|string', '&ptr2'=>'FFI\CData|string', 'size'=>'int'], -'FFI::memcpy' => ['void', '&dst'=>'FFI\CData', '&src'=>'string|FFI\CData', 'size'=>'int'], -'FFI::memset' => ['void', '&ptr'=>'FFI\CData', 'ch'=>'int', 'size'=>'int'], -'FFI::new' => ['FFI\CData', 'type'=>'string|FFI\CType', 'owned='=>'bool', 'persistent='=>'bool'], -'FFI::scope' => ['FFI', 'scope_name'=>'string'], -'FFI::sizeof' => ['int', '&ptr'=>'FFI\CData|FFI\CType'], -'FFI::string' => ['string', '&ptr'=>'FFI\CData', 'size='=>'int'], -'FFI::typeof' => ['FFI\CType', '&ptr'=>'FFI\CData'], -'FFI::type' => ['FFI\CType', 'type'=>'string'], -'ReflectionReference::fromArrayElement' => ['?ReflectionReference', 'array'=>'array', 'key'=>'int|string'], -'ReflectionReference::getId' => ['string'], -'SQLite3Stmt::getSQL' => ['string', 'expanded='=>'bool'], -], -'old' => [ -] -]; diff --git a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php80_delta.php b/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php80_delta.php deleted file mode 100644 index ec578bb..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/FunctionSignatureMap_php80_delta.php +++ /dev/null @@ -1,24 +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 has two sections. - * The 'new' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that do not exist in php7.3 or have different signatures in php 7.4. - * If they were just updated, the function/method will be present in the 'added' signatures. - * The 'old' signatures contains the signatures that are different in php 7.3. - * Functions are expected to be removed only in major releases of php. - * - * TODO: Add remaining functions - * - * @see FunctionSignatureMap.php - * - * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file) - */ -return [ -'new' => [ -], -'old' => [ -'create_function' => ['string', 'args'=>'string', 'code'=>'string'], -] -]; diff --git a/vendor/phan/phan/src/Phan/Language/Internal/PropertyDocumentationMap.php b/vendor/phan/phan/src/Phan/Language/Internal/PropertyDocumentationMap.php deleted file mode 100644 index 85b78d7..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/PropertyDocumentationMap.php +++ /dev/null @@ -1,573 +0,0 @@ -<?php // phpcs:ignoreFile -namespace Phan\Language\Internal; - -/** - * This contains descriptions used by Phan for hover text of internal properties in the language server mode. - * - * Format - * - * '<property_name>' => 'documentation', - * - * NOTE: This format may change and should not be used directly. - * - * Sources of function/method summary info: - * - * 1. 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 - * 2. Various websites documenting individual extensions (e.g. php-ast) - * 3. 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) - * - * - * CONTRIBUTING: - * - * Running `internal/internalstubs.php` can be used to update signature maps - * - * There are no plans for these signatures to diverge from what the above upstream sources contain. - * - * - If the descriptions cause Phan to crash, bug reports are welcome - * - If Phan improperly extracted text from a summary (and this affects multiple signatures), patches fixing the extraction will be accepted. - * - Otherwise, fixes for typos/grammar/inaccuracies in the summary will only be accepted once they are contributed upstream and can be regenerated (e.g. to the svn repo for docs.php.net). - * - * Note that the summaries are used in a wide variety of contexts, and what makes sense for Phan may not make sense for those projects, and vice versa. - */ -return [ -'ast\Metadata::flags' => 'Array of supported flags. The flags are given as names of constants, such as "ast\flags\TYPE_STRING".', -'ast\Metadata::flagsCombinable' => 'Whether the flags are exclusive or combinable. Exclusive flags should be checked using ===, while combinable flags should be checked using &.', -'ast\Metadata::kind' => 'AST node kind (one of the `ast\AST_*` constants).', -'ast\Metadata::name' => 'Name of the node kind (e.g. "AST_NAME").', -'ast\Node::children' => 'Child nodes (may be empty)', -'ast\Node::flags' => 'Certain node kinds have flags that can be set. These will be a bitfield of `ast\flags\*` constants.', -'ast\Node::kind' => 'AST Node Kind. Values are one of `ast\AST_*` constants.', -'ast\Node::lineno' => 'Line the node starts in', -'classObj::label' => 'Removed (6.2) - use addLabel, getLabel, ...', -'classObj::numlabels' => 'read-only (since 6.2)', -'classObj::numstyles' => 'read-only', -'classObj::status' => 'MS_ON, MS_OFF or MS_DELETE', -'Couchbase\Document::cas' => 'The last known CAS value of the document', -'Couchbase\Document::error' => 'exception object in case of error, or NULL', -'Couchbase\Document::flags' => 'Flags, describing the encoding of the document on the server side.', -'Couchbase\Document::token' => 'The optional, opaque mutation token set after a successful mutation. - -Note that the mutation token is always NULL, unless they are explicitly enabled on the -connection string (`?fetch_mutation_tokens=true`), the server version is supported (>= 4.0.0) -and the mutation operation succeeded. - -If set, it can be used for enhanced durability requirements, as well as optimized consistency -for N1QL queries.', -'Couchbase\Document::value' => 'The value stored in the Couchbase.', -'Couchbase\DocumentFragment::cas' => 'The last known CAS value of the document', -'Couchbase\DocumentFragment::error' => 'exception object in case of error, or NULL', -'Couchbase\DocumentFragment::token' => 'The optional, opaque mutation token related to updated document the environment. - -Note that the mutation token is always NULL, unless they are explicitly enabled on the -connection string (`?fetch_mutation_tokens=true`), the server version is supported (>= 4.0.0) -and the mutation operation succeeded. - -If set, it can be used for enhanced durability requirements, as well as optimized consistency -for N1QL queries.', -'Couchbase\DocumentFragment::value' => 'The value sub-document command returned.', -'Couchbase\N1qlIndex::condition' => 'Return the string representation of the index\'s condition (the WHERE clause -of the index), or an empty String if no condition was set. - -Note that the query service can present the condition in a slightly different -manner from when you declared the index: for instance it will wrap expressions -with parentheses and show the fields in an escaped format (surrounded by backticks).', -'Couchbase\N1qlIndex::fields' => 'The fields covered by index', -'Couchbase\N1qlIndex::isPrimary' => 'Is it primary index', -'Couchbase\N1qlIndex::keyspace' => 'The keyspace for the index, typically the bucket name', -'Couchbase\N1qlIndex::name' => 'Name of the index', -'Couchbase\N1qlIndex::namespace' => 'The namespace for the index. A namespace is a resource pool that contains multiple keyspaces', -'Couchbase\N1qlIndex::state' => 'The descriptive state of the index', -'Couchbase\N1qlIndex::type' => 'Type of the index', -'CURLFile::mime' => 'MIME type of the file (default is `application/octet-stream`).', -'CURLFile::name' => 'Name of the file to be uploaded.', -'CURLFile::postname' => 'The name of the file in the upload data (defaults to the name property).', -'DateInterval::d' => 'Number of days.', -'DateInterval::days' => 'If the DateInterval object was created by `DateTime::diff`, then this is the total number of days between the start and end dates. Otherwise, days will be `false`. - -Before PHP 5.4.20/5.5.4 instead of `false` you will receive -99999 upon accessing the property.', -'DateInterval::f' => 'Number of microseconds, as a fraction of a second.', -'DateInterval::h' => 'Number of hours.', -'DateInterval::i' => 'Number of minutes.', -'DateInterval::invert' => 'Is `1` if the interval represents a negative time period and `0` otherwise. See `DateInterval::format`.', -'DateInterval::m' => 'Number of months.', -'DateInterval::s' => 'Number of seconds.', -'DateInterval::y' => 'Number of years.', -'DatePeriod::current' => 'During iteration this will contain the current date within the period.', -'DatePeriod::end' => 'The end date of the period.', -'DatePeriod::include_start_date' => 'Whether to include the start date in the set of recurring dates or not.', -'DatePeriod::interval' => 'An ISO 8601 repeating interval specification.', -'DatePeriod::recurrences' => 'The number of recurrences.', -'DatePeriod::start' => 'The start date of the period.', -'Directory::handle' => 'Can be used with other directory functions such as `readdir`, `rewinddir` and `closedir`.', -'Directory::path' => 'The directory that was opened.', -'DOMAttr::name' => 'The name of the attribute', -'DOMAttr::ownerElement' => 'The element which contains the attribute', -'DOMAttr::schemaTypeInfo' => 'Not implemented yet, always is `null`', -'DOMAttr::specified' => 'Not implemented yet, always is `null`', -'DOMAttr::value' => 'The value of the attribute', -'DOMCharacterData::data' => 'The contents of the node.', -'DOMCharacterData::length' => 'The length of the contents.', -'DOMDocument::actualEncoding' => '*Deprecated*. Actual encoding of the document, is a readonly equivalent to encoding.', -'DOMDocument::config' => '*Deprecated*. Configuration used when `DOMDocument::normalizeDocument` is invoked.', -'DOMDocument::doctype' => 'The Document Type Declaration associated with this document.', -'DOMDocument::documentElement' => 'This is a convenience attribute that allows direct access to the child node that is the document element of the document.', -'DOMDocument::documentURI' => 'The location of the document or `null` if undefined.', -'DOMDocument::encoding' => 'Encoding of the document, as specified by the XML declaration. This attribute is not present in the final DOM Level 3 specification, but is the only way of manipulating XML document encoding in this implementation.', -'DOMDocument::formatOutput' => 'Nicely formats output with indentation and extra space.', -'DOMDocument::implementation' => 'The `DOMImplementation` object that handles this document.', -'DOMDocument::preserveWhiteSpace' => 'Do not remove redundant white space. Default to `true`.', -'DOMDocument::recover' => '*Proprietary*. Enables recovery mode, i.e. trying to parse non-well formed documents. This attribute is not part of the DOM specification and is specific to libxml.', -'DOMDocument::resolveExternals' => 'Set it to `true` to load external entities from a doctype declaration. This is useful for including character entities in your XML document.', -'DOMDocument::standalone' => '*Deprecated*. Whether or not the document is standalone, as specified by the XML declaration, corresponds to xmlStandalone.', -'DOMDocument::strictErrorChecking' => 'Throws `DOMException` on errors. Default to `true`.', -'DOMDocument::substituteEntities' => '*Proprietary*. Whether or not to substitute entities. This attribute is not part of the DOM specification and is specific to libxml.', -'DOMDocument::validateOnParse' => 'Loads and validates against the DTD. Default to `false`.', -'DOMDocument::version' => '*Deprecated*. Version of XML, corresponds to xmlVersion.', -'DOMDocument::xmlEncoding' => 'An attribute specifying, as part of the XML declaration, the encoding of this document. This is `null` when unspecified or when it is not known, such as when the Document was created in memory.', -'DOMDocument::xmlStandalone' => 'An attribute specifying, as part of the XML declaration, whether this document is standalone. This is `false` when unspecified.', -'DOMDocument::xmlVersion' => 'An attribute specifying, as part of the XML declaration, the version number of this document. If there is no declaration and if this document supports the "XML" feature, the value is "1.0".', -'DOMDocumentType::entities' => 'A `DOMNamedNodeMap` containing the general entities, both external and internal, declared in the DTD.', -'DOMDocumentType::internalSubset' => 'The internal subset as a string, or null if there is none. This does not contain the delimiting square brackets.', -'DOMDocumentType::name' => 'The name of DTD; i.e., the name immediately following the `DOCTYPE` keyword.', -'DOMDocumentType::notations' => 'A `DOMNamedNodeMap` containing the notations declared in the DTD.', -'DOMDocumentType::publicId' => 'The public identifier of the external subset.', -'DOMDocumentType::systemId' => 'The system identifier of the external subset. This may be an absolute URI or not.', -'DOMElement::schemaTypeInfo' => 'Not implemented yet, always return `null`', -'DOMElement::tagName' => 'The element name', -'DOMEntity::actualEncoding' => 'An attribute specifying the encoding used for this entity at the time of parsing, when it is an external parsed entity. This is `null` if it an entity from the internal subset or if it is not known.', -'DOMEntity::encoding' => 'An attribute specifying, as part of the text declaration, the encoding of this entity, when it is an external parsed entity. This is `null` otherwise.', -'DOMEntity::notationName' => 'For unparsed entities, the name of the notation for the entity. For parsed entities, this is `null`.', -'DOMEntity::publicId' => 'The public identifier associated with the entity if specified, and `null` otherwise.', -'DOMEntity::systemId' => 'The system identifier associated with the entity if specified, and `null` otherwise. This may be an absolute URI or not.', -'DOMEntity::version' => 'An attribute specifying, as part of the text declaration, the version number of this entity, when it is an external parsed entity. This is `null` otherwise.', -'DOMException::code' => 'An integer indicating the type of error generated', -'DOMNamedNodeMap::length' => 'The number of nodes in the map. The range of valid child node indices is `0` to `length - 1` inclusive.', -'DOMNode::attributes' => 'A `DOMNamedNodeMap` containing the attributes of this node (if it is a `DOMElement`) or `null` otherwise.', -'DOMNode::baseURI' => 'The absolute base URI of this node or `null` if the implementation wasn\'t able to obtain an absolute URI.', -'DOMNode::childNodes' => 'A `DOMNodeList` that contains all children of this node. If there are no children, this is an empty `DOMNodeList`.', -'DOMNode::firstChild' => 'The first child of this node. If there is no such node, this returns `null`.', -'DOMNode::lastChild' => 'The last child of this node. If there is no such node, this returns `null`.', -'DOMNode::localName' => 'Returns the local part of the qualified name of this node.', -'DOMNode::namespaceURI' => 'The namespace URI of this node, or `null` if it is unspecified.', -'DOMNode::nextSibling' => 'The node immediately following this node. If there is no such node, this returns `null`.', -'DOMNode::nodeName' => 'Returns the most accurate name for the current node type', -'DOMNode::nodeType' => 'Gets the type of the node. One of the predefined XML_xxx_NODE constants', -'DOMNode::nodeValue' => 'The value of this node, depending on its type. Contrary to the W3C specification, the node value of `DOMElement` nodes is equal to DOMNode::textContent instead of `null`.', -'DOMNode::ownerDocument' => 'The `DOMDocument` object associated with this node, or `null` if this node is a `DOMDOcument`', -'DOMNode::parentNode' => 'The parent of this node. If there is no such node, this returns `null`.', -'DOMNode::prefix' => 'The namespace prefix of this node, or `null` if it is unspecified.', -'DOMNode::previousSibling' => 'The node immediately preceding this node. If there is no such node, this returns `null`.', -'DOMNode::textContent' => 'The text content of this node and its descendants.', -'DOMNodeList::length' => 'The number of nodes in the list. The range of valid child node indices is 0 to `length - 1` inclusive.', -'DOMText::wholeText' => 'Holds all the text of logically-adjacent (not separated by Element, Comment or Processing Instruction) Text nodes.', -'errorObj::code' => '//See error code constants above', -'EvChild::pid' => '*Readonly* . The process ID this watcher watches out for, or `0` , meaning any process ID.', -'EvChild::rpid' => '*Readonly* .The process ID that detected a status change.', -'EvChild::rstatus' => '*Readonly* . The process exit status caused by rpid .', -'Event::pending' => 'Whether event is pending. See About event persistence .', -'EventBuffer::contiguous_space' => 'The number of bytes stored contiguously at the front of the buffer. The bytes in a buffer may be stored in multiple separate chunks of memory; the property returns the number of bytes currently stored in the first chunk.', -'EventBuffer::length' => 'The number of bytes stored in an event buffer.', -'EventBufferEvent::fd' => 'Numeric file descriptor associated with the buffer event. Normally represents a bound socket. Equals to `null`, if there is no file descriptor(socket) associated with the buffer event.', -'EventBufferEvent::input' => 'Underlying input buffer object( `EventBuffer` )', -'EventBufferEvent::output' => 'Underlying output buffer object( `EventBuffer` )', -'EventBufferEvent::priority' => 'The priority of the events used to implement the buffer event.', -'EventListener::fd' => 'Numeric file descriptor of the underlying socket. (Added in `event-1.6.0` .)', -'EventSslContext::local_cert' => 'Path to local certificate file on filesystem. It must be a PEM-encoded file which contains certificate. It can optionally contain the certificate chain of issuers.', -'EventSslContext::local_pk' => 'Path to local private key file', -'EvLoop::backend' => '*Readonly* . The backend flags indicating the event backend in use.', -'EvLoop::data' => 'Custom data attached to loop', -'EvLoop::depth' => 'The recursion depth. See `Ev::depth` .', -'EvLoop::io_interval' => 'Higher io_interval allows *libev* to spend more time collecting `EvIo` events, so more events can be handled per iteration, at the cost of increasing latency. Timeouts (both `EvPeriodic` and `EvTimer` ) will not be affected. Setting this to a non-zero value will introduce an additional `sleep()` call into most loop iterations. The sleep time ensures that *libev* will not poll for `EvIo` events more often than once per this interval, on average. Many programs can usually benefit by setting the io_interval to a value near `0.1` , which is often enough for interactive servers(not for games). It usually doesn\'t make much sense to set it to a lower value than `0.01` , as this approaches the timing granularity of most systems. - -See also FUNCTIONS CONTROLLING EVENT LOOPS .', -'EvLoop::is_default_loop' => '*Readonly* . `true` if it is the default event loop.', -'EvLoop::iteration' => 'The current iteration count of the loop. See `Ev::iteration`', -'EvLoop::pending' => 'The number of pending watchers. `0` indicates that there are no watchers pending.', -'EvLoop::timeout_interval' => 'Higher timeout_interval allows *libev* to spend more time collecting timeouts, at the expense of increased latency/jitter/inexactness(the watcher callback will be called later). `EvIo` watchers will not be affected. Setting this to a non-null value will not introduce any overhead in *libev* . See also FUNCTIONS CONTROLLING EVENT LOOPS .', -'EvPeriodic::interval' => 'The current interval value. Can be modified any time, but changes only take effect when the periodic timer fires or `EvPeriodic::again` is being called.', -'EvPeriodic::offset' => 'When repeating, this contains the offset value, otherwise this is the absolute point in time(the offset value passed to `EvPeriodic::set` , although *libev* might modify this value for better numerical stability).', -'EvSignal::signum' => 'Signal number. See the constants exported by *pcntl* extension. See also `signal(7)` man page.', -'EvStat::interval' => '*Readonly* . Hint on how quickly a change is expected to be detected and should normally be specified as `0.0` to let *libev* choose a suitable value.', -'EvStat::path' => '*Readonly* . The path to wait for status changes on.', -'EvTimer::remaining' => 'Returns the remaining time until a timer fires. If the timer is active, then this time is relative to the current event loop time, otherwise it\'s the timeout value currently configured. - -That is, after instantiating an `EvTimer` with an after value of `5.0` and repeat value of `7.0` , remaining returns `5.0` . When the timer is started and one second passes, remaining will return `4.0` . When the timer expires and is restarted, it will return roughly `7.0` (likely slightly less as callback invocation takes some time too), and so on.', -'EvTimer::repeat' => 'If repeat is `0.0` , then it will automatically be stopped once the timeout is reached. If it is positive, then the timer will automatically be configured to trigger again every repeat seconds later, until stopped manually.', -'EvWatcher::data' => 'User custom data associated with the watcher', -'EvWatcher::is_active' => '*Readonly* . `true` if the watcher is active. `false` otherwise.', -'EvWatcher::is_pending' => '*Readonly* .`true` if the watcher is pending, i.e. it has outstanding events, but its callback has not yet been invoked. `false` otherwise. As long, as a watcher is pending(but not active), one must *not* change its priority.', -'EvWatcher::priority' => '`Integer` between `Ev::MINPRI` and `Ev::MAXPRI` . Pending watchers with higher priority will be invoked before watchers with lower priority, but priority will not keep watchers from being executed(except for `EvIdle` watchers). `EvIdle` watchers provide functionality to suppress invocation when higher priority events are pending.', -'FANNConnection::from_neuron' => 'The neuron where the connection starts.', -'FANNConnection::to_neuron' => 'The neuron where the connection ends.', -'FANNConnection::weight' => 'The weight of the connection.', -'GearmanException::code' => 'Prop description.', -'http\Client::history' => 'Request/response history.', -'http\Client::observers' => 'Attached observers.', -'http\Client::options' => 'Set options.', -'http\Client::recordHistory' => 'Whether to record history in http\Client::$history.', -'http\Client\Request::options' => 'Array of options for this request, which override client options.', -'http\Env\Request::cookie' => 'The request’s cookies. ($_COOKIE)', -'http\Env\Request::files' => 'The request’s form uploads. ($_FILES)', -'http\Env\Request::form' => 'The request’s form parameters. ($_POST)', -'http\Env\Request::query' => 'The request’s query parameters. ($_GET)', -'http\Env\Response::cacheControl' => 'How the client should treat this response in regards to caching', -'http\Env\Response::contentDisposition' => 'The response’s MIME content disposition', -'http\Env\Response::contentEncoding' => 'See http\Env\Response::CONTENT_ENCODING_* constants', -'http\Env\Response::contentType' => 'The response’s MIME content type', -'http\Env\Response::cookies' => 'The response’s cookies.', -'http\Env\Response::etag' => 'A custom ETag', -'http\Env\Response::lastModified' => 'A “Last-Modified” time stamp.', -'http\Env\Response::request' => 'A request instance which overrides the environments default request', -'http\Env\Response::throttleChunk' => 'The chunk to send every $throttleDelay seconds.', -'http\Env\Response::throttleDelay' => 'Any throttling delay.', -'http\Header::name' => 'The name of the HTTP header.', -'http\Header::value' => 'The value of the HTTP header.', -'http\Message::body' => 'The message\'s body.', -'http\Message::headers' => 'Any message headers.', -'http\Message::httpVersion' => 'A custom HTTP protocol version.', -'http\Message::parentMessage' => 'Any parent message.', -'http\Message::requestMethod' => 'The request method if the message is of type request.', -'http\Message::requestUrl' => 'The request url if the message is of type request.', -'http\Message::responseCode' => 'The response code if the message is of type response.', -'http\Message::responseStatus' => 'The response status phrase if the message is of type response.', -'http\Message::type' => 'The message type. See http\Message::TYPE_* constants.', -'http\Params::arg_sep' => 'The argument separator(s).', -'http\Params::flags' => 'The modus operandi of the parser. See http\Params::PARSE_* constants.', -'http\Params::param_sep' => 'The parameter separator(s).', -'http\Params::params' => 'The (parsed) parameters.', -'http\Params::val_sep' => 'The value separator(s).', -'http\QueryString::instance' => 'The global instance. See http\QueryString::getGlobalInstance().', -'http\QueryString::queryArray' => 'The data', -'http\Url::fragment' => 'URL fragment (hash).', -'http\Url::host' => 'Hostname/domain.', -'http\Url::pass' => 'Authentication password.', -'http\Url::path' => 'URL path.', -'http\Url::port' => 'Port.', -'http\Url::query' => 'URL querystring.', -'http\Url::scheme' => 'The URL\'s scheme.', -'http\Url::user' => 'Authenticating user.', -'imageObj::height' => 'read-only', -'imageObj::resolution' => 'read-only', -'imageObj::resolutionfactor' => 'read-only', -'imageObj::width' => 'read-only', -'labelcacheMemberObj::classindex' => 'read-only', -'labelcacheMemberObj::featuresize' => 'read-only', -'labelcacheMemberObj::layerindex' => 'read-only', -'labelcacheMemberObj::markerid' => 'read-only', -'labelcacheMemberObj::numstyles' => 'read-only', -'labelcacheMemberObj::shapeindex' => 'read-only', -'labelcacheMemberObj::status' => 'read-only', -'labelcacheMemberObj::text' => 'read-only', -'labelcacheMemberObj::tileindex' => 'read-only', -'labelObj::backgroundcolor' => '(deprecated since 6.0)', -'labelObj::backgroundshadowcolor' => '(deprecated since 6.0)', -'labelObj::backgroundshadowsizex' => '(deprecated since 6.0)', -'labelObj::backgroundshadowsizey' => '(deprecated since 6.0)', -'layerObj::connectiontype' => 'read-only, use setConnectionType() to set it', -'layerObj::dump' => 'deprecated since 6.0', -'layerObj::grid' => 'only available on a layer defined as grid (MS_GRATICULE)', -'layerObj::index' => 'read-only', -'layerObj::numclasses' => 'read-only', -'layerObj::status' => 'MS_ON, MS_OFF, MS_DEFAULT or MS_DELETE', -'legendObj::outlinecolor' => 'Color of outline of box, -1 for no outline', -'legendObj::position' => 'for embedded legends, MS_UL, MS_UC, ...', -'legendObj::postlabelcache' => 'MS_TRUE, MS_FALSE', -'legendObj::status' => 'MS_ON, MS_OFF, MS_EMBED', -'libXMLError::code' => 'The error\'s code.', -'libXMLError::column' => 'The column where the error occurred.', -'libXMLError::file' => 'The filename, or empty if the XML was loaded from a string.', -'libXMLError::level' => 'the severity of the error (one of the following constants: `LIBXML_ERR_WARNING`, `LIBXML_ERR_ERROR` or `LIBXML_ERR_FATAL`)', -'libXMLError::line' => 'The line where the error occurred.', -'libXMLError::message' => 'The error message, if any.', -'lineObj::numpoints' => 'read-only', -'mapObj::defresolution' => 'pixels per inch, defaults to 72', -'mapObj::extent' => ';', -'mapObj::fontsetfilename' => 'read-only, set by setFontSet()', -'mapObj::height' => 'see setSize()', -'mapObj::labelcache' => 'no members. Used only to free the -label cache (map->labelcache->free()', -'mapObj::numlayers' => 'read-only', -'mapObj::numoutputformats' => 'read-only', -'mapObj::resolution' => 'pixels per inch, defaults to 72', -'mapObj::scaledenom' => 'read-only, set by drawMap()', -'mapObj::symbolsetfilename' => 'read-only, set by setSymbolSet()', -'mapObj::units' => 'map units type', -'mapObj::width' => 'see setSize()', -'MongoClient::connected' => 'This property will be set to `true` if we have a open connection to the database, `false` otherwise. If the connection is to a replica set, this property will only be `true` if the driver has a connection to a node matching the current read preference. This property does not take authentication into account. - -This property is *deprecated* since version 1.5.0.', -'MongoClient::status' => 'This property is no longer used and will be set to `null` In driver versions 1.1.x and earlier, this may be set to a string value (e.g. `"recycled"`, `"new"`) when persistent connections are used. - -This property is *deprecated* since version 1.5.0.', -'MongoCollection::db' => 'The "parent" database for this collection.', -'MongoCollection::w' => 'The number of servers to replicate a change to before returning success. Value is inherited from the parent database. The `MongoDB` class has a more detailed description of how `w` works.', -'MongoCollection::wtimeout' => 'The number of milliseconds to wait for `$this->w` replications to take place. Value is inherited from the parent database. The `MongoDB` class has a more detailed description of how `wtimeout` works.', -'MongoCursor::slaveOkay' => 'If the query should have the "slaveOkay" flag set, which allows reads on the secondary (secondaries are, by default, just for backup and not queried). Can be overridden with `MongoCursor::slaveOkay`. - -This functionality is *deprecated*. Please use the PHP manual\'s section on mongo.readpreferences instead.', -'MongoCursor::timeout' => 'Set timeout in milliseconds for all database responses. Use `-1` to wait forever. Can be overridden with `MongoCursor::timeout`. This does not cause the MongoDB server to cancel the operation; it only instructs the driver to stop waiting for a response and throw a `MongoCursorTimeoutException` after a set time.', -'MongoDB::w' => 'The number of servers to replicate a change to before returning success. Inherited by instances of `MongoCollection` derived from this. `w` functionality is only available in version 1.5.1+ of the MongoDB server and 1.0.8+ of the driver. - -`w` is used whenever you need to adjust the acknowledgement level (`MongoCollection::insert`, `MongoCollection::update`, `MongoCollection::remove`, `MongoCollection::save`, and `MongoCollection::ensureIndex` all support this option). With the default value (1), an acknowledged operation will return once the database server has the operation. If the server goes down before the operation has been replicated to a secondary, it is possible to lose the operation forever. Thus, you can specify `w` to be higher than one and guarantee that at least one secondary has the operation before it is considered successful. - -For example, if `w` is 2, the primary and one secondary must have a record of the operation or the driver will throw a `MongoCursorException`. It is tempting to set `w` to the total number of secondaries + primary, but then if one secondary is down the operation will fail and an exception will be thrown, so usually `w=2` is safest (primary and one secondary).', -'MongoDB::wtimeout' => 'The number of milliseconds to wait for `MongoDB::$w` replications to take place. Inherited by instances of `MongoCollection` derived from this. `w` functionality is only available in version 1.5.1+ of the MongoDB server and 1.0.8+ of the driver. - -Unless `wtimeout` is set, the server waits forever for replicating to `w` servers to finish. The driver defaults to waiting for 10 seconds, you can change this value to alter its behavior.', -'MongoDB\Driver\Exception\CommandException::resultDocument' => 'The result document associated with the failed command.', -'MongoDB\Driver\Exception\RuntimeException::errorLabels' => 'Contains an array of error labels to go with an exception. For example, error labels can be used to detect whether a transaction can be retried safely if the `TransientTransactionError` label is present. The existence of a specific error label should be tested for with the `MongoDB\Driver\Exception\RuntimeException::hasErrorLabel`, instead of interpreting this `errorLabels` property manually.', -'MongoDB\Driver\Exception\WriteException::writeResult' => 'The `MongoDB\Driver\WriteResult` associated with the failed write operation.', -'MongoGridFS::chunks' => 'MongoCollection', -'MongoGridFS::chunksName' => 'string', -'MongoGridFS::filesName' => 'string', -'MongoId::id' => '<p> Note: The property name begins with a $ character. It may be accessed using', -'MongoResultException::document' => 'The raw result document as an array.', -'mysqli_driver::client_info' => 'The Client API header version', -'mysqli_driver::client_version' => 'The Client version', -'mysqli_driver::driver_version' => 'The MySQLi Driver version', -'mysqli_driver::embedded' => 'Whether MySQLi Embedded support is enabled', -'mysqli_driver::reconnect' => 'Allow or prevent reconnect (see the mysqli.reconnect INI directive)', -'mysqli_driver::report_mode' => 'Set to `MYSQLI_REPORT_OFF`, `MYSQLI_REPORT_ALL` or any combination of `MYSQLI_REPORT_STRICT` (throw Exceptions for errors), `MYSQLI_REPORT_ERROR` (report errors) and `MYSQLI_REPORT_INDEX` (errors regarding indexes). See also `mysqli_report`.', -'mysqli_sql_exception::sqlstate' => 'The sql state with the error.', -'mysqli_warning::errno' => 'Error number', -'mysqli_warning::message' => 'Message string', -'mysqli_warning::sqlstate' => 'SQL state', -'OAuthException::lastResponse' => 'The response of the exception which occurred, if any', -'outputformatObj::imagemode' => 'MS_IMAGEMODE_* value.', -'OwsrequestObj::numparams' => '(read-only)', -'OwsrequestObj::type' => '(read-only): MS_GET_REQUEST or MS_POST_REQUEST', -'Parle\ErrorInfo::id' => 'Error id.', -'Parle\ErrorInfo::position' => 'Position in the input, where the error occurred.', -'Parle\ErrorInfo::token' => 'If applicable - the `Parle\Token` related to the error, otherwise `null`.', -'Parle\Lexer::bol' => 'Start of input flag.', -'Parle\Lexer::cursor' => 'Current input offset, readonly.', -'Parle\Lexer::flags' => 'Lexer flags.', -'Parle\Lexer::marker' => 'Position of the latest token match, readonly.', -'Parle\Lexer::state' => 'Current lexer state, readonly.', -'Parle\Parser::action' => 'Current parser action that matches one of the action class constants, readonly.', -'Parle\Parser::reduceId' => 'Grammar rule id just processed in the reduce action. The value corresponds either to a token or to a production id. Readonly.', -'Parle\RLexer::bol' => 'Start of input flag.', -'Parle\RLexer::cursor' => 'Current input offset, readonly.', -'Parle\RLexer::flags' => 'Lexer flags.', -'Parle\RLexer::marker' => 'Position of the latest token match, readonly.', -'Parle\RLexer::state' => 'Current lexer state, readonly.', -'Parle\RParser::action' => 'Current parser action that matches one of the action class constants, readonly.', -'Parle\RParser::reduceId' => 'Grammar rule id just processed in the reduce action. The value corresponds either to a token or to a production id. Readonly.', -'Parle\Stack::empty' => 'Whether the stack is empty, readonly.', -'Parle\Stack::size' => 'Stack size, readonly.', -'Parle\Stack::top' => 'Element on the top of the stack.', -'Parle\Token::id' => 'Token id.', -'Parle\Token::value' => 'Token value.', -'PDOException::code' => '`SQLSTATE` error code. Use `Exception::getCode` to access it.', -'PDOException::errorInfo' => 'Corresponds to `PDO::errorInfo` or `PDOStatement::errorInfo`', -'PDOStatement::queryString' => 'Used query string.', -'php_user_filter::filtername' => 'Name of the filter registered by `stream_filter_append`.', -'pointObj::m' => 'used only for measured shape files - set to 0 for other types', -'pointObj::z' => 'used for 3d shape files. set to 0 for other types', -'Pool::class' => 'the class of the Worker', -'Pool::ctor' => 'the arguments for constructor of new Workers', -'Pool::last' => 'offset in workers of the last Worker used', -'Pool::size' => 'maximum number of Workers this Pool can use', -'Pool::workers' => 'references to Workers', -'querymapObj::style' => 'MS_NORMAL, MS_HILITE, MS_SELECTED', -'ReflectionClass::name' => 'Name of the class. Read-only, throws `ReflectionException` in attempt to write.', -'ReflectionClassConstant::class' => 'Name of the class where the class constant is defined. Read-only, throws `ReflectionException` in attempt to write.', -'ReflectionClassConstant::name' => 'Name of the class constant. Read-only, throws `ReflectionException` in attempt to write.', -'ReflectionExtension::name' => 'Name of the extension, same as calling the `ReflectionExtension::getName` method.', -'ReflectionFunction::name' => 'Name of the function. Read-only, throws `ReflectionException` in attempt to write.', -'ReflectionFunctionAbstract::name' => 'Name of the function. Read-only, throws `ReflectionException` in attempt to write.', -'ReflectionMethod::class' => 'Class name', -'ReflectionMethod::name' => 'Method name', -'ReflectionObject::name' => 'Name of the object\'s class. Read-only, throws `ReflectionException` in attempt to write.', -'ReflectionParameter::name' => 'Name of the parameter. Read-only, throws `ReflectionException` in attempt to write.', -'ReflectionProperty::class' => 'Name of the class where the property is defined. Read-only, throws `ReflectionException` in attempt to write.', -'ReflectionProperty::name' => 'Name of the property. Read-only, throws `ReflectionException` in attempt to write.', -'ReflectionZendExtension::name' => 'Name of the extension. Read-only, throws `ReflectionException` in attempt to write.', -'resultObj::classindex' => 'read-only', -'resultObj::resultindex' => 'read-only', -'resultObj::shapeindex' => 'read-only', -'resultObj::tileindex' => 'read-only', -'scalebarObj::position' => 'for embedded scalebars, MS_UL, MS_UC, ...', -'scalebarObj::status' => 'MS_ON, MS_OFF, MS_EMBED', -'shapefileObj::bounds' => 'read-only', -'shapefileObj::numshapes' => 'read-only', -'shapefileObj::source' => 'read-only', -'shapefileObj::type' => 'read-only', -'shapeObj::bounds' => 'read-only', -'shapeObj::numlines' => 'read-only', -'shapeObj::numvalues' => 'read-only', -'shapeObj::tileindex' => 'read-only', -'shapeObj::type' => 'read-only', -'shapeObj::values' => 'read-only', -'SNMP::enum_print' => 'Controls the way enum values are printed - -Parameter toggles if walk/get etc. should automatically lookup enum values in the MIB and return them together with their human readable string.', -'SNMP::exceptions_enabled' => 'Controls which failures will raise SNMPException instead of warning. Use bitwise OR\'ed `SNMP::ERRNO_*` constants. By default all SNMP exceptions are disabled.', -'SNMP::info' => 'Read-only property with remote agent configuration: hostname, port, default timeout, default retries count', -'SNMP::max_oids' => 'Maximum OID per GET/SET/GETBULK request', -'SNMP::oid_increasing_check' => 'Controls disabling check for increasing OID while walking OID tree - -Some SNMP agents are known for returning OIDs out of order but can complete the walk anyway. Other agents return OIDs that are out of order and can cause `SNMP::walk` to loop indefinitely until memory limit will be reached. PHP SNMP library by default performs OID increasing check and stops walking on OID tree when it detects possible loop with issuing warning about non-increasing OID faced. Set oid_increasing_check to `false` to disable this check.', -'SNMP::oid_output_format' => 'Controls OID output format', -'SNMP::quick_print' => 'Value of quick_print within the NET-SNMP library - -Sets the value of quick_print within the NET-SNMP library. When this is set (1), the SNMP library will return \'quick printed\' values. This means that just the value will be printed. When quick_print is not enabled (default) the UCD SNMP library prints extra information including the type of the value (i.e. IpAddress or OID). Additionally, if quick_print is not enabled, the library prints additional hex values for all strings of three characters or less.', -'SNMP::valueretrieval' => 'Controls the method how the SNMP values will be returned', -'SNMPException::code' => '`SNMP`library error code. Use `Exception::getCode` to access it.', -'SNMPException::message' => 'Textual error message. Exception::getMessage() to access it.', -'SolrDocumentField::boost' => 'The boost value for the field', -'SolrDocumentField::name' => 'The name of the field.', -'SolrDocumentField::values' => 'An array of values for this field', -'SolrException::sourcefile' => 'The c-space source file where exception was generated', -'SolrException::sourceline' => 'The line in c-space source file where exception was generated', -'SolrException::zif_name' => 'The c-space function where exception was generated', -'SolrPingResponse::http_digested_response' => 'The response in PHP serialized format.', -'SolrPingResponse::http_raw_request' => 'The raw request sent to the server', -'SolrPingResponse::http_raw_request_headers' => 'A string of raw headers sent during the request', -'SolrPingResponse::http_raw_response' => 'The response message from the server', -'SolrPingResponse::http_raw_response_headers' => 'Response headers from the Solr server', -'SolrPingResponse::http_request_url' => 'The request URL', -'SolrPingResponse::http_status' => 'The http status of the response.', -'SolrPingResponse::http_status_message' => 'Detailed message on http status', -'SolrPingResponse::parser_mode' => 'Whether to parse the solr documents as SolrObject or SolrDocument instances.', -'SolrPingResponse::success' => 'Was there an error during the request', -'SolrResponse::http_digested_response' => 'The response in PHP serialized format.', -'SolrResponse::http_raw_request' => 'The raw request sent to the server', -'SolrResponse::http_raw_request_headers' => 'A string of raw headers sent during the request.', -'SolrResponse::http_raw_response' => 'The response message from the server.', -'SolrResponse::http_raw_response_headers' => 'Response headers from the Solr server.', -'SolrResponse::http_request_url' => 'The request URL', -'SolrResponse::http_status' => 'The http status of the response.', -'SolrResponse::http_status_message' => 'Detailed message on http status', -'SolrResponse::parser_mode' => 'Whether to parse the solr documents as SolrObject or SolrDocument instances.', -'SolrResponse::success' => 'Was there an error during the request', -'StompFrame::body' => 'Frame body.', -'StompFrame::command' => 'Frame command.', -'StompFrame::headers' => 'Frame headers (`array`).', -'streamWrapper::context' => 'The current context, or `null` if no context was passed to the caller function. - -Use the `stream_context_get_options` to parse the context.', -'styleObj::opacity' => 'only supported for the AGG driver', -'symbolObj::imagepath' => 'read-only', -'symbolObj::inmapfile' => 'If set to TRUE, the symbol will be saved -inside the mapfile.', -'symbolObj::numpoints' => 'read-only', -'symbolObj::patternlength' => 'read-only', -'Threaded::worker' => 'Worker object in which this Threaded is being executed', -'tidyNode::attribute' => 'An array of string, representing the attributes names (as keys) of the current node.', -'tidyNode::child' => 'An array of `tidyNode`, representing the children of the current node.', -'tidyNode::column' => 'The column number at which the tags is located in the file', -'tidyNode::id' => 'The ID of the node (one of the tag constants, e.g. `TIDY_TAG_FRAME`)', -'tidyNode::line' => 'The line number at which the tags is located in the file', -'tidyNode::name' => 'The name of the HTML node', -'tidyNode::proprietary' => 'Indicates if the node is a proprietary tag', -'tidyNode::type' => 'The type of the node (one of the nodetype constants, e.g. `TIDY_NODETYPE_PHP`)', -'tidyNode::value' => 'The HTML representation of the node, including the surrounding tags.', -'tokyotyrantexception::code' => 'The exception code. This can be compared to `TokyoTyrant::TTE_*` constants', -'UI\Controls\Box::controls' => 'Contains controls, should not be manipulated directly', -'UI\Controls\Form::controls' => 'Contains controls, should not be manipulated directly', -'UI\Controls\Grid::controls' => 'Contains controls, should not be manipulated directly', -'UI\Controls\Group::controls' => 'Contains controls, should not be manipulated directly', -'UI\Controls\Tab::controls' => 'Contains controls, should not be manipulated directly', -'UI\Draw\Color::a' => 'Provides access to the alpha channel', -'UI\Draw\Color::b' => 'Provides access to the blue channel', -'UI\Draw\Color::g' => 'Provides access to the green channel', -'UI\Draw\Color::r' => 'Provides access to the red channel', -'UI\Point::x' => 'Holds the X co-ordinate, can be read/written directly', -'UI\Point::y' => 'Holds the Y co-ordinate, can be read/written directly', -'UI\Size::height' => 'Holds the height, can be read/written directly', -'UI\Size::width' => 'Holds the width, can be read/written directly', -'UI\Window::controls' => 'Contains controls, should not be manipulated directly', -'webObj::empty' => 'read-only', -'webObj::error' => 'read-only', -'webObj::extent' => 'read-only', -'XMLReader::attributeCount' => 'The number of attributes on the node', -'XMLReader::baseURI' => 'The base URI of the node', -'XMLReader::depth' => 'Depth of the node in the tree, starting at 0', -'XMLReader::hasAttributes' => 'Indicates if node has attributes', -'XMLReader::hasValue' => 'Indicates if node has a text value', -'XMLReader::isDefault' => 'Indicates if attribute is defaulted from DTD', -'XMLReader::isEmptyElement' => 'Indicates if node is an empty element tag', -'XMLReader::localName' => 'The local name of the node', -'XMLReader::name' => 'The qualified name of the node', -'XMLReader::namespaceURI' => 'The URI of the namespace associated with the node', -'XMLReader::nodeType' => 'The node type for the node', -'XMLReader::prefix' => 'The prefix of the namespace associated with the node', -'XMLReader::value' => 'The text value of the node', -'XMLReader::xmlLang' => 'The xml:lang scope which the node resides', -'Yaf\Controller_Abstract::_module' => 'module name', -'Yaf\Controller_Abstract::_name' => 'controller name', -'Yaf\Controller_Abstract::_request' => 'current request object', -'Yaf\Controller_Abstract::_response' => 'current response object', -'Yaf\Controller_Abstract::_view' => 'view engine object', -'Yaf\Controller_Abstract::actions' => 'You can also define a action method in a separate PHP script by using this property and \Yaf\Action_Abstract.', -'Yaf\Loader::_library' => 'By default, this value is application.directory . "/library", you can change this either in the application.ini(application.library) or call to \Yaf\Loader::setLibraryPath()', -'Yaf\Router::_current' => 'after routing phase, this indicated the name of which route is used to route current request. you can get this name by \Yaf\Router::getCurrentRoute()', -'Yaf\Router::_routes' => 'registered routes stack', -'Yaf_Controller_Abstract::_module' => 'module name', -'Yaf_Controller_Abstract::_name' => 'controller name', -'Yaf_Controller_Abstract::_request' => 'current request object', -'Yaf_Controller_Abstract::_response' => 'current response object', -'Yaf_Controller_Abstract::_view' => 'view engine object', -'Yaf_Controller_Abstract::actions' => 'You can also define a action method in a separate PHP script by using this property and `Yaf_Action_Abstract`. define action in a separate file "actions/Dummy_action.php", ); /* action method may have arguments */ public indexAction($name, $id) { /* $name and $id are unsafe raw data */ assert($name == $this->getRequest()->getParam("name")); assert($id == $this->_request->getParam("id")); } } ?> ]]> Dummy_action.php ]]>', -'Yaf_Loader::_library' => 'By default, this value is application.directory . "/library", you can change this either in the application.ini(application.library) or call to `Yaf_Loader::setLibraryPath`', -'Yaf_Router::_current' => 'after routing phase, this indicated the name of which route is used to route current request. you can get this name by `Yaf_Router::getCurrentRoute`.', -'Yaf_Router::_routes' => 'registered routes stack', -'ZendAPI_Job::_application_id' => 'The application id of the job -If the application id is not set, this job may get an application id automatically from the queue -(if the queue was assigned one). By default it is null (which indicates no application id is assigned)', -'ZendAPI_Job::_end_time' => 'UNIX timestamp that it\'s the last time this job should occurs. If _interval was set, and _end_time -was not, then this job will run forever. -By default there is no end_time, so recurrent job will run forever. If the job is not recurrent -(occurs only once) then the job will run at most once. If end_time has reached and the job was not -execute yet, it will not run.', -'ZendAPI_Job::_global_variables' => 'Bit mask holding the global variables that the user want the job\'s script to have when it\'s called - Options are prefixed with "JOB_QUEUE_SAVE_" and may be: -POST|GET|COOKIE|SESSION|RAW_POST|SERVER|FILES|ENV - By default there are no global variables we want to add to the job\'s script - i.e. In order to save the current GET and COOKIE global variables, -this property should be JOB_QUEUE_SAVE_GET|JOB_QUEUE_SAVE_COOKIE (or the integer 6) -In that case (of GET and COOKIE), when the job is added, the current $_GET and -$_COOKIE variables should be saved, and when the job\'s script is called, -those global variables should be populated', -'ZendAPI_Job::_host' => 'The host that the job was submit from', -'ZendAPI_Job::_id' => 'Unique id of the Job in the job queue', -'ZendAPI_Job::_interval' => 'The job running frequency in seconds. The job should run every _internal seconds -This property applies only to recurrent job. -By default, its value is 0 e.g. run it only once.', -'ZendAPI_Job::_name' => 'A short string describing the job', -'ZendAPI_Job::_output' => 'The job output after executing', -'ZendAPI_Job::_predecessor' => 'The job may have a dependency (another job that must be performed before this job) - This property hold the id of the job that must be performed. if this variable is an array of integers, -it means that there are several jobs that must be performed before this job - By default there are no dependencies', -'ZendAPI_Job::_preserved' => 'A bit that determine whether job can be deleted from history. When set, removeJob will not -delete the job from history.', -'ZendAPI_Job::_priority' => 'The priority of the job, options are the priority constants -By default the priority is set to normal (JOB_QUEUE_PRIORITY_NORMAL)', -'ZendAPI_Job::_scheduled_time' => 'The time that this job should be performed, this variables is the UNIX timestamp. -If set to 0, it means that the job should be performed now (or at least as soon as possible) -By default there is no scheduled time, which means we want to perform the job as soon as possible', -'ZendAPI_Job::_script' => 'Full path of the script that this job calls when it\'s processed', -'ZendAPI_Job::_status' => 'The status of the job -By default, the job status is waiting to being execute. -The status is determent by the queue and can not be modify by the user.', -'ZendAPI_Job::_user_variables' => 'Array holding all the variables that the user wants the job\'s script to have when it\'s called - The structure is variable_name => variable_value -i.e. if the user_variables array is array(\'my_var\' => 8), when the script is called, -a global variable called $my_var will have the int value of 8 - By default there are no variables that we want to add to the job\'s script', -'ZipArchive::comment' => 'Comment for the archive', -'ZipArchive::filename' => 'File name in the file system', -'ZipArchive::numFiles' => 'Number of files in archive', -'ZipArchive::status' => 'Status of the Zip Archive', -'ZipArchive::statusSys' => 'System status of the Zip Archive', -]; diff --git a/vendor/phan/phan/src/Phan/Language/Internal/PropertyMap.php b/vendor/phan/phan/src/Phan/Language/Internal/PropertyMap.php deleted file mode 100644 index 94bc0c7..0000000 --- a/vendor/phan/phan/src/Phan/Language/Internal/PropertyMap.php +++ /dev/null @@ -1,422 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Internal; - -$ordinary_ast_node = 'ast\Node|float|int|string'; -$ast_node_shape_inner = \implode(',', [ - "args?:ast\Node", - "catches?:ast\Node", - "class?:ast\Node", - "cond?:$ordinary_ast_node", - "const?:string", - "dim?:$ordinary_ast_node", - "docComment?:?string", - "expr?:$ordinary_ast_node", - "finally?:ast\Node", - "insteadof?:ast\Node", - "key?:$ordinary_ast_node", - "left?:$ordinary_ast_node", - "method?:ast\Node|string", - "name?:$ordinary_ast_node", - "right?:$ordinary_ast_node", - "stmts?:?ast\Node", - "try?:ast\Node", - "value?:$ordinary_ast_node", - "var?:ast\Node", -]); - -$ast_node_children_types = 'array{' . $ast_node_shape_inner . '}|ast\Node[]|int[]|string[]|float[]|null[]'; - -$standard_exception_types = [ - 'message' => 'string', - 'code' => 'int', - 'file' => 'string', - 'line' => 'int', -]; - -/** - * A mapping from class name to property name to property type. - * - * # Format - * - * This structure is of the form - * [ class_name => [ property_name => type ] ] - * - * # How to Generate - * - * ```sh - * svn checkout https://svn.php.net/repository/phpdoc/en/trunk phpdoc; - * - * cd phpdoc; - * - * find . -type f -path '*.xml -exec cat {} \; \ - * | tr "\n" " " \ - * | grep -o "<type>[^<]*<\/type>\s*<varname linkend=\"[^\.]*\.props.[^\"]*\"" \ - * | while read l; do T=`echo $l | cut -d ">" -f2 | cut -d "<" -f1`; N=`echo $l | cut -d "\"" -f2 | cut -d "." -f1,3`; printf "$T $N\n"; done \ - * | tee types - * ``` - * - * and then pipe that through - * - * ```perl - * #!/usr/bin/perl - * my %classes = {}; - * while(<>) { - * chomp; - * if (/^([^ ]*) ([^\.]*)\.(.*)$/) { - * my $type = $1; - * my $class = $2; - * my $property = $3; - * push(@{ $classes{$class} }, "'$property' => '$type'"); - * } else { - * print STDERR "FAIL\n"; - * } - * } - * while (($class, $details) = each %classes) { - * print " '$class' => [\n "; - * print join(",\n ", @{ $details }); - * print "\n ],\n"; - * } - * ``` - * - * TODO: Migrate the above scripts to be part of the existing php scripts - * for working with the phpdoc SVN repo - */ -return [ - 'arrayiterator' => ['name' => 'string'], - 'arrayobject' => ['name' => 'string'], - 'ast\metadata' => [ - 'flags' => 'array<int,string>', - 'flagsCombinable' => 'bool', - 'kind' => 'int', - 'name' => 'string', - ], - 'ast\node' => [ - 'children' => $ast_node_children_types, // NOTE: in the latest version, this is consistently an array, even for edge cases like statement lists of single statements. - 'endLineno' => 'int', - 'flags' => 'int', - 'kind' => 'int', - 'lineno' => 'int', - ], - 'ast\node\decl' => [ - 'children' => $ast_node_children_types, // NOTE: in the latest version, this is consistently an array, even for edge cases like statement lists of single statements. - 'docComment' => '?string', - 'endLineno' => 'int', - 'flags' => 'int', - 'kind' => 'int', - 'lineno' => 'int', - 'name' => '?string', - ], - 'collator' => ['name' => 'string'], - 'curlfile' => [ - 'mime' => 'string', - 'name' => 'string', - 'postname' => 'string', - ], - 'dateinterval' => [ - 'd' => 'int', - 'days' => 'mixed', - 'h' => 'int', - 'i' => 'int', - 'invert' => 'int', - 'm' => 'int', - 's' => 'int', - 'y' => 'int', - ], - 'directory' => ['handle' => 'resource', 'path' => 'string'], - 'directoryiterator' => ['name' => 'string'], - 'domattr' => [ - 'name' => 'string', - 'ownerElement' => 'DOMElement', - 'schemaTypeInfo' => 'bool', - 'specified' => 'bool', - 'value' => 'string' - ], - 'domcharacterdata' => [ - 'data' => 'string', - 'length' => 'int' - ], - 'domdocument' => [ - 'actualEncoding' => 'string', - 'config' => 'DOMConfiguration', - 'doctype' => 'DOMDocumentType', - 'documentElement' => 'DOMElement', - 'documentURI' => 'string', - 'encoding' => 'string', - 'formatOutput' => 'bool', - 'implementation' => 'DOMImplementation', - 'preserveWhiteSpace' => 'bool', - 'recover' => 'bool', - 'resolveExternals' => 'bool', - 'standalone' => 'bool', - 'strictErrorChecking' => 'bool', - 'substituteEntities' => 'bool', - 'validateOnParse' => 'bool', - 'version' => 'string', - 'xmlEncoding' => 'string', - 'xmlStandalone' => 'bool', - 'xmlVersion' => 'string' - ], - 'domdocumentfragment' => ['name' => 'string'], - 'domdocumenttype' => [ - 'entities' => 'DOMNamedNodeMap', - 'internalSubset' => 'string', - 'name' => 'string', - 'notations' => 'DOMNamedNodeMap', - 'publicId' => 'string', - 'systemId' => 'string', - ], - 'domelement' => [ - 'schemaTypeInfo' => 'bool', - 'tagName' => 'string', - ], - 'domentity' => [ - 'actualEncoding' => 'string', - 'encoding' => 'string', - 'notationName' => 'string', - 'publicId' => 'string', - 'systemId' => 'string', - 'version' => 'string', - ], - 'domentityreference' => ['name' => 'string'], - 'domexception' => ['code' => 'int'], - 'domimplementation' => ['name' => 'string'], - 'domnamednodemap' => ['length' => 'int'], - 'domnode' => [ - 'attributes' => 'DOMNamedNodeMap', - 'baseURI' => 'string', - 'childNodes' => 'DOMNodeList', - 'firstChild' => 'DOMNode', - 'lastChild' => 'DOMNode', - 'localName' => 'string', - 'namespaceURI' => 'string', - 'nextSibling' => 'DOMNode', - 'nodeName' => 'string', - 'nodeType' => 'int', - 'nodeValue' => 'string', - 'ownerDocument' => 'DOMDocument', - 'parentNode' => 'DOMNode', - 'prefix' => 'string', - 'previousSibling' => 'DOMNode', - 'textContent' => 'string', - ], - 'domnodelist' => ['length' => 'int'], - 'domnotation' => ['publicId' => 'string', 'systemId' => 'string'], - 'domprocessinginstruction' => ['data' => 'string', 'target' => 'string'], - 'domtext' => ['wholeText' => 'string'], - 'domxpath' => ['document' => 'DOMDocument'], - 'error' => ['code' => 'int', 'file' => 'string', 'line' => 'int', 'message' => 'string'], - 'errorexception' => ['severity' => 'int'], - 'event' => ['pending' => 'bool'], - 'eventbuffer' => [ - 'contiguous_space' => 'int', - 'length' => 'int', - ], - 'eventbufferevent' => [ - 'fd' => 'int', - 'input' => 'EventBuffer', - 'output' => 'EventBuffer', - 'priority' => 'int', - ], - 'eventlistener' => ['fd' => 'int'], - 'eventsslcontext' => [ - 'local_cert' => 'string', - 'local_pk' => 'string', - ], - 'exception' => [ - 'code' => 'int', - 'file' => 'string', - 'line' => 'int', - 'message' => 'string', - ], - 'filteriterator' => ['name' => 'string'], - 'libxmlerror' => [ - 'code' => 'int', - 'column' => 'int', - 'file' => 'string', - 'level' => 'int', - 'line' => 'int', - 'message' => 'string', - ], - 'limititerator' => ['name' => 'string'], - 'locale' => ['name' => 'string'], - 'mongoclient' => [ - 'connected' => 'bool', - 'status' => 'string' - ], - 'mongocollection' => [ - 'db' => 'MongoDB', - 'w' => 'int', - 'wtimeout' => 'int' - ], - 'mongocursor' => [ - 'slaveokay' => 'bool', - 'timeout' => 'int' - ], - 'mongodb' => ['w' => 'int', 'wtimeout' => 'int'], - 'mongodb\driver\exception\writeexception' => [ - 'writeresult' => 'MongoDBDriverWriteResult' - ], - 'mongoid' => ['id' => 'string'], - 'mongoint32' => ['value' => 'string'], - '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' => 'mixed', - 'protocol_version' => 'string', - 'server_info' => 'string', - 'server_version' => 'int', - 'sqlstate' => 'string', - 'stat' => 'mixed', - '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', - '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' => 'mixed', - ], - 'norewinditerator' => ['name' => 'string'], - 'normalizer' => ['name' => 'string'], - 'numberformatter' => ['name' => 'string'], - 'parentiterator' => ['name' => 'string'], - 'pdoexception' => ['code' => 'string', 'errorInfo' => 'array'], - 'pdostatement' => ['queryString' => 'string'], - 'php_user_filter' => ['filtername' => 'string', 'params' => 'mixed'], - 'recursivearrayiterator' => ['name' => 'string'], - 'recursivecachingiterator' => ['name' => 'string'], - 'recursivedirectoryiterator' => ['name' => 'string'], - 'recursiveregexiterator' => ['name' => 'string', 'replacement' => 'mixed'], // TODO: is 'replacement' documented - 'reflectionclass' => ['name' => 'string'], - 'reflectionclassconstant' => ['class' => 'string', 'name' => 'string'], - 'reflectionextension' => ['name' => 'string'], - 'reflectionfunction' => ['name' => 'string'], - 'reflectionfunctionabstract' => ['name' => 'string'], - 'reflectionmethod' => ['class' => 'string', 'name' => 'string'], - 'reflectionobject' => ['name' => 'string'], - 'reflectionparameter' => ['name' => 'string'], - 'reflectionproperty' => ['class' => 'string', 'name' => 'string'], - 'reflectionzendextension' => ['name' => 'string'], - 'regexiterator' => ['name' => 'string', 'replacement' => 'mixed'], - 'simplexmliterator' => [ - 'name' => 'string', - ], - 'snmp' => [ - 'enum_print' => 'bool', - 'exceptions_enabled' => 'int', - 'info' => 'array', - 'max_oids' => 'int', - 'oid_increasing_check' => 'bool', - 'oid_output_format' => 'int', - 'quick_print' => 'bool', - 'valueretrieval' => 'int', - ], - 'snmpexception' => ['code' => 'string'], - 'solrdocumentfield' => [ - 'boost' => 'float', - 'name' => 'string', - 'values' => 'array', - ], - 'solrexception' => [ - 'sourcefile' => 'string', - 'sourceline' => 'int', - 'zif_name' => 'string' - ], - 'solrresponse' => [ - 'http_digested_response' => 'string', - 'http_raw_request' => 'string', - 'http_raw_request_headers' => 'string', - 'http_raw_response' => 'string', - 'http_raw_response_headers' => 'string', - 'http_request_url' => 'string', - 'http_status' => 'int', - 'http_status_message' => 'string', - 'parser_mode' => 'int', - 'success' => 'bool', - ], - 'spldoublylinkedlist' => ['name' => 'string'], - 'splheap' => ['name' => 'string'], - 'splmaxheap' => ['name' => 'string'], - 'splminheap' => ['name' => 'string'], - 'splpriorityqueue' => ['name' => 'string'], - 'splqueue' => ['name' => 'string'], - 'splstack' => ['name' => 'string'], - 'streamwrapper' => ['context' => 'resource'], - 'tidy' => ['errorBuffer' => 'string'], - 'tidynode' => [ - 'attribute' => 'array', - 'child' => 'array', - 'column' => 'int', - 'id' => 'int', - 'line' => 'int', - 'name' => 'string', - 'proprietary' => 'bool', - 'type' => 'int', - 'value' => 'string', - ], - 'tokyotyrantexception' => ['code' => 'int'], - 'transliterator' => ['id' => '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', - ], - 'ziparchive' => [ - 'comment' => 'string', - 'filename' => 'string', - 'numFiles' => 'int', - 'status' => 'int', - 'statusSys' => 'int', - ], -]; diff --git a/vendor/phan/phan/src/Phan/Language/NamespaceMapEntry.php b/vendor/phan/phan/src/Phan/Language/NamespaceMapEntry.php deleted file mode 100644 index 0966e71..0000000 --- a/vendor/phan/phan/src/Phan/Language/NamespaceMapEntry.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language; - -use Phan\Language\FQSEN\FullyQualifiedGlobalStructuralElement; -use RuntimeException; - -/** - * Tracks a `use Foo\Bar;` statement inside of a namespace. - */ -class NamespaceMapEntry implements \Serializable -{ - /** - * @var FullyQualifiedGlobalStructuralElement the FQSEN of the - */ - public $fqsen; - - /** - * @var string the original case-sensitive name of the use statement - */ - public $original_name; - - /** - * @var int the line number of the use statement - */ - public $lineno; - - /** - * @var bool has this use statement been referenced during the parse/analysis phase? - */ - public $is_used = false; - - public function __construct( - FullyQualifiedGlobalStructuralElement $fqsen, - string $original_name, - int $lineno - ) { - $this->fqsen = $fqsen; - $this->original_name = $original_name; - $this->lineno = $lineno; - } - - /** - * @return string - */ - public function serialize() - { - return \serialize([ - \get_class($this->fqsen), - (string)$this->fqsen, - $this->original_name, - $this->lineno, - $this->is_used - ]); - } - - /** - * @param string $representation - */ - public function unserialize($representation) - { - list($fqsen_class, $fqsen, $this->original_name, $this->lineno, $this->is_used) = \unserialize($representation); - if (!\is_string($fqsen_class)) { - throw new RuntimeException("Failed to unserialize a string from the representation"); - } - if (!\is_subclass_of($fqsen_class, FullyQualifiedGlobalStructuralElement::class)) { - // Should not happen - throw new RuntimeException("Not a global fqsen: class " . $fqsen_class); - } - $this->fqsen = $fqsen_class::fromFullyQualifiedString($fqsen); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Scope.php b/vendor/phan/phan/src/Phan/Language/Scope.php deleted file mode 100644 index 952ca26..0000000 --- a/vendor/phan/phan/src/Phan/Language/Scope.php +++ /dev/null @@ -1,426 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Language; - -use AssertionError; -use Phan\Config; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\FQSEN\FullyQualifiedPropertyName; -use Phan\Language\Type\TemplateType; - -/** - * Represents the scope of a Context. - * - * This includes the current element which it is found in, - * variables (etc.) found in that scope, - * as well as any functionality to use/modify this information. - * - * A scope is either the global scope or a child scope of another scope. - */ -abstract class Scope -{ - const IN_FUNCTION_LIKE_SCOPE = 0x01; - // If this is set, and neither IN_TRAIT_SCOPE and IN_INTERFACE_SCOPE are set, this is - const IN_CLASS_SCOPE = 0x02; - // If this is set, this is a trait (self::IN_CLASS_SCOPE will also be set) - const IN_TRAIT_SCOPE = 0x04; - // If this is set, this is an interface (self::IN_CLASS_SCOPE will also be set) - const IN_INTERFACE_SCOPE = 0x08; - const IN_CLASS_LIKE_SCOPE = self::IN_CLASS_SCOPE | self::IN_TRAIT_SCOPE | self::IN_INTERFACE_SCOPE; - const IN_PROPERTY_SCOPE = 0x10; - - /** - * @var Scope the parent scope, if this is not the global scope - */ - protected $parent_scope = null; - - /** - * @var FQSEN|null the FQSEN that this scope is within, - * if this scope is within an element such as a function body or class definition. - * - * This is null only in the subclass GlobalScope - */ - protected $fqsen = null; - - /** - * @var int flags - Combination of self::IN_* - * This allows us to check if we are in a class-like scope, function-like scope, etc. without recursing. - */ - protected $flags = 0; - - /** - * @var array<string,Variable> the map of variable names to variables within this scope. - * Some variable definitions must be retrieved from parent scopes. - */ - protected $variable_map = []; - - /** - * @var array<string,TemplateType> - * A map from template type identifiers to the - * TemplateType that parameterizes the generic class - * in this scope. - */ - private $template_type_map = []; - - /** - * @param Scope $parent_scope - * @param ?FQSEN $fqsen - * @param int $flags - */ - public function __construct( - Scope $parent_scope, - $fqsen, - int $flags - ) { - $this->parent_scope = $parent_scope; - $this->fqsen = $fqsen; - $this->flags = $flags; - } - - /** - * @return bool - * True if this scope has a parent scope - * @suppress PhanUnreferencedPublicMethod this was optimized out within the class - */ - public function hasParentScope() : bool - { - return true; - } - - /** - * @return Scope - * Get the parent scope of this scope - */ - public function getParentScope() : Scope - { - return $this->parent_scope; - } - - /** - * @return bool - * True if this scope has an FQSEN - * @suppress PhanUnreferencedPublicMethod - */ - public function hasFQSEN() : bool - { - return $this->fqsen !== null; - } - - /** - * @return FQSEN in which this scope was declared - * (e.g. a FullyQualifiedFunctionName, FullyQualifiedClassName, etc.) - * @suppress PhanPossiblyNullTypeReturn, PhanPartialTypeMismatchReturn callers should call hasFQSEN - */ - public function getFQSEN() - { - return $this->fqsen; - } - - /** - * @return bool - * True if we're in a class-like's scope - */ - public function isInClassScope() : bool - { - return ($this->flags & self::IN_CLASS_LIKE_SCOPE) !== 0; - } - - /** - * True if we're in a class-like's scope and that class-like is a trait. - */ - public function isInTraitScope() : bool - { - return ($this->flags & self::IN_TRAIT_SCOPE) !== 0; - } - - /** - * Checks if we're in an interface's scope. - * @suppress PhanUnreferencedPublicMethod - */ - public function isInInterfaceScope() : bool - { - return ($this->flags & self::IN_INTERFACE_SCOPE) !== 0; - } - - /** - * Returns true if we're in an element scope (i.e. not in the global scope) - */ - public function isInElementScope() : bool - { - return $this->flags !== 0; - } - - /** - * @return bool - * True if we're in a method-like scope - */ - public function isInMethodLikeScope() : bool - { - return ($this->flags & self::IN_CLASS_LIKE_SCOPE) !== 0 && $this->flags & self::IN_FUNCTION_LIKE_SCOPE !== 0; - } - - /** - * @return FullyQualifiedClassName - * Crawl the scope hierarchy to get a class FQSEN. - */ - public function getClassFQSEN() : FullyQualifiedClassName - { - return $this->parent_scope->getClassFQSEN(); - } - - /** - * @return ?FullyQualifiedClassName - * Crawl the scope hierarchy to get a class FQSEN. - */ - public function getClassFQSENOrNull() - { - return $this->parent_scope->getClassFQSENOrNull(); - } - - /** - * @return bool - * True if we're in a property scope - */ - public function isInPropertyScope() : bool - { - return (self::IN_PROPERTY_SCOPE & $this->flags) !== 0; - } - - /** - * @return FullyQualifiedPropertyName - * Crawl the scope hierarchy to get a class FQSEN. - */ - public function getPropertyFQSEN() : FullyQualifiedPropertyName - { - return $this->parent_scope->getPropertyFQSEN(); - } - - /** - * @return bool - * True if we're in a method/function/closure scope - */ - public function isInFunctionLikeScope() : bool - { - return ($this->flags & self::IN_FUNCTION_LIKE_SCOPE) !== 0; - } - - /** - * @return FullyQualifiedMethodName|FullyQualifiedFunctionName - * Crawl the scope hierarchy to get a method FQSEN. - */ - public function getFunctionLikeFQSEN() - { - return $this->parent_scope->getFunctionLikeFQSEN(); - } - - /** - * @return bool - * True if a variable with the given name is defined - * within this scope - */ - public function hasVariableWithName(string $name) : bool - { - return \array_key_exists($name, $this->variable_map); - } - - /** - * Locates the variable with name $name. - * Callers should check $this->hasVariableWithName() first. - */ - public function getVariableByName(string $name) : Variable - { - return $this->variable_map[$name]; - } - - /** - * @return array<string|int,Variable> (keys are variable names, which are *almost* always strings) - * A map from name to Variable in this scope - */ - public function getVariableMap() : array - { - return $this->variable_map; - } - - /** - * @param Variable $variable - * A variable to add to the local scope - * - * @return Scope a clone of this scope with $variable added - */ - public function withVariable(Variable $variable) : Scope - { - $scope = clone($this); - $scope->addVariable($variable); - return $scope; - } - - /** - * @param string $variable_name - * The name of a variable to unset in the local scope - * - * @return Scope - * - * TODO: Make this work properly and merge properly when the variable is in a branch - * - * @suppress PhanUnreferencedPublicMethod unused, but adding to be consistent with `withVariable` - */ - public function withUnsetVariable(string $variable_name) : Scope - { - $scope = clone($this); - $scope->unsetVariable($variable_name); - return $scope; - } - - /** - * @param string $variable_name - * The name of a variable to unset in the local scope - * - * @return void - * - * TODO: Make this work properly and merge properly when the variable is in a branch (BranchScope) - */ - public function unsetVariable(string $variable_name) - { - unset($this->variable_map[$variable_name]); - } - - /** - * Add $variable to the current scope. - * - * @see self::withVariable() for creating a clone of a scope with $variable instead - * @return void - */ - public function addVariable(Variable $variable) - { - // uncomment to debug issues with variadics - /* - if ($variable->isVariadic() && !$variable->isCloneOfVariadic()) { - throw new \Error("Bad variable {$variable->getName()}\n"); - } - */ - $this->variable_map[$variable->getName()] = $variable; - } - - /** - * Add $variable to the set of global variables - * - * @param Variable $variable - * A variable to add to the set of global variables - * - * @return void - */ - public function addGlobalVariable(Variable $variable) - { - $this->parent_scope->addGlobalVariable($variable); - } - - /** - * @return bool - * True if a global variable with the given name exists - */ - public function hasGlobalVariableWithName(string $name) : bool - { - return $this->parent_scope->hasGlobalVariableWithName($name); - } - - /** - * @return Variable - * The global variable with the given name - */ - public function getGlobalVariableByName(string $name) : Variable - { - return $this->parent_scope->getGlobalVariableByName($name); - } - - /** - * @return bool - * True if there are any template types parameterizing a - * generic class in this scope. - */ - public function hasAnyTemplateType() : bool - { - if (!Config::getValue('generic_types_enabled')) { - return false; - } - - return \count($this->template_type_map) > 0 - || $this->parent_scope->hasAnyTemplateType(); - } - - /** - * @return array<string,TemplateType> - * The set of all template types parameterizing this generic - * class - */ - public function getTemplateTypeMap() : array - { - return \array_merge( - $this->template_type_map, - $this->parent_scope->getTemplateTypeMap() - ); - } - - /** - * @return bool - * True if the given template type identifier is defined within - * this context - */ - public function hasTemplateType( - string $template_type_identifier - ) : bool { - - return isset( - $this->template_type_map[$template_type_identifier] - ) || $this->parent_scope->hasTemplateType( - $template_type_identifier - ); - } - - /** - * Adds a template type to the current scope. - * - * The TemplateType is resolved during analysis based on the passed in union types - * for the parameters (e.g. of __construct()) using those template types - * - * @param TemplateType $template_type - * A template type parameterizing the generic class in scope - * - * @return void - */ - public function addTemplateType(TemplateType $template_type) - { - $this->template_type_map[$template_type->getName()] = $template_type; - } - - /** - * @param string $template_type_identifier - * The identifier for a generic type - * - * @return TemplateType - * A TemplateType parameterizing the generic class in scope - */ - public function getTemplateType( - string $template_type_identifier - ) : TemplateType { - - if (!$this->hasTemplateType($template_type_identifier)) { - throw new AssertionError("Cannot get template type with identifier $template_type_identifier"); - } - - return $this->template_type_map[$template_type_identifier] - ?? $this->parent_scope->getTemplateType($template_type_identifier); - } - - /** - * @return string - * A string representation of this scope - */ - public function __toString() : string - { - return $this->getFQSEN() . "\t" . \implode(',', $this->getVariableMap()); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Scope/BranchScope.php b/vendor/phan/phan/src/Phan/Language/Scope/BranchScope.php deleted file mode 100644 index eb55c1d..0000000 --- a/vendor/phan/phan/src/Phan/Language/Scope/BranchScope.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Scope; - -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\Scope; - -/** - * A branch scope represents a scope created by branching off of the current scope - * (e.g. an if/elseif/else statement, a ternary conditional (`?:`) operator, etc. - */ -class BranchScope extends Scope -{ - public function __construct(Scope $scope) - { - parent::__construct($scope, null, $scope->flags); - } - - /** - * @return bool - * True if a variable with the given name is defined - * within this scope - * - * TODO: Allow unsetting a variable within a scope, and properly account for that in this check. - */ - public function hasVariableWithName(string $name) : bool - { - return ( - \array_key_exists($name, $this->variable_map) - || $this->parent_scope->hasVariableWithName($name) - ); - } - - /** - * @return Variable - */ - public function getVariableByName(string $name) : Variable - { - return ( - $this->variable_map[$name] - ?? $this->parent_scope->getVariableByName($name) - ); - } - - /** - * @return array<string|int,Variable> (keys are variable names, which are *almost* always strings) - * A map from name to Variable in this scope - */ - public function getVariableMap() : array - { - return $this->variable_map + $this->parent_scope->getVariableMap(); - } - - /** - * @return FullyQualifiedClassName - * Crawl the scope hierarchy to get a class FQSEN. - */ - public function getClassFQSEN() : FullyQualifiedClassName - { - return $this->parent_scope->getClassFQSEN(); - } - - /** - * @return ?FullyQualifiedClassName - * Crawl the scope hierarchy to get a class FQSEN. - * Return null if there is no class FQSEN. - */ - public function getClassFQSENOrNull() - { - return $this->parent_scope->getClassFQSENOrNull(); - } - - /** - * @return FullyQualifiedMethodName|FullyQualifiedFunctionName - * Get the FQSEN for the closure, method or function we're in - */ - public function getFunctionLikeFQSEN() - { - return $this->parent_scope->getFunctionLikeFQSEN(); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Scope/ClassScope.php b/vendor/phan/phan/src/Phan/Language/Scope/ClassScope.php deleted file mode 100644 index b8e09ab..0000000 --- a/vendor/phan/phan/src/Phan/Language/Scope/ClassScope.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Scope; - -use AssertionError; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Scope; - -/** - * Phan's representation of the scope within a class declaration. - */ -class ClassScope extends ClosedScope -{ - const IN_CLASS_OR_PROPERTY_SCOPE = Scope::IN_CLASS_LIKE_SCOPE | Scope::IN_PROPERTY_SCOPE; - - public function __construct( - Scope $parent_scope, - FullyQualifiedClassName $fqsen, - int $ast_flags - ) { - $this->parent_scope = $parent_scope; - $this->fqsen = $fqsen; - $flags = ($parent_scope->flags & ~self::IN_CLASS_OR_PROPERTY_SCOPE) | Scope::IN_CLASS_SCOPE; - if ($ast_flags & \ast\flags\CLASS_TRAIT) { - $flags |= Scope::IN_TRAIT_SCOPE; - } elseif ($ast_flags & \ast\flags\CLASS_INTERFACE) { - $flags |= Scope::IN_INTERFACE_SCOPE; - } - $this->flags = $flags; - } - - /** - * @return bool - * True if we're in a class scope - * @override - */ - public function isInClassScope() : bool - { - return true; - } - - /** - * @return bool - * True if we're in a class scope - * @override - */ - public function isInPropertyScope() : bool - { - return false; - } - - /** - * @return FullyQualifiedClassName - * Get the FullyQualifiedClassName of the class whose scope - * we're in. - */ - public function getClassFQSEN() : FullyQualifiedClassName - { - $fqsen = $this->getFQSEN(); - - if ($fqsen instanceof FullyQualifiedClassName) { - return $fqsen; - } - - throw new AssertionError("FQSEN must be a FullyQualifiedClassName"); - } - - /** - * @return FullyQualifiedClassName - * Get the FullyQualifiedClassName of the class whose scope - * we're in. This subclass does not return null. - */ - public function getClassFQSENOrNull() - { - $fqsen = $this->getFQSEN(); - - if ($fqsen instanceof FullyQualifiedClassName) { - return $fqsen; - } - - throw new AssertionError("FQSEN must be a FullyQualifiedClassName"); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Scope/ClosedScope.php b/vendor/phan/phan/src/Phan/Language/Scope/ClosedScope.php deleted file mode 100644 index 8d43d7f..0000000 --- a/vendor/phan/phan/src/Phan/Language/Scope/ClosedScope.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Scope; - -use Phan\Language\Scope; - -/** - * ClosedScope represents a scope that does not inherit variables from the parent scope - */ -class ClosedScope extends Scope -{ -} diff --git a/vendor/phan/phan/src/Phan/Language/Scope/ClosureScope.php b/vendor/phan/phan/src/Phan/Language/Scope/ClosureScope.php deleted file mode 100644 index eda7be9..0000000 --- a/vendor/phan/phan/src/Phan/Language/Scope/ClosureScope.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Scope; - -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\Scope; - -/** - * Represents the Scope of a closure declaration, used by a Closure's Context. - * - * TODO: Wrap this with a ClosureLikeScope - */ -class ClosureScope extends FunctionLikeScope -{ - public function __construct( - Scope $parent_scope, - FullyQualifiedFunctionName $fqsen - ) { - $this->parent_scope = $parent_scope; - $this->fqsen = $fqsen; - $this->flags = $parent_scope->flags | Scope::IN_FUNCTION_LIKE_SCOPE; - } - - /** - * The optional FQSEN of an (at)phan-closure-scope annotation. (an annotation used for closures that will be bound to a different class) - * @var FullyQualifiedClassName|null - */ - private $override_class_fqsen = null; - - /** - * Override the class FQSEN inside this closure's scope (with an (at)phan-closure-scope annotation). - * @return void - */ - public function overrideClassFQSEN(FullyQualifiedClassName $fqsen = null) - { - if ($fqsen) { - $this->flags |= Scope::IN_CLASS_SCOPE; - } else { - $this->flags &= ~Scope::IN_CLASS_SCOPE; - } - $this->override_class_fqsen = $fqsen; - } - - /** - * @return FullyQualifiedClassName|null - * If the (at)phan-closure-scope annotation is used, returns the corresponding override class FQSEN. - * Returns the class FQSEN inside this closure's scope (with an (at)phan-closure-scope annotation). - */ - public function getOverrideClassFQSEN() - { - return $this->override_class_fqsen; - } - - /** - * @return FullyQualifiedClassName - * Crawl the scope hierarchy to get a class FQSEN. - */ - public function getClassFQSEN() : FullyQualifiedClassName - { - return $this->override_class_fqsen ?? parent::getClassFQSEN(); - } - - /** - * @return ?FullyQualifiedClassName - * Crawl the scope hierarchy to get a class FQSEN. - */ - public function getClassFQSENOrNull() - { - return $this->override_class_fqsen ?? parent::getClassFQSENOrNull(); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Scope/FunctionLikeScope.php b/vendor/phan/phan/src/Phan/Language/Scope/FunctionLikeScope.php deleted file mode 100644 index a38a6c5..0000000 --- a/vendor/phan/phan/src/Phan/Language/Scope/FunctionLikeScope.php +++ /dev/null @@ -1,90 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Scope; - -use Phan\Language\FQSEN; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\Scope; - -/** - * The scope of a function, method, or closure. - * This has subclasses. - */ -class FunctionLikeScope extends ClosedScope -{ - public function __construct( - Scope $parent_scope, - FQSEN $fqsen - ) { - $this->parent_scope = $parent_scope; - $this->fqsen = $fqsen; - $this->flags = $parent_scope->flags | Scope::IN_FUNCTION_LIKE_SCOPE; - } - - /** - * @return FullyQualifiedClassName - * Crawl the scope hierarchy to get a class FQSEN. - */ - public function getClassFQSEN() : FullyQualifiedClassName - { - return $this->parent_scope->getClassFQSEN(); - } - - /** - * @return ?FullyQualifiedClassName - * Crawl the scope hierarchy to get a class FQSEN. - * Return null if there is no class FQSEN. - */ - public function getClassFQSENOrNull() - { - return $this->parent_scope->getClassFQSENOrNull(); - } - - /** - * @return bool - * True if we're in a function scope - */ - public function isInFunctionLikeScope() : bool - { - return true; - } - - /** - * @return bool - * True if we're in a function scope - */ - public function isInPropertyScope() : bool - { - return false; - } - - /** - * @return bool - * True if we're in a class-like scope - */ - public function isInMethodLikeScope() : bool - { - return ($this->flags & self::IN_CLASS_LIKE_SCOPE) !== 0; - } - - /** - * @return FullyQualifiedMethodName|FullyQualifiedFunctionName - * Get the FQSEN for the closure, method or function we're in - */ - public function getFunctionLikeFQSEN() - { - $fqsen = $this->getFQSEN(); - - if ($fqsen instanceof FullyQualifiedMethodName) { - return $fqsen; - } - - if ($fqsen instanceof FullyQualifiedFunctionName) { - return $fqsen; - } - - throw new \AssertionError("FQSEN must be a function-like FQSEN"); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Scope/GlobalScope.php b/vendor/phan/phan/src/Phan/Language/Scope/GlobalScope.php deleted file mode 100644 index b5e6cc2..0000000 --- a/vendor/phan/phan/src/Phan/Language/Scope/GlobalScope.php +++ /dev/null @@ -1,197 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Scope; - -use AssertionError; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedPropertyName; -use Phan\Language\Scope; - -/** - * Represents the global scope (and stores global variables) - */ -class GlobalScope extends Scope -{ - /** - * Deliberate no-op - */ - public function __construct() - { - } - - /** - * @var array<string,Variable> - * A map from name to variables for all - * variables registered under $GLOBALS. - */ - private static $global_variable_map = []; - - /** - * @return bool - * True if we're in a class scope - */ - public function isInClassScope() : bool - { - return false; - } - - /** - * @return bool - * True if we're in a method/function/closure scope - */ - public function isInFunctionLikeScope() : bool - { - return false; - } - - public function isInElementScope() : bool - { - return false; - } - - public function isInMethodLikeScope() : bool - { - return false; - } - - public function hasAnyTemplateType() : bool - { - return false; - } - - public function getTemplateTypeMap() : array - { - return []; - } - - /** - * @return bool - * True if a variable with the given name is defined - * within this scope - */ - public function hasVariableWithName(string $name) : bool - { - return \array_key_exists($name, self::$global_variable_map); - } - - /** - * @return Variable - */ - public function getVariableByName(string $name) : Variable - { - return self::$global_variable_map[$name]; - } - - /** - * @return array<string|int,Variable> (keys are variable names, which are *almost* always strings) - * A map from name to Variable in this scope - */ - public function getVariableMap() : array - { - return self::$global_variable_map; - } - - /** - * @param Variable $variable - * A variable to add to the local scope - * - * @return Scope - */ - public function withVariable(Variable $variable) : Scope - { - $this->addVariable($variable); - return $this; - } - - /** - * @return void - */ - public function addVariable(Variable $variable) - { - $variable_name = $variable->getName(); - if (Variable::isHardcodedGlobalVariableWithName($variable_name)) { - // Silently ignore globally replacing $_POST, $argv, runkit superglobals, etc. - // with superglobals. - // TODO: Add a warning for incompatible assignments in callers. - return; - } - self::$global_variable_map[$variable->getName()] = $variable; - } - - /** - * @param Variable $variable - * A variable to add to the set of global variables - * - * @return void - */ - public function addGlobalVariable(Variable $variable) - { - $this->addVariable($variable); - } - - /** - * @return bool - * True if a global variable with the given name exists - */ - public function hasGlobalVariableWithName(string $name) : bool - { - return $this->hasVariableWithName($name); - } - - /** - * @return Variable - * The global variable with the given name - */ - public function getGlobalVariableByName(string $name) : Variable - { - return $this->getVariableByName($name); - } - - /** - * @return bool - * True if this scope has a parent scope - */ - public function hasParentScope() : bool - { - return false; - } - - /** - * @return Scope - * Get the parent scope of this scope - */ - public function getParentScope() : Scope - { - throw new AssertionError("Global scope has no parent scope"); - } - - public function getClassFQSEN() : FullyQualifiedClassName - { - throw new AssertionError("Cannot get class FQSEN on scope"); - } - - public function getPropertyFQSEN() : FullyQualifiedPropertyName - { - throw new AssertionError("Cannot get class FQSEN on scope"); - } - - /** - * @return null - */ - public function getClassFQSENOrNull() - { - return null; - } - - public function getFunctionLikeFQSEN() - { - throw new AssertionError("Cannot get method/function/closure FQSEN on scope"); - } - - public function hasTemplateType( - string $unused_template_type_identifier - ) : bool { - return false; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Scope/PropertyScope.php b/vendor/phan/phan/src/Phan/Language/Scope/PropertyScope.php deleted file mode 100644 index 1b9c090..0000000 --- a/vendor/phan/phan/src/Phan/Language/Scope/PropertyScope.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Scope; - -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedPropertyName; -use Phan\Language\Scope; - -/** - * Represents the Scope of the Context of a class's property declaration. - */ -class PropertyScope extends ClosedScope -{ - public function __construct( - Scope $parent_scope, - FullyQualifiedPropertyName $fqsen - ) { - $this->parent_scope = $parent_scope; - $this->fqsen = $fqsen; - $this->flags = $parent_scope->flags; - } - - /** - * @return bool - * True if we're in a property scope - * @override - */ - public function isInPropertyScope() : bool - { - return true; - } - - /** - * @return bool - * True if we're in a class scope (True for properties) - * @override - */ - public function isInClassScope() : bool - { - return true; - } - - /** - * @return FullyQualifiedPropertyName - * Get the FullyQualifiedPropertyName of the class whose scope - * we're in. - * @override - */ - public function getPropertyFQSEN() : FullyQualifiedPropertyName - { - $fqsen = $this->getFQSEN(); - - if ($fqsen instanceof FullyQualifiedPropertyName) { - return $fqsen; - } - - throw new \AssertionError("FQSEN must be a FullyQualifiedPropertyName"); - } - - /** - * @return FullyQualifiedClassName - * Crawl the scope hierarchy to get a class FQSEN. - */ - public function getClassFQSEN() : FullyQualifiedClassName - { - return $this->parent_scope->getClassFQSEN(); - } - - /** - * @return ?FullyQualifiedClassName - * Crawl the scope hierarchy to get a class FQSEN. - * Return null if there is no class FQSEN. - */ - public function getClassFQSENOrNull() - { - return $this->parent_scope->getClassFQSENOrNull(); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Scope/TemplateScope.php b/vendor/phan/phan/src/Phan/Language/Scope/TemplateScope.php deleted file mode 100644 index c9acfc3..0000000 --- a/vendor/phan/phan/src/Phan/Language/Scope/TemplateScope.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Language\Scope; - -use InvalidArgumentException; -use Phan\Language\Scope; -use Phan\Language\Type\TemplateType; - -/** - * A scope that adds (at)template annotations to the current outer scope. - * Used for parsing phpdoc comments. - */ -class TemplateScope extends Scope -{ - /** - * @param TemplateType[] $template_type_list - */ - public function __construct(Scope $other, array $template_type_list) - { - parent::__construct($other, $other->fqsen, $other->flags); - if (\count($template_type_list) === 0) { - throw new InvalidArgumentException("TemplateScope should only be used to add templates"); - } - foreach ($template_type_list as $template_type) { - $this->addTemplateType($template_type); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type.php b/vendor/phan/phan/src/Phan/Language/Type.php deleted file mode 100644 index f1445db..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type.php +++ /dev/null @@ -1,3242 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language; - -use AssertionError; -use ast\flags; -use Closure; -use Error; -use Generator; -use InvalidArgumentException; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Debug\Frame; -use Phan\Exception\EmptyFQSENException; -use Phan\Exception\FQSENException; -use Phan\Exception\InvalidFQSENException; -use Phan\Exception\IssueException; -use Phan\Exception\RecursionDepthException; -use Phan\Issue; -use Phan\Language\Element\Comment\Builder; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type\ArrayShapeType; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\BoolType; -use Phan\Language\Type\CallableDeclarationType; -use Phan\Language\Type\CallableStringType; -use Phan\Language\Type\CallableType; -use Phan\Language\Type\ClassStringType; -use Phan\Language\Type\ClosureDeclarationParameter; -use Phan\Language\Type\ClosureDeclarationType; -use Phan\Language\Type\ClosureType; -use Phan\Language\Type\FalseType; -use Phan\Language\Type\FloatType; -use Phan\Language\Type\FunctionLikeDeclarationType; -use Phan\Language\Type\GenericArrayTemplateKeyType; -use Phan\Language\Type\GenericArrayType; -use Phan\Language\Type\GenericIterableType; -use Phan\Language\Type\GenericMultiArrayType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\IterableType; -use Phan\Language\Type\LiteralIntType; -use Phan\Language\Type\LiteralStringType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NativeType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\ObjectType; -use Phan\Language\Type\ResourceType; -use Phan\Language\Type\ScalarRawType; -use Phan\Language\Type\ScalarType; -use Phan\Language\Type\SelfType; -use Phan\Language\Type\StaticType; -use Phan\Language\Type\StringType; -use Phan\Language\Type\TemplateType; -use Phan\Language\Type\TrueType; -use Phan\Language\Type\VoidType; -use Phan\Library\Tuple5; -use function count; -use function explode; -use function in_array; -use function ltrim; -use function preg_match; -use function strcasecmp; -use function stripos; -use function strtolower; -use function substr; -use function trim; - -/** - * The base class for all of Phan's types. - * A plain Type represents a class instance. - * Separate subclasses exist for NativeType, ArrayType, ScalarType, TemplateType, etc. - * - * Types are immutable. - * - * @phan-file-suppress PhanPartialTypeMismatchArgumentInternal - * phpcs:disable Generic.NamingConventions.UpperCaseConstantName - */ -class Type -{ - use \Phan\Memoize; - - /** - * @var string - * A legal type identifier (e.g. 'int' or 'DateTime') - */ - const simple_type_regex = - '(\??)(?:callable-string|class-string|\\\\?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*)'; - - const simple_noncapturing_type_regex = - '\\\\?(?:callable-string|class-string|[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*)'; - - /** - * @var string - * A legal type identifier (e.g. 'int' or 'DateTime') - */ - const simple_type_regex_or_this = - '(\??)(callable-string|class-string|[a-zA-Z_\x7f-\xff\\\][a-zA-Z0-9_\x7f-\xff\\\]*|\$this)'; - - const shape_key_regex = - '(?:[-.\/^;$%*+_a-zA-Z0-9\x7f-\xff]|\\\\(?:[nrt\\\\]|x[0-9a-fA-F]{2}))+\??'; - - /** - * A literal integer or string. - * - * Note that string literals can only contain a whitelist of characters. - * NOTE: The / is escaped - */ - const noncapturing_literal_regex = - '\??(?:-?(?:0|[1-9][0-9]*)|\'(?:[- ,.\/?:;"!#$%^&*_+=a-zA-Z0-9_\x80-\xff]|\\\\(?:[\'\\\\]|x[0-9a-fA-F]{2}))*\')'; - // '\??(?:-?(?:0|[1-9][0-9]*)|\'(?:[a-zA-Z0-9_])*\')'; - - /** - * @var string - * A legal array entry in an array shape (e.g. 'field:string[]') - * - * @suppress PhanUnreferencedPublicClassConstant - */ - const array_shape_entry_regex_noncapturing = - '(?:' . self::shape_key_regex . ')\s*:\s*(?:' . self::simple_noncapturing_type_regex . '=?)'; - - /** - * @var string - * A legal type identifier matching a type optionally with a [] - * indicating that it's a generic typed array (e.g. 'int[]', - * 'string' or 'Set<DateTime>' or 'array{field:string}') - * - * https://www.debuggex.com/ is useful for a visual description of these regexes - */ - const type_regex = - '(' - . '(?:\??\((?-1)(?:\|(?-1))*\)|' // Recursion: "?(T)" or "(T)" with brackets. Also allow parsing (a|b) within brackets. - . '(?:' - . '\??(?:\\\\?Closure|callable)(\((?:[^()]|(?-1))*\))' // `Closure(...)` can have matching pairs of () inside `...`, recursively - . '(?:\s*:\s*' // optional return type, can be ":T" or ":(T1|T2)" or ": ?(T1|T2)" - . '(?:' - . self::simple_noncapturing_type_regex . '|' // Forbid ambiguity in `Closure():int[]` by disallowing complex return types without '()'. Always parse that as `(Closure():int)[]`. - . '\((?-2)(?:\s*\|\s*(?-2))*\)' - . ')' - . ')?' - . ')|' - . self::noncapturing_literal_regex . '|' - . '(' . self::simple_type_regex . ')' // ?T or T. - . '(?:' - . '<' - . '(' - . '(?-5)(?:\|(?-5))*' - . '(?:\s*,\s*' - . '(?-5)(?:\|(?-5))*' - . ')*' - . ')' - . '>' - . '|' - . '\{(' // Expect either '{' or '<', after a word token. - . '(?:' . self::shape_key_regex . '\s*:\s*(?-6)(?:\|(?-6))*=?)' // {shape_key_regex:<type_regex>} - . '(?:,\s*' . self::shape_key_regex . '\s*:\s*(?-6)(?:\|(?-6))*=?)*' // {shape_key_regex:<type_regex>} - . ')?\})?' - . ')' - . '(?:\[\])*' - . ')'; - - /** - * @var string - * A legal type identifier matching a type optionally with a [] - * indicating that it's a generic typed array (e.g. 'int[]' or '$this[]', - * 'string' or 'Set<DateTime>' or 'array<int>' or 'array<int|string>') - * - * https://www.debuggex.com/ is useful for a visual description of these regexes - */ - const type_regex_or_this = - '(' - . '(' - . '(?:' - . '\??\((?-1)(?:\|(?-1))*\)|' // Recursion: "?(T)" or "(T)" with brackets. Also allow parsing (a|b) within brackets. - . '(?:' - . '\??(?:\\\\?Closure|callable)(\((?:[^()]|(?-1))*\))' // `Closure(...)` can have matching pairs of () inside `...`, recursively - . '(?:\s*:\s*' // optional return type, can be ":T" or ":(T1|T2)" - . '(?:' - . self::simple_noncapturing_type_regex . '|' // Forbid ambiguity in `Closure():int[]` by disallowing complex return types without '()'. Always parse that as `(Closure():int)[]`. - . '\((?-2)(?:\s*\|\s*(?-2))*\)' // Complicated return types can be placed within (). - . ')' - . ')?' - . ')|' - . self::noncapturing_literal_regex . '|' - . '(' . self::simple_type_regex_or_this . ')' // 3 patterns - . '(?:<' - . '(' - . '(?-6)(?:\|(?-6))*' // We use relative references instead of named references so that more than one one type_regex can be used in a regex. - . '(?:\s*,\s*' - . '(?-6)(?:\|(?-6))*' - . ')*' - . ')' - . '>' - . '|' - . '(\{)(' // Expect either '{' or '<', after a word token. Match '{' to disambiguate 'array{}' - . '(?:' . self::shape_key_regex . '\s*:\s*(?-8)(?:\|(?-8))*=?)' // {shape_key_regex:<type_regex>} - . '(?:,\s*' . self::shape_key_regex . '\s*:\s*(?-8)(?:\|(?-8))*=?)*' // {shape_key_regex:<type_regex>} - . ')?\})?' - . ')' - . '(?:\[\])*' - . ')' - . ')'; - - /** - * @var array<string,bool> - For checking if a string is an internal type. This is used for case-insensitive lookup. - */ - const _internal_type_set = [ - 'array' => true, - 'bool' => true, - 'callable' => true, - 'callable-string' => true, - 'class-string' => true, - 'false' => true, - 'float' => true, - 'int' => true, - 'iterable' => true, - 'mixed' => true, - 'null' => true, - 'object' => true, - 'resource' => true, - 'scalar' => true, - 'static' => true, - 'string' => true, - 'true' => true, - 'void' => true, - ]; - - /** - * These can currently be used in phpdoc but not real types. - * This is a subset of self::_internal_type_set - * - * https://secure.php.net/manual/en/reserved.other-reserved-words.php - * > The following list of words have had soft reservations placed on them. - * > Whilst they may still be used as class, interface, and trait names (as well as in namespaces), - * > usage of them is highly discouraged since they may be used in future versions of PHP. - * - * (numeric not supported yet) - */ - const _soft_internal_type_set = [ - 'false' => true, - 'mixed' => true, - 'object' => true, - 'resource' => true, - 'scalar' => true, - 'true' => true, - ]; - - // Distinguish between multiple ways types can be created. - // e.g. integer and resource are phpdoc types, but they aren't actual types. - - /** For types created from a type in an AST node, e.g. `int $x` */ - const FROM_NODE = 0; - - /** For types copied from another type, e.g. `$x = $y` gets types from $y */ - const FROM_TYPE = 1; - - /** For types copied from phpdoc, e.g. `(at)param integer $x` */ - const FROM_PHPDOC = 2; - - /** To distinguish NativeType subclasses and classes with the same name. Overridden in subclasses */ - const KEY_PREFIX = ''; - - /** To normalize combinations of union types */ - const _bit_false = (1 << 0); - const _bit_true = (1 << 1); - const _bit_bool_combination = self::_bit_false | self::_bit_true; - const _bit_nullable = (1 << 2); - - /** - * @var string - * The namespace of this type such as '' (for internal types such as 'int') - * or '\' or '\Phan\Language' - */ - protected $namespace = null; - - /** - * @var string - * The name of this type such as 'int' or 'MyClass' - */ - protected $name = ''; - - /** - * @var array<int,UnionType> - * A possibly empty list of concrete types that - * act as parameters to this type if it is a templated - * type. - */ - protected $template_parameter_type_list = []; - - /** - * @var bool - * True if this type is nullable, else false - */ - protected $is_nullable = false; - - /** - * @var array<string,Type> - Maps a key to a Type or subclass of Type - */ - private static $canonical_object_map = []; - - /** - * @param string $namespace - * The (optional) namespace of the type such as '\' - * or '\Phan\Language'. - * - * @param string $name - * The name of the type such as 'int' or 'MyClass' - * - * @param array<int,UnionType> $template_parameter_type_list - * A (possibly empty) list of template parameter types - * - * @param bool $is_nullable - * True if this type can be null, false if it cannot - * be null. - */ - protected function __construct( - string $namespace, - string $name, - $template_parameter_type_list, - bool $is_nullable - ) { - $this->namespace = $namespace; - $this->name = $name; - $this->template_parameter_type_list = $template_parameter_type_list; - $this->is_nullable = $is_nullable; - } - - // Override two magic methods to ensure that Type isn't being cloned accidentally. - // (It has previously been accidentally cloned in unit tests by phpunit (global_state helper), - // which saves and restores some static properties) - - /** @throws Error this should not be called accidentally */ - public function __wakeup() - { - \debug_print_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); - throw new Error("Cannot unserialize Type '$this'"); - } - - /** @throws Error this should not be called accidentally */ - public function __clone() - { - throw new Error("Cannot clone Type '$this'"); - } - - /** - * @param string $namespace - * The (optional) namespace of the type such as '\' - * or '\Phan\Language'. - * - * @param string $type_name - * The name of the type such as 'int' or 'MyClass' - * - * @param array<int,UnionType> $template_parameter_type_list - * A (possibly empty) list of template parameter types - * - * @param bool $is_nullable - * True if this type can be null, false if it cannot - * be null. - * - * @param int $source - * Type::FROM_NODE, Type::FROM_TYPE, or Type::FROM_PHPDOC - * (E.g. outside of phpdoc, "integer" would be a class name) - * - * @return Type - * A single canonical instance of the given type. - * - * @throws AssertionError if an unparsable string is passed in - */ - protected static function make( - string $namespace, - string $type_name, - array $template_parameter_type_list, - bool $is_nullable, - int $source - ) : Type { - - $namespace = \trim($namespace); - - if ('\\' === $namespace && $source) { - $type_name = self::canonicalNameFromName($type_name); - } - - // If this looks like a generic type string, explicitly - // make it as such - $pos = \strrpos($type_name, '[]'); - if ($pos > 0) { - return GenericArrayType::fromElementType(Type::make( - $namespace, - \substr($type_name, 0, $pos), - $template_parameter_type_list, - false, - $source - ), $is_nullable, GenericArrayType::KEY_MIXED); - } - - if ($namespace === '') { - throw new AssertionError("Namespace cannot be empty"); - } - - if ('\\' !== $namespace[0]) { - throw new AssertionError("Namespace must be fully qualified"); - } - - if ($type_name === '') { - throw new AssertionError("Type name cannot be empty"); - } - - if (\strpos($type_name, '|') !== false) { - throw new AssertionError("Type name '$type_name' may not contain a pipe"); - } - - // Create a canonical representation of the - // namespace and name - if ('\\' === $namespace && $source === Type::FROM_PHPDOC) { - $type_name = self::canonicalNameFromName($type_name); - } - - // Make sure we only ever create exactly one - // object for any unique type - $key = ($is_nullable ? '?' : '') . static::KEY_PREFIX . $namespace . '\\' . $type_name; - - if ($template_parameter_type_list) { - $key .= '<' . \implode(',', \array_map(static function (UnionType $union_type) : string { - return $union_type->__toString(); - }, $template_parameter_type_list)) . '>'; - } - - $key = strtolower($key); - - $value = self::$canonical_object_map[$key] ?? null; - if (!$value) { - if ($namespace === '\\') { - switch (strtolower($type_name)) { - case 'closure': - $value = new ClosureType( - $namespace, - 'Closure', - $template_parameter_type_list, - $is_nullable - ); - break; - case 'callable': - $value = new CallableType( - $namespace, - 'callable', - $template_parameter_type_list, - $is_nullable - ); - break; - case 'callable-string': - $value = new CallableStringType( - $namespace, - 'callable-string', - $template_parameter_type_list, - $is_nullable - ); - break; - case 'class-string': - $value = new ClassStringType( - $namespace, - 'class-string', - $template_parameter_type_list, - $is_nullable - ); - break; - } - } - if (!$value) { - $value = new static( - $namespace, - $type_name, - $template_parameter_type_list, - $is_nullable - ); - // FIXME Phan warns that array<string,static> can't be assigned to array<string,Type> - '@phan-var Type $value'; - } - self::$canonical_object_map[$key] = $value; - } - return $value; - } - - /** - * Call this before forking and analysis phase, when in daemon mode. - * This may hurt performance. - * - * It's important to clear asExpandedTypes(), - * as the parent classes may have changed since the last parse attempt. - * - * This gets called immediately after the parse phase but before the analysis phase. - * - * @return void - */ - public static function clearAllMemoizations() - { - // Clear anything that has memoized state - foreach (self::$canonical_object_map as $type) { - $type->memoizeFlushAll(); - } - } - - - /** - * Constructs a type based on the input type and the provided mapping - * from template type identifiers to concrete union types. - * - * @param Type $type - * The base type of this generic type referencing a - * generic class - * - * @param array<int,UnionType> $template_parameter_type_list - * A map from a template type identifier to a - * concrete union type - */ - public static function fromType( - Type $type, - array $template_parameter_type_list - ) : Type { - return self::make( - $type->getNamespace(), - $type->getName(), - $template_parameter_type_list, - $type->is_nullable, - Type::FROM_TYPE - ); - } - - /** - * @param mixed $object - * @return Type - * Get a type for the given object. Equivalent to Type::fromObject($object)->asNonLiteralType() - */ - public static function nonLiteralFromObject($object) : Type - { - static $type_map = null; - if ($type_map === null) { - $type_map = [ - 'integer' => IntType::instance(false), - 'boolean' => BoolType::instance(false), - 'double' => FloatType::instance(false), - 'string' => StringType::instance(false), - 'object' => ObjectType::instance(false), - 'NULL' => NullType::instance(false), - 'array' => ArrayType::instance(false), - 'resource' => ResourceType::instance(false), // For inferring the type of constants STDIN, etc. - ]; - } - // gettype(2) doesn't return 'int', it returns 'integer', so use FROM_PHPDOC - return $type_map[\gettype($object)]; - } - - /** - * Get a type for the given object - * @param mixed $object - * @throws AssertionError if the type was unexpected - */ - public static function fromObject($object) : Type - { - switch (\gettype($object)) { - case 'integer': - '@phan-var int $object'; - return LiteralIntType::instanceForValue($object, false); - case 'string': - '@phan-var string $object'; - return LiteralStringType::instanceForValue($object, false); - case 'NULL': - return NullType::instance(false); - case 'double': - return FloatType::instance(false); - case 'object': - // TODO: Figure out why this is a false positive - // @phan-suppress-next-line PhanTypeMismatchArgumentInternal, PhanThrowTypeMismatchForCall - return Type::fromFullyQualifiedString('\\' . \get_class($object)); - case 'boolean': - return $object ? TrueType::instance(false) : FalseType::instance(false); - case 'array': - return ArrayType::instance(false); - case 'resource': - return ResourceType::instance(false); // For inferring the type of constants STDIN, etc. - default: - throw new \AssertionError("Unknown type " . \gettype($object)); - } - } - - /** - * Get a type for the given object. - * If $object is an array, return an ArrayShapeType (with nested fields) instead of an ArrayType - * @param mixed $object - * @throws AssertionError if the type was unexpected - */ - public static function fromObjectExtended($object) : Type - { - if (\is_array($object)) { - return self::fromArray($object); - } - return self::fromObject($object); - } - - /** - * Get a type for the given array as an array shape, recursively. - * @param array<mixed,mixed> $array - * @throws AssertionError if the type was unexpected - */ - public static function fromArray(array $array) : ArrayShapeType - { - return ArrayShapeType::fromFieldTypes( - \array_map( - /** - * @param mixed $value - * @return UnionType - */ - static function ($value) { - return self::fromObjectExtended($value)->asUnionType(); - }, - $array - ), - false - ); - } - - /** - * @param string $type_name - * The name of the internal type such as 'int' - * - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass - * false - * - * @param int $source Type::FROM_* - * - * @return Type - * Get a type for the given type name - * - * @throws AssertionError if the type was unexpected - */ - public static function fromInternalTypeName( - string $type_name, - bool $is_nullable, - int $source - ) : Type { - - // If this is a generic type (like int[]), return - // a generic of internal types. - // - // When there's a nullability operator such as in - // `?int[]`, it applies to the array rather than - // the int - if (false !== ($pos = \strrpos($type_name, '[]'))) { - return GenericArrayType::fromElementType( - self::fromInternalTypeName( - \substr($type_name, 0, $pos), - false, - $source - ), - $is_nullable, - GenericArrayType::KEY_MIXED - ); - } - - $type_name = - self::canonicalNameFromName($type_name); - - // TODO: Is this worth optimizing into a lookup table? - switch (strtolower($type_name)) { - case 'array': - return ArrayType::instance($is_nullable); - case 'bool': - return BoolType::instance($is_nullable); - case 'callable': - return CallableType::instance($is_nullable); - case 'callable-string': - return CallableStringType::instance($is_nullable); - case 'class-string': - return ClassStringType::instance($is_nullable); - case 'closure': - return ClosureType::instance($is_nullable); - case 'false': - return FalseType::instance($is_nullable); - case 'float': - return FloatType::instance($is_nullable); - case 'int': - return IntType::instance($is_nullable); - case 'mixed': - return MixedType::instance($is_nullable); - case 'null': - return NullType::instance($is_nullable); - case 'object': - return ObjectType::instance($is_nullable); - case 'resource': - return ResourceType::instance($is_nullable); - case 'scalar': - return ScalarRawType::instance($is_nullable); - case 'string': - return StringType::instance($is_nullable); - case 'true': - return TrueType::instance($is_nullable); - case 'void': - return VoidType::instance(false); - case 'iterable': - return IterableType::instance($is_nullable); - case 'static': - return StaticType::instance($is_nullable); - case '$this': - return StaticType::instance($is_nullable); - } - - if (\substr($type_name, 0, 1) === '?') { - // @phan-suppress-next-line PhanPossiblyFalseTypeArgument - return self::fromInternalTypeName(\substr($type_name, 1), true, $source); - } - throw new AssertionError("No internal type with name $type_name"); - } - - /** - * @param string $namespace - * A fully qualified namespace - * - * @param string $type_name - * The name of the type - * - * @return Type - * A type representing the given namespace and type - * name. - * - * @param bool $is_nullable - * True if this type can be null, false if it cannot - * be null. - */ - public static function fromNamespaceAndName( - string $namespace, - string $type_name, - bool $is_nullable - ) : Type { - return self::make($namespace, $type_name, [], $is_nullable, Type::FROM_NODE); - } - - /** - * Creates a type for the ReflectionType of a parameter, return value, etc. - */ - public static function fromReflectionType( - \ReflectionType $reflection_type - ) : Type { - - return self::fromStringInContext( - $reflection_type->__toString(), - new Context(), - Type::FROM_NODE - ); - } - - /** - * @param string $fully_qualified_string - * A fully qualified type name - * - * - * @return Type - * The type with that fully qualified type name (cached for efficiency) - * - * @throws InvalidArgumentException if type name was invalid - * - * @throws FQSENException - */ - public static function fromFullyQualifiedString( - string $fully_qualified_string - ) : Type { - static $type_cache = []; - return $type_cache[$fully_qualified_string] ?? ($type_cache[$fully_qualified_string] = self::fromFullyQualifiedStringInner($fully_qualified_string)); - } - - /** - * Extracts the parts of this Type from the passed in fully qualified type name. - * Callers should ensure that the type regex accepts $fully_qualified_string - * - * @throws InvalidArgumentException if namespace is missing from something that should have a namespace - * @suppress PhanPossiblyFalseTypeArgument, PhanPossiblyFalseTypeArgumentInternal - * - * @throws FQSENException - */ - protected static function fromFullyQualifiedStringInner( - string $fully_qualified_string - ) : Type { - if ($fully_qualified_string === '') { - throw new InvalidArgumentException("Type cannot be empty"); - } - while (\substr($fully_qualified_string, -1) === ')') { - if ($fully_qualified_string[0] === '?') { - $fully_qualified_string = '?' . \substr($fully_qualified_string, 2, -1); - } else { - $fully_qualified_string = \substr($fully_qualified_string, 1, -1); - } - } - if (\substr($fully_qualified_string, -2) === '[]') { - if ($fully_qualified_string[0] === '?') { - $is_nullable = true; - $fully_qualified_substring = \substr($fully_qualified_string, 1, -2); - } else { - $is_nullable = false; - $fully_qualified_substring = \substr($fully_qualified_string, 0, -2); - } - return GenericArrayType::fromElementType( - // @phan-suppress-next-line PhanThrowTypeMismatchForCall - Type::fromFullyQualifiedString($fully_qualified_substring), - $is_nullable, - GenericArrayType::KEY_MIXED - ); - } - - $tuple = self::typeStringComponents($fully_qualified_string); - - $namespace = $tuple->_0; - $type_name = $tuple->_1; - $template_parameter_type_name_list = $tuple->_2; - $is_nullable = $tuple->_3; - $shape_components = $tuple->_4; - if (\preg_match('/^(' . self::noncapturing_literal_regex . ')$/', $type_name)) { - return self::fromEscapedLiteralScalar($type_name); - } - if (\is_array($shape_components)) { - if (\strcasecmp($type_name, 'array') === 0) { - return ArrayShapeType::fromFieldTypes( - self::shapeComponentStringsToTypes($shape_components, new Context(), Type::FROM_NODE), - $is_nullable - ); - } - if ($type_name === 'Closure' || $type_name === 'callable') { - return self::fromFullyQualifiedFunctionLike($type_name === 'Closure', $shape_components, $is_nullable); - } - } - - if (!$namespace) { - if (count($template_parameter_type_name_list) > 0) { - if (\strcasecmp($type_name, 'array') === 0) { - // template parameter type list - $template_parameter_type_list = self::createTemplateParameterTypeList($template_parameter_type_name_list); - return self::parseGenericArrayTypeFromTemplateParameterList($template_parameter_type_list, $is_nullable); - } elseif (\strcasecmp($type_name, 'iterable') === 0) { - // template parameter type list - $template_parameter_type_list = self::createTemplateParameterTypeList($template_parameter_type_name_list); - return self::parseGenericIterableTypeFromTemplateParameterList($template_parameter_type_list, $is_nullable); - } - } - return self::fromInternalTypeName( - $fully_qualified_string, - $is_nullable, - Type::FROM_NODE - ); - } - - // Map the names of the types to actual types in the - // template parameter type list - $template_parameter_type_list = self::createTemplateParameterTypeList($template_parameter_type_name_list); - - if (0 !== \strpos($namespace, '\\')) { - $namespace = '\\' . $namespace; - } - - if ($type_name === '') { - throw new EmptyFQSENException("Type was not fully qualified", $fully_qualified_string); - } - if ($namespace === '') { - throw new InvalidFQSENException("Type was not fully qualified", $fully_qualified_string); - } - - return self::make( - $namespace, - $type_name, - $template_parameter_type_list, - $is_nullable, - Type::FROM_NODE - ); - } - - private static function fromEscapedLiteralScalar(string $escaped_literal) : ScalarType - { - $is_nullable = $escaped_literal[0] === '?'; - if ($is_nullable) { - $escaped_literal = \substr($escaped_literal, 1); - } - if ($escaped_literal[0] === "'") { - // @phan-suppress-next-line PhanPossiblyFalseTypeArgument - return LiteralStringType::fromEscapedString($escaped_literal, $is_nullable); - } - $value = \filter_var($escaped_literal, \FILTER_VALIDATE_INT); - if (\is_int($value)) { - return LiteralIntType::instanceForValue($value, $is_nullable); - } - return FloatType::instance($is_nullable); - } - - /** - * @param array<int,string> $template_parameter_type_name_list - * @return array<int,UnionType> - */ - private static function createTemplateParameterTypeList(array $template_parameter_type_name_list) - { - return \array_map(static function (string $type_name) : UnionType { - return UnionType::fromFullyQualifiedString($type_name); - }, $template_parameter_type_name_list); - } - - /** - * @param bool $is_closure_type - * @param array<int,string> $shape_components - * @param bool $is_nullable - * @throws AssertionError if creating a closure/callable from the arguments failed - * @suppress PhanPossiblyFalseTypeArgument, PhanPossiblyFalseTypeArgumentInternal - */ - private static function fromFullyQualifiedFunctionLike( - bool $is_closure_type, - array $shape_components, - bool $is_nullable - ) : FunctionLikeDeclarationType { - if (count($shape_components) === 0) { - // The literal int '0' is a valid union type, but it's falsey, so check the count instead. - // shouldn't happen - throw new AssertionError("Expected at least one component of a closure phpdoc type"); - } - $return_type = \array_pop($shape_components); - if ($return_type[0] === '(' && \substr($return_type, -1) === ')') { - // TODO: Maybe catch that in UnionType parsing instead - $return_type = \substr($return_type, 1, -1); - } - $params = self::closureParamComponentStringsToParams($shape_components, new Context(), Type::FROM_NODE); - $return_type = UnionType::fromStringInContext($return_type, new Context(), Type::FROM_NODE); - - if ($is_closure_type) { - return new ClosureDeclarationType(new Context(), $params, $return_type, false, $is_nullable); - } else { - return new CallableDeclarationType(new Context(), $params, $return_type, false, $is_nullable); - } - } - /** - * @param array<int,UnionType> $template_parameter_type_list - * @param bool $is_nullable - */ - private static function parseGenericArrayTypeFromTemplateParameterList( - array $template_parameter_type_list, - bool $is_nullable - ) : ArrayType { - $template_count = count($template_parameter_type_list); - if ($template_count > 2) { - return ArrayType::instance($is_nullable); - } - // array<T> or array<key, T> - $types = $template_parameter_type_list[$template_count - 1]->getTypeSet(); - if ($template_count === 2) { - if (count($types) === 1 && $template_parameter_type_list[0]->hasTemplateType()) { - return GenericArrayTemplateKeyType::fromTemplateAndElementType( - // @phan-suppress-next-line PhanPossiblyFalseTypeArgument - \reset($types), - $is_nullable, - $template_parameter_type_list[0] - ); - } - $key_type = GenericArrayType::keyTypeFromUnionTypeValues($template_parameter_type_list[0]); - } else { - $key_type = GenericArrayType::KEY_MIXED; - } - - if (count($types) === 1) { - return GenericArrayType::fromElementType( - // @phan-suppress-next-line PhanPossiblyFalseTypeArgument - \reset($types), - $is_nullable, - $key_type - ); - } elseif (count($types) > 1) { - return new GenericMultiArrayType( - $types, - $is_nullable, - $key_type - ); - } - return ArrayType::instance($is_nullable); - } - - /** - * @param array<int,UnionType> $template_parameter_type_list - * @param bool $is_nullable - */ - private static function parseGenericIterableTypeFromTemplateParameterList( - array $template_parameter_type_list, - bool $is_nullable - ) : Type { - $template_count = count($template_parameter_type_list); - if ($template_count <= 2) { // iterable<T> or iterable<key, T> - $key_union_type = ($template_count === 2) - ? $template_parameter_type_list[0] - : UnionType::empty(); - $value_union_type = $template_parameter_type_list[$template_count - 1]; - return GenericIterableType::fromKeyAndValueTypes($key_union_type, $value_union_type, $is_nullable); - } - return IterableType::instance($is_nullable); - } - - /** - * @param array<int,UnionType> $template_parameter_type_list - * @param bool $is_nullable - */ - private static function parseClassStringTypeFromTemplateParameterList( - array $template_parameter_type_list, - bool $is_nullable - ) : Type { - $template_count = count($template_parameter_type_list); - if ($template_count === 1) { - return new ClassStringType( - '', - 'class-string', - $template_parameter_type_list, - $is_nullable - ); - } - return ClassStringType::instance($is_nullable); - } - - /** - * @param string $string - * A string representing a type - * - * @param Context $context - * The context in which the type string was - * found - * - * @param int $source - * Type::FROM_NODE, Type::FROM_TYPE, or Type::FROM_PHPDOC - * - * @param ?CodeBase $code_base - * May be provided to resolve 'parent' in the context - * (e.g. if parsing complex phpdoc). - * Unnecessary in most use cases. - * - * @return Type - * Parse a type from the given string - * - * @suppress PhanPossiblyFalseTypeArgument, PhanPossiblyFalseTypeArgumentInternal - */ - public static function fromStringInContext( - string $string, - Context $context, - int $source, - CodeBase $code_base = null - ) : Type { - if ($string === '') { - throw new AssertionError("Type cannot be empty"); - } - while (\substr($string, -1) === ')') { - if ($string[0] === '?') { - if ($string[1] !== '(') { - // Account for the Closure(params...):return syntax - break; - } - $string = '?' . \substr($string, 2, -1); - } else { - if ($string[0] !== '(') { - break; - } - $string = \substr($string, 1, -1); - } - } - - if (\substr($string, -2) === '[]') { - if ($string[0] === '?') { - $is_nullable = true; - $substring = \substr($string, 1, -2); - } else { - $is_nullable = false; - $substring = \substr($string, 0, -2); - } - if ($substring === '') { - return ArrayType::instance($is_nullable); - } - $types = UnionType::fromStringInContext( - $substring, - $context, - $source, - $code_base - ); - - $type_set = $types->getTypeSet(); - if (count($type_set) === 1) { - return GenericArrayType::fromElementType( - \reset($type_set), - $is_nullable, - GenericArrayType::KEY_MIXED - ); - } else { - return new GenericMultiArrayType( - $type_set, - $is_nullable, - GenericArrayType::KEY_MIXED - ); - } - } - - // If our scope has a generic type identifier defined on it - // that matches the type string, return that type. - if ($source === Type::FROM_PHPDOC && $context->getScope()->hasTemplateType(ltrim($string, '?'))) { - return $context->getScope()->getTemplateType(ltrim($string, '?'))->withIsNullable(substr($string, 0, 1) === '?'); - } - - // Extract the namespace, type and parameter type name list - $tuple = self::typeStringComponents($string); - - $namespace = $tuple->_0; - $type_name = $tuple->_1; - $template_parameter_type_name_list = $tuple->_2; - $is_nullable = $tuple->_3; - $shape_components = $tuple->_4; - - - if (\preg_match('/^(' . self::noncapturing_literal_regex . ')$/', $type_name)) { - return self::fromEscapedLiteralScalar($type_name); - } - - if (\is_array($shape_components)) { - if (\strcasecmp($type_name, 'array') === 0) { - return ArrayShapeType::fromFieldTypes( - self::shapeComponentStringsToTypes($shape_components, $context, $source, $code_base), - $is_nullable - ); - } - if ($type_name === 'Closure' || $type_name === 'callable') { - if ($type_name === 'Closure' && $code_base !== null) { - self::checkClosureString($code_base, $context, $string); - } - return self::fromFunctionLikeInContext($type_name === 'Closure', $shape_components, $context, $source, $is_nullable); - } - } - - // Map the names of the types to actual types in the - // template parameter type list - $template_parameter_type_list = - \array_map(static function (string $type_name) use ($code_base, $context, $source) : UnionType { - return UnionType::fromStringInContext($type_name, $context, $source, $code_base); - }, $template_parameter_type_name_list); - - // @var bool - // True if this type name if of the form 'C[]' - $is_generic_array_type = - self::isGenericArrayString($type_name); - - // If this is a generic array type, get the name of - // the type of each element - $non_generic_array_type_name = $type_name; - if ($is_generic_array_type - && false !== ($pos = \strrpos($type_name, '[]')) - ) { - $non_generic_array_type_name = - \substr($type_name, 0, $pos); - } - - // Check to see if the type name is mapped via - // a using clause. - // - // Gotta check this before checking for native types - // because there are monsters out there that will - // remap the names via things like `use \Foo\String`. - $non_generic_partially_qualified_array_type_name = - $non_generic_array_type_name; - if ($namespace) { - $non_generic_partially_qualified_array_type_name = - $namespace . '\\' . $non_generic_partially_qualified_array_type_name; - } - - if ($is_generic_array_type && false !== \strrpos($non_generic_array_type_name, '[]')) { - return GenericArrayType::fromElementType( - Type::fromStringInContext($non_generic_partially_qualified_array_type_name, $context, $source), - $is_nullable, - GenericArrayType::KEY_MIXED - ); - } - if (\substr($non_generic_partially_qualified_array_type_name, 0, 1) !== '\\' && $context->hasNamespaceMapFor( - \ast\flags\USE_NORMAL, - $non_generic_partially_qualified_array_type_name - )) { - $fqsen = - $context->getNamespaceMapFor( - \ast\flags\USE_NORMAL, - $non_generic_partially_qualified_array_type_name - ); - - if ($is_generic_array_type) { - return GenericArrayType::fromElementType( - Type::make( - $fqsen->getNamespace(), - $fqsen->getName(), - $template_parameter_type_list, - false, - $source - ), - $is_nullable, - GenericArrayType::KEY_MIXED - ); - } - - return Type::make( - $fqsen->getNamespace(), - $fqsen->getName(), - $template_parameter_type_list, - $is_nullable, - $source - ); - } - - // If this was a fully qualified type, we're all - // set - if ($namespace && $namespace[0] === '\\') { - return self::make( - $namespace, - $type_name, - $template_parameter_type_list, - $is_nullable, - $source - ); - } - - if (self::isInternalTypeString($type_name, $source)) { - if (count($template_parameter_type_list) > 0) { - switch (\strtolower($type_name)) { - case 'array': - return self::parseGenericArrayTypeFromTemplateParameterList($template_parameter_type_list, $is_nullable); - case 'iterable': - return self::parseGenericIterableTypeFromTemplateParameterList($template_parameter_type_list, $is_nullable); - case 'class-string': - return self::parseClassStringTypeFromTemplateParameterList($template_parameter_type_list, $is_nullable); - } - // TODO: Warn about unrecognized types. - } - return self::fromInternalTypeName($type_name, $is_nullable, $source); - } - - // Things like `self[]` or `$this[]` - if ($is_generic_array_type - && self::isSelfTypeString($non_generic_array_type_name) - && $context->isInClassScope() - ) { - // The element type can be nullable. - // Independently, the array of elements can also be nullable. - if (stripos($non_generic_array_type_name, 'parent') !== false) { - // Will throw if $code_base is null or there is no parent type - $element_type = self::maybeFindParentType($non_generic_array_type_name[0] === '?', $context, $code_base); - } else { - // Equivalent to getClassFQSEN()->asType() but slightly faster (this is frequently used) - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - $element_type = self::fromFullyQualifiedString( - $context->getClassFQSEN()->__toString() - ); - } - - return GenericArrayType::fromElementType( - $element_type, - $is_nullable, - GenericArrayType::KEY_MIXED - ); - } - - // If this is a type referencing the current class - // in scope such as 'self' or 'static', return that. - if (self::isSelfTypeString($type_name) - && $context->isInClassScope() - ) { - if (stripos($type_name, 'parent') !== false) { - // Will throw if $code_base is null or there is no parent type - return self::maybeFindParentType($is_nullable, $context, $code_base); - } - if ($source === self::FROM_PHPDOC && $context->getScope()->isInTraitScope()) { - return SelfType::instance($is_nullable); - } - // Equivalent to getClassFQSEN()->asType()->withIsNullable but slightly faster (this is frequently used) - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - return self::fromFullyQualifiedString( - $context->getClassFQSEN()->__toString() - )->withIsNullable($is_nullable); - } - - // Merge the current namespace with the given relative - // namespace - $context_namespace = $context->getNamespace(); - if ($context_namespace) { - if ($namespace) { - $namespace = \rtrim($context_namespace, '\\') . '\\' . $namespace; - } else { - $namespace = $context_namespace; - } - } else { - $namespace = '\\' . $namespace; - } - - // Attach the context's namespace to the type name - return self::make( - $namespace, - $type_name, - $template_parameter_type_list, - $is_nullable, - $source - ); - } - - - private static function checkClosureString( - CodeBase $code_base, - Context $context, - string $string - ) { - // Note: Because of the regex, the namespace should be either empty or '\\' - if (preg_match('/^\??\\\\/', $string) > 0) { - // This is fully qualified - return; - } - // This check is probably redundant, we can't parse - if ($context->hasNamespaceMapFor( - \ast\flags\USE_NORMAL, - 'Closure' - )) { - $fqsen = $context->getNamespaceMapFor( - \ast\flags\USE_NORMAL, - 'Closure' - ); - $namespace = $fqsen->getNamespace(); - } else { - $namespace = $context->getNamespace(); - } - if (($namespace ?: '\\') !== '\\') { - Issue::maybeEmit( - $code_base, - $context, - Issue::CommentAmbiguousClosure, - $context->getLineNumberStart(), - $string, - $namespace . '\\Closure' - ); - } - } - /** - * @throws IssueException (TODO: Catch, emit, and proceed? - */ - private static function maybeFindParentType(bool $is_nullable, Context $context, CodeBase $code_base = null) : Type - { - if ($code_base === null) { - return MixedType::instance($is_nullable); - } - $parent_type = UnionTypeVisitor::findParentType($context, $code_base); - if (!$parent_type) { - return MixedType::instance($is_nullable); - } - - return $parent_type->withIsNullable($is_nullable); - } - - /** - * @param bool $is_closure_type - * @param array<int,string> $shape_components - * @param Context $context - * @param int $source - * @param bool $is_nullable - * @throws AssertionError if the components were somehow invalid - * @suppress PhanPossiblyFalseTypeArgument - */ - private static function fromFunctionLikeInContext( - bool $is_closure_type, - array $shape_components, - Context $context, - int $source, - bool $is_nullable - ) : FunctionLikeDeclarationType { - $return_type = \array_pop($shape_components); - if (!$return_type) { - throw new AssertionError("Expected a return type"); - } - if ($return_type[0] === '(' && \substr($return_type, -1) === ')') { - $return_type = \substr($return_type, 1, -1); - } - $params = self::closureParamComponentStringsToParams($shape_components, $context, $source); - $return = UnionType::fromStringInContext($return_type, $context, $source); - if ($is_closure_type) { - return new ClosureDeclarationType($context, $params, $return, false, $is_nullable); - } else { - return new CallableDeclarationType($context, $params, $return, false, $is_nullable); - } - } - - /** - * @param array<string|int,string> $shape_components Maps field keys (integers or strings) to the corresponding type representations - * @param Context $context - * @param int $source - * @param ?CodeBase $code_base for resolving 'parent' - * @return array<string|int,UnionType> The types for the representations of types, in the given $context - */ - private static function shapeComponentStringsToTypes(array $shape_components, Context $context, int $source, CodeBase $code_base = null) : array - { - $result = []; - foreach ($shape_components as $key => $component_string) { - if (\is_string($key) && \strpos($key, '\\') !== false) { - $key = ArrayShapeType::unescapeKey($key); - } - if (\is_string($key) && \substr($key, -1) === '?') { - if (\substr($component_string, -1) === '=') { - $component_string = \substr($component_string, 0, -1); - } - $key = \substr($key, 0, -1); - $result[$key] = UnionType::fromStringInContext($component_string, $context, $source, $code_base)->withIsPossiblyUndefined(true); - } elseif (\substr($component_string, -1) === '=') { - $component_string = \substr($component_string, 0, -1); - $result[$key] = UnionType::fromStringInContext($component_string, $context, $source, $code_base)->withIsPossiblyUndefined(true); - } else { - $result[$key] = UnionType::fromStringInContext($component_string, $context, $source, $code_base); - } - } - return $result; - } - - /** - * @param array<int,string> $param_components Maps field keys (integers or strings) to the corresponding type representations - * @param Context $context - * @param int $source - * @return array<int,ClosureDeclarationParameter> The types for the representations of types, in the given $context - * - * @see Comment::magicParamFromMagicMethodParamString() - This is similar but has minor differences, such as references - * @suppress PhanAccessClassConstantInternal - */ - private static function closureParamComponentStringsToParams(array $param_components, Context $context, int $source) : array - { - $result = []; - foreach ($param_components as $param_string) { - if ($param_string === '') { - // TODO: warn - continue; - } - if (preg_match('/^(' . UnionType::union_type_regex . ')?\s*(&\s*)?(?:(\.\.\.)\s*)?(?:\$' . Builder::WORD_REGEX . ')?((?:\s*=.*)?)$/', $param_string, $param_match)) { - // Note: a closure declaration can be by reference, unlike (at)method - $union_type_string = $param_match[1] ?: 'mixed'; - $union_type = UnionType::fromStringInContext( - $union_type_string, - $context, - $source - ); - $is_reference = $param_match[15] !== ''; - $is_variadic = $param_match[16] === '...'; - $default_str = $param_match[18]; - $has_default_value = $default_str !== ''; - if ($has_default_value) { - $default_value_repr = trim(explode('=', $default_str, 2)[1]); - if (strcasecmp($default_value_repr, 'null') === 0) { - $union_type = $union_type->nullableClone(); - } - } - // $var_name = $param_match[19]; // would be unused - $result[] = new ClosureDeclarationParameter($union_type, $is_variadic, $is_reference, $has_default_value); - } // TODO: Otherwise, warn - } - return $result; - } - - - /** - * @var ?UnionType of [$this] - */ - protected $singleton_union_type; - - /** - * @return UnionType - * A UnionType representing this and only this type - */ - public function asUnionType() : UnionType - { - // return new UnionType([$this]); - // Memoize the set of types. The constructed UnionType object can be modified later, so it isn't memoized. - return $this->singleton_union_type ?? ($this->singleton_union_type = new UnionType([$this], true)); - } - - /** - * @return FQSEN - * A fully-qualified structural element name derived - * from this type - * - * @see FullyQualifiedClassName::fromType() for a method that always returns FullyQualifiedClassName - */ - public function asFQSEN() : FQSEN - { - // Note: some subclasses, such as CallableType, return different subtypes of FQSEN - return FullyQualifiedClassName::fromType($this); - } - - /** - * @return string - * The name associated with this type - */ - public function getName() : string - { - return $this->name; - } - - /** - * @return string - * The namespace associated with this type - */ - public function getNamespace() : string - { - return $this->namespace; - } - - /** - * Is this nullable? - * - * E.g. returns true for `?array`, `null`, etc. - */ - public function getIsNullable() : bool - { - return $this->is_nullable; - } - - /** - * Returns true if this has some possibly falsey values - */ - public function getIsPossiblyFalsey() : bool - { - return $this->is_nullable; - } - - /** - * Returns true if this is guaranteed to be falsey - */ - public function getIsAlwaysFalsey() : bool - { - return false; // overridden in FalseType and NullType, as well as literal scalar types - } - - /** - * Returns true if this is possibly truthy. - */ - public function getIsPossiblyTruthy() : bool - { - return true; // overridden in various types. This base class (Type) is implicitly the type of an object, which is always truthy. - } - - /** - * Returns true if this is guaranteed to be truthy. - * - * Overridden in various types. - * - * This base class (Type) is type of an object with a known FQSEN, - * which is always truthy. - */ - public function getIsAlwaysTruthy() : bool - { - return true; - } - - /** - * Returns true for types such as `mixed`, `bool`, `false` - */ - public function getIsPossiblyFalse() : bool - { - return false; - } - - /** - * Returns true for non-nullable `FalseType` - */ - public function getIsAlwaysFalse() : bool - { - return false; // overridden in FalseType - } - - /** - * Returns true if this could include the type `true` - * (e.g. for `mixed`, `bool`, etc.) - */ - public function getIsPossiblyTrue() : bool - { - return false; - } - - /** - * Returns true for non-nullable `TrueType` - */ - public function getIsAlwaysTrue() : bool - { - return false; - } - - /** - * Returns true for FalseType, TrueType, and BoolType - */ - public function getIsInBoolFamily() : bool - { - return false; - } - - /** - * Returns true if this type may satisfy `is_numeric()` - */ - public function getIsPossiblyNumeric() : bool - { - return false; - } - - /** - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass - * false - * - * @return Type - * A new type that is a copy of this type but with the - * given nullability value. - */ - public function withIsNullable(bool $is_nullable) : Type - { - if ($is_nullable === $this->is_nullable) { - return $this; - } - return static::make( - $this->namespace, - $this->name, - $this->template_parameter_type_list, - $is_nullable, - Type::FROM_TYPE - ); - } - - /** - * Returns this type with any falsey types (e.g. false, null, 0, '') removed. - * - * Overridden by BoolType, etc. - * @see self::getIsAlwaysFalsey() - */ - public function asNonFalseyType() : Type - { - // Overridden by BoolType subclass to return TrueType - return $this->withIsNullable(false); - } - - /** - * Returns this type with any truthy types removed. - * - * Overridden by BoolType, etc. - * @see self::getIsAlwaysTruthy() - */ - public function asNonTruthyType() : Type - { - // Overridden by ScalarType, BoolType, etc. - return NullType::instance(false); - } - - /** - * Returns this type with the type `false` removed. - * - * Overridden by BoolType, etc. - * @see self::getIsAlwaysFalse() - */ - public function asNonFalseType() : Type - { - return $this; - } - - /** - * Returns this type with the type `true` removed. - * - * Overridden by BoolType, etc. - * @see self::getIsAlwaysTrue() - */ - public function asNonTrueType() : Type - { - return $this; - } - - /** - * @return bool - * True if this is a native type (like int, string, etc.) - * - */ - public function isNativeType() : bool - { - return false; - } - - /** - * @return bool - * True if this is a native type or an array of native types - * (like int, string, bool[], etc.), - */ - private static function isInternalTypeString(string $original_type_name, int $source) : bool - { - $type_name = \str_replace('[]', '', strtolower($original_type_name)); - if ($source === Type::FROM_PHPDOC) { - $type_name = self::canonicalNameFromName($type_name); // Have to convert boolean[] to bool - } - if (!\array_key_exists($type_name, self::_internal_type_set)) { - return $original_type_name === '$this'; // This is the only case-sensitive check. - } - // All values of $type_name exist as a valid phpdoc type, but some don't exist as real types. - if ($source === Type::FROM_NODE && \array_key_exists($type_name, self::_soft_internal_type_set)) { - return false; - } - return true; - } - - /** - * @return bool - * True if this type is a type referencing the - * class context in which it exists such as 'static' - * or 'self'. - */ - public function isSelfType() : bool - { - // TODO: Ensure that this is always a SelfType instance - return $this->namespace === '\\' && self::isSelfTypeString($this->name); - } - - /** - * @return bool - * True if this type is a type referencing the - * class context 'static'. - * Overridden in the subclass StaticType - */ - public function isStaticType() : bool - { - return false; - } - - /** - * Returns true if this has any instance of `static` or `self`. - * This is overridden in subclasses such as `SelfType`. - */ - public function hasStaticOrSelfTypesRecursive(CodeBase $code_base) : bool - { - $union_type = $this->iterableValueUnionType($code_base); - if (!$union_type) { - return false; - } - foreach ($union_type->getTypeSet() as $type) { - if ($type->hasStaticOrSelfTypesRecursive($code_base)) { - return true; - } - } - return false; - } - - /** - * @param string $type_string - * A string defining a type such as 'self' or 'int'. - * - * @return bool - * True if the given type references the class context - * in which it exists such as 'self' or 'parent' - */ - public static function isSelfTypeString( - string $type_string - ) : bool { - // Note: While 'self' and 'parent' are case-insensitive, '$this' is case-sensitive - // Not sure if that should extend to phpdoc. - return \preg_match('/^\\\\?([sS][eE][lL][fF]|[pP][aA][rR][eE][nN][tT]|\$this)$/', $type_string) > 0; - } - - /** - * @param string $type_string - * A string defining a type such as 'static' or 'int'. - * - * @return bool - * True if the given type references the class context - * in which it exists is '$this' or 'static' - */ - public static function isStaticTypeString( - string $type_string - ) : bool { - // Note: While 'self' and 'parent' are case-insensitive, '$this' is case-sensitive - // Not sure if that should extend to phpdoc. - return \preg_match('/^\\\\?([sS][tT][aA][tT][iI][cC]|\\$this)$/', $type_string) > 0; - } - - /** - * @return bool - * True if this type is scalar. - */ - public function isScalar() : bool - { - return false; // Overridden in subclass ScalarType - } - - /** - * @return bool - * True if this type is a printable scalar. - * @internal - */ - public function isPrintableScalar() : bool - { - return false; // Overridden in subclass ScalarType - } - - /** - * @return bool - * True if this type is a valid operand for a bitwise operator ('|', '&', or '^'). - * @internal - */ - public function isValidBitwiseOperand() : bool - { - return false; // Overridden in subclasses - } - - /** - * @return bool - * True if this type is a callable or a Closure. - */ - public function isCallable() : bool - { - return false; // Overridden in subclass CallableType, ClosureType, FunctionLikeDeclarationType - } - - /** - * @return bool - * True if this type is an object (or the phpdoc `object`) - */ - public function isObject() : bool - { - return true; // Overridden in various subclasses - } - - /** - * @return bool - * True if this type is an object (and not the phpdoc `object` or a template) - */ - public function isObjectWithKnownFQSEN() : bool - { - return true; // Overridden in various subclasses - } - - /** - * @return bool - * True if this type is possibly an object (or the phpdoc `object`) - * This is the same as isObject(), except that it returns true for the exact class of IterableType. - */ - public function isPossiblyObject() : bool - { - return true; // Overridden in various subclasses - } - - /** - * @return bool - * True if this type is iterable. - */ - public function isIterable() : bool - { - return false; // Overridden in subclass IterableType (with subclass ArrayType) - } - - /** - * @return bool - * True if this type is array-like (is of type array, is - * a generic array, or implements ArrayAccess). - */ - public function isArrayLike() : bool - { - // includes both nullable and non-nullable ArrayAccess/array - // (Overridden by ArrayType) - return $this->isArrayAccess(); - } - - /** - * @return bool - * True if this is a generic type such as 'int[]' or 'string[]'. - * Currently, this is the same as `$type instanceof GenericArrayInterface` - * @suppress PhanUnreferencedPublicMethod - */ - public function isGenericArray() : bool - { - return false; // Overridden in GenericArrayType and ArrayShapeType - } - - /** - * @return bool - Returns true if this is `\ArrayAccess` (nullable or not) - */ - public function isArrayAccess() : bool - { - return (\strcasecmp($this->getName(), 'ArrayAccess') === 0 - && $this->getNamespace() === '\\'); - } - - /** - * Is this an array or ArrayAccess, or a subtype of those? - * E.g. returns true for `\ArrayObject`, `array<int,string>`, etc. - */ - public function isArrayOrArrayAccessSubType(CodeBase $code_base) : bool - { - return $this->asExpandedTypes($code_base)->hasArrayAccess(); - } - - /** - * @return bool - Returns true if this is \Traversable (nullable or not) - */ - public function isTraversable() : bool - { - return (\strcasecmp($this->getName(), 'Traversable') === 0 - && $this->getNamespace() === '\\'); - } - - /** - * @return bool - Returns true if this is \Generator (nullable or not) - * @suppress PhanUnreferencedPublicMethod - */ - public function isGenerator() : bool - { - return (\strcasecmp($this->getName(), 'Generator') === 0 - && $this->getNamespace() === '\\'); - } - - /** - * @param string $type_name - * A non-namespaced type name like 'int[]' - * - * @return bool - * True if this is a generic type such as 'int[]' or - * 'string[]'. - */ - private static function isGenericArrayString(string $type_name) : bool - { - if (\strrpos($type_name, '[]') !== false) { - return $type_name !== '[]'; - } - return false; - } - - /** - * @return ?UnionType returns the iterable key's union type, if this is a subtype of iterable. null otherwise. - */ - public function iterableKeyUnionType(CodeBase $unused_code_base) - { - if ($this->namespace === '\\') { - $name = strtolower($this->name); - if ($name === 'traversable' || $name === 'iterator') { - return $this->keyTypeOfTraversable(); - } - // TODO: Abstract this out for all internal classes - if ($name === 'generator') { - return $this->keyTypeOfGenerator(); - } - // TODO: If this is a subclass of iterator, look up the signature of MyClass->key() - } - - /* - if ($this->namespace !== '\\') { - return null; - } - // TODO: check for Traversable and Generator and other subclasses of Traversable - */ - return null; - } - - /** - * @return ?UnionType returns the iterable value's union type if this is a subtype of iterable, null otherwise. - * - * This is overridden by the array subclasses - */ - public function iterableValueUnionType(CodeBase $unused_code_base) - { - if ($this->namespace === '\\') { - $name = strtolower($this->name); - if ($name === 'traversable' || $name === 'iterator') { - return $this->valueTypeOfTraversable(); - } - // TODO: Abstract this out for all internal classes - if ($name === 'generator') { - return $this->valueTypeOfGenerator(); - } - // TODO: If this is a subclass of iterator, look up the signature of MyClass->current() - } - return null; - } - - // TODO: Use a template-based abstraction so that this boilerplate can be removed - /** @return ?UnionType */ - private function keyTypeOfTraversable() - { - $template_type_list = $this->template_parameter_type_list; - if (count($template_type_list) === 2) { - return $template_type_list[0]; - } - return null; - } - - /** @return ?UnionType */ - private function valueTypeOfTraversable() - { - $template_type_list = $this->template_parameter_type_list; - $count = count($template_type_list); - if ($count >= 1 && $count <= 2) { - return $template_type_list[$count - 1]; - } - return null; - } - - - /** @return ?UnionType */ - private function keyTypeOfGenerator() - { - $template_type_list = $this->template_parameter_type_list; - if (count($template_type_list) >= 2 && count($template_type_list) <= 4) { - return $template_type_list[0]; - } - return null; - } - - /** @return ?UnionType */ - private function valueTypeOfGenerator() - { - $template_type_list = $this->template_parameter_type_list; - if (count($template_type_list) >= 2 && count($template_type_list) <= 4) { - return $template_type_list[1]; - } - return null; - } - - /** - * @param int $key_type - * Corresponds to the type of the array keys. Set this to a GenericArrayType::KEY_* constant. - * - * @return Type - * Get a new type which is the generic array version of - * this type. For instance, 'int' will produce 'int[]'. - * - * As a special case to reduce false positives, 'array' (with no known types) will produce 'array' - * - * Overridden in subclasses - */ - public function asGenericArrayType(int $key_type) : Type - { - return GenericArrayType::fromElementType($this, false, $key_type); - } - - /** - * @return bool - * True if this type has any template parameter types - * @suppress PhanUnreferencedPublicMethod potentially used in the future - * TODO: Would need to override this in ArrayShapeType, GenericArrayType - */ - public function hasTemplateParameterTypes() : bool - { - return count($this->template_parameter_type_list) > 0; - } - - /** - * @return array<int,UnionType> - * The set of types filling in template parameter types defined - * on the class specified by this type. - */ - public function getTemplateParameterTypeList() - { - return $this->template_parameter_type_list; - } - - /** - * @param CodeBase $code_base - * The code base to look up classes against - * - * @return array<string,UnionType> - * A map from template type identifier to a concrete type - */ - public function getTemplateParameterTypeMap(CodeBase $code_base) - { - - return $this->memoize(__METHOD__, /** @return array<string,UnionType> */ function () use ($code_base) : array { - $fqsen = FullyQualifiedClassName::fromType($this); - - if (!$code_base->hasClassWithFQSEN($fqsen)) { - return []; - } - - $class = $code_base->getClassByFQSEN($fqsen); - - $template_parameter_type_list = - $this->getTemplateParameterTypeList(); - - $map = []; - foreach (\array_keys($class->getTemplateTypeMap()) as $i => $identifier) { - if (isset($template_parameter_type_list[$i])) { - $map[$identifier] = $template_parameter_type_list[$i]; - } - } - - return $map; - }); - } - - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands class types to all inherited classes returning - * a superset of this type. - */ - public function asExpandedTypes( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - // We're going to assume that if the type hierarchy - // is taller than some value we probably messed up - // and should bail out. - if ($recursion_depth >= 20) { - throw new RecursionDepthException("Recursion has gotten out of hand: " . Frame::getExpandedTypesDetails()); - } - $union_type = $this->memoize(__METHOD__, /** @return UnionType */ function () use ($code_base, $recursion_depth) { - $union_type = $this->asUnionType(); - - $class_fqsen = $this->asFQSEN(); - - if (!($class_fqsen instanceof FullyQualifiedClassName)) { - return $union_type; - } - - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - return $union_type; - } - - $clazz = $code_base->getClassByFQSEN($class_fqsen); - - $union_type = $union_type->withUnionType( - $clazz->getUnionType()->withIsNullable($this->is_nullable) - ); - $additional_union_type = $clazz->getAdditionalTypes(); - if ($additional_union_type !== null) { - $union_type = $union_type->withUnionType($additional_union_type->withIsNullable($this->is_nullable)); - } - - // Recurse up the tree to include all types - $representation = $this->__toString(); - $recursive_union_type_builder = new UnionTypeBuilder(); - foreach ($union_type->getTypeSet() as $clazz_type) { - if ($clazz_type->__toString() !== $representation) { - $recursive_union_type_builder->addUnionType( - $clazz_type->asExpandedTypes( - $code_base, - $recursion_depth + 1 - ) - ); - } else { - $recursive_union_type_builder->addType($clazz_type); - } - } - if (count($this->template_parameter_type_list) > 0) { - $recursive_union_type_builder->addUnionType( - $clazz->resolveParentTemplateType($this->getTemplateParameterTypeMap($code_base)) - ); - } - - // Add in aliases - // (If enable_class_alias_support is false, this will do nothing) - $fqsen_aliases = $code_base->getClassAliasesByFQSEN($class_fqsen); - foreach ($fqsen_aliases as $alias_fqsen_record) { - $alias_fqsen = $alias_fqsen_record->alias_fqsen; - $recursive_union_type_builder->addType( - $alias_fqsen->asType()->withIsNullable($this->is_nullable) - ); - } - - return $recursive_union_type_builder->getUnionType(); - }); - return $union_type; - } - - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands class types to all inherited classes returning - * a superset of this type. - */ - public function asExpandedTypesPreservingTemplate( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - // We're going to assume that if the type hierarchy - // is taller than some value we probably messed up - // and should bail out. - if ($recursion_depth >= 20) { - throw new RecursionDepthException("Recursion has gotten out of hand: " . Frame::getExpandedTypesDetails()); - } - $union_type = $this->memoize(__METHOD__, /** @return UnionType */ function () use ($code_base, $recursion_depth) { - $union_type = $this->asUnionType(); - - $class_fqsen = $this->asFQSEN(); - - if (!($class_fqsen instanceof FullyQualifiedClassName)) { - return $union_type; - } - - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - return $union_type; - } - - $clazz = $code_base->getClassByFQSEN($class_fqsen); - - $union_type = $union_type->withUnionType( - $clazz->getUnionType()->withIsNullable($this->is_nullable) - ); - - if (count($this->template_parameter_type_list) > 0) { - $template_union_type = $clazz->resolveParentTemplateType($this->getTemplateParameterTypeMap($code_base))->asExpandedTypesPreservingTemplate($code_base, $recursion_depth + 1); - $template_union_type = $template_union_type->withType($this); - } else { - $template_union_type = UnionType::empty(); - } - - $additional_union_type = $clazz->getAdditionalTypes(); - if ($additional_union_type !== null) { - $union_type = $union_type->withUnionType($additional_union_type->withIsNullable($this->is_nullable)); - } - - $representation = $this->__toString(); - $recursive_union_type_builder = new UnionTypeBuilder(); - // Recurse up the tree to include all types - if (count($this->template_parameter_type_list) > 0) { - $recursive_union_type_builder->addUnionType( - $template_union_type - ); - } - - foreach ($union_type->getTypeSet() as $clazz_type) { - if ($clazz_type->__toString() !== $representation) { - $recursive_union_type_builder->addUnionType( - $clazz_type->asExpandedTypesPreservingTemplate( - $code_base, - $recursion_depth + 1 - ) - ); - } else { - $recursive_union_type_builder->addType($clazz_type); - } - } - - // Add in aliases - // (If enable_class_alias_support is false, this will do nothing) - $fqsen_aliases = $code_base->getClassAliasesByFQSEN($class_fqsen); - foreach ($fqsen_aliases as $alias_fqsen_record) { - $alias_fqsen = $alias_fqsen_record->alias_fqsen; - $recursive_union_type_builder->addType( - $alias_fqsen->asType()->withIsNullable($this->is_nullable) - ); - } - - $result = $recursive_union_type_builder->getUnionType(); - if (!$template_union_type->isEmpty()) { - return $result->replaceWithTemplateTypes($template_union_type); - } - return $result; - }); - return $union_type; - } - - /** - * @param CodeBase $code_base - * - * @param Type $parent - * - * @return bool - * True if this type represents a class which is a sub-type of - * the class represented by the passed type. - * - * @deprecated - * @suppress PhanUnreferencedPublicMethod - */ - public function isSubclassOf(CodeBase $code_base, Type $parent) : bool - { - $fqsen = FullyQualifiedClassName::fromType($this); - - $this_clazz = $code_base->getClassByFQSEN( - $fqsen - ); - - $parent_fqsen = FullyQualifiedClassName::fromType($parent); - - $parent_clazz = $code_base->getClassByFQSEN( - $parent_fqsen - ); - - return $this_clazz->isSubclassOf($code_base, $parent_clazz); - } - - /** - * @param Type[] $target_type_set 1 or more types - * @return bool - * True if this Type can be cast to the given Type cleanly. - * This is overridden by ArrayShapeType to allow array{a:string,b:stdClass} to cast to string[]|stdClass[] - */ - public function canCastToAnyTypeInSet(array $target_type_set) : bool - { - foreach ($target_type_set as $target_type) { - if ($this->canCastToType($target_type)) { - return true; - } - } - return false; - } - - /** - * @param Type[] $target_type_set 1 or more types - * @return bool - * True if this Type can be cast to the given Type cleanly. - * This is overridden by ArrayShapeType to allow array{a:string,b:stdClass} to cast to string[]|stdClass[] - */ - public function canCastToAnyTypeInSetHandlingTemplates(array $target_type_set, CodeBase $code_base) : bool - { - foreach ($target_type_set as $target_type) { - if ($this->canCastToTypeHandlingTemplates($target_type, $code_base)) { - return true; - } - } - return false; - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - public function canCastToType(Type $type) : bool - { - // Check to see if we have an exact object match - if ($this === $type) { - return true; - } - - if ($type instanceof MixedType) { - return true; - } - - // A nullable type cannot cast to a non-nullable type - if ($this->is_nullable && !$type->is_nullable) { - // If this is nullable, but that isn't, and we've - // configured nulls to cast as anything (or as arrays), ignore - // the nullable part. - if (Config::get_null_casts_as_any_type()) { - return $this->withIsNullable(false)->canCastToType($type); - } elseif (Config::get_null_casts_as_array() && $type->isArrayLike()) { - return $this->withIsNullable(false)->canCastToType($type); - } - - return false; - } - - // Get a non-null version of the type we're comparing - // against. - if ($type->is_nullable) { - $type = $type->withIsNullable(false); - - // Check one more time to see if the types are equal - if ($this === $type) { - return true; - } - } - - // Test to see if we can cast to the non-nullable version - // of the target type. - return $this->canCastToNonNullableType($type); - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly (accounting for templates) - */ - public function canCastToTypeHandlingTemplates(Type $type, CodeBase $code_base) : bool - { - // Check to see if we have an exact object match - if ($this === $type) { - return true; - } - - if ($type instanceof MixedType) { - return true; - } - - // A nullable type cannot cast to a non-nullable type - if ($this->is_nullable && !$type->is_nullable) { - // If this is nullable, but that isn't, and we've - // configured nulls to cast as anything (or as arrays), ignore - // the nullable part. - if (Config::get_null_casts_as_any_type()) { - return $this->withIsNullable(false)->canCastToType($type); - } elseif (Config::get_null_casts_as_array() && $type->isArrayLike()) { - return $this->withIsNullable(false)->canCastToType($type); - } - - return false; - } - - // Get a non-null version of the type we're comparing - // against. - if ($type->is_nullable) { - $type = $type->withIsNullable(false); - - // Check one more time to see if the types are equal - if ($this === $type) { - return true; - } - } - - // Test to see if we can cast to the non-nullable version - // of the target type. - return $this->canCastToNonNullableTypeHandlingTemplates($type, $code_base); - } - - /** - * @param Type $type - * A Type which is not nullable. This constraint is not - * enforced, so be careful. - * - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - protected function canCastToNonNullableType(Type $type) : bool - { - // can't cast native types (includes iterable or array) to object. ObjectType overrides this function. - if ($type instanceof ObjectType - && !$this->isNativeType() - ) { - return true; - } - - if (!($type instanceof NativeType)) { - return false; - } - - if ($type instanceof MixedType) { - return true; - } - - // Check for allowable type conversions from object types to native types - if ($type::NAME === 'iterable') { - if ($this->namespace === '\\' && in_array($this->name, ['Generator', 'Traversable', 'Iterator'], true)) { - if (count($this->template_parameter_type_list) === 0 || !($type instanceof GenericIterableType)) { - return true; - } - return $this->canCastTraversableToIterable($type); - } - } elseif (\get_class($type) === CallableType::class) { - return $this->namespace === '\\' && $this->name === 'Closure'; - } - return false; - } - - /** - * @param Type $type - * A Type which is not nullable. This constraint is not - * enforced, so be careful. - * - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - protected function canCastToNonNullableTypeHandlingTemplates(Type $type, CodeBase $code_base) : bool - { - if ($this->canCastToNonNullableType($type)) { - return true; - } - if ($this->isObjectWithKnownFQSEN() && $type->isObjectWithKnownFQSEN()) { - if ($this->name === $type->name && $this->namespace === $type->namespace) { - return $this->canTemplateTypesCast($type->template_parameter_type_list, $code_base); - } - } - return false; - } - - /** - * @param array<int,UnionType> $other_template_parameter_type_list - */ - private function canTemplateTypesCast(array $other_template_parameter_type_list, CodeBase $code_base) : bool - { - foreach ($this->template_parameter_type_list as $i => $param) { - $other_param = $other_template_parameter_type_list[$i] ?? null; - if ($other_param !== null) { - if (!$param->asExpandedTypes($code_base)->canCastToUnionType($other_param)) { - return false; - } - } - } - return true; - } - - /** - * Precondition: $this represents \Traversable, \Iterator, or \Generator - */ - private function canCastTraversableToIterable(GenericIterableType $type) : bool - { - $template_types = $this->template_parameter_type_list; - $count = count($template_types); - $name = $this->name; - if ($name === 'Traversable' || $name === 'Iterator') { - // Phan supports Traversable<TValue> and Traversable<TKey, TValue> - if ($count > 2 || $count < 1) { - // No idea what this means, assume it passes. - return true; - } - if (!$this->template_parameter_type_list[$count - 1]->canCastToUnionType($type->getElementUnionType())) { - return false; - } - if ($count === 2) { - if (!$this->template_parameter_type_list[0]->canCastToUnionType($type->getKeyUnionType())) { - return false; - } - } - return true; - } elseif ($name === 'Generator') { - // Phan partially supports the following syntaxes for PHP doc comments - // 1. Generator<TValue> - // 2. Generator<TKey, TValue> - // 3. Generator<TKey, TValue, TYield> - // 4. Generator<TKey, TValue, TYield, TReturn> (PHP generators can return a final value, but HHVM cannot) - - // TODO: Handle casting Generator to a Generator with a different number of template parameters - if ($count > 4 || $count < 1) { - // No idea what this means, assume it passes - return true; - } - - if (!$this->template_parameter_type_list[\min(1, $count - 1)]->canCastToUnionType($type->getElementUnionType())) { - return false; - } - if ($count >= 2) { - if (!$this->template_parameter_type_list[0]->canCastToUnionType($type->getKeyUnionType())) { - return false; - } - } - return true; - } - // TODO: Check for template parameters, cast those - return true; - } - - /** - * @param UnionType $union_type - * A union type to compare against. Resolve it before checking. - * - * @param Context $context - * The context in which this type exists. - * - * @param CodeBase $code_base - * The code base in which both this and the given union - * types exist. - * - * @return bool - * True if each type within this union type can cast - * to the given union type. - * - * @see StaticType::isExclusivelyNarrowedFormOrEquivalentTo() for how it resolves static. - * TODO: Refactor. - * - * @see UnionType::isExclusivelyNarrowedFormOrEquivalentTo() for a check on union types as a whole. - */ - public function isExclusivelyNarrowedFormOrEquivalentTo( - UnionType $union_type, - Context $context, - CodeBase $code_base - ) : bool { - - // Special rule: anything can cast to nothing - // and nothing can cast to anything - if ($union_type->isEmpty()) { - return true; - } - - // Check to see if the other union type contains this - if ($union_type->hasType($this)) { - return true; - } - if ($this->getIsNullable() && !$union_type->containsNullable()) { - return false; - } - $this_resolved = $this->withStaticResolvedInContext($context); - // TODO: Allow casting MyClass<TemplateType> to MyClass (Without the template? - - - // TODO: Need to resolve expanded union types (parents, interfaces) of classes *before* this is called. - - // Test to see if this (or any ancestor types) can cast to the given union type. - $expanded_types = $this_resolved->asExpandedTypes($code_base); - return $expanded_types->canCastToUnionType( - $union_type - ); - } - - /** - * @return Type - * Either this or 'static' resolved in the given context. - */ - public function withStaticResolvedInContext( - Context $_ - ) : Type { - return $this; - } - - /** - * @return string - * A string representation of this type in FQSEN form. - */ - public function asFQSENString() : string - { - $namespace = $this->namespace; - if (!$namespace) { - return $this->name; - } - - if ('\\' === $namespace) { - return '\\' . $this->name; - } - - return "{$namespace}\\{$this->name}"; - } - - /** - * @return string - * A human readable representation of this type - * (This is frequently called, so prefer efficient operations) - */ - public function __toString() - { - return $this->memoize(__METHOD__, function () : string { - $string = $this->asFQSENString(); - - if (count($this->template_parameter_type_list) > 0) { - $string .= $this->templateParameterTypeListAsString(); - } - - if ($this->is_nullable) { - $string = '?' . $string; - } - - return $string; - }); - } - - /** - * Gets the part of the Type string for the template parameters. - * Precondition: $this->template_parameter_string is not null. - */ - final protected function templateParameterTypeListAsString() : string - { - return '<' . - \implode(',', \array_map(static function (UnionType $type) : string { - return $type->__toString(); - }, $this->template_parameter_type_list)) . '>'; - } - - /** - * @param string $name - * Any type name - * - * @return string - * A canonical name for the given type name - */ - public static function canonicalNameFromName( - string $name - ) : string { - static $map = [ - 'boolean' => 'bool', - 'callback' => 'callable', - 'closure' => 'Closure', - 'double' => 'float', - 'integer' => 'int', - ]; - - return $map[strtolower($name)] ?? $name; - } - - /** - * @param string $type_string - * Any type string such as 'int' or 'Set<int>' - * - * @return Tuple5<string,string,array<int,string>,bool,?array<string|int,string>> - * A 5-tuple with the following types: - * 0: the namespace - * 1: the type name. - * 2: The template parameters, if any - * 3: Whether or not the type is nullable - * 4: The shape components, if any. Null unless this is an array shape type string such as 'array{field:int}' - * - * NOTE: callers must check for the generic array symbol in the type name or for type names beginning with 'array{' (case-insensitive) - * - * NOTE: callers must not mutate the result. - */ - private static function typeStringComponents( - string $type_string - ) { - // This doesn't depend on any configs; the result can be safely cached. - static $cache = []; - return $cache[$type_string] ?? ($cache[$type_string] = self::typeStringComponentsInner($type_string)); - } - - /** - * @return Tuple5<string,string,array<int,string>,bool,?array<string|int,string>> - * A 5-tuple with the following types: - * 0: the namespace - * 1: the type name. - * 2: The template parameters, if any - * 3: Whether or not the type is nullable - * 4: The shape components, if any. Null unless this is an array shape type string such as 'array{field:int}' - * @suppress PhanPossiblyFalseTypeArgument - */ - private static function typeStringComponentsInner( - string $type_string - ) { - // Check to see if we have template parameter types - $template_parameter_type_name_list = []; - $shape_components = null; - - $match = []; - $is_nullable = false; - if (\preg_match('/^' . self::type_regex_or_this . '$/', $type_string, $match)) { - $closure_components = $match[3] ?? ''; - if ($closure_components !== '') { - return self::closureTypeStringComponents($type_string, $closure_components); - } - if (!isset($match[2])) { - // Parse '(X)' as 'X' - return self::typeStringComponents(\substr($match[1], 1, -1)); - } elseif (!isset($match[4])) { - if (\substr($type_string, -1) === ')') { - // Parse '?(X[]) as '?X[]' - return self::typeStringComponents('?' . \substr($match[2], 2, -1)); - } else { - return new Tuple5( - '', - $match[0], - [], - false, - null - ); - } - } - $type_string = $match[4]; - - // Rip out the nullability indicator if it - // exists and note its nullability - $is_nullable = ($match[5] ?? '') === '?'; - if ($is_nullable) { - $type_string = \substr($type_string, 1); - } - - if (($match[8] ?? '') !== '') { - $shape_components = self::extractShapeComponents($match[9] ?? ''); // will be empty array for 'array{}' - } else { - // Recursively parse this - $template_parameter_type_name_list = ($match[7] ?? '') !== '' - ? self::extractNameList($match[7]) - : []; - } - } - - // Determine if the type name is fully qualified - // (as specified by a leading backslash). - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - $is_fully_qualified = (0 === \strpos($type_string, '\\')); - - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - $fq_class_name_elements = \array_filter(\explode('\\', $type_string)); - - $class_name = - (string)\array_pop($fq_class_name_elements); - - $namespace = ($is_fully_qualified ? '\\' : '') - . \implode('\\', \array_filter( - $fq_class_name_elements - )); - - return new Tuple5( - $namespace, - $class_name, - $template_parameter_type_name_list, - $is_nullable, - $shape_components - ); - } - - /** - * @return Tuple5<string,string,array<int,string>,bool,?array<string|int,string>> - * A 5-tuple with the following types: - * 0: the namespace - * 1: the type name. - * 2: The template parameters, if any - * 3: Whether or not the type is nullable - * 4: The shape components, if any. Null unless this is an array shape type string such as 'array{field:int}' - */ - private static function closureTypeStringComponents(string $type_string, string $inner) : Tuple5 - { - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - $parts = self::closureParams(\trim(\substr($inner, 1, -1))); - // TODO: parse params, same as @method - - // Parse the optional return type for this closure - $i = \strpos($type_string, $inner) + \strlen($inner); - $colon_index = \strpos($type_string, ':', $i); - - if ($colon_index !== false) { - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - $return_type_string = \ltrim(\substr($type_string, $colon_index + 1)); - } else { - $return_type_string = 'void'; - } - $parts[] = $return_type_string; - - return new Tuple5( - '\\', - preg_match('/^\??callable/i', $type_string) > 0 ? 'callable' : 'Closure', - [], - $type_string[0] === '?', - $parts - ); - } - - /** - * @return array<int,string> - */ - private static function closureParams(string $arg_list) : array - { - // Special check if param list has 0 params. - if ($arg_list === '') { - return []; - } - // TODO: Would need to use a different approach if templates were ever supported - // e.g. The magic method parsing doesn't support commas? - return \array_map('trim', self::extractNameList($arg_list)); - } - - /** - * @return array<string|int,string> maps field name to field type. - */ - private static function extractShapeComponents(string $shape_component_string) : array - { - $result = []; - foreach (self::extractNameList($shape_component_string) as $shape_component) { - // Because these can be nested, there may be more than one ':'. Only consider the first. - $parts = \explode(':', $shape_component, 2); - if (count($parts) !== 2) { - continue; - } - $field_name = \trim($parts[0]); - if ($field_name === '') { - continue; - } - $field_value = \trim($parts[1]); - $result[$field_name] = $field_value; - } - return $result; - } - - /** - * Extracts the inner parts of a template name list (i.e. within <>) or a shape component list (i.e. within {}) - * @return array<int,string> - */ - private static function extractNameList(string $list_string) : array - { - $results = []; - $prev_parts = []; - $delta = 0; - foreach (\explode(',', $list_string) as $result) { - $result = \trim($result); - $open_bracket_count = \substr_count($result, '<') + \substr_count($result, '{') + \substr_count($result, '('); - $close_bracket_count = \substr_count($result, '>') + \substr_count($result, '}') + \substr_count($result, ')'); - if (count($prev_parts) > 0) { - $prev_parts[] = $result; - $delta += $open_bracket_count - $close_bracket_count; - if ($delta <= 0) { - if ($delta === 0) { - $results[] = \implode(',', $prev_parts); - } // ignore unparsable data such as "<T,T2>>" or "T, T2{}}" - $prev_parts = []; - $delta = 0; - } - continue; - } - if ($open_bracket_count === 0) { - $results[] = $result; - continue; - } - $delta = $open_bracket_count - $close_bracket_count; - if ($delta === 0) { - $results[] = $result; - } elseif ($delta > 0) { - $prev_parts[] = $result; - } // otherwise ignore unparsable data such as ">" (should be impossible) - - // e.g. we're breaking up T1<T2<X,Y>> into "T1<T2<X" and "Y>>" - } - if (\strpos($list_string, "'") !== false) { - return self::joinQuotedStrings($results); - } - return $results; - } - - /** - * Heuristic to handle literal commas in single quoted strings inside of templates/array shapes. - * - * @param array<int,string> $results - * @return array<int,string> - */ - private static function joinQuotedStrings(array $results) : array - { - // Preserve the original count: This will change if results are combined. - $N = count($results); - // Iterate by offset (manually) to avoid unexpected behavior of unset of subsequent elements in foreach - for ($i = 0; $i < $N;) { - $part = $results[$i]; - if (\substr_count($part, "'") % 2 === 0) { - $i++; - continue; - } - // This has an odd number of single quotes. Combine it with other parts until the total number of single quotes is even, or throw. - for ($j = $i + 1; $j < $N; $j++) { - $other = $results[$j]; - unset($results[$j]); - $results[$i] .= ",$other"; - if (\substr_count($other, "'") % 2 !== 0) { - $i = $j + 1; - continue 2; - } - } - throw new InvalidArgumentException("Unmatched \"'\" of $part in " . implode(',', $results)); - } - if ($N !== count($results)) { - return \array_values($results); - } - return $results; - } - - /** - * Helper function for internal use by UnionType. - * Overridden by subclasses. - */ - public function getNormalizationFlags() : int - { - return $this->is_nullable ? self::_bit_nullable : 0; - } - - /** - * Returns true if this contains any array shape type instances - * or literal type instances that could be normalized to - * regular generic array types or scalar types. - */ - public function hasArrayShapeOrLiteralTypeInstances() : bool - { - return false; - } - - /** - * Returns true if this contains any array shape type instances - * that could be normalized to regular generic array types. - */ - public function hasArrayShapeTypeInstances() : bool - { - return false; - } - - /** - * Used to check if this type can be replaced by more specific types, for non-quick mode - * - * @internal - */ - public function shouldBeReplacedBySpecificTypes() : bool - { - // Could check for final classes such as stdClass here, but not much of a reason to. - return true; - } - - /** - * Converts this type to one where array shapes are flattened to generic arrays, and literal scalars are converted to the general type for that scalar. - * - * E.g. converts the type `array{0:2}` to `array<int,int>` - * - * This is overridden by subclasses. - * - * @return Type[] - */ - public function withFlattenedArrayShapeOrLiteralTypeInstances() : array - { - return [$this]; - } - - /** - * Overridden in subclasses such as LiteralIntType - */ - public function asNonLiteralType() : Type - { - return $this; - } - - /** - * Returns true if this is a potentially valid operand for a numeric operator. - * Callers should also check if this is nullable. - */ - public function isValidNumericOperand() : bool - { - return false; - } - - /** - * Returns true if this contains a type that is definitely nullable or a non-object. - * e.g. returns true for false, array, int - * returns false for callable, object, iterable, T, etc. - */ - public function isDefiniteNonObjectType() : bool - { - return false; - } - - /** - * Returns true if this contains a type that is definitely non-callable - * e.g. returns true for false, array, int - * returns false for callable, array, object, iterable, T, etc. - */ - public function isDefiniteNonCallableType() : bool - { - // Any non-final class could be extended with a callable type. - // TODO: Check if final - return false; - } - - /** - * Check if this type can satisfy a comparison (<, <=, >, >=) - * @param int|string|float|bool|null $scalar - * @param int $flags (e.g. \ast\flags\BINARY_IS_SMALLER) - * @internal - * @suppress PhanUnusedPublicMethodParameter - */ - public function canSatisfyComparison($scalar, int $flags) : bool - { - return true; - } - - /** - * Perform the binary operation corresponding to $flags on $a OP $b - * @param array|int|string|float|bool|null $a - * @param int|string|float|bool|null $b - * @param int $flags - * @internal - */ - public static function performComparison($a, $b, int $flags) : bool - { - switch ($flags) { - case flags\BINARY_IS_GREATER: - return $a > $b; - case flags\BINARY_IS_GREATER_OR_EQUAL: - return $a >= $b; - case flags\BINARY_IS_SMALLER: - return $a < $b; - case flags\BINARY_IS_SMALLER_OR_EQUAL: - return $a <= $b; - } - throw new AssertionError("Impossible flag $flags"); - } - - /** - * Returns the type after an expression such as `++$x` - */ - public function getTypeAfterIncOrDec() : UnionType - { - if ($this->is_nullable) { - // ++null is 1 - return UnionType::of([$this->withIsNullable(false), IntType::instance(false)]); - } - // ++$obj; doesn't change the object. - return $this->asUnionType(); - } - - /** - * Returns the Type for \Traversable - * - * @suppress PhanThrowTypeAbsentForCall - */ - public static function traversableInstance() : Type - { - static $instance = null; - return $instance ?? ($instance = Type::fromFullyQualifiedString('\Traversable')); - } - - /** - * Returns the Type for \Throwable - * - * @suppress PhanThrowTypeAbsentForCall - */ - public static function throwableInstance() : Type - { - static $instance = null; - return $instance ?? ($instance = Type::fromFullyQualifiedString('\Throwable')); - } - - /** - * Returns true if this is `MyNs\MyClass<T..>` when $type is `MyNs\MyClass` - */ - public function isTemplateSubtypeOf(Type $type) : bool - { - if ($this->name !== $type->name || $this->namespace !== $type->namespace) { - return false; - } - return \count($this->template_parameter_type_list) > 0; - } - - /** - * Returns true for `T` and `T[]` and `\MyClass<T>`, but not `\MyClass<\OtherClass>` - * - * Overridden in subclasses. - */ - public function hasTemplateTypeRecursive() : bool - { - foreach ($this->template_parameter_type_list as $type) { - if ($type->hasTemplateTypeRecursive()) { - return true; - } - } - return false; - } - - /** - * @param array<string,UnionType> $template_parameter_type_map - * A map from template type identifiers to concrete types - * - * @return UnionType - * This UnionType with any template types contained herein - * mapped to concrete types defined in the given map. - * - * Overridden in subclasses - */ - public function withTemplateParameterTypeMap( - array $template_parameter_type_map - ) : UnionType { - if (!$this->template_parameter_type_list) { - return $this->asUnionType(); - } - $new_type_list = []; - foreach ($this->template_parameter_type_list as $i => $type) { - $new_type_list[$i] = $type->withTemplateParameterTypeMap($template_parameter_type_map); - } - if ($new_type_list === $this->template_parameter_type_list) { - return $this->asUnionType(); - } - return self::fromType($this, $new_type_list)->asUnionType(); - } - - /** - * Precondition: Callers should check isObjectWithKnownFQSEN - */ - public function hasSameNamespaceAndName(Type $type) : bool - { - return $this->name === $type->name && $this->namespace === $type->namespace; - } - - /** - * @param CodeBase $code_base may be used for resolving inheritance - * @param TemplateType $template_type the template type that this union type is being searched for - * - * @return ?Closure(UnionType, Context):UnionType a closure to determine the union type(s) that are in the same position(s) as the template type. - * This is overridden in subclasses. - */ - public function getTemplateTypeExtractorClosure(CodeBase $code_base, TemplateType $template_type) - { - if (!$this->template_parameter_type_list) { - return null; - } - if (!$this->isObjectWithKnownFQSEN()) { - return null; - } - $closure = null; - foreach ($this->template_parameter_type_list as $i => $actual_template_union_type) { - $inner_extractor_closure = $actual_template_union_type->getTemplateTypeExtractorClosure($code_base, $template_type); - if (!$inner_extractor_closure) { - continue; - } - $closure = TemplateType::combineParameterClosures( - $closure, - static function (UnionType $type, Context $context) use ($inner_extractor_closure, $i) : UnionType { - $result = UnionType::empty(); - foreach ($type->getTypeSet() as $inner_type) { - $replacement_type = $inner_type->template_parameter_type_list[$i] ?? null; - if ($replacement_type) { - $result = $result->withUnionType($inner_extractor_closure($replacement_type, $context)); - } - } - return $result; - } - ); - } - - return $closure; - } - - /** - * Returns the function interface that would be used if this type were a callable, or null. - * - * @param CodeBase $code_base the code base in which the function interface is found - * @param Context $context the context where the function interface is referenced (for emitting issues) @phan-unused-param - * @return ?FunctionInterface - */ - public function asFunctionInterfaceOrNull(CodeBase $code_base, Context $context) - { - if (static::class !== self::class) { - // Overridden in other subclasses - return null; - } - $fqsen = FullyQualifiedClassName::fromType($this); - if (!$code_base->hasClassWithFQSEN($fqsen)) { - return null; - } - $class = $code_base->getClassByFQSEN($fqsen); - if (!$class->hasMethodWithName($code_base, '__invoke')) { - Issue::maybeEmit( - $code_base, - $context, - Issue::UndeclaredInvokeInCallable, - $context->getLineNumberStart(), - '__invoke', - $fqsen - ); - return null; - } - return $class->getMethodByName($code_base, '__invoke'); - } - - /** - * Gets the inner Types in this Type (or subclass of Type) that can refer to classes. - * - * For a regular Type, that's the Type. - * - * @return Generator<mixed,Type> - * - * TODO: Also support template types - */ - public function getReferencedClasses() : Generator - { - yield $this; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/ArrayShapeType.php b/vendor/phan/phan/src/Phan/Language/Type/ArrayShapeType.php deleted file mode 100644 index fe4f0ed..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/ArrayShapeType.php +++ /dev/null @@ -1,868 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Closure; -use Exception; -use Generator; -use Phan\CodeBase; -use Phan\Config; -use Phan\Debug\Frame; -use Phan\Exception\RecursionDepthException; -use Phan\Issue; -use Phan\Language\AnnotatedUnionType; -use Phan\Language\Context; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Language\UnionTypeBuilder; -use RuntimeException; - -/** - * This is generated from phpdoc such as array{field:int} - */ -final class ArrayShapeType extends ArrayType implements GenericArrayInterface -{ - /** @phan-override */ - const NAME = 'array'; - - /** - * @var array<string|int,UnionType|AnnotatedUnionType> - * Maps 0 or more field names to the corresponding types - */ - private $field_types = []; - - /** - * This array shape converted to a list of 0 or more ArrayTypes. - * This is lazily set. - * @var ?array<int,ArrayType> - */ - private $as_generic_array_type_instances = null; - - /** - * @var ?int the key type enum value (constant from GenericArrayType) - */ - private $key_type = null; - - /** - * The union type of all possible value types of this array shape. - * Lazily set. - * @var ?UnionType - */ - private $generic_array_element_union_type = null; - - /** - * The list of all unique union types of values of this array shape. - * E.g. `array{a:int,b:int,c:int|string}` will have two unique union types of values: `int`, and `int|string` - * Lazily set. - * - * @var ?array<int,UnionType> - */ - private $unique_value_union_types; - - /** - * @param array<string|int,UnionType|AnnotatedUnionType> $types - * Maps 0 or more field names to the corresponding types - * - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass false - */ - protected function __construct(array $types, bool $is_nullable) - { - // Could de-duplicate, but callers should be able to do that as well when converting to UnionType. - // E.g. array<int|int> is int[]. - parent::__construct('\\', self::NAME, [], $is_nullable); - $this->field_types = $types; - } - - /** - * @return array<string|int,UnionType> - * An array mapping field keys of this type to their union types. - */ - public function getFieldTypes() : array - { - return $this->field_types; - } - - /** - * Returns true if this has one or more optional or required fields - * (i.e. this is not the type `array{}` or `?array{}`) - */ - public function isNotEmptyArrayShape() : bool - { - return \count($this->field_types) !== 0; - } - - /** - * Is this the union type `array{}` or `?array{}`? - * @suppress PhanUnreferencedPublicMethod - */ - public function isEmptyArrayShape() : bool - { - return \count($this->field_types) === 0; - } - - /** - * Returns an immutable array shape type instance without $field_key. - * - * @param int|string|float|bool $field_key - */ - public function withoutField($field_key) : ArrayShapeType - { - $field_types = $this->field_types; - // This check is written this way to avoid https://github.com/phan/phan/issues/1831 - unset($field_types[$field_key]); - if (\count($field_types) === \count($this->field_types)) { - return $this; - } - return self::fromFieldTypes($field_types, $this->is_nullable); - } - - /** - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass - * false - * - * @return Type - * A new type that is a copy of this type but with the - * given nullability value. - */ - public function withIsNullable(bool $is_nullable) : Type - { - if ($is_nullable === $this->is_nullable) { - return $this; - } - - return self::fromFieldTypes( - $this->field_types, - $is_nullable - ); - } - - /** @override */ - public function hasArrayShapeOrLiteralTypeInstances() : bool - { - return true; - } - - /** @override */ - public function hasArrayShapeTypeInstances() : bool - { - return true; - } - - /** - * @return array<int,ArrayType> the array shape transformed to remove literal keys and values. - */ - private function computeGenericArrayTypeInstances() : array - { - if (\count($this->field_types) === 0) { - // there are 0 fields, so we know nothing about the field types (and there's no way to indicate an empty array yet) - return [ArrayType::instance($this->is_nullable)]; - } - - $union_type_builder = new UnionTypeBuilder(); - foreach ($this->field_types as $key => $field_union_type) { - foreach ($field_union_type->getTypeSet() as $type) { - $union_type_builder->addType(GenericArrayType::fromElementType( - $type->asNonLiteralType(), - $this->is_nullable, - \is_string($key) ? GenericArrayType::KEY_STRING : GenericArrayType::KEY_INT - )); - } - } - return $union_type_builder->getTypeSet(); - } - - /** - * Returns the key type enum value (`GenericArrayType::KEY_*`) for the keys of this array shape. - * - * This is lazily computed. - * - * E.g. returns `GenericArrayType::KEY_STRING` for `array{key:\stdClass}` - */ - public function getKeyType() : int - { - return $this->key_type ?? ($this->key_type = GenericArrayType::getKeyTypeForArrayLiteral($this->field_types)); - } - - /** - * @return UnionType - * @phan-override - */ - public function iterableKeyUnionType(CodeBase $unused_code_base) - { - return $this->getKeyUnionType(); - } - - // TODO: Refactor other code calling unionTypeForKeyType to use this? - /** - * Gets the representation of the key type as a union type (without literals) - * - * E.g. returns `int` for `array{0:\stdClass}` - */ - public function getKeyUnionType() : UnionType - { - if (\count($this->field_types) === 0) { - return UnionType::empty(); - } - return GenericArrayType::unionTypeForKeyType($this->getKeyType()); - } - - /** - * @return UnionType - * @override - */ - public function iterableValueUnionType(CodeBase $unused_code_base) - { - return $this->genericArrayElementUnionType(); - } - - public function genericArrayElementUnionType() : UnionType - { - return $this->generic_array_element_union_type ?? ($this->generic_array_element_union_type = UnionType::merge($this->field_types)); - } - - /** - * Returns true for `T` and `T[]` and `\MyClass<T>`, but not `\MyClass<\OtherClass>` or `false` - */ - public function hasTemplateTypeRecursive() : bool - { - return $this->genericArrayElementUnionType()->hasTemplateTypeRecursive(); - } - - /** - * @override - * @param Type[] $target_type_set - */ - public function canCastToAnyTypeInSet(array $target_type_set) : bool - { - $element_union_types = null; - foreach ($target_type_set as $target_type) { - if ($target_type instanceof GenericArrayType) { - if (($this->getKeyType() & ($target_type->getKeyType() ?: GenericArrayType::KEY_MIXED)) === 0 && !Config::getValue('scalar_array_key_cast')) { - // Attempting to cast an int key to a string key (or vice versa) is normally invalid, so skip it. - // However, the scalar_array_key_cast config would make any cast of array keys a valid cast. - continue; - } - if ($element_union_types) { - $element_union_types = $element_union_types->withType($target_type->genericArrayElementType()); - } else { - $element_union_types = $target_type->genericArrayElementUnionType(); - } - continue; - } - if ($this->canCastToType($target_type)) { - return true; - } - } - if ($element_union_types) { - return $this->canEachFieldTypeCastToExpectedUnionType($element_union_types); - } - return false; - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - protected function canCastToNonNullableType(Type $type) : bool - { - if ($type instanceof ArrayType) { - if ($type instanceof GenericArrayType) { - if (($this->getKeyType() & ($type->getKeyType() ?: GenericArrayType::KEY_MIXED)) === 0 && !Config::getValue('scalar_array_key_cast')) { - // Attempting to cast an int key to a string key (or vice versa) is normally invalid. - // However, the scalar_array_key_cast config would make any cast of array keys a valid cast. - return false; - } - return $this->canEachFieldTypeCastToExpectedUnionType($type->genericArrayElementUnionType()); - } elseif ($type instanceof ArrayShapeType) { - foreach ($type->field_types as $key => $field_type) { - $this_field_type = $this->field_types[$key] ?? null; - // Can't cast {a:int} to {a:int, other:string} if other is missing - if ($this_field_type === null) { - if ($field_type->getIsPossiblyUndefined()) { - // ... unless the other field is allowed to be undefined. - continue; - } - return false; - } - // can't cast {a:int} to {a:string} or {a:string=} - if (!$this_field_type->canCastToUnionType($field_type)) { - return false; - } - } - return true; - } - // array{key:T} can cast to array. - return true; - } - - if (\get_class($type) === IterableType::class) { - // can cast to Iterable but not Traversable - return true; - } - if ($type instanceof GenericIterableType) { - return $this->canCastToGenericIterableType($type); - } - - $d = \strtolower($type->__toString()); - if ($d[0] == '\\') { - $d = \substr($d, 1); - } - if ($d === 'callable') { - return !$this->isDefiniteNonCallableType(); - } - - return parent::canCastToNonNullableType($type); - } - - private function canCastToGenericIterableType(GenericIterableType $iterable_type) : bool - { - if (!$this->getKeyUnionType()->canCastToUnionType($iterable_type->getKeyUnionType())) { - // TODO: Use the scalar_array_key_cast config - return false; - } - return $this->canEachFieldTypeCastToExpectedUnionType($iterable_type->getElementUnionType()); - } - - /** @return array<int,UnionType> */ - private function getUniqueValueUnionTypes() : array - { - return $this->unique_value_union_types ?? ($this->unique_value_union_types = $this->calculateUniqueValueUnionTypes()); - } - - /** @return array<int,UnionType> */ - private function calculateUniqueValueUnionTypes() : array - { - $field_types = $this->field_types; - $unique = []; - foreach ($field_types as $value_union_type) { - if ($value_union_type->getIsPossiblyUndefined()) { - continue; - } - - $value_union_type = $value_union_type->withIsPossiblyUndefined(false); - $unique[$value_union_type->generateUniqueId()] = $value_union_type; - } - return \array_values($unique); - } - - /** - * This implements a type casting check for casting array shape values to element type of generic arrays. - * - * We reject casts of array{key:string,otherKey:int} to string[] because otherKey is there and incompatible - * - * We accept casts of array{key:string,otherKey:?int} to string[] because otherKey is possibly absent (to reduce - * - * TODO: Consider ways to implement a strict mode - * - */ - private function canEachFieldTypeCastToExpectedUnionType(UnionType $expected_type) : bool - { - foreach ($this->getUniqueValueUnionTypes() as $value_union_type) { - if (!$value_union_type->canCastToUnionType($expected_type)) { - return false; - } - } - return true; - } - - /** - * @param array<string|int,UnionType|AnnotatedUnionType> $field_types - * @param bool $is_nullable - * @return ArrayShapeType - * TODO: deduplicate - */ - public static function fromFieldTypes( - array $field_types, - bool $is_nullable - ) : ArrayShapeType { - // TODO: Investigate if caching makes this any more efficient? - static $cache = []; - - $key_parts = []; - foreach ($field_types as $key => $field_union_type) { - $key_parts[$key] = $field_union_type->generateUniqueId(); - } - if ($is_nullable) { - $key_parts[] = '?'; - } - $key = \json_encode($key_parts); - - return $cache[$key] ?? ($cache[$key] = new self($field_types, $is_nullable)); - } - - /** - * Returns an empty array shape (for `array{}`) - * @param bool $is_nullable - * @return ArrayShapeType - */ - public static function empty( - bool $is_nullable = false - ) : ArrayShapeType { - static $nullable_shape = null; - static $nonnullable_shape = null; - - if ($is_nullable) { - return $nullable_shape ?? ($nullable_shape = self::fromFieldTypes([], true)); - } - return $nonnullable_shape ?? ($nonnullable_shape = self::fromFieldTypes([], false)); - } - - public function isGenericArray() : bool - { - return true; - } - - /** - * @internal - For use within ArrayShapeType - */ - const ESCAPE_CHARACTER_LOOKUP = [ - "\n" => '\\n', - "\r" => '\\r', - "\t" => '\\t', - "\\" => '\\\\', - ]; - - /** - * @internal - For use within ArrayShapeType - */ - const UNESCAPE_CHARACTER_LOOKUP = [ - '\\n' => "\n", - '\\r' => "\r", - '\\t' => "\t", - '\\\\' => "\\", - ]; - - public function __toString() : string - { - $parts = []; - foreach ($this->field_types as $key => $value) { - if (\is_string($key)) { - $key = self::escapeKey($key); - } - $value_repr = $value->__toString(); - if (\substr($value_repr, -1) === '=') { - // convert {key:type=} to {key?:type} in representation. - $parts[] = $key . '?:' . \substr($value_repr, 0, -1); - } else { - $parts[] = "$key:$value_repr"; - } - } - return ($this->is_nullable ? '?' : '') . 'array{' . \implode(',', $parts) . '}'; - } - - /** - * Escape the key for display purposes - */ - public static function escapeKey(string $key) : string - { - return \preg_replace_callback( - '([^-./^;$%*+_a-zA-Z0-9\x7f-\xff])', - /** - * @param array{0:string} $match - * @return string - */ - static function (array $match) { - $c = $match[0]; - return self::ESCAPE_CHARACTER_LOOKUP[$c] ?? \sprintf('\\x%02x', \ord($c)); - }, - $key - ); - } - - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param int $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands class types to all inherited classes returning - * a superset of this type. - * - * @throws RuntimeException if the maximum recursion depth is exceeded - * @override - */ - public function asExpandedTypes( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - // We're going to assume that if the type hierarchy - // is taller than some value we probably messed up - // and should bail out. - if ($recursion_depth >= 20) { - throw new RecursionDepthException("Recursion has gotten out of hand: " . Frame::getExpandedTypesDetails()); - } - return $this->memoize(__METHOD__, function () use ($code_base, $recursion_depth) : UnionType { - $result_fields = []; - foreach ($this->field_types as $key => $union_type) { - // UnionType already increments recursion_depth before calling asExpandedTypes on a subclass of Type, - // and has a depth limit of 10. - // Don't increase recursion_depth here, it's too easy to reach. - try { - $expanded_field_type = $union_type->asExpandedTypes($code_base, $recursion_depth); - } catch (RecursionDepthException $_) { - $expanded_field_type = MixedType::instance(false)->asUnionType(); - } - if ($union_type->getIsPossiblyUndefined()) { - // array{key?:string} should become array{key?:string}. - $expanded_field_type = $union_type->withIsPossiblyUndefined(true); - } - $result_fields[$key] = $expanded_field_type; - } - return ArrayShapeType::fromFieldTypes($result_fields, $this->is_nullable)->asUnionType(); - }); - } - - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param int $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands class types to all inherited classes returning - * a superset of this type. - * - * @throws RuntimeException if the maximum recursion depth is exceeded - * @override - */ - public function asExpandedTypesPreservingTemplate( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - // We're going to assume that if the type hierarchy - // is taller than some value we probably messed up - // and should bail out. - if ($recursion_depth >= 20) { - throw new RecursionDepthException("Recursion has gotten out of hand: " . Frame::getExpandedTypesDetails()); - } - return $this->memoize(__METHOD__, function () use ($code_base, $recursion_depth) : UnionType { - $result_fields = []; - foreach ($this->field_types as $key => $union_type) { - // UnionType already increments recursion_depth before calling asExpandedTypesPreservingTemplate on a subclass of Type, - // and has a depth limit of 10. - // Don't increase recursion_depth here, it's too easy to reach. - try { - $expanded_field_type = $union_type->asExpandedTypesPreservingTemplate($code_base, $recursion_depth); - } catch (RecursionDepthException $_) { - $expanded_field_type = MixedType::instance(false)->asUnionType(); - } - if ($union_type->getIsPossiblyUndefined()) { - // array{key?:string} should become array{key?:string}. - $expanded_field_type = $union_type->withIsPossiblyUndefined(true); - } - $result_fields[$key] = $expanded_field_type; - } - return ArrayShapeType::fromFieldTypes($result_fields, $this->is_nullable)->asUnionType(); - }); - } - - /** - * @return array<int,ArrayType> - * @override - */ - public function withFlattenedArrayShapeOrLiteralTypeInstances() : array - { - $instances = $this->as_generic_array_type_instances; - if (\is_array($instances)) { - return $instances; - } - return $this->as_generic_array_type_instances = $this->computeGenericArrayTypeInstances(); - } - - public function asGenericArrayType(int $key_type) : Type - { - return GenericArrayType::fromElementType($this, false, $key_type); - } - - /** - * Computes the non-nullable union of two or more array shape types. - * - * E.g. array{0: string} + array{0:int,1:int} === array{0:int|string,1:int} - * @param array<int,ArrayShapeType> $array_shape_types - */ - public static function union(array $array_shape_types) : ArrayShapeType - { - if (\count($array_shape_types) === 0) { - throw new \AssertionError('Unexpected union of 0 array shape types'); - } - if (\count($array_shape_types) === 1) { - return $array_shape_types[0]; - } - $field_types = $array_shape_types[0]->field_types; - unset($array_shape_types[0]); - - foreach ($array_shape_types as $type) { - foreach ($type->field_types as $key => $union_type) { - $old_union_type = $field_types[$key] ?? null; - if ($old_union_type === null) { - $field_types[$key] = $union_type; - continue; - } - $field_types[$key] = $old_union_type->withUnionType($union_type); - } - } - return self::fromFieldTypes($field_types, false); - } - - /** - * Computes the union of two array shape types. - * - * E.g. array{0: string} + array{0:stdClass,1:int} === array{0:string,1:int} - */ - public static function combineWithPrecedence(ArrayShapeType $left, ArrayShapeType $right) : ArrayShapeType - { - return self::fromFieldTypes($left->field_types + $right->field_types, false); - } - - /** - * @phan-override - */ - public function shouldBeReplacedBySpecificTypes() : bool - { - return false; - } - - /** - * @return bool true if there is guaranteed to be at least one property - * @phan-override - */ - public function getIsAlwaysTruthy() : bool - { - if ($this->is_nullable) { - return false; - } - foreach ($this->field_types as $field) { - if (!$field->getIsPossiblyUndefined()) { - return true; - } - } - return false; - } - - /** - * Returns true if this contains a type that is definitely non-callable - * e.g. returns true for false, array, int - * returns false for callable, array, object, iterable, T, etc. - */ - public function isDefiniteNonCallableType() : bool - { - if (\array_keys($this->field_types) !== [0, 1]) { - return true; - } - if (!$this->field_types[0]->canCastToUnionType(UnionType::fromFullyQualifiedString('string|object'))) { - // First field of callable array should be a string or object. (the expression or class) - return true; - } - if (!$this->field_types[1]->canCastToUnionType(StringType::instance(false)->asUnionType())) { - // Second field of callable array should be the method name. - return true; - } - return false; - } - - /** - * @param array<string,UnionType> $template_parameter_type_map - * A map from template type identifiers to concrete types - * - * @return UnionType - * This UnionType with any template types contained herein - * mapped to concrete types defined in the given map. - * - * Overridden in subclasses - */ - public function withTemplateParameterTypeMap( - array $template_parameter_type_map - ) : UnionType { - $field_types = $this->field_types; - foreach ($field_types as $i => $type) { - $new_type = $type->withTemplateParameterTypeMap($template_parameter_type_map); - if ($new_type !== $type) { - $field_types[$i] = $new_type; - } - } - if ($field_types === $this->field_types) { - return $this->asUnionType(); - } - return self::fromFieldTypes($field_types, $this->is_nullable)->asUnionType(); - } - - /** - * If this generic array type in a parameter declaration has template types, get the closure to extract the real types for that template type from argument union types - * - * @param CodeBase $code_base - * @return ?Closure(UnionType, Context):UnionType - */ - public function getTemplateTypeExtractorClosure(CodeBase $code_base, TemplateType $template_type) - { - $closure = null; - foreach ($this->field_types as $key => $type) { - $field_closure = $type->getTemplateTypeExtractorClosure($code_base, $template_type); - if (!$field_closure) { - continue; - } - $closure = TemplateType::combineParameterClosures( - $closure, - static function (UnionType $union_type, Context $context) use ($key, $field_closure) : UnionType { - $result = UnionType::empty(); - foreach ($union_type->getTypeSet() as $type) { - if (!($type instanceof ArrayShapeType)) { - continue; - } - $field_type = $type->field_types[$key] ?? null; - if ($field_type) { - $result = $result->withUnionType($field_closure($field_type, $context)); - } - } - return $result; - } - ); - } - return $closure; - } - - /** - * If all types in this array shape can be converted to a single PHP value, - * and all fields are required, return the array shape represented by that. - * - * Otherwise, return null - * - * @return ?array<mixed,?string|?int|?float|?bool|?array> - */ - public function asArrayLiteralOrNull() - { - $result = []; - foreach ($this->field_types as $key => $field_type) { - $field_value = $field_type->asValueOrNullOrSelf(); - if (\is_object($field_value)) { - return null; - } - $result[$key] = $field_value; - } - return $result; - } - - /** - * Returns the function interface this references - * @return ?FunctionInterface - */ - public function asFunctionInterfaceOrNull(CodeBase $code_base, Context $context) - { - if (\count($this->field_types) !== 2) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeInvalidCallableArraySize, - $context->getLineNumberStart(), - \count($this->field_types) - ); - return null; - } - $i = 0; - foreach ($this->field_types as $key => $_) { - if ($key !== $i) { - // TODO: Be more consistent about emitting issues in Type->asFunctionInterfaceOrNull and its subclasses (e.g. if missing __invoke) - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeInvalidCallableArrayKey, - $context->getLineNumberStart(), - $i - ); - return null; - } - $i++; - } - $method_name = $this->field_types[1]->asSingleScalarValueOrNull(); - if (!\is_string($method_name)) { - return null; - } - foreach ($this->field_types[0]->getTypeSet() as $type) { - $class = null; - if ($type instanceof LiteralStringType) { - try { - $fqsen = FullyQualifiedClassName::fromFullyQualifiedString($type->getValue()); - if (!$code_base->hasClassWithFQSEN($fqsen)) { - continue; - } - } catch (Exception $_) { - continue; - } - } elseif ($type->isObjectWithKnownFQSEN()) { - $fqsen = $type->asFQSEN(); - if (!$fqsen instanceof FullyQualifiedClassName) { - continue; - } - } else { - continue; - } - if ($code_base->hasClassWithFQSEN($fqsen)) { - $class = $code_base->getClassByFQSEN($fqsen); - if ($class->hasMethodWithName($code_base, $method_name)) { - return $class->getMethodByName($code_base, $method_name); - } - } - } - - return null; - } - - /** - * @return Generator<mixed,Type> (void => $inner_type) - */ - public function getReferencedClasses() : Generator - { - // Whether union types or types have been seen already for this ArrayShapeType - $seen = []; - foreach ($this->field_types as $type) { - $id = \spl_object_id($type); - if (isset($seen[$id])) { - continue; - } - $seen[$id] = true; - - foreach ($type->getReferencedClasses() as $inner_type) { - $id = \spl_object_id($inner_type); - if (isset($seen[$id])) { - continue; - } - $seen[$id] = true; - yield $inner_type; - } - } - } - - /** - * Convert an escaped key to an unescaped key - */ - public static function unescapeKey(string $escaped_key) : string - { - return \preg_replace_callback( - '/\\\\(?:[nrt\\\\]|x[0-9a-fA-F]{2})/', - /** @param array{0:string} $matches */ - static function (array $matches) : string { - $x = $matches[0]; - if (\strlen($x) === 2) { - // Parses \\, \n, \t, and \r - return self::UNESCAPE_CHARACTER_LOOKUP[$x]; - } - // convert 2 hex bytes to a single character - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal, PhanPartialTypeMismatchArgumentInternal - return \chr(\hexdec(\substr($x, 2))); - }, - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - $escaped_key - ); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/ArrayType.php b/vendor/phan/phan/src/Phan/Language/Type/ArrayType.php deleted file mode 100644 index ecf2f30..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/ArrayType.php +++ /dev/null @@ -1,227 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\CodeBase; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Language\UnionTypeBuilder; - -/** - * Phan's representation of the type for `array`. - * @see ArrayShapeType for the representation of `array{key:string}` - * @see GenericArrayType for the representation of `MyClass[]`, `array<string,MyClass>`, etc. - */ -class ArrayType extends IterableType -{ - /** @phan-override */ - const NAME = 'array'; - - public function getIsAlwaysTruthy() : bool - { - return false; - } - - public function asNonTruthyType() : Type - { - // if (!$x) implies that $x is `[]` when $x is an array - return ArrayShapeType::empty($this->is_nullable); - } - - public function isPossiblyObject() : bool - { - return false; // Overrides IterableType returning true - } - - public function isArrayLike() : bool - { - return true; // Overrides Type - } - - public function isArrayOrArrayAccessSubType(CodeBase $unused_code_base) : bool - { - return true; // Overrides Type - } - - /** - * @return UnionType with ArrayType subclass(es) - * @suppress PhanUnreferencedPublicMethod may be used in the future or for plugins as array shape support improves. - */ - public static function combineArrayTypesMerging(UnionType $union_type) : UnionType - { - $result = new UnionTypeBuilder(); - $array_shape_types = []; - foreach ($union_type->getTypeSet() as $type) { - if ($type instanceof GenericArrayInterface) { - if ($type instanceof ArrayShapeType) { - $array_shape_types[] = $type; - } else { - // @phan-suppress-next-line PhanTypeMismatchArgument TODO support intersection types - $result->addType($type); - } - } elseif ($type instanceof ArrayType) { - return $type->asUnionType(); - } - } - if ($result->isEmpty()) { - return ArrayShapeType::union($array_shape_types)->asUnionType(); - } - foreach ($array_shape_types as $type) { - foreach ($type->withFlattenedArrayShapeOrLiteralTypeInstances() as $type_part) { - $result->addType($type_part); - } - } - return $result->getUnionType(); - } - - /** - * E.g. array{0:int} + array{0:string,1:float} becomes array{0:int,1:float} - * - * @param UnionType $left the left-hand side (e.g. of a `+` operator). Keys from these array shapes take precedence. - * @param UnionType $right the right-hand side (e.g. of a `+` operator). - * @return UnionType with ArrayType subclass(es) - */ - public static function combineArrayTypesOverriding(UnionType $left, UnionType $right) : UnionType - { - $result = new UnionTypeBuilder(); - $left_array_shape_types = []; - foreach ($left->getTypeSet() as $type) { - if ($type instanceof GenericArrayInterface) { - if ($type instanceof ArrayShapeType) { - $left_array_shape_types[] = $type; - } else { - // @phan-suppress-next-line PhanTypeMismatchArgument TODO support intersection types - $result->addType($type); - } - } elseif ($type instanceof ArrayType) { - return $type->asUnionType(); - } - } - $right_array_shape_types = []; - foreach ($right->getTypeSet() as $type) { - if ($type instanceof GenericArrayInterface) { - if ($type instanceof ArrayShapeType) { - $right_array_shape_types[] = $type; - } else { - // @phan-suppress-next-line PhanTypeMismatchArgument TODO support intersection types - $result->addType($type); - } - } elseif ($type instanceof ArrayType) { - return $type->asUnionType(); - } - } - if ($result->isEmpty()) { - if (\count($left_array_shape_types) === 0) { - return ArrayShapeType::union($right_array_shape_types)->asUnionType(); - } - if (\count($right_array_shape_types) === 0) { - return ArrayShapeType::union($left_array_shape_types)->asUnionType(); - } - // fields from the left take precedence (e.g. [0, false] + ['string'] becomes [0, false]) - return ArrayShapeType::combineWithPrecedence( - ArrayShapeType::union($left_array_shape_types), - ArrayShapeType::union($right_array_shape_types) - )->asUnionType(); - } - foreach (\array_merge($left_array_shape_types, $right_array_shape_types) as $type) { - foreach ($type->withFlattenedArrayShapeOrLiteralTypeInstances() as $type_part) { - $result->addType($type_part); - } - } - return $result->getUnionType(); - } - - /** - * E.g. string|array{0:T1|T2,1:float} + [0 => int] becomes string|array{0:int, 1:float} - * - * TODO: Remove any top-level native types that can't have offsets, e.g. IntType, null, etc. - * - * @param UnionType $left the left-hand side (e.g. of an isset check). - * @param int|string|float|bool $field_dim_value (Ideally int|string) - * @param UnionType $field_type - * @return UnionType with ArrayType subclass(es) - */ - public static function combineArrayShapeTypesWithField(UnionType $left, $field_dim_value, UnionType $field_type) : UnionType - { - $result = new UnionTypeBuilder(); - $left_array_shape_types = []; - foreach ($left->getTypeSet() as $type) { - if ($type instanceof ArrayShapeType) { - $left_array_shape_types[] = $type; - } else { - $result->addType($type); - } - } - $result->addType(ArrayShapeType::combineWithPrecedence( - ArrayShapeType::fromFieldTypes([$field_dim_value => $field_type], false), - // TODO: Add possibly_undefined annotations in union - ArrayShapeType::union($left_array_shape_types) - )); - return $result->getUnionType(); - } - - /** - * Overridden in subclasses - * - * @param int $key_type - * Corresponds to the type of the array keys. Set this to a GenericArrayType::KEY_* constant. - * - * @return Type - * Get a new type which is the generic array version of - * this type. For instance, 'int[]' will produce 'int[][]'. - * - * As a special case to reduce false positives, 'array' (with no known types) will produce 'array' - */ - public function asGenericArrayType(int $key_type) : Type - { - return GenericArrayType::fromElementType($this, false, $key_type); - } - - protected function canCastToNonNullableType(Type $type) : bool - { - // CallableDeclarationType is not a native type, we check separately here - return parent::canCastToNonNullableType($type) || $type instanceof ArrayType || $type instanceof CallableDeclarationType; - } - - /** - * @return UnionType int|string for arrays - */ - public function iterableKeyUnionType(CodeBase $unused_code_base) - { - // Reduce false positive partial type mismatch errors - return UnionType::empty(); - /** - static $result; - if ($result === null) { - $result = UnionType::fromFullyQualifiedString('int|string'); - } - return $result; - */ - } - - /** - * Returns true if this contains a type that is definitely nullable or a non-object. - * e.g. returns true false, array, int - * returns false for callable, object, iterable, T, etc. - */ - public function isDefiniteNonObjectType() : bool - { - return true; - } - - /** - * Check if this type can satisfy a comparison (<, <=, >, >=) - * @param int|string|float|bool|null $scalar - * @param int $flags (e.g. \ast\flags\BINARY_IS_SMALLER) - * @internal - */ - public function canSatisfyComparison($scalar, int $flags) : bool - { - return parent::performComparison([], $scalar, $flags); - } -} -// Trigger the autoloader for GenericArrayType so that it won't be called -// before ArrayType. -// This won't pass if GenericArrayType is in the process of being instantiated. -\class_exists(GenericArrayType::class); -\class_exists(ArrayShapeType::class); diff --git a/vendor/phan/phan/src/Phan/Language/Type/BoolType.php b/vendor/phan/phan/src/Phan/Language/Type/BoolType.php deleted file mode 100644 index 5e39120..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/BoolType.php +++ /dev/null @@ -1,98 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Config; -use Phan\Language\Type; - -/** - * Phan's representation of the type for `bool`. - * - * @see TrueType - * @see FalseType - */ -final class BoolType extends ScalarType -{ - /** @phan-override */ - const NAME = 'bool'; - public function getIsPossiblyFalsey() : bool - { - return true; // it's always falsey, since this is conceptually a collection of FalseType and TrueType - } - - public function asNonFalseyType() : Type - { - return TrueType::instance(false); - } - - public function asNonTruthyType() : Type - { - return FalseType::instance($this->is_nullable); - } - - public function getIsPossiblyFalse() : bool - { - return true; // it's possibly false, since this is conceptually a collection of FalseType and TrueType - } - - public function asNonFalseType() : Type - { - return TrueType::instance($this->is_nullable); - } - - public function getIsPossiblyTrue() : bool - { - return true; // it's possibly true, since this is conceptually a collection of FalseType and TrueType - } - - public function asNonTrueType() : Type - { - return FalseType::instance($this->is_nullable); - } - - public function getIsInBoolFamily() : bool - { - return true; - } - - public function getIsAlwaysTruthy() : bool - { - return false; // overridden in various types. This base class (Type) is implicitly the type of an object, which is always truthy. - } - - /** - * Helper function for internal use by UnionType - */ - public function getNormalizationFlags() : int - { - return $this->is_nullable ? (self::_bit_nullable | self::_bit_true | self::_bit_false) : (self::_bit_true | self::_bit_false); - } - - public function isPrintableScalar() : bool - { - // This would be '' or '1', which is probably not intended - return Config::getValue('scalar_implicit_cast'); - } - - public function isValidNumericOperand() : bool - { - return Config::getValue('scalar_implicit_cast'); - } - - /** - * Check if this type can satisfy a comparison (<, <=, >, >=) - * @param int|string|float|bool|null $scalar - * @param int $flags (e.g. \ast\flags\BINARY_IS_SMALLER) - * @internal - */ - public function canSatisfyComparison($scalar, int $flags) : bool - { - return self::performComparison(false, $scalar, $flags) || - self::performComparison(true, $scalar, $flags); - } -} - -// Temporary hack to load FalseType and TrueType before BoolType::instance() is called -// (Due to bugs in php static variables) -\class_exists(FalseType::class); -\class_exists(TrueType::class); diff --git a/vendor/phan/phan/src/Phan/Language/Type/CallableDeclarationType.php b/vendor/phan/phan/src/Phan/Language/Type/CallableDeclarationType.php deleted file mode 100644 index 6caa8a7..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/CallableDeclarationType.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Language\Type; - -/** - * Phan's representation for types such as `callable(MyClass):MyOtherClass` - */ -final class CallableDeclarationType extends FunctionLikeDeclarationType implements CallableInterface -{ - /** @override */ - const NAME = 'callable'; - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - public function canCastToNonNullableType(Type $type) : bool - { - if ($type->isCallable()) { - if ($type instanceof FunctionLikeDeclarationType) { - // TODO: Weaker mode to allow callable to cast to Closure - return $type instanceof CallableDeclarationType && $this->canCastToNonNullableFunctionLikeDeclarationType($type); - } - return true; - } - - return parent::canCastToNonNullableType($type); - } - - /** - * @override to prevent Phan from emitting PhanUndeclaredTypeParameter when using this in phpdoc - */ - public function isNativeType() : bool - { - return true; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/CallableInterface.php b/vendor/phan/phan/src/Phan/Language/Type/CallableInterface.php deleted file mode 100644 index f6a61df..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/CallableInterface.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -/** - * This is generated from phpdoc such as callable-string, callable, callable(int):void, etc. - * - * This does not include Closure types. - */ -interface CallableInterface -{ -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/CallableStringType.php b/vendor/phan/phan/src/Phan/Language/Type/CallableStringType.php deleted file mode 100644 index 4b14c4f..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/CallableStringType.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * Phan's representation for `callable-string` - * - * @see CallableDeclarationType for Phan's representation of `callable(MyClass):MyOtherClass` - */ -final class CallableStringType extends StringType implements CallableInterface -{ - /** @phan-override */ - const NAME = 'callable-string'; - - /** - * @return bool - * True if this type is a callable or a Closure. - */ - public function isCallable() : bool - { - return true; - } - - protected function canCastToNonNullableType(Type $type) : bool - { - // CallableDeclarationType is not a native type, we check separately here - return parent::canCastToNonNullableType($type) || $type instanceof CallableDeclarationType; - } - - /** - * Returns true if this contains a type that is definitely non-callable - * e.g. returns true for false, array, int - * returns false for callable, string, array, object, iterable, T, etc. - */ - public function isDefiniteNonCallableType() : bool - { - return false; - } - - /** @override */ - public function getIsPossiblyNumeric() : bool - { - return false; - } - - /** - * Returns the type after an expression such as `++$x` - */ - public function getTypeAfterIncOrDec() : UnionType - { - return UnionType::fromFullyQualifiedString('string'); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/CallableType.php b/vendor/phan/phan/src/Phan/Language/Type/CallableType.php deleted file mode 100644 index f635410..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/CallableType.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Language\Type; - -/** - * Phan's representation for `callable` - * - * @see CallableDeclarationType for Phan's representation of `callable(MyClass):MyOtherClass` - */ -final class CallableType extends NativeType implements CallableInterface -{ - /** @phan-override */ - const NAME = 'callable'; - - /** - * @return bool - * True if this type is a callable or a Closure. - */ - public function isCallable() : bool - { - return true; - } - - protected function canCastToNonNullableType(Type $type) : bool - { - // CallableDeclarationType is not a native type, we check separately here - return parent::canCastToNonNullableType($type) || $type instanceof CallableDeclarationType; - } - - /** - * Returns true if this contains a type that is definitely non-callable - * e.g. returns true for false, array, int - * returns false for callable, string, array, object, iterable, T, etc. - */ - public function isDefiniteNonCallableType() : bool - { - return false; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/ClassStringType.php b/vendor/phan/phan/src/Phan/Language/Type/ClassStringType.php deleted file mode 100644 index 39c7b96..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/ClassStringType.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Closure; -use Phan\CodeBase; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * A type representing a string with an unknown value that is a fully qualified class name. - * - * Phan's representation for `class-string` and `class-string<T>`. - */ -final class ClassStringType extends StringType -{ - /** @phan-override */ - const NAME = 'class-string'; - - /** @override */ - public function getIsPossiblyNumeric() : bool - { - return false; - } - - /** - * Returns the type after an expression such as `++$x` - */ - public function getTypeAfterIncOrDec() : UnionType - { - return UnionType::fromFullyQualifiedString('string'); - } - - public function hasTemplateTypeRecursive() : bool - { - $template_union_type = $this->template_parameter_type_list[0] ?? null; - if (!$template_union_type) { - return false; - } - foreach ($template_union_type->getTypeSet() as $type) { - if ($type instanceof TemplateType) { - return true; - } - } - return false; - } - - /** - * Returns the class union type this class string represents, or the empty union type - */ - public function getClassUnionType() : UnionType - { - $template_union_type = $this->template_parameter_type_list[0] ?? null; - if (!$template_union_type) { - return UnionType::empty(); - } - return $template_union_type->makeFromFilter(static function (Type $type) : bool { - return $type instanceof TemplateType || $type->isObjectWithKnownFQSEN(); - }); - } - - /** - * @param CodeBase $code_base may be used for resolving inheritance @phan-unused-param - * @param TemplateType $template_type the template type that this union type is being searched for - * - * @return ?Closure(UnionType):UnionType a closure to determine the union type(s) that are in the same position(s) as the template type. - * This is overridden in subclasses. - */ - public function getTemplateTypeExtractorClosure(CodeBase $code_base, TemplateType $template_type) - { - $template_union_type = $this->template_parameter_type_list[0] ?? null; - if (!$template_union_type) { - return null; - } - if (!$template_union_type->isType($template_type)) { - return null; - } - return static function (UnionType $type) : UnionType { - $result = UnionType::empty(); - foreach ($type->asStringScalarValues() as $string) { - // Convert string arguments to the classes they represent - try { - $fqsen = FullyQualifiedClassName::fromFullyQualifiedString($string); - } catch (\Exception $_) { - continue; - } - // Include the type, which may or may not be undefined - $result = $result->withType($fqsen->asType()); - } - return $result; - }; - } - - public function __toString() : string - { - $string = self::NAME; - - if (\count($this->template_parameter_type_list) > 0) { - $string .= $this->templateParameterTypeListAsString(); - } - - if ($this->is_nullable) { - $string = '?' . $string; - } - - return $string; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/ClosureDeclarationParameter.php b/vendor/phan/phan/src/Phan/Language/Type/ClosureDeclarationParameter.php deleted file mode 100644 index d7bdcc9..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/ClosureDeclarationParameter.php +++ /dev/null @@ -1,190 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\CodeBase; -use Phan\Language\Element\Parameter; -use Phan\Language\FileRef; -use Phan\Language\UnionType; - -/** - * Not a type, but used by ClosureDeclarationType - */ -final class ClosureDeclarationParameter -{ - /** @var UnionType the union type of the arguments expected for this variadic/non-variadic parameter */ - private $type; - - /** @var bool is this parameter variadic? */ - private $is_variadic; - - /** @var bool is this parameter pass-by-reference? */ - private $is_reference; - - /** @var bool is this parameter optional? */ - private $is_optional; - - public function __construct(UnionType $type, bool $is_variadic, bool $is_reference, bool $is_optional) - { - $this->type = $type; - $this->is_variadic = $is_variadic; - $this->is_reference = $is_reference; - $this->is_optional = $is_optional || $is_variadic; - } - - /** - * Gets the non-variadic type of this parameter. - * (i.e. the type of individual arguments the closure expects to be passed in by the caller) - * - * @suppress PhanUnreferencedPublicMethod - */ - public function getNonVariadicUnionType() : UnionType - { - return $this->type; - } - - /** - * Is this variadic? - */ - public function isVariadic() : bool - { - return $this->is_variadic; - } - - /** - * Is this passed by reference? - */ - public function isPassByReference() : bool - { - return $this->is_reference; - } - - /** - * Is this an optional parameter - * (i.e. do callers have to pass an argument for this parameter) - */ - public function isOptional() : bool - { - return $this->is_optional; - } - - // for debugging - public function __toString() : string - { - $repr = $this->type->__toString(); - if ($this->is_reference) { - $repr .= '&'; - } - if ($this->is_variadic) { - $repr .= '...'; - } - if ($this->is_optional && !$this->is_variadic) { - $repr .= '='; - } - return $repr; - } - - /** - * Checks if this parameter can be used as an equivalent or more permissive form of the parameter $other. - * This is used to check if closure/callable types can be cast to other closure/callable types. - * - * @see \Phan\Analysis\ParameterTypesAnalyzer::analyzeOverrideSignatureForOverriddenMethod() - Similar logic using LSP - */ - public function canCastToParameterIgnoringVariadic(ClosureDeclarationParameter $other) : bool - { - if ($this->is_reference !== $other->is_reference) { - return false; - } - if (!$this->is_optional && $other->is_optional) { - // We should have already checked this - return false; - } - // TODO: stricter? (E.g. shouldn't allow int|string to cast to int) - return $this->type->canCastToUnionType($other->type); - } - - /** - * Checks if this parameter can be used as an equivalent or more permissive form of the parameter $other. - * This is used to check if closure/callable types can be cast to other closure/callable types. - * - * This also allows templates to be used instead - * - * @see \Phan\Analysis\ParameterTypesAnalyzer::analyzeOverrideSignatureForOverriddenMethod() - Similar logic using LSP - */ - public function canCastToParameterHandlingTemplatesIgnoringVariadic(ClosureDeclarationParameter $other, CodeBase $code_base) : bool - { - if ($this->is_reference !== $other->is_reference) { - return false; - } - if (!$this->is_optional && $other->is_optional) { - // We should have already checked this - return false; - } - // TODO: stricter? (E.g. shouldn't allow int|string to cast to int) - return $this->type->canCastToUnionTypeHandlingTemplates($other->type, $code_base); - } - - /** - * Creates a ClosureDeclarationParameter with template types replaced with the corresponding union types. - * - * @param array<string,UnionType> $template_parameter_type_map - */ - public function withTemplateParameterTypeMap(array $template_parameter_type_map) : ClosureDeclarationParameter - { - $new_type = $this->type->withTemplateParameterTypeMap($template_parameter_type_map); - if ($new_type === $this->type) { - return $this; - } - - return new self($new_type, $this->is_variadic, $this->is_reference, $this->is_optional); - } - - // TODO: Memoize? - /** - * Creates a parameter with the non-variadic version of the type - * (i.e. with the type seen by callers for individual arguments) - */ - public function asNonVariadicRegularParameter(int $i) : Parameter - { - $flags = 0; - // Skip variadic - if ($this->is_reference) { - $flags |= \ast\flags\PARAM_REF; - } - $result = Parameter::create( - (new FileRef())->withFile('phpdoc'), - "p$i", - $this->type, - $flags - ); - if ($this->is_optional && !$this->is_variadic) { - $result->setDefaultValueType($this->type); - } - return $result; - } - - /** - * Converts this to a regular parameter (e.g. as a placeholder for the ith parameter in a FunctionInterface) - * (e.g. $p0, $p1, etc.) - */ - public function asRegularParameter(int $i) : Parameter - { - $flags = 0; - if ($this->is_variadic) { - $flags |= \ast\flags\PARAM_VARIADIC; - } - if ($this->is_reference) { - $flags |= \ast\flags\PARAM_REF; - } - $result = Parameter::create( - (new FileRef())->withFile('phpdoc'), - "p$i", - $this->type, - $flags - ); - if ($this->is_optional && !$this->is_variadic) { - $result->setDefaultValueType(MixedType::instance(false)->asUnionType()); - } - return $result; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/ClosureDeclarationType.php b/vendor/phan/phan/src/Phan/Language/Type/ClosureDeclarationType.php deleted file mode 100644 index b9a0637..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/ClosureDeclarationType.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Language\Type; - -/** - * Phan's representation for annotations such as `Closure(MyClass):MyOtherClass` - * @see ClosureType for the representation of `Closure` (and closures for function-like FQSENs) - */ -final class ClosureDeclarationType extends FunctionLikeDeclarationType -{ - /** @override */ - const NAME = 'Closure'; - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - public function canCastToNonNullableType(Type $type) : bool - { - if ($type->isCallable()) { - if ($type instanceof FunctionLikeDeclarationType) { - return $this->canCastToNonNullableFunctionLikeDeclarationType($type); - } - return true; - } - - return parent::canCastToNonNullableType($type); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/ClosureType.php b/vendor/phan/phan/src/Phan/Language/Type/ClosureType.php deleted file mode 100644 index 310b2b2..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/ClosureType.php +++ /dev/null @@ -1,186 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use AssertionError; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\FQSEN; -use Phan\Language\Type; - -/** - * Phan's representation of `Closure` and of closures associated with a given function-like's FQSEN - * @see ClosureDeclarationType for representations created from PHPDoc `Closure(MyClass):MyOtherClass`. - */ -final class ClosureType extends Type -{ - /** Not an override */ - const NAME = 'Closure'; - - /** - * @var FQSEN|null the FQSEN of the function-like from which this ClosureType was derived - */ - private $fqsen; - - /** - * @var ?FunctionInterface (Kept to check for type compatibility) - * NOTE: We may use class FQSENs (for __invoke) or Method FQSENs if the closure was created via reflection - */ - private $func; - - // Same as instance(), but guaranteed not to have memoized state. - private static function closureInstance() : ClosureType - { - static $instance = null; - if ($instance === null) { - $instance = self::make('\\', self::NAME, [], false, self::FROM_NODE); - } - return $instance; - } - - /** - * Create an instance of Closure for the FQSEN of the passed in function/closure/method $func with FQSEN $fqsen - */ - public static function instanceWithClosureFQSEN(FQSEN $fqsen, FunctionInterface $func = null) : ClosureType - { - static $original_instance = null; - if ($original_instance === null) { - $original_instance = self::closureInstance(); - } - // Use an instance with no memoized or lazily initialized results. - // Avoids picking up changes to ClosureType::instance(false) in the case that a result depends on asFQSEN() - $instance = clone($original_instance); - $instance->fqsen = $fqsen; - $instance->func = $func; - $instance->memoizeFlushAll(); - return $instance; - } - - public function __clone() - { - if ($this->fqsen !== null) { - throw new AssertionError('should only clone null fqsen'); - } - $this->singleton_union_type = null; - // same as new static($this->namespace, $this->name, $this->template_parameter_type_list, $this->is_nullable); - } - - /** - * Is this a closure which points to a known FQSEN - * (in internal or parsed function-likes, classes, methods, closures, etc. - */ - public function hasKnownFQSEN() : bool - { - return $this->fqsen !== null; - } - - /** - * Override asFQSEN to return the closure's FQSEN - */ - public function asFQSEN() : FQSEN - { - return $this->fqsen ?? parent::asFQSEN(); - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - protected function canCastToNonNullableType(Type $type) : bool - { - if ($type->isCallable()) { - if ($type instanceof FunctionLikeDeclarationType) { - // Check if the function declaration is known and available. It's not available for the generic \Closure. - if ($this->func) { - return $this->func->asFunctionLikeDeclarationType()->canCastToNonNullableFunctionLikeDeclarationType($type); - } - } - return true; - } - - return parent::canCastToNonNullableType($type); - } - - /** - * @param bool $is_nullable - * If true, returns a nullable instance of this closure type - * - * @return static an instance of this closure type with appropriate nullability - */ - public static function instance(bool $is_nullable) - { - if ($is_nullable) { - static $nullable_instance = null; - - if (!$nullable_instance) { - $nullable_instance = self::make('\\', self::NAME, [], true, Type::FROM_NODE); - } - if (!($nullable_instance instanceof self)) { - throw new AssertionError("Expected ClosureType::make to return ClosureType"); - } - - return $nullable_instance; - } - - static $instance = null; - - if ($instance === null) { - $instance = self::make('\\', self::NAME, [], false, Type::FROM_NODE); - } - - if (!($instance instanceof self)) { - throw new AssertionError("Expected ClosureType::make to return ClosureType"); - } - return $instance; - } - - /** - * @return bool - * True if this type is a callable or a Closure. - */ - public function isCallable() : bool - { - return true; - } - - public function __toString() - { - if ($this->func) { - $result = $this->func->asFunctionLikeDeclarationType()->__toString(); - } else { - $result = '\Closure'; - } - - return $this->is_nullable ? "?$result" : $result; - } - - /** - * Returns true if this contains a type that is definitely non-callable - * e.g. returns true for false, array, int - * returns false for callable, array, object, iterable, T, etc. - */ - public function isDefiniteNonCallableType() : bool - { - return false; - } - - /** - * Gets the function-like this type was created from. - * - * TODO: Uses of this may keep outdated data in language server mode. - * @return ?FunctionInterface - * @deprecated use asFunctionInterfaceOrNull - * @suppress PhanUnreferencedPublicMethod - */ - public function getFunctionLikeOrNull() - { - return $this->func; - } - - public function asFunctionInterfaceOrNull(CodeBase $unused_codebase, Context $unused_context) - { - return $this->func; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/FalseType.php b/vendor/phan/phan/src/Phan/Language/Type/FalseType.php deleted file mode 100644 index 722e792..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/FalseType.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use AssertionError; -use Phan\Config; -use Phan\Language\Type; - -/** - * Phan's representation of PHPDoc `false` - * @see TrueType - * @see BoolType - */ -final class FalseType extends ScalarType -{ - /** @phan-override */ - const NAME = 'false'; - - public function getIsPossiblyFalsey() : bool - { - return true; // it's always falsey, whether or not it's nullable. - } - - public function getIsAlwaysFalsey() : bool - { - return true; // FalseType is always falsey, whether or not it's nullable. - } - - public function getIsAlwaysFalse() : bool - { - return !$this->is_nullable; // If it can be null, it's not **always** identical to false - } - - public function getIsPossiblyTruthy() : bool - { - return false; - } - - public function getIsAlwaysTruthy() : bool - { - return false; - } - - public function getIsPossiblyFalse() : bool - { - return true; - } - - public function asNonFalseType() : Type - { - if (!($this->is_nullable)) { - throw new AssertionError('should only call FalseType->asNonFalseType on ?false'); - } - return NullType::instance(false); - } - - public function getIsInBoolFamily() : bool - { - return true; - } - - /** - * Helper function for internal use by UnionType - */ - public function getNormalizationFlags() : int - { - return $this->is_nullable ? (self::_bit_nullable | self::_bit_false) : self::_bit_false; - } - - public function isPrintableScalar() : bool - { - // This would be '', which is probably not intended - return Config::getValue('scalar_implicit_cast'); - } - - public function isValidNumericOperand() : bool - { - return Config::getValue('scalar_implicit_cast'); - } - - /** - * Check if this type can satisfy a comparison (<, <=, >, >=) - * @param int|string|float|bool|null $scalar - * @param int $flags (e.g. \ast\flags\BINARY_IS_SMALLER) - * @internal - */ - public function canSatisfyComparison($scalar, int $flags) : bool - { - return self::performComparison(false, $scalar, $flags); - } - - // public function getTypeAfterIncOrDec() : UnionType - doesn't need to be changed -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/FloatType.php b/vendor/phan/phan/src/Phan/Language/Type/FloatType.php deleted file mode 100644 index 00c8544..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/FloatType.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Config; - -/** - * Phan's representation of the type for `float` - */ -final class FloatType extends ScalarType -{ - /** @phan-override */ - const NAME = 'float'; - - /** @override */ - public function getIsPossiblyNumeric() : bool - { - return true; - } - - public function isValidBitwiseOperand() : bool - { - return Config::getValue('scalar_implicit_cast'); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/FunctionLikeDeclarationType.php b/vendor/phan/phan/src/Phan/Language/Type/FunctionLikeDeclarationType.php deleted file mode 100644 index efbc91a..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/FunctionLikeDeclarationType.php +++ /dev/null @@ -1,950 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use ast\Node; -use Closure; -use Generator; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Element\AddressableElementInterface; -use Phan\Language\Element\Comment; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Parameter; -use Phan\Language\FileRef; -use Phan\Language\FQSEN; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\Scope\ClosedScope; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * Phan's base class for representations of `callable(MyClass):MyOtherClass` and `Closure(MyClass):MyOtherClass` - * @phan-file-suppress PhanUnusedPublicMethodParameter - */ -abstract class FunctionLikeDeclarationType extends Type implements FunctionInterface -{ - // Subclasses will override this - const NAME = ''; - - /** - * The file and location where this function-like Type was declared. - * (e.g. in a doc comment, as a closure, etc). - * @var FileRef - */ - private $file_ref; - - /** - * Describes information that was parsed about the parameters of this function-like Type. - * (Name and UnionType) - * @var array<int,ClosureDeclarationParameter> - */ - private $params; - - /** - * The return type of this function-like Type. - * @var UnionType - */ - private $return_type; - - /** - * Does this function-like type return a reference? - * Currently only possible for real closures, not for callable declarations declared in phpdoc. - * @var bool - */ - private $returns_reference; - - // computed properties - - /** @var int see FunctionTrait */ - private $required_param_count; - - /** @var int see FunctionTrait */ - private $optional_param_count; - - /** - * Is this a function declaration variadic? - * @var bool - */ - private $is_variadic; - // end computed properties - - /** - * @param array<int,ClosureDeclarationParameter> $params - * @param UnionType $return_type - */ - public function __construct(FileRef $file_ref, array $params, UnionType $return_type, bool $returns_reference, bool $is_nullable) - { - parent::__construct('\\', static::NAME, [], $is_nullable); - $this->file_ref = FileRef::copyFileRef($file_ref); - $this->params = $params; - $this->return_type = $return_type; - $this->returns_reference = $returns_reference; - - $required_param_count = 0; - $optional_param_count = 0; - // TODO: Warn about required after optional - foreach ($params as $param) { - if ($param->isOptional()) { - $optional_param_count++; - if ($param->isVariadic()) { - $this->is_variadic = true; - $optional_param_count = FunctionInterface::INFINITE_PARAMETERS - $required_param_count; - break; - } - } else { - $required_param_count++; - } - } - $this->required_param_count = $required_param_count; - $this->optional_param_count = $optional_param_count; - } - - /** - * Used when serializing this type in union types. - * @return string (e.g. "Closure(int,string&...):string[]") - */ - public function __toString() : string - { - return $this->memoize(__FUNCTION__, function () : string { - $parts = []; - foreach ($this->params as $value) { - $parts[] = $value->__toString(); - } - $return_type = $this->return_type; - $return_type_string = $return_type->__toString(); - if ($return_type->typeCount() >= 2) { - $return_type_string = "($return_type_string)"; - } - return ($this->is_nullable ? '?' : '') . static::NAME . '(' . \implode(',', $parts) . '):' . $return_type_string; - }); - } - - public function __clone() - { - throw new \AssertionError('Should not clone ClosureTypeDeclaration'); - } - - /** - * @return bool - * True if this type is a callable or a Closure or a FunctionLikeDeclarationType - */ - public function isCallable() : bool - { - return true; - } - - /** - * @return ?ClosureDeclarationParameter the parameter which the argument at the index $i would be passed in as - */ - public function getClosureParameterForArgument(int $i) - { - $result = $this->params[$i] ?? null; - if (!$result) { - // @phan-suppress-next-line PhanPossiblyFalseTypeReturn is_variadic implies at least one parameter exists. - return $this->is_variadic ? \end($this->params) : null; - } - return $result; - } - - /** - * Checks if this callable can cast to the other $type, ignoring whether these are nullable. - * - * It can be cast if this can be passed to any usage of $type and satisfy expectation about parameters and returned union types. - * - * -e.g. `Closure(mixed):SubClass` can be used when a `Closure(int):BaseClass` is expected. - */ - public function canCastToNonNullableFunctionLikeDeclarationType(FunctionLikeDeclarationType $type) : bool - { - if ($this->required_param_count > $type->required_param_count) { - return false; - } - if ($this->getNumberOfParameters() < $type->getNumberOfParameters()) { - return false; - } - if ($this->returns_reference !== $type->returns_reference) { - return false; - } - // TODO: Allow nullable/null to cast to void? - if (!$this->return_type->canCastToUnionType($type->return_type)) { - return false; - } - foreach ($this->params as $i => $param) { - $other_param = $type->getClosureParameterForArgument($i) ?? null; - if (!$other_param) { - break; - } - if (!$param->canCastToParameterIgnoringVariadic($other_param)) { - return false; - } - } - - return true; - } - - /** - * Checks if this callable can cast to the other $type, ignoring whether these are nullable. - * - * It can be cast if this can be passed to any usage of $type and satisfy expectation about parameters and returned union types. - * - * -e.g. `Closure(mixed):T` can be used when a `Closure(int):\BaseClass` is expected. - * - * @see self::canCastToNonNullableType() - This is based on that. - */ - protected function canCastToNonNullableTypeHandlingTemplates(Type $type, CodeBase $code_base) : bool - { - if (parent::canCastToNonNullableTypeHandlingTemplates($type, $code_base)) { - return true; - } - if (!($type instanceof FunctionLikeDeclarationType)) { - return false; - } - if ($this->required_param_count > $type->required_param_count) { - return false; - } - if ($this->getNumberOfParameters() < $type->getNumberOfParameters()) { - return false; - } - if ($this->returns_reference !== $type->returns_reference) { - return false; - } - // TODO: Allow nullable/null to cast to void? - if (!$this->return_type->canCastToUnionTypeHandlingTemplates($type->return_type, $code_base)) { - return false; - } - foreach ($this->params as $i => $param) { - $other_param = $type->getClosureParameterForArgument($i) ?? null; - if (!$other_param) { - break; - } - if (!$param->canCastToParameterHandlingTemplatesIgnoringVariadic($other_param, $code_base)) { - return false; - } - } - - return true; - } - - /** - * @override (Don't include \Closure in the expanded types. It interferes with type casting checking) - */ - public function asExpandedTypes( - CodeBase $unused_code_base, - int $unused_recursion_depth = 0 - ) : UnionType { - return $this->asUnionType(); - } - - /** - * @override (Don't include \Closure in the expanded types. It interferes with type casting checking) - */ - public function asExpandedTypesPreservingTemplate( - CodeBase $unused_code_base, - int $unused_recursion_depth = 0 - ) : UnionType { - return $this->asUnionType(); - } - - /** - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass - * false - * - * @return Type - * A new type that is a copy of this type but with the - * given nullability value. - * - * @override - Avoid calling make() , which is not compatible with FunctionLikeDeclarationType::__construct - * (E.g. from UnionType->asNormalizedTypes) - */ - public function withIsNullable(bool $is_nullable) : Type - { - if ($is_nullable === $this->is_nullable) { - return $this; - } - return new static( - $this->file_ref, - $this->params, - $this->return_type, - $this->returns_reference, - $is_nullable - ); - } - - /** - * Returns true if this contains a type that is definitely non-callable - * e.g. returns true for false, array, int - * returns false for callable, array, object, iterable, T, etc. - */ - public function isDefiniteNonCallableType() : bool - { - return false; - } - - /** - * @return ?FunctionInterface - */ - public function asFunctionInterfaceOrNull(CodeBase $unused_codebase, Context $unused_context) - { - return $this; - } - - /** - * @return Generator<mixed,Type> (void => $inner_type) - * @override - */ - public function getReferencedClasses() : Generator - { - foreach ($this->params as $param) { - yield from $param->getNonVariadicUnionType()->getReferencedClasses(); - } - yield from $this->return_type->getReferencedClasses(); - } - - //////////////////////////////////////////////////////////////////////////////// - // Begin FunctionInterface overrides. Most of these are intentionally no-ops - //////////////////////////////////////////////////////////////////////////////// - - /** - * @override - * @return void - */ - public function addReference(FileRef $_) - { - } - - /** @override */ - public function getReferenceCount(CodeBase $_) : int - { - return 1; - } - - /** @override */ - public function getReferenceList() : array - { - return []; - } - - /** @override */ - public function isPrivate() : bool - { - return false; - } - - /** @override */ - public function isProtected() : bool - { - return false; - } - - /** @override */ - public function isPublic() : bool - { - return true; - } - - /** - * @return bool true if this element's visibility - * is strictly more visible than $other (public > protected > private) - */ - public function isStrictlyMoreVisibleThan(AddressableElementInterface $other) : bool - { - return false; - } - - /** @override */ - public function setFQSEN(FQSEN $_) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - /** - * @phan-return \Generator<FunctionLikeDeclarationType> - * @override - */ - public function alternateGenerator(CodeBase $_) : \Generator - { - yield $this; - } - - /** @override */ - public function analyze(Context $context, CodeBase $_) : Context - { - return $context; - } - - /** @override */ - public function analyzeFunctionCall(CodeBase $unused_code_base, Context $unused_context, array $_) - { - throw new \AssertionError('should not call ' . __METHOD__); - } - - /** @override */ - public function analyzeWithNewParams(Context $unused_context, CodeBase $unused_codebase, array $unused_parameter_list) : Context - { - throw new \AssertionError('should not call ' . __METHOD__); - } - - /** @override */ - public function appendParameter(Parameter $_) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - /** @override */ - public function clearParameterList() - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - /** @override */ - public function cloneParameterList() - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - /** @override */ - public function ensureScopeInitialized(CodeBase $_) - { - } - - /** @override */ - public function asFunctionLikeDeclarationType() : FunctionLikeDeclarationType - { - return $this; - } - - /** @override */ - public function getComment() - { - return null; - } - - /** @override */ - public function getDependentReturnType(CodeBase $code_base, Context $context, array $args) : UnionType - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - /** @override */ - public function hasDependentReturnType() : bool - { - return false; - } - - // TODO: Maybe create mock FQSENs for these instead. - /** @override */ - public function getElementNamespace() : string - { - return '\\'; - } - - /** @override */ - public function getFQSEN() - { - $hash = \substr(\md5($this->__toString()), 0, 12); - // @phan-suppress-next-line PhanThrowTypeAbsentForCall this is valid - return FullyQualifiedFunctionName::fromFullyQualifiedString('\\closure_phpdoc' . $hash); - } - - /** @override */ - public function getRepresentationForIssue() : string - { - // Represent this as "Closure(int):void" in issue messages instead of \closure_phpdoc_abcd123456Df - return $this->__toString(); - } - - /** @override */ - public function getNameForIssue() : string - { - // Represent this as "Closure(int):void" in issue messages instead of \closure_phpdoc_abcd123456Df - return $this->__toString(); - } - - /** @override */ - public function getHasReturn() : bool - { - return true; - } - - /** @override */ - public function getInternalScope() : ClosedScope - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - /** @return Node|null */ - public function getNode() - { - return null; - } - - /** @override */ - public function getNumberOfRequiredParameters() : int - { - return $this->required_param_count; - } - - /** @override */ - public function getNumberOfOptionalParameters() : int - { - return $this->optional_param_count; - } - - /** @override */ - public function getNumberOfRequiredRealParameters() : int - { - return $this->required_param_count; - } - - /** @override */ - public function getNumberOfOptionalRealParameters() : int - { - return $this->optional_param_count; - } - - /** @override */ - public function getNumberOfParameters() : int - { - return $this->optional_param_count + $this->required_param_count; - } - - /** @override */ - public function getOutputReferenceParamNames() : array - { - return []; - } - - /** @override */ - public function getPHPDocParameterTypeMap() - { - // Implement? - return []; - } - - /** @override */ - public function getPHPDocReturnType() - { - return $this->return_type; - } - - /** - * @return Parameter|null - * @override - */ - public function getParameterForCaller(int $i) - { - $list = $this->params; - if (\count($list) === 0) { - return null; - } - $parameter = $list[$i] ?? null; - if ($parameter) { - // This is already not variadic - return $parameter->asNonVariadicRegularParameter($i); - } - return null; - } - - /** - * @return Parameter|null - * @override - */ - public function getRealParameterForCaller(int $i) - { - // FunctionLikeDeclarationType doesn't know if the phpdoc type is the real union type. - // - // This could instead call setUnionType and setDefaultValueType to the empty union type to avoid false positives about passing in null, - // but would miss some actual bugs. - return $this->getParameterForCaller($i); - } - - /** - * @return array<int,Parameter> - */ - public function getParameterList() : array - { - $result = []; - foreach ($this->params as $i => $param) { - $result[] = $param->asRegularParameter($i); - } - return $result; - } - - public function getRealParameterList() - { - return $this->getParameterList(); - } - - public function getRealReturnType() : UnionType - { - return $this->return_type; - } - - public function getThrowsUnionType() : UnionType - { - return UnionType::empty(); - } - - public function hasFunctionCallAnalyzer() : bool - { - return false; - } - - public function isFromPHPDoc() : bool - { - return true; - } - - public function isNSInternal(CodeBase $code_base) : bool - { - return false; - } - - public function isNSInternalAccessFromContext(CodeBase $code_base, Context $context) : bool - { - return false; - } - - public function isReturnTypeUndefined() : bool - { - return false; - } - - public function needsRecursiveAnalysis() : bool - { - return false; - } - - public function recordOutputReferenceParamName(string $parameter_name) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function returnsRef() : bool - { - return $this->returns_reference; - } - - /** - * @return void - * @unused - */ - public function setComment(Comment $comment) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function setFunctionCallAnalyzer(Closure $analyzer) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function addFunctionCallAnalyzer(Closure $analyzer) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function setDependentReturnTypeClosure(Closure $analyzer) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function setHasReturn(bool $_) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function setHasYield(bool $_) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function setInternalScope(ClosedScope $scope) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function setIsReturnTypeUndefined(bool $_) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function setNumberOfOptionalParameters(int $_) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function setNumberOfRequiredParameters(int $_) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function setPHPDocParameterTypeMap(array $parameter_map) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - /** - * @param ?UnionType $union_type the raw phpdoc union type - */ - public function setPHPDocReturnType($union_type) - { - throw new \AssertionError('unexpected call to ' . __METHOD__); - } - - public function getContext() : Context - { - return (new Context()) - ->withFile($this->file_ref->getFile()) - ->withLineNumberStart($this->file_ref->getLineNumberStart()); - } - - public function getUnionType() : UnionType - { - return $this->return_type; - } - - public function getUnionTypeWithUnmodifiedStatic() : UnionType - { - return $this->return_type; - } - - public function getSuppressIssueList() : array - { - // TODO: Inherit suppress issue list from phpdoc declaring this? - return []; - } - - public function hasSuppressIssue(string $issue_type) : bool - { - return \in_array($issue_type, $this->getSuppressIssueList(), true); - } - - public function checkHasSuppressIssueAndIncrementCount(string $issue_type) : bool - { - // helpers are no-ops right now - if ($this->hasSuppressIssue($issue_type)) { - $this->incrementSuppressIssueCount($issue_type); - return true; - } - return false; - } - - public function hydrate(CodeBase $_) - { - } - - public function incrementSuppressIssueCount(string $issue_name) - { - } - - public function isDeprecated() : bool - { - return false; - } - - public function getFileRef() : FileRef - { - return $this->file_ref; - } - - public function isPHPInternal() : bool - { - return false; - } - - public function setIsDeprecated(bool $_) - { - } - - /** - * @param array<int,string> $suppress_issue_list - * @deprecated - */ - public function setSuppressIssueList(array $suppress_issue_list) - { - throw new \AssertionError('should not call ' . __METHOD__); - } - - /** - * @param array<int,string> $suppress_issue_list - */ - public function setSuppressIssueSet(array $suppress_issue_list) - { - throw new \AssertionError('should not call ' . __METHOD__); - } - - public function setUnionType(UnionType $type) - { - throw new \AssertionError('should not call ' . __METHOD__); - } - - /** - * @return array<mixed,string> in the same format as FunctionSignatureMap.php - * @override (Unused, but part of the interface) - */ - public function toFunctionSignatureArray() : array - { - // no need for returns ref yet - $return_type = $this->return_type; - $stub = [$return_type->__toString()]; - foreach ($this->params as $i => $parameter) { - $name = "p$i"; - if ($parameter->isOptional()) { - $name .= '='; - } - $type_string = $parameter->getNonVariadicUnionType()->__toString(); - if ($parameter->isPassByReference()) { - $type_string .= '&'; - } - if ($parameter->isVariadic()) { - $type_string .= '...'; - } - $stub[$name] = $type_string; - } - return $stub; - } - - public function getReturnTypeAsGeneratorTemplateType() : Type - { - // Probably unused - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - return Type::fromFullyQualifiedString('\Generator'); - } - - public function getDocComment() - { - return null; - } - - public function getMarkupDescription() : string - { - $parts = $this->toFunctionSignatureArray(); - $return_type = $parts[0]; - unset($parts[0]); - - $fragments = []; - foreach ($parts as $name => $signature) { - $fragment = '\$' . $name; - if ($signature) { - $fragment = "$signature $fragment"; - } - } - $signature = static::NAME . '(' . \implode(',', $fragments) . ')'; - if ($return_type) { - // TODO: Make this unambiguous - $signature .= ':' . $return_type; - } - return $signature; - } - - public function analyzeReturnTypes(CodeBase $unused_code_base) - { - // do nothing - } - - public function declaresTemplateTypeInComment(TemplateType $template_type) : bool - { - // not supported yet - return false; - } - - /** - * Returns true for `T` and `T[]` and `\MyClass<T>`, but not `\MyClass<\OtherClass>` or `false` - */ - public function hasTemplateTypeRecursive() : bool - { - if ($this->return_type->hasTemplateTypeRecursive()) { - return true; - } - foreach ($this->params as $param) { - if ($param->getNonVariadicUnionType()->hasTemplateTypeRecursive()) { - return true; - } - } - return false; - } - - public function getTemplateTypeExtractorClosure(CodeBase $code_base, TemplateType $template_type) - { - // Create a closure to extract types for the template type from the return type and param types. - $closure = $this->getReturnTemplateTypeExtractorClosure($code_base, $template_type); - foreach ($this->params as $i => $param) { - $param_closure = $param->getNonVariadicUnionType()->getTemplateTypeExtractorClosure($code_base, $template_type); - if (!$param_closure) { - continue; - } - $closure = TemplateType::combineParameterClosures( - $closure, - static function (UnionType $union_type, Context $context) use ($code_base, $i, $param_closure) : UnionType { - $result = UnionType::empty(); - foreach ($union_type->getTypeSet() as $type) { - $func = $type->asFunctionInterfaceOrNull($code_base, $context); - if (!$func) { - continue; - } - $param = $func->getParameterForCaller($i); - if ($param) { - $result = $result->withUnionType($param_closure( - $param->getNonVariadicUnionType(), - $context - )); - } - } - return $result; - } - ); - } - return $closure; - } - - /** - * Extracts a closure to extract the template type from the return type, or returns null - * @return ?Closure(UnionType,Context):UnionType - */ - private function getReturnTemplateTypeExtractorClosure(CodeBase $code_base, TemplateType $template_type) - { - $return_closure = $this->getUnionType()->getTemplateTypeExtractorClosure($code_base, $template_type); - if (!$return_closure) { - return null; - } - return static function (UnionType $union_type, Context $context) use ($code_base, $return_closure) : UnionType { - $result = UnionType::empty(); - foreach ($union_type->getTypeSet() as $type) { - $func = $type->asFunctionInterfaceOrNull($code_base, $context); - if ($func) { - $result = $result->withUnionType($return_closure($func->getUnionType(), $context)); - } - } - return $result; - }; - } - - /** - * @param array<string,UnionType> $template_parameter_type_map - */ - public function withTemplateParameterTypeMap( - array $template_parameter_type_map - ) : UnionType { - $new_params = \array_map(static function (ClosureDeclarationParameter $param) use ($template_parameter_type_map) : ClosureDeclarationParameter { - return $param->withTemplateParameterTypeMap($template_parameter_type_map); - }, $this->params); - $new_return_type = $this->return_type->withTemplateParameterTypeMap($template_parameter_type_map); - if ($new_params === $this->params && $new_return_type === $this->return_type) { - // no change - return $this->asUnionType(); - } - // Create ClosureDeclarationType or CallableDeclarationType - return (new static($this->file_ref, $new_params, $new_return_type, $this->returns_reference, $this->is_nullable))->asUnionType(); - } - - public function getCommentParamAssertionClosure(CodeBase $code_base) - { - return null; - } - - //////////////////////////////////////////////////////////////////////////////// - // End FunctionInterface overrides - //////////////////////////////////////////////////////////////////////////////// -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/GenericArrayInterface.php b/vendor/phan/phan/src/Phan/Language/Type/GenericArrayInterface.php deleted file mode 100644 index 442d4dc..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/GenericArrayInterface.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Language\UnionType; - -/** - * This is generated from phpdoc such as array<string,mixed>, array{field:int}, etc. - */ -interface GenericArrayInterface -{ - /** Returns the union type of this generic array type's elements. */ - public function genericArrayElementUnionType() : UnionType; -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/GenericArrayTemplateKeyType.php b/vendor/phan/phan/src/Phan/Language/Type/GenericArrayTemplateKeyType.php deleted file mode 100644 index 1f0badd..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/GenericArrayTemplateKeyType.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Closure; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * A generic array type with a template as the key - */ -class GenericArrayTemplateKeyType extends GenericArrayType -{ - /** - * @var UnionType 1 or more template types - */ - private $template_key_type; - - protected function __construct(Type $type, bool $is_nullable, UnionType $template_key_type) - { - parent::__construct($type, $is_nullable, GenericArrayType::KEY_MIXED); - $this->template_key_type = $template_key_type; - } - - /** - * Generate a GenericArrayTemplateKeyType for an element type and a template type - */ - public static function fromTemplateAndElementType( - Type $type, - bool $is_nullable, - UnionType $key_type - ) : GenericArrayTemplateKeyType { - return new self($type, $is_nullable, $key_type); - } - - /** - * @param array<string,UnionType> $template_parameter_type_map - */ - public function withTemplateParameterTypeMap( - array $template_parameter_type_map - ) : UnionType { - $element_type = $this->genericArrayElementUnionType(); - $new_element_type = $element_type->withTemplateParameterTypeMap($template_parameter_type_map); - $new_key_type = $this->template_key_type->withTemplateParameterTypeMap($template_parameter_type_map); - if ($element_type === $new_element_type && $new_key_type === $this->template_key_type) { - return $this->asUnionType(); - } - if ($this->template_key_type !== $new_key_type) { - if ($new_element_type->isEmpty()) { - $new_element_type = MixedType::instance(false)->asUnionType(); - } - return $new_element_type->asGenericArrayTypes( - GenericArrayType::keyTypeFromUnionTypeValues($new_key_type) - )->withIsNullable($this->is_nullable); - } - return $new_element_type->asMappedUnionType(function (Type $type) : Type { - return self::fromTemplateAndElementType($type, $this->is_nullable, $this->template_key_type); - }); - } - - public function hasTemplateTypeRecursive() : bool - { - return true; - } - - /** - * If this generic array type in a parameter declaration has template types, - * get the closure to extract the real types for that template type from argument union types - * - * @param CodeBase $code_base - * @return ?Closure(UnionType, Context):UnionType - */ - public function getTemplateTypeExtractorClosure(CodeBase $code_base, TemplateType $template_type) - { - $element_closure = parent::getTemplateTypeExtractorClosure($code_base, $template_type); - $key_closure = $this->template_key_type->getTemplateTypeExtractorClosure($code_base, $template_type); - return TemplateType::combineParameterClosures($key_closure, $element_closure); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/GenericArrayType.php b/vendor/phan/phan/src/Phan/Language/Type/GenericArrayType.php deleted file mode 100644 index 7e27167..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/GenericArrayType.php +++ /dev/null @@ -1,709 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use ast\Node; -use Closure; -use Generator; -use InvalidArgumentException; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Debug\Frame; -use Phan\Exception\RecursionDepthException; -use Phan\Language\Context; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Language\UnionTypeBuilder; - -/** - * Phan's representation for the types `array<string,MyClass>` and `MyClass[]` - * @see ArrayShapeType for representations of `array{key:MyClass}` - * @see ArrayType for the representation of `array` - */ -class GenericArrayType extends ArrayType implements GenericArrayInterface -{ - /** @phan-override */ - const NAME = 'array'; - - // In PHP, array keys can be integers or strings. These constants describe all possible combinations of those key types. - - /** - * No array keys. - * Array types with this key type Similar to KEY_MIXED, but adding a key type will change the array to the new key - * instead of staying as KEY_MIXED. - */ - const KEY_EMPTY = 0; // No way to create this type yet. - /** array keys are integers */ - const KEY_INT = 1; - /** array keys are strings */ - const KEY_STRING = 2; - /** array keys are integers or strings. */ - const KEY_MIXED = 3; // i.e. KEY_INT|KEY_STRING - - const KEY_NAMES = [ - self::KEY_EMPTY => 'empty', - self::KEY_INT => 'int', - self::KEY_STRING => 'string', - self::KEY_MIXED => 'mixed', // treated the same way as int|string - ]; - - /** - * @var Type - * The type of every value in this array - */ - private $element_type; - - /** - * @var int - * Enum representing the type of every key in this array - */ - private $key_type; - - /** - * @param Type $type - * The type of every element in this array - * - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass - * false - * - * @param int $key_type - * Corresponds to the type of the array keys. Set this to a GenericArrayType::KEY_* constant. - * - * @throws InvalidArgumentException if $key_type is an invalid constant - */ - protected function __construct(Type $type, bool $is_nullable, int $key_type) - { - if ($key_type & ~3) { - throw new InvalidArgumentException("Invalid key_type $key_type"); - } - parent::__construct('\\', self::NAME, [], $is_nullable); - $this->element_type = $type; - $this->key_type = $key_type; - } - - /** - * Returns the key type of this generic array. - * e.g. for `int[]`, returns self::KEY_MIXED, for `array<string,mixed>`, returns self::KEY_STRING. - */ - public function getKeyType() : int - { - return $this->key_type; - } - - /** - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass - * false - * - * @return Type - * A new type that is a copy of this type but with the - * given nullability value. - */ - public function withIsNullable(bool $is_nullable) : Type - { - if ($is_nullable === $this->is_nullable) { - return $this; - } - - return GenericArrayType::fromElementType( - $this->element_type, - $is_nullable, - $this->key_type - ); - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - protected function canCastToNonNullableType(Type $type) : bool - { - if ($type instanceof ArrayType) { - if ($type instanceof GenericArrayType) { - if (!$this->genericArrayElementType() - ->canCastToType($type->genericArrayElementType())) { - return false; - } - if ((($this->key_type ?: self::KEY_MIXED) & ($type->key_type ?: self::KEY_MIXED)) === 0) { - // Attempting to cast an int key to a string key (or vice versa) is normally invalid. - // However, the scalar_array_key_cast config would make any cast of array keys a valid cast. - return Config::getValue('scalar_array_key_cast'); - } - return true; - } elseif ($type instanceof ArrayShapeType) { - if ((($this->key_type ?: self::KEY_MIXED) & $type->getKeyType()) === 0 && !Config::getValue('scalar_array_key_cast')) { - // Attempting to cast an int key to a string key (or vice versa) is normally invalid. - // However, the scalar_array_key_cast config would make any cast of array keys a valid cast. - return false; - } - return $this->genericArrayElementUnionType()->canCastToUnionType($type->genericArrayElementUnionType()); - } - return true; - } - - if (\get_class($type) === IterableType::class) { - // can cast to Iterable but not Traversable - return true; - } - if ($type instanceof GenericIterableType) { - return $this->canCastToGenericIterableType($type); - } - - $d = \strtolower($type->__toString()); - if ($d[0] == '\\') { - $d = \substr($d, 1); - } - if ($d === 'callable') { - return $this->key_type !== self::KEY_STRING; - } - - return parent::canCastToNonNullableType($type); - } - - private function canCastToGenericIterableType( - GenericIterableType $iterable_type - ) : bool { - if (!$this->element_type->asUnionType()->canCastToUnionType($iterable_type->getElementUnionType())) { - return false; - } - // TODO: Account for scalar key casting config - $key_union_type = self::unionTypeForKeyType($this->key_type); - if (!$key_union_type->canCastToUnionType($iterable_type->getKeyUnionType())) { - return false; - } - return true; - } - - /** - * @param Type $type - * The element type for an array. - * - * @param bool $is_nullable - * Set to true if the this is a nullable array(e.g. `?($type[])`), - * else pass false - * - * @param int $key_type - * Corresponds to the type of the array keys. Set this to a GenericArrayType::KEY_* constant. - * - * @return GenericArrayType - * Get a type representing an array of the given type - */ - public static function fromElementType( - Type $type, - bool $is_nullable, - int $key_type - ) : GenericArrayType { - // Make sure we only ever create exactly one - // object for any unique type - static $canonical_object_maps = null; - - if ($canonical_object_maps === null) { - $canonical_object_maps = []; - for ($i = 0; $i < 8; $i++) { - $canonical_object_maps[] = new \SplObjectStorage(); - } - } - $map_index = $key_type * 2 + ($is_nullable ? 1 : 0); - - $map = $canonical_object_maps[$map_index]; - - if (!$map->contains($type)) { - $map->attach( - $type, - new GenericArrayType($type, $is_nullable, $key_type) - ); - } - - return $map->offsetGet($type); - } - - public function isGenericArray() : bool - { - return true; - } - - /** - * @return Type - * A variation of this type that is not generic. - * i.e. 'int[]' becomes 'int'. - */ - public function genericArrayElementType() : Type - { - return $this->element_type; - } - - /** - * @return UnionType returns the array value's union type - * @phan-override - */ - public function iterableValueUnionType(CodeBase $unused_codebase) - { - return $this->element_type->asUnionType(); - } - - /** - * @return UnionType the array key's union type - * @phan-override - */ - public function iterableKeyUnionType(CodeBase $unused_codebase) - { - return self::unionTypeForKeyType($this->key_type); - } - - /** - * @return UnionType - * A variation of this type that is not generic. - * i.e. 'int[]' becomes 'int'. - */ - public function genericArrayElementUnionType() : UnionType - { - return $this->element_type->asUnionType(); - } - - public function __toString() : string - { - $string = $this->element_type->__toString(); - if ($this->key_type === self::KEY_MIXED) { - // Disambiguation is needed for ?T[] and (?T)[] but not array<int,?T> - if ($string[0] === '?') { - $string = '(' . $string . ')'; - } - $string = "{$string}[]"; - } else { - $string = 'array<' . self::KEY_NAMES[$this->key_type] . ',' . $string . '>'; - } - - if ($this->is_nullable) { - if ($string[0] === '?') { - $string = "?($string)"; - } else { - $string = '?' . $string; - } - } - - return $string; - } - - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands class types to all inherited classes returning - * a superset of this type. - * @override - */ - public function asExpandedTypes( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - // We're going to assume that if the type hierarchy - // is taller than some value we probably messed up - // and should bail out. - if ($recursion_depth >= 20) { - throw new RecursionDepthException("Recursion has gotten out of hand: " . Frame::getExpandedTypesDetails()); - } - - return $this->memoize(__METHOD__, function () use ($code_base, $recursion_depth) : UnionType { - $union_type = $this->asUnionType(); - - $element_type = $this->genericArrayElementType(); - if (!$element_type->isObjectWithKnownFQSEN()) { - return $union_type; - } - $class_fqsen = FullyQualifiedClassName::fromType($element_type); - - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - return $union_type; - } - - $clazz = $code_base->getClassByFQSEN($class_fqsen); - - $class_union_type = $clazz->getUnionType(); - $additional_union_type = $clazz->getAdditionalTypes(); - if ($additional_union_type !== null) { - $class_union_type = $class_union_type->withUnionType($additional_union_type); - } - - $union_type = $union_type->withUnionType( - $class_union_type->asGenericArrayTypes($this->key_type) - ); - - // Recurse up the tree to include all types - $recursive_union_type_builder = new UnionTypeBuilder(); - $representation = $this->__toString(); - try { - foreach ($union_type->getTypeSet() as $clazz_type) { - if ($clazz_type->__toString() !== $representation) { - $recursive_union_type_builder->addUnionType( - $clazz_type->asExpandedTypes( - $code_base, - $recursion_depth + 1 - ) - ); - } else { - $recursive_union_type_builder->addType($clazz_type); - } - } - } catch (RecursionDepthException $_) { - return ArrayType::instance($this->is_nullable)->asUnionType(); - } - - // Add in aliases - // (If enable_class_alias_support is false, this will do nothing) - if (Config::getValue('enable_class_alias_support')) { - self::addClassAliases($code_base, $recursive_union_type_builder, $class_fqsen); - } - return $recursive_union_type_builder->getUnionType(); - }); - } - - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands class types to all inherited classes returning - * a superset of this type. - * @override - */ - public function asExpandedTypesPreservingTemplate( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - // We're going to assume that if the type hierarchy - // is taller than some value we probably messed up - // and should bail out. - if ($recursion_depth >= 20) { - throw new RecursionDepthException("Recursion has gotten out of hand: " . Frame::getExpandedTypesDetails()); - } - - return $this->memoize(__METHOD__, function () use ($code_base, $recursion_depth) : UnionType { - $union_type = $this->asUnionType(); - - $class_fqsen = FullyQualifiedClassName::fromType($this->genericArrayElementType()); - - - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - return $union_type; - } - - $clazz = $code_base->getClassByFQSEN($class_fqsen); - - $class_union_type = $clazz->getUnionType(); - $additional_union_type = $clazz->getAdditionalTypes(); - if ($additional_union_type !== null) { - $class_union_type = $class_union_type->withUnionType($additional_union_type); - } - - $union_type = $union_type->withUnionType( - $class_union_type->asGenericArrayTypes($this->key_type) - ); - - // Recurse up the tree to include all types - $recursive_union_type_builder = new UnionTypeBuilder(); - $representation = $this->__toString(); - try { - foreach ($union_type->getTypeSet() as $clazz_type) { - if ($clazz_type->__toString() !== $representation) { - $recursive_union_type_builder->addUnionType( - $clazz_type->asExpandedTypesPreservingTemplate( - $code_base, - $recursion_depth + 1 - ) - ); - } else { - $recursive_union_type_builder->addType($clazz_type); - } - } - } catch (RecursionDepthException $_) { - return ArrayType::instance($this->is_nullable)->asUnionType(); - } - - // Add in aliases - // (If enable_class_alias_support is false, this will do nothing) - if (Config::getValue('enable_class_alias_support')) { - self::addClassAliases($code_base, $recursive_union_type_builder, $class_fqsen); - } - return $recursive_union_type_builder->getUnionType(); - }); - } - - // (If enable_class_alias_support is false, this will not be called) - private function addClassAliases( - CodeBase $code_base, - UnionTypeBuilder $union_type_builder, - FullyQualifiedClassName $class_fqsen - ) { - $fqsen_aliases = $code_base->getClassAliasesByFQSEN($class_fqsen); - foreach ($fqsen_aliases as $alias_fqsen_record) { - $alias_fqsen = $alias_fqsen_record->alias_fqsen; - $union_type_builder->addType( - $alias_fqsen->asType()->asGenericArrayType($this->key_type) - ); - } - } - - /** - * Returns the key type for the keys of this union type. - * E.g. for `array<string,\stdClass>`, returns self::KEY_STRING - */ - public static function keyTypeFromUnionTypeKeys(UnionType $union_type) : int - { - $key_types = self::KEY_EMPTY; - foreach ($union_type->getTypeSet() as $type) { - if ($type instanceof GenericArrayType) { - $key_types |= $type->key_type; - } elseif ($type instanceof ArrayShapeType) { - if ($type->isNotEmptyArrayShape()) { - $key_types |= $type->getKeyType(); - } - } - // Treating ArrayType as mixed or excluding ArrayType would both cause false positives. Ignore ArrayType. - } - // int|string corresponds to KEY_MIXED (KEY_INT|KEY_STRING) - // And if we're unable to find any types, return KEY_MIXED. - return $key_types ?: self::KEY_MIXED; - } - - /** @suppress PhanUnreferencedPublicClassConstant */ - const CONVERT_KEY_MIXED_TO_EMPTY_UNION_TYPE = 0; - const CONVERT_KEY_MIXED_TO_INT_OR_STRING_UNION_TYPE = 1; - - /** - * @return UnionType a union type corresponding to $key_type - * @suppress PhanTypeMismatchReturnNullable false positive with static init - */ - public static function unionTypeForKeyType(int $key_type, int $behavior = self::CONVERT_KEY_MIXED_TO_INT_OR_STRING_UNION_TYPE) : UnionType - { - static $int_union_type = null; - static $string_union_type = null; - static $int_or_string_union_type = null; - if ($int_union_type === null) { - $int_union_type = UnionType::fromFullyQualifiedString('int'); - $string_union_type = UnionType::fromFullyQualifiedString('string'); - $int_or_string_union_type = UnionType::fromFullyQualifiedString('int|string'); - } - switch ($key_type) { - case self::KEY_INT: - return $int_union_type; - case self::KEY_STRING: - return $string_union_type; - default: - if ($behavior === self::CONVERT_KEY_MIXED_TO_INT_OR_STRING_UNION_TYPE) { - return $int_or_string_union_type; - } - return UnionType::empty(); - } - } - - /** - * Returns `self::KEY_*` corresponding to the provided union type. - * E.g. for `string`, returns `self::KEY_STRING`. - */ - public static function keyTypeFromUnionTypeValues(UnionType $union_type) : int - { - $key_types = self::KEY_EMPTY; - foreach ($union_type->getTypeSet() as $type) { - if ($type instanceof StringType) { - $key_types |= self::KEY_STRING; - } elseif ($type instanceof IntType) { - $key_types |= self::KEY_INT; - } elseif ($type instanceof MixedType) { - // Anything including a mixed type is a mixed type. - return self::KEY_MIXED; - } // skip invalid types. - } - // int|string corresponds to KEY_MIXED (KEY_INT|KEY_STRING) - // And if we're unable to find any types, return KEY_MIXED. - return $key_types ?: self::KEY_MIXED; - } - - /** - * @param array<int|string,mixed> $array - The array keys are used for the final result. - * - * @return int - * Corresponds to the type of the array keys of $array. This is a GenericArrayType::KEY_* constant (KEY_INT, KEY_STRING, or KEY_MIXED). - */ - public static function getKeyTypeForArrayLiteral(array $array) : int - { - $key_type = GenericArrayType::KEY_EMPTY; - foreach ($array as $key => $_) { - $key_type |= (\is_string($key) ? GenericArrayType::KEY_STRING : GenericArrayType::KEY_INT); - } - return $key_type ?: GenericArrayType::KEY_MIXED; - } - - /** - * @return int - * Corresponds to the type of the array keys of $array. This is a GenericArrayType::KEY_* constant (KEY_INT, KEY_STRING, or KEY_MIXED). - */ - public static function getKeyTypeOfArrayNode(CodeBase $code_base, Context $context, Node $node, bool $should_catch_issue_exception = true) : int - { - $children = $node->children; - if (($children[0] ?? null) instanceof Node - && $children[0]->kind == \ast\AST_ARRAY_ELEM - ) { - $key_type_enum = GenericArrayType::KEY_EMPTY; - // Check the all elements for key types. - foreach ($children as $child) { - if (!($child instanceof Node)) { - continue; - } - // Don't bother recursing more than one level to iterate over possible types. - $key_node = $child->children['key']; - if ($key_node instanceof Node) { - $key_type_enum |= self::keyTypeFromUnionTypeValues(UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $key_node, - $should_catch_issue_exception - )); - } elseif ($key_node !== null) { - if (\is_string($key_node)) { - $key_type_enum |= GenericArrayType::KEY_STRING; - } elseif (\is_scalar($key_node)) { - $key_type_enum |= GenericArrayType::KEY_INT; - } - } else { - $key_type_enum |= GenericArrayType::KEY_INT; - } - // If we already think it's mixed, return immediately. - if ($key_type_enum === GenericArrayType::KEY_MIXED) { - return GenericArrayType::KEY_MIXED; - } - } - return $key_type_enum ?: GenericArrayType::KEY_MIXED; - } - return GenericArrayType::KEY_MIXED; - } - - public function hasArrayShapeOrLiteralTypeInstances() : bool - { - return $this->element_type->hasArrayShapeOrLiteralTypeInstances(); - } - - public function hasArrayShapeTypeInstances() : bool - { - return $this->element_type->hasArrayShapeTypeInstances(); - } - - /** - * @return array<int,Type> - * @override - */ - public function withFlattenedArrayShapeOrLiteralTypeInstances() : array - { - // TODO: Any point in caching this? - $type_instances = $this->element_type->withFlattenedArrayShapeOrLiteralTypeInstances(); - if (\count($type_instances) === 1 && $type_instances[0] === $this->element_type) { - return [$this]; - } - $results = []; - foreach ($type_instances as $type) { - $results[] = GenericArrayType::fromElementType($type, $this->is_nullable, $this->key_type); - } - return $results; - } - - public function asGenericArrayType(int $key_type) : Type - { - return GenericArrayType::fromElementType($this, false, $key_type); - } - - /** - * @override - */ - public function shouldBeReplacedBySpecificTypes() : bool - { - return false; - } - - /** - * Returns true if this contains a type that is definitely nullable or a non-object. - * e.g. returns true false, array, int - * returns false for callable, object, iterable, T, etc. - */ - public function isDefiniteNonCallableType() : bool - { - return $this->key_type === self::KEY_STRING; - } - - /** - * Returns true for `T` and `T[]` and `\MyClass<T>`, but not `\MyClass<\OtherClass>` or `false` - */ - public function hasTemplateTypeRecursive() : bool - { - return $this->genericArrayElementUnionType()->hasTemplateTypeRecursive(); - } - - /** - * @param array<string,UnionType> $template_parameter_type_map - * A map from template type identifiers to concrete types - * - * @return UnionType - * This UnionType with any template types contained herein - * mapped to concrete types defined in the given map. - * - * Overridden in subclasses - */ - public function withTemplateParameterTypeMap( - array $template_parameter_type_map - ) : UnionType { - $element_type = $this->genericArrayElementUnionType(); - $new_element_type = $element_type->withTemplateParameterTypeMap($template_parameter_type_map); - if ($element_type === $new_element_type) { - return $this->asUnionType(); - } - // TODO: Override in array shape subclass - return $new_element_type->asGenericArrayTypes($this->getKeyType()); - } - - /** - * Precondition: Callers should check isObjectWithKnownFQSEN - */ - public function hasSameNamespaceAndName(Type $_) : bool - { - return false; - } - - /** - * If this generic array type in a parameter declaration has template types, get the closure to extract the real types for that template type from argument union types - * - * @param CodeBase $code_base - * @return ?Closure(UnionType,Context):UnionType - */ - public function getTemplateTypeExtractorClosure(CodeBase $code_base, TemplateType $template_type) - { - $closure = $this->element_type->getTemplateTypeExtractorClosure($code_base, $template_type); - if (!$closure) { - return null; - } - // If a function expects T[], then T is the generic array element type of the passed in union type - return static function (UnionType $array_type, Context $context) use ($closure) : UnionType { - return $closure($array_type->genericArrayElementTypes(), $context); - }; - } - - /** - * @return Generator<void,Type> (void => $inner_type) - */ - public function getReferencedClasses() : Generator - { - return $this->element_type->getReferencedClasses(); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/GenericIterableType.php b/vendor/phan/phan/src/Phan/Language/Type/GenericIterableType.php deleted file mode 100644 index e492ae1..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/GenericIterableType.php +++ /dev/null @@ -1,177 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Closure; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Type; -use Phan\Language\UnionType; - -use function json_encode; - -/** - * Phan's representation of the type `iterable<KeyType,ValueType>` - */ -final class GenericIterableType extends IterableType -{ - /** @phan-override */ - const NAME = 'iterable'; - - /** - * @var UnionType the union type of the keys of this iterable. - */ - private $key_union_type; - - /** - * @var UnionType the union type of the elements of this iterable. - */ - private $element_union_type; - - protected function __construct(UnionType $key_union_type, UnionType $element_union_type, bool $is_nullable) - { - parent::__construct('', self::NAME, [], $is_nullable); - $this->key_union_type = $key_union_type; - $this->element_union_type = $element_union_type; - } - - /** - * @return UnionType returns the iterable key's union type, because this is a subtype of iterable. - * Other classes in the `Type` type hierarchy may return null. - */ - public function getKeyUnionType() : UnionType - { - return $this->key_union_type; - } - - /** - * @return UnionType returns the union type of possible element types. - */ - public function getElementUnionType() : UnionType - { - return $this->element_union_type; - } - - /** - * @return UnionType returns the iterable key's union type - * @phan-override - * - * @see self::getKeyUnionType() - */ - public function iterableKeyUnionType(CodeBase $unused_code_base) - { - return $this->key_union_type; - } - - /** - * @return UnionType returns the iterable value's union type - * @phan-override - * - * @see self::getElementUnionType() - */ - public function iterableValueUnionType(CodeBase $unused_code_base) - { - return $this->element_union_type; - } - - /** - * Returns a nullable/non-nullable GenericIterableType - * representing `iterable<$key_union_type, $element_union_type>` - */ - public static function fromKeyAndValueTypes(UnionType $key_union_type, UnionType $element_union_type, bool $is_nullable) : GenericIterableType - { - static $cache = []; - $key = ($is_nullable ? '?' : '') . json_encode($key_union_type->generateUniqueId()) . ':' . json_encode($element_union_type->generateUniqueId()); - return $cache[$key] ?? ($cache[$key] = new self($key_union_type, $element_union_type, $is_nullable)); - } - - public function canCastToNonNullableType(Type $type) : bool - { - if ($type instanceof GenericIterableType) { - // TODO: Account for scalar key casting config? - if (!$this->key_union_type->canCastToUnionType($type->key_union_type)) { - return false; - } - if (!$this->element_union_type->canCastToUnionType($type->element_union_type)) { - return false; - } - return true; - } - return parent::canCastToNonNullableType($type); - } - - /** - * Returns true for `T` and `T[]` and `\MyClass<T>`, but not `\MyClass<\OtherClass>` or `false` - */ - public function hasTemplateTypeRecursive() : bool - { - return $this->key_union_type->hasTemplateTypeRecursive() || $this->element_union_type->hasTemplateTypeRecursive(); - } - - /** - * @param array<string,UnionType> $template_parameter_type_map - * A map from template type identifiers to concrete types - * - * @return UnionType - * This UnionType with any template types contained herein - * mapped to concrete types defined in the given map. - * - * Overridden in subclasses - */ - public function withTemplateParameterTypeMap( - array $template_parameter_type_map - ) : UnionType { - $new_key_type = $this->key_union_type->withTemplateParameterTypeMap($template_parameter_type_map); - $new_element_type = $this->element_union_type->withTemplateParameterTypeMap($template_parameter_type_map); - if ($new_element_type === $this->element_union_type && - $new_key_type === $this->key_union_type) { - return $this->asUnionType(); - } - return self::fromKeyAndValueTypes($new_key_type, $new_element_type, $this->is_nullable)->asUnionType(); - } - - public function __toString() : string - { - $string = $this->element_union_type->__toString(); - if (!$this->key_union_type->isEmpty()) { - $string = $this->key_union_type->__toString() . ',' . $string; - } - $string = "iterable<$string>"; - - if ($this->is_nullable) { - $string = '?' . $string; - } - - return $string; - } - - /** - * If this generic array type in a parameter declaration has template types, get the closure to extract the real types for that template type from argument union types - * - * @param CodeBase $code_base - * @return ?Closure(UnionType, Context):UnionType - */ - public function getTemplateTypeExtractorClosure(CodeBase $code_base, TemplateType $template_type) - { - $closure = $this->element_union_type->getTemplateTypeExtractorClosure($code_base, $template_type); - if ($closure) { - // If a function expects T[], then T is the generic array element type of the passed in union type - $element_closure = static function (UnionType $type, Context $context) use ($code_base, $closure) : UnionType { - return $closure($type->iterableValueUnionType($code_base), $context); - }; - } else { - $element_closure = null; - } - $closure = $this->key_union_type->getTemplateTypeExtractorClosure($code_base, $template_type); - if ($closure) { - $key_closure = static function (UnionType $type, Context $context) use ($code_base, $closure) : UnionType { - return $closure($type->iterableKeyUnionType($code_base), $context); - }; - } else { - $key_closure = null; - } - return TemplateType::combineParameterClosures($key_closure, $element_closure); - } -} -// Trigger autoloader for subclass before make() can get called. -\class_exists(ArrayType::class); diff --git a/vendor/phan/phan/src/Phan/Language/Type/GenericMultiArrayType.php b/vendor/phan/phan/src/Phan/Language/Type/GenericMultiArrayType.php deleted file mode 100644 index f168049..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/GenericMultiArrayType.php +++ /dev/null @@ -1,258 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use InvalidArgumentException; -use Phan\CodeBase; -use Phan\Debug\Frame; -use Phan\Exception\RecursionDepthException; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Language\UnionTypeBuilder; - -/** - * A temporary representation of `array<KeyType, T1|T2...>` - * - * Callers should split this up into multiple GenericArrayType instances. - * - * This is generated from phpdoc `array<int, T1|T2>` where callers expect a subclass of Type. - */ -final class GenericMultiArrayType extends ArrayType implements MultiType, GenericArrayInterface -{ - /** @phan-override */ - const NAME = 'array'; - - /** - * @var array<int,Type> - * The list of possible types of every element in this array (2 or more) - */ - private $element_types = []; - - /** - * @var int - * Corresponds to the type of the array keys. Set this to a GenericArrayType::KEY_* constant. - */ - private $key_type; - - /** - * @param array<int,Type> $types - * The 2 or more possible types of every element in this array - * - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass false - * - * @param int $key_type - * Corresponds to the type of the array keys. Set this to a GenericArrayType::KEY_* constant. - * - * @throws InvalidArgumentException if there are less than 2 types in $types - */ - protected function __construct(array $types, bool $is_nullable, int $key_type) - { - if (\count($types) < 2) { - throw new InvalidArgumentException('Expected $types to have at least 2 array elements'); - } - // Could de-duplicate, but callers should be able to do that as well when converting to UnionType. - // E.g. array<int|int> is int[]. - parent::__construct('\\', self::NAME, [], false); - $this->element_types = $types; - $this->is_nullable = $is_nullable; - $this->key_type = $key_type; - } - - /** - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass - * false - * - * @return Type - * A new type that is a copy of this type but with the - * given nullability value. - */ - public function withIsNullable(bool $is_nullable) : Type - { - if ($is_nullable === $this->is_nullable) { - return $this; - } - - return GenericMultiArrayType::fromElementTypes( - $this->element_types, - $is_nullable, - $this->key_type - ); - } - - /** - * @return array<int,GenericArrayType> - * @override - */ - public function asIndividualTypeInstances() : array - { - return \array_map(function (Type $type) : GenericArrayType { - return GenericArrayType::fromElementType($type, $this->is_nullable, $this->key_type); - }, UnionType::normalizeMultiTypes($this->element_types)); - } - - /** - * Public creator of GenericMultiArrayType instances - * - * @param array<int,Type> $element_types - * @param bool $is_nullable - * @param int $key_type - * @return GenericMultiArrayType - */ - public static function fromElementTypes( - array $element_types, - bool $is_nullable, - int $key_type - ) : GenericMultiArrayType { - return new self($element_types, $is_nullable, $key_type); - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - protected function canCastToNonNullableType(Type $type) : bool - { - if ($type instanceof GenericArrayType) { - return $this->genericArrayElementUnionType()->canCastToUnionType( - $type->genericArrayElementUnionType() - ); - } - - // TODO: More precise about checking if can cast to ArrayShapeType - - if ($type->isArrayLike()) { - return true; - } - - $d = \strtolower((string)$type); - if ($d[0] == '\\') { - $d = \substr($d, 1); - } - if ($d === 'callable') { - return true; - } - - return parent::canCastToNonNullableType($type); - } - - public function isGenericArray() : bool - { - return true; - } - - /** - * @var ?UnionType the normalized element union type. Computed from `$this->element_types`. - */ - private $element_types_union_type; - - /** - * @return UnionType - * A variation of this type that is not generic. - * i.e. '(int|string)[]' becomes 'int|string'. - */ - public function genericArrayElementUnionType() : UnionType - { - return $this->element_types_union_type - ?? ($this->element_types_union_type = UnionType::of( - UnionType::normalizeMultiTypes($this->element_types) - )); - } - - public function __toString() : string - { - $string = 'array<' . \implode('|', $this->element_types) . '>'; - if ($this->is_nullable) { - $string = '?' . $string; - } - return $string; - } - - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands class types to all inherited classes returning - * a superset of this type. - * @override - */ - public function asExpandedTypes( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - // We're going to assume that if the type hierarchy - // is taller than some value we probably messed up - // and should bail out. - if ($recursion_depth >= 20) { - throw new RecursionDepthException("Recursion has gotten out of hand: " . Frame::getExpandedTypesDetails()); - } - - // TODO: Use UnionType::merge from a future change? - $result = new UnionTypeBuilder(); - try { - foreach ($this->element_types as $type) { - $result->addUnionType( - GenericArrayType::fromElementType( - $type, - $this->is_nullable, - $this->key_type - )->asExpandedTypes($code_base, $recursion_depth + 1) - ); - } - } catch (RecursionDepthException $_) { - return ArrayType::instance($this->is_nullable)->asUnionType(); - } - return $result->getUnionType(); - } - - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands class types to all inherited classes returning - * a superset of this type. - * @override - */ - public function asExpandedTypesPreservingTemplate( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - // We're going to assume that if the type hierarchy - // is taller than some value we probably messed up - // and should bail out. - if ($recursion_depth >= 20) { - throw new RecursionDepthException("Recursion has gotten out of hand: " . Frame::getExpandedTypesDetails()); - } - - // TODO: Use UnionType::merge from a future change? - $result = new UnionTypeBuilder(); - try { - foreach ($this->element_types as $type) { - $result->addUnionType( - GenericArrayType::fromElementType( - $type, - $this->is_nullable, - $this->key_type - )->asExpandedTypesPreservingTemplate($code_base, $recursion_depth + 1) - ); - } - } catch (RecursionDepthException $_) { - return ArrayType::instance($this->is_nullable)->asUnionType(); - } - return $result->getUnionType(); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/IntType.php b/vendor/phan/phan/src/Phan/Language/Type/IntType.php deleted file mode 100644 index 168c485..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/IntType.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Language\UnionType; - -/** - * Phan's representation of `int` - * @see LiteralIntType for Phan's representation of specific integers - */ -class IntType extends ScalarType -{ - /** @phan-override */ - const NAME = 'int'; - - /** @override */ - public function getIsPossiblyNumeric() : bool - { - return true; - } - - public function getTypeAfterIncOrDec() : UnionType - { - return IntType::instance(false)->asUnionType(); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/IterableType.php b/vendor/phan/phan/src/Phan/Language/Type/IterableType.php deleted file mode 100644 index a0a4e1a..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/IterableType.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -/** - * Phan's representation of `iterable` - * @see GenericIterableType for the representation of `iterable<KeyType,ValueType>` - */ -class IterableType extends NativeType -{ - /** @phan-override */ - const NAME = 'iterable'; - - public function isIterable() : bool - { - return true; - } - - public function isPrintableScalar() : bool - { - return false; - } - - public function isValidBitwiseOperand() : bool - { - return false; - } - - public function isPossiblyObject() : bool - { - return true; // can be Traversable, which is an object - } -} -// Trigger autoloader for subclass before make() can get called. -\class_exists(GenericIterableType::class); -\class_exists(ArrayType::class); diff --git a/vendor/phan/phan/src/Phan/Language/Type/LiteralIntType.php b/vendor/phan/phan/src/Phan/Language/Type/LiteralIntType.php deleted file mode 100644 index 8db9375..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/LiteralIntType.php +++ /dev/null @@ -1,200 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Config; -use Phan\Language\Type; -use RuntimeException; - -/** - * Phan's representation of the type for a specific integer, e.g. `-1` - */ -final class LiteralIntType extends IntType implements LiteralTypeInterface -{ - /** @var int $value */ - private $value; - - protected function __construct(int $value, bool $is_nullable) - { - parent::__construct('\\', self::NAME, [], $is_nullable); - $this->value = $value; - } - - /** - * Only exists to prevent accidentally calling this - * @internal - do not call - * @deprecated - */ - public static function instance(bool $unused_is_nullable) - { - throw new RuntimeException('Call ' . self::class . '::instanceForValue() instead'); - } - - /** - * @return LiteralIntType a unique LiteralIntType for $value (and the nullability) - */ - public static function instanceForValue(int $value, bool $is_nullable) - { - if ($is_nullable) { - static $nullable_cache = []; - return $nullable_cache[$value] ?? ($nullable_cache[$value] = new self($value, true)); - } - static $cache = []; - return $cache[$value] ?? ($cache[$value] = new self($value, false)); - } - - /** - * Returns the literal int that this type represents - * (whether or not this type is nullable) - */ - public function getValue() : int - { - return $this->value; - } - - public function __toString() : string - { - if ($this->is_nullable) { - return '?' . $this->value; - } - return (string)$this->value; - } - - /** @var IntType the non-nullable int type instance. */ - private static $non_nullable_int_type; - /** @var IntType the nullable int type instance. */ - private static $nullable_int_type; - - /** - * Called at the bottom of the file to ensure static properties are set for quick access. - */ - public static function init() - { - self::$non_nullable_int_type = IntType::instance(false); - self::$nullable_int_type = IntType::instance(true); - } - - public function asNonLiteralType() : Type - { - return $this->is_nullable ? self::$nullable_int_type : self::$non_nullable_int_type; - } - - /** - * @return Type[] - * @override - */ - public function withFlattenedArrayShapeOrLiteralTypeInstances() : array - { - return [$this->is_nullable ? self::$nullable_int_type : self::$non_nullable_int_type]; - } - - public function hasArrayShapeOrLiteralTypeInstances() : bool - { - return true; - } - - /** @override */ - public function getIsPossiblyFalsey() : bool - { - return !$this->value; - } - - /** @override */ - public function getIsAlwaysFalsey() : bool - { - return !$this->value; - } - - /** @override */ - public function getIsPossiblyTruthy() : bool - { - return (bool)$this->value; - } - - /** @override */ - public function getIsAlwaysTruthy() : bool - { - return (bool)$this->value; - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - protected function canCastToNonNullableType(Type $type) : bool - { - if ($type instanceof ScalarType) { - switch ($type::NAME) { - case 'int': - if ($type instanceof LiteralIntType) { - return $type->getValue() === $this->getValue(); - } - return true; - case 'string': - if ($type instanceof LiteralStringType) { - if ($type->getValue() != $this->value) { - // Do a loose equality comparison and check if that permits that - // E.g. can't cast 5 to 'foo', but can cast 5 to '5' or '5foo' depending on the other rules - return false; - } - } - break; - case 'float': - return true; - case 'true': - if (!$this->value) { - return false; - } - break; - case 'false': - if ($this->value) { - return false; - } - break; - case 'null': - // null is also a scalar. - if ($this->value && !Config::get_null_casts_as_any_type()) { - return false; - } - break; - } - } - - return parent::canCastToNonNullableType($type); - } - - /** - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass - * false - * - * @return Type - * A new type that is a copy of this type but with the - * given nullability value. - */ - public function withIsNullable(bool $is_nullable) : Type - { - if ($is_nullable === $this->is_nullable) { - return $this; - } - - return self::instanceForValue( - $this->value, - $is_nullable - ); - } - - /** - * Check if this type can satisfy a comparison (<, <=, >, >=) - * @param int|string|float|bool|null $scalar - * @param int $flags (e.g. \ast\flags\BINARY_IS_SMALLER) - * @internal - */ - public function canSatisfyComparison($scalar, int $flags) : bool - { - return self::performComparison($this->value, $scalar, $flags); - } -} - -LiteralIntType::init(); diff --git a/vendor/phan/phan/src/Phan/Language/Type/LiteralStringType.php b/vendor/phan/phan/src/Phan/Language/Type/LiteralStringType.php deleted file mode 100644 index b8919d6..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/LiteralStringType.php +++ /dev/null @@ -1,326 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use InvalidArgumentException; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Context; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Type; -use Phan\Language\UnionType; -use RuntimeException; -use function filter_var; -use const FILTER_VALIDATE_FLOAT; -use const FILTER_VALIDATE_INT; - -/** - * Phan's representation of the type for a specific string, e.g. `'a string'` - */ -final class LiteralStringType extends StringType implements LiteralTypeInterface -{ - - const MINIMUM_MAX_STRING_LENGTH = 50; - - /** @var string $value */ - private $value; - - protected function __construct(string $value, bool $is_nullable) - { - parent::__construct('\\', self::NAME, [], $is_nullable); - $this->value = $value; - } - - /** - * Only exists to prevent accidentally calling this on the parent class - * @internal - * @deprecated - * @throws RuntimeException to prevent this from being called - */ - public static function instance(bool $unused_is_nullable) - { - throw new RuntimeException('Call ' . self::class . '::instanceForValue() instead'); - } - - /** - * Check if Phan will represent strings of a given length in its type system. - * @param int|float $length - */ - public static function canRepresentStringOfLength($length) : bool - { - // The config can only be used to increase this limit, not decrease it. - return $length <= self::MINIMUM_MAX_STRING_LENGTH || $length <= Config::getValue('max_literal_string_type_length'); - } - - /** - * @return StringType|LiteralStringType a StringType for $value - * This will construct an StringType instead if the value is longer than the longest supported string type - * - * - This avoids making error messages excessively long - * - This avoids running out of memory tracking string representations when analyzing code that may build up long strings. - */ - public static function instanceForValue(string $value, bool $is_nullable) - { - if (!self::canRepresentStringOfLength(\strlen($value))) { - return StringType::instance($is_nullable); - } - - if ($is_nullable) { - static $nullable_cache = []; - return $nullable_cache[$value] ?? ($nullable_cache[$value] = new self($value, true)); - } - static $cache = []; - return $cache[$value] ?? ($cache[$value] = new self($value, false)); - } - - /** - * Returns the literal string this type represents (whether or not this is the nullable type) - */ - public function getValue() : string - { - return $this->value; - } - - /** - * @internal - For use within LiteralStringType - */ - const ESCAPE_CHARACTER_LOOKUP = [ - "\n" => '\\n', - "\r" => '\\r', - "\t" => '\\t', - "\\" => '\\\\', - "'" => '\\\'', - ]; - - /** - * @internal - For use within LiteralStringType - */ - const UNESCAPE_CHARACTER_LOOKUP = [ - '\\n' => "\n", - '\\r' => "\r", - '\\t' => "\t", - '\\\\' => "\\", - '\\\'' => "'", - ]; - - public function __toString() : string - { - // TODO: Finalize escaping - // NOTE: Phan has issues with parsing commas in phpdoc, so don't suggest them. - // Support for commas should be restored when https://github.com/phan/phan/issues/2597 is fixed - $inner = \preg_replace_callback( - '/[^- .\/?:;"!#$%^&*_+=a-zA-Z0-9_\x80-\xff]/', - /** - * @param array{0:string} $match - * @return string - */ - static function (array $match) { - $c = $match[0]; - return self::ESCAPE_CHARACTER_LOOKUP[$c] ?? \sprintf('\\x%02x', \ord($c)); - }, - $this->value - ); - if ($this->is_nullable) { - return "?'$inner'"; - } - return "'$inner'"; - } - - /** - * The opposite of __toString() - * @return StringType|LiteralStringType - * @throws InvalidArgumentException - * if the $escaped_string is not using the proper escaping - * (should not happen if UnionType's regex is used) - */ - public static function fromEscapedString(string $escaped_string, bool $is_nullable) : StringType - { - if (\strlen($escaped_string) < 2 || $escaped_string[0] !== "'" || \substr($escaped_string, -1) !== "'") { - throw new InvalidArgumentException("Expected the literal type string to begin and end with \"'\""); - } - $escaped_string = \substr($escaped_string, 1, -1); - $escaped_string = \preg_replace_callback( - '/\\\\(?:[\'\\\\trn]|x[0-9a-fA-F]{2})/', - /** @param array{0:string} $matches */ - static function (array $matches) : string { - $x = $matches[0]; - if (\strlen($x) === 2) { - // Parses one of \t \r \n \\ \' - return self::UNESCAPE_CHARACTER_LOOKUP[$x]; - } - // convert 2 hex bytes to a single character - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal, PhanPartialTypeMismatchArgumentInternal - return \chr(\hexdec(\substr($x, 2))); - }, - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - $escaped_string - ); - return self::instanceForValue($escaped_string, $is_nullable); - } - - /** @var StringType the non-nullable string type instance. */ - private static $non_nullable_string_type; - /** @var StringType the nullable string type instance. */ - private static $nullable_string_type; - - /** - * Called at the bottom of the file to ensure static properties are set for quick access. - */ - public static function init() - { - self::$non_nullable_string_type = StringType::instance(false); - self::$nullable_string_type = StringType::instance(true); - } - - public function asNonLiteralType() : Type - { - return $this->is_nullable ? self::$nullable_string_type : self::$non_nullable_string_type; - } - - /** - * @return Type[] - * @override - */ - public function withFlattenedArrayShapeOrLiteralTypeInstances() : array - { - return [$this->is_nullable ? self::$nullable_string_type : self::$non_nullable_string_type]; - } - - public function hasArrayShapeOrLiteralTypeInstances() : bool - { - return true; - } - - /** @override */ - public function getIsPossiblyFalsey() : bool - { - return !$this->value; - } - - /** @override */ - public function getIsAlwaysFalsey() : bool - { - return !$this->value; - } - - /** @override */ - public function getIsPossiblyTruthy() : bool - { - return (bool)$this->value; - } - - /** @override */ - public function getIsAlwaysTruthy() : bool - { - return (bool)$this->value; - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - protected function canCastToNonNullableType(Type $type) : bool - { - if ($type instanceof ScalarType) { - switch ($type::NAME) { - case 'string': - if ($type instanceof LiteralStringType) { - return $type->value === $this->value; - } - return true; - case 'int': - // Allow int or float strings to cast to int or floats - if (filter_var($this->value, FILTER_VALIDATE_INT) === false) { - return false; - } - break; - case 'float': - if (filter_var($this->value, FILTER_VALIDATE_FLOAT) === false) { - return false; - } - break; - case 'true': - if (!$this->value) { - return false; - } - break; - case 'false': - if ($this->value) { - return false; - } - break; - case 'null': - // null is also a scalar. - if ($this->value && !Config::get_null_casts_as_any_type()) { - return false; - } - break; - } - } - - return parent::canCastToNonNullableType($type); - } - - /** - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass - * false - * - * @return Type - * A new type that is a copy of this type but with the - * given nullability value. - */ - public function withIsNullable(bool $is_nullable) : Type - { - if ($is_nullable === $this->is_nullable) { - return $this; - } - - return self::instanceForValue( - $this->value, - $is_nullable - ); - } - - /** - * Check if this type can satisfy a comparison (<, <=, >, >=) - * @param int|string|float|bool|null $scalar - * @param int $flags (e.g. \ast\flags\BINARY_IS_SMALLER) - * @internal - */ - public function canSatisfyComparison($scalar, int $flags) : bool - { - return self::performComparison($this->value, $scalar, $flags); - } - - public function getTypeAfterIncOrDec() : UnionType - { - $v = $this->value; - ++$v; - return Type::nonLiteralFromObject($v)->asUnionType(); - } - - /** - * Returns the function interface that would be used if this type's string were a callable, or null. - * @param CodeBase $code_base the code base in which the function interface is found - * @param Context $context the context where the function interface is referenced (for emitting issues) - * - * @return ?FunctionInterface - */ - public function asFunctionInterfaceOrNull(CodeBase $code_base, Context $context) - { - // parse 'function_name' or 'class_name::method_name' - // NOTE: In other subclasses of Type, calling this might recurse. - $function_like_fqsens = UnionTypeVisitor::functionLikeListFromNodeAndContext($code_base, $context, $this->value, true); - return $function_like_fqsens[0] ?? null; - } - - public function isValidNumericOperand() : bool - { - return filter_var($this->value, FILTER_VALIDATE_FLOAT) !== false; - } -} - -LiteralStringType::init(); diff --git a/vendor/phan/phan/src/Phan/Language/Type/LiteralTypeInterface.php b/vendor/phan/phan/src/Phan/Language/Type/LiteralTypeInterface.php deleted file mode 100644 index 0fa858d..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/LiteralTypeInterface.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -/** - * Empty interface used by quick checks if a Type is a specific literal int/string. - * @method mixed getValue() - */ -interface LiteralTypeInterface -{ - // has getValue(), instance_for_value, etc. - // Document with @method? -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/MixedType.php b/vendor/phan/phan/src/Phan/Language/Type/MixedType.php deleted file mode 100644 index 981c0a4..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/MixedType.php +++ /dev/null @@ -1,99 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * Represents the PHPDoc `mixed` type, which can cast to/from any type - * - * For purposes of analysis, there's usually no difference between mixed and nullable mixed. - */ -final class MixedType extends NativeType -{ - /** @phan-override */ - const NAME = 'mixed'; - - // mixed or ?mixed can cast to/from anything. - // For purposes of analysis, there's usually no difference between mixed and nullable mixed. - public function canCastToType(Type $unused_type) : bool - { - return true; - } - - /** - * @param Type[] $target_type_set 1 or more types @phan-unused-param - * @return bool - * @override - */ - public function canCastToAnyTypeInSet(array $target_type_set) : bool - { - return true; - } - - // mixed or ?mixed can cast to/from anything. - // For purposes of analysis, there's no difference between mixed and nullable mixed. - protected function canCastToNonNullableType(Type $unused_type) : bool - { - return true; - } - - public function isExclusivelyNarrowedFormOrEquivalentTo( - UnionType $union_type, - Context $unused_context, - CodeBase $unused_code_base - ) : bool { - // Type casting rules allow mixed to cast to anything. - // But we don't want `@param mixed $x` to take precedence over `int $x` in the signature. - return $union_type->hasType($this); - } - - /** - * @param int $key_type - */ - public function asGenericArrayType(int $key_type) : Type - { - if ($key_type === GenericArrayType::KEY_INT || $key_type === GenericArrayType::KEY_STRING) { - return GenericArrayType::fromElementType($this, false, $key_type); - } - return ArrayType::instance(false); - } - - public function isArrayOrArrayAccessSubType(CodeBase $unused_code_base) : bool - { - return true; - } - - public function isPrintableScalar() : bool - { - return true; // It's possible. - } - - public function isValidBitwiseOperand() : bool - { - return true; - } - - public function isValidNumericOperand() : bool - { - return true; - } - - public function isPossiblyObject() : bool - { - return true; // It's possible. - } - - public function isDefiniteNonObjectType() : bool - { - return false; - } - - public function isDefiniteNonCallableType() : bool - { - return false; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/MultiType.php b/vendor/phan/phan/src/Phan/Language/Type/MultiType.php deleted file mode 100644 index 9042e78..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/MultiType.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Language\Type; - -/** - * Callers should split this up into multiple Type instances. - */ -interface MultiType -{ - /** - * @return array<int,Type> - * A list of 2 or more types that this MultiType represents - */ - public function asIndividualTypeInstances() : array; -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/NativeType.php b/vendor/phan/phan/src/Phan/Language/Type/NativeType.php deleted file mode 100644 index f6c17a2..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/NativeType.php +++ /dev/null @@ -1,308 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Generator; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Type; -use Phan\Language\UnionType; - -use function in_array; - -/** - * Phan's base class for native types such as IntType, ObjectType, etc. - * - * (i.e. not class instances, Closures, etc) - */ -abstract class NativeType extends Type -{ - const NAME = ''; - - /** @phan-override */ - const KEY_PREFIX = '!'; - - /** - * @param bool $is_nullable - * If true, returns a nullable instance of this native type - * - * @return static - * Returns a nullable/non-nullable instance of this native type (possibly unchanged) - */ - public static function instance(bool $is_nullable) - { - if ($is_nullable) { - static $nullable_instance = null; - - if ($nullable_instance === null) { - $nullable_instance = static::make('\\', static::NAME, [], true, Type::FROM_NODE); - } - - return $nullable_instance; - } - - static $instance = null; - - if ($instance === null) { - $instance = static::make('\\', static::NAME, [], false, Type::FROM_NODE); - } - - return $instance; - } - - public function isNativeType() : bool - { - return true; - } - - public function isSelfType() : bool - { - return false; - } - - public function isArrayAccess() : bool - { - return false; - } - - public function isArrayOrArrayAccessSubType(CodeBase $unused_code_base) : bool - { - return false; - } - - public function isTraversable() : bool - { - return false; - } - - public function isGenerator() : bool - { - return false; - } - - public function isObject() : bool - { - return false; - } - - public function isObjectWithKnownFQSEN() : bool - { - return false; - } - - public function isPossiblyObject() : bool - { - return false; - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - protected function canCastToNonNullableType(Type $type) : bool - { - // Anything can cast to mixed or ?mixed - // Not much of a distinction in nullable mixed, except to emphasize in comments that it definitely can be null. - // MixedType overrides the canCastTo*Type methods to always return true. - if ($type instanceof MixedType) { - return true; - } - - if (!($type instanceof NativeType) - || $this instanceof GenericArrayType - || $type instanceof GenericArrayType - ) { - return parent::canCastToNonNullableType($type); - } - - static $matrix; - if ($matrix === null) { - $matrix = self::initializeTypeCastingMatrix(); - } - - return $matrix[$this->getName()][$type->getName()] - ?? parent::canCastToNonNullableType($type); - } - - /** - * @return array<string,array<string,bool>> - */ - private static function initializeTypeCastingMatrix() : array - { - /** - * @return array<string,bool> - */ - $generate_row = static function (string ...$permitted_cast_type_names) : array { - return [ - ArrayType::NAME => in_array(ArrayType::NAME, $permitted_cast_type_names, true), - IterableType::NAME => in_array(IterableType::NAME, $permitted_cast_type_names, true), - BoolType::NAME => in_array(BoolType::NAME, $permitted_cast_type_names, true), - CallableType::NAME => in_array(CallableType::NAME, $permitted_cast_type_names, true), - ClassStringType::NAME => in_array(ClassStringType::NAME, $permitted_cast_type_names, true), - CallableStringType::NAME => in_array(CallableStringType::NAME, $permitted_cast_type_names, true), - FalseType::NAME => in_array(FalseType::NAME, $permitted_cast_type_names, true), - FloatType::NAME => in_array(FloatType::NAME, $permitted_cast_type_names, true), - IntType::NAME => in_array(IntType::NAME, $permitted_cast_type_names, true), - MixedType::NAME => true, - NullType::NAME => in_array(NullType::NAME, $permitted_cast_type_names, true), - ObjectType::NAME => in_array(ObjectType::NAME, $permitted_cast_type_names, true), - ResourceType::NAME => in_array(ResourceType::NAME, $permitted_cast_type_names, true), - ScalarRawType::NAME => in_array(ScalarRawType::NAME, $permitted_cast_type_names, true), - StringType::NAME => in_array(StringType::NAME, $permitted_cast_type_names, true), - TrueType::NAME => in_array(TrueType::NAME, $permitted_cast_type_names, true), - VoidType::NAME => in_array(VoidType::NAME, $permitted_cast_type_names, true), - ]; - }; - - // A matrix of allowable type conversions between - // the various native types. - // (Represented in a readable format, with only the true entries (omitting Mixed, which is always true)) - - return [ - ArrayType::NAME => $generate_row(ArrayType::NAME, IterableType::NAME, CallableType::NAME), - BoolType::NAME => $generate_row(BoolType::NAME, FalseType::NAME, TrueType::NAME, ScalarRawType::NAME), - CallableType::NAME => $generate_row(CallableType::NAME), - CallableStringType::NAME => $generate_row(CallableStringType::NAME, CallableType::NAME, StringType::NAME), - ClassStringType::NAME => $generate_row(ClassStringType::NAME, CallableType::NAME, StringType::NAME), - FalseType::NAME => $generate_row(FalseType::NAME, BoolType::NAME, ScalarRawType::NAME), - FloatType::NAME => $generate_row(FloatType::NAME, ScalarRawType::NAME), - IntType::NAME => $generate_row(IntType::NAME, FloatType::NAME, ScalarRawType::NAME), - IterableType::NAME => $generate_row(IterableType::NAME), - MixedType::NAME => $generate_row(MixedType::NAME), // MixedType overrides the methods which would use this - NullType::NAME => $generate_row(NullType::NAME), - ObjectType::NAME => $generate_row(ObjectType::NAME), - ResourceType::NAME => $generate_row(ResourceType::NAME), - StringType::NAME => $generate_row(StringType::NAME, CallableType::NAME, ScalarRawType::NAME, CallableStringType::NAME, ClassStringType::NAME), - TrueType::NAME => $generate_row(TrueType::NAME, BoolType::NAME, ScalarRawType::NAME), - VoidType::NAME => $generate_row(VoidType::NAME), - ]; - } - - public function __toString() : string - { - // Native types can just use their - // non-fully-qualified names - $string = $this->name; - - if ($this->is_nullable) { - $string = '?' . $string; - } - - return $string; - } - - public function asFQSENString() : string - { - return $this->name; - } - - /** - * @param CodeBase $code_base @phan-unused-param - * The code base to use in order to find super classes, etc. - * - * @param int $recursion_depth @phan-unused-param - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Does nothing for Native Types, but GenericArrayType is an exception to that. - * @override - */ - public function asExpandedTypes( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - return $this->asUnionType(); - } - - /** - * @param CodeBase $code_base @phan-unused-param - * The code base to use in order to find super classes, etc. - * - * @param int $recursion_depth @phan-unused-param - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Does nothing for Native Types, but GenericArrayType is an exception to that. - * @override - */ - public function asExpandedTypesPreservingTemplate( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - return $this->asUnionType(); - } - - public function hasTemplateParameterTypes() : bool - { - return false; - } - - /** - * @return ?UnionType returns the iterable value's union type if this is a subtype of iterable, null otherwise. - */ - public function iterableKeyUnionType(CodeBase $unused_code_base) - { - return null; - } - - /** - * @return ?UnionType returns the iterable value's union type if this is a subtype of iterable, null otherwise. - */ - public function iterableValueUnionType(CodeBase $unused_code_base) - { - return null; - } - - /** - * @param array<string,UnionType> $unused_template_parameter_type_map - * @override - */ - public function withTemplateParameterTypeMap( - array $unused_template_parameter_type_map - ) : UnionType { - return $this->asUnionType(); - } - - public function isTemplateSubtypeOf(Type $unused_type) : bool - { - return false; - } - - /** - * Returns true for `T` and `T[]` and `\MyClass<T>`, but not `\MyClass<\OtherClass>` or `false` - * - * Overridden in subclasses. - */ - public function hasTemplateTypeRecursive() : bool - { - return false; - } - - public function getTemplateTypeExtractorClosure(CodeBase $unused_code_base, TemplateType $unused_template_type) - { - return null; - } - - public function asFunctionInterfaceOrNull(CodeBase $unused_codebase, Context $unused_context) - { - // overridden in subclasses - return null; - } - - /** - * @return Generator<mixed,Type> - */ - public function getReferencedClasses() : Generator - { - if (false) { - yield $this; - } - } -} -\class_exists(ArrayType::class); -\class_exists(ScalarType::class); diff --git a/vendor/phan/phan/src/Phan/Language/Type/NullType.php b/vendor/phan/phan/src/Phan/Language/Type/NullType.php deleted file mode 100644 index b94ea58..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/NullType.php +++ /dev/null @@ -1,206 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * Singleton representing the type `null` - */ -final class NullType extends ScalarType -{ - /** @phan-override */ - const NAME = 'null'; - - /** - * @param string $namespace - * The (optional) namespace of the type such as '\' - * or '\Phan\Language'. - * - * @param string $name - * The name of the type such as 'int' or 'MyClass' - * - * @param array<int,UnionType> $template_parameter_type_list - * A (possibly empty) list of template parameter types - * - * @param bool $is_nullable (@phan-unused-param) - * True if this type can be null, false if it cannot - * be null. (NullType can always be null) - */ - protected function __construct( - string $namespace, - string $name, - $template_parameter_type_list, - bool $is_nullable - ) { - parent::__construct( - $namespace, - $name, - $template_parameter_type_list, - true - ); - } - - public function canCastToNonNullableType(Type $type) : bool - { - // null_casts_as_any_type means that null or nullable can cast to any type? - return Config::get_null_casts_as_any_type() - || (Config::get_null_casts_as_array() && $type->isArrayLike()) - || parent::canCastToNonNullableType($type); - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - public function canCastToType(Type $type) : bool - { - // Check to see if we have an exact object match - if ($this === $type) { - return true; - } - - // Null can cast to a nullable type. - if ($type->is_nullable) { - return true; - } - - if (Config::get_null_casts_as_any_type()) { - return true; - } - - // NullType is a sub-type of ScalarType. So it's affected by scalar_implicit_cast. - if ($type->isScalar()) { - if (Config::getValue('scalar_implicit_cast')) { - return true; - } - $scalar_implicit_partial = Config::getValue('scalar_implicit_partial'); - // check if $type->getName() is in the list of permitted types $this->getName() can cast to. - if (\count($scalar_implicit_partial) > 0 && - \in_array($type->getName(), $scalar_implicit_partial['null'] ?? [], true)) { - return true; - } - } - if ($type instanceof MixedType) { - return true; - } - - return false; - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly (accounting for templates) - */ - public function canCastToTypeHandlingTemplates(Type $type, CodeBase $code_base) : bool - { - // Check to see if we have an exact object match - if ($this === $type) { - return true; - } - - // Null can cast to a nullable type. - if ($type->is_nullable) { - return true; - } - - if (Config::get_null_casts_as_any_type()) { - return true; - } - - // NullType is a sub-type of ScalarType. So it's affected by scalar_implicit_cast. - if ($type->isScalar()) { - if (Config::getValue('scalar_implicit_cast')) { - return true; - } - $scalar_implicit_partial = Config::getValue('scalar_implicit_partial'); - // check if $type->getName() is in the list of permitted types $this->getName() can cast to. - if (\count($scalar_implicit_partial) > 0 && - \in_array($type->getName(), $scalar_implicit_partial['null'] ?? [], true)) { - return true; - } - } - if ($type instanceof MixedType) { - return true; - } - - // Test to see if we can cast to the non-nullable version - // of the target type. - return parent::canCastToNonNullableTypeHandlingTemplates($type, $code_base); - } - - /** - * @param bool $is_nullable (@phan-unused-param) - * Set to true if the type should be nullable, else pass - * false - * - * @return Type - * A new type that is a copy of this type but with the - * given nullability value. - */ - public function withIsNullable(bool $is_nullable) : Type - { - return $this; - } - - public function __toString() : string - { - return $this->name; - } - - public function getIsNullable() : bool - { - return true; - } - - public function getIsPossiblyFalsey() : bool - { - return true; // Null is always falsey. - } - - public function getIsAlwaysFalsey() : bool - { - return true; // Null is always falsey. - } - - public function isPrintableScalar() : bool - { - // This would be '', which is probably not intended. allow null in union types for `echo` if there are **other** valid types. - return Config::get_null_casts_as_any_type(); - } - - public function isValidBitwiseOperand() : bool - { - // Allow null in union types for bitwise operations if there are **other** valid types. - return Config::get_null_casts_as_any_type(); - } - - public function isValidNumericOperand() : bool - { - return Config::get_null_casts_as_any_type(); - } - - /** - * Check if this type can satisfy a comparison (<, <=, >, >=) - * @param int|string|float|bool|null $scalar - * @param int $flags (e.g. \ast\flags\BINARY_IS_SMALLER) - * @internal - */ - public function canSatisfyComparison($scalar, int $flags) : bool - { - return self::performComparison(null, $scalar, $flags); - } - - /** - * Returns the type after an expression such as `++$x` - */ - public function getTypeAfterIncOrDec() : UnionType - { - return IntType::instance(false)->asUnionType(); - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/ObjectType.php b/vendor/phan/phan/src/Phan/Language/Type/ObjectType.php deleted file mode 100644 index b3c012a..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/ObjectType.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Language\Type; - -/** - * Represents the type `object` (an instance of an unspecified class) - */ -final class ObjectType extends NativeType -{ - /** @phan-override */ - const NAME = 'object'; - - protected function canCastToNonNullableType(Type $type) : bool - { - // Inverse of check in Type->canCastToNullableType - if (!$type->isNativeType() && !($type instanceof ArrayType)) { - return true; - } - return parent::canCastToNonNullableType($type); - } - - /** - * @return bool - * True if this type is an object (or the phpdoc `object`) - * @override - */ - public function isObject() : bool - { - return true; // Overridden in various subclasses - } - - /** - * @override - */ - public function isObjectWithKnownFQSEN() : bool - { - return false; // Overridden in various subclasses - } - - /** - * @return bool - * True if this type is an object (or the phpdoc `object`) - * @override - */ - public function isPossiblyObject() : bool - { - return true; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/ResourceType.php b/vendor/phan/phan/src/Phan/Language/Type/ResourceType.php deleted file mode 100644 index becd1a4..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/ResourceType.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -/** - * Represents the type `resource` - */ -final class ResourceType extends NativeType -{ - /** @phan-override */ - const NAME = 'resource'; - - public function isPrintableScalar() : bool - { - return false; - } - - public function isValidBitwiseOperand() : bool - { - return false; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/ScalarRawType.php b/vendor/phan/phan/src/Phan/Language/Type/ScalarRawType.php deleted file mode 100644 index 4f82f9a..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/ScalarRawType.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -/** - * A temporary representation of the type `scalar`. - * These are the types for which `is_scalar(expr)` is true - * - * This is used in the middle of parsing PHPDoc types, - * but is quickly converted to bool|int|float|string once parsing is finished. - */ -final class ScalarRawType extends ScalarType implements MultiType -{ - /** @override */ - const NAME = 'scalar'; - - /** - * @return array<int,ScalarType> - */ - public function asIndividualTypeInstances() : array - { - if ($this->is_nullable) { - static $nullable_types = null; - if ($nullable_types === null) { - $nullable_types = [BoolType::instance(true), IntType::instance(true), FloatType::instance(true), StringType::instance(true)]; - } - return $nullable_types; - } - static $nonnullable_types = null; - if ($nonnullable_types === null) { - $nonnullable_types = [BoolType::instance(false), IntType::instance(false), FloatType::instance(false), StringType::instance(false)]; - } - return $nonnullable_types; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/ScalarType.php b/vendor/phan/phan/src/Phan/Language/Type/ScalarType.php deleted file mode 100644 index 073c895..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/ScalarType.php +++ /dev/null @@ -1,161 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Context; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * The base class for various scalar types (BoolType, StringType, ScalarRawType, - * NullType (null is technically not a scalar, but included), etc. - */ -abstract class ScalarType extends NativeType -{ - public function isScalar() : bool - { - return true; - } - - public function isPrintableScalar() : bool - { - return true; // Overridden in subclass BoolType - } - - public function isValidBitwiseOperand() : bool - { - return true; - } - - public function isSelfType() : bool - { - return false; - } - - public function isStaticType() : bool - { - return false; - } - - public function isIterable() : bool - { - return false; - } - - public function isArrayLike() : bool - { - return false; - } - - public function isGenericArray() : bool - { - return false; - } - - /** - * @param CodeBase $code_base (@phan-unused-param) - * - * @param Type $parent (@phan-unused-param) - * - * @return bool - * True if this type represents a class which is a sub-type of - * the class represented by the passed type. - */ - public function isSubclassOf(CodeBase $code_base, Type $parent) : bool - { - return false; - } - - /** - * @return bool - * True if this Type can be cast to the given Type - * cleanly - */ - protected function canCastToNonNullableType(Type $type) : bool - { - // Scalars may be configured to always cast to each other. - if ($type->isScalar()) { - if (Config::getValue('scalar_implicit_cast')) { - return true; - } - $scalar_implicit_partial = Config::getValue('scalar_implicit_partial'); - if (\count($scalar_implicit_partial) > 0) { - // check if $type->getName() is in the list of permitted types $this->getName() can cast to. - if (\in_array($type->getName(), $scalar_implicit_partial[$this->getName()] ?? [], true)) { - return true; - } - } - } - - return parent::canCastToNonNullableType($type); - } - - /** - * @override - */ - public function isExclusivelyNarrowedFormOrEquivalentTo( - UnionType $union_type, - Context $unused_context, - CodeBase $unused_code_base - ) : bool { - return $union_type->hasType($this) || $this->asUnionType()->canCastToUnionType($union_type); - } - - /** - * @override - */ - public function asFQSENString() : string - { - return $this->name; - } - - public function getIsAlwaysTruthy() : bool - { - // Most scalars (Except ResourceType) have a false value, e.g. 0/""/"0"/0.0/false. - // (But ResourceType isn't a subclass of ScalarType in Phan's implementation) - return false; - } - - public function asNonTruthyType() : Type - { - // Subclasses of ScalarType all have false values within their types. - return $this; - } - - /** - * @override - */ - public function shouldBeReplacedBySpecificTypes() : bool - { - return false; - } - - public function isValidNumericOperand() : bool - { - return true; - } - - /** - * Returns true if this contains a type that is definitely nullable or a non-object. - * e.g. returns true false, array, int - * returns false for callable, object, iterable, T, etc. - */ - public function isDefiniteNonObjectType() : bool - { - return true; - } - - /** - * Returns true if this contains a type that is definitely nullable or a non-object. - * e.g. returns true false, array, int - * returns false for callable, object, iterable, T, etc. - */ - public function isDefiniteNonCallableType() : bool - { - return true; - } -} -\class_exists(IntType::class); -\class_exists(StringType::class); diff --git a/vendor/phan/phan/src/Phan/Language/Type/SelfType.php b/vendor/phan/phan/src/Phan/Language/Type/SelfType.php deleted file mode 100644 index f5be161..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/SelfType.php +++ /dev/null @@ -1,117 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * Represents the PHPDoc type `self`. - * This is converted to a real class when necessary. - * @see self::withStaticResolvedInContext() - */ -final class SelfType extends StaticOrSelfType -{ - /** Not an override */ - const NAME = 'self'; - - protected function __construct(bool $is_nullable) - { - parent::__construct('\\', self::NAME, [], $is_nullable); - } - /** - * Returns a nullable/non-nullable instance of this SelfType - * - * @param bool $is_nullable - * An optional parameter, which if true returns a - * nullable instance of this native type - * - * @return static - */ - public static function instance(bool $is_nullable) : Type - { - if ($is_nullable) { - static $nullable_instance = null; - - if ($nullable_instance === null) { - $nullable_instance = new self(true); - } - - return $nullable_instance; - } - - static $instance; - - if (!$instance) { - $instance = new self(false); - } - return $instance; - } - - public function isNativeType() : bool - { - return false; - } - - public function isStaticType() : bool - { - return false; - } - - public function isSelfType() : bool - { - return true; - } - - public function __toString() : string - { - $string = $this->name; - - if ($this->is_nullable) { - $string = '?' . $string; - } - - return $string; - } - - /** - * @return Type - * Either this or 'self' resolved in the given context. - */ - public function withStaticResolvedInContext( - Context $context - ) : Type { - // If the context isn't in a class scope, there's nothing - // we can do - if (!$context->isInClassScope()) { - return $this; - } - $type = $context->getClassFQSEN()->asType(); - if ($this->is_nullable) { - return $type->withIsNullable(true); - } - return $type; - } - - /** - * @return SelfType - */ - public function withIsNullable(bool $is_nullable) : Type - { - return self::instance($is_nullable); - } - - public function isExclusivelyNarrowedFormOrEquivalentTo( - UnionType $union_type, - Context $context, - CodeBase $code_base - ) : bool { - $result = $this->withStaticResolvedInContext($context); - if ($result !== $this) { - return $result->isExclusivelyNarrowedFormOrEquivalentTo($union_type, $context, $code_base); - } - return false; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/StaticOrSelfType.php b/vendor/phan/phan/src/Phan/Language/Type/StaticOrSelfType.php deleted file mode 100644 index 0c4c2c3..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/StaticOrSelfType.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\CodeBase; -use Phan\Language\Type; - -/** - * Represents the PHPDoc type `self` or `static`. - * This is converted to a real class when necessary. - * @see self::withStaticResolvedInContext() - */ -class StaticOrSelfType extends Type -{ - public function hasStaticOrSelfTypesRecursive(CodeBase $_) : bool - { - return true; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/StaticType.php b/vendor/phan/phan/src/Phan/Language/Type/StaticType.php deleted file mode 100644 index ce3aca6..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/StaticType.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use AssertionError; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * Represents the PHPDoc type `static`. - * This is converted to a real class when necessary. - * @see self::withStaticResolvedInContext() - */ -final class StaticType extends StaticOrSelfType -{ - /** Not an override */ - const NAME = 'static'; - - /** - * Returns a nullable/non-nullable instance of this StaticType - * - * @param bool $is_nullable - * An optional parameter, which if true returns a - * nullable instance of this native type - * - * @return static - */ - public static function instance(bool $is_nullable) : Type - { - if ($is_nullable) { - static $nullable_instance = null; - - if ($nullable_instance === null) { - $nullable_instance = static::make('\\', static::NAME, [], true, Type::FROM_TYPE); - } - - if (!($nullable_instance instanceof static)) { - throw new AssertionError('Expected StaticType::make to return StaticType'); - } - return $nullable_instance; - } - - static $instance; - - if (!$instance) { - $instance = static::make('\\', static::NAME, [], false, Type::FROM_TYPE); - if (!($instance instanceof static)) { - throw new AssertionError('Expected StaticType::make to return StaticType'); - } - } - return $instance; - } - - public function isNativeType() : bool - { - return false; - } - - public function isSelfType() : bool - { - return false; - } - - public function isStaticType() : bool - { - return true; - } - - public function __toString() : string - { - $string = $this->name; - - if ($this->is_nullable) { - $string = '?' . $string; - } - - return $string; - } - - /** - * @return Type - * Either this or 'static' resolved in the given context. - */ - public function withStaticResolvedInContext( - Context $context - ) : Type { - // If the context isn't in a class scope, there's nothing - // we can do - if (!$context->isInClassScope()) { - return $this; - } - $type = $context->getClassFQSEN()->asType(); - if ($this->is_nullable) { - return $type->withIsNullable(true); - } - return $type; - } - - /** - * @return StaticType - */ - public function withIsNullable(bool $is_nullable) : Type - { - return self::instance($is_nullable); - } - - public function isExclusivelyNarrowedFormOrEquivalentTo( - UnionType $union_type, - Context $context, - CodeBase $code_base - ) : bool { - $result = $this->withStaticResolvedInContext($context); - if ($result !== $this) { - return $result->isExclusivelyNarrowedFormOrEquivalentTo($union_type, $context, $code_base); - } - return false; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/StringType.php b/vendor/phan/phan/src/Phan/Language/Type/StringType.php deleted file mode 100644 index 1762292..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/StringType.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Phan\Config; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * Represents the type `string`. - * @see LiteralStringType for the representation of types for specific string literals - */ -class StringType extends ScalarType -{ - /** @phan-override */ - const NAME = 'string'; - - protected function canCastToNonNullableType(Type $type) : bool - { - // CallableDeclarationType is not a native type, we check separately here - return parent::canCastToNonNullableType($type) || $type instanceof CallableDeclarationType; - } - - /** @override */ - public function getIsPossiblyNumeric() : bool - { - return true; - } - - /** - * Returns true if this contains a type that is definitely non-callable - * e.g. returns true for false, array, int - * returns false for callable, string, array, object, iterable, T, etc. - */ - public function isDefiniteNonCallableType() : bool - { - return false; - } - - /** - * Returns the type after an expression such as `++$x` - */ - public function getTypeAfterIncOrDec() : UnionType - { - return UnionType::fromFullyQualifiedString('int|string|float'); - } - - public function isValidNumericOperand() : bool - { - if (Config::getValue('scalar_implicit_cast')) { - return true; - } - $string_casts = Config::getValue('scalar_implicit_partial')['string'] ?? null; - if (!is_array($string_casts)) { - return false; - } - return \in_array('int', $string_casts, true) || \in_array('float', $string_casts, true); - } -} -\class_exists(ClassStringType::class); -\class_exists(CallableStringType::class); diff --git a/vendor/phan/phan/src/Phan/Language/Type/TemplateType.php b/vendor/phan/phan/src/Phan/Language/Type/TemplateType.php deleted file mode 100644 index 1c2cf9a..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/TemplateType.php +++ /dev/null @@ -1,174 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use Closure; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * Represents a template type that has not yet been resolved. - * @see https://github.com/phan/phan/wiki/Generic-Types - */ -final class TemplateType extends Type -{ - /** @var string an identifier for the template type. */ - private $template_type_identifier; - - /** - * @param string $template_type_identifier - * An identifier for the template type - */ - protected function __construct( - string $template_type_identifier, - bool $is_nullable - ) { - $this->template_type_identifier = $template_type_identifier; - $this->is_nullable = $is_nullable; - } - - /** - * Create an instance for this ID - */ - public static function instanceForId(string $id, bool $is_nullable) : TemplateType - { - if ($is_nullable) { - static $nullable_cache = []; - return $nullable_cache[$id] ?? ($nullable_cache[$id] = new self($id, true)); - } - static $cache = []; - return $cache[$id] ?? ($cache[$id] = new self($id, false)); - } - - /** - * @param bool $is_nullable - * Set to true if the type should be nullable, else pass - * false - * - * @return Type - * A new type that is a copy of this type but with the - * given nullability value. - */ - public function withIsNullable(bool $is_nullable) : Type - { - if ($is_nullable === $this->is_nullable) { - return $this; - } - - return self::instanceForId( - $this->template_type_identifier, - $is_nullable - ); - } - - /** - * @return string - * The name associated with this type - */ - public function getName() : string - { - return $this->template_type_identifier; - } - - /** - * @return string - * A string representation of this type in FQSEN form. - * @override - */ - public function asFQSENString() : string - { - return $this->template_type_identifier; - } - - /** - * @return string - * The namespace associated with this type - */ - public function getNamespace() : string - { - return ''; - } - - public function isObject() : bool - { - // Return true because we don't know, it may or may not be an object. - // Not sure if this will be called. - return true; - } - - public function isObjectWithKnownFQSEN() : bool - { - // We have a template type ID, not an fqsen - return false; - } - - public function isPossiblyObject() : bool - { - return true; - } - - /** - * Returns true for `T` and `T[]` and `\MyClass<T>`, but not `\MyClass<\OtherClass>` - * - * Overridden in subclasses. - */ - public function hasTemplateTypeRecursive() : bool - { - return true; - } - - /** - * @param array<string,UnionType> $template_parameter_type_map - * A map from template type identifiers to concrete types - * - * @return UnionType - * This UnionType with any template types contained herein - * mapped to concrete types defined in the given map. - */ - public function withTemplateParameterTypeMap( - array $template_parameter_type_map - ) : UnionType { - return $template_parameter_type_map[$this->template_type_identifier] ?? $this->asUnionType(); - } - - /** - * Combine two closures that generate union types - * @param ?Closure(mixed, Context):UnionType $left - * @param ?Closure(mixed, Context):UnionType $right - * @return ?Closure(mixed, Context):UnionType - */ - public static function combineParameterClosures($left, $right) - { - if (!$left) { - return $right; - } - if (!$right) { - return $left; - } - - /** - * @param mixed $params - */ - return static function ($params, Context $context) use ($left, $right) : UnionType { - return $left($params, $context)->withUnionType($right($params, $context)); - }; - } - - /** - * @param TemplateType $template_type the template type that this union type is being searched for. - * - * @return ?Closure(UnionType, Context):UnionType a closure to map types to the template type wherever it was in the original union type - */ - public function getTemplateTypeExtractorClosure(CodeBase $unused_code_base, TemplateType $template_type) - { - if ($this === $template_type) { - return static function (UnionType $type, Context $_) : UnionType { - return $type; - }; - } - // Overridden in subclasses - return null; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/TrueType.php b/vendor/phan/phan/src/Phan/Language/Type/TrueType.php deleted file mode 100644 index d3168a6..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/TrueType.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -use AssertionError; -use Phan\Config; -use Phan\Language\Type; - -/** - * Represents the type `true` - * @see BoolType - * @see FalseType - */ -final class TrueType extends ScalarType -{ - /** @phan-override */ - const NAME = 'true'; - - public function getIsPossiblyTruthy() : bool - { - return true; - } - - public function getIsAlwaysTruthy() : bool - { - return true; - } - - public function getIsPossiblyTrue() : bool - { - return true; - } - - public function getIsAlwaysTrue() : bool - { - return !$this->is_nullable; // If it can be null, it's not **always** identical to true - } - - public function asNonTrueType() : Type - { - if (!$this->is_nullable) { - throw new AssertionError('should only call asNonTrueType on ?true'); - } - return NullType::instance(true); - } - - public function getIsInBoolFamily() : bool - { - return true; - } - - /** - * Helper function for internal use by UnionType - */ - public function getNormalizationFlags() : int - { - return $this->is_nullable ? (self::_bit_nullable | self::_bit_true) : self::_bit_true; - } - - public function isPrintableScalar() : bool - { - // This would be '1', which is probably not intended - return Config::getValue('scalar_implicit_cast'); - } - - public function isValidNumericOperand() : bool - { - return Config::getValue('scalar_implicit_cast'); - } - - /** - * Check if this type can satisfy a comparison (<, <=, >, >=) - * @param int|string|float|bool|null $scalar - * @param int $flags (e.g. \ast\flags\BINARY_IS_SMALLER) - * @internal - */ - public function canSatisfyComparison($scalar, int $flags) : bool - { - return self::performComparison(true, $scalar, $flags); - } - - // public function getTypeAfterIncOrDec() : UnionType - doesn't need to be changed -} diff --git a/vendor/phan/phan/src/Phan/Language/Type/VoidType.php b/vendor/phan/phan/src/Phan/Language/Type/VoidType.php deleted file mode 100644 index 2c5dbd9..0000000 --- a/vendor/phan/phan/src/Phan/Language/Type/VoidType.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language\Type; - -/** - * Represents the return type `void` - */ -final class VoidType extends NativeType -{ - /** @phan-override */ - const NAME = 'void'; - - /** - * Returns true if this contains a type that is definitely nullable or a non-object. - * e.g. returns true false, array, int - * returns false for callable, object, iterable, T, etc. - */ - public function isDefiniteNonObjectType() : bool - { - return true; - } - - /** - * Returns true if this contains a type that is definitely nullable or a non-object. - * e.g. returns true false, array, int - * returns false for callable, object, iterable, T, etc. - */ - public function isDefiniteNonCallableType() : bool - { - return true; - } -} diff --git a/vendor/phan/phan/src/Phan/Language/UnionType.php b/vendor/phan/phan/src/Phan/Language/UnionType.php deleted file mode 100644 index 97753cb..0000000 --- a/vendor/phan/phan/src/Phan/Language/UnionType.php +++ /dev/null @@ -1,3846 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language; - -use Closure; -use Generator; -use InvalidArgumentException; -use Phan\CodeBase; -use Phan\Config; -use Phan\Debug\Frame; -use Phan\Exception\CodeBaseException; -use Phan\Exception\IssueException; -use Phan\Exception\RecursionDepthException; -use Phan\Issue; -use Phan\Language\Element\Clazz; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\Type\ArrayShapeType; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\BoolType; -use Phan\Language\Type\FalseType; -use Phan\Language\Type\FloatType; -use Phan\Language\Type\GenericArrayInterface; -use Phan\Language\Type\GenericArrayType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\LiteralIntType; -use Phan\Language\Type\LiteralStringType; -use Phan\Language\Type\LiteralTypeInterface; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\MultiType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\ScalarType; -use Phan\Language\Type\SelfType; -use Phan\Language\Type\StaticOrSelfType; -use Phan\Language\Type\StaticType; -use Phan\Language\Type\StringType; -use Phan\Language\Type\TemplateType; -use Phan\Language\Type\TrueType; -use Serializable; -use function substr; - -if (!\function_exists('spl_object_id')) { - require_once __DIR__ . '/../../spl_object_id.php'; -} - -/** - * Phan's internal representation of union types, and methods for working with union types. - * - * This representation is immutable. - * Phan represents union types as a list of unique `Type`s - * (This was the most efficient representation, since most union types have 0, 1, or 2 unique types in practice) - * To add/remove a type to a UnionType, you replace it with a UnionType that had that type added. - * - * @see AnnotatedUnionType for the way Phan represents extra information about types - * @see https://github.com/phan/phan/wiki/About-Union-Types - * - * > Union types can be any native type such as int, string, bool, or array, any class such as DateTime, - * > arrays of types such as string[], DateTime[], - * > or a union of any other types such as string|int|null|DateTime|DateTime[], - * > and many other types - * - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod TODO: Document the public methods - */ -class UnionType implements Serializable -{ - /** - * @var string - * A list of one or more types delimited by the '|' - * character (e.g. 'int|DateTime|string[]') - */ - // phpcs:ignore Generic.NamingConventions.UpperCaseConstantName - const union_type_regex = - Type::type_regex - . '(\s*\|\s*' . Type::type_regex . ')*'; - - /** - * @var string - * A list of one or more types delimited by the '|' - * character (e.g. 'int|DateTime|string[]' or 'null|$this') - * This may be used for return types. - * - * TODO: Equivalent variants with no capturing? (May not improve performance much) - */ - // phpcs:ignore Generic.NamingConventions.UpperCaseConstantName - const union_type_regex_or_this = - Type::type_regex_or_this - . '(\s*\|\s*' . Type::type_regex_or_this . ')*'; - - /** - * @var array<int,Type> * This is an immutable list of unique types. - */ - private $type_set; - - /** - * @param array<int,Type> $type_list - * An optional list of types represented by this union - * @param bool $is_unique - Whether or not this is already unique. Only set to true within UnionType code. - * @see UnionType::of() for a more memory efficient equivalent. - */ - public function __construct(array $type_list = [], bool $is_unique = false) - { - $this->type_set = ($is_unique || \count($type_list) <= 1) ? $type_list : self::getUniqueTypes($type_list); - } - - /** - * @param Type[] $type_list - * @return UnionType - */ - public static function of(array $type_list) - { - $n = \count($type_list); - if ($n === 0) { - return self::$empty_instance; - } elseif ($n === 1) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return \reset($type_list)->asUnionType(); - } else { - return new self($type_list); - } - } - - /** - * @param array<int,Type> $type_list - * @return UnionType - * @suppress PhanPossiblyNonClassMethodCall - */ - protected static function ofUniqueTypes(array $type_list) - { - $n = \count($type_list); - if ($n === 0) { - return self::$empty_instance; - } elseif ($n === 1) { - return \reset($type_list)->asUnionType(); - } else { - return new self($type_list, true); - } - } - - /** @var EmptyUnionType an empty union type - Cached here for quick access. */ - private static $empty_instance; - - /** - * @return EmptyUnionType (Real return type omitted for performance) - */ - public static function empty() - { - return self::$empty_instance; - } - - /** - * @return void - * @internal - */ - public static function init() - { - if (\is_null(self::$empty_instance)) { - self::$empty_instance = EmptyUnionType::instance(); - } - } - - // __clone of $this->type_set would be a no-op due to copy on write semantics. - // And clone isn't necessary anymore now that type_set is immutable - - /** - * @param string $fully_qualified_string - * A '|' delimited string representing a type in the form - * 'int|string|null|ClassName'. - * - * @return UnionType - * - * @throws InvalidArgumentException if any type name in the union type was invalid - */ - public static function fromFullyQualifiedString( - string $fully_qualified_string - ) : UnionType { - if ($fully_qualified_string === '') { - return self::$empty_instance; - } - - /** @var array<string,UnionType> annotation not read by phan */ - static $memoize_map = []; - $union_type = $memoize_map[$fully_qualified_string] ?? null; - - if (\is_null($union_type)) { - /** Convert the `|` separated types in the union type to a list of types */ - $types = \array_map(static function (string $type_name) : Type { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall FIXME: Standardize on InvalidArgumentException - return Type::fromFullyQualifiedString($type_name); - }, self::extractTypeParts($fully_qualified_string)); - - $unique_types = self::getUniqueTypes(self::normalizeMultiTypes($types)); - if (\count($unique_types) === 1) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - $union_type = \reset($unique_types)->asUnionType(); - } else { - // TODO: Support template types within <> and test? - $union_type = new UnionType( - $unique_types, - true - ); - } - $memoize_map[$fully_qualified_string] = $union_type; - } - - return $union_type; - } - - /** - * @param array<int,Type> $type_list - * @return array<int,Type> - */ - public static function getUniqueTypes(array $type_list) : array - { - $new_type_list = []; - foreach ($type_list as $type) { - if (!\in_array($type, $new_type_list, true)) { - $new_type_list[] = $type; - } - } - return $new_type_list; - } - - /** - * @param string $type_string - * A '|' delimited string representing a type in the form - * 'int|string|null|ClassName'. - * - * @param Context $context - * The context in which the type string was - * found - * - * @param int $source one of the constants in Type::FROM_* - * - * @param ?CodeBase $code_base - * May be provided to resolve 'parent' in the context - * (e.g. if parsing complex phpdoc). - * Unnecessary in most use cases. - * - * @return UnionType - */ - public static function fromStringInContext( - string $type_string, - Context $context, - int $source, - CodeBase $code_base = null - ) : UnionType { - if ($type_string === '') { - // NOTE: '0' is a valid LiteralIntType - return self::$empty_instance; - } - - $types = []; - foreach (self::extractTypePartsForStringInContext($type_string) as $type_name) { - $types[] = Type::fromStringInContext( - $type_name, - $context, - $source, - $code_base - ); - } - return UnionType::of(self::normalizeMultiTypes($types)); - } - - /** - * @return array<int,string> - */ - private static function extractTypePartsForStringInContext(string $type_string) - { - static $cache = []; - $parts = $cache[$type_string] ?? null; - if (\is_array($parts)) { - return $parts; - } - $parts = []; - foreach (self::extractTypeParts($type_string) as $type_name) { - // Exclude empty type names - // Exclude namespaces without type names (e.g. `\`, `\NS\`) - if ($type_name === '' || \preg_match('@\\\\[\[\]]*$@', $type_name)) { - $parts[] = $type_name; - continue; - } - if (substr($type_name, -1) === ')') { - if (substr($type_name, 0, 1) === '(') { - // @phan-suppress-next-line PhanPossiblyFalseTypeArgument - foreach (self::extractTypePartsForStringInContext(substr($type_name, 1, -1)) as $inner_type_name) { - $parts[] = $inner_type_name; - } - continue; - } elseif (substr($type_name, 0, 2) === '?(') { - // @phan-suppress-next-line PhanPossiblyFalseTypeArgument - foreach (self::extractTypePartsForStringInContext(substr($type_name, 2, -1)) as $inner_type_name) { - if (substr($inner_type_name, 0, 1) === '?') { - $parts[] = $inner_type_name; - } else { - $parts[] = '?' . $inner_type_name; - } - } - continue; - } - } - $parts[] = $type_name; - } - $cache[$type_string] = $parts; - return $parts; - } - - /** - * @return array<int,string> - */ - private static function extractTypeParts(string $type_string) : array - { - $parts = []; - foreach (\explode('|', $type_string) as $part) { - $parts[] = \trim($part); - } - - if (\count($parts) <= 1) { - return $parts; - } - if (!\preg_match('/[<({]/', $type_string)) { - return $parts; - } - return self::mergeTypeParts($parts); - } - - /** - * Expands any GenericMultiArrayType and ScalarRawType instances in $types if necessary. - * - * @param array<int,Type> $types - * @return array<int,Type> - */ - public static function normalizeMultiTypes(array $types) : array - { - foreach ($types as $i => $type) { - if ($type instanceof MultiType) { - foreach ($type->asIndividualTypeInstances() as $new_type) { - $types[] = $new_type; - } - unset($types[$i]); - } - } - return $types; - } - - /** - * @param string[] $parts (already trimmed) - * @return string[] - * @see Type::extractTemplateParameterTypeNameList() (Similar method) - */ - private static function mergeTypeParts(array $parts) : array - { - $prev_parts = []; - $delta = 0; - $results = []; - foreach ($parts as $part) { - if (\count($prev_parts) > 0) { - $prev_parts[] = $part; - $delta += \substr_count($part, '<') + \substr_count($part, '(') + \substr_count($part, '{') - \substr_count($part, '>') - \substr_count($part, ')') - \substr_count($part, '}'); - if ($delta <= 0) { - if ($delta === 0) { - $results[] = \implode('|', $prev_parts); - } // ignore unparsable data such as "<T,T2>>" - $prev_parts = []; - $delta = 0; - continue; - } - continue; - } - $bracket_count = \substr_count($part, '<') + \substr_count($part, '(') + \substr_count($part, '{'); - if ($bracket_count === 0) { - $results[] = $part; - continue; - } - $delta = $bracket_count - \substr_count($part, '>') - \substr_count($part, ')') - \substr_count($part, '}'); - if ($delta === 0) { - $results[] = $part; - } elseif ($delta > 0) { - $prev_parts[] = $part; - } // otherwise ignore unparsable data such as ">" (should be impossible) - } - return $results; - } - - /** - * @param ?\ReflectionType $reflection_type - * - * @return UnionType - * A UnionType with 0 or 1 nullable/non-nullable Types - */ - public static function fromReflectionType($reflection_type) : UnionType - { - if ($reflection_type !== null) { - return Type::fromReflectionType($reflection_type)->asUnionType(); - } - return self::$empty_instance; - } - - /** - * @return array<string,string> - * Get a map from property name to its type for the given - * class name. - */ - public static function internalPropertyMapForClassName( - string $class_name - ) : array { - $map = self::internalPropertyMap(); - - $canonical_class_name = \strtolower($class_name); - - return $map[$canonical_class_name] ?? []; - } - - /** - * @return array<string,array<string,string>> - * A map from builtin class properties to type information - * - * @see \Phan\Language\Internal\PropertyMap - */ - public static function internalPropertyMap() : array - { - static $map = []; - - if (!$map) { - $map_raw = require(__DIR__ . '/Internal/PropertyMap.php'); - foreach ($map_raw as $key => $value) { - $map[\strtolower($key)] = $value; - } - - // Merge in an empty type for dynamic properties on any - // classes listed as supporting them. - foreach (require(__DIR__ . '/Internal/DynamicPropertyMap.php') as $class_name) { - $map[\strtolower($class_name)]['*'] = ''; - } - } - - return $map; - } - - /** - * A list of types for parameters associated with the - * given builtin function with the given name - * - * @param FullyQualifiedMethodName|FullyQualifiedFunctionName $function_fqsen - * - * @return array<int,array{return_type:?UnionType,parameter_name_type_map:array<string,UnionType>}> - * - * @see internal_varargs_check - * Formerly `function internal_varargs_check` - */ - public static function internalFunctionSignatureMapForFQSEN( - $function_fqsen - ) : array { - $map = self::internalFunctionSignatureMap(Config::get_closest_target_php_version_id()); - - if ($function_fqsen instanceof FullyQualifiedMethodName) { - $class_fqsen = - $function_fqsen->getFullyQualifiedClassName(); - $class_name = $class_fqsen->getNamespacedName(); - $function_name = - $class_name . '::' . $function_fqsen->getName(); - } else { - $function_name = $function_fqsen->getNamespacedName(); - } - - $function_name = \strtolower($function_name); - - $function_name_original = $function_name; - $alternate_id = 0; - - /** - * @param string|null $type_name - * @return UnionType|null - */ - $get_for_global_context = static function ($type_name) { - if (!$type_name) { - return null; - } - - static $internal_fn_cache = []; - - - $result = $internal_fn_cache[$type_name] ?? null; - if ($result === null) { - $context = new Context(); - $result = UnionType::fromStringInContext($type_name, $context, Type::FROM_PHPDOC); - $internal_fn_cache[$type_name] = $result; - } - return $result; - }; - - $configurations = []; - while (isset($map[$function_name])) { - // Get some static data about the function - $type_name_struct = $map[$function_name]; - - // Figure out the return type - $return_type_name = $type_name_struct[0]; - $return_type = $get_for_global_context($return_type_name); - - $parameter_name_type_map = []; - - foreach ($type_name_struct as $name => $type_name) { - if (\is_int($name)) { - // Integer key names are reserved for metadata in the future. - continue; - } - $parameter_name_type_map[$name] = $get_for_global_context($type_name) ?? self::$empty_instance; - } - - $configurations[] = [ - 'return_type' => $return_type, - 'parameter_name_type_map' => $parameter_name_type_map, - ]; - - $function_name = - $function_name_original . '\'' . (++$alternate_id); - } - - return $configurations; - } - - /** - * @return array<int,Type> - * The list of simple types associated with this - * union type. Keys are consecutive. - */ - public function getTypeSet() : array - { - return $this->type_set; - } - - /** - * Add a type name to the list of types - * - * @return UnionType - */ - public function withType(Type $type) - { - $type_set = $this->type_set; - if (\count($type_set) === 0) { - return $type->asUnionType(); - } - if (\in_array($type, $type_set, true)) { - return $this; - } - // 2 or more types in type_set - $type_set[] = $type; - return new UnionType($type_set, true); - } - - /** - * Returns a new union type - * which removes this type from the list of types, - * keeping the keys in a consecutive order. - * - * Each type in $this->type_set occurs exactly once. - * - * @return UnionType - */ - public function withoutType(Type $type) - { - // Copy the array $this->type_set - $type_set = $this->type_set; - foreach ($type_set as $key => $other_type) { - if ($type === $other_type) { - // Remove the only instance of $type from the copy. - unset($type_set[$key]); - return self::ofUniqueTypes($type_set); - } - } - // We did not find $type in type_set. The resulting union type is unchanged. - return $this; - } - - /** - * @return bool - * True if this union type contains the given named - * type. - */ - public function hasType(Type $type) : bool - { - return \in_array($type, $this->type_set, true); - } - - /** - * Returns a union type which add the given types to this type - * - * @return UnionType - */ - public function withUnionType(UnionType $union_type) - { - // Precondition: Both UnionTypes have lists of unique types. - $type_set = $this->type_set; - if (\count($type_set) === 0) { - return $union_type; - } - $other_type_set = $union_type->type_set; - - if (\count($other_type_set) === 0) { - return $this; - } - $new_type_set = $type_set; - foreach ($other_type_set as $type) { - if (!\in_array($type, $type_set, true)) { - $new_type_set[] = $type; - } - } - return new UnionType($new_type_set, true); - } - - /** - * @return bool - * True if this type has a type referencing the - * class context in which it exists such as 'self' - * or '$this' - */ - public function hasSelfType() : bool - { - foreach ($this->type_set as $type) { - if ($type->isSelfType()) { - return true; - } - } - return false; - } - - /** - * @return bool - * True if this union type has any types that are bool/false/true types - */ - public function hasTypeInBoolFamily() : bool - { - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->getIsInBoolFamily(); - }); - } - - /** - * Returns the types for which is_bool($x) would be true. - * - * @return UnionType - * A UnionType with known bool types kept, other types filtered out. - * - * @see nonGenericArrayTypes - * @suppress PhanUnreferencedPublicMethod - */ - public function getTypesInBoolFamily() : UnionType - { - return $this->makeFromFilter(static function (Type $type) : bool { - return $type->getIsInBoolFamily(); - }); - } - - /** - * @param CodeBase $code_base - * The code base to look up classes against - * - * TODO: Defer resolving the template parameters until parse ends. Low priority. - * - * @return array<string,UnionType> - * A map from template type identifiers to the UnionType - * to replace it with - */ - public function getTemplateParameterTypeMap( - CodeBase $code_base - ) : array { - if ($this->isEmpty()) { - return []; - } - - return \array_reduce( - $this->type_set, - /** - * @param array<string,UnionType> $map - * @return array<string,UnionType> - */ - static function (array $map, Type $type) use ($code_base) { - return \array_merge( - $type->getTemplateParameterTypeMap($code_base), - $map - ); - }, - [] - ); - } - - - /** - * @param array<string,UnionType> $template_parameter_type_map - * A map from template type identifiers to concrete types - * - * @return UnionType - * This UnionType with any template types contained herein - * mapped to concrete types defined in the given map. - */ - public function withTemplateParameterTypeMap( - array $template_parameter_type_map - ) : UnionType { - $has_template = false; - $concrete_type_list = []; - foreach ($this->type_set as $type) { - $new_union_type = $type->withTemplateParameterTypeMap($template_parameter_type_map); - if ($new_union_type->isType($type)) { - $concrete_type_list[] = $type; - } else { - $has_template = true; - foreach ($new_union_type->getTypeSet() as $new_type) { - $concrete_type_list[] = $new_type; - } - } - } - - return $has_template ? UnionType::of($concrete_type_list) : $this; - } - - /** - * @return bool - * True if this union type has any types that are template types - * (e.g. true for the template type T, false for MyClass<T>) - */ - public function hasTemplateType() : bool - { - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return ($type instanceof TemplateType); - }); - } - - /** - * @return bool - * True if this union type has any types that are template types - * (e.g. true for the template type T, true for MyClass<T>, true for T[], false for \MyClass<\stdClass>) - */ - public function hasTemplateTypeRecursive() : bool - { - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->hasTemplateTypeRecursive(); - }); - } - - /** - * @return UnionType - * Removes template types from this union type, e.g. converts T|\stdClass to \stdClass. - * @suppress PhanUnreferencedPublicMethod - */ - public function withoutTemplateTypeRecursive() : UnionType - { - return $this->makeFromFilter(static function (Type $type) : bool { - return !$type->hasTemplateTypeRecursive(); - }); - } - - /** - * @return bool - * True if this union type has any types that have generic - * types - */ - public function hasTemplateParameterTypes() : bool - { - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->hasTemplateParameterTypes(); - }); - } - - /** - * @return bool - * True if this type has a type referencing the - * class context 'static'. - */ - public function hasStaticType() : bool - { - foreach ($this->type_set as $type) { - if ($type instanceof StaticType) { - return true; - } - } - return false; - } - - /** - * @return bool - * True if this type has a type referencing the - * class context 'static' or 'self'. - */ - public function hasStaticOrSelfType() : bool - { - foreach ($this->type_set as $type) { - if ($type instanceof StaticOrSelfType) { - return true; - } - } - return false; - } - - /** - * @return UnionType - * A new UnionType with any references to 'static' resolved - * in the given context. - */ - public function withStaticResolvedInContext( - Context $context - ) : UnionType { - - // If the context isn't in a class scope, or if it doesn't have 'static', - // there's nothing we can do - if (!$context->isInClassScope() || !$this->hasStaticOrSelfType()) { - return $this; - } - - $type_set = $this->type_set; - $is_nullable = false; - $result = $this; - foreach ($type_set as $type) { - if ($type instanceof StaticOrSelfType) { - if ($type->getIsNullable()) { - $is_nullable = true; - } - $result = $result->withoutType($type); - } - } - $resolved_type = $context->getClassFQSEN()->asType(); - if ($is_nullable) { - return $result->withType($resolved_type->withIsNullable(true)); - } - return $result->withType($resolved_type); - } - - /** - * @return UnionType - * A new UnionType with any references to 'self' (but not 'static') resolved - * in the given context. - */ - public function withSelfResolvedInContext( - Context $context - ) : UnionType { - // If the context isn't in a class scope, or if it doesn't have 'self', - // there's nothing we can do - if (!$context->isInClassScope() || !$this->hasSelfType()) { - return $this; - } - - $type_set = $this->type_set; - $is_nullable = false; - $result = $this; - foreach ($type_set as $type) { - if ($type instanceof SelfType) { - if ($type->getIsNullable()) { - $is_nullable = true; - } - $result = $result->withoutType($type); - } - } - $resolved_type = $context->getClassFQSEN()->asType(); - if ($is_nullable) { - return $result->withType($resolved_type->withIsNullable(true)); - } - return $result->withType($resolved_type); - } - - /** - * @return UnionType - * A new UnionType *plus* any references to 'self' (but not 'static') resolved - * in the given context. - */ - public function withAddedClassForResolvedSelf( - Context $context - ) : UnionType { - // If the context isn't in a class scope, or if it doesn't have 'self', - // there's nothing we can do - if (!$context->isInClassScope() || !$this->hasSelfType()) { - return $this; - } - - $type_set = $this->type_set; - $is_nullable = false; - $result = $this; - foreach ($type_set as $type) { - if ($type instanceof SelfType) { - if ($type->getIsNullable()) { - $is_nullable = true; - } - } - } - $resolved_type = $context->getClassFQSEN()->asType(); - if ($is_nullable) { - return $result->withType($resolved_type->withIsNullable(true)); - } - return $result->withType($resolved_type); - } - - /** - * @return bool - * True if and only if this UnionType contains - * the given type and no others. - */ - public function isType(Type $type) : bool - { - $type_set = $this->type_set; - if (\count($type_set) !== 1) { - return false; - } - - return \reset($type_set) === $type; - } - - /** - * @return bool - * True if this UnionType is exclusively native - * types - */ - public function isNativeType() : bool - { - if ($this->isEmpty()) { - return false; - } - - return !$this->hasTypeMatchingCallback(static function (Type $type) : bool { - return !$type->isNativeType(); - }); - } - - /** - * @return bool - * True iff this union contains the exact set of types - * represented in the given union type. - */ - public function isEqualTo(UnionType $union_type) : bool - { - $type_set = $this->type_set; - $other_type_set = $union_type->type_set; - if (\count($type_set) !== \count($other_type_set)) { - return false; - } - foreach ($type_set as $type) { - if (!\in_array($type, $other_type_set, true)) { - return false; - } - } - return true; - } - - /** - * @return bool - * True iff this union contains a type that's also in - * the other union type. - */ - public function hasCommonType(UnionType $union_type) : bool - { - $other_type_set = $union_type->type_set; - foreach ($this->type_set as $type) { - if (\in_array($type, $other_type_set, true)) { - return true; - } - } - return false; - } - - /** - * @return UnionType without the subclasses/sub-types of $object_type - */ - public function withoutSubclassesOf(CodeBase $code_base, Type $object_type) : UnionType - { - $is_nullable = $this->containsNullable(); - $new_variable_type = $this; - - foreach ($this->type_set as $type) { - if ($type->withIsNullable(false)->asExpandedTypes($code_base)->hasType($object_type)) { - $new_variable_type = $new_variable_type->withoutType($type); - } - } - if ($is_nullable) { - if ($new_variable_type->isEmpty()) { - // There was a null somewhere in the old union type. - return NullType::instance(false)->asUnionType(); - } - return $new_variable_type->nullableClone(); - } - return $new_variable_type; - } - - /** - * @return bool - True if not empty and at least one type is NullType or nullable. - */ - public function containsNullable() : bool - { - foreach ($this->type_set as $type) { - if ($type->getIsNullable()) { - return true; - } - } - return false; - } - - /** - * @return bool - True if empty or at least one type is NullType or nullable. - * e.g. true for `?int`, `int|null`, or `` - */ - public function containsNullableOrIsEmpty() : bool - { - foreach ($this->type_set as $type) { - if ($type->getIsNullable()) { - return true; - } - } - return \count($this->type_set) === 0; - } - - /** - * @return bool - True if not empty, not possibly undefined, and at least one type is NullType or nullable. - */ - public function containsNullableOrUndefined() : bool - { - return $this->containsNullable(); - } - - /** - * @return UnionType a clone of this that does not include null, - * and has the non-null equivalents of any nullable types in this UnionType - */ - public function nonNullableClone() : UnionType - { - $builder = new UnionTypeBuilder(); - $did_change = false; - foreach ($this->type_set as $type) { - if (!$type->getIsNullable()) { - $builder->addType($type); - continue; - } - $did_change = true; - if ($type === NullType::instance(false)) { - continue; - } - - $builder->addType($type->withIsNullable(false)); - } - return $did_change ? $builder->getUnionType() : $this; - } - - /** - * @return UnionType a clone of this that has the nullable equivalents of any types in this UnionType - * (e.g. returns '?T|?false' for 'T|false') - */ - public function nullableClone() : UnionType - { - $builder = new UnionTypeBuilder(); - $did_change = false; - foreach ($this->type_set as $type) { - if ($type->getIsNullable()) { - $builder->addType($type); - continue; - } - $did_change = true; - $builder->addType($type->withIsNullable(true)); - } - return $did_change ? $builder->getUnionType() : $this; - } - - /** - * Analogous to Type->withIsNullable() - * @suppress PhanUnreferencedPublicMethod - * @see self::nullableClone() - * @see self::nonNullableClone() - */ - public function withIsNullable(bool $is_nullable) : UnionType - { - return $is_nullable ? $this->nullableClone() : $this->nonNullableClone(); - } - - /** - * @return bool - True if type set is not empty and at least one type is NullType or nullable or FalseType or BoolType. - * (I.e. the type is always falsey, or both sometimes falsey with a non-falsey type it can be narrowed down to) - * This does not include values such as `IntType`, since there is currently no `NonZeroIntType`. - */ - public function containsFalsey() : bool - { - foreach ($this->type_set as $type) { - if ($type->getIsPossiblyFalsey()) { - return true; - } - } - return false; - } - - /** - * @return UnionType a clone of this with any falsey types (null, false, falsey int/string literals, etc.) removed. - */ - public function nonFalseyClone() : UnionType - { - $builder = new UnionTypeBuilder(); - $did_change = false; - foreach ($this->type_set as $type) { - if (!$type->getIsPossiblyFalsey()) { - $builder->addType($type); - continue; - } - $did_change = true; - if ($type->getIsAlwaysFalsey()) { - // don't add null/false to the resulting type - continue; - } - - // add non-nullable equivalents, and replace BoolType with non-nullable TrueType - $builder->addType($type->asNonFalseyType()); - } - return $did_change ? $builder->getUnionType() : $this; - } - - /** - * @return bool - True if type set is not empty and at least one type is NullType or nullable or FalseType or BoolType. - * (I.e. the type is always falsey, or both sometimes falsey with a non-falsey type it can be narrowed down to) - * This does not include values such as `IntType`, since there is currently no `NonZeroIntType`. - */ - public function containsTruthy() : bool - { - foreach ($this->type_set as $type) { - if ($type->getIsPossiblyTruthy()) { - return true; - } - } - return false; - } - - /** - * Returns true if this contains at least one non-null IntType or LiteralIntType - */ - public function hasNonNullIntType() : bool - { - foreach ($this->type_set as $type) { - if ($type instanceof IntType && !$type->getIsNullable()) { - return true; - } - } - return false; - } - - /** - * Returns true if this is exclusively non-null IntType or LiteralIntType - */ - public function isNonNullIntType() : bool - { - if (\count($this->type_set) === 0) { - return false; - } - foreach ($this->type_set as $type) { - if (!($type instanceof IntType) || $type->getIsNullable()) { - return false; - } - } - return true; - } - - /** - * Returns true if this is exclusively non-null IntType or FloatType or subclasses - */ - public function isNonNullNumberType() : bool - { - if (\count($this->type_set) === 0) { - return false; - } - foreach ($this->type_set as $type) { - if (!($type instanceof IntType || $type instanceof FloatType) || $type->getIsNullable()) { - return false; - } - } - return true; - } - - /** - * Returns true if this contains at least one non-null StringType or LiteralStringType - */ - public function hasStringType() : bool - { - foreach ($this->type_set as $type) { - if ($type instanceof StringType) { - return true; - } - } - return false; - } - - /** - * Returns true if this contains at least one non-null StringType or LiteralStringType - */ - public function hasNonNullStringType() : bool - { - foreach ($this->type_set as $type) { - if ($type instanceof StringType && !$type->getIsNullable()) { - return true; - } - } - return false; - } - - /** - * Returns true if this is exclusively non-null StringType or LiteralStringType - */ - public function isNonNullStringType() : bool - { - if (\count($this->type_set) === 0) { - return false; - } - foreach ($this->type_set as $type) { - if (!($type instanceof StringType) || $type->getIsNullable()) { - return false; - } - } - return true; - } - - /** - * @return bool if this contains at least one literal int/string type (e.g. `'myString'|false`) - */ - public function hasLiterals() : bool - { - foreach ($this->type_set as $type) { - if ($type instanceof LiteralTypeInterface) { - return true; - } - } - return false; - } - - /** - * @return UnionType result of converting literal int/string types to the non-literal equivalents - * (e.g. converts `'myString'|false` to `string|false`) - */ - public function asNonLiteralType() : UnionType - { - if (!$this->hasLiterals()) { - return $this; - } - $result = UnionType::empty(); - foreach ($this->type_set as $type) { - $result = $result->withType($type->asNonLiteralType()); - } - return $result; - } - - /** - * @return UnionType result of removing truthy types from this value - * (e.g. converts `0|1|bool|\stdClass` to `0|false`) - * (e.g. converts `?\stdClass` to `null`) - */ - public function nonTruthyClone() : UnionType - { - $builder = new UnionTypeBuilder(); - $did_change = false; - $has_null = false; - foreach ($this->type_set as $type) { - if (!$type->getIsPossiblyTruthy()) { - $builder->addType($type); - continue; - } - $did_change = true; - if ($type->getIsAlwaysTruthy()) { - if ($type->getIsNullable()) { - $has_null = true; - } - // don't add null/false to the resulting type - continue; - } - - // add non-nullable equivalents, and replace BoolType with non-nullable TrueType - $builder->addType($type->asNonTruthyType()); - } - if (!$did_change) { - return $this; - } - if ($has_null) { - $builder->addType(NullType::instance(false)); - } - return $builder->getUnionType()->asNormalizedTypes(); - } - - /** - * @return bool - True if type set is not empty and at least one type is BoolType or FalseType - */ - public function containsFalse() : bool - { - foreach ($this->type_set as $type) { - if ($type->getIsPossiblyFalse()) { - return true; - } - } - return false; - } - - /** - * @return bool - True if type set is not empty and at least one type is BoolType or TrueType - */ - public function containsTrue() : bool - { - foreach ($this->type_set as $type) { - if ($type->getIsPossiblyTrue()) { - return true; - } - } - return false; - } - - /** - * @return UnionType result of removing false from this value - * (e.g. converts `0|1|bool|\stdClass` to `0|1|true|\stdClass`) - */ - public function nonFalseClone() : UnionType - { - $builder = new UnionTypeBuilder(); - $did_change = false; - foreach ($this->type_set as $type) { - if (!$type->getIsPossiblyFalse()) { - $builder->addType($type); - continue; - } - $did_change = true; - if ($type->getIsAlwaysFalse()) { - // don't add null/false to the resulting type - continue; - } - - // add non-nullable equivalents, and replace BoolType with non-nullable TrueType - $builder->addType($type->asNonFalseType()); - } - return $did_change ? $builder->getUnionType() : $this; - } - - /** - * @return UnionType result of removing true from this value - * (e.g. converts `0|1|bool|\stdClass` to `0|1|false|\stdClass`) - */ - public function nonTrueClone() : UnionType - { - $builder = new UnionTypeBuilder(); - $did_change = false; - foreach ($this->type_set as $type) { - if (!$type->getIsPossiblyTrue()) { - $builder->addType($type); - continue; - } - $did_change = true; - if ($type->getIsAlwaysTrue()) { - // don't add null/false to the resulting type - continue; - } - - // add non-nullable equivalents, and replace BoolType with non-nullable TrueType - $builder->addType($type->asNonTrueType()); - } - return $did_change ? $builder->getUnionType() : $this; - } - - /** - * @param UnionType $union_type - * A union type to compare against - * - * @param Context $context - * The context in which this type exists. - * - * @param CodeBase $code_base - * The code base in which both this and the given union - * types exist. - * - * @return bool - * True if each type within this union type can cast - * to the given union type. - */ - // Currently unused and buggy, commenting this out. - /** - public function isExclusivelyNarrowedFormOrEquivalentTo( - UnionType $union_type, - Context $context, - CodeBase $code_base - ) : bool { - - // Special rule: anything can cast to nothing - // and nothing can cast to anything - if ($union_type->isEmpty() || $this->isEmpty()) { - return true; - } - - // Check to see if the types are equivalent - if ($this->isEqualTo($union_type)) { - return true; - } - // TODO: Allow casting MyClass<TemplateType> to MyClass (Without the template? - - // Resolve 'static' for the given context to - // determine what's actually being referred - // to in concrete terms. - $other_resolved_type = - $union_type->withStaticResolvedInContext($context); - $other_resolved_type_set = $other_resolved_type->type_set; - - // Convert this type to a set of resolved types to iterate over. - $this_resolved_type_set = - $this->withStaticResolvedInContext($context)->type_set; - - // TODO: Need to resolve expanded union types (parents, interfaces) of classes *before* this is called. - - // Test to see if every single type in this union - // type can cast to the given union type. - foreach ($this_resolved_type_set as $type) { - // First check if this contains the type as an optimization. - if ($other_resolved_type_set->contains($type)) { - continue; - } - $expanded_types = $type->asExpandedTypes($code_base); - if ($other_resolved_type->canCastToUnionType( - $expanded_types - )) { - continue; - } - } - return true; - } - */ - - // TODO: Callers should call withStaticResolvedInContext? - public function isExclusivelyNarrowedFormOf(CodeBase $code_base, UnionType $other) : bool - { - if ($other->isEmpty()) { - return true; - } - if ($this->isEmpty() || $this->hasMixedType()) { - return false; - } - foreach ($this->type_set as $type) { - if (!$type->asUnionType()->canStrictCastToUnionType($code_base, $other)) { - return false; - } - } - return true; - } - - /** - * @param Type[] $type_list - * A list of types - * - * @return bool - * True if this union type contains any of the given - * named types - */ - public function hasAnyType(array $type_list) : bool - { - $type_set = $this->type_set; - if (\count($type_set) === 0) { - return false; - } - foreach ($type_list as $type) { - if (\in_array($type, $type_set, true)) { - return true; - } - } - return false; - } - - /** - * @return bool - * True if this type has any subtype of the `iterable` type (e.g. `Traversable`, `Array`). - */ - public function hasIterable() : bool - { - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->isIterable(); - }); - } - - /** - * @return int - * The number of types in this union type - */ - public function typeCount() : int - { - return \count($this->type_set); - } - - /** - * @return bool - * True if this Union has no types - */ - public function isEmpty() : bool - { - return \count($this->type_set) === 0; - } - - /** - * @param UnionType $target - * The type we'd like to see if this type can cast - * to - * - * @param CodeBase $code_base - * The code base used to expand types - * - * @return bool - * Test to see if this type can be cast to the - * given type after expanding both union types - * to include all ancestor types - * - * TODO: ensure that this is only called after the parse phase is over. - */ - public function canCastToExpandedUnionType( - UnionType $target, - CodeBase $code_base - ) : bool { - - $this_expanded = - $this->asExpandedTypes($code_base); - - $target_expanded = - $target->asExpandedTypes($code_base); - - return - $this_expanded->canCastToUnionType( - $target_expanded - ); - } - - /** - * Check if a class with templates can be cast to another class with templates - * At least one of the source or target is expected to have templates when this is called. - * - * This allows casting Some<\MyClass> to cast to Option<\MyClass>, but not Option<\UnrelatedClass> - */ - public function canCastToUnionTypeHandlingTemplates( - UnionType $target, - CodeBase $code_base - ) : bool { - // Fast-track most common cases first - $type_set = $this->type_set; - // If either type is unknown, we can't call it - // a success - if (\count($type_set) === 0) { - return true; - } - $target_type_set = $target->type_set; - if (\count($target_type_set) === 0) { - return true; - } - $target = $target->asNormalizedTypes(); - - // T overlaps with T, a future call to Type->canCastToType will pass. - if ($this->hasCommonType($target)) { - return true; - } - static $float_type; - static $int_type; - static $mixed_type; - static $null_type; - if ($null_type === null) { - $int_type = IntType::instance(false); - $float_type = FloatType::instance(false); - $mixed_type = MixedType::instance(false); - $null_type = NullType::instance(false); - } - - if (Config::get_null_casts_as_any_type()) { - // null <-> null - if ($this->isType($null_type) - || $target->isType($null_type) - ) { - return true; - } - } else { - // If null_casts_as_any_type isn't set, then try the other two fallbacks. - if (Config::get_null_casts_as_array() && $this->isType($null_type) && $target->hasArrayLike()) { - return true; - } elseif (Config::get_array_casts_as_null() && $target->isType($null_type) && $this->hasArrayLike()) { - return true; - } - } - - // mixed <-> mixed - if (\in_array($mixed_type, $type_set, true) - || \in_array($mixed_type, $target_type_set, true) - ) { - return true; - } - - // int -> float - if (\in_array($int_type, $type_set, true) - && \in_array($float_type, $target_type_set, true) - ) { - return true; - } - - // Check conversion on the cross product of all - // type combinations and see if any can cast to - // any. - foreach ($type_set as $source_type) { - if ($source_type->canCastToAnyTypeInSetHandlingTemplates($target_type_set, $code_base)) { - return true; - } - } - - // Allow casting ?T to T|null for any type T. Check if null is part of this type first. - if (\in_array($null_type, $target_type_set, true)) { - foreach ($type_set as $source_type) { - // Only redo this check for the nullable types, we already failed the checks for non-nullable types. - if ($source_type->getIsNullable()) { - // TODO: Add unit tests of nullable templates - return $source_type->withIsNullable(false)->canCastToAnyTypeInSetHandlingTemplates($target_type_set, $code_base); - } - } - } - - // Only if no source types can be cast to any target - // types do we say that we cannot perform the cast - return false; - } - - /** - * @param UnionType $target - * A type to check to see if this can cast to it - * - * @return bool - * True if this type is allowed to cast to the given type - * i.e. int->float is allowed while float->int is not. - */ - public function canCastToUnionType( - UnionType $target - ) : bool { - // Fast-track most common cases first - $type_set = $this->type_set; - // If either type is unknown, we can't call it - // a success - if (\count($type_set) === 0) { - return true; - } - $target_type_set = $target->type_set; - if (\count($target_type_set) === 0) { - return true; - } - - // T overlaps with T, a future call to Type->canCastToType will pass. - $target = $target->asNormalizedTypes(); - if ($this->hasCommonType($target)) { - return true; - } - - static $float_type; - static $int_type; - static $mixed_type; - static $null_type; - if ($null_type === null) { - $int_type = IntType::instance(false); - $float_type = FloatType::instance(false); - $mixed_type = MixedType::instance(false); - $null_type = NullType::instance(false); - } - - if (Config::get_null_casts_as_any_type()) { - // null <-> null - if ($this->isType($null_type) - || $target->isType($null_type) - ) { - return true; - } - } else { - // If null_casts_as_any_type isn't set, then try the other two fallbacks. - if (Config::get_null_casts_as_array() && $this->isType($null_type) && $target->hasArrayLike()) { - return true; - } elseif (Config::get_array_casts_as_null() && $target->isType($null_type) && $this->hasArrayLike()) { - return true; - } - } - - // mixed <-> mixed - if (\in_array($mixed_type, $type_set, true) - || \in_array($mixed_type, $target_type_set, true) - ) { - return true; - } - - // int -> float - if (\in_array($int_type, $type_set, true) - && \in_array($float_type, $target_type_set, true) - ) { - return true; - } - - // Check conversion on the cross product of all - // type combinations and see if any can cast to - // any. - foreach ($type_set as $source_type) { - if ($source_type->canCastToAnyTypeInSet($target_type_set)) { - return true; - } - } - - // Allow casting ?T to T|null for any type T. Check if null is part of this type first. - if (\in_array($null_type, $target_type_set, true)) { - foreach ($type_set as $source_type) { - // Only redo this check for the nullable types, we already failed the checks for non-nullable types. - if ($source_type->getIsNullable()) { - return $source_type->withIsNullable(false)->canCastToAnyTypeInSet($target_type_set); - } - } - } - - // Only if no source types can be cast to any target - // types do we say that we cannot perform the cast - return false; - } - - /** - * Precondition: $this->canCastToUnionType() is false. - * - * This tells us if it would have succeeded if the source type was not nullable. - * - * @internal - */ - public function canCastToUnionTypeIfNonNull(UnionType $target) : bool - { - $non_null = $this->nonNullableClone(); - if ($non_null === $this) { - // This wasn't nullable in the first place - return false; - } - if ($non_null->isEmpty()) { - // This was exclusively null - It should be a full TypeMismatch - return false; - } - return $non_null->canCastToUnionType($target); - } - - /** - * @param UnionType $target - * A type to check to see if this can cast to it. - * - * Every single type in this type must be able to cast to a type in $target (Empty types can cast to empty) - * - * @return bool - * True if this type is allowed to cast to the given type - * i.e. int->float is allowed while float->int is not. - * - * @suppress PhanUnreferencedPublicMethod may be used elsewhere in the future - */ - public function canStrictCastToUnionType(CodeBase $code_base, UnionType $target) : bool - { - // Fast-track most common cases first - $type_set = $this->type_set; - // If either type is unknown, we can't call it - // a success - if (\count($type_set) === 0) { - return true; - } - $target_type_set = $target->type_set; - if (\count($target_type_set) === 0) { - return true; - } - - // every single type in T overlaps with T, a future call to Type->canCastToType will pass. - $matches = true; - foreach ($type_set as $type) { - if (!\in_array($type, $target_type_set, true)) { - $matches = false; - break; - } - } - if ($matches) { - return true; - } - static $null_type; - if ($null_type === null) { - $null_type = NullType::instance(false); - } - - // Check conversion on the cross product of all - // type combinations and see if any can cast to - // any. - $matches = true; - foreach ($type_set as $source_type) { - if (!$source_type->asExpandedTypes($code_base)->canCastToUnionType($target)) { - $matches = false; - break; - } - } - if ($matches) { - return true; - } - - // Allow casting ?T to T|null for any type T. Check if null is part of this type first. - if (\in_array($null_type, $target_type_set, true)) { - foreach ($type_set as $source_type) { - // Only redo this check for the nullable types, we already failed the checks for non-nullable types. - if (!$source_type->withIsNullable(false)->asExpandedTypes($code_base)->canCastToUnionType($target)) { - return false; - } - } - return true; - } - - // Only if no source types can be cast to any target - // types do we say that we cannot perform the cast - return false; - } - - /** - * @return bool - * True if all types in this union are scalars - */ - public function isScalar() : bool - { - if ($this->isEmpty()) { - return false; - } - - return !$this->hasTypeMatchingCallback(static function (Type $type) : bool { - return !$type->isScalar(); - }); - } - - /** - * @return bool - * True if any types in this union are a printable scalar, or this is the empty union type - */ - public function hasPrintableScalar() : bool - { - if ($this->isEmpty()) { - return true; - } - - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->isPrintableScalar(); - }); - } - - /** - * @return bool - * True if any types in this union are a valid operand for a bitwise operator ('|', '&', or '^'). - */ - public function hasValidBitwiseOperand() : bool - { - if ($this->isEmpty()) { - return true; - } - - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->isValidBitwiseOperand(); - }); - } - - /** - * @return bool - * True if this union has array-like types (is of type array, is - * a generic array, or implements ArrayAccess). - */ - public function hasArrayLike() : bool - { - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->isArrayLike(); - }); - } - - /** - * @return bool - * True if this union has array-like types (is of type array, - * or is a generic array) - */ - public function hasArray() : bool - { - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type instanceof ArrayType; - }); - } - - /** - * @return bool - * True if this union has array-like types (is of type array, is - * a generic array, is an array shape, or implements ArrayAccess). - */ - public function hasGenericArray() : bool - { - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type instanceof GenericArrayInterface; - }); - } - - /** - * @return bool - * True if this union contains the ArrayAccess type. - * (Call asExpandedTypes() first to check for subclasses of ArrayAccess) - */ - public function hasArrayAccess() : bool - { - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->isArrayAccess(); - }); - } - - /** - * @return UnionType - */ - public function asArrayOrArrayAccessSubTypes(CodeBase $code_base) : UnionType - { - $result = UnionType::empty(); - foreach ($this->type_set as $type) { - if ($type->isArrayOrArrayAccessSubType($code_base)) { - $result = $result->withType($type); - } - } - return $result; - } - - /** - * @return bool - * True if this union contains the Traversable type. - * (Call asExpandedTypes() first to check for subclasses of Traversable) - * @suppress PhanUnreferencedPublicMethod not used right now. - */ - public function hasTraversable() : bool - { - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->isTraversable(); - }); - } - - /** - * @return bool - * True if this union type represents types that are - * array-like, and nothing else (e.g. can't be null). - * If any of the array-like types are nullable, this returns false. - */ - public function isExclusivelyArrayLike() : bool - { - if ($this->isEmpty()) { - return false; - } - - return !$this->hasTypeMatchingCallback(static function (Type $type) : bool { - return !$type->isArrayLike() || $type->getIsNullable(); - }); - } - - /** - * @return bool - * True if this union type represents types that are arrays - * or generic arrays, but nothing else. - * @suppress PhanUnreferencedPublicMethod - */ - public function isExclusivelyArray() : bool - { - if ($this->isEmpty()) { - return false; - } - - return !$this->hasTypeMatchingCallback(static function (Type $type) : bool { - return !($type instanceof ArrayType) || $type->getIsNullable(); - }); - } - - /** - * @return UnionType - * Get the subset of types which are not native - */ - public function nonNativeTypes() : UnionType - { - return $this->makeFromFilter(static function (Type $type) : bool { - return !$type->isNativeType(); - }); - } - - /** - * A memory efficient way to create a UnionType from a filter operation. - * If this the filter preserves everything, returns $this instead - */ - public function makeFromFilter(Closure $cb) : UnionType - { - $new_type_list = []; - foreach ($this->type_set as $type) { - if ($cb($type)) { - $new_type_list[] = $type; - } - } - if (\count($new_type_list) === \count($this->type_set)) { - return $this; - } - return new UnionType($new_type_list, true); - } - - /** - * Returns a list of class FQSENs representing the non-native types - * associated with this UnionType. - * - * @param Context $context - * The context in which we're resolving this union - * type. - * - * @return Generator - * @phan-return Generator<FullyQualifiedClassName> - * - * @throws CodeBaseException - * An exception is thrown if a non-native type does not have - * an associated class - * - * @throws IssueException - * An exception is thrown if static is used as a type outside of an object - * context - * - * TODO: Add a method to ContextNode to directly get FQSEN instead? - */ - public function asClassFQSENList( - Context $context - ) { - // Iterate over each viable class type to see if any - // have the constant we're looking for - foreach ($this->type_set as $class_type) { - if ($class_type->isNativeType()) { - continue; - } - // Get the class FQSEN - $class_fqsen = FullyQualifiedClassName::fromType($class_type); - - if ($class_type->isStaticType()) { - if (!$context->isInClassScope()) { - throw new IssueException( - Issue::fromType(Issue::ContextNotObject)( - $context->getFile(), - $context->getLineNumberStart(), - [ - $class_type->getName() - ] - ) - ); - } - yield $class_fqsen; - } else { - yield $class_fqsen; - } - } - } - - /** - * @param CodeBase $code_base - * The code base in which to find classes - * - * @param Context $context - * The context in which we're resolving this union - * type. - * - * @return Generator<Clazz> - * - * A list of classes representing the non-native types - * associated with this UnionType - * - * @throws CodeBaseException - * An exception is thrown if a non-native type does not have - * an associated class - * - * @throws IssueException - * An exception is thrown if static is used as a type outside of an object - * context - */ - public function asClassList( - CodeBase $code_base, - Context $context - ) { - // Iterate over each viable class type to see if any - // have the constant we're looking for - foreach ($this->type_set as $class_type) { - if ($class_type->isNativeType()) { - continue; - } - if ($class_type->isStaticType()) { - if (!$context->isInClassScope()) { - throw new IssueException( - Issue::fromType(Issue::ContextNotObject)( - $context->getFile(), - $context->getLineNumberStart(), - [ - $class_type->getName() - ] - ) - ); - } - yield $context->getClassInScope($code_base); - continue; - } - - if ($class_type->isSelfType()) { - if (!$context->isInClassScope()) { - throw new IssueException( - Issue::fromType(Issue::ContextNotObject)( - $context->getFile(), - $context->getLineNumberStart(), - [ - $class_type->getName() - ] - ) - ); - } - yield $context->getClassInScope($code_base); - continue; - } - // Get the class FQSEN - $class_fqsen = FullyQualifiedClassName::fromType($class_type); - // See if the class exists - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - throw new CodeBaseException( - $class_fqsen, - "Cannot find class $class_fqsen" - ); - } - - yield $code_base->getClassByFQSEN($class_fqsen); - } - } - - /** - * Takes `a|b[]|c|d[]|e` and returns `a|c|e` - * - * @return UnionType - * A UnionType with generic array types filtered out - * - * @suppress PhanUnreferencedPublicMethod - */ - public function nonGenericArrayTypes() : UnionType - { - return $this->makeFromFilter(static function (Type $type) : bool { - return !($type instanceof GenericArrayInterface); - }); - } - - /** - * Takes `a|b[]|c|d[]|e` and returns `b[]|d[]` - * - * @return UnionType - * A UnionType with generic array types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function genericArrayTypes() : UnionType - { - return $this->makeFromFilter(static function (Type $type) : bool { - return $type instanceof GenericArrayInterface; - }); - } - - /** - * Takes `MyClass|int|array|?object` and returns `MyClass|?object` - * - * @return UnionType - * A UnionType with known object types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function objectTypes() : UnionType - { - return $this->makeFromFilter(static function (Type $type) : bool { - return $type->isObject(); - }); - } - - /** - * Takes `MyClass|int|array|?object` and returns `MyClass` - * - * @return UnionType - * A UnionType with known object types with known FQSENs kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function objectTypesWithKnownFQSENs() : UnionType - { - return $this->makeFromFilter(static function (Type $type) : bool { - return $type->isObjectWithKnownFQSEN(); - }); - } - - /** - * Returns true if objectTypes would be non-empty. - * - * @return bool - */ - public function hasObjectTypes() : bool - { - return $this->hasTypeMatchingCallback((static function (Type $type) : bool { - return $type->isObject(); - })); - } - - /** - * Returns true if at least one type could possibly be an object. - * E.g. returns true for iterator. - * NOTE: this returns false for `mixed` - * - * @return bool - */ - public function hasPossiblyObjectTypes() : bool - { - return $this->hasTypeMatchingCallback((static function (Type $type) : bool { - return $type->isPossiblyObject(); - })); - } - - /** - * Returns the types for which is_scalar($x) would be true. - * This means null/nullable is removed. - * Takes `MyClass|int|?bool|array|?object` and returns `int|bool` - * Takes `?MyClass` and returns an empty union type. - * - * @return UnionType - * A UnionType with known scalar types kept, other types filtered out. - * - * @see nonGenericArrayTypes - */ - public function scalarTypes() : UnionType - { - return $this->nonNullableClone()->makeFromFilter(static function (Type $type) : bool { - return $type->isScalar(); - }); - } - - /** - * Returns the types for which is_callable($x) would be true. - * TODO: Check for __invoke()? - * Takes `Closure|false` and returns `Closure` - * Takes `?MyClass` and returns an empty union type. - * - * @return UnionType - * A UnionType with known callable types kept, other types filtered out. - * - * @see nonGenericArrayTypes - * @suppress PhanUnreferencedPublicMethod - */ - public function callableTypes() : UnionType - { - return $this->makeFromFilter(static function (Type $type) : bool { - return $type->isCallable(); - }); - } - - /** - * Returns the types for which is_int($x) would be true. - * - * @return UnionType - * A UnionType with known int types kept, other types filtered out. - * - * @see nonGenericArrayTypes - * @suppress PhanUnreferencedPublicMethod - */ - public function intTypes() : UnionType - { - return $this->makeFromFilter(static function (Type $type) : bool { - // IntType and LiteralType - return $type instanceof IntType; - }); - } - - /** - * Returns the types for which is_string($x) would be true. - * - * @return UnionType - * A UnionType with known string types kept, other types filtered out. - * - * @see nonGenericArrayTypes - * @suppress PhanUnreferencedPublicMethod - */ - public function stringTypes() : UnionType - { - return $this->makeFromFilter(static function (Type $type) : bool { - // IntType and LiteralStringType - return $type instanceof StringType; - }); - } - - /** - * Returns the types for which is_numeric($x) is possibly true. - * - * @return UnionType - * A UnionType with known numeric types kept, other types filtered out. - * - * @see nonGenericArrayTypes - * @suppress PhanUnreferencedPublicMethod - */ - public function numericTypes() : UnionType - { - return $this->makeFromFilter(static function (Type $type) : bool { - // IntType and LiteralStringType - return $type->getIsPossiblyNumeric(); - }); - } - - /** - * Returns true if this has one or more callable types - * TODO: Check for __invoke()? - * Takes `Closure|false` and returns true - * Takes `?MyClass` and returns false - * - * @return bool - * A UnionType with known callable types kept, other types filtered out. - * - * @see self::callableTypes() - * - * @suppress PhanUnreferencedPublicMethod - */ - public function hasCallableType() : bool - { - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->isCallable(); - }); - } - - /** - * Returns true if every type in this type is callable. - * TODO: Check for __invoke()? - * - * Takes `callable` and returns true - * Takes `callable|false` and returns false - * - * @return bool - * A UnionType with known callable types kept, other types filtered out. - * - * @see nonGenericArrayTypes - * @suppress PhanUnreferencedPublicMethod not used right now. - */ - public function isExclusivelyCallable() : bool - { - return !$this->hasTypeMatchingCallback(static function (Type $type) : bool { - return !$type->isCallable(); - }); - } - - /** - * @return bool is each of the types in this type bool, false, or true? - * This also returns false if any type is nullable. - */ - public function isExclusivelyBoolTypes() : bool - { - if ($this->isEmpty()) { - return false; - } - foreach ($this->type_set as $type) { - if (!$type->getIsInBoolFamily() || $type->getIsNullable()) { - return false; - } - } - return true; - } - - /** - * Takes `a|b[]|c|d[]|e|array|ArrayAccess` and returns `a|c|e|ArrayAccess` - * - * @return UnionType - * A UnionType with generic types(as well as the non-generic type `array`) - * filtered out. - * - * @see nonGenericArrayTypes - */ - public function nonArrayTypes() : UnionType - { - return $this->makeFromFilter( - static function (Type $type) : bool { - return !($type instanceof ArrayType); - } - ); - } - - /** - * Takes `a|b[]|c|d[]|e|f[]|ArrayAccess` and returns `f[]` - * - * @return UnionType - * A UnionType with non-array types filtered out - * - * @see self::nonArrayTypes() - */ - public function arrayTypes() : UnionType - { - return $this->makeFromFilter( - static function (Type $type) : bool { - return $type instanceof ArrayType; - } - ); - } - - /** - * @return bool - * True if this is exclusively generic types - */ - public function isGenericArray() : bool - { - if ($this->isEmpty()) { - return false; - } - - return !$this->hasTypeMatchingCallback(static function (Type $type) : bool { - return !($type instanceof GenericArrayInterface); - }); - } - - /** - * @return bool - * True if any of the types in this UnionType made $matcher_callback return true - */ - public function hasTypeMatchingCallback(Closure $matcher_callback) : bool - { - foreach ($this->type_set as $type) { - if ($matcher_callback($type)) { - return true; - } - } - return false; - } - - /** - * @return Type|false - * Returns the first type in this UnionType made $matcher_callback return true - * @suppress PhanUnreferencedPublicMethod - */ - public function findTypeMatchingCallback(Closure $matcher_callback) - { - foreach ($this->type_set as $type) { - if ($matcher_callback($type)) { - return $type; - } - } - return false; - } - - /** - * Takes `a|b[]|c|d[]|e|Traversable<f,g>` and returns `int|string|f` - * - * Takes `array{field:int,other:stdClass}` and returns `string` - * - * @param CodeBase $code_base (for detecting the iterable value types of `class MyIterator extends Iterator`) - * - * @return UnionType - */ - public function iterableKeyUnionType(CodeBase $code_base) : UnionType - { - // This is frequently called, and has been optimized - $builder = new UnionTypeBuilder(); - $type_set = $this->type_set; - foreach ($type_set as $type) { - $element_type = $type->iterableKeyUnionType($code_base); - if ($element_type === null) { - // Does not have iterable values - continue; - } - $builder->addUnionType($element_type); - } - - return $builder->getUnionType(); - } - - /** - * Takes `a|b[]|c|d[]|e|Traversable<f,g>` and returns `b|d|g` - * - * Takes `array{field:int,other:string}` and returns `int|string` - * - * @param CodeBase $code_base (for detecting the iterable value types of `class MyIterator extends Iterator`) - * - * @return UnionType - * @suppress PhanTypeMismatchArgumentNullable false positive in static init - */ - public function iterableValueUnionType(CodeBase $code_base) : UnionType - { - // This is frequently called, and has been optimized - $builder = new UnionTypeBuilder(); - $type_set = $this->type_set; - foreach ($type_set as $type) { - $element_type = $type->iterableValueUnionType($code_base); - if ($element_type === null) { - // Does not have iterable values - continue; - } - $builder->addUnionType($element_type); - } - - static $array_type_nonnull = null; - static $array_type_nullable = null; - static $mixed_type = null; - static $null_type = null; - if ($array_type_nonnull === null) { - $array_type_nonnull = ArrayType::instance(false); - $array_type_nullable = ArrayType::instance(true); - $mixed_type = MixedType::instance(false); - $null_type = NullType::instance(false); - } - - // If array is in there, then it can be any type - if (\in_array($array_type_nonnull, $type_set, true)) { - $builder->addType($mixed_type); - $builder->addType($null_type); - } elseif (\in_array($mixed_type, $type_set, true) - || \in_array($array_type_nullable, $type_set, true) - ) { - // Same for mixed - $builder->addType($mixed_type); - } - - return $builder->getUnionType(); - } - - /** - * Takes `a|b[]|c|d[]|e` and returns `b|d` - * Takes `array{field:int,other:string}` and returns `int|string` - * - * @return UnionType - * @suppress PhanTypeMismatchArgumentNullable false positive in static init - */ - public function genericArrayElementTypes() : UnionType - { - // This is frequently called, and has been optimized - $builder = new UnionTypeBuilder(); - $type_set = $this->type_set; - foreach ($type_set as $type) { - if ($type instanceof GenericArrayInterface) { - if ($type instanceof GenericArrayType) { - $builder->addType($type->genericArrayElementType()); - } else { - $builder->addUnionType($type->genericArrayElementUnionType()); - } - } - } - - static $array_type_nonnull = null; - static $array_type_nullable = null; - static $mixed_type = null; - static $null_type = null; - if ($array_type_nonnull === null) { - $array_type_nonnull = ArrayType::instance(false); - $array_type_nullable = ArrayType::instance(true); - $mixed_type = MixedType::instance(false); - $null_type = NullType::instance(false); - } - - if (\in_array($array_type_nullable, $type_set, true)) { - // TODO: More consistency in what causes this check to infer null - $builder->addType($mixed_type); - $builder->addType($null_type); - } elseif (\in_array($array_type_nonnull, $type_set, true) || - // If array is in there, then it can be any type - \in_array($mixed_type, $type_set, true)) { - $builder->addType($mixed_type); - } - - return $builder->getUnionType(); - } - - /** - * Takes `b|d[]` and returns `b[]|d[][]` - * - * @param int $key_type - * Corresponds to the type of the array keys. Set this to a GenericArrayType::KEY_* constant. - * - * @return UnionType - * The subset of types in this - * - * TODO: Add a variant that will convert mixed to array<int,mixed> instead of array? - */ - public function elementTypesToGenericArray(int $key_type) : UnionType - { - $parts = \array_map(static function (Type $type) use ($key_type) : Type { - if ($type instanceof MixedType) { - return ArrayType::instance(false); - } - return GenericArrayType::fromElementType($type, false, $key_type); - }, $this->type_set); - if (\count($parts) <= 1) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return \count($parts) === 1 ? \reset($parts)->asUnionType() : self::$empty_instance; - } - return new UnionType($parts); - } - - /** - * @param Closure(Type):Type $closure - * A closure mapping `Type` to `Type` - * - * @return UnionType - * A new UnionType with each type mapped through the - * given closure - */ - public function asMappedUnionType(Closure $closure) : UnionType - { - $parts = \array_map($closure, $this->type_set); - if (\count($parts) <= 1) { - return \count($parts) === 1 ? \reset($parts)->asUnionType() : self::$empty_instance; - } - return new UnionType($parts); - } - - /** - * @param Closure(UnionType):UnionType $closure - */ - public function withMappedElementTypes(Closure $closure) : UnionType - { - return $this->asMappedUnionType(static function (Type $type) use ($closure) : Type { - if ($type instanceof ArrayShapeType) { - $field_types = \array_map($closure, $type->getFieldTypes()); - $result = ArrayShapeType::fromFieldTypes($field_types, $type->getIsNullable()); - return $result; - } elseif ($type instanceof GenericArrayType) { - $element_types = $closure($type->genericArrayElementType()->asUnionType()); - if ($element_types->typeCount() !== 1) { - $element_type = MixedType::instance(false); - } else { - $element_type = $element_types->getTypeSet()[0]; - } - return GenericArrayType::fromElementType($element_type, $type->getIsNullable(), $type->getKeyType()); - } - return ArrayType::instance(false); - }); - } - - /** - * @param int $key_type - * Corresponds to the type of the array keys. Set this to a GenericArrayType::KEY_* constant. - * - * @return UnionType - * Get a new type for each type in this union which is - * the generic array version of this type. For instance, - * 'int|float' will produce 'int[]|float[]'. - * - * If $this is an empty UnionType, this method will produce an empty UnionType - */ - public function asGenericArrayTypes(int $key_type) : UnionType - { - return $this->asMappedUnionType( - static function (Type $type) use ($key_type) : Type { - return $type->asGenericArrayType($key_type); - } - ); - } - - /** - * @return UnionType - * Get a new type for each type in this union which is - * the generic array version of this type. For instance, - * 'int|float' will produce 'int[]|float[]'. - * - * If $this is an empty UnionType, this method will produce 'array' - */ - public function asNonEmptyGenericArrayTypes(int $key_type) : UnionType - { - if (\count($this->type_set) === 0) { - return ArrayType::instance(false)->asUnionType(); - } - return $this->asMappedUnionType( - static function (Type $type) use ($key_type) : Type { - return $type->asGenericArrayType($key_type); - } - ); - } - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands all class types to all inherited classes returning - * a superset of this type. - */ - public function asExpandedTypes( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - if ($recursion_depth >= 12) { - throw new RecursionDepthException("Recursion has gotten out of hand: " . Frame::getExpandedTypesDetails()); - } - - $type_set = $this->type_set; - if (\count($type_set) === 0) { - return self::$empty_instance; - } elseif (\count($type_set) === 1) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return \reset($type_set)->asExpandedTypes( - $code_base, - $recursion_depth + 1 - ); - } - // 2 or more union types to merge - - $builder = new UnionTypeBuilder(); - foreach ($type_set as $type) { - $builder->addUnionType( - $type->asExpandedTypes( - $code_base, - $recursion_depth + 1 - ) - ); - } - return $builder->getUnionType(); - } - - /** - * @param CodeBase $code_base - * The code base to use in order to find super classes, etc. - * - * @param $recursion_depth - * This thing has a tendency to run-away on me. This tracks - * how bad I messed up by seeing how far the expanded types - * go - * - * @return UnionType - * Expands all class types to all inherited classes returning - * a superset of this type, not removing template types - */ - public function asExpandedTypesPreservingTemplate( - CodeBase $code_base, - int $recursion_depth = 0 - ) : UnionType { - if ($recursion_depth >= 12) { - throw new RecursionDepthException("Recursion has gotten out of hand: " . Frame::getExpandedTypesDetails()); - } - - $type_set = $this->type_set; - if (\count($type_set) === 0) { - return self::$empty_instance; - } elseif (\count($type_set) === 1) { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return \reset($type_set)->asExpandedTypesPreservingTemplate( - $code_base, - $recursion_depth + 1 - ); - } - // 2 or more union types to merge - - $builder = new UnionTypeBuilder(); - foreach ($type_set as $type) { - $builder->addUnionType( - $type->asExpandedTypesPreservingTemplate( - $code_base, - $recursion_depth + 1 - ) - ); - } - return $builder->getUnionType(); - } - - /** - * Remove all types with the same FQSENs as $template_union_type with the types. - * Then, return this with $template_union_type added. - */ - public function replaceWithTemplateTypes(UnionType $template_union_type) : UnionType - { - // TODO: Preserve nullable - if ($template_union_type->isEmpty()) { - return $this; - } - $result = $this; - foreach ($this->getTypeSet() as $type) { - // TODO: Handle recursion - if ($template_union_type->hasTypeWithFQSEN($type)) { - $result = $result->withoutType($type); - } - } - return $result->withUnionType($template_union_type); - } - - /** - * Check if at least one type in this union type has the same FQSEN as $other - * Returns false if $other is not an object type. - */ - public function hasTypeWithFQSEN(Type $other) : bool - { - if (!$other->isObjectWithKnownFQSEN()) { - return false; - } - foreach ($this->type_set as $type) { - if ($type->hasSameNamespaceAndName($other) && $type->isObjectWithKnownFQSEN()) { - return true; - } - } - return false; - } - - /** - * Filters the types with the same FQSEN as $other - * @suppress PhanUnreferencedPublicMethod - */ - public function getTypesWithFQSEN(Type $other) : UnionType - { - if (!$other->isObjectWithKnownFQSEN()) { - return UnionType::empty(); - } - $result = $this; - foreach ($this->type_set as $type) { - if ($type->hasSameNamespaceAndName($other) && $type->isObjectWithKnownFQSEN()) { - $result = $result->withoutType($type); - } - } - return $result; - } - - /** - * As per the Serializable interface - * - * @return string - * A serialized representation of this type - * - * @see \Serializable - */ - public function serialize() : string - { - return (string)$this; - } - - /** - * As per the Serializable interface - * - * @param string $serialized - * A serialized UnionType - * - * @return void - * - * @see \Serializable - */ - public function unserialize($serialized) - { - // NOTE: Potentially need to handle "array{field:int|string}" in the future. - // TODO: Not going to work with template types - $this->type_set = UnionType::fromFullyQualifiedString($serialized)->getTypeSet(); - } - - /** - * @return string - * A human-readable string representation of this union - * type - */ - public function __toString() : string - { - // Create a new array containing the string - // representations of each type - $types = $this->type_set; - $type_name_list = - \array_map(static function (Type $type) : string { - return (string)$type; - }, $types); - - // Sort the types so that we get a stable - // representation - \asort($type_name_list); - - // Join them with a pipe - return \implode('|', $type_name_list); - } - - /** - * @return array<string,array<int|string,string>> - * A map from builtin function name to type information - * - * @see \Phan\Language\Internal\FunctionSignatureMap - */ - public static function internalFunctionSignatureMap(int $target_php_version) : array - { - static $php73_map = []; - - if (!$php73_map) { - $php73_map = self::computeLatestFunctionSignatureMap(); - } - if ($target_php_version >= 70400) { - static $php74_map = []; - if (!$php74_map) { - $php74_map = self::computePHP74FunctionSignatureMap($php73_map); - } - if ($target_php_version >= 80000) { - static $php80_map = []; - if (!$php80_map) { - $php80_map = self::computePHP80FunctionSignatureMap($php74_map); - } - return $php80_map; - } - return $php74_map; - } - if ($target_php_version >= 70300) { - return $php73_map; - } - static $php72_map = []; - if (!$php72_map) { - $php72_map = self::computePHP72FunctionSignatureMap($php73_map); - } - if ($target_php_version >= 70200) { - return $php72_map; - } - static $php71_map = []; - if (!$php71_map) { - $php71_map = self::computePHP71FunctionSignatureMap($php72_map); - } - if ($target_php_version >= 70100) { - return $php71_map; - } - static $php70_map = []; - if (!$php70_map) { - $php70_map = self::computePHP70FunctionSignatureMap($php71_map); - } - if ($target_php_version >= 70000) { - return $php70_map; - } - - static $php56_map = []; - if (!$php56_map) { - $php56_map = self::computePHP56FunctionSignatureMap($php70_map); - } - return $php56_map; - } - - /** - * @return array<string,string[]> - */ - private static function computeLatestFunctionSignatureMap() : array - { - $map = []; - $map_raw = require(__DIR__ . '/Internal/FunctionSignatureMap.php'); - foreach ($map_raw as $key => $value) { - $map[\strtolower($key)] = $value; - } - return $map; - } - - /** - * @param array<string,array<int|string,string>> $php74_map - * @return array<string,array<int|string,string>> - */ - private static function computePHP80FunctionSignatureMap(array $php74_map) : array - { - $delta_raw = require(__DIR__ . '/Internal/FunctionSignatureMap_php80_delta.php'); - return self::applyDeltaToGetNewerSignatures($php74_map, $delta_raw); - } - - /** - * @param array<string,array<int|string,string>> $php73_map - * @return array<string,array<int|string,string>> - */ - private static function computePHP74FunctionSignatureMap(array $php73_map) : array - { - $delta_raw = require(__DIR__ . '/Internal/FunctionSignatureMap_php74_delta.php'); - return self::applyDeltaToGetNewerSignatures($php73_map, $delta_raw); - } - - /** - * @param array<string,array<int|string,string>> $php73_map - * @return array<string,array<int|string,string>> - */ - private static function computePHP72FunctionSignatureMap(array $php73_map) : array - { - $delta_raw = require(__DIR__ . '/Internal/FunctionSignatureMap_php73_delta.php'); - return self::applyDeltaToGetOlderSignatures($php73_map, $delta_raw); - } - - /** - * @param array<string,array<int|string,string>> $php72_map - * @return array<string,array<int|string,string>> - */ - private static function computePHP71FunctionSignatureMap(array $php72_map) : array - { - $delta_raw = require(__DIR__ . '/Internal/FunctionSignatureMap_php72_delta.php'); - return self::applyDeltaToGetOlderSignatures($php72_map, $delta_raw); - } - - /** - * @param array<string,array<int|string,string>> $php71_map - * @return array<string,array<int|string,string>> - */ - private static function computePHP70FunctionSignatureMap(array $php71_map) : array - { - $delta_raw = require(__DIR__ . '/Internal/FunctionSignatureMap_php71_delta.php'); - return self::applyDeltaToGetOlderSignatures($php71_map, $delta_raw); - } - - /** - * @param array<string,array<int|string,string>> $php70_map - * @return array<string,array<int|string,string>> - */ - private static function computePHP56FunctionSignatureMap(array $php70_map) : array - { - $delta_raw = require(__DIR__ . '/Internal/FunctionSignatureMap_php70_delta.php'); - return self::applyDeltaToGetOlderSignatures($php70_map, $delta_raw); - } - - /** - * @param array<string,array<int|string,string>> $older_map - * @param array{new:array<string,array<int|string,string>>,old:array<string,array<int|string,string>>} $delta - * @return array<string,array<int|string,string>> - * - * @see applyDeltaToGetOlderSignatures - This is doing the exact same thing in reverse. - * @suppress PhanUnreferencedPrivateMethod this will be used again when Phan supports the next PHP minor release - */ - private static function applyDeltaToGetNewerSignatures(array $older_map, array $delta) : array - { - return self::applyDeltaToGetOlderSignatures($older_map, [ - 'old' => $delta['new'], - 'new' => $delta['old'], - ]); - } - - /** - * @param array<string,array<int|string,string>> $newer_map - * @param array{new:array<string,array<int|string,string>>,old:array<string,array<int|string,string>>} $delta - * @return array<string,array<int|string,string>> - */ - private static function applyDeltaToGetOlderSignatures(array $newer_map, array $delta) : array - { - foreach ($delta['new'] as $key => $unused_signature) { - // Would also unset alternates, but that step isn't necessary yet. - unset($newer_map[\strtolower($key)]); - } - foreach ($delta['old'] as $key => $signature) { - // Would also unset alternates, but that step isn't necessary yet. - $newer_map[\strtolower($key)] = $signature; - } - - // Return the newer map after modifying it to become the older map. - return $newer_map; - } - - /** - * @return UnionType - A normalized version of this union type (May or may not be the same object, if no modifications were made) - * - * The following normalization rules apply - * - * 1. If one of the types is null or nullable, convert all types to nullable and remove "null" from the union type - * 2. If both "true" and "false" (possibly nullable) coexist, or either coexists with "bool" (possibly nullable), - * then remove "true" and "false" - */ - public function asNormalizedTypes() : UnionType - { - $type_set = $this->type_set; - if (\count($type_set) <= 1) { - // Optimization: can't simplify if there's only one type - return $this; - } - $flags = 0; - foreach ($type_set as $type) { - $flags |= $type->getNormalizationFlags(); - } - if ($flags === 0) { - // Optimization: nothing to do if no types are null/nullable or booleans - return $this; - } - return self::asNormalizedTypesInner($type_set, $flags); - } - - /** - * @param Type[] $type_set - * @param int $flags non-zero - */ - public static function asNormalizedTypesInner(array $type_set, int $flags) : UnionType - { - $nullable = ($flags & Type::_bit_nullable) !== 0; - $builder = new UnionTypeBuilder($type_set); - if ($nullable) { - if (\count($type_set) > 0) { - foreach ($type_set as $type) { - if (!$type->getIsNullable()) { - $builder->removeType($type); - $builder->addType($type->withIsNullable(true)); - } - } - static $nullable_type = null; - if ($nullable_type === null) { - $nullable_type = NullType::instance(false); - } - $builder->removeType($nullable_type); - } - } - - // If this contains both true and false types, filter out both and add "bool" (or "?bool" for nullable) - if (($flags & Type::_bit_bool_combination) === Type::_bit_bool_combination) { - if ($nullable) { - self::convertToTypeSetWithNormalizedNullableBools($builder); - } else { - self::convertToTypeSetWithNormalizedNonNullableBools($builder); - } - } - // TODO: Convert array|array{} to array? - return $builder->getUnionType(); - } - - /** - * @param UnionType[] $union_types - * @return UnionType union of these UnionTypes - */ - public static function merge(array $union_types) : UnionType - { - $n = \count($union_types); - if ($n < 2) { - return \reset($union_types) ?: UnionType::$empty_instance; - } - $new_type_set = []; - foreach ($union_types as $type) { - $type_set = $type->type_set; - if (\count($type_set) === 0) { - continue; - } - if (\count($new_type_set) === 0) { - $new_type_set = $type_set; - continue; - } - foreach ($type_set as $type) { - if (!\in_array($type, $new_type_set, true)) { - $new_type_set[] = $type; - } - } - } - return UnionType::ofUniqueTypes($new_type_set); - } - - /** - * Must be called after converting nullable to non-nullable. - * Removes false|true types and adds bool - * - * @param UnionTypeBuilder $builder (Containing only non-nullable values) - * @return void - * @var int $bool_id - * @suppress PhanTypeMismatchArgumentNullable false positive in static init - */ - private static function convertToTypeSetWithNormalizedNonNullableBools(UnionTypeBuilder $builder) - { - static $true_type = null; - static $false_type = null; - static $bool_type = null; - if ($bool_type === null) { - $true_type = TrueType::instance(false); - $false_type = FalseType::instance(false); - $bool_type = BoolType::instance(false); - } - if (!$builder->isEmpty()) { - $builder->removeType($true_type); - $builder->removeType($false_type); - } - - $builder->addType($bool_type); - } - - /** - * Must be called after converting all types to null. - * Removes ?false|?true types and adds ?bool - * - * @param UnionTypeBuilder $builder (Containing only non-nullable values) - * @suppress PhanTypeMismatchArgumentNullable false positive in static init - */ - private static function convertToTypeSetWithNormalizedNullableBools(UnionTypeBuilder $builder) - { - static $true_type = null; - static $false_type = null; - static $bool_type = null; - if ($bool_type === null) { - $true_type = TrueType::instance(true); - $false_type = FalseType::instance(true); - $bool_type = BoolType::instance(true); - } - if (!$builder->isEmpty()) { - $builder->removeType($true_type); - $builder->removeType($false_type); - } - - $builder->addType($bool_type); - } - - /** - * Generates a variable length string identifier that uniquely identifies the Type instances in this UnionType. - * `int|string` will generate the same id as `string|int`. - */ - public function generateUniqueId() : string - { - /** @var array<int,int> $ids */ - $ids = []; - foreach ($this->type_set as $type) { - $ids[] = \spl_object_id($type); - } - // Sort the unique identifiers of Type instances so that int|string generates the same id as string|int - \sort($ids); - return \implode(',', $ids); - } - - /** - * Returns true if at least one of the types in this type set is a generic array shape - * E.g. returns true for `array{}|false`, but not for `iterable<int,array{}>|false` - */ - public function hasTopLevelArrayShapeTypeInstances() : bool - { - foreach ($this->type_set as $type) { - if ($type instanceof ArrayShapeType) { - return true; - } - } - return false; - } - - /** - * Returns true if at least one of the types in this type set is not a generic array shape - * E.g. returns true for `array{}|false`, and false for `array{}` - */ - public function hasTopLevelNonArrayShapeTypeInstances() : bool - { - foreach ($this->type_set as $type) { - if (!($type instanceof ArrayShapeType)) { - return true; - } - } - return false; - } - - /** - * Returns true if at least one of the types in this type set contains an array shape. - * TODO: Implement for all types that can contain other types. - * @suppress PhanUnreferencedPublicMethod - */ - public function hasArrayShapeTypeInstances() : bool - { - foreach ($this->type_set as $type) { - if ($type->hasArrayShapeTypeInstances()) { - return true; - } - } - return false; - } - - /** - * Returns true if at least one of the types in this type set contains an array shape or a literal type. - * TODO: Implement for all types that can contain other types. - * - * e.g. returns true for `array<string,2>`, `2`, `array{key:int}`, etc. - * @suppress PhanUnreferencedPublicMethod - */ - public function hasArrayShapeOrLiteralTypeInstances() : bool - { - foreach ($this->type_set as $type) { - if ($type->hasArrayShapeOrLiteralTypeInstances()) { - return true; - } - } - return false; - } - - /** - * @return bool true if at least one of the types in this type set is `mixed` or `?mixed` - */ - public function hasMixedType() : bool - { - foreach ($this->type_set as $type) { - if ($type instanceof MixedType) { - return true; - } - } - return false; - } - - /** - * Flatten literals in keys and values into non-literal types (but not standalone literals) - * E.g. convert array{2:3} to array<int,string> - */ - public function withFlattenedArrayShapeTypeInstances() : UnionType - { - if (!$this->hasArrayShapeTypeInstances()) { - return $this; - } - - $result = new UnionTypeBuilder(); - $has_other_array_type = false; - $empty_array_shape_type = null; - foreach ($this->type_set as $type) { - if ($type->hasArrayShapeTypeInstances()) { - if ($type instanceof ArrayShapeType) { - if (\count($type->getFieldTypes()) === 0) { - $empty_array_shape_type = $type; - continue; - } - } - $has_other_array_type = true; - foreach ($type->withFlattenedArrayShapeOrLiteralTypeInstances() as $type_part) { - $result->addType($type_part); - } - } else { - $result->addType($type); - if ($type instanceof ArrayType) { - $has_other_array_type = true; - } - } - } - if ($empty_array_shape_type && !$has_other_array_type) { - $result->addType(ArrayType::instance($empty_array_shape_type->getIsNullable())); - } - return $result->getUnionType(); - } - - /** - * Flatten literals in keys and values into non-literal types (as well as standalone literals) - * E.g. convert array{2:3} to array<int,string>, 'somestring' to string, etc. - */ - public function withFlattenedArrayShapeOrLiteralTypeInstances() : UnionType - { - if (!$this->hasArrayShapeOrLiteralTypeInstances()) { - return $this; - } - - $result = new UnionTypeBuilder(); - $has_other_array_type = false; - $empty_array_shape_type = null; - foreach ($this->type_set as $type) { - if ($type->hasArrayShapeOrLiteralTypeInstances()) { - if ($type instanceof ArrayShapeType) { - if (\count($type->getFieldTypes()) === 0) { - $empty_array_shape_type = $type; - continue; - } - } - foreach ($type->withFlattenedArrayShapeOrLiteralTypeInstances() as $type_part) { - $result->addType($type_part); - } - } else { - $result->addType($type); - } - if ($type instanceof ArrayType) { - $has_other_array_type = true; - } - } - if ($empty_array_shape_type && !$has_other_array_type) { - $result->addType(ArrayType::instance($empty_array_shape_type->getIsNullable())); - } - return $result->getUnionType(); - } - - /** - * Used to check if any type in this param type should be replaced - * by more specific types of arguments, in non-quick mode - */ - public function shouldBeReplacedBySpecificTypes() : bool - { - if ($this->isEmpty()) { - // We don't know anything about this type, this should be replaced by more specific argument types. - return true; - } - return $this->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type->shouldBeReplacedBySpecificTypes(); - }); - } - - /** - * Removes $field_key from the fields of top-level array shapes of this union type. - * - * @param int|string|float|bool $field_key - */ - public function withoutArrayShapeField($field_key) : UnionType - { - $types = $this->type_set; - foreach ($types as $i => $type) { - if ($type instanceof ArrayShapeType) { - $types[$i] = $type->withoutField($field_key); - } - } - if ($types === $this->type_set) { - return $this; - } - return UnionType::of($types); - } - - /** - * Mark this union type as being possibly undefined. - * This is used for union types of variables and for values of array shapes. - * - * Base implementation. Overridden by AnnotatedUnionType. - */ - public function withIsPossiblyUndefined(bool $is_possibly_undefined) : UnionType - { - if ($is_possibly_undefined === false) { - return $this; - } - $result = new AnnotatedUnionType($this->getTypeSet(), true); - $result->is_possibly_undefined = $is_possibly_undefined; - return $result; - } - - /** - * Base implementation. Overridden by AnnotatedUnionType. - * Used for fields of array shapes. - * - * This is distinct from null - The array shape offset potentially doesn't exist at all, which is different from existing and being null. - */ - public function getIsPossiblyUndefined() : bool - { - return false; - } - - /** - * Returns true if at least one of the types in this union type is a class-like defining the method __toString() - * - * Callers should convert union types to the expanded union types first. - * TODO: is that necessary? - */ - public function hasClassWithToStringMethod(CodeBase $code_base, Context $context) : bool - { - try { - foreach ($this->asClassList($code_base, $context) as $clazz) { - if ($clazz->hasMethodWithName($code_base, "__toString")) { - return true; - } - } - } catch (CodeBaseException $_) { - // Swallow "Cannot find class", go on to emit issue - } - return false; - } - - /** - * Gets the type of this converted to a generator. - * E.g. converts the type of an iterable/array/Generator `$x` - * to the type of a generator with the implementation `yield from $x` - */ - public function asGeneratorTemplateType() : Type - { - $fallback_values = UnionType::empty(); - $fallback_keys = UnionType::empty(); - - foreach ($this->getTypeSet() as $type) { - if ($type->isGenerator()) { - if ($type->hasTemplateParameterTypes()) { - return $type; - } - } - // TODO: support Iterator<T> or Traversable<T> or iterable<T> - if ($type instanceof GenericArrayType) { - $fallback_values = $fallback_values->withType($type->genericArrayElementType()); - $key_type = $type->getKeyType(); - if ($key_type === GenericArrayType::KEY_INT) { - $fallback_keys = $fallback_keys->withType(IntType::instance(false)); - } elseif ($key_type === GenericArrayType::KEY_STRING) { - $fallback_keys = $fallback_keys->withType(StringType::instance(false)); - } - } elseif ($type instanceof ArrayShapeType && $type->isNotEmptyArrayShape()) { - $fallback_values = $fallback_values->withUnionType($type->genericArrayElementUnionType()); - $fallback_keys = $fallback_keys->withUnionType(GenericArrayType::unionTypeForKeyType($type->getKeyType())); - } - } - - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - $result = Type::fromFullyQualifiedString('\Generator'); - if ($fallback_keys->typeCount() > 0 || $fallback_values->typeCount() > 0) { - $template_types = $fallback_keys->typeCount() > 0 ? [$fallback_keys, $fallback_values] : [$fallback_values]; - $result = $result->fromType($result, $template_types); - } - return $result; - } - - /** - * @return Generator<Type,Type> ($outer_type => $inner_type) - * - * This includes classes, StaticType (and "self"), and TemplateType. - * This includes duplicate definitions - * TODO: Warn about Closure Declarations with invalid parameters... - * - * TODO: Use different helper for GoToDefinitionRequest - */ - public function getReferencedClasses() : Generator - { - foreach ($this->withFlattenedArrayShapeOrLiteralTypeInstances()->getTypeSet() as $outer_type) { - foreach ($outer_type->getReferencedClasses() as $type) { - yield $outer_type => $type; - } - } - } - - /** - * @return UnionType the union type of applying the minus operator to an expression with this union type - */ - public function applyUnaryMinusOperator() : UnionType - { - // TODO: Extend to LiteralFloatType - /** @param int|float $value */ - return $this->applyNumericOperation(static function ($value) : ScalarType { - $result = -$value; - if (\is_int($result)) { - return LiteralIntType::instanceForValue($result, false); - } - // -INT_MIN is a float. - return FloatType::instance(false); - }, true); - } - - /** - * @return UnionType the union type of applying the unary bitwise not operator to an expression with this union type - */ - public function applyUnaryBitwiseNotOperator() : UnionType - { - if ($this->isEmpty()) { - return IntType::instance(false)->asUnionType(); - } - $added_fallbacks = false; - $type_set = UnionType::empty(); - foreach ($this->type_set as $type) { - if ($type instanceof LiteralIntType) { - $type_set = $type_set->withType(LiteralIntType::instanceForValue(~$type->getValue(), false)); - if ($type->getIsNullable()) { - $type_set = $type_set->withType(LiteralIntType::instanceForValue(0, false)); - } - } elseif ($type instanceof StringType) { - // Not going to bother being more specific (this applies bitwise not to each character for LiteralStringType) - $type_set = $type_set->withType(StringType::instance(false)); - } else { - if ($added_fallbacks) { - continue; - } - $type_set = $type_set->withType(IntType::instance(false)); - $added_fallbacks = true; - } - } - return $type_set; - } - - /** - * @return UnionType the union type of applying the unary plus operator to an expression with this union type - */ - public function applyUnaryPlusOperator() : UnionType - { - /** @param int|float $value */ - return $this->applyNumericOperation(static function ($value) : ScalarType { - $result = +$value; - if (\is_int($result)) { - return LiteralIntType::instanceForValue($result, false); - } - return FloatType::instance(false); - }, true); - } - - /** - * @param Closure(int|float): ScalarType $operation - */ - private function applyNumericOperation(Closure $operation, bool $can_be_float) : UnionType - { - $added_fallbacks = false; - $type_set = UnionType::empty(); - foreach ($this->type_set as $type) { - if ($type instanceof LiteralIntType) { - $type_set = $type_set->withType($operation($type->getValue())); - if ($type->getIsNullable()) { - $type_set = $type_set->withType(LiteralIntType::instanceForValue(0, false)); - } - } else { - if ($type instanceof LiteralStringType) { - if (\is_numeric($type->getValue())) { - $type_set = $type_set->withType($operation(+$type->getValue())); - if ($type->getIsNullable()) { - $type_set = $type_set->withType(LiteralIntType::instanceForValue(0, false)); - } - continue; - } else { - // TODO: Could warn about non-numeric operand instead - return $type_set->withType(LiteralIntType::instanceForValue(0, false)); - } - } - if ($added_fallbacks) { - continue; - } - if ($can_be_float) { - if (!($type instanceof IntType)) { - $type_set = $type_set->withType(FloatType::instance(false)); - if (!($type instanceof FloatType)) { - $type_set = $type_set->withType(IntType::instance(false)); - } - $added_fallbacks = true; - } else { - $type_set = $type_set->withType(IntType::instance(false)); - // Keep added_fallbacks false in case this needs to add FloatType - } - } else { - $type_set = $type_set->withType(IntType::instance(false)); - $added_fallbacks = true; - } - } - } - return $type_set; - } - - /** - * @return ?string|?float|?int|bool|null - * If this union type can be represented by a single scalar value, - * then this returns that scalar value. - * - * Otherwise, this returns null. - */ - public function asSingleScalarValueOrNull() - { - $type_set = $this->type_set; - if (\count($type_set) !== 1) { - return null; - } - $type = \reset($type_set); - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - switch (\get_class($type)) { - case LiteralIntType::class: - return $type->getIsNullable() ? null : $type->getValue(); - case LiteralStringType::class: - return $type->getIsNullable() ? null : $type->getValue(); - case FalseType::class: - return false; - case TrueType::class: - return true; - // case NullType::class: - default: - return null; - } - } - - /** - * @return ?string|?float|?int|bool|null|?UnionType - * If this union type can be represented by a single scalar value or null, - * then this returns that scalar value. - * - * Otherwise, this returns $this. - */ - public function asSingleScalarValueOrNullOrSelf() - { - $type_set = $this->type_set; - if (\count($type_set) !== 1) { - return $this; - } - $type = \reset($type_set); - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - if ($type->getIsNullable()) { - return $type instanceof NullType ? null : $this; - } - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - switch (\get_class($type)) { - case LiteralIntType::class: - case LiteralStringType::class: - return $type->getValue(); - case FalseType::class: - return false; - case TrueType::class: - return true; - default: - return $this; - } - } - - /** - * @return ?array|?string|?float|?int|bool|null|?UnionType - * If this union type can be represented by a single scalar value or null, - * then this returns that scalar value. - * - * Otherwise, this returns $this. - */ - public function asValueOrNullOrSelf() - { - $type_set = $this->type_set; - if (\count($type_set) !== 1) { - return $this; - } - $type = \reset($type_set); - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - if ($type->getIsNullable()) { - return $type instanceof NullType ? null : $this; - } - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - switch (\get_class($type)) { - case ArrayShapeType::class: - return $type->asArrayLiteralOrNull() ?? $this; - case LiteralIntType::class: - return $type->getValue(); - case LiteralStringType::class: - return $type->getValue(); - case FalseType::class: - return false; - case TrueType::class: - return true; - case NullType::class: - return null; - default: - return $this; - } - } - - /** - * @return array<int,string> - * Returns a list of known strings for LiteralStringType instances in this union type. - * E.g. for `?'foo'|?'bar'|?false|?T`, returns `['foo', 'bar']` - * @suppress PhanUnreferencedPublicMethod provided for plugins - */ - public function asStringScalarValues() : array - { - $result = []; - foreach ($this->type_set as $type) { - if ($type instanceof LiteralStringType) { - $result[] = $type->getValue(); - } - } - return $result; - } - - /** - * @return array<int,int> - * Returns a list of known strings for LiteralStringType instances in this union type. - * E.g. for `?11|?2|?false|?T`, returns `[11, 2]` - * @suppress PhanUnreferencedPublicMethod provided for plugins - */ - public function asIntScalarValues() : array - { - $result = []; - foreach ($this->type_set as $type) { - if ($type instanceof LiteralIntType) { - $result[] = $type->getValue(); - } - } - return $result; - } - - /** - * @return array<int,?int|?bool|?string> - * Returns a list of known scalars that this union type could be. - * E.g. for `?11|?2|?false|?'str'|?T`, returns `[11, 2, false, 'str', null]` - * @suppress PhanUnreferencedPublicMethod provided for plugins - */ - public function asScalarValues() : array - { - $result = []; - $has_null = false; - $has_false = false; - $has_true = false; - foreach ($this->type_set as $type) { - if ($type->getIsNullable()) { - $has_null = true; - } - switch (\get_class($type)) { - case LiteralIntType::class: - case LiteralStringType::class: - $result[] = $type->getValue(); - break; - case FalseType::class: - $has_false = true; - break; - case TrueType::class: - $has_true = true; - break; - case BoolType::class: - $has_true = true; - $has_false = true; - break; - case NullType::class: - $has_null = true; - break; - } - } - if ($has_null) { - $result[] = null; - } - if ($has_false) { - $result[] = false; - } - if ($has_true) { - $result[] = true; - } - return $result; - } - - /** - * Returns true if this contains a type that is definitely nullable or a non-object. - * e.g. returns true for ?T, T|false, T|array - * returns false for T|callable, object, T|iterable, etc. - */ - public function containsDefiniteNonObjectType() : bool - { - foreach ($this->type_set as $type) { - if ($type->getIsNullable() || $type->isDefiniteNonObjectType()) { - return true; - } - } - return false; - } - - /** - * Returns true if this contains a type that is definitely nullable or a non-object/non-string. - * e.g. returns true for ?T, T|false, T|array - * returns false for T|callable, object, T|iterable, etc. - */ - public function containsDefiniteNonObjectAndNonClassType() : bool - { - foreach ($this->type_set as $type) { - if ($type->getIsNullable() || ($type->isDefiniteNonObjectType() && !$type instanceof StringType)) { - return true; - } - } - return false; - } - - /** - * Returns true if at least one type in this union type definitely can't be cast to `callable` - */ - public function containsDefiniteNonCallableType() : bool - { - foreach ($this->type_set as $type) { - if ($type->getIsNullable() || $type->isDefiniteNonCallableType()) { - return true; - } - } - return false; - } - - /** - * Returns true if either (1) this is the empty type, or (2) at least one type in this union type can't be ruled out as being callable. - */ - public function hasPossiblyCallableType() : bool - { - foreach ($this->type_set as $type) { - if (!$type->isDefiniteNonCallableType()) { - return true; - } - } - return \count($this->type_set) === 0; - } - - /** - * Returns the union type resulting from applying the `++`/`--` operator to an expression with union type. - */ - public function getTypeAfterIncOrDec() : UnionType - { - $result = UnionType::empty(); - foreach ($this->type_set as $type) { - $result = $result->withUnionType($type->getTypeAfterIncOrDec()); - } - return $result; - } - - /** - * @param TemplateType $template_type the template type that this union type is being searched for - * - * @return ?Closure(UnionType, Context):UnionType a closure to map types to the template type wherever it was in the original union type - */ - public function getTemplateTypeExtractorClosure(CodeBase $code_base, TemplateType $template_type) - { - $closure = null; - foreach ($this->type_set as $type) { - $closure = TemplateType::combineParameterClosures( - $closure, - $type->getTemplateTypeExtractorClosure($code_base, $template_type) - ); - } - return $closure; - } - - /** - * Returns true if this references $template_type in any way - */ - public function usesTemplateType(TemplateType $template_type) : bool - { - $new_union_type = $this->withTemplateParameterTypeMap([ - $template_type->getName() => UnionType::fromFullyQualifiedString('mixed'), - ]); - return !$this->isEqualTo($new_union_type); - } -} - -UnionType::init(); diff --git a/vendor/phan/phan/src/Phan/Language/UnionTypeBuilder.php b/vendor/phan/phan/src/Phan/Language/UnionTypeBuilder.php deleted file mode 100644 index e69ce78..0000000 --- a/vendor/phan/phan/src/Phan/Language/UnionTypeBuilder.php +++ /dev/null @@ -1,88 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Language; - -/** - * Utilities to build a union type. - * Mostly used internally when the number of types in the resulting union type may be large. - * - * @see UnionType::withType() - * @see UnionType::withoutType() - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -final class UnionTypeBuilder -{ - /** @var array<int,Type> the list of unique types in this builder instance. */ - private $type_set; - - /** @param array<int,Type> $type_set (must be unique) */ - public function __construct(array $type_set = []) - { - $this->type_set = $type_set; - } - - /** - * @return void - */ - public function addType(Type $type) - { - if (\in_array($type, $this->type_set, true)) { - return; - } - $this->type_set[] = $type; - } - - /** - * @return void - */ - public function addUnionType(UnionType $union_type) - { - $old_type_set = $this->type_set; - foreach ($union_type->getTypeSet() as $type) { - if (!\in_array($type, $old_type_set, true)) { - $this->type_set[] = $type; - } - } - } - - /** - * @return void - */ - public function removeType(Type $type) - { - $i = \array_search($type, $this->type_set, true); - if ($i !== false) { - // equivalent to unset($new_type_set[$i]) but fills in the gap in array keys. - // TODO: How do other ways of unsetting the type affect performance on large projects? - $replacement_type = \array_pop($this->type_set); - if ($replacement_type !== $type) { - // @phan-suppress-next-line PhanPartialTypeMismatchProperty $replacement_type is guaranteed to not be false - $this->type_set[$i] = $replacement_type; - } - } - } - - /** - * Checks if this currently contains an empty list of types - */ - public function isEmpty() : bool - { - return \count($this->type_set) === 0; - } - - /** - * @return array<int,Type> - */ - public function getTypeSet() : array - { - return $this->type_set; - } - - /** - * Build and return the UnionType for the unique type set that this was building. - */ - public function getUnionType() : UnionType - { - return UnionType::of($this->type_set); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Client/TextDocument.php b/vendor/phan/phan/src/Phan/LanguageServer/Client/TextDocument.php deleted file mode 100644 index 68ccbf3..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Client/TextDocument.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Client; - -use Phan\LanguageServer\ClientHandler; -use Phan\LanguageServer\Protocol\Diagnostic; -use Sabre\Event\Promise; - -/** - * Provides method handlers for all textDocument/* methods - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/TextDocument.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class TextDocument -{ - /** - * Used to send `textDocument/*` notifications and requests to the language server client of the Phan Language Server. - * - * @var ClientHandler - */ - private $handler; - - public function __construct(ClientHandler $handler) - { - $this->handler = $handler; - } - - /** - * Diagnostics notification are sent from the server to the client to signal results of validation runs. - * - * @param string $uri - * @param Diagnostic[] $diagnostics - * @return Promise <void> - */ - public function publishDiagnostics(string $uri, array $diagnostics): Promise - { - return $this->handler->notify('textDocument/publishDiagnostics', [ - 'uri' => $uri, - 'diagnostics' => $diagnostics - ]); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/ClientHandler.php b/vendor/phan/phan/src/Phan/LanguageServer/ClientHandler.php deleted file mode 100644 index c611c3e..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/ClientHandler.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer; - -use AdvancedJsonRpc; -use Sabre\Event\Promise; - -/** - * Used to send notifications and requests to the language server client of the Phan Language Server. - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/ClientHandler.php - * See ../../../LICENSE.LANGUAGE_SERVER - */ -class ClientHandler -{ - /** - * @var ProtocolReader used to read notifications, requests, and responses from the LSP client - */ - public $protocolReader; - - /** - * @var ProtocolWriter used to send notifications, requests, and responses to the LSP client - */ - public $protocolWriter; - - /** - * @var IdGenerator used to generate ids when sending requests to the client. - */ - 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 - * - * @suppress PhanUnreferencedPublicMethod may be used as LSP support improves? - */ - public function request(string $method, $params): Promise - { - $id = $this->idGenerator->generate(); - return $this->protocolWriter->write( - new Protocol\Message( - new AdvancedJsonRpc\Request($id, $method, (object)$params) - ) - )->then(function () use ($id) : Promise { - $promise = new Promise(); - /** - * @suppress PhanUndeclaredProperty taken care of by isResponse checks on msg->body - */ - $listener = function (Protocol\Message $msg) use ($id, $promise, &$listener) { - $body = $msg->body; - if (!$body) { - return; - } - if (AdvancedJsonRpc\Response::isResponse($body) && $body->id === $id) { - // Received a response - $this->protocolReader->removeListener('message', $listener); - if (AdvancedJsonRpc\SuccessResponse::isSuccessResponse($body)) { - $promise->fulfill($msg->body->result); - } else { - $promise->reject($msg->body->error); - } - } - }; - $this->protocolReader->on('message', $listener); - return $promise; - }); - } - - /** - * Sends a notification to the client - * - * @param string $method The method to call - * @param array|object $params The method parameters - * @return Promise <null> Will be resolved as soon as the notification has been sent - */ - public function notify(string $method, $params): Promise - { - return $this->protocolWriter->write( - new Protocol\Message( - new AdvancedJsonRpc\Notification($method, (object)$params) - ) - ); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/CompletionRequest.php b/vendor/phan/phan/src/Phan/LanguageServer/CompletionRequest.php deleted file mode 100644 index 53e51fe..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/CompletionRequest.php +++ /dev/null @@ -1,214 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\LanguageServer; - -use Exception; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Element\ClassConstant; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\GlobalConstant; -use Phan\Language\Element\Method; -use Phan\Language\Element\Property; -use Phan\Language\Element\TypedElementInterface; -use Phan\Language\Element\Variable; -use Phan\LanguageServer\Protocol\CompletionContext; -use Phan\LanguageServer\Protocol\CompletionItem; -use Phan\LanguageServer\Protocol\CompletionItemKind; -use Phan\LanguageServer\Protocol\CompletionList; -use Phan\LanguageServer\Protocol\Position; - -use function is_array; -use function is_string; -use function strlen; - -/** - * Represents the Language Server Protocol's "Completion" request for an element - * (property, method, class constant, etc.) - * - * @see https://microsoft.github.io/language-server-protocol/specification#textDocument_completion - * - * @see CompletionResolver for how this maps the found node to the type in the context. - * @see \Phan\Plugin\Internal\NodeSelectionPlugin for how the node is found - * @see \Phan\AST\TolerantASTConverter\TolerantASTConverterWithNodeMapping for how isSelected is set - * - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -final class CompletionRequest extends NodeInfoRequest -{ - /** - * @var array<string,CompletionItem> the list of completion items. - */ - private $completions = []; - - /** - * Construct a CompletionRequest from the parameters provided by the language server client. - * - * @suppress PhanUnusedPublicFinalMethodParameter - */ - public function __construct( - string $uri, - Position $position, - CompletionContext $completion_context = null - ) { - parent::__construct($uri, $position); - } - - /** - * @param ?CompletionItem|?array<int,CompletionItem>|array<string,mixed> $completions - * @return void - * @suppress PhanPartialTypeMismatchArgument this accepts multiple types of arrays - */ - public function recordCompletionList($completions) - { - if ($completions instanceof CompletionItem || isset($completions['label'])) { - $completions = [$completions]; - } - foreach ($completions ?? [] as $completion) { - if (is_array($completion)) { - $completion = CompletionItem::fromArray($completion); - } - $this->recordCompletionItem($completion); - } - } - - /** - * Records the definition of an element that can be used for a code completion - * - * @param CodeBase $code_base used for resolving type location in "Completion" - * @param ClassConstant|Clazz|Func|GlobalConstant|Method|Property|Variable $element - * @return void - */ - public function recordCompletionElement( - CodeBase $code_base, - TypedElementInterface $element, - string $prefix = null - ) { - $item = $this->createCompletionItem($code_base, $element, $prefix); - $this->recordCompletionItem($item); - } - - private function recordCompletionItem(CompletionItem $item) - { - $this->completions[$item->label . ':' . $item->kind] = $item; - } - - private function createCompletionItem( - CodeBase $unused_code_base, - TypedElementInterface $element, - string $prefix = null - ) : CompletionItem { - $item = new CompletionItem(); - $item->label = $this->labelForElement($element); - $item->kind = $this->kindForElement($element); - $item->detail = (string)$element->getUnionType() ?: 'mixed'; // TODO: Better summary - $item->documentation = null; // TODO: Better summary, use phpdoc summary - - $insert_text = null; - if (!self::useVSCodeCompletion()) { - if ($element instanceof Property && $element->isStatic()) { - $insert_text = '$' . $element->getName(); - } - if (is_string($prefix) && is_string($insert_text) && \strncmp($insert_text, $prefix, strlen($prefix)) === 0) { - $insert_text = (string)\substr($insert_text, strlen($prefix)); - } - } - $item->insertText = $insert_text; - - return $item; - } - - /** - * If true, then return completion suggestions that are compatible with VS Code. - */ - public static function useVSCodeCompletion() : bool - { - return Config::COMPLETION_VSCODE === Config::getValue('language_server_enable_completion'); - } - - private function labelForElement(TypedElementInterface $element) : string - { - if (self::useVSCodeCompletion()) { - $name = $element->getName(); - if ($element instanceof Variable) { - return '$' . $name; - } - if ($element instanceof Property && $element->isStatic()) { - return '$' . $name; - } - return $name; - } - return $element->getName(); - } - - /** - * @return ?int - */ - private function kindForElement(TypedElementInterface $element) - { - if ($element instanceof ClassConstant) { - return CompletionItemKind::VARIABLE; - } elseif ($element instanceof Clazz) { - return CompletionItemKind::CLASS_; - } elseif ($element instanceof Func) { - return CompletionItemKind::FUNCTION; - } elseif ($element instanceof GlobalConstant) { - return CompletionItemKind::VARIABLE; - } elseif ($element instanceof Method) { - return CompletionItemKind::METHOD; - } elseif ($element instanceof Property) { - return CompletionItemKind::PROPERTY; - } elseif ($element instanceof Variable) { - return CompletionItemKind::VARIABLE; - } - // TODO: Implement - return null; - } - - /** - * @return array<int,CompletionItem> - */ - public function getCompletions() : array - { - return \array_values($this->completions); - } - - public function finalize() - { - if ($this->fulfilled) { - return; - } - $this->fulfilled = true; - $result = $this->completions ?: null; - if ($result !== null) { - // Sort completion suggestions alphabetically, - // ignoring the leading `$` in variables/static properties. - \uksort( - $result, - /** - * @param string $a - * @param string $b - */ - static function ($a, $b) : int { - $a = \ltrim((string)$a, '$'); - $b = \ltrim((string)$b, '$'); - return (\strtolower($a) <=> \strtolower($b)) ?: ($a <=> $b); - } - ); - $result_list = new CompletionList(\array_values($result)); - } else { - $result_list = null; - } - $this->promise->fulfill($result_list); - } - - public function __destruct() - { - if ($this->fulfilled) { - return; - } - $this->fulfilled = true; - $this->promise->reject(new Exception('Failed to send a valid textDocument/definition result')); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/CompletionResolver.php b/vendor/phan/phan/src/Phan/LanguageServer/CompletionResolver.php deleted file mode 100644 index d43e81c..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/CompletionResolver.php +++ /dev/null @@ -1,400 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\LanguageServer; - -use ast; -use ast\Node; -use Closure; -use Phan\AST\ContextNode; -use Phan\AST\TolerantASTConverter\TolerantASTConverter; -use Phan\CodeBase; -use Phan\Config; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Func; -use Phan\Language\Element\GlobalConstant; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use function is_string; - -/** - * This implements closures for finding completions for valid/invalid nodes where isSelected is set - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class CompletionResolver -{ - /** - * @return Closure(Context,Node, array<int,Node>):void - * NOTE: The helper methods distinguish between "Go to definition" - * and "go to type definition" in their implementations, - * based on $request->getIsTypeDefinitionRequest() - */ - public static function createCompletionClosure(CompletionRequest $request, CodeBase $code_base) - { - // TODO: Could use the parent node list - // (e.g. don't use a method with a void return as an argument to another function) - /** - * @param array<int,Node> $unused_parent_node_list - */ - return static function (Context $context, Node $node, array $unused_parent_node_list) use ($request, $code_base) { - // @phan-suppress-next-line PhanUndeclaredProperty this is overridden - $selected_fragment = $node->selectedFragment ?? null; - if (is_string($selected_fragment)) { - // We don't support completions in code comments - return; - } - // TODO: Better way to be absolutely sure this $node is in the same requested file path? - // I think it's possible that we'll have more than one Node to check against (with simplify_ast) - - - // $location = new Location($go_to_definition_request->getUri(), $node->lineno); - - // Log as strings in case TolerantASTConverter generates the wrong type - Logger::logInfo(\sprintf("Saw a node of kind %s at line %s", (string)$node->kind, (string)$node->lineno)); - - $kind = $node->kind; - - switch ($kind) { - case ast\AST_STATIC_PROP: - case ast\AST_PROP: - // fwrite(STDERR, \Phan\Debug::nodeToString($node)); - $prop_name = $node->children['prop']; - if ($prop_name === TolerantASTConverter::INCOMPLETE_PROPERTY) { - $prop_name = ''; - } - self::locatePropertyCompletion( - $request, - $code_base, - $context, - $node, - $kind === ast\AST_STATIC_PROP, - $prop_name - ); - if ($kind === ast\AST_PROP) { - self::locateMethodCompletion( - $request, - $code_base, - $context, - $node, - false, - $prop_name - ); - } - return; - case ast\AST_CLASS_CONST: - $const_name = $node->children['const']; - if ($const_name === TolerantASTConverter::INCOMPLETE_CLASS_CONST) { - $const_name = ''; - self::locatePropertyCompletion($request, $code_base, $context, $node, true, ''); - } - self::locateClassConstantCompletion($request, $code_base, $context, $node, $const_name); - self::locateMethodCompletion($request, $code_base, $context, $node, true, $const_name); - return; - case ast\AST_CONST: - $const_name = $node->children['name']->children['name'] ?? null; - if (!is_string($const_name)) { - return; - } - self::locateGlobalConstantCompletion($request, $code_base, $context, $node, $const_name); - self::locateClassCompletion($request, $code_base, $context, $node, $const_name); - self::locateGlobalFunctionCompletion($request, $code_base, $context, $node, $const_name); - return; - case ast\AST_VAR: - $var_name = $node->children['name']; - if (!is_string($var_name)) { - return; - } - if ($var_name === TolerantASTConverter::INCOMPLETE_VARIABLE) { - $var_name = ''; - } - self::locateVariableCompletion($request, $code_base, $context, $var_name); - return; - } - // $go_to_definition_request->recordDefinitionLocation(...) - }; - } - - /** - * @param string|mixed $incomplete_prop_name - * @return void - */ - public static function locatePropertyCompletion( - CompletionRequest $request, - CodeBase $code_base, - Context $context, - Node $node, - bool $is_static, - $incomplete_prop_name - ) { - if (!is_string($incomplete_prop_name)) { - return; - } - - // Find all of the classes on the left-hand side - // TODO: Filter by properties that match $node->children['prop'] - $expected_type_categories = $is_static ? ContextNode::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME : ContextNode::CLASS_LIST_ACCEPT_OBJECT; - $expected_issue = $is_static ? Issue::TypeExpectedObjectStaticPropAccess : Issue::TypeExpectedObjectPropAccess; - - $class_list_generator = (new ContextNode( - $code_base, - $context, - $node->children['class'] ?? $node->children['expr'] - ))->getClassList(true, $expected_type_categories, $expected_issue); - - - // And find all of the instance/static properties that can be used as completions - foreach ($class_list_generator as $class) { - // @phan-suppress-next-line PhanAccessMethodInternal - $visible_properties = IssueFixSuggester::filterSimilarProperties($code_base, $context, $class->getPropertyMap($code_base), $is_static); - - foreach ($visible_properties as $prop) { - // fprintf(STDERR, "Looking for %s in '%s'\n", $prop->getName(), $incomplete_prop_name); - if ($incomplete_prop_name !== '' && \stripos($prop->getName(), $incomplete_prop_name) === false) { - continue; - } - // fprintf(STDERR, "Adding %s", $prop->getName()); - - // A prefix for the prefix to remove from the completion element - $prefixPrefix = $is_static ? '$' : ''; - $request->recordCompletionElement($code_base, $prop, $prefixPrefix . $incomplete_prop_name); - } - } - } - - /** - * @param string|mixed $constant_name - */ - private static function locateClassConstantCompletion( - CompletionRequest $request, - CodeBase $code_base, - Context $context, - Node $node, - $constant_name - ) { - if (!is_string($constant_name)) { - return; - } - - $class_node = $node->children['class'] ?? $node->children['expr']; - $is_static = $class_node->kind === ast\AST_NAME; - - // Find all of the classes on the left-hand side - // TODO: Filter by properties that match $node->children['prop'] - $class_list_generator = (new ContextNode( - $code_base, - $context, - $class_node - ))->getClassList( - true, - ContextNode::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME - ); - - // And find all of the instance/static properties that can be used as completions - foreach ($class_list_generator as $class) { - // @phan-suppress-next-line PhanAccessMethodInternal - $visible_constant_map = IssueFixSuggester::filterSimilarConstants( - $code_base, - $context, - $class->getConstantMap($code_base) - ); - foreach ($visible_constant_map as $name => $constant) { - if (!$is_static && \strcasecmp($name, 'class') === 0) { - // Dynamic class names are not allowed in compile-time ::class fetch, it's a fatal error - continue; - } - // TODO: What about ::class? (Exclude it for not static?) - // TODO: Check if visible, the same way as the suggestion utility would - $request->recordCompletionElement($code_base, $constant, $name); - } - } - } - - /** - * @param string|mixed $incomplete_method_name - */ - private static function locateMethodCompletion( - CompletionRequest $request, - CodeBase $code_base, - Context $context, - Node $node, - bool $is_static, - $incomplete_method_name - ) { - if (!is_string($incomplete_method_name)) { - return; - } - - // Find all of the classes on the left-hand side - // TODO: Filter by properties that match $node->children['prop'] - $class_list_generator = (new ContextNode( - $code_base, - $context, - $node->children['class'] ?? $node->children['expr'] - ))->getClassList( - true, - ContextNode::CLASS_LIST_ACCEPT_OBJECT_OR_CLASS_NAME - ); - - // And find all of the instance/static properties that can be used as completions - foreach ($class_list_generator as $class) { - $methods = $class->getMethodMap($code_base); - // @phan-suppress-next-line PhanAccessMethodInternal - $filtered_methods = IssueFixSuggester::filterSimilarMethods($code_base, $context, $methods, $is_static); - foreach ($filtered_methods as $method) { - if ($incomplete_method_name !== '' && \stripos($method->getName(), $incomplete_method_name) === false) { - // Skip suggestions that don't have the original method as a substring - continue; - } - $request->recordCompletionElement($code_base, $method, $method->getName()); - } - } - } - - /** - * @param string $incomplete_constant_name - * @suppress PhanUnusedPrivateMethodParameter - */ - private static function locateGlobalConstantCompletion( - CompletionRequest $request, - CodeBase $code_base, - Context $context, - Node $node, - string $incomplete_constant_name - ) { - // TODO: Limit this check to constants that are visible from the current namespace, with the shortest name from the alias map - // TODO: Use the alias map - $current_namespace = \ltrim($context->getNamespace(), "\\"); - - foreach ($code_base->getGlobalConstantMap() as $constant) { - if (!$constant instanceof GlobalConstant) { - // TODO: Make Map templatized, this is impossible - continue; - } - $namespace = \ltrim($constant->getFQSEN()->getNamespace(), "\\"); - if ($namespace !== '' && \strcasecmp($namespace, $current_namespace) !== 0) { - // Only allow accessing global constants in the same namespace or the global namespace - continue; - } - $fqsen_string = (string)$constant->getFQSEN(); - if ($incomplete_constant_name !== '' && \stripos($fqsen_string, $incomplete_constant_name) === false) { - continue; - } - $request->recordCompletionElement($code_base, $constant, $fqsen_string); - } - } - - /** - * @suppress PhanUnusedPrivateMethodParameter TODO: Use $node and check if fully qualified - */ - private static function locateClassCompletion( - CompletionRequest $request, - CodeBase $code_base, - Context $context, - Node $node, - string $incomplete_class_name - ) { - // TODO: Use the alias map - // TODO: Remove the namespace - // fwrite(STDERR, "Looking up classes in " . $context->getNamespace() . "\n"); - // Only check class names in the same namespace - $class_names_in_namespace = $code_base->getClassNamesOfNamespace($context->getNamespace()); - - foreach ($class_names_in_namespace as $class_name) { - $class_name = \ltrim($class_name, "\\"); - // fwrite(STDERR, "Checking $class_name\n"); - if (\stripos($class_name, $incomplete_class_name) === false) { - continue; - } - // @phan-suppress-next-line PhanThrowTypeAbsentForCall should be impossible if found in codebase - $class_fqsen = FullyQualifiedClassName::fromFullyQualifiedString($class_name); - // Call hasClassWithFQSEN to trigger loading the class as a side effect - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - continue; - } - $request->recordCompletionElement( - $code_base, - $code_base->getClassByFQSEN($class_fqsen), - $class_name - ); - } - } - - /** - * @suppress PhanUnusedPrivateMethodParameter TODO: Use $node and check if fully qualified - */ - private static function locateGlobalFunctionCompletion( - CompletionRequest $request, - CodeBase $code_base, - Context $context, - Node $node, - string $incomplete_function_name - ) { - // TODO: Include FQSENs which have a namespace matching what was typed so far - $current_namespace = \ltrim($context->getNamespace(), "\\"); - - // TODO: Use the alias map - // TODO: Remove the namespace - foreach ($code_base->getFunctionMap() as $func) { - if (!$func instanceof Func) { - // TODO: Make Map templatized, this is impossible - continue; - } - $fqsen = $func->getFQSEN(); - $namespace = \ltrim($fqsen->getNamespace(), "\\"); - if ($namespace !== '' && \strcasecmp($namespace, $current_namespace) !== 0) { - // Only allow accessing global functions in the same namespace or the global namespace - continue; - } - $function_name = $fqsen->getName(); - if ($incomplete_function_name !== '' && \stripos($function_name, $incomplete_function_name) === false) { - continue; - } - $request->recordCompletionElement( - $code_base, - $func, - $function_name - ); - } - } - - private static function locateVariableCompletion( - CompletionRequest $request, - CodeBase $code_base, - Context $context, - string $incomplete_variable_name - ) { - $variable_candidates = $context->getScope()->getVariableMap(); - $prefix = CompletionRequest::useVSCodeCompletion() ? '$' : ''; - // TODO: Use the alias map - // TODO: Remove the namespace - foreach ($variable_candidates as $suggested_variable_name => $variable) { - $suggested_variable_name = (string)$suggested_variable_name; - if ($incomplete_variable_name !== '' && \stripos($suggested_variable_name, $incomplete_variable_name) === false) { - continue; - } - $request->recordCompletionElement( - $code_base, - $variable, - $prefix . $incomplete_variable_name - ); - } - $superglobal_names = \array_merge(\array_keys(Variable::_BUILTIN_SUPERGLOBAL_TYPES), Config::getValue('runkit_superglobals')); - foreach ($superglobal_names as $superglobal_name) { - if ($incomplete_variable_name !== '' && \stripos($superglobal_name, $incomplete_variable_name) === false) { - continue; - } - $request->recordCompletionElement( - $code_base, - new Variable( - $context, - $superglobal_name, - // @phan-suppress-next-line PhanTypeMismatchArgumentNullable - Variable::getUnionTypeOfHardcodedGlobalVariableWithName($superglobal_name), - 0 - ), - $prefix . $incomplete_variable_name - ); - } - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/DefinitionResolver.php b/vendor/phan/phan/src/Phan/LanguageServer/DefinitionResolver.php deleted file mode 100644 index 216d61a..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/DefinitionResolver.php +++ /dev/null @@ -1,473 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\LanguageServer; - -use AssertionError; -use ast; -use ast\Node; -use Closure; -use Exception; -use Phan\Analysis\ScopeVisitor; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Exception\CodeBaseException; -use Phan\Exception\FQSENException; -use Phan\Exception\IssueException; -use Phan\Exception\NodeException; -use Phan\Language\Context; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedGlobalConstantName; -use Phan\Language\Type; -use Phan\Language\UnionType; - -use function count; -use function is_string; - -/** - * This implements closures for finding definitions for nodes where isSelected is set - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class DefinitionResolver -{ - /** - * @return Closure(Context,Node,array<int,Node>):void - * NOTE: The helper methods distinguish between "Go to definition" - * and "go to type definition" in their implementations, - * based on $request->getIsTypeDefinitionRequest() - */ - public static function createGoToDefinitionClosure(GoToDefinitionRequest $request, CodeBase $code_base) - { - /** - * @param array<int,Node> $parent_node_list - */ - return static function (Context $context, Node $node, array $parent_node_list = []) use ($request, $code_base) { - // @phan-suppress-next-line PhanUndeclaredProperty this is overridden - $selected_fragment = $node->selectedFragment ?? null; - if (is_string($selected_fragment)) { - self::locateCommentDefinition($request, $code_base, $context, $selected_fragment); - return; - } - - $parent_node = \end($parent_node_list); - if ($parent_node instanceof Node) { - if ($node->kind === ast\AST_NAME && $parent_node->kind === ast\AST_NEW) { - $node = $parent_node; - } - } - // TODO: Better way to be absolutely sure this $node is in the same requested file path? - // I think it's possible that we'll have more than one Node to check against (with simplify_ast) - - - // $location = new Location($go_to_definition_request->getUri(), $node->lineno); - - // Log as strings in case TolerantASTConverter generates the wrong type - Logger::logInfo(\sprintf("Saw a node of kind %s at line %s", (string)$node->kind, (string)$node->lineno)); - - switch ($node->kind) { - case ast\AST_NAME: - self::locateClassDefinition($request, $code_base, $context, $node); - return; - case ast\AST_STATIC_PROP: - case ast\AST_PROP: - self::locatePropDefinition($request, $code_base, $context, $node); - return; - case ast\AST_STATIC_CALL: - case ast\AST_METHOD_CALL: - self::locateMethodDefinition($request, $code_base, $context, $node); - return; - case ast\AST_NEW: - self::locateNewDefinition($request, $code_base, $context, $node); - return; - case ast\AST_CALL: - self::locateFuncDefinition($request, $code_base, $context, $node); - return; - case ast\AST_CLASS_CONST: - self::locateClassConstDefinition($request, $code_base, $context, $node); - return; - case ast\AST_CONST: - self::locateGlobalConstDefinition($request, $code_base, $context, $node); - return; - case ast\AST_VAR: - // NOTE: Only implemented for "go to type definition" and "hover" right now. - // TODO: Add simple heuristics to check for assignments and references within the function/global scope? - self::locateVariableDefinition($request, $code_base, $context, $node); - return; - case ast\AST_USE: - self::locateNamespaceUseDefinition($request, $code_base, $node); - return; - } - // $go_to_definition_request->recordDefinitionLocation(...) - }; - } - - /** - * Locate an element from a fragment seen in a comment or string - * - * This can currently refer to - * - * 1. a class - * 2. a global function - * 3. a global constant - * - * Other types (e.g. class constants) aren't supported yet. - */ - private static function locateCommentDefinition( - GoToDefinitionRequest $request, - CodeBase $code_base, - Context $context, - string $selected_fragment - ) { - // fprintf(STDERR, "locateCommentDefinition called for %s\n", $selected_fragment); - if (self::locateClassDefinitionFromComment($request, $code_base, $context, $selected_fragment)) { - return; - } - if (self::locateGlobalFunctionDefinitionFromComment($request, $code_base, $context, $selected_fragment)) { - return; - } - if (self::locateGlobalConstantDefinitionFromComment($request, $code_base, $context, $selected_fragment)) { - return; - } - } - - private static function locateClassDefinitionFromComment( - GoToDefinitionRequest $request, - CodeBase $code_base, - Context $context, - string $selected_fragment - ) : bool { - // TODO: Handle method references in doc comments, global functions, etc. - try { - $union_type = UnionType::fromStringInContext($selected_fragment, $context, Type::FROM_PHPDOC); - } catch (Exception $_) { - // fprintf(STDERR, "Unexpected error in " . __METHOD__ . ": " . $_->getMessage() . "\n"); - return false; - } - if ($union_type->isEmpty()) { - return false; - } - // This is the name of a class - return self::locateClassDefinitionForUnionType($request, $code_base, $union_type); - } - - private static function locateGlobalFunctionDefinitionFromComment( - GoToDefinitionRequest $request, - CodeBase $code_base, - Context $context, - string $selected_fragment - ) : bool { - // TODO: Handle method references in doc comments, global functions, etc. - try { - $fqsen = FullyQualifiedFunctionName::make('', $selected_fragment); - } catch (Exception $_) { - return false; - } - // fwrite(STDERR, "Looking up function with fqsen $fqsen\n"); - if (!$code_base->hasFunctionWithFQSEN($fqsen)) { - if (\substr($selected_fragment, 0, 1) !== '\\') { - try { - $fqsen = FullyQualifiedFunctionName::make($context->getNamespace(), $selected_fragment); - } catch (Exception $_) { - return false; - } - } - if (!$code_base->hasFunctionWithFQSEN($fqsen)) { - return false; - } - } - $request->recordDefinitionElement($code_base, $code_base->getFunctionByFQSEN($fqsen), true); - return true; - } - - private static function locateGlobalConstantDefinitionFromComment( - GoToDefinitionRequest $request, - CodeBase $code_base, - Context $context, - string $selected_fragment - ) : bool { - // TODO: Handle method references in doc comments, global functions, etc. - try { - $fqsen = FullyQualifiedGlobalConstantName::make('', $selected_fragment); - } catch (Exception $_) { - return false; - } - // fwrite(STDERR, "Looking up function with fqsen $fqsen\n"); - if (!$code_base->hasGlobalConstantWithFQSEN($fqsen)) { - if (\substr($selected_fragment, 0, 1) !== '\\') { - try { - $fqsen = FullyQualifiedGlobalConstantName::make($context->getNamespace(), $selected_fragment); - } catch (Exception $_) { - return false; - } - } - if (!$code_base->hasGlobalConstantWithFQSEN($fqsen)) { - return false; - } - } - $request->recordDefinitionElement($code_base, $code_base->getGlobalConstantByFQSEN($fqsen), true); - return true; - } - - /** - * Record information about this definition, to send back to the language client after all possible definitions were found. - * - * @return void - */ - public static function locateClassDefinition( - GoToDefinitionRequest $request, - CodeBase $code_base, - Context $context, - Node $node - ) { - try { - $union_type = UnionTypeVisitor::unionTypeFromClassNode($code_base, $context, $node); - } catch (FQSENException $_) { - // Hopefully warn elsewhere - return; - } - self::locateClassDefinitionForUnionType($request, $code_base, $union_type); - } - - private static function locateClassDefinitionForUnionType( - GoToDefinitionRequest $request, - CodeBase $code_base, - UnionType $union_type - ) : bool { - $found = false; - foreach ($union_type->getTypeSet() as $type) { - if ($type->isNativeType()) { - continue; - } - $class_fqsen = FullyQualifiedClassName::fromType($type); - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - continue; - } - $class = $code_base->getClassByFQSEN($class_fqsen); - // Note: Does the same thing (Return the class) - // both for "Go To Definition" and "Go To Type Definition" - $request->recordDefinitionElement($code_base, $class, false); - $found = true; - } - return $found; - } - - /** - * @return void - */ - public static function locatePropDefinition(GoToDefinitionRequest $request, CodeBase $code_base, Context $context, Node $node) - { - $is_static = $node->kind === ast\AST_STATIC_PROP; - try { - $property = (new ContextNode($code_base, $context, $node))->getProperty($is_static); - } catch (NodeException $_) { - return; // ignore - } catch (IssueException $_) { - return; // ignore - } catch (CodeBaseException $_) { - return; // ignore - } - $request->recordDefinitionElement($code_base, $property, true); - } - - /** - * @param Node $node a node of type AST_CLASS_CONST - * @return void - */ - public static function locateClassConstDefinition(GoToDefinitionRequest $request, CodeBase $code_base, Context $context, Node $node) - { - $name = $node->children['const']; - if (!is_string($name)) { - return; - } - if (\strtolower($name) === 'class') { - self::locateClassDefinition($request, $code_base, $context, $node->children['class']); - return; - } - try { - $class_const = (new ContextNode($code_base, $context, $node))->getClassConst(); - } catch (NodeException $_) { - return; // ignore - } catch (IssueException $_) { - return; // ignore - } catch (CodeBaseException $_) { - return; // ignore - } - // Class constants can't be objects, so there's no point in "Go To Type Definition" for now. - // TODO: There's a rare case of callable strings or `const HANDLER = MyClass::class`. - $request->recordDefinitionElement($code_base, $class_const, false); - } - - /** - * @return void - */ - public static function locateGlobalConstDefinition(GoToDefinitionRequest $request, CodeBase $code_base, Context $context, Node $node) - { - try { - $global_const = (new ContextNode($code_base, $context, $node))->getConst(); - } catch (NodeException $_) { - return; // ignore - } catch (IssueException $_) { - return; // ignore - } catch (CodeBaseException $_) { - return; // ignore - } - $request->recordDefinitionElement($code_base, $global_const, false); - } - - /** - * @return void - */ - public static function locateVariableDefinition(GoToDefinitionRequest $request, CodeBase $code_base, Context $context, Node $node) - { - $name = $node->children['name']; - if (!is_string($name)) { - return; - } - if (!$request->getIsTypeDefinitionRequest() && !$request->getIsHoverRequest()) { - // TODO: Implement "Go To Definition" for variables with heuristics or create a new plugin - return; - } - // Get the variable or superglobal - try { - $variable = (new ContextNode($code_base, $context, $node))->getVariable(); - } catch (Exception $_) { - return; - } - - $request->recordDefinitionOfVariableType($code_base, $context, $variable); - } - - /** - * Given a node of type AST_NEW, locate the constructor definition (or class definition) - * @return void - */ - private static function locateNewDefinition(GoToDefinitionRequest $request, CodeBase $code_base, Context $context, Node $node) - { - try { - $union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $node); - self::locateConstructorDefinitionForUnionType($request, $code_base, $union_type); - } catch (Exception $_) { - // Hopefully warn elsewhere - return; - } - } - - private static function locateConstructorDefinitionForUnionType( - GoToDefinitionRequest $request, - CodeBase $code_base, - UnionType $union_type - ) { - foreach ($union_type->getTypeSet() as $type) { - if ($type->isNativeType()) { - continue; - } - $class_fqsen = FullyQualifiedClassName::fromType($type); - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - continue; - } - $class = $code_base->getClassByFQSEN($class_fqsen); - $method = $class->getMethodByName($code_base, '__construct'); - if ($method->isPHPInternal() && !$class->isPHPInternal() && !$request->getIsHoverRequest()) { - $request->recordDefinitionElement($code_base, $class, false); - continue; - } - // Note: Does the same thing (Return the class) - // both for "Go To Definition" and "Go To Type Definition" - $request->recordDefinitionElement($code_base, $method, false); - } - } - - /** - * @return void - */ - public static function locateMethodDefinition(GoToDefinitionRequest $request, CodeBase $code_base, Context $context, Node $node) - { - $is_static = $node->kind === ast\AST_STATIC_CALL; - $method_name = $node->children['method']; - if (!is_string($method_name)) { - return; - } - try { - $method = (new ContextNode($code_base, $context, $node))->getMethod($method_name, $is_static); - } catch (NodeException $_) { - // ignore - return; - } catch (IssueException $_) { - // ignore - return; - } - $request->recordDefinitionElement($code_base, $method, true); - } - - /** - * @return void - */ - public static function locateFuncDefinition(GoToDefinitionRequest $request, CodeBase $code_base, Context $context, Node $node) - { - try { - foreach ((new ContextNode($code_base, $context, $node->children['expr']))->getFunctionFromNode() as $function_interface) { - $request->recordDefinitionElement($code_base, $function_interface, true); - } - } catch (NodeException $_) { - // ignore - return; - } catch (IssueException $_) { - // ignore - return; - } - } - - /** - * @param Node $node a node of type AST_USE to find the definition of - * @return void - */ - public static function locateNamespaceUseDefinition(GoToDefinitionRequest $request, CodeBase $code_base, Node $node) - { - // TODO: Support GroupUse (See ScopeVisitor->visitGroupUse) - $targets = ScopeVisitor::aliasTargetMapFromUseNode($node); - if (count($targets) !== 1) { - // TODO: Support group use - return; - } - $use_elem = $node->children[0]; - foreach ($targets as $target_array) { - $target_fqsen = $target_array[1]; - if ($target_fqsen instanceof FullyQualifiedClassName) { - // This **could** be a namespace or a class name. - // If we see the class for that name in the code base, treat that as the definition - if ($code_base->hasClassWithFQSEN($target_fqsen)) { - $class = $code_base->getClassByFQSEN($target_fqsen); - $request->recordDefinitionElement($code_base, $class, false); - } - } elseif ($target_fqsen instanceof FullyQualifiedFunctionName) { - if ($code_base->hasFunctionWithFQSEN($target_fqsen)) { - $func = $code_base->getFunctionByFQSEN($target_fqsen); - $request->recordDefinitionElement($code_base, $func, false); - } - } elseif ($target_fqsen instanceof FullyQualifiedGlobalConstantName) { - if ($code_base->hasGlobalConstantWithFQSEN($target_fqsen)) { - $global_constant = $code_base->getGlobalConstantByFQSEN($target_fqsen); - $request->recordDefinitionElement($code_base, $global_constant, false); - } - } - } - if ($node->flags === \ast\flags\USE_NORMAL) { - $name = $use_elem->children['name']; - if (is_string($name)) { - try { - $class_fqsen = FullyQualifiedClassName::fromFullyQualifiedString('\\' . \ltrim($name, '\\')); - } catch (AssertionError $_) { - return; // ignore, probably still typing the requested definition - } catch (FQSENException $_) { - return; // ignore, probably still typing the requested definition - } - if ($code_base->hasClassWithFQSEN($class_fqsen)) { - $class = $code_base->getClassByFQSEN($class_fqsen); - $request->recordDefinitionElement($code_base, $class, false); - } - } - return; - } - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/FileMapping.php b/vendor/phan/phan/src/Phan/LanguageServer/FileMapping.php deleted file mode 100644 index 08a2995..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/FileMapping.php +++ /dev/null @@ -1,96 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\LanguageServer; - -/** - * A class to keep track of overrides by language server clients with open files. - * Created for Phan. - * - * TODO: remove all overrides when a language client disconnects. - * (Right now, we only have a single client, and shut down when the client disconnects) - * - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod TODO: Document - */ -class FileMapping -{ - /** - * @var array<string,string> maps the absolute paths on disks to the currently edited versions of those files. - * TODO: Won't work with more than one client. - */ - private $overrides = []; - - /** - * @var array<string,string> maps the absolute path on disk to the URI sent by the language server. - * This may or may not help avoid creating duplicate requests for a given path. - */ - private $uri_for_path = []; - - public function __construct() - { - } - - /** - * @return array<string,string> maps the absolute paths on disks to the currently edited versions of those files. - */ - public function getOverrides() - { - return $this->overrides; - } - - /** - * @param string $uri - * @param ?string $new_contents - * @return void - */ - public function addOverrideURI(string $uri, $new_contents) - { - $path = Utils::uriToPath($uri); - if ($new_contents === null) { - $this->removeOverride($path); - } - $this->uri_for_path[$path] = $uri; - $this->addOverride($path, $new_contents); - } - - /** - * @param string $path - * @param ?string $new_contents - * @return void - */ - public function addOverride(string $path, $new_contents) - { - if ($new_contents === null) { - $this->removeOverride($path); - return; - } - $this->overrides[$path] = $new_contents; - } - - /** - * @return void - */ - public function removeOverrideURI(string $uri) - { - $path = Utils::uriToPath($uri); - $this->removeOverride($path); - } - - /** - * Returns the file URI for the path $path. - * - * This will prefer to return the URI that the client first sent (that got converted to $path) - */ - public function getURIForPath(string $path) : string - { - return $this->uri_for_path[$path] ?? Utils::pathToUri($path); - } - - /** - * @return void - */ - public function removeOverride(string $path) - { - unset($this->uri_for_path[$path]); - unset($this->overrides[$path]); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/GoToDefinitionRequest.php b/vendor/phan/phan/src/Phan/LanguageServer/GoToDefinitionRequest.php deleted file mode 100644 index a4c8d5d..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/GoToDefinitionRequest.php +++ /dev/null @@ -1,429 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\LanguageServer; - -use Exception; -use Phan\CodeBase; -use Phan\Exception\CodeBaseException; -use Phan\Language\Context; -use Phan\Language\Element\AddressableElementInterface; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\MarkupDescription; -use Phan\Language\Element\TypedElementInterface; -use Phan\Language\Element\Variable; -use Phan\Language\FileRef; -use Phan\Language\FQSEN; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\Type\StaticOrSelfType; -use Phan\Language\Type\TemplateType; -use Phan\LanguageServer\Protocol\Hover; -use Phan\LanguageServer\Protocol\Location; -use Phan\LanguageServer\Protocol\MarkupContent; -use Phan\LanguageServer\Protocol\Position; - -use function count; -use function is_array; - -/** - * Represents the Language Server Protocol's "Go to Definition" or "Go to Type Definition" or "Hover" request for a usage of an Element - * (class, property, function-like, constant, etc.) - * - * @see https://microsoft.github.io/language-server-protocol/specification#textDocument_definition - * @see https://microsoft.github.io/language-server-protocol/specification#textDocument_typeDefinition - * @see https://microsoft.github.io/language-server-protocol/specification#textDocument_hover - * - * @see \Phan\LanguageServer\DefinitionResolver for how this maps the found node to the type in the context. - * @see \Phan\Plugin\Internal\NodeSelectionPlugin for how the node is found - * @see \Phan\AST\TolerantASTConverter\TolerantASTConverterWithNodeMapping for how isSelected is set - * - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -final class GoToDefinitionRequest extends NodeInfoRequest -{ - /** @var int self::REQUEST_* */ - private $request_type; - - /** - * @var array<string,Location> the list of locations for a "Go to [Type] Definition" request - */ - private $locations = []; - - /** - * @var ?Hover the list of locations for a "Hover" request - */ - private $hover_response = null; - - const REQUEST_DEFINITION = 0; - const REQUEST_TYPE_DEFINITION = 1; - const REQUEST_HOVER = 2; - - public function __construct( - string $uri, - Position $position, - int $request_type - ) { - parent::__construct($uri, $position); - $this->request_type = $request_type; - } - - /** - * @param CodeBase $code_base used for resolving type location in "Go To Type Definition" - * @return void - */ - public function recordDefinitionElement( - CodeBase $code_base, - AddressableElementInterface $element, - bool $resolve_type_definition_if_needed - ) { - if ($this->getIsTypeDefinitionRequest() && $resolve_type_definition_if_needed) { - if (!($element instanceof Clazz)) { - $this->recordTypeOfElement($code_base, $element->getContext(), $element); - return; - } - } - $this->recordFinalDefinitionElement($code_base, $element); - } - - private function recordFinalDefinitionElement( - CodeBase $code_base, - AddressableElementInterface $element - ) { - if ($this->request_type === self::REQUEST_HOVER) { - if ($this->hover_response === null) { - $this->setHoverMarkdown(MarkupDescription::buildForElement($element, $code_base)); - // TODO: Support documenting more than one definition. - } - return; - } - $this->recordDefinitionContext($element->getContext()); - } - - private function setHoverMarkdown(string $markdown) - { - $this->hover_response = new Hover( - new MarkupContent( - MarkupContent::MARKDOWN, - $markdown - ) - ); - } - - /** - * Precondition: $this->getIsHoverRequest() - * @return void - */ - private function recordHoverTextForElementType( - CodeBase $code_base, - Context $context, - TypedElementInterface $element - ) { - $union_type = $element->getUnionType(); - $type_set = $union_type->getTypeSet(); - $description = null; - if ($element instanceof Variable) { - $description = $this->getDescriptionOfVariable($code_base, $context, $element); - } - if (count($type_set) === 0) { - if ($description) { - $this->setHoverMarkdown($description); - } - // Don't bother generating hover text if there are no known types or descriptions, maybe a subsequent call will have types - return; - } - $maybe_set_markdown_to_union_type = function () use ($union_type, $description) { - if ($this->hover_response === null) { - $markdown = \sprintf('`%s`', (string)$union_type); - if ($description) { - $markdown = \sprintf("%s %s", $markdown, $description); - } - $this->setHoverMarkdown($markdown); - } - }; - if (count($type_set) >= 2) { - $maybe_set_markdown_to_union_type(); - return; - } - - // If there is exactly one known type, then if it is a class/interface type, show details about the class/interface for that type - foreach ($type_set as $type) { - if ($type->getIsNullable()) { - continue; - } - if ($type instanceof TemplateType) { - continue; - } - if ($type instanceof StaticOrSelfType) { - if (!$context->isInClassScope()) { - // Phan already warns elsewhere - continue; - } - $type_fqsen = $context->getClassFQSEN(); - } else { - // Get the FQSEN of the class or closure. - $type_fqsen = $type->asFQSEN(); - } - try { - $this->recordDefinitionOfTypeFQSEN($code_base, $type_fqsen); - } catch (CodeBaseException $_) { - continue; - } - } - - if ($this->hover_response === null) { - $maybe_set_markdown_to_union_type(); - } - } - - /** - * Based on https://secure.php.net/manual/en/reserved.variables.php - */ - const GLOBAL_DESCRIPTIONS = [ - 'argc' => 'The number of arguments passed to the script', - 'argv' => 'Array of arguments passed to the script. The first argument `$argv[0]` is always the name that was used to run the script.', - '_COOKIE' => 'An associative array of variables passed to the current script via HTTP Cookies.', - '_ENV' => 'An associative array of variables passed to the current script via the environment method.', - '_FILES' => 'An associative array of items uploaded to the current script via the HTTP POST method.', - '_GET' => 'An associative array of variables passed to the current script via the URL parameters (aka. query string).', - '_GLOBALS' => 'References all variables available in global scope', - '_POST' => 'An associative array of variables passed to the current script via the HTTP POST method when using *application/x-www-form-urlencoded* or *multipart/form-data* as the HTTP Content-Type in the request.', - '_REQUEST' => 'An associative array that by default contains the contents of $_GET, $_POST and $_COOKIE.', - '_SERVER' => 'An array containing information such as headers, paths, and script locations. The entries in this array are created by the web server.', - '_SESSION' => 'An associative array containing session variables available to the current script.', - ]; - - /** - * @return ?string - */ - public function getDescriptionOfVariable( - CodeBase $code_base, - Context $context, - Variable $variable - ) { - $variable_name = $variable->getName(); - $description = self::GLOBAL_DESCRIPTIONS[$variable_name] ?? null; - if ($description) { - return $description; - } - if (!$context->isInFunctionLikeScope()) { - return null; - } - $function = $context->getFunctionLikeInScope($code_base); - // TODO(optional): Use inheritance to find descriptions for the corresponding parameters of ancestor classes/interfaces - // TODO(optional): Could support (at)var - $param_tags = MarkupDescription::extractParamTagsFromDocComment($function, false); - $variable_description = $param_tags[$variable_name] ?? null; - if (!$variable_description) { - return null; - } - // Remove the first part of '`@param int $x` description' - $variable_description = \preg_replace('@^`[^`]*`\s*@', '', $variable_description); - if (!$variable_description) { - return null; - } - return $variable_description; - } - - /** - * @param CodeBase $code_base used for resolving type location in "Go To Type Definition" - * @param Context $context used for resolving 'self'/'static', etc. - * @return void - */ - public function recordDefinitionOfVariableType( - CodeBase $code_base, - Context $context, - Variable $variable - ) { - $this->recordTypeOfElement($code_base, $context, $variable); - } - - /** - * @return void - */ - private function recordTypeOfElement( - CodeBase $code_base, - Context $context, - TypedElementInterface $element - ) { - if ($this->getIsHoverRequest()) { - $this->recordHoverTextForElementType($code_base, $context, $element); - return; - } - $union_type = $element->getUnionType(); - - // Do something similar to the check for undeclared classes - foreach ($union_type->getTypeSet() as $type) { - if ($type instanceof TemplateType) { - continue; - } - if ($type instanceof StaticOrSelfType) { - if (!$context->isInClassScope()) { - // Phan already warns elsewhere - continue; - } - $type_fqsen = $context->getClassFQSEN(); - } else { - // Get the FQSEN of the class or closure. - $type_fqsen = $type->asFQSEN(); - } - try { - $this->recordDefinitionOfTypeFQSEN($code_base, $type_fqsen); - } catch (CodeBaseException $_) { - continue; - } - } - } - - /** - * @param FQSEN $type_fqsen the FQSEN of a type. FullyQualifiedClassName or FullyQualifiedFunctionName or FullyQualifiedMethodName (For closures/methods) - * @throws CodeBaseException if codebase is somehow missing a definition - */ - private function recordDefinitionOfTypeFQSEN( - CodeBase $code_base, - FQSEN $type_fqsen - ) { - $record_definition = function (AddressableElementInterface $element) use ($code_base) { - if (!$element->isPHPInternal()) { - if ($this->getIsHoverRequest()) { - $this->recordDefinitionElement($code_base, $element, false); - } else { - $this->recordDefinitionContext($element->getContext()); - } - } - }; - if ($type_fqsen instanceof FullyQualifiedClassName) { - if ($code_base->hasClassWithFQSEN($type_fqsen)) { - $record_definition($code_base->getClassByFQSEN($type_fqsen)); - } - return; - } - // Closures can be regular closures (FullyQualifiedFunctionName) - // or Closures created from callables (Functions or methods) - if ($type_fqsen instanceof FullyQualifiedFunctionName) { - if ($code_base->hasFunctionWithFQSEN($type_fqsen)) { - $record_definition($code_base->getFunctionByFQSEN($type_fqsen)); - } - return; - } - if ($type_fqsen instanceof FullyQualifiedMethodName) { - if ($code_base->hasMethodWithFQSEN($type_fqsen)) { - $record_definition($code_base->getMethodByFQSEN($type_fqsen)); - } - return; - } - } - - /** - * Record the location in which the Node or Token (that the client is requesting information about) - * had the requested information defined (e.g. Definition, Type Definition, element that has information used to generate hover response, etc.) - */ - public function recordDefinitionContext(FileRef $context) - { - if ($context->isPHPInternal()) { - // We don't have complete stubs to show the user for internal functions such as is_string(), etc. - return; - } - $this->recordDefinitionLocation(Location::fromContext($context)); - } - - - /** - * @return void - */ - public function recordDefinitionLocation(Location $location) - { - $this->locations[$location->uri . ':' . \json_encode($location->range)] = $location; - } - - /** - * @param Location|array<string,mixed>|array<int,Location|array> $locations - * @return void - */ - public function recordDefinitionLocationList($locations) - { - if ($locations instanceof Location || isset($locations['uri'])) { - $locations = [$locations]; - } - foreach ($locations ?? [] as $location) { - if (is_array($location)) { - // @phan-suppress-next-line PhanPartialTypeMismatchArgument - $location = Location::fromArray($location); - } - $this->recordDefinitionLocation($location); - } - } - - /** - * @return array<int,Location> - */ - public function getDefinitionLocations() : array - { - return \array_values($this->locations); - } - - /** - * @return ?Hover - */ - public function getHoverResponse() - { - return $this->hover_response; - } - - /** - * Sets the only response for this hover request (with markdown to render) - * - * @param ?Hover|?array $hover - */ - public function setHoverResponse($hover) - { - if (is_array($hover)) { - $hover = Hover::fromArray($hover); - } - $this->hover_response = $hover; - } - - /** - * Clean up resources associated with this request. - * - * If a response for this request hasn't been sent yet, then send it (or null) back to the language server client - */ - public function finalize() - { - if ($this->fulfilled) { - return; - } - $this->fulfilled = true; - if ($this->request_type === self::REQUEST_HOVER) { - $result = $this->hover_response; - } else { - $result = $this->locations ? \array_values($this->locations) : null; - } - $this->promise->fulfill($result); - } - - /** - * Is this a "go to type definition" request? - */ - public function getIsTypeDefinitionRequest() : bool - { - return $this->request_type === self::REQUEST_TYPE_DEFINITION; - } - - /** - * Is this a hover request? - */ - public function getIsHoverRequest() : bool - { - return $this->request_type === self::REQUEST_HOVER; - } - - public function __destruct() - { - if ($this->fulfilled) { - return; - } - $this->fulfilled = true; - $this->promise->reject(new Exception('Failed to send a valid textDocument/completion result')); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/IdGenerator.php b/vendor/phan/phan/src/Phan/LanguageServer/IdGenerator.php deleted file mode 100644 index 4bfef85..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/IdGenerator.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer; - -/** - * Generates unique, incremental IDs for use as request IDs - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/IdGenerator.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class IdGenerator -{ - /** - * @var int an incrementing counter for generating unique request IDs - */ - public $counter = 1; - - /** - * Returns a unique ID - * - * @return int - */ - public function generate() - { - return $this->counter++; - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/LanguageClient.php b/vendor/phan/phan/src/Phan/LanguageServer/LanguageClient.php deleted file mode 100644 index 24059a7..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/LanguageClient.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer; - -/** - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/LanguageClient.php - * See ../../../LICENSE.LANGUAGE_SERVER - */ -class LanguageClient -{ - /** - * Handles textDocument/* methods - * - * @var Client\TextDocument - */ - public $textDocument; - - public function __construct(ProtocolReader $reader, ProtocolWriter $writer) - { - $handler = new ClientHandler($reader, $writer); - - $this->textDocument = new Client\TextDocument($handler); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/LanguageServer.php b/vendor/phan/phan/src/Phan/LanguageServer/LanguageServer.php deleted file mode 100644 index 09f9f3d..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/LanguageServer.php +++ /dev/null @@ -1,1007 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\LanguageServer; - -use AdvancedJsonRpc; -use AssertionError; -use Closure; -use Exception; -use Phan\CLI; -use Phan\CodeBase; -use Phan\Config; -use Phan\Daemon\ExitException; -use Phan\Daemon\Request; -use Phan\Daemon\Transport\CapturerResponder; -use Phan\Daemon\Transport\StreamResponder; -use Phan\Issue; -use Phan\Language\Element\MarkupDescription; -use Phan\Language\FileRef; -use Phan\LanguageServer\Protocol\ClientCapabilities; -use Phan\LanguageServer\Protocol\CompletionContext; -use Phan\LanguageServer\Protocol\CompletionItem; -use Phan\LanguageServer\Protocol\CompletionOptions; -use Phan\LanguageServer\Protocol\Diagnostic; -use Phan\LanguageServer\Protocol\DiagnosticSeverity; -use Phan\LanguageServer\Protocol\Hover; -use Phan\LanguageServer\Protocol\InitializeResult; -use Phan\LanguageServer\Protocol\Location; -use Phan\LanguageServer\Protocol\Message; -use Phan\LanguageServer\Protocol\Position; -use Phan\LanguageServer\Protocol\Range; -use Phan\LanguageServer\Protocol\SaveOptions; -use Phan\LanguageServer\Protocol\ServerCapabilities; -use Phan\LanguageServer\Protocol\TextDocumentSyncKind; -use Phan\LanguageServer\Protocol\TextDocumentSyncOptions; -use Phan\LanguageServer\Server\TextDocument; -use Phan\Library\StringUtil; -use Phan\Phan; -use Sabre\Event\Loop; -use Sabre\Event\Promise; -use Throwable; - -use function count; -use function get_class; -use function is_array; -use function is_string; -use function Sabre\Event\coroutine; -use function strlen; - -use const EXIT_FAILURE; -use const SIGCHLD; -use const STDERR; -use const STDIN; -use const STDOUT; - -/** - * Based on https://github.com/felixfbecker/php-language-server/blob/master/bin/php-language-server.php - * and https://github.com/felixfbecker/php-language-server/blob/master/src/LanguageServer.php (for language server protocol implementation) - * - * This is similar to Phan daemon mode, but it's possible for it to receive concurrent events, or more than one type of event. - * (in addition to file notifications, etc.) - * - * What will do in the most common case (checking for errors in a file): - * - * 0. Phan completes the parse phase, on the initial version of the codebase - * 1. Phan starts a Sabre event loop and listens for requests and responses: see http://sabre.io/event/loop/ - * It registers addReadStream and addWriteStream (See ProtocolStreamReader and ProtocolStreamWriter) - * 2. Phan receives a notification that a file changed/was added/was removed - * 3. If the files are within the phan project (contains .phan directory), - * then phan removes the old parse state of removed/changed files, then adds the new parse state of changed/added files. - * 4. The main phan process (managing the event loop) fork, the fork shuts down the event loop without receiving any more events or touching the stream(will this work?) - * 5. The forked process runs the analysis. - * 6. The forked process reports the analysis result to the main process via IPC (similar to what \Phan\ForkPool does), along with the id of the request - * 7. Phan notifies the client of the new issues ("diagnostic" in the open Language Server Protocol) - * See https://github.com/Microsoft/language-server-protocol#language-server-protocol - * - * TODO: support textDocument rename - */ -class LanguageServer extends AdvancedJsonRpc\Dispatcher -{ - /** - * Handles workspace/* method calls - * - * @var Server\Workspace - * @suppress PhanWriteOnlyPublicProperty used by AdvancedJsonRpc\Dispatcher via reflection - */ - public $workspace; - - /** - * @var ProtocolReader - * This reads and unserializes requests(or responses) and notifications from the language server client. - */ - protected $protocolReader; - - /** - * @var ProtocolWriter - * This serializes and sends responses(or requests) and notifications to the language server client. - */ - protected $protocolWriter; - - /** - * @var LanguageClient - * Used to interact with the remote language server client. - */ - protected $client; - - /** - * Handles textDocument/* method calls - * (e.g. whenever a text document is opened, saved, or closed) - * - * @var TextDocument - */ - public $textDocument; - - /** - * This contains the most recent daemon request to analyze a set of files (and optionally return information). - * - * Phan's support for the language server protocol is based on an earlier asynchronous mode called "Daemon mode" - * - * The most recent request is temporarily saved in this property so that Phan knows which forked process to communicate with. - * - * @var Request|null - */ - protected $most_recent_request; - - /** - * @var CodeBase The code base within which we're operating - */ - protected $code_base; - - /** - * Lister of files that Phan would parse - many of these won't change and won't require re-analysis - * @var Closure - */ - protected $file_path_lister; - - /** - * This maps file URIs from the language client to/from absolute paths of files on disk. - * - * This is useful to send the language client the same URI that it sent us in requests back in our responses. - * - * @var FileMapping - */ - protected $file_mapping; - - /** - * Is the language server still accepting new requests from clients? - * - * @var bool - */ - private $is_accepting_new_requests = true; - - /** - * @var array<string,string> maps Paths to URIs, for URIs which have pending analysis requests. - * Requests are buffered because the language server may otherwise send requests faster than Phan can respond to them. - * (`$reader->on('readMessageGroup')` notifies Phan that a group of 1 or more messages was read) - */ - protected $analyze_request_set = []; - - /** - * @var ?NodeInfoRequest - * - * Contains the promise for the most recent "Go to definition" request - * If more than one such request exists, the earlier requests will be discarded. - * - * TODO: Will need to Resolve(null) for the older requests. - */ - protected $most_recent_node_info_request = null; - - /** - * Constructs the only instance of the language server - */ - public function __construct(ProtocolReader $reader, ProtocolWriter $writer, CodeBase $code_base, Closure $file_path_lister) - { - parent::__construct($this, '/'); - $this->protocolReader = $reader; - $this->file_mapping = new FileMapping(); - $reader->on('close', function () { - if (!$this->is_accepting_new_requests) { - // This is the forked process, which forced the ProtocolReader to close. Don't exit(). - // Instead, carry on and analyze the input files. - return; - } - $this->shutdown(); - $this->exit(); - }); - $reader->on('message', function (Message $msg) { - /** @suppress PhanUndeclaredProperty Request->body->id is a request with an id */ - coroutine(function () use ($msg) : \Generator { - $body = $msg->body; - if (!$body) { - return; - } - // Ignore responses, this is the handler for requests and notifications - if (AdvancedJsonRpc\Response::isResponse($body)) { - return; - } - Logger::logInfo('Received message in coroutine: ' . (string)$body); - $result = null; - $error = null; - try { - // Invoke the method handler to get a result - $result = yield $this->dispatch($body); - } catch (AdvancedJsonRpc\Error $e) { - Logger::logInfo('Saw error: ' . $e->getMessage()); - // If a ResponseError is thrown, send it back in the Response - $error = $e; - } catch (Throwable $e) { - Logger::logInfo('Saw Throwable: ' . get_class($e) . ': ' . $e->getMessage() . "\n" . $e->getTraceAsString()); - // If an unexpected error occurred, send back an INTERNAL_ERROR error response - $error = new AdvancedJsonRpc\Error( - (string)$e, - AdvancedJsonRpc\ErrorCode::INTERNAL_ERROR, - null, - $e - ); - } - // Only send a Response for a Request - // Notifications do not send Responses - if (AdvancedJsonRpc\Request::isRequest($body)) { - if ($error !== null) { - $responseBody = new AdvancedJsonRpc\ErrorResponse($body->id, $error); - } else { - $responseBody = new AdvancedJsonRpc\SuccessResponse($body->id, $result); - } - $this->protocolWriter->write(new Message($responseBody)); - } - })->otherwise('\\Phan\\LanguageServer\\Utils::crash'); - }); - - $reader->on('readMessageGroup', function () { - $this->finalizeAnalyzingURIs(); - }); - - $this->protocolWriter = $writer; - // We create a client to send diagnostics, etc. to the IDE - $this->client = new LanguageClient($reader, $writer); - // We create a workspace to receive change notifications. - $this->workspace = new Server\Workspace($this->client, $this, $this->file_mapping); - - // Phan specific code - $this->code_base = $code_base; - $this->file_path_lister = $file_path_lister; - } - - /** - * This creates an analyzing daemon, to be used by IDEs. - * Format: - * - * - Read over TCP socket with JSONRPC 2 - * - Respond over TCP socket with JSONRPC 2 - * - * @param CodeBase $code_base (Must have undo tracker enabled) - * - * @param \Closure $file_path_lister - * Returns string[] - A list of files to scan. This may be different from the previous contents. - * - * @param array<string,mixed> $options (leave empty for stdout) - * - * @return Request|null - A writeable request, which has been fully read from. - * Callers should close after they are finished writing. - * - * @suppress PhanUndeclaredConstant, UnusedSuppression (pcntl unavailable on Windows) - */ - public static function run(CodeBase $code_base, \Closure $file_path_lister, array $options) - { - if (!$code_base->isUndoTrackingEnabled()) { - throw new AssertionError("Expected undo tracking to be enabled"); - } - if (\function_exists('pcntl_signal')) { - \pcntl_signal( - SIGCHLD, - /** - * @param int $signo - * @param int|null $status - * @param int|null $pid - * @return void - */ - static function ($signo, $status = null, $pid = null) { - Request::childSignalHandler($signo, $status, $pid); - } - ); - } - - $make_language_server = static function (ProtocolStreamReader $in, ProtocolStreamWriter $out) use ($code_base, $file_path_lister) : LanguageServer { - return new LanguageServer( - $in, - $out, - $code_base, - $file_path_lister - ); - }; - // example requests over TCP - // Assumes that clients send and close the their requests quickly, then wait for a response. - - // {"method":"analyze","files":["/path/to/file1.php","/path/to/file2.php"]} - - // FIXME add re-parsing files to actions taken during loop - /* - $socket_server = self::createDaemonStreamSocketServer(); - // TODO: Limit the maximum number of active processes to a small number(4?) - // TODO: accept SIGCHLD when child terminates, somehow? - try { - $gotSignal = false; - if (function_exists('pcntl_signal')) { - pcntl_signal(SIGCHLD, function(...$args) use(&$gotSignal) { - $gotSignal = true; - Request::childSignalHandler(...$args); - }); - } - while (true) { - $gotSignal = false; // reset this. - // We get an error from stream_socket_accept. After the RuntimeException is thrown, pcntl_signal is called. - $previousErrorHandler = set_error_handler(function ($severity, $message, $file, $line) use (&$previousErrorHandler) { - self::debugf("In new error handler '$message'"); - if (!preg_match('/stream_socket_accept/i', $message)) { - return $previousErrorHandler($severity, $message, $file, $line); - } - throw new \RuntimeException("Got signal"); - }); - - $conn = false; - try { - $conn = stream_socket_accept($socket_server, -1); - } catch(\RuntimeException $e) { - self::debugf("Got signal"); - pcntl_signal_dispatch(); - self::debugf("done processing signals"); - if ($gotSignal) { - continue; // Ignore notices from stream_socket_accept if it's due to being interrupted by a child process terminating. - } - } finally { - restore_error_handler(); - } - - if (!\is_resource($conn)) { - // If we didn't get a connection, and it wasn't due to a signal from a child process, then stop the daemon. - break; - } - $request = Request::accept($code_base, $file_path_lister, $conn); - if ($request instanceof Request) { - return $request; // We forked off a worker process successfully, and this is the worker process - } - } - error_log("Stopped accepting connections"); - } finally { - restore_error_handler(); - } - return null; - */ - if (isset($options['tcp'])) { - // Connect to a TCP server - $address = $options['tcp']; - $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); - $ls = $make_language_server(new ProtocolStreamReader($socket), new ProtocolStreamWriter($socket)); - Logger::logInfo("Connected to $address to receive requests"); - Loop\run(); - Logger::logInfo("Finished connecting to $address to receive requests"); - $most_recent_request = $ls->most_recent_request; - $ls->most_recent_request = null; - return $most_recent_request; - } elseif (isset($options['tcp-server'])) { - // Run a TCP Server - $address = $options['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"); - if (!\extension_loaded('pcntl')) { - \fwrite(STDERR, "PCNTL is not available. Only a single connection will be accepted\n"); - } - while ($socket = \stream_socket_accept($tcpServer, -1)) { - \fwrite(STDOUT, "Connection accepted\n"); - \stream_set_blocking($socket, false); - /**if (false && extension_loaded('pcntl')) { // FIXME re-enable, this was disabled to simplify testing - // TODO: This will work, but does it make sense? - - // 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); - } else if ($pid === 0) { - // Child process - $reader = new ProtocolStreamReader($socket); - $writer = new ProtocolStreamWriter($socket); - $reader->on('close', function () { - fwrite(STDOUT, "Connection closed\n"); - }); - $ls = $make_language_server($reader, $writer); - Logger::logInfo("Worker started accepting requests on $address"); - Loop\run(); - Logger::logInfo("Worker finished accepting requests on $address"); - $most_recent_request = $ls->most_recent_request; - $ls->most_recent_request = null; - return $most_recent_request;; - } - } else {*/ - // To avoid edge cases, we only accept one connection. - // If PCNTL is not available, we only accept one connection. - // An exit notification will terminate the server - $ls = $make_language_server( - new ProtocolStreamReader($socket), - new ProtocolStreamWriter($socket) - ); - Logger::logInfo("Started listening on tcp"); - Loop\run(); - Logger::logInfo("Finished listening on tcp"); - $most_recent_request = $ls->most_recent_request; - $ls->most_recent_request = null; - return $most_recent_request; - /* } */ - } - } else { - if ($options['stdin'] !== true) { - throw new AssertionError("Expected either 'stdin', 'tcp-server', or 'tcp' as the language server communication option"); - } - // Use STDIO - \stream_set_blocking(STDIN, false); - $ls = $make_language_server( - new ProtocolStreamReader(STDIN), - new ProtocolStreamWriter(STDOUT) - ); - Logger::logInfo("Started listening on stdin"); - Loop\run(); - Logger::logInfo("Finished listening on stdin"); - $most_recent_request = $ls->most_recent_request; - $ls->most_recent_request = null; - return $most_recent_request; - } - } - - /** - * Asynchronously analyze the given URI. - * @return void - */ - public function analyzeURIAsync(string $uri) - { - $path_to_analyze = Utils::uriToPath($uri); - Logger::logInfo("Called analyzeURIAsync, uri=$uri, path=$path_to_analyze"); - $this->analyze_request_set[$path_to_analyze] = $uri; - // Don't call file_path_lister immediately - - // That has to walk the directories in .phan/config.php to see if the requested path is included and not excluded. - } - - /** - * Asynchronously generates the definition for a given URL and position. - * @return Promise <Location|Location[]|null> - */ - public function awaitDefinition( - string $uri, - Position $position, - bool $is_type_definition_request - ) : Promise { - // TODO: Add a way to "go to definition" (etc.) without emitting analysis results as a side effect - $path_to_analyze = Utils::uriToPath($uri); - $logType = $is_type_definition_request ? 'awaitTypeDefinition' : 'awaitDefinition'; - Logger::logInfo("Called LanguageServer->$logType, uri=$uri, position=" . StringUtil::jsonEncode($position)); - $type = $is_type_definition_request ? GoToDefinitionRequest::REQUEST_TYPE_DEFINITION : GoToDefinitionRequest::REQUEST_DEFINITION; - $this->discardPreviousNodeInfoRequest(); - $request = new GoToDefinitionRequest($uri, $position, $type); - $this->most_recent_node_info_request = $request; - - // We analyze this url so that Phan is aware enough of the types and namespace maps to trigger "Go to definition" - // E.g. going to the definition of `Bar` in `use Foo as Bar; Bar::method();` requires parsing other statements in this file, not just the name in question. - // - // NOTE: This also ensures that we will run analysis, because of the check for analyze_request_set being non-empty - $this->analyze_request_set[$path_to_analyze] = $uri; - return $request->getPromise(); - } - - /** - * Asynchronously generates the hover text for a given URL and position. - * - * @return Promise <Location|Location[]|null> - */ - public function awaitHover( - string $uri, - Position $position - ) : Promise { - // TODO: Add a way to "go to definition" without emitting analysis results as a side effect - $path_to_analyze = Utils::uriToPath($uri); - Logger::logInfo("Called LanguageServer->awaitHover, uri=$uri, position=" . StringUtil::jsonEncode($position)); - $this->discardPreviousNodeInfoRequest(); - $request = new GoToDefinitionRequest($uri, $position, GoToDefinitionRequest::REQUEST_HOVER); - $this->most_recent_node_info_request = $request; - MarkupDescription::eagerlyLoadAllDescriptionMaps(); - - // We analyze this url so that Phan is aware enough of the types and namespace maps to trigger "Go to definition" - // E.g. going to the definition of `Bar` in `use Foo as Bar; Bar::method();` requires parsing other statements in this file, not just the name in question. - // - // NOTE: This also ensures that we will run analysis, because of the check for analyze_request_set being non-empty - $this->analyze_request_set[$path_to_analyze] = $uri; - return $request->getPromise(); - } - - /** - * Asynchronously generates the definition for a given URL - * @return Promise <Location|Location[]|null> - */ - public function awaitCompletion( - string $uri, - Position $position, - CompletionContext $completion_context = null - ) : Promise { - // TODO: Add a way to "go to definition" without emitting analysis results as a side effect - $path_to_analyze = Utils::uriToPath($uri); - Logger::logInfo("Called LanguageServer->awaitCompletion, uri=$uri, position=" . StringUtil::jsonEncode($position)); - $this->discardPreviousNodeInfoRequest(); - $request = new CompletionRequest($uri, $position, $completion_context); - $this->most_recent_node_info_request = $request; - - // We analyze this url so that Phan is aware enough of the types and namespace maps to trigger "Go to definition" - // E.g. going to the definition of `Bar` in `use Foo as Bar; Bar::method();` requires parsing other statements in this file, not just the name in question. - // - // NOTE: This also ensures that we will run analysis, because of the check for analyze_request_set being non-empty - $this->analyze_request_set[$path_to_analyze] = $uri; - return $request->getPromise(); - } - - private function discardPreviousNodeInfoRequest() - { - $prev_node_info_request = $this->most_recent_node_info_request; - if ($prev_node_info_request) { - // Discard the previous request silently - $prev_node_info_request->finalize(); - $this->most_recent_node_info_request = null; - } - } - - /** - * Gets URIs (and corresponding paths) which the language server client needs Phan to re-analyze. - * This excludes any files that aren't in files and directories of .phan/config.php - * - * @return array{0:array<string,string>,1:array<int,string>} - * First element maps relative path to the file URI. - * Second element is the result of file_path_lister (unless there's nothing to analyze) - */ - private function getFilteredURIsToAnalyze() : array - { - $uris_to_analyze = $this->analyze_request_set; - if (\count($uris_to_analyze) === 0) { - return [[], []]; - } - $this->analyze_request_set = []; - - // Always recompute the file list from the directory list : see src/phan.php - // The caller will reuse the cached file list. - $file_path_list = ($this->file_path_lister)(true); - $filtered_uris_to_analyze = []; - foreach ($uris_to_analyze as $path_to_analyze => $uri) { - if (!is_string($uri)) { - Logger::logInfo("Uri for path '$path_to_analyze' is not a string, should not happen"); - continue; - } - $relative_path_to_analyze = FileRef::getProjectRelativePathForPath($path_to_analyze); - if (!\in_array($uri, $file_path_list) && !\in_array($relative_path_to_analyze, $file_path_list)) { - // fwrite(STDERR, "Checking if should parse missing $relative_path_to_analyze for $uri\n"); - if (CLI::shouldParse($relative_path_to_analyze)) { - $file_path_list[] = $relative_path_to_analyze; - Logger::logInfo("Path '$relative_path_to_analyze' (URI '$uri') was not in list - adding it"); - } else { - Logger::logInfo("Path '$relative_path_to_analyze' (URI '$uri') not in parse list, skipping"); - continue; - } - } - $filtered_uris_to_analyze[$relative_path_to_analyze] = $uri; - } - return [$filtered_uris_to_analyze, $file_path_list]; - } - - /** - * @return void - */ - private function finalizeAnalyzingURIs() - { - list($uris_to_analyze, $file_path_list) = $this->getFilteredURIsToAnalyze(); - // TODO: Add a better abstraction of - if (\count($uris_to_analyze) === 0) { - // Discard any node info requests, we haven't created a request yet. - $this->discardPreviousNodeInfoRequest(); - return; - } - - // Add anything that's open in the IDE to the URIs to analyze. - // In the future, this behavior may be configurable. - foreach ($this->file_mapping->getOverrides() as $path => $_) { - if (!isset($uris_to_analyze[$path])) { - $uris_to_analyze[$path] = $this->file_mapping->getURIForPath($path); - } - } - - if (Config::getValue('language_server_use_pcntl_fallback')) { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - $this->finishAnalyzingURIsWithoutPcntl($uris_to_analyze); - return; - } - - // TODO: check if $path_to_analyze can be analyzed first. - $sockets = \stream_socket_pair(\STREAM_PF_UNIX, \STREAM_SOCK_STREAM, \STREAM_IPPROTO_IP); - if (!$sockets) { - \error_log("unable to create stream socket pair"); - exit(EXIT_FAILURE); - } - - $this->most_recent_request = null; - - // Give our signal handler time to collect the status of any zombie processes - // so that they don't accumulate. - \pcntl_signal_dispatch(); - - // Fork a new process to handle the analysis request - $pid = \pcntl_fork(); - if ($pid < 0) { - \error_log(\posix_strerror(\posix_get_last_error())); - exit(EXIT_FAILURE); - } - - // FIXME: make this async as well, and rate limit it. - if ($pid > 0) { - // This is the parent - The worker process that was forked has pid $pid - Request::handleBecomingParentOfChildAnalysisProcess($pid); - $read_stream = self::streamForParent($sockets); - $concatenated = ''; - while (!\feof($read_stream)) { - $buffer = \fread($read_stream, 1024); - if ($buffer === false) { - Logger::logError("fread from language client failed"); - break; - } - if (strlen($buffer) > 0) { - $concatenated .= $buffer; - } - } - $json_contents = \json_decode($concatenated, true); - if (!\is_array($json_contents)) { - Logger::logInfo("Fetched non-json: " . $concatenated); - return; - } - $this->handleJSONResponseFromWorker($uris_to_analyze, $json_contents); - return; - } - // This is the worker process. - Request::handleBecomingChildAnalysisProcess(); - - $child_stream = self::streamForChild($sockets); - $paths_to_analyze = \array_keys($uris_to_analyze); - $this->most_recent_request = Request::makeLanguageServerAnalysisRequest( - new StreamResponder($child_stream, false), - $paths_to_analyze, - $this->code_base, - /** @return array<int,string> */ - static function (bool $unused_recompute_file_list = false) use ($file_path_list) : array { - return $file_path_list; - }, - $this->file_mapping, - $this->most_recent_node_info_request, - true // We are the fork. Call exit() instead of throwing ExitException - ); - // FIXME update the parsed file lists before and after (e.g. add to analyzeURI). See Daemon\Request::accept() - // TODO: refactor accept() to make it easier to work with. - // TODO: add unit tests - - $this->protocolReader->stopAcceptingNewRequests(); - $this->is_accepting_new_requests = false; - Loop\stop(); // abort the loop (without closing streams?) - } - - /** - * @param array<string,string> $uris_to_analyze - * @return void - * - * @throws Exception if analysis throws an exception - * - * @suppress PhanAccessMethodInternal - */ - private function finishAnalyzingURIsWithoutPcntl(array $uris_to_analyze) - { - $paths_to_analyze = \array_keys($uris_to_analyze); - Logger::logInfo('in ' . __METHOD__ . ' paths: ' . StringUtil::jsonEncode($paths_to_analyze)); - // When there is no pcntl: - // Create a fake request object. - // Instead of stopping the loop, keep going with the loop and keep accepting the requests - $responder = new CapturerResponder([]); - $code_base = $this->code_base; - - $analysis_request = Request::makeLanguageServerAnalysisRequest( - $responder, - $paths_to_analyze, - $code_base, - $this->file_path_lister, - $this->file_mapping, - $this->most_recent_node_info_request, - false // We aren't forking. Throw ExitException instead of calling exit() - ); - - $analyze_file_path_list = $analysis_request->filterFilesToAnalyze($this->code_base->getParsedFilePathList()); - if (count($analyze_file_path_list) === 0) { - // Nothing to do, don't start analysis - $analysis_request->rejectLanguageServerRequestsRequiringAnalysis(); - return; - } - - // Do this before we stop tracking undo operations. - $temporary_file_mapping = $analysis_request->getTemporaryFileMapping(); - - $restore_point = $code_base->createRestorePoint(); - - // Stop tracking undo operations, now that the parse phase is done. - // This is re-enabled in restoreFromRestorePoint - $code_base->disableUndoTracking(); - - Phan::setPrinter($analysis_request->getPrinter()); - - try { - Phan::finishAnalyzingRemainingStatements($this->code_base, $analysis_request, $analyze_file_path_list, $temporary_file_mapping); - } catch (ExitException $_) { - // This is normal, do nothing - } - - $response_data = $responder->getResponseData(); - if (!$response_data) { - // Something is probably broken if we don't get response data - // But just in case we can recover, restore this. - $code_base->restoreFromRestorePoint($restore_point); - throw new \RuntimeException("Failed to get a response from a worker"); - } - - // Send a response with diagnostics to the language server client. - // It should be slightly faster to send a response - // if the language server sends data before restoring the state of the codebase. - // (Transforming the JSON response does not depend on the $code_base object) - $this->handleJSONResponseFromWorker($uris_to_analyze, $response_data); - - $code_base->restoreFromRestorePoint($restore_point); - - Logger::logInfo("Response from non-pcntl server: " . StringUtil::jsonEncode($response_data)); - } - - /** - * @param array<string,string> $uris_to_analyze - * @param array{issues:array[],definitions?:?Location|?(Location[]),completions?:?(CompletionItem[]),hover_response?:Hover} $response_data - * @return void - * @see Request::respondWithIssues() for where $response_data is serialized - */ - private function handleJSONResponseFromWorker(array $uris_to_analyze, array $response_data) - { - $most_recent_node_info_request = $this->most_recent_node_info_request; - if ($most_recent_node_info_request) { - if ($most_recent_node_info_request instanceof GoToDefinitionRequest) { - // @phan-suppress-next-line PhanPossiblyNullTypeArgument, PhanPartialTypeMismatchArgument - $most_recent_node_info_request->recordDefinitionLocationList($response_data['definitions'] ?? null); - $most_recent_node_info_request->setHoverResponse($response_data['hover_response'] ?? null); - } elseif ($most_recent_node_info_request instanceof CompletionRequest) { - $most_recent_node_info_request->recordCompletionList($response_data['completions'] ?? null); - } - $most_recent_node_info_request->finalize(); - } - - $this->most_recent_node_info_request = null; - if (!\array_key_exists('issues', $response_data)) { - Logger::logInfo("Failed to fetch 'issues' from JSON: " . StringUtil::jsonEncode($response_data)); - return; - } - $diagnostics = []; - // Normalize the uri so that it will be the same as URIs phan would send for diagnostics. - // E.g. "file:///path/path%.php" will be normalized to "file:///path/path%25.php" - foreach ($uris_to_analyze as $uri) { - $normalized_requested_uri = Utils::pathToUri(Utils::uriToPath($uri)); - $diagnostics[$normalized_requested_uri] = []; // send an empty diagnostic list on failure. - } - - $issues = $response_data['issues'] ?? []; - if (!is_array($issues)) { - Logger::logInfo("Failed to fetch 'issues' from JSON: " . StringUtil::jsonEncode($response_data)); - return; - } - foreach ($issues as $issue) { - list($issue_uri, $diagnostic) = self::generateDiagnostic($issue); - if ($diagnostic instanceof Diagnostic) { - $diagnostics[$issue_uri][] = $diagnostic; - } - } - - foreach ($diagnostics as $diagnostics_uri => $diagnostics_list) { - $this->client->textDocument->publishDiagnostics($diagnostics_uri, $diagnostics_list); - } - } - - /** - * @param array{type:string,description:string,suggestion?:string,severity:int,location:array{path:string,lines:array{begin:int,end:int}}} $issue - * @return null[]|string[]|Diagnostic[] - On success, returns [string $uri, Diagnostic $diagnostic] - */ - private static function generateDiagnostic($issue) : array - { - if ($issue['type'] !== 'issue') { - return [null, null]; - } - //$check_name = $issue['check_name']; - $description = $issue['description']; - if (Config::getValue('language_server_hide_category_of_issues')) { - // See JSONPrinter.php for how $description is built - $description = \explode(' ', $description, 2)[1]; - } - if (isset($issue['suggestion'])) { - $description .= ' (' . $issue['suggestion'] . ')'; - } - - $severity = $issue['severity']; - $path = Config::projectPath($issue['location']['path']); - $issue_uri = Utils::pathToUri($path); - $start_line = $issue['location']['lines']['begin']; - $start_line = (int)\max($start_line, 1); - // If we ever supported end_line: - // $end_line = $issue['location']['lines']['end'] ?? $start_line; - // $end_line = max($end_line, 1); - // Language server has 0 based lines and columns, phan has 1-based lines and columns. - $range = new Range(new Position($start_line - 1, 0), new Position($start_line, 0)); - $diagnostic_severity = self::diagnosticSeverityFromPhanSeverity($severity); - // TODO: copy issue code in 'json' format - return [$issue_uri, new Diagnostic($description, $range, null, $diagnostic_severity, 'Phan')]; - } - - /** - * @param int $severity - * @return int - * A DiagnosticSeverity constant used by the language server protocol. - */ - public static function diagnosticSeverityFromPhanSeverity($severity) : int - { - switch ($severity) { - case Issue::SEVERITY_LOW: - return DiagnosticSeverity::INFORMATION; - case Issue::SEVERITY_NORMAL: - return DiagnosticSeverity::WARNING; - default: - return DiagnosticSeverity::ERROR; - } - } - - /** - * 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) - { - list($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(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) - { - list($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; - } - - - /** - * 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) @phan-unused-param - * @param string|null $rootPath The rootPath of the workspace. Is null if no folder is open. @phan-unused-param - * @param int|null $processId The process Id of the parent process that started the server. @phan-unused-param - * This 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. - * NOTE: For most use cases, we'll know about the disconnection because the connection hits the end of file or an error. - * - * @return Promise <InitializeResult> - */ - public function initialize(ClientCapabilities $capabilities, string $rootPath = null, int $processId = null): Promise - { - return coroutine(function () : \Generator { - // Eventually, this might block on something. Leave it as a generator. - if (false) { - yield; - } - - // There would be an asynchronous indexing step, but the startup already did the indexing. - if ($this->textDocument === null) { - $this->textDocument = new TextDocument( - $this->client, - $this, - $this->file_mapping - ); - } - - $server_capabilities = new ServerCapabilities(); - - // FULL: Ask the client to return always return full documents (because we need to rebuild the AST from scratch) - // NONE: Don't sync until the user explicitly saves a document. - $server_capabilities->textDocumentSync = $this->makeTextDocumentSyncOptions(); - - // TODO: Support "Find all symbols"? - //$server_capabilities->documentSymbolProvider = true; - // TODO: Support "Find all symbols in workspace"? - //$server_capabilities->workspaceSymbolProvider = true; - // XXX do this next? - - $supports_go_to_definition = (bool)Config::getValue('language_server_enable_go_to_definition'); - $server_capabilities->definitionProvider = $supports_go_to_definition; - $server_capabilities->typeDefinitionProvider = $supports_go_to_definition; - $server_capabilities->hoverProvider = (bool)Config::getValue('language_server_enable_hover'); - if (Config::getValue('language_server_enable_completion')) { - // TODO: What about `:`? - $completion_provider = new CompletionOptions(); - $completion_provider->resolveProvider = false; - $completion_provider->triggerCharacters = ['$', '>']; - $server_capabilities->completionProvider = $completion_provider; - } - - // TODO: (probably impractical, slow) Support "Find all references"? (We don't track this, except when checking for dead code elimination possibilities. - // $server_capabilities->referencesProvider = false; - // Can't support "Hover" without phpdoc for internal functions, such as those from PHPStorm - // Can't support global references at the moment, I think. - //$server_capabilities->xworkspaceReferencesProvider = true; - //$server_capabilities->xdefinitionProvider = true; - //$server_capabilities->xdependenciesProvider = true; - - return new InitializeResult($server_capabilities); - }); - } - - private function makeTextDocumentSyncOptions() : TextDocumentSyncOptions - { - $textDocumentSyncOptions = new TextDocumentSyncOptions(); - $textDocumentSyncOptions->openClose = true; - $textDocumentSyncOptions->change = TextDocumentSyncKind::FULL; - - $saveOptions = new SaveOptions(); - $saveOptions->includeText = true; - $textDocumentSyncOptions->save = $saveOptions; - return $textDocumentSyncOptions; - } - - /** - * Currently a no-op. - * - * The initialized notification is sent from the client to the server after the client received the result of the initialize request - * but before the client is sending any other request or notification to the server. - * - * @suppress PhanUnreferencedPublicMethod - * @return void - */ - public function initialized() - { - Logger::logInfo("Called initialized on language server, currently a no-op"); - } - - /** - * 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. - * - * @return void - */ - public function shutdown() - { - // TODO: Does phan need to do anything else except respond? - Logger::logInfo("Called shutdown on language server"); - } - - /** - * A notification to ask the server to exit its process. - * - * @return void - */ - public function exit() - { - // This is handled by the main process. No forks are active. - Logger::logInfo("Called exit on language server"); - exit(0); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Logger.php b/vendor/phan/phan/src/Phan/LanguageServer/Logger.php deleted file mode 100644 index 86ff201..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Logger.php +++ /dev/null @@ -1,117 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer; - -use Phan\Config; -use Phan\Library\StringUtil; - -use const STDERR; - -/** - * A logger used by Phan for developing or debugging the language server. - * Logs to stderr by default. - */ -class Logger -{ - /** @var resource|false the log file handle */ - public static $file = false; - - /** - * Should this verbosely log debug output? - */ - public static function shouldLog() : bool - { - return Config::getValue('language_server_debug_level') === 'info'; - } - - /** - * Logs a request received from the client - * @param array<string,string> $headers - * @return void - */ - public static function logRequest(array $headers, string $buffer) - { - if (!self::shouldLog()) { - return; - } - self::logInfo(\sprintf("Request:\n%s\nData:\n%s\n\n", StringUtil::jsonEncode($headers), $buffer)); - } - - /** - * Logs a response this is about to send back to the client - * @param array<string,mixed> $headers - * @return void - */ - public static function logResponse(array $headers, string $buffer) - { - if (!self::shouldLog()) { - return; - } - self::logInfo(\sprintf("Response:\n%s\nData:\n%s\n\n", StringUtil::jsonEncode($headers), $buffer)); - } - - /** - * Logs an info message to a configured file (defaults to STDERR), - * if debugging is turned on. - * - * This is used by code related to the language server. - * Phan is slower when verbose logging is enabled. - * - * @return void - */ - public static function logInfo(string $msg) - { - if (!self::shouldLog()) { - return; - } - $file = self::getLogFile(); - \fwrite($file, $msg . "\n"); - } - - /** - * Logs an error related to the language server protocol - * to the configured log file (defaults to STDERR) - * @return void - */ - public static function logError(string $msg) - { - $file = self::getLogFile(); - \fwrite($file, $msg . "\n"); - } - - /** - * @return resource the log file handle (defaults to STDERR) - */ - private static function getLogFile() - { - $file = self::$file; - if (!$file) { - self::$file = $file = STDERR; - } - return $file; - } - - /** - * Overrides the log file to a different one - * @param resource $new_file - * @return void - * @suppress PhanUnreferencedPublicMethod this is made available for debugging issues - */ - public static function setLogFile($new_file) - { - if (!\is_resource($new_file)) { - throw new \TypeError("Expected newFile to be a resource, got " . \gettype($new_file)); - } - $old_file = self::$file; - if (\is_resource($old_file)) { - if ($old_file === $new_file) { - return; - } - if ($old_file !== STDERR) { - \fclose($old_file); - } - } - self::$file = $new_file; - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/NodeInfoRequest.php b/vendor/phan/phan/src/Phan/LanguageServer/NodeInfoRequest.php deleted file mode 100644 index 1063690..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/NodeInfoRequest.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\LanguageServer; - -use Phan\LanguageServer\Protocol\Position; -use Sabre\Event\Promise; - -/** - * Represents the Language Server Protocol's request for information about a location of a file - * - * @see \Phan\LanguageServer\DefinitionResolver for how this maps the found node to the type in the context. - * @see \Phan\Plugin\Internal\NodeSelectionPlugin for how the node is found - * @see \Phan\AST\TolerantASTConverter\TolerantASTConverterWithNodeMapping for how isSelected is set - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -abstract class NodeInfoRequest -{ - /** @var string file URI */ - protected $uri; - /** @var string absolute path for $this->uri */ - protected $path; - /** @var Position the position of the cursor within $this->uri where information is being requested. */ - protected $position; - /** @var Promise this should be resolve()d with the requested information, or resolve()d with null (or rejected) on failure or if the request was aborted */ - protected $promise; - - /** - * @var bool - */ - protected $fulfilled = false; - - public function __construct( - string $uri, - Position $position - ) { - $this->uri = $uri; - $this->path = Utils::uriToPath($uri); - $this->position = $position; - $this->promise = new Promise(); - } - - /** @return void */ - abstract public function finalize(); - - /** - * Returns the file URL for which info is being requested - * - * @suppress PhanUnreferencedPublicMethod TODO: Compare against the context->getPath() to be sure we're looking up the right node - */ - final public function getUrl() : string - { - return $this->uri; - } - - /** - * Returns the path for which info is being requested - */ - final public function getPath() : string - { - return $this->path; - } - - /** - * Returns the position (line+column) for which info is being requested - */ - final public function getPosition() : Position - { - return $this->position; - } - - /** @return Promise */ - final public function getPromise() - { - return $this->promise; - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/ClientCapabilities.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/ClientCapabilities.php deleted file mode 100644 index 9f1b490..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/ClientCapabilities.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/ClientCapabilities.php - */ -class ClientCapabilities -{ - /** - * The client supports workspace/xfiles requests - * - * @var bool|null - * @suppress PhanUnreferencedPublicProperty may use eventually - */ - public $xfilesProvider; - - /** - * The client supports textDocument/xcontent requests - * - * @var bool|null - * @suppress PhanUnreferencedPublicProperty may use eventually - */ - public $xcontentProvider; - - /** - * The client supports xcache/* requests - * - * @var bool|null - * @suppress PhanUnreferencedPublicProperty may use eventually - */ - public $xcacheProvider; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionContext.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionContext.php deleted file mode 100644 index ff5648c..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionContext.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Contains additional information about the context in which a completion request is triggered. - * @phan-file-suppress PhanWriteOnlyPublicProperty this is sent by the language client but we don't use this info - * @suppress PhanUnreferencedClass this is sent by language clients but we don't use the info. - */ -class CompletionContext -{ - /** - * How the completion was triggered. - * - * @var int|null - */ - public $triggerKind; - - /** - * The trigger character (a single character) that has trigger code complete. - * Is null if `triggerKind !== CompletionTriggerKind::TRIGGER_CHARACTER` - * - * @var string|null - */ - public $triggerCharacter; - - public function __construct(int $triggerKind = null, string $triggerCharacter = null) - { - $this->triggerKind = $triggerKind; - $this->triggerCharacter = $triggerCharacter; - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionItem.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionItem.php deleted file mode 100644 index b599e74..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionItem.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * A suggestion item for a completion suggested by the language server. - * @phan-file-suppress PhanWriteOnlyPublicProperty this is sent to the language client - */ -class CompletionItem -{ - /** - * The label of this completion item. By default - * also the text that is inserted when selecting - * this completion. - * - * @var string - */ - public $label; - - /** - * The kind of this completion item. Based of the kind - * an icon is chosen by the editor. - * - * @var int|null - */ - public $kind; - - /** - * A human-readable string with additional information - * about this item, like type or symbol information. - * - * @var string|null - */ - public $detail; - - /** - * A human-readable string that represents a doc-comment. - * - * @var string|null - */ - public $documentation; - - /** - * A string that should be used when comparing this item - * with other items. When `falsy` the label is used. - * - * @var string|null - */ - public $sortText; - - /** - * A string that should be used when filtering a set of - * completion items. When `falsy` the label is used. - * - * @var string|null - */ - public $filterText; - - /** - * A string that should be inserted in a document when selecting - * this completion. When `falsy` the label is used. - * - * @var string|null - * - * TODO: Switch to textEdit once the column is tracked, this is deprecated - */ - public $insertText; - - /** - * @param string|null $label - * @param int|null $kind - * @param string|null $detail - * @param string|null $documentation - * @param string|null $sortText - * @param string|null $filterText - * @param string|null $insertText - */ - public function __construct( - string $label = null, - int $kind = null, - string $detail = null, - string $documentation = null, - string $sortText = null, - string $filterText = null, - string $insertText = null - ) { - // @phan-suppress-next-line PhanPossiblyNullTypeMismatchProperty the '(at)var string' annotation is used by the RPC library - $this->label = $label; - $this->kind = $kind; - $this->detail = $detail; - $this->documentation = $documentation; - $this->sortText = $sortText; - $this->filterText = $filterText; - $this->insertText = $insertText; - } - - /** - * Create a CompletionItem from a serialized array $data - * @param array<string,mixed> $data - */ - public static function fromArray(array $data) : CompletionItem - { - return new self( - $data['label'], - $data['kind'], - $data['detail'], - $data['documentation'], - $data['sortText'], - $data['filterText'], - $data['insertText'] - ); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionItemKind.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionItemKind.php deleted file mode 100644 index 5428db7..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionItemKind.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * The kind of a completion entry. - * @phan-file-suppress PhanUnreferencedPublicClassConstant all constants are added for completeness - */ -abstract class CompletionItemKind -{ - const TEXT = 1; - const METHOD = 2; - const FUNCTION = 3; - const CONSTRUCTOR = 4; - const FIELD = 5; - const VARIABLE = 6; - const CLASS_ = 7; - const INTERFACE = 8; - const MODULE = 9; - const PROPERTY = 10; - const UNIT = 11; - const VALUE = 12; - const ENUM = 13; - const KEYWORD = 14; - const SNIPPET = 15; - const COLOR = 16; - const FILE = 17; - const REFERENCE = 18; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionList.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionList.php deleted file mode 100644 index f6410bb..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionList.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Represents a collection of completion items to be presented in - * the editor. - * @phan-file-suppress PhanWriteOnlyPublicProperty these are sent to the language client - */ -class CompletionList -{ - /** - * This list is not complete. Continuing to type should result in recomputing this - * list. - * - * @var bool - */ - public $isIncomplete; - - /** - * The completion items. - * - * @var CompletionItem[] - */ - public $items; - - /** - * @param CompletionItem[] $items The completion items. - * @param bool $isIncomplete This list is not complete. Continuing to type should result in recomputing this list. - */ - public function __construct(array $items = [], bool $isIncomplete = false) - { - $this->items = $items; - $this->isIncomplete = $isIncomplete; - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionOptions.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionOptions.php deleted file mode 100644 index 0198b15..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionOptions.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Completion options. - * - * @phan-file-suppress PhanWriteOnlyPublicProperty these are sent to the language client - */ -class CompletionOptions -{ - /** - * The server provides support to resolve additional information for a completion - * item. - * - * @var bool|null - */ - public $resolveProvider; - - /** - * The characters that trigger completion automatically. - * - * @var string[]|null - */ - public $triggerCharacters; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionTriggerKind.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionTriggerKind.php deleted file mode 100644 index 82454e7..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/CompletionTriggerKind.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * How a completion was triggered - * @suppress PhanUnreferencedPublicClassConstant these are listed for completeness - */ -class CompletionTriggerKind -{ - /** - * Completion was triggered by invoking it manually or by using the API. - */ - const INVOKED = 1; - - /** - * Completion was triggered by a trigger character. - */ - const TRIGGER_CHARACTER = 2; - - /** - * Completion was re-triggered as the current completion list is incomplete. - */ - const TRIGGER_FOR_INVALID_COMPLETIONS = 3; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Diagnostic.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Diagnostic.php deleted file mode 100644 index 2726793..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Diagnostic.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Represents a diagnostic, such as a compiler error or warning. Diagnostic objects are only valid in the scope of a - * resource. - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/Diagnostic.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class Diagnostic -{ - /** - * The range at which the message applies. - * - * @var Range - * @suppress PhanWriteOnlyPublicProperty this is serialized and sent to the client. - */ - public $range; - - /** - * The diagnostic's severity. Can be omitted. If omitted it is up to the - * client to interpret diagnostics as error, warning, info or hint. - * - * @var int|null - * @suppress PhanWriteOnlyPublicProperty this is serialized and sent to the client. - */ - public $severity; - - /** - * The diagnostic's code. Can be omitted. - * - * @var int|string|null - * @suppress PhanWriteOnlyPublicProperty this is serialized and sent to the client. - */ - public $code; - - /** - * A human-readable string describing the source of this - * diagnostic, e.g. 'typescript' or 'super lint'. - * - * @var string|null - * @suppress PhanWriteOnlyPublicProperty this is serialized and sent to the client. - */ - public $source; - - /** - * The diagnostic's message. - * - * @var string - * @suppress PhanWriteOnlyPublicProperty this is serialized and sent to the client. - */ - public $message; - - /** - * @param string $message The diagnostic's message - * @param Range $range The range at which the message applies - * @param int $code The diagnostic's code - * @param int $severity DiagnosticSeverity - * @param string $source A human-readable string describing the source of this diagnostic - * @suppress PhanPossiblyNullTypeMismatchProperty - * @suppress PhanTypeMismatchDeclaredParamNullable - */ - public function __construct(string $message = null, Range $range = null, int $code = null, int $severity = null, string $source = null) - { - $this->message = $message; - $this->range = $range; - $this->code = $code; - $this->severity = $severity; - $this->source = $source; - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/DiagnosticSeverity.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/DiagnosticSeverity.php deleted file mode 100644 index 2747356..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/DiagnosticSeverity.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/DiagnosticSeverity.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -abstract class DiagnosticSeverity -{ - /** - * Reports an error. - */ - const ERROR = 1; - - /** - * Reports a warning. - */ - const WARNING = 2; - - /** - * Reports an information. - */ - const INFORMATION = 3; - - /** - * Reports a hint. - * @suppress PhanUnreferencedPublicClassConstant unused, but documented - */ - const HINT = 4; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/FileChangeType.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/FileChangeType.php deleted file mode 100644 index dd6531c..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/FileChangeType.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * The file event type. Enum - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/FileChangeType.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -abstract class FileChangeType -{ - /** - * The file got created. - * @suppress PhanUnreferencedPublicClassConstant - */ - const CREATED = 1; - - /** - * The file got changed. - */ - const CHANGED = 2; - - /** - * The file got deleted. - */ - const DELETED = 3; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/FileEvent.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/FileEvent.php deleted file mode 100644 index 53994fb..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/FileEvent.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * An event describing a file change. - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/FileEvent.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class FileEvent -{ - /** - * The file's URI. - * - * @var string - */ - public $uri; - - /** - * The change type. - * - * @var int - */ - public $type; - - /** - * @param string $uri - * @param int $type - */ - public function __construct(string $uri, int $type) - { - $this->uri = $uri; - $this->type = $type; - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Hover.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Hover.php deleted file mode 100644 index 989f4db..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Hover.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * The result of a hover request. - * @phan-file-suppress PhanWriteOnlyPublicProperty - */ -class Hover -{ - /** - * @var MarkupContent The hover's content - */ - public $contents; - - /** - * @var Range|null an optional range inside a text document - * that is used to visualize a hover, e.g. by changing the background color. - */ - public $range; - - public function __construct(MarkupContent $contents, Range $range = null) - { - $this->contents = $contents; - $this->range = $range; - } - - /** - * Creates a Hover object from a serialized array - * - * @param array{contents:array,range?:array} $data - */ - public static function fromArray(array $data) : self - { - return new self( - MarkupContent::fromArray($data['contents']), - isset($data['range']) ? Range::fromArray($data['range']) : null - ); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/InitializeResult.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/InitializeResult.php deleted file mode 100644 index 55512ac..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/InitializeResult.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/InitializeResult.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class InitializeResult -{ - /** - * The capabilities the language server provides. - * - * @var ServerCapabilities - * @suppress PhanWriteOnlyPublicProperty (Used by AdvancedJsonRpc) - */ - public $capabilities; - - /** - * @param ?ServerCapabilities $capabilities - */ - public function __construct(ServerCapabilities $capabilities = null) - { - $this->capabilities = $capabilities ?? new ServerCapabilities(); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Location.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Location.php deleted file mode 100644 index f273c3d..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Location.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -use Phan\Config; -use Phan\Language\FileRef; -use Phan\LanguageServer\Utils; - -/** - * Represents a location inside a resource, such as a line inside a text file. - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/Location.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class Location -{ - /** - * @var string|null the URI of the location - */ - public $uri; - - /** - * @var Range|null the byte range of the location - */ - public $range; - - public function __construct(string $uri = null, Range $range = null) - { - $this->uri = $uri; - $this->range = $range; - } - - /** - * Callers should check $context->isPHPInternal() first - */ - public static function fromContext(FileRef $context) : Location - { - $path = Config::projectPath($context->getFile()); - $uri = Utils::pathToUri($path); - $range = Range::fromContextOnSingleLine($context); - return new self($uri, $range); - } - - /** - * Creates a Location from the unserialized data - * @param array{uri:string,range:array} $data - */ - public static function fromArray(array $data) : Location - { - return new self($data['uri'], Range::fromArray($data['range'])); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/MarkupContent.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/MarkupContent.php deleted file mode 100644 index 8bf04a9..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/MarkupContent.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * A `MarkupContent` literal represents a string value which content is interpreted base on its - * kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds. - * - * If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues. - * See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting - * - * Here is an example how such a string can be constructed using JavaScript / TypeScript: - * ```ts - * let markdown: MarkdownContent = { - * kind: MarkupKind.Markdown, - * value: [ - * '# Header', - * 'Some text', - * '```typescript', - * 'someCode();', - * '```' - * ].join('\n') - * }; - * ``` - * - * *Please Note* that clients might sanitize the return markdown. A client could decide to - * remove HTML from the markdown to avoid script execution. - * @phan-file-suppress PhanUnreferencedPublicClassConstant, PhanWriteOnlyPublicProperty - */ -class MarkupContent -{ - // MarkupKind values - const PLAINTEXT = 'plaintext'; - const MARKDOWN = 'markdown'; - - /** - * @var string the type of the Markup - */ - public $kind; - - /** - * @var string the content itself - */ - public $value; - - public function __construct(string $kind, string $value) - { - $this->kind = $kind; - $this->value = $value; - } - - /** - * Generates a MarkupContent from an unserialized data array. - * @param array{kind:string,value:string} $data - */ - public static function fromArray(array $data) : self - { - return new self( - $data['kind'], - $data['value'] - ); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Message.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Message.php deleted file mode 100644 index eaed98a..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Message.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -use AdvancedJsonRpc\Message as MessageBody; - -/** - * This represents a notification, request, or response from the Language Server Protocol, - * which uses JSON-RPC 2. - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/Message.php - */ -class Message -{ - /** - * @var ?\AdvancedJsonRpc\Message the optional decoded message body for this message - */ - public $body; - - /** - * @var array<string,string> the headers associated with this message (e.g. Content-Length) - */ - public $headers; - - /** - * Parses a message - * - * @param string $msg - * @return Message - */ - public static function parse(string $msg): Message - { - $obj = new self(); - $parts = \explode("\r\n", $msg); - // @phan-suppress-next-line PhanPossiblyFalseTypeArgument - $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 ?MessageBody $body - * @param array<string,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/phan/phan/src/Phan/LanguageServer/Protocol/Position.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Position.php deleted file mode 100644 index a4791e7..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Position.php +++ /dev/null @@ -1,94 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Position in a text document expressed as zero-based line and character offset. - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/Position.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class Position -{ - /** - * Line position in a document (zero-based). - * - * @var int - */ - public $line; - - /** - * Character offset on a line in a document (zero-based). - * - * @var int - */ - public $character; - - /** - * @suppress PhanPossiblyNullTypeMismatchProperty - */ - public function __construct(int $line = null, int $character = null) - { - $this->line = $line; - $this->character = $character; - } - - /** - * Compares this position to another position - * Returns - * - 0 if the positions match - * - a negative number if $this is before $position - * - a positive number otherwise - * - * @param Position $position - * @return int - */ - public function compare(Position $position): int - { - if ($this->line === $position->line && $this->character === $position->character) { - return 0; - } - - if ($this->line !== $position->line) { - return $this->line - $position->line; - } - - return $this->character - $position->character; - } - - /** - * Returns the offset of the position in a string - * - * @param string $content - * @return int - * @suppress PhanUnreferencedPublicMethod - */ - public function toOffset(string $content): int - { - $lines = \explode("\n", $content); - $slice = \array_slice($lines, 0, $this->line); - // TODO: array_sum should infer sum of ints is typically an int - return ((int)\array_sum(\array_map('strlen', $slice))) + \count($slice) + $this->character; - } - - /** - * Creates a Position from a serialized array $data - * @param array{line:int,character?:?int} $data - */ - public static function fromArray(array $data) : Position - { - return new self( - $data['line'], - $data['character'] ?? null - ); - } - - /** - * Used for debugging - */ - public function __toString() : string - { - return "$this->line:$this->character"; - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Range.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Range.php deleted file mode 100644 index c554ee8..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/Range.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -use Phan\Language\FileRef; - -/** - * A range in a text document expressed as (zero-based) start and end positions. - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/Range.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class Range -{ - /** - * The range's start position. - * - * @var Position - */ - public $start; - - /** - * The range's end position. - * - * @var Position - */ - public $end; - - /** @suppress PhanPossiblyNullTypeMismatchProperty anything useful will be non-null */ - public function __construct(Position $start = null, Position $end = null) - { - $this->start = $start; - $this->end = $end; - } - - /** - * Checks if a position is within the range - * - * @param Position $position - * @return bool - * @suppress PhanUnreferencedPublicMethod - */ - public function includes(Position $position): bool - { - // @phan-suppress-next-line PhanPossiblyNonClassMethodCall - return $this->start->compare($position) <= 0 && $this->end->compare($position) >= 0; - } - - /** - * Creates a placeholder Range which spans the entire line of source code of $context. - */ - public static function fromContextOnSingleLine(FileRef $context) : Range - { - $lineno = $context->getLineNumberStart(); - return new Range(new Position($lineno - 1, 0), new Position($lineno, 0)); - } - - /** - * Create a range from a serialized array - * @param array{start:array,end:array} $data - */ - public static function fromArray(array $data) : Range - { - return new self( - Position::fromArray($data['start']), - Position::fromArray($data['end']) - ); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/SaveOptions.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/SaveOptions.php deleted file mode 100644 index 7c62763..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/SaveOptions.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * TODO: Contribute to php-language-server? - * Based on SaveOptions description in - * https://microsoft.github.io/language-server-protocol/specification - */ -class SaveOptions -{ - /** - * @var bool|null - * The client is supposed to include the content on save. - * @suppress PhanWriteOnlyPublicProperty (used by AdvancedJsonRpc) - */ - public $includeText; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/ServerCapabilities.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/ServerCapabilities.php deleted file mode 100644 index 2b4c098..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/ServerCapabilities.php +++ /dev/null @@ -1,138 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Based on https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/ServerCapabilities.php - * @phan-file-suppress PhanWriteOnlyPublicProperty (used by AdvancedJsonRpc) - */ -class ServerCapabilities -{ - /** - * Defines how text documents are synced. - * - * @var TextDocumentSyncOptions|int|null - */ - public $textDocumentSync; - - /** - * TODO: Make the server provide completion support - * - * @var CompletionOptions|null - */ - public $completionProvider; - - /** - * The server provides goto definition support. - * - * @var bool|null - */ - public $definitionProvider; - - /** - * The server provides goto definition support. - * - * @var bool|null - */ - public $typeDefinitionProvider; - - /** - * The server provides hover support. - * - * @var bool|null - */ - public $hoverProvider; - - /** - * The server provides find references support. - * - * @var bool|null - */ - // public $referencesProvider; - - /** - * The server provides document highlight support. - * - * @var bool|null - */ - // public $documentHighlightProvider; - - /** - * The server provides document symbol support. - * - * @var bool|null - */ - // public $documentSymbolProvider; - - /** - * The server provides workspace symbol support. - * - * @var bool|null - */ - // public $workspaceSymbolProvider; - - /** - * The server provides code actions. - * - * @var bool|null - */ - //public $codeActionProvider; - - /** - * The server provides code lens. - * - * @var CodeLensOptions|null - */ - //public $codeLensProvider; - - /** - * The server provides document formatting. - * - * @var bool|null - */ - //public $documentFormattingProvider; - - /** - * The server provides document range formatting. - * - * @var bool|null - */ - //public $documentRangeFormattingProvider; - - /** - * The server provides document formatting on typing. - * - * @var DocumentOnTypeFormattingOptions|null - */ - //public $documentOnTypeFormattingProvider; - - /** - * The server provides rename support. - * - * @var bool|null - */ - //public $renameProvider; - - /** - * The server provides workspace references exporting support. - * - * @var bool|null - */ - //public $xworkspaceReferencesProvider; - - /** - * The server provides extended text document definition support. - * - * @var bool|null - */ - // public $xdefinitionProvider; - - /** - * TODO: implement this? - * The server provides workspace dependencies support. - * - * @var bool|null - */ - //public $dependenciesProvider; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentContentChangeEvent.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentContentChangeEvent.php deleted file mode 100644 index cd5a632..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentContentChangeEvent.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * An event describing a change to a text document. If range and rangeLength are omitted - * the new text is considered to be the full content of the document. - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/TextDocumentContentChangeEvent.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class TextDocumentContentChangeEvent -{ - /** - * The range of the document that changed. - * - * @var Range|null - * @suppress PhanUnreferencedPublicProperty (We don't support partial updates, yet) - */ - public $range; - - /** - * The length of the range that got replaced. - * - * @var int|null - * @suppress PhanUnreferencedPublicProperty (We don't support partial updates, yet) - */ - public $rangeLength; - - /** - * The new text of the document. - * - * @var string - * @suppress PhanReadOnlyPublicProperty (we don't have tests setting this, yet) - */ - public $text; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentIdentifier.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentIdentifier.php deleted file mode 100644 index 50d72d7..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentIdentifier.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/TextDocumentIdentifier.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class TextDocumentIdentifier -{ - /** - * The text document's URI. - * - * @var string|null - */ - public $uri; - - /** - * @param string|null $uri The text document's URI. - */ - public function __construct(string $uri = null) - { - $this->uri = $uri; - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentItem.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentItem.php deleted file mode 100644 index e6c27f5..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentItem.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * An item to transfer a text document from the client to the server. - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/TextDocumentItem.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class TextDocumentItem -{ - /** - * The text document's URI. - * - * @var string - * @suppress PhanReadOnlyPublicProperty - */ - public $uri; - - /** - * The text document's language identifier. - * - * @var string - * @suppress PhanUnreferencedPublicProperty (Part of the protocol but Phan doesn't use it) - */ - public $languageId; - - /** - * The version number of this document (it will strictly increase after each - * change, including undo/redo). - * - * @var int - * @suppress PhanUnreferencedPublicProperty (Part of the protocol but Phan doesn't use it) - */ - public $version; - - /** - * The content of the opened text document. - * - * @var string - * @suppress PhanReadOnlyPublicProperty - */ - public $text; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentSyncKind.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentSyncKind.php deleted file mode 100644 index 7031b0b..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentSyncKind.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Defines how the host (editor) should sync document changes to the language server. - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/TextDocumentSyncKind.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -abstract class TextDocumentSyncKind -{ - /** - * Documents should not be synced at all. - * @suppress PhanUnreferencedPublicClassConstant (unused) - */ - const NONE = 0; - - /** - * Documents are synced by always sending the full content of the document. - */ - const FULL = 1; - - /** - * Documents are synced by sending the full content on open. After that only - * incremental updates to the document are sent. - * @suppress PhanUnreferencedPublicClassConstant (unused) - */ - const INCREMENTAL = 2; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentSyncOptions.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentSyncOptions.php deleted file mode 100644 index 446ed71..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/TextDocumentSyncOptions.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * TODO: Contribute to php-language-server? - * Based on TextDocumentSyncOptions description in - * https://microsoft.github.io/language-server-protocol/specification - */ -class TextDocumentSyncOptions -{ - /** - * @var bool|null - * Open and close notifications are sent to the server. - * @suppress PhanWriteOnlyPublicProperty this is serialized and sent to the client - */ - public $openClose; - - /** - * @var int|null - * Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full - * and TextDocumentSyncKindIncremental. - * @suppress PhanWriteOnlyPublicProperty this is serialized and sent to the client - */ - public $change; - - /** - * @var bool|null - * Will save notifications get sent to the server. - * @suppress PhanUnreferencedPublicProperty this is serialized and sent to the client - */ - public $willSave; - - /** - * @var bool|null - * Will save wait until requests get sent to the server. - * @suppress PhanUnreferencedPublicProperty this is serialized and sent to the client - */ - public $willSaveWaitUntil; - - /** - * @var SaveOptions|null - * Save notifications are sent to the server. - */ - public $save; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/VersionedTextDocumentIdentifier.php b/vendor/phan/phan/src/Phan/LanguageServer/Protocol/VersionedTextDocumentIdentifier.php deleted file mode 100644 index aafb966..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Protocol/VersionedTextDocumentIdentifier.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Protocol; - -/** - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Protocol/VersionedTextDocumentIdentifier.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class VersionedTextDocumentIdentifier extends TextDocumentIdentifier -{ - /** - * The version number of this document. - * - * @var int - * @suppress PhanReadOnlyPublicProperty - */ - public $version; -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/ProtocolReader.php b/vendor/phan/phan/src/Phan/LanguageServer/ProtocolReader.php deleted file mode 100644 index 2c62ecf..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/ProtocolReader.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer; - -use Sabre\Event\EmitterInterface; - -/** - * Must emit a "message" event with a Protocol\Message object as parameter - * when a message comes in - * - * Must emit a "close" event when the stream closes - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/ProtocolReader.php - * See ../../../LICENSE.LANGUAGE_SERVER - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -interface ProtocolReader extends EmitterInterface -{ - /** - * @return void - */ - public function stopAcceptingNewRequests(); -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/ProtocolStreamReader.php b/vendor/phan/phan/src/Phan/LanguageServer/ProtocolStreamReader.php deleted file mode 100644 index 1adb294..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/ProtocolStreamReader.php +++ /dev/null @@ -1,142 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer; - -use AdvancedJsonRpc\Message as MessageBody; -use Exception; -use Phan\LanguageServer\Protocol\Message; -use Sabre\Event\Emitter; -use Sabre\Event\Loop; - -/** - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/ProtocolStreamReader.php - */ -class ProtocolStreamReader extends Emitter implements ProtocolReader -{ - const PARSE_HEADERS = 1; - const PARSE_BODY = 2; - - /** @var resource the input stream resource for data from the client. */ - private $input; - - /** - * 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 (self::PARSE_*) the state of the parsing state machine */ - private $parsing_mode = self::PARSE_HEADERS; - /** @var string the intermediate state of the buffer */ - private $buffer = ''; - /** @var string[] the headers that were parsed during the PARSE_HEADERS phase */ - private $headers = []; - /** @var int the content-length that we are expecting */ - private $content_length; - /** @var bool was a close notification sent to the listeners already? */ - private $did_emit_close = false; - - /** - * @param resource $input - */ - public function __construct($input) - { - $this->input = $input; - - $this->on('close', function () { - Loop\removeReadStream($this->input); - }); - - Loop\addReadStream($this->input, function () { - if (\feof($this->input)) { - // If stream_select reported a status change for this stream, - // but the stream is EOF, it means it was closed. - $this->emitClose(); - return; - } - 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->readMessages(); - if ($emitted_messages > 0) { - $this->emit('readMessageGroup'); - } - }); - } - - /** - * @return int - */ - private function readMessages() : int - { - $emitted_messages = 0; - while (($c = \fgetc($this->input)) !== false && $c !== '') { - $this->buffer .= $c; - 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']; - $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; - } - Logger::logRequest($this->headers, $this->buffer); - // 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]); - 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; - } - - /** - * @return void - */ - public function stopAcceptingNewRequests() - { - $this->is_accepting_new_requests = false; - } - - /** - * @return void - */ - private function emitClose() - { - if ($this->did_emit_close) { - return; - } - $this->did_emit_close = true; - $this->emit('close'); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/ProtocolStreamWriter.php b/vendor/phan/phan/src/Phan/LanguageServer/ProtocolStreamWriter.php deleted file mode 100644 index 807ec83..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/ProtocolStreamWriter.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer; - -use Phan\LanguageServer\Protocol\Message; -use Sabre\Event\Loop; -use Sabre\Event\Promise; - -/** - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/ProtocolStreamWriter.php - */ -class ProtocolStreamWriter implements ProtocolWriter -{ - /** - * @var resource $output - */ - private $output; - - /** - * @var array<int,array{message:string,promise:Promise}> $messages - */ - private $messages = []; - - /** - * @param resource $output - */ - public function __construct($output) - { - $this->output = $output; - } - - /** - * {@inheritdoc} - */ - public function write(Message $msg): Promise - { - // if the message queue is currently empty, register a write handler. - if (!$this->messages) { - Loop\addWriteStream($this->output, function () { - $this->flush(); - }); - } - - Logger::logResponse($msg->headers, (string)$msg->body); - - $promise = new Promise(); - $this->messages[] = [ - 'message' => (string)$msg, - 'promise' => $promise - ]; - return $promise; - } - - /** - * Writes pending messages to the output stream. - * - * @return void - */ - private function flush() - { - $keepWriting = true; - while ($keepWriting) { - $message = $this->messages[0]['message']; - $promise = $this->messages[0]['promise']; - - $bytesWritten = @\fwrite($this->output, $message); - - if ($bytesWritten > 0) { - $message = \substr($message, $bytesWritten); - } - - // Determine if this message was completely sent - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - if (\strlen($message) === 0) { - \array_shift($this->messages); - - // This was the last message in the queue, remove the write handler. - if (\count($this->messages) === 0) { - Loop\removeWriteStream($this->output); - $keepWriting = false; - } - - $promise->fulfill(); - } else { - $this->messages[0]['message'] = $message; - $keepWriting = false; - } - } - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/ProtocolWriter.php b/vendor/phan/phan/src/Phan/LanguageServer/ProtocolWriter.php deleted file mode 100644 index bdddd78..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/ProtocolWriter.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer; - -use Phan\LanguageServer\Protocol\Message; -use Sabre\Event\Promise; - -/** - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/ProtocolWriter.php - */ -interface ProtocolWriter -{ - /** - * Sends a Message to the client - * - * @param Message $msg - * @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/phan/phan/src/Phan/LanguageServer/Server/TextDocument.php b/vendor/phan/phan/src/Phan/LanguageServer/Server/TextDocument.php deleted file mode 100644 index 8670f60..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Server/TextDocument.php +++ /dev/null @@ -1,284 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\LanguageServer\Server; - -use InvalidArgumentException; -use Phan\Config; -use Phan\LanguageServer\FileMapping; -use Phan\LanguageServer\LanguageClient; -use Phan\LanguageServer\LanguageServer; -use Phan\LanguageServer\Logger; -use Phan\LanguageServer\Protocol\CompletionContext; -use Phan\LanguageServer\Protocol\Position; -use Phan\LanguageServer\Protocol\TextDocumentContentChangeEvent; -use Phan\LanguageServer\Protocol\TextDocumentIdentifier; -use Phan\LanguageServer\Protocol\TextDocumentItem; -use Phan\LanguageServer\Protocol\VersionedTextDocumentIdentifier; -use Phan\LanguageServer\Utils; -use Sabre\Event\Promise; - -/** - * Provides method handlers for all textDocument/* methods - * Source: Based on https://github.com/felixfbecker/php-language-server/blob/master/src/Server/TextDocument.php - * @phan-file-suppress PhanPossiblyNullTypeArgument, PhanPossiblyNullTypeArgumentInternal - */ -class TextDocument -{ - /** - * The language client object to call methods on the client - * - * @var LanguageClient - */ - protected $client; - - /** - * The language client object to call methods on the server - * - * @var LanguageServer - */ - protected $server; - - /** - * Maps paths of files on disk to overrides. - * @var FileMapping - */ - protected $file_mapping; - - /** - * @param LanguageClient $client - * @param FileMapping $file_mapping - */ - public function __construct( - LanguageClient $client, - LanguageServer $server, - FileMapping $file_mapping - ) { - $this->client = $client; - $this->server = $server; - $this->file_mapping = $file_mapping; - } - - - /** - * The document symbol request is sent from the client to the server to list all symbols found in a given text - * document. - * FIXME: reintroduce when support is added back - * - * @param TextDocumentIdentifier $textDocument - * @return Promise <SymbolInformation[]> - */ - /* - public function documentSymbol(TextDocumentIdentifier $textDocument): Promise - { - return $this->documentLoader->getOrLoad($textDocument->uri)->then(function (PhpDocument $document) { - $symbols = []; - foreach ($document->getDefinitions() as $fqn => $definition) { - $symbols[] = $definition->symbolInformation; - } - return $symbols; - }); - } - */ - - /** - * The document open notification is sent from the client to the server to signal newly opened text documents. The - * document's truth is now managed by the client and the server must not try to read the document's truth using the - * document's uri. - * - * @param TextDocumentItem $textDocument The document that was opened. - * @return void - * @suppress PhanUnreferencedPublicMethod called by client via AdvancedJsonRpc - */ - public function didOpen(TextDocumentItem $textDocument) - { - Logger::logInfo("Called textDocument/didOpen, uri={$textDocument->uri}"); - try { - Utils::pathToUri(Utils::uriToPath($textDocument->uri)); - } catch (InvalidArgumentException $e) { - Logger::logError(\sprintf("Language server could not understand uri %s in %s: %s\n", $textDocument->uri, __METHOD__, $e->getMessage())); - return; - } - // TODO: Look into replacing this call with the normalized URI. - $this->file_mapping->addOverrideURI($textDocument->uri, $textDocument->text); - $this->server->analyzeURIAsync($textDocument->uri); - - //$document = $this->documentLoader->open($textDocument->uri, $textDocument->text); - // TODO: make this trigger re-analysis - // TODO: Check based on parse and analyze directories and Phan supported file extensions if this file affects Phan's analysis. - // TODO: Add functions to quickly check if a relative/absolute path is within the parse or analysis list of a project - // TODO: Maybe allow reloading .phan/config, at least the files and directories to parse/analyze - } - - /** - * The document save notification is sent from the client to the server when the document was saved in the client. - * TODO: Should this use willSave instead - * TODO: Why is this not triggering on Ctrl+S - * - * @param VersionedTextDocumentIdentifier $textDocument - * @param string|null $text (NOTE: can't use ?T here) - * @return void - * @suppress PhanUnreferencedPublicMethod called by client via AdvancedJsonRpc - */ - public function didSave(TextDocumentIdentifier $textDocument, string $text = null) - { - Logger::logInfo("Called textDocument/didSave, uri={$textDocument->uri} len(text)=" . \strlen($text ?? '')); - try { - Utils::pathToUri(Utils::uriToPath($textDocument->uri)); - } catch (InvalidArgumentException $e) { - Logger::logError(\sprintf("Language server could not understand uri %s in %s: %s\n", $textDocument->uri, __METHOD__, $e->getMessage())); - return; - } - // TODO: Look into replacing this with the normalized URI - $this->file_mapping->addOverrideURI($textDocument->uri, $text); - $this->server->analyzeURIAsync($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 - * @return void - * @suppress PhanUnreferencedPublicMethod called by client via AdvancedJsonRpc - */ - public function didChange(VersionedTextDocumentIdentifier $textDocument, array $contentChanges) - { - foreach ($contentChanges as $change) { - $this->file_mapping->addOverrideURI($textDocument->uri, $change->text); - } - Logger::logInfo("Called textDocument/didChange, uri={$textDocument->uri} version={$textDocument->version}"); - if (Config::getValue('language_server_analyze_only_on_save')) { - // Track the change to the file, but don't trigger analysis. - return; - } - $this->server->analyzeURIAsync($textDocument->uri); - // TODO: Maybe allow reloading .phan/config, at least the files and directories to parse/analyze - } - - /** - * The document close notification is sent from the client to the server when the document got closed in the client. - * The document's truth now exists where the document's uri points to (e.g. if the document's uri is a file uri the - * truth now exists on disk). - * - * @param TextDocumentIdentifier $textDocument The document that was closed - * @return void - * @suppress PhanUnreferencedPublicMethod called by client via AdvancedJsonRpc - */ - public function didClose(TextDocumentIdentifier $textDocument) - { - Logger::logInfo("Called textDocument/didClose, uri={$textDocument->uri}"); - try { - $uri = Utils::pathToUri(Utils::uriToPath($textDocument->uri)); - } catch (InvalidArgumentException $e) { - Logger::logError(\sprintf("Language server could not understand uri %s in %s: %s\n", $textDocument->uri, __METHOD__, $e->getMessage())); - return; - } - $this->client->textDocument->publishDiagnostics($uri, []); - // After publishing diagnostics, remove the override - $this->file_mapping->removeOverrideURI($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 - * @return ?Promise <Location|Location[]|null> - * @suppress PhanUnreferencedPublicMethod called by client via AdvancedJsonRpc - */ - public function definition(TextDocumentIdentifier $textDocument, Position $position) - { - Logger::logInfo("Called textDocument/definition, uri={$textDocument->uri} position={$position->line}:{$position->character}"); - try { - $uri = Utils::pathToUri(Utils::uriToPath($textDocument->uri)); - } catch (InvalidArgumentException $e) { - Logger::logError(\sprintf("Language server could not understand uri %s in %s: %s\n", $textDocument->uri, __METHOD__, $e->getMessage())); - return null; - } - return $this->server->awaitDefinition($uri, $position, false); - } - - /** - * 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 - * @return ?Promise <Location|Location[]|null> - * @suppress PhanUnreferencedPublicMethod called by client via AdvancedJsonRpc - */ - public function typeDefinition(TextDocumentIdentifier $textDocument, Position $position) - { - Logger::logInfo("Called textDocument/typeDefinition, uri={$textDocument->uri} position={$position->line}:{$position->character}"); - try { - $uri = Utils::pathToUri(Utils::uriToPath($textDocument->uri)); - } catch (InvalidArgumentException $e) { - Logger::logError(\sprintf("Language server could not understand uri %s in %s: %s\n", $textDocument->uri, __METHOD__, $e->getMessage())); - return null; - } - return $this->server->awaitDefinition($uri, $position, true); - } - - /** - * Implements textDocument/hover, to show a preview of the element being hovered over. - * - * TODO: This can probably be optimized for references to constants, static methods, or tokens that obviously have no corresponding element. - * TODO: Implement support for the cancel request LSP operation? - * - * @param TextDocumentIdentifier $textDocument @phan-unused-param - * @param Position $position @phan-unused-param - * @suppress PhanUnreferencedPublicMethod called by client via AdvancedJsonRpc - * @return ?Promise - */ - public function hover(TextDocumentIdentifier $textDocument, Position $position) - { - // Some clients (e.g. emacs-lsp, the last time I checked) - // don't respect the server's reported hover capability, and send this unconditionally. - if (!Config::getValue('language_server_enable_hover')) { - // Placeholder to avoid a performance degradation on clients - // that aren't respecting the configuration. - // - // (computing hover response may or may not slow down those clients) - return null; - } - try { - $uri = Utils::pathToUri(Utils::uriToPath($textDocument->uri)); - } catch (InvalidArgumentException $e) { - Logger::logError(\sprintf("Language server could not understand uri %s in %s: %s\n", $textDocument->uri, __METHOD__, $e->getMessage())); - return null; - } - return $this->server->awaitHover($uri, $position); - } - - /** - * Implements textDocument/completion, to compute completion items at a given cursor position. - * - * TODO: Implement support for the cancel request LSP operation? - * - * @param TextDocumentIdentifier $textDocument @phan-unused-param - * @param Position $position @phan-unused-param - * @suppress PhanUnreferencedPublicMethod called by client via AdvancedJsonRpc - * @return ?Promise <CompletionItem[]|CompletionList> - */ - public function completion(TextDocumentIdentifier $textDocument, Position $position, CompletionContext $context = null) - { - if (!Config::getValue('language_server_enable_completion')) { - // Placeholder to avoid a performance degradation on clients - // that aren't respecting the configuration. - // - // (computing completion response may or may not slow down those clients) - return null; - } - try { - $uri = Utils::pathToUri(Utils::uriToPath($textDocument->uri)); - } catch (InvalidArgumentException $e) { - Logger::logError(\sprintf("Language server could not understand uri %s in %s: %s\n", $textDocument->uri, __METHOD__, $e->getMessage())); - return null; - } - // Workaround: Phan needs the cursor to be on the character that's within the expression in order to select it. - // So shift the cursor left by one. - $position->character = \max(0, $position->character - 1); - return $this->server->awaitCompletion($uri, $position, $context); - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Server/Workspace.php b/vendor/phan/phan/src/Phan/LanguageServer/Server/Workspace.php deleted file mode 100644 index 21ef9b3..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Server/Workspace.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\LanguageServer\Server; - -use Phan\LanguageServer\FileMapping; -use Phan\LanguageServer\LanguageClient; -use Phan\LanguageServer\LanguageServer; -use Phan\LanguageServer\Protocol\FileChangeType; -use Phan\LanguageServer\Protocol\FileEvent; -use Phan\LanguageServer\Utils; - -/** - * Provides method handlers for all workspace/* methods - * - * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/Server/Workspace.php - * See ../../../../LICENSE.LANGUAGE_SERVER - */ -class Workspace -{ - /** - * @var LanguageClient represents the client of this language server. - */ - public $client; - - /** - * @var LanguageServer represents the LSP related functionality of the Phan Language Server. - */ - public $server; - - /** - * @var FileMapping this tracks the state of files opened and edited in the client. - * - * Any entries in this object should override the state of the files on disk. - */ - public $file_mapping; - - /** - * @param LanguageClient $client LanguageClient instance used to signal updated results - * FIXME: Rewrite to avoid static methods? - */ - public function __construct( - LanguageClient $client, - LanguageServer $server, - FileMapping $file_mapping - ) { - $this->client = $client; - $this->server = $server; - $this->file_mapping = $file_mapping; - } - - /** - * The watched files notification is sent from the client to the server when the client detects changes to files watched by the language client. - * - * @param FileEvent[] $changes - * @return void - * @suppress PhanUnreferencedPublicMethod called by client via AdvancedJsonRpc - */ - public function didChangeWatchedFiles(array $changes) - { - // invalidate Phan's cache for these files if changed, added, or modified outside of the IDE - foreach ($changes as $change) { - $this->file_mapping->removeOverrideURI($change->uri); - } - // Trigger diagnostics. TODO: Is that necessary? - foreach ($changes as $change) { - if ($change->type === FileChangeType::DELETED) { - $this->client->textDocument->publishDiagnostics(Utils::pathToUri(Utils::uriToPath($change->uri)), []); - } - } - // TODO: more than one file - foreach ($changes as $change) { - // TODO: What about CREATED? Will that be emitted for renaming files? - if ($change->type === FileChangeType::CHANGED) { - $uri = $change->uri; - $this->server->analyzeURIAsync($uri); - } - } - } - - /** - * no-op for now. Stop the JSON RPC2 framework from warning about this method being undefined. - * TODO: Define this so that Phan can respond to changes in client configuration. - * @suppress PhanUnreferencedPublicMethod called by client via AdvancedJsonRpc - * - * @param array $settings @phan-unused-param - * @phan-param array<string,mixed> $settings @phan-unused-param NOTE: reflection-docblock does not support generic arrays - * @return void (unimplemented) - */ - public function didChangeConfiguration($settings) - { - } -} diff --git a/vendor/phan/phan/src/Phan/LanguageServer/Utils.php b/vendor/phan/phan/src/Phan/LanguageServer/Utils.php deleted file mode 100644 index 68cc804..0000000 --- a/vendor/phan/phan/src/Phan/LanguageServer/Utils.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\LanguageServer; - -use InvalidArgumentException; -use Sabre\Event\Loop; -use Throwable; - -/** - * Utils that are useful for implementing a language server. - * - * Taken from code by Felix Frederick Becker - * - * Source: https://github.com/felixfbecker/php-language-server - * - * - Mostly from that project's src/utils.php - */ -class Utils -{ - /** - * Causes the sabre event loop to crash, for debugging. - * - * E.g. this is called if there is an unrecoverable error elsewhere. - * - * @return void - * @suppress PhanUnreferencedPublicMethod - */ - public static function crash(Throwable $err) - { - Loop\nextTick(static function () use ($err) { - // @phan-suppress-next-line PhanThrowTypeAbsent this is meant to crash the loop for debugging. - throw $err; - }); - } - - /** - * Transforms an absolute file path into a URI as used by the language server protocol. - * - * @param string $filepath - * @return string - */ - public static function pathToUri(string $filepath) : string - { - // TODO: Make the return value of str_replace depend on the param value - $filepath = \trim(\str_replace('\\', '/', $filepath), '/'); - $parts = \explode('/', $filepath); - // Don't %-encode the colon after a Windows drive letter - $first = (string)\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 an absolute file path - * - * @param string $uri - * @return string - * @throws InvalidArgumentException - */ - public static function uriToPath(string $uri) : string - { - $fragments = \parse_url($uri); - if (!is_array($fragments) || !isset($fragments['scheme']) || $fragments['scheme'] !== 'file') { - throw new InvalidArgumentException("Not a valid file URI: $uri"); - } - $filepath = \urldecode($fragments['path']); - if (\DIRECTORY_SEPARATOR === "\\") { - $filepath = self::normalizePathFromWindowsURI($filepath); - } - return $filepath; - } - - /** - * Converts "/C:/something/else.php" to "C:\something\else.php" - * - * Does nothing if not an absolute path. - */ - public static function normalizePathFromWindowsURI(string $filepath) : string - { - if (!\preg_match('@[a-zA-Z]:[\\\\/]@', $filepath)) { - return $filepath; - } - if ($filepath[0] === '/') { - $filepath = (string)\substr($filepath, 1); - } - return \str_replace('/', '\\', $filepath); - } -} diff --git a/vendor/phan/phan/src/Phan/Library/Cache.php b/vendor/phan/phan/src/Phan/Library/Cache.php deleted file mode 100644 index 70ce84a..0000000 --- a/vendor/phan/phan/src/Phan/Library/Cache.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * A cache from string keys to object instances - * - * @template T - */ -interface Cache -{ - /** - * Retrieve a copy of the value from the cache, or return null - * - * @return ?T - */ - public function getIfExists(string $key); - - /** - * Save a copy of $value to the cache. - * - * @param T $value - * @return bool true if successfully saved - */ - public function save(string $key, $value) : bool; -} diff --git a/vendor/phan/phan/src/Phan/Library/ConversionSpec.php b/vendor/phan/phan/src/Phan/Library/ConversionSpec.php deleted file mode 100644 index 17d490c..0000000 --- a/vendor/phan/phan/src/Phan/Library/ConversionSpec.php +++ /dev/null @@ -1,132 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * An object representing a conversion specifier of a format string, such as "%1$d". - */ -class ConversionSpec -{ - /** @var string Original text of the directive */ - public $directive; - /** @var ?int Which argument this refers to, starting from 1 */ - public $position; - /** @var string Character used for padding (commonly confused with $position) */ - public $padding_char; - /** @var string indicates which side is used for alignment */ - public $alignment; - /** @var string minimum width of output */ - public $width; // Minimum width of output. - /** @var string Type to print (s,d,f,etc.) */ - public $arg_type; - - /** - * Create a conversion specifier from a match. - * @param array{0:string,1:string,2:string,3:string,4:string,5:string,6:string} $match groups in a match. - */ - protected function __construct(array $match) - { - list($this->directive, $position_str, $this->padding_char, $this->alignment, $this->width, $unused_precision, $this->arg_type) = $match; - if ($position_str !== "") { - $this->position = \intval(\substr($position_str, 0, -1)); - } - } - - // A padding string regex may be a space or 0. - // Alternate padding specifiers may be specified by prefixing it with a single quote. - const PADDING_STRING_REGEX_PART = '[0 ]?|\'.'; - - /** - * Based on https://secure.php.net/manual/en/function.sprintf.php - */ - const FORMAT_STRING_INNER_REGEX_PART = - '%' // Every format string begins with a percent - . '(\d+\$)?' // Optional n$ position specifier must go immediately after percent - . '(' . self::PADDING_STRING_REGEX_PART . ')' // optional padding specifier - . '([+-]?)' // optional alignment specifier - . '(\d*)' // optional width specifier - . '(\.\d*)?' // Optional precision specifier in the form of a period followed by an optional decimal digit string - . '([bcdeEfFgGosuxX])'; // A type specifier - - - const FORMAT_STRING_REGEX = '/%%|' . self::FORMAT_STRING_INNER_REGEX_PART . '/'; - - /** - * Compute the number of additional arguments expected when sprintf is called - * with a format string of $fmt_str. - * @param string $fmt_str - */ - public static function computeExpectedArgumentCount($fmt_str) : int - { - $result = 0; - foreach (self::extractAll($fmt_str) as $i => $_) { - $result = \max($result, $i); - } - return $result; - } - - /** - * Extract a list of directives from a format string. - * @param string $fmt_str a format string to extract directives from. - * @return array<int,array<int,ConversionSpec>> array(int position => array of ConversionSpec referring to arg at that position) - */ - public static function extractAll($fmt_str) : array - { - // echo "format is $fmt_str\n"; - $directives = []; - \preg_match_all(self::FORMAT_STRING_REGEX, (string) $fmt_str, $matches, \PREG_SET_ORDER); - $unnamed_count = 0; - foreach ($matches as $match) { - if ($match[0] === '%%') { - continue; - } - $directive = new self($match); - if (!isset($directive->position)) { - $directive->position = ++$unnamed_count; - } - $directives[$directive->position][] = $directive; - } - \ksort($directives); - return $directives; - } - - /** - * @return string an unambiguous way of referring to this conversion spec. - */ - public function toCanonicalString() : string - { - return '%' . $this->position . '$' . $this->padding_char . $this->alignment . $this->width . $this->arg_type; - } - - /** - * @return string the conversion spec if the width was used as a position instead. - */ - public function toCanonicalStringWithWidthAsPosition() : string - { - return '%' . $this->width . '$' . $this->padding_char . $this->alignment . $this->arg_type; - } - const ARG_TYPE_LOOKUP = [ - 'b' => 'int', - 'c' => 'int', - 'd' => 'int', - 'e' => 'float', - 'E' => 'float', - 'f' => 'float', - 'F' => 'float', - 'g' => 'float', - 'G' => 'float', - 'o' => 'int', - 's' => 'string', - 'u' => 'int', - 'x' => 'int', - 'X' => 'int', - ]; - - /** - * @return string the name of the union type expected for the arg for this conversion spec - */ - public function getExpectedUnionTypeName() : string - { - return self::ARG_TYPE_LOOKUP[$this->arg_type] ?? 'string'; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/DiskCache.php b/vendor/phan/phan/src/Phan/Library/DiskCache.php deleted file mode 100644 index c4951cd..0000000 --- a/vendor/phan/phan/src/Phan/Library/DiskCache.php +++ /dev/null @@ -1,117 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -use InvalidArgumentException; - -/** - * A cache from string keys to object instances, with objects saved as files on disk. - * - * @implements Cache<T> - * @template T - */ -class DiskCache implements Cache -{ - /** @var string absolute path to a temporary directory with serialized data */ - private $directory; - - /** @var string */ - private $suffix; - - /** @var class-string<T> */ - private $class_name; - - /** @var bool */ - private $use_igbinary; - - /** @var ?bool */ - private $directory_exists; - - /** - * @param class-string<T> $class_name - */ - public function __construct(string $directory, string $suffix, $class_name, bool $use_igbinary) - { - $this->directory = $directory; - $this->suffix = $suffix; - $this->class_name = $class_name; - $this->use_igbinary = $use_igbinary; - } - - /** - * Returns the path to the file used to cache $cache_key - */ - public function getPath(string $cache_key) : string - { - return $this->directory . '/' . $cache_key . ($this->use_igbinary ? '-ig' : '') . $this->suffix; - } - - /** - * Retrieve a copy of the value from the disk cache, or return null - * - * @return ?T - */ - public function getIfExists(string $key) - { - $path = $this->getPath($key); - if (!\file_exists($path)) { - return null; - } - $contents = \file_get_contents($path); - if (!$contents) { - return null; - } - if ($this->use_igbinary) { - if (\strncmp($contents, "\x00\x00\x00\x02", 4) !== 0) { - \fwrite(\STDERR, "Saw invalid igbinary serialized data at $path: wrong header\n"); - return null; - } - return \igbinary_unserialize($contents); - } else { - return \unserialize($contents); - } - } - - private function ensureDirectoryExists() : bool - { - if ($this->directory_exists === null) { - $this->directory_exists = false; - if (!\is_dir($this->directory)) { - if (!\mkdir($this->directory, 0755, true)) { - \fwrite(\STDERR, "Failed to create AST cache directory $this->directory\n"); - return false; - } - } - $this->directory_exists = true; - } - return $this->directory_exists ?? false; - } - - /** - * Save an entry with cache key $key and value $value to disk - * @param T $value - * @return bool true if successfully saved - */ - public function save(string $key, $value) : bool - { - if (!$this->ensureDirectoryExists()) { - return false; - } - - $class_name = $this->class_name; - if (!($value instanceof $class_name)) { - throw new InvalidArgumentException("Expected to cache an instance of $class_name, got " . (\is_object($value) ? \get_class($value) : \gettype($value))); - } - if ($this->use_igbinary) { - $contents = \igbinary_serialize($value); - } else { - $contents = \serialize($value); - } - if (!$contents) { - return false; - } - $path = $this->getPath($key); - // XXX save and rename to be atomic - return \file_put_contents($path, $contents) !== false; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/FileCache.php b/vendor/phan/phan/src/Phan/Library/FileCache.php deleted file mode 100644 index 1561ff1..0000000 --- a/vendor/phan/phan/src/Phan/Library/FileCache.php +++ /dev/null @@ -1,118 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -use RuntimeException; - -/** - * An LRU cache for the contents of files (FileCacheEntry), and data structures derived from contents of files. - */ -final class FileCache -{ - const MINIMUM_CACHE_SIZE = 20; - /** - * @var int - Maximum cache size - */ - private static $max_size; - - /** - * @var array<string,FileCacheEntry> - An ordered php associative array, with most recently used at the end of the array. - */ - private static $cache_entries = []; - - /** - * Sets the cache size to $max_size (or self::MINIMUM_CACHE_SIZE if that's larger). - * Entries will be removed until there are $max_size or fewer entries. - */ - public static function setMaxCacheSize(int $max_size) - { - self::$max_size = \max($max_size, self::MINIMUM_CACHE_SIZE); - while (\count(self::$cache_entries) > self::$max_size) { - \array_shift(self::$cache_entries); - } - } - - /** - * Adds an entry recording that $file_name has contents $file_contents, - * overwriting any previous entries - * - * @return FileCacheEntry - */ - public static function addEntry(string $file_name, string $contents) : FileCacheEntry - { - $old_entry = self::$cache_entries[$file_name] ?? null; - if ($old_entry) { - unset(self::$cache_entries[$file_name]); - if ($old_entry->getContents() === $contents) { - // If the contents didn't change, keep the cache entry and move it to the end (Most recently used). - self::$cache_entries[$file_name] = $old_entry; - return $old_entry; - } - } - $entry = new FileCacheEntry($contents); - self::$cache_entries[$file_name] = $entry; - if (\count(self::$cache_entries) > self::$max_size) { - // Ensure that the size <= self::$max_size. Remove the least recently used entry (front of list). - \array_shift(self::$cache_entries); - } - return $entry; - } - - /** - * @return ?FileCacheEntry if the entry exists in cache, return it. - * Otherwise, return null. - */ - public static function getEntry(string $file_name) - { - $entry = self::$cache_entries[$file_name] ?? null; - if ($entry) { - // Move the entry to the end (most recently used) and return it. - unset(self::$cache_entries[$file_name]); - self::$cache_entries[$file_name] = $entry; - return $entry; - } - return null; - } - - /** - * @param string $file_name an absolute path to a file on disk - * @return FileCacheEntry This will load the file from the filesystem if it could not be found. - * @throws RuntimeException if the file could not be loaded - */ - public static function getOrReadEntry(string $file_name) : FileCacheEntry - { - $entry = self::getEntry($file_name); - if ($entry !== null) { - return $entry; - } - if (!\file_exists($file_name)) { - throw new RuntimeException("FileCache::getOrReadEntry: unable to find '$file_name'\n"); - } - if (!\is_readable($file_name)) { - throw new RuntimeException("FileCache::getOrReadEntry: unable to read '$file_name'\n"); - } - $contents = \file_get_contents($file_name); - if (!\is_string($contents)) { - throw new RuntimeException("FileCache::getOrReadEntry: file_get_contents failed for '$file_name'\n"); - } - $entry = self::addEntry($file_name, $contents); - return $entry; - } - - /** - * Clear the cache (E.g. after pausing, accepting a daemon mode request, then resuming) - * @return void - */ - public static function clear() - { - self::$cache_entries = []; - } - - /** - * @return array<int,string> list of file paths with most recently used entries at the end. - */ - public static function getCachedFileList() : array - { - return \array_keys(self::$cache_entries); - } -} diff --git a/vendor/phan/phan/src/Phan/Library/FileCacheEntry.php b/vendor/phan/phan/src/Phan/Library/FileCacheEntry.php deleted file mode 100644 index 6624905..0000000 --- a/vendor/phan/phan/src/Phan/Library/FileCacheEntry.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -use Phan\Plugin\Internal\IssueFixingPlugin\FileContents; - -/** - * Represents the cached contents of a given file, and various ways to access that file. - * - * This is used under the circumstances such as the following: - * - * - Checking for (at)phan-suppress-line annotations at runtime - Many checks to the same file will often be in cache - * - Checking the tokens/text of the file for purposes such as checking for expressions that are incompatible in PHP5. - * - `--automatic-fix` - */ -class FileCacheEntry extends FileContents -{ -} diff --git a/vendor/phan/phan/src/Phan/Library/Hasher.php b/vendor/phan/phan/src/Phan/Library/Hasher.php deleted file mode 100644 index 2241185..0000000 --- a/vendor/phan/phan/src/Phan/Library/Hasher.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * An interface to map strings to integers representing groups. - * getGroup() is called exactly once on each string to be hashed. - */ -interface Hasher -{ - /** - * Returns an integer between 0 and the number of groups - 1 - */ - public function getGroup(string $key) : int; - - /** - * @return void - * If there is any state, clear it. - */ - public function reset(); -} diff --git a/vendor/phan/phan/src/Phan/Library/Hasher/Consistent.php b/vendor/phan/phan/src/Phan/Library/Hasher/Consistent.php deleted file mode 100644 index b958dfc..0000000 --- a/vendor/phan/phan/src/Phan/Library/Hasher/Consistent.php +++ /dev/null @@ -1,108 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library\Hasher; - -use Phan\Library\Hasher; - -/** - * Hasher implementation mapping keys to sequential groups (first key to 0, second key to 1, looping back to 0) - * getGroup() is called exactly once on each string to be hashed. - * See https://en.wikipedia.org/wiki/Consistent_hashing - */ -class Consistent implements Hasher -{ - /** A larger number means a more balanced distribution. */ - const VIRTUAL_COPY_COUNT = 16; - /** i.e. (1 << 30) */ - const MAX = 0x40000000; - /** @var array<int,int> - Sorted list of hash values, for binary search. */ - protected $hash_ring_ids; - /** @var array<int,int> - Groups corresponding to hash values in hash_ring_ids */ - protected $hash_ring_groups; - - public function __construct(int $group_count) - { - $map = self::generateMap($group_count); - $hash_ring_ids = []; - $hash_ring_groups = []; - foreach ($map as $key => $group) { - $hash_ring_ids[] = $key; - $hash_ring_groups[] = $group; - } - // ... and make the map wrap around. - $hash_ring_ids[] = self::MAX - 1; - $hash_ring_groups[] = \reset($map) ?: 0; - - $this->hash_ring_ids = $hash_ring_ids; - $this->hash_ring_groups = $hash_ring_groups; - } - - /** - * @return array<int,int> maps points in the field to the corresponding group (for consistent hashing) - */ - private static function generateMap(int $group_count) - { - $map = []; - for ($group = 0; $group < $group_count; $group++) { - foreach (self::getHashesForGroup($group) as $hash) { - $map[$hash] = $group; - } - } - \ksort($map); - return $map; - } - /** - * Do a binary search in the consistent hashing ring to find the group. - * @return int - an integer between 0 and $this->group_count - 1, inclusive - */ - public function getGroup(string $key) : int - { - $search_hash = self::generateKeyHash($key); - $begin = 0; - $end = \count($this->hash_ring_ids) - 1; - while ($begin <= $end) { - $pos = $begin + (($end - $begin) >> 1); - $cur_val = $this->hash_ring_ids[$pos]; - if ($search_hash > $cur_val) { - $begin = $pos + 1; - } else { - $end = $pos - 1; - } - } - // Postcondition: $this->hash_ring_ids[$begin] >= $search_hash, and $this->hash_ring_ids[$begin - 1] does not exist or is less than $search_hash. - - // Fetch the group corresponding to that hash in the hash ring. - return $this->hash_ring_groups[$begin]; - } - - /** - * No-op reset - * @return void - */ - public function reset() - { - } - - /** - * @return array<int,int> A list of VIRTUAL_COPY_COUNT hashes for group $i in the consistent hash ring. - */ - public static function getHashesForGroup(int $group) : array - { - $hashes = []; - for ($i = 0; $i < self::VIRTUAL_COPY_COUNT; $i++) { - $hashes[$i] = self::generateKeyHash("${i}@$group"); - } - return $hashes; - } - - /** - * Returns a 30-bit signed integer (i.e. in the range [0, self::MAX-1]) - * Designed to work on 32-bit php installations as well. - */ - public static function generateKeyHash(string $material) : int - { - $bits = \md5($material); - $result = ((\intval($bits[0], 16) & 3) << 28) ^ \intval(\substr($bits, 1, 7), 16); - return $result; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/Hasher/Sequential.php b/vendor/phan/phan/src/Phan/Library/Hasher/Sequential.php deleted file mode 100644 index 2c13f3c..0000000 --- a/vendor/phan/phan/src/Phan/Library/Hasher/Sequential.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library\Hasher; - -use Phan\Library\Hasher; - -/** - * Hasher implementation mapping keys to sequential groups (first key to 0, second key to 1, looping back to 0) - * getGroup() is called exactly once on each string to be hashed. - */ -class Sequential implements Hasher -{ - /** @var int an incrementing counter mapping the first key to group 0, the second key to 1, etc. (modulo group_count) */ - protected $counter; - /** @var int the total number of groups. */ - protected $group_count; - - public function __construct(int $group_count) - { - $this->counter = 1; - $this->group_count = $group_count; - } - - /** - * @param string $key (Used by sibling class Consistent) (@phan-unused-param) - * @return int - an integer between 0 and $this->group_count - 1, inclusive - */ - public function getGroup(string $key) : int - { - return ($this->counter++) % $this->group_count; - } - - /** - * Resets counter - * @return void - */ - public function reset() - { - $this->counter = 1; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/Map.php b/vendor/phan/phan/src/Phan/Library/Map.php deleted file mode 100644 index 4d7936d..0000000 --- a/vendor/phan/phan/src/Phan/Library/Map.php +++ /dev/null @@ -1,126 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -use Closure; -use SplObjectStorage; - -/** - * A map from object to object with key comparisons - * based on spl_object_hash. - * - * @template K - * @template V - * @suppress PhanTemplateTypeNotDeclaredInFunctionParams - */ -class Map extends SplObjectStorage -{ - - /** - * We redefine the key to be the actual key rather than - * the index of the key - * - * @return K - * @suppress PhanParamSignatureMismatchInternal - This is deliberately changing the phpdoc return type. - */ - public function key() - { - return parent::current(); - } - - /** - * We redefine the current value to the current value rather - * than the current key - * @return V - */ - public function current() - { - return $this->offsetGet(parent::current()); - } - - /** - * @template KNew - * @template VNew - * @param Closure(object):KNew $key_closure - * A closure that maps each key of this map - * to a new key - * - * @param Closure(object):VNew $value_closure - * A closure that maps each value of this map - * to a new value. - * - * @return Map<KNew,VNew> - * A new map containing the mapped keys and - * values - */ - public function keyValueMap(Closure $key_closure, Closure $value_closure) - { - $map = new Map(); - foreach ($this as $key => $value) { - // TODO: Don't infer $map[$key] = ...; as making $map possibly an array - $map->offsetSet($key_closure($key), $value_closure($value)); - } - return $map; - } - - /** - * @return Map<K,V> - * A new map with each key and value cloned - * @suppress PhanUnreferencedPublicMethod possibly useful but currently unused - */ - public function deepCopy() : Map - { - $clone = - /** - * @param K|V $element - * @return K|V - */ - static function ($element) { - return clone($element); - }; - return $this->keyValueMap($clone, $clone); - } - - /** - * @return Map<K,V> - * A new map with each value cloned (keys remain uncloned) - */ - public function deepCopyValues() : Map - { - $map = new Map(); - foreach ($this as $key => $value) { - $map->offsetSet($key, clone($value)); - } - return $map; - } - - /** - * @return Set<V> - * A new set with the unique values from this map. - * Precondition: values of this map are objects. - * @suppress PhanUnreferencedPublicMethod possibly useful but currently unused - */ - public function valueSet() : Set - { - $set = new Set(); - foreach ($this as $value) { - $set->attach($value); - } - return $set; - } - - /** - * @return Set<K> - * A new set with the unique keys from this map. - * Precondition: values of this set are objects. - * @suppress PhanUnreferencedPublicMethod possibly useful but currently unused - */ - public function keySet() : Set - { - $set = new Set(); - foreach ($this as $key => $_) { - $set->attach($key); - } - return $set; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/None.php b/vendor/phan/phan/src/Phan/Library/None.php deleted file mode 100644 index 3755cdb..0000000 --- a/vendor/phan/phan/src/Phan/Library/None.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -use Exception; - -/** - * This represents the absence of a value in an Option. - * - * @inherits Option<null> - */ -class None extends Option -{ - /** - * Get a new instance of nothing - */ - public function __construct() - { - } - - /** - * @return bool - */ - public function isDefined() : bool - { - return false; - } - - /** - * @template E - * @param E $else - * @return E - * @suppress PhanParamSignatureMismatch - */ - public function getOrElse($else) - { - return $else; - } - - /** - * @return null - * @throws Exception to indicate that get() was called without checking for a value. - */ - public function get() - { - throw new Exception("Cannot call get on None"); - } - - /** - * @return string - * A string representation of this object - */ - public function __tostring() : string - { - return 'None()'; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/Option.php b/vendor/phan/phan/src/Phan/Library/Option.php deleted file mode 100644 index 46c16bb..0000000 --- a/vendor/phan/phan/src/Phan/Library/Option.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * An Option is a safer equivalent to nullable values, indicating that callers should check for absences of values. - * This demonstrates Phan's template support. - * - * It is either `None` (analogous to `null`) or `Some<T>` (analogous to `T`). - * - * This was introduced prior to Phan's support for nullable types and strict type checking. - * - * @template T - * The type of the element - */ -abstract class Option -{ - /** - * If this has a value, return that value. - * Otherwise, return $else - * - * @param T $else - * @return T - */ - abstract public function getOrElse($else); - - /** - * @return bool true if this is defined (i.e. this is an instance of Some) - */ - abstract public function isDefined() : bool; - - /** - * Gets the value, or throws if this was an instance of None. - * - * The caller should check if $this->isDefined() - * - * @return T - */ - abstract public function get(); -} diff --git a/vendor/phan/phan/src/Phan/Library/Paths.php b/vendor/phan/phan/src/Phan/Library/Paths.php deleted file mode 100644 index 560f0ad..0000000 --- a/vendor/phan/phan/src/Phan/Library/Paths.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * Utilities for working with paths - */ -class Paths -{ - /** - * @return bool - * Is the passed in path already an absolute path? - */ - public static function isAbsolutePath(string $path) : bool - { - $first_character = \substr($path, 0, 1); - // Make sure it's actually relative - if (\DIRECTORY_SEPARATOR === $first_character || '/' === $first_character) { - return true; - } - // Check for absolute path in windows, e.g. C:\ - if (\DIRECTORY_SEPARATOR === "\\" && - \strlen($path) > 3 && - \ctype_alpha($first_character) && - $path[1] === ':' && - \strspn($path, '/\\', 2, 1)) { - return true; - } - return false; - } - - - /** - * Returns $path as an absolute path using $absolute_path as the starting folder. - * Returns $path unmodified if $path is already absolute. - * - * @param string $absolute_directory the path to use when converting $path from a relative path to an absolute path. - * @param string $path a relative or absolute path - */ - public static function toAbsolutePath(string $absolute_directory, string $path) : string - { - if (Paths::isAbsolutePath($path)) { - return $path; - } - $path = \preg_replace('@^(\.[\\\\/]+)+@', '', $path); - if ($path === '.') { - return $absolute_directory; - } - - return $absolute_directory . \DIRECTORY_SEPARATOR . $path; - } - - /** - * Returns JSON encoded $path, without escaping unicode or "/" - */ - public static function escapePathForIssue(string $path) : string - { - // If possible, use json_encode. - // If json_encode failed (e.g. invalid unicode), then use var_export - return \json_encode($path, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE) ?: \var_export($path, true); - } -} diff --git a/vendor/phan/phan/src/Phan/Library/RAII.php b/vendor/phan/phan/src/Phan/Library/RAII.php deleted file mode 100644 index 7e1c095..0000000 --- a/vendor/phan/phan/src/Phan/Library/RAII.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -use Closure; - -/** - * Implements Resource Acquisition Is Initialization. - * A defined but unused variable in a function/method scope can be used to create this, - * and the passed in finalizer closure will be called when that function/method returns. - * - * Note: This assumes that the garbage collector eagerly calls __destruct. - * This may not be the case in alternate PHP implementations. - * - * @see https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization - */ -class RAII -{ - /** @var null|Closure():void this is called exactly once, either during __destruct (when the variable goes out of scope) or manually */ - private $finalizer; - - /** - * @param Closure():void $finalizer - Should not throw an exception. It may be called in __destruct() - */ - public function __construct(Closure $finalizer) - { - $this->finalizer = $finalizer; - } - - /** - * Calls the finalizer, unless it has already been called. - * @return void - */ - public function callFinalizerOnce() - { - if ($this->finalizer) { - ($this->finalizer)(); - $this->finalizer = null; - } - } - - public function __destruct() - { - $this->callFinalizerOnce(); - } -} diff --git a/vendor/phan/phan/src/Phan/Library/RegexKeyExtractor.php b/vendor/phan/phan/src/Phan/Library/RegexKeyExtractor.php deleted file mode 100644 index 5180ad4..0000000 --- a/vendor/phan/phan/src/Phan/Library/RegexKeyExtractor.php +++ /dev/null @@ -1,217 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -use InvalidArgumentException; -use function strlen; -use function strpos; - -/** - * This contains a heuristic for guessing the offsets and groups that are possible for a given regular expression. - * - * This may not be aware of all edge cases. - */ -class RegexKeyExtractor -{ - /** - * @var string the inner pattern of the regular expression - */ - private $pattern; - - /** - * @var int the byte offset in $this->pattern - */ - private $offset = 0; - - /** - * @var array<string|int,true> the offsets or names of patterns - */ - private $matches = []; - - private function __construct(string $pattern) - { - $this->pattern = $pattern; - } - - /** - * @param string|mixed $regex - * @return array<string|int,true> the best guess at the keys that would be parsed into $matches by preg_match, based on the regex and flags passed to preg_match - * @throws InvalidArgumentException if the regex could not be parsed by these heuristics - */ - public static function getKeys($regex) : array - { - if (!\is_string($regex)) { - throw new InvalidArgumentException("regex is not a string"); - } - $inner_pattern = self::extractInnerRegexPattern($regex); - - $matcher = new self($inner_pattern . ')'); - $matcher->extractGroup(); - $expected_length = strlen($inner_pattern); - $parsed_length = $matcher->offset - 1; - - if ($parsed_length !== $expected_length) { - throw new InvalidArgumentException("Only matched $parsed_length of $expected_length for '$inner_pattern'"); - } - return $matcher->getMatchKeys(); - } - - private function consumeUntil(string $next_char) - { - $end = strpos($this->pattern, $next_char, $this->offset); - if ($end === false) { - throw new InvalidArgumentException('Unparseable'); - } - $this->offset = $end + 1; - } - - /** - * @throws InvalidArgumentException if an invalid pattern was seen - */ - private function extractGroup() - { - $pattern = $this->pattern; - if ($pattern[$this->offset] === '?') { - switch ($pattern[++$this->offset] ?? ':') { - case ':': - break; - case "'": - // NOTE: Subpattern names must not be the empty strings, and must start with non-digits, - // PregRegexPlugin would tell the user that. - // Could add that check. - $old_offset = $this->offset++; - $this->consumeUntil("'"); - // Add both a positional subgroup and a named subgroup - $this->matches[\substr($pattern, $old_offset + 1, $this->offset - $old_offset - 2)] = true; - $this->matches[] = true; - break; - case '<': - $old_offset = $this->offset; - $this->consumeUntil(">"); - // Add both a positional subgroup and a named subgroup - $this->matches[\substr($pattern, $old_offset + 1, $this->offset - $old_offset - 2)] = true; - $this->matches[] = true; - break; - case 'P': - if (($pattern[++$this->offset] ?? '') !== '<') { - throw new InvalidArgumentException('Unparseable named pattern'); - } - $old_offset = $this->offset; - $this->consumeUntil('>'); - // Add both a positional subgroup and a named subgroup - $this->matches[\substr($pattern, $old_offset + 1, $this->offset - $old_offset - 2)] = true; - $this->matches[] = true; - break; - // Internal option setting - case '-': - case 'i': - case 'm': - case 's': - case 'x': - case 'U': - case 'X': - case 'J': - // Comments - case '#': - $this->consumeUntil(')'); - return; - case '|': - $this->extractCombinationGroup(); - return; - default: - throw new InvalidArgumentException('Support for complex patterns is not implemented'); - } - } else { - $this->matches[] = true; - } - - $len = strlen($pattern); - while ($this->offset < $len) { - $c = $pattern[$this->offset++]; - if ($c === '\\') { - // Skip over escaped characters - $this->offset++; - continue; - } - if ($c === ')') { - // We have reached the end of this group - return; - } - if ($c === '(') { - // TODO: Handle ?: and the general case - - $this->extractGroup(); - } - } - throw new InvalidArgumentException('Reached the end of the pattern before extracting the group'); - } - - private function extractCombinationGroup() - { - $original_matches = $this->matches; - $possible_matches = $original_matches; - $pattern = $this->pattern; - $len = strlen($pattern); - while ($this->offset < $len) { - $c = $pattern[$this->offset++]; - if ($c === '\\') { - // Skip over escaped characters - $this->offset++; - continue; - } - if ($c === '|') { - $possible_matches += $this->matches; - $this->matches = $original_matches; - continue; - } - if ($c === ')') { - $possible_matches += $this->matches; - $this->matches = $possible_matches; - // We have reached the end of this group - return; - } - if ($c === '(') { - // TODO: Handle ?: and the general case - - $this->extractGroup(); - } - } - } - - /** @return array<int|string,true> */ - private function getMatchKeys() : array - { - return $this->matches; - } - - - /** - * Extracts everything between the pattern delimiters. - * @throws InvalidArgumentException if the length mismatched - */ - private static function extractInnerRegexPattern(string $pattern) : string - { - $pattern = \trim($pattern); - - $start_chr = $pattern[0] ?? '/'; - // @phan-suppress-next-line PhanParamSuspiciousOrder this is deliberate - $i = \stripos('({[', $start_chr); - if ($i !== false) { - $end_chr = ')}]'[$i]; - } else { - $end_chr = $start_chr; - } - // TODO: Reject characters that preg_match would reject - $end_pos = \strrpos($pattern, $end_chr); - if ($end_pos === false) { - throw new InvalidArgumentException("Failed to find match for '$start_chr'"); - } - - $inner = (string)\substr($pattern, 1, $end_pos - 1); - if ($i !== false) { - // Unescape '/x\/y/' as 'x/y' - $inner = \str_replace('\\' . $start_chr, $start_chr, $inner); - } - return $inner; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/Set.php b/vendor/phan/phan/src/Phan/Library/Set.php deleted file mode 100644 index 728c855..0000000 --- a/vendor/phan/phan/src/Phan/Library/Set.php +++ /dev/null @@ -1,249 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -use Closure; -use TypeError; - -/** - * A set of objects supporting union and - * intersection - * - * @template T - * - * TODO: Start tracking that SplObjectStorage<T,T> extends ArrayAccess<T,T> - * - * - Afterwards, remove this boilerplate overriding methods of SplObjectStorage<T,T> - * - * @method attach(T $object,mixed $data = null):void - * @method detach(T $object):void - * @method offsetExists(T $object):bool - * @method offsetGet(T $object ):bool - * @method offsetSet(T $object,mixed $data = null):void - * @method offsetUnset(T $object):void - * - * @phan-file-suppress PhanParamSignatureMismatchInternal, PhanParamSignaturePHPDocMismatchHasParamType for these comment method overrides - * TODO: Make suppressions in the class doc comment work for magic methods. - */ -class Set extends \SplObjectStorage -{ - - /** - * @param iterable<T> $element_iterator - * An optional set of items to add to the set - */ - public function __construct($element_iterator = null) - { - foreach ($element_iterator ?? [] as $element) { - $this->attach($element); - } - } - - /** - * @return array<T> - * An array of all elements in the set is returned - */ - public function toArray() : array - { - return \iterator_to_array($this); - } - - /** - * @param Set<T> $other - * A set of items to intersect with this set - * - * @return Set<T> - * A new set which contains only items in this - * Set and the given Set - */ - public function intersect(Set $other) : Set - { - $set = new Set(); - foreach ($this as $element) { - if ($other->contains($element)) { - $set->attach($element); - } - } - return $set; - } - - /** - * @param Set<T>[] $set_list - * A list of sets to intersect - * - * @return Set<T> - * A new Set containing only the elements that appear in - * all parameters - * @suppress PhanUnreferencedPublicMethod potentially useful but currently unused - */ - public static function intersectAll(array $set_list) : Set - { - if (\count($set_list) === 0) { - return new Set(); - } - - $intersected_set = \array_shift($set_list); - if (!$intersected_set instanceof Set) { - // impossible - throw new TypeError('Saw non-Set in $set_list'); - } - foreach ($set_list as $set) { - $intersected_set = $intersected_set->intersect($set); - } - - return $intersected_set; - } - - /** - * @param Set<T> $other - * A set of items to union with this set - * - * @return Set<T> - * A new set which contains only items in this - * Set and the given Set. - * - * @suppress PhanUnreferencedPublicMethod - */ - public function union(Set $other) : Set - { - $set = new Set(); - $set->addAll($this); - $set->addAll($other); - return $set; - } - - /** - * @param Set<T>[] $set_list - * A list of sets to intersect - * - * @return Set<T> - * A new Set containing any element that appear in - * any parameters - * @suppress PhanUnreferencedPublicMethod potentially useful but currently unused - */ - public static function unionAll(array $set_list) : Set - { - if (\count($set_list) === 0) { - return new Set(); - } - - $union_set = \array_shift($set_list); - if (!$union_set instanceof Set) { - // impossible - throw new TypeError('Saw non-Set in $set_list'); - } - foreach ($set_list as $set) { - $union_set = $union_set->union($set); - } - - return $union_set; - } - - - /** - * @param T[] $element_list - * @return bool - * True if this set contains any elements in the given list - * @suppress PhanUnreferencedPublicMethod potentially useful but currently unused - */ - public function containsAny(array $element_list) : bool - { - foreach ($element_list as $element) { - if ($this->contains($element)) { - return true; - } - } - - return false; - } - - /** - * @param Closure(T):bool $closure - * A closure taking a set element that returns a boolean - * for which true will cause the element to be retained - * and false will cause the element to be removed - * - * @return Set<T> - * A new set for which all elements when passed to the given - * closure return true - * @suppress PhanUnreferencedPublicMethod potentially useful but currently unused - */ - public function filter(Closure $closure) - { - $set = new Set(); - foreach ($this as $element) { - if ($closure($element)) { - $set->attach($element); - } - } - return $set; - } - - /** - * @template TNew - * @param Closure(T):TNew $closure - * A closure that maps each element of this set - * to a new element - * - * @return Set<TNew> - * A new set containing the mapped values - */ - public function map(Closure $closure) : Set - { - $set = new Set(); - foreach ($this as $element) { - $set->attach($closure($element)); - } - return $set; - } - - /** - * @return Set<T> - * A new set with each element cloned - */ - public function deepCopy() : Set - { - return $this->map( - /** - * @param T $element - * @return object - */ - static function ($element) { - return clone($element); - } - ); - } - - /** - * @param Closure(object):bool $closure - * A closure that takes an element and returns a boolean - * TODO: Make this be Closure(T):bool and read the types from the template - * - * @return T|false - * The first element for which the given closure returns - * true is returned or false if no elements pass the - * given closure - * @suppress PhanUnreferencedPublicMethod potentially useful but currently unused - */ - public function find(Closure $closure) - { - foreach ($this as $element) { - if ($closure($element)) { - return $element; - } - } - return false; - } - - /** - * @return string - * A string representation of this set for use in - * debugging - */ - public function __toString() : string - { - return '[' - . \implode(',', \array_map('strval', \iterator_to_array($this))) - . ']'; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/Some.php b/vendor/phan/phan/src/Phan/Library/Some.php deleted file mode 100644 index 459a6c6..0000000 --- a/vendor/phan/phan/src/Phan/Library/Some.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * `Some<T>` is a sub-type of `Option<T>` representing an option with a value. - * @see Option - * - * @template T - * The type of the element. Should implement __toString() - * - * @inherits Option<T> - * phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore - */ -class Some extends Option -{ - /** @var T the value wrapped by this Some<T>*/ - private $_; - - /** - * @param T $_ - */ - public function __construct($_) - { - $this->_ = $_; - } - - /** - * @return bool - */ - public function isDefined() : bool - { - return true; - } - - /** - * @return T - */ - public function get() - { - return $this->_; - } - - /** - * @param T $else used in the None sibling class (@phan-unused-param) - * @return T - */ - public function getOrElse($else) - { - return $this->_; - } - - /** - * @return string - * @suppress PhanTypeSuspiciousStringExpression this should be used with T where __toString() is defined. - * A string representation of this object - */ - public function __toString() : string - { - return 'Some(' . $this->_ . ')'; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/StderrLogger.php b/vendor/phan/phan/src/Phan/Library/StderrLogger.php deleted file mode 100644 index 4a706fc..0000000 --- a/vendor/phan/phan/src/Phan/Library/StderrLogger.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -use Psr\Log\LoggerInterface; -use Psr\Log\LoggerTrait; - -/** - * A PSR-3 logger for the composer xdebug handler - */ -class StderrLogger implements LoggerInterface -{ - use LoggerTrait; - - /** - * @param string $level - * @param string $message - * @param array<string,mixed> $unused_context - * @return void - * - * @override - */ - public function log($level, $message, array $unused_context = []) - { - \fprintf(\STDERR, "[%s] %s\n", $level, $message); - } -} diff --git a/vendor/phan/phan/src/Phan/Library/StringUtil.php b/vendor/phan/phan/src/Phan/Library/StringUtil.php deleted file mode 100644 index 4719ba1..0000000 --- a/vendor/phan/phan/src/Phan/Library/StringUtil.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Library; - -use Phan\AST\ASTReverter; - -/** - * StringUtil contains methods to simplify working with strings in Phan and its plugins. - */ -class StringUtil -{ - /** - * Encode a scalar value in a compact, unambiguous representation for emitted issues. - * The encoder used by encodeValue may change. - * This aims to fit on a single line. - * - * @param string|int|float|bool|null $value - */ - public static function encodeValue($value) : string - { - if (\is_string($value) && \preg_match('/([\0-\15\16-\37])/', $value)) { - // Use double quoted strings if this contains newlines, tabs, control characters, etc. - return '"' . ASTReverter::escapeInnerString($value, '"') . '"'; - } - return \var_export($value, true); - } - - /** - * JSON encodes a value - Guaranteed to return a string. - * @param string|int|float|bool|null|array|object $value - */ - public static function jsonEncode($value) : string - { - $result = \json_encode($value, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE | \JSON_PARTIAL_OUTPUT_ON_ERROR); - return \is_string($result) ? $result : '(invalid data)'; - } - - /** - * Encode a list of values in a compact, unambiguous representation for emitted issues. - * @param array<int,string|int|float|bool> $values - */ - public static function encodeValueList(string $separator, array $values) : string - { - return \implode( - $separator, - \array_map([self::class, 'encodeValue'], $values) - ); - } - - /** - * Coerce $str to valid utf-8 - */ - public static function asUtf8(string $str) : string - { - return \mb_convert_encoding($str, 'UTF-8', 'UTF-8') ?: $str; - } - - /** - * Coerce $str to valid utf-8 and replace newlines with placeholders - */ - public static function asSingleLineUtf8(string $str) : string - { - return \str_replace(["\n", "\r"], "�", self::asUtf8($str)); - } -} diff --git a/vendor/phan/phan/src/Phan/Library/Tuple.php b/vendor/phan/phan/src/Phan/Library/Tuple.php deleted file mode 100644 index a17690b..0000000 --- a/vendor/phan/phan/src/Phan/Library/Tuple.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * An abstract tuple. - */ -abstract class Tuple -{ - const ARITY = 0; - - /** - * @return int - * The arity of this tuple - * @suppress PhanUnreferencedPublicMethod potentially used in the future - */ - public function arity() : int - { - return static::ARITY; - } - - /** - * @return array{} - * An array of all elements in this tuple. - */ - abstract public function toArray() : array; -} diff --git a/vendor/phan/phan/src/Phan/Library/Tuple1.php b/vendor/phan/phan/src/Phan/Library/Tuple1.php deleted file mode 100644 index 2f2e092..0000000 --- a/vendor/phan/phan/src/Phan/Library/Tuple1.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * A tuple of 1 element. - * - * @template T0 - * The type of element zero - * phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore - */ -class Tuple1 extends Tuple -{ - /** @var int */ - const ARITY = 1; - - /** @var T0 element 0 of this tuple (0-based index) */ - public $_0; - - /** - * @param T0 $_0 - * The 0th element - */ - public function __construct($_0) - { - $this->_0 = $_0; - } - - /** - * @return int - * The arity of this tuple - */ - public function arity() : int - { - return static::ARITY; - } - - /** - * @return array{0:T0} - * An array of all elements in this tuple. - */ - public function toArray() : array - { - return [ - $this->_0, - ]; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/Tuple2.php b/vendor/phan/phan/src/Phan/Library/Tuple2.php deleted file mode 100644 index d395993..0000000 --- a/vendor/phan/phan/src/Phan/Library/Tuple2.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * A tuple of 2 elements. - * - * @template T0 - * The type of element zero - * - * @template T1 - * The type of element one - * - * @inherits Tuple1<T0> - * phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore - */ -class Tuple2 extends Tuple1 -{ - /** @var int */ - const ARITY = 2; - - /** @var T1 element 1 of this tuple (0-based index) */ - public $_1; - - /** - * @param T0 $_0 - * The 0th element - * - * @param T1 $_1 - * The 1st element - */ - public function __construct($_0, $_1) - { - $this->_0 = $_0; - $this->_1 = $_1; - } - - /** - * @return array{0:T0,1:T1} - * An array of all elements in this tuple. - */ - public function toArray() : array - { - return [ - $this->_0, - $this->_1, - ]; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/Tuple3.php b/vendor/phan/phan/src/Phan/Library/Tuple3.php deleted file mode 100644 index 24239e3..0000000 --- a/vendor/phan/phan/src/Phan/Library/Tuple3.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * A tuple of 3 elements. - * - * @template T0 - * The type of element zero - * - * @template T1 - * The type of element one - * - * @template T2 - * The type of element one - * - * @inherits Tuple2<T0, T1> - * - * phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore - */ -class Tuple3 extends Tuple2 -{ - /** @var int */ - const ARITY = 3; - - /** @var T2 element 2 of this tuple (0-based index) */ - public $_2; - - /** - * @param T0 $_0 - * The 0th element - * - * @param T1 $_1 - * The 1st element - * - * @param T2 $_2 - * The 2nd element - */ - public function __construct($_0, $_1, $_2) - { - $this->_0 = $_0; - $this->_1 = $_1; - $this->_2 = $_2; - } - - /** - * @return array{0:T0,1:T1,2:T2} - * An array of all elements in this tuple. - */ - public function toArray() : array - { - return [ - $this->_0, - $this->_1, - $this->_2, - ]; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/Tuple4.php b/vendor/phan/phan/src/Phan/Library/Tuple4.php deleted file mode 100644 index 60774c6..0000000 --- a/vendor/phan/phan/src/Phan/Library/Tuple4.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * A tuple of 4 elements. - * - * @template T0 - * The type of element zero - * - * @template T1 - * The type of element one - * - * @template T2 - * The type of element two - * - * @template T3 - * The type of element three - * - * @inherits Tuple3<T0, T1, T2> - * - * phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore - */ -class Tuple4 extends Tuple3 -{ - /** @var int */ - const ARITY = 4; - - /** @var T3 element 3 of this tuple (0-based index) */ - public $_3; - - /** - * @param T0 $_0 - * The 0th element - * - * @param T1 $_1 - * The 1st element - * - * @param T2 $_2 - * The 2nd element - * - * @param T3 $_3 - * The 3rd element - */ - public function __construct($_0, $_1, $_2, $_3) - { - $this->_0 = $_0; - $this->_1 = $_1; - $this->_2 = $_2; - $this->_3 = $_3; - } - - /** - * @return array{0:T0,1:T1,2:T2,3:T3} - * An array of all elements in this tuple. - */ - public function toArray() : array - { - return [ - $this->_0, - $this->_1, - $this->_2, - $this->_3, - ]; - } -} diff --git a/vendor/phan/phan/src/Phan/Library/Tuple5.php b/vendor/phan/phan/src/Phan/Library/Tuple5.php deleted file mode 100644 index 663ef3c..0000000 --- a/vendor/phan/phan/src/Phan/Library/Tuple5.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Library; - -/** - * A tuple of 5 elements. - * - * @template T0 - * The type of element zero - * - * @template T1 - * The type of element one - * - * @template T2 - * The type of element two - * - * @template T3 - * The type of element three - * - * @template T4 - * The type of element four - * - * @inherits Tuple4<T0, T1, T2, T3> - * - * phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore - */ -class Tuple5 extends Tuple4 -{ - /** @var int */ - const ARITY = 4; - - /** @var T4 element 4 of this tuple (0-based index) */ - public $_4; - - /** - * @param T0 $_0 - * The 0th element - * - * @param T1 $_1 - * The 1st element - * - * @param T2 $_2 - * The 2nd element - * - * @param T3 $_3 - * The 3rd element - * - * @param T4 $_4 - * The 4th element - */ - public function __construct($_0, $_1, $_2, $_3, $_4) - { - $this->_0 = $_0; - $this->_1 = $_1; - $this->_2 = $_2; - $this->_3 = $_3; - $this->_4 = $_4; - } - - /** - * @return array{0:T0,1:T1,2:T2,3:T3,4:T4} - * An array of all elements in this tuple. - */ - public function toArray() : array - { - return [ - $this->_0, - $this->_1, - $this->_2, - $this->_3, - $this->_4, - ]; - } -} diff --git a/vendor/phan/phan/src/Phan/Memoize.php b/vendor/phan/phan/src/Phan/Memoize.php deleted file mode 100644 index 51f659a..0000000 --- a/vendor/phan/phan/src/Phan/Memoize.php +++ /dev/null @@ -1,101 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use Closure; - -/** - * A utility trait to memoize (cache) the result of instance methods and static methods. - */ -trait Memoize -{ - use Profile; - - /** - * @var array<string,mixed> - * A map from key to memoized values - */ - private $memoized_data = []; - - /** - * Memoize the result of $fn(), saving the result - * with key $key. - * - * @template T - * - * @param string $key - * The key to use for storing the result of the - * computation. - * - * @param Closure():T $fn - * A function to compute only once for the given - * $key. - * - * @return T - * The result of the given computation is returned - */ - protected function memoize(string $key, Closure $fn) - { - if (!\array_key_exists($key, $this->memoized_data)) { - $this->memoized_data[$key] = $fn(); - } - - return $this->memoized_data[$key]; - } - - /** - * @param string $key - * A unique key to test to see if its been seen before - * - * @return bool - * True if this is the first time this function has been - * called on this class with this key. - */ - protected function isFirstExecution(string $key) : bool - { - if (!\array_key_exists($key, $this->memoized_data)) { - $this->memoized_data[$key] = true; - return true; - } - - return false; - } - - /** - * Memoize the result of $fn(), saving the result - * with key $key. - * - * @template T - * - * @param string $key - * The key to use for storing the result of the - * computation. - * - * @param Closure():T $fn - * A function to compute only once for the given - * $key. - * - * @return T - * The result of the given computation is returned - */ - protected static function memoizeStatic(string $key, Closure $fn) - { - static $memoized_data = []; - - if (!\array_key_exists($key, $memoized_data)) { - $memoized_data[$key] = $fn(); - } - - return $memoized_data[$key]; - } - - /** - * Delete all memoized data - * - * @return void - */ - protected function memoizeFlushAll() - { - $this->memoized_data = []; - } -} diff --git a/vendor/phan/phan/src/Phan/Ordering.php b/vendor/phan/phan/src/Phan/Ordering.php deleted file mode 100644 index bc18ee6..0000000 --- a/vendor/phan/phan/src/Phan/Ordering.php +++ /dev/null @@ -1,164 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use InvalidArgumentException; -use Phan\Library\Hasher\Consistent; -use Phan\Library\Hasher\Sequential; - -/** - * This determines the order in which files will be analyzed. - * Affected by `consistent_hashing_file_order` and `randomize_file_order`. - * By default, files are analyzed in the same order as `.phan/config.php` - */ -class Ordering -{ - /** - * @var CodeBase - * The entire code base. Used to choose a file analysis ordering. - */ - private $code_base; - - /** - * @param CodeBase $code_base - * The entire code base. Used to choose a file analysis ordering. - */ - public function __construct(CodeBase $code_base) - { - $this->code_base = $code_base; - } - - /** - * @param int $process_count - * The number of processes we'd like to divide work up - * amongst. - * - * @param array<int,string> $analysis_file_list - * A list of files that should be analyzed which will be - * used to ignore any files outside of the list and to - * draw from for any missing files. - * - * @return array<int,array<int,string>> - * A map from process_id to a list of files to be analyzed - * on that process in stable ordering. - * @throws InvalidArgumentException if $process_count isn't positive. - */ - public function orderForProcessCount( - int $process_count, - array $analysis_file_list - ) : array { - - if ($process_count <= 0) { - throw new InvalidArgumentException("The process count must be greater than zero."); - } - - if (Config::getValue('randomize_file_order')) { - $random_proc_file_map = []; - \shuffle($analysis_file_list); - foreach ($analysis_file_list as $i => $file) { - $random_proc_file_map[$i % $process_count][] = $file; - } - return $random_proc_file_map; - } - - // Construct a Hasher implementation based on config. - if (Config::getValue('consistent_hashing_file_order')) { - \sort($analysis_file_list, \SORT_STRING); - $hasher = new Consistent($process_count); - } else { - $hasher = new Sequential($process_count); - } - - // Create a Set from the file list - $analysis_file_map = []; - foreach ($analysis_file_list as $file) { - $analysis_file_map[$file] = true; - } - - // A map from the root of an object hierarchy to all - // elements within that hierarchy - $root_fqsen_list = []; - - $file_names_for_classes = []; - - // Iterate over each class extracting files - foreach ($this->code_base->getUserDefinedClassMap() as $class) { - // Get the name of the file associated with the class - $file_name = $class->getContext()->getFile(); - - // Ignore any files that are not to be analyzed - if (!isset($analysis_file_map[$file_name])) { - continue; - } - unset($analysis_file_map[$file_name]); - $file_names_for_classes[$file_name] = $class; - } - - if (Config::getValue('consistent_hashing_file_order')) { - \ksort($file_names_for_classes, \SORT_STRING); - } - - foreach ($file_names_for_classes as $file_name => $class) { - // Get the class's depth in its object hierarchy and - // the FQSEN of the object at the root of its hierarchy - $hierarchy_depth = $class->getHierarchyDepth($this->code_base); - $hierarchy_root = $class->getHierarchyRootFQSEN($this->code_base); - - // Create a bucket for this root if it doesn't exist - if (!isset($root_fqsen_list[(string)$hierarchy_root])) { - $root_fqsen_list[(string)$hierarchy_root] = []; - } - - // Append this {file,depth} pair to the hierarchy - // root - $root_fqsen_list[(string)$hierarchy_root][] = [ - 'file' => $file_name, - 'depth' => $hierarchy_depth, - ]; - } - - // Create a map from processor_id to the list of files - // to be analyzed on that processor - $processor_file_list_map = []; - - // Sort the set of files with a given root by their - // depth in the hierarchy - foreach ($root_fqsen_list as $root_fqsen => $list) { - \usort( - $list, - /** - * Sort first by depth, and break ties by file name lexicographically - * (usort is not a stable sort). - * @param array{depth:int,file:string} $a - * @param array{depth:int,file:string} $b - */ - static function (array $a, array $b) : int { - return ($a['depth'] <=> $b['depth']) ?: - \strcmp($a['file'], $b['file']); - } - ); - - // Choose which process this file list will be - // run on - $process_id = $hasher->getGroup((string)$root_fqsen); - - // Append each file to this process list - foreach ($list as $item) { - $processor_file_list_map[$process_id][] = $item['file']; - } - } - - // Distribute any remaining files without classes evenly - // between the processes - $hasher->reset(); - foreach (\array_keys($analysis_file_map) as $file) { - // Choose which process this file list will be - // run on - $process_id = $hasher->getGroup((string)$file); - - $processor_file_list_map[$process_id][] = $file; - } - - return $processor_file_list_map; - } -} diff --git a/vendor/phan/phan/src/Phan/Output/BufferedPrinterInterface.php b/vendor/phan/phan/src/Phan/Output/BufferedPrinterInterface.php deleted file mode 100644 index 4f4cb57..0000000 --- a/vendor/phan/phan/src/Phan/Output/BufferedPrinterInterface.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output; - -/** - * BufferedPrinterInterface represents an issue printer that can be flushed - */ -interface BufferedPrinterInterface extends IssuePrinterInterface -{ - /** - * flush the printer buffer - * @return void - */ - public function flush(); -} diff --git a/vendor/phan/phan/src/Phan/Output/Collector/BufferingCollector.php b/vendor/phan/phan/src/Phan/Output/Collector/BufferingCollector.php deleted file mode 100644 index f967430..0000000 --- a/vendor/phan/phan/src/Phan/Output/Collector/BufferingCollector.php +++ /dev/null @@ -1,105 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Collector; - -use Phan\IssueInstance; -use Phan\Output\Filter\AnyFilter; -use Phan\Output\IssueCollectorInterface; -use Phan\Output\IssueFilterInterface; - -/** - * BufferingCollector represents an issue collector that stores issues for use later. - */ -final class BufferingCollector implements IssueCollectorInterface -{ - - /** @var array<string,IssueInstance> the issues that were collected */ - private $issues = []; - - /** @var IssueFilterInterface used to prevent some issues from being output (based on config and CLI options) */ - private $filter; - - /** - * BufferingCollector constructor. - * @param ?IssueFilterInterface $filter - */ - public function __construct(IssueFilterInterface $filter = null) - { - $this->filter = $filter ?? (new AnyFilter()); - } - - /** - * Collect issue - * @param IssueInstance $issue - */ - public function collectIssue(IssueInstance $issue) - { - if (!$this->filter->supports($issue)) { - return; - } - - $this->issues[$this->formatSortableKey($issue)] = $issue; - } - - /** - * @param IssueInstance $issue - * @return string - */ - private function formatSortableKey(IssueInstance $issue) : string - { - // This needs to be a sortable key so that output - // is in the expected order - return \implode('|', [ - $issue->getFile(), - \str_pad((string)$issue->getLine(), 5, '0', \STR_PAD_LEFT), - $issue->getIssue()->getType(), - $issue->getMessage() - ]); - } - - /** - * @return array<int,IssueInstance> - */ - public function getCollectedIssues():array - { - \ksort($this->issues); - return \array_values($this->issues); - } - - /** - * Clear the array of issues without outputting anything. - * - * Called after analysis ends. - * - * @return void - */ - public function flush() - { - $this->issues = []; - } - - /** - * Remove all collected issues (from the parse phase) for the given file paths. - * Called from daemon mode. - * - * @param array<int,string> $files - the relative paths to those files - * @return void - */ - public function removeIssuesForFiles(array $files) - { - $file_set = \array_flip($files); - foreach ($this->issues as $key => $issue) { - if (\array_key_exists($issue->getFile(), $file_set)) { - unset($this->issues[$key]); - } - } - } - - /** - * Removes all collected issues. - */ - public function reset() - { - $this->issues = []; - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Collector/ParallelChildCollector.php b/vendor/phan/phan/src/Phan/Output/Collector/ParallelChildCollector.php deleted file mode 100644 index 882ea4b..0000000 --- a/vendor/phan/phan/src/Phan/Output/Collector/ParallelChildCollector.php +++ /dev/null @@ -1,141 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Collector; - -use AssertionError; -use Phan\IssueInstance; -use Phan\Output\IssueCollectorInterface; - -/** - * A ParallelChildCollector will collect issues as normal, - * but will send them all to a message queue for collection - * by a ParallelParentCollector instead of holding on to - * them itself. - */ -class ParallelChildCollector implements IssueCollectorInterface -{ - /** - * @var resource a message queue used to receive messages from the child processes in the worker group. - */ - private $message_queue_resource; - - /** - * Create a ParallelChildCollector that will collect - * issues as normal, but emit them to a message queue - * for collection by a - * \Phan\Output\Collector\ParallelParentCollector. - */ - public function __construct() - { - self::assertSharedMemoryCommunicationEnabled(); - - $this->message_queue_resource = self::getQueueForProcessGroup(); - } - - /** - * @return resource the result of msg_get_queue() - * @throws AssertionError if this could not create a resource with msg_get_queue. - * @internal - */ - public static function getQueueForProcessGroup() - { - // Create a message queue for this process group - $message_queue_key = \posix_getpgid(\posix_getpid()); - if (!is_int($message_queue_key)) { - throw new AssertionError('Expected posix_getpgid to return a valid id'); - } - - $resource = \msg_get_queue($message_queue_key); - if (!$resource) { - throw new AssertionError('Expected msg_get_queue to return a valid resource'); - } - return $resource; - } - - /** - * Assert that the dependencies needed for communicating with the child or parent process are available. - * @throws AssertionError if PHP modules needed for shared communication aren't loaded - * @internal - */ - final public static function assertSharedMemoryCommunicationEnabled() - { - if (!\extension_loaded('sysvsem')) { - throw new AssertionError( - 'PHP must be compiled with --enable-sysvsem in order to use -j(>=2).' - ); - } - - if (!\extension_loaded('sysvmsg')) { - throw new AssertionError( - 'PHP must be compiled with --enable-sysvmsg in order to use -j(>=2).' - ); - } - } - - /** - * Collect issue - * @param IssueInstance $issue - * @return void - * @throws AssertionError if the message failed to be sent to the parent process - */ - public function collectIssue(IssueInstance $issue) - { - $error_code = 0; - - // Send messages along to the message queue - // that is hopefully being listened to by a - // ParallelParentCollector. - $success = \msg_send( - $this->message_queue_resource, - ParallelParentCollector::MESSAGE_TYPE_ISSUE, - $issue, - true, - true, - $error_code - ); - - // Send a signal to the parent process that we - // sent a message and it may wish to collect it - // posix_kill(posix_getppid(), SIGUSR1); - // pcntl_signal_dispatch(); - - // Make sure that the message was successfully - // sent - if (!($success)) { - throw new AssertionError("msg_send failed with error code '$error_code'"); - } - } - - /** - * @return array<int,IssueInstance> - */ - public function getCollectedIssues():array - { - // This collector should not be used for collecting - // issues. Instead, it proxies all messages on to a - // message queue. - return []; - } - - /** - * Remove all collected issues (from the parse phase) for the given file paths. - * Called from daemon mode. - * - * @param string[] $files @phan-unused-param - the relative paths to those files - * @return void - * - * @override - */ - public function removeIssuesForFiles(array $files) - { - return; // Never going to be called - daemon mode isn't combined with parallel execution. - } - - /** - * This method has no effect on a ParallelChildCollector. - * @return void - */ - public function reset() - { - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Collector/ParallelParentCollector.php b/vendor/phan/phan/src/Phan/Output/Collector/ParallelParentCollector.php deleted file mode 100644 index aff521f..0000000 --- a/vendor/phan/phan/src/Phan/Output/Collector/ParallelParentCollector.php +++ /dev/null @@ -1,159 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Collector; - -use AssertionError; -use Phan\IssueInstance; -use Phan\Output\IssueCollectorInterface; - -/** - * A ParallelParentCollector collects issues as normal proxying - * them on to a given base collector, but will also listen to - * a message queue for issues emitted by other processes (via - * a ParallelChildCollector). - */ -class ParallelParentCollector implements IssueCollectorInterface -{ - const MESSAGE_TYPE_ISSUE = 1; - - /** - * @var IssueCollectorInterface - * All issues will be proxied to the base collector for - * filtering and output. - */ - private $base_collector; - - /** - * @var Resource - * A message queue that will be listened to for incoming - * messages - */ - private $message_queue_resource; - - /** - * Create a ParallelParentCollector that will collect - * issues via a message queue. You'll want to do the - * real collection via - * \Phan\Output\Collector\ParallelChildCollector. - * - * @param IssueCollectorInterface $base_collector - * A collector must be given to which collected issues - * will be passed - */ - public function __construct( - IssueCollectorInterface $base_collector - ) { - ParallelChildCollector::assertSharedMemoryCommunicationEnabled(); - - $this->base_collector = $base_collector; - - // Create a message queue for this process group - $this->message_queue_resource = - ParallelChildCollector::getQueueForProcessGroup(); - - // Listen for ALARMS that indicate we should flush - // the queue - \pcntl_sigprocmask(\SIG_UNBLOCK, [\SIGUSR1], $old); - \pcntl_signal(\SIGUSR1, function () { - $this->readQueuedIssues(); - }); - } - - public function __destruct() - { - // Shut down and remove the queue - $success = \msg_remove_queue( - $this->message_queue_resource - ); - if (!$success) { - // @phan-suppress-next-line PhanTypeSuspiciousStringExpression we're deliberately converting the resource to a string - throw new AssertionError("Failed to remove queue with ID {$this->message_queue_resource}"); - } - } - - /** - * Collect issue - * @param IssueInstance $issue - * @return void - */ - public function collectIssue(IssueInstance $issue) - { - $this->base_collector->collectIssue($issue); - } - - /** - * Read the entire queue and write all issues to the - * base collector - * @return void - */ - public function readQueuedIssues() - { - // Get the status of the queue - $status = \msg_stat_queue( - $this->message_queue_resource - ); - - // Read messages while there are still messages on - // the queue - while ($status['msg_qnum'] > 0) { - $message = null; - $message_type = 0; - - // Receive the message, populating $message by - // reference - if (false !== \msg_receive( - $this->message_queue_resource, - self::MESSAGE_TYPE_ISSUE, - $message_type, - 2048, - $message, - true - )) { - if (!($message instanceof IssueInstance)) { - throw new AssertionError("Messages must be of type IssueInstance."); - } - - // Cast the message to an IssueInstance - $this->collectIssue($message); - } else { - break; - } - - $status = \msg_stat_queue( - $this->message_queue_resource - ); - } - } - - /** - * Remove all collected issues (from the parse phase) for the given file paths. - * Called from daemon mode. - * - * @param string[] $files - the relative paths to those files (@phan-unused-param) - * @return void - */ - public function removeIssuesForFiles(array $files) - { - return; // Never going to be called - daemon mode isn't combined with parallel execution. - } - - /** - * @return array<int,IssueInstance> - */ - public function getCollectedIssues() : array - { - // Read any available issues waiting on the - // message queue - $this->readQueuedIssues(); - - // Return everything on the base collector - return $this->base_collector->getCollectedIssues(); - } - - /** - * This method has no effect on a ParallelParentCollector. - */ - public function reset() - { - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Colorizing.php b/vendor/phan/phan/src/Phan/Output/Colorizing.php deleted file mode 100644 index 296df04..0000000 --- a/vendor/phan/phan/src/Phan/Output/Colorizing.php +++ /dev/null @@ -1,207 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Output; - -use Phan\Config; -use Phan\Issue; -use Phan\Language\Element\TypedElementInterface; -use Phan\Language\Element\UnaddressableTypedElement; -use Phan\Language\FQSEN; -use Phan\Language\Type; -use Phan\Language\UnionType; - -/** - * Contains utilities for colorizing Phan's issue messages (and colorized CLI output in general) - * - * Colorizing codes are based on https://github.com/kevinlebrun/colors.php/ - */ -class Colorizing -{ - const STYLES = [ - 'none' => '0', // Alias of 'reset' - 'reset' => '0', // Use 'reset' for the absence of color. - 'bold' => '1', - 'dark' => '2', - 'italic' => '3', - 'underline' => '4', - 'blink' => '5', - 'reverse' => '7', - 'concealed' => '8', - 'default' => '39', - 'black' => '30', - 'red' => '31', - 'green' => '32', - 'yellow' => '33', - 'blue' => '34', - 'magenta' => '35', - 'cyan' => '36', - 'light_gray' => '37', - 'dark_gray' => '90', - 'light_red' => '91', - 'light_green' => '92', - 'light_yellow' => '93', - 'light_blue' => '94', - 'light_magenta' => '95', - 'light_cyan' => '96', - 'white' => '97', - 'bg_default' => '49', - 'bg_black' => '40', - 'bg_red' => '41', - 'bg_green' => '42', - 'bg_yellow' => '43', - 'bg_blue' => '44', - 'bg_magenta' => '45', - 'bg_cyan' => '46', - 'bg_light_gray' => '47', - 'bg_dark_gray' => '100', - 'bg_light_red' => '101', - 'bg_light_green' => '102', - 'bg_light_yellow' => '103', - 'bg_light_blue' => '104', - 'bg_light_magenta' => '105', - 'bg_light_cyan' => '106', - 'bg_white' => '107', - ]; - - const ESC_PATTERN = "\033[%sm"; - const ESC_RESET = "\033[0m"; - - // NOTE: Keep sorted and in sync with Issue::UNCOLORED_FORMAT_STRING_FOR_TEMPLATE - // By using 'color_scheme' in .phan/config.php, these settings can be overridden - const DEFAULT_COLOR_FOR_TEMPLATE = [ - 'CLASS' => 'green', - 'CLASSLIKE' => 'green', - 'CODE' => 'light_magenta', - 'COMMENT' => 'light_green', - 'CONST' => 'light_red', - 'COUNT' => 'light_magenta', - 'DETAILS' => 'light_green', - 'FILE' => 'light_cyan', - 'FUNCTIONLIKE' => 'light_yellow', - 'FUNCTION' => 'light_yellow', - 'INDEX' => 'light_magenta', - 'INTERFACE' => 'green', - 'ISSUETYPE' => 'light_yellow', // used by Phan\Output\Printer, for minor issues - 'ISSUETYPE_CRITICAL' => 'red', // for critical issues, e.g. "PhanUndeclaredMethod" - 'ISSUETYPE_NORMAL' => 'light_red', // for normal issues - 'LINE' => 'light_gray', - 'METHOD' => 'light_yellow', - 'NAMESPACE' => 'green', - 'OPERATOR' => 'red', - 'PARAMETER' => 'cyan', - 'PROPERTY' => 'cyan', - 'SCALAR' => 'light_magenta', - 'STRING_LITERAL' => 'light_magenta', - 'SUGGESTION' => 'light_gray', - 'TYPE' => 'light_gray', - 'TRAIT' => 'green', - 'VARIABLE' => 'light_cyan', - ]; - - /** - * @var array<string,string>|null - Lazily initialized from Config, if set - */ - private static $color_scheme = null; - - /** - * Returns a version of $template where template strings (e.g. `{FILE}` - * are replaced with printf conversion specifiers (e.g. `%s`) - * and color control codes are inserted before/after those conversion specifiers. - * - * @param string $template - * @param array<int,int|string|float|FQSEN|Type|UnionType|TypedElementInterface|UnaddressableTypedElement> $template_parameters - */ - public static function colorizeTemplate( - string $template, - array $template_parameters - ) : string { - $i = 0; - /** @param array<int,string> $matches */ - return \preg_replace_callback('/{([A-Z_]+)}|%[sdf]/', static function (array $matches) use ($template, $template_parameters, &$i) : string { - $j = $i++; - if ($j >= \count($template_parameters)) { - \error_log("Missing argument for colorized output ($template), offset $j"); - return '(MISSING)'; - } - $arg = $template_parameters[$j]; - if (\is_object($arg)) { - $arg = (string)$arg; - } - $format_str = $matches[0]; - if ($format_str[0] === '%') { - // @phan-suppress-next-line PhanPluginPrintfVariableFormatString this is %s, %d, or %f - return \sprintf($format_str, $arg); - } - $template = $matches[1]; - return self::colorizeField($template, $arg); - }, $template); - } - - /** - * @param string $template_type (A key of _UNCOLORED_FORMAT_STRING_FOR_TEMPLATE, e.g. "FILE") - * @param int|string|float|FQSEN|Type|UnionType $arg (Argument for format string, e.g. a type name, method fqsen, line number, etc.) - * @return string - Colorized for Unix terminals. - */ - public static function colorizeField(string $template_type, $arg) : string - { - $fmt_directive = Issue::UNCOLORED_FORMAT_STRING_FOR_TEMPLATE[$template_type] ?? null; - if ($fmt_directive === null) { - \error_log(\sprintf( - "Unknown template type '%s'. Known template types: %s", - $template_type, - \implode(', ', \array_keys(Issue::UNCOLORED_FORMAT_STRING_FOR_TEMPLATE)) - )); - return (string)$arg; - } - // TODO: Add more complicated color coding, e.g. MyClass::method should have the option for multiple colors. - // TODO: Allow choosing color schemes via .phan/config.php - // @phan-suppress-next-line PhanPluginPrintfVariableFormatString this is %s/%d/%f - $arg_str = \sprintf($fmt_directive, (string)$arg); - $color = self::colorForTemplate($template_type); - if ($color === null) { - \error_log("No color information for template type $template_type"); - return $arg_str; - } - // TODO: Could extend this to support background colors. - $color_code = self::STYLES[$color] ?? null; - if ($color_code === null) { - \error_log("Invalid color name ($color) for template type $template_type"); - return $arg_str; - } - if ($color_code == '0') { - return $arg_str; - } - return \sprintf(self::ESC_PATTERN, $color_code) . ((string) $arg) . self::ESC_RESET; - } - - /** - * @return ?string - null if there is no valid color - */ - private static function colorForTemplate(string $template_type) - { - if (self::$color_scheme === null) { - self::initColorScheme(); - } - return self::$color_scheme[$template_type] ?? null; - } - - /** - * Initialize the color scheme, merging it with Config::color_scheme - */ - private static function initColorScheme() - { - self::$color_scheme = self::DEFAULT_COLOR_FOR_TEMPLATE; - foreach (Config::getValue('color_scheme') ?? [] as $template_type => $color_name) { - if (!\is_string($color_name) || !\array_key_exists($color_name, self::STYLES)) { - \error_log("Invalid color name ($color_name)"); - continue; - } - if (!\array_key_exists($template_type, Colorizing::DEFAULT_COLOR_FOR_TEMPLATE)) { - \error_log("Unknown template_type ($template_type)"); - continue; - } - self::$color_scheme[$template_type] = $color_name; - } - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Filter/AnyFilter.php b/vendor/phan/phan/src/Phan/Output/Filter/AnyFilter.php deleted file mode 100644 index 328a113..0000000 --- a/vendor/phan/phan/src/Phan/Output/Filter/AnyFilter.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Filter; - -use Phan\IssueInstance; -use Phan\Output\IssueFilterInterface; - -/** - * This is a filter which permits any IssueInstance to be output. - */ -final class AnyFilter implements IssueFilterInterface -{ - - /** - * @param IssueInstance $issue (@phan-unused-param) - * @return bool - */ - public function supports(IssueInstance $issue):bool - { - return true; - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Filter/CategoryIssueFilter.php b/vendor/phan/phan/src/Phan/Output/Filter/CategoryIssueFilter.php deleted file mode 100644 index 71da824..0000000 --- a/vendor/phan/phan/src/Phan/Output/Filter/CategoryIssueFilter.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -declare(strict_types=1); - -namespace Phan\Output\Filter; - -use Phan\IssueInstance; -use Phan\Output\IssueFilterInterface; - -/** - * This is a filter which limits `IssueInstance`s to specific categories, - * represented as the bitmask $this->mask - */ -final class CategoryIssueFilter implements IssueFilterInterface -{ - /** @var int a bitmask of categories to allow */ - private $mask; - - /** - * CategoryIssueFilter constructor. - * @param int $mask - */ - public function __construct(int $mask = -1) - { - $this->mask = $mask; - } - - /** - * @param IssueInstance $issue - * @return bool - */ - public function supports(IssueInstance $issue) : bool - { - return (bool)($issue->getIssue()->getCategory() & $this->mask); - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Filter/ChainedIssueFilter.php b/vendor/phan/phan/src/Phan/Output/Filter/ChainedIssueFilter.php deleted file mode 100644 index ab9bff5..0000000 --- a/vendor/phan/phan/src/Phan/Output/Filter/ChainedIssueFilter.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Filter; - -use Phan\IssueInstance; -use Phan\Output\IssueFilterInterface; - -/** - * ChainedIssueFilter is a combination of 0 or more filters. - * It will reject an IssueInstance if any of the filters in the list reject that IssueInstance - */ -final class ChainedIssueFilter implements IssueFilterInterface -{ - - /** - * 0 or more filters. If any of these reject an IssueInstance, - * then this ChainedIssueFilter will reject the instance. - * @var IssueFilterInterface[] - */ - private $filters = []; - - /** - * ChainedIssueFilter constructor. - * - * @param IssueFilterInterface[] $filters - */ - public function __construct(array $filters) - { - $this->filters = $filters; - } - - /** - * @param IssueInstance $issue - * @return bool - */ - public function supports(IssueInstance $issue):bool - { - foreach ($this->filters as $filter) { - if (!$filter->supports($issue)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Filter/FileIssueFilter.php b/vendor/phan/phan/src/Phan/Output/Filter/FileIssueFilter.php deleted file mode 100644 index d4c212b..0000000 --- a/vendor/phan/phan/src/Phan/Output/Filter/FileIssueFilter.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Filter; - -use Phan\IssueInstance; -use Phan\Output\IgnoredFilesFilterInterface; -use Phan\Output\IssueFilterInterface; - -/** - * FileIssueFilter is a filter that will ignore `IssueInstance`s based on their file name. - */ -final class FileIssueFilter implements IssueFilterInterface -{ - - /** @var IgnoredFilesFilterInterface used to check if issues in a file name should be ignored. */ - private $ignored_files_filter; - - /** - * FileIssueFilter constructor. - * - * @param IgnoredFilesFilterInterface $ignored_files_filter - */ - public function __construct( - IgnoredFilesFilterInterface $ignored_files_filter - ) { - $this->ignored_files_filter = $ignored_files_filter; - } - - /** - * @param IssueInstance $issue - * @return bool - */ - public function supports(IssueInstance $issue):bool - { - return !$this->ignored_files_filter->isFilenameIgnored($issue->getFile()); - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Filter/MinimumSeverityFilter.php b/vendor/phan/phan/src/Phan/Output/Filter/MinimumSeverityFilter.php deleted file mode 100644 index ee50cce..0000000 --- a/vendor/phan/phan/src/Phan/Output/Filter/MinimumSeverityFilter.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Filter; - -use Phan\Issue; -use Phan\IssueInstance; -use Phan\Output\IssueFilterInterface; - -/** - * MinimumSeverityFilter is a filter that will filter out issues - * that are less severe than the provided minimum severity. - */ -final class MinimumSeverityFilter implements IssueFilterInterface -{ - - /** @var int the provided minimum severity */ - private $minimum_severity; - - /** - * MinimumSeverityFilter constructor. - * @param int $minimum_severity should be a constant from Issue::SEVERITY_* - */ - public function __construct(int $minimum_severity = Issue::SEVERITY_LOW) - { - $this->minimum_severity = $minimum_severity; - } - - - /** - * @param IssueInstance $issue - * @return bool - */ - public function supports(IssueInstance $issue):bool - { - return $issue->getIssue()->getSeverity() >= $this->minimum_severity; - } -} diff --git a/vendor/phan/phan/src/Phan/Output/IgnoredFilesFilterInterface.php b/vendor/phan/phan/src/Phan/Output/IgnoredFilesFilterInterface.php deleted file mode 100644 index f212207..0000000 --- a/vendor/phan/phan/src/Phan/Output/IgnoredFilesFilterInterface.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output; - -/** - * Used to check if a filename is ignored during analysis - */ -interface IgnoredFilesFilterInterface -{ - - /** - * @param string $filename - * @return bool True if filename is ignored during analysis - */ - public function isFilenameIgnored(string $filename): bool; -} diff --git a/vendor/phan/phan/src/Phan/Output/IssueCollectorInterface.php b/vendor/phan/phan/src/Phan/Output/IssueCollectorInterface.php deleted file mode 100644 index 269aee2..0000000 --- a/vendor/phan/phan/src/Phan/Output/IssueCollectorInterface.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output; - -use Phan\IssueInstance; - -/** - * Abstraction of functionality used to report and read issues to output. - * - * Multiple implementations are permitted for the language server protocol, unit testing, etc. - */ -interface IssueCollectorInterface -{ - - /** - * Collect issue - * @param IssueInstance $issue - * @return void - */ - public function collectIssue(IssueInstance $issue); - - /** - * @return array<int,IssueInstance> the list of collected issues from calls to collectIssue() - */ - public function getCollectedIssues(): array; - - /** - * Remove all collected issues (from the parse phase) for the given file paths. - * Called from daemon mode. - * - * @param array<int,string> $files - the relative paths to those files - * @return void - */ - public function removeIssuesForFiles(array $files); - - /** - * Remove all collected issues. - * @return void - */ - public function reset(); -} diff --git a/vendor/phan/phan/src/Phan/Output/IssueFilterInterface.php b/vendor/phan/phan/src/Phan/Output/IssueFilterInterface.php deleted file mode 100644 index 5662ffa..0000000 --- a/vendor/phan/phan/src/Phan/Output/IssueFilterInterface.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output; - -use Phan\IssueInstance; - -/** - * Instances of this are used to filter emitted issues down to issues that should be reported (based on configuration, etc). - */ -interface IssueFilterInterface -{ - /** - * @param IssueInstance $issue - * @return bool true if the issue should be reported - */ - public function supports(IssueInstance $issue): bool; -} diff --git a/vendor/phan/phan/src/Phan/Output/IssuePrinterInterface.php b/vendor/phan/phan/src/Phan/Output/IssuePrinterInterface.php deleted file mode 100644 index c4878b1..0000000 --- a/vendor/phan/phan/src/Phan/Output/IssuePrinterInterface.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output; - -use Phan\IssueInstance; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Abstraction for printing (or recording) `IssueInstance`s in various ways. - */ -interface IssuePrinterInterface -{ - - /** - * Emit an issue to the configured OutputInterface - * - * @param IssueInstance $instance - * @return void - */ - public function print(IssueInstance $instance); - - /** - * Sets the OutputInterface instance that issues will be printed to. - * - * @param OutputInterface $output - * @return void - */ - public function configureOutput(OutputInterface $output); -} diff --git a/vendor/phan/phan/src/Phan/Output/Printer/CSVPrinter.php b/vendor/phan/phan/src/Phan/Output/Printer/CSVPrinter.php deleted file mode 100644 index edb1cc1..0000000 --- a/vendor/phan/phan/src/Phan/Output/Printer/CSVPrinter.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Printer; - -use AssertionError; -use Phan\Issue; -use Phan\IssueInstance; -use Phan\Output\BufferedPrinterInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * This will print an issue as CSVs (Comma Separated Values) to the configured OutputInterface. - */ -final class CSVPrinter implements BufferedPrinterInterface -{ - - /** @var OutputInterface for writing comma separated values to */ - private $output; - - /** @var resource in-memory stream for fputcsv() */ - private $stream; - - /** @param IssueInstance $instance */ - public function print(IssueInstance $instance) - { - \fputcsv($this->stream, [ - $instance->getFile(), - $instance->getLine(), - $instance->getIssue()->getSeverity(), - $instance->getIssue()->getSeverityName(), - Issue::getNameForCategory($instance->getIssue()->getCategory()), - $instance->getIssue()->getType(), - $instance->getMessageAndMaybeSuggestion(), - ]); - } - - /** flush printer buffer */ - public function flush() - { - \fseek($this->stream, 0); - $contents = \stream_get_contents($this->stream); - if (!\is_string($contents)) { - throw new AssertionError("Failed to read in-memory csv stream"); - } - $this->output->write($contents); - \fclose($this->stream); - $this->initStream(); - } - - /** - * @param OutputInterface $output - */ - public function configureOutput(OutputInterface $output) - { - $this->output = $output; - $this->initStream(); - } - - private function initStream() - { - // Because fputcsv works on file pointers we need to do a bit - // of dancing around with a memory stream. - $stream = \fopen("php://memory", "rw"); - if (!\is_resource($stream)) { - throw new AssertionError('php://memory should always be openable'); - } - $this->stream = $stream; - \fputcsv($this->stream, [ - "filename", "line", "severity_ord", "severity_name", - "category", "check_name", "message" - ]); - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Printer/CheckstylePrinter.php b/vendor/phan/phan/src/Phan/Output/Printer/CheckstylePrinter.php deleted file mode 100644 index 27ce278..0000000 --- a/vendor/phan/phan/src/Phan/Output/Printer/CheckstylePrinter.php +++ /dev/null @@ -1,104 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Printer; - -use Phan\IssueInstance; -use Phan\Output\BufferedPrinterInterface; -use Symfony\Component\Console\Output\OutputInterface; -use const ENT_NOQUOTES; - -/** - * This prints `IssueInstance`s in the checkstyle XML format to the configured OutputInterface - */ -final class CheckstylePrinter implements BufferedPrinterInterface -{ - - /** @var OutputInterface an output that XML can be written to. */ - private $output; - - /** @var array<string,array<int,array>> maps files with issues to the list of those issues */ - private $files = []; - - /** @param IssueInstance $instance */ - public function print(IssueInstance $instance) - { - if (!isset($this->files[$instance->getFile()])) { - $this->files[$instance->getFile()] = []; - } - - // Group issues by file - $this->files[$instance->getFile()][] = [ - 'line' => $instance->getLine(), - 'source' => $instance->getIssue()->getType(), - 'message' => $instance->getMessageAndMaybeSuggestion(), - 'severity' => $instance->getIssue()->getSeverityName(), - ]; - } - - /** flush printer buffer */ - public function flush() - { - $document = new \DOMDocument('1.0', 'ISO-8859-15'); - - $checkstyle = new \DOMElement('checkstyle'); - $document->appendChild($checkstyle); - $checkstyle->appendChild(new \DOMAttr('version', '6.5')); - - // Write each file to the DOM - foreach ($this->files as $file_name => $error_list) { - $file = new \DOMElement('file'); - $checkstyle->appendChild($file); - $file->appendChild(new \DOMAttr('name', $file_name)); - - // Write each error to the file - foreach ($error_list as $error_map) { - $error = new \DOMElement('error'); - $file->appendChild($error); - - // Write each element of the error as an attribute - // of the error - $error->appendChild( - new \DOMAttr('line', \htmlspecialchars((string)$error_map['line'], ENT_NOQUOTES, 'UTF-8')) - ); - - // Map phan severity to Jenkins/Checkstyle severity levels - switch ($error_map['severity']) { - case 'low': - $level = 'info'; - break; - case 'critical': - $level = 'error'; - break; - case 'normal': - default: - $level = 'warning'; - break; - } - - $error->appendChild( - new \DOMAttr('severity', \htmlspecialchars((string)$level, ENT_NOQUOTES, 'UTF-8')) - ); - - $error->appendChild( - new \DOMAttr('message', \htmlspecialchars((string)$error_map['message'], ENT_NOQUOTES, 'UTF-8')) - ); - - $error->appendChild( - new \DOMAttr('source', \htmlspecialchars((string)$error_map['source'], ENT_NOQUOTES, 'UTF-8')) - ); - } - } - - $document->formatOutput = true; - $this->output->write($document->saveXML()); - $this->files = []; - } - - /** - * @param OutputInterface $output - */ - public function configureOutput(OutputInterface $output) - { - $this->output = $output; - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Printer/CodeClimatePrinter.php b/vendor/phan/phan/src/Phan/Output/Printer/CodeClimatePrinter.php deleted file mode 100644 index 5600cc8..0000000 --- a/vendor/phan/phan/src/Phan/Output/Printer/CodeClimatePrinter.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Printer; - -use Phan\Issue; -use Phan\IssueInstance; -use Phan\Library\StringUtil; -use Phan\Output\BufferedPrinterInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * This prints issues in the CodeClimate zero byte separated JSON format to the configured OutputInterface. - */ -final class CodeClimatePrinter implements BufferedPrinterInterface -{ - - const CODECLIMATE_SEVERITY_INFO = 'info'; - const CODECLIMATE_SEVERITY_CRITICAL = 'critical'; - const CODECLIMATE_SEVERITY_NORMAL = 'normal'; - - /** @var OutputInterface an output that zero byte separated JSON can be written to. */ - private $output; - - /** @var array<int,array> a list of associative arrays with codeclimate issue fields. */ - private $messages = []; - - /** @param IssueInstance $instance */ - public function print(IssueInstance $instance) - { - $this->messages[] = [ - 'type' => 'issue', - 'check_name' => $instance->getIssue()->getType(), - 'description' => $instance->getMessageAndMaybeSuggestion(), - 'categories' => ['Bug Risk'], - 'severity' => self::mapSeverity($instance->getIssue()->getSeverity()), - 'location' => [ - 'path' => \preg_replace('/^\/code\//', '', $instance->getFile()), - 'lines' => [ - 'begin' => $instance->getLine(), - 'end' => $instance->getLine(), - ], - ], - ]; - } - - /** - * @param int $raw_severity - * @return string - */ - private static function mapSeverity(int $raw_severity) : string - { - $severity = self::CODECLIMATE_SEVERITY_INFO; - switch ($raw_severity) { - case Issue::SEVERITY_CRITICAL: - $severity = self::CODECLIMATE_SEVERITY_CRITICAL; - break; - case Issue::SEVERITY_NORMAL: - $severity = self::CODECLIMATE_SEVERITY_NORMAL; - break; - } - - return $severity; - } - - /** flush printer buffer */ - public function flush() - { - - // See https://github.com/codeclimate/spec/blob/master/SPEC.md#output - // for details on the CodeClimate output format - foreach ($this->messages as $message) { - $encoded_message = StringUtil::jsonEncode($message) . "\0"; - $this->output->write($encoded_message, false, OutputInterface::OUTPUT_RAW); - } - $this->messages = []; - } - - /** - * @param OutputInterface $output - */ - public function configureOutput(OutputInterface $output) - { - $this->output = $output; - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Printer/FilteringPrinter.php b/vendor/phan/phan/src/Phan/Output/Printer/FilteringPrinter.php deleted file mode 100644 index f4b5dd0..0000000 --- a/vendor/phan/phan/src/Phan/Output/Printer/FilteringPrinter.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Printer; - -use InvalidArgumentException; -use Phan\IssueInstance; -use Phan\Output\BufferedPrinterInterface; -use Phan\Output\IssuePrinterInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Prints `IssueInstance`s in the file_set to the configured OutputInterface. - * - * This is necessary for daemon mode/the language server, - * to limit outputted issues to the ones currently open in the IDE in all IDEs, - * no matter what format is used (JSON, pylint, etc) - */ -final class FilteringPrinter implements BufferedPrinterInterface -{ - /** @var array<string,true> a set of relative file paths */ - private $file_set = []; - - /** @var IssuePrinterInterface the wrapped printer */ - private $printer; - - /** - * @param string $file - */ - private static function normalize($file) : string - { - return \str_replace(\DIRECTORY_SEPARATOR, "//", (string)$file); - } - - /** @param array<int, string> $files a non-empty list of relative file paths. */ - public function __construct( - array $files, - IssuePrinterInterface $printer - ) { - if (\count($files) === 0) { - throw new InvalidArgumentException("FilteringPrinter expects 1 or more files"); - } - foreach ($files as $file) { - $this->file_set[self::normalize($file)] = true; - } - $this->printer = $printer; - } - - /** - * @param IssueInstance $instance - * @override - */ - public function print(IssueInstance $instance) - { - $file = $instance->getFile(); - if (!isset($this->file_set[self::normalize($file)])) { - return; - } - $this->printer->print($instance); - } - - /** - * @param OutputInterface $output - * @override - */ - public function configureOutput(OutputInterface $output) - { - $this->printer->configureOutput($output); - } - - /** - * @override - */ - public function flush() - { - if ($this->printer instanceof BufferedPrinterInterface) { - $this->printer->flush(); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Printer/JSONPrinter.php b/vendor/phan/phan/src/Phan/Output/Printer/JSONPrinter.php deleted file mode 100644 index 0138e1a..0000000 --- a/vendor/phan/phan/src/Phan/Output/Printer/JSONPrinter.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Printer; - -use AssertionError; -use Phan\Issue; -use Phan\IssueInstance; -use Phan\Output\BufferedPrinterInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * This prints issues as raw JSON to the configured OutputInterface. - * The output is intended for use by other programs (or processes) - */ -final class JSONPrinter implements BufferedPrinterInterface -{ - - /** @var OutputInterface an output that JSON encoded can be written to. */ - private $output; - - /** @var array<int,array<string,mixed>> the issue data to be JSON encoded. */ - private $messages = []; - - /** @param IssueInstance $instance */ - public function print(IssueInstance $instance) - { - $issue = $instance->getIssue(); - $message = [ - 'type' => 'issue', - 'type_id' => $issue->getTypeId(), - 'check_name' => $issue->getType(), - 'description' => - Issue::getNameForCategory($issue->getCategory()) . ' ' . - $issue->getType() . ' ' . - $instance->getMessage(), // suggestion included separately - 'severity' => $issue->getSeverity(), - 'location' => [ - 'path' => \preg_replace('/^\/code\//', '', $instance->getFile()), - 'lines' => [ - 'begin' => $instance->getLine(), - 'end' => $instance->getLine(), - ], - ], - ]; - $suggestion = $instance->getSuggestionMessage(); - if ($suggestion) { - $message['suggestion'] = $suggestion; - } - $this->messages[] = $message; - } - - /** flush printer buffer */ - public function flush() - { - // NOTE: Need to use OUTPUT_RAW for JSON. - // Otherwise, error messages such as "...Unexpected << (T_SL)" don't get formatted properly (They get escaped into unparsable JSON) - $encoded_message = \json_encode($this->messages, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE | \JSON_PARTIAL_OUTPUT_ON_ERROR); - if (!\is_string($encoded_message)) { - throw new AssertionError("Failed to encode anything for what should be an array"); - } - $this->output->write($encoded_message . "\n", false, OutputInterface::OUTPUT_RAW); - $this->messages = []; - } - - /** - * @param OutputInterface $output - */ - public function configureOutput(OutputInterface $output) - { - $this->output = $output; - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Printer/PlainTextPrinter.php b/vendor/phan/phan/src/Phan/Output/Printer/PlainTextPrinter.php deleted file mode 100644 index dcb8c9b..0000000 --- a/vendor/phan/phan/src/Phan/Output/Printer/PlainTextPrinter.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Printer; - -use Phan\Config; -use Phan\Issue; -use Phan\IssueInstance; -use Phan\Output\Colorizing; -use Phan\Output\IssuePrinterInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Outputs `IssueInstance`s to the provided OutputInterface in plain text format. - * - * 'text' is the only output format for which the option `--color` is recommended. - */ -final class PlainTextPrinter implements IssuePrinterInterface -{ - - /** @var OutputInterface an output that plaintext formatted issues can be written to. */ - private $output; - - /** - * @param IssueInstance $instance - * @return void - */ - public function print(IssueInstance $instance) - { - $file = $instance->getFile(); - $line = $instance->getLine(); - $issue = $instance->getIssue(); - $type = $issue->getType(); - $message = $instance->getMessage(); - $suggestion_message = $instance->getSuggestionMessage(); - - if (Config::getValue('color_issue_messages')) { - switch ($issue->getSeverity()) { - case Issue::SEVERITY_CRITICAL: - $issue_type_template = '{ISSUETYPE_CRITICAL}'; - break; - case Issue::SEVERITY_NORMAL: - $issue_type_template = '{ISSUETYPE_NORMAL}'; - break; - default: - $issue_type_template = '{ISSUETYPE}'; - break; - } - $issue = Colorizing::colorizeTemplate("{FILE}:{LINE} $issue_type_template %s", [ - $file, - $line, - $type, - $message - ]); - if ($suggestion_message) { - $issue .= Colorizing::colorizeTemplate(" ({SUGGESTION})", [$suggestion_message]); - } - } else { - $issue = \sprintf( - '%s:%d %s %s', - $file, - $line, - $type, - $message - ); - if ($suggestion_message) { - $issue .= " ($suggestion_message)"; - } - } - - $this->output->writeln($issue); - } - - /** - * @param OutputInterface $output - * @return void - */ - public function configureOutput(OutputInterface $output) - { - $this->output = $output; - } -} diff --git a/vendor/phan/phan/src/Phan/Output/Printer/PylintPrinter.php b/vendor/phan/phan/src/Phan/Output/Printer/PylintPrinter.php deleted file mode 100644 index 3d1f633..0000000 --- a/vendor/phan/phan/src/Phan/Output/Printer/PylintPrinter.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output\Printer; - -use Phan\Issue; -use Phan\IssueInstance; -use Phan\Output\IssuePrinterInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Prints `IssueInstance`s in the pylint error format to the configured OutputInterface - */ -final class PylintPrinter implements IssuePrinterInterface -{ - /** @var OutputInterface an output that pylint formatted issues can be written to. */ - private $output; - - /** @param IssueInstance $instance */ - public function print(IssueInstance $instance) - { - $message = \sprintf( - "%s: %s", - $instance->getIssue()->getType(), - $instance->getMessage() - ); - $line = \sprintf( - "%s:%d: [%s] %s", - $instance->getFile(), - $instance->getLine(), - self::getSeverityCode($instance), - $message - ); - $suggestion = $instance->getSuggestionMessage(); - if ($suggestion) { - $line .= " ($suggestion)"; - } - - $this->output->writeln($line); - } - - /** - * Returns a severity code that can be parsed by programs parsing pylint output - * (e.g. `"E17000"` for PhanSyntaxError) - */ - public static function getSeverityCode(IssueInstance $instance) : string - { - $issue = $instance->getIssue(); - $category_id = $issue->getTypeId(); - switch ($issue->getSeverity()) { - case Issue::SEVERITY_LOW: - return 'C' . $category_id; - case Issue::SEVERITY_NORMAL: - return 'W' . $category_id; - case Issue::SEVERITY_CRITICAL: - return 'E' . $category_id; - default: - \fwrite(\STDERR, "Unrecognized severity for " . $instance . ": " . $issue->getSeverity() . " (expected 0, 5, or 10)\n"); - return 'E' . $category_id; - } - } - - /** - * @param OutputInterface $output - */ - public function configureOutput(OutputInterface $output) - { - $this->output = $output; - } -} diff --git a/vendor/phan/phan/src/Phan/Output/PrinterFactory.php b/vendor/phan/phan/src/Phan/Output/PrinterFactory.php deleted file mode 100644 index 6e3dcc8..0000000 --- a/vendor/phan/phan/src/Phan/Output/PrinterFactory.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Output; - -use Phan\Output\Printer\CheckstylePrinter; -use Phan\Output\Printer\CodeClimatePrinter; -use Phan\Output\Printer\CSVPrinter; -use Phan\Output\Printer\JSONPrinter; -use Phan\Output\Printer\PlainTextPrinter; -use Phan\Output\Printer\PylintPrinter; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Class PrinterFactory - * Subject of future refactoring to be a bit more extensible - */ -class PrinterFactory -{ - - /** - * @return array<int,string> the supported types of Printers - */ - public function getTypes():array - { - return ['text', 'json', 'csv', 'codeclimate', 'checkstyle', 'pylint']; - } - - /** - * Return an IssuePrinterInterface of type $type that outputs issues to $output - * @param ?string $type the configured type of printer - */ - public function getPrinter($type, OutputInterface $output):IssuePrinterInterface - { - switch ($type) { - case 'codeclimate': - $printer = new CodeClimatePrinter(); - break; - case 'json': - $printer = new JSONPrinter(); - break; - case 'checkstyle': - $printer = new CheckstylePrinter(); - break; - case 'csv': - $printer = new CSVPrinter(); - break; - case 'pylint': - $printer = new PylintPrinter(); - break; - case 'text': - default: - $printer = new PlainTextPrinter(); - break; - } - - $printer->configureOutput($output); - - return $printer; - } -} diff --git a/vendor/phan/phan/src/Phan/Parse/ParseVisitor.php b/vendor/phan/phan/src/Phan/Parse/ParseVisitor.php deleted file mode 100644 index 4a98df3..0000000 --- a/vendor/phan/phan/src/Phan/Parse/ParseVisitor.php +++ /dev/null @@ -1,1529 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Parse; - -use AssertionError; -use ast; -use ast\Node; -use InvalidArgumentException; -use Phan\Analysis\ScopeVisitor; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Daemon; -use Phan\Exception\FQSENException; -use Phan\Exception\IssueException; -use Phan\Exception\UnanalyzableException; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\ClassConstant; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Comment; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionFactory; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\GlobalConstant; -use Phan\Language\Element\Method; -use Phan\Language\Element\Property; -use Phan\Language\FQSEN\FullyQualifiedClassConstantName; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedGlobalConstantName; -use Phan\Language\FQSEN\FullyQualifiedMethodName; -use Phan\Language\FQSEN\FullyQualifiedPropertyName; -use Phan\Language\FutureUnionType; -use Phan\Language\Type; -use Phan\Language\Type\ArrayShapeType; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\CallableType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; -use Phan\Library\FileCache; -use Phan\Library\None; - -/** - * The class is a visitor for AST nodes that does parsing. Each - * visitor populates the $code_base with any - * globally accessible structural elements and will return a - * possibly new context as modified by the given node. - * - * @property-read CodeBase $code_base - * - * @phan-file-suppress PhanUnusedPublicMethodParameter implementing faster no-op methods for common visit* - * @phan-file-suppress PhanPartialTypeMismatchArgument - * @phan-file-suppress PhanPartialTypeMismatchArgumentInternal - */ -class ParseVisitor extends ScopeVisitor -{ - - /** - * @param Context $context - * The context of the parser at the node for which we'd - * like to determine a type - * - * @param CodeBase $code_base - * The global code base in which we store all - * state - */ - /* - public function __construct( - CodeBase $code_base, - Context $context - ) { - parent::__construct($code_base, $context); - } - */ - - /** - * Visit a node with kind `\ast\AST_CLASS` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * @throws FQSENException if the node has invalid names - */ - public function visitClass(Node $node) : Context - { - if ($node->flags & \ast\flags\CLASS_ANONYMOUS) { - $class_name = (new ContextNode( - $this->code_base, - $this->context, - $node - ))->getUnqualifiedNameForAnonymousClass(); - } else { - $class_name = (string)$node->children['name']; - } - - // This happens now and then and I have no idea - // why. - if (!$class_name) { - return $this->context; - } - - // @phan-suppress-next-line PhanThrowTypeAbsentForCall hopefully impossible - $class_fqsen = FullyQualifiedClassName::fromStringInContext( - $class_name, - $this->context - ); - - // Hunt for an available alternate ID if necessary - $alternate_id = 0; - while ($this->code_base->hasClassWithFQSEN($class_fqsen)) { - $class_fqsen = $class_fqsen->withAlternateId(++$alternate_id); - } - - if ($alternate_id > 0) { - Daemon::debugf("Using an alternate for %s: %d\n", $class_fqsen, $alternate_id); - } - - // Build the class from what we know so far - $class_context = $this->context - ->withLineNumberStart($node->lineno ?? 0) - ->withLineNumberEnd($node->endLineno ?? 0); - - $class = new Clazz( - $class_context, - $class_name, - $class_fqsen->asUnionType(), - $node->flags ?? 0, - $class_fqsen - ); - $class->setDeclId($node->children['__declId']); - $class->setDidFinishParsing(false); - try { - // Set the scope of the class's context to be the - // internal scope of the class - $class_context = $class_context->withScope( - $class->getInternalScope() - ); - - $doc_comment = $node->children['docComment'] ?? ''; - $class->setDocComment($doc_comment); - - // Add the class to the code base as a globally - // accessible object - // This must be done before Comment::fromStringInContext - // so that the class definition is available there. - $this->code_base->addClass($class); - - // Get a comment on the class declaration - $comment = Comment::fromStringInContext( - $doc_comment, - $this->code_base, - $class_context, - $node->lineno ?? 0, - Comment::ON_CLASS - ); - - // Add any template types parameterizing a generic class - foreach ($comment->getTemplateTypeList() as $template_type) { - $class->getInternalScope()->addTemplateType($template_type); - } - - $class->setIsDeprecated($comment->isDeprecated()); - $class->setIsNSInternal($comment->isNSInternal()); - - $class->setSuppressIssueSet( - $comment->getSuppressIssueSet() - ); - - // Depends on code_base for checking existence of __get and __set. - // TODO: Add a check in analyzeClasses phase that magic @property declarations - // are limited to classes with either __get or __set declared (or interface/abstract - $class->setMagicPropertyMap( - $comment->getMagicPropertyMap(), - $this->code_base - ); - - // Depends on code_base for checking existence of __call or __callStatic. - // TODO: Add a check in analyzeClasses phase that magic @method declarations - // are limited to classes with either __get or __set declared (or interface/abstract) - $class->setMagicMethodMap( - $comment->getMagicMethodMap(), - $this->code_base - ); - - // usually used together with magic @property annotations - $class->setForbidUndeclaredMagicProperties($comment->getForbidUndeclaredMagicProperties()); - - // usually used together with magic @method annotations - $class->setForbidUndeclaredMagicMethods($comment->getForbidUndeclaredMagicMethods()); - - // Look to see if we have a parent class - $extends_node = $node->children['extends'] ?? null; - if ($extends_node instanceof Node) { - $parent_class_name = - (string)$extends_node->children['name']; - - // Check to see if the name isn't fully qualified - if ($extends_node->flags & \ast\flags\NAME_NOT_FQ) { - if ($this->context->hasNamespaceMapFor( - \ast\flags\USE_NORMAL, - $parent_class_name - )) { - // Get a fully-qualified name - $parent_class_name = - (string)($this->context->getNamespaceMapFor( - \ast\flags\USE_NORMAL, - $parent_class_name - )); - } else { - $parent_class_name = - \rtrim($this->context->getNamespace(), '\\') . '\\' . $parent_class_name; - } - } elseif ($extends_node->flags & \ast\flags\NAME_RELATIVE) { - $parent_class_name = - \rtrim($this->context->getNamespace(), '\\') . '\\' . $parent_class_name; - } - // $extends_node->flags is 0 when it is fully qualified? - - // The name is fully qualified. - // @phan-suppress-next-line PhanThrowTypeAbsentForCall should be impossible - $parent_fqsen = FullyQualifiedClassName::fromFullyQualifiedString( - $parent_class_name - ); - - // Set the parent for the class - $class->setParentType($parent_fqsen->asType(), $extends_node->lineno); - } - - // If the class explicitly sets its overriding extension type, - // set that on the class - $inherited_type_option = $comment->getInheritedTypeOption(); - if ($inherited_type_option->isDefined()) { - $class->setParentType($inherited_type_option->get()); - } - - // Add any implemented interfaces - if (isset($node->children['implements'])) { - foreach ($node->children['implements']->children as $name_node) { - $name = (string)UnionTypeVisitor::unionTypeFromClassNode($this->code_base, $this->context, $name_node); - $class->addInterfaceClassFQSEN( - // @phan-suppress-next-line PhanThrowTypeAbsentForCall should be impossible - FullyQualifiedClassName::fromFullyQualifiedString( - $name - ), - $name_node->lineno - ); - } - } - } finally { - $class->setDidFinishParsing(true); - } - - return $class_context; - } - - /** - * Visit a node with kind `\ast\AST_USE_TRAIT` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * - * @throws UnanalyzableException if saw an invalid AST node (e.g. from polyfill) - */ - public function visitUseTrait(Node $node) : Context - { - // Bomb out if we're not in a class context - $class = $this->getContextClass(); - - // @phan-suppress-next-line PhanThrowTypeMismatchForCall should be impossible - $trait_fqsen_list = (new ContextNode( - $this->code_base, - $this->context, - $node->children['traits'] - ))->getTraitFQSENList(); - - // Add each trait to the class - foreach ($trait_fqsen_list as $trait_fqsen) { - $class->addTraitFQSEN($trait_fqsen, $node->children['traits']->lineno ?? 0); - } - - // Get the adaptations for those traits - // Pass in the corresponding FQSENs for those traits. - $trait_adaptations_map = (new ContextNode( - $this->code_base, - $this->context, - $node->children['adaptations'] - ))->getTraitAdaptationsMap($trait_fqsen_list); - - foreach ($trait_adaptations_map as $trait_adaptations) { - $class->addTraitAdaptations($trait_adaptations); - } - - return $this->context; - } - - /** - * Visit a node with kind `\ast\AST_METHOD` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitMethod(Node $node) : Context - { - // Bomb out if we're not in a class context - $class = $this->getContextClass(); - $context = $this->context; - $code_base = $this->code_base; - - $method_name = (string)$node->children['name']; - - $method_fqsen = FullyQualifiedMethodName::make( - $class->getFQSEN(), - $method_name - ); - - // Hunt for an available alternate ID if necessary - $alternate_id = 0; - while ($code_base->hasMethodWithFQSEN($method_fqsen)) { - $method_fqsen = - $method_fqsen->withAlternateId(++$alternate_id); - } - - $method = Method::fromNode( - clone($context), - $code_base, - $node, - $method_fqsen - ); - - if ($context->isPHPInternal()) { - // only for stubs - foreach (FunctionFactory::functionListFromFunction($method) as $method_variant) { - if (!($method_variant instanceof Method)) { - throw new AssertionError("Expected variants of Method to be Method"); - } - $class->addMethod($code_base, $method_variant, new None()); - } - } else { - $class->addMethod($code_base, $method, new None()); - } - - if ('__construct' === $method_name) { - $class->setIsParentConstructorCalled(false); - } elseif ('__invoke' === $method_name) { - // TODO: More precise callable shape - $class->addAdditionalType(CallableType::instance(false)); - } elseif ('__toString' === $method_name - && !$this->context->getIsStrictTypes() - ) { - $class->addAdditionalType(StringType::instance(false)); - } - - - // Create a new context with a new scope - return $this->context->withScope( - $method->getInternalScope() - ); - } - - /** - * Visit a node with kind `\ast\AST_PROP_DECL` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitPropDecl(Node $node) : Context - { - // Bomb out if we're not in a class context - $class = $this->getContextClass(); - $doc_comment = ''; - $first_child_node = $node->children[0] ?? null; - if ($first_child_node instanceof Node) { - $doc_comment = $first_child_node->children['docComment'] ?? ''; - } - // Get a comment on the property declaration - $comment = Comment::fromStringInContext( - $doc_comment, - $this->code_base, - $this->context, - $node->lineno ?? 0, - Comment::ON_PROPERTY - ); - - foreach ($node->children as $i => $child_node) { - // Ignore children which are not property elements - if (!($child_node instanceof Node) - || $child_node->kind != \ast\AST_PROP_ELEM - ) { - continue; - } - $variable = $comment->getVariableList()[$i] ?? null; - $variable_has_literals = $variable && $variable->getUnionType()->hasLiterals(); - - // If something goes wrong will getting the type of - // a property, we'll store it as a future union - // type and try to figure it out later - $future_union_type = null; - - $default_node = $child_node->children['default']; - - $context_for_property = clone($this->context)->withLineNumberStart($child_node->lineno ?? 0); - - if (!($default_node instanceof Node)) { - // Get the type of the default (not a literal) - if ($default_node !== null) { - if ($variable_has_literals) { - $union_type = Type::fromObject($default_node)->asUnionType(); - } else { - $union_type = Type::nonLiteralFromObject($default_node)->asUnionType(); - } - } else { - // This is a declaration such as `public $x;` with no $default_node - // (we don't assume the property is always null, to reduce false positives) - $union_type = UnionType::empty(); - } - } else { - $this->checkNodeIsConstExpr($default_node); - $future_union_type = new FutureUnionType( - $this->code_base, - $context_for_property, - $default_node - ); - $union_type = UnionType::empty(); - } - - $property_name = $child_node->children['name']; - - if (!\is_string($property_name)) { - throw new AssertionError( - 'Property name must be a string. ' - . 'Got ' - . \print_r($property_name, true) - . ' at ' - . $context_for_property - ); - } - - $property_fqsen = FullyQualifiedPropertyName::make( - $class->getFQSEN(), - $property_name - ); - if ($this->code_base->hasPropertyWithFQSEN($property_fqsen)) { - $old_property = $this->code_base->getPropertyByFQSEN($property_fqsen); - if ($old_property->getDefiningFQSEN() === $property_fqsen) { - // Note: PHPDoc properties are parsed by Phan before real properties, so they take precedence (e.g. they are more visible) - // PhanRedefineMagicProperty is a separate check. - if ($old_property->isFromPHPDoc()) { - continue; - } - $this->emitIssue( - Issue::RedefineProperty, - $child_node->lineno, - $property_name, - $this->context->getFile(), - $child_node->lineno, - $this->context->getFile(), - $old_property->getContext()->getLineNumberStart() - ); - continue; - } - } - - $property = new Property( - $context_for_property, - $property_name, - $union_type, - $node->flags ?? 0, - $property_fqsen - ); - - $property->setPhanFlags($comment->getPhanFlagsForProperty()); - $property->setDocComment($doc_comment); - - // Add the property to the class - $class->addProperty($this->code_base, $property, new None()); - - $property->setSuppressIssueSet( - $comment->getSuppressIssueSet() - ); - - // Look for any @var declarations - if ($variable) { - $original_union_type = $union_type; - // We try to avoid resolving $future_union_type except when necessary, - // to avoid issues such as https://github.com/phan/phan/issues/311 and many more. - if ($future_union_type !== null) { - try { - $original_union_type = $future_union_type->get(); - if (!$variable_has_literals) { - $original_union_type = $original_union_type->asNonLiteralType(); - } - // We successfully resolved the union type. We no longer need $future_union_type - $future_union_type = null; - } catch (IssueException $_) { - // Do nothing - } - if ($future_union_type === null) { - if ($original_union_type->isType(ArrayShapeType::empty())) { - $union_type = ArrayType::instance(false)->asUnionType(); - } elseif ($original_union_type->isType(NullType::instance(false))) { - $union_type = UnionType::empty(); - } else { - $union_type = $original_union_type; - } - // Replace the empty union type with the resolved union type. - $property->setUnionType($union_type); - } - } - - if (!$original_union_type->isType(NullType::instance(false)) - && !$original_union_type->canCastToUnionType($variable->getUnionType()) - && !$property->checkHasSuppressIssueAndIncrementCount(Issue::TypeMismatchProperty) - ) { - $this->emitIssue( - Issue::TypeMismatchProperty, - $child_node->lineno ?? 0, - (string)$original_union_type, - $property->asPropertyFQSENString(), - (string)$variable->getUnionType() - ); - } - - $original_property_type = $property->getUnionType(); - $original_variable_type = $variable->getUnionType(); - $variable_type = $original_variable_type->withStaticResolvedInContext($this->context); - if ($variable_type !== $original_variable_type) { - // Instance properties with (at)var static will have the same type as the class they're in - // TODO: Support `static[]` as well when inheriting - if ($property->isStatic()) { - $this->emitIssue( - Issue::StaticPropIsStaticType, - $variable->getLineno(), - $property->getRepresentationForIssue(), - $original_variable_type, - $variable_type - ); - } else { - $property->setHasStaticInUnionType(true); - } - } - if ($variable_type->hasGenericArray() && !$original_property_type->hasTypeMatchingCallback(static function (Type $type) : bool { - return \get_class($type) !== ArrayType::class; - })) { - // Don't convert `/** @var T[] */ public $x = []` to union type `T[]|array` - $property->setUnionType($variable_type); - } else { - // Set the declared type to the doc-comment type and add - // |null if the default value is null - $property->setUnionType($original_property_type->withUnionType($variable_type)); - } - } - - // Don't set 'null' as the type if that's the default - // given that its the default default. - if ($union_type->isType(NullType::instance(false))) { - $union_type = UnionType::empty(); - } - - // Wait until after we've added the (at)var type - // before setting the future so that calling - // $property->getUnionType() doesn't force the - // future to be reified. - if ($future_union_type instanceof FutureUnionType) { - $property->setFutureUnionType($future_union_type); - } - } - - return $this->context; - } - - /** - * Visit a node with kind `\ast\AST_CLASS_CONST_DECL` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * - */ - public function visitClassConstDecl(Node $node) : Context - { - $class = $this->getContextClass(); - - foreach ($node->children as $child_node) { - if (!$child_node instanceof Node) { - throw new AssertionError('expected class const element to be a Node'); - } - $name = $child_node->children['name']; - if (!\is_string($name)) { - throw new AssertionError('expected class const name to be a string'); - } - - $fqsen = FullyQualifiedClassConstantName::make( - $class->getFQSEN(), - $name - ); - if ($this->code_base->hasClassConstantWithFQSEN($fqsen)) { - $old_constant = $this->code_base->getClassConstantByFQSEN($fqsen); - if ($old_constant->getDefiningFQSEN() === $fqsen) { - $this->emitIssue( - Issue::RedefineClassConstant, - $child_node->lineno, - $name, - $this->context->getFile(), - $child_node->lineno, - $this->context->getFile(), - $old_constant->getContext()->getLineNumberStart() - ); - continue; - } - } - - // Get a comment on the declaration - $doc_comment = $child_node->children['docComment'] ?? ''; - $comment = Comment::fromStringInContext( - $doc_comment, - $this->code_base, - $this->context, - $child_node->lineno ?? 0, - Comment::ON_CONST - ); - - $line_number_start = $child_node->lineno ?? 0; - $constant = new ClassConstant( - $this->context - ->withLineNumberStart($line_number_start) - ->withLineNumberEnd($child_node->endLineno ?? $line_number_start), - $name, - UnionType::empty(), - $node->flags ?? 0, - $fqsen - ); - - $constant->setDocComment($doc_comment); - $constant->setIsDeprecated($comment->isDeprecated()); - $constant->setIsNSInternal($comment->isNSInternal()); - $constant->setIsOverrideIntended($comment->isOverrideIntended()); - $constant->setSuppressIssueSet($comment->getSuppressIssueSet()); - $value_node = $child_node->children['value']; - if ($value_node instanceof Node) { - try { - self::checkIsAllowedInConstExpr($value_node); - $constant->setFutureUnionType( - new FutureUnionType( - $this->code_base, - $this->context, - $value_node - ) - ); - } catch (InvalidArgumentException $_) { - $constant->setUnionType(MixedType::instance(false)->asUnionType()); - $this->emitIssue( - Issue::InvalidConstantExpression, - $value_node->lineno - ); - } - } else { - $constant->setUnionType(Type::fromObject($value_node)->asUnionType()); - } - $constant->setNodeForValue($value_node); - - $class->addConstant( - $this->code_base, - $constant - ); - foreach ($comment->getVariableList() as $var) { - if ($var->getUnionType()->hasTemplateTypeRecursive()) { - $this->emitIssue( - Issue::TemplateTypeConstant, - $constant->getFileRef()->getLineNumberStart(), - (string)$constant->getFQSEN() - ); - } - } - } - - return $this->context; - } - - /** - * Visit a node with kind `\ast\AST_STATIC` (a static variable) - */ - public function visitStatic(Node $node) : Context - { - $default = $node->children['default']; - if ($default instanceof Node) { - $this->checkNodeIsConstExpr($default); - } - return $this->context; - } - - private function checkNodeIsConstExpr(Node $node) - { - try { - self::checkIsAllowedInConstExpr($node); - } catch (InvalidArgumentException $_) { - $this->emitIssue( - Issue::InvalidConstantExpression, - $node->lineno - ); - } - } - - /** - * Visit a node with kind `\ast\AST_CONST` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitConstDecl(Node $node) : Context - { - foreach ($node->children as $child_node) { - if (!$child_node instanceof Node) { - throw new AssertionError("Expected global constant element to be a Node"); - } - - $value_node = $child_node->children['value']; - try { - self::checkIsAllowedInConstExpr($value_node); - } catch (InvalidArgumentException $_) { - $this->emitIssue( - Issue::InvalidConstantExpression, - $value_node->lineno - ); - // Note: Global constants with invalid value expressions aren't declared. - // However, class constants are declared with placeholders to make inheritance checks, etc. easier. - // Both will emit PhanInvalidConstantExpression - continue; - } - self::addConstant( - $this->code_base, - $this->context, - $child_node->lineno, - $child_node->children['name'], - $value_node, - $child_node->flags ?? 0, - $child_node->children['docComment'] ?? '', - true - ); - } - - return $this->context; - } - - /** - * Visit a node with kind `\ast\AST_FUNC_DECL` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitFuncDecl(Node $node) : Context - { - $function_name = (string)$node->children['name']; - $context = $this->context; - $code_base = $this->code_base; - - // Hunt for an un-taken alternate ID - $alternate_id = 0; - do { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall this is valid - $function_fqsen = FullyQualifiedFunctionName::fromFullyQualifiedString( - \rtrim($context->getNamespace(), '\\') . '\\' . $function_name - )->withAlternateId($alternate_id++); - } while ($code_base->hasFunctionWithFQSEN($function_fqsen)); - - $func = Func::fromNode( - $context - ->withLineNumberStart($node->lineno ?? 0) - ->withLineNumberEnd($node->endLineno ?? 0), - $code_base, - $node, - $function_fqsen - ); - - if ($context->isPHPInternal()) { - // only for stubs - foreach (FunctionFactory::functionListFromFunction($func) as $func_variant) { - if (!($func_variant instanceof Func)) { - throw new AssertionError("Expecteded variant of Func to be a Func"); - } - $code_base->addFunction($func_variant); - } - } else { - $code_base->addFunction($func); - } - - // Send the context into the function and reset the scope - $context = $this->context->withScope( - $func->getInternalScope() - ); - - return $context; - } - - /** - * Visit a node with kind `\ast\AST_CLOSURE` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitClosure(Node $node) : Context - { - $closure_fqsen = FullyQualifiedFunctionName::fromClosureInContext( - $this->context->withLineNumberStart($node->lineno), - $node - ); - - $func = Func::fromNode( - $this->context, - $this->code_base, - $node, - $closure_fqsen - ); - - $this->code_base->addFunction($func); - - // Send the context into the function and reset the scope - // (E.g. to properly check for the presence of `return` statements. - $context = $this->context->withScope( - $func->getInternalScope() - ); - - return $context; - } - - /** - * Visit a node with kind `\ast\AST_CALL` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitCall(Node $node) : Context - { - // If this is a call to a method that indicates that we - // are treating the method in scope as a varargs method, - // then set its optional args to something very high so - // it can be called with anything. - $expression = $node->children['expr']; - - if ($expression instanceof Node && $expression->kind === \ast\AST_NAME) { - $function_name = \strtolower($expression->children['name']); - if (\in_array($function_name, [ - 'func_get_args', 'func_get_arg', 'func_num_args' - ], true)) { - if ($this->context->isInFunctionLikeScope()) { - $this->context->getFunctionLikeInScope($this->code_base) - ->setNumberOfOptionalParameters(FunctionInterface::INFINITE_PARAMETERS); - } - } elseif ($function_name === 'define') { - $this->analyzeDefine($node); - } elseif ($function_name === 'class_alias') { - if (Config::getValue('enable_class_alias_support') && $this->context->isInGlobalScope()) { - $this->recordClassAlias($node); - } - } - } - if (Config::get_backward_compatibility_checks()) { - $this->analyzeBackwardCompatibility($node); - - foreach ($node->children['args']->children as $arg_node) { - if ($arg_node instanceof Node) { - $this->analyzeBackwardCompatibility($arg_node); - } - } - } - return $this->context; - } - - private function analyzeDefine(Node $node) - { - $args = $node->children['args']; - if (\count($args->children) < 2) { - return; - } - $name = $args->children[0]; - if ($name instanceof Node) { - try { - $name_type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $name, false); - } catch (IssueException $_) { - // If this is really an issue, we'll emit it in the analysis phase when we have all of the element definitions. - return; - } - $name = $name_type->asSingleScalarValueOrNull(); - } - - if (!\is_string($name)) { - return; - } - self::addConstant( - $this->code_base, - $this->context, - $node->lineno, - $name, - $args->children[1], - 0, - '', - true, - true - ); - } - - /** - * Visit a node with kind `\ast\AST_STATIC_CALL` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitStaticCall(Node $node) : Context - { - $call = $node->children['class']; - - if ($call instanceof Node && $call->kind == \ast\AST_NAME) { - $func_name = \strtolower($call->children['name']); - if ($func_name == 'parent') { - // Make sure it is not a crazy dynamic parent method call - if (!($node->children['method'] instanceof Node)) { - $meth = \strtolower($node->children['method']); - - if ($meth == '__construct' && $this->context->isInClassScope()) { - $class = $this->getContextClass(); - $class->setIsParentConstructorCalled(true); - } - } - } - } - - return $this->context; - } - - /** - * Analyze a node for syntax backward compatibility, if that option is enabled - * @return void - */ - private function analyzeBackwardCompatibility(Node $node) - { - if (Config::get_backward_compatibility_checks()) { - (new ContextNode( - $this->code_base, - $this->context, - $node - ))->analyzeBackwardCompatibility(); - } - } - - /** - * Visit a node with kind `\ast\AST_RETURN` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * - * TODO: Defer analysis of the inside of methods until the class gets hydrated. - */ - public function visitReturn(Node $node) : Context - { - $this->analyzeBackwardCompatibility($node); - - // Make sure we're actually returning from a method. - if (!$this->context->isInFunctionLikeScope()) { - return $this->context; - } - - // Get the method/function/closure we're in - $method = $this->context->getFunctionLikeInScope( - $this->code_base - ); - - // Mark the method as returning something if expr is not null - if (isset($node->children['expr'])) { - $method->setHasReturn(true); - } - - return $this->context; - } - - /** - * Visit a node with kind `\ast\AST_YIELD` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - * - * TODO: Defer analysis of the inside of methods until the method/function gets hydrated. - */ - public function visitYield(Node $node) : Context - { - return $this->analyzeYield($node); - } - - /** - * Visit a node with kind `\ast\AST_YIELD_FROM` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitYieldFrom(Node $node) : Context - { - return $this->analyzeYield($node); - } - - - /** - * Visit a node with kind `\ast\AST_YIELD_FROM` or kind `\ast_YIELD` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - private function analyzeYield(Node $node) : Context - { - $this->analyzeBackwardCompatibility($node); - - // Make sure we're actually returning from a method. - if (!$this->context->isInFunctionLikeScope()) { - return $this->context; - } - - // Get the method/function/closure we're in - $method = $this->context->getFunctionLikeInScope( - $this->code_base - ); - - // Mark the method as yielding something (and returning a generator) - $method->setHasYield(true); - $method->setHasReturn(true); - - return $this->context; - } - - /** - * Visit a node with kind `\ast\AST_PRINT` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitPrint(Node $node) : Context - { - // Analyze backward compatibility for the arguments of this print statement. - $this->analyzeBackwardCompatibility($node); - return $this->context; - } - /** - * Visit a node with kind `\ast\AST_ECHO` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitEcho(Node $node) : Context - { - // Analyze backward compatibility for the arguments of this echo statement. - $this->analyzeBackwardCompatibility($node); - return $this->context; - } - - /** - * Visit a node with kind `\ast\AST_METHOD_CALL` - * - * @param Node $node - * A node to parse - * - * @return Context - * A new or an unchanged context resulting from - * parsing the node - */ - public function visitMethodCall(Node $node) : Context - { - // Analyze backward compatibility for the arguments of this method call - $this->analyzeBackwardCompatibility($node); - return $this->context; - } - - public function visitAssign(Node $node) : Context - { - if (!Config::get_backward_compatibility_checks()) { - return $this->context; - } - // Analyze the assignment for compatibility with some - // breaking changes between PHP5 and PHP7. - $var_node = $node->children['var']; - if ($var_node instanceof Node) { - $this->analyzeBackwardCompatibility($var_node); - } - $expr_node = $node->children['expr']; - if ($expr_node instanceof Node) { - $this->analyzeBackwardCompatibility($expr_node); - } - return $this->context; - } - - public function visitDim(Node $node) : Context - { - if (!Config::get_backward_compatibility_checks()) { - return $this->context; - } - - $expr = $node->children['expr']; - if (!($expr instanceof Node)) { - return $this->context; - } - - // check for $$var[] - if ($expr->kind === \ast\AST_VAR - && ($expr->children['name']->kind ?? null) === \ast\AST_VAR - ) { - $temp = $expr->children['name']; - $depth = 1; - while ($temp instanceof Node) { - if (!isset($temp->children['name'])) { - throw new AssertionError("Expected to find a name in context, something else found."); - } - $temp = $temp->children['name']; - $depth++; - } - $dollars = \str_repeat('$', $depth); - $cache_entry = FileCache::getOrReadEntry($this->context->getFile()); - $line = $cache_entry->getLine($node->lineno); - if (!\is_string($line)) { - return $this->context; - } - if (\strpos($line, '{') === false - || \strpos($line, '}') === false - ) { - $this->emitIssue( - Issue::CompatibleExpressionPHP7, - $node->lineno ?? 0, - "{$dollars}{$temp}[]" - ); - } - - // $foo->$bar['baz']; - } elseif ($expr->kind === \ast\AST_PROP && - ($expr->children['expr']->kind ?? null) === ast\AST_VAR && - ($expr->children['prop']->kind ?? null) === ast\AST_VAR - ) { - $cache_entry = FileCache::getOrReadEntry($this->context->getFile()); - $line = $cache_entry->getLines()[$node->lineno] ?? null; - if (!\is_string($line)) { - return $this->context; - } - if (\strpos($line, '{') === false - || \strpos($line, '}') === false - ) { - $this->emitIssue( - Issue::CompatiblePHP7, - $node->lineno ?? 0 - ); - } - } - - return $this->context; - } - - /** - * Add a constant to the codebase - * - * @param CodeBase $code_base - * The global code base in which we store all - * state - * - * @param Context $context - * The context of the parser at the node which declares the constant - * - * @param int $lineno - * The line number where the node declaring the constant was found - * - * @param string $name - * The name of the constant - * - * @param Node|mixed $value - * Either a node or a constant to be used as the value of - * the constant. - * - * @param int $flags - * Any flags on the definition of the constant - * - * @param string $comment_string - * A possibly empty comment string on the declaration - * - * @param bool $use_future_union_type - * Should this lazily resolve the value of the constant declaration? - * - * @param bool $is_fully_qualified - * Is the provided $name already fully qualified? - * - * @return void - */ - public static function addConstant( - CodeBase $code_base, - Context $context, - int $lineno, - string $name, - $value, - int $flags, - string $comment_string, - bool $use_future_union_type, - bool $is_fully_qualified = false - ) { - $i = \strrpos($name, '\\'); - if ($i !== false) { - $name_fragment = (string)\substr($name, $i + 1); - } else { - $name_fragment = $name; - } - if (\in_array(\strtolower($name_fragment), ['true', 'false', 'null'], true)) { - Issue::maybeEmit( - $code_base, - $context, - Issue::ReservedConstantName, - $lineno, - $name - ); - return; - } - try { - // Give it a fully-qualified name - if ($is_fully_qualified) { - $fqsen = FullyQualifiedGlobalConstantName::fromFullyQualifiedString( - $name - ); - } else { - $fqsen = FullyQualifiedGlobalConstantName::fromStringInContext( - $name, - $context - ); - } - } catch (InvalidArgumentException $_) { - Issue::maybeEmit( - $code_base, - $context, - Issue::InvalidConstantFQSEN, - $lineno, - $name - ); - return; - } catch (FQSENException $_) { - Issue::maybeEmit( - $code_base, - $context, - Issue::InvalidConstantFQSEN, - $lineno, - $name - ); - return; - } - - // Create the constant - $constant = new GlobalConstant( - $context->withLineNumberStart($lineno ?? 0), - $name, - UnionType::empty(), - $flags, - $fqsen - ); - - if ($code_base->hasGlobalConstantWithFQSEN($fqsen)) { - $other_constant = $code_base->getGlobalConstantByFQSEN($fqsen); - $other_context = $other_constant->getContext(); - if (!$other_context->equals($context)) { - // Be consistent about the constant's type and only track the first declaration seen when parsing (or redeclarations) - // Note that global constants don't have alternates. - return; - } - // Keep track of old references to the new constant - $constant->copyReferencesFrom($other_constant); - - // Otherwise, add the constant now that we know about all of the elements in the codebase - } - - // Get a comment on the declaration - $comment = Comment::fromStringInContext( - $comment_string, - $code_base, - $context, - $lineno ?? 0, - Comment::ON_CONST - ); - - if ($use_future_union_type) { - if ($value instanceof Node) { - $constant->setFutureUnionType( - new FutureUnionType( - $code_base, - $context, - $value - ) - ); - } else { - $constant->setUnionType(Type::fromObject($value)->asUnionType()); - } - } else { - $constant->setUnionType(UnionTypeVisitor::unionTypeFromNode($code_base, $context, $value)); - } - - $constant->setNodeForValue($value); - $constant->setDocComment($comment_string); - - $constant->setIsDeprecated($comment->isDeprecated()); - $constant->setIsNSInternal($comment->isNSInternal()); - - $code_base->addGlobalConstant( - $constant - ); - } - - /** - * @return Clazz - * Get the class on this scope or fail real hard - */ - private function getContextClass() : Clazz - { - // throws AssertionError if not in class scope - return $this->context->getClassInScope($this->code_base); - } - - /** - * Return the existence of a class_alias from one FQSEN to the other. - * Modifies $this->codebase if successful. - * - * Supports 'MyClass' and MyClass::class - * - * @param Node $node - An AST_CALL node with name 'class_alias' to attempt to resolve - * @return void - */ - private function recordClassAlias(Node $node) - { - $args = $node->children['args']->children; - if (\count($args) < 2 || \count($args) > 3) { - return; - } - $code_base = $this->code_base; - $context = $this->context; - try { - $original_fqsen = (new ContextNode($code_base, $context, $args[0]))->resolveClassNameInContext(); - $alias_fqsen = (new ContextNode($code_base, $context, $args[1]))->resolveClassNameInContext(); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $code_base, - $context, - $exception->getIssueInstance() - ); - return; - } - - if ($original_fqsen === null || $alias_fqsen === null) { - return; - } - - // Add the class alias during parse phase. - // Figure out if any of the aliases are wrong after analysis phase. - $this->code_base->addClassAlias($original_fqsen, $alias_fqsen, $context, $node->lineno ?? 0); - } - - /** - * Visit a node with kind `\ast\AST_NAMESPACE` - * Store the maps for use statements in the CodeBase to use later during analysis. - * - * @param Node $node - * A node to parse - * - * @return Context - * A new context resulting from parsing the node - */ - public function visitNamespace(Node $node) : Context - { - $context = $this->context; - // @phan-suppress-next-line PhanAccessMethodInternal addParsedNamespaceMap and getNamespaceMap - $this->code_base->addParsedNamespaceMap($context->getFile(), $context->getNamespace(), $context->getNamespaceId(), $context->getNamespaceMap()); - return parent::visitNamespace($node); - } - - // common no-ops - /** @return Context */ - public function visitArrayElem(Node $node) - { - return $this->context; - } - /** @return Context */ - public function visitVar(Node $node) - { - return $this->context; - } - /** @return Context */ - public function visitName(Node $node) - { - return $this->context; - } - /** @return Context */ - public function visitArgList(Node $node) - { - return $this->context; - } - /** @return Context */ - public function visitStmtList(Node $node) - { - return $this->context; - } - /** @return Context */ - public function visitProp(Node $node) - { - return $this->context; - } - /** @return Context */ - public function visitArray(Node $node) - { - return $this->context; - } - /** @return Context */ - public function visitBinaryOp(Node $node) - { - return $this->context; - } - - /** - * @internal - */ - const ALLOWED_CONST_EXPRESSION_KINDS = [ - ast\AST_ARRAY_ELEM => true, - ast\AST_ARRAY => true, - ast\AST_BINARY_OP => true, - ast\AST_CLASS_CONST => true, - ast\AST_CONDITIONAL => true, - ast\AST_CONST => true, - ast\AST_DIM => true, - ast\AST_MAGIC_CONST => true, - ast\AST_NAME => true, - ast\AST_UNARY_OP => true, - ]; - - /** - * This is meant to avoid causing errors in Phan where Phan expects a constant to be found. - * - * @param Node|string|float|int|bool|null $n - * - * @return void - If this doesn't throw, then $n is a valid constant AST. - * - * @throws InvalidArgumentException if this is not allowed in a constant expression - * Based on zend_bool zend_is_allowed_in_const_expr from Zend/zend_compile.c - * - * @internal - */ - public static function checkIsAllowedInConstExpr($n) - { - if (!($n instanceof Node)) { - return; - } - if (!\array_key_exists($n->kind, self::ALLOWED_CONST_EXPRESSION_KINDS)) { - throw new InvalidArgumentException(); - } - foreach ($n->children as $child_node) { - self::checkIsAllowedInConstExpr($child_node); - } - } - - /** - * @param Node|string|float|int|bool|null $n - * @return bool - If true, then $n is a valid constant AST. - */ - public static function isConstExpr($n) : bool - { - try { - self::checkIsAllowedInConstExpr($n); - return true; - } catch (InvalidArgumentException $_) { - return false; - } - } -} diff --git a/vendor/phan/phan/src/Phan/Phan.php b/vendor/phan/phan/src/Phan/Phan.php deleted file mode 100644 index 67712bc..0000000 --- a/vendor/phan/phan/src/Phan/Phan.php +++ /dev/null @@ -1,712 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use AssertionError; -use Closure; -use Exception; -use InvalidArgumentException; -use Phan\Daemon\Request; -use Phan\Language\Type; -use Phan\LanguageServer\LanguageServer; -use Phan\LanguageServer\Logger as LanguageServerLogger; -use Phan\Library\FileCache; -use Phan\Library\StringUtil; -use Phan\Output\BufferedPrinterInterface; -use Phan\Output\Collector\BufferingCollector; -use Phan\Output\IgnoredFilesFilterInterface; -use Phan\Output\IssueCollectorInterface; -use Phan\Output\IssuePrinterInterface; -use Phan\Plugin\ConfigPluginSet; -use function array_filter; -use function array_flip; -use function array_merge; -use function array_unique; -use function array_values; -use function class_exists; -use function count; -use function file_exists; -use function file_put_contents; -use function fprintf; -use function fwrite; -use function gc_enable; -use function getmypid; -use function in_array; -use function is_array; -use function is_file; -use function is_string; -use function json_encode; -use function memory_get_peak_usage; -use function memory_get_usage; -use function preg_match; -use function realpath; -use function sort; -use function sprintf; -use function str_replace; -use function var_export; -use const EXIT_FAILURE; -use const EXIT_SUCCESS; -use const JSON_PRETTY_PRINT; -use const PHP_DEBUG; -use const SORT_STRING; -use const STDERR; - -/** - * This executes the parse, method/function, then the analysis phases. - * - * This is the entry point of Phan's implementation. - * Implementations such as `./phan` or the code climate integration call into this. - * - * @see self::analyzeFileList() - */ -class Phan implements IgnoredFilesFilterInterface -{ - /** @var IssuePrinterInterface used to print formatted issues. */ - public static $printer; - - /** @var IssueCollectorInterface used to gather issues to be printed (or used) once analysis is finished */ - private static $issue_collector; - - /** - * @return IssueCollectorInterface used to gather issues to be printed (or used) once analysis is finished - */ - public static function getIssueCollector() : IssueCollectorInterface - { - return self::$issue_collector; - } - - /** - * Set the IssueCollectorInterface used to gather issues to be printed (or used) once analysis is finished - * @param IssueCollectorInterface $issue_collector - * - * @return void - */ - public static function setIssueCollector( - IssueCollectorInterface $issue_collector - ) { - self::$issue_collector = $issue_collector; - } - - /** - * Take an array of serialized issues, unserialize them and then add - * them to the issue collector. - * - * @param IssueInstance[][] $results - */ - private static function collectSerializedResults(array $results) - { - $collector = self::getIssueCollector(); - foreach ($results as $issues) { - if (!$issues) { - continue; - } - - foreach ($issues as $issue) { - $collector->collectIssue($issue); - } - } - } - - /** - * Analyze the given set of files and emit any issues - * found to STDOUT. - * - * @param CodeBase $code_base - * A code base needs to be passed in because we require - * it to be initialized before any classes or files are - * loaded. - * - * @param Closure $file_path_lister - * Returns a list of files to scan (string[]) - * - * @return bool - * We emit messages to the configured printer and return - * true if issues were found. - * - * @see \Phan\CodeBase - * - * @throws Exception if analysis fails unrecoverably or in an unexpected way - */ - public static function analyzeFileList( - CodeBase $code_base, - Closure $file_path_lister - ) : bool { - if (!class_exists('\ast\Node')) { - // Fix for https://github.com/phan/phan/issues/2287 - require_once __DIR__ . '/AST/TolerantASTConverter/ast_shim.php'; - } - FileCache::setMaxCacheSize(FileCache::MINIMUM_CACHE_SIZE); - self::checkForSlowPHPOptions(); - Config::warnIfInvalid(); - self::loadConfiguredPHPExtensionStubs($code_base); - $is_daemon_request = Config::getValue('daemonize_socket') || Config::getValue('daemonize_tcp'); - $language_server_config = Config::getValue('language_server_config'); - $is_undoable_request = is_array($language_server_config) || $is_daemon_request; - if (Config::getValue('language_server_use_pcntl_fallback')) { - // The PCNTL fallback generates cyclic references (to the CodeBase instance which references many other things) in createRestorePoint, - // so we need to garbage collect that. - // This is probably the only part of the code which generates cyclic references - // - // 1. Phan clones the old codebase to restore it, and cyclic references exist as a side effect. - // - // This causes memory usage to increase while typing. - // - // Memory inspection/profiling would help with creating a better fix. - // 2. It's possible that some plugins may benefit from garbage collection. - // - // This fix works in PHP 7.3, which has an improved garbage collector. - // It might not work as well in earlier PHP versions on large codebases. - gc_enable(); - } - if ($is_daemon_request) { - $code_base->eagerlyLoadAllSignatures(); - } - if ($is_undoable_request) { - self::checkForOptionsConflictingWithServerModes(); - $code_base->enableUndoTracking(); - } - - $file_path_list = $file_path_lister(); - - $file_count = count($file_path_list); - if ($file_count === 0) { - fprintf(STDERR, "Phan did not parse any files in the project %s - This may be an issue with the Phan config or CLI options.\n", StringUtil::jsonEncode(Config::getProjectRootDirectory())); - } - - // We'll construct a set of files that we'll - // want to run an analysis on - $analyze_file_path_list = []; - - if (Config::getValue('consistent_hashing_file_order')) { - // Parse the files in lexicographic order. - // If there are duplicate class/function definitions, - // this ensures they are added to the maps in the same order. - sort($file_path_list, SORT_STRING); - } - - if (Config::getValue('dump_parsed_file_list') === true) { - // If --dump-parsed-file-list is provided, - // print the files in the order they would be parsed. - echo \implode("\n", $file_path_list) . (count($file_path_list) > 0 ? "\n" : ""); - exit(EXIT_SUCCESS); - } - - // This first pass parses code and populates the - // global state we'll need for doing a second - // analysis after. - CLI::progress('parse', 0.0, null); - $code_base->setCurrentParsedFile(null); - foreach ($file_path_list as $i => $file_path) { - $file_path = (string)$file_path; - - $code_base->setCurrentParsedFile($file_path); - CLI::progress('parse', ($i + 1) / $file_count, $file_path); - - // Kick out anything we read from the former version - // of this file - $code_base->flushDependenciesForFile($file_path); - - // If the file is gone, no need to continue - $real = realpath($file_path); - if ($real === false || !file_exists($real)) { - continue; - } - try { - // Parse the file - Analysis::parseFile($code_base, $file_path); - - // Save this to the set of files to analyze - $analyze_file_path_list[] = $file_path; - } catch (\AssertionError $assertion_error) { - fwrite(STDERR, "While parsing $file_path...\n"); - fwrite(STDERR, "$assertion_error\n"); - exit(EXIT_FAILURE); - } catch (\Throwable $throwable) { - // Catch miscellaneous errors such as $throwable and print their stack traces. - fwrite(STDERR, "While parsing $file_path, caught: " . $throwable . "\n"); - $code_base->recordUnparsableFile($file_path); - } - } - $code_base->setCurrentParsedFile(null); - ConfigPluginSet::instance()->beforeAnalyze($code_base); - if ($is_undoable_request) { - $code_base->setExpectChangesToFileContents(); - } - - // Don't continue on to analysis if the user has - // chosen to just dump the AST - if (Config::getValue('dump_ast')) { - exit(EXIT_SUCCESS); - } - - if (is_string(Config::getValue('dump_signatures_file'))) { - exit(self::dumpSignaturesToFile($code_base, Config::getValue('dump_signatures_file'))); - } - - $temporary_file_mapping = []; - - $request = null; - Type::clearAllMemoizations(); - if ($is_undoable_request) { - if (!$code_base->isUndoTrackingEnabled()) { - throw new AssertionError("Expected undo tracking to be enabled"); - } - if ($is_daemon_request) { - if (is_array($language_server_config)) { - throw new AssertionError('cannot use language server config for daemon mode'); - } - // Garbage collecting cycles doesn't help or hurt much here. Thought it would change something.. - // TODO: check for conflicts with other config options - - // incompatible with dump_ast, dump_signatures_file, output-file, etc. - // incompatible with dead_code_detection - - // This will fork and fall through every time a request to re-analyze the file set comes in. - // TODO: The daemon should be periodically restarted? - $request = Daemon::run($code_base, $file_path_lister); - if (!$request) { - // TODO: Add a way to cleanly shut down. - fwrite(STDERR, "Finished serving requests, exiting\n"); - exit(2); - } - } else { - if (!is_array($language_server_config)) { - throw new AssertionError("Language server config must be an array"); - } - LanguageServerLogger::logInfo(sprintf("Starting accepting connections on the language server (pid=%s)", getmypid() ?: 'unknown')); - $request = LanguageServer::run($code_base, $file_path_lister, $language_server_config); - if (!$request) { - // TODO: Add a way to cleanly shut down. - fwrite(STDERR, "Finished serving requests, exiting\n"); - exit(2); - } - LanguageServerLogger::logInfo(sprintf("language server (pid=%s) accepted connection", getmypid() ?: 'unknown')); - } - self::setPrinter($request->getPrinter()); - - // This is the list of all of the parsed files - // (Also includes files which don't declare classes/functions/constants) - $analyze_file_path_list = $request->filterFilesToAnalyze($code_base->getParsedFilePathList()); - if (count($analyze_file_path_list) === 0) { - $request->respondWithNoFilesToAnalyze(); // respond and exit. - exit(0); // This is normal (E.g. .txt files, files outside of analysis list, etc) - } - - // Do this before we stop tracking undo operations. - $temporary_file_mapping = $request->getTemporaryFileMapping(); - - // Stop tracking undo operations, now that the parse phase is done. - $code_base->disableUndoTracking(); - } - - return self::finishAnalyzingRemainingStatements($code_base, $request, $analyze_file_path_list, $temporary_file_mapping); - } - - private static function checkForOptionsConflictingWithServerModes() - { - if (Config::isIssueFixingPluginEnabled()) { - fwrite(STDERR, "Cannot use --automatic-fix in daemon mode or with the language server\n"); - exit(EXIT_FAILURE); - } - } - - /** - * Finish analyzing any files that need to be analyzed. - * (for full analysis, or a limited number of files for daemon mode, etc.) - * - * @param CodeBase $code_base - * A code base needs to be passed in because we require - * it to be initialized before any classes or files are - * loaded. - * - * @param ?Request $request - * @param array<int,string> $analyze_file_path_list - * @param array<string,string> $temporary_file_mapping - * - * @throws Exception if analysis failed catastrophically - */ - public static function finishAnalyzingRemainingStatements( - CodeBase $code_base, - $request, - array $analyze_file_path_list, - array $temporary_file_mapping - ) : bool { - try { - // With parsing complete, we need to tell the code base to - // start hydrating any requested elements on their way out. - // Hydration expands class types, imports parent methods, - // properties, etc., and does stuff like that. - // - // This is an optimization that saves us a significant - // amount of time on very large code bases. Instead of - // hydrating all classes, we only hydrate the things we - // actually need. When running as multiple processes this - // lets us only need to do hydrate a subset of classes. - $code_base->setShouldHydrateRequestedElements(true); - - // This is only needed when `pcntl` *isn't* used. - // This object (if non-null) removes the temporary plugins added to implement "Go To Definition", etc. - $raii = ConfigPluginSet::instance()->addTemporaryAnalysisPlugin($code_base, $request); - - // TODO: consider filtering if Config::getValue('include_analysis_file_list') is set - // most of what needs considering is that Analysis::analyzeClasses() and Analysis:analyzeFunctions() have side effects - // these side effects don't matter in daemon mode, but they do matter with this other form of incremental analysis - // other parts of these analysis steps could be skipped, which would reduce the overall execution time - $path_filter = isset($request) ? array_flip($analyze_file_path_list) : null; - - // Tie class aliases together with the source class - if (Config::getValue('enable_class_alias_support')) { - $code_base->resolveClassAliases(); - } - - // Take a pass over all classes verifying - // various states now that we have the whole - // state in memory - Analysis::analyzeClasses($code_base, $path_filter); - - // Take a pass over all functions verifying - // various states now that we have the whole - // state in memory - Analysis::analyzeFunctions($code_base, $path_filter); - - if (Config::getValue('dump_matching_functions')) { - exit(EXIT_SUCCESS); - } - - Analysis::loadMethodPlugins($code_base); - - // Filter out any files that are to be excluded from - // analysis - $analyze_file_path_list = array_filter( - $analyze_file_path_list, - static function (string $file_path) : bool { - return !self::isExcludedAnalysisFile($file_path); - } - ); - if ($request instanceof Request && count($analyze_file_path_list) === 0) { - $request->respondWithNoFilesToAnalyze(); - exit(0); - } - - // Get the count of all files we're going to analyze - $file_count = count($analyze_file_path_list); - - // Prevent an ugly failure if we have no files to - // analyze. - if (0 == $file_count) { - return false; - } - - // Get a map from process_id to the set of files that - // the given process should analyze in a stable order - $process_file_list_map = - (new Ordering($code_base))->orderForProcessCount( - Config::getValue('processes'), - $analyze_file_path_list - ); - - /** - * This worker takes a file and analyzes it - * @return void - */ - $analysis_worker = static function (int $i, string $file_path) use ($file_count, $code_base, $temporary_file_mapping, $request) { - CLI::progress('analyze', ($i + 1) / $file_count, $file_path); - Analysis::analyzeFile($code_base, $file_path, $request, $temporary_file_mapping[$file_path] ?? null); - }; - - // Determine how many processes we're running on. This may be - // less than the provided number if the files are bunched up - // excessively. - $process_count = count($process_file_list_map); - - if (!($process_count > 0 && $process_count <= Config::getValue('processes'))) { - throw new AssertionError( - "The process count must be between 1 and the given number of processes. After mapping files to cores, $process_count process were set to be used." - ); - } - - $did_fork_pool_have_error = false; - - CLI::progress('analyze', 0.0, null); - // Check to see if we're running as multiple processes - // or not - if ($process_count > 1) { - // Run analysis one file at a time, splitting the set of - // files up among a given number of child processes. - $pool = new ForkPool( - $process_file_list_map, - /** @return void */ - static function () { - // Remove any issues that were collected prior to forking - // to prevent duplicate issues in the output. - self::getIssueCollector()->reset(); - }, - $analysis_worker, - /** - * @return array<int,IssueInstance> the list of collected issues from calls to collectIssue() - */ - static function () use ($code_base) : array { - // This closure is run once, after running analysis_worker on each input. - // If there are any plugins defining finalizeProcess(), run those. - ConfigPluginSet::instance()->finalizeProcess($code_base); - - // Return the collected issues to be serialized. - return self::getIssueCollector()->getCollectedIssues(); - } - ); - - // Wait for all tasks to complete and collect the results. - self::collectSerializedResults($pool->wait()); - $did_fork_pool_have_error = $pool->didHaveError(); - } else { - // Get the task data from the 0th processor - $analyze_file_path_list = array_values($process_file_list_map)[0]; - - // If we're not running as multiple processes, just iterate - // over the file list and analyze them - foreach ($analyze_file_path_list as $i => $file_path) { - $analysis_worker($i, $file_path); - } - - // Scan through all globally accessible elements - // in the code base and emit errors for dead - // code. - Analysis::analyzeDeadCode($code_base); - - // If there are any plugins defining finalizeProcess(), run those. - ConfigPluginSet::instance()->finalizeProcess($code_base); - } - - // Get a count of the number of issues that were found - $issue_count = count((self::$issue_collector)->getCollectedIssues()); - $is_issue_found = - 0 !== $issue_count; - - // Indicate that --progress-bar or --debug has finished, if needed. - CLI::endProgressBar(); - - // Collect all issues, blocking - self::display(); - - if (Config::getValue('print_memory_usage_summary')) { - self::printMemoryUsageSummary(); - } - } catch (Exception $e) { - if ($request instanceof Request) { - // Give people using the language server client/daemon a somewhat useful response. - $request->sendJSONResponse([ - "status" => Request::STATUS_ERROR_UNKNOWN, - "issue_count" => 1, - "issues" => 'Failed to analyze files: Uncaught exception: ' . (string)$e, - ]); - $request->exit(EXIT_SUCCESS); - } - throw $e; - } - - if ($request instanceof Request) { - $request->respondWithIssues($issue_count); - $request->exit(EXIT_SUCCESS); - } - - if (Config::getValue('print_memory_usage_summary')) { - self::printMemoryUsageSummary(); - } - - if ($did_fork_pool_have_error) { - // Make fork pool errors (e.g. due to memory limits) easy to detect when running CI jobs. - return true; - } - - return $is_issue_found; - } - - /** - * @param CodeBase $code_base - * A code base needs to be passed in because we require - * it to be initialized before any classes or files are - * loaded. - * - * @param string[] $file_path_list - * A set of files to expand with the set of dependencies - * on those files. - * - * @return array<int,string> - * Get an expanded list of files and dependencies for - * the given file list - * - * TODO: This is no longer referenced, was removed while sqlite3 was temporarily removed. - * It would help in daemon mode if this was re-enabled - * @suppress PhanUnreferencedPublicMethod potentially useful but currently unused - */ - public static function expandedFileList( - CodeBase $code_base, - array $file_path_list - ) : array { - - $file_count = count($file_path_list); - - // We'll construct a set of files that we'll - // want to run an analysis on - $dependency_file_path_list = []; - - CLI::progress('dependencies', 0.0, null); // trigger UI update of 0% - foreach ($file_path_list as $i => $file_path) { - CLI::progress('dependencies', ($i + 1) / $file_count, $file_path); - - // Add the file itself to the list - $dependency_file_path_list[] = $file_path; - - // Add any files that depend on this file - $dependency_file_path_list = array_merge( - $dependency_file_path_list, - $code_base->dependencyListForFile($file_path) - ); - } - - return array_unique($dependency_file_path_list); - } - - /** - * @return bool - * True if this file is a member of a third party directory as - * configured via the CLI flag '-3 [paths]'. - */ - public static function isExcludedAnalysisFile( - string $file_path - ) : bool { - $include_analysis_file_list = Config::getValue('include_analysis_file_list'); - if ($include_analysis_file_list) { - return !in_array($file_path, $include_analysis_file_list, true); - } - - $file_path = str_replace('\\', '/', $file_path); - $exclude_analysis_regex = Config::getValue('__exclude_analysis_regex'); - if ($exclude_analysis_regex) { - if (preg_match($exclude_analysis_regex, $file_path)) { - return true; - } - } - - return false; - } - - /** - * Emit all collected issues - * - * @return void - */ - private static function display() - { - $collector = self::$issue_collector; - - $printer = self::$printer; - - foreach ($collector->getCollectedIssues() as $issue) { - $printer->print($issue); - } - - if ($collector instanceof BufferingCollector) { - $collector->flush(); - } - - if ($printer instanceof BufferedPrinterInterface) { - $printer->flush(); - } - } - - /** - * Save json encoded function&method signature to a map. - * @return int - Exit code for process - */ - private static function dumpSignaturesToFile(CodeBase $code_base, string $filename) : int - { - $encoded_signatures = json_encode($code_base->exportFunctionAndMethodSet(), JSON_PRETTY_PRINT); - if (!file_put_contents($filename, $encoded_signatures)) { - fprintf(STDERR, "Could not save contents to path '%s'\n", $filename); - return EXIT_FAILURE; - } - return EXIT_SUCCESS; - } - - /** - * @return void - */ - private static function printMemoryUsageSummary() - { - $memory = memory_get_usage() / 1024 / 1024; - $peak = memory_get_peak_usage() / 1024 / 1024; - fwrite(STDERR, sprintf("Memory usage after analysis completed: %.02dMB/%.02dMB\n", $memory, $peak)); - } - - /** - * Set the printer to use for emitting issues. - * @return void - */ - public static function setPrinter( - IssuePrinterInterface $printer - ) { - self::$printer = $printer; - } - - /** - * @param string $filename - * - * @return bool True if filename is ignored during analysis - */ - public function isFilenameIgnored(string $filename) : bool - { - return self::isExcludedAnalysisFile($filename); - } - - /** - * Logs slow php options to stdout - * @return void - */ - private static function checkForSlowPHPOptions() - { - static $did_check = false; - if ($did_check) { - // Only perform this check once (e.g. in unit tests - return; - } - $did_check = true; - if (Config::getValue('skip_slow_php_options_warning')) { - return; - } - $warned = false; - // Unless debugging Phan itself, these two configurations are unnecessarily adding slowness. - if (PHP_DEBUG) { - fwrite(STDERR, "Warning: Phan is around twice as slow when php is compiled with --enable-debug (That option is only needed when debugging Phan itself).\n"); - $warned = true; - } - // We warn about xdebug in src/codebase.php, so skip that check here. - if ($warned) { - fwrite(STDERR, "(The above warning(s) about slow PHP settings can be disabled by setting 'skip_slow_php_options_warning' to true in .phan/config.php)\n"); - } - } - - /** - * Loads configured stubs for internal PHP extensions. - * @return void - * @throws InvalidArgumentException if the stubs or stub config is invalid - */ - private static function loadConfiguredPHPExtensionStubs(CodeBase $code_base) - { - $stubs = Config::getValue('autoload_internal_extension_signatures'); - foreach ($stubs ?: [] as $extension_name => $path_to_extension) { - // Prefer using reflection info from the running extension over what's in the stub files. - // (The originals were already added to the CodeBase) - if (\extension_loaded($extension_name)) { - continue; - } - if (!is_string($path_to_extension)) { - throw new \InvalidArgumentException("Invalid autoload_internal_extension_signatures: path for $extension_name is not a string: value: " . var_export($path_to_extension, true)); - } - $path_to_extension = Config::projectPath($path_to_extension); - if (!is_file($path_to_extension)) { - throw new \InvalidArgumentException("Invalid autoload_internal_extension_signatures: path for $extension_name is not a file: value: " . var_export($path_to_extension, true)); - } - Analysis::parseFile($code_base, $path_to_extension, false, null, true); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/ClosuresForKind.php b/vendor/phan/phan/src/Phan/Plugin/ClosuresForKind.php deleted file mode 100644 index 3b0d194..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/ClosuresForKind.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin; - -use AssertionError; -use Closure; -use InvalidArgumentException; -use Phan\AST\Visitor\Element; - -/** - * Tracks the closures that need to be executed for the set of possible \ast\Node->kind values. - * Once the plugin set is done adding closures, this will return an array - * mapping the node kind to a single Closure to execute - * (which will run all of the plugins) - * - * - If no closures were added for a given node kind, then there will be no entry in that array. - * - * @internal - */ -class ClosuresForKind -{ - /** - * @var array<int,array<int,Closure>> Maps a node kind to a list of 1 or more (unflattened) closures to execute on nodes of that kind. - */ - private $closures = []; - - public function __construct() - { - } - - /** - * Record the fact that the resulting closure for Node kind $kind should invoke $c - * - * @param int $kind - A valid value of a node kind - * @param Closure $c - * @return void - * @throws InvalidArgumentException if $kind is invalid - */ - public function record(int $kind, Closure $c) - { - if (!\array_key_exists($kind, Element::VISIT_LOOKUP_TABLE)) { - throw new InvalidArgumentException("Invalid node kind $kind"); - } - if (!isset($this->closures[$kind])) { - $this->closures[$kind] = []; - } - $this->closures[$kind][] = $c; - } - - /** - * Record the fact that the resulting Closure needs to call $c for the given subset of values of node->kind - * - * @param array<int,int> $kinds - A list of unique values of node kinds - * @param Closure $c - The closure to execute on each of those kinds - * @return void - */ - public function recordForKinds(array $kinds, Closure $c) - { - foreach ($kinds as $kind) { - $this->record($kind, $c); - } - } - - /** - * @param Closure $flattener - * @return array<int,Closure> (Maps a subset of node kinds to a closure to execute for that node kind.) - */ - public function getFlattenedClosures(Closure $flattener) - { - \ksort($this->closures); - $merged_closures = []; - foreach ($this->closures as $kind => $closure_list) { - if (\count($closure_list) === 1) { - // If there's exactly one closure for a given kind, then execute it directly. - $merged_closures[$kind] = $closure_list[0]; - } else { - // Create a closure which will execute 2 or more closures. - $closure = $flattener($closure_list); - if (!($closure instanceof Closure)) { - throw new AssertionError("Expected closure flattener to return a closure for kind=$kind"); - } - $merged_closures[$kind] = $closure; - } - } - return $merged_closures; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/ConfigPluginSet.php b/vendor/phan/phan/src/Phan/Plugin/ConfigPluginSet.php deleted file mode 100644 index 74f76de..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/ConfigPluginSet.php +++ /dev/null @@ -1,1148 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin; - -use AssertionError; -use ast\Node; -use Closure; -use Phan\AST\Visitor\Element; -use Phan\CodeBase; -use Phan\Config; -use Phan\Daemon\Request; -use Phan\Exception\IssueException; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Method; -use Phan\Language\Element\Property; -use Phan\Language\Element\TypedElement; -use Phan\Language\Element\UnaddressableTypedElement; -use Phan\Language\FQSEN; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\LanguageServer\CompletionRequest; -use Phan\LanguageServer\CompletionResolver; -use Phan\LanguageServer\DefinitionResolver; -use Phan\LanguageServer\GoToDefinitionRequest; -use Phan\Library\RAII; -use Phan\Plugin\Internal\ArrayReturnTypeOverridePlugin; -use Phan\Plugin\Internal\BuiltinSuppressionPlugin; -use Phan\Plugin\Internal\CallableParamPlugin; -use Phan\Plugin\Internal\ClosureReturnTypeOverridePlugin; -use Phan\Plugin\Internal\CompactPlugin; -use Phan\Plugin\Internal\DependentReturnTypeOverridePlugin; -use Phan\Plugin\Internal\ExtendedDependentReturnTypeOverridePlugin; -use Phan\Plugin\Internal\IssueFixingPlugin\IssueFixer; -use Phan\Plugin\Internal\MiscParamPlugin; -use Phan\Plugin\Internal\NodeSelectionPlugin; -use Phan\Plugin\Internal\NodeSelectionVisitor; -use Phan\Plugin\Internal\RequireExistsPlugin; -use Phan\Plugin\Internal\StringFunctionPlugin; -use Phan\Plugin\Internal\ThrowAnalyzerPlugin; -use Phan\Plugin\Internal\VariableTrackerPlugin; -use Phan\PluginV2; -use Phan\PluginV2\AfterAnalyzeFileCapability; -use Phan\PluginV2\AnalyzeClassCapability; -use Phan\PluginV2\AnalyzeFunctionCallCapability; -use Phan\PluginV2\AnalyzeFunctionCapability; -use Phan\PluginV2\AnalyzeMethodCapability; -use Phan\PluginV2\AnalyzePropertyCapability; -use Phan\PluginV2\AutomaticFixCapability; -use Phan\PluginV2\BeforeAnalyzeCapability; -use Phan\PluginV2\BeforeAnalyzeFileCapability; -use Phan\PluginV2\FinalizeProcessCapability; -use Phan\PluginV2\HandleLazyLoadInternalFunctionCapability; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PluginAwarePreAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; -use Phan\PluginV2\PreAnalyzeNodeCapability; -use Phan\PluginV2\ReturnTypeOverrideCapability; -use Phan\PluginV2\SuppressionCapability; -use Phan\Suggestion; -use ReflectionException; -use ReflectionProperty; -use Throwable; -use UnusedSuppressionPlugin; -use function get_class; -use function is_null; -use function is_object; -use const EXIT_FAILURE; -use const PHP_EOL; -use const STDERR; - -/** - * The root plugin that calls out each hook - * on any plugins defined in the configuration. - * - * (Note: This is called almost once per each AST node being analyzed. - * Speed is preferred over using Phan\Memoize.) - * - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod TODO: Document - */ -final class ConfigPluginSet extends PluginV2 implements - AfterAnalyzeFileCapability, - AnalyzeClassCapability, - AnalyzeFunctionCapability, - AnalyzeFunctionCallCapability, - AnalyzeMethodCapability, - AnalyzePropertyCapability, - BeforeAnalyzeCapability, - BeforeAnalyzeFileCapability, - FinalizeProcessCapability, - ReturnTypeOverrideCapability, - SuppressionCapability -{ - - /** @var array<int,PluginV2>|null - Cached plugin set for this instance. Lazily generated. */ - private $plugin_set; - - /** - * @var array<int,Closure>|null - plugins to analyze nodes in pre order. - * @phan-var array<int,Closure(CodeBase,Context,Node):void>|null - */ - private $pre_analyze_node_plugin_set; - - /** - * @var array<int,Closure> - plugins to analyze files - * @phan-var array<int,Closure(CodeBase,Context,Node|int|string|float,array<int,Node>):void>|null - */ - private $post_analyze_node_plugin_set; - - /** - * @var array<int,BeforeAnalyzeFileCapability> - plugins to analyze files before Phan's analysis of that file is completed. - */ - private $before_analyze_file_plugin_set; - - /** - * @var array<int,BeforeAnalyzeCapability> - plugins to analyze the project before Phan starts the analyze phase. - */ - private $before_analyze_plugin_set; - - /** - * @var array<int,AfterAnalyzeFileCapability> - plugins to analyze files after Phan's analysis of that file is completed. - */ - private $after_analyze_file_plugin_set; - - /** @var array<int,AnalyzeClassCapability>|null - plugins to analyze class declarations. */ - private $analyze_class_plugin_set; - - /** @var array<int,AnalyzeFunctionCallCapability>|null - plugins to analyze invocations of subsets of functions and methods. */ - private $analyze_function_call_plugin_set; - - /** @var array<int,AnalyzeFunctionCapability>|null - plugins to analyze function declarations. */ - private $analyze_function_plugin_set; - - /** @var array<int,AnalyzePropertyCapability>|null - plugins to analyze property declarations. */ - private $analyze_property_plugin_set; - - /** @var array<int,AnalyzeMethodCapability>|null - plugins to analyze method declarations.*/ - private $analyze_method_plugin_set; - - /** @var array<int,HandleLazyLoadInternalFunctionCapability>|null - plugins to modify Phan's information about internal Funcs when loaded for the first time */ - private $handle_lazy_load_internal_function_plugin_set; - - /** @var array<int,FinalizeProcessCapability>|null - plugins to call finalize() on after analysis is finished. */ - private $finalize_process_plugin_set; - - /** @var array<int,ReturnTypeOverrideCapability>|null - plugins which generate return UnionTypes of functions based on arguments. */ - private $return_type_override_plugin_set; - - /** @var array<int,SuppressionCapability>|null - plugins which generate return UnionTypes of functions based on arguments. */ - private $suppression_plugin_set; - - /** @var ?UnusedSuppressionPlugin - TODO: Refactor*/ - private $unused_suppression_plugin = null; - - /** - * @var bool - */ - private $did_analyze_phase_start = false; - - /** - * Call `ConfigPluginSet::instance()` instead. - */ - private function __construct() - { - } - - /** - * @return ConfigPluginSet - * A shared single instance of this plugin - */ - public static function instance() : ConfigPluginSet - { - static $instance = null; - if ($instance === null) { - $instance = self::newInstance(); - } - return $instance; - } - - /** - * Returns a brand-new ConfigPluginSet where all plugins are initialized. - * - * If one of the plugins could not be instantiated, this prints an error message and terminates the program. - */ - private static function newInstance() : ConfigPluginSet - { - try { - $instance = new self(); - $instance->ensurePluginsExist(); - return $instance; - } catch (Throwable $e) { - // An unexpected error. - // E.g. a third party plugin class threw when building the list of return types to analyze. - $message = \sprintf( - "Failed to initialize plugins, exiting: %s: %s at %s:%d\nStack Trace:\n%s", - get_class($e), - $e->getMessage(), - $e->getFile(), - $e->getLine(), - $e->getTraceAsString() - ); - \error_log($message); - exit(EXIT_FAILURE); - } - } - - /** - * Resets this set of plugins to the state it had before any user-defined or internal plugins were added, - * then re-initialize plugins based on the current configuration. - * - * @internal - Used only for testing - */ - public static function reset() - { - $instance = self::instance(); - // Set all of the private properties to their uninitialized default values - // @phan-suppress-next-line PhanTypeSuspiciousNonTraversableForeach this is intentionally iterating over private properties of the clone. - foreach (new self() as $k => $v) { - $instance->{$k} = $v; - } - $instance->ensurePluginsExist(); - } - - /** - * @param CodeBase $code_base - * The code base in which the node exists - * - * @param Context $context - * The context in which the node exits. This is - * the context inside the given node rather than - * the context outside of the given node - * - * @param Node $node - * The php-ast Node being analyzed. - * - * @return void - */ - public function preAnalyzeNode( - CodeBase $code_base, - Context $context, - Node $node - ) { - $plugin_callback = $this->pre_analyze_node_plugin_set[$node->kind] ?? null; - if ($plugin_callback !== null) { - $plugin_callback( - $code_base, - $context, - $node - ); - } - } - - /** - * @param CodeBase $code_base - * The code base in which the node exists - * - * @param Context $context - * The context in which the node exits. This is - * the context inside the given node rather than - * the context outside of the given node - * - * @param Node $node - * The php-ast Node being analyzed. - * - * @param array<int,Node> $parent_node_list - * The parent node of the given node (if one exists). - * - * @return void - */ - public function postAnalyzeNode( - CodeBase $code_base, - Context $context, - Node $node, - array $parent_node_list = [] - ) { - $plugin_callback = $this->post_analyze_node_plugin_set[$node->kind] ?? null; - if ($plugin_callback !== null) { - $plugin_callback( - $code_base, - $context, - $node, - $parent_node_list - ); - } - } - - /** - * @param CodeBase $code_base - * The code base in which the node exists - * - * @param Context $context - * A context with the file name for $file_contents and the scope before analyzing $node. - * - * @param string $file_contents - * @param Node $node - * @return void - * @override - */ - public function beforeAnalyzeFile( - CodeBase $code_base, - Context $context, - string $file_contents, - Node $node - ) { - foreach ($this->before_analyze_file_plugin_set as $plugin) { - $plugin->beforeAnalyzeFile( - $code_base, - $context, - $file_contents, - $node - ); - } - } - - /** - * @param CodeBase $code_base - * The code base in which the project exists - * - * @override - */ - public function beforeAnalyze(CodeBase $code_base) - { - $this->did_analyze_phase_start = true; - foreach ($this->before_analyze_plugin_set as $plugin) { - $plugin->beforeAnalyze($code_base); - } - } - - /** - * @param CodeBase $code_base - * The code base in which the node exists - * - * @param Context $context - * A context with the file name for $file_contents and the scope after analyzing $node. - * - * @param string $file_contents - * @param Node $node - * @return void - * @override - */ - public function afterAnalyzeFile( - CodeBase $code_base, - Context $context, - string $file_contents, - Node $node - ) { - foreach ($this->after_analyze_file_plugin_set as $plugin) { - $plugin->afterAnalyzeFile( - $code_base, - $context, - $file_contents, - $node - ); - } - } - - /** - * @param CodeBase $code_base - * The code base in which the class exists - * - * @param Clazz $class - * A class being analyzed - * - * @return void - * @override - */ - public function analyzeClass( - CodeBase $code_base, - Clazz $class - ) { - foreach ($this->analyze_class_plugin_set as $plugin) { - $plugin->analyzeClass( - $code_base, - $class - ); - } - if ($this->hasAnalyzePropertyPlugins()) { - foreach ($class->getPropertyMap($code_base) as $property) { - $this->analyzeProperty($code_base, $property); - } - } - } - - /** - * @param CodeBase $code_base - * The code base in which the method exists - * - * @param Method $method - * A method being analyzed - * - * @return void - * @override - */ - public function analyzeMethod( - CodeBase $code_base, - Method $method - ) { - foreach ($this->analyze_method_plugin_set as $plugin) { - $plugin->analyzeMethod( - $code_base, - $method - ); - } - } - - /** - * This will be called if Phan's file and element-based suppressions did not suppress the issue. - * - * @param CodeBase $code_base - * - * @param Context $context context near where the issue occurred - * - * @param string $issue_type - * The type of issue to emit such as Issue::ParentlessClass - * - * @param int $lineno - * The line number where the issue was found - * - * @param array<int,string|int|float|bool|Type|UnionType|FQSEN|TypedElement|UnaddressableTypedElement> $parameters - * - * @param ?Suggestion $suggestion Phan's suggestion for how to fix the issue, if any. - * - * @return bool true if the given issue instance should be suppressed, given the current file contents. - */ - public function shouldSuppressIssue( - CodeBase $code_base, - Context $context, - string $issue_type, - int $lineno, - array $parameters, - $suggestion - ) : bool { - foreach ($this->suppression_plugin_set as $plugin) { - if ($plugin->shouldSuppressIssue( - $code_base, - $context, - $issue_type, - $lineno, - $parameters, - $suggestion - )) { - if ($this->unused_suppression_plugin) { - // @phan-suppress-next-line PhanAccessMethodInternal - $this->unused_suppression_plugin->recordPluginSuppression($plugin, $context->getFile(), $issue_type, $lineno); - } - return true; - } - } - return false; - } - - /** - * @param CodeBase $code_base - * @param string $file_path - * @return array<string,array<int,int>> Maps 0 or more issue types to a *list* of lines that this plugin set is going to suppress. - */ - public function getIssueSuppressionList( - CodeBase $code_base, - string $file_path - ) : array { - $result = []; - foreach ($this->suppression_plugin_set as $plugin) { - $result += $plugin->getIssueSuppressionList( - $code_base, - $file_path - ); - } - return $result; - } - - /** - * @return array<int,SuppressionCapability> - * @suppress PhanPossiblyNullTypeReturn should always be initialized before any issues get emitted. - */ - public function getSuppressionPluginSet() : array - { - return $this->suppression_plugin_set; - } - - /** - * @param CodeBase $code_base - * The code base in which the function exists - * - * @param Func $function - * A function being analyzed - * - * @return void - * @override - */ - public function analyzeFunction( - CodeBase $code_base, - Func $function - ) { - foreach ($this->analyze_function_plugin_set as $plugin) { - $plugin->analyzeFunction( - $code_base, - $function - ); - } - } - - /** - * @param CodeBase $code_base - * The code base in which the property exists - * - * @param Property $property - * A property being analyzed - * - * (Called by analyzeClass()) - * - * @return void - * @override - */ - public function analyzeProperty( - CodeBase $code_base, - Property $property - ) { - foreach ($this->analyze_property_plugin_set as $plugin) { - try { - $plugin->analyzeProperty( - $code_base, - $property - ); - } catch (IssueException $exception) { - // e.g. getUnionType() can throw, PropertyTypesAnalyzer is probably emitting duplicate issues - Issue::maybeEmitInstance( - $code_base, - $property->getContext(), - $exception->getIssueInstance() - ); - continue; - } - } - } - - /** - * @param CodeBase $code_base - * The code base used for previous analysis steps - * - * @return void - * @override - */ - public function finalizeProcess( - CodeBase $code_base - ) { - foreach ($this->finalize_process_plugin_set as $plugin) { - $plugin->finalizeProcess($code_base); - } - } - - /** - * Returns true if analyzeFunction() will execute any plugins. - */ - public function hasAnalyzeFunctionPlugins() : bool - { - if (is_null($this->plugin_set)) { - throw new AssertionError("Expected plugins to be loaded in " . __METHOD__); - } - // @phan-suppress-next-line PhanPossiblyNullTypeArgumentInternal - return \count($this->analyze_function_plugin_set) > 0; - } - - /** - * Returns true if analyzeMethod() will execute any plugins. - */ - public function hasAnalyzeMethodPlugins() : bool - { - if (is_null($this->plugin_set)) { - throw new AssertionError("Expected plugins to be loaded in " . __METHOD__); - } - // @phan-suppress-next-line PhanPossiblyNullTypeArgumentInternal - return \count($this->analyze_method_plugin_set) > 0; - } - - /** - * @param Closure(CodeBase, Context, FunctionInterface, array<int,Node|mixed>):void $a - * @param ?Closure(CodeBase, Context, FunctionInterface, array<int,Node|mixed>):void $b - * @return Closure(CodeBase, Context, FunctionInterface, array<int,Node|mixed>):void $b - */ - public static function mergeAnalyzeFunctionCallClosures(Closure $a, Closure $b = null) - { - if (!$b) { - return $a; - } - /** - * @param array<int,Node|mixed> $args - */ - return static function (CodeBase $code_base, Context $context, FunctionInterface $func, array $args) use ($a, $b) { - $a($code_base, $context, $func, $args); - $b($code_base, $context, $func, $args); - }; - } - /** - * @param CodeBase $code_base - * @return array<string,\Closure> maps FQSEN string to closure - */ - public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array - { - if (is_null($this->plugin_set)) { - throw new AssertionError("Expected plugins to be loaded in " . __METHOD__); - } - $result = []; - foreach ($this->analyze_function_call_plugin_set as $plugin) { - // TODO: Make this case-insensitive. - foreach ($plugin->getAnalyzeFunctionCallClosures($code_base) as $fqsen_name => $closure) { - $other_closure = $result[$fqsen_name] ?? null; - $closure = self::mergeAnalyzeFunctionCallClosures($closure, $other_closure); - $result[$fqsen_name] = $closure; - } - } - return $result; - } - - /** - * @param CodeBase $code_base - * @return array<string,\Closure> maps FQSEN string to closure - */ - public function getReturnTypeOverrides(CodeBase $code_base) : array - { - if (is_null($this->plugin_set)) { - throw new AssertionError("Expected plugins to be loaded in " . __METHOD__); - } - $result = []; - foreach ($this->return_type_override_plugin_set as $plugin) { - $result += $plugin->getReturnTypeOverrides($code_base); - } - return $result; - } - - /** @var ?NodeSelectionPlugin - If the language server requests more information about a node, this may be set (e.g. for "Go To Definition") */ - private $node_selection_plugin; - - /** - * @internal - * @return void - * @see addTemporaryAnalysisPlugin - */ - public function prepareNodeSelectionPluginForNode(Node $node) - { - if (!$this->node_selection_plugin) { - \fwrite(STDERR, "Error: " . __METHOD__ . " called before node selection plugin was created\n"); - return; - } - - // TODO: Track if this has been added already(not necessary yet) - - $kind = $node->kind; - if (!\is_int($kind)) { - throw new AssertionError("Invalid kind for node"); - } - - /** - * @param array<int,Node|mixed> $parent_node_list - */ - $closure = static function (CodeBase $code_base, Context $context, Node $node, array $parent_node_list = []) { - $visitor = new NodeSelectionVisitor($code_base, $context); - $visitor->visitCommonImplementation($node, $parent_node_list); - }; - - $this->addNodeSelectionClosureForKind($node->kind, $closure); - } - - /** - * @param CodeBase $code_base - * @param ?Request $request - * @return ?RAII - */ - public function addTemporaryAnalysisPlugin(CodeBase $code_base, $request) - { - if (!$request) { - return null; - } - $node_info_request = $request->getMostRecentNodeInfoRequest(); - if (!$node_info_request) { - return null; - } - $node_selection_plugin = new NodeSelectionPlugin(); - if ($node_info_request instanceof GoToDefinitionRequest) { - $node_selection_plugin->setNodeSelectorClosure(DefinitionResolver::createGoToDefinitionClosure($node_info_request, $code_base)); - } elseif ($node_info_request instanceof CompletionRequest) { - $node_selection_plugin->setNodeSelectorClosure(CompletionResolver::createCompletionClosure($node_info_request, $code_base)); - } else { - throw new AssertionError("Unknown subclass of NodeInfoRequest - Should not happen"); - } - $this->node_selection_plugin = $node_selection_plugin; - - $old_post_analyze_node_plugin_set = $this->post_analyze_node_plugin_set; - - /* - $new_post_analyze_node_plugins = self::filterPostAnalysisPlugins([$node_selection_plugin]); - if (!$new_post_analyze_node_plugins) { - throw new \RuntimeException("Invalid NodeSelectionPlugin"); - } - - // TODO: This can be removed? - foreach ($new_post_analyze_node_plugins as $kind => $new_plugin) { - $this->addNodeSelectionClosureForKind($kind, $new_plugin); - } - */ - - return new RAII(function () use ($old_post_analyze_node_plugin_set) { - $this->post_analyze_node_plugin_set = $old_post_analyze_node_plugin_set; - $this->node_selection_plugin = null; - }); - } - - /** - * @param Closure(CodeBase,Context,Node,array=) $new_plugin - */ - private function addNodeSelectionClosureForKind(int $kind, Closure $new_plugin) - { - $old_plugin_for_kind = $this->post_analyze_node_plugin_set[$kind] ?? null; - if ($old_plugin_for_kind) { - /** - * @param array<int,Node> $parent_node_list - * @suppress PhanInfiniteRecursion the old plugin is referring to a different closure - */ - $this->post_analyze_node_plugin_set[$kind] = static function (CodeBase $code_base, Context $context, Node $node, array $parent_node_list = []) use ($old_plugin_for_kind, $new_plugin) { - $old_plugin_for_kind($code_base, $context, $node, $parent_node_list); - $new_plugin($code_base, $context, $node, $parent_node_list); - }; - } else { - $this->post_analyze_node_plugin_set[$kind] = $new_plugin; - } - } - - /** - * Returns true if analyzeProperty() will execute any plugins. - */ - private function hasAnalyzePropertyPlugins() : bool - { - if (is_null($this->plugin_set)) { - throw new AssertionError("Expected plugins to be loaded in " . __METHOD__); - } - // @phan-suppress-next-line PhanPossiblyNullTypeArgumentInternal - return \count($this->analyze_property_plugin_set) > 0; - } - - /** - * Given a plugin's name in the config, return the path Phan expects the plugin to be located in - * Allow any word/UTF-8 identifier as a php file name. - * E.g. 'AlwaysReturnPlugin' becomes /path/to/phan/.phan/plugins/AlwaysReturnPlugin.php - * (Useful when using phan.phar, etc.) - * - * @internal - */ - public static function normalizePluginPath(string $plugin_file_name) : string - { - if (\preg_match('@^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$@', $plugin_file_name) > 0) { - return self::getBuiltinPluginDirectory() . '/' . $plugin_file_name . '.php'; - } - return $plugin_file_name; - } - - /** - * Returns the path to the plugins bundled with Phan. - */ - public static function getBuiltinPluginDirectory() : string - { - return \dirname(__DIR__, 3) . '/.phan/plugins'; - } - - /** - * @return void - */ - private function ensurePluginsExist() - { - if (!is_null($this->plugin_set)) { - return; - } - $load_plugin = static function (string $plugin_file_name) : PluginV2 { - $plugin_file_name = self::normalizePluginPath($plugin_file_name); - - try { - $plugin_instance = require($plugin_file_name); - } catch (Throwable $e) { - // An unexpected error. - // E.g. a plugin class threw a SyntaxError because it required PHP 7.1 or newer but 7.0 was used. - $message = \sprintf( - "Failed to initialize plugin %s, exiting: %s: %s at %s:%d\nStack Trace:\n%s", - $plugin_file_name, - get_class($e), - $e->getMessage(), - $e->getFile(), - $e->getLine(), - $e->getTraceAsString() - ); - \error_log($message); - exit(EXIT_FAILURE); - } - - if (!is_object($plugin_instance)) { - throw new AssertionError("Plugins must return an instance of the plugin. The plugin at $plugin_file_name does not."); - } - - if (!($plugin_instance instanceof PluginV2)) { - throw new AssertionError("Plugins must extend \Phan\PluginV2. The plugin at $plugin_file_name does not."); - } - - return $plugin_instance; - }; - // Add user-defined plugins. - $plugin_set = \array_map( - $load_plugin, - Config::getValue('plugins') - ); - // Add internal plugins. Can be disabled by disable_internal_return_type_plugins. - if (Config::getValue('enable_internal_return_type_plugins')) { - $internal_return_type_plugins = [ - new ArrayReturnTypeOverridePlugin(), - new CallableParamPlugin(), - new CompactPlugin(), - new ClosureReturnTypeOverridePlugin(), - new DependentReturnTypeOverridePlugin(), - new StringFunctionPlugin(), - new MiscParamPlugin(), - ]; - if (Config::getValue('enable_extended_internal_return_type_plugins')) { - \array_unshift($internal_return_type_plugins, new ExtendedDependentReturnTypeOverridePlugin()); - } - $plugin_set = \array_merge($internal_return_type_plugins, $plugin_set); - } - if (Config::getValue('enable_include_path_checks')) { - $plugin_set[] = new RequireExistsPlugin(); - } - if (Config::getValue('warn_about_undocumented_throw_statements')) { - $plugin_set[] = new ThrowAnalyzerPlugin(); - } - if (Config::getValue('unused_variable_detection') || Config::getValue('dead_code_detection')) { - $plugin_set[] = new VariableTrackerPlugin(); - } - if (self::requiresPluginBasedBuiltinSuppressions()) { - if (\function_exists('token_get_all')) { - $plugin_set[] = new BuiltinSuppressionPlugin(); - } else { - \fwrite(STDERR, "ext-tokenizer is required for file-based and line-based suppressions to work, as well as the error-tolerant parser fallback." . PHP_EOL); - \fwrite(STDERR, "(This warning can be disabled by setting skip_missing_tokenizer_warning in the project's config)" . PHP_EOL); - } - } - if (Config::getValue('dead_code_detection') && \count(self::filterByClass($plugin_set, \UnreachableCodePlugin::class)) === 0) { - $plugin_set[] = $load_plugin('UnreachableCodePlugin'); - } - - // Register the entire set. - $this->plugin_set = $plugin_set; - - $this->pre_analyze_node_plugin_set = self::filterPreAnalysisPlugins($plugin_set); - $this->post_analyze_node_plugin_set = self::filterPostAnalysisPlugins($plugin_set); - $this->before_analyze_plugin_set = self::filterByClass($plugin_set, BeforeAnalyzeCapability::class); - $this->before_analyze_file_plugin_set = self::filterByClass($plugin_set, BeforeAnalyzeFileCapability::class); - $this->after_analyze_file_plugin_set = self::filterByClass($plugin_set, AfterAnalyzeFileCapability::class); - $this->analyze_method_plugin_set = self::filterByClass($plugin_set, AnalyzeMethodCapability::class); - $this->analyze_function_plugin_set = self::filterByClass($plugin_set, AnalyzeFunctionCapability::class); - $this->analyze_property_plugin_set = self::filterByClass($plugin_set, AnalyzePropertyCapability::class); - $this->analyze_class_plugin_set = self::filterByClass($plugin_set, AnalyzeClassCapability::class); - $this->finalize_process_plugin_set = self::filterByClass($plugin_set, FinalizeProcessCapability::class); - $this->return_type_override_plugin_set = self::filterByClass($plugin_set, ReturnTypeOverrideCapability::class); - $this->suppression_plugin_set = self::filterByClass($plugin_set, SuppressionCapability::class); - $this->analyze_function_call_plugin_set = self::filterByClass($plugin_set, AnalyzeFunctionCallCapability::class); - $this->handle_lazy_load_internal_function_plugin_set = self::filterByClass($plugin_set, HandleLazyLoadInternalFunctionCapability::class); - $this->unused_suppression_plugin = self::findUnusedSuppressionPlugin($plugin_set); - self::registerIssueFixerClosures($plugin_set); - } - - /** - * @param array<int,PluginV2> $plugin_set - * @return void - */ - private static function registerIssueFixerClosures($plugin_set) - { - if (!Config::isIssueFixingPluginEnabled()) { - // Don't load these if we won't need them. - return; - } - // NOTE: Currently limited to exactly one closure per issue type - // (the last plugin ends up taking precedence) - foreach (self::filterByClass($plugin_set, AutomaticFixCapability::class) as $fixer) { - foreach ($fixer->getAutomaticFixers() as $issue_type => $closure) { - IssueFixer::registerFixerClosure($issue_type, $closure); - } - } - } - - private static function requiresPluginBasedBuiltinSuppressions() : bool - { - if (Config::getValue('disable_suppression')) { - return false; - } - if (Config::getValue('disable_line_based_suppression') && Config::getValue('disable_file_based_suppression')) { - return false; - } - return true; - } - - /** - * @param array<int,PluginV2> $plugin_set - * @return array<int,Closure(CodeBase,Context,Node,array<int,Node>=):void> - * Returned value maps ast\Node->kind to [function(CodeBase $code_base, Context $context, Node $node, array<int,Node> $parent_node_list = []): void] - */ - private static function filterPreAnalysisPlugins(array $plugin_set) : array - { - $closures_for_kind = new ClosuresForKind(); - foreach ($plugin_set as $plugin) { - if ($plugin instanceof PreAnalyzeNodeCapability) { - self::addClosuresForPreAnalyzeNodeCapability($closures_for_kind, $plugin); - } - } - /** - * @param array<int,Closure> $closure_list - */ - return $closures_for_kind->getFlattenedClosures(static function (array $closure_list) : \Closure { - return static function (CodeBase $code_base, Context $context, Node $node) use ($closure_list) { - foreach ($closure_list as $closure) { - $closure($code_base, $context, $node); - } - }; - }); - } - - private static function addClosuresForPreAnalyzeNodeCapability( - ClosuresForKind $closures_for_kind, - PreAnalyzeNodeCapability $plugin - ) { - $plugin_analysis_class = $plugin->getPreAnalyzeNodeVisitorClassName(); - if (!\is_subclass_of($plugin_analysis_class, PluginAwarePreAnalysisVisitor::class)) { - throw new \TypeError( - \sprintf( - "Result of %s::getAnalyzeNodeVisitorClassName must be the name of a subclass of '%s', but '%s' is not", - \get_class($plugin), - PluginAwarePreAnalysisVisitor::class, - $plugin_analysis_class - ) - ); - } - // @see PreAnalyzeNodeCapability (magic to create parent_node_list) - $closure = self::getGenericClosureForPluginAwarePreAnalysisVisitor($plugin_analysis_class); - $handled_node_kinds = $plugin_analysis_class::getHandledNodeKinds(); - if (\count($handled_node_kinds) === 0) { - \fprintf( - STDERR, - "Plugin %s has a preAnalyzeNode visitor %s (subclass of %s) which doesn't override any known visit<Suffix>() methods, but expected at least one method to be overridden\n", - \get_class($plugin), - $plugin_analysis_class, - PluginAwarePreAnalysisVisitor::class - ); - } - $closures_for_kind->recordForKinds($handled_node_kinds, $closure); - } - - /** - * Create an instance of $plugin_analysis_class and run the visit*() method corresponding to $node->kind. - * - * @return Closure(CodeBase,Context,Node,array=) - */ - private static function getGenericClosureForPluginAwarePreAnalysisVisitor(string $plugin_analysis_class) : Closure - { - try { - new ReflectionProperty($plugin_analysis_class, 'parent_node_list'); - $has_parent_node_list = true; - } catch (ReflectionException $_) { - $has_parent_node_list = false; - } - - if ($has_parent_node_list) { - /** - * Create an instance of $plugin_analysis_class and run the visit*() method corresponding to $node->kind. - * - * @param array<int,Node> $parent_node_list - * @phan-closure-scope PluginAwarePreAnalysisVisitor - */ - return (static function (CodeBase $code_base, Context $context, Node $node, array $parent_node_list = []) { - $visitor = new static($code_base, $context); - // @phan-suppress-next-line PhanUndeclaredProperty checked via $has_parent_node_list - $visitor->parent_node_list = $parent_node_list; - $fn_name = Element::VISIT_LOOKUP_TABLE[$node->kind]; - $visitor->{$fn_name}($node); - })->bindTo(null, $plugin_analysis_class); - } else { - /** - * Create an instance of $plugin_analysis_class and run the visit*() method corresponding to $node->kind. - * - * @phan-closure-scope PluginAwarePreAnalysisVisitor - * @param array<int,Node> $unused_parent_node_list - */ - return (static function (CodeBase $code_base, Context $context, Node $node, array $unused_parent_node_list = []) { - $visitor = new static($code_base, $context); - $fn_name = Element::VISIT_LOOKUP_TABLE[$node->kind]; - $visitor->{$fn_name}($node); - })->bindTo(null, $plugin_analysis_class); - } - } - - /** - * @param array<int,PluginV2> $plugin_set - * @return array<int,\Closure> - [function(CodeBase $code_base, Context $context, Node $node, array<int,Node> $parent_node_list = []): void] - */ - private static function filterPostAnalysisPlugins(array $plugin_set) : array - { - $closures_for_kind = new ClosuresForKind(); - foreach ($plugin_set as $plugin) { - if ($plugin instanceof PostAnalyzeNodeCapability) { - self::addClosuresForPostAnalyzeNodeCapability($closures_for_kind, $plugin); - } - } - /** - * @param array<int,Closure> $closure_list - */ - return $closures_for_kind->getFlattenedClosures(static function (array $closure_list) : \Closure { - /** - * @param array<int,Node> $parent_node_list - */ - return static function (CodeBase $code_base, Context $context, Node $node, array $parent_node_list = []) use ($closure_list) { - foreach ($closure_list as $closure) { - $closure($code_base, $context, $node, $parent_node_list); - } - }; - }); - } - - /** - * @throws \TypeError if the returned getPostAnalyzeNodeVisitorClassName() is invalid - */ - private static function addClosuresForPostAnalyzeNodeCapability( - ClosuresForKind $closures_for_kind, - PostAnalyzeNodeCapability $plugin - ) { - $plugin_analysis_class = $plugin->getPostAnalyzeNodeVisitorClassName(); - if (!\is_subclass_of($plugin_analysis_class, PluginAwarePostAnalysisVisitor::class)) { - throw new \TypeError( - \sprintf( - "Result of %s::getAnalyzeNodeVisitorClassName must be the name of a subclass of '%s', but '%s' is not", - \get_class($plugin), - PluginAwarePostAnalysisVisitor::class, - $plugin_analysis_class - ) - ); - } - - // @see PostAnalyzeNodeCapability (magic to create parent_node_list) - $closure = self::getGenericClosureForPluginAwarePostAnalysisVisitor($plugin_analysis_class); - - $handled_node_kinds = $plugin_analysis_class::getHandledNodeKinds(); - if (\count($handled_node_kinds) === 0) { - \fprintf( - STDERR, - "Plugin %s has an analyzeNode visitor %s (subclass of %s) which doesn't override any known visit<Suffix>() methods, but expected at least one method to be overridden\n", - \get_class($plugin), - $plugin_analysis_class, - PluginAwarePostAnalysisVisitor::class - ); - } - $closures_for_kind->recordForKinds($handled_node_kinds, $closure); - } - - /** - * Create an instance of $plugin_analysis_class and run the visit*() method corresponding to $node->kind. - * - * @return Closure(CodeBase,Context,Node,array=) - */ - private static function getGenericClosureForPluginAwarePostAnalysisVisitor(string $plugin_analysis_class) : Closure - { - try { - new ReflectionProperty($plugin_analysis_class, 'parent_node_list'); - $has_parent_node_list = true; - } catch (ReflectionException $_) { - $has_parent_node_list = false; - } - - if ($has_parent_node_list) { - /** - * Create an instance of $plugin_analysis_class and run the visit*() method corresponding to $node->kind. - * - * @phan-closure-scope PluginAwarePostAnalysisVisitor - * @param array<int,Node> $parent_node_list - */ - return (static function (CodeBase $code_base, Context $context, Node $node, array $parent_node_list = []) { - $visitor = new static($code_base, $context); - // @phan-suppress-next-line PhanUndeclaredProperty checked via $has_parent_node_list - $visitor->parent_node_list = $parent_node_list; - $fn_name = Element::VISIT_LOOKUP_TABLE[$node->kind]; - $visitor->{$fn_name}($node); - })->bindTo(null, $plugin_analysis_class); - } else { - /** - * Create an instance of $plugin_analysis_class and run the visit*() method corresponding to $node->kind. - * - * @phan-closure-scope PluginAwarePostAnalysisVisitor - * @param array<int,Node> $unused_parent_node_list - */ - return (static function (CodeBase $code_base, Context $context, Node $node, array $unused_parent_node_list = []) { - $visitor = new static($code_base, $context); - $fn_name = Element::VISIT_LOOKUP_TABLE[$node->kind]; - $visitor->{$fn_name}($node); - })->bindTo(null, $plugin_analysis_class); - } - } - - /** - * @template T - * @param array<int,PluginV2> $plugin_set - * @param class-string<T> $interface_name - * @return array<int,T> - * @suppress PhanPartialTypeMismatchReturn unable to infer this - */ - private static function filterByClass(array $plugin_set, string $interface_name) : array - { - $result = []; - foreach ($plugin_set as $plugin) { - if ($plugin instanceof $interface_name) { - $result[] = $plugin; - } - } - return $result; - } - - /** - * @param PluginV2[] $plugin_set - * @return ?UnusedSuppressionPlugin - */ - private static function findUnusedSuppressionPlugin(array $plugin_set) - { - foreach ($plugin_set as $plugin) { - // Don't use instanceof, avoid triggering class autoloader unnecessarily. - // (load one less file) - if (\get_class($plugin) === UnusedSuppressionPlugin::class) { - return $plugin; - } - } - return null; - } - - /** - * If an internal function is loaded after the start of the analysis phase, - * notify plugins in case they need to make modifications to the Func information or the way that Func is handled. - */ - public function handleLazyLoadInternalFunction(CodeBase $code_base, Func $function) - { - if (!$this->did_analyze_phase_start) { - return; - } - foreach ($this->handle_lazy_load_internal_function_plugin_set as $plugin) { - $plugin->handleLazyLoadInternalFunction($code_base, $function); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/ArrayReturnTypeOverridePlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/ArrayReturnTypeOverridePlugin.php deleted file mode 100644 index 0ecd609..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/ArrayReturnTypeOverridePlugin.php +++ /dev/null @@ -1,464 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use ast\Node; -use Phan\Analysis\ArgumentType; -use Phan\Analysis\PostOrderAnalysisVisitor; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Context; -use Phan\Language\Element\Func; -use Phan\Language\Type\ArrayShapeType; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\FalseType; -use Phan\Language\Type\GenericArrayType; -use Phan\Language\Type\IntType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; -use Phan\PluginV2; -use Phan\PluginV2\ReturnTypeOverrideCapability; -use function count; - -/** - * NOTE: This is automatically loaded by phan. Do not include it in a config. - * - * TODO: Refactor this. - * - * @phan-file-suppress PhanUnusedClosureParameter - */ -final class ArrayReturnTypeOverridePlugin extends PluginV2 implements - ReturnTypeOverrideCapability -{ - - /** - * @return array<string,\Closure> - */ - private static function getReturnTypeOverridesStatic() : array - { - $mixed_type = MixedType::instance(false); - $false_type = FalseType::instance(false); - $array_type = ArrayType::instance(false); - $int_type = IntType::instance(false); - $string_type = StringType::instance(false); - $null_type = NullType::instance(false); - $int_or_string_or_false = new UnionType([$int_type, $string_type, $false_type]); - $int_or_string_or_null = new UnionType([$int_type, $string_type, $null_type]); - $int_or_string = new UnionType([$int_type, $string_type]); - - /** - * @param array<int,Node|int|float|string> $args - */ - $get_element_type_of_first_arg = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($mixed_type, $false_type) : UnionType { - if (\count($args) >= 1) { - $array_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - $element_types = $array_type->genericArrayElementTypes(); - if (!$element_types->isEmpty()) { - return $element_types->withType($false_type); - } - } - return $mixed_type->asUnionType(); - }; - /** - * @param array<int,Node|int|float|string> $args - */ - $get_key_type_of_first_arg = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($int_or_string_or_false, $false_type) : UnionType { - if (\count($args) >= 1) { - $array_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - $key_type_enum = GenericArrayType::keyTypeFromUnionTypeKeys($array_type); - if ($key_type_enum !== GenericArrayType::KEY_MIXED) { - $key_type = GenericArrayType::unionTypeForKeyType($key_type_enum); - return $key_type->withType($false_type); - } - } - return $int_or_string_or_false; - }; - /** - * @param array<int,Node|int|float|string> $args - */ - $get_key_type_of_first_arg_or_null = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($int_or_string_or_null, $null_type) : UnionType { - if (\count($args) >= 1) { - $array_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - $key_type_enum = GenericArrayType::keyTypeFromUnionTypeKeys($array_type); - if ($key_type_enum !== GenericArrayType::KEY_MIXED) { - $key_type = GenericArrayType::unionTypeForKeyType($key_type_enum); - return $key_type->withType($null_type); - } - } - return $int_or_string_or_null; - }; - /** - * @param array<int,Node|int|float|string> $args - */ - $get_key_type_of_second_arg = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($int_or_string_or_false, $false_type) : UnionType { - if (\count($args) >= 2) { - $array_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[1]); - $key_type_enum = GenericArrayType::keyTypeFromUnionTypeKeys($array_type); - if ($key_type_enum !== GenericArrayType::KEY_MIXED) { - $key_type = GenericArrayType::unionTypeForKeyType($key_type_enum); - return $key_type->withType($false_type); - } - } - return $int_or_string_or_false; - }; - /** - * @param array<int,Node|int|float|string> $args - */ - $get_first_array_arg = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($array_type) : UnionType { - if (\count($args) >= 1) { - $element_types = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0])->genericArrayTypes(); - if (!$element_types->isEmpty()) { - return $element_types->withFlattenedArrayShapeOrLiteralTypeInstances(); - } - } - return $array_type->asUnionType(); - }; - /** - * @param array<int,Node|int|float|string> $args - */ - $array_fill_keys_callback = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($mixed_type, $array_type) : UnionType { - if (\count($args) == 2) { - $key_types = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - $key_type_enum = GenericArrayType::keyTypeFromUnionTypeValues($key_types); - $element_types = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[1]); - if ($element_types->isEmpty()) { - if ($key_type_enum === GenericArrayType::KEY_MIXED) { - return $array_type->asUnionType(); - } - $element_types = $mixed_type->asUnionType(); - } - return $element_types->asNonEmptyGenericArrayTypes($key_type_enum); - } - return $array_type->asUnionType(); - }; - - /** - * @param array<int,Node|int|float|string> $args - */ - $array_fill_callback = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($array_type) : UnionType { - if (\count($args) == 3) { - $element_types = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[2]); - return $element_types->asNonEmptyGenericArrayTypes(GenericArrayType::KEY_INT); - } - return $array_type->asUnionType(); - }; - - /** - * @param array<int,Node|int|string|float> $args - */ - $array_filter_callback = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($array_type) : UnionType { - if (\count($args) >= 1) { - $passed_array_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - $generic_passed_array_type = $passed_array_type->genericArrayTypes(); - if (!$generic_passed_array_type->isEmpty()) { - if (\count($args) >= 2) { - // As a side effect of getting the list of callables, this warns about invalid callables - $filter_function_list = UnionTypeVisitor::functionLikeListFromNodeAndContext($code_base, $context, $args[1], true); - if (Config::get_track_references()) { - foreach ($filter_function_list as $filter_function) { - $filter_function->addReference($context); - } - } - if (count($args) === 2) { - foreach ($filter_function_list as $filter_function) { - // Analyze that the individual elements passed to array_filter()'s callback make sense. - // TODO: analyze ARRAY_FILTER_USE_KEY, ARRAY_FILTER_USE_BOTH - $passed_array_element_types = $passed_array_type->genericArrayElementTypes(); - ArgumentType::analyzeParameter($code_base, $context, $filter_function, $passed_array_element_types, $context->getLineNumberStart(), 0); - if (!Config::get_quick_mode()) { - $analyzer = new PostOrderAnalysisVisitor($code_base, $context, []); - $analyzer->analyzeCallableWithArgumentTypes([$passed_array_element_types], $filter_function); - } - } - } - // TODO: Handle 3 args? - // - // ARRAY_FILTER_USE_KEY - pass key as the only argument to callback instead of the value - // ARRAY_FILTER_USE_BOTH - pass both value and key as arguments to callback instead of the value - } elseif (\count($args) === 1) { - // array_filter with count($args) === 1 implies elements of the resulting array aren't falsey - return $generic_passed_array_type->withFlattenedArrayShapeOrLiteralTypeInstances() - ->withMappedElementTypes(static function (UnionType $union_type) : UnionType { - return $union_type->nonFalseyClone(); - }); - } - // TODO: Analyze if it and the flags are compatible with the arguments to the closure provided. - // TODO: withFlattenedArrayShapeOrLiteralTypeInstances() for other values - return $generic_passed_array_type->withFlattenedArrayShapeOrLiteralTypeInstances(); - } - } - return $array_type->asUnionType(); - }; - - /** - * @param array<int,Node|int|string|float> $args - */ - $array_reduce_callback = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($mixed_type) : UnionType { - if (\count($args) < 2) { - return $mixed_type->asUnionType(); - } - $function_like_list = UnionTypeVisitor::functionLikeListFromNodeAndContext($code_base, $context, $args[1], true); - if (\count($function_like_list) === 0) { - return $mixed_type->asUnionType(); - } - $function_return_types = UnionType::empty(); - foreach ($function_like_list as $function_like) { - // TODO: Support analysis of map/reduce functions with dependent union types? - $function_return_types = $function_return_types->withUnionType($function_like->getUnionType()); - } - if ($function_return_types->isEmpty()) { - $function_return_types = $function_return_types->withType($mixed_type); - } - return $function_return_types; - }; - - /** - * @param array<int,Node|int|string|float> $args - */ - $merge_array_types_callback = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($array_type) : UnionType { - $types = UnionType::empty(); - foreach ($args as $arg) { - $passed_array_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $arg); - $types = $types->withUnionType($passed_array_type->genericArrayTypes()); - } - $types = $types->withFlattenedArrayShapeOrLiteralTypeInstances(); - if ($types->isEmpty()) { - $types = $types->withType($array_type); - } - return $types; - }; - - /** - * @param array<int,Node|int|string|float> $args - */ - $array_map_callback = static function ( - CodeBase $code_base, - Context $context, - Func $function, - array $args - ) use ($array_type) : UnionType { - if (\count($args) < 2) { - return $array_type->asUnionType(); - } - $function_like_list = UnionTypeVisitor::functionLikeListFromNodeAndContext($code_base, $context, $args[0], true); - if (\count($function_like_list) === 0) { - return $array_type->asUnionType(); - } - $arguments = \array_slice($args, 1); - $possible_return_types = UnionType::empty(); - $cache_outer = []; - /** - * @param Node|int|string|float|null $argument - */ - $get_argument_type = static function ($argument, int $i) use ($code_base, $context, &$cache_outer) : UnionType { - if (isset($cache_outer[$i])) { - return $cache_outer[$i]; - } - $argument_type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $argument, - true - ); - $cache_outer[$i] = $argument_type; - return $argument_type; - }; - $cache = []; - // Don't calculate argument types more than once. - /** - * @param Node|int|string|float|null $argument - */ - $get_argument_type_for_array_map = static function ($argument, int $i) use ($get_argument_type, &$cache) : UnionType { - if (isset($cache[$i])) { - return $cache[$i]; - } - // Convert T[] to T - $argument_type = $get_argument_type($argument, $i)->genericArrayElementTypes(); - $cache[$i] = $argument_type; - return $argument_type; - }; - foreach ($function_like_list as $map_function) { - ArgumentType::analyzeForCallback( - $map_function, - $arguments, - $context, - $code_base, - $get_argument_type_for_array_map - ); - // TODO: fix https://github.com/phan/phan/issues/2554 - $possible_return_types = $possible_return_types->withUnionType($map_function->getUnionType()); - } - if (Config::get_track_references()) { - foreach ($function_like_list as $map_function) { - $map_function->addReference($context); - } - } - if (!Config::get_quick_mode()) { - $argument_types = []; - foreach ($arguments as $i => $node) { - $argument_types[] = $get_argument_type_for_array_map($node, $i); - } - foreach ($function_like_list as $map_function) { - $analyzer = new PostOrderAnalysisVisitor($code_base, $context, []); - $analyzer->analyzeCallableWithArgumentTypes($argument_types, $map_function); - } - } - if ($possible_return_types->isEmpty()) { - return $array_type->asUnionType(); - } - if (count($arguments) >= 2) { - // There were two or more arrays passed to the closure - $key_type_enum = GenericArrayType::KEY_INT; - } else { - $key_type_enum = GenericArrayType::keyTypeFromUnionTypeKeys($get_argument_type($arguments[0], 0)); - } - - return $possible_return_types->elementTypesToGenericArray($key_type_enum); - }; - /** - * @param array<int,Node|int|float|string> $args - */ - $array_pad_callback = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($array_type) : UnionType { - if (\count($args) != 3) { - return $array_type->asUnionType(); - } - $padded_array_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - $result_types = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[2])->asGenericArrayTypes(GenericArrayType::KEY_INT); - $result_types = $result_types->withUnionType($padded_array_type->genericArrayTypes()); - if ($result_types->isEmpty()) { - $result_types = $result_types->withType($array_type); - } - return $result_types; - }; - /** - * @param array<int,Node|int|string|float> $args - */ - $array_keys_callback = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($array_type, $int_type, $string_type) : UnionType { - if (\count($args) != 1) { - return $array_type->asUnionType(); - } - $key_union_type = UnionTypeVisitor::unionTypeOfArrayKeyForNode($code_base, $context, $args[0]); - if ($key_union_type === null) { - $key_union_type = new UnionType([$int_type, $string_type], true); - } - return $key_union_type->asGenericArrayTypes(GenericArrayType::KEY_INT); - }; - /** - * @param array<int,Node|int|string|float> $args - */ - $array_values_callback = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($array_type) : UnionType { - if (\count($args) != 1) { - return $array_type->asUnionType(); - } - $union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - $element_type = $union_type->genericArrayElementTypes(); - return $element_type->asGenericArrayTypes(GenericArrayType::KEY_INT); - }; - /** - * @param array<int,Node|int|string|float> $args - */ - $each_callback = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($mixed_type, $false_type, $int_or_string) : UnionType { - if (\count($args) >= 1) { - $array_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - $element_types = $array_type->genericArrayElementTypes(); - $key_type_enum = GenericArrayType::keyTypeFromUnionTypeKeys($array_type); - if ($key_type_enum !== GenericArrayType::KEY_MIXED) { - $key_type = GenericArrayType::unionTypeForKeyType($key_type_enum); - } else { - $key_type = $int_or_string; - } - $array_shape_type = ArrayShapeType::fromFieldTypes([$key_type, $element_types], false); - - return new UnionType([$array_shape_type, $false_type]); - } - return $mixed_type->asUnionType(); - }; - /** - * @param array<int,Node|int|float|string> $args - */ - $array_combine_callback = static function (CodeBase $code_base, Context $context, Func $function, array $args) use ($array_type) : UnionType { - if (\count($args) < 2) { - return $array_type->asUnionType(); - } - $keys_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - $values_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[1]); - $keys_element_type = $keys_type->genericArrayElementTypes(); - $values_element_type = $values_type->genericArrayElementTypes(); - $key_enum_type = GenericArrayType::keyTypeFromUnionTypeValues($keys_element_type); - return $values_element_type->asGenericArrayTypes($key_enum_type); - }; - return [ - // Gets the element types of the first - 'array_pop' => $get_element_type_of_first_arg, - 'array_shift' => $get_element_type_of_first_arg, - 'current' => $get_element_type_of_first_arg, - 'end' => $get_element_type_of_first_arg, - 'next' => $get_element_type_of_first_arg, - 'pos' => $get_element_type_of_first_arg, // alias of 'current' - 'prev' => $get_element_type_of_first_arg, - 'reset' => $get_element_type_of_first_arg, - 'each' => $each_callback, - - 'key' => $get_key_type_of_first_arg, - 'array_key_first' => $get_key_type_of_first_arg_or_null, - 'array_key_last' => $get_key_type_of_first_arg_or_null, - - 'array_search' => $get_key_type_of_second_arg, - - // array_filter and array_map - 'array_map' => $array_map_callback, - 'array_filter' => $array_filter_callback, - 'array_reduce' => $array_reduce_callback, - - // misc - 'array_change_key_case' => $get_first_array_arg, - 'array_combine' => $array_combine_callback, // combines keys with values - 'array_diff' => $get_first_array_arg, - 'array_diff_assoc' => $get_first_array_arg, - 'array_diff_uassoc' => $get_first_array_arg, - 'array_diff_ukey' => $get_first_array_arg, - 'array_fill_keys' => $array_fill_keys_callback, - 'array_fill' => $array_fill_callback, - 'array_intersect' => $get_first_array_arg, - 'array_intersect_assoc' => $get_first_array_arg, - 'array_intersect_key' => $get_first_array_arg, - 'array_intersect_uassoc' => $get_first_array_arg, - 'array_intersect_ukey' => $get_first_array_arg, - 'array_keys' => $array_keys_callback, - 'array_merge' => $merge_array_types_callback, - 'array_merge_recursive' => $merge_array_types_callback, - 'array_pad' => $array_pad_callback, - 'array_replace' => $merge_array_types_callback, - 'array_replace_recursive' => $merge_array_types_callback, - 'array_reverse' => $get_first_array_arg, - 'array_slice' => $get_first_array_arg, - // 'array_splice' probably used more often by reference - 'array_udiff' => $get_first_array_arg, - 'array_udiff_assoc' => $get_first_array_arg, - 'array_udiff_uassoc' => $get_first_array_arg, - 'array_uintersect' => $get_first_array_arg, - 'array_uintersect_assoc' => $get_first_array_arg, - 'array_uintersect_uassoc' => $get_first_array_arg, - 'array_unique' => $get_first_array_arg, - 'array_values' => $array_values_callback, - // TODO: iterator_to_array - ]; - } - - /** - * @param CodeBase $code_base @phan-unused-param - * @return array<string,\Closure> - */ - public function getReturnTypeOverrides(CodeBase $code_base) : array - { - // Unit tests invoke this repeatedly. Cache it. - static $overrides = null; - if ($overrides === null) { - $overrides = self::getReturnTypeOverridesStatic(); - } - return $overrides; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/BuiltinSuppressionPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/BuiltinSuppressionPlugin.php deleted file mode 100644 index 0fe7645..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/BuiltinSuppressionPlugin.php +++ /dev/null @@ -1,236 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use Generator; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Context; -use Phan\Language\Element\Comment\Builder; -use Phan\Language\Element\TypedElement; -use Phan\Language\Element\UnaddressableTypedElement; -use Phan\Language\FQSEN; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Library\FileCache; -use Phan\PluginV2; -use Phan\PluginV2\SuppressionCapability; -use Phan\Suggestion; - -/** - * Implements Phan's built in suppression kinds - * - * NOTE: This is automatically loaded by phan. Do not include it in a config. - */ -final class BuiltinSuppressionPlugin extends PluginV2 implements - SuppressionCapability -{ - /** - * @var array<string,array{contents:string,suppressions:array<string,array<int,int>>}> - * Maps absolute file paths to the most recently known contents and the corresponding suppression lines for issues. - * (Starts at 1. The index 0 is used for file-based suppressions) - */ - private $current_line_suppressions = []; - - /** - * @var array<string,array<string,true>> - * Maps absolute file paths to the set of file-based suppressions that had an effect. - */ - private $used_file_based_suppressions = []; - - /** - * This will be called if both of these conditions hold: - * - * 1. Phan's file and element-based suppressions did not suppress the issue - * 2. Earlier plugins didn't suppress the issue. - * - * @param CodeBase $code_base - * - * @param string $issue_type - * The type of issue to emit such as Issue::ParentlessClass - * - * @param int $lineno - * The line number where the issue was found - * - * @param array<int,string|int|float|bool|Type|UnionType|FQSEN|TypedElement|UnaddressableTypedElement> $parameters @phan-unused-param - * - * @param ?Suggestion $suggestion @phan-unused-param - * - * @return bool true if the given issue instance should be suppressed, given the current file contents. - */ - public function shouldSuppressIssue( - CodeBase $code_base, - Context $context, - string $issue_type, - int $lineno, - array $parameters, - $suggestion - ) : bool { - $issue_suppression_list = $this->getRawIssueSuppressionList($code_base, $context->getFile()); - $suppressions_for_issue_type = $issue_suppression_list[$issue_type] ?? null; - if (isset($suppressions_for_issue_type[$lineno])) { - return true; - } - if (isset($suppressions_for_issue_type[0])) { - $this->used_file_based_suppressions[Config::projectPath($context->getFile())][$issue_type] = true; - return true; - } - return false; - } - - /** - * @return array<string,array<int,int>> Maps 0 or more issue types to a *list* of lines corresponding to issues that this plugin is going to suppress. - * - * This list is externally used only by UnusedSuppressionPlugin - * - * An empty array can be returned if this is unknown. - */ - public function getIssueSuppressionList( - CodeBase $code_base, - string $file_path - ) : array { - $result = self::getRawIssueSuppressionList($code_base, $file_path); - $used_file_based_suppression_set = $this->used_file_based_suppressions[$file_path] ?? []; - foreach ($used_file_based_suppression_set as $issue_kind => $_) { - unset($result[$issue_kind][0]); - } - return $result; - } - - /** - * @return array<string,array<int,int>> Maps 0 or more issue types to a *list* of lines corresponding to issues that this plugin is going to suppress. - * - * This list is externally used only by UnusedSuppressionPlugin - * - * An empty array can be returned if this is unknown. - */ - public function getRawIssueSuppressionList( - CodeBase $code_base, - string $file_path - ) : array { - if ($file_path === 'internal') { - return []; - } - $absolute_file_path = Config::projectPath($file_path); - $file_contents = FileCache::getOrReadEntry($absolute_file_path)->getContents(); // This is the recommended way to fetch the file contents - - // This is expensive to compute, so we cache it and recalculate if the file contents for $absolute_file_path change. - // It will change when Phan is running in language server mode, updating FileCache. - $cached_suppressions = $this->current_line_suppressions[$absolute_file_path] ?? null; - $suppress_issue_list = $cached_suppressions['suppressions'] ?? []; - - if (($cached_suppressions['contents'] ?? null) !== $file_contents) { - $suppress_issue_list = $this->computeIssueSuggestionList($code_base, $file_contents); - $this->current_line_suppressions[$absolute_file_path] = [ - 'contents' => $file_contents, - 'suppressions' => $suppress_issue_list, - ]; - unset($this->used_file_based_suppressions[$absolute_file_path]); - } - return $suppress_issue_list; - } - - /** - * @return array<string,array<int,int>> Maps 0 or more issue types to a *list* of lines corresponding to issues that this plugin is going to suppress. - */ - private function computeIssueSuggestionList( - CodeBase $unused_code_base, - string $file_contents - ) : array { - if (!\preg_match(self::SUPPRESS_ISSUE_REGEX, $file_contents)) { - // If the **file** doesn't contain the regex we're looking for, - // then none of the comments will. - // (Much faster than tokenizing and checking tokens in the most common case) - return []; - } - $suggestion_list = []; - foreach (self::yieldSuppressionComments($file_contents) as list( - $comment_text, - $comment_start_line, - $comment_start_offset, - $comment_name, - $kind_list_text - )) { - $kind_list = \array_map('trim', \explode(',', $kind_list_text)); - foreach ($kind_list as $issue_kind) { - // Build a map where the line being suppressed is mapped to the line causing the suppression. - if ($comment_name === 'file-suppress') { - if (Config::getValue('disable_file_based_suppression')) { - continue; - } - $suggestion_list[$issue_kind][0] = $comment_start_line + \substr_count($comment_text, "\n", 0, $comment_start_offset); - continue; - } - if (Config::getValue('disable_line_based_suppression')) { - continue; - } - // TODO: Why isn't the type of $comment_start_line inferred? - $line = (int)$comment_start_line; - switch ($comment_name) { - case 'suppress-previous-line': - $line--; - break; - case 'suppress-next-line': - $line++; - break; - case 'suppress-next-next-line': - $line += 2; - break; - } - $line += \substr_count($comment_text, "\n", 0, $comment_start_offset); // How many lines until that comment? - foreach ($kind_list as $issue_kind) { - // Store the suggestion for the issue kind. - // Make this an array set for easier lookup. - $suggestion_list[$issue_kind][$line] = $comment_start_line; - } - } - } - return $suggestion_list; - } - - // @phan-suppress-next-line PhanAccessClassConstantInternal - const SUPPRESS_ISSUE_REGEX = '/@phan-(suppress-(next(?:-next)?|current|previous)-line|file-suppress)\s+' . Builder::SUPPRESS_ISSUE_LIST . '/'; - - /** - * @return Generator<array{0:string,1:int,2:int,3:string,4:string}> - * yields [$comment_text, $comment_start_line, $comment_start_offset, $comment_name, $kind_list_text]; - */ - private static function yieldSuppressionComments( - string $file_contents - ) { - foreach (\token_get_all($file_contents) as $token) { - if (!\is_array($token)) { - continue; - } - $kind = $token[0]; - if ($kind !== \T_COMMENT && $kind !== \T_DOC_COMMENT) { - continue; - } - $comment_text = $token[1]; - if (\strpos($comment_text, '@phan-') === false) { - continue; - } - $comment_start_line = $token[2]; - - // TODO: Emit UnextractableAnnotation if the string begins with phan-suppress or phan-file-suppress but nothing matched - $match_count = \preg_match_all( - self::SUPPRESS_ISSUE_REGEX, - $comment_text, - $matches, - \PREG_OFFSET_CAPTURE - ); - if (!$match_count) { - continue; - } - - // Support multiple suppressions within a comment. (E.g. for suppressing multiple warnings about a doc comment) - for ($i = 0; $i < $match_count; $i++) { - $comment_start_offset = $matches[0][$i][1]; // byte offset - $comment_name = $matches[1][$i][0]; - $kind_list_text = $matches[3][$i][0]; // byte offset - - yield [$comment_text, $comment_start_line, $comment_start_offset, $comment_name, $kind_list_text]; - } - } - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/CallableParamPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/CallableParamPlugin.php deleted file mode 100644 index 1d5d474..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/CallableParamPlugin.php +++ /dev/null @@ -1,214 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use ast\Node; -use Closure; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Context; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Type; -use Phan\Language\Type\CallableInterface; -use Phan\Language\Type\ClassStringType; -use Phan\Plugin\ConfigPluginSet; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeFunctionCallCapability; -use Phan\PluginV2\HandleLazyLoadInternalFunctionCapability; -use function count; - -/** - * NOTE: This is automatically loaded by phan. Do not include it in a config. - * - * TODO: Analyze returning callables (function() : callable) for any callables that are returned as literals? - * This would be difficult. - */ -final class CallableParamPlugin extends PluginV2 implements - AnalyzeFunctionCallCapability, - HandleLazyLoadInternalFunctionCapability -{ - - /** - * @param array<int,int> $callable_params - * @param array<int,int> $class_params - * @phan-return Closure(CodeBase,Context,FunctionInterface,array):void - */ - private static function generateClosure(array $callable_params, array $class_params) : Closure - { - $key = \json_encode([$callable_params, $class_params]); - static $cache = []; - $closure = $cache[$key] ?? null; - if ($closure !== null) { - return $closure; - } - /** - * @param array<int,Node|int|float|string> $args - */ - $closure = static function (CodeBase $code_base, Context $context, FunctionInterface $function, array $args) use ($callable_params, $class_params) { - // TODO: Implement support for variadic callable arguments. - foreach ($callable_params as $i) { - $arg = $args[$i] ?? null; - if ($arg === null) { - continue; - } - - // Fetch possible functions. As an intentional side effect, this warns about invalid callables. - // TODO: Check if the signature allows non-array callables? Not sure of desired semantics. - $function_like_list = UnionTypeVisitor::functionLikeListFromNodeAndContext($code_base, $context, $arg, true); - if (count($function_like_list) === 0) { - // Nothing to do - continue; - } - - if (Config::get_track_references()) { - foreach ($function_like_list as $function) { - $function->addReference($context); - } - } - // self::analyzeFunctionAndNormalArgumentList($code_base, $context, $function_like_list, $arguments); - } - foreach ($class_params as $i) { - $arg = $args[$i] ?? null; - if ($arg === null) { - continue; - } - - // Fetch possible classes. As an intentional side effect, this warns about invalid/undefined class names. - $class_list = UnionTypeVisitor::classListFromClassNameNode($code_base, $context, $arg); - if (count($class_list) === 0) { - // Nothing to do - continue; - } - - if (Config::get_track_references()) { - foreach ($class_list as $class) { - $class->addReference($context); - } - } - } - }; - - $cache[$key] = $closure; - return $closure; - } - - /** - * @return ?Closure(CodeBase,Context,FunctionInterface,array):void - */ - private static function generateClosureForFunctionInterface(FunctionInterface $function) - { - $callable_params = []; - $class_params = []; - foreach ($function->getParameterList() as $i => $param) { - // If there's a type such as Closure|string|int, don't automatically assume that any string or array passed in is meant to be a callable. - // Explicitly require at least one type to be `callable` - if ($param->getUnionType()->hasTypeMatchingCallback(static function (Type $type) : bool { - // TODO: More specific closure for CallableDeclarationType - return $type instanceof CallableInterface; - })) { - $callable_params[] = $i; - } - if ($param->getUnionType()->hasTypeMatchingCallback(static function (Type $type) : bool { - return $type instanceof ClassStringType; - })) { - $class_params[] = $i; - } - } - - if (count($callable_params) === 0 && count($class_params) === 0) { - return null; - } - // Generate a de-duplicated closure. - // fqsen can be global_function or ClassName::method - return self::generateClosure($callable_params, $class_params); - } - - /** - * @return array<string,\Closure> - * @phan-return array<string,Closure(CodeBase,Context,FunctionInterface,array):void> - */ - private static function getAnalyzeFunctionCallClosuresStatic(CodeBase $code_base) : array - { - $result = []; - $add_callable_checker_closure = static function (FunctionInterface $function) use (&$result) { - // Generate a de-duplicated closure. - // fqsen can be global_function or ClassName::method - $closure = self::generateClosureForFunctionInterface($function); - if ($closure) { - $result[$function->getFQSEN()->__toString()] = $closure; - } - }; - - $add_another_closure = static function (string $fqsen, Closure $closure) use (&$result) { - $result[$fqsen] = ConfigPluginSet::mergeAnalyzeFunctionCallClosures( - $closure, - $result[$fqsen] ?? null - ); - }; - - $add_misc_closures = static function (FunctionInterface $function) use ($add_callable_checker_closure, $add_another_closure, $code_base) { - $add_callable_checker_closure($function); - // @phan-suppress-next-line PhanAccessMethodInternal - $closure = $function->getCommentParamAssertionClosure($code_base); - if ($closure) { - $add_another_closure($function->getFQSEN()->__toString(), $closure); - } - }; - - foreach ($code_base->getFunctionMap() as $function) { - $add_misc_closures($function); - } - foreach ($code_base->getMethodSet() as $function) { - $add_misc_closures($function); - } - - // new ReflectionFunction('my_func') is a usage of my_func() - // See https://github.com/phan/phan/issues/1204 for note on function_exists() (not supported right now) - $result['\\ReflectionFunction::__construct'] = self::generateClosure([0], []); - $result['\\ReflectionClass::__construct'] = self::generateClosure([], [0]); - - // When a codebase calls function_exists(string|callable) is to **check** if a function exists, - // don't emit PhanUndeclaredFunctionInCallable as a side effect. - unset($result['\\function_exists']); - - // Don't do redundant work extracting function definitions for commonly invoked functions. - // TODO: Get actual statistics on how frequently used these are - unset($result['\\call_user_func']); - unset($result['\\call_user_func_array']); - unset($result['\\array_map']); - unset($result['\\array_filter']); - // End of commonly used functions. - - return $result; - } - - /** - * When a function is loaded into the CodeBase for the first time during analysis - * (e.g. `register_shutdown_function()`, this is called to conditionally add any checkers for callable/closure. - */ - public function handleLazyLoadInternalFunction( - CodeBase $unused_code_base, - Func $function - ) { - $closure = self::generateClosureForFunctionInterface($function); - if ($closure) { - $function->addFunctionCallAnalyzer($closure); - } - } - - /** - * @return array<string,Closure(CodeBase,Context,FunctionInterface,array):void> - * @override - */ - public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array - { - // Unit tests invoke this repeatedly. Cache it. - static $analyzers = null; - if ($analyzers === null) { - $analyzers = self::getAnalyzeFunctionCallClosuresStatic($code_base); - } - return $analyzers; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/ClosureReturnTypeOverridePlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/ClosureReturnTypeOverridePlugin.php deleted file mode 100644 index 096a1e2..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/ClosureReturnTypeOverridePlugin.php +++ /dev/null @@ -1,334 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use ast\Node; -use Closure; -use Phan\Analysis\ArgumentType; -use Phan\Analysis\PostOrderAnalysisVisitor; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Context; -use Phan\Language\Element\Func; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Method; -use Phan\Language\Type; -use Phan\Language\Type\ClosureType; -use Phan\Language\UnionType; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeFunctionCallCapability; -use Phan\PluginV2\ReturnTypeOverrideCapability; - -/** - * NOTE: This is automatically loaded by phan. Do not include it in a config. - * - * TODO: Refactor this. - */ -final class ClosureReturnTypeOverridePlugin extends PluginV2 implements - AnalyzeFunctionCallCapability, - ReturnTypeOverrideCapability -{ - - /** - * @param Node|int|string|float|null $arg_array_node - * @return ?array<int,Node|int|string|float> - */ - private static function extractArrayArgs($arg_array_node) - { - if (($arg_array_node instanceof Node) && $arg_array_node->kind === \ast\AST_ARRAY) { - $arguments = []; - foreach ($arg_array_node->children as $child) { - if (!($child instanceof Node)) { - continue; - } - $arguments[] = $child->children['value']; - } - return $arguments; - } else { - return null; - } - } - - /** - * @return array<string,\Closure> - */ - private static function getReturnTypeOverridesStatic() : array - { - /** - * @param array<int,Node|int|string|float> $args - */ - $call_user_func_callback = static function ( - CodeBase $code_base, - Context $context, - Func $unused_function, - array $args - ) : UnionType { - $element_types = UnionType::empty(); - if (\count($args) < 1) { - return $element_types; - } - $function_like_list = UnionTypeVisitor::functionLikeListFromNodeAndContext($code_base, $context, $args[0], true); - if (\count($function_like_list) === 0) { - return $element_types; - } - foreach ($function_like_list as $function_like) { - if ($function_like->hasDependentReturnType()) { - $element_types = $element_types->withUnionType($function_like->getDependentReturnType($code_base, $context, \array_slice($args, 1))); - } else { - $element_types = $element_types->withUnionType($function_like->getUnionType()); - } - } - if (Config::get_track_references()) { - foreach ($function_like_list as $function_like) { - $function_like->addReference($context); - } - } - return $element_types; - }; - /** - * @param array<int,Node|int|string|float> $args - */ - $call_user_func_array_callback = static function ( - CodeBase $code_base, - Context $context, - Func $unused_function, - array $args - ) : UnionType { - $element_types = UnionType::empty(); - if (\count($args) < 2) { - return $element_types; - } - // Currently, only analyze calls of the form call_user_func_array(callable expression, [$arg1, $arg2...]) - $function_like_list = UnionTypeVisitor::functionLikeListFromNodeAndContext($code_base, $context, $args[0], true); - if (\count($function_like_list) === 0) { - return $element_types; - } - $arguments = self::extractArrayArgs($args[1]); - $element_types = UnionType::empty(); - - foreach ($function_like_list as $function_like) { - if ($arguments !== null && $function_like->hasDependentReturnType()) { - $element_types = $element_types->withUnionType($function_like->getDependentReturnType($code_base, $context, $arguments)); - } else { - $element_types = $element_types->withUnionType($function_like->getUnionType()); - } - } - if (Config::get_track_references()) { - foreach ($function_like_list as $function_like) { - $function_like->addReference($context); - } - } - if ($arguments !== null) { - self::analyzeFunctionAndNormalArgumentList($code_base, $context, $function_like_list, $arguments); - } - return $element_types; - }; - /** - * @param array<int,Node|int|string|float> $args - */ - $from_callable_callback = static function ( - CodeBase $code_base, - Context $context, - Method $unused_method, - array $args - ) : UnionType { - if (\count($args) < 1) { - return ClosureType::instance(false)->asUnionType(); - } - $function_like_list = UnionTypeVisitor::functionLikeListFromNodeAndContext($code_base, $context, $args[0], true); - if (\count($function_like_list) === 0) { - return ClosureType::instance(false)->asUnionType(); - } - $closure_types = UnionType::empty(); - foreach ($function_like_list as $function_like) { - $closure_types = $closure_types->withType(ClosureType::instanceWithClosureFQSEN($function_like->getFQSEN(), $function_like)); - } - return $closure_types; - }; - /** - * @param array<int,Node|int|float|string> $args - */ - $from_closure_callback = static function ( - CodeBase $code_base, - Context $context, - Method $unused_method, - array $args - ) : UnionType { - if (\count($args) < 1) { - return ClosureType::instance(false)->asUnionType(); - } - $types = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0], true); - $types = $types->makeFromFilter(static function (Type $type) : bool { - if ($type instanceof ClosureType) { - return $type->hasKnownFQSEN(); - } - return false; - }); - - if ($types->isEmpty()) { - return ClosureType::instance(false)->asUnionType(); - } - return $types; - }; - return [ - // call - 'call_user_func' => $call_user_func_callback, - 'forward_static_call' => $call_user_func_callback, - 'call_user_func_array' => $call_user_func_array_callback, - 'forward_static_call_array' => $call_user_func_array_callback, - 'Closure::fromCallable' => $from_callable_callback, - 'Closure::bind' => $from_closure_callback, - ]; - } - - /** - * @return array<string,\Closure> - */ - private static function getAnalyzeFunctionCallClosuresStatic() : array - { - /** - * @param array<int,Node|int|string|float> $args - * @return void - */ - $call_user_func_callback = static function ( - CodeBase $code_base, - Context $context, - Func $unused_function, - array $args - ) { - if (\count($args) < 1) { - return; - } - $function_like_list = UnionTypeVisitor::functionLikeListFromNodeAndContext($code_base, $context, $args[0], true); - if (\count($function_like_list) === 0) { - return; - } - $arguments = \array_slice($args, 1); - self::analyzeFunctionAndNormalArgumentList($code_base, $context, $function_like_list, $arguments); - }; - - /** - * @param array<int,Node|int|string|float> $args - * @return void - */ - $call_user_func_array_callback = static function ( - CodeBase $code_base, - Context $context, - Func $unused_function, - array $args - ) { - if (\count($args) < 2) { - return; - } - // Currently, only analyze calls of the form call_user_func_array(callable expression, [$arg1, $arg2...]) - $function_like_list = UnionTypeVisitor::functionLikeListFromNodeAndContext($code_base, $context, $args[0], true); - if (\count($function_like_list) === 0) { - return; - } - $arguments = self::extractArrayArgs($args[1] ?? null); - if ($arguments === null) { - return; - } - - self::analyzeFunctionAndNormalArgumentList($code_base, $context, $function_like_list, $arguments); - }; - return [ - // call - 'call_user_func' => $call_user_func_callback, - 'forward_static_call' => $call_user_func_callback, - 'call_user_func_array' => $call_user_func_array_callback, - 'forward_static_call_array' => $call_user_func_array_callback, - ]; - } - - /** - * @param $code_base @phan-unused-param - * @return array<string,\Closure> - * @override - */ - public function getReturnTypeOverrides(CodeBase $code_base) : array - { - // Unit tests invoke this repeatedly. Cache it. - static $overrides = null; - if ($overrides === null) { - $overrides = self::getReturnTypeOverridesStatic(); - } - return $overrides; - } - - /** - * @param CodeBase $code_base @phan-unused-param - * @return array<string,\Closure> - * @override - */ - public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array - { - // Unit tests invoke this repeatedly. Cache it. - static $analyzers = null; - if ($analyzers === null) { - $analyzers = self::getAnalyzeFunctionCallClosuresStatic(); - } - return $analyzers; - } - - /** - * This caches the arguments inferred as the union types of arguments passed to function calls. - * This is used in case there are multiple function-likes that need to be analyzed. - * - * TODO: Is this still needed? - * @return Closure(mixed,int):UnionType - */ - public static function createNormalArgumentCache(CodeBase $code_base, Context $context) : Closure - { - $cache = []; - /** - * @param Node|int|string|float|null $argument - */ - return static function ($argument, int $i) use ($code_base, $context, &$cache) : UnionType { - $argument_type = $cache[$i] ?? null; - if (isset($argument_type)) { - return $argument_type; - } - $argument_type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $argument, - true - ); - $cache[$i] = $argument_type; - return $argument_type; - }; - } - - /** - * Analyze a function which is called with the un-transformed types from $arguments. - * - * @param CodeBase $code_base - * @param Context $context - * @param array<int,FunctionInterface> $function_like_list - * @param array<int,Node|string|int|float> $arguments - * - * @return void - */ - private static function analyzeFunctionAndNormalArgumentList(CodeBase $code_base, Context $context, array $function_like_list, array $arguments) - { - $get_argument_type = self::createNormalArgumentCache($code_base, $context); - foreach ($function_like_list as $function_like) { - ArgumentType::analyzeForCallback($function_like, $arguments, $context, $code_base, $get_argument_type); - } - if (Config::get_quick_mode()) { - // Keep it fast, don't recurse. - return; - } - - $argument_types = []; - foreach ($arguments as $i => $argument) { - $argument_types[] = $get_argument_type($argument, $i); - } - $analyzer = new PostOrderAnalysisVisitor($code_base, $context, []); - foreach ($function_like_list as $function_like) { - $analyzer->analyzeCallableWithArgumentTypes($argument_types, $function_like); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/CompactPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/CompactPlugin.php deleted file mode 100644 index d01d912..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/CompactPlugin.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use ast\Node; -use Phan\AST\ContextNode; -use Phan\CodeBase; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Context; -use Phan\Language\Element\Func; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeFunctionCallCapability; - -/** - * NOTE: This is automatically loaded by phan. Do not include it in a config. - */ -final class CompactPlugin extends PluginV2 implements - AnalyzeFunctionCallCapability -{ - - /** - * @param CodeBase $code_base @phan-unused-param - */ - public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array - { - // Unit tests invoke this repeatedly. Cache it. - static $analyzers = null; - if ($analyzers === null) { - $analyzers = self::getAnalyzeFunctionCallClosuresStatic(); - } - return $analyzers; - } - - /** - * @return array<string,\Closure> - */ - private static function getAnalyzeFunctionCallClosuresStatic() : array - { - /** - * @param array<int,Node|int|float|string> $args - * @return void - */ - $compact_callback = static function ( - CodeBase $code_base, - Context $context, - Func $unused_func, - array $args - ) { - $maybe_emit_issue = static function (string $variable_name, $arg = null) use ($code_base, $context) { - if (!$context->getScope()->hasVariableWithName($variable_name)) { - Issue::maybeEmitWithParameters( - $code_base, - $context, - Issue::UndeclaredVariable, - $arg->lineno ?? $context->getLineNumberStart(), - [$variable_name], - IssueFixSuggester::suggestVariableTypoFix($code_base, $context, $variable_name) - ); - } - }; - foreach ($args as $arg) { - if (\is_string($arg)) { - $maybe_emit_issue($arg); - // NOTE: compact is **not** aware of superglobals - continue; - } - if (!($arg instanceof Node)) { - continue; - } - $value = (new ContextNode($code_base, $context, $arg))->getEquivalentPHPValue(ContextNode::RESOLVE_DEFAULT & ~ContextNode::RESOLVE_ARRAY_KEYS); - if (\is_string($value)) { - $maybe_emit_issue($value, $arg); - continue; - } - if (\is_array($value)) { - foreach ($value as $value_element) { - if (\is_string($value_element)) { - $maybe_emit_issue($value_element, $arg); - } - } - } - } - }; - return [ - 'compact' => $compact_callback, - ]; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/DependentReturnTypeOverridePlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/DependentReturnTypeOverridePlugin.php deleted file mode 100644 index 7e30cca..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/DependentReturnTypeOverridePlugin.php +++ /dev/null @@ -1,338 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use ast\Node; -use Closure; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Config; -use Phan\Language\Context; -use Phan\Language\Element\Func; -use Phan\Language\Type; -use Phan\Language\Type\FloatType; -use Phan\Language\Type\NullType; -use Phan\Language\Type\StringType; -use Phan\Language\Type\TrueType; -use Phan\Language\Type\VoidType; -use Phan\Language\UnionType; -use Phan\PluginV2; -use Phan\PluginV2\ReturnTypeOverrideCapability; - -use function count; -use function is_int; -use function is_string; - -/** - * NOTE: This is automatically loaded by phan. Do not include it in a config. - * - * This internal plugin will warn if calls to internal string functions - * or regex function appear to have arguments in the wrong order, - * - * e.g. explode($var, ':') or strpos(':', $x) - */ -final class DependentReturnTypeOverridePlugin extends PluginV2 implements - ReturnTypeOverrideCapability -{ - /** - * A static method to compute the return type override methods - * @param CodeBase $code_base @phan-unused-param - * @return array<string,\Closure> - * @phan-return array<string, Closure(CodeBase,Context,Func,array):UnionType> - * @internal - */ - public static function getReturnTypeOverridesStatic(CodeBase $code_base) : array - { - $string_union_type = StringType::instance(false)->asUnionType(); - $true_union_type = TrueType::instance(false)->asUnionType(); - $string_or_true_union_type = $string_union_type->withUnionType($true_union_type); - $void_union_type = VoidType::instance(false)->asUnionType(); - $nullable_string_union_type = StringType::instance(true)->asUnionType(); - $float_union_type = FloatType::instance(false)->asUnionType(); - $string_or_float_union_type = $string_union_type->withUnionType($float_union_type); - - /** - * @phan-return Closure(CodeBase,Context,Func,array):UnionType - */ - $make_dependent_type_method = static function (int $expected_bool_pos, UnionType $type_if_true, UnionType $type_if_false, UnionType $type_if_unknown) : Closure { - /** - * @param Func $function @phan-unused-param - * @param array<int,Node|int|float|string> $args - * @return UnionType - */ - return static function ( - CodeBase $code_base, - Context $context, - Func $function, - array $args - ) use ( - $type_if_true, - $type_if_unknown, - $type_if_false, - $expected_bool_pos -) : UnionType { - if (count($args) <= $expected_bool_pos) { - return $type_if_false; - } - $result = (new ContextNode($code_base, $context, $args[$expected_bool_pos]))->getEquivalentPHPScalarValue(); - if (is_int($result)) { - $result = (bool)$result; - } - if ($result === true) { - return $type_if_true; - } elseif ($result === false) { - return $type_if_false; - } else { - // unable to determine. - return $type_if_unknown; - } - }; - }; - /** - * @phan-return Closure(CodeBase,Context,Func,array):UnionType - */ - $make_arg_existence_dependent_type_method = static function (int $arg_pos, string $type_if_exists_string, string $type_if_missing_string) : Closure { - $type_if_exists = UnionType::fromFullyQualifiedString($type_if_exists_string); - $type_if_missing = UnionType::fromFullyQualifiedString($type_if_missing_string); - /** - * @param array<int,Node|int|float|string> $args - */ - return static function ( - CodeBase $unused_code_base, - Context $unused_context, - Func $unused_function, - array $args - ) use ( - $arg_pos, - $type_if_exists, - $type_if_missing -) : UnionType { - return isset($args[$arg_pos]) ? $type_if_exists : $type_if_missing; - }; - }; - - $json_decode_array_types = UnionType::fromFullyQualifiedString('array|string|float|int|bool|null'); - $json_decode_object_types = UnionType::fromFullyQualifiedString('\stdClass|array<int,mixed>|string|float|int|bool|null'); - $json_decode_array_or_object_types = UnionType::fromFullyQualifiedString('\stdClass|array|string|float|int|bool|null'); - - $string_if_2_true = $make_dependent_type_method(1, $string_union_type, $void_union_type, $nullable_string_union_type); - $string_if_2_true_else_true = $make_dependent_type_method(1, $string_union_type, $true_union_type, $string_or_true_union_type); - - /** - * @return UnionType - * @param Func $function @phan-unused-param - * @param array<int,Node|int|float|string> $args - */ - $json_decode_return_type_handler = static function ( - CodeBase $code_base, - Context $context, - Func $function, - array $args - ) use ( - $json_decode_array_types, - $json_decode_object_types, - $json_decode_array_or_object_types -) : UnionType { - // mixed json_decode ( string $json [, bool $assoc = FALSE [, int $depth = 512 [, int $options = 0 ]]] ) - // $options can include JSON_OBJECT_AS_ARRAY in a bitmask - // TODO: reject `...` operator? (Low priority) - if (count($args) < 2) { - return $json_decode_object_types; - } - $result = (new ContextNode($code_base, $context, $args[1]))->getEquivalentPHPScalarValue(); - if (is_int($result)) { - // We are already warning about the param type. E.g. var_export($arg, 1) returns a string - $result = (bool)$result; - } - if ($result === true) { - return $json_decode_array_types; - } - if ($result !== false) { - return $json_decode_array_or_object_types; - } - if (count($args) < 4) { - return $json_decode_object_types; - } - $options_result = (new ContextNode($code_base, $context, $args[3]))->getEquivalentPHPScalarValue(); - if (!is_int($options_result)) { - // unable to resolve value. TODO: Support bitmask operators in getEquivalentPHPScalarValue - return $json_decode_array_or_object_types; - } - return ($options_result & \JSON_OBJECT_AS_ARRAY) !== 0 ? $json_decode_array_types : $json_decode_object_types; - }; - - $str_replace_types = UnionType::fromFullyQualifiedString('string|string[]'); - $str_array_type = UnionType::fromFullyQualifiedString('string[]'); - - /** - * @param array<int,Node|int|float|string> $args - */ - $third_argument_string_or_array_handler = static function ( - CodeBase $code_base, - Context $context, - Func $unused_function, - array $args - ) use ( - $string_union_type, - $str_replace_types, - $str_array_type - ) : UnionType { - // mixed json_decode ( string $json [, bool $assoc = FALSE [, int $depth = 512 [, int $options = 0 ]]] ) - // $options can include JSON_OBJECT_AS_ARRAY in a bitmask - // TODO: reject `...` operator? (Low priority) - if (count($args) < 3) { - return $str_replace_types; - } - $union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[2]); - $has_array = $union_type->hasArray(); - if ($union_type->canCastToUnionType($string_union_type)) { - return $has_array ? $str_replace_types : $string_union_type; - } - return $has_array ? $str_array_type : $str_replace_types; - }; - $string_or_false = UnionType::fromFullyQualifiedString('string|false'); - /** - * @param array<int,Node|int|float|string> $args - */ - $getenv_handler = static function ( - CodeBase $unused_code_base, - Context $unused_context, - Func $unused_function, - array $args - ) use ($string_or_false) : UnionType { - if (count($args) === 0 && Config::get_closest_target_php_version_id() >= 70100) { - return UnionType::fromFullyQualifiedString('array<string,string>'); - } - return $string_or_false; - }; - /** - * @param array<int,Node|int|float|string> $args - */ - $substr_handler = static function ( - CodeBase $unused_code_base, - Context $unused_context, - Func $unused_function, - array $args - ) use ( - $string_or_false, - $string_union_type -) : UnionType { - if (count($args) >= 2 && is_int($args[1]) && $args[1] <= 0) { - // Cut down on false positive warnings about substr($str, 0, $len) possibly being false - return $string_union_type; - } - return $string_or_false; - }; - - $parse_url_handler = $make_arg_existence_dependent_type_method( - 1, - 'string|int|null|false', - 'array{scheme?:string,host?:string,port?:int,user?:string,pass?:string,path?:string,query?:string,fragment?:string}|false' - ); - - /** - * @param array<int,Node|int|float|string> $args - */ - $dirname_handler = static function ( - CodeBase $code_base, - Context $context, - Func $unused_function, - array $args - ) use ( - $string_union_type -) : UnionType { - if (count($args) !== 1) { - if (count($args) !== 2) { - // Cut down on false positive warnings about substr($str, 0, $len) possibly being false - return $string_union_type; - } - $levels = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[1])->asSingleScalarValueOrNull(); - if (!is_int($levels)) { - return $string_union_type; - } - if ($levels <= 0) { - // TODO: Could warn but not common - return NullType::instance(false)->asUnionType(); - } - } else { - $levels = 1; - } - $arg = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0])->asSingleScalarValueOrNull(); - if (!is_string($arg)) { - return $string_union_type; - } - - $result = \dirname($arg, $levels); - return Type::fromObject($result)->asUnionType(); - }; - - - return [ - // commonly used functions where the return type depends on a passed in boolean - 'var_export' => $string_if_2_true, - 'print_r' => $string_if_2_true_else_true, - 'json_decode' => $json_decode_return_type_handler, - // Functions with dependent return types - 'str_replace' => $third_argument_string_or_array_handler, - 'preg_replace' => $third_argument_string_or_array_handler, - 'preg_replace_callback' => $third_argument_string_or_array_handler, - 'preg_replace_callback_array' => $third_argument_string_or_array_handler, - 'microtime' => $make_dependent_type_method(0, $float_union_type, $string_union_type, $string_or_float_union_type), - // misc - 'getenv' => $getenv_handler, - 'version_compare' => $make_arg_existence_dependent_type_method(2, 'bool', 'int'), - 'pathinfo' => $make_arg_existence_dependent_type_method(1, 'string', 'array{dirname:string,basename:string,extension?:string,filename:string}'), - 'parse_url' => $parse_url_handler, - 'substr' => $substr_handler, - 'dirname' => $dirname_handler, - 'basename' => self::makeStringFunctionHandler('basename'), - ]; - } - - /** - * @param callable(string):string $callable a function that acts on strings. - */ - private static function makeStringFunctionHandler(callable $callable) : Closure - { - $string_union_type = StringType::instance(false)->asUnionType(); - /** - * @param array<int,Node|int|float|string> $args - */ - return static function ( - CodeBase $code_base, - Context $context, - Func $unused_function, - array $args - ) use ( - $string_union_type, - $callable -) : UnionType { - if (count($args) !== 1) { - // Cut down on false positive warnings about substr($str, 0, $len) possibly being false - return $string_union_type; - } - $arg = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0])->asSingleScalarValueOrNull(); - if (!is_string($arg)) { - return $string_union_type; - } - - $result = $callable($arg); - return Type::fromObject($result)->asUnionType(); - }; - } - - /** - * @return array<string,\Closure> - * @override - */ - public function getReturnTypeOverrides(CodeBase $code_base) : array - { - // Unit tests invoke this repeatedly. Cache it. - static $overrides = null; - if ($overrides === null) { - $overrides = self::getReturnTypeOverridesStatic($code_base); - } - return $overrides; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/DumpPHPDocPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/DumpPHPDocPlugin.php deleted file mode 100644 index dad1da1..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/DumpPHPDocPlugin.php +++ /dev/null @@ -1,226 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use Phan\CodeBase; -use Phan\Language\Element\AddressableElement; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\MarkupDescription; -use Phan\Language\Element\Method; -use Phan\Language\Element\Property; -use Phan\Phan; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeClassCapability; -use Phan\PluginV2\AnalyzeFunctionCapability; -use Phan\PluginV2\AnalyzeMethodCapability; -use Phan\PluginV2\AnalyzePropertyCapability; -use Phan\PluginV2\FinalizeProcessCapability; - -/** - * This file dumps Phan's inferred signatures and markup descriptions as markdown. - * - * NOTE: This is automatically loaded by phan. Do not include it in a config. - */ -final class DumpPHPDocPlugin extends PluginV2 implements - AnalyzeClassCapability, - AnalyzeFunctionCapability, - AnalyzeMethodCapability, - AnalyzePropertyCapability, - FinalizeProcessCapability -{ - /** - * @var array<string,string> the stubs to use - */ - private $stubs = []; - - private static function generatePHPMarkdownBlock(string $php_snippet) : string - { - $php_snippet = \trim($php_snippet); - return "```php\n$php_snippet\n```"; - } - - /** - * @param CodeBase $unused_code_base - * The code base in which the class exists - * - * @param Clazz $class - * A class being analyzed - * - * @return void - * - * @override - */ - public function analyzeClass( - CodeBase $unused_code_base, - Clazz $class - ) { - if ($class->getFQSEN()->isAlternate()) { - return; - } - $description = MarkupDescription::extractDescriptionFromDocComment($class); - - $this->recordStub( - $class, - self::generatePHPMarkdownBlock($class->getMarkupDescription()), - $description - ); - } - - private function recordStub(AddressableElement $element, string $header_text, string $doc_comment_markup = null) - { - if (Phan::isExcludedAnalysisFile($element->getFileRef()->getFile())) { - return; - } - $markup = "## " . \ltrim($element->getFQSEN()->__toString(), "\\") . "\n\n"; - $markup .= $header_text . "\n\n"; - if ($doc_comment_markup !== null) { - $markup .= "Description:\n\n"; - $markup .= $doc_comment_markup . "\n\n"; - } - $this->stubs[$element->getFQSEN() . "\x00" . \get_class($element)] = $markup; - } - - /** - * @param CodeBase $unused_code_base - * The code base in which the property exists - * - * @param Property $property - * A property being analyzed - * - * @return void - * - * @override - */ - public function analyzeProperty( - CodeBase $unused_code_base, - Property $property - ) { - if ($property->isDynamicProperty()) { - // Dynamic properties don't have declarations or phpdoc. - return; - } - if ($property->isFromPHPDoc()) { - // Phan does not track descriptions of (at)property. - // TODO: Enable - return; - } - if ($property->getFQSEN() !== $property->getRealDefiningFQSEN()) { - // Only emit stubs for the original definition of this property. - return; - } - $description = MarkupDescription::extractDescriptionFromDocComment($property); - - $this->recordStub( - $property, - self::generatePHPMarkdownBlock($property->getMarkupDescription()), - $description - ); - } - - /** - * @param CodeBase $unused_code_base - * The code base in which the method exists - * - * @param Method $method - * A method being analyzed - * - * @return void - * - * @override - */ - public function analyzeMethod( - CodeBase $unused_code_base, - Method $method - ) { - if ($method->isFromPHPDoc()) { - // Phan does not track descriptions of (at)method. - return; - } - if ($method->getFQSEN() !== $method->getRealDefiningFQSEN()) { - // Only warn once for the original definition of this method. - // Don't warn about subclasses inheriting this method. - return; - } - $description = MarkupDescription::extractDescriptionFromDocComment($method); - if (!($method->getDocComment() || !$description) && $method->getIsOverride()) { - // Note: This deliberately avoids showing a summary for methods that are just overrides of other methods, - // unless they have their own phpdoc. - // Eventually, extractDescriptionFromDocComment will search ancestor classes for $description - return; - } - - foreach (MarkupDescription::extractParamTagsFromDocComment($method) as $param_name => $param_markup) { - if ($description === null) { - $description = ""; - } - $description .= "\n\n### \$$param_name\n\n$param_markup\n\n"; - } - - $this->recordStub( - $method, - self::generatePHPMarkdownBlock($method->getMarkupDescription()), - $description - ); - } - - /** - * @param CodeBase $code_base - * The code base in which the function exists - * - * @param Func $function - * A function being analyzed - * - * @return void - * - * @override - */ - public function analyzeFunction( - CodeBase $code_base, - Func $function - ) { - if ($function->isPHPInternal()) { - // This isn't user-defined, there's no reason to warn or way to change it. - return; - } - if ($function->isNSInternal($code_base)) { - // (at)internal are internal to the library, and there's less of a need to document them - return; - } - if ($function->isClosure()) { - // Probably not useful in many cases to document a short closure passed to array_map, etc. - return; - } - $description = MarkupDescription::extractDescriptionFromDocComment($function); - - foreach (MarkupDescription::extractParamTagsFromDocComment($function) as $param_name => $param_markup) { - if ($description === null) { - $description = ""; - } - $description .= "\n\n### \$$param_name\n\n$param_markup\n\n"; - } - - - $this->recordStub( - $function, - self::generatePHPMarkdownBlock($function->getMarkupDescription()), - $description - ); - } - - /** - * Executed before the analysis phase starts. - * @override - */ - public function finalizeProcess(CodeBase $unused_code_base) - { - \ksort($this->stubs); - echo "# Phan Signatures\n\n"; - echo \implode('', $this->stubs); - exit(\EXIT_SUCCESS); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new DumpPHPDocPlugin(); diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/ExtendedDependentReturnTypeOverridePlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/ExtendedDependentReturnTypeOverridePlugin.php deleted file mode 100644 index 09590b6..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/ExtendedDependentReturnTypeOverridePlugin.php +++ /dev/null @@ -1,169 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use ast\Node; -use Closure; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\Func; -use Phan\Language\Type; -use Phan\Language\Type\IntType; -use Phan\Language\Type\MixedType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; -use Phan\PluginV2; -use Phan\PluginV2\ReturnTypeOverrideCapability; -use Throwable; - -use function count; - -/** - * NOTE: This is automatically loaded by phan. Do not include it in a config. - * - * This internal plugin will aggressively infer return types - * for certain methods if all arguments are known literal values (e.g. str_replace, implode) - */ -final class ExtendedDependentReturnTypeOverridePlugin extends PluginV2 implements - ReturnTypeOverrideCapability -{ - /** - * @param CodeBase $code_base @phan-unused-param - * @return array<string,\Closure> - * @phan-return array<string, Closure(CodeBase,Context,Func,array):UnionType> - */ - private static function getReturnTypeOverridesStatic(CodeBase $code_base) : array - { - $string_union_type = StringType::instance(false)->asUnionType(); - $mixed_union_type = MixedType::instance(false)->asUnionType(); - /** - * @param callable-string $function - * @return Closure(CodeBase,Context,Func,array):UnionType - */ - $wrap_n_argument_function = static function ( - callable $function, - int $min_args, - int $max_args = null, - UnionType $default_type = null - ) use ($string_union_type) : Closure { - $default_type = $default_type ?? $string_union_type; - $max_args = $max_args ?? $min_args; - /** - * @param array<int,Node|string|int|float> $args - */ - return static function ( - CodeBase $code_base, - Context $context, - Func $unused_function, - array $args - ) use ( - $default_type, - $function, - $min_args, - $max_args - ) : UnionType { - if (count($args) < $min_args || count($args) > $max_args) { - return $default_type; - } - $values = []; - foreach ($args as $arg) { - $value = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $arg)->asValueOrNullOrSelf(); - if (\is_object($value)) { - return $default_type; - } - $values[] = $value; - } - try { - $result = \with_disabled_phan_error_handler(/** @return mixed */ static function () use ($function, $values) { - return @$function(...$values); - }); - } catch (Throwable $e) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeErrorInInternalCall, - $args[0]->lineno ?? $context->getLineNumberStart(), - $function, - $e->getMessage() - ); - return $default_type; - } - return Type::fromObjectExtended($result)->asUnionType(); - }; - }; - $basic_return_type_overrides = (new DependentReturnTypeOverridePlugin())->getReturnTypeOverrides($code_base); - /** - * @param callable-string $function - */ - $wrap_n_argument_function_with_fallback = static function (callable $function, int $min, int $max = null) use ($basic_return_type_overrides, $wrap_n_argument_function, $mixed_union_type) : Closure { - $cb = $wrap_n_argument_function($function, $min, $max, $mixed_union_type); - $cb_fallback = $basic_return_type_overrides[$function]; - /** - * @param array<int,Node|string|int|float> $args - */ - return static function ( - CodeBase $code_base, - Context $context, - Func $function_decl, - array $args - ) use ( - $cb, - $cb_fallback, - $mixed_union_type -) : UnionType { - $result = $cb($code_base, $context, $function_decl, $args); - if ($result !== $mixed_union_type) { - return $result; - } - return $cb_fallback($code_base, $context, $function_decl, $args); - }; - }; - $int_union_type = IntType::instance(false)->asUnionType(); - - return [ - // commonly used functions where the return type depends only on the passed in arguments - // TODO: Add remaining functions - 'abs' => $wrap_n_argument_function('abs', 1, 1, $int_union_type), - 'addcslashes' => $wrap_n_argument_function('addcslashes', 2), - 'addslashes' => $wrap_n_argument_function('addslashes', 1), - 'explode' => $wrap_n_argument_function('explode', 2, 3, UnionType::fromFullyQualifiedString('array<int,string>')), - 'implode' => $wrap_n_argument_function('implode', 1, 2), - // TODO: Improve this to warn about invalid json with json_error_last() - 'json_decode' => $wrap_n_argument_function_with_fallback('json_decode', 1, 4), - 'json_encode' => $wrap_n_argument_function('json_encode', 1, 3, UnionType::fromFullyQualifiedString('string|false')), - 'substr' => $wrap_n_argument_function('substr', 1, 3), - 'strlen' => $wrap_n_argument_function('strlen', 1, 3), - 'join' => $wrap_n_argument_function('join', 1), - 'ltrim' => $wrap_n_argument_function('ltrim', 1, 2), - 'rtrim' => $wrap_n_argument_function('rtrim', 1, 2), - 'str_ireplace' => $wrap_n_argument_function('str_ireplace', 3, 4), - 'str_replace' => $wrap_n_argument_function('str_replace', 3, 4), - 'strpos' => $wrap_n_argument_function('strpos', 1, 3), - 'strrpos' => $wrap_n_argument_function('strrpos', 1, 3), - 'strripos' => $wrap_n_argument_function('strripos', 1, 3), - 'stripos' => $wrap_n_argument_function('stripos', 1, 3), - 'strrev' => $wrap_n_argument_function('strrev', 1), - 'strtolower' => $wrap_n_argument_function('strtolower', 1), - 'strtoupper' => $wrap_n_argument_function('strtoupper', 1), - 'trim' => $wrap_n_argument_function('trim', 1, 2), - 'chr' => $wrap_n_argument_function('chr', 1, 1), - 'ord' => $wrap_n_argument_function('ord', 1, 1, $int_union_type), - ]; - } - - /** - * @return array<string,\Closure> - * @override - */ - public function getReturnTypeOverrides(CodeBase $code_base) : array - { - // Unit tests invoke this repeatedly. Cache it. - static $overrides = null; - if ($overrides === null) { - $overrides = self::getReturnTypeOverridesStatic($code_base); - } - return $overrides; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin.php deleted file mode 100644 index 35015b7..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use Error; -use Phan\CodeBase; -use Phan\Phan; -use Phan\Plugin\Internal\IssueFixingPlugin\IssueFixer; -use Phan\PluginV2; -use Phan\PluginV2\FinalizeProcessCapability; - -/** - * This plugin fixes a small number of issues automatically. - * This uses heuristics to guess where the fix should be applied. - */ -class IssueFixingPlugin extends PluginV2 implements - FinalizeProcessCapability -{ - /** - * @override - * @throws Error if a syntax check process fails to shut down. - */ - public function finalizeProcess(CodeBase $code_base) - { - $instances = Phan::getIssueCollector()->getCollectedIssues(); - if (\count($instances) > 0) { - IssueFixer::applyFixes($code_base, $instances); - } - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new IssueFixingPlugin(); diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileContents.php b/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileContents.php deleted file mode 100644 index 896c76d..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileContents.php +++ /dev/null @@ -1,160 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal\IssueFixingPlugin; - -use AssertionError; -use Microsoft\PhpParser; -use Microsoft\PhpParser\FilePositionMap; -use Microsoft\PhpParser\Parser; - -/** - * Represents file contents to be edited, - * and utilities for working with the contents in fixers. - * - * @deprecated - should not be used directly. Just use FileCacheEntry. - */ -class FileContents -{ - /** @var string the raw file contents */ - private $contents; - /** @var ?PhpParser\Node the raw node for the contents */ - private $ast; - /** @var ?array<int,array<int,PhpParser\Node>> the nodes at each line - computed lazily*/ - private $nodes_at_lines; - - /** @var ?FilePositionMap - computed lazily and shared by all fixers */ - private $file_position_map; - - /** @var ?array<int,int> positions of each line (1-based) (computed lazily) */ - private $line_offset_map = null; - - /** @var ?array<int,string> a 1-based array of lines */ - private $lines; - - /** - * Create a representation of the file contents. - * - * Other data structures are instantiated when they are first fetched. - * (different fixers would use different structures) - */ - public function __construct(string $contents) - { - $this->contents = $contents; - } - - /** - * Gets the raw file contents - */ - public function getContents() : string - { - return $this->contents; - } - - /** - * Gets the AST with all tokens (this assumes that the AST is valid) - */ - public function getAST() : PhpParser\Node - { - return $this->ast ?? ($this->ast = (new Parser())->parseSourceFile($this->contents)); - } - - /** - * Get the nodes which start at a specific line number - * @return array<int,PhpParser\Node> - */ - public function getNodesAtLine(int $line) : array - { - $line_node_map = $this->nodes_at_lines ?? ($this->nodes_at_lines = $this->computeNodesAtLineMap()); - return $line_node_map[$line] ?? []; - } - - /** - * Compute a map from lines to the nodes at the line. - * - * This is efficient if called multiple times, but less efficient(e.g. uses more memory) if only called once. - * @return array<int,array<int,PhpParser\Node>> - */ - public function computeNodesAtLineMap() : array - { - $result = []; - $file_position_map = new FilePositionMap($this->contents); - foreach ($this->getAST()->getDescendantNodes() as $node) { - $line_for_node = $file_position_map->getStartLine($node); - $result[$line_for_node][] = $node; - } - return $result; - } - - /** - * Fetches the shared file position map - * @suppress PhanUnreferencedPublicMethod - */ - public function getFilePositionMap() : FilePositionMap - { - return $this->file_position_map ?? ($this->file_position_map = new FilePositionMap($this->contents)); - } - - /** - * @return ?int the byte offset of the start of the given line (1-based) - * @suppress PhanUnreferencedPublicMethod - */ - public function getLineOffset(int $line) - { - if ($this->line_offset_map === null) { - $this->line_offset_map = self::computeLineOffsetMap($this->contents); - } - return $this->line_offset_map[$line] ?? null; - } - - /** - * Returns a mapping from the 1-based line number to the byte offset of the start of each line - * @internal - * @return array<int,int> - */ - public static function computeLineOffsetMap(string $contents) : array - { - // start of line 1 is the 0th byte - $offsets = [0, 0]; - $line = 2; - $offset = 0; - while (($next = \strpos($contents, "\n", $offset)) !== false) { - $offset = $next + 1; - $offsets[$line] = $offset; - $line++; - } - $offsets[$line] = \strlen($contents); - return $offsets; - } - - /** - * @return array<int,string> a 1-based array of lines - */ - public function getLines() : array - { - if (\is_array($this->lines)) { - return $this->lines; - } - $lines = \preg_split("/^/m", $this->contents); - // TODO: Use a better way to not include false when arguments are both valid - if (!\is_array($lines)) { - throw new AssertionError("Expected lines to be an array"); - } - unset($lines[0]); - $this->lines = $lines; - return $lines; - } - - - /** - * Helper method to get individual lines from a file. - * This is more efficient than using \SplFileObject if multiple lines may need to be fetched. - * - * @param int $lineno - A line number, starting with line 1 - * @return ?string - */ - public function getLine(int $lineno) - { - $lines = $this->getLines(); - return $lines[$lineno] ?? null; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileEdit.php b/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileEdit.php deleted file mode 100644 index db34b49..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileEdit.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal\IssueFixingPlugin; - -use InvalidArgumentException; - -/** - * Represents a change to be made to file contents. - * The structure of this will change. - */ -class FileEdit -{ - /** @var int the byte offset where the replacement will start */ - public $replace_start; - /** @var int the byte offset where the replacement will end. this is >= $replace_start */ - public $replace_end; - // TODO: Implement insertion - /** @var string the contents to replace the range with. Make this empty to delete. */ - public $new_text = ''; - - /** - * Create a new file edit (currently just supports deleting lines) - */ - public function __construct(int $replace_start, int $replace_end, string $new_text = '') - { - if ($replace_end < $replace_start) { - throw new InvalidArgumentException("Out of order: end $replace_end < start $replace_start"); - } - if ($replace_start < 0) { - throw new InvalidArgumentException("Out of range: start $replace_start < 0"); - } - $this->replace_start = $replace_start; - $this->replace_end = $replace_end; - $this->new_text = $new_text; - } - - /** - * Returns true if this has the same effect as $other - */ - public function isEqualTo(FileEdit $other) : bool - { - return $this->replace_start === $other->replace_start && - $this->replace_end === $other->replace_end && - $this->new_text === $other->new_text; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileEditSet.php b/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileEditSet.php deleted file mode 100644 index 5dcbe96..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/FileEditSet.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal\IssueFixingPlugin; - -/** - * Represents a set of changes to be made to file contents. - * The structure of this will change. - */ -class FileEditSet -{ - /** @var FileEdit[] */ - public $edits; - - /** - * @param FileEdit[] $edits - */ - public function __construct(array $edits) - { - $this->edits = $edits; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/IssueFixer.php b/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/IssueFixer.php deleted file mode 100644 index 4cdb94d..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/IssueFixingPlugin/IssueFixer.php +++ /dev/null @@ -1,354 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal\IssueFixingPlugin; - -use Closure; -use Microsoft\PhpParser; -use Microsoft\PhpParser\Node\NamespaceUseClause; -use Microsoft\PhpParser\Node\QualifiedName; -use Microsoft\PhpParser\Node\Statement\NamespaceUseDeclaration; -use Microsoft\PhpParser\TokenKind; -use Phan\AST\TolerantASTConverter\NodeUtils; -use Phan\CodeBase; -use Phan\Config; -use Phan\Issue; -use Phan\IssueInstance; -use Phan\Library\FileCache; -use Phan\Library\FileCacheEntry; -use Phan\Library\StringUtil; -use RuntimeException; - -/** - * Represents a set of changes to be made to file contents. - * The structure of this will change. - */ -class IssueFixer -{ - - private static function isMatchingNamespaceUseDeclaration( - string $file_contents, - NamespaceUseDeclaration $declaration, - IssueInstance $issue_instance - ) : bool { - $type = $issue_instance->getIssue()->getType(); - - switch ($type) { - case Issue::UnreferencedUseNormal: - $expected_token_kind = null; - break; - case Issue::UnreferencedUseFunction: - $expected_token_kind = TokenKind::FunctionKeyword; - break; - case Issue::UnreferencedUseConstant: - $expected_token_kind = TokenKind::ConstKeyword; - break; - default: - self::debug(\sprintf("Unexpected kind %s in %s\n", $type, __METHOD__)); - return false; - } - - $actual_token_kind = $declaration->functionOrConst->kind ?? null; - if ($expected_token_kind !== $actual_token_kind) { - self::debug(\sprintf("DEBUG: Unexpected type %s in %s\n", $actual_token_kind ?? 'null', __METHOD__)); - return false; - } - $list = $declaration->useClauses->children ?? []; - if (\count($list) !== 1) { - self::debug(\sprintf("DEBUG: Unexpected count %d in %s\n", \count($list), __METHOD__)); - return false; - } - $element = $list[0]; - // $dumper = new \Phan\AST\TolerantASTConverter\NodeDumper($file_contents); - // $dumper->setIncludeTokenKind(true); - // $dumper->dumpTree($element); - if (!($element instanceof NamespaceUseClause)) { - return false; - } - if ($element->openBrace || $element->groupClauses || $element->closeBrace) { - // Not supported - return false; - } - // $element->namespaceAliasingClause doesn't matter for the the subsequent checks - - $namespace_name = $element->namespaceName; - if (!($namespace_name instanceof QualifiedName)) { - return false; - } - $actual_use_name = (new NodeUtils($file_contents))->phpParserNameToString($namespace_name); - // Get the last argument from - // Possibly zero references to use statement for classlike/namespace {CLASSLIKE} ({CLASSLIKE}) - $expected_use_name = $issue_instance->getTemplateParameters()[1]; - - if (\strcasecmp(\ltrim((string)$expected_use_name, "\\"), \ltrim($actual_use_name, "\\")) !== 0) { - // Not the same fully qualified name. - return false; - } - // This is the same fully qualified name. - return true; - } - - /** - * @return ?FileEdit - */ - private static function maybeRemoveNamespaceUseDeclaration( - string $file_contents, - NamespaceUseDeclaration $declaration, - IssueInstance $issue_instance - ) { - if (!self::isMatchingNamespaceUseDeclaration($file_contents, $declaration, $issue_instance)) { - return null; - } - - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - $end = $declaration->getEndPosition(); - $end = self::skipTrailingWhitespaceAndNewlines($file_contents, $end); - // @phan-suppress-next-line PhanThrowTypeAbsentForCall - return new FileEdit($declaration->getStart(), $end); - } - - private static function skipTrailingWhitespaceAndNewlines(string $file_contents, int $end) : int - { - // Handles \r\n and \n, but doesn't bother handling \r - $next = \strpos($file_contents, "\n", $end); - if ($next === false) { - return $end; - } - $remaining = (string)\substr($file_contents, $end, $next - $end); - if (\trim($remaining) === '') { - return $next + 1; - } - return $end; - } - - /** - * @var array<string,callable(CodeBase,FileCacheEntry,IssueInstance):(?FileEditSet)> - */ - private static $fixer_closures = []; - - /** - * Registers a fixer that can be used to generate a fix for $issue_name - * - * @param callable(CodeBase,FileCacheEntry,IssueInstance):(?FileEditSet) $fixer - * this is neither a real type hint nor a real closure so that the implementation can optionally be moved to classes that aren't loaded by the PHP interpreter yet. - * @return void - */ - public static function registerFixerClosure(string $issue_name, $fixer) - { - self::$fixer_closures[$issue_name] = $fixer; - } - - /** - * @return array<string,callable(CodeBase,FileCacheEntry,IssueInstance):(?FileEditSet)> - */ - private static function createClosures() : array - { - /** - * @return ?FileEditSet - */ - $handle_unreferenced_use = static function ( - CodeBase $unused_code_base, - FileCacheEntry $file_contents, - IssueInstance $issue_instance - ) { - // 1-based line - $line = $issue_instance->getLine(); - $edits = []; - foreach ($file_contents->getNodesAtLine($line) as $candidate_node) { - self::debug(\sprintf("Handling %s for %s\n", \get_class($candidate_node), (string)$issue_instance)); - if ($candidate_node instanceof NamespaceUseDeclaration) { - $edit = self::maybeRemoveNamespaceUseDeclaration($file_contents->getContents(), $candidate_node, $issue_instance); - if ($edit) { - $edits[] = $edit; - } - break; - } - } - if ($edits) { - return new FileEditSet($edits); - } - return null; - }; - return \array_merge(self::$fixer_closures, [ - Issue::UnreferencedUseNormal => $handle_unreferenced_use, - Issue::UnreferencedUseConstant => $handle_unreferenced_use, - Issue::UnreferencedUseFunction => $handle_unreferenced_use, - ]); - } - - /** - * Apply fixes where possible for any issues in $instances. - * - * @param IssueInstance[] $instances - * @return void - */ - public static function applyFixes(CodeBase $code_base, array $instances) - { - $fixers_for_files = self::computeFixersForInstances($instances); - foreach ($fixers_for_files as $file => $fixers) { - self::attemptFixForIssues($code_base, (string)$file, $fixers); - } - } - - /** - * Given a list of issue instances, - * return arrays of Closures to fix fixable instances in their corresponding files. - * - * @param IssueInstance[] $instances - * @return array<string,array<int,Closure(CodeBase,FileCacheEntry):(?FileEditSet)>> - */ - public static function computeFixersForInstances(array $instances) - { - $closures = self::createClosures(); - $fixers_for_files = []; - foreach ($instances as $instance) { - $issue = $instance->getIssue(); - $type = $issue->getType(); - $closure = $closures[$type] ?? null; - // self::debug("Found closure for $type: " . \json_encode((bool)$closure) . "\n"); - if ($closure) { - /** - * @return ?FileEditSet - */ - $fixers_for_files[$instance->getFile()][] = static function ( - CodeBase $code_base, - FileCacheEntry $file_contents - ) use ( - $closure, - $instance -) { - self::debug("Calling for $instance\n"); - return $closure($code_base, $file_contents, $instance); - }; - } - } - return $fixers_for_files; - } - - /** - * @param string $file the file name, for debugging - * @param array<int,Closure(CodeBase,FileCacheEntry):(?FileEditSet)> $fixers one or more fixers. These return 0 edits if nothing works. - * @return ?string the new contents, if fixes could be applied - */ - public static function computeNewContentForFixers( - CodeBase $code_base, - string $file, - string $raw_contents, - array $fixers - ) { - // A tolerantparser ast node - - $contents = new FileCacheEntry($raw_contents); - - // $dumper = new \Phan\AST\TolerantASTConverter\NodeDumper($contents); - // $dumper->setIncludeTokenKind(true); - // $dumper->dumpTree($ast); - - $all_edits = []; - foreach ($fixers as $fix) { - $edit_set = $fix($code_base, $contents); - foreach ($edit_set->edits ?? [] as $edit) { - $all_edits[] = $edit; - } - } - if (!$all_edits) { - self::debug("Phan cannot create any automatic fixes for $file\n"); - return null; - } - return self::computeNewContents($file, $contents->getContents(), $all_edits); - } - - /** - * @param array<int,Closure(CodeBase,string,PhpParser\Node):(?FileEditSet)> $fixers one or more fixers. These return 0 edits if nothing works. - * @return void - */ - private static function attemptFixForIssues( - CodeBase $code_base, - string $file, - array $fixers - ) { - try { - $entry = FileCache::getOrReadEntry($file); - } catch (RuntimeException $e) { - self::error("Could not automatically fix $file: could not read contents: " . $e->getMessage() . "\n"); - return; - } - $contents = $entry->getContents(); - $new_contents = self::computeNewContentForFixers($code_base, $file, $contents, $fixers); - if ($new_contents === null) { - return; - } - // Sort file edits in order of start position - $absolute_path = Config::projectPath($file); - if (!\file_exists($absolute_path)) { - // This file should exist - always warn - self::error("Giving up on saving changes to $file: expected $absolute_path to exist already\n"); - return; - } - \file_put_contents($absolute_path, $new_contents); - } - - /** - * Compute the new contents for a file, given the original contents and a list of edits to apply to that file - * @param string $file the path to the file, for logging. - * @param string $contents the original contents of the file. This will be modified - * @param FileEdit[] $all_edits - * @return ?string - the new contents, if successful. - */ - public static function computeNewContents(string $file, string $contents, array $all_edits) - { - \usort($all_edits, static function (FileEdit $a, FileEdit $b) : int { - return ($a->replace_start <=> $b->replace_start) - ?: ($a->replace_end <=> $b->replace_end) - ?: \strcmp($a->new_text, $b->new_text); - }); - self::debug("Going to apply these fixes for $file: " . StringUtil::jsonEncode($all_edits) . "\n"); - $last_end = 0; - $last_replace_start = -1; - $new_contents = ''; - $prev_edit = null; - foreach ($all_edits as $edit) { - if ($prev_edit && $edit->isEqualTo($prev_edit)) { - continue; - } - $prev_edit = $edit; - if ($edit->replace_start < $last_end) { - self::debug("Giving up on $file: replacement starts before end of another replacement\n"); - return null; - } - if ($edit->new_text !== '') { - if ($edit->replace_start <= $last_replace_start) { - self::debug("Giving up on $file: replacement conflicts with another replacement at $last_replace_start\n"); - return null; - } - $last_replace_start = $edit->replace_start; - } - - $new_contents .= \substr($contents, $last_end, $edit->replace_start - $last_end); - // Append the empty string if this is a deletion, or a non-empty string for an insertion/replacement. - $new_contents .= $edit->new_text; - $last_end = $edit->replace_end; - } - $new_contents .= \substr($contents, $last_end); - return $new_contents; - } - - /** - * Log an error message to be shown to users for unexpected errors. - * @return void - */ - public static function error(string $message) - { - \fwrite(\STDERR, $message); - } - - /** - * Log an extremely verbose message - used for debugging why automatic fixing doesn't work. - * @return void - */ - public static function debug(string $message) - { - if (\getenv('PHAN_DEBUG_AUTOMATIC_FIX')) { - \fwrite(\STDERR, $message); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/MethodSearcherPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/MethodSearcherPlugin.php deleted file mode 100644 index 88ac459..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/MethodSearcherPlugin.php +++ /dev/null @@ -1,339 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use InvalidArgumentException; -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Method; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type; -use Phan\Language\Type\GenericArrayType; -use Phan\Language\Type\MixedType; -use Phan\Language\UnionType; -use Phan\PluginV2; -use Phan\PluginV2\BeforeAnalyzeCapability; -use TypeError; -use function count; - -/** - * This internal plugin implements tool/phoogle, to search for functions/methods with a similar signature to what you search for. - * - * NOTE: This is automatically loaded by phan. Do not include it in a config. - * - * @internal - */ -final class MethodSearcherPlugin extends PluginV2 implements - BeforeAnalyzeCapability -{ - /** @var array<int,UnionType> the param type we're looking for. */ - public static $param_types; - - /** @var UnionType the return type we're looking for. */ - public static $return_type; - - /** @var array<int,array{0:int, 1:string, 2:FunctionInterface}> */ - private $results; - - public function __construct() - { - } - - /** - * Sets the search string that will be used once this plugin is invoked - * - * @throws InvalidArgumentException - */ - public static function setSearchString(string $search_string) - { - // XXX improve parsing this - $parts = \array_map('trim', \explode('->', $search_string)); - $result = []; - if (count($parts) === 0) { - throw new InvalidArgumentException("Empty string passed in when searching for function/method signature"); - } - foreach ($parts as $i => $part) { - if ($part === '' && $i < count($parts) - 1) { - continue; - } - if ($part === '') { - $result[] = UnionType::empty(); - continue; - } - if (!\preg_match('(' . UnionType::union_type_regex . ')', $part)) { - throw new InvalidArgumentException("Invalid union type '$part'"); - } - $result[] = UnionType::fromStringInContext($part, new Context(), Type::FROM_PHPDOC); - } - // @phan-suppress-next-line PhanPossiblyFalseTypeMismatchProperty - self::$return_type = \array_pop($result); - self::$param_types = $result; - echo "Searching for function/method signatures similar to: " . \implode(' -> ', \array_merge(self::$param_types, [self::$return_type])) . "\n"; - } - - /** - * Given a UnionType that may have references to regular class-like types that don't exist (e.g. `\Type`, `\Type[]`), - * replace classes that don't exist (e.g. `\Type`) with ones that do exist in other namespaces (e.g. `\Phan\Language\Type`) - */ - public static function addMissingNamespaces(CodeBase $code_base, UnionType $union_type) : UnionType - { - foreach ($union_type->getTypeSet() as $type) { - if ($type->isObjectWithKnownFQSEN()) { - $replacements = self::getReplacementTypesForFullyQualifiedClassName($code_base, $type); - if ($replacements === [$type]) { - continue; - } - $union_type = $union_type->withoutType($type)->withUnionType(UnionType::of($replacements)); - } elseif ($type instanceof GenericArrayType) { - $element_type = $type->genericArrayElementType(); - $replacement_element_types = self::addMissingNamespaces($code_base, $element_type->asUnionType()); - if ($replacement_element_types->isType($element_type)) { - continue; - } - $union_type = $union_type->withoutType($type); - foreach ($replacement_element_types->getTypeSet() as $element_type) { - $replacement_type = GenericArrayType::fromElementType( - $element_type, - $type->getIsNullable(), - $type->getKeyType() - ); - $union_type = $union_type->withType($replacement_type); - } - } - // TODO: Could also do this for generic arrays, etc. - } - return $union_type; - } - - /** - * @return Type[] a list of types to replace $type with - */ - public static function getReplacementTypesForFullyQualifiedClassName( - CodeBase $code_base, - Type $type - ) { - $fqsen = FullyQualifiedClassName::fromType($type); - if ($code_base->hasClassWithFQSEN($fqsen)) { - return [$type]; - } - $fqsens = $code_base->suggestSimilarClassInOtherNamespace($fqsen, new Context()); - if (!$fqsens) { - \fwrite(\STDERR, "Phoogle could not find '$fqsen' in any namespace\n"); - exit(\EXIT_FAILURE); - } - return \array_map(static function (FullyQualifiedClassName $fqsen) use ($type) : Type { - return $fqsen->asType()->withIsNullable($type->getIsNullable()); - }, $fqsens); - } - - private static function addMissingNamespacesToTypes(CodeBase $code_base) - { - $original_param_types = self::$param_types; - $original_return_type = self::$return_type; - foreach (self::$param_types as $i => $type) { - self::$param_types[$i] = self::addMissingNamespaces($code_base, $type); - } - self::$return_type = self::addMissingNamespaces($code_base, self::$return_type); - - if ($original_return_type !== self::$return_type || $original_param_types !== self::$param_types) { - echo "Phoogle is searching for " . \implode(' -> ', \array_merge(self::$param_types, [self::$return_type])) . " instead (some classes had missing namespaces)\n"; - } - } - - /** - * @param CodeBase $code_base - */ - public function beforeAnalyze(CodeBase $code_base) - { - self::addMissingNamespacesToTypes($code_base); - - $code_base->eagerlyLoadAllSignatures(); - foreach ($code_base->getFunctionMap() as $function) { - if ($function->isClosure()) { - continue; - } - if ($function->getFQSEN()->isAlternate()) { - continue; - } - $this->checkFunction($code_base, $function); - } - foreach ($code_base->getMethodSet() as $function) { - $this->checkFunction($code_base, $function); - } - $results = $this->results; - \sort($results); - $num_results = count($results); - // TODO: Make this configurable - $limit = 10; - echo "Phoogle found $num_results result(s)\n"; - if ($limit < count($results)) { - echo "(Showing $limit of $num_results results)\n"; - } - foreach ($results as $i => list($unused_score, $fqsen, $function)) { - echo "$fqsen\n"; - if ($function instanceof Method) { - $return_type = $function->getUnionTypeWithUnmodifiedStatic(); - } else { - $return_type = $function->getUnionType(); - } - \printf( - " (%s)%s\n", - \implode(', ', $function->getParameterList()), - $return_type->isEmpty() ? '' : (' : ' . $return_type) - ); - if ($i >= $limit) { - break; - } - } - exit(\EXIT_SUCCESS); - } - - private function checkFunction(CodeBase $code_base, FunctionInterface $function) - { - $result = $this->functionMatchesSignature($code_base, $function); - if ($result) { - $this->results[] = [-$result, (string)$function->getFQSEN(), $function]; - } - } - - /** - * @return float - This returns larger values for better matches - */ - public function functionMatchesSignature( - CodeBase $code_base, - FunctionInterface $function - ) : float { - // TODO: Account for visibility - if ($function instanceof Method) { - if ($function->getFQSEN() !== $function->getDefiningFQSEN()) { - // Don't check inherited methods - return 0; - } - if (!$function->isPublic()) { - return 0; - } - } - // TODO: Set strict type casting rules here? - if ($function instanceof Method && \in_array(\strtolower($function->getName()), ['__construct', '__clone'], true)) { - $return_type = $function->getFQSEN()->getFullyQualifiedClassName()->asType()->asUnionType(); - } else { - $return_type = $function->getUnionType(); - } - if ($return_type->isEmpty()) { - $return_type = $this->guessUnionType($function); - } - if (!$return_type->asExpandedTypes($code_base)->canCastToUnionType(self::$return_type)) { - return 0; - } - $signature_param_types = []; - $adjustment = 0; - foreach ($function->getParameterList() as $param) { - if ($param->isPassByReference()) { - // penalize functions with references from search results. - $adjustment -= 0.5; - } - $signature_param_types[] = $param->getUnionType(); - } - if ($function instanceof Method) { - $signature_param_types[] = $function->getFQSEN()->getFullyQualifiedClassName()->asType()->asUnionType(); - } - if (count($signature_param_types) < count(self::$param_types)) { - return 0; - } - $result = $this->matchesParamTypes($code_base, self::$param_types, $signature_param_types); - if (!$result) { - return 0; - } - return \max(0.1, $result + $adjustment + self::getTypeMatchingBonus($code_base, $return_type, self::$return_type)); - } - - private static function guessUnionType(FunctionInterface $function) : UnionType - { - if ($function instanceof Method) { - // TODO: convert __sleep to string[], etc. - if ($function->getIsMagicAndVoid()) { - return UnionType::fromFullyQualifiedString('void'); - } - if (!$function->isAbstract() && !$function->isPHPInternal() && !$function->getHasReturn()) { - return UnionType::fromFullyQualifiedString('void'); - } - } else { - if (!$function->isPHPInternal() && !$function->getHasReturn()) { - return UnionType::fromFullyQualifiedString('void'); - } - } - return UnionType::empty(); - } - - private static function isMixed(UnionType $union_type) : bool - { - foreach ($union_type->getTypeSet() as $type) { - if (!$type instanceof MixedType) { - return false; - } - } - return true; - } - /** - * Get the bonus for using $actual_signature_type where we are looking for $desired_type - */ - public static function getTypeMatchingBonus(CodeBase $code_base, UnionType $actual_signature_type, UnionType $desired_type) : float - { - if (self::isMixed($desired_type) || self::isMixed($actual_signature_type)) { - return 0; - } - $expanded_actual_signature_type = $actual_signature_type->asExpandedTypes($code_base); - $result = 0; - // TODO: This should handle Liskov Substitution Principle - foreach ($desired_type->getTypeSet() as $inner_type) { - if ($expanded_actual_signature_type->hasType($inner_type)) { - if ($inner_type->isObjectWithKnownFQSEN()) { - $result += 5; - } else { - if ($inner_type->isScalar() && !$actual_signature_type->canCastToUnionType($inner_type->asUnionType())) { - $result += 0.5; - continue; - } - $result += 1; - } - } elseif ($expanded_actual_signature_type->canCastToUnionType($inner_type->asUnionType())) { - $result += 0.5; - } - } - return $result / \max($desired_type->typeCount(), $actual_signature_type->typeCount()); - } - - /** - * Check if param_types contains unique types that can cast to search_param_types - * @param array<int,UnionType> $search_param_types - * @param array<int,UnionType> $signature_param_types - */ - public static function matchesParamTypes(CodeBase $code_base, array $search_param_types, array $signature_param_types) : float - { - if (\count($search_param_types) === 0) { - // Award extra points for having the same number of matches - return \max(1, 5 - count($signature_param_types)) / 2; - } - $best = 0; - $desired_param_type = \array_pop($search_param_types); - if (!($desired_param_type instanceof UnionType)) { - // Phan can't tell this array is non-empty - throw new TypeError("Expected signature_param_types to be an array of UnionType"); - } - foreach ($signature_param_types as $i => $actual_type) { - if ($actual_type->asExpandedTypes($code_base)->canCastToUnionType($desired_param_type)) { - $signature_subset = $signature_param_types; - unset($signature_subset[$i]); - $result = self::matchesParamTypes($code_base, $search_param_types, $signature_subset); - if ($result > 0) { - $best = \max($best, $result + self::getTypeMatchingBonus($code_base, $actual_type, $desired_param_type)); - } - } - } - if ($best == 0) { - return 0; - } - return $best + 1 / (count($search_param_types) + 1); - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/MethodSearcherPluginLoader.php b/vendor/phan/phan/src/Phan/Plugin/Internal/MethodSearcherPluginLoader.php deleted file mode 100644 index f89687b..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/MethodSearcherPluginLoader.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -return new MethodSearcherPlugin(); diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/MiscParamPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/MiscParamPlugin.php deleted file mode 100644 index 1407e94..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/MiscParamPlugin.php +++ /dev/null @@ -1,806 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use ast; -use ast\Node; -use Closure; -use Phan\Analysis\AssignmentVisitor; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\CodeBase; -use Phan\Exception\FQSENException; -use Phan\Exception\IssueException; -use Phan\Exception\NodeException; -use Phan\Issue; -use Phan\IssueInstance; -use Phan\Language\Context; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Element\Variable; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\Type\ArrayShapeType; -use Phan\Language\Type\ArrayType; -use Phan\Language\Type\CallableType; -use Phan\Language\Type\FalseType; -use Phan\Language\Type\GenericArrayType; -use Phan\Language\Type\StringType; -use Phan\Language\UnionType; -use Phan\Parse\ParseVisitor; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeFunctionCallCapability; -use Phan\PluginV2\StopParamAnalysisException; -use function count; - -/** - * NOTE: This is automatically loaded by phan. Do not include it in a config. - * - * TODO: Analyze returning callables (function() : callable) for any callables that are returned as literals? - * This would be difficult. - */ -final class MiscParamPlugin extends PluginV2 implements - AnalyzeFunctionCallCapability -{ - /** - * @return array<string,Closure> - * @phan-return array<string,Closure(CodeBase,Context,FunctionInterface,array):void> - */ - private static function getAnalyzeFunctionCallClosuresStatic() : array - { - $stop_exception = new StopParamAnalysisException(); - - /** - * @param array<int,Node|int|float|string> $args - * @return void - */ - $min_max_callback = static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $function, - array $args - ) { - if (\count($args) !== 1) { - return; - } - self::analyzeNodeUnionTypeCast( - $args[0], - $context, - $code_base, - ArrayType::instance(false)->asUnionType(), - static function (UnionType $node_type) use ($context, $function) : IssueInstance { - // "arg#1(values) is %s but {$function->getFQSEN()}() takes array when passed only one arg" - return Issue::fromType(Issue::ParamSpecial2)( - $context->getFile(), - $context->getLineNumberStart(), - [ - 1, - 'values', - (string)$node_type, - $function->getRepresentationForIssue(), - 'array' - ] - ); - } - ); - }; - /** - * @param array<int,Node|int|float|string> $args - * @return void - */ - $array_udiff_callback = static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $function, - array $args - ) { - $argcount = \count($args); - if ($argcount < 3) { - return; - } - self::analyzeNodeUnionTypeCast( - $args[$argcount - 1], - $context, - $code_base, - CallableType::instance(false)->asUnionType(), - static function (UnionType $unused_node_type) use ($context, $function) : IssueInstance { - // "The last argument to {$function->getFQSEN()} must be a callable" - return Issue::fromType(Issue::ParamSpecial3)( - $context->getFile(), - $context->getLineNumberStart(), - [ - $function->getRepresentationForIssue(), - 'callable' - ] - ); - } - ); - - for ($i = 0; $i < ($argcount - 1); $i++) { - self::analyzeNodeUnionTypeCast( - $args[$i], - $context, - $code_base, - ArrayType::instance(false)->asUnionType(), - static function (UnionType $node_type) use ($context, $function, $i) : IssueInstance { - // "arg#".($i+1)." is %s but {$function->getFQSEN()}() takes array" - return Issue::fromType(Issue::ParamTypeMismatch)( - $context->getFile(), - $context->getLineNumberStart(), - [ - ($i + 1), - (string)$node_type, - $function->getRepresentationForIssue(), - 'array' - ] - ); - } - ); - } - }; - - /** - * @param array<int,Node|int|float|string> $args - * @return void - * @throws StopParamAnalysisException - * to prevent Phan's default incorrect analysis of a call to join() - */ - $join_callback = static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $function, - array $args - ) use ($stop_exception) { - $argcount = \count($args); - // (string glue, string[] pieces), - // (string[] pieces, string glue) or - // (string[] pieces) - if ($argcount == 1) { - self::analyzeNodeUnionTypeCastStringArrayLike( - $args[0], - $context, - $code_base, - static function (UnionType $node_type) use ($context, $function) : IssueInstance { - // "arg#1(pieces) is %s but {$function->getFQSEN()}() takes array when passed only 1 arg" - return Issue::fromType(Issue::ParamSpecial2)( - $context->getFile(), - $context->getLineNumberStart(), - [ - 1, - 'pieces', - $node_type->asNonLiteralType(), - $function->getRepresentationForIssue(), - 'string[]' - ] - ); - } - ); - throw $stop_exception; - } elseif ($argcount == 2) { - $arg1_type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $args[0] - ); - - $arg2_type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $args[1] - ); - - // TODO: better array checks - if ($arg1_type->isExclusivelyArray()) { - if (!$arg2_type->canCastToUnionType( - StringType::instance(false)->asUnionType() - )) { - Issue::maybeEmit( - $code_base, - $context, - Issue::ParamSpecial1, - $context->getLineNumberStart(), - 2, - 'glue', - (string)$arg2_type->asNonLiteralType(), - $function->getRepresentationForIssue(), - 'string', - 1, - 'array' - ); - } - if (!self::canCastToStringArrayLike($code_base, $context, $arg1_type)) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeMismatchArgumentInternal, - $context->getLineNumberStart(), - 1, - 'pieces', - $arg1_type, - $function->getRepresentationForIssue(), - 'string[]' - ); - } - throw $stop_exception; - } elseif ($arg1_type->isNonNullStringType()) { - if (!$arg2_type->canCastToUnionType( - ArrayType::instance(false)->asUnionType() - )) { - Issue::maybeEmit( - $code_base, - $context, - Issue::ParamSpecial1, - $context->getLineNumberStart(), - 2, - 'pieces', - (string)$arg2_type->asNonLiteralType(), - $function->getRepresentationForIssue(), - 'string[]', - 1, - 'string' - ); - } elseif (!self::canCastToStringArrayLike($code_base, $context, $arg2_type)) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeMismatchArgumentInternal, - $context->getLineNumberStart(), - 2, - 'pieces', - $arg2_type, - $function->getRepresentationForIssue(), - 'string[]' - ); - } - throw $stop_exception; - } - } - }; - /** - * @param array<int,Node|int|float|string> $args - * @return void - */ - $array_uintersect_uassoc_callback = static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $function, - array $args - ) { - $argcount = \count($args); - if ($argcount < 4) { - return; - } - - // The last 2 arguments must be a callable and there - // can be a variable number of arrays before it - self::analyzeNodeUnionTypeCast( - $args[$argcount - 1], - $context, - $code_base, - CallableType::instance(false)->asUnionType(), - static function (UnionType $unused_node_type) use ($context, $function) : IssueInstance { - // "The last argument to {$function->getFQSEN()} must be a callable" - return Issue::fromType(Issue::ParamSpecial3)( - $context->getFile(), - $context->getLineNumberStart(), - [ - $function->getRepresentationForIssue(), - 'callable' - ] - ); - } - ); - - self::analyzeNodeUnionTypeCast( - $args[$argcount - 2], - $context, - $code_base, - CallableType::instance(false)->asUnionType(), - static function (UnionType $unused_node_type) use ($context, $function) : IssueInstance { - // "The second last argument to {$function->getFQSEN()} must be a callable" - return Issue::fromType(Issue::ParamSpecial4)( - $context->getFile(), - $context->getLineNumberStart(), - [ - $function->getRepresentationForIssue(), - 'callable' - ] - ); - } - ); - - for ($i = 0; $i < ($argcount - 2); $i++) { - self::analyzeNodeUnionTypeCast( - $args[$i], - $context, - $code_base, - ArrayType::instance(false)->asUnionType(), - static function (UnionType $node_type) use ($context, $function, $i) : IssueInstance { - // "arg#".($i+1)." is %s but {$function->getFQSEN()}() takes array" - return Issue::fromType(Issue::ParamTypeMismatch)( - $context->getFile(), - $context->getLineNumberStart(), - [ - ($i + 1), - (string)$node_type, - $function->getRepresentationForIssue(), - 'array' - ] - ); - } - ); - } - }; - - /** - * @param Node|int|string|float|null $node - * @return ?Variable the variable - */ - $get_variable = static function ( - CodeBase $code_base, - Context $context, - $node - ) { - if (!$node instanceof Node) { - return null; - } - try { - return (new ContextNode( - $code_base, - $context, - $node - ))->getVariableStrict(); - } catch (IssueException $exception) { - Issue::maybeEmitInstance( - $code_base, - $context, - $exception->getIssueInstance() - ); - return null; - } catch (NodeException $_) { - return null; - } - }; - - /** - * @param array<int,Node|int|float|string> $args - * @return void - */ - $array_add_callback = static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $unused_function, - array $args - ) { - // TODO: support nested adds, like AssignmentVisitor - // TODO: support properties, like AssignmentVisitor - if (count($args) < 2) { - return; - } - $modified_array_node = $args[0]; - if (!($modified_array_node instanceof Node)) { - return; - } - $lineno = $modified_array_node->lineno; - $dim_node = new ast\Node( - ast\AST_DIM, - $lineno, - ['expr' => $modified_array_node, 'dim' => null], - 0 - ); - $new_context = $context; - for ($i = 1; $i < \count($args); $i++) { - // TODO: check for variadic here and in other plugins - // E.g. unfold_args(args) - $expr_node = $args[$i]; - $right_inner_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $expr_node); - $right_type = $right_inner_type->asGenericArrayTypes(GenericArrayType::KEY_INT); - - $new_context = (new AssignmentVisitor( - $code_base, - $new_context, - $dim_node, - $right_type, - 1 - ))->__invoke($modified_array_node); - } - // Hackish: copy properties from this - $context->setScope($new_context->getScope()); - }; - - /** - * @param array<int,Node|int|float|string> $args - * @return void - */ - $array_remove_single_callback = static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $unused_function, - array $args - ) use ($get_variable) { - // TODO: support nested adds, like AssignmentVisitor - // TODO: Could be more specific for arrays with known length and order - if (count($args) < 1) { - return; - } - $variable = $get_variable($code_base, $context, $args[0]); - if (!$variable) { - return; - } - $variable->setUnionType($variable->getUnionType()->withFlattenedArrayShapeOrLiteralTypeInstances()); - }; - - /** - * @param array<int,Node|int|float|string> $args - */ - $array_splice_callback = static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $unused_function, - array $args - ) use ($get_variable) { - // TODO: support nested adds, like AssignmentVisitor - // TODO: Could be more specific for arrays with known length and order - if (count($args) < 4) { - return; - } - $variable = $get_variable($code_base, $context, $args[0]); - if (!$variable) { - return; - } - - // TODO: Support array_splice('x', $offset, $length, $notAnArray) - // TODO: handle empty array - $added_types = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[3])->genericArrayTypes(); - $added_types = $added_types->withFlattenedArrayShapeOrLiteralTypeInstances(); - - $old_types = $variable->getUnionType()->withFlattenedArrayShapeOrLiteralTypeInstances(); - - $variable->setUnionType($old_types->withUnionType($added_types)); - }; - - /** - * @param array<int,Node|int|float|string> $args - */ - $extract_callback = static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $unused_function, - array $args - ) { - // TODO: support nested adds, like AssignmentVisitor - // TODO: Could be more specific for arrays with known length and order - if (count($args) < 1) { - return; - } - $union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[0]); - $array_shape_types = []; - foreach ($union_type->getTypeSet() as $type) { - if ($type instanceof ArrayShapeType) { - $array_shape_types[] = $type; - } - } - if (count($array_shape_types) === 0) { - return; - } - // TODO: Could be more nuanced and account for possibly undefined types in the combination. - - // TODO: Handle unexpected types of flags and prefix and warn, low priority - if (isset($args[1])) { - $flags = (new ContextNode($code_base, $context, $args[1]))->getEquivalentPHPScalarValue(); - if (!\is_int($flags)) { - // Could warn here, low priority - $flags = null; - } - } else { - $flags = null; - } - - $prefix = isset($args[2]) ? (new ContextNode($code_base, $context, $args[2]))->getEquivalentPHPScalarValue() : null; - - $shape = ArrayShapeType::union($array_shape_types); - if (!\is_scalar($prefix)) { - $prefix = ''; - } - $prefix = (string)$prefix; - $scope = $context->getScope(); - - foreach ($shape->getFieldTypes() as $field_name => $field_type) { - if (!\is_string($field_name)) { - continue; - } - $add_variable = static function (string $name) use ($context, $field_type, $scope) { - if (!Variable::isValidIdentifier($name)) { - return; - } - if (Variable::isSuperglobalVariableWithName($name)) { - return; - } - $scope->addVariable(new Variable( - $context, - $name, - $field_type, - 0 - )); - }; - // TODO: Ignore superglobals - - // Some parts of this are probably wrong - EXTR_OVERWRITE and EXTR_SKIP are probably the most common? - switch ($flags & ~\EXTR_REFS) { - default: - case \EXTR_OVERWRITE: - $add_variable($field_name); - break; - case \EXTR_SKIP: - if ($scope->hasVariableWithName($field_name)) { - break; - } - $add_variable($field_name); - break; - // TODO: Do all of these behave like EXTR_OVERWRITE or like EXTR_SKIP? - case \EXTR_PREFIX_SAME: - if ($scope->hasVariableWithName($field_name)) { - $field_name = $prefix . $field_name; - } - $add_variable($field_name); - break; - case \EXTR_PREFIX_ALL: - $field_name = $prefix . $field_name; - $add_variable($field_name); - break; - case \EXTR_PREFIX_INVALID: - if (!Variable::isValidIdentifier($field_name)) { - $field_name = $prefix . $field_name; - } - $add_variable($field_name); - break; - case \EXTR_IF_EXISTS: - if ($scope->hasVariableWithName($field_name)) { - $add_variable($field_name); - } - break; - case \EXTR_PREFIX_IF_EXISTS: - if ($scope->hasVariableWithName($field_name) && $prefix !== '') { - $add_variable($prefix . $field_name); - } - break; - } - } - }; - - /** - * Most of the work was already done in ParseVisitor - * @param array<int,Node|int|float|string> $args - * @see \Phan\Parse\ParseVisitor::analyzeDefine() - */ - $define_callback = static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $unused_function, - array $args - ) { - if (count($args) < 2) { - return; - } - $name = $args[0]; - $value = $args[1]; - if (isset($args[2])) { - $case_sensitive_arg_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $args[2]); - if (!$case_sensitive_arg_type->isType(FalseType::instance(false))) { - Issue::maybeEmit( - $code_base, - $context, - Issue::DeprecatedCaseInsensitiveDefine, - $args[2]->lineno ?? $context->getLineNumberStart() - ); - } - } - if (\is_scalar($name) && (\is_scalar($value) || $value->kind === \ast\AST_CONST)) { - // We already parsed this in ParseVisitor - return; - } - if ($name instanceof Node) { - try { - $name_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $name, false); - } catch (IssueException $_) { - // If this is really an issue, we'll emit it in the analysis phase when we have all of the element definitions. - return; - } - $name = $name_type->asSingleScalarValueOrNull(); - } - - if (!\is_string($name)) { - return; - } - ParseVisitor::addConstant( - $code_base, - $context, - $context->getLineNumberStart(), - $name, - $args[1], - 0, - '', - false, - true - ); - }; - - /** - * @param array<int,Node|int|float|string> $args - */ - $class_alias_callback = static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $unused_function, - array $args - ) { - if (count($args) < 2) { - return; - } - - $class_alias_first_param = $args[0]; - - if ($class_alias_first_param instanceof Node) { - try { - $name_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $class_alias_first_param, false); - } catch (IssueException $_) { - return; - } - - $class_alias_first_param = $name_type->asSingleScalarValueOrNull(); - } - - if (\is_string($class_alias_first_param)) { - try { - $first_param_fqsen = FullyQualifiedClassName::fromFullyQualifiedString($class_alias_first_param); - if ($code_base->hasClassWithFQSEN($first_param_fqsen)) { - $class = $code_base->getClassByFQSEN($first_param_fqsen); - if ($class->isPHPInternal()) { - Issue::maybeEmit( - $code_base, - $context, - Issue::ParamMustBeUserDefinedClassname, - $args[0]->lineno ?? $context->getLineNumberStart(), - $class->getName() - ); - } - } - } catch (FQSENException $_) { - Issue::maybeEmit( - $code_base, - $context, - Issue::TypeComparisonToInvalidClass, - $context->getLineNumberStart(), - $class_alias_first_param - ); - } - } - }; - - return [ - 'array_udiff' => $array_udiff_callback, - 'array_diff_uassoc' => $array_udiff_callback, - 'array_uintersect_assoc' => $array_udiff_callback, - 'array_intersect_ukey' => $array_udiff_callback, - - 'array_uintersect_uassoc' => $array_uintersect_uassoc_callback, - - 'array_push' => $array_add_callback, - 'array_pop' => $array_remove_single_callback, - 'array_shift' => $array_remove_single_callback, - 'array_unshift' => $array_add_callback, - - 'array_splice' => $array_splice_callback, // TODO: If this callback ever does anything other than flatten, then create a different callback - - 'extract' => $extract_callback, - - 'join' => $join_callback, - 'implode' => $join_callback, - - 'min' => $min_max_callback, - 'max' => $min_max_callback, - - 'define' => $define_callback, - - 'class_alias' => $class_alias_callback - // TODO: sort and usort should convert array<string,T> to array<int,T> (same for array shapes) - ]; - } - - /** - * @param Codebase $code_base @phan-unused-param - * @return array<string,Closure> - * @phan-return array<string,Closure(CodeBase,Context,FunctionInterface,array):void> - */ - public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array - { - // Unit tests invoke this repeatedly. Cache it. - static $analyzers = null; - if ($analyzers === null) { - $analyzers = self::getAnalyzeFunctionCallClosuresStatic(); - } - return $analyzers; - } - - /** - * @param Node|int|string|float|null $node - * @param Closure(UnionType):IssueInstance $issue_instance - */ - private static function analyzeNodeUnionTypeCast( - $node, - Context $context, - CodeBase $code_base, - UnionType $cast_type, - Closure $issue_instance - ) : bool { - - // Get the type of the node - $node_type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node, - true - ); - - // See if it can be cast to the given type - $can_cast = $node_type->canCastToUnionType( - $cast_type - ); - - // If it can't, emit the log message - if (!$can_cast) { - Issue::maybeEmitInstance( - $code_base, - $context, - $issue_instance($node_type) - ); - } - - return $can_cast; - } - - /** - * @param Node|int|string|float|null $node - * @param Closure(UnionType):IssueInstance $issue_instance - */ - private static function analyzeNodeUnionTypeCastStringArrayLike( - $node, - Context $context, - CodeBase $code_base, - Closure $issue_instance - ) : bool { - - // Get the type of the node - $node_type = UnionTypeVisitor::unionTypeFromNode( - $code_base, - $context, - $node, - true - ); - - // See if it can be cast to the given type - if (self::canCastToStringArrayLike($code_base, $context, $node_type)) { - return true; - } - - // If it can't, emit the log message - Issue::maybeEmitInstance( - $code_base, - $context, - $issue_instance($node_type) - ); - - return false; - } - - /** - * Sadly, MyStringable[] is frequently used, so we need this check. - */ - private static function canCastToStringArrayLike(CodeBase $code_base, Context $context, UnionType $union_type) : bool - { - if ($union_type->canCastToUnionType( - UnionType::fromFullyQualifiedString('string[]|int[]') - )) { - return true; - } - return $union_type->genericArrayElementTypes()->hasClassWithToStringMethod($code_base, $context); - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/NodeSelectionPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/NodeSelectionPlugin.php deleted file mode 100644 index a148279..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/NodeSelectionPlugin.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use ast\Node; -use Closure; -use Phan\Language\Context; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * This plugin checks for the definition of a region selected by a user. - */ -class NodeSelectionPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - /** - * @param ?Closure(Context,Node,array<int,Node>):void $closure - * @return void - * TODO: Fix false positive TypeMismatchDeclaredParam with Closure $closure = null in this method - */ - public function setNodeSelectorClosure($closure) - { - NodeSelectionVisitor::$closure = $closure; - } - - /** - * @return string - name of PluginAwarePostAnalysisVisitor subclass - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return NodeSelectionVisitor::class; - } -} - -/** - * When __invoke on this class is called with a node, a method - * will be dispatched based on the `kind` of the given node. - * - * Visitors such as this are useful for defining lots of different - * checks on a node based on its kind. - */ -class NodeSelectionVisitor extends PluginAwarePostAnalysisVisitor -{ - /** @var ?Closure(Context,Node,Node[]):void $closure */ - public static $closure = null; - - // A plugin's visitors should not override visit() unless they need to. - - /** - * This is the catch-all for Nodes with kinds that don't have specialized methods - * @param Node $node - * A node to check - * - * @param array<int,Node> $parent_node_list - * - * @return void - * @see ConfigPluginSet::prepareNodeSelectionPlugin() for how this is called - */ - public function visitCommonImplementation(Node $node, array $parent_node_list) - { - if (!\property_exists($node, 'isSelected')) { - return; - } - $closure = NodeSelectionVisitor::$closure; - if (!$closure) { - // This should not be possible. - // fwrite(STDERR, "Calling NodeSelectionVisitor without a closure\n"); - return; - } - $closure($this->context, $node, $parent_node_list); - } -} - -// Every plugin needs to return an instance of itself at the -// end of the file in which it's defined. -return new NodeSelectionPlugin(); diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/RequireExistsPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/RequireExistsPlugin.php deleted file mode 100644 index d5ebb33..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/RequireExistsPlugin.php +++ /dev/null @@ -1,141 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use ast; -use ast\flags; -use ast\Node; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\Config; -use Phan\Issue; -use Phan\Language\Type\StringType; -use Phan\Library\Paths; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -use function file_exists; -use function is_file; - -/** - * Analyzes require/include/require_once/include_once statements to check if the file exists - */ -class RequireExistsPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return RequireExistsVisitor::class; - } -} - -/** - * Visits require/include/require_once/include_once statements to check if the file exists - */ -class RequireExistsVisitor extends PluginAwarePostAnalysisVisitor -{ - /** - * @return void - * @override - */ - public function visitIncludeOrEval(Node $node) - { - if ($node->flags === ast\flags\EXEC_EVAL) { - $this->analyzeEval($node); - return; - } - $expr = $node->children['expr']; - if ($expr instanceof Node) { - $path = (new ContextNode($this->code_base, $this->context, $expr))->getEquivalentPHPScalarValue(); - } else { - $path = $expr; - } - - if (!\is_string($path)) { - $type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $expr); - if (!$type->canCastToUnionType(StringType::instance(false)->asUnionType())) { - $this->emitIssue( - Issue::TypeInvalidRequire, - $expr->lineno ?? $node->lineno, - $type - ); - } - return; - } - $this->checkPathExistsInContext($node, $path); - } - - private function analyzeEval(Node $node) - { - $expr = $node->children['expr']; - $type = UnionTypeVisitor::unionTypeFromNode($this->code_base, $this->context, $expr); - if (!$type->canCastToUnionType(StringType::instance(false)->asUnionType())) { - $this->emitIssue( - Issue::TypeInvalidEval, - $expr->lineno ?? $node->lineno, - $type - ); - } - } - - /** - * Check if the path provided to include()/require_once()/etc is valid. - */ - private function checkPathExistsInContext(Node $node, string $relative_path) - { - $absolute_path = $this->getAbsolutePath($node, $relative_path); - if (!file_exists($absolute_path)) { - $this->emitIssue( - Issue::MissingRequireFile, - $node->children['expr']->lineno ?? $node->lineno, - Paths::escapePathForIssue($relative_path) - ); - return; - } - if (!is_file($absolute_path)) { - $this->emitIssue( - Issue::InvalidRequireFile, - $node->children['expr']->lineno ?? $node->lineno, - Paths::escapePathForIssue($relative_path) - ); - return; - } - } - - const EXEC_NODE_FLAG_NAMES = [ - flags\EXEC_EVAL => 'eval', - flags\EXEC_INCLUDE => 'include', - flags\EXEC_INCLUDE_ONCE => 'include_once', - flags\EXEC_REQUIRE => 'require', - flags\EXEC_REQUIRE_ONCE => 'require_once', - ]; - - private function getAbsolutePath(Node $node, string $relative_path) : string - { - if (Paths::isAbsolutePath($relative_path)) { - return $relative_path; - } - - if (Config::getValue('warn_about_relative_include_statement')) { - $this->emitIssue( - Issue::RelativePathUsed, - $node->children['exec']->lineno ?? $node->lineno, - self::EXEC_NODE_FLAG_NAMES[$node->flags] ?? 'unknown', - Paths::escapePathForIssue($relative_path) - ); - } - - $first_absolute_path = '(unknown)'; - foreach (Config::getValue('include_paths') ?: ['.'] as $include_path) { - if (!Paths::isAbsolutePath($include_path)) { - $include_path = Paths::toAbsolutePath(\dirname(Config::projectPath($this->context->getFile())), $include_path); - } - $absolute_path = Paths::toAbsolutePath($include_path, $relative_path); - if (file_exists($absolute_path)) { - return $absolute_path; - } - $first_absolute_path = $first_absolute_path ?? $absolute_path; - } - return $first_absolute_path; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/StringFunctionPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/StringFunctionPlugin.php deleted file mode 100644 index c16c302..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/StringFunctionPlugin.php +++ /dev/null @@ -1,212 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use ast; -use ast\Node; -use Closure; -use Phan\CodeBase; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\FunctionInterface; -use Phan\PluginV2; -use Phan\PluginV2\AnalyzeFunctionCallCapability; - -/** - * NOTE: This is automatically loaded by phan. Do not include it in a config. - * - * This internal plugin will warn if calls to internal string functions - * or regex function appear to have arguments in the wrong order, - * - * e.g. explode($var, ':') or strpos(':', $x) - */ -final class StringFunctionPlugin extends PluginV2 implements - AnalyzeFunctionCallCapability -{ - /** - * @param Node|string|float|int|null $arg - * @return bool true if the expression is simple to look up. - */ - private static function isSimpleExpression($arg) : bool - { - if (\is_scalar($arg)) { - return true; - } - if ($arg === null) { - return true; - } - if ($arg instanceof Node) { - $kind = $arg->kind; - if ($kind === ast\AST_CONST || $kind === ast\AST_CLASS_CONST) { - return true; - } - if ($kind === ast\AST_BINARY_OP) { - // E.g. flags == BINARY_CONCAT - return self::isSimpleExpression($arg->children['left']) && self::isSimpleExpression($arg->children['right']); - } elseif ($kind === ast\AST_ARRAY) { - foreach ($arg->children as $child) { - if (!($child instanceof Node)) { - continue; - } - if (!self::isSimpleExpression($child->children['key'])) { - return false; - } - if (!self::isSimpleExpression($child->children['value'])) { - return false; - } - } - return true; - } - } - return false; - } - - /** - * @return array<string,Closure> - * @phan-return array<string,Closure(CodeBase,Context,FunctionInterface,array):void> - */ - private static function getAnalyzeFunctionCallClosuresStatic() : array - { - $make_order_warner = static function (int $expected_const_pos, int $expected_variable_pos) : Closure { - $expected_arg_count = 1 + (int)\max($expected_const_pos, $expected_variable_pos); - /** - * @param array<int,Node|int|float|string> $args - * @return void - */ - return static function ( - CodeBase $code_base, - Context $context, - FunctionInterface $function, - array $args - ) use ( - $expected_const_pos, - $expected_variable_pos, - $expected_arg_count -) { - if (\count($args) < $expected_arg_count) { - return; - } - if (!self::isSimpleExpression($args[$expected_const_pos])) { - if (self::isSimpleExpression($args[$expected_variable_pos])) { - Issue::maybeEmit( - $code_base, - $context, - Issue::ParamSuspiciousOrder, - $context->getLineNumberStart(), - $expected_const_pos + 1, - $function->getFQSEN(), - $expected_variable_pos + 1 - ); - } - } - }; - }; - $var_1_const_2 = $make_order_warner(1, 0); - $var_2_const_1 = $make_order_warner(0, 1); - $var_3_const_1 = $make_order_warner(0, 2); - $var_1_const_3 = $make_order_warner(2, 0); - - return [ - // Start of string functions from https://secure.php.net/manual/en/ref.strings.php - 'addcslashes' => $var_1_const_2, - 'addslashes' => $var_1_const_2, - 'chunk_split' => $var_1_const_3, - 'convert_cyr_string' => $var_1_const_2, - 'crypt' => $var_1_const_2, - 'explode' => $var_2_const_1, - 'htmlspecialchars_decode' => $var_1_const_2, - 'htmlspecialchars_encode' => $var_1_const_2, - 'ltrim' => $var_1_const_2, - 'md5_file' => $var_1_const_2, - 'md5' => $var_1_const_2, - 'metaphone' => $var_1_const_2, - 'mb_convert_case' => $var_1_const_3, - 'mb_convert_encoding' => $var_1_const_2, - 'mb_convert_kana' => $var_1_const_2, - 'mb_convert_variables' => $var_3_const_1, - 'mb_detect_encoding' => $var_1_const_2, - 'mb_encoding_mimeheader' => $var_1_const_2, - 'mb_ereg_match' => $var_2_const_1, - 'mb_ereg_replace_callback' => $var_3_const_1, - 'mb_ereg_replace' => $var_3_const_1, - 'mb_ereg_search_init' => $var_1_const_2, - 'mb_ereg_search_pos' => $var_1_const_2, - 'mb_ereg' => $var_2_const_1, - 'mb_eregi_replace' => $var_3_const_1, - 'mb_eregi' => $var_2_const_1, - 'mb_split' => $var_2_const_1, - 'mb_strcut' => $var_1_const_2, - 'mb_strimwidth' => $var_1_const_2, - 'mb_stripos' => $var_1_const_2, - 'mb_stristr' => $var_1_const_2, - 'mb_strlen' => $var_1_const_2, - 'mb_strpos' => $var_1_const_2, - 'mb_strrchr' => $var_1_const_2, // what about mb_strchr? - 'mb_strrichr' => $var_1_const_2, - 'mb_strripos' => $var_1_const_2, - 'mb_strtolower' => $var_1_const_2, - 'mb_strtoupper' => $var_1_const_2, - 'mb_strwidth' => $var_1_const_2, - 'mb_substr_count' => $var_1_const_2, - 'mb_substr' => $var_1_const_2, - 'money_format' => $var_2_const_1, - 'nl2br' => $var_1_const_2, - 'number_format' => $var_1_const_2, - 'rtrim' => $var_1_const_2, - 'sha1_file' => $var_1_const_2, - 'sha1' => $var_1_const_2, - 'sscanf' => $var_1_const_2, - 'strchr' => $var_1_const_2, - 'strcspn' => $var_1_const_2, - 'str_getcsv' => $var_1_const_2, - 'stripos' => $var_1_const_2, - 'strip_tags' => $var_1_const_2, - 'str_ireplace' => $var_3_const_1, - 'stristr' => $var_1_const_2, - 'str_pad' => $var_1_const_2, - 'strpbrk' => $var_1_const_2, - 'strpos' => $var_1_const_2, - 'str_replace' => $var_3_const_1, - 'strripos' => $var_1_const_2, - 'strrpos' => $var_1_const_2, - 'str_split' => $var_1_const_2, - 'strspn' => $var_1_const_2, - 'strstr' => $var_1_const_2, - 'strtr' => $var_1_const_2, - 'str_word_count' => $var_1_const_2, - 'substr_count' => $var_1_const_2, - 'substr_replace' => $var_1_const_2, - 'trim' => $var_1_const_2, - 'ucwords' => $var_1_const_2, - 'wordwrap' => $var_1_const_2, - // End of string functions from https://secure.php.net/manual/en/ref.strings.php - - // Start of PCRE preg_* functions - 'preg_filter' => $var_3_const_1, - 'preg_grep' => $var_2_const_1, - 'preg_match_all' => $var_2_const_1, - 'preg_match' => $var_2_const_1, - 'preg_quote' => $var_1_const_2, - 'preg_replace_callback' => $var_2_const_1, - 'preg_replace' => $var_3_const_1, - 'preg_split' => $var_2_const_1, - // End of PCRE preg_* functions - - ]; - } - - /** - * @param CodeBase $code_base @phan-unused-param - * @return array<string,\Closure> - * @override - */ - public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array - { - // Unit tests invoke this repeatedly. Cache it. - static $analyzers = null; - if ($analyzers === null) { - $analyzers = self::getAnalyzeFunctionCallClosuresStatic(); - } - return $analyzers; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/ThrowAnalyzerPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/ThrowAnalyzerPlugin.php deleted file mode 100644 index 41b0838..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/ThrowAnalyzerPlugin.php +++ /dev/null @@ -1,335 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use ast; -use ast\Node; -use Phan\AST\ContextNode; -use Phan\AST\UnionTypeVisitor; -use Phan\Config; -use Phan\Exception\CodeBaseException; -use Phan\Exception\IssueException; -use Phan\Exception\NodeException; -use Phan\Issue; -use Phan\Language\Context; -use Phan\Language\Element\FunctionInterface; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; - -/** - * Analyzes throw statements and compares them against the phpdoc (at)throws annotations - */ -class ThrowAnalyzerPlugin extends PluginV2 implements PostAnalyzeNodeCapability -{ - /** - * This is invalidated every time this plugin is loaded (e.g. for tests) - * @var ?UnionType - */ - public static $configured_ignore_throws_union_type = null; - - public static function getPostAnalyzeNodeVisitorClassName() : string - { - self::$configured_ignore_throws_union_type = null; - if (Config::getValue('warn_about_undocumented_exceptions_thrown_by_invoked_functions')) { - return ThrowRecursiveVisitor::class; - } - return ThrowVisitor::class; - } -} - -/** - * Visits throw statements to compares them against the phpdoc (at)throws annotations in the function-like scope - */ -class ThrowVisitor extends PluginAwarePostAnalysisVisitor -{ - /** - * @var array<int,Node> Dynamic - * @suppress PhanReadOnlyProtectedProperty set by the framework - */ - protected $parent_node_list; - - /** - * @return void - * @override - */ - public function visitThrow(Node $node) - { - $context = $this->context; - if (!$context->isInFunctionLikeScope()) { - return; - } - $code_base = $this->code_base; - - $union_type = UnionTypeVisitor::unionTypeFromNode($code_base, $context, $node->children['expr']); - $union_type = $this->withoutCaughtUnionTypes($union_type); - if ($union_type->isEmpty()) { - // Give up if we don't know - // TODO: Infer Throwable, if the original $union_type was empty - // and there are no try/catch blocks wrapping this. - return; - } - $analyzed_function = $context->getFunctionLikeInScope($code_base); - - // TODO: This seems like it didn't work for A::c(A::d()) - See #1960 (InvalidArgumentException wasn't detected) - foreach ($this->parent_node_list as $parent) { - if ($parent->kind !== ast\AST_TRY) { - continue; - } - foreach ($parent->children['catches']->children as $catch_node) { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall hopefully impossible to see for this AST - $caught_union_type = UnionTypeVisitor::unionTypeFromClassNode($code_base, $context, $catch_node->children['class']); - foreach ($union_type->getTypeSet() as $type) { - if (!$type->asExpandedTypes($code_base)->canCastToUnionType($caught_union_type)) { - $union_type = $union_type->withoutType($type); - if ($union_type->isEmpty()) { - return; - } - } - } - } - } - $this->warnAboutPossiblyThrownType($node, $analyzed_function, $union_type); - } - - protected function withoutCaughtUnionTypes(UnionType $union_type) : UnionType - { - if ($union_type->isEmpty()) { - // Give up if we don't know - return $union_type; - } - - foreach ($this->parent_node_list as $parent) { - if ($parent->kind !== ast\AST_TRY) { - continue; - } - foreach ($parent->children['catches']->children as $catch_node) { - // @phan-suppress-next-line PhanThrowTypeAbsentForCall hopefully impossible to see for this AST - $caught_union_type = UnionTypeVisitor::unionTypeFromClassNode($this->code_base, $this->context, $catch_node->children['class']); - foreach ($union_type->getTypeSet() as $type) { - if ($type->asExpandedTypes($this->code_base)->canCastToUnionType($caught_union_type)) { - $union_type = $union_type->withoutType($type); - if ($union_type->isEmpty()) { - return $union_type; - } - } - } - } - } - return $union_type; - } - - /** - * @return void - */ - protected function warnAboutPossiblyThrownType( - Node $node, - FunctionInterface $analyzed_function, - UnionType $union_type, - FunctionInterface $call = null - ) { - foreach ($union_type->getTypeSet() as $type) { - $expanded_type = $type->asExpandedTypes($this->code_base); - if (!$this->shouldWarnAboutThrowType($expanded_type)) { - continue; - } - if ($type->hasTemplateTypeRecursive()) { - continue; - } - $throws_union_type = $analyzed_function->getThrowsUnionType(); - if ($throws_union_type->isEmpty()) { - if ($call !== null) { - $this->emitIssue( - Issue::ThrowTypeAbsentForCall, - $node->lineno, - $analyzed_function->getRepresentationForIssue(), - (string)$union_type, - $call->getRepresentationForIssue() - ); - } else { - $this->emitIssue( - Issue::ThrowTypeAbsent, - $node->lineno, - $analyzed_function->getRepresentationForIssue(), - (string)$union_type - ); - } - continue; - } - if (!$expanded_type->canCastToUnionType($throws_union_type)) { - if ($call !== null) { - $this->emitIssue( - Issue::ThrowTypeMismatchForCall, - $node->lineno, - $analyzed_function->getRepresentationForIssue(), - (string)$union_type, - $call->getRepresentationForIssue(), - $throws_union_type - ); - } else { - $this->emitIssue( - Issue::ThrowTypeMismatch, - $node->lineno, - $analyzed_function->getRepresentationForIssue(), - (string)$union_type, - $throws_union_type - ); - } - } - } - } - - protected static function calculateConfiguredIgnoreThrowsUnionType() : UnionType - { - $throws_union_type = UnionType::empty(); - foreach (Config::getValue('exception_classes_with_optional_throws_phpdoc') as $type_string) { - if (!\is_string($type_string) || $type_string === '') { - continue; - } - $throws_union_type = $throws_union_type->withUnionType(UnionType::fromStringInContext($type_string, new Context(), Type::FROM_PHPDOC)); - } - return $throws_union_type; - } - - protected function getConfiguredIgnoreThrowsUnionType() : UnionType - { - return ThrowAnalyzerPlugin::$configured_ignore_throws_union_type ?? (ThrowAnalyzerPlugin::$configured_ignore_throws_union_type = $this->calculateConfiguredIgnoreThrowsUnionType()); - } - - /** - * Check if the user wants to warn about a given throw type. - */ - protected function shouldWarnAboutThrowType(UnionType $expanded_type) : bool - { - $ignore_union_type = $this->getConfiguredIgnoreThrowsUnionType(); - if ($ignore_union_type->isEmpty()) { - return true; - } - return !$expanded_type->canCastToUnionType($ignore_union_type); - } -} - -/** - * Visits throw statements to compares them against the phpdoc (at)throws annotations in the function-like scope, - * as well as to check if the functions invoked within the implementation may throw - * are either caught or documented by the (at)throws annotation. - */ -class ThrowRecursiveVisitor extends ThrowVisitor -{ - /** - * @return void - * @override - */ - public function visitCall(Node $node) - { - $context = $this->context; - if (!$context->isInFunctionLikeScope()) { - return; - } - $code_base = $this->code_base; - $analyzed_function = $context->getFunctionLikeInScope($code_base); - try { - $function_list_generator = (new ContextNode( - $code_base, - $context, - $node->children['expr'] - ))->getFunctionFromNode(); - - foreach ($function_list_generator as $invoked_function) { - // Check the types that can be thrown by this call. - $this->warnAboutPossiblyThrownType( - $node, - $analyzed_function, - $this->withoutCaughtUnionTypes($invoked_function->getThrowsUnionType()) - ); - } - } catch (CodeBaseException $_) { - // ignore it. - } - } - - /** - * @return void - * @override - */ - public function visitMethodCall(Node $node) - { - $context = $this->context; - if (!$context->isInFunctionLikeScope()) { - return; - } - $code_base = $this->code_base; - $method_name = $node->children['method']; - - if (!\is_string($method_name)) { - $method_name = UnionTypeVisitor::anyStringLiteralForNode($code_base, $context, $method_name); - if (!\is_string($method_name)) { - return; - } - } - - try { - $invoked_method = (new ContextNode( - $code_base, - $context, - $node - ))->getMethod($method_name, false, true); - } catch (IssueException $_) { - // do nothing, PostOrderAnalysisVisitor should catch this - return; - } catch (NodeException $_) { - return; - } - $analyzed_function = $context->getFunctionLikeInScope($code_base); - // Check the types that can be thrown by this call. - $this->warnAboutPossiblyThrownType( - $node, - $analyzed_function, - $this->withoutCaughtUnionTypes($invoked_method->getThrowsUnionType()), - $invoked_method - ); - } - - /** - * @return void - * @override - */ - public function visitStaticCall(Node $node) - { - $context = $this->context; - if (!$context->isInFunctionLikeScope()) { - return; - } - $code_base = $this->code_base; - $method_name = $node->children['method']; - if (!\is_string($method_name)) { - $method_name = UnionTypeVisitor::anyStringLiteralForNode($code_base, $context, $method_name); - if (!\is_string($method_name)) { - return; - } - } - try { - // Get a reference to the method being called - $invoked_method = (new ContextNode( - $code_base, - $context, - $node - ))->getMethod($method_name, true, true); - } catch (\Exception $_) { - // Ignore IssueException, unexpected exceptions, etc. - return; - } - - $analyzed_function = $context->getFunctionLikeInScope($code_base); - - // Check the types that can be thrown by this call. - $this->warnAboutPossiblyThrownType( - $node, - $analyzed_function, - $this->withoutCaughtUnionTypes($invoked_method->getThrowsUnionType()), - $invoked_method - ); - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableGraph.php b/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableGraph.php deleted file mode 100644 index 0a339e5..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableGraph.php +++ /dev/null @@ -1,208 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal\VariableTracker; - -use ast\Node; -use function spl_object_id; - -/** - * This represents a summary of all of the definitions and uses of all variable within a scope. - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -final class VariableGraph -{ - /** - * @var array<string,array<int,array<int,true>>> - * - * Maps variable name to (definition id to (list of uses of that given definition)) - */ - public $def_uses = []; - - /** - * @var array<string,array<int,int>> - * - * Maps variable id to line number of the node for a definition ids - */ - public $def_lines = []; - - /** - * @var array<string,array<int,Node|int|float|string>> - * - * Maps variable id to a set of definition ids and their corresponding constant AST nodes - */ - public $const_expr_declarations = []; - - /** - * @var array<int,true> - * - * The set of definition ids that are possibly placeholder loop values - * in foreach over keys. - */ - public $loop_def_ids = []; - - /** - * @var array<int,true> - * - * The set of definition ids that are caught exceptions in catch blocks. - */ - public $caught_exception_ids = []; - - /** - * @var array<string,int> maps variable names to whether - * they have ever occurred as a given self::IS_* category in the current scope - */ - public $variable_types = []; - - const IS_REFERENCE = 1 << 0; - const IS_GLOBAL = 1 << 1; - const IS_STATIC = 1 << 2; - - const IS_REFERENCE_OR_GLOBAL_OR_STATIC = self::IS_REFERENCE | self::IS_GLOBAL | self::IS_STATIC; - - public function __construct() - { - } - - /** - * Record the fact that $node is a definition of the variable with name $name in the scope $scope - * @param ?(Node|string|int|float) $const_expr is the definition's value a value that could be a constant? - * @return void - */ - public function recordVariableDefinition(string $name, Node $node, VariableTrackingScope $scope, $const_expr) - { - // TODO: Measure performance against SplObjectHash - $id = \spl_object_id($node); - if (!isset($this->def_uses[$name][$id])) { - $this->def_uses[$name][$id] = []; - } - $this->def_lines[$name][$id] = $node->lineno; - if ($const_expr !== null) { - $this->const_expr_declarations[$name][$id] = $const_expr; - } - $scope->recordDefinitionById($name, $id); - } - - /** - * @return void - */ - public function recordVariableUsage(string $name, Node $node, VariableTrackingScope $scope) - { - if (!\array_key_exists($name, $this->variable_types)) { - // Set this to 0 to record that the variable was used somewhere - // (it will be overridden later if there are flags to set) - $this->variable_types[$name] = 0; - } - // @phan-suppress-next-line PhanUndeclaredProperty added by ArgumentType analyzer - if (isset($node->is_reference)) { - $this->markAsReference($name); - } - $defs_for_variable = $scope->getDefinition($name); - if (!$defs_for_variable) { - return; - } - $node_id = \spl_object_id($node); - $scope->recordUsageById($name, $node_id); - foreach ($defs_for_variable as $def_id => $_) { - if ($def_id !== $node_id) { - $this->def_uses[$name][$def_id][$node_id] = true; - } - } - } - - /** - * Record that $name was modified in place - */ - public function recordVariableModification(string $name) { - $this->const_expr_declarations[$name][-1] = 0; - } - - /** - * @param array<int,mixed> $loop_uses_of_own_variable any array that has node ids for uses of $def_id as keys - * @return void - */ - public function recordLoopSelfUsage(string $name, int $def_id, array $loop_uses_of_own_variable) - { - foreach ($loop_uses_of_own_variable as $node_id => $_) { - // For expressions such as `;$var++;` or `$var += 1;`, don't count the modifying declaration in a loop as a usage - it's unused if nothing else uses that. - if ($def_id !== $node_id) { - $this->def_uses[$name][$def_id][$node_id] = true; - } - } - } - - /** - * @return void - */ - public function markAsReference(string $name) - { - $this->markBitForVariableName($name, self::IS_REFERENCE); - } - - /** - * @return void - */ - public function markAsStaticVariable(string $name) - { - $this->markBitForVariableName($name, self::IS_STATIC); - } - - /** - * @return void - */ - public function markAsGlobalVariable(string $name) - { - $this->markBitForVariableName($name, self::IS_GLOBAL); - } - - /** - * Marks something as being a loop variable `$v` in `foreach ($arr as $k => $v)` - * (Common false positive, since there's no way to avoid setting the value) - * - * @param Node|string|int|float|null $node - * @return void - */ - public function markAsLoopValueNode($node) - { - if ($node instanceof Node) { - $this->loop_def_ids[spl_object_id($node)] = true; - } - } - - /** - * Checks if the node for this id is defined as the value in a foreach over keys of an array. - */ - public function isLoopValueDefinitionId(int $definition_id) : bool - { - return \array_key_exists($definition_id, $this->loop_def_ids); - } - - /** - * Marks something as being a caught exception `$e` in `catch ($e)` - * (Common false positive, since there's no way to avoid setting the value) - * - * @param Node|int|string|float|null $node - * @return void - */ - public function markAsCaughtException($node) - { - if ($node instanceof Node) { - $this->caught_exception_ids[spl_object_id($node)] = true; - } - } - - /** - * Checks if the node for this id is defined as a caught exception - */ - public function isCaughtException(int $definition_id) : bool - { - return \array_key_exists($definition_id, $this->caught_exception_ids); - } - - /** - * @return void - */ - private function markBitForVariableName(string $name, int $bit) - { - $this->variable_types[$name] = (($this->variable_types[$name] ?? 0) | $bit); - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackerVisitor.php b/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackerVisitor.php deleted file mode 100644 index d925a5a..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackerVisitor.php +++ /dev/null @@ -1,825 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal\VariableTracker; - -use AssertionError; -use ast; -use ast\Node; -use Phan\Analysis\BlockExitStatusChecker; -use Phan\AST\AnalysisVisitor; -use Phan\AST\Visitor\Element; -use Phan\Parse\ParseVisitor; -use function is_string; - -/** - * The planned design for this is similar to the way BlockAnalysisVisitor tracks union types of variables - * (Tracks locations instead of union types). - * - * 1. Track definitions and uses, on a per-statement basis. - * 2. Use visit*() overrides for individual element types. - * 3. Split tracking variables into pre-analysis, recursive, and post-analysis steps - * 4. Track based on an identifier corresponding to the \ast\Node of the assignment (e.g. using \spl_object_id()) - * - * TODO: Improve analysis within the ternary operator (cond() ? ($x = 2) : ($x = 3); - * TODO: Support unset - * TODO: Fix tests/files/src/0426_inline_var_force.php - * - * @phan-file-suppress PhanTypeMismatchArgumentNullable child nodes as used here are non-null - */ -final class VariableTrackerVisitor extends AnalysisVisitor -{ - /** - * This shared graph instance maps definitions of variables (in a function-like context) - * to the uses of that variable. - * - * @var VariableGraph - */ - public static $variable_graph; - - /** - * This represents the status of variables in the current scope - * (e.g. which variable definitions are available to be used, etc.) - * - * @var VariableTrackingScope - */ - private $scope; - - /** - * @var ?Node the most recently visited statement within the AST_STMT_LIST. - * This can be used to check if an expression such as $x++ is used by something else. - * - * Tracking the parent_node_list is possible, but would be much more verbose. - */ - private $top_level_statement; - - public function __construct(VariableTrackingScope $scope) - { - $this->scope = $scope; - } - - /** - * This is the default implementation for node types which don't have any overrides - * @return VariableTrackingScope - * @override - */ - public function visit(Node $node) - { - foreach ($node->children as $child_node) { - if (!($child_node instanceof Node)) { - continue; - } - - $this->scope = $this->{Element::VISIT_LOOKUP_TABLE[$child_node->kind] ?? 'handleMissingNodeKind'}($child_node); - } - return $this->scope; - } - - /** - * This is the default implementation for node types which don't have any overrides - * @return VariableTrackingScope - * @override - */ - public function visitStmtList(Node $node) - { - $top_level_statement = $this->top_level_statement; - foreach ($node->children as $child_node) { - if (!($child_node instanceof Node)) { - continue; - } - - // TODO: Specialize? - $this->top_level_statement = $child_node; - $this->scope = $this->{Element::VISIT_LOOKUP_TABLE[$child_node->kind] ?? 'handleMissingNodeKind'}($child_node); - } - $this->top_level_statement = $top_level_statement; - return $this->scope; - } - - /** - * @return VariableTrackingScope - * @override - */ - public function visitAssignRef(Node $node) - { - $expr = $node->children['expr']; - if ($expr instanceof Node) { - $this->markVariablesAsReference($expr); - $this->scope = $this->analyze($this->scope, $expr); - } - $var_node = $node->children['var']; - if ($var_node instanceof Node && $var_node->kind === \ast\AST_VAR) { - $name = $var_node->children['name']; - if (is_string($name)) { - self::$variable_graph->recordVariableUsage($name, $var_node, $this->scope); - } - } - return $this->analyzeAssignmentTarget($var_node, true, null); - } - - private function markVariablesAsReference(Node $expr) - { - while (\in_array($expr->kind, [ast\AST_DIM, ast\AST_PROP], true)) { - $expr = $expr->children['expr']; - if (!$expr instanceof Node) { - return; - } - } - if ($expr->kind === ast\AST_VAR) { - $name = $expr->children['name']; - if (is_string($name)) { - self::$variable_graph->markAsReference($name); - } - } - } - - /** - * Analyze X++ - * @override - * @return VariableTrackingScope - */ - public function visitPostInc(Node $node) - { - return $this->analyzeIncDec($node); - } - - /** - * Analyze X-- - * @override - * @return VariableTrackingScope - */ - public function visitPostDec(Node $node) - { - return $this->analyzeIncDec($node); - } - - /** - * Analyze ++X - * @override - * @return VariableTrackingScope - */ - public function visitPreInc(Node $node) - { - return $this->analyzeIncDec($node); - } - - /** - * Analyze --X - * @override - * @return VariableTrackingScope - */ - public function visitPreDec(Node $node) - { - return $this->analyzeIncDec($node); - } - - /** - * @return VariableTrackingScope - */ - private function analyzeIncDec(Node $node) - { - $var_node = $node->children['var']; - if ($var_node instanceof Node && $var_node->kind === ast\AST_VAR) { - $name = $var_node->children['name']; - if (is_string($name)) { - // $node is the usage of this variable - // Here, we use $node instead of $var_node as the declaration node so that recordVariableUsage won't treat increments in loops as using themselves. - self::$variable_graph->recordVariableUsage($name, $node, $this->scope); - if ($this->top_level_statement === $node) { - // And the whole inc/dec operation is the redefinition of this variable. - // To reduce false positives, treat `;$x++;` as a redefinition, but not `foo($x++)` - self::$variable_graph->recordVariableDefinition($name, $node, $this->scope, null); - $this->scope->recordDefinition($name, $node); - } - return $this->scope; - } - } - return $this->visit($node); - } - - /** - * @return VariableTrackingScope - * @override - */ - public function visitAssignOp(Node $node) - { - $expr = $node->children['expr']; - if ($expr instanceof Node) { - $this->scope = $this->analyze($this->scope, $expr); - } - $var_node = $node->children['var']; - if (!($var_node instanceof Node)) { - return $this->scope; - } - switch ($var_node->kind) { - case ast\AST_VAR: - $name = $var_node->children['name']; - if (!is_string($name)) { - break; - } - // The left-hand node ($node) is the usage of this variable - // We use the same node id so that phan will warn about unused declarations within loops - self::$variable_graph->recordVariableUsage($name, $node, $this->scope); - // And the whole assignment operation is the redefinition of this variable - self::$variable_graph->recordVariableDefinition($name, $node, $this->scope, null); - $this->scope->recordDefinition($name, $node); - return $this->scope; - case ast\AST_PROP: - return $this->analyzePropAssignmentTarget($var_node); - case ast\AST_DIM: - return $this->analyzeDimAssignmentTarget($var_node); - // TODO: Analyze array access and param/return references of function/method calls. - default: - // Static property or an unexpected target. - // Analyze this normally. - return $this->analyze($this->scope, $var_node); - } - return $this->scope; - } - - /** - * @return VariableTrackingScope - * @override - */ - public function visitAssign(Node $node) - { - $expr = $node->children['expr']; - if ($expr instanceof Node) { - $this->scope = $this->analyze($this->scope, $expr); - } - return $this->analyzeAssignmentTarget($node->children['var'], false, self::getConstExprOrNull($expr)); - } - - /** - * @param Node|string|int|float $expr - * @return Node|string|int|float|null - */ - private static function getConstExprOrNull($expr) { - return ParseVisitor::isConstExpr($expr) ? $expr : null; - } - - /** - * @param Node|int|string|float|null $node - * @param Node|int|string|float|null $const_expr - */ - private function analyzeAssignmentTarget($node, bool $is_ref, $const_expr) : VariableTrackingScope - { - // TODO: Push onto the node list? - if (!($node instanceof Node)) { - return $this->scope; - } - switch ($node->kind) { - case ast\AST_VAR: - $name = $node->children['name']; - if (!is_string($name)) { - break; - } - if ($is_ref) { - self::$variable_graph->markAsReference($name); - } - self::$variable_graph->recordVariableDefinition($name, $node, $this->scope, $const_expr); - $this->scope->recordDefinition($name, $node); - return $this->scope; - case ast\AST_ARRAY: - return $this->analyzeArrayAssignmentTarget($node, $const_expr); - - case ast\AST_REF: - return $this->analyzeAssignmentTarget($node->children['var'], true, null); - case ast\AST_PROP: - return $this->analyzePropAssignmentTarget($node); - case ast\AST_DIM: - return $this->analyzeDimAssignmentTarget($node); - // TODO: Analyze array access and param/return references of function/method calls. - default: - // Static property or an unexpected target. - // Analyze this normally. - return $this->analyze($this->scope, $node); - } - return $this->scope; - } - - /** - * @param Node|int|string|float|null $const_expr - */ - private function analyzeArrayAssignmentTarget(Node $node, $const_expr) : VariableTrackingScope - { - foreach ($node->children as $elem_node) { - if (!($elem_node instanceof Node)) { - continue; - } - // Treat $key in `[$key => $y] = $array` as a usage of $key - $this->scope = $this->analyzeWhenValidNode($this->scope, $elem_node->children['key']); - $this->scope = $this->analyzeAssignmentTarget($elem_node->children['value'], false, $const_expr); - } - return $this->scope; - } - - private function analyzePropAssignmentTarget(Node $node) : VariableTrackingScope - { - // Treat $y in `$x->$y = $z;` as a usage of $y - $this->scope = $this->analyzeWhenValidNode($this->scope, $node->children['prop']); - $expr = $node->children['expr']; - if ($expr instanceof Node && $expr->kind === \ast\AST_VAR) { - $name = $expr->children['name']; - if (is_string($name)) { - // treat $x->prop = 2 like a usage of $x - self::$variable_graph->recordVariableUsage($name, $expr, $this->scope); - self::$variable_graph->recordVariableModification($name); - } - } - return $this->analyzeWhenValidNode($this->scope, $expr); // lower false positives by not treating this as a definition - // // treat $x->prop = 2 like a definition to $x (in addition to having treated this as a usage) - // return $this->analyzeAssignmentTarget($expr, false); - } - - private function analyzeDimAssignmentTarget(Node $node) : VariableTrackingScope - { - // Treat $y in `$x[$y] = $z;` as a usage of $y - $this->scope = $this->analyzeWhenValidNode($this->scope, $node->children['dim']); - $expr = $node->children['expr']; - while ($expr instanceof Node) { - if ($expr->kind === \ast\AST_VAR) { - $name = $expr->children['name']; - if (is_string($name)) { - // treat $x['dim_name'] = 2 like a usage of $x - // - // TODO: More aggressively warn if there is only a single dimension to $x - self::$variable_graph->recordVariableUsage($name, $expr, $this->scope); - self::$variable_graph->recordVariableModification($name); - } - break; - } elseif (\in_array($expr->kind, [ast\AST_DIM, ast\AST_PROP], true)) { - $expr = $expr->children['expr']; - } else { - break; - } - } - return $this->analyzeWhenValidNode($this->scope, $node->children['expr']); // lower false positives by not treating this as a definition - // // treat $x['dim_name'] = 2 like a definition to $x (in addition to having treated this as a usage) - // return $this->analyzeAssignmentTarget($expr, false); - } - - /** - * @return VariableTrackingScope - */ - public function handleMissingNodeKind(Node $unused_node) - { - // do nothing - return $this->scope; - } - - /** - * @param Node|string|int|float|null $child_node - * @return VariableTrackingScope - */ - private function analyzeWhenValidNode(VariableTrackingScope $scope, $child_node) - { - if ($child_node instanceof Node) { - return $this->analyze($scope, $child_node); - } - return $scope; - } - - /** - * This is an abstraction for getting a new, updated context for a child node. - * - * @param Node $child_node - The node which will be analyzed to create the updated context. - * @return VariableTrackingScope - */ - private function analyze(VariableTrackingScope $scope, Node $child_node) - { - // Modify the original object instead of creating a new BlockAnalysisVisitor. - // this is slightly more efficient, especially if a large number of unchanged parameters would exist. - $old_scope = $this->scope; - $this->scope = $scope; - try { - return $this->{Element::VISIT_LOOKUP_TABLE[$child_node->kind] ?? 'handleMissingNodeKind'}($child_node); - } finally { - $this->scope = $old_scope; - } - } - - /** - * Do not recurse into function declarations within a scope - * @return VariableTrackingScope - * @override - */ - public function visitFuncDecl(Node $unused_node) - { - return $this->scope; - } - - /** - * Do not recurse into class declarations within a scope - * @return VariableTrackingScope - * @override - */ - public function visitClass(Node $unused_node) - { - return $this->scope; - } - - /** - * Do not recurse into closure declarations within a scope. - * - * FIXME: Check closure use variables without checking statements - * @return VariableTrackingScope - * @override - */ - public function visitClosure(Node $node) - { - foreach ($node->children['uses']->children ?? [] as $closure_use) { - if (!($closure_use instanceof Node)) { - continue; - } - - $name = $closure_use->children['name']; - if (!is_string($name)) { - continue; - } - - if ($closure_use->flags & ast\flags\PARAM_REF) { - self::$variable_graph->recordVariableDefinition($name, $closure_use, $this->scope, null); - self::$variable_graph->markAsReference($name); - } else { - self::$variable_graph->recordVariableUsage($name, $closure_use, $this->scope); - } - } - return $this->scope; - } - - /** - * @override - * @return VariableTrackingScope - * Common no-op - */ - public function visitName(Node $unused_node) - { - return $this->scope; - } - - /** - * TODO: Check if the current context is a function call passing an argument by reference - * @return VariableTrackingScope - * @override - */ - public function visitVar(Node $node) - { - $name = $node->children['name']; - if (\is_string($name)) { - self::$variable_graph->recordVariableUsage($name, $node, $this->scope); - if ($node === $this->top_level_statement) { - self::$variable_graph->recordVariableDefinition($name, $node, $this->scope, null); - $this->scope->recordDefinition($name, $node); - } - } elseif ($name instanceof Node) { - return $this->analyze($this->scope, $name); - } - return $this->scope; - } - - /** - * TODO: Check if the current context is a function call passing an argument by reference - * @return VariableTrackingScope - * @override - */ - public function visitStatic(Node $node) - { - $name = $node->children['var']->children['name'] ?? null; - if (\is_string($name)) { - self::$variable_graph->markAsStaticVariable($name); - self::$variable_graph->recordVariableDefinition($name, $node, $this->scope, null); - $this->scope->recordDefinition($name, $node); - } - return $this->scope; - } - - /** - * TODO: Check if the current context is a function call passing an argument by reference - * @return VariableTrackingScope - * @override - */ - public function visitGlobal(Node $node) - { - $name = $node->children['var']->children['name'] ?? null; - if (\is_string($name)) { - self::$variable_graph->markAsGlobalVariable($name); - } - return $this->scope; - } - - /** - * Analyzes `foreach ($expr as $key => $value) { stmts } - * @return VariableTrackingScope - */ - public function visitForeach(Node $node) - { - $expr_node = $node->children['expr']; - $outer_scope_unbranched = $this->analyzeWhenValidNode($this->scope, $expr_node); - $outer_scope = new VariableTrackingBranchScope($outer_scope_unbranched); - - // Replace the scope with the inner scope - $this->scope = new VariableTrackingLoopScope($outer_scope); - - $key_node = $node->children['key']; - $this->scope = $this->analyzeAssignmentTarget($key_node, false, null); - - $value_node = $node->children['value']; - if (isset($key_node)) { - self::$variable_graph->markAsLoopValueNode($value_node); - } - $this->scope = $this->analyzeAssignmentTarget($value_node, false, null); // analyzeAssignmentTarget checks for AST_REF - - // TODO: Update graph: inner loop definitions can be used inside the loop. - // TODO: Create a branchScope? - Loop iterations can run 0 times. - $inner_scope = $this->analyze($this->scope, $node->children['stmts']); - - // Merge inner scope into outer scope - // @phan-suppress-next-line PhanTypeMismatchArgument - $outer_scope = $outer_scope->mergeInnerLoopScope($inner_scope, self::$variable_graph); - - return $outer_scope_unbranched->mergeWithSingleBranchScope($outer_scope); - } - - /** - * Analyzes `while (cond) { stmts }` - * @return VariableTrackingScope - * @override - */ - public function visitWhile(Node $node) - { - $outer_scope_unbranched = $this->analyzeWhenValidNode($this->scope, $node->children['cond']); - $outer_scope = new VariableTrackingBranchScope($outer_scope_unbranched); - - $inner_scope = new VariableTrackingLoopScope($outer_scope); - $inner_scope = $this->analyze($inner_scope, $node->children['stmts']); - $inner_scope = $this->analyzeWhenValidNode($inner_scope, $node->children['cond']); - '@phan-var VariableTrackingLoopScope $inner_scope'; - - // Merge inner scope into outer scope - $outer_scope = $outer_scope->mergeInnerLoopScope($inner_scope, self::$variable_graph); - return $outer_scope_unbranched->mergeWithSingleBranchScope($outer_scope); - } - - /** - * Analyzes `do { stmts } while (cond);` - * - * TODO: Fix https://github.com/phan/phan/issues/2029 - * - * @param Node $node a node of type AST_DO_WHILE - * @return VariableTrackingScope - * @override - */ - public function visitDoWhile(Node $node) - { - $outer_scope_unbranched = $this->scope; - $outer_scope = new VariableTrackingBranchScope($outer_scope_unbranched); - - $inner_scope = new VariableTrackingLoopScope($outer_scope); - $inner_scope = $this->analyze($inner_scope, $node->children['stmts']); - $inner_scope = $this->analyzeWhenValidNode($inner_scope, $node->children['cond']); - '@phan-var VariableTrackingLoopScope $inner_scope'; - - // Merge inner scope into outer scope - $outer_scope = $outer_scope->mergeInnerLoopScope($inner_scope, self::$variable_graph); - '@phan-var VariableTrackingLoopScope $inner_scope'; - return $outer_scope_unbranched->mergeWithSingleBranchScope($outer_scope); - } - - /** - * Analyzes `for (init; cond; loop) { stmts }` - * @param Node $node a node of type AST_FOR - * @return VariableTrackingScope - * @override - */ - public function visitFor(Node $node) - { - $top_level_statement = $this->top_level_statement; - $init_node = $node->children['init']; - if ($init_node instanceof Node) { - $this->top_level_statement = $init_node; - $outer_scope_unbranched = $this->analyze($this->scope, $init_node); - } else { - $outer_scope_unbranched = $this->scope; - } - $outer_scope_unbranched = $this->analyzeWhenValidNode($outer_scope_unbranched, $node->children['cond']); - $outer_scope = new VariableTrackingBranchScope($outer_scope_unbranched); - - $inner_scope = new VariableTrackingLoopScope($outer_scope); - // Iterate over the nodes in AST_EXPR_LIST `loop` for `for (init; cond; loop)` to check their uses and definitions of variables - foreach ($node->children['loop']->children ?? [] as $loop_node) { - if (!($loop_node instanceof Node)) { - continue; - } - $this->top_level_statement = $loop_node; - $loop_scope = $this->analyze(new VariableTrackingBranchScope($inner_scope), $loop_node); - // @phan-suppress-next-line PhanTypeMismatchArgument - $inner_scope = $inner_scope->mergeWithSingleBranchScope($loop_scope); - $this->top_level_statement = $top_level_statement; - } - // TODO: If the graph analysis is improved, look into making this stop analyzing 'loop' twice - $inner_scope = $this->analyzeWhenValidNode($inner_scope, $node->children['cond']); - $inner_scope = $this->analyze($inner_scope, $node->children['stmts']); - foreach ($node->children['loop']->children ?? [] as $loop_node) { - if ($loop_node instanceof Node) { - $loop_scope = $this->analyze(new VariableTrackingBranchScope($inner_scope), $loop_node); - // @phan-suppress-next-line PhanTypeMismatchArgument - $inner_scope = $inner_scope->mergeWithSingleBranchScope($loop_scope); - } - } - - // Merge inner scope into outer scope - // @phan-suppress-next-line PhanTypeMismatchArgument - $outer_scope = $outer_scope->mergeInnerLoopScope($inner_scope, self::$variable_graph); - return $outer_scope_unbranched->mergeWithSingleBranchScope($outer_scope); - } - - /** - * Analyzes if statements. - * - * @param Node $node a node of kind AST_IF - * @return VariableTrackingScope - * - * @see BlockAnalysisVisitor::visitIf() - * @override - */ - public function visitIf(Node $node) - { - $outer_scope = $this->scope; - - $inner_scope_list = []; - $merge_parent_scope = true; - foreach ($node->children as $if_node) { - if (!($if_node instanceof Node)) { - // impossible - continue; - } - // Replace the scope with the inner scope - // Analyzing if_node->children['cond'] should affect $outer_scope. - // This isn't precise, and doesn't fully understand assignments within conditions. - $cond_node = $if_node->children['cond']; - $stmts_node = $if_node->children['stmts']; - - if ($cond_node instanceof Node) { - $inner_cond_scope = new VariableTrackingBranchScope($outer_scope); - $inner_cond_scope = $this->analyze($inner_cond_scope, $cond_node); - '@phan-var VariableTrackingBranchScope $inner_cond_scope'; - $outer_scope = $outer_scope->mergeBranchScopeList([$inner_cond_scope], $merge_parent_scope, []); - } - - $inner_scope = new VariableTrackingBranchScope($outer_scope); - $inner_scope = $this->analyze($inner_scope, $stmts_node); - - '@phan-var VariableTrackingBranchScope $inner_scope'; - - if (BlockExitStatusChecker::willUnconditionallySkipRemainingStatements($stmts_node)) { - $exits = BlockExitStatusChecker::willUnconditionallyThrowOrReturn($stmts_node); - $outer_scope->recordSkippedScope($inner_scope, $exits); - } else { - $inner_scope_list[] = $inner_scope; - } - if ($cond_node === null || (\is_scalar($cond_node) && $cond_node)) { - $merge_parent_scope = false; - } - } - - // Merge inner scope into outer scope - return $outer_scope->mergeBranchScopeList($inner_scope_list, $merge_parent_scope, []); - } - - /** - * Analyzes switch statements. - * - * @param Node $node a node of kind AST_SWITCH - * @return VariableTrackingScope - * - * @override - */ - public function visitSwitchList(Node $node) - { - $outer_scope = $this->scope; - - $inner_scope_list = []; - $inner_exiting_scope_list = []; - $merge_parent_scope = true; - foreach ($node->children as $i => $case_node) { - if (!($case_node instanceof Node)) { - throw new AssertionError("Expected case statements to be nodes"); - } - $cond_node = $case_node->children['cond']; - $stmts_node = $case_node->children['stmts']; - - if ($cond_node instanceof Node) { - // Analyzing if_node->children['cond'] should affect $outer_scope. - // `switch(cond() { case $x = something(): case 3: use($x); }` is valid code. - $outer_scope = $this->analyze($outer_scope, $cond_node); - } elseif ($cond_node === null) { - // this has a default, the case statements are comprehensive - $merge_parent_scope = false; - } - - // Skip over empty case statements (incomplete heuristic), TODO: test - if (\count($stmts_node->children ?? []) !== 0 || $i === \count($node->children) - 1) { - $inner_scope = new VariableTrackingLoopScope($outer_scope); - $inner_scope = $this->analyze($inner_scope, $stmts_node); - // Merge $inner_scope->skipped_loop_scopes - '@phan-var VariableTrackingLoopScope $inner_scope'; - $inner_scope->flattenSwitchCaseScopes(self::$variable_graph); - - if (BlockExitStatusChecker::willUnconditionallyThrowOrReturn($stmts_node)) { - $inner_exiting_scope_list[] = $inner_scope; - } else { - $inner_scope_list[] = $inner_scope; - } - } - } - - // Merge inner scope into outer scope - return $outer_scope->mergeBranchScopeList($inner_scope_list, $merge_parent_scope, $inner_exiting_scope_list); - } - - /** - * Analyzes try nodes and their catch statement lists and finally blocks. - * - * @param Node $node a node of kind AST_TRY - * @return VariableTrackingScope - * - * @override - */ - public function visitTry(Node $node) - { - $outer_scope = $this->scope; - - $try_scope = new VariableTrackingBranchScope($outer_scope); - $try_scope = $this->analyze($try_scope, $node->children['try']); - '@phan-var VariableTrackingBranchScope $try_scope'; - - // TODO: Use BlockExitStatusChecker, like BlockAnalysisVisitor - // TODO: Optimize - $main_scope = $outer_scope->mergeWithSingleBranchScope($try_scope); - - $catch_node_list = $node->children['catches']->children; - if (\count($catch_node_list) > 0) { - $catches_scope = new VariableTrackingBranchScope($main_scope); - $catches_scope = $this->analyze($catches_scope, $node->children['catches']); - // @phan-suppress-next-line PhanTypeMismatchArgument - $main_scope = $main_scope->mergeWithSingleBranchScope($catches_scope); - } - $finally_node = $node->children['finally']; - if ($finally_node !== null) { - return $this->analyze($main_scope, $finally_node); - } - return $main_scope; - } - - /** - * Analyzes catch statement lists. - * @param Node $node a node of kind AST_CATCH_LIST - * @return VariableTrackingScope - * - * @override - */ - public function visitCatchList(Node $node) - { - $outer_scope = $this->scope; - - $inner_scope_list = []; - foreach ($node->children as $catch_node) { - if (!($catch_node instanceof Node)) { - // impossible - continue; - } - // Replace the scope with the inner scope - // TODO: Analyzing if_node->children['cond'] should affect $outer_scope? - $inner_scope = new VariableTrackingBranchScope($outer_scope); - $inner_scope = $this->analyze($inner_scope, $catch_node); - $inner_scope_list[] = $inner_scope; - } - - // Merge inner scope into outer scope - // @phan-suppress-next-line PhanPartialTypeMismatchArgument - return $outer_scope->mergeBranchScopeList($inner_scope_list, false, []); - } - - /** - * Analyzes catch statement lists. - * @param Node $node a node of kind AST_CATCH - * @return VariableTrackingScope - * - * @override - */ - public function visitCatch(Node $node) - { - $var_node = $node->children['var']; - - $scope = $this->scope; - if ($var_node->kind === \ast\AST_VAR) { - $name = $var_node->children['name']; - if (is_string($name)) { - self::$variable_graph->recordVariableDefinition($name, $var_node, $scope, null); - self::$variable_graph->markAsCaughtException($var_node); - $scope->recordDefinition($name, $var_node); - } - } - return $this->analyze($scope, $node->children['stmts']); - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingBranchScope.php b/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingBranchScope.php deleted file mode 100644 index a9b4652..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingBranchScope.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal\VariableTracker; - -/** - * This will represent a variable scope, similar to \Phan\Language\Scope. - * Instead of tracking the union types for variable names, this will instead track definitions of variable names. - */ -class VariableTrackingBranchScope extends VariableTrackingScope -{ - /** - * @var VariableTrackingScope the parent of this branch scope. - * Definitions will be merged later on. - */ - public $parent_scope; - - // inherits defs, uses - - public function __construct(VariableTrackingScope $parent_scope) - { - $this->parent_scope = $parent_scope; - } - - /** - * @return ?array<int,true> - * @override - */ - public function getDefinition(string $variable_name) - { - $definitions = $this->defs[$variable_name] ?? null; - if ($definitions === null) { - $parent_definitions = $this->parent_scope->getDefinition($variable_name); - if (\is_array($parent_definitions)) { - $this->defs[$variable_name] = $parent_definitions; - } - return $parent_definitions; - } - return $definitions; - } - - /** - * @return ?array<int,true> - * @override - */ - public function getDefinitionUpToScope(string $variable_name, VariableTrackingScope $forbidden_scope) - { - if ($this === $forbidden_scope) { - return null; - } - return $this->defs[$variable_name] ?? $this->parent_scope->getDefinitionUpToScope($variable_name, $forbidden_scope); - } - - /** - * @return array<string,array<int,true>> - */ - public function getDefinitionsRecursively() - { - $defs = $this->parent_scope->getDefinitionsRecursively(); - foreach ($this->defs as $variable_name => $def) { - // TODO: Distinguish between being defined in *some* cases and being defined in *all* cases in this branch - $defs[$variable_name] = $def; - } - return $defs; - } - - /** - * Record a statement that was unreachable due to break/continue statements. - * - * @param VariableTrackingBranchScope $inner_scope @phan-unused-param - * @param bool $exits true if this branch will exit. - * This would mean that the branch uses variables, but does not define them outside of that scope. - * - * @return void - * @override - */ - public function recordSkippedScope(VariableTrackingBranchScope $inner_scope, bool $exits) - { - $this->parent_scope->recordSkippedScope($inner_scope, $exits); - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingLoopScope.php b/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingLoopScope.php deleted file mode 100644 index 0b1047e..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingLoopScope.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal\VariableTracker; - -/** - * This is the same as VariableTrackingBranchScope, but records a level for break/continue. - */ -final class VariableTrackingLoopScope extends VariableTrackingBranchScope -{ - /** - * @var array<int,VariableTrackingBranchScope> - * The scopes that broke out early within the inner body of this loop - */ - public $skipped_loop_scopes = []; - - /** - * @var array<int,VariableTrackingBranchScope> - * The scopes that broke out early within the inner body of this loop - */ - public $skipped_exiting_loop_scopes = []; - - // inherits defs, uses - - // inherit VariableTrackingBranchScope::__construct() - - /** - * Record a statement that was unreachable due to break/continue statements. - * - * @param VariableTrackingBranchScope $skipped_loop_scope - * @param bool $exits - * @return void - */ - public function recordSkippedScope(VariableTrackingBranchScope $skipped_loop_scope, bool $exits) - { - if ($exits) { - $this->skipped_exiting_loop_scopes[] = $skipped_loop_scope; - } else { - $this->skipped_loop_scopes[] = $skipped_loop_scope; - } - // Subclasses will implement this - } - - /** - * Account for the definitions and uses of the child scopes with `break`/`continue` inside of this switch statement, - * using these to update the definition and uses of the outer scope of the `switch` node - * - * @return void - */ - public function flattenSwitchCaseScopes(VariableGraph $graph) - { - foreach ($this->skipped_loop_scopes as $alternate_scope) { - $this->flattenScopeToMergedLoopResult($this, $alternate_scope, $graph); - } - foreach ($this->skipped_exiting_loop_scopes as $alternate_scope) { - $this->flattenUsesFromScopeToMergedLoopResult($this, $alternate_scope, $graph); - } - $this->skipped_loop_scopes = []; - $this->skipped_exiting_loop_scopes = []; - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingScope.php b/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingScope.php deleted file mode 100644 index 7567e04..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTracker/VariableTrackingScope.php +++ /dev/null @@ -1,310 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal\VariableTracker; - -use ast\Node; - -use function spl_object_id; - -/** - * This will represent a variable scope, similar to \Phan\Language\Scope. - * Instead of tracking the union types for variable names, this will instead track definitions and uses of variable names. - * - * @see ContextMergeVisitor for something similar for union types. - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class VariableTrackingScope -{ - /** - * @var array<string,array<int,bool>> - * Maps a variable id to a list of definitions in that scope. - * - * This is true if 100% of the definitions are made within the scope, - * false if a fraction of the definitions could be from preceding scopes. - * - * TODO: Actually set the inner value to false appropriately. - */ - protected $defs = []; - - /** - * @var array<string,array<int,true>> - * Maps a variable id to a list of uses which occurred within that scope. - * (of definitions that might have occurred before this scope) - */ - protected $uses = []; - - /** - * Record that $variable_name had a definition that was created by the Node $node - * - * @return void - */ - public function recordDefinition(string $variable_name, Node $node) - { - // Create a new definition for variable_name. - // Replace the definitions for $variable_name. - $this->defs[$variable_name] = [spl_object_id($node) => true]; - } - - /** - * Record that $variable_name had a definition that was created by the Node $node where spl_object_id($node) is $node_id - * - * @return void - */ - public function recordDefinitionById(string $variable_name, int $node_id) - { - // Create a new definition for variable_name. - // Replace the definitions for $variable_name. - $this->defs[$variable_name] = [$node_id => true]; - } - - /** - * Record the fact that $node is a usage of $variable_name. - * - * If it is already a definition of $variable_name, then don't record that. - * - * @suppress PhanUnreferencedPublicMethod used by reference - * @return void - */ - public function recordUsage(string $variable_name, Node $node) - { - $node_id = spl_object_id($node); - // Create a new usage for variable_name. - - if (($this->defs[$variable_name][$node_id] ?? false) !== true) { - $this->uses[$variable_name][$node_id] = true; - } - } - - /** - * Record the fact that a node is a usage of $variable_name. - * - * Equivalent to $this->recordUsage($variable_name, spl_object_id($node)) - * - * @return void - */ - public function recordUsageById(string $variable_name, int $node_id) - { - // Create a new usage for variable_name. - if (($this->defs[$variable_name][$node_id] ?? false) !== true) { - $this->uses[$variable_name][$node_id] = true; - } - } - - /** - * Gets the definitions of $variable_name in this scope. - * - * This is overridden by subclasses, some of which will modify $this->defs - * - * @return ?array<int,true> the Nodes which defined $variable_name - */ - public function getDefinition(string $variable_name) - { - return $this->defs[$variable_name] ?? null; - } - - /** - * Gets the definitions of $variable_name in this scope. - * - * This is overridden by subclasses - * - * @return ?array<int,true> the Nodes which defined $variable_name - */ - public function getDefinitionUpToScope(string $variable_name, VariableTrackingScope $forbidden_scope) - { - if ($this === $forbidden_scope) { - return null; - } - return $this->defs[$variable_name] ?? null; - } - - /** - * Recursively finds the accessible definitions of various variable names - * - * @return array<string,array<int,true>> - */ - public function getDefinitionsRecursively() - { - return $this->defs; - } - - /** - * This creates a new scope where the definitions both inside and outside of the loop are accounted for. - * - * Additionally, it will mark references to variables at the beginning of the inner body of the loop as being uses of variables defined at the end of the loop. - * @return static - */ - public function mergeInnerLoopScope( - VariableTrackingLoopScope $inner_loop_scope, - VariableGraph $graph - ) : VariableTrackingScope { - $result = clone($this); - // TODO: Can this be optimized for common use cases? - // TODO: Track continue and break separately - May require a more complicated graph - foreach ($inner_loop_scope->skipped_loop_scopes as $alternate_scope) { - $this->flattenScopeToMergedLoopResult($inner_loop_scope, $alternate_scope, $graph); - } - foreach ($inner_loop_scope->skipped_exiting_loop_scopes as $alternate_scope) { - $this->flattenUsesFromScopeToMergedLoopResult($inner_loop_scope, $alternate_scope, $graph); - } - $this->addScopeToMergedLoopResult($result, $inner_loop_scope, $graph); - return $result; - } - - /** - * @return void - */ - protected function flattenScopeToMergedLoopResult( - VariableTrackingLoopScope $inner_loop_scope, - VariableTrackingBranchScope $alternate_scope, - VariableGraph $graph - ) { - // Need to flatten these to the same level - // The LoopScope might have been cloned, so just keep going until the closest loop scope. - // TODO: Look at this, see if this way of merging definitions and usages will miss any false positives - $parent_scope = $alternate_scope->parent_scope; - if (!($parent_scope instanceof VariableTrackingLoopScope)) { - '@phan-var VariableTrackingBranchScope $parent_scope'; - $this->flattenScopeToMergedLoopResult($inner_loop_scope, $parent_scope, $graph); - } - $this->addScopeToMergedLoopResult($inner_loop_scope, $alternate_scope, $graph); - $inner_loop_scope->mergeUses($alternate_scope->uses); - } - - /** - * @return void - */ - protected function flattenUsesFromScopeToMergedLoopResult( - VariableTrackingLoopScope $inner_loop_scope, - VariableTrackingBranchScope $alternate_scope, - VariableGraph $graph - ) { - // Need to flatten these to the same level - // The LoopScope might have been cloned, so just keep going until the closest loop scope. - // TODO: Look at this, see if this way of merging definitions and usages will miss any false positives - $parent_scope = $alternate_scope->parent_scope; - if (!($parent_scope instanceof VariableTrackingLoopScope)) { - '@phan-var VariableTrackingBranchScope $parent_scope'; - $this->flattenScopeToMergedLoopResult($inner_loop_scope, $parent_scope, $graph); - } - $inner_loop_scope->mergeUses($alternate_scope->uses); - } - - /** - * @return void - */ - private function addScopeToMergedLoopResult( - VariableTrackingScope $result, - VariableTrackingBranchScope $scope, - VariableGraph $graph - ) { - // @phan-suppress-next-line PhanUndeclaredProperty - $parent_scope = $result->parent_scope ?? $result; - foreach ($scope->getDefinitionsRecursively() as $variable_name => $defs) { - $defs_for_variable = $result->getDefinitionUpToScope($variable_name, $parent_scope) ?? []; - $loop_uses_of_own_variable = $scope->uses[$variable_name] ?? null; - - foreach ($defs as $def_id => $_) { - if ($loop_uses_of_own_variable) { - $graph->recordLoopSelfUsage($variable_name, $def_id, $loop_uses_of_own_variable); - } - $defs_for_variable[$def_id] = true; - } - $result->defs[$variable_name] = $defs_for_variable; - } - $result->mergeUses($scope->uses); - } - - /** - * @param array<string,array<int,bool>> $uses - */ - private function mergeUses(array $uses) - { - foreach ($uses as $variable_name => $def_id_set) { - if (!isset($this->uses[$variable_name])) { - $this->uses[$variable_name] = $def_id_set; - continue; - } - $this->uses[$variable_name] += $def_id_set; - } - } - - /** - * Equivalent to mergeBranchScopeList([$scope], true, []) - * - * @param VariableTrackingBranchScope $scope - * @return static - */ - public function mergeWithSingleBranchScope( - VariableTrackingBranchScope $scope - ) : VariableTrackingScope { - $result = clone($this); - $def_key_set = $scope->defs; - // Anything which is used within a branch is used within the parent - $result->mergeUses($scope->uses); - - foreach ($def_key_set as $variable_name => $_) { - $defs_for_variable = $result->getDefinition($variable_name) ?? []; - - foreach ($scope->getDefinition($variable_name) ?? [] as $def_id => $_) { - $defs_for_variable[$def_id] = true; - } - $result->defs[$variable_name] = $defs_for_variable; - } - return $result; - } - - /** - * @param array<int,VariableTrackingBranchScope> $branch_scopes - * @param array<int,VariableTrackingBranchScope> $inner_exiting_scope_list - */ - public function mergeBranchScopeList( - array $branch_scopes, - bool $merge_parent_scope, - array $inner_exiting_scope_list - ) : VariableTrackingScope { - // Compute the keys which were redefined in branch scopes - // TODO: Optimize - $result = clone($this); - $def_key_set = []; - foreach ($branch_scopes as $scope) { - foreach ($scope->defs as $variable_name => $_) { - $def_key_set[$variable_name] = true; - } - // Anything which is used within a branch is used within the parent - $result->mergeUses($scope->uses); - } - foreach ($inner_exiting_scope_list as $scope) { - // TODO: Make this properly recurse until it reaches the right depth (unnecessary right now) - $result->mergeUses($scope->uses); - } - - foreach ($def_key_set as $variable_name => $_) { - if ($merge_parent_scope) { - $defs_for_variable = $result->getDefinition($variable_name) ?? []; - } else { - $defs_for_variable = []; - } - - foreach ($branch_scopes as $scope) { - foreach ($scope->getDefinition($variable_name) ?? [] as $def_id => $_) { - $defs_for_variable[$def_id] = true; - } - } - $result->defs[$variable_name] = $defs_for_variable; - } - return $result; - } - - /** - * Record a statement that was unreachable due to break/continue statements. - * - * @param VariableTrackingBranchScope $inner_scope @phan-unused-param - * @param bool $exits true if the branch of $inner_scope will exit. @phan-unused-param - * This would mean that the branch uses variables, but does not define them outside of that scope. - * @return void - */ - public function recordSkippedScope(VariableTrackingBranchScope $inner_scope, bool $exits) - { - // Subclasses will implement this - } -} diff --git a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTrackerPlugin.php b/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTrackerPlugin.php deleted file mode 100644 index 865c8b0..0000000 --- a/vendor/phan/phan/src/Phan/Plugin/Internal/VariableTrackerPlugin.php +++ /dev/null @@ -1,424 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\Plugin\Internal; - -use AssertionError; -use ast; -use ast\Node; -use Exception; -use Phan\Config; -use Phan\Exception\CodeBaseException; -use Phan\Issue; -use Phan\IssueFixSuggester; -use Phan\Language\Element\Method; -use Phan\Language\Element\Variable; -use Phan\Plugin\Internal\VariableTracker\VariableGraph; -use Phan\Plugin\Internal\VariableTracker\VariableTrackerVisitor; -use Phan\Plugin\Internal\VariableTracker\VariableTrackingScope; -use Phan\PluginV2; -use Phan\PluginV2\PluginAwarePostAnalysisVisitor; -use Phan\PluginV2\PostAnalyzeNodeCapability; -use Phan\Suggestion; -use function count; -use function is_string; -use function strlen; - -/** - * NOTE: This is automatically loaded by phan based on config settings. - * Do not include it in the 'plugins' config. - */ -final class VariableTrackerPlugin extends PluginV2 implements - PostAnalyzeNodeCapability -{ - - /** - * @return string the name of a visitor - */ - public static function getPostAnalyzeNodeVisitorClassName() : string - { - return VariableTrackerElementVisitor::class; - } -} - -/** - * This will analyze any variable definition and uses within function-like scopes, - * and warn about unused variable definitions. - * - * TODO: Hook into the global scope as well? - */ -final class VariableTrackerElementVisitor extends PluginAwarePostAnalysisVisitor -{ - public function visitMethod(Node $node) - { - $this->analyzeMethodLike($node); - } - - /** - * @override - */ - public function visitFuncDecl(Node $node) - { - $this->analyzeMethodLike($node); - } - - /** - * @override - */ - public function visitClosure(Node $node) - { - $this->analyzeMethodLike($node); - } - - /** - * @return void - */ - private function analyzeMethodLike(Node $node) - { - // \Phan\Debug::printNode($node); - $stmts_node = $node->children['stmts'] ?? null; - if (!($stmts_node instanceof Node)) { - return; - } - $variable_graph = new VariableGraph(); - $scope = new VariableTrackingScope(); - $issue_categories = $this->addParametersAndUseVariablesToGraph($node, $variable_graph, $scope); - - try { - VariableTrackerVisitor::$variable_graph = $variable_graph; - $variable_tracker_visitor = new VariableTrackerVisitor($scope); - // TODO: Add params and use variables. - $variable_tracker_visitor->__invoke($stmts_node); - } finally { - // @phan-suppress-next-line PhanTypeMismatchProperty - VariableTrackerVisitor::$variable_graph = null; - } - $this->warnAboutVariableGraph($node, $variable_graph, $issue_categories); - } - - /** - * @return array<int,string> maps unique definition ids to issue types - */ - private function addParametersAndUseVariablesToGraph( - Node $node, - VariableGraph $graph, - VariableTrackingScope $scope - ) : array { - $result = []; - // AST_PARAM_LIST of AST_PARAM - foreach ($node->children['params']->children as $parameter) { - if (!($parameter instanceof Node)) { - throw new AssertionError("Expected params to be Nodes"); - } - $parameter_name = $parameter->children['name']; - if (!is_string($parameter_name)) { - continue; - } - // We narrow this down to the specific category if we need to warn. - $result[\spl_object_id($parameter)] = Issue::UnusedPublicMethodParameter; - - $graph->recordVariableDefinition($parameter_name, $parameter, $scope, null); - if ($parameter->flags & ast\flags\PARAM_REF) { - $graph->markAsReference($parameter_name); - } - } - foreach ($node->children['uses']->children ?? [] as $closure_use) { - if (!($closure_use instanceof Node)) { - throw new AssertionError("Expected uses to be nodes"); - } - $name = $closure_use->children['name']; - if (!is_string($name)) { - continue; - } - $result[\spl_object_id($closure_use)] = Issue::UnusedClosureUseVariable; - - $graph->recordVariableDefinition($name, $closure_use, $scope, null); - if ($closure_use->flags & ast\flags\PARAM_REF) { - $graph->markAsReference($name); - } - } - return $result; - } - - private function methodHasOverrides() : bool - { - if (Config::getValue('unused_variable_detection_assume_override_exists')) { - return true; - } - try { - $method = $this->context->getFunctionLikeInScope($this->code_base); - if (!($method instanceof Method)) { - // should never happen - return false; - } - - return $method->getIsOverride() || $method->getIsOverriddenByAnother(); - } catch (Exception $_) { - // should not happen - return false; - } - } - /** - * @return string - */ - private function getParameterCategory(Node $method_node) - { - $kind = $method_node->kind; - if ($kind === ast\AST_CLOSURE) { - return Issue::UnusedClosureParameter; - } elseif ($kind === ast\AST_FUNC_DECL) { - return Issue::UnusedGlobalFunctionParameter; - } - - $flags = $method_node->flags; - $final = $this->isParameterFinal($flags); - - if ($flags & ast\flags\MODIFIER_PRIVATE) { - return $final ? Issue::UnusedPrivateFinalMethodParameter : Issue::UnusedPrivateMethodParameter; - } elseif ($flags & ast\flags\MODIFIER_PROTECTED) { - if ($final) { - return Issue::UnusedProtectedFinalMethodParameter; - } - if (!$this->methodHasOverrides()) { - return Issue::UnusedProtectedNoOverrideMethodParameter; - } - return Issue::UnusedProtectedMethodParameter; - } - if ($final) { - return Issue::UnusedPublicFinalMethodParameter; - } - if (!$this->methodHasOverrides()) { - return Issue::UnusedPublicNoOverrideMethodParameter; - } - return Issue::UnusedPublicMethodParameter; - } - - private function isParameterFinal(int $flags) : bool - { - if (($flags & ast\flags\MODIFIER_FINAL) !== 0) { - return true; - } - $context = $this->context; - if ($context->isInClassScope()) { - try { - $class = $context->getClassInScope($this->code_base); - return $class->isFinal(); - } catch (CodeBaseException $_) { - } - } - return false; - } - - /** - * @param array<int,string> $issue_overrides_for_definition_ids maps definition ids to issue types - * @return void - */ - private function warnAboutVariableGraph( - Node $method_node, - VariableGraph $graph, - $issue_overrides_for_definition_ids - ) { - foreach ($graph->def_uses as $variable_name => $def_uses_for_variable) { - if ($variable_name === 'this') { - continue; - } - if (\preg_match('/^(_$|(unused|raii))/i', $variable_name) > 0) { - // Skip over $_, $unused*, and $raii* - continue; - } - if (Variable::isSuperglobalVariableWithName($variable_name)) { - continue; - } - $type_bitmask = $graph->variable_types[$variable_name] ?? 0; - if ($type_bitmask & VariableGraph::IS_REFERENCE_OR_GLOBAL_OR_STATIC) { - // @phan-suppress-next-line PhanPossiblyFalseTypeArgumentInternal - if (count($def_uses_for_variable) === 1 && count(reset($def_uses_for_variable)) === 0) { - $this->checkSingleDefinitionReferenceOrGlobalOrStatic($graph, $variable_name, $issue_overrides_for_definition_ids); - } - // don't warn about static/global/references - continue; - } - // Check for variable definitions that are unused - foreach ($def_uses_for_variable as $definition_id => $use_list) { - if (count($use_list) > 0) { - // Don't warn if there's at least one usage of that definition - continue; - } - $line = $graph->def_lines[$variable_name][$definition_id] ?? 1; - $issue_type = $issue_overrides_for_definition_ids[$definition_id] ?? Issue::UnusedVariable; - // Choose a more precise issue type - if ($issue_type === Issue::UnusedPublicMethodParameter) { - // Narrow down issues about parameters into more specific issues - $doc_comment = $method_node->children['docComment'] ?? null; - if ($doc_comment && \preg_match('/@param[^$]*\$' . \preg_quote($variable_name) . '\b.*@phan-unused-param\b/', $doc_comment)) { - // Don't warn about parameters marked with phan-unused-param - continue; - } - $issue_type = $this->getParameterCategory($method_node); - if (strpos($issue_type, 'NoOverride') === false && strpos($issue_type, 'MethodParameter') !== false) { - $alternate_issue_type = str_replace('MethodParameter', 'NoOverrideMethodParameter', $issue_type); - // @phan-suppress-next-line PhanAccessMethodInternal - if (Issue::shouldSuppressIssue($this->code_base, $this->context, $alternate_issue_type, $line, [$variable_name], null)) { - continue; - } - } - } elseif ($graph->isLoopValueDefinitionId($definition_id)) { - $issue_type = Issue::UnusedVariableValueOfForeachWithKey; - } elseif ($graph->isCaughtException($definition_id)) { - $issue_type = Issue::UnusedVariableCaughtException; - } - Issue::maybeEmitWithParameters( - $this->code_base, - $this->context, - $issue_type, - $line, - [$variable_name], - // compute the suggestion for $variable_name based on the $issue_type - self::makeSuggestion($graph, $variable_name, $issue_type) - ); - } - // Check for variables that could be replaced with constants or literals - if (Config::getValue('constant_variable_detection') && count($def_uses_for_variable) === 1) { - foreach ($def_uses_for_variable as $definition_id => $use_list) { - if (!$use_list) { - // We already warned that this was unused - continue; - } - $value_node = $graph->const_expr_declarations[$variable_name][$definition_id] ?? null; - if ($value_node === null) { - continue; - } - if (isset($graph->const_expr_declarations[$variable_name][-1])) { - // Set by recordVariableModification - continue; - } - $this->warnAboutCouldBeConstant($graph, $variable_name, $definition_id, $value_node); - } - } - } - } - - /** - * @param array<int,string> $issue_overrides_for_definition_ids maps definition ids to issue types - * @return void - */ - private function checkSingleDefinitionReferenceOrGlobalOrStatic( - VariableGraph $graph, - string $variable_name, - array $issue_overrides_for_definition_ids - ) { - $uses = $graph->def_uses[$variable_name]; - reset($uses); - $definition_id = key($uses); - $issue_type = $issue_overrides_for_definition_ids[$definition_id] ?? Issue::UnusedVariable; - if ($issue_type === Issue::UnusedPublicMethodParameter) { - return; - } - $type_bitmask = $graph->variable_types[$variable_name] ?? 0; - $line = $graph->def_lines[$variable_name][$definition_id] ?? 1; - if ($type_bitmask === VariableGraph::IS_REFERENCE) { - Issue::maybeEmitWithParameters( - $this->code_base, - $this->context, - Issue::UnusedVariableReference, - $line, - [$variable_name] - ); - } elseif ($type_bitmask === VariableGraph::IS_STATIC) { - Issue::maybeEmitWithParameters( - $this->code_base, - $this->context, - Issue::UnusedVariableStatic, - $line, - [$variable_name] - ); - } elseif ($type_bitmask === VariableGraph::IS_GLOBAL) { - Issue::maybeEmitWithParameters( - $this->code_base, - $this->context, - Issue::UnusedVariableGlobal, - $line, - [$variable_name] - ); - } - } - - /** - * @param Node|string|int|float $value_node - */ - private function warnAboutCouldBeConstant(VariableGraph $graph, string $variable_name, int $definition_id, $value_node) { - $issue_type = Issue::VariableDefinitionCouldBeConstant; - if ($value_node instanceof Node) { - if ($value_node->kind === ast\AST_ARRAY) { - if (count($value_node->children) === 0) { - $issue_type = Issue::VariableDefinitionCouldBeConstantEmptyArray; - } - } elseif ($value_node->kind === ast\AST_CONST) { - $name = strtolower((string)$value_node->children['name']->children['name'] ?? ''); - switch ($name) { - case 'false': - $issue_type = Issue::VariableDefinitionCouldBeConstantFalse; - break; - case 'true': - $issue_type = Issue::VariableDefinitionCouldBeConstantTrue; - break; - case 'null': - $issue_type = Issue::VariableDefinitionCouldBeConstantNull; - break; - } - } - } elseif (is_string($value_node)) { - $issue_type = Issue::VariableDefinitionCouldBeConstantString; - } elseif (is_int($value_node)) { - $issue_type = Issue::VariableDefinitionCouldBeConstantInt; - } elseif (is_float($value_node)) { - $issue_type = Issue::VariableDefinitionCouldBeConstantFloat; - } - $line = $graph->def_lines[$variable_name][$definition_id] ?? 1; - Issue::maybeEmitWithParameters( - $this->code_base, - $this->context, - $issue_type, - $line, - [$variable_name] - ); - } - - /** - * @return ?Suggestion - */ - private static function makeSuggestion(VariableGraph $graph, string $variable_name, string $issue_type) - { - if ($issue_type !== Issue::UnusedVariable) { - return null; - } - if (strlen($variable_name) <= 1) { - // No point in guessing short variable names - return null; - } - if (count($graph->def_uses[$variable_name] ?? []) > 1) { - // We've defined this variable in more than one place, assume it's not a typo - return null; - } - // Take all of the variables that were used anywhere else - // (don't account for reachability) - $variable_set = $graph->variable_types; - // Suggest any variables with a similar name (excluding $variable_name) that were used in this class scope - // It's possible that the usage just hasn't been typed out yet - unset($variable_set[$variable_name]); - if (count($variable_set) > Config::getValue('suggestion_check_limit')) { - return null; - } - $suggestion_set = IssueFixSuggester::getSuggestionsForStringSet($variable_name, $variable_set); - if (count($suggestion_set) === 0) { - return null; - } - - $suggestions = []; - foreach ($suggestion_set as $suggested_variable_name => $_) { - $suggestions[] = '$' . $suggested_variable_name; - } - \sort($suggestions); - - return Suggestion::fromString('Did you mean ' . \implode(' or ', $suggestions)); - } -} diff --git a/vendor/phan/phan/src/Phan/PluginV2.php b/vendor/phan/phan/src/Phan/PluginV2.php deleted file mode 100644 index 5869ad9..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2.php +++ /dev/null @@ -1,127 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use Phan\PluginV2\IssueEmitter; - -/** - * Plugins can be defined in the config and will have - * their hooks called at appropriate times during analysis - * of each file, class, method and function. - * - * Plugins must extend this class - * (And at least one of the interfaces corresponding to plugin capabilities) - * and return an instance of themselves. - * - * @link https://github.com/phan/phan/wiki/Writing-Plugins-for-Phan has additional resources for users writing a plugin. - * - * List of capabilities which a plugin may implement: - * - * 1. public function analyzeClass(CodeBase $code_base, Clazz $class) - * Analyze (and modify) a class definition, after parsing and before analyzing. - * (implement \Phan\PluginV2\AnalyzeClassCapability) - * - * 2. public function analyzeFunction(CodeBase $code_base, Func $function) - * Analyze (and modify) a function definition, after parsing and before analyzing. - * (implement \Phan\PluginV2\AnalyzeFunctionCapability) - * - * 3. public function analyzeMethod(CodeBase $code_base, Method $method) - * Analyze (and modify) a method definition, after parsing and before analyzing. - * (implement \Phan\PluginV2\AnalyzeMethodCapability) - * - * 4. public static function getPostAnalyzeNodeVisitorClassName() : string - * Returns the name of a class extending PluginAwarePostAnalysisVisitor, which will be used to analyze nodes in the analysis phase. - * If the PluginAwarePostAnalysisVisitor subclass has an instance property called parent_node_list, - * Phan will automatically set that property to the list of parent nodes (The nodes deepest in the AST are at the end of the list) - * (implement \Phan\PluginV2\PostAnalyzeNodeCapability) - * - * 5. public static function getPreAnalyzeNodeVisitorClassName() : string - * Returns the name of a class extending PluginAwarePreAnalysisVisitor, which will be used to pre-analyze nodes in the analysis phase. - * (implement \Phan\PluginV2\PreAnalyzeNodeCapability) - * - * 6. public function analyzeProperty(CodeBase $code_base, Property $property) - * Analyze (and modify) a property definition, after parsing and before analyzing. - * (implement \Phan\PluginV2\AnalyzePropertyCapability) - * - * 7. public function finalize(CodeBase $code_base) - * Called after the analysis phase is complete. - * (implement \Phan\PluginV2\FinalizeProcessCapability) - * - * 8. public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array<string, Closure(CodeBase,Context,Func|Method,array):void> - * Maps FQSEN of function or method to a closure used to analyze the function in question. - * 'MyClass::myMethod' can be used as the FQSEN of a static or instance method. - * See .phan/plugins/PregRegexCheckerPlugin.php as an example. - * - * Closure Type: function(CodeBase $code_base, Context $context, Func|Method $function, array $args) : void {...} - * - * (implement \Phan\PluginV2\AnalyzeFunctionCallCapability) - * 9. public function getReturnTypeOverrides(CodeBase $code_base) : array<string,Closure(CodeBase,Context,Func|Method,array):UnionType> - * Maps FQSEN of function or method to a closure used to override the returned UnionType. - * See \Phan\Plugin\Internal\ArrayReturnTypeOverridePlugin as an example (That is automatically loaded by phan) - * - * Closure type: function(CodeBase $code_base, Context $context, Func|Method $function, array $args) : UnionType {...} - * (implement \Phan\PluginV2\ReturnTypeOverrideCapability) - * 10. public function shouldSuppress(CodeBase $code_base, IssueInstance $instance, string $file_contents) : bool - * - * Called in every phase when Phan is emitting an issue(parse, method, analysis, etc) - * - * public function getIssueSuppressionList(CodeBase $code_base, string $file_path) : array<string,array<int,int>> - * - * Called by UnusedSuppressionPlugin to check if the plugin's suppressions are no longer needed. - * - * (implement \Phan\PluginV2\SuppressionCapability) - * 11. public function beforeAnalyze(CodeBase $code_base) : void - * - * Called before analyzing a project (e.g. to run checks before analysis) - * beforeAnalyze is invoked immediately before forking analysis workers and before starting the analysis phase. - * - * (implement \Phan\PluginV2\BeforeAnalyzeCapability) - * 12. public function beforeAnalyzeFile(CodeBase $code_base, Context $context, string $file_contents, Node $node); - * - * Called before analyzing a file (with the absolute path Config::projectPath($context->getFile())). - * NOTE: This does not run on empty files. - * - * (implement \Phan\PluginV2\BeforeAnalyzeFileCapability) - * 13. public function afterAnalyzeFile(CodeBase $code_base, Context $context, string $file_contents, Node $node); - * - * This method is called after Phan analyzes a file. - * - * (implement \Phan\PluginV2\AfterAnalyzeFileCapability) - * 14. public function handleLazyLoadInternalFunction(CodeBase $code_base, Func $function) - * - * This method is called after Phan lazily loads a global internal function. - * This is useful to handle functions getAnalyzeFunctionCallClosures did not pick up - * - * (implement \Phan\PluginV2\HandleLazyLoadInternalFunctionCapability) - * 15. getAutomaticFixers() : array<string,Closure(CodeBase,FileCacheEntry,IssueInstance):(?FileEditSet)> - * - * This method is called to fetch the issue names the plugin can sometimes automatically fix. - * Returns a map from issue name to the closure to generate a fix for instances of that issue. - * - * (implement \Phan\PluginV2\AutomaticFixCapability) - * - * TODO: Implement a way to notify plugins that a parsed file is no longer valid, - * if the replacement for pcntl is being used. - * (Most of the plugins bundled with Phan don't need this) - */ -abstract class PluginV2 -{ - use IssueEmitter { - emitPluginIssue as emitIssue; - } - - /** - * The above declares this function signature: - * - * public function emitIssue( - * CodeBase $code_base, - * Context $context, - * string $issue_type, - * string $issue_message_fmt, - * array $issue_message_args = [], - * int $severity = Issue::SEVERITY_NORMAL, - * int $remediation_difficulty = Issue::REMEDIATION_B, - * int $issue_type_id = Issue::TYPE_ID_UNKNOWN - * ) - */ -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/AfterAnalyzeFileCapability.php b/vendor/phan/phan/src/Phan/PluginV2/AfterAnalyzeFileCapability.php deleted file mode 100644 index 18c86eb..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/AfterAnalyzeFileCapability.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use ast\Node; -use Phan\CodeBase; -use Phan\Language\Context; - -/** - * AfterAnalyzeFileCapability is used when you want to perform checks after analyzing a file - * NOTE: This does not run on empty files. - */ -interface AfterAnalyzeFileCapability -{ - /** - * This method is called after Phan analyzes a file. - * - * @param CodeBase $code_base - * The code base in which the node exists - * - * @param Context $context - * A context with the file name for $file_contents and the scope after analyzing $node. - * - * @param string $file_contents the unmodified file contents - * @param Node $node the node parsed from $file_contents - * @return void - */ - public function afterAnalyzeFile( - CodeBase $code_base, - Context $context, - string $file_contents, - Node $node - ); -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/AnalyzeClassCapability.php b/vendor/phan/phan/src/Phan/PluginV2/AnalyzeClassCapability.php deleted file mode 100644 index 6175f13..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/AnalyzeClassCapability.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Phan\CodeBase; -use Phan\Language\Element\Clazz; - -/** - * Plugins should implement this to be called to - * analyze (and possibly modify) a class definition, after parsing and before analyzing. - */ -interface AnalyzeClassCapability -{ - /** - * Analyze (and modify) a class definition, after parsing and before analyzing. - * - * @param CodeBase $code_base - * The code base in which the class exists - * - * @param Clazz $class - * A class being analyzed - * - * @return void - */ - public function analyzeClass( - CodeBase $code_base, - Clazz $class - ); -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/AnalyzeFunctionCallCapability.php b/vendor/phan/phan/src/Phan/PluginV2/AnalyzeFunctionCallCapability.php deleted file mode 100644 index 2f0ced2..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/AnalyzeFunctionCallCapability.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Phan\CodeBase; - -/** - * AnalyzeFunctionCallCapability is used when you want to analyze the parameters passed to a function or method, whether or not the return value is used. - * (e.g. for analyzing `my_printf($fmtstr, ...$args)`) - * - * @see ReturnTypeOverrideCapability for making the return type depend on the passed in parameters. - */ -interface AnalyzeFunctionCallCapability -{ - /** - * @return array<string,\Closure> - * maps FQSEN of function or method to a closure used to analyze the function in question. - * '\A::foo' or 'A::foo' as a key will override a method, and '\foo' or 'foo' as a key will override a function. - * Closure Type: function(CodeBase $code_base, Context $context, Func|Method $function, array $args) : void {...} - */ - public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array; -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/AnalyzeFunctionCapability.php b/vendor/phan/phan/src/Phan/PluginV2/AnalyzeFunctionCapability.php deleted file mode 100644 index cdfb59e..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/AnalyzeFunctionCapability.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Phan\CodeBase; -use Phan\Language\Element\Func; - -/** - * Plugins should implement this to analyze (and modify) a function definition, - * after parsing and before analyzing. - */ -interface AnalyzeFunctionCapability -{ - /** - * Analyze (and modify) a function definition, after parsing and before analyzing. - * - * @param CodeBase $code_base - * The code base in which the function exists - * - * @param Func $function - * A function being analyzed - * - * @return void - */ - public function analyzeFunction( - CodeBase $code_base, - Func $function - ); -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/AnalyzeMethodCapability.php b/vendor/phan/phan/src/Phan/PluginV2/AnalyzeMethodCapability.php deleted file mode 100644 index 617d596..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/AnalyzeMethodCapability.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Phan\CodeBase; -use Phan\Language\Element\Method; - -/** - * Plugins can implement this to analyze (and modify) a method definition, - * after parsing and before analyzing. - */ -interface AnalyzeMethodCapability -{ - /** - * Analyze (and modify) a method definition, after parsing and before analyzing. - * - * @param CodeBase $code_base - * The code base in which the method exists - * - * @param Method $method - * A method being analyzed - * - * @return void - */ - public function analyzeMethod( - CodeBase $code_base, - Method $method - ); -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/AnalyzePropertyCapability.php b/vendor/phan/phan/src/Phan/PluginV2/AnalyzePropertyCapability.php deleted file mode 100644 index 92134c9..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/AnalyzePropertyCapability.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Phan\CodeBase; -use Phan\Language\Element\Property; - -/** - * Plugins can implement this to analyze (and modify) a property definition, - * after parsing and before analyzing. - */ -interface AnalyzePropertyCapability -{ - /** - * Analyze (and modify) a property definition, - * after parsing and before analyzing. - * - * @param CodeBase $code_base - * The code base in which the property exists - * - * @param Property $property - * A property being analyzed - * - * @return void - */ - public function analyzeProperty( - CodeBase $code_base, - Property $property - ); -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/AutomaticFixCapability.php b/vendor/phan/phan/src/Phan/PluginV2/AutomaticFixCapability.php deleted file mode 100644 index ad5bc98..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/AutomaticFixCapability.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Closure; -use Phan\CodeBase; -use Phan\IssueInstance; -use Phan\Library\FileCacheEntry; -use Phan\Plugin\Internal\IssueFixingPlugin\FileEditSet; - -/** - * AutomaticFixCapability is used when you want to support --automatic-fix - * for issue types emitted by the plugin (or other issue types) - */ -interface AutomaticFixCapability -{ - /** - * This method is called to fetch the issue names the plugin can sometimes automatically fix. - * Returns a map from issue name to the closure to generate a fix for instances of that issue. - * - * @return array<string,Closure(CodeBase,FileCacheEntry,IssueInstance):(?FileEditSet)> - */ - public function getAutomaticFixers() : array; -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/BeforeAnalyzeCapability.php b/vendor/phan/phan/src/Phan/PluginV2/BeforeAnalyzeCapability.php deleted file mode 100644 index c803c25..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/BeforeAnalyzeCapability.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Phan\CodeBase; - -/** - * BeforeAnalyzeCapability is used when you want to perform checks before analyzing a project. - * - * beforeAnalyze is invoked immediately before forking analysis workers and before starting the analysis phase. - */ -interface BeforeAnalyzeCapability -{ - /** - * This method is called before analyzing a project. - * - * @param CodeBase $code_base - * The code base of the project. - * @return void - */ - public function beforeAnalyze( - CodeBase $code_base - ); -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/BeforeAnalyzeFileCapability.php b/vendor/phan/phan/src/Phan/PluginV2/BeforeAnalyzeFileCapability.php deleted file mode 100644 index 53062ac..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/BeforeAnalyzeFileCapability.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use ast\Node; -use Phan\CodeBase; -use Phan\Language\Context; - -/** - * BeforeAnalyzeFileCapability is used when you want to perform checks before analyzing a file - * NOTE: This does not run on empty files. - */ -interface BeforeAnalyzeFileCapability -{ - /** - * This method is called before analyzing a file. - * - * @param CodeBase $code_base - * The code base in which the node exists - * - * @param Context $context - * A context with the file name for $file_contents and the scope before analyzing $node. - * - * @param string $file_contents the unmodified file contents - * @param Node $node the node parsed from $file_contents - * @return void - */ - public function beforeAnalyzeFile( - CodeBase $code_base, - Context $context, - string $file_contents, - Node $node - ); -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/FinalizeProcessCapability.php b/vendor/phan/phan/src/Phan/PluginV2/FinalizeProcessCapability.php deleted file mode 100644 index 846ed9d..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/FinalizeProcessCapability.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Phan\CodeBase; - -/** - * Plugins can implement this to be called after other forms of analysis are finished running - */ -interface FinalizeProcessCapability -{ - /** - * This is called after the other forms of analysis are finished running. - * Useful if a PluginV2 needs to aggregate results of analysis. - * This may be used to emit additional issues. - * - * This is run once per forked analysis process. - * Some plugins using this, such as UnusedSuppressionPlugin, - * will not work as expected with more than one process. - * If possible, write plugins to emit issues immediately. - * - * @return void - */ - public function finalizeProcess(CodeBase $code_base); -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/HandleLazyLoadInternalFunctionCapability.php b/vendor/phan/phan/src/Phan/PluginV2/HandleLazyLoadInternalFunctionCapability.php deleted file mode 100644 index f4fd34b..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/HandleLazyLoadInternalFunctionCapability.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Phan\CodeBase; -use Phan\Language\Element\Func; - -/** - * HandleLazyLoadInternalFunctionCapability is used when you want to modify some subset of global functions used in the program, - * when some global functions (such as register_shutdown_function) won't be loaded until the analysis phase. - */ -interface HandleLazyLoadInternalFunctionCapability -{ - /** - * This method is called after Phan lazily loads a global internal function. - * - * @param CodeBase $code_base - * The code base in which the function exists - * - * @param Func $function - * The function that was just now added to $code_base - * - * @return void - */ - public function handleLazyLoadInternalFunction( - CodeBase $code_base, - Func $function - ); -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/IssueEmitter.php b/vendor/phan/phan/src/Phan/PluginV2/IssueEmitter.php deleted file mode 100644 index 53c2f2c..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/IssueEmitter.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Phan\CodeBase; -use Phan\Issue; -use Phan\IssueInstance; -use Phan\Language\Context; -use Phan\Language\Element\TypedElement; -use Phan\Language\Element\UnaddressableTypedElement; -use Phan\Language\FQSEN; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Suggestion; - -/** - * A trait which allows plugins to emit issues with custom error messages - */ -trait IssueEmitter -{ - /** - * Emit an issue if it is not suppressed - * - * @param CodeBase $code_base - * The code base in which the issue was found - * - * @param Context $context - * The context in which the issue was found - * - * @param string $issue_type - * A name for the type of issue such as 'PhanPluginMyIssue' - * - * @param string $issue_message_fmt - * The complete issue message format string to emit such as - * 'class with fqsen {CLASS} is broken in some fashion' (preferred) - * or 'class with fqsen %s is broken in some fashion' - * The list of placeholders for between braces can be found - * in \Phan\Issue::UNCOLORED_FORMAT_STRING_FOR_TEMPLATE. - * - * @param array<int,string|int|float|Type|UnionType|FQSEN|TypedElement|UnaddressableTypedElement> $issue_message_args - * The arguments for this issue format. - * If this array is empty, $issue_message_args is kept in place - * - * @param int $severity - * A value from the set {Issue::SEVERITY_LOW, - * Issue::SEVERITY_NORMAL, Issue::SEVERITY_HIGH}. - * - * @param int $remediation_difficulty - * A guess at how hard the issue will be to fix from the - * set {Issue:REMEDIATION_A, Issue:REMEDIATION_B, ... - * Issue::REMEDIATION_F} with F being the hardest. - * - * @param int $issue_type_id An issue id for pylint - * - * @param ?Suggestion $suggestion - * If this plugin has suggestions on how to fix the issue, - * this can be added separately from the issue text. - * - * @return void - */ - public static function emitPluginIssue( - CodeBase $code_base, - Context $context, - string $issue_type, - string $issue_message_fmt, - array $issue_message_args = [], - int $severity = Issue::SEVERITY_NORMAL, - int $remediation_difficulty = Issue::REMEDIATION_B, - int $issue_type_id = Issue::TYPE_ID_UNKNOWN, - Suggestion $suggestion = null - ) { - $issue = new Issue( - $issue_type, - Issue::CATEGORY_PLUGIN, - $severity, - $issue_message_fmt, - $remediation_difficulty, - $issue_type_id - ); - - $issue_instance = new IssueInstance( - $issue, - $context->getFile(), - $context->getLineNumberStart(), - $issue_message_args, - $suggestion - ); - - Issue::maybeEmitInstance( - $code_base, - $context, - $issue_instance - ); - } -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/PluginAwareBaseAnalysisVisitor.php b/vendor/phan/phan/src/Phan/PluginV2/PluginAwareBaseAnalysisVisitor.php deleted file mode 100644 index 708a01e..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/PluginAwareBaseAnalysisVisitor.php +++ /dev/null @@ -1,106 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use ast\Node; -use Phan\AST\AnalysisVisitor; -use Phan\AST\Visitor\Element; -use Phan\Issue; - -/** - * This augments AnalysisVisitor with public and internal methods. - */ -abstract class PluginAwareBaseAnalysisVisitor extends AnalysisVisitor -{ - use IssueEmitter; // defines emitPluginIssue - - /** - * This is an empty visit() body. - * Don't override this unless you need to, analysis is more efficient if Phan knows it doesn't need to call a plugin on a node type. - * @see self::isDefinedInSubclass() - * @param Node $node @phan-unused-param (unused because the body is empty) - * - * @return void - */ - public function visit(Node $node) - { - } - - /** - * Emit an issue with the provided arguments, - * unless that issue is suppressed. - * - * @param string $issue_type - * A name for the type of issue such as 'PhanPluginMyIssue' - * - * @param string $issue_message_fmt - * The complete issue message format string to emit such as - * 'class with fqsen {CLASS} is broken in some fashion' (preferred) - * or 'class with fqsen %s is broken in some fashion' - * The list of placeholders for between braces can be found - * in \Phan\Issue::UNCOLORED_FORMAT_STRING_FOR_TEMPLATE. - * - * @param array<int,string> $issue_message_args - * The arguments for this issue format. - * If this array is empty, $issue_message_args is kept in place - * - * @param int $severity - * A value from the set {Issue::SEVERITY_LOW, - * Issue::SEVERITY_NORMAL, Issue::SEVERITY_HIGH}. - * - * @param int $remediation_difficulty - * A guess at how hard the issue will be to fix from the - * set {Issue:REMEDIATION_A, Issue:REMEDIATION_B, ... - * Issue::REMEDIATION_F} with F being the hardest. - * @suppress PhanUnreferencedPublicMethod (this plugin type is deprecated) - * @return void - */ - public function emit( - string $issue_type, - string $issue_message_fmt, - array $issue_message_args = [], - int $severity = Issue::SEVERITY_NORMAL, - int $remediation_difficulty = Issue::REMEDIATION_B, - int $issue_type_id = Issue::TYPE_ID_UNKNOWN - ) { - $this->emitPluginIssue( - $this->code_base, - $this->context, - $issue_type, - $issue_message_fmt, - $issue_message_args, - $severity, - $remediation_difficulty, - $issue_type_id - ); - } - - // Internal methods used by ConfigPluginSet are below. - // They aren't useful for plugins. - - /** - * @return array<int,int> The list of $node->kind values this plugin is capable of analyzing. - */ - final public static function getHandledNodeKinds() : array - { - $defines_visit = self::isDefinedInSubclass('visit'); - $kinds = []; - foreach (Element::VISIT_LOOKUP_TABLE as $kind => $method_name) { - if ($defines_visit || self::isDefinedInSubclass($method_name)) { - $kinds[] = $kind; - } - } - return $kinds; - } - - /** - * @return bool true if $method_name is defined by the subclass of PluginAwareBaseAnalysisVisitor, - * and not by PluginAwareBaseAnalysisVisitor or one of its parents. - */ - private static function isDefinedInSubclass(string $method_name) : bool - { - $method = new \ReflectionMethod(static::class, $method_name); - return \is_subclass_of($method->getDeclaringClass()->name, self::class); - } - // End of methods for internal use. -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/PluginAwarePostAnalysisVisitor.php b/vendor/phan/phan/src/Phan/PluginV2/PluginAwarePostAnalysisVisitor.php deleted file mode 100644 index 18bae80..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/PluginAwarePostAnalysisVisitor.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -// use ast\Node; - -/** - * For plugins which define their own post-order analysis behaviors in the analysis phase. - * Called on a node after PluginAwarePreAnalysisVisitor implementations. - * - * - visit<VisitSuffix>(...) (Override these methods) - * - emitPluginIssue(CodeBase $code_base, Config $config, ...) (Call these methods) - * - emit(...) - * - Public methods from Phan\AST\AnalysisVisitor - * - * NOTE: Subclasses should not implement the visit() method unless they absolutely need to. - * (E.g. if the body would be empty, or if it could be replaced with a few methods such as visitFuncDecl, visitVar, etc. that are more specific) - * - * - Phan is able to figure out which methods a subclass implements, and only call the plugin's visitor for those types, - * but only when the plugin's visitor does not override the fallback visit() method. - */ -abstract class PluginAwarePostAnalysisVisitor extends PluginAwareBaseAnalysisVisitor -{ - // Subclasses should declare protected $parent_node_list as an instance property if they need to know the list. - - // @var array<int,Node> - Set after the constructor is called if an instance property with this name is declared - // protected $parent_node_list; - - // Implementations should omit the constructor or call parent::__construct(CodeBase $code_base, Context $context) -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/PluginAwarePreAnalysisVisitor.php b/vendor/phan/phan/src/Phan/PluginV2/PluginAwarePreAnalysisVisitor.php deleted file mode 100644 index 1839280..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/PluginAwarePreAnalysisVisitor.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -/** - * For plugins which define their own pre-order analysis behaviors in the analysis phase. - * Called on a node before PluginAwarePreAnalysisVisitor implementations. - * - * Public APIs for use by plugins: - * - * - visit<VisitSuffix>(...) (Override these methods) - * - emitPluginIssue(CodeBase $code_base, Config $config, ...) (Call these methods) - * - emit(...) - * - Public methods from Phan\AST\AnalysisVisitor - * - * NOTE: Subclasses should not implement the visit() method unless they absolutely need to. - * (E.g. if the body would be empty, or if it could be replaced with a few methods such as visitFuncDecl, visitVar, etc. that are more specific) - * - * - Phan is able to figure out which methods a subclass implements, and only call the plugin's visitor for those types, - * but only when the plugin's visitor does not override the fallback visit() method. - */ -abstract class PluginAwarePreAnalysisVisitor extends PluginAwareBaseAnalysisVisitor -{ - // Subclasses should declare protected $parent_node_list as an instance property if they need to know the list. - - // @var array<int,Node> - Set after the constructor is called if an instance property with this name is declared - // protected $parent_node_list; - - // Implementations should omit the constructor or call parent::__construct(CodeBase $code_base, Context $context) -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/PostAnalyzeNodeCapability.php b/vendor/phan/phan/src/Phan/PluginV2/PostAnalyzeNodeCapability.php deleted file mode 100644 index c7e4398..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/PostAnalyzeNodeCapability.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -/** - * Plugins can implement this to have their visitor run to analyze a node in the analysis phase - * (To post-analyze the node) - * - * @see PostAnalyzeNodeCapability::getPostAnalyzeNodeVisitorClassName() - * - * Note: If $this->parent_node_list is declared as an instance property, then that will automatically get set. - * $this->parent_node_list will have the elements closest to the current node at the end. - * - * - If that property is absent, it will not be set. - */ -interface PostAnalyzeNodeCapability -{ - /** - * Returns the name of the visitor class to be instantiated and invoked to analyze a node in the analysis phase. - * (To post-analyze a node) - * (PostAnalyzeNodeCapability is run after PreAnalyzeNodeCapability and after analysis of child nodes) - * - * The class should be created by the plugin visitor, and must extend PluginAwarePostAnalysisVisitor. - * - * If state needs to be shared with a visitor and a plugin, a plugin author may use static variables of that plugin. - * - * @return string - The name of a class extending PluginAwarePostAnalysisVisitor - */ - public static function getPostAnalyzeNodeVisitorClassName() : string; -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/PreAnalyzeNodeCapability.php b/vendor/phan/phan/src/Phan/PluginV2/PreAnalyzeNodeCapability.php deleted file mode 100644 index af23f4a..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/PreAnalyzeNodeCapability.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -/** - * Plugins can implement this to specify a visitor to pre-analyze a node in the analysis phase. - * - * @see PreAnalyzeNodeCapability::getPreAnalyzeNodeVisitorClassName() - * - * Note: If $this->parent_node_list is declared as an instance property, then that will automatically get set. - * $this->parent_node_list will have the elements closest to the current node at the end. - * - * - If that property is absent, it will not be set. - */ -interface PreAnalyzeNodeCapability -{ - /** - * Returns the name of the visitor class to be instantiated and invoked to pre-analyze a node in the analysis phase. - * (To pre-analyze a node) - * (PreAnalyzeNodeCapability is run before PostAnalyzeNodeCapability and before analysis of child nodes) - * - * The class should be created by the plugin visitor, and must extend PluginAwarePreAnalysisVisitor. - * - * If state needs to be shared with a visitor and a plugin, a plugin author may use static variables of that plugin. - * - * @return string - The name of a class extending PluginAwarePreAnalysisVisitor - */ - public static function getPreAnalyzeNodeVisitorClassName() : string; -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/ReturnTypeOverrideCapability.php b/vendor/phan/phan/src/Phan/PluginV2/ReturnTypeOverrideCapability.php deleted file mode 100644 index 8d934e3..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/ReturnTypeOverrideCapability.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Phan\CodeBase; - -/** - * ReturnTypeOverrideCapability is used when you want to get a return type of a function or method that is dependent on the arguments. - * (e.g. for analyzing `my_printf`) - * - * @see AnalyzeFunctionCallCapability for analyzing the parameters whether or not return types are used. - */ -interface ReturnTypeOverrideCapability -{ - /** - * @return array<string,\Closure> - * maps FQSEN of function or method to a closure used to override the returned UnionType. - * The returned type is not validated. - * '\A::foo' as a key will override a method, and '\foo' as a key will override a function. - * Closure type: function(CodeBase $code_base, Context $context, Func|Method $function, array $args) : UnionType {...} - */ - public function getReturnTypeOverrides(CodeBase $code_base) : array; -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/StopParamAnalysisException.php b/vendor/phan/phan/src/Phan/PluginV2/StopParamAnalysisException.php deleted file mode 100644 index ac5c2c4..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/StopParamAnalysisException.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Exception; - -/** - * This is thrown to prevent Phan from running its own analysis after analyzeFunctionCall. - * - * This is used for tricky signatures such as join, which can take (array, string) or (string, array) when there are two arguments. - */ -class StopParamAnalysisException extends Exception -{ -} diff --git a/vendor/phan/phan/src/Phan/PluginV2/SuppressionCapability.php b/vendor/phan/phan/src/Phan/PluginV2/SuppressionCapability.php deleted file mode 100644 index 6e9d189..0000000 --- a/vendor/phan/phan/src/Phan/PluginV2/SuppressionCapability.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan\PluginV2; - -use Phan\CodeBase; -use Phan\Language\Context; -use Phan\Language\Element\TypedElement; -use Phan\Language\Element\UnaddressableTypedElement; -use Phan\Language\FQSEN; -use Phan\Language\Type; -use Phan\Language\UnionType; -use Phan\Suggestion; - -/** - * Plugins can implement this to suppress issues in additional ways. - * - * @see \Phan\Plugin\Internal\BuiltinSuppressionPlugin for an example of how to implement a plugin with this functionality - */ -interface SuppressionCapability -{ - /** - * This will be called if both of these conditions hold: - * - * 1. Phan's file and element-based suppressions did not suppress the issue - * 2. Earlier plugins didn't suppress the issue. - * - * To get the file's current contents, the recommended method is: - * - * $absolute_file_path = Config::projectPath($context->getFile()); - * $file_contents = \Phan\Library\FileCache::getOrReadEntry($absolute_file_path)->getContents() - * - * @param CodeBase $code_base - * - * @param Context $context context near where the issue occurred - * - * @param string $issue_type - * The type of issue to emit such as Issue::ParentlessClass - * - * @param int $lineno - * The line number where the issue was found - * - * @param array<int,string|int|float|bool|Type|UnionType|FQSEN|TypedElement|UnaddressableTypedElement> $parameters - * - * @param ?Suggestion $suggestion Phan's suggestion for how to fix the issue, if any. - * - * @return bool true if the given issue instance should be suppressed, given the current file contents. - */ - public function shouldSuppressIssue( - CodeBase $code_base, - Context $context, - string $issue_type, - int $lineno, - array $parameters, - $suggestion - ) : bool; - - /** - * This method is used only by UnusedSuppressionPlugin. - * It's optional to return lines for issues that were already suppressed. - * - * To get the file's current contents, the recommended method is: - * $file_contents = \Phan\Library\FileCache::getOrReadEntry(Config::projectPath($file_path))->getContents() - * - * @param CodeBase $code_base - * - * @param string $file_path the file to check for suppressions of - * - * @return array<string,array<int,int>> Maps 0 or more issue types to a *map* of lines that this plugin is going to suppress. - * The keys of the map are the lines being suppressed, and the values are the lines *causing* the suppressions (if extracted from comments or nodes) - * - * An empty array can be returned if this is unknown. - */ - public function getIssueSuppressionList( - CodeBase $code_base, - string $file_path - ) : array; -} diff --git a/vendor/phan/phan/src/Phan/Prep.php b/vendor/phan/phan/src/Phan/Prep.php deleted file mode 100644 index 5a572a1..0000000 --- a/vendor/phan/phan/src/Phan/Prep.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -use ast\Node; - -/** - * A utility that can be used to scan a list of files and apply a closure to every node. - * - * This is not invoked by ./phan - */ -class Prep -{ - - /** - * Scan a list of files, applying the given closure to every - * AST node - * - * @param array<int,string> $file_list - * A list of files to scan - * - * @param \Closure $visit_node - * A closure that is to be applied to every AST node - * - * @return void - */ - public static function scanFileList( - array $file_list, - \Closure $visit_node - ) { - foreach ($file_list as $file_path) { - // Convert the file to an Abstract Syntax Tree - // before passing it on to the recursive version - // of this method. - $node = \ast\parse_file( - $file_path, - Config::AST_VERSION - ); - - self::scanNodeInFile($node, $file_path, $visit_node); - } - } - - /** - * Recursively scan a node and its children applying the - * given closure to each. - * - * @param string $file_path - * The file in which the node exists - * - * @param \Closure $visit_node - * A closure that is to be applied to every AST node - * - * @return void - */ - public static function scanNodeInFile( - Node $node, - string $file_path, - \Closure $visit_node - ) { - // Visit the node doing whatever the caller - // likes - $visit_node($node, $file_path); - - // Scan all children recursively - foreach ($node->children as $child_node) { - if (!($child_node instanceof Node)) { - continue; - } - - self::scanNodeInFile($child_node, $file_path, $visit_node); - } - } -} diff --git a/vendor/phan/phan/src/Phan/Profile.php b/vendor/phan/phan/src/Phan/Profile.php deleted file mode 100644 index 9ba2a04..0000000 --- a/vendor/phan/phan/src/Phan/Profile.php +++ /dev/null @@ -1,104 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -/** - * Utility for profiling Phan runs. Used if the profiler_enabled config setting is true. - */ -trait Profile -{ - /** - * @var array<string,array<int,float>> - * Maps each phase of Phan analysis to a list of 1 or more durations (in seconds) spent in that phase. - */ - private static $label_delta_map = []; - - /** - * Measure the clock-time taken to execute the given - * closure and emit the time with the given label to - * a log. - * - * @param $label - * A label to emit with the time taken to run the - * given closure - * - * @param \Closure $closure - * Any closure to measure how long it takes to run - * - * @return mixed - * - * @suppress PhanUnreferencedProtectedMethod (unused, may use something similar in the future) - */ - protected static function time(string $label, \Closure $closure) - { - - if (!Config::getValue('profiler_enabled')) { - return $closure(); - } - - static $initialized = false; - if (!$initialized) { - self::initialize(); - $initialized = true; - } - - // Measure the time to execute the given closure - $start_time = \microtime(true); - $return_value = $closure(); - $end_time = \microtime(true); - - // Emit a log message - $delta = ($end_time - $start_time); - - self::$label_delta_map[$label][] = $delta; - - return $return_value; - } - - /** - * Initialize the profiler - */ - private static function initialize() - { - - // Create a shutdown function to emit the log when we're - // all done - \register_shutdown_function(static function () { - $label_metric_map = []; - - // Compute whatever metric we care about - foreach (self::$label_delta_map as $label => $delta_list) { - $total_time = \array_sum($delta_list); - $count = \count($delta_list); - $average_time = $total_time / $count; - $label_metric_map[$label] = [ - $count, - $total_time, - $average_time - ]; - } - - // Sort such that the highest metric value is on top - \uasort( - $label_metric_map, - /** - * @param array{0:int,1:float,2:float} $a - * @param array{0:int,1:float,2:float} $b - */ - static function (array $a, array $b) : int { - return $b[1] <=> $a[1]; - } - ); - - // Print it all out - foreach ($label_metric_map as $label => $metrics) { - print $label - . "\t" - . \implode("\t", \array_map(static function (float $v) : string { - return \sprintf("%0.6f", $v); - }, $metrics)) - . "\n"; - } - }); - } -} diff --git a/vendor/phan/phan/src/Phan/README.md b/vendor/phan/phan/src/Phan/README.md deleted file mode 100644 index c347ddf..0000000 --- a/vendor/phan/phan/src/Phan/README.md +++ /dev/null @@ -1,175 +0,0 @@ -Layout of src/Phan -================== - -Also see https://github.com/phan/phan/wiki/Developer%27s-Guide-To-Phan - -Folders -------- - -### Analysis -Classes that analyze ASTS. They may do one or more of the following things: - -- Emit issues. -- Update Phan's internal state. -- Compute inferences about a given block of code, and update Phan's state for that block (e.g. ConditionVisitor) -- See https://github.com/phan/phan/wiki/Developer%27s-Guide-To-Phan#parsing-and-analysis - -### AST - -Classes that work with ASTs - -- Classes -- ContextNode, which gets information about an AST in it's Context -- Base classes for the different types of visitors - -### Daemon - -Classes used when Phan is running in the background and receiving requests ("daemon mode"). Also see `LanguageServer/` - -- Classes for requests and responses the Phan-specific protocol (i.e. used by `phan_client`) -- Logic for forking off workers to analyze the `CodeBase`, then to receive the analysis results. - -### Debug - -Utilities for developers working on Phan to debug it. - -### Exception - -Exception classes used by Phan's implementation. - -### Language - -Contains data structures for representations of PHP code bases, and methods acting on those data structures. - -- E.g. `Context`, `Element`, `FQSEN`, `Internal`, `Scope`, `Type` -- See https://github.com/phan/phan/wiki/Developer%27s-Guide-To-Phan#core-concepts - -### LanguageServer - -Contains an implementation of the [Language Server Protocol](https://github.com/Microsoft/language-server-protocol), which is a common protocol supported in various IDEs. -Also see `Daemon/` - -- Classes that get received and sent over JSON RPC2 -- Logic for forking off workers to analyze the `CodeBase`, then to receive the analysis results. - -### Library - -Contains reusable data structures that aren't specific to analyzing PHP. (Map, Set, Option, Tuple, Hasher, etc.) - -### Output - -This contains implementation details for printing out Phan issues. -This includes formatters (text, JSON, pylint, etc.) as well as how Phan would colorize issues. - -### Parse - -This contains implementation details for Phan's initial parse phase. -In the parse phase, all code is parsed in order to build maps from FQSENs to elements. - -- See https://github.com/phan/phan/wiki/Developer%27s-Guide-To-Phan#parsing-and-analysis - -### Plugin - -This contains implementation details for working with the set of plugins loaded by the user (ConfigPluginSet). -`Plugin/Internal` also contains plugins Phan loads automatically (e.g. for improving analysis of `array_map`, `call_user_func`, etc.) - -### PluginV2 - -This contains the current implementation (v2) of the plugin system. -`*Capability.php` contains capabilities that PluginV2 instances can extend. -See https://github.com/phan/phan/wiki/Writing-Plugins-for-Phan for more information on plugin development. - -Files ------ - -### Analysis.php - -This class is the entry point into the static analyzer. - -### BlockAnalysisVisitor.php - -Analyze blocks of code. - -- Uses `\Phan\Analysis\PreOrderAnalysisVisitor` for pre-order analysis of a node (E.g. entering a function to analyze) -- Recursively analyzes child nodes -- Uses `\Phan\Analysis\PostOrderAnalysisVisitor` for post-order analysis of a node (E.g. analyzing a statement with the updated Context and emitting issues) -- If there is more than one possible child context, merges state from them (variable types) - -### Bootstrap.php - -Sets up error handlers, PHP configuration, and the composer autoloader. - -### CLI.php - -Contains methods for parsing CLI arguments to Phan, -outputting to the CLI, -as well as helper methods to retrieve files/folders for the analyzed project. - -### CodeBase.php - -A CodeBase represents the known state of a code base we're analyzing. -It maps FQSENs to the representation of the object for both scanned code and internal PHP elements. -See [Developer's Guide to Phan](https://github.com/phan/phan/wiki/Developer%27s-Guide-To-Phan) - -### Config.php - -Program configuration. The configuration data is overridden by the analyzed project's `.phan/config.php` as well as CLI options. - -### Daemon.php - -Implementation of daemon mode. (Daemon for `phan_client`). -Also see `LanguageServer/` - -### Debug.php - -Mostly utilities for printing representations of AST nodes. -Also see `Debug/` - -### ForkPool.php - -Contains the ForkPool used for running multiple analysis workers(i.e. `--processes N`) - -### IssueInstance.php - -Contains an emitted issue with issue details (file, line, format string arguments, etc.) - -### Issue.php - -Contains the list of built in issue types, as well as common information (Severity, issue names, format strings, remediation difficulty, etc.) - -### Memoize.php - -A utility trait to memoize (cache) the result of instance methods and static methods. - -### Ordering.php - -This determines the order in which files will be analyzed. -(Affected by `consistent_hashing_file_order` and `randomize_file_order`. -By default, files are analyzed in the same order as `.phan/config.php`) - -### Phan.php - -This executes the parse, method/function, then the analysis phases. - -This is the entry point of Phan's implementation. -Implementations such as `./phan` or the code climate integration call into this. - -### Plugin.php - -Deprecated version of plugin system, use PluginV2 instead. - -### PluginV2.php - -Plugins must extend this class -(And at least one of the interfaces corresponding to plugin capabilities in PluginV2 folder) -and return an instance of themselves. - -### Prep.php - -Part of a separate tool for scanning a code base. Not commonly used. - -### Profile.php - -For development only: Utility for profiling Phan runs. Used if the `profiler_enabled` config setting is true. - -### Util.php diff --git a/vendor/phan/phan/src/Phan/Suggestion.php b/vendor/phan/phan/src/Phan/Suggestion.php deleted file mode 100644 index 305e5b1..0000000 --- a/vendor/phan/phan/src/Phan/Suggestion.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php declare(strict_types=1); - -namespace Phan; - -/** - * This may be extended later to support the language server protocol - * (E.g. will contain a representation of 1 or more edit that would actually fix the UndeclaredVariable error) - */ -final class Suggestion -{ - /** @var string the text of the suggestion */ - private $message; - - /** @var mixed internal data not shown in error messages */ - private $internal_data; - - private function __construct(string $message) - { - $this->message = $message; - } - - /** - * Create a Suggestion suggesting $message - */ - public static function fromString(string $message) : Suggestion - { - return new self($message); - } - - /** - * Contains the text of the suggestion to fix the issue - */ - public function getMessage() : string - { - return $this->message; - } - - /** - * Contains the text of the suggestion to fix the issue - */ - public function __toString() : string - { - return $this->message; - } - - /** - * Sets additional data. - * This can be used by plugins implementing --automatic-fix, for example. - * (Create a Suggestion with the empty string if the suggestion should not be visible in error messages) - * - * @param mixed $data - * @return void - * @suppress PhanUnreferencedPublicMethod - */ - public function setInternalData($data) - { - $this->internal_data = $data; - } - - /** - * Gets additional data. - * This can be used by plugins implementing --automatic-fix, for example. - * @return mixed - * @suppress PhanUnreferencedPublicMethod - */ - public function getInternalData() - { - return $this->internal_data; - } -} diff --git a/vendor/phan/phan/src/codebase.php b/vendor/phan/phan/src/codebase.php deleted file mode 100644 index 313349f..0000000 --- a/vendor/phan/phan/src/codebase.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php declare(strict_types=1); - -// Grab these before we define our own classes -$internal_class_name_list = get_declared_classes(); -$internal_interface_name_list = get_declared_interfaces(); -$internal_trait_name_list = get_declared_traits(); -$internal_function_name_list = get_defined_functions()['internal']; - -use Composer\XdebugHandler\XdebugHandler; -use Phan\CodeBase; -use Phan\Library\StderrLogger; - -// Load the autoloader, check if Phan will work, etc. -require_once __DIR__ . '/Phan/Bootstrap.php'; - -// Automatically restart if xdebug is loaded -if (extension_loaded('xdebug')) { - // Restart if xdebug is loading, unless the environment variable PHAN_ALLOW_XDEBUG is set. - $handler = new XdebugHandler('phan'); - if (!getenv('PHAN_DISABLE_XDEBUG_WARN')) { - fwrite(STDERR, <<<EOT -[info] Disabling xdebug: Phan is around five times as slow when xdebug is enabled (xdebug only makes sense when debugging Phan itself) -[info] To run Phan with xdebug, set the environment variable PHAN_ALLOW_XDEBUG to 1. -[info] To disable this warning, set the environment variable PHAN_DISABLE_XDEBUG_WARN to 1. -[info] To include function signatures of xdebug, see .phan/internal_stubs/xdebug.phan_php - -EOT - ); - $handler->setLogger(new StderrLogger()); - } - - $handler->check(); -} - -return new CodeBase( - $internal_class_name_list, - $internal_interface_name_list, - $internal_trait_name_list, - CodeBase::getPHPInternalConstantNameList(), - $internal_function_name_list -); diff --git a/vendor/phan/phan/src/phan.php b/vendor/phan/phan/src/phan.php deleted file mode 100644 index 30bada5..0000000 --- a/vendor/phan/phan/src/phan.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php declare(strict_types=1); - -// Phan does a ton of GC and this offers a major speed -// improvement if your system can handle it (which it -// should be able to) -gc_disable(); - -// Check the environment to make sure Phan can run successfully -require_once(__DIR__ . '/requirements.php'); - -// Build a code base based on PHP internally defined -// functions, methods and classes before loading our -// own -$code_base = require_once(__DIR__ . '/codebase.php'); - -require_once(__DIR__ . '/Phan/Bootstrap.php'); - -use Phan\CLI; -use Phan\Phan; - -// Create our CLI interface and load arguments -$cli = CLI::fromArgv(); - -// Analyze the file list provided via the CLI -$is_issue_found = - Phan::analyzeFileList( - $code_base, - /** @return array<int,string> */ - static function (bool $recompute_file_list = false) use ($cli) : array { - if ($recompute_file_list) { - $cli->recomputeFileList(); - } - return $cli->getFileList(); - } // Daemon mode will reload the file list. - ); - -// Provide an exit status code based on if -// issues were found -exit($is_issue_found ? EXIT_ISSUES_FOUND : EXIT_SUCCESS); diff --git a/vendor/phan/phan/src/prep.php b/vendor/phan/phan/src/prep.php deleted file mode 100644 index 0d542cf..0000000 --- a/vendor/phan/phan/src/prep.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php declare(strict_types=1); - -// Phan does a ton of GC and this offers a major speed -// improvement if your system can handle it (which it -// should be able to) -gc_disable(); - -// Check the environment to make sure Phan can run successfully -require_once __DIR__ . '/requirements.php'; -require_once __DIR__ . '/Phan/Bootstrap.php'; - -use Phan\CLI; -use Phan\Prep; - -// Create our CLI interface and load arguments -$cli = CLI::fromArgv(); - -$file_list = $cli->getFileList(); - -// This is an example visitor. Do whatever you like here -// to scan all nodes. -$visit_node = static function (\ast\Node $node, string $file_path) { - - // Take a look at Phan\AST\Visitor\Element to see all - // of the kinds of nodes - if ($node->kind == \ast\AST_CLASS_CONST) { - // Debug::printNode($node); - - if (\is_string($node->children['const'])) { - $name = $node->children['const']; - if (preg_match('/.*SEARCH.*/', $name)) { - print "$file_path:{$node->lineno} $name\n"; - } - } - } -}; - -// Apply the closure to every single node in the -// code base -Prep::scanFileList($file_list, $visit_node); diff --git a/vendor/phan/phan/src/requirements.php b/vendor/phan/phan/src/requirements.php deleted file mode 100644 index fc953db..0000000 --- a/vendor/phan/phan/src/requirements.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php declare(strict_types=1); - -if ((int)phpversion()[0] < 7) { - fwrite( - STDERR, - 'Phan requires PHP version 7 or greater. See https://github.com/phan/phan#getting-started for more details.' - ); - exit(1); -} - -if (!(file_exists(__DIR__ . '/../vendor/autoload.php') || file_exists(__DIR__ . '/../../../autoload.php'))) { - fwrite( - STDERR, - 'Autoloader not found. Make sure you run `composer install` before running Phan. See https://github.com/phan/phan#getting-started for more details.' - ); - exit(1); -} - -// Fix Turkish locales(tr_TR) - strtolower('I') is not 'i', so phan lookup might fail. -// (But continue formatting times, etc. in the user's locale) -setlocale(LC_CTYPE, 'C'); diff --git a/vendor/phan/phan/src/spl_object_id.php b/vendor/phan/phan/src/spl_object_id.php deleted file mode 100644 index 6d152f2..0000000 --- a/vendor/phan/phan/src/spl_object_id.php +++ /dev/null @@ -1,60 +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')) { - return; -} -if (function_exists('runkit_object_id') && - !(new ReflectionFunction('runkit_object_id'))->isUserDefined()) { // @phan-suppress-current-line PhanUndeclaredFunctionInCallable - /** - * 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 - * @suppress PhanRedefineFunctionInternal, PhanRedefineFunction - * @suppress PhanUndeclaredFunction - * @suppress UnusedSuppression - */ - function spl_object_id($object) - { - 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) - * @suppress PhanRedefineFunctionInternal, PhanRedefineFunction - * @suppress UnusedSuppression - */ - function spl_object_id($object) - { - $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) - * @suppress PhanRedefineFunctionInternal, PhanRedefineFunction - * @suppress UnusedSuppression - */ - function spl_object_id($object) - { - $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/phan/phan/test b/vendor/phan/phan/test deleted file mode 100755 index b7b9ea8..0000000 --- a/vendor/phan/phan/test +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -if ! ./vendor/bin/paratest ; then - echo "Please run 'composer install' or 'composer update' if running tests fails" 1>&2 - exit 1 -fi diff --git a/vendor/phan/phan/tocheckstyle b/vendor/phan/phan/tocheckstyle deleted file mode 100755 index 5c04ada..0000000 --- a/vendor/phan/phan/tocheckstyle +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env php -<?php - -$files = []; -while($line = trim(fgets(STDIN))) { - $elements = explode(' ', $line, 3); - - list($file, $line) = explode(':', $elements[0]); - $source = $elements[1]; - $message = $elements[2]; - - if (empty($files[$file])) { - $files[$file] = []; - } - - $files[$file][] = [ - 'line' => $line, - 'source' => $source, - 'message' => $message, - 'severity' => 'error', - ]; -} - -$document = new \DomDocument('1.0', 'ISO-8859-15'); - -$checkstyle = new \DOMElement('checkstyle'); -$document->appendChild($checkstyle); -$checkstyle->appendChild(new \DOMAttr('version', '6.5')); - -// Write each file to the DOM -foreach ($files as $file_name => $error_list) { - $file = new \DOMElement('file'); - $checkstyle->appendChild($file); - $file->appendChild(new \DOMAttr('name', $file_name)); - - // Write each error to the file - foreach ($error_list as $error_map) { - $error = new \DOMElement('error'); - $file->appendChild($error); - - // Write each element of the error as an attribute - // of the error - foreach ($error_map as $key => $value) { - $error->appendChild( - new \DOMAttr($key, (string)$value) - ); - } - } -} - -print $document->saveXML(); diff --git a/vendor/phan/phan/tool/README.md b/vendor/phan/phan/tool/README.md deleted file mode 100644 index 51aeff9..0000000 --- a/vendor/phan/phan/tool/README.md +++ /dev/null @@ -1 +0,0 @@ -This directory contains tools that may be useful to users of Phan. diff --git a/vendor/phan/phan/tool/dump_markdown_preview b/vendor/phan/phan/tool/dump_markdown_preview deleted file mode 100755 index 62d6c02..0000000 --- a/vendor/phan/phan/tool/dump_markdown_preview +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash -function usage() { - cat 1>&2 <<EOT -Usage: $0 [options for phan] - -Dumps the markdown Phan would generate for each addressable element of the code. -This is similar to what is sent to language server clients. - -This currently supports classes, methods, properties, and global functions. - -Notes: - -- Phan does not attempt to escape any embedded HTML/markdown within doc comments. - The output may contain any HTML tags, etc - clients should do any necessary escaping. -- This tool and plugin may be renamed or removed, and the output format will likely change. -- This deliberately doesn't include full info about union types, but it would be easy to add. -EOT -} -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -if [[ "$1" == "-h" || "$1" == "help" || "$1" == "--help" ]]; then - usage - exit 0 -fi - -"$DIR/../phan" --plugin "$DIR/../src/Phan/Plugin/Internal/DumpPHPDocPlugin.php" "$@" diff --git a/vendor/phan/phan/tool/make_ctags_for_phan_project b/vendor/phan/phan/tool/make_ctags_for_phan_project deleted file mode 100755 index c11d003..0000000 --- a/vendor/phan/phan/tool/make_ctags_for_phan_project +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -# -# Usage: /path/to/phan/tool/make_ctags_for_phan_project [options for phpctags] -# -# This combines Phan and phpctags to generate a ctags file for your Phan project. -# (This includes only the files you parse and analyze) -# -# phpctags can be obtained from https://github.com/vim-php/phpctags -# -# This may be useful if you already have whitelists and/or blacklists for excluding: -# -# - classes that aren't direct dependencies of your codebase -# - `examples/` folders and test folders in `vendor/` and other third party code -# -# The resulting tags file may be combined with tags for JS, CSS, etc. -function usage() { - echo "Usage: $0 [options for phpctags]" 1>&2 -} - -if ! type phpctags ; then - echo "$0: Could not find phpctags in $PATH" 1>&2 - echo - usage - exit 1 -fi -if [ ! -f .phan/config.php ]; then - echo "Must run this from the root of a project configured to use Phan (could not find $PWD/.phan/config.php)" 1>&2 - usage - exit 1 -fi -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -echo "Generating file list with Phan and running phpctags" - -# Run phpctags on the files that Phan would parse or analyze. -# This can be a long list. Choose a default larger than 128KB (2MB) -- (run getconf ARG_MAX for the actual limit) -# Unfortunately, phpctags doesn't have an option to read file arguments from a list or stdin -# Note: Use a default memory limit higher than 128M - This is needed to parse FunctionSignatureMap.php -"$DIR/../phan" --dump-parsed-file-list | xargs --exit -s 2000000 phpctags --memory=2G --verbose "$@" diff --git a/vendor/phan/phan/tool/make_stubs b/vendor/phan/phan/tool/make_stubs deleted file mode 100755 index 36e2be9..0000000 --- a/vendor/phan/phan/tool/make_stubs +++ /dev/null @@ -1,267 +0,0 @@ -#!/usr/bin/env php -<?php declare(strict_types=1); - -/** - * @phan-file-suppress PhanNativePHPSyntaxCheckPlugin, UnusedPluginFileSuppression php warns about declare() after the inline HTML /usr/bin/env php - */ - -use Phan\CodeBase; -use Phan\Language\Element\Clazz; -use Phan\Language\Element\Func; -use Phan\Language\Element\GlobalConstant; -use Phan\Language\FQSEN\FullyQualifiedClassName; -use Phan\Language\FQSEN\FullyQualifiedFunctionName; -use Phan\Language\FQSEN\FullyQualifiedGlobalConstantName; - -require_once dirname(__DIR__) . '/src/requirements.php'; - -require_once(dirname(__DIR__) . '/src/Phan/Bootstrap.php'); - -// If php-ast isn't loaded already, then load this file to generate equivalent -// class, constant, and function definitions. -if (!class_exists('\ast\Node')) { - require_once __DIR__ . '/../src/Phan/AST/TolerantASTConverter/ast_shim.php'; -} - -/** - * Generates PHP stubs for extensions that can be used in the autoload_internal_extension_signatures `.phan/config.php` setting. - * These are regular PHP files stubbing PHP modules, containing empty method implementations, etc. - * - * Configured stubs can be used in IDEs, analysis, etc. where extensions aren't installed or enabled (e.g. xdebug) - * @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod - */ -class StubsGenerator -{ - - /** - * @return void (does not return) - */ - public static function printHelpAndExit(string $message = '', int $exit_code = 1) - { - if ($message) { - echo "$message\n"; - } - global $argv; - $prog_name = $argv[0]; - echo <<<EOT -Usage: $prog_name [--opts] - -h, --help - Print this help message - - -e, --extension - Print stubs for only the given PECL or built in extension (e.g. 'ast', 'pcntl') -EOT; - exit($exit_code); - } - - /** - * The main function of the `make_stubs` script. - * See `make_stubs --help` for usage. - * - * @return void - */ - public static function main() - { - global $argv; - $options = getopt('he:', ['help', 'extension:']); - if (isset($options['h']) || isset($options['help'])) { - self::printHelpAndExit('', 0); - } - - $code_base = require_once(dirname(__DIR__) . '/src/codebase.php'); - - $extension_name = $options['e'] ?? $options['extension'] ?? null; - if (is_string($extension_name)) { - self::printStubsForExtension($extension_name, $code_base); - return; - } - self::printAllStubs($code_base); - } - - /** @return void */ - private static function printStubsForExtension(string $extension_name, CodeBase $code_base) - { - $stub_collection = new StubCollection($code_base); - $reflection_extension = new ReflectionExtension($extension_name); - $extension_version = $reflection_extension->getVersion(); - - self::recordClassStubsForExtension($stub_collection, $reflection_extension, $code_base); - self::recordGlobalFunctionStubsForExtension($stub_collection, $reflection_extension, $code_base); - self::recordGlobalConstantStubsForExtension($stub_collection, $reflection_extension, $code_base); - - echo "<" . "?php\n"; - echo "// These stubs were generated by the phan stub generator.\n"; - echo "// @phan-stub-for-extension $extension_name@$extension_version\n"; - echo "\n"; - - echo $stub_collection->toString(); - } - - private static function recordClassStubsForExtension( - StubCollection $stub_collection, - ReflectionExtension $reflection_extension, - CodeBase $code_base - ) { - foreach ($reflection_extension->getClassNames() as $class_name) { - try { - $class_fqsen = FullyQualifiedClassName::fromFullyQualifiedString($class_name); - } catch (Exception $e) { - // only possible if module info is wrong - fwrite(STDERR, "Failed to parse fqsen of class $class_name : {$e->getMessage()}\n"); - continue; - } - if (!$code_base->hasClassWithFQSEN($class_fqsen)) { - fwrite(STDERR, "Failed to find class $class_fqsen\n"); - continue; - } - $stub_collection->addClazz($code_base->getClassByFQSEN($class_fqsen)); - } - } - - private static function recordGlobalFunctionStubsForExtension( - StubCollection $stub_collection, - ReflectionExtension $reflection_extension, - CodeBase $code_base - ) { - foreach ($reflection_extension->getFunctions() as $function_name => $unused_reflection_function) { - try { - $function_fqsen = FullyQualifiedFunctionName::fromFullyQualifiedString($function_name); - } catch (Exception $e) { - // only possible if module info is wrong - fwrite(STDERR, "Failed to parse fqsen of function $function_name : {$e->getMessage()}\n"); - continue; - } - if (!$code_base->hasFunctionWithFQSEN($function_fqsen)) { - fwrite(STDERR, "Failed to find function $function_fqsen\n"); - continue; - } - $stub_collection->addFunc($code_base->getFunctionByFQSEN($function_fqsen)); - } - } - - private static function recordGlobalConstantStubsForExtension( - StubCollection $stub_collection, - ReflectionExtension $reflection_extension, - CodeBase $code_base - ) { - foreach ($reflection_extension->getConstants() as $constant_name => $_) { - try { - $const_fqsen = FullyQualifiedGlobalConstantName::fromFullyQualifiedString($constant_name); - } catch (Exception $e) { - // only possible if module info is invalid - fwrite(STDERR, "Failed to parse fqsen of global constant $constant_name : {$e->getMessage()}\n"); - continue; - } - if (!$code_base->hasGlobalConstantWithFQSEN($const_fqsen)) { - fwrite(STDERR, "Failed to find global constant $const_fqsen\n"); - continue; - } - $stub_collection->addGlobalConstant($code_base->getGlobalConstantByFQSEN($const_fqsen)); - } - } - - /** - * @return void - */ - public static function printAllStubs(CodeBase $code_base) - { - $stub_collection = new StubCollection($code_base); - $class_map = $code_base->getInternalClassMap(); - - echo "<" . "?php\n"; - echo "// These stubs were generated by the phan stub generator.\n"; - - foreach ($class_map as $class) { - $stub_collection->addClazz($class); - } - - $function_map = $code_base->getFunctionMap(); - foreach ($function_map as $function) { - $stub_collection->addFunc($function); - } - - $const_map = $code_base->getGlobalConstantMap(); - - foreach ($const_map as $const) { - $stub_collection->addGlobalConstant($const); - } - echo $stub_collection->toString(); - } -} - -StubsGenerator::main(); - -/** - * A representation of the collection of stubs for elements of a PHP module(a.k.a. extension). - */ -class StubCollection -{ - /** @var CodeBase represents the known state of the code base we're extracting the stubs from. */ - private $code_base; - - public function __construct(CodeBase $code_base) - { - $this->code_base = $code_base; - } - - /** @var string[][] a list of class stubs for a PHP module */ - public $class_stubs = []; - /** @var string[][] a list of function stubs for a PHP module */ - public $function_stubs = []; - /** @var string[][] a list of global constant stubs for a PHP module */ - public $global_constant_stubs = []; - - /** @return void */ - public function addClazz(Clazz $class) - { - list($namespace, $name) = $class->toStubInfo($this->code_base); - $this->class_stubs[$namespace][(string)$class->getFQSEN()] = $name; - } - - /** @return void */ - public function addGlobalConstant(GlobalConstant $global_constant) - { - list($namespace, $name) = $global_constant->toStubInfo(); - $this->global_constant_stubs[$namespace][(string)$global_constant->getFQSEN()] = $name; - } - - /** @return void */ - public function addFunc(Func $function) - { - list($namespace, $name) = $function->toStubInfo(); - $this->function_stubs[$namespace][(string)$function->getFQSEN()] = $name; - } - - /** @return string[][] */ - public function toCombinedStubs() : array - { - $result = []; - foreach ($this->class_stubs as $namespace => $stubs) { - ksort($stubs, SORT_NATURAL); - $result[$namespace] = array_merge($result[$namespace] ?? [], $stubs); - } - foreach ($this->function_stubs as $namespace => $stubs) { - ksort($stubs, SORT_NATURAL); - $result[$namespace] = array_merge($result[$namespace] ?? [], $stubs); - } - foreach ($this->global_constant_stubs as $namespace => $stubs) { - ksort($stubs, SORT_NATURAL); - $result[$namespace] = array_merge($result[$namespace] ?? [], $stubs); - } - return $result; - } - - /** - * Returns the accumulated stubs converted to inline PHP code. - */ - public function toString() : string - { - $parts = []; - foreach ($this->toCombinedStubs() as $namespace => $stubs) { - $concatenated_stubs_representation = implode('', $stubs); - $namespace_repr = ($namespace === '' ? '' : "$namespace "); - $parts[] = sprintf("namespace %s{\n%s}\n", $namespace_repr, $concatenated_stubs_representation); - } - return implode("\n", $parts); - } -} diff --git a/vendor/phan/phan/tool/phoogle b/vendor/phan/phan/tool/phoogle deleted file mode 100755 index 9e41b88..0000000 --- a/vendor/phan/phan/tool/phoogle +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env bash -# TODO: Add CLI options for number of results, whether to limit to internal/user-defined functions, etc. -function usage() { - cat 1>&2 <<EOT -Usage: $0 paramType1->paramType2->returnType - -Examples: - - Look for user-defined or internal functions returning an array of reflection methods - $0 'ReflectionMethod[]' - - Look for functions that return a string, given a string and an array - - $0 'string -> array -> string' - - Look for functions that can be used to get a method (\\Phan\\Language\\Element\\Method) from a CodeBase (\\Phan\\CodeBase) - (Assumes Phan is in the parsed file list) - - $0 'CodeBase->Method' - -Notes: - - The order of the parameters is deliberately ignored. - - More CLI options will be added in the future. -EOT -} -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -if [ $# != 1 ]; then - usage - exit 1 -fi -if [[ "$1" == "-h" || "$1" == "help" || "$1" == "--help" ]]; then - usage - exit 0 -fi - -"$DIR/../phan" --find-signature="$1" diff --git a/vendor/phar-io/manifest/.gitignore b/vendor/phar-io/manifest/.gitignore deleted file mode 100644 index 374459d..0000000 --- a/vendor/phar-io/manifest/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/.idea -/.php_cs.cache -/src/autoload.php -/tools -/vendor - -/build diff --git a/vendor/phar-io/manifest/.php_cs b/vendor/phar-io/manifest/.php_cs deleted file mode 100644 index 159d6a3..0000000 --- a/vendor/phar-io/manifest/.php_cs +++ /dev/null @@ -1,67 +0,0 @@ -<?php -$finder = Symfony\CS\Finder\DefaultFinder::create() - ->files() - ->in('src') - ->in('tests') - ->name('*.php'); - -return Symfony\CS\Config\Config::create() - ->setUsingCache(true) - ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) - ->fixers( - array( - 'align_double_arrow', - 'align_equals', - 'concat_with_spaces', - 'duplicate_semicolon', - 'elseif', - 'empty_return', - 'encoding', - 'eof_ending', - 'extra_empty_lines', - 'function_call_space', - 'function_declaration', - 'indentation', - 'join_function', - 'line_after_namespace', - 'linefeed', - 'list_commas', - 'lowercase_constants', - 'lowercase_keywords', - 'method_argument_space', - 'multiple_use', - 'namespace_no_leading_whitespace', - 'no_blank_lines_after_class_opening', - 'no_empty_lines_after_phpdocs', - 'parenthesis', - 'php_closing_tag', - 'phpdoc_indent', - 'phpdoc_no_access', - 'phpdoc_no_empty_return', - 'phpdoc_no_package', - 'phpdoc_params', - 'phpdoc_scalar', - 'phpdoc_separation', - 'phpdoc_to_comment', - 'phpdoc_trim', - 'phpdoc_types', - 'phpdoc_var_without_name', - 'remove_lines_between_uses', - 'return', - 'self_accessor', - 'short_array_syntax', - 'short_tag', - 'single_line_after_imports', - 'single_quote', - 'spaces_before_semicolon', - 'spaces_cast', - 'ternary_spaces', - 'trailing_spaces', - 'trim_array_spaces', - 'unused_use', - 'visibility', - 'whitespacy_lines' - ) - ) - ->finder($finder); - diff --git a/vendor/phar-io/manifest/.travis.yml b/vendor/phar-io/manifest/.travis.yml deleted file mode 100644 index b4be10f..0000000 --- a/vendor/phar-io/manifest/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ -os: -- linux - -language: php - -before_install: - - wget https://phar.io/releases/phive.phar - - wget https://phar.io/releases/phive.phar.asc - - gpg --keyserver hkps.pool.sks-keyservers.net --recv-keys 0x9B2D5D79 - - gpg --verify phive.phar.asc phive.phar - - chmod +x phive.phar - - sudo mv phive.phar /usr/bin/phive - -install: - - ant setup - -script: ./tools/phpunit - -php: - - 5.6 - - 7.0 - - 7.1 - - 7.0snapshot - - 7.1snapshot - - master - -matrix: - allow_failures: - - php: master - fast_finish: true - -notifications: - email: false diff --git a/vendor/phar-io/manifest/LICENSE b/vendor/phar-io/manifest/LICENSE deleted file mode 100644 index 96051b1..0000000 --- a/vendor/phar-io/manifest/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -manifest - -Copyright (c) 2016 Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de>, and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Arne Blankerts nor the names of contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/phar-io/manifest/README.md b/vendor/phar-io/manifest/README.md deleted file mode 100644 index e6d0b05..0000000 --- a/vendor/phar-io/manifest/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Manifest - -Component for reading [phar.io](https://phar.io/) manifest information from a [PHP Archive (PHAR)](http://php.net/phar). - -[![Build Status](https://travis-ci.org/phar-io/manifest.svg?branch=master)](https://travis-ci.org/phar-io/manifest) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/phar-io/manifest/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/phar-io/manifest/?branch=master) -[![SensioLabsInsight](https://insight.sensiolabs.com/projects/d8cc6035-69ad-477d-bd1a-ccc605480fd7/mini.png)](https://insight.sensiolabs.com/projects/d8cc6035-69ad-477d-bd1a-ccc605480fd7) - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phar-io/manifest - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phar-io/manifest - -## Usage - -```php -use PharIo\Manifest\ManifestLoader; -use PharIo\Manifest\ManifestSerializer; - -$manifest = ManifestLoader::fromFile('manifest.xml'); - -var_dump($manifest); - -echo (new ManifestSerializer)->serializeToString($manifest); -``` diff --git a/vendor/phar-io/manifest/build.xml b/vendor/phar-io/manifest/build.xml deleted file mode 100644 index fc6eb1a..0000000 --- a/vendor/phar-io/manifest/build.xml +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project name="manifest" default="setup"> - <target name="setup" depends="clean,install-tools,install-dependencies"/> - - <target name="clean" unless="clean.done" description="Cleanup build artifacts"> - <delete dir="${basedir}/tools"/> - <delete dir="${basedir}/vendor"/> - <delete file="${basedir}/src/autoload.php"/> - - <property name="clean.done" value="true"/> - </target> - - <target name="prepare" unless="prepare.done" depends="clean" description="Prepare for build"> - <property name="prepare.done" value="true"/> - </target> - - <target name="install-dependencies" unless="dependencies-installed" depends="-dependencies-installed" description="Install dependencies with Composer"> - <exec executable="composer" taskname="composer"> - <env key="COMPOSER_DISABLE_XDEBUG_WARN" value="1"/> - <arg value="update"/> - <arg value="--no-interaction"/> - <arg value="--no-progress"/> - <arg value="--no-ansi"/> - <arg value="--no-suggest"/> - <arg value="--optimize-autoloader"/> - <arg value="--prefer-stable"/> - </exec> - </target> - - <target name="install-tools" unless="tools-installed" depends="-tools-installed" description="Install tools with Phive"> - <exec executable="phive" taskname="phive"> - <arg value="install"/> - <arg value="--trust-gpg-keys" /> - <arg value="4AA394086372C20A,2A8299CE842DD38C" /> - </exec> - </target> - - <target name="test" depends="install-tools,install-dependencies" description="Run tests"> - <exec executable="${basedir}/tools/phpunit" taskname="phpunit"/> - </target> - - <target name="-dependencies-installed"> - <available file="${basedir}/composer.lock" property="dependencies-installed"/> - </target> - - <target name="-tools-installed"> - <available file="${basedir}/tools" property="tools-installed" type="dir"/> - </target> -</project> - diff --git a/vendor/phar-io/manifest/composer.json b/vendor/phar-io/manifest/composer.json deleted file mode 100644 index cfaa7fa..0000000 --- a/vendor/phar-io/manifest/composer.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "phar-io/manifest", - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "support": { - "issues": "https://github.com/phar-io/manifest/issues" - }, - "require": { - "php": "^5.6 || ^7.0", - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^2.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} - diff --git a/vendor/phar-io/manifest/composer.lock b/vendor/phar-io/manifest/composer.lock deleted file mode 100644 index d876819..0000000 --- a/vendor/phar-io/manifest/composer.lock +++ /dev/null @@ -1,69 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "content-hash": "f00846dde236d314a19d00d268d737dd", - "packages": [ - { - "name": "phar-io/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "time": "2018-07-08T19:19:57+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^5.6 || ^7.0", - "ext-dom": "*", - "ext-phar": "*" - }, - "platform-dev": [] -} diff --git a/vendor/phar-io/manifest/examples/example-01.php b/vendor/phar-io/manifest/examples/example-01.php deleted file mode 100644 index 345c407..0000000 --- a/vendor/phar-io/manifest/examples/example-01.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use PharIo\Manifest\ManifestLoader; -use PharIo\Manifest\ManifestSerializer; - -require __DIR__ . '/../vendor/autoload.php'; - -$manifest = ManifestLoader::fromFile(__DIR__ . '/../tests/_fixture/phpunit-5.6.5.xml'); - -echo sprintf( - "Manifest for %s (%s):\n\n", - $manifest->getName(), - $manifest->getVersion()->getVersionString() -); -echo (new ManifestSerializer)->serializeToString($manifest); diff --git a/vendor/phar-io/manifest/phive.xml b/vendor/phar-io/manifest/phive.xml deleted file mode 100644 index 69f2f91..0000000 --- a/vendor/phar-io/manifest/phive.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phive xmlns="https://phar.io/phive"> - <phar name="phpunit" version="^5.7" installed="5.7.15" location="./tools/phpunit"/> -</phive> diff --git a/vendor/phar-io/manifest/phpunit.xml b/vendor/phar-io/manifest/phpunit.xml deleted file mode 100644 index 2d7708e..0000000 --- a/vendor/phar-io/manifest/phpunit.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/5.6/phpunit.xsd" - bootstrap="vendor/autoload.php" - backupGlobals="false" - beStrictAboutCoversAnnotation="true" - beStrictAboutOutputDuringTests="true" - beStrictAboutTestsThatDoNotTestAnything="true" - beStrictAboutTodoAnnotatedTests="true" - verbose="true"> - <testsuite> - <directory suffix="Test.php">tests</directory> - </testsuite> - - <filter> - <whitelist processUncoveredFilesFromWhitelist="true"> - <directory suffix=".php">src</directory> - </whitelist> - </filter> -</phpunit> diff --git a/vendor/phar-io/manifest/src/ManifestDocumentMapper.php b/vendor/phar-io/manifest/src/ManifestDocumentMapper.php deleted file mode 100644 index d41e4f9..0000000 --- a/vendor/phar-io/manifest/src/ManifestDocumentMapper.php +++ /dev/null @@ -1,193 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; -use PharIo\Version\Exception as VersionException; -use PharIo\Version\VersionConstraintParser; - -class ManifestDocumentMapper { - /** - * @param ManifestDocument $document - * - * @returns Manifest - * - * @throws ManifestDocumentMapperException - */ - public function map(ManifestDocument $document) { - try { - $contains = $document->getContainsElement(); - $type = $this->mapType($contains); - $copyright = $this->mapCopyright($document->getCopyrightElement()); - $requirements = $this->mapRequirements($document->getRequiresElement()); - $bundledComponents = $this->mapBundledComponents($document); - - return new Manifest( - new ApplicationName($contains->getName()), - new Version($contains->getVersion()), - $type, - $copyright, - $requirements, - $bundledComponents - ); - } catch (VersionException $e) { - throw new ManifestDocumentMapperException($e->getMessage(), $e->getCode(), $e); - } catch (Exception $e) { - throw new ManifestDocumentMapperException($e->getMessage(), $e->getCode(), $e); - } - } - - /** - * @param ContainsElement $contains - * - * @return Type - * - * @throws ManifestDocumentMapperException - */ - private function mapType(ContainsElement $contains) { - switch ($contains->getType()) { - case 'application': - return Type::application(); - case 'library': - return Type::library(); - case 'extension': - return $this->mapExtension($contains->getExtensionElement()); - } - - throw new ManifestDocumentMapperException( - sprintf('Unsupported type %s', $contains->getType()) - ); - } - - /** - * @param CopyrightElement $copyright - * - * @return CopyrightInformation - * - * @throws InvalidUrlException - * @throws InvalidEmailException - */ - private function mapCopyright(CopyrightElement $copyright) { - $authors = new AuthorCollection(); - - foreach($copyright->getAuthorElements() as $authorElement) { - $authors->add( - new Author( - $authorElement->getName(), - new Email($authorElement->getEmail()) - ) - ); - } - - $licenseElement = $copyright->getLicenseElement(); - $license = new License( - $licenseElement->getType(), - new Url($licenseElement->getUrl()) - ); - - return new CopyrightInformation( - $authors, - $license - ); - } - - /** - * @param RequiresElement $requires - * - * @return RequirementCollection - * - * @throws ManifestDocumentMapperException - */ - private function mapRequirements(RequiresElement $requires) { - $collection = new RequirementCollection(); - $phpElement = $requires->getPHPElement(); - $parser = new VersionConstraintParser; - - try { - $versionConstraint = $parser->parse($phpElement->getVersion()); - } catch (VersionException $e) { - throw new ManifestDocumentMapperException( - sprintf('Unsupported version constraint - %s', $e->getMessage()), - $e->getCode(), - $e - ); - } - - $collection->add( - new PhpVersionRequirement( - $versionConstraint - ) - ); - - if (!$phpElement->hasExtElements()) { - return $collection; - } - - foreach($phpElement->getExtElements() as $extElement) { - $collection->add( - new PhpExtensionRequirement($extElement->getName()) - ); - } - - return $collection; - } - - /** - * @param ManifestDocument $document - * - * @return BundledComponentCollection - */ - private function mapBundledComponents(ManifestDocument $document) { - $collection = new BundledComponentCollection(); - - if (!$document->hasBundlesElement()) { - return $collection; - } - - foreach($document->getBundlesElement()->getComponentElements() as $componentElement) { - $collection->add( - new BundledComponent( - $componentElement->getName(), - new Version( - $componentElement->getVersion() - ) - ) - ); - } - - return $collection; - } - - /** - * @param ExtensionElement $extension - * - * @return Extension - * - * @throws ManifestDocumentMapperException - */ - private function mapExtension(ExtensionElement $extension) { - try { - $parser = new VersionConstraintParser; - $versionConstraint = $parser->parse($extension->getCompatible()); - - return Type::extension( - new ApplicationName($extension->getFor()), - $versionConstraint - ); - } catch (VersionException $e) { - throw new ManifestDocumentMapperException( - sprintf('Unsupported version constraint - %s', $e->getMessage()), - $e->getCode(), - $e - ); - } - } -} diff --git a/vendor/phar-io/manifest/src/ManifestLoader.php b/vendor/phar-io/manifest/src/ManifestLoader.php deleted file mode 100644 index 81c5c90..0000000 --- a/vendor/phar-io/manifest/src/ManifestLoader.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ManifestLoader { - /** - * @param string $filename - * - * @return Manifest - * - * @throws ManifestLoaderException - */ - public static function fromFile($filename) { - try { - return (new ManifestDocumentMapper())->map( - ManifestDocument::fromFile($filename) - ); - } catch (Exception $e) { - throw new ManifestLoaderException( - sprintf('Loading %s failed.', $filename), - $e->getCode(), - $e - ); - } - } - - /** - * @param string $filename - * - * @return Manifest - * - * @throws ManifestLoaderException - */ - public static function fromPhar($filename) { - return self::fromFile('phar://' . $filename . '/manifest.xml'); - } - - /** - * @param string $manifest - * - * @return Manifest - * - * @throws ManifestLoaderException - */ - public static function fromString($manifest) { - try { - return (new ManifestDocumentMapper())->map( - ManifestDocument::fromString($manifest) - ); - } catch (Exception $e) { - throw new ManifestLoaderException( - 'Processing string failed', - $e->getCode(), - $e - ); - } - } -} diff --git a/vendor/phar-io/manifest/src/ManifestSerializer.php b/vendor/phar-io/manifest/src/ManifestSerializer.php deleted file mode 100644 index 4c18ddd..0000000 --- a/vendor/phar-io/manifest/src/ManifestSerializer.php +++ /dev/null @@ -1,163 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\AnyVersionConstraint; -use PharIo\Version\Version; -use PharIo\Version\VersionConstraint; -use XMLWriter; - -class ManifestSerializer { - /** - * @var XMLWriter - */ - private $xmlWriter; - - public function serializeToFile(Manifest $manifest, $filename) { - file_put_contents( - $filename, - $this->serializeToString($manifest) - ); - } - - public function serializeToString(Manifest $manifest) { - $this->startDocument(); - - $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType()); - $this->addCopyright($manifest->getCopyrightInformation()); - $this->addRequirements($manifest->getRequirements()); - $this->addBundles($manifest->getBundledComponents()); - - return $this->finishDocument(); - } - - private function startDocument() { - $xmlWriter = new XMLWriter(); - $xmlWriter->openMemory(); - $xmlWriter->setIndent(true); - $xmlWriter->setIndentString(str_repeat(' ', 4)); - $xmlWriter->startDocument('1.0', 'UTF-8'); - $xmlWriter->startElement('phar'); - $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0'); - - $this->xmlWriter = $xmlWriter; - } - - private function finishDocument() { - $this->xmlWriter->endElement(); - $this->xmlWriter->endDocument(); - - return $this->xmlWriter->outputMemory(); - } - - private function addContains($name, Version $version, Type $type) { - $this->xmlWriter->startElement('contains'); - $this->xmlWriter->writeAttribute('name', $name); - $this->xmlWriter->writeAttribute('version', $version->getVersionString()); - - switch (true) { - case $type->isApplication(): { - $this->xmlWriter->writeAttribute('type', 'application'); - break; - } - - case $type->isLibrary(): { - $this->xmlWriter->writeAttribute('type', 'library'); - break; - } - - case $type->isExtension(): { - /* @var $type Extension */ - $this->xmlWriter->writeAttribute('type', 'extension'); - $this->addExtension($type->getApplicationName(), $type->getVersionConstraint()); - break; - } - - default: { - $this->xmlWriter->writeAttribute('type', 'custom'); - } - } - - $this->xmlWriter->endElement(); - } - - private function addCopyright(CopyrightInformation $copyrightInformation) { - $this->xmlWriter->startElement('copyright'); - - foreach($copyrightInformation->getAuthors() as $author) { - $this->xmlWriter->startElement('author'); - $this->xmlWriter->writeAttribute('name', $author->getName()); - $this->xmlWriter->writeAttribute('email', (string) $author->getEmail()); - $this->xmlWriter->endElement(); - } - - $license = $copyrightInformation->getLicense(); - - $this->xmlWriter->startElement('license'); - $this->xmlWriter->writeAttribute('type', $license->getName()); - $this->xmlWriter->writeAttribute('url', $license->getUrl()); - $this->xmlWriter->endElement(); - - $this->xmlWriter->endElement(); - } - - private function addRequirements(RequirementCollection $requirementCollection) { - $phpRequirement = new AnyVersionConstraint(); - $extensions = []; - - foreach($requirementCollection as $requirement) { - if ($requirement instanceof PhpVersionRequirement) { - $phpRequirement = $requirement->getVersionConstraint(); - continue; - } - - if ($requirement instanceof PhpExtensionRequirement) { - $extensions[] = (string) $requirement; - } - } - - $this->xmlWriter->startElement('requires'); - $this->xmlWriter->startElement('php'); - $this->xmlWriter->writeAttribute('version', $phpRequirement->asString()); - - foreach($extensions as $extension) { - $this->xmlWriter->startElement('ext'); - $this->xmlWriter->writeAttribute('name', $extension); - $this->xmlWriter->endElement(); - } - - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); - } - - private function addBundles(BundledComponentCollection $bundledComponentCollection) { - if (count($bundledComponentCollection) === 0) { - return; - } - $this->xmlWriter->startElement('bundles'); - - foreach($bundledComponentCollection as $bundledComponent) { - $this->xmlWriter->startElement('component'); - $this->xmlWriter->writeAttribute('name', $bundledComponent->getName()); - $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString()); - $this->xmlWriter->endElement(); - } - - $this->xmlWriter->endElement(); - } - - private function addExtension($application, VersionConstraint $versionConstraint) { - $this->xmlWriter->startElement('extension'); - $this->xmlWriter->writeAttribute('for', $application); - $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString()); - $this->xmlWriter->endElement(); - } -} diff --git a/vendor/phar-io/manifest/src/exceptions/Exception.php b/vendor/phar-io/manifest/src/exceptions/Exception.php deleted file mode 100644 index 3ce46f2..0000000 --- a/vendor/phar-io/manifest/src/exceptions/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -interface Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php b/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php deleted file mode 100644 index a53735a..0000000 --- a/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class InvalidApplicationNameException extends \InvalidArgumentException implements Exception { - const NotAString = 1; - const InvalidFormat = 2; -} diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php b/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php deleted file mode 100644 index 854399b..0000000 --- a/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class InvalidEmailException extends \InvalidArgumentException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php b/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php deleted file mode 100644 index cdd8323..0000000 --- a/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class InvalidUrlException extends \InvalidArgumentException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php b/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php deleted file mode 100644 index 8b40195..0000000 --- a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -class ManifestDocumentException extends \RuntimeException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php b/vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php deleted file mode 100644 index 728748e..0000000 --- a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -class ManifestDocumentMapperException extends \RuntimeException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/ManifestElementException.php b/vendor/phar-io/manifest/src/exceptions/ManifestElementException.php deleted file mode 100644 index fa78836..0000000 --- a/vendor/phar-io/manifest/src/exceptions/ManifestElementException.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -class ManifestElementException extends \RuntimeException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php b/vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php deleted file mode 100644 index b55f7bf..0000000 --- a/vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -class ManifestLoaderException extends \Exception implements Exception { -} diff --git a/vendor/phar-io/manifest/src/values/Application.php b/vendor/phar-io/manifest/src/values/Application.php deleted file mode 100644 index d184d99..0000000 --- a/vendor/phar-io/manifest/src/values/Application.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class Application extends Type { - /** - * @return bool - */ - public function isApplication() { - return true; - } -} diff --git a/vendor/phar-io/manifest/src/values/ApplicationName.php b/vendor/phar-io/manifest/src/values/ApplicationName.php deleted file mode 100644 index 1e71af4..0000000 --- a/vendor/phar-io/manifest/src/values/ApplicationName.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ApplicationName { - /** - * @var string - */ - private $name; - - /** - * ApplicationName constructor. - * - * @param string $name - * - * @throws InvalidApplicationNameException - */ - public function __construct($name) { - $this->ensureIsString($name); - $this->ensureValidFormat($name); - $this->name = $name; - } - - /** - * @return string - */ - public function __toString() { - return $this->name; - } - - public function isEqual(ApplicationName $name) { - return $this->name === $name->name; - } - - /** - * @param string $name - * - * @throws InvalidApplicationNameException - */ - private function ensureValidFormat($name) { - if (!preg_match('#\w/\w#', $name)) { - throw new InvalidApplicationNameException( - sprintf('Format of name "%s" is not valid - expected: vendor/packagename', $name), - InvalidApplicationNameException::InvalidFormat - ); - } - } - - private function ensureIsString($name) { - if (!is_string($name)) { - throw new InvalidApplicationNameException( - 'Name must be a string', - InvalidApplicationNameException::NotAString - ); - } - } -} diff --git a/vendor/phar-io/manifest/src/values/Author.php b/vendor/phar-io/manifest/src/values/Author.php deleted file mode 100644 index 8295f51..0000000 --- a/vendor/phar-io/manifest/src/values/Author.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class Author { - /** - * @var string - */ - private $name; - - /** - * @var Email - */ - private $email; - - /** - * @param string $name - * @param Email $email - */ - public function __construct($name, Email $email) { - $this->name = $name; - $this->email = $email; - } - - /** - * @return string - */ - public function getName() { - return $this->name; - } - - /** - * @return Email - */ - public function getEmail() { - return $this->email; - } - - /** - * @return string - */ - public function __toString() { - return sprintf( - '%s <%s>', - $this->name, - $this->email - ); - } -} diff --git a/vendor/phar-io/manifest/src/values/AuthorCollection.php b/vendor/phar-io/manifest/src/values/AuthorCollection.php deleted file mode 100644 index d915879..0000000 --- a/vendor/phar-io/manifest/src/values/AuthorCollection.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class AuthorCollection implements \Countable, \IteratorAggregate { - /** - * @var Author[] - */ - private $authors = []; - - public function add(Author $author) { - $this->authors[] = $author; - } - - /** - * @return Author[] - */ - public function getAuthors() { - return $this->authors; - } - - /** - * @return int - */ - public function count() { - return count($this->authors); - } - - /** - * @return AuthorCollectionIterator - */ - public function getIterator() { - return new AuthorCollectionIterator($this); - } -} diff --git a/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php b/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php deleted file mode 100644 index 792a050..0000000 --- a/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class AuthorCollectionIterator implements \Iterator { - /** - * @var Author[] - */ - private $authors = []; - - /** - * @var int - */ - private $position; - - public function __construct(AuthorCollection $authors) { - $this->authors = $authors->getAuthors(); - } - - public function rewind() { - $this->position = 0; - } - - /** - * @return bool - */ - public function valid() { - return $this->position < count($this->authors); - } - - /** - * @return int - */ - public function key() { - return $this->position; - } - - /** - * @return Author - */ - public function current() { - return $this->authors[$this->position]; - } - - public function next() { - $this->position++; - } -} diff --git a/vendor/phar-io/manifest/src/values/BundledComponent.php b/vendor/phar-io/manifest/src/values/BundledComponent.php deleted file mode 100644 index 846d15a..0000000 --- a/vendor/phar-io/manifest/src/values/BundledComponent.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; - -class BundledComponent { - /** - * @var string - */ - private $name; - - /** - * @var Version - */ - private $version; - - /** - * @param string $name - * @param Version $version - */ - public function __construct($name, Version $version) { - $this->name = $name; - $this->version = $version; - } - - /** - * @return string - */ - public function getName() { - return $this->name; - } - - /** - * @return Version - */ - public function getVersion() { - return $this->version; - } -} diff --git a/vendor/phar-io/manifest/src/values/BundledComponentCollection.php b/vendor/phar-io/manifest/src/values/BundledComponentCollection.php deleted file mode 100644 index 2dbb918..0000000 --- a/vendor/phar-io/manifest/src/values/BundledComponentCollection.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class BundledComponentCollection implements \Countable, \IteratorAggregate { - /** - * @var BundledComponent[] - */ - private $bundledComponents = []; - - public function add(BundledComponent $bundledComponent) { - $this->bundledComponents[] = $bundledComponent; - } - - /** - * @return BundledComponent[] - */ - public function getBundledComponents() { - return $this->bundledComponents; - } - - /** - * @return int - */ - public function count() { - return count($this->bundledComponents); - } - - /** - * @return BundledComponentCollectionIterator - */ - public function getIterator() { - return new BundledComponentCollectionIterator($this); - } -} diff --git a/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php b/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php deleted file mode 100644 index 13b8f05..0000000 --- a/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class BundledComponentCollectionIterator implements \Iterator { - /** - * @var BundledComponent[] - */ - private $bundledComponents = []; - - /** - * @var int - */ - private $position; - - public function __construct(BundledComponentCollection $bundledComponents) { - $this->bundledComponents = $bundledComponents->getBundledComponents(); - } - - public function rewind() { - $this->position = 0; - } - - /** - * @return bool - */ - public function valid() { - return $this->position < count($this->bundledComponents); - } - - /** - * @return int - */ - public function key() { - return $this->position; - } - - /** - * @return BundledComponent - */ - public function current() { - return $this->bundledComponents[$this->position]; - } - - public function next() { - $this->position++; - } -} diff --git a/vendor/phar-io/manifest/src/values/CopyrightInformation.php b/vendor/phar-io/manifest/src/values/CopyrightInformation.php deleted file mode 100644 index ece60b1..0000000 --- a/vendor/phar-io/manifest/src/values/CopyrightInformation.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class CopyrightInformation { - /** - * @var AuthorCollection - */ - private $authors; - - /** - * @var License - */ - private $license; - - public function __construct(AuthorCollection $authors, License $license) { - $this->authors = $authors; - $this->license = $license; - } - - /** - * @return AuthorCollection - */ - public function getAuthors() { - return $this->authors; - } - - /** - * @return License - */ - public function getLicense() { - return $this->license; - } -} diff --git a/vendor/phar-io/manifest/src/values/Email.php b/vendor/phar-io/manifest/src/values/Email.php deleted file mode 100644 index 57cce04..0000000 --- a/vendor/phar-io/manifest/src/values/Email.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class Email { - /** - * @var string - */ - private $email; - - /** - * @param string $email - * - * @throws InvalidEmailException - */ - public function __construct($email) { - $this->ensureEmailIsValid($email); - - $this->email = $email; - } - - /** - * @return string - */ - public function __toString() { - return $this->email; - } - - /** - * @param string $url - * - * @throws InvalidEmailException - */ - private function ensureEmailIsValid($url) { - if (filter_var($url, \FILTER_VALIDATE_EMAIL) === false) { - throw new InvalidEmailException; - } - } -} diff --git a/vendor/phar-io/manifest/src/values/Extension.php b/vendor/phar-io/manifest/src/values/Extension.php deleted file mode 100644 index 90d6a6f..0000000 --- a/vendor/phar-io/manifest/src/values/Extension.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; -use PharIo\Version\VersionConstraint; - -class Extension extends Type { - /** - * @var ApplicationName - */ - private $application; - - /** - * @var VersionConstraint - */ - private $versionConstraint; - - /** - * @param ApplicationName $application - * @param VersionConstraint $versionConstraint - */ - public function __construct(ApplicationName $application, VersionConstraint $versionConstraint) { - $this->application = $application; - $this->versionConstraint = $versionConstraint; - } - - /** - * @return ApplicationName - */ - public function getApplicationName() { - return $this->application; - } - - /** - * @return VersionConstraint - */ - public function getVersionConstraint() { - return $this->versionConstraint; - } - - /** - * @return bool - */ - public function isExtension() { - return true; - } - - /** - * @param ApplicationName $name - * - * @return bool - */ - public function isExtensionFor(ApplicationName $name) { - return $this->application->isEqual($name); - } - - /** - * @param ApplicationName $name - * @param Version $version - * - * @return bool - */ - public function isCompatibleWith(ApplicationName $name, Version $version) { - return $this->isExtensionFor($name) && $this->versionConstraint->complies($version); - } -} diff --git a/vendor/phar-io/manifest/src/values/Library.php b/vendor/phar-io/manifest/src/values/Library.php deleted file mode 100644 index a6ff944..0000000 --- a/vendor/phar-io/manifest/src/values/Library.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class Library extends Type { - /** - * @return bool - */ - public function isLibrary() { - return true; - } -} diff --git a/vendor/phar-io/manifest/src/values/License.php b/vendor/phar-io/manifest/src/values/License.php deleted file mode 100644 index e278670..0000000 --- a/vendor/phar-io/manifest/src/values/License.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class License { - /** - * @var string - */ - private $name; - - /** - * @var Url - */ - private $url; - - public function __construct($name, Url $url) { - $this->name = $name; - $this->url = $url; - } - - /** - * @return string - */ - public function getName() { - return $this->name; - } - - /** - * @return Url - */ - public function getUrl() { - return $this->url; - } -} diff --git a/vendor/phar-io/manifest/src/values/Manifest.php b/vendor/phar-io/manifest/src/values/Manifest.php deleted file mode 100644 index 217acef..0000000 --- a/vendor/phar-io/manifest/src/values/Manifest.php +++ /dev/null @@ -1,138 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; - -class Manifest { - /** - * @var ApplicationName - */ - private $name; - - /** - * @var Version - */ - private $version; - - /** - * @var Type - */ - private $type; - - /** - * @var CopyrightInformation - */ - private $copyrightInformation; - - /** - * @var RequirementCollection - */ - private $requirements; - - /** - * @var BundledComponentCollection - */ - private $bundledComponents; - - public function __construct(ApplicationName $name, Version $version, Type $type, CopyrightInformation $copyrightInformation, RequirementCollection $requirements, BundledComponentCollection $bundledComponents) { - $this->name = $name; - $this->version = $version; - $this->type = $type; - $this->copyrightInformation = $copyrightInformation; - $this->requirements = $requirements; - $this->bundledComponents = $bundledComponents; - } - - /** - * @return ApplicationName - */ - public function getName() { - return $this->name; - } - - /** - * @return Version - */ - public function getVersion() { - return $this->version; - } - - /** - * @return Type - */ - public function getType() { - return $this->type; - } - - /** - * @return CopyrightInformation - */ - public function getCopyrightInformation() { - return $this->copyrightInformation; - } - - /** - * @return RequirementCollection - */ - public function getRequirements() { - return $this->requirements; - } - - /** - * @return BundledComponentCollection - */ - public function getBundledComponents() { - return $this->bundledComponents; - } - - /** - * @return bool - */ - public function isApplication() { - return $this->type->isApplication(); - } - - /** - * @return bool - */ - public function isLibrary() { - return $this->type->isLibrary(); - } - - /** - * @return bool - */ - public function isExtension() { - return $this->type->isExtension(); - } - - /** - * @param ApplicationName $application - * @param Version|null $version - * - * @return bool - */ - public function isExtensionFor(ApplicationName $application, Version $version = null) { - if (!$this->isExtension()) { - return false; - } - - /** @var Extension $type */ - $type = $this->type; - - if ($version !== null) { - return $type->isCompatibleWith($application, $version); - } - - return $type->isExtensionFor($application); - } -} diff --git a/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php b/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php deleted file mode 100644 index 6dd9296..0000000 --- a/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class PhpExtensionRequirement implements Requirement { - /** - * @var string - */ - private $extension; - - /** - * @param string $extension - */ - public function __construct($extension) { - $this->extension = $extension; - } - - /** - * @return string - */ - public function __toString() { - return $this->extension; - } -} diff --git a/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php b/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php deleted file mode 100644 index 8ad3e76..0000000 --- a/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\VersionConstraint; - -class PhpVersionRequirement implements Requirement { - /** - * @var VersionConstraint - */ - private $versionConstraint; - - public function __construct(VersionConstraint $versionConstraint) { - $this->versionConstraint = $versionConstraint; - } - - /** - * @return VersionConstraint - */ - public function getVersionConstraint() { - return $this->versionConstraint; - } -} diff --git a/vendor/phar-io/manifest/src/values/Requirement.php b/vendor/phar-io/manifest/src/values/Requirement.php deleted file mode 100644 index 03bb56d..0000000 --- a/vendor/phar-io/manifest/src/values/Requirement.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -interface Requirement { -} diff --git a/vendor/phar-io/manifest/src/values/RequirementCollection.php b/vendor/phar-io/manifest/src/values/RequirementCollection.php deleted file mode 100644 index af0e09b..0000000 --- a/vendor/phar-io/manifest/src/values/RequirementCollection.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class RequirementCollection implements \Countable, \IteratorAggregate { - /** - * @var Requirement[] - */ - private $requirements = []; - - public function add(Requirement $requirement) { - $this->requirements[] = $requirement; - } - - /** - * @return Requirement[] - */ - public function getRequirements() { - return $this->requirements; - } - - /** - * @return int - */ - public function count() { - return count($this->requirements); - } - - /** - * @return RequirementCollectionIterator - */ - public function getIterator() { - return new RequirementCollectionIterator($this); - } -} diff --git a/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php b/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php deleted file mode 100644 index 9bb7003..0000000 --- a/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class RequirementCollectionIterator implements \Iterator { - /** - * @var Requirement[] - */ - private $requirements = []; - - /** - * @var int - */ - private $position; - - public function __construct(RequirementCollection $requirements) { - $this->requirements = $requirements->getRequirements(); - } - - public function rewind() { - $this->position = 0; - } - - /** - * @return bool - */ - public function valid() { - return $this->position < count($this->requirements); - } - - /** - * @return int - */ - public function key() { - return $this->position; - } - - /** - * @return Requirement - */ - public function current() { - return $this->requirements[$this->position]; - } - - public function next() { - $this->position++; - } -} diff --git a/vendor/phar-io/manifest/src/values/Type.php b/vendor/phar-io/manifest/src/values/Type.php deleted file mode 100644 index 31fbd44..0000000 --- a/vendor/phar-io/manifest/src/values/Type.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\VersionConstraint; - -abstract class Type { - /** - * @return Application - */ - public static function application() { - return new Application; - } - - /** - * @return Library - */ - public static function library() { - return new Library; - } - - /** - * @param ApplicationName $application - * @param VersionConstraint $versionConstraint - * - * @return Extension - */ - public static function extension(ApplicationName $application, VersionConstraint $versionConstraint) { - return new Extension($application, $versionConstraint); - } - - /** - * @return bool - */ - public function isApplication() { - return false; - } - - /** - * @return bool - */ - public function isLibrary() { - return false; - } - - /** - * @return bool - */ - public function isExtension() { - return false; - } -} diff --git a/vendor/phar-io/manifest/src/values/Url.php b/vendor/phar-io/manifest/src/values/Url.php deleted file mode 100644 index 37917c8..0000000 --- a/vendor/phar-io/manifest/src/values/Url.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class Url { - /** - * @var string - */ - private $url; - - /** - * @param string $url - * - * @throws InvalidUrlException - */ - public function __construct($url) { - $this->ensureUrlIsValid($url); - - $this->url = $url; - } - - /** - * @return string - */ - public function __toString() { - return $this->url; - } - - /** - * @param string $url - * - * @throws InvalidUrlException - */ - private function ensureUrlIsValid($url) { - if (filter_var($url, \FILTER_VALIDATE_URL) === false) { - throw new InvalidUrlException; - } - } -} diff --git a/vendor/phar-io/manifest/src/xml/AuthorElement.php b/vendor/phar-io/manifest/src/xml/AuthorElement.php deleted file mode 100644 index a32f397..0000000 --- a/vendor/phar-io/manifest/src/xml/AuthorElement.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class AuthorElement extends ManifestElement { - public function getName() { - return $this->getAttributeValue('name'); - } - - public function getEmail() { - return $this->getAttributeValue('email'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php b/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php deleted file mode 100644 index 1240d8c..0000000 --- a/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class AuthorElementCollection extends ElementCollection { - public function current() { - return new AuthorElement( - $this->getCurrentElement() - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/BundlesElement.php b/vendor/phar-io/manifest/src/xml/BundlesElement.php deleted file mode 100644 index b90023e..0000000 --- a/vendor/phar-io/manifest/src/xml/BundlesElement.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class BundlesElement extends ManifestElement { - public function getComponentElements() { - return new ComponentElementCollection( - $this->getChildrenByName('component') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ComponentElement.php b/vendor/phar-io/manifest/src/xml/ComponentElement.php deleted file mode 100644 index 64ed6b0..0000000 --- a/vendor/phar-io/manifest/src/xml/ComponentElement.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ComponentElement extends ManifestElement { - public function getName() { - return $this->getAttributeValue('name'); - } - - public function getVersion() { - return $this->getAttributeValue('version'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php b/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php deleted file mode 100644 index 9d375f9..0000000 --- a/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ComponentElementCollection extends ElementCollection { - public function current() { - return new ComponentElement( - $this->getCurrentElement() - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ContainsElement.php b/vendor/phar-io/manifest/src/xml/ContainsElement.php deleted file mode 100644 index 8172f33..0000000 --- a/vendor/phar-io/manifest/src/xml/ContainsElement.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ContainsElement extends ManifestElement { - public function getName() { - return $this->getAttributeValue('name'); - } - - public function getVersion() { - return $this->getAttributeValue('version'); - } - - public function getType() { - return $this->getAttributeValue('type'); - } - - public function getExtensionElement() { - return new ExtensionElement( - $this->getChildByName('extension') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/CopyrightElement.php b/vendor/phar-io/manifest/src/xml/CopyrightElement.php deleted file mode 100644 index bf7848e..0000000 --- a/vendor/phar-io/manifest/src/xml/CopyrightElement.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class CopyrightElement extends ManifestElement { - public function getAuthorElements() { - return new AuthorElementCollection( - $this->getChildrenByName('author') - ); - } - - public function getLicenseElement() { - return new LicenseElement( - $this->getChildByName('license') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ElementCollection.php b/vendor/phar-io/manifest/src/xml/ElementCollection.php deleted file mode 100644 index 284e77b..0000000 --- a/vendor/phar-io/manifest/src/xml/ElementCollection.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use DOMElement; -use DOMNodeList; - -abstract class ElementCollection implements \Iterator { - /** - * @var DOMNodeList - */ - private $nodeList; - - private $position; - - /** - * ElementCollection constructor. - * - * @param DOMNodeList $nodeList - */ - public function __construct(DOMNodeList $nodeList) { - $this->nodeList = $nodeList; - $this->position = 0; - } - - abstract public function current(); - - /** - * @return DOMElement - */ - protected function getCurrentElement() { - return $this->nodeList->item($this->position); - } - - public function next() { - $this->position++; - } - - public function key() { - return $this->position; - } - - public function valid() { - return $this->position < $this->nodeList->length; - } - - public function rewind() { - $this->position = 0; - } -} diff --git a/vendor/phar-io/manifest/src/xml/ExtElement.php b/vendor/phar-io/manifest/src/xml/ExtElement.php deleted file mode 100644 index 7a824ab..0000000 --- a/vendor/phar-io/manifest/src/xml/ExtElement.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ExtElement extends ManifestElement { - public function getName() { - return $this->getAttributeValue('name'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ExtElementCollection.php b/vendor/phar-io/manifest/src/xml/ExtElementCollection.php deleted file mode 100644 index 17acc62..0000000 --- a/vendor/phar-io/manifest/src/xml/ExtElementCollection.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ExtElementCollection extends ElementCollection { - public function current() { - return new ExtElement( - $this->getCurrentElement() - ); - } - -} diff --git a/vendor/phar-io/manifest/src/xml/ExtensionElement.php b/vendor/phar-io/manifest/src/xml/ExtensionElement.php deleted file mode 100644 index 536c085..0000000 --- a/vendor/phar-io/manifest/src/xml/ExtensionElement.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ExtensionElement extends ManifestElement { - public function getFor() { - return $this->getAttributeValue('for'); - } - - public function getCompatible() { - return $this->getAttributeValue('compatible'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/LicenseElement.php b/vendor/phar-io/manifest/src/xml/LicenseElement.php deleted file mode 100644 index ee001df..0000000 --- a/vendor/phar-io/manifest/src/xml/LicenseElement.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class LicenseElement extends ManifestElement { - public function getType() { - return $this->getAttributeValue('type'); - } - - public function getUrl() { - return $this->getAttributeValue('url'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ManifestDocument.php b/vendor/phar-io/manifest/src/xml/ManifestDocument.php deleted file mode 100644 index 9b0bd9d..0000000 --- a/vendor/phar-io/manifest/src/xml/ManifestDocument.php +++ /dev/null @@ -1,118 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use DOMDocument; -use DOMElement; - -class ManifestDocument { - const XMLNS = 'https://phar.io/xml/manifest/1.0'; - - /** - * @var DOMDocument - */ - private $dom; - - /** - * ManifestDocument constructor. - * - * @param DOMDocument $dom - */ - private function __construct(DOMDocument $dom) { - $this->ensureCorrectDocumentType($dom); - - $this->dom = $dom; - } - - public static function fromFile($filename) { - if (!file_exists($filename)) { - throw new ManifestDocumentException( - sprintf('File "%s" not found', $filename) - ); - } - - return self::fromString( - file_get_contents($filename) - ); - } - - public static function fromString($xmlString) { - $prev = libxml_use_internal_errors(true); - libxml_clear_errors(); - - $dom = new DOMDocument(); - $dom->loadXML($xmlString); - - $errors = libxml_get_errors(); - libxml_use_internal_errors($prev); - - if (count($errors) !== 0) { - throw new ManifestDocumentLoadingException($errors); - } - - return new self($dom); - } - - public function getContainsElement() { - return new ContainsElement( - $this->fetchElementByName('contains') - ); - } - - public function getCopyrightElement() { - return new CopyrightElement( - $this->fetchElementByName('copyright') - ); - } - - public function getRequiresElement() { - return new RequiresElement( - $this->fetchElementByName('requires') - ); - } - - public function hasBundlesElement() { - return $this->dom->getElementsByTagNameNS(self::XMLNS, 'bundles')->length === 1; - } - - public function getBundlesElement() { - return new BundlesElement( - $this->fetchElementByName('bundles') - ); - } - - private function ensureCorrectDocumentType(DOMDocument $dom) { - $root = $dom->documentElement; - - if ($root->localName !== 'phar' || $root->namespaceURI !== self::XMLNS) { - throw new ManifestDocumentException('Not a phar.io manifest document'); - } - } - - /** - * @param $elementName - * - * @return DOMElement - * - * @throws ManifestDocumentException - */ - private function fetchElementByName($elementName) { - $element = $this->dom->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); - - if (!$element instanceof DOMElement) { - throw new ManifestDocumentException( - sprintf('Element %s missing', $elementName) - ); - } - - return $element; - } -} diff --git a/vendor/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php b/vendor/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php deleted file mode 100644 index 59ac5c6..0000000 --- a/vendor/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use LibXMLError; - -class ManifestDocumentLoadingException extends \Exception implements Exception { - /** - * @var LibXMLError[] - */ - private $libxmlErrors; - - /** - * ManifestDocumentLoadingException constructor. - * - * @param LibXMLError[] $libxmlErrors - */ - public function __construct(array $libxmlErrors) { - $this->libxmlErrors = $libxmlErrors; - $first = $this->libxmlErrors[0]; - - parent::__construct( - sprintf( - '%s (Line: %d / Column: %d / File: %s)', - $first->message, - $first->line, - $first->column, - $first->file - ), - $first->code - ); - } - - /** - * @return LibXMLError[] - */ - public function getLibxmlErrors() { - return $this->libxmlErrors; - } -} diff --git a/vendor/phar-io/manifest/src/xml/ManifestElement.php b/vendor/phar-io/manifest/src/xml/ManifestElement.php deleted file mode 100644 index 09d07cc..0000000 --- a/vendor/phar-io/manifest/src/xml/ManifestElement.php +++ /dev/null @@ -1,100 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use DOMElement; -use DOMNodeList; - -class ManifestElement { - const XMLNS = 'https://phar.io/xml/manifest/1.0'; - - /** - * @var DOMElement - */ - private $element; - - /** - * ContainsElement constructor. - * - * @param DOMElement $element - */ - public function __construct(DOMElement $element) { - $this->element = $element; - } - - /** - * @param string $name - * - * @return string - * - * @throws ManifestElementException - */ - protected function getAttributeValue($name) { - if (!$this->element->hasAttribute($name)) { - throw new ManifestElementException( - sprintf( - 'Attribute %s not set on element %s', - $name, - $this->element->localName - ) - ); - } - - return $this->element->getAttribute($name); - } - - /** - * @param $elementName - * - * @return DOMElement - * - * @throws ManifestElementException - */ - protected function getChildByName($elementName) { - $element = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); - - if (!$element instanceof DOMElement) { - throw new ManifestElementException( - sprintf('Element %s missing', $elementName) - ); - } - - return $element; - } - - /** - * @param $elementName - * - * @return DOMNodeList - * - * @throws ManifestElementException - */ - protected function getChildrenByName($elementName) { - $elementList = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName); - - if ($elementList->length === 0) { - throw new ManifestElementException( - sprintf('Element(s) %s missing', $elementName) - ); - } - - return $elementList; - } - - /** - * @param string $elementName - * - * @return bool - */ - protected function hasChild($elementName) { - return $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->length !== 0; - } -} diff --git a/vendor/phar-io/manifest/src/xml/PhpElement.php b/vendor/phar-io/manifest/src/xml/PhpElement.php deleted file mode 100644 index e7340c0..0000000 --- a/vendor/phar-io/manifest/src/xml/PhpElement.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class PhpElement extends ManifestElement { - public function getVersion() { - return $this->getAttributeValue('version'); - } - - public function hasExtElements() { - return $this->hasChild('ext'); - } - - public function getExtElements() { - return new ExtElementCollection( - $this->getChildrenByName('ext') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/RequiresElement.php b/vendor/phar-io/manifest/src/xml/RequiresElement.php deleted file mode 100644 index 5f41b2e..0000000 --- a/vendor/phar-io/manifest/src/xml/RequiresElement.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class RequiresElement extends ManifestElement { - public function getPHPElement() { - return new PhpElement( - $this->getChildByName('php') - ); - } -} diff --git a/vendor/phar-io/manifest/tests/ManifestDocumentMapperTest.php b/vendor/phar-io/manifest/tests/ManifestDocumentMapperTest.php deleted file mode 100644 index c69d761..0000000 --- a/vendor/phar-io/manifest/tests/ManifestDocumentMapperTest.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -/** - * @covers \PharIo\Manifest\ManifestDocumentMapper - * - * @uses \PharIo\Manifest\ApplicationName - * @uses \PharIo\Manifest\Author - * @uses \PharIo\Manifest\AuthorCollection - * @uses \PharIo\Manifest\AuthorCollectionIterator - * @uses \PharIo\Manifest\AuthorElement - * @uses \PharIo\Manifest\AuthorElementCollection - * @uses \PharIo\Manifest\BundledComponent - * @uses \PharIo\Manifest\BundledComponentCollection - * @uses \PharIo\Manifest\BundledComponentCollectionIterator - * @uses \PharIo\Manifest\BundlesElement - * @uses \PharIo\Manifest\ComponentElement - * @uses \PharIo\Manifest\ComponentElementCollection - * @uses \PharIo\Manifest\ContainsElement - * @uses \PharIo\Manifest\CopyrightElement - * @uses \PharIo\Manifest\CopyrightInformation - * @uses \PharIo\Manifest\ElementCollection - * @uses \PharIo\Manifest\Email - * @uses \PharIo\Manifest\ExtElement - * @uses \PharIo\Manifest\ExtElementCollection - * @uses \PharIo\Manifest\License - * @uses \PharIo\Manifest\LicenseElement - * @uses \PharIo\Manifest\Manifest - * @uses \PharIo\Manifest\ManifestDocument - * @uses \PharIo\Manifest\ManifestDocumentMapper - * @uses \PharIo\Manifest\ManifestElement - * @uses \PharIo\Manifest\ManifestLoader - * @uses \PharIo\Manifest\PhpElement - * @uses \PharIo\Manifest\PhpExtensionRequirement - * @uses \PharIo\Manifest\PhpVersionRequirement - * @uses \PharIo\Manifest\RequirementCollection - * @uses \PharIo\Manifest\RequirementCollectionIterator - * @uses \PharIo\Manifest\RequiresElement - * @uses \PharIo\Manifest\Type - * @uses \PharIo\Manifest\Url - * @uses \PharIo\Version\Version - * @uses \PharIo\Version\VersionConstraint - */ -class ManifestDocumentMapperTest extends \PHPUnit\Framework\TestCase { - /** - * @dataProvider dataProvider - * - * @param $expected - * - * @uses \PharIo\Manifest\Application - * @uses \PharIo\Manifest\ApplicationName - * @uses \PharIo\Manifest\Library - * @uses \PharIo\Manifest\Extension - * @uses \PharIo\Manifest\ExtensionElement - */ - public function testCanSerializeToString($expected) { - $manifestDocument = ManifestDocument::fromFile($expected); - $mapper = new ManifestDocumentMapper(); - - $this->assertInstanceOf( - Manifest::class, - $mapper->map($manifestDocument) - ); - } - - public function dataProvider() { - return [ - 'application' => [__DIR__ . '/_fixture/phpunit-5.6.5.xml'], - 'library' => [__DIR__ . '/_fixture/library.xml'], - 'extension' => [__DIR__ . '/_fixture/extension.xml'] - ]; - } - - public function testThrowsExceptionOnUnsupportedType() { - $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/custom.xml'); - $mapper = new ManifestDocumentMapper(); - - $this->expectException(ManifestDocumentMapperException::class); - $mapper->map($manifestDocument); - } - - public function testInvalidVersionInformationThrowsException() { - $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/invalidversion.xml'); - $mapper = new ManifestDocumentMapper(); - - $this->expectException(ManifestDocumentMapperException::class); - $mapper->map($manifestDocument); - } - - public function testInvalidVersionConstraintThrowsException() { - $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/invalidversionconstraint.xml'); - $mapper = new ManifestDocumentMapper(); - - $this->expectException(ManifestDocumentMapperException::class); - $mapper->map($manifestDocument); - } - - /** - * @uses \PharIo\Manifest\ExtensionElement - */ - public function testInvalidCompatibleConstraintThrowsException() { - $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/extension-invalidcompatible.xml'); - $mapper = new ManifestDocumentMapper(); - - $this->expectException(ManifestDocumentMapperException::class); - $mapper->map($manifestDocument); - } - -} diff --git a/vendor/phar-io/manifest/tests/ManifestLoaderTest.php b/vendor/phar-io/manifest/tests/ManifestLoaderTest.php deleted file mode 100644 index 919143a..0000000 --- a/vendor/phar-io/manifest/tests/ManifestLoaderTest.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -/** - * @covers \PharIo\Manifest\ManifestLoader - * - * @uses \PharIo\Manifest\Author - * @uses \PharIo\Manifest\AuthorCollection - * @uses \PharIo\Manifest\AuthorCollectionIterator - * @uses \PharIo\Manifest\AuthorElement - * @uses \PharIo\Manifest\AuthorElementCollection - * @uses \PharIo\Manifest\ApplicationName - * @uses \PharIo\Manifest\BundledComponent - * @uses \PharIo\Manifest\BundledComponentCollection - * @uses \PharIo\Manifest\BundledComponentCollectionIterator - * @uses \PharIo\Manifest\BundlesElement - * @uses \PharIo\Manifest\ComponentElement - * @uses \PharIo\Manifest\ComponentElementCollection - * @uses \PharIo\Manifest\ContainsElement - * @uses \PharIo\Manifest\CopyrightElement - * @uses \PharIo\Manifest\CopyrightInformation - * @uses \PharIo\Manifest\ElementCollection - * @uses \PharIo\Manifest\Email - * @uses \PharIo\Manifest\ExtElement - * @uses \PharIo\Manifest\ExtElementCollection - * @uses \PharIo\Manifest\License - * @uses \PharIo\Manifest\LicenseElement - * @uses \PharIo\Manifest\Manifest - * @uses \PharIo\Manifest\ManifestDocument - * @uses \PharIo\Manifest\ManifestDocumentMapper - * @uses \PharIo\Manifest\ManifestElement - * @uses \PharIo\Manifest\ManifestLoader - * @uses \PharIo\Manifest\PhpElement - * @uses \PharIo\Manifest\PhpExtensionRequirement - * @uses \PharIo\Manifest\PhpVersionRequirement - * @uses \PharIo\Manifest\RequirementCollection - * @uses \PharIo\Manifest\RequirementCollectionIterator - * @uses \PharIo\Manifest\RequiresElement - * @uses \PharIo\Manifest\Type - * @uses \PharIo\Manifest\Url - * @uses \PharIo\Version\Version - * @uses \PharIo\Version\VersionConstraint - */ -class ManifestLoaderTest extends \PHPUnit\Framework\TestCase { - public function testCanBeLoadedFromFile() { - $this->assertInstanceOf( - Manifest::class, - ManifestLoader::fromFile(__DIR__ . '/_fixture/library.xml') - ); - } - - public function testCanBeLoadedFromString() { - $this->assertInstanceOf( - Manifest::class, - ManifestLoader::fromString( - file_get_contents(__DIR__ . '/_fixture/library.xml') - ) - ); - } - - public function testCanBeLoadedFromPhar() { - $this->assertInstanceOf( - Manifest::class, - ManifestLoader::fromPhar(__DIR__ . '/_fixture/test.phar') - ); - - } - - public function testLoadingNonExistingFileThrowsException() { - $this->expectException(ManifestLoaderException::class); - ManifestLoader::fromFile('/not/existing'); - } - - /** - * @uses \PharIo\Manifest\ManifestDocumentLoadingException - */ - public function testLoadingInvalidXmlThrowsException() { - $this->expectException(ManifestLoaderException::class); - ManifestLoader::fromString('<?xml version="1.0" ?><broken>'); - } - -} diff --git a/vendor/phar-io/manifest/tests/ManifestSerializerTest.php b/vendor/phar-io/manifest/tests/ManifestSerializerTest.php deleted file mode 100644 index 5fdf799..0000000 --- a/vendor/phar-io/manifest/tests/ManifestSerializerTest.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -use PharIo\Version\Version; - -/** - * @covers \PharIo\Manifest\ManifestSerializer - * - * @uses \PharIo\Manifest\ApplicationName - * @uses \PharIo\Manifest\Author - * @uses \PharIo\Manifest\AuthorCollection - * @uses \PharIo\Manifest\AuthorCollectionIterator - * @uses \PharIo\Manifest\AuthorElement - * @uses \PharIo\Manifest\AuthorElementCollection - * @uses \PharIo\Manifest\BundledComponent - * @uses \PharIo\Manifest\BundledComponentCollection - * @uses \PharIo\Manifest\BundledComponentCollectionIterator - * @uses \PharIo\Manifest\BundlesElement - * @uses \PharIo\Manifest\ComponentElement - * @uses \PharIo\Manifest\ComponentElementCollection - * @uses \PharIo\Manifest\ContainsElement - * @uses \PharIo\Manifest\CopyrightElement - * @uses \PharIo\Manifest\CopyrightInformation - * @uses \PharIo\Manifest\ElementCollection - * @uses \PharIo\Manifest\Email - * @uses \PharIo\Manifest\ExtElement - * @uses \PharIo\Manifest\ExtElementCollection - * @uses \PharIo\Manifest\License - * @uses \PharIo\Manifest\LicenseElement - * @uses \PharIo\Manifest\Manifest - * @uses \PharIo\Manifest\ManifestDocument - * @uses \PharIo\Manifest\ManifestDocumentMapper - * @uses \PharIo\Manifest\ManifestElement - * @uses \PharIo\Manifest\ManifestLoader - * @uses \PharIo\Manifest\PhpElement - * @uses \PharIo\Manifest\PhpExtensionRequirement - * @uses \PharIo\Manifest\PhpVersionRequirement - * @uses \PharIo\Manifest\RequirementCollection - * @uses \PharIo\Manifest\RequirementCollectionIterator - * @uses \PharIo\Manifest\RequiresElement - * @uses \PharIo\Manifest\Type - * @uses \PharIo\Manifest\Url - * @uses \PharIo\Version\Version - * @uses \PharIo\Version\VersionConstraint - */ -class ManifestSerializerTest extends \PHPUnit\Framework\TestCase { - /** - * @dataProvider dataProvider - * - * @param $expected - * - * @uses \PharIo\Manifest\Application - * @uses \PharIo\Manifest\Library - * @uses \PharIo\Manifest\Extension - * @uses \PharIo\Manifest\ExtensionElement - */ - public function testCanSerializeToString($expected) { - $manifest = ManifestLoader::fromString($expected); - - $serializer = new ManifestSerializer(); - - $this->assertXmlStringEqualsXmlString( - $expected, - $serializer->serializeToString($manifest) - ); - } - - public function dataProvider() { - return [ - 'application' => [file_get_contents(__DIR__ . '/_fixture/phpunit-5.6.5.xml')], - 'library' => [file_get_contents(__DIR__ . '/_fixture/library.xml')], - 'extension' => [file_get_contents(__DIR__ . '/_fixture/extension.xml')] - ]; - } - - /** - * @uses \PharIo\Manifest\Library - * @uses \PharIo\Manifest\ApplicationName - */ - public function testCanSerializeToFile() { - $src = __DIR__ . '/_fixture/library.xml'; - $dest = '/tmp/' . uniqid('serializer', true); - $manifest = ManifestLoader::fromFile($src); - $serializer = new ManifestSerializer(); - $serializer->serializeToFile($manifest, $dest); - $this->assertXmlFileEqualsXmlFile($src, $dest); - unlink($dest); - } - - /** - * @uses \PharIo\Manifest\ApplicationName - */ - public function testCanHandleUnknownType() { - $type = $this->getMockForAbstractClass(Type::class); - $manifest = new Manifest( - new ApplicationName('testvendor/testname'), - new Version('1.0.0'), - $type, - new CopyrightInformation( - new AuthorCollection(), - new License('bsd-3', new Url('https://some/uri')) - ), - new RequirementCollection(), - new BundledComponentCollection() - ); - - $serializer = new ManifestSerializer(); - $this->assertXmlStringEqualsXmlFile( - __DIR__ . '/_fixture/custom.xml', - $serializer->serializeToString($manifest) - ); - } -} diff --git a/vendor/phar-io/manifest/tests/_fixture/custom.xml b/vendor/phar-io/manifest/tests/_fixture/custom.xml deleted file mode 100644 index 4f43828..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/custom.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phar xmlns="https://phar.io/xml/manifest/1.0"> - <contains name="testvendor/testname" version="1.0.0" type="custom"/> - <copyright> - <license type="bsd-3" url="https://some/uri"/> - </copyright> - <requires> - <php version="*"/> - </requires> -</phar> diff --git a/vendor/phar-io/manifest/tests/_fixture/extension-invalidcompatible.xml b/vendor/phar-io/manifest/tests/_fixture/extension-invalidcompatible.xml deleted file mode 100644 index a78111c..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/extension-invalidcompatible.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phar xmlns="https://phar.io/xml/manifest/1.0"> - <contains name="phpunit/phpunit-example-extension" version="1.0.0" type="extension"> - <extension for="phpunit/phpunit" compatible="invalid"/> - </contains> - <copyright> - <author name="Sebastian Bergmann" email="sebastian@phpunit.de"/> - <license type="BSD-3-Clause" url="https://github.com/sebastianbergmann/phpunit-example-extension/blob/master/LICENSE"/> - </copyright> - <requires> - <php version="^7.0"/> - </requires> -</phar> diff --git a/vendor/phar-io/manifest/tests/_fixture/extension.xml b/vendor/phar-io/manifest/tests/_fixture/extension.xml deleted file mode 100644 index a870aee..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/extension.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phar xmlns="https://phar.io/xml/manifest/1.0"> - <contains name="phpunit/phpunit-example-extension" version="1.0.0" type="extension"> - <extension for="phpunit/phpunit" compatible="^5.7"/> - </contains> - <copyright> - <author name="Sebastian Bergmann" email="sebastian@phpunit.de"/> - <license type="BSD-3-Clause" url="https://github.com/sebastianbergmann/phpunit-example-extension/blob/master/LICENSE"/> - </copyright> - <requires> - <php version="^7.0"/> - </requires> -</phar> diff --git a/vendor/phar-io/manifest/tests/_fixture/invalidversion.xml b/vendor/phar-io/manifest/tests/_fixture/invalidversion.xml deleted file mode 100644 index 788dd4c..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/invalidversion.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phar xmlns="https://phar.io/xml/manifest/1.0"> - <contains name="some/library" version="abc" type="library" /> - <copyright> - <author name="Reiner Zufall" email="reiner@zufall.de"/> - <license type="BSD-3-Clause" url="https://domain.tld/LICENSE"/> - </copyright> - <requires> - <php version="7.0"/> - </requires> -</phar> diff --git a/vendor/phar-io/manifest/tests/_fixture/invalidversionconstraint.xml b/vendor/phar-io/manifest/tests/_fixture/invalidversionconstraint.xml deleted file mode 100644 index f881f8b..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/invalidversionconstraint.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phar xmlns="https://phar.io/xml/manifest/1.0"> - <contains name="some/library" version="1.0.0" type="library" /> - <copyright> - <author name="Reiner Zufall" email="reiner@zufall.de"/> - <license type="BSD-3-Clause" url="https://domain.tld/LICENSE"/> - </copyright> - <requires> - <php version="invalid"/> - </requires> -</phar> diff --git a/vendor/phar-io/manifest/tests/_fixture/library.xml b/vendor/phar-io/manifest/tests/_fixture/library.xml deleted file mode 100644 index a5e2523..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/library.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phar xmlns="https://phar.io/xml/manifest/1.0"> - <contains name="some/library" version="1.0.0" type="library" /> - <copyright> - <author name="Reiner Zufall" email="reiner@zufall.de"/> - <license type="BSD-3-Clause" url="https://domain.tld/LICENSE"/> - </copyright> - <requires> - <php version="7.0"/> - </requires> -</phar> diff --git a/vendor/phar-io/manifest/tests/_fixture/manifest.xml b/vendor/phar-io/manifest/tests/_fixture/manifest.xml deleted file mode 100644 index a5e2523..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/manifest.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phar xmlns="https://phar.io/xml/manifest/1.0"> - <contains name="some/library" version="1.0.0" type="library" /> - <copyright> - <author name="Reiner Zufall" email="reiner@zufall.de"/> - <license type="BSD-3-Clause" url="https://domain.tld/LICENSE"/> - </copyright> - <requires> - <php version="7.0"/> - </requires> -</phar> diff --git a/vendor/phar-io/manifest/tests/_fixture/phpunit-5.6.5.xml b/vendor/phar-io/manifest/tests/_fixture/phpunit-5.6.5.xml deleted file mode 100644 index aadbea2..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/phpunit-5.6.5.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phar xmlns="https://phar.io/xml/manifest/1.0"> - <contains name="phpunit/phpunit" version="5.6.5" type="application"/> - <copyright> - <author name="Sebastian Bergmann" email="sebastian@phpunit.de"/> - <license type="BSD-3-Clause" url="https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE"/> - </copyright> - <requires> - <!-- constraint on next line should be ^5.6 || ^7.0 --> - <php version="^7.0"> - <ext name="dom"/> - <ext name="json"/> - <ext name="mbstring"/> - <ext name="xml"/> - <ext name="libxml"/> - </php> - </requires> - <bundles> - <component name="doctrine/instantiator" version="1.0.5"/> - <component name="myclabs/deep-copy" version="1.5.5"/> - <component name="phpdocumentor/reflection-common" version="1.0"/> - <component name="phpdocumentor/reflection-docblock" version="3.1.1"/> - <component name="phpdocumentor/type-resolver" version="0.2"/> - <component name="phpspec/prophecy" version="v1.6.2"/> - <component name="phpunit/dbunit" version="2.0.2"/> - <component name="phpunit/php-code-coverage" version="4.0.2"/> - <component name="phpunit/php-file-iterator" version="1.4.1"/> - <component name="phpunit/php-invoker" version="1.1.4"/> - <component name="phpunit/php-text-template" version="1.2.1"/> - <component name="phpunit/php-timer" version="1.0.8"/> - <component name="phpunit/php-token-stream" version="1.4.9"/> - <component name="phpunit/phpunit-mock-objects" version="3.4.1"/> - <component name="sebastian/code-unit-reverse-lookup" version="1.0.0"/> - <component name="sebastian/comparator" version="1.2.2"/> - <component name="sebastian/diff" version="1.4.1"/> - <component name="sebastian/environment" version="1.3.8"/> - <component name="sebastian/exporter" version="2.0.0"/> - <component name="sebastian/global-state" version="1.1.1"/> - <component name="sebastian/object-enumerator" version="2.0.0"/> - <component name="sebastian/recursion-context" version="2.0.0"/> - <component name="sebastian/resource-operations" version="1.0.0"/> - <component name="sebastian/version" version="2.0.0"/> - <component name="symfony/yaml" version="v3.1.7"/> - <component name="webmozart/assert" version="1.1.0"/> - </bundles> -</phar> diff --git a/vendor/phar-io/manifest/tests/_fixture/test.phar b/vendor/phar-io/manifest/tests/_fixture/test.phar deleted file mode 100644 index d2a3e393ea403e5989aafa4b77d6ae6f07aafe75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7165 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 diff --git a/vendor/phar-io/manifest/tests/exceptions/ManifestDocumentLoadingExceptionTest.php b/vendor/phar-io/manifest/tests/exceptions/ManifestDocumentLoadingExceptionTest.php deleted file mode 100644 index 70f7553..0000000 --- a/vendor/phar-io/manifest/tests/exceptions/ManifestDocumentLoadingExceptionTest.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -use DOMDocument; -use LibXMLError; - -class ManifestDocumentLoadingExceptionTest extends \PHPUnit\Framework\TestCase { - public function testXMLErrorsCanBeRetrieved() { - $dom = new DOMDocument(); - $prev = libxml_use_internal_errors(true); - $dom->loadXML('<?xml version="1.0" ?><broken>'); - $exception = new ManifestDocumentLoadingException(libxml_get_errors()); - libxml_use_internal_errors($prev); - - $this->assertContainsOnlyInstancesOf(LibXMLError::class, $exception->getLibxmlErrors()); - } - -} diff --git a/vendor/phar-io/manifest/tests/values/ApplicationNameTest.php b/vendor/phar-io/manifest/tests/values/ApplicationNameTest.php deleted file mode 100644 index 8ed3f3a..0000000 --- a/vendor/phar-io/manifest/tests/values/ApplicationNameTest.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -class ApplicationNameTest extends TestCase { - - public function testCanBeCreatedWithValidName() { - $this->assertInstanceOf( - ApplicationName::class, - new ApplicationName('foo/bar') - ); - } - - public function testUsingInvalidFormatForNameThrowsException() { - $this->expectException(InvalidApplicationNameException::class); - $this->expectExceptionCode(InvalidApplicationNameException::InvalidFormat); - new ApplicationName('foo'); - } - - public function testUsingWrongTypeForNameThrowsException() { - $this->expectException(InvalidApplicationNameException::class); - $this->expectExceptionCode(InvalidApplicationNameException::NotAString); - new ApplicationName(123); - } - - public function testReturnsTrueForEqualNamesWhenCompared() { - $app = new ApplicationName('foo/bar'); - $this->assertTrue( - $app->isEqual($app) - ); - } - - public function testReturnsFalseForNonEqualNamesWhenCompared() { - $app1 = new ApplicationName('foo/bar'); - $app2 = new ApplicationName('foo/foo'); - $this->assertFalse( - $app1->isEqual($app2) - ); - } - - public function testCanBeConvertedToString() { - $this->assertEquals( - 'foo/bar', - new ApplicationName('foo/bar') - ); - } -} diff --git a/vendor/phar-io/manifest/tests/values/ApplicationTest.php b/vendor/phar-io/manifest/tests/values/ApplicationTest.php deleted file mode 100644 index 86b5da6..0000000 --- a/vendor/phar-io/manifest/tests/values/ApplicationTest.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\Application - * @covers PharIo\Manifest\Type - */ -class ApplicationTest extends TestCase { - /** - * @var Application - */ - private $type; - - protected function setUp() { - $this->type = Type::application(); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(Application::class, $this->type); - } - - public function testIsApplication() { - $this->assertTrue($this->type->isApplication()); - } - - public function testIsNotLibrary() { - $this->assertFalse($this->type->isLibrary()); - } - - public function testIsNotExtension() { - $this->assertFalse($this->type->isExtension()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/AuthorCollectionTest.php b/vendor/phar-io/manifest/tests/values/AuthorCollectionTest.php deleted file mode 100644 index 0fa1b95..0000000 --- a/vendor/phar-io/manifest/tests/values/AuthorCollectionTest.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Manifest\AuthorCollection - * @covers \PharIo\Manifest\AuthorCollectionIterator - * - * @uses \PharIo\Manifest\Author - * @uses \PharIo\Manifest\Email - */ -class AuthorCollectionTest extends TestCase { - /** - * @var AuthorCollection - */ - private $collection; - - /** - * @var Author - */ - private $item; - - protected function setUp() { - $this->collection = new AuthorCollection; - $this->item = new Author('Joe Developer', new Email('user@example.com')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(AuthorCollection::class, $this->collection); - } - - public function testCanBeCounted() { - $this->collection->add($this->item); - - $this->assertCount(1, $this->collection); - } - - public function testCanBeIterated() { - $this->collection->add( - new Author('Dummy First', new Email('dummy@example.com')) - ); - $this->collection->add($this->item); - $this->assertContains($this->item, $this->collection); - } - - public function testKeyPositionCanBeRetreived() { - $this->collection->add($this->item); - foreach($this->collection as $key => $item) { - $this->assertEquals(0, $key); - } - } -} diff --git a/vendor/phar-io/manifest/tests/values/AuthorTest.php b/vendor/phar-io/manifest/tests/values/AuthorTest.php deleted file mode 100644 index b7317fa..0000000 --- a/vendor/phar-io/manifest/tests/values/AuthorTest.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\Author - * - * @uses PharIo\Manifest\Email - */ -class AuthorTest extends TestCase { - /** - * @var Author - */ - private $author; - - protected function setUp() { - $this->author = new Author('Joe Developer', new Email('user@example.com')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(Author::class, $this->author); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('Joe Developer', $this->author->getName()); - } - - public function testEmailCanBeRetrieved() { - $this->assertEquals('user@example.com', $this->author->getEmail()); - } - - public function testCanBeUsedAsString() { - $this->assertEquals('Joe Developer <user@example.com>', $this->author); - } -} diff --git a/vendor/phar-io/manifest/tests/values/BundledComponentCollectionTest.php b/vendor/phar-io/manifest/tests/values/BundledComponentCollectionTest.php deleted file mode 100644 index 66cd0c4..0000000 --- a/vendor/phar-io/manifest/tests/values/BundledComponentCollectionTest.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Manifest\BundledComponentCollection - * @covers \PharIo\Manifest\BundledComponentCollectionIterator - * - * @uses \PharIo\Manifest\BundledComponent - * @uses \PharIo\Version\Version - */ -class BundledComponentCollectionTest extends TestCase { - /** - * @var BundledComponentCollection - */ - private $collection; - - /** - * @var BundledComponent - */ - private $item; - - protected function setUp() { - $this->collection = new BundledComponentCollection; - $this->item = new BundledComponent('phpunit/php-code-coverage', new Version('4.0.2')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(BundledComponentCollection::class, $this->collection); - } - - public function testCanBeCounted() { - $this->collection->add($this->item); - - $this->assertCount(1, $this->collection); - } - - public function testCanBeIterated() { - $this->collection->add($this->createMock(BundledComponent::class)); - $this->collection->add($this->item); - - $this->assertContains($this->item, $this->collection); - } - - public function testKeyPositionCanBeRetreived() { - $this->collection->add($this->item); - foreach($this->collection as $key => $item) { - $this->assertEquals(0, $key); - } - } - -} diff --git a/vendor/phar-io/manifest/tests/values/BundledComponentTest.php b/vendor/phar-io/manifest/tests/values/BundledComponentTest.php deleted file mode 100644 index 01b8e13..0000000 --- a/vendor/phar-io/manifest/tests/values/BundledComponentTest.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\BundledComponent - * - * @uses \PharIo\Version\Version - */ -class BundledComponentTest extends TestCase { - /** - * @var BundledComponent - */ - private $bundledComponent; - - protected function setUp() { - $this->bundledComponent = new BundledComponent('phpunit/php-code-coverage', new Version('4.0.2')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(BundledComponent::class, $this->bundledComponent); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('phpunit/php-code-coverage', $this->bundledComponent->getName()); - } - - public function testVersionCanBeRetrieved() { - $this->assertEquals('4.0.2', $this->bundledComponent->getVersion()->getVersionString()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/CopyrightInformationTest.php b/vendor/phar-io/manifest/tests/values/CopyrightInformationTest.php deleted file mode 100644 index de738f4..0000000 --- a/vendor/phar-io/manifest/tests/values/CopyrightInformationTest.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\CopyrightInformation - * - * @uses PharIo\Manifest\AuthorCollection - * @uses PharIo\Manifest\AuthorCollectionIterator - * @uses PharIo\Manifest\Author - * @uses PharIo\Manifest\Email - * @uses PharIo\Manifest\License - * @uses PharIo\Manifest\Url - */ -class CopyrightInformationTest extends TestCase { - /** - * @var CopyrightInformation - */ - private $copyrightInformation; - - /** - * @var Author - */ - private $author; - - /** - * @var License - */ - private $license; - - protected function setUp() { - $this->author = new Author('Joe Developer', new Email('user@example.com')); - $this->license = new License('BSD-3-Clause', new Url('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE')); - - $authors = new AuthorCollection; - $authors->add($this->author); - - $this->copyrightInformation = new CopyrightInformation($authors, $this->license); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(CopyrightInformation::class, $this->copyrightInformation); - } - - public function testAuthorsCanBeRetrieved() { - $this->assertContains($this->author, $this->copyrightInformation->getAuthors()); - } - - public function testLicenseCanBeRetrieved() { - $this->assertEquals($this->license, $this->copyrightInformation->getLicense()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/EmailTest.php b/vendor/phar-io/manifest/tests/values/EmailTest.php deleted file mode 100644 index ee38531..0000000 --- a/vendor/phar-io/manifest/tests/values/EmailTest.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\Email - */ -class EmailTest extends TestCase { - public function testCanBeCreatedForValidEmail() { - $this->assertInstanceOf(Email::class, new Email('user@example.com')); - } - - public function testCanBeUsedAsString() { - $this->assertEquals('user@example.com', new Email('user@example.com')); - } - - /** - * @covers PharIo\Manifest\InvalidEmailException - */ - public function testCannotBeCreatedForInvalidEmail() { - $this->expectException(InvalidEmailException::class); - - new Email('invalid'); - } -} diff --git a/vendor/phar-io/manifest/tests/values/ExtensionTest.php b/vendor/phar-io/manifest/tests/values/ExtensionTest.php deleted file mode 100644 index 1c9d676..0000000 --- a/vendor/phar-io/manifest/tests/values/ExtensionTest.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\AnyVersionConstraint; -use PharIo\Version\Version; -use PharIo\Version\VersionConstraint; -use PharIo\Version\VersionConstraintParser; -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Manifest\Extension - * @covers \PharIo\Manifest\Type - * - * @uses \PharIo\Version\VersionConstraint - * @uses \PharIo\Manifest\ApplicationName - */ -class ExtensionTest extends TestCase { - /** - * @var Extension - */ - private $type; - - /** - * @var ApplicationName|\PHPUnit_Framework_MockObject_MockObject - */ - private $name; - - protected function setUp() { - $this->name = $this->createMock(ApplicationName::class); - $this->type = Type::extension($this->name, new AnyVersionConstraint); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(Extension::class, $this->type); - } - - public function testIsNotApplication() { - $this->assertFalse($this->type->isApplication()); - } - - public function testIsNotLibrary() { - $this->assertFalse($this->type->isLibrary()); - } - - public function testIsExtension() { - $this->assertTrue($this->type->isExtension()); - } - - public function testApplicationCanBeRetrieved() - { - $this->assertInstanceOf(ApplicationName::class, $this->type->getApplicationName()); - } - - public function testVersionConstraintCanBeRetrieved() { - $this->assertInstanceOf( - VersionConstraint::class, - $this->type->getVersionConstraint() - ); - } - - public function testApplicationCanBeQueried() - { - $this->name->method('isEqual')->willReturn(true); - $this->assertTrue( - $this->type->isExtensionFor($this->createMock(ApplicationName::class)) - ); - } - - public function testCompatibleWithReturnsTrueForMatchingVersionConstraintAndApplicaiton() { - $app = new ApplicationName('foo/bar'); - $extension = Type::extension($app, (new VersionConstraintParser)->parse('^1.0')); - $version = new Version('1.0.0'); - - $this->assertTrue( - $extension->isCompatibleWith($app, $version) - ); - } - - public function testCompatibleWithReturnsFalseForNotMatchingVersionConstraint() { - $app = new ApplicationName('foo/bar'); - $extension = Type::extension($app, (new VersionConstraintParser)->parse('^1.0')); - $version = new Version('2.0.0'); - - $this->assertFalse( - $extension->isCompatibleWith($app, $version) - ); - } - - public function testCompatibleWithReturnsFalseForNotMatchingApplication() { - $app1 = new ApplicationName('foo/bar'); - $app2 = new ApplicationName('foo/foo'); - $extension = Type::extension($app1, (new VersionConstraintParser)->parse('^1.0')); - $version = new Version('1.0.0'); - - $this->assertFalse( - $extension->isCompatibleWith($app2, $version) - ); - } - -} diff --git a/vendor/phar-io/manifest/tests/values/LibraryTest.php b/vendor/phar-io/manifest/tests/values/LibraryTest.php deleted file mode 100644 index f8d1c64..0000000 --- a/vendor/phar-io/manifest/tests/values/LibraryTest.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\Library - * @covers PharIo\Manifest\Type - */ -class LibraryTest extends TestCase { - /** - * @var Library - */ - private $type; - - protected function setUp() { - $this->type = Type::library(); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(Library::class, $this->type); - } - - public function testIsNotApplication() { - $this->assertFalse($this->type->isApplication()); - } - - public function testIsLibrary() { - $this->assertTrue($this->type->isLibrary()); - } - - public function testIsNotExtension() { - $this->assertFalse($this->type->isExtension()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/LicenseTest.php b/vendor/phar-io/manifest/tests/values/LicenseTest.php deleted file mode 100644 index c9c5c3c..0000000 --- a/vendor/phar-io/manifest/tests/values/LicenseTest.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\License - * - * @uses PharIo\Manifest\Url - */ -class LicenseTest extends TestCase { - /** - * @var License - */ - private $license; - - protected function setUp() { - $this->license = new License('BSD-3-Clause', new Url('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(License::class, $this->license); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('BSD-3-Clause', $this->license->getName()); - } - - public function testUrlCanBeRetrieved() { - $this->assertEquals('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE', $this->license->getUrl()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/ManifestTest.php b/vendor/phar-io/manifest/tests/values/ManifestTest.php deleted file mode 100644 index cff0a68..0000000 --- a/vendor/phar-io/manifest/tests/values/ManifestTest.php +++ /dev/null @@ -1,187 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; -use PharIo\Version\AnyVersionConstraint; -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Manifest\Manifest - * - * @uses \PharIo\Manifest\ApplicationName - * @uses \PharIo\Manifest\Author - * @uses \PharIo\Manifest\AuthorCollection - * @uses \PharIo\Manifest\BundledComponent - * @uses \PharIo\Manifest\BundledComponentCollection - * @uses \PharIo\Manifest\CopyrightInformation - * @uses \PharIo\Manifest\Email - * @uses \PharIo\Manifest\License - * @uses \PharIo\Manifest\RequirementCollection - * @uses \PharIo\Manifest\PhpVersionRequirement - * @uses \PharIo\Manifest\Type - * @uses \PharIo\Manifest\Application - * @uses \PharIo\Manifest\Url - * @uses \PharIo\Version\Version - * @uses \PharIo\Version\VersionConstraint - */ -class ManifestTest extends TestCase { - /** - * @var ApplicationName - */ - private $name; - - /** - * @var Version - */ - private $version; - - /** - * @var Type - */ - private $type; - - /** - * @var CopyrightInformation - */ - private $copyrightInformation; - - /** - * @var RequirementCollection - */ - private $requirements; - - /** - * @var BundledComponentCollection - */ - private $bundledComponents; - - /** - * @var Manifest - */ - private $manifest; - - protected function setUp() { - $this->version = new Version('5.6.5'); - - $this->type = Type::application(); - - $author = new Author('Joe Developer', new Email('user@example.com')); - $license = new License('BSD-3-Clause', new Url('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE')); - - $authors = new AuthorCollection; - $authors->add($author); - - $this->copyrightInformation = new CopyrightInformation($authors, $license); - - $this->requirements = new RequirementCollection; - $this->requirements->add(new PhpVersionRequirement(new AnyVersionConstraint)); - - $this->bundledComponents = new BundledComponentCollection; - $this->bundledComponents->add(new BundledComponent('phpunit/php-code-coverage', new Version('4.0.2'))); - - $this->name = new ApplicationName('phpunit/phpunit'); - - $this->manifest = new Manifest( - $this->name, - $this->version, - $this->type, - $this->copyrightInformation, - $this->requirements, - $this->bundledComponents - ); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(Manifest::class, $this->manifest); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals($this->name, $this->manifest->getName()); - } - - public function testVersionCanBeRetrieved() { - $this->assertEquals($this->version, $this->manifest->getVersion()); - } - - public function testTypeCanBeRetrieved() { - $this->assertEquals($this->type, $this->manifest->getType()); - } - - public function testTypeCanBeQueried() { - $this->assertTrue($this->manifest->isApplication()); - $this->assertFalse($this->manifest->isLibrary()); - $this->assertFalse($this->manifest->isExtension()); - } - - public function testCopyrightInformationCanBeRetrieved() { - $this->assertEquals($this->copyrightInformation, $this->manifest->getCopyrightInformation()); - } - - public function testRequirementsCanBeRetrieved() { - $this->assertEquals($this->requirements, $this->manifest->getRequirements()); - } - - public function testBundledComponentsCanBeRetrieved() { - $this->assertEquals($this->bundledComponents, $this->manifest->getBundledComponents()); - } - - /** - * @uses \PharIo\Manifest\Extension - */ - public function testExtendedApplicationCanBeQueriedForExtension() - { - $appName = new ApplicationName('foo/bar'); - $manifest = new Manifest( - new ApplicationName('foo/foo'), - new Version('1.0.0'), - Type::extension($appName, new AnyVersionConstraint), - $this->copyrightInformation, - new RequirementCollection, - new BundledComponentCollection - ); - - $this->assertTrue($manifest->isExtensionFor($appName)); - } - - public function testNonExtensionReturnsFalseWhenQueriesForExtension() { - $appName = new ApplicationName('foo/bar'); - $manifest = new Manifest( - new ApplicationName('foo/foo'), - new Version('1.0.0'), - Type::library(), - $this->copyrightInformation, - new RequirementCollection, - new BundledComponentCollection - ); - - $this->assertFalse($manifest->isExtensionFor($appName)); - } - - /** - * @uses \PharIo\Manifest\Extension - */ - public function testExtendedApplicationCanBeQueriedForExtensionWithVersion() - { - $appName = new ApplicationName('foo/bar'); - $manifest = new Manifest( - new ApplicationName('foo/foo'), - new Version('1.0.0'), - Type::extension($appName, new AnyVersionConstraint), - $this->copyrightInformation, - new RequirementCollection, - new BundledComponentCollection - ); - - $this->assertTrue($manifest->isExtensionFor($appName, new Version('1.2.3'))); - } - -} diff --git a/vendor/phar-io/manifest/tests/values/PhpExtensionRequirementTest.php b/vendor/phar-io/manifest/tests/values/PhpExtensionRequirementTest.php deleted file mode 100644 index ae1c058..0000000 --- a/vendor/phar-io/manifest/tests/values/PhpExtensionRequirementTest.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\PhpExtensionRequirement - */ -class PhpExtensionRequirementTest extends TestCase { - public function testCanBeCreated() { - $this->assertInstanceOf(PhpExtensionRequirement::class, new PhpExtensionRequirement('dom')); - } - - public function testCanBeUsedAsString() { - $this->assertEquals('dom', new PhpExtensionRequirement('dom')); - } -} diff --git a/vendor/phar-io/manifest/tests/values/PhpVersionRequirementTest.php b/vendor/phar-io/manifest/tests/values/PhpVersionRequirementTest.php deleted file mode 100644 index 67ac41a..0000000 --- a/vendor/phar-io/manifest/tests/values/PhpVersionRequirementTest.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\ExactVersionConstraint; -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\PhpVersionRequirement - * - * @uses \PharIo\Version\VersionConstraint - */ -class PhpVersionRequirementTest extends TestCase { - /** - * @var PhpVersionRequirement - */ - private $requirement; - - protected function setUp() { - $this->requirement = new PhpVersionRequirement(new ExactVersionConstraint('7.1.0')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(PhpVersionRequirement::class, $this->requirement); - } - - public function testVersionConstraintCanBeRetrieved() { - $this->assertEquals('7.1.0', $this->requirement->getVersionConstraint()->asString()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/RequirementCollectionTest.php b/vendor/phar-io/manifest/tests/values/RequirementCollectionTest.php deleted file mode 100644 index 2afeb1a..0000000 --- a/vendor/phar-io/manifest/tests/values/RequirementCollectionTest.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\ExactVersionConstraint; -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Manifest\RequirementCollection - * @covers \PharIo\Manifest\RequirementCollectionIterator - * - * @uses \PharIo\Manifest\PhpVersionRequirement - * @uses \PharIo\Version\VersionConstraint - */ -class RequirementCollectionTest extends TestCase { - /** - * @var RequirementCollection - */ - private $collection; - - /** - * @var Requirement - */ - private $item; - - protected function setUp() { - $this->collection = new RequirementCollection; - $this->item = new PhpVersionRequirement(new ExactVersionConstraint('7.1.0')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(RequirementCollection::class, $this->collection); - } - - public function testCanBeCounted() { - $this->collection->add($this->item); - - $this->assertCount(1, $this->collection); - } - - public function testCanBeIterated() { - $this->collection->add(new PhpVersionRequirement(new ExactVersionConstraint('5.6.0'))); - $this->collection->add($this->item); - - $this->assertContains($this->item, $this->collection); - } - - public function testKeyPositionCanBeRetreived() { - $this->collection->add($this->item); - foreach($this->collection as $key => $item) { - $this->assertEquals(0, $key); - } - } - -} diff --git a/vendor/phar-io/manifest/tests/values/UrlTest.php b/vendor/phar-io/manifest/tests/values/UrlTest.php deleted file mode 100644 index 20f09c1..0000000 --- a/vendor/phar-io/manifest/tests/values/UrlTest.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -/* - * This file is part of PharIo\Manifest. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\Url - */ -class UrlTest extends TestCase { - public function testCanBeCreatedForValidUrl() { - $this->assertInstanceOf(Url::class, new Url('https://phar.io/')); - } - - public function testCanBeUsedAsString() { - $this->assertEquals('https://phar.io/', new Url('https://phar.io/')); - } - - /** - * @covers PharIo\Manifest\InvalidUrlException - */ - public function testCannotBeCreatedForInvalidUrl() { - $this->expectException(InvalidUrlException::class); - - new Url('invalid'); - } -} diff --git a/vendor/phar-io/manifest/tests/xml/AuthorElementCollectionTest.php b/vendor/phar-io/manifest/tests/xml/AuthorElementCollectionTest.php deleted file mode 100644 index 588558e..0000000 --- a/vendor/phar-io/manifest/tests/xml/AuthorElementCollectionTest.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -use DOMDocument; - -class AuthorElementCollectionTest extends \PHPUnit\Framework\TestCase { - public function testAuthorElementCanBeRetrievedFromCollection() { - $dom = new DOMDocument(); - $dom->loadXML('<?xml version="1.0" ?><author xmlns="https://phar.io/xml/manifest/1.0" name="Reiner Zufall" email="reiner@zufall.de" />'); - $collection = new AuthorElementCollection($dom->childNodes); - - foreach($collection as $authorElement) { - $this->assertInstanceOf(AuthorElement::class, $authorElement); - } - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/AuthorElementTest.php b/vendor/phar-io/manifest/tests/xml/AuthorElementTest.php deleted file mode 100644 index 6fce1d4..0000000 --- a/vendor/phar-io/manifest/tests/xml/AuthorElementTest.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -class AuthorElementTest extends \PHPUnit\Framework\TestCase { - /** - * @var AuthorElement - */ - private $author; - - protected function setUp() { - $dom = new \DOMDocument(); - $dom->loadXML('<?xml version="1.0" ?><author xmlns="https://phar.io/xml/manifest/1.0" name="Reiner Zufall" email="reiner@zufall.de" />'); - $this->author = new AuthorElement($dom->documentElement); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('Reiner Zufall', $this->author->getName()); - } - - public function testEmailCanBeRetrieved() { - $this->assertEquals('reiner@zufall.de', $this->author->getEmail()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/BundlesElementTest.php b/vendor/phar-io/manifest/tests/xml/BundlesElementTest.php deleted file mode 100644 index 7872795..0000000 --- a/vendor/phar-io/manifest/tests/xml/BundlesElementTest.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -use DOMDocument; - -class BundlesElementTest extends \PHPUnit\Framework\TestCase { - /** - * @var DOMDocument - */ - private $dom; - - /** - * @var BundlesElement - */ - private $bundles; - - protected function setUp() { - $this->dom = new DOMDocument(); - $this->dom->loadXML('<?xml version="1.0" ?><bundles xmlns="https://phar.io/xml/manifest/1.0" />'); - $this->bundles = new BundlesElement($this->dom->documentElement); - } - - public function testThrowsExceptionWhenGetComponentElementsIsCalledButNodesAreMissing() { - $this->expectException(ManifestElementException::class); - $this->bundles->getComponentElements(); - } - - public function testGetComponentElementsReturnsComponentElementCollection() { - $this->addComponent(); - $this->assertInstanceOf( - ComponentElementCollection::class, $this->bundles->getComponentElements() - ); - } - - private function addComponent() { - $this->dom->documentElement->appendChild( - $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'component') - ); - } -} diff --git a/vendor/phar-io/manifest/tests/xml/ComponentElementCollectionTest.php b/vendor/phar-io/manifest/tests/xml/ComponentElementCollectionTest.php deleted file mode 100644 index 9fe2378..0000000 --- a/vendor/phar-io/manifest/tests/xml/ComponentElementCollectionTest.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -use DOMDocument; - -class ComponentElementCollectionTest extends \PHPUnit\Framework\TestCase { - public function testComponentElementCanBeRetrievedFromCollection() { - $dom = new DOMDocument(); - $dom->loadXML('<?xml version="1.0" ?><component xmlns="https://phar.io/xml/manifest/1.0" />'); - $collection = new ComponentElementCollection($dom->childNodes); - - foreach($collection as $componentElement) { - $this->assertInstanceOf(ComponentElement::class, $componentElement); - } - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ComponentElementTest.php b/vendor/phar-io/manifest/tests/xml/ComponentElementTest.php deleted file mode 100644 index 1996585..0000000 --- a/vendor/phar-io/manifest/tests/xml/ComponentElementTest.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -class ComponentElementTest extends \PHPUnit\Framework\TestCase { - /** - * @var ComponentElement - */ - private $component; - - protected function setUp() { - $dom = new \DOMDocument(); - $dom->loadXML('<?xml version="1.0" ?><component xmlns="https://phar.io/xml/manifest/1.0" name="phar-io/phive" version="0.6.0" />'); - $this->component = new ComponentElement($dom->documentElement); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('phar-io/phive', $this->component->getName()); - } - - public function testEmailCanBeRetrieved() { - $this->assertEquals('0.6.0', $this->component->getVersion()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ContainsElementTest.php b/vendor/phar-io/manifest/tests/xml/ContainsElementTest.php deleted file mode 100644 index ed08600..0000000 --- a/vendor/phar-io/manifest/tests/xml/ContainsElementTest.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -use DOMDocument; -use DOMElement; - -class ContainsElementTest extends \PHPUnit\Framework\TestCase { - /** - * @var DOMElement - */ - private $domElement; - - /** - * @var ContainsElement - */ - private $contains; - - protected function setUp() { - $dom = new DOMDocument(); - $dom->loadXML('<?xml version="1.0" ?><php xmlns="https://phar.io/xml/manifest/1.0" name="phpunit/phpunit" version="5.6.5" type="application" />'); - $this->domElement = $dom->documentElement; - $this->contains = new ContainsElement($this->domElement); - } - - public function testVersionCanBeRetrieved() { - $this->assertEquals('5.6.5', $this->contains->getVersion()); - } - - public function testThrowsExceptionWhenVersionAttributeIsMissing() { - $this->domElement->removeAttribute('version'); - $this->expectException(ManifestElementException::class); - $this->contains->getVersion(); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('phpunit/phpunit', $this->contains->getName()); - } - - public function testThrowsExceptionWhenNameAttributeIsMissing() { - $this->domElement->removeAttribute('name'); - $this->expectException(ManifestElementException::class); - $this->contains->getName(); - } - - public function testTypeCanBeRetrieved() { - $this->assertEquals('application', $this->contains->getType()); - } - - public function testThrowsExceptionWhenTypeAttributeIsMissing() { - $this->domElement->removeAttribute('type'); - $this->expectException(ManifestElementException::class); - $this->contains->getType(); - } - - public function testGetExtensionElementReturnsExtensionElement() { - $this->domElement->appendChild( - $this->domElement->ownerDocument->createElementNS('https://phar.io/xml/manifest/1.0', 'extension') - ); - $this->assertInstanceOf(ExtensionElement::class, $this->contains->getExtensionElement()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/CopyrightElementTest.php b/vendor/phar-io/manifest/tests/xml/CopyrightElementTest.php deleted file mode 100644 index c74a2ce..0000000 --- a/vendor/phar-io/manifest/tests/xml/CopyrightElementTest.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -use DOMDocument; - -class CopyrightElementTest extends \PHPUnit\Framework\TestCase { - /** - * @var DOMDocument - */ - private $dom; - - /** - * @var CopyrightElement - */ - private $copyright; - - protected function setUp() { - $this->dom = new DOMDocument(); - $this->dom->loadXML('<?xml version="1.0" ?><copyright xmlns="https://phar.io/xml/manifest/1.0" />'); - $this->copyright = new CopyrightElement($this->dom->documentElement); - } - - public function testThrowsExceptionWhenGetAuthroElementsIsCalledButNodesAreMissing() { - $this->expectException(ManifestElementException::class); - $this->copyright->getAuthorElements(); - } - - public function testThrowsExceptionWhenGetLicenseElementIsCalledButNodeIsMissing() { - $this->expectException(ManifestElementException::class); - $this->copyright->getLicenseElement(); - } - - public function testGetAuthorElementsReturnsAuthorElementCollection() { - $this->dom->documentElement->appendChild( - $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'author') - ); - $this->assertInstanceOf( - AuthorElementCollection::class, $this->copyright->getAuthorElements() - ); - } - - public function testGetLicenseElementReturnsLicenseElement() { - $this->dom->documentElement->appendChild( - $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'license') - ); - $this->assertInstanceOf( - LicenseElement::class, $this->copyright->getLicenseElement() - ); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ExtElementCollectionTest.php b/vendor/phar-io/manifest/tests/xml/ExtElementCollectionTest.php deleted file mode 100644 index 7a456d2..0000000 --- a/vendor/phar-io/manifest/tests/xml/ExtElementCollectionTest.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -use DOMDocument; - -class ExtElementCollectionTest extends \PHPUnit\Framework\TestCase { - public function testComponentElementCanBeRetrievedFromCollection() { - $dom = new DOMDocument(); - $dom->loadXML('<?xml version="1.0" ?><ext xmlns="https://phar.io/xml/manifest/1.0" />'); - $collection = new ExtElementCollection($dom->childNodes); - - foreach($collection as $position => $extElement) { - $this->assertInstanceOf(ExtElement::class, $extElement); - $this->assertEquals(0, $position); - } - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ExtElementTest.php b/vendor/phar-io/manifest/tests/xml/ExtElementTest.php deleted file mode 100644 index db6ecbc..0000000 --- a/vendor/phar-io/manifest/tests/xml/ExtElementTest.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -class ExtElementTest extends \PHPUnit\Framework\TestCase { - /** - * @var ExtElement - */ - private $ext; - - protected function setUp() { - $dom = new \DOMDocument(); - $dom->loadXML('<?xml version="1.0" ?><ext xmlns="https://phar.io/xml/manifest/1.0" name="dom" />'); - $this->ext = new ExtElement($dom->documentElement); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('dom', $this->ext->getName()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ExtensionElementTest.php b/vendor/phar-io/manifest/tests/xml/ExtensionElementTest.php deleted file mode 100644 index 58965d8..0000000 --- a/vendor/phar-io/manifest/tests/xml/ExtensionElementTest.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -class ExtensionElementTest extends \PHPUnit\Framework\TestCase { - /** - * @var ExtensionElement - */ - private $extension; - - protected function setUp() { - $dom = new \DOMDocument(); - $dom->loadXML('<?xml version="1.0" ?><extension xmlns="https://phar.io/xml/manifest/1.0" for="phar-io/phive" compatible="~0.6" />'); - $this->extension = new ExtensionElement($dom->documentElement); - } - - public function testNForCanBeRetrieved() { - $this->assertEquals('phar-io/phive', $this->extension->getFor()); - } - - public function testCompatibleVersionConstraintCanBeRetrieved() { - $this->assertEquals('~0.6', $this->extension->getCompatible()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/LicenseElementTest.php b/vendor/phar-io/manifest/tests/xml/LicenseElementTest.php deleted file mode 100644 index 5b1ffcb..0000000 --- a/vendor/phar-io/manifest/tests/xml/LicenseElementTest.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -class LicenseElementTest extends \PHPUnit\Framework\TestCase { - /** - * @var LicenseElement - */ - private $license; - - protected function setUp() { - $dom = new \DOMDocument(); - $dom->loadXML('<?xml version="1.0" ?><license xmlns="https://phar.io/xml/manifest/1.0" type="BSD-3" url="https://some.tld/LICENSE" />'); - $this->license = new LicenseElement($dom->documentElement); - } - - public function testTypeCanBeRetrieved() { - $this->assertEquals('BSD-3', $this->license->getType()); - } - - public function testUrlCanBeRetrieved() { - $this->assertEquals('https://some.tld/LICENSE', $this->license->getUrl()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ManifestDocumentTest.php b/vendor/phar-io/manifest/tests/xml/ManifestDocumentTest.php deleted file mode 100644 index 3dd59bf..0000000 --- a/vendor/phar-io/manifest/tests/xml/ManifestDocumentTest.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -class ManifestDocumentTest extends \PHPUnit\Framework\TestCase { - public function testThrowsExceptionWhenFileDoesNotExist() { - $this->expectException(ManifestDocumentException::class); - ManifestDocument::fromFile('/does/not/exist'); - } - - public function testCanBeCreatedFromFile() { - $this->assertInstanceOf( - ManifestDocument::class, - ManifestDocument::fromFile(__DIR__ . '/../_fixture/phpunit-5.6.5.xml') - ); - } - - public function testCaneBeConstructedFromString() { - $content = file_get_contents(__DIR__ . '/../_fixture/phpunit-5.6.5.xml'); - $this->assertInstanceOf( - ManifestDocument::class, - ManifestDocument::fromString($content) - ); - } - - public function testThrowsExceptionOnInvalidXML() { - $this->expectException(ManifestDocumentLoadingException::class); - ManifestDocument::fromString('<?xml version="1.0" ?><root>'); - } - - public function testLoadingDocumentWithWrongRootNameThrowsException() { - $this->expectException(ManifestDocumentException::class); - ManifestDocument::fromString('<?xml version="1.0" ?><root />'); - } - - public function testLoadingDocumentWithWrongNamespaceThrowsException() { - $this->expectException(ManifestDocumentException::class); - ManifestDocument::fromString('<?xml version="1.0" ?><phar xmlns="foo:bar" />'); - } - - public function testContainsElementCanBeRetrieved() { - $this->assertInstanceOf( - ContainsElement::class, - $this->loadFixture()->getContainsElement() - ); - } - - public function testRequiresElementCanBeRetrieved() { - $this->assertInstanceOf( - RequiresElement::class, - $this->loadFixture()->getRequiresElement() - ); - } - - public function testCopyrightElementCanBeRetrieved() { - $this->assertInstanceOf( - CopyrightElement::class, - $this->loadFixture()->getCopyrightElement() - ); - } - - public function testBundlesElementCanBeRetrieved() { - $this->assertInstanceOf( - BundlesElement::class, - $this->loadFixture()->getBundlesElement() - ); - } - - public function testThrowsExceptionWhenContainsIsMissing() { - $this->expectException(ManifestDocumentException::class); - $this->loadEmptyFixture()->getContainsElement(); - } - - public function testThrowsExceptionWhenCopyirhgtIsMissing() { - $this->expectException(ManifestDocumentException::class); - $this->loadEmptyFixture()->getCopyrightElement(); - } - - public function testThrowsExceptionWhenRequiresIsMissing() { - $this->expectException(ManifestDocumentException::class); - $this->loadEmptyFixture()->getRequiresElement(); - } - - public function testThrowsExceptionWhenBundlesIsMissing() { - $this->expectException(ManifestDocumentException::class); - $this->loadEmptyFixture()->getBundlesElement(); - } - - public function testHasBundlesReturnsTrueWhenBundlesNodeIsPresent() { - $this->assertTrue( - $this->loadFixture()->hasBundlesElement() - ); - } - - public function testHasBundlesReturnsFalseWhenBundlesNoNodeIsPresent() { - $this->assertFalse( - $this->loadEmptyFixture()->hasBundlesElement() - ); - } - - private function loadFixture() { - return ManifestDocument::fromFile(__DIR__ . '/../_fixture/phpunit-5.6.5.xml'); - } - - private function loadEmptyFixture() { - return ManifestDocument::fromString( - '<?xml version="1.0" ?><phar xmlns="https://phar.io/xml/manifest/1.0" />' - ); - } -} diff --git a/vendor/phar-io/manifest/tests/xml/PhpElementTest.php b/vendor/phar-io/manifest/tests/xml/PhpElementTest.php deleted file mode 100644 index 62dd359..0000000 --- a/vendor/phar-io/manifest/tests/xml/PhpElementTest.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -use DOMDocument; - -class PhpElementTest extends \PHPUnit\Framework\TestCase { - /** - * @var DOMDocument - */ - private $dom; - - /** - * @var PhpElement - */ - private $php; - - protected function setUp() { - $this->dom = new DOMDocument(); - $this->dom->loadXML('<?xml version="1.0" ?><php xmlns="https://phar.io/xml/manifest/1.0" version="^5.6 || ^7.0" />'); - $this->php = new PhpElement($this->dom->documentElement); - } - - public function testVersionConstraintCanBeRetrieved() { - $this->assertEquals('^5.6 || ^7.0', $this->php->getVersion()); - } - - public function testHasExtElementsReturnsFalseWhenNoExtensionsAreRequired() { - $this->assertFalse($this->php->hasExtElements()); - } - - public function testHasExtElementsReturnsTrueWhenExtensionsAreRequired() { - $this->addExtElement(); - $this->assertTrue($this->php->hasExtElements()); - } - - public function testGetExtElementsReturnsExtElementCollection() { - $this->addExtElement(); - $this->assertInstanceOf(ExtElementCollection::class, $this->php->getExtElements()); - } - - private function addExtElement() { - $this->dom->documentElement->appendChild( - $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'ext') - ); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/RequiresElementTest.php b/vendor/phar-io/manifest/tests/xml/RequiresElementTest.php deleted file mode 100644 index 35ddc82..0000000 --- a/vendor/phar-io/manifest/tests/xml/RequiresElementTest.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -namespace PharIo\Manifest; - -use DOMDocument; - -class RequiresElementTest extends \PHPUnit\Framework\TestCase { - /** - * @var DOMDocument - */ - private $dom; - - /** - * @var RequiresElement - */ - private $requires; - - protected function setUp() { - $this->dom = new DOMDocument(); - $this->dom->loadXML('<?xml version="1.0" ?><requires xmlns="https://phar.io/xml/manifest/1.0" />'); - $this->requires = new RequiresElement($this->dom->documentElement); - } - - public function testThrowsExceptionWhenGetPhpElementIsCalledButElementIsMissing() { - $this->expectException(ManifestElementException::class); - $this->requires->getPHPElement(); - } - - public function testHasExtElementsReturnsTrueWhenExtensionsAreRequired() { - $this->dom->documentElement->appendChild( - $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'php') - ); - - $this->assertInstanceOf(PhpElement::class, $this->requires->getPHPElement()); - } - -} diff --git a/vendor/phar-io/version/.gitignore b/vendor/phar-io/version/.gitignore deleted file mode 100644 index 1c8f2e6..0000000 --- a/vendor/phar-io/version/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/.idea -/.php_cs.cache -/composer.lock -/src/autoload.php -/tools -/vendor - diff --git a/vendor/phar-io/version/.php_cs b/vendor/phar-io/version/.php_cs deleted file mode 100644 index 159d6a3..0000000 --- a/vendor/phar-io/version/.php_cs +++ /dev/null @@ -1,67 +0,0 @@ -<?php -$finder = Symfony\CS\Finder\DefaultFinder::create() - ->files() - ->in('src') - ->in('tests') - ->name('*.php'); - -return Symfony\CS\Config\Config::create() - ->setUsingCache(true) - ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) - ->fixers( - array( - 'align_double_arrow', - 'align_equals', - 'concat_with_spaces', - 'duplicate_semicolon', - 'elseif', - 'empty_return', - 'encoding', - 'eof_ending', - 'extra_empty_lines', - 'function_call_space', - 'function_declaration', - 'indentation', - 'join_function', - 'line_after_namespace', - 'linefeed', - 'list_commas', - 'lowercase_constants', - 'lowercase_keywords', - 'method_argument_space', - 'multiple_use', - 'namespace_no_leading_whitespace', - 'no_blank_lines_after_class_opening', - 'no_empty_lines_after_phpdocs', - 'parenthesis', - 'php_closing_tag', - 'phpdoc_indent', - 'phpdoc_no_access', - 'phpdoc_no_empty_return', - 'phpdoc_no_package', - 'phpdoc_params', - 'phpdoc_scalar', - 'phpdoc_separation', - 'phpdoc_to_comment', - 'phpdoc_trim', - 'phpdoc_types', - 'phpdoc_var_without_name', - 'remove_lines_between_uses', - 'return', - 'self_accessor', - 'short_array_syntax', - 'short_tag', - 'single_line_after_imports', - 'single_quote', - 'spaces_before_semicolon', - 'spaces_cast', - 'ternary_spaces', - 'trailing_spaces', - 'trim_array_spaces', - 'unused_use', - 'visibility', - 'whitespacy_lines' - ) - ) - ->finder($finder); - diff --git a/vendor/phar-io/version/.travis.yml b/vendor/phar-io/version/.travis.yml deleted file mode 100644 index b4be10f..0000000 --- a/vendor/phar-io/version/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ -os: -- linux - -language: php - -before_install: - - wget https://phar.io/releases/phive.phar - - wget https://phar.io/releases/phive.phar.asc - - gpg --keyserver hkps.pool.sks-keyservers.net --recv-keys 0x9B2D5D79 - - gpg --verify phive.phar.asc phive.phar - - chmod +x phive.phar - - sudo mv phive.phar /usr/bin/phive - -install: - - ant setup - -script: ./tools/phpunit - -php: - - 5.6 - - 7.0 - - 7.1 - - 7.0snapshot - - 7.1snapshot - - master - -matrix: - allow_failures: - - php: master - fast_finish: true - -notifications: - email: false diff --git a/vendor/phar-io/version/CHANGELOG.md b/vendor/phar-io/version/CHANGELOG.md deleted file mode 100644 index ab9df36..0000000 --- a/vendor/phar-io/version/CHANGELOG.md +++ /dev/null @@ -1,44 +0,0 @@ -# Changelog - -All notable changes to phar-io/version are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [2.0.1] - 08.07.2018 - -### Fixed - -- Versions without a pre-release suffix are now always considered greater -than versions without a pre-release suffix. Example: `3.0.0 > 3.0.0-alpha.1` - -## [2.0.0] - 23.06.2018 - -Changes to public API: - -- `PreReleaseSuffix::construct()`: optional parameter `$number` removed -- `PreReleaseSuffix::isGreaterThan()`: introduced -- `Version::hasPreReleaseSuffix()`: introduced - -### Added - -- [#11](https://github.com/phar-io/version/issues/11): Added support for pre-release version suffixes. Supported values are: - - `dev` - - `beta` (also abbreviated form `b`) - - `rc` - - `alpha` (also abbreviated form `a`) - - `patch` (also abbreviated form `p`) - - All values can be followed by a number, e.g. `beta3`. - - When comparing versions, the pre-release suffix is taken into account. Example: -`1.5.0 > 1.5.0-beta1 > 1.5.0-alpha3 > 1.5.0-alpha2 > 1.5.0-dev11` - -### Changed - -- reorganized the source directories - -### Fixed - -- [#10](https://github.com/phar-io/version/issues/10): Version numbers containing -a numeric suffix as seen in Debian packages are now supported. - -[2.0.1]: https://github.com/phar-io/version/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/phar-io/version/compare/1.0.1...2.0.0 diff --git a/vendor/phar-io/version/LICENSE b/vendor/phar-io/version/LICENSE deleted file mode 100644 index 359dbc5..0000000 --- a/vendor/phar-io/version/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -phar-io/version - -Copyright (c) 2016-2017 Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de> and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Arne Blankerts nor the names of contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/phar-io/version/README.md b/vendor/phar-io/version/README.md deleted file mode 100644 index 76e6e98..0000000 --- a/vendor/phar-io/version/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# Version - -Library for handling version information and constraints - -[![Build Status](https://travis-ci.org/phar-io/version.svg?branch=master)](https://travis-ci.org/phar-io/version) - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phar-io/version - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phar-io/version - -## Version constraints - -A Version constraint describes a range of versions or a discrete version number. The format of version numbers follows the schema of [semantic versioning](http://semver.org): `<major>.<minor>.<patch>`. A constraint might contain an operator that describes the range. - -Beside the typical mathematical operators like `<=`, `>=`, there are two special operators: - -*Caret operator*: `^1.0` -can be written as `>=1.0.0 <2.0.0` and read as »every Version within major version `1`«. - -*Tilde operator*: `~1.0.0` -can be written as `>=1.0.0 <1.1.0` and read as »every version within minor version `1.1`. The behavior of tilde operator depends on whether a patch level version is provided or not. If no patch level is provided, tilde operator behaves like the caret operator: `~1.0` is identical to `^1.0`. - -## Usage examples - -Parsing version constraints and check discrete versions for compliance: - -```php - -use PharIo\Version\Version; -use PharIo\Version\VersionConstraintParser; - -$parser = new VersionConstraintParser(); -$caret_constraint = $parser->parse( '^7.0' ); - -$caret_constraint->complies( new Version( '7.0.17' ) ); // true -$caret_constraint->complies( new Version( '7.1.0' ) ); // true -$caret_constraint->complies( new Version( '6.4.34' ) ); // false - -$tilde_constraint = $parser->parse( '~1.1.0' ); - -$tilde_constraint->complies( new Version( '1.1.4' ) ); // true -$tilde_constraint->complies( new Version( '1.2.0' ) ); // false -``` - -As of version 2.0.0, pre-release labels are supported and taken into account when comparing versions: - -```php - -$leftVersion = new PharIo\Version\Version('3.0.0-alpha.1'); -$rightVersion = new PharIo\Version\Version('3.0.0-alpha.2'); - -$leftVersion->isGreaterThan($rightVersion); // false -$rightVersion->isGreaterThan($leftVersion); // true - -``` diff --git a/vendor/phar-io/version/build.xml b/vendor/phar-io/version/build.xml deleted file mode 100644 index 943c957..0000000 --- a/vendor/phar-io/version/build.xml +++ /dev/null @@ -1,41 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project name="version" default="setup"> - <target name="setup" depends="clean,install-tools,generate-autoloader"/> - - <target name="clean" unless="clean.done" description="Cleanup build artifacts"> - <delete dir="${basedir}/tools"/> - <delete dir="${basedir}/vendor"/> - <delete file="${basedir}/src/autoload.php"/> - - <property name="clean.done" value="true"/> - </target> - - <target name="prepare" unless="prepare.done" depends="clean" description="Prepare for build"> - <property name="prepare.done" value="true"/> - </target> - - <target name="-tools-installed"> - <available file="${basedir}/tools" property="tools-installed" type="dir"/> - </target> - - <target name="install-tools" unless="tools-installed" depends="-tools-installed" description="Install tools with Phive"> - <exec executable="phive" taskname="phive"> - <arg value="install"/> - <arg value="--trust-gpg-keys" /> - <arg value="4AA394086372C20A,2A8299CE842DD38C" /> - </exec> - </target> - - <target name="generate-autoloader" depends="install-tools" description="Generate autoloader using PHPAB"> - <exec executable="${basedir}/tools/phpab" taskname="phpab"> - <arg value="--output"/> - <arg path="${basedir}/src/autoload.php"/> - <arg path="${basedir}/src"/> - </exec> - </target> - - <target name="test" depends="generate-autoloader" description="Run tests"> - <exec executable="${basedir}/tools/phpunit" taskname="phpunit"/> - </target> -</project> - diff --git a/vendor/phar-io/version/composer.json b/vendor/phar-io/version/composer.json deleted file mode 100644 index 891e8b1..0000000 --- a/vendor/phar-io/version/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "phar-io/version", - "description": "Library for handling version information and constraints", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "support": { - "issues": "https://github.com/phar-io/version/issues" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - } -} - diff --git a/vendor/phar-io/version/phive.xml b/vendor/phar-io/version/phive.xml deleted file mode 100644 index 0c3bc6f..0000000 --- a/vendor/phar-io/version/phive.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phive xmlns="https://phar.io/phive"> - <phar name="phpunit" version="^5.7.5" installed="5.7.5" location="./tools/phpunit"/> - <phar name="phpab" version="^1.23.0" installed="1.23.0" location="./tools/phpab"/> -</phive> diff --git a/vendor/phar-io/version/phpunit.xml b/vendor/phar-io/version/phpunit.xml deleted file mode 100644 index c21ffbc..0000000 --- a/vendor/phar-io/version/phpunit.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/5.7/phpunit.xsd" - bootstrap="src/autoload.php" - backupGlobals="false" - beStrictAboutOutputDuringTests="true" - beStrictAboutTestsThatDoNotTestAnything="true" - beStrictAboutTodoAnnotatedTests="true" - verbose="true"> - <testsuite> - <directory suffix="Test.php">tests</directory> - </testsuite> - - <filter> - <whitelist processUncoveredFilesFromWhitelist="true"> - <directory suffix=".php">src</directory> - </whitelist> - </filter> -</phpunit> diff --git a/vendor/phar-io/version/src/PreReleaseSuffix.php b/vendor/phar-io/version/src/PreReleaseSuffix.php deleted file mode 100644 index e936c0e..0000000 --- a/vendor/phar-io/version/src/PreReleaseSuffix.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php - -namespace PharIo\Version; - -class PreReleaseSuffix { - private $valueScoreMap = [ - 'dev' => 0, - 'a' => 1, - 'alpha' => 1, - 'b' => 2, - 'beta' => 2, - 'rc' => 3, - 'p' => 4, - 'patch' => 4, - ]; - - /** - * @var string - */ - private $value; - - /** - * @var int - */ - private $valueScore; - - /** - * @var int - */ - private $number = 0; - - /** - * @param string $value - */ - public function __construct($value) { - $this->parseValue($value); - } - - /** - * @return string - */ - public function getValue() { - return $this->value; - } - - /** - * @return int|null - */ - public function getNumber() { - return $this->number; - } - - /** - * @param PreReleaseSuffix $suffix - * - * @return bool - */ - public function isGreaterThan(PreReleaseSuffix $suffix) { - if ($this->valueScore > $suffix->valueScore) { - return true; - } - - if ($this->valueScore < $suffix->valueScore) { - return false; - } - - return $this->getNumber() > $suffix->getNumber(); - } - - /** - * @param $value - * - * @return int - */ - private function mapValueToScore($value) { - if (array_key_exists($value, $this->valueScoreMap)) { - return $this->valueScoreMap[$value]; - } - - return 0; - } - - private function parseValue($value) { - $regex = '/-?(dev|beta|b|rc|alpha|a|patch|p)\.?(\d*).*$/i'; - if (preg_match($regex, $value, $matches) !== 1) { - throw new InvalidPreReleaseSuffixException(sprintf('Invalid label %s', $value)); - } - - $this->value = $matches[1]; - if (isset($matches[2])) { - $this->number = (int)$matches[2]; - } - $this->valueScore = $this->mapValueToScore($this->value); - } -} diff --git a/vendor/phar-io/version/src/Version.php b/vendor/phar-io/version/src/Version.php deleted file mode 100644 index 73e1b98..0000000 --- a/vendor/phar-io/version/src/Version.php +++ /dev/null @@ -1,175 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class Version { - /** - * @var VersionNumber - */ - private $major; - - /** - * @var VersionNumber - */ - private $minor; - - /** - * @var VersionNumber - */ - private $patch; - - /** - * @var PreReleaseSuffix - */ - private $preReleaseSuffix; - - /** - * @var string - */ - private $versionString = ''; - - /** - * @param string $versionString - */ - public function __construct($versionString) { - $this->ensureVersionStringIsValid($versionString); - - $this->versionString = $versionString; - } - - /** - * @return PreReleaseSuffix - */ - public function getPreReleaseSuffix() { - return $this->preReleaseSuffix; - } - - /** - * @return string - */ - public function getVersionString() { - return $this->versionString; - } - - /** - * @return bool - */ - public function hasPreReleaseSuffix() { - return $this->preReleaseSuffix !== null; - } - - /** - * @param Version $version - * - * @return bool - */ - public function isGreaterThan(Version $version) { - if ($version->getMajor()->getValue() > $this->getMajor()->getValue()) { - return false; - } - - if ($version->getMajor()->getValue() < $this->getMajor()->getValue()) { - return true; - } - - if ($version->getMinor()->getValue() > $this->getMinor()->getValue()) { - return false; - } - - if ($version->getMinor()->getValue() < $this->getMinor()->getValue()) { - return true; - } - - if ($version->getPatch()->getValue() > $this->getPatch()->getValue()) { - return false; - } - - if ($version->getPatch()->getValue() < $this->getPatch()->getValue()) { - return true; - } - - if (!$version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { - return false; - } - - if ($version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { - return true; - } - - if (!$version->hasPreReleaseSuffix() && $this->hasPreReleaseSuffix()) { - return false; - } - - return $this->getPreReleaseSuffix()->isGreaterThan($version->getPreReleaseSuffix()); - } - - /** - * @return VersionNumber - */ - public function getMajor() { - return $this->major; - } - - /** - * @return VersionNumber - */ - public function getMinor() { - return $this->minor; - } - - /** - * @return VersionNumber - */ - public function getPatch() { - return $this->patch; - } - - /** - * @param array $matches - */ - private function parseVersion(array $matches) { - $this->major = new VersionNumber($matches['Major']); - $this->minor = new VersionNumber($matches['Minor']); - $this->patch = isset($matches['Patch']) ? new VersionNumber($matches['Patch']) : new VersionNumber(null); - - if (isset($matches['PreReleaseSuffix'])) { - $this->preReleaseSuffix = new PreReleaseSuffix($matches['PreReleaseSuffix']); - } - } - - /** - * @param string $version - * - * @throws InvalidVersionException - */ - private function ensureVersionStringIsValid($version) { - $regex = '/^v? - (?<Major>(0|(?:[1-9][0-9]*))) - \\. - (?<Minor>(0|(?:[1-9][0-9]*))) - (\\. - (?<Patch>(0|(?:[1-9][0-9]*))) - )? - (?: - - - (?<PreReleaseSuffix>(?:(dev|beta|b|RC|alpha|a|patch|p)\.?\d*)) - )? - $/x'; - - if (preg_match($regex, $version, $matches) !== 1) { - throw new InvalidVersionException( - sprintf("Version string '%s' does not follow SemVer semantics", $version) - ); - } - - $this->parseVersion($matches); - } -} diff --git a/vendor/phar-io/version/src/VersionConstraintParser.php b/vendor/phar-io/version/src/VersionConstraintParser.php deleted file mode 100644 index ed46843..0000000 --- a/vendor/phar-io/version/src/VersionConstraintParser.php +++ /dev/null @@ -1,122 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class VersionConstraintParser { - /** - * @param string $value - * - * @return VersionConstraint - * - * @throws UnsupportedVersionConstraintException - */ - public function parse($value) { - - if (strpos($value, '||') !== false) { - return $this->handleOrGroup($value); - } - - if (!preg_match('/^[\^~\*]?[\d.\*]+(?:-.*)?$/', $value)) { - throw new UnsupportedVersionConstraintException( - sprintf('Version constraint %s is not supported.', $value) - ); - } - - switch ($value[0]) { - case '~': - return $this->handleTildeOperator($value); - case '^': - return $this->handleCaretOperator($value); - } - - $version = new VersionConstraintValue($value); - - if ($version->getMajor()->isAny()) { - return new AnyVersionConstraint(); - } - - if ($version->getMinor()->isAny()) { - return new SpecificMajorVersionConstraint( - $version->getVersionString(), - $version->getMajor()->getValue() - ); - } - - if ($version->getPatch()->isAny()) { - return new SpecificMajorAndMinorVersionConstraint( - $version->getVersionString(), - $version->getMajor()->getValue(), - $version->getMinor()->getValue() - ); - } - - return new ExactVersionConstraint($version->getVersionString()); - } - - /** - * @param $value - * - * @return OrVersionConstraintGroup - */ - private function handleOrGroup($value) { - $constraints = []; - - foreach (explode('||', $value) as $groupSegment) { - $constraints[] = $this->parse(trim($groupSegment)); - } - - return new OrVersionConstraintGroup($value, $constraints); - } - - /** - * @param string $value - * - * @return AndVersionConstraintGroup - */ - private function handleTildeOperator($value) { - $version = new Version(substr($value, 1)); - $constraints = [ - new GreaterThanOrEqualToVersionConstraint($value, $version) - ]; - - if ($version->getPatch()->isAny()) { - $constraints[] = new SpecificMajorVersionConstraint( - $value, - $version->getMajor()->getValue() - ); - } else { - $constraints[] = new SpecificMajorAndMinorVersionConstraint( - $value, - $version->getMajor()->getValue(), - $version->getMinor()->getValue() - ); - } - - return new AndVersionConstraintGroup($value, $constraints); - } - - /** - * @param string $value - * - * @return AndVersionConstraintGroup - */ - private function handleCaretOperator($value) { - $version = new Version(substr($value, 1)); - - return new AndVersionConstraintGroup( - $value, - [ - new GreaterThanOrEqualToVersionConstraint($value, $version), - new SpecificMajorVersionConstraint($value, $version->getMajor()->getValue()) - ] - ); - } -} diff --git a/vendor/phar-io/version/src/VersionConstraintValue.php b/vendor/phar-io/version/src/VersionConstraintValue.php deleted file mode 100644 index 8c975b8..0000000 --- a/vendor/phar-io/version/src/VersionConstraintValue.php +++ /dev/null @@ -1,123 +0,0 @@ -<?php - -namespace PharIo\Version; - -class VersionConstraintValue { - /** - * @var VersionNumber - */ - private $major; - - /** - * @var VersionNumber - */ - private $minor; - - /** - * @var VersionNumber - */ - private $patch; - - /** - * @var string - */ - private $label = ''; - - /** - * @var string - */ - private $buildMetaData = ''; - - /** - * @var string - */ - private $versionString = ''; - - /** - * @param string $versionString - */ - public function __construct($versionString) { - $this->versionString = $versionString; - - $this->parseVersion($versionString); - } - - /** - * @return string - */ - public function getLabel() { - return $this->label; - } - - /** - * @return string - */ - public function getBuildMetaData() { - return $this->buildMetaData; - } - - /** - * @return string - */ - public function getVersionString() { - return $this->versionString; - } - - /** - * @return VersionNumber - */ - public function getMajor() { - return $this->major; - } - - /** - * @return VersionNumber - */ - public function getMinor() { - return $this->minor; - } - - /** - * @return VersionNumber - */ - public function getPatch() { - return $this->patch; - } - - /** - * @param $versionString - */ - private function parseVersion($versionString) { - $this->extractBuildMetaData($versionString); - $this->extractLabel($versionString); - - $versionSegments = explode('.', $versionString); - $this->major = new VersionNumber($versionSegments[0]); - - $minorValue = isset($versionSegments[1]) ? $versionSegments[1] : null; - $patchValue = isset($versionSegments[2]) ? $versionSegments[2] : null; - - $this->minor = new VersionNumber($minorValue); - $this->patch = new VersionNumber($patchValue); - } - - /** - * @param string $versionString - */ - private function extractBuildMetaData(&$versionString) { - if (preg_match('/\+(.*)/', $versionString, $matches) == 1) { - $this->buildMetaData = $matches[1]; - $versionString = str_replace($matches[0], '', $versionString); - } - } - - /** - * @param string $versionString - */ - private function extractLabel(&$versionString) { - if (preg_match('/\-(.*)/', $versionString, $matches) == 1) { - $this->label = $matches[1]; - $versionString = str_replace($matches[0], '', $versionString); - } - } -} diff --git a/vendor/phar-io/version/src/VersionNumber.php b/vendor/phar-io/version/src/VersionNumber.php deleted file mode 100644 index ab512ed..0000000 --- a/vendor/phar-io/version/src/VersionNumber.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class VersionNumber { - /** - * @var int - */ - private $value; - - /** - * @param mixed $value - */ - public function __construct($value) { - if (is_numeric($value)) { - $this->value = $value; - } - } - - /** - * @return bool - */ - public function isAny() { - return $this->value === null; - } - - /** - * @return int - */ - public function getValue() { - return $this->value; - } -} diff --git a/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php b/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php deleted file mode 100644 index b732dbc..0000000 --- a/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -abstract class AbstractVersionConstraint implements VersionConstraint { - /** - * @var string - */ - private $originalValue = ''; - - /** - * @param string $originalValue - */ - public function __construct($originalValue) { - $this->originalValue = $originalValue; - } - - /** - * @return string - */ - public function asString() { - return $this->originalValue; - } -} diff --git a/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php b/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php deleted file mode 100644 index d9efeef..0000000 --- a/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class AndVersionConstraintGroup extends AbstractVersionConstraint { - /** - * @var VersionConstraint[] - */ - private $constraints = []; - - /** - * @param string $originalValue - * @param VersionConstraint[] $constraints - */ - public function __construct($originalValue, array $constraints) { - parent::__construct($originalValue); - - $this->constraints = $constraints; - } - - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - foreach ($this->constraints as $constraint) { - if (!$constraint->complies($version)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php b/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php deleted file mode 100644 index 13ca2ef..0000000 --- a/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class AnyVersionConstraint implements VersionConstraint { - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - return true; - } - - /** - * @return string - */ - public function asString() { - return '*'; - } -} diff --git a/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php b/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php deleted file mode 100644 index b214117..0000000 --- a/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class ExactVersionConstraint extends AbstractVersionConstraint { - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - return $this->asString() == $version->getVersionString(); - } -} diff --git a/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php b/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php deleted file mode 100644 index 47039a8..0000000 --- a/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class GreaterThanOrEqualToVersionConstraint extends AbstractVersionConstraint { - /** - * @var Version - */ - private $minimalVersion; - - /** - * @param string $originalValue - * @param Version $minimalVersion - */ - public function __construct($originalValue, Version $minimalVersion) { - parent::__construct($originalValue); - - $this->minimalVersion = $minimalVersion; - } - - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - return $version->getVersionString() == $this->minimalVersion->getVersionString() - || $version->isGreaterThan($this->minimalVersion); - } -} diff --git a/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php b/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php deleted file mode 100644 index 274407f..0000000 --- a/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class OrVersionConstraintGroup extends AbstractVersionConstraint { - /** - * @var VersionConstraint[] - */ - private $constraints = []; - - /** - * @param string $originalValue - * @param VersionConstraint[] $constraints - */ - public function __construct($originalValue, array $constraints) { - parent::__construct($originalValue); - - $this->constraints = $constraints; - } - - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - foreach ($this->constraints as $constraint) { - if ($constraint->complies($version)) { - return true; - } - } - - return false; - } -} diff --git a/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php b/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php deleted file mode 100644 index 3d58905..0000000 --- a/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class SpecificMajorAndMinorVersionConstraint extends AbstractVersionConstraint { - /** - * @var int - */ - private $major = 0; - - /** - * @var int - */ - private $minor = 0; - - /** - * @param string $originalValue - * @param int $major - * @param int $minor - */ - public function __construct($originalValue, $major, $minor) { - parent::__construct($originalValue); - - $this->major = $major; - $this->minor = $minor; - } - - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - if ($version->getMajor()->getValue() != $this->major) { - return false; - } - - return $version->getMinor()->getValue() == $this->minor; - } -} diff --git a/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php b/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php deleted file mode 100644 index bbac47b..0000000 --- a/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class SpecificMajorVersionConstraint extends AbstractVersionConstraint { - /** - * @var int - */ - private $major = 0; - - /** - * @param string $originalValue - * @param int $major - */ - public function __construct($originalValue, $major) { - parent::__construct($originalValue); - - $this->major = $major; - } - - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - return $version->getMajor()->getValue() == $this->major; - } -} diff --git a/vendor/phar-io/version/src/constraints/VersionConstraint.php b/vendor/phar-io/version/src/constraints/VersionConstraint.php deleted file mode 100644 index 9558163..0000000 --- a/vendor/phar-io/version/src/constraints/VersionConstraint.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -interface VersionConstraint { - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version); - - /** - * @return string - */ - public function asString(); - -} diff --git a/vendor/phar-io/version/src/exceptions/Exception.php b/vendor/phar-io/version/src/exceptions/Exception.php deleted file mode 100644 index b99e4dd..0000000 --- a/vendor/phar-io/version/src/exceptions/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -interface Exception { -} diff --git a/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php b/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php deleted file mode 100644 index 225fe71..0000000 --- a/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace PharIo\Version; - -class InvalidPreReleaseSuffixException extends \Exception implements Exception { - -} diff --git a/vendor/phar-io/version/src/exceptions/InvalidVersionException.php b/vendor/phar-io/version/src/exceptions/InvalidVersionException.php deleted file mode 100644 index f25f4d2..0000000 --- a/vendor/phar-io/version/src/exceptions/InvalidVersionException.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php - -namespace PharIo\Version; - -class InvalidVersionException extends \InvalidArgumentException implements Exception { -} diff --git a/vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php b/vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php deleted file mode 100644 index 45488c2..0000000 --- a/vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -final class UnsupportedVersionConstraintException extends \RuntimeException implements Exception { -} diff --git a/vendor/phar-io/version/tests/Integration/VersionConstraintParserTest.php b/vendor/phar-io/version/tests/Integration/VersionConstraintParserTest.php deleted file mode 100644 index f3e1ba8..0000000 --- a/vendor/phar-io/version/tests/Integration/VersionConstraintParserTest.php +++ /dev/null @@ -1,146 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\VersionConstraintParser - */ -class VersionConstraintParserTest extends TestCase { - /** - * @dataProvider versionStringProvider - * - * @param string $versionString - * @param VersionConstraint $expectedConstraint - */ - public function testReturnsExpectedConstraint($versionString, VersionConstraint $expectedConstraint) { - $parser = new VersionConstraintParser; - - $this->assertEquals($expectedConstraint, $parser->parse($versionString)); - } - - /** - * @dataProvider unsupportedVersionStringProvider - * - * @param string $versionString - */ - public function testThrowsExceptionIfVersionStringIsNotSupported($versionString) { - $parser = new VersionConstraintParser; - - $this->expectException(UnsupportedVersionConstraintException::class); - - $parser->parse($versionString); - } - - /** - * @return array - */ - public function versionStringProvider() { - return [ - ['1.0.2', new ExactVersionConstraint('1.0.2')], - [ - '~4.6', - new AndVersionConstraintGroup( - '~4.6', - [ - new GreaterThanOrEqualToVersionConstraint('~4.6', new Version('4.6')), - new SpecificMajorVersionConstraint('~4.6', 4) - ] - ) - ], - [ - '~4.6.2', - new AndVersionConstraintGroup( - '~4.6.2', - [ - new GreaterThanOrEqualToVersionConstraint('~4.6.2', new Version('4.6.2')), - new SpecificMajorAndMinorVersionConstraint('~4.6.2', 4, 6) - ] - ) - ], - [ - '^2.6.1', - new AndVersionConstraintGroup( - '^2.6.1', - [ - new GreaterThanOrEqualToVersionConstraint('^2.6.1', new Version('2.6.1')), - new SpecificMajorVersionConstraint('^2.6.1', 2) - ] - ) - ], - ['5.1.*', new SpecificMajorAndMinorVersionConstraint('5.1.*', 5, 1)], - ['5.*', new SpecificMajorVersionConstraint('5.*', 5)], - ['*', new AnyVersionConstraint()], - [ - '1.0.2 || 1.0.5', - new OrVersionConstraintGroup( - '1.0.2 || 1.0.5', - [ - new ExactVersionConstraint('1.0.2'), - new ExactVersionConstraint('1.0.5') - ] - ) - ], - [ - '^5.6 || ^7.0', - new OrVersionConstraintGroup( - '^5.6 || ^7.0', - [ - new AndVersionConstraintGroup( - '^5.6', [ - new GreaterThanOrEqualToVersionConstraint('^5.6', new Version('5.6')), - new SpecificMajorVersionConstraint('^5.6', 5) - ] - ), - new AndVersionConstraintGroup( - '^7.0', [ - new GreaterThanOrEqualToVersionConstraint('^7.0', new Version('7.0')), - new SpecificMajorVersionConstraint('^7.0', 7) - ] - ) - ] - ) - ], - ['7.0.28-1', new ExactVersionConstraint('7.0.28-1')], - [ - '^3.0.0-alpha1', - new AndVersionConstraintGroup( - '^3.0.0-alpha1', - [ - new GreaterThanOrEqualToVersionConstraint('^3.0.0-alpha1', new Version('3.0.0-alpha1')), - new SpecificMajorVersionConstraint('^3.0.0-alpha1', 3) - ] - ) - ], - [ - '^3.0.0-alpha.1', - new AndVersionConstraintGroup( - '^3.0.0-alpha.1', - [ - new GreaterThanOrEqualToVersionConstraint('^3.0.0-alpha.1', new Version('3.0.0-alpha.1')), - new SpecificMajorVersionConstraint('^3.0.0-alpha.1', 3) - ] - ) - ] - ]; - } - - public function unsupportedVersionStringProvider() { - return [ - ['foo'], - ['+1.0.2'], - ['>=2.0'], - ['^5.6 || >= 7.0'], - ['2.0 || foo'] - ]; - } -} diff --git a/vendor/phar-io/version/tests/Unit/AbstractVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/AbstractVersionConstraintTest.php deleted file mode 100644 index c618566..0000000 --- a/vendor/phar-io/version/tests/Unit/AbstractVersionConstraintTest.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\AbstractVersionConstraint - */ -class AbstractVersionConstraintTest extends TestCase { - public function testAsString() { - /** @var AbstractVersionConstraint|\PHPUnit_Framework_MockObject_MockObject $constraint */ - $constraint = $this->getMockForAbstractClass(AbstractVersionConstraint::class, ['foo']); - - $this->assertSame('foo', $constraint->asString()); - } -} diff --git a/vendor/phar-io/version/tests/Unit/AndVersionConstraintGroupTest.php b/vendor/phar-io/version/tests/Unit/AndVersionConstraintGroupTest.php deleted file mode 100644 index c2c5ec0..0000000 --- a/vendor/phar-io/version/tests/Unit/AndVersionConstraintGroupTest.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\AndVersionConstraintGroup - */ -class AndVersionConstraintGroupTest extends TestCase { - public function testReturnsFalseIfOneConstraintReturnsFalse() { - $firstConstraint = $this->createMock(VersionConstraint::class); - $secondConstraint = $this->createMock(VersionConstraint::class); - - $firstConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(true)); - - $secondConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(false)); - - $group = new AndVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]); - - $this->assertFalse($group->complies(new Version('1.0.0'))); - } - - public function testReturnsTrueIfAllConstraintsReturnsTrue() { - $firstConstraint = $this->createMock(VersionConstraint::class); - $secondConstraint = $this->createMock(VersionConstraint::class); - - $firstConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(true)); - - $secondConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(true)); - - $group = new AndVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]); - - $this->assertTrue($group->complies(new Version('1.0.0'))); - } -} diff --git a/vendor/phar-io/version/tests/Unit/AnyVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/AnyVersionConstraintTest.php deleted file mode 100644 index 6883099..0000000 --- a/vendor/phar-io/version/tests/Unit/AnyVersionConstraintTest.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\AnyVersionConstraint - */ -class AnyVersionConstraintTest extends TestCase { - public function versionProvider() { - return [ - [new Version('1.0.2')], - [new Version('4.8')], - [new Version('0.1.1-dev')] - ]; - } - - /** - * @dataProvider versionProvider - * - * @param Version $version - */ - public function testReturnsTrue(Version $version) { - $constraint = new AnyVersionConstraint; - - $this->assertTrue($constraint->complies($version)); - } - - public function testAsString() { - $this->assertSame('*', (new AnyVersionConstraint())->asString()); - } -} diff --git a/vendor/phar-io/version/tests/Unit/ExactVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/ExactVersionConstraintTest.php deleted file mode 100644 index ebba024..0000000 --- a/vendor/phar-io/version/tests/Unit/ExactVersionConstraintTest.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\ExactVersionConstraint - */ -class ExactVersionConstraintTest extends TestCase { - public function compliantVersionProvider() { - return [ - ['1.0.2', new Version('1.0.2')], - ['4.8.9', new Version('4.8.9')], - ['4.8', new Version('4.8')], - ]; - } - - public function nonCompliantVersionProvider() { - return [ - ['1.0.2', new Version('1.0.3')], - ['4.8.9', new Version('4.7.9')], - ['4.8', new Version('4.8.5')], - ]; - } - - /** - * @dataProvider compliantVersionProvider - * - * @param string $constraintValue - * @param Version $version - */ - public function testReturnsTrueForCompliantVersion($constraintValue, Version $version) { - $constraint = new ExactVersionConstraint($constraintValue); - - $this->assertTrue($constraint->complies($version)); - } - - /** - * @dataProvider nonCompliantVersionProvider - * - * @param string $constraintValue - * @param Version $version - */ - public function testReturnsFalseForNonCompliantVersion($constraintValue, Version $version) { - $constraint = new ExactVersionConstraint($constraintValue); - - $this->assertFalse($constraint->complies($version)); - } -} diff --git a/vendor/phar-io/version/tests/Unit/GreaterThanOrEqualToVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/GreaterThanOrEqualToVersionConstraintTest.php deleted file mode 100644 index 3cbb11d..0000000 --- a/vendor/phar-io/version/tests/Unit/GreaterThanOrEqualToVersionConstraintTest.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\GreaterThanOrEqualToVersionConstraint - */ -class GreaterThanOrEqualToVersionConstraintTest extends TestCase { - public function versionProvider() { - return [ - // compliant versions - [new Version('1.0.2'), new Version('1.0.2'), true], - [new Version('1.0.2'), new Version('1.0.3'), true], - [new Version('1.0.2'), new Version('1.1.1'), true], - [new Version('1.0.2'), new Version('2.0.0'), true], - [new Version('1.0.2'), new Version('1.0.3'), true], - // non-compliant versions - [new Version('1.0.2'), new Version('1.0.1'), false], - [new Version('1.9.8'), new Version('0.9.9'), false], - [new Version('2.3.1'), new Version('2.2.3'), false], - [new Version('3.0.2'), new Version('2.9.9'), false], - ]; - } - - /** - * @dataProvider versionProvider - * - * @param Version $constraintVersion - * @param Version $version - * @param bool $expectedResult - */ - public function testReturnsTrueForCompliantVersions(Version $constraintVersion, Version $version, $expectedResult) { - $constraint = new GreaterThanOrEqualToVersionConstraint('foo', $constraintVersion); - - $this->assertSame($expectedResult, $constraint->complies($version)); - } -} diff --git a/vendor/phar-io/version/tests/Unit/OrVersionConstraintGroupTest.php b/vendor/phar-io/version/tests/Unit/OrVersionConstraintGroupTest.php deleted file mode 100644 index 088d557..0000000 --- a/vendor/phar-io/version/tests/Unit/OrVersionConstraintGroupTest.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\OrVersionConstraintGroup - */ -class OrVersionConstraintGroupTest extends TestCase { - public function testReturnsTrueIfOneConstraintReturnsFalse() { - $firstConstraint = $this->createMock(VersionConstraint::class); - $secondConstraint = $this->createMock(VersionConstraint::class); - - $firstConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(false)); - - $secondConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(true)); - - $group = new OrVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]); - - $this->assertTrue($group->complies(new Version('1.0.0'))); - } - - public function testReturnsTrueIfAllConstraintsReturnsTrue() { - $firstConstraint = $this->createMock(VersionConstraint::class); - $secondConstraint = $this->createMock(VersionConstraint::class); - - $firstConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(true)); - - $group = new OrVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]); - - $this->assertTrue($group->complies(new Version('1.0.0'))); - } - - public function testReturnsFalseIfAllConstraintsReturnsFalse() { - $firstConstraint = $this->createMock(VersionConstraint::class); - $secondConstraint = $this->createMock(VersionConstraint::class); - - $firstConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(false)); - - $secondConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(false)); - - $group = new OrVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]); - - $this->assertFalse($group->complies(new Version('1.0.0'))); - } -} diff --git a/vendor/phar-io/version/tests/Unit/PreReleaseSuffixTest.php b/vendor/phar-io/version/tests/Unit/PreReleaseSuffixTest.php deleted file mode 100644 index e09a66d..0000000 --- a/vendor/phar-io/version/tests/Unit/PreReleaseSuffixTest.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\PreReleaseSuffix - */ -class PreReleaseSuffixTest extends TestCase { - /** - * @dataProvider greaterThanProvider - * - * @param string $leftSuffixValue - * @param string $rightSuffixValue - * @param bool $expectedResult - */ - public function testGreaterThanReturnsExpectedResult( - $leftSuffixValue, - $rightSuffixValue, - $expectedResult - ) { - $leftSuffix = new PreReleaseSuffix($leftSuffixValue); - $rightSuffix = new PreReleaseSuffix($rightSuffixValue); - - $this->assertSame($expectedResult, $leftSuffix->isGreaterThan($rightSuffix)); - } - - public function greaterThanProvider() { - return [ - ['alpha1', 'alpha2', false], - ['alpha2', 'alpha1', true], - ['beta1', 'alpha3', true], - ['b1', 'alpha3', true], - ['b1', 'a3', true], - ['dev1', 'alpha2', false], - ['dev1', 'alpha2', false], - ['alpha2', 'dev5', true], - ['rc1', 'beta2', true], - ['patch5', 'rc7', true], - ['alpha1', 'alpha.2', false], - ['alpha.3', 'alpha2', true], - ['alpha.3', 'alpha.2', true], - ]; - } -} diff --git a/vendor/phar-io/version/tests/Unit/SpecificMajorAndMinorVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/SpecificMajorAndMinorVersionConstraintTest.php deleted file mode 100644 index 6025889..0000000 --- a/vendor/phar-io/version/tests/Unit/SpecificMajorAndMinorVersionConstraintTest.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\SpecificMajorAndMinorVersionConstraint - */ -class SpecificMajorAndMinorVersionConstraintTest extends TestCase { - public function versionProvider() { - return [ - // compliant versions - [1, 0, new Version('1.0.2'), true], - [1, 0, new Version('1.0.3'), true], - [1, 1, new Version('1.1.1'), true], - // non-compliant versions - [2, 9, new Version('0.9.9'), false], - [3, 2, new Version('2.2.3'), false], - [2, 8, new Version('2.9.9'), false], - ]; - } - - /** - * @dataProvider versionProvider - * - * @param int $major - * @param int $minor - * @param Version $version - * @param bool $expectedResult - */ - public function testReturnsTrueForCompliantVersions($major, $minor, Version $version, $expectedResult) { - $constraint = new SpecificMajorAndMinorVersionConstraint('foo', $major, $minor); - - $this->assertSame($expectedResult, $constraint->complies($version)); - } -} diff --git a/vendor/phar-io/version/tests/Unit/SpecificMajorVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/SpecificMajorVersionConstraintTest.php deleted file mode 100644 index 6dc3b71..0000000 --- a/vendor/phar-io/version/tests/Unit/SpecificMajorVersionConstraintTest.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\SpecificMajorVersionConstraint - */ -class SpecificMajorVersionConstraintTest extends TestCase { - public function versionProvider() { - return [ - // compliant versions - [1, new Version('1.0.2'), true], - [1, new Version('1.0.3'), true], - [1, new Version('1.1.1'), true], - // non-compliant versions - [2, new Version('0.9.9'), false], - [3, new Version('2.2.3'), false], - [3, new Version('2.9.9'), false], - ]; - } - - /** - * @dataProvider versionProvider - * - * @param int $major - * @param Version $version - * @param bool $expectedResult - */ - public function testReturnsTrueForCompliantVersions($major, Version $version, $expectedResult) { - $constraint = new SpecificMajorVersionConstraint('foo', $major); - - $this->assertSame($expectedResult, $constraint->complies($version)); - } -} diff --git a/vendor/phar-io/version/tests/Unit/VersionTest.php b/vendor/phar-io/version/tests/Unit/VersionTest.php deleted file mode 100644 index 6b4897a..0000000 --- a/vendor/phar-io/version/tests/Unit/VersionTest.php +++ /dev/null @@ -1,113 +0,0 @@ -<?php -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\Version - */ -class VersionTest extends TestCase { - /** - * @dataProvider versionProvider - * - * @param string $versionString - * @param string $expectedMajor - * @param string $expectedMinor - * @param string $expectedPatch - * @param string $expectedPreReleaseValue - * @param int $expectedReleaseCount - */ - public function testParsesVersionNumbers( - $versionString, - $expectedMajor, - $expectedMinor, - $expectedPatch, - $expectedPreReleaseValue = '', - $expectedReleaseCount = 0 - ) { - $version = new Version($versionString); - - $this->assertSame($expectedMajor, $version->getMajor()->getValue()); - $this->assertSame($expectedMinor, $version->getMinor()->getValue()); - $this->assertSame($expectedPatch, $version->getPatch()->getValue()); - if ($expectedPreReleaseValue !== '') { - $this->assertSame($expectedPreReleaseValue, $version->getPreReleaseSuffix()->getValue()); - } - if ($expectedReleaseCount !== 0) { - $this->assertSame($expectedReleaseCount, $version->getPreReleaseSuffix()->getNumber()); - } - - $this->assertSame($versionString, $version->getVersionString()); - } - - public function versionProvider() { - return [ - ['0.0.1', '0', '0', '1'], - ['0.1.2', '0', '1', '2'], - ['1.0.0-alpha', '1', '0', '0', 'alpha'], - ['3.4.12-dev3', '3', '4', '12', 'dev', 3], - ]; - } - - /** - * @dataProvider versionGreaterThanProvider - * - * @param Version $versionA - * @param Version $versionB - * @param bool $expectedResult - */ - public function testIsGreaterThan(Version $versionA, Version $versionB, $expectedResult) { - $this->assertSame($expectedResult, $versionA->isGreaterThan($versionB)); - } - - /** - * @return array - */ - public function versionGreaterThanProvider() { - return [ - [new Version('1.0.0'), new Version('1.0.1'), false], - [new Version('1.0.1'), new Version('1.0.0'), true], - [new Version('1.1.0'), new Version('1.0.1'), true], - [new Version('1.1.0'), new Version('2.0.1'), false], - [new Version('1.1.0'), new Version('1.1.0'), false], - [new Version('2.5.8'), new Version('1.6.8'), true], - [new Version('2.5.8'), new Version('2.6.8'), false], - [new Version('2.5.8'), new Version('3.1.2'), false], - [new Version('3.0.0-alpha1'), new Version('3.0.0-alpha2'), false], - [new Version('3.0.0-alpha2'), new Version('3.0.0-alpha1'), true], - [new Version('3.0.0-alpha.1'), new Version('3.0.0'), false], - [new Version('3.0.0'), new Version('3.0.0-alpha.1'), true], - ]; - } - - /** - * @dataProvider invalidVersionStringProvider - * - * @param string $versionString - */ - public function testThrowsExceptionIfVersionStringDoesNotFollowSemVer($versionString) { - $this->expectException(InvalidVersionException::class); - new Version($versionString); - } - - /** - * @return array - */ - public function invalidVersionStringProvider() { - return [ - ['foo'], - ['0.0.1-dev+ABC', '0', '0', '1', 'dev', 'ABC'], - ['1.0.0-x.7.z.92', '1', '0', '0', 'x.7.z.92'] - ]; - } - -} diff --git a/vendor/php-cs-fixer/diff/ChangeLog.md b/vendor/php-cs-fixer/diff/ChangeLog.md deleted file mode 100644 index b876708..0000000 --- a/vendor/php-cs-fixer/diff/ChangeLog.md +++ /dev/null @@ -1,7 +0,0 @@ -# ChangeLog - -Changelog for v1.0 - -First stable release, based on: -https://github.com/sebastianbergmann/diff/releases -1.4.3 and 2.0.1 diff --git a/vendor/php-cs-fixer/diff/LICENSE b/vendor/php-cs-fixer/diff/LICENSE deleted file mode 100644 index 19a2d69..0000000 --- a/vendor/php-cs-fixer/diff/LICENSE +++ /dev/null @@ -1,5 +0,0 @@ -Code from `sebastian/diff` has been forked and republished by permission of Sebastian Bergmann. -Licenced with BSD-3-Clause @ see LICENSE_DIFF, copyright (c) Sebastian Bergmann <sebastian@phpunit.de> - -Code from `GeckoPackages/GeckoDiffOutputBuilder` has been copied and republished by permission of GeckoPackages. -Licenced with MIT @ see LICENSE_GECKO, copyright (c) GeckoPackages https://github.com/GeckoPackages diff --git a/vendor/php-cs-fixer/diff/LICENSE_DIFF b/vendor/php-cs-fixer/diff/LICENSE_DIFF deleted file mode 100644 index 93cf008..0000000 --- a/vendor/php-cs-fixer/diff/LICENSE_DIFF +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2002-2017, Sebastian Bergmann <sebastian@phpunit.de>. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/php-cs-fixer/diff/LICENSE_GECKO b/vendor/php-cs-fixer/diff/LICENSE_GECKO deleted file mode 100644 index 066294d..0000000 --- a/vendor/php-cs-fixer/diff/LICENSE_GECKO +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) https://github.com/GeckoPackages - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/vendor/php-cs-fixer/diff/README.md b/vendor/php-cs-fixer/diff/README.md deleted file mode 100644 index d410625..0000000 --- a/vendor/php-cs-fixer/diff/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# PHP-CS-Fixer/diff - -This version is for PHP CS Fixer only! Do not use it! - -Code from `sebastian/diff` has been forked a republished by permission of Sebastian Bergmann. -Licenced with BSD-3-Clause @ see LICENSE_DIFF, copyright (c) Sebastian Bergmann <sebastian@phpunit.de> -https://github.com/sebastianbergmann/diff - -Code from `GeckoPackages/GeckoDiffOutputBuilder` has been copied and republished by permission of GeckoPackages. -Licenced with MIT @ see LICENSE_GECKO, copyright (c) GeckoPackages https://github.com/GeckoPackages -https://github.com/GeckoPackages/GeckoDiffOutputBuilder/ - -For questions visit us @ https://gitter.im/PHP-CS-Fixer/Lobby diff --git a/vendor/php-cs-fixer/diff/composer.json b/vendor/php-cs-fixer/diff/composer.json deleted file mode 100644 index e08be75..0000000 --- a/vendor/php-cs-fixer/diff/composer.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "php-cs-fixer/diff", - "description": "sebastian/diff v2 backport support for PHP5.6", - "keywords": ["diff"], - "homepage": "https://github.com/PHP-CS-Fixer", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "SpacePossum" - } - ], - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.23 || ^6.4.3", - "symfony/process": "^3.3" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "psr-4": { - "PhpCsFixer\\Diff\\v1_4\\Tests\\": "tests/v1_4", - "PhpCsFixer\\Diff\\v2_0\\Tests\\": "tests/v2_0", - "PhpCsFixer\\Diff\\v3_0\\": "tests/v3_0", - "PhpCsFixer\\Diff\\GeckoPackages\\DiffOutputBuilder\\Tests\\": "tests/GeckoPackages/DiffOutputBuilder/Tests", - "PhpCsFixer\\Diff\\GeckoPackages\\DiffOutputBuilder\\Utils\\": "tests/GeckoPackages/DiffOutputBuilder/Utils" - } - } -} diff --git a/vendor/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/ConfigurationException.php b/vendor/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/ConfigurationException.php deleted file mode 100644 index 315ac07..0000000 --- a/vendor/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/ConfigurationException.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -/* - * This file is part of the GeckoPackages. - * - * (c) GeckoPackages https://github.com/GeckoPackages - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Diff\GeckoPackages\DiffOutputBuilder; - -use Exception; - -final class ConfigurationException extends \InvalidArgumentException -{ - public function __construct( - $option, - $expected, - $value, - $code = 0, - Exception $previous = null - ) { - parent::__construct( - \sprintf( - 'Option "%s" must be %s, got "%s".', - $option, - $expected, - \is_object($value) ? \get_class($value) : (null === $value ? '<null>' : \gettype($value).'#'.$value) - ), - $code, - $previous - ); - } -} diff --git a/vendor/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/UnifiedDiffOutputBuilder.php b/vendor/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/UnifiedDiffOutputBuilder.php deleted file mode 100644 index 8a70372..0000000 --- a/vendor/php-cs-fixer/diff/src/GeckoPackages/DiffOutputBuilder/UnifiedDiffOutputBuilder.php +++ /dev/null @@ -1,295 +0,0 @@ -<?php - -/* - * This file is part of the GeckoPackages. - * - * (c) GeckoPackages https://github.com/GeckoPackages - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Diff\GeckoPackages\DiffOutputBuilder; - -use PhpCsFixer\Diff\v2_0\Output\DiffOutputBuilderInterface; - -/** - * Strict Unified diff output builder. - * - * @name Unified diff output builder - * - * @description Generates (strict) Unified diff's (unidiffs) with hunks. - * - * @author SpacePossum - * - * @api - */ -final class UnifiedDiffOutputBuilder implements DiffOutputBuilderInterface -{ - /** - * @var int - */ - private static $noNewlineAtOEFid = 998877; - - /** - * @var bool - */ - private $changed; - - /** - * @var bool - */ - private $collapseRanges; - - /** - * @var int >= 0 - */ - private $commonLineThreshold; - - /** - * @var string - */ - private $header; - - /** - * @var int >= 0 - */ - private $contextLines; - - private static $default = [ - 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 - 'collapseRanges' => true, // ranges of length one are rendered with the trailing `,1` - 'fromFile' => null, - 'fromFileDate' => null, - 'toFile' => null, - 'toFileDate' => null, - 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) - ]; - - public function __construct(array $options = []) - { - $options = \array_merge(self::$default, $options); - - if (!\is_bool($options['collapseRanges'])) { - throw new ConfigurationException('collapseRanges', 'a bool', $options['collapseRanges']); - } - - if (!\is_int($options['contextLines']) || $options['contextLines'] < 0) { - throw new ConfigurationException('contextLines', 'an int >= 0', $options['contextLines']); - } - - if (!\is_int($options['commonLineThreshold']) || $options['commonLineThreshold'] < 1) { - throw new ConfigurationException('commonLineThreshold', 'an int > 0', $options['commonLineThreshold']); - } - - foreach (['fromFile', 'toFile'] as $option) { - if (!\is_string($options[$option])) { - throw new ConfigurationException($option, 'a string', $options[$option]); - } - } - - foreach (['fromFileDate', 'toFileDate'] as $option) { - if (null !== $options[$option] && !\is_string($options[$option])) { - throw new ConfigurationException($option, 'a string or <null>', $options[$option]); - } - } - - $this->header = \sprintf( - "--- %s%s\n+++ %s%s\n", - $options['fromFile'], - null === $options['fromFileDate'] ? '' : "\t".$options['fromFileDate'], - $options['toFile'], - null === $options['toFileDate'] ? '' : "\t".$options['toFileDate'] - ); - - $this->collapseRanges = $options['collapseRanges']; - $this->commonLineThreshold = $options['commonLineThreshold']; - $this->contextLines = $options['contextLines']; - } - - public function getDiff(array $diff) - { - if (0 === \count($diff)) { - return ''; - } - - $this->changed = false; - - $buffer = \fopen('php://memory', 'r+b'); - \fwrite($buffer, $this->header); - - $this->writeDiffHunks($buffer, $diff); - - $diff = \stream_get_contents($buffer, -1, 0); - - \fclose($buffer); - - if (!$this->changed) { - return ''; - } - - return $diff; - } - - private function writeDiffHunks($output, array $diff) - { - // detect "No newline at end of file" and insert into `$diff` if needed - - $upperLimit = \count($diff); - - // append "\ No newline at end of file" if needed - if (0 === $diff[$upperLimit - 1][1]) { - $lc = \substr($diff[$upperLimit - 1][0], -1); - if ("\n" !== $lc) { - \array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", self::$noNewlineAtOEFid]]); - } - } else { - // search back for the last `+` and `-` line, - // check if has trailing linebreak, else add under it warning under it - $toFind = [1 => true, 2 => true]; - for ($i = $upperLimit - 1; $i >= 0; --$i) { - if (isset($toFind[$diff[$i][1]])) { - unset($toFind[$diff[$i][1]]); - $lc = \substr($diff[$i][0], -1); - if ("\n" !== $lc) { - \array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", self::$noNewlineAtOEFid]]); - } - - if (!\count($toFind)) { - break; - } - } - } - } - - // write hunks to output buffer - - $cutOff = \max($this->commonLineThreshold, $this->contextLines); - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - $toStart = $fromStart = 1; - - foreach ($diff as $i => $entry) { - if (0 === $entry[1]) { // same - if (false === $hunkCapture) { - ++$fromStart; - ++$toStart; - - continue; - } - - ++$sameCount; - ++$toRange; - ++$fromRange; - - if ($sameCount === $cutOff) { - $contextStartOffset = $hunkCapture - $this->contextLines < 0 - ? $hunkCapture - : $this->contextLines - ; - - $contextEndOffset = $i + $this->contextLines >= \count($diff) - ? \count($diff) - $i - : $this->contextLines - ; - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $cutOff + $contextEndOffset + 1, - $fromStart - $contextStartOffset, - $fromRange - $cutOff + $contextStartOffset + $contextEndOffset, - $toStart - $contextStartOffset, - $toRange - $cutOff + $contextStartOffset + $contextEndOffset, - $output - ); - - $fromStart += $fromRange; - $toStart += $toRange; - - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - } - - continue; - } - - $sameCount = 0; - - if ($entry[1] === self::$noNewlineAtOEFid) { - continue; - } - - $this->changed = true; - - if (false === $hunkCapture) { - $hunkCapture = $i; - } - - if (1 === $entry[1]) { // added - ++$toRange; - } - - if (2 === $entry[1]) { // removed - ++$fromRange; - } - } - - if (false !== $hunkCapture) { - $contextStartOffset = $hunkCapture - $this->contextLines < 0 - ? $hunkCapture - : $this->contextLines - ; - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - \count($diff), - $fromStart - $contextStartOffset, - $fromRange + $contextStartOffset, - $toStart - $contextStartOffset, - $toRange + $contextStartOffset, - $output - ); - } - } - - private function writeHunk( - array $diff, - $diffStartIndex, - $diffEndIndex, - $fromStart, - $fromRange, - $toStart, - $toRange, - $output - ) { - \fwrite($output, '@@ -'.$fromStart); - - if (!$this->collapseRanges || 1 !== $fromRange) { - \fwrite($output, ','.$fromRange); - } - - \fwrite($output, ' +'.$toStart); - if (!$this->collapseRanges || 1 !== $toRange) { - \fwrite($output, ','.$toRange); - } - - \fwrite($output, " @@\n"); - - for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { - if ($diff[$i][1] === 1) { // added - $this->changed = true; - \fwrite($output, '+'.$diff[$i][0]); - } elseif ($diff[$i][1] === 2) { // removed - $this->changed = true; - \fwrite($output, '-'.$diff[$i][0]); - } elseif ($diff[$i][1] === 0) { // same - \fwrite($output, ' '.$diff[$i][0]); - } elseif ($diff[$i][1] === self::$noNewlineAtOEFid) { - $this->changed = true; - \fwrite($output, $diff[$i][0]); - } - } - } -} diff --git a/vendor/php-cs-fixer/diff/src/v1_4/Chunk.php b/vendor/php-cs-fixer/diff/src/v1_4/Chunk.php deleted file mode 100644 index b247e03..0000000 --- a/vendor/php-cs-fixer/diff/src/v1_4/Chunk.php +++ /dev/null @@ -1,103 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v1_4; - -class Chunk -{ - /** - * @var int - */ - private $start; - - /** - * @var int - */ - private $startRange; - - /** - * @var int - */ - private $end; - - /** - * @var int - */ - private $endRange; - - /** - * @var array - */ - private $lines; - - /** - * @param int $start - * @param int $startRange - * @param int $end - * @param int $endRange - * @param array $lines - */ - public function __construct($start = 0, $startRange = 1, $end = 0, $endRange = 1, array $lines = array()) - { - $this->start = (int) $start; - $this->startRange = (int) $startRange; - $this->end = (int) $end; - $this->endRange = (int) $endRange; - $this->lines = $lines; - } - - /** - * @return int - */ - public function getStart() - { - return $this->start; - } - - /** - * @return int - */ - public function getStartRange() - { - return $this->startRange; - } - - /** - * @return int - */ - public function getEnd() - { - return $this->end; - } - - /** - * @return int - */ - public function getEndRange() - { - return $this->endRange; - } - - /** - * @return array - */ - public function getLines() - { - return $this->lines; - } - - /** - * @param array $lines - */ - public function setLines(array $lines) - { - $this->lines = $lines; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v1_4/Diff.php b/vendor/php-cs-fixer/diff/src/v1_4/Diff.php deleted file mode 100644 index 695a519..0000000 --- a/vendor/php-cs-fixer/diff/src/v1_4/Diff.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v1_4; - -class Diff -{ - /** - * @var string - */ - private $from; - - /** - * @var string - */ - private $to; - - /** - * @var Chunk[] - */ - private $chunks; - - /** - * @param string $from - * @param string $to - * @param Chunk[] $chunks - */ - public function __construct($from, $to, array $chunks = array()) - { - $this->from = $from; - $this->to = $to; - $this->chunks = $chunks; - } - - /** - * @return string - */ - public function getFrom() - { - return $this->from; - } - - /** - * @return string - */ - public function getTo() - { - return $this->to; - } - - /** - * @return Chunk[] - */ - public function getChunks() - { - return $this->chunks; - } - - /** - * @param Chunk[] $chunks - */ - public function setChunks(array $chunks) - { - $this->chunks = $chunks; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v1_4/Differ.php b/vendor/php-cs-fixer/diff/src/v1_4/Differ.php deleted file mode 100644 index b2015ab..0000000 --- a/vendor/php-cs-fixer/diff/src/v1_4/Differ.php +++ /dev/null @@ -1,399 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v1_4; - -use PhpCsFixer\Diff\v1_4\LCS\LongestCommonSubsequence; -use PhpCsFixer\Diff\v1_4\LCS\TimeEfficientImplementation; -use PhpCsFixer\Diff\v1_4\LCS\MemoryEfficientImplementation; - -/** - * Diff implementation. - */ -class Differ -{ - /** - * @var string - */ - private $header; - - /** - * @var bool - */ - private $showNonDiffLines; - - /** - * @param string $header - * @param bool $showNonDiffLines - */ - public function __construct($header = "--- Original\n+++ New\n", $showNonDiffLines = true) - { - $this->header = $header; - $this->showNonDiffLines = $showNonDiffLines; - } - - /** - * Returns the diff between two arrays or strings as string. - * - * @param array|string $from - * @param array|string $to - * @param LongestCommonSubsequence $lcs - * - * @return string - */ - public function diff($from, $to, LongestCommonSubsequence $lcs = null) - { - $from = $this->validateDiffInput($from); - $to = $this->validateDiffInput($to); - $diff = $this->diffToArray($from, $to, $lcs); - $old = $this->checkIfDiffInOld($diff); - $start = isset($old[0]) ? $old[0] : 0; - $end = \count($diff); - - if ($tmp = \array_search($end, $old)) { - $end = $tmp; - } - - return $this->getBuffer($diff, $old, $start, $end); - } - - /** - * Casts variable to string if it is not a string or array. - * - * @param mixed $input - * - * @return string - */ - private function validateDiffInput($input) - { - if (!\is_array($input) && !\is_string($input)) { - return (string) $input; - } - - return $input; - } - - /** - * Takes input of the diff array and returns the old array. - * Iterates through diff line by line, - * - * @param array $diff - * - * @return array - */ - private function checkIfDiffInOld(array $diff) - { - $inOld = false; - $i = 0; - $old = array(); - - foreach ($diff as $line) { - if ($line[1] === 0 /* OLD */) { - if ($inOld === false) { - $inOld = $i; - } - } elseif ($inOld !== false) { - if (($i - $inOld) > 5) { - $old[$inOld] = $i - 1; - } - - $inOld = false; - } - - ++$i; - } - - return $old; - } - - /** - * Generates buffer in string format, returning the patch. - * - * @param array $diff - * @param array $old - * @param int $start - * @param int $end - * - * @return string - */ - private function getBuffer(array $diff, array $old, $start, $end) - { - $buffer = $this->header; - - if (!isset($old[$start])) { - $buffer = $this->getDiffBufferElementNew($diff, $buffer, $start); - ++$start; - } - - for ($i = $start; $i < $end; $i++) { - if (isset($old[$i])) { - $i = $old[$i]; - $buffer = $this->getDiffBufferElementNew($diff, $buffer, $i); - } else { - $buffer = $this->getDiffBufferElement($diff, $buffer, $i); - } - } - - return $buffer; - } - - /** - * Gets individual buffer element. - * - * @param array $diff - * @param string $buffer - * @param int $diffIndex - * - * @return string - */ - private function getDiffBufferElement(array $diff, $buffer, $diffIndex) - { - if ($diff[$diffIndex][1] === 1 /* ADDED */) { - $buffer .= '+' . $diff[$diffIndex][0] . "\n"; - } elseif ($diff[$diffIndex][1] === 2 /* REMOVED */) { - $buffer .= '-' . $diff[$diffIndex][0] . "\n"; - } elseif ($this->showNonDiffLines === true) { - $buffer .= ' ' . $diff[$diffIndex][0] . "\n"; - } - - return $buffer; - } - - /** - * Gets individual buffer element with opening. - * - * @param array $diff - * @param string $buffer - * @param int $diffIndex - * - * @return string - */ - private function getDiffBufferElementNew(array $diff, $buffer, $diffIndex) - { - if ($this->showNonDiffLines === true) { - $buffer .= "@@ @@\n"; - } - - return $this->getDiffBufferElement($diff, $buffer, $diffIndex); - } - - /** - * Returns the diff between two arrays or strings as array. - * - * Each array element contains two elements: - * - [0] => mixed $token - * - [1] => 2|1|0 - * - * - 2: REMOVED: $token was removed from $from - * - 1: ADDED: $token was added to $from - * - 0: OLD: $token is not changed in $to - * - * @param array|string $from - * @param array|string $to - * @param LongestCommonSubsequence $lcs - * - * @return array - */ - public function diffToArray($from, $to, LongestCommonSubsequence $lcs = null) - { - if (\is_string($from)) { - $fromMatches = $this->getNewLineMatches($from); - $from = $this->splitStringByLines($from); - } elseif (\is_array($from)) { - $fromMatches = array(); - } else { - throw new \InvalidArgumentException('"from" must be an array or string.'); - } - - if (\is_string($to)) { - $toMatches = $this->getNewLineMatches($to); - $to = $this->splitStringByLines($to); - } elseif (\is_array($to)) { - $toMatches = array(); - } else { - throw new \InvalidArgumentException('"to" must be an array or string.'); - } - - list($from, $to, $start, $end) = self::getArrayDiffParted($from, $to); - - if ($lcs === null) { - $lcs = $this->selectLcsImplementation($from, $to); - } - - $common = $lcs->calculate(\array_values($from), \array_values($to)); - $diff = array(); - - if ($this->detectUnmatchedLineEndings($fromMatches, $toMatches)) { - $diff[] = array( - '#Warnings contain different line endings!', - 0 - ); - } - - foreach ($start as $token) { - $diff[] = array($token, 0 /* OLD */); - } - - \reset($from); - \reset($to); - - foreach ($common as $token) { - while (($fromToken = \reset($from)) !== $token) { - $diff[] = array(\array_shift($from), 2 /* REMOVED */); - } - - while (($toToken = \reset($to)) !== $token) { - $diff[] = array(\array_shift($to), 1 /* ADDED */); - } - - $diff[] = array($token, 0 /* OLD */); - - \array_shift($from); - \array_shift($to); - } - - while (($token = \array_shift($from)) !== null) { - $diff[] = array($token, 2 /* REMOVED */); - } - - while (($token = \array_shift($to)) !== null) { - $diff[] = array($token, 1 /* ADDED */); - } - - foreach ($end as $token) { - $diff[] = array($token, 0 /* OLD */); - } - - return $diff; - } - - /** - * Get new strings denoting new lines from a given string. - * - * @param string $string - * - * @return array - */ - private function getNewLineMatches($string) - { - \preg_match_all('(\r\n|\r|\n)', $string, $stringMatches); - - return $stringMatches; - } - - /** - * Checks if input is string, if so it will split it line-by-line. - * - * @param string $input - * - * @return array - */ - private function splitStringByLines($input) - { - return \preg_split('(\r\n|\r|\n)', $input); - } - - /** - * @param array $from - * @param array $to - * - * @return LongestCommonSubsequence - */ - private function selectLcsImplementation(array $from, array $to) - { - // We do not want to use the time-efficient implementation if its memory - // footprint will probably exceed this value. Note that the footprint - // calculation is only an estimation for the matrix and the LCS method - // will typically allocate a bit more memory than this. - $memoryLimit = 100 * 1024 * 1024; - - if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) { - return new MemoryEfficientImplementation; - } - - return new TimeEfficientImplementation; - } - - /** - * Calculates the estimated memory footprint for the DP-based method. - * - * @param array $from - * @param array $to - * - * @return int|float - */ - private function calculateEstimatedFootprint(array $from, array $to) - { - $itemSize = PHP_INT_SIZE === 4 ? 76 : 144; - - return $itemSize * \pow(\min(\count($from), \count($to)), 2); - } - - /** - * Returns true if line ends don't match on fromMatches and toMatches. - * - * @param array $fromMatches - * @param array $toMatches - * - * @return bool - */ - private function detectUnmatchedLineEndings(array $fromMatches, array $toMatches) - { - return isset($fromMatches[0], $toMatches[0]) && - \count($fromMatches[0]) === \count($toMatches[0]) && - $fromMatches[0] !== $toMatches[0]; - } - - /** - * @param array $from - * @param array $to - * - * @return array - */ - private static function getArrayDiffParted(array &$from, array &$to) - { - $start = array(); - $end = array(); - - \reset($to); - - foreach ($from as $k => $v) { - $toK = \key($to); - - if ($toK === $k && $v === $to[$k]) { - $start[$k] = $v; - - unset($from[$k], $to[$k]); - } else { - break; - } - } - - \end($from); - \end($to); - - do { - $fromK = \key($from); - $toK = \key($to); - - if (null === $fromK || null === $toK || \current($from) !== \current($to)) { - break; - } - - \prev($from); - \prev($to); - - $end = array($fromK => $from[$fromK]) + $end; - unset($from[$fromK], $to[$toK]); - } while (true); - - return array($from, $to, $start, $end); - } -} diff --git a/vendor/php-cs-fixer/diff/src/v1_4/LCS/LongestCommonSubsequence.php b/vendor/php-cs-fixer/diff/src/v1_4/LCS/LongestCommonSubsequence.php deleted file mode 100644 index dad5a0c..0000000 --- a/vendor/php-cs-fixer/diff/src/v1_4/LCS/LongestCommonSubsequence.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v1_4\LCS; - -/** - * Interface for implementations of longest common subsequence calculation. - */ -interface LongestCommonSubsequence -{ - /** - * Calculates the longest common subsequence of two arrays. - * - * @param array $from - * @param array $to - * - * @return array - */ - public function calculate(array $from, array $to); -} diff --git a/vendor/php-cs-fixer/diff/src/v1_4/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php b/vendor/php-cs-fixer/diff/src/v1_4/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php deleted file mode 100644 index 6685252..0000000 --- a/vendor/php-cs-fixer/diff/src/v1_4/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v1_4\LCS; - -/** - * Memory-efficient implementation of longest common subsequence calculation. - */ -class MemoryEfficientImplementation implements LongestCommonSubsequence -{ - /** - * Calculates the longest common subsequence of two arrays. - * - * @param array $from - * @param array $to - * - * @return array - */ - public function calculate(array $from, array $to) - { - $cFrom = \count($from); - $cTo = \count($to); - - if ($cFrom === 0) { - return array(); - } - - if ($cFrom === 1) { - if (\in_array($from[0], $to, true)) { - return array($from[0]); - } - - return array(); - } - - $i = (int) ($cFrom / 2); - $fromStart = \array_slice($from, 0, $i); - $fromEnd = \array_slice($from, $i); - $llB = $this->length($fromStart, $to); - $llE = $this->length(\array_reverse($fromEnd), \array_reverse($to)); - $jMax = 0; - $max = 0; - - for ($j = 0; $j <= $cTo; $j++) { - $m = $llB[$j] + $llE[$cTo - $j]; - - if ($m >= $max) { - $max = $m; - $jMax = $j; - } - } - - $toStart = \array_slice($to, 0, $jMax); - $toEnd = \array_slice($to, $jMax); - - return \array_merge( - $this->calculate($fromStart, $toStart), - $this->calculate($fromEnd, $toEnd) - ); - } - - /** - * @param array $from - * @param array $to - * - * @return array - */ - private function length(array $from, array $to) - { - $current = \array_fill(0, \count($to) + 1, 0); - $cFrom = \count($from); - $cTo = \count($to); - - for ($i = 0; $i < $cFrom; $i++) { - $prev = $current; - - for ($j = 0; $j < $cTo; $j++) { - if ($from[$i] === $to[$j]) { - $current[$j + 1] = $prev[$j] + 1; - } else { - $current[$j + 1] = \max($current[$j], $prev[$j + 1]); - } - } - } - - return $current; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v1_4/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php b/vendor/php-cs-fixer/diff/src/v1_4/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php deleted file mode 100644 index 4acd68e..0000000 --- a/vendor/php-cs-fixer/diff/src/v1_4/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v1_4\LCS; - -/** - * Time-efficient implementation of longest common subsequence calculation. - */ -class TimeEfficientImplementation implements LongestCommonSubsequence -{ - /** - * Calculates the longest common subsequence of two arrays. - * - * @param array $from - * @param array $to - * - * @return array - */ - public function calculate(array $from, array $to) - { - $common = array(); - $fromLength = \count($from); - $toLength = \count($to); - $width = $fromLength + 1; - $matrix = new \SplFixedArray($width * ($toLength + 1)); - - for ($i = 0; $i <= $fromLength; ++$i) { - $matrix[$i] = 0; - } - - for ($j = 0; $j <= $toLength; ++$j) { - $matrix[$j * $width] = 0; - } - - for ($i = 1; $i <= $fromLength; ++$i) { - for ($j = 1; $j <= $toLength; ++$j) { - $o = ($j * $width) + $i; - $matrix[$o] = \max( - $matrix[$o - 1], - $matrix[$o - $width], - $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0 - ); - } - } - - $i = $fromLength; - $j = $toLength; - - while ($i > 0 && $j > 0) { - if ($from[$i - 1] === $to[$j - 1]) { - $common[] = $from[$i - 1]; - --$i; - --$j; - } else { - $o = ($j * $width) + $i; - - if ($matrix[$o - $width] > $matrix[$o - 1]) { - --$j; - } else { - --$i; - } - } - } - - return \array_reverse($common); - } -} diff --git a/vendor/php-cs-fixer/diff/src/v1_4/Line.php b/vendor/php-cs-fixer/diff/src/v1_4/Line.php deleted file mode 100644 index 1187bcd..0000000 --- a/vendor/php-cs-fixer/diff/src/v1_4/Line.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v1_4; - -class Line -{ - const ADDED = 1; - const REMOVED = 2; - const UNCHANGED = 3; - - /** - * @var int - */ - private $type; - - /** - * @var string - */ - private $content; - - /** - * @param int $type - * @param string $content - */ - public function __construct($type = self::UNCHANGED, $content = '') - { - $this->type = $type; - $this->content = $content; - } - - /** - * @return string - */ - public function getContent() - { - return $this->content; - } - - /** - * @return int - */ - public function getType() - { - return $this->type; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v1_4/Parser.php b/vendor/php-cs-fixer/diff/src/v1_4/Parser.php deleted file mode 100644 index 6f8e75b..0000000 --- a/vendor/php-cs-fixer/diff/src/v1_4/Parser.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v1_4; - -/** - * Unified diff parser. - */ -class Parser -{ - /** - * @param string $string - * - * @return Diff[] - */ - public function parse($string) - { - $lines = \preg_split('(\r\n|\r|\n)', $string); - - if (!empty($lines) && $lines[\count($lines) - 1] == '') { - \array_pop($lines); - } - - $lineCount = \count($lines); - $diffs = array(); - $diff = null; - $collected = array(); - - for ($i = 0; $i < $lineCount; ++$i) { - if (\preg_match('(^---\\s+(?P<file>\\S+))', $lines[$i], $fromMatch) && - \preg_match('(^\\+\\+\\+\\s+(?P<file>\\S+))', $lines[$i + 1], $toMatch)) { - if ($diff !== null) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - $collected = array(); - } - - $diff = new Diff($fromMatch['file'], $toMatch['file']); - - ++$i; - } else { - if (\preg_match('/^(?:diff --git |index [\da-f\.]+|[+-]{3} [ab])/', $lines[$i])) { - continue; - } - - $collected[] = $lines[$i]; - } - } - - if ($diff !== null && \count($collected)) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - } - - return $diffs; - } - - /** - * @param Diff $diff - * @param array $lines - */ - private function parseFileDiff(Diff $diff, array $lines) - { - $chunks = array(); - $chunk = null; - - foreach ($lines as $line) { - if (\preg_match('/^@@\s+-(?P<start>\d+)(?:,\s*(?P<startrange>\d+))?\s+\+(?P<end>\d+)(?:,\s*(?P<endrange>\d+))?\s+@@/', $line, $match)) { - $chunk = new Chunk( - $match['start'], - isset($match['startrange']) ? \max(1, $match['startrange']) : 1, - $match['end'], - isset($match['endrange']) ? \max(1, $match['endrange']) : 1 - ); - - $chunks[] = $chunk; - $diffLines = array(); - - continue; - } - - if (\preg_match('/^(?P<type>[+ -])?(?P<line>.*)/', $line, $match)) { - $type = Line::UNCHANGED; - - if ($match['type'] === '+') { - $type = Line::ADDED; - } elseif ($match['type'] === '-') { - $type = Line::REMOVED; - } - - $diffLines[] = new Line($type, $match['line']); - - if (null !== $chunk) { - $chunk->setLines($diffLines); - } - } - } - - $diff->setChunks($chunks); - } -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/Chunk.php b/vendor/php-cs-fixer/diff/src/v2_0/Chunk.php deleted file mode 100644 index b80ddfc..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/Chunk.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0; - -final class Chunk -{ - /** - * @var int - */ - private $start; - - /** - * @var int - */ - private $startRange; - - /** - * @var int - */ - private $end; - - /** - * @var int - */ - private $endRange; - - /** - * @var array - */ - private $lines; - - public function __construct($start = 0, $startRange = 1, $end = 0, $endRange = 1, array $lines = []) - { - $this->start = $start; - $this->startRange = $startRange; - $this->end = $end; - $this->endRange = $endRange; - $this->lines = $lines; - } - - public function getStart() - { - return $this->start; - } - - public function getStartRange() - { - return $this->startRange; - } - - public function getEnd() - { - return $this->end; - } - - public function getEndRange() - { - return $this->endRange; - } - - public function getLines() - { - return $this->lines; - } - - public function setLines(array $lines) - { - $this->lines = $lines; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/Diff.php b/vendor/php-cs-fixer/diff/src/v2_0/Diff.php deleted file mode 100644 index e89b8e9..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/Diff.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0; - -final class Diff -{ - /** - * @var string - */ - private $from; - - /** - * @var string - */ - private $to; - - /** - * @var Chunk[] - */ - private $chunks; - - /** - * @param string $from - * @param string $to - * @param Chunk[] $chunks - */ - public function __construct($from, $to, array $chunks = []) - { - $this->from = $from; - $this->to = $to; - $this->chunks = $chunks; - } - - public function getFrom() - { - return $this->from; - } - - public function getTo() - { - return $this->to; - } - - /** - * @return Chunk[] - */ - public function getChunks() - { - return $this->chunks; - } - - /** - * @param Chunk[] $chunks - */ - public function setChunks(array $chunks) - { - $this->chunks = $chunks; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/Differ.php b/vendor/php-cs-fixer/diff/src/v2_0/Differ.php deleted file mode 100644 index a8f7dba..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/Differ.php +++ /dev/null @@ -1,321 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0; - -use PhpCsFixer\Diff\v2_0\Output\DiffOutputBuilderInterface; -use PhpCsFixer\Diff\v2_0\Output\UnifiedDiffOutputBuilder; - -/** - * Diff implementation. - */ -final class Differ -{ - /** - * @var DiffOutputBuilderInterface - */ - private $outputBuilder; - - /** - * @param DiffOutputBuilderInterface $outputBuilder - * - * @throws InvalidArgumentException - */ - public function __construct($outputBuilder = null) - { - if ($outputBuilder instanceof DiffOutputBuilderInterface) { - $this->outputBuilder = $outputBuilder; - } elseif (null === $outputBuilder) { - $this->outputBuilder = new UnifiedDiffOutputBuilder; - } elseif (\is_string($outputBuilder)) { - // PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 support - // @see https://github.com/sebastianbergmann/phpunit/issues/2734#issuecomment-314514056 - // @deprecated - $this->outputBuilder = new UnifiedDiffOutputBuilder($outputBuilder); - } else { - throw new InvalidArgumentException( - \sprintf( - 'Expected builder to be an instance of DiffOutputBuilderInterface, <null> or a string, got %s.', - \is_object($outputBuilder) ? 'instance of "' . \get_class($outputBuilder) . '"' : \gettype($outputBuilder) . ' "' . $outputBuilder . '"' - ) - ); - } - } - - /** - * Returns the diff between two arrays or strings as string. - * - * @param array|string $from - * @param array|string $to - * @param LongestCommonSubsequenceCalculator|null $lcs - * - * @return string - */ - public function diff($from, $to, LongestCommonSubsequenceCalculator $lcs = null) - { - $from = $this->validateDiffInput($from); - $to = $this->validateDiffInput($to); - $diff = $this->diffToArray($from, $to, $lcs); - - return $this->outputBuilder->getDiff($diff); - } - - /** - * Casts variable to string if it is not a string or array. - * - * @param mixed $input - * - * @return string - */ - private function validateDiffInput($input) - { - if (!\is_array($input) && !\is_string($input)) { - return (string) $input; - } - - return $input; - } - - /** - * Returns the diff between two arrays or strings as array. - * - * Each array element contains two elements: - * - [0] => mixed $token - * - [1] => 2|1|0 - * - * - 2: REMOVED: $token was removed from $from - * - 1: ADDED: $token was added to $from - * - 0: OLD: $token is not changed in $to - * - * @param array|string $from - * @param array|string $to - * @param LongestCommonSubsequenceCalculator $lcs - * - * @return array - */ - public function diffToArray($from, $to, LongestCommonSubsequenceCalculator $lcs = null) - { - if (\is_string($from)) { - $from = $this->splitStringByLines($from); - } elseif (!\is_array($from)) { - throw new \InvalidArgumentException('"from" must be an array or string.'); - } - - if (\is_string($to)) { - $to = $this->splitStringByLines($to); - } elseif (!\is_array($to)) { - throw new \InvalidArgumentException('"to" must be an array or string.'); - } - - list($from, $to, $start, $end) = self::getArrayDiffParted($from, $to); - - if ($lcs === null) { - $lcs = $this->selectLcsImplementation($from, $to); - } - - $common = $lcs->calculate(\array_values($from), \array_values($to)); - $diff = []; - - foreach ($start as $token) { - $diff[] = [$token, 0 /* OLD */]; - } - - \reset($from); - \reset($to); - - foreach ($common as $token) { - while (($fromToken = \reset($from)) !== $token) { - $diff[] = [\array_shift($from), 2 /* REMOVED */]; - } - - while (($toToken = \reset($to)) !== $token) { - $diff[] = [\array_shift($to), 1 /* ADDED */]; - } - - $diff[] = [$token, 0 /* OLD */]; - - \array_shift($from); - \array_shift($to); - } - - while (($token = \array_shift($from)) !== null) { - $diff[] = [$token, 2 /* REMOVED */]; - } - - while (($token = \array_shift($to)) !== null) { - $diff[] = [$token, 1 /* ADDED */]; - } - - foreach ($end as $token) { - $diff[] = [$token, 0 /* OLD */]; - } - - if ($this->detectUnmatchedLineEndings($diff)) { - \array_unshift($diff, ["#Warnings contain different line endings!\n", 3]); - } - - return $diff; - } - - /** - * Checks if input is string, if so it will split it line-by-line. - * - * @param string $input - * - * @return array - */ - private function splitStringByLines($input) - { - return \preg_split('/(.*\R)/', $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - } - - /** - * @param array $from - * @param array $to - * - * @return LongestCommonSubsequenceCalculator - */ - private function selectLcsImplementation(array $from, array $to) - { - // We do not want to use the time-efficient implementation if its memory - // footprint will probably exceed this value. Note that the footprint - // calculation is only an estimation for the matrix and the LCS method - // will typically allocate a bit more memory than this. - $memoryLimit = 100 * 1024 * 1024; - - if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) { - return new MemoryEfficientLongestCommonSubsequenceCalculator; - } - - return new TimeEfficientLongestCommonSubsequenceCalculator; - } - - /** - * Calculates the estimated memory footprint for the DP-based method. - * - * @param array $from - * @param array $to - * - * @return int|float - */ - private function calculateEstimatedFootprint(array $from, array $to) - { - $itemSize = PHP_INT_SIZE === 4 ? 76 : 144; - - return $itemSize * \min(\count($from), \count($to)) ** 2; - } - - /** - * Returns true if line ends don't match in a diff. - * - * @param array $diff - * - * @return bool - */ - private function detectUnmatchedLineEndings(array $diff) - { - $newLineBreaks = ['' => true]; - $oldLineBreaks = ['' => true]; - - foreach ($diff as $entry) { - if (0 === $entry[1]) { /* OLD */ - $ln = $this->getLinebreak($entry[0]); - $oldLineBreaks[$ln] = true; - $newLineBreaks[$ln] = true; - } elseif (1 === $entry[1]) { /* ADDED */ - $newLineBreaks[$this->getLinebreak($entry[0])] = true; - } elseif (2 === $entry[1]) { /* REMOVED */ - $oldLineBreaks[$this->getLinebreak($entry[0])] = true; - } - } - - // if either input or output is a single line without breaks than no warning should be raised - if (['' => true] === $newLineBreaks || ['' => true] === $oldLineBreaks) { - return false; - } - - // two way compare - foreach ($newLineBreaks as $break => $set) { - if (!isset($oldLineBreaks[$break])) { - return true; - } - } - - foreach ($oldLineBreaks as $break => $set) { - if (!isset($newLineBreaks[$break])) { - return true; - } - } - - return false; - } - - private function getLinebreak($line) - { - if (!\is_string($line)) { - return ''; - } - - $lc = \substr($line, -1); - if ("\r" === $lc) { - return "\r"; - } - - if ("\n" !== $lc) { - return ''; - } - - if ("\r\n" === \substr($line, -2)) { - return "\r\n"; - } - - return "\n"; - } - - private static function getArrayDiffParted(array &$from, array &$to) - { - $start = []; - $end = []; - - \reset($to); - - foreach ($from as $k => $v) { - $toK = \key($to); - - if ($toK === $k && $v === $to[$k]) { - $start[$k] = $v; - - unset($from[$k], $to[$k]); - } else { - break; - } - } - - \end($from); - \end($to); - - do { - $fromK = \key($from); - $toK = \key($to); - - if (null === $fromK || null === $toK || \current($from) !== \current($to)) { - break; - } - - \prev($from); - \prev($to); - - $end = [$fromK => $from[$fromK]] + $end; - unset($from[$fromK], $to[$toK]); - } while (true); - - return [$from, $to, $start, $end]; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/Exception/Exception.php b/vendor/php-cs-fixer/diff/src/v2_0/Exception/Exception.php deleted file mode 100644 index b7e9e92..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/Exception/Exception.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0; - -interface Exception -{ -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/Exception/InvalidArgumentException.php b/vendor/php-cs-fixer/diff/src/v2_0/Exception/InvalidArgumentException.php deleted file mode 100644 index e1a0c0b..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0; - -class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/Line.php b/vendor/php-cs-fixer/diff/src/v2_0/Line.php deleted file mode 100644 index 75d5ec8..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/Line.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0; - -final class Line -{ - const ADDED = 1; - const REMOVED = 2; - const UNCHANGED = 3; - - /** - * @var int - */ - private $type; - - /** - * @var string - */ - private $content; - - public function __construct($type = self::UNCHANGED, $content = '') - { - $this->type = $type; - $this->content = $content; - } - - public function getContent() - { - return $this->content; - } - - public function getType() - { - return $this->type; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/LongestCommonSubsequenceCalculator.php b/vendor/php-cs-fixer/diff/src/v2_0/LongestCommonSubsequenceCalculator.php deleted file mode 100644 index 25eda02..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/LongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0; - -interface LongestCommonSubsequenceCalculator -{ - /** - * Calculates the longest common subsequence of two arrays. - * - * @param array $from - * @param array $to - * - * @return array - */ - public function calculate(array $from, array $to); -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/MemoryEfficientLongestCommonSubsequenceCalculator.php b/vendor/php-cs-fixer/diff/src/v2_0/MemoryEfficientLongestCommonSubsequenceCalculator.php deleted file mode 100644 index e6ce284..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/MemoryEfficientLongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0; - -final class MemoryEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator -{ - /** - * {@inheritdoc} - */ - public function calculate(array $from, array $to) - { - $cFrom = \count($from); - $cTo = \count($to); - - if ($cFrom === 0) { - return []; - } - - if ($cFrom === 1) { - if (\in_array($from[0], $to, true)) { - return [$from[0]]; - } - - return []; - } - - $i = (int) ($cFrom / 2); - $fromStart = \array_slice($from, 0, $i); - $fromEnd = \array_slice($from, $i); - $llB = $this->length($fromStart, $to); - $llE = $this->length(\array_reverse($fromEnd), \array_reverse($to)); - $jMax = 0; - $max = 0; - - for ($j = 0; $j <= $cTo; $j++) { - $m = $llB[$j] + $llE[$cTo - $j]; - - if ($m >= $max) { - $max = $m; - $jMax = $j; - } - } - - $toStart = \array_slice($to, 0, $jMax); - $toEnd = \array_slice($to, $jMax); - - return \array_merge( - $this->calculate($fromStart, $toStart), - $this->calculate($fromEnd, $toEnd) - ); - } - - private function length(array $from, array $to) - { - $current = \array_fill(0, \count($to) + 1, 0); - $cFrom = \count($from); - $cTo = \count($to); - - for ($i = 0; $i < $cFrom; $i++) { - $prev = $current; - - for ($j = 0; $j < $cTo; $j++) { - if ($from[$i] === $to[$j]) { - $current[$j + 1] = $prev[$j] + 1; - } else { - $current[$j + 1] = \max($current[$j], $prev[$j + 1]); - } - } - } - - return $current; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/Output/AbstractChunkOutputBuilder.php b/vendor/php-cs-fixer/diff/src/v2_0/Output/AbstractChunkOutputBuilder.php deleted file mode 100644 index d7d78d7..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/Output/AbstractChunkOutputBuilder.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0\Output; - -abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface -{ - /** - * Takes input of the diff array and returns the common parts. - * Iterates through diff line by line. - * - * @param array $diff - * @param int $lineThreshold - * - * @return array - */ - protected function getCommonChunks(array $diff, $lineThreshold = 5) - { - $diffSize = \count($diff); - $capturing = false; - $chunkStart = 0; - $chunkSize = 0; - $commonChunks = []; - - for ($i = 0; $i < $diffSize; ++$i) { - if ($diff[$i][1] === 0 /* OLD */) { - if ($capturing === false) { - $capturing = true; - $chunkStart = $i; - $chunkSize = 0; - } else { - ++$chunkSize; - } - } elseif ($capturing !== false) { - if ($chunkSize >= $lineThreshold) { - $commonChunks[$chunkStart] = $chunkStart + $chunkSize; - } - - $capturing = false; - } - } - - if ($capturing !== false && $chunkSize >= $lineThreshold) { - $commonChunks[$chunkStart] = $chunkStart + $chunkSize; - } - - return $commonChunks; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/Output/DiffOnlyOutputBuilder.php b/vendor/php-cs-fixer/diff/src/v2_0/Output/DiffOnlyOutputBuilder.php deleted file mode 100644 index 51cb2de..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/Output/DiffOnlyOutputBuilder.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PhpCsFixer\Diff\v2_0\Output; - -/** - * Builds a diff string representation in a loose unified diff format - * listing only changes lines. Does not include line numbers. - */ -final class DiffOnlyOutputBuilder implements DiffOutputBuilderInterface -{ - /** - * @var string - */ - private $header; - - public function __construct($header = "--- Original\n+++ New\n") - { - $this->header = $header; - } - - public function getDiff(array $diff) - { - $buffer = \fopen('php://memory', 'r+b'); - - if ('' !== $this->header) { - \fwrite($buffer, $this->header); - if ("\n" !== \substr($this->header, -1, 1)) { - \fwrite($buffer, "\n"); - } - } - - foreach ($diff as $diffEntry) { - if ($diffEntry[1] === 1 /* ADDED */) { - \fwrite($buffer, '+' . $diffEntry[0]); - } elseif ($diffEntry[1] === 2 /* REMOVED */) { - \fwrite($buffer, '-' . $diffEntry[0]); - } elseif ($diffEntry[1] === 3 /* WARNING */) { - \fwrite($buffer, ' ' . $diffEntry[0]); - - continue; // Warnings should not be tested for line break, it will always be there - } else { /* Not changed (old) 0 */ - continue; // we didn't write the non changs line, so do not add a line break either - } - - $lc = \substr($diffEntry[0], -1); - if ($lc !== "\n" && $lc !== "\r") { - \fwrite($buffer, "\n"); // \No newline at end of file - } - } - - $diff = \stream_get_contents($buffer, -1, 0); - \fclose($buffer); - - return $diff; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/Output/DiffOutputBuilderInterface.php b/vendor/php-cs-fixer/diff/src/v2_0/Output/DiffOutputBuilderInterface.php deleted file mode 100644 index b52b8ac..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/Output/DiffOutputBuilderInterface.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PhpCsFixer\Diff\v2_0\Output; - -/** - * Defines how an output builder should take a generated - * diff array and return a string representation of that diff. - */ -interface DiffOutputBuilderInterface -{ - public function getDiff(array $diff); -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/Output/UnifiedDiffOutputBuilder.php b/vendor/php-cs-fixer/diff/src/v2_0/Output/UnifiedDiffOutputBuilder.php deleted file mode 100644 index e761865..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/Output/UnifiedDiffOutputBuilder.php +++ /dev/null @@ -1,165 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0\Output; - -/** - * Builds a diff string representation in unified diff format in chunks. - */ -final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder -{ - /** - * @var string - */ - private $header; - - /** - * @var bool - */ - private $addLineNumbers; - - public function __construct($header = "--- Original\n+++ New\n", $addLineNumbers = false) - { - $this->header = $header; - $this->addLineNumbers = $addLineNumbers; - } - - public function getDiff(array $diff) - { - $buffer = \fopen('php://memory', 'r+b'); - - if ('' !== $this->header) { - \fwrite($buffer, $this->header); - if ("\n" !== \substr($this->header, -1, 1)) { - \fwrite($buffer, "\n"); - } - } - - $this->writeDiffChunked($buffer, $diff, $this->getCommonChunks($diff)); - - $diff = \stream_get_contents($buffer, -1, 0); - - \fclose($buffer); - - return $diff; - } - - // `old` is an array with key => value pairs . Each pair represents a start and end index of `diff` - // of a list of elements all containing `same` (0) entries. - private function writeDiffChunked($output, array $diff, array $old) - { - $upperLimit = \count($diff); - $start = 0; - $fromStart = 0; - $toStart = 0; - - if (\count($old)) { // no common parts, list all diff entries - \reset($old); - - // iterate the diff, go from chunk to chunk skipping common chunk of lines between those - do { - $commonStart = \key($old); - $commonEnd = \current($old); - - if ($commonStart !== $start) { - list($fromRange, $toRange) = $this->getChunkRange($diff, $start, $commonStart); - $this->writeChunk($output, $diff, $start, $commonStart, $fromStart, $fromRange, $toStart, $toRange); - - $fromStart += $fromRange; - $toStart += $toRange; - } - - $start = $commonEnd + 1; - $commonLength = $commonEnd - $commonStart + 1; // calculate number of non-change lines in the common part - $fromStart += $commonLength; - $toStart += $commonLength; - } while (false !== \next($old)); - - \end($old); // short cut for finding possible last `change entry` - $tmp = \key($old); - \reset($old); - if ($old[$tmp] === $upperLimit - 1) { - $upperLimit = $tmp; - } - } - - if ($start < $upperLimit - 1) { // check for trailing (non) diff entries - do { - --$upperLimit; - } while (isset($diff[$upperLimit][1]) && $diff[$upperLimit][1] === 0); - ++$upperLimit; - - list($fromRange, $toRange) = $this->getChunkRange($diff, $start, $upperLimit); - $this->writeChunk($output, $diff, $start, $upperLimit, $fromStart, $fromRange, $toStart, $toRange); - } - } - - private function writeChunk( - $output, - array $diff, - $diffStartIndex, - $diffEndIndex, - $fromStart, - $fromRange, - $toStart, - $toRange - ) { - if ($this->addLineNumbers) { - \fwrite($output, '@@ -' . (1 + $fromStart)); - - if ($fromRange !== 1) { - \fwrite($output, ',' . $fromRange); - } - - \fwrite($output, ' +' . (1 + $toStart)); - if ($toRange !== 1) { - \fwrite($output, ',' . $toRange); - } - - \fwrite($output, " @@\n"); - } else { - \fwrite($output, "@@ @@\n"); - } - - for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { - if ($diff[$i][1] === 1 /* ADDED */) { - \fwrite($output, '+' . $diff[$i][0]); - } elseif ($diff[$i][1] === 2 /* REMOVED */) { - \fwrite($output, '-' . $diff[$i][0]); - } else { /* Not changed (old) 0 or Warning 3 */ - \fwrite($output, ' ' . $diff[$i][0]); - } - - $lc = \substr($diff[$i][0], -1); - if ($lc !== "\n" && $lc !== "\r") { - \fwrite($output, "\n"); // \No newline at end of file - } - } - } - - private function getChunkRange(array $diff, $diffStartIndex, $diffEndIndex) - { - $toRange = 0; - $fromRange = 0; - - for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { - if ($diff[$i][1] === 1) { // added - ++$toRange; - } elseif ($diff[$i][1] === 2) { // removed - ++$fromRange; - } elseif ($diff[$i][1] === 0) { // same - ++$fromRange; - ++$toRange; - } - } - - return [$fromRange, $toRange]; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/Parser.php b/vendor/php-cs-fixer/diff/src/v2_0/Parser.php deleted file mode 100644 index 9c0ee83..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/Parser.php +++ /dev/null @@ -1,106 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0; - -/** - * Unified diff parser. - */ -final class Parser -{ - /** - * @param string $string - * - * @return Diff[] - */ - public function parse($string) - { - $lines = \preg_split('(\r\n|\r|\n)', $string); - - if (!empty($lines) && $lines[\count($lines) - 1] === '') { - \array_pop($lines); - } - - $lineCount = \count($lines); - $diffs = []; - $diff = null; - $collected = []; - - for ($i = 0; $i < $lineCount; ++$i) { - if (\preg_match('(^---\\s+(?P<file>\\S+))', $lines[$i], $fromMatch) && - \preg_match('(^\\+\\+\\+\\s+(?P<file>\\S+))', $lines[$i + 1], $toMatch)) { - if ($diff !== null) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - $collected = []; - } - - $diff = new Diff($fromMatch['file'], $toMatch['file']); - - ++$i; - } else { - if (\preg_match('/^(?:diff --git |index [\da-f\.]+|[+-]{3} [ab])/', $lines[$i])) { - continue; - } - - $collected[] = $lines[$i]; - } - } - - if ($diff !== null && \count($collected)) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - } - - return $diffs; - } - - private function parseFileDiff(Diff $diff, array $lines) - { - $chunks = []; - $chunk = null; - - foreach ($lines as $line) { - if (\preg_match('/^@@\s+-(?P<start>\d+)(?:,\s*(?P<startrange>\d+))?\s+\+(?P<end>\d+)(?:,\s*(?P<endrange>\d+))?\s+@@/', $line, $match)) { - $chunk = new Chunk( - (int) $match['start'], - isset($match['startrange']) ? \max(1, (int) $match['startrange']) : 1, - (int) $match['end'], - isset($match['endrange']) ? \max(1, (int) $match['endrange']) : 1 - ); - - $chunks[] = $chunk; - $diffLines = []; - - continue; - } - - if (\preg_match('/^(?P<type>[+ -])?(?P<line>.*)/', $line, $match)) { - $type = Line::UNCHANGED; - - if ($match['type'] === '+') { - $type = Line::ADDED; - } elseif ($match['type'] === '-') { - $type = Line::REMOVED; - } - - $diffLines[] = new Line($type, $match['line']); - - if (null !== $chunk) { - $chunk->setLines($diffLines); - } - } - } - - $diff->setChunks($chunks); - } -} diff --git a/vendor/php-cs-fixer/diff/src/v2_0/TimeEfficientLongestCommonSubsequenceCalculator.php b/vendor/php-cs-fixer/diff/src/v2_0/TimeEfficientLongestCommonSubsequenceCalculator.php deleted file mode 100644 index 51489af..0000000 --- a/vendor/php-cs-fixer/diff/src/v2_0/TimeEfficientLongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v2_0; - -final class TimeEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator -{ - /** - * {@inheritdoc} - */ - public function calculate(array $from, array $to) - { - $common = []; - $fromLength = \count($from); - $toLength = \count($to); - $width = $fromLength + 1; - $matrix = new \SplFixedArray($width * ($toLength + 1)); - - for ($i = 0; $i <= $fromLength; ++$i) { - $matrix[$i] = 0; - } - - for ($j = 0; $j <= $toLength; ++$j) { - $matrix[$j * $width] = 0; - } - - for ($i = 1; $i <= $fromLength; ++$i) { - for ($j = 1; $j <= $toLength; ++$j) { - $o = ($j * $width) + $i; - $matrix[$o] = \max( - $matrix[$o - 1], - $matrix[$o - $width], - $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0 - ); - } - } - - $i = $fromLength; - $j = $toLength; - - while ($i > 0 && $j > 0) { - if ($from[$i - 1] === $to[$j - 1]) { - $common[] = $from[$i - 1]; - --$i; - --$j; - } else { - $o = ($j * $width) + $i; - - if ($matrix[$o - $width] > $matrix[$o - 1]) { - --$j; - } else { - --$i; - } - } - } - - return \array_reverse($common); - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Chunk.php b/vendor/php-cs-fixer/diff/src/v3_0/Chunk.php deleted file mode 100644 index 6b633c1..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Chunk.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0; - -final class Chunk -{ - /** - * @var int - */ - private $start; - - /** - * @var int - */ - private $startRange; - - /** - * @var int - */ - private $end; - - /** - * @var int - */ - private $endRange; - - /** - * @var array - */ - private $lines; - - public function __construct($start = 0, $startRange = 1, $end = 0, $endRange = 1, array $lines = []) - { - $this->start = $start; - $this->startRange = $startRange; - $this->end = $end; - $this->endRange = $endRange; - $this->lines = $lines; - } - - public function getStart() - { - return $this->start; - } - - public function getStartRange() - { - return $this->startRange; - } - - public function getEnd() - { - return $this->end; - } - - public function getEndRange() - { - return $this->endRange; - } - - public function getLines() - { - return $this->lines; - } - - public function setLines(array $lines) - { - $this->lines = $lines; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Diff.php b/vendor/php-cs-fixer/diff/src/v3_0/Diff.php deleted file mode 100644 index 9f537ec..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Diff.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0; - -final class Diff -{ - /** - * @var string - */ - private $from; - - /** - * @var string - */ - private $to; - - /** - * @var Chunk[] - */ - private $chunks; - - /** - * @param string $from - * @param string $to - * @param Chunk[] $chunks - */ - public function __construct($from, $to, array $chunks = []) - { - $this->from = $from; - $this->to = $to; - $this->chunks = $chunks; - } - - public function getFrom() - { - return $this->from; - } - - public function getTo() - { - return $this->to; - } - - /** - * @return Chunk[] - */ - public function getChunks() - { - return $this->chunks; - } - - /** - * @param Chunk[] $chunks - */ - public function setChunks(array $chunks) - { - $this->chunks = $chunks; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Differ.php b/vendor/php-cs-fixer/diff/src/v3_0/Differ.php deleted file mode 100644 index 42315f5..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Differ.php +++ /dev/null @@ -1,329 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0; - -use PhpCsFixer\Diff\v3_0\Output\DiffOutputBuilderInterface; -use PhpCsFixer\Diff\v3_0\Output\UnifiedDiffOutputBuilder; - -/** - * Diff implementation. - */ -final class Differ -{ - const OLD = 0; - const ADDED = 1; - const REMOVED = 2; - const DIFF_LINE_END_WARNING = 3; - const NO_LINE_END_EOF_WARNING = 4; - - /** - * @var DiffOutputBuilderInterface - */ - private $outputBuilder; - - /** - * @param DiffOutputBuilderInterface $outputBuilder - * - * @throws InvalidArgumentException - */ - public function __construct($outputBuilder = null) - { - if ($outputBuilder instanceof DiffOutputBuilderInterface) { - $this->outputBuilder = $outputBuilder; - } elseif (null === $outputBuilder) { - $this->outputBuilder = new UnifiedDiffOutputBuilder; - } elseif (\is_string($outputBuilder)) { - // PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 support - // @see https://github.com/sebastianbergmann/phpunit/issues/2734#issuecomment-314514056 - // @deprecated - $this->outputBuilder = new UnifiedDiffOutputBuilder($outputBuilder); - } else { - throw new InvalidArgumentException( - \sprintf( - 'Expected builder to be an instance of DiffOutputBuilderInterface, <null> or a string, got %s.', - \is_object($outputBuilder) ? 'instance of "' . \get_class($outputBuilder) . '"' : \gettype($outputBuilder) . ' "' . $outputBuilder . '"' - ) - ); - } - } - - /** - * Returns the diff between two arrays or strings as string. - * - * @param array|string $from - * @param array|string $to - * @param null|LongestCommonSubsequenceCalculator $lcs - * - * @return string - */ - public function diff($from, $to, LongestCommonSubsequenceCalculator $lcs = null) - { - $diff = $this->diffToArray( - $this->normalizeDiffInput($from), - $this->normalizeDiffInput($to), - $lcs - ); - - return $this->outputBuilder->getDiff($diff); - } - - /** - * Returns the diff between two arrays or strings as array. - * - * Each array element contains two elements: - * - [0] => mixed $token - * - [1] => 2|1|0 - * - * - 2: REMOVED: $token was removed from $from - * - 1: ADDED: $token was added to $from - * - 0: OLD: $token is not changed in $to - * - * @param array|string $from - * @param array|string $to - * @param LongestCommonSubsequenceCalculator $lcs - * - * @return array - */ - public function diffToArray($from, $to, LongestCommonSubsequenceCalculator $lcs = null) - { - if (\is_string($from)) { - $from = $this->splitStringByLines($from); - } elseif (!\is_array($from)) { - throw new InvalidArgumentException('"from" must be an array or string.'); - } - - if (\is_string($to)) { - $to = $this->splitStringByLines($to); - } elseif (!\is_array($to)) { - throw new InvalidArgumentException('"to" must be an array or string.'); - } - - list($from, $to, $start, $end) = self::getArrayDiffParted($from, $to); - - if ($lcs === null) { - $lcs = $this->selectLcsImplementation($from, $to); - } - - $common = $lcs->calculate(\array_values($from), \array_values($to)); - $diff = []; - - foreach ($start as $token) { - $diff[] = [$token, self::OLD]; - } - - \reset($from); - \reset($to); - - foreach ($common as $token) { - while (($fromToken = \reset($from)) !== $token) { - $diff[] = [\array_shift($from), self::REMOVED]; - } - - while (($toToken = \reset($to)) !== $token) { - $diff[] = [\array_shift($to), self::ADDED]; - } - - $diff[] = [$token, self::OLD]; - - \array_shift($from); - \array_shift($to); - } - - while (($token = \array_shift($from)) !== null) { - $diff[] = [$token, self::REMOVED]; - } - - while (($token = \array_shift($to)) !== null) { - $diff[] = [$token, self::ADDED]; - } - - foreach ($end as $token) { - $diff[] = [$token, self::OLD]; - } - - if ($this->detectUnmatchedLineEndings($diff)) { - \array_unshift($diff, ["#Warnings contain different line endings!\n", self::DIFF_LINE_END_WARNING]); - } - - return $diff; - } - - /** - * Casts variable to string if it is not a string or array. - * - * @param mixed $input - * - * @return array|string - */ - private function normalizeDiffInput($input) - { - if (!\is_array($input) && !\is_string($input)) { - return (string) $input; - } - - return $input; - } - - /** - * Checks if input is string, if so it will split it line-by-line. - * - * @param string $input - * - * @return array - */ - private function splitStringByLines($input) - { - return \preg_split('/(.*\R)/', $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - } - - /** - * @param array $from - * @param array $to - * - * @return LongestCommonSubsequenceCalculator - */ - private function selectLcsImplementation(array $from, array $to) - { - // We do not want to use the time-efficient implementation if its memory - // footprint will probably exceed this value. Note that the footprint - // calculation is only an estimation for the matrix and the LCS method - // will typically allocate a bit more memory than this. - $memoryLimit = 100 * 1024 * 1024; - - if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) { - return new MemoryEfficientLongestCommonSubsequenceCalculator; - } - - return new TimeEfficientLongestCommonSubsequenceCalculator; - } - - /** - * Calculates the estimated memory footprint for the DP-based method. - * - * @param array $from - * @param array $to - * - * @return float|int - */ - private function calculateEstimatedFootprint(array $from, array $to) - { - $itemSize = PHP_INT_SIZE === 4 ? 76 : 144; - - return $itemSize * \min(\count($from), \count($to)) ** 2; - } - - /** - * Returns true if line ends don't match in a diff. - * - * @param array $diff - * - * @return bool - */ - private function detectUnmatchedLineEndings(array $diff) - { - $newLineBreaks = ['' => true]; - $oldLineBreaks = ['' => true]; - - foreach ($diff as $entry) { - if (self::OLD === $entry[1]) { - $ln = $this->getLinebreak($entry[0]); - $oldLineBreaks[$ln] = true; - $newLineBreaks[$ln] = true; - } elseif (self::ADDED === $entry[1]) { - $newLineBreaks[$this->getLinebreak($entry[0])] = true; - } elseif (self::REMOVED === $entry[1]) { - $oldLineBreaks[$this->getLinebreak($entry[0])] = true; - } - } - - // if either input or output is a single line without breaks than no warning should be raised - if (['' => true] === $newLineBreaks || ['' => true] === $oldLineBreaks) { - return false; - } - - // two way compare - foreach ($newLineBreaks as $break => $set) { - if (!isset($oldLineBreaks[$break])) { - return true; - } - } - - foreach ($oldLineBreaks as $break => $set) { - if (!isset($newLineBreaks[$break])) { - return true; - } - } - - return false; - } - - private function getLinebreak($line) - { - if (!\is_string($line)) { - return ''; - } - - $lc = \substr($line, -1); - if ("\r" === $lc) { - return "\r"; - } - - if ("\n" !== $lc) { - return ''; - } - - if ("\r\n" === \substr($line, -2)) { - return "\r\n"; - } - - return "\n"; - } - - private static function getArrayDiffParted(array &$from, array &$to) - { - $start = []; - $end = []; - - \reset($to); - - foreach ($from as $k => $v) { - $toK = \key($to); - - if ($toK === $k && $v === $to[$k]) { - $start[$k] = $v; - - unset($from[$k], $to[$k]); - } else { - break; - } - } - - \end($from); - \end($to); - - do { - $fromK = \key($from); - $toK = \key($to); - - if (null === $fromK || null === $toK || \current($from) !== \current($to)) { - break; - } - - \prev($from); - \prev($to); - - $end = [$fromK => $from[$fromK]] + $end; - unset($from[$fromK], $to[$toK]); - } while (true); - - return [$from, $to, $start, $end]; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Exception/ConfigurationException.php b/vendor/php-cs-fixer/diff/src/v3_0/Exception/ConfigurationException.php deleted file mode 100644 index 8892d8f..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Exception/ConfigurationException.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0; - -final class ConfigurationException extends InvalidArgumentException -{ - /** - * @param string $option - * @param string $expected - * @param mixed $value - * @param int $code - * @param null|\Exception $previous - */ - public function __construct( - $option, - $expected, - $value, - $code = 0, - \Exception $previous = null - ) { - parent::__construct( - \sprintf( - 'Option "%s" must be %s, got "%s".', - $option, - $expected, - \is_object($value) ? \get_class($value) : (null === $value ? '<null>' : \gettype($value) . '#' . $value) - ), - $code, - $previous - ); - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Exception/Exception.php b/vendor/php-cs-fixer/diff/src/v3_0/Exception/Exception.php deleted file mode 100644 index 7a391db..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Exception/Exception.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0; - -interface Exception -{ -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Exception/InvalidArgumentException.php b/vendor/php-cs-fixer/diff/src/v3_0/Exception/InvalidArgumentException.php deleted file mode 100644 index 5085482..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0; - -class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Line.php b/vendor/php-cs-fixer/diff/src/v3_0/Line.php deleted file mode 100644 index 07be880..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Line.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0; - -final class Line -{ - const ADDED = 1; - const REMOVED = 2; - const UNCHANGED = 3; - - /** - * @var int - */ - private $type; - - /** - * @var string - */ - private $content; - - public function __construct($type = self::UNCHANGED, $content = '') - { - $this->type = $type; - $this->content = $content; - } - - public function getContent() - { - return $this->content; - } - - public function getType() - { - return $this->type; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/LongestCommonSubsequenceCalculator.php b/vendor/php-cs-fixer/diff/src/v3_0/LongestCommonSubsequenceCalculator.php deleted file mode 100644 index be5ed5a..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/LongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0; - -interface LongestCommonSubsequenceCalculator -{ - /** - * Calculates the longest common subsequence of two arrays. - * - * @param array $from - * @param array $to - * - * @return array - */ - public function calculate(array $from, array $to); -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/MemoryEfficientLongestCommonSubsequenceCalculator.php b/vendor/php-cs-fixer/diff/src/v3_0/MemoryEfficientLongestCommonSubsequenceCalculator.php deleted file mode 100644 index 85a1c4e..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/MemoryEfficientLongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0; - -final class MemoryEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator -{ - /** - * {@inheritdoc} - */ - public function calculate(array $from, array $to) - { - $cFrom = \count($from); - $cTo = \count($to); - - if ($cFrom === 0) { - return []; - } - - if ($cFrom === 1) { - if (\in_array($from[0], $to, true)) { - return [$from[0]]; - } - - return []; - } - - $i = (int) ($cFrom / 2); - $fromStart = \array_slice($from, 0, $i); - $fromEnd = \array_slice($from, $i); - $llB = $this->length($fromStart, $to); - $llE = $this->length(\array_reverse($fromEnd), \array_reverse($to)); - $jMax = 0; - $max = 0; - - for ($j = 0; $j <= $cTo; $j++) { - $m = $llB[$j] + $llE[$cTo - $j]; - - if ($m >= $max) { - $max = $m; - $jMax = $j; - } - } - - $toStart = \array_slice($to, 0, $jMax); - $toEnd = \array_slice($to, $jMax); - - return \array_merge( - $this->calculate($fromStart, $toStart), - $this->calculate($fromEnd, $toEnd) - ); - } - - private function length(array $from, array $to) - { - $current = \array_fill(0, \count($to) + 1, 0); - $cFrom = \count($from); - $cTo = \count($to); - - for ($i = 0; $i < $cFrom; $i++) { - $prev = $current; - - for ($j = 0; $j < $cTo; $j++) { - if ($from[$i] === $to[$j]) { - $current[$j + 1] = $prev[$j] + 1; - } else { - $current[$j + 1] = \max($current[$j], $prev[$j + 1]); - } - } - } - - return $current; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Output/AbstractChunkOutputBuilder.php b/vendor/php-cs-fixer/diff/src/v3_0/Output/AbstractChunkOutputBuilder.php deleted file mode 100644 index ecf7d32..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Output/AbstractChunkOutputBuilder.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0\Output; - -abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface -{ - /** - * Takes input of the diff array and returns the common parts. - * Iterates through diff line by line. - * - * @param array $diff - * @param int $lineThreshold - * - * @return array - */ - protected function getCommonChunks(array $diff, $lineThreshold = 5) - { - $diffSize = \count($diff); - $capturing = false; - $chunkStart = 0; - $chunkSize = 0; - $commonChunks = []; - - for ($i = 0; $i < $diffSize; ++$i) { - if ($diff[$i][1] === 0 /* OLD */) { - if ($capturing === false) { - $capturing = true; - $chunkStart = $i; - $chunkSize = 0; - } else { - ++$chunkSize; - } - } elseif ($capturing !== false) { - if ($chunkSize >= $lineThreshold) { - $commonChunks[$chunkStart] = $chunkStart + $chunkSize; - } - - $capturing = false; - } - } - - if ($capturing !== false && $chunkSize >= $lineThreshold) { - $commonChunks[$chunkStart] = $chunkStart + $chunkSize; - } - - return $commonChunks; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Output/DiffOnlyOutputBuilder.php b/vendor/php-cs-fixer/diff/src/v3_0/Output/DiffOnlyOutputBuilder.php deleted file mode 100644 index 0f3b81f..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Output/DiffOnlyOutputBuilder.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0\Output; - -use PhpCsFixer\Diff\v3_0\Differ; - -/** - * Builds a diff string representation in a loose unified diff format - * listing only changes lines. Does not include line numbers. - */ -final class DiffOnlyOutputBuilder implements DiffOutputBuilderInterface -{ - /** - * @var string - */ - private $header; - - public function __construct($header = "--- Original\n+++ New\n") - { - $this->header = $header; - } - - public function getDiff(array $diff) - { - $buffer = \fopen('php://memory', 'r+b'); - - if ('' !== $this->header) { - \fwrite($buffer, $this->header); - if ("\n" !== \substr($this->header, -1, 1)) { - \fwrite($buffer, "\n"); - } - } - - foreach ($diff as $diffEntry) { - if ($diffEntry[1] === Differ::ADDED) { - \fwrite($buffer, '+' . $diffEntry[0]); - } elseif ($diffEntry[1] === Differ::REMOVED) { - \fwrite($buffer, '-' . $diffEntry[0]); - } elseif ($diffEntry[1] === Differ::DIFF_LINE_END_WARNING) { - \fwrite($buffer, ' ' . $diffEntry[0]); - - continue; // Warnings should not be tested for line break, it will always be there - } else { /* Not changed (old) 0 */ - continue; // we didn't write the non changs line, so do not add a line break either - } - - $lc = \substr($diffEntry[0], -1); - if ($lc !== "\n" && $lc !== "\r") { - \fwrite($buffer, "\n"); // \No newline at end of file - } - } - - $diff = \stream_get_contents($buffer, -1, 0); - \fclose($buffer); - - return $diff; - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Output/DiffOutputBuilderInterface.php b/vendor/php-cs-fixer/diff/src/v3_0/Output/DiffOutputBuilderInterface.php deleted file mode 100644 index ae690e6..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Output/DiffOutputBuilderInterface.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0\Output; - -/** - * Defines how an output builder should take a generated - * diff array and return a string representation of that diff. - */ -interface DiffOutputBuilderInterface -{ - public function getDiff(array $diff); -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Output/StrictUnifiedDiffOutputBuilder.php b/vendor/php-cs-fixer/diff/src/v3_0/Output/StrictUnifiedDiffOutputBuilder.php deleted file mode 100644 index 49faa8a..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Output/StrictUnifiedDiffOutputBuilder.php +++ /dev/null @@ -1,315 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0\Output; - -use PhpCsFixer\Diff\v3_0\ConfigurationException; -use PhpCsFixer\Diff\v3_0\Differ; - -/** - * Strict Unified diff output builder. - * - * Generates (strict) Unified diff's (unidiffs) with hunks. - */ -final class StrictUnifiedDiffOutputBuilder implements DiffOutputBuilderInterface -{ - /** - * @var bool - */ - private $changed; - - /** - * @var bool - */ - private $collapseRanges; - - /** - * @var int >= 0 - */ - private $commonLineThreshold; - - /** - * @var string - */ - private $header; - - /** - * @var int >= 0 - */ - private $contextLines; - - private static $default = [ - 'collapseRanges' => true, // ranges of length one are rendered with the trailing `,1` - 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) - 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 - 'fromFile' => null, - 'fromFileDate' => null, - 'toFile' => null, - 'toFileDate' => null, - ]; - - public function __construct(array $options = []) - { - $options = \array_merge(self::$default, $options); - - if (!\is_bool($options['collapseRanges'])) { - throw new ConfigurationException('collapseRanges', 'a bool', $options['collapseRanges']); - } - - if (!\is_int($options['contextLines']) || $options['contextLines'] < 0) { - throw new ConfigurationException('contextLines', 'an int >= 0', $options['contextLines']); - } - - if (!\is_int($options['commonLineThreshold']) || $options['commonLineThreshold'] <= 0) { - throw new ConfigurationException('commonLineThreshold', 'an int > 0', $options['commonLineThreshold']); - } - - foreach (['fromFile', 'toFile'] as $option) { - if (!\is_string($options[$option])) { - throw new ConfigurationException($option, 'a string', $options[$option]); - } - } - - foreach (['fromFileDate', 'toFileDate'] as $option) { - if (null !== $options[$option] && !\is_string($options[$option])) { - throw new ConfigurationException($option, 'a string or <null>', $options[$option]); - } - } - - $this->header = \sprintf( - "--- %s%s\n+++ %s%s\n", - $options['fromFile'], - null === $options['fromFileDate'] ? '' : "\t" . $options['fromFileDate'], - $options['toFile'], - null === $options['toFileDate'] ? '' : "\t" . $options['toFileDate'] - ); - - $this->collapseRanges = $options['collapseRanges']; - $this->commonLineThreshold = $options['commonLineThreshold']; - $this->contextLines = $options['contextLines']; - } - - public function getDiff(array $diff) - { - if (0 === \count($diff)) { - return ''; - } - - $this->changed = false; - - $buffer = \fopen('php://memory', 'r+b'); - \fwrite($buffer, $this->header); - - $this->writeDiffHunks($buffer, $diff); - - if (!$this->changed) { - \fclose($buffer); - - return ''; - } - - $diff = \stream_get_contents($buffer, -1, 0); - - \fclose($buffer); - - // If the last char is not a linebreak: add it. - // This might happen when both the `from` and `to` do not have a trailing linebreak - $last = \substr($diff, -1); - - return "\n" !== $last && "\r" !== $last - ? $diff . "\n" - : $diff - ; - } - - private function writeDiffHunks($output, array $diff) - { - // detect "No newline at end of file" and insert into `$diff` if needed - - $upperLimit = \count($diff); - - if (0 === $diff[$upperLimit - 1][1]) { - $lc = \substr($diff[$upperLimit - 1][0], -1); - if ("\n" !== $lc) { - \array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - } else { - // search back for the last `+` and `-` line, - // check if has trailing linebreak, else add under it warning under it - $toFind = [1 => true, 2 => true]; - for ($i = $upperLimit - 1; $i >= 0; --$i) { - if (isset($toFind[$diff[$i][1]])) { - unset($toFind[$diff[$i][1]]); - $lc = \substr($diff[$i][0], -1); - if ("\n" !== $lc) { - \array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - - if (!\count($toFind)) { - break; - } - } - } - } - - // write hunks to output buffer - - $cutOff = \max($this->commonLineThreshold, $this->contextLines); - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - $toStart = $fromStart = 1; - - foreach ($diff as $i => $entry) { - if (0 === $entry[1]) { // same - if (false === $hunkCapture) { - ++$fromStart; - ++$toStart; - - continue; - } - - ++$sameCount; - ++$toRange; - ++$fromRange; - - if ($sameCount === $cutOff) { - $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 - ? $hunkCapture - : $this->contextLines - ; - - // note: $contextEndOffset = $this->contextLines; - // - // because we never go beyond the end of the diff. - // with the cutoff/contextlines here the follow is never true; - // - // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { - // $contextEndOffset = count($diff) - 1; - // } - // - // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $cutOff + $this->contextLines + 1, - $fromStart - $contextStartOffset, - $fromRange - $cutOff + $contextStartOffset + $this->contextLines, - $toStart - $contextStartOffset, - $toRange - $cutOff + $contextStartOffset + $this->contextLines, - $output - ); - - $fromStart += $fromRange; - $toStart += $toRange; - - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - } - - continue; - } - - $sameCount = 0; - - if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { - continue; - } - - $this->changed = true; - - if (false === $hunkCapture) { - $hunkCapture = $i; - } - - if (Differ::ADDED === $entry[1]) { // added - ++$toRange; - } - - if (Differ::REMOVED === $entry[1]) { // removed - ++$fromRange; - } - } - - if (false === $hunkCapture) { - return; - } - - // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, - // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold - - $contextStartOffset = $hunkCapture - $this->contextLines < 0 - ? $hunkCapture - : $this->contextLines - ; - - // prevent trying to write out more common lines than there are in the diff _and_ - // do not write more than configured through the context lines - $contextEndOffset = \min($sameCount, $this->contextLines); - - $fromRange -= $sameCount; - $toRange -= $sameCount; - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $sameCount + $contextEndOffset + 1, - $fromStart - $contextStartOffset, - $fromRange + $contextStartOffset + $contextEndOffset, - $toStart - $contextStartOffset, - $toRange + $contextStartOffset + $contextEndOffset, - $output - ); - } - - private function writeHunk( - array $diff, - $diffStartIndex, - $diffEndIndex, - $fromStart, - $fromRange, - $toStart, - $toRange, - $output - ) { - \fwrite($output, '@@ -' . $fromStart); - - if (!$this->collapseRanges || 1 !== $fromRange) { - \fwrite($output, ',' . $fromRange); - } - - \fwrite($output, ' +' . $toStart); - if (!$this->collapseRanges || 1 !== $toRange) { - \fwrite($output, ',' . $toRange); - } - - \fwrite($output, " @@\n"); - - for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { - if ($diff[$i][1] === Differ::ADDED) { - $this->changed = true; - \fwrite($output, '+' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::REMOVED) { - $this->changed = true; - \fwrite($output, '-' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::OLD) { - \fwrite($output, ' ' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { - $this->changed = true; - \fwrite($output, $diff[$i][0]); - } - //} elseif ($diff[$i][1] === Differ::DIFF_LINE_END_WARNING) { // custom comment inserted by PHPUnit/diff package - // skip - //} else { - // unknown/invalid - //} - } - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Output/UnifiedDiffOutputBuilder.php b/vendor/php-cs-fixer/diff/src/v3_0/Output/UnifiedDiffOutputBuilder.php deleted file mode 100644 index 5e7276a..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Output/UnifiedDiffOutputBuilder.php +++ /dev/null @@ -1,259 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0\Output; - -use PhpCsFixer\Diff\v3_0\Differ; - -/** - * Builds a diff string representation in unified diff format in chunks. - */ -final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder -{ - /** - * @var bool - */ - private $collapseRanges = true; - - /** - * @var int >= 0 - */ - private $commonLineThreshold = 6; - - /** - * @var int >= 0 - */ - private $contextLines = 3; - - /** - * @var string - */ - private $header; - - /** - * @var bool - */ - private $addLineNumbers; - - public function __construct($header = "--- Original\n+++ New\n", $addLineNumbers = false) - { - $this->header = $header; - $this->addLineNumbers = $addLineNumbers; - } - - public function getDiff(array $diff) - { - $buffer = \fopen('php://memory', 'r+b'); - - if ('' !== $this->header) { - \fwrite($buffer, $this->header); - if ("\n" !== \substr($this->header, -1, 1)) { - \fwrite($buffer, "\n"); - } - } - - if (0 !== \count($diff)) { - $this->writeDiffHunks($buffer, $diff); - } - - $diff = \stream_get_contents($buffer, -1, 0); - - \fclose($buffer); - - // If the last char is not a linebreak: add it. - // This might happen when both the `from` and `to` do not have a trailing linebreak - $last = \substr($diff, -1); - - return "\n" !== $last && "\r" !== $last - ? $diff . "\n" - : $diff - ; - } - - private function writeDiffHunks($output, array $diff) - { - // detect "No newline at end of file" and insert into `$diff` if needed - - $upperLimit = \count($diff); - - if (0 === $diff[$upperLimit - 1][1]) { - $lc = \substr($diff[$upperLimit - 1][0], -1); - if ("\n" !== $lc) { - \array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - } else { - // search back for the last `+` and `-` line, - // check if has trailing linebreak, else add under it warning under it - $toFind = [1 => true, 2 => true]; - for ($i = $upperLimit - 1; $i >= 0; --$i) { - if (isset($toFind[$diff[$i][1]])) { - unset($toFind[$diff[$i][1]]); - $lc = \substr($diff[$i][0], -1); - if ("\n" !== $lc) { - \array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - - if (!\count($toFind)) { - break; - } - } - } - } - - // write hunks to output buffer - - $cutOff = \max($this->commonLineThreshold, $this->contextLines); - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - $toStart = $fromStart = 1; - - foreach ($diff as $i => $entry) { - if (0 === $entry[1]) { // same - if (false === $hunkCapture) { - ++$fromStart; - ++$toStart; - - continue; - } - - ++$sameCount; - ++$toRange; - ++$fromRange; - - if ($sameCount === $cutOff) { - $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 - ? $hunkCapture - : $this->contextLines - ; - - // note: $contextEndOffset = $this->contextLines; - // - // because we never go beyond the end of the diff. - // with the cutoff/contextlines here the follow is never true; - // - // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { - // $contextEndOffset = count($diff) - 1; - // } - // - // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $cutOff + $this->contextLines + 1, - $fromStart - $contextStartOffset, - $fromRange - $cutOff + $contextStartOffset + $this->contextLines, - $toStart - $contextStartOffset, - $toRange - $cutOff + $contextStartOffset + $this->contextLines, - $output - ); - - $fromStart += $fromRange; - $toStart += $toRange; - - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - } - - continue; - } - - $sameCount = 0; - - if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { - continue; - } - - if (false === $hunkCapture) { - $hunkCapture = $i; - } - - if (Differ::ADDED === $entry[1]) { - ++$toRange; - } - - if (Differ::REMOVED === $entry[1]) { - ++$fromRange; - } - } - - if (false === $hunkCapture) { - return; - } - - // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, - // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold - - $contextStartOffset = $hunkCapture - $this->contextLines < 0 - ? $hunkCapture - : $this->contextLines - ; - - // prevent trying to write out more common lines than there are in the diff _and_ - // do not write more than configured through the context lines - $contextEndOffset = \min($sameCount, $this->contextLines); - - $fromRange -= $sameCount; - $toRange -= $sameCount; - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $sameCount + $contextEndOffset + 1, - $fromStart - $contextStartOffset, - $fromRange + $contextStartOffset + $contextEndOffset, - $toStart - $contextStartOffset, - $toRange + $contextStartOffset + $contextEndOffset, - $output - ); - } - - private function writeHunk( - array $diff, - $diffStartIndex, - $diffEndIndex, - $fromStart, - $fromRange, - $toStart, - $toRange, - $output - ) { - if ($this->addLineNumbers) { - \fwrite($output, '@@ -' . $fromStart); - - if (!$this->collapseRanges || 1 !== $fromRange) { - \fwrite($output, ',' . $fromRange); - } - - \fwrite($output, ' +' . $toStart); - if (!$this->collapseRanges || 1 !== $toRange) { - \fwrite($output, ',' . $toRange); - } - - \fwrite($output, " @@\n"); - } else { - \fwrite($output, "@@ @@\n"); - } - - for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { - if ($diff[$i][1] === Differ::ADDED) { - \fwrite($output, '+' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::REMOVED) { - \fwrite($output, '-' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::OLD) { - \fwrite($output, ' ' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { - \fwrite($output, "\n"); // $diff[$i][0] - } else { /* Not changed (old) Differ::OLD or Warning Differ::DIFF_LINE_END_WARNING */ - \fwrite($output, ' ' . $diff[$i][0]); - } - } - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/Parser.php b/vendor/php-cs-fixer/diff/src/v3_0/Parser.php deleted file mode 100644 index aa7175a..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/Parser.php +++ /dev/null @@ -1,106 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0; - -/** - * Unified diff parser. - */ -final class Parser -{ - /** - * @param string $string - * - * @return Diff[] - */ - public function parse($string) - { - $lines = \preg_split('(\r\n|\r|\n)', $string); - - if (!empty($lines) && $lines[\count($lines) - 1] === '') { - \array_pop($lines); - } - - $lineCount = \count($lines); - $diffs = []; - $diff = null; - $collected = []; - - for ($i = 0; $i < $lineCount; ++$i) { - if (\preg_match('(^---\\s+(?P<file>\\S+))', $lines[$i], $fromMatch) && - \preg_match('(^\\+\\+\\+\\s+(?P<file>\\S+))', $lines[$i + 1], $toMatch)) { - if ($diff !== null) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - $collected = []; - } - - $diff = new Diff($fromMatch['file'], $toMatch['file']); - - ++$i; - } else { - if (\preg_match('/^(?:diff --git |index [\da-f\.]+|[+-]{3} [ab])/', $lines[$i])) { - continue; - } - - $collected[] = $lines[$i]; - } - } - - if ($diff !== null && \count($collected)) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - } - - return $diffs; - } - - private function parseFileDiff(Diff $diff, array $lines) - { - $chunks = []; - $chunk = null; - - foreach ($lines as $line) { - if (\preg_match('/^@@\s+-(?P<start>\d+)(?:,\s*(?P<startrange>\d+))?\s+\+(?P<end>\d+)(?:,\s*(?P<endrange>\d+))?\s+@@/', $line, $match)) { - $chunk = new Chunk( - (int) $match['start'], - isset($match['startrange']) ? \max(1, (int) $match['startrange']) : 1, - (int) $match['end'], - isset($match['endrange']) ? \max(1, (int) $match['endrange']) : 1 - ); - - $chunks[] = $chunk; - $diffLines = []; - - continue; - } - - if (\preg_match('/^(?P<type>[+ -])?(?P<line>.*)/', $line, $match)) { - $type = Line::UNCHANGED; - - if ($match['type'] === '+') { - $type = Line::ADDED; - } elseif ($match['type'] === '-') { - $type = Line::REMOVED; - } - - $diffLines[] = new Line($type, $match['line']); - - if (null !== $chunk) { - $chunk->setLines($diffLines); - } - } - } - - $diff->setChunks($chunks); - } -} diff --git a/vendor/php-cs-fixer/diff/src/v3_0/TimeEfficientLongestCommonSubsequenceCalculator.php b/vendor/php-cs-fixer/diff/src/v3_0/TimeEfficientLongestCommonSubsequenceCalculator.php deleted file mode 100644 index 644968a..0000000 --- a/vendor/php-cs-fixer/diff/src/v3_0/TimeEfficientLongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php -/* - * This file is part of sebastian/diff. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\v3_0; - -final class TimeEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator -{ - /** - * {@inheritdoc} - */ - public function calculate(array $from, array $to) - { - $common = []; - $fromLength = \count($from); - $toLength = \count($to); - $width = $fromLength + 1; - $matrix = new \SplFixedArray($width * ($toLength + 1)); - - for ($i = 0; $i <= $fromLength; ++$i) { - $matrix[$i] = 0; - } - - for ($j = 0; $j <= $toLength; ++$j) { - $matrix[$j * $width] = 0; - } - - for ($i = 1; $i <= $fromLength; ++$i) { - for ($j = 1; $j <= $toLength; ++$j) { - $o = ($j * $width) + $i; - $matrix[$o] = \max( - $matrix[$o - 1], - $matrix[$o - $width], - $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0 - ); - } - } - - $i = $fromLength; - $j = $toLength; - - while ($i > 0 && $j > 0) { - if ($from[$i - 1] === $to[$j - 1]) { - $common[] = $from[$i - 1]; - --$i; - --$j; - } else { - $o = ($j * $width) + $i; - - if ($matrix[$o - $width] > $matrix[$o - 1]) { - --$j; - } else { - --$i; - } - } - } - - return \array_reverse($common); - } -} diff --git a/vendor/phpdocumentor/reflection-common/.github/dependabot.yml b/vendor/phpdocumentor/reflection-common/.github/dependabot.yml deleted file mode 100644 index c630ffa..0000000 --- a/vendor/phpdocumentor/reflection-common/.github/dependabot.yml +++ /dev/null @@ -1,7 +0,0 @@ -version: 2 -updates: -- package-ecosystem: composer - directory: "/" - schedule: - interval: daily - open-pull-requests-limit: 10 diff --git a/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml b/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml deleted file mode 100644 index 484410e..0000000 --- a/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml +++ /dev/null @@ -1,223 +0,0 @@ -on: - push: - branches: - - 2.x - pull_request: -name: Qa workflow -jobs: - setup: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - - name: Restore/cache tools folder - uses: actions/cache@v1 - with: - path: tools - key: all-tools-${{ github.sha }} - restore-keys: | - all-tools-${{ github.sha }}- - all-tools- - - - name: composer - uses: docker://composer - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - args: install --no-interaction --prefer-dist --optimize-autoloader - - - name: Install phive - run: make install-phive - - - name: Install PHAR dependencies - run: tools/phive.phar --no-progress install --copy --trust-gpg-keys 4AA394086372C20A,8A03EA3B385DBAA1 --force-accept-unsigned - - phpunit-with-coverage: - runs-on: ubuntu-latest - name: Unit tests - needs: setup - steps: - - uses: actions/checkout@v2 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: 7.2 - ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 - coverage: pcov - - - name: Restore/cache tools folder - uses: actions/cache@v1 - with: - path: tools - key: all-tools-${{ github.sha }} - restore-keys: | - all-tools-${{ github.sha }}- - all-tools- - - - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ubuntu-latest-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ubuntu-latest-composer- - - - name: Install Composer dependencies - run: | - composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - - - name: Run PHPUnit - run: php tools/phpunit - - phpunit: - runs-on: ${{ matrix.operating-system }} - strategy: - matrix: - operating-system: - - ubuntu-latest - - windows-latest - - macOS-latest - php-versions: ['7.2', '7.3', '7.4', '8.0'] - name: Unit tests for PHP version ${{ matrix.php-versions }} on ${{ matrix.operating-system }} - needs: - - setup - - phpunit-with-coverage - steps: - - uses: actions/checkout@v2 - - - name: Restore/cache tools folder - uses: actions/cache@v1 - with: - path: tools - key: all-tools-${{ github.sha }} - restore-keys: | - all-tools-${{ github.sha }}- - all-tools- - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-versions }} - ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 - coverage: none - - - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Install Composer dependencies - run: | - composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - - - name: Run PHPUnit - continue-on-error: true - run: php tools/phpunit - - codestyle: - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - name: Code style check - uses: phpDocumentor/coding-standard@latest - with: - args: -s - - phpstan: - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - name: PHPStan - uses: phpDocumentor/phpstan-ga@latest - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - args: analyse src --configuration phpstan.neon - - psalm: - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: 7.2 - ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 - tools: psalm - coverage: none - - - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Install Composer dependencies - run: | - composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - - - name: Psalm - run: psalm --output-format=github - - bc_check: - name: BC Check - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - name: fetch tags - run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - name: Roave BC Check - uses: docker://nyholm/roave-bc-check-ga diff --git a/vendor/phpdocumentor/reflection-common/LICENSE b/vendor/phpdocumentor/reflection-common/LICENSE deleted file mode 100644 index ed6926c..0000000 --- a/vendor/phpdocumentor/reflection-common/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 phpDocumentor - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/vendor/phpdocumentor/reflection-common/README.md b/vendor/phpdocumentor/reflection-common/README.md deleted file mode 100644 index 70f830d..0000000 --- a/vendor/phpdocumentor/reflection-common/README.md +++ /dev/null @@ -1,11 +0,0 @@ -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -![Qa workflow](https://github.com/phpDocumentor/ReflectionCommon/workflows/Qa%20workflow/badge.svg) -[![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionCommon.svg)](https://coveralls.io/github/phpDocumentor/ReflectionCommon?branch=master) -[![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) -[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) -[![Stable Version](https://img.shields.io/packagist/v/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) -[![Unstable Version](https://img.shields.io/packagist/vpre/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) - - -ReflectionCommon -================ diff --git a/vendor/phpdocumentor/reflection-common/composer.json b/vendor/phpdocumentor/reflection-common/composer.json deleted file mode 100644 index 4d128b4..0000000 --- a/vendor/phpdocumentor/reflection-common/composer.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "phpdocumentor/reflection-common", - "keywords": ["phpdoc", "phpDocumentor", "reflection", "static analysis", "FQSEN"], - "homepage": "http://www.phpdoc.org", - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "license": "MIT", - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "require": { - "php": "^7.2 || ^8.0" - }, - "autoload" : { - "psr-4" : { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "require-dev": { - }, - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - } -} diff --git a/vendor/phpdocumentor/reflection-common/src/Element.php b/vendor/phpdocumentor/reflection-common/src/Element.php deleted file mode 100644 index 8923e4f..0000000 --- a/vendor/phpdocumentor/reflection-common/src/Element.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * phpDocumentor - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -/** - * Interface for Api Elements - */ -interface Element -{ - /** - * Returns the Fqsen of the element. - */ - public function getFqsen() : Fqsen; - - /** - * Returns the name of the element. - */ - public function getName() : string; -} diff --git a/vendor/phpdocumentor/reflection-common/src/File.php b/vendor/phpdocumentor/reflection-common/src/File.php deleted file mode 100644 index 239c137..0000000 --- a/vendor/phpdocumentor/reflection-common/src/File.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -/** - * Interface for files processed by the ProjectFactory - */ -interface File -{ - /** - * Returns the content of the file as a string. - */ - public function getContents() : string; - - /** - * Returns md5 hash of the file. - */ - public function md5() : string; - - /** - * Returns an relative path to the file. - */ - public function path() : string; -} diff --git a/vendor/phpdocumentor/reflection-common/src/Fqsen.php b/vendor/phpdocumentor/reflection-common/src/Fqsen.php deleted file mode 100644 index 8fc5d34..0000000 --- a/vendor/phpdocumentor/reflection-common/src/Fqsen.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * phpDocumentor - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -use InvalidArgumentException; -use function assert; -use function end; -use function explode; -use function is_string; -use function preg_match; -use function sprintf; -use function trim; - -/** - * Value Object for Fqsen. - * - * @link https://github.com/phpDocumentor/fig-standards/blob/master/proposed/phpdoc-meta.md - * - * @psalm-immutable - */ -final class Fqsen -{ - /** @var string full quallified class name */ - private $fqsen; - - /** @var string name of the element without path. */ - private $name; - - /** - * Initializes the object. - * - * @throws InvalidArgumentException when $fqsen is not matching the format. - */ - public function __construct(string $fqsen) - { - $matches = []; - - $result = preg_match( - //phpcs:ignore Generic.Files.LineLength.TooLong - '/^\\\\([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff\\\\]*)?(?:[:]{2}\\$?([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*))?(?:\\(\\))?$/', - $fqsen, - $matches - ); - - if ($result === 0) { - throw new InvalidArgumentException( - sprintf('"%s" is not a valid Fqsen.', $fqsen) - ); - } - - $this->fqsen = $fqsen; - - if (isset($matches[2])) { - $this->name = $matches[2]; - } else { - $matches = explode('\\', $fqsen); - $name = end($matches); - assert(is_string($name)); - $this->name = trim($name, '()'); - } - } - - /** - * converts this class to string. - */ - public function __toString() : string - { - return $this->fqsen; - } - - /** - * Returns the name of the element without path. - */ - public function getName() : string - { - return $this->name; - } -} diff --git a/vendor/phpdocumentor/reflection-common/src/Location.php b/vendor/phpdocumentor/reflection-common/src/Location.php deleted file mode 100644 index 177deed..0000000 --- a/vendor/phpdocumentor/reflection-common/src/Location.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -/** - * The location where an element occurs within a file. - * - * @psalm-immutable - */ -final class Location -{ - /** @var int */ - private $lineNumber = 0; - - /** @var int */ - private $columnNumber = 0; - - /** - * Initializes the location for an element using its line number in the file and optionally the column number. - */ - public function __construct(int $lineNumber, int $columnNumber = 0) - { - $this->lineNumber = $lineNumber; - $this->columnNumber = $columnNumber; - } - - /** - * Returns the line number that is covered by this location. - */ - public function getLineNumber() : int - { - return $this->lineNumber; - } - - /** - * Returns the column number (character position on a line) for this location object. - */ - public function getColumnNumber() : int - { - return $this->columnNumber; - } -} diff --git a/vendor/phpdocumentor/reflection-common/src/Project.php b/vendor/phpdocumentor/reflection-common/src/Project.php deleted file mode 100644 index 57839fd..0000000 --- a/vendor/phpdocumentor/reflection-common/src/Project.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * phpDocumentor - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -/** - * Interface for project. Since the definition of a project can be different per factory this interface will be small. - */ -interface Project -{ - /** - * Returns the name of the project. - */ - public function getName() : string; -} diff --git a/vendor/phpdocumentor/reflection-common/src/ProjectFactory.php b/vendor/phpdocumentor/reflection-common/src/ProjectFactory.php deleted file mode 100644 index 8bdc606..0000000 --- a/vendor/phpdocumentor/reflection-common/src/ProjectFactory.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * phpDocumentor - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -/** - * Interface for project factories. A project factory shall convert a set of files - * into an object implementing the Project interface. - */ -interface ProjectFactory -{ - /** - * Creates a project from the set of files. - * - * @param File[] $files - */ - public function create(string $name, array $files) : Project; -} diff --git a/vendor/phpdocumentor/reflection-docblock/LICENSE b/vendor/phpdocumentor/reflection-docblock/LICENSE deleted file mode 100644 index 792e404..0000000 --- a/vendor/phpdocumentor/reflection-docblock/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2010 Mike van Riel - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/phpdocumentor/reflection-docblock/README.md b/vendor/phpdocumentor/reflection-docblock/README.md deleted file mode 100644 index 51f1088..0000000 --- a/vendor/phpdocumentor/reflection-docblock/README.md +++ /dev/null @@ -1,75 +0,0 @@ -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -![Qa workflow](https://github.com/phpDocumentor/ReflectionDocBlock/workflows/Qa%20workflow/badge.svg) -[![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionDocBlock.svg)](https://coveralls.io/github/phpDocumentor/ReflectionDocBlock?branch=master) -[![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionDocBlock.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionDocBlock/?branch=master) -[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionDocBlock.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionDocBlock/?branch=master) -[![Stable Version](https://img.shields.io/packagist/v/phpdocumentor/reflection-docblock.svg)](https://packagist.org/packages/phpdocumentor/reflection-docblock) -[![Unstable Version](https://img.shields.io/packagist/vpre/phpdocumentor/reflection-docblock.svg)](https://packagist.org/packages/phpdocumentor/reflection-docblock) - -ReflectionDocBlock -================== - -Introduction ------------- - -The ReflectionDocBlock component of phpDocumentor provides a DocBlock parser -that is 100% compatible with the [PHPDoc standard](http://phpdoc.org/docs/latest). - -With this component, a library can provide support for annotations via DocBlocks -or otherwise retrieve information that is embedded in a DocBlock. - -Installation ------------- - -```bash -composer require phpdocumentor/reflection-docblock -``` - -Usage ------ - -In order to parse the DocBlock one needs a DocBlockFactory that can be -instantiated using its `createInstance` factory method like this: - -```php -$factory = \phpDocumentor\Reflection\DocBlockFactory::createInstance(); -``` - -Then we can use the `create` method of the factory to interpret the DocBlock. -Please note that it is also possible to provide a class that has the -`getDocComment()` method, such as an object of type `ReflectionClass`, the -create method will read that if it exists. - -```php -$docComment = <<<DOCCOMMENT -/** - * This is an example of a summary. - * - * This is a Description. A Summary and Description are separated by either - * two subsequent newlines (thus a whiteline in between as can be seen in this - * example), or when the Summary ends with a dot (`.`) and some form of - * whitespace. - */ -DOCCOMMENT; - -$docblock = $factory->create($docComment); -``` - -The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock` -whose methods can be queried: - -```php -// Contains the summary for this DocBlock -$summary = $docblock->getSummary(); - -// Contains \phpDocumentor\Reflection\DocBlock\Description object -$description = $docblock->getDescription(); - -// You can either cast it to string -$description = (string) $docblock->getDescription(); - -// Or use the render method to get a string representation of the Description. -$description = $docblock->getDescription()->render(); -``` - -> For more examples it would be best to review the scripts in the [`/examples` folder](/examples). diff --git a/vendor/phpdocumentor/reflection-docblock/composer.json b/vendor/phpdocumentor/reflection-docblock/composer.json deleted file mode 100644 index 7038f48..0000000 --- a/vendor/phpdocumentor/reflection-docblock/composer.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "phpdocumentor/reflection-docblock", - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1", - "phpdocumentor/reflection-common": "^2.2", - "ext-filter": "*" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "phpDocumentor\\Reflection\\": "tests/unit" - } - }, - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php deleted file mode 100644 index f3403d6..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php +++ /dev/null @@ -1,204 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -use phpDocumentor\Reflection\DocBlock\Tag; -use Webmozart\Assert\Assert; - -final class DocBlock -{ - /** @var string The opening line for this docblock. */ - private $summary; - - /** @var DocBlock\Description The actual description for this docblock. */ - private $description; - - /** @var Tag[] An array containing all the tags in this docblock; except inline. */ - private $tags = []; - - /** @var Types\Context|null Information about the context of this DocBlock. */ - private $context; - - /** @var Location|null Information about the location of this DocBlock. */ - private $location; - - /** @var bool Is this DocBlock (the start of) a template? */ - private $isTemplateStart; - - /** @var bool Does this DocBlock signify the end of a DocBlock template? */ - private $isTemplateEnd; - - /** - * @param DocBlock\Tag[] $tags - * @param Types\Context $context The context in which the DocBlock occurs. - * @param Location $location The location within the file that this DocBlock occurs in. - */ - public function __construct( - string $summary = '', - ?DocBlock\Description $description = null, - array $tags = [], - ?Types\Context $context = null, - ?Location $location = null, - bool $isTemplateStart = false, - bool $isTemplateEnd = false - ) { - Assert::allIsInstanceOf($tags, Tag::class); - - $this->summary = $summary; - $this->description = $description ?: new DocBlock\Description(''); - foreach ($tags as $tag) { - $this->addTag($tag); - } - - $this->context = $context; - $this->location = $location; - - $this->isTemplateEnd = $isTemplateEnd; - $this->isTemplateStart = $isTemplateStart; - } - - public function getSummary() : string - { - return $this->summary; - } - - public function getDescription() : DocBlock\Description - { - return $this->description; - } - - /** - * Returns the current context. - */ - public function getContext() : ?Types\Context - { - return $this->context; - } - - /** - * Returns the current location. - */ - public function getLocation() : ?Location - { - return $this->location; - } - - /** - * Returns whether this DocBlock is the start of a Template section. - * - * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker - * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. - * - * An example of such an opening is: - * - * ``` - * /**#@+ - * * My DocBlock - * * / - * ``` - * - * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all - * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). - * - * @see self::isTemplateEnd() for the check whether a closing marker was provided. - */ - public function isTemplateStart() : bool - { - return $this->isTemplateStart; - } - - /** - * Returns whether this DocBlock is the end of a Template section. - * - * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. - */ - public function isTemplateEnd() : bool - { - return $this->isTemplateEnd; - } - - /** - * Returns the tags for this DocBlock. - * - * @return Tag[] - */ - public function getTags() : array - { - return $this->tags; - } - - /** - * Returns an array of tags matching the given name. If no tags are found - * an empty array is returned. - * - * @param string $name String to search by. - * - * @return Tag[] - */ - public function getTagsByName(string $name) : array - { - $result = []; - - foreach ($this->getTags() as $tag) { - if ($tag->getName() !== $name) { - continue; - } - - $result[] = $tag; - } - - return $result; - } - - /** - * Checks if a tag of a certain type is present in this DocBlock. - * - * @param string $name Tag name to check for. - */ - public function hasTag(string $name) : bool - { - foreach ($this->getTags() as $tag) { - if ($tag->getName() === $name) { - return true; - } - } - - return false; - } - - /** - * Remove a tag from this DocBlock. - * - * @param Tag $tagToRemove The tag to remove. - */ - public function removeTag(Tag $tagToRemove) : void - { - foreach ($this->tags as $key => $tag) { - if ($tag === $tagToRemove) { - unset($this->tags[$key]); - break; - } - } - } - - /** - * Adds a tag to this DocBlock. - * - * @param Tag $tag The tag to add. - */ - private function addTag(Tag $tag) : void - { - $this->tags[] = $tag; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php deleted file mode 100644 index 7b11b80..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -use phpDocumentor\Reflection\DocBlock\Tags\Formatter; -use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter; -use function vsprintf; - -/** - * Object representing to description for a DocBlock. - * - * A Description object can consist of plain text but can also include tags. A Description Formatter can then combine - * a body template with sprintf-style placeholders together with formatted tags in order to reconstitute a complete - * description text using the format that you would prefer. - * - * Because parsing a Description text can be a verbose process this is handled by the {@see DescriptionFactory}. It is - * thus recommended to use that to create a Description object, like this: - * - * $description = $descriptionFactory->create('This is a {@see Description}', $context); - * - * The description factory will interpret the given body and create a body template and list of tags from them, and pass - * that onto the constructor if this class. - * - * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace - * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial - * > type names and FQSENs. - * - * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this: - * - * $description = new Description( - * 'This is a %1$s', - * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ] - * ); - * - * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object - * is mainly responsible for rendering. - * - * @see DescriptionFactory to create a new Description. - * @see Description\Formatter for the formatting of the body and tags. - */ -class Description -{ - /** @var string */ - private $bodyTemplate; - - /** @var Tag[] */ - private $tags; - - /** - * Initializes a Description with its body (template) and a listing of the tags used in the body template. - * - * @param Tag[] $tags - */ - public function __construct(string $bodyTemplate, array $tags = []) - { - $this->bodyTemplate = $bodyTemplate; - $this->tags = $tags; - } - - /** - * Returns the body template. - */ - public function getBodyTemplate() : string - { - return $this->bodyTemplate; - } - - /** - * Returns the tags for this DocBlock. - * - * @return Tag[] - */ - public function getTags() : array - { - return $this->tags; - } - - /** - * Renders this description as a string where the provided formatter will format the tags in the expected string - * format. - */ - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new PassthroughFormatter(); - } - - $tags = []; - foreach ($this->tags as $tag) { - $tags[] = '{' . $formatter->format($tag) . '}'; - } - - return vsprintf($this->bodyTemplate, $tags); - } - - /** - * Returns a plain string representation of this description. - */ - public function __toString() : string - { - return $this->render(); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php deleted file mode 100644 index 0501c3c..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php +++ /dev/null @@ -1,181 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function count; -use function explode; -use function implode; -use function ltrim; -use function min; -use function preg_split; -use function str_replace; -use function strlen; -use function strpos; -use function substr; -use function trim; -use const PREG_SPLIT_DELIM_CAPTURE; - -/** - * Creates a new Description object given a body of text. - * - * Descriptions in phpDocumentor are somewhat complex entities as they can contain one or more tags inside their - * body that can be replaced with a readable output. The replacing is done by passing a Formatter object to the - * Description object's `render` method. - * - * In addition to the above does a Description support two types of escape sequences: - * - * 1. `{@}` to escape the `@` character to prevent it from being interpreted as part of a tag, i.e. `{{@}link}` - * 2. `{}` to escape the `}` character, this can be used if you want to use the `}` character in the description - * of an inline tag. - * - * If a body consists of multiple lines then this factory will also remove any superfluous whitespace at the beginning - * of each line while maintaining any indentation that is used. This will prevent formatting parsers from tripping - * over unexpected spaces as can be observed with tag descriptions. - */ -class DescriptionFactory -{ - /** @var TagFactory */ - private $tagFactory; - - /** - * Initializes this factory with the means to construct (inline) tags. - */ - public function __construct(TagFactory $tagFactory) - { - $this->tagFactory = $tagFactory; - } - - /** - * Returns the parsed text of this description. - */ - public function create(string $contents, ?TypeContext $context = null) : Description - { - $tokens = $this->lex($contents); - $count = count($tokens); - $tagCount = 0; - $tags = []; - - for ($i = 1; $i < $count; $i += 2) { - $tags[] = $this->tagFactory->create($tokens[$i], $context); - $tokens[$i] = '%' . ++$tagCount . '$s'; - } - - //In order to allow "literal" inline tags, the otherwise invalid - //sequence "{@}" is changed to "@", and "{}" is changed to "}". - //"%" is escaped to "%%" because of vsprintf. - //See unit tests for examples. - for ($i = 0; $i < $count; $i += 2) { - $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); - } - - return new Description(implode('', $tokens), $tags); - } - - /** - * Strips the contents from superfluous whitespace and splits the description into a series of tokens. - * - * @return string[] A series of tokens of which the description text is composed. - */ - private function lex(string $contents) : array - { - $contents = $this->removeSuperfluousStartingWhitespace($contents); - - // performance optimalization; if there is no inline tag, don't bother splitting it up. - if (strpos($contents, '{@') === false) { - return [$contents]; - } - - $parts = preg_split( - '/\{ - # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. - (?!@\}) - # We want to capture the whole tag line, but without the inline tag delimiters. - (\@ - # Match everything up to the next delimiter. - [^{}]* - # Nested inline tag content should not be captured, or it will appear in the result separately. - (?: - # Match nested inline tags. - (?: - # Because we did not catch the tag delimiters earlier, we must be explicit with them here. - # Notice that this also matches "{}", as a way to later introduce it as an escape sequence. - \{(?1)?\} - | - # Make sure we match hanging "{". - \{ - ) - # Match content after the nested inline tag. - [^{}]* - )* # If there are more inline tags, match them as well. We use "*" since there may not be any - # nested inline tags. - ) - \}/Sux', - $contents, - 0, - PREG_SPLIT_DELIM_CAPTURE - ); - Assert::isArray($parts); - - return $parts; - } - - /** - * Removes the superfluous from a multi-line description. - * - * When a description has more than one line then it can happen that the second and subsequent lines have an - * additional indentation. This is commonly in use with tags like this: - * - * {@}since 1.1.0 This is an example - * description where we have an - * indentation in the second and - * subsequent lines. - * - * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent - * lines and this may cause rendering issues when, for example, using a Markdown converter. - */ - private function removeSuperfluousStartingWhitespace(string $contents) : string - { - $lines = explode("\n", $contents); - - // if there is only one line then we don't have lines with superfluous whitespace and - // can use the contents as-is - if (count($lines) <= 1) { - return $contents; - } - - // determine how many whitespace characters need to be stripped - $startingSpaceCount = 9999999; - for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { - // lines with a no length do not count as they are not indented at all - if (trim($lines[$i]) === '') { - continue; - } - - // determine the number of prefixing spaces by checking the difference in line length before and after - // an ltrim - $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i]))); - } - - // strip the number of spaces from each line - if ($startingSpaceCount > 0) { - for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { - $lines[$i] = substr($lines[$i], $startingSpaceCount); - } - } - - return implode("\n", $lines); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php deleted file mode 100644 index 7249efb..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php +++ /dev/null @@ -1,157 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -use phpDocumentor\Reflection\DocBlock\Tags\Example; -use function array_slice; -use function file; -use function getcwd; -use function implode; -use function is_readable; -use function rtrim; -use function sprintf; -use function trim; -use const DIRECTORY_SEPARATOR; - -/** - * Class used to find an example file's location based on a given ExampleDescriptor. - */ -class ExampleFinder -{ - /** @var string */ - private $sourceDirectory = ''; - - /** @var string[] */ - private $exampleDirectories = []; - - /** - * Attempts to find the example contents for the given descriptor. - */ - public function find(Example $example) : string - { - $filename = $example->getFilePath(); - - $file = $this->getExampleFileContents($filename); - if (!$file) { - return sprintf('** File not found : %s **', $filename); - } - - return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); - } - - /** - * Registers the project's root directory where an 'examples' folder can be expected. - */ - public function setSourceDirectory(string $directory = '') : void - { - $this->sourceDirectory = $directory; - } - - /** - * Returns the project's root directory where an 'examples' folder can be expected. - */ - public function getSourceDirectory() : string - { - return $this->sourceDirectory; - } - - /** - * Registers a series of directories that may contain examples. - * - * @param string[] $directories - */ - public function setExampleDirectories(array $directories) : void - { - $this->exampleDirectories = $directories; - } - - /** - * Returns a series of directories that may contain examples. - * - * @return string[] - */ - public function getExampleDirectories() : array - { - return $this->exampleDirectories; - } - - /** - * Attempts to find the requested example file and returns its contents or null if no file was found. - * - * This method will try several methods in search of the given example file, the first one it encounters is - * returned: - * - * 1. Iterates through all examples folders for the given filename - * 2. Checks the source folder for the given filename - * 3. Checks the 'examples' folder in the current working directory for examples - * 4. Checks the path relative to the current working directory for the given filename - * - * @return string[] all lines of the example file - */ - private function getExampleFileContents(string $filename) : ?array - { - $normalizedPath = null; - - foreach ($this->exampleDirectories as $directory) { - $exampleFileFromConfig = $this->constructExamplePath($directory, $filename); - if (is_readable($exampleFileFromConfig)) { - $normalizedPath = $exampleFileFromConfig; - break; - } - } - - if (!$normalizedPath) { - if (is_readable($this->getExamplePathFromSource($filename))) { - $normalizedPath = $this->getExamplePathFromSource($filename); - } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) { - $normalizedPath = $this->getExamplePathFromExampleDirectory($filename); - } elseif (is_readable($filename)) { - $normalizedPath = $filename; - } - } - - $lines = $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : false; - - return $lines !== false ? $lines : null; - } - - /** - * Get example filepath based on the example directory inside your project. - */ - private function getExamplePathFromExampleDirectory(string $file) : string - { - return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; - } - - /** - * Returns a path to the example file in the given directory.. - */ - private function constructExamplePath(string $directory, string $file) : string - { - return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; - } - - /** - * Get example filepath based on sourcecode. - */ - private function getExamplePathFromSource(string $file) : string - { - return sprintf( - '%s%s%s', - trim($this->getSourceDirectory(), '\\/'), - DIRECTORY_SEPARATOR, - trim($file, '"') - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php deleted file mode 100644 index 531970b..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php +++ /dev/null @@ -1,151 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -use phpDocumentor\Reflection\DocBlock; -use phpDocumentor\Reflection\DocBlock\Tags\Formatter; -use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter; -use function sprintf; -use function str_repeat; -use function str_replace; -use function strlen; -use function wordwrap; - -/** - * Converts a DocBlock back from an object to a complete DocComment including Asterisks. - */ -class Serializer -{ - /** @var string The string to indent the comment with. */ - protected $indentString = ' '; - - /** @var int The number of times the indent string is repeated. */ - protected $indent = 0; - - /** @var bool Whether to indent the first line with the given indent amount and string. */ - protected $isFirstLineIndented = true; - - /** @var int|null The max length of a line. */ - protected $lineLength; - - /** @var Formatter A custom tag formatter. */ - protected $tagFormatter; - - /** - * Create a Serializer instance. - * - * @param int $indent The number of times the indent string is repeated. - * @param string $indentString The string to indent the comment with. - * @param bool $indentFirstLine Whether to indent the first line. - * @param int|null $lineLength The max length of a line or NULL to disable line wrapping. - * @param Formatter $tagFormatter A custom tag formatter, defaults to PassthroughFormatter. - */ - public function __construct( - int $indent = 0, - string $indentString = ' ', - bool $indentFirstLine = true, - ?int $lineLength = null, - ?Formatter $tagFormatter = null - ) { - $this->indent = $indent; - $this->indentString = $indentString; - $this->isFirstLineIndented = $indentFirstLine; - $this->lineLength = $lineLength; - $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); - } - - /** - * Generate a DocBlock comment. - * - * @param DocBlock $docblock The DocBlock to serialize. - * - * @return string The serialized doc block. - */ - public function getDocComment(DocBlock $docblock) : string - { - $indent = str_repeat($this->indentString, $this->indent); - $firstIndent = $this->isFirstLineIndented ? $indent : ''; - // 3 === strlen(' * ') - $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; - - $text = $this->removeTrailingSpaces( - $indent, - $this->addAsterisksForEachLine( - $indent, - $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength) - ) - ); - - $comment = $firstIndent . "/**\n"; - if ($text) { - $comment .= $indent . ' * ' . $text . "\n"; - $comment .= $indent . " *\n"; - } - - $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); - - return $comment . $indent . ' */'; - } - - private function removeTrailingSpaces(string $indent, string $text) : string - { - return str_replace( - sprintf("\n%s * \n", $indent), - sprintf("\n%s *\n", $indent), - $text - ); - } - - private function addAsterisksForEachLine(string $indent, string $text) : string - { - return str_replace( - "\n", - sprintf("\n%s * ", $indent), - $text - ); - } - - private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength) : string - { - $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() - : ''); - if ($wrapLength !== null) { - $text = wordwrap($text, $wrapLength); - - return $text; - } - - return $text; - } - - private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment) : string - { - foreach ($docblock->getTags() as $tag) { - $tagText = $this->tagFormatter->format($tag); - if ($wrapLength !== null) { - $tagText = wordwrap($tagText, $wrapLength); - } - - $tagText = str_replace( - "\n", - sprintf("\n%s * ", $indent), - $tagText - ); - - $comment .= sprintf("%s * %s\n", $indent, $tagText); - } - - return $comment; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php deleted file mode 100644 index e64b587..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php +++ /dev/null @@ -1,347 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -use InvalidArgumentException; -use phpDocumentor\Reflection\DocBlock\Tags\Author; -use phpDocumentor\Reflection\DocBlock\Tags\Covers; -use phpDocumentor\Reflection\DocBlock\Tags\Deprecated; -use phpDocumentor\Reflection\DocBlock\Tags\Generic; -use phpDocumentor\Reflection\DocBlock\Tags\InvalidTag; -use phpDocumentor\Reflection\DocBlock\Tags\Link as LinkTag; -use phpDocumentor\Reflection\DocBlock\Tags\Method; -use phpDocumentor\Reflection\DocBlock\Tags\Param; -use phpDocumentor\Reflection\DocBlock\Tags\Property; -use phpDocumentor\Reflection\DocBlock\Tags\PropertyRead; -use phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite; -use phpDocumentor\Reflection\DocBlock\Tags\Return_; -use phpDocumentor\Reflection\DocBlock\Tags\See as SeeTag; -use phpDocumentor\Reflection\DocBlock\Tags\Since; -use phpDocumentor\Reflection\DocBlock\Tags\Source; -use phpDocumentor\Reflection\DocBlock\Tags\Throws; -use phpDocumentor\Reflection\DocBlock\Tags\Uses; -use phpDocumentor\Reflection\DocBlock\Tags\Var_; -use phpDocumentor\Reflection\DocBlock\Tags\Version; -use phpDocumentor\Reflection\FqsenResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use ReflectionMethod; -use ReflectionNamedType; -use ReflectionParameter; -use Webmozart\Assert\Assert; -use function array_merge; -use function array_slice; -use function call_user_func_array; -use function count; -use function get_class; -use function preg_match; -use function strpos; -use function trim; - -/** - * Creates a Tag object given the contents of a tag. - * - * This Factory is capable of determining the appropriate class for a tag and instantiate it using its `create` - * factory method. The `create` factory method of a Tag can have a variable number of arguments; this way you can - * pass the dependencies that you need to construct a tag object. - * - * > Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise - * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to - * > verify that a dependency is actually passed. - * - * This Factory also features a Service Locator component that is used to pass the right dependencies to the - * `create` method of a tag; each dependency should be registered as a service or as a parameter. - * - * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass - * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. - */ -final class StandardTagFactory implements TagFactory -{ - /** PCRE regular expression matching a tag name. */ - public const REGEX_TAGNAME = '[\w\-\_\\\\:]+'; - - /** - * @var array<class-string<Tag>> An array with a tag as a key, and an - * FQCN to a class that handles it as an array value. - */ - private $tagHandlerMappings = [ - 'author' => Author::class, - 'covers' => Covers::class, - 'deprecated' => Deprecated::class, - // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', - 'link' => LinkTag::class, - 'method' => Method::class, - 'param' => Param::class, - 'property-read' => PropertyRead::class, - 'property' => Property::class, - 'property-write' => PropertyWrite::class, - 'return' => Return_::class, - 'see' => SeeTag::class, - 'since' => Since::class, - 'source' => Source::class, - 'throw' => Throws::class, - 'throws' => Throws::class, - 'uses' => Uses::class, - 'var' => Var_::class, - 'version' => Version::class, - ]; - - /** - * @var array<class-string<Tag>> An array with a anotation s a key, and an - * FQCN to a class that handles it as an array value. - */ - private $annotationMappings = []; - - /** - * @var ReflectionParameter[][] a lazy-loading cache containing parameters - * for each tagHandler that has been used. - */ - private $tagHandlerParameterCache = []; - - /** @var FqsenResolver */ - private $fqsenResolver; - - /** - * @var mixed[] an array representing a simple Service Locator where we can store parameters and - * services that can be inserted into the Factory Methods of Tag Handlers. - */ - private $serviceLocator = []; - - /** - * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. - * - * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property - * is used. - * - * @see self::registerTagHandler() to add a new tag handler to the existing default list. - * - * @param array<class-string<Tag>> $tagHandlers - */ - public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) - { - $this->fqsenResolver = $fqsenResolver; - if ($tagHandlers !== null) { - $this->tagHandlerMappings = $tagHandlers; - } - - $this->addService($fqsenResolver, FqsenResolver::class); - } - - public function create(string $tagLine, ?TypeContext $context = null) : Tag - { - if (!$context) { - $context = new TypeContext(''); - } - - [$tagName, $tagBody] = $this->extractTagParts($tagLine); - - return $this->createTag(trim($tagBody), $tagName, $context); - } - - /** - * @param mixed $value - */ - public function addParameter(string $name, $value) : void - { - $this->serviceLocator[$name] = $value; - } - - public function addService(object $service, ?string $alias = null) : void - { - $this->serviceLocator[$alias ?: get_class($service)] = $service; - } - - public function registerTagHandler(string $tagName, string $handler) : void - { - Assert::stringNotEmpty($tagName); - Assert::classExists($handler); - Assert::implementsInterface($handler, Tag::class); - - if (strpos($tagName, '\\') && $tagName[0] !== '\\') { - throw new InvalidArgumentException( - 'A namespaced tag must have a leading backslash as it must be fully qualified' - ); - } - - $this->tagHandlerMappings[$tagName] = $handler; - } - - /** - * Extracts all components for a tag. - * - * @return string[] - */ - private function extractTagParts(string $tagLine) : array - { - $matches = []; - if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\s\(\{])\s*([^\s].*)|$)/us', $tagLine, $matches)) { - throw new InvalidArgumentException( - 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors' - ); - } - - if (count($matches) < 3) { - $matches[] = ''; - } - - return array_slice($matches, 1); - } - - /** - * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the - * body was invalid. - */ - private function createTag(string $body, string $name, TypeContext $context) : Tag - { - $handlerClassName = $this->findHandlerClassName($name, $context); - $arguments = $this->getArgumentsForParametersFromWiring( - $this->fetchParametersForHandlerFactoryMethod($handlerClassName), - $this->getServiceLocatorWithDynamicParameters($context, $name, $body) - ); - - try { - $callable = [$handlerClassName, 'create']; - Assert::isCallable($callable); - /** @phpstan-var callable(string): ?Tag $callable */ - $tag = call_user_func_array($callable, $arguments); - - return $tag ?? InvalidTag::create($body, $name); - } catch (InvalidArgumentException $e) { - return InvalidTag::create($body, $name)->withError($e); - } - } - - /** - * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). - * - * @return class-string<Tag> - */ - private function findHandlerClassName(string $tagName, TypeContext $context) : string - { - $handlerClassName = Generic::class; - if (isset($this->tagHandlerMappings[$tagName])) { - $handlerClassName = $this->tagHandlerMappings[$tagName]; - } elseif ($this->isAnnotation($tagName)) { - // TODO: Annotation support is planned for a later stage and as such is disabled for now - $tagName = (string) $this->fqsenResolver->resolve($tagName, $context); - if (isset($this->annotationMappings[$tagName])) { - $handlerClassName = $this->annotationMappings[$tagName]; - } - } - - return $handlerClassName; - } - - /** - * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. - * - * @param ReflectionParameter[] $parameters - * @param mixed[] $locator - * - * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters - * is provided with this method. - */ - private function getArgumentsForParametersFromWiring(array $parameters, array $locator) : array - { - $arguments = []; - foreach ($parameters as $parameter) { - $type = $parameter->getType(); - $typeHint = null; - if ($type instanceof ReflectionNamedType) { - $typeHint = $type->getName(); - if ($typeHint === 'self') { - $declaringClass = $parameter->getDeclaringClass(); - if ($declaringClass !== null) { - $typeHint = $declaringClass->getName(); - } - } - } - - if (isset($locator[$typeHint])) { - $arguments[] = $locator[$typeHint]; - continue; - } - - $parameterName = $parameter->getName(); - if (isset($locator[$parameterName])) { - $arguments[] = $locator[$parameterName]; - continue; - } - - $arguments[] = null; - } - - return $arguments; - } - - /** - * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given - * tag handler class name. - * - * @param class-string $handlerClassName - * - * @return ReflectionParameter[] - */ - private function fetchParametersForHandlerFactoryMethod(string $handlerClassName) : array - { - if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { - $methodReflection = new ReflectionMethod($handlerClassName, 'create'); - $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); - } - - return $this->tagHandlerParameterCache[$handlerClassName]; - } - - /** - * Returns a copy of this class' Service Locator with added dynamic parameters, - * such as the tag's name, body and Context. - * - * @param TypeContext $context The Context (namespace and aliasses) that may be - * passed and is used to resolve FQSENs. - * @param string $tagName The name of the tag that may be - * passed onto the factory method of the Tag class. - * @param string $tagBody The body of the tag that may be - * passed onto the factory method of the Tag class. - * - * @return mixed[] - */ - private function getServiceLocatorWithDynamicParameters( - TypeContext $context, - string $tagName, - string $tagBody - ) : array { - return array_merge( - $this->serviceLocator, - [ - 'name' => $tagName, - 'body' => $tagBody, - TypeContext::class => $context, - ] - ); - } - - /** - * Returns whether the given tag belongs to an annotation. - * - * @todo this method should be populated once we implement Annotation notation support. - */ - private function isAnnotation(string $tagContent) : bool - { - // 1. Contains a namespace separator - // 2. Contains parenthesis - // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part - // of the annotation class name matches the found tag name - - return false; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php deleted file mode 100644 index f55de91..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -use phpDocumentor\Reflection\DocBlock\Tags\Formatter; - -interface Tag -{ - public function getName() : string; - - /** - * @return Tag|mixed Class that implements Tag - * - * @phpstan-return ?Tag - */ - public static function create(string $body); - - public function render(?Formatter $formatter = null) : string; - - public function __toString() : string; -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php deleted file mode 100644 index 0d318d1..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -use InvalidArgumentException; -use phpDocumentor\Reflection\Types\Context as TypeContext; - -interface TagFactory -{ - /** - * Adds a parameter to the service locator that can be injected in a tag's factory method. - * - * When calling a tag's "create" method we always check the signature for dependencies to inject. One way is to - * typehint a parameter in the signature so that we can use that interface or class name to inject a dependency - * (see {@see addService()} for more information on that). - * - * Another way is to check the name of the argument against the names in the Service Locator. With this method - * you can add a variable that will be inserted when a tag's create method is not typehinted and has a matching - * name. - * - * Be aware that there are two reserved names: - * - * - name, representing the name of the tag. - * - body, representing the complete body of the tag. - * - * These parameters are injected at the last moment and will override any existing parameter with those names. - * - * @param mixed $value - */ - public function addParameter(string $name, $value) : void; - - /** - * Factory method responsible for instantiating the correct sub type. - * - * @param string $tagLine The text for this tag, including description. - * - * @return Tag A new tag object. - * - * @throws InvalidArgumentException If an invalid tag line was presented. - */ - public function create(string $tagLine, ?TypeContext $context = null) : Tag; - - /** - * Registers a service with the Service Locator using the FQCN of the class or the alias, if provided. - * - * When calling a tag's "create" method we always check the signature for dependencies to inject. If a parameter - * has a typehint then the ServiceLocator is queried to see if a Service is registered for that typehint. - * - * Because interfaces are regularly used as type-hints this method provides an alias parameter; if the FQCN of the - * interface is passed as alias then every time that interface is requested the provided service will be returned. - */ - public function addService(object $service) : void; - - /** - * Registers a handler for tags. - * - * If you want to use your own tags then you can use this method to instruct the TagFactory - * to register the name of a tag with the FQCN of a 'Tag Handler'. The Tag handler should implement - * the {@see Tag} interface (and thus the create method). - * - * @param string $tagName Name of tag to register a handler for. When registering a namespaced - * tag, the full name, along with a prefixing slash MUST be provided. - * @param class-string<Tag> $handler FQCN of handler. - * - * @throws InvalidArgumentException If the tag name is not a string. - * @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but - * does not start with a backslash. - * @throws InvalidArgumentException If the handler is not a string. - * @throws InvalidArgumentException If the handler is not an existing class. - * @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. - */ - public function registerTagHandler(string $tagName, string $handler) : void; -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php deleted file mode 100644 index f3c49ad..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use InvalidArgumentException; -use function filter_var; -use function preg_match; -use function trim; -use const FILTER_VALIDATE_EMAIL; - -/** - * Reflection class for an {@}author tag in a Docblock. - */ -final class Author extends BaseTag implements Factory\StaticMethod -{ - /** @var string register that this is the author tag. */ - protected $name = 'author'; - - /** @var string The name of the author */ - private $authorName; - - /** @var string The email of the author */ - private $authorEmail; - - /** - * Initializes this tag with the author name and e-mail. - */ - public function __construct(string $authorName, string $authorEmail) - { - if ($authorEmail && !filter_var($authorEmail, FILTER_VALIDATE_EMAIL)) { - throw new InvalidArgumentException('The author tag does not have a valid e-mail address'); - } - - $this->authorName = $authorName; - $this->authorEmail = $authorEmail; - } - - /** - * Gets the author's name. - * - * @return string The author's name. - */ - public function getAuthorName() : string - { - return $this->authorName; - } - - /** - * Returns the author's email. - * - * @return string The author's email. - */ - public function getEmail() : string - { - return $this->authorEmail; - } - - /** - * Returns this tag in string form. - */ - public function __toString() : string - { - return $this->authorName . ($this->authorEmail !== '' ? ' <' . $this->authorEmail . '>' : ''); - } - - /** - * Attempts to create a new Author object based on †he tag body. - */ - public static function create(string $body) : ?self - { - $splitTagContent = preg_match('/^([^\<]*)(?:\<([^\>]*)\>)?$/u', $body, $matches); - if (!$splitTagContent) { - return null; - } - - $authorName = trim($matches[1]); - $email = isset($matches[2]) ? trim($matches[2]) : ''; - - return new static($authorName, $email); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php deleted file mode 100644 index fbcd402..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock; -use phpDocumentor\Reflection\DocBlock\Description; - -/** - * Parses a tag definition for a DocBlock. - */ -abstract class BaseTag implements DocBlock\Tag -{ - /** @var string Name of the tag */ - protected $name = ''; - - /** @var Description|null Description of the tag. */ - protected $description; - - /** - * Gets the name of this tag. - * - * @return string The name of this tag. - */ - public function getName() : string - { - return $this->name; - } - - public function getDescription() : ?Description - { - return $this->description; - } - - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - - return $formatter->format($this); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php deleted file mode 100644 index 77edf4a..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Fqsen; -use phpDocumentor\Reflection\FqsenResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function preg_split; - -/** - * Reflection class for a @covers tag in a Docblock. - */ -final class Covers extends BaseTag implements Factory\StaticMethod -{ - /** @var string */ - protected $name = 'covers'; - - /** @var Fqsen */ - private $refers; - - /** - * Initializes this tag. - */ - public function __construct(Fqsen $refers, ?Description $description = null) - { - $this->refers = $refers; - $this->description = $description; - } - - public static function create( - string $body, - ?DescriptionFactory $descriptionFactory = null, - ?FqsenResolver $resolver = null, - ?TypeContext $context = null - ) : self { - Assert::notEmpty($body); - Assert::notNull($descriptionFactory); - Assert::notNull($resolver); - - $parts = preg_split('/\s+/Su', $body, 2); - Assert::isArray($parts); - - return new static( - $resolver->resolve($parts[0], $context), - $descriptionFactory->create($parts[1] ?? '', $context) - ); - } - - /** - * Returns the structural element this tag refers to. - */ - public function getReference() : Fqsen - { - return $this->refers; - } - - /** - * Returns a string representation of this tag. - */ - public function __toString() : string - { - return $this->refers . ($this->description ? ' ' . $this->description->render() : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php deleted file mode 100644 index 9b05d22..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php +++ /dev/null @@ -1,100 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function preg_match; - -/** - * Reflection class for a {@}deprecated tag in a Docblock. - */ -final class Deprecated extends BaseTag implements Factory\StaticMethod -{ - /** @var string */ - protected $name = 'deprecated'; - - /** - * PCRE regular expression matching a version vector. - * Assumes the "x" modifier. - */ - public const REGEX_VECTOR = '(?: - # Normal release vectors. - \d\S* - | - # VCS version vectors. Per PHPCS, they are expected to - # follow the form of the VCS name, followed by ":", followed - # by the version vector itself. - # By convention, popular VCSes like CVS, SVN and GIT use "$" - # around the actual version vector. - [^\s\:]+\:\s*\$[^\$]+\$ - )'; - - /** @var string|null The version vector. */ - private $version; - - public function __construct(?string $version = null, ?Description $description = null) - { - Assert::nullOrNotEmpty($version); - - $this->version = $version; - $this->description = $description; - } - - /** - * @return static - */ - public static function create( - ?string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - if (empty($body)) { - return new static(); - } - - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { - return new static( - null, - $descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null - ); - } - - Assert::notNull($descriptionFactory); - - return new static( - $matches[1], - $descriptionFactory->create($matches[2] ?? '', $context) - ); - } - - /** - * Gets the version section of the tag. - */ - public function getVersion() : ?string - { - return $this->version; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - return ($this->version ?? '') . ($this->description ? ' ' . $this->description->render() : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php deleted file mode 100644 index 8ccb4fd..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php +++ /dev/null @@ -1,179 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Tag; -use Webmozart\Assert\Assert; -use function array_key_exists; -use function preg_match; -use function rawurlencode; -use function str_replace; -use function strpos; -use function trim; - -/** - * Reflection class for a {@}example tag in a Docblock. - */ -final class Example implements Tag, Factory\StaticMethod -{ - /** @var string Path to a file to use as an example. May also be an absolute URI. */ - private $filePath; - - /** - * @var bool Whether the file path component represents an URI. This determines how the file portion - * appears at {@link getContent()}. - */ - private $isURI; - - /** @var int */ - private $startingLine; - - /** @var int */ - private $lineCount; - - /** @var string|null */ - private $content; - - public function __construct(string $filePath, bool $isURI, int $startingLine, int $lineCount, ?string $content) - { - Assert::notEmpty($filePath); - Assert::greaterThanEq($startingLine, 0); - Assert::greaterThanEq($lineCount, 0); - - $this->filePath = $filePath; - $this->startingLine = $startingLine; - $this->lineCount = $lineCount; - if ($content !== null) { - $this->content = trim($content); - } - - $this->isURI = $isURI; - } - - public function getContent() : string - { - if ($this->content === null) { - $filePath = '"' . $this->filePath . '"'; - if ($this->isURI) { - $filePath = $this->isUriRelative($this->filePath) - ? str_replace('%2F', '/', rawurlencode($this->filePath)) - : $this->filePath; - } - - return trim($filePath); - } - - return $this->content; - } - - public function getDescription() : ?string - { - return $this->content; - } - - public static function create(string $body) : ?Tag - { - // File component: File path in quotes or File URI / Source information - if (!preg_match('/^(?:\"([^\"]+)\"|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) { - return null; - } - - $filePath = null; - $fileUri = null; - if ($matches[1] !== '') { - $filePath = $matches[1]; - } else { - $fileUri = $matches[2]; - } - - $startingLine = 1; - $lineCount = 0; - $description = null; - - if (array_key_exists(3, $matches)) { - $description = $matches[3]; - - // Starting line / Number of lines / Description - if (preg_match('/^([1-9]\d*)(?:\s+((?1))\s*)?(.*)$/sux', $matches[3], $contentMatches)) { - $startingLine = (int) $contentMatches[1]; - if (isset($contentMatches[2]) && $contentMatches[2] !== '') { - $lineCount = (int) $contentMatches[2]; - } - - if (array_key_exists(3, $contentMatches)) { - $description = $contentMatches[3]; - } - } - } - - return new static( - $filePath ?? ($fileUri ?? ''), - $fileUri !== null, - $startingLine, - $lineCount, - $description - ); - } - - /** - * Returns the file path. - * - * @return string Path to a file to use as an example. - * May also be an absolute URI. - */ - public function getFilePath() : string - { - return $this->filePath; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - return $this->filePath . ($this->content ? ' ' . $this->content : ''); - } - - /** - * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). - */ - private function isUriRelative(string $uri) : bool - { - return strpos($uri, ':') === false; - } - - public function getStartingLine() : int - { - return $this->startingLine; - } - - public function getLineCount() : int - { - return $this->lineCount; - } - - public function getName() : string - { - return 'example'; - } - - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - - return $formatter->format($this); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php deleted file mode 100644 index f6f0bb5..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags\Factory; - -/** - * @deprecated This contract is totally covered by Tag contract. Every class using StaticMethod also use Tag - */ -interface StaticMethod -{ - /** - * @return mixed - */ - public static function create(string $body); -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php deleted file mode 100644 index 92fb9e6..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Tag; - -interface Formatter -{ - /** - * Formats a tag into a string representation according to a specific format, such as Markdown. - */ - public function format(Tag $tag) : string; -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php deleted file mode 100644 index b1a406c..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags\Formatter; - -use phpDocumentor\Reflection\DocBlock\Tag; -use phpDocumentor\Reflection\DocBlock\Tags\Formatter; -use function max; -use function str_repeat; -use function strlen; - -class AlignFormatter implements Formatter -{ - /** @var int The maximum tag name length. */ - protected $maxLen = 0; - - /** - * @param Tag[] $tags All tags that should later be aligned with the formatter. - */ - public function __construct(array $tags) - { - foreach ($tags as $tag) { - $this->maxLen = max($this->maxLen, strlen($tag->getName())); - } - } - - /** - * Formats the given tag to return a simple plain text version. - */ - public function format(Tag $tag) : string - { - return '@' . $tag->getName() . - str_repeat( - ' ', - $this->maxLen - strlen($tag->getName()) + 1 - ) . - $tag; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php deleted file mode 100644 index f26d22f..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags\Formatter; - -use phpDocumentor\Reflection\DocBlock\Tag; -use phpDocumentor\Reflection\DocBlock\Tags\Formatter; -use function trim; - -class PassthroughFormatter implements Formatter -{ - /** - * Formats the given tag to return a simple plain text version. - */ - public function format(Tag $tag) : string - { - return trim('@' . $tag->getName() . ' ' . $tag); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php deleted file mode 100644 index 7509ff1..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php +++ /dev/null @@ -1,82 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use InvalidArgumentException; -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\DocBlock\StandardTagFactory; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function preg_match; - -/** - * Parses a tag definition for a DocBlock. - */ -final class Generic extends BaseTag implements Factory\StaticMethod -{ - /** - * Parses a tag and populates the member variables. - * - * @param string $name Name of the tag. - * @param Description $description The contents of the given tag. - */ - public function __construct(string $name, ?Description $description = null) - { - $this->validateTagName($name); - - $this->name = $name; - $this->description = $description; - } - - /** - * Creates a new tag that represents any unknown tag type. - * - * @return static - */ - public static function create( - string $body, - string $name = '', - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($name); - Assert::notNull($descriptionFactory); - - $description = $body !== '' ? $descriptionFactory->create($body, $context) : null; - - return new static($name, $description); - } - - /** - * Returns the tag as a serialized string - */ - public function __toString() : string - { - return $this->description ? $this->description->render() : ''; - } - - /** - * Validates if the tag name matches the expected format, otherwise throws an exception. - */ - private function validateTagName(string $name) : void - { - if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { - throw new InvalidArgumentException( - 'The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' - . 'hyphens and backslashes.' - ); - } - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php deleted file mode 100644 index 9f632cb..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php +++ /dev/null @@ -1,133 +0,0 @@ -<?php - -declare(strict_types=1); - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use Closure; -use Exception; -use phpDocumentor\Reflection\DocBlock\Tag; -use ReflectionClass; -use ReflectionFunction; -use Throwable; -use function array_map; -use function array_walk_recursive; -use function get_class; -use function get_resource_type; -use function is_object; -use function is_resource; -use function sprintf; - -/** - * This class represents an exception during the tag creation - * - * Since the internals of the library are relaying on the correct syntax of a docblock - * we cannot simply throw exceptions at all time because the exceptions will break the creation of a - * docklock. Just silently ignore the exceptions is not an option because the user as an issue to fix. - * - * This tag holds that error information until a using application is able to display it. The object wil just behave - * like any normal tag. So the normal application flow will not break. - */ -final class InvalidTag implements Tag -{ - /** @var string */ - private $name; - - /** @var string */ - private $body; - - /** @var Throwable|null */ - private $throwable; - - private function __construct(string $name, string $body) - { - $this->name = $name; - $this->body = $body; - } - - public function getException() : ?Throwable - { - return $this->throwable; - } - - public function getName() : string - { - return $this->name; - } - - public static function create(string $body, string $name = '') : self - { - return new self($name, $body); - } - - public function withError(Throwable $exception) : self - { - $this->flattenExceptionBacktrace($exception); - $tag = new self($this->name, $this->body); - $tag->throwable = $exception; - - return $tag; - } - - /** - * Removes all complex types from backtrace - * - * Not all objects are serializable. So we need to remove them from the - * stored exception to be sure that we do not break existing library usage. - */ - private function flattenExceptionBacktrace(Throwable $exception) : void - { - $traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); - $traceProperty->setAccessible(true); - - $flatten = - /** @param mixed $value */ - static function (&$value) : void { - if ($value instanceof Closure) { - $closureReflection = new ReflectionFunction($value); - $value = sprintf( - '(Closure at %s:%s)', - $closureReflection->getFileName(), - $closureReflection->getStartLine() - ); - } elseif (is_object($value)) { - $value = sprintf('object(%s)', get_class($value)); - } elseif (is_resource($value)) { - $value = sprintf('resource(%s)', get_resource_type($value)); - } - }; - - do { - $trace = $exception->getTrace(); - if (isset($trace[0]['args'])) { - $trace = array_map( - static function (array $call) use ($flatten) : array { - array_walk_recursive($call['args'], $flatten); - - return $call; - }, - $trace - ); - } - - $traceProperty->setValue($exception, $trace); - $exception = $exception->getPrevious(); - } while ($exception !== null); - - $traceProperty->setAccessible(false); - } - - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - - return $formatter->format($this); - } - - public function __toString() : string - { - return $this->body; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php deleted file mode 100644 index 0588f72..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function preg_split; - -/** - * Reflection class for a @link tag in a Docblock. - */ -final class Link extends BaseTag implements Factory\StaticMethod -{ - /** @var string */ - protected $name = 'link'; - - /** @var string */ - private $link; - - /** - * Initializes a link to a URL. - */ - public function __construct(string $link, ?Description $description = null) - { - $this->link = $link; - $this->description = $description; - } - - public static function create( - string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::notNull($descriptionFactory); - - $parts = preg_split('/\s+/Su', $body, 2); - Assert::isArray($parts); - $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; - - return new static($parts[0], $description); - } - - /** - * Gets the link - */ - public function getLink() : string - { - return $this->link; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - return $this->link . ($this->description ? ' ' . $this->description->render() : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php deleted file mode 100644 index 834f1bd..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php +++ /dev/null @@ -1,265 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use InvalidArgumentException; -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Type; -use phpDocumentor\Reflection\TypeResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use phpDocumentor\Reflection\Types\Mixed_; -use phpDocumentor\Reflection\Types\Void_; -use Webmozart\Assert\Assert; -use function array_keys; -use function explode; -use function implode; -use function is_string; -use function preg_match; -use function sort; -use function strpos; -use function substr; -use function trim; -use function var_export; - -/** - * Reflection class for an {@}method in a Docblock. - */ -final class Method extends BaseTag implements Factory\StaticMethod -{ - /** @var string */ - protected $name = 'method'; - - /** @var string */ - private $methodName; - - /** - * @phpstan-var array<int, array{name: string, type: Type}> - * @var array<int, array<string, Type|string>> - */ - private $arguments; - - /** @var bool */ - private $isStatic; - - /** @var Type */ - private $returnType; - - /** - * @param array<int, array<string, Type|string>> $arguments - * - * @phpstan-param array<int, array{name: string, type: Type}|string> $arguments - */ - public function __construct( - string $methodName, - array $arguments = [], - ?Type $returnType = null, - bool $static = false, - ?Description $description = null - ) { - Assert::stringNotEmpty($methodName); - - if ($returnType === null) { - $returnType = new Void_(); - } - - $this->methodName = $methodName; - $this->arguments = $this->filterArguments($arguments); - $this->returnType = $returnType; - $this->isStatic = $static; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : ?self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - // 1. none or more whitespace - // 2. optionally the keyword "static" followed by whitespace - // 3. optionally a word with underscores followed by whitespace : as - // type for the return value - // 4. then optionally a word with underscores followed by () and - // whitespace : as method name as used by phpDocumentor - // 5. then a word with underscores, followed by ( and any character - // until a ) and whitespace : as method name with signature - // 6. any remaining text : as description - if (!preg_match( - '/^ - # Static keyword - # Declares a static method ONLY if type is also present - (?: - (static) - \s+ - )? - # Return type - (?: - ( - (?:[\w\|_\\\\]*\$this[\w\|_\\\\]*) - | - (?: - (?:[\w\|_\\\\]+) - # array notation - (?:\[\])* - )*+ - ) - \s+ - )? - # Method name - ([\w_]+) - # Arguments - (?: - \(([^\)]*)\) - )? - \s* - # Description - (.*) - $/sux', - $body, - $matches - )) { - return null; - } - - [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; - - $static = $static === 'static'; - - if ($returnType === '') { - $returnType = 'void'; - } - - $returnType = $typeResolver->resolve($returnType, $context); - $description = $descriptionFactory->create($description, $context); - - /** @phpstan-var array<int, array{name: string, type: Type}> $arguments */ - $arguments = []; - if ($argumentLines !== '') { - $argumentsExploded = explode(',', $argumentLines); - foreach ($argumentsExploded as $argument) { - $argument = explode(' ', self::stripRestArg(trim($argument)), 2); - if (strpos($argument[0], '$') === 0) { - $argumentName = substr($argument[0], 1); - $argumentType = new Mixed_(); - } else { - $argumentType = $typeResolver->resolve($argument[0], $context); - $argumentName = ''; - if (isset($argument[1])) { - $argument[1] = self::stripRestArg($argument[1]); - $argumentName = substr($argument[1], 1); - } - } - - $arguments[] = ['name' => $argumentName, 'type' => $argumentType]; - } - } - - return new static($methodName, $arguments, $returnType, $static, $description); - } - - /** - * Retrieves the method name. - */ - public function getMethodName() : string - { - return $this->methodName; - } - - /** - * @return array<int, array<string, Type|string>> - * - * @phpstan-return array<int, array{name: string, type: Type}> - */ - public function getArguments() : array - { - return $this->arguments; - } - - /** - * Checks whether the method tag describes a static method or not. - * - * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. - */ - public function isStatic() : bool - { - return $this->isStatic; - } - - public function getReturnType() : Type - { - return $this->returnType; - } - - public function __toString() : string - { - $arguments = []; - foreach ($this->arguments as $argument) { - $arguments[] = $argument['type'] . ' $' . $argument['name']; - } - - return trim(($this->isStatic() ? 'static ' : '') - . (string) $this->returnType . ' ' - . $this->methodName - . '(' . implode(', ', $arguments) . ')' - . ($this->description ? ' ' . $this->description->render() : '')); - } - - /** - * @param mixed[][]|string[] $arguments - * - * @return mixed[][] - * - * @phpstan-param array<int, array{name: string, type: Type}|string> $arguments - * @phpstan-return array<int, array{name: string, type: Type}> - */ - private function filterArguments(array $arguments = []) : array - { - $result = []; - foreach ($arguments as $argument) { - if (is_string($argument)) { - $argument = ['name' => $argument]; - } - - if (!isset($argument['type'])) { - $argument['type'] = new Mixed_(); - } - - $keys = array_keys($argument); - sort($keys); - if ($keys !== ['name', 'type']) { - throw new InvalidArgumentException( - 'Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, true) - ); - } - - $result[] = $argument; - } - - return $result; - } - - private static function stripRestArg(string $argument) : string - { - if (strpos($argument, '...') === 0) { - $argument = trim(substr($argument, 3)); - } - - return $argument; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php deleted file mode 100644 index 7f94361..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php +++ /dev/null @@ -1,128 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Type; -use phpDocumentor\Reflection\TypeResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function array_shift; -use function array_unshift; -use function implode; -use function preg_split; -use function strpos; -use function substr; -use const PREG_SPLIT_DELIM_CAPTURE; - -/** - * Reflection class for the {@}param tag in a Docblock. - */ -final class Param extends TagWithType implements Factory\StaticMethod -{ - /** @var string|null */ - private $variableName; - - /** @var bool determines whether this is a variadic argument */ - private $isVariadic; - - public function __construct( - ?string $variableName, - ?Type $type = null, - bool $isVariadic = false, - ?Description $description = null - ) { - $this->name = 'param'; - $this->variableName = $variableName; - $this->type = $type; - $this->isVariadic = $isVariadic; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - - $type = null; - $parts = preg_split('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - Assert::isArray($parts); - $variableName = ''; - $isVariadic = false; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) && (strpos($parts[0], '$') === 0 || strpos($parts[0], '...$') === 0)) { - $variableName = array_shift($parts); - array_shift($parts); - - Assert::notNull($variableName); - - if (strpos($variableName, '...') === 0) { - $isVariadic = true; - $variableName = substr($variableName, 3); - } - - if (strpos($variableName, '$') === 0) { - $variableName = substr($variableName, 1); - } - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $isVariadic, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - - /** - * Returns whether this tag is variadic. - */ - public function isVariadic() : bool - { - return $this->isVariadic; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - return ($this->type ? $this->type . ' ' : '') - . ($this->isVariadic() ? '...' : '') - . ($this->variableName !== null ? '$' . $this->variableName : '') - . ($this->description ? ' ' . $this->description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php deleted file mode 100644 index 0da0233..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php +++ /dev/null @@ -1,104 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Type; -use phpDocumentor\Reflection\TypeResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function array_shift; -use function array_unshift; -use function implode; -use function preg_split; -use function strpos; -use function substr; -use const PREG_SPLIT_DELIM_CAPTURE; - -/** - * Reflection class for a {@}property tag in a Docblock. - */ -final class Property extends TagWithType implements Factory\StaticMethod -{ - /** @var string|null */ - protected $variableName; - - public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) - { - Assert::string($variableName); - - $this->name = 'property'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = preg_split('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - Assert::isArray($parts); - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - array_shift($parts); - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - return ($this->type ? $this->type . ' ' : '') - . ($this->variableName ? '$' . $this->variableName : '') - . ($this->description ? ' ' . $this->description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php deleted file mode 100644 index af768fb..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php +++ /dev/null @@ -1,104 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Type; -use phpDocumentor\Reflection\TypeResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function array_shift; -use function array_unshift; -use function implode; -use function preg_split; -use function strpos; -use function substr; -use const PREG_SPLIT_DELIM_CAPTURE; - -/** - * Reflection class for a {@}property-read tag in a Docblock. - */ -final class PropertyRead extends TagWithType implements Factory\StaticMethod -{ - /** @var string|null */ - protected $variableName; - - public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) - { - Assert::string($variableName); - - $this->name = 'property-read'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = preg_split('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - Assert::isArray($parts); - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - array_shift($parts); - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - return ($this->type ? $this->type . ' ' : '') - . ($this->variableName ? '$' . $this->variableName : '') - . ($this->description ? ' ' . $this->description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php deleted file mode 100644 index 34cd75f..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php +++ /dev/null @@ -1,104 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Type; -use phpDocumentor\Reflection\TypeResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function array_shift; -use function array_unshift; -use function implode; -use function preg_split; -use function strpos; -use function substr; -use const PREG_SPLIT_DELIM_CAPTURE; - -/** - * Reflection class for a {@}property-write tag in a Docblock. - */ -final class PropertyWrite extends TagWithType implements Factory\StaticMethod -{ - /** @var string */ - protected $variableName; - - public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) - { - Assert::string($variableName); - - $this->name = 'property-write'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = preg_split('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - Assert::isArray($parts); - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - array_shift($parts); - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - return ($this->type ? $this->type . ' ' : '') - . ($this->variableName ? '$' . $this->variableName : '') - . ($this->description ? ' ' . $this->description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php deleted file mode 100644 index cede74c..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags\Reference; - -use phpDocumentor\Reflection\Fqsen as RealFqsen; - -/** - * Fqsen reference used by {@see \phpDocumentor\Reflection\DocBlock\Tags\See} - */ -final class Fqsen implements Reference -{ - /** @var RealFqsen */ - private $fqsen; - - public function __construct(RealFqsen $fqsen) - { - $this->fqsen = $fqsen; - } - - /** - * @return string string representation of the referenced fqsen - */ - public function __toString() : string - { - return (string) $this->fqsen; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php deleted file mode 100644 index 5eedcbc..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags\Reference; - -/** - * Interface for references in {@see \phpDocumentor\Reflection\DocBlock\Tags\See} - */ -interface Reference -{ - public function __toString() : string; -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php deleted file mode 100644 index 1b2374b..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags\Reference; - -use Webmozart\Assert\Assert; - -/** - * Url reference used by {@see \phpDocumentor\Reflection\DocBlock\Tags\See} - */ -final class Url implements Reference -{ - /** @var string */ - private $uri; - - public function __construct(string $uri) - { - Assert::stringNotEmpty($uri); - $this->uri = $uri; - } - - public function __toString() : string - { - return $this->uri; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php deleted file mode 100644 index 60ba860..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Type; -use phpDocumentor\Reflection\TypeResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; - -/** - * Reflection class for a {@}return tag in a Docblock. - */ -final class Return_ extends TagWithType implements Factory\StaticMethod -{ - public function __construct(Type $type, ?Description $description = null) - { - $this->name = 'return'; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$type, $description] = self::extractTypeFromBody($body); - - $type = $typeResolver->resolve($type, $context); - $description = $descriptionFactory->create($description, $context); - - return new static($type, $description); - } - - public function __toString() : string - { - return ($this->type ?: 'mixed') . ' ' . (string) $this->description; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php deleted file mode 100644 index 190973d..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\DocBlock\Tags\Reference\Fqsen as FqsenRef; -use phpDocumentor\Reflection\DocBlock\Tags\Reference\Reference; -use phpDocumentor\Reflection\DocBlock\Tags\Reference\Url; -use phpDocumentor\Reflection\FqsenResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function preg_match; -use function preg_split; - -/** - * Reflection class for an {@}see tag in a Docblock. - */ -final class See extends BaseTag implements Factory\StaticMethod -{ - /** @var string */ - protected $name = 'see'; - - /** @var Reference */ - protected $refers; - - /** - * Initializes this tag. - */ - public function __construct(Reference $refers, ?Description $description = null) - { - $this->refers = $refers; - $this->description = $description; - } - - public static function create( - string $body, - ?FqsenResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - $parts = preg_split('/\s+/Su', $body, 2); - Assert::isArray($parts); - $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; - - // https://tools.ietf.org/html/rfc2396#section-3 - if (preg_match('/\w:\/\/\w/i', $parts[0])) { - return new static(new Url($parts[0]), $description); - } - - return new static(new FqsenRef($typeResolver->resolve($parts[0], $context)), $description); - } - - /** - * Returns the ref of this tag. - */ - public function getReference() : Reference - { - return $this->refers; - } - - /** - * Returns a string representation of this tag. - */ - public function __toString() : string - { - return $this->refers . ($this->description ? ' ' . $this->description->render() : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php deleted file mode 100644 index dc12624..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php +++ /dev/null @@ -1,94 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function preg_match; - -/** - * Reflection class for a {@}since tag in a Docblock. - */ -final class Since extends BaseTag implements Factory\StaticMethod -{ - /** @var string */ - protected $name = 'since'; - - /** - * PCRE regular expression matching a version vector. - * Assumes the "x" modifier. - */ - public const REGEX_VECTOR = '(?: - # Normal release vectors. - \d\S* - | - # VCS version vectors. Per PHPCS, they are expected to - # follow the form of the VCS name, followed by ":", followed - # by the version vector itself. - # By convention, popular VCSes like CVS, SVN and GIT use "$" - # around the actual version vector. - [^\s\:]+\:\s*\$[^\$]+\$ - )'; - - /** @var string|null The version vector. */ - private $version; - - public function __construct(?string $version = null, ?Description $description = null) - { - Assert::nullOrNotEmpty($version); - - $this->version = $version; - $this->description = $description; - } - - public static function create( - ?string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : ?self { - if (empty($body)) { - return new static(); - } - - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { - return null; - } - - Assert::notNull($descriptionFactory); - - return new static( - $matches[1], - $descriptionFactory->create($matches[2] ?? '', $context) - ); - } - - /** - * Gets the version section of the tag. - */ - public function getVersion() : ?string - { - return $this->version; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - return (string) $this->version . ($this->description ? ' ' . (string) $this->description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php deleted file mode 100644 index 6d3c6cb..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php +++ /dev/null @@ -1,103 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function preg_match; - -/** - * Reflection class for a {@}source tag in a Docblock. - */ -final class Source extends BaseTag implements Factory\StaticMethod -{ - /** @var string */ - protected $name = 'source'; - - /** @var int The starting line, relative to the structural element's location. */ - private $startingLine; - - /** @var int|null The number of lines, relative to the starting line. NULL means "to the end". */ - private $lineCount; - - /** - * @param int|string $startingLine should be a to int convertible value - * @param int|string|null $lineCount should be a to int convertible value - */ - public function __construct($startingLine, $lineCount = null, ?Description $description = null) - { - Assert::integerish($startingLine); - Assert::nullOrIntegerish($lineCount); - - $this->startingLine = (int) $startingLine; - $this->lineCount = $lineCount !== null ? (int) $lineCount : null; - $this->description = $description; - } - - public static function create( - string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($descriptionFactory); - - $startingLine = 1; - $lineCount = null; - $description = null; - - // Starting line / Number of lines / Description - if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $body, $matches)) { - $startingLine = (int) $matches[1]; - if (isset($matches[2]) && $matches[2] !== '') { - $lineCount = (int) $matches[2]; - } - - $description = $matches[3]; - } - - return new static($startingLine, $lineCount, $descriptionFactory->create($description??'', $context)); - } - - /** - * Gets the starting line. - * - * @return int The starting line, relative to the structural element's - * location. - */ - public function getStartingLine() : int - { - return $this->startingLine; - } - - /** - * Returns the number of lines. - * - * @return int|null The number of lines, relative to the starting line. NULL - * means "to the end". - */ - public function getLineCount() : ?int - { - return $this->lineCount; - } - - public function __toString() : string - { - return $this->startingLine - . ($this->lineCount !== null ? ' ' . $this->lineCount : '') - . ($this->description ? ' ' . (string) $this->description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php deleted file mode 100644 index 0083d34..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\Type; -use function in_array; -use function strlen; -use function substr; -use function trim; - -abstract class TagWithType extends BaseTag -{ - /** @var ?Type */ - protected $type; - - /** - * Returns the type section of the variable. - */ - public function getType() : ?Type - { - return $this->type; - } - - /** - * @return string[] - */ - protected static function extractTypeFromBody(string $body) : array - { - $type = ''; - $nestingLevel = 0; - for ($i = 0, $iMax = strlen($body); $i < $iMax; $i++) { - $character = $body[$i]; - - if ($nestingLevel === 0 && trim($character) === '') { - break; - } - - $type .= $character; - if (in_array($character, ['<', '(', '[', '{'])) { - $nestingLevel++; - continue; - } - - if (in_array($character, ['>', ')', ']', '}'])) { - $nestingLevel--; - continue; - } - } - - $description = trim(substr($body, strlen($type))); - - return [$type, $description]; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php deleted file mode 100644 index 13f07ce..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Type; -use phpDocumentor\Reflection\TypeResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; - -/** - * Reflection class for a {@}throws tag in a Docblock. - */ -final class Throws extends TagWithType implements Factory\StaticMethod -{ - public function __construct(Type $type, ?Description $description = null) - { - $this->name = 'throws'; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$type, $description] = self::extractTypeFromBody($body); - - $type = $typeResolver->resolve($type, $context); - $description = $descriptionFactory->create($description, $context); - - return new static($type, $description); - } - - public function __toString() : string - { - return (string) $this->type . ' ' . (string) $this->description; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php deleted file mode 100644 index 1be71f6..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Fqsen; -use phpDocumentor\Reflection\FqsenResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function preg_split; - -/** - * Reflection class for a {@}uses tag in a Docblock. - */ -final class Uses extends BaseTag implements Factory\StaticMethod -{ - /** @var string */ - protected $name = 'uses'; - - /** @var Fqsen */ - protected $refers; - - /** - * Initializes this tag. - */ - public function __construct(Fqsen $refers, ?Description $description = null) - { - $this->refers = $refers; - $this->description = $description; - } - - public static function create( - string $body, - ?FqsenResolver $resolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::notNull($resolver); - Assert::notNull($descriptionFactory); - - $parts = preg_split('/\s+/Su', $body, 2); - Assert::isArray($parts); - Assert::allString($parts); - - return new static( - $resolver->resolve($parts[0], $context), - $descriptionFactory->create($parts[1] ?? '', $context) - ); - } - - /** - * Returns the structural element this tag refers to. - */ - public function getReference() : Fqsen - { - return $this->refers; - } - - /** - * Returns a string representation of this tag. - */ - public function __toString() : string - { - return $this->refers . ' ' . (string) $this->description; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php deleted file mode 100644 index e03f994..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php +++ /dev/null @@ -1,105 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Type; -use phpDocumentor\Reflection\TypeResolver; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function array_shift; -use function array_unshift; -use function implode; -use function preg_split; -use function strpos; -use function substr; -use const PREG_SPLIT_DELIM_CAPTURE; - -/** - * Reflection class for a {@}var tag in a Docblock. - */ -final class Var_ extends TagWithType implements Factory\StaticMethod -{ - /** @var string|null */ - protected $variableName = ''; - - public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) - { - Assert::string($variableName); - - $this->name = 'var'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - - $parts = preg_split('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - Assert::isArray($parts); - $type = null; - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - array_shift($parts); - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - return ($this->type ? $this->type . ' ' : '') - . (empty($this->variableName) ? '' : '$' . $this->variableName) - . ($this->description ? ' ' . $this->description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php deleted file mode 100644 index eaadf4d..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php +++ /dev/null @@ -1,98 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags; - -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\Types\Context as TypeContext; -use Webmozart\Assert\Assert; -use function preg_match; - -/** - * Reflection class for a {@}version tag in a Docblock. - */ -final class Version extends BaseTag implements Factory\StaticMethod -{ - /** @var string */ - protected $name = 'version'; - - /** - * PCRE regular expression matching a version vector. - * Assumes the "x" modifier. - */ - public const REGEX_VECTOR = '(?: - # Normal release vectors. - \d\S* - | - # VCS version vectors. Per PHPCS, they are expected to - # follow the form of the VCS name, followed by ":", followed - # by the version vector itself. - # By convention, popular VCSes like CVS, SVN and GIT use "$" - # around the actual version vector. - [^\s\:]+\:\s*\$[^\$]+\$ - )'; - - /** @var string|null The version vector. */ - private $version; - - public function __construct(?string $version = null, ?Description $description = null) - { - Assert::nullOrStringNotEmpty($version); - - $this->version = $version; - $this->description = $description; - } - - public static function create( - ?string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : ?self { - if (empty($body)) { - return new static(); - } - - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { - return null; - } - - $description = null; - if ($descriptionFactory !== null) { - $description = $descriptionFactory->create($matches[2] ?? '', $context); - } - - return new static( - $matches[1], - $description - ); - } - - /** - * Gets the version section of the tag. - */ - public function getVersion() : ?string - { - return $this->version; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - return ((string) $this->version) . - ($this->description instanceof Description ? ' ' . $this->description->render() : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php deleted file mode 100644 index cf04e5a..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php +++ /dev/null @@ -1,286 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -use InvalidArgumentException; -use LogicException; -use phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use phpDocumentor\Reflection\DocBlock\StandardTagFactory; -use phpDocumentor\Reflection\DocBlock\Tag; -use phpDocumentor\Reflection\DocBlock\TagFactory; -use Webmozart\Assert\Assert; -use function array_shift; -use function count; -use function explode; -use function is_object; -use function method_exists; -use function preg_match; -use function preg_replace; -use function str_replace; -use function strpos; -use function substr; -use function trim; - -final class DocBlockFactory implements DocBlockFactoryInterface -{ - /** @var DocBlock\DescriptionFactory */ - private $descriptionFactory; - - /** @var DocBlock\TagFactory */ - private $tagFactory; - - /** - * Initializes this factory with the required subcontractors. - */ - public function __construct(DescriptionFactory $descriptionFactory, TagFactory $tagFactory) - { - $this->descriptionFactory = $descriptionFactory; - $this->tagFactory = $tagFactory; - } - - /** - * Factory method for easy instantiation. - * - * @param array<string, class-string<Tag>> $additionalTags - */ - public static function createInstance(array $additionalTags = []) : self - { - $fqsenResolver = new FqsenResolver(); - $tagFactory = new StandardTagFactory($fqsenResolver); - $descriptionFactory = new DescriptionFactory($tagFactory); - - $tagFactory->addService($descriptionFactory); - $tagFactory->addService(new TypeResolver($fqsenResolver)); - - $docBlockFactory = new self($descriptionFactory, $tagFactory); - foreach ($additionalTags as $tagName => $tagHandler) { - $docBlockFactory->registerTagHandler($tagName, $tagHandler); - } - - return $docBlockFactory; - } - - /** - * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the - * getDocComment method (such as a ReflectionClass object). - */ - public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock - { - if (is_object($docblock)) { - if (!method_exists($docblock, 'getDocComment')) { - $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method'; - - throw new InvalidArgumentException($exceptionMessage); - } - - $docblock = $docblock->getDocComment(); - Assert::string($docblock); - } - - Assert::stringNotEmpty($docblock); - - if ($context === null) { - $context = new Types\Context(''); - } - - $parts = $this->splitDocBlock($this->stripDocComment($docblock)); - - [$templateMarker, $summary, $description, $tags] = $parts; - - return new DocBlock( - $summary, - $description ? $this->descriptionFactory->create($description, $context) : null, - $this->parseTagBlock($tags, $context), - $context, - $location, - $templateMarker === '#@+', - $templateMarker === '#@-' - ); - } - - /** - * @param class-string<Tag> $handler - */ - public function registerTagHandler(string $tagName, string $handler) : void - { - $this->tagFactory->registerTagHandler($tagName, $handler); - } - - /** - * Strips the asterisks from the DocBlock comment. - * - * @param string $comment String containing the comment text. - */ - private function stripDocComment(string $comment) : string - { - $comment = preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]?(.*)?#u', '$1', $comment); - Assert::string($comment); - $comment = trim($comment); - - // reg ex above is not able to remove */ from a single line docblock - if (substr($comment, -2) === '*/') { - $comment = trim(substr($comment, 0, -2)); - } - - return str_replace(["\r\n", "\r"], "\n", $comment); - } - - // phpcs:disable - /** - * Splits the DocBlock into a template marker, summary, description and block of tags. - * - * @param string $comment Comment to split into the sub-parts. - * - * @return string[] containing the template marker (if any), summary, description and a string containing the tags. - * - * @author Mike van Riel <me@mikevanriel.com> for extending the regex with template marker support. - * - * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. - */ - private function splitDocBlock(string $comment) : array - { - // phpcs:enable - // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This - // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the - // performance impact of running a regular expression - if (strpos($comment, '@') === 0) { - return ['', '', '', $comment]; - } - - // clears all extra horizontal whitespace from the line endings to prevent parsing issues - $comment = preg_replace('/\h*$/Sum', '', $comment); - Assert::string($comment); - /* - * Splits the docblock into a template marker, summary, description and tags section. - * - * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may - * occur after it and will be stripped). - * - The short description is started from the first character until a dot is encountered followed by a - * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing - * errors). This is optional. - * - The long description, any character until a new line is encountered followed by an @ and word - * characters (a tag). This is optional. - * - Tags; the remaining characters - * - * Big thanks to RichardJ for contributing this Regular Expression - */ - preg_match( - '/ - \A - # 1. Extract the template marker - (?:(\#\@\+|\#\@\-)\n?)? - - # 2. Extract the summary - (?: - (?! @\pL ) # The summary may not start with an @ - ( - [^\n.]+ - (?: - (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines - [\n.]* (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line - [^\n.]+ # Include anything else - )* - \.? - )? - ) - - # 3. Extract the description - (?: - \s* # Some form of whitespace _must_ precede a description because a summary must be there - (?! @\pL ) # The description may not start with an @ - ( - [^\n]+ - (?: \n+ - (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line - [^\n]+ # Include anything else - )* - ) - )? - - # 4. Extract the tags (anything that follows) - (\s+ [\s\S]*)? # everything that follows - /ux', - $comment, - $matches - ); - array_shift($matches); - - while (count($matches) < 4) { - $matches[] = ''; - } - - return $matches; - } - - /** - * Creates the tag objects. - * - * @param string $tags Tag block to parse. - * @param Types\Context $context Context of the parsed Tag - * - * @return DocBlock\Tag[] - */ - private function parseTagBlock(string $tags, Types\Context $context) : array - { - $tags = $this->filterTagBlock($tags); - if ($tags === null) { - return []; - } - - $result = []; - $lines = $this->splitTagBlockIntoTagLines($tags); - foreach ($lines as $key => $tagLine) { - $result[$key] = $this->tagFactory->create(trim($tagLine), $context); - } - - return $result; - } - - /** - * @return string[] - */ - private function splitTagBlockIntoTagLines(string $tags) : array - { - $result = []; - foreach (explode("\n", $tags) as $tagLine) { - if ($tagLine !== '' && strpos($tagLine, '@') === 0) { - $result[] = $tagLine; - } else { - $result[count($result) - 1] .= "\n" . $tagLine; - } - } - - return $result; - } - - private function filterTagBlock(string $tags) : ?string - { - $tags = trim($tags); - if (!$tags) { - return null; - } - - if ($tags[0] !== '@') { - // @codeCoverageIgnoreStart - // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that - // we didn't foresee. - - throw new LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); - - // @codeCoverageIgnoreEnd - } - - return $tags; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php deleted file mode 100644 index ef039a4..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php - -declare(strict_types=1); - -namespace phpDocumentor\Reflection; - -use phpDocumentor\Reflection\DocBlock\Tag; - -// phpcs:ignore SlevomatCodingStandard.Classes.SuperfluousInterfaceNaming.SuperfluousSuffix -interface DocBlockFactoryInterface -{ - /** - * Factory method for easy instantiation. - * - * @param array<string, class-string<Tag>> $additionalTags - */ - public static function createInstance(array $additionalTags = []) : DocBlockFactory; - - /** - * @param string|object $docblock - */ - public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock; -} diff --git a/vendor/phpdocumentor/type-resolver/LICENSE b/vendor/phpdocumentor/type-resolver/LICENSE deleted file mode 100644 index 792e404..0000000 --- a/vendor/phpdocumentor/type-resolver/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2010 Mike van Riel - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/phpdocumentor/type-resolver/README.md b/vendor/phpdocumentor/type-resolver/README.md deleted file mode 100644 index f30d3a2..0000000 --- a/vendor/phpdocumentor/type-resolver/README.md +++ /dev/null @@ -1,177 +0,0 @@ -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -![](https://github.com/phpdocumentor/typeresolver/workflows/Qa%20workflow/badge.svg?branch=1.x) -[![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/TypeResolver.svg)](https://coveralls.io/github/phpDocumentor/TypeResolver?branch=1.x) -[![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/TypeResolver.svg)](https://scrutinizer-ci.com/g/phpDocumentor/TypeResolver/?branch=1.x) -[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/TypeResolver.svg)](https://scrutinizer-ci.com/g/phpDocumentor/TypeResolver/?branch=1.x) -![Packagist Version](https://img.shields.io/packagist/v/phpdocumentor/type-resolver?label=Packagist%20stable) -![Packagist Version](https://img.shields.io/packagist/vpre/phpdocumentor/type-resolver?label=Packagist%20unstable) - -TypeResolver and FqsenResolver -============================== - -The specification on types in DocBlocks (PSR-5) describes various keywords and special constructs -but also how to statically resolve the partial name of a Class into a Fully Qualified Class Name (FQCN). - -PSR-5 also introduces an additional way to describe deeper elements than Classes, Interfaces and Traits -called the Fully Qualified Structural Element Name (FQSEN). Using this it is possible to refer to methods, -properties and class constants but also functions and global constants. - -This package provides two Resolvers that are capable of - -1. Returning a series of Value Object for given expression while resolving any partial class names, and -2. Returning an FQSEN object after resolving any partial Structural Element Names into Fully Qualified Structural - Element names. - -## Installing - -The easiest way to install this library is with [Composer](https://getcomposer.org) using the following command: - - $ composer require phpdocumentor/type-resolver - -## Examples - -Ready to dive in and don't want to read through all that text below? Just consult the [examples](examples) folder and check which type of action that your want to accomplish. - -## On Types and Element Names - -This component can be used in one of two ways - -1. To resolve a Type or -2. To resolve a Fully Qualified Structural Element Name - -The big difference between these two is in the number of things it can resolve. - -The TypeResolver can resolve: - -- a php primitive or pseudo-primitive such as a string or void (`@var string` or `@return void`). -- a composite such as an array of string (`@var string[]`). -- a compound such as a string or integer (`@var string|integer`). -- an array expression (`@var (string|TypeResolver)[]`) -- an object or interface such as the TypeResolver class (`@var TypeResolver` - or `@var \phpDocumentor\Reflection\TypeResolver`) - - > please note that if you want to pass partial class names that additional steps are necessary, see the - > chapter `Resolving partial classes and FQSENs` for more information. - -Where the FqsenResolver can resolve: - -- Constant expressions (i.e. `@see \MyNamespace\MY_CONSTANT`) -- Function expressions (i.e. `@see \MyNamespace\myFunction()`) -- Class expressions (i.e. `@see \MyNamespace\MyClass`) -- Interface expressions (i.e. `@see \MyNamespace\MyInterface`) -- Trait expressions (i.e. `@see \MyNamespace\MyTrait`) -- Class constant expressions (i.e. `@see \MyNamespace\MyClass::MY_CONSTANT`) -- Property expressions (i.e. `@see \MyNamespace\MyClass::$myProperty`) -- Method expressions (i.e. `@see \MyNamespace\MyClass::myMethod()`) - -## Resolving a type - -In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver` and call its `resolve` method like this: - -```php -$typeResolver = new \phpDocumentor\Reflection\TypeResolver(); -$type = $typeResolver->resolve('string|integer'); -``` - -In this example you will receive a Value Object of class `\phpDocumentor\Reflection\Types\Compound` that has two -elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type -`\phpDocumentor\Reflection\Types\Integer`. - -The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. - -### Resolving nullable types - -Php 7.1 introduced nullable types e.g. `?string`. Type resolver will resolve the original type without the nullable notation `?` -just like it would do without the `?`. After that the type is wrapped in a `\phpDocumentor\Reflection\Types\Nullable` object. -The `Nullable` type has a method to fetch the actual type. - -## Resolving an FQSEN - -A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this: - -```php -$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); -$fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()'); -``` - -In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`. - -The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. - -## Resolving partial Classes and Structural Element Names - -Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class names. - -For example, you have this file: - -```php -namespace My\Example; - -use phpDocumentor\Reflection\Types; - -class Classy -{ - /** - * @var Types\Context - * @see Classy::otherFunction() - */ - public function __construct($context) {} - - public function otherFunction(){} -} -``` - -Suppose that you would want to resolve (and expand) the type in the `@var` tag and the element name in the `@see` tag. - -For the resolvers to know how to expand partial names you have to provide a bit of _Context_ for them by instantiating a new class named `\phpDocumentor\Reflection\Types\Context` with the name of the namespace and the aliases that are in play. - -### Creating a Context - -You can do this by manually creating a Context like this: - -```php -$context = new \phpDocumentor\Reflection\Types\Context( - '\My\Example', - [ 'Types' => '\phpDocumentor\Reflection\Types'] -); -``` - -Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector object or by providing the namespace that you'd like to extract and the source code of the file in which the given type expression occurs. - -```php -$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); -$context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct')); -``` - -or - -```php -$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); -$context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php')); -``` - -### Using the Context - -After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver class as second argument and the Resolvers will take this into account when resolving partial names. - -To obtain the resolved class name for the `@var` tag in the example above you can do: - -```php -$typeResolver = new \phpDocumentor\Reflection\TypeResolver(); -$type = $typeResolver->resolve('Types\Context', $context); -``` - -When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be `phpDocumentor\Reflection\Types\Context`. - -> Why is the FQSEN wrapped in another object `Object_`? -> -> The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN. - -Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To resolve that you can do the following: - -```php -$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); -$type = $fqsenResolver->resolve('Classy::otherFunction()', $context); -``` - -Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the `resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to `\My\Example\Classy::otherFunction()`. diff --git a/vendor/phpdocumentor/type-resolver/composer.json b/vendor/phpdocumentor/type-resolver/composer.json deleted file mode 100644 index 242ecbe..0000000 --- a/vendor/phpdocumentor/type-resolver/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "phpdocumentor/type-resolver", - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*" - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "phpDocumentor\\Reflection\\": ["tests/unit", "tests/benchmark"] - } - }, - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - } -} diff --git a/vendor/phpdocumentor/type-resolver/composer.lock b/vendor/phpdocumentor/type-resolver/composer.lock deleted file mode 100644 index 8fa8b87..0000000 --- a/vendor/phpdocumentor/type-resolver/composer.lock +++ /dev/null @@ -1,71 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "ee8aea1f755e1772266bc7e041d8ee5b", - "packages": [ - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2020-06-27T09:03:43+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.2 || ^8.0" - }, - "platform-dev": { - "ext-tokenizer": "*" - } -} diff --git a/vendor/phpdocumentor/type-resolver/phpbench.json b/vendor/phpdocumentor/type-resolver/phpbench.json deleted file mode 100644 index ced1eba..0000000 --- a/vendor/phpdocumentor/type-resolver/phpbench.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "bootstrap": "vendor/autoload.php", - "path": "tests/benchmark", - "extensions": [ - "Jaapio\\Blackfire\\Extension" - ], - "blackfire" : { - "env": "c12030d0-c177-47e2-b466-4994c40dc993" - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php b/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php deleted file mode 100644 index 6447a01..0000000 --- a/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -use InvalidArgumentException; -use phpDocumentor\Reflection\Types\Context; -use function explode; -use function implode; -use function strpos; - -/** - * Resolver for Fqsen using Context information - * - * @psalm-immutable - */ -class FqsenResolver -{ - /** @var string Definition of the NAMESPACE operator in PHP */ - private const OPERATOR_NAMESPACE = '\\'; - - public function resolve(string $fqsen, ?Context $context = null) : Fqsen - { - if ($context === null) { - $context = new Context(''); - } - - if ($this->isFqsen($fqsen)) { - return new Fqsen($fqsen); - } - - return $this->resolvePartialStructuralElementName($fqsen, $context); - } - - /** - * Tests whether the given type is a Fully Qualified Structural Element Name. - */ - private function isFqsen(string $type) : bool - { - return strpos($type, self::OPERATOR_NAMESPACE) === 0; - } - - /** - * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation - * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. - * - * @throws InvalidArgumentException When type is not a valid FQSEN. - */ - private function resolvePartialStructuralElementName(string $type, Context $context) : Fqsen - { - $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); - - $namespaceAliases = $context->getNamespaceAliases(); - - // if the first segment is not an alias; prepend namespace name and return - if (!isset($namespaceAliases[$typeParts[0]])) { - $namespace = $context->getNamespace(); - if ($namespace !== '') { - $namespace .= self::OPERATOR_NAMESPACE; - } - - return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); - } - - $typeParts[0] = $namespaceAliases[$typeParts[0]]; - - return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Type.php b/vendor/phpdocumentor/type-resolver/src/Type.php deleted file mode 100644 index d2b86df..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Type.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -/** - * @psalm-immutable - */ -interface Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string; -} diff --git a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php deleted file mode 100644 index 62edeca..0000000 --- a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php +++ /dev/null @@ -1,543 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -use ArrayIterator; -use InvalidArgumentException; -use phpDocumentor\Reflection\Types\Array_; -use phpDocumentor\Reflection\Types\ClassString; -use phpDocumentor\Reflection\Types\Collection; -use phpDocumentor\Reflection\Types\Compound; -use phpDocumentor\Reflection\Types\Context; -use phpDocumentor\Reflection\Types\Expression; -use phpDocumentor\Reflection\Types\Integer; -use phpDocumentor\Reflection\Types\Intersection; -use phpDocumentor\Reflection\Types\Iterable_; -use phpDocumentor\Reflection\Types\Nullable; -use phpDocumentor\Reflection\Types\Object_; -use phpDocumentor\Reflection\Types\String_; -use RuntimeException; -use function array_key_exists; -use function array_pop; -use function array_values; -use function class_exists; -use function class_implements; -use function count; -use function end; -use function in_array; -use function key; -use function preg_split; -use function strpos; -use function strtolower; -use function trim; -use const PREG_SPLIT_DELIM_CAPTURE; -use const PREG_SPLIT_NO_EMPTY; - -final class TypeResolver -{ - /** @var string Definition of the ARRAY operator for types */ - private const OPERATOR_ARRAY = '[]'; - - /** @var string Definition of the NAMESPACE operator in PHP */ - private const OPERATOR_NAMESPACE = '\\'; - - /** @var int the iterator parser is inside a compound context */ - private const PARSER_IN_COMPOUND = 0; - - /** @var int the iterator parser is inside a nullable expression context */ - private const PARSER_IN_NULLABLE = 1; - - /** @var int the iterator parser is inside an array expression context */ - private const PARSER_IN_ARRAY_EXPRESSION = 2; - - /** @var int the iterator parser is inside a collection expression context */ - private const PARSER_IN_COLLECTION_EXPRESSION = 3; - - /** - * @var array<string, string> List of recognized keywords and unto which Value Object they map - * @psalm-var array<string, class-string<Type>> - */ - private $keywords = [ - 'string' => Types\String_::class, - 'class-string' => Types\ClassString::class, - 'int' => Types\Integer::class, - 'integer' => Types\Integer::class, - 'bool' => Types\Boolean::class, - 'boolean' => Types\Boolean::class, - 'real' => Types\Float_::class, - 'float' => Types\Float_::class, - 'double' => Types\Float_::class, - 'object' => Object_::class, - 'mixed' => Types\Mixed_::class, - 'array' => Array_::class, - 'resource' => Types\Resource_::class, - 'void' => Types\Void_::class, - 'null' => Types\Null_::class, - 'scalar' => Types\Scalar::class, - 'callback' => Types\Callable_::class, - 'callable' => Types\Callable_::class, - 'false' => Types\False_::class, - 'true' => Types\True_::class, - 'self' => Types\Self_::class, - '$this' => Types\This::class, - 'static' => Types\Static_::class, - 'parent' => Types\Parent_::class, - 'iterable' => Iterable_::class, - ]; - - /** - * @var FqsenResolver - * @psalm-readonly - */ - private $fqsenResolver; - - /** - * Initializes this TypeResolver with the means to create and resolve Fqsen objects. - */ - public function __construct(?FqsenResolver $fqsenResolver = null) - { - $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); - } - - /** - * Analyzes the given type and returns the FQCN variant. - * - * When a type is provided this method checks whether it is not a keyword or - * Fully Qualified Class Name. If so it will use the given namespace and - * aliases to expand the type to a FQCN representation. - * - * This method only works as expected if the namespace and aliases are set; - * no dynamic reflection is being performed here. - * - * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be - * replaced with another namespace. - * @uses Context::getNamespace() to determine with what to prefix the type name. - * - * @param string $type The relative or absolute type. - */ - public function resolve(string $type, ?Context $context = null) : Type - { - $type = trim($type); - if (!$type) { - throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); - } - - if ($context === null) { - $context = new Context(''); - } - - // split the type string into tokens `|`, `?`, `<`, `>`, `,`, `(`, `)`, `[]`, '<', '>' and type names - $tokens = preg_split( - '/(\\||\\?|<|>|&|, ?|\\(|\\)|\\[\\]+)/', - $type, - -1, - PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE - ); - - if ($tokens === false) { - throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); - } - - /** @var ArrayIterator<int, string|null> $tokenIterator */ - $tokenIterator = new ArrayIterator($tokens); - - return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); - } - - /** - * Analyse each tokens and creates types - * - * @param ArrayIterator<int, string|null> $tokens the iterator on tokens - * @param int $parserContext on of self::PARSER_* constants, indicating - * the context where we are in the parsing - */ - private function parseTypes(ArrayIterator $tokens, Context $context, int $parserContext) : Type - { - $types = []; - $token = ''; - $compoundToken = '|'; - while ($tokens->valid()) { - $token = $tokens->current(); - if ($token === null) { - throw new RuntimeException( - 'Unexpected nullable character' - ); - } - - if ($token === '|' || $token === '&') { - if (count($types) === 0) { - throw new RuntimeException( - 'A type is missing before a type separator' - ); - } - - if (!in_array($parserContext, [ - self::PARSER_IN_COMPOUND, - self::PARSER_IN_ARRAY_EXPRESSION, - self::PARSER_IN_COLLECTION_EXPRESSION, - ], true) - ) { - throw new RuntimeException( - 'Unexpected type separator' - ); - } - - $compoundToken = $token; - $tokens->next(); - } elseif ($token === '?') { - if (!in_array($parserContext, [ - self::PARSER_IN_COMPOUND, - self::PARSER_IN_ARRAY_EXPRESSION, - self::PARSER_IN_COLLECTION_EXPRESSION, - ], true) - ) { - throw new RuntimeException( - 'Unexpected nullable character' - ); - } - - $tokens->next(); - $type = $this->parseTypes($tokens, $context, self::PARSER_IN_NULLABLE); - $types[] = new Nullable($type); - } elseif ($token === '(') { - $tokens->next(); - $type = $this->parseTypes($tokens, $context, self::PARSER_IN_ARRAY_EXPRESSION); - - $token = $tokens->current(); - if ($token === null) { // Someone did not properly close their array expression .. - break; - } - - $tokens->next(); - - $resolvedType = new Expression($type); - - $types[] = $resolvedType; - } elseif ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION && $token[0] === ')') { - break; - } elseif ($token === '<') { - if (count($types) === 0) { - throw new RuntimeException( - 'Unexpected collection operator "<", class name is missing' - ); - } - - $classType = array_pop($types); - if ($classType !== null) { - if ((string) $classType === 'class-string') { - $types[] = $this->resolveClassString($tokens, $context); - } else { - $types[] = $this->resolveCollection($tokens, $classType, $context); - } - } - - $tokens->next(); - } elseif ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION - && ($token === '>' || trim($token) === ',') - ) { - break; - } elseif ($token === self::OPERATOR_ARRAY) { - end($types); - $last = key($types); - $lastItem = $types[$last]; - if ($lastItem instanceof Expression) { - $lastItem = $lastItem->getValueType(); - } - - $types[$last] = new Array_($lastItem); - - $tokens->next(); - } else { - $type = $this->resolveSingleType($token, $context); - $tokens->next(); - if ($parserContext === self::PARSER_IN_NULLABLE) { - return $type; - } - - $types[] = $type; - } - } - - if ($token === '|' || $token === '&') { - throw new RuntimeException( - 'A type is missing after a type separator' - ); - } - - if (count($types) === 0) { - if ($parserContext === self::PARSER_IN_NULLABLE) { - throw new RuntimeException( - 'A type is missing after a nullable character' - ); - } - - if ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION) { - throw new RuntimeException( - 'A type is missing in an array expression' - ); - } - - if ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION) { - throw new RuntimeException( - 'A type is missing in a collection expression' - ); - } - } elseif (count($types) === 1) { - return $types[0]; - } - - if ($compoundToken === '|') { - return new Compound(array_values($types)); - } - - return new Intersection(array_values($types)); - } - - /** - * resolve the given type into a type object - * - * @param string $type the type string, representing a single type - * - * @return Type|Array_|Object_ - * - * @psalm-pure - */ - private function resolveSingleType(string $type, Context $context) : object - { - switch (true) { - case $this->isKeyword($type): - return $this->resolveKeyword($type); - case $this->isFqsen($type): - return $this->resolveTypedObject($type); - case $this->isPartialStructuralElementName($type): - return $this->resolveTypedObject($type, $context); - - // @codeCoverageIgnoreStart - default: - // I haven't got the foggiest how the logic would come here but added this as a defense. - throw new RuntimeException( - 'Unable to resolve type "' . $type . '", there is no known method to resolve it' - ); - } - - // @codeCoverageIgnoreEnd - } - - /** - * Adds a keyword to the list of Keywords and associates it with a specific Value Object. - * - * @psalm-param class-string<Type> $typeClassName - */ - public function addKeyword(string $keyword, string $typeClassName) : void - { - if (!class_exists($typeClassName)) { - throw new InvalidArgumentException( - 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' - . ' but we could not find the class ' . $typeClassName - ); - } - - if (!in_array(Type::class, class_implements($typeClassName), true)) { - throw new InvalidArgumentException( - 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"' - ); - } - - $this->keywords[$keyword] = $typeClassName; - } - - /** - * Detects whether the given type represents a PHPDoc keyword. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @psalm-pure - */ - private function isKeyword(string $type) : bool - { - return array_key_exists(strtolower($type), $this->keywords); - } - - /** - * Detects whether the given type represents a relative structural element name. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @psalm-pure - */ - private function isPartialStructuralElementName(string $type) : bool - { - return ($type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type); - } - - /** - * Tests whether the given type is a Fully Qualified Structural Element Name. - * - * @psalm-pure - */ - private function isFqsen(string $type) : bool - { - return strpos($type, self::OPERATOR_NAMESPACE) === 0; - } - - /** - * Resolves the given keyword (such as `string`) into a Type object representing that keyword. - * - * @psalm-pure - */ - private function resolveKeyword(string $type) : Type - { - $className = $this->keywords[strtolower($type)]; - - return new $className(); - } - - /** - * Resolves the given FQSEN string into an FQSEN object. - * - * @psalm-pure - */ - private function resolveTypedObject(string $type, ?Context $context = null) : Object_ - { - return new Object_($this->fqsenResolver->resolve($type, $context)); - } - - /** - * Resolves class string - * - * @param ArrayIterator<int, (string|null)> $tokens - */ - private function resolveClassString(ArrayIterator $tokens, Context $context) : Type - { - $tokens->next(); - - $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - - if (!$classType instanceof Object_ || $classType->getFqsen() === null) { - throw new RuntimeException( - $classType . ' is not a class string' - ); - } - - $token = $tokens->current(); - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException( - 'class-string: ">" is missing' - ); - } - - throw new RuntimeException( - 'Unexpected character "' . $token . '", ">" is missing' - ); - } - - return new ClassString($classType->getFqsen()); - } - - /** - * Resolves the collection values and keys - * - * @param ArrayIterator<int, (string|null)> $tokens - * - * @return Array_|Iterable_|Collection - */ - private function resolveCollection(ArrayIterator $tokens, Type $classType, Context $context) : Type - { - $isArray = ((string) $classType === 'array'); - $isIterable = ((string) $classType === 'iterable'); - - // allow only "array", "iterable" or class name before "<" - if (!$isArray && !$isIterable - && (!$classType instanceof Object_ || $classType->getFqsen() === null)) { - throw new RuntimeException( - $classType . ' is not a collection' - ); - } - - $tokens->next(); - - $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - $keyType = null; - - $token = $tokens->current(); - if ($token !== null && trim($token) === ',') { - // if we have a comma, then we just parsed the key type, not the value type - $keyType = $valueType; - if ($isArray) { - // check the key type for an "array" collection. We allow only - // strings or integers. - if (!$keyType instanceof String_ && - !$keyType instanceof Integer && - !$keyType instanceof Compound - ) { - throw new RuntimeException( - 'An array can have only integers or strings as keys' - ); - } - - if ($keyType instanceof Compound) { - foreach ($keyType->getIterator() as $item) { - if (!$item instanceof String_ && - !$item instanceof Integer - ) { - throw new RuntimeException( - 'An array can have only integers or strings as keys' - ); - } - } - } - } - - $tokens->next(); - // now let's parse the value type - $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - } - - $token = $tokens->current(); - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException( - 'Collection: ">" is missing' - ); - } - - throw new RuntimeException( - 'Unexpected character "' . $token . '", ">" is missing' - ); - } - - if ($isArray) { - return new Array_($valueType, $keyType); - } - - if ($isIterable) { - return new Iterable_($valueType, $keyType); - } - - if ($classType instanceof Object_) { - return $this->makeCollectionFromObject($classType, $valueType, $keyType); - } - - throw new RuntimeException('Invalid $classType provided'); - } - - /** - * @psalm-pure - */ - private function makeCollectionFromObject(Object_ $object, Type $valueType, ?Type $keyType = null) : Collection - { - return new Collection($object->getFqsen(), $valueType, $keyType); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php b/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php deleted file mode 100644 index bbea4f1..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Represents a list of values. This is an abstract class for Array_ and Collection. - * - * @psalm-immutable - */ -abstract class AbstractList implements Type -{ - /** @var Type */ - protected $valueType; - - /** @var Type|null */ - protected $keyType; - - /** @var Type */ - protected $defaultKeyType; - - /** - * Initializes this representation of an array with the given Type. - */ - public function __construct(?Type $valueType = null, ?Type $keyType = null) - { - if ($valueType === null) { - $valueType = new Mixed_(); - } - - $this->valueType = $valueType; - $this->defaultKeyType = new Compound([new String_(), new Integer()]); - $this->keyType = $keyType; - } - - /** - * Returns the type for the keys of this array. - */ - public function getKeyType() : Type - { - return $this->keyType ?? $this->defaultKeyType; - } - - /** - * Returns the value for the keys of this array. - */ - public function getValueType() : Type - { - return $this->valueType; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - if ($this->keyType) { - return 'array<' . $this->keyType . ',' . $this->valueType . '>'; - } - - if ($this->valueType instanceof Mixed_) { - return 'array'; - } - - if ($this->valueType instanceof Compound) { - return '(' . $this->valueType . ')[]'; - } - - return $this->valueType . '[]'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php b/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php deleted file mode 100644 index 9522295..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php +++ /dev/null @@ -1,124 +0,0 @@ -<?php -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -declare(strict_types=1); - -namespace phpDocumentor\Reflection\Types; - -use ArrayIterator; -use IteratorAggregate; -use phpDocumentor\Reflection\Type; -use function array_key_exists; -use function implode; - -/** - * Base class for aggregated types like Compound and Intersection - * - * A Aggregated Type is not so much a special keyword or object reference but is a series of Types that are separated - * using separator. - * - * @psalm-immutable - * @template-implements IteratorAggregate<int, Type> - */ -abstract class AggregatedType implements Type, IteratorAggregate -{ - /** - * @psalm-allow-private-mutation - * @var array<int, Type> - */ - private $types = []; - - /** @var string */ - private $token; - - /** - * @param array<Type> $types - */ - public function __construct(array $types, string $token) - { - foreach ($types as $type) { - $this->add($type); - } - - $this->token = $token; - } - - /** - * Returns the type at the given index. - */ - public function get(int $index) : ?Type - { - if (!$this->has($index)) { - return null; - } - - return $this->types[$index]; - } - - /** - * Tests if this compound type has a type with the given index. - */ - public function has(int $index) : bool - { - return array_key_exists($index, $this->types); - } - - /** - * Tests if this compound type contains the given type. - */ - public function contains(Type $type) : bool - { - foreach ($this->types as $typePart) { - // if the type is duplicate; do not add it - if ((string) $typePart === (string) $type) { - return true; - } - } - - return false; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return implode($this->token, $this->types); - } - - /** - * @return ArrayIterator<int, Type> - */ - public function getIterator() : ArrayIterator - { - return new ArrayIterator($this->types); - } - - /** - * @psalm-suppress ImpureMethodCall - */ - private function add(Type $type) : void - { - if ($type instanceof self) { - foreach ($type->getIterator() as $subType) { - $this->add($subType); - } - - return; - } - - // if the type is duplicate; do not add it - if ($this->contains($type)) { - return; - } - - $this->types[] = $type; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Array_.php b/vendor/phpdocumentor/type-resolver/src/Types/Array_.php deleted file mode 100644 index 7f880e2..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Array_.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -/** - * Represents an array type as described in the PSR-5, the PHPDoc Standard. - * - * An array can be represented in two forms: - * - * 1. Untyped (`array`), where the key and value type is unknown and hence classified as 'Mixed_'. - * 2. Types (`string[]`), where the value type is provided by preceding an opening and closing square bracket with a - * type name. - * - * @psalm-immutable - */ -final class Array_ extends AbstractList -{ -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php b/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php deleted file mode 100644 index 9163b51..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing a Boolean type. - * - * @psalm-immutable - */ -class Boolean implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'bool'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php b/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php deleted file mode 100644 index 1522325..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing a Callable type. - * - * @psalm-immutable - */ -final class Callable_ implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'callable'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/ClassString.php b/vendor/phpdocumentor/type-resolver/src/Types/ClassString.php deleted file mode 100644 index f847f17..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/ClassString.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Fqsen; -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing the type 'string'. - * - * @psalm-immutable - */ -final class ClassString implements Type -{ - /** @var Fqsen|null */ - private $fqsen; - - /** - * Initializes this representation of a class string with the given Fqsen. - */ - public function __construct(?Fqsen $fqsen = null) - { - $this->fqsen = $fqsen; - } - - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen - { - return $this->fqsen; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - if ($this->fqsen === null) { - return 'class-string'; - } - - return 'class-string<' . (string) $this->fqsen . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Collection.php b/vendor/phpdocumentor/type-resolver/src/Types/Collection.php deleted file mode 100644 index 84b4463..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Collection.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Fqsen; -use phpDocumentor\Reflection\Type; - -/** - * Represents a collection type as described in the PSR-5, the PHPDoc Standard. - * - * A collection can be represented in two forms: - * - * 1. `ACollectionObject<aValueType>` - * 2. `ACollectionObject<aValueType,aKeyType>` - * - * - ACollectionObject can be 'array' or an object that can act as an array - * - aValueType and aKeyType can be any type expression - * - * @psalm-immutable - */ -final class Collection extends AbstractList -{ - /** @var Fqsen|null */ - private $fqsen; - - /** - * Initializes this representation of an array with the given Type or Fqsen. - */ - public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) - { - parent::__construct($valueType, $keyType); - - $this->fqsen = $fqsen; - } - - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen - { - return $this->fqsen; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - $objectType = (string) ($this->fqsen ?? 'object'); - - if ($this->keyType === null) { - return $objectType . '<' . $this->valueType . '>'; - } - - return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php b/vendor/phpdocumentor/type-resolver/src/Types/Compound.php deleted file mode 100644 index ad426cc..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing a Compound Type. - * - * A Compound Type is not so much a special keyword or object reference but is a series of Types that are separated - * using an OR operator (`|`). This combination of types signifies that whatever is associated with this compound type - * may contain a value with any of the given types. - * - * @psalm-immutable - */ -final class Compound extends AggregatedType -{ - /** - * Initializes a compound type (i.e. `string|int`) and tests if the provided types all implement the Type interface. - * - * @param array<Type> $types - */ - public function __construct(array $types) - { - parent::__construct($types, '|'); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Context.php b/vendor/phpdocumentor/type-resolver/src/Types/Context.php deleted file mode 100644 index c134d7c..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Context.php +++ /dev/null @@ -1,97 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use function strlen; -use function substr; -use function trim; - -/** - * Provides information about the Context in which the DocBlock occurs that receives this context. - * - * A DocBlock does not know of its own accord in which namespace it occurs and which namespace aliases are applicable - * for the block of code in which it is in. This information is however necessary to resolve Class names in tags since - * you can provide a short form or make use of namespace aliases. - * - * The phpDocumentor Reflection component knows how to create this class but if you use the DocBlock parser from your - * own application it is possible to generate a Context class using the ContextFactory; this will analyze the file in - * which an associated class resides for its namespace and imports. - * - * @see ContextFactory::createFromClassReflector() - * @see ContextFactory::createForNamespace() - * - * @psalm-immutable - */ -final class Context -{ - /** @var string The current namespace. */ - private $namespace; - - /** - * @var string[] List of namespace aliases => Fully Qualified Namespace. - * @psalm-var array<string, string> - */ - private $namespaceAliases; - - /** - * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) - * format (without a preceding `\`). - * - * @param string $namespace The namespace where this DocBlock resides in. - * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. - * - * @psalm-param array<string, string> $namespaceAliases - */ - public function __construct(string $namespace, array $namespaceAliases = []) - { - $this->namespace = $namespace !== 'global' && $namespace !== 'default' - ? trim($namespace, '\\') - : ''; - - foreach ($namespaceAliases as $alias => $fqnn) { - if ($fqnn[0] === '\\') { - $fqnn = substr($fqnn, 1); - } - - if ($fqnn[strlen($fqnn) - 1] === '\\') { - $fqnn = substr($fqnn, 0, -1); - } - - $namespaceAliases[$alias] = $fqnn; - } - - $this->namespaceAliases = $namespaceAliases; - } - - /** - * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. - */ - public function getNamespace() : string - { - return $this->namespace; - } - - /** - * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent - * the alias for the imported Namespace. - * - * @return string[] - * - * @psalm-return array<string, string> - */ - public function getNamespaceAliases() : array - { - return $this->namespaceAliases; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php b/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php deleted file mode 100644 index 596cf61..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php +++ /dev/null @@ -1,394 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use ArrayIterator; -use InvalidArgumentException; -use ReflectionClass; -use ReflectionClassConstant; -use ReflectionMethod; -use ReflectionParameter; -use ReflectionProperty; -use Reflector; -use RuntimeException; -use UnexpectedValueException; -use function file_exists; -use function file_get_contents; -use function get_class; -use function in_array; -use function is_string; -use function token_get_all; -use function trim; -use const T_AS; -use const T_CLASS; -use const T_CURLY_OPEN; -use const T_DOLLAR_OPEN_CURLY_BRACES; -use const T_NAMESPACE; -use const T_NS_SEPARATOR; -use const T_STRING; -use const T_USE; - -/** - * Convenience class to create a Context for DocBlocks when not using the Reflection Component of phpDocumentor. - * - * For a DocBlock to be able to resolve types that use partial namespace names or rely on namespace imports we need to - * provide a bit of context so that the DocBlock can read that and based on it decide how to resolve the types to - * Fully Qualified names. - * - * @see Context for more information. - */ -final class ContextFactory -{ - /** The literal used at the end of a use statement. */ - private const T_LITERAL_END_OF_USE = ';'; - - /** The literal used between sets of use statements */ - private const T_LITERAL_USE_SEPARATOR = ','; - - /** - * Build a Context given a Class Reflection. - * - * @see Context for more information on Contexts. - */ - public function createFromReflector(Reflector $reflector) : Context - { - if ($reflector instanceof ReflectionClass) { - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @var ReflectionClass<object> $reflector */ - - return $this->createFromReflectionClass($reflector); - } - - if ($reflector instanceof ReflectionParameter) { - return $this->createFromReflectionParameter($reflector); - } - - if ($reflector instanceof ReflectionMethod) { - return $this->createFromReflectionMethod($reflector); - } - - if ($reflector instanceof ReflectionProperty) { - return $this->createFromReflectionProperty($reflector); - } - - if ($reflector instanceof ReflectionClassConstant) { - return $this->createFromReflectionClassConstant($reflector); - } - - throw new UnexpectedValueException('Unhandled \Reflector instance given: ' . get_class($reflector)); - } - - private function createFromReflectionParameter(ReflectionParameter $parameter) : Context - { - $class = $parameter->getDeclaringClass(); - if (!$class) { - throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); - } - - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @var ReflectionClass<object> $class */ - - return $this->createFromReflectionClass($class); - } - - private function createFromReflectionMethod(ReflectionMethod $method) : Context - { - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @var ReflectionClass<object> $class */ - $class = $method->getDeclaringClass(); - - return $this->createFromReflectionClass($class); - } - - private function createFromReflectionProperty(ReflectionProperty $property) : Context - { - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @var ReflectionClass<object> $class */ - $class = $property->getDeclaringClass(); - - return $this->createFromReflectionClass($class); - } - - private function createFromReflectionClassConstant(ReflectionClassConstant $constant) : Context - { - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @var ReflectionClass<object> $class */ - $class = $constant->getDeclaringClass(); - - return $this->createFromReflectionClass($class); - } - - /** - * @param ReflectionClass<object> $class - */ - private function createFromReflectionClass(ReflectionClass $class) : Context - { - $fileName = $class->getFileName(); - $namespace = $class->getNamespaceName(); - - if (is_string($fileName) && file_exists($fileName)) { - $contents = file_get_contents($fileName); - if ($contents === false) { - throw new RuntimeException('Unable to read file "' . $fileName . '"'); - } - - return $this->createForNamespace($namespace, $contents); - } - - return new Context($namespace, []); - } - - /** - * Build a Context for a namespace in the provided file contents. - * - * @see Context for more information on Contexts. - * - * @param string $namespace It does not matter if a `\` precedes the namespace name, - * this method first normalizes. - * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. - */ - public function createForNamespace(string $namespace, string $fileContents) : Context - { - $namespace = trim($namespace, '\\'); - $useStatements = []; - $currentNamespace = ''; - $tokens = new ArrayIterator(token_get_all($fileContents)); - - while ($tokens->valid()) { - $currentToken = $tokens->current(); - switch ($currentToken[0]) { - case T_NAMESPACE: - $currentNamespace = $this->parseNamespace($tokens); - break; - case T_CLASS: - // Fast-forward the iterator through the class so that any - // T_USE tokens found within are skipped - these are not - // valid namespace use statements so should be ignored. - $braceLevel = 0; - $firstBraceFound = false; - while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { - $currentToken = $tokens->current(); - if ($currentToken === '{' - || in_array($currentToken[0], [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES], true)) { - if (!$firstBraceFound) { - $firstBraceFound = true; - } - - ++$braceLevel; - } - - if ($currentToken === '}') { - --$braceLevel; - } - - $tokens->next(); - } - - break; - case T_USE: - if ($currentNamespace === $namespace) { - $useStatements += $this->parseUseStatement($tokens); - } - - break; - } - - $tokens->next(); - } - - return new Context($namespace, $useStatements); - } - - /** - * Deduce the name from tokens when we are at the T_NAMESPACE token. - * - * @param ArrayIterator<int, string|array{0:int,1:string,2:int}> $tokens - */ - private function parseNamespace(ArrayIterator $tokens) : string - { - // skip to the first string or namespace separator - $this->skipToNextStringOrNamespaceSeparator($tokens); - - $name = ''; - while ($tokens->valid() && in_array($tokens->current()[0], [T_STRING, T_NS_SEPARATOR], true)) { - $name .= $tokens->current()[1]; - $tokens->next(); - } - - return $name; - } - - /** - * Deduce the names of all imports when we are at the T_USE token. - * - * @param ArrayIterator<int, string|array{0:int,1:string,2:int}> $tokens - * - * @return string[] - * - * @psalm-return array<string, string> - */ - private function parseUseStatement(ArrayIterator $tokens) : array - { - $uses = []; - - while ($tokens->valid()) { - $this->skipToNextStringOrNamespaceSeparator($tokens); - - $uses += $this->extractUseStatements($tokens); - $currentToken = $tokens->current(); - if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { - return $uses; - } - } - - return $uses; - } - - /** - * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. - * - * @param ArrayIterator<int, string|array{0:int,1:string,2:int}> $tokens - */ - private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens) : void - { - while ($tokens->valid()) { - $currentToken = $tokens->current(); - if (in_array($currentToken[0], [T_STRING, T_NS_SEPARATOR], true)) { - break; - } - - $tokens->next(); - } - } - - /** - * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of - * a USE statement yet. This will return a key/value array of the alias => namespace. - * - * @param ArrayIterator<int, string|array{0:int,1:string,2:int}> $tokens - * - * @return string[] - * - * @psalm-suppress TypeDoesNotContainType - * - * @psalm-return array<string, string> - */ - private function extractUseStatements(ArrayIterator $tokens) : array - { - $extractedUseStatements = []; - $groupedNs = ''; - $currentNs = ''; - $currentAlias = ''; - $state = 'start'; - - while ($tokens->valid()) { - $currentToken = $tokens->current(); - $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; - $tokenValue = is_string($currentToken) ? null : $currentToken[1]; - switch ($state) { - case 'start': - switch ($tokenId) { - case T_STRING: - case T_NS_SEPARATOR: - $currentNs .= (string) $tokenValue; - $currentAlias = $tokenValue; - break; - case T_CURLY_OPEN: - case '{': - $state = 'grouped'; - $groupedNs = $currentNs; - break; - case T_AS: - $state = 'start-alias'; - break; - case self::T_LITERAL_USE_SEPARATOR: - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - - break; - case 'start-alias': - switch ($tokenId) { - case T_STRING: - $currentAlias = $tokenValue; - break; - case self::T_LITERAL_USE_SEPARATOR: - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - - break; - case 'grouped': - switch ($tokenId) { - case T_STRING: - case T_NS_SEPARATOR: - $currentNs .= (string) $tokenValue; - $currentAlias = $tokenValue; - break; - case T_AS: - $state = 'grouped-alias'; - break; - case self::T_LITERAL_USE_SEPARATOR: - $state = 'grouped'; - $extractedUseStatements[(string) $currentAlias] = $currentNs; - $currentNs = $groupedNs; - $currentAlias = ''; - break; - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - - break; - case 'grouped-alias': - switch ($tokenId) { - case T_STRING: - $currentAlias = $tokenValue; - break; - case self::T_LITERAL_USE_SEPARATOR: - $state = 'grouped'; - $extractedUseStatements[(string) $currentAlias] = $currentNs; - $currentNs = $groupedNs; - $currentAlias = ''; - break; - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - } - - if ($state === 'end') { - break; - } - - $tokens->next(); - } - - if ($groupedNs !== $currentNs) { - $extractedUseStatements[(string) $currentAlias] = $currentNs; - } - - return $extractedUseStatements; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Expression.php b/vendor/phpdocumentor/type-resolver/src/Types/Expression.php deleted file mode 100644 index 4a8ae1f..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Expression.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Represents an expression type as described in the PSR-5, the PHPDoc Standard. - * - * @psalm-immutable - */ -final class Expression implements Type -{ - /** @var Type */ - protected $valueType; - - /** - * Initializes this representation of an array with the given Type. - */ - public function __construct(Type $valueType) - { - $this->valueType = $valueType; - } - - /** - * Returns the value for the keys of this array. - */ - public function getValueType() : Type - { - return $this->valueType; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return '(' . $this->valueType . ')'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/False_.php b/vendor/phpdocumentor/type-resolver/src/Types/False_.php deleted file mode 100644 index 39666fb..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/False_.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -declare(strict_types=1); - -namespace phpDocumentor\Reflection\Types; - -/** - * Value Object representing a False pseudo type. - * - * @psalm-immutable - */ -class False_ extends Boolean -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'false'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Float_.php b/vendor/phpdocumentor/type-resolver/src/Types/Float_.php deleted file mode 100644 index e70ce7d..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Float_.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing a Float. - * - * @psalm-immutable - */ -final class Float_ implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'float'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Integer.php b/vendor/phpdocumentor/type-resolver/src/Types/Integer.php deleted file mode 100644 index 2cfd7e9..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Integer.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value object representing Integer type - * - * @psalm-immutable - */ -final class Integer implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'int'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php b/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php deleted file mode 100644 index ced37b6..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -declare(strict_types=1); - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing a Compound Type. - * - * A Intersection Type is not so much a special keyword or object reference but is a series of Types that are separated - * using an AND operator (`&`). This combination of types signifies that whatever is associated with this Intersection - * type may contain a value with any of the given types. - * - * @psalm-immutable - */ -final class Intersection extends AggregatedType -{ - /** - * Initializes a intersection type (i.e. `\A&\B`) and tests if the provided types all implement the Type interface. - * - * @param array<Type> $types - */ - public function __construct(array $types) - { - parent::__construct($types, '&'); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php b/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php deleted file mode 100644 index a03a7cd..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -/** - * Value Object representing iterable type - * - * @psalm-immutable - */ -final class Iterable_ extends AbstractList -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - if ($this->keyType) { - return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; - } - - if ($this->valueType instanceof Mixed_) { - return 'iterable'; - } - - return 'iterable<' . $this->valueType . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php b/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php deleted file mode 100644 index 2fedff4..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing an unknown, or mixed, type. - * - * @psalm-immutable - */ -final class Mixed_ implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'mixed'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Null_.php b/vendor/phpdocumentor/type-resolver/src/Types/Null_.php deleted file mode 100644 index f5994d9..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Null_.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing a null value or type. - * - * @psalm-immutable - */ -final class Null_ implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'null'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php b/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php deleted file mode 100644 index 80aaf4e..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing a nullable type. The real type is wrapped. - * - * @psalm-immutable - */ -final class Nullable implements Type -{ - /** @var Type The actual type that is wrapped */ - private $realType; - - /** - * Initialises this nullable type using the real type embedded - */ - public function __construct(Type $realType) - { - $this->realType = $realType; - } - - /** - * Provide access to the actual type directly, if needed. - */ - public function getActualType() : Type - { - return $this->realType; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return '?' . $this->realType->__toString(); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Object_.php b/vendor/phpdocumentor/type-resolver/src/Types/Object_.php deleted file mode 100644 index 4cfe2a0..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Object_.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use InvalidArgumentException; -use phpDocumentor\Reflection\Fqsen; -use phpDocumentor\Reflection\Type; -use function strpos; - -/** - * Value Object representing an object. - * - * An object can be either typed or untyped. When an object is typed it means that it has an identifier, the FQSEN, - * pointing to an element in PHP. Object types that are untyped do not refer to a specific class but represent objects - * in general. - * - * @psalm-immutable - */ -final class Object_ implements Type -{ - /** @var Fqsen|null */ - private $fqsen; - - /** - * Initializes this object with an optional FQSEN, if not provided this object is considered 'untyped'. - * - * @throws InvalidArgumentException When provided $fqsen is not a valid type. - */ - public function __construct(?Fqsen $fqsen = null) - { - if (strpos((string) $fqsen, '::') !== false || strpos((string) $fqsen, '()') !== false) { - throw new InvalidArgumentException( - 'Object types can only refer to a class, interface or trait but a method, function, constant or ' - . 'property was received: ' . (string) $fqsen - ); - } - - $this->fqsen = $fqsen; - } - - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen - { - return $this->fqsen; - } - - public function __toString() : string - { - if ($this->fqsen) { - return (string) $this->fqsen; - } - - return 'object'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php b/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php deleted file mode 100644 index 08900ab..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing the 'parent' type. - * - * Parent, as a Type, represents the parent class of class in which the associated element was defined. - * - * @psalm-immutable - */ -final class Parent_ implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'parent'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php b/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php deleted file mode 100644 index 2d4a794..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing the 'resource' Type. - * - * @psalm-immutable - */ -final class Resource_ implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'resource'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php b/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php deleted file mode 100644 index 00ac369..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing the 'scalar' pseudo-type, which is either a string, integer, float or boolean. - * - * @psalm-immutable - */ -final class Scalar implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'scalar'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Self_.php b/vendor/phpdocumentor/type-resolver/src/Types/Self_.php deleted file mode 100644 index 7fa13fa..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Self_.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing the 'self' type. - * - * Self, as a Type, represents the class in which the associated element was defined. - * - * @psalm-immutable - */ -final class Self_ implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'self'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Static_.php b/vendor/phpdocumentor/type-resolver/src/Types/Static_.php deleted file mode 100644 index 568400c..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Static_.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing the 'static' type. - * - * Self, as a Type, represents the class in which the associated element was called. This differs from self as self does - * not take inheritance into account but static means that the return type is always that of the class of the called - * element. - * - * See the documentation on late static binding in the PHP Documentation for more information on the difference between - * static and self. - * - * @psalm-immutable - */ -final class Static_ implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'static'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/String_.php b/vendor/phpdocumentor/type-resolver/src/Types/String_.php deleted file mode 100644 index 6b92e41..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/String_.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing the type 'string'. - * - * @psalm-immutable - */ -final class String_ implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'string'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/This.php b/vendor/phpdocumentor/type-resolver/src/Types/This.php deleted file mode 100644 index 58cb3af..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/This.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing the '$this' pseudo-type. - * - * $this, as a Type, represents the instance of the class associated with the element as it was called. $this is - * commonly used when documenting fluent interfaces since it represents that the same object is returned. - * - * @psalm-immutable - */ -final class This implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return '$this'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/True_.php b/vendor/phpdocumentor/type-resolver/src/Types/True_.php deleted file mode 100644 index 3d00e66..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/True_.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -declare(strict_types=1); - -namespace phpDocumentor\Reflection\Types; - -/** - * Value Object representing a True pseudo type. - * - * @psalm-immutable - */ -class True_ extends Boolean -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'true'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Void_.php b/vendor/phpdocumentor/type-resolver/src/Types/Void_.php deleted file mode 100644 index 5cabad5..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Void_.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\Types; - -use phpDocumentor\Reflection\Type; - -/** - * Value Object representing the pseudo-type 'void'. - * - * Void is generally only used when working with return types as it signifies that the method intentionally does not - * return any value. - * - * @psalm-immutable - */ -final class Void_ implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'void'; - } -} diff --git a/vendor/phpmd/phpmd/.mailmap b/vendor/phpmd/phpmd/.mailmap deleted file mode 100644 index ed333df..0000000 --- a/vendor/phpmd/phpmd/.mailmap +++ /dev/null @@ -1,4 +0,0 @@ -Manuel Pichler <mapi@manuel-pichler.de> <github@manuel-pichler.de> -Stefan Zerkalica <zerkalica@gmail.com> -Daniel Mason <daniel@danielmason.com> <daniel.mason@thefoundry.co.uk> -Ilia Shakitko <shakitko@gmail.com> <i.shakitko@leaseweb.com> diff --git a/vendor/phpmd/phpmd/.scrutinizer.yml b/vendor/phpmd/phpmd/.scrutinizer.yml deleted file mode 100644 index 71ca356..0000000 --- a/vendor/phpmd/phpmd/.scrutinizer.yml +++ /dev/null @@ -1,13 +0,0 @@ -build: - environment: - php: - version: 7.4.0 - -checks: - php: - code_rating: true - duplication: true - -filter: - excluded_paths: - - src/test/resources/files/ diff --git a/vendor/phpmd/phpmd/.stickler.yml b/vendor/phpmd/phpmd/.stickler.yml deleted file mode 100644 index 1f59497..0000000 --- a/vendor/phpmd/phpmd/.stickler.yml +++ /dev/null @@ -1,8 +0,0 @@ -linters: - phpcs: - standard: 'PSR2' - extensions: '.php' - tab_width: 4 - ignore: 'src/test/resources/*' -branches: - ignore: ['1.5.x'] diff --git a/vendor/phpmd/phpmd/AUTHORS.rst b/vendor/phpmd/phpmd/AUTHORS.rst deleted file mode 100644 index 798e1fe..0000000 --- a/vendor/phpmd/phpmd/AUTHORS.rst +++ /dev/null @@ -1,38 +0,0 @@ -================ -Authors of PHPMD -================ - -Main Authors/Maintainers ------------------------- - -- Manuel Pichler (Since 2009) -- Marc Würth (Since 2014) / https://github.com/ravage84 - -Contributors ------------- - -- Volker Dusch (Since 2010) / https://github.com/edorian -- timmartin (Since 2010) / https://github.com/timmartin -- Sebastian Bergmann (Since 2011) / https://github.com/sebastianbergmann -- Zsolt Takacs (Since 2011) / https://github.com/zstakacs -- Che Hodgins (Since 2011) / https://github.com/chehodgins -- Gennadiy Litvinyuk (Since 2011) / https://github.com/gennadiylitvinyuk -- Francis Besset (Since 2011) / https://github.com/francisbesset -- zerkalica (Since 2012) / https://github.com/zerkalica -- palbertini (Since 2012) / https://github.com/palbertini -- bahulneel (Since 2012) / https://github.com/bahulneel -- Willem Stuursma (Since 2012) / https://github.com/willemstuursma -- Nimlhug (Since 2012) / https://github.com/Nimlhug -- A. Martin Llano (Since 2012) / https://github.com/amllano -- Juan Basso (Since 2012) / https://github.com/jrbasso -- Brian Ridley (Since 2013) / https://github.com/ptlis -- Radosław Mejer (Since 2014) / https://github.com/radmen -- Tobias Nyholm (Since 2014) / https://github.com/Nyholm -- Gasillo (Since 2014) / https://github.com/Gasillo - -.. - Local Variables: - mode: rst - fill-column: 79 - End: - vim: et syn=rst tw=79 diff --git a/vendor/phpmd/phpmd/CHANGELOG b/vendor/phpmd/phpmd/CHANGELOG deleted file mode 100644 index 5a166ba..0000000 --- a/vendor/phpmd/phpmd/CHANGELOG +++ /dev/null @@ -1,790 +0,0 @@ -phpmd-2.8.2 (?) -======================== - -- Fixed #732: Added __serialize and __unserialize to list of ignored methods for camelCase rule. - -phpmd-2.8.1 (2019/12/27) -======================== - -- Fixed PHP 7.4 unit tests compatibility -- Improved documentation -- Automated website generation and PHAR publishing - -phpmd-2.8.0 (2019/12/18) -======================== - -- Required at least pdepend/pdepend 2.6: - - Added PHP 7.1 to 7.3 syntax support - - Added Symfony 5 support - See full changes list: https://github.com/pdepend/pdepend/releases/tag/2.6.0 -- Added #497: Undefined variable rule -- Improved performances by disabling XDebug if in use -- Added #571: ignore-namespaces property to DevelopmentCodeFragment rule -- Added #595: Renderer which writes an ansi report string -- Fixed #657: IfStatementAssignment violation message -- Optimized Composer autoloader when building Phar -- Fixed #661: IfStatementAssignment thrown incorrectly -- Fixed #676: Handle @SuppressWarnings on each method for CountInLoop -- Fixed #659: PHP 7.4 compatibility for implode() usage - - -phpmd-2.7.0 (2019/07/30) -======================== - -This is the first minor release of the new PHPMD maintainer team. It -contains all the new features, improvements and fixes from two and a -half years since 2.6.0. Please take note of a backwards incompatible -property renaming in the CouplingBetweenObjects rule. - -- Fixed #482: Renamed minimum property to maximum in - CouplingBetweenObjects rule (backwards incompatible) Fixed in commit - #9210116. -- Fixed #626: Fixed special characters escaping in violation - description for XML output Fixed in commit #5305f5b. -- Fixed #378: Fixed warning/error when trying to export to a - non-existing path Fixed in commit #67bd7c6. -- Fixed #575: Fixed UnusedFormalParameter false positive in string - compound variable Fixed in commit #8790cbb. -- Fixed #480: Fixed "Start tag expected, '<' not found" error Fixed in - commit #3e2e058. -- Fixed #494: Fixed UnusedPrivateField false positive Fixed in commit - #99f3ba9. -- Fixed #583: Changed LongNaming rule to apply on private fields too - Fixed in commit #42bf8ad. -- Fixed #598: Fixed a bug in the renderer auto-discovery Fixed in - commit #cc06bfd. -- Fixed #572: Added support for both @SuppressWarnings and - @suppressWarnings annotation cases Fixed in commit #bb2cfe9. -- Fixed invalid "array of strings" type hints Fixed in commit - #16e4eda. -- Fixed #599: Fixed Composer package type Fixed in commit #0ca4eff. -- Fixed #604: Renamed mikey179/vfsStream to mikey179/vfsstream to - prevent Composer error Fixed in commit #f66247f. -- Fixed #632: Changed Scrutinizer CI settings to use local PHPUnit - Fixed in commit #dfaa509. -- Fixed #633: Fixed AppVeyor CI build Fixed in commit #40189f3. -- Fixed #609: Fixed main logo link in website build script Fixed in - commit #f3b68be. -- Fixed #631: Fixed URL to "How to create a custom rule set" - documentation page on website Fixed in commit #3c5b534. -- Fixed #449: Improved code style Fixed in commit #67cdab2. -- Fixed #447: Improved code style Fixed in commit #3ef4ba8. -- Fixed #450: Improved code style Fixed in commit #9525da7. -- Fixed #582: Fixed a typo in Clean Code Rules documentation Fixed in - commit #85e48ad. -- Fixed #567: Fixed a typo in Clean Code Rules documentation Fixed in - commit #175b08f. -- Implemented #472: Added rule for assignment within conditional - (IfStatementAssignment) Implemented in commit #716ecf5. -- Implemented #490: Added rule for count in loop (CountInLoop) - Implemented in commit #0e30d82. -- Implemented #484: Added rule for duplicated array key - (DuplicatedArrayKey) Implemented in commit #a295850. -- Implemented #476: Added rule for empty catch block (EmptyCatchBlock) - Implemented in commit #4bc19bd. -- Implemented #636: Added rule for missing import (MissingImport) - Implemented in commit #3a82eab. -- Implemented #443: Added support for compound variables in - UnusedLocalVariable rule Implemented in commit #c7009d5. -- Implemented #329: Added support to whitelist variables in the - UnusedLocalVariable rule Implemented in commit #55ca654. -- Implemented #478: Implemented renderer auto-discovery Implemented in - commit #91c4ca8. -- Implemented #405: Added JSON output format Implemented in commit - #7552089. -- Implemented #525: Added new options to CLI (min-priority, - minimum-priority, report-file, input-file, not-strict) Implemented - in commit #71b52be. -- Implemented #579: Added support for setting the maximum execution - priority through CLI (max-priority, maximum-priority, - maximumpriority) Implemented in commit #45de3be. -- Implemented #489: Added new predefined variables to - AbstractLocalVariable rule Implemented in commit #63047d9. -- Implemented #382: Changed TooManyMethods rule to ignore isser-, - hasser-, wither-methods Implemented in commit #609c6bb. -- Implemented #625: Fixed DuplicatedArrayKey rule to check only arrays - with keys Implemented in commit #43d4ed0. -- Implemented #528: Fixed Travis-CI build by temporarily removing PHP - 5.3 Implemented in commit #0a69edf. -- Implemented #643: Fixed Travis-CI build to run PHP 5.3 and fixed 5.3 - compatibility Implemented in commit #4a8a567. -- Implemented #475: Added tests that show support for chained methods - (fluent interfaces) for UnusedPrivateMethod rule Implemented in - commit #d5c1372. -- Implemented #495: Added test for SuppressWarnings for - ExcessivePublicCount Implemented in commit #b1c15f8. -- Implemented #381: Added annotations to allow IDEs to reference - correct classes Implemented in commit #2dbae11. -- Implemented #639: Fixed arrays types to use standard type syntax - Implemented in commit #858c9fd. -- Implemented #640: Added type hint annotations Implemented in commit - #d68e511. -- Implemented #481: Cleaned boc block comments Implemented in commit - #08a38d4. -- Implemented #491: Cleaned whitespaces Implemented in commit - #dcdd61a. -- Implemented #477: Fixed code formatting Implemented in commit - #3c6b69b. -- Implemented #548: Updated PDepend to 2.5.2 Implemented in commit - #f1c145e. -- Implemented #474: Dropped HHVM support Implemented in commit - #9f7b4d2. -- Implemented #458: Updated PHPCS dev dependency from 2.3.4 to 2.8.1 - Implemented in commit #f2ae09f. -- Implemented #458: Updated PHPCS & added Composer scripts Implemented - in commit #24ff5a9. -- Implemented #469: Updated Coding Standard command Implemented in - commit #9962dae. -- Implemented #627: Removed composer.lock Implemented in commit - #981c78f. -- Implemented #623: Extended test matrix & do only one job per build - on Travis-CI Implemented in commit #a2c64bf. -- Implemented #617: Replaced Travis-CI build notification from IRC to - the new Gitter core channel Implemented in commit #e1a4cd7. -- Implemented #620: Added PHPMD Gitter Community Channel notifications - for Travis-CI Implemented in commit #f1c05bf. -- Implemented #459: Integrated Stickler CI Implemented in commit - #d106330. -- Implemented #492: Adjusted Stickler-CI config for ignoring test - resource files Implemented in commit #9b18153. -- Implemented #460: Added ApiGen config file Implemented in commit - #4514235. -- Implemented #471: Modified default PHP installation directory to - match Chocolatey package in AppVeyor CI config Implemented in commit - #2b55442. -- Implemented #552: Updated PHP in AppVeyor CI builds to 7.1 - Implemented in commit #252b178. -- Implemented #605: Added a pure PHP build script to generate the - website as static files Implemented in commit #6f56a8f. -- Implemented #608: Updated the website build script to handle anchor - links and to use direct links whenever possible Implemented in - commit #6cf7a2d. -- Implemented #483: Removed broken link to Web Content Viewer from - website Implemented in commit #eeea9ee. -- Implemented #611: Removed section about commercial support from - website Implemented in commit #671760a. -- Implemented #612: Removed IRC, add Gitter & reword Support & Contact - section from/on website Implemented in commit #3e94d6b. -- Implemented #479: Replaced all file header doc blocks with uniform - one Implemented in commit #fff046c. -- Implemented #470: Changed HTTP to HTTPS in some files Implemented in - commit #1ca30d0. -- Implemented #448: Switched from HTTP to HTTPS in some files - Implemented in commit #51eb887. -- Implemented #524: Switched from HTTP to HTTPS in resource file - Implemented in commit #409b276. -- Implemented #454: Switched from HTTP to HTTPS for test files - Implemented in commit #f1c1426. -- Implemented #451: Switched from HTTP to HTTPS for main files - Implemented in commit #9a77c48. -- Implemented #455: Switched from HTTP to HTTPS for resource files - Implemented in commit #b073ad2. -- Implemented #566: Added CLI usage example Implemented in commit - #e12e59c. -- Implemented #621: Updated wording about PHPMD Implemented in commit - #c116054. -- Implemented #606: Updated license according to BSD 3-clause template - Implemented in commit #e850660. -- Implemented #469: Improved contributing guide for Linux / OS X users - Implemented in commit #63ff5bf. -- Implemented #383: Improved the ElseExpression description - Implemented in commit #6f02406. -- Implemented #565: Added example for modifying properties in a rule - set Implemented in commit #59551fc. -- Implemented #614: Removed API docs that do not exist anymore - Implemented in commit #7c8d9bc. -- Implemented #615: Added Gitter badge Implemented in commit #8e1e9e8. -- Implemented #618: Added badges for the monthly and total downloads - Implemented in commit #1e86639. - -phpmd-2.6.1 (2019/07/06) -======================== - -This is the first release of the new maintainer team of PHPMD. It is a -re-tag of 2.6.0 but with PHAR build on Travis-CI and deployment to -GitHub releases. - -- Implemented #616: Build the PHAR file on Travis-CI and publish it to - GitHub releases Implemented in commit #135327d. - -phpmd-2.6.0 (2017/01/20) -======================== - -This release incorporates several pending PRs. Beside that we have -rebased PHPMD on PDepend 2.5 which should complete support for PHP 7 -language features. - -- Fixed #345: Development Code Fragment feature is not working Fixed - in commit #1c0afd4. -- Fixed #384: use-statement for functions returns in: - UnexpectedTokenException Fixed in commit #1c0afd4. -- Fixed #409: Test for PHPMD or PMD on SuppressWarnings Fixed in - commit #147beb1. -- Fixed #418: Add missing link to TooManyPublicMethods rule in the - rules document Fixed in commit #eccacb0. -- Fixed #419: Fix a link to github help because the link is broken - Fixed in commit #3c9ef0b. -- Fixed #426: Enable Windows Update service on AppVeyor Fixed in - commit #4bd2516. -- Fixed #429: Added ext-xml to require in composer.json file Fixed in - commit #0aecd07. -- Fixed #433: Mistake in documentation of CCN Fixed in commit - #f686673. -- Implemented #379: Code cleaning. Implemented in commit #902da6c. -- Implemented #412: Add .mailmap file to fix git shortlog Implemented - in commit #7fe3d6b. -- Implemented #416: Test against lowest possible dependencies - Implemented in commit #d2b58b3. - -phpmd-2.5.0 (2016/11/23) -======================== - -This release closes several minor/major issues in PHPMD itself and it -bundles a new version of PDepend that also provides fixes for several -bugs. - -- Fixed #386: English language fixes Fixed in commit #2a31103. -- Fixed #395: Fix typo in rulesets/cleancode Fixed in commit #f6aa5be. -- Fix copy & paste error Fixed in commit #c51ea72. -- Fixed #411: Unexpected token: list -- Fixed #389: Unexpected token: EMPTY -- Implemented #365: Remove the leading blank line from the - TextRenderer Implemented in commit #ca59154. -- Implemented #380: add --ignore-exit-violations CLI flag to allow - exit code 0 event if violation is found (will allow successfull - build for CI) Implemented in commit #9f71d98. -- Bump PHP dependency to 5.3.9 Implemented in commit #540d61c. - -phpmd-2.4.4 (2016/11/22) -======================== - -Maintenance release with new PDepend version bundled - -- Fixed #347: Fixed UnexpectedTokenException on null coalesce - operator. Fixed in commit #8e80aaa. - -phpmd-2.4.2 (2016/03/10) -======================== - - - -- Fixed #261: Prove Issue 261 and added tests for - CamelCaseVariableName Fixed in commit #319b398. -- Fixed #328: Cannot create new nodes, when internal state is frozen. - Fixed in commit #2fd479b. -- Fixed #354: Replace plus by a dot as concat operator in filename - creation. Fixed in commit #6a121ea. -- Implemented #343: Trim exceptions for StaticAccess Implemented in - commit #3121c58. - -phpmd-2.4.1 (2016/03/08) -======================== - -This release fixes a method naming issue, that was introduced with -2.4.0. - -phpmd-2.4.0 (2016/03/08) -======================== - -This release adds a new helper method to access the full qualified -name of an analyzed node. - -- Fixed #335: Typo in clean code rule description fixed. Fixed in - commit #59a6e8a. -- Helper method added, so that we can access the full qualified name - of a class, method, interface or function. Implemented in commit - #e46a099. -- Implemented #334: Added __debugInfo to list of ignored methods. - Implemented in commit #f8b017a. - -phpmd-2.3.3 (2016/03/08) -======================== - -Some minor issues fixed - -phpmd-2.3.2 (2015/09/24) -======================== - -With this release we make the Symfony dependency superfluous. - -- Implemented #312: No more hard Symfony dependency. Implemented in - commit #1da75aa. - -phpmd-2.3.1 (2015/09/22) -======================== - -Bugfix release for issue #311 introduced with the 2.3.0 release. - -- Fixed #311: Property "allow-underscore-test" does not exist. Fixed - in commit #0db4a3e. - -phpmd-2.3.0 (2015/09/22) -======================== - -This new release contains several contributed bugfixes and additions -to PHPMD. Beside that we now have better support for language -constructs in the upcoming PHP 7. - -- Fixed #272: Improve type hint. Fixed in commit #724bf76. -- Fixed #293: Declared missing method in abstract class Fixed in - commit #9b806f6. -- Fixed #297: Complete fix for timezone warning. Fixed in commit - #227d469. -- Fixed #301: Fix mixed up links in documentation. Fixed in commit - #4bc4eeb. -- Fixed #304: Fix #303, change if condition order. Fixed in commit - #3376c73. -- Implemented #232: Three new features about references, includes and - include-paths Implemented in commit #180848f. -- Implemented #241: Fix of UnusedPrivateMethod chained method calls. - Implemented in commit #7e02f38. -- Implemented #257: Add option to allow having an undercore in test - methods. Implemented in commit #3cbe76d. -- Implemented #265: Search for development code Implemented in commit - #dfa6872. -- Implemented #273: Add TooManyPublicMethods rule. Implemented in - commit #b862f1f. -- Implemented #291: Define the version constraints of deps in Composer - using the caret operator. Implemented in commit #586ccfc. -- Implemented #306: Use new Travis infrastructure. Implemented in - commit #cd1308e. - -phpmd-2.2.3 (2015/05/27) -======================== - -Bugfix release that closes issues and adds some improvements to phpmd. - -- Fixed #285: Corrected HTML TR closing tag Fixed in commit #df6280f. -- Fixed link to rules documentation Fixed in commit #20a0142. -- Implemented #281: Code cleanup Implemented in commit #5e94a65. -- Underlying PDepend version bumped. Implemented in commit #f4ddb8a. - -phpmd-2.2.2 (2015/03/26) -======================== - -Bugfix release that closes some issues in phpmd's core and in the -project documentation. - -- Fixed #271: Fix cp error in doc Fixed in commit #b73dd32. -- Fixed #270: Fixing namespace issue for OutOfBoundsException Fixed in - commit #0d4bed1. -- Fixed #80: Out ot the box usage in combination with composer of all - rules failes throws error Property $exceptions does not exist. Fixed - in commit #0d4bed1. - -phpmd-2.2.1 (2015/03/01) -======================== - -This release integration several pull requests and closes and handful -of issues. - -- Fixed #237: Display type correctly for constructors Fixed in commit - #49f19d8. -- Fixed #238: Fix link to rulesets Fixed in commit #829d110. -- Fixed #244: Fix typos in type hints Fixed in commit #b5a04ce. -- Fixed #245: Fix CamelCase vs camelCase issue in the docs Fixed in - commit #6cd03ce. -- Implemented #210: Added editorconfig Implemented in commit #22a73a7. -- Implemented #211: Added phpcs as development dependency Implemented - in commit #441398d. -- Implemented #214: Short method name exceptions Implemented in commit - #55b799b. -- Implemented #225: Refactor - remove right side whitespaces - Implemented in commit #c12fffa. -- Implemented #242: Unused "use" statement removed from RuleViolation - class Implemented in commit #966ce38. -- Implemented #243: Unused private property removed. Implemented in - commit #121d43b. -- Implemented #246: Improve WMC documentation Implemented in commit - #b1e9be9. -- Implemented #249: Remove redundant line Implemented in commit - #a9bd6cb. - -phpmd-2.2.0 (2015/01/25) -======================== - -Closes an issue with recent symfony versions - -- Fixed #226: Fixed error message for StaticAccess Fixed in commit - #efa1dcd. -- Fixed #216: Refactor - removed right side spaces Fixed in commit - #422345e. -- Implemented #221: Ignore php4 style ctor in interfaces and - namespaces Implemented in commit #b248315. -- Implemented #220: Skip check for ConstructorWithNameAsEnclosingClass - when in an interface or namespace Implemented in commit #b248315. -- Implemented #219: Do not trigger UnusedFormalParameter with some - magic methods. Implemented in commit #4d3b154. -- Implemented #218: Allow any future minor version of Symfony2 2.5 - components. Implemented in commit #6317043. -- Implemented #215: Improved composer.json Implemented in commit - #6da3358. -- Implemented #196: Composer Compatible for symfony >= 2.5 and < - master/dev. Implemented in commit #6317043. -- Implemented #208: Appveyor CI for Windows Implemented in commit - #05210b6. -- Implemented #207: Added a contribution guide Implemented in commit - #d6de6a5. -- Implemented #205: Removed all @version annotations Implemented in - commit #5b1fcef. -- Implemented #204: Removed all traces of "PHP Version 5" in the file - header DocBlock Implemented in commit #c36897b. -- Implemented #203: Some improvements to the README Implemented in - commit #cc354ed. -- Implemented #201: Added the missing cleancode section to the - website. Implemented in commit #ead3368. -- Implemented #200: StaticAccess - ability to add exceptions for - specific class names Implemented in commit #b428516. -- Implemented #199: Changed the OutOfBounds exceptions when getting a - property Implemented in commit #0dad28d. -- Implemented #198: Allow unused foreach variables Implemented in - commit #98bed5a. -- Implemented #197: Allow underscore camelcase property name - Implemented in commit #6eb7dcd. -- Implemented #152: Update DepthOfInheritance.php: Using the right - condition and naming of property. Implemented in commit #e59053c. -- Implemented #97: Fixed typo in rule ElseExpression CDATA Implemented - in commit #7593f17. - -phpmd-2.1.3 (2014/09/25) -======================== - -Bug fix release. - -- Fixed #195: Missing version number in composer.json file replaced - with build.properties version number. Fixed in commit #7b8d13f. - -phpmd-2.1.2 (2014/09/25) -======================== - -This release closes several minor issues and integrates some -outstanding pull requests. - -- Fixed #164: Fixed IRC link Fixed in commit #84f2d8a. -- Fixed #165: Removed lie regarding PEAR Fixed in commit #74b9f84. -- Fixed #85: Documentation changes, fixed typo in PHPMD's online - documentation. Fixed in commit #f954dcf. -- Fixed #190: Updating composer.json Fixed in commit #45c55d8. -- Fixed #191: Superglobals are not named in CamelCase Fixed in commit - #b18ffbb. -- Fixed #192: Fix a typo. These are the 'design rules' not the 'code - size rules Fixed in commit #1eb321d. -- Implemented #182: Tweak with CamelCase matching inheritDoc - Implemented in commit #9271fc6. -- Implemented #189: Missing composer install documentation Implemented - in commit #450f91c. - -phpmd-2.1.1 (2014/09/09) -======================== - - - -- Fixed #181: 404 error on your website release area -- Fixed #168: --version argument doesn't return version Fixed in - commit #3f56c37. -- Implemented #183: exceptions for CamelCaseVariableName and - UnusedLocalVariable Implemented in commit #5f9e8a2. - -phpmd-2.1.0 (2014/09/08) -======================== - -This integrates several outstanding pull requests. - -- Fixed #118: Fix [Naming]: Trait can have method same as trait's name - Fixed in commit #f93be40. -- Fixed #177: Get XML contents before parsing Fixed in commit - #e081088. -- Implemented #150: Fix for unused variables rules when handling - namespace compact() Implemented in commit #ffab9fc. -- Implemented #154: Added PHP 5.6 and HHVM to travis.yml Implemented - in commit #b5cdc74. -- Implemented #159: Allow a single underscore at the beginning - Implemented in commit #d0779c2. -- Implemented #100: Quick change to add support for exclude-pattern in - a ruleset Implemented in commit #6257a83. -- Implemented #117: --exclude not working Implemented in commit - #6257a83. - -phpmd-2.0.0 (2014/05/21) -======================== - -This is major release of PHPMD which utilizes 2.0 engine of PDepend. - -- Fixed #111: Changelog with old releases and invalid dates removed. - Fixed in commit #cdfbb8f. -- Implemented #40: Allow multiple report files Now it is possible to - render multiple report files during a single PHPMD run, just add: - --reportfile-xml report.xml --reportfile-html report.html - --reportfile-text report.txt to the PHP command line call. - Implemented in commit #e16c38c. -- Implemented #61: UnusedLocalVariable fix for compact handling in - Symfony2 Implemented in commit #a1dc403. -- Implemented #119: PDepend 2.0 support Implemented in commit - #8c3ebe1. -- Implemented #122: Add: New parameter 'ignore-whitespace' to - LongClass and LongMethod rules Implemented in commit #19c4da8. - -phpmd-1.5.0 (2013/07/26) -======================== - -This release closes some PHP 5.4 related issues. - -- Fixed #87: Fix: PHP Fatal error: Call to a member function - isInstanceOf() on a non-object Fixed in commit #9ab3b6d. -- Fixed #81: Fix error when using entire ruleset "Naming" Fixed in - commit #a473345. -- Fixed #91: (tiny) documentation typo fix Fixed in commit #2a3d304. -- Implemented #66: Added support for short variable name exceptions - Implemented in commit #1484e22. -- Implemented #73: Show available formats and rulesets Implemented in - commit #86560ce. - -phpmd-1.4.1 (2012/12/14) -======================== - -This release integrates several pull requests. - -- Fixed #56: package.xml date invalid: 2011/02/12. Fixed in commit - #575fe7b. -- Implemented #10: Fix UnusedLocalVariable to recognize compact - function. Implemented in commit #e478912. -- Implemented #58: Skip "unused formal parameter" checking when method - signature has been annotated as inherited using @inheritdoc. - Implemented in commit #158e1f5. - -phpmd-1.4.0 (2012/09/07) -======================== - -This release integrates some longer pending pull requests and smaller -bugfixes. One major addition is support for Composer as distribution -channel. - -- Fixed #51: Fixed handling of traits. Fixed in commit #22b523c. -- Implemented #11: Add getStringProperty($name) to AbstractRule.php. - Implemented in commit #b7d659f. -- Implemented #12: Update README.rst on cmd line arguments. - Implemented in commit #458d566. -- Implemented #53: Added getStringProperty and rule-setting to change - TooManyMethods ignore Regexp. Implemented in commit #bc795b6. -- Implemented #10: Provide PHPMD as composer dependency on - packagist.org. Implemented in commit #3622bb8. - -phpmd-1.3.3 (2012/02/29) -======================== - -This release closes an issue introduced with the last release. It -closes one more regression related to PHP's memory_limit and the -Suhosin patch. - -- Fixed fatal error due to bug in memory_limit modification code. - Fixed in commit #e8b546d. - -phpmd-1.3.2 (2012/02/25) -======================== - -This release closes a minor issue in PHP_PMD's memory handling when it -is run in a PHP environment that uses the Suhosin patch and the -suhosin.memory_limit setting. - -- Fixed #25450811: Alert disable memory_limit Fixed in commit - #19e4fc5. - -phpmd-1.3.1 (2012/02/16) -======================== - -The 1.3.1 release of PHPMD closes one critical bug in PHPMD, that -causes a fatal error due to the xdebug max_nesting_level setting for -very deep self calls on methods. - -- Fixed #24975295: Fatal: Maximum function nesting level reached in - ASTNode.php:425 Fixed in commit #f6550df. - -phpmd-1.3.0 (2012/02/04) -======================== - -Version 1.3.0 now depends on PHP_Depend 1.0.0 which has support for -all the new language constructs introduced with PHP 5.4. Additionally -this release contains some minor fixes for PHPMD's rule violation -messages. - -phpmd-1.2.1 (2011/10/04) -======================== - -The 1.2.1 release of PHPMD closes several minor issues and bugs. -Beside that we have added a contribution by Francis Besset with -additions rules for PHPMD. Finally we have updated the utilized -PHP_Depend version to a newer release. - -- Fixed #14990109: False detection of unused variable Fixed in commit - #183fbd5. -- Fixed #23278127: PHPMD should exclude unused parameters from - inherited methods Fixed in commit #d162b21. -- Fixed #9355859: PHP_Depend exceptions are silently ignored Fixed in - commit #d3d553f. -- Implemented #11055167: Move PHPUnit annotations from method doc - block to class doc block Implemented in commit #7bcddde. -- Added Superglobals rule in Controversial Implemented in commit - #7176e74. -- Added rules to check CamelCase Implemented in commit #1c3c260. - -phpmd-1.2.0 (2011/09/27) -======================== - -Version 1.2.0 is a small feature release of PHPMD that introduces the -new command line option --strict. This options forces PHPMD to apply -all rules, even if a source node contains the @SuppressWarnings -annotation. - -- Controverial PHPMD rule that checks if the project under test does - not utilize PHP's super globals. Implemented in commit #0e60fb9. -- Implemented #18462127: PHPMD needs a *strict* mode. Implemented in - commit #b066b44. - -phpmd-1.1.1 (2011/06/30) -======================== - -Version 1.1.1 of PHPMD is a pure Bugfix release that fixes an issue in -PHPMD's package manifest. This bug prevents Pyrus the PEAR2 installer -from installing PHPMD. - -- Fixed #10096717: Bug in PHPMD's package manifest file. Fixed in - commit #f063bc9. - -phpmd-1.1.0 (2011/03/20) -======================== - -Version 1.1.0 of PHPMD was released on March the 20th 2011. The key -features for this release were two new rules. The first one utilizes -the Coupling Between Objects (CBO) metric to detect strongly coupled -classes. The second one detects the usage of PHP's questionable 'goto' -statement. Beside that we have closed a minor bug in the LongVariable -rule, where also private properties with descriptive names were -reported. And finally we have replaced deprecated PHPUnit features in -the PHPMD's test suite, so that PHPMD's tests should now work with -PHPUnit 3.4.x and 3.5.x without deprecated warnings. - -- Fixed #10096717: LongVariable rule should not apply on private - properties. Fixed in commit #f063bc9. -- Implemented #10474873: Add rule for PHP's goto statement. - Implemented in commit #2745a20. -- Implemented #10474987: Implement rule for CBO metric. Implemented in - commit #14277b4. -- Implemented #11012465: Replace deprecated PHPUnit features in test - suite. Implemented in commit #4adb88d. - -phpmd-1.0.1 (2011/02/12) -======================== - -- Fixed #9930643: The include_path does not match with PHP_Depend's - new directory layout. Fixed in commit #531be78. -- Fixed #9626017: Clear temporary resources after a test has finished. - Fixed in commit #b385f15. - -phpmd-1.0.0 (2011/02/05) -======================== - -- Fixed #9626017: Clear temporary resources after a test has finished. - Fixed in commit #b385f15. -- New source layout that follows maven's conventions for the directory - structure of a product. -- Switched to PHPUnit 3.5.x as testing framework - -phpmd-0.2.8 (2010/11/25) -======================== - -- Improved help text for the PHPMD command line. Thanks to Volker - Dusch for this contribution. https://github.com/edorian/phpmd -- PHPMD is now compatible with next PHP_Depend release 0.10.0 - -phpmd-0.2.7 (2010/09/01) -======================== - -- Fixed #36: @SupressWarnings annotation does not work for - UnusedPrivateMethod rule. Fixed in commit #284. -- Fixed #35: Stream Writer closes STDOUT. Fixed in commit #286. -- Fixed #33: PEAR package.xml does not @php_bin@ and @bin_dir@ on - phpmd.bat. Fixed in commit #264. - -phpmd-0.2.6 (2010/07/03) -======================== - -- Fixed #28: Unused local variable and unused parameter rule produces - false positives. Fixed in commit #245. -- Implemented #24: Implement Depth Of Inheritance Rule. Implemented in - commit #253. -- Implemented #25: Implement Number of Children Rule. Implemented in - commit #252. -- Implemented #26: Implement Rule that detects the usage of PHP's - eval() function. Implemented in commit #251. -- Implemented #27: Implement Rule that detects the usage of PHP's - exit() expression. Implemented in commit #250. -- Implemented #30: New option --version added to PHPMD's command line - interface. Implemented in commit #246. -- Names of several command line options unified with PHPUnit and - PHPCPD. The --ignore option is now --exclude and --extensions is now - --suffixes. - -phpmd-0.2.5 (2010/04/03) -======================== - -- Fixed #17: Do not return success exit code when PHPMD detects rule - violations in analyzed source code. Fixed in commit #226. -- Fixed #19: Super globals were detected as unused variables. Fixed in - commit #218. -- Fixed #20: Local static variables were treated as unused variables. - Fixed in commit #219. -- Implemented #12: Add rule for the Weighted Methods Per Class Metric. - Implemented in commit #228. -- Implemented #16: Alternative syntax for properties in rule set files - implemented. Implemented in commit #220. - -phpmd-0.2.4 (2010/03/08) -======================== - -- E_NOTICE bug fix in naming rule. - -phpmd-0.2.3 (2010/03/04) -======================== - -- Fixed #6: PHP Tokenizer required but no error when installing. -- Fixed #7: UnusedLocalVariable ruleset incorrectly flags variables as - unused when used inside double quoted string. Fixed in commit #187. -- Fixed #14: ExcessivePublicCount rule should utilize PHP_Depend's cis - metric. Fixed in commit #203. -- Fixed #15: ExcessivePublicCount rule is never used. Fixed in commit - #202. -- Implemented #9: Add support for "Suppress warnings" annotations. - Implemented in commit #200. -- Implemented #10: Support for exclude element in rule-set files - added. Implemented in commit #189. -- Implemented #13: Implement naming rules, e.g. short variables, - parameter etc. - -phpmd-0.2.2 (2010/01/20) -======================== - -- Small change to the command line interface, which did not return an - exit code != 0 when an exception occured. - -phpmd-0.2.1 (2010/01/05) -======================== - -- Implemented #5: Allow multiple input files/directories. Implemented - in commit #158. -- Additional unit tests for multiple components added. - -phpmd-0.2.0 (2009/12/30) -======================== - -- Implemented #2: Support for unused code fules completed. Implemented - in commit #134. -- Implemented #3: Text renderer implemented. -- Implemented #4: Implement a html renderer. Implemented in commit - #139. -- Several performance improvements. - -phpmd-0.1.0 (2009/12/20) -======================== - -Initial release - diff --git a/vendor/phpmd/phpmd/CONTRIBUTING.md b/vendor/phpmd/phpmd/CONTRIBUTING.md deleted file mode 100644 index 0921f53..0000000 --- a/vendor/phpmd/phpmd/CONTRIBUTING.md +++ /dev/null @@ -1,47 +0,0 @@ -How to Contribute -================= - -The PHPMD project welcomes your contribution. There are several ways to help out: - -* Create an [issue](https://github.com/phpmd/phpmd/issues/) on GitHub, -if you have found a bug or have an idea for a feature -* Write test cases for open bug issues -* Write patches for open bug/feature issues -* Participate on the PHPMD IRC Channel - -There are a few guidelines that we need contributors to follow, so that we have a -chance of keeping on top of things. - -* The code must follow the [PSR-2 coding standard](http://www.php-fig.org/psr/psr-2/). -* All code changes should be covered by unit tests - -Issues ------- - -* Submit an [issue](https://github.com/phpmd/phpmd/issues/) - * Make sure it does not already exist. - * Clearly describe the issue including steps to reproduce, when it is a bug. - * Make sure you note the PHPMD version you use. - -Coding Standard ---------------- - -Make sure your code changes comply with the PSR-2 coding standard by -using [PHP Codesniffer](https://github.com/squizlabs/PHP_CodeSniffer) -from within your PHPMD folder: - - vendor/bin/phpcs -p --extensions=php --standard=PSR2 src > phpcs.txt - -Linux / OS X users may extend this command to exclude files, that are not part of a commit: - - vendor/bin/phpcs -p --extensions=php --standard=PSR2 --ignore=src/tests/resources $(git ls-files -om --exclude-standard | grep '\.php$') > phpcs.txt - -Check the ``phpcs.txt`` once it finished. - -Additional Resources --------------------- - -* [Existing issues](https://github.com/phpmd/phpmd/issues/) -* [General GitHub documentation](https://help.github.com/) -* [GitHub pull request documentation](https://help.github.com/articles/creating-a-pull-request/) -* [PHPMD IRC Channel on freenode.org](http://webchat.freenode.net/?channels=phpmd) diff --git a/vendor/phpmd/phpmd/LICENSE b/vendor/phpmd/phpmd/LICENSE deleted file mode 100644 index d4e43ea..0000000 --- a/vendor/phpmd/phpmd/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2008, Manuel Pichler -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpmd/phpmd/README.rst b/vendor/phpmd/phpmd/README.rst deleted file mode 100644 index c45536f..0000000 --- a/vendor/phpmd/phpmd/README.rst +++ /dev/null @@ -1,204 +0,0 @@ -PHPMD -===== - -PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD. PHPMD can be seen as an user friendly frontend application for the raw metrics stream measured by PHP Depend. - -https://phpmd.org - -.. image:: https://poser.pugx.org/phpmd/phpmd/v/stable.svg - :target: https://packagist.org/packages/phpmd/phpmd - :alt: Latest Stable Version - -.. image:: https://poser.pugx.org/phpmd/phpmd/license.svg - :target: https://packagist.org/packages/phpmd/phpmd - :alt: License - -.. image:: https://travis-ci.org/phpmd/phpmd.svg?branch=master - :target: https://travis-ci.org/phpmd/phpmd - :alt: Travis Build Status - -.. image:: https://ci.appveyor.com/api/projects/status/pc08owbun2y00kwk?svg=true - :target: https://ci.appveyor.com/project/phpmd/phpmd - :alt: AppVeyor Build Status - -.. image:: https://scrutinizer-ci.com/g/phpmd/phpmd/badges/build.png?b=master - :target: https://scrutinizer-ci.com/g/phpmd/phpmd/build-status/master - :alt: Scrutinizer Build Status - -.. image:: https://scrutinizer-ci.com/g/phpmd/phpmd/badges/quality-score.png?b=master - :target: https://scrutinizer-ci.com/g/phpmd/phpmd/?branch=master - :alt: Scrutinizer Code Quality - -.. image:: https://badges.gitter.im/phpmd/community.svg - :target: https://gitter.im/phpmd/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge - :alt: Chat with us on Gitter - -.. image:: https://poser.pugx.org/phpmd/phpmd/d/monthly - :target: https://packagist.org/packages/phpmd/phpmd - :alt: Monthly downloads - -.. image:: https://poser.pugx.org/phpmd/phpmd/downloads - :target: https://packagist.org/packages/phpmd/phpmd - :alt: Total downloads - -Installation ------------- - -See https://phpmd.org/download/index.html - -Command line usage ------------------- - -Type ``phpmd [filename|directory] [report format] [ruleset file]``, i.e: :: - - mapi@arwen ~ $ phpmd php/PDepend/DbusUI/ xml rulesets.xml - -While the ``rulesets.xml`` ruleset file could look like this:: - - <?xml version="1.0"?> - <ruleset name="My first PHPMD rule set" - xmlns="http://pmd.sf.net/ruleset/1.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 - http://pmd.sf.net/ruleset_xml_schema.xsd" - xsi:noNamespaceSchemaLocation=" - http://pmd.sf.net/ruleset_xml_schema.xsd"> - <description> - My custom rule set that checks my code... - </description> - - <rule ref="rulesets/codesize.xml" /> - <rule ref="rulesets/cleancode.xml" /> - <rule ref="rulesets/controversial.xml" /> - <rule ref="rulesets/design.xml" /> - <rule ref="rulesets/naming.xml" /> - <rule ref="rulesets/unusedcode.xml" /> - </ruleset> - -The xml report would like like this:: - - <?xml version="1.0" encoding="UTF-8" ?> - <pmd version="0.0.1" timestamp="2009-12-19T22:17:18+01:00"> - <file name="/projects/pdepend/PHP/Depend/DbusUI/ResultPrinter.php"> - <violation beginline="81" - endline="81" - rule="UnusedFormalParameter" - ruleset="Unused Code Rules" - externalInfoUrl="https://phpmd.org/rules/unusedcode.html#unusedformalparameter" - priority="3"> - Avoid unused parameters such as '$builder'. - </violation> - </file> - </pmd> - -You can pass a file name or a directory name containing PHP source -code to PHPMD. - -The `PHPMD Phar distribution`__ includes the rule set files inside -its archive, even if the "rulesets/codesize.xml" parameter above looks -like a filesystem reference. - -__ https://phpmd.org/download/index.html - -Command line options --------------------- - -- Notice that the default output is in XML, so you can redirect it to - a file and XSLT it or whatever - -- You can also use shortened names to refer to the built-in rule sets, - like this: :: - - phpmd PHP/Depend/DbusUI/ xml codesize - -- The command line interface also accepts the following optional arguments: - - - ``--minimumpriority`` - The rule priority threshold; rules with lower - priority than they will not be used. - - - ``--reportfile`` - Sends the report output to the specified file, - instead of the default output target ``STDOUT``. - - - ``--suffixes`` - Comma-separated string of valid source code filename - extensions, e.g. php,phtml. - - - ``--exclude`` - Comma-separated string of patterns that are used to ignore - directories. - - - ``--strict`` - Also report those nodes with a @SuppressWarnings annotation. - - - ``--ignore-violations-on-exit`` - will exit with a zero code, even if any - violations are found. - - An example command line: :: - - phpmd PHP/Depend/DbusUI xml codesize --reportfile phpmd.xml --suffixes php,phtml - -Using multiple rule sets -```````````````````````` - -PHPMD uses so called rule sets that configure/define a set of rules which will -be applied against the source under test. The default distribution of PHPMD is -already shipped with a few default sets, that can be used out-of-box. You can -call PHPMD's cli tool with a set's name to apply this configuration: :: - - ~ $ phpmd /path/to/source text codesize - -But what if you would like to apply more than one rule set against your source? -You can also pass a list of rule set names, separated by comma to PHPMD's cli -tool: :: - - ~ $ phpmd /path/to/source text codesize,unusedcode,naming - -You can also mix custom `rule set files`__ with build-in rule sets: :: - - ~ $ phpmd /path/to/source text codesize,/my/rules.xml - -__ https://phpmd.org/documentation/creating-a-ruleset.html - -That's it. With this behavior you can specify you own combination of rule sets -that will check the source code. - -Using multiple source files and folders -``````````````````````````````````````` - -PHPMD also allowes you to specify multiple source directories in case you want -to create one output for certain parts of your code :: - - ~ $ phpmd /path/to/code,index.php,/another/place/with/code text codesize - -Exit codes ----------- - -PHPMD's command line tool currently defines three different exit codes. - -- *0*, This exit code indicates that everything worked as expected. This means - there was no error/exception and PHPMD hasn't detected any rule violation - in the code under test. -- *1*, This exit code indicates that an error/exception occured which has - interrupted PHPMD during execution. -- *2*, This exit code means that PHPMD has processed the code under test - without the occurence of an error/exception, but it has detected rule - violations in the analyzed source code. You can also prevent this behaviour - with the ``--ignore-violations-on-exit`` flag, which will result to a *0* - even if any violations are found. - -Renderers ---------- - -At the moment PHPMD comes with the following renderers: - -- *xml*, which formats the report as XML. -- *text*, simple textual format. -- *html*, single HTML file with possible problems. -- *json*, formats JSON report. -- *ansi*, a command line friendly format. - -PHPMD for enterprise --------------------- - -Available as part of the Tidelift Subscription. - -The maintainers of ``PHPMD`` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. `Learn more.`__ - -__ https://tidelift.com/subscription/pkg/packagist-phpmd-phpmd?utm_source=packagist-phpmd-phpmd&utm_medium=referral&utm_campaign=enterprise&utm_term=repo diff --git a/vendor/phpmd/phpmd/apigen.neon b/vendor/phpmd/phpmd/apigen.neon deleted file mode 100644 index c2a7bfe..0000000 --- a/vendor/phpmd/phpmd/apigen.neon +++ /dev/null @@ -1,18 +0,0 @@ -# ApiGen configuration - -source: - - src/main/php - -title: "PHPMD" - -templateTheme: bootstrap - -# Options -accessLevels: [public, protected] -sourceCode: true -download: false -php: false -debug: true -internal: true -deprecated: true -todo: true diff --git a/vendor/phpmd/phpmd/build.properties b/vendor/phpmd/phpmd/build.properties deleted file mode 100644 index ac3b295..0000000 --- a/vendor/phpmd/phpmd/build.properties +++ /dev/null @@ -1,22 +0,0 @@ -project.dir = -project.uri = phpmd.org -project.name = phpmd -project.version = 2.8.1 -project.stability = stable - -# Disable pear support -project.pear.uri = pear.example.com - -vendor.dir.includes = symfony/**/*,composer/**/*,pdepend/**/*,autoload.php -vendor.dir.excludes = symfony/**/Tests/**/* - -# Default coding standard -codesniffer.standard = PSR2 - -# Location of the version control system -project.scm.uri = github.com/${project.name}/${project.name}/commit - -# Execute the following command for pdepend profiling -profile.command = ${basedir}/src/bin/phpmd '/opt/Sources/PHP/Flow3/Packages/Framework' xml naming,codesize,unusedcode,design --reportfile pmd.xml - -phpunit.package.name = phpunit-4.8.28 diff --git a/vendor/phpmd/phpmd/composer.json b/vendor/phpmd/phpmd/composer.json deleted file mode 100644 index 9fc1437..0000000 --- a/vendor/phpmd/phpmd/composer.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "phpmd/phpmd", - "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", - "keywords": [ - "phpmd", - "pdepend", - "pmd", - "mess detection", - "mess detector" - ], - "type": "library", - "license": "BSD-3-Clause", - "homepage": "https://phpmd.org/", - "authors": [ - { - "name": "Manuel Pichler", - "homepage": "https://github.com/manuelpichler", - "email": "github@manuel-pichler.de", - "role": "Project Founder" - }, - { - "name": "Marc Würth", - "homepage": "https://github.com/ravage84", - "email": "ravage@bluewin.ch", - "role": "Project Maintainer" - }, - { - "name": "Other contributors", - "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", - "role": "Contributors" - } - ], - "support": { - "irc": "irc://irc.freenode.org/phpmd" - }, - "minimum-stability": "stable", - "require": { - "php": ">=5.3.9", - "pdepend/pdepend": "^2.7.1", - "ext-xml": "*", - "composer/xdebug-handler": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^5.7.27", - "squizlabs/php_codesniffer": "^2.0", - "mikey179/vfsstream": "^1.6.4", - "gregwar/rst": "^1.0", - "easy-doc/easy-doc": "0.0.0 || ^1.3.2" - }, - "autoload": { - "psr-0": { - "PHPMD\\": "src/main/php" - } - }, - "bin": [ - "src/bin/phpmd" - ], - "scripts": { - "test": "phpunit", - "cs-check": "phpcs -p --standard=PSR2 --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1 ./src/main/php ./src/test/php", - "cs-fix": "phpcbf -p --standard=PSR2 --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1 ./src/main/php ./src/test/php", - "build-website": "easy-doc build src/site/config.php --verbose" - } -} diff --git a/vendor/phpmd/phpmd/src/bin/phpmd b/vendor/phpmd/phpmd/src/bin/phpmd deleted file mode 100755 index 1a49de7..0000000 --- a/vendor/phpmd/phpmd/src/bin/phpmd +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env php -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -use Composer\XdebugHandler\XdebugHandler; -use PHPMD\TextUI\Command; - -if (file_exists(__DIR__ . '/../../../../autoload.php')) { - // phpmd is part of a composer installation - require_once __DIR__ . '/../../../../autoload.php'; -} else { - require_once __DIR__ . '/../../vendor/autoload.php'; - - // PEAR installation workaround - if (strpos('@package_version@', '@package_version') === 0) { - set_include_path( - dirname(__FILE__) . '/../main/php' . - PATH_SEPARATOR . - dirname(__FILE__) . '/../../vendor/pdepend/pdepend/src/main/php' . - PATH_SEPARATOR . - '.' - ); - } -} - -// Restart if xdebug is loading, unless the environment variable PHPMD_ALLOW_XDEBUG is set. -$xdebug = new XdebugHandler('PHPMD'); -$xdebug->check(); -unset($xdebug); - -if (!ini_get('date.timezone')) { - date_default_timezone_set('UTC'); -} - -class_alias('PHPMD\\AbstractNode', 'PHP_PMD_AbstractNode'); -class_alias('PHPMD\\AbstractRenderer', 'PHP_PMD_AbstractRenderer'); -class_alias('PHPMD\\AbstractRule', 'PHP_PMD_AbstractRule'); -class_alias('PHPMD\\Parser', 'PHP_PMD_Parser'); -class_alias('PHPMD\\ParserFactory', 'PHP_PMD_ParserFactory'); -class_alias('PHPMD\\ProcessingError', 'PHP_PMD_ProcessingError'); -class_alias('PHPMD\\Report', 'PHP_PMD_Report'); -class_alias('PHPMD\\Rule', 'PHP_PMD_Rule'); -class_alias('PHPMD\\RuleClassFileNotFoundException', 'PHP_PMD_RuleClassFileNotFoundException'); -class_alias('PHPMD\\RuleClassNotFoundException', 'PHP_PMD_RuleClassNotFoundException'); -class_alias('PHPMD\\RuleSet', 'PHP_PMD_RuleSet'); -class_alias('PHPMD\\RuleSetFactory', 'PHP_PMD_RuleSetFactory'); -class_alias('PHPMD\\RuleSetNotFoundException', 'PHP_PMD_RuleSetNotFoundException'); -class_alias('PHPMD\\RuleViolation', 'PHP_PMD_RuleViolation'); -class_alias('PHPMD\\Node\\AbstractCallableNode', 'PHP_PMD_Node_AbstractCallable'); -class_alias('PHPMD\\Node\\AbstractNode', 'PHP_PMD_Node_AbstractNode'); -class_alias('PHPMD\\Node\\AbstractTypeNode', 'PHP_PMD_Node_AbstractType'); -class_alias('PHPMD\\Node\\ASTNode', 'PHP_PMD_Node_ASTNode'); -class_alias('PHPMD\\Node\\Annotation', 'PHP_PMD_Node_Annotation'); -class_alias('PHPMD\\Node\\Annotations', 'PHP_PMD_Node_Annotations'); -class_alias('PHPMD\\Node\\ClassNode', 'PHP_PMD_Node_Class'); -class_alias('PHPMD\\Node\\FunctionNode', 'PHP_PMD_Node_Function'); -class_alias('PHPMD\\Node\\InterfaceNode', 'PHP_PMD_Node_Interface'); -class_alias('PHPMD\\Node\\MethodNode', 'PHP_PMD_Node_Method'); -class_alias('PHPMD\\Node\\TraitNode', 'PHP_PMD_Node_Trait'); -class_alias('PHPMD\\Renderer\\HTMLRenderer', 'PHP_PMD_Renderer_HTMLRenderer'); -class_alias('PHPMD\\Renderer\\TextRenderer', 'PHP_PMD_Renderer_TextRenderer'); -class_alias('PHPMD\\Renderer\\XMLRenderer', 'PHP_PMD_Renderer_XMLRenderer'); -class_alias('PHPMD\\Renderer\\JSONRenderer', 'PHP_PMD_Renderer_JSONRenderer'); -class_alias('PHPMD\\Rule\\AbstractLocalVariable', 'PHP_PMD_Rule_AbstractLocalVariable'); -class_alias('PHPMD\\Rule\\CyclomaticComplexity', 'PHP_PMD_Rule_CyclomaticComplexity'); -class_alias('PHPMD\\Rule\\ClassAware', 'PHP_PMD_Rule_IClassAware'); -class_alias('PHPMD\\Rule\\ExcessivePublicCount', 'PHP_PMD_Rule_ExcessivePublicCount'); -class_alias('PHPMD\\Rule\\FunctionAware', 'PHP_PMD_Rule_IFunctionAware'); -class_alias('PHPMD\\Rule\\InterfaceAware', 'PHP_PMD_Rule_IInterfaceAware'); -class_alias('PHPMD\\Rule\\MethodAware', 'PHP_PMD_Rule_IMethodAware'); -class_alias('PHPMD\\Rule\\UnusedFormalParameter', 'PHP_PMD_Rule_UnusedFormalParameter'); -class_alias('PHPMD\\Rule\\UnusedLocalVariable', 'PHP_PMD_Rule_UnusedLocalVariable'); -class_alias('PHPMD\\Rule\\UnusedPrivateField', 'PHP_PMD_Rule_UnusedPrivateField'); -class_alias('PHPMD\\Rule\\UnusedPrivateMethod', 'PHP_PMD_Rule_UnusedPrivateMethod'); -class_alias('PHPMD\\Rule\\CleanCode\\BooleanArgumentFlag', 'PHP_PMD_Rule_CleanCode_BooleanArgumentFlag'); -class_alias('PHPMD\\Rule\\CleanCode\\ElseExpression', 'PHP_PMD_Rule_CleanCode_ElseExpression'); -class_alias('PHPMD\\Rule\\CleanCode\\StaticAccess', 'PHP_PMD_Rule_CleanCode_StaticAccess'); -class_alias('PHPMD\\Rule\\CleanCode\\UndefinedVariable', 'PHP_PMD_Rule_CleanCode_UndefinedVariable'); -class_alias('PHPMD\\Rule\\Controversial\\CamelCaseClassName', 'PHP_PMD_Rule_Controversial_CamelCaseClassName'); -class_alias('PHPMD\\Rule\\Controversial\\CamelCaseMethodName', 'PHP_PMD_Rule_Controversial_CamelCaseMethodName'); -class_alias('PHPMD\\Rule\\Controversial\\CamelCaseParameterName', 'PHP_PMD_Rule_Controversial_CamelCaseParameterName'); -class_alias('PHPMD\\Rule\\Controversial\\CamelCasePropertyName', 'PHP_PMD_Rule_Controversial_CamelCasePropertyName'); -class_alias('PHPMD\\Rule\\Controversial\\CamelCaseVariableName', 'PHP_PMD_Rule_Controversial_CamelCaseVariableName'); -class_alias('PHPMD\\Rule\\Controversial\\Superglobals', 'PHP_PMD_Rule_Controversial_Superglobals'); -class_alias('PHPMD\\Rule\\Design\\CouplingBetweenObjects', 'PHP_PMD_Rule_Design_CouplingBetweenObjects'); -class_alias('PHPMD\\Rule\\Design\\DepthOfInheritance', 'PHP_PMD_Rule_Design_DepthOfInheritance'); -class_alias('PHPMD\\Rule\\Design\\EvalExpression', 'PHP_PMD_Rule_Design_EvalExpression'); -class_alias('PHPMD\\Rule\\Design\\ExitExpression', 'PHP_PMD_Rule_Design_ExitExpression'); -class_alias('PHPMD\\Rule\\Design\\GotoStatement', 'PHP_PMD_Rule_Design_GotoStatement'); -class_alias('PHPMD\\Rule\\Design\\LongClass', 'PHP_PMD_Rule_Design_LongClass'); -class_alias('PHPMD\\Rule\\Design\\LongMethod', 'PHP_PMD_Rule_Design_LongMethod'); -class_alias('PHPMD\\Rule\\Design\\LongParameterList', 'PHP_PMD_Rule_Design_LongParameterList'); -class_alias('PHPMD\\Rule\\Design\\NpathComplexity', 'PHP_PMD_Rule_Design_NpathComplexity'); -class_alias('PHPMD\\Rule\\Design\\NumberOfChildren', 'PHP_PMD_Rule_Design_NumberOfChildren'); -class_alias('PHPMD\\Rule\\Design\\TooManyFields', 'PHP_PMD_Rule_Design_TooManyFields'); -class_alias('PHPMD\\Rule\\Design\\TooManyMethods', 'PHP_PMD_Rule_Design_TooManyMethods'); -class_alias('PHPMD\\Rule\\Design\\WeightedMethodCount', 'PHP_PMD_Rule_Design_WeightedMethodCount'); -class_alias('PHPMD\\Rule\\Naming\\BooleanGetMethodName', 'PHP_PMD_Rule_Naming_BooleanGetMethodName'); -class_alias('PHPMD\\Rule\\Naming\\ConstantNamingConventions', 'PHP_PMD_Rule_Naming_ConstantNamingConventions'); -class_alias('PHPMD\\Rule\\Naming\\ConstructorWithNameAsEnclosingClass', 'PHP_PMD_Rule_Naming_ConstructorWithNameAsEnclosingClass'); -class_alias('PHPMD\\Rule\\Naming\\LongVariable', 'PHP_PMD_Rule_Naming_LongVariable'); -class_alias('PHPMD\\Rule\\Naming\\ShortMethodName', 'PHP_PMD_Rule_Naming_ShortMethodName'); -class_alias('PHPMD\\Rule\\Naming\\ShortVariable', 'PHP_PMD_Rule_Naming_ShortVariable'); -class_alias('PHPMD\\TextUI\\Command', 'PHP_PMD_TextUI_Command'); -class_alias('PHPMD\\TextUI\\CommandLineOptions', 'PHP_PMD_TextUI_CommandLineOptions'); -class_alias('PHPMD\\Writer\\StreamWriter', 'PHP_PMD_Writer_Stream'); - -// Allow as much memory as possible by default -if (extension_loaded('suhosin') && is_numeric(ini_get('suhosin.memory_limit'))) { - $limit = ini_get('memory_limit'); - if (preg_match('(^(\d+)([BKMGT]))', $limit, $match)) { - $shift = array('B' => 0, 'K' => 10, 'M' => 20, 'G' => 30, 'T' => 40); - $limit = ($match[1] * (1 << $shift[$match[2]])); - } - if (ini_get('suhosin.memory_limit') > $limit && $limit > -1) { - ini_set('memory_limit', ini_get('suhosin.memory_limit')); - } -} else { - ini_set('memory_limit', -1); -} - -// Check php setup for cli arguments -if (!isset($_SERVER['argv']) && !isset($argv)) { - fwrite(STDERR, 'Please enable the "register_argc_argv" directive in your php.ini', PHP_EOL); - exit(1); -} else if (!isset($argv)) { - $argv = $_SERVER['argv']; -} - -// Run command line interface -exit(Command::main($argv)); diff --git a/vendor/phpmd/phpmd/src/bin/phpmd.bat b/vendor/phpmd/phpmd/src/bin/phpmd.bat deleted file mode 100644 index f3a3ec8..0000000 --- a/vendor/phpmd/phpmd/src/bin/phpmd.bat +++ /dev/null @@ -1,22 +0,0 @@ -@echo off -REM This file is part of PHP Mess Detector. -REM -REM Copyright (c) Manuel Pichler <mapi@phpmd.org>. -REM All rights reserved. -REM -REM Licensed under BSD License -REM For full copyright and license information, please see the LICENSE file. -REM Redistributions of files must retain the above copyright notice. -REM -REM @author Manuel Pichler <mapi@phpmd.org> -REM @copyright Manuel Pichler. All rights reserved. -REM @license https://opensource.org/licenses/bsd-license.php BSD License -REM @link http://phpmd.org/ - -if "%PHPBIN%" == "" set PHPBIN=@php_bin@ -if not exist "%PHPBIN%" if "%PHP_PEAR_PHP_BIN%" neq "" goto USE_PEAR_PATH -GOTO RUN -:USE_PEAR_PATH -set PHPBIN=%PHP_PEAR_PHP_BIN% -:RUN -"%PHPBIN%" "@bin_dir@\phpmd" %* diff --git a/vendor/phpmd/phpmd/src/conf/phar_bootstrap.stub b/vendor/phpmd/phpmd/src/conf/phar_bootstrap.stub deleted file mode 100644 index b8e657f..0000000 --- a/vendor/phpmd/phpmd/src/conf/phar_bootstrap.stub +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env php -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -/** - * Define global constant that marks this as PHPMD phar release. - */ -define('PHP_PMD_RELEASE', 'phar'); - -Phar::mapPhar('${archive.alias}'); - -// Configure include path to use this phar -set_include_path('phar://${archive.alias}/' . PATH_SEPARATOR . get_include_path()); - -if (isset($argv) && realpath($argv[0]) === __FILE__) { - // Load command line utility - include_once 'phar://${archive.alias}/vendor/autoload.php'; - - // Run command line interface - exit(\PHPMD\TextUI\Command::main($argv)); -} - -__HALT_COMPILER(); diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractNode.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractNode.php deleted file mode 100644 index f4c2630..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractNode.php +++ /dev/null @@ -1,276 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -use PHPMD\Node\ASTNode; - -/** - * This is an abstract base class for PHPMD code nodes, it is just a wrapper - * around PDepend's object model. - */ -abstract class AbstractNode -{ - /** - * @var \PDepend\Source\AST\ASTArtifact|\PDepend\Source\AST\ASTNode $node - */ - private $node = null; - - /** - * The collected metrics for this node. - * - * @var array<string, mixed> - */ - private $metrics = null; - - /** - * Constructs a new PHPMD node. - * - * @param \PDepend\Source\AST\ASTArtifact|\PDepend\Source\AST\ASTNode $node - */ - public function __construct($node) - { - $this->node = $node; - } - - /** - * The magic call method is used to pipe requests from rules direct - * to the underlying PDepend AST node. - * - * @param string $name - * @param array $args - * @return mixed - * @throws \BadMethodCallException When the underlying PDepend node - * does not contain a method named <b>$name</b>. - */ - public function __call($name, array $args) - { - $node = $this->getNode(); - if (!method_exists($node, $name)) { - throw new \BadMethodCallException( - sprintf('Invalid method %s() called.', $name) - ); - } - return call_user_func_array(array($node, $name), $args); - } - - /** - * Returns the parent of this node or <b>null</b> when no parent node - * exists. - * - * @return ASTNode - */ - public function getParent() - { - if (($node = $this->node->getParent()) === null) { - return null; - } - return new ASTNode($node, $this->getFileName()); - } - - /** - * Returns a child node at the given index. - * - * @param integer $index The child offset. - * @return \PHPMD\Node\ASTNode - */ - public function getChild($index) - { - return new ASTNode( - $this->node->getChild($index), - $this->getFileName() - ); - } - - /** - * Returns the first child of the given type or <b>null</b> when this node - * has no child of the given type. - * - * @param string $type The searched child type. - * @return \PHPMD\AbstractNode - */ - public function getFirstChildOfType($type) - { - $node = $this->node->getFirstChildOfType('PDepend\Source\AST\AST' . $type); - if ($node === null) { - return null; - } - return new ASTNode($node, $this->getFileName()); - } - - /** - * Searches recursive for all children of this node that are of the given - * type. - * - * @param string $type The searched child type. - * @return \PHPMD\AbstractNode[] - */ - public function findChildrenOfType($type) - { - $children = $this->node->findChildrenOfType('PDepend\Source\AST\AST' . $type); - - $nodes = array(); - foreach ($children as $child) { - $nodes[] = new ASTNode($child, $this->getFileName()); - } - return $nodes; - } - - /** - * Tests if this node represents the the given type. - * - * @param string $type The expected node type. - * @return boolean - */ - public function isInstanceOf($type) - { - $class = 'PDepend\Source\AST\AST' . $type; - return ($this->node instanceof $class); - } - - /** - * Returns the image of the underlying node. - * - * @return string - */ - public function getImage() - { - return $this->node->getName(); - } - - /** - * Returns the source name for this node, maybe a class or interface name, - * or a package, method, function name. - * - * @return string - */ - public function getName() - { - return $this->node->getName(); - } - - /** - * Returns the begin line for this node in the php source code file. - * - * @return integer - */ - public function getBeginLine() - { - return $this->node->getStartLine(); - } - - /** - * Returns the end line for this node in the php source code file. - * - * @return integer - */ - public function getEndLine() - { - return $this->node->getEndLine(); - } - - /** - * Returns the name of the declaring source file. - * - * @return string - */ - public function getFileName() - { - return (string) $this->node->getCompilationUnit()->getFileName(); - } - - /** - * Returns the wrapped PDepend node instance. - * - * @return \PDepend\Source\AST\ASTArtifact - */ - public function getNode() - { - return $this->node; - } - - /** - * Returns a textual representation/name for the concrete node type. - * - * @return string - */ - public function getType() - { - $type = explode('\\', get_class($this)); - return preg_replace('(node$)', '', strtolower(array_pop($type))); - } - - /** - * This method will return the metric value for the given identifier or - * <b>null</b> when no such metric exists. - * - * @param string $name The metric name or abbreviation. - * @return mixed - */ - public function getMetric($name) - { - if (isset($this->metrics[$name])) { - return $this->metrics[$name]; - } - return null; - } - - /** - * This method will set the metrics for this node. - * - * @param array<string, mixed> $metrics The collected node metrics. - * @return void - */ - public function setMetrics(array $metrics) - { - if ($this->metrics === null) { - $this->metrics = $metrics; - } - } - - /** - * Checks if this node has a suppressed annotation for the given rule - * instance. - * - * @param \PHPMD\Rule $rule - * @return boolean - */ - abstract public function hasSuppressWarningsAnnotationFor(Rule $rule); - - /** - * Returns the full qualified name of a class, an interface, a method or - * a function. - * - * @return string - */ - abstract public function getFullQualifiedName(); - - /** - * Returns the name of the parent type or <b>null</b> when this node has no - * parent type. - * - * @return string - */ - abstract public function getParentName(); - - /** - * Returns the name of the parent package. - * - * @return string - */ - abstract public function getNamespaceName(); -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractRenderer.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractRenderer.php deleted file mode 100644 index 9c31a16..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractRenderer.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -/** - * Abstract base class for PHPMD rendering engines. - */ -abstract class AbstractRenderer -{ - /** - * The associated output writer instance. - * - * @var \PHPMD\AbstractWriter - */ - private $writer = null; - - /** - * Returns the associated output writer instance. - * - * @return \PHPMD\AbstractWriter - */ - public function getWriter() - { - return $this->writer; - } - - /** - * Returns the associated output writer instance. - * - * @param \PHPMD\AbstractWriter $writer - * @return void - */ - public function setWriter(AbstractWriter $writer) - { - $this->writer = $writer; - } - - /** - * This method will be called on all renderers before the engine starts the - * real report processing. - * - * @return void - */ - public function start() - { - // Just a hook - } - - /** - * This method will be called when the engine has finished the source analysis - * phase. - * - * @param \PHPMD\Report $report - * @return void - */ - abstract public function renderReport(Report $report); - - /** - * This method will be called the engine has finished the report processing - * for all registered renderers. - * - * @return void - */ - public function end() - { - // Just a hook - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractRule.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractRule.php deleted file mode 100644 index 5abcecf..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractRule.php +++ /dev/null @@ -1,399 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -use PHPMD\Node\ClassNode; - -/** - * This is the abstract base class for pmd rules. - * - * @SuppressWarnings(PHPMD) - */ -abstract class AbstractRule implements Rule -{ - /** - * The name for this rule instance. - * - * @var string $_name - */ - private $name = ''; - - /** - * The violation message text for this rule. - * - * @var string - */ - private $message = ''; - - /** - * The version since when this rule is available. - * - * @var string - */ - private $since = null; - - /** - * An url will external information for this rule. - * - * @var string - */ - private $externalInfoUrl = ''; - - /** - * An optional description for this rule. - * - * @var string - */ - private $description = ''; - - /** - * A list of code examples for this rule. - * - * @var array(string) - */ - private $examples = array(); - - /** - * The name of the parent rule-set instance. - * - * @var string - */ - private $ruleSetName = ''; - - /** - * The priority of this rule. - * - * @var integer - */ - private $priority = self::LOWEST_PRIORITY; - - /** - * Configuration properties for this rule instance. - * - * @var array(string=>string) - */ - private $properties = array(); - - /** - * The report for object for this rule. - * - * @var \PHPMD\Report - */ - private $report = null; - - /** - * Returns the name for this rule instance. - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the name for this rule instance. - * - * @param string $name The rule name. - * @return void - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Returns the version since when this rule is available or <b>null</b>. - * - * @return string - */ - public function getSince() - { - return $this->since; - } - - /** - * Sets the version since when this rule is available. - * - * @param string $since The version number. - * @return void - */ - public function setSince($since) - { - $this->since = $since; - } - - /** - * Returns the violation message text for this rule. - * - * @return string - */ - public function getMessage() - { - return $this->message; - } - - /** - * Sets the violation message text for this rule. - * - * @param string $message The violation message - * @return void - */ - public function setMessage($message) - { - $this->message = $message; - } - - /** - * Returns an url will external information for this rule. - * - * @return string - */ - public function getExternalInfoUrl() - { - return $this->externalInfoUrl; - } - - /** - * Sets an url will external information for this rule. - * - * @param string $externalInfoUrl The info url. - * @return void - */ - public function setExternalInfoUrl($externalInfoUrl) - { - $this->externalInfoUrl = $externalInfoUrl; - } - - /** - * Returns the description text for this rule instance. - * - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * Sets the description text for this rule instance. - * - * @param string $description The description text. - * @return void - */ - public function setDescription($description) - { - $this->description = $description; - } - - /** - * Returns a list of examples for this rule. - * - * @return string[] - */ - public function getExamples() - { - return $this->examples; - } - - /** - * Adds a code example for this rule. - * - * @param string $example The code example. - * @return void - */ - public function addExample($example) - { - $this->examples[] = $example; - } - - /** - * Returns the priority of this rule. - * - * @return integer - */ - public function getPriority() - { - return $this->priority; - } - - /** - * Set the priority of this rule. - * - * @param integer $priority The rule priority - * @return void - */ - public function setPriority($priority) - { - $this->priority = $priority; - } - - /** - * Returns the name of the parent rule-set instance. - * - * @return string - */ - public function getRuleSetName() - { - return $this->ruleSetName; - } - - /** - * Sets the name of the parent rule set instance. - * - * @param string $ruleSetName The rule-set name. - * @return void - */ - public function setRuleSetName($ruleSetName) - { - $this->ruleSetName = $ruleSetName; - } - - /** - * Returns the violation report for this rule. - * - * @return \PHPMD\Report - */ - public function getReport() - { - return $this->report; - } - - /** - * Sets the violation report for this rule. - * - * @param \PHPMD\Report $report - * @return void - */ - public function setReport(Report $report) - { - $this->report = $report; - } - - /** - * Adds a configuration property to this rule instance. - * - * @param string $name - * @param string $value - * @return void - */ - public function addProperty($name, $value) - { - $this->properties[$name] = $value; - } - - /** - * Returns the value of a configured property as a boolean or throws an - * exception when no property with <b>$name</b> exists. - * - * @param string $name - * @return boolean - * @throws \OutOfBoundsException When no property for <b>$name</b> exists. - */ - public function getBooleanProperty($name) - { - if (isset($this->properties[$name])) { - return in_array($this->properties[$name], array('true', 'on', 1)); - } - throw new \OutOfBoundsException('Property "' . $name . '" does not exist.'); - } - - /** - * Returns the value of a configured property as an integer or throws an - * exception when no property with <b>$name</b> exists. - * - * @param string $name - * @return integer - * @throws \OutOfBoundsException When no property for <b>$name</b> exists. - */ - public function getIntProperty($name) - { - if (isset($this->properties[$name])) { - return (int) $this->properties[$name]; - } - throw new \OutOfBoundsException('Property "' . $name . '" does not exist.'); - } - - /** - * Returns the raw string value of a configured property or throws an - * exception when no property with <b>$name</b> exists. - * - * @param string $name - * @return string - * @throws \OutOfBoundsException When no property for <b>$name</b> exists. - */ - public function getStringProperty($name) - { - if (isset($this->properties[$name])) { - return $this->properties[$name]; - } - throw new \OutOfBoundsException('Property "' . $name . '" does not exist.'); - } - - /** - * This method adds a violation to all reports for this violation type and - * for the given <b>$node</b> instance. - * - * @param \PHPMD\AbstractNode $node - * @param array $args - * @param mixed $metric - * @return void - */ - protected function addViolation( - AbstractNode $node, - array $args = array(), - $metric = null - ) { - $search = array(); - $replace = array(); - foreach ($args as $index => $value) { - $search[] = '{' . $index . '}'; - $replace[] = $value; - } - - $message = str_replace($search, $replace, $this->message); - - $ruleViolation = new RuleViolation($this, $node, $message, $metric); - $this->report->addRuleViolation($ruleViolation); - } - - /** - * Apply the current rule on each method of a class node. - * - * @param ClassNode $node class node containing methods. - */ - protected function applyOnClassMethods(ClassNode $node) - { - foreach ($node->getMethods() as $method) { - if ($method->hasSuppressWarningsAnnotationFor($this)) { - continue; - } - - $this->apply($method); - } - } - - /** - * This method should implement the violation analysis algorithm of concrete - * rule implementations. All extending classes must implement this method. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - abstract public function apply(AbstractNode $node); -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractWriter.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractWriter.php deleted file mode 100644 index da0ca72..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/AbstractWriter.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -/** - * This is abstract base class for an output writer. - */ -abstract class AbstractWriter -{ - /** - * Writes a data string to the concrete output. - * - * @param string $data - * @return void - */ - abstract public function write($data); -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/ASTNode.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/ASTNode.php deleted file mode 100644 index 4b468e6..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/ASTNode.php +++ /dev/null @@ -1,122 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Node; - -use PHPMD\Rule; - -/** - * Wrapper around a PHP_Depend ast node. - */ -class ASTNode extends \PHPMD\AbstractNode -{ - /** - * The source file of this node. - * - * @var string - */ - private $fileName = null; - - /** - * Constructs a new ast node instance. - * - * @param \PDepend\Source\AST\ASTNode $node - * @param string $fileName - */ - public function __construct(\PDepend\Source\AST\ASTNode $node, $fileName) - { - parent::__construct($node); - - $this->fileName = $fileName; - } - - /** - * Checks if this node has a suppressed annotation for the given rule - * instance. - * - * @param \PHPMD\Rule $rule - * @return boolean - * @SuppressWarnings("PMD.UnusedFormalParameter") - */ - public function hasSuppressWarningsAnnotationFor(Rule $rule) - { - return false; - } - - /** - * Returns the source name for this node, maybe a class or interface name, - * or a package, method, function name. - * - * @return string - */ - public function getName() - { - return $this->getImage(); - } - - /** - * Returns the image of the underlying node. - * - * @return string - */ - public function getImage() - { - return $this->getNode()->getImage(); - } - - /** - * Returns the name of the declaring source file. - * - * @return string - */ - public function getFileName() - { - return $this->fileName; - } - - /** - * Returns the name of the parent type or <b>null</b> when this node has no - * parent type. - * - * @return string - */ - public function getParentName() - { - return null; - } - - /** - * Returns the name of the parent namespace. - * - * @return string - */ - public function getNamespaceName() - { - return null; - } - - /** - * Returns the full qualified name of a class, an interface, a method or - * a function. - * - * @return string - */ - public function getFullQualifiedName() - { - return null; - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractCallableNode.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractCallableNode.php deleted file mode 100644 index efb1690..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractCallableNode.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Node; - -use PDepend\Source\AST\AbstractASTCallable; - -/** - * Abstract base class for PHP_Depend function and method wrappers. - */ -abstract class AbstractCallableNode extends AbstractNode -{ - /** - * Constructs a new callable wrapper. - * - * @param \PDepend\Source\AST\AbstractASTCallable $node - */ - public function __construct(AbstractASTCallable $node) - { - parent::__construct($node); - } - - /** - * Returns the number of parameters in the callable signature. - * - * @return integer - */ - public function getParameterCount() - { - return count($this->getNode()->getParameters()); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractNode.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractNode.php deleted file mode 100644 index 0af8f25..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractNode.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Node; - -use PHPMD\Rule; - -/** - * Abstract base class for all code nodes. - */ -abstract class AbstractNode extends \PHPMD\AbstractNode -{ - /** - * Annotations associated with node instance. - * - * @var \PHPMD\Node\Annotations - */ - private $annotations = null; - - /** - * Checks if this node has a suppressed annotation for the given rule - * instance. - * - * @param \PHPMD\Rule $rule - * @return boolean - */ - public function hasSuppressWarningsAnnotationFor(Rule $rule) - { - if ($this->annotations === null) { - $this->annotations = new Annotations($this); - } - return $this->annotations->suppresses($rule); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractTypeNode.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractTypeNode.php deleted file mode 100644 index 0ec438c..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/AbstractTypeNode.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Node; - -use PDepend\Source\AST\AbstractASTClassOrInterface; - -/** - * Abstract base class for classes and interfaces. - */ -abstract class AbstractTypeNode extends AbstractNode -{ - /** - * @var \PDepend\Source\AST\AbstractASTClassOrInterface - */ - private $node; - - /** - * Constructs a new generic class or interface node. - * - * @param \PDepend\Source\AST\AbstractASTClassOrInterface $node - */ - public function __construct(AbstractASTClassOrInterface $node) - { - parent::__construct($node); - - $this->node = $node; - } - - /** - * Returns an <b>array</b> with all methods defined in the context class or - * interface. - * - * @return \PHPMD\Node\MethodNode[] - */ - public function getMethods() - { - $methods = array(); - foreach ($this->node->getMethods() as $method) { - $methods[] = new MethodNode($method); - } - return $methods; - } - - /** - * Returns an array with the names of all methods within this class or - * interface node. - * - * @return string[] - */ - public function getMethodNames() - { - $names = array(); - foreach ($this->node->getMethods() as $method) { - $names[] = $method->getName(); - } - return $names; - } - - /** - * Returns the number of constants declared in this type. - * - * @return integer - */ - public function getConstantCount() - { - return count($this->node->getConstants()); - } - - /** - * Returns the name of the parent namespace. - * - * @return string - */ - public function getNamespaceName() - { - return $this->node->getNamespace()->getName(); - } - - /** - * Returns the name of the parent type or <b>null</b> when this node has no - * parent type. - * - * @return string - */ - public function getParentName() - { - return null; - } - - /** - * Returns the full qualified name of a class, an interface, a method or - * a function. - * - * @return string - */ - public function getFullQualifiedName() - { - return sprintf('%s\\%s', $this->getNamespaceName(), $this->getName()); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/Annotation.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/Annotation.php deleted file mode 100644 index 735b8dc..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/Annotation.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Node; - -use PHPMD\Rule; - -/** - * Simple code annotation class. - */ -class Annotation -{ - /** - * Name of the suppress warnings annotation. - */ - const SUPPRESS_ANNOTATION = 'suppressWarnings'; - - /** - * The annotation name. - * - * @var string - */ - private $name = null; - - /** - * The annotation value. - * - * @var string - */ - private $value = null; - - /** - * Constructs a new annotation instance. - * - * @param string $name - * @param string $value - */ - public function __construct($name, $value) - { - $this->name = $name; - $this->value = trim($value, '" '); - } - - /** - * Checks if this annotation suppresses the given rule. - * - * @param \PHPMD\Rule $rule - * @return boolean - */ - public function suppresses(Rule $rule) - { - if (lcfirst($this->name) === self::SUPPRESS_ANNOTATION) { - return $this->isSuppressed($rule); - } - return false; - } - - /** - * Checks if this annotation suppresses the given rule. - * - * @param \PHPMD\Rule $rule - * @return boolean - */ - private function isSuppressed(Rule $rule) - { - if (in_array($this->value, array('PHPMD', 'PMD'))) { - return true; - } elseif (preg_match('/^(PH)?PMD\.' . $rule->getName() . '/', $this->value)) { - return true; - } - return (stripos($rule->getName(), $this->value) !== false); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/Annotations.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/Annotations.php deleted file mode 100644 index 4b921e7..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/Annotations.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Node; - -use PHPMD\Rule; - -/** - * Collection of code annotations. - */ -class Annotations -{ - /** - * Detected annotations. - * - * @var \PHPMD\Node\Annotation[] - */ - private $annotations = array(); - - /** - * Regexp used to extract code annotations. - * - * @var string - */ - private $regexp = '(@([a-z_][a-z0-9_]+)\(([^\)]+)\))i'; - - /** - * Constructs a new collection instance. - * - * @param \PHPMD\AbstractNode $node - */ - public function __construct(\PHPMD\AbstractNode $node) - { - preg_match_all($this->regexp, $node->getDocComment(), $matches); - foreach (array_keys($matches[0]) as $i) { - $name = $matches[1][$i]; - $value = trim($matches[2][$i], '" '); - - $this->annotations[] = new Annotation($name, $value); - } - } - - /** - * Checks if one of the annotations suppresses the given rule. - * - * @param \PHPMD\Rule $rule - * @return boolean - */ - public function suppresses(Rule $rule) - { - foreach ($this->annotations as $annotation) { - if ($annotation->suppresses($rule)) { - return true; - } - } - return false; - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/ClassNode.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/ClassNode.php deleted file mode 100644 index 5eb23cf..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/ClassNode.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Node; - -use PDepend\Source\AST\ASTClass; - -/** - * Wrapper around PHP_Depend's class objects. - */ -class ClassNode extends AbstractTypeNode -{ - /** - * The type of this class. - */ - const CLAZZ = __CLASS__; - - /** - * Constructs a new class wrapper node. - * - * @param \PDepend\Source\AST\ASTClass $node - */ - public function __construct(ASTClass $node) - { - parent::__construct($node); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/FunctionNode.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/FunctionNode.php deleted file mode 100644 index 8646d87..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/FunctionNode.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Node; - -use PDepend\Source\AST\ASTFunction; - -/** - * Wrapper around a PDepend function node. - */ -class FunctionNode extends AbstractCallableNode -{ - /** - * Constructs a new function wrapper. - * - * @param \PDepend\Source\AST\ASTFunction $node - */ - public function __construct(ASTFunction $node) - { - parent::__construct($node); - } - - /** - * Returns the name of the parent package. - * - * @return string - */ - public function getNamespaceName() - { - return $this->getNode()->getNamespace()->getName(); - } - - /** - * Returns the name of the parent type or <b>null</b> when this node has no - * parent type. - * - * @return string - */ - public function getParentName() - { - return null; - } - - /** - * Returns the full qualified name of a class, an interface, a method or - * a function. - * - * @return string - */ - public function getFullQualifiedName() - { - return sprintf('%s\\%s()', $this->getNamespaceName(), $this->getName()); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/InterfaceNode.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/InterfaceNode.php deleted file mode 100644 index 379077b..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/InterfaceNode.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Node; - -use PDepend\Source\AST\ASTInterface; - -/** - * Wrapper around PHP_Depend's interface objects. - */ -class InterfaceNode extends AbstractTypeNode -{ - /** - * Constructs a new interface wrapper instance. - * - * @param \PDepend\Source\AST\ASTInterface $node - */ - public function __construct(ASTInterface $node) - { - parent::__construct($node); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/MethodNode.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/MethodNode.php deleted file mode 100644 index 0645056..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/MethodNode.php +++ /dev/null @@ -1,159 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Node; - -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTTrait; -use PHPMD\Rule; - -/** - * Wrapper around a PHP_Depend method node. - * - * Methods available on $node via PHPMD\AbstractNode::__call - * - * @method bool isPrivate() Returns true if this node is marked as private. - */ -class MethodNode extends AbstractCallableNode -{ - /** - * Constructs a new method wrapper. - * - * @param \PDepend\Source\AST\ASTMethod $node - */ - public function __construct(ASTMethod $node) - { - parent::__construct($node); - } - - /** - * Returns the name of the parent package. - * - * @return string - */ - public function getNamespaceName() - { - return $this->getNode()->getParent()->getNamespace()->getName(); - } - - /** - * Returns the name of the parent type or <b>null</b> when this node has no - * parent type. - * - * @return string - */ - public function getParentName() - { - return $this->getNode()->getParent()->getName(); - } - - /** - * Returns the full qualified name of a class, an interface, a method or - * a function. - * - * @return string - */ - public function getFullQualifiedName() - { - return sprintf( - '%s\\%s::%s()', - $this->getNamespaceName(), - $this->getParentName(), - $this->getName() - ); - } - - /** - * Returns <b>true</b> when the underlying method is declared as abstract or - * is declared as child of an interface. - * - * @return boolean - */ - public function isAbstract() - { - return $this->getNode()->isAbstract(); - } - - /** - * Checks if this node has a suppressed annotation for the given rule - * instance. - * - * @param \PHPMD\Rule $rule - * @return boolean - */ - public function hasSuppressWarningsAnnotationFor(Rule $rule) - { - if (parent::hasSuppressWarningsAnnotationFor($rule)) { - return true; - } - return $this->getParentType()->hasSuppressWarningsAnnotationFor($rule); - } - - /** - * Returns the parent class or interface instance. - * - * @return \PHPMD\Node\AbstractTypeNode - */ - public function getParentType() - { - $parentNode = $this->getNode()->getParent(); - - if ($parentNode instanceof ASTTrait) { - return new TraitNode($parentNode); - } - - if ($parentNode instanceof ASTClass) { - return new ClassNode($parentNode); - } - - return new InterfaceNode($parentNode); - } - - /** - * Returns <b>true</b> when this method is the initial method declaration. - * Otherwise this method will return <b>false</b>. - * - * @return boolean - * @since 1.2.1 - */ - public function isDeclaration() - { - if ($this->isPrivate()) { - return true; - } - - $methodName = strtolower($this->getName()); - - $parentNode = $this->getNode()->getParent(); - foreach ($parentNode->getInterfaces() as $parentType) { - $methods = $parentType->getAllMethods(); - if (isset($methods[$methodName])) { - return false; - } - } - - if (is_object($parentType = $parentNode->getParentClass())) { - $methods = $parentType->getAllMethods(); - if (isset($methods[$methodName])) { - return false; - } - } - - return true; - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/TraitNode.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/TraitNode.php deleted file mode 100644 index dcbd29d..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Node/TraitNode.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Node; - -use PDepend\Source\AST\ASTTrait; - -/** - * Wrapper around PHP_Depend's interface objects. - */ -class TraitNode extends AbstractTypeNode -{ - /** - * Constructs a new interface wrapper instance. - * - * @param \PDepend\Source\AST\ASTTrait $node - */ - public function __construct(ASTTrait $node) - { - parent::__construct($node); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/PHPMD.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/PHPMD.php deleted file mode 100644 index ce9a71d..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/PHPMD.php +++ /dev/null @@ -1,209 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -/** - * This is the main facade of the PHP PMD application - */ -class PHPMD -{ - /** - * The current PHPMD version. - */ - const VERSION = '@project.version@'; - - /** - * List of valid file extensions for analyzed files. - * - * @var array(string) - */ - private $fileExtensions = array('php', 'php3', 'php4', 'php5', 'inc'); - - /** - * List of exclude directory patterns. - * - * @var array(string) - */ - private $ignorePatterns = array('.git', '.svn', 'CVS', '.bzr', '.hg', 'SCCS'); - - /** - * The input source file or directory. - * - * @var string - */ - private $input; - - /** - * This property will be set to <b>true</b> when an error or a violation - * was found in the processed source code. - * - * @var boolean - * @since 0.2.5 - */ - private $violations = false; - - /** - * Additional options for PHPMD or one of it's parser backends. - * - * @var array - * @since 1.2.0 - */ - private $options = array(); - - /** - * This method will return <b>true</b> when the processed source code - * contains violations. - * - * @return boolean - * @since 0.2.5 - */ - public function hasViolations() - { - return $this->violations; - } - - /** - * Returns the input source file or directory path. - * - * @return string - */ - public function getInput() - { - return $this->input; - } - - /** - * Returns an array with valid php source file extensions. - * - * @return string[] - * @since 0.2.0 - */ - public function getFileExtensions() - { - return $this->fileExtensions; - } - - /** - * Sets a list of filename extensions for valid php source code files. - * - * @param array<string> $fileExtensions Extensions without leading dot. - * @return void - */ - public function setFileExtensions(array $fileExtensions) - { - $this->fileExtensions = $fileExtensions; - } - - /** - * Returns an array with string patterns that mark a file path as invalid. - * - * @return string[] - * @since 0.2.0 - */ - public function getIgnorePattern() - { - return $this->ignorePatterns; - } - - /** - * Sets a list of ignore patterns that is used to exclude directories from - * the source analysis. - * - * @param array<string> $ignorePatterns List of ignore patterns. - * @return void - */ - public function setIgnorePattern(array $ignorePatterns) - { - $this->ignorePatterns = array_merge( - $this->ignorePatterns, - $ignorePatterns - ); - } - - /** - * Returns additional options for PHPMD or one of it's parser backends. - * - * @return array - */ - public function getOptions() - { - return $this->options; - } - - /** - * Sets additional options for PHPMD or one of it's parser backends. - * - * @param array $options Additional backend or PHPMD options. - * @return void - */ - public function setOptions(array $options) - { - $this->options = $options; - } - - /** - * This method will process all files that can be found in the given input - * path. It will apply rules defined in the comma-separated <b>$ruleSets</b> - * argument. The result will be passed to all given renderer instances. - * - * @param string $inputPath - * @param string $ruleSets - * @param \PHPMD\AbstractRenderer[] $renderers - * @param \PHPMD\RuleSetFactory $ruleSetFactory - * @return void - */ - public function processFiles( - $inputPath, - $ruleSets, - array $renderers, - RuleSetFactory $ruleSetFactory - ) { - - // Merge parsed excludes - $this->ignorePatterns = array_merge($this->ignorePatterns, $ruleSetFactory->getIgnorePattern($ruleSets)); - - $this->input = $inputPath; - - $report = new Report(); - - $factory = new ParserFactory(); - $parser = $factory->create($this); - - foreach ($ruleSetFactory->createRuleSets($ruleSets) as $ruleSet) { - $parser->addRuleSet($ruleSet); - } - - $report->start(); - $parser->parse($report); - $report->end(); - - foreach ($renderers as $renderer) { - $renderer->start(); - } - - foreach ($renderers as $renderer) { - $renderer->renderReport($report); - } - - foreach ($renderers as $renderer) { - $renderer->end(); - } - - $this->violations = !$report->isEmpty(); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Parser.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Parser.php deleted file mode 100644 index 3ceaf7c..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Parser.php +++ /dev/null @@ -1,280 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -use PDepend\Engine; -use PDepend\Report\CodeAwareGenerator; -use PDepend\Source\ASTVisitor\AbstractASTVisitor; -use PDepend\Metrics\Analyzer; -use PDepend\Source\AST\ASTClass; -use PDepend\Source\AST\ASTMethod; -use PDepend\Source\AST\ASTInterface; -use PDepend\Source\AST\ASTFunction; -use PDepend\Source\AST\ASTArtifactList; -use PHPMD\Node\ClassNode; -use PHPMD\Node\FunctionNode; -use PHPMD\Node\InterfaceNode; -use PHPMD\Node\MethodNode; - -/** - * Simple wrapper around the php depend engine. - */ -class Parser extends AbstractASTVisitor implements CodeAwareGenerator -{ - /** - * The analysing rule-set instance. - * - * @var \PHPMD\RuleSet[] - */ - private $ruleSets = array(); - - /** - * The metric containing analyzer instances. - * - * @var \PDepend\Metrics\AnalyzerNodeAware[] - */ - private $analyzers = array(); - - /** - * The raw PDepend code nodes. - * - * @var \PDepend\Source\AST\ASTArtifactList - */ - private $artifacts = null; - - /** - * The violation report used by this PDepend adapter. - * - * @var \PHPMD\Report - */ - private $report = null; - - /** - * The wrapped PDepend Engine instance. - * - * @var \PDepend\Engine - */ - private $pdepend = null; - - /** - * Constructs a new parser adapter instance. - * - * @param \PDepend\Engine $pdepend The context php depend instance. - */ - public function __construct(Engine $pdepend) - { - $this->pdepend = $pdepend; - } - - /** - * Parses the projects source and reports all detected errors and violations. - * - * @param \PHPMD\Report $report - * @return void - */ - public function parse(Report $report) - { - $this->setReport($report); - - $this->pdepend->addReportGenerator($this); - $this->pdepend->analyze(); - - foreach ($this->pdepend->getExceptions() as $exception) { - $report->addError(new ProcessingError($exception->getMessage())); - } - } - - /** - * Adds a new analysis rule-set to this adapter. - * - * @param \PHPMD\RuleSet $ruleSet - * @return void - */ - public function addRuleSet(RuleSet $ruleSet) - { - $this->ruleSets[] = $ruleSet; - } - - /** - * Sets the violation report used by the rule-set. - * - * @param \PHPMD\Report $report - * @return void - */ - public function setReport(Report $report) - { - $this->report = $report; - } - - /** - * Adds an analyzer to log. If this logger accepts the given analyzer it - * with return <b>true</b>, otherwise the return value is <b>false</b>. - * - * @param \PDepend\Metrics\Analyzer $analyzer The analyzer to log. - * @return void - */ - public function log(Analyzer $analyzer) - { - $this->analyzers[] = $analyzer; - } - - /** - * Closes the logger process and writes the output file. - * - * @return void - * @throws \PDepend\Report\NoLogOutputException If the no log target exists. - */ - public function close() - { - // Set max nesting level, because we may get really deep data structures - ini_set('xdebug.max_nesting_level', 8192); - - foreach ($this->artifacts as $node) { - $node->accept($this); - } - } - - /** - * Returns an <b>array</b> with accepted analyzer types. These types can be - * concrete analyzer classes or one of the descriptive analyzer interfaces. - * - * @return string[] - */ - public function getAcceptedAnalyzers() - { - return array( - 'pdepend.analyzer.cyclomatic_complexity', - 'pdepend.analyzer.node_loc', - 'pdepend.analyzer.npath_complexity', - 'pdepend.analyzer.inheritance', - 'pdepend.analyzer.node_count', - 'pdepend.analyzer.hierarchy', - 'pdepend.analyzer.crap_index', - 'pdepend.analyzer.code_rank', - 'pdepend.analyzer.coupling', - 'pdepend.analyzer.class_level', - 'pdepend.analyzer.cohesion', - ); - } - - /** - * Visits a class node. - * - * @param \PDepend\Source\AST\ASTClass $node - * @return void - */ - public function visitClass(ASTClass $node) - { - if (!$node->isUserDefined()) { - return; - } - - $this->apply(new ClassNode($node)); - parent::visitClass($node); - } - - /** - * Visits a function node. - * - * @param \PDepend\Source\AST\ASTFunction $node - * @return void - */ - public function visitFunction(ASTFunction $node) - { - if ($node->getCompilationUnit()->getFileName() === null) { - return; - } - - $this->apply(new FunctionNode($node)); - } - - /** - * Visits an interface node. - * - * @param \PDepend\Source\AST\ASTInterface $node - * @return void - */ - public function visitInterface(ASTInterface $node) - { - if (!$node->isUserDefined()) { - return; - } - - $this->apply(new InterfaceNode($node)); - parent::visitInterface($node); - } - - /** - * Visits a method node. - * - * @param \PDepend\Source\AST\ASTMethod $node - * @return void - */ - public function visitMethod(ASTMethod $node) - { - if ($node->getCompilationUnit()->getFileName() === null) { - return; - } - - $this->apply(new MethodNode($node)); - } - - /** - * Sets the context code nodes. - * - * @param \PDepend\Source\AST\ASTArtifactList $artifacts - * @return void - */ - public function setArtifacts(ASTArtifactList $artifacts) - { - $this->artifacts = $artifacts; - } - - /** - * Applies all rule-sets to the given <b>$node</b> instance. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - private function apply(AbstractNode $node) - { - $this->collectMetrics($node); - foreach ($this->ruleSets as $ruleSet) { - $ruleSet->setReport($this->report); - $ruleSet->apply($node); - } - } - - /** - * Collects the collected metrics for the given node and adds them to the - * <b>$node</b>. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - private function collectMetrics(AbstractNode $node) - { - $metrics = array(); - - $pdepend = $node->getNode(); - foreach ($this->analyzers as $analyzer) { - $metrics = array_merge($metrics, $analyzer->getNodeMetrics($pdepend)); - } - $node->setMetrics($metrics); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/ParserFactory.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/ParserFactory.php deleted file mode 100644 index 8783ce7..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/ParserFactory.php +++ /dev/null @@ -1,156 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -use PDepend\Application; -use PDepend\Engine; -use PDepend\Input\ExcludePathFilter; -use PDepend\Input\ExtensionFilter; - -/** - * Simple factory that is used to return a ready to use PDepend instance. - */ -class ParserFactory -{ - /** - * Mapping between phpmd option names and those used by pdepend. - * - * @var array - */ - private $phpmd2pdepend = array( - 'coverage' => 'coverage-report' - ); - - /** - * Creates the used {@link \PHPMD\Parser} analyzer instance. - * - * @param \PHPMD\PHPMD $phpmd - * @return \PHPMD\Parser - */ - public function create(PHPMD $phpmd) - { - $pdepend = $this->createInstance(); - $pdepend = $this->init($pdepend, $phpmd); - - return new Parser($pdepend); - } - - /** - * Creates a clean php depend instance with some base settings. - * - * @return \PDepend\Engine - */ - private function createInstance() - { - $application = new Application(); - - if (file_exists(getcwd() . '/pdepend.xml')) { - $application->setConfigurationFile(getcwd() . '/pdepend.xml'); - } elseif (file_exists(getcwd() . '/pdepend.xml.dist')) { - $application->setConfigurationFile(getcwd() . '/pdepend.xml.dist'); - } - - return $application->getEngine(); - } - - /** - * Configures the given PDepend\Engine instance based on some user settings. - * - * @param \PDepend\Engine $pdepend - * @param \PHPMD\PHPMD $phpmd - * @return \PDepend\Engine - */ - private function init(Engine $pdepend, PHPMD $phpmd) - { - $this->initOptions($pdepend, $phpmd); - $this->initInput($pdepend, $phpmd); - $this->initIgnores($pdepend, $phpmd); - $this->initExtensions($pdepend, $phpmd); - - return $pdepend; - } - - /** - * Configures the input source. - * - * @param \PDepend\Engine $pdepend - * @param \PHPMD\PHPMD $phpmd - * @return void - */ - private function initInput(Engine $pdepend, PHPMD $phpmd) - { - foreach (explode(',', $phpmd->getInput()) as $path) { - $trimmedPath = trim($path); - if (is_dir($trimmedPath)) { - $pdepend->addDirectory($trimmedPath); - continue; - } - $pdepend->addFile($trimmedPath); - } - } - - /** - * Initializes the ignored files and path's. - * - * @param \PDepend\Engine $pdepend - * @param \PHPMD\PHPMD $phpmd - * @return void - */ - private function initIgnores(Engine $pdepend, PHPMD $phpmd) - { - if (count($phpmd->getIgnorePattern()) > 0) { - $pdepend->addFileFilter( - new ExcludePathFilter($phpmd->getIgnorePattern()) - ); - } - } - - /** - * Initializes the accepted php source file extensions. - * - * @param \PDepend\Engine $pdepend - * @param \PHPMD\PHPMD $phpmd - * @return void - */ - private function initExtensions(Engine $pdepend, PHPMD $phpmd) - { - if (count($phpmd->getFileExtensions()) > 0) { - $pdepend->addFileFilter( - new ExtensionFilter($phpmd->getFileExtensions()) - ); - } - } - - /** - * Initializes additional options for pdepend. - * - * @param \PDepend\Engine $pdepend - * @param \PHPMD\PHPMD $phpmd - * @return void - */ - private function initOptions(Engine $pdepend, PHPMD $phpmd) - { - $options = array(); - foreach (array_filter($phpmd->getOptions()) as $name => $value) { - if (isset($this->phpmd2pdepend[$name])) { - $options[$this->phpmd2pdepend[$name]] = $value; - } - } - $pdepend->setOptions($options); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/ProcessingError.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/ProcessingError.php deleted file mode 100644 index 1b91fe2..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/ProcessingError.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -/** - * Simple data class that we use to keep parsing errors for the report renderer. - * @since 1.2.1 - */ -class ProcessingError -{ - /** - * The original processing error message. - * - * @var string - */ - private $message; - - /** - * The source file where the processing error occurred. - * - * @var string - */ - private $file; - - /** - * Constructs a new processing error instance. - * - * @param string $message - */ - public function __construct($message) - { - $this->message = $message; - $this->file = $this->extractFile($message); - } - - /** - * Returns the source file where the processing error occurred. - * - * @return string - */ - public function getFile() - { - return $this->file; - } - - /** - * Returns the original processing error message. - * - * @return string - */ - public function getMessage() - { - return $this->message; - } - - /** - * Evil hack that extracts the source file from the original exception - * message. This method should be removed once we have added the source file - * as a mandatory property to PDepend's exceptions. - * - * @param string $message - * @return string - */ - private function extractFile($message) - { - preg_match('(file: (.+)\.$| file "([^"]+)")', $message, $match); - - $match = array_values(array_filter($match)); - if (isset($match[1])) { - return $match[1]; - } - return ''; - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/AnsiRenderer.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/AnsiRenderer.php deleted file mode 100644 index 6654f77..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/AnsiRenderer.php +++ /dev/null @@ -1,144 +0,0 @@ -<?php - -namespace PHPMD\Renderer; - -use PHPMD\AbstractRenderer; -use PHPMD\ProcessingError; -use PHPMD\Report; -use PHPMD\RuleViolation; - -/** - * This renderer output a command line friendly log with all found violations - * and suspect software artifacts. - */ -class AnsiRenderer extends AbstractRenderer -{ - - /** - * @param \PHPMD\Report $report - * @return void - */ - public function renderReport(Report $report) - { - $this->writeViolationsReport($report); - $this->writeErrorsReport($report); - $this->writeReportSummary($report); - } - - /** - * @param \PHPMD\Report $report - * @return void - */ - private function writeViolationsReport(Report $report) - { - if ($report->isEmpty()) { - return; - } - - $padding = $this->getMaxLineNumberLength($report); - $previousFile = null; - foreach ($report->getRuleViolations() as $violation) { - if ($violation->getFileName() !== $previousFile) { - $this->writeViolationFileHeader($violation); - } - - $this->writeViolationLine($violation, $padding); - $previousFile = $violation->getFileName(); - } - } - - /** - * @param \PHPMD\Report $report - * @return int|null - */ - private function getMaxLineNumberLength(Report $report) - { - $maxLength = null; - foreach ($report->getRuleViolations() as $violation) { - if ($maxLength === null || strlen($violation->getBeginLine()) > $maxLength) { - $maxLength = strlen($violation->getBeginLine()); - } - } - return $maxLength; - } - - /** - * @param \PHPMD\RuleViolation $violation - * @return void - */ - private function writeViolationFileHeader(RuleViolation $violation) - { - $fileHeader = sprintf( - 'FILE: %s', - $violation->getFileName() - ); - $this->getWriter()->write( - PHP_EOL . $fileHeader . PHP_EOL . - str_repeat('-', strlen($fileHeader)) . PHP_EOL - ); - } - - /** - * @param \PHPMD\RuleViolation $violation - * @param int $padding - * @return void - */ - private function writeViolationLine(RuleViolation $violation, $padding) - { - $this->getWriter()->write(sprintf( - " %s | \e[31mVIOLATION\e[0m | %s" . PHP_EOL, - str_pad($violation->getBeginLine(), $padding, ' '), - $violation->getDescription() - )); - } - - /** - * @param \PHPMD\Report $report - * @return void - */ - private function writeErrorsReport(Report $report) - { - if (!$report->hasErrors()) { - return; - } - - /** @var ProcessingError $error */ - foreach ($report->getErrors() as $error) { - $errorHeader = sprintf( - "\e[33mERROR\e[0m while parsing %s", - $error->getFile() - ); - - $this->getWriter()->write( - PHP_EOL . $errorHeader . PHP_EOL . - str_repeat('-', strlen($errorHeader) - 9) . PHP_EOL - ); - - $this->getWriter()->write(sprintf( - '%s' . PHP_EOL, - $error->getMessage() - )); - } - } - - /** - * @param \PHPMD\Report $report - * @return void - */ - private function writeReportSummary(Report $report) - { - $this->getWriter()->write( - sprintf( - PHP_EOL . 'Found %s %s and %s %s in %sms' . PHP_EOL, - count($report->getRuleViolations()), - count($report->getRuleViolations()) !== 1 ? 'violations' : 'violation', - iterator_count($report->getErrors()), - iterator_count($report->getErrors()) !== 1 ? 'errors' : 'error', - $report->getElapsedTimeInMillis() - ) - ); - if (count($report->getRuleViolations()) === 0 && iterator_count($report->getErrors()) === 0) { - $this->getWriter()->write(PHP_EOL . "\e[32mNo mess detected\e[0m" . PHP_EOL); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/HTMLRenderer.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/HTMLRenderer.php deleted file mode 100644 index 9ae2995..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/HTMLRenderer.php +++ /dev/null @@ -1,156 +0,0 @@ -<?php -/** - * This file is part of PHP Mess Detector. - * - * Copyright (c) Manuel Pichler <mapi@phpmd.org>. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler <mapi@phpmd.org> - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Renderer; - -use PHPMD\AbstractRenderer; -use PHPMD\Report; - -/** - * This renderer output a simple html file with all found violations and suspect - * software artifacts. - */ -class HTMLRenderer extends AbstractRenderer -{ - /** - * This method will be called on all renderers before the engine starts the - * real report processing. - * - * @return void - */ - public function start() - { - $writer = $this->getWriter(); - - $writer->write('<html><head><title>PHPMD'); - $writer->write(PHP_EOL); - $writer->write('

PHPMD report

'); - $writer->write('

Problems found

'); - $writer->write(PHP_EOL); - $writer->write(''); - $writer->write(''); - $writer->write(''); - $writer->write(''); - $writer->write(PHP_EOL); - } - - /** - * This method will be called when the engine has finished the source analysis - * phase. - * - * @param \PHPMD\Report $report - * @return void - */ - public function renderReport(Report $report) - { - $index = 0; - - $writer = $this->getWriter(); - foreach ($report->getRuleViolations() as $violation) { - $writer->write('write(' bgcolor="lightgrey"'); - } - $writer->write('>'); - $writer->write(PHP_EOL); - - $writer->write(''); - $writer->write(PHP_EOL); - - $writer->write(''); - $writer->write(PHP_EOL); - - $writer->write(''); - $writer->write(PHP_EOL); - - $writer->write(''); - $writer->write(PHP_EOL); - - $writer->write(''); - $writer->write(PHP_EOL); - } - - $writer->write('
#FileLineProblem
'); - $writer->write($index); - $writer->write(''); - $writer->write(htmlentities($violation->getFileName())); - $writer->write(''); - $writer->write($violation->getBeginLine()); - $writer->write(''); - if ($violation->getRule()->getExternalInfoUrl()) { - $writer->write(''); - } - - $writer->write(htmlentities($violation->getDescription())); - if ($violation->getRule()->getExternalInfoUrl()) { - $writer->write(''); - } - - $writer->write('
'); - - $this->glomProcessingErrors($report); - } - - /** - * This method will be called the engine has finished the report processing - * for all registered renderers. - * - * @return void - */ - public function end() - { - $writer = $this->getWriter(); - $writer->write(''); - } - - /** - * This method will render a html table with occurred processing errors. - * - * @param \PHPMD\Report $report - * @return void - * @since 1.2.1 - */ - private function glomProcessingErrors(Report $report) - { - if (false === $report->hasErrors()) { - return; - } - - $writer = $this->getWriter(); - - $writer->write('
'); - $writer->write('

Processing errors

'); - $writer->write(''); - $writer->write(''); - - $index = 0; - foreach ($report->getErrors() as $error) { - $writer->write('write(' bgcolor="lightgrey"'); - } - $writer->write('>'); - $writer->write(''); - $writer->write(''); - $writer->write('' . PHP_EOL); - } - - $writer->write('
FileProblem
' . $error->getFile() . '' . htmlentities($error->getMessage()) . '
'); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/JSONRenderer.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/JSONRenderer.php deleted file mode 100644 index 890b790..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/JSONRenderer.php +++ /dev/null @@ -1,129 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Renderer; - -use PHPMD\AbstractRenderer; -use PHPMD\PHPMD; -use PHPMD\Report; -use PHPMD\RuleViolation; - -/** - * This class will render a JSON report. - */ -class JSONRenderer extends AbstractRenderer -{ - /** - * {@inheritDoc} - */ - public function renderReport(Report $report) - { - $data = $this->initReportData(); - $data = $this->addViolationsToReport($report, $data); - $data = $this->addErrorsToReport($report, $data); - $jsonData = $this->encodeReport($data); - - $writer = $this->getWriter(); - $writer->write($jsonData . PHP_EOL); - } - /** - * Create report data and add renderer meta properties - * - * @return array - */ - private function initReportData() - { - $data = array( - 'version' => PHPMD::VERSION, - 'package' => 'phpmd', - 'timestamp' => date('c'), - ); - - return $data; - } - - /** - * Add violations, if any, to the report data - * - * @param Report $report The report with potential violations. - * @param array $data The report output to add the violations to. - * @return array The report output with violations, if any. - */ - private function addViolationsToReport(Report $report, array $data) - { - $filesList = array(); - /** @var RuleViolation $violation */ - foreach ($report->getRuleViolations() as $violation) { - $fileName = $violation->getFileName(); - $rule = $violation->getRule(); - $filesList[$fileName]['file'] = $fileName; - $filesList[$fileName]['violations'][] = array( - 'beginLine' => $violation->getBeginLine(), - 'endLine' => $violation->getEndLine(), - 'package' => $violation->getNamespaceName(), - 'function' => $violation->getFunctionName(), - 'class' => $violation->getClassName(), - 'method' => $violation->getMethodName(), - 'description' => $violation->getDescription(), - 'rule' => $rule->getName(), - 'ruleSet' => $rule->getRuleSetName(), - 'externalInfoUrl' => $rule->getExternalInfoUrl(), - 'priority' => $rule->getPriority(), - ); - } - $data['files'] = array_values($filesList); - - return $data; - } - - /** - * Add errors, if any, to the report data - * - * @param Report $report The report with potential errors. - * @param array $data The report output to add the errors to. - * @return array The report output with errors, if any. - */ - private function addErrorsToReport(Report $report, array $data) - { - $errors = $report->getErrors(); - if ($errors) { - foreach ($errors as $error) { - $data['errors'][] = array( - 'fileName' => $error->getFile(), - 'message' => $error->getMessage(), - ); - } - } - - return $data; - } - - /** - * Encode report data to the JSON representation string - * - * @param array $data The report data - * - * @return string - */ - private function encodeReport($data) - { - $encodeOptions = JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | - (defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0); - - return json_encode($data, $encodeOptions); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/TextRenderer.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/TextRenderer.php deleted file mode 100644 index cbc76ab..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/TextRenderer.php +++ /dev/null @@ -1,57 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Renderer; - -use PHPMD\AbstractRenderer; -use PHPMD\Report; - -/** - * This renderer output a textual log with all found violations and suspect - * software artifacts. - */ -class TextRenderer extends AbstractRenderer -{ - - /** - * This method will be called when the engine has finished the source analysis - * phase. - * - * @param \PHPMD\Report $report - * @return void - */ - public function renderReport(Report $report) - { - $writer = $this->getWriter(); - - foreach ($report->getRuleViolations() as $violation) { - $writer->write($violation->getFileName()); - $writer->write(':'); - $writer->write($violation->getBeginLine()); - $writer->write("\t"); - $writer->write($violation->getDescription()); - $writer->write(PHP_EOL); - } - - foreach ($report->getErrors() as $error) { - $writer->write($error->getFile()); - $writer->write("\t-\t"); - $writer->write($error->getMessage()); - $writer->write(PHP_EOL); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/XMLRenderer.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/XMLRenderer.php deleted file mode 100644 index 12d22e9..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Renderer/XMLRenderer.php +++ /dev/null @@ -1,129 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Renderer; - -use PHPMD\AbstractRenderer; -use PHPMD\PHPMD; -use PHPMD\Report; - -/** - * This class will render a Java-PMD compatible xml-report. - */ -class XMLRenderer extends AbstractRenderer -{ - /** - * Temporary property that holds the name of the last rendered file, it is - * used to detect the next processed file. - * - * @var string - */ - private $fileName = null; - - /** - * This method will be called on all renderers before the engine starts the - * real report processing. - * - * @return void - */ - public function start() - { - $this->getWriter()->write(''); - $this->getWriter()->write(PHP_EOL); - } - - /** - * This method will be called when the engine has finished the source analysis - * phase. - * - * @param \PHPMD\Report $report - * @return void - */ - public function renderReport(Report $report) - { - $writer = $this->getWriter(); - $writer->write('write('timestamp="' . date('c') . '">'); - $writer->write(PHP_EOL); - - foreach ($report->getRuleViolations() as $violation) { - $fileName = $violation->getFileName(); - - if ($this->fileName !== $fileName) { - // Not first file - if ($this->fileName !== null) { - $writer->write(' ' . PHP_EOL); - } - // Store current file name - $this->fileName = $fileName; - - $writer->write(' ' . PHP_EOL); - } - - $rule = $violation->getRule(); - - $writer->write(' write(' beginline="' . $violation->getBeginLine() . '"'); - $writer->write(' endline="' . $violation->getEndLine() . '"'); - $writer->write(' rule="' . $rule->getName() . '"'); - $writer->write(' ruleset="' . $rule->getRuleSetName() . '"'); - - $this->maybeAdd('package', $violation->getNamespaceName()); - $this->maybeAdd('externalInfoUrl', $rule->getExternalInfoUrl()); - $this->maybeAdd('function', $violation->getFunctionName()); - $this->maybeAdd('class', $violation->getClassName()); - $this->maybeAdd('method', $violation->getMethodName()); - //$this->_maybeAdd('variable', $violation->getVariableName()); - - $writer->write(' priority="' . $rule->getPriority() . '"'); - $writer->write('>' . PHP_EOL); - $writer->write(' ' . htmlspecialchars($violation->getDescription()) . PHP_EOL); - $writer->write(' ' . PHP_EOL); - } - - // Last file and at least one violation - if ($this->fileName !== null) { - $writer->write(' ' . PHP_EOL); - } - - foreach ($report->getErrors() as $error) { - $writer->write(' ' . PHP_EOL); - } - - $writer->write('' . PHP_EOL); - } - - /** - * This method will write a xml attribute named $attr to the output - * when the given $value is not an empty string and is not null. - * - * @param string $attr The xml attribute name. - * @param string $value The attribute value. - * @return void - */ - private function maybeAdd($attr, $value) - { - if ($value === null || trim($value) === '') { - return; - } - $this->getWriter()->write(' ' . $attr . '="' . $value . '"'); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Report.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Report.php deleted file mode 100644 index 5d4617e..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Report.php +++ /dev/null @@ -1,175 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -/** - * The report class collects all found violations and further information about - * a PHPMD run. - */ -class Report -{ - /** - * List of rule violations detected in the analyzed source code. - * - * @var array - */ - private $ruleViolations = array(); - - /** - * The start time for this report. - * - * @var float - */ - private $startTime = 0.0; - - /** - * The end time for this report. - * - * @var float - */ - private $endTime = 0.0; - - /** - * Errors that occurred while parsing the source. - * - * @var array - * @since 1.2.1 - */ - private $errors = array(); - - /** - * Adds a rule violation to this report. - * - * @param \PHPMD\RuleViolation $violation - * @return void - */ - public function addRuleViolation(RuleViolation $violation) - { - $fileName = $violation->getFileName(); - if (!isset($this->ruleViolations[$fileName])) { - $this->ruleViolations[$fileName] = array(); - } - - $beginLine = $violation->getBeginLine(); - if (!isset($this->ruleViolations[$fileName][$beginLine])) { - $this->ruleViolations[$fileName][$beginLine] = array(); - } - - $this->ruleViolations[$fileName][$beginLine][] = $violation; - } - - /** - * Returns true when this report does not contain any errors. - * - * @return boolean - * @since 0.2.5 - */ - public function isEmpty() - { - return (count($this->ruleViolations) === 0); - } - - /** - * Returns an iterator with all occurred rule violations. - * - * @return \PHPMD\RuleViolation[] - */ - public function getRuleViolations() - { - // First sort by file name - ksort($this->ruleViolations); - - $violations = array(); - foreach ($this->ruleViolations as $violationInLine) { - // Second sort is by line number - ksort($violationInLine); - - foreach ($violationInLine as $violation) { - $violations = array_merge($violations, $violation); - } - } - - return new \ArrayIterator($violations); - } - - /** - * Adds a processing error that occurred while parsing the source. - * - * @param \PHPMD\ProcessingError $error - * @return void - * @since 1.2.1 - */ - public function addError(ProcessingError $error) - { - $this->errors[] = $error; - } - - /** - * Returns true when the report contains at least one processing - * error. Otherwise this method will return false. - * - * @return boolean - * @since 1.2.1 - */ - public function hasErrors() - { - return count($this->errors) > 0; - } - - /** - * Returns an iterator with all {@link \PHPMD\ProcessingError} that were - * added to this report. - * - * @return \Iterator - * @since 1.2.1 - */ - public function getErrors() - { - return new \ArrayIterator($this->errors); - } - - /** - * Starts the time tracking of this report instance. - * - * @return void - */ - public function start() - { - $this->startTime = microtime(true) * 1000.0; - } - - /** - * Stops the time tracking of this report instance. - * - * @return void - */ - public function end() - { - $this->endTime = microtime(true) * 1000.0; - } - - /** - * Returns the total time elapsed for the source analysis. - * - * @return float - */ - public function getElapsedTimeInMillis() - { - return round($this->endTime - $this->startTime); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule.php deleted file mode 100644 index 517722a..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule.php +++ /dev/null @@ -1,211 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -use PHPMD\Report; - -/** - * Base interface for a PHPMD rule. - * - * @since 1.1.0 - */ -interface Rule -{ - /** - * The default lowest rule priority. - */ - const LOWEST_PRIORITY = 5; - - /** - * The default highest rule priority. - */ - const HIGHEST_PRIORITY = 1; - - /** - * Returns the name for this rule instance. - * - * @return string - */ - public function getName(); - - /** - * Sets the name for this rule instance. - * - * @param string $name - * @return void - */ - public function setName($name); - - /** - * Returns the version since when this rule is available or null. - * - * @return string - */ - public function getSince(); - - /** - * Sets the version since when this rule is available. - * - * @param string $since - * @return void - */ - public function setSince($since); - - /** - * Returns the violation message text for this rule. - * - * @return string - */ - public function getMessage(); - - /** - * Sets the violation message text for this rule. - * - * @param string $message - * @return void - */ - public function setMessage($message); - - /** - * Returns an url will external information for this rule. - * - * @return string - */ - public function getExternalInfoUrl(); - - /** - * Sets an url will external information for this rule. - * - * @param string $externalInfoUrl - * @return void - */ - public function setExternalInfoUrl($externalInfoUrl); - - /** - * Returns the description text for this rule instance. - * - * @return string - */ - public function getDescription(); - - /** - * Sets the description text for this rule instance. - * - * @param string $description - * @return void - */ - public function setDescription($description); - - /** - * Returns a list of examples for this rule. - * - * @return array - */ - public function getExamples(); - - /** - * Adds a code example for this rule. - * - * @param string $example - * @return void - */ - public function addExample($example); - - /** - * Returns the priority of this rule. - * - * @return integer - */ - public function getPriority(); - - /** - * Set the priority of this rule. - * - * @param integer $priority - * @return void - */ - public function setPriority($priority); - - /** - * Returns the name of the parent rule-set instance. - * - * @return string - */ - public function getRuleSetName(); - - /** - * Sets the name of the parent rule set instance. - * - * @param string $ruleSetName - * @return void - */ - public function setRuleSetName($ruleSetName); - - /** - * Returns the violation report for this rule. - * - * @return Report - */ - public function getReport(); - - /** - * Sets the violation report for this rule. - * - * @param Report $report - * @return void - */ - public function setReport(Report $report); - - /** - * Adds a configuration property to this rule instance. - * - * @param string $name - * @param string $value - * @return void - */ - public function addProperty($name, $value); - - /** - * Returns the value of a configured property as a boolean or throws an - * exception when no property with $name exists. - * - * @param string $name - * @return boolean - * @throws \OutOfBoundsException When no property for $name exists. - */ - public function getBooleanProperty($name); - - /** - * Returns the value of a configured property as an integer or throws an - * exception when no property with $name exists. - * - * @param string $name - * @return integer - * @throws \OutOfBoundsException When no property for $name exists. - */ - public function getIntProperty($name); - - /** - * This method should implement the violation analysis algorithm of concrete - * rule implementations. All extending classes must implement this method. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node); -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/AbstractLocalVariable.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/AbstractLocalVariable.php deleted file mode 100644 index 5c9ce26..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/AbstractLocalVariable.php +++ /dev/null @@ -1,166 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\ASTNode; - -/** - * Base class for rules that rely on local variables. - * - * @since 0.2.6 - */ -abstract class AbstractLocalVariable extends AbstractRule -{ - /** - * PHP super globals that are available in all php scopes, so that they - * can never be unused local variables. - * - * @var array(string=>boolean) - * @link http://php.net/manual/en/reserved.variables.php - */ - private static $superGlobals = array( - '$argc' => true, - '$argv' => true, - '$_COOKIE' => true, - '$_ENV' => true, - '$_FILES' => true, - '$_GET' => true, - '$_POST' => true, - '$_REQUEST' => true, - '$_SERVER' => true, - '$_SESSION' => true, - '$GLOBALS' => true, - '$HTTP_RAW_POST_DATA' => true, - '$php_errormsg' => true, - '$http_response_header' => true, - ); - - /** - * Tests if the given variable node represents a local variable or if it is - * a static object property or something similar. - * - * @param \PHPMD\Node\ASTNode $variable The variable to check. - * @return boolean - */ - protected function isLocal(ASTNode $variable) - { - return (false === $variable->isThis() - && $this->isNotSuperGlobal($variable) - && $this->isRegularVariable($variable) - ); - } - - /** - * Tests if the given variable represents one of the PHP super globals - * that are available in scopes. - * - * @param \PHPMD\AbstractNode $variable - * @return boolean - */ - protected function isNotSuperGlobal(AbstractNode $variable) - { - return !isset(self::$superGlobals[$variable->getImage()]); - } - - /** - * Tests if the given variable node is a regular variable an not property - * or method postfix. - * - * @param \PHPMD\Node\ASTNode $variable - * @return boolean - */ - protected function isRegularVariable(ASTNode $variable) - { - $node = $this->stripWrappedIndexExpression($variable); - $parent = $node->getParent(); - - if ($parent->isInstanceOf('PropertyPostfix')) { - $primaryPrefix = $parent->getParent(); - if ($primaryPrefix->getParent()->isInstanceOf('MemberPrimaryPrefix')) { - return !$primaryPrefix->getParent()->isStatic(); - } - return ($parent->getChild(0)->getNode() !== $node->getNode() - || !$primaryPrefix->isStatic() - ); - } - return true; - } - - /** - * Removes all index expressions that are wrapped around the given node - * instance. - * - * @param \PHPMD\Node\ASTNode $node - * @return \PHPMD\Node\ASTNode - */ - protected function stripWrappedIndexExpression(ASTNode $node) - { - if (false === $this->isWrappedByIndexExpression($node)) { - return $node; - } - - $parent = $node->getParent(); - if ($parent->getChild(0)->getNode() === $node->getNode()) { - return $this->stripWrappedIndexExpression($parent); - } - return $node; - } - - /** - * Tests if the given variable node os part of an index expression. - * - * @param \PHPMD\Node\ASTNode $node - * @return boolean - */ - protected function isWrappedByIndexExpression(ASTNode $node) - { - return ($node->getParent()->isInstanceOf('ArrayIndexExpression') - || $node->getParent()->isInstanceOf('StringIndexExpression') - ); - } - - /** - * PHP is case insensitive so we should compare function names case - * insensitive. - * - * @param \PHPMD\AbstractNode $node - * @param string $name - * @return boolean - */ - protected function isFunctionNameEqual(AbstractNode $node, $name) - { - return (0 === strcasecmp(trim($node->getImage(), '\\'), $name)); - } - - /** - * AST puts namespace prefix to global functions called from a namespace. - * This method checks if the last part of function fully qualified name is equal to $name - * - * @param \PHPMD\AbstractNode $node - * @param string $name - * @return boolean - */ - protected function isFunctionNameEndingWith(AbstractNode $node, $name) - { - $parts = explode('\\', trim($node->getImage(), '\\')); - - return (0 === strcasecmp(array_pop($parts), $name)); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/ClassAware.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/ClassAware.php deleted file mode 100644 index 9358391..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/ClassAware.php +++ /dev/null @@ -1,25 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule; - -/** - * This interface is used to mark a rule implementation as class aware. - */ -interface ClassAware -{ -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/BooleanArgumentFlag.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/BooleanArgumentFlag.php deleted file mode 100644 index cc4d475..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/BooleanArgumentFlag.php +++ /dev/null @@ -1,57 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\CleanCode; - -use PDepend\Source\AST\ASTValue; -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * Check for a boolean flag in the method/function signature. - * - * Boolean flags are signs for single responsibility principle violations. - */ -class BooleanArgumentFlag extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * This method checks if a method/function has boolean flag arguments and warns about them. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->findChildrenOfType('FormalParameter') as $param) { - $declarator = $param->getFirstChildOfType('VariableDeclarator'); - $value = $declarator->getValue(); - - if (false === $this->isBooleanValue($value)) { - continue; - } - - $this->addViolation($param, array($node->getImage(), $declarator->getImage())); - } - } - - private function isBooleanValue(ASTValue $value = null) - { - return $value && $value->isValueAvailable() && ($value->getValue() === true || $value->getValue() === false); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/DuplicatedArrayKey.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/DuplicatedArrayKey.php deleted file mode 100644 index d8b3de3..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/DuplicatedArrayKey.php +++ /dev/null @@ -1,137 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\CleanCode; - -use PDepend\Source\AST\AbstractASTNode; -use PDepend\Source\AST\ASTArrayElement; -use PDepend\Source\AST\ASTLiteral; -use PDepend\Source\AST\ASTNode as PDependASTNode; -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\ASTNode; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * Duplicated Array Key Rule - * - * This rule detects duplicated array keys. - * - * @author Rafał Wrzeszcz - * @author Kamil Szymanaski - */ -class DuplicatedArrayKey extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * Retrieves all arrays from single node and performs comparison logic on it - * - * @param AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->findChildrenOfType('Array') as $arrayNode) { - /** @var ASTNode $arrayNode */ - $this->checkForDuplicatedArrayKeys($arrayNode); - } - } - - /** - * This method checks if a given function or method contains an array literal - * with duplicated entries for any key and emits a rule violation if so. - * - * @param ASTNode $node Array node. - * @return void - */ - private function checkForDuplicatedArrayKeys(ASTNode $node) - { - $keys = array(); - /** @var ASTArrayElement $arrayElement */ - foreach ($node->getChildren() as $index => $arrayElement) { - $arrayElement = $this->normalizeKey($arrayElement, $index); - if (null === $arrayElement) { - // skip everything that can't be resolved easily - continue; - } - - $key = $arrayElement->getImage(); - if (isset($keys[$key])) { - $this->addViolation($node, array($key, $arrayElement->getStartLine())); - continue; - } - $keys[$key] = $arrayElement; - } - } - - /** - * Changes key name to its string format. - * - * To compare keys, we have to cast them to string. - * Non-associative keys have to use index as its key, - * while boolean and nulls have to be casted respectively. - * As current logic doesn't evaluate expressions nor constants, - * statics, globals, etc. we simply skip them. - * - * @param AbstractASTNode $node Array key to evaluate. - * @param int $index Fallback in case of non-associative arrays - * @return AbstractASTNode Key name - */ - private function normalizeKey(AbstractASTNode $node, $index) - { - $childCount = count($node->getChildren()); - // Skip, if there is no array key, just an array value - if ($childCount === 1) { - return null; - } - // non-associative - key name equals to its index - if ($childCount === 0) { - $node->setImage((string) $index); - return $node; - } - - $node = $node->getChild(0); - if (!($node instanceof ASTLiteral)) { - // skip expressions, method calls, globals and constants - return null; - } - $node->setImage($this->castStringFromLiteral($node)); - - return $node; - } - - /** - * Cleans string literals and casts boolean and null values as PHP engine does - * - * @param PDependASTNode $key - * @return string - */ - private function castStringFromLiteral(PDependASTNode $key) - { - $value = $key->getImage(); - switch ($value) { - case 'false': - return '0'; - case 'true': - return '1'; - case 'null': - return ''; - default: - return trim($value, '\'""'); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/ElseExpression.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/ElseExpression.php deleted file mode 100644 index 6ec6ac7..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/ElseExpression.php +++ /dev/null @@ -1,83 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\CleanCode; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\ASTNode; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * Check if there is an else expression somewhere in the method/function and - * warn about it. - * - * Object Calisthenics teaches us, that an else expression can always be - * avoided by simple guard clause or return statements. - */ -class ElseExpression extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * This method checks if a method/function uses an else expression and add a violation for each one found. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->findChildrenOfType('ScopeStatement') as $scope) { - $parent = $scope->getParent(); - - if (false === $this->isIfOrElseIfStatement($parent)) { - continue; - } - - if (false === $this->isElseScope($scope, $parent)) { - continue; - } - - $this->addViolation($scope, array($node->getImage())); - } - } - - /** - * Whether the given scope is an else clause - * - * @param AbstractNode $scope - * @param ASTNode $parent - * @return bool - */ - private function isElseScope(AbstractNode $scope, ASTNode $parent) - { - return ( - count($parent->getChildren()) === 3 && - $scope->getNode() === $parent->getChild(2)->getNode() - ); - } - - /** - * Whether the parent node is an if or an elseif clause - * - * @param ASTNode $parent - * @return bool - */ - private function isIfOrElseIfStatement(ASTNode $parent) - { - return ($parent->getName() === "if" || $parent->getName() === "elseif"); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/IfStatementAssignment.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/IfStatementAssignment.php deleted file mode 100644 index acc8794..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/IfStatementAssignment.php +++ /dev/null @@ -1,131 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\CleanCode; - -use PDepend\Source\AST\ASTAssignmentExpression; -use PDepend\Source\AST\ASTExpression; -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\ASTNode; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * If Statement Assignment Rule - * - * This rule covers the following cases: - * - single assignment in an if clause - * - multiple assignments in same if clause - * - assignments in nested if clauses - * - assignments in elseif clauses - * - duplicated assignments (multiple conditions before and after *=* sign) - * - * Empty if clauses are skipped - */ -class IfStatementAssignment extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * @var array List of statement types where to forbid assignation. - */ - protected $ifStatements = array( - 'IfStatement', - 'ElseIfStatement', - ); - - /** - * This method checks if method/function has if clauses - * that use assignment instead of comparison. - * - * @param AbstractNode $node An instance of MethodNode or FunctionNode class - * @return void - */ - public function apply(AbstractNode $node) - { - $statements = $this->getStatements($node); - $expressions = $this->getExpressions($statements); - $assignments = $this->getAssignments($expressions); - - $this->addViolations($node, $assignments); - } - - /** - * Extracts if and elseif statements from method/function body - * - * @param AbstractNode $node An instance of MethodNode or FunctionNode class - * @return ASTNode[] - */ - private function getStatements(AbstractNode $node) - { - return call_user_func_array('array_merge', array_map(function ($type) use ($node) { - return $node->findChildrenOfType($type); - }, $this->ifStatements)); - } - - /** - * Extracts all expression from statements array - * - * @param ASTNode[] $statements Array of if and elseif clauses - * @return ASTExpression[] - */ - private function getExpressions(array $statements) - { - return array_map(function (ASTNode $statement) { - return $statement->getFirstChildOfType('Expression'); - }, $statements); - } - - /** - * Extracts all assignments from expressions array - * - * @param ASTExpression[] $expressions Array of expressions - * @return ASTAssignmentExpression[] - */ - private function getAssignments(array $expressions) - { - $assignments = array(); - /** @var ASTNode $expression */ - foreach ($expressions as $expression) { - $assignments = array_merge($assignments, $expression->findChildrenOfType('AssignmentExpression')); - } - - return $assignments; - } - - /** - * Signals if any violations have been found in given method or function - * - * @param AbstractNode $node An instance of MethodNode or FunctionNode class - * @param ASTAssignmentExpression[] $assignments Array of assignments - */ - private function addViolations(AbstractNode $node, array $assignments) - { - $processesViolations = array(); - /** @var \PDepend\Source\AST\AbstractASTNode $assignment */ - foreach ($assignments as $assignment) { - if (null === $assignment || $assignment->getImage() !== '=') { - continue; - } - - $uniqueHash = $assignment->getStartColumn() . ':' . $assignment->getStartLine(); - if (!in_array($uniqueHash, $processesViolations)) { - $processesViolations[] = $uniqueHash; - $this->addViolation($node, array($assignment->getStartLine(), $assignment->getStartColumn())); - } - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/MissingImport.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/MissingImport.php deleted file mode 100644 index 315f06b..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/MissingImport.php +++ /dev/null @@ -1,75 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\CleanCode; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\ASTNode; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * Checks that all classes are imported - * - * This rule can be used to prevent use of fully qualified class names. - */ -class MissingImport extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * @var array Self reference class names. - */ - protected $selfReferences = array('self', 'static'); - - /** - * Checks for missing class imports and warns about it - * - * @param AbstractNode $node The node to check upon. - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->findChildrenOfType('AllocationExpression') as $allocationNode) { - if (!$allocationNode) { - continue; - } - - $classNode = $allocationNode->getChild(0); - - if ($this->isSelfReference($classNode)) { - continue; - } - - $classNameLength = $classNode->getEndColumn() - $classNode->getStartColumn() + 1; - $fqcnLength = strlen($classNode->getImage()); - if ($classNameLength === $fqcnLength) { - $this->addViolation($classNode, array($classNode->getBeginLine(), $classNode->getStartColumn())); - } - } - } - - /** - * Check whether a given class node is a self reference - * - * @param ASTNode $classNode A class node to check. - * @return bool Whether the given class node is a self reference. - */ - protected function isSelfReference(ASTNode $classNode) - { - return in_array($classNode->getImage(), $this->selfReferences, true); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/StaticAccess.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/StaticAccess.php deleted file mode 100644 index 8111d0e..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/StaticAccess.php +++ /dev/null @@ -1,100 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\CleanCode; - -use PDepend\Source\AST\ASTClassOrInterfaceReference; -use PDepend\Source\AST\ASTMethodPostfix; -use PDepend\Source\AST\ASTParentReference; -use PDepend\Source\AST\ASTSelfReference; -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * Check if static access is used in a method. - * - * Static access is known to cause hard dependencies between classes - * and is a bad practice. - */ -class StaticAccess extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * Method checks for use of static access and warns about it. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $exceptions = $this->getExceptionsList(); - $nodes = $node->findChildrenOfType('MemberPrimaryPrefix'); - - foreach ($nodes as $methodCall) { - if (!$this->isStaticMethodCall($methodCall)) { - continue; - } - - $className = $methodCall->getChild(0)->getNode()->getImage(); - if (in_array(trim($className, " \t\n\r\0\x0B\\"), $exceptions)) { - continue; - } - - $this->addViolation($methodCall, array($className, $node->getName())); - } - } - - private function isStaticMethodCall(AbstractNode $methodCall) - { - return $methodCall->getChild(0)->getNode() instanceof ASTClassOrInterfaceReference && - $methodCall->getChild(1)->getNode() instanceof ASTMethodPostfix && - !$this->isCallingParent($methodCall) && - !$this->isCallingSelf($methodCall); - } - - private function isCallingParent(AbstractNode $methodCall) - { - return $methodCall->getChild(0)->getNode() instanceof ASTParentReference; - } - - private function isCallingSelf(AbstractNode $methodCall) - { - return $methodCall->getChild(0)->getNode() instanceof ASTSelfReference; - } - - /** - * Gets array of exceptions from property - * - * @return array - */ - private function getExceptionsList() - { - try { - $exceptions = $this->getStringProperty('exceptions'); - } catch (\OutOfBoundsException $e) { - $exceptions = ''; - } - - return array_map( - function ($className) { - return trim($className, " \t\n\r\0\x0B\\"); - }, - explode(',', $exceptions) - ); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/UndefinedVariable.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/UndefinedVariable.php deleted file mode 100644 index dd90665..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CleanCode/UndefinedVariable.php +++ /dev/null @@ -1,255 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\CleanCode; - -use PDepend\Source\AST\ASTVariable; -use PDepend\Source\AST\State; -use PHPMD\AbstractNode; -use PHPMD\Node\AbstractCallableNode; -use PHPMD\Node\ASTNode; -use PHPMD\Node\MethodNode; -use PHPMD\Rule\AbstractLocalVariable; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule collects all undefined variables within a given function or method - * that are used by any code in the analyzed source artifact. - */ -class UndefinedVariable extends AbstractLocalVariable implements FunctionAware, MethodAware -{ - /** - * Found variable images within a single method or function. - * - * @var array(string) - */ - private $images = array(); - - /** - * This method checks that all local variables within the given function or - * method are used at least one time. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $this->images = array(); - - $this->collectPropertyPostfix($node); - $this->collectClosureParameters($node); - $this->collectForeachStatements($node); - $this->collectListExpressions($node); - $this->collectAssignments($node); - $this->collectParameters($node); - $this->collectExceptionCatches($node); - $this->collectGlobalStatements($node); - - foreach ($node->findChildrenOfType('Variable') as $variable) { - if (! $this->isNotSuperGlobal($variable)) { - $this->addVariableDefinition($variable); - } - if (! $this->checkVariableDefined($variable, $node)) { - $this->addViolation($variable, array($variable->getImage())); - } - } - } - - /** - * Stores the given literal node in an global of found variables. - * - * @param \PHPMD\Node\AbstractNode $node - * @return void - */ - private function collectGlobalStatements(AbstractNode $node) - { - $globalStatements = $node->findChildrenOfType('GlobalStatement'); - - foreach ($globalStatements as $globalStatement) { - foreach ($globalStatement->getChildren() as $variable) { - $this->addVariableDefinition($variable); - } - } - } - - /** - * Stores the given literal node in an catch of found variables. - * - * @param \PHPMD\Node\AbstractCallableNode $node - * @return void - */ - private function collectExceptionCatches(AbstractCallableNode $node) - { - $catchStatements = $node->findChildrenOfType('CatchStatement'); - - foreach ($catchStatements as $catchStatement) { - foreach ($catchStatement->getChildren() as $children) { - if ($children instanceof ASTVariable) { - $this->addVariableDefinition($children); - } - } - } - } - - /** - * Stores the given literal node in an internal list of found variables. - * - * @param \PHPMD\Node\AbstractCallableNode $node - * @return void - */ - private function collectListExpressions(AbstractCallableNode $node) - { - $lists = $node->findChildrenOfType('ListExpression'); - - foreach ($lists as $listExpression) { - foreach ($listExpression->getChildren() as $variable) { - $this->addVariableDefinition($variable); - } - } - } - - - /** - * Stores the given literal node in an internal foreach of found variables. - * - * @param \PHPMD\Node\AbstractCallableNode $node - * @return void - */ - private function collectForeachStatements(AbstractCallableNode $node) - { - $foreachStatements = $node->findChildrenOfType('ForeachStatement'); - - foreach ($foreachStatements as $foreachStatement) { - foreach ($foreachStatement->getChildren() as $children) { - if ($children instanceof ASTVariable) { - $this->addVariableDefinition($children); - } - } - } - } - - /** - * Stores the given literal node in an internal closure of found variables. - * - * @param \PHPMD\Node\AbstractCallableNode $node - * @return void - */ - private function collectClosureParameters(AbstractCallableNode $node) - { - $closures = $node->findChildrenOfType('Closure'); - - foreach ($closures as $closure) { - $this->collectParameters($closure); - } - } - - /** - * Check if the given variable was defined in the current context before usage. - * - * @param \PHPMD\Node\ASTNode $variable - * @param \PHPMD\Node\AbstractCallableNode $parentNode - * @return bool - */ - private function checkVariableDefined(ASTNode $variable, AbstractCallableNode $parentNode) - { - return isset($this->images[$variable->getImage()]) || $this->isNameAllowedInContext($parentNode, $variable); - } - - /** - * Collect parameter names of method/function. - * - * @param \PHPMD\Node\AbstractNode $node - * @return void - */ - private function collectParameters(AbstractNode $node) - { - // Get formal parameter container - $parameters = $node->getFirstChildOfType('FormalParameters'); - - // Now get all declarators in the formal parameters container - $declarators = $parameters->findChildrenOfType('VariableDeclarator'); - - foreach ($declarators as $declarator) { - $this->addVariableDefinition($declarator); - } - } - - /** - * Collect assignments of variables. - * - * @param \PHPMD\Node\AbstractCallableNode $node - * @return void - */ - private function collectAssignments(AbstractCallableNode $node) - { - foreach ($node->findChildrenOfType('AssignmentExpression') as $assignment) { - $variable = $assignment->getChild(0); - - $this->addVariableDefinition($variable); - } - } - - /** - * Collect postfix property. - * - * @param \PHPMD\Node\AbstractNode $node - * @return void - */ - private function collectPropertyPostfix(AbstractNode $node) - { - $propertyes = $node->findChildrenOfType('PropertyPostfix'); - - foreach ($propertyes as $property) { - foreach ($property->getChildren() as $children) { - if ($children instanceof ASTVariable) { - $this->addVariableDefinition($children); - } - } - } - } - - /** - * Add the variable to images - * - * @param mixed $variable - * @return void - */ - private function addVariableDefinition($variable) - { - if (! isset($this->images[$variable->getImage()])) { - $this->images[$variable->getImage()] = $variable; - } - } - - /** - * Checks if a short name is acceptable in the current context. - * - * @param \PHPMD\Node\AbstractCallableNode $node - * @param \PHPMD\Node\ASTNode $variable - * - * @return boolean - */ - private function isNameAllowedInContext(AbstractCallableNode $node, ASTNode $variable) - { - return ( - $node instanceof MethodNode && - $variable->getImage() === '$this' && - ($node->getModifiers() & State::IS_STATIC) === 0 - ); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseClassName.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseClassName.php deleted file mode 100644 index 50a902b..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseClassName.php +++ /dev/null @@ -1,51 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Controversial; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\ClassAware; -use PHPMD\Rule\InterfaceAware; - -/** - * This rule class detects classes not named in CamelCase. - * - * @author Francis Besset - * @since 1.1.0 - */ -class CamelCaseClassName extends AbstractRule implements ClassAware, InterfaceAware -{ - /** - * This method checks if a class is not named in CamelCase - * and emits a rule violation. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - if (!preg_match('/^[A-Z][a-zA-Z0-9]*$/', $node->getName())) { - $this->addViolation( - $node, - array( - $node->getName(), - ) - ); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseMethodName.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseMethodName.php deleted file mode 100644 index dd3c196..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseMethodName.php +++ /dev/null @@ -1,86 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Controversial; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\MethodAware; - -/** - * This rule class detects methods not named in camelCase. - * - * @author Francis Besset - * @since 1.1.0 - */ -class CamelCaseMethodName extends AbstractRule implements MethodAware -{ - protected $ignoredMethods = array( - '__construct', - '__destruct', - '__set', - '__get', - '__call', - '__callStatic', - '__isset', - '__unset', - '__sleep', - '__wakeup', - '__toString', - '__invoke', - '__set_state', - '__clone', - '__debugInfo', - '__serialize', - '__unserialize', - ); - - /** - * This method checks if a method is not named in camelCase - * and emits a rule violation. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $methodName = $node->getName(); - if (!in_array($methodName, $this->ignoredMethods)) { - if (!$this->isValid($methodName)) { - $this->addViolation( - $node, - array( - $methodName, - ) - ); - } - } - } - - private function isValid($methodName) - { - if ($this->getBooleanProperty('allow-underscore-test') && strpos($methodName, 'test') === 0) { - return preg_match('/^test[a-zA-Z0-9]*([_][a-z][a-zA-Z0-9]*)?$/', $methodName); - } - - if ($this->getBooleanProperty('allow-underscore')) { - return preg_match('/^[_]?[a-z][a-zA-Z0-9]*$/', $methodName); - } - - return preg_match('/^[a-z][a-zA-Z0-9]*$/', $methodName); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseParameterName.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseParameterName.php deleted file mode 100644 index c3ba72e..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseParameterName.php +++ /dev/null @@ -1,53 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Controversial; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class detects parameters not named in camelCase. - * - * @author Francis Besset - * @since 1.1.0 - */ -class CamelCaseParameterName extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * This method checks if a parameter is not named in camelCase - * and emits a rule violation. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->getParameters() as $parameter) { - if (!preg_match('/^\$[a-z][a-zA-Z0-9]*$/', $parameter->getName())) { - $this->addViolation( - $node, - array( - $parameter->getName(), - ) - ); - } - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCasePropertyName.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCasePropertyName.php deleted file mode 100644 index 1aab6f9..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCasePropertyName.php +++ /dev/null @@ -1,61 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Controversial; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\ClassAware; - -/** - * This rule class detects properties not named in camelCase. - * - * @author Francis Besset - * @since 1.1.0 - */ -class CamelCasePropertyName extends AbstractRule implements ClassAware -{ - /** - * This method checks if a property is not named in camelCase - * and emits a rule violation. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $allowUnderscore = $this->getBooleanProperty('allow-underscore'); - - $pattern = '/^\$[a-zA-Z][a-zA-Z0-9]*$/'; - if ($allowUnderscore == true) { - $pattern = '/^\$[_]?[a-zA-Z][a-zA-Z0-9]*$/'; - } - - foreach ($node->getProperties() as $property) { - $propertyName = $property->getName(); - - if (!preg_match($pattern, $propertyName)) { - $this->addViolation( - $node, - array( - $propertyName, - ) - ); - } - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseVariableName.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseVariableName.php deleted file mode 100644 index db847bb..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/CamelCaseVariableName.php +++ /dev/null @@ -1,77 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Controversial; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class detects variables not named in camelCase. - * - * @author Francis Besset - * @since 1.1.0 - */ -class CamelCaseVariableName extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * @var array - */ - private $exceptions = array( - '$php_errormsg', - '$http_response_header', - '$GLOBALS', - '$_SERVER', - '$_GET', - '$_POST', - '$_FILES', - '$_COOKIE', - '$_SESSION', - '$_REQUEST', - '$_ENV', - ); - - /** - * This method checks if a variable is not named in camelCase - * and emits a rule violation. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->findChildrenOfType('Variable') as $variable) { - $image = $variable->getImage(); - - if (in_array($image, $this->exceptions)) { - continue; - } - - if (preg_match('/^\$[a-z][a-zA-Z0-9]*$/', $image)) { - continue; - } - - if ($variable->getParent()->isInstanceOf('PropertyPostfix')) { - continue; - } - - $this->addViolation($node, array($image)); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/Superglobals.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/Superglobals.php deleted file mode 100644 index ed470b3..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Controversial/Superglobals.php +++ /dev/null @@ -1,66 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Controversial; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class detects the usage of superglobals. - * - * @author Francis Besset - * @since 1.1.0 - */ -class Superglobals extends AbstractRule implements MethodAware, FunctionAware -{ - protected $superglobals = array( - '$GLOBALS', - '$_SERVER', '$HTTP_SERVER_VARS', - '$_GET', '$HTTP_GET_VARS', - '$_POST', '$HTTP_POST_VARS', - '$_FILES', '$HTTP_POST_FILES', - '$_COOKIE', '$HTTP_COOKIE_VARS', - '$_SESSION', '$HTTP_SESSION_VARS', - '$_REQUEST', - '$_ENV', '$HTTP_ENV_VARS', - ); - - /** - * This method checks if a superglobal is used - * and emits a rule violation. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->findChildrenOfType('Variable') as $variable) { - if (in_array($variable->getImage(), $this->superglobals)) { - $this->addViolation( - $node, - array( - $node->getName(), - $variable->getImage() - ) - ); - } - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CyclomaticComplexity.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CyclomaticComplexity.php deleted file mode 100644 index 17b7828..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/CyclomaticComplexity.php +++ /dev/null @@ -1,54 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; - -/** - * This rule checks a given method or function against the configured cyclomatic - * complexity threshold. - */ -class CyclomaticComplexity extends AbstractRule implements FunctionAware, MethodAware -{ - /** - * This method checks the cyclomatic complexity for the given node against - * a configured threshold. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $threshold = $this->getIntProperty('reportLevel'); - $ccn = $node->getMetric('ccn2'); - if ($ccn < $threshold) { - return; - } - - $this->addViolation( - $node, - array( - $node->getType(), - $node->getName(), - $ccn, - $threshold - ) - ); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/CountInLoopExpression.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/CountInLoopExpression.php deleted file mode 100644 index 5a2744c..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/CountInLoopExpression.php +++ /dev/null @@ -1,167 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PDepend\Source\AST\AbstractASTNode; -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\ASTNode; -use PHPMD\Node\ClassNode; -use PHPMD\Rule\ClassAware; - -/** - * Count In Loop Expression Rule - * - * Performs a scan to check if loops use - * count() or sizeof() in expressions. - * - * Checks for: - * - for() loops - * - while() loops - * - do-while() loops - * - * @author Kamil Szymanski - */ -class CountInLoopExpression extends AbstractRule implements ClassAware -{ - /** - * List of functions to search against - * - * @var array - */ - private $unwantedFunctions = array('count', 'sizeof'); - - /** - * List of already processed functions - * - * @var array - */ - protected $processedFunctions = array(); - - /** - * Functions in classes tends to be name-spaced - * - * @var string - */ - protected $currentNamespace = ''; - - /** - * Gets a list of loops in a node and iterates over them - * - * @param AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - if ($node instanceof ClassNode) { - return $this->applyOnClassMethods($node); - } - - $this->currentNamespace = $node->getNamespaceName() . '\\'; - $loops = array_merge( - $node->findChildrenOfType('ForStatement'), - $node->findChildrenOfType('WhileStatement'), - $node->findChildrenOfType('DoWhileStatement') - ); - - /** @var AbstractNode $loop */ - foreach ($loops as $loop) { - $this->findViolations($loop); - } - } - - /** - * Scans for expressions and count() or sizeof() functions inside, - * if found, triggers a violation - * - * @param AbstractNode $loop Loop statement to look against - */ - protected function findViolations(AbstractNode $loop) - { - foreach ($loop->findChildrenOfType('Expression') as $expression) { - if ($this->isDirectChild($loop, $expression)) { - continue; - } - - foreach ($expression->findChildrenOfType('FunctionPostfix') as $function) { - if (!$this->isUnwantedFunction($function)) { - continue; - } - - $hash = $this->getHash($function->getNode()); - if (isset($this->processedFunctions[$hash])) { - continue; - } - - $this->addViolation($loop, array($function->getImage(), $loop->getImage())); - $this->processedFunctions[$hash] = true; - } - } - } - - /** - * Checks whether node in a direct child of the loop - * - * @param AbstractNode $loop - * @param ASTNode $expression - * @return bool - */ - protected function isDirectChild(AbstractNode $loop, ASTNode $expression) - { - return $this->getHash($expression->getParent()->getNode()) !== $this->getHash($loop->getNode()); - } - - /** - * Generates an unique hash for a given node - * - * PDepend method getChildrenOfType() iterates trough all children of a node. - * As one function may be found more than once, we use a hash (which in reality - * is a clone of the node's metadata) to check, if a given node hasn't - * already been processed. - * - * Example hash: - * 22:22:10:15:PHPMD\count - * - * @param AbstractASTNode $node - * @return string - */ - protected function getHash(AbstractASTNode $node) - { - return sprintf( - '%s:%s:%s:%s:%s', - $node->getStartLine(), - $node->getEndLine(), - $node->getStartColumn(), - $node->getEndColumn(), - $node->getImage() - ); - } - - /** - * Checks the given function against the list of unwanted functions - * - * @param ASTNode $function - * @return bool - */ - protected function isUnwantedFunction(ASTNode $function) - { - $functionName = str_replace($this->currentNamespace, '', $function->getImage()); - - return in_array($functionName, $this->unwantedFunctions); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/CouplingBetweenObjects.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/CouplingBetweenObjects.php deleted file mode 100644 index 890a726..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/CouplingBetweenObjects.php +++ /dev/null @@ -1,45 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\ClassAware; - -/** - * This rule class detects violations of Coupling Between Objects metric. - * - * @since 1.1.0 - */ -class CouplingBetweenObjects extends AbstractRule implements ClassAware -{ - /** - * This method should implement the violation analysis algorithm of concrete - * rule implementations. All extending classes must implement this method. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $cbo = $node->getMetric('cbo'); - if ($cbo >= ($threshold = $this->getIntProperty('maximum'))) { - $this->addViolation($node, array($node->getName(), $cbo, $threshold)); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/DepthOfInheritance.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/DepthOfInheritance.php deleted file mode 100644 index 9d4cd5d..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/DepthOfInheritance.php +++ /dev/null @@ -1,61 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\ClassAware; - -/** - * This rule will detect classes that are to deep in the inheritance tree. - */ -class DepthOfInheritance extends AbstractRule implements ClassAware -{ - /** - * This method checks the number of parents for the given class - * node. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - try { - $threshold = $this->getIntProperty('maximum'); - $comparision = 1; - } catch (\OutOfBoundsException $e) { - $threshold = $this->getIntProperty('minimum'); - $comparision = 2; - } - - $dit = $node->getMetric('dit'); - if (($comparision === 1 && $dit > $threshold) || - ($comparision === 2 && $dit >= $threshold) - ) { - $this->addViolation( - $node, - array( - $node->getType(), - $node->getName(), - $dit, - $threshold - ) - ); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/DevelopmentCodeFragment.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/DevelopmentCodeFragment.php deleted file mode 100644 index 0c183f4..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/DevelopmentCodeFragment.php +++ /dev/null @@ -1,84 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\MethodNode; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class detects possible development code fragments that were left - * into the code. - * - * @link https://github.com/phpmd/phpmd/issues/265 - * @since 2.3.0 - */ -class DevelopmentCodeFragment extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * This method checks if a given function or method contains an eval-expression - * and emits a rule violation when it exists. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $ignoreNS = $this->getBooleanProperty('ignore-namespaces'); - $namespace = $node->getNamespaceName(); - foreach ($node->findChildrenOfType('FunctionPostfix') as $postfix) { - $fragment = $postfix->getImage(); - if ($ignoreNS) { - $fragment = str_replace("{$namespace}\\", "", $fragment); - } - $fragment = strtolower($fragment); - if (false === in_array($fragment, $this->getSuspectImages())) { - continue; - } - - $image = $node->getImage(); - if ($node instanceof MethodNode) { - $image = sprintf('%s::%s', $node->getParentName(), $node->getImage()); - } - - $this->addViolation($postfix, array($node->getType(), $image, $fragment)); - } - } - - /** - * Returns an array with function images that are normally only used during - * development. - * - * @return array - */ - private function getSuspectImages() - { - return array_map( - 'strtolower', - array_map( - 'trim', - explode( - ',', - $this->getStringProperty('unwanted-functions') - ) - ) - ); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/EmptyCatchBlock.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/EmptyCatchBlock.php deleted file mode 100644 index 3109bfd..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/EmptyCatchBlock.php +++ /dev/null @@ -1,49 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class detects empty catch blocks - * - * @author Grégoire Paris - * @author Kamil Szymanski - */ -class EmptyCatchBlock extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * This method checks if a given function or method contains an empty catch block - * and emits a rule violation when it exists. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->findChildrenOfType('CatchStatement') as $catchBlock) { - $scope = $catchBlock->getFirstChildOfType('ScopeStatement'); - if (count($scope->getChildren()) == 0) { - $this->addViolation($catchBlock, array($node->getName())); - } - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/EvalExpression.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/EvalExpression.php deleted file mode 100644 index af2f600..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/EvalExpression.php +++ /dev/null @@ -1,43 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class detects the usage of PHP's eval-expression. - */ -class EvalExpression extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * This method checks if a given function or method contains an eval-expression - * and emits a rule violation when it exists. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->findChildrenOfType('EvalExpression') as $eval) { - $this->addViolation($eval, array($node->getType(), $node->getName())); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/ExitExpression.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/ExitExpression.php deleted file mode 100644 index 6eff697..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/ExitExpression.php +++ /dev/null @@ -1,43 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class detects the usage of PHP's exit statement. - */ -class ExitExpression extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * This method checks if a given function or method contains an exit-expression - * and emits a rule violation when it exists. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->findChildrenOfType('ExitExpression') as $exit) { - $this->addViolation($exit, array($node->getType(), $node->getName())); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/GotoStatement.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/GotoStatement.php deleted file mode 100644 index ee055c8..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/GotoStatement.php +++ /dev/null @@ -1,45 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class detects the usage of PHP's goto statement. - * - * @since 1.1.0 - */ -class GotoStatement extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * This method should implement the violation analysis algorithm of concrete - * rule implementations. All extending classes must implement this method. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->findChildrenOfType('GotoStatement') as $goto) { - $this->addViolation($goto, array($node->getType(), $node->getName())); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongClass.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongClass.php deleted file mode 100644 index 20fb965..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongClass.php +++ /dev/null @@ -1,54 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\ClassAware; - -/** - * This rule class will detect excessive long classes. - */ -class LongClass extends AbstractRule implements ClassAware -{ - /** - * This method checks the length of the given class node against a configured - * threshold. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $threshold = $this->getIntProperty('minimum'); - - $loc = -1; - if ($this->getBooleanProperty('ignore-whitespace')) { - $loc = $node->getMetric('eloc'); - } - if (-1 === $loc) { - $loc = $node->getMetric('loc'); - } - - if ($loc < $threshold) { - return; - } - - $this->addViolation($node, array($node->getName(), $loc, $threshold)); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongMethod.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongMethod.php deleted file mode 100644 index 69343b9..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongMethod.php +++ /dev/null @@ -1,64 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule will detect to long methods, those methods are unreadable and in - * many cases the result of copy and paste coding. - */ -class LongMethod extends AbstractRule implements FunctionAware, MethodAware -{ - /** - * This method checks the lines of code length for the given function or - * methode node against a configured threshold. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $threshold = $this->getIntProperty('minimum'); - - $loc = -1; - if ($this->getBooleanProperty('ignore-whitespace')) { - $loc = $node->getMetric('eloc'); - } - if (-1 === $loc) { - $loc = $node->getMetric('loc'); - } - - if ($loc < $threshold) { - return; - } - - $this->addViolation( - $node, - array( - $node->getType(), - $node->getName(), - $loc, - $threshold - ) - ); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongParameterList.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongParameterList.php deleted file mode 100644 index 7e533b2..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/LongParameterList.php +++ /dev/null @@ -1,55 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class checks for excessive long function and method parameter lists. - */ -class LongParameterList extends AbstractRule implements FunctionAware, MethodAware -{ - /** - * This method checks the number of arguments for the given function or method - * node against a configured threshold. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $threshold = $this->getIntProperty('minimum'); - $count = $node->getParameterCount(); - if ($count < $threshold) { - return; - } - - $this->addViolation( - $node, - array( - $node->getType(), - $node->getName(), - $count, - $threshold - ) - ); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/NpathComplexity.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/NpathComplexity.php deleted file mode 100644 index 05fccd0..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/NpathComplexity.php +++ /dev/null @@ -1,56 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule will check the NPath-complexity of a method or function against the - * configured threshold. - */ -class NpathComplexity extends AbstractRule implements FunctionAware, MethodAware -{ - /** - * This method checks the acyclic complexity for the given node against a - * configured threshold. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $threshold = $this->getIntProperty('minimum'); - $npath = $node->getMetric('npath'); - if ($npath < $threshold) { - return; - } - - $this->addViolation( - $node, - array( - $node->getType(), - $node->getName(), - $npath, - $threshold - ) - ); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/NumberOfChildren.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/NumberOfChildren.php deleted file mode 100644 index a0a3cbf..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/NumberOfChildren.php +++ /dev/null @@ -1,52 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\ClassAware; - -/** - * This rule will detect class that have to much direct child classes. - */ -class NumberOfChildren extends AbstractRule implements ClassAware -{ - /** - * This method checks the number of classes derived from the given class - * node. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $nocc = $node->getMetric('nocc'); - $threshold = $this->getIntProperty('minimum'); - if ($nocc >= $threshold) { - $this->addViolation( - $node, - array( - $node->getType(), - $node->getName(), - $nocc, - $threshold - ) - ); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyFields.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyFields.php deleted file mode 100644 index 881dfc2..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyFields.php +++ /dev/null @@ -1,53 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\ClassAware; - -/** - * This rule class will detect all classes with too much fields. - */ -class TooManyFields extends AbstractRule implements ClassAware -{ - /** - * This method checks the number of methods with in a given class and checks - * this number against a configured threshold. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $threshold = $this->getIntProperty('maxfields'); - $vars = $node->getMetric('vars'); - if ($vars <= $threshold) { - return; - } - $this->addViolation( - $node, - array( - $node->getType(), - $node->getName(), - $vars, - $threshold - ) - ); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyMethods.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyMethods.php deleted file mode 100644 index b8431a5..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyMethods.php +++ /dev/null @@ -1,84 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\AbstractTypeNode; -use PHPMD\Rule\ClassAware; - -/** - * This rule class will detect all classes with too much methods. - */ -class TooManyMethods extends AbstractRule implements ClassAware -{ - /** - * Regular expression that filters all methods that are ignored by this rule. - * - * @var string - */ - private $ignoreRegexp; - - /** - * This method checks the number of methods with in a given class and checks - * this number against a configured threshold. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $this->ignoreRegexp = $this->getStringProperty('ignorepattern'); - - $threshold = $this->getIntProperty('maxmethods'); - if ($node->getMetric('nom') <= $threshold) { - return; - } - /** @var AbstractTypeNode $node */ - $nom = $this->countMethods($node); - if ($nom <= $threshold) { - return; - } - $this->addViolation( - $node, - array( - $node->getType(), - $node->getName(), - $nom, - $threshold - ) - ); - } - - /** - * Counts all methods within the given class/interface node. - * - * @param \PHPMD\Node\AbstractTypeNode $node - * @return integer - */ - private function countMethods(AbstractTypeNode $node) - { - $count = 0; - foreach ($node->getMethodNames() as $name) { - if (preg_match($this->ignoreRegexp, $name) === 0) { - ++$count; - } - } - return $count; - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyPublicMethods.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyPublicMethods.php deleted file mode 100644 index b035460..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/TooManyPublicMethods.php +++ /dev/null @@ -1,84 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\AbstractTypeNode; -use PHPMD\Rule\ClassAware; - -/** - * This rule class will detect all classes with too much public methods. - */ -class TooManyPublicMethods extends AbstractRule implements ClassAware -{ - /** - * Regular expression that filters all methods that are ignored by this rule. - * - * @var string - */ - private $ignoreRegexp; - - /** - * This method checks the number of public methods with in a given class and checks - * this number against a configured threshold. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $this->ignoreRegexp = $this->getStringProperty('ignorepattern'); - - $threshold = $this->getIntProperty('maxmethods'); - if ($node->getMetric('npm') <= $threshold) { - return; - } - /** @var AbstractTypeNode $node */ - $nom = $this->countMethods($node); - if ($nom <= $threshold) { - return; - } - $this->addViolation( - $node, - array( - $node->getType(), - $node->getName(), - $nom, - $threshold - ) - ); - } - - /** - * Counts public methods within the given class/interface node. - * - * @param \PHPMD\Node\AbstractTypeNode $node - * @return integer - */ - private function countMethods(AbstractTypeNode $node) - { - $count = 0; - foreach ($node->getMethods() as $method) { - if ($method->getNode()->isPublic() && preg_match($this->ignoreRegexp, $method->getName()) === 0) { - ++$count; - } - } - return $count; - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/WeightedMethodCount.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/WeightedMethodCount.php deleted file mode 100644 index 74ad206..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Design/WeightedMethodCount.php +++ /dev/null @@ -1,48 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Design; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\ClassAware; - -/** - * This rule checks a given class against a configured weighted method count - * threshold. - * - * @since 0.2.5 - */ -class WeightedMethodCount extends AbstractRule implements ClassAware -{ - /** - * This method checks the weighted method count for the given class against - * a configured threshold. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $threshold = $this->getIntProperty('maximum'); - $actual = $node->getMetric('wmc'); - - if ($actual >= $threshold) { - $this->addViolation($node, array($node->getName(), $actual, $threshold)); - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/ExcessivePublicCount.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/ExcessivePublicCount.php deleted file mode 100644 index 6327017..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/ExcessivePublicCount.php +++ /dev/null @@ -1,53 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; - -/** - * This rule checks the number of public methods and fields in a given class. - * Then it compares the number of public members against a configured threshold. - */ -class ExcessivePublicCount extends AbstractRule implements ClassAware -{ - /** - * This method checks the number of public fields and methods in the given - * class and checks that value against a configured threshold. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $threshold = $this->getIntProperty('minimum'); - $cis = $node->getMetric('cis'); - if ($cis < $threshold) { - return; - } - $this->addViolation( - $node, - array( - $node->getType(), - $node->getName(), - $cis, - $threshold - ) - ); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/FunctionAware.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/FunctionAware.php deleted file mode 100644 index 2931094..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/FunctionAware.php +++ /dev/null @@ -1,25 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule; - -/** - * This interface is used to mark a rule implementation as function aware. - */ -interface FunctionAware -{ -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/InterfaceAware.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/InterfaceAware.php deleted file mode 100644 index 37b65f5..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/InterfaceAware.php +++ /dev/null @@ -1,25 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule; - -/** - * This interface marks a rule implementation as interface aware, - */ -interface InterfaceAware -{ -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/MethodAware.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/MethodAware.php deleted file mode 100644 index 24aa31a..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/MethodAware.php +++ /dev/null @@ -1,25 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule; - -/** - * This interface marks a rule implementation as method aware, - */ -interface MethodAware -{ -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/BooleanGetMethodName.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/BooleanGetMethodName.php deleted file mode 100644 index 5eaa4da..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/BooleanGetMethodName.php +++ /dev/null @@ -1,98 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Naming; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\MethodNode; -use PHPMD\Rule\MethodAware; - -/** - * This rule tests that a method which returns a boolean value does not start - * with get or _get for a getter. - */ -class BooleanGetMethodName extends AbstractRule implements MethodAware -{ - /** - * Extracts all variable and variable declarator nodes from the given node - * and checks the variable name length against the configured minimum - * length. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - /** @var $node MethodNode */ - if ($this->isBooleanGetMethod($node)) { - $this->addViolation($node, array($node->getImage())); - } - } - - /** - * Tests if the given method matches all criteria to be an invalid - * boolean get method. - * - * @param \PHPMD\Node\MethodNode $node - * @return boolean - */ - private function isBooleanGetMethod(MethodNode $node) - { - return $this->isGetterMethodName($node) - && $this->isReturnTypeBoolean($node) - && $this->isParameterizedOrIgnored($node); - } - - /** - * Tests if the given method starts with get or _get. - * - * @param \PHPMD\Node\MethodNode $node - * @return boolean - */ - private function isGetterMethodName(MethodNode $node) - { - return (preg_match('(^_?get)i', $node->getImage()) > 0); - } - - /** - * Tests if the given method is declared with return type boolean. - * - * @param \PHPMD\Node\MethodNode $node - * @return boolean - */ - private function isReturnTypeBoolean(MethodNode $node) - { - $comment = $node->getDocComment(); - return (preg_match('(\*\s*@return\s+bool(ean)?\s)i', $comment) > 0); - } - - /** - * Tests if the property $checkParameterizedMethods is set to true - * or has no parameters. - * - * @param \PHPMD\Node\MethodNode $node - * @return boolean - */ - private function isParameterizedOrIgnored(MethodNode $node) - { - if ($this->getBooleanProperty('checkParameterizedMethods')) { - return $node->getParameterCount() === 0; - } - return true; - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ConstantNamingConventions.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ConstantNamingConventions.php deleted file mode 100644 index e36fc25..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ConstantNamingConventions.php +++ /dev/null @@ -1,46 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Naming; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\ClassAware; -use PHPMD\Rule\InterfaceAware; - -/** - * This rule detects class/interface constants that do not follow the upper - * case convention. - */ -class ConstantNamingConventions extends AbstractRule implements ClassAware, InterfaceAware -{ - /** - * Extracts all constant declarations from the given node and tests that - * the image only contains upper case characters. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - foreach ($node->findChildrenOfType('ConstantDeclarator') as $declarator) { - if ($declarator->getImage() !== strtoupper($declarator->getImage())) { - $this->addViolation($declarator, array($declarator->getImage())); - } - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ConstructorWithNameAsEnclosingClass.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ConstructorWithNameAsEnclosingClass.php deleted file mode 100644 index 6855e38..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ConstructorWithNameAsEnclosingClass.php +++ /dev/null @@ -1,56 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Naming; - -use PDepend\Source\AST\ASTTrait; -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\InterfaceNode; -use PHPMD\Rule\MethodAware; - -/** - * This rule class will detect methods that define a php4 style constructor - * method while has the same name as the enclosing class. - */ -class ConstructorWithNameAsEnclosingClass extends AbstractRule implements MethodAware -{ - /** - * Is method has the same name as the enclosing class - * (php4 style constructor). - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - if ($node->getNode()->getParent() instanceof ASTTrait) { - return; - } - if (strcasecmp($node->getName(), $node->getParentName()) !== 0) { - return; - } - if ($node->getParentType() instanceof InterfaceNode) { - return; - } - if ($node->getNamespaceName() !== '+global') { - return; - } - - $this->addViolation($node); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/LongVariable.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/LongVariable.php deleted file mode 100644 index b3cf241..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/LongVariable.php +++ /dev/null @@ -1,172 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Naming; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\ClassAware; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class will detect variables, parameters and properties with really - * long names. - */ -class LongVariable extends AbstractRule implements ClassAware, MethodAware, FunctionAware -{ - /** - * Temporary map holding variables that were already processed in the - * current context. - * - * @var array(string=>boolean) - */ - private $processedVariables = array(); - - /** - * Extracts all variable and variable declarator nodes from the given node - * and checks the variable name length against the configured maximum - * length. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $this->resetProcessed(); - - if ($node->getType() === 'class') { - $fields = $node->findChildrenOfType('FieldDeclaration'); - foreach ($fields as $field) { - $declarators = $field->findChildrenOfType('VariableDeclarator'); - foreach ($declarators as $declarator) { - $this->checkNodeImage($declarator); - } - } - $this->resetProcessed(); - return; - } - $declarators = $node->findChildrenOfType('VariableDeclarator'); - foreach ($declarators as $declarator) { - $this->checkNodeImage($declarator); - } - - $variables = $node->findChildrenOfType('Variable'); - foreach ($variables as $variable) { - $this->checkNodeImage($variable); - } - - $this->resetProcessed(); - } - - /** - * Checks if the variable name of the given node is smaller/equal to the - * configured threshold. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - protected function checkNodeImage(AbstractNode $node) - { - if ($this->isNotProcessed($node)) { - $this->addProcessed($node); - $this->checkMaximumLength($node); - } - } - - /** - * Template method that performs the real node image check. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - protected function checkMaximumLength(AbstractNode $node) - { - $threshold = $this->getIntProperty('maximum'); - if ($threshold >= strlen($node->getImage()) - 1) { - return; - } - if ($this->isNameAllowedInContext($node)) { - return; - } - $this->addViolation($node, array($node->getImage(), $threshold)); - } - - /** - * Checks if a short name is acceptable in the current context. For the - * moment the only context is a static member. - * - * @param \PHPMD\AbstractNode $node - * @return boolean - */ - private function isNameAllowedInContext(AbstractNode $node) - { - return $this->isChildOf($node, 'MemberPrimaryPrefix'); - } - - /** - * Checks if the given node is a direct or indirect child of a node with - * the given type. - * - * @param \PHPMD\AbstractNode $node - * @param string $type - * @return boolean - */ - private function isChildOf(AbstractNode $node, $type) - { - $parent = $node->getParent(); - while (is_object($parent)) { - if ($parent->isInstanceOf($type)) { - return true; - } - $parent = $parent->getParent(); - } - return false; - } - - /** - * Resets the already processed nodes. - * - * @return void - */ - protected function resetProcessed() - { - $this->processedVariables = array(); - } - - /** - * Flags the given node as already processed. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - protected function addProcessed(AbstractNode $node) - { - $this->processedVariables[$node->getImage()] = true; - } - - /** - * Checks if the given node was already processed. - * - * @param \PHPMD\AbstractNode $node - * @return boolean - */ - protected function isNotProcessed(AbstractNode $node) - { - return !isset($this->processedVariables[$node->getImage()]); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ShortMethodName.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ShortMethodName.php deleted file mode 100644 index 7298fc5..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ShortMethodName.php +++ /dev/null @@ -1,76 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Naming; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class will detect methods and functions with very short names. - */ -class ShortMethodName extends AbstractRule implements MethodAware, FunctionAware -{ - /** - * Extracts all variable and variable declarator nodes from the given node - * and checks the variable name length against the configured minimum - * length. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $threshold = $this->getIntProperty('minimum'); - if ($threshold <= strlen($node->getName())) { - return; - } - - $exceptions = $this->getExceptionsList(); - - if (in_array($node->getName(), $exceptions)) { - return; - } - - $this->addViolation( - $node, - array( - $node->getParentName(), - $node->getName(), - $threshold - ) - ); - } - - /** - * Gets array of exceptions from property - * - * @return array - */ - private function getExceptionsList() - { - try { - $exceptions = $this->getStringProperty('exceptions'); - } catch (\OutOfBoundsException $e) { - $exceptions = ''; - } - - return explode(',', $exceptions); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ShortVariable.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ShortVariable.php deleted file mode 100644 index 8294527..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/Naming/ShortVariable.php +++ /dev/null @@ -1,230 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule\Naming; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Rule\ClassAware; -use PHPMD\Rule\FunctionAware; -use PHPMD\Rule\MethodAware; - -/** - * This rule class will detect variables, parameters and properties with short - * names. - */ -class ShortVariable extends AbstractRule implements ClassAware, MethodAware, FunctionAware -{ - /** - * Temporary map holding variables that were already processed in the - * current context. - * - * @var array(string=>boolean) - */ - private $processedVariables = array(); - - /** - * Extracts all variable and variable declarator nodes from the given node - * - * Checks the variable name length against the configured minimum - * length. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $this->resetProcessed(); - - if ($node->getType() === 'class') { - $this->applyClass($node); - return; - } - - $this->applyNonClass($node); - } - - /** - * Extracts all variable and variable declarator nodes from the given class node - * - * Checks the variable name length against the configured minimum - * length. - * - * @param AbstractNode $node - * @return void - */ - private function applyClass(AbstractNode $node) - { - $fields = $node->findChildrenOfType('FieldDeclaration'); - foreach ($fields as $field) { - $declarators = $field->findChildrenOfType('VariableDeclarator'); - foreach ($declarators as $declarator) { - $this->checkNodeImage($declarator); - } - } - $this->resetProcessed(); - } - - /** - * Extracts all variable and variable declarator nodes from the given non-class node - * - * Checks the variable name length against the configured minimum - * length. - * - * @param AbstractNode $node - * @return void - */ - private function applyNonClass(AbstractNode $node) - { - $declarators = $node->findChildrenOfType('VariableDeclarator'); - foreach ($declarators as $declarator) { - $this->checkNodeImage($declarator); - } - - $variables = $node->findChildrenOfType('Variable'); - foreach ($variables as $variable) { - $this->checkNodeImage($variable); - } - $this->resetProcessed(); - } - - /** - * Checks if the variable name of the given node is greater/equal to the - * configured threshold or if the given node is an allowed context. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - protected function checkNodeImage(AbstractNode $node) - { - if ($this->isNotProcessed($node)) { - $this->addProcessed($node); - $this->checkMinimumLength($node); - } - } - - /** - * Template method that performs the real node image check. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - protected function checkMinimumLength(AbstractNode $node) - { - $threshold = $this->getIntProperty('minimum'); - - if ($threshold <= strlen($node->getImage()) - 1) { - return; - } - - if ($this->isNameAllowedInContext($node)) { - return; - } - - $exceptions = $this->getExceptionsList(); - - if (in_array(substr($node->getImage(), 1), $exceptions)) { - return; - } - - $this->addViolation($node, array($node->getImage(), $threshold)); - } - - /** - * Gets array of exceptions from property - * - * @return array - */ - private function getExceptionsList() - { - try { - $exceptions = $this->getStringProperty('exceptions'); - } catch (\OutOfBoundsException $e) { - $exceptions = ''; - } - - return explode(',', $exceptions); - } - - /** - * Checks if a short name is acceptable in the current context. For the - * moment these contexts are the init section of a for-loop and short - * variable names in catch-statements. - * - * @param \PHPMD\AbstractNode $node - * @return boolean - */ - private function isNameAllowedInContext(AbstractNode $node) - { - return $this->isChildOf($node, 'CatchStatement') - || $this->isChildOf($node, 'ForInit') - || $this->isChildOf($node, 'ForeachStatement') - || $this->isChildOf($node, 'MemberPrimaryPrefix'); - } - - /** - * Checks if the given node is a direct or indirect child of a node with - * the given type. - * - * @param \PHPMD\AbstractNode $node - * @param string $type - * @return boolean - */ - private function isChildOf(AbstractNode $node, $type) - { - $parent = $node->getParent(); - while (is_object($parent)) { - if ($parent->isInstanceOf($type)) { - return true; - } - $parent = $parent->getParent(); - } - return false; - } - - /** - * Resets the already processed nodes. - * - * @return void - */ - protected function resetProcessed() - { - $this->processedVariables = array(); - } - - /** - * Flags the given node as already processed. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - protected function addProcessed(AbstractNode $node) - { - $this->processedVariables[$node->getImage()] = true; - } - - /** - * Checks if the given node was already processed. - * - * @param \PHPMD\AbstractNode $node - * @return boolean - */ - protected function isNotProcessed(AbstractNode $node) - { - return !isset($this->processedVariables[$node->getImage()]); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedFormalParameter.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedFormalParameter.php deleted file mode 100644 index 288f7af..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedFormalParameter.php +++ /dev/null @@ -1,250 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule; - -use PHPMD\AbstractNode; -use PHPMD\Node\ASTNode; -use PHPMD\Node\MethodNode; - -/** - * This rule collects all formal parameters of a given function or method that - * are not used in a statement of the artifact's body. - */ -class UnusedFormalParameter extends AbstractLocalVariable implements FunctionAware, MethodAware -{ - /** - * Collected ast nodes. - * - * @var \PHPMD\Node\ASTNode[] - */ - private $nodes = array(); - - /** - * This method checks that all parameters of a given function or method are - * used at least one time within the artifacts body. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - if ($this->isAbstractMethod($node)) { - return; - } - - // Magic methods should be ignored as invalid declarations are picked up by PHP. - if ($this->isMagicMethod($node)) { - return; - } - - if ($this->isInheritedSignature($node)) { - return; - } - - if ($this->isNotDeclaration($node)) { - return; - } - - $this->nodes = array(); - - $this->collectParameters($node); - $this->removeUsedParameters($node); - - foreach ($this->nodes as $node) { - $this->addViolation($node, array($node->getImage())); - } - } - - /** - * Returns true when the given node is an abstract method. - * - * @param \PHPMD\AbstractNode $node - * @return boolean - */ - private function isAbstractMethod(AbstractNode $node) - { - if ($node instanceof MethodNode) { - return $node->isAbstract(); - } - return false; - } - - /** - * Returns true when the given node is method with signature declared as inherited using - * {@inheritdoc} annotation. - * - * @param \PHPMD\AbstractNode $node - * @return boolean - */ - private function isInheritedSignature(AbstractNode $node) - { - if ($node instanceof MethodNode) { - return preg_match('/\@inheritdoc/i', $node->getDocComment()); - } - return false; - } - - /** - * Returns true when the given node is a magic method signature - * @param AbstractNode $node - * @return boolean - */ - private function isMagicMethod(AbstractNode $node) - { - static $names = array( - 'call', - 'callStatic', - 'get', - 'set', - 'isset', - 'unset', - 'set_state' - ); - - if ($node instanceof MethodNode) { - return preg_match('/\__(?:' . implode("|", $names) . ')/i', $node->getName()); - } - return false; - } - - /** - * Tests if the given $node is a method and if this method is also - * the initial declaration. - * - * @param \PHPMD\AbstractNode $node - * @return boolean - * @since 1.2.1 - */ - private function isNotDeclaration(AbstractNode $node) - { - if ($node instanceof MethodNode) { - return !$node->isDeclaration(); - } - return false; - } - - /** - * This method extracts all parameters for the given function or method node - * and it stores the parameter images in the $_images property. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - private function collectParameters(AbstractNode $node) - { - // First collect the formal parameters container - $parameters = $node->getFirstChildOfType('FormalParameters'); - - // Now get all declarators in the formal parameters container - $declarators = $parameters->findChildrenOfType('VariableDeclarator'); - - foreach ($declarators as $declarator) { - $this->nodes[$declarator->getImage()] = $declarator; - } - } - - /** - * This method collects all local variables in the body of the currently - * analyzed method or function and removes those parameters that are - * referenced by one of the collected variables. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - private function removeUsedParameters(AbstractNode $node) - { - $this->removeRegularVariables($node); - $this->removeCompoundVariables($node); - $this->removeVariablesUsedByFuncGetArgs($node); - } - - /** - * Removes all the regular variables from a given node - * - * @param \PHPMD\AbstractNode $node The node to remove the regular variables from. - * @return void - */ - private function removeRegularVariables(AbstractNode $node) - { - $variables = $node->findChildrenOfType('Variable'); - foreach ($variables as $variable) { - /** @var $variable ASTNode */ - if ($this->isRegularVariable($variable)) { - unset($this->nodes[$variable->getImage()]); - } - } - } - - /** - * Removes all the compound variables from a given node - * - * Such as - * - * - * // ------ - * Foo::${BAR}(); - * // ------ - * - * // ------ - * Foo::$${BAR}(); - * // ------ - * - * - * @param \PHPMD\AbstractNode $node The node to remove the compound variables from. - * @return void - */ - private function removeCompoundVariables(AbstractNode $node) - { - $compoundVariables = $node->findChildrenOfType('CompoundVariable'); - foreach ($compoundVariables as $compoundVariable) { - $variablePrefix = $compoundVariable->getImage(); - - foreach ($compoundVariable->findChildrenOfType('Expression') as $child) { - $variableImage = $variablePrefix . $child->getImage(); - - if (isset($this->nodes[$variableImage])) { - unset($this->nodes[$variableImage]); - } - } - } - } - - /** - * Removes all the variables from a given node, if func_get_args() is called within - * - * If the given method calls func_get_args() then all parameters are automatically referenced. - * - * @param \PHPMD\AbstractNode $node The node to remove the referneced variables from. - * @return void - */ - private function removeVariablesUsedByFuncGetArgs(AbstractNode $node) - { - $functionCalls = $node->findChildrenOfType('FunctionPostfix'); - foreach ($functionCalls as $functionCall) { - if ($this->isFunctionNameEqual($functionCall, 'func_get_args')) { - $this->nodes = array(); - } - - if ($this->isFunctionNameEndingWith($functionCall, 'compact')) { - foreach ($functionCall->findChildrenOfType('Literal') as $literal) { - unset($this->nodes['$' . trim($literal->getImage(), '"\'')]); - } - } - } - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedLocalVariable.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedLocalVariable.php deleted file mode 100644 index 5330ad8..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedLocalVariable.php +++ /dev/null @@ -1,262 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule; - -use PHPMD\AbstractNode; -use PHPMD\Node\AbstractCallableNode; -use PHPMD\Node\ASTNode; - -/** - * This rule collects all local variables within a given function or method - * that are not used by any code in the analyzed source artifact. - */ -class UnusedLocalVariable extends AbstractLocalVariable implements FunctionAware, MethodAware -{ - /** - * Found variable images within a single method or function. - * - * @var array(string) - */ - private $images = array(); - - /** - * This method checks that all local variables within the given function or - * method are used at least one time. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - $this->images = array(); - - /** @var $node AbstractCallableNode */ - $this->collectVariables($node); - $this->removeParameters($node); - - foreach ($this->images as $nodes) { - if (count($nodes) === 1) { - $this->doCheckNodeImage($nodes[0]); - } - } - } - - /** - * This method removes all variables from the $_images property that - * are also found in the formal parameters of the given method or/and - * function node. - * - * @param \PHPMD\Node\AbstractCallableNode $node - * @return void - */ - private function removeParameters(AbstractCallableNode $node) - { - // Get formal parameter container - $parameters = $node->getFirstChildOfType('FormalParameters'); - - // Now get all declarators in the formal parameters container - $declarators = $parameters->findChildrenOfType('VariableDeclarator'); - - foreach ($declarators as $declarator) { - unset($this->images[$declarator->getImage()]); - } - } - - /** - * This method collects all local variable instances from the given - * method/function node and stores their image in the $_images - * property. - * - * - * @param \PHPMD\Node\AbstractCallableNode $node - * @return void - */ - private function collectVariables(AbstractCallableNode $node) - { - foreach ($node->findChildrenOfType('Variable') as $variable) { - /** @var $variable ASTNode */ - if ($this->isLocal($variable)) { - $this->collectVariable($variable); - } - } - - foreach ($node->findChildrenOfType('CompoundVariable') as $variable) { - $this->collectCompoundVariableInString($variable); - } - - foreach ($node->findChildrenOfType('VariableDeclarator') as $variable) { - $this->collectVariable($variable); - } - foreach ($node->findChildrenOfType('FunctionPostfix') as $func) { - if ($this->isFunctionNameEndingWith($func, 'compact')) { - foreach ($func->findChildrenOfType('Literal') as $literal) { - /** @var $literal ASTNode */ - $this->collectLiteral($literal); - } - } - } - } - - /** - * Stores the given compound variable node in an internal list of found variables. - * - * @param \PHPMD\Node\ASTNode $node - * @return void - */ - private function collectCompoundVariableInString(ASTNode $node) - { - $parentNode = $node->getParent()->getNode(); - $candidateParentNodes = $node->getParentsOfType('PDepend\Source\AST\ASTString'); - - if (in_array($parentNode, $candidateParentNodes)) { - $variablePrefix = $node->getImage(); - - foreach ($node->findChildrenOfType('Expression') as $child) { - $variableName = $child->getImage(); - $variableImage = $variablePrefix . $variableName; - - $this->storeImage($variableImage, $node); - } - } - } - - /** - * Stores the given variable node in an internal list of found variables. - * - * @param \PHPMD\Node\ASTNode $node - * @return void - */ - private function collectVariable(ASTNode $node) - { - $imageName = $node->getImage(); - $this->storeImage($imageName, $node); - } - - /** - * Safely add node to $this->images. - * - * @param string $imageName the name to store the node as - * @param \PHPMD\Node\ASTNode $node the node being stored - * @return void - */ - private function storeImage($imageName, ASTNode $node) - { - if (!isset($this->images[$imageName])) { - $this->images[$imageName] = array(); - } - $this->images[$imageName][] = $node; - } - - /** - * Stores the given literal node in an internal list of found variables. - * - * @param \PHPMD\Node\ASTNode $node - * @return void - */ - private function collectLiteral(ASTNode $node) - { - $variable = '$' . trim($node->getImage(), '\''); - if (!isset($this->images[$variable])) { - $this->images[$variable] = array(); - } - $this->images[$variable][] = $node; - } - - /** - * Template method that performs the real node image check. - * - * @param ASTNode $node - * @return void - */ - protected function doCheckNodeImage(ASTNode $node) - { - if ($this->isNameAllowedInContext($node)) { - return; - } - if ($this->isUnusedForeachVariableAllowed($node)) { - return; - } - $exceptions = $this->getExceptionsList(); - if (in_array(substr($node->getImage(), 1), $exceptions)) { - return; - } - $this->addViolation($node, array($node->getImage())); - } - - /** - * Checks if a short name is acceptable in the current context. For the - * moment these contexts are the init section of a for-loop and short - * variable names in catch-statements. - * - * @param \PHPMD\AbstractNode $node - * @return boolean - */ - private function isNameAllowedInContext(AbstractNode $node) - { - return $this->isChildOf($node, 'CatchStatement'); - } - - /** - * Checks if an unused foreach variable (key or variable) is allowed. - * - * If it's not a foreach variable, it returns always false. - * - * @param \PHPMD\Node\ASTNode $variable The variable to check. - * @return bool True if allowed, else false. - */ - private function isUnusedForeachVariableAllowed(ASTNode $variable) - { - $isForeachVariable = $this->isChildOf($variable, 'ForeachStatement'); - if (!$isForeachVariable) { - return false; - } - - return $this->getBooleanProperty('allow-unused-foreach-variables'); - } - - /** - * Checks if the given node is a direct or indirect child of a node with - * the given type. - * - * @param \PHPMD\AbstractNode $node - * @param string $type - * @return boolean - */ - private function isChildOf(AbstractNode $node, $type) - { - $parent = $node->getParent(); - - return $parent->isInstanceOf($type); - } - - /** - * Gets array of exceptions from property - * - * @return array - */ - private function getExceptionsList() - { - try { - $exceptions = $this->getStringProperty('exceptions'); - } catch (\OutOfBoundsException $e) { - $exceptions = ''; - } - - return explode(',', $exceptions); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedPrivateField.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedPrivateField.php deleted file mode 100644 index d550c5f..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedPrivateField.php +++ /dev/null @@ -1,208 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\ASTNode; -use PHPMD\Node\ClassNode; - -/** - * This rule collects all private fields in a class that aren't used in any - * method of the analyzed class. - */ -class UnusedPrivateField extends AbstractRule implements ClassAware -{ - /** - * Collected private fields/variable declarators in the currently processed - * class. - * - * @var \PHPMD\Node\ASTNode[] - */ - private $fields = array(); - - /** - * This method checks that all private class properties are at least accessed - * by one method. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - /** @var ClassNode $field */ - foreach ($this->collectUnusedPrivateFields($node) as $field) { - $this->addViolation($field, array($field->getImage())); - } - } - - /** - * This method collects all private fields that aren't used by any class - * method. - * - * @param \PHPMD\Node\ClassNode $class - * @return \PHPMD\AbstractNode[] - */ - private function collectUnusedPrivateFields(ClassNode $class) - { - $this->fields = array(); - - $this->collectPrivateFields($class); - $this->removeUsedFields($class); - - return $this->fields; - } - - /** - * This method collects all private fields in the given class and stores - * them in the $_fields property. - * - * @param \PHPMD\Node\ClassNode $class - * @return void - */ - private function collectPrivateFields(ClassNode $class) - { - foreach ($class->findChildrenOfType('FieldDeclaration') as $declaration) { - /** @var ASTNode $declaration */ - if ($declaration->isPrivate()) { - $this->collectPrivateField($declaration); - } - } - } - - /** - * This method extracts all variable declarators from the given field - * declaration and stores them in the $_fields property. - * - * @param \PHPMD\Node\ASTNode $declaration - * @return void - */ - private function collectPrivateField(ASTNode $declaration) - { - $fields = $declaration->findChildrenOfType('VariableDeclarator'); - foreach ($fields as $field) { - $this->fields[$field->getImage()] = $field; - } - } - - /** - * This method extracts all property postfix nodes from the given class and - * removes all fields from the $_fields property that are accessed by - * one of the postfix nodes. - * - * @param \PHPMD\Node\ClassNode $class - * @return void - */ - private function removeUsedFields(ClassNode $class) - { - foreach ($class->findChildrenOfType('PropertyPostfix') as $postfix) { - /** @var $postfix ASTNode */ - if ($this->isInScopeOfClass($class, $postfix)) { - $this->removeUsedField($postfix); - } - } - } - - /** - * This method removes the field from the $_fields property that is - * accessed through the given property postfix node. - * - * @param \PHPMD\Node\ASTNode $postfix - * @return void - */ - private function removeUsedField(ASTNode $postfix) - { - $image = '$'; - $child = $postfix->getFirstChildOfType('Identifier'); - - if ($postfix->getParent()->isStatic()) { - $image = ''; - $child = $postfix->getFirstChildOfType('Variable'); - } - - if ($this->isValidPropertyNode($child)) { - unset($this->fields[$image . $child->getImage()]); - } - } - - /** - * Checks if the given node is a valid property node. - * - * @param \PHPMD\Node\ASTNode $node - * @return boolean - * @since 0.2.6 - */ - protected function isValidPropertyNode(ASTNode $node = null) - { - if ($node === null) { - return false; - } - - $parent = $node->getParent(); - while (!$parent->isInstanceOf('PropertyPostfix')) { - if ($parent->isInstanceOf('CompoundVariable')) { - return false; - } - $parent = $parent->getParent(); - if (is_null($parent)) { - return false; - } - } - return true; - } - - /** - * This method checks that the given property postfix is accessed on an - * instance or static reference to the given class. - * - * @param \PHPMD\Node\ClassNode $class - * @param \PHPMD\Node\ASTNode $postfix - * @return boolean - */ - protected function isInScopeOfClass(ClassNode $class, ASTNode $postfix) - { - $owner = $this->getOwner($postfix); - - return ( - $owner->isInstanceOf('SelfReference') || - $owner->isInstanceOf('StaticReference') || - strcasecmp($owner->getImage(), '$this') === 0 || - strcasecmp($owner->getImage(), $class->getImage()) === 0 - ); - } - - /** - * Looks for owner of the given variable. - * - * @param \PHPMD\Node\ASTNode $postfix - * @return \PHPMD\Node\ASTNode - */ - protected function getOwner(ASTNode $postfix) - { - $owner = $postfix->getParent()->getChild(0); - if ($owner->isInstanceOf('PropertyPostfix')) { - $owner = $owner->getParent()->getParent()->getChild(0); - } - - if ($owner->getParent()->isInstanceOf('ArrayIndexExpression')) { - $owner = $owner->getParent()->getParent()->getChild(0); - } - - return $owner; - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedPrivateMethod.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedPrivateMethod.php deleted file mode 100644 index 21047e4..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Rule/UnusedPrivateMethod.php +++ /dev/null @@ -1,134 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Rule; - -use PHPMD\AbstractNode; -use PHPMD\AbstractRule; -use PHPMD\Node\ASTNode; -use PHPMD\Node\ClassNode; -use PHPMD\Node\MethodNode; - -/** - * This rule collects all private methods in a class that aren't used in any - * method of the analyzed class. - */ -class UnusedPrivateMethod extends AbstractRule implements ClassAware -{ - /** - * This method checks that all private class methods are at least accessed - * by one method. - * - * @param \PHPMD\AbstractNode $class - * @return void - */ - public function apply(AbstractNode $class) - { - /** @var ClassNode $node */ - foreach ($this->collectUnusedPrivateMethods($class) as $node) { - $this->addViolation($node, array($node->getImage())); - } - } - - /** - * This method collects all methods in the given class that are declared - * as private and are not used in the same class' context. - * - * @param \PHPMD\Node\ClassNode $class - * @return \PHPMD\AbstractNode[] - */ - private function collectUnusedPrivateMethods(ClassNode $class) - { - $methods = $this->collectPrivateMethods($class); - return $this->removeUsedMethods($class, $methods); - } - - /** - * Collects all private methods declared in the given class node. - * - * @param \PHPMD\Node\ClassNode $class - * @return \PHPMD\AbstractNode[] - */ - private function collectPrivateMethods(ClassNode $class) - { - $methods = array(); - foreach ($class->getMethods() as $method) { - if ($this->acceptMethod($class, $method)) { - $methods[strtolower($method->getImage())] = $method; - } - } - return $methods; - } - - /** - * Returns true when the given method should be used for this rule's - * analysis. - * - * @param \PHPMD\Node\ClassNode $class - * @param \PHPMD\Node\MethodNode $method - * @return boolean - */ - private function acceptMethod(ClassNode $class, MethodNode $method) - { - return ( - $method->isPrivate() && - false === $method->hasSuppressWarningsAnnotationFor($this) && - strcasecmp($method->getImage(), $class->getImage()) !== 0 && - strcasecmp($method->getImage(), '__construct') !== 0 && - strcasecmp($method->getImage(), '__destruct') !== 0 && - strcasecmp($method->getImage(), '__clone') !== 0 - ); - } - - /** - * This method removes all used methods from the given methods array. - * - * @param \PHPMD\Node\ClassNode $class - * @param \PHPMD\Node\MethodNode[] $methods - * @return \PHPMD\AbstractNode[] - */ - private function removeUsedMethods(ClassNode $class, array $methods) - { - foreach ($class->findChildrenOfType('MethodPostfix') as $postfix) { - /** @var $postfix ASTNode */ - if ($this->isClassScope($class, $postfix)) { - unset($methods[strtolower($postfix->getImage())]); - } - } - return $methods; - } - - /** - * This method checks that the given method postfix is accessed on an - * instance or static reference to the given class. - * - * @param \PHPMD\Node\ClassNode $class - * @param \PHPMD\Node\ASTNode $postfix - * @return boolean - */ - private function isClassScope(ClassNode $class, ASTNode $postfix) - { - $owner = $postfix->getParent()->getChild(0); - return ( - $owner->isInstanceOf('MethodPostfix') || - $owner->isInstanceOf('SelfReference') || - $owner->isInstanceOf('StaticReference') || - strcasecmp($owner->getImage(), '$this') === 0 || - strcasecmp($owner->getImage(), $class->getImage()) === 0 - ); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleClassFileNotFoundException.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleClassFileNotFoundException.php deleted file mode 100644 index b95f534..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleClassFileNotFoundException.php +++ /dev/null @@ -1,35 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -/** - * This type of exception is thrown when the class file for a configured rule - * does not exist within php's include path. - */ -class RuleClassFileNotFoundException extends \RuntimeException -{ - /** - * Constructs a new class file not found exception. - * - * @param string $className The rule class name. - */ - public function __construct($className) - { - parent::__construct('Cannot load source file for class: ' . $className); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleClassNotFoundException.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleClassNotFoundException.php deleted file mode 100644 index 46329ac..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleClassNotFoundException.php +++ /dev/null @@ -1,34 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -/** - * When a configured rule class does not exist. - */ -class RuleClassNotFoundException extends \RuntimeException -{ - /** - * Constructs a new class not found exception. - * - * @param string $className The configured but not found ruke class name. - */ - public function __construct($className) - { - parent::__construct('Cannot find rule class: ' . $className); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSet.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSet.php deleted file mode 100644 index 8383b30..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSet.php +++ /dev/null @@ -1,267 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -/** - * This class is a collection of concrete source analysis rules. - */ -class RuleSet implements \IteratorAggregate -{ - /** - * Should this rule set force the strict mode. - * - * @var boolean - * @since 1.2.0 - */ - private $strict = false; - - /** - * The name of the file where this set is specified. - * - * @var string - */ - private $fileName = ''; - - /** - * The name of this rule-set. - * - * @var string - */ - private $name = ''; - - /** - * An optional description for this rule-set. - * - * @var string - */ - private $description = ''; - - /** - * The violation report used by the rule-set. - * - * @var \PHPMD\Report - */ - private $report; - - /** - * Mapping between marker interfaces and concrete context code node classes. - * - * @var array(string=>string) - */ - private $applyTo = array( - 'PHPMD\\Rule\\ClassAware' => 'PHPMD\\Node\\ClassNode', - 'PHPMD\\Rule\\FunctionAware' => 'PHPMD\\Node\\FunctionNode', - 'PHPMD\\Rule\\InterfaceAware' => 'PHPMD\\Node\\InterfaceNode', - 'PHPMD\\Rule\\MethodAware' => 'PHPMD\\Node\\MethodNode', - ); - - /** - * Mapping of rules that apply to a concrete code node type. - * - * @var array(string=>array) - */ - private $rules = array( - 'PHPMD\\Node\\ClassNode' => array(), - 'PHPMD\\Node\\FunctionNode' => array(), - 'PHPMD\\Node\\InterfaceNode' => array(), - 'PHPMD\\Node\\MethodNode' => array(), - ); - - /** - * Returns the file name where the definition of this rule-set comes from. - * - * @return string - */ - public function getFileName() - { - return $this->fileName; - } - - /** - * Sets the file name where the definition of this rule-set comes from. - * - * @param string $fileName The file name. - * @return void - */ - public function setFileName($fileName) - { - $this->fileName = $fileName; - } - - /** - * Returns the name of this rule-set. - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the name of this rule-set. - * - * @param string $name The name of this rule-set. - * @return void - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Returns the description text for this rule-set instance. - * - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * Sets the description text for this rule-set instance. - * - * @param string $description The description text. - * @return void - */ - public function setDescription($description) - { - $this->description = $description; - } - - /** - * Activates the strict mode for this rule set instance. - * - * @return void - * @since 1.2.0 - */ - public function setStrict() - { - $this->strict = true; - } - - /** - * Returns the violation report used by the rule-set. - * - * @return \PHPMD\Report - */ - public function getReport() - { - return $this->report; - } - - /** - * Sets the violation report used by the rule-set. - * - * @param \PHPMD\Report $report - * @return void - */ - public function setReport(Report $report) - { - $this->report = $report; - } - - /** - * This method returns a rule by its name or null if it doesn't exist. - * - * @param string $name - * @return \PHPMD\Rule - */ - public function getRuleByName($name) - { - foreach ($this->getRules() as $rule) { - if ($rule->getName() === $name) { - return $rule; - } - } - return null; - } - - /** - * This method returns an iterator will all rules that belong to this - * rule-set. - * - * @return \Iterator - */ - public function getRules() - { - $result = array(); - foreach ($this->rules as $rules) { - foreach ($rules as $rule) { - if (in_array($rule, $result, true) === false) { - $result[] = $rule; - } - } - } - - return new \ArrayIterator($result); - } - - /** - * Adds a new rule to this rule-set. - * - * @param \PHPMD\Rule $rule - * @return void - */ - public function addRule(Rule $rule) - { - foreach ($this->applyTo as $applyTo => $type) { - if ($rule instanceof $applyTo) { - $this->rules[$type][] = $rule; - } - } - } - - /** - * Applies all registered rules that match against the concrete node type. - * - * @param \PHPMD\AbstractNode $node - * @return void - */ - public function apply(AbstractNode $node) - { - // Current node type - $className = get_class($node); - - // Check for valid node type - if (!isset($this->rules[$className])) { - return; - } - - // Apply all rules to this node - foreach ($this->rules[$className] as $rule) { - /** @var $rule Rule */ - if ($node->hasSuppressWarningsAnnotationFor($rule) && !$this->strict) { - continue; - } - $rule->setReport($this->report); - $rule->apply($node); - } - } - - /** - * Returns an iterator with all rules that are part of this rule-set. - * - * @return \Iterator - */ - public function getIterator() - { - return $this->getRules(); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSetFactory.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSetFactory.php deleted file mode 100644 index 92398a1..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSetFactory.php +++ /dev/null @@ -1,579 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -/** - * This factory class is used to create the {@link \PHPMD\RuleSet} instance - * that PHPMD will use to analyze the source code. - */ -class RuleSetFactory -{ - /** - * Is the strict mode active? - * - * @var boolean - * @since 1.2.0 - */ - private $strict = false; - - /** - * The data directory set by PEAR or a dynamic property set within the class - * constructor. - * - * @var string - */ - private $location = '@data_dir@'; - - /** - * The minimum priority for rules to load. - * - * @var integer - */ - private $minimumPriority = Rule::LOWEST_PRIORITY; - - /** - * The maximum priority for rules to load. - * - * @var integer - */ - private $maximumPriority = Rule::HIGHEST_PRIORITY; - - /** - * Constructs a new default rule-set factory instance. - */ - public function __construct() - { - // PEAR installer workaround - if (strpos($this->location, '@data_dir') === 0) { - $this->location = __DIR__ . '/../../resources'; - return; - } - $this->location .= '/PHPMD/resources'; - } - - /** - * Activates the strict mode for all rule sets. - * - * @return void - * @since 1.2.0 - */ - public function setStrict() - { - $this->strict = true; - } - - /** - * Sets the minimum priority that a rule must have. - * - * @param integer $minimumPriority The minimum priority value. - * @return void - */ - public function setMinimumPriority($minimumPriority) - { - $this->minimumPriority = $minimumPriority; - } - - /** - * Sets the maximum priority that a rule must have. - * - * @param integer $maximumPriority The maximum priority value. - * @return void - */ - public function setMaximumPriority($maximumPriority) - { - $this->maximumPriority = $maximumPriority; - } - - /** - * Creates an array of rule-set instances for the given argument. - * - * @param string $ruleSetFileNames Comma-separated string of rule-set filenames or identifier. - * @return \PHPMD\RuleSet[] - */ - public function createRuleSets($ruleSetFileNames) - { - $ruleSets = array(); - - $ruleSetFileName = strtok($ruleSetFileNames, ','); - while ($ruleSetFileName !== false) { - $ruleSets[] = $this->createSingleRuleSet($ruleSetFileName); - - $ruleSetFileName = strtok(','); - } - return $ruleSets; - } - - /** - * Creates a single rule-set instance for the given filename or identifier. - * - * @param string $ruleSetOrFileName The rule-set filename or identifier. - * @return \PHPMD\RuleSet - */ - public function createSingleRuleSet($ruleSetOrFileName) - { - $fileName = $this->createRuleSetFileName($ruleSetOrFileName); - return $this->parseRuleSetNode($fileName); - } - - /** - * Lists available rule-set identifiers. - * - * @return string[] - */ - public function listAvailableRuleSets() - { - return array_merge( - self::listRuleSetsInDirectory($this->location . '/rulesets/'), - self::listRuleSetsInDirectory(getcwd() . '/rulesets/') - ); - } - - /** - * This method creates the filename for a rule-set identifier or it returns - * the input when it is already a filename. - * - * @param string $ruleSetOrFileName The rule-set filename or identifier. - * @return string Path to rule set file name - * @throws RuleSetNotFoundException Thrown if no readable file found - */ - private function createRuleSetFileName($ruleSetOrFileName) - { - foreach ($this->filePaths($ruleSetOrFileName) as $filePath) { - if ($this->isReadableFile($filePath)) { - return $filePath; - } - } - - throw new RuleSetNotFoundException($ruleSetOrFileName); - } - - /** - * Lists available rule-set identifiers in given directory. - * - * @param string $directory The directory to scan for rule-sets. - * @return string[] - */ - private static function listRuleSetsInDirectory($directory) - { - $ruleSets = array(); - if (is_dir($directory)) { - foreach (scandir($directory) as $file) { - $matches = array(); - if (is_file($directory . $file) && preg_match('/^(.*)\.xml$/', $file, $matches)) { - $ruleSets[] = $matches[1]; - } - } - } - return $ruleSets; - } - - /** - * This method parses the rule-set definition in the given file. - * - * @param string $fileName - * @return \PHPMD\RuleSet - */ - private function parseRuleSetNode($fileName) - { - // Hide error messages - $libxml = libxml_use_internal_errors(true); - - $xml = simplexml_load_string(file_get_contents($fileName)); - if ($xml === false) { - // Reset error handling to previous setting - libxml_use_internal_errors($libxml); - - throw new \RuntimeException(trim(libxml_get_last_error()->message)); - } - - $ruleSet = new RuleSet(); - $ruleSet->setFileName($fileName); - $ruleSet->setName((string) $xml['name']); - - if ($this->strict) { - $ruleSet->setStrict(); - } - - foreach ($xml->children() as $node) { - /** @var $node \SimpleXMLElement */ - if ($node->getName() === 'php-includepath') { - $includePath = (string) $node; - - if (is_dir(dirname($fileName) . DIRECTORY_SEPARATOR . $includePath)) { - $includePath = dirname($fileName) . DIRECTORY_SEPARATOR . $includePath; - $includePath = realpath($includePath); - } - - $includePath = get_include_path() . PATH_SEPARATOR . $includePath; - set_include_path($includePath); - } - } - - foreach ($xml->children() as $node) { - if ($node->getName() === 'description') { - $ruleSet->setDescription((string) $node); - } elseif ($node->getName() === 'rule') { - $this->parseRuleNode($ruleSet, $node); - } - } - - return $ruleSet; - } - - /** - * This method parses a single rule xml node. Bases on the structure of the - * xml node this method delegates the parsing process to another method in - * this class. - * - * @param \PHPMD\RuleSet $ruleSet - * @param \SimpleXMLElement $node - * @return void - */ - private function parseRuleNode(RuleSet $ruleSet, \SimpleXMLElement $node) - { - if (substr($node['ref'], -3, 3) === 'xml') { - $this->parseRuleSetReferenceNode($ruleSet, $node); - return; - } - if ('' === (string) $node['ref']) { - $this->parseSingleRuleNode($ruleSet, $node); - return; - } - $this->parseRuleReferenceNode($ruleSet, $node); - } - - /** - * This method parses a complete rule set that was includes a reference in - * the currently parsed ruleset. - * - * @param \PHPMD\RuleSet $ruleSet - * @param \SimpleXMLElement $ruleSetNode - * @return void - */ - private function parseRuleSetReferenceNode(RuleSet $ruleSet, \SimpleXMLElement $ruleSetNode) - { - $rules = $this->parseRuleSetReference($ruleSetNode); - foreach ($rules as $rule) { - if ($this->isIncluded($rule, $ruleSetNode)) { - $ruleSet->addRule($rule); - } - } - } - - /** - * Parses a rule-set xml file referenced by the given rule-set xml element. - * - * @param \SimpleXMLElement $ruleSetNode - * @return \PHPMD\RuleSet - * @since 0.2.3 - */ - private function parseRuleSetReference(\SimpleXMLElement $ruleSetNode) - { - $ruleSetFactory = new RuleSetFactory(); - $ruleSetFactory->setMinimumPriority($this->minimumPriority); - $ruleSetFactory->setMaximumPriority($this->maximumPriority); - - return $ruleSetFactory->createSingleRuleSet((string) $ruleSetNode['ref']); - } - - /** - * Checks if the given rule is included/not excluded by the given rule-set - * reference node. - * - * @param \PHPMD\Rule $rule - * @param \SimpleXMLElement $ruleSetNode - * @return boolean - * @since 0.2.3 - */ - private function isIncluded(Rule $rule, \SimpleXMLElement $ruleSetNode) - { - foreach ($ruleSetNode->exclude as $exclude) { - if ($rule->getName() === (string) $exclude['name']) { - return false; - } - } - return true; - } - - /** - * This method will create a single rule instance and add it to the given - * {@link \PHPMD\RuleSet} object. - * - * @param \PHPMD\RuleSet $ruleSet - * @param \SimpleXMLElement $ruleNode - * @return void - * @throws \PHPMD\RuleClassFileNotFoundException - * @throws \PHPMD\RuleClassNotFoundException - */ - private function parseSingleRuleNode(RuleSet $ruleSet, \SimpleXMLElement $ruleNode) - { - $fileName = ""; - - $ruleSetFolderPath = dirname($ruleSet->getFileName()); - - if (isset($ruleNode['file'])) { - if (is_readable((string) $ruleNode['file'])) { - $fileName = (string) $ruleNode['file']; - } elseif (is_readable($ruleSetFolderPath . DIRECTORY_SEPARATOR . (string) $ruleNode['file'])) { - $fileName = $ruleSetFolderPath . DIRECTORY_SEPARATOR . (string) $ruleNode['file']; - } - } - - $className = (string) $ruleNode['class']; - - if (!is_readable($fileName)) { - $fileName = strtr($className, '\\', '/') . '.php'; - } - - if (!is_readable($fileName)) { - $fileName = str_replace(array('\\', '_'), '/', $className) . '.php'; - } - - if (class_exists($className) === false) { - $handle = @fopen($fileName, 'r', true); - if ($handle === false) { - throw new RuleClassFileNotFoundException($className); - } - fclose($handle); - - include_once $fileName; - - if (class_exists($className) === false) { - throw new RuleClassNotFoundException($className); - } - } - - /* @var $rule \PHPMD\Rule */ - $rule = new $className(); - $rule->setName((string) $ruleNode['name']); - $rule->setMessage((string) $ruleNode['message']); - $rule->setExternalInfoUrl((string) $ruleNode['externalInfoUrl']); - - $rule->setRuleSetName($ruleSet->getName()); - - if (trim($ruleNode['since']) !== '') { - $rule->setSince((string) $ruleNode['since']); - } - - foreach ($ruleNode->children() as $node) { - /** @var $node \SimpleXMLElement */ - if ($node->getName() === 'description') { - $rule->setDescription((string) $node); - } elseif ($node->getName() === 'example') { - $rule->addExample((string) $node); - } elseif ($node->getName() === 'priority') { - $rule->setPriority((integer) $node); - } elseif ($node->getName() === 'properties') { - $this->parsePropertiesNode($rule, $node); - } - } - - if ($rule->getPriority() <= $this->minimumPriority && $rule->getPriority() >= $this->maximumPriority) { - $ruleSet->addRule($rule); - } - } - - /** - * This method parses a single rule that was included from a different - * rule-set. - * - * @param \PHPMD\RuleSet $ruleSet - * @param \SimpleXMLElement $ruleNode - * @return void - */ - private function parseRuleReferenceNode(RuleSet $ruleSet, \SimpleXMLElement $ruleNode) - { - $ref = (string) $ruleNode['ref']; - - $fileName = substr($ref, 0, strpos($ref, '.xml/') + 4); - $fileName = $this->createRuleSetFileName($fileName); - - $ruleName = substr($ref, strpos($ref, '.xml/') + 5); - - $ruleSetFactory = new RuleSetFactory(); - - $ruleSetRef = $ruleSetFactory->createSingleRuleSet($fileName); - $rule = $ruleSetRef->getRuleByName($ruleName); - - if (trim($ruleNode['name']) !== '') { - $rule->setName((string) $ruleNode['name']); - } - if (trim($ruleNode['message']) !== '') { - $rule->setMessage((string) $ruleNode['message']); - } - if (trim($ruleNode['externalInfoUrl']) !== '') { - $rule->setExternalInfoUrl((string) $ruleNode['externalInfoUrl']); - } - - foreach ($ruleNode->children() as $node) { - /** @var $node \SimpleXMLElement */ - if ($node->getName() === 'description') { - $rule->setDescription((string) $node); - } elseif ($node->getName() === 'example') { - $rule->addExample((string) $node); - } elseif ($node->getName() === 'priority') { - $rule->setPriority((integer) $node); - } elseif ($node->getName() === 'properties') { - $this->parsePropertiesNode($rule, $node); - } - } - - if ($rule->getPriority() <= $this->minimumPriority && $rule->getPriority() >= $this->maximumPriority) { - $ruleSet->addRule($rule); - } - } - - /** - * This method parses a xml properties structure and adds all found properties - * to the given $rule object. - * - * - * ... - * - * - * - * ... - * - * ... - * - * - * @param \PHPMD\Rule $rule - * @param \SimpleXMLElement $propertiesNode - * @return void - */ - private function parsePropertiesNode(Rule $rule, \SimpleXMLElement $propertiesNode) - { - foreach ($propertiesNode->children() as $node) { - /** @var $node \SimpleXMLElement */ - if ($node->getName() === 'property') { - $this->addProperty($rule, $node); - } - } - } - - /** - * Adds an additional property to the given $rule instance. - * - * @param \PHPMD\Rule $rule - * @param \SimpleXMLElement $node - * @return void - */ - private function addProperty(Rule $rule, \SimpleXMLElement $node) - { - $name = trim($node['name']); - $value = trim($this->getPropertyValue($node)); - if ($name !== '' && $value !== '') { - $rule->addProperty($name, $value); - } - } - - /** - * Returns the value of a property node. This value can be expressed in - * two different notations. First version is an attribute named value - * and the second valid notation is a child element named value that - * contains the value as character data. - * - * @param \SimpleXMLElement $propertyNode - * @return string - * @since 0.2.5 - */ - private function getPropertyValue(\SimpleXMLElement $propertyNode) - { - if (isset($propertyNode->value)) { - return (string) $propertyNode->value; - } - return (string) $propertyNode['value']; - } - - /** - * Returns an array of path exclude patterns in format described at - * - * http://pmd.sourceforge.net/pmd-5.0.4/howtomakearuleset.html#Excluding_files_from_a_ruleset - * - * @param string $fileName The filename of a rule-set definition. - * @return array|null - * @throws \RuntimeException Thrown if file is not proper xml - * @throws RuleSetNotFoundException Thrown if no readable file found - */ - public function getIgnorePattern($fileName) - { - $excludes = array(); - foreach (array_map('trim', explode(',', $fileName)) as $ruleSetFileName) { - $ruleSetFileName = $this->createRuleSetFileName($ruleSetFileName); - - // Hide error messages - $libxml = libxml_use_internal_errors(true); - - $xml = simplexml_load_string(file_get_contents($ruleSetFileName)); - if ($xml === false) { - // Reset error handling to previous setting - libxml_use_internal_errors($libxml); - - throw new \RuntimeException(trim(libxml_get_last_error()->message)); - } - - foreach ($xml->children() as $node) { - /** @var $node \SimpleXMLElement */ - if ($node->getName() === 'exclude-pattern') { - $excludes[] = '' . $node; - } - } - - return $excludes; - } - return null; - } - - /** - * Checks if given file path exists, is file (or symlink to file) - * and is readable by current user - * - * @param string $filePath File path to check against - * @return bool True if file exists and is readable, false otherwise - */ - private function isReadableFile($filePath) - { - if (is_readable($filePath) && is_file($filePath)) { - return true; - } - return false; - } - - /** - * Returns list of possible file paths to search against code rules - * - * @param string $fileName Rule set file name - * @return array Array of possible file locations - */ - private function filePaths($fileName) - { - $filePathParts = array( - array($fileName), - array($this->location, $fileName), - array($this->location, 'rulesets', $fileName . '.xml'), - array(getcwd(), 'rulesets', $fileName . '.xml'), - ); - - foreach (explode(PATH_SEPARATOR, get_include_path()) as $includePath) { - $filePathParts[] = array($includePath, $fileName); - $filePathParts[] = array($includePath, $fileName . '.xml'); - } - - return array_map('implode', array_fill(0, count($filePathParts), DIRECTORY_SEPARATOR), $filePathParts); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSetNotFoundException.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSetNotFoundException.php deleted file mode 100644 index 5ad79e9..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleSetNotFoundException.php +++ /dev/null @@ -1,34 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -/** - * This type of exception is thrown when a not existing rule-set was specified. - */ -class RuleSetNotFoundException extends \RuntimeException -{ - /** - * Constructs a new exception for the given rule-set identifier or file name. - * - * @param string $ruleSet The rule-set identifier or file name. - */ - public function __construct($ruleSet) - { - parent::__construct('Cannot find specified rule-set "' . $ruleSet . '".'); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleViolation.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleViolation.php deleted file mode 100644 index eae81e0..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/RuleViolation.php +++ /dev/null @@ -1,208 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD; - -use PHPMD\Node\AbstractTypeNode; -use PHPMD\Node\FunctionNode; -use PHPMD\Node\MethodNode; - -/** - * This class is used as container for a single rule violation related to a source - * node. - */ -class RuleViolation -{ - /** - * The rule that causes this violation. - * - * @var \PHPMD\Rule - */ - private $rule; - - /** - * The context code node for this rule violation. - * - * @var \PHPMD\AbstractNode - */ - private $node; - - /** - * The description/message text that describes the violation. - * - * @var string - */ - private $description; - - /** - * The raw metric value which caused this rule violation. - * - * @var mixed - */ - private $metric; - - /** - * Name of the owning/context class or interface of this violation. - * - * @var string - */ - private $className = null; - - /** - * The name of a method or null when this violation has no method - * context. - * - * @var string - */ - private $methodName = null; - - /** - * The name of a function or null when this violation has no function - * context. - * - * @var string - */ - private $functionName = null; - - /** - * Constructs a new rule violation instance. - * - * @param \PHPMD\Rule $rule - * @param \PHPMD\AbstractNode $node - * @param string $violationMessage - * @param mixed $metric - */ - public function __construct(Rule $rule, AbstractNode $node, $violationMessage, $metric = null) - { - $this->rule = $rule; - $this->node = $node; - $this->metric = $metric; - $this->description = $violationMessage; - - if ($node instanceof AbstractTypeNode) { - $this->className = $node->getName(); - } elseif ($node instanceof MethodNode) { - $this->className = $node->getParentName(); - $this->methodName = $node->getName(); - } elseif ($node instanceof FunctionNode) { - $this->functionName = $node->getName(); - } - } - - /** - * Returns the rule that causes this violation. - * - * @return \PHPMD\Rule - */ - public function getRule() - { - return $this->rule; - } - - /** - * Returns the description/message text that describes the violation. - * - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * Returns the raw metric value which caused this rule violation. - * - * @return mixed|null - */ - public function getMetric() - { - return $this->metric; - } - - /** - * Returns the file name where this rule violation was detected. - * - * @return string - */ - public function getFileName() - { - return $this->node->getFileName(); - } - - /** - * Returns the first line of the node that causes this rule violation. - * - * @return integer - */ - public function getBeginLine() - { - return $this->node->getBeginLine(); - } - - /** - * Returns the last line of the node that causes this rule violation. - * - * @return integer - */ - public function getEndLine() - { - return $this->node->getEndLine(); - } - - /** - * Returns the name of the package that contains this violation. - * - * @return string - */ - public function getNamespaceName() - { - return $this->node->getNamespaceName(); - } - - /** - * Returns the name of the parent class or interface or null when there - * is no parent class. - * - * @return string - */ - public function getClassName() - { - return $this->className; - } - - /** - * Returns the name of a method or null when this violation has no - * method context. - * - * @return string - */ - public function getMethodName() - { - return $this->methodName; - } - - /** - * Returns the name of a function or null when this violation has no - * function context. - * - * @return string - */ - public function getFunctionName() - { - return $this->functionName; - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/Command.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/Command.php deleted file mode 100644 index 3cee216..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/Command.php +++ /dev/null @@ -1,152 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\TextUI; - -use PHPMD\PHPMD; -use PHPMD\RuleSetFactory; -use PHPMD\Writer\StreamWriter; - -/** - * This class provides a command line interface for PHPMD - */ -class Command -{ - /** - * Exit codes used by the phpmd command line tool. - */ - const EXIT_SUCCESS = 0, - EXIT_EXCEPTION = 1, - EXIT_VIOLATION = 2; - - /** - * This method creates a PHPMD instance and configures this object based - * on the user's input, then it starts the source analysis. - * - * The return value of this method can be used as an exit code. A value - * equal to EXIT_SUCCESS means that no violations or errors were - * found in the analyzed code. Otherwise this method will return a value - * equal to EXIT_VIOLATION. - * - * The use of flag --ignore-violations-on-exit will result to a - * EXIT_SUCCESS even if any violation is found. - * - * @param \PHPMD\TextUI\CommandLineOptions $opts - * @param \PHPMD\RuleSetFactory $ruleSetFactory - * @return integer - */ - public function run(CommandLineOptions $opts, RuleSetFactory $ruleSetFactory) - { - if ($opts->hasVersion()) { - fwrite(STDOUT, sprintf('PHPMD %s', $this->getVersion()) . PHP_EOL); - return self::EXIT_SUCCESS; - } - - // Create a report stream - $stream = $opts->getReportFile() ? $opts->getReportFile() : STDOUT; - - // Create renderer and configure output - $renderer = $opts->createRenderer(); - $renderer->setWriter(new StreamWriter($stream)); - - $renderers = array($renderer); - - foreach ($opts->getReportFiles() as $reportFormat => $reportFile) { - $reportRenderer = $opts->createRenderer($reportFormat); - $reportRenderer->setWriter(new StreamWriter($reportFile)); - - $renderers[] = $reportRenderer; - } - - // Configure a rule set factory - $ruleSetFactory->setMinimumPriority($opts->getMinimumPriority()); - $ruleSetFactory->setMaximumPriority($opts->getMaximumPriority()); - if ($opts->hasStrict()) { - $ruleSetFactory->setStrict(); - } - - $phpmd = new PHPMD(); - $phpmd->setOptions( - array_filter( - array( - 'coverage' => $opts->getCoverageReport() - ) - ) - ); - - $extensions = $opts->getExtensions(); - if ($extensions !== null) { - $phpmd->setFileExtensions(explode(',', $extensions)); - } - - $ignore = $opts->getIgnore(); - if ($ignore !== null) { - $phpmd->setIgnorePattern(explode(',', $ignore)); - } - - $phpmd->processFiles( - $opts->getInputPath(), - $opts->getRuleSets(), - $renderers, - $ruleSetFactory - ); - - if ($phpmd->hasViolations() && !$opts->ignoreViolationsOnExit()) { - return self::EXIT_VIOLATION; - } - return self::EXIT_SUCCESS; - } - - /** - * Returns the current version number. - * - * @return string - */ - private function getVersion() - { - $build = __DIR__ . '/../../../../../build.properties'; - - $version = '@package_version@'; - if (file_exists($build)) { - $data = @parse_ini_file($build); - $version = $data['project.version']; - } - return $version; - } - - /** - * The main method that can be used by a calling shell script, the return - * value can be used as exit code. - * - * @param array $args The raw command line arguments array. - * @return integer - */ - public static function main(array $args) - { - try { - $ruleSetFactory = new RuleSetFactory(); - $options = new CommandLineOptions($args, $ruleSetFactory->listAvailableRuleSets()); - $command = new Command(); - - $exitCode = $command->run($options, $ruleSetFactory); - } catch (\Exception $e) { - fwrite(STDERR, $e->getMessage() . PHP_EOL); - $exitCode = self::EXIT_EXCEPTION; - } - return $exitCode; - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/CommandLineOptions.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/CommandLineOptions.php deleted file mode 100644 index b335185..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/TextUI/CommandLineOptions.php +++ /dev/null @@ -1,572 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\TextUI; - -use PHPMD\Renderer\AnsiRenderer; -use PHPMD\Renderer\HTMLRenderer; -use PHPMD\Renderer\JSONRenderer; -use PHPMD\Renderer\TextRenderer; -use PHPMD\Renderer\XMLRenderer; -use PHPMD\Rule; - -/** - * This is a helper class that collects the specified cli arguments and puts them - * into accessible properties. - * - * @SuppressWarnings(PHPMD.LongVariable) - */ -class CommandLineOptions -{ - /** - * Error code for invalid input - */ - const INPUT_ERROR = 23; - - /** - * The minimum rule priority. - * - * @var integer - */ - protected $minimumPriority = Rule::LOWEST_PRIORITY; - - /** - * The maximum rule priority. - * - * @var integer - */ - protected $maximumPriority = Rule::HIGHEST_PRIORITY; - - /** - * A php source code filename or directory. - * - * @var string - */ - protected $inputPath; - - /** - * The specified report format. - * - * @var string - */ - protected $reportFormat; - - /** - * An optional filename for the generated report. - * - * @var string - */ - protected $reportFile; - - /** - * Additional report files. - * - * @var array - */ - protected $reportFiles = array(); - - /** - * A ruleset filename or a comma-separated string of ruleset filenames. - * - * @var string - */ - protected $ruleSets; - - /** - * File name of a PHPUnit code coverage report. - * - * @var string - */ - protected $coverageReport; - - /** - * A string of comma-separated extensions for valid php source code filenames. - * - * @var string - */ - protected $extensions; - - /** - * A string of comma-separated pattern that is used to exclude directories. - * - * @var string - */ - protected $ignore; - - /** - * Should the shell show the current phpmd version? - * - * @var boolean - */ - protected $version = false; - - /** - * Should PHPMD run in strict mode? - * - * @var boolean - * @since 1.2.0 - */ - protected $strict = false; - - /** - * Should PHPMD exit without error code even if violation is found? - * - * @var boolean - */ - protected $ignoreViolationsOnExit = false; - - /** - * List of available rule-sets. - * - * @var array(string) - */ - protected $availableRuleSets = array(); - - /** - * Constructs a new command line options instance. - * - * @param array $args - * @param array $availableRuleSets - * @throws \InvalidArgumentException - */ - public function __construct(array $args, array $availableRuleSets = array()) - { - // Remove current file name - array_shift($args); - - $this->availableRuleSets = $availableRuleSets; - - $arguments = array(); - while (($arg = array_shift($args)) !== null) { - switch ($arg) { - case '--min-priority': - case '--minimum-priority': - case '--minimumpriority': - $this->minimumPriority = (int)array_shift($args); - break; - case '--max-priority': - case '--maximum-priority': - case '--maximumpriority': - $this->maximumPriority = (int)array_shift($args); - break; - case '--report-file': - case '--reportfile': - $this->reportFile = array_shift($args); - break; - case '--input-file': - case '--inputfile': - array_unshift($arguments, $this->readInputFile(array_shift($args))); - break; - case '--coverage': - $this->coverageReport = array_shift($args); - break; - case '--extensions': - $this->logDeprecated('extensions', 'suffixes'); - /* Deprecated: We use the suffixes option now */ - $this->extensions = array_shift($args); - break; - case '--suffixes': - $this->extensions = array_shift($args); - break; - case '--ignore': - $this->logDeprecated('ignore', 'exclude'); - /* Deprecated: We use the exclude option now */ - $this->ignore = array_shift($args); - break; - case '--exclude': - $this->ignore = array_shift($args); - break; - case '--version': - $this->version = true; - - return; - case '--strict': - $this->strict = true; - break; - case '--not-strict': - $this->strict = false; - break; - case '--ignore-violations-on-exit': - $this->ignoreViolationsOnExit = true; - break; - case '--reportfile-html': - case '--reportfile-text': - case '--reportfile-xml': - case '--reportfile-json': - preg_match('(^\-\-reportfile\-(xml|html|text|json)$)', $arg, $match); - $this->reportFiles[$match[1]] = array_shift($args); - break; - default: - $arguments[] = $arg; - break; - } - } - - if (count($arguments) < 3) { - throw new \InvalidArgumentException($this->usage(), self::INPUT_ERROR); - } - - $this->inputPath = (string)array_shift($arguments); - $this->reportFormat = (string)array_shift($arguments); - $this->ruleSets = (string)array_shift($arguments); - } - - /** - * Returns a php source code filename or directory. - * - * @return string - */ - public function getInputPath() - { - return $this->inputPath; - } - - /** - * Returns the specified report format. - * - * @return string - */ - public function getReportFormat() - { - return $this->reportFormat; - } - - /** - * Returns the output filename for a generated report or null when - * the report should be displayed in STDOUT. - * - * @return string - */ - public function getReportFile() - { - return $this->reportFile; - } - - /** - * Returns a hash with report files specified for different renderers. The - * key represents the report format and the value the report file location. - * - * @return array - */ - public function getReportFiles() - { - return $this->reportFiles; - } - - /** - * Returns a ruleset filename or a comma-separated string of ruleset - * - * @return string - */ - public function getRuleSets() - { - return $this->ruleSets; - } - - /** - * Returns the minimum rule priority. - * - * @return integer - */ - public function getMinimumPriority() - { - return $this->minimumPriority; - } - - /** - * Returns the maximum rule priority. - * - * @return integer - */ - public function getMaximumPriority() - { - return $this->maximumPriority; - } - - /** - * Returns the file name of a supplied code coverage report or NULL - * if the user has not supplied the --coverage option. - * - * @return string - */ - public function getCoverageReport() - { - return $this->coverageReport; - } - - /** - * Returns a string of comma-separated extensions for valid php source code - * filenames or null when this argument was not set. - * - * @return string - */ - public function getExtensions() - { - return $this->extensions; - } - - /** - * Returns string of comma-separated pattern that is used to exclude - * directories or null when this argument was not set. - * - * @return string - */ - public function getIgnore() - { - return $this->ignore; - } - - /** - * Was the --version passed to PHPMD's command line interface? - * - * @return boolean - */ - public function hasVersion() - { - return $this->version; - } - - /** - * Was the --strict option passed to PHPMD's command line interface? - * - * @return boolean - * @since 1.2.0 - */ - public function hasStrict() - { - return $this->strict; - } - - /** - * Was the --ignore-violations-on-exit passed to PHPMD's command line interface? - * - * @return boolean - */ - public function ignoreViolationsOnExit() - { - return $this->ignoreViolationsOnExit; - } - - /** - * Creates a report renderer instance based on the user's command line - * argument. - * - * Valid renderers are: - *
    - *
  • xml
  • - *
  • html
  • - *
  • text
  • - *
  • json
  • - *
- * - * @param string $reportFormat - * @return \PHPMD\AbstractRenderer - * @throws \InvalidArgumentException When the specified renderer does not exist. - */ - public function createRenderer($reportFormat = null) - { - $reportFormat = $reportFormat ?: $this->reportFormat; - - switch ($reportFormat) { - case 'xml': - return $this->createXmlRenderer(); - case 'html': - return $this->createHtmlRenderer(); - case 'text': - return $this->createTextRenderer(); - case 'json': - return $this->createJsonRenderer(); - case 'ansi': - return $this->createAnsiRenderer(); - default: - return $this->createCustomRenderer(); - } - } - - /** - * @return \PHPMD\Renderer\XMLRenderer - */ - protected function createXmlRenderer() - { - return new XMLRenderer(); - } - - /** - * @return \PHPMD\Renderer\TextRenderer - */ - protected function createTextRenderer() - { - return new TextRenderer(); - } - - /** - * @return \PHPMD\Renderer\AnsiRenderer - */ - protected function createAnsiRenderer() - { - return new AnsiRenderer(); - } - - /** - * @return \PHPMD\Renderer\HTMLRenderer - */ - protected function createHtmlRenderer() - { - return new HTMLRenderer(); - } - - /** - * @return \PHPMD\Renderer\JSONRenderer - */ - protected function createJsonRenderer() - { - return new JSONRenderer(); - } - - /** - * @return \PHPMD\AbstractRenderer - * @throws \InvalidArgumentException - */ - protected function createCustomRenderer() - { - if ('' === $this->reportFormat) { - throw new \InvalidArgumentException( - 'Can\'t create report with empty format.', - self::INPUT_ERROR - ); - } - - if (class_exists($this->reportFormat)) { - return new $this->reportFormat(); - } - - // Try to load a custom renderer - $fileName = strtr($this->reportFormat, '_\\', '//') . '.php'; - - $fileHandle = @fopen($fileName, 'r', true); - if (is_resource($fileHandle) === false) { - throw new \InvalidArgumentException( - sprintf( - 'Can\'t find the custom report class: %s', - $this->reportFormat - ), - self::INPUT_ERROR - ); - } - @fclose($fileHandle); - - include_once $fileName; - - return new $this->reportFormat(); - } - - /** - * Returns usage information for the PHPMD command line interface. - * - * @return string - */ - public function usage() - { - $availableRenderers = $this->getListOfAvailableRenderers(); - - return 'Mandatory arguments:' . \PHP_EOL . - '1) A php source code filename or directory. Can be a comma-' . - 'separated string' . \PHP_EOL . - '2) A report format' . \PHP_EOL . - '3) A ruleset filename or a comma-separated string of ruleset' . - 'filenames' . \PHP_EOL . \PHP_EOL . - 'Example: phpmd /path/to/source format ruleset' . \PHP_EOL . \PHP_EOL . - 'Available formats: ' . $availableRenderers . '.' . \PHP_EOL . - 'Available rulesets: ' . implode(', ', $this->availableRuleSets) . '.' . \PHP_EOL . \PHP_EOL . - 'Optional arguments that may be put after the mandatory arguments:' . - \PHP_EOL . - '--minimumpriority: rule priority threshold; rules with lower ' . - 'priority than this will not be used' . \PHP_EOL . - '--reportfile: send report output to a file; default to STDOUT' . - \PHP_EOL . - '--suffixes: comma-separated string of valid source code ' . - 'filename extensions, e.g. php,phtml' . \PHP_EOL . - '--exclude: comma-separated string of patterns that are used to ' . - 'ignore directories' . \PHP_EOL . - '--strict: also report those nodes with a @SuppressWarnings ' . - 'annotation' . \PHP_EOL . - '--ignore-violations-on-exit: will exit with a zero code, ' . - 'even if any violations are found' . \PHP_EOL; - } - - /** - * Get a list of available renderers - * - * @return string The list of renderers found. - */ - protected function getListOfAvailableRenderers() - { - $renderersDirPathName=__DIR__.'/../Renderer'; - $renderers = array(); - - foreach (scandir($renderersDirPathName) as $rendererFileName) { - if (preg_match('/^(\w+)Renderer.php$/i', $rendererFileName, $rendererName)) { - $renderers[] = strtolower($rendererName[1]); - } - } - - sort($renderers); - - if (count($renderers) > 1) { - return implode(', ', $renderers); - } - - return array_pop($renderers); - } - - /** - * Logs a deprecated option to the current user interface. - * - * @param string $deprecatedName - * @param string $newName - * @return void - */ - protected function logDeprecated($deprecatedName, $newName) - { - $message = sprintf( - 'The --%s option is deprecated, please use --%s instead.', - $deprecatedName, - $newName - ); - - fwrite(STDERR, $message . PHP_EOL . PHP_EOL); - } - - /** - * This method takes the given input file, reads the newline separated paths - * from that file and creates a comma separated string of the file paths. If - * the given $inputFile not exists, this method will throw an - * exception. - * - * @param string $inputFile Specified input file name. - * @return string - * @throws \InvalidArgumentException If the specified input file does not exist. - * @since 1.1.0 - */ - protected function readInputFile($inputFile) - { - if (file_exists($inputFile)) { - return join(',', array_map('trim', file($inputFile))); - } - throw new \InvalidArgumentException("Input file '{$inputFile}' not exists."); - } -} diff --git a/vendor/phpmd/phpmd/src/main/php/PHPMD/Writer/StreamWriter.php b/vendor/phpmd/phpmd/src/main/php/PHPMD/Writer/StreamWriter.php deleted file mode 100644 index d51d29c..0000000 --- a/vendor/phpmd/phpmd/src/main/php/PHPMD/Writer/StreamWriter.php +++ /dev/null @@ -1,78 +0,0 @@ -. - * All rights reserved. - * - * Licensed under BSD License - * For full copyright and license information, please see the LICENSE file. - * Redistributions of files must retain the above copyright notice. - * - * @author Manuel Pichler - * @copyright Manuel Pichler. All rights reserved. - * @license https://opensource.org/licenses/bsd-license.php BSD License - * @link http://phpmd.org/ - */ - -namespace PHPMD\Writer; - -use PHPMD\AbstractWriter; - -/** - * This writer uses PHP's stream api as its output target. - */ -class StreamWriter extends AbstractWriter -{ - /** - * The stream resource handle - * - * @var resource - */ - private $stream = null; - - /** - * Constructs a new stream writer instance. - * - * @param resource|string $streamResourceOrUri - */ - public function __construct($streamResourceOrUri) - { - if (is_resource($streamResourceOrUri) === true) { - $this->stream = $streamResourceOrUri; - return; - } - $dirName = dirname($streamResourceOrUri); - if (file_exists($dirName) === false) { - mkdir($dirName, 0777, true); - } - if (file_exists($dirName) === false) { - $message = 'Cannot find output directory "' . $dirName . '".'; - throw new \RuntimeException($message); - } - - $this->stream = fopen($streamResourceOrUri, 'wb'); - } - - /** - * The dtor closes the open output resource. - */ - public function __destruct() - { - if ($this->stream !== STDOUT && is_resource($this->stream) === true) { - @fclose($this->stream); - } - $this->stream = null; - } - - /** - * Writes the given $data fragment to the wrapper output stream. - * - * @param string $data - * @return void - */ - public function write($data) - { - fwrite($this->stream, $data); - } -} diff --git a/vendor/phpmd/phpmd/src/main/resources/rulesets/cleancode.xml b/vendor/phpmd/phpmd/src/main/resources/rulesets/cleancode.xml deleted file mode 100644 index 3f01727..0000000 --- a/vendor/phpmd/phpmd/src/main/resources/rulesets/cleancode.xml +++ /dev/null @@ -1,204 +0,0 @@ - - - - - -The Clean Code ruleset contains rules that enforce a clean code base. This includes rules from SOLID and object calisthenics. - - - - - - - 1 - - - - - - - - - - - 1 - - - - - - - - - - - 1 - - - - - - - - - - - 1 - - - - - - - - - - - - - 2 - - 'associative 0-element', // applied - false => 'associative 0-element', // applied - 'foo' => 'bar', // not applied - "foo" => 'baz', // applied - ]; -} - ]]> - - - - - - - - 1 - - - - - - - - Detects when a variable is used that has not been defined before. - - 3 - - - - - - diff --git a/vendor/phpmd/phpmd/src/main/resources/rulesets/codesize.xml b/vendor/phpmd/phpmd/src/main/resources/rulesets/codesize.xml deleted file mode 100644 index fb665be..0000000 --- a/vendor/phpmd/phpmd/src/main/resources/rulesets/codesize.xml +++ /dev/null @@ -1,420 +0,0 @@ - - - - - -The Code Size Ruleset contains a collection of rules that find code size related problems. - - - - - - - 3 - - - - - - - - - - - - -The NPath complexity of a method is the number of acyclic execution paths through that method. -A threshold of 200 is generally considered the point where measures should be taken to reduce complexity. - - 3 - - - - - - - - - - -Violations of this rule usually indicate that the method is doing -too much. Try to reduce the method size by creating helper methods and removing any copy/pasted code. - - 3 - - - - - - - - - - - -Long Class files are indications that the class may be trying to -do too much. Try to break it down, and reduce the size to something -manageable. - - 3 - - - - - - - - - - - -Long parameter lists can indicate that a new object should be created to -wrap the numerous parameters. Basically, try to group the parameters together. - - 3 - - - - - - - - - - - -A large number of public methods and attributes declared in a class can indicate -the class may need to be broken up as increased effort will be required to -thoroughly test it. - - 3 - - - - - - - - - - -Classes that have too many fields could be redesigned to have fewer fields, -possibly through some nested object grouping of some of the information. For -example, a class with city/state/zip fields could instead have one Address -field. - - 3 - - - - - - - - - - - - - - 3 - - - - - - - - - - - 3 - - - - - - - - - - - 3 - - - - - - - - diff --git a/vendor/phpmd/phpmd/src/main/resources/rulesets/controversial.xml b/vendor/phpmd/phpmd/src/main/resources/rulesets/controversial.xml deleted file mode 100644 index c95eb21..0000000 --- a/vendor/phpmd/phpmd/src/main/resources/rulesets/controversial.xml +++ /dev/null @@ -1,158 +0,0 @@ - - - - - -This ruleset contains a collection of controversial rules. - - - - - - - 1 - - - - - - - - - - - 1 - - - - - - - - - - - 1 - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - 1 - - - - - - - - - - - 1 - - - - - - diff --git a/vendor/phpmd/phpmd/src/main/resources/rulesets/design.xml b/vendor/phpmd/phpmd/src/main/resources/rulesets/design.xml deleted file mode 100644 index fc9373f..0000000 --- a/vendor/phpmd/phpmd/src/main/resources/rulesets/design.xml +++ /dev/null @@ -1,289 +0,0 @@ - - - - - -The Design Ruleset contains a collection of rules that find software design related problems. - - - - - - - 1 - - - - - - - - - - - 1 - - - - - - - - - - - 1 - - - - - - - - - - - 2 - - - - - - - - - - - 2 - - - - - - - - - - - 2 - - - - - - - - - - - - - 2 - - - - - - $item) { - // … - - if ('qafoo' == $item) var_dump($i); - - // … - } - } -} - ]]> - - - - - - - - 2 - - - - - - - - - - - 2 - - - - - - diff --git a/vendor/phpmd/phpmd/src/main/resources/rulesets/naming.xml b/vendor/phpmd/phpmd/src/main/resources/rulesets/naming.xml deleted file mode 100644 index 0ee40c5..0000000 --- a/vendor/phpmd/phpmd/src/main/resources/rulesets/naming.xml +++ /dev/null @@ -1,363 +0,0 @@ - - - -The Naming Ruleset contains a collection of rules about names - too long, too short, and so forth. - - - - -Detects when a field, local, or parameter has a very short name. - - 3 - - - - - - q; // VIOLATION - Local - for (int $i = 0; $i < 10; $i++) { // Not a Violation (inside FOR) - $r += $this->q; - } - } -} - ]]> - - - - - -Detects when a field, formal or local variable is declared with a long name. - - 3 - - - - - - - - - - -Detects when very short method names are used. - - 3 - - - - - - - - - - - -A constructor method should not have the same name as the enclosing class, consider -to use the PHP 5 __construct method. - - 3 - - - - - - - -Class/Interface constant names should always be defined in uppercase. - - 4 - - - - - - - - -Looks for methods named 'getX()' with 'boolean' as the return type. The convention -is to name these methods 'isX()' or 'hasX()'. - - 4 - - - - - - - - - - - diff --git a/vendor/phpmd/phpmd/src/main/resources/rulesets/unusedcode.xml b/vendor/phpmd/phpmd/src/main/resources/rulesets/unusedcode.xml deleted file mode 100644 index 85e849c..0000000 --- a/vendor/phpmd/phpmd/src/main/resources/rulesets/unusedcode.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - -The Unused Code Ruleset contains a collection of rules that find unused code. - - - - -Detects when a private field is declared and/or assigned a value, but not used. - - 3 - -j++; - } -} -]]> - - - - - -Detects when a local variable is declared and/or assigned, but not used. - - 3 - - - - - - - - - - - -Unused Private Method detects when a private method is declared but is unused. - - 3 - - - - - - - -Avoid passing parameters to methods or constructors and then not using those parameters. - - 3 - - - - - - diff --git a/vendor/phpspec/prophecy/CHANGES.md b/vendor/phpspec/prophecy/CHANGES.md deleted file mode 100644 index 8a7c3fb..0000000 --- a/vendor/phpspec/prophecy/CHANGES.md +++ /dev/null @@ -1,260 +0,0 @@ -1.11.1 / 2020/07/08 -=================== - -* [fixed] can't double objects with `self` type hints (@greg0ire) -* [fixed] cloned doubes were not loosely comparable (@tkulka) - -1.11.0 / 2020/07/07 -=================== - -* [changed] dropped support for PHP versions earlier than 7.2 (@ciaranmcnulty) -* [fixed] removed use of Reflection APIs deprecated in PHP 8.0 (@Ayesh) - -1.10.3 / 2020/03/05 -=================== - -* [fixed] removed fatal error when phpdocumentor/reflection-docblock 5 parses an invalid `@method` tag (@stof) - -1.10.2 / 2020/01/20 -=================== - -* [added] support for new versions of `sebastian/comparator` and `sebastian/recursion-context` (@sebastianbergmann) - -1.10.1 / 2019/12/22 -=================== - -* [fixed] identical callables no longer match as arguments (@ciaranmcnulty) - -1.10.0 / 2019/12/17 -=================== - -* [added] shouldHaveBeenCalled evaluation happens later so un-stubbed calls don't throw (@elvetemedve) -* [added] methods can now be doubled case-insensitively to match PHP semantics (@michalbundyra) -* [fixed] reduced memory usage by optimising CachedDoubler (@DonCallisto) -* [fixed] removed fatal error nesting level when comparing large objects (@scroach) - -1.9.0 / 2019/10/03 -================== - -* [added] Add willYield feature to Method Prophecy(@tkotosz) -* [fixed] Allow `MethodProphecy::willThrow()` to accept Throwable as string (@timoschinkel ) -* [fixed] Allow new version of phpdocumentor/reflection-docblock (@ricpelo) - -1.8.1 / 2019/06/13 -================== - -* [fixed] Don't try to patch final constructors (@NiR) - -1.8.0 / 2018/08/05 -================== - -* Support for void return types without explicit will (@crellbar) -* Clearer error message for unexpected method calls (@meridius) -* Clearer error message for aggregate exceptions (@meridius) -* More verbose `shouldBeCalledOnce` expectation (@olvlvl) -* Ability to double Throwable, or methods that extend it (@ciaranmcnulty) -* [fixed] Doubling methods where class has additional arguments to interface (@webimpress) -* [fixed] Doubling methods where arguments are nullable but default is not null (@webimpress) -* [fixed] Doubling magic methods on parent class (@dsnopek) -* [fixed] Check method predictions only once (@dontub) -* [fixed] Argument::containingString throwing error when called with non-string (@dcabrejas) - -1.7.6 / 2018/04/18 -================== - -* Allow sebastian/comparator ^3.0 (@sebastianbergmann) - -1.7.5 / 2018/02/11 -================== - -* Support for object return type hints (thanks @greg0ire) - -1.7.4 / 2018/02/11 -================== - -* Fix issues with PHP 7.2 (thanks @greg0ire) -* Support object type hints in PHP 7.2 (thanks @@jansvoboda11) - -1.7.3 / 2017/11/24 -================== - -* Fix SplInfo ClassPatch to work with Symfony 4 (Thanks @gnugat) - -1.7.2 / 2017-10-04 -================== - -* Reverted "check method predictions only once" due to it breaking Spies - -1.7.1 / 2017-10-03 -================== - -* Allow PHP5 keywords methods generation on PHP7 (thanks @bycosta) -* Allow reflection-docblock v4 (thanks @GrahamCampbell) -* Check method predictions only once (thanks @dontub) -* Escape file path sent to \SplFileObjectConstructor when running on Windows (thanks @danmartin-epiphany) - -1.7.0 / 2017-03-02 -================== - -* Add full PHP 7.1 Support (thanks @prolic) -* Allow `sebastian/comparator ^2.0` (thanks @sebastianbergmann) -* Allow `sebastian/recursion-context ^3.0` (thanks @sebastianbergmann) -* Allow `\Error` instances in `ThrowPromise` (thanks @jameshalsall) -* Support `phpspec/phpspect ^3.2` (thanks @Sam-Burns) -* Fix failing builds (thanks @Sam-Burns) - -1.6.2 / 2016-11-21 -================== - -* Added support for detecting @method on interfaces that the class itself implements, or when the stubbed class is an interface itself (thanks @Seldaek) -* Added support for sebastian/recursion-context 2 (thanks @sebastianbergmann) -* Added testing on PHP 7.1 on Travis (thanks @danizord) -* Fixed the usage of the phpunit comparator (thanks @Anyqax) - -1.6.1 / 2016-06-07 -================== - - * Ignored empty method names in invalid `@method` phpdoc - * Fixed the mocking of SplFileObject - * Added compatibility with phpdocumentor/reflection-docblock 3 - -1.6.0 / 2016-02-15 -================== - - * Add Variadics support (thanks @pamil) - * Add ProphecyComparator for comparing objects that need revealing (thanks @jon-acker) - * Add ApproximateValueToken (thanks @dantleech) - * Add support for 'self' and 'parent' return type (thanks @bendavies) - * Add __invoke to allowed reflectable methods list (thanks @ftrrtf) - * Updated ExportUtil to reflect the latest changes by Sebastian (thanks @jakari) - * Specify the required php version for composer (thanks @jakzal) - * Exclude 'args' in the generated backtrace (thanks @oradwell) - * Fix code generation for scalar parameters (thanks @trowski) - * Fix missing sprintf in InvalidArgumentException __construct call (thanks @emmanuelballery) - * Fix phpdoc for magic methods (thanks @Tobion) - * Fix PhpDoc for interfaces usage (thanks @ImmRanneft) - * Prevent final methods from being manually extended (thanks @kamioftea) - * Enhance exception for invalid argument to ThrowPromise (thanks @Tobion) - -1.5.0 / 2015-04-27 -================== - - * Add support for PHP7 scalar type hints (thanks @trowski) - * Add support for PHP7 return types (thanks @trowski) - * Update internal test suite to support PHP7 - -1.4.1 / 2015-04-27 -================== - - * Fixed bug in closure-based argument tokens (#181) - -1.4.0 / 2015-03-27 -================== - - * Fixed errors in return type phpdocs (thanks @sobit) - * Fixed stringifying of hash containing one value (thanks @avant1) - * Improved clarity of method call expectation exception (thanks @dantleech) - * Add ability to specify which argument is returned in willReturnArgument (thanks @coderbyheart) - * Add more information to MethodNotFound exceptions (thanks @ciaranmcnulty) - * Support for mocking classes with methods that return references (thanks @edsonmedina) - * Improved object comparison (thanks @whatthejeff) - * Adopted '^' in composer dependencies (thanks @GrahamCampbell) - * Fixed non-typehinted arguments being treated as optional (thanks @whatthejeff) - * Magic methods are now filtered for keywords (thanks @seagoj) - * More readable errors for failure when expecting single calls (thanks @dantleech) - -1.3.1 / 2014-11-17 -================== - - * Fix the edge case when failed predictions weren't recorded for `getCheckedPredictions()` - -1.3.0 / 2014-11-14 -================== - - * Add a way to get checked predictions with `MethodProphecy::getCheckedPredictions()` - * Fix HHVM compatibility - * Remove dead code (thanks @stof) - * Add support for DirectoryIterators (thanks @shanethehat) - -1.2.0 / 2014-07-18 -================== - - * Added support for doubling magic methods documented in the class phpdoc (thanks @armetiz) - * Fixed a segfault appearing in some cases (thanks @dmoreaulf) - * Fixed the doubling of methods with typehints on non-existent classes (thanks @gquemener) - * Added support for internal classes using keywords as method names (thanks @milan) - * Added IdenticalValueToken and Argument::is (thanks @florianv) - * Removed the usage of scalar typehints in HHVM as HHVM 3 does not support them anymore in PHP code (thanks @whatthejeff) - -1.1.2 / 2014-01-24 -================== - - * Spy automatically promotes spied method call to an expected one - -1.1.1 / 2014-01-15 -================== - - * Added support for HHVM - -1.1.0 / 2014-01-01 -================== - - * Changed the generated class names to use a static counter instead of a random number - * Added a clss patch for ReflectionClass::newInstance to make its argument optional consistently (thanks @docteurklein) - * Fixed mirroring of classes with typehints on non-existent classes (thanks @docteurklein) - * Fixed the support of array callables in CallbackPromise and CallbackPrediction (thanks @ciaranmcnulty) - * Added support for properties in ObjectStateToken (thanks @adrienbrault) - * Added support for mocking classes with a final constructor (thanks @ciaranmcnulty) - * Added ArrayEveryEntryToken and Argument::withEveryEntry() (thanks @adrienbrault) - * Added an exception when trying to prophesize on a final method instead of ignoring silently (thanks @docteurklein) - * Added StringContainToken and Argument::containingString() (thanks @peterjmit) - * Added ``shouldNotHaveBeenCalled`` on the MethodProphecy (thanks @ciaranmcnulty) - * Fixed the comparison of objects in ExactValuetoken (thanks @sstok) - * Deprecated ``shouldNotBeenCalled`` in favor of ``shouldNotHaveBeenCalled`` - -1.0.4 / 2013-08-10 -================== - - * Better randomness for generated class names (thanks @sstok) - * Add support for interfaces into TypeToken and Argument::type() (thanks @sstok) - * Add support for old-style (method name === class name) constructors (thanks @l310 for report) - -1.0.3 / 2013-07-04 -================== - - * Support callable typehints (thanks @stof) - * Do not attempt to autoload arrays when generating code (thanks @MarcoDeBortoli) - * New ArrayEntryToken (thanks @kagux) - -1.0.2 / 2013-05-19 -================== - - * Logical `AND` token added (thanks @kagux) - * Logical `NOT` token added (thanks @kagux) - * Add support for setting custom constructor arguments - * Properly stringify hashes - * Record calls that throw exceptions - * Migrate spec suite to PhpSpec 2.0 - -1.0.1 / 2013-04-30 -================== - - * Fix broken UnexpectedCallException message - * Trim AggregateException message - -1.0.0 / 2013-04-29 -================== - - * Improve exception messages - -1.0.0-BETA2 / 2013-04-03 -======================== - - * Add more debug information to CallTimes and Call prediction exception messages - * Fix MethodNotFoundException wrong namespace (thanks @gunnarlium) - * Fix some typos in the exception messages (thanks @pborreli) - -1.0.0-BETA1 / 2013-03-25 -======================== - - * Initial release diff --git a/vendor/phpspec/prophecy/LICENSE b/vendor/phpspec/prophecy/LICENSE deleted file mode 100644 index c8b3647..0000000 --- a/vendor/phpspec/prophecy/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2013 Konstantin Kudryashov - Marcello Duarte - -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/phpspec/prophecy/README.md b/vendor/phpspec/prophecy/README.md deleted file mode 100644 index fab9589..0000000 --- a/vendor/phpspec/prophecy/README.md +++ /dev/null @@ -1,402 +0,0 @@ -# Prophecy - -[![Stable release](https://poser.pugx.org/phpspec/prophecy/version.svg)](https://packagist.org/packages/phpspec/prophecy) -[![Build Status](https://travis-ci.org/phpspec/prophecy.svg?branch=master)](https://travis-ci.org/phpspec/prophecy) - -Prophecy is a highly opinionated yet very powerful and flexible PHP object mocking -framework. Though initially it was created to fulfil phpspec2 needs, it is flexible -enough to be used inside any testing framework out there with minimal effort. - -## A simple example - -```php -prophet->prophesize('App\Security\Hasher'); - $user = new App\Entity\User($hasher->reveal()); - - $hasher->generateHash($user, 'qwerty')->willReturn('hashed_pass'); - - $user->setPassword('qwerty'); - - $this->assertEquals('hashed_pass', $user->getPassword()); - } - - protected function setUp() - { - $this->prophet = new \Prophecy\Prophet; - } - - protected function tearDown() - { - $this->prophet->checkPredictions(); - } -} -``` - -## Installation - -### Prerequisites - -Prophecy requires PHP 7.2.0 or greater. - -### Setup through composer - -First, add Prophecy to the list of dependencies inside your `composer.json`: - -```json -{ - "require-dev": { - "phpspec/prophecy": "~1.0" - } -} -``` - -Then simply install it with composer: - -```bash -$> composer install --prefer-dist -``` - -You can read more about Composer on its [official webpage](http://getcomposer.org). - -## How to use it - -First of all, in Prophecy every word has a logical meaning, even the name of the library -itself (Prophecy). When you start feeling that, you'll become very fluid with this -tool. - -For example, Prophecy has been named that way because it concentrates on describing the future -behavior of objects with very limited knowledge about them. But as with any other prophecy, -those object prophecies can't create themselves - there should be a Prophet: - -```php -$prophet = new Prophecy\Prophet; -``` - -The Prophet creates prophecies by *prophesizing* them: - -```php -$prophecy = $prophet->prophesize(); -``` - -The result of the `prophesize()` method call is a new object of class `ObjectProphecy`. Yes, -that's your specific object prophecy, which describes how your object would behave -in the near future. But first, you need to specify which object you're talking about, -right? - -```php -$prophecy->willExtend('stdClass'); -$prophecy->willImplement('SessionHandlerInterface'); -``` - -There are 2 interesting calls - `willExtend` and `willImplement`. The first one tells -object prophecy that our object should extend specific class, the second one says that -it should implement some interface. Obviously, objects in PHP can implement multiple -interfaces, but extend only one parent class. - -### Dummies - -Ok, now we have our object prophecy. What can we do with it? First of all, we can get -our object *dummy* by revealing its prophecy: - -```php -$dummy = $prophecy->reveal(); -``` - -The `$dummy` variable now holds a special dummy object. Dummy objects are objects that extend -and/or implement preset classes/interfaces by overriding all their public methods. The key -point about dummies is that they do not hold any logic - they just do nothing. Any method -of the dummy will always return `null` and the dummy will never throw any exceptions. -Dummy is your friend if you don't care about the actual behavior of this double and just need -a token object to satisfy a method typehint. - -You need to understand one thing - a dummy is not a prophecy. Your object prophecy is still -assigned to `$prophecy` variable and in order to manipulate with your expectations, you -should work with it. `$dummy` is a dummy - a simple php object that tries to fulfil your -prophecy. - -### Stubs - -Ok, now we know how to create basic prophecies and reveal dummies from them. That's -awesome if we don't care about our _doubles_ (objects that reflect originals) -interactions. If we do, we need to use *stubs* or *mocks*. - -A stub is an object double, which doesn't have any expectations about the object behavior, -but when put in specific environment, behaves in specific way. Ok, I know, it's cryptic, -but bear with me for a minute. Simply put, a stub is a dummy, which depending on the called -method signature does different things (has logic). To create stubs in Prophecy: - -```php -$prophecy->read('123')->willReturn('value'); -``` - -Oh wow. We've just made an arbitrary call on the object prophecy? Yes, we did. And this -call returned us a new object instance of class `MethodProphecy`. Yep, that's a specific -method with arguments prophecy. Method prophecies give you the ability to create method -promises or predictions. We'll talk about method predictions later in the _Mocks_ section. - -#### Promises - -Promises are logical blocks, that represent your fictional methods in prophecy terms -and they are handled by the `MethodProphecy::will(PromiseInterface $promise)` method. -As a matter of fact, the call that we made earlier (`willReturn('value')`) is a simple -shortcut to: - -```php -$prophecy->read('123')->will(new Prophecy\Promise\ReturnPromise(array('value'))); -``` - -This promise will cause any call to our double's `read()` method with exactly one -argument - `'123'` to always return `'value'`. But that's only for this -promise, there's plenty others you can use: - -- `ReturnPromise` or `->willReturn(1)` - returns a value from a method call -- `ReturnArgumentPromise` or `->willReturnArgument($index)` - returns the nth method argument from call -- `ThrowPromise` or `->willThrow($exception)` - causes the method to throw specific exception -- `CallbackPromise` or `->will($callback)` - gives you a quick way to define your own custom logic - -Keep in mind, that you can always add even more promises by implementing -`Prophecy\Promise\PromiseInterface`. - -#### Method prophecies idempotency - -Prophecy enforces same method prophecies and, as a consequence, same promises and -predictions for the same method calls with the same arguments. This means: - -```php -$methodProphecy1 = $prophecy->read('123'); -$methodProphecy2 = $prophecy->read('123'); -$methodProphecy3 = $prophecy->read('321'); - -$methodProphecy1 === $methodProphecy2; -$methodProphecy1 !== $methodProphecy3; -``` - -That's interesting, right? Now you might ask me how would you define more complex -behaviors where some method call changes behavior of others. In PHPUnit or Mockery -you do that by predicting how many times your method will be called. In Prophecy, -you'll use promises for that: - -```php -$user->getName()->willReturn(null); - -// For PHP 5.4 -$user->setName('everzet')->will(function () { - $this->getName()->willReturn('everzet'); -}); - -// For PHP 5.3 -$user->setName('everzet')->will(function ($args, $user) { - $user->getName()->willReturn('everzet'); -}); - -// Or -$user->setName('everzet')->will(function ($args) use ($user) { - $user->getName()->willReturn('everzet'); -}); -``` - -And now it doesn't matter how many times or in which order your methods are called. -What matters is their behaviors and how well you faked it. - -Note: If the method is called several times, you can use the following syntax to return different -values for each call: - -```php -$prophecy->read('123')->willReturn(1, 2, 3); -``` - -This feature is actually not recommended for most cases. Relying on the order of -calls for the same arguments tends to make test fragile, as adding one more call -can break everything. - -#### Arguments wildcarding - -The previous example is awesome (at least I hope it is for you), but that's not -optimal enough. We hardcoded `'everzet'` in our expectation. Isn't there a better -way? In fact there is, but it involves understanding what this `'everzet'` -actually is. - -You see, even if method arguments used during method prophecy creation look -like simple method arguments, in reality they are not. They are argument token -wildcards. As a matter of fact, `->setName('everzet')` looks like a simple call just -because Prophecy automatically transforms it under the hood into: - -```php -$user->setName(new Prophecy\Argument\Token\ExactValueToken('everzet')); -``` - -Those argument tokens are simple PHP classes, that implement -`Prophecy\Argument\Token\TokenInterface` and tell Prophecy how to compare real arguments -with your expectations. And yes, those classnames are damn big. That's why there's a -shortcut class `Prophecy\Argument`, which you can use to create tokens like that: - -```php -use Prophecy\Argument; - -$user->setName(Argument::exact('everzet')); -``` - -`ExactValueToken` is not very useful in our case as it forced us to hardcode the username. -That's why Prophecy comes bundled with a bunch of other tokens: - -- `IdenticalValueToken` or `Argument::is($value)` - checks that the argument is identical to a specific value -- `ExactValueToken` or `Argument::exact($value)` - checks that the argument matches a specific value -- `TypeToken` or `Argument::type($typeOrClass)` - checks that the argument matches a specific type or - classname -- `ObjectStateToken` or `Argument::which($method, $value)` - checks that the argument method returns - a specific value -- `CallbackToken` or `Argument::that(callback)` - checks that the argument matches a custom callback -- `AnyValueToken` or `Argument::any()` - matches any argument -- `AnyValuesToken` or `Argument::cetera()` - matches any arguments to the rest of the signature -- `StringContainsToken` or `Argument::containingString($value)` - checks that the argument contains a specific string value - -And you can add even more by implementing `TokenInterface` with your own custom classes. - -So, let's refactor our initial `{set,get}Name()` logic with argument tokens: - -```php -use Prophecy\Argument; - -$user->getName()->willReturn(null); - -// For PHP 5.4 -$user->setName(Argument::type('string'))->will(function ($args) { - $this->getName()->willReturn($args[0]); -}); - -// For PHP 5.3 -$user->setName(Argument::type('string'))->will(function ($args, $user) { - $user->getName()->willReturn($args[0]); -}); - -// Or -$user->setName(Argument::type('string'))->will(function ($args) use ($user) { - $user->getName()->willReturn($args[0]); -}); -``` - -That's it. Now our `{set,get}Name()` prophecy will work with any string argument provided to it. -We've just described how our stub object should behave, even though the original object could have -no behavior whatsoever. - -One last bit about arguments now. You might ask, what happens in case of: - -```php -use Prophecy\Argument; - -$user->getName()->willReturn(null); - -// For PHP 5.4 -$user->setName(Argument::type('string'))->will(function ($args) { - $this->getName()->willReturn($args[0]); -}); - -// For PHP 5.3 -$user->setName(Argument::type('string'))->will(function ($args, $user) { - $user->getName()->willReturn($args[0]); -}); - -// Or -$user->setName(Argument::type('string'))->will(function ($args) use ($user) { - $user->getName()->willReturn($args[0]); -}); - -$user->setName(Argument::any())->will(function () { -}); -``` - -Nothing. Your stub will continue behaving the way it did before. That's because of how -arguments wildcarding works. Every argument token type has a different score level, which -wildcard then uses to calculate the final arguments match score and use the method prophecy -promise that has the highest score. In this case, `Argument::type()` in case of success -scores `5` and `Argument::any()` scores `3`. So the type token wins, as does the first -`setName()` method prophecy and its promise. The simple rule of thumb - more precise token -always wins. - -#### Getting stub objects - -Ok, now we know how to define our prophecy method promises, let's get our stub from -it: - -```php -$stub = $prophecy->reveal(); -``` - -As you might see, the only difference between how we get dummies and stubs is that with -stubs we describe every object conversation instead of just agreeing with `null` returns -(object being *dummy*). As a matter of fact, after you define your first promise -(method call), Prophecy will force you to define all the communications - it throws -the `UnexpectedCallException` for any call you didn't describe with object prophecy before -calling it on a stub. - -### Mocks - -Now we know how to define doubles without behavior (dummies) and doubles with behavior, but -no expectations (stubs). What's left is doubles for which we have some expectations. These -are called mocks and in Prophecy they look almost exactly the same as stubs, except that -they define *predictions* instead of *promises* on method prophecies: - -```php -$entityManager->flush()->shouldBeCalled(); -``` - -#### Predictions - -The `shouldBeCalled()` method here assigns `CallPrediction` to our method prophecy. -Predictions are a delayed behavior check for your prophecies. You see, during the entire lifetime -of your doubles, Prophecy records every single call you're making against it inside your -code. After that, Prophecy can use this collected information to check if it matches defined -predictions. You can assign predictions to method prophecies using the -`MethodProphecy::should(PredictionInterface $prediction)` method. As a matter of fact, -the `shouldBeCalled()` method we used earlier is just a shortcut to: - -```php -$entityManager->flush()->should(new Prophecy\Prediction\CallPrediction()); -``` - -It checks if your method of interest (that matches both the method name and the arguments wildcard) -was called 1 or more times. If the prediction failed then it throws an exception. When does this -check happen? Whenever you call `checkPredictions()` on the main Prophet object: - -```php -$prophet->checkPredictions(); -``` - -In PHPUnit, you would want to put this call into the `tearDown()` method. If no predictions -are defined, it would do nothing. So it won't harm to call it after every test. - -There are plenty more predictions you can play with: - -- `CallPrediction` or `shouldBeCalled()` - checks that the method has been called 1 or more times -- `NoCallsPrediction` or `shouldNotBeCalled()` - checks that the method has not been called -- `CallTimesPrediction` or `shouldBeCalledTimes($count)` - checks that the method has been called - `$count` times -- `CallbackPrediction` or `should($callback)` - checks the method against your own custom callback - -Of course, you can always create your own custom prediction any time by implementing -`PredictionInterface`. - -### Spies - -The last bit of awesomeness in Prophecy is out-of-the-box spies support. As I said in the previous -section, Prophecy records every call made during the double's entire lifetime. This means -you don't need to record predictions in order to check them. You can also do it -manually by using the `MethodProphecy::shouldHave(PredictionInterface $prediction)` method: - -```php -$em = $prophet->prophesize('Doctrine\ORM\EntityManager'); - -$controller->createUser($em->reveal()); - -$em->flush()->shouldHaveBeenCalled(); -``` - -Such manipulation with doubles is called spying. And with Prophecy it just works. diff --git a/vendor/phpspec/prophecy/composer.json b/vendor/phpspec/prophecy/composer.json deleted file mode 100644 index dbb2e55..0000000 --- a/vendor/phpspec/prophecy/composer.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "phpspec/prophecy", - "description": "Highly opinionated mocking framework for PHP 5.3+", - "keywords": ["Mock", "Stub", "Dummy", "Double", "Fake", "Spy"], - "homepage": "https://github.com/phpspec/prophecy", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - - "require": { - "php": "^7.2", - "phpdocumentor/reflection-docblock": "^5.0", - "sebastian/comparator": "^3.0 || ^4.0", - "doctrine/instantiator": "^1.2", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - - "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0" - }, - - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - - "autoload-dev": { - "psr-4": { - "Fixtures\\Prophecy\\": "fixtures" - } - }, - - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument.php b/vendor/phpspec/prophecy/src/Prophecy/Argument.php deleted file mode 100644 index fde6aa9..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument.php +++ /dev/null @@ -1,212 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy; - -use Prophecy\Argument\Token; - -/** - * Argument tokens shortcuts. - * - * @author Konstantin Kudryashov - */ -class Argument -{ - /** - * Checks that argument is exact value or object. - * - * @param mixed $value - * - * @return Token\ExactValueToken - */ - public static function exact($value) - { - return new Token\ExactValueToken($value); - } - - /** - * Checks that argument is of specific type or instance of specific class. - * - * @param string $type Type name (`integer`, `string`) or full class name - * - * @return Token\TypeToken - */ - public static function type($type) - { - return new Token\TypeToken($type); - } - - /** - * Checks that argument object has specific state. - * - * @param string $methodName - * @param mixed $value - * - * @return Token\ObjectStateToken - */ - public static function which($methodName, $value) - { - return new Token\ObjectStateToken($methodName, $value); - } - - /** - * Checks that argument matches provided callback. - * - * @param callable $callback - * - * @return Token\CallbackToken - */ - public static function that($callback) - { - return new Token\CallbackToken($callback); - } - - /** - * Matches any single value. - * - * @return Token\AnyValueToken - */ - public static function any() - { - return new Token\AnyValueToken; - } - - /** - * Matches all values to the rest of the signature. - * - * @return Token\AnyValuesToken - */ - public static function cetera() - { - return new Token\AnyValuesToken; - } - - /** - * Checks that argument matches all tokens - * - * @param mixed ... a list of tokens - * - * @return Token\LogicalAndToken - */ - public static function allOf() - { - return new Token\LogicalAndToken(func_get_args()); - } - - /** - * Checks that argument array or countable object has exact number of elements. - * - * @param integer $value array elements count - * - * @return Token\ArrayCountToken - */ - public static function size($value) - { - return new Token\ArrayCountToken($value); - } - - /** - * Checks that argument array contains (key, value) pair - * - * @param mixed $key exact value or token - * @param mixed $value exact value or token - * - * @return Token\ArrayEntryToken - */ - public static function withEntry($key, $value) - { - return new Token\ArrayEntryToken($key, $value); - } - - /** - * Checks that arguments array entries all match value - * - * @param mixed $value - * - * @return Token\ArrayEveryEntryToken - */ - public static function withEveryEntry($value) - { - return new Token\ArrayEveryEntryToken($value); - } - - /** - * Checks that argument array contains value - * - * @param mixed $value - * - * @return Token\ArrayEntryToken - */ - public static function containing($value) - { - return new Token\ArrayEntryToken(self::any(), $value); - } - - /** - * Checks that argument array has key - * - * @param mixed $key exact value or token - * - * @return Token\ArrayEntryToken - */ - public static function withKey($key) - { - return new Token\ArrayEntryToken($key, self::any()); - } - - /** - * Checks that argument does not match the value|token. - * - * @param mixed $value either exact value or argument token - * - * @return Token\LogicalNotToken - */ - public static function not($value) - { - return new Token\LogicalNotToken($value); - } - - /** - * @param string $value - * - * @return Token\StringContainsToken - */ - public static function containingString($value) - { - return new Token\StringContainsToken($value); - } - - /** - * Checks that argument is identical value. - * - * @param mixed $value - * - * @return Token\IdenticalValueToken - */ - public static function is($value) - { - return new Token\IdenticalValueToken($value); - } - - /** - * Check that argument is same value when rounding to the - * given precision. - * - * @param float $value - * @param float $precision - * - * @return Token\ApproximateValueToken - */ - public static function approximate($value, $precision = 0) - { - return new Token\ApproximateValueToken($value, $precision); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php deleted file mode 100644 index a088f21..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php +++ /dev/null @@ -1,101 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument; - -/** - * Arguments wildcarding. - * - * @author Konstantin Kudryashov - */ -class ArgumentsWildcard -{ - /** - * @var Token\TokenInterface[] - */ - private $tokens = array(); - private $string; - - /** - * Initializes wildcard. - * - * @param array $arguments Array of argument tokens or values - */ - public function __construct(array $arguments) - { - foreach ($arguments as $argument) { - if (!$argument instanceof Token\TokenInterface) { - $argument = new Token\ExactValueToken($argument); - } - - $this->tokens[] = $argument; - } - } - - /** - * Calculates wildcard match score for provided arguments. - * - * @param array $arguments - * - * @return false|int False OR integer score (higher - better) - */ - public function scoreArguments(array $arguments) - { - if (0 == count($arguments) && 0 == count($this->tokens)) { - return 1; - } - - $arguments = array_values($arguments); - $totalScore = 0; - foreach ($this->tokens as $i => $token) { - $argument = isset($arguments[$i]) ? $arguments[$i] : null; - if (1 >= $score = $token->scoreArgument($argument)) { - return false; - } - - $totalScore += $score; - - if (true === $token->isLast()) { - return $totalScore; - } - } - - if (count($arguments) > count($this->tokens)) { - return false; - } - - return $totalScore; - } - - /** - * Returns string representation for wildcard. - * - * @return string - */ - public function __toString() - { - if (null === $this->string) { - $this->string = implode(', ', array_map(function ($token) { - return (string) $token; - }, $this->tokens)); - } - - return $this->string; - } - - /** - * @return array - */ - public function getTokens() - { - return $this->tokens; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php deleted file mode 100644 index 5098811..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php +++ /dev/null @@ -1,52 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Any single value token. - * - * @author Konstantin Kudryashov - */ -class AnyValueToken implements TokenInterface -{ - /** - * Always scores 3 for any argument. - * - * @param $argument - * - * @return int - */ - public function scoreArgument($argument) - { - return 3; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return '*'; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php deleted file mode 100644 index f76b17b..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php +++ /dev/null @@ -1,52 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Any values token. - * - * @author Konstantin Kudryashov - */ -class AnyValuesToken implements TokenInterface -{ - /** - * Always scores 2 for any argument. - * - * @param $argument - * - * @return int - */ - public function scoreArgument($argument) - { - return 2; - } - - /** - * Returns true to stop wildcard from processing other tokens. - * - * @return bool - */ - public function isLast() - { - return true; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return '* [, ...]'; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php deleted file mode 100644 index d4918b1..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php +++ /dev/null @@ -1,55 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Approximate value token - * - * @author Daniel Leech - */ -class ApproximateValueToken implements TokenInterface -{ - private $value; - private $precision; - - public function __construct($value, $precision = 0) - { - $this->value = $value; - $this->precision = $precision; - } - - /** - * {@inheritdoc} - */ - public function scoreArgument($argument) - { - return round($argument, $this->precision) === round($this->value, $this->precision) ? 10 : false; - } - - /** - * {@inheritdoc} - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('≅%s', round($this->value, $this->precision)); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php deleted file mode 100644 index 96b4bef..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php +++ /dev/null @@ -1,86 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Array elements count token. - * - * @author Boris Mikhaylov - */ - -class ArrayCountToken implements TokenInterface -{ - private $count; - - /** - * @param integer $value - */ - public function __construct($value) - { - $this->count = $value; - } - - /** - * Scores 6 when argument has preset number of elements. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - return $this->isCountable($argument) && $this->hasProperCount($argument) ? 6 : false; - } - - /** - * Returns false. - * - * @return boolean - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('count(%s)', $this->count); - } - - /** - * Returns true if object is either array or instance of \Countable - * - * @param $argument - * @return bool - */ - private function isCountable($argument) - { - return (is_array($argument) || $argument instanceof \Countable); - } - - /** - * Returns true if $argument has expected number of elements - * - * @param array|\Countable $argument - * - * @return bool - */ - private function hasProperCount($argument) - { - return $this->count === count($argument); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php deleted file mode 100644 index 0305fc7..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php +++ /dev/null @@ -1,143 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use Prophecy\Exception\InvalidArgumentException; - -/** - * Array entry token. - * - * @author Boris Mikhaylov - */ -class ArrayEntryToken implements TokenInterface -{ - /** @var \Prophecy\Argument\Token\TokenInterface */ - private $key; - /** @var \Prophecy\Argument\Token\TokenInterface */ - private $value; - - /** - * @param mixed $key exact value or token - * @param mixed $value exact value or token - */ - public function __construct($key, $value) - { - $this->key = $this->wrapIntoExactValueToken($key); - $this->value = $this->wrapIntoExactValueToken($value); - } - - /** - * Scores half of combined scores from key and value tokens for same entry. Capped at 8. - * If argument implements \ArrayAccess without \Traversable, then key token is restricted to ExactValueToken. - * - * @param array|\ArrayAccess|\Traversable $argument - * - * @throws \Prophecy\Exception\InvalidArgumentException - * @return bool|int - */ - public function scoreArgument($argument) - { - if ($argument instanceof \Traversable) { - $argument = iterator_to_array($argument); - } - - if ($argument instanceof \ArrayAccess) { - $argument = $this->convertArrayAccessToEntry($argument); - } - - if (!is_array($argument) || empty($argument)) { - return false; - } - - $keyScores = array_map(array($this->key,'scoreArgument'), array_keys($argument)); - $valueScores = array_map(array($this->value,'scoreArgument'), $argument); - $scoreEntry = function ($value, $key) { - return $value && $key ? min(8, ($key + $value) / 2) : false; - }; - - return max(array_map($scoreEntry, $valueScores, $keyScores)); - } - - /** - * Returns false. - * - * @return boolean - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('[..., %s => %s, ...]', $this->key, $this->value); - } - - /** - * Returns key - * - * @return TokenInterface - */ - public function getKey() - { - return $this->key; - } - - /** - * Returns value - * - * @return TokenInterface - */ - public function getValue() - { - return $this->value; - } - - /** - * Wraps non token $value into ExactValueToken - * - * @param $value - * @return TokenInterface - */ - private function wrapIntoExactValueToken($value) - { - return $value instanceof TokenInterface ? $value : new ExactValueToken($value); - } - - /** - * Converts instance of \ArrayAccess to key => value array entry - * - * @param \ArrayAccess $object - * - * @return array|null - * @throws \Prophecy\Exception\InvalidArgumentException - */ - private function convertArrayAccessToEntry(\ArrayAccess $object) - { - if (!$this->key instanceof ExactValueToken) { - throw new InvalidArgumentException(sprintf( - 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL. - 'But you used `%s`.', - $this->key - )); - } - - $key = $this->key->getValue(); - - return $object->offsetExists($key) ? array($key => $object[$key]) : array(); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php deleted file mode 100644 index 5d41fa4..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php +++ /dev/null @@ -1,82 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Array every entry token. - * - * @author Adrien Brault - */ -class ArrayEveryEntryToken implements TokenInterface -{ - /** - * @var TokenInterface - */ - private $value; - - /** - * @param mixed $value exact value or token - */ - public function __construct($value) - { - if (!$value instanceof TokenInterface) { - $value = new ExactValueToken($value); - } - - $this->value = $value; - } - - /** - * {@inheritdoc} - */ - public function scoreArgument($argument) - { - if (!$argument instanceof \Traversable && !is_array($argument)) { - return false; - } - - $scores = array(); - foreach ($argument as $key => $argumentEntry) { - $scores[] = $this->value->scoreArgument($argumentEntry); - } - - if (empty($scores) || in_array(false, $scores, true)) { - return false; - } - - return array_sum($scores) / count($scores); - } - - /** - * {@inheritdoc} - */ - public function isLast() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - return sprintf('[%s, ..., %s]', $this->value, $this->value); - } - - /** - * @return TokenInterface - */ - public function getValue() - { - return $this->value; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php deleted file mode 100644 index f45ba20..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php +++ /dev/null @@ -1,75 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use Prophecy\Exception\InvalidArgumentException; - -/** - * Callback-verified token. - * - * @author Konstantin Kudryashov - */ -class CallbackToken implements TokenInterface -{ - private $callback; - - /** - * Initializes token. - * - * @param callable $callback - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function __construct($callback) - { - if (!is_callable($callback)) { - throw new InvalidArgumentException(sprintf( - 'Callable expected as an argument to CallbackToken, but got %s.', - gettype($callback) - )); - } - - $this->callback = $callback; - } - - /** - * Scores 7 if callback returns true, false otherwise. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - return call_user_func($this->callback, $argument) ? 7 : false; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return 'callback()'; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php deleted file mode 100644 index 045a1b9..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php +++ /dev/null @@ -1,118 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use SebastianBergmann\Comparator\ComparisonFailure; -use Prophecy\Comparator\Factory as ComparatorFactory; -use Prophecy\Util\StringUtil; - -/** - * Exact value token. - * - * @author Konstantin Kudryashov - */ -class ExactValueToken implements TokenInterface -{ - private $value; - private $string; - private $util; - private $comparatorFactory; - - /** - * Initializes token. - * - * @param mixed $value - * @param StringUtil $util - * @param ComparatorFactory $comparatorFactory - */ - public function __construct($value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null) - { - $this->value = $value; - $this->util = $util ?: new StringUtil(); - - $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); - } - - /** - * Scores 10 if argument matches preset value. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - if (is_object($argument) && is_object($this->value)) { - $comparator = $this->comparatorFactory->getComparatorFor( - $argument, $this->value - ); - - try { - $comparator->assertEquals($argument, $this->value); - return 10; - } catch (ComparisonFailure $failure) { - return false; - } - } - - // If either one is an object it should be castable to a string - if (is_object($argument) xor is_object($this->value)) { - if (is_object($argument) && !method_exists($argument, '__toString')) { - return false; - } - - if (is_object($this->value) && !method_exists($this->value, '__toString')) { - return false; - } - } elseif (is_numeric($argument) && is_numeric($this->value)) { - // noop - } elseif (gettype($argument) !== gettype($this->value)) { - return false; - } - - return $argument == $this->value ? 10 : false; - } - - /** - * Returns preset value against which token checks arguments. - * - * @return mixed - */ - public function getValue() - { - return $this->value; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - if (null === $this->string) { - $this->string = sprintf('exact(%s)', $this->util->stringify($this->value)); - } - - return $this->string; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php deleted file mode 100644 index 0b6d23a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php +++ /dev/null @@ -1,74 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use Prophecy\Util\StringUtil; - -/** - * Identical value token. - * - * @author Florian Voutzinos - */ -class IdenticalValueToken implements TokenInterface -{ - private $value; - private $string; - private $util; - - /** - * Initializes token. - * - * @param mixed $value - * @param StringUtil $util - */ - public function __construct($value, StringUtil $util = null) - { - $this->value = $value; - $this->util = $util ?: new StringUtil(); - } - - /** - * Scores 11 if argument matches preset value. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - return $argument === $this->value ? 11 : false; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - if (null === $this->string) { - $this->string = sprintf('identical(%s)', $this->util->stringify($this->value)); - } - - return $this->string; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php deleted file mode 100644 index 4ee1b25..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php +++ /dev/null @@ -1,80 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Logical AND token. - * - * @author Boris Mikhaylov - */ -class LogicalAndToken implements TokenInterface -{ - private $tokens = array(); - - /** - * @param array $arguments exact values or tokens - */ - public function __construct(array $arguments) - { - foreach ($arguments as $argument) { - if (!$argument instanceof TokenInterface) { - $argument = new ExactValueToken($argument); - } - $this->tokens[] = $argument; - } - } - - /** - * Scores maximum score from scores returned by tokens for this argument if all of them score. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - if (0 === count($this->tokens)) { - return false; - } - - $maxScore = 0; - foreach ($this->tokens as $token) { - $score = $token->scoreArgument($argument); - if (false === $score) { - return false; - } - $maxScore = max($score, $maxScore); - } - - return $maxScore; - } - - /** - * Returns false. - * - * @return boolean - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('bool(%s)', implode(' AND ', $this->tokens)); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php deleted file mode 100644 index 623efa5..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php +++ /dev/null @@ -1,73 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Logical NOT token. - * - * @author Boris Mikhaylov - */ -class LogicalNotToken implements TokenInterface -{ - /** @var \Prophecy\Argument\Token\TokenInterface */ - private $token; - - /** - * @param mixed $value exact value or token - */ - public function __construct($value) - { - $this->token = $value instanceof TokenInterface? $value : new ExactValueToken($value); - } - - /** - * Scores 4 when preset token does not match the argument. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - return false === $this->token->scoreArgument($argument) ? 4 : false; - } - - /** - * Returns true if preset token is last. - * - * @return bool|int - */ - public function isLast() - { - return $this->token->isLast(); - } - - /** - * Returns originating token. - * - * @return TokenInterface - */ - public function getOriginatingToken() - { - return $this->token; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('not(%s)', $this->token); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php deleted file mode 100644 index d771077..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php +++ /dev/null @@ -1,104 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use SebastianBergmann\Comparator\ComparisonFailure; -use Prophecy\Comparator\Factory as ComparatorFactory; -use Prophecy\Util\StringUtil; - -/** - * Object state-checker token. - * - * @author Konstantin Kudryashov - */ -class ObjectStateToken implements TokenInterface -{ - private $name; - private $value; - private $util; - private $comparatorFactory; - - /** - * Initializes token. - * - * @param string $methodName - * @param mixed $value Expected return value - * @param null|StringUtil $util - * @param ComparatorFactory $comparatorFactory - */ - public function __construct( - $methodName, - $value, - StringUtil $util = null, - ComparatorFactory $comparatorFactory = null - ) { - $this->name = $methodName; - $this->value = $value; - $this->util = $util ?: new StringUtil; - - $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); - } - - /** - * Scores 8 if argument is an object, which method returns expected value. - * - * @param mixed $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - if (is_object($argument) && method_exists($argument, $this->name)) { - $actual = call_user_func(array($argument, $this->name)); - - $comparator = $this->comparatorFactory->getComparatorFor( - $this->value, $actual - ); - - try { - $comparator->assertEquals($this->value, $actual); - return 8; - } catch (ComparisonFailure $failure) { - return false; - } - } - - if (is_object($argument) && property_exists($argument, $this->name)) { - return $argument->{$this->name} === $this->value ? 8 : false; - } - - return false; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('state(%s(), %s)', - $this->name, - $this->util->stringify($this->value) - ); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php deleted file mode 100644 index bd8d423..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php +++ /dev/null @@ -1,67 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * String contains token. - * - * @author Peter Mitchell - */ -class StringContainsToken implements TokenInterface -{ - private $value; - - /** - * Initializes token. - * - * @param string $value - */ - public function __construct($value) - { - $this->value = $value; - } - - public function scoreArgument($argument) - { - return is_string($argument) && strpos($argument, $this->value) !== false ? 6 : false; - } - - /** - * Returns preset value against which token checks arguments. - * - * @return mixed - */ - public function getValue() - { - return $this->value; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('contains("%s")', $this->value); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php deleted file mode 100644 index 625d3ba..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php +++ /dev/null @@ -1,43 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Argument token interface. - * - * @author Konstantin Kudryashov - */ -interface TokenInterface -{ - /** - * Calculates token match score for provided argument. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument); - - /** - * Returns true if this token prevents check of other tokens (is last one). - * - * @return bool|int - */ - public function isLast(); - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString(); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php deleted file mode 100644 index cb65132..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php +++ /dev/null @@ -1,76 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use Prophecy\Exception\InvalidArgumentException; - -/** - * Value type token. - * - * @author Konstantin Kudryashov - */ -class TypeToken implements TokenInterface -{ - private $type; - - /** - * @param string $type - */ - public function __construct($type) - { - $checker = "is_{$type}"; - if (!function_exists($checker) && !interface_exists($type) && !class_exists($type)) { - throw new InvalidArgumentException(sprintf( - 'Type or class name expected as an argument to TypeToken, but got %s.', $type - )); - } - - $this->type = $type; - } - - /** - * Scores 5 if argument has the same type this token was constructed with. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - $checker = "is_{$this->type}"; - if (function_exists($checker)) { - return call_user_func($checker, $argument) ? 5 : false; - } - - return $argument instanceof $this->type ? 5 : false; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('type(%s)', $this->type); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php b/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php deleted file mode 100644 index 2652235..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php +++ /dev/null @@ -1,162 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Call; - -use Exception; -use Prophecy\Argument\ArgumentsWildcard; - -/** - * Call object. - * - * @author Konstantin Kudryashov - */ -class Call -{ - private $methodName; - private $arguments; - private $returnValue; - private $exception; - private $file; - private $line; - private $scores; - - /** - * Initializes call. - * - * @param string $methodName - * @param array $arguments - * @param mixed $returnValue - * @param Exception $exception - * @param null|string $file - * @param null|int $line - */ - public function __construct($methodName, array $arguments, $returnValue, - Exception $exception = null, $file, $line) - { - $this->methodName = $methodName; - $this->arguments = $arguments; - $this->returnValue = $returnValue; - $this->exception = $exception; - $this->scores = new \SplObjectStorage(); - - if ($file) { - $this->file = $file; - $this->line = intval($line); - } - } - - /** - * Returns called method name. - * - * @return string - */ - public function getMethodName() - { - return $this->methodName; - } - - /** - * Returns called method arguments. - * - * @return array - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Returns called method return value. - * - * @return null|mixed - */ - public function getReturnValue() - { - return $this->returnValue; - } - - /** - * Returns exception that call thrown. - * - * @return null|Exception - */ - public function getException() - { - return $this->exception; - } - - /** - * Returns callee filename. - * - * @return string - */ - public function getFile() - { - return $this->file; - } - - /** - * Returns callee line number. - * - * @return int - */ - public function getLine() - { - return $this->line; - } - - /** - * Returns short notation for callee place. - * - * @return string - */ - public function getCallPlace() - { - if (null === $this->file) { - return 'unknown'; - } - - return sprintf('%s:%d', $this->file, $this->line); - } - - /** - * Adds the wildcard match score for the provided wildcard. - * - * @param ArgumentsWildcard $wildcard - * @param false|int $score - * - * @return $this - */ - public function addScore(ArgumentsWildcard $wildcard, $score) - { - $this->scores[$wildcard] = $score; - - return $this; - } - - /** - * Returns wildcard match score for the provided wildcard. The score is - * calculated if not already done. - * - * @param ArgumentsWildcard $wildcard - * - * @return false|int False OR integer score (higher - better) - */ - public function getScore(ArgumentsWildcard $wildcard) - { - if (isset($this->scores[$wildcard])) { - return $this->scores[$wildcard]; - } - - return $this->scores[$wildcard] = $wildcard->scoreArguments($this->getArguments()); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php b/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php deleted file mode 100644 index debc9a7..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php +++ /dev/null @@ -1,240 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Call; - -use Prophecy\Exception\Prophecy\MethodProphecyException; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Argument\ArgumentsWildcard; -use Prophecy\Util\StringUtil; -use Prophecy\Exception\Call\UnexpectedCallException; -use SplObjectStorage; - -/** - * Calls receiver & manager. - * - * @author Konstantin Kudryashov - */ -class CallCenter -{ - private $util; - - /** - * @var Call[] - */ - private $recordedCalls = array(); - - /** - * @var SplObjectStorage - */ - private $unexpectedCalls; - - /** - * Initializes call center. - * - * @param StringUtil $util - */ - public function __construct(StringUtil $util = null) - { - $this->util = $util ?: new StringUtil; - $this->unexpectedCalls = new SplObjectStorage(); - } - - /** - * Makes and records specific method call for object prophecy. - * - * @param ObjectProphecy $prophecy - * @param string $methodName - * @param array $arguments - * - * @return mixed Returns null if no promise for prophecy found or promise return value. - * - * @throws \Prophecy\Exception\Call\UnexpectedCallException If no appropriate method prophecy found - */ - public function makeCall(ObjectProphecy $prophecy, $methodName, array $arguments) - { - // For efficiency exclude 'args' from the generated backtrace - // Limit backtrace to last 3 calls as we don't use the rest - $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3); - - $file = $line = null; - if (isset($backtrace[2]) && isset($backtrace[2]['file'])) { - $file = $backtrace[2]['file']; - $line = $backtrace[2]['line']; - } - - // If no method prophecies defined, then it's a dummy, so we'll just return null - if ('__destruct' === strtolower($methodName) || 0 == count($prophecy->getMethodProphecies())) { - $this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line); - - return null; - } - - // There are method prophecies, so it's a fake/stub. Searching prophecy for this call - $matches = $this->findMethodProphecies($prophecy, $methodName, $arguments); - - // If fake/stub doesn't have method prophecy for this call - throw exception - if (!count($matches)) { - $this->unexpectedCalls->attach(new Call($methodName, $arguments, null, null, $file, $line), $prophecy); - $this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line); - - return null; - } - - // Sort matches by their score value - @usort($matches, function ($match1, $match2) { return $match2[0] - $match1[0]; }); - - $score = $matches[0][0]; - // If Highest rated method prophecy has a promise - execute it or return null instead - $methodProphecy = $matches[0][1]; - $returnValue = null; - $exception = null; - if ($promise = $methodProphecy->getPromise()) { - try { - $returnValue = $promise->execute($arguments, $prophecy, $methodProphecy); - } catch (\Exception $e) { - $exception = $e; - } - } - - if ($methodProphecy->hasReturnVoid() && $returnValue !== null) { - throw new MethodProphecyException( - "The method \"$methodName\" has a void return type, but the promise returned a value", - $methodProphecy - ); - } - - $this->recordedCalls[] = $call = new Call( - $methodName, $arguments, $returnValue, $exception, $file, $line - ); - $call->addScore($methodProphecy->getArgumentsWildcard(), $score); - - if (null !== $exception) { - throw $exception; - } - - return $returnValue; - } - - /** - * Searches for calls by method name & arguments wildcard. - * - * @param string $methodName - * @param ArgumentsWildcard $wildcard - * - * @return Call[] - */ - public function findCalls($methodName, ArgumentsWildcard $wildcard) - { - $methodName = strtolower($methodName); - - return array_values( - array_filter($this->recordedCalls, function (Call $call) use ($methodName, $wildcard) { - return $methodName === strtolower($call->getMethodName()) - && 0 < $call->getScore($wildcard) - ; - }) - ); - } - - /** - * @throws UnexpectedCallException - */ - public function checkUnexpectedCalls() - { - /** @var Call $call */ - foreach ($this->unexpectedCalls as $call) { - $prophecy = $this->unexpectedCalls[$call]; - - // If fake/stub doesn't have method prophecy for this call - throw exception - if (!count($this->findMethodProphecies($prophecy, $call->getMethodName(), $call->getArguments()))) { - throw $this->createUnexpectedCallException($prophecy, $call->getMethodName(), $call->getArguments()); - } - } - } - - private function createUnexpectedCallException(ObjectProphecy $prophecy, $methodName, - array $arguments) - { - $classname = get_class($prophecy->reveal()); - $indentationLength = 8; // looks good - $argstring = implode( - ",\n", - $this->indentArguments( - array_map(array($this->util, 'stringify'), $arguments), - $indentationLength - ) - ); - - $expected = array(); - - foreach (call_user_func_array('array_merge', $prophecy->getMethodProphecies()) as $methodProphecy) { - $expected[] = sprintf( - " - %s(\n" . - "%s\n" . - " )", - $methodProphecy->getMethodName(), - implode( - ",\n", - $this->indentArguments( - array_map('strval', $methodProphecy->getArgumentsWildcard()->getTokens()), - $indentationLength - ) - ) - ); - } - - return new UnexpectedCallException( - sprintf( - "Unexpected method call on %s:\n". - " - %s(\n". - "%s\n". - " )\n". - "expected calls were:\n". - "%s", - - $classname, $methodName, $argstring, implode("\n", $expected) - ), - $prophecy, $methodName, $arguments - - ); - } - - private function indentArguments(array $arguments, $indentationLength) - { - return preg_replace_callback( - '/^/m', - function () use ($indentationLength) { - return str_repeat(' ', $indentationLength); - }, - $arguments - ); - } - - /** - * @param ObjectProphecy $prophecy - * @param string $methodName - * @param array $arguments - * - * @return array - */ - private function findMethodProphecies(ObjectProphecy $prophecy, $methodName, array $arguments) - { - $matches = array(); - foreach ($prophecy->getMethodProphecies($methodName) as $methodProphecy) { - if (0 < $score = $methodProphecy->getArgumentsWildcard()->scoreArguments($arguments)) { - $matches[] = array($score, $methodProphecy); - } - } - - return $matches; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php b/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php deleted file mode 100644 index fa4f578..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php +++ /dev/null @@ -1,44 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Comparator; - -use SebastianBergmann\Comparator\Comparator; -use SebastianBergmann\Comparator\ComparisonFailure; - -/** - * Closure comparator. - * - * @author Konstantin Kudryashov - */ -final class ClosureComparator extends Comparator -{ - public function accepts($expected, $actual) - { - return is_object($expected) && $expected instanceof \Closure - && is_object($actual) && $actual instanceof \Closure; - } - - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array()) - { - if ($expected !== $actual) { - throw new ComparisonFailure( - $expected, - $actual, - // we don't need a diff - '', - '', - false, - 'all closures are different if not identical' - ); - } - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php b/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php deleted file mode 100644 index 2070db1..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php +++ /dev/null @@ -1,47 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Comparator; - -use SebastianBergmann\Comparator\Factory as BaseFactory; - -/** - * Prophecy comparator factory. - * - * @author Konstantin Kudryashov - */ -final class Factory extends BaseFactory -{ - /** - * @var Factory - */ - private static $instance; - - public function __construct() - { - parent::__construct(); - - $this->register(new ClosureComparator()); - $this->register(new ProphecyComparator()); - } - - /** - * @return Factory - */ - public static function getInstance() - { - if (self::$instance === null) { - self::$instance = new Factory; - } - - return self::$instance; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php b/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php deleted file mode 100644 index 298a8e3..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php +++ /dev/null @@ -1,28 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Comparator; - -use Prophecy\Prophecy\ProphecyInterface; -use SebastianBergmann\Comparator\ObjectComparator; - -class ProphecyComparator extends ObjectComparator -{ - public function accepts($expected, $actual) - { - return is_object($expected) && is_object($actual) && $actual instanceof ProphecyInterface; - } - - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array()) - { - parent::assertEquals($expected, $actual->reveal(), $delta, $canonicalize, $ignoreCase, $processed); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php deleted file mode 100644 index 2b87521..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php +++ /dev/null @@ -1,66 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler; - -use ReflectionClass; - -/** - * Cached class doubler. - * Prevents mirroring/creation of the same structure twice. - * - * @author Konstantin Kudryashov - */ -class CachedDoubler extends Doubler -{ - private static $classes = array(); - - /** - * {@inheritdoc} - */ - protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) - { - $classId = $this->generateClassId($class, $interfaces); - if (isset(self::$classes[$classId])) { - return self::$classes[$classId]; - } - - return self::$classes[$classId] = parent::createDoubleClass($class, $interfaces); - } - - /** - * @param ReflectionClass $class - * @param ReflectionClass[] $interfaces - * - * @return string - */ - private function generateClassId(ReflectionClass $class = null, array $interfaces) - { - $parts = array(); - if (null !== $class) { - $parts[] = $class->getName(); - } - foreach ($interfaces as $interface) { - $parts[] = $interface->getName(); - } - foreach ($this->getClassPatches() as $patch) { - $parts[] = get_class($patch); - } - sort($parts); - - return md5(implode('', $parts)); - } - - public function resetCache() - { - self::$classes = array(); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php deleted file mode 100644 index d6d1968..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php +++ /dev/null @@ -1,48 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; - -/** - * Class patch interface. - * Class patches extend doubles functionality or help - * Prophecy to avoid some internal PHP bugs. - * - * @author Konstantin Kudryashov - */ -interface ClassPatchInterface -{ - /** - * Checks if patch supports specific class node. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node); - - /** - * Applies patch to the specific class node. - * - * @param ClassNode $node - * @return void - */ - public function apply(ClassNode $node); - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority(); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php deleted file mode 100644 index 9d84309..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php +++ /dev/null @@ -1,76 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; -use Prophecy\Doubler\Generator\Node\MethodNode; - -/** - * Disable constructor. - * Makes all constructor arguments optional. - * - * @author Konstantin Kudryashov - */ -class DisableConstructorPatch implements ClassPatchInterface -{ - /** - * Checks if class has `__construct` method. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - return true; - } - - /** - * Makes all class constructor arguments optional. - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - if (!$node->isExtendable('__construct')) { - return; - } - - if (!$node->hasMethod('__construct')) { - $node->addMethod(new MethodNode('__construct', '')); - - return; - } - - $constructor = $node->getMethod('__construct'); - foreach ($constructor->getArguments() as $argument) { - $argument->setDefault(null); - } - - $constructor->setCode(<< - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; - -/** - * Exception patch for HHVM to remove the stubs from special methods - * - * @author Christophe Coevoet - */ -class HhvmExceptionPatch implements ClassPatchInterface -{ - /** - * Supports exceptions on HHVM. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - if (!defined('HHVM_VERSION')) { - return false; - } - - return 'Exception' === $node->getParentClass() || is_subclass_of($node->getParentClass(), 'Exception'); - } - - /** - * Removes special exception static methods from the doubled methods. - * - * @param ClassNode $node - * - * @return void - */ - public function apply(ClassNode $node) - { - if ($node->hasMethod('setTraceOptions')) { - $node->getMethod('setTraceOptions')->useParentCode(); - } - if ($node->hasMethod('getTraceOptions')) { - $node->getMethod('getTraceOptions')->useParentCode(); - } - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - return -50; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php deleted file mode 100644 index ab99f74..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php +++ /dev/null @@ -1,68 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; - -/** - * Remove method functionality from the double which will clash with php keywords. - * - * @author Milan Magudia - */ -class KeywordPatch implements ClassPatchInterface -{ - /** - * Support any class - * - * @param ClassNode $node - * - * @return boolean - */ - public function supports(ClassNode $node) - { - return true; - } - - /** - * Remove methods that clash with php keywords - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - $methodNames = array_keys($node->getMethods()); - $methodsToRemove = array_intersect($methodNames, $this->getKeywords()); - foreach ($methodsToRemove as $methodName) { - $node->removeMethod($methodName); - } - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority() - { - return 49; - } - - /** - * Returns array of php keywords. - * - * @return array - */ - private function getKeywords() - { - return ['__halt_compiler']; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php deleted file mode 100644 index 9ff49cd..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php +++ /dev/null @@ -1,94 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; -use Prophecy\Doubler\Generator\Node\MethodNode; -use Prophecy\PhpDocumentor\ClassAndInterfaceTagRetriever; -use Prophecy\PhpDocumentor\MethodTagRetrieverInterface; - -/** - * Discover Magical API using "@method" PHPDoc format. - * - * @author Thomas Tourlourat - * @author Kévin Dunglas - * @author Théo FIDRY - */ -class MagicCallPatch implements ClassPatchInterface -{ - private $tagRetriever; - - public function __construct(MethodTagRetrieverInterface $tagRetriever = null) - { - $this->tagRetriever = null === $tagRetriever ? new ClassAndInterfaceTagRetriever() : $tagRetriever; - } - - /** - * Support any class - * - * @param ClassNode $node - * - * @return boolean - */ - public function supports(ClassNode $node) - { - return true; - } - - /** - * Discover Magical API - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - $types = array_filter($node->getInterfaces(), function ($interface) { - return 0 !== strpos($interface, 'Prophecy\\'); - }); - $types[] = $node->getParentClass(); - - foreach ($types as $type) { - $reflectionClass = new \ReflectionClass($type); - - while ($reflectionClass) { - $tagList = $this->tagRetriever->getTagList($reflectionClass); - - foreach ($tagList as $tag) { - $methodName = $tag->getMethodName(); - - if (empty($methodName)) { - continue; - } - - if (!$reflectionClass->hasMethod($methodName)) { - $methodNode = new MethodNode($methodName); - $methodNode->setStatic($tag->isStatic()); - $node->addMethod($methodNode); - } - } - - $reflectionClass = $reflectionClass->getParentClass(); - } - } - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return integer Priority number (higher - earlier) - */ - public function getPriority() - { - return 50; - } -} - diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php deleted file mode 100644 index bf5eb5c..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php +++ /dev/null @@ -1,111 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; -use Prophecy\Doubler\Generator\Node\MethodNode; -use Prophecy\Doubler\Generator\Node\ArgumentNode; - -/** - * Add Prophecy functionality to the double. - * This is a core class patch for Prophecy. - * - * @author Konstantin Kudryashov - */ -class ProphecySubjectPatch implements ClassPatchInterface -{ - /** - * Always returns true. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - return true; - } - - /** - * Apply Prophecy functionality to class node. - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface'); - $node->addProperty('objectProphecyClosure', 'private'); - - foreach ($node->getMethods() as $name => $method) { - if ('__construct' === strtolower($name)) { - continue; - } - - if ($method->getReturnType() === 'void') { - $method->setCode( - '$this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());' - ); - } else { - $method->setCode( - 'return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());' - ); - } - } - - $prophecySetter = new MethodNode('setProphecy'); - $prophecyArgument = new ArgumentNode('prophecy'); - $prophecyArgument->setTypeHint('Prophecy\Prophecy\ProphecyInterface'); - $prophecySetter->addArgument($prophecyArgument); - $prophecySetter->setCode(<<objectProphecyClosure) { - \$this->objectProphecyClosure = static function () use (\$prophecy) { - return \$prophecy; - }; -} -PHP - ); - - $prophecyGetter = new MethodNode('getProphecy'); - $prophecyGetter->setCode('return \call_user_func($this->objectProphecyClosure);'); - - if ($node->hasMethod('__call')) { - $__call = $node->getMethod('__call'); - } else { - $__call = new MethodNode('__call'); - $__call->addArgument(new ArgumentNode('name')); - $__call->addArgument(new ArgumentNode('arguments')); - - $node->addMethod($__call, true); - } - - $__call->setCode(<<getProphecy(), func_get_arg(0) -); -PHP - ); - - $node->addMethod($prophecySetter, true); - $node->addMethod($prophecyGetter, true); - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority() - { - return 0; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php deleted file mode 100644 index 9166aee..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php +++ /dev/null @@ -1,57 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; - -/** - * ReflectionClass::newInstance patch. - * Makes first argument of newInstance optional, since it works but signature is misleading - * - * @author Florian Klein - */ -class ReflectionClassNewInstancePatch implements ClassPatchInterface -{ - /** - * Supports ReflectionClass - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - return 'ReflectionClass' === $node->getParentClass(); - } - - /** - * Updates newInstance's first argument to make it optional - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - foreach ($node->getMethod('newInstance')->getArguments() as $argument) { - $argument->setDefault(null); - } - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher = earlier) - */ - public function getPriority() - { - return 50; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php deleted file mode 100644 index ceee94a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php +++ /dev/null @@ -1,123 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; -use Prophecy\Doubler\Generator\Node\MethodNode; - -/** - * SplFileInfo patch. - * Makes SplFileInfo and derivative classes usable with Prophecy. - * - * @author Konstantin Kudryashov - */ -class SplFileInfoPatch implements ClassPatchInterface -{ - /** - * Supports everything that extends SplFileInfo. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - if (null === $node->getParentClass()) { - return false; - } - return 'SplFileInfo' === $node->getParentClass() - || is_subclass_of($node->getParentClass(), 'SplFileInfo') - ; - } - - /** - * Updated constructor code to call parent one with dummy file argument. - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - if ($node->hasMethod('__construct')) { - $constructor = $node->getMethod('__construct'); - } else { - $constructor = new MethodNode('__construct'); - $node->addMethod($constructor); - } - - if ($this->nodeIsDirectoryIterator($node)) { - $constructor->setCode('return parent::__construct("' . __DIR__ . '");'); - - return; - } - - if ($this->nodeIsSplFileObject($node)) { - $filePath = str_replace('\\','\\\\',__FILE__); - $constructor->setCode('return parent::__construct("' . $filePath .'");'); - - return; - } - - if ($this->nodeIsSymfonySplFileInfo($node)) { - $filePath = str_replace('\\','\\\\',__FILE__); - $constructor->setCode('return parent::__construct("' . $filePath .'", "", "");'); - - return; - } - - $constructor->useParentCode(); - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority() - { - return 50; - } - - /** - * @param ClassNode $node - * @return boolean - */ - private function nodeIsDirectoryIterator(ClassNode $node) - { - $parent = $node->getParentClass(); - - return 'DirectoryIterator' === $parent - || is_subclass_of($parent, 'DirectoryIterator'); - } - - /** - * @param ClassNode $node - * @return boolean - */ - private function nodeIsSplFileObject(ClassNode $node) - { - $parent = $node->getParentClass(); - - return 'SplFileObject' === $parent - || is_subclass_of($parent, 'SplFileObject'); - } - - /** - * @param ClassNode $node - * @return boolean - */ - private function nodeIsSymfonySplFileInfo(ClassNode $node) - { - $parent = $node->getParentClass(); - - return 'Symfony\\Component\\Finder\\SplFileInfo' === $parent; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php deleted file mode 100644 index b98e943..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php +++ /dev/null @@ -1,95 +0,0 @@ -implementsAThrowableInterface($node) && $this->doesNotExtendAThrowableClass($node); - } - - /** - * @param ClassNode $node - * @return bool - */ - private function implementsAThrowableInterface(ClassNode $node) - { - foreach ($node->getInterfaces() as $type) { - if (is_a($type, 'Throwable', true)) { - return true; - } - } - - return false; - } - - /** - * @param ClassNode $node - * @return bool - */ - private function doesNotExtendAThrowableClass(ClassNode $node) - { - return !is_a($node->getParentClass(), 'Throwable', true); - } - - /** - * Applies patch to the specific class node. - * - * @param ClassNode $node - * - * @return void - */ - public function apply(ClassNode $node) - { - $this->checkItCanBeDoubled($node); - $this->setParentClassToException($node); - } - - private function checkItCanBeDoubled(ClassNode $node) - { - $className = $node->getParentClass(); - if ($className !== 'stdClass') { - throw new ClassCreatorException( - sprintf( - 'Cannot double concrete class %s as well as implement Traversable', - $className - ), - $node - ); - } - } - - private function setParentClassToException(ClassNode $node) - { - $node->setParentClass('Exception'); - - $node->removeMethod('getMessage'); - $node->removeMethod('getCode'); - $node->removeMethod('getFile'); - $node->removeMethod('getLine'); - $node->removeMethod('getTrace'); - $node->removeMethod('getPrevious'); - $node->removeMethod('getNext'); - $node->removeMethod('getTraceAsString'); - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority() - { - return 100; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php deleted file mode 100644 index eea0202..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php +++ /dev/null @@ -1,83 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; -use Prophecy\Doubler\Generator\Node\MethodNode; - -/** - * Traversable interface patch. - * Forces classes that implement interfaces, that extend Traversable to also implement Iterator. - * - * @author Konstantin Kudryashov - */ -class TraversablePatch implements ClassPatchInterface -{ - /** - * Supports nodetree, that implement Traversable, but not Iterator or IteratorAggregate. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - if (in_array('Iterator', $node->getInterfaces())) { - return false; - } - if (in_array('IteratorAggregate', $node->getInterfaces())) { - return false; - } - - foreach ($node->getInterfaces() as $interface) { - if ('Traversable' !== $interface && !is_subclass_of($interface, 'Traversable')) { - continue; - } - if ('Iterator' === $interface || is_subclass_of($interface, 'Iterator')) { - continue; - } - if ('IteratorAggregate' === $interface || is_subclass_of($interface, 'IteratorAggregate')) { - continue; - } - - return true; - } - - return false; - } - - /** - * Forces class to implement Iterator interface. - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - $node->addInterface('Iterator'); - - $node->addMethod(new MethodNode('current')); - $node->addMethod(new MethodNode('key')); - $node->addMethod(new MethodNode('next')); - $node->addMethod(new MethodNode('rewind')); - $node->addMethod(new MethodNode('valid')); - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority() - { - return 100; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php deleted file mode 100644 index 699be3a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php +++ /dev/null @@ -1,22 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler; - -/** - * Core double interface. - * All doubled classes will implement this one. - * - * @author Konstantin Kudryashov - */ -interface DoubleInterface -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php deleted file mode 100644 index a378ae2..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php +++ /dev/null @@ -1,146 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler; - -use Doctrine\Instantiator\Instantiator; -use Prophecy\Doubler\ClassPatch\ClassPatchInterface; -use Prophecy\Doubler\Generator\ClassMirror; -use Prophecy\Doubler\Generator\ClassCreator; -use Prophecy\Exception\InvalidArgumentException; -use ReflectionClass; - -/** - * Cached class doubler. - * Prevents mirroring/creation of the same structure twice. - * - * @author Konstantin Kudryashov - */ -class Doubler -{ - private $mirror; - private $creator; - private $namer; - - /** - * @var ClassPatchInterface[] - */ - private $patches = array(); - - /** - * @var \Doctrine\Instantiator\Instantiator - */ - private $instantiator; - - /** - * Initializes doubler. - * - * @param ClassMirror $mirror - * @param ClassCreator $creator - * @param NameGenerator $namer - */ - public function __construct(ClassMirror $mirror = null, ClassCreator $creator = null, - NameGenerator $namer = null) - { - $this->mirror = $mirror ?: new ClassMirror; - $this->creator = $creator ?: new ClassCreator; - $this->namer = $namer ?: new NameGenerator; - } - - /** - * Returns list of registered class patches. - * - * @return ClassPatchInterface[] - */ - public function getClassPatches() - { - return $this->patches; - } - - /** - * Registers new class patch. - * - * @param ClassPatchInterface $patch - */ - public function registerClassPatch(ClassPatchInterface $patch) - { - $this->patches[] = $patch; - - @usort($this->patches, function (ClassPatchInterface $patch1, ClassPatchInterface $patch2) { - return $patch2->getPriority() - $patch1->getPriority(); - }); - } - - /** - * Creates double from specific class or/and list of interfaces. - * - * @param ReflectionClass $class - * @param ReflectionClass[] $interfaces Array of ReflectionClass instances - * @param array $args Constructor arguments - * - * @return DoubleInterface - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function double(ReflectionClass $class = null, array $interfaces, array $args = null) - { - foreach ($interfaces as $interface) { - if (!$interface instanceof ReflectionClass) { - throw new InvalidArgumentException(sprintf( - "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n". - "a second argument to `Doubler::double(...)`, but got %s.", - is_object($interface) ? get_class($interface).' class' : gettype($interface) - )); - } - } - - $classname = $this->createDoubleClass($class, $interfaces); - $reflection = new ReflectionClass($classname); - - if (null !== $args) { - return $reflection->newInstanceArgs($args); - } - if ((null === $constructor = $reflection->getConstructor()) - || ($constructor->isPublic() && !$constructor->isFinal())) { - return $reflection->newInstance(); - } - - if (!$this->instantiator) { - $this->instantiator = new Instantiator(); - } - - return $this->instantiator->instantiate($classname); - } - - /** - * Creates double class and returns its FQN. - * - * @param ReflectionClass $class - * @param ReflectionClass[] $interfaces - * - * @return string - */ - protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) - { - $name = $this->namer->name($class, $interfaces); - $node = $this->mirror->reflect($class, $interfaces); - - foreach ($this->patches as $patch) { - if ($patch->supports($node)) { - $patch->apply($node); - } - } - - $this->creator->create($name, $node); - - return $name; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php deleted file mode 100644 index b213ee2..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php +++ /dev/null @@ -1,117 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator; - -/** - * Class code creator. - * Generates PHP code for specific class node tree. - * - * @author Konstantin Kudryashov - */ -class ClassCodeGenerator -{ - /** - * @var TypeHintReference - */ - private $typeHintReference; - - public function __construct(TypeHintReference $typeHintReference = null) - { - $this->typeHintReference = $typeHintReference ?: new TypeHintReference(); - } - - /** - * Generates PHP code for class node. - * - * @param string $classname - * @param Node\ClassNode $class - * - * @return string - */ - public function generate($classname, Node\ClassNode $class) - { - $parts = explode('\\', $classname); - $classname = array_pop($parts); - $namespace = implode('\\', $parts); - - $code = sprintf("class %s extends \%s implements %s {\n", - $classname, $class->getParentClass(), implode(', ', - array_map(function ($interface) {return '\\'.$interface;}, $class->getInterfaces()) - ) - ); - - foreach ($class->getProperties() as $name => $visibility) { - $code .= sprintf("%s \$%s;\n", $visibility, $name); - } - $code .= "\n"; - - foreach ($class->getMethods() as $method) { - $code .= $this->generateMethod($method)."\n"; - } - $code .= "\n}"; - - return sprintf("namespace %s {\n%s\n}", $namespace, $code); - } - - private function generateMethod(Node\MethodNode $method) - { - $php = sprintf("%s %s function %s%s(%s)%s {\n", - $method->getVisibility(), - $method->isStatic() ? 'static' : '', - $method->returnsReference() ? '&':'', - $method->getName(), - implode(', ', $this->generateArguments($method->getArguments())), - $this->getReturnType($method) - ); - $php .= $method->getCode()."\n"; - - return $php.'}'; - } - - /** - * @return string - */ - private function getReturnType(Node\MethodNode $method) - { - if ($method->hasReturnType()) { - return $method->hasNullableReturnType() - ? sprintf(': ?%s', $method->getReturnType()) - : sprintf(': %s', $method->getReturnType()); - } - - return ''; - } - - private function generateArguments(array $arguments) - { - $typeHintReference = $this->typeHintReference; - return array_map(function (Node\ArgumentNode $argument) use ($typeHintReference) { - $php = $argument->isNullable() ? '?' : ''; - - if ($hint = $argument->getTypeHint()) { - $php .= $typeHintReference->isBuiltInParamTypeHint($hint) ? $hint : '\\'.$hint; - } - - $php .= ' '.($argument->isPassedByReference() ? '&' : ''); - - $php .= $argument->isVariadic() ? '...' : ''; - - $php .= '$'.$argument->getName(); - - if ($argument->isOptional() && !$argument->isVariadic()) { - $php .= ' = '.var_export($argument->getDefault(), true); - } - - return $php; - }, $arguments); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php deleted file mode 100644 index 882a4a4..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php +++ /dev/null @@ -1,67 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator; - -use Prophecy\Exception\Doubler\ClassCreatorException; - -/** - * Class creator. - * Creates specific class in current environment. - * - * @author Konstantin Kudryashov - */ -class ClassCreator -{ - private $generator; - - /** - * Initializes creator. - * - * @param ClassCodeGenerator $generator - */ - public function __construct(ClassCodeGenerator $generator = null) - { - $this->generator = $generator ?: new ClassCodeGenerator; - } - - /** - * Creates class. - * - * @param string $classname - * @param Node\ClassNode $class - * - * @return mixed - * - * @throws \Prophecy\Exception\Doubler\ClassCreatorException - */ - public function create($classname, Node\ClassNode $class) - { - $code = $this->generator->generate($classname, $class); - $return = eval($code); - - if (!class_exists($classname, false)) { - if (count($class->getInterfaces())) { - throw new ClassCreatorException(sprintf( - 'Could not double `%s` and implement interfaces: [%s].', - $class->getParentClass(), implode(', ', $class->getInterfaces()) - ), $class); - } - - throw new ClassCreatorException( - sprintf('Could not double `%s`.', $class->getParentClass()), - $class - ); - } - - return $return; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php deleted file mode 100644 index 593b69b..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php +++ /dev/null @@ -1,253 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator; - -use Prophecy\Exception\InvalidArgumentException; -use Prophecy\Exception\Doubler\ClassMirrorException; -use ReflectionClass; -use ReflectionMethod; -use ReflectionNamedType; -use ReflectionParameter; - -/** - * Class mirror. - * Core doubler class. Mirrors specific class and/or interfaces into class node tree. - * - * @author Konstantin Kudryashov - */ -class ClassMirror -{ - private static $reflectableMethods = array( - '__construct', - '__destruct', - '__sleep', - '__wakeup', - '__toString', - '__call', - '__invoke' - ); - - /** - * Reflects provided arguments into class node. - * - * @param ReflectionClass|null $class - * @param ReflectionClass[] $interfaces - * - * @return Node\ClassNode - * - */ - public function reflect(?ReflectionClass $class, array $interfaces) - { - $node = new Node\ClassNode; - - if (null !== $class) { - if (true === $class->isInterface()) { - throw new InvalidArgumentException(sprintf( - "Could not reflect %s as a class, because it\n". - "is interface - use the second argument instead.", - $class->getName() - )); - } - - $this->reflectClassToNode($class, $node); - } - - foreach ($interfaces as $interface) { - if (!$interface instanceof ReflectionClass) { - throw new InvalidArgumentException(sprintf( - "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n". - "a second argument to `ClassMirror::reflect(...)`, but got %s.", - is_object($interface) ? get_class($interface).' class' : gettype($interface) - )); - } - if (false === $interface->isInterface()) { - throw new InvalidArgumentException(sprintf( - "Could not reflect %s as an interface, because it\n". - "is class - use the first argument instead.", - $interface->getName() - )); - } - - $this->reflectInterfaceToNode($interface, $node); - } - - $node->addInterface('Prophecy\Doubler\Generator\ReflectionInterface'); - - return $node; - } - - private function reflectClassToNode(ReflectionClass $class, Node\ClassNode $node) - { - if (true === $class->isFinal()) { - throw new ClassMirrorException(sprintf( - 'Could not reflect class %s as it is marked final.', $class->getName() - ), $class); - } - - $node->setParentClass($class->getName()); - - foreach ($class->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) { - if (false === $method->isProtected()) { - continue; - } - - $this->reflectMethodToNode($method, $node); - } - - foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { - if (0 === strpos($method->getName(), '_') - && !in_array($method->getName(), self::$reflectableMethods)) { - continue; - } - - if (true === $method->isFinal()) { - $node->addUnextendableMethod($method->getName()); - continue; - } - - $this->reflectMethodToNode($method, $node); - } - } - - private function reflectInterfaceToNode(ReflectionClass $interface, Node\ClassNode $node) - { - $node->addInterface($interface->getName()); - - foreach ($interface->getMethods() as $method) { - $this->reflectMethodToNode($method, $node); - } - } - - private function reflectMethodToNode(ReflectionMethod $method, Node\ClassNode $classNode) - { - $node = new Node\MethodNode($method->getName()); - - if (true === $method->isProtected()) { - $node->setVisibility('protected'); - } - - if (true === $method->isStatic()) { - $node->setStatic(); - } - - if (true === $method->returnsReference()) { - $node->setReturnsReference(); - } - - if ($method->hasReturnType()) { - $returnType = $method->getReturnType()->getName(); - $returnTypeLower = strtolower($returnType); - - if ('self' === $returnTypeLower) { - $returnType = $method->getDeclaringClass()->getName(); - } - if ('parent' === $returnTypeLower) { - $returnType = $method->getDeclaringClass()->getParentClass()->getName(); - } - - $node->setReturnType($returnType); - - if ($method->getReturnType()->allowsNull()) { - $node->setNullableReturnType(true); - } - } - - if (is_array($params = $method->getParameters()) && count($params)) { - foreach ($params as $param) { - $this->reflectArgumentToNode($param, $node); - } - } - - $classNode->addMethod($node); - } - - private function reflectArgumentToNode(ReflectionParameter $parameter, Node\MethodNode $methodNode) - { - $name = $parameter->getName() == '...' ? '__dot_dot_dot__' : $parameter->getName(); - $node = new Node\ArgumentNode($name); - - $node->setTypeHint($this->getTypeHint($parameter)); - - if ($parameter->isVariadic()) { - $node->setAsVariadic(); - } - - if ($this->hasDefaultValue($parameter)) { - $node->setDefault($this->getDefaultValue($parameter)); - } - - if ($parameter->isPassedByReference()) { - $node->setAsPassedByReference(); - } - - $node->setAsNullable($this->isNullable($parameter)); - - $methodNode->addArgument($node); - } - - private function hasDefaultValue(ReflectionParameter $parameter) - { - if ($parameter->isVariadic()) { - return false; - } - - if ($parameter->isDefaultValueAvailable()) { - return true; - } - - return $parameter->isOptional() || $this->isNullable($parameter); - } - - private function getDefaultValue(ReflectionParameter $parameter) - { - if (!$parameter->isDefaultValueAvailable()) { - return null; - } - - return $parameter->getDefaultValue(); - } - - private function getTypeHint(ReflectionParameter $parameter) - { - if (null !== $className = $this->getParameterClassName($parameter)) { - return $className; - } - - if (true === $parameter->hasType()) { - return $parameter->getType()->getName(); - } - - return null; - } - - private function isNullable(ReflectionParameter $parameter) - { - return $parameter->allowsNull() && null !== $this->getTypeHint($parameter); - } - - private function getParameterClassName(ReflectionParameter $parameter) - { - $type = $parameter->getType(); - if (!$type) { - return null; - } - if ($type instanceof ReflectionNamedType && !$type->isBuiltin()) { - if ($type->getName() === 'self') { - return $parameter->getDeclaringClass()->getName(); - } - - return $type->getName(); - } - - return null; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php deleted file mode 100644 index 0175972..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php +++ /dev/null @@ -1,102 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator\Node; - -/** - * Argument node. - * - * @author Konstantin Kudryashov - */ -class ArgumentNode -{ - private $name; - private $typeHint; - private $default; - private $optional = false; - private $byReference = false; - private $isVariadic = false; - private $isNullable = false; - - /** - * @param string $name - */ - public function __construct($name) - { - $this->name = $name; - } - - public function getName() - { - return $this->name; - } - - public function getTypeHint() - { - return $this->typeHint; - } - - public function setTypeHint($typeHint = null) - { - $this->typeHint = $typeHint; - } - - public function hasDefault() - { - return $this->isOptional() && !$this->isVariadic(); - } - - public function getDefault() - { - return $this->default; - } - - public function setDefault($default = null) - { - $this->optional = true; - $this->default = $default; - } - - public function isOptional() - { - return $this->optional; - } - - public function setAsPassedByReference($byReference = true) - { - $this->byReference = $byReference; - } - - public function isPassedByReference() - { - return $this->byReference; - } - - public function setAsVariadic($isVariadic = true) - { - $this->isVariadic = $isVariadic; - } - - public function isVariadic() - { - return $this->isVariadic; - } - - public function isNullable() - { - return $this->isNullable && $this->typeHint !== 'mixed'; - } - - public function setAsNullable($isNullable = true) - { - $this->isNullable = $isNullable; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php deleted file mode 100644 index f7bd285..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php +++ /dev/null @@ -1,169 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator\Node; - -use Prophecy\Exception\Doubler\MethodNotExtendableException; -use Prophecy\Exception\InvalidArgumentException; - -/** - * Class node. - * - * @author Konstantin Kudryashov - */ -class ClassNode -{ - private $parentClass = 'stdClass'; - private $interfaces = array(); - private $properties = array(); - private $unextendableMethods = array(); - - /** - * @var MethodNode[] - */ - private $methods = array(); - - public function getParentClass() - { - return $this->parentClass; - } - - /** - * @param string $class - */ - public function setParentClass($class) - { - $this->parentClass = $class ?: 'stdClass'; - } - - /** - * @return string[] - */ - public function getInterfaces() - { - return $this->interfaces; - } - - /** - * @param string $interface - */ - public function addInterface($interface) - { - if ($this->hasInterface($interface)) { - return; - } - - array_unshift($this->interfaces, $interface); - } - - /** - * @param string $interface - * - * @return bool - */ - public function hasInterface($interface) - { - return in_array($interface, $this->interfaces); - } - - public function getProperties() - { - return $this->properties; - } - - public function addProperty($name, $visibility = 'public') - { - $visibility = strtolower($visibility); - - if (!in_array($visibility, array('public', 'private', 'protected'))) { - throw new InvalidArgumentException(sprintf( - '`%s` property visibility is not supported.', $visibility - )); - } - - $this->properties[$name] = $visibility; - } - - /** - * @return MethodNode[] - */ - public function getMethods() - { - return $this->methods; - } - - public function addMethod(MethodNode $method, $force = false) - { - if (!$this->isExtendable($method->getName())){ - $message = sprintf( - 'Method `%s` is not extendable, so can not be added.', $method->getName() - ); - throw new MethodNotExtendableException($message, $this->getParentClass(), $method->getName()); - } - - if ($force || !isset($this->methods[$method->getName()])) { - $this->methods[$method->getName()] = $method; - } - } - - public function removeMethod($name) - { - unset($this->methods[$name]); - } - - /** - * @param string $name - * - * @return MethodNode|null - */ - public function getMethod($name) - { - return $this->hasMethod($name) ? $this->methods[$name] : null; - } - - /** - * @param string $name - * - * @return bool - */ - public function hasMethod($name) - { - return isset($this->methods[$name]); - } - - /** - * @return string[] - */ - public function getUnextendableMethods() - { - return $this->unextendableMethods; - } - - /** - * @param string $unextendableMethod - */ - public function addUnextendableMethod($unextendableMethod) - { - if (!$this->isExtendable($unextendableMethod)){ - return; - } - $this->unextendableMethods[] = $unextendableMethod; - } - - /** - * @param string $method - * @return bool - */ - public function isExtendable($method) - { - return !in_array($method, $this->unextendableMethods); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php deleted file mode 100644 index c74b483..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php +++ /dev/null @@ -1,198 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator\Node; - -use Prophecy\Doubler\Generator\TypeHintReference; -use Prophecy\Exception\InvalidArgumentException; - -/** - * Method node. - * - * @author Konstantin Kudryashov - */ -class MethodNode -{ - private $name; - private $code; - private $visibility = 'public'; - private $static = false; - private $returnsReference = false; - private $returnType; - private $nullableReturnType = false; - - /** - * @var ArgumentNode[] - */ - private $arguments = array(); - - /** - * @var TypeHintReference - */ - private $typeHintReference; - - /** - * @param string $name - * @param string $code - */ - public function __construct($name, $code = null, TypeHintReference $typeHintReference = null) - { - $this->name = $name; - $this->code = $code; - $this->typeHintReference = $typeHintReference ?: new TypeHintReference(); - } - - public function getVisibility() - { - return $this->visibility; - } - - /** - * @param string $visibility - */ - public function setVisibility($visibility) - { - $visibility = strtolower($visibility); - - if (!in_array($visibility, array('public', 'private', 'protected'))) { - throw new InvalidArgumentException(sprintf( - '`%s` method visibility is not supported.', $visibility - )); - } - - $this->visibility = $visibility; - } - - public function isStatic() - { - return $this->static; - } - - public function setStatic($static = true) - { - $this->static = (bool) $static; - } - - public function returnsReference() - { - return $this->returnsReference; - } - - public function setReturnsReference() - { - $this->returnsReference = true; - } - - public function getName() - { - return $this->name; - } - - public function addArgument(ArgumentNode $argument) - { - $this->arguments[] = $argument; - } - - /** - * @return ArgumentNode[] - */ - public function getArguments() - { - return $this->arguments; - } - - public function hasReturnType() - { - return null !== $this->returnType; - } - - /** - * @param string $type - */ - public function setReturnType($type = null) - { - if ($type === '' || $type === null) { - $this->returnType = null; - return; - } - $typeMap = array( - 'double' => 'float', - 'real' => 'float', - 'boolean' => 'bool', - 'integer' => 'int', - ); - if (isset($typeMap[$type])) { - $type = $typeMap[$type]; - } - $this->returnType = $this->typeHintReference->isBuiltInReturnTypeHint($type) ? - $type : - '\\' . ltrim($type, '\\'); - } - - public function getReturnType() - { - return $this->returnType; - } - - /** - * @param bool $bool - */ - public function setNullableReturnType($bool = true) - { - $this->nullableReturnType = (bool) $bool; - } - - /** - * @return bool - */ - public function hasNullableReturnType() - { - return $this->nullableReturnType; - } - - /** - * @param string $code - */ - public function setCode($code) - { - $this->code = $code; - } - - public function getCode() - { - if ($this->returnsReference) - { - return "throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), '{$this->name}');"; - } - - return (string) $this->code; - } - - public function useParentCode() - { - $this->code = sprintf( - 'return parent::%s(%s);', $this->getName(), implode(', ', - array_map(array($this, 'generateArgument'), $this->arguments) - ) - ); - } - - private function generateArgument(ArgumentNode $arg) - { - $argument = '$'.$arg->getName(); - - if ($arg->isVariadic()) { - $argument = '...'.$argument; - } - - return $argument; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php deleted file mode 100644 index d720b15..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php +++ /dev/null @@ -1,22 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator; - -/** - * Reflection interface. - * All reflected classes implement this interface. - * - * @author Konstantin Kudryashov - */ -interface ReflectionInterface -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php deleted file mode 100644 index af7d41d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php +++ /dev/null @@ -1,41 +0,0 @@ -= 80000; - - default: - return false; - } - } - - public function isBuiltInReturnTypeHint($type) - { - if ($type === 'void') { - return true; - } - - return $this->isBuiltInParamTypeHint($type); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php deleted file mode 100644 index 8a99c4c..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php +++ /dev/null @@ -1,127 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler; - -use Prophecy\Exception\Doubler\DoubleException; -use Prophecy\Exception\Doubler\ClassNotFoundException; -use Prophecy\Exception\Doubler\InterfaceNotFoundException; -use ReflectionClass; - -/** - * Lazy double. - * Gives simple interface to describe double before creating it. - * - * @author Konstantin Kudryashov - */ -class LazyDouble -{ - private $doubler; - private $class; - private $interfaces = array(); - private $arguments = null; - private $double; - - /** - * Initializes lazy double. - * - * @param Doubler $doubler - */ - public function __construct(Doubler $doubler) - { - $this->doubler = $doubler; - } - - /** - * Tells doubler to use specific class as parent one for double. - * - * @param string|ReflectionClass $class - * - * @throws \Prophecy\Exception\Doubler\ClassNotFoundException - * @throws \Prophecy\Exception\Doubler\DoubleException - */ - public function setParentClass($class) - { - if (null !== $this->double) { - throw new DoubleException('Can not extend class with already instantiated double.'); - } - - if (!$class instanceof ReflectionClass) { - if (!class_exists($class)) { - throw new ClassNotFoundException(sprintf('Class %s not found.', $class), $class); - } - - $class = new ReflectionClass($class); - } - - $this->class = $class; - } - - /** - * Tells doubler to implement specific interface with double. - * - * @param string|ReflectionClass $interface - * - * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException - * @throws \Prophecy\Exception\Doubler\DoubleException - */ - public function addInterface($interface) - { - if (null !== $this->double) { - throw new DoubleException( - 'Can not implement interface with already instantiated double.' - ); - } - - if (!$interface instanceof ReflectionClass) { - if (!interface_exists($interface)) { - throw new InterfaceNotFoundException( - sprintf('Interface %s not found.', $interface), - $interface - ); - } - - $interface = new ReflectionClass($interface); - } - - $this->interfaces[] = $interface; - } - - /** - * Sets constructor arguments. - * - * @param array $arguments - */ - public function setArguments(array $arguments = null) - { - $this->arguments = $arguments; - } - - /** - * Creates double instance or returns already created one. - * - * @return DoubleInterface - */ - public function getInstance() - { - if (null === $this->double) { - if (null !== $this->arguments) { - return $this->double = $this->doubler->double( - $this->class, $this->interfaces, $this->arguments - ); - } - - $this->double = $this->doubler->double($this->class, $this->interfaces); - } - - return $this->double; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php deleted file mode 100644 index d67ec6a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php +++ /dev/null @@ -1,52 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler; - -use ReflectionClass; - -/** - * Name generator. - * Generates classname for double. - * - * @author Konstantin Kudryashov - */ -class NameGenerator -{ - private static $counter = 1; - - /** - * Generates name. - * - * @param ReflectionClass $class - * @param ReflectionClass[] $interfaces - * - * @return string - */ - public function name(ReflectionClass $class = null, array $interfaces) - { - $parts = array(); - - if (null !== $class) { - $parts[] = $class->getName(); - } else { - foreach ($interfaces as $interface) { - $parts[] = $interface->getShortName(); - } - } - - if (!count($parts)) { - $parts[] = 'stdClass'; - } - - return sprintf('Double\%s\P%d', implode('\\', $parts), self::$counter++); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php deleted file mode 100644 index 48ed225..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php +++ /dev/null @@ -1,40 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Call; - -use Prophecy\Exception\Prophecy\ObjectProphecyException; -use Prophecy\Prophecy\ObjectProphecy; - -class UnexpectedCallException extends ObjectProphecyException -{ - private $methodName; - private $arguments; - - public function __construct($message, ObjectProphecy $objectProphecy, - $methodName, array $arguments) - { - parent::__construct($message, $objectProphecy); - - $this->methodName = $methodName; - $this->arguments = $arguments; - } - - public function getMethodName() - { - return $this->methodName; - } - - public function getArguments() - { - return $this->arguments; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php deleted file mode 100644 index 822918a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -use Prophecy\Doubler\Generator\Node\ClassNode; - -class ClassCreatorException extends \RuntimeException implements DoublerException -{ - private $node; - - public function __construct($message, ClassNode $node) - { - parent::__construct($message); - - $this->node = $node; - } - - public function getClassNode() - { - return $this->node; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php deleted file mode 100644 index 8fc53b8..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -use ReflectionClass; - -class ClassMirrorException extends \RuntimeException implements DoublerException -{ - private $class; - - public function __construct($message, ReflectionClass $class) - { - parent::__construct($message); - - $this->class = $class; - } - - public function getReflectedClass() - { - return $this->class; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php deleted file mode 100644 index 5bc826d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php +++ /dev/null @@ -1,33 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -class ClassNotFoundException extends DoubleException -{ - private $classname; - - /** - * @param string $message - * @param string $classname - */ - public function __construct($message, $classname) - { - parent::__construct($message); - - $this->classname = $classname; - } - - public function getClassname() - { - return $this->classname; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php deleted file mode 100644 index 6642a58..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php +++ /dev/null @@ -1,18 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -use RuntimeException; - -class DoubleException extends RuntimeException implements DoublerException -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php deleted file mode 100644 index 9d6be17..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php +++ /dev/null @@ -1,18 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -use Prophecy\Exception\Exception; - -interface DoublerException extends Exception -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php deleted file mode 100644 index e344dea..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -class InterfaceNotFoundException extends ClassNotFoundException -{ - public function getInterfaceName() - { - return $this->getClassname(); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php deleted file mode 100644 index 56f47b1..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php +++ /dev/null @@ -1,41 +0,0 @@ -methodName = $methodName; - $this->className = $className; - } - - - /** - * @return string - */ - public function getMethodName() - { - return $this->methodName; - } - - /** - * @return string - */ - public function getClassName() - { - return $this->className; - } - - } diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php deleted file mode 100644 index a538349..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php +++ /dev/null @@ -1,60 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -class MethodNotFoundException extends DoubleException -{ - /** - * @var string|object - */ - private $classname; - - /** - * @var string - */ - private $methodName; - - /** - * @var array - */ - private $arguments; - - /** - * @param string $message - * @param string|object $classname - * @param string $methodName - * @param null|Argument\ArgumentsWildcard|array $arguments - */ - public function __construct($message, $classname, $methodName, $arguments = null) - { - parent::__construct($message); - - $this->classname = $classname; - $this->methodName = $methodName; - $this->arguments = $arguments; - } - - public function getClassname() - { - return $this->classname; - } - - public function getMethodName() - { - return $this->methodName; - } - - public function getArguments() - { - return $this->arguments; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php deleted file mode 100644 index 6303049..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php +++ /dev/null @@ -1,41 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -class ReturnByReferenceException extends DoubleException -{ - private $classname; - private $methodName; - - /** - * @param string $message - * @param string $classname - * @param string $methodName - */ - public function __construct($message, $classname, $methodName) - { - parent::__construct($message); - - $this->classname = $classname; - $this->methodName = $methodName; - } - - public function getClassname() - { - return $this->classname; - } - - public function getMethodName() - { - return $this->methodName; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php deleted file mode 100644 index ac9fe4d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php +++ /dev/null @@ -1,26 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception; - -/** - * Core Prophecy exception interface. - * All Prophecy exceptions implement it. - * - * @author Konstantin Kudryashov - */ -interface Exception -{ - /** - * @return string - */ - public function getMessage(); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php deleted file mode 100644 index bc91c69..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception; - -class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php deleted file mode 100644 index a00dfb0..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php +++ /dev/null @@ -1,51 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use Prophecy\Prophecy\ObjectProphecy; - -class AggregateException extends \RuntimeException implements PredictionException -{ - private $exceptions = array(); - private $objectProphecy; - - public function append(PredictionException $exception) - { - $message = $exception->getMessage(); - $message = strtr($message, array("\n" => "\n "))."\n"; - $message = empty($this->exceptions) ? $message : "\n" . $message; - - $this->message = rtrim($this->message.$message); - $this->exceptions[] = $exception; - } - - /** - * @return PredictionException[] - */ - public function getExceptions() - { - return $this->exceptions; - } - - public function setObjectProphecy(ObjectProphecy $objectProphecy) - { - $this->objectProphecy = $objectProphecy; - } - - /** - * @return ObjectProphecy - */ - public function getObjectProphecy() - { - return $this->objectProphecy; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php deleted file mode 100644 index bbbbc3d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php +++ /dev/null @@ -1,24 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use RuntimeException; - -/** - * Basic failed prediction exception. - * Use it for custom prediction failures. - * - * @author Konstantin Kudryashov - */ -class FailedPredictionException extends RuntimeException implements PredictionException -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php deleted file mode 100644 index 05ea4aa..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php +++ /dev/null @@ -1,18 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use Prophecy\Exception\Prophecy\MethodProphecyException; - -class NoCallsException extends MethodProphecyException implements PredictionException -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php deleted file mode 100644 index 2596b1e..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php +++ /dev/null @@ -1,18 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use Prophecy\Exception\Exception; - -interface PredictionException extends Exception -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php deleted file mode 100644 index 9d90543..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use Prophecy\Prophecy\MethodProphecy; - -class UnexpectedCallsCountException extends UnexpectedCallsException -{ - private $expectedCount; - - public function __construct($message, MethodProphecy $methodProphecy, $count, array $calls) - { - parent::__construct($message, $methodProphecy, $calls); - - $this->expectedCount = intval($count); - } - - public function getExpectedCount() - { - return $this->expectedCount; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php deleted file mode 100644 index 7a99c2d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php +++ /dev/null @@ -1,32 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Exception\Prophecy\MethodProphecyException; - -class UnexpectedCallsException extends MethodProphecyException implements PredictionException -{ - private $calls = array(); - - public function __construct($message, MethodProphecy $methodProphecy, array $calls) - { - parent::__construct($message, $methodProphecy); - - $this->calls = $calls; - } - - public function getCalls() - { - return $this->calls; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php deleted file mode 100644 index 1b03eaf..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php +++ /dev/null @@ -1,34 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prophecy; - -use Prophecy\Prophecy\MethodProphecy; - -class MethodProphecyException extends ObjectProphecyException -{ - private $methodProphecy; - - public function __construct($message, MethodProphecy $methodProphecy) - { - parent::__construct($message, $methodProphecy->getObjectProphecy()); - - $this->methodProphecy = $methodProphecy; - } - - /** - * @return MethodProphecy - */ - public function getMethodProphecy() - { - return $this->methodProphecy; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php deleted file mode 100644 index e345402..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php +++ /dev/null @@ -1,34 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prophecy; - -use Prophecy\Prophecy\ObjectProphecy; - -class ObjectProphecyException extends \RuntimeException implements ProphecyException -{ - private $objectProphecy; - - public function __construct($message, ObjectProphecy $objectProphecy) - { - parent::__construct($message); - - $this->objectProphecy = $objectProphecy; - } - - /** - * @return ObjectProphecy - */ - public function getObjectProphecy() - { - return $this->objectProphecy; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php deleted file mode 100644 index 9157332..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php +++ /dev/null @@ -1,18 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prophecy; - -use Prophecy\Exception\Exception; - -interface ProphecyException extends Exception -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php deleted file mode 100644 index 209821c..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php +++ /dev/null @@ -1,69 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\PhpDocumentor; - -use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; -use phpDocumentor\Reflection\DocBlock\Tags\Method; - -/** - * @author Théo FIDRY - * - * @internal - */ -final class ClassAndInterfaceTagRetriever implements MethodTagRetrieverInterface -{ - private $classRetriever; - - public function __construct(MethodTagRetrieverInterface $classRetriever = null) - { - if (null !== $classRetriever) { - $this->classRetriever = $classRetriever; - - return; - } - - $this->classRetriever = class_exists('phpDocumentor\Reflection\DocBlockFactory') && class_exists('phpDocumentor\Reflection\Types\ContextFactory') - ? new ClassTagRetriever() - : new LegacyClassTagRetriever() - ; - } - - /** - * @param \ReflectionClass $reflectionClass - * - * @return LegacyMethodTag[]|Method[] - */ - public function getTagList(\ReflectionClass $reflectionClass) - { - return array_merge( - $this->classRetriever->getTagList($reflectionClass), - $this->getInterfacesTagList($reflectionClass) - ); - } - - /** - * @param \ReflectionClass $reflectionClass - * - * @return LegacyMethodTag[]|Method[] - */ - private function getInterfacesTagList(\ReflectionClass $reflectionClass) - { - $interfaces = $reflectionClass->getInterfaces(); - $tagList = array(); - - foreach($interfaces as $interface) { - $tagList = array_merge($tagList, $this->classRetriever->getTagList($interface)); - } - - return $tagList; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php deleted file mode 100644 index 9817a44..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php +++ /dev/null @@ -1,60 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\PhpDocumentor; - -use phpDocumentor\Reflection\DocBlock\Tags\Method; -use phpDocumentor\Reflection\DocBlockFactory; -use phpDocumentor\Reflection\Types\ContextFactory; - -/** - * @author Théo FIDRY - * - * @internal - */ -final class ClassTagRetriever implements MethodTagRetrieverInterface -{ - private $docBlockFactory; - private $contextFactory; - - public function __construct() - { - $this->docBlockFactory = DocBlockFactory::createInstance(); - $this->contextFactory = new ContextFactory(); - } - - /** - * @param \ReflectionClass $reflectionClass - * - * @return Method[] - */ - public function getTagList(\ReflectionClass $reflectionClass) - { - try { - $phpdoc = $this->docBlockFactory->create( - $reflectionClass, - $this->contextFactory->createFromReflector($reflectionClass) - ); - - $methods = array(); - - foreach ($phpdoc->getTagsByName('method') as $tag) { - if ($tag instanceof Method) { - $methods[] = $tag; - } - } - - return $methods; - } catch (\InvalidArgumentException $e) { - return array(); - } - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php deleted file mode 100644 index c0dec3d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php +++ /dev/null @@ -1,35 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\PhpDocumentor; - -use phpDocumentor\Reflection\DocBlock; -use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; - -/** - * @author Théo FIDRY - * - * @internal - */ -final class LegacyClassTagRetriever implements MethodTagRetrieverInterface -{ - /** - * @param \ReflectionClass $reflectionClass - * - * @return LegacyMethodTag[] - */ - public function getTagList(\ReflectionClass $reflectionClass) - { - $phpdoc = new DocBlock($reflectionClass->getDocComment()); - - return $phpdoc->getTagsByName('method'); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php deleted file mode 100644 index d3989da..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\PhpDocumentor; - -use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; -use phpDocumentor\Reflection\DocBlock\Tags\Method; - -/** - * @author Théo FIDRY - * - * @internal - */ -interface MethodTagRetrieverInterface -{ - /** - * @param \ReflectionClass $reflectionClass - * - * @return LegacyMethodTag[]|Method[] - */ - public function getTagList(\ReflectionClass $reflectionClass); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php deleted file mode 100644 index b478736..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php +++ /dev/null @@ -1,86 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prediction; - -use Prophecy\Call\Call; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Argument\ArgumentsWildcard; -use Prophecy\Argument\Token\AnyValuesToken; -use Prophecy\Util\StringUtil; -use Prophecy\Exception\Prediction\NoCallsException; - -/** - * Call prediction. - * - * @author Konstantin Kudryashov - */ -class CallPrediction implements PredictionInterface -{ - private $util; - - /** - * Initializes prediction. - * - * @param StringUtil $util - */ - public function __construct(StringUtil $util = null) - { - $this->util = $util ?: new StringUtil; - } - - /** - * Tests that there was at least one call. - * - * @param Call[] $calls - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @throws \Prophecy\Exception\Prediction\NoCallsException - */ - public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) - { - if (count($calls)) { - return; - } - - $methodCalls = $object->findProphecyMethodCalls( - $method->getMethodName(), - new ArgumentsWildcard(array(new AnyValuesToken)) - ); - - if (count($methodCalls)) { - throw new NoCallsException(sprintf( - "No calls have been made that match:\n". - " %s->%s(%s)\n". - "but expected at least one.\n". - "Recorded `%s(...)` calls:\n%s", - - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard(), - $method->getMethodName(), - $this->util->stringifyCalls($methodCalls) - ), $method); - } - - throw new NoCallsException(sprintf( - "No calls have been made that match:\n". - " %s->%s(%s)\n". - "but expected at least one.", - - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard() - ), $method); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php deleted file mode 100644 index 31c6c57..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php +++ /dev/null @@ -1,107 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prediction; - -use Prophecy\Call\Call; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Argument\ArgumentsWildcard; -use Prophecy\Argument\Token\AnyValuesToken; -use Prophecy\Util\StringUtil; -use Prophecy\Exception\Prediction\UnexpectedCallsCountException; - -/** - * Prediction interface. - * Predictions are logical test blocks, tied to `should...` keyword. - * - * @author Konstantin Kudryashov - */ -class CallTimesPrediction implements PredictionInterface -{ - private $times; - private $util; - - /** - * Initializes prediction. - * - * @param int $times - * @param StringUtil $util - */ - public function __construct($times, StringUtil $util = null) - { - $this->times = intval($times); - $this->util = $util ?: new StringUtil; - } - - /** - * Tests that there was exact amount of calls made. - * - * @param Call[] $calls - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @throws \Prophecy\Exception\Prediction\UnexpectedCallsCountException - */ - public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) - { - if ($this->times == count($calls)) { - return; - } - - $methodCalls = $object->findProphecyMethodCalls( - $method->getMethodName(), - new ArgumentsWildcard(array(new AnyValuesToken)) - ); - - if (count($calls)) { - $message = sprintf( - "Expected exactly %d calls that match:\n". - " %s->%s(%s)\n". - "but %d were made:\n%s", - - $this->times, - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard(), - count($calls), - $this->util->stringifyCalls($calls) - ); - } elseif (count($methodCalls)) { - $message = sprintf( - "Expected exactly %d calls that match:\n". - " %s->%s(%s)\n". - "but none were made.\n". - "Recorded `%s(...)` calls:\n%s", - - $this->times, - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard(), - $method->getMethodName(), - $this->util->stringifyCalls($methodCalls) - ); - } else { - $message = sprintf( - "Expected exactly %d calls that match:\n". - " %s->%s(%s)\n". - "but none were made.", - - $this->times, - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard() - ); - } - - throw new UnexpectedCallsCountException($message, $method, $this->times, $calls); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php deleted file mode 100644 index 44bc782..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php +++ /dev/null @@ -1,65 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prediction; - -use Prophecy\Call\Call; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Exception\InvalidArgumentException; -use Closure; - -/** - * Callback prediction. - * - * @author Konstantin Kudryashov - */ -class CallbackPrediction implements PredictionInterface -{ - private $callback; - - /** - * Initializes callback prediction. - * - * @param callable $callback Custom callback - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function __construct($callback) - { - if (!is_callable($callback)) { - throw new InvalidArgumentException(sprintf( - 'Callable expected as an argument to CallbackPrediction, but got %s.', - gettype($callback) - )); - } - - $this->callback = $callback; - } - - /** - * Executes preset callback. - * - * @param Call[] $calls - * @param ObjectProphecy $object - * @param MethodProphecy $method - */ - public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) - { - $callback = $this->callback; - - if ($callback instanceof Closure && method_exists('Closure', 'bind')) { - $callback = Closure::bind($callback, $object); - } - - call_user_func($callback, $calls, $object, $method); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php deleted file mode 100644 index 46ac5bf..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php +++ /dev/null @@ -1,68 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prediction; - -use Prophecy\Call\Call; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Util\StringUtil; -use Prophecy\Exception\Prediction\UnexpectedCallsException; - -/** - * No calls prediction. - * - * @author Konstantin Kudryashov - */ -class NoCallsPrediction implements PredictionInterface -{ - private $util; - - /** - * Initializes prediction. - * - * @param null|StringUtil $util - */ - public function __construct(StringUtil $util = null) - { - $this->util = $util ?: new StringUtil; - } - - /** - * Tests that there were no calls made. - * - * @param Call[] $calls - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @throws \Prophecy\Exception\Prediction\UnexpectedCallsException - */ - public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) - { - if (!count($calls)) { - return; - } - - $verb = count($calls) === 1 ? 'was' : 'were'; - - throw new UnexpectedCallsException(sprintf( - "No calls expected that match:\n". - " %s->%s(%s)\n". - "but %d %s made:\n%s", - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard(), - count($calls), - $verb, - $this->util->stringifyCalls($calls) - ), $method, $calls); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php deleted file mode 100644 index f7fb06a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php +++ /dev/null @@ -1,37 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prediction; - -use Prophecy\Call\Call; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; - -/** - * Prediction interface. - * Predictions are logical test blocks, tied to `should...` keyword. - * - * @author Konstantin Kudryashov - */ -interface PredictionInterface -{ - /** - * Tests that double fulfilled prediction. - * - * @param Call[] $calls - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @throws object - * @return void - */ - public function check(array $calls, ObjectProphecy $object, MethodProphecy $method); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php deleted file mode 100644 index 5f406bf..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php +++ /dev/null @@ -1,66 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Promise; - -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Exception\InvalidArgumentException; -use Closure; - -/** - * Callback promise. - * - * @author Konstantin Kudryashov - */ -class CallbackPromise implements PromiseInterface -{ - private $callback; - - /** - * Initializes callback promise. - * - * @param callable $callback Custom callback - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function __construct($callback) - { - if (!is_callable($callback)) { - throw new InvalidArgumentException(sprintf( - 'Callable expected as an argument to CallbackPromise, but got %s.', - gettype($callback) - )); - } - - $this->callback = $callback; - } - - /** - * Evaluates promise callback. - * - * @param array $args - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @return mixed - */ - public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) - { - $callback = $this->callback; - - if ($callback instanceof Closure && method_exists('Closure', 'bind')) { - $callback = Closure::bind($callback, $object); - } - - return call_user_func($callback, $args, $object, $method); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php deleted file mode 100644 index 382537b..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php +++ /dev/null @@ -1,35 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Promise; - -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; - -/** - * Promise interface. - * Promises are logical blocks, tied to `will...` keyword. - * - * @author Konstantin Kudryashov - */ -interface PromiseInterface -{ - /** - * Evaluates promise. - * - * @param array $args - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @return mixed - */ - public function execute(array $args, ObjectProphecy $object, MethodProphecy $method); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php deleted file mode 100644 index 39bfeea..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php +++ /dev/null @@ -1,61 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Promise; - -use Prophecy\Exception\InvalidArgumentException; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; - -/** - * Return argument promise. - * - * @author Konstantin Kudryashov - */ -class ReturnArgumentPromise implements PromiseInterface -{ - /** - * @var int - */ - private $index; - - /** - * Initializes callback promise. - * - * @param int $index The zero-indexed number of the argument to return - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function __construct($index = 0) - { - if (!is_int($index) || $index < 0) { - throw new InvalidArgumentException(sprintf( - 'Zero-based index expected as argument to ReturnArgumentPromise, but got %s.', - $index - )); - } - $this->index = $index; - } - - /** - * Returns nth argument if has one, null otherwise. - * - * @param array $args - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @return null|mixed - */ - public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) - { - return count($args) > $this->index ? $args[$this->index] : null; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php deleted file mode 100644 index c7d5ac5..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php +++ /dev/null @@ -1,55 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Promise; - -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; - -/** - * Return promise. - * - * @author Konstantin Kudryashov - */ -class ReturnPromise implements PromiseInterface -{ - private $returnValues = array(); - - /** - * Initializes promise. - * - * @param array $returnValues Array of values - */ - public function __construct(array $returnValues) - { - $this->returnValues = $returnValues; - } - - /** - * Returns saved values one by one until last one, then continuously returns last value. - * - * @param array $args - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @return mixed - */ - public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) - { - $value = array_shift($this->returnValues); - - if (!count($this->returnValues)) { - $this->returnValues[] = $value; - } - - return $value; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php deleted file mode 100644 index 26ec19e..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php +++ /dev/null @@ -1,100 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Promise; - -use Doctrine\Instantiator\Instantiator; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Exception\InvalidArgumentException; -use ReflectionClass; - -/** - * Throw promise. - * - * @author Konstantin Kudryashov - */ -class ThrowPromise implements PromiseInterface -{ - private $exception; - - /** - * @var \Doctrine\Instantiator\Instantiator - */ - private $instantiator; - - /** - * Initializes promise. - * - * @param string|\Exception|\Throwable $exception Exception class name or instance - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function __construct($exception) - { - if (is_string($exception)) { - if ((!class_exists($exception) && !interface_exists($exception)) || !$this->isAValidThrowable($exception)) { - throw new InvalidArgumentException(sprintf( - 'Exception / Throwable class or instance expected as argument to ThrowPromise, but got %s.', - $exception - )); - } - } elseif (!$exception instanceof \Exception && !$exception instanceof \Throwable) { - throw new InvalidArgumentException(sprintf( - 'Exception / Throwable class or instance expected as argument to ThrowPromise, but got %s.', - is_object($exception) ? get_class($exception) : gettype($exception) - )); - } - - $this->exception = $exception; - } - - /** - * Throws predefined exception. - * - * @param array $args - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @throws object - */ - public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) - { - if (is_string($this->exception)) { - $classname = $this->exception; - $reflection = new ReflectionClass($classname); - $constructor = $reflection->getConstructor(); - - if ($constructor->isPublic() && 0 == $constructor->getNumberOfRequiredParameters()) { - throw $reflection->newInstance(); - } - - if (!$this->instantiator) { - $this->instantiator = new Instantiator(); - } - - throw $this->instantiator->instantiate($classname); - } - - throw $this->exception; - } - - /** - * @param string $exception - * - * @return bool - */ - private function isAValidThrowable($exception) - { - return is_a($exception, 'Exception', true) - || is_a($exception, 'Throwable', true); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php deleted file mode 100644 index 50040fb..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php +++ /dev/null @@ -1,517 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -use Prophecy\Argument; -use Prophecy\Prophet; -use Prophecy\Promise; -use Prophecy\Prediction; -use Prophecy\Exception\Doubler\MethodNotFoundException; -use Prophecy\Exception\InvalidArgumentException; -use Prophecy\Exception\Prophecy\MethodProphecyException; - -/** - * Method prophecy. - * - * @author Konstantin Kudryashov - */ -class MethodProphecy -{ - private $objectProphecy; - private $methodName; - private $argumentsWildcard; - private $promise; - private $prediction; - private $checkedPredictions = array(); - private $bound = false; - private $voidReturnType = false; - - /** - * Initializes method prophecy. - * - * @param ObjectProphecy $objectProphecy - * @param string $methodName - * @param null|Argument\ArgumentsWildcard|array $arguments - * - * @throws \Prophecy\Exception\Doubler\MethodNotFoundException If method not found - */ - public function __construct(ObjectProphecy $objectProphecy, $methodName, $arguments = null) - { - $double = $objectProphecy->reveal(); - if (!method_exists($double, $methodName)) { - throw new MethodNotFoundException(sprintf( - 'Method `%s::%s()` is not defined.', get_class($double), $methodName - ), get_class($double), $methodName, $arguments); - } - - $this->objectProphecy = $objectProphecy; - $this->methodName = $methodName; - - $reflectedMethod = new \ReflectionMethod($double, $methodName); - if ($reflectedMethod->isFinal()) { - throw new MethodProphecyException(sprintf( - "Can not add prophecy for a method `%s::%s()`\n". - "as it is a final method.", - get_class($double), - $methodName - ), $this); - } - - if (null !== $arguments) { - $this->withArguments($arguments); - } - - if (true === $reflectedMethod->hasReturnType()) { - $type = $reflectedMethod->getReturnType()->getName(); - - if ('void' === $type) { - $this->voidReturnType = true; - } - - $this->will(function () use ($type) { - switch ($type) { - case 'void': return; - case 'string': return ''; - case 'float': return 0.0; - case 'int': return 0; - case 'bool': return false; - case 'array': return array(); - - case 'callable': - case 'Closure': - return function () {}; - - case 'Traversable': - case 'Generator': - return (function () { yield; })(); - - default: - $prophet = new Prophet; - return $prophet->prophesize($type)->reveal(); - } - }); - } - } - - /** - * Sets argument wildcard. - * - * @param array|Argument\ArgumentsWildcard $arguments - * - * @return $this - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function withArguments($arguments) - { - if (is_array($arguments)) { - $arguments = new Argument\ArgumentsWildcard($arguments); - } - - if (!$arguments instanceof Argument\ArgumentsWildcard) { - throw new InvalidArgumentException(sprintf( - "Either an array or an instance of ArgumentsWildcard expected as\n". - 'a `MethodProphecy::withArguments()` argument, but got %s.', - gettype($arguments) - )); - } - - $this->argumentsWildcard = $arguments; - - return $this; - } - - /** - * Sets custom promise to the prophecy. - * - * @param callable|Promise\PromiseInterface $promise - * - * @return $this - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function will($promise) - { - if (is_callable($promise)) { - $promise = new Promise\CallbackPromise($promise); - } - - if (!$promise instanceof Promise\PromiseInterface) { - throw new InvalidArgumentException(sprintf( - 'Expected callable or instance of PromiseInterface, but got %s.', - gettype($promise) - )); - } - - $this->bindToObjectProphecy(); - $this->promise = $promise; - - return $this; - } - - /** - * Sets return promise to the prophecy. - * - * @see \Prophecy\Promise\ReturnPromise - * - * @return $this - */ - public function willReturn() - { - if ($this->voidReturnType) { - throw new MethodProphecyException( - "The method \"$this->methodName\" has a void return type, and so cannot return anything", - $this - ); - } - - return $this->will(new Promise\ReturnPromise(func_get_args())); - } - - /** - * @param array $items - * - * @return $this - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function willYield($items) - { - if ($this->voidReturnType) { - throw new MethodProphecyException( - "The method \"$this->methodName\" has a void return type, and so cannot yield anything", - $this - ); - } - - if (!is_array($items)) { - throw new InvalidArgumentException(sprintf( - 'Expected array, but got %s.', - gettype($items) - )); - } - - $generator = function() use ($items) { - foreach ($items as $key => $value) { - yield $key => $value; - } - }; - - return $this->will($generator); - } - - /** - * Sets return argument promise to the prophecy. - * - * @param int $index The zero-indexed number of the argument to return - * - * @see \Prophecy\Promise\ReturnArgumentPromise - * - * @return $this - */ - public function willReturnArgument($index = 0) - { - if ($this->voidReturnType) { - throw new MethodProphecyException("The method \"$this->methodName\" has a void return type", $this); - } - - return $this->will(new Promise\ReturnArgumentPromise($index)); - } - - /** - * Sets throw promise to the prophecy. - * - * @see \Prophecy\Promise\ThrowPromise - * - * @param string|\Exception $exception Exception class or instance - * - * @return $this - */ - public function willThrow($exception) - { - return $this->will(new Promise\ThrowPromise($exception)); - } - - /** - * Sets custom prediction to the prophecy. - * - * @param callable|Prediction\PredictionInterface $prediction - * - * @return $this - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function should($prediction) - { - if (is_callable($prediction)) { - $prediction = new Prediction\CallbackPrediction($prediction); - } - - if (!$prediction instanceof Prediction\PredictionInterface) { - throw new InvalidArgumentException(sprintf( - 'Expected callable or instance of PredictionInterface, but got %s.', - gettype($prediction) - )); - } - - $this->bindToObjectProphecy(); - $this->prediction = $prediction; - - return $this; - } - - /** - * Sets call prediction to the prophecy. - * - * @see \Prophecy\Prediction\CallPrediction - * - * @return $this - */ - public function shouldBeCalled() - { - return $this->should(new Prediction\CallPrediction); - } - - /** - * Sets no calls prediction to the prophecy. - * - * @see \Prophecy\Prediction\NoCallsPrediction - * - * @return $this - */ - public function shouldNotBeCalled() - { - return $this->should(new Prediction\NoCallsPrediction); - } - - /** - * Sets call times prediction to the prophecy. - * - * @see \Prophecy\Prediction\CallTimesPrediction - * - * @param $count - * - * @return $this - */ - public function shouldBeCalledTimes($count) - { - return $this->should(new Prediction\CallTimesPrediction($count)); - } - - /** - * Sets call times prediction to the prophecy. - * - * @see \Prophecy\Prediction\CallTimesPrediction - * - * @return $this - */ - public function shouldBeCalledOnce() - { - return $this->shouldBeCalledTimes(1); - } - - /** - * Checks provided prediction immediately. - * - * @param callable|Prediction\PredictionInterface $prediction - * - * @return $this - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function shouldHave($prediction) - { - if (is_callable($prediction)) { - $prediction = new Prediction\CallbackPrediction($prediction); - } - - if (!$prediction instanceof Prediction\PredictionInterface) { - throw new InvalidArgumentException(sprintf( - 'Expected callable or instance of PredictionInterface, but got %s.', - gettype($prediction) - )); - } - - if (null === $this->promise && !$this->voidReturnType) { - $this->willReturn(); - } - - $calls = $this->getObjectProphecy()->findProphecyMethodCalls( - $this->getMethodName(), - $this->getArgumentsWildcard() - ); - - try { - $prediction->check($calls, $this->getObjectProphecy(), $this); - $this->checkedPredictions[] = $prediction; - } catch (\Exception $e) { - $this->checkedPredictions[] = $prediction; - - throw $e; - } - - return $this; - } - - /** - * Checks call prediction. - * - * @see \Prophecy\Prediction\CallPrediction - * - * @return $this - */ - public function shouldHaveBeenCalled() - { - return $this->shouldHave(new Prediction\CallPrediction); - } - - /** - * Checks no calls prediction. - * - * @see \Prophecy\Prediction\NoCallsPrediction - * - * @return $this - */ - public function shouldNotHaveBeenCalled() - { - return $this->shouldHave(new Prediction\NoCallsPrediction); - } - - /** - * Checks no calls prediction. - * - * @see \Prophecy\Prediction\NoCallsPrediction - * @deprecated - * - * @return $this - */ - public function shouldNotBeenCalled() - { - return $this->shouldNotHaveBeenCalled(); - } - - /** - * Checks call times prediction. - * - * @see \Prophecy\Prediction\CallTimesPrediction - * - * @param int $count - * - * @return $this - */ - public function shouldHaveBeenCalledTimes($count) - { - return $this->shouldHave(new Prediction\CallTimesPrediction($count)); - } - - /** - * Checks call times prediction. - * - * @see \Prophecy\Prediction\CallTimesPrediction - * - * @return $this - */ - public function shouldHaveBeenCalledOnce() - { - return $this->shouldHaveBeenCalledTimes(1); - } - - /** - * Checks currently registered [with should(...)] prediction. - */ - public function checkPrediction() - { - if (null === $this->prediction) { - return; - } - - $this->shouldHave($this->prediction); - } - - /** - * Returns currently registered promise. - * - * @return null|Promise\PromiseInterface - */ - public function getPromise() - { - return $this->promise; - } - - /** - * Returns currently registered prediction. - * - * @return null|Prediction\PredictionInterface - */ - public function getPrediction() - { - return $this->prediction; - } - - /** - * Returns predictions that were checked on this object. - * - * @return Prediction\PredictionInterface[] - */ - public function getCheckedPredictions() - { - return $this->checkedPredictions; - } - - /** - * Returns object prophecy this method prophecy is tied to. - * - * @return ObjectProphecy - */ - public function getObjectProphecy() - { - return $this->objectProphecy; - } - - /** - * Returns method name. - * - * @return string - */ - public function getMethodName() - { - return $this->methodName; - } - - /** - * Returns arguments wildcard. - * - * @return Argument\ArgumentsWildcard - */ - public function getArgumentsWildcard() - { - return $this->argumentsWildcard; - } - - /** - * @return bool - */ - public function hasReturnVoid() - { - return $this->voidReturnType; - } - - private function bindToObjectProphecy() - { - if ($this->bound) { - return; - } - - $this->getObjectProphecy()->addMethodProphecy($this); - $this->bound = true; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php deleted file mode 100644 index 11b87cf..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php +++ /dev/null @@ -1,286 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -use SebastianBergmann\Comparator\ComparisonFailure; -use Prophecy\Comparator\Factory as ComparatorFactory; -use Prophecy\Call\Call; -use Prophecy\Doubler\LazyDouble; -use Prophecy\Argument\ArgumentsWildcard; -use Prophecy\Call\CallCenter; -use Prophecy\Exception\Prophecy\ObjectProphecyException; -use Prophecy\Exception\Prophecy\MethodProphecyException; -use Prophecy\Exception\Prediction\AggregateException; -use Prophecy\Exception\Prediction\PredictionException; - -/** - * Object prophecy. - * - * @author Konstantin Kudryashov - */ -class ObjectProphecy implements ProphecyInterface -{ - private $lazyDouble; - private $callCenter; - private $revealer; - private $comparatorFactory; - - /** - * @var MethodProphecy[][] - */ - private $methodProphecies = array(); - - /** - * Initializes object prophecy. - * - * @param LazyDouble $lazyDouble - * @param CallCenter $callCenter - * @param RevealerInterface $revealer - * @param ComparatorFactory $comparatorFactory - */ - public function __construct( - LazyDouble $lazyDouble, - CallCenter $callCenter = null, - RevealerInterface $revealer = null, - ComparatorFactory $comparatorFactory = null - ) { - $this->lazyDouble = $lazyDouble; - $this->callCenter = $callCenter ?: new CallCenter; - $this->revealer = $revealer ?: new Revealer; - - $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); - } - - /** - * Forces double to extend specific class. - * - * @param string $class - * - * @return $this - */ - public function willExtend($class) - { - $this->lazyDouble->setParentClass($class); - - return $this; - } - - /** - * Forces double to implement specific interface. - * - * @param string $interface - * - * @return $this - */ - public function willImplement($interface) - { - $this->lazyDouble->addInterface($interface); - - return $this; - } - - /** - * Sets constructor arguments. - * - * @param array $arguments - * - * @return $this - */ - public function willBeConstructedWith(array $arguments = null) - { - $this->lazyDouble->setArguments($arguments); - - return $this; - } - - /** - * Reveals double. - * - * @return object - * - * @throws \Prophecy\Exception\Prophecy\ObjectProphecyException If double doesn't implement needed interface - */ - public function reveal() - { - $double = $this->lazyDouble->getInstance(); - - if (null === $double || !$double instanceof ProphecySubjectInterface) { - throw new ObjectProphecyException( - "Generated double must implement ProphecySubjectInterface, but it does not.\n". - 'It seems you have wrongly configured doubler without required ClassPatch.', - $this - ); - } - - $double->setProphecy($this); - - return $double; - } - - /** - * Adds method prophecy to object prophecy. - * - * @param MethodProphecy $methodProphecy - * - * @throws \Prophecy\Exception\Prophecy\MethodProphecyException If method prophecy doesn't - * have arguments wildcard - */ - public function addMethodProphecy(MethodProphecy $methodProphecy) - { - $argumentsWildcard = $methodProphecy->getArgumentsWildcard(); - if (null === $argumentsWildcard) { - throw new MethodProphecyException(sprintf( - "Can not add prophecy for a method `%s::%s()`\n". - "as you did not specify arguments wildcard for it.", - get_class($this->reveal()), - $methodProphecy->getMethodName() - ), $methodProphecy); - } - - $methodName = strtolower($methodProphecy->getMethodName()); - - if (!isset($this->methodProphecies[$methodName])) { - $this->methodProphecies[$methodName] = array(); - } - - $this->methodProphecies[$methodName][] = $methodProphecy; - } - - /** - * Returns either all or related to single method prophecies. - * - * @param null|string $methodName - * - * @return MethodProphecy[] - */ - public function getMethodProphecies($methodName = null) - { - if (null === $methodName) { - return $this->methodProphecies; - } - - $methodName = strtolower($methodName); - - if (!isset($this->methodProphecies[$methodName])) { - return array(); - } - - return $this->methodProphecies[$methodName]; - } - - /** - * Makes specific method call. - * - * @param string $methodName - * @param array $arguments - * - * @return mixed - */ - public function makeProphecyMethodCall($methodName, array $arguments) - { - $arguments = $this->revealer->reveal($arguments); - $return = $this->callCenter->makeCall($this, $methodName, $arguments); - - return $this->revealer->reveal($return); - } - - /** - * Finds calls by method name & arguments wildcard. - * - * @param string $methodName - * @param ArgumentsWildcard $wildcard - * - * @return Call[] - */ - public function findProphecyMethodCalls($methodName, ArgumentsWildcard $wildcard) - { - return $this->callCenter->findCalls($methodName, $wildcard); - } - - /** - * Checks that registered method predictions do not fail. - * - * @throws \Prophecy\Exception\Prediction\AggregateException If any of registered predictions fail - * @throws \Prophecy\Exception\Call\UnexpectedCallException - */ - public function checkProphecyMethodsPredictions() - { - $exception = new AggregateException(sprintf("%s:\n", get_class($this->reveal()))); - $exception->setObjectProphecy($this); - - $this->callCenter->checkUnexpectedCalls(); - - foreach ($this->methodProphecies as $prophecies) { - foreach ($prophecies as $prophecy) { - try { - $prophecy->checkPrediction(); - } catch (PredictionException $e) { - $exception->append($e); - } - } - } - - if (count($exception->getExceptions())) { - throw $exception; - } - } - - /** - * Creates new method prophecy using specified method name and arguments. - * - * @param string $methodName - * @param array $arguments - * - * @return MethodProphecy - */ - public function __call($methodName, array $arguments) - { - $arguments = new ArgumentsWildcard($this->revealer->reveal($arguments)); - - foreach ($this->getMethodProphecies($methodName) as $prophecy) { - $argumentsWildcard = $prophecy->getArgumentsWildcard(); - $comparator = $this->comparatorFactory->getComparatorFor( - $argumentsWildcard, $arguments - ); - - try { - $comparator->assertEquals($argumentsWildcard, $arguments); - return $prophecy; - } catch (ComparisonFailure $failure) {} - } - - return new MethodProphecy($this, $methodName, $arguments); - } - - /** - * Tries to get property value from double. - * - * @param string $name - * - * @return mixed - */ - public function __get($name) - { - return $this->reveal()->$name; - } - - /** - * Tries to set property value to double. - * - * @param string $name - * @param mixed $value - */ - public function __set($name, $value) - { - $this->reveal()->$name = $this->revealer->reveal($value); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php deleted file mode 100644 index 462f15a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -/** - * Core Prophecy interface. - * - * @author Konstantin Kudryashov - */ -interface ProphecyInterface -{ - /** - * Reveals prophecy object (double) . - * - * @return object - */ - public function reveal(); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php deleted file mode 100644 index 2d83958..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php +++ /dev/null @@ -1,34 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -/** - * Controllable doubles interface. - * - * @author Konstantin Kudryashov - */ -interface ProphecySubjectInterface -{ - /** - * Sets subject prophecy. - * - * @param ProphecyInterface $prophecy - */ - public function setProphecy(ProphecyInterface $prophecy); - - /** - * Returns subject prophecy. - * - * @return ProphecyInterface - */ - public function getProphecy(); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php deleted file mode 100644 index 60ecdac..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php +++ /dev/null @@ -1,44 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -/** - * Basic prophecies revealer. - * - * @author Konstantin Kudryashov - */ -class Revealer implements RevealerInterface -{ - /** - * Unwraps value(s). - * - * @param mixed $value - * - * @return mixed - */ - public function reveal($value) - { - if (is_array($value)) { - return array_map(array($this, __FUNCTION__), $value); - } - - if (!is_object($value)) { - return $value; - } - - if ($value instanceof ProphecyInterface) { - $value = $value->reveal(); - } - - return $value; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php deleted file mode 100644 index ffc82bb..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -/** - * Prophecies revealer interface. - * - * @author Konstantin Kudryashov - */ -interface RevealerInterface -{ - /** - * Unwraps value(s). - * - * @param mixed $value - * - * @return mixed - */ - public function reveal($value); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophet.php b/vendor/phpspec/prophecy/src/Prophecy/Prophet.php deleted file mode 100644 index d37c92a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophet.php +++ /dev/null @@ -1,138 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy; - -use Prophecy\Doubler\CachedDoubler; -use Prophecy\Doubler\Doubler; -use Prophecy\Doubler\LazyDouble; -use Prophecy\Doubler\ClassPatch; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\RevealerInterface; -use Prophecy\Prophecy\Revealer; -use Prophecy\Call\CallCenter; -use Prophecy\Util\StringUtil; -use Prophecy\Exception\Prediction\PredictionException; -use Prophecy\Exception\Prediction\AggregateException; - -/** - * Prophet creates prophecies. - * - * @author Konstantin Kudryashov - */ -class Prophet -{ - private $doubler; - private $revealer; - private $util; - - /** - * @var ObjectProphecy[] - */ - private $prophecies = array(); - - /** - * Initializes Prophet. - * - * @param null|Doubler $doubler - * @param null|RevealerInterface $revealer - * @param null|StringUtil $util - */ - public function __construct( - Doubler $doubler = null, - RevealerInterface $revealer = null, - StringUtil $util = null - ) { - if (null === $doubler) { - $doubler = new CachedDoubler(); - $doubler->registerClassPatch(new ClassPatch\SplFileInfoPatch); - $doubler->registerClassPatch(new ClassPatch\TraversablePatch); - $doubler->registerClassPatch(new ClassPatch\ThrowablePatch); - $doubler->registerClassPatch(new ClassPatch\DisableConstructorPatch); - $doubler->registerClassPatch(new ClassPatch\ProphecySubjectPatch); - $doubler->registerClassPatch(new ClassPatch\ReflectionClassNewInstancePatch); - $doubler->registerClassPatch(new ClassPatch\HhvmExceptionPatch()); - $doubler->registerClassPatch(new ClassPatch\MagicCallPatch); - $doubler->registerClassPatch(new ClassPatch\KeywordPatch); - } - - $this->doubler = $doubler; - $this->revealer = $revealer ?: new Revealer; - $this->util = $util ?: new StringUtil; - } - - /** - * Creates new object prophecy. - * - * @param null|string $classOrInterface Class or interface name - * - * @return ObjectProphecy - */ - public function prophesize($classOrInterface = null) - { - $this->prophecies[] = $prophecy = new ObjectProphecy( - new LazyDouble($this->doubler), - new CallCenter($this->util), - $this->revealer - ); - - if ($classOrInterface && class_exists($classOrInterface)) { - return $prophecy->willExtend($classOrInterface); - } - - if ($classOrInterface && interface_exists($classOrInterface)) { - return $prophecy->willImplement($classOrInterface); - } - - return $prophecy; - } - - /** - * Returns all created object prophecies. - * - * @return ObjectProphecy[] - */ - public function getProphecies() - { - return $this->prophecies; - } - - /** - * Returns Doubler instance assigned to this Prophet. - * - * @return Doubler - */ - public function getDoubler() - { - return $this->doubler; - } - - /** - * Checks all predictions defined by prophecies of this Prophet. - * - * @throws Exception\Prediction\AggregateException If any prediction fails - */ - public function checkPredictions() - { - $exception = new AggregateException("Some predictions failed:\n"); - foreach ($this->prophecies as $prophecy) { - try { - $prophecy->checkProphecyMethodsPredictions(); - } catch (PredictionException $e) { - $exception->append($e); - } - } - - if (count($exception->getExceptions())) { - throw $exception; - } - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php b/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php deleted file mode 100644 index 1090a80..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php +++ /dev/null @@ -1,210 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * This class is a modification from sebastianbergmann/exporter - * @see https://github.com/sebastianbergmann/exporter - */ -class ExportUtil -{ - /** - * Exports a value as a string - * - * The output of this method is similar to the output of print_r(), but - * improved in various aspects: - * - * - NULL is rendered as "null" (instead of "") - * - TRUE is rendered as "true" (instead of "1") - * - FALSE is rendered as "false" (instead of "") - * - Strings are always quoted with single quotes - * - Carriage returns and newlines are normalized to \n - * - Recursion and repeated rendering is treated properly - * - * @param mixed $value - * @param int $indentation The indentation level of the 2nd+ line - * @return string - */ - public static function export($value, $indentation = 0) - { - return self::recursiveExport($value, $indentation); - } - - /** - * Converts an object to an array containing all of its private, protected - * and public properties. - * - * @param mixed $value - * @return array - */ - public static function toArray($value) - { - if (!is_object($value)) { - return (array) $value; - } - - $array = array(); - - foreach ((array) $value as $key => $val) { - // properties are transformed to keys in the following way: - // private $property => "\0Classname\0property" - // protected $property => "\0*\0property" - // public $property => "property" - if (preg_match('/^\0.+\0(.+)$/', $key, $matches)) { - $key = $matches[1]; - } - - // See https://github.com/php/php-src/commit/5721132 - if ($key === "\0gcdata") { - continue; - } - - $array[$key] = $val; - } - - // Some internal classes like SplObjectStorage don't work with the - // above (fast) mechanism nor with reflection in Zend. - // Format the output similarly to print_r() in this case - if ($value instanceof \SplObjectStorage) { - // However, the fast method does work in HHVM, and exposes the - // internal implementation. Hide it again. - if (property_exists('\SplObjectStorage', '__storage')) { - unset($array['__storage']); - } elseif (property_exists('\SplObjectStorage', 'storage')) { - unset($array['storage']); - } - - if (property_exists('\SplObjectStorage', '__key')) { - unset($array['__key']); - } - - foreach ($value as $key => $val) { - $array[spl_object_hash($val)] = array( - 'obj' => $val, - 'inf' => $value->getInfo(), - ); - } - } - - return $array; - } - - /** - * Recursive implementation of export - * - * @param mixed $value The value to export - * @param int $indentation The indentation level of the 2nd+ line - * @param \SebastianBergmann\RecursionContext\Context $processed Previously processed objects - * @return string - * @see SebastianBergmann\Exporter\Exporter::export - */ - protected static function recursiveExport(&$value, $indentation, $processed = null) - { - if ($value === null) { - return 'null'; - } - - if ($value === true) { - return 'true'; - } - - if ($value === false) { - return 'false'; - } - - if (is_float($value) && floatval(intval($value)) === $value) { - return "$value.0"; - } - - if (is_resource($value)) { - return sprintf( - 'resource(%d) of type (%s)', - $value, - get_resource_type($value) - ); - } - - if (is_string($value)) { - // Match for most non printable chars somewhat taking multibyte chars into account - if (preg_match('/[^\x09-\x0d\x20-\xff]/', $value)) { - return 'Binary String: 0x' . bin2hex($value); - } - - return "'" . - str_replace(array("\r\n", "\n\r", "\r"), array("\n", "\n", "\n"), $value) . - "'"; - } - - $whitespace = str_repeat(' ', 4 * $indentation); - - if (!$processed) { - $processed = new Context; - } - - if (is_array($value)) { - if (($key = $processed->contains($value)) !== false) { - return 'Array &' . $key; - } - - $array = $value; - $key = $processed->add($value); - $values = ''; - - if (count($array) > 0) { - foreach ($array as $k => $v) { - $values .= sprintf( - '%s %s => %s' . "\n", - $whitespace, - self::recursiveExport($k, $indentation), - self::recursiveExport($value[$k], $indentation + 1, $processed) - ); - } - - $values = "\n" . $values . $whitespace; - } - - return sprintf('Array &%s (%s)', $key, $values); - } - - if (is_object($value)) { - $class = get_class($value); - - if ($hash = $processed->contains($value)) { - return sprintf('%s:%s Object', $class, $hash); - } - - $hash = $processed->add($value); - $values = ''; - $array = self::toArray($value); - - if (count($array) > 0) { - foreach ($array as $k => $v) { - $values .= sprintf( - '%s %s => %s' . "\n", - $whitespace, - self::recursiveExport($k, $indentation), - self::recursiveExport($v, $indentation + 1, $processed) - ); - } - - $values = "\n" . $values . $whitespace; - } - - return sprintf('%s:%s Object (%s)', $class, $hash, $values); - } - - return var_export($value, true); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php b/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php deleted file mode 100644 index ba4faff..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php +++ /dev/null @@ -1,99 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Util; - -use Prophecy\Call\Call; - -/** - * String utility. - * - * @author Konstantin Kudryashov - */ -class StringUtil -{ - private $verbose; - - /** - * @param bool $verbose - */ - public function __construct($verbose = true) - { - $this->verbose = $verbose; - } - - /** - * Stringifies any provided value. - * - * @param mixed $value - * @param boolean $exportObject - * - * @return string - */ - public function stringify($value, $exportObject = true) - { - if (is_array($value)) { - if (range(0, count($value) - 1) === array_keys($value)) { - return '['.implode(', ', array_map(array($this, __FUNCTION__), $value)).']'; - } - - $stringify = array($this, __FUNCTION__); - - return '['.implode(', ', array_map(function ($item, $key) use ($stringify) { - return (is_integer($key) ? $key : '"'.$key.'"'). - ' => '.call_user_func($stringify, $item); - }, $value, array_keys($value))).']'; - } - if (is_resource($value)) { - return get_resource_type($value).':'.$value; - } - if (is_object($value)) { - return $exportObject ? ExportUtil::export($value) : sprintf('%s:%s', get_class($value), spl_object_hash($value)); - } - if (true === $value || false === $value) { - return $value ? 'true' : 'false'; - } - if (is_string($value)) { - $str = sprintf('"%s"', str_replace("\n", '\\n', $value)); - - if (!$this->verbose && 50 <= strlen($str)) { - return substr($str, 0, 50).'"...'; - } - - return $str; - } - if (null === $value) { - return 'null'; - } - - return (string) $value; - } - - /** - * Stringifies provided array of calls. - * - * @param Call[] $calls Array of Call instances - * - * @return string - */ - public function stringifyCalls(array $calls) - { - $self = $this; - - return implode(PHP_EOL, array_map(function (Call $call) use ($self) { - return sprintf(' - %s(%s) @ %s', - $call->getMethodName(), - implode(', ', array_map(array($self, 'stringify'), $call->getArguments())), - str_replace(GETCWD().DIRECTORY_SEPARATOR, '', $call->getCallPlace()) - ); - }, $calls)); - } -} diff --git a/vendor/phpstan/phpstan/.gitattributes b/vendor/phpstan/phpstan/.gitattributes deleted file mode 100644 index e96d2e6..0000000 --- a/vendor/phpstan/phpstan/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -/.github export-ignore -/BACKERS.md export-ignore -/CODE_OF_CONDUCT.md export-ignore -/Dockerfile export-ignore -/docker-compose.test.yml export-ignore -/e2e export-ignore -/hooks export-ignore -/playground-runner export-ignore -/.travis.yml export-ignore -/website export-ignore diff --git a/vendor/phpstan/phpstan/.gitignore b/vendor/phpstan/phpstan/.gitignore deleted file mode 100644 index 020e4b4..0000000 --- a/vendor/phpstan/phpstan/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -/build/phpstan-generated.neon -/composer.lock -/conf/config.local.yml -/e2e/composer.lock -/e2e/vendor -/vendor -/.idea -/tests/tmp -/tests/.phpunit.result.cache diff --git a/vendor/phpstan/phpstan/LICENSE b/vendor/phpstan/phpstan/LICENSE deleted file mode 100644 index 7c0f2b7..0000000 --- a/vendor/phpstan/phpstan/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 Ondřej Mirtes - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/phpstan/phpstan/README.md b/vendor/phpstan/phpstan/README.md deleted file mode 100644 index 7171a15..0000000 --- a/vendor/phpstan/phpstan/README.md +++ /dev/null @@ -1,64 +0,0 @@ -

PHPStan - PHP Static Analysis Tool

- -

- PHPStan -

- -

- Build Status - Build Status - Latest Stable Version - Total Downloads - License - PHPStan Enabled -

- ------- - -PHPStan focuses on finding errors in your code without actually running it. It catches whole classes of bugs -even before you write tests for the code. It moves PHP closer to compiled languages in the sense that the correctness of each line of the code -can be checked before you run the actual line. - -**[Read more about PHPStan in an introductory article »](https://phpstan.org/blog/find-bugs-in-your-code-without-writing-tests)** - -**[Try out PHPStan on the on-line playground! »](https://phpstan.org/)** - -## Sponsors - -TheCodingMachine -    -Private Packagist -    -Musement -    -Blackfire.io -    -Intracto -    -ShipMonk -    -Togetter - -[**You can now sponsor my open-source work on PHPStan through GitHub Sponsors.**](https://github.com/sponsors/ondrejmirtes) - -Does GitHub already have your 💳? Do you use PHPStan to find 🐛 before they reach production? [Send a couple of 💸 a month my way too.](https://github.com/sponsors/ondrejmirtes) Thank you! - -One-time donations [through PayPal](https://paypal.me/phpstan) are also accepted. To request an invoice, [contact me](mailto:ondrej@mirtes.cz) through e-mail. - -## Documentation - -All the documentation lives on the [phpstan.org website](https://phpstan.org/): - -* [Getting Started & User Guide](https://phpstan.org/user-guide/getting-started) -* [Config Reference](https://phpstan.org/config-reference) -* [PHPDocs Basics](https://phpstan.org/writing-php-code/phpdocs-basics) & [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types) -* [Extension Library](https://phpstan.org/user-guide/extension-library) -* [Developing Extensions](https://phpstan.org/developing-extensions/extension-types) - -## Code of Conduct - -This project adheres to a [Contributor Code of Conduct](https://github.com/phpstan/phpstan/blob/master/CODE_OF_CONDUCT.md). By participating in this project and its community, you are expected to uphold this code. - -## Contributing - -Any contributions are welcome. PHPStan's source code open to pull requests lives at [`phpstan/phpstan-src`](https://github.com/phpstan/phpstan-src). diff --git a/vendor/phpstan/phpstan/bootstrap.php b/vendor/phpstan/phpstan/bootstrap.php deleted file mode 100644 index 3b47677..0000000 --- a/vendor/phpstan/phpstan/bootstrap.php +++ /dev/null @@ -1,43 +0,0 @@ -loadClass($class); - - return; - } - if (strpos($class, 'PHPStan\\PhpDocParser\\') === 0) { - return; - } - if (strpos($class, 'PHPStan\\') !== 0) { - return; - } - - if (!in_array('phar', stream_get_wrappers(), true)) { - throw new \Exception('Phar wrapper is not registered. Please review your php.ini settings.'); - } - - $filename = str_replace('\\', DIRECTORY_SEPARATOR, $class); - $filename = substr($filename, strlen('PHPStan\\')); - $filepath = 'phar://' . __DIR__ . '/phpstan.phar/src/' . $filename . '.php'; - if (!file_exists($filepath)) { - return; - } - - require $filepath; -}); diff --git a/vendor/phpstan/phpstan/composer.json b/vendor/phpstan/phpstan/composer.json deleted file mode 100644 index 2e11829..0000000 --- a/vendor/phpstan/phpstan/composer.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "phpstan/phpstan", - "description": "PHPStan - PHP Static Analysis Tool", - "license": ["MIT"], - "require": { - "php": "^7.1|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "extra": { - "branch-alias": { - "dev-master": "0.12-dev" - } - }, - "autoload": { - "files": ["bootstrap.php"] - } -} diff --git a/vendor/phpstan/phpstan/conf/bleedingEdge.neon b/vendor/phpstan/phpstan/conf/bleedingEdge.neon deleted file mode 100644 index 01fee97..0000000 --- a/vendor/phpstan/phpstan/conf/bleedingEdge.neon +++ /dev/null @@ -1,2 +0,0 @@ -includes: - - phar://phpstan.phar/conf/bleedingEdge.neon diff --git a/vendor/phpstan/phpstan/phpstan b/vendor/phpstan/phpstan/phpstan deleted file mode 100755 index 037e8ea760c726f1935e8e6491004bbd19cf92ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15695091 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 A9^YREjzY={JENvBnGXaL77Hv*8g~ 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 z z*0RB!{vBhx*arou$>>ay&s9$5OlKr4-2sC17v_>qgwdsKhZvQ3>ZRa2j*{aW44kas zlNe2n-|Sf;3ONI*Z2cjl1T$|Q1JCeV(Pxoh=^Gfg;IcS8>O&MMvs;o}S2luT3+&aP zx#Q{7ZDxI`;(CafA}fW#gm1TR8^w4QAniNi59IB73@aedL0&?p;&@+M^y`wx*K?6I zozQgx!8$_ws{}s%q0(paB=&`yN8Tb&r^u#k@dqgXwrwA_C--y};UY zp#ktCUp$PRD3Xa}h1t_6D>gZe4$VR-8uAw{=KHC>c~1G&m=&t6KZF|`$;PIDP}-+P z4ot3Q1-EhbNET$PENJWxKPQ@8fPF>Wz&Aa*l9siCJE(-CkunzS=!Bp^k!(WNDZ^D{ z5@4K-G2B9U;@S-amck@ks#wE(#ZMsm{IBrb8ercQT&@Gz!3}Xe9NfZTtVG4tq9msZ zD_QUjh~y{ES#lt-W@Zb0I!2w2z7Rns7yn@Q}mgY$cuuW%Sz4`FfBp?n< zXmSgwJ&qym#pEWdM}|Io`Gf;&apu{Ii%%icRS0NJG#DL+B{ttqD3Ful>#G>7AIq}= zhLND+`FKVSAaEdA^3&i6Tm3Y6C@#Crhiom+KiDVDn)TWMv%=K%i0YV|9~sk^8QyE8 z%r7(S3WFl9*$zK(S98K|F+203iZ-YJF4U-sE7Kbdi<%u&^U&c-J#6_zS}|0M?(J4r zh+7D5j?JNRkGIw^84k+w#Ij6&sOcvzW_Co!J$Oi$+au(K2&%GiAnG2XfL4)&@y+P^ zrvYC9PDHMA(vV+)eoYdvnUuc}Vd-j{PFM>yIEzyAQ)g%l+mB!`>*G@GBK&eoY@Wr* zVhbh&*$`K=ufV9QSf|00nASYt9w!udXU=ChZRB~{%=r{RTTVQ&Asoolf>`1KnxDtA zceY*TQ42MugR5@LaQeY>92?z>Q|%%C;Q1)9h_H{8DQP{sFMG&CveImQJ-vfe%;BIg zfh2rCikq0kg&UkTk@*#HQ`4H<42=DA`_8lM>ugXrw>eGQnDXe!{}Kpn;|006iN@*0 z>GVnmGtQo&_!`_uw!J*&=9AZ~&%$aIskZ_q9crX;d}Id~S{kSv!S&rA2cs)^lM0_+ z7iE?S{Mz)Qvb%LrQi9Y@BzSo~Gy@@rcIdqy1|QVmU@kEnG%g;FiQ(`odW<~&WDcdu zZ27&xwN&I$(kC}{ilR;&;7^=2*{p00m#j>FPl%K_1M(eacLC|p9v%oC|tyOCjm0V{bxb$tdJh^Pwo>WE`#$xzT} zK%Wb_hUuAgXWh0bi7zJ^`Z>0Bp0e~;G&Go-;G_AL2G|Ce>yq#R9{v#$zY2< zPrcLmz2?M)1=7N0);of`9d7!;;)0Y*G{%f!LVeYj8r9-r*p&Heq0LKi)1il4ve5zEz2KTh zFR#hf(Gk2TPGCBImkIv^!|t&?8JaWR%AGzu>+llc79>;r#QM18RPyrZiv#)(2sz9z`)$goi=$CH9OO-?C}836=&$;O`ou- zeG6eKv&%l(4Y0unQ?^~W*PoI=^=#Iv5@1PU&|A465KCFQo6}? zhUnU-s-=3Qe;>}IOW!{|8x)S8-tnh&68^8{`{z#M)gF7n87lAtV$_rlWHnqvIgdWq zYGIkhMM_G1l|1M{HWXJx7+?9QsDZO?vpkyreDZ@?s4=5jF z0r#Pwf#g4D`J75GlyG^I5!EpEv7l`_`zCvkZ4{pdJx<()_JX!(gDSxxBNv#_$rLO0 z6nq|VEW~QT{z4!seGB;Vnr+Tg^?n6Bv+MTWen{PlZi9-B07SZVlJ49Z`V_r!*NdE2 zgk;S8$i~G~u;qP>R=p=n@9lh^EQtklP#Y{T&Vq7u)(qTBG#$_vzA2wpf-dpqUz)qE z@D`DOu*w|MOS?{UJqGu_?qGN*CZ{?zzX@&``5tN_CMx2^S1_u22YHTWRW8z&+Xkn& z{5oh%(2SY3bte9+VENOWxPrq2@skELwsIkm?gZDkz;0YG=G_{2TONn5!r}w;sju@J zT4_g84E+83H2YcQPA)bi|AdE)fd3MPVjd#S-y%j}=azdV#hD4!<+WDO6s5(YWG0+# zi2vLqe@wlvW;lT2#X;?Lg5j`EU^V$);km7mDaNm*U-$cx$dRKOrK6HxcQk2N7tjLr zx13h2P9N>a94m7pPGG5hCg*%DR0zeIH{FXUdElMCTi7mPP%kvj4hjtAZ@>%N#`+O` zuO0P6&oqK+i=XO@;Ra59n%i{oj>=!#UmEEU1WqUr^2Zd8tu`2%9wGJCZmpIp25wfl zeMg>tFNE8P``+}V%p^%VcRL=+G|cy)^6(ETIiVkfn z=4dssP}yb8;c$8jIc^eIF&iLC`sWvyxUJ;}nRJ$l3c5a%#RMp-l__gPBkb}S1u~Pf z!@E@;vSMk4ZSXVw9Aups21-2`n3c`v(83POOm;pYETYAEGy+K4tLv=Gt=*xU4}Zj1)hnLCG%t>`{hQ-h*0YvSwNP5FbRt93)qHyUp6NzYdO~ zw8Ifh2PTb4Hk*D^ewu$$$*O9`raX5&C^0Jks*)2LzGH&dQ*6X~AeOT;O6JA%;~bc^ zAtx`Hv%d%Cb}i!fsF;V_>RI~(nNNXQayw7?L?m>0Lzgtdww@Bf!Y-V8>vqt@tH3&z z0$SzTmsMxt374hr8D-8ijXEN^EAWXFfA&P}dGcRveS_atY?FSMOz`8yHpr=)V;+IT zdmvB`9F66+Zrh;(FDP$O;a%k(HGLUa zC$=0)o1lSt4QYKIF1~=wTse@N-OGQzefUPCh#N+_@Jd^O^R%7cmYwJm4gv8P!_&mk zAis8QY%iYYGF=Q~LYfn!PEnG(5iYL=iULdaEzg7fish7SIEZL=_BUZlc*#6h{62&* z1}~s=kUJ$m105s}&mPksvQsBfU2a*7XnBdl7rN<*u2?)?*tPf31s`2~(cQL&p0628 zjR6Z0D$t1*65pl&md=83Mik~*c22U}FJk_~kw?@WWG$j1P#?wNWPqFr=DHPb!bly3 zwOS`@$A9fW+b^kLRe>Jc_JTB`5K$E2x8j~0${EFr1BjT(@U2)}m?nH1hoXH=coIbI zp}L&zlZ~(;k!cX#Z)OM~xqQbPU$yv7ooG>0V`AI(!TnAJH&2oFI?s#kDFNfnGgmc* z1S?tt>Q!`$lHl1(`#b+Y$>pv$Q1*oj%hLuMgX1EOXz^(Sv`TI%alC0%TER3*`8NHg z{51b0{0iR!l})E^LYp{C){f3bj5S*Fg$eE2Y9Pa`rs9u1v7lZBwT$wB3`4x9TCGww zsWU0|V-Je(f>NsnmLHC&GN%v7Dj2gDPI-t6%J4de6%iy*kUOjb|CZ61ewr^AeuZzY z`=CqJSJ6)Mw{nXbrduqH)a`Pvh5|B$T3BOFHl89&*_o)VaH~!hb;;seUIW*>LQN~2 zb~zj7;6|A5KFs?s>aMamFJVGNPumh>c>vuo><$9NxfRuW%jKdx!Nlb{_75Zy2D zA2GG>8oMkBc^r$)FAJn6SWY^eFJGiIv23Wk+N}8~iiy{yu{7UHms{RVF%XMz0cm%U zB~|1Fx`QdpXD7w?oQ(nnw*XZf+Rs_ZsQWCq(N-#1*sJ>TNzclIaG7XJqgvNJ7FNkP zN+oe|>*zJXXd%dIR5%6v2MvIg`6&r0`hze#RlhZu zxYdevFDo=Z$yhSZX<)iSNTP~}Z?3Qc-)eO%D4AMOFR0bMntRY4Tb+MP#Vc5d)JRRL zOsofvLyi<2M%4Tp5MKT@YaT@z7;(GM-#56{wLw3ofaJwj%2Yj71xGs&m?A9%Uuegz?sBAuC*e9`(WJ1l~&hjrMRH+)16=-8!?bd#xH5stXfd- z%;RwvZ!-jp%@#NQh4_8aRhLA1UqjO--;+2@!b(t5z;gIz#is~l0qg$eGVcFklhmJb zs}MI^-Hjwnz{@@rZSddYHRD7&3DdQGjEN{L!K%4Pa`HnVDb=UT&b$6_FzLYlgiFu3 zCEPo^PN;4MIyGh$DJ+BF=@2Mj%uMu`6;92~#9A8%|ql76Nw)%b5hh zp@!nK#k$G}S-FNHq1Ef}gy<`5q!OPk4;X<9gebp)=K{kp$@t~~n98;yg4o;#0SwK? z@a0T^{rs^%#u*GX!qD6r6HTPGxs0u|jIFbbtut2=YKx(OthD{3!O7qVTT4|E>Sb)5 z>nEWGo|mz8ma%mhbtO(^7jo4->s`JIzZT6?_k1{j1bhzpS^}1I$o+iQt3-A>`u!ln z4E~km!l(+#|)((9<#=obGZ0XpVe+yaEO2=Y3g^8_p zh*PxO%Q`HI_onn9ZKUH&1o7LIEyo!Rvbr@l(KL6UHtzvTrsunkt{=&&u zx_9NGfZk!+BN|aAL(ddVUZRA>uH>Z4qb)A0g4CiuB>f=v0=cm!6;_5T(R+^5GQ!A> zK~*if9i(IxakCH%&z!3OqMT+06|;}TY4x=?fM8apn}OJK4YZYVx(MslobhC>9?3$L zN5u*BtwF;r&g?lHOBKQFK^}dq7KSg4P?=&g+ApI>p%aiU#qDpi!OHl`CpSR;uQo3TEJvf6C9xqDe0ymo!I{Ke~OkqPc!LR zM8l!j;xiLOzS6W*B3hRs2vBkT_FW0rf(N48tu04Xo`G$7V{gQuWR?ngM|t*P>#W~{ z%!?a)jm)7PkBt4bI_l$XNV3%m4xACqG&FUm(KlYoKp( zd9YGJsCau5l!{UO9@BuVBlru?!$1Fr+-UuMajprmc(o-+ROZsrKa+q|I#v|2+iG6N3gFB;YEjt;&I*;Xk;8UmHwg40{ZVisTkwoPC7G~%xc&w( z(}Z-CLG)o+*_lggF;5$Zi7JK7JOV4X`x7qT4FF{|a*KNrn^NyjEYRwjh29L+R)f97 z-X;0rYw7DsRbhMbI1bEKMWad|7&3ec5<0MaR!|4CFoU8zkmq-c??E>y9f%N+KQ3*B zIJ`%buKj|}qx+pm{wjz&!W^efHhDOSB_a~3V=<&=&`Nm=2$P86$e#6|X^yR1 zbY!|_zx+fk{AaxD9sW7l606ikZ0*(@^N)m;2iQtPE@Xp&e%TH`VSVXu=LY2Rn4+K5 za9Gsk(pBI0KmX@EEz5c&*%JPIg#gClL^(w;nnnv0hCYB6Zd8_fn`5=ln4dF`pBgi8 z2WI@NocWOa*w}qKQIRw;%(tu9E*wH+dRe-Qh>`Ug!d%zh72pZ;#lq~{9a#0egYhr~ zMH-IeQm6z3>jSb8MZv6wScv?_e1GpmJo@v0RFbDS{zv;8;k1v@E|&({^?S!!Mk$Zm z$ia&Oi||#i!M4y%f>BwE5d)aULaewh{*rg2z2@JjMaNS99}%RduoSCa!CFkRO!E+{ zoF@u<%D+k=nj3ivPq8ZT{HWkv&1S4lb>}s=S(drZ^tyQ{prIiN78#c{;dxuCKpwX6 zYjIwe6u4E+(fsS8c6@$0INR9x^ZzSr_kOf=L)RvVc}}daB5`|}5DFF>#3>(lfB6Za zl7b)=T7*Bi+<37TPFO7`Kr=J6S~em&@zk+QFh!5S!Radm#YRNa{`g1nOA||EtDiIA ziNO&zPy~ve;5f=_V=zH7uLQDCfF++JVALC=AYz6G{>93prSE)nOy2~TPojr#`^X$| zKDeZM7$@2vVFAPmmuW+2pVTxGG%O+>|FO82O)^%3xzZ<>xRvEWle{7hrlS!oisx6j znu$3^Jb!7m_Y$t|XwjvAAXxetj&PVpv{%Ye*%{20yj2nRj1lI+0!og~ddM)r`>xtd z860#Q;l;qgXqoQd<3Yr!0kj4e6G*}u3;$0+KBwz0=4ONV6_ zX^%#^Ofc1IK6>8SYqhh_Hrq%|^%*g}Ofa>(-E1|sI%`>TcdNPG*zIiYtYz)}##WPG z8oz5i+uzx2{jiqpwTLieU}`u1`8mqreYU;%Z1YK@oz+o!=lOPX_sLoYB*R;$1FxHB z%}!%G>+G#%`>nmL=dH#wRLk}rvz_+yN9|6t^Ssl@p6u;yx6ypoZnVB@ZZ+CpW;=Ur zJb9cwZ#UM^NoSMYvz5oq4qoH?qv!4BZlm31Tg}~0qt$x8-)Zjcu4Yg7zHfZjXk}ZQ zsJ$&Sytj)#KP;VKs-0kaPK)H?sifH1hI+HOV>(==NM6_zOId7@1{H;XT zCCB9^r>a9XOS?W*ktI#zQUAr+J%GylB0EjbP2u# z?V)J0wes@~5~DFlfJnh#fU~Ulaj?wSb_K~0X=i;VvQ(OYdzPmZ9)8C;boebaYs%^K zYV5MfF?IQrt)iNthIz7C;C#r$8F_}~HFb0IG{{B5A?fUwmt@qXV!O!nNTehbwV=q% zD__dtqVh(V&3TbVQd22;vhvd|U~|WeS(A|k2-I(;o;HgeMZ}GIzPxm!E^fsd0W^+1 zzdmLB(U*`^aD1szvHW%XXxutTut-H}KVc>7vp8MV=wxPn$}4*@q-%z=y3w;qZc0?~X0 z;-07!8yL7;5B9t>@OLnCj0xK%IJL}W8Ao28F$_;-o^G%5IQM;i>!40L75l@8=hu1n zqN!b``E|Tz0+Y*c1FmMktec4BG)LqbEi`ANu^AK`x&zz#!ygB@DGZLxPG6G8B8bWYMPy0(=@U6MAuID)|1Hu$Un2Q4CKy2u-2{16 z$i~JAiZrA|eTCPD==Pyz7ZJt03%z|=0T5q(bMflp6YB)ER4+o+$hT)uSPv&u^77{{ z%-b9Vmf!wi{6OQ@;130pkT&RLix!N{N6npPM~ok^W3)Pvp(EREJlSbJ zY3yz_Xph+IJZ-eTZ?+o{pI}yMHDR830?ULT{QJ!xvOSnZV9`J^S~c`*vz@i~9(TUq zY{AR{qs4C4e4K4=e}`taU17Gi4{JzMA>q^Z^R1`O@}k?87p`(QTw}+8FF*ODtowJn z;Fjpl%d&~v|GSO1NBs-C+DUK_lDH4+E~5@ZA(OA@3#&?=@UhCrQ2wjVKXeG;4`5BI z0D@KEr{&hXG|MmQD6llkFJn_=`_Efo!VR)A@M>(J?X8{7=Cj839kTe{Jz?IRto?Lz zXGd849FoW*X>J*t;=iC-9^0|oe7E~2gP}SV9UfA(hU;a+%Qg6DW!SJ!uFlAQc-*I} zT(+@JEj13RpLSttM8)I!%9Fj7Rq^F=kK_q7czph4T=4L)SP)N8kk7v~c+$eaecQ+P z)#VHQW#0C_vs1sn>S0{VUiKKgd;~u;grVqNU5?5UJ`1RRn5U&E!%r8fy|vI)Q4AF+J)ph?s``Q-pLGBjgFK ze-qqSf~zOzQ~WGn_D{iK=saj6*115h=njPSIb3kH&(BXrqnEugdB*1lz4bqAuK)KJ zEA$s#;hS&x$`5sSblKmaV?9>Y8*nsPFG4uk=WsN|^ePVCj5*gUpMM^z?r&j-jer#g zQgFhvck7d@i;K}1zNfw)1jjkWS|dNAYmJ1}=9dYG`KZS;4~)ezBU%GzLhocvQUUI) zHt?v}Xy|*Gi;hc#O(d?oU&%;o%whqv1bCnIq$tj^7l@|A&nxvq(&oQh z0l~$}QkJ%q=!5@)f1rlSB@`aSZran&3{N8Vs{^6>On_4}~@9tZfbE z(MRI$)o|QD8l4UiRp|JxtONia^=!b+!55?+T{}}!f?FTj_#~@4*&f4n$RgjMg)>N3 zzZB*{8cD3ZS1zQ|L^~T26(g6X#djiofI>4&AyM(YReeQAUh!cEKd=OU_Ih? zX>tbndhfTDwO8j8T-ZvMeJ1~I$iFI^yqE7kO$8YxWfLm?J8dY!<%<;{u2v55w+%N$ z6p}5VSUKI>mLN`cgt)?r>;Qa{uJ+xg?@g=eChERd0{Lj?TGjmYRbsM;|1#852ySr9 zNyH@@es0OX_Kzn!?YZ163o7x+E>t}~aQ0LJo;Hbvff`RSXgrgV2kPAtt^l~rLr>Fk z$`vWi&L=n$ANQe57-Mhp?07tYlQn$fakv=c;0x}N$Aa;1oVR`)jIJhUbT8m1fAL`Y zsS+0(T!i-2wgEll5p6O#E{B^ivzXjwC6l{#a{?(&qe1m!M=9EkB8`AjjM7)2p5kx8 zn*5{uEtKR#rL%js+VU@jzOss!N-_`1H65*nrm7(#TN9=RD$g=uY0A+;WxjAgqR>5v z)VY63ow2-wyHFJLe{36VzI|n3ze0i65a?#NFT9J<;zH4tE3KJ?N0}Ddm+~t=S|=-S z)9@&_%C(<8z{soM*Qv;tcbL+Z9EMwhuX=LGos>6)>bcpdAPm7iy{aqTD?GY zgd^lie#MCnWlT$yDk>2KebFJ6D&_VN!6?@r^lq=IF@?4$tawDn&HWlcJNP!co!xih zlyX7vn^(|_Koz7qAjZhzNdZ@0>#HulG5dnl=G9qqru%3<&bBC*K{iU%b)%YC-Bi<{`BwU?Et_b+4SwICWE{cLi#+}m*#?2CSuax9*N(*sr)*t9At(<%303lIk z>%U630K#AY$BGv2tIT&x8pzgvoo?X)TKK1m79M2%OBehM`2I9w7JoFq;UzEwSU+=)@mi{d&4%TdD(JGDL6anK5qqo+EEiuk64`FGLPvi&qZh zae2d{k@Vhg58gAp$OA+Vm+|BJKYSu#;=zibTd*@sfif_!&@7v&1n;miG+MaRHfKkW zr9_*HF;N% z#vA%c6h0j}3DN$BVMW^jy5)En;Dn>3WxCDteub?kmP&-MH{G$BsOKy z=@dH1ys_~&VxOboRQ400E`=aF$+P8x!l9Jtymn|@AgQ_$|9LSwIQr4nX`&^YM9hfG zKK7ksce^1a$z#cc(2-CR9lf?TqzSw(z!(|_ia>9*L#YKyP3V>$#oNas=MT5$*$=E@ zxU@Sr)@@3u(nHpk+ToG3mqb5A94uQ1Hd2IyJ)}|!iySiDDBb6j#BBL48?G(fqzQS> zB1E<^I9wJR4ONce4GFpYfcs-6P(&1A_af9RhMOm1SJus*|F&UfHXMbkzrM6Hd|3I8 z9H^(1=TIP?*{3Z(rrAIrjLy-h+lhYW6@=fGFknmH0l8T|adUN+s);+M z4J^xM@rc5e+4$PCVpnDYb13#oy@o*xuKrX!`k#iT@F0xWKXc>qzZGB-aOv)kUity) zaQYGa82?7sEW$+-oo{zZWRfhRQ>+1$`{^P!t7yl~Z?dIm4pA};Fj?5mTD|5*oh&4C z|2T>IDS;QwRUAY z7TiAVO`y$s1c|f7Sk=rS!w*PwRvS&6JWqRPGKsEI`cA$(8P#ipVTn|P$2ECXtb2a^ zYbo-jHU=OdqeoecC;hXNjSa^+jg27^eaPqO(!0Z4ci4Z6ON6+Z=-Q_Y5!EhTQ*;-! za)l6~p9pClM`06x^03tia}Gf@gil~xwYYyuGp%I;21nXaSDzf{N3Ix68+Dey4w$!$?8izAJYRBC)9RDf48 zM)+K449^Xs18T1$gi2*yZPQ9AYTWMc5C!L?rkeJ4AQj{<2g_Zr;%+X$YD;B7MPBAR z;IBZ82$w*Sf>3H3`a3G1kDphcZc2KXQ5jH4q|KY5OBi1nvyy0Yf~5Fb3IUepw0^z~%P)IdUsqDR^AtVB^iDqnO#loTSVxh8BAM8hO`W~T{Z(=Qz zTfVw3E=JL^pp+ZYIP3EhmZbi6Y~#ZK=9pdd*CQE!NT96a!=-`peRl)EP1nk;@W~pu zQ`Bl~Zau{%jqrFSyTe&6OsBOooBvfImMv5;vp~RDKrNACJF&I6*B)L;nTKqY;zKu&qsg(e-x!`8)|7^PK50Vl9^;(&AJ;spqk*VVyh z$`JvqJSo84QFlzXYF=yPNw;t3;V{$(4i#}>dzp+BU@u+GRKt0ku!3m<@<3F!kG7rW z0Gm-F6EmB1VQE2{U1%x58p#*I6$XU~V%ZSgKsQlFD4)ERzy+1p`-S68UNhJBr--=p zIeePm`<KRzo_#s}XB1OWbWdmw)`ICa>3^(N2ttjS$Lv z1h9)eZ%>Pj*NwWtK_Uh*}yEuH|ixet}Gi=R1Nc6#-MsVx)9I140Kb9D* zwEb0#X-(__)9}SAEbbyhFd}ljHaa=s(UB8+Io2o<*6W&Zyw#~d8yJD4Z5ZnawXSWi zXNl1BR*`=zNir_P@79avF(S6ob8q$1G+=LKjWU&ioApDN%b+m+>0Mxd4$werJ!7c3 zMHbHW22$~FMYszqmL6aEY59rJLD(y8DOHh=y)WY;-*o;LrJa%{JNDcQ7dkMis?%9}qDa8L~vY_zLR;KG1-1MptoN@UT@T zP-DkXlzDmVBX^r#t}&X^R407I)S*Nn#m-805(!Qjw#?xvl-j0auU|1rmu&BfHY|!& zVTsd)D8nrdJx8w(YRA;h0}#w_By-Alot!c)a#?gK@a3ASVB&HPlxeM8w6$xT=xk~7 zubrhx+^O@Um&~g`^aCg9Q4x%zV)0;>>yQ;@9@0uR5@*6(nLJsT&>|-|Q7GRxxS=3A&j1OL ziJ_OGR-Gk?s*aEp!P%z3T3!h`(2R@`1CAXOgkz3`K>Y2ky*2RJGSl5 zC&KF7NB}PRI$Mr~Tp7h-lkFf)?u4p(gXP;iA@K=6wV{JVWVh+^tdzXANb5RUinT*X zc)xhD*4P4BgvqjH7NInx|K=7>Ez+gMh3xyH60hj$K2XZ8VD$!4dVQ3i=AYz$-F5Dp zu1(S7tvr1AFxxc21{XK2uT~hWlWngSlU`uV3QutcJb*eQ&Ce#?D znCa4ePUOCy*xM?1ix29myq@yZ0#c2K{ z6_%ero<{_`4k~Jvy;zAmG^LclG7KnpDd5bn>8%~Fua^-d#HLOwI3Dz<0jCFuog4B) zV8=>XAEeLb`7H!Q^r>8GETk3h$xH^bHG$DO1~JuqS_*J}W{j7OQ1 zf=K?LqSzo?$IPi>2?kInFIF8le&*v&fdg}#{3s_Tnit{3S{FQ#6?bQF)(+LM&m1*OD+dTrkWoYVV}O&dWfSI)n~Wdl3^kra@`Q@hLSeauqr==VOX6?;8`b6 zR(!%wRZEOyYCN?(gmPPH&XF(2siJMcHSMM}p(t@cp-pkBuO@)de)u-S^+o+Ed+HJ8 zHf98>JL@C(3q3Sko~+no3Kyy9plW`@C^{Y@zu36iX9h}9pjJB}mUXDUw{M;KGK>6W zihh?qAdC;m>(Qa@y0s9w&C#!iF8+~M4=k0mRpAWIKs+?c56ZrKMNgl901GG7^Sb&J zLH7{T4S|gnJ#MB>(RauXc7mG^7CJ~&gX%~O{U?V&f8uD2hE|pH;WT8}o#Kz^K@=Oh z)O_#H39f!*TvqCeQ2hjUC4!+In9lV(V7U^c^TAv1-IQ}wDo=OGG9Go`W=xzYhEJ(K zn^GY}Or_d`@Wpwn3AW!w^j@v*24^pSg|rr?2XWa12L4E6EDGwHXk=(3TC1zL{9Xx;8?vFdO|xML*daZ zB!!Xz1I8;NeTtweRdzmXIk{(EOj&VYNky34t!+B!E`%Z1hGECGUc^jruCeavUZZJ2 zOrugfHbiwyrO8TgFns71T(JguL#QQdQY;|9mny=YQdL;ZZ^i-s|Gij=>)4Z5eG_n)3GE#`sLG}uq+vGAPyR{x z6}}brZHN0ZG1{bnla+*}-@MzzrS&2i7Vsfu z%Gi*{T$F|PvoS#ta;gkxOKX-;20<|v%8KJKNSv;@B#$WtM8YKj6X`^^=+fjET(fsj zK-Q+LGy|j{0wrO&2{1Zhex3!0_N0@X1Vy**55$NFB(p$?g@hz1e($^qm^yCroduP3 zIt4}XUX|NT{eHX<{Y0DdOyG*!ViIr0zHR`vO;r-if-A=*lQ1b0nZ^(o!r3kpBF%y- z;#Vb@^kR$N{d3b+n!WPjTF;6kM_exS=Ow*2xJ6g#5=f54=A6XcrJBHLQ*Xg=qtiL} zH{){EhsEu|gf|#(W>iR3&c;5%unN95v&SVX1d`0T-%cmkS73(P-s@y%@L#*?ot8CK zMo?u9RN=^f2+K(u0mp`?iRr^FeQt>92X8>>Pdq7XbT zGQ=76dUc7mi6#8{crgBYr}bs=)miUl|Lp6}yrBfkg+)>wcJZm~^s_H50xifUzJy1j zl06OXCO_h$DX!4CJu~8I7z&*XBSmx&BBNp=N=_G9EnyU_CUm_gI`Dz(xgzuE3?X#; zV+8+$UA`}`OW0zCB3j^?<0_c%l^cXCcuJS6**EA*9J=$!W3W~@i}R0-JgP(wnH9th zT7ly_z5|W;Lz7Qfs)UEa@uw2NBB0OhF4B2Q1~ydqfU84XNIXCo-;4g&$0HCVA_R|* z&iXI1&;00C1T$R*9!BB%%4hj^VFCmS@u56HF;Aa|44w?!KLu779{!%7? zYmR@}Z8_GE%)1mPF8h(n&`QLAtH+mqlYUCTZLt#CsmO4| z2g{Ig55M@pH?ZKO1@eZ~h{MhXy0p@Yi(E-rn2xagl>^80gc<0P;JSWMu^!M~9Dj zxB=VptR=rE=nn2SR9oSCPSRd}KkWujMWgXXBhwdcr-UW`aEx>}6>lFYJj30Tm7{*$ zRW7MXC(-M$jM)^LMn8!%TYs3}nLx)8L6d}6vTG1DhnXki@{|1g(kP-`_F@EfxF$&Y z`ZEL%ikD#6=>=AHgHNtRaga~;%9VbKm_h)|fKso+Yz0Bri&BLbfv+xg@_t(8!=h95 zu~?)v4%>PE5+R;$$;{kBSRR~DAhRP1mqglxs2tf#H5?bP+Jl*wM$F#J(T_9{U%VSL zE2p)S@vbWJdom;uF0Rt4i;B0nXWaK@11BR!nxknJ{X)tgoFibJHB$x$-6Ggh4=GE) z{LT#=+>t%LLKv-&1`*>)p>cyN%Z^7!h}q|o%F`$4E-uMysuXB!VTSIVAxe}cj#;Lv z%pUzPZ-S`LHrrXVjVP7~s)j4)%-q=c-F~alZZqLv^V$AR6F1P2Jg~L7+i5o1Ysf{l zwex%%i3iuRM@Togi=*pK^I5ZlVx7G;_RGe~HJMfLS);Y}6b-qQhtlQaW@ne(N#e+C zf3wwTZav@GY%TL)HMbh=FS8vaW+d*A&~XhJ89SS6oSFUB9uSAu`2OfQ@<0NGg7@7{ zqt$x8-)Zjct|CL}_sICz%CM zs><(}VtRyYNv?sSrE@OlQ!W$n-?{|O+#<@^o9})i%9%`nkYqk&j4mamK`Vb#X{nAq6Fo-4O&32j ziqJJZWt7txB6Ac(XcsjgGDk?S;Lf;g*C$Xw0zV-lwHf~=V!;))5O5xu%9keG6;?6dNSzRshNIu=h$DwpJJo zBGrtW&;{6Jc&Nu7YksCVRs&u|{kYvIC)G6rhv)!^(H z1d9;Gw2U9|XYpKVNY=OO4|_*UpsRX3(2U+L^u!a*YyfF}JwZAN37)GUTI9laI8IxV z-ri7HQ-TauCTgs3u>Df%9iF<%m41l@)JpO9S_v&XLeIMai>4$}RLPta@n_@Y%hY^@ znPCZ;2gC^zhXbLsVtY0pD+fZ9EX&g(d>Z6;kxpD2DDonC)-v!wH45GGAa$BM&cIQ2 zd63d0Bg5@h9qpC}sbyl}ex) zjQowg37v=Ky!G)8Q34s_z7r&Ogen6Q28 zN*@E)^5;OrWJiVuQSwcAb)i2-40yvwUTG*-&8cmVDQ9}tP&j2#tuO3w#~yMG*1X_v2XMK8a*#9GDWHXL-j%We1#WBNxFM&TcR z61-=)+=iFi@NygedAH%`QL0h#vbFu>7qumqpj>EsCc}x86A!>MnIS(8^C)?Wrmcs4d|1If1JmOFf2NttWe~duX+TjuQ4>mgIGDbgZ8( zewB1I&FzF*Q@!O;r8hoxHL_N3FzGj#YZ(`lsCz+p|5LH5`CD3vK4qNR1TO|og-(#b zvU#+pZ|B812n-=mSaFQ_1JLjCY>XPRT2SO;mJ0zbM(Xbp?C!Qd`8NPD^dk()*1PFcgn4KOt%D z@OXraI7~VRub6Wruyfuqa7{UegC0{@x|EghP@IfTE|=OOxMMB7-`dX~wL8tu^G*Y4 z$@jL!@37ryeYf13f8M=04%_#O+>B!Y7uu8y2X{Skmk#aIJ>i^gAn69T)DaQGG>4f- zP^7_H>WI=RNvGk#xqPW3(%S}0tEF8ES>D1xEW`=@zx1XI1Wn}Yeus#Ov}5aMDTgj^ zVQlU=_my^5pK(nE_b0ZVw;InHyB#>hkc^gcXhU6tn(eH;_qc;QKe%v$>m$2AuN?Xu zv2Ec&0I!tAZI<1#G4ZeDSX6*|rhHlgbm?jY1Le}yXyMD8OT*66u(LGmER{z;@235? zX4shm@64^+`#CSS?B$kyo%jpOEql3TFSqRFmi^JTY+er08$81aLc`!H{JSrG5Cp${ z@scY_`QKlDBHoSZun4}?6w{C|6E4vFweI!!uJgOMe=J+I8{Xry{#%%@F9(xQo@@Hk!G5(+nCmbZigE|#~1mVO^gzmKK9o$;Lh z8v6D}gJBf$$S${r?SBiI+e$J4ACAs&HNqr^$GG@gkOx$ta94uSOLyPLN7_GwaZYZW z?(ds?@a;zngtUK=-{c+eT|^PT=v^Y1`MCSr!6kNl8VaKe8+#WTKjFAPIT{b-N74x- zkvw4x_cmH25P-xrf*`;LD-z&mG)80^FG2u|UEB=OzBV>mjemaLY&EtIH(O7h)A)oS zHb1T)QHZa+E(VGPn>f-YBsdPDy8O!(qa96YV|OnGVB%_z8IGqK_I#yFt@NsYb}@II zSJ$ZX&5C7CiKecDNQRKu5S9=@Kwgb_F`A!n<7!@SigN^3EM2y#xp{7YW{GJ# z{Ni=D5CWbtW)T;${NfE__~5>lmY2MWb!70y6(haSgNr{(Aqcfp4yZK2QaXBte4Izc zs52b&5wanYh!9jV@v*v$1$8+>=*Rw8`bea5wA$Jr1MgI{X$2!Z6{X_uG}c;I!lp$L zZmeqjcScrq7d|RIJZmR^KkAB?>*BCZR*Zi`0HpY71rUmhqY6Ys2(VaNXPE!`${j2T zglEUUn9p#3Z0-&xRUOI-j|q?w?yu3oWn~9Oz}IZ}@UVCOa&USzx~d+7gjz>TgVEWK zeI@%%se=O;Y4aMxd6gKBPTe<&H&ZEU4oV6X6u!BI42L&_YFK~B2&~N^QhXvOE|LVC zpZCVR&gfD+L_=h-Di?y^m0M+UaQDbpV0h@2doF}pc&dAvk<|>)BVdm#V<$LOZXe${ zd%dx7HtHSMhy6GDj$41X)yE?n$!Y{Y;vqh4Ln^y5mgZfb9Ck-6dEHg^%iz=FOfN6x6AA#r1buHW8)aa3)Z8XRtgS# zxBgHH)k%+0xqt(mBb_0A8i_6Yq?t@)gp$N!uCjT;#d_@S3r~^j-%9+%jtTPCPPk-T zP7~v$RUe7+LWoz;U)i6h=Hk6;rs}icp9Cd@$}{?x@Q@v8UPBnV=!V7VA<D{jG;rg0#Wn~*ZH(8uNQyuf5l2#FwV1K6Fh5cu&rcwNNon6!G`(8M zk)-YPQB=*_w`+q{?D!B#`(w$kU;u@sYHe`Lo^I>4!7;&LaY5QHZoe}UXDRNaRhL!4 zqz>RQgJbj=2fMUFfgJ6LEv7;S7|oQv;4}!+OHG4xl0y%=7eKSy2oRAr|1h{L^`wN8?8uAR0n76& zdS7P*{XHNmf$E~ru;cqzp)P&*}>*L`s>4S^4T_nTH@9g^x6i?bvOtI<+r~| z*gYq)eNl$}-XpRGD6noK5yH4zm;7&sZ{t;5GchA{kPAsmvGxfFL_4f5(-8O zx(1$ws2ixi@&)5_)=9Nzh`3r;{HiU~NqgpL3KfxG7~50PIBz$2tB=MVZ3E`HXzx0XHlZ!!~q`P2WD z2*HiL$1dxLE9=^4L-F{z%zt%n6`8RLjbhdk1+#Tu&OigUtg6F&oKs~^jzH}NDD<4s zW8|o6OVG0eC+W?+4B`&Dh4my9u=3nRnAu=o61Z>U;v)OXDXbo52kyLa=i=f8vzlo3 zxfehY=>eprN3%(`;U78S?Y#H8FRi;0I}oYrm>>;z>yG{zX*jEohG*}xzx?Uns80CH zpZ-1L-OsCwi_sX`vsF1JALXlw`b+CxO&Fx+jz|VrM9gT>?PhOAD-IXryTJ40$bhfQ*%E&VPL_(U-D zS^Ord|8zJ;fSsj5aG3^W(ZnoE$DpNS(9$tz=@@hqjzMa{^9H@7*{?0Syn>xi#Cq0- zlp+yX_&w7E13swl$FT18DE=WsrTPqI(rqsG3ZKBZHbiuZqpX+-MaR-@y1$REPLKqI ziGZDftMGnjbo9FV?LKp^@pa0Ih;toeW(4W&NmOG>JYQxPGz4hiT%t>ow&4`ug6Y2O zpALpYN;i;c5J$uWzY|3>MfqUM;&B*h-plC{^u@Ei?Z#oNvANCD%=o1UUI%0Lp%@kM4EBs6bi>h{;Q0H8{+MTA z9y{)2O_>TA8uE?xC(Nk^%QA%9H5)nuHJ)EUg*VEMFyCk`WTvq)SPHY}tJ8YEyS3SA z1XR44h6$ss8=AQfK!}Y}@dA3jX@roHBdpvQfgnDOTWm_am~I=35p;3ZZ*Fv(`}>XE zXjr`)p6oC<8n^1VbH z0hwWTiIh4=Jp@)4=aiG);0&3&tT8?BktvH+Ulz$JcNauR$3v#IlHjT6^bA?Y&oZpu z&DJh5;pKRTHCJFEX?$mL0>vQ|iopRi9MB+>xoF7jcj(qy+dFLhZfhs|W43p=1x$Cc zle6CGL^d7{?rI1f(-|uWX6p}Dv&lPn`ku>hOZtU*Sd?@VF{rl*noUjU;=IbnSlkt- z&+DXeVy!(lzu1{Cug0?5UT0#hwZ*tZdSb1uFu$13pJ`(A>-BAFy^7?}(`j&^+X#GU z7nMt3Qo$D(f~m%*_@d&KDS^h)2I7FJr`2ej2wChKLS6!ka*T!q20mi)GTps3ZI#G9 zUP@x0(>_A+J>b;{+gbhMtPd|64}l?JT8DfmqO)QG9^=}$ z=(iHXe>obRu}=P(6DgJvgB|Ak&eCb1{>F05@~c zZYrvwL053q1q#mvEOTrsnFQ6137Y6HZXIRi1@{?~ z@BxCQj|XVt3zr@kO?{ziWE44whJf>7gr8WwZ_x5@Q1#o>@FaYLRSr9PAw+q=B$kz1 zXKsN-YbLLKW+%lX9XBLxOGFi|AfgUZ=Zua9IG!9cb{%ymMzY#k4yDfC( zn0f!s>75LYwXcZQ=dGOtFH7+~KUCL|;p!sEJB0c_)}wmZ6P@T4|R zr95LSJ4gJ(p-74m4)Q7k=^eO`T%8@uA(!LT9r}w2EhP7` zB9i?B5ihY3mf(t4NuYjWKwKR-F2h!F1cD}&%UG=LQaXOyJt@zEvp>OAL$(=MY=jf0 zy(MO#<}rkStPd~}8NFLbI{pV(j$y{4MM>HXIikjapwt9BS)q1pZ7Gb#yf*6LhS~*1KP*uBnXj&#aYsc*Isq z{@Shykc_?$WTK4A403Am~YW*^3AsL9}HFun|!Rf0@ zt`_+ESZO~RbHlK-!ZqInXl2VaXSIR|O1Ch6YLmeqyzJY?_fXXEgra#gUA;uQ=*+uz zVJNEWgkzn7?}a#NKFzKi(jdYq(yS3yiAeA6-ETX4+j|JVHe>>m&<8G$%5Ds-e4_wj zJPv5*u~8!F0vZnqqLna;DM2`kaKKd+x*aMvs_<7e zl?DgEAjNz*6r}ztAc~WxaBB_ak|jLt!{b1g@-Ync+!4>9@yC&>1gR}yzb3IiPz5v^ za)s{Mk2MiM!Qc$hd^_b6%S2|BFr&l9#?Ic>Zx3(5Q$w5}<5TL~1jg}T_cZt_NUVFJ z<@~)9W07F`p>72dTm3f!=tx?@d{MiJuEOUU5CpT%gwYezg0y?MneS#0ln z`L+=Gq-e*Rq&7C%jm8Y(nYH$zSt0GnNI?h=Sa&%$2Y@J5Iwx40uQb8cP!i)k*ewD1bV0RBg%5g zLLX_*X02&Bb6>`CiQ3ERHNpfElirFLSGg9j9*TJhcV}3-q{}dr<*z7}QF=MLI(p^W zFpl<<1+}us?PrM0wNOaKD|Aa^+Bc9+Gf&UK1jxRe=-sck*!Z^gth3qd9Bj6p>}@`+!G|Tk zEMoFE5EX^xcj~*f`rgidVfp5_^@Gm#eyiz^Rt_+W*?4CSvrb+O+6pVr&$~P5uF-7y zR?HbgPYoo~U{N%o%Y$EPH-e4E+E+kuvtBp7`c$!C_{=+-m$_n=HCo*tOUksf2@~pZ ztt-KLgP06}2(>Ic&a4t@MuamljVI@eXRD8CToMqpQ1YZ|0R!=vZr{zY5d8cF2JfnfRpyT4fjI1!zGu5VnB-#%TmzeV2QET$Gy=7JeD}6GkaqPL^Hb>IX@k{Vz0QQrQx)8 z%4pR(vRes-7<2NKU{^jid_N-ynqOudC>}V;Tw)54&i&zO`8@rK`BtzpOFE)ij!Daf|o9-FB25r=;TbwK9xWczr zK55^ED_i9gcXiv#j5^mwWdZzbQ+;wxQgE>!y^w2zq)I} z536dMOYAZhyt@+bEEEAuacujx5!uonsbfj#>G0=Eu`{@g2`dix4UAQnnj<$!6U1+- zu6**x_U$Ts>)xH7tbT~O5-5I>$#Ozn8|jut^y1uZCT7SB9VV&^=rrYbLMkOkD42Aq zmShpE$B(6%WMDn>G897j#LFc7rBxGVflE0c^-PYljBzs6{Ij z4ph9^E{0HX)3sNL5M?690gQ!}Ec)W?2yFWT=P_mRqAk!L9M9kW@^AD_60HsnoyOX@ z5q-55ef9NP^Z@^TO&7ec?EnprVI|wR0Avhiuv$XA0`q`+h)vt9c`Qs2g4U0ss&zeu zko@h@TJ#kE9^+pN{|@l4hJSy+zh_6fM@0p^j+m*g0ML8)zdc%p)d?yAU^6(QUQuq6 zzQv;^$>$7#inm>OF!|(<)vw-t_4T_4?;d>p?(5Zddv>eZZudVk->TniJpcCTU#8_OHGIeFVl)Q!$FNdpLv6&yt=kXu5d1sEhkccX2Yz z?&9&HE!d1hw^3p#6`PhMB= z-M#^F-$3wQ&h zOwb86AMh{slkFC)?he_D_N%NV=bBtjt~1;z*}hVn-Em`L92qxm*?kq+)$PI7T7gWb zk1{C9Eb6bm{-A>Z$21tY-Y6b?$U!`~p)q{WnScawBQxX~6POT;Dj}*`2^hX_un6836X5OJ?%Ib6l+NcZp`uWc z+O+0`#;YA(2^Zq0QTy?es3S7$3)fXdWHsp|rX?m#@foNfV1tS#ugAE~0DG-Jr|?nQ z=BU~Qqi>ZmWW)Pm;VVkq(ir>**;G>IzPfI~G?%Sgh;2PG1nfPs&ZL%K4Z)_f1dex1 zctAuGbXH@AOyrG#F${}1PSN?$Xvuiqo4rMNkTjph=hg+pg6w09^y(neD=Ei{=mh;cgHe@U;E;I1b@}( z%!Xi#-!{j416^1O5$mDWirq}t;lS3FsuCHnba`u0#}u3{O9n=S@UtBv*p(H^#M@u` zqYHlR>ruG6eoyYb3(UOUNBe>x((xouzi7+Ck~Ho+0SMJ`;36mzKN6=o-*JkHRpbKu zQIjnPl6RtPZ?#C3tJHD{wR#$0jewu$kdkB>=!7DYTk+K*RrXb2 z#A%1s@E8k2DvUQuxSRcc^cGSE zWl`%e=r}3WolK7-RTL!eIqsp;__M!fUOGxjvO_d2MD6<=w2S3 zUBGL~uBEQr9UXMX8wjlrGbF?l$Xa3u5-APVMfiJk=>>sT18XDlfx9xfJXDz(>yUyr z4zywcE@QhM$Kx=Wzvta|T#9>M*X(mgx1$4zGvxwZU3A%=^*h2=qZ^Cs zA#1L%b2U-R`lErJf;kSSk&0Xq1y$DoNzo!&y3!sHhl6<(ummk4Zz<8bjmzLN5F`vT z?E@tbskZzMCRemkM|Us>=+*h6kAsk8g=q?N;S4PJfMf{@*g|r@e&`lX&;K#@8M!x} zamD;fOGW(4cj(ld>xd>k=~RsJo`Q3)%5r($dQ#ur&h~jW^k5K>I#KhQKQ~)-X4UyI z%;%QZyR?!1=M^pv1d>v=s~N%$D5U9eb+jMaz%;*@7H@B!BW?|n<@m{}sPDd=S~M;f z1Hv-g06(_*)uecOkK<}ze{hwvBd-p)HRG0yqoVe3tp3+d?z1p5_l*HR7!O+rxRF()Va` zEy6zwx;a>Xz*v1sF0LLjp4>|yhSfaXrGHi28eMS=aG3CQgPzRQ z4=`sXsLp(%%)r$Qy7hQ6FmmULYn-Z>bm$hVC+Y5qrQr=MVhc9R_5 z>hpNA6cD~-m7rB$R%aZ|nujTbJzg4NDhw&GWS}Mujg>%(@gn^cz+re;`d)xiPX;8JlVtcK_**eJwz~p=gehGHF`3{r4YMr< zM!G5hMXnX(g0cj?SfQa93hAW?3X0~}f+AD4Pplsi@fC_cmr13{q*7&4Ddc~7r4}*n zebH=kJbz7HJtG$(v>;+0P;kY^1YSp6BBU&YDwxR!<~XXu(0K;GYIA)aDy>^l>q)&C zHTQQ~2=QNw@cp2%|6P5%wjDishL^QyYyaR`qyG3wD|)iOyNzJV5rckg?eDc3^+$)T zeLVQZW)n4k!RGjGbMIMH`~5+q)&^YBr#Rc{?4-^}Cv z{cXW~v)1^oOe*yrl1k|rI5!4KAiZLzl!dm-JC8?$`D^-Q#1&UTY0;3ni||_aVQ+H& zb}I2$5zSb?{_lT}?%%!pCGxV~`!a$ijGDPK-fcjp4``?mEp;%4EfAkQsFWTxx1(M2 z2(RyaWMYqmUB_}x=@3IxMLH?eR&mT*#<_5V(F|51eGmddcJ8Dl#2_&-?m{o{;A953 zsIjQzLXdG*>~iQ5t87s~)jUX|hXs+hQFg7@%mlq&Ab;R^>ph*76#m~BAfPg|QAZaHSSvw-Oil!B42avHt|YwK zNz+F6XacVkx3g$F5wF!_pP;h=M9dMIWVoTQXB!&Vy9J|PY$vd{N!YC%aM111aNI>i zVrcx%6dY^-{R^8x@V!7}BUSj}^(Q^?!ZD$a5$Ed;1Z0y*1OA?nvEf0(ed*N@PR1fx z3%Wwwa$mNi+#5jj#@!`il&fqhWn6(_uX_%p6S+W$dhr&|`3)HmybU1CUVt zF!$iKM9cvsXA?Ni8bm>di{NJEF`x`Z$a7M848W=KS+tKMB!W}&w0hXAnXkdA7I(S7 ztL?pqV?a~(-P}WfNNg&?Q;z#7lF1seUb==C8P5FuSs;Q76bmxQ?n94Yq}gEi7wP-j z8PZgC@KKq$Uy1buZW}HkgxrA`)02blY8lDUxEmqv@;_LXvux{6aRxJ3ZeWO#+)I)t zE=<4)0Ty_YOmF5)g$IS%&9tTBE`77My}*`dBukaoxJ4#ui2ETX9eLQ~sB1-0J}r|u zJzV-6>Q2qhE_Fl6oNP4niiu+W6f007EGlIPjm2~Nt`!krtX`OC^M#=iQV5SU2-xQw zM%)3Dy^DuK08Hutz2JN&d`ox>kov!dNuStMY?|WJ%f^!kNS-tc=Rj05 zVd}E#itIwbb|O(1Fo}d*A#9#VJSJ_XDFrzrhnaG{0Ev3yg^oOjIhh?(Zc8y2dsZk| zbP28n-Ma2s`US>*d6eGXV3Q+>!)IG^Z}aP}$--?E6oDg|!7(oReJ z*n;hrKJbYh!nijHYLo4x^e<-qG%%6Qgu~}0=FS2Yg%gs!H4D^c>Lq&}B$*_pNzD{+ zknqiXTNMJwBaaUyPBZ$%4AN;D7 zSP}_Y1N7)%jpuh?VDT>+8!z1B`b+M}%!PccHd~N`dlav8>7m*BRc-T9W2+Jn%(#VT z@etumYry%(fIRJ}5P7Pm88p zVnyX5L*4=b2$X=3QbffLzi9bOBSLC3>;f7|A;I(!Eaa*wXM10O0x26Hz|>tZd?a+D zvzm@4#m(d`$FES14-qePX%hnN}(>e2}&|rBiwi=XT$1oPS(w9a8E8~(6{+}cPv8#kBJjYlO z90-EXnHp=+FWTc@r1NxUVnU$3Ej0qdkdC9z95>{6y!7+gXO(d=rL{E`D;qLqj4}O! z#|vm}G(w1l+XI9>fm#yzg!mWZnlUp{E&)2s>zA}BWQV@&cDjiKRd&-%qCXRfrsDvA z=0Pq&wWb&29^@6+4Ji@xrexP11dO1PJ65nP&IR^w+#=!^UZ>I0p32DUErn)F4Ok=s z0fvbNat4VsS*}>7RK%)=5dQp8X%`8t6Qy0m+lUG*HKkqTxO9&?IBXp3H^teC?qA#W z=GN|J{b_9*chL9XmL;0=R@8j5xx2fpH`pU-ZnwVqXtx&azyXZ@VB7UZZL3AcFaK=| zZe~a&wYwHI4{BR=eyRPw25+&=#WRnq1XUs!|;W~6$fqJk4&v$FsVUr{_J6X1 zIEb^s=y+oTH_bl#%pX1ckwmBZ@6&1&A_QbHT2cJoOh&0wF_i3}t%vRT**RGX zJpPhYxIn?Y(?vD$gP|`S&S##_8Oj#ROrU7+#HeS)d_})YEeucDe`OS%7!TDmuwjOh z5V*_G@hr)~kXbT54*~}26d+C&lG20QiJKIznNi>l4Tm32;Yu1SK}xR!SSdPvBY=gn zCFZsG<$~K0baav2MwmgxI~z=KDG5tRr1Q8Bs}N6&*|+3L;08KdGaiQQVmq9fud3kv{h^VF52Da zjl~^0ks^KOW^0pLC_35h)RB0V-ya<|>wCD@NM>2zYtZA5MD+!?)cppWRCjR2(dJEGi@twS!*g7Y+!Mab+mxHsk2P_ta*LNCT}kwc zOO~xb=N0YM9`Dv4*Y>vH>)MF++0gg(W(}qUT)=G90peq-@2GeC$=zf9h7_oQb|5)l zUgOgip9bAojDrJ=Ff`b3R~228?Cx6R{V9J;=V^ahzY)7{sXX5Hs8_dtf2QuWdWshh zzgwk)Embh0a4z`z4ex*pa^p-uDpJIdOr}UP+m?CyS=`9N^Smo#IxWBXWDl=-GTrVIa z&mm$$()HC5T1pehq9nqtWEHQRFTG_;Z&~<IM{>(0r!^p-^|d-19*y=9#TZ0Rjq zddos70E17ld=s++xeI@?^OfGRb0ZR!-m;~cq>Lg$`4pcribxquu=JMwr!kW>G&-Ex zLHOW~$Oj+5RN|mX`^kFSkpH>vCSvKDK%Rj4PD&=LqV|_rBU15?tI@s;8&D`_eL441g_cD(w1T= zAwd$!yK>9eQbG#LHnQZFu(5P<-`jX5{(TwLB38^gUN9!Xs5b59`mJ-5o7!u;PtK7Q@N`Io|_a9qNM_@xEr_TW-i;= z&5533^!;vJOWS!9;Zvr74L7-^lO(sHpZm`$Xo>+g>vpgmK+Xhgj)u6~4KHRpXVQ+7 z4IB>D0&>+^$QBdWnNfP>;n|W^2%OGH&VU-Es3K#Il6j0u^5JtPo_vyrYj5weH1G2F zUVRx7dun4z(x)Ay#vCzpA#Sj8aj5)&o?&S>z%^}K2 zFqY*=L2L~vG+%+DrJ;ob+M#JEbj41TNkqea0zGKuF)zAAh68&AknvPC=L7q)&GOU}xKM&e6sF*aUZ=pdw$q5Spy zEq)lX99hZ)A+Jo`;@t?bIYn;MiB0Xh@)iV8#*(9?QpS>FwxKeX9KCaLHCe4PmRusO zm|SMd47*caB0f0{@-vn>cFG((Wvb1EnMKQ3a^)rB>xGSzoPiK}ZFCAT6#Ue;hegeP zBbSHk<8-V!iN5whQ}aMW6$E=L?+)kP9i|Z)O03e)#l}}F{akL=&!zM~`MLO?{3G7^ zEgec`QIJZn_NF&DXMifJNz2xW(hjJG;iM6+bSPPv6v)9M_@7W~6i| zDIH3Roux!}hjbn0l}YK&FJYRMh87a^PU%oGLUew2*^!I3bSNnuO2l2|pTMD{%;(5+3H2V< ztqGxT;;u)pO%W3U{}@rh5s3YC3V-7PTb^x1;Z6yd9xIamg_UUm_<9$9cOBz{~*l!w_#U?%ec zauD~UN@ry1(MLYj<`%N+An-*G$y!qF#=J%=+6ub1fJ6vMgv=h?X1$Mhwhkk9vr}8j zcIZ}1Kv>24C2`p5=slPl3=XDM%)6na5Pf(qMc1O|D=5G$+lC^{w^xIe7wVM3W~oS# zc=jJNS+#{Qse%joHYkOu@IsG1QGDG1%nSnPY)V7#kHQJ0UDK;!$Ciz)+-n% zl6AQ3`Zn{$coK~!V>$z7K#?4%%UkejGVB*0YA?nqSNjTFjF8U(my5#`<8}Km%oxCw z2Cs&b3+AG4Ypu?F(h;XM_!`n*fs&QRwPT(*GQS&OA;1mgcPWW*R{9jQU`>ZXrJZz@plW{Vpv^&K;BrjM4wn2 zk1l#I2lMLl6;jMfB*4Vhfoa$LpGKzP_yS>9c2X&HXDEweY_-mMYwgG; zSI)CAUOXCb!!P>eO>ZGZ6{*fjbRUa zHYWkM-cSn{cf+0wQoLeed4Pp$D{8z8;wn5WkohtWVU!(YivEiPn)$u(qABH22*926tL03W}{W#Iz(>QGTTVK z%r;Wri8i;tL(&qYN!d}_LMq~B{ZW0l-jZ}F&BLuHHsvol*`1FlgU`;pU{FYHC6Ur` z5+A<|^c0s$G{U;^93!kAB{Ryx5H*0fOQx^~DeF;lJK8mm1SpBD6qzfZX*GiM!T+T+ z39wn?a%{VdXJxr<{-3|2cvfX7t3(Rb(#7xQT>Q$kAnoDV`3T~3m3lyW(t?G~2T$>2 zw)!GCoBA_k8>j1&4&q$&POB@Q{IS|@mo9?fv=x)1*Qsk6=ud9?+qBW%OF6)*o(J=D z>zZA#41B=7Y(b7=6S~11ypZJgL?{_)OCfzkch{m57*NL1r+sERzF!7D5dS`CNnAn& zMwrCa%(S+|C@btmX;Ub;DQzC8?I5L8GW1&%NlH~qrXeh(GA&54;$LP$LsnI6)P-VA zlbJj>)f&*s)?FOi;S%wzpdBj%AJEs3dxE$ol68sqp=wpVUUbO_5Y~55T1!rJ8Tf$s zwILQ@%YyZ{GkAkkmN2G>EepJ=Obb$`1! zwvTI_6%d&DX_4V+0)DH>7_lRv}Z)`$)2$VBh*Br)rs99Y0hvqW~8#rjMPKp3ig7tvy1U?{+8`LT*?F@y`?N5 zx$z1{22gJ9-WxJ?yv8}(s-##DVi5z1(hlU0C#gDc@DXbbYaoy+R9ke2gAJYWZ5c3E z)m|poxs@|a>4N`bdqlzkII9+PjWUwL!Zd@~lVA1isCtfQgEJ4qvYozf+sD3knvfe5V)eKYakb$2+&ul8|wG)swW;z8FQ&N`%vP!*Z-L0h0$6C2*Avxpv*lR3hI z3!y=c2CZ5EXQ0>g+F~V)WyfX*6|`j}Pn9W227%8K{dI<86Fb(37Dv>>S`aNsC}lX` zN;wzWr`f_Ve0ZAk?i`F_*h_g?sw_NWwv52L%dDk6ET#NV{Ro5(S5V`~eKMU~oGa-& zAa(JHZUCdLNHLE4G0U4k4@@6(adspg;(Qh4ai&tIaBR@80R(BRY8uZI_D8+blWFL` z7LE`zC6L*vN@@PWkxpKZJ*fF3h0ix5W**{?qQ&bru z;Erk2J|9fahO-%oPGNNevjnn?r`UmSCXdd(xc9}cKKE+bJ9i>+X&y~qznQM{Kj}Ax ze=ZHO=6QDtYNn49!biV7JDTtsXy#U-U<-%jqHjMQ0GY#{8`xEoKmdT2fRP$w#exSW z)*nu}4du+sYIHl=ZsLF5b<;Fy)|({(Feu50hv=njHNJ0MMQ^kHq|m8#k|q^V4VrRJn5A#W!q{auc9G zKnqj=4CgdAG1R*yiUPJ0ELN_A%dA+)bm+}4)7%{`TrX1gM~4>O(jW}>jku6lF$;Dz z)SKg;Q8r)E9nC};OGu@()5{en7R^AE{Uf|h-7lIVKV80f*c9jbdZUgo?qx@CN~#CfYN|6f6~Uww0adj65Nielyz6COa!lMFX3 z7Ro-&lyOJPxTD}zQ!+tF2RM2l#mVH=un!(7{E&>S57Bu#Ji4GWH))v57ysWIfMKF4 zizt)hcOH<(5Nh?gcy|xyGip#xJCo@Q9lphFEN!iHCobKITlF$4@6S6cF9qCdxf44{ zlx&1+pHgwkrTD$+;9U0^$#*$6*=!fNB9|$5ovP4?oMu0eO(Exh?^{imEhQJLsi108 zeb%Bw*^)XsZLYXqh^gEMp$Wz}>imMEjgc*LjuoP*<(`Vom}*`I06OW4%H6hAGPt?3B$3og+4D*0d5eEz$tEqkoxlSHdckDR)n~Tjizt zGioZk0cMK{*i6fmyB0%EQdoK!5_^wKvbdBzz&4^D%0>&x3e_^@E@&2ZKJ4C*t$?$w?YKT%^+<2kkxP^lcSj|bL7wlCQ$V0(`nZQY${XkLK&PE zxOEvV$%b$SEmQ7-2FsMY;00-ePMLCdicnT%%3Zaux!qc~5yNJ%jp&zjx@6@@OWsy# ziZN1Ao;>bqKjqD{vF@OW+gWk}?)lvpi?3ysDR;s1oE%i%Jc~?FeF}vlqv1<=^DHKE zIv2ntd6|ijFaCn|j#-MInU`=9C~uy@Jp$*3Hg=Np$qd0jA)2n0H_yy|s2i|%Xk3;A zN29#G)NahyyUlDPc7I*|hIXq=xtoYUL?dJA`cg*H>rZ+YXK=%UANT~mfaCrhc&JQZ zI4fOW_IFwcS67Sb%`)X~nR2(j*QzxdhX<|t{@!ZzWdHlxceO^ewRy;3benq!NVg~P z_7U)KzafF>cI!5-;ac?llNz2kqWYfj-Tl2*V{@yu7ByRq`W8K$T*>_g!X`FaQMJCe zwR^Z--+TN|;QI36yk4&7@REB=jlSqA3>9i4-uEpv`WC|Y{ttHjEZbmJ>|X+*J?0Y- z_oK(#Wv-iP3&mZPt}JsUet!~B=Nq>i3hvp6qxbe?Fx#8VYj5CXyG$ip#?r=Ab745c z_%A!@aAjEzSn7skNg{a`Ue=YR%&J?4%%hU({e;Xbv+9;vb%o)ju0(E*hR6tkn~+vx zBBtwA<;RYZs%gY&maRz~BwPB7;3{ViH}DWUU+zajxdk~b|Gu-a{O1}f)U=d$dCTok zoT}1ip)(OxRrGgH>o z-t-3NG}7UsX-*I~S0trB)Ad$+gLJZe2JPV0I3EMY)r=%BjTV3S-fo=oeru@U%h1C+ znA+|e^zG$lTyDmf&S+O|#$~+KGTv$#Z}rCFt-2j4i28u5&>FhP2VHdqnWh&3VBGKD zE!@O)6VBMPT`PWT{HZo>*L8fyc8_I?w(`l_m_Kr zx%c1H-XHAv#x9tP|M>)U5=fX8aX{bSnb8E8;keYYe`oQWW`ohOjU#)j z^m@acl!^qjPk6m$M9N9{JK5+6-{?FzD z*Rgqxm1HE$QyI<4dX+H$Y;_fPnErvX)0WYkqS7<3^vn~^UwY=bi^y<9SrodRZY{{B zG41vcZ#gewQv0~{%o~j1AeWXc;Kym@jqJ-2#BUw)$_W#PEDnE!=2l}Kq)P=qGFS5z zI4A#H!Pm6(%u_7-8x(R0f8ivTo_SQYpI!7$`4@NeXTzg{%UI(7tiE&**Z0M%E{*&p zSy<_rXAV8tOepRHDx`cZ&ph@OxCe`}B^pOa{$%!%bk-teMP@n+BLZnrp%8SWToYgO zJmkY@2Uky#mWXknoHv0kX7Bh(f?R$MjeyxOf{4uNydTFF?3C9$svB%4+eryXX8w@D zNyG(RgQ;y~iMdmk`*1?CNm8J0meHIBUigyOOgTQqu`nD}GZPRLxZ=uaPK?6F2$0|y zl(TXP*l`qFkZi0Tuj6<9B}v%UuU2fE$@$ag(CfKrtD-C>&(<(uEeT89ao?_MTPldT zqCMp~^XqahzOEr}(PLbdHWSk!`&dplXozDkn=g7c2QHV?~S7zC@ zPxJ+D=PU-*q&_0BZ+=o>f#2T6bT)i77`bE!R{*@zsBIlKn)UB$GK5@&caeOti}mf-Nj)-yqW?D>m&R)Bii`X!fUA-xU(QZv(2JOQ9xv_C;AK^;HA5T|(UW0fpf<-)NWX8l?-NMD8 zV;N3BwFWP6Hf4f$3w8$h+xwlp{Z_{fBB|cyx~AMD&8Aj;;nJJGd>FpYlw-1r>oIt(Y>(b zaNI`>X6%uJ*TF^Y9eEsYQy#597-~ztl{mK`z5_nzl44o`D}WP|GU&p94$ur3u%zSb zXprQKmFZvv@`tX4!?`%Zh*)Pd5dLz2CBX#f^l}V_9&|)BRyx2maW{!>N83&O&$a4D z!h*u?xvE8TYr7fFz-JMfYay>hFB!v6z`|}QFAT@ZJNSejKiT|s=T6k(T_pTBp3I$> z0iiPpA_e4)JlvV}&BG|?G!VK`$Tj(2qMWU~=r9#M($Uwe?qxIwU~sbN^dS+WrnKN|M?gYoUC z304%%&IibxJBoUcv5blhu*|zJ2MBF45ugm?vT!Avn~XL%XjUY&ng%Ss%DdP{lsNb+oEYL(64NP1uh@~6~3?=G1N&^ z;U+|y#K$esh!0i%^cg2z9r99BC9+)_?s_m9bZ6kEvw;z4Q#&fuVf@^(m2>`Nh*&AG zxf4OP#TG1*qWX4J#jULnf~C3(#Vc(~LcO@ipx)3N$ljM0@oaQt7b{RtDnvG>UXU6) zZ6&1;6w+av4I)d@6BZ#-Kzlgr2obV_loXKWD8!{FP}0AZ8VlXDek;>w^# zn9wr9U>RW$C&_*!hiTzNv&r%NH4h)Jhx1ctmwYruIhvG#4a&d z9)xFO`W?)A(;-v?&=_1my|B*1iN1X3oNy?_T7R7AfB$=Q|L)x{*YDrG_a(z3LFsaK zb}=5#-*SmRM7Zg}7}5nkdpOoVYHmln<`G`s`KU`h6E2FGm`9NXCmxWCnPpZ!cZ%&w$BM^ZyB?f-9wXK> z5lcap=sKT_sYgek|4{Sndb2`HW{-&&=a9%A;XuKLQ>S6uO#4U+Bu|NZQY-JUMxY^y z4SMs*^sSt@ZX9$R=n5f6_wxSofX{|Mq-Rm_3g>5w>ul`;klIB36hae+fe7xGrG@R%(0y9LgqSjr`m^#0dX;2hyx}T zG^3KDKbi_?(80_jV+vp(!JG+F=YNvas0$a3Zm&0(&7%1b>jA5v5Y{DTYqN!hQq$$2 z1ZFW3ln7@Gs)(~?P)k(;3^C&qs0?lh+^vP+_O1vn5lOY}5aN~4gTS0(XG#W3p!VrP zSkJBl>&bL-aef{69qMiEAesn%OSB;bcbg>a#j9-pH3%Sz>xoOcw zd~95_B2exrn$gO6Oh+CoYDWb;aks0Y=r5zYZ+ds{-d&}yg?|0f?FGcB^(l@cgVa~Q zkvFe1-h9C~wgJo^8<u-Fgn5vvk?VHR_zhIrL zKJW8IR+smDmzY?Vny1HU-?ZE~f9J4mw`d~WJWL5wTc-o?DXdcGgaQ*Wq#9ZNxm+YL z5M&F#!+?@b=d+q0vdqF15w11OjT?b~~S7aMSFl#?I0rTJu+>ovfb1h?<& zvXDdWof?~;DPr zZbp`d@{7EGc7d6rNzm9RCn!99J)EW2xYCl5B1uc7BP577kI~(@ljE|kDMFJ_=fL4q z{Gu~dn@)MTv5|DGjDGpcC@`>-R652T6{~7;B^$dp+$K1Z{Ra_6$)a;X~p^j zFTpNH>WRUqXKv=I|4K@=J_+S^wwlI<6A6_8ZTZXcN|GZ14z- z?5A+){f85Yr~;UOke^+Inbw7ZC5V~^S#ciWjI^@@Ue<=ez}O?;b%P_wd{AvW8-c)SjX}x6a`P|gu9V4- z2=_Hu9_~i~UB<5tlprt_2oCVWOINry>vNu#+f}dZX$7BnQ|VnAvtaTrRUA4`YUWJ zf7$?0{-~s?VHX+d9%F;TX+ZB`U7U4iFBi|A6qC`hd~E)Br!z77|B*s#Bd21c?qEi#>H$qgJu(W#Aa>w z@9O~Sgn%Mw(bIJiY79%)fwU>6sa!BQ>+`qgxie3L%Zh=*YUCGV*cq6v12-EvfRXBY zkRK0^CriSOjn72=RLfaR6QZnWdC_G!!)|U`Y?_Nu*Bc7qTXHBd^Wk+S;SueSHv+wY zv?TZlfoKhp5lQnp12{AW&Ff*_0+Ra!ogdSY%aH|MOB;`Ua&j6Ej%ol||&jy#2jljjwZd04h8_dU58ICIY z+Gj@{Ow)Wan!JYVNvE?@->r2zIKopo$bqLyUYx@>BPf|CbC6Ep@7Wzs#_%s1!CMU% zT90Ov(FJaG(Up|+}Vz#Ws6jktYmIgCgWQMQ>vi6y8uhfgQK927t)a+Zs_ixF`+G%m%%N~9)py?y>zb3hV;fG5MD9EC+R<{(s^qvr5B&jdxexl) z6*oXq``+f$+DhKM2iW2`L*!^(iyQXhsX+R}jNw0XMR+Y*xt-rjc%xn-hA?En6fx~% zm5a!Y&?$#3Zy8~GEpHi>w~WeLMmy2dT4U?U=3Z;_QGK`GdKPW&ZNss!#rTNP&VD1> zj1D#%t@_sCF5*ZW95xR2n>F6e*lg6I?Rs--ceDPqwhcr7UbMF#)xN9kwaO5a(WApM z#N_to)6K^wS$r$Q5dLF@A+$&Cim@hBZ!yCuW_yXg=-Vj`kUz2~i?g z$Q7`W37`9etwQvVl%_Ok`YA+cMrcRbj)1y^w+iFKVd^{!&pZQKor97`X95Lc7_-vz zilDkZr5C6V%Dkgx-ceBwrR+PKqam(J;fkbP)Zi@rYFeQLg6y6_gm4yn=x>l}l0wC9 zPSQyufmoGP%tY(7sO$_<3!I9aZl&~YWglRIcE5#&JT#e2K zh>hYr^qqcKm$N%1nET!A4*r+8>5V*K2w`@Pr8z%dnK4!*9?l$J@Lm{;FM4xen*aORFulU{1lXW&VQ zLIJTV#0BnVkwqU*MzEZ63G|0EMBKyO9Y*5iJ1SAlr$6akoI(A7D?PCF;ab-n*nH*o zO$1Ji2s^x$h43)1hJDyb83Ie%MvIWAjxJb>`Y~zj76Rp<0D58fVs`^%{Lbh)V>GPK zMG_p&VQ+?>L)w{4kuMpk2af{S;6;d$Od_OJ!E5+NObN-^gf`mgq<_&v1Bg#uYSK$h zdTW0zI%w=8ig@iQtpNKwB+BODqh_n#I&9UV$NT%+%?LJyX07pE8L#Um;&uJOY^qSE zi|BYO+CoSioBznZYaj4DhrkzfMiwRdfng;)IZ0`e5Lp0sVU2=FOFn!LLAy+!4yX(@ zd1jcDC8B1De>OC3^zSuNWFSww4&7ZIv+*O!7@N+JZJkq9r4wKX3O%d83mX4+@b)!C zovSqc(pIIWFx~K$UO2t=Ws3!BquLj z-UG%8X-Y~&N7jW`d(#`7b9c6smaQ0x84P4xNd6@$fIXa~4fiyFhR>5~6mczq8~Eht zPjHWhXA_rGN_8xXXNyKf7^XmOM=AVnpu-;+4k4*5B`y*QQ?2PnUR@FGvIE()6dBm) z`~_nk?mN2ozcb;7Ri)~p_C;-htgRh*re<2S>gqNQZ^#A%7U;%p7y)7B$9v%LmmNPm zg;Mo=wagSe$V_oO0(vR1f#ERaK*K!|9;^WPhS;M_j`uqYnnB)92eI zwWq)C^B2O_n3A9K*AM#Z3;z0EfBlNT&h*!>`D?7dzT~fG`s+9R^;UoVmcLH)*F6E| zvHK~|oVuR^&J*`j;2FA~0uZ7E8DQ@TL>KO-fVA&^3QP#7V+#vVhwkTZUj&A{LRz9n zr$cNm5oL%V#v3|GMPOF>?TPM>%9J#v+JE-W!XtaO+HSC$f(jBciWX_56D zxP``3BQ|!e@70LGV!7PLiBl$4LF85wTGs_`H%t#pa#vK=;!BXf_+Ne{6wV~kLbwqx5#(?G$Z=z73Xa0$qm zP^VHS+T??MNlSY%(%lRdEV0~o+1DJUV4<)W53Gp|KZO`gh@mb zmsP7R1lGa8)WM&$ftfa1(cnas5-k(AOZ@ykXA=R>^hA~Dj6=G9&lz?KM*>S%t%n3MzDipDKsl0QWNsrv$afQ+lqenQ?d`2rRwV$ zFw+5siwHDw*h3*+IV+J{vr-m#bZf&`z5(o-lP@|xP*%7A&F-#m)esUX$|?3U8%fb~ z3ST4>PrLDXu&A-UIYR-f1o{FKx~>}?O_7o9)L!jSg3CvxEsnMxNky&Ucagl?KyJ@8 zO=x-<^D9Z7m47wO16OT?Og-uR>jm_^)ru|c*P`D>(kKNNUc94lA>5VJq^2XNyAiW% z<&!@$35^2-`Dm)QZ>@gw2?SxXkkkwjyLK9aq+xu@kDn_4O-lzMM^dZckijJoqmD-a zH&wJ`C5*DynJ-}iwt?(zU*c34D9o(5d5~%W$9D^jYMl%s$Bg)?v(87Vaw488BR}m} zz3}>QUHN)`%7g9}N)DW7OFm|{^+Jp6Da?Rt`_7zNh|UWWG5Sn=;gDol_9*43d3HV; z&Ov0=>Nj6~+{S0M-M+m_;&PcQ%~q%QKtfI=u4GKS_CcfexYImS{#2#2^Bm0|P%5pt6vnCZcs4WCzr zFW3|23L!MlM^;}zRS5190jIWamP-K1W@Ju=m<|CVt0U}QLN ze%(9B7p{8CgM8<4iPcY663ymKiXl@h(cX3Iv%J%zY%xcLkmit)-1>By4Js)9%6#Sk z#3}D8NGXVP&YdKL);QfV;ad8Aof7N_;~2lpgx|m!L9v%&>WLGAmRo#2h?gY)yyEG= zHl(xQs3>dBNC9@%_*Lt8l3VIr@U0;wxBQZnCuf2M$1ipdHkBaG6nb-rSkTKR0*0Dg zd4cULwfrnw2E`kSc8JgyxVsKh!a2gSxZGXP)^yL1aWMMB3|XW#VI@-sqnXiU@-pgb zWS{7CK0n{MbLWTI>Fvq%1UoJR+-iO=gzH5_Q+OUke`wC%rX!L4!JG_WPJr?%=6Heo z%+RKfW3m3L8xTNf9(le2#s;bL#fF&=pWfs(d?@G-FU6p}vq5mXK|6o@%fIR3x87es zjcD;LhBjbAn^-n?3nat}FdU#^MCaF&iF2X!j4 zQ}h~N5Yr%51u0?~-eEFMltTWBV0_r$ zsqBRllEidiw24G{MAHBmG*@H)23Ea6dLwumQ+44pC*8Tn-{aG)2P@T zrTY3r`uarr`XtrY?BW>QA-}Ir3j0!4uBiEz$wM3q5j-T;43n3@RSfHdBb8;2EU{P~ zCv+*3$w!!VasK>aFrCa2B=)Ctbr&C^sNUX2RB!ID|K`_s?=dnWv(FLblv&k(&Vm#` z_j)i0bGC53zTUW2^&fzL3_Iw9Y!Hsr^X?Q!)f2N*-A&Hn_W|?-iZCF!Be7`MC?85d zdeaJw%TE!hp!+s~y|W_dyE+>SCtL+TQY()3&uOmb~QWMBVE^HTG1$?61vk3CX8`1qQuG0WEk75W45%*+K z_l32G8`0TtjCeUqtT-k&8bB!MFHsg7z}c{eRck6FaK6vHMaO{@^LRQKj9(9-$doYo z)yGd;tK{^Ygyh0+VdcOH_6H;_M6{nHCZra(*F+!KQWV0M+~C$YhBb{_CY9`A8Bd9K`)8x21z*t%BCS6Gx+u!XIxrONd1)R);F>`oek z&Ap6*=ZwfCMbX&(+xPFK+v<*IDAPix>~AzY9(0gf6Udn%Y!h*Wlf?L>!vx+L9hlm6 zV=VvTe!BV70i2r^f)$)BZjWyFSHcnLN#mA`NK!?mv2s2-AK4*C0%#RN`DEj8V>JUP zk3uxbQFW))jZfJ`cJc1339`8iwun_0-;AmoK=B5Of1J@g4q$V*68H&dO;ADcxG|dD z>D-C#05pos`l3GDScSqZ95@?TIff=r+mg=jbno!lo$3aK>y1@>5gcwHm=Bt$ZpfT& z3^IpewN(>%Oqh{RCdU{$Q8oLdJN=~l1FD5EgviIr7~?=iA;yTv+@!dL*|XbP^csPR z2lE&ebE6c@8gyVpk4Uo7Id%iq&6Vte#caf50;!E~%1k?m`Zbb<+(MG>(zX30B0JP3 z{1ryDUym_?BK66+GgF$i!Z{~Z`(MF~?qVe%GND-skzWZWl|7pK;(pk4h*UQU^TmnK z$d>{XJMqs*wz&QR)(kOJLSNvtm6mkF_Viq|7{9`P#*+fTkQaA6Gg~5k)bI_1N@Et( zsECPHlsu71>bG})b@x|yxTNpj11fknq6d-}3C(y50MO%|Oln|mv2b)NSSh5rAM8j#faJY~evO)elegw(55EdV zW<_nZvckDtLAy!$`C&?rBzh{2=RggY#-mqjdTo+Xu4w-c#g|WSG^_ig^RKkUvQ0;J zZL2L(%Km6-01zsi5PD$7_P-Rj=(dHFLYzJ8*2QGK3@%(*mRC6yDX{TgM z*1~ok0bRU(XT?pqH6_6{1v35YvKp_jJoSjwsrdq4J#Sx0nh>kPi`&s0?^?#{rpUA! zyx7=j%E3YAL~S`h<7jl$?Y)Gls@<+`zy$iu>ISS;v{b2r1BN0w^R80bLGS>K1`0x% ztF`EtZW#RT0Zrm8ZhNgh|KrAs&sMA7Y_Q8!Yj%}hp3~K?0ws#+)8mVTE%amwL5rY5 zYW`W);$g)`V&x-#{G{`jHQ9JS1wQ15!{VF;y~IJOP|Hbtq6DbhD#7pRam=(5-MJHO zaR*BKir4}i(aNWg8_*ZJgcD>Eb1cYGZST^X;W$HRfVW@*vf5!=iye18`+$!$b}B~o zIEJaQPl4O_K>Hufs_Z&3Z1xjJG@p2@Tma{DsjqSbi`kEz8lkuK2aeCA>}M?Qb9b(E z7U7aHcc>4Nn+e&z=o=f@S+=xTXwp{Tu-6&qHnEHvYp+3saY&#jR(X{-1tA$bXuzMc z30eDGJaG!LC|((E#ZI1!xWWnKCP~+amFWeHz@N@IjW9c-dtKF8mR!NIDsyG+r^}gWdca?e-hp-bM3Rg#pwFhG!Y=mQ8|$m;O9Q^WBL`omxZAW zdZ$XmtZM-^X?sdzB_s^TdG2SEh4Oi4EoO84!~qEyZwH)+J_)Dq=I^HO2Jc4iF5Vr! zn^o_;`}AGA{mH6u|G;74zJ0I}K6_VLmEFN}Mmj@Rjz`^-(C?jqa5RIn^Eq$o%j@Xf zyC{5+$GR6!-QgJ0*W_d@5q+&z29h6*FfyHn%!3*HoHJ-P7`k?=;1DO%IOg0MH_!uE zS=(@_z}n`3vX=J@3L)waatjbK5`B5)bj6;8_$cvFR|0Da5a)pm9;>yWkr zrmy)DeW}gh+MP`cIt!Nf#}X770cLRtLaw;@fU}@!>tJ$kHFtsQKowWI5ldxmOxkn- z;^H%|E%NU|ln#CdqjW=z=sy%E=5R3A80M&8m=5zkdN&^x0J0FP7t3}hCZ21P>S0lL z&WR{39)`$ue8OL-X}7Vd3MzzUKxUd}F^jMjE(~`BQ7@rHiqNpUe)mFE`=Te>67g0o zngmwO-G8-R{j2R`hsQ-R3J#a+CsSq+2y)+8va&trQ*{9`+3P0x3^v?pWpjG|IV5ic zod4J!FU-R)viDv^4*yK>ItQaR;P50*apFb)i zDKu8dKK$ZO?JT<*jlawnDp?XAd#H!2J_rJJWO?HqmS zyrjYF#LLxMAVUMF-LBuq){8*NCOngO<}gvH(y{Cw8}1h_GJ@U)^?QM zi+8Ou(tF&f7ai_KAhb4uOdJp49}O1*aU{XDCnjSajTrnAaP#9+fiu`@dy{cG_vMOc ze6tQ>$GT2nQSipfK)0WU3mcj7g35;L>ae(mmxl%891;QV6-TaN~|^SSoHYA$bK1rL?cE#fP>W0H{RUmfnAe)vms7dxNY zdm;USt!O#NRvb9lnTX=9Jz6-)LK1Y_Rt&n>h?$Is7${~wiNRG@6nt`>II*rl6dBXo z8-t97b21=!z6w(b4D{^MGa>$}=$OcP2&N&8ctKr=I;$sT7Btr}3B&-0H%5qqm zl2y2fP-|-$rj{*#V(n_5%Ai~)et9K$ye>{1JV>mEjl<>^jn%=b1l+ca9QEPfoa#G$pvg#ZOR{vtku;>O`e^L%ZL~{ zkcBJK^_sIHGf!$~2+ISdeIB5JFksh>J3lJ}!0i}~$FHJj8dRKn=D6h_k7Do7+@#+4 ze(%HGCwKfr8%*#J9QLcvR}SiOp}hUHb5Mut=0Ux4-#_SJYv!Xbf=3{Rm74yBqr*z` zUm7h`)<^s)P04fD7=N)fdHQ)+7@U4(cQ0sRcTei??mzC_cRk_PefGwu_wI&|@yoQ} z`r6%NPiXVrUF~Rh?;hOsSN8X6o&E1>ji9%CX5g*w_mgk#C*BC?exUa|d?28@W~GRO zgTL+x4r_PRjZ`rZnS9s;eZ+6Nzoh(iX$j`W!gUoVSOwUS-%#wD4 z^qjvLI(qg!hdQJTdUgd<^o%qs)9%RtIM6Z?BJ}=fST0+#pGtRnBH8G8pH&3i4x}LD zCqKb@^ElJu%4#I+VrO=7R`m_6Mt58sRM%>vjX%emtaKDQ$xW1AcHJWrkHU+kD}01# zaVy>4B>j%h0Fr5v&p$jBA(s%2PgNZU6bV_08byY2!hBafRIOgb&LRh z)8tF@kgrE6oQ@_Zf>QpCW5f?kFE3YkXju51QtlX;v?1q%I*V4$=CW=ittWuqCmzVapAi+WXLv*v~ZwPw&#cH>Sc{L zgVdGMXa72#C!ku9XM`E6H}TFxoW&}168zdIt$HuK38UIFTaPi5@y+%NaudIn17MB^1GT3h=bM{ne`Mh@Fy4=M!X zhEEecBT~VzYF~9nh?C1upp>VWid70;#nC_yH~d?Fg?t}12C79ikhN&*zy7_?prhLt zCtY!7h#rm*x(c`ESa=TymPgHP1Q?S?0O8I@#w)>(Ao6)0%}8~S@;B|aU|-V|Oa}`2 z+l4m725{5l;~8EJFd3*BN^Ip$rm%W8r=r7)0O?z%qqs88DP-gXEr5ha(ZFKqWi69h z+&Fy@JL)`A&WwB5rVEZYN!u% z)XA|aT;9Oy;Z6zhvJgPXh|(u%Qd8Q**!^gLY0gDArz@gc~l5HKW%-^2#5UveK7_@pnTy~Wn64vw)(LPyh%RUba$In6rl++2x zL8xawL~MDJEJfrg^}O+mfsX@~l0O|)x;^Ao{iVja@-^I5c@8z%i@lbvfMi@xH)auN z%IqQdba;$Fc#4zN^#|w|NuZ53AL#Bllm~}6Ld{P_J0dR4n!w`Ou^vX&>fu2*l~Bzo z*HACKlC1??6buKLguW0clS9@zrs(D1XI&4>b8&X*g!8YB^RK;W-pRm&pEj*vrZ1+t zlz?}NFksaof!}+*ym2Yfpa=p1S=6pS=;Nd`9UdW;@}}xPLrrEDkm-rY2smIVXgq+p zfTKtj1u3y0zFZ33-9mB^noc8ym6pW7dZk+p(*P^JgEgd&@&^a2ri2N4zk{nB*&v6P z7#>H5@H?oQo~(=^y5)g*Qt7Ga^@=7VA3Y}aQCAXD{5(;_>|~Xr4~U{OWTY4(En81w zf&V;_gnTO>mX7*EZt;l!oQ|C13HQ=G1VR&2ngvtJRfli&qBoWv&X1 z%!m+Wvmsr-i=y(Rw<_&Aw$YHw!Wx#f$XGsu7ZnD9;^gThGmIavS!mCC)#sgk}~}{1pNAz+9TOCJE$f@=FGeGjN+PeyG+bYuhk! zuKZEsJ9|yRpI}5N1%LRC8O!B=net+am)o&QyvJpQ(Y$C{X~86SwDZZ!LFNW2H+qu0 zTsWw7CpOew+<%B9!H;lY=vm~d1+1pzzm9z=zFLHaoIiVaVjFFHp&&2(y6MgQ-vWfx zvZh_bZ)-p#6Ld?WZ1fsTk)+m9gF>KXh=j zWwJF*AaB)4qhhDRE$2+;rLQh2aV(-~?Kj)IxM1EA6${XzdvWf( zU1kmHW__t?3n~@B*>%pv%TJrOoHK17&M&-R<`m|P6?g6|UdoQ*F32=gq^@Jd8F`!q zCZ&M1-A4R;5SXkT+Md$vo!r}uDQ5;Zv#9rR$u@hh#i-)!1qc!u=@MwkX`qmL zUfGktLh8W@iB}v*2mI)Y%Ap@Ox4|@{*7Ybz`&0^Yoj6ju1hSHi`8E_^&b98Nuf91y zJ^$z<{cD{Vu!4>60sim21FSbf+ChMYwkGFqr^A!edGx>kJwo=aFW2wiz4zrBgA~Gq ze|CmcW%IYUqfI2MkzzBf|Jh*r3ipt0yN!V}V9=SA*|O+yfe6+!Bw<9dX+B~4XXHg> zN(SU2lfX$x3ud!q5{|P85<6NYEb?L@k>dGadNxGrhCY(nPF^8M0yA(S%`$Uvn4Hh_ zL%;$mUF}L&yVBLJbhRs8?LLsJ-PYuc{2ktQ!`=+hcFZqq27&V(1p#|$IxFU_6+3g< z(XFOA!EUd@C3m6`-0-k1Ot@8f5VZKi_ZIs$7-QON?yvvXAIF`S2-g9}8sy;Qeg&ff zvqQgJzd*`gWI;Yfe&Yyt9{AAeTufH3+tCj8MVlMgYJ_h^Xz}yTeF&vLR&h%Xm*Vc? z&O{a2x$vKU#nXFyioYylzp{+|de`N+yubQq(@%H&*1{D1^*?2w=99nv2RH8@QT1wk9eG#t@i|6_fAYLB%#1disf|CuYcA$B3;t;(3Pn*WToymx@I1z-9? z{Pr?k@Mtm_p+zf3{DB5Ee6}Z&nhsJ!{{rI2Y%;oFCLx=Ax+{h@g`DLJK0^>~KO=^T zc-&+i>g}~TrBTcrBtyu}FYzw~llR-Y$bFoY4ta{Rmc?=M)MgKpp_h$0Rd4`S5gER$ z%+Jp4LB`0BQVw~lqPxNG34U7-A|wbNk$woVOCT?8Lluu=l^~bYYq(g!0}a`xKgNp* zl6|(Bqp| zJp@Xb-kBxCo*8yVgEtW)kU`FeB!1_kq{?z*;}}J1Qlh#-C4tcrI8JZ)zWa%_)((Hr zhHZ~44rz+CSX5K;Umj67*v_XLm< z{clAr?mp(`5x$tCi)Oc57#FbHVc1Aj}=gj(6;>}}5Ij;0eQbDa6`ag>^E zJPNPWnG=)Yl|^u%NDd58QJv#T2~{^gLU)66C%Ha9 zY4@9S5Ud0w<1CAF;e<2>uZK8p+J?C`Oy zPUA>s=XxA{6Hx)OkuiTxQUPZWfVDxiTH;yCac(JBzM*!WdQpbE$Xa#(FW3DRIj_v5$;Q$(%Up70j+uW{ z9nw~J3X}1$J3cT%SAAdw#q{f0EoY~fv z)ge`BHi6~J_(7=jI~PX?7q!H88i~@Z7%AF9P6VLuPY2Gbqi4_P6v>p3C#H8QE`$RZ zJNq=yz+9F&-1ONgz@1$G!id{m&<`eN84XLjHDv(T8Ix1sG)mVHe3}CXj90h7|AOz_ z$N$DRi?k)wFX$q9(1Rl;5kk8>ZoC9xb|pH;EO}CsbK!7it@M>ywu#=w&83Z4mjrCZ z=T+43Cjt&9_fl0QyAf?o|7Nsk@L_SKrw*%m8Wd z5RmTy(wx#fy*yxP^^IFA&IhKG2U`NDfY)()9EoZ%&W9mS&~w7YM9bK&?354Y>knM# zeq#LmUuufL>T)M2#cmVRgSv~R21RnFWwVb!aPVZ}w4kHGbPRJ!Z!#JUB(O(xK9Q%` zaKYH@gfBmZ8T>W@e5Upf(*yS(qeP4F_bacR!D{+l1YO23Z08#b=J+eo$F_t1(Z;HYpP&O1HsV+N+%2}t4nQBc|x!=utWV6Lgryy zpaROE=J*Ov6i6*`tCzhjDIE`|uq=3*%UuYIsY&rIO!&tXD^@fXvR1`;O!^?EFUK@M z1nUnJ9zXwnHng7vR@u|#(7ts#=)ELm1My(6FpT1Qg%y#k18CGe#?qFoj}Vq7vf33k ziYusTkaY{;FL(irUPPypepg8RO(#cEQ&PoMcsi2Dv4jTviO;Pu4Hfqs!y}7l!S$|sFzD;MLz5S^6 zU2U%wHJ@zm?k=m3d?d~7);AyR)}kG#AgPhut~Y91Evg>RYwu@1os(Dob~w!zPmBY;U%pq5<4!WvAZ4YkYrn*sSkC zrOLMId#zfdad^^pXZXiI;be4=!ULu4Kf%~+zW?q2_`_+|p8xIgCPsHIW8eTP` zKZWBzt-2Uxm=U&pZlsLVRfzwE;{q-h{3)r6u<}N#T?0}eXq19Q={=4!h`;b#;LlzP z7NuZO3KpecaZ`dt+ePin7cpFsb|MqF3Kz9EFu?aUeS-Ifb`_1^v=)DVvdE@MDZgzp z%8S*ai`$t{D*(P(;HT{%^W%pM zB-<-@nU{I2n(6)bH8)Lkhu~CTed6XWrCl|zU;b= z@7V6K*pRL9`0DXTU2|S4byNQ5W_UN^ ze~zYZ(El8*75Sf=mGKx^0nc!g-}`cHBFxGuZe|U8x9vuRpaD!@gBxEbwlwcfBFT|0 zhdmN*))J8gcezZv3thi{&HW9oH=3a*+~mmcGj_O-KKgX_a(IrH#%G?zp10rJzuSIu z_qQ)T`{+~2V9Gm`UAUmnJ5kiG>cftGh$`(>eJI^`*-W(No{ddx0z9kUefRv{`fp#f z`?prB?c44CXRF^-pATv;p0_`1ufO<49=LkvqYLp|M+Y91v*Fl2ZLh!k+kgK*U1{dg zHpSbw-u>7AaL^!{XRr^b$wFeQxi-%17=SBQ*WB)z70*m94q3?p zbz*>SY$$QCHIt#6F8=S3LXBZ6nR!MD36s0OZoJUMRck{Us>D0D%3wuNv z0>2DjR^E>Mr@0;3Zg$U*fC|y=HTlaHqN0ZW{l7WJZ(MxUP%Ou6#K{2&q0& zSdT7(v|%#IC}L_{oWrq|H4f!VW(}oQ)Uf>~gT1T78j&FC_O7pi22>$^h>{6II9!-$ARX&%(S6J^dSd)6o;BAM1CGj8?e>Bwrvz-bH_-9dj z)H~_O1mhfa3o*fuW>tf4#0oQ|EHRc>m&>5VWzga>@fE@yGknF_u-RzUw+<0{q`W9qUX;4Ai&9ovhSaYHXNt)wE3}E9qDB5dL8yy#k=9I` zb5hX5fJjq_HU1Nv5wPKk%G4OMBRjfOOkO*HwiBs`KTzSAJ~Oxi=}2nO6&lrks<9mD zqS6srPtF4f){>b&$(>PPA4cj#I~b2R%1Qp*qOzj|)`Pqmw2yLW*kdtRypY)O#~Ra8 z*bsvZCxylI!Ghx%yw1T#wbMb+re?F#Swmy^7d!q$Uq3+3Cz#UxQ%LQ6dhb_wDDs+| zlT5+;zqySxwE9>}-v9FU-4}tJpN4S#L3o6MSmu!x)Vu0w=SGfk2Tu+2rQYqo7UI0ol?F1$rVRSl>z1S|(*wmHA}0=yQU zP92kYABv2^o*yGJv0pd2-HXL@0b5LHRzkhRETvu1b5=^PviMwjjq`hWg2(hPdx%Fh zcOXTzf|I8PIT#-}F!8I^7r5<*p}gi7QzS}H9sko9jUWB(o}(H7 z_tW(5J2zWXlIO=cqi8mg5pV4=*a!Rdq*AE=GLy(b=kYqDvPdpRgXK$g$7Q{^J39@@ z@eu`fj1N?el7NYWn4eB3ul;sN(aHOuRaXuXp%oDy=5A`&IF$^?7Jb@}W~Y;jQ6Kq( zBcnW;pF$A$v=3z%cD?7Ocb&m-!;52&zY=REUlWvtkM?Xbh4MoY;fts?15xg6MD%o- zCGhl~aD)^P1vv85RWTA(A8SCF`ZDv6h`6>9hm6|99dusMHdB>hvICjI=zK&cf!Di?4`|U@FW9rnZ zDCR%kMC+g5{^IWa-`xNFSA)-g!vt~J1vhYvxc%jCzx?%YKfm|+7r*)S{m<|H>dV3B zccqGl%0{AO2k|}ax|@u}LEaV<;y`z<<#7;00rF1dp&$nXu}l>S3@q5vF3+k35z(i} zK$E$d9b+>?+MuNvwK6j+_+gEQl&%}0rMV&|cinXkYPr%(Dh1uQa2C#$-bEf<#BgdxJZ%orrcgU)nwyB04yz}+x;uZYMY^ zb7!qCL&^{4@KC!2GP?nne%sDZ%4&M7;#;js@$D|bnZMV0&Bit1*k?A+1*^n+;Oas%q7J;YUkITGhh+usi7Y17HR#I2`=*9Eapi5#?{WQZG1;;Bq* zBd|g|UpXC&&gm7zfc^@_7zj>R#L{r7I^V3ku<5b`$*Bbg z+`)K`%$g>rPHGT(P+O#sJ433&lxEXr+_njInA56S>3OvT1YR?|YUR~xN>e^VEKw%v ztMrm82nqqc|DU}#-)`$j(g*+7Q(W696S74uc9q>l+p-}Nl5k9sYyh;%EvR7-xD?R> z0TvdCEZKefL1zA)bNV&<1?C-oPcq*ZnUR@y13-#es^{X^B5-dmk&%&^k+JsRUI;uG zyLCR%k9qTB&Ks6U^4yDA?*%OJ{rxG~NVnTNJsQ5C-A_StR=@%;mdWTdwqb0~PcCqmFg1!noOMuB5XNalBEcl2^=3)kpD z)oHT0SUb%ak2X#wy{$WUc8BnEm|ooBy1f&4^PHW**v+G;@@hC6VtMi=u39k>1O8&3 zcYM_lvz5W(^en8iZDH+by&V(?Yq$%nBtr`ZoDxe`ddScPL6i=D^S&Ug07pcB+&`H> zaOJ#@qT3O4a`^vtq@&xsFT<>|aabFE+8KZ9QNT6~A^B%s9#BDs$-!tij+3L6y;2a) zci})?1ySSG7V`;*G7@7-hhp6mIAd&}lPK4DI++ft9ocTWr|}e2ZGRwB7|6xWnMkVH z(i~B*p^1>+wdu5XK^NfaO^md#+Cv*bG_M*~ug63MQr!V|awD1vo(BjAvQIRF2aq|K zq~_EueqZM*yMSzv*)4+eCp55e$PHi%`z|LK8!O+OJi}J}oZs+4J~B8o!QfHi9J9Ue zlBN646rHHzO7~v%h9gOI+Sk{qddJTcpZWDv_BTt_i=R2NeeV0CBZW(=<_e^$4xV9! z1p|{6$(r+N95XK$zk7tIYXAM&VmJ?KBj?Kew#9{?WP>&HZ_X~q7iNR*=j^EVjbbdP z1nbMpb;vDD25}V-;J-quT}JG=>zY0AvlRH_9MBB#ZrXB6u-QuizjVpvZA$EcpQXUZ zIiMNf{oLmiVY_DIH0%4y{SR^)H~o_!b6&D%cNj=wN&`XOj=-|~nC0ERIHQ@fr27jf z8yYBTJEH3U`LF-$e)RQUA$I-x|NPhgeRDZE7wRrdkBS`*!kr$OGs!}}l=S>jqAm09 z(mDNm4%!S(xlD6jx)!6avWs^RANP>;D1YNj&V(nKWwTKLJAud_EIHCQ`C?$yF=Xh@ zG<#BKa2>$59N*ZIgw;&)OppS`COuWYj*HOqW1xxUEPVoZW??CptqxYYG)DZX8Za)| zsVivPWBHFLk1O}6A}6H`40D9`2D@ZeHtt8@0)taNVEXhkLkHTvJHzqi~N~yne5Zv%UBw;C3eAV zSM9Zo##tL}S~QaZxV`Z_LrzI-{Bfh(J?V|+ust*UH@Uss8*VA*EuCW{-s{MIfmJk4 z^~kMKI>(mzM3Bp}G?Tx!&@IrhTvzB8G=<1C?f(U-LlL5d(uPrI4|l1Aus6p}UJK`$ z#_Kz2Nd8grZA}fmjf*Q7@2EE#MZX!L({CHIXpFvT11O0}-kr3ULrfUUi{PWy?}KN< z4YC2>Rf?T!FJ4R;ha<;eo-GhwIJ#yS8cKU%(T*HvN$s*1_jXw?Ar%QYrUOaJYOYUHmd5N%Yfn)Fd0pqs2tS^%*q}G>MU$idfc0Qh9o~*_OS0EFWJ3se!y-mdZv-)h zmgWuB;So>IIiB8=ZEg6iL*-W(Hhw3x@>*IrY#fN*p$@}-y~TSl82TwtDtU?xWw zw zFtccCtU(~Y1(`V1tGHS6ed;3xc(vbzf!v7mV3iWm)-7w^>pRMGsc=_Dk>nB&>C2)T zD%vF?J^IUyzr7?|5=e@gQZNm?d5w9CN5zSlJj##UR-ZlR?MU9|wU@jEaN2?uQ5y_E zf3w!bG++ZUw(p2;FZ=7oM8rTI@D> z{X&Z762OOWacv+dl&@{Dfv8s0XlW()MWOvkEU*yKDp}0ky=}RCBApx`V+=IY5fp(o z2~nPL_a_F{p-8^_F-AL!N5|<&PFaIFpdB>T4Sgmv8J#Y`x!Zl|Pcw>-V94wof`Z#} zl7i#YGirxqA*5k2lMOQCP(-G%hxHPw3)XLIjqz;v#f}7i25HY{w|#4FKT!NxlLz1P#G5M9VbiF|LiJn}fM%Gl?a`&(@dBfE-~RZ3Rd?ae*)ZR zfC}DWta=wPcm<%D~81j6+M1BQxy!Eu&Vp!`otCFRD0aG6ONjl=U^sLCI>5NoK)a* zMFWTwM(pSUbmWdpYYV)7SbiXcAbDn?yXP5t3IG)q9mbXhl(=OvPglc1UKy6t6Uwfy z?UTu{AG=eN5QuW3ei1dT``xt2p}gkg_~K{*oUc zhWC8<1k>=ba04=Ckwr`2BZ8eIe_f?Z159+=XkYs$$$=!>FP;?0CS<9soLgY>7==Q5 z@I8i4Q7Amp{m`^0VAA%Q#^lQRHce1dUO3^V2#2FQk5*c1$~j5`xO}Dq!cYkhvFH)P zDds0R4Y|iDi+Lnnv42B)Fh(?kT?vR|Iy`{(h5!J96&(_eDH`my|7w|f$NKAT8fl1| z$rwV}ClqigP&ol+&qfE7ghtGM|CBjoD3CO5Tiq z4EPovEL)Lj!^~g?<&7N`!P8Ix=p8%9wItG8&e!lQ(QYn2%lgg5QuJ10I>Dyph-4by zID%b6($TgzQA#^_+K(p@;Ge4RzR$1pQDA~a!V zG_F8qG9X3-&CuRf;7u|GN`2WIttkwOZ04~NN^*woZ7cb54qW!7iK;z_Q<$nu5IF%m zw!QO9w|-+tJZ7=fdkY5}DWFBl+j!wmiOt-=FEJ8_@YE0#2s;EW>m|U*2msA=GI6V7 zEoicQ6#z1*O|wlYhytW#$bpYEud%$k-T9;?`q>Pmc0`pS7S7#ZO-&Z&T0NiQ-gE}FUlsP@ zkg!&UH|Z&m+FkG{=_TOV0G1R!gbOUqCLvVD(09tCt-_AU39@+d)#hec*kF!Tl#o$V zm(*K1CaYAuWAyp*Z|Rm?Ms+12m*#3yr=#9X+I8mZwT^hmlh;5m*Ia5c+--O}Sm+#K-%=Tvu z1#H%dB%mBm*2_3?H!kLaGKyDoZv|VB-#~D~hH&xYy<$^<^vTmk`*C-B{|Qpk)thPF z$+A5_0ItqkTf)EFYkMH}@NAN_n7Fd1TdbVGr0L;StH~~awr_ro$xA&XBc3X7>%dX)o_)XW4?YTfERw$@)?I*Q> z?Aqf@05Pm^C<)|a$KfUg$@YFHvvE`SUQEzDjcILHL~axTlBZ@t8Q6R}pGYvRs$fkR z?wl#ff*Cf~84RbqWmcDb>2`tJZWl9F)Q2T9=W!^)av&s_Fb{_C?gcW_t6)i{)M!sd zNZy&MK5;sS(P|D|K;@GAn6br@^qiqbV!wzUD|2|XVqrL%Glg>~mnblDR9Q($8G4GBy@(gQ)1AnY|mmyVqX+= z)R%@l;~4bO7$ehiZ#4XevC2Hl7v(2p^iDY64boqvl^<4sJ#@{hK%N6I9G1$G`6PfS zgXgF{p^J>D8Zz{WNU6A=A?)`>6hmozK{aw3OO~Nac>(BTB~fQ|wK-}CuUL=@Z%j3S z&WoEfIx`iwwkmFN(>IfB2~Iy0gXTquCeQfW5oGHY;BdWJU1l_#)pLbYnLWCON^U~=-GR0TO@#;(qLbT!i)^H`EJ}vzM(ylu1otcM8q~EAl-tn`43wS~)i@A} zK;aGhO)A_}O)rUeb+4!+crQ2WROBq2E};eP2~+ck+Ve`Day8s2+I$u(*C*Ri(Kgoo?{Ys-o?9HfLG+ zYYIQV6q%|(v$|nrifGNOY!WJ3+<+RF_hHHUv5J7t?-rkB7jZcZ#)Wl(krsV$ROhiEK`=+*#%ZKray%MC=p# zp73h}9&7aY`0W-H#TTr7Jk+QO!zqlEkX?e#SuDSf^-vU#aDv%woE{Cw(u#60dSrQT z0tb^p3t?)S^d)pg(0Vi2N6qFGD#Gb3IQsm~zK%JPct@xexgr7kG7$h0un^$EaSx+N zpY$TQR0BF(~Y~1N|LYsGDi66Fp z*PJb&2iSNmX_@5>v5*A}!p89hKmHWX{<0G)^*z1&8U)0cx6>n#Y=N+1&!j@u%-x6K z$txaoV94o><3R|S6%Ja)%Nb)!SC~Z`8_GArI(P2Cy^@wmf?hZ?<13lXV2QC9J{-v> z9n6!kn~L55A?xK3;_^;d$#s-Vjx6B`jKBCvK1u${ zqa`q47FC`ge61vY>;{m=i!WqDXmT%17b0v*4~ArXe_6P5S@$2+ID_K_-aaS6B;K+J-?C_*@TyZ|PFVxFjMJfP55q82mR| zLoX(YJGFt{lnw58+oKrKEO-XWUZ_W(*~^g2-Zq)z(~y5R>$5#!@Upg7;ie0c4^>R2 z8-?+j?3t9WF0GkL1wpAGC=~>yf}m6o>^(wgFr+2_HF{e6HQGOZo=$sbXR*tM02}5Q*XY;gDH*SPsVffccN|a40+yBh@1Mbe2iYD4(hT!JQM_JY zEJu-)iC4O&CWWpDaAVH@fIG1mpkYT;RsSI8=Hr+Y_JfA90l74SmFb19AuD=(4iY-jwB=@oiVbB^<^_Z zDO*`65HUQgcRe6h4nzRWA>syY`?rFTv>3#;pYTW!p|iLp7$*jLFN3#!g==l1O>44} zVU?RP9gq+!gouWy6=BFOKypBG;)?DyQHo{8l;@{{FwOItNVE`(hx5~FH|w=0-R)Yd z-F>*} z0VdVlaJEi!1ckQKprr{=Hl^Aqh}5AZpy;zr<}0_t;aD^lO}VTGy-5&p!G5wmnn3WE zk*a(VwaFivyeNuAfDU&@KnHI<>boFx?6Z2+uZkLke+oXLr%(v_I!3VZ(WL(}hPfX` z4je$7k0iObbTiTI+$9xMTuw2KkauTSt70naS8jF|rvg+g88D^YH>P!>lDK|$f#FHNOEVIb z`7=Yr9nw8wHI6~>fJ2cI>~}1LINuUy(GoF|ddv`AZt_~;)oPcMHqGnx@mU)n zV*CU;1EC_WOKgq`kmO45Iazdtk4RECbl$5UnZeNlh^Qz zRv0e50A&=&S7vFa@RT*>j3IAucz`qWbqhARZHQD~C|4cXDE-Urf&wW`}I$_|Oh#5+7kL&E&MPtIIYdOgh>?Hzd(;T-u^%xOHt)C~i_z zptb$HQDM&k*9_+f1;=z-{4cBm4gdM1-mZ1q`-j_)-9U?LnK#M0`%m}k&F)_9N&Rga zxMJN$&HclJx9MCOxMJtE?d^K2m7O-Z*a)gBMw7(aoHUeJa>e*o#z*IOKG5*ID2X0{tU2I2B`nTFHMqNJkfWC$yp zV5R~alKBO=$xa`JD+rTm;qyHS`tT1qSEE2Sb<$mGIjgYh$jY@!=4@-mMTTwO6Q%T} z+jOX;?Nd?v1u1QEKn$Dn-|yu%ZC1997k_hd%Va0Oug>Hw6qHOBVrL4q5UC@q!ueVY zD8Fix{bhlYlF33zps*8P6HsO~FY613!Ikr|eWb%(^)H z176rM9$LlmsCpy@2O`HAwa()H@Oa4Rqc|VsNR)dtYzEGHh@UGrn}8{nO3VJ4OouNJ zEp+5gc?W(L7R;tZwYKf?gqBB;R7k%ZtYMomR5(zsCHIiV24GZB$A~{H(z1Z);ckz1 z5e>2WW7u9HjKsj?h~Ze|RzXg|h$I!g7VzRfhNGE9Fz6I6iGlG?7+*#hqbY_9X5NQ) zEpEuZ;UsxR${ua|%?+XpqyRCGT|Hl{YzhS&7jf9CcModq#|Zp)jCqHN80ZkZJIc-obR z(O?ls(OrclU${anUM=?wGIL|3VBsp`v|nHr^4k|1m^OtuosQh25J`H09YI< zWmSXjGZN#KNVI)>^=m&sRKTCxctZUCHv zAPD!{g&BL^A~k!WZFQ+iMMekRB(7lTg{Y`KHf0RCBxOCOUIE@)ar{yQ9EQc~Qv_$E zlh`s<*rK>xQy4o#n|=aNNtB#}J0d1zSa^dYyBC`I4luSj1Ny<0LG+I-+H!Cu#M~7V zk6+l^3gt*kjN9F0+d7y#f@Ax%4@JHsXmA6~Qj6(`bAMpt+MAGsvo(1suu=8;&(I#W zRi5M!5&s>#IiK2*twCr)gN9t~GW$Xv75`)Vhs$ZEfAnmVRj=E#Ba$&`ASREj?{l+ zS^>Se9Z240$G>v4g76D7QT+>R?Q049VLv2ryTpoLx z8xrZhXN^YSZ1G}At`4_@&FFE8PYZwD{JS|^m&kDh3nyH#m;gGf_Ef}Dr%R+?NGI`h{ zs6~sw7(2j|2gV^(ff_^h)kx!(O$!4006A7Cs)2{mEn)_hBPgAT`_%SLyHYL(HNS3a$HIWK*AbRt%K&RK6yv98(UlS7C#?-AT zH00wjE^{+9bB*49>LkDmy2-!v6;-^-ea;RfeQkB8ZqXGuvn(>+OUV*%cXJaTEpvbK z8^%@E3a>HwYem_)LUTlCVnup#?W8sp#hbn_+*)#Os4&TZbToNV#%v@pKs~}x z41y|dxyGz0GI95L6M{V1xTFOmv*}k@p2=i%OQCw*aMkpl49e>T%OZgFj7P1RI^6d7 zNEv%=&Xi7rU{`}4Q(D-at1FG*3|tNsg>$4O)}N(qOsp_k=)#<-3gvp2*VC7%=#Nx4 zvwmwLD(n<)cI-&JP?yLirqF{UxQy}IGZy&_2>m?ncJ`Xkx$yhx|a*qL1I zrbtvVA}a_I<`bRtVhWbRz!T}tnz`sTjF(Mqz|)-LQqZG(w5H)SP4Axg4Nz1%`KIig ztiF@mK}(xN_~aU>&bFB)J7Pkt|I+3a^NFLzr6l%NEw4{cHVfue>FD(GTN`KCbthC} z<~p2ZLbYs*3;55%9m*PqDJQ8!YsjqN-z##PQ$d4nZ3TSh74|gKZkD)sP=wz1UQ3}H z)Y6*kQpXM~)8*hxtlhP4-HS2Y5dw*=V&4ft-NM&Hk7OYNDefC-iWmqa0Y$96=q(^J zH`lPzP32iixG^n3 zgz5yFyYR=UwY$5Gy`Q&?-ru?%NwRLjvj!Bsqv41~cQ|CZEcw^C=BQ*RszN<}!a&Zw z@fz(tZnqB{UoT)GH-dG1kwrYaKtP<+HCmcooD!m&w+$=JIn|8dAVtw)PsXE*HCoD$ zj=6krxCmT?7zBD-Ia&u}W`CjkjtDidH#t-pPZaVX>l@{8jNuTy2|;+1<3$VhQ0o|y zkIbUQjcwL7JFU1KaShHd&O*-a5=8c|hmCrB%h{^PWEe=-F>s)7iCUA{vz)lg7;?Zs zV~y#g)Kko#Xl}uF#25yq_c^vOYcz-KKFB3TfmqTC1`~_T$y>sBw~i%v(;d>9%^1lM znzq_Uo@j23|D-3?YK_QZI)cOzd$BSSvcshhEqS?)xQhJ7TN*{MiHg~013LxXlZ0H- zLL{Qi4mn7)#HYD(t)Ms}U4;{|aR4+%3}a?SjL2u)l}QTX;VLeigWCv?)~R=&)|z{b zy+;8q|pt)c$&G-d^8d-DI zOz2U-_{E(Yj6V;b`L5l6AgVKUstkQb5=rDfdulxEx3>BW%!@ht{>QVEvm2Ug1Z9n9 zJp(BJgh-V!96_zG{T^b3K4|SkyNRdUld}sD@5wy+pZ|`&x_kHA&9Cm>`}P(%lO9~c zPEQd=YkqM%s?l$h#c1O=i>Ky}BR>31s9nes!z)iTv{r8d5t?x_7EQ_#>|5#621PDX zB}*<$hyeH(;ynTj*#>NCjj;uj3d1oxo}LbIsUI+w@GD8?DTgZf2DD>+!sxbUOipqB zqY``xV1e)jmk|CkT&CZlVno}CxQPR42<3N$m@J&- z0&vi6fENV^qa7@ugWx#d2}Csi6Xwgn6~QH}FHRm-#XcU~!Q2=w3u^axiuk@TZPrPU z$s=&#vxl9KGGt!(($cHALr#%=Rkz@sDkun*s2m zgTp41))3LPW(Z$+(x`gVg~ z>VK<0IRIe4-ir2{gbFRU>i>F(a(Ex@)SlEH)mu@uvA4Z@xPt@pR)k&wXgk_%JSn5Z zeE29aRF?Css-O2`&ev>^S@7$0M0F4d`+9kkc^JKZlh%@s?c@~#vahZRzJc}8h z>q))2{kVoR?m=U>QJ%$RN|*N-v90r9I8LQ?nT&8b)dTv#=IB^@9;1y;(*&E+(^aJM zyc5zij#qmGqGEbku=xIN3&{ti@9#Len}sZy@?{%>e+;yraQmssLhsd>|~wXUh?LxvUm&{xFRoDD1Nh6WL2I>k0=%68ln0Jb7x(M~BRA zgn-ZWjps-@uwmk&uU%_lYC&4S3;@Cqt?X%T>Wn9w$Zc{23(2)>{$gsL#G|vd>zrJn z&W{_Vr4Lx;R87 z4a_PQt$an^*G|aR)^N5XW-wK_NbMkIV<6sxf)IX?RqLe0*w@uc9}Re`9z!(f2A<+{zc`pI#H=PT3nqNr&f4Ug61sA*uB`0 zO-<@RXh-_-6s%42Z_Y$`DYO4(TZfSr1b&p*w z+~JTGXN*lV4^j^46O%`xV*7gLYh?3CXtz0p!dJ;b@`<*}Z7ipQWjKlvqQg~67EB}9 z_nV>;yOz^Km!`vgxwE~PBDNZ&=Sbf>g~vyAgP46WWgepH1zcq&uWxR^_DK+%I%KnT zA{q8avngRTYf3;Vjs~j2 znA}9-9K(abHxLAXfMahA7sCm`#~^lE3`U4v16=9|R$fo`sVkqsc9#>_JcI(>#vyk= zz`8|YuB>UK$ri>k`rdL__hJ7zKe5;Zrp+!lixk1m`sB3tGM4siiCyeh)n_;jqaW@g z9}|Q9!8qb1M({U~52eu3mC;(@>tdt{d8nD&SeSZ;l2wR7G3k~!lNbi3@Jx!$O)=zS z;&znF4+juW#M%TNen_CPsMtKp0GaVz={DksjQS!xnD5cd(31yOux zX(CMvk0yf@4xK-5Z#)N8Ch0FZ-GAKZc29aEMnX9~149BU-|ucTE$-9od@0!~C0nIr ztCVb&lC3gX@rTGo@C)Jv!66hvE#XkUh#Cy2eB6VUT-ZDNz9WBC`eYwcMqtY7i+7P5A^0HtDtm_6n7BL^R%Pb7js)jo_#K3BHmn<25PPt%$F8`uKE**wXpn4#)OOE#r6+bzv@B>+lkwp%x+FtYX0)UW{y z*9IQJ<)aDPpfb5*X}0@;%y!|J5}zA!iHKFyH0TM`72Z%tO8K9M#_`!dum^gc9Z{l# zPGdHiPbX)?zTY3)4F9LTqDud@Wg@o zhjH)5EBZ~ylES_rNYY-w6%~M=Z%Wf;%zRM50(tu~V{*-AT>j{ev3Wljn*!h!qe;aS z*|lKQhPf)`W-wHrpG=V`DKZpg7MQm`C)(&v#y=)Gob!e^jC+!2y}WQOrN4ECNU>Qk zoA=?z*FeMvjvU~=+1*lDD@DNMcve@_i-q~Ctx#zzgPY|bZc?q}_4T{PTE0)Pu zaiRdc4O^^1_3q8h`TcjiAv<7y~sto3b!NeHu^4;x&~IwQMh`SIa@MHaEIn z3|1k)M!fs#T>(d=#~yeHZ?TMzsK1RiqkA{6I25dHhUCm03?a5TKm5kThx&1r30d3% zJO-ksfeKNbCJt>un!ios5th2-Y_Jh;T%k?sbi=>UZ#8^rCl67Ep-xwq!<fn^Y1Cc9y_j#d41PUqbz6cW|H+=~7swba5+@7zIj zl?&Q&{Ado*@TL8}5-^OL!(Rm#XK2az1wZchwxp8+s>7Fi|Oj#7(MC}&rXq@Sr2Vn^eG5`xZd_qsFSZB$63E^=0 zJshp8k(-K2YpyZQb?8I#fH`Zt_cl~Vb3oOX5f+U6eMhS%yQ^ZWhq>~Q+Z4J!?Qxkb zJF_b1D0Xr4y9jl@mkQrSUw&B`7VS~)APCutE1uGv@azayoeSgm1y1x=anac=w%X6E z&AQSQ|6ao>*ncLRwY_LF|%AyKd?NXmrhOk7<9yxZxl9-`^ zox#m8RmC3fI8R>W9X!iV^-+90Cq-Wq^;Jw{h1>>ta9@h)B+^#kB6-iI_&=a&9P>yOAnuF*JQ-^~KQ`PjkQ_&iHX)bw=ip zct!pUR-T>CMrwSfg8A1$CdG^PEUjTM(^~?DmbBCOX{XZ*421P<_}8?VN629*es^tt z{q)%Z+@x7L-MvCfXeTx+doo;=ax9x(xqp@45(J(x0!_>03;?o9r$Ftu4W`$M2=K zOYxkU!O)$V%GTO4T}R7!2ymMBZbm;w8z&oZ6xevRkvx!eR{6IWIak@rx0j$ud$qK* z3jVLYU9yhZmLdMZwe|Sdwff8RVAGN5-^vM&^Auz1HmU%dozcR z)_(P`V)*3Q3M6Y*W;mZw61JjggYZ{tAiVNwDFS-ShIq8>Wq;Yr!KwieKZ=`I>*D6s zC2;e49o)PIZaU(S)P*ht?u;GbypcBJ&k#7=J^zcKN1uHo&%WieXLxslM ztt+qB9r|lK^c4%^vK#uwk5}4{R-Vv^dKypRU6$|5OXSFQd;3z`?Yo_=_c&9<8@&Pn zRTX0CosD25UIm*EM&Gdexa~j_@xs6Rj4!J{e!@RDKVvEUZ;!7WTFLgDGnHm@`An>< zkk}ddTqIgR&Sd6PE~G$F03pA{>s%F3b>nb6TbwaiC}N?FAvoBI{v=LnX~lu4Y5XDT zM`Unk-uwY$>N|JvA44XYZ~UR*lI**5#3WNAKlajkK?O|<$;f>YLXbM@%LEk!u-6$> z5Y6%P))h&VNHeR&$R>Ek+{W7_xF zltg2!Z6n4Eg0MHX+hIxciXe^cAcA7FSAVqIcvRopt`nwxHuSX7s^1jSYBm7kBL;&c zg*~mIXT)1X?_Uf%sky&u-uN(+q!5YCJOgZRX$3 zSW0iJcoZoTnMeuInf@fwTU52G4kR7Ko33x6^Q`mlu2lM^E7p0YWlRI^MewEbT+1Mu zIwbPJEBCdtDS$TUrw3*U85jk}9?ldSr}t@xQU|8`_Z`XAnP3=uEJs-XDXYT)gOQ8 zz&yizP}5hGbbR}+h6<$ z8RM!kPrxGquZ$GlRmfPBd*L+g}8hn+8S`jb*&hbWcpkEIeFcD`^h1;#Lm?jo#c zKfbV3*d0sx{(@48?oi70=ZsjAC4kR2&+cyi_4${bKU`U3ZjuDc;LDc1rB#9sY^4O0 z1(iJHrcxRt{8p%3PXTb&MkEcNtJ3)+0hSg|K^7Jd0kXx@Fa^bB|EqZmL`SrNRbr}o z=XY~F8p)EY;M4-C;uwFY`m7fpkEiqJzr!}+{O;Y&&iS{H+9@6~Y9!YLtKQxG_W7Hy z|M>l!6V==NM{V=pp1=7DzhwgLgD?LOhU{Pz_h!(@B5k~|b**0!JoRtYuOTUX6ptwh zi?(5)_=0Jn5i1DE0p`OPsRV=tl=~M-(1ejCgduZQd#9o`5M#f80y+YlgQJdVPxaI3{H%qnI8fgNe>FrW#9L%b3EH18AUpD@_0Mq689p)DMgfq^JWd=|WpZhmp&MxuaewF)Rx zyxR;_fA@Tt{7PD4$|E#pvO3_GF)6PCrfX;``YZvbK%NoP8R)-Hb$1_lb#U1MIy1zr ztu$x0wH1Bu4=cXC52U6~Xq5U)YPyzflfOq**ElD83xTmlVwe=LL#(Zj(+#lF@0`Xg z-^XhDI9tu&o7I5<@Nf4WL})CBCqruiEnvbvbET4vn}&e{hZa;t5pQ^0y=e?PSCZe4 zku8~Q4V0|_W+%uq?&#KkK6B55aprLQtn`^a&#M!#{$U5wzTxnTIvxu5mDud{JR}d9)qtGL9evBRp&O=Ax^cg?hX?2WOQ}WL zkxsX;sYy9g)fdEm!}~fqb-`nr^f8=gx ze{g8_s}PFc`gC7)O?IUX?LfBE<@>4@4X_1g62Awr!OueXlEQ-K?vgGpPlGy%dkhPk z2Xe0oiiHD`$LlO{I~4}4-#fm|QelP}v(H^Q;c4tc!=~6D84kogxBcBOr)7!wPgw+y0P+3ge(pS z@W-(Fq7MpES~#~?dKRuqF=doVu8O*om-(g2T#q=*Y?3gB=P)057nZpm%Uq9FHp}2v zd2MDHXskSi%UqAvEQ6%=0Z-uu4N^@QUX2&C4OKcb9FO}KE(%OT~T?EqF*z0caRL+aAIp%Rhm3=*J)K*9^YlE z=FqAV^l)8Pl^@UXZKLRKQw5MbrE%3hi<$FXk6`l~it=b^kN;@AIfsDny<~Ybuw=rr zx${-OWJ9wdTN7dr%^lPj4?oEakDd0khul#!hB>hBvtilXxC`R4J?WhfPZy`~#X5_@ zB|w3e+ZXtb!Y;;eqO!qeg3xC=gtuszfjY7cKbQ(T*On4_N<%TB8l4&;a}7vPD!qJ)oI7D70f5Js0!lEcjDR4a0Q++ko==GOdE83#Ws z^;SH|@+D%aX@oo-k*zE6+xoz~ez# zge+{hZ51X#QG~vl36kAyzK2y2?z-IiKw&6sdqMvYzUTZkTs#!JrD}kL#59@=g zTh7j38RR?_T7H8ikajyf? zs^jSU0101ynSsZ`8l1aqf*&1oD%q?bv=;CIoalmC3Jv^4xfB|BT$DnCQfL4*13U`p zM;JYX179sVs5RS-?Ze#~ybTYV(6LI``BL+~mMbQ%1*PUat$A-)9^I$j%M%*xO$-wS zzC$wABz5bQ@oNcf&p0D$`FA1b7yCxnFK)QdQVbyNNJApB{_>RdCrf$CdR&yJYbAQk# zU@1@8@|2Y`Wdt)tss~HAt;uP5%C>FfII&SLg~#Q!_WfRK^MuC_7RQKYrZ-yi%W2}b z5cOpoy_iHtz5YuvAy}MIJKu}?hyc?=(9zNGbco1&jPz!$4790tCsnpUI+-$!zLg1Z zU-Ut-^_m>mS<^M!I?XyH00+jyk2hVzR*pSAZBS;OJ~({%u-@$cT>lm7dYeivFdMOL zLuE0KVLwMgdqusdWuGlIL+aJsF4HrC_(XFAibNFVO4rnFF>7lszSJl# z)392oIeJRj!>wr%R|xtytTQ#+o2xf7K>6UK? z80sLUST$&xsUN&Ghc;}gaM~CPJ7>Z}lQLshQD95+2+@{?W5kzoJ5FXItX+mTbxTrH z%GQrrP}!cMEMrS!o715vj+Ve@Mq3P5&iIocI&wT-j3s_4QY_CO$n>oO&-A?#xF{qj z+j;bpVlJ~jvN$u)keJqkh$Rc4YJNETy#TF&1>dt-JUZUmvOBZvoi;bcM`+cz&Jb|8 z6b;}#TKiRG-Re5SW?+|8b_E(j;TdXomPBD)2$@ow_d~luR!8vNI`|B0Y-!fUEo?&A z>3gyl$+>D*D$0v3oEUr=V>nY|^S(8jOIwdIEM2(yaX;)&7UQ`-L@+$&T%@_VUobg? zG3y9P7fpx!DW=1jy5B{cn?a#8KpeAuy?K9jGCYROrAHIrdh<0Yo0yU;{-lf|;cPKG zsV3Kka4q+7%7i=U=6x|QWoW?kGKzl47IucS>D(fWoDB7e+IGSkAUTnK+7e(Q9-q?K z6G_Hs;NRM6w7XCCck12U#>0KYSh9HX&wsAh4^r52xXfA^UarrF>-Fhp$85y~JEkmJ z$6$lIMuLo2!^vXy_NK4eQf628i`7ta73mOJI3%#8KpTsb4`8;Nq|U_ZOP&0Fso056 z6xMMErBZaCrIM6!tuCeEtbTenhrxDw0Xu?wpNq{?o$Ee3lBIL|{wZc-d=Xd^{XO1OeW+ zz;IVfC=dL;40p9(uin%r3Q4KqEH#{^hI2kc`id!>c%lB7mKx3)vIf{ZQ;fn@YBNh(PEl!lE>=MXhbbjcfr{-Rca!R9@*294BfvYz4+)Wx?K@>d zr7Ig!o)%KIgb?gy)Ed;`Eo+o&(PeGsD>YZON{8L7wzNHos>rB%bqqk3me+1;9wX%w z5gurDSAmEyYiGHwZL1E^2iAz{e_sqCWo87F`NYHv2g}V5gv|D?(f5#h zOyt{_c+7r`MlS$PwUL+^h=gTg(N=5To6hNSzHo|BA6ml{1qS4!y40nGWr)(Q$4~Ur zb%ov#upvR8Pw{J+b@+7KAL z_%D!~SvPXKfXqxeFjaLZ#KoD*yb&1eRQk6|MQ+W@Yt1sNG^N&al6Zm7qd6&S>kbWs zX7s@Z6hOo^f5`|JtAG=o!g9b+qyV({sO9?dOPy{94%d@D97bHSmRvaPYftwF3VNZi za!TFSm>iKGknB*7x|h=LhZY%k%{B@v{>}ScU6W-1htku9ejTL^Zh1pR+T$nn=Jw6A>4 zY130w8<_B76`N=l-Mv^yo?%4cnD>4~Xj42BIT@8U5hma=oW3VJ&VPYB#N6fBexY_!r!*d8A<>Lm)Ux}IU z)$9!*S{XSF8P+j!g}dqp=Ilvvm6K`3^w3fmKNZR5LB=+9vY4YRP=&iO5*j8u$TS-m z@VKC4Kl}g=RXR;y5tX@>m(QM~ABD!V<$u7a1{3|pv9-igvZ86cpt`H4*C-6A;F|IX z#;v3!1ZHHc@+qchsD{-V!!f%abaHam#F`hpN)pHJ9_W#PMIxa_t5OscUXlC2{pfRs znpW{MrpdyZq&<@wZ0Rz z%agUX_iOaD_R*cJPkL0;7o4j#N{!z4xeAE-#wU~4qEMck zNy@QUjdBz5&(uD{)z%C2yK{3$4D>3_4(gDg16ET7YZ79zUtUYLQ0=KdIXy#Y*+J5J zKGB~TRoEw4qZF%Ew{{OkwH_Fz$TVY8-$|O!0ci-07er^vaY%3jb2chr9!!{1s9ged z^UC+>BzQBGRJKk9g9?2+USH?ByavKq_i&1xi69|uU?NTgZa8XY0qb>Vyz+rlWh&Oh zI7Now?J|rBM1eU;^YShNIV8NM4T-b(_=MIrZOkFv;)HwLxbfZztoD zE`&b}%aw!a59HZU2yQa?O$Oi(@44W}80J&Mfkt2|ofk^yh0=MUbgwUUw52rpqrT=M z{w*Z5aRavMdey9tk>0)^N5Lz9Efni~E&1*)rD5MLQh4w%>$mW@H#^Y_jJq(=J;9jg z7hVP7B5+c47i-2Nj29``&wBGKH9oZs9H4$tC+@R?bg#!QWSr!g5kemHad ztu_5+&s9l4fGW8|S{=pOb&b1QqRD(m0re0F17W)+Qf>j8_asw!wQ@QiVrcHdf! z+IWJ%jOjazGQW22I;Vrb=)D59h-_k|dNaC>kgset=rXv^*eg$JJc;q8Z#D&tzd8#L zAe{_HgqF9>CB)Q)4$za1SKUU~%?d~ab%mg;a`5)Jmr=YiV*&Zhrxz*j3p+ZUabMG; z?vJS7o5Rtk+G!$m2d1Nb-jC1d<`Y#i-U_z8O&cDcWNxM`!~3`3p`mk^zd|z$NQ=vQ zELsgd_IBRZk(x0?xNQcDyqch%w0NU384WyvcSC4Awv@QTx2zQY_NDdWgqF?244O!r zT365%RUsdEfo*M^jY@JkT5X0SPY+fh%UNaXLMnS5p@qbBHbm;i>jcX8BUYzA8cmMCjusdL^Q~&G-j|OJ`}Af?Aq1t7QfZ__uC)w3QwB#ZeOF5l zn~&EPcy}^+c@&=@Y^R>Be1do=eDoe|h&&wrL`~Q=>EW(_y+C;ubrK~D@;a*Nk1FCb zqAiMgot21{y=4u5v^p;Ixw#P!GALCcOLFsdm)X8uB zKPR@i<=F7s?Rpsa$PIt;s5fN+#Bl~&zcE!pj54to=08XxJVWk7rJR)sWU~LtEX~^t)S_e9;%(vLF0@y&;MfgjD zhoTBvDTyy7@uke5l*E^k_)-%85liBqO!_ZzOcqGuB^PQ#?}PnOZ^j^(Quy6jdl4ir zI7om{%Hm5|d?|}B9fnJX;nHFF<8~OXA=j0c!)N1inD_7dXf?h1!!-#-dAgRTYk9hs zr)zn-mZ$57K3zM_7^;#P?9#uxaYN+hUqpH7R$MWschn1N_RMu<_1M+F@5{){_2-(QiTpq^dVf@c`7>DLnV%OAz zxxW=`JJ%JYtwuno@g(Y>3`YZGQ|94~*u7D2G@87gFY` zY8hn%-m$gT@Dv%(=_8W%-*Sh#m*?X^Pus#Trc5F21_q${@vc1L%@ssBPMW<39#=Z- zB8M*L2sN2zI??bzi73V1F^LcFF#7m$6i0pJsAq)!D~;;7H=4PihM8fl;|8^A zSRLs?x4F`Dr}W$@J$Fjaozios^xXNNo;&`|1RE&c02vyCSD4{!9*_HQHC@Lr3JgJk zcaOWA>AeP558N$}dwm|a@65}`b%OB2dKE4x=yWkAyisj5ilo>K?Ak1zzKUI# zmS#M_lun073kieUL$nr7_i&6pZ}Z8~aNI+@U9eE6GcbJ=8GuLR-^pT5U{5E5 z;qef`brDMUR@8$-`B^+Y9nQ&kolPgNh68+=pY-O!SRPL(To{(ZWFt`-C6(6^}W(Tg6;+zd6G1=wKB0W{@Gx;yCgQQf6MZw!+*E zH=|R8t(lO0;pdC!DL9k?d5buzWbiC<^%#7m7S~!osl?p`)<^K9GbYAJeK;bm=`&h@ zhm>-a<5BO$ELG(ppJnT~ZZaUE{!%(yE$0`|kqyIuV@L}>Gd-C%dGdcwS;RQ=rj2xx z3*ZWjZ*m@_(=eF@Vg`Y2H2M|ANnu5WHf+F54XV1x_skhMi$}*>TOo<1q0=}xDca9g zG>buD%f3%2ZdmM(yfGDYC;0F^_^A4}JhC$c(=59{H8Vv4I*e4+G?vjW8~8~S4XeK#SLe|w5aG?${9 z+|_7lBZC@`89R4MY>6Ixsoa?>W&{dJE12K4DeN+{)xvBAeJtTQFyP)PCiCjY$|ZC& z>up`B2`yaLIAqcb($Cb=UGLGyn?9yg+mvdXQf*VJZA!IGskZre)HdsAXgb?4^gHVH zU#@MspRAzF@B4D0OZJ{4*GU#o@JdVmQrS`}TS{e1scb2gEgzM#MNKR8pjywa0^)M9 z$FH9wAUYC~PQ+}Viuh){=?vmUDBe2Q^|lVE7N2WZ{>YBn5(A!U`}t%No%Y5T5!3=R zS^>a5VRJU^iy6S<$G<#*ynbTLK7)>i^XPawIVAwI{!~)zTH^qFLQ~gI5q*3PV*^qA zhw)q+F%r0PTa(YL;o{jDd)%oC#6W$~Sbepym@6L9l zPmqDj6y`k-k`M-F%ei^Enxg`2Z|2hlb#5y6by8au2YD@un`3YIPvIXYI?oAYKGC+M z)O!E)&dx>`m{p_>n3ArdBg|U%V<0nLCb1)HG*8hwlbL(P3QXgyS3sbjfh$x_Vjl)k;@vWL z`nlD*wVV~@oMj{dJ!Thwg@{yH^`zF`eykcUs6y`IyT=cHr&Vw&z7F-AMZIXdVVi-f zV5I=H*Jr|WQQa;a9u&1dsrqN7VY_Lj$W*_BjVd+@MWfw7IuLIMAN~G&Ms3Y}!bqqWq~se@9yD(;H-?p-QHxjo5Ungc ziG&|DUk_SMWq%SiRDiE7ajw9O2dW~_UG--8h}%l?iLA%uBcwbr%hc(Yvbx2S7$ML# zIZTLh>rXK`n)im|RSp%IDOgET3H0P+*CQZD49$y=TUSI+xA%44x{m!p>mDgA{|o&UuI4(B!A#OpJ#Fj!0Xzm&`kk?Sqy&1Y z#b>@CDj_JO;{pUhX`@PO&7PJuUd=93g>;#Y1JR>xIb+{U_<~|fC6wFC4BK<&*;$vT zq}3Ve)9N(guBnvhDP>~pig}~e(w;pYL22?T7Q=Nfqk9MT?6i0XcmQGo5P1Jbr;8bvAbk1<3j_zCPQQ0F zd4(`b8i_!giV#)s>JZWNKvb>t{O$?)fpk+9ltYf!q|qt;`13_3~`-m`rEr5cUxa%pf?6 z7%%}Ih!ZHG26&CeriA2l0v}0(sPaBo-UrM3;KzL*Od1XsUka1u^fvasZidO;{q->U zT%jtZv86QjD*Qls`XZPS&h8k~evR6X>(Tc9!LQB6qsQ&&@&4{kz1fOtdpmf#*KRf*9JcrI;L}?MC~sU5_5^@9zlaTlMBIjqQ5tyJ&ZxbMY`bY}Id}lXi{WbE<(jyvFwjhph%t zD0ts%*PG45gLY$o?z51iw#-sY)cAYTov!SPrRviK$kXEw+5Fc^gNMTQF z=oz$w-cgJrGhYL82D&l3QR87$+xZ2}0B|YH)<6}lhNU1pZ5?huw%F&XdFO^O&S!|^ zCPCx$ELtv&-JMKc_DG!l$Xo)~*I35F^ zT2Uc%w5Hac4xl8xWkWQltnQ@v8&e6GP$8AEQgk$00AKS1MsT;(wHh+61S=UxQDh-9 zbCy5~krIe~Iqp!T0J!%Usl6iPqx4Ooq?y^Q!K#6kt3kz?y4;d&Y~GjWVPq8w&&`?) z?S;EiE**%&5SZ`G$JWqp&CZqXR1of~XKU>NhL_&l4;h9V``O}lWdWOwY;QnBQ+e6dKOg5_d>Q)^}( zF9>bQ@bw%g!aGUgkgLN7tK&U1RAdLgWC9WkA!CG1X}&;+VmU{xCC0qtHibZ})hhyM zXH(Z|F^E`Qg$P`|8Cn2;W^#(9)12LPHtz=u`;Qx?v3F_gT^f6r#@?l|H!kb#{aX}K zl!A^ABj`}C?)o{s?ckmr^=1@?xZg|Nyj>}rt2u_?;>_mCblkW1rGoGsy2$wylDNmE z(xFs3luCzEgATSxV83m1r{+lj zR%-)LYpIq2>1)oQL>ZV#$cPwLccAj9f?)gGD)L_vP(@J$!KOn7khPsc>uQ<5Ysj^e zmUcL)q-~q>R_)WvE<+J$MkLdGpCa{&3HtBF!rdZholw|Mh^<`JL4y{oiTJWXkz)RT zD~oSL)}m zWE^NPMuvveyMrqV(@$8pyuUo0zGEj%%)nGi6ibO>DN!sXils!clqi1OX3R_;){>~j z#Ye6$qX*sl(%ku;y?ryEnK;V|O;(J!G(?Zare)zL@<`5#vC4dkl-=2n8lS>q zv@oBdk@B*FnGea0SPIxiqX`7IFX(JO5EEKhs={Cu!NRxbcf$`O{D(g6;-Eg8ET-_b z=}TmBR6w*OaqEM{WIE5~1uf+ffU;racj zEiMV%<^NeSuLR@xs1mM#Kg)HwWElJ{#)#>k$bpC$GSiEQx@0DDhR3Pul+BBLj|-g0 zP?v(Gx3?Xm@i$N5KHL4d{wwY>_Y4aYTx3k=!||(lIyW$YO5_~3e;Bm4xar0oyocLe z$tZ#Lzsj^P$wUwg2fpg@3&{zx1w$32Wr@$@KCCC~xU0v4oSV^lX%m)#q_AY&L-SxU zYG#A{x9|H=-QyyQ>%9J9Okq%fNIq}hKOEi7T)@qI-Pyo}3E7c^s;&bB$m|TnnrY!#6*k{R6bp5od z*F=(=45e(Zuohc}^HsKD`J46{w5E%qfZCd7{V?uW?i}P%vhlz}aw}PStXf3N+iO^$ zI=DW(dLPoV~A>IIB$QB`96`&+?r{$)rr_Rfxn7ozhDs#(o_ke6Aci z_-l9fSv)%4+7ey|58ZZ(?}<$=ZN!-yCwFM0MFc@`Rhp_to$20enZ%oYZ?nZ!1*&Xy zyyi(Vs~P}v3;2vr9`bC#qRoo1ER~qjQTg4b6q5h}!&$dCo%SxOieS5MBaKylkbp#- z501i192NKGOwk7MOI@8=TnqX0K?}N`gV_>R2OQ=P(X;2lV|ao6EJn`SnxUi5kx!7+ zW$z6^h1ufhKfq?7orxlQQc!qB_9Ee*t0rhD&N7K0X(vO9Y1E3t& zp97d}+)qCRqzaz;8{oF2u~{o{Z=#M-kr z0;M|s#lAjUjAUWTsT&6aD0!-cBBSMpqoE1F;qmAD$yDi!lvUllJh!Qz@rIx2e?cHu(C}LnV@D%`&e+g7Dimz%es=FP{ia;b?TdV*g zhN$N$o52Sdh~6nsD0TswcKAt9(g&em>2{H13{%J>iJ11kx15HN*yd3Q;5|en0_z@`ErRt@C+!B=p?Db zF-u%?2bo%z8xrf=VYznG7Z)9xD?lF9{aAB|+!4@MD)+O_LuO-GV?`q9Pm|KXRZ9}R z#^(jpL#Rk>g>Ym9PpJ(GKs-VHRWNvh&fTSiR^A2%Gll7iOYM{aMdm`mDJ`Ht-6+>U z#{pVd3!D@Ml|hX1;|W-`&Q}#?1)4b@Ca+5P!M*=eu{6x%N!8XQB;91P*UQ($2*30QP?KXcYIL zrbKgpx&3FlYrmdMUw#)|Ocv2e4;mga+h-?duqc=zuoO&Bh3A&G49wH`?~CCy?oP(g z{C2yDsow3Pkcq91pySb8~g{^<1 zVvq?A(%r1871b*4A*l|;8T#`V2H4GyXIzvft`HZR`bwbS5{rQ1EJJ|7puDA{ZF7k$~U{R%C#TR`;7f zcOM|kzBa?EjXjK_@oz9k_#yh2Wa+QJN|gS@)ennl8&4Fv|8!4ke@hp9xVvA2&50>m zJ;p+r-;|Y3DDb$TeC=<9I8#2^{{Q=5IxIsMQS_vH&TVyE$~(9?eG(BN5y>Akg&lXePE=KotvS;kT zy>MjTB)cA5AcH{A_kVT`Fo`a(gY>cVT{r*fU`iB2YO?8cIAEL`f%QMJ~Hf3K$;3}{K5C0-N|JihGNVoT&RtPh(CzX zDdHX+Y}uW^XI5_ns>;l%*6v$#Jj6E&5In#x2?*O90xH~>BC zAiPfIC<}@z70$^dSm;BL2U`}#K4#3e$pqLe@Q9j8RY6k`c1u zj&ZBRXAh_GgVs*8YaZeCof`(!U?5qyXBTg*H%4mLIU0spJ(muF(7P-f5@ z&T-o#SHq8wwW$1&(RYBOGHvl9%Yt>&GFV=xqVPNwGi0z(MVUKDL-A=Y5RB4Y+#_MB z`tfYmn>szL*AW$E*)UACzoZ+m>W1wNfFw8N`%)XDG+$*oqmE!knYN-Z3Kr`B}ofwpfou>!&7u*X>d0f$%Pz;m-mSZ$LnqmQ6&jMD8SaZ(_u~&Psy7V$ zi-CjN=cFQ9eToKjnO%Nc8qR)>FW6MI!hh52!Y-^zSCmSyz;r|+1G+(tD{S^5d7A@hvJkLic*uA2gha?)&B zm|A8YQbv(|I2mWF(+eR}66wx|<3*CY23@Ak4)4`($7Rzm3~OxV#c(mnHTZv z%p(YLv(KRGrr0w%rxURW&pgc#F|rkBhl+^l>b zBKv&4n2ys=%_g3GiXpwoJQb7n^i$EVWge0z&pymZr1vf)|D% zm-#w7ShakAs6{xG+Q7gy5%?_x5LaV`X+}05tYTH z@-$Ybpjv`$2<-XYb@V?tBNo-G*?Jp0%b^{va8bN zrPaa>-M7E?-Ya>hetE2yB(d9$YWtNQ15W+PO9gZQP zp3Y$WjBkHOeh|N^qw3*dV<&rqREl1o5EhH!pvdC1Gn2FaxVrJDyMI3C|C>4g=sQeB z=XBnkLef^nMfxswj^pE-Z}kvD8MFiI7POaa`)jr>Z~rCd?InA5`_~^qO8M?%INvN@ zJeZvKzwPzz{q>vvpZoV@C?cLTZijYOIJBRZjke!^4=r6bbg88sY=D*ziCXZZn z=B-fT}Owuz1yhowNdY{m#B8H>#E)R_7e5J^7X#{daZgKn(ONu z)^W7{(2Fk(C1;E}0;R^*Rv=iUnPDek=Mes&E!g)z;+Vams|v-90w&a_m?t?Z6&A`@ z&fH3BXKqI|MCF+dUz|XmtwKc(g)Jnb8;W`emo9FmHprnUjD$a;9RC!HoO)r(Bm@00 zd@-mPhAeb4z9lgf!K$7P=M?ke?)wUSKhxsC*pk`-Z*z{-Tn1jmg@7u%5ErF!erbWQ zw-Y^VwD;<*Rs>7Us20J9xZT)3+^scB3xv`F;XPX*)SO0IPmZ(!!a=LK`DfY$AOIV} zSq1uXt?|=4Gb`}WWvvRx@rjt2G5d~(=ZG5uy9nl(j3A|h$;4zjEC@>`x>0ja00&EE z#|d&F1#@CHu-?*cd-4FS?)XN*$!dIz;8s%`Fx6!OfD5A|7j=0ED=^1TR<>gfz0u>MOAm0tQ+dUN*%1BWH(yk+)qwMd`?zb&+skC+>( zfc(Y)4rmqkc#qrEsc(sf0^%luzlKNV*pltD)v2kL>bH~UfdENN-gDo&5$rgx8!Kkw z>}}p(gHoT_!DNL|>Z!b%+Fcs~*>m9jek4HBr^A{o7^>0hAItJ%O%k9GI2j)Mup*ZL zAU&D(3c$wyKn_L_xu3z&#-SW1LV1RXR@}%8pbuTn6vYc>taYCoo4`~6fHHtWpwS@V% zzdd~-1L=(0i{Ec_S@|-evw_G}R-42=!kU_h4Gso1#aHd#^aGhES6b#eU$GG*%&;9y z9YlCRJKBbrxk&q8Ms(vKA?PPP99^n84O<{`>$euiI2gFp(_Js`*VL=c4j@sL+Vg2w zL)jQBq>VecN?RyR>C^~P`+=qE^dvykVWLEasLJ4zSi$W?3>1>%^h=v%a_5-KJz2?# ztu0WHw}q5}!#E!-k!&Y6%k<76K**v21tv<0BwJQN0=M+&FkX198h!%&F$k9h)oNfx zs#jr0xwv9G_Art{$>H;D5^w&O|CZV+(-TJttDSz?OP9+emRcuC7^gMXT+wRNk(zyT zx)^(Ati=Ob*BhpQw9AvMa5V%(>``GmSfVXx8V^iLiMe9}cgAj1H@V_HlI3}@a8fv{ ziLLb#dt-($*l2o_3}}j;u^o2qj4TzB3`N=DheE|93E9389>osE)0@`yi_oAo;6{zn z?dub0lc}LpcUTxMrCC&Ki;Lw8M7z`2vUjUd?P}N!8H3nMvF6&yB@mxp7}ZLupY$YH zlw6)cO11mk(rN~w)Kgk(D4JRa95r^fEA#oO-bn$gv6pjy$;MjA?7gY3(g;jZapB35 zZYI51+lkN%Qkte|wxZkaS`2KeKWo*HJ3ZuNaGenAjhw5Wg$!~`7#Z5VBaw36n9q1E z1@>2QPaJI13J~X48fUr=QLwADVT?yu*sRwKq%=C`{fT@W4QbsC++2K&92RB)>XpNC zV#7~VF1a$Aax7#{eOb%JeBsLLRPmNyga(8t?CNkNjlG@`g{V-o3F1R*E-@l87gKkG z!%(s5$PHEQv%UqrQp!~_WoUbeT}bU3){2#uLcJ znOnj8rWKlu>#z!!th>cv2{v7aHMgdU*KA^x+D!4P-7(J8jOPYTNHi0BOlYquXY$S> zF!JFPBmM*(cB$f|F%N#KVq26fPIc0=0pZl3I=i}66ax(@_aJVDT;Z}I@rM$E7Xt~Z zSf=7y=P!*t7bH(m@Pg!kKPkeEwd6XRsKA45 zCpV`&r~`02f^kdRX-oZz0>wdSnsj9nG*BzL4Pa>qhcG72&mSg+XfLR+c|RekqdFD0 z-VUU;r0A;k)0YSqe&g7@ulosGD;2Dzg0+l(R=RlaKa8H#o7<0Td+pkT22%R`8r4b# zE9^g7hYwoqM*FZ`j~?ysBghF<&9w0;6|C22_{S$i=)LT8VQU0&j03~F=^oxH!WD^m-x4}Dnp^o?mb zvb3w{PYCZbfy|kL6cOGNQA}3#5 zXw8S#Xz_LS%!XpxDV#kSG!7j|`b-QmA;FfMy`6^ryT3rV!8c~{E7bO{E;PT1hXn$F z%)XbHXY7XEE|QW?UdF|Aq8<36*%`{UUQjr$Ofc}VF({0VkkrVU^g1VBon3`vwh0Hja`0W<(wr6O3EL}r3W5kNx7Og=2DqTJn!+D*hnOw3}YV-#Hz zT~OmsvqCZc0D;=b1ItsOD5oPS|{zw`JW_ufn-C{ebnfhvnY=DpwJeCK`6caB~k z4Ka8;gUcV?_A-`BQB`$E@hv;hJ#K0rn)bQeG_+f-IwXas`&I2sE5KO+gF5emEFf+C zSvFupaSI3@s<9v*ab!AZDw>1&S>s$>-jWaIuU!VBsMKzY3d1zY&eXCWbu2uB!`{z| zp@+EOQNR%gK3nbLsxILyii6gU7oGW}(>$ekHjs>hO!1RARR$ZBed-Ni-eUf45*zuwJY%Ko zJ-ju*ueyXW1sKw1i3} z^=FacF|@L4C;^^7nV*(u10*s~6HwS-7vG3ayZYl?T%XbJ6IFo>KXp?SpQ4;PSgPE> zEjba~3i&Y%ber;RISjg+V4Cyu#l`BErp)7unNg3JyGlF&72)FCTC7$s={pee=sP7YJ(T!F9#Y-Q5{BeDsvk{lCs8wWL1mn;-E5s!#j}!!W9)seWZ%mScozz@ z{(7;oTH2O4{0%rDQV$h8qP zQFja5FDY(Zvs0;ZjB#tppA>B^-&SUT>pt|qiJ;oD++oQ$qm48vvRuH@R$S;|B^8nbFX7q}?jI+D*& zWwMVtTaqj?d~#$#n$}VC^b~ate4sZcbT#Nw&7#{uvLL#l>UyyZ{=`cw%xX(^tqn^^K)+M80Yw05Dea%_w zRx)`xPHSFb6p7`SjVV5wc!bnD;vNPJtb9}I3*nIA zXG-2&le#W~x>-49f3b3s2-Db^aU?xmpEmklF1%OR$98Zrkc6>@$YgaIo23jw^B^V9 z%i0$g5&!KT;$BS{(guL*j!-i&SDZ;i2i=cv!caBdrAp?~?Peet1%b+2ISG`U!$1ig zs8M;(;a!HrR1eYf7<1N5MCY4FB=mDWSbicn!B&}g0)niF0Rkrq}ZVt9j+syz**Zwar{x#Z93r8|uodiEDI!TpMc5TS8X# z3j z)r1CeUe$!Y>PmfeW%(*-_(u}2emgm-)KM286xWL0Xm&{{AEA^DYgYANp0;q0?UYTd zP+Lw*bKugi_6a!coxVJ=uQ*==J#@Rr$U$dp7>W8FUL!`SWXtSk7CIg~93D%xDkQph zP#p-(d6+m)8#TB=S%n%E>`n)LjudV*oxZd?O^`9C)-3y=GkD%XX;nDNPJ9P%&R;69 zsk%$$WA;l!<5VnyKhax?#X=fDSIGP(`spuLKig-xcozgei0uBVBd%FF#o9h@?gy8ClHopok@}JA9b_ZCMGw$T?g@3>V^oRL zCh;A*R=uGI9mQ;O)#{?>k{o72yM9#70V;YPo$$5Fakx9!{mAZSB{DmH`%BTmmSBa_ z1|Kiw$J$YPMmZZa$+N+eTLuL45`Uz(X8N7u!^Opj1&@4Lk00q*fr6@c3`f69Tq?a@ zd~`>$C;4#$?Y`pIPDA(}(T3z&o_a00U-P$(p0GUIsOp9*q3bp?IgOa?N>)Odt=_R! zq6#On0R&#OQVd#VjpZuIm5+MO#ko0w_}tPdm=r630$sW!k}|O?_9fh_j27H({^KXY zPpgRH?0Bn@B!UXMt~%tDvVL+8NRPZjO7ucx^2b`cl6+mdPg+`JV|p1uKiqIT?^uON zUQLv-v{EDqT&j7jtr)N6C;EV7?Bir{W4w7xar)9L=;AUen$GzVC6TCzyq-<1*w*lE z^Rn-c?2nK&4 zsGV;wqD1`djkDqkX9RC1?^8Y;7Z{f`5tmh_E!U>>DC0=VKlE=MHPI&?;=&~O4Rzme zt9}yx>k>AU4hh`N*ui-2=;a?#g8kgvaI77o>?E2UTrWOn!Hjn2823Cy>(Cut7u?PY zycnKV|FM_#Mc)2|HcwRm3J>oyi3T;6!)8(OGV@GohdQSLj>%Sd(}kO;<)V5kL+Z2h z;W8tUmeP&U$9)ljx`-$-mw@n#_%;?_mIRCmvgnm^IrIQfR12jpEG17I+!Sp1 z40qABkWcuW6;p}^lsJ^0rWztg?&u}_WH~9m7%CyDl=LgS(fV-t8v>?bB5ZQm&OWR( z2-k$muTr?x$n*Eu@5gZ((S*FBvv*?pjw{HK^C%iXanbEm?c4Y$xO;~z$m|R>cXE`K_9*^GSri5i zTFEGzP)?QFM7U)kWu-1g`SEyu5jmIDh1%mT;falDy`udyU#S#xpLJH8K+pr7KHXJ?#m;>}QOI4}2 zJ;p~jGs}3e8#$73Q1b{;!#=EF4cM_m6`tt#P@p)*`+PZXE`;YBuSW4qrN!=j*F}Sy zP<^&)T9>Xt=)km9&Cu}>Pz)`Z|0UHr65rDj!f#>bwH1Jzewu#2*U~B`{#{jHn>?t+ zZj3cyG%qylQ;al%5(^;iwY}BJ{)7t0Yb(B(%m)>m4{1cL zes#e{(OEf3#Y2%Lr2|IxPE_3870_<4wb4R@W5h32Th+fSHmCFp7B`Q$K;Wit0I5(X zyECZblpB8rAO}bdG-_?WdJv%v2Nykh`_U@FzQhpeR=ja#*Fygh7Drc%qZ7|i2!iKn}~L`4w?zwU_NkI$Yn!L0b|`= z78ec^G+2HmL#Sjh+bQ^~ZZ!MfuOD{O5okOgbXrYvb6iWqRV0R_Q2z|o8{4#&8B9th zizEsCq{ss5!p<_)*=t zy}sMf-L8;tj^=1jb>2Hca*)nC8O>jYctaRkqyGc2xvy z{`Tz6`Gwop2~v6@Pll)L!(GrFciw$+gtoqP)|@|s1#HgJ?M~?7AcffUVgvk~p4dpw z-9h)Xd5-SK$mj7SZTNlcG6U~5ob=jopSJuq1$5st_DL8p4L!6DmP~qPdLAO@xA&Y~ zE8wWTx?y*9!w#2gu5Q>}-LSj5VfRP6VJDHBw~LVOU5&2MtK}kNm03S_q2o{V61zG| z#1)s9;AAY&(($WNvp-*7K6h#^oO-`%5B*)DQzP}MesEQb^hyo6st%6G&{cKtt2#PY z2|j;BXMm|8yXQ>=Y?E+?N^|ClNPf@S39gjz=C7EWazQwRn*5nJk#vKUBCN|6Q`H{y z3xw;vs|?n{pLl_#Hp`|{isB`eL0w=YfDm(g(<~diu@gd(X`pGcIHdJ0M%s%{_Jiae zdznx$GKVE2pPlbbHaRwrb)7g1#OFCg|zg za4@D}Cb`oJ)IkFnNkTYam4_}|GhH;S{1r^!mz{xSB&2sh86KKRVo6E-$!D3pGd=?& zCMZ~tQ$XZVAYx~NPOL8K16Od@qKp-)1imL{fB_x!K0-+Dsd+V5Sp(*W7%uXPe7LmK zsDBnGE{C;C)h>Nk5gZ=P^>2th{(F4Nfi}MKrN8Gpwq1Rfjb|ua!gyblMGt*;KU8)W zcyV%EJVT}~P#;G#Qy^3k>7;BfZ+Yaicv>#Yxac;>kIvcTh~{g194 z4F+epUVqeU&cbK+If_W!IPDDPUc5Z!|9WRf$aB1Q=dBN4b~`BM+HHSy4TXHqkPnFu zvBnS2?yTdUK0bT(f1Ki%Hj*KwKjf?5!s!Ty;E=`_`=%fEpl`nVCv@s8K19&FclzWG zlcbJ2FFO4X=j;>S2F0_eoH0D^atLz#;<$I-|6(}ZLD2w|1VD)vbWr8T)3QO9mGBWC zo_4Y2P8g4;vyKWb-Gk$9Z*cVLw_gnLFdw-?2lPXYzJE9;pU`QEuIg}O9uNE7&JanX zy|Y)}Xt|hv(I1{;d#LC#a<>n6@6En{qywN*#MjhZPX#u`C=$&_Q zfPFURJvpK6yR@^swl-6MhXHFaLGc6?$pr_`nk^1oy!x6xan$HJZ3FX$NZK8ozxr)I ztOIwYpG17YkY~q4s1hDy0({bcd2)c>qVR^F;r1AqKl(DG!xF)UvL-_!JRXc6W3=;E z-#n4DVZ4r1G%Vo+-fxtn+4^Lw4&R8~AR7*ECj(xKcL##}7|;(0m%<1GnO(dcqPvF6R?EH z6EKPa>I6aHeDkb#Jbd+y(i8!V4^ys=75Ox%_;u7d$N%CojOPcc!|VB$D%{>sYhQ`2 zUt!A2Dk%wx1TsZnnl1(8NTqU2jle1kuJg_rj+H`DS)4J6%4&U@uw{{0al7QB2;nKW zJ8s5v#imh=w5vci=tnwJE+n@kSh92+7m~a)77ge_3@Rg9IzMl|WP*4fdVmPxi+B;* zvcnF9l=LB%{exrxkRet*lAZBJ2joff38?7_nymUzYxc#Ge~}DHZDK>}#UYdlLN`?e zlHi=m4Kx|*GZ0zmieaCTc~D{@QmPyX664#i7m+>MJbm?#&2FDO7YY+#0YG+@t`W*a@}^B zG8PBLWl_T@FU?s8q=bnaBt%Aa_C~SO6*UWceb!Sg%U_`k0Io&i14BFQouGwxnKv|m z87NhV1(34Z(>)Y=8}w1*OUoLTaB&pI3(;J=gMA+MPUS8W4?yTmz6xgpwGHrqesXCn zgsWq}Jv=#UU}P|U5@o|Mb4KgD*k_7*`Dcz@Gj9Poy+e&O_=cKwHXNY8_uCwnx3L;O zgY6gpdMEo!zMBi%iKzCkhD>V^py4b{<%J-JfQ9ZP$TdVEMhbaR1WuI@5C^g9660SEqCYJz+j=Lr-YM9RA;`;8k z&8nKYzSB9uq%?jzr$GD8;Q$8ItR%#IIM+G3gA4dw(6d4ZhKj;09wY!D*2aCSdJl?El05oEKe8n;he$^oPE)}~8v-^JS&b>b!dqx8k##nQoKKjei8R-%h|3VCXJmBG%oPMq;Q$gnQv_Ho z_BGGWVD$T5RT~`rG-x4t{6?{yP85voCK)^VG57>lErxDi;Hb%P(7?&0ZJ*b%dS!p& ztzz~Bz8-dGPhS1g2_yx$Y?DCHu@p9{V{q;0pH^%^=P<&ZoNi&p^ol^P3Wmn?@Bi*U zP^b)gU5F@E1N*as;kRFZJUuge$F|>?e$d31zoG&E?bkmlsP~PN#dtbCO#M>S%WNw7 z#AX7m)X{Q;xdUghxH-t@oaH&X?gQn)JK}y@!Bt_6of&JhBww04s<`psvU- z$6t8zT@IggPltVwXrlG0HzYpMME$$`2{~Bc&v!i9WDksaj6JBO2h)GOy1u^3Q~k@; zVt0CJ?ZGM!YIPUk&$a8t1NmfUcK0DrV%$Nw3V}-$dXu>KWZh+Q8(*_O2 zbEk~pK7s1djh?w?mu7te+V08lBq%r}N~$W+HYh|vgSVEnh|_CQTZi|B)br{a92y48 z)POTwC5A&>Brb~7(alCR1TnronN8wj#E9@d!(&S?NOSlCYF+CHJ{-6dzJ^x;`W3V* ztVnf44D`jYr@B6^6IHUn2^@hj+!zLpWjWrGCxaNFsH%|z_vDb95~~pd!jS|RVK^Wj zp+nCs)Vajxj`jJWfZoOb{k4sawT=7s`b?BP;|*cueQIBTt2Nt=o4E2jeIX+g z5uW_V4c`%j@DL&`K|{F2y2njmgrHydlwlanhQUoS+<_+@u$K%BI6A_?3;-}5 zdQSqrCp3g%a2h2Vs#OWb!xe@x=t-ntCS1&;ea^BOFg1We;;hDCe(nS*3tn`eAT6B2 zVN%ybej;4JMZD?)*q3#W09+_7qGn{|U@C<(Emtj&=&p{=&Pf;C%c)F6c^gKZMXE?W zofn`-usWEC(5jzUU<&rlDb52{1Wm^d?5Q@O6~>8fG- zD-buKIFS%EKpimwq!Z|qgx~HAUtDL%0c;rYDtxIsB#GNdPW*^@j8=cj1a~2YM$*1v zPB8~D92>Ygfc?@_1Gt!h2j~dDB{)e6#kc?aw_p1f3?^W5-~JcTi^vAa+`;k8XiNwP z5OFlGcZb#LgJFxsukm*6Bk86R)yt?Oo)O@!ZYp)ykcdH{+>FsM*e>1a!VZG6YpAHg z18|v~hJvXi7HW|l1_nzOpkls-RpGbPXHYb-HljBJ4dSfD z6MA&;9EqAYGdZ|x{R)rfAFGSda6SI*Ry{ts$TbM$gm%|hm?^IPgZ5B=$)TxaJr29 zMpNQB{=6x^L>~-*hBFe1h4=|Dp6Y_v5%5AppU4Dd_YMqEIGR<%h16+M8$Jdzdi71z zq3&eNKoxm2V9``z810}CzzrzcSam7RXFuZ_y(AA0EHP5cnE!!J;?q$?Q13i<-Y_+odrtnLEwFGmcuqd zL9rfm0vPu3tb=g&IEIw|#Awf$4}fEo)Ik(6=ew^9L^M^ws>cLo9-hK#q1th9{_4NL zFRG3~U>~&+2?!~4WuVzRgWgiV)$LxSs$oU z!5Wcs=Y~xFtgG_ncrt4q9Xt(ewtLh>kDo#Fd9Q#u zeFRzMU#%65qfYbL%i`d;*?L;w_w&Kb|M!3W_YN0-PO8YX!CB4fq$4!*-o6-(y;a7TsBAZbS?s`P0ngvh&Ti83?; zCmy^nB};iej$j;;pEM5b;pbiAVffTE8OFmgpcK?W>JWqy{c~h7FIW=@S_9CTqA zFlIBS%&B7bDYEy}7}yA(By$yF0qNi@u*ezJH*I@LXNIBxy#+oPS%ULYE@HH`Vd!g9 zGD~oPV`OwrJfq;g{pL%s1JyYLZECPqWa3FrGHom|1YDDtz<^miW094TJtPaEv)(6! zHY2`mH`nM{q7fxF8rVJfHw6F$F71~NJT73I64e(sVDtgg)a;k#YViLgT6Uts8ekAJ zt37O*pn#rxjwylFajfvHedjubwtmlKXWwSujt#@r9Gtt;{K%*i;sgL22Mg!+Dw&iR z;-{9=kfc3LjI_X_0}Alc=gI_y6f3y0Fx-uD_EtFG{@jxe496x2?iiK`P#P<5_gdlr z)5B*p3#gwhLPLs{0j5SKgX`RlhBq-vvJGft(Vj4<`FJG8fF;p}_pg~lhWUlM%^xOi zM`+`;Q$%|Q4l#C;Oi0^MKNFo0y0xmz@;S*Begq4bdT1VuOHCoA2g|@x))Lqp-Yf&T zp1Iuc^~?60^mj8>v$&W&lyCz@Z%%f0XA5**JVAViX|c+njqOP^_lT)-;;qDnT~G2P z-JmK_T^LYgWd=_0%%r3;S$s=YP9nEeLnCGuDeWncz>6)A@Lv|* zLnp3_4B`=CYHw*&Yx8C*x)U)ZAqs!NTmfX#)}FNqAf*hbivSWJ(-;I{ZgCCVgB2aDFU7YboQDf&s(E}@|!yr0o! z&;}L05rWluK8WkdzCg}7eEcL(VDnC*tubCF8=L#954Ltcvjtg-8H}+?o}4?Yg0JOckt`I{*OUeAkkLbd<15g2Tl232Sr)E26-`tXKpzCCxz9XMf`$z_PS3Yd1#VxZjBV`g_ zmXkI`6NEq%&(yIT>Nr_{E|HYsS&>g<*tCL};L5CA98&OBroKv!C93$E89n73TiWEX zs1gMryi&_1phEjl0iS-UIi%o6l7A=qB9v*Hax0Gl^D?9AL zuMw)}L_br5oAnjOh2wws4}OTh`;Xzb-}-O=_1}y*LSfBNX_|~SgYT&sD+g%mF|+jn zLKEQxWytCYsen|yT8vwN`}M1@zx|pI=t#jW3|EomvyxlE|405k%wPMGey+0FN}GdKu;vIxE0qwhtX~zYhma>!^}atxu_tgIGweQ^bVo zbx1Me-bj+Q+kuIlT)iOJ1ZT;E;zT!*hge~441ApWN6QfHG3{U{Kg%f%BaCz0H4j>J z*X63Ay*DeD9WilZ`uU5OznZ>KbF-+$>_W}S;9$<~Xf8}peO>W@uqH(%lxTO3JH<25 z96X-PvQ<;0cMby?Kx`hL9W@W&9%jrETF^X45Em1vT`gI%8XT$&E??PbVEn&DqS{VH zey22vTM>u|V|d{ zJm}aKj@p=R(NOv4f8c)^tDb%#fBz@`7Z%Y6Z(Vd|4Fq5Nuy@hWS)zLESK$mb`N*a0 zGOky&;RegD3S6kC<+_xrX)PDS!YGw{BDdph;gj;2GS3&;XR4h2^MA@dRORfSgRmb( z%j;r)2Q&Z`h(tx!S>TnBpv+Gdc^q#69QTmF3uXoo@j`W-WLG~Dm?-a|!ui`*IS%^k zzwE>DA&ICOJAo5It}DrH-?QdRap?ku>}Ak@%e;MOmf;qNJc!z#AHl`Hh-LF~%SY?7 zKHfUPFr#i^>q9ARVR+nsmGY9nS>} zTrkl`GNU(pb|5<(C2l^a0GD9V5=ZAyYz`|pvh30q9ge)@CJ#GYP98=`m`~k zFh#^h#N5>@@Zz@#OmPe+L};gVWcxR-FGdV+(ys)YPF<_Kc&*oiXqJX!wK4&jttrDg zixgWkoro4SFlM4b_OY?*K>Ret3Q;kkfEf-zfm9Sx+njgC7(oTDK(r9(np};-0q~(Q zcZbe14>>6wV{z(0pmCk>QP-a}>5_N0h1by>BTFSbgsai1Fh!({|$?0zK$~mp+#o$QMd-v zXIcX7Ha0g>>VKocoiBSFE&2@N%Q3FgX6&mI@-RLQoOVGeCE;K^xnba87}9? zkd9OG7G!y%N&07xrn9%FALAhxfOS{pOo?1TlFMLJipwZHQcqYsg$^ZXPr|Rj^uV8q zKj0b27=>y`*ES&Q;HREtWRqk&M)n7Cg0P8=Z0wM?eM+(t0DCLluM&1*>tK-ezjryl4K=P_gov0i1O0+ab7QZO z0kf#a9dg?lvfEI0s^Lu5y?U^yadWkph5^;b4T2kiGe4T<5Yvz0Y6b36J|TG zBnq&pMa>236o#U>4;lXxUd#P-ZTFMShr5}>pUH|?kfO4y5u@V+m$`P!>GoGv*Vi7P z!Nc~Bf$5?N<%Rv_rLEnEi~@;TbLm+(@7>#3-Mw%|eXKN@>c};qsD1h}OS`|l`EYCh z?q~a3OS^!`#)a#%=k_n#9b51-t`1+k~cw+cA$-jQ5B)vsL91DO;Bw7tFOKb>jp zwaH%OBWEo7SFPVea90l;ul%|`vp)x~jyA9VFu4h_U^_Du4Pl@iBLxR8uKyy<0oRhM zUfbwbPb*(sf)T+C5qCv$T@w{1;bwr(kVYiJ*w1)tjdmK1Oo*h?&EhC&#ST}S3w$W(Eq*If!IK<`KdAun=w)Cn7b1rUFPlxQr^== zv)MoGwg+xr3rh`ms^eY8RC$FBk9&k+PHYCQ4d}6b3Ub(?bbcTUmbq<5nsicy*mtbW zQHz8IOxaGO_6hbpT!tiQ%)hvOI5RG-Asg$06o~xUKm6ZcU+f)c4G?vWi&u_+ilaRI zb#s)fZIrnKw>gwD@q9y#iWm^h7b2b61SoxkJ4|!~gi}_7&*-M(Ptp6R(GAT!isQHvC;^9ir$cnBU zcLC5B5U!F;BfD<1-~?(cz41i-+sTmiXp~(gfq_x`v-lweN2F4NXd2&xfDb(bC z2Oqd$6dKaTD__Kn@%Yt6IYlJ4arJi=-XBGKtCH6Ht4dy3bcIsohp=}#!~N^ttX!#s zkr7CZfchnsa;V|wonHYTsI11T0&N7yk;zspybl6XWYxp#8&gF)PNd!NDmhBTLB+** zbY^H_NS-3Fs*D?{2muD8Xe4kx%SJKAO_!E?^5hm|l7OBdALOe`Gs6*_0MR`~30YQB zI!x8(Abhe%f%qD;gY4HdUJn#OrbMc6OF)^Bv|?XnGC2VN^=ih*1uVlvLGetfK$S%T_=*rViNu}?iVU){5}^5& zTTe%qnzBN}@FU5;Ku-Ez(R3c%4dgCY_tV{*O^-<>kDLonzYdsZxBUas*%~2{lV~E1 z)ddVCK|1hbS%R`VdbZLV;_yG4Us28VbCgCc=IHCx@J&KPw z<0gVP5%>ar0~6tS*HSt-bf*8dkjYB{k#OVjke1?PhIw|DoB`y-DU{1(q=exJ56msr zi6yP#FR+H225H#4bg$IB9T^ti##q_=x9t5=z%2<)C3!LyE@tcj*J&wYQFTSUMfv^{ zLK}r=OKILET(eqGl7vQu#jhepPrcq`R2n6CL&iuOr3rCKV^B3Xpg`(Zsl5T#M;Jv~ z6pjR64v!Vi2^au$<0)ARFM^(f&*AYQ!?Z5s=0?squnv05Sc+p6Mugi%G<;u2uCC$ifYMU#O)L?-Yp7VW5{wpP$RulV z_1#uusAcMzU4%=hB^Ytz_jecU|NLdLODbqsTF6MjkntQXPmSW6_bPFB5U<1TDW3pN z%Ls4Ckc|nR*X3Ka`j;L}gGmbGOqoG1?(o8g9mKGZ7MjqKE(p+wE_ExKEqDzOz9X4h2+mnW+^YG%$-SiH4_j0f z5rd^cAy z5M%v%KTwr4T_e&;S^$_-bDEsDOuY~#1-VYsG8L|-PrVEurStQfr~b_X{?OD(yqR*O zI<#s`y+kY+wOyv3f`?3<`XHjDASX%)JA@ymchRX8%}6A6Tri4^H>Yv_@;gSFmd33G z>Or3Lpy~68r~H(F?cmH?oko9V5g+q9vEQ@@+Dz+^4aB3tuZO4Y_{>`|Gun0qb$iN9 zACIC)bYz;V|NY8hg%I@{{H(IWC2Ys5qSE^yYbv6@1qcsn}_#|iET;U4N?51DS~_=TVB9zhW5 zufg6e8g90@$w{wb%qj#sv?}!K^*io9q2fg=Qg6;eU}3R|cEQzIZjq6pPT6x4TeUJx zTZGYs>UGj=?hF@R7$TxG?ReUF&;b5M_gdN;SrrCp5JNWuoOv0HI2KZxL-L+6nyBe= z4^dwgWX=_?sA=7R-<2i$F`QkndM%}iN6;JOTGK>F^#iC=CMPf6%aIRYkS?rO_u(@I^UqIICRBR|JF5wJ3w@ftcKE4FkxkNN68oRgMrXzey< zE#dI%AFYYpj^6Qr{6TU+4>gw&aqJhUIO>)#J+bH&7wldzTh?htGsWYV#q%TRB51_; zvOtv)0GK@)6^#sjj>-aJcvuX)H;UcxWMYu{)5qO|bGWuJAh7Nk9IAjVDx{+F1zh{A zr6Gt1Yg#VmTUSksFeZ4m%iv{Q1GwIy=;iQY!k+iWKcdgS$@Xub5?If*5fiWwJ`7(u zZYdBPrCXE3QQh6JMY`~SrQkc*BZ@u&Lft{Xb9{)SYXMsk13Ba;*)alc()JCSv3Z1q zD`GgSzYLAsMnV;aa_%Ggv&q^SpO{+=fFz`?uv-F+f)Ugv4lv3xx}8 z(G>(EVW+@5UIXBMIM5+3r}dr_8ABbazSK1>!Qby(c*8bNhxNY=TbTh%7k&Bo{PhbO zxS%6Ls(rOMeYT^bU(OD$=*^2FO5GDmr@!~^Ej^ZIof`fkki<%t=yR{n43^G z+(Pkf0>>YK^nu+AZW?z(6$p{wHmuV%nskCrk#B;h7brD;3|kf`5wuU)jZGIuS9emF znJ1L7TcaftWKp0ST8!+yX5Tw4MxJ|ir}h9m2X?vQwKfri?p@L_)9zDpJ)K$kV7$_f9xM|bAY z^=iU$eC=@@StiouJ#wKl7Z5$%2W@nV>yLs%lKw7|k_8DAdiTMe~3;Zft`F zi%WZ>AN*^6p4Ae!2G~u<1 zwA&e^G$=i3ZHAN5iRApc^wbmr23+vKjmX}Ktb(ub{J0`HvFo0CkKK>&wT2d4CJu3T z2D4{@?EuR*-)n zz4WfynFaPSqH>(KJgbXh?Z!hAYzL7kZIE@)en+FAHjeT#)P_h`wQrf^y0m<7wKi;g zxo?1VMC!&;dZ+LakO+hEm#E%lVUvp*wlhP)`?NK26LN*j3=GPY6k;d%6ljf%Psu8< zwkUgm!0=eGl^K?!ijC-Xl{5p>|0T~r_@6vM<~N=@L8D1}m>GPaRN-KtM(J6&1u9`+ z;Z9sVfYUd#&2H-{6Vp9PA2Z&ClSk3TtOaQxWAx#XtC7+K`zn7nq}=S0rl};_yD1Vv$fJ zu*juwfCf-jtGh*=#QJIlr33PniMOO8u(6<~lBYp~L%;=|ke7fp;w~gl0-gc3yweyZ zW#ZhzoRXm2hED@_4lg+i-$1EKsw^<_C0fle6_ohrNAPgEKVv+0C5^<4^$K_7x|&Zx z;;Qre)#Co5EZ25y8%6hm=pq9%BY>%PG2vJ>7L3Na63iK*)8h#G4=^gM&|XnDiU1ud zo&J>^i)tx)5EwA2JOOBqp`X~I2b$$eIM8wR;uu=yg+vtE{}>4+dFA5`L1jm(nZLo7 zVoSJlz%F8-O?P&HtGL4e`4{lg=UaB&x70Qa(5!%44lp^96#Bq{i6t^bp7#$kd7=!& zbTO8>p%Q%FfsmtH4Quh1VPcP?-?$$6?~k)Ibj$S&`A-0rm#>D3X|uNi_(1(Y>N>rP1m~nPe^| zvPhkQTckIx{`7%Qm?_x7)5Lvj$Pv+^9^MJG0s2w!9>>|fCuqB+3x$|%*tjlmI8tTG#Xlhv4xj;j;g}=^KlkYIxgY@zI-)8RIQj4q`4~p20E+NaTHke;Kd3w z2%G?zz|YTVfTeTMRZ9!fk`O+6{ZPEs38p)^OhDl{)lNwlnewWV+Xdt(PS4|DH zqm8CgZ!*Zew_%m3xW=#btVA zR^n|>xO8)5+Wz!ezzm z54f_NTO&xqdL<%%;pG(%GJTAxg$Fh!%mr!RMBb$Iwp(kf(2^)G4d zOf)_7WYM(gS(m=?11fIzlsCmnH$q5E)xm;h;L-UYW7A!n8Qn4N&J`oky4G=Tbt zkaQ`A3`fBwdYr)v=pMto$(co90ljo#*e!HQZ*zv(lgu~n7)#Sq?JS9^%9G;- z-$Zu6M-Njvl~|1!uQdcqVbvy4tYYL9K9M+;c?Y9!PxUTwIq{0N#6?b#l)jrVEpjYX zBKl2a21#ZT+)z$lCAfO3OS;D1`FCq;hV3a9Bs$&$-gmbibizk_R8*NcD5z`(oF|b+ z8x6FAG{|6I01YsD#Qr3;G=`F8FGO-TH?pV}#sb43(F*7>91t=0KM602ri8DGgv*>v zJYVrPDNSN9*#8LPK##6@3%GO+j$ue&G&H$2`dV>IbQh>;77zwwi!Y*PX)Nd@&)sWH zuOJfoOl`+IWy6_1a?fOB#$EQ9n<*%HU;Xo_GJ@mITtlA14EWP z0%sED}R3%2kbqrYN2gY^D!{RB0 zVg>VS8y$tGlXlOPV~C^Ib(7HmLLJKK<% z$GroI2FQr>1o|%N9q$5Kq8bI>72j1!IJ(d%_sr&l|7W4utUDD|ThW{tibqw4V z`ZMdYx#b6V+w~WMJxj=wyt9yfBPVkr)XH}O2a>qzF|on7e3%UxpF$oh<|4fbb5KPT zf)HgbPM=^r_o~K_f1=NAlEV$p`v{ySgq@Q$+Z~@HF`nEo1itG;_XwR-*WEk6Y%?)l zAo1eUlWHc;Gb(fbOKvE}wqwHK{aQfGFy0Y#;C&!G!Rsrf3uBOBF?*EQJ87OL#3ZgF z2Gv~2d(u;ytfcS{*eWbByvQUqN0n}NB`T|C;8q^?4wuV8hb#!?4csQvCSmGWgw=tR zFQiq^a|~s^Y7p}37NxNajxThu<{@ZUJS@*Cq+@2cEAcK|&ontn*CqDt@k{dL69kf^ zRahWQCftxEU^wOOwF)j+b*Xn(u32M$G8ab~LErwqJF)!liu+3aNYEiV$727DSylMz$n1#)0$O za*6aeD^UbP#a?#^!c~Hc(@~d%TJIPB&YDy`#KEeWGnO?06W^ROfJ`OdXE)p|q`*<9 zP$2LN8I~-ktW_rb8|)i#NymdRY)cF=8O<42{3K;vVAd0jGFgi*C^Z<()f#XTUjBgV zNYB@_Yuxe|z~W@RWfxGObIMY@L;$}#hmovpm*8EFVH)8D$6KYC5Ve8X;zDLLEWnipw&bEg37*R4S|ZGX0WFQSpv__^nDXTeNG{zfVL>a_ z7FP686MggiMpZ`rf~vX;6`|uHWgWHL(H+0GGX#q-8PJ596bEy+y)Go73zZ2pbD0hX z>}U2VV>*nt>g_oHc>DgtyvT(#eA{3~m=MGvI8hio^8+7EEDM%zzMaR(A56l92u3nvbS+^s2VGbx5 zq!633>frprXoke1etJ=(pxP(`7e;hfa^s)kX#W2|m;K)q6c^T4ol5a^Fkjqf{SxQ4N-_4SQ zZI(gpjLOB4@;jJ_z=AZhC+CNr+f(I*SRr0ku%J%;VB!lcA%n+O_~+T0Y8QuB(YidI z<*?S^dARl;-O1{>g-uQLv7S`WP$l+Gy@1FbpCH=c86t`mmcyZPMmoOAb zJ;<2}FHnx_OC@;eCgo^%@#Oa<$9JU~HCoI;iXnTu4Qp>stNU|bdkcW*Q=n#bfauvd`v zfJBf}sBFq-l=0D>RCgg&{eu>qf|Rle(i^i49 zm>}A0(3AE5i|sF!YMY6x6*`jmN`X!BtWDwP0ULVAS!k~#SIWg?@Yuh^F$T<|QH==J z*?EsP9DIIk?-tTP6=Tw#QjRIe=#gf-Ko&n zsCE91Xdg9(Sg|g@&X|xSVI2;}4En^rT8km$5Lps}6wgA14in;|G1$b6Xp4iHDM(JA zB>M~bEu+;gsYsDA1l=8zu3w*egT4xiRciecYa}HVIE4yMHA@_*&n`sA?wE6WVgo6; zBb0=J(B>9Nm7k#kKK&m6R4g(9A4o{Cc3edpsc*kF9$G?GfEcI&Z>xB&@GDd0F(B*< zCd-3(=wu0HZ1}c|gyc$&=MnI0FSw$9+>iqbt0*Chpogan)fI5VZY(C2M}mY25+p?y zEY-{OF^0oxm|9h{#8sq(fb5i&PDl<+O7VLbW>7H?HSul$kD0*c2ZKU>h-<(5|?>k<`Z5ZhkrHdwQ+eg01#Cx1v-%Zq;hww+wiseP^Q3PTtW~@&jL9LlOxv(89N0GlHY_hlFX-C-efTfANy9 zWZvM}xLI>(yJ;mfp7c`kS)7lF6A#y7#FNQ^OmgU5m$+n$2Pm5XC^WeAdh$J7l>-VU zOZ$QQKq=?7U>b1>p#w-4+y{s1C)fv4v79AGxzP!D!n1SW3Ny~qY&G*ergbEEKqT`N zK$#sPPU3fzDNrl>k++1m;EhUN!{Nz`x9r6bZV`PDpr)3_qNganC#Q!^O&rp;lZy4O zO;Qw_jHoo9z{{&HMNQu=-?&l+MD%*y4o|C~p{S{li@+U%0~;Bs8!*6#zPbNEvE=w1&aq~CL)X@wya@OZctdFndO6FxNwd!2S&=1 zhL!l#J~81p8Uwv~kRxGc&5SV&YPFxVZIKV?EJN=2x^_x@feR6UAC3?!I7GUb5yOLf*uA;t>os<#*40+JTr+!P?7}|YIsI1$|WG{uw>nnw4`h_h0#SQs7YXgU`gOXD0qUZaqO9d zFOj6i->LPJ7m0IN;(onTgx(Tz5Do-ycb^yUJjA1nXk}w5vO1xwMZHNP@i*O+Cpsn@ z!(u|4DLOF}diT@L6O;xmc)X{1C?%#>eXg@_8lh@*ZJgcUi0 zDt@2_#tslk(6F@@JQ9@#)nSbsLbD^%J+uo@uX)yuXDMB!gJ9WcT%uCuv2#yfN`9kVCn_3}7Dm%j-|`u2+Z*8GGK!Nc3g~BY7P^sR$-2TYy_Su7;jy%G#vMGO7$;)4m8$^}7ie&dwz) zIOWO+ieh^)E)Fg$`qp!_W)bAXJx$!kkjNLO535@q+qj7H!>Gm8tn%bSZ-z%@XmL-~ zjztqftJ1D0h1S?EMZppWIbeSh1uic;Z6)Nn_kP4&cDY57FB;>i7_OYN9b`IiEtvJR z2pR2Ah2LB%MmLL>KM3_`#19F^!k$EO6zX3Py<9VC;I}{)tgw`Ds1tRCaVB84c|#E< zvNw$8H4;L~l-fASWjA;kNRBSjO|MXhmKzUYK=20ZBP6*$eI%70x0OC6$>a%2c+p27 zoC9`~Tqy;@+e`WVXpRTu;4O>@51hT$&JubkDYa_p!km_C#F+*|=cQ^^a1~8zTqHdi z*}dkfy%6qXmU-;eUmgKJE5TAB7!VeYjcL2A?+%1px}h@`wg80E|1W-ijO#&YHfw)wbedT-qcEV_pXdx(1iGPtc&rwn%4m^`tP7EI)C$)_@k2Lye1Jlga z7qd;l`_(c8*5M^MQ&1A^ZEC%hrGZTz`kLtPDWo0)1c#T$#T9?n@Nq699!9PG9|1lTy>8(9&L27~*$P*|eZ8Zx-9 z?j;=H98_@4Bm}~Ckh6=bHQ^BC@VL12*pppuXjKkb|0(MTn0`)-LMf2&xg3Xj<`CK- z`t*=2aDrQ3EN-GO6Xzgc%S_}pzLvZ;tmLEzX|I5STN&aVa1zcZ#Kr6@0p}yS;Yz;qE3rxVE%|H>F27zgyb)tXTakBrxsl z6r0<{+Jmk2HH?P|wwE?`*H(9~7i$~K>kn7fHtt_9Fh;Slxm&ESJy_etW4oKzIWN~% zeY4oSS3FqVUj76FE!|yPU)%jmmUC}ycZ1X2!+cA{*3$MaYE`T+Z5LY)x3@NTWHjz? zWo>79eQE8%>Ix#p8<@9P{pIS$Zn5*p()#+O+r2Bpt*B1vEh}q?bYR7?kxVc z3^-z)>(`5&t<~i<{<8X4s{qH+_Gi}t8txH*+*$os5AhtnFIJWwEZtw-DH<052#2)% zaC`Lu*S>j=!%5&5aox`=&I9!NTQXE(}<)vt}5C zPj?2P(AJXP+!dtdtpfWIc`ZbOQgR{lCx#!QH-{^J*hc|lXPv*`KTm0Xxciw&H z#^A-^15U)B!kR19_BW~}mV?^|2FOB%utJ|B!r)w*_pMX7W%--EzUHS#lerIb5RMGhB zPdB#i?rcGKc#7;)1bAn)1pZ0$98J~lZa$Fe-53*i#~;9Y+`jMv_x0is@&3wE)>rTC z&hBo`D*J!1wEc@q?Qnft$A-Gqsf;aSa&S&kTzc&7^)U8D>t20ucXfrb=8}tF6~Nq_ zzuCNC@vk?*HiQQuj|mPc6Krj6nM45#hFpMLdw{If%Wh(8<(|*cs?3p}?j~6LHssYM zfwbx4w=3i4C;VFDZ?A{(YcR+oxT0#s5>TdxsZDXI?Sv}G*i@A;x3l@6sJX`X8Z)6* zHRiZkf!Pi!e-0L*Kc3EZPR@{Qe%58Wqz0^c-v_B~M%NROcb0CB8TV?^%114Nm(Wk4 z0QbAUg3=kwikn`|_!MsUfa&^04QQb-pOBJ+7MWP91pR~q(N@xk?`tf7U-HqR8bZ;` zH;^T&kJ^P^r4uFGmc{%GUFYksNmJ2zgzvdbn8Q{Dx_O$qviG^-*ZSoSbYUcV-@C_r z@8zYfU1)Lo2vrFFyj|Q!Q5Ei!hfu`f|E^0N$3SziYO61#Fec2SZ*8Z}2`M zD9e{}IVls?BDwHkB_Zd%vWn%b_*-S)Ncc6Mfx%2gH7uopmKK|`K8%=(_4z8}hptO# zrYahjWQMVM?BXItJuz1QqL>x|%63_`3n?oM=_*3X^{9pTjsDt^q2A!u5$wegyR;mQ zsePmf%5$S`^QBIN-;kf!;K>v}`sgE{WhVKaPfyVg5t{JWcr$vI{Qj#jni8^pqn{=! z+Ok|S#e_(HoAbuC5^sOjM9&Lc>hetmFz9$JrQbWY53>y$;KSuExySn8Kta?f@6|@z z^T+o!{L+{{IoL<22C!y5j<};yYnS?TZ(!kTIJ9SzuUeKda>Yy1G6{I5J7e;IIXLrz zj>smzfx3+B@M7OXqE-%~ijM*>j*6e1@CSy_3e`SB@pC`J)EuijOFtDG0C?-8me0}f z(OJt4BCbChvC`(1hew?17HmN353d0vVBUGv&iEn0gtR$niWT>M0i04W6*ru!4T_h8 zTT}gyIVKT*;Ka2~$ri&F@11u`6D3M5Ci&HoB+$FV53HPcRZQ6^_;p=7FjXE698yM< zx3;LO`PfC^rD0I%?IBO1=_M2^>06{|>upp-t5n}%P-uN>d2_^nOy|u36PI#nT0k$S zh5_MvF=gArx;;e+uwck%@V?p{&8N*akJXuCF2#@L{Sd<5V& zrV>5MA5=X3B_R$Fv7{wNB0&xrDe5tyz{m<2y+XIO2_CxKBQNCoEbOAY+w4 zARBJPY2Js5?t@f7YqQX0R;N=c*vfiMws|?FFEirZld=;9fww0vyP(?mEYqVv7S(bd zZ-hp6B7O)_!z~{`^$BtUgaE@n8+$Nav{q4LZ+&@xd2@YzX%}vAt{^43xCVn&b?gy< zU-j}a7Pd1ZiImZA9!fcLkB*{&6Ez-$mC*iZh^|K#d#;?9izGdA(1H&NXl-c?8-FM2 zI{L7Y(^!p_>#||MqIA46aZE)Ezr@n?d0}b`2~JOWNuBI*V|3@Oqw_EonW4K6;Kmg+ zLJmpF6T|oE84){Dq{D`hoYL@#uNTw9D#rQ#3UFq8uZNgpoztK}V#GObp;bI0yWo%2 z0wP6YYk7NhMhl_%$y6BIM5pOTuZe~@dM~bmH9ydjQ9eP9mLXMyxI5rU3?@Vy*2K5e z22ei)(;o2iw)}VGf7Bcfmb`fp$k<=!b#VlY*@aa=;%b(TAwbv$w~(qZ-lMLI8y(R6 zK%}T72ZEY#6;0q_bzT~JoNLM|C-HYz(nzdw0;K1xvQiw!x$8yZNXAL1;3wg1Reu3p z==nhv!S4nI{llgPZ7I3Ph9f@?SPlhE3V1Ir))IL{e-hKYFmIi-%v*)nBtM1>-au1+ zNTB9x_KC|_66fUOkriPd5VI^4_!CT=k z7j4-Ndk;$1lYKc+*2_vxwX6pCA^YiulTCPM+(vcy?=Z9un|Kr^;bDF)K-{)MbdKpx zWMxe)6Hh#2mo3^%79SuE<$TSwyJ8BKBG zSR^D-ehhw@CL8>9vda`1BE{hBgGdTfg{7D2DPy=g>R7tM=(U*Uvl_-#Fv=4Y3aKv7 z`yJJQf~}>{JO_VcEF55@`E#S3xMC1V=0tc>30Zf`s)rx`=x=5kAOC1-=EuY7@&;W( zR(2GHiF9_C)Kw%0N)tV+7Ml}~pK~CLu-_zUX6$a09`=>p=Ep(?qRyT{PnK6Q&lAQl z0Xqm=MOrzV*Z(kkeaNYnQM%v~dzIyVr@iia6Gd1$X@(MWW8iB&)&76H-R|d!PSa>l zjm%M$^-b&TEtdrBj4jpeN+nvB_bGbgx^k@ zNOZChe4xO1Rl%R)TlirOkN7h5+`SDZEgvJ&Efq6auK}6_uZR1Hku%kZ_~PfhuKK)R zWXWH9t7!ju#%$pWFnX!q>UMErSk)-)KI-a;+KF0zkM{OnygxsS{~jJb{&5ZEmXzx% zrV}1Y*!(RLMwDqa_}`)g%z~HiKE}DTp5IN%~X0}B)I=0R|Si|SeWWJXqC;} z0EWYI+uwhHB-726{r!ZA6G9P@`By|{m*)azW<)xOu>#?67J9^>f9Xi zRyTH#t>K|gj>wAk%LlBb<)q$dt}(ZR-zB#dft zF|f(Fo9z3Id%svo0F;c95(ZXGvVCy+)lY>6rfZj3+4c7Y((2wTYQ}CtEP7$U^k|bu zlEWVu^$u$MsDfEx9%8%6T{`q{l4~kp&i-OWX4oVM4WaV;0EJH=9PqOi{_;0#>`6ce zZYlrSNu#zkPc!Tne^w_nEWex7NnwgWS=f}|C>O6@Cob)R6b_A@q#W!b79MA-a`D&V zF)4;%@-m+x+du=aTDB2cMg_$$;?iX+Kn@-71I!Y#n*hP@BXX0&FQ68&*^<9``RvIM zu)EQ14QIhaKS#3D4Q7JNyF}>zoOO^COixbL$NMfwZW}4~a%k5nH_9AhVo-$=Q;aLy zV@d z1!j+%;DN=!mDrKe7RxXTrJSPNyweu%et0#UBjgmgw;Gohu|8Z_gx5Nx5NL5Fk}`<8iR_+^0pD#2C`1^wWrBo}~#tvUMT)+P7UwAT2t~N%r^L3T1 zJp$dwKm^BDiG&>8Mm}1^4Gqh1bbpySI{Nmg)&50zB90nI^pj8L)o+u~1f?KSPrS&S zILOBHpOMG!>&E`|<`v7H@dc%&51lkBXl}Di7Ez4DMiQ99{p(|_bIb_7=%0p@CnTM( zny!Ey$yy)_71~Ux#L#h0f8jeZ;uTgOqa~iv;~xdfoLf&!lMhi1AmB|IUz`;wTGXJK zwS~=q!g}#sxD@2(Bzg4gB zs>T?cYDHGUDd3jsRblF9j^Gj6(Z_gF7sGhS|pzg!Us3n4F;vp>2qdUpKX1 z+4nDFVK?5zf|o{8b3_Qw`Ec&1*q@y1f5U25h8>UW;2uwi+{73dxf#k#Z0Jsk=yuTk zbxF6cM7td0aj4(`B|U1CmPB+XEk5tISq)Ch=hYKt@leaAqgpbGWS|y4J3PzFiblNi z$a?Om#>2aCh&Dy?5r;RvmG(j)hPUw^3tXWf9I|oIWq|G|+={eT1wq*igmnoRSw;M@ z{6MyQ2@pj!VLXV^Y(j!neXJAQmMhi!)BX3@jS*}Jk1Uh}M^OunzZuq5rX9f*NK8RukeCvI5k7aBk!7A<3Rl9hyRtAEqcUzXt8UDUi z`u@HA@AiDU>UTR$oy|r&%)dQ+C;j%l`S-K2-kU!t{SBLpS);a=_ZCXuFJusV@11P! z_ufN|(g@G@-ZNJH(Ocf-R#@Wd-=Edyq$dH!)E&K?fG{4?(KyfzPA@{ zW>4SD#=8AZwujrzY?ZeU7BcwU#@Qu1zMY@NZ2&+0_Anm{t4?A4{(Lsp`wQ9A?=O^| zzWGl6_Raic-@lcQcFS;5&*J@e@^9aLKZO_(SXWkNv83b@Dd47ciB&2yz?0D-#d;a@ zha(0ZH()x%;lYBPO?g>LSn_=eQG9?lCJ`YI4*(?k#06{QZUb5|Z!BZJ0*N@tNhNb z+bP)iM0U{p0CFK=Z2Tm{4Seu!dDM5yqrRI#b7B5xImzM!@XG|j@WIUtVEEwH&q_~V z9r?+G!M$_I4GaY0jAA%dvN<^4v&M|l_%`%%Dm%}EG;m%64!!4Jw^qi zGL`rp)V}Z%;^KWkQ!fO%W~r%UYLaVKyDaXA|8Gj$)9wkXd&HuM(CePJ)PR6j0P(`- zt-k-sFlU!t31JJZt*&a>5?DJsgLbhnKY#Pa0%~f`FU&~j*=mKM3g}C?hR&Z3`^7JY zN2gwHLpm|}ijvx9t>YW5=E;p_>&Ecu+~1x&d3y6*lpgEP*`jW=T*LHtcWK|*il4VI z_wZCKfTDkd#KOXAG#ZHKiv}3{^OkO(_J9wQgA8_Cn~jqYEVVZ;0J|7?K31>Q8sd^L z+rGQ`nH-0VjWwjB<5Gbw%*`YpOX|c*%RCy9Xl+f?lxh2=L)I0SffJ%)Z%&E+l(x0$ z#j@xxb?G1m)!1>Z)-5ObAd2`&6zsXVViy&a1*P7fJwTCX)T+qa4!XsN8C7~a&nwfX zBSBn2S>FbWMO4mYI@nF%4EPLppITr1hx!qy@ZhV*n#U~$%ZOE5 z<)X@>*Q9qG5+D(GEm)8repjIx+V4^>7v)^JqviRz<%Q~r7#d<+1NlPnQ-tAPEPzWy zn92va9K3n!=Fc*Lg%5IN^=9Y&WC)zdJ1v)_VtL(~hY&PaicQpPrE|`|Xy0yT!s@Uj zc@LY1KA^mR*vTa({?5eiVJBCQ4?DT7a(I}}e|QMFmI!vVj?FfNzcbAdXPFOh^YHL6 zQ`K&jpSTsDa6f?JWD;uCI0n33U~F1$B48((V`MX6fjIT=g|Uo^fRxSiQtQlm<`OUq zH0rjrc}Y^1G)9toYJ1!`n>Dec1S*@gy2u7sR*fr0nh7ptgGWL_gDFyP8Hm5kqMOdd ze{PG#LfK{0KF-3PWf+9MQ7B0OQB>lrHXfZoEZu|3C;L*38-q8dfAZrOOx@VSCXPBU zSknLlFb(+wB-+Ge*H3mItk1IQEDQ2_ifaW===EVIqLJ{p$P*M`@CN-knRBKDs*8mX zz{994s%R>vJ(_=ajZMle}7W^EeB23AUE>3wPgN7nIF@0 zAzxqO_PLO{`DFq1^S^W9{D3oq`2nKhh#c8-_w=#8+ws)$630m*trxC=(3v zrUDv0_fBwZSQXM6^%6!|(2*S_7g}7A?bzMn}M z`ZijFqs`c5DlK3!{bRK*F4!(QOoT*;-T|}Ka}_9T(Po-BD})utD=|JBq;<^5tAw@2 z(Im6w#XPr#$>nR^Pvrz0topUBI@8~R+hKoy(A$x-9ko6WxanZN#IL-D{Jmo&M)SG} z+L54A`rKOrl;v1$esS>-kF3fQjcH!P@?!Jh7pik5(n&$<&m-xbr7>gON~fhu(om?W znURrP)7n^iuquVi_xGuSW-I*atq(uGYU&~xS65A4=tT$(Zs2#M!>z8(j1`~uRtHy2 zU9OtCTs3vMYU+XxFk}hewW&+Eu+NTy5Ut_wF)d!=?Ptnsu40wiq@*>Gi;3h71I4HH zcC^3q^EcK+B}~ow*I1V|s0kmVOUjibPNmOPd$lV`4E+P9*;RYBtM+PW8AhId)n4rf zXs@<+7nNl47Hhp@Ty*iCYt|2}B#hHaBp6`t9{ft?aT9T@F^rlpk35v6s-{EPWH7fe z-m-e|WV|;gs(t0Tq^9i;Fzl^#5lJ4vWIx~gMR!nbZni0dO&_4}6g{B?i?0IE)QJ`sx6!u{T@P3Gm$vUeWGh0%mky>MUoRd_ zA9aq;#=N<)nZ9%M8t;5O{n+j=BvH*>s9SKIpo|jhLiIv<#Fa~&{ z4PecWFJ=#0!8JgRA6Jz=e}K9MPpe<)===N4lY{P)VQ<(UHIL@DBLdnxe%8^=EXg}? zP`&1?M>TWldOoiC#)>P{gTXv=2JT_M`2>~H^4&(iZT!uihhH5fHD>Ry)$Q6Tu6g6) z9hpKhg2yFN|5;=SjXmOo2VwPPc!BvLvhWcWj7vc@wuc}Xva;f5x_bS)8aV(m<6)9dd~R1(&z044W%XP&mA+~! z{X;jE{(h{U-JX~;=7N;80|{{=U(++esrL3H!A%~$*z(cDsyFYV)U{t(JvBB~ZYf<^ zJ!*noSv_b4>_(=k_fa#Z`4?@S_}e(E2RtG%Ry6bKn%mPZrGvfyu z|9CB)D=*pee+(07AiVVZGJt4>Fc2h06|#Jii_>Bcy;&P*5=n4n30=j1(8LdBJM%?T zSX^adJVzIFT(*KcaR{H`+vHIA2}QAxG>UxT=jYu4Vygv;TAy_Ll1S)^*e7c{#m?rv z-A|XcR}1{UwY~YvwUyPC;_hb!qSnRo=GJH1Yxh6dEk4;?UtyE;CG>`0-rU&TUc38n zcM~66TiU^!*El=BTiW=nSp6%s8sFI|Hn)ql2WTmd@h|}jRx_Lbda<^#y#8=yZR7s+ z0%H^#o4dvO+5_}ZUnzDsuXA1wR(%t}j^e@U_VOnfXzA`6ieG;wQ{G$K-QaZhFyB(K zwY0svw)}8?X}j2ZxQ&>*jK=+~tnDCia_zzD3hMT6VBTW&m+%W0JD)7AuTQ$&yE5GR z+S1+iRh!-1djueN;HKt9 zho$vmW$D4v{neeKaRGpENXuxLD#xdK#@ zVW#>fqbYnEQ|JjW^#cEUTFyqEVs?K}L8o3seRqm&GvYTdlW$J&O}G*8BGE{vPSbB* zrr%guGep2F!o*Eat>gJexTp)4_MU8Q{}Am<8nY-XjnGAjSx6IeVNZISBHJ1^`2~j2(iy(uc6r4DEiH73Ale?DYsivi{g3cA z@4R3FZp=S>46qT9>1X^%K8NQYz{Ok1A#oD^OyPPc4%k{P6K{@fD84auT=xnJ(ZpAX zZt@CVn`+|^Im=_doYrvH*@y;m98+z9J74rW3CAt8|7~J`gPJ*+jGexUGm{;$lmQ@u zsgrT>B^QB<^j|7n`{efT)aN{NLAQ21^z5HMsMg{t-n2*dTJBs z%ZWj#)#0e5(x5`3{}Wygr-=xbiEEmN=o{^~tH&@!VRoP5#$V)Gl`A&FIP+(mvyF(i zmG8U=Mi3=mR#=%5*WL*U1d>YbE4=`ohd*AXp+h;&M9p7vwyClVpmbItEkwOEqG-M{$NqDodGhIPHIg-{fen* z1LU$pc#CcK0O==is-B<&OLqW00NMd$D#jou=Yv0h6=+MUnt}F3v9{v6MzGbGi-(0) zDni6$y!~!o*gnyO9@uVcN3Aiv!l0(5Ozn41@vE4f(b7pKz{0V(A+Bt);)?^E%AG4# zb^$VsoZNxL3;Htq=~T2IO)1mO;rpnTSb&20R6IA))8!=nlYQ&blPI&Ql<621eQ_j| zD(W5}jh}c*rBdZPvJA((aD;ME(z`y|Gx1^tN8}Ao{&QAu`yxSb&Ca0?RJ0pRVFnz_ zI$i0SW_kX`G|o`qxV8f7fTGO$J*XMVOZ3u6F9BoJ2ul}7-M+Ci@%r>N%kd`@)Pg1| zmJ<8V>esT%c;azdQ?5r1GU9+4TXAfOhZoMrHFh9lh0IEo)_D@`O3tSZ;E3tST0ykr zX16b=BbEFs^mz%)oAefU^=JeDUn&@Ye6|boTRiQ&+}FkNFi?qYfXX(l#l_^@3^6L( zWZ#jVrWyOjvMd6tc)Ia`=N8ji(bAbbkz3t7kb-Es*1ok)kHpb^*(dOq08 z4IS8rEi)ho2e1NCBJdWxzptC~;@QB7WhJ2ooe;M3alnzCp>Ia)>^up4@^_kR>CIpiPpRoj&Ky`p+_J^QZ9Qm#K*1L`I2>+@Aro2 zwCd}wfSd{6e89fQgjk@s^swc@3d?cEX_Gq+TwOQ>K*DwRDn6PJ~X`hTG- zTG(l^cocQ)rVZ#r$-202qb>^aW>86<6W;k<%e!SgQ$@?IbyAo6T11p2QJkT&?;xp2 z2!e(tiV(c^ z9?ZUK#ELkoJm9{BHJ6ddg0_eW_#ewIgVo}l_4-ceKJL~a_pg=w;lSE(2tx2ijF3m~ zXlsDFJn#i^LyQD=983)CckOt}kPaO}8BL;J87UP@(`{;^=ms{oipLPtPD~dyZhIG} zTU+sN#1l6V%IB?TwH_yUL#O37fucWlx>Wi6`HoR$lgMoV=H_IfZ`R_NW-vqy7u; zIEvmB0v69FRU6&AZPUw&?}8NYQ4M3gp}-sGjn8c=}lTvBgZl{cyz>9MM>R*0tAYUz)reuv%fx+8Zr;O)<}) zGRkdlc$`xY-SiytQp|wRn~6g>r+9_^x~9>UGx1cfu6R$l10DGyoVeQ;xhaSyis2+s zOG*7m`wvTn$L=e1);WoM?xxzj-c;Q(ihs&|g;RRhUw#(Q=nFGK|eJhPpPaRdSp@$NF^0EvMwjt(n z1kfsxlj90Dw)3zAuyfm-YoU~%oOC9g(j~EDZH=us`5peoP6qnyrGR&BJ##PPJ$6x% z4ril1+L4c+as1p8{X$RF+-dDb3?e93P-%gGrO73S%o*hCrU@jTP0o!Dawl6!pp@T&7*Qj-a)f-l zc}6i(3r`YLD48d>$RdYdkZaR|trL*s;+CRg&)!RKmqJEmvX&PMvvfhKjQEv1uXFpQ z?H;gcu8mQ{YyzK!5hL*8nPsFJlA9gFnd93aacnFF=?qSmqeBx<44wj^#NG)!%o;DU zEV}JVgpll-NaKPfk?&0o*8f|r z{bqlswp-svdMnbG++BQ;0q-Rw`7uVxb!-A_wrdxy7b_}+(rk>GuKNR^pZ0HFN4B=TIc4gELS;W`#MmvKu@9INFc*zb*5GeB*UJrVs4;kTr9n2ab zB%yoDSWXjIfD{gWF8jD(G#~IteNZNb9ZXN7<4-g%1izN;v$=+?{rOv-)SB<5Xxs~=GAm-q*KvJrw}aBJrGzurhTdg|o~3NFv(jOCb1v5u z6|g^KY`)y@hAVjmgzCjb8VaGVl|r^s$W|3dPI|m@ccqZ6Dv+>D%&G#(x5?kQLU!1h zoR=$PsP!RFQIF(fD`W=PtrRk!*?vxx>hxh96ULD@6!+Ujj z!{@a+yrm}YFW~S#2oBl0KSb%f{g}>L0C6j`0KFtA9un@8$h(&;;11`#B*U!PA4!6< z8(*0S5b|aqOwd<^DvT0K%0D$GG&D8uQ9<}xMn;e@v5FfNvHjYoiw}#uwmKCQVow3( zy<|&FV@cQ)3kG31VE)by!$LW1z9~_+ZFhaxdm*lILG1Y+aGRNRRt_f}dc98mo-wn6uJQ~Jn5YkxLXZ8PkgQ+!Kr=| zFaX9{2ZVADx_66nw~)^$FaSz)0CcWYx0UL)Qr%Xn+e&p?scyU^gx8t;0#vudAx^{@ zzFvF$DV)82Y!uBzKJqw~kL_ZN5j)dfP{91zP7kI;z* z?`|;=@Odr>Kpd0%C6@8SMz5iOk&TSMb0ar;*L_##$|D}mbuXk{aXkyP784EU%3LEE zpuof4?Df7+5Jx+AC=*z{6zGcdLk>JRJw*;L(olP62=9B}OK|=86cuN1K@xHhQC@UB zy}BBXP+#StEnI=Ne~qFEh;qjd%O`YkFWeNDtJ7zoX=Fkl)m89n_(me1cJxJ~=aTq02R^sqV9A1gTD{*)w4*!D0VMvpx zQ#BoRE^x>fgd)J+Y6A)` zP<1A$Z6&qb&?Yfr;nnq1qj2YX5AB2Ha8VdNfNLy3$WkVGna!=(u18LSN{n4d^eELv zusegKX3qe8vO6FA-57k|etGbBJRo5ryGu-@d)~h|!To?m(|GnVC$ddImY4%@?$;yf zUtacbdm)708{X5^?VTXafp;Tj7Um!CVn!dl39BdnjuhO%qzPj_h}liLvbMVj<;|Mj zf4__AExK{i(4)$EIoW9{8vO)+nf4HS4INCPu(3WTRwYOi{YKFH5w3;XN9J!K?F;+p zU)ia(4_oL1)=9e7T|XRE*5qS;aTb{tV%rlq;4jHqbz*sQM~=76o7wy&N=-nVI5vls ze`KW)t`x$RLby^0R|?@TNFjV7MUTrJBwDMO&wYq`QlG3NuN?_ys)KYOdB7JiP_wct zZtSedP%}L=2VtU+M3X_ZTk~Du z!?x?rkKwC#dq09jlTf=VjwqRDILA~JDF{$A@KrB_m0!9q(-L=W{oIlom^m$eZZQR+ zgaVCu2XZqAM=7SX`?>y`6Y0jyGB4KBL%|_fWc;G{zDE-be?q*GnIq=m@{HB9+0P!k zDVUHAg^`Hb4!?n=sCNx3U2cO~Vnq}*SSlv`)0dx5({Dm>Vu`;`dmgIhT@ zy+~Qax;>xfDZCUuY*~lmmAFkiS^U#(cV&C;bwj zx(;Vc1INr4r5KPz3|pEHp&IFEE9X#@)^U+u3Q&rBn1uUuSeC?oetSRr|Yg-0OBMitD&{-g(~#yMdDZ9@c+D z7vCuVL8(V5BcyQDwH%I4=t*>tdi7l@L3)A@-h}x!cdmDp=_(bZueb@6>57i%nN5;I zhf(~3drOi@%81IRkr240a!G_sS(qkJs&RP+Y{1KcP>K)2MfrV|Jk7&<*cl;0PYyb* z80~`yQ)`9Fr&0{n0I`MlrT~S9c}>!e#IUP>;ZCX^yn~q7DeOY}7#1AggW-MtN-I6P z5ipgNwz<+aSK8)E+gxdzD{b=^q;2jEyWi71k0Y=^=R~fAJpBX#b_Uq3G|_4oiVVFi z$QgjwnyAGKV;oFIM*ot;$%hYD%ukQvFhLn_EK^Few)_C-(Rg zNSYqBTZx(nFg=Qd=dLJ0Ccp*dOk`2~04AM}^i^Rqck=7k2Y;$HzG>83B6%Ud#a#&; zr8V!Uz%{(nVRsJN`vAtRhU2E^u z8@27$LE~FWc(dlrYZ~uvY&YjT2*nd;I=Q%^VPba<0XgAOE>fc4$eV(m zB#@&eB_1~{4RN#7hTK2|`8i}e!{8lVX`bs3f+&ip$O#tVMB|qtL z%`}>$+-#PS>}6b{NvL>N7GkCpM1IH{eYb~KHz~{|jUKYTa1#@p2gtF(o%bqgYuY@@ z!zZA+@f4HoogiYaa{=vVh{mJq{kraqeBW`^`H)J^sj@AtyqZZ4Gcx`_ z7hOUPI0&QwwuUc@cfK30@YkDEM*5?$0cG1jsq*|ISlj0=0AU0Ehd{gnZW-y>ZJu9@ z*WfGAk7g3G$E1|c=d|{F*HTO0Xn!FLUUH}u2BklT!v)AQ&0h=A>%LqD%eKAz+FyPT zcE^tV+Aqq7mH;X6zzB7yr)o_5!Z4tnqKMv^T%L%c^t)}K3^C%$SD9pZ&_QD&hu!9!NgHe&UVCw z2H4ivia@^R?@AxZcHK$m;#b}_v&{Y$0NGJRx}6PP@ojK9EP~k!m1D1j0N!PhrWePp zv9D5~$T6)J%k;7{{@%ETZF%p;^SF~{MBW>=PhpS8ClfX|T*sv)cIAD&D|a9m+3Nb|m6>K`rdgS3R%V({Wv0Qk&p3=Fr)e8b zF0dn1!n*mr|FZTTkx=2|;b=G+c83?ge;^izN1E9b*LuS-DSkq^V6%&K<}>z*YeXS& zAyvi_uaXKSI7Ehx;fLuV@rT(=ly&6g`-ooc978Wbj#1LZrNv{`0%tK=AJR3eVBLmJ zP;hayCpe;|%3UK({Kb#PIh)8nFEK;8wcZc-S2RL^!qJbXoV-aECXZnDTBA5 zp5_L51*^ja5Pe7EysGZ+?A00=Du0)Cqc<@-%;sGZ(v2UP`J?o@HM(X6$>1>n^;d#(11H@myFMw{1yW1N5a;=dHk zYC4h_!`X!J9{2ASM4Dj}qBH`$)@yC0AdK?%yWDi#7IZ_{PRvnT*&qn?MIM=xX4l&G ze(_kE!X+q6D!4;k@QAp}fBAaoH5gCd95HXCNX?2dn9S3{Xeb16y0uk++uVc?M*TAw zgN(_Drsw5;4K{VikX2-LprO}gQqZ9poWp79K7vnsk!`I4eGU|(TI$+`7@so&02Hb( z=^h0OY0wg00_X35L8|A7FF)>~N(<2619f?mU}|PF@s2KDpa<*&=>W(-DmHe8@v+7Z zr})e4TLj69tBBcTf(k8i1YS8I}%8p7zdHnqTtk#5RUx4_LWR=nyzqeU zW!#PA?RsZAIUg~tV$@sTNZd!(w&5quOP|OSKsW%`=hvs5{>4<=U&4q!K|w5jeKi`M zp?u7ke`EX0EvEYSczE$%nlOQO{kw+wKhbfPE}I zMex~X&h2G0e#X*9@*Jc&ydEd9e1BB?q1(ISZgmKBI~lizN8*Ct(Vs_rG2(VkqE_r! zH3dUmZoB8UH`jsZ!R5(6#e5<|)-?Mizamw;-JKHfMV z53^kn(Sj{0a}f9B@l{#31^x9H@o?%BMWrsJs7%MGNp{kMW`cdY0csx5Uy3yu^^p{x ztS3*BbqVWn!#}~cej3me&6{w9{mD-TGVzt?>RVelx9Z@z9TY$g(+hh!bVh9bsy_yI zLy`nVvLF+_6`un5N``Zkv;!z_^^s~b&*JUIVjAq-D}+jr%GaApw3}R%^k5Fk%xY|ICe@RZWQ*MD zu{i$!==tY|3`m;T>Rt@Ty~oErXxHTLhNuXHpHXuV3Tm38TRR{vC0_;SIw4Chz3e7# zlafVsD{5==-Ga1`eGRk`K_@3m8q2l=i%8UQu@VUNjog8Bz+)sjZ8G)dU@RDRSvHVW z=v43Z$J9O)v8|-VDlS^=g{fvZhE+Y=fFg<8#5EoRD}1yy)J3xn!|&N4KMAZgb)n9LRkW_H#xg z)n*ytyOKL=_?G8UMgmzTMA~)i1rS8DHo+);9v)2x{lD~2Fj#<2$=`SL_!$nw!_Ej2 z3Cx`1%G-4u-Tl+P-XXD`eDy4O>xBLFwmiC7|L(h@{vyoiN%Hs^&t{CC9$Yzk8cBsS zaUCuqx-5YckJ>a;f?07I3myU+msvyz%FKrEMUur@=puv3ymWD2D-q5;ju1YDzl?NQ z0clY?75fVB(e4Wz=}8sK$Zk_8LvqS5zblmX-1e1jbvbgU+dN+9x4W@|(!x{e-R(Gz zy#Awh!U+br!wv@(EBoMdVrmwtk^6AA9KWQ{sS^p*8J10UiIeSgD=s406$)CqBpL1g zg_!eG+(Nc#P%(@E9QLy8sT}m_V3yn+CTjzzUDyd%PL%!*s3wODtz(2t2g``N(JsDy zCwa_9-Nv}cQT5A0lV2*vEJxTNO{m)L>-528_NNS`W{8_>*}J@&Fm_IlF2!>0C~{jV zjq5;$?s2-4NFj0>$%2zEJ<~IS*qj+xvM2S&n5|b9lq46NF=8vlI9@vQg41xZW#870 zKM5|JYC3E2mARTNJzbxo4<9N8{2Wr`Km}`7@=vp9e65^0^=gQ4iV#_ZK<69s5})5b zuhiO~vdv^R(|z*(442F8yb}E|!!1i_vRTM_o+OBiJDtLXFk~I?4nh=ZfWhyC@V2#iP&o;f$7;fcW^x}>IIsICGCH+Dv;_H! zVh3exH9$ej0TLOH(Slm%QZ5DeGPyOtbJ^D45v`+RvV!kBRzC!SKL(NPhLQU{e7uaEj;cqw&K z{*~nO&yxzw;rjKu*aMG1sGMM4A#PyJ-0X?QY zTk?`w?x3+v&71`86=dx8hj}VDUg`r+$31KgTy|(bt+MQwn5PSac2yZzy-|wEIEK|^e)?;Cht7@UiT)QozA55F8N16z&q))jXvKQGnH@~ zwJH)t;2!W35@%h;jPp!@85m!8PFx}#$r1ro^2?va6jlNKjr*5 zwa#Rhl>7tUq~#nC;sRt$2ZqEay1{#cG5qn0w?+EHJausG&)odHx|E(A%~o5aqp&1| zOV9`8rk4fltZT7Ihq_#b=v!?Ov58gI6h&G70dLrU1MVTclFlSaZ)_=SK>ivaW9#HyDswsZi4NNoFNW(ci+KZHWum~*Z1j>Dz05M8;;=~9 zJDpb!{5kdpg;Gng%NsxHdmw@|q;ApKaz2RHqs|rfYD%5Wp%aUPC0Pv2Z?r?TTxQ@D z0t>di${Mce1@RuCfBcoBQtbn=Iq)Q}Kg?+nZr1CJi(c26k{jiy?`S+_By(x^j0?c< zWg=I!o;-<#^%`~NFcn9G%vnzpUvd(In-{SH7aL98Z4TTf&(BSwTtW|`A`TJli^s|G z5r;;pb2n9g{K8@n%O>R+h&3#sP^$Ij5|UV@V;BZbg#u6#Lmp`<~*H3t%`I0X&}OOQZl zU2#9J^`qgkK)p)iFmW%4$UNgMqzVkiE(#Vy)ls$K>goa_JmUTlfClMX(?>;J32hf% zgw&n(1yEmhey}O>_ssFxHq)OGd8sqU8(EwmWKC#I6gXXJ>V}G2{6!q%SA-Nk?);EF zV|=jqW#uiA~;zrI012NX+tX5o$&{aD<*iIDoJv5Sq&wB0^sq_@?P0B5Z%WH36f@KG zuyODbW*2Q1MQLW50Vz`H!c8Iy;mkE`9_+E|8{ne}NrO8xjdtsMHAz7*_%!x2oGgxc zfg$^7)rXItog!?svew1|BB+b&{@q3hX%pYsk#lpsMR@8-Pdwa?K-P^-=$G~hN1h`k z{od2ndPGqADEfkLb$)Pfbbd$$ttxq!FxzcP*W95Yj>x&&%w`IuUDOdfMlAdXWhA=p zY_W}OJ~7WKoR-9!okCn{SBzb%lS^p|$rvVY$iYC3VLINh{vktzU|48J2qBRCqKPt@ z-0N2L15rh|EfTUEWJ^?N_ub({lv>xx8LVU@Ob2HzKsE5Kofj?37=)Sj(@x(u0tnkp zImmNIA{7_vc)8#}8jaVGMK-$0$=~vA#_az1nOm(usaYAQWZ_%FhoR>t!{dL4afW)3 zo*Sjp*T)Vk#S%`tJsD!kKy+@(j?0FPq^ODA+&P7Q+s7VZZ03N$s>GBHd_vSam(xMB z@KTwYpS0W7O%BqGsOlgN#?YHp3$3d7qxK=<q<9H>W{`ija_7546rwx+@%L zYb#=XP~QBo4DIFm%pzc`EqV;g5xsXqnrOS{n>cyt^ARS9`O{m#uCS2g3kIp8W({J4 z>>4VV#Dr02I$#Ze`Ic|j-F904?yZD=SSpGxP1uOE*Z$#;SLas`44D`}Hz&b*4zU*o zE*SP?AF`Iui{?(Um-?1Pnvi{mOZ)!s|4F`l`t)~?zkK?|?>3lNOxnFfARSgYsp4ps zW@F3`ML^z*FG%`rAY+9zjF?$k)ft6LY|(|H$)^0~80Qh3X*g>x5fLR`GZ;L*5A;#0 z?AC@D>u{uA_9qPA1q$E8kI4mtO^m2M9n#>49SRs%#VA%aLy^P+@;Dt0FF_u(GYn5B z*R-rg6h`KXXo{;|mnuE)iXa6-IY#C@<+n?uNPvL->GlfhLGxg@^-UET1^$LI@Td9? zWc(N3CaqVsWc%Ro+eZE6t5)*rU~i|^XrdIr4!+%QHR>zBN z+obmAL(wP>8c7|RPaXYXfJSw{Rj)NSP+uICp?B*0FE*YNHT`}@woZG2kfi7so-@|Eo$mvF+a0#{GA4h1h@)j(yzIveUS@(|e8tDb6ejn7vyh)?O@V1XYU|yH_ zF4@8S&5ZC7BW5>Z*)P~_pCm6OI1KsE8qv6PdC=kvU&TvVf|e?XW*;&;vS};6x}=~D zR^osF%XY|ef~;OiTSfeuPdUuK$k4u!x~?ebkBvAGBPKDXIY(P@xL$VBm32oRzedf7 z;AgUVg1TWhrmu~}00qj{DOgIx=7Nw!HAW$~mgiIs8vUBwke)GVV@=CCbus8NaMp0M zM`+41iTQsG-S9fmEKWFb5EPQ@*rM3yBCvo3S$EOQbiKZDXXTG6YV@ zKFqMAUbiROjOe*0;;`u>Yd`aMQ}06oQ5Z93XdBEGO3n*%DH#GLECeN=BvDb3cX^fx zoKg{&9}N!o@VT8xV$Hv2u|I6>i>T_W@02I-uzR;*g<9mqd$%~Fm9CjR#S%PET?6F!vMTZY0!}?eo3sG@mNk7-$f9(Tv!?5M;!-1 z39r?j{Aq^eiiGJbgE5*zbg{lC`F&026DVT{Au%(6lWH@Q zW?`a`Bj4!=DfE_Y_QO%{|Fzv7(M}+AS#{7G7Vxe&dD!DtI7W3zj+`l#4$_rtZ{^xE?J{0{+tZE z(@Qw2)gS;*>?Y19&C$3-X{1pfm+S=ps^faRi-{~lJ-U#lw6{mFk;8aM)fZeXb`sE5_*Xx8^N8gYx^yDJ4r^(H!qs4dg~1?ReO1Gu!9S_8%eX)_)~qm*8F|4 zcYwf6;OWlgw0-!gNZ(h~#Jv_Sm>`Gj~)$P_s0)IgrF{@Ea zj0(?iE2(%#Z?a!|xmSN#+uyDcrUQ2LO}$xz6bG+yqYe;Xe#&d7^<0WvdrdJJ%=O|O zyrm_F|>R5X+ENvht7rC6af0sLsfm?hb+^By&1B~{5q9Wn7r z^Tb7R0j`hX1w}zRpoBj`qnYJoJFGUFZIC!@HHXdJX4`#Mu{7`FD+Y5TIUim#!vKeY zrUp`~4iHNK6~k-|G~Ahl7!8>hq$z2WxMr)|#WpCSjXL=8JYqg!WRNmK# zxzD+YwLn?gJ%|m_Abnh?fa6J`nNVP-OLvH%9R;=l3BPydcb;)5&9EH4cfpVL+Tb|Y z@`iJKYRmUI;285z4mczkb^(E3q8n3H+ez4u}U2eE4>lt)MJrNu(l2crI ze!l#GySU=~RU3RRJ*NLUH|(y)EORvM1Fkm+hViP)`fFuwI?gsu0mR!os?I(r0D+=? zDz_?IC6eKW&Ydl!9;mnDC>MZpjTlzsd<2~d3W}T?y{amaL#UbByh@6Q(1A*E@^3XL zt5-u9&#BR&|Bl=Jw(V_{=*{9k)!jhq?Z6)@o?t*OndoVLQv7=Kt$G$z+CyIiOt1pz z;D*p$6}-wpEsbVMF6MtqXR1XCGVIR3R`!SEhoETyq_e((m)eCKVl8#LzHCZaKmL1v z)h1Tt>Y@WaVT&2&7Q7puv+&*+Qn-Zoej`qv%PD;Cor~+v4XqKrf-tgy7GAy)YyFc+ z!FuXlK7QMBRyV2&5bQ@D_R>EtdV@38tkWbs-X&TWseqZdF*7q}fU@-N$vkDv91 z$4DQ|Ryy{Z<{#m)a^Q)}YEKB&tS`1Q2GQeZ=3R2{L_h?~oL1$tZlfmdftz0Rz~Nsl zS1IWzXRu-(6ZYT9RE%ye)&zx!86EAmm#&iYdn^02r8WY3ZYv(yjff}2f53Crd}6Fp2zr(TxiwXVHm})Lj-&c!V7*R^8CVtvdT!3;~`4 z<&CK(lbHW3c1#1BUBzI&gJm*RfRRJ*Vn;5%|2s?0Y3xWlcV$*(Af5$Sd328UeG3MEj~v6M%TwD}`sw}Xo!T9HY1Tn{_R{nTx%f{VBV zQ$mwU5n{sTJe)LLL_}t5x&>3enA?Rq;fKi|4NVRMTTvZDdIwg9{FNbpWyoI{@>hoZ zl_6if2;WrULO^~OC<69=x+wI|DCKM;fd^tgsqZG$oj<`J01t#TrZxQ#u8q1nANXza z&GsvJI9^v@)^PkGeU_5M_zH#zro33{tqN73h;x01&2~0~EBvpUsTa2ZY7<#+TP#gg{V`l~-Df=S3Np~1> zr@TEkYdv+EDCVUzg|csoZLo&0XDbV%2YGJN>Kd7`4mwc!T1d4GZ*A3^?P^@d==Vk-}8_gp}`0uKCt;X;NNw&roT%pB2HQo!^QRa5SDL|g(_oQ zTMc_C{23W+7)LjwhBy8Ky%3esHVa>e#-}HHd#IDgxQr{a12*gll6~QPlX@aZAm5_s z%AZF`x@w68thq>FsXHhRI;=7LI-?kk=Nc-dR2vAiJ7|zJ5n$Iu zF-o+H{uit7zNvat?S=cWENH57 z7|_Q7MwS-;6sCmLF}ym4$396s#)U?tM5WADVf-SSttxbFzrksj9KLD5&MW6;6&1*K z>dnK3(C1ldj)Z6*ipP7kLX0<)z8q&{*$`dgd${u!`|arnv5|I(4PX+b&;3fC({f)BAmJ73wYImP z6dLa9xI;>6#G;r;Vds%>;s$lmK+zC=cA`d^G6w-8m5OgV_frvr9%iRjaoBSl z2_ZB`Unzmln-maSp+H*YifkxLIxNRwE*P22(%~`cAPgv zU`4htnf#B60$|J_ai%H-xx~i9wUH$Zgr6odTbYO!XxWTb9qo%KDXdWR>H^CoeYv%Y z-gN%I)X;O*Fak0xlPzTQ5Of<)D6}<1&R$aKsSJI#pwUdyILH({#;V2$$j;Cpa!VUc z!q#^ssmIbO*#F94=8T6cNqtpI7a5?)8)derny-?>YNJ(ON$RVF+dGcai2`)I9f>z_ zz`o=^&q%)YZA=g^u$uWcp;Y82Hk^5gRu(guH&^HI%3`)Ed?CdfUe_AiuTUJ{m0FNW z46Ac^Rrul~#LK!HM33t3k6=Qp50I^M%JAAqIX%j@XHcm(sfAZq<@P`S<9{Mx*4H<< z*1Jmo^FRLA{U5`K6m+l?yaLOaTyu4T%jCKUR=L3?>4OuQh8Q!Hv%cVlod4++HIKH{reBy^{?oO^d5sx(Fu5Czl0eH_9`QkXOlsgkL)T0&LEt z6w;qZJytajxkk=l5DY4Fb1Bg|YB?jNQ0Aegfhc1403{wH02W0Ka*vQ;iJ1UPoLmY? z9!N77VOn%@GJ_2X+4|GeYfE5gB?{g&_V62b;jq32bCMBMRMd4o9er(hrAjTjwVPQ% zkceVo2fYEP6J$N^oc7vMm$vfsho`>{>*?c?7DA*=RVKo8WF6bZXGLgjpss~pr=)kd zgeATWhFK+}7{g{$DzN=#tVwtug=}3vIWlPUaQ6^0e3#xOF(HhklN6wK;S`#=G(==k z^D=h16p(v_S^b)W96{);@}!Ib{Lw~G%%J0{=Gt4q0EZ5~hub4jkw9*=vUGddm583Q z?zD9l1h>XHE4ZP0Awr2zk;Ap-Hp9Q*v2A0OGou*Im*1yQY_sv9(?z>&$1kk1tiWMV z6@|;-LGayJ1a@4>x&_4Qg_2>9X26-fL#qe^n_Tz7I4(Qm@0mO<-T6G-B^aBIYdev9 zd-jH83JH)d#}pXEEs+l=43nJ$18Hih3KT?P$$C@}?moBZr3F^0ku2U}40t zFhiU^&gDaht%HDFzseX!XyvjRn?8oFATqTQsWPsY6tix{3%C%rXMk1m%d zYR=d%qhKvd+^G12D92gE9i1L`NSitvqs`J&BCgmQmbk^r1bR6Tiw=XeEqTxS0ZjhKvecgs^*bZ=CG=o3rt9v zF@h4;$tmD~LV=k@KycRxfwB-CUv0Jb>ib`B@oq%YtlpVul{goGqI2B8;0^EKY$S62 z)&iftv&wi1xtpcf1`G7}s?|EAd@j@{V8QzDM0ME`~xPRsjNldP`YZ- z`bh*Mo}#NrkYPbu&tNiK0KN;|v=HmYZFXKkO%)Ia_aI8L#K&pz{N&p#k>T?8T5F35 zDRhC#HX^^oM)G%B&*+WyvYeV~s3z`49SSG7&^nQ_cw%~1sKPZINj)@$0!pJriGn$uouO8wJa9!WW)p{TNK;0oTr|`%#~*k;_&xsI z_Z-vU0V&R=T_XLUmA`noXTWl??^~8;7DQExdHVmU*z|+`ulL#8MP;gr%eLLgd3GC%V^m1(g+iOeX#Z4iHnd-^={+O;cSwlL)u%~Ub z1<9FjQ7e@4cZVy5}84lLz8ASTSsnQ7sT^O@TB9s6E z096TqJaHjseEut;zA3O{&e>3WHfSdWj7!D~9IwEi41#YP)rSN@RX!vuPv!=D|1nxYT{W`nq=e*KhUa%f`W*!`lxmuit9m z>NakvY3A3*m)cd&A(4pt7{tIN(GtlRvKR7~PUN~tZcayyx}Kp!vrR2}j@wS~7Aox! z9xQ<*zw5xvrD(L=+yvV5Ll&?Zx1v*G4|3GSon{}mjja*8}N z+XN85PONCI4rzHnGCV-E7QQ~$*<$Do zu$TO$Y*d{xM7QOIX*&!}+xR{))GQEkG za9;upvC8ABj3TqVnEtV|mgp{RoR1Cj&epy}U)&+w*F?2HvYl%KO9*jgiO&2yoeogw z*|7d{yZLiUCWGF|A(o0u2UUeoiJhO~fIdy#=OiWatwX*u^T#|nj#k+xk9g=l7E!f0 zrN*#^a0hk=c}O-H3RNx)nF<~{UvlM5PxTg^ws2P+ciopmSKwL89%DqeKf=;+F1!mP ztX2L%YcLE=LQ5P;8T2IwS~|wylnRF(Q8=EUhS@BvA5S};0e5lRtlWI_YIuzxA2`yE zZzhQH!e*ze@Zpo%EwC7R`Bj1q9+C>~y=s(TVVi zlo?=cczQ~@r?$IB0l(`74nuN&x!gOzKEZKgx-Uhc5H$FS<~z`VxO#`f@mPGE8bz?+ z@df@~t9=byVv8G=@Own`{(}4R_^q3n&0+?r$Rj1V1rHfFJ}zR+jgOHRCsG;N6Ui0S zYXiHtsKV|*sUb5jiwb;>>|~1~B8DO?q3x7K#b_a0w*-)#-Gbu=GF!O(?%BS*`s#FD zXyoxx=w@sa&y!(R_gkF$RNFg{dotTEXa>Ullq`QI`NHQzn2r_~R||u+4C;AwtGf>d z@|5vvaXL=T1Ul?ayM-cWsLCDBW>H`mh<#VHncya07)^1M+;TGCH0rHd`^B5x-CE;Q zPeyEIuB>Ln&GRJL8J&HhOAZ0b2{sUQK9DlEaAy2v3hOye0yA+gx~8I%Rlb0Us3Wqb zyuXn=6&tg4cI!ooDGsI~>>s!8i-L!fRqw+a-vym)!Fqm*8|6e1T@-|h6HS%WaK+?) zZ9#VwS33Rj?wh?mFEACDt3V%L-Uoe%TIBfQV!kgz;ewWKi}|}){L6lKghUl4i{23h zkO=*DS(FAG*^FVf`H(|%($+PoxUG+)lN>>ReVIQq8|JaihXy*InCT)Os>P&ujlHv% z3=7Xq445D3W#^Iv-YN%ArMkEfUn1LL*1Ze|VfL2NGR$fhfxqU!hQi^#nI6UszVCl)@gnarA!y&p(jrkJj=&>P+HXb~*Bv`(JozR2Bo0@Sna3BiE!UQIPonM4}9$O&3vK z9l3%zJ!db*Z0p^^v?__EJnaK96m2B%uAC!7O0T=t1YqqEVm2MA*5OQ{uuTuEf~7Y~ zxDukf7rh^tD~zloF2m*nS<-0Lx3*5vq$VvY>#U4zmyr1|Q%^TX{;zdNH>;~MS9eyd zav@e%Wv;HuT*)?{?y5|8Y)7T|qQlLLH2F%}?md%DUc+vDHD%(p9n1`o7Xjx!#1^fJ z?O@1@7>(W;g|ZO@jBAzMGD1Kwy5h`NGY2jlnhd+c3)*eO<>}r`q&x&H9msPSxqf5! za?V~Nu%Nw|)1*~D}JC2!ynbITLpGnQ3moU97-EMBet_({wY8Z`1!x4z;G>JF! z$q+#`M7$7(W$U|0O(Q>L5}+{jra+F9cS2s^26V84Qjwp;d=aT+hL2ona?37zMvX4` z8RK4#dq`R7BSporGW6|c|2(^dg|k#kd~U%SaA@KtL9Eu*sK@@th^Y-7(APQbUz|J! z(6?gsCCdqqid3aBkUdQ|tOBQkayoc-$&?#5Z9kZY)+lp93gpz_}4cm5v zdDnU2DSc>N@p!dYgUeyjJy*i>1%@9zg}dcH>JQrD7Ypl(+#*!v*xEuIT*LG9%EK}a z^pb&Cs8$nAzKn2<Ik-;%kbDeCHcOGmgs0HTH%HVUpA(9S~B`!8~=N}5+W3%xh~DJ&(c zm%t*7JUs5%;TZmQjGZ#+f_MIC;M4s1=;von|k;6TB5+e|&{pekhE zwNZuXAj}UHHN;Fsn;oNRJ210ITJESb7$eURxpAQyg}18kPSB&~)kTx--M7vx36qLg z_L8->qVuby@LEtSRUWN}Sz!DySDnb`jXE^^J4tq>@-Gt>+}GAe-VMU$NXa{K zZ{pK7KU8>R)pvZ5M|e?;CVUG&jIW-m(*>WZ{sX)^z!r)RmyaLGa;kN@iuG5CtwZLu2+4HnJWZa_ox>ep5v1o_IL-{nUKNL&YVZunXivUMK06v5 z4L+k!1|D4HiD`MxqhY+Y9y-DX=%LJ1qJtCnYrbLD@0A}a!38h>TRcHD^20fEb%D!b zDuCs)4MHUF5MKDWLcfonWpNTACCn^0@tk+y1*s04ZxRU4R@PIDSy9DR=Xa5wFEf`r zPtwx-M|}x%O6`%y&#tE9^U8qxL^%Ax@xMzsyJ%`QA#Rzn?SKkV$7JL8G^vs6Kebge z^CDS(ktNH=&-6qnCC@M^u6J0)ES82>dETI?EI|n_zrKV!@tzRUmEPx}LpQp(Ufq1o zJL5M4eHjOsrz@D!bGt@4q@oXGl12cLm8Xj|3e$VkR>E~9TNZ_<5UBXovuKkQg7FrY z7^CHPyw2Ef^S}(ks^vk-Z9ebS0h@t`4&oV{jDk&`=)QN)Yu#oGEVs-<?#OeajT`|JZiitBm+Q2N~Zpt>TMfm@MSaLBF>N%&XM z(5U%1>7cv?l)xY`XX)M%XFwkz4z#PQK?a%T+rlNn;&5nop=W|(>!+WR5K(l5D-96D zWptH=!Yz6!Cr)}72&4H?iI))KCru~|^6--F*N_`<(i(Nl*=*%*z5fGYDgimIS4Pj~;ui@2hPbBH7m~CU;WUQU5=2|wD%(Ndr z!x!Pzk|hyaiX7O3>E$sdC1!6*lnY8J*uyj7SJf@cnH(Zw#ZKUj*R53KpfV^Rt3`+D zzwyO)ejcvgR;2xu3tRK10bGhbh&jt;>yVy}(+3RiE6-BwO@Tm+Dw8Pb@raBB|29w& zk~RiZZl+a^WautH606VU6doB64Xj79@||PsK=6{Q8_937exw{jzYB8U;k0Z(1$cTH zI2iUAH62;285Xg`frDtRlPPY=q*Qh<5IM$Za3v_|+Z9WlMwy~w)h1Yt)?J64t~Wx} zOxy!H8ouwJK*_MXqj1|>z-=_k{a&BSiNG&G*uXmHf;=t6n}zRXIdHv_n3H9V7+87P zL5(uhgI1g+jE$9=l_fRJCqtQOp0ix6*Ip2#c`tuK7s>oJW5 zClL4`7?A{_-*fs6aRubS8IGzvLEXyxtZg*-CZ}i6J5>~sIU5Sm6d_%u zjJy{wa#j=qeqgnnGak4Ua(K4-`nUNpMxE=|&aGF1o*C{!mi!Jo3^EPl`BBs#2RBT< z6h=t&-b09bvY>K${$P)T<4=lOhRYt+>zDQn%g%8DFQGr3lioDK7B>IrT0isU$)y=A z>x{cOF}z2q2RpYoW+2f)WNlWiPjN>lGrW@610U%6G@UoYA%Ztml@%_CdFN)pGutzo zqIz@UhW;HWj;t`X=ST0y2q79wPAk?L1E`G&%9m$Y-V{wJRgE+ii{C^{=Ot4BLAvx8 zrI=5$!+TvcnJe%JNl|E#NlEG68=P+=pEu$6yJ_$REI8v11<;=D>j%Q%WwybT`83;0ly9kZ~ZXNoHZOlNF_1a?I<6_7%n9J~G z&r>L~am>y`iYdjK^)Lf*;ot-36k;1KR8x`~KgI`~n$0kDO1Yc*_W?NchNeqK212a=R-7Tj1MsfHT%@8M|I~FfNj#{l!4tHJRqM3QcnW2KVp{ z=RoWXO3ujP#gn8WipvHqQYc%z;j^dl4ed?6N%u*)DR;q1!4Q(0$eQrwur<>sMj*H~ zsr?SJ{*mzf9Feu`*xu#UzOUJ2SnGbg@z2V*@{DG*f4Abeo7Bu{_I7@2yHn`CA-DLFySwwZz8dTK>i+stZaM6 z5<`A#MMSnRF(SK~Ja+S>_kNR{Iij95TvE=5kH3gI#yOgz@m<*qp}_(~ESFn-g%}EP zh6$u^*ZC!ACi$b$xBDj9ij+{28-EP4bQc6S-GzRW>mra7n`Zj8=^2n8B`DB)oy^5Po{3j^m#zq5<^>N^Px9)js~gFVbf8$5|X z`x%+)6GpHFaSZP0oTzYD;L1{AUNBOyvOxr=K#V6T;5^Pq1;INUq6iV1BFF!)P}U(8 zTo{mPQk|0?bDXLuE)S7;|KI;0`a)dbz7_|M&ILX{0#|Me4-BL0!fm_iA|>x z2F^MYg@J^}*%io=`h-eGG>^cE!Y26%iy{guXM5vgnE2YMOFqc} zLT5eP?3b(~94@ymSpxH@%u`sHUz&;n^m@?g=NxS`wU7@YP+=T}Wz?4`8A=?cE!}No zwsw0m)b4Ww|nOnCu5CXIH4rGPPUI(zHTIGyKTEQ8nFcw%~!3}jg!D+P) zv#-%Nd{!X(+`NpWH9&f;r-Nd-ba-nYNLWJD79mva%2xT6!VId_5fH=-%X6=YbmQPj zZJnhthsGmUQ37>sT#`rIp=PE&dxS%?;1v_4z`J~ZB?D^(2V0rAeW1Rd{kpC^-78P` z(!TeVr~4GA-YSRk@SrJKbJa#I*;(aKu5u{vF^96o0%17uLk^`s2pO(V-vO=+>ci&9 za$G0K|D>7!CJogbv2@>#Ja8mMr|4;Je)2F|C{N>XxekZXt3>2K=j@ui$w4Yxf zUW+mmCNde)nymJ}JP7spd@|Kx$49r%3 zgNQF1e`*$nX9+0=qOWP%esH1d9&ZAfi)My{dnUvxuxJE1Z=qjS*}wI#LMd`tCY zLLE`Fg*0u&9_Ex%;booK?kvIwrxOQemsfaV>eidt#Oihs9N`R@smBEr(TPu&U9kK{vE#HRB4RHEeBS@L;u z)RVEmZib@?_9ax#>^r3Pc-3{I#40Dh@#f{Dliu<4tnK}vv9`d5M?&iD@p=Cgq2{uo zBJx_Sg(}sO-k0G`oDJ^i5fllwQoAfS+)9rKB}P_y#7d7?Ma-@uW>*ojpFCo=@J1W^ zvc_1`q8e!hB06L#(Kl+WDiHJy$tY0qK5MA=o!G1QsAZT+QKo5#(;%+aB8NSvf7C>A z<8DDomir5Cgp3aN#qFaT8I6((+F1oRnwFRH_?Y{Ol3-%awupA&skB&7(-fB0z91bJ z1vh#JnMu#0g8Zn82%uR&Q-Un+gLv?_O(v3X#q}t;*jhZ^)AZJsM3K9+^7Zp!XKQm) zHv6XEl9 ze$hKR9FI`rN{ZC0{1q#knOLsStd3zLXHz@Db8zB9wo8FcT26z4N@YsA1UiSld zeAKP$f;yOggXq}ljl0N2L#hW2bzx!%?~104hX|HHMSfh6jFdHr@WLBIP*g{gOt4QS zRiz9+F<=fqjKIjRFYJs%-r5F`d0V~QKp|)0qet9# zj~*ofV(Zw6NX7*aW$b(Uo}S_Y&RHz__q;D<-SfD^|mqm^j% zCesnpM(JZ^cv*TKn4F+k#{#&S+u5&I7Z*&}y3~U~a-FXGV{eMIIlMy^7J=!V8$xDG zF#Jsuyf$9x@SRQI9WpqOJm~L`a-?L8D#aAA?Z(6v#w$Z5Wx4unK1i!lfZSr+}e`h19{rRv_Yr+WB zcu;?RxL2>?yZZk2-kY8J{>$VA-rGOGPN-uGh@B+ifUc{0t;l$^k?hu6`{?t*?m;7| zCWqBVtG@kaui8is-!$lf#_&7ncE7&A+rTKb*R}oD6WSp550cuS@F8iws_yN{P}Mhp zz9H~!9~^$$sK0#GN?sl8?bPt)iy9!SzSyfJG885SX}|uOZr#__mxQj7901^kG^_8` zTi*g7uWJ12fn*6M)$LaOV4pbIKG<(H@Nokr@*6Gx>NoXfZ6m2R>P;eKw{d{(iB7zM z-s}4h@ZNq+dm*X?YQG|ALWI4+q&+M?{1DsUmCVbMEi_F{PU zSYq`ak8uqX#I9~E_K`T>p~*Y_M2i*xJIbZoI7RZ)3+< z_%;4=V>uBsr(9PxO;gNu;Et2d_sC-JUtXeo35X^ia9I1H!z&H95MMY!UV3ufJ07Eo z5RSHMoJJ=d)G?-7Hyw1|clsAxgAGYI(ICe$PADe6^XCzS+rI1>VX&{8p!VK~DellI zt^r4KGn^(;6k3|wTOV@`1)`6&e$~BN1H5qYwc7>@>GKXotg*Y}AWQImxvE!JQ0bK^ zAzb5XIDo>GUZ&~5E_%z0?wfSO-&_L;?KKP}uL2y4R=a6O~ zbbtjT)&@JoZ>B^mbR**(oL)9UGP$|p0$w0+Mz;jEAei|X#1rm<%OQelkYRX|UDl7e z2V`m=YYl3R#zAA51@H<5w!yI5osOg)hg%7X;9Lq_oh%al-gpCs1tI^0vEJY zNJB^)ptJ@l02N}g*ovuqMCJmq6(@D`U-#rgw)w|IZhvq({8*@k=5w$NVs}`Z?E)oXeEDOkHZdg4KKa*1X@u!~^zWm=NgZ<;M? z@4WRwf;+*PHPa_(T-*b3?oMGp)o&>+N!>lEU4K5jKtu}ngtIw}F1L~&Plv;waTPA> zT;orwKw{nm0Ps?<C)k(%;Of!imSQX0z)+NZ3# zD|S9U^!GE_UQ8J*?_5Rn(zu=Sjz5Zp|Lu2Py>gFzt9wxrHJ~=~68zGYxBJHK!s=TN zv!7hGx^L7hqg>^%^EaXO+&6|6)_Zd3@$B~(t&`k0ewWZnav1&qec`^RwYbKRo7FuF z^Y=aTMaB8tyl*RO-}i(TmbP;5^*!}x(E$#A(gE(GP&NGP^ zCK@T!+@VcA7(>B*0T>!xTu>_(oq{h?PjL3P&c$`-1~n*Q;t^T9gG?71-XKOJcLi^Y zODC#84bd4^=@F%9EeeZTu86!5{kxOwLsWI3nKDCR`@DnN-s2&IbvU-TH(9a){lnTV zvb}hc&W1x;zM)va%`9_)ry2q?U*f2k8bp67mHCb_e!)usFp*P}{QQo9LDcSkFEh4e zy9lmD{Pvi_QQA$D&%;BTTT=Ke0yo>YCr>4RrKBZ40wEFq7~cN0^QjJ#G**8bj22R`Q2S5_fTKbDCs?^}P| zp>@D}gVj3FXG(pnKv)iu^8BH8n?=o6_&7MsYY zCh(>jNZ_1w&H6N{NA95ILwCfd9_wksr|P;$JtRNmBii;;4`kQ#i5SW8=r*w+8WCP* zat=90Wi5czpeP)_saqD6smT$vtbxzyH2- z*4sz0)?zQf12&qtffsv2uY-Qo8J}m`OVzwAK*;YUit6K5hw<$CiX<9Fwwt(op@l+6 zGeHufM*FR~-byU>(JMfC9v8&a+87BCyjsr9nQMc5hYMa@u>O1HI17c%G~bcjYjYa`~gdtO=JeEVC;hsHVmA4x(mYCY;^3*&6C zw2#)1FW}cH6J&Px#qr5=h7ZJ;*{?Ru#U*ZkdeK=}av(XPanw9MvOj+Bj=U5Q;{{H> z-zl691KDdZz=mww8jp`?kUVM5$?4wC@GM7nQn#~YqVD9i(c{x%qjbL_z6@-z8P%EhD;TG)(q7{ktvw@Hedf-JSM#H_G4NhVBQ|&rj!< zT>4?9`h{W~3zU9%V09wA>bL1~jbOTwg4g&Bn`#J2%d5Mu^UOw7^e#&0;6^0L z6imUVcrIK-OKqIE4S=Ff#@$egMuHT->h z5TSVuIt=|(VPDl@FA>#@DC_><{qTFdV4bjbf*+Nwt)QWk&(_ zrPeLSX~k~CDFWoL+)GM!>X8nyPHwwvwU`W`AO zeU-S&N7YH>p6@`Yx94A~M4x)j_qFMcZ}(fLk(td9RlstSV-Qy11FZ^%OH{t+W4&uGGp`Xzbll?xVd#8G zt1%vzJwpuwl-uvXY`%g{zh%Ddkn14ONALoz7?W>nsR|KmEGU_RJ@1?UvIfhZDwwH=;#{D2uUi4ZwSDE8=YwKWt?^`lo zRCPOOpvaxB4$&QhU$SQ9$Pr%ufoO5(MP}(f3POaxFNKQg3F`NP6Cu&U(&ueiSym3r zHcQNJ#_$^9>=e>=zvKh1|KS<>_?f&`S$~#%fxDfN%t8uuC!7>T0O^8}dYa@_&dgv- zzObPRyZb}(o8sLV$)3(ek3^NrHClR1xfki zU0YBgqgGZZ$dLRzChg1uJZH7-of5g+cfdwjb;vzTv7@lX*`o_X8fTd*2&Tt794Zxw ziht;53oTP8o^|`UO(1g|13kD93QTip?htgjqwH)Ptj@?sLMrwkm2ig4cHmZKoeiAS z71SamfuRg)zjukt#*;q9!dOqs>;p~u5TRI@c1ptHnLU?4LuN3Rd%ePs3{8*o0)1;3Vos4@fixk zpqeObu%a(HTA)(MA1`$AgFli|s+$d4&|>q5+TGfwo-|U}6e}RbgJ-zv^vK`fOZWrIkudPfiC19QpU!D2mR&@}f@*#!?I z`tTbIV}hCMrI^kI+i;WVN@hvj9Rh45x`aU3mfEN0IhAJ{m?443x#GK8UbZPFLns(3 zfMltrj0YJ6D3J=KfkZ5+eIMBdvI@^QbFoTS8z_i@Tw*%+a9-Ryns? zMv7Tde8G`}kUpvuo6d^92`#;ZGil>Zwm!1vM{K{aR3kmSmGR&%6xQa71jw*C?)C<9 z+i-xwwVS9y$Tx^8nCzVg?=H^RzZKC&P&1EK*{Dpkk!SZ!pV$h;;>|tMD8@WohD?3? z51~}+M2Qs@BvHYC@`G54jbi0Hq}}8X<^PAs*6=isa$UPJ;CvAQ^>miI6$rl(z?0#S3j~vTO>j_1c zKba2H1^zCwTHqaMZzxKew*Q6ZOWQD-7-^ohB5N<3smBo(TwIQS7qIjW;OlM7HEBRNIANg0=xy_skpqMm=1f(ntL+ zIGky0h9e8z_Fx=0O9sDv2k-GiyMpCOvI{Ecxr;K~lDJ=K(v5u1kDoaYYGr*iJ&sI* z_F|eu)ef+R!+8v%#4n9up-y$4r9pcNBxHb@Yb}@^!{K@>wi?)U1jZ7hfooGD0lKFV zcj9y-nurbP${UnQBFCAVz&QErynlkb2S4+;;vH5j^+sj|d$4yRNDx&AmpDuctirJM zYN0sBN5GB(yRTG&20?VD7vA@fSu@FxSyON24x)@?#Ba_~4h{?hbY*DpFe*$SB5>%B zxMXPvakHIx!42Z<8cKRdrb!Zv5~Orzn9xSaPhZhhGs7FpSAI@<7mz<^_4D~x$$wv< zBSjp#T!2ilVR2uBY;bjZaakPLj3rAhKPg!N z0HX-}IfEGZbmscy=>V^2kcvCuZ%qe99o>QsoO=^AFg!+OwI_&HaKs?RAvHKeSA(}5 zo#0e(aZVQq$HZsu?A+y38R|gf=3M>}ldfX~#oSiG!}RL{+({+oIpOQs%jVv_&FZB> zjqYL<%Q{?UHO2jh$$LvUUedOk>_etD!U>HT~r0goxtm>Sc;AJRS zbdGq#ZgzF@9$6gkd_&~2tL!>ydPN+uBcj>bRkR)+efh@W6rK+Hf0_1hhn~ zJ9~4dEF-Nnd|J=cNaEm41$62S5JY`BoTAlqAXkoM*P;b6D&GpsyW4~K1>Sr;OpcmY z7d$=d2$l8)DDY?q=F9-&;w|UyO&Bv?fFd5k3@Nkuhy~rq+}SbQ=J~}I17*w27*wNKO|oypMQ>9OK^*3v)OJZze4)1$u^p5 zo_k!8Ad5!t6cNz8ALO;%0j|Eb4Rp2pW?wSw5y*?AyG6k)f~nQeoua zzmlo@?S!C}vIvgDSBGy+hJf>v_mgVodTu%INV%G0Q~40Fiz_{Y*!o*%`R z-4ZBUz|sdVzLoSs{L^~VsP4^3;r!4c?vlgd3cg-ai8=pqj|ZqGCJdBq;f_fq+>efHE^%{jZ-hXs(QtZ2a@YFd z$izXCz@(G2f*lN!Zx9-c+#(b~kU&N^&0oZ>GbXdR*);3 z<1cq}ZR_%VqP?~Ks)~EwZ?Ux&rBP2zrAy~{t#D>G63&Y|a6tnhT*#%_DhuX)d#S+O z?4JIZs>eO>+t)7M_!H5@>w}&8Zv8eyvFlQ}$e}EwDco=K!Mc4Xt=Ur*7xmjMfe7X9 z$fL54AetdOGNhTDhp~w3+pA*kDN4(A4T?_(3jjddL(Rj0&m&vYM`h;usaM=!4M$#{X4SniU&SD!&b|x>FqauzJ zoGf7cytEkiU|6NDB6S zF*?<7n9im%6S;{8B^H~aSMiEiZ4n@=kC)SOdd$0nolJHG@R7D=U7z=n+94({@4b|O zs1gLJvD4?jAZq;{J&kS+cg%~qpUuSQeN1q?T1|#nSvwhG&eY0#Kfv@pb0fpsTI`HO z?#}Q67Cr#LPzlR>rBIhQ!3rYi7snr2i-g#C`r|ep$xx`r7UXGm$Dg%$IJMADq|6*r zPH_n~+}?mgUk?<(7u7W;ZZ`(alf?L2n!-tX zJoEMMP~J|)$qZEJ8RY0fKDSFf@_b@O8Hh^Gt`wZeU|1>oqrFE6BMZ9{CV-7>Ji6*a zPg#_ON9ZrcU(|2Rr<71~#@$8_=29f?f;(EIzt0QIq}9W_i3@vSTrJ|7B6ewNez-v>JE{HW%&$TvWK*C7CkiaXq?+e z5uK*zQCVjopGZ7}*jOE7N+gy8XG5IzSh95$7qWHbWaBcU z>^YA>IpG<)YoSe)iPerpu`7F`w;;3gO{Yn_KuSj}EZppQL+XRy(2|D)dkdU+C`*KL z1)7AE9mYvkGA*VZEvLS#xF8j>(d0D}4-pQ_&vE?%J$WE`j-bSCf<&7$A1+p@l zoUryVEZ1M?PJ&+MkGtG(5%taK9~Y(3%OPp3 zKS4Tx2qUL7q**uP95cfczipY;RWvP5Eo>y~N_G%wI6E6QN4H_yvQY~E(Rl&62I+u! zzNNe)dQ_1I@xEryVF$`MB@30sSw?<~Sa=zUR@RjbZ*4g`^GDP5XoyYhBMj+yDB;!d z7AfHm+whrvZwFup1tisR}ew?kdGRDNb|5S*b6?JajChUHWQrjAcp z*>-kW-KZIBX;=<>E?R!sY zNVuI62U0k2JYT10m2-kyKX(MV^f1*XQ1sOHkwE#Q!pePNF@h*Rt(bRT1cF_I*u#*0 zsxYpNeG?jy$C!UPS1pCLqsyOuZoR5@n&$`sM3eD*qccPtyYH=JZb3jvdVdzc=*zZ< z0F#9=Je>=pVMO$<^?#`R+fSPhQB?cMKUOw>T6_2p?uv`K@E~|6TV1IHcd0n0WG;L@ z(rg#JjjKs*%KNo{J>CqlXr^j}#UU(U@=`mDFObn z^MieTgxHF9eZSRyUHx;IaF*L@r43=T8i+(;B+GBdh+t+J58RMtMHfZzIDpfK?O7%M zN6%OY2!FaPH@W_7-6i1am;T?iXa?DSTR72rDAb<(qZKOiuem>tvBckpS=nPZT(g=hA^d$6~6@J+kkvP%|1rhFm%uWB!fCeX@QHnE2`GDGB z35!1ii+I!!ny=Isc@ssb_xTB(V2e@JHyq{X0BK;}RT2@oWCkF;OpnJ%DwgJTZ3 zNELu8NIExB`2H|WMP)8s3qT-h56+wk(Bl;Go^<$C>0G>N?t?ig17Tr4>-UF}{Em?+_zq|(Lihyj$&*p1 zkB|ZwmJxIV-*MJpq+$aaY{4w>@N{yuh4POG5F3xrzkCwDaRs6kRCBYq8pGc55xe-H zze~M0GkWMpdH+X0VID*4o9m+RYs2u27&U}of&taxz~w6xOh*{%(urp5?n!cFbwp^Di;31lLP;QcE9Kyl?4{#?meONM@j7mDB%A;d+*xT*0JP|zW1kC_9lbuaPcMk#&&GWTpVUF zcmOApK@KC30BwWBmV_PR`2XU3ne&_vabC@HzSsHvs;V!m*IGgnIPspbp2SFN^`*MH zy1Kf$E{JoQ^9I5d$l&7qoIJz3YzxN$QC};VccfSj2}z@e7QEZ3`fyvT4&&sBN|>du zD8K0IX!YhC&P=~eT6Z5_<$(Ru+2yQl>n%$v#r;b?R&ozBqGXJUY(FbhjJqv2iHUYDQwHw@zVf>BR=z-Q$`JGS=DP_%5}| zwSSorZ?D3}D^I!LQ8F-vkI~K!J(nPbVgd1ysB`@caTO^2M3o!3bAs};od6n@5Wzt% zu~cTU-cmqE>Dg^)5%`K!Ff6xVtyRaAd=9`b(!-e2!wZ_ui6JCZ8?-Y!pahJShr=CB zrH-i|7$S)J&kW}wq60S!%&t`0XO-HWqh4>}-krHjz8p0BckX8G!;@ZiM_X<+x_2-| zzBc4$@lAwzCMu%57-;JEUr>%caI3;q1E`Z-><@dm!r|3}^+ih4a<~=9YJ0QR5+qUk z`ip(#A9OMMMlK45SZ-SHgZskHNUe+7<6;8)68w#ueH#JG^6p%QBDjmvng}i)-Noj9 ziA_v~F6RnH1vPUMELnK4^zi5oIa>A85xI|Qi zGdCU2UC0G)iLcuI(`*-$wX`JAL9K;6H?HVJ8C)c7JS9ki>1uNL+pwK&_FEbJXV1>F z$9?^I_zZsXKOf*mx3$o151%L~<}E5sggjpiv;ECH<7bbZOeTAlul{gMFwnEhLqmj^ zcp3?r+s-HuJcaRwVN*lfVDr{!|KkD~rLood3}~EWw>}D6i27$c;ZBMYW6@_9lN2|h z91RGLT)RR0Y~paZ0gpRS5JJw3EcOHP8G%GwJ3O~0B^@j--gG~LWlLSpuL$+lna~SlQBhOgOz0wg?Ko-Fe}dT zY%J}7%@{M~QM~r_+r6KdIs0xjGL}&Zir@H&I+gRg?c&Wyy})9X@a5+bAa>x2YBtjt zCay;xz7ea@*?ad)t-*DnuO7T%`swid;TzhQ)@~Qtc!V~f)bpB=Pz7&F5uwh^a~=iR=jTJW6M#N<1E8Y~fc|TO^=LX9jnGRON@Te@3N9-^Gz7eXz|mrH zkW$Ju!+ki}(D|Mpg{)*f@ujB`Hjww~<7 znq)Ykq&xBkjt5Q-zJ%>SWflAcTf$FYLb3Nnss6n8^WmSH%?E$|)8V+sVrTQ_&&KgV zEj>@wPtI_xs~@!BxAOQ5w@A;LCugmNPLKJH{qe&!c>`w<*Hq;}Brmv6C$dvUfy|sY zm|Rw+QMHyYXR>Iexyld~=s4Q>f1(W9X!IM6?wfmmSh%++i2xuEly?{SKzI+&U6IB0GFX9$r(+x!)O@PAiCi!zX+ZKrIW%d5}%h;g({)(JWVB2tEG1aLcdcenV{Z9#}s2q?{I1tXX?nVR+HVY*q6 z&fqy2^rK^-q(F(cYYX@8iYPks;lW4Fb&4N6DnUz310}D+OcKOBAJhyYuW09?Y*>R% z$6MEmr)Nn!72OmGX1Z=%J5e{>soQ7g!%LW3h)HvfLJP+#BemJZpO9KAqAD*)mAB`p ztE#L~4#l4}Q?%>_RgBvg zJ;Gq23=P2tPl^Ix+Q8`HAB{=a*;!`SH{-+1=;?|6EIhlhB!fXtG;E`tAbabJJhJQys%GbTQ$ltzvT z#y+pRxFr!c!|$7?7r`wG$C@wKuj8FFM@?Y8+k$`4AY1LrCEH_|0Py!hTYf+5%;TuJ z&^%md4&ymnaghc#3&CP=8L0MQRW7<;ChmCbmACAj$imX2VYNO-kV3rY4Xvj0d)xR_=DjWCv?M#8Qm-EoS^jF4C*jK>Vvbi>EM_`xNn zGlr=mwQOBOlt_E#@Cesz*pUx=z0r|LVq3Qutkisl(og=>`v*t{gL}1azy0<0x4-T^ ze)8tqr@uCjAW;7*@fv^C_#wYaV(Gh2rR>7jPvHkUxHt2M4v!iH7k|u5q989vHY`;G zk93gNV5V`l7#i*{mE`)zx}Y~4*Qp>P%BlKS zd$?=Miw84EQ;*XJMKso&e*ys&-U#3@@R^>uZ31w+rgBv%=pzb3_(^^Bx8Ftrp$Nt@=ccLljq!>|NFsTW zjx_Eb-k|}d0Yd3SXent+?xmF0k~brJd0g6y8EoQ4)%&q}*doM*V&;}=({4q+h+NlV z{As$e!2OY@TGMw&91~VQuUN4z$+G-uEs}5&NOd810wYc@NPYuoWRLEod@^wT;k$t!|D75t_5+ zF~Zqjw8Zm4HY@6ljZY{LXU$8=V;+jqqVjDA7x%EdK;EdgbNF?4PMU-E(4L;nWoLLw zXNlvEe|n4{yPdlWS+;x9gSYkI;^?UJGvia;^RYBL(%TSVAbJP_;`cjbkPq+O3vuWf zfambA*Ka|(Mc8VXqtdpPjjXROGkHL_1=E|`ho8|NpNgU;b#p^NZ%3&*{8i-#8% ziwxsGScK(Uvwyj8GCV^(5E*~bv`W#qw4{3{jJ!(itFRfaH4i$7&GV`U;p?yio36)4 z^5hxfRvsbwhX~zOCRW$Cu)3as6>3jlUqxI?EYV3(>~2P4+WhUMn_sa^bc-*Oa3taw zBC)|#7O53}Cwb@TwFMrNYxeHX|COdcUyF28+k1O<{HF6%U;fszP8WhJZ5_eUu8?*j zS;g({4U*Xi6HQ)UArDw^eE)W8e3XGxYxbDB1?Ay3a`E*xSxHO+Wl5pu;uG zzayJI8>eMJJr&$%W5NyQ_2B+g;2)0-{&XWao@@k@4kU=I;oBARB4;!d@sejk@l}HO z7ol_d!+Ov*gj2hd|D5V?ERh47wcB<>OLqQuw^YVIbw&G!{;&jPyFXS%hSV?G@UNk$ z7E6qPk)NO;C>kcj#jSMCqS#;V;<&nN!F8nE2hTg5Hd%dEv_XYlNjrjaXDlf5cH9PG zDh-bW7AG?U*6l_K%(jlKZ5+c#g6)wT9Vpy{jDcfUbR@{YuV2!sRwa*N*W6V&9tYSw zs$I(v#Z)uk9vI~I=W0#U$dQ&Go25!1DiJHfp*q#KIKZHY2+M)A9=NFqCS4aj(p5na zE+`Lh_xhOsJo#3>%D-4wcyjw&q~uPO0+T6Oobckh6djX@FYZZ&enpp%D@65>`(82G zyO7@^KOw*V3sk8Sea0i67q=<=aiTAr`>vl~Be*MrGqME;eE2sdStm@{LUY4N@oHhW zO7?P3^91sV+xX&T%IW6E+9-=_m2ZU0T!Ncdw^A06E7u4d3a)J9N=T4H{>oNBhQ-KP zIZ$p_wh|UWt^!T6i@;M2wcI->Wr-Y=Y^Z{326(-|ZV<{*a7gPCO! z#Nim1TTqO^I;xK(h0saRMd=u7716pt83GkED)bH*?}k=wO(<*5FK?kF;X#_jqv3ma zRf{7U(gOAlscC>>vUi9>1)}6I4!AmBWi@VccXq7C9p*&q!G)%IdJDP;zH_fc8v*?e z++}!xlk|j8#&j8diZD=F!PlpqvySz^>Vk&BEi?*mu{nVg`V;0#xx`-vk(|rKBX(8r2|ip1 zdje1e-7*0JgwCqH8k{h`DYRLNFiZwjJ<)J5I@+XQ;ydtRqNf`BONY6D{=ZwzcDB}b zf2eP-X6rlItL?4t*H>0ovOD!1{D$A+59>%t_{2wo68%oSJpRQWY1A=b89!-Sbw>W1cuq}R>lsksr6OV zTgzUqZZieZZvFZC#`^A$bGO#kcQ@JQ+SWGqI>g=BU0;5^QQyv9z21JcwX=%uSJ3Px zT%EVk%j(P3&D{m`if7sC_xO?Rd{^JtU{|;5uL1ow;mek{Uj4Ye{^Gmc?7OXvl~p`^ zz6!|d&o@@JD+~(BHP>IxWh?cU^%sP0JKI7l+qYOuq04^w4mlcEx7lAE|49N(4r6(1 za~FvecIPn4?Ok8>hxMJ+xvajuzC(npZEwAtyG3-O23kiWsJFSQtq|3MAU`80LWCg^ zq;D`=S*;^_-3v_5W^VcxZasc_esa#>7gRg#a_!P3lB@t5jQ7&Buo-xE__lfM9U#eD z#uby<{u-8$5cUN~F%T~=ZEU51DD~z9w1;JRimO`aUpsB8WZS^}^6KW!Dw`50CC469 z>xE_8aym=lLKjH9j*eOa@!~CU{lpmB*`!AY7p4aX2XK*ztJBHtZ!W^f8W2oK@E5mc zu4Rr0KNbHHN$1>o4cD6HAqXBL-j1UBg;HD$R+&OgW^dYqO9edsqI+6gHC`fQbO&?z z3W?bAgDu{W>U%x$bbtp@T#6`D2psgx_CQIqLvI5rRb`pp);UK$2s;h7yI9`U0Cv4hfjn;tq}5H$BjD$$a(ayBexg3 zo%2-2d$kM(>#2a->1q3jSDo06nY+)G&q!WI4UipC4zZWI11==6dC}psM2I(A$hw!@ zPlK>Bv-w+67_o2_Mw2L0!BR=l%3#Iyu}7bC)57M3@quh%_}ndT%ci0a-M&QI_9s;D z?26V?an#E}BL8&|Qk>rG^xl$dOO62Xt|ukkJes66H-%q}amF;paSSc!SgK-Os-&iC z9+9mu`#oH=Nf_em^0dk>Jy$DbNM1YR1B7}n=1A#btED>hXcUl*!kWVfSHh8SdB1%0 z6vr!*ijR*0ip?4KW02VdKa(`zq5w++u&|9AC})GQamYBMq!f-zpBQQGk?S00y>VPs zfj=k*>=Y9<;2YERN9_3Mbj%1dgtf0saxHFGy;NPSRM;=fKL8tm&R@$$SNTAEG3Jxo zc&hmJKhY)y?bCV}nO7a{+1{imyPG}nCr5|#FMMu7(=UhFDMdnWblNC25dGU!a%L1c z&WoF?X0S*JDJ*7h;pm1z<}_Z6yYF%IhCJ}R&6I${?D0GK{cLb?fpc$a{py1_7d!N< zxVlVHPJH$bKKDg6mIZ_~2b+9AY^Cg&e~)gX-$qi*7K3wI%|%L=kRcx-%ntQlLmvN! z&9`j`XW@*57jkr=-9!(eK+Zb9sG5WF&$}MXvij{7j7T65VI~GR0Kmeek1Q*447cQD zJaP+f^gB_%r-?Td7XKJ$bx3F@$y2|J?zFkHaGIb`b#6p43Y=--L~*v_eZeHY8OW#5 zn+X4xcTi9a>{kA9_i4KGCB}GQ`(8feBv1PY;EX_IJ2aR0mPNG=R zAw|26?Q`k|R=~{&>XrSEnw|M4jv%N^W;aR#EI=&Mt>-rMf@N_?>1TgC;8{`mdUO3h z1i?E6EE=?>L{-*)fJCvQ|3*}|Ey01Hr2@TB)5Mi>ltoNS4=Zjqu$-`FG~gxAK_`_* z!MF)*(o}MJHG+vs<&us+xg`P#YznwaPni)=l%l$X2NSJfHz!@HJ0$(hj4fLp|2cm; zqxP_f|52q;-8|cn(pB5Rp1-4PArAi+C{^gg0^3AQrz-p$kO;(5Ne1bB3z0?*GgNH= zjq}2B$FRi|Tbnt6vgZ}1Ibg=odJ#3gZ0Ms%r)2=z!EvfQ4H20|(85_L8Z_;jWu4kH z{EpsMNtVwHtgu15ec8y@{`i}^QlViase?L}PY~J)Y^|W+C^3LOw6d5C$Ki4<1l&3@ zpYc`P>c-+GlSv7T6&SNlL~xf{^L>XpL6?II3U6#M7b0kg0>d1ve1bEWVGf|t&!ums z$tLYEspQt&L0~nPXNaq)h+)6>@vzQ6sba=Di)C-~LuZQ|&Goi_hr3ab2Eioz*5`T( z4~t+$qjW2&xVG}u0=M9}oR-Bw7s>`x_9_Ra63cek=Bx2qK_}}+J~#Iz71PnAQ*&(T zz^U(rGzwu$rwjrW)ul%i)5QB4S}6_CiIO@luR-Hb?Gv*HFPGMHISBVs~csu$Z$MoHwy#bHm<-D>dycj2_F+^6SrqX6jaTbw0q|x%px$in}evDapj7h>+N}$k^Q6ho?!? zHJZ>{{Ph2z}Is;}lfdzIOP%@pN9C||(aU=38$TVR~Ncy$fyAXp8F z6~f>eW(WwHfD3EbJsl$A@?aEfS20_6g{)p4awmKq^IPa|?UEUZqF&M$w^(KrPxd@V z33W_%tgMh#6fTHaip?y?i9M2KJL|S_caPJIxafEhRX2&KK^ul|GG^`N4RVi+8@(QX zmzG@bp6e%2rJO%7nOt>=C~rWg9L_ciDQ|NoS(fd&Hx+Qz0}l;6By^j=H%7;Ka+$d6 zsWvb>!r&AFfkrK-bg}UqqoyjL5lc=k3)3y$^k}m#1~L$kP_gUGO<*?F#^G5l0Vy)c z@`L#$t-v7NpY&)v0KYzU-XrGyT>keMSvK&3I;P()M#1vd{6 zO_5H3tGul_R22#^ia@Hm4d=;E=v5{>T_)Uz?ez7TXIMLWOxy-n+ z#w*z4%QYUr(srXAX*5f~RKg1C>h)p7Zh!KMj~^m#V`nHK9f4RouzI#}_$@VB7s8>{ z8cPa)&?-P@I%NoRSX=n;Xzt_FyL+9p!Os`sv<-n-)T56wCV z8%~{j58ljW2rU;!mgDTrK*dokm<4pgGD1w`{QZbnv?}{UTvVL#jJ8l;9gGklKTm4FW!F!v>XMfpV!Gd4+IxfsNTHR0xz7=0bbOWvUF@H$SbF zb?E@FI?o_k4gz%W#7@BzL`+ukgYly&Tu%jOm$#bGdiJ^@lUGp3R9|rufx&kiH&cUw1&*C znC+C#Z^?GV$>JwWQ~2hJ$CB9>W7)*~bWMFc4e#=`RZSc$+$YrGL-x9PNyA zQNWOCdQp(opoM~pgdTz&oEQ1#I@&E&YE{8F<_-|6VJEsi2zvoYd#vq%kOm}=x;n_0 z{Bm(X?m)qt?Dv!TB5`{YzIOG+f#xA?{|uj21S@y-MC}iaoy$U+Zj_GKMUr}+ElNvV z6@(zy>Pv}|7@c`iZXT2IG`9)t^$R~20{bj{A?-E+#wzf^Zm&2Wp0(Uns2AhOhn!c_Z%)(<>bKtsefCEMH#uRxi;3AgSeNFe? zROVVcIs+H3fhT9+dWHq##?jtpga+&J%|QG-)jn3(_KYj4M@^^Vx{19Gr(_@QyW)X- z#uW+}j?4K?1~=Em*^64Sdw_Tj*m__{5uBoAbiXfCe&~^S2|yZsD8tTb;Tg0uNcj*t zW+!sgC>aOBqMD#87TTC6$s*x<*0$3A*&+?SaX#n{LOKr#@_6PUskBTp z=o~e!fLiy$px$t#LDnS%`~-P8d=ovBgDwR<>BVRsjnDo8`9gmBb@8rcQcQA@g!Y(S z5oH#Cow@sm(#Wm9={aflx7gqXqk8zE(U`HBETsI@cloK)XE5Oc>oqHDm{KvXo@)tH zTx~Z{xz|U)xDIU=3v-Q0i!8T01L=?WqDXSX#-`g4_ z7=VV-I<|@REzCc0L_-FH_7X(%X<%3-)r{7PHSI;H>=5OEcccGuN}v3cZc^P2LcmZj zxNh{tpuv*a8IdRO3ip@Zuiq89u1HttG8WccC-viFsPSB*<>$|VF>l=XRPg=%HkZuhok2xj!DCR+GFVfiUH<>z~vl(Qr zY%FyEE@6IkDpOn|bK?17UHLJ*Ja1<;kA1*C=jVbrwOA#wj#TBsD2n0D>5xkY%Bw`c z?K~6vZQ`Q6)knqv;J4f(G2yK!S0<|>PPVjxYxby3b2~ROBeuAWs=Hl`D7A(sXobyG zcS1q%w=iRXBWc9FYcov@>EJE{TGeI*hO_~8>R6%zc~5r9!?SbLwk^1M%I&v?fEn0( z^&uaqlNNg@E2j@bxnz6&s5Hp_Lo(aq&;xz*2J$yWK^JCUp8*z>-+a>1i|~edb+Q=6 zK}=tj5h>@4AETRjrK~WY`Zk_d5{+w3giUF^RMK>nb3|FvwiiQ6E8tp=vfk$~f61Qk zNhdOgG~mE3;kxSEvU#^w?ZM=0GQWBKE`wQ42V)N=A55~#{w||2RcM$RdocNERG=Ae z5b2T)EI5DjDGWE=Gi=MVO()&bMsGr89GolI^AZ+t`&NG0f8@!JufyX~wZ&LhvJ^{p z&{j@vWvB+;`#Tv##2{EMyL34R7tmME!*7I8ASU8*ua8iYXH*NpRULsZC1z#rW>=3@ zm1n+K;2L=Wj)RyJYfIhc9>gAV1TUR5#~SRIZ=!mHO3zSd)M^+4kCPzxhdmcdH(wnY zS$VLHXq8(DV(HL{JtC77n9zmvg(JC0MVNOwgG9}hPH^L*$q`y<$R9xnimUno+0ez4 zyPosV%=P!hPv9DU0#qmA2!pIE)GUFz9JP9-{t-%uZ4Pd|I(_G43oqSr$AO7F21>KM z&^E^z;r#Ib{a?M-F9@~L?*Ed#X#Ty`%pM=}&--WkXW{%b&g)k_9DiFdsiUq#$p4&Z zhg|EoZSm!7aTz|up6Bh6Q$AoTGf^Qcx8$ziZw+~@(pB!&gMoF4_)7AklW34)p+(QT zL~Xa560K(n^(Nez)F&Kpgr2A!)8~U&TX8j$XUVfnkWE3bECf`_ z7USM3Z)wPR3DGDi&$9#uzR}pbNwupOCmeyRtjWg>v}>#_TWKFP5!;x;4h38UZL`S! z_qe-dv!`&PJzMOY4=&CYTSz?BC&He%7Y%*W&{vDI)~aj#HKP?XDA^(pAXq{c7j@u6 zy49e0{{bQDdhc;SIUV#S3g>I=9PAoR6YEL$&%SVfHB0$l8Qk2ie!%(LyHM;WJAjbo z+jbj1wOoAgXL95T0~1m7A0U9tbuWP`I`=$04^-|FXlrxh$NjbS4aDJ3u6g9m%KA3K z=5K8?i-5oC@fRzw_;e8;?}ZFYc7x)?{BRABjeC6}JOM&4+n4XGC_n5@Ac7jpQkCT? zyzb7##H!>9`AXv)jn4}JDr|BD90;WM(HET0D1_~L1cNy=MW5Q}Pk z!DZr(FQn`7&nQ_NVe5J1hyXFl#@<_edPV0eQ<;Ah4{~3G>MEi7Rqyl?(|y`_b#ne^ z+z`8T4^CI{qIuBov`@3;X8!`A>mDDi#s#BMu3?&7^`flPkMhAEA3gf!PY?fe z-!8U`H^>qbYo<9sw3rHcK~#Ld9-a1@L#BYWQaN^&s*q0*Nf+@TwON2saTANM6L@#l zIfSPv%UiJ^mCi^3=L_1!PW0fxU1;8Q<+yQ1<)uX?@YK)3ecq`E=!m7+jZ9KR1tFs@ z2)1bBYcR|Ks>UsaUdTY*`hn(oe;u)Gch>(CMg~~F-_S4$O)OxLC`zop;1=$* zbD^}!%F%M9EH@aD+(amn#Ij5OeljMy^n%6zPs{Q$hLcHtty0cD|JyB2wgi*^9*KU| zw>J0JR~RS#&-WkQzwf4BCxo7!EPcD-v>N+nWj{*?vmWx*^NwNGo2t8Fz<79Fn?W4v zbU$_!gMv2eEW~8@ES)odU3UGHzTIvQdQ5-w{G!{!RF^eSrRo%;oBudFT|I3xS(lPD zDXn76x{kwW`|W>R;MlU?V}RfNeQc5Y`=Xc;X0(8WLuSf(Rep~AG$~_UT5<~-TtOF4 z%p0P63y<{i_>9AR6;?FSc%vMqTo=*WtiYH|?f%>L<^B;&;D!Np9_FM(O@6~lLoQN; zxqeU<3oa9knza-?E6{d^BPWOk*#I5&k|ptDLuH}BuaxVInC1Wy9i&FW%mO1pZotFd zE_$LNon^brJZHy`;yY`e{o8?FY=IOz0-rh zzanAh>d(}j;v9i^L%7my4YG!RgfqeyTj_FJX}{$!)7Ukf?Br+gC$nrHC;i^V@rhoB zc~w|+K8x?KU*KX7QMhn5cZ~B}_V_s>EUb20yX|KFjF&&tNxycci;imBl3iht?QXwb zr6PsK7nhQ`6|wcuIs>C(-YNCBVc&u$O~j<4UlA|w7-{R6F|*g|8#}8ZUtZy25wUu+ zli~1uu(Y@cQEs8z9xfgdG4m1wCp{jj{!H%@c`(F^TK4d`w*J;r5S4=2trN@fe5Z(TM1e?&RY5eK_u_P<6v8} zi+exS=l`=g|I7XPziJR5fz1if6uqXKFE>%wo1OEMW{USuIy>m^vz(n9o*LfY_j^#d zfUI<-9rZ2YuidO6j|fcYkw$p>wRMO-pxxmo)lGkrwI%(1X0z95{CxlZJpO%fgn#~g zbTjivM+S{>CW{)}5v&mR*Jse7U7ICJ1Ha+4Nq?W&wB0l_#D$IOS74oqaE^z=3j{F2 zMu)(~h}3~>!GjL{T;Oef4u|s^;$6N!fyrYg$}wa{n0^r=E&BP%Z#bLM-)AfOV%@Bc+`QzcI`BwtCuzbI7jeEAyjf5etV8o*M+0PClpzw zzt3#)ZbRT%Y&4eUpEVkL^Z(Uoe7MQkbeks4_ROpIDBdoMvxmH&gH8+kEKZO*!;#=i zTV63q!eLWF!k}35U@oHpYX>5*{yIg_>Ffyc&F2tSu;1?>fss>5OF}2)Etl7!;bP*y z>Qks}^S|MWm;OF8qG>b+H@7EnO1s&`IWnA0w@XXa-*85xzt3z&pclB=89`RcpPTNS zGAle6VJ{?gK=BBp3Ld}jW^zE?tIw}B=a1fG#YLV@R`qK8`L{mdXosKO>=Kh>9dwqR zIX_i`$FLrySt@ubeP^IRAgiQ7Dc0QKAw0JwSU%;WKF_0~uyTR$FJSWyiHnIMd?q`u z8(2T$qP0FyWB9(^?jjxf!@tO>>ER#$s4SWxti%qW-+KqP-kP(iNBmGeW&{0mXv7#e zUwM9gXL)_y;@cq#6M{hiMx3`ib-5O5T}EkO`ng=8pyYx##CCU(o3R?RIiEo)+n}k$LwiCZ(<;-A^c-N z@Lf=828$9lz<1eWB?j6B@aK~ZBvEls9P-Rw-Ke*eaPUa$u#~~Pm%(G;HV#h^#vRQ^ zcju3vLcM(J)|Y!6yT_Ttu4P%mas<1U5=)gxhhB1*AH6N-wQl0ZHJ1>G8uIVbQn7WX zBd;_vaaEvH9szEp%K1jX4Xuv}u4qv!!5yJvy#a9J*2e@_r3lYb{Ha@UFK<5?F~qHp z39hKeDzQ64d3FQXjawfRTu~lXf;&RBbOYeVt&a(=oboHd9iivA0dV8i#|4+Vf@*O2 z_LI?WtTz}FTsbvXf;-|&c>~yuTOSi#IZ{=EJL14~1K`H3j|r|G5-Q;xb%wYBfOE|U zh`$)HiRlUTM*Yt5$#8HBfVNT`M3SWfbEL`+v?_Sw)0*6f3X4EqD063 zpKh&x)$y*eQ(}1i7le0A{cEoFl<`hAo1Md6w$(m8rt`z&E`AN(xAGQOxw0^4&R+D9 zqI{4&K7WR+q3?VBx6V~Z?747qt@OY7%l%US8!ufSwL0(A`-B0zsfFo6GcN8Z`T$XJ z?!r?93Ik@Bq*PmV8INVt-*yZ@azs-2?!Z3OX`ZhrQ3fwhH35B@m=qGFRMz zH+y*68?;+vbzxxLaf8WfAEcR&ckhJx2$0RFEic^RhynTGW;GNi*cNAA!Zd)!CCzm10c-VcF$YuYMi24O~l8<5NF zUAhB3^I6&qRodMMM&+=y-+}W8evm6-=_E{wEuRH=XODT ztNnhjUuz8HfO=G$ty^%o>;XLK2AFj!vvbr5Q15DjIpm-{vjGJY@*C(}#F3ifeUv00xpp)b3 z_GW!!e|39%YrD9h-7;La{W23klBE*0_q@Kc|9W@rFITnqvUv)F-ZS7IrRV<=-6YIq zAbwheU4m3_qrz|+_}<2MTtbY|^VZth&g$+}0PNya(>ppEw3*_hC0Tx@v%z@}MrwM+ zgKL=MPPfY&2)Q`H=7gdKFoOe}_o_AmLGJVV^1tnF6S_U z$=p|NLXKu_Cn!|bB{y>6fd#|wQ;nkRHYJ-mXx zFYUk3mEUdNx?+Quw&l66%_4vX_NV>t>l^DU_1)F|=UZDF5JoV`jge(m>zhGnvZ58O zfvU@TK?|Vn%G<4qTeJqxhN0)1JTgw=d;ORD^u7Me{iP*2tNODhVzlzu86Pz#9$_L~ zP$nrEa7n3Z$;BAI1=8d@_8Fr51ZL>Q>+*X`JVXjRZ zMAKL7^p1w_A@nZXy0!b=D$@I`?fy{TUd`5bvRB(%->zpZbs%w?X=$Sei~YVEpZ*d}C|A~$K(4-vFmF)Gvzus7R>F<7w%hKX zAvEEzeXSN<3=@aO&E9YgkQ%qTOb#~z(Z64` z2Nd6~)z*3!&hrgiZ@rUmQx49xg6u!nZ$?^h7jD-ANL!*rd)*bT1C)PP+K9W_A>ywO z+YN%XB>|tN1WB0zIIZmK`s)Upy6!LyJpFUs#&(96r(UR$9}|vLm|a7*%zTq%=WYE}Y_uq96+l}ouu4yCaEa-i`o7I`&_)r6R!Ig}r zs;0e#o7#~?$vW(vA|;ksvf^}ns3I%b0(3`Pxd-RLa_s zt154WjLUqO0F}I!ODx-iIGY~+6OqS6O36KM`PG|r1W}N( z`f2hQ9ney%91rRUYVQbP875_qgy927TicEzqCJbXpHFH_e|mpP4tLg4T~ zG#sM649(2gSH)3O#7zv^kj#fyu9D<%-mp{HX`I^3y3fxpdYC=M(KlzE70;H&na8YC zEu>bu**6Q1=!M?SXyY`0(t&HK#FT;Y)5UoUi_IIu;FYPA#2bB}4J?x13cIEY@E;fM zkJKW8kB9xHb~VRvxJb8{4jGLI~#1WBchsQOt z1XxwW0%2@2bgh<4(%DQ;gQ#i4=>#{>Cq$9j?8Z9u@82>jpD_~0q$Hu(cWrw6sPI5W zhL5kgytVQAu@P~zL2F7I&nQJz$DZm_*oAR8| z_jea(P~=o)J^`=ED}YUjls`9mYE65UDdU2gf1<{Zkta;>pu#n38dV_!{2FY9$Oo|)0wH+cuTuI#o5cVmS z%;ty?x|fU)w`anGz58$ScKYK^S><7nR#7+7L-AZ(N&&)|BkTt8mXpX&$Yws16wV`J z{t0HruLW!J>Um)oV>J|ap3GQa5aFBg#KT_qsB?S)ozoU0U4U&9TL7jl~EXJ%PGNz25H}q8&p*VKt?VT0R|DJ`b&HT1`4bqY27cj2~YB zsDDswDL?jV{^MXNwh~(SNGV0)nC2&Gagn&7B;+{_;^^?MQsM=5j~PXcDftkvCr37@ zD4}uQcj#ez(S_+hWO>v|`BScz(nMe@WrQGeGbZm-Tjhi*${HoQ$7hTz9dO5A{ES~e zaFW|OR#FBTQkY_50%ID7MNkY&2%i8FbNS|Iw4F{!84#>JPRF^{OCZQ2E&K}K1V&{u zPT7zGBt<+?mqrc}czqE@|M_En{e%u#lqI7z9*TxyCgl4isb%#2?{aV`7wVNYPb+ka z=;;L|6J&2*o=*jNS<&2Yb-BvsH2>tJIe3ML=4bHo>+3B-ZEtpd-V_s5AO4Sj))QpIh-(b5#0vfxvX=HC~@2lj=+5~!i%vkij$FQv`=t| zZsS~i3SB~9Pp@*sR>dg8y@_vR7=J*$>f*cr0vwxyVH5OWl1RjECL$>6CWV?#s;P+$ z-WDKIX2fZ7(9KFyfplyNZ|XqkZZWY8Ooy>gEgl?lkZ8*!vz&hPO@tD{QY|8A?VK9A zME)&V6V-@uNGXLZkE5BOHx5E3<~Szu${HeVyTvxBHRPN!e43_s#5No zSdS6bR*|jQl$q+uRvKo8Vnu!)zy;zZEL!rHuXlFgYA7!xy&O`>N+LgJ&MExe(-H~O z>Ey!fL+Am!V|x(|2kz#N=vC(m?B>&*N1aA0utUdbQac|#px#(FVsbEthhwTTM zIM_*YM$p_o&R2uR z9SRfO9&=k!`QBP+bYU5;>}1ZA)U%>Sk(=iTySksrsOF!D%A|i5`k7tnWtY8+j2k5d zI&jDg{h>RAsAxA^Pctz67-QhQmM-|qf*WnL>sbKl`iceT&thQ>_|=xD&+=tp^%Ip! zezjF?NzrnMXfxEU+B;o)0X~0}vi8D95~QZ#F5_jgcya$!j8 zHhdHCS$D0)eRGlx5&k`K>VH&>_XUC_Phua_)dFE4I%BJ^C){mHQyWZV3?eRx4tQ`NW_ z?Ss|^Q#U*k2QYK?hpEAG6Uj;QTSq*>I%_hpP^SVN;CEsJF*Vc$bg224U}J{=wxN~# zWN5*5lUi)JPAm9Zf)*^Y8lgn^B?GnsQNrjVx}jbj-WE)V!$?FB3bN)ARdP*7Gl67i zwgQ?epvnkXa226wil#@>PG?Xzi^J6}wWtVYCFMV8t%x-!<+v+@3QVLVGX=N>Ok6=U zQ*<#BBOn`xlA4?M6eq^A9Wo{(6fCDIYsbRajS7q}?xJR7Cnc?n91Hj!wH{Z@DV0E@ z=92)Y-4-A%vFw}}T%caS)pKM*hlX@PbKnDe`k zH8u&VtDw$f+e(Ri98Z)z9|=8h{=Hq*IFr;0YInT=`S!J9B-@s!np1F!t00&1#;GSG z5XYDfX(6iOS{pg4bi+^Pg<_XC@)fM{p45Cpp-L!jMQ2R|m+gi)t6C_M;kV7IfJt+y zf3#y&VczltDT|cL--^ea%I3`<@0RU$ip9}`PxRVyl}AprvwAR9b~4X-q&T04$q!5h zqcfVd&P;|b;H=(iNk%ofC?U~1ENGb4Law`YCRuW5Fuht^cVlL067y<`olyBpVxl?FCj3r( zk(4+qFqz;l9loH?q1Y=G2HYov4x6Wdvn6uaU^qZZtzfa<10(BqS_sJO8qLre`Ic*M zn&~jAGd%t(8h=u^qg9-Iee*}~^%1#C0p?UV24osn#@}kCBnl|#z05OkgVHHoau_ZieCwIfZdo(7q6Se(0ofJvT)BBan-uSCX#jKy*Gp z;Y4I~?Z$Ci8E>yqL9_lnnvI>|l(0eCRC>9I_dR1R*3^COI zs9IQ$VeGEhp^jLKR4x@U6HEB05Er&i@%Ia6r=McMh{9t67;GVxlYAgsDHixn1<4zx zItcX5WK!a?U|4f>BA5R8SLz)_YlX7sVrOTICn`f>w7fXUBS*=VQzbTSCfz~R1S860ewMQ8Tj0xdRalZE(#$9zPFBRUB^}oBivMvPkRT59p+nS8fl1s&C~aY zbFBQQ(9|=luL=x^rm;ZkTN*8r+GeXGDyT99Q#RV*_{-H1HYA-$V92&1o6>Yq%fh#J zwCDIvB*Sw10^D4~($Kl@vO9jln&YoLXnDJ-Fm`{`YyT{Mk@eHlO+SHt<;!Nu=Kv?+ z8eyCscA%_&^~QT+FzU9RfE92Nz8N(bDqy*YNG8spOo`Y1I_l8WM%RJPt{-<{Ijq5y ziRaUZv^{!B{5ZJ+ak5k6ICOwy81HZcS*ETpo?@kM?B1b4x*0}o&`M#@ZuYSfFcImt zo+E!WQwCyM$3y{6w)9@u6xDArK!h`jk9;qqJUf6NO7CLyvZ4W)?;}EVdd!2+77=9F zKa*t{HXdBNpZB>TN~GO>`}`EaulA`6KR}@O+U$qg-cL(!zW(*@M{L>tCc8ERjX9!B z6vRVEGt$~WE)aCU7u|dCMiNc1y?ar#_m3tD2>K$jOctcHcnkmm(@)~uD3Bv_1tH6i zJ8Fe&LZs^mX~nz}Gj`QQMEGnHkl*__#N+>N&&hEEXG23to_tn>8$Y{Vu1N>O)hiq; zGMErkHRX1k-g<1V76xA!TgnJs(+^-So;6A=;z~7L!cN?%7rxD4Gt}s=AOQjmdd_&& zL&%;sx-57n&_tKQMDlww)5pCm+6FLU(us_JC!<7_I4;9!$}4M3>OUSAzv-sU|B5_|OHzJu~9# zI~T{t8fMGyP_|!1_`{wA6bg#>%iadOhS@QGW|QUa6ZI-g`qNr1NIG98}U4Gj>Idn4dFru7`*LF2z5heLy!hnGBepw zheqKu!WY+Hw9$@xp00ZkJoNsFh!yGXXy{wE({wmjC)OVh_Gh-8T7|;O(#_Q2L4cTk zKhm2?wm2C8558B0wNE*ygWo?%ikNV5!J z$+x2tkIJv5@XdS_0Nr3P_m8s&DYdfsD0NS526?JP8XWdDUmHP!lid3;PX;1#YLSx$HjnK){xsD+8k0m=i#9 z@~lmdnP}%N!o5B&5I)->R&sI`8jOG}imW2>_@!KhsebzmmpR#q9N9;pBbMkm6kV|H zv>Ct6olQ7ZWpl(48CP;FG_a*uhmc1Ct9^`?4uA7Q^K{+&Jat9)T{v6A2$}=7Z?S2xTsyzNNB9}j?2oJFXn5!zn zcuI_peKVAGSW#A`e7keBf7&@uHnZZ^M;Etbzr%KyJj&C!gGhLuF0*nKj~iEE!EN>H z#GFR7`4`t7M+j&_t$$Goq^LP?E6U$VvZ|{4t?4O4s+i$~yHIt1(>akPjei`hCEa`8 zmzyaOI#jlCILPCcEeC2#``P3<04=*V3#0ZzO?<`aTQPD?5Ea^E^F?r+Y-XJ*3=Doi z)@h>`B<-)2cmK}2^=%7v($pvnjb>M(1lfp1gX`qL~LFEZ|f`Y-l^ex$kK%^J}=EiMko zCf-EL@Wh&kCC9UXo02`_Y^s*U^E3F&`?q&fr){>tk5O>hJsw||tT)9a=9*~%_s^R& zZIQkdwUF&H&4i0D2%T0kHV6wjPvXjTHMz~w==q02C!VAXN1=%W8l*i){zM3OLenZ% zMs$GH^+>d}3kwUg+&r{ge#Fq+CY!CB)R+r!I>uiAEIcy^+MK`xfc$!-!6?!Ac)3uD z6(nRf{fUK;p!ixgjmNcAURVbaD#D4jz||_*LRbclo^uGTISp3Xyu~Yg)Vh8Ktz-x4 zHzWcT*ISPSm@G<+Uw`0Gc^{Gk)K+xKfL`i?jx+`B6m&YRHjcG0@yB5>4Qcuf0w@ir z)f#AQ4enV`$BWCUDBx{0(Z)&Kt?s|xLAJ@2Rir#xM!LzB2x|dP$!t;Jn{^*FmD=yQ#vDic%4~5IqX_v%GYmcqy?%I6j&vs;W;X zU*1~hGInN!FJ9=5b4AAHN9*m9n_xGsPKP)8<_emfNTCh#6RR=l@PpsJOg2rGZX`i5 z$kQCV#KSqRr_!B;#oU3;aH2wST97QjO>ka7P8gd9j5XZSps@9g%V0&EM8ii9E!6gG_n>WwlK+8%N%z! zcH*wf_ffm+gI$!(qd$8kAs1^Qs2D<*fLTo}&1=+Mi|iW(CbN(T0?Y>m33#p+(I|Jo zgkfnZg%ATnsJW9KOqRzH#zr89BH8}_@+^z-`YW% z%Kd+Ty}r5|QKapv2pE`;-Hezy5W}k?O+b=G^g6BLiDD~6es=Mjts^DQG(do&-dE2@ zh`zbe`%&OH_paAzB{ag#%TJSdSt%D+G+PDja#AIF+W3-Kh$4gpiR|8==Nbp8T z>7^RkNJO_db}^RB>b^v%!phYbYn@XNnE$zfC`d5PtlDA(bt*0?6?-ICa06D*-6%8} z_NmW>rv(o433!_2?(sX`m7H;WLUaoJEB3rC@m7>`#hu!M58$94LZZia=)kJvqSGQ zQ5?pVjD#dGGwci{xT%+UX0vSXtHD=;H<<+bl*XX#k;5Y|cr{5%ESmGAFbkyU1uNde zed8|g7iZJRqtc`4q9(>yde>>U=`w(1WR-plrU*+61At(IAy(P%=igNOzt! zyS?t^8Qgms_wSTzoE>H0q$ZY}MIW5Sz2^Kc_4)tYZ!~`X^U*y1Jvw@`*T6@g-=F_$ z?$y1oqi!2N-@m_b?`fm4fIK3#r%U&Le){Xu9;&?g`s+qx<}SZB=a1_1Yk05-ZHr%z z7)QFVaM1ji>Meh?oH;{4TYaQTklaSIP&jHSOt`wh0nf0R&azj9vFyxy<}st9QF&LXc?oR&N4$mc z38=R5>bqC_>zlj#FYEu22WJLp=nBT-?Az=9!5HL7;-(*W`ZE0kWYdJl@nWOV$E0;R zBYsfm5(-k9qOke0$??q_@Y322m{s@q`K4OUNL@6lNSM#QQE&gM76~*gG(3|;a~tl8t?Ne6MH7ci{HS*0Vk-05%qj> zOqUtDhwx$jeHe%FLXv7${k?td>WAqhYen_K90y_|$C+^LO9? z_DPdd^+>VciYW|?mGq+iJ^WV2g#Ch-=`PH0MykXA(U>P6i>K>KIv2LZ&9nrShC(d@ zzubhP#-rXmyUh=JHgfRgdhkN2Q$G3PfNo-jcQt!TuXhN8NNb;V5MAgm*AI~ zEt}aOOhHdNM=;NjddxxNgilFALj~n5tokgcPpr!KoEIgy3^nUdDQ`xJX8(8~CHCHw z*^^>z7X>mVN#8Os8z=6Knod@EV>t)qR~6giXNKo8099;~FN!Vd(@_mNOqVw5UKSe;Z$>tbNh@!dvsoCw z%<&sG$j!6@1Dxj4Hf8<`ZR*o2+DzAA;ML&I;L?zGoz8zL7Xi}Fx-$+PGNGIzSPuJV zINa9kbPKxTAh~&Q)A;R}9*HN<&V`)Pf&W%_0eNsf(y<1V0&xp7YfR%6BYxn(>@VmP z{K&Wm_aK_PRRh*b7<93Z)KLX{$c*wF91PW02S%fa24ZRD)Syyx&Uw2@Gr}nKcD2rM@EXBC$mK4J#pKPE^K-YwrvA*b>q&?v(L)KcDzgbTyMs=3+Bd(6!+;<6 z_`N>Ob8Bf(f{@Kq-i(vPu-luTs%OI5)9`aNM@S$+Qc#dyFX2qsgklt5cp7>U}oWX7gk>;Jguw1=|9|1n~T|E{ZPrhtw4 zC^u87!kX;PrM81@?yDqG?Ckuzckg(1;69)+@v8R$O)86PgZ8(Na&;c%SUGrBu^XnN zWlh!-=Ir`R85t)u-cCL(&#I!)BBmeZIat`suE1^%Q6tMb6n*(yIcaV8?R!UY*vYWPOZGS4Unkk9jcDP7WTO2(Iq8W4-i zgM-*v#GEomgD(KaUJ-60W}j;QyfIc4kV+~1Bb=ubb%{UJMwiz z0O@9uk&-#C&m~e`AF-YX2nr9?Wpg-0BzBxjaD_rAuP9x@oC+-qU89)A8?m#tO<|!@n5*sk(Uw&dz$n z2H_uyvvk?W)~&Dn!4;D^IW{8<)Zc?}{82OQQTAT#QQ{U$MH3$qK`!ut@QnZmr#!R% z@MNBLW`yUQsOF!*LUKe_)6flck4&15B}42Qad!tuL$zQ?)2Qv8L)FjDC5*dBLc3<1*9x2C#L+bt3$R^vx6N zq`iW;?81+B(;xic2pUkS+2}!Fa34jGN7H)*WJtJ^Ztp!J&GiuDq~6qe(P zS-d<%oTlDc=NFw4p`9>5-))#jP0fq5?qn9?&enC6Nln2aWagKZVaPKdK>#{6K|TJe z*dF0n^hzYwuoINbc1pvaB4hIM*2|am&DiIdGb4*%kj(VD;w`;%(z`fqfv;AW>@Y#u zvYFO+DjU71*i-4TfiDo>%r`hW)2W=ErKRoF-PhZj`^#G^tNSbKJN4%qt1Dp|1g1bP z&=rV^BxmWB((z4_(keGOBcwd}fR3oAHQYwTB-r{bXr(N>wrNO1ir=y{*CZ!Ry$y|O znASKuwmk)LrPx(s;6lx;+l-=ZH>}q_MVf%`e&8e{gMDt>%E~8xArQM>Jt;dlt85 z*B-!@T3JKKMFAMl&(5D*cMRGlbmaAo*Q@)RTbrwBb_EjgDN=cnrgI5$Z+IB7KJ%J$ zQ9h2IB&<=%3a7(Mm+1F~#}O2VP*(o>j{k|q@;by-I-vFLA#N&gjlwg7_6qxG@>6G} zv;^Bungn!dN_NVifM64I*+Y4F#>0pKYp>+$@sYe08|s_K%)nhsegElcHPS}7z?^=@rD4pne4%NWQp$>pCH$D=0Gqrx7Kf7soLu2H@+7EH zseoiVxmAV1g6#euyohXD_>|kOH7hXz?K@qVr`rNuV~lF)8#CMIt5I+2DQI?)-x8Md zWS#nK>e={ClwnYgAT-G;;uPocvqmdZ5OJ?Mde}0wN+(`q zI1bcZOV~E!IDrx_~xZzHH&$1ivO2bd}~BkuF?3(aJG#q42n-VVK|vGfWR| zeCtMJRFBNikQsw3W)}$qT~&)6Qh&8BQipLtmH-Qs{9&yQ;^qxcFVjXXgpr|AVi;wT zgWAWKOF(nbBo$9PXNcQJ5gon}owJKG=nKvcU|9tTick(*Gk)CGkZ;e}qCvuzd{I~T zP<3HeB^MjXTh~=Z{(^-aA*={Ary#<*6WN0#fegZdL9IXt=3rS9o$d`xKl@TJD8989 z*l}u$KAphev;&)0eQKeP2#+(dE|AI^l-#)J31PH}1D&4c8S`;N6Lo4KR{Zr4G!K|_ zxxN9Z93jS;q!x{f!glx)CtMe~)7!X}PXl*FDAN1%px0#rC4i193)mb>7BMPi4X3>eJ!#ENu$xn4mDBRuY?lw z{x)DAJ_WMFs5nyrxPqr!+7|40QHpnr3FS!TG8K>SE~!9L(+eS393$i%0@dlGfB|wI zUp<9HKn^sqiRPpop~G^eo`ik@=w>|}5gQ_J<(qPBnjp9j^<1~DuJl4iV9og?A2}aj zAkBh?d$yd;w(XQk^3apqqw8#8S$~Z1+jz^pChfJcv$egu4<-BS?fOOrzeV}Iwo!kv zzg*vmHScb3)-h-XpBP8hm5x5rp+k~a6OQ!Q$9cU%VltUT_$}#!f{PucM1b)dE0%2Y zER)o@V1b>%4s`CPZC8{>9vXhY5|1PX2@wh_S#h(sW8Y zxSL+>4leu+zebD}KBYq`ZphVBGECrA|7=aZAdY)Tqv3{`7$< zL8r)`EcYvnDm14B_f<^3>%eGtdl$z@PdtDS3VFu&E>=^m-UUR*7IY7-;fbwMZ5fbt z+Z0(t)B?by12p`|*$6q6-FUFR5D_>#z|9Y`@L3^g+0z^8)_A)FI-F^DVGTuFDNxec z0U~8E*3`ax3b8=$)u5Zf%_%f#Vr5(4{*Gt)DG2p!+R6xY=3;pCmmO)}dWR4L{c~CO zvn&M=>1g6FLH=$Pe6fYtdCQoxjB(u77d7=VN?L8njx3(ApE3_MT@l)=G< z6xGOwDv;!d$@lzBBA#MwfDObwmz`e>PF&7#^=8K!&_f)9#-BCca+SQ7SA_v8U6`Y? z%Zou&VDfZ8MOYo#lnf3>j`H6jfGBwu zqJ=n0cQXN~we3*Tv0Qnsj|)70+v%W?mz|=3=xe+t!|lj?QxFoYd5i-L0(i{nGtwp$ z{Z(h^(wySjuxbQGFm~AJVkux7>+=AAe8Ff6!d$@~mCgrmJLjUgb;AKqhdzpff*T&} zQdJ{@QFtOT-3AuvmD&=~SQy%>j@@#W5%HYg(v>1h&FCY{L4kE}p+uc2&P zaJ^g-D`NH(Xn~chEuliM(yEL;sq0Y_$lK9Zs2vkoVJFud2hz?5-x|km5)R*YV5Ij8 zvP2|yeA-ihD8Nvx%grJ$^mt}!g|TxNE-++rj6Txdtr|9SFMvh+i^B5p*2i0qpCZuE zty_!tZs8!XOI0R4UrCFc3#Z}RxjZ{UWF$O0e2chPSXNTLc6c{iYaVn!j;|2Wv3uBo zX7TZnJb5(unRiKo+rT17#E$B7+9Y_fxcgURwMlk4I@OqK9(S&&MmY?)&;*08y z9+Rg0?ba;{RTZ^g4f+j~Yt#<_4a6~5XN)TAYU=3>EWF9+-^S?={cJ$*0kg>wJ=qk} zeES>+mtdx8At{{I=9XNbuhYZw2%hlQYqQXpobK*ruXeWQA7NsU7QE90>%(3_TjA_f zuA1|H{`uuq|Ev>#>-F~sUx%?v) zj#bsJB#UGUW9QP%t?iffjq1y2hpqrpePeZd_wxZ~d3$|#eHq$|&jvw8C7;WD{ZQZD zT;F{0`QT@B3lp~bso*hhtVt+Z*ZZfLuh>^_5}3q+@>AhR8aG=6SJz5zBhfN~6+ zYkPZZdy)}*zA|O~m=R3bgkQN+){mB&wm{071P5VhOjqAg@^rO5&4ubIk;uje0S&UQ zs4H!^gSIHnp0m$`Bjl%x!{LoZL~y<)rq0S{N_SR7!_;&5Op%=5q}DjO}eOvjG+EC#z{Q(+NXtg`TR`1Y`D3I;>xtBRd zM4y1fUnnP&2Dwe{(ArR_xmaNyo0!ibBr6Ip1vK&~z5zM^BR>lF)) zsR&^`FtvQRtP=EA{@9St6>()tBrF#3yA;i4LMqDI+Vh*LLNyKzw zydXVQW<#UgK75N~ZFd$*6p!iodDuG4>Lt^Fsuf=8$f?o+`@VytDq>5!YXw~Uz^wXx z(^>2QFitFM;uQIUavd^gn<+Lw9L854|sAHqauPdp727)=!!*vLX=i4aEX@mCLK22b|BdN_k9(O*59 zLC`~aLed{aX>MisVuG#n9z)PY@s)A!B%FYGG_1X9sKdh1iPe9j+d-!VBo(MiEV6eu zw^H%o#7>gIrdIx{U z{gFMR-G|!xxfD$-3w`$f{;;jdFHRF{xIX&}X_J z;~1f+fZrss1gllQBSts7Cq|%XUSs1|HtzS;ux}U{l4ge>0#Eugaes!NFS^s`y`K;N z+-yGh>z@w4IegG=T%}1Gtvju*z2>a3)7ZJf;#5azYQ>x^!i|+;fHNLZg&*ji9`o7q zhI2Vt$kv(J8nWKb?#kBdT@k1TD*vTAg52Unvon;V3PL_s%?-rMjY15vZ@VGqH%?Qz zHiB+#7TQqgMF)`dFC?hed$20-oqMbed$nN;`< z>q`A=HIZlojTr1KDDy9Ui|^o0Vm4B{X-B5b=o`FJaCzz0LEAPktkzE+t`0) zD$4%}r$)K8^pcYuS!xtru|bgJRgZC{^Y1egIF3QEa1|mN~@wdn@OjVReC0s>S+byPI5jNCxy;@UKO|*XW zm7EQ6X#Kd$P2@3kUfDubP=9npjqk%r*gwu;-ajoRgTj%rOcz## z_9&)qSV-xC(5+4}>2x7@qvAp8Pv~cKh3f$x*2Clk^6h((fX^a(nQ`<$F$Z0YMCzstku zkz70_klZ5RZX=}>%Y{K~n-!Sof56S1Wgub{cKW@pm{bie&d*^sHGr57I~^$7jHNgh zJM8H(@SX|ij@P=UP61w23Kd<9p%>Z_(RxQat(u@nJ7VMQ3=lx73-GpfzPW$jZK$7q zzrW*C%7#^=W$FsA5J4S1P4TS%_a-2U7?ypV~EXBnrW_2)0M&JM0Iu!+_LjnFZ| z4))M;Tit_dwk^tEXY;IwIG8wjTjP0Wp2*0L!}kpSSl?M*U#FbA`h0n1ec6$R?Fj|_ zSu&61M&+=>lwr}9!?{N~WfG5Q`xi7*LLxQh7;`^svjaR~<~<0SU<49~b8Bb!$5*Qi znINgnwsxZQSWcHAH*J!;jB1Szb#cK*@^4h^DmZ9lR`BLh`xVH~tp&J>h+UPfkqTTC zh0lbqQvSMa3!u1kQZdXACqBvcL{74!XyC;PImy~;J!@1SfF-$I?sZA4H-HP_qE5m| zP>~;84kz*I0zrf$JYGm9Mm^J)!u-X!@3T`-rQ0Alm)ulQSx-$?&{^QZ0uB$^zJDk1RxVT0onEu}=0U zOZHb%!bi|&PY?f6-jx{_WDozCg9XaESFhoMCI@rYk89h@?fMURlY`LSyxOR*Z{nT7 z7O7+8nwEz#cl~0wF}lj!Cg5cR)t->MB3c_Rc+GX%Di1_k<66SS1Y-93LUh}fdN4hQ z4iP@wbUur3R`Ti@GBx*^!C8z}@>#5pfxWLDBKanPkQ$EoGt-msTF7ozNAT9+8AHDS zAony@C@IPaqoV<1T``Eu&s>sv%d6$# z>EtosEK2amK@W!*J9dvfv3l>`qJKY+;euOS8geYK3jMvN{eQ%)ox&U2t%s{7X~%he zzH_I0r`8;~{)i_%!O4PCI}VU@XeB1-GBO@Xd^iYIoaiF@df`BKXOYmkX=W>iU=jew zunTf?)o*$b5FEoGipyi$PE_zO0nzs()M0f?=sHA~|Hs|JN-*d}G3riZVdSU_bonKhlQ3*1++r^3~rN{5z9@xYJRD^^ssJ97tL<|L!ILw>@oA&=u=G zx!wf8U;6NM7{N^q!Ed@#jN@|3u}H8zPQ%TNLPUZ|!IwZxB^2aYj#mR`N2kr>0-@_p zpI!izU59Yfa18G%z7kaF1Bs9u-;FU{zCcDb?(Bc~GF)z=`A zeK~*q&gZWweV6_WcR54kmfn8d#O=K{6;|&DS-<{< z-s4{xh=1<+M1iqR6W177UObTH_dypSP;7EXI?31W6mnSU zJSE+y{eHp;&fU)^U{qisF{ii*qrfExxT9Bao0$e*G=5ma_s9S3)jj^Rxvm0RfTpa!+}Ikvx){3*`pBHHrhYcpqf2MRQ7UNCmmJ^rj@L z=@t>M%^fs}md4pK7^p%m;-Bh;9q$t2NY~aQtHqy^%;9|fX~qKLFCWNn3Wcn+z>aLPE+9Zj3e>zMFICaE8skHno<*I z`4jZdlx^&4wmLZ2na<8xPP{^}D(K`|7uhQWryJm!>hXCC5vKR(H^y2XCfB(PP<70ie&~pzj^R*K{mz?SI&APj!J}I!ZfPzoG?sYHo`YnmA2aaVS zBmHx;CAZM3{xK{X&N_&ws;xwf#I#|~AdKuO`Y_HWT%i(1uw3F5gZOPTuJ8QHPr?l3 zoE)@y=a~90z6Fb|>O>pFFikFOKDk~f6@Z-yaVhvgJ^>GRTDmHa3=0E|)Yd1RBlx5` ztf4A*oQU_^KH&;v-$HV7KZ0murQ8gICZ^LOxkcubMuk0R8IjzO>le{z-*tKy(0;3u z7aJt@47nlB`8p&-BdS29+D)InLVsh^K|<|jA6|S2p&$`mu?aC4Gp#m;NU!1gk{kHY zl~}B>X1g_#=A?C={Vi4{afEKtIi{%DK06;?y1n1l-(9*EJ3Ggm?jw~5RrwL-ChYqn z#>#NhIz|r+q02NDDs@=TNRXlNPY2kBAI3o|xJVJS;3eY+pW`Y(F$r_Chup)F+ZA{J zoEedINf0c+xWL$gon@?bqNqcArOvt<-4hry$fTn%Lc)=U8Aan15dj5p1KB(pOqy~_ z%*z9ciu2z2j&LEc9dg6hpor7u3-JB!a7W#13`aDg)gammUx9+Rz)(caQIoxtk|ooU zy6>1^RJdEz+hYka^DCGa&C#9sIFbT;u4gaprNrluNOE>dFhZ_?9i8BfP3REQn_HZX z3|Zn+q<{*1AN*vSo-P;?(~dYte7P>-EdvXw-M=b4H%QIF;1Jbe_RncH2rgM2Jp^7d&eAUKhY@ADwHFnt23wbb5LHz zOX>*rtAS%->WO%&bF}zEjs@;X!Qzl+Zy=zL-y@RL`!|bFpbgA*YQJF~rYz+G(3JK^Ig9O_go=9t8_KdKEK<^9LmRO2v zMEFnxNRSAz&dkDE#wOBp%+Hm+gTjjzP#poF2$yIrKUSOq+10E3e5Y>@{xZV_=|4;&xC}L?o_u$;}@C=ywKFnbx`iyr2;(Zl$t z(a0r^5Fwq`WZ|T%iN()-<*mBcuIxndPgF0c^0FQHunwEqG0dPOO(eE9Y!qTi^?HDP z(Az`NMKDMhs25$&WtY7R9Cx~Kvl(a<31lWg z^z+HUSUhhIPZo#0MIGV-!i~`-t%-m1K*4n|rO%F0xuZ}~{KOd`neGMWec$>I#N9s%-?}k0M_%W%J6)RM-n@Op4j6 z7l4cJa_is7&cXJ<(x zM43r$~O3FIhEt+evf>>T_)#eNYGFLhbcCzeutWci?nfP>9Xm z@mP%vAxuJq#JiG*37OO+G6Xf6m!d4z#_g6D+ciIy5e3zut~-3ojDOh=$Z6Mm5AVZ+ z_FD_hb7|DUJWrJG+cwY`V}A5_#(-h8jRDRJ=)A$;Ji$D| zd|zDFZSS2IlG5p(5v!og+F@GAUMx&Ru6I0G7>=hK>CA4VFVCkgd-+mafy*{uhU)>cH#*FF7V)L0vsM zWg#npdsl`>MIoZAd7Tne)Q2U@);8ujQh&DM7lTX772|26XG5Zn!Kn9oa%Y%Nq1Y6C zVa0|0@0TFKKEJir0QawGLhJpI84q{I;i4nTy7lcx4_Cfg3v<9YK^y_vc5PX6FuUnp2Nu~?`Baci-BNC3`|s0 zVj+m=GUi2IXE<9bH?Q#$H^_6zX9Bh6=oA}G6G0uzW)d2FAm&|ji zY-)R3+ssbPInxkrKMi;v93(S4NJPkeoF_{UiwTur?nvW06iyTCh94Uc=H@nSM+|3l zM5uoqF#=4Ny)X79s2m78h5`iZ19BT7NfX?N?z2_B$m|mC$?*8n2e|k6bo3Y1m%sTx zhDi9=!@ZRVHhXd7#qdQQBg&4yFsHr&ww@*p_wEpnGcHfCXhm_v*$^XUCS7rPaTV!H zH@hizW7j~a-oR47!o&oAQA2eCzkj)|maH;|sMhiIy^LnUqMeqS-M*~Nmx`h1Fa40@ z;T-!So4P(v{;=EWFXG~w{%`(vz|Cv#2vhFvE&}$De*B9++aK}4js0P&_TN9Tw2a>D|rGhfC+S>^}Vhl^8o!ib}gK*8f?Mk(MSP~IN zRw#XXg_4AIo8edih=z;oaRNJ444Y=&$n2_A-A*@s@K_EQ%*t*ej{g7$P}XzZz=3V&*dBg2I4K#C8u3=quhwcozIm z*b^RMR`{y8+)$DR?;UvLE3;H1mcL(pwXyLOjQZ!eH{#^FWJTFBUBnH4$O!tVLI$5?S>f zp*rk7BidSQ0k#iM6{5lm0k(UTDV4bD@!c}q)thOlZaTG8_wTSJz){11+m=cQyWa1; z);{e!>c9g zMtz5X%9<=4lny4oG1r>1o{1ru4x95BEF5fQB{t~`KYhzrz`Ica;9LITfD=+ZHq0__ zHm{N?)o$&YFnnApiD8I_`n^;#-RydAX;LA^78oz zQv?>Fn3MzobRc&O@MB~~3Ot6WjFt?e@wCqbewYsJGxLKsdl7z^j!^?rjUQwQpNS(> z93)tD;x;maK=n?Tp#}0W>|l^Laza=WeRE-AL@81;p{}0{pkZEYX`yVrfWiT^vjrD- ztvZJP9gUH%1PH6fWr8zlT?}Jv zTJa+0$4phK4Lp5M@=fq1fo>W!tlDIxe(!mslUH@zYx4gZY4Qa5Eo4dFTP0rL*>&p$<<(be5*t zb2j$Jv_D`EytVRtfV0*9^TMqS`iQ(n+$x&BtTr#$&icvOVYt0leuRh+a|R$#7DcKr zPjS10`ucmgQWP2C6-Bt<{t(e_rD^7maMZtF-5&FLjS!S8M zy_teJ>V{771j0}SyYD&jQa1CZhtWV~pLzE9;I{lrHTUO6kh--3MmnxrGk4NDMVFSk zxGVj*yJ73=eb~1~haE=uIuvpk+JVci-b5Jpeuw%JY`|IR2m0KdInK1x~3M;35^8Pa`ye27@c zh574b2t!T-Pe5z1OmL1s=>Bsrx=2`uEOR(~ciNcoja_=Hn=DSVA#Pyf5;NKakN1v{ zuuf_xmO%$JDx>~nGGkA{1GBU2M6rI2~Cdz)VwXI&ESOq49YCj!`> z%vsBs4iWF4M}`YenRD8iy@A^sC}gD@u=o!ZBTWO0Gs*&57w?7mBRO{+_e|I~bM41` zoyP%p+bocMWgF|u*kvsR8LO5%;|5r9oXHb7s-*K(#pPa*hV(1xqJS9rI6RId4l$IL zMclNWq;wnJ7OV*?I?Lv*MdMnfo&H@YT;YhF$8w0t=1nkX30Yx;L)w{(5w)&gx6%_q zuS|4NE>eNsu%-YRYRnhPJceBg{=!VVA|-W;8>t)VnAJ>4jUjzaX?ccxs&u{2giW1p&M&CA_?vi4wgZ5tlf^+ykQ?P();R_YNBze%A2uDR#k z&R%!8(K|V`pnmTJ2cD4!H+_@DatO}AbF3S}EA!+_*0Kbo*yf_vzz|0QJ?f*V%~u$c z=R68fJqI)V1%vet@ivVCPa0oAzSN^W&WG%sJV&A_p2BYFrHi;eWP*H&bZx96xzy5b zlSaP@nIK_LM%kj_;DLGBL0+wXnNnC2QiWtf+MQ)SO*;94wTroKEf@G1h^nA`Q8pmd z5j~)}?uhoa=Bkn|u(_5FTbgY_(YH9vi^vTm^hycfsLwDov7Z_#0taa0kPWRxU>!N> z?J}PL##yG9#UW-etwb-S>{CYara1v--?7>{P*BqCZ*_y2=+jD4u(fGOQJl(t z+n`FFE_;b4^f$A_Y#)Z>{NCo*O$XEhT|zKh8D-kH&<)B1_teQBqH3veJi@~D8b^>sxj{aK z?(0Ato%)fAImN9hhJZ-NB0k;;;T1R|V*<6av;h1@!3I>>z`~VRNxjGfhGu;y9gH^9 z>LN|w5i=>$V1vifrvQ|sd&JbKToYfxF3-t~wF`;i{UEX)4?8#<>_BZD$C^q{*Cb;TW2~3>l4o6-RHn*Ln`eSpr2Pf6mmGR)<~K zI3y(j7>lzZY=WNmcAw*i9MD1_`0HKCn8w9wbllzT?f0-3kul<5G=UQ;uV|gZQ!w%X z`3xj&J}&ZQPU7no0`p<65YGPCBj!<7)jr@3HxMAe3_G!x&?Tx&oj8Ti`wS$ZWw z!k~8Vg;7Uu{*r#)Xm5Z}lxd@sZf?Yi9IS0PVR|7~c4%m8qCKzNFC}{3*Mo!JZZK6Y zBr00>M2@F)Dp;O`5p?)2KyY%Yk2Dl9wU?Y#Ivw%+LPu3Qu(l?RyIvh&RiL^@{ciRR z6=zB&r<@HM7G2?hIMv!FSh>N*)cs2BM=n3i zoKzDa_8d~f5*~}k8n<3~h1j`poZXAzZ|T$ji0KwZOodvTx9X<_yhREq|DHI;Yq*J! zdFcqs40u?Bt;>->yH^bZrq|>qF;Xk-WbqzOl1o!_(ujhhFqg>pk|w#EItA;RROVZe z$@o&vBV!V6Z-E^*y6sXpC&Q)fGzb&6e=(7f*#Wv#w@wDbmO*jcnxq`xB4JCs$2XBb zgbx#*BVNj05)m|Wpi~f7tv;NE`Q?h(l5{vc^@zLz!(j(G1*ygAPQk|?P&z(QXTV1> z4LP`ogf>zqTA&>LLhe_9hXsx+q3FaskI7@ri)x}%rCHwiI@YX%ak1=^^ObK9T)^Fa z1N-=05@u+-(Ax7vqd!*~JU#D*(4|i;S*R42YJ_C!hrBX}#P-2aw-zgdEKa*fuf^r* z{0q^TafgLxd;9U~##c`sY;QNOESw!CINTar;;hgb^j0KakvfOFlJOEGUy(zO&E1TZ zO2kbBw)dM-WA1(Z4hL)3jUuwZ5q1$D!ObIK6i892|YLx zC|~D&13*_RarIzT;Y{=$5#3H`?Q_1pYr$g@cjJeKfiN(@y9<~ynSo&r-1K4 z4-wf&UOPY<+A{}-&k@<(t(Fga2hVXoVy}Sb`|9UE|0$YTymbfd+(P+fEL||OK&WlJ z8dNJiNs58zE7;1z*Moj`Uv%M{%g2RwesXK^vpZ<$$3K^LXbbxq=a&5#`5L6+2<`mg zjcQH)-xwUe=ppsMW#gxL2~#mxGcnHX0d4SBfl1GopsrEfNu^yPisLM(31djA)aB>& ziz=cjsHP4>v#wwhg6bq2dD+D4tFmD>B+4qz@KPkY(w*qsZG8zyY#(2mnq@s19Nve; z@LU1YjW}%UlHGEz-|OQTy-qDYO8%mfm^>6vErt>R6CE{uF)bdD7W7kAY3WchSvW4R z1ofVgLarcO7$++VmLez<7fF zv#d{7nsF#YDojG{_+iL?3vO!7=j4gM8jm2$kioa65Fd4i2#(8ETNrFMeHK51VJhzA z5|ugjV(+1*sfMFL2T%5aN`@SWf}35tNt|;D({^`Gdxv|X+ppnyy|k7Jty`<#$qjNc zmISD|-bfVXW{1Q8fn5ZK6@^2)~x&Ht8r|`CZb>fv7vA(x(OHmriK5bHcU?2K*Tr>;U;8n z8i61zV!x>fVfXn^AE-KPvj{8;u1a{6P555|5NBkOFWpNuPGf&L6EtBmCu((gCe9!c zf;xvp9a9@#EqIo_=iHY65>zTf#A(%p&=P!^{|z8fV1ua~oR$&_xECsr-ipRH7=kbf zzM_aC!jt#L^8q^Iyi@{p2~ZH^5qTvnaTb-#rGa(<5y?I!Jd1!NyPpQ^Sf|{u_D_$~ z`I>>F@kcTFzCzuwxrijUa61?`%xpFDMk7_{{k!iY^6;|Y{Z_>^6G7r$<5e`6W+fsK z)`;sRBnc8I$So-farrHtD&p*2Y3?M$d%k$jCuPX<%lK^Ns_96&d5?=z!VG%SJ6S9v zMKysDw-DKZEyD59oYkYsL_>1;eaC*+_;ffxHmm*to8z^tZvtm>qK^S^*D5xGxRSJ5 z1G0e%l5T&FR4O4j?2VA>CbAVc{II)^18bcjz8>}V>>J{4pUcy0Ak$_tY?KP1ZvKo) zP5gN)|M}UoL?>05L8O-ON_4HX#%j6ftVNDjl?#-ClN2 zZAwHjVsV*|M8Q>Aj)EfZQ&TJjo}uuv$Ar7dg_#P15yu%4@8S1h?+B4N7^qe;P!_At zYSLK%mSF^VwRWT@i}26T63V>?TEU~+jQRQ6(YgdeBx;;MxQl~+x`SC~h`(Ol0xu}e z7Yj5kR-az0ZdCI(Ze*S&LL29az%E2sXU0en&WRl;my-Beb<@vLuqOY=1-b#ydw`C1 zw)b$+((cJNF0dNxVR7~rulq%SVlpnp3fpoKK(?1*hI?r3O>KtwOc3b(hk{;kYr7U5 zB;^)h*M1|&#Ban85n9gC8&y-iq*C>XHPH-L5ZRF`g_Q7Ps|iO+411|msc_&OzCK|M z2ikIj!i)R&5WJ5#ITiJFb$6_$s)}LM^y|uMer%>SwU8@3Q9zbMtLcm8Ihr0Nst4r& zMa7M4iz}bEpK)>VU!S&SE6QCG!@;W=_6V0?Y#&P+Y$6t7yg}R$FmTG(5Z^k;b)noB z>I)EoD`&Y;ph06r1FIsLbjMQiK@+Nz*=VbKqIx5C1^{a_YDr6rBlUZ0SCzZkL=7j{$Hku_HPLxG@+=vM-l3f(EvH zjG%HK?I6OJjy@ol4vA|1cFM0HTf^>k|MrVz(}&5OQDEf<*?XHjWX;;iyJL46DT629WbF_ z9iOqQr@9D`Hlp`tZ#H1zf>p3>VOepI-VjDROSyBpZDY3Qlj15&KhsY;J#K%qJ(C>ti zwF=ap&NLJ;Hh0<=*SAC;lY4UJ!Ri3M_#-AO6T6=MxEro0zymn7Y2MRUrMTqdL^a>X zF^O-m;I0K9H|C$!j6iWPSOC|$M}wD)h{U1U?khP&p&7uSjZ3sCZhzQC$N?5dUMGp0 zvaM7=DI3bCz^3)40WQi0s@2PK6{*3h{3EMS^8f-=Tf1Df2^&R$%2g^2lL^xS_7^Lk%NPzB=1!c=BCR~3qtObi5$uKf=nB(xTbhMmAX~M4 z#hoh1SEuw|)@0DV`fke0g|T2LmxW})RmZTx z;&!aGe}1pe2R`K}%o1V)ZyPU5%c2n^b=VS9P_TBLh^*9V{oqUfWlLSsx&icT+J3Ut zg$?IJj=$nJQ%x^U7g;xhf`afoq|??|F|c2{l#}VVka8C$*^$IJ=K?r#q^!>t(B=Gy zXHDc;IO}zBNWo-1mvYWUv#>R=J&A4$Rtj1`eXF#M&^6X;JJ3X0_@Bedp|tSJ^mMcq zl%6#;G3e_c&WfIC0P@^$SvI1B}bXIPX>O@O;@`@|Mb*3)koqRv3W45%xR@4n-j8OAVib?KBRO_=hs+dN+rfqaS)5&Jf7~B9OTj7!!yR zCl5Q!Z^ROypmp53NY5H66nzv8J=?Tx7>z=gxIj1?I4GWc>M)BE(p*7PltQNtuB71ww!-G>MU=HWQtXzvFGSj4!t%;rOrBI^`kT=p&q){d)AXE#T zKiM#DioBglS0`rxE(TTUB zN+VX5WF>L%_-WVGcuNhXazQI#<{Jstj zgdpbG0{=>BXv-|(kZ4`N765sPMwm}hiq;JLp=unjK1k4RGzpUIpR`q+7fGN)AMb>X`T zavf0`o}ok}LpCLduy~rOPGmJM#gq)3VKq*WLZ(5sSZ$jsF|tKGXiaqzx;53k3({(3 z*F7O~Xnb#?Y$FL|4sz}A$;adV2i)K*(I1-p;3tNLsiM++;TQ|ZaHuunqrrp8u8CK$^-J=SO+YLR9L7ZTF ztSObik-a{$EFXg3HUzUU0nT>i2@izl%}ZX65;j(U(m;b;en-p$kaFdU?Zt1tVL)-) z_UOBEqrj1mXqm>!g|fw-!3BjzSl`!#Z=CQc z7MqsW$V54_#^=slM%B+@)dcS-F|<_OG+}dm#{D5#5^@3`khG#UM3M(Yi!`C(h_p{d z=C7Krw6UqIMR{Jh#6e&qseZY<)I`u4K$oNp&m%`vgH2jSm3w(+6eua76M6C_)B5U? zmwKF$XcpvilS7O6Xjo<=r*K=*V8nuO5|=g%=C%_-Kgmkbz#mehq=CC&CA3Bxy>2Z51%>KcgH= zpYnV2oBGrG6Pytgk)d0Lu%#z^tN0?s+})~XkOP=EXPecQkXmhkgWW=&Pgv!&U&i8I z9{0%-8zTWZ3R$_ca70GB+LbU7cRG}sRt~jGIWEXB#Y(frWje`ajVE{=46|`ydX)O1 zM43qRqY|zx;DM_+$zro{%rFDRqk>}&Dx-ailIit8*+fy}6pyy4U;(H(Z&WPn4knb! zxlD=(+AmL1T{sXnvc63X2haxXh8t?&@(SBCn*w6j9rHfdc=OTA)Zs2p+6?njekB6e z7_kACrVunZERZPNLxB~_dO0(3X;*+T0;c3rj3nC~s8NSd1Uvh1n&U)1?}MQW4AwVG z+n{#_RePP2&V=1h$n#KY+KR?TkppH)Z7IzbM--wbG#!D?Q7d;dRYv%7cY@ zyo{3%4108p%;aAf41348J76n*eT2>Ya3AqL=e+7SwzTz!qd`CZym)(@KYN2$ zm)hnAX31s3_)m@wFWg*+du_cJ;hea9qUrwiBO$cOrw!P5uzBoYdxg`Vej9V8F{9jA z?g_&nHNVDQj$rSF>vz~2oQew{C+=v&&t%viB7@-KL%1A%^S1-EzTP_;;1Xoo@%rtO#*OZL!m$S`&nP_p?&M5*oV^SwT zncY4WaHSBmee$q-0IykhxG;b6`UEoYd^%!;d@JW;9L`<57yEd9ba)wkWV~H;@n@Lp zm(fQqGm1`*_AaA~x)?z>sfi+C5XJBg0&o#J=@G}cChzq4c)-{(H>?=DRLd`MQMa5j z@s$vZo+r)6(hjRPW{Ky(kW|r@aNl0Zt%ly($JMa&YMYk!C0sa;yVyH@WSpU!TMv|1 zlE4zG1d3T5uWC2W8OU?`S(cd)c8^=SkUKuQaus;L=`-NKTD7TC=mJ1X!9xknLjMFexn|AS~#X4!4>&B z67+{E66q-=$d=jk$wv zUrQ)e#%U=Ct^Xy^6lTf{rk87`R#vu`(NMw_qYG)?SJ|0zpCz@9v$Oih!r*+ddz5F8_2bx&ivsN}X{(afFmu_mhR@k#^`_MiqTk`@N zgX1+%+RZVIEBILRd`~L&wPgk$TMlha*YEwo$;seoma@};sjW^6=~U%_NtV-=r@=em zoW8IiU_x;{6)lN-AIipu6kzIz9ULfo!Nd``2l%A>3)8HBxidK2yH{NuRmdVy@<(!= z!G+tRhd=e?30S@U{@~u#(cPQ!rR<(n5bF}VhL^LLoK|E-BdKCZ4yY`vew$dP-Wo&! z(`*5>t@Vwy?WfBRw$~ng`PGJYnrusD6e*SW{NBPRKFuxH~0SdzOdQo0@57U+$Xvh*fCp#e3#FG($ zJSqH2oK#m~4SlN3B!v6&LWDDANOw46cP~)DQi7C3aILB~wid93-{L|9!^Du6yX|7l z(rf5T9)q=SuZu;Ke;-%B`}JS{?$`f(mjD05EQP0O`P>cu3m?So;;Oum8%M`rWVp?Tq95k298^h>~+R`0wK&{tA~Irk5ph*v;1^8cu3=CT2KcbLpLl zg2l#L6RkO}Z`sv}WpmlpiENHipniFxHCMYqv1smRw-$eX>&{O<{cQ2};!l*u$is#v z`}_yDzkSDlz8T=QNC6%Dv*#V$?>L0jx7P(%qzv#cXC&y~&RBjT1Dw0Tf9(u#_hvfD z{b_E60cx?ugXNN%Xk|KPDn59pO1JtSZu2lnSMM8DVMTqL*99F}cGvGEy~Z3||7;0q zL*z3NMAp)sw597+_s>r|IBXa|!1BX}4BBS4K1p(x+& zb&ru}0M?AX3il5or{TIruT-DiKq6!AUEh3xb9gUk25%O@NG>-oA6Mkt!U)a&r8CP@kYvdvg)vn{x}y{U?A9pN{=u? zpHABxzzA)jK|)!!^|Og>nMVQK!L|$};SOnQM-ZBF$~(J7mR{o%ha*1GVHCymVb+#DB8g&Mw3a`}IYFH{v3N$ehLF9pgGSTAg#jw_DwC#CUgTwwt|DK5WTE1_@N>hPe*qs_by+en7z616EWEZ+03DWhfsvE~$<+H{kGN7Ld|#+ww-U}*7&$K!fVlajs7j@J;&E2*>6s&TPTK^iv;roe?Y zm6?~DhsTLp4zCoQXzRAo(SbDr+xLEPFbha9PoWe%bR2ka5@Y zxwZ(O^N=$GZ91xERmKtbM9z7eqoW1p+()TpABt?f2tn1ysqHLS(mMUsLcp|R5-$Bc zJHe(I_)Nsg##0U)&kMR=hkf?v*B_(2O~u;8D6G)62oi+ZeN zh_z>93p^LVFXeb(H^Gg&y}sXYXvL5#KOFS#T$hNte7{i+DTGzTt{HZ zdPlw?R} za3=ZvoJoGvKR!J{iX{BI{0eDS9$heVRnlJ4lpRA}?#ILT9p*Trlxyf)tXP_EsFn-q zJH%Asq|_f)cVBf5_j-dHuev)(p3pn!m*<2#JK$8<2P_*??B{Y5BE=z{Crey{uN?m& z5dr48EDAW203zvZO`;*DPeB10CcT{_i%bG#plYQ6l``DqodCjKvp;67pG}~IjaI| zmjR1!3K$NT^X&F~Ij^nvknex~?$yz~&8wqlcW>egj%VX!jW)qg?I(F+-Lx6;>*PX0 zu1>XcIM{u`MS|(O#uDs%%bjWcj8Z}nudk4#rwjA7AXu6Wc+Iw#+_Ki5uEEWeiUsqM%J@10LxYh|*J9bY_hvY?lnZgs=Y9lvSKO5x~6u(al zE;yA(2}QJPoQ&VcdA_y{*2p(lj@Q~&DKrgXzZrfc_a*Drk_g~^8Yq?Az!2_4PP5>H zRqf7j?^LePu^(k}Veb+R&z?_8*{(rOE-fJ+Q->Q+?>1`bIuyC1Sgr~gA@fN81h+#e zMn6Z&5oRmE2X4NVyam8|TQhOR-yAJrW!K3@zT_rNAg+Gl{??7!DZ2 z%In~4$}KdwfEafhGkd<(e}={iw4*CrRKyFOEFYWQ?AycLa@8lF%=OxkKhmpNLh0O^YEEDOE2AQLx5ZtUh zF4x}_FT?tHy1(ChZ7)NaOlaBD<^>6M7a2fcb!AIj4MucHH2RKHj7q>-*B>1=F1m7BQBhmXU`OG~3uZa|Xp z@rFGm%QZ|88>BW$b2WK>)FkysIYw2mSfWKHB-t_P*yrlCkK z%TwVeSv<9=D3~ej1!W)o5^IDatw@d(%(JrN-PA&jjYS2u6kgbmAkSJEu*H_UCxsE|0I^U{=eOf9vHu*vdCnev->wSMLis^@I9$dUq;oc^=6p!J z{s`7b{dKu*nu%DOz8I931KuB>c9HIF(BE2lKIrXs{pUGB^Xgmv<(%zobceW)w1ZnY zMb>^SikY{mvUZGDrAIF-U6Zzs$aZXa(fwD^{e`ct(qRNgWbY-GK6B_PTkDeJ8!@|# zbZ!Jq%Wf;Jy*fEL!@?^;H!YP<_ImwCBjITvsQ1!tj7wIu<&j(f_UFbI?lr-NmKfw; zE#~N`_Znd})Noh|*N}`}b%$kH(*R3xS3MGS9hnHR+V^pP53Yh$8-8cc9SY*)WL`bY zb!)bHQSXdioI}xRl1fGh>=I|bMZttfF+C+)3G8C$Y0)_^%&Kb6$x~`!)Owj01wF}W z0_x(}ho5^C&7!c>qP<5becHEd9aoulPSN1m@X0=Lr>82qPzuu9$$}ff#<&?HXr}~3G0P>YhssGx*0ISx(pvqC1ZYL$R5G!gE zO#?X@o)vge96CD)-hYLyIHnO&{?+;;T5?S84KU%IWv~hHmXdu)j!XW+&>&%7_PUto z0C*p^X7T1CN(vI7skH)XHgY~VB39~cywrhrmtl`RIzGXsI)M{oQ{HSI5!J|bl&@_F!(FJlyozZ@M_n7Mte)J}I;hjEpR^}^FN^5+nEKda z$Wia97tlUf7boM`t5b%H=^os?Sm9+u&22m1!)kpD40vsBk!MZHyCf_7?xx)m8tJNGut{8yyMw!X|`-COjR&DFs8(I0>NgI!a-k zPpN4B95=(PZ#;PPO=S5w+=DuR1p@|oXm6N>PIr;S%gM{(ip|(`E##!$ax`yuUnBMM zXkmWTIqq%0!imzstI_uE@ixT6d~NdHya|H`&P$Tf#oMrRR_z|`-RQmswtX^S}P)-~Q(BfAhazvnj&qgukr@02XfF`SG1(QHYWu6HGZi zzW=`ZD4jg~Jv+^PGqAJ-Ln$X{xWTTzz|CP*0U1<+Mlx|!gfk&eZ}gRLe!UGAt}nEF z%D*|CFl#=OQpu|=`m2Q95-v)XA1XZ?!yddtkUW4RhgZ8phdQJT^rRO27EJVe1jmMq z$9reMbn&R({-vyXHI;s@TP}1y7SiCOY$S@Zhhc8C)np64R@KMBw~-_Hi+}l({Flx= z#^zL9P>JNGt^+?|T@`%-inWS}>(ytse*TjNnoZd<0lXaRbEDR=Fu#m*D7^kLz5Jb> z@-N2)pVVeY!eUK`VI4<~vL7*6r%c{c{PjcCCGOt@aV-s&(o|(|`ZSqTE^0BO^7)mP zFF=}lGG%RWDy0wNFynv(fx5n2Y?Gm@r5m9#gHcI{u-n3ACUz!lK{&YyK&KW|41`H& zx$0hZ3j#!5VT_JZS-fn6RW4U^eMUSS_WnXt|GdgK;ZD)yv{jN1|v> zG`%mZh-gjYm6w`EJo^gd%ElBMa9onO-#I?!H}o?cu1IS*vg!P@&vp~Q z`tja(Efyb_lMb`cCq>HDzlS+D5ZmJ7J=slR!M<5L=0Nl8sp{Z{pLuM$d-c-iTj$1c zL!O;G9jS%GCW=6!x^qw(h8=V1rSLMzk2+MOLrvyqnK|9CTh-##zC=3ux_Uc9V z463jR!x|-=m@sxG)QG~%>oIH#EvfkG9O9U8sSNt@UB&~S47amr=KysX@{A_aeszd; zyhg&PLrBJzs@lB!hPe6xcj~?IJJNo*d($31Lv%TVh0!Gb#rg^uqm+#N`@3R!~2m2I?i?<_P=deWWK3B~$1)$uq%=J%?9*3e^y92~>fb#kzkrnXh zoSZ#|wGRDki31n5zV0prES^`32Pvz&AJO`=7 zAmq_C_*?M^VzpX$)tyI@oxOql1ey>&MaL@Qp-@dHHj&Z*f_1gXb_!^g_x7siNE&;{ z#If-6^01g*bDW^iv;ycU4?Q4$;hN;AlX#JZ`R9jNKqR_pX1)n6md7ovX}PHtt)kk#sM>=x!8w;l%Aqs*{PXY=XOaq!F^WndUZSLiGFoKN;;z3C{$Vy!-FypZbK$ShS>*A_cyqAxqKH zfILJ*it8aa)>1yJxl;{UyA`ag^Yg)~Md|E6cljgkI9=xC+x>DKE;%MFpvt{|G*KBm zMLsL?@AqQmiks3a|KkM&T&br=M=#esHCs>8RUy6Uq2nhdNgmq+Xq$E*CMEGGkgPRI@q>vM~i)1+3R; zT<85|F0GSul3t)bY~c4Pa%OX09(G2WHd`13zC{f)??U*(&xpm@W^xcP-m2N%asopP zG*dR=ThM0$=RQCpX{-#gC{Uotp-LP`!Nf+~$LDoWcB>mLk}UP@IOG`pGN|?KafOJ~ z!K)k9ef)Ybc-7b6wdTnrZY9{f1M>jp2kg)$i+1ryWYhiRK~2_r-)t+dipCai>l6f| zwaquyH%4rrFyGdx%%=&1N1hwk2?cboe`*0#Y$E+@?nD6l1R6?)lg~M>r7F=s(w1y6 z2y&0Q#wRkwYt>blQ^V7`l*xgJoVA6EPq2ZzR^6>Wz0)*CBIC-|iE|&R#)Fe%#3&(V ztppyiEi2JPL{1`_YHF5#`&tken?yiz;5o$&zk^9vsrGi4j>_U={B+&^( z(rf*}BWP9x(|1joV%C*xh zGY+E7&2;PFulSkIKYyc>YvOET@scxk$BbbItH6uq;WxvP54u5E)~hwkyw*imM*2^$ zRCmFakT!1`XCIX7wl!(<%KrtKbFad!x>w$YZ~wP^yMt%{k9_;|*(Tcf1OD{mP>yPT z)<-c7R>@2eVWu){S(T5QT52 zd(i9KVseVxoT24OgVjR!#=(thb9wiu`=I;mXmJ0uzjtV7_lT|Zj}$G$l{5lzWjJls zfY^-d%sA~A*7;99kpq;{OdZ3lRmXDvB>%+)bjScQu9=2~efU{?Q-NKqDY;B1kiMv@oghvM`GT;db2Y~zq(O7_z9YtL;{iBjxOVgH|hw zCu7+dc6y-jfozAd+j))~!#&4>TC`LZ1MAkt4JH-~DWPjvqkwyaB_Sd?>{O?x=ck|k ztR!dT-}p_tfNT|$8Z2hLlWM2?94y3R1&mk#MLP#j4+9xfGuYHd4ajW?V~ARp5=|lT z6B$9{Y1Iy)yiiY_GbU>_ZDL#x5L(FNFdE{?7QvEKI87d%Jnx){#FEn&)?gSVr(a?p z3R;tugW2qQ-7fE=v_g?DBf=90P~pC|N(mnb45mCI;mpYVf1E8EI|K!up8QSU;oI+P zNI7!*8JG)UDy9D5AjamJp!8DNKy(mEG|88CT3Q0=!hDC#4pNXvoy91xXUJibJw$+v zo9&evAN!f}kiu$?!1omrC5j=UYocVY+-pWeMVZ{o>iN$wO1W3sdAQJm{;@4pHqE+>u0@DdG z5xF|l`7ez~9EyC)JIvQW_}1pjHHJ7f!;=lEBr`$XI_+b9!(o@kVdukgxlw3Yu@Jk| zjk7p+s8`QE7dGse<5ZE&Gx(5Xv;#zj*O-cu^2i}=GFET@kFgH?prY`BVE=J z^#b?Z(GD~V>_%;TNRk1c<4za;LzsZzwuZYCP6?c)mF}WC6N*U+JA={=MU^Lh9MW)< zE}#W73+kwz{X5TL)=BIC>{8Uj38sn8l@JcBLUe-0Rc0=r66=%OUo@(u^E#j);aPJY zM^|cS0OrZi+Tvn47dVq+FpU6H7Li3&jVuzcw#uNKB#V;vb63bTRY+&(6FRUV5J)z!^x7N z6T4JKk4+C1?F+BBF9KBB!g*jqV2Qas!nr8) zh*9Kf7{eDHbv^Y|rxXyAh!2|F*02Vxsy%_kv(PXS3E=mh{D*X;kT$oG;jRS4_z=MAn$LVcv_tiC`d zKeUCEPlya!KRenV^v|l#Zrs5;&$pigcexp160H^+Bn=oV#@Aw&k}R6v8*DJv9{FAJ zNI&Vh(WpOq2?P!yctmq=;xYAESi~jO8x=_;SU;6yqd~7#1zIhbdMi0C23%SxT`F{= zKRmuxH0h&L*e#J66$kB)4?AbjQn7N423QtxZ@>Y301&^-zX6 zp_}UIS5HM>V1Fx}2fqcXGVyaYeX78K!^IPv}D+l>l? z!?)G7HE+w{gF2ivIESux=&LvrJ0R4K?g*Le_hkPN-dPi&B@@U_kPW&al!Y-27NAIVn$#;K)Y8(gR@d%7S%0+g zC)@ZY|KR6pQ<(ZkTf49Zk9@tI9t1g1EzFZ-){2X& zkYRyri5(i}l~b4=CtO1Y){(47maFFwGW15ZfgCTWBA&-9QV_nmA!53EaG#7+4&5~N zxYA+{p;BlHK$!BF+S6mi)*g$v^~0zIZAzumd&DM6Cz5QTRw)>?W_orh>Xmj;7i71X z2a)zs>SYHBVC!6%-|Oz29&E$yi|7-SPOX44U`jd{a5Igzpnq*#Y?${i;4_ItiX&j} zxGyhU=YVoG=J|rIj)Manv6Kmgy#e+fyx3s=DR`D5Fl34*w;-=H%Ht{I8WM&sT$7Zc zWA4XBK*TW`qTh?079_ZuLYPrfYz8jO1yKk|z5!Knd;9U~##c`sY;Pk_d24n1+x6A8 z?FXw*VLV^nSbdPF-4s5upa2_N6y1Zp%bIOa@o6$&e~$EKE4uv9-#pJVmeccXLCK}1 zrZy4#1_EIxH(NY<(YChI$`51*C7~4Dyw$$Po3q&r9=imH;yxjzRtl#ay(iDsAbU5{ zCk~H@2PSe5q1`Zvuf9r{tud}Bk-=>V+mor~H$nPr03^JFNka2=RxM?-1#9&w7Hg;} zK_kLNG?2ghy&=>WoD`-eBtiMe?XFq|rX5btVVZKe zO@kMosM$%wh}T8@gx4aHZC-wjd5Nyu_u~PI-sk~kb_1M=_F&z<8g`CXOuO^N3osdY z_~um_G3MnK?@<{FWmye#Ju=++G3(kaRyTu*@l)%kyWA2X8~`pjTux&sqRLi{!n?yW zURM)E{?$>)R=kH8ZXWHRmXKA5W7lQ$bq~p$afL~WcA4SM8BHV~9FM2C4Jz#`A5+>} zvEa3$0lu&aM$W(>0yB>hht<$d;_=cKSt#Y+mnO!Pw=GO)3bjM%1`MLB+*fhd8a>PX z)CMz9^M54BI>8C4Lz~y2bXQWkVah{02c`8VFEm4O5mET2TPbVXb$#S`!mR;zGXzd| zEh3Kw0<7><+{Yydw#l%))>GRQkf%8o*=xDRQ*P;k3ZTNs0mxevI-#AoeS4R?w>XD? z-@CVfjp?^up^DIVPQ8V{x=;NhW zKn5OU+{0RjpwR;!Mu79YHkqv()}wX7n53B{vgL4k1-RI_JrO{Hz0WshvpDV?!#--K zW_n6DU_xyHB^$}2t2jBIhFOfN*)m$PlPxmjUG4k*ZAXpJ?g7ANoPoxeB0IQxt2->y zq#mnWPo@yQ2Gy-)T$Y0aCpLUTym$`{9l+u=8o%f_t)>Rp1sG##3C1x!BE-R_iUUO+ zc_3;9&M@WJSTe|w5^GV5W3f1Ue@NH&nny2FXKhmrp9qN15<_Ohqg#qeCk}BkbYcE3 z4;XK4@k1)7T_!5U<>fjxo(QQKokAM1Vd_-kB#a;;yTywLsSof<=C-%{UaC zi(lZ-&~q4QmUs4GaqOI6eOl(3fx+n>5=PwZ-01X9^hbH~y*LM|4Qg;Js9N6OfY2#- z*85sCH<0w-l6z?$C#jKb03jlJvTc5Ma2S7^X{_8Iq?hFR5+?m%QqE&ZQs-UT&9hPm zGb@YN(x|++qT-wZLdSR=w18T1cEmISqQLF-aONGJ9q9}~$NT%9{R_!8a1PT3NgJ{j z(Z{N7_{*AI{5(qk^yE$q3!J@yXh@PG2SadP`ujCYKBxRTus6_I|fJEcuHYtiFaV$uX;ww5AY8luKqy;pAli?XhZH5VC zb4T^UMEn;}+Wfl!lxsSJXM@tGeSq@An(%(sgonO8D$@r&as@D~393Y>4G*?_ITT5c zvPS;~Em6Zz&L3TJ^G6-tU5vAq7SQ7TCil9|y!2@s5-T~p-68LNP$l(&<{Faq6Aa;(Rrq?sXh0 z<05mkLl5CA$-amc7TO0i(GYu56HsZ`jch{M23Iu|_q0Ok5>5-V_G95(9XWE6pg@_;e#;XLE+$+kcBW{}|u zk&9Sa8SIEfwTS990&rKJ_N@fS?Ezji!Efv&Kx6xa+H#T7j%Ty5^T95`{qZU7z)`N#%`w3)HN|Q?RHz#MwDwKx@55VjLrg~WmkTRNnt(Ujc_75+=l@65* zLk35}Lm43BdBDyFYa6sz!F!Jn>%ZL)_zqcPEJ))Fzhp~0hiAko2ZZ0wuo>f+re4kv zwaIPZVn=XZcXw3I5i38(s~>fNlFh*;l6}qJMf5G|%p+;;CQ@I_$6tu?Ku*@(5me9H zeESm?zg^*Muok|<-}uD>Ke@#cpZ?^QmU%vuB0s$&zn>3TgfCg>XFvJOO6_&dw56Zk z`I$Vz1D2E$&rEe8PhxyLYeK_jG6KY{;CRSh_qAkoRUDM_Shf-zM0F2_SuKN*fU+1n zVNpNU7kk;XEW><_X>7laoV_YR%rr6wk{H7GI|Qb{-SMEiI~c;MF*r|T z=);LBvojt{s34xM0VRXjko4$>0%u2Nk!%ZD3lk8HjkDIK8FH);g-X|RHl`FPde(xj z`ZTuKIiz}U=4}G_nA@YF^(~~FJqS*bD>sp%aBFLG^G}bSeSCBixw6G5V%!ilv(}-e zSWCb&#<4-Uiv3}~{C@V!)7VfiXq?TXr)NAZ;>JI9ZQG{4zL$6V?jLnu_WITR0Zua9 zeZlWL_}XmJg@;?br;qx3@DLzfP1rr#<-F=fR)!3=U8r)y6KZf2+UKyH9n#v#%xJ#6U1bcNM~Pj^^AnZLJ} zi4m?L?8w9dg<<{|@NZ%%Y+H(b5o%GXQ`D_wqh~5#AVZyezy`iRO+GxtZ7;i^zgf1! zArrAz+fkO-q*5cmw%qSQ?gB%h&zi7o3GYeG_p`51&5Z6r4cC49@95N>*L4oP9X-_7 zurV;dK^TyYxOwyDc2@~0;Zl=M2V#jjnYj4nMm6P>Qb~$XT644pNOq(9$Po2VmbP@6 zjB0D%dI55+o8mpd-JD;9qRHei`1gDMb8|k?%40`01_(Y6FcPLG5AbI5HCeg{q6RW=d0G*;C|wJJe21L!So_nftq+KGIEHBp`Lo-Z~) zRo>H4NF&vD%=lvB-HK%PlMo98vzK7uHPCQbYuKGa zwiQw!kyy^`ep(|-z-ApJl5yMx>Eeth4NaNA2Yf4%kw{`rT8L=&jX4S0qQAnb^S2Q; zklpQ0;$6{&dD+WrJ58(r_;JP~<|=R0ZrEKTZ&-d4g{pQrLH-t#Ngq&YdMFxic2{MT z5;hXGf#;1NBQRirCHQk|%oOX9z2ND_kmIOX+d*QmrC>5*Li04NmETgkf(uWY#u07K01T>G(@J8c$#-dqQF|AIY3l6!w5apuc-~ zy2nPzMTp(%9rXzHE>bF1hrJiw>Z($xoD)%)LmnfEmt&d#jE*M@#{rqtHQCoX7s8W1kAm%YI$RU)zKPzj=HqC(Bp9or3i~E;p=hG-M2}rng%Oq$n_euqi+IW*j0QCw}SuEwn z`e>bR;<9S92TM?YTtTRUCHBpdMlSC|bx0F$Ne!A3#-jd>%xFqI|*x`@$MlG$aeS6)%fh9Jd1cmrWe^sk#|6R{>zx2Xd$))7<`{Bs8}L_ z5{9`HK)2B9lAyH68l=!+*ODLfR4l?4{FtEC=r@^nANo#m61TeG!}*i>>T2M)tJPH_ z>Qy>N3Yo}=E|gA71bN-wP_=N?cw*@%qpR20uGI>{wrIGyMpz4kN-a?5Rj(6RVmIwM zv@>1zMH_(>A3_n{cPK(`%)MB|fCUf~n&_ppxsJeQgj{LU7i;lyz}v7J2Eq{s?!(s=J5X?u%|M5JPir z>Iu69%rX#Tr!)Lc!sdTj-T9dcOV=mn@D4r^%kmta$|cGeFkiu<0$*@Z%?IlR?v({} zeJN_e$u22JRrnS!ae36R^XegT_n}9--ZKCs8rceO3@>W&LYwb+Qx%u0;vHgp!D0+x zxZgc_g_Q4W(gkfqc0pQbAGzY&ik6_LLRoZ$JHwBgo2?aWj(=eTLZqTRjyTKZMF9Cm z3AEyv`K6jLV~dYON}DVW!wrfwV3tL+=oMrF@@io*uDm~1-94{l8e-g!pD*S`0x_7n z|8eJa@96Xh0UKT95y8E1uq5DSxjt^xb(3YYFYVpNj|BKY5!gSdWy9e-hSP4`ZnBDb zx(z?EJyQn8BB-lbM3*|5_XvZgvhb7%KGF?5*rgW7VjCJd>M@B(EZTxzCu*aWaHc{d zvnB5H;ktNs|2;QJG%wv^IC~ojYG}~$WYQ+u{@En|4CJ;(iHEj#IxE6>uQ_{8O;h2+9NP!Jn* zM7WLydZUcu2p4gWrf2D+|e?F@c0lHzSHf zEm_8$eDK7$HD8Txc^F-}QJ?IIaa)QyWW4R@_TYy8<)EizeiICR!qYXkNjcqW1wdnc zHpYU`G=*vneQ?ke4%jAhOyZzP$xM=d?vyU7$lr*ErqSbIlSkq}Q(L(kz`gQ7=UGwT>voUwNDg@KG zS)ICEO?A*MV*g7IH#F4XW311;&82G96Wj+97#k|V+)HZZ^`RBbbk0)P!Ycc4906qB zCC!bKrk95E_8H~`s7)__0WlGEquOe`JQ@vldkFHTVgCddI)qG}VD7y%8ljvXoCs1u z-Bxg%^NIuBMj*}r-(4c9z>uD;A+A)G%Y}DNaiX_>XuhqFV+|Z8(mU@Y)&cE>NDWj+ zAiSJPrk`OKA-=e$)F{iG+0FtBJ7>63p>urf(Gp}69nsZm$1mSi*sMv#irg~%$M5}*L}5}zzS4( z(|w<^Lz#OAGoS=uQh#pPSH;}=@NQFy(9qYqtB&G!z}`&o8mCp>c2G1Yv>G-toUfA_ z#a?GZb8ecM62|Uv)?VoZ1BSWF5@W&CEheUgR=PQuPu1igZIAIH8Jn1aA_Mt!=djRC zU`u);C-KKayu}@bIr10p0kd!s=l#G(We*@5)T*_Vo};Mk?vM{3JGF%$2k(BUhhwup zz82eyCMFQw`k?LM8azium$`?m7%iqCMyuozW5KBR7qu|BqCswaFxmwiV4suXlhHXn z{e8gW+Ek!v&67Lr7hHJk;z^5qK(l83lN-**wGNgAN@DArR;{aGJQJg|w0_EsMLx5Y zRpx(52esigwP7l7+@UJ>^IP74^)hZ0z|ksh$UMu2G6kYiK&a{vr{nqow(9+~qAVXq z+Sj-~FczQgkt|b;#aHGTC|~bq%CV$}P|arI8jG zl6~cx7VqDk|RVrD6aquK)0pr0ejAa?cA43h5%gt)Y$*GFyg^|FQ6dP<&A>?QqwzJ!D3*Cee^gaJ1QbYEgm)*CQaiYE2+O42uS9mOV7 zw;Ru()hdp!qAIrysX&GS8mDXud8O-a$T#ZU*rp!DfW%G)MK{kQ>RJ%Z6dbi!L`0)$ z-3AXoMFc!#4-hW^HU6M8+&hG2f{Et_!rpSqrO3w{0g?0egs(y4eb3{^}V5-C{Gs=tUFvGdSHr1yDXl$1W+YnAX?@dgAcvh?4Enf=&3$G+sWh>h{OyDn9t&B8U` z?1Uz+)NGKBjw;5*a)>T1VfTcDQVX^T2@^pi&QkT6GLB*(S#|WBrX3b8R-N%u*Y%BN zC7aZCkMl&Kr&K0tn%FxLs={e9e*$Ar$a+UXke7^s8A8tEZE$-7*h{)hsBzWwpTMEx zXPGfqx(-D4Y+Lo7$hiYmyU6Q=AYfVdyW_DOc)1rhhivg*gdBc zJ0P)~Z|w`mKU_Wt$E0nQDDB>u_z6S0t;%?~&;ucFPV{0)=H4P_AcUFA!^_UF*MSTG z8ba#eAb(QSvT%AcpE^8Yn$ro9I9Sbf$t087$$TvvukpOX3TGoU4RxDl6R(NcnzU4$tv8lFn?0>rXP*|a9Dy2RK- zsE;w!yQz0VFh{Y?U;=Xk&AzY}hg?i0b2M^iWyr%a1|__6C^3-cN=fp?lpKoexp5j2 zRR42Y*zrb{+&YeA-gxQ817ZFWGHZ3nW13DYoX-b3f^_n7{7l%O1od8hi<;JST*#!; zE4#X#lZ7ih>2`bB&btL)S3Rdr_=s~o?G!_MjI~MxF_!2NZKZYta2G5um$#dv zn`6cS*1ZbGKNH=2)QANK1!DXWY< zQ4*VO6A`d_7HjV4|LS>k}4jq!lYq# z_64zdr|Cib7W@HyXGv7BZ1Cooe$R;3|5$8pU0YT zG#D~5&k}RKwA!>etW~ny1CvNdP2EWwK|-+BLU$=s3& zgS1|V2533z-!NrzlEi^Fk>q`HAaV{{Qs>_v2SylX;J~!fML96AT0)m7Am0zCh4B=e z)|i|jC=ez4T<#p0Axi_KvRP`UmB|h&b&TWAUX%h+I3x?~x;uHe?BePdXin=JYuitk zA8dcU`f#H}8dP&eiG*#B+`Aznr3GURED$+>Gv0ipGdAnduca)550__vVG-tyF`l1A zI4vYu;4k05HL0VjiA<55#Wi3}Q(9B+i;Pa{yMu172-aO->^h=T5lH9`!}0N0XRZcYwyK<`$ilM1}F4H={MR5i6Ef<$Ixu+RHFT$1fAo@j`@ zK5JI5yj$(0v0_A4?6N^qGl2;wI14^za+X+CcN!P9k1X!|%-#+RbFC=UVC&t&XRhDS;wd-;M z3>r3^DND+BJ+M62zpWus`ySz5BZZFsl;M?BImUvu)qQ<@h@;%F1NV{DQAV2<(cydC zghW`R7)j6#+N)*V3)_V8$Em?RlAHXO_Hh?e&ud6SEjX1rv6;BBv0kzJx$kE&>=70) z1r3`9QhKDnn4>#|JQQI2N6>P% zRt}MY$3G-uZ6AjVFWMa1*M`sCPynx|-$KqJ&mXilIHVut;SjkrM>tq{ci+C<7|NUS zR;M(XkTzN75z<9Zr@jW%-=)-getHQf^YrszkRwiGM@zKkfkYKtZkda?eZ}J0B`t{VVro!qA{DF^8+8&&8}Kk&nwj=-NaR$w zae3->yuHDtr3c?We!Bhjqc6YO*j`>+TmF;k`xz|K6B}N6^7!%c_WJ76<+bIFCu`|a zPIlm*;Zd$rTp1h=hDh6!D-wBvn#e0!KNyK!zfi0%-s9(jw`Clc5GU~9d5N>40vR~a zZ?IHeTf8UD;@QI7OEA#lJvbwuuXXpo5}5;TmY8;GLwa9!KAJ@FY;@6IgkRk)YAIIV z1eMa!$WQU6#qc}~p`NJM%bPkf&*Ftk(Tk{ajw97rl&RWd@v-gcu>gr5oT@=7Kek02 z_)%A~Qf=~>ugG2ly))YCN=w_V9zREqD|D(DV~c^X#%<-C76xI>s9egg$U*u-|1D#i zx3_!!mxC8L&IF*NToWdUtY857q%pa8O)F_fAN0rjQ|pg^jBDo@ZS;#D{pf;MZ$9ed zctUS)d3bPo1Pffa>@z4^YhCOLpj}~u*}tD`H7pT)c&YOPWd5np7)aBRv^+3*9dvCim)M-hR_LzS!f9hF$+ zY-pN$2NzmOB9IXJX(THzxIF5;#<55&k=^|cECO2De?XmnrAMfA+FHlWp}eVDtD>%& z^Ff3QB@IUGyS)!PL0O0ibqiVPaz~u_f%5dP3-c>EUsgx;YYuNa^9IypUc)H+a5fR# zzOy1CTF_ttu;LrG_JV%aMvjmc z$ku7IN@w8Um?Eu&>pP~*NsD1-0gW;-u%2JncZlimfkD;ii#=?f0f6Q)t!gSrV9Sj^O8gjNk`mnPBtI{OV^S)#Am7;{9GB$L0+~b*^F#RD z;}}YUd|}NKfn)K~8$FJ#OkkCyzZQtU^gIM6kzu}ch}$4kaWoc2@G|^sknj`W(@tAJ z6HaEN!W5wC$!8aoTEQT+kIE4|73UfBI6}!$wD6n31y<8za7!|503&%F-mlnkJ9UyO3YprG3yduii&?8>qs7{puD};T<7%>!FU+N_wxBdE z!a1D&j_9@d4ha!uyFHsE_S-1q%10`W>+1*X3oXeHeZe5mx*M)9R_S13x%6o=#ANEm zvdP1wXm2D5)nYMwP_ANJ!)*Lvm@w~)qQ>h%p$&y9&?!>D@H6QfzpRT=nGkz?QnGw6 z%jiv98{XZ0A)E=m?Q-(+!f!0XM;+sOh54I*y7{NqpM8SsrLN1D zYah?ug!?iKh%l=Yt7b>?MibpJbod#A_eLA=4;@L;jYbSZ@>p&SAFmHUQfz2~jV2Ch z0&#Qh#WN0EeNr!rk+MdPxcpbjy$%HKDldjQ9$*p2P2j?lGs2RbCQK(h{uf&{k&tB= z(PvG~vcAkGE#elLhJ+;E6F(i8O=62FN}`}hi{Uf~?_5vH32$5GFd%^}&95F8ig}Dn70QMIu%L+G z4ja#Wb6O0eT82)}fH#07>Z)wku7FloY-zK0nynFWIwvPQOjml%p7-|lV3UWCmer%Eq;DTu)GA9+a1@0)sV9SZ zWfj*{ZJO~&GB6qm&dZo_5kpM#PJ;kM;?wsm+WkD4ECqg$_nw+Z)vFs0e^ zkX^0C^)h}Db=MR|%Fu}x%cT<=rGi^aaYjjM!ai9eGJKC+!MtT(u!3G;l5RSCyff(p zi@bNHppS*i2cu%O4LTvXoYFX>W#S`)G7|gm zriiLjCQj&jM|#fzt;7>@z;;gzL30XKIb&ppsU*$1aEVna1ede%&Ih_MzifOEHwEx; z^5iR5p4#wRyxKOeb)1;`rW4t~OD1R=e)A9^ewS0d;aB2ytkF80 znBfAaleett^Ech@IOEf8Ms0-ma`^WJWNyQTii_$vZkcKLDigEOS8C7nSe+mM9W)N6 zWDpaMZJwRbMxziNi*9gK6S@t?lBs+fCpKm?E{|%?7ONa76C8kwJIRD@Cy%cRqIM3HcyBt*f#7@U$4^bZYFFa%^GZhw4+0&be(Wwd+?7T}|0a*?#d} z0An02I3JNip-AcDwx*IA-*DMD>SF6od3)NI#P^uhF&R)>O*8A@p1RO%iJw8LG z-sjMbp%3F;(=Kh$xI2y9L@v0FYkj-SRs6Eo)qMY7KU!J+W_=Z{DU^CI98_y$^TUX7 zLkpOQ2UO7uMlc$jBEJ(l+7pOx{)iXmjxYvft^W!azMURSA3CxD4V*{p&v)=`g^|1c zy)FBkF*kun)IQ=)Vr!XGLcRvC-72v3|FZXP+i@M)wctCyVvB~HphSR@N^X}SiXsGp z5~@gm2LMa<0BBSaNRU|qGFh1bDHbLF!x=qB|3Z)R-mm@SKj|;&IoBm_d+$VEK$Uz< zxGZMojvcXL#fo*06?%IEu8bBIDMrL#JmmQl9hUbYaMI53|!$b^8WfLVY3OJ^BtlvbmFko*Y%6lh@RC`O=rMrs|c#|EsaDk(7WCu#Da$Ge;;OO{c&0LOs*yzz1vx9%%e z!U%cG=i(5KfJ#<=9hz;3mgQT|klG{fr+J!T`Zft4V7599&YQLhA%Ocl`Aae&R_7_$ zEPYCY6)jw8JODzn*FCRzUli9FD<<#KHH9mBKpO~OicIxjxK;{YTf>oHxTsHtU|o#1 zjd~yy@FjAW=V!y?AE}k^?LXMsHf{zQNhd3{F!p3{DFKP{B>?22XFsJ);k;MoNk&F` zF>*1&KIkNT3`A49nbNLg)UC)MmzP>Pi32Lf_Mx3r!)t;2HI3ZV3L+uRR$<3+hyZK< z0?Z6+7ywLAkSdOtP!M~fe$EZ{5V03+_*^A+CEArpNQQ!V-DG2ok-i>xuTJA$k{%^lC&oRjPlcq^RW=?Bxo_ z(ZOuxc9-}gK&93q#rBvUeF#laGGR=Auz!N9aSR&?jCvnyVW3-!W<>)&qX&8k!E*F; z1hkae1$niI@8ll5p|G`*M<;&4-Aj0M&U@jg;BrTaNTiI2Zn%K|*2C?aC;bz-R?f5^ z!LwuZd5=fPL`^aChl0tb_)RC_rjhv`j(Tr!mA5lYg;bOVC5CWW9(i`SF#t3HBtnKB z0Xeu-3&I5zN~Y_C2#RGOM{nx_OSfq?PRfOawP~?J0{!Zw<%T}Y zgA@cAzPY>Wbo_TE)2m1mO8;=A)RLfeB6<34niFb_qNVRE~oA z!AvC8k!Y1O5-67&ih}~EuWq*5I|$%PQ3~p0EiUVJ`b`l7trvuPEfhUfx4%6a7flFi zE;OeB{5}$xz795RTP>IFYR%bgsQJiOk+XDkMVw1|oN`mYw;Ah}3yMQFWn(Bl_EmGX z-CIf$=VGbydey8|F&5+5T(j3Cjt!W;nd-?nSIurO=;~K2tM(avSv9v&aKglVf_f%^ zCU&JxfpO-PP~i^_N;=Ucnu9bswQ=*+;7+SfiVL-(=7<6~doo@w(PcAhCYkVq(==1>AMGa3-j=eSXf9jY)k^c|jp_6Exx#9-F$ z+)-Z*=Gb||Gx&{3Zk$5t5(%W$;FjRDGx)_T^1wa5!R2s(TMf($j9wzj_>9397@4aZ2rzlTgwUA-Ohz8r=;_7f+dI3D z*B{-65($=>AT3?C44~uz0HSGDEUTWQ*Krp`+JaP_f+7TpNFiL(jO1o(E9z`~mih`w znze2cDoeEq=_WqAvYTYP*tlZ?0IMQQKAGpR$oinxJIWB6r>N%>tD-xokZ8>bTn@j zfvV}U6%wCQ$XI~$6MhtP?IEm{w1H!AIOtq3eF}~ay0GB;l5}Re02$eYBNqN-M!ccF zO9F(jm81`B3Tkx8jD-n(!gfdmjJ{gs8t8KqT`sG72D+RptHNs$C!=a!#8inA2~fH* zf=636UGZCKVAgAC!;^_^c6od;!|ep7sT?LV$govoK`J&9(8SeWHBj&}nD&15mmx1qCwF-t2Mu zI9wPicnI7=YLM(Ya^z0r2Q?W28*%f0=l_FSkoUXi z(8|w{KzR2rJyiMa-M{c(RtLQcrgXXt%OfMP#8vTo$l;!+)P4Z@Fnp3N!Js-s=7&Vq zY3~3F=!@D@hW&c>4+-b>x3iucEqu)KW;`O!t|GcINkH zY>|fAj(@}x0UxO8@0b=HR_tnOipkg0(9#p6k|U;na#=k&qniR5$FEM158je%%=A0S z?A{(;JRDvQP6A+&lxB9xg+4rQyVm&!&ND*_eL&~cwBkzNdu2TvnoL?-)JQRZ7v@9# zEtqp%o@N=q>+`y2!LGzIvRolpZj9yeZ^>@9l`mC5c&MHab67GOg0h`P4Yh}K#OjgV z>w;`8T;nlfu|VAHiDQu5Zbc{1MRiz!!6O&`B>{s!7jGTzzZ?zU=mBKh`187t^2GAy z6aUit>A0ua5E8tHr7tol{){sSh)4}QqrEwqDLoKi2ypnfpI~eoV>SgZ?X>K8==6vFhP`L-yw?iByxcehN zKgY*XyhQy$MhIGo#i|mML~}C`5C~@hFZvhaDWXyzPOj#bi!0)08Z@h<(hsggfHMFm z&`n=%9C@tS71ec(Z2e6&HdSs9Of}DgEg+;lN`cFzSk_|PKB449eD@4t(4WEpg(;OuASC^bNmM|XTi_=n7S6F%@8o< zeCc08d?Vc4GI?qN!^O?9vxO_%a#XaZK&EGOg8dTRPq@Y0!?;L-=!pasb`(B}y}k-axO|F}H9)v{24nBF!V zG?b$%v09qF>2Azs)`3Qk*uC}eHL9GchbzJN-bHtWLkSFw;Vi)mNT;zK37Z5GN`#@R zg;p@b>9AMhYWXwfR$mT&91PzKG<&9vE_@sr8f+4M!9Q6CZT;jmk3BU4SN$to5Eyq7 zkZe$Gqf`z~uSwYr!UEKNsM0;S~)(6Mq zw2nu&7T{K&y&jS(`fw{As+AGG2jgJQv_UO7afpOp*-77aQFLi82o1IjS)ck( z(wT6BPb$w7_x-P1g%`JKDJHeVUR>f{#)a&$?sI4!sQP2Y@e~|c&cz&a&C^5JV`kT( z0E4qGusj2r%vubwt)ZmFD?7d3l*HzF;IM|CM;EsBPMH^UHw(DvLoleUh(Ik-``!Ki z04MSL7bnAG%X@0MHKjpzOd5IRo+eQ9ggK9Yqd-b>`dbB%pH!$pWd?Ph!Vc2F7_Ra7Y)pRYO0$?sC)oN3oejzL|-7I2i7AE_# z*m}weKQSo*-*FS~>Dt=P)BPt;_mA|-3u7KSObsWCn|Y+tAtK zVB%a-JX5oDhAKmCcL6!-n%?jLB8{p<$(nw(5xb0Flxt`7nr->=G|<8jU|KE-P+%gQ z!zy7ZfM|PbVQ{iTO3nMX03~~4;qfuCpdHMSUmo6V)ikQ5Q$H?tHI74fxTz$(weTE4 zbg|*j8Nn4@)^^E;C^f&$Z@ttdc;Xx0T zM5ms;wNA%{rBoKc1wA26KNL7AQOm4uKgeu)ix*vhnKrw+wj+vBi>_Rr^lBn!oep`n z=|uR{)J}M9HZw=W2fOW8vD-q(@UShGH>bH3J1&F8b9NY*W6AgD?9a4K{b#X063uwA zj;yY7UT$%*F8ApVzlJV0ko$iP-R$+~Kg2aYbM~c&YvjMdkestCV{+eKo}Ttbekyyh zzO>6l0rTZQ)Jxv|>zttZ>*VIai|s!y+UJ7(?Dt0J{XrLmWgZhnAo5D3_5@t-FEvaZ z>fw9karJI|N7o5Fg4wZysY2MAA!WU3XCbR$PVa`oE`6D6gMOZi>hb!&9zELH-aLA= zx&7V#_jGxF@tKOb;QNp~u;RDBUh;_RaNrz@(lopP9U=O|vL|$ZKk5x$T)Zs$dtMN_ zyj27k(zMvw)rO|cY3IJ@aT?hMEjE?=V@e&!Y!<;Jy*3F-Ia7O_BLVH^b5$5v#Jvx z9#`2x2*#bD&OJ-Y@qj){BqrCTBI6M0$Jj(?XG4@Zd{H4s8h8C_bx8B56Gz$!uH~E$ zE54mE7n$4-gb9U$zgaUsO0gA`K$F#pw2PHF#Ke{jq!m=T8C=||mJc6n?QU-D@9h5D z(cb2h_1$%Rl>6K|hld^97NY)|VjS~ja3DyZdK$JaTbsv2mx$qC^S8+5U0UdvQIJ_v zFvb#i^1cu~5r34QrIPx|V!5E4dzKfYfj09@aW1SlD9tPJ{w#M-PV`LH!82B42D1nE zAxd?twDmWZd?4#jzc8eObM7c#swKYOyyVRR?Vu4F{4ss~wEq)65j6X9Y6<#HZ(CSY zUdG#)0EsiLZi=6(*C@xuYUEfvX;5G%@1!?I=_ejGNJ^yIZ;Z$p+O3Obcc(zw^72<_4Rrw47-)2od`$L6@iKQeR9QPw$57N2yE?vUn+ zT9;rYj~Fs-+g{Uq@`{wN5{-6Lc=|aX9F8GR2N$Qyox40?1jcahT*&DRDtKxoxT>N-U&TTy=gZvVI^`x+bvjyJipd@cz``)0I5gEqp=&~)$ zVwrUz(=KCp$5aq8iG+bvw?a^%V`!v-Q4}{88#Wwa3GNm1fxkqJQ2mCrC|^{@{7k5E zZqEx5%+yq!8IoYFzpHSaD+#wPi%vC!&fU`&Ut2=dSI@)8d%P&c#EVo5a>HP8(OAox zZ6=Ts=+4d`LHHd&`}_=2iLk<|><#!Mm63+^JDc1qY#d3c5b`&&EP232iQ0o%3F+|^0GCCskYtC2pt0%$sxI9%7(phNA^uzC>h9O~E= zcq=l}isb$HVu)DL-|rznN^k4;l9{Xw4;m`-{zW~N57~P%S1|VZto9Uc)c`X&M*p!C z0#bNjept$MbE{oAEtZ#(ENT^)p%+04lmCF5h8|#@BON;v^s3iiWky87fJ;XDf5TM_ zJRNa$GI(q)3pX(>`~$^E-rC`Biej)^z7H#2D_y!IB!Hq(i_?`KpGRftJ7S4fk#^2% z<-#{vCKKBLH?j_@=eVp6j=$ll*9?b((plFNNgbgo{P0P2&_UlF-YC|Q0Xom(GwyAn z&=5hf5Od2ZDn0k}bN))Ty1Kf=d04;A{tsv_Ea?q{@DZ9W`#Uvh;27zGrrkuTk?vm;7#Qb$sVdVOPO~4{DpeE@B4Q`cw`)AYd*~n1BRYO0C&izS zC^{oZP0y{#((1>gah?){+13ZK)(aRb=ysapU%w{i5)_03R;pw75yKhOwV2-=Qo-?< zOwdFOAhpIgNBd$gNSPZAi49GFd2nI@TAKZoT0vHnc$6X4M_)s>nvbXy0xAc^Ri~cK z)3g37oH=_r#I5M5Ba#f)I|175E(nn<;{$(yt8{TOMfoHAdfp&%<;ZT|-(txm>iZm? z*4jzGYgjPPlPFHc6{}+YNpFlpM$~-LkXVx911J4j&X24^mUZ1Bcxg`a<}I^W}T$q4Eun7|>{tT%YQ+}YpUeSGv}cjvp^ z^~at1O~wg4A}Th|UtPQfYBrF{fwNz5nsolZ|LcFIejySkJkDqR7cX&@^Glp_m%I;Y zTpeD1@lXHqxhx;s@h_dS4DrNJkPK1wUwfy7=>II=07NI<(T~jl{Vo7hXGIADlw;NC z;J$IKsZPTO7Bsu3&tDBXQ9LGH8p&e3DWyw7(#pO5Sn>n03Mk^po66sXIm;qw<4K|W zh#L0pdEc%gsF~N&ZQclUJ)h_`Q?fB#HQnP8(xvWT{066n16$1@0iR-hf&@{J2mFSA zyk)V;(#F$b6|+rq5rpbV_&RQ$8|EjuZXOP9CPT+5xro%6wUFfWy1oa;Jch=pPk*XQ zD1p``;v^$_JwyBoH>j5+7D9ILQH0?VXGNT2^ihO&CWQH%NtRQwnIu?DC|w$BB3*#l zq5$>x6f*tqT&KZgv@lL`IuDdN$JxK%9@@j)fIN^p)4%Fyyb}HGuP(d-z6X;M3WXBk zWR$l|sAuASP0!16?_%~+?x9tg-0fXljt0!{!+_E0f#?)GxaZv;QHOvB&ZXV~ViUNx z_cUJWTMIiIS708Z^7WR}z>xZK?nRvprP#1u2oQT};*9m9Gln5uAb_A|VR{-IVMjPX5lF9u>(7vKFT@-ogingw)_26vSzvAKf10Coy3- zVoy=U?-8$e?pX4nY%IPhY5bBmGC+drqlcD?rR-dl`sV#O9lS(pqYsQOi=wG9bq`XfdVAVCxjI z(SQRi8nXXTtO4MGKzUu&=FTIF3}IqiR5C8LAdG01Y-kX`=QFHu%B^d&P9?8;enSG! z?Mkw0DF&!8S>bD{BTNWtpmJuc_pr`D4swQBvWD|u#_h$MVVp0xEb`Ee=9NEU#&{W& zGVYCDqd8s?^n7W=0WUQ2f6?!oN*5=La)s2;&FSh8 z@cboqTSS29Vv{*+nmp@jSimR<(Q#~Ao#qPpj~-0Rf7L`=(3@nF=$d$%bW~XM_n2j@ zSCL_%#CufoBcKkMu6jfSJ=;+fEQ9CuhDWnoMkXKhpV{+Fb-D?MLa=fG`J2bmxIu^} z^`R+Iz6;AN6EPIWM6-jB$Im1^TbjrHDXj~PkU=9o7DAWwUbH1ZTY^DU;Rhv>ug3x% zngX8om%N{HMmf__bx~%M8SdC-I#IAVy@cCR3d5{g6mi5>7%q0IEyXM`<(b)q5g-#c zrJj?x{(R@4i6$uEs1XeUgRihBarSU?-?FYd%z)lcug*{!KarD%Z-%22o`?zkQ@_QY zU%AJwjCfZHV#fD$RnT(~yy~oW2|<|nN7NmfAaUF0R&}rXT<)1B-tSiR=PM`()`V!8 zq=ZX5ot&T|HsYrxIlA%4C{1d4#g}AFod^8mKlr*~WS`>HjBXPbkk zyVM@#la5elgBZ_kd_^HyZQAq=Bslw~T9AKo+D(LP=~iu&DNGFNfgXkUcpOeagaaSa zaU1p`9$k}`wb$k!u4tY9iq_576wFY>dxIVhNKdMB_GCOd#C>Y~{};WHcocb|!<^@N z5kcbxUNS!Jm6@x)n!M~KBgC|oU#_J$;^jIzvIB}2I@1|@l<7R^BT)pl7z*9V_dTeM z$D=+9A|`8Khnc;m_8)jVPW65FY}|#?a`!L%x_YttQh&JrVmN$(s?Rtaw2ItwUZhv~ zo4dp3sK&j4mav2Fj`(dAx-PzzCAsxHv!LAxXujHS)6TN2-gYL0sC#~%>TN9q4OT84 zgGEv0EBz!c_`Qv_cGg3_UIH^5IJL8&${YoV1VeQ~$N3SGX$fJFaE$e2;FhvbnP+6O zk*(^L>J)%7MD+ZmzIG1uk=-@Ar&mCQ0pa_Rv)TGPR6>EY&5l%zuiS&L3kd40d!6m! zvE=FCJo3vvj)PwEauKoDkPIOA|5cB*8v9yx^PTBTzuZJh_d%!Umo`a?mCgt1g*8fk zl(|_q%h_o&uH^(2nfMh#2%yV;0EkEeg3TyUk1hvNuG^1~+Ps+|b6jN7VN9n7xbI`bt58n3O%As^ZY2c4WTgKeyQ{>ATc z=i0(!FtEP0y}rL$j1#tmk7Xe+!_KJxx{I3n4d_XE>Fm%6N`w3$9(*^#WAhE131F+G z&&C)HueHp#l@Sb!ETqyQ{4D&Guc5`7h|nltU=j27scf6d)XF`2c;3TF;gcimhVcbX zcgTC-aYsiNLuGjNdtKdT@k&HZl)Y}!BvWzi;zNnDX-kwDIZifdESms3x?`mYeCP&0W({oObZ3Y~%K^}p+*7neNtzj#manAhTcC6>fomRK@Dy+?UY zkan~Rp#GBpW#$d-3|rXh1ZL4$_pR2Xk>d;qm(tqlzJ^`Hd<4G$XdFs8vBC(-deDoC zh*DO<>0$SIzc;9!pbp~T7&re`cTeS)`*woP4W)47cmm4&Wt?m>BtVK@vv8(MGpLtr zgbH!me}T*XYQod30A!d8W9|@N9i-~vhe$>q^3|Y1@;htmNK4%eEZflGQlM0j!acUW zxJj1p-o4w|+K*q_p>*(dxu^N+K~QIBd|}WQBUyxy zp`+w>B!+{A_-#arJMUsv&)+6SODOrVvZBxL-r>x^4er@Z=TpGs?|%K$`B{K%>!L#p z0tK&zxPg(xkC+&2uxiwOBM4?Pfupxt#wG_YH8zT?6|@MBJ+5f4^hUR)f(6|>5LojY zCIMBJO-IH>IWWMyEtd_a^jGL6E+EwatCOosOA7qyfT-`K-cP;bOWZ>=yRwz=!oa~y zL6}FgY-WjG(W|umaZ;9-tU<# z%Lr;7bd=x|n?ck>6&B0>6fHZTs3TUMXlsh+th&_+`?zfA5_UOhl9}~JJ{E<{RqtSu z)Ts)}>_Ws43A&k_=UcFZ+TsAq2Mc%BgvEKtH-XQ)L~;8kJd?lv2+K$z5tdRuadj64 z-wBJ<;*~NMT0QM>ZS7C%kDhL#EdTZtD(v=JCt-W%JO;I``gqHRDopd5B?()dQ^Ss@ zHN&SMr55h8?EvV)9V6z{KMnxT*`3KY{b#Rt4JMd#v^fDvcw^+c`Ihy;d{>HmuwXSU1g=G6VyNPttPjn=lL_&MpFc6q0$>%SC7BBI0HXF)wQ&zv7) z+eS-OHa*jADKRmNC+xQP35lOLT{qt61+~Q^oMHuj(mbRv1mLw|3B@~l6C!j!O)D>- zLNmlO&jv}l3uax@gW;<&lJsH%SD5J~@9k}TqFS@?gu-a>13uFbja0W~mKf^b4wzQzl*OfI zVla&8oUqjRY4G;~d8A1aSlyV{O@o_)#ErhTCf^kggnlWg|GT}@Grfu!8OksVE^sVf z8bgE|Y#bp?xpCXd#$W_-v~o|seG^7ZH$dj(tyz8z^<9j^G%FontNyYDNUdxHgw zFrVbxX@+k9qB_4s{wgX50EM)&OIJryl0;%}<0=;!tj#(|#}QSNYa+SGO{)@2fwV%k zk^z!5xuO#T#K5oZQns7R7)uy2=)rnRO|cN^m7~1^6OQ_YM8#zX(+LHJSw>iG;aDJ< zbfNDjUhU|kHiuHO3`&2s_1_ZqF|KeJm}l{szbHZ8+NF>COvuLnkd-h%8Q{c2LF(WJ zbrSId5Y44zn)y|I6RGo{xiwi8>*l6&D&wWVQKF5_;U`Gmu2QivnXD3SiH7NWkpV~` zBxzU%LZUY?=t9eBPhy(KM`?Q3FIDdhV*8zL7;+o@S$~0v+6*E5nb{W%-A?x>cnUCUC-`S)wjrgocxSugsbhsEL5{tufh*tSlEFm zYci3|U~`5yYUJu{xtPLLP$xtXfG}@3wwftCZ4*ie)TT73lHWpySIsJU=ZbkH;I_tjav)gh&=G^-|%;bAL1((BE24c?Si*N4yi0_@(O<=~l-- z3Z{NyZ*L`U+7?0d9zSc~N+WA-;oOfC1$?NyiWf4Myo?3rGEl%bPo&&cjSafK!36t> zi0zLzb+&Cdt#Pn~tT#MTpy3lMhU2Jo>==U$+Ha7E3ELMK-^qV#ynj=Ds1wIj+{K2_Kl>iF1+A$wY+*a}RjT z(c3?Ng&aVP($n)}i3&CDC9vB#t;FD1o1J$j`c1G|e>G3JU~NvtEO;WA44XJ6mOBhb ziK;q`9Hr+Z6X+mtra-Og7BZ@JeZ01z1WP!^4+hBeAd(pN!l)#xVlUYOvG5iQZEl?& z_5~u+QK{sXGYt)A7M-%JAD)rBc-iGHKr{T09So_YApnb7U9fhn*Mu2*A0Ta<4wuRU zcmYT5g{f+381BP!oFyc=k9vQ-?4#5!4iIU8JaEQV!t<`@(7pa{l-IDNkOR<-{|3X9 zcy$zZPk}f2r7tNnFTviPqfRnT$w8cmI7*gN+60t0tffDbCB+ivTDI7$-RcZXHw_bd zT$_a?`GN!Io$11lhcJae8Uxtrei{#knwTpxF%TZOFSxFXW1UY}W|_+H6)l6X4z#rDukdb_1GLL!7O--DXL$e7qVN#^X$i*0`L%4Z=bE{qp&W%4GZ5pQbWU!IZfDmE!I& zFk!XrNfv}e$?Ft3Ami2Q+qV?aq)rLN<3<;p6M0d+yN`cu@O9mMN}K=;D06hqEUwvvXB;F@4}T(dS7gJbJheeTf&3R>E#Qg!`pmJ$>NKO zvuG>A*x55rUA^=imrHEW*hJ5ls!?Fj@f0IrON@pnJW{SwjxB&DMoAQdsc!}ICrQZ= z#j(nQgA z$bV;8h{zDq4k7{iulX+uK{MI3Y_vm=5=meJ6{Rg2sU`YsX}=fiOy(SVu*mBY+1z+Ulb3~kE%gjX#s-iE-VQ-7Ej^x6 zU_l>ojp8S+k>-9+TW>2E1)efq=P$8)@c8{i=N1RLGji^tA(U`r^qu!FugKrIH`x~Ser8Dy#`f}q4Tj`^Yz%1Qr(B|2CL2zpatTcz;f z-0&C%{OurX&_Apx2<<)-0)tHjU5zV|NJ`Ui08)x#7#Ztkel4Rywal|~i^tC;rXc6Z zOm;zlH#997ov$7CM!j{KFDBuJ%+Va?rgWKm4-r*ZS$huf~t1GYyJCPC>QaCbQ+y(>kd zXr`l-HuSKYALB5KLvZV+SJ&>Iy6R?2UBcibDpwb+yEKyqyBN$Ee@0D zeVYk_5LwKU^b!Z=p8Mswn5kDzOj&F`^X*}i8XcE9{T9QHcpRN#ke#^06iznx-MC4G z5zItVqWr}DHv#)?{yo$c>z+f2JJW=8oE|}6>*0sxE!y^5bdm5Vb?|*De@}i_=Iu6y zL*b^AP^0}Ao|#v$EhVRHKD{l2z03`@oX@HZw#d$u>3Z-3P^$I4k40^fYXT0GGHYqB1nJ*+Q87%E6!DX7ed|kJj{L}oT-xZb z`eH)4k_@4gmGI-lREj2)OPXjKltj$QCKODsIY>^tI2LDHf3hXEkk#I23$O-~dNB9P zPAz1wC4SUcVh+X+FL5M`KB*x_q^Sod0K21PNvx@KCN8Tm-C?z1ax=~*nrlXl=B6o( zX9Xc96hDZua8#iIBoHlk6lx~67K~>4Wu$uy1H{zg^RrWvj~#7j#6md(@$`ke!3AP(3I|9AG;J5 zDVv+Pb+LvKsAXmi8BmSlB0dhYrqGz#JQ8H+al1HrP3GtpO2!1y#&3~$n$^Mb?b=zY z*i}MEwf#MToUn<~d^zrt6z>XPji$bH#i*o+?!|@N(oR-P;GG}WxW5fjz7HxYe=5kM znR{c`$3>{cs+-tzg1LgxyqB0=)UaJbX|@~m>znRMIUbJ8HJ*euRx3vPUnkeMQDPq>IHD7{yK>tO5fV=NpU&#m1Y)GipYWB+cxHtW=hq2kW zdJ7OIdMm00UGyG;NR8H#087%{e=pk5_3wun54aUOsD%dBPfif(C#%=^X^9-u>MVhg z+$8>Ko}hiFN5ngkEJ@?=mGuBqQqzIr`;gz~v}~Gs;Da??ITyBTYkuy85=Xd7eB@_? zicy>4)+1;VJcL=5e&Z3c#x8!=o(`VrBs`N%p z>$SXaW^3q4h|u880gW)G+%iSV6?;NMGPCRmCuPg@O$b~2YT6h|Sau7dSf`;Ed{}}7 zHoCx>QvOIn^Y19rY8N*0o!g9+YAq%3<Zk^hBZDj%2y8VG{T&@fJuP7%0*$P*jE3wMqPMYw?Kcr`&$es`X9t|FM3SKpec8IsvK~?!8AcGjb%~seJKhcmRIPp z?*;WO5s;e-3KX87a~m=iaE930@>)qjBzL%m#DOlBf%vy^%z3!>ygTyzt|a45x2tU( z702Weu2B)bDQGFs*;Mi;PBYN&M4AM~WEuiqX~3BQFS`IZN*XF}7L2IT#L3V@z<=Yz zbZfM*^RV0uJ%x~x`?(EQjq832#g~B;Y$CgXQaoUi#3mkNQH`m0G7Ad-_z2diMOZ$; z*k$+r4@>P^rp|E=IO@5hT9h-Rq@c$$^Fa{?O&yBS#gblgR zCPcQhoeA5!c1Z=vB&EX=!S03DX$xnbNJda+g*r;WQvz7I7m1^0;%5FyJM-qw$;2n= zFvm5wwx^@vxrjBd8e=V8kcH(mh&Ie|DI3yq$)_@Xv0#1;qz+w9**1;Ag$Na88>&g^ z4>PTnuY!1OLDEkY~qsj$2O000{NPyVAobHY~EB*Q79+$ zRU@sOEv9dBG1BivPm64_2Uhe+f)B|U<>Z6UGCe<;D%dkEV7lFsK_y*w5{hgIjOk2= zmS+AUc4nAM%~g}Hbpqm5+?q#cuAD}`(((%D()8{kYs(Whyv6tIRm*D1fZ&(>ckcC* zP6~>w(RO{|nqHf@FR^0Zb3)}@@}-JXscp*LgvXo2fQ8Wn2faqf_NIs=HHMN*Q~x3S4*gSGMHDP%LHieq!Dkb zcu`uyla$IJ%J-%Icn{M*>$yA#?Gh)hlFlV6#urQzB2qia?P*K8IC7dpx{!%L*Di)-#l|BKhCheoGmyTlh6n4e|r&gK{$ds{NI66kH#$ z6*w{Gbt}U`J<*WAol@idpRoa}MNLyw3 zx)D%GI4St>`J>HO)1G?IbbKPSEc2x2nc+D=SlV#GPOP)(_5>(k|T#NF+P-M&FidgIZGvZM?%lZ zARoVl8W3U-pNHl@N;M6nKz4bKu%_Ll+_zfNwp8fk6SJ&3NFzn)N3TAC(h*bxx7#>H zTflOu1ql-u7mo0!toE_2LzfH6W%|r+JG&U6W}>wVDCOX_Yz>LYry3s!zSW9p*D)wCy;|&zMQrNv%jp-jtT1g#3uKI{edP>vW0qKZvA(qxqs7 zPs3uvf(et(YOBn9D8rh$1>Z}#A_d_}1Z1FZWwN*ej#5GX*M~4s!FOE<@7Z;Fr z?)>|~zaJj1J^S?2W&GoxZ+)_KCnEp7q=~d@vyuC|B`CP?d=b;{C(y=+f{DLc!NhnB zE@x;nR@r+rJpK`9{f~c~_q~TW0*||H=Xre(FZK=}o?&$PIDa2|xbo>06!M<+BU#Cx zR4BxUy4dW$@;C`qeA6MAcbHX5|E@PYJssgT!fzn}P$&I`eP4af@8vB~7o#pxe~3ET zov`fs7qKi~b)WV4_%IxtHO_%sm56ML<|KETEfbdL%*$kI$#mF7#%!QgYlvNKljm$e zhgMMgq0sYDBTtf~Fh5;5eNG}lKGY@5(Ql_LYD(sN5#Ov-+mmuJB36CkzT7OVB637@ zG&|pAh41gMF^NHMNN6$0gN7oN$W%k&i@%C;(pgvPg*57(!7*_17Rsg;rQi>4*&r{ zyk0<46ZuRPqufC#YD21Hk=#B?V1XawSn7u?FZr&nZLFlZF@k7xket!TPyMJ*qJT?aPiEBZ) z!RD9-UNF9pem?nHnC5~HsQ@sh0ZUm}afe8)-yd_Gw+`6M<+c|Xdb49zau)MDmueRe z*dSudVi23wHC{geJsM^#x>mh&p;_qe@%&5Apa#_YkTrThlyr{quB_aDjWhgvT(F?j z_pISoq6dB{RI=-Bkr%q6C~%ad-;A3~aaj(tjr^{h{MsU0Jn9V6Ka|&B^A;hwup&SP zOTlKVrUIa*SGj(x)@^9mRCainRGR9AP02J}16sXNyBnyX3haiu@8+m=V{bYW4Vjmv z*Wb99?|Q`c?4$D6nip;+F6(E(7uw@N*oLFvvv=1lD7~sjiIZTsC6@&oR$8>n1bu4f z!H1i9Sy%4ixY9|e+rh_WQ3+-1sYV~wY^%vTv)SY#^?UK)*L12(oN=4=aBN(&m>RAy zvPoY5%|+>Ttu=b2l!)5886=?u!iUQrr@j2~LGM)$HFpQcZ?^`2(E|AM-ng=%T*-OM zoXV^9@@Uvak`MYCTy#;{b(H-)W7iFHB#^IA2#O=4xF>Mw;UtB@;oAIoT*LGfu`v3%!Hxv^hrlQpE- zN=dnf&{(B6Kt?&au#}+ygT0Bzu*sy}MuLK~?%&>S=!!k=@~)YKBx!Idd5Vo9X^QFN zv2v6xoMO#igiT|)UM1Mbr&~fO8CQ8PU36cJYx+vei$RwW9c8Hu^pWIh&=shcq|{$} z!g4;SE^86sceDK+`gHUO!o*ksX zC`xI06C_SGe=RNn+c$cK`9Pee%W^wRfsA-hi~_CmN8(TsSYn+jq!^b zqH>xhp6ZL`{MC1cfVs8?gX2MZeNx_4-c4@)7=vMdO{A~Hk#6(;_=!j{WQ3s7PsRc8 zNCT4fxR9^9!@tG5u}X=ys$$|u5;RvO4ZCk5)!+Aj)7{LJ7p8QwY?kEdZE>YQ{&Eb_ zpe;GKcf@~%qXx^^rFhyR$Dq6unYZS&H9<-V(;xVyI^JR48Om7qP$SP+T(M(Q2?F_Y z;4|cMJtJog@Hk>VL)x@}Rbq}U4ku2m_!fg4q7&R4!oPCsQoUSA=<3k(W zMVWDxypRR4VRbdoZSqpS9ef>9TnTdXmm2ZQck}hjzh(OYDPE6pDs6bOfn22Jj=7Sd zu;uGm;E!9*Gq9UbbHxy{6?)8@J@8&q13aHV1U}tRNJSDA-s5hztqMhO0oJEIfdMud zg)TViyH|d3$I5v5V0uSU6G4LwtL3=YWZ12(MJxnG5fopjbhx-T{Rw20B0EJYRzK)c ztTdYG@~iz5$#jlP#faiVU~=lfB-|Y;wD)_Xa~9_*Og63bSuMTkpIp3Dj^KuxKYH2g zzj%pDQn^XWXJga_)h9`I&UapV3JS7}iJWfq?xAkYA;66d=GQ_k2m7ftC-w)vUkidO z(BP=7Pl`*OmOC3ekDfl>-V5jI0WleehVmuNTi+=;h(V%-M>XT#8b&4=xk9EZjC*IN zYirHj>N8e~deFxOJ3Qc!6}*dG8USf$%zXHL@c9w>6H%D5ncrmbK7tMk`w;6U?EE^FYe6e0E-)7&QB6G<1Alxy7>Wh2-_&Efx)!)VkUSL(!a?R;qUi%t1VM#2) zo9je%&lG$p;JMsuvTW~k@obWv!$Ygd{{T0hZ|v`&Q2pNKll9$od@RvTtQ1+u$UZ*# z^wv-M&oYST@NhZ%?eOr{t#2eNSvg7IPV3uyTN^vuKqrtOS3(go6)8EbKjrONL{b{xBA5}+a&m2C+XX9g#wlw@M<7QnbhleTuU<%xv5|>=_PGz5FVm1rqyv+XbB9!5@H=GMNj0zttwhcFt%4-6l$w9&# zA@GHz3mm{8D_WW38;85_wv9BI-;{hGlKUGudtU4<+--3>4AO$x^$$@$$?9kmng1Wql|xXjWoVlERxMknLurg9LArk7bwf&d(Kx(r`V=h zmz@>i)myC~k+(D$77TVCQQEXx7j3HtSDzLq8jg7D8c6csbH@G-Im4m)*cJCQ8k+jM6al#Igi*pv z+@!bcqt}%GE9lm@APcVay5~pOx<_=w;p!jw`2|9#@QLU2@bnlL5pzI7Kk?ZY*?WQ$ ze^+bGCEXgB0*73dbI6eXskfBAcvUxU#u4$WilhS?FPsFL008b8JK>e@fKf-1_iHj& z=DmEg{Yo`yKqou_g*W^h{mO4Q%>uOidQRmcpsF6WvsxgDrcBiCZ|*+c+Qv;u(;-(c z|BXk#ug0vQ$FX#Ow)vWq_@dW7<2Zw4&Sq9$^qObAxx2fwYcn1m<9-bk0Fyh^cxfT7 zbf=})`{}r+^}C_g$dy+-^xuOXQ?B7YtGo9|zXkc6u$EXT9}+seqrDABjuencLTQr2 zz+2UA{BpP%QMfr84M*+hQ&c3V6X1ZhUv6v+Um??rxL7{ERekZ9s;0(H5RbHUVt0mxW{eyif|n*^hOlZM_Gm2vTLzBk>@&Qft}|}Iizt$ zvU>IQhG>}RW{gYj-f$;T%S497@VGDa0dTSe*K~nX$-S?qNGlxUTmfkL=AONA6aFmV zl<2;uH~N>7=^*jt@;QuU1k^$LyyTPP zmD60s_}_0s#e3U3`_-eZ z$6L4ruG-(JIG}a4wTbs0R*yG#H@-*D>)&oY!VRIfZ#>-EM;u|VdI;XIUcmvozqRr7 z(fV%nJ*x!Q1hiSm@+uz04+nD97G zK=0@T?`^}|%wC9UK~Pu`G$F!pnO^9yda${UK+AVnp6zV;R&U(>2L2gp5fJXEc0J%fb-$@D-Ua_xqqa{=Uy9B zf4n>yy@gkJ_`13aQ8ZfpTkoQ*co6&Exx9c96UN@-&|5xoT?gA^{8ZrsRJ|7?X0ZV! zXSg<|lX_1>XfX+J&p}yJ z1IJ7v_DfDUJzU?0A*O?Ch}6h%6}O^L>)uR69AZCkz6~wpOQ3k3(-V~Mn2$O>7?8S?)MP4??hsUQhD|kIXvhVz<#h=r?grR z1NWNu0L|4ozTvb)7|SR|Em!cuYv$0}ZxeT(?*N5ajS*LeO?{V~zwo#%1$S~}${S>z zk`Lc`jw-u9ilYhcr{0Bp`rT)U(a6r%um1w~S7+2aDVu%X&i;M?cTh^)i`B`|J=|J$-BJW zsciZ$WmEGRwyseWP*<$cm-!lf*|J7o=4+(Qn%3yce2uhW;~IULuaUNFSfelVHPUv? zYxHHlM%uJtjlRs+NZU27(U`;sdg!9YQ=+>quy!plPdx-Q8{#@KDP1qcy6*s( zYU0Y!CyIR2V&hyy`Zue?X))0J))ng|PCV%)`Eg23wCPA%0-%=@Q#HIw&~0io91SBD zxpp;)r1-2njm0h_C`Ln&_;yXHOJ7j?6MYXn{fVK)9ph3SAi5=UNdDxEqtfSA>a=fk>I4X zY(Yj`3R}(yF!7+eXZ$Tk`bU~Cr5O!K6m6C6On--zub=&z=a7|aB3CP2$-yc+7Apr5 zQoGJAs@}<(9{i~`e?s7mwPjGjir%K>kH@$4m=&jh9C#)-F^h=NID8fAKSJH>G3xNa zQE)s75y(7hBw?eVY&EX#&C#msvlwZmTjF|1D{idoB&`VNhA57XgW9J2)k!OvuOiTl z_4hNEDZ${N&{b_d2aruZMlj&UhF2k&!ng zGH7854by%T56n#5P?@c>lLzCKKlD!ejM#Vd0t-I`WfA&EN1KlkPD7MR^L{@H=Met5v%RpSL;M2gIzRKd{B$$&uzUseh>zQjj)0n;>IrA;xT!09 z9t!dkxPypUOa?s z45VofCm(SI;Xm-PSwF_WFyWSf`rVYE+J+EVS)GUMoDn$l$H@UC9|j3E3Mo>Dkd%i; zXgPY*A5V@N_s0?BI-r8nu2fhM*If%T-DAdRYvQ4sCiuF?D7xQ@KK-G0_l!Jrm*nIa z4bORCocaVec(hW^mDPNlJQ}3_N=ZfwCa!oZr$B_7gxCfAi{}K|&YA}2mmD$;NU4J? z#G`<@!X@Vl-vg|Z<6b(kFhB7^pio&`SvFo9$D>1-8j@TFor~f=rsfzm)SP7Om_m1J|+;i!inAA)#UaJXNqdQvHboVu)#;7C0tc>B~zt z2(II&iWKz8u!CpYJ5H@rsuy%)MOpao5HcrY8 zkXvP+aFmKq+S7!7V2?bNUF@D9x_BxW^(<$p>31c&3!T^VkY?N=w*yL;MDk}XiSTFM zuXo-9E_kV$daLq65byEoNC$|E000cXyz3No5GSEwIsQtk6U5MDTDg&te95!2jsR2;j&J56#+ z{aw)?u6@hXQ|Dj6_Xufo=iV2` zNRXN}L}y`LZXSLHtGd&$4)K*$1%U7LptR^K0@+FdSu$eu5Y)~7+KQ#g204R?Ne3-7 zUr1R|7K1c|M@lvSakVa?dqg>Jij{&RekvG|SS;_5La@@v*zj{t84(2aJWV1fjY!~0 zY_E_gkg$L+yu3Ly|UqU@=_0(93eFlN}DwzTivpHj>#rI+ymh1LZ!7vA(B z;Ygadr0k@S+rm>Vyd(u6hG4I*FLm;cpLIi4al z5(kQr{3GjODM3^NWThI}K~A>HcbZmt;l)+UF?vS|eCBXyV>dI+&cs#@hURCBuWvqv zDt5^Ti78uvx`fMBu`9thtu~#=Qu8$;3}`29Rl;^(?Dk&tenR8UL3ibE&kp|m?!9N9 ze44hwsasr0aPbH$_oz2`aq%+mIjPBkO2cQ%H~-=8@-iYh*7Gl@Yh2yQe)#6ry?^Nc z1Qjsi%Zr*JmV)Dg-yQ8de7Lu{f3&gwWdG^zWa4 zmXZcONUa$BTU+sD0TcqKFzM{mLL-lwBpb879Ex@Da2#mjn`|mXE<*TXZ*=Z38m*=U z>rFHulSBpLb7Da&)MI{DD+bnB%uC?b_lr7ozw=&LjxO{aeuY()ZW;EYT$`Wxr>s_H z0rCLTZ7#tKJlws5vysJLD!)W0S-JOW_{tR%Z(NjOW8x{VKBZqfP=Q{6D(lbsI(u@W z3AP!)so8k!cN#j9%`p#&M1W;|n^!Z+NT2y7?QEG>L2?t;wB8Hw*W5|Keq6z6u+X}j zX5Kxdl_U>`>I$|a_JCx&--g%VvzxWWGT9@#4b&QMd%(uzdgMsZ*Xi1juXj83lpQX3 z(oe9(oNO?2J2_jel3q{{j!cKsH~!ZYjYis{|b_FY(yT)YYaNW&JfzK?st z<*>cdd<+%_gIeoes?>BV-i+(=lJDky;{sRzl_Ev&O|>nMK_Y2VBSF(6u+e%tWdrt5 zsoq*gZXAhTSXL>x#a;IGvrlh*4Y%1>_;>lMpOe87aRi)qT}on0K2Z=+eB zN@xN=wks613r-G#+jq!WYo@nlz zzQC?@p~W^$f=wu1>ajlzsZYqSPmCEI0&=k!BQn~~^VvqCXH%2)XC8^^Kb+O{(~?wX z!(Uctii|0lgN2u;=)6Y0pxWCcTkyhW%u$ZXX>C7j%(4B?A8~2*(7{*2!=J)f|Re3ITtwC`%&p)loXpEhDpgow`D6%M8@!R|7{fks6Q+FR8s zl$ycKI6-1Q0O)3l_P5kep_KZf1+zr`I|HS8)e@$#-1!ewgB;vi`VV>-Yyjb+sGS|b zaZtSHRhIQjgGm1&L8QU6cXEM_meX9VI=|dHJgh!p-!~5tRvOTp6(Xy5eV9c_hz(-J zM2r;ItG@XLMn(eF^lMLYV3(T7>-e;FXpZj?Ostx`wc1X9O9+2~3t-iIKk1n)zEPiM zWP|zwnIJ#a$f!mf)u$>)CCntRMC6f7hy~q()m>0o?fr5DA+1^~%ph@uuua?m@so_z zu%pW{nr5rMho(6TM1mGts@y75a)$HPv8fF=)ui_;^MN> zfCAIxabMAa^d6U4;AvS}c{bJqDe_qfvOc-tt2i~$s_FU7CTF+}7adL9F4j1_V@a{o zTTT~* z1Ro_R`{aIAYgX5{P&!@6s#(bS=fgL38`K0dCP%FG#(K&r;4oC>0$dGXAUXye8$k>q z1zep=+Aq})QBwp;Hzc4pI_%i8_FD3=?19tIpa8Pn;$>aF5=2q*30tC`vJd__qEm(EV>0ySA}E)a^ytk(%+V>G&BNZwa1CB*|jNtOP1OTt>Zpfxt;?qH#%iPM9)*$m?Gee#aD z(_2_{Y(P~!ev34l;^vBpH!X9}VJ0F3>zyE^gf#_WdXvw$shJmtv23-08W{mbeP3lVg1+pu6^Rm9lMtD52#5U7kGgK4zZKN__1!cOh^eE z4KK8)O~}~PsXs@p)?~%zV0{hiUM-Qjg zR!#!Lcwd+?ZaD`=3O>uC!FCUXsO?TEYIc?)cfuyIeiZ@M=lhy{B5mftK=L+t1j8{Z zxTYfo=U6A(p=@@zu~B!!_@Ki)Jt?V;3>yi}P`7D=K?VBdITfMoTc>QqVPwqeO+fc*SOOdMFIW&~I9uf=a%= zozqeTCt65LC*ah;Ra*0emO$s}_8+%*e%Q9~PcmbHj!Rd+qE0$H=p>Ch&vYp};*m}s zB)vqih>n)*m8VmLJV#kf4*|Hl2%Pj5JT~xY7-jDVwf;Qk@HW(-@vA2_{s(qG-bCL>zGPV`l z?AjkF|4}-hbcF!TU!Xj>`Pz~e6NfMcssrWRw8ltT{(#%b@>c?b;DARx80I`BU2>1& zAvj19ut|CI@?mTWM}_VkIjl#vkKhQlcK)*r9)%#pN7XiJ(Eam_o2 zhvQEUa8(|Hq|f+SPROz7V$vVb_P~rN-P?c?T0kg(e26PH)cX`+kawgBxFq75XwqSv zySasx=(%Fqc4Uh@p#HkhqG>I>kCqa)!O`7rwAPh=-f7}5%Zq=e+%_s7z-q$RKD zpZ9$|#N-EAbb)K4wJNeYMCv(Y+br$pzW1bkoCFn08g?? zL~!t!25#&8MlV+^766+{VM(7F1Xt2hs>jVvL-w|Ngo35gN;;;=2tn+<9Uy$v2R+2O zySlk@PcFDxk9u&VQOi0`-U@i);^@Xt2ig{05@@<)Eh2etx{D05%o3(zU=?7Y2zmD8 zsgyDzZ_0jNKkIjKB`&la3{gs|tYs#D(D-HV>{T7yCwkRn@8o+tHu2{KsjXFUa{7;$ zQG!Y*vkiaW>t1Z3K)&psoY;K_5x)NTd--|!Rv?-WMOCIPs^Tjr+&oU&Ix82ba_#3eIk-*moGW?laUz&l$?*{dscT8>|p32h$7Lk`^uSLiE;h zN&lS~N;nbi?0IhvwWt|+P(|!4f(_s7KKM{P=)YqaBGz%)Q0Biq#8m>g@*+G4dv9`P z(qE9T#Og-J$W~gFbd@m7sg@cBO?Z zA};YjPe#>z3M#piZqYOyMQ0>#CT*GyCJJz}ib=C9fm-^H z!6tspLC7ax5-ARf%GzUqUy51|lC*x3bp37D47|AT=gBT6 zqDXazeZK&N9o`1Q;o;TFbEVb_Uy3G(Hc@ zbn(8_8y_4B|N8jRd(J5Q*YmUJ)q76~h2^r{WnI}{PmJqN0E0@|vf!M)I^~=rB()i9 zuW`QCZz9>_Y+W3II9vu19SyrZw3?56V}aIWc2Eiy@;$uAs-ve z67ci40FBh2SieAZfaf^uvP_k~h|g_9^~+L_CcI58Xp#3VvX(*+jXfCApTkP28wk@-lhay$Xu+91Pr*d=p?H$xmVg&sV>!=7rI%doW_7N9M5dlSc$wnVaa)wrqJ z@uE>8iQrE_PSPsF5Li?2vJ3HKI8UJ6haI%d%UiQF7d?}X|5hv>U<5C;?b23Li&EC* z&FaH3{5xR|5*^NZvKQKMJS)^is5!fHHs|6Lf4Nk65CmW3lPN|TLeI&z50+;ph9Z*z zdZUCB)PWLB=#IaAyWf2w+d31!NG-eQoiBfu;%s{EydJIKFrnGqr%5lFW4}FoAa2@3 zMR^a3%xE~gfJWG+!i?XZpAH9avyDRQcfJ%|8?5BZ&RMbHJeylKPK`U0Elx3d$f+%P zk+9VkAUsPK)K$U}`-@b{uA-oipO!-R=q0jjquxnO+nZ##PMMPHtTW$B;S6Xvnlh`L z3nIZJ_sqn3i|ZpiFA?kvjq_|;W$BdsJ@yd0jz|o`DxJQN#D@9FOsO-R)xem@LI@l{ z2rSF`3_IH=k@AWN8xinP0)OE^ZCU>?-$@h@8)Y;=QftS^wyzZB zz9SC6<6YB4!9`p{he(Y&a%MaJ*NQ}p3gr(ck!+vhrYZOhQDB}`C0}(}X&xyCC(P62 zUy(o+V*P+KHG=5Jq2-C{=F$Z}Lq!X}qN0^V1fR&$GQ%j!&Ai>pJpqoLA%hcT?ZVem zY$n4NvMj>0a&P!%&>K0fVR#8p>>Z(KV!@!6nlLpBzs92MNEhZ9ka-2tat4|DzQj#i zqD5V|Kn|)VYO*L4Z3#$5)zqYo^bF@O-NEDT>mJmC;5|~nYjNRLN9pYLW8(LAaTg`& zuV5-_p6&!y$VG0Z3t4_GUMp2UDrU3={IzDAul@b>99h;)dWx*cu@)v$LWCYAbe}^N z4hUV*mu}V#4-llzq&D*!J5EY>Kt<1ymOK#5<$aU>G}aKjIyn{-H5vq(Y_b%ad7paR zZIXEcxyci8;}TN+m7B)#7lQ`o0JGywa+*3@Zpdf$3DaebIRoP(=1Wd`{ooLV^^Q=g zQ=;q5eYw^8jGdN<@$tT?4q6`ZwS%kzb>y6m1L2eQrN$+_QNzmVbSLZ~dpE-|B?Mhw z#8g9{P1N9^B}=aiihZ?M3az}WP%0PVT)E!+Ti{wM_cMg2y9ByH5<)PZ)p}4e!MEMV zLMO3aeh|+;?}a0i2si$mh8pQzNN!GGA2sr7Wnakc)gzkd)y`pFKF9E`+sI~2$7azp zj*vhtw07kPV{k|xVy2^>$w-Z-sYI)2s&*Xp3aOCO4>(+La5d?+c5HRluEPP>tW$BlfWtO~n39X7<-(|`1-l8PmBLmR zMCI-*7ER_fvj}IW;?Q2n0BlG_0H!P zjow=nk^Cioi=P@q=ZBM!zurm6^=P-xnR!*XTITHKp;(JJBw1eeI%j`8&Wq0UpE>(z zFb@~+=|PC(F5cIUC_o|8ji$?cPIcoDE>3V6I=+chW_ATOcJjYt@jNnrImh)8uexcr zsd!3Z`J*W;Je+axBCE|k)vsxD22N=`h7~fnI9=|bth-!8e6Kn%5wTW%Jbrffj{i<0 zT|MIJy8)?EY^he(GK*BxZPq_+EP&E{^~Tc0@S=P6L;plBh%8-)^6*G*&nT<^WRIX+ z%ua+ElUQ4WVlOvJWLVyYPbIjdD8!Z+3Pdp?hd6~lxnul_PLjw2_f$MN6_jX>)v2nx zyuA9}$K$(qByhLCj_Y2fG2X}NfikYW7BF4LCU^7MT1K(H*qa8>oDgBC@gq|gr z?XqFispF@VIn|4+WgJvoiHdK8Y_dmSt|l0cyJyFjXWfh5eqh?r+;jqC)OOML(;S1P zu~nYQ$U<3|@5{oC0`o0Ot(A|*@Qj2lTr{P-3rrH65>{c5bSrp?EHdlgn4;k`m0MSE z^qI4RTEvPYB5|3dQINUBKwS{{C^=KCbJ+h{++XR+eBZ%Gf(?^T(^*jQtG}Jb9TIhD z*}XiK>@9@s&Uh32$*n{+BAs=99gz|(ggFAgiOmxGnIjP(Y;SDasrEimZ)Y=PnVcu2 z8;vSN_xL432u0&{KM`RWS1#;Jeweef!}IP>I0qd-1q-;Yz3KqSRE&`)`!+II;pgqM zsZT)8DofZ?Hhd(*fP=M!>;emO)rGu{e>KiQRVsmyZ5Bp%GSG?D3(9hXVkiixmpI>% z7Ws00i>FjmNh0UGPNLq% zX8t$J@%yV5#{0B(8P)3SJ#=$T6dNglLr2V~D7XUKzu`IQ?DW5jnoH&#DM zWV&P~dN;a*6D44;f~d#iBRzVCa?$Fvdp7PRTs1bEei>I7@S=xnLsn84}0JTN=grQ@&NWFy>^kLuz6B} z@prrZB9VUF@a5b_-8V-UaA0$4q@eihwz`~A#EST_$rr)Xx(4?={2sL<-ZhpM-PA`%EWelf#c?LDOliDSDD;p9l zOd(1lJ8JZEay>e{(gOyy@EpdPA_WWb$R~ifsiuDOopkeyi0@Y5BT&uL2w|pDpbP(S z0x6cVwhT8}mP-`3>cD8~S#{uM`S{sn7_B?sono{mqGGm=m){)fB9;3Qx(n*T@V8x?!7HS$gqDx8f3%FUJ6=Y|Y z&s!+DiF9k6DhQ0IoUPaK4T7q8UGq&yl8E?1gR9eQJIiR42t;5Fz)5fw02rq&=r5STuX$m?@XvuUICl1?%#U$DOmxkX+8p-M8 z6#AxlvYS~PTH1Ym;mJg2w-_Io>ePBJeQm9*6$teKTRmAFoF9fRm#b`?75{3q)nH6$ z%Z9d{DyRnHQ7FblB(*b*=bQcK6v;MDiq6G48}rXwncIW!v3tFJ$$AhyWgEXrQgh1qMFq20C1By*N#wPNKLnc2j2je7!vG}24v>DR~a%Po$-hXGm(qvR-jiQM8pB(aydxH`Ms3 z9Uvx(bj3vFjBIj=RxmbKn&gHW%W_*yvR8#lZ9k>@v}hpKyyQ`#Ye@h(#PQEFp8do* z7pOJi9cF}7$%c#+?J3rTP@VGC4s@$mkjFYO}^Xk0+ z6O>ID9n#bu=C>FG;s>+F(NGvlNqV8Z*ot2wDBcqx|#SC17{yrdyw$9wnL zYs03NZ0$JEqQ3776ADAb14rgxT(kUJ{M`)&%qI9KJBRqguE4)c2+A*gRC2@5ykz|7 z>GtN{#`=@Z2S;<1}A|_Rj#u5mg zeK*m86%zSlj;_rzQCu2CeB38#^T2&&*9iY?0-JRAUO?9ouOxY42n~Apdx6RDQ{XUe zw)n|~iBTa^^&|^NzurRH@E4$3yN0!G!-ywM-D2D;W_3>9D#63in0aVB$L-hVjS~}3 zz|E4IVk4Q@`$8D{xugvET5hh~#5Dc%BtF75ydu9*ht*k-cj<$lW zYug11qilkB3Kc#Bq-HRG8^c|fMUsr9c0xfa!cn}@#G{0Q7h(H3Vty@1IX+hLYhXv9 z$QG;y+@~;?d|I`1U8vCswewy7!vF^u;90$M(uhr*eJ6;>IYQiV>@&%7qa>~+z9oc~ zEKKafcWvAPI@*U4?*AQ2xQAQU4z~s%!2XFx=EH-<&!%~oi}&;(#P}EQYsXH^!3|x_ z%y6`pP3x_Z@8#w?Tx%y+gjC08-SIfNJ+h)1C}q*db8vb0lfY3JKTf!iQZD$>`Nvkm z>_VZX;RW3EGy&BSp!{Vz=SXpv*ok;CfBm~Dg;~D~EZdwwIvsG`Y+{`I_)Y(U+05$h zC{(p$1Yhuq-QBr}ik-wAeN(LkAY~2k9|P7=C+~P`q&x~3tsz}@@*JtzKjtFny-Y!O z;B*tvw!bOxBQu(A3bFm)e;S3YcI5=D{ofz(BuD2;pp&-q0&Y%~`cT(%dtRH&jb}hR zJIXd-kzc%hWkJKfUZH0@oY7ofq<07x!jZ@ZpKTW0R1Hx7oABZvMkwA*7p%B_>3UTz z*W%k#zeaEkEAt7SKe><-9O$HXJRHHvePYku`R9Tmxc|iWP5*;AyyKhHZ8hgs`e@NJ<%WLm>cl`%b+iOdu;@Pf(&e(cz z+|*Xhw0&K+pT#rVvL->j2#eD!L1v$EgVc(Lc$pmT%ZLolZ&k-&^9o_TyB$;l|J;V1qH`Jft!>FWvb@6wu>GK

K3&3%L~NbX`{Cr>&=}h&&+9y z2cna}Wc3Yd2izSD2fcfpTWECi&yu`eZ|<8=l9y<}yc+dh#Mt(o!^80>2Zx8F!^6Qd ze!c_yPfz7cs*b}EbwH`tiLaecs;x0{CH{KZAN5XHKqH5|sP^1>+Z%Ua^>hY9g&%q6 zp%)3fHFdE*8g<`FI$8VsV8+Ytvmcd1$xG~G9 zZBN*ETo}A-q)37riZ5RJUx4!4dXb%0qx*HKGpm6=r&{kJi&|p)wbLzjkHqb2d&s+L zsyjQeJFh@e!jx4kY2Amj?;{5klwvP0BW$e9{k`p?sCzBOv|~S4+m^+Sl5N5?LudTV zqwz9VCn3-zL>Zd!xavLJBw22xGzpVJpbBp|3!-D4e=)2SnMR*V7iZz zST9@fFKcCAGG69DMp@9nP8FRT#e>(e-P2HHtmviDfD|yy8MasMqZd8YVN1u}3rjF_C4}2CVIA{>1`6b;4!YE!M+YcN$gTFX+U$T#kE~qvplvdloa=aC5PTrov`&Y6C$3#4piPbI-8c^$%+57}0&o^UOf{GMSU&l!p9>Zl8kVixC!#yd z9E@|D;C-BB%g{TWQ15*53E8h$Gcs+xO_Q8$4UdwwBh!g|rN)99hsyv8Cp^f_AhyKD zK043O)EcYeD%fdA-CJ6rr{K;6!Z>t1iuFl#@aK=me}1<74gYgjTcpvv+nFHfP_UrW7ui`ZQ>c)+^GABb` z>2)WZ#*TL{2N(VGUicy0iXebP$B+YsEQw⋘A8%gXvcyl@$ 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 t);q_p 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

Y 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 ^2t(p_EOv| zgQ-c2kEyJCNnJ1?cvbqvnuzc!lE(?>`P$dUDjV$6G)Q1lK^% z9f85MZuR|60vdu`43WBG;yxty{!ErAZwQcjfzSpa+jz>GBhkBr>llP{GzH=4D1S3| z*6@2lja4Wqf8!sm-{CawQX<*S*< zwS15bF^w=%bRiAb6F-@)!rgGJ*h4Ldyq(>3uU)}+hMXu;@pN8~k|d=guT2R%;lOEW zdu`(9K{<~NfRgYy&NB-k>z%Z=fm75Z5U15&)`iO1Y^omF%KfcAPEHKoO_t>s5D#bK zoo^r+JBkvGy{iUocrYrOo)Dq8t%8}AJ8lmR^t)f^4T!zWP+tvE>WqdxiOu zl$8*^c;Z>X6Cx|{JE<;j1eFnZfJBmf0NoaOq~JGhX!19A;NVx{KJ}~I5sIH){cGko zhUxJOF_?Nu&eHP+@ta+*yXus`W@j`99)HZfd)90>-ZbknaQ0Vs<0@bNV+O1sXVJAe7sVLeVhG?ud-32Ikd-sbkct5GT_G#Zf`@lWMr9Pq-&!a;icwS1Vr!=aZC2!FX93_eu=gbd(=P_z_g@!(#(MSaBE)X;ki z_YGQHNs14DM6WjawGbh86hc!x3gN-8g`wlO*7X zzb$#S9fi~Gb@pZd`)aSB;@+dg{Iv_{&QQxM4ka+O<(^Rg4WCT1zm|Y@9L~GfMI&W? zyltS<>nYB{(&4g?lni=0jV}8iipItZCg0~di=@JQL95F(|39^^exGT{DrbQ_cfkCY7hT3ebOYUGgpk%--vuDRFdZuL9c=xiyrGG0KM$wiX z!vDVH^|$@#CVTS5-n#FUH@N zyt&q1nh?MaZ-Uv{(_N=fehXAgX=8i4=s}(N zW&YIuh<0)@|8sEDKHJ}~x7z?Oc82(q*3LTLpYNYEJB{X9F-qjAdaHFp+~xyyP(SL_ z&R^FK;Do_Lv3JCut^VS5g2J*A~8Vo z;^$Va`GzR?H&9s)aAx(-^YK{k9G@Q68eIDGeB%3|{_}ag{$~&>cjI|J z7UiMlNxj+OGxlt}}lJ>R`d|fv+Qy@{9Z(XxCeB>#g(GXXM2f`RG4A zI(yS-p5wW8-*oI zpEYZ5Arfk@W#_-l-y~oWD{uaM4i0U!K*U7Sm-%~iTsu9-{y->_`M%6&mqru(d3sdu z;25qM+3;ol2Gz+ot@ZG z4kZmo%HNp!;lWYkxY23ViEx1|e_!g5m1kH09^+{F+X0jwVJk#*;i<3kx4}Hsh7?3V zinQ=m{vODKpuk#-tol{{9@LLd!67(0_((qP+wEBJeU*=RK0<_n;~R%ER6ge0#1ao5 z(55?(zslbMBeV|dwa!_qo+8n&^7rH9v;%?Drc!bU#fdxjRsM#2-|3t>A^cVTet05; zOn=s?arE=f$q)4=Y5!IJ2H7(OB3bwlBEX#gukts_jeMl1(5w8dYM;G6IN1lQKfWl^Pcs@uNUa?kNd>PA~m?Wf-Uq$wknwyBFY(-K-XU!)a$1lHGks_1R8`RB{iCm zb=*HM;#Dv(rr z=FNcVH1p|rfau|HygaB$!@E5*nqIg@6f5B#>xyrE5^djWT;S%L}G~x~@E%Yz@jDuq_PjxG> z8#mYe?lp7G(B5Kvqdx~j-os~-g=AJqW||5V*jC&!qno=E90DcLa5DdB;grX<%o0K4 zOHfJFdm7*pH{7??mw-Gb4RGsx7g6hQ`jL%xqTm;H?wief;_tyiNMw^}I_m=t9o}2~ z4({TaqurQXQzrL!$&Y4}m|oNeyA$$=9-Qg_IRHY(>HgZ z4s!U%lEJ4Nt#55}$unUhOJ>p5W1Dn`l`Cxt_w|hP&KsnEb0=BS(*$zOTK7ee>pZqlpw+ zm+^ZUVuMQA-KHxb09?THBe=11c;0&v+;BAp`&J zmzP)pq}VSTN)})$e<2n-z5a}x4Owe5}zGn!?)W8RBbeR&Q^3}7aZpA(|S$xT%DSLx61RngwAjBc+Ni}Y3?y>Db ziiD;vJpVw;A%|Sq{Z1^3}Bl&vA>Okk&N9eV~xpc2>=9 z4!EHo8O1bICgK{%MY4$sbvJ&ng^#-!4|wB>pYMDXY;R|tfAz{xih2AiIk__1W3qjA zMDtMP1p9KKvE#(f2&?5#Em6b6+HQ$OJPu-)Rd25C#Q6v@MfCwMeGG1x*bj>K&ikF< zCxnKON4+2k&lP1?5t8yCt5swe4GJjNPfr7PVJrsY`2$^qz*q$&mtiMZ;m$DpaNh3? zqI0$gLTybqk5gY25@h&6*cEAmSQki+m{=gEa60&?bTxurq`B^*0b3o)|F(ekqDvivN<~qb@!T5VeLEu5LDlpykm>+(@(X7=c&xDN4#uo# zKyQ>W^j?JB(A9M(*yn|+i-}7{)G4D6=$j~)u3lnQK@>urB*{il-Bd|!S$7@oE*rnI z$VJ1Y?mMJL#aaZ$+x>!h>off1eINYy7ZBC~Odwvs?DU-I1C(1m!I11nWd)aRg1ocm zgEz>TvBIAWWdX{B!ao;H1CI zVkrxz5=2s8Rb_ShD}Zd3%hcu;flVdXSJ*#2jsXE+rT@v{_+TugPi@d15Ilyt-IOj) zwyt*1>C|r_ZcJY()9q6me+Fo%8#<5x%_oG&V;M_|gve;w7EPZPrbDD29R07o1;uJsyy)Cj#2}We!!8x7LA)0v=AEDw z!ho6uE^~#IhOnyLIYhWodZh{@k7(fmXXYG~@`tKs#xB&Ev?rseq z_0H3PlU=n>r;ZF+zf%zmD54m{dq!+4k8zb=56Rbt zx`Bu8w0{9e?Rz>9%+9<4EScl1gP?*xmwpB@A&f`}wn&nYPhb@74KT!|AEUYDS$9Sc z`ycR(qB#cIgfVU*jAZGNgY!P*V?s1$+n1Cb)-YHdK^fcUP6VZxRr-&2RprTQnb-(c zOBA>9^TTc1(o7$Ay9hqgw*tIC%^AWpQnuJ?9qw-m zNV4=@$>lz*n1^~)JZp5>hL^BJ+1Je*1sSi`~UHga0c7yw83 z99|3?Y?5;}txk2Il_tFQ8u(+O2$resptzhLcHffTh8Rqo`_yJV?N3b(1Ez&G?GQ~o zqyk8BVOL;W(-csWp~DaS2fo$!h;zmGiQHD$#?m8=fFtZ6n;{kg`#dNtGKkK|kCVm4 zpx+HP73+y{B7)E=4q6JA#8UG7{;x|1%n9Y#;)40waxldFqGmKNeQ>iX3M`jtS$G( zlKxdHu0wRn9#2AqK!TyEM28r~<5)MsHWDU*!M8xx)NDrk-ah5y!XLVcbQj>wD%#00 zC0s8NdQuP4X+{I~g8-VDlf#x66Oc}S4l5B&ff&L@CoKN#&k)Cnj3F9q{qpaZ=!A8B zZhYJ2-agt)0)P^y+-!aOP4Fd}byyWk2+gs!9TkW&5i3PV)I$=22buSg z!5<({qI_K>t-x#+`-5glG(s9nmq+7b8ea4VNGXFbkhm$W64>7`&~73~KKz%vG(^Ol zp?U<6kU}x)8ZASCa4yf}e$S^HFBxy*mfWH?E3| z`;3H(O;4i6Ho-YcZm=FY5?3^O-=B_0hP zNy`)UT0)kBCZ-?J506JW=!fJ25BOB_GpUWi%IID*w}es*B74NcJw7xfyNEBTn6Uy= zZomk8J>;X}$bpZNVq0~$c^?Go>to4&CIn&<(F6&)+BjzW2FgNwTDU2ce6z9agzAXPX+|j)llw>r!!peh5>78UX?)&Gxe19}2po>uM zv9J-~-E?cg*BiHE9Tp1GU?`SLH^2~)zuuB9fMz7OE(iWLggvIjfh<@?UyM@5DyU2P zQ&rxtd(C0CFONGPU>g9sb=EsQU^Aqe~@#X7awY}^%bmLN>Y(?ZUaw7v3n z%KK=MnxH_v@)y*g-3}6u8~hL??|biKM$jdOE_*Pq(?Z$vmQRZ&D3(ngmZB}W-`Fj- zlv#{0^=$ZD7_`sd6#}pjXvlNs;K&&l%LB5-Y?TDe=GWEs$0&i0P7-)YI*cvvCmwmg zZOcW0H+i*fsLf&~@Tgz5gA|{&Yfh)*_mIVK+IZ3{oT%-^fEaD4VnswDEVOG9Tw}Zw z>Uc?thT@aA17(D49nhuA(k6vd99{9DW=8V`U5qd}L4(%o+Wz?gYRggVesr>5I|^`f zwpx2RvY>2Qdd(n{2R3VeE84l*362hGr#4Q@0X<(#7J&MnwW1aOON2{tIUI&3iRIj1*f z;cS2-p1$m)uH!2yP<}I`>54MrfmXF)V(y@sQKsSW$HjOa9>4aXLbf-niBRbC5grWu zoCGa9N<o=XQ-`Jfouh6slWZF;V9QvUM<|37B_u8oh-Mlso~ z9!$klsG}+!sty;s(!pH+`Cp}^*#d4^U>6#~M0Pe$8L6&==eZAFA{7=gP4dVPf|Y+I zR9K=>HybNlmf*c>UrMPqliC1_UgctV4fm`HH%cNhyuC!-6JF6>a z1D#0jpD$R0N>fsZjt)Q=04PdTSG1iV5C?Ab0fib)4W z@I%Ug>5Lil2OcdTmO&Bpx=H9oQzgut0s0AFvRJPthIb*k6v$W~m{l{Mfp8oB?sHfV zSchBmJy*1^=K~6`9ELr(iW!hAFPH!EnZ$Fv`iZ2>rTJ^9Ucj#K2!|_-pFP;TkA=rr z;+d4$XjYC*W`Ebcy^Nx8*O%=f@4a7)M;@nV#1C>eb+zAQRhCi)JfxQ&6=b6;6o!b( zu>FT;Fk#F3$^>J8nA7toQF|#A^>jdhPyQhY@#01Spd%+s~Lo#GI5!V14pKQVH z_Y2bF#r+rilT2PB8QRDc`S|?ArYqT%^tJDWR6Es z-7fX%aW^Qw!k^+HO;}jVO>RQ?(PgV)Pg^KRyru*S9ug>K6S&jR5{KbjrtZBLTR0w( z>IN&!p}4)%pa}{NP^V1$TkZGsX%qxCf4(7Z=Cf<-U!t!P|8dBoLRy1`u8jn+&`?bA z`FISo92TrVOBjuH|Aa4d0(%}BTbRK)X}_Xw1eOc21VT%Orl|a5hLtV-O2P15a>L%E znRo79HFi(jO0v5|M6;(MW|8uGiMq$mY&HX*1;`pIpL~Q1IPN%kPEM3Vb83my74A5T zEYW0Mq1Y*oFJNi*XfK*p_b4;*_qak-Ham+{(!JjCSuSdQTYcVPLn4(jFEW10g&=4kf{%*`~$3rvioBt{R1V$uP)#jM%*Y2lQH zn-tBLP&9M_530oEFbYRR7Yu1@gq99qe19;L_UM2^oI}8YO9wt!@}MlwF|^2|Km&kW zszn0RQCxjoBdrKO*A5o+B!_vJT&JLx)=mHm&uw!`pL}r78bj{Tw*yupDA1Q0HF5;lYr+EAYB9c>3BW|u(oi^ zjzyPvuYakD+$kE!(!CMKLjE#AUmJ(Sqe-qYr_-K9${s*&mo=$CnfN^=U5FCgo*gD& zz~^ERv5GK7k*Bz{)z;5O>aAU3&ouL-!;fK8GNMJ%MIuTEu^z z;Qt%}J(bu-g>))GEwFcDG&JDRsYn!BCrG@Ql#X~TkJIQBksMePC(~4G(6TAWlpIss zDQsT0W2E-`dai8JKvNdOD)z}Bz?Yb07gECHs7luyJpp27$n0!t#vpi&HZj@(607Gq zY|2Vaw80+e?sSRArf?Yt@1kfDL&YH=Bcc%PdzdpsR)U^K)S&AKzXH%euQv44=kOFd z!(E~oAow3mVB+#sbc56k@#q5_nS2w{f$GS`lnK+&OmNUk_ecN&zSo;mbSFk^>EMn5D|y#sN|yaK)NG9-gorfK0MFIIBNK;yC+*${sMm8l=}_ zk_zM;T*f{QGsiS}5j^G*59ZK44z?J)8;t`K26TdsJ#~zxBQy9Aav(jm5qxD6h6KSG zERq;qHo2pL6br@);|+7J#q)5RNZ2_Va}0o|He5vW8-|t;DrL|TEf1$-l-$Mxir~?c zNfpvtteWf8Z|D!DwSZARj}S zYel_9w-R)38}*;s3gDMHWAfY&=E!5gLU|QmuyxpJR{<4|>8Ss@%B+=~tW$>v$eZs> z+!WfS_jT+PD@>X})JDCmrOuk$X7?gpa?p4%+#NIsZs!1&QA%=~N%!k?z&w-1~L{WjFV~Sj@#IUX$?^2pspsmYh($>cai?X zB$D-6XbSZe3Z*nzZX6`C$c(^9Wu2J}CLd>1mNo{^%6RB+;7A>5BO0SBThL~DxZ;q7 zCC0~-`6)6AY^OdtMQ6s4@70kd3XZXmSW>5@Lm7CkrsKt=-`j}O@MHBEzA*R_uCylz zTwtiWb@n_$GrsfJv78q_IWV|3c(m&y9+}=iaUgnwdCW(u52k1g-muEldwUQ=wNdW~ z2(m?QhWS$o9m(fA%*3nq0xB*m4?Zs#_D-=iU(-RKi)cF*fu5G5s||t^cr~aM5T7iL zjvvlo@!rr-@3Q+?4wVGvP3+3#eI?p06D(Fi{N^j9#|oxPcoVktS{av z?kqeEg%xu(F_3)nj2lTQPufH?Rrp!Gic)wKC*RoCu28SRy2fRpo5e$dR<*5?gF1UsN;QV%gd}vfV3YWx2vi#ka*kgViUNDuRg|xvuROCG;BTwQzI$`+Kbs6mhUKAB zE{3yI!t#8#KidX-L%4?9sIuRlk5Qq$Jz*$zNS9T2n^cL@ZyWD#^W4Yd;b{Bivu)#l z*?s=()vH&#Fa7-rcyR_Ax1+}mv{cDh+CzK!D$d!Jh?vWmX5-+sLT{t-06npTvu5MZ#)D*? zahC`c2Iy@B>-qV={qfoMv*-9<=h?G8`JZ*1aX^cY00RbW)fscFx_*3E zg+(v>Q^;Gd^NJbNZ@Xy~B7`p3DFvF4-U%hnO&3j61{E9YGtng0e77XuCAEV)RWw-_ zv`J^#hL=t5rV`70mbKBu7*ch>X27Ig@kqM#@IS;c(^Br;GNPffG1Nf1&J*Qj}C;WQowX;F{yp&qyk0 zvg}2*eWk5?9np~`s5Eadw08xLd7o9eGy;n@a=d&AaG5uFFr@MkKo4dy$cB-A&mIIB zl;J#qX0FMWTl%<65e}r$7I;#UgAn`1l_)q-bV5eSWR^4n;LbA#%^Ww!ERSF`k6RkS zc0zVu`E?NNK~M$3Ot8TgKC>AC7t(OVHopeS?cHavv#eq=%fYm?jPu--@^>ZI~MUIUw|xZ-8gTM(nIy zpOov9lIMjz##I$rpOh}I49eO1q`YfM={mATEg+rHft(5$hIc+GX^-M!KR>*_#8K(8 zy?+l@CHkmr_}z+~LV(Di>x#{i74`p1HnBt-BnAfC+qa^zQ?M}BhN_rhYeSW`@Y+yS zZ$l+dz}iqnmZ0B@^w=U@v=jWZz-`a$ZTVy1{eZ@iyc;h^y)ibud zkHLx7z?tACz1K_``72zxG7i$*NBDohWIbq{>U_n(WIVs7BXM3eU5Sqr4d?~;LljrZ zYdXeav@JP%Om0LmhH;#;+$_-{-3OKGF7onNtLGfo#t$qPM%zQymW7C;!yh1#(z{&3 z%0s%K*UCco+TSMb+wH;gwO3p4#D6`}PiwEXLBxH+2EUTB@REjVzt-&r*{1zA6sZs7EQgmz#w2IQQsbp!u&TdquCtsAU$1EX%QBi@p% zCU=eeQ$@Vjxdcc&>2RQLQ69!tl z(pKn7V+VJuE?3TsJd;X4B!^AW{d&BZAvu_36>xl6zVLX#`)G3xe`U5{&ob#(rs>fD zTY8gA`3k&wa#yO)*y1|a_)NGX$Mj?+V6ynMwB+*$Tbc9xn(bD`cBXV~*@WaXsY#wW zCPQzMR2HsJwJYK~DM8er>bmF%#hz3p{L<^sN;s@}cx61S73_B|H)@Q~KVBOCu)Y8x z9{X1)Ip$jzA>&9$T1Lx;!94WE_bM4%2A6P?>EeYf?`wdA6mIktLD~hC-C6%?6l@_A z9Q_~PN4qu+{jpSr^8s~enHUq&;B_rIa8@ifFr6khPzN9_CzBK4DjilKGKmx+xMV(z zKW8ExMA|$2lhjMf!aoyrWi63bCXozZSZ!We8@IGAlf~`Y5aCLv{-6gg)8xre>RJ$W zwhDd_U&}3#44?55@#6p@QW`Kf4r~XLL=-ylqAKLUk-44wwZh;%;(c6EU7EM1@(vw- z9Y7o5_XCq15}Y9SRx8;&=!!!W?&@(MreYtSxO3qooL@_)&mtUpAZS}$L_1NW&xW(o z&H|lkugBAQ7yYlfv%e&u+5T3VhR7t3x4(@(M0gI3tA44ZS1z^Fe&e8EXJ-eU;kh#2 zc4W!Ku2qsP66-~UIxU!uQ@n#~1W|>A;#gFliJM1{As-Jxuu-sKaXp)CV6u$HHcs;_ zD!b?QW_WKF@8jo6nczNY{L~mxhCGe8v?rLl@7K@CVDNb(GMtbb^Fd`#CNSpAA z1xGAJdp8>2jGUz;on}-^A=SG)QkzDa*gPYIju*HzEo$I~V_B8=i1+bx-D($&mW?Lb zO859wJIyg=S-UeL))IGIZ!<&pmYbNGXt(|&8$14k{n_oWQ*9JlgaQg3Z6q#-rM-Hl3n+j{U)=3tU3rR8x_d{0lvt7lS!&YhX`E z5W+RO5IuHflkgAY0f@ts`Qj)+;F=8&e(C^BqA$hDYn;!p9U{;^VCOmo%c^}vG@dPZoDjgd1 zfvs09WfL0%X(Ak2N-Q>h$IX<+E<6!dC_ru_nKd<-yF)})ua+8gZ)1WeC4@I9ieR7J zc{Ef)2tOqmxRXXjhn_6<)?R2H(r}QZnG`r{>UlWo0YOwGoje@`-8Q_<@jfQQonju} zRR_Vf)LwV^tg=H@@7}Jowelej1ng&JdpLXt4m;a>TjYIQUKSZ?lJ(%MwI?c% zpT>2=4Xvy`!3r~b!zx@FJ*d91-qTf*hKi7cvu3TqEIut&oGxb9l@Aqq_OjG*5#cI2 zxmnNnX4f>b=t8L4%hkj%T+uQ2$(_C;Ij;Mc))udFpzyHw=>!HArHI}wrx{D*k$0$g zAD2I0REY3+*);u@*_PRgD^HNYdQ&~b+@-v>*Ym;{t8xaDZW5Y^Y)+|#WITX&%YJ>T zNzkRyWAwBlISVIvk9Z$f#O!O=kGOtFO0hHWb~l|p#wJg+B zDNvR0-;gA=#SGF5ygO`5WrA-pSMfXNP>PICt(+NR%oR%rog&9g656%w`ot>s(w>{F zL5?JiMWO#>S-QH_BDe1C(plH;z16w*1ksi3bCE*GoYGqd<-N~G4yC|d3!+abhy?db zN}`J9z6|XhMBc}{nsaNP&}hEPMggB(J(A5_Ca$GMp1KJ&9v&FW&GQ;6=QA#951&>0 zmz83SfxouRK9yrxHa52NOYQp(E|7=nitBf9zg%2B!S0Q?mmUFh(#H^YmcVs}YgOhq zHBwAic@h zFX~H+FXSSlOrz1W_hzHvBuY3g`_a_)MYdVT+VTohV!<1{nRqhgl?!tuLXQ9she?P@ z!xmbK$AeLy2{hx_d(``=UIwoa!d?=5+GxIMzuiCo;q5X{H=qA_w9NBw8}*;s%e-*d z@gL8;X)|T6`t$3>1+KarqD>0!IcCu%t`VP69&S%ByR+Sk!T4fVuk+c(7rW1%z5H_f zItmB#>um{V?+kq(9~^z{gCBy{;ePNhFTb=q)r)4`Y5&4hQ(i_PJ+?xE2K9sR<9Ly{ zTemogdV;EotxZQv-vrNKQ#xw-2D!_FK`C$Sj|T(ho%G9M>tA&qj8%RT}C(i8wZV*ci;hT|TkH7=hZ&I8<@1))#g)UuR8|6&^A zkP;z|yWxY4^K*f5!#@=Kb$*wS+ZYa5q4YNBa~Sj9@jfQq#CdXW7cO92%x9$Fwiyr2 z4!lu{rILC4PzY>m(~<~8lfZYPZ4>aPK~V)cb%2`q&x&YS#J?umCmy}HRA&_e8KQL< z^WO13J~Yvq>F+|cjOhK(7Xs_<6SL$e!KsRu8E*{?uOwqP=!TQxOvplR^mIv1zC?DIHA-spQC(U-Qn8RQ2VlSmQJR_XcQGG$c# z%%M-n^tw536TFXseHDRuo3PHzRoz{PTxtyqo-dv{0iSgQ(T5I89Nt`hnf513|8t$1 zSD~Tv{!?&tu9iInSTt!hI`?kTE$aca-j0L9Eow@NIH+$!^EBH zhETlKc^{K9$NQleECwwOWUd2K(?2T*lHubNaHK92lLpiuyh*)}Y2`sQ4PV_zkGRE3 z5ZDF5x&E?i^a~%?cUbLJlv?c8CZV`RW-!qLou`sJ@+&R6cqi24yGmF{)JTzi~CfN0FTyiq~| zXuQM55=<1fmp6Vc7=rZ!@5p^Hbfl{u1oUIz6B-{e_=ON9sap;BCQT$=6>3z5BJ$iy z?bw19e^@L2w1@;9rBL0{xRfvfV@xqr@}?y!B{6Z>;bS)vJHkT^^daj9n_r`>e-xm% z9{QaCKF}xrhct9aEk$ubF*LpCl6QBr00Bm#{-t0@OA8#Y{=3D@hsIZsBixWvMX~J5 z)~1KIZ-PgUz=_HAo9cIRs6bMs8s6-t-no6J-OR`;S+bAZWDj;@X-bG6%ARy&G2a1e zMK2rMd{dNvG((`VOXB(I`+BPmeNetI=DLjGqxx2&iI*?$e(q$`ARp_21!7R-;)9R7 zl@ZVZ+{CgICRx%5h4en=(1YDlkE|<+gPfs~(g0<0g#sbj=Zy}Wl?sGnrtSex%doUt zL=`ShZ9^{i^MWoeB zzgvr^vsqKwXHQ{3BkI)4dst~vJnyoE#51l#isyGoKHyqM4#voq-{l1(oC!Wqcvz(m zSZ3iJo|d5xcK|uf(~}AS+zj5ka?~5l_>K+-uSE~sus0FRIQ*A-ki_B=rklmPdBMJS z&s|6$!;GmIRmV!+E(QJJ#8g-ZiTB}nA%XE9hj0Gz1ilb)EyD)3J`LaL6QkOCCLGnd z0Ryvs9WPZC2lONC0!1tAp%Eu{L;mz$PKyDz&-#Y_(|e;>#+fB-ZQ6No=-2^DjfEHs z#xdX%it))TxpG;x8LdE;S;=QXG_(&w{(96P@uE;NRt`hH;gs`2T(YCI0Q#>#i zo#x4}JFpQlsAqZ9?QLP2&@GMTz2^KOo)pgo)f>NCedC!0|bU>mPG!PqCagtS~b#oh{HW_3SJziFQMjygNhM2~Zm~ z7sCr!vi48g$jk(M^G3=LKYjT9ZX8!&LHE{Xj0T(xZh7%%LXE%d#0p0#vsg#3j$G@FA*gIn$ru|PP?WVgwi&oLx6+55T}42P&{P~5ib-kc7UC6M9~ST%TP zQ`jA?KuY%n&(5T@qY&mxr+uryi(Z-JYNy)juBggqrAu3~T2?MytaxO%WN?dTR3~8z zuE%VtY(eDW@>D^lwzGw$lCF>|&iq#sjOyfJvlUfUGTAcnpNd=WS@f6)=(N?nOyBK4_b?C=QI_|;F z|C1muYX`I}lpOzRF$kxg&VL+Ec3V+z0S0yZU>Zjj?!xN@E>D{8?TM;X>|ZF@ixotj zng7ia(D$I6Z9)Oc*(Tp@;}L70=@NF0$TwP;k1i>yvQv?cI2+00#vX~TSq}5 zaDE*zf%%cjC5h#L2>~K0i1ighl?=!W4BH5yrjTMo@iKWf1fS4#`HaBrn@jG?0tN~W zMVSr*LSU|SNAd$yYzCajP{e{5hGsHy3bpQeaCUl7>(tL**AGwNa>tDTO4xh=PK}^8 z7>sY2y8))<=(C_`gyu<;@4qO2|EUE}K-D`p5HEDMZiQW>VB>a^ox*u)hn;#06TSS? z7b?HpQchY2_11ZR6gj$(zilpPTh{ebZC8KgtS#%N@W- zS+_`U^jLyU78e894*5rab}2L;3?!u*!F@13(;nlB5+CWmbxh|Ad-ANuoh1l2?;{s8 zkqyCZuZnkT9sTAHYUdLtdQyJcBlcI+dyF8;+5O#wgpoEpiMpDktH!zXh4*R1BXUbF zV&4xqCVbx?`ojg{-)eNjGcb*C+o~j3iw%JJCJ?~MXv{K<B;;q*Em{|A>!@IHL^+ICsm&99lS|>+==8J!quhMLsZYxr)CCszn z^>~!C00&YRLf0OUQi5~IJEQbU6L|(oN63?ZgQBL;m?IosN?j6Fm+#BfyWaPagQx8u_dWb!KrJH#&rA=%Z z1`LYJIi=e=14oWUJ&?VR3E~9nVTaBB%y|T3sFcF+)O-=E2Z_;2cBXjMGVj)={HJuK zZAZ2U=;IjI+#rOC(8Gx?LWf6O(PNsxqPT0oDguzSGOA00tfEC|%vUB@fe_MhSb0M0 zrgWumrsIVs7g(qlGs|@Pdc0UHEezzgGUng$G3cR4;4t;Z080WGPFM; zgOvU5d{Ar)tIX1E7ZCl|zbm2c#B;@RCq}UMLNRB^<6E2ZpHg~J&d?NbdD`F=Xg9l8 zff{r+dn;i~84pAX>HQ@E@;d{DhaeK%9kyP~!z%kNXOv8Rdt(HTbB;@*QV~ZR3)pNBj`8XIhq9|zP`8o)yUBPOF}VR{D)ppzE~EEi!jGeft85$y)5069Aw*(Q&?|O8VHiP@d4@Pj z=t=0!hH`zPQ_q^P7*9&UCk&fNw9O$`8}PJ9wB8MbOYPi2Fqc`fRIUficG8o!pW)7%To`R?|sXsj-Gv%GCVf6CkaqxHJKiN;scaDp5W z&jD{dPohu%<{a@Wh*Jngc4zM;Q1Wp*=9VHXSxS)?l~ob}0fR8N$G64>9J}4um)$b8 zplc6b?0R37hcCUWZqsrcxX$wbd>wsvTJArUzpn&C9&M`!N+RXB_#M{?s4NO$nDHV>cDib z<^8PWP^-*6u1sdZ-OGe!+S&-!)@q3rnP1}Gidzn@!gjX#a&GdHd^xGIcdk#g2V9{| z%=r}qjyl!1dOaVS>r$UU<_ZX{db<&hm+tv zynJ{S!y#e91&aC{_*bb9Zv z4c<90TR)%tL~_u5Fj)eWbSBD|GkzM^t@@8=kO}9fM`vvyJDJt#Z+S&zyG14zl|{EU z<+apbj&UChQl3zM0h-|;&jlg9?sf;+u*dbLTe+WRnxeCV{*1}&@QF{ym+0b#P9ToG zJjV9GOwV@OIyr0{)z3}t?4$AJ<)cLYtoLqEADP*ZEXz=hozr`!X#CUfYwbGs@zI1Y z&u*XODnboB`l3O~kPDWYt;;8o&CI#a1NBU#uI5z;6&+KEvdfW<|3 z5?=3JkGo8gK~_uADj`E4iSZUQUqX3d3zFI#)i^rF$b%a_)-I%72$sH1ZDMRT zNsUwVLbG&qb6D8;#>b#GZ&^7$sosMTStuG-#ne{VNjlAICuV{Fv z-5G{ZPx|PAU`pv(WNvg8phjcai8)G`!+XyAnDJ{CEhY0{Uc&}&;0!N1%zJA`kS|6= z=`Lu@_G8@C(%vG-rkiLs;95VV;l(cj}ytQ_}c=%>%NiibW>HZ#p>PZ_ou2I;LMx_zij^E1G?2i7jV=q zvBBbFQB&T7Kc#L9PSt2S8KWCMauSgWcNs{k8dMT>Jod)O^5>+4;VH79!Qbqo?+-80 zYLTlk%6Py)x?nYEhaOIn+LZtDck+(e0930Z7@g}e%wt1uoMO6&H{?_XXGuIKsYVyG z*|^&Wa{R`ptjCaIZxcfI!0*}IpzNZ0fJC}sV9 z)SFMoXne{2b850!(`u0P7NXmz9Co^cw+`>4-ASv5>UdEHqCN3c$<~$amv3$)#w*@1 z`-)l+OTJ_b0q?C6xhwVzGON5b3*zZn;6EwjOZus}a&OTZWed!C=aS^zK2nvPUwg24 zA1&T(0ef3|0WgzKva5tKwJjLqRc=;k6>^v3C$mY3i9Nu)kHx5qmng)pV3!gt&TUiZ zM8)bJ4D+wL*}1dkQb7@Q*VOK`6I0tY|AJtc?I47_=nG zjzkiw6ngQP)QT)(qG&|miASrf6)-BY0E&Wm2{mba!;zfP0-p=kD(020ch3hf*beqv zbvPJ;2Ao)bPW^PyIyue#q0wyDTblYIUR)RxF93+Nsugmzdm;&5P?v^zX#3$H?%>q?ZelS!d*Nm8leEhp~WOrO^cdo$1q50o-ul?b{4z#lrlVGDV#NL-h+VbwC` z!uYk3IC_1Q9N4kzwLA}3^be+0^5EA~1f+|}BmrN1w=kl+@8Db->;z}P-!oeHEH1uM zCDWAh;ROWxsiFIr^zdc{oTv!&3Gatmg2T_}(74rnVg7)bq}mjB+$;kD+#d=`#jSD- zPPE%9M*1|OA(IQD?m|kXv>V!(-S@!w7vg88`}r`U$Js?&et262S(E-Gf@?2&EyHkP z`^~wIESu<$bVr=nVPzs5gZ{h~@ncCjgBsp+mc@^vN66mMIW0ZdsHUSFaOkhBh@dR2 zmZF@jAwlM4Y$}AHZucX6f~*p^}Ae8O`=-eZO(okPy_f*jKMV zziBs;ktzN9Ev~53Aj;~z;H=fBGD?b)E%2Dr`xtx&j)s0h8^rrMbB@Y24_-%&l(yYK zY-$ekMtj5GIv-VsC^V!%GRn3k*zC_tAN1l`Y4=oKBiPMbp!YGOY*Vq2?M2dLyq^`{ zz!q10lDqCbnngK1b|s4!ImOEX(bpdSBsE4>xZ^Tl`TVTWny^uFB6^GXz{d$1Ce!&y z^2_hiSDEtcB;}ycv62JJPEZqfm;M9+Dhj^#K%0OH0U$zuU_+X3NOiQHY&&VfPFaRm zWWsWgP5=8Yj~?iiyaa|q#iI$uk$9uLZ?lx5BNflql2m=!4C6X*&9cN(n_!|x(2K@M zxDZ`wiyQcp*KXf~Bk>lZLR38w{uoYheP~-G3Zn)ig!0{RH!RC9wx@jCFReIJS7Ump zR8#|~cu>S#(2rxlqBT$)3{C3k32tYrX~Zj4w-XhbZfRWM1vfS@?_}hjQO`m8Y{6sA z-W!yuKtGb?RGeT5nxNBw$}uKH`8E7>RQqB2+{mbAiwPkx18o+rYtDiDGJ`ERzESFq zE&u=7d)w_cj-y@lf39K{!xPiq5@pG;lQ5QJh@x!nmy-CBloPKc3kxJc60bmj8z3by z$-c7l?_Ak=p8DwNndun}J}Aq!yb_TFX1c4ZtLwX}W$&rTqe%62F_R-kcU$rcm{IXl z7113W$pO0w%5tN-n^DF$evMmT;JHT=S80g=)yTtoM3WYc&^Z83leZOC!vGH`yq}pi zi9TrT`g$?;2t^S4yVmB&S`y%3I!L+M=$RA1B=B^85qDSDsMP&$6yV*FyYRvU-EEl<3sCij z)1n~*a6H#|C6(#aZm^2A@d5#gEo0gOn|y=xNfh!+G?bx|u;yK*< zG`G9gC~|21NDdip+Ql)()yr}_CenjwePo9SiJ+we&X8%rIEpdM%=lk>hrX7RwGfuX zF-PhPx=?^U1)q(sLekmAAYe_aHvKOS$4g^Eri`x?JhT4}v2mVd&NVo`kpP#wru;di z_M8@?&OtjbZFw|jh24i3C9uly)Aa>vOC4#Cv%mkd(d1DAK+->g_c+6bwP^QRk%FZ4 z=+UM_M|)Vj!3|GhfyjR4wT<4&eDibRj=U>-67PSsSSN+x;hvwybZH-HjCwWyL$;>H z0~Vw)Y~*MGLfgLRpS-nqpMZZbd4#>Q$QP86m@oJ( zQhGQMzSB8S%F=s7$15L2TP>&!Xr`qlGq-TrQ{%!#+%A;_OG^F3{eR_!d2}}qJN=BbHvzdnhxX<#C^lD- zht6#L6>D!2ti!5u?M?VF{()u=C(*N4dwWk`Zg&rM_V+s5Y>HZO6!{~s_8FW>`HcJt z4gRd!d$cR}9D;M7p)^qP%n^3w?dNJN;gVsnTD|nftw2!%omcCztz+xP3)3}A74A%8UMFTm1>cxEI)DXg+|D%yD*Qna4q0#Ba zHXmVbb8#uO_qg*Kz*)onEYN@Uq1UWQq9pUAQc7$wGDs~pe$zATf+{QFH;N${KD!)f zdOEyb{R#4m2E^P5Df|V8Jz)KLXvd`^6`{MHnJWDR(II4!RFuPLC8y@0bg9u)4LZ0; zPE4u0?`lgVPGVvT;{mz5yzCc7GaLiQeYDs|@MOXhQ(Dk(_3G8!ToxKyXU#=C8dTdM zP9U@9#tggDy*ok26h1dC63l01HiMMFF=`%|p(-Abu!!R2c=2?AzsP2q$B;u`^S&~& zE!?mfyc6Odq$fcSth*2$u4tg>S3m0-Ji)T_JrFEJkJeKL(dD8Vkq!LSXfaioq4b)^ zO~0;T;${Y01Pw|Ye&L19Jn*j!hs zDttUKZfiEqo<*7u8J|9B%X z3F}F)%5~s$=YiGRL0s91V2XZq!fI4oFqRGsQEX%n|43q#B$dmniHBEZH5Nt0FIe^) z>RSl^T8iPN^+GUE+!&bw^D0<|G0%y&>=1#k-UJMIGU*{*U6o`Mi{uI{`26Jd9;7gW zp!OJ;Wc~mvORnHcq58;KCeTKR82LKSJx{sRragi2P38U5Fw?X|w^N zRXca9@TI`c+#XX0oB-#xpFoosOg{f;PJM8}hDBts?4?n1I08Z(Nu#QUuli94fp!@I z`YD1D5^~i@Y2k>}k@-Fj4)cap;)d$z6Qtdu!V}&CL}ifsr(w1{oS7djgn8j$hz~?O z6>rVKVMPT!*t9ALIK6^~?C+g>*^_(O_CIla^>Di_VC(stDBwS4w}bu=mpc6YZ}+kv z?`8g0d{n5YGfeb%c?JXeLoqDz3yu6fUQFU8g?`T=z$y5N<)54?s-&^Jhy_kd;RpYV87h%1Da$?+X!kM-!GFewB*?z-hzh}f#-PM6 z+@0)mxrPj~qN4lpl>fTI1|snElrJam%xw%$b;9hU!W+euUA9HE9{rl_yY+Y4hpLDm zoLPZ%3*5{4=bPCYVwjr(`rjY@b8VsHvmuudh}S^|3O47bc^;P?jd0jwAnk0k?%yI?NFzCZ^2|}3mrl9;V`nj*GPgkMaM8}R%$FYy z+%$9Pigkt6JPdZG3R1N;x0__GTbtXEwK42>Ct)?3uhwO?!AU_A0Z(H|nrsK+rU+bu z24X0)+%rqh0TR#UhCZT6krr?h?|}QbKC+lO9iI`4S&2;aj6izT%MMWuidrC5C?MYW zfusU@M-ygMAfTNKMBUj999CS8Mv}5%4MX3kT%4jQQ%n%?$c=;#5q^0i)&3^E7z#+d zJxll{UJ;N#T8O_O3-R>y)o6f1&1Ix9(s-B;@BlR``Wy40v=2IbZyu}eU6+SSYi zWvLr=30$Az7A4KL6`3d^Q1Yq!lbCdoP@s86$abfoL_&%d_3Q9vRG#*S*S$rL8(F!{ zoNZj*AOwPNznync2&}-naGssPOLmA%FDp=}aE77b8a5el3#g6fI=+n;YE0qd8U5ur zG>xdj;S@5N$Ah!2okB=7s0kY&IBfKelUjrv*vS&DM}+=X<)+1bHL&Ro{*!wNbHBE*N&`pV_m^$OqePsU;DE2 zT&++AFeCjsMpRgVr*7S0mi0j&VI7tlYNl0ojp`oclJnXtEx}hNQLHvwsEX|On_oTf zj^L8i#i{P=RM^e?ME!j{P_88tSh(FRbdfzr`x}EwBiPz(`cNMHZ(h0;Uk&w-{|#LT zbvc9H5RE$7lP~W@4K53I`~B{B-|yl7N8Rs_&`uc5TGI_?ctn)&u+dn~-#-QP` z!`mNOPz7SNGPnb z2{jKtyjV&qVknc);o@*~VwCPda{%}hZyoTZ1wrJj@_suYO?Q|d&KIh5ECZ^|JqNVR zS)L!%BfPZ?oSbzIAe}0u#y7zns%@Ph??RdNzQ`heHnR~ zRpuuq(eeF1Q#SmQ4@|SF0tE7#COoUrT|1 zgwGcQo1IZS>;7tL0e`h&7hHr7y%8p9wHVy3j1+Ne zOw)crXTvc9B_oI7; z>YcdazCd*aNxd%SSmJx}3Ck79g)a?jIahjCnrf!4K{(~54V{}*id%86TP?EcJh=0v zmOKx0uQzxe7G8AH8FA<9u6i=&UV7}wSa|h_cs@HiMENDXiK3pc$_JlH_qW*N858Q! z_$t$u|Eezu(X%(Ob+M&Vi%&>ws@ykT`IZt$xczZCuySfqy}Unjis z3Ej=cIR~Q{JbOJ_)IMDRsxQf}9EaVH+*{5ubtxMnPI_q4Mgz@MbonZFU{}sz@YZ#^ z;)~p6~DS{>XwGiX7fq`1@8e19=`&Ah%=*H1*MHAGoTV{hip2^(~ zt=(4@7+%_*Z7^ev_1;%Kw2y~Om>rfE?kz8qj`DG}Te~#u;c=Eb@YsSLIF04VXWNC3r#rAk~HaN%aQA)4w zVipBZFSvSpF@QuNTD90#69MuLlbZ3Grw{r0tiwE#D5SmVJ$5yfdAxp#fgm5vZh1VN zpe?V0Cf`hnH47CRj5tohDZnD)DdRgZ#>{)TfQcaeO?is~mt*gHUc?l=5c5?8X&sLl zlcVjrnRRs7>Uf1`7Cd=6l6bN7*T!R3+QP6-1~!2z(FlOUx!9*$tJCXSgf+vENCo5H z&Smtz1QH$WRB*gvxU+C;Z5DmWAm_d4Z;fWgh<5p0!LDqa)(kU+M+*Z%5=Nxs9Mr;a z8E;X8R~05Ny}$OJbxD$5No?<7$`i>jthjhf+Khu)*!xoN)JWcJZ50uVQ;Oy-ovxHChbo0w*k3}#11q0y zX3z8hguY^0=S~!gB!G-1BBl79Ic8u1y=?7z0Ju)z!jC5=3P+Nl5f(~h<-?%C7R(mg z51=nzq~x!$7tb1V;&kC~(Ge}IyBFN`qTMJ@9PlNXa0AVX4!E5gCsd{=$k3mEo7x1u{ZUE`?nlxtm~1|k6n;XT?A52QJ?Y(8TxGFnj z5)K9++vDPPDzW#)Ye4)HYOw^PrANQw00YVRAGi6G&Dhb6By^U}q%FHOt)agP&*9+U zLF_#x9CSkQr;s9C4YZrL`lp{3q#I8;$QJX2G6;PYH$m$z@+JvVG_6zFOOTwYpS2xS zqfYKZqB1147qk@Q!AEJnDq~5uk~9(_?svza;iynejkF9Dgz;2VNA_(=paLdA@WRC|tYqw_Wt71(p=s)|L6 z?M`JxQp|XftI9uZPiG8?xsScz@rhIjMQky3?jPIZo0AJ(2>p-f$*rx}wPVg8Ym}Y? z6TPs{b)*vN1 zNc9XAxSqm$CqEkbY3bn021YZi1Q;3Ay!j2sq5~Df5~fPzg|oqHrTnriJa%k;F1haj zwVL;h0vm`cqU(=zh1-H6d_)_*I+BXUm(v+#jz#m82`qXmda52O$~(~_ph7A(>VDMXnYCC`Y1Q)Pbx$nRuw4R)Xpo$FK8KL>maT0Sfr6I0Srb&ifkOO zO7Z%V?&UsXPYh(cHF!MMG6P0Qk`|7yg?* zT6v2SCysl4kG>dKJ$|5q-?bnnO6J;s&#cJ##oG%hj6@VvuS3l%B0M5cYb-1bNySnK z@Yf!c|2Q-VJiuBdQ`S$W!MQ@$)hL6s!41NLOQA&e1&0?|ygMK@4a2b$jCMtVQi&?C zQ`n9H031R24Nao?HVIz%k6X0jEdoxFiZB9?Eo_gqDtGq{i8pQQ;zZ-o5KNE3ObvS;MNLdY1BGP(~LTMRb=9Nq4+AFJYs@=6<*UP}_T3(4A zwB^;7ARpmZiFthDy;zq^daVcxg6tQ6CCae=|kY9l;#tn4b2JZ_bfs znrC7pY5h5qk2{4@$zM0QClIn2#m~tDKMxzZ_&$~jNnFi=Hvt9vv{n7dLMR-1nAS{F!O@-7!y&Zx6 z)zSrsv?xDDD+4Nwh~yF&R>9ifdT%=oBQ$DTYKp(w?;}^|x!6{h4P!YO# zRoD8N->m2Y7kox?7A+4Lf*a|KG$bLm@dFw-ugW=L1{EOiWYNtGc59O=F4yOrd2`9n zGTCaCSK^LJrN>mn*{@r~SI`kr>wDy0i-A#LUoDLVSa(dYqJ5`b<`y@& zgO42(;Vfa@jc4B%6vj#;jbAq*RnYO%5Yl2`+yNnJ^|ZI^$k1PN0tQDTWCQFGEc7o) z)#|U+_8`A*x=JAAr=hGx0l5R(l9U9si&arc3c7M5re8N5?U&K<(@@c3U@S^QQNrR> zyBPIOP!4uVNvFOLT>T==ue6$EEt}q=C;qz>J&8tjC=W;4{jZy-(l}X+vg&jfDX-8> zJsx?jsu_jG595=Qo5=(P=J>{x^-CnfLyO_(veDu?W7G!usq7Px+T9~O^l@9wqAww1 zvHc8hrEOO`c8P{VO8`;f6ElElWk4^24HZjwXFo3jQ?QwrG@tWG(T9;5NL-W~7yr81 zatb5iBs6)7SDqTUFeLMyWM?M}=U^-h>5>T;0q{jLFct@VMd=qPzC)2Ng)97HCl{;> zWK;c~Ip~Mu6K#32aW$qxU2-nX^`$!esdYPaxvZr6S@vXnt?ftTMKK!bFZ0KxXxB52 z{ay9hX!HJbBgJ1gYe?hdr(q6Dz*1okb=qT|PiRdh)b$1BUx+nBt42*1y3eiu4T z6ntHPG-~MhQBO1#trjgm89k+UsTDXaNou>Un%fLaF;_ee;GFE+WCgrfPg`4|pxjHe zE9LEE@k(^h@}hZEEtf_uWqmh3TTMBPA6G64ZfzCo(d40wI;i!m){<4fMT`D#9bAX8(N5&Sq1wS`jB=@3iQ`6u461!9Tt^d5snppN6mzn}kqKqOZv$ zB^Fa;@-s$dINX6CiCmlx&0%%@iY++8qxsjM@ldTGRSz?sLE?Sk3FCysX>>@UN9uz} zIQM#AiZ_z*ste4~7}jhi5{Nc9sRh!)9t)EdWlNewcgG3c0FHJx7;??sfI|qCUnj9LOr=NP-IpRf-Ypkxs6Q${%zkIsWeY*3k z^J?!%p6Z|VZid&Dq2#&eyD#_*)Qg($JAae!d+!nx?H(RtP2Fd^2Zu6~^mMF_V~_21 z^eJ|4XV(nMNihRm~fz0693Lzap-NVUIXcHa5<2w5N+5O z8YRG?(4U|WK?FhctBcow6B`46(=(yvVN^`Di9%tD_@cMMkZGL79Hjl@I-`lt|}WK(2%({X7_AwAcW7Q;0Fwpeou_c)xUx zU$A?sonh`oEp-)HA|DMymdkL5?~AXgbSriYA)Y~P47z~W z^m@89t`?pX2X+>@2$t=`xjpHFw@l^2_R=h1R$@gV{6`Cc<*9ykw{obK)+9zj$q!AT z_%|jBMYIx3<025z6Va~~#>0W*`>+Yh^hS0}Ahb4an`fzL|_P6U=8a*f^wvr`I{5@y~Q{40?$s2Caa1hw*ZpWV|3TtY2lV zA%AZ?etmO=gX~za7`6kTvvU5{dtqB#vk^W|v3h!RGfcp-C@W7z=xq_FUk$zVJ19j8qsmD$NJ z(Ub!UeE11(M2zwWgP*l7JvP@r$1Ns9Im&Y#)zg!o3QdYz$yBtE;BCy8{j=pz>#IxP z7S2YWqi~3WFuLj?O-J#YlSXSEh}O=hIsdI;g|>+iLFF?AdMXm3stMys0a^Kn1iArb zlz0$4!;H^K_kJ#rC++LOH#+y%4+h`(xr203mJE4UqT1s6V*CbR3TWLQ-b|nc;&A(o zM@D#ak?W|LS}&*PgVTpHVi9Zd#iQs8p}UcMP&}^)eozm~t`uINM;fR4*$;l^Q-q`W zI`F2m3f^c``6rL~2_GSf(F7l=8NM3v(-JOyRpf}W0tUnQ%Om_^_p+I^uA4c$0%sGej? z_jA5`ACRCc<@M?|%myroD$GHPfPeWM%8u*LA5@bFi4gKvM|!T%n8zW;LX z$A@2h{$;xrRNiW}km_5}dj8lN!WpZ2b@YAL*PY%2J~3;fp1k~9_i(4P=OaB#VNf61 zKG->GGaMGXx4YfuNj$UP**);NzxsUwH=O%xU=)rA4($a zzy8*YRD9oVeRvQ=-vVXd?Y!7I*agiT&e+e&gIx`UB~g-iSmI(y9LEpO+PBoRZ2|GI zv7wC7C1KhBt6<_#_|9Qx?+}OfkB2zAUw+lapGS?m*ZA_$!T!O{vt7>o$@(AGKS>Z< z)B7*?5BGMT?;dq`UmWcmbheLne_%-S%P)Ta=#QyG-89zoo#&~s9)9(QKm6fQazC3! z3y>Y|;KD_N>x(bG{POp|PtthPSOKzltcRcf;fp`~{^1{!$Lesqv)4Izj?iuM$%&rR zUmJJw@cWksM};$y!g2nTlNNR)i9bDyWG2y*N$liL&SE?Hle3x6;qG@Y0)CQ&FHg+m zPx4ed4rBwCcu@V^KupYy|CEvh2&nFKW{ZD&Y&Keq6axhp&sK_y+Z%ySi*L-P`Y;t^ zng^PekXmVZp6Kz1IPwp1P*W6HUQm3D8lDf!iJ$-Si?9CphtK~+4M;UI(dwAT@maQw ziwJJVH@Ml8e&-CD*?n-x`_Rq)0v9+tzw$N&*!sOUy}?i}{(uXVZ(Q_nzn}$fJf8X) zKAoJtg?0)3PbRP*A-KTACHqWc2*DwJGP%9F9(Q~F-YNc>0*dpK%kE&>4Kr_ix+OQP z$@~A-Q80;V)6zm$d2ynD?hT9zq+Zgia|-2HCZoSsLdBiwbd1Y1`4y6ydl{}akq1I? zLWC9r-hNa9#?y0}I9y8ZG_H9TH}sxZpdCg`(Jn?S-kP_1=&~=jJB|@sV`4nO^(%q{ zyv4wRjnoR?w(<>q2iWxx2@L7{5=j40mQei|&{sbM;1HOf$iUc08zSGv8${+2UgSJ* zY!Em2$&s@4-YKjTp{IPiKQXzx^j_O`1>DWG*SJxg6(jGi-BLANm-q97+-qC;uV}B! z=X(31hyOkLJo{hS{&;vxgU&XvW*8~{m&Q=A1zpj9Ln?Pglq^e^i zl@y=av`6IbxGLc)2ZoZMiYgpc{5GnV`!~n930R0RB0^|?cF?G0Zj_abzdic$%ZGo0 z*!kNOSF+D3fof1ZL&v!44JP5u_C$>O@C5SbQwGD-Gs!#B`}k6IE9%w0?{Lo=voz5& zAv5%1=Q)Z5*-#m(%08nDW@}(=S!aLOu(B9(x;6=olZsAjXs!qPDGnpdsJTJ*b`!`g zwNzFlOYy&oB@sOlPM*SPFQj=FP}AkBVR`yAW^mm<44hiHoh&{x&mL+nTnZi1T_bGl zR0Kc<)Jum9+wLnliTu=-R*MpfkNmN+vaaLA-_Lbi9A#bRzyXOiSr_r&ZWy|Hrow|& zwie!!1vTQ^CIcr6FU_+7`)!z6S&RNzF|+RYsz0h?KPfqs8&xPDl<}T88ZK%LG_U(9 zG_Sp8!Z$HIp7UGb1I35tWd(tls+fxhZXiv2Y#w5)Fvofn!?u{VoeZ+QjO+N!MH+Q$x!xPru)#2K72)xm4d*-`LA-bKYH>U7kd13M zm6=@0&$ekj@00O`V=UN~Ue#Xf@xT3*j2Y`r}6JZ$|LZ0MobE-rf0i{{N9jILO4kTe89k)>}W&kP#oRC-kF?_M~?>fr+;eFP+&)~Ru>1M^p(?r%;wIP zvO)$gUYYOekXO^;03}4FG3C3<{$=sI_M-CYEvY2mkr@1ZLyC}BKPS-nrv-RR9~VFk z+_}1?hCzBCxHr77TPDfY$A$=e;)Bh5M9}2|Ij21-$MUTgnV4-T#~x2ms24bP<9-)W zliD2zIQ5;cAbdCP&UG<=zI#PrN~m`@N*@jAw5UsTV15TPFv50e-uaUb4lCDy1V{~94R&^-;X+uK5 zMU>h9bK_LqsjSFi9eAg8Ye~i92A*kZgNqU~CAaoR4}$ zljCCNG-k;DX^G7?V@SExf_MTvbD*d=RVze=SC&E-6T+{NL5XAr$I%CXIV5o^P#+)) zx5p#Mdt)sX^hEotr_v&@{c8=r7H~UKJ7@>PjsMG3TumHhJ-SeY)3m1#Sy*hI6iGJQP{R^r4hCl>IN#>_1uKU*qw zOSaFZ$#b^^*|~eyXe`p)*|Ui3v9kX$ z1jEAja~==FL@BM|XOXiMTvOaq=m;jSB#vfSV9sCA4rgFm2I)2ny`|BePD0WJ_}o=Z ztT^qAQ;6KXTww@r&UY}iv6;RsJjyeVoPLdLno(MOXr9y~IivyhDyxo1Za{}Uw#eF} zQ~Oh_U8e{9?{n>W-j#220|n#=Y9@lPl0`XGAcGQ*s$!-%RRdjw2j`)TDt3&#YSWBK z#S~U|p0q2+<^5;v1_ta3DVl{84UMqpMLW0rSXrvomlFhH2qPP(pBX6-96>ilG^0U* z4v0mKLE7r6>fUHCvmU%{W_Wd`XpDlX$v zB1mzk3WJptb4*y?1@)%cr|AT91v)>x5e!wFFYXi4RUvw#L(FYD?`Sb^)B^K{4fWVp zPqD5(4o5&Uo)s+!j(XLozgEKNU17WXZk!4`Iy9@qdsyP)sL$;JPj^8>BeefSD?0R7 zL(5#p-h>5m)%8g@UX@%3R&!o3kXb%6JVjX8z2YXx$ILx_>NP zxY2yPAF6kn)@!T6f^DIt(-$vEe}DK@ZvI3OeH$n;eVCaQSw1ynfs7kFw8&BjLjdsElBy0Y~T$NfF^R=;fwKTcXTquQG62y z@!XbHOGguHCKHr)v|$45Fk#3|L#uE}zfxu9)~%{qt?oVn_(U%H@1#Tt(OpQ;)Bb&C zd-jJ;=YevItQpP0dXu?0Fy45Cx$?z3Uy6omplE%ny2N@?!Tphd8OdUA(ML?0Ld$hr z(&?)QtX`uJxUH^ck;DF(6LeWgm<-M@^6zHR|A~T9T{~x}GQfQBIs%aQvUPc|ij$e! zE=I-s+IY+HzbZrS!fYWkWPm9`^4ejc?HNJgfAM z|4s#V__77J9{7}%^~HmsL!J%_Zf0j##H}r^dO$m;r;_C;JDkCACy!&QD4hxsT?SAK z$Mbhct!zcQB|eQFABknmB+}~Q67*SJqh}x@jDlv2z5hX61uC*PV;v5Tr_vBGEOFK; z!y6MYB?hTENLPlWm?`p58>aS<6u}ydRt^@2oFA+Yh@ByqSN2Rqdt^CbDMv&F^Tl zG-=@*Uda0&av-{#w1V>W7OsAJ`4xfSrG~&d{H{W3HVw5&o}`HU{fx4pB? zuny}S``|aaij7Zx>^$rKuyb&@`|`yn_p(pE*!+C+kNAab6}XC@+IjKA?twmaH5s2G zdR_C}!9n-%sB>`iYQOuev%9zR6wjfXMS4&?eDLzs(N6s67qyQ*-96mz9BqFeKmGgK zr(e80diL_wi>F<5FnhJPBVc?v`|0hMFOCjg?(OXy$QxhHeuFI$1v6hh{KM?0f7spm ztBm}|+Go*Na4%ltpK71vWp;Zn(V;d+^`p;gpO#z1b`B0+%F-S^3=iT?lgD%Z7h3K9 z*gNZXu5!)*>UaZNfVb(ur*sYGg8~DpQ@9a%0DVgDq{3&;OK>+8iiIxxYV0Xa=FL>n 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

J!kf8X@I)2a}5r?P0wWP)Xv0{oUUH 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

_&auS2sWq#S!j!<6ojh43 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 z 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⪻$8lBK{u#*lpiy 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 WymwHLGx>*sfOS@YOVOhg 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≠E|4-dnhr+XW;8qV2KR7JP>+wFQAx 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

-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

PUQd=6Q`X4 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

>OvwU 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

8;^= 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¬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

-;DUe(8pJ_E6rOLUqr-nWx}-H*D%DXds`8*GlK; ze8i9Uq4k!QSu`qto9V_fTErb@Ch`+OL_{ld&SN8mxF^QRy`B-=vLf#{n>s7(W0W zYaS-_2w-<5j8+4^v|8YuOSG)9-#Ew}$>%~XpWvGy@93rHO7T^t* zh9{wGa`iMT9BEqYw6xZ@w5%fZsOGD_ztZ`7r`^bTgS8R_03-AI7nA0fVIaDx_-U7k zQ&OqIBatS2q=jJ8k^1q4SBCp8@wub3zx>mY!j`& zu+||pv?!oPCTjfgZ-}yCQ+^_KxoZ9d9(xHOr_0; zbCIqt-$iTg^M~~#O;IvS!~ERs8lFi!WXtRw=qbi}OpOrbsHBxdax=b|O9hu09&okw zx)NVu^Nph%&o={%P(XZh;(8Wrk9~q7!b5DMEvP#yc-ZMH{| zb#b>=S1EkLWdb*6OIC+Oyt70ER+*Pplg)hZ;LDatER)0~!C1V$aDcLq-*?d}C_qMV z6I~0Lb`pe5xXP$z5Cg%A!f4Mb^~c0f3IVy2WV~R{$aWSaW#`y<7OJybM@P0r9)7UG zPQ;4FH$rOnB&a+X?-Dd7VMr})%p%EX8Kswed&w5$a)=YO?lw+rBN1$s&3oE0Gf5(Z zj+Cs3lVPUG@Og^5axl9L3uZRXqty(e6ukHPWSJk7@db&|zynVPL~3w={S^R_T48R( zY!*#fW={QP(ol1Wc-Q8A?)G*WZcMwJ1O95{$(DG(#B>XdhAkj8ldhk`T(Tl9lJu{z zlvhg*%I7+z_hKw3gOmILM$-O$a*{zxO2TiwIiMBwLDv^K$KtpVh4LJJLX3qKD^9Oa z9`N})XWSw!L4$EXU``@EkkSZTd%T z{CQ>hFXfm2R#CZQ53>jbxjr0I&2fTiq19VRvxv@NK*i9@#Exv6+AU6DHP-bW@u!3k zs+x}h$o<{aUkU?{iqU$D+7=-XyKm7^&|et;MAd*~4I(^+)`kXM+%{7^^du` ze|&QP5B%@LM}PSIzMI`0q>LC3Uk+TdbY9z|!ctPgG$F;I5L&AWi-A=WxZ~SsBg7IF z<`#5E9H7O75|0!C$U7$puAogW`K@EIM4+$3afUyamLze%PZ<==10EYr~`YpZFh*@aomqYinP3I<1#$+fK4l z;8I6I8F4J0%B(JMFcqW@9YK~l?;TPd*jP)#FQO(#i+F(yk)Jv&twtCw?IVr~nCK2~ zu>hcq$>Ozoh7`Y7GZwppCvygS6o=l&11O%+0}>o<6djEIJQ zqGd=EWPFVbf6s30-Dc4u*aIGi+|Y26BFPh$JXp!Qu+$woon2
  • lDYG# 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

    8;^= zzO5eHXY%3cmnnC0JAWo_pG}PUP)B%!_P82YnGE0dM(A>>PN47EAml4d?x}W=Y#3Kl zi|v<|>!#v{8YprAl=*BfO$^seO8OotkbjR9riD=n@rm*Eq8AE+5(xb;S8Us_d&>=DjaUPSGI^9gw;~6Cp)xu zIv!rJ=c)KDOCzv%I$lI@f4B&w|As|GIG~hT2CMkGgw+?2RA>R&yILBd7YoX`kP@S< z#gAmV$OitG3FvciB?Q-dS7)dt2j7nWe#eC9XgEaa=8_Sf@!v-aDU=VFeMxlG`Dl)YNRm4>{h}xzFtgPMAcA9JS|$&higGuh*gfA;M6{|_0ki^ z1FH=BL}ZKB1kw?&E`20nz*jAtY9A&v*c@#4x25t6X4Zutxv;xIOCxdg6d0ZToF_7h zAy;w)<|;8otH;_dqYIc1-Rx1TuzW%TUoFB7Qu7cog#4ZR`X7{>QyW6U{J0!2PQ#${ z0s6)uU?{j^Wy?s=Nb-W-TvRC$SQ-E0j_0wiP5J)(z7e9l#U;)tCry>BcK@H0g6>15mo#69JBg#VIOs_zMjV?=)*;o!3-uRgvemxr8ik5ZQk@iIHM1){6fmRW z^AtV*-m&x4bsrsLmb5+j{g!;YPFfO{4~~S9Rz!t;>B2%_uGR02hc|4YX!$duQ~fZ0 zA!+Tr8vY5@=U!C*F6l^q!k*M%g*SssR{n}hizYZQPSoU5nhmZ76YWlh`rF}+5&=VU z0KHF_?BoRQ-%|>Ia9Fi)0F8~N-eex?ppn<)rM1W-K8QC77bxk?!KBYZC>%^y2IK$( zUY@I8?TI~k!`I_2<`{YB7%6=AQ1%=Q8pPkMvWx-$G1^}GHX#xViG9+fD`3#jWTKKR z@&!p5SDCh?O58ReAzLbyuT{}oEGIAQHnG+CJ5`tH0jbC)^U2%UDpll!Z+;;;-}(h= z$wP&*F^DFO6$4Stbp-1~9<$mo3tfgycL=Zw56R%PXzzSajqiH+;tj|q!{?c52 zdA3j%<->?(D1|Cb<zUCl2u`&OniTK@PI?4}XMW&w>yH zwgKRxcv~6gM~TTZ-#eQEOX6iPkz%kUDbA*>yWQr^M{&%)mm#p~p*urU7 z$ryEQx?;}K@^-@6_3gg|Pkc~zBsV>KdztyDu?gyj?2ng|KWAtjBW*3t0zhIF=l}r2tMp7gZaic^Y4p3OAeqg) z8PNF!E}u&1_k1vsRu;9x<^6GxzCb!x^hvvi-<_>xoUMSuk{uqpw@{rU49NhV(+>Ao zuo2k+QRWIZ;4atTW9oi8@sCFt6xK=^F29b+C600R{i+S|^azhin&+R2#u z%U|NGc%>;&$%QjWa!%}^VF1U3gEU@TG(w@|%(M&UhAbOdynHcLmzm2dSK*zrD_%me z81Ha>vXUF(-cQKNd#Q`b-_LB=S>*y=O1@VSDjdsC^}>GKj62{wU$ zOeri)V06n~TycM3dr8^Z+h4K_BVr9V{TA5zmd{Ior!v!b<*vF2$?Uwl8BWSHCK(SwjtAa zPxG2*XtcSaT$RiQyn4cYY4*V-br`F_JvtT|*zghwGC!_k&gZbUD*9#8X%z+md(LJX zxajk|D-Fuw5s0O4SpgRH%ZOH@%KA0A-vD)0a>wP_o4cFuwXBU(ay^8CA3?R?|FNM0 z>h$CqM|^|^KL3NxBqEvQ))?9#LuuiF5IV1MVOwFl+%?p41wj4H5|{|vbzir?>Aq;T z+MVnt>ECl$>omV^bQ_2J&Dx>xs;f}E{gYg%h7wUNPV7a+74&;v)DGGWc1Vq6u=g2% zvi)?MhD&7}p$=}d)netF$s0M<$UUp~W2m%C zPmeLKjnEw&26Gb-$U%25-9*c@r{)35g0vEb>#bA)3yAr3sgE+n4x{Zbd48c*%E6Kg z9+*l_qEpQc%fNEMVgdr=g5#p#k=I?IO~Es6>J=hYMo1$uR2D)qz48%d5Wq`h$?AMS z^oApX>)?v=sm=eJ8AEFP*k|#-{u@O+?2+&1I^_u)gz?BHwPkwJ5-OHIRxuQJ1)q^8 zz)2t=|FTn`KD>P&NXyGdDI)x~Lp{$!(x^rl=ek+@g+m)wv!NXFRGLS2LZ>jyZ(631OWAVgZA$paF6AN%>GGAIf6y8N9w*7^LNQY?NCIw3UQCpx zf~klbY0#?wY}m(b%V%sUilN9m=~;-kZ{=L=_Dz4Xb1iqw?(}bVyo;pVMc`wZz?U&p zUII=}PG8`r=*dsuSGj5_Hu2D@Sw1oIo8O3$=HPgL`bYSouvDM9GA9RJhE^21PyUJ< z*Kz6!MsFx@lQ|Qew!l)q_iW9`J;-b#|J0v=HUyxuvh)U>*k@q@v!(t z@JgyaKXCsF4@+MjG&`LGcee1tr|V{DBeGx$|o4p+weIVtOiHP96wF*kFz#z@4y9u|By3>|NKbqMv@B+c-hpSa9z=e!K0vDH9`jy zTP<3-O&S3OACt zpojgSOXO|Eei2=?#Cm>FY(DTx3&YK%K9z1eTbjxkk9mZ5?3B2^M2@jH%E->)g3{FY z)x5U}Y}+zjITI5RfV>mM(4vR5f9CB}4VX9}E_g8eVf&+h|FY`hsvpN!c({vzf^+*k zmKMg_#&w|`FHhp~hKR5!vt?%sMvMT{2lDj-O(P^DD^zCrrP3cHQ9O=OrJ0Ja_ z$oC3%J0K25RlY#o3IWR-mw^iyJ0QYJl=0u1(fub#|MfxiGmX9x;sn=#wWKQ;Z}Kq8X9?y3laHh{y+ikDWXqW+anHx%1STaD z42COJSER9!^zeNNZImf(!i2bCmDy&r|8VzYg=ia0P*= zHAagC{C^-i_9 z46HfiQ3V6;jv)v*&IA+Tmlbd^>R+NJp+ADF8HULbBHWzWrSPx`;YgzGRN<-_Y8IZQ znK17g_@5@zkon&p@3P3wa9Jht!NHlt^29)e>fm+7tS%GixuAmn$t7DdKI;Qv;fA)| zruH^_VGhwr_bEv5svo77S@NaIpCzMM>QxVienKv;l;Udb*6Am3-lh@R@d}=OVOei> zbqzTDLfq|w6oQ2S4335uAUaI%;oSt`OGN#z`YTYDCV~%Dq^O$+99k5&G=x+Vs=&;ePopg>6YfGY+`P0J&f^B%bl>{&I=e2`xYTvaPAhh`4++Z1m zY#ITiI1VvBj@)k4k6Vow-9vz9kRe>M#(`Un+CC~%4mdgkr|TX4n^v>a@ZlMDUGMO9 zK#%eFo2^E@bJY3{Yhd(ty^{!r4jY|sj#_^uaT)zx?+l8ie2PcwC&Yf^MeXFE1Na}4 z3|s&+4v1P)(PtL5#^0z6*xTLPd$yg`en5$*1dE}@;V#g)d9uB?{cxd5ixO*Nx`?+A zn$N-BohW>bSs#*kvq8iBzZz`&N1aY%KLYU{Cf|PeiA3Ua1d64WV(^o_N54G&#K?@G z`(*D~ioOcKxPV^+e+t`d1cn$iSjEE3)nVw%{&2u3HG$s^{IPl5s2^ndjQs>~l|5K< z_x|Unqn$6w+f+v{`@`mOwvVDW>8Tr827F^)XxWXhZJA|@wR0S1i^GV)!Z9M1>n{}T zPrSy!MtD4VcZ(MMFpu*x-|V~Lom{a-BO101!9)AU!SHU(x9m|XP}m8W#MQ8eDLBiUFxhIX0#)*-cL9hYSt?rhoj5h4GJ_wZLGM(Fvi+;)?#|9 z1oZ+0aO{&1t7s?8x%{3f*oQ4UULmTmkJul>e04@=A~P}7n5j9rf&fH!9~@^{8-dK! z&{27!Wf4O|%X#&P3D=HNq2bv8Oo#M>#UQ6!7X{(BD*Y7V_a-4td@iAh!$KnzS3%U> zpoCKP4~^^&@#+x=Z@u`gxt; zEQ-VrgVzc1@&uxae^^%Wf!Evp(GP<&q+CWr_F+cHl4koDm*cEvnhnOcYa`WSdIQi} zPW~4cH(1b)2`quiZ0CYMY)e6I=b3FcawAQ3{7u5YtPx6{Q=!1=1n|v4s)SsF6ASs&6Z`aHXI>KkZ_;E{3xZ%W7-q zgr27I3Y#KAGXj#Z$n$I9Z^Q7pF*xZA1-{$!iuzL;td z5tmbgPmFEdCnJWynMPiHQpJHdWK-tc1ZK_$mxIZDN0{KFG`o#tL9g<>ws&>ns01>m z!UFMwDfHnIg+xWis8S#ptR6(r1#QFxKuuAEn$>x1f_s*-f8d0YREho~9L6cOIEC_; z#5=dZzFWG050%>r)h4E-BWC}l880Wzuf=wpu}ezPta5GxrMk8UHfOLPk^wXrloLa; zyD~q(bSrXNg_l~5mq=`Q4x!s>e7%bonfxleSZ{Vhs=;4l_O|faQ46PkG+Tmko|IpJ zr5e4Eo*t5HOL3w-jFX;1lGnN_r$o#;UasPhLk*eOev`3FY>2 z0~ySGal9?8xO~($*O~#Hm~F2D=O>4MJv{p6uqy-NovLw~wS$x6@J7WT_1g1;#y+bW z2o^@Ez)}6Eb$rxfR^MMDemp5$&NN6;FxQGK6S57cs-!nYWx5;xC}ay6tG5GKc_zxK zLu+@FAe;nseKg0t)FQ0~P-Q50}}KZHpTB$DPJNZ#c+pVZ??j`2wyi)hNi@h^wO zvWo)fqApkm0DCHiGeN+EgCnWkwgvV#dJV88nU z=ISI^@G~fkxX<{u-#;Uvx0Xei*+1Dm7UF_L$xCa6kRG5@s!=)be zKl9~pWp$RK>_B?tKkZ`ycenZ9gdUBxM$s?B5lV2;dBcAS#^XwRG-kD5Z>vUps_eOd zmR};fF?Zj_tM(1HzU_-5!#kv#@5Ynib@zOL$na!1dRN-OXK#3qo(di70~KC&*DUqf z^FB}gzuyhOQ_O{7Q^-hUYEcl|#hEER-;YaVMO!-VRseE}^?J*CR*G}UugYJjwaPnc zq-#=f!VYiWQ{}{xUXO%A@@rM+R4H7I?+gUxZH6{&s zZqJ9^+spCaS;8X`%jj@v`B`;=4?;v2^7-Rzqj|m&v_0-f#ns(Z&W&%IFS0lIlk!X& zeg5UR@sd)q(|qwl(2#8C^0{Oe$lII@4n^-=>Uk=u@)OE9hIb>xR&k6HuU^LvWvJ`0 zvp<9D9{7^(yfIv!&w`#fX&s1d&>o;6A1`&--o=8T6j&T?mEn-9Jc?7OYu>b}-;R2` zsZqosB2!~D%ha-b$YInF-Hq>hSK=2_F;S8dUSB|Jm!u9e3=@j^s>^Acm`#K+29yIM z6HIo6GJNi|@ZIDM+9}^aYgpO|mAYf@F&5DS9i$4j8Q0UX7IVSXFW(W}8 zq@i(yO^Wh;?c)`ufNP<*O=;l@S)r&s;<%zNcOv)T;%bsF?oEcb_f-E(&c9@p>*qW8 z2O;~MKLE-@gfkvw{8xMM5Bt|X6h;Rg&I6p8R~)@yC))hmor$UZX;amYULT*JcrgFO zrhPNHzIu>-GdQ2Td62#8i#)``}y;(Mt#WAq14S?LFEjgj_zRawLV= zJ;ZwFU?I@g?-*!Bj8NE;ZS%Y)NUmZ7_W*|jyC@hP@E~?25(^##cL;rZH}7n#8LqYc zYE}d9J;=BKiFe~2LcjBtYe830bj#6*h;ajK4;Tt4OhX>&hV}UDGm*XOyw(koV`eTg zYlq);JGGbj7rtCPt&(DSD!f==oI$Ovso1ROzExhdVuyI~D4m-)>>aWbF9vC7{{)Y)BfRN|3{-KO0>el|LOu_KZRV&kU@9OUd>j>mn&8@gfma6>>m zhNcS`I^GsIb8>~P!NXLzJ1INj%)Cwq!F`?+!=J+5kqq#6`Fk)LO+#sJ2VK4NZ$)pZ z)*`p`^nK}1v@gY6lP7T?I2UWD#mDtK>90? z{c|BLa6~f+(Y)Td6!lVxs1s<5D{9@S6gd47cBR@Rh(kLOEdq#NWEH&oT*^`KLrz8e zEeQ_Pt_ENu?EgvtWm_z226AazVhd837tFwLhD(N2vnhu@=dbv&Ev5QlzO2IYsW*P5 zSlpa?rUZ_Ku97Pma#M$!ODNI(mowA@S#E?`JXlH6^?PrGESB73Nk!6g)T8DDX{F=ed&D4rEQEc%o-C-}>hLG~~^z0<2D%zOx#6Y~M1U*AEBU!dC~ z0^6L%O(x6QxK>ZUlV$dC_b2UBywbp7*iN%9ZL>HCEh1Y+ygu`CFzcPPE1>O1WeMw> zVQ}jeFR>(|ie4LD;efE{`yppsfCN;V?MMFtL_f`K^%m77ZakYuFF=$^D2-Ph0C zomTVkB~xsY(+W{G>W(-77KO?5oMs0QVsWkh#g!Vu$KD4-P^Tc$T;4}5! zJOYLeB~UQvW&dV)j(>}F!xfLYKCb^Ojq6X|Ntn#NdTA?@iSjjx6TW<)`~uUA%@P<| zB}Vmj(h872`wYCqfoRnz96s|L>rLCs;Xu1#AwXbT)0@myOp4tfIw9I)^l$s8G|>~m zp$+!x-XhSt>vS#rpq9}(UUQPZWz{4AWwdV~Z z2~i^&tvUkjRdeLvP2P-#Z^zl+a$+=oJnPGK3Z6g;%LPN`uuG(hW*4>vZX+=Wt2;h+ zQGH-o-Ynx3HgFggF;e_b3I6j(@<&8>y~qGNN3dc4nR`IAit6!21~Qnt>WUxe3%_H6 zn>zeK!Qo3Sei7CnJd*!a^^FDuOdhszN>T_uwA~1H?EjoNa-^k#49`#DrHh5mH5Ndk zpX0uce=ea$A5#Xz_09Pb4Mejyq=b|RQCMK%x&J96PGg%^bcV#}Tiw$$ z-vq}lxvjCOuP&@+jttE45*T57g76Z%wRRHS2HCep_x0yTzdxjDGr#Q=z%N z+@>VE<9!y2GISaD^j#RWiej>bReS1wg>k_B71l~a%^-yF6$1&=9B)d{%67bN(3!{? zjE@DZ=kLI!y4X2<;B4HNZL& zR83=6*^B3Wm_*XI*#}w!ma$pFxISzZp200cN|-m8`$wE4aYk`s1p^ z_Pq5Iq(~pxBC0V3@b-P#KI(F~5;Jnmh*HzELWJd5sU!enS%y9nb(&Du!Sv^spbC3uOEPSsm_G>}L>KpqR~j zGV4NE4O{rD)$9nzI0{E5GV2^%=ISIxnvi5+Udc$P)4tNa+d5zX;P_Grf`Zr#cEu>q@^g6a# z=U^vi7rk1N)ju*>m~#a;cQE$Bs_-(4Pf`U8=JkQ*I7~Te&~C**ujZS<_((!qy?K0- zV@9%y>5ZnL=xZ(5vVe>@N@3(>Q8x?9HDYgHgGb`|)Vx-H4wK0iv_(eVv8;Cu2!!H| zF<6B-Z9FWy(Zf18`W)X=n{ToO;-R@XaXD{16?To9UF_>Sn;ijrjL|uWbm{79liMX( zg~}KJl|U$=S6p7S23!xuF{*vwDwNOL<|*6&*$2}yrN!*pCpd(Gs{=)1P22A=e(MZE z0}~74xrAR>ybh+u)1mFBE`-{j%5n{8FR-}7FgqNVS~V8-%+Dk&Vw|jXFU%uVVJ|qX z4kZI6NLu3fF<}Y%DJ{W`i>uz{IQ#$pU-T8{HD3$|Yqb=G zO#VHXb=>cb&fZ8tf&daM?A#Tu`F#KN-(fCQIrGqkO%^^L>wP47nV-Ul4z07jxB3+h z1QfBff}MEAajJGv>Dn~hUx>n6lvn(~`iek%WED9?f$%?vJJK{MZ;@TW3P(OnAaHhe!5$qf5O^3LLB?GuPr?Ox=5y zvo8)6qeEa*#VI-^Yqq=1!*-{3SZ^G?0AoDFnO?pWrC=+#5H7KIEomM2e^(CR5{&(B$x|s;Vwgbo&#T9HUZ$^ z;b3fT+ML+gptvS%xIqHE8d3ID_zVVIfYAUiT=KaX=>bI3V3-5=oV`t9>-xC}StPTU z+3AbR?`OE*l7(GG`OV#T&d4id4mxb(Bx1e_{#+L8U>}jXav19WXYWm$+c>hc(eM2$ z5PBUWy05rtv25Ax5k!JA#uUK;LAgCW9So2JDZC;9Hb7dEXMBJAeV(&qW)%uRVUyW? z9nmwU$f~T9C(pj6v7tnTnL!z$=hBLeg5{j+U{b)eOnEaYNSFwQ<5G5?i0k~-lK5l^ zF%*Lu5Hnz6m?3xFt6R*xS}c+;yY3EUF(|Kb2@T(MPPWKxTscst7{!75lmmdB3hvAr z4A8|U#gVk^*o&lJ$`Ztj7v142ZoAuym2H0Pj&E2Cra#fFM`_19x%7G=&#sMI|2H)P zeZ_HpX#hd?;;zkz@lvwLFHDy&SLF9!V3e80OGXx1t~QgS@x>{1z#8R(`oS7-MkR??VSL9;Q$ISAh=;XwyX;Sx$v z??^?RlcZp7f(S@!>;#C(##8MhZ#^UC?BGD&+^mXGUR2-|95yp2(qIeXOBt!4j!}v+ ziIqnZVi~Z#7e22qiKpq+Un7NXg_U!@f-Z;v(}I;!UfZt80ajLm!Mz z$wzA6TOu2!vb^UXqXniL;L~ak(2n2*>O0hY)YbBOBQ2gB3|Pp*i137KaJRt ziK|%PL>>3Qbo7>Ha-!S?7tcpL2q;#J&EjH(4uuJaXsXd?5$7!gGBcVfMEbyHx@1_e;1jZc$wg30iAU&=g^wvDEv6u%q~KTN}A6-^-CGbbff$m97ON zQdXXi^#O;OdIgT7N-fD{1#L24UEmlqhb>-Ih?x*4gKX+Z>h~G$(y=*u>j$Wu^H-9C z$d<`EsE1b_797K-XO|l4I+P80M;|>*NmOZTmAK=lKA1=T5DvvxV+);yifz0SjY72; z<0<`S&ac~g{`Siv)m+SOX{W)rBLqw?i$n}weT-k%k{HgK}Ol#smj&m!prGyL9zF<$=nK3kg{4aVCIr4|woo3)> z7!at_g#sTc43VsKAAuF)ANF#k+@q{nki0Oc0l)HsQ-~5l$N(VzkH$?z|F^#y<&BBU zYE){>vWLg7_I24=R~>+T&XVL~4ql95ZQ)|k+HP^eVlu>y46qST zfxT8RW~Fk-S=u=27*_)E8f*X^UlL9lUpDg@*(%9;pPWFu-JK-t&s|gdsV6ju4rd zmydj}i-ySNZZ5qyA+pNLrJ9*ao<^86M%9{0wrH$9N>0s-l zERK98=8f2l?8(#YsFVFTMlTtziy1BxC-}5lCARswae%H+N&OeaBBoV8R8RmVg2?mkJ!U8E~MB%!>qldoC=P9k~oVxJkMoCTy9xabfSzfep7% z7e|J#v>0djDs!TuY6kZlm=J?{aWtr1z7Rdg5_2M8k2P|0>|R~L#kX%Rn0|T7y1T939et~>~O52U@Fj;Itj!5B}6Dd1!XLDf&^%P4(Ok8VGyu_8}M9Xg2 z))cI`>4o;1PcXbu4$AP5S2-e{KjbVhugp{$Sd^C#?6!q7cv9EFT}%7#UVm`f#h_nw z7Q%&6{xSCjm-%s8H%9eq>8Nzs`QM~D0l(oi5`#C?86)!{yTaZFcL;;3>1Mx0cWtie zeet0R*s!g>_J!@MjOX^6Nllu)X6Rh^&l$5D%s(E;co^`6wK7Lw5mW?bVejI?8WioG z6@-QbCI?2Q^j5-pIx$w`D$JkILGPeLQy;@n21FjQAzU!sL%q0Gry+uzc^@&y;Tg)+ z@h&U3I15e}M2y!q;sxr2HA?s!9-0_nGqvClPF_<( zgj3hdh8ZhU*7WG$^kwsL#;Geybg;y_Qnw!XY%;ta8l1YU8%!nFmC)eSMb(J0(<=7G zz#VU#xTi?ZdheJ1drnCPlSl*+6l*+|qqUh`(ylC>;m%Y*T4c+lNee>4enef7zM4u7 z-l79ZYVy-*RUw5KWpS>tf>zXE5y{Ym0-kUNFBJ%FIK(u2j7|m{{}-mRQEtj4^6(Ob zSD#%1R{JZ9239sSRWO*kea3lg#G&_`iK-%6B{5mFOo z3aab5_#lpq_dvwwEtVJMM@Vw|oH#>q*kCMZgH6ORCPIV`k^B87;w%7WeHQr)3!-B> zx1LChAjY+R>7!4BkvsO+$JUu*0@m}-sT#R^Ku&9N*_@L!p~w?8w#QLdAeJtV%WJu% zMvGGs9G4FFoJ3EOS|Z`sRe?KDpsBnW@u`2u77yK;S_38dKnm?SKO9WZ0>%Pq6w-d^ z?2!^Zd{Dn7i~Q!u3ucNEZls2Pb%Lz|iB7aY5D7{#JDFg`N(zIbjL+O)%~P-=*@(*D*1gFANoh9pc-YpZq!rx4Ts&+?p62JyXode>kw6b zwjS<*N<$SQm~iu6{|Y=69x(x=Ma9t1GId1saR3PpsQW{i7;X?#Y>cTK^y74AWrC=r zV!_vwjmHx)2=J=`wzUM#oCL^M98vOS3N{*&fGl0Gk>vH}DsoV}K=EBrKBdqU6gdc2 zj#f5=m_{~{t;-k!XD1N@GDL3*$U`3yp{os;RmV)}G)7n+$7l9I?(pczjie_R-PP1g zqyw|cGW=EL82zj%n@bI_{g=%#`YBGyFBZv%DD|Zb^h^{ps@|kWq^O9?YctVr8Lc`f zlL86x;ll@V)0D0us#22?E)r#K9VCXkx@H38U=8(>xDt3mtzt|KN)tcK1QF+>9gS0J zD9zx2w;>SABFmhL6^EIc`pM}PEg_sX(oexUm_8sYqUE2wCon@a8V`HveS7(0OU`yY z?I3FE4}=Q_@_A}~>6%Di2V`Ayv(21$@`N;uSOkPqAH;bR)`h z;|f(;-dkg6zXgbNYcW|M?PZ!Y>AL@L)@fNw`wKc2aG=K9X1a zy@$Ld`RwWrcjJ=V+`M)uQ?r;6H8+XnvL(I%Ry=!OQFQuCdYO_)GyfIL6q)LxF};*D zGv_^#eH?=`Fm;Q>govUHFXZixlhK)zq5^#4s7AK;i&Ik8Uox9JrZYrpSd6+h-y{*F z>FD6-{G(ZukI7jW4tA5*h#})I|0YRzhiw>&X+wl4g67dVl8r{yLZWtt6Z8+46(0^- zriOUQN5jNe(Xps%&kiLdkKis*pjISF5=+zkg2q*yO#+}Yl7n*+ybgnzC9|hsesG}5 zJnR5C$|5p~-q&uUt=fVz>W<$_VeX;s?8+O3ELQXFQXDoa6xYLO!$h!(G87 z7f)`N3sDU2Hf51yu*tx8q68j>nmivf)FkYD)F6+dAUsrRjG7&i7QqIMgS&x(-JLs| zyqtEjDFOieraGu|B^IRgdca4v^Ye-4%A8?pw~>#tX?cG%EWAPYTfS@`&Ik}SK0?Ba zd9RjeWB#N`Z*o0va2GXw1B&V0c2P$YKM;TmmdyW}CHTerj;@FQers27vXzD1mzR1I zw-4BeLdBSo7g49JsTmHkENYOs++&qlyP6_*E!`0!cKCiy#nMPfG_0Q-`m6tOhc;nU zecejIQ>Z_S`?WZ(m=$WJLDOKM98VNAU3TC2hyz^OlZjt~cYsTF(_D%n2MBZ=JLFlk z+5x~mOd#T3lEHTwj0RNVoAvXlbnZQCO{d?K!Aj0D8_#YfCYMzi8ReKL6-I~_WwJ1? zy_tt$tsXADMBMflT)2qH7Yh{$fC-1kSgb<; zF(k$st|UA2ly{J2Q;q>VY8OBGYGFU!9*uKZv}jk72URCYbDvNQGNnxnt?=r6#kai! z|MV0Nj@SVDS&_QD^F)=lE;-ZgX=4f?^KE>%qi>hqb_}I1bLVl@nKmC^n{)TO9HGE* zy3-_gJa;H7s^I}T8RiR2&!mtty_Ub^G8Ov(t0mPHLc*c7g?z!Vg@lmBevnZaLd z>2!zVd@gw{(H&D!CdH$R48iw(MlCXZ7Jg2NK>}xt zLVq)mA#U2aCMvJYEzDzihdI*HJ5TdZOWpnCoy&Ri5tk$`sXc5sc6ViW#>K^F7gAdK z)@13DdyHU|+MPUJdYc8!P0QV^e4u|Jv0xNp3pFmqZwb~rnduGsBv)^ z?w~8f$g$ufbn`~ISArJ*PW()fq#H$#zn85Cl}z_scxqbr@@)8uP%jlZaoHkdM3onS z{oCJ#dg6PkDw9&M@TjE@Lk4)Ppa^f2PE>|SKjO=h4DfoscCc-hiYEPv6dF#n+*$jV zHQYyY@_Z&34opoMq?xTCE)e!OCO?&D)@h})us78IApm7q)CGM7w?Corh$3{UNR?$v z2Npip%iSnFonq@S~Bq~7Lg-0?77rbEG-XP_=rL~PNq(qyXCZ} zQPVuM2B=Ky9*0UNGFRf$XGae zORg6#hLd>mr`j}P<-#ZDVeG+7@FdrAg8LJcg_p63!V7B z^6vKbX82-rvs_!1uS&rG55%U0PQ$OIZU}cG4>7uGT|aA|Qza^Y=f#k-j)nFwa68$F zEuU>WnaPj2?aVliIA0DB;#wX%{xG7U1RXt zm^tkvpJm>1SS_^kOBTQ(DmJ0hI>XFJ+sUPCI%L^SxR|g;MR0+z8r#RL!$1@wL4SOC z{8eHj$POqGXDh&|#)b|DP-Co8?&2};ct-Zj7n25Mj6p&Yt%Ld8;zo6EH%1q? zPN=RnX7PME?^I>~_{&(tQIVQe3(j~Kq}-7#zssDyc^$zn(^IgC+o)VrBKKR({(>Pq zSHsR^f@m$=%;;yeF} z363;|FUt2=h{ z$Y>8<(|{DzWFF*{6<=OIy7=K^M9H|rHxaD>HU#{Kz;mEg=D1nBKe8 z)_|}K2f7t3ZGwzN7`~VgCUXF!zN^j!<_3WX*a+C~VbbRpvK!oa(ZQ`wprhp5ej={A zZGZZLur2PyP-OVWUYhopIuoW?Q~|kyH9uuTA|$YWw9KK$SVllru+JAi{*pt|jhRAi zX`TesZufAmX~IyO;D|3qQg?Vb+nDqW9<;AwDTvUeGE&fvKMC1P#e}XhH!Ae?Dbjxo zP2_xyK*Y1F1dxR1hY;8>G_Zc#l^b`w?8FNYr0R*U zdJ7>OG~invpC(^S-%nvGF{#3A-Nhve%&M?j5yBYIEI*Xk;3*cN_*B^mud>T9@lP9F zma^BdruflC8*T=NUre!r5qR=@&mc}dRcv|oVSq^;-E#K)Pg2I0F&uqb-eLp#oSipd z7b9v{K6Q=MX9c1D%LR9nfgzG8*}(4_|R(X~!WwuO0o=Y9nEx2eepx6YJjb*0$NMjM(nhhH+niv?3BnD6&NdohOjKogjk6S z6^Wa~Xd5w7+VXjc+j}-}no2H<6hJf|Qef40dtJ7{c7I)qmStRQ2)kvuD5Th2K3 zZ_3CpM8B@OXWd(Phf4P7UhUkjefgWt5Qo^&GU{}t)PV6R66y@3(OaK(G?`7h!@7fx zKAKq^{-)g{HrjU|`)m?loaPa*aSeMp%;a)ROu&Azt(q=YP!F0Z19sjR6OIg_JGgoV z-V|F5jSoFP#IS?eWh*)!ifhXk>jIsc$`w0imOL(OotYYi#l|X^v=vy2Gq&tpp4P`8 zUrHt_=)VzH#LJt1l7A(c9QoMH2~}N1m={9OYi#Y;N7XqQZ$@lV3**@ZmoK6qd zOC%s7W%l9EuxA&YQ}$f@>*$^*Uz017J=FX7jN6f~79ZOj7xC_}nQ7u#ObWjz6jttT zS|4UrsUh%<@TU*C@H{0W;Ec;z0@A62zcLEzdj=APLyO)1I(G)rH!(TTT?@C=$Lxvh zVL@zb9<0C?vQV%?S2`gnwv6Y|;AKg65Vp#Q`Cx%W9)<$J;$lCdrKK2GH%*z8<>2ZD zXgs?`Bo}5_ao1>3nl;YE$DQMsePgR1-;`;}vX8{8b1RF7V;N=)`NVB1m;|Dilvrvf z`eVZSmhJN0IC`dOR3mBhVyOt2o(_e}JOM78gOXbgym*sDG`<-{& z@O!yRh8c}ZY_qK(x#U6nQ1K?P+QIa!X>>((8$g|?Rd^hT#>vhpm`MzcU?MC@ z8)y9mCR*rO(CTwV=s{o#|k(_570ykPblX$D*hL%8-#05z(-frmyVA4^E89X}lERq!c z8Hr7p_*syqApQKyMJQBxYR%M(faxN}Q}uxsq7)Sq^zes6k(M+wWdad@kqA^}aFt-T z_0*j3&x{rIvvik&+Lzb+qEZ~_mQ@juDAZrf?6ky~82z+1m4#__Q@4tYU-|wQ@6=zM zoR-~}FNmWi_2W)SU`0*&Nw&vLZU6eLHX2SGtNrtgY!FG~wYFeFGhpQu7AFpgb?EKO zMdBvfp*l2IL(J6?D^>sM=|1;O;l}zY1$p_9J}#t~T=*>Zn39iq7Fv>|!ibW!hlw!p z`Kc_n6Q7-;5TkXV;U@~Mf|+hE8dB(8^LLw$_vujx~EWF__9Q?w}Kh(;Ve<%4cVk0Dv$c4cS}ErSzSPS z;5Xl_GvXZL($*~?XJ|)DI>BaP9Urtg|HH5A6{b?S=X2bps?Sz)cv$*bIm19rxuVqD z#)ca{Jzf@o6wnVqqWFdaN90cr&EM4oD=J>{54osvZQ``S$Xln4vQ`DtKUT~s;ka-& zq#3K%`Dy!c22VUQcp?!zwX)Lifc%rH$2c~idyX~5RF z=w2cMb6&Yad`F}3c?sfZ!3|S1H`u=yW>m2t1Dwp7bdg-lNaw!f0KBviSv)*n_-}u= zXU2*hdlJZ*N%EMsj$hniR78v>*6JtPdZ}zO2-RYau!1Aa$R-}A8iD@CG`7j^WYj{< z{5`qQ*z^9|(@>ru%}%{ETV!{#1l|}$XqHJvC@Zu3oPta?mZ1i%BMI%_UKsFvV-8f6 zAAS(ddztpQFItA|#8`AE%T9VhwMcWwK}h_Jc~#@i%=G7C%4j@DpweX+Lc#2q@@*8- z+vv=U@c1Ld%`oplEJF<2A6DM=uh2vU#0b72HXSJbPFgA;KmA8HQ^IntKgSA4$I&#x z6N%^{FJFFnXqrZFsSV~|_q_$%Kr)&Z@{=BvJUY;t2qQWmGu7=V=-}uf&nsD`!Q-t? z-YgK3OFCo)+_Ctq2Qa1tFobe5$P`vu zCPrnWMOal`O=P0g?YcAQp26x;LAMb)}Bk=?q(s&8uwag4>v2sJxV&l(r7^e35kb%-hE63c(` z(^Jsk!Vfv%z~{KujWt-vh@PuAfkv>M+;PouC<@A6>TjMBDX2}PGG~TF&@wCJmc8#m-fY3QkLggq; ztrZ_h2|4BjQgjfX7n5a#-dMUu<3+bUT!vbeGqKf*C_1QsEDiV2cdMbZQ9?$_sC(Is z_et0jYi4i2`{X4_4}_kGg%>aUg$G|kZhdBot|}%=(sd@UPW_`qy`W6#0?S~oBK(il zJYw4cf(XRaB)XH63X`SDhVD>~ata2csuF`!;6CNP&%B>-UWp9dZ41qWz?oF{I1N>` zFVDXDw6Jyloy#hpf7^Rx?6K;3}$CYi};#2wtgc1x!U(;hx}9gwXctw)thIBQhWmvY%;IJS8?1fQ9JR;?l4 z*x2|29~@TLUw8wXu?-cZ!#wHsoFdT$k_sSMWf0KqK;0m?3M&(t$LO1gm+#r{>pNtc zO$hPFSmV!pfx><~L{7j#iQ6;EOewch@T~EkPL#&zKo-?_Vn75_l+j83oV@ z5K{1S;aiCt2=(G@&SG+xK?L1U@QD>|LZUL>1JB46k-i#QdAR&FsxS)%Ru{7(PAt%r zpUeV8MMIC%M!LOU`tLo`pX|li#X+9cKS~J9K9w$>W;9lKxU>PZK8e?O8DBB~nsC)N`C<-CxDHh$7`-HB8=MIHT~qKDEYqqS73tFNj| zM3EjCNm5E2gELvMNDaSvG)~7s?En8nhfi6UI;v9$8R`Xsssid#1NP! zmJK+q6yphy9m-?!*=bxAO3%^Tba%Q8%yfsoQ2!!>7XaVBwzi7@&0(ivV+pO%ifW9} zfQ-^i+IQ5eCC)}i;>)%@kegiq677r|uCy;21*HF-m z#k@M_cCVhZ#yP8AKxp58Qp`&IoV<@v%o&1AiBU_N(DzMyLI=puI?ThP@iiQm+Vcc` zbXr_~IjLPS!%PU!{YpEYsMur+?tboRSz-4XB-8_a*h;ai2GZ;fr~q5Er!bR zK)`cG3MTLP@)?r$x58p>7i220{V6G1?LB0>zIb_=B{xLucyo;}7#zcMge~Dw-F1iW z0MzY=4jgx5C_;=Bmj5$iPPjYI_qXl$;7bHRPG!JRh~7v}7DI+m#edfe%62Ss?&fEN zPO)8hQVjl5nH1(%Uc5jG3Jwh0iGIsfiaIuC75~^JSG?_T(IPrpakwUadBSIw063-~H73JgWD{<=ym3LKb$el@B3fOEZ`$K#1^6jD7BUL($(|S7E@&jI z#~+IJY<_+VtQDTk7`bEFu7Bz)qvY(9K_$|T4hvKAb_)`Q^xPLw z`C_Bd{!}y@Eh;t%he?>7tpiGNP+z#pkmk7-b1?d!x#TM3T|tpkr=*3&Nh&i;Nb~oK zC#8X+tp8^nNyl@zBD}}UM3)<#QahUmFS#Y!X%a;d%cMUCK`=zM4>?rR6e24jXKv*SX!i zZuh`9o1Na~AU6CkMG;n%ADAmnq*bw|o%61v8NKcR*w|@eW=v*Jhj@!yWPab?4?L3| zZ4#-?A~<7k_yLJEHuo4Zof<|*r}&B^2M~YO$c8lpjJ@fo)EF{fH5FM#DEH>lBe65X zVDpTP5x^gD-gZd6;m>mtJ?zo&T_J#k_+7e|XsTLhM7nPx?8UZfDXrQ$ zQ%lZxkQ`Vo>rFYz$vd?BYnHf2Te0Y%=iKG2ckC3Lq}<}PyiLk-%iCd@JEl?*U`B7T zf-yz0n9P;qdng!YwdLrjdX9!K3dnfe4w_r-vbGI_l20}L32y&51^RlFF*)#Uc zg=K<}$dD80V{Aah_g8fFZn2A0T2s_)RJ(t|fLj2@DPfg_90nm`G(Ma%M`*-hS3soB zaG?q9zMkA8bFO_IvLGrSB9)rNH`-@?jZaziz>X+azxfokS=@9|9?BB>PR~C^GSdyv z%GSlMDA>j6`^>cL4e2P)B)%f-MffVnvlUIypS$`kiw92o6?-?M=SY_%0_Lek4v~9fdoU zvpP=DBMQ1HVN62z#ag;3;B&$)j?(K9Prit9^?otXROLXnUr<1<~*#kz#JbipDbQ5#b4)( z(rX`$@n5`93g?BGwwYpuQ`#p)DrXq^Tf#p}z|!;#4h2Zy+id2hct=>05;Uhj1=ghO zDz}|qIs?kfe+p@8 z|06UH6SA^20tK*?u5WI^c`_d`@w=xUly7C)NGzd6F%LLFcsVo}mMc0S-AWZM!^r$Y zY0LAM6+aY6#N*Wc?pT7g)PCb(;RehKa`uBoT2RAkBu*@7>&>%y(n$i6?>>}+d*fnv z;6$PwgYdzI_R~~M)eq`5-EkQ%mhgAzt906($Ls-eY_THDM84f&xr;HakHyS0syq|9 z6cZi7xRb!C@-gAYJc~Nh88{i9^Bpe0dIH?kk&()H+^bUhl30%m!ehq%l>5*=t42(SxW2h27t^+}}iV!GhlO)xQqp;3B(BBCI! z#5G?6*)gqGgfVHgo$$?K6N;-%*@wqJGVOoKwopV&GX*z__k6~Tv-LcJ3pF5NxuSha zM!;cGNu}czL=?GIjPW!5_Bo7gTz(K>ojMfHiW#R3z(iR|0C8dD-NNSR588uI%b*P$ zf~~e3)G2P1>(zSO8j)M&Rf^!P)=%BwD}J?vm4yrqQWUyvEYazO>YG=&g#&)MlQQ2qCXFEX4QrM4*8+-y2N5@psH)DmJdQqYed z={P1d0hCxID+pIb>KqwTTZ#6EFSbyIRGDIq)To`SY-Czyl)({)Rxxq^GNVNYIVDjV zMZsnTGcN|W=ry7CJKSv|%mt3L(mg}-*u9bBK-6DPRS@TN;Cwf1G@e}4PZ zpEfruHOyNmSmWQn|I>H>&NK&~311q%yYAoMJNWINMcn9UG@3}biwQ#;-oZsaM^Q88 z_F+WDRsZaLnKB-ScSF`+=Tat@yhuc30moi^ck?}0Jo-f4g_LYp?!ePf*yzV86)QV% z7ve-T7;s1&bYJ%@3Tz zfp5Y+>0TnP*ynFCd{K|lzQc-x{t!&{XYt9vUm-Fd7uEgC&A1yCm_6ZJzO8T&TnD~i z|BT9#8GuI>NdT)|*5)XH%GOs;acS?LE4j0gjSaiMW;Q1OHq}r-hM9e8u8^NU{e+pK znNOIIK~57WIO|xGcmuS3r^kw#Iw8{&o{;3!M9I6-!7xP*5irbxJh-}?wTvSnVF>Cn z#Og;0v_Hf!70YFA@V>IW>i$tpKGPLI^*f*uByld<-777Af&zCY0-=CO1-i=G7vLF) z6d_vt7rKk37{rwc0A=GQ+Z@kfx9B9*0{n3o)9iDHz}T2HnPX$eDnNL54Ll`$Rq#z< z67(&)*HMB4lhewdLFNb(^8xA{GSWWNxVT^;&BdU9Z9@`3>G}j=m4OPy#3oZ@d>KlC zINVhzh%Cb;GGG`*SdEW1(D3L5&ybjz!<}-PTpXtY7&$ z!xkM{$w&|?pXUS(b(7{njZ(aT>qyEV1(s{Y<->AN!_|Hl+BVEk1VTCBKfE@niy6V8 zbY11k2!T>ur&K{w6~YkrhKqDnUj>h?cXR{m0}h2u0zyWCYl)cR;%qdRk7GzA#NVi{ z;JKN)$l5KDGLpe2PW6;KTpm%E%6HxG`GxN`yWgXdZA1?71Ctbsq9Dp5t_4w~d(4o? zZs!VS`jRN)To(IXNW(BIt`mfIt9h&n88X|Af>AV1#G!5`C#!-jE()AhcCitTOVTb= z8@$=Myt`^61@@6`hf>`E87a8abDp1VJgFQ*qu>{pC$cPD2M#bb zZI?5bZ!n{yGXRaLnZCmzkVBT7-0~(ZtdWB>OTt+mG!xvGqSo#9ST3T!FM3lwet5+& z+5hHueg55nK{8J^z#;Nry9>F=jOHdj3p)eNmk{ch_Hf6G8LTIhI0V1gw#YJ!84Fjs zwL`zsVn3b%;#)B72Z#pwAWAGku$1Y@jSh+!kFbh|w-|LU283rsd@`6BwYs@voeTyH zOS1RBZU0?;Y`A}NX)?bTwq^Q4L=G^4AS{6eKDvY9ZRM(Sf${DEA;WJOWVjsu?QwQV ze<`ji>rr~a@|Ev(@O4hz1iFTBXLfPVZtQBxI78lB zsBhyzI&HitN#lMv)C|~mP#{L`)rpiSM|uUk!;d?qRQ%RGtH@Qz`QGHs4l7$WVm%P4 zB5PRL7GQw8>;5kw_UD|zjX=3v-wY zA`YUhK*EW_WSqGmF9nH)BSZKi+6r7_IASiC;qiy9;GJRj(pKnZ1d__nMT`a20Ex(& zT{8V)K0u=eX8Xf@_``hYTz2QPAC7LWV7Qo7BvCKbnJ~yk?dF*{b;y;c+7R;8%r?X% zb0=d#L8y)fRv~V1)Z^XF1R@a+WB~eIF5IpF;XM#Xrk?hZ!c$NSN=H!6b?|ck(Bai4C@LkC} z!SDj0h|-{8wNEWO?DM`={`8@Ppv0pJ+-nAAB&k5_{sK8+zAme7JV!Z8@9gT1-jT*4 z!rwM2SI*%HoFQ5fki%=f&>9PK`}B?jCa@D+Jj|EyI!6B8v@dBO^X^u3hDmafnD}7$ zMkPRmu#Nf`^;J;F0$-soIKd*7&AZ`X6B%X94;&88FhCF((Eq>joFD2B&N*#f6EU#2 zGbg>Utq9_;d?9y~6-Sm}^UGhwj|1kBXp$Cf;FLF_0F}x)bk~R(ck>vP_}IO^yJp}b zvk2myIvGBVDxrcDMS}VlUxNqBQ~dC*kDMt&fGi5&H!^-m79HmAC`>@E{s0h^*FmmQ zP>)||b^$v=C%H$)iq@9{R$onsR_r?n5Ae|`BW<`A5ywd?&?uMrbaeRECowE{k%Zqe z+lc&2ra+Sz{*NhTlv^R9r}tnRB9bM>o{J-tuk`+(ZQfOIjV6FSa9-!5WTaW>#lPz3 zfD{CQ;^*uLGoK2$`7e0LUCI zIbB*2#4*i=pV%bAkXp7={;eLLfM9?haT7Bl(; zxat0=JO*9j>{NN!edu1kUd38Iq@CEO6q=I)NRdYGwT|ijp=AD0G7xK&7XOk;1}4HE zY9@(3u2RjYFqv1+6o(YXDVjID0cunR)6y7GD|5s;hyS=jJmHdN${25j9J7FVX_lDz zSaR_m3Zn`(q=uMS3ldrty`D)_RZzUwmzcMJi<)2>1~DtF1!P&%LA0URdhM&5cWqq8 zg{vPCmR4_v77^M}8H2y=^MmcmDgN>v^)zwaZ`Dc}{e#<6R%sYkRo~$524#Z;R8oXj z{SWppnus7ynphDKPAR&^#hImJ<~TRFymD?#vr8(#43v;(mt5D_G&??bg~%r0OX^+M z4r@F6AS3_N_kXEuZG5w_^(EBjKq^!Bx|b-)gX4lsHTHlE2<&k-Xv3CWPSiRUCK*|~j zk40SAYW;+sK3%H#O=1GE34;yAXsnFL1z321*DR zfx`rP(1v&Q47lR|OiM|i;(g=V()HX^#s7gj*O0uzHECETsc8z>ISJS~A$CrPofF3n z2p1LZriwouXhfbkpKW| zk}dH@e^`kajwXsj;E9h#3BGq?m9a3Br950yyVG}H`*=%%G2BF9HA+nBEZWx?*q1B5 z1BLUTuXu3=DT}=yf}a-2BFQe2O#D^%kaTf)(zw-cpnN3r)zEN@&-aEn!$44#^~xz^ z%U4ey;i?XdyFFh=vkj^tFh7j)hSYU;CkIa1#zZNd$3TROoEa7)GS-3j+jVX-9ABQ> zuDd9)hAheRoY0UT@}p4uDzbViPZWrPEG0$pbrO$U=Rv?zbS73sf#{d>NIQomD+ z-+&H6vJ=5c8%cTH+rjbvzBoQ$lWQ6h^tVYHjznxiF0>^%j;xZ|SoHIFy{!ZTc|D8< z8vC*T1ZZ5@H!8RSKKLbg@nIJVta$bXMQWLEj9-)`(m+SD z?jys3R+f&SfjzN4X0YfRE~KQAo$(;4j!B;^l+dJ2`_>6r=|pI4?F(lbWW1d$@nedb zr3)`o#57gp6q9IRvYqWfgu!BRAVpZ-;KY|s`{!x%2k|kH!DLTH-8y)s_+5`ISCj!ml4@4{=tJIz8 z@N^x#J(Y`ON2}$fy+KE`e@24|<<7}J7g%sHzCrAiSp%&jB9d39L7@Z}`2Y?d!Eg#S z?l`BW<&Po*M^v?Oai-NB;=4cvjMOng8W-1kM@yLkfTxf!{)__F6#!%5BXeco5^$=3 zT>?ivYnG$%!|ZMkz+Fevt}-rb(-)(jtkgA3OSWVZ#{mH4Gb!bd5_4X}xp|M{YMYDb z#xZfCVI^ zPeX9Vj@hoUr;~%NvHlc3gjBSPi$mA(-JpMWiG{F=fS~c3pzCuKZml^%B5JrG96Jg+ z@iU8UEl3p3$vl?W4Vv1~V>Q1(l+R zIZ=s2x_vC__=8qCu<=P;MMi$4B^lbloJzD2v@0MZBtdcKJ%fQDnI1e5M9X*rvNb`w z=Dp#$^)44Cpk?x7mi&maROYQvTPtd!)`6Vl*JnKUL+9_rUV5>)$%*3^?SBk6`h&~O z!Nu8-|L^O^k1Nf+oeKW@8^So~-{`Wq19c)@bQa<#&JRcJ2c~_~TNLK^ifK8+R{w=r z`12m2LP50;8>)SN4hn>L%AF_3jhyvG_`3^((Bnr>9dTw6SH6gKrgwWUDnE68t?bJHAOgdRvJOF|ENOdAoF&07t{kA>cjKfZxo5PA*9jr?`$dfnm4 zCDg!8X2H|~N4pROW!M^b-9{}x&?(x}W;mTfsjqB6<8#ArYEsMY~6kA)v!PKb>W;j%N zXi{UmC8eN_No;7?Jgeq)*%G=PNKV3>5VF``{0<3fWXBe!hgGTRJW_>6p#{SpAhc%P ztSrzEni%;aAljrtW3~j#bU(OMb|r>2%+y(tV$)O691VR@KUOL?!8?9%jLb^nNSLVM znkDklT%1@Q7SdA@+PTKvoUD|L*#t2r#W;ci)f9|>4A&|6WE974N^ni>kMRY;;kT%kh0G_rn`?op$n#Gs zczU2Hd4?5|OhfT8Pj*E(xLl^;txy3tt(<^Xz$Tu^)WM;ZwTEx2_5H(Y^Qd-G`)jLN z-D#aPj$4Pvt%r{)TVH(F{?XA7C)MND4|cu$kF}qf$? z>=V_aqn{eh-LVh+&^T(1{UcU>)u`&*8>oxhpm%Wb_8YiMuiiM2e4%X$ zrY(~!=VCusVBcwNd1A7ez4a#sqO6n zY4x|Y6Ksw+7(JLWco*@f-_g>07?rtnJoujbV$Q_iUCnR16 z>8K0fql)u0iW~DRpnPQ594&~f$ENd{%;6bjhMA;l|egp zzn~fpHd&kGFnRd``(mauEjY!n51!=qlX#AAc@Mml*wR!@RAqRBz?*N!B0)G)xRCLz(ocQDZ&jtTj+Z>11rEoHaq#+IZLg_;F*{*)*GN z^K8>~f7sB*yW4AaZspLFoTZ;Nkd=`9?5JughDh@D!(X08L=~Ly{n`E7rzDa^NF=-O zul`x~{T23|C`&LyNW7cSLdy24e+m`4dvF9p>+Bt3pgGf+;b5eakla`wwlCCIz-^l} z%rHd>)3f@R7cRjyG49x8>QVu*MK)mK(bKywqy(e8y?$?9mt$lCCCqEMIPFnoZ|61s zfAxkSJYGLUdj=$~NAC&zF$U+*_wK~3*ecYdH=_$IZvX_Ur! zg~$(M%OdgLcRDwMG&<09j$xDPP+EaDheL2Vd1m|ZR%PumQsTWk%y#`ULDdSkDEm5T zq4pQvH20TKL>1cZ3bojbd}0Wi7$LS@fNKUSAYT!9W@RMOoA_ohL8UAuxVvnLL*ml{ z0T+ms@d#ByptGaaE_PX2=DFKs2p;rY8YB6$)EqHDoxr9ehV|VZP0KQG*z%-U+9-@x66*cQ7MO=K|1aUE#OdI<(~kgBE}#(JnTldBfixdWy9X_F4zq#}f>8(E zUuh_#^w*|NT75dYLMr00xT`YiY|L!76lfNY2W)L6vX;AGOv%DmWW_tgs;+R%5?>)l zOTos9(0kZy{8fTVV5$VUIitYtJ%zP<%4y9Eh@=tppEv{;^r5$-Vh<3wwPsUFKq!!e zq(g`Sy0I0Vzz-09wI)GJ$bu@^F98wq zuyngzC?ci?j0X`Of?qieePiw6cb)6+ceFEQ{r1xhlKE^G*+fdai}COHBfgb+NM|#? zpkUR%%eemqH9!Faa3f*2_}Jq_#plk#;*_e+2K`GoVd$oiag#I`C4k^IfI3-gv?&q& z?K87ORrU#Njx3_iv-B#WQAih6|M9oxx=C;pk z45AUMQ{jVd0;Yfx7)U+4XG%DM>s#MaSQhxj*jW2=e!XM?jDxsn55j8*HVfM;<|Zw!V(INaP(RW$O)(hKtd4w1wJL(gUcq;Djr!9GvH3lp2wr1 z>P^W;%U@VP0XOH@&cJVE0+!pS465=Aj#-qOc(R=_ZW3$!qZXF%Lv07Cc2a$XIB0G6 zAUDQnjmG@=@Xgt9Ulk?_oyL+jh{9gq`*9-08GjF1&j|3I3BTX?#)C0iij zx|eg>L0xJWPm!ZIQYdtR$uJ|dS);!73Ri1{mTQs~zqul8>>+L2IDi$<5Z(4{EGeLX z6bWmHFaQtRO<8nBKph|MH>$flqVc4O=}t7Vbw-Mu3<_IsOuh{;x@R?pCn4sZlRQI?9R(g1 zN(e*B{bqDWa2$IuO~d@G6~TvZ?AMQ4mfn1tWS??iA_fnyh4fA0HAhH{OU%mPfOi6o zG0_9Y0;n!+sMdnwufUW6$koHc+5u_lSrRe2Q&%`DV44286e1pE0L(MkPcqaF&)%e%^mJH ziD<+k2w;A@vi4+ayYfZ`b@MKzb`No|t507-8}Lt$F_{V}<}YQlPx+fCs7~nU=md;^ zQ~x)xoQwXLb4Edi6uas`F44_ExW`2bvfeWx4TqjJgCvN}3qh-2N&-XO4W#p*lL+ubg411@7Rm1XSXHksH*1qJORc2U|k- zWLLyWo2?_uJR-3ZumX%dyp12Ey8%Soxwt@-Vi}ZF0v|iIW{bIVqT_ka3qoNwOfrm` ziwBJ=po615yn})u{CY#~dl3FGF|Z7<$1wfTPQ4B=F+42f2y=%V9L%9qg#uLLQgzL|p#m6ypy7z`UGNYf%GN1dFz3r#I)5U=6+#wx^-M}DHTvS9}*VKz*ghr&z517x@jso^S8WQO2!UyEF}aQigs@MXML3UcyNld z)(N_~-oYxSY83qoGlnTyMn(g@hPO4NfZy9-1c=xVyp;xC3r0Eu%=kf80HJ6L0aBfk z7{!CRIMP>-rQAW34@1P_R|HVU3&I@5syNPTA-Y#F&EXr87#t=*bZ%g@<7*KDPAb(Q zA{g37K`3#n%$cE-gvNENvD4T;;-Se`kfOt&6JN+;z*32)b@9q7dKwg`d{Iia<00|a zvS9A_P;3QH$5s`#KRItK}lp^cq2PpDHGqbW=70F@w`+ z@LDBUIjw3nTSAQmTse-T$U7z2$thd%XAT)m9u<;fd5k;Cu^9YJ@*RB(QioU`pxOvG zECk%H*@d=~0h}Vb;f)BF!!ucjK>TLoY0UF$6+A|NWU`zeq$*Bv$~|WJJUgVNh|vRS zkQ@bCM*#qWY0KUuE!z;t7qn-~5UZFcQS=DOCYl+kDWJ{5L&zGO;Sx}bwLy*oeQSOd z2B=G8OBkL-^8|SNlD5X#-8H6AN`kQsi=7j9&+nw!iMr8AHpGkk7a9P$X;T6N(UNfG z3%&+g?|9jaTv`b;CUu+nm^36v7*WtE*xc1bq4>>rJt19eK(?`5Z1ZZ+BE4GuE7Ds# zZ%>X6Yl!0PSDUY?XJJaGUMex}-tiv@-*mgFpyoJ|_XLC=!FMY_coL?l#-N~TZ#tB$ zQAnsr1yT!yH6Z{?>%b_VKATUTA!moqJ;?=&?+3=ezCmc;;7TNGMJ~Z(69uPppP)fPsB=Mp1rC5Rm7y2DEi>778Hm|43Zm5Fb5kel|{$0 zIs1eozo2*tHbfOGX-;_MtrX{_I(9*cUvOMmZyCq+ED`Uy(^8il6%?^|-jaF{!Dz(@ zbFS!Yi>s4hNps<%*hteOe_?8ue_a(>N_oq(BqUoMA9X?Qh?#lNmr&*3pk*XH^Y<5j zbC&zN5h!*}9Yo85^ohf^4uci#12sv_!=D&$V*Nu#PC1k!GaODrwv6pi%Zl`1d&P?O z2J`2yKW8_X#AloI-PTYT1xHK!H6*@``YIGBnVYDa)l>WHI@(%9h=9)!SpF+n>t|sp zEsJPh$v%Xt-L8O8;ly%x8;4kXfM~naOEA}`MKIj&#AvZ{<9Ki4ggzT)3okMPVa!~?@Lg4rG3NSQQgVgX0b&+KdNVIsy z1RU)EPTpw4RU$oj2p8B=;4GAhL+Q~a6#jU?FoI(ejAfV{aWkZ!QDfg_0g^>yfGt#xs=ikHOBGN2 z#w|7=Yh*c53LL)WAO6B2Is8Ew@}X{k#zFK2_<0-A2q?5Hk184bjSzjz;#ec|RTqO7 zydrb$5@74bT0rY%pnn~iZ9g@Kx-&Hvsn%=Ngfy7k0T#=#t#q`{scFd1TYmJ z{ECr>6r*X8n^_Ti03z59q^Pizz2g0D!k;v+mH`?@w4gX3OcF>0 zFR@sTs(WZBlO&=TG`3f$NY<6e4wo-I$$@+I+WxLEFA7R?>}d)0gCnJi!g$RJ|J#Uj2Mnp-AEa1uh@6HfVg)~sDmEBWK;f@ycH%FP zEftt*O_*xT>Ty_KFxK$r(LbRk)SK(Qpu8gy7A$OXkl&DoHr^A*(a_2FP4>~YmYA*G zkle;iZOG9l4}!;~>5*cFKcfl)fvfj`5~WQSynkB+&>HFj5Z*cNbw7S7F<%HI5e&ZK z!}W*0XJSGvd72B_gJZ?HOR&^iAKXCmBa{>Jk6s$f#aFjk>4D-WK&@Zr3=ZFc#>is} zLnVgzY1qM~;!(w?!|Z_54l^}LxL=Y5G|8}8uTa1Q0}Ig7dl7TX+(ODp!yQdkkn0dR zUfgt;`P^+E?!07#=$Ww0vPj|1oMSHtrA0{h>u>79-?^TT0$)6X8A+K$vqte#hzt1w zk#T>Kz~chdJWk4@TG(y>;sWXyqZbFDQ`7?Ss8A2KCD1C>sh|f0Bph8Dg9ig6 zf`TVlkFLUnMWeo~Km8yU62t36LF^qZO*Fn+o?{-a^6y0B~IPnF<~ zYJdY=W6Z)jAO>l1%1Zd8o0yOBkeygsL?IL z9;@?KRZfi>Kvu~a3+5DZFwcopTy`63l!*F7jo2chOFtXP>K_>3iTh8PE51jt6s*UI z!6^^I2IB!PU((=9<(G9dmZ8UgYSvq|OoLLQ#QW-r@ic&^jj9 zT`P}EC!_cy>fcb^uMclOL8~j#!V|f>zLBUJaBXQ)QmHxF0vTu+ACSRT<~KdUu^0sS z8^oY?Tj_W*gG>hCNHIHg6zdgNn;2GMAL1TcPZB%HCU%-g!7Mk7jA>FSob1;2s>l0M zl~-BYLdAE%Gp+rjU$#Z~tZf%RfdzkgtWP{1|HKo0;)!~S<34nszC zxi}aL@`-`;l_&ROk`1ePZCH#_5@fkTRi4Kf`PM4C?vhnlcO{R1jR}(5)kzElP15)Zq5_Ww%ZVpj=L+C+e zZE5J(y^e|APD6;gLH6W4)f5YMi~ufi((Vata)=KfB~s^}04Boe;iLO^ngs00!$)cJ z@aIHX%szj$!T!+r?`J5UolJIJiVc!phPGdk=ZfYqBO|&JUh!J>{4b zbf)Qtyvk355U}_{+bwb+cPQJqOh2a{frw?`0C0G`S3W%k561@?OfdM%eMzhrm`mEL zT$d5sMMxyx@upeW^37E^KmPeT#|lwv^56*r?0AriCWo&=*JT@lF z^Im@-i3}J;xkKc3<$FZ#MkNi-l)wrXEv+HF+Nq#kIHxBwlutxtN(aw$gp)-tyhRa& z4rnCxVqK^Y&}WXA%%Jjsw=y zkimdW#PAdPr$croW>!+$5yBI_LBG(>P?rL}Tkn$nRVZ2!s1Qe#q8|L$CJR51;1aCO ze(&2#cLQ$ft~!i}cEN!~4;8Mm$bJm#!4zfaMvh<)J7waj4UZV}+4vf_%I{S+89VzZ zvz-Lq&Fzh?{~r8zkN*e6_&{NdU+E*^yPT%Of-~JYMvL*AX6-+ZYvMd2l=&o)eN|M| zBty@xtRR`LGXixtjMWVWeI^;$F%!Ctwe@mEWT=aS1_|r4TR z*iVH}CT9(EJROHxN~sapTK!tNS2)=nThrz3Mz8V{j**RbmU@$QgufYCV4@h%a>^R; zbBgiw5DJ85MVRqEMz(+gKhF|jl?Z6Uk|>}MOp@TVWiBPU;TpiQu=rgv#+J2_7+{;8 zx>AI-m|KCu%A&8?&P`IoH{Yanl%!mr6~uG5griWZ)pdfgMTsCE4o3|!A5Mw@a;RAN zN}9P?eq8N8j~miC%H%;3Vx1lC_Jz*F$N(Mf2&5kwu34E@pwvwE@+654wt&bq`UC>G z6k$J_?*`hzu*tMCM)*0REKP{BG$zTSQ;}#MUB0p+rm7#bYR$dsjwO2X6f$x(6V*=2@O}jbhN0tihc@XsaUmX+Gq`O2ICDtfHHyZs?+Ac30!2& zTGAVo#txwTFdYDT4R3VMUsN8P;i16;Xe!q3@xO3#FA&(og#Y#x{|!=R$&ICzw4%j0 z8+Ti2osdLGlh6r=>Vy{=X~B7@C2dGBI|Tval@r?Tgmc0)1omd2HOhp#mj6?Lsrz7)5hRlqWV%dBJny5|5ELU^BbJuXqsQx97jo__ zZ5A$R)~C$#XC#!yaT1r&z*?dr?2-V#=yv%c)PW#|60uX0te~t!0#!R?bb*;hybke)J zJfTDCmq`uIt9;QUl~FAnnAmhB@lroxoXTi3Vfz|WStR3@oH7Tdh9mZK%$#B9W7MO7 z4(MH?$!F;m#R6{fU8dewlm-GgZ_CH)tj15bP;Z z1U^ufWu%O@NE8qgsNvSqG$3qo)Eay8%JSJWorMY(#q6`~BurRLC^K?t0f7)p zfkQ2MnjB%CQPU@!U!C26_Z-JI;{>r-y`-Jo>B7s$rG{IwZ1+5oc`eX`XB{F*nMsKuhpAQpNdYji_vS!Q$Jy|B(5GfG}31(()KU+qc87T;D8>KK$?BU{#!Kmfs zQqW&8?7hd3At96&(NY52u&GE0`zOx2C86m21#B4nf}}4hc@x>NvyV}zhYb`s>-A4& z08z4>vo#*^FG%@!U0i({zbJC&inn2|3@H|jV3))5M9hlDHVFq%V}l56Wc1&mk_i9l zv4%2pUlVLik&_gC`qy`I5ijn0T;gb>2n{-Bz8Z~nlduweb8CrUz@d07k@$u4f_eg; zA3b^)FNs5y|MrCqzCGucDI+z%&qECfA?gpCC~OEO7E*BPlt<6t;627fUh zMTeF_xt+0Cs&`4h2j_)|0xXT2KB7)qI6LUjXIc&E?KPUO>bn@hfC_EyGAXX9N*RGT zb~qn^L{EW7g^|%xti{1X=NRd3A`+$M?307`W55@AnH7PI_RrnMo0FKNf1X6L_8I9* z_&s@;QVrob9g324>tRPwn>Aco(7*Xqd5s=DjoD+$-~QSA!d{DIh{M|J-J{0N zk2R}pdd@hPCsQaAqxSL8Goby@CgZa*jvYOc3|1_Pil6x$$;!S?p*?0?V z!Y^Qzz3To^NLk6Oe9;|Ze`>jvkQk_u6a&sQxOcfgkyKA^gL6CQ!gKc%#W)leNiPBJ*>8VNETg@Y=YFYDlLq&;q2G1615== z&3Tui-K6M>w`3E$Qm10~W+vNAkx11jC3QrafUm{@!zgLYq%d6v#jf^s9`53By&D8;K3{7fO>Zgxd~$hj`?u*gMAd#8NklsL+)C zjN2kj>9)Q}5)=i;Or?q70PR(cbu5D+0FffVH4B8(&`z7b&y*b&GL?(p# zaxs4?Gr|(}Bjcp{tNKB;`Lm~ixF;k<5Wt&WkS+B< z0muusp0u0eM@k*`8JU$Di7#D)9EIOx5>X3^R)2iy8+~;JqXVSEMP}L~wif|yX@YZ4BfQ*NU!^UMip13%@<2XPH8Ruzw(Gr-F ztEJ#|W~o)_gje9X6R z6Z=DXk6o;>qP=q`fE8!@byCY{6fML|YeZ_44=|5DL)qv7;uRs3YS`o%140`2z)?vx ztCB#r&X^wzOKy9WvH0%8P~Q-FCJVy0R~%=bPs^b*>p%AOE%~8e!1aBZGT7`Zx56W2e3jSJIS(wZ@wN4J&fMYz8JUBFBPTcJAR1dtr)%=e zg+Y&WATgpFzMxhS$xsnAJy|1Uq8sEdxWP#Oq5&NFUG3nt{%%E_uaF0UzV&q?_;_9j z7r>MWa}5v$?4TpY#rgs`T2l#`n&F6gah9Xl5O6_o`v5Oaw22D5Ll(C{B5lr(hmobU zDTZf*E>fBZWZex7rsvH9FoJ-{Xp4ku(3V-bPXjoz|0uiaTtHKLK|IS_YMm%`8SC^ z;|8EIP|4tEPu#*B9a{wKiBNI`O4ez9$0GJHg{Z>XzutAx1jN-rTH23%7 zFIX^TW3yLv=KLUz`EgE=Qwkv4Bd90S3BIc`KYqQ28c7CAat-NLOr(8bOp)kQPAV|_ zZjcev_<0oYa#&c*C`I|>_7kgWVDVu#GYf7Qj(>3ZYxgEp*yQr7cp8u4q@}qZMM_BD zLS&dMqc*3*9!6k8co=Y0R$@)k&svd+s2%JycIyYPMP+X1?_EqUwhh7z#V!(F&|DjS zG~}iaGu|eIEnXsIccwgD{EVPbmoMjJeH%vdED>@!V_)+kH4>GC*K#PK zJ6Ahw;wE5{HLj~@eW`F;VKzbnP}{7|^3moNal<;95V6;P$zr~i@CrY{vk~)nMN|y{ zZ9I!Lgj3pivLUx+hqSeGh_LlR`w~IL_SIz{Wqa?gADO$uVqlShGO?1LFzF>pys(r5 z<_xny^#1hEI?1PCkE27M7_1xVPm6s*xHAC;bAd_+)F%fG)WBE8>P<&>RFkS#@gY!j z0Xs`29sO3QN_WJqZ-x0{DJ)E$w(YfUvq>uVRjZ$)m)VIu9?P;1kR*LL#}ySO?OQh5jN(8Gr>T4=3V>a$BkiU)6!O(XPX{W%~{@>QM{5Q~)js zS+{_G;d+c4f#TtfuM*DH*b|3EYv@L}gb#bb6(ut;o^;9-HO9%S>QQ}%d=+Ar^6TCD zYp9md-@iUOI;g#FwCb2hH~QCu);>Js{94rmDYQ{zD*ZP8z=@)KBLIq9l0IPmapiw2 zYyAP@D>8T&Cbs4H#7V*4G^@qpS41PF#E$th-M*}a%&>>+&he*58uu27c!RrNgn+Fb z0L!7C0lI+GisZUYsjD%Y4dx+aBntF6*{6fRI5QtsbCTN(HzGzq%_D}N=o_TZ1Y~1- z>F*=9bAQOAJNIYDx9m7wFv09ZfR^&%GBiJ1{~1X;*fWWLFjlzv3vvR9f~e{(KW_SM zdPssdB`16%_{(l%im>(%j*-)mwMt57UoXFbEKtRocnP}4KR;z!NgNzP<4EtKq?&!?# zpnm`Zj^ETVVDI4d2`+sU4{@6TVE1d-Sf|DPgfR}`LXM$-*5y1gt!@&dPih>rkVe36 zF>xzz(~KP6oep`sx||+DSjdt{H&s|6l#faS6tZ}nzYJ`9qX~j##m!G@WP0Nr8_yG< z_2|3#~^4S2Fav0ADjy=*E_IKuknK z{f6K4kw-vQvd$5p7;}}F;RbBKy|ukX2gT2eoPWgzM~_K>sn0v3dBIUwvfN>s z?lMT^+%}V}OKmVffs7Q;g2yeGe$nn;@jh*7Nwn}HSi5l~E~eeiJ8mWVuW}CPm`HQ(lLFDgpH^AR}Uc)bSIkMB!Ex1zj^v39V-Ygwer4)+eCqD&Rdq` z!!(h-n3&Y+POFDhfRfl(4V@65)FgmmMXNzWC9B62%>mpI(ER!2&?{@7e*M)}!dWej zMq+V*-I0ab0gO6-ADbni1d-o_Vbj$p50Jl!dqJFzH>qZa?@%u7ax%FsMVhG)TSDC` zEQ-}{w|aPJx<~?k7-F{l^x5;Y37j=TNv@k2rEYKafF)PbD|ICNRPSAIR1Q##XqiTV zAtTOF^wCFA^Jjp~$0nU1b}OZC!t!ZF&_Up$cueb#t=_cNWOP5eHo>$Q^*L}^>|*mywF@VLbASJG<9-YHO#yEe)#W-a&Wa%+b-YdH{H7?qV}f>K$xJ0~;5(XOH9ey3G`iwgmp z^z^p3o__sIx>qd|U6m3py-X2z9g2@5af#;}+glr7$8!2M%Fr*{X9!?;&9+6|Mjd(* zVu53{oE@2aJ|=9?zeU5Aw@I)b#3!G-9$yurbs)rvwKs^Vla4ZKWdM`va^B1;tqr)g zH%9X$(#eb@_Zgm871TCpFbj4fb`)%J5_Jlc8j^`&Pf#U-G~Sb3&bhZ5t?Itn-xV>y zQ|B!2Z>VD-#qfx$;0|4h@gRZ zL(!*S6|`Bm#?YE**F2~aDoI^8xo*I&xspa%Cj+G5;lLO8$jhOILp1kcWWW(Rin4ef zA>LRZrgLHLZuI(sRiTs;z;0iqr9w~fNuuDCqw+v`C0~&@yBvfGSi6m%4)z;WDN_-^ z5|6!#g5&lj`lt}$kn4*O;#wg%XuIA$8G$DWZ8H7liO5vC4|w$?Ppg~(a-w&80BEAI%oz%v8}8r%*tY$DGIG+@@Rqz#@F;_ z6!zTHNLbZ&;+J@v+CKa4bXy4{?q~%&tQwgJhGTWgXD1ATry}dpi>vqL$rqTm(z()` z%vJ?I#Bz(#3AT!$`YX>SPZJ4!6lOHI)uRmanLx|(%+pl*<|2SG)Td+qD2=7+$?r@< zj?a|`E{9qb{70=SdN7Jq$J0^bSm#~kFCxo}xdu*k&fH+;ISk#jWDtYaI>GiFGp=>+ zFmlwta9C)?sLmEv<8)P9bt(!SCouiLnQ%g20b0y{n;H2VBfV}o{~lHzFDv3Sgwz;h zd_$}ObPsbEg#xg#4~KTYu~X&D_QXd;W}DY6uk55{d>NddjD7Gl(J(Q2;#-C#em}Rc z(>RtZc}0rJa4yf_f&kO<0-TPOKx&>E<@Db1tdj;oGn1=Eqn=_+FTa{1yX}rPf5N8<5N?Xy05A zjvs5ySG8v2=qXii0WdTrv`2dr-#=PD0Qdktok+WY2XU;ecgzYrQ0D*Z(vM=l{_4K~ zLSjb##Cy@G=3wZ_IB5nYkoKV24fTLx5qi`7tMwfe1X1QYmpEMDCxDbFIwmzC*OBc$ zx_x;3=CyS-*oDo59~lLiBXxgJv%<9zDh zN$WE0X56>hJ>_TEJ%$~yi0rnHTW5hwlp#r_jz8gLKb}|?6t{qKOEjZ0>++op_G3lB z^$mJN*VQP$iKAHfaVU3IUEzzO`ryP{@jK=WBffKko67-9fW+p!;(YzaaEH+$V<(zi zw5PWt%zySv#sBfa(Xm`A4tEU|6|KfjL*j^$r{8vvg~kAMNNCQl!^rdQuiEFpTA~We zDXgbf3cTRV@RkoejdKGtpwvsI%G0(GTHqLYpbe(MwO|(iY(t3+afL8iTI??@mV-$$ z?6Vbsu^lAZ&rx`Y26ql@y1SCY;g$64E2w}92%ET9_XM$fD7^tr>j!cdcOoN6jHGZ$ z9--+AJ4Sm2@CD(ZH@V)E9RSFaH`RSirhHSSis#HHDAj?C&}0akb)!SA^h3-;oy5_42k zpSr6uN=(dhS4lyTVp6|#=8FthIW6Ly9IRDQ_yPa3cn>bHM~%==wR&^+#Ht3GwZna# z_Z(*@A{rZWa+Hf?PJZ2b#bq zES=UrgSEnf@7!ou_-rr*K}NcuUJQY&vd=KAw`eNt??FvORCQ+u*Q{d-$U$9-50d`= zpJY!Q7b{vB+vZ+k51;eODg9KhcxP_OdfL5wgfUOfRis%C6Cp=&LaKd4A7yo{iJ8FE z``(a18)DeS5ZiXqG_&6eZPW^=m^(W9sR6dY1%!3hec zL?Sd01PYOtc)Po}>Ic>!_ESJp%5PI?Q)rI(O=8!i_`_Bl&ns~(^u7xH1^d-z(4nu_ zCMW`>yy^bl;ZG$#Wzvp#iV(v@x_`7lJO2{tqEAHKg0$eaa2?Yc%8kmMK$TrL!jrgn^aTvystWT9 z(ut?l#M|R`c|9Zux9E=PBFsQY>_8Ns=l-tp+qDgAa&h0>_PuEWGX$;ml)SgFS`x8Uu=aqM&D;C+JF4~&^hv3Q6RQT1tD zi7Zg zTta9;>{{aoa=qmPKc2(`6NgD5*U%wFrA`_( zmFrrX?pwyI5E>^{JjH}2FxxwXfx&DtI1q^C4B3j@Z7g$7+EDMdJ? zj@cD<3uE7b-biHu$25N2<{sdV9$aIM6*0vWsrY+j+Q}`0k!lhPcrG)2B+V1z$R0X< zoWxEo(k7J##5GAwt6VnZ4g>I~3N9nL*oAG88oq#gwVN(7gx*^CWyVaBv=@{a!wE7b zm#^uPNTWmJUbXFp4z*0X_sW`b;{w}s!T&h1N3mO&+9W+mk1@LfBGgL^Q&P=PYM@fN zd5_K?>Z0x$W%5?TNSKKUSw&|u22ZhI-RDJO15(1{Nh!4WLI#N-!)4QVsB~$cqv@2w zih>NZh98+`qMgl@6$V*!;Gcr}be=q3<)11V(7PvM3^f-gjlGjMwKt6><0I+pR&?3o z>MtrN3sGoT-rAY5GyZy=?gbv~_95g%Sm`BhBfab36m2NHFPzXgtTm<1NQ!=d2^L-d|XOfRMnh8?HAR@PWIRjC%uaW5G_9FcOVg+?zxKFbqIEHsKGJg4(H&1#A2 zLIjqHFAyKA2tbw@+n>p4L=QX6PRDb_ZOMHcXQ$V{yL?w^pP$2`)6r*+5ojW~-MCo+ zE@Z0qarrSug;M3;6Z$3=3DSwCP=UWEiN)ynSwfES~%O9~dnJ8L$-yhP@CCM4JiRp}FIUW&r z5rdxPo(T#?c?UHkiXfmztC=txetzPZ$R-T05MZ8iVvX^X?U3>n9iqWx5;gBVL_Wpa zZ03h>smCZ*CJInrM~~-8Vo$kB0_ywcU|6x4#azCIQ37VSEviJf8UH#sD z+U6m$ra?JBNldyJ9t-BQ#=K~ySda`QT$^mH52FBNXFo%{!4Ba)%pY*AjTnO&Gmc~` zhRQ8yu4XX9m^JMK4Dkm-BYxw3QIV{Tx0qWznXI80D&Zj!P)U;% zBH)U8lxcM2Dk{NVR51OE3n|b9jx9P#>;)dzHa_1*6f+>M2N%--v|Cn2!Rx zMz*Bvl)V6qC%xF*lxqbPJ34!p1G~_}A$0SGB^*}cl;TR(lL=lPON&FH7?#6rZS-#V z*hXa+#p2ZDxEL9UQhhbj*uT#me_5(1BQ}zd6L4zrwkJtcbAPuA)za=!bs#u|zlw{`#EKB`rlJ3l1GQDR)~cTWer z42x$WHCJl>%Z6YF%HL@5$G^`_Xd_x3^{`FchL;JjJWUL@J-_WPe!QY}WK5w}eg%B2 z^3xmfmIUN-x#9Q#t=5f$><$y_ta{2=J_IOY3?AOW7X9aFr9No$$p?}d)8NoOVT|f4 z*xjgFeDyQfBlPb-O$;;SFw!&P-mqhlpD5o$_yD<0)M+B6aZk2HO|a)DS8cwACXiN( zw8_eCGIbR^DzZG*APmGO=PIH!L~92VYpKrpj~8u}zpDQSqDd6*-R&jJnM;^W{!~V7 zGnXp3K7ymGH^;>%)#;PEb7*Z{CzjC+A0iVeWw&(<2Q{Bjb)gO?XNO}Qy=u+9>Q0;x zK37O^sjMhAcGgEs+q?ch_TIItjVw#o{ocPq&8cyc+{avv?aZvq?2(X9T?JXyAwc%oKT5p=KI(HRU12B0)+G@3jIP18-wJ zoK`9SH{0?3ZFMZ%?z9`5+nC5)L?n-BEYVZyHM+^4LKk5^p$0*+vk6;%Z$^}_1F>}b zM3GLd)B1h8UH?rpO!SfU44?PnG~-hl`f=vkS20pz z;_D7urwXDHry5QdN)mZtXYut$?Tw}^Ir$tlkbP>XD39Yw)^rBXP^zHk#89W%dR zmhMpteL7w&K3^phw${WZjZyVb5u}fjCOfmNxmC8R$*Xp|W59D@F@dRim?eTn*sZ}KRmcNA-uy~!DJ@m%nTv)KpP7Fz%?3SEJ+WHVYCOb zC3M-4zW2uacRfoqAyHZ`rHfq&*&W%9u7W?Dvkl$-SWk?AK1)1PF$@=uM@)ItJNCRL zyF!J=i*{L#x+Dw!^MhL;zW2;`oT3hAEA)H=SSRVWe^^NOfsk9Pv7JY|o+WM@O-O-Edf7q-0~;wT%rv zM+$;)5j=aW=e44W4>E&c&9DmR83>cpvnXQ}(YoJQ0&3w+Aw_zrQu2;xd*=gc_-vf6 zCI5z4GTi`FSrXh9N@6N3&tm|Y{Zc{Km-sK%*%G-0ZND$+ROUYhr$xPtCouI1W|0fw zYxLirdbhz|t#F)*bZ}BSEDk+XYJHVuHD7P>@`agjj*ZIi4$ zq3pP74X*~kZj3CYd+A2y+E-3?rL)XjlUUiMa&Gdu-oR^i&0JTQYoeshG}rq1dGF*5 zho2TyTdm+k6RLAp&UMxHHF4rZCa555NTbO-YWN>XnCVhPq|Aem9;XOi3Z`XUusXfZ zy@UC0{}bpUl9J5Ul@HuIl)F=C-XvBi!d6PpJG?2qo~I|hbVRv$4_+*;E`vRdyHBn@ zrJNYz_T>ew zJnM5cN$2PgW4IdVh~7BF|2kWMRW@<4?x}bZB3npq1Sc2skqxnFoNL_wBC61uJm4c( z7l)*?vw-@#5fTyhxD|e@xCQsWC>fV;>f0NeVyDT05Yy^)N6NlcM>z9%>sBexcIl(g z9_7#v^sH;;aVLU8eRKZm+9j_OlH#U$*%AOq1Cq(!k&R~BnlzU1mF}@}+kjd^l`)T) zvI&gbt;EDq%?h3B9_*IV#^U#UUlVq^!&JxJ|RYL-z{?kVm*cT8caY4p1RJR^5ba9 zq&L8ZGIX?1M;AEt4kHdDH|JtqXa;zRbKkJ8UDjgnMw=`fXhAn@Di$wOsN;f319WVF zYDBxO7OgW~GZQO`sF>PlIY=ry2nM)DcG*BJ)JF5$A9N#vdCQB|${H7jX`u7!3no{K zS%c)GmYyT2Hh)eTw(&VwNa@jy#;ZCq$sea+)H`9iGJAWK5waIq1XGS3RIMT+ZqB9p zRsK$e=ABOU^1ZE~mf7^KcnD#~5EZiiZm@)QdWeFO;0x9CaqDZ~AcCm7;ruh=y4(5l zS>`X166ZftPC@N2NjoRGi4u2`3NYe*qtC&)SO!Kl`)|1-M6{SAJDP2X?+0cns zabuu3OxMi@d7LyO2ENVHXE>tSncX<+R7JWDF3W(V!{^YV_-0NhiZwMwmDIOAd3q8~ zLAh1iEQd9&73ZHYM1+sh4=MnrYbKU%4?7br{W$`QUX>#3;P<= z$A)416Gf;E4664dbw{J%Iw?a7)XV=MD#@bmy2n+?RAO`Ut#3nhkL~ZSE5iXK*M)yB zr)VztW@p1qr}bYqBneW97k=K}3BOrI#@O3xX}#G9k5nA$BvuIJ4_wzwaquADv&E;E zvjt_#`}{<-Pm{Q7GxuU9sh4Q{B1cjS-%7(WoTYKi_!`G7``c;#(xiq?phnHzOMJ8$ z>q;KASthY=wlM`CKkSc$=$;jYMJ4Yq<{9sQHqW;gZYwuI&T+G161J*>p;yhu=7wn~ zW(`Hckzc}8#GnFZ<=~d`@E4UB$Zas{9;s5-txky@Yu8YffOms4RbT6Zba;XLVn3G< zuUML?B-#RBu~vGOm}u2sC4FO3!~e?LpOa8o1qwC@nz?E0YB$f>K;lF-vZ@QFXBW`Q zQb^4s~O;?K0p5RO;Iquo%2b-Gi(EvpU^hWSOj?d~lR|+CL0F)%ISk19J29 zI}YXxdysa8m(7qrtgi;Qym@u>@6qw#6FreQSK;9esxl6$Ptopxvc^a%J0FERSrX1% zgc9!vq9XwD-NwEH=&T)go+6wvx8>}-j+F&t_ zpYy8{j78QErmEYudM;sY&NYtXFLSkdTjXqwZqUltnW34@S1N<2fY7{(W<5>2WU1+s=>O)=M-xm)xL?J`etIeG9C41vWp{- z=)G2JBerZf-fjgZDrQkjuD)5Zykk+5TqwxArGL@|7VzEtHwt>#cVY}XahzRB9A9r@ zm&_}g3D@2DJDnJOiIYscFb`wDn3lFHQBoepyjttpt`t1(fy~R#F|AsE7!&i70rqUt zESImuEGq7#vY~XCs}GLKG&AECX~ycqIM0oyVF*8)sO|OLax&~29p`e2=JYT&t?jpS zm43L0%m>B)-H0{|AWp1qU3x=b-nFNT%Z_*T(NbmP7pAiM{G>Z_B-mZrD%DnGWP6J( z6|@jt9niDH3^db28tT3!GwiHSuM)ar@SkRXo4OLiO{S%ubfq^Hd{3xaD4-`Eyxz@6 zkiFGKF{O?r8tqb4BeIV519i`kSq~o63O0b75*|=EvJf;Shb(PGVHj}*<-AClwFhME z$^XUw#E4i{K+n^s=!PU%czTrVh~f}2BWq4;Kb(sSRU`~Z3(E7bRk7Amn?X_oWi0>$0U4%^7jRHcHo;2~?Yxt& zs=a}6uq}Q0C9`q0UzX7uKiWGrgje&99dRI32XS-2f@w&GHK(x@9uHf~n*$K$9v>Q@<)bmd|Ev z`34K#KLskSE2o2feR|8nD7|Q3Tz}S7xdv<#$?BxGq!rp^id7oA7sqI=F6`Jts*Aiw zsy~@ELBw7zPPs&otv8~`ma0c27jwyT_531*a6OL)DoDJWdD8nS%=9|TK3P}U4b{?) z%6K09(Z|69r0|RcasBRg=rZ|BXQSS(14^>q*B>+y zAEb;yA=R222nz1g#eu|?mM(UtIwH78@Y3jc?Gmd;%dmY_!HElDy_M{lSM1tu43aI7oiV>5F<;56FlwgDl7GEU#iu=owyBF7fGk z47s9l1*-|A4c;!pMqoIQbLd$B#Km!Z+KE}P!@YwGfd(08Jk3kL#67HL1WiWFB7Ip- z?5r<1mqPhea)ulCwTxNr$Cop{B^W*7nk`+7hD%Ii2~*;vqbwwYIJ?QU@%U#orCYj^ zcCqv8OG%xHg56hTe%FutsOxM+V2#C8c(R~%gbLb~(ylFzSIFX>m@QnjzS8G|V7>M# zU%A3!zPKBk%CGS@x@22Z4|F%n@$?!wsBg5Q=4hl;zSF_!g4UtMM{+0z8QP*|A^T`p zd9l_R4Saf4@TpS^>8quSSsrzi5fd$|EAo5AHMGd=(@ax_5}^Yuh1I~Pj3?8L36 zYD+0o#54A-Y;6#IITseSm47CG-%H#~_TaX0IH{^6!mqG!W}E|6NwO}luBQ2yaRa%@jZ7iE0Wk{tFaCrzB-iyHuqBa~?jlc8J;aWU$uC8Sj z%=Rno1a=bnzRlgWuoEf!9ovcLUv($)(eHI9tZ6zlk@|;nn_Q>ABXLfh&T`)O@sCi= zGQD%7(uGwmDs^pt+mXOr?Ysoq(NGRVzG-^tI`<6kg&934BMh&kJMV!VG=T$L2k#+B z5BFl1(YJ)eD|h;2m8;_krUw{J{n3fJndYP_XevKRcAJKP^K@9t|Blm-N9NrA#a|hj zLzo-i$F%$R3?UHv%=k`X(5N-tc75xbqUx`3F*bKz1L(naW2ng#)*h!at_=}Lfl{1b zKJA9JVERF}&jO1=5d@JrW@Rbchd$uP$K*Kj;~_~g8$CnAG0TK^mWw}+i?Xk<#Kv#C zV6%1jdc?=?Y*|ptS_DL4z+t?qZ?^mdpr)ACRo~p*j-sn*wa??*)g94a)wBekG@fE_ z$&M~+eVwCW8xX^l3iNG~-xadAA_brJ-VbOcj&A(n{QRt{I_@iMk1X}Zb{!a$j@Akd zth!Yj!b6vB%=Z7BePOA#EvW(&B?h?KDsMl#Ag**^jt5Gv@%ET-!-ZxnN@QY*IZ@Rx z%)(1vwFebv!iI?*&*Zr_ezV&sb0B~-o&A_3Eq$AyMd&vV{O!fbJ2V%}g?D8CJYRD- z6XuQ+YW3N3g+j=xlE3>vP#dz==KQCnr8!GDil&?Y_UE~~k=?sZdgX2G?!Vk@uH$}j zCS}bJ;@!2VUhw40jl>f7PszMI90)z0)F$bgs2p<0#yA(NKQut}urhwvDWy4Qp}*T5 zsww;1&EGl#cmUjRx88me)|%>UCB++Ew11>pI2^LQ;W^-YXlMNgN^->$grooU(%JpNj5`fQao z9cL@fgnITFA5hUnB>#3Flwa}2yV+OLL4Nz)I8nW~F?X^!S` zzAkkGB+rhyn}pPJsh>Hxm`yngoKXtPX!K!$_7RF!P?O7lDf?4#c$LD5)A)~>gL-VE zDo*iM98B4&>aQKH+VbBbfmQm7OTqB6Pcx{e5fR3dF}$Fkuw%AANa7@KfL*!fUQN8( zf)nnF5{A+;CiARYLc(?i)0vu1v+Pw<>aG-9*o=Iwz4IKR*&-GpS0wC|H$((IV+H%b zl2|N9IhVi^xNNM7TC;2xm@9e|dWaxTt#Po0g$4#2R3#hkZl{x~xI)rMK(ozJ9Sqgh zESsyGrFJ-S?Fm*R74Tp4Xfm?3YkYMYPkvB^{2d1r3W2+TkWyu-+}*)kyUT_zvAfw2 z4s+`CsoZIK9^TMhud&B}mD$A>(b`e;w%d~&pg(PoexM*yJ%r_zwjT00L}8igi|J8Z zqiU%?_BRuU#w>SDFvizUf*(;H4XXn{(#Kev$*$y+45Z2cnUG(L?fTb{m%DZP%*7mz zE7|UqyC}&TmzqaxP}GxU>SiRXjJY6YDf48;QQndGWird^L(uWz8roJ$b!q~U&2=B-efA4MzK?3QUpZYgx7ScfzFBi7(=n_ejMP zoz|A(R?lCoEPwZ%rBPo?1NSmV^J6_-TU~ka!cwZ^EZ;g6;0P_w@=ljwZ*&ci&HA>S7Cd#+U+sET9T-w ztV;{Ag}k`PFI;blEZNv^NrzDct7c3kFzk4!k+Fb$<4oSDhNDmsmTQdRV^t$w!EE9O zOlClyQm}1i#>@EEReZ7PBrC~TX;tBnOH{Gi^a9o#TAFxE54D?J8pLz zRCi>p`Gnzk65j=gj5?8~;gD2QO&*y^CuzxzctX1DN;R_oO=QAXk6a}3ggMKlo`xMS zRXbD$Y^_A>OfIcZyA_7+Jxk~)N~^-B%MimN((xf3Ece}LQglsTrZq|2u$ z2gI#`=w2NGH)8bE48t2t@^3Gn-#s0(7lEW+ql$F(s4~ia#OwLt;`9$Z6Q}Pjszxa4 z1IgSaKbQhI@4iqaTcN>C5>hd{shHz@*`|joP&3%q-_Wq8vq^&qyp6jASvK3aokCyN z<>i%B&AWD?mNkF=;gSW$(%XAl=#Hb1U%J%g6a(hkrN-ieJYta>qsGm%{DKd3o&5S| z>WPYWq~zLn-iT=iVIRV#Q<3cW@-lOVDYF6D?xmg>YAys{uOC+VPeqkL0A%4D6pq|ksXr_wAqpwI#W z5<);G4T0&=#XAqHoY%H~$)B-I;fk%FSg)AWX(@%_l6||*ff=}H@;14_=q!$OG?^0z zO;9fIvNB~F;&v8kpKtAMH(u|2Tk`dfXC_R%Jy+S$=9Aa=+D-SQn7R;EnsCFEZ=xhs z!OB=@mt)3J8hs$c-g}znT3aaSAjHvvwQ_c0FLTSIjeLu!qgbSv?c9pgHjky?7r-(<0FnF+S zI=lOXN_KuRD&gMX+g8jztX7NF^ekngrf^8%wT;HMS0~u$-o59mh@%zAF&0%NJX>>* zT|A{8qf(^m=Uy*h34e5OdA7}tOe@NFX`yPt73|^0deZnJ;^s5=R27sO{%7!*x#(^^@WzhgyAqaJ8WR25hjN3xUUj0x?hkpL&5f}&4@nER(R7eYbSH!l(?C74qmw%;1qLorUCIeAs1>(wRK*>t3_nNFNA!ujBq~^H8<-$?|g~XM%MW=hJ{)E7S_J zc4atfpFAe5^DcOCYkzllk80LvI)(_bC67H%lZGxOZCM>v)=2#ru)k65b*r^d-))wR zkcy>Etr?8-KeIvjAm4-BQ$B*slng&dpfI6j>o4?z3%@IPBGQgOXfxZioR z+x75%`^#DH2Zy0tq@#m!2=t0+L*5F&`dyFPS(E6QM7#w#K7k}{Zok^mskKQMik`R) zT1ap1pcg5k@O<_Am9-aT9WMG9F{7lugZ-znJbMUnrX-6l?sSv2qdZWTHVgvB$a;TZBg{RL9(RjC3kYnQgeZs zFCT6}UAk^R{D^ypcQ@hk@mU|i$jo&f81Sa3#yhAgS1j7->0JsiKX#@{AyYS-5!QX) zb4``7YRnY3s6Hg;h-@U7cPujsRh!-loq{o77;Uw z8OdWKxL9{}>{`tt{dC;K_+@3k7SgosQ)x9<`gV3=|49FuPsUzuAtJPVTniV-q_{Q{ zB-#2b-Azx0fkb(xAF4ub*MZIh<=CJ_TXquNVJais>Df}Lq4?G3X`F`{riykb6tJ={ z^?f2)StMr4H*}tBPThFrpOB)W#A^JCWDWk=^&`hQ7Jin}jQJlu17dQ2R>$IW>%|$m zzO!Y@u0yx1K2JSHvA*pS86#S$Q~=_xF|Smq1u{&2wzG2Z;8WbA1trC@J8+|D}TVQ-G263 zj)`ZA-{-DW4H2w|Ar-L3NXsiDx%N&oVz$9|%WW}@(I58Qqc6R4orQ%j2=^L787P7S z+GrfrE>4Y!=TmbIYs>h=ol!=t{+I512wt6gKsV&-E%2&FMqi>#-ys(@Da|JqxcP^Q z)3SB1XCui13fb#67p-2jW(n`RIW}bc^J;cUREy)PwWbLoKwokYju=&Iv$Y-O4!Hs| zJc-s*hOwBe2muBBik0MvZzeEXd^+hgW%G~s*WmHRSwdkd2c}us0#;SL*z2BHHSb|x zPHf9!wv&t$lO0JulL~%3@!gpuq$tg&V}#HNJS{Yv%2P4MHJ1W98Xg7*jZMmuD({_p zcdja-DaxIR*BN7j;}gwlTQbYMP(ioXGu$V`vI*9xBEWsH2@g5E1BYRlhb^1eUeDp5 zKRNSi9;e7Ud^hg*_rh++9BSqqPf;O7MIxvHwuz7#)4IMB|V@0+{Sz_qm>M}A!r%J9) zjr_L0x$ocsY_k|~1l-hrN1PO!>kdnbcZ*1Lul9|u6p5&fQr7&ho?`+DNM74Rky!s-&XeBjy^ntLb zP`Q|?>Am6;S;()L1n&_5kWiB}!JR%(IWVO{6|=HZ#oem%LDR=KL$ubBZpr-=y)(5Ll= z;IY6OHa6svZkQALMe0*2@3>OhkpSF23jvrprEq{FrF>ioF#z>z(Wy974E(z!-rM{h z2%IImB}IZQvfOziSkK+4pubxXl!1{bgO-&TO216A7peANDb%k}rnRhHM{sCC zo~;Y8m~o zv}BIC58cn77e~FNpl2@~EXBG#%~MXEN!)Gj42rNvMgKL5-4m_hq<=6Zvx$>F1lCA8 z7Fff17{)L01t}BQ6;L;J@{)Tb%oJLZ<%KQ{_-r80p(~iuMXafF^cmlcCmh8f#Q01r z$aFSu?~r-JEtp|){+y|wR%}ET#w>3@&d91(jHA#4q~G4d;;UC)@D8+vAY3~2%MaTG zpi4igl5*DE?QsfHVG}Uw{oT@WE~gGOTa+E-y0LE}Ydw&O34;$H`!v z>rJBfOle=>BO^a&yG0^bd68+dy9b;^v*XmNd1f~k3UoE-(3*Tnv|@mr$qGL>zChI2 zsUCC7FU|n4cSnTUjA8~RA-U`yK~bSIRdg)`fh}^d+i^!xE-Psg0+)2fnX zELygvYEkRPYw%GX-EOS04h|aQbi@H1bNwLC_EzAH!s~tjgvTO_McT41B+gJ;2)o(-JdJx)*Xiei_O4q5&p_cYJ==5CP^>V|$}) zT3$9cf10U1OZ{~9(0fbg6FiX^9Af3M=d8pY6P|i@lx~Sl?`&`WKIs&bSD2@DtINo- zH>CP!ggkXex*M(-_Fi8{G$c$I2pCN@6jfR10?iizO#1v&rvShHXmv8d z^Mw~C`;MtE(X~t}1_e}TDI6R*Zq;8Vz-O9WFsr>hD`V_Yx$zGoYL{O;d-eo@t8{=b znn#}&S2mjjA~t*7M0Ips1m#N4N&Rpq5u#XCWTT_=Gh7o!_9V^dF9*pV%#F<-MRW17 z={eAL<5zVvLBrqK`<*i9y{*=y$6WEMZp`zPE_ai2kZv`0-kQBDICpr|_R(n%`T5$~ zf9FG1L~Z)>&EL||K1*%mlFcv@4a*$*ucbwB_=g9Mnaef9h*c^$^lipMF=Z$!-0`ZR zjJv%dS&;?)rO)^Y)w2x+%TlV6cXZl?l1y!7_uzoIfXv||C>xH(-cG%T(%kCn>pT0~*JyjWN|L8eE z+umQ$&e8Hn2yTDjMOM79?jw6th)U~25xYDBVes(fpa@y(3^}c`32`0lmd?R2u+kN~ zovV@5sqT&PnfZeu4@O>6eAz?q0H#;ehivSf*sblFcVBH%W9u(}g5<*ot#l##Y?!x1 zLez%chY@}M-k0xR>wDQM_Hd8ZH+)>xRTS5eIk8>J#lqUGDM2|;$z@9qzYpZud?1p8)F z!A5dXLb{E{cl2?{H=cO5I+2ZuK)XnC2L%cYQxZ?Hd^)*?s~X`=y6?ERUth!ba`uu< z&)(7rtfgvPkaC);$Ra5umdDMrjNnkV8$}1sHM2Fgw%JzyjCS)aHt>%5@UCXp`Lr*2 z-N}3{_2{_awiFvfXcfU!kdG_ylZ7Tg8(HJqsTLylMQEAW+~};=*WXOM_Z6>d0R{W6 zg|b8MlfluEb*%7W9ZT+F3u@gXB}yvgd$toW-^=>?G`k*Nv5BUV2$C;!;!u{PF2u0= z$+LN*vxNBiVHJ7bI`>oTHY+0AAc<(h`zo(IOFhFS`mn%s)ZR#%I3T27+3x5X`nHc} zafbNyNjJLsZQJvdw(I7NC@7pbm~r}WUGajOnu5XkxoW$wnSXGX#!%VT&c?)KUGb`B zUZ^^e@EILY<59z87UwJG+D%W*A+M&>THo27c&3GyG{-_VTUH5FThDtm)b@HG2Q+I? zV8F6XBO=9EiCn|Z}dmXNDga}WY*UTp6RMw zsB3n9d&kx|DXR^ShkZ}EtMMqB(8MDA_oGqwtdH~1+dYW`$eTy7kN>Qo;A`d?ij+KY zyhD!rq%$6SQFAXqHH3P;DjGrKxw3D^RFe*UF7k;dX!}rYn#SuwA#IFd`fyMvefO@W z+~TssNa5I0ju_eYJ9PFx%)1b7wTP=Ntx1jD-9r;x#nT_2#_7D={N;KVL$0%??`YmH zQZ?k2%uvf25D=zJ4k=H{{c@|-vdyQTr|J{b40K!QhZ8$^i*NZJf0r`M5Dn23l~99C zZO*Xi=cjFi8&NDcUebCQ3rpWI(ogrXwZ#D|rB!;dx9yyMR$KKZEqwNNwsOk8nl`f+ z!d|6Z&a?zf4x1UBt&}rO0)X(>X5eo2rM>mtiLLAGg)p@;htnDEwOhbIIV9YAtMPBC zjXRYwq=7o?n@zzsXrM{=ul%0oI_AvGW-1oO@!ouZ?`UG*r9!Xy z{?rnS9L6O8E8DzC^T9NaCC{WK`IEX#>jCs-(_xt1(Tk7AM2{K5na!@4V|cSWGLM*~ zDgSTSJN_bRg)&6Kll~|P8x80rg9-l|8s5>xu{~s?n;WA}Pif||viP|+ude_;+m|!i zFFD`?pFZ?)fS7Y`*fUop8EKwmh1@aNn+PPW&%5(=AO^9DH|~8mN05%-0HH9)XGDg+ zbRPeJ^4};KF|8D>0iXYcn%)yE4xdJ)de5eiyREs}q?qs-4^VY*W*e6UFf1!e`yBWc zLdkuQd3?)H$Qm?k2j;QKs`usTGfInRVyOjFt$}DwgXmCW+ucW#&c5`T zGm_<$k;KFeo1gJJ!SggYk<8&#SHva59k6?YqGiwoL@LJKi8q%d>-Sk*Fh^)zydp11 z=rQYV>&XYYdup>XA`!!D6BO8W4iEqX^m36eSf`|zK3Flig}5NmU@;#f9vPt^(gs;~ zwld-+kp^KaYHVtibknoh%>Op+@r}L60j?IZ;3cX;-6v5&XKfB};!5ze%~t z)Kis0&v298mGHQxxFVSr?)JL327&vMRS;okrk+c?vANx76W|r(dz?`Q$~zaMG=<0J z6iYWRR+vf~x{oXbnR7wievlMg4{Eqc+3h*+wCm-mb^H~t{fN0MbzhYaA?{%O+ltJn zh^-*%iL31We{8>!R>D~=ANXCw(i0DOu$$*!UxD3o&~ue zu;24vTyQWUtk-ykOok{@VRnzaud+b&G60t`FuMHJT#(6rcUjBM(y^y^Or-#=+GN6K zEJd&gr(g;r0nik51Tixo&Jx-IGtR@pGwd}0^$>Vs8TPVfdv!K^+Zk5{-4v__SVX0-0D%>SU+I^PA; zAQQqVb>kNCJdEq0aAGz&`h;)qw72T*^*3`*%x(>*J`-IQxx8U!Y}S>~%AI>AH%J(~ zE*zT?9l}uQQKVy6Q@lsM)m_JciNA~Wh1>!EJ>bEJzPODdDI>y){hcJH;Q&0n&%J{T zC-b)W{FbWExmNW};fw!1_axbb;tpTp1s;7lc{ey7fs?f$F3c^wM51`n_O@-c+z(-= z1L{S{k&SvrLZ-@uFMvH<4jOjJ6f=RIj#Mr7?2hScow13&b?E(|2qhB~e^Q;VabLG1 z?VRfl+g6RgR@~c3hybR};DG>&bZk||V-wyT4v3_jctVD-n{p5GW^J7;F(R0?dEvPK zi@2bWg@^t3AI?YrQjuME4~);U3hIhFN*8gtXoWfX9lgLKgyZz6&qXtBrZ$jyu2TO) z@){G5dGNedT)=x-8NBR8qSszZTha_{AJz>Mn?GaJ$G( z#1B!i=xc6D^4aQp!UJJiwCO>v*W}CXH z{!|}~ABbm(XB9$b3%IKqf$d;`wGFBd1mI=p9(QqMioe>K$@UAk>C%M@J0WGUhm zFdI=^+p{-MPA*OKdM2|^aoh76^p!%A4Pd2k7AA7-t=`ai0Shouyp)y1eyD) zYe3Gl_jXvvBvW2n3~Y|z))^~tZxCDUzFFPixlRPsJJ5CSsl6Ta#bGKDj5q%A9qKfxabeZ}h+s)n;1RaWy5l8#O1wKh#T+8RqI~~j?%Gp@&0)hu7X_%pZ zrh?EWRtc^f^FFVq1wjJ(dA&iAxuh_N_3OmU%TW}Yh#5Ac**p#XResvrTU3w5nbPbx7x(At%V_xvai$& zE~G6myVr}W1&|5n*8(i-SnAPQeeQ|!InV-y} z5*z*Z>ZMTZRN$^Ffvu z7%O~5a|Bx44e`>KEm`Eufh37Fs^-fo9Zx;Nq|T{cAW3HC!clkh0mmmQ>&xzlgoDs| zLXWmlPqW!uY{pYV%*u!nZBM+w-w`l4u!H7gUH>uX)(8VIb5HtYwuYpReWDN}>H}y8 z?s%=e&=-}2Vxx}+AkBpcG}Co+-RxY?>SH7ZsSq>Q=o|4ItA)9VhK=THwIyjHQmg^n z1oF|~Kd%ud*Gvp4>!Vc9%zo}Px9Ynv$K~%Ql-qYXuNItf<@-sz0ohW^ZkeL|y^Rgq z-PwJrV|@BuqA*{2$?te#?3gtroJm7Swk<+2R1PdbLHvE z@{36>fF)&y%*XN__*H2EX3~;11ayS4y8ycDthshTU=M*~-UHH`4u*XP<__r?X|&)K zwopj5BU2KD>zEY{OLkY5cxs5M!&9-B2q;U=^wit#z2R9WY&XKY)K5ibkfSGAuHTWFk;W$0&+uOhhtUGu)@N=WuaUWb*1gOc_ z-Tk%_Gj>rA&B~c1hM3vv%Hl3%rxsQAj*f&UI&l`0`Dd>>$o`nNIeeht}& zw8F_uqIBFc)wetx=&trqOeI-S+CX;R{*+vNgKbEL3uaWrX!&S~3?_91O>bNgfobC! z7o|s&ovlP z+joqGceCANrzoKBA7Lp%WM>R${gjnd7WU;EZOqE@!U|hsAOBj!wYyoz*iNEEm+IkH zZB1KI82(>wZ3ae`rK}hiXb-C6Z$VsGFCHTW`2wx(naP!#bfko=7;jl#z?% ziXQi9i+V_Xlow&z{xwOEmB{lX#Q2w!+keCp2;?WYn~#_;p?Y`YExTE%iWF##{<`;(kOh!>fy#dhV8nJJZ`OY2e>A3 zfn!F20HH-Y77}JkAFP@4w9vyQT+wzkSW%Cj0*1BW)gkxdF44d|Ab8};z&9GTs zKDokU@a6B593(N&HoJJU3ivd1KlK zeSSrLbXI%oh>xe8+LRI(@ytxi~dME2J?pnyWy6HmX zv$&_lZ105SOk%9u;jMhVqwXO1lAk_%wzg)Sbg#RXF+iDUc}5Sp-7A+mtvgk@V!!O{ zq4Bt8bAi4(z~QWRFs8TjAX)>ys8DKfU_t6|-%x_kX3>nIyOBR&r{X!0l6!HwfRhT3 z*a1!ye@#v-E*}SNaRI}B_h_wuL}6&WjG;}fS?T7A7W}~UL>+gcS_QCBt+4#Lj4Nv| z*1miC-0=Cs{#L<$smDt(Qa=5p7{k6CQyZ!$C*`U9qy)$6a^n7wAvivz5PzRRZ;BsO zYRC1{(o;UAM3P~C7lG|W2;*~{ecMRj10Z#4g89WKeU6h@8|nJTZqH_Gp|uCTC=?1# zQHZYCI$A;z2QtVT4`y^ze9~@&HiCPWBx)#0Zn19Y~yocE2VGg;#fwu z+ES~87zYox(;Lc@(1EvT_HDiV$TKoz^=xIXx?idy2mH2;#%ANSm2Q^zvTpsfi2lV$ z4{P<8)cfL4+sj|5Z0^0ckl*yn8k<5jIgdTod9_)8T@cQ*uX4lZ54i3rk+2Y;+WBRn z-dYG-V`)9_MG-RfLjX?Bt-f4z{ewSx=Q8T~;Q)wm=g~*KE((taS1!)v4NxMCJ7-zW zLVdScld)?pXYP9Uc6Z2#`aNu7LMmcZxEHJ?TAbt^9Iu$@*b$4{CkCiOj>@lBjgpzi z@GDBFI1xkCax-7{yEXsPaZKgicGQ#5&Zv_&6e$LeHPP~unrC8K8CF_}r35s$sV8Ls zXc9uzw?ebY9x?8@l32z%ODb$|mcxPMI||OIq&a)HMxnw9s7Ufms}D@bD>xd62DHoE ze9t-lL6eX5{0wV5Vg2h~HmFP%=lDT|Vp0uD)o~hFiD})Tx)bNlFqpAgI*>8&0Bbw?$o1?t?x~j zyQ?{Y@1SfuxjM7`;<^j41};~@*Q!&7qt9khai#^BMP3S9`-}Ug)EG($aN~r<;yY}s z&^|;{iLh=S8RLP*SG*hJA3a)B2~WbcxIFTn%~p;|ZZ1(Jsd99521@7jAf7PGH}#Jy z7wjw4z~CZNIZNPCiBqz@zT5ew(b#QnY=)c-hOGL1yZzRBC1j)~q6xxM*?zEC$3T$# z(mK+!<;EK=#l`a?^2ILK=0lwPTUvpXR;=cK;m8kf^L$DGbvevR*o69~myxa{RefBw zn4`mvlYXPT9tlk={0Uvo$ChrPBP+SgVX$~9*7QMseHHbGSM|qVfr~jtKvLt zswUGJt9L5hoEYi0ZYTko@_Z0(eikmjoLe|VMK}csz~@zH8#7;q>o!{yr@N3Sh1p(P z^xOT8MA@F_Ui}Z;Qe9H*X=0yTsyihtsjM4@YT&QM>x;sBW&*3`w&U`vpfI;0 zPm*1_Ix%yx+=5JCRu$>2jq&{sAf7FOrr4(@PkFrRVE#MH!EiE}Xopa9L&jyAB~D4I zm}a2(4)MIGwyQD;E@j}z2pP;S19uoxPbIBi9&j( z^l-UgKzUMN?Nd*%7C=erC;DE&`JGR#m<(Ti_Pi=<<0~wo)i!+8UmMNWZ-nAwjctOr z1u+u=Ikojt_avDdojQg)W5U_QSLa50lYvu1F}d!vmJrRlOH@r3YN&1(n43S=iW^OaDJXe|oWtx4#| zl0{wpVChN4^)#C3%rsa#!Ez`Cugd*cJ=rVy^^3(qMdde2Fm80X5_=o;%rWfcy~gh5 z??C@0ce}Kg($(yG$dnRsWC=|4k%=rzoFDxgR5Khygh)`qrLO&l97_-_hFc0z_cXwr zX+xq~7SlIkHXLsmq-#_eWdSInF3$wp=*e@8n=6}(wH7VK4Leo_lBW#Uw%eOqCEu3a zgDtxmdFnEbGUo)!W8@o5KWLA)O55WHBFdIw!ij9FLrw=lYQSs4yj+`5!3h$$tlvy> zC8wq!f#gJqkBR$nrSp`j%4m;-UeG;S5_6R;aBhjB3+hKpGV3={bRI9x<|TT|WUeL9 z1UJ~Rm_(rAXuE_iW|5px(g|0@?G`+3e4N;g%{-q zVG-3Klr*ra8*RvHQBsG6d)mX;c>uF^dhlU5pc;atUHa3|SZ(mf#aWg6zIu|=Q%fY3 zdh7S?^*3OmGQ|}G)f=0hcOX;_(}7`JANJl|;J)deb>H=m@tB2%wYNdli_cRv);MEE zM`Dv3jhFkcnQ5pI8=ESrjm%Q;n=qgZjBQd@G5ane1K%>OP*WGD6@`ex%kM7w$4coG zn#$PzefjeDL-z5+v#_kCeIbaDBLk}f+>zPH_Yy#wTDTdl<{t{HbOo0+6ab7Q+c zvAQ?=8S)w3f#uc8EiysrFzRxS^&n9;LB1N&@ej4w)z-obSA8SRbyhLuMY z8mOY$?s~y+i>&1SXX^!aTk|XVHjB(*x3y`97n5qnW+~mHwJU-vsU5X>E0SKL@62t@ zbX=Rrh~B5bRAq8iY-X#q+gz;uN{i^hr_n;RDehuod|1;WEvaf=x`${L3V+_gWcZTB z$N8F(ofqDYov9{eiew%~a$Ah}!aH@@{?I$dDSQVL)+{=|zGSko7PoS;9*B|(BS%8_ z4??(6M##~SxwE6r;W33@VykK?+m$qY2P^cc>oj70>evdidA@yCzGJ$5MAV+tRD1q} z`pey?PrUVyt!Zcdm)6H;cczj4(%5_1*xPA66T!z4<+vQvMnMD>C7Fs`=yO;n^gpoJ z()@b;Tco9!9Hc=<7SZTIc;vVw`2_Bjqq~U@ZuAXoW;Mnt!o2qc&VVro_S9fDg;k# z86LU{Bnoq<8LSXfebxFj9RdyLop*`!U>Op+pO_dUm0uar8t0|5%*>jgt*n%6(Ii4U zWv4pBJe@dhxnT$s6_3cTfTpVUYoaZmM7f=MJxQPSxS-v7`%PF-!E_6bJtHBr5HhC_ zC$CkI_pUk%tRA{z*5=o9k}CJ+{8llf-NsgMCrS6@_{`CHY7~%0IkA=cR6S{E%h57$ zS&Z@&T6UA-aIYr6!=v|3p}tkm70ZwJH{Qc=`yfj*DY=oN?z7m_QtlGKJ1vP{YuAs# zR?GmW03QJYvj7Dc4)X7~Ns!r%!`gAkjkz?@1 z-s8Js0P!*YsNR*uFWlNK|0=YbH}G@PWuGjYZNrbG&`em@5hf+yCG=^F4Qet=k3fWoh*gwloP~JxlxHcc{#M<)W z_lr+$jAM>^_^thC`Q6$)ccH)2sy%c684o_ufAN>!U_^^AvOn|wF}-6(A@n)7yRtfG z%zF2i_16EhvbsRj9N!!vbOeLj`WZupGHgY6cca(}0Zl6jEF7VnT=7;_9AQeYR~^ce znw^NBO=J7@+?}oox=fao^3)x75`{~jy3azKMfd(mWD4o;=3cw{*Us`azpq^L`>Ope z=3Fts;NQD+h^_i>F<5lvGd|AcQ`I>Bj8FHH>Ew_3tgEJ+Kl4;m(j}=_7)1Edem5Fv z^~i426-pR0Pb6N|J0+#?U2ex}p&5M}&NVcl9OS4JGRc!vd1D*PO0k#X$G{PMAd~6I zdY!xSwi!esW#7KM_tTzBGRe1)4sz-1#-S-dO@=UaQF|=?tulMG+T%F2vQriqaY->n z_nVqho1Y~agW@@vye@6+gV@eE^@p^b@rVNtSF|$a;eqCYbG%{~O$rwYIErK1IVXHR zjD!&|r>x*`VR65WXF<>N0K%}4HEn`W-w#Ib4HKT*uE8>(Tog}C%{oy5t&8BGK3{q< z3MVO(^wKBe{w8NWxtsphE=?lR(gwtrCfgVnsbU`cD67tiBIH<-wBEy7-dgv$U^&z=XY&JKFqINkpl)q{Zy3&~S(C`zp;ylzz;f{uACjtywqT#qaURR5AUZyiG9cv+b z*WAhE?iYMiWMgGD3S2R6llT2K{0A6y;8vhL<@0#{ zU6{w6_)%D7%r=vpd@g-BDsUz#2Q+Zz+6NzT$dpJJfZVi+^Uv%OxsW0F@|1u2$rRXbY2YyC&>ehG~m(a z&+y@RN|pL|Mtq765mowkZnq`yV>XmcFdgRkbG|b;{lqFqOieOoRWBrS)aH$pqhVyN*`W0)J^a7W1n1(6LQJi=V%XlJ_2#iha+#S7l`Pv zZkw-uR~n({ZY||=$mCb`&6Zo9Y_es59Vj36NJrqL81vB1dc9$h25pb(pr~Oa<3UXb z#6(-59kB#^{W(chYf045xC7w>yAs7*Y*8AnJq8n4>@VVUVt zd>2AVsH%O+H^v6LGZx~fx!Y*$*=eRR-8KX~uHs$hkma}oC%8)4sM7M}?L;1wbu7D7 zLE|P~!CnF`d-|TfL$Ky)w8H4E%+$hP#aOmmEomd=ujM>%j*>B)b)pP$iU7L z+B6fArtlUBOl((Wn|XxKp@8(d;jL@Dk;;Hoc_ySdnFr1v%;}B(Np>mwDP1l^1MU9k zMP3_P@+mQi1Hx!j`VgsNfM`cZSF;b#En-Ee$9Dg-m8WEAZ-B#tNyK3t0sq9t`!us9 z-YNa*Y=Xj+X4AA;sn|xyoHyl8ri6CjM46wmnb@RU_RMA)O_`f4P8LCr0bG%ZrOx}6rEAat z^b@*{XXOq}it`T-sjM`~QjY!63euX*m^xybMIf~BG^E(m>fJ0-v7G&&&uYH&t#51C@m5h9t{c5wz!nWSXM)V2$$Q{*!Hyu_WXP+Xpdnzh#n9~56?R=LvP41l%U zE&r=usK5QNv?K=O(?iqx(5L8>oK5vyH{vzWOIYRR9`{A#8=x2!6>%wpNeSua)F zS4}ipzEN>2AGHcCG7+>96Do|&>#*&6E6d+48y)DJ$(L1rJ}YPPQZB8~C4Sf@{MFTj zMwX9_&;5B)(jt1~`hXuDw=xxprm969$8M2QTLV2qjPsSigYNpvbxdg`$pvvecSisT znLxznP?+jZ#)+po1OCr{Dj(KsbOYNY?OwJUg;oyNpAafyJb=O(xoaRE z(w^0skYcAZ(dW2<;V`S$9LOZU)y`}@qzA*iY;)YJJqU>`stVlGa zUIEvvDBCm>ecp2;Y~J)s6K%|LVA;24Sm!R^oZ$4Nt7h9d>*$AYlyg|;;sVBHPh>fs zO)LCqpFF~=xaaby7G;DKETBuIo%FgBIp8Y`K78q5;!10OI{09^ZfOTt`)Th}x_)g~d5s#s6Q)1U zNQEULGI4%sfzf4CYYBst)&Xit?N8nJWer5bmk-x#+~tfL;Zx~zp#)?% z9Ac1VhF6Xh1&Eq?(+w!<$Mc~`j^OT3b5PM7`VixvAO73~#O9#);}ZWF|Mb?XLqW=m zos#ljm(GXbu}g*vYwWlQn!m{KwvnrALb%HIv;5eks6Hr$c?X*MhW$F;8p=s&tLC1hStvDPB*j^4G-Z@>K}hpPJ^^Y^a(6ym@E z((-rsW}Q20_Y|I(Jz=Ub?wKqzn^3BDCx0`1t<1C{dCVK%sNl^lga~XR2q5{2gCK~| z@Y6Fd7d|E4HO7NoW*SQiAIF%|$J&W()YgVy5rzz0lw>}}N&j>2@E^*&Fc5@4c{nf` z&HumvazL?OM41m-7%jZu59f|RaP|g+W7Bduc}+0qoA#_Z8$=XgqBf}>!MMOpZBk}h z|1@_vIPi>(ARUhFU&dmcrK$~BWSilCKXBI-%H^y-WPj4Jsk4~Pz&nVY4+>8J71k3K zhj#*f*jM;t_>6z_oe(X;4A1qC$nzryKZHGgIqv;52RT`e%Yw;=AJ9)ac-}%hq+*)P$k;&O@Un_)g7@h6t{* z2nvY&@Y52D*PELGQZT$qeTv0{0wLsA{^|vXT?{9cZfz#?u32ufWiOlC^}XM%ZwUJ) zzuk>?E$BAdsv+Qvz;2!ic@sR{u*K`}4e6bGjrRWDcKTiUN;BW}bd#_c|L&XJ+Ox%# zMM@7X7#J=D`FgluYdzX19h^fmrJ2!$Ni*vn(G5p{(!h{L*Z+8Z7~Q z-S|vSy2C$wOH9`=WfK63K2Mj*&Ea5f8Vy zwnLxJPz~j2AUqg{jZa$!WEKlW%?4ByD2%M3)5|O~C+}()4#a8>xjv^Bw^Gp+|H$W| z5b0r0(E`O4al3Q8DErJI3?8STpfQekyJ;=Ay0V}2cwCp%Q(?st*XR!|&da(9JY?gZ z^a%5YeNi08pfvSF?=yLJ3JFMx83D#^P@MeO%gUxB>-_1P(i8Do)l%M=l)`<+*`Fjw zC>ovE8=@F7yH=Y@EjSAQsr`~o=P24ywtJv8U*sfAx^DeJ2^g7n_F{46dv3gjuYc_J zT>`t`#JR!KMF-)_iYOA!M-IiyojmJ>!(@ug-BGu(H;rSIc=JsU!V$ed8``wG!|4{E zgbHfvl;)u}bmU*Tzxm+#hV@v z(SaM^5%yDxN^SoXgbbK1rZ)_e)1h+rRrUwXTl5yTcb2JAl;`5%l~F-5xGug65{pVI$sK^h!cSrV{B?5#VhN zM7Kf~ewL%mTM(QpV;V)w;7q=on30X(lu(aZefsRZ?k-q3LQuc))+V5`tUmA5YyC|_ zXj>ZsZ_5H+L+|Q9aZ7_VF)T2_`NSneV@%qFp8b*R zc|?{1oIlM)-{suT|K~3wN+8W;N+3xhbpG4_{BcPSdnH6py?0CNJBki(?yP669j2T} z(UNi-2wC&R_5yuiE;EE`bA<-frb3EXbHqj|eCChEvdyv2S)${NVDk7B~SR#VLCRXEG6xiOf7QENUB69 zK;^)ZuG`{ypW^c9SZBC1Tw~yPh-Hc0JQ+O6o1%buC>3fkljJxygThYt}!xe3CUPQu=6aEH&T&1nbmH zx<%{h%iSvEp~toiHeMXgR91aOiCNmw`?jrENZ7vC+ndu+f2aZuw0Y!3W4HB|+eZZ! zTPdrOPie)O&d7b@&vIFqXN>*zzTJb`ZoT!^lK7+sr2A^`quK|gZ++svX>T3K=ys#C z)x_HY5NqV9HzGrN3`xL8Fz;9?AkT#{D|S}|=w)YEKH3)5d0wbrx4d(TQAA z6i6z0)~q`H3TYb2_s}j*$ zaM}RMtwdNW-qnp$&Y4AUoFQpfBConvhvAz>9p~NjCyc0x$*ht*wA4Pnz@XJqgSH+r z>fMp}6%I9qgUlxLWpsA-ji{#NSjD9vbPwc3XCa8=;~oqnM0-N;eulMFUvwfEZq)}{ z!&aiB5OpX=1-FuH9Yhsf^aiJ0@9>$g?uPeUw$Qq#BE9Ct^M}RO-`&s$+Tml z*YL=Z@@hj-oEIib3hS^%BIf>&o|IXfr)uT-5#gDH5=d~a&Br`9nHW(z6=RiAB3bcz zzTY>zb=!^h-ujIh?nwSB?az-NyVS1+hf~NnH(87lWY$S8XRS#zWH0a76v0aMib;wNX{{t^vKK`9y(o^ z^ZN_B7+4S%=UA&9_EP^D6f5T|0JR>Q103U@+D*%LU;4ZN4&VZJ?__~A>HvA=u6Y%h znhV@YxaE&B($|LSY~HlD0E*znS)_2zM{X!ScW*((H#L=k*i4BH&QJb$I|ta z?}d1%;`GNB&XbY|Be2MiP>2?59@UiY{EA8ZClw=KA_Eqm$mgl~Su|vZ+mP{P&+{P@ zBuq7pAuuV)mtaoDN)~^EqFl|yMR&z>CD~t^;tjdgc(HWO2q#hl(p4fwCqV46#pb|K zi?t~cd-Q%q`Fz6R#z1@Y3d$T7LjK*{y=B!z;-s-O-VZSFio&?N6}UZ9Z&=jg5`98c z3okLfg=8a=DK@;ozZP2{K%cmFoxa^^nLn)M<+HdUMU)+&`M?v>L$*A~0nuDD7cHnO zc;Cb}6zz!Y*#-40{<^uLb{%lfnBM^OKgc%X8)wIWiIHXYIrG43t0e3fYdfb}d+1^l zI!aKf#W)sjm+2zcPe=kZ?;9LTH;T3`IB@i~W>&gX6Rk8;mv6Y?``g$u?Y-uDyRp#` z`0|Yf;aJN?j$z!G*4ixumFMwe5SS7+3IGd6Sh;Wf)mS#hx4_@a_haLP3!}mnd6O*& z9}JRv-QU|0fyg)VKAeVeZMcBD&vhkPqc^&vuE4}BFm4>TROJRjVg8j!o7W(Qr?@$# zj9TkSAmL{EY0g8l^rVD=#zfqgx0h73WQ7_sV2xOptdJ!B(-pj=hDGVY=e_sAxVKpk zl#wF^BPbm37X3Zg-Bm>_ar7T~?!R}H%FF#%lv+enU^*&lvq>X@kU_0RP?4oO2G{GEYr)r zlAK)MBxQSd2Y}-lJbIxega|EMk7T$)_fTJX?y4!emE>-E_p>{fKqvJpkolF`i35pk zraXb1G(lim>7s-rYKQlhNpq-?wzg-%bo2*4sL2ejl|nAM7pftzZsJKw{NI^ETsrS+ z2^#}!vUo#pXr(>Q6k`)LCt>s+u4K~v;C7$7+NTfL4@!m+pWu(d(d@}WpqN@Pz@AhQ zh!W2fI4CXRPL+z{ess2`^p%Q`id%BRh3r!{aZCH64}b&^a|NJI2h3)3#XfW~R7ZLU zK5A?fW;%t+Cy!wW@_@SAU*J~As>p`I(YXHSJ~!h>)Z#Dr^kFxQVW_at3Jm_b&;h+m zwhjpv7blq?56v4sWVv#JvGZ|eINmXy^qi`KOA1C-3BCrAc02WT%B{DA`p)g&64N-9 zT2G+NvQ*$9-p$v2e_BXhuwl{I0bPKXYxAqx>wKiwd!*yk3-xSMR zVhm>9vr}`Lm?Z0RQjpGq`mY8+?oydo`kgAAj+Bh|t+_s>eWef6h$4Ad zeJ;YoA@QdCeAaSEcF;T#PUrQ9y#o+AW=R?zqv_R9DU+)c)$IG~($Yk0ls7aMna^Mw zSs_CR#$@W;oNZz!9hzjWZCs*yoSn%c|7?+Cfr*BFnd0nV_=Tm|S2xnw$F%2RazKFKreBk(599S4Gdr7BARjAeW6 zodVyCS+$m{u9Q(kzJ;0^llDYGuBb`lz5@RMlsrVW4Q>uy7OK92O>%^JqnY%XW=kp-js| zR-VaXO=gy>@grI7zpQHpc<&j>a;*t-JoH~R&$21vABA40?Y3%lQf=>YKMc0 z?OMLw>HKM`;(@vFe1~^E6!Wx6tR>FtfD`>8pKYv))7C~?CR8rS^u%@;p#`ZCPCCEy z0sKeb5t9LEU>Jb8b0K-B*J6A*(@jKsUt#K|E4C9!K%i}#OZ1peBclNh1vcqv6xm+t zwTHZ&6wd`?c}5%gr2E;7#qNoUHbi?6uv#4{X)u_hmL_juO}UVRIcYceS5>TOe~wA% zC&D3bn97qq(IKJY#6hI%uP39dJyg09W>gT7(oOU4N_tvx+Wf z8sA+~2hEr3UYR6$N)%`~d%D~yV;GNT+~*!eeDCSDr!EDB<5yd5pzTuBaUHy8L_!1i zyE5WiDo~x?dMhA~t<>h9F0a(KEM0aNlJA~!$7sj~cC>z4t-az39$Gr=M=|R){q-pj z^1a#)cMNqkt#G$|q>!(j#|Tb{HlFi;-k-qKgX9*DlZ-B+92zDZOt5$u`M@xC#SS8w z*1V_r3@0&WV+(8K62DOd8p+A%hUPcfmhGMO9r+oihGcU4;bs4v-fe#*V%f$l`nhEg zh@pktM(ho}qYX9AsB$@Uf3ou&D=z9-mej#}QXf(=<9;V+wIge>!gUa!igAPN?ab>K zGh4cN4h4KbW~_xa@(&7t#xsza#jKm$hY#9YQ9A2YJ~V4#wHFuHgrN^$k`WU=-# zb9iO*ksfI?^!{R2&6O=VF?fuKs@fLYJrn4DerAE-3MSoKtQxC~w%yDU6(_Nq{p`em zqp7J0Uu9S2Z$LwnncDse9n-`5w@q^E*b)aNf})k5Ph28GKsQX!7$fKeD~&D@weY)^iR(f+h}`}xU?*YDxL-p z0y8OB>1-wYF-)RVi@+`MS18OU6xw&#y$%JKNH2Xg&Uq1GISfM=eQWN0RCVB0mpb== zgwv7)yp9vtONm#@0Mhch<_y=fbXGGR`SRk6(lEDiNb3E>y5wKc|(%wcHNPHX4u#<7Ie$``W1qHx?R63 zt*o1AM<{5haA+|RixkRt9wkqk=S-vKVGt+8U9E8kNG>}UOLH)rI#cwD8d^4iNz^l4 zHQDgF)^(aqPKM^CYMbkO`v2!IYcR^S)OZumNKN9?3;qoU+ zGczAL=^6_LEVve9O$I;Y(WeVQBJe7D-L1Tc<`xSGM{I0i9??-ADo?5uN7J~Xns2j> zTOi4!V0_HUzKzT9{o*alW3^G*YII)h?GQ1U)=m+79vmH^oab&x>=5CWjX>h!grb6P z{@fWhAitV76he8zw)oTZOSR^;);ihDB|{J~!h_~jL8+P=0|N*Kl_*#tXmwjn)2A1` zJ8<<#CawyDnRP4yMm(o~1Vm)u1SA?Vggabg;;7z+_N+w&aiZya-fDo{puf89ZGJG5 zNUD~{o9udca^VUzQm)^niSUZ%kdJ-yLnqsFHVEDwVs4ym;HXM22t#$UQ~Xi>Y^@pBb`jCB2v2lHH?V88Jyq*z<^zfX^@pNWB zUYOhS5Dd=~*2eScrYYZyZ!53B!NRH99^wZl0QnA6AMOqpiD~HOlhjR6+67`zZVT!6 zA=kjzN-MNGj)W|8WX-m8k9G#qnux=*_PU82MBe z_v5My9R4fj69q@W&9e4xjkXn&!2!R~Y|n%+{f4+qqAh5&xAo0^FMiYZ8~&0PT*_pM z1Rg)zX};Rp*#Pfp-Cr@LuaZxljBz4?Rhml&-yx@xAv-vbqlFhGxOEoFBTLFi#_X@c z>?{QC0}9K@&?4fPrq4Q3``pvzHH98=d!i=vdxu4w!k9DbC2j7sq!8+YaKQVxSS3hC z92K+Ovr1%9R;XA0*^IpmG{uO~HtdT00m~%Q;jxSR+xb4)M~q2oR}2(vWSbeXN3S$2 z(?QEa>OlQi(mRvW;v_sgfBJ@8S*JO3vS|!yR7B!pyGKjH&5$L;4pfCmuH1dI;GOxCY|;xT?qAicW;(gOF&Z_y-ot{s^pj*A$0Cx-&I`LEqm z>H)sgRz~RFE8o8eIKswBBX2`anrDdw(GsgK2#(Y;bBDl$tgC{{=#%$(%?OwRpSu1w zrdibYUYmTHZriya7?%Ot(hSj_vf7om;vxQd2O2c+8B2~yk}uGyOs@com~wt^oP`!5 zad=4Yd1b=uR0C|d!Z!K8JpKAim<#YN-BrsF)+2;qY>c5`5h)GUe3TlNph@eoEK@TS z%W8~`wCVAw+4vH_N*|fwti~KPpzd52R9m}ke0QC13*5w;pKmNhdpzFvr?C-_h~-|7 zw*{K7`MTv0B`PzmLn04*%l8u6d0@pUfs&hId1M9X!t8^)`!6X;`lVt1;M6UeKT&VB ze%;wKP=Lw@qGO@*M@D|RQ}?$cuB)~?Fy`zlmPUyQht?u%C(3Ed(acjbr^#L$JJ9E$ z;YQ9AZ>Z2Uckv?aU?0zLV5$)DbkQ8kM2iPkpCm*NUJJiOws?~Yfx|-~4axK26)$po zY9GD8McmaIz!@xK?kaRUM9{EUn0m;(rJjzMKQE4I@E|@IJU9EAKU&Plg&_;a(`WXC zI0abQ@2GbQ1(A3olLPK#o7DOB4QRPI6SP|?tt5}U9rMnoKR&lNle&-VzjGUWetGe` z(l9CAOjl4!Mu3Szd3PnY@>=SN%SodT;dXnXU84HftYX0KL3B#X!5Z>=JgG`)C1K{c zv|Qc~gJVmxO}S)(_+WPpVt4`&aZz5v{jy-H9GZd+uyV7k zp@MsyWMboOQJG5f6+GW>MTyKNS=Ltn{Rg2S{Ko|i*>K&EaB9_R(ul^;>r%R%q2t4lF6Np!f-V=w5BUxA=bX33Fj)N5hN$`AiwCiALGOPi5QfX zdCZm2B_|=`TRwsaW|a>+$s}|PkwF-1Rt>Mth2*|yz4#Uy)QE(vez$gX#!f=q9b_1+ z)@{nb4!UPn*-p^HP!Ikc6s`bIqRff~YYrLUg~`LXI61Qejl~2S)XoyKOcS!nVTy6d zdnae-0F9a~d7>iu^la6bKzVUWK=Z$gS`7SG>yR;L*m7x1bh@p|pT3nV^RM+8GCkAd z%BnDGBg{n$WeT@}B-gy}A9|B9XYHizh2aZWrnBcxi@s~!BVJQrOW{ynu@*P?o({df z4~F;FUgO{Pt(0sU>)^+;s4wI(2iPr?I5;t}k$`>%)iPjPq2HN)B~Apyad0D}w-|4d ze>nWfw$-|1==pAu7rC5-=HOP~G?!HJ+nExuBl}xgV#UwByd>oY8O7PPzxc)!Rep1kp3byJR2U3 zfi)Xhd_r;+XTt}vvD9|i6Qs0xT^v>RQF~2y&K4@1=p_~We_s4>esXO4r1H)GJ^bIN z`ahqAKJBr2V;#DQhSYZhGxmeZghzUXwzf&>;0higrnpF}i5Wx#*HesfhldOiR%f_UIY@46arPq$3{<;gi9TgTc_$ z%_avMNcriPG7@1ObKEvz;sQtiTq7mXQM(mrK)u^T|57)VrP znTXl^ES=xVRaK`K?!Yt$JLbQ*<%BR2ZD&tTG{%cSRqasfb{Cn`5zbC8cUuIfg*Gx8 zzI?p~Ki+H4p)H}vT!3*P1gSR1KK^%a8fw?b$ik~Evua-s1B`u(fGeCHGVLLjd&0J)5Yc~9ziUqT_zD)}8+)(n9?#B4oke9vUc9$%Sz*sO+PGn^ zTLjNkz~b~g)%+Q4Dm$JYhIW-Z$8p$}-{(Hz$=sDIbOv-(5p{-1A8d8Y*t2*CKPF)+ zY}(+B70F25$|a4wrMr90x9U2@Ls8<8{bcwc1WjfE5gKDOx9%wYW$)$MCa%93K)bbd zdc8LP3vEY9W*ODizC{T^Eri|UEB@F!CJF=6RFD~EkD7LIo(n!0>aJRO^>MEYJwcI% z3w;Ju&k)u0TT3p7vGor#n3cH$o*gD~z~q83WXpep1s%B%>K>PW3&%6JXa=&;a4_it zFH(Ol%lfhOHuu__1RS{@X?PuIV zVEwZ`VTB)cehiHn@rb@3~@b*RkOcrbPcic6ZdK5|LvZf{aOE9)jwD5 zpNorr8@|zO#N<5~G8}@rYkBE0#L;VD+B@b;;4i|HLoqaf)i#DqLq-!+i zSXM0c$EEJirY+ix%S(#)CU87<N3!MZGe++__f!XZw$$c?|Vu-K8NdT zQ&4#ClS)|mEU8j^O05>07;2}9B32%;$fYir_{zks5y@{0zXy`QV~RKJH_5%hheUZ4||LOCkQKrCK5g(uq!TRx3@-Sq}Q!n5>g z6zAdoj0em1dMb$;mV8XQV1XcY^Kv~dFsl3916gy*o#}WEjx4&))`ry}PJ91?9ifd0 z(WTn{O^l z6^V$?KFLlYxRsQ)pi}tMo1Lx3(&A|JVX1%EIUIEt86g8S;Wu2BAN!~#C-^5(qlbMO z-&s%$jmN?l+H-Sh;a-gc$X(|L>{eqE+V9h4LBpc{X>yEG+S^Giv#}$(b!WsSPL$g@ zqr?%Tbo1#C=|%@M{ow>ZgpnKP7Il{e)pBy1MP6q0K$7t{GtWd|iDRnZ8+)LqzS&uC z?!Ia4fk8J*A!MCkXyjXo<$dqzQxy zIr|fO0AjpvCXx?q-M|yK!&Rq^Ae40kdH-n6NTEH>wQju_kdlt_hO97`1~Qf<~O9Hh8R@ z9^U>-CWuUhZfw7vS$8cjR>0tQf3ej?Lvz*U^JL=^XY+y!-D@`YCAD(U12RbX1@3dkvL1$QvWu~Km- z3KwFW0T=JYSIw#M4)LiUHrQw|Le@pChQl!8mHb46>Ipss`XCVJlHsZvD9v6gl$TgI zO(26%1B|K`#$g}iv*g~(y&2B^VWrwQ&Cf1g>SLq{ot(siI7hy(OjNv1A6n$8{QOqJck_%+RO(cmes5SKFrB^H?&Y@Zn?0jJ(Q^ zB{RLB<_PbdPjF=(OJ=UyrpJ;Qf@Lus!!)h8@-rt@+SrwrNB>wd^FAtwUP`k~>?6zM zNt&d_r}AvU$C8=rwINwXk0mpS{-X_%YF%k&K9tmFux&CRB!E=slLq#H@1964ZS$B6%#C$*T?b z9!q9`OnfYvc`TVJhLfXkeJq)=1`w1qJ(kQ&UeokgGE=-w1=rbQ$&5jCP7syH1sTga z^3=}j@`NJiD&<&(%wEg4d@PwUoaDH-k0mpYB{P5a#%YS6K9rwc{Ka_#vd;IIOk)O|9t$HE(kOT9fF3vZUZ2+B z(X8ky;J{=+gr0}_Sk6OhR(eOQE-%+NoAuUA&B6lsp@f4)q!^4$VTalV)`DhG1oeQx zBrI|6?QjLpn88%!j|w105GVZF8x9A@=k;_AQc@3dzCI7s(Vd5nfqcIrDAy0n5fYiW+5!GL$- z2zifMbjW4T8!Ddx+Y6|~OwAl`ZBOoOKTzS62P#lcO9f4~>qyR zf1JS{jKJPGl}_qPv>=FaaFI#G5lrOoCt$NFZibK?3@(6%X$j=VDd^g2Z&;UV!4u7E zly^f~6~gmA(Ys{u>Dv;urCTz?Qk&afaj{S+(62*~C#{tI;!LfP@T=bL64lZ9MkPC=hwYvyD_W0Y(pKi$_;0_wthUYW;QXc{=cmP zTHK+p#*Ca4UhQwMx0^fL(}PXWZHf*l@45$n)VkIWMuCmVKlE9C|(r>im zwuggrz*{S5kA?sS&nVdd3CEu8paD@xZB!g(zh9hq7&-tAoDB)ppMx8p3;^2jQI`g6 zdh7_@jI=`BaT<~&6e3r#bqqz>yQ>%3*;1-4vmKf zrwf0l<4KTloOJiy04b`2iKhz`EI>TghUuV7w~)BG@pm`mHI?rFW$#_P+d8f^;m_?~ zaYjq4O(zs}cM^B(F-SrZVv=A0(zY@)3kxJ63M~*|074h1^WW!r_NA)M1t1OxJDs%O zcRHp}ms7QC-}kOvek-QgYwY6PrRIKb_jPZtad5EP*!#|xFB(T-nf_>1DsR@{Y#qE9 zxIV2_5*dojZ;G$wY#Fe!_lTWI4Ret~R?S{OuO}=A7L)U$8hbkf>|aghsJIL7OCqSK zs;ZO<_$LoNpzs+*5Q>G#W1sx2h`TPw#04@b9=Sbi3;OeGl7e7? zsAZlD>$XIlT72Z+8p)qcCL>6pIm(iv^xzzd{S4v~j!_hlli%L-ha)+xb z)_2+4o15#|R}UW|V77xt=pJ76$6${S2jhpn1dXcc5*~;@meDntLDaQiab#Ft^0RdH z)xuL^x}W=pwFK)Ya#0n>zFhJ`ieFWHhE6U5{1Y4xK&;Jzvu127q9*Lq+{&;d&v?VVrW&eJ8^B-S7-@&^@U;OcG`cPCZ`U1cZ z6`O=Oj5cHuIgFC`(gwtp<%mT}eV{K!FT$(Y+kighF9+yRFlT?uqjjxCc;r|gvCgp& zZtss4p>s@mKhY}W-#YA{S3zDFk!%n2JA1n-pj%!=^5=lIZ&VJ=_>=n$%!Z!N+H9o@hujW&<3n3Z7e{e&Z19`ewJl>lz2RW_ZsgZ z!3ZHaT`XDt63s$!!dyVA4P<1LTEp`e%=o@PnxkmbT@hmg0i50e-WBidH%=P8y*0}l z3R7Z<=gGSvoI7|~a0x_fB1E#h{i8MN0NC0v7M>D37qpYHTo$cPWDU?og2!q^`xN#n z+MCJLnbz`$4x(x*Na4baZ0fKxyzi&lp0%6rLKt-T9Cu-J4UDZVuIOxcq0W+$u!$i);})F5aRa2Fl%SwKfV`{tx`D#lU4 zN>tlrH8~Q(O}G9#ao3F6g_YqRcby47WA)0%a=*Y79r0HzDR!5 zh)5OA;J7KA+=?2ztFWr8^IyoGzzex{N_o+U!*Z0N1z84wM+F2{E{!V>T7RJtmK>f#-UZr@|IU%-(0yBqb#nzj?HF6ENtGrP^wV%kuFs)CO1rn{bv(fEI@ z?6b&T;Z1N{t$+b5&v0jZfH9T7PV?lnb990?BfEINkZU$e85S^@68c-}oPC&b&HX&V zP2yH_p6?ZHTy9T5n4^rBuqB3Lraft{z;tlgpNj7m9%5B7&qHvaK1?qM5H)Wmw}CaU zy=VVNfzTiQzlfFq$Q7P)hSOjYxmpah2W}*8LxL9`^mecL;zbi-=I@(5BK3ppfDg3~ z-n^j*L_7^Y%AO3mSHq7WJ3L{A@6+=t{D7jCE_1jf;4%Sof{P0IiS9rb?j(N84@1UF zyfX|mIJ_t4aAELE>P`rO<+$*{2oH3?*}`>fS>RK=IZJ$Ac? z&GJ2g9`%0xg>I@IY0dr#|NCItn+<=mAIw*u{KBLPstr0|HXHSTpTjqwdWv59Gn9-W zbcP#DjR=GOCPBMi9LnT~5fsb$b@HRB8Obkr!rZ-U$*){tPh)eo5dPr7L;L9(&$Cqi zmJakWSgHa?!x=h-cC2iID{OjGv9hpr-)WJa47Hsr5oNxH_k1+U(N`xQZlTol7d1)C zc%s^}azZW}MDvu2oM~S5X--7oZ4{?y>dFe2q5}5{+_QfPBAaHPf3E3T14QBB%#(1@ z7i3^#c@9$hPtIk%A`^-b(jIiDRe_|ieT_S;wcGKn{Ka-lB`I#zBOTN1QMSdnsBKOm z!Ij*yIasNs&5_Nh@{p<&3cT{>RutwdDG{9gznLPT+cxFFRH~?hI^9}m)rDR86B>J$#`3stGz~)7S2e&MkQ3!v}3exH8oUbk;r4g;f;G6+#5B~ zQO+I$NmQ(0-TlHv^gs=*g(C7Q4bz2<7EA!jl1GUbVw+4VQB6q`hrJ(v{Lzwbxn3%0 zMCIa%D@?Gmo|%AK_pcbqEMdUagsNoTsU@*kzWpYl-*XBeokdj2JjYrMCHO}7`@yE5 zWJuIb%oRm5WIS9B8h5eDt?>h3h)2A z7&e1SU*h-?jdIxa1_|T{Sy0DBiguOZgBH0C1XTeB0UUoIhYw*Nq(c}Av;0GS-x?hg zN2}mYIpEq4l7=8C`3@kiTe*4)D`+?t?<%{-4#YA%`i?ox!N&YB7)l-sR}ZUw{lQ}a zFUAlaK7wT8+uaIz1oJWMm61fdt^4fL>}GH!$#Zf;pqgf^v(bys`*rr1BE2l`t3tNj zQZ$Ww7CK5fUKtx!RNiEg2LK!_gwY{5gi4}QZmJ06+_^hHb- zd^~E?di2BRJHZy!lm$955Kr!buOYiiKb$65siVhM!Y(pWpP-I`CK$X0S5=wYjQZot zIn0Y4Dk`%bY?L_%gbMQy{_ZvqVI3`G`5Kso>Mw;Q#*|pi7lMOprSML>9QY$5aP~iv zO?%u%bgTg`RowGkvlUmP(GjE=14MNrgx{p+c-%T}!eP-mdRadm{utU*_Lyt|I?ox^ zRT?z-=f!ZwfA3^X{!T~q_3(OtKlmpO+vEs=ZDL1M%_~L=z$g2-)&t9rGug#Bz1(>m zCxIITnZ59Ha1Llzvmw7P_aLVI@$3yBHP>5Q!X-@X>f4Z41M~p*0Q-YU$rumhALpSc zBdY^z`|ErF^H}=uDM_Xv(XBFKdf_MJtKt20?j^G9kgi&o!gc6-guul;?w&+0p^G>= zn?eJ(gh#IAY{1#=HlZX!6C02dIWj`qKsZ&%_^|QgUi;_>o~kwCXL9~foaXwItM@I*ue7o_U$L{yT(_%&$O31E}H+stA?sjM1cQ zLPDlPRw#98@W>9W970<4td9H2m@cyU_*(x?h-mF&lBpId3~EU(iyalE@ru~7Qs785 zl(XT@Re$!5Dut;hCen@@r`={rHwk)4qMSPQfvd+O%(iTvX0I*x2t=a5*(P1|y6Dmq z)k84HkFRpo)9ehW3#EyTP&|+vKRhFeLpEs)US-+ZhYPiRuvi;Bmwdio-kE17vr^)o z?4a!b?95HH&d(l1$r`jbz)+mqiJ4l4VOei<`$BVVRij=SuFDx&f~`;$Mx)+zJ{I-I zl-UN93}`8EO(KVaZiY9bKJF622RA_68YvT|4?wAc4kQsWIAECP%GolTEw6Sb=xrw` z`XmxehGVg-L>vnMjuB+ApZ6+tcw6QPZ7jJuq?3Df46NRxbrkU*@R+V=yucthe<$}p zu-dEP%407LrWLN@H;3tj;6kO;oT%mqmw$=iCi7EUI- z9n?xlR2ym*eWXbI_xriC$Ps2o!zJ7eu!lh|>iy>aF)bD9B2;uWdA{M7%YoECJ`5eG zih$PE#WF;BY$3O>V%I86Hm$gk>gC&-7eh0ys!V||!M@UnE^cSQvmg*P;tNN+E>JlA z11jMQVN#~QtJ&oYZoeLMdIV7O4rZ?7NcC5owuPWf`;63P`l3w05k-NbA=Y-#;ckh= zikU*iSR-C_d`;Xx;-shrpi17q-_P%^A`a-@WeOMUQOIBMd2Kh{a#ypRfD&o8z}2j} zk2{>N@^QLvHNF5wuby7$vw|?1&W*Cr@-O=Ucr5<8fcB@;@r01dk$P$RY3=Ee*@jyz zPzyNyv~qgk{nBIc+LdH0map@pSu_txE*ek1fLrO0{~Iz2w@MynU51Z&qOKUc-wC%( zNQub5dk8g^$DWd)_hyu0Cxo7M2SCa}_Pd=YJC8D?LY}{az_6rEF!Y-_gbxg3KY-9{ zmYqT2^`6qj)D#;<*+vw|cyr-=+Mm5uy*QWCv_$OMav#WYxpk1AouBc$`)sNp>l08| zy4fgj)gF{#03U&4{kARerN*V$upoT}g8~3Nf0k_xb}o0gAxW*=|AKegxGwWZk!$xc zPQ+$^bPZygUm?Tc9Ds!te-4+<>_6z|h#oBbg|h_sIE_0!nY^(z+<_Z~3?UmKTLxYu;wrWDEI?c5-=uuNn?OA1Ix zJjrPqrW^zvAplS(hsWge8%og`+$6-%i{T|FB0zAb^al4mnS4M?9GM^h2fyz(2VscM zAbjEK#bU*ff)Hlh$2N@h2q+yT7R`89gNnXw7OmIV;-*$aZtzS$F) zZ7HTzu-FyI?P_u{hes?BTvu)dDZK#|up=Du*$`R8&|>wT6_={R6s-999YR;+<7E zb#GJ{)CDg`Kj7$sX5w6mO%+_KYh))EC}cRZz%2ib_s)m~G8V_LNm|mCx~1H)CBO+> zxYCVocbM7gn9EK*ju(IZ82L=#e&Tr7S^zp!n14EovPDLa^@tnvdOn4pwLoJz|2*}d z3FGx@u)u+-krYIZ=wxLM-3MI$6Z96A^a+$LTZ8`J=Rz1gx9E#})6^8)$RPIsSa>g7 zdoh)6cs>ND7=7BwUSO40noD9wnDAgYo`0kw23O4Vji&I~Wq81fT*sZueX+stElhFq zr#`}CSXW{{e+$z*9OOK){CcUV-W z9c9637x9AOMFk%K9~1JQ4p0J+b}dl1O2VKzK!R(W3ZbMjYT}rPmqd)DJM@Z0sG02# z;6|1dQXl}n&Y=cl3p5}PR;oM#jiN9XyBe5+O8wD?KJV)SVkTjALJkv~I~f;&PW6C+2yiBK z0f1tWpDI+qkxmG{NR`%Fy&VI^!vVCQ?AIU%y-^%kuws*s+oDyDtL~P}&K)j5G;2w- z2(ztw_axa4L!j?sH}LLN;OJKTIh-)IB7q-Ov?|CL9k%Y{e=4Z=^crj+M-l0?TE2i< z4niSOvjLCgNgA#2^=;8ha0^>J>9zr6B8K_&aOzA*5LWxJF{RPe#6Vi)8 zE=E@1{*l`7DDu$ISs@?EFNQd5MS^&;O{krckHD;8 zLg|%=1?q`>BT?x68jAd`3Iktb_}e-Fo0fHv{ElelQXcA z_x<65+>kSSw7Gez~m=c0F-4jh$UcfYIu|k-cOM_T!Ncd{jffU#Th)FPN4yr zRmAYF7GU#T$Uta0NaYf$lkRz4#Oz*MNiPx3vQaa1>YPRP?Zp5F7pgUal%MZB&BWj9 zK5xiO*!KfiB>T&H|$ZCt2doNjTApkWUqc8C;~wjt8n-2Hk;GUQ}68>EGuz zikKGe$|w>f-jp~kV8NlJ_yRr#cP>F11Hr!xp$*fmSDkrNt{18nRam%MDxhzi@%mCm z1xGmBviHS;8p1{@z~>hrNn;h9M5iwZ%vLPPk;=@qP*haiuzYnyE9I9?qGp$YEA~h50{Ck;b5H8DfHtMm9&D5QyOK)o8jeLqkwRx@m>_1 zgGh%w0s5s?cWB$du{4_7d3TLd+1)`R&ZEI{T*>WPco*s7;MZylzLGGGfV9OnHa1lDZ-=m)3uok5U0p= zfGgkPTBa;TaCN}CO?_D2s6PCTzbTyuD2gWYVM5nr;w!1tQ}a@=$UFiIggXQFQ?Bk1 zjZ-U27ZO2KFI|Aof^HyGM~ttt|MUNHOnMJHhUJj=fR-`)!-o$<+C>F@3=tmaJ%zGa z;9^hlB*kz+Zz2!TI`K>87sNo(I%N$?Fd6(p&lw!OU+E6L+;K_uITcPACaJnuEnD$ z3}aQWI6WiSIdBFE+2-)U?;QJj1+5W_KjYmwevZt+Qpk<@A`)e(@G-MZ4X9|p$u!)! z;j>FI{!~%YKx1$fi@!YI$}M*vId{_u{0#Km$wv|y3icC-sf^Mqpff@xoIS8>+i)Ef zxMB}BYeC4oAeL|!4tZBh>V;9A66Z*rk9jz@a7N1XZnxtIBW*bb1bj_01@-P4ak#QZ zoqen)A1myqi-dZKDm@q>gc7%9uF7B)ueUvH?t!?()rVUw8bKeD)X@gxgMDG@UYmcr z_2B|zGJQ8g5)@K{k&MCQ3*Kr2RziBn{VmoZf*z|eyO1&~9xTc>KP@mQl_2~eluwbJ z@^SwlF;L6@LO$opXEH8GcM<1%Gfe7wbBF4}w%DD15zCYyRr-DEl0yDL;;3#BA)zAG zK(Qy~+07+Cm09xIq>RNTAls%!1O9QGh zphLt|Tn;l-Bjs0AGLvU9Nd!bVnbVcefkc$WpuyW~guNZ)33}d>W#4nxIAu5$$UsB5 zct0Fv@%0)=IzHuqlV*uwU8JgOT=X1q9_t}zaWOcXUtUrXgN}oQeuQeE8f%W8eVOaA z!%}5<%wVp7f?fyfY>#$`LK!EuPw6Ux@+YDf`No_2 z1*8OJgCiy9Ko|>ej^wss-lNEGF3(eBD5wwA?)n?i-NPo+wHV}6#kIB1)$+Orj4I_SN9k)0!a>}kiRG|e zT1!Qan8o3Cv*H{krVkKF;#`@Z7QRSEgMjGNQNMU6IxL=v`$LfP0L3$kJ1w2&Tp|oo z-~#k^bzOjrE5LVDjUd*0WK(wAaVnO}V9Xn%6j=B#*)#qltOfry{Ka3F=lGxG3knnTT&kgm|Eb?KqS`ou=E1Z0Fo21r z)xt?l-5_VtEJ^m!8%U!eOg~L(svV<|86MaS!K_hD(KM|4(x+#A5;Avg4ignI;9ReY zU_Eg{{F}f#{7oL^{=nQe$RI7TgrZW0!Fm?0D<@y#<;U#UFXTxt5lkq3D$MY5{PjKD zNA(BAF24ERs$I(SW2lgN@y#o65azlu4GcG_tif(MvW9B)MAvg%H9U_4d>}MExqQ|9 zcnu~$`zqUFmJ0L5T)}uFrJTXu&(9}Xfyyv?M}Y|a3nS&_!adfBe6WWMzv*Q3Ri@wE zhL-#B0qpOuSC|?wTsZpy(&8Q*PA*to^#Theu(?oW=s2j7RYMOHSO%0b>W=ofqVG7u z;&$LoQF@4tHfhSmN7(olwzF(E{~Cub=ChWjOPhKlpDi{OAh2yahKD$a)F&z^HTE5 z3V)LliZgWF9wWd4gRf9~%<|3iYo%LmVNI!{6D$xq(3*R?F738Z?i4$^=&_1+gi~(a zT(C_ks<@<%*^3@bWG;M{)8)mEW+FiElN;F!hER%ue~LU3T?dBZ8-6;^eEba18=9_| zhB}5_!ItI5mc1-vh@D%EYuU{GPj`yRWOZ0V{(}Z{PJaT(==xL>f;|{b3u@Kmq09`! zBUjrn8s#3exDFow{?Ss*GVmhyUI1oQ3?6{Y>5Fy=AlQ`ay90G5hZp&`dk5jJAMEBG+2=vT?SzE1yS zW)&C(59J{ux;_SQ0>BA!09zUJcM*w2Nf#ysCp(4rRFV}vYD7mDT{lW(oDXy0X$`{? z#VhrPgyD6L}=n(47aIb@8w+oF{n>oao@4l zb@&7Kj_7#^hNzlkAQcYa*E)gNtk9DOsqED=lr*h4G2V>AjzJ^fhk~+7DeCGr6!PY zx-8K<`#gzxehxA-XR{tP>ZKyM$D$xui9~JYXZjs6hsVA_`*w2s1ffoI#le2P08vTo z;d3%9Mpr+t+KF1r%3rD_qad?UgU0=F8Ad&wylD!zr=Brnqxh_)R63#^i@(OgtHQ;~ za09ad(u=u98Un?RC1XoIoK#nl++Vcv(>@*lmb=JeYhW4?Ttf6Y1k5kYjQ5`_epN-n zPBO6Dlbm_{%Z}7NNpQLdP%S?c9ek@0f8~@>n)l`1COn=1s;yyNA{?ftUzC3aITe8L z=<6RL1<7?KV`ff}$u(QahR|VL8aM%OpQ+O)mNEh}zM5$W37JP;k*r7fdrTF*r^n&L^j}=4NgDl>VADN4DetN+>}qP?+%eSxfENB)f5D@--|9AY51RWD z3_^6&a7pz#tGQ)2?eYVU+DH0yMRAbbB;C%Sn?Y~Gr3}5{pv*l#NkgicSAIK8!*EYw zmQXKcL29r9ZpjIJnVi7>5RV$*DP|`vWtQrm1Q_sjl)4x~CAkZk$)l3R<5)qm0k|=) zS4s`TMYNEm2q0BIFX+1L^PMlNIghL@pJ9_?YYMB*Kq{;b5kvZkJX5cEB;p0n*&#eD ziS(!}zaH-LvhF&>`b)q{*5F$_ky zM|12prj$_;=;1aa<%X0(rZz0WE-@UzF5s%V3a8*f7;?xK1kw}^Z>np2sg_Zo%HHU} z{&tdL)}*00>{RcEG4HJ1KE_Jl!}rEyFpUY3Ye8SfRY*)9V@%L?V3CDw3F+S^nzV4T zt;9AHXK>!FIZS>jAhZ_(R;>WgzkT-Ezws#k4ZGC*mqZbhUvFF2q7_MSQb?L}yO&0^ zb{azb5tsnYXg`%0shblVNS^AL2H-} z$IPG`5d`Q$4Fo8nGe{UwRv1Bte?I)|-!#w=B4#*9L|eDM_>Tl)`Hw&Uio0y3Fo$ z0+;$EjDSyp42vJz601dGx+Ou^Uu8z|RW z&DhQ@BIG~+0U|Rs1zzs($`=UkbaYHBTu3?0o)CkTgd=~z(uUE`z#z@0hXD0-h(xH= z3^g*!6QP7}Q}WXs!+#NiBM?Dt4lda3+#ZiDN{J5L;?8_%XWi-8=wx4bY=P=?3=jMd z=O*5HG4sIH^Bm8@Lr$q3Ga;Zz_zg?zVdij{N~dY@%@fEJc%P|JvQ<*tM1&hna<1f| z6dm|W3L~y+Azv)p!go3&F)?c&QYHB~BbS5o10p$vlhHGmj7qxkA<(5S{tH$r+klQ~ zFQ4NVk?V=1mw9k>(v$7?-IPP_4svkq-Wd>xb^|W6Qd7T>-i8#kXs8qN{Bi9-T=w|7 zumMf*Be5T|o{j_nf+UvAZmO&O5!BVOz69mp5SbuBk!9&~tHp@WJlX|9Wad`Y&%(>9RRp8{K+220P@c)S^!atw_gRY=a zI(uvFO9#$-OF;k|k*-Md?j9hIP#33P_|`axVw+9>Q2tv|IAt+RM5NYP1wbuvaN_AI ztD8_XYP1+7ZJ)deB`OTDpX5WmM;{yovn1E^GTgRdFwS#aJg4h6TAIxEDa zf!ChY2=hd)-9cg^Kn)96sM}q!LUQzH(Y!X2;3%q)fsk=GaX5y)J(Q$d3C=_JX8e4H zD~>7?#hIhtoe$IgwS0uF;R7~#Zf1VTGq(|8ruK>&^qLf{YMU@1#%*!56Wm<|%eg$) zqJ6vJ8ECsPpnKP_E0^#AhMnAv@HLb+2DN}OKd1=!f67kfCMFP1`l>FolX{F8E2_F! zjIRxmT8tUZ1;PoWHdp#ywHD}G4iqc~kOfOeXh55aH(n@AZY?PZcP4!@Jv`% zNrbEST92ixur#cVp0r{rcFPrl?FxDS*`~c+JO8RquIz6a^bK;TL{z9D1(}VUCMR~d zpMsEBO+_;CzO#yY#MF#N@+o@xAaLo&BXjpW8s`l@b&jRx6hiK((zlnWTJn-maEk6b z>+of)VM^^7|EXz1{SWi(Db5AJZ^*f~^Q%u!tkI3R!HYh;F&TLD5sMdfWm z>Veq${B`5-pw~Eh-Rtf(4jP?a_vH0K6VG8kf)_d0=lGz}Ix6;hTPsLv(ojB`7QDQzAa;vzzNflJlJ&z*)&%!63x_@(G=}@YxK`pme^A zwb?hyf_6L2#&@<~aV7mmZnOMfz9X9zKAdeG_Rp1HuI5f$1@3#Dp09x*P1nGiZsj$c zj^TC|roFjE92|v3@XXRhO#g57GWOfuO|N3FldMDVA}0+Fo1K?Ur9gA#e| zwvHN|*NaEt8B^4UOv%l1XXSBjR4<0$+|G`hdj}#HGyVC|&U4K`eke)cU1ssq;YY~^ z6A8D4c^^Sz>WoWT_Mb%c=`^Ry`!=Etl`x1!4@eddI5c>n^C2uYN$$^aAGf#gAudPy z%eS<%Rf(1`7rhDchbHG)e!~uKqmLO=;l)BpS{-~mAK=|(mhI4&x0L*JLNMvPd*{+8n@>CXupDJ>~-4O>(EK`5tsK|+W2 z2`5YYrz2))^&iqtYaTVOYHJ<4Tv1q-hu{?za{((G7jzl(_1T@QQB@jNIsnzPuko%r zrj-}9Aw{kMRE+7O`k*LkK~2+nr6T&p0C#>ydRfea`V#9^H~FlX!^)i`_gaF8=@E;z z?mL2QOF{PSaOz)|&l5KnjcLb5g>8h**8;4qFLHNe)*!w5R8%0KpP43-i+KMX$)miy zaCXYw|EE%lh1#7~`pVjkO9C`gvNh=QR(Ep|@#ymf|43@F%StM!j%n3_mkVFPCRnr2 z9+4n@*B48|eeNumM2sMIpI(#QpPb``Ja9}2?BkKpbE~mn%ienMSX5zfMcl~MzNmrl zNPg6Uoc{B6wzIQi%2JeD|9*dr4!LhKvr>LzKAi=qywR3$5 z`2HN)0Ix|3eE+!wgmOd2dTtRBOZP|6W*y_3o5+_)<{oR=F;J^auqbw%Q zdN9@d{E~d56HDy}ly$ii^wLA(( zT7L(Gp}xeNAIzmsLIdZdMk32?P$gBRn~!m#;}}?q#j^JHC3fcOuvaJNHn5I49barr z$?{kB^Z&B{9{TCO5c>gDZjn5<@BgxlhZd+Zo;A760#2iBpH`#s9>`^3w8|nxqi}(n z@MeFQ_g5PGmBuzL;_mZ!UeITn(AUzRo8taJQlh3O z;-%F13-Ys(n2_tfKka{r9VB(|wjsx;Ei-Dt<=MwguXV=WKF0ic-)bsrW?N$>>XrhwA=TLX`Dy&9xEA1=BWFF?Bm!?fRM7ANCP;^{8 zAAkGo-yrL8QF*U@(1zdipt1KI3bs6c{2#@J(oP?KP~+JveRrz!?Qv| z2alVf|MSAnubT%4?H}0kWufJ;@v?bz(qPl?3Qg_f#$M~>HJg54XlfiBzmhS3C^Wn{ z{mWl4;K`%#dkbG^?S0p4{&;e9dWg2CkDfh>`$?L=Z+6gpPmuav82{(f#?i^?VXxCT zdPx|4`TY6QxV_VEv-g+g(SGlcQ^&9FwGWTmUBtqA`^^`P(}NSVKC5azJwk`pk$|nL z{iuzR>2dkIjeSBoJ+RPnf_v-OXV^kq3<7ya9F`uN58FLGJVr1Et#NyCwpRfS z?cMgl_cFc;YRw<_4o}k~;`>pR=`^2#4RUik^owPf$ z_^SEAhh=e9&^~Uy#98>apI1Tsdwx6gr~>_Q>&V-`tOCAn(B;jSRR^G5Ok{mobp(fv zlUIP^No$XI{bki52qm6&7YkzRaNB7Mxhn&%qlaV?unj#9nAhHK_Fi-vhs2)<`?U4+$lD|2)Aqgg5ueFD zGA_9JENyaaL_;?;f=NtbDvM7jml5KZ5K<>j3FXy=tY* z8jsrmK<@L_u-pDI_i_9Aq|*XL9tgt@pSQMG&CVf|#Huxbi~;GFXo@H1qZ)@eQ8vX> z@-J6n^+Xq zgnjM3g4)lG3l( z$CF8${{;O8jqyl|jYuDTgbwj2(hdjhZubD&vsn^uo9p!#@uNh^nl^R>uM>WoHtMDe zHn4+a|HqTZSXpF0=}0s_MPo$xLgRBZMr2PL@lA61gkz_z$1OT*61J9W{ITb*Bs@C(E}Mm8#uGS3()CHNtQY9-(fo;+ ztS!jSZSR8@izErSXl?lUq`lkj>nJX~iN24b27~15CNz|4byAyPNyAEO!$Wt}6$f2}nvaH8G2bPE&by=&MEH4Yw|Uq~ zdqgm%J(@orH?R!agAttGA!&@zjEz`e(j!9Ed&n-69uczML$&0DA3@K4xrha8+d=b1 z9s%{|fGrV{+R$+yOu);12uc-lI3nyj;&ReLMIENB>KIi+#ciSO@nn(-I2J1G=}QWw zcsj)%ugYDH+E6(mhFZWo(SXC}wI$KE<7TzVTr@2hIj!%TNyoTE?btdzK4of1x-@M$ zXwavk%6vo_Z382MSB#2n#1(CUPP;Gadc+gD3!uv`lBd>cj>)h^9|Z!V0Ts{28{DB< zF+w8;5hgw)x=_n)=G%=2qJ$d}Q-#sbAJ%$G!YoEk!@bz|H?uxvM2kkA?Cw-r(~ugnG9ZUT*6py_ILdWJ zr-&IzCz%JTrRbPpzDP?+*DmZ_coX?yt~+3-bvee>hTus(aD78VZ3gPz%H~pR7o|i=(gxY-Xpj~iJ=l~0t7WWbxB%Bq|A~XaSX53F`qj2iJYKer3I1ri-#Q=!s9vj3R9FI9RM4x-b z-UQd;*@aOe^L!og_(HpCc!}7JEzy6R*khqty~BwW5L%8k2wMe{HZ7M#PY+{KXLO>f zm)o5|CJKAG(+{uI-<7yyLMNAmLRDN%1<*_+hAtIw3$oEWC7OKrR$c~&o)su&;xu%r zKsM6?LYE5oMpsA$#<`cI0_TAF=0*lUk{DUs2p9~TDi9B>j4c&Vgt`aj0wY@-sZT0^ zc-Y)m?IMYag>QB>kRE}hZVANe7g2K30n&_T8+dQhWa>nOaMA`f_NWWL2Ud;Y5yDBA z_A5ywhyYI74jTMw1aQ*y<7-->k*t%Z*L%BrLzop9M?dObVulW@@QTb+|r=$upmpoY9^?=KME6&-gG zoS+L$gm&Zr6+K}R!)O;$kLX^}uc=8T@vJNQ9JWmHia1`;>jX|?KrAA1Ri7LWiicg% z)dH{)=_~pKff-prMK8CpmclED)uqsa{?+;m!*oayP)}iG7ZqPd1RHLX*m)_G^K;v| zB>KWF^ZS5EeH8-`P}=*Bi_*o%vw~ar`&RRZ1(@iqoi_YHJmd&UZ|c6%^ri?tZ|Ss) z{yF=WW`;zV_yEgiQ15(1Id9$-weJXiUMwW;)|+1)5JHX@ zam^cuIv(su^hj?OP2K$eWso4Ej5NpZiXLSj441$u+&T1u;M<8;**idU39S`SVpK|_ zZxt}o6oN#N^htBdXcK6i%QxM?rm9+u4+9m zTcqZAym6$RK|J5sbSx%!JX=N&I;SWiu`p#pn-LE^YD>mwJc}?EFPp)QKqqTFfn(&q zz^pmxE|@uKN90|!4vdeJSG2d0)g~w%jyZN}@BRryyGzvon5LN&5vV+YJ=6)Q-lVtg zo=R*zuE85zE8LW;+dk4ZE0Hu4UZFtYl4GHTZX({XQ%f1ZK}mc+Gl zU0?x;#vOo|YejArZG^bfTq{nT2e9Ddn*1A4H8=DSi9H?qdLzQ-+8M7!YsAcaD;(%2 zNPa+%D87n4lru-HXYyxTeC$w0+b@|hN!A^erP!e=huT~DZXbq4wD5+UHX0%3&B77e znt>32EtGf+NwLspmG%Im?jR*9_w}?LX*HHw6F;ACCr*hUFP>T20SBsB7*8#2=HKeO zi>H>hqs|ZG9ueeeBR`BV;!zW!8N?ycFCK2%FJyAWlSQH^5}TG82Wbz=q-Ix=eB&YI zI~>yR*DzFsR7DrhQjgH8=#-?ghI38383JI#5o&3Bk~R?`SJlCiVyofevxr{<--_B> zI#uwqqetSeH zh|_uj=S+Jr3A7j?EVO$>FrIhXVHfPAedvASahLnpcOrqLUD&9}!SSfmcKLvIh(}%O zpo;-KB7vlR_>s^hA_LHjX|#)zS&|No7rY}vhzE= z@I9=j@+7<)tWcXSVqNl0ux_*LDx3FS=N;sUxlgZoSJMuc%H(oC zAnt3XY#^k|vkSyo(KGUocmU;Y3rM-#5zMB7=*s=RZ+94kIlRvdBZ#p#hS?gf%FH0Qt~lB0-ZO^01p8ssa_n~;F3k#0t8Q}JgzPGbyY$zL&9w&Hw#zH_ImJE z?Nfuw5k&(5@c+GS;2Gx zd^17#uvqjv!iBtjT>t#OC0Y?WMht~5b&UHx?U%^GXdiuVSJ>jNbM2Z9K+2CBPddPI z7f(?{r=)SeWs)`SJ!zGpJu35l?;`>s>86w9`bCK3`f=N$$VZqY?QM1VRf7T9uX*NH z7?}Hf!rhW?dz>TRuM(u)LnLNM7IHN};Y7qNfOjJ8lF!h|*wf2jiN;Xqz|ob!gf`iG z)et1F1fpt+-lY?dRqlBhQP%#rY!9d>`GoA9d=c_Q^bO{(_w=$#z3R0xBlpujzDkM=!TL}_?683}I zTUdc!#38=S3L2_tx#)ip6(sslA#LO z60qRd?Xc1TU`DJ^pT5od#&4+GS|RT$LT_xa=sm6isT+m7`N?^|^jf3>(h9%NPwPGFT; zyHrq-y8N<;(sS+v1MA`78QdB`v^C~nXe+7(%0JKX?GcLq4Q^1Nu786%cW3jP!K@a* zSRPlPbvBxuNvRn@5rvhP&XW#&z)hycD{fj+kHzHr!!b{e$0@z^VVM%7^ySoAVB*RI zM!Q&9h5|;!xmo~vi5lr={n_wbmzID?YBHi=`sG_-8vhr#I35qC>w!*+HoyY8{$B+sqn-?+0LqDCL}84X0C- zUz8oxIw6!t9M4cwPWeH^?)A4FW^54~Yx2IhwYQV$@F!BwT{j09ZF+Yy zD7d6lZr}p;Ee~S6d;dQ0K4Wt{S-(kKK+XKLQvHnlsre(tE;~7M3&tH4oNA? zYZebfVXhHSY48z6x<;RrS-qNk;M=g=ln<#?MQwP81Ua(euS!R^07R@ejWJ5Gv@aNPXX*qR1?GfXoM3$|Lye z95M`Y7M}%BrDYQg8baX8@I=m}7MVA$uSY{b`2$}U2EX85QXW_fV>rn&jOkzDV>k1Q zK|mXxSNzpvKc^{zCx?09sh4;%z_~3av7eUAus*ZldK|!Ev0$(I&3fRzKyAJE!^`mi zFNWM1-agSXn4gVMn)Z0YVwNeq*3CG>zA0P35pK6`<{&05QpW?*H zrl1p|!n7#3WNrx?tVLt<@$j#6r84268?h&JQUSpp88cq~uC>vQ>Mz4LQ2|A1W-1R5 z06=uSuK~4gRBNMU4b-lTQ3VRCQlFc8=YU}O2JGfDv zFRQ)7hCv@y8&;|i)$qPTGtlvL4(@q=Gkg!T)lIns+){4(4Ju>f*_5HYl?L^*MDDi( zR2W1B)Ue`vhhxu$az=t6ixIE@^0ka!Vma}X=WagOlu3c~n zzMvBOXmHs-$BXyaBepE%?fHBN^$9i9S+e_r#3j>G)~aeSb&K|FPTQ!Dx0*fQV=Z~@vllce_-BYf< zxyhhjO`tOkE>u*sBJAYTf@e4ist(wL&KqU`3*-X?^K0rAf&pB^Q?7wHi^cL>G439> z2$^_uPpZ80r{eOZdb>j+!Uhw}XZXh11W5H^c!B?ArS-RFQc@AcR%9~W!EH~la0@_< zoxWkOqONQ#a-u|BffLWK;7#EX#s?PsSKt~qV}Q_ElocjZOeY_TwuZlKDyx|J;WQL;If;R_$&)MW-L{51|a>@U2kN@4#H2W7oQN;~CUSojC={7Dd zfbg>+4H)HI+5X^7AN1E3P&gTNL;~%t`yDc zIk6PVju#3(;DhWH|CO)RI{fJ2dAe`QuXpTk`xn)gtkUD<6rP9xD5E$CACZ6%tv?N> zkae6yMH|c^3Sc~43#5<-V&tHU5LA-4lkWcn3{I?EkT>2a)A__>n(5Mu!4K^a`~xYaKKce-71=k-}}G zv|>pB$?Q;CW|MP1AaoIxO>T^uq*j)fW2oSQ_*NI+YO5u@rja2_p>mTqsPikR1p;XC zRUk-I6W3!LameFT%Yt&E9IYDl#0wyzB^_#N*(zgglj-Q8NDn)(0;jwKe&)}nESvO$ zweS-n8l2KJ$n0!1muGy;!6w_NbxuALCz8<-U2}ZnXAnqwy2tvw804uwumx5|J3^lk zwXgaES@wEne||F&+JFPZyu81pToe2=-$PZHChUmLW_3}B;};T@gb#BOvJRUaUWi2^ zFFAR?E4+cZlbuZXrWobqB$FpBF$zH?SfbW%8xvmP#n$jc_yBDdO8>Lr&4(dObVQ=$ zJqXVbt!iR^T6)vMFaS8UsR~m#T zd0;IcYQ^}(iMoV;Iw%w6-}&Jt@K^AnCJxK9c>%K&k7b?;T&}`jl;o7KZi(= zH^=qqN^N|cTB_^x88lgQ7_=A+s67RewFoKWF{{V>75 z)?@UDwq8uG;Nlp-Z##mob8$p_gy69ARx)`0TiAX9usN*eQgfr^hsDEw351pP{)|jL zr*r&Ld|M9^J}Es&M@k$LI5dG?mr;MK=Xn2P$HD}%6aV#7<*!f|ChrD6h>tl+H?*P?O*UWy7Z@!cd(w&euoK|N%zu)PEwCFtl?Niyl%D5;feNXf+OhE@ z!{@bK?c8Mxa2O}&80HXO!`PeP!?Ia;JUxJ@j1*xqb|Lt!OJTP4)gb}ao*pYy`FIjU ztpMGCTLv*)dO*-A!7=3LK9?VgTlqSB@Fia7tCO6Hkg6(0FqZkmAebIoy3mH=ZiegBq(tBMP`nQRR1jGo%^T3jArFN>)Ksh1)6EK``v`Fsv6 zfe9QkU zc3(c}{H&45KmBu-ybBis9qQrN3-j_Kxov)CdDwQUx?C9goTq3GsVMUghv~w{J=_~w zwCkeJ(oLcm&qpA{d2n9 z;rOnZdP2^@DQt$~@tT9)=XV&3#>j6;`~}*|42J@2{Pb1!c;^vaNpFyZix9wd9~nI2 zIRgs~zYG3pUMq){OsVxbJUI=w(>8!?-M6LR0^KJ&Prg8^!b44nI37%i@C^PS!v?95 z@PJ<+i=$??whaZB1@nVQ6F?Us?06is_TE+hI&kSliSLqVZKxVX+8U9UBMAt|6DV+S zrJP^2a$E;lCjs5g^VrYR2{{}9j}8>QK^ICI+C83(`qK#vAq(zJfxQku&T0Q%a<5uVeI-8@9VO|Sg;kGO8wAk zCyBa|;E+ls+}0paPmEH};AkJbhz|&5JK$3?_kr0KFIXU*92v#~ymvi(^VL3LbSFrB z`l1@D%3}UY)8im*7hk3E!$r(edn3)UFO!C^hqN<7dy-gNv*}Frz6+v>S+Va*qx8G8J5COwH1Kn*c2s=NB6Ag5h2w~eeK`h4`cj4fT z*-f_*T?Gj0A(=)HKWUqCm{H^q*@1(Lq_3-b}t0x=h>&acQPFtb&g6D zR2#Tx|GNFH5Tpfl8zvs;jh0eU$k8OE@(#yTzZJdu@B70MuPbfiQXa2OPR1}SkmHJd zcE3MLw06h_V}V>oEgT$tMADMV=eYMoTUOUu%HPI=4@(?oB-#6x{81dGKNk=z`Br+B zBsgd&@=0j?Y}j29$K|UrS?hK5@7ywcee_nqwFLjR?hBZJ(z-?bQU4yv%YtD$g_Gk( zFrn6gIzHplqmPdVYuhEb45?S=qwP3h&5I*I&z#8~C#tnGm&}zrOVB8353H`OcXEhG zY4gt~cyrLYpM3KcRtG0SLfCt94?uyZp|Oya6R#IZ4hwh&a`(|w?q$}3>ouHuH;@vO z3tSBx2|J4zqj0^#bSSZ4Kl?=e7RPMUz z2~JDzebU*&rk(6Xv;ej}^OjA-w(RI_5E*v2Y53zDy(cKXh_uE7x-tl9*F?Pq5~}l$1|~~b*44J zsZ%TgC~5qD%2AtcvR2H`_e!G97obBToi`blgc&80JtnAc3v5YfXV%|$Pzd+HVz`i_@_sLt$Up>o1( z01gbdPPkzWLdGR)39Jfv$eds)pwZzQ)RwTtn@2mET0vLJV7D7*lFNx_tZl*~AgG)G zV!i~gLsFT*>rnG~{T9`iJ5P7MBnN}0F_Xvd;uqVzMK4!OY)<%s!4~aQ z>~dJtzgASBvTtv{KtdoIB3FWKIqq7z z>OPcfUOt5rcELe;Gv$j-_9>&UXjUyy^riw0gP!!Nnm4&4W~U{FL}B_2cOl`Wh!<+1 zD~)j-WX7D+fo20cDzK{1;G%$yHg|u@YZK5e^^XEh7okjgD=dW5E{GfQh>oL^cI&=_ z>+9^^Z|(s<5{X083pT8D#KgP=Qn3jtRIbHbUuzo~Vhldf1SB zp&A(+ZDL0lg1q!j_MkXX#L{|5A>cBUh#!$Tmt%wuEaO7~94q0(qn*bIPV6Jq8kNE% zAg0Kx3EiyyF~OBE#7a`tk~SYWmz+H(D54F(JDE?B9+8xZ3Mcy_d@=igpf2vUPcoTK{j7w~ z#(*yK3ds3Y#6045e=hL8VWl1zY#RaY?B{@PkrItTu7T4LytAJlzMTPWZRI!DjwGvU zN5DuA0amcNs2L$Q#MuS;9KWL_og^(RXZvTrd;I0^KR$o_?03I?^xH=pLs?m=pzJX} zPJvP`gLh|M(4{|2VR?=cImlX=y{p9l9Go1@!9^Cp9q_8+eRe=-euj)4^V$%w-fT{r zf{K=3QsnOIV=9&_Fx|sy4!M{uUqM{p#yNtxQ-{Lv^E+AzDJ*@RM@JU%&Pn-WZ#J01t`1oDBV2XzL;vCeG`2Y= zXv-n|!S|Wisvp`o{5tSdNX;bKc`a&1E-#15z#_y<1;f!yhtXLlTAuz?Bu=>>q1ych zxt=UgfS7INmQ;iz9;Z1Fv>|(WvXl2#3txK!Cq^ysfIDzZ5i*WTYzuhwg8z`j3t+G6 zPyE-$Ac3{WC!nj~OSLvH{Dz}yZ5~X9W8&tGx9ILIapeX)+rUvk2aXN!$XV}jgR%UC zbb#uPjV)n5FE~vpEP4A`%l(%am0OjwVlgsOVy1;st`-N7_MX@YF1aLX96z=p!6dVG znRO3g&q8_f(c;P9S>y|L$oz2!tAYzSA|vzQGDJ~$ffPm)++;4GNBrQD!$0P(6#~U= zFU5ev0V;sH9-~#SYoY!X#|u*|mdsW=Qp{gz>J^OOB$$`x)ub;St&~?ohDScuF*o3? zf?Sqtxo`r}>|10&vZj+w6{_kG5*02BnLzmLfz|WApYE^-|2v~yH)@*w(e+z+!3ica!fLVO%NGYa#*}AA6WH*L&`l=v(hQ8VH#n@0^|nwY`$;MH`lju5OaDd9uFq1 z9{ZmmL<{QH=&Xc&JR=i*#~`7Ua(X$3PNhDq!x&O zC#bYq9AiCY!;(AMV}Nv$m6Q zb@>KKG8KP}F~}Uth+1`SXFZ%kt|_i}buis^webCwmGH@j!a)^5Wp?u#Rz-q6)#M__ z4T)>%S4uA%H#j!s$sM7@{E*&QmTs;zDMXnoCxGiOmOp4TLEl6rCCD5V`QY}`inADI zUkpY!{a)0o@tBCc^MOO34f*RQDV}n`OD(K``|$yuy|UbyV^nqIjqOM1g&U%h z*D0eUV2C6J_}KbPv@fEJig{bZba*+$jo6qJ*+QW*sSyqh8g<@~FUo-Vcrt$A^XW${ zXH6!PV&6k`gCi-65APtg|55S7>*J~(ZbuK-HO5ksy1^4D>$}=Gwl-0e_ZpGr82T18 zS=IN&n!X%fiJ#^ZMUZYbyMBvmanbugUK@WdVCMQ@_2oE3<0m!_xP4?i-T`nIHvGQ{ z;Cwm10N}*uMJa#^wC_QvweSs|BO6xquLvWvww#*pzj+#4u2>@^zSe4#Re0B+GcF@| zT4DVWY6!r6uNZ5k`78X2SoTZZEeu2Z%EmELeAw#(7EWwiR|KrlAt9Sg8}b2b1F`}z z_-p`75g-NcHlkTc-j{6FO=qZ^X8WzmxA0w|Jexr#h#OadA{gbLa3%3q2Z_cXs}e}B z@cbd_qO-D#yk==NYQyCVgXPxj3!$rObPx`-r*7~L&lMD71B(c9XFrG_5m8%k0m-!M zy5Jq1WCmMpM5ly~m~XH4sAbMT-{AuMvSMxt%3pG1W;%%%=*)Nbsa2m^0^UZ>@BZ_E z)u7-xgGj)vm&o8CwRvK0WAfIL(kU@UvT3F)!V483su|u?o%a#@%lQ|ykc0^!zBR?= z2Im2}!h0@2m~zQZ`Le7<0g_DW0IJ9||CPz8GT+COJ#*Yh0jJb7SQ=5>SF85_AG{2QuV#2 zlEfn!1cl(|*Ob-=w6muYpc7^vBnwK5nfAA~61s$&2Y79qk+-h+3b*GFsB^EDx;~T% z1j;%(3dIB=qr-rxsAuvq+=N`rmZOay$00=+E6*r zP2jY0)**^u!LK3!!DR{*@giS?U&62EnkRz35_mo6t?-&UotL{RQMh5XKCG8q&Xgke znz4^TGBv-{L0L%Lw%yKN;*ZNIZrp8WyZ9527@&4R1AnO=u_blT5;xix+p?)PdRVct zO#7%)`it#s4^8Kv_^!@t{PhV>O0p2_A^s*MVROR`g>&3#T={QNeT zDXFB=BG``Ai;iqb$RR$`QgRGwH80z9xF?~j-8dJ}r;L%K_6{W;?(mc`gg9mpk}0wQ z^WBAVWdY**G6q5)eoz*UE)ZEFYS>c2B=w^LRu~dto{a;kJGj(4Iv`rvqO5dPb9APo zD`6vM=wADv-RT}T_L>1SNdiyOdJA3~pm7O}mH&DH9%0r7-s!^S6i}`t_Xo90Y&$%g z93R$GY?E!`qpUoNdqKEi{C0p^1XH+L^(91H8-jy`%i>GU=mNGiTtMTty4lqP&p1^q zu8Hagypjap@OZ-KIs!JLeCN#syyU7{;nqMXyv}DR22hpvklewX%x|voO6i>^;U&5)-E4JtyV6~`npamZ*k1N^&uh*X>Zy5X_ z?+aK2G`EbR8j=uw!AN+euisWpB9JWZrOIAtyNOVo#bBD&+{y02M7XC6?0b1L3*WltIKck}5DOj9Ju zXicJ8l;rLPW9IK{u1b1xhX1Q$@i&QGSB+*;GSZ@4HjZeigLmPKZ=3{w^lnE9j9$~<>(9LI%k(Eg1J#G<@pk!2dIwArfTgljsGq=u?vQo9s>}`K^!Ky-)XvQsxs>dDy&HUGD1@9Fm z#Dh^%%StD$M7IU%dHBe$@s~By?|7Jd6(yp0eCwDYfe2nTj*glKiPgS<82AF-0iS*# zjtB|p$O8WRylf*9t`vaHqIW`VW#L~=e@lVu( zCK7gpfB4`{LsJ>NpNV?%-Hhdd=r5-5`y#4OWDQcq?u14f<%6JKiCIk>KahPqO^Lei z0@Z*zwax_DkeFe!$3ksF=iL}^b-G3HEy6XIY--P|S5A#i`GN0=^dD zKzDIu#AKsr3PU=r;qBuqQYiY3ENzP_u`nYn#aNgzY9!JBwnRHlHIm}a@60es;&ETK zAOZr2BO^qVDn&a;HtKYFi^F|m2!zF@a9ga&xg@g}sc#o$@K#@43uaP5Tq+%LA@bac z-k36~kFRr=6^iKWYCd}_GqcKv34tH|lZ|(9VJG>q z@{6cbh?@zhO6Bi&;BQ>mzhJF9{1#(==!d7lkNF>=5i4LP%R{Zbi}U^z@6FTEg1b3Z z4{)2a7(tzO4lLU}dVUausk)+$H_57hhoBuyrxPuKT5%RVykUqOGXf50!F9}FhmP^= zRe=P*&B^oyC)?}YOuG6mi&vnyMotbgo!sWZIn7t7Pf=akv!5NxVT;4YAD*jq+Td>D z9YW1Dd8aTQx^2(UDfb1QYUS@MX)*b!94rri^BY57}X1Fy3ehP5E@Bo z**vgI$FGAKRfn@g^a+l12A4>DbhHLFdPLv$4Iat$7w9sNK-31xIzea92csE^r6W;L z(s`)0vufNKF7@iSm|Zi?&uU=1P2*fxbz^Oo#&wchY1R3X3P5vV=*<>!+B9yxx-A_@_M5oO+_y!89L*|mRl~zi!%kZVZywziX+Z@i6nCgwBRr}FPE%yo zD-vvl5`i7cM_wq%fa~%{0nxj>n`jsHSfh!MO;o5Ghy{I&4P1sI;z z8^4ckJY_-$zHvmoE+%+uB)k1X9Z zx{9wMV`&b5Byv74=J3gKHS$CS5MVw6N@DNnLGB&2usBa9S(Sy~ay=A+#yDXj`zdo$ zb|7T#rF9ct0De8dw%_8O7BmyXRhdUFNLnpkDOz-yht*SRJv-U1<^YMGo_9WR2qlEb zo;`Z>5&su42OkQjJxs-Cor;v z^kE{UtuR{Pb&>J0gNfAolJ7s|_ld~N^-zSq$L+D~@x2f@E#oqf&Y=+Df(dYc^#Tuh z!m3bhhD$QV1eVeb1}PkrU`=-EF&Gj@zhu_9xWH^$pkJ{s+qX9W)K4Tu;q^dQr1h0@=`!>S%|v+#IsPLtw<&Ic7L zILjF~kNBpS!Vq1x+ADai_lWP}PY*P4+9FKU;n(1E-CiekUKt_*fIN>nd7<(x?Vg_P;r)!~5g zE(-D4;bU*rd*l?S2K-!dX=c;2@8!PJ@ZNVMrTZqo@S_VlD zEtYs=H-Qu~eFV$`lt8SMch|hMfFOc-Vk1%BngMJ^co8x3PCP{P=2LkOYG*vSd3eJu9+uHBn@6X_vxa>)njf=~@~hs)dobVT$^2pVa5a37C1H*`>8Mgo~z} zXA_&TscIh4-e`d9ak$D2ceXt-Mi+Ci{^0Js!}iWO`zAIg6V=>W8Q&4>yo7TVqT}on z)Sg-=$a))S%u<6p^FY=S+-kvg;T&mKyjVL2RYHL9%A6qm?6=iDyTmmLh z@0M&*gM78<)i+5zx1%uCf!KbRUC!3tCW2aRTo8pl3;xbPkl3My0^!XGiWBRjr?6VT zCE%N_0l%P)*zz*Z5@9@q4E@b;iU5UxwidELMUbIB-zJy^=6u2B#0-jCaV0Ghck5np zdwb2Ta^!}0dVncQ8!hHqF?d|=wOZ=YAw;;JGFTRZdhpsR4S|vJ?AMTcK9S6`i8J>J ziJx^jAa@8!u82HFWMvIJ=CF-zhLf$ck-fKr^LIELP06>*E^mduIegaG8Yb}3EAFto zfU5~&=rVf7CrU#(Uss@|G@YW8un*uF0>6yk)0Kb#@HW&FK1PgyLHeAvehG6kMvv;e zgGI6fn>aS)-6&*}jn(3NSWgXqL$p2jHt!6F&~Nl zy;TUMua>{`>?7TT#cy4k#5JEGxU%fO7TUQME3-zRnQ|7@SV`(H>SnSTTZw#{nluG~ zWNt5_JXd867PX)tkw{j*ypoa)V9}rO3i2BJwi#sAaoc&XhkwQW_(T~04PVA1mm9+m zn^tf{5*=iJwLsJSh-;kZ%m-rFo+&cv$<#s$y7ej{BUGf`&=e>+|0o9+;F6G_`AE~z z_LF1u(&71Z;~#Mx#X=AKJpI-RgU>0(uQk^PUgPmVuK+}nPL`I>Lw`sfqbsq(y@Wb{dbIJ28>AJP)S)B)s0EC`NEK_7 zlq%{)a3Y(pgZxx(Y}A61^V7@0gf&3Rj+{b)ijYAlt9h8G1%)=hUm;SQjlQ%m)wc4% zz2WE~yCyK&MOIP^5UAZ%U8F7j*nRfO31k_DI))R}53_7bAS}x9 zVzHjK8o^R7%&-Qr@snH>tc23qikP*D+hz)L*#yN2RB0r#0^Wax8+VOD_A*g2k4;k) zYQnm$EeG+13lTp^xX~wvANl6`yv&_wgY=K3v=Ti5c?BM^eyw}K-8+hDg zN8tPkP}Tyj({eIT3Al-(1PF_k1ix!qWms0Ta4|~=y9z+J04DEkZ;bIau!eIzn_Afo z)bv`k+_#BjD@DX=CCo$U8EMw|`>y243JIQPm?z?a{m$>YZo6Q<93n92Mnso%=Ay%=;aO8;g z`rRbi82-&Q)nP&m+B7x4k^$a)thzxCA zEb1Y#gs5`yFfK7cifAgFH+J0fPnnGKTd9dA8ZnxbqbVMaey%3_EcQ-u;i!|zA|`V( zxRlqP$+HZToN@=#CQ6;i7WybZ^ocsE_))+iV8#Fo?9A2+-eqgK;zwz$M7^aV; zB+EQ!!e6DqsW6G=lEgz?U($s$&y!6V+dw6uZ$d%7w2JCaje~=l zG{xtup!@>`&hQG<+Zz_A+Qvl^_|QbpLdhXsE|}L#bjDlDycJXZu$b}Z_&qrpORVzr z-LQa)#;}_8&%hUGM{qwb27pd?e;*&K1=3(g#9FrVF&0>EN~YnWTg{&qtppSQQW;KJYh%auIKj_>3n2IHYA@^8he>$n2 zv0S5qdSr4hq|!mZ$L&Ta3DT{2*hVU(dM0AjBNxL}V;MF_#7^ooDfaN+rDMjA3fTLy znOYRrx&WMpZ=?#JEAGU;Hz+sqmihQMD5P*UubZ%d!r7emlb~CX1~nTI(ifI?r~jd? z)vKeVR|aNaRUgKpWojqYkK$5yvPM`oSR=}LU8tx@QRU+1?Y3QTOQ~JdzJ&XDjehi3Qz810|ifI`wm6()67hY!fL0^xRIvSkTykFsY+-Ivs9;`tF=F*wR=YsT7hF`_JV`GolHu%dyMpyVaA)yNA2<55EnYr-Q^;$8gUoLs ze_`7Y{Z}T25Tax2!Oi4>7jNn)z@em{gNCW|*8>-d2S5bymb^sq z1!T40!87WQIDw2^fLRjN(0LPW--#r0n!5r=SF@X3`uBK>e`^B-8C`obBh8EKDGJWa zA^pb>M#Fa~_wnWp?6jJIgyX#uhQgJ_o+v?3t&7snA4|X3L+=WF^;%5(_@H)N9~)&7 z$HbD&<3TOyRSz)-DAsh1pr1g5M2z?_axR&nG{fa|=CbPAS2TApOeU;^u&EFqd&S9f z8pfvu&2m1t(+Iwh!rdk%Y1|pgws;40x=;{)x-k4xmx4d|=>pWdFve+8x`PaWrE=lG zO)5W$2a-V~)z%Oc(s^fJg(45ol#BP5MN|3bEBY0-l>G5eR=^^xy!Fptk!y9DUMh$o zDqNs_6`HQqTd*fB`bQ!0s|9PKh!}iCI)p=YX@e9!hvBn@k3UPOJS``-&|dY{Ox_y zxo*FJ4>k|Pac*j80)|N}C^As;QQR&iqC% zNoMmX?nGy&$~3|He3HZK1q1G&9bmZ*<@))zokAK`O-M0^OK7;LlbT!e3^mp-HSU&r ziIbnjMv$)-p=YxFV!#KT^BG&w#PC+g*r{wqL~Ud%anid$nA>z1$F&1%?ehf%U^#LY z)dNuiG_D}(Q(dcbiOwYmXr!02h`^5Z$Mr#@-*(XCiM$q2;0?96y`XvaVf)cFr5ZjJ zQ>r}iP*)9M*;LgSDliD{<2wUFR~@hK=A|J@*GYUz6}Ty#asDwwl;B!qb3 zF2s0zsqz(=LOO3gYqc9LI?=&{C}3c2k&CT-NOmPGP9k#@53IyT?~JGhkKM5NJxN&E zx*u0k4`=g03E5&HzfD)XqVUCW3F7KBB`2COG$u~o*{pWV*pu8LVo(uQ4h>p7q9mUq`1Nk~Ib@EN6%&Na ztk(6J;@!n?hBt~oVFYr*rJyVxFOWilyH0W< zA&28hQUUtOqlX-Z^)Wuk5n2CTKYRS}IckC=zZUh*JMd%U3;TpWXhC3hw}V6_v$bdd zodJh`h ztzM+s*?Jsa+_iAG*qo!*sO~2nf=cL=iB~bNGh`Ql9Kn>SHGcjGRLpmd?Aj;j2r->G zib8m3dz0+21#{o-h2a);_{UwKoum=2MM*M#nO-3sbn3e!*&$Nu2ChxW%L+P|q1oURhvHskKUJKT<`Om5w;_Usox=qfPWVBs;GC0Z|n$*`VhGvv<>`4;G! zMePbo4rW{@Jm5?q4lf>yvA)#xuE=>yjNtBP&h2yxz($A~LGo)G6 z%Or4!$;cwGgkvUi-W>>CE)e^dN$;{#QFk67J^g_yFKaO`nFMp_6qUP|EWN%B5e{WJ`oKVv|9!$Hs`YmK{V8gy>7evvhr{TIFw1PO}onN-nLOt{=TndVNMd8hLIG8$b4D z{7P1u+_4D3mq9eN8=ECagSaLG6FInl0;dNUo%1FIVec@Uj!{fZ&PPc#9}QYWv)Z zh1E_Oy#~2eLeMV-y1t*o_3$I3Unsb$hSC@wDOg{y(Q%P(VXE{R+3#GWgV8@-3-wCx zLgETE770@ZIkl-tE5oP3oKTR1??wE5k`D z69SSd0qPVS*1JOk1KlA{fTW-eZg1(H>^Gt>ddS0VKIMMh5>2u`t+1(QydSql%JSLA z_MoE~%ckf>X>G+1_5Dm7yOggC2BwIpbXx)loX6RvR^kC_bNf+zNE`t@rjbuXvBV#! z4M=;xir!rgT!6q5`{Zc0&uS!YU03z|LsgPqFN=uG<%2i*sdU6ZeheOLwBiZlCrF=8 z&p~(E0aECxMh|py7sITTN@yp#_E2a8=RmxYUe@+nPI^iOU&c4tqc0!Tf*O@SEbqE~ zgBITmYoTjN9cbaT#bK3`pRy&S&Iv%v&zafaEG~aB5VAYVDgX%Qk}hw+cKN&knKl%` zDt#i@bFY0>6QuTX5wPSEc#O0G0P_M_xtHWhrN3MEpo9WtS@Ep`#PdhqL_4Rc4WKmr z5H)byc0xZfI@-COhtz-DnY z-?Z5w>?6X+P~ivfMJ|qYR zxeH(*Bp1NM$1$VLi2XVC|3GFkQV^>3wBiAwYu0{NSxGM|ySN$3R*&f@hUu-XowwUZ zM|%esyL+#<-yNJYH)RTpCbm;_*3{Q6fZrohh>_u1#3o43p;O{iv_)4sSYtBZT~Dm> zSf#R{dadvAwNiS_sn|JcR1KL59wkRfCGMOW;Btzz`NRjDo32t3@XWEb<)BA#m=ubR zYuJKif;KumIZ}Bvuw7yKSic762+LOFp4uJZWHK*+a4HR~s6e0)@}C-mo3S(@Z%Bz8 zVj^9@5q0~BS&U}ZwnwxOJ?*Z?x)-O7zo&u*+N?f)Y>4}!Khd~c*5mGk_?F#(AW$adkPO^ zX(Kq|qlQPR&d6hYDw<$HKNJu)vmuL#mslediyFbD&MwKUamh#UVV z8fq=Ut1_JIxguGfLo*xF(51{)TBx)U$S{}@Xv?6Z2r(5kGp;MxLGXPK+W9ga9fMuj z@QchIBR}&>+u)O$EQf?mKs!yc4d_fkx9QsN2f>Smh3#&w>;krx& zp8Q4+XK(O1LQ&9Jt2sNaZWq7Wm#0Pa3pF1~0Jj5*x>0w(&|NUECp?g0ipb2-;Lg3t4K59ILQRCD6o~e9LKrOrTaTUzjP! z5lV%SdflMN(fdl|~m6%|hSN5%1(lJmw zkdDLY zDiFw#F+j1GEi5fux574)a=Fk~a4uaPD+8M1wmklaQs(2YKe1BRYl%ur4Q zsV`iT?OiuqMfga#;&XC>M@3TsE4$a&d2aJb#kBsa@jJ?|(uka$9U4;J9t=<+YqE~2 zG9)8>lM+8An+jBrWrcbx9&Un{GBs1tM%=fkLUmh6P>O+3K`&_9Xokzjr?{7bx;tM9 z1&Krt92FB@#wj}^|rURh_s94%phMw(FEmMbh8YDg~+0y z!~-bye0^lY&q1u=FmcvY{Y7RefvL!DME85+OJsyjWQRm?qcEr~OBbQEl*9}%fvl>L zlxY2;YXXuujI=#hP+kNWiw07B1fis&D^JfcY0-sXf>QxiBmYj0PMI(YfMwJ@-41aq z)o@yiQVlwK7Zf9JXzrIgJ*dQ!`Ecg(!Zq1)MPSK2Q}W^j*ZohG_l9objC?smS1A|8 zytzvd4hBhOZY8WUUM*Ln;Br!k|2rNMAFNU~dygzZz2mkvk6^4RwMBX|p|Oq3k@Cpo z5(5iSCa*-%( z)4PUVYrU|zeYnCEC$wtuW}9NJD04-Oc&2zx=9=FFA}st&diK$Z$M_O}5IqAv+Se4(5@H$1d7I<|5UVq;WIqPy)$BA{S&*&2U>Xfk2_EdoJzP zO_$Pp96FkS#-#r`5m_WF>No|`sgLV0qT#uc)U^)&nbc}7modp93Y${#sFu6kGmztl ze5zG&uCI;{xF!RO&0h&RPW%nz?=&9RX4Gq2E$#}-z17NP&emwG-MYK%q3KnbC|MMA z$*fU}%R#>+@l5WcFz;dM0QG57x0HuG1iCDu5(f6s5e#i<)IsjoTw~3U2S`OkUKXKN zN#?Zl&WZxKm)NR~XM3%*xjos?FSa{bQ3fyJsCvOLs`IU zE%ZN~-1bI2xc2)QJJQMZt`iofo=1{chhgA@pcci#s4X=I5LEhB{(=t@$}0Z5@$DT~ zBzrrMao7LC4=}H`whp#`+B-emJAZq;d-3{U`}}9Hx=5`pNreerHYoFf9A}|@QEAcuV5MVR@@IwYi{_U_ zmJlx=wJyZ83Zk7DnH9#Ga4*UrYM(iWDyLh9gh+o$5DIh9x2E5iYL#rRcm&Dog-kZS zZ(l7qKpXDw!NnzS3d*fQzK40n?`1{Pw}AYU(jnyg8AB{VP3-Y+9I}?+3X*>!;VRi6 zeood}P1~{qCsj%q?#)+n^S~Ffsz#0XrKISoNr@Vi(^P_XRJ3>!?dE^HU&)xZqFeI% z-ia#$zp7R-J1!(`K{qUhAEQH+=tf$KmXeNHe)2$$t7Gnr{N@YrVA;f#<-aMYxaJiJ z(me>rB%iMkgfDSy3wWJ~_8S4$CSawKnMGoLye#Bn_qEZ2f)L(DP)f zM+iHbv$V@*{V`@qriW#K#bv#usl$>paLNKDS^-&*KY%@t!1G|g;z z3ZT=9|6~gpGf-&#J!AQvl*gTPoVujjLuBq(KCH1>ew^1g|we~*uQH*WU+XI zk(g#<(8PVOAKFrAwG7HR>~HwazFQr>4~eLH$aZZFC>}wkpqrO4yLjK6|7v$@Dx6Vq zj)?x%0pTp}puWPYj%oAoG9{#ajgk_zD3Dl$M8{^!ZjM{9up_|0(tZk7P9pAP?3`0c z8%Jq&Wi-2F1T3cLoitFcKp_@Y7&FMfAS_u~JsDzZ5H~;UBR*G8aD>+<2xkdpFAQ2y z>35bPMyM~b;wy%uQN%XvT|r8MY$P2eAg<=taO1EHIpo#Z~oiniw*ww-=3f>?3qT1CiW6;;Ht>e1*^;$kR*BT@e1q( zqtD-qSR6C=@)GwlKTmcMER9cNS0F9Xt35usL9t4;np70m&ReR{qLN7lxXwE1I+(3P zrRB4{q&d48<3b@JXM8ni^{$`H#aIB(6a{=$YB$#?JXed`Ce-WPc}w-qq!o&Ct-WLr zT5u;0vqyLBu6dH~8uyRpfhB03l}NeBkjRKd7b_$UNc*Q+8)sH6iiM{N8vEUEF<&6= z;Fk&Nz{`nGiCfg#m%KT#E43&CsbumL>3ul9LUy&bW1Qjbd!u*hRYF?s7>r&|-fWG0 zSa`hZBhL40+)%MDMciE z^C#I|AW#f6e8X*8JUxHoVX$f@MnS*<`mF)8)v_U)N8Hs@io+l}#snY&iVKq&9QgVT zd#B`uM0P%4i8}xV4@8mtSJ-b3h~((4eP7*~Kw>$XiZ@i&lCAOe>A)1PZhSBg%z3Bd zKG1G`YO2vsDr?)agklO*Rk|}4RVZ;`{13$@+31u3LY}s%dE)ShfD76%vy-e zUzeFvfhZ_)69kQD!hU1rd=MahErufoP|zK#nWW;f7!rxvrjgpxsxhHEq#OIcUjZz%(#fC4>J>WO}PH%ci* zjOVq@ZnvfLG66v9mMlMKW**tA|ExlPQaZJTp_jZ3Rfryg9wX#R5uWX*}IO65dNi09*sVN<&vCU)0LgQ$q_n3z~;CThdIDnnTT8hA@bZ z5ee9c4qqo~X?U6*Q11ydN8}68JIiMTY4)=hBwxDS+x4Ix7!;pzy1Tv`Qeap zcU(IGzfP@#57lr;m7ysZ{9cQRL|?;gV|eR_AVvHhwPrced*!yAcVCFM#PPczL+u1&lE|*hB z3QrxfTxsTjCm3tNXXX#a_M1D$2gj!~rwmWcA5aE6+dJ7l-9FzxKAJgf;o13vAD^7> zAMXF(0G}ChNIEK2GtCOeq}+T=?vFCP7FEhPQ^`_EzGSX>Eci|@Xr9S=#X!Sp(nst= zdoV&xtMwaL!ar*RiIJegOxITzhbWLHl|6XV>$pxK9A3t(SC(Ko?co?NXQtFJgO;vpp^5#@>NJgK# z8)>OsAKUTbWto)CAw@k^KS))+*3opNsk@t)(gQT^j@Z{j$J%twfWXoC?y{xVkW{VT zEXcG`k2iR=yYCUqL^sUQL)D$jo@EpaVq;7|pcuoLnALSE8BI3+Yui%i1jK&#{jP$c zB8xCK*0{pO7wl5!4d!WI%7$veRL6;+OdK@AM7eAd{l;=z7#PH2Kvgz|%wOuMvFLy& zjnZ9XUsWF~x{dz5#N#vS^*1^#T$qRQEfh~W!YiybdX;`!-T0>bI_J&CqnM5Q2IR#^ z#I)S=!n^2Zuq#Jzohn_dPZnF2wcnjx2p4OXdCQE@m@ek3*RRIG?Yn*lx2wqzMOw3h zIBOY`(n!9GjEzyCGJ|Z5GB6uYpoR=3ove~tv)%kpbTrczCLLDe=9084v7@{`3p|$y z_Pp0)H3g9(MSe`wh$0gjh&860zOLU$Q;Y&!RSwvTqGn8+yr{zzC#NRh&EtM+q!I2N zC`8Rl)K8%aC(np~BxDQP@NdLR%-3E;Q?)r)FukmnzX-9k+FO@&JcCRnjy=^DA4yyO z9LvUZyQ>cS#Pb+I+M!-_!86y(ACyxoarm^Ra@+=70LZfUes#)v+TgR<#_>MTiRz0w z3~kU#X9LaX@RdNglU!^NyKSRbEwt8YDAX!K2Vp))n;AD5m@H~^`nQdoRw8^NCq1vj z0`$-)=3y&aq+htKG45hY&v2W0;4k?|hA}{P zubu3SN7jVIz#R+UVlZ2c3T?CKQM=-V>^CC+z|Sjzc*yY;iiYtf|Pazv)0VOWhUhPD{klYBe1_&0ukrUdbcGSBc2_ zXr&4pl$TSKQkn^Fz3V3so2^1_60x6D@vzEtuzg24VUpgm?XIklFoGT-5Vk$K=LgpVazp2OBm!TrEhC4_o z_dHk-np+CLP$1t_E39NO{do+z3>5-52yRHMhRqRhsqug%UPv8e!!&4hS~e-P#OorN zbPvV48etAlUEBI7V>zt|jLbE( zJTK=dJJr>QUY5vpvLjCBbY8%!+R1_2j4jDic zmm*!{q6fhgIEOq>V*oPiDpY=)%z~8^c=MPS zCi1H3R;J0zC)+!FpTIhIRu%Bc3IW5o+ht&;?Goy>WN^Suv}8zGP`fIuija1_NrT+3 zhGc+c_CAEkTuX=}Z;e$;A-6Z#FR(Jc>)OGde9sOAs{#V@)G)o004IYC;_%CWB6spH z+v&mSqP)|C0_E2@``_eRH7tMlvnLd^SzZKRi)6-Ob#*qwD1So*`!p#-U7p2?m7%q$Ck#RopCYHjGZ*^Ms$}zNu~Ze^d9A+IW?F`N z$|`1RfoN8hP9lxeB3>12$_jSa#rC$>Tm~pPmMW&bE?T1E%p~tiIH-8M{~9OOk4cqI z4Q5I+pLx@mUvys2y@UHId+lZey&`lZQL>9rQJ=qEZmxuqJK!ZeSMoh>v2CPZgA2>j zk(VYt-^7k>f`?ObQ96XW2N1a;d^BTo75Tbs>eD$Ovs0+hkX7|>%bTUb`h zO?vEoKs`D8YV-G-&y_A0qe=c! z_s3n4>35Cc`%;dx(=d&I<>bCxJ)9!LUeN2bN`46L{PZ_~BTD3&7%Ty~ZSD}8bI9vP z0C8D3{?&!zkFYTO?Hsv+?5I<}BUEb0xC~13dIhKj44Jj)W0v0K9{Sl_jR%k}Bda6x z$o8}#9NI}3#0sKsb}E>di?Lb_644iDoyTMcSqJh((Z8UqXf&JhW>Hl5=xaj=H}IdQ zNmAU}SN=!>@l|-$u_BHP6~ia6HB^FED2QpxSoN!uU9Fu8AmpD)zrqwk{+;h&#UR3( ziXgHXE5WFw46+jKfE)$7MbN0s>7i=SVFI@+-E3YY9_U!6i$s&yP129lUq5AYQbXbF zcRd0WF0BenAmL72geAR?wHF$XYm!RolH5IlN6{Uytk_TSp}*S&&axXOz-1rVU$fc7 z8IMiyNeU`I-+8jVDCQ5>cUJ*Ex)$+oyJr)UH*OvuY$M-f-EpV$YZFa>*cvy>b#f;i zp%zEKd4w0E02v`iJ@R28>Txvd0?*JM8wEhV3j2|^9CG3Li#}#@U-E9-)cjV8%M*cB zg3-iX4LqhRt%SzV$H0z{#50@K=@*o|AH{)DF;SulcJTg&5D(d{M8Ci(N!!nS#TB~= z%-S3B;W{65umR~1k`@?1F0ubIXkU;8?% zZ80SW6Z;l%CFtv`%y!m=5S}r+kpR)1pRJAAW;J|!t!Hcf&84({+XFt|ogP%h7~dNY zI@1v*YPE%FWJd-=z9_wP^8&4eRNvxBtgIqa7iAhH%~E}`{rzGjEs@z_PT|BbqrlW& z%kMV$K0vMeK7ohJDjiQwv<)j2DY7QXD`tDx?XKCPu4*i=*O#L@P_L?xa>ZdB`?d3w&+5`%0=UHy9YIFugi_5gkw552AsP>hh=*kSr3Jhj1%eylOuefV@ zzSgc!xymKjE0rvRRtLo^XflhiMOAd$yL@$G--%W+ZMtfEKh=fqVzMQ+9*-dQw4|f# z@eoPScRgHdJ!ZGv>M+n@A^;Mf2<@_PES<7v3nL?xF?9Pe0^zHWCmC))xA&1=-7(q5 z90z*g81mN(o1o!+hv3KM1G4_-3++<_1r98(qc%590vG$dYghAc;;8ps$;*FR!0HBS z!t;QeuLIN|jcc9K(4HH(v1lyA)0wycI+}hm8c8gBH1Z!C6J{ z74Lfzcxk77bD!B&W%P#4x^d%-Tdl8arP7%W2lH}PB`JGt25_cKl%4`Yj#UuR@?uXC#WeEKzhO%*cf*Z+Kql_i7r`JmBg7=-PedEChr#^!ZQtd-NAFX0)Xtq(IjCwj6D+?Q+l*7 z1{A1(m7SD%xY!7#;K_}?6s;tn`Lnw!*KGKi&?)xO4q$PQnI}U$^u|zX8n~bmQIr9D zN>eb3;IGO{K6DW#Zu9%^DHMZVRJ&J$nfiZ12BRg_$+vt<=cj)P1U zyGKiO)2c!@i*nXTRX+1UKD}*~Fs^RMt?L7QL9@#8Wef4-x|oOd&JYV+xgz+(BndKXx6o>6=A9@Eq-nICyY5 z5YmaA7N1ZTWAuhAu574>X+s6`bNWC_X(y)vJkZ7tfFft$W&Iakb0hTUK$ z>V)a6AXGo|n*FL+UJ51?CUJg-dY}+HbtRHHZxAOeZ#L|N5T-S|3b2UL%Yx7(y`mm4 zlr=@r;D%2m0gNkpLLo5tc9AjVgpt87`11-jeNJ~GDv9Yukuhz<{qbc7_riw=6oX-I z5Ep;zA{l+^j|1d~A=KsXKKt@ZS@rBh$DP|2uENUNS`-{|D@Uz6W>iCwXj_v0f(efD zMg(Sk?va5iZss(ksKy4b=Cbvj?OOo3h6l-pnAn^TIc#;V7q|_`S5m|i%k>c$puu%1 zIV0$E!d&R)GZ?jt;Y-anC$7;!DEW+8YjZ-OGj@v{V*%4L-KuM(k?SeZC(ZB*gnv1i6VAA5R65 z|LQ}ezX{jwyxl%J+B-?JgwGNs%D; z#%2hB^wF}WcjGN#s-Y#m9%(x{4C2p+dTAAkzR-_6ejWPI^bmzXmQidn@E7Bat*yi3 z)04NjsO`;97hjSv(@@EG$zo7H9A=r4bqj_u6tu#g_6BRWr#G*g~+oqlooK>B5Z8n)oYXG76KJ>{X zQqjVURx*zmUtFW9ole|qbQX$0^v3lMjR7jwKqENW2U+X-8bx-1^>znk#N(S=$O|-Z#YGMq)W(sigv^3rTo>}+ z2T0u<;%x51OG^RUL@iv9J489Yqu}}a{%c4rJbtgSF{D;V$)%|baHkCJnPN2u#Qft z4{;$czyA7(iqQoXRiOgip-fv8BT>x&wOr_fwe<*@>`-t+@k9kezOr%4YImn-3%f|9 zkY<2JtZZ2e8XY}U6P-;NMm8P>n4*PAGM=2pObau+(_bRr=vX$tDg0IVUEdeDKrqT? z03S|URF(D-H*ejEYz8gi8Vsa;0~*8URbzgFuX4Zl>tOtd!TJCCq zL_BqJv0ReM6OrKT#XE25HSl8FFyNj$Y!xcdC49|AEQS0Bw{+wUglUrig9IY0K^3Vb zGEg!~1g32d`v0P;J%-ySEAGUohgh3A-5gsHgX~OdQ+OvH#KJ=c3dDZ_ANi4#+Qj+) zKq8W|SDMpExrcUOHvuhbAYoCw1d)@(z2%J}%##yCDyRNS=G7l0M{$_N)WkC>>9rVt z_U$(;asG;@oRsQ79INE!F=&1OZl>A8slr{f?y;b!Ir$B>i-(=u*h5Z)IKZ76cZSfZ zc2&_?i|q!Odb({6{-;S&h+ykbQ|J-&lsre!B!nq*4ye~jF-T>ivauq(7pA3>?I12I z3!`yg*ol-aa;2ajT=gXNX?o5J7@<|jHJE4u9MWB2i-i8}Li<75%MqyyRnuP#d1$V@ zN0SBro6>~+b~Ne_x1K%w`0?YW3;>FUzPs5Q+&p8+On>wYr85n6e+fbB$54Xd`s{*- zDwJASSl17_uL#m18p2mvi&Ao)@&#(=^nh*qe^F`T8-MNL*s$0lAr#KAc9(ql`JQFAzJ<;* zawzk0q1*UDE&U>fE#L{om=w2E81S=LCPwGbFR8`i2jbArX^IuRQ0JIdvYC3a`t*Op zqt&2VJX#4r)eRkfFmnPBij;J~EL1oj>gJ%xq2`mg3o{)_ic7QtMk3+yeQ%41L ziBRq9qbS)g$n>-T{l&=gCPj7TZC^sdutacJ1{!$`;2z+2VW>I0SCqb7#;Kpslk(T> zH0Via@QWSu#2~nRREvxWmvBzNMne) z2i`$*qeomAwQ-62H#iNnWr%aU1{Vx_a92YP9Pql4sko`z1SBj-k*4^}Ih$d*{N~b` z>PHWlNhx-sgGqpLO)^HGAG>W2N?02XgN8V|Vv8XsF8s2MDSczU^&ffH9DGA`j|1vWNK5d&84GqPksIiohKhr1t18cr#P~q0 z?5+o8p*P_V<^trR)HVJk3p{s|g%LIn8;E9tCq%Lt&6sqiMNZR5)<+%O*KdzekhQyP zQk7bO$cKrf2lw4oi;&RmaRuhQ5{xl82MeZ&XoBBZ>Dv-jpKwDTJK#64UF=pb3oye-xBH4qQ~s(qGO zpRk+-F9|In$9bnAE_~hyD_?OtqD~C4z#+K|b8^jL`~YRT1!+|RX4ahx0GEAv|Mil+ z()kG^7H$rz%1TN_WNc=yT2~DTKrxt&vk8;4qkFVc8R~?=03Ay;RJe|)6PYGpo^UaP z)$)ba{{eEuD6+;;4M^f(KwIJA@KC9fo2x;nCXY!w35aQj+mIIepnR213*Np!uW(w2+~{ zsFZK^6kbO#B;kUS-PaZEL@doW7B$Aa=n8(0{MWMQsv@nZDq{MmDYDEL2aXI}M9HZ& z8%o;YiP0i`=7xP(H56(x{1D_DmDu!NT$ggOz)BJyg|9W)v7*Rh#DUYPxGbojqLsvy z6@{LBSt;Gp!#Oc(RTb!g;{$kvuE79Y9Uw02!M_Rv{NZy>kDX^l1f8`SgR5IOs$e?e z2pWzrRV;`S2{zC53S(G7nV3Fci)o-ciOKb$+_FuL6%wI!k18f8u_JIwrw6I5VnKl5 z!UOs;cmYC$1B=TKW~@8N+xIQ-mJEP)glJjy9;X9D+dy2lLpDs1i-Psmaa`$#cAg(w zEo*1<6B6+$^w31FCnA-h6beR7Glr-S2f+}+eKnif#Zj7#EOP= zxP2bgvN48()E%J0 zL8f=Jb@gq3`ACmGw3UM?E1gT|&AaL_xOudFxc4;sVej;8|M=)>cCi2IB78tyUtX`( zK$7BTKJXB_+3`jDv=dG@gwI|>lf=G;_|1=A9un#9uk8`tGaCG|&o4YkLHvM{)S4JD ze+!LJazs>l-M*yBaNl=Emzb~u9NzAp?(cPJVruej(KNOI4aKKt=K!qwh@YVv%qv7WY=32^{5B>V75mHWvK@U5b|`R&6xqAckJfy42K0g$?$hAYOi3woa2M5!jDgkDOm0$3Q5?Kp>LGKNhB@l_^RhIdJ zd5X~SdjcT!b=%O2MM84B=(0eo-ZXTa2JMmhdqgtIMb^+p*V~)On?sr2MyGWR7fF1{ zGM=3I6Jl9tTgNieq%hfm_9V^pCAy`{hJwpHGff54G(7TtlKg zbp>I7o#Vrk)k;)mKc6EWd*=RXR09A`|u&%VsQvm8%@ zBv+PQbpT@QdTQ0oAtbG+pXwoCb56%dghD!^Rhn?VIacQt(kO?LrvbU!#A?LiB%XexE`w zm@YSnKW>9fnRA~-CqJT);fy3OV{+ach~H;VJ~`T&y|=(B4v-e*xE3CrHJ*E~eU{vV4?zkvn_=}71)C394Ug?<&0;Fprj-WZ! z5@-lfHj*&W%O|M$UH&IipDXVJM8*+h3g1d*^l6NCLT?+|Y~!(uzWnXw%DD$1tr#D` zKNwS_tqdwFisiJ4w8@Ul%TE8ges2++5?Er)*I2-g_HoHgoUE+CXA1(^F4*AGxdXWD zyP1PG>Ji+(p@M-Zeqt^d?60~&7r9vkx}BrGCI_|57p3;f04gFJDx=L;0H6!1wBlHI zYZ5H2J?0PPm^=NX)yv8rfib|Az4zn{Wr?ge9)Yi0wOB*OLV^{t)Qfn^lb}9WU=Ptg zxf+JVFvRLu;Y>y?WrlPm1#He?hkom-eeIf((;q!RGMS5*6~MC!-P<}=4Z7K6KL=1Q zoHf$q_PHWj$Pj{r@?&)rC^Ho)(EZyo@r5qN#f9QbefX<}-H+`iZl79TGfI<*D^c1G z`f4IcjO<}t#N$|&IZumgr$;b{i9ktD7MQZh$c6{8`$`1V700P~Ky$&2b6vFuc)j}4 z<+ZqWm8LHG??aag7}7V0+1x{ZNNFnEGzDzt-;AA}?M)VBE%IhR&WRckxB(g3T69_{ z=}vd?<@zxvfWNh|Jnc6;$Dsj4~>8(sJs#4|DlkrAfU zJX2^|T7awp$`6G_cNStJfH_hM+J#2~xAIV2lQ|t-98JCm5=*0r5g^Me8WBvu9MMI* zanfosgNDB)R6uZ`IE46m{>>QIZ zTTNqGnyn@yR|3UZIH=twR#_?#xk3di74XU;$zajKHGj;zD1ySt$A1qT4`d*HMqi3e z*q0|81J|Apy}stNR0EbD)=1pxJZw0`n5oE?!HLH2bP6U>$2yQz2Z|hc8ua+v1=EZs zNvU#k%h%k%I$G1&kTt==QLY=PK$YGT!Twn#G<5ixFtHW5Tq03%W41DZRyj%40^4id zuK`czUIKh_L9jFq`c(8()=S8=g*bT%Joy&cD!&x8xdZ3O~MAST=RD}(+3G8f|nSi;7&x(dZaf_)$t77cfPK%3Mn(@G(xD)Y1}w zegXgjOdp;P1(%>pp&LnT;K(4PYJejz7Y!IH7y}geOh|e2d@KIy`HPENibet|1ee>o zh=aQHE-z0IJ*8XRwTK-TY1z8SxeIiEDBKIi7bXE93xk*Qxn^F1fhemN;*T?xcgsO1 z6-O1E^2Q|kb}4)q;|7=tlEAmAFD|yvA5HjG+UV;+i}5YEjuSi}uq4-QRQFIK9}`AV zQq680Aa+ZYv&sglDBIi#GC<@ZDafmUu<&L?R?eYu|038KIrG_kZb&#lG!zL3$ffPJ zivHEyNDpzOocUaRr2CgM*L2w%u@{qGOt`?h;%H^-nm<}yln2n$Dt|$4ll0)I3 z?8!mdlc?Mnn8uqM0X?3Taq2?c;gR}D4Zwi1OpAXpO(k%jy>G$eo$5`|vz!edhSJnj zy@yF(oi23fPprhGB)fWy@H{$#=j7h#$AoaR%hbbJj%`AqG4RiKrnX9xeV=@y^q5#GwwaGS2YMe3YH> z5K`cIn2-r~m!>onbh#2LuOKL9Ksef ze}KAV2qGw>LJ}o9U9PpN=>R7vAY@K>5+p?DIZqYIRYp`e=~0N2-jbP<5Ru7Knc_L2 z^5!g1N7Sb*KL2(42-eWNr#m{-uFQUVo^0Auu;ysd~okA;t>@*1g zNcg&mWIOEyTp56H{&9#nLIkF5j9i`M`0wuR9G`BVqk1ngwEEy!4CFq+INp4}AmjVH zVFwkxX(=o`im%neEWa1%cu*FBs=DCuAo>JwEJhN7B^oJzpl%>~c$!zh{8tpuOWPJ% zn2$;j%?}_DOfjx+1XGgE&Tz{a3Ol6CxDs8Rg{VJ+8`zqR@#$iXGJXW9vY;FyjIQ_| z{17=iKixauc^j#2MSN&sIiF6$+xDpv_;#@9T(S)yh%8p5fLbms@-EMz!i9@)$;M^L_t216n($64 zd&h;9=Da6MsRmC!CeR^qz^EL$!hAs6gIXbJFeb}k(F(Ve=#o&DgskRjaKgw**h=1- zp}i%CP7H&kW_9ju5=vl473r~GZ5SZ7N52dzkm*lcd1=*LR5?*6~a)-UYlkK~6B z)%}3_@)U@anSh6EW>Cch1VxyY_Yx+cK+jCYG8-||ek9Q^RhKLcDh}UdE0us8%F>x( zWHrXnrSh)qm|R^Y<0aIE7ojh5LVs-qLF`Y{lOCHw9BYAdtQ-%H47DdB9CJqGY$r^W zAbeO~Dp}keQ(>Tdv5S7PNPfEW2t{SeV-D zc+?-Oh2EG&^HtnYJ}0jMk`+~g(eWkQ_NHFMgk8JUo?e7YCRUv2irmi>!UXRc- zYEaM=b5)VK=a(;teuKAt_FNy_E;{~)-{dk8ZOu`VwTngU;L#KAq1cgNcB;i`;->Sg zN%xvcVe(*HqX^D`!gnWtLS{?&>h=D?!Rfn$z34KTx64zEy2LIqe`~-SKU9Ili4dX8 z%eZU#-#CQ4T)N$f)Wm82YQy6@E@O!;#(MTT(Pf?AUSH4P*t4Rmv^L+W znj>7xkcVuD3tP640|cf5r?$XiD`NCI_5Qb}9Y|Y<={%x<*%1d>z4I2*Q@su0-c*8v z`hYj8#KF|W^^npusfpfn{h@}8plIoqMQNyYTIu^7UDhx`Pr9X%h-dhUb;8W zt13}w?P9uZi4xa?7-3_r|H1ugcXJB?U;-HAya*KeOC5m|L8Eg`z(x;-MyCHxV9!<< z!i?<^Lb~(gW)VckdXGST7y+rcq#VFNS88E6G(;urkdQ({3N8c6$V)1$(!*XdK8Q~g z7i%o2KHQiZg=^6!fL74?4)%}scD7Fvm5++A2y0zJW&=?~EegB?%)Qg-FCn_8K~7Ws zDJ+%cw2cs8x`-C4l0}D(J>IYjx+HYo$fS z$i-8$H%4P!Kh_*d{?@#cZFy}r=eRSb7HI^*)I@`Z)j>jLnxK@~aIgjGtMh>Iqc+8< zt^0^J9Ac++geyk~159kSAY2RKV7jYg%8QILp9vU~+m4an+FN&JSV0g%?hJH;Bx{4h z2busynIbH6gYAPtjAVzLCX54ShCC2Z_=GiuLCCyGTtDU|gJmN9ChNdLhwu?5fB_;W z-&%#1?}CbA5V@i)#4%)u`Wk=X=+J?tO94_q8lbMk z4d$1nwuNdYxrL)x|G?iWqn|IK=jw3Mzg9VJ%b|8SR7L9cu;UdjkGaAnQcDCMWj734 zj(UyDVXrfuo;4hcJ{qe4;Jhzeo5YN1BFuzV7@}-F(}pmQO+B(CO`P|(jV8+S3OwRfi7P)1=?+>f zaQcw2WG*_Dq=^(!5b6yUCyvMmMPyVTYzE<48N=f1nohJ;hl;UjdozXFVsvURrVuK; zxB}`tHMFmsI&n!QRAt_ewkqKoM%1K;Xhr#yCI!hIK<#;&N-TI@zZFw$HiR3oC<_X%se3#4Swc6et*%pZx1iL zm_59EpYi+IMebt4ugL{c7ud(eb*FI?29U22MZ{&!__|c#)AxtCt+$_lSH7D5p8E3F z%B5K8O!h_!nwa-pcw-sqw8#EL!0PtkD$yWfN1g(-A+7Sz!xs@8%gC}-)94&A_8W~( zaVUP?G@8i8Uz0}9TZ6lH7Z)7lQ*S92g%_(t0QeH>fZD^!Y};BM#@8}dP0u&86eJ~} z);9R|e1CTku)#P^b-02o%bg5S`pq}UmJxzXyvX}#A<63bF;)T4Iif3a=n?=8ug-8( zEDzFzUF$2kNyn>IKsOFIM~#VaoZ$=g zhYq8}2W*keSEG}Wy_f>Jpy4bJ(u96%oT@EcDT}V&5^)kOfP~NxP7fDLcG|=0>5pUv z8E_(xrPv+|nfTVk@!V zhdOd}3oEt~``7T}i|6bmHiLZ9f{B>oJ}nQ*fwFWjvBVley=ExzYqn_C)as|(@AWwj zDJVj|Hly_VI~eQ)gHIhh85;3|F$BT@19$UI18R1LNY@rBGy}l<%mV z7HhN=1T6q{vfOIf+~KfT4M~oNNKY%$q)G$JOI+jc7k7=}`-^rgsweGb{4(1w<|5Um zXsm_9DoN+2t)v3)!*hLQUJTS!T=zPip4`*ST4V^XVRkiW;di+zt?Ai*Lp(Uha1A9c zY3UDoyrQN~>T4gHSP?^Dq#7Ji*gf>OVe7AB7KMlHkNZq*YHCDuKK2dssAY1s%0rQcUA=_-wcoIL-AelGPoTMT5DPb}bdl8VQf_hBcU$9ob( z5C~k$Up!ks>S=hmaaG;Smw~6HL3&4Ir&#}tMd*7oRJJO;B6Kh$<=F(42qtYnHM~OA z1VY=_4feIDERp#7G+0Dw5?w~=JX4r9TKw)JD1RyC)GDBpB{Q9|vLkof@1PPpUnIGx z0g@U(l~V8D1hLg)F;tGocsW%!FW&jPs1-rL3T@-t*ykhM(-{F=8&+xSji_8yqP8;_ z%W?#1|K^O<{29yn(=yIW+~P?lO*c}V7!`i`Rsjk>mJzLS<_nqG*|WTLK(;c#X{&)a zaaF*nDUQXjxT%LxTA`^&0xF?1`8h{u-SOQeY9Mg}^8vI>^o}AcgP3&(QCgGn>%q*+ z6Crp}nWsgqek6{mqzb(WElP=uG^ZhDN(s)O`mq3zax^bO45f=X1&dF3`JvMw>0Z`h zude8Xz_2PX4q3K8CK__Y( zc`3+=F7SJx&17jw#QA?6OknxXr>>)9tL6 zQEfbARK5_uf zxBDnSRQh)~p%SF|rXQaIrrQ2PfXdmIfNIigLl#;kxhsH31}U@vNq`i84wOfMQ=EDw z8n;Tv!=xX`TAY3fIJx!>_El*MPQLt4RN9A|80v#>wuWuO-5215reBA4ciD?gG~|Kz zdfb8M8V|$SyK2fi_NIA$1%s`r8d$y4d!eC09q>)-sGzh52vK)myT6NSHUDM-BN~gk z#ZZ|t%yW;3k6$5Xm{}7(l z5AEJ~$Vdm=x$xpAuUAF~B3V(jOuaKxpcZ?2AecMn;w_9_(SwQx3Ee{eYO*xzpFo})(hgEcA$Ju{>@x?!RFPPJ$ov`m$+CJrW8=S!PHj75A%2l=# z*{6P!?qh1dR^LQ%@c~mbqu_CZSciy{b|h%FFNC49(r*(xh2~9Cf%JYkj*QZc89Z0$4hQ)5Qt7J zb61#|Y)co%{`7t&Q5|vueA7jj3|$0s+DSfy;HZEkVZ2hwVc1tq^1r$ek~3;{LwpK>lmfyK(DDJGan%@b ze)(aLqCR6&BFh0}M2MH1zZbZY%hr&s=UxDS(^Gi%4qZlQBDSm#N~^+GaSh+f`|Nf! z>JPV`Jwupg6NO68km59Mbe^@k&)RAfp@J?>M6EsE*_Wbl+xH#9mmYa~t z15L8B_fJR-j+4Fnt5%e}*>@v846N(=${(EqTP#2K{O1ecLF)!*jU#L>9XYehS(MXN zxJwZE(HzlGnh$p?+|H!}1Bzp=KVKFSN1fQn@Ehm@)R+Ho+ z+cm!7;%e~|4I@vX5mpFXg~XPR^*IaLj$<3+M1HNC#5|O~oaHd%!X8vZahvYft*ZK*3CU^W&&OATv@r`wz8v5N<~goH zC6exjtVTVXsv8437(*t=?@;H0TOwMKT58b|dJi~iU+36sPgI~-~#0yb1d zWbSlOFC)IpPrTDBPP7W-%0Lsl%=@acH9H}QnJ8otC1Q)$>v8u=oQ;sRqS!d?B{qw_ zU(h6H%;Lu1TF&rW%Nc!io)rx~F@hFbX5Ji~TtB-ps((S*;tt#|z(VtQLO(gcT z9|tWIb2O*E>xcEU*FPZ1KfIl|s_t5&+g=mNyomp;KluUyo$B5zp|EnVRhBL8no708 zE^ol@w0{BfzdbuJC$F8RC5lL8VXz4@yd5U#r4tGwrv=c)v^?Ya8A3b2<1l-4J8nJF ztDYYX8@N_n{OON0di)4v*Y5Hr+J{Hx=*jzTawlpU(Jl21ls%m%;grR=dM5=BUd?u! z1(U1{^wr^uvoinW4JasLywqF-8rp5s;hJp(AT+rqXkClYfB=p2O%aUL&lv*wf&7SO z!`;#NZi2k+oX}v&h0xIy{=iyFhD%?Zz7Euhw(h6S4GG5TfK&Ff#{C+d|H#pze``|N-m$Ph$enB^wf^8z zWoHrGh~=vtohPaiNaX?nik9q~jM1b@FgtUL02)9YC;?&e=4>E&Vg@lJkEa#C1{9ni z8mz=;gN&62iwMghwhTsD8urV@5^zBw!5xbpbqODV1}y(+A#(yK34B2IY#@syv|@468eV}8D_1` zo6YPmhJdZDo#TV!(~CE!dwWML2P*!seQ@%2J5Ro@f?6_)(z`E!G@;)B@mM`@1uifE zKqfy$N7L>NJ=fQR-W^UbJochE{!%hm(D{R?F@{sfTUk;i+`e&ED#I-a5T*Yg+D#nO zN`JP+>S_Zdy^J7BTmZ#{uucik;bq|l1$poKX~Gv^h=c|W;rgnqGLQsSH6jTv6L^l2 zcTV5D(&vXyvz^1Az7HQ7o&Ifu%7+Z(X+fZ@U@bUdy*hZe_tfRMe|fn5X7A{H`^gl% zD`7=SGJ-Y;L)B#7MuHZ39wfCPou42zS+6(4zmwA|=fp=QpXHWIBzW$?t|d*xMn=Ql zsqO$_B^8#{$?Ovw#|p|s|=K5h6;NF_tW86 zs*b}pI*r`5(XOf}CUVEAsSl|{&i$?wM8V6h9lRwr0esfDLE`h!Qn{vR?APO8ehEho z`ScF0rthGjhMiN}h6s1VFvB3t-*LN=#K!mjXHbvffI zNm0xQ>#QXwZ;82dr@*<`@JLBNTnV&538)V0HhOMGdC}0km-m@^LnvPnV z^|6Skf|R*LY#PnF84Fpec*a49nYu{}J~vYKk%xCy$&qQ=OCDF#L2 zVOk#~GV%mGJnu$<;j_~d8ZvQs(fSoTewliyL_L+rYPmRtC}+TTN5E19Zq64Zk4!<6 zTf8=mY76o~iM1s4e?XV8n%&`q54z1q>JhM@Q71FZIsgqAA0U$x+Ny_}K`|h2!d*xG zLCrjf?Gx}<%d!ns_c)8#1p6(Ml>{()k24d5J z%S2PA1BbsqgrAKeHOGB!{HC3xw=xVOG%x{q1LPe-u1z6Rdm{DdxumpA{5z z=AaBH-Jdv~xx;ibDpTzEnU63xE*(|i)Esus+*y$qUHNEo6rAdNF*C%C^ApL~NPKZA z*`*Q=H=GQvEvuD{J3@4DBp)&ih`PC*g zpVOTe$U%RWow4~df47BZAHKo^_A@KDDhB!9qdRCzV`URjzVGEXMEOFE)b_uK(6-uWHtnx+E8u(G^_n3-KjsKP%FlrB?7R5{joEYr zM||n-U` zZMoPxyHP#Z$3Pe+DJvpeF!a3ug33!yfbD3X)rRwq9LkOCa@-~?$r`o>6koPNA;ZUy zAEllw=qc3QK~62~M~__6CZNv*E+tWv>Gt z1zZg9*Ff*<_j?1R=4@trI?7gtsx1&j*GL%w80Nd`a z+hVv$cw*9({YGS;h{%RDc`zj<)fLy^6&tkgvu$Yg^2d666N>puNN3i7OJ;-m0i3$f zQ(e;<6w}~F9=)cIWzn2y!2^ji6CK+`Lz6+EfekV#t5wemeNY=&S=w= zEL~54G-UkaZ97?uolH7FvN9PR8ZZTpjnSv>W%kHxtg(@Ob^n!vL?fLK%3?s8khlYAFLWB*+6r7CtZE}wjv*&m+C&=`dsfT(Qa~=vd*A2bkOWkOZ zBi~r~3ivks189bC0TTp&qC=_mXnRr7Y-m;_(@z|J6=_82Ed$|~$KsKB?3U~#NQUpx zQPfjo=H-N$9%SSJ1zk4~C9xfn=HK%Dt>;LaNJz;$7_)+&9O+F3f5^7L8Vu}3FrP6= z=6gAL_u-1h=_@LblAvl+My2fRpBd$+YL?~C0E#qcdgD=W$f;M`XnlwnK%VSvck3Y6 zKG;#mouNG`%+!!@phzXFD(kQ-%DX84Vzs>7_-*ZB%mcl!I!A0?{=znKvQ}DM1qTsE zV^d^_*x+aKn0z+=7Lh;Kd)kg@kfl>3-gBFIr*jA1HP~Sk`sa6DK3`-Nlh#4Dh#0`%i5jT(t#6i z4rfP?Ab$#X2ch8_4R(VAEOhLc!yA^lsApd|9&HcWH&t+k^O9f%{lv88S1>klGw`r+ z%}tYZ1cL-2=bv|6`D7p(zEU6>2S~PdsexULNP>|mY&Y=Yjk3Ej&j&fQkXuc($v2vK zf$d6zT%ls~lY6r<**gxF9ANXvQTheskRI9U-oQCh2rpq#K$VC-cPtyGxFx}qxDWX$ zd-43`?+KW7Wa0C23gNLQINLFQxC;EAE(-!J#&95O)9$P=LkR^;Ij>ML-uY*V0|V_S5e!|CN(K#ijxi8vZOXwjG)kZe+t89MS06A|)s8J6%8&#$~>HEj>V zHJ|~Sso@Ly7-J|r?kb|hwa5a|+Z=0J!<*_Q_6z0?uX4(uEhhTzC2E1+4^jJ9qVneZ zbjBye&(R!<=iMh@)Qd`abWI>pTGF98vjkOM&?@;iapT}0_+#9!2$#Lw{3fb026~Fq zePnGc5l#{0`S~mXt0ofsdwCrt+0w_};Jx0jRI(>T=}?c1=*q3eLj#1k0i>4Gu%jmk znvgUbv=k2@PNL};8y8SwM^||AX?6=2Ck!k&&se<SOVu5sD!rZYa-i_tX_B zpW`quzkaR*KgYC$2S|q&2BLeMA-6}S)#4R&AwthUNp~@W8aiU!GZj3h2qEkU%ZJ_o zvC`l;iHb6Y8lsf8Q$l#KAECH; zUor|H=&{i7yKo~yg2j=AlR7tWTaRw<)E@A_favO+7#wIBPj@YF2&$ZkRW~Q?y8-T0 zL|4l@-mBOg^!ma&jR9iU&Ftk@&!2xU4iK^$fe*(J+h~l1pl=(UQ0qjubh1~YLIy)Q zr{bg8yF!OcoO2TWrZe36HkW{WN%yUI)vs~6<#;fU1|v{bK!tIzlnxbLPIB%qOVT=8 zU1o)jkoNHc|NnV#rmdg6J;}b#{`qF~$8WN)ney>8lN?KbL4SG9moiJW1Q_jFPi=K} zIq1Q&Xq9?k_&&3<>2DOLREH?Fqj=RC?w?O1(TeuuG2NbkeU4ws5r+_(7 zind09uWhmm9pHkKd8wuuZZ$#l8rk$pTZN_Ze8CM^Na>ThWO$|8t>H2Ny2eZaKofSL z&TjPnD!-PLBV2Z_#B3`-l`Ev8A+zVCVol(>`9j{6##buN?Ih88mH{b3K^rn;J-FsX zjRV%y8C|+i#@!G>5LK_!6NuS;*CO8vW-@k^cs&a+#*!}-3Z;Pd^wtD6N-Aq|^B?)s zKFd)*b1H-rE=au>XnKyW>4sMve;f+`$Ot(!``A-wpS`cCljSB^ke1jT{6!RHPD%`x zK!KxU#w$#mMVIDKj=aH5=UG z3fVPxT$tRWGhTbV!xP+C>V&X!Mj%{|VRM2|`M?-+4Qq3(Y;&RBU&7UXb|GRhlElt6 zu?hCp#k(_hqPW=I%MCs4_)1_BNMiaCwlF#kFoMy5P%tRAQHOKNwE)KAlJz@IPkub8 z9+5M0^rPPq+yB`4G{~jjFb(qI%CB3GI{5}lg}GxXC?E+0{I^vwq+<{en82bheif(` zZ6$|C-v#NnuIk2fe>UO>HfOJ0Rfs4UeDYG*e<}^d0n9b60;WISqM;2G;~ZEeL@arx zh{J7W@0hQQkX(18b=MyuiE=qf$fa-S6rWNM=GJTOrtIK&XZv7}auAt3s5-mff_xV_ zcy$Xoh;K$$i{VpT7F6vhZe=$`C0@N6gy2j?h2Xd_i2HfAI`OyLLd$hfDi93+3gbAe zS%w0^X<`40+CXW-I6IFA)mFPVWB5#$VJqlg8`2yEwDT#^e1O^^u9bMu)G_z!Jo@sH zAjeuBh${_RD|D#j6>br`hs8=Tkquhc4diwMnW$tY-4iH{?nCkxn{hUKfGKdx_gnXf zETZWk+*4s3>x{z9^O1u4!q4q6iJ3k-y}LUuLGDn4A@16qwV^;t5R_N3!@_`eT7L?8 zLlru#Fi)BwQ2(X26pHHY9$Z}FKU0_4p7{ZM*Gn0mo~pb88Z=OgTU^gnpmw@Z;4=rM zrZ%J!r-s&xL-?4~hCd0GIxDRP15`4A1VR2CmRx~sjXo=%j3S{Cs>ao%(_)W&WX72| zgXU$$M(^j4pYoahbIzB0ZyIUC4yBaxt^0-p2ny|i@c48gEYeq|2AcQ*l+A%xfvX=` z=H^5bc-fLA#h6CI5ck3;F{JYb;#W=hwsBj8Bu8P@2$zV6sfWVh_=a_opBRZhk^~DU zh|SEc*3w zbEEyfNx+_>i9%cPRs6<}&uv3&+ajoPZc_U5t7czTQs*>c<4^ zV>Nmp>;&^0!nHi1;h|>-j-_F4<9r?8EGk&Y=^5yk{?KV=pfBg@MT)9=l2WR zfUu3F5!N2UbB zIr2`nd68^0G80w@?E&MjLU}k%I=oCq54R4)iG=Y@qfZV0^2;;F4-5@y(*fDQ* z4z)FP`+N2W>@fSSz!W^_nK~ko?;&jl{8;%1j_x z0^Bq$x>OaP@EoKkS1FbXEQ^V!onr$2ixTq+Ng1N$|8ou)X)|2-VORvZ{&??b=k4~< z`NiQ+XD53H2alhk7xo{&nD}|$e|?ExlU@=gEJ9Mj|Nb_V>LjTL!!e97=qVo%cl)=^ zuU?|5g_rWc8!>q3BNpBOczf^L-ukq01++A&f6{o>YgYUTOgiX4NQMTSD3y~7Y&9Dk z22;Z>{7=(r7PF`)E;-i|A$RW&A4(W8~ej?xxE4sSJbc(R{6?aTgO|6`q(JmQW= zwnjh?q|pr=ynpRTX9T1N4WAh`KGUMzXY$hK?Fcu^Yr0zR`WpU99B3!{^4XscvYm}9 zlt&=@22T$V-r!y+QhxWl-(_!^d&d&v;g)^-Wp;!sI3SQ-Jb(VbylsN0kv}(hV+!sH z?BYs!c$MLr{g3tjU!NfxunPwjw9RK**>?JjG;=^BM@;r5+Ag5VgUOpeOSPxfhp}3< ze{;dFWH9yt7-F1b6jOX?w?6vYui?Iz3NkcaLUm~N^BvoCAi9H$DVm7bvZC~^(I3i4 zr_#v-w`BHxj31GqMacjB1_^y1q2PpzNhRec$v*7LHcjw;DOou%`=Aif*35G9{QP1%vo-jI?y+$oK)vH9j__Tq`n>%(3 z3eLXlFa5v%CDIk2iXGLUhx-HogKVT!)WUS<)rTvPW25B=Bnd4ve`VgPeBuUR*DR&Iu&35@*{8$yc#q~K-h%4KU z`jFRI_Dyd6xlG{a5=pBbDL8I$W@4List7c_eqJ|j-8RXgq08o9_PfwL+Rg33jij)K zA7;Grs?j_|tfSZ5L9Xv2FPx&CB*cC0QAh=Vs3$k06)GlYJg#9Zo`1hw3LfJsjxc27U~=>ig5vkJAmUJoM#`q|O*E|evUHRsoGn}83r4@J~r`p;5fD~f0!*fW-}x)7TW$GJ2b!N{Y6 zgX7;g?&k={R8pXb!=V*{g*JuSY4B9@##wH1g@CK3wz%*hKm zb?zKAn?Is-Q~{O@fCxY;3gq%Nm71i`WwoNvm`&OYrW>- z<)rrM^FUTmgxkda{?3>@+nuxq%tsPr=Qe7)PZ0lE$()o|blqy$1{RqlYchXgbGk{Q zmZsOa{QO3$sXE9zD>WW-KR?O(O#aa%9UjwzUUO`^bXP0SRN)hcnQ&mvvI<5*jv?1i zTN_W<%L4{EBb$im(lm}dDmVcE@D0o;^z1p?KRajJo^P_3iQbCynOlzU(Z;7ouhAjj zYQK=DoFY;{Tu}oZ50G$|=eo|rLVTBB;P%;1M>_>$Y%lg(`3M2_M|$4r;&Q7gLxr9; zI?&c8QgRqgd)WS(F^$Fsg*~e3(ShxZ+CR2S5ZLp`g-1YJm1)NX831NaezC{jvo0-x zq9mGklcoKUf9q8fG=ajBx3*x|;fzB^Io?BBKK!fg-2xc{$99F0XyK6Mz zON00d*giYoK0V*#AStTjDze`D#={@c|5!)0voAl!;r8wx2KXx3Wx5L74BZ;`u}4rg zZ%`tDomtYQZ2!2uf4+b8=Hhhk?Bw|9jAQ;j8Pn7wJbuz_K>!vrtb+$Bu&Tu=UdH5!N;-99?I*xyAuXrA1VK_A}%K_Dd$(4l`0iy8FjY%455huYpb-~WMwr7n;C zCfZxw@YM#Jz@eW`I=GZ(mM-f^#>8MLjirOJRDwo$veX%)?VX+;pJKF>;9y!Msjy7}yoHSg`IqZ*G${{!X~G&QfKfio zgTvaxfR;x9Q5W^ZaF=7dI0xFeWgri$y&rIjTpS&r@9&V59_vGo6VjeDDpOTWFjI)Y z|5-W%1jf4q9#@a`p$ao3A`kiAlw<}k0>BxONCb+!%khx?_}Qi_XVnDXq3td(A_d@ey6bXss4bu1Jnl2H%UJCaOz03N1amN#aTn;~@3!zuEzlKD4~bq zq#Ww4N`+xEYlJB8Rpj-+dH_yAIlbZKn_@2vo7Ngl%mMl46G3m6`6 z<8J5^#Sj);X6*4R*ZK_5|G_&XFvP{{McTMFo&M`n5m7UCRYDQTRCWVT`L-aNL~}wF zehaZGLctgawIOm?;w!XQAGXlIPECl^au-?6mw>u z<4MI?TwmmPk}b`Y397ED3{d(70@Oa81Uqu|6z9CIr7t%KRNbix=K!bk-)$w1OaxM^!a{ zT6$iHtJZ@s&0!aPRKNW4%Q%s#9QcmC>O5r-xf>=}lGQC0ZIlESR>v@NKthhcJJ^49 z^5+fk#?jgNDGWkAdOb8M;W}wRE?`Iv4t`4|mttg8)Lv72gYCbETR!e*>v>J%nJKEi z$sRqjxTONZ8}Ed0kClef>4$4(C~Wb6jVTU$A6gDasvWrK75=1a(W-JMri>+2RDum^ z?>Lc=-4p^Q)TDI&fR)_aKC{L_IJN%8)rPBQ%~z`%vDa6Hva*Qsl;FdxXtkx3Nz7UI zi%^lQ+raNfn=C(du3J%Q2u2ayDQaUlS|F2;F8rM4S}o{2j%BPfN#k2e1Gp;o@Q>&N zS;pSY1=V;hQP*KnvMrZg_lceq9XcBeFCa>(2Q&P*;!1Ygq11FBFMHERxn2N{X}0Qz z(IJ2|O*<#bek0kV#$-oGPsQwgAn?0d8zl6`9=+a1#G@+(TFKIF7Xoa`9x# zqI^nM2=YcT0oE-q))yN(&41~=HZ~`BsDtBf%?K5p>7V|IL6C3{jyy+WmJZtBu?v|2 zI?O9VDj-LPEJ%~R`_|PM>WAEhf!=e>uVkhrQ%DJXv!%gD+S!waTP~jzWam z#we>M(-;1_ez9PNAf~6=4_YGJnp<`kx|KX9757 zNo7APbyX)pPqafkAL7bIa|mFf=52fl*XIc2jZU9_AQcXh5}X@8a){PE_B9zCS{0;J zm`7U;kXFKUWv}vZ9KuP7#u1D)iy4zyuYjFIAv-WT@R1dp}&H9U0+O{Q2!g| zg_YMJ84SZmg-a=6{Hg-29yNv2^B+LgeU@}DjF5_w%bbLb$EAwcY%2@bWo76nElQ?` zfnDetdzPx>H6&^UmYS~Y7bU8)P^nza$)Zv|%E{hKc(uaSBf%Z23)47 ziP;Vq{TD4=iyCE(8)#oj1Njj+k&a(JK)=`N ztZPvh@}mfpf-PM#!zntbqk$FE(@0!8%mwX~e7 z0HKdRb5L|ltdv5phMu@`fa|V;nH6AN*xJfiRp%4+?>96B7W>OQ zp{ih;!WT1fb%yH_aUF^rj|97f3~^D7B*f8hPBafSlzcdSgz>+^X{#BpU;c`uooa{E zO65>78^~Ceo~PLZ)i2WRFT3*zyAqP8%zw8NQoEqr{EXs}#HHs7f~Y0_K4eF``vKRV z@H~^f{Q9tFKt5h(iTZoq|2>4pf*KdO9n(lCNLpE9stEMDd3@w7O5184M<+0jCN%U# zBcPVx3KB>Bz#0}P*h&;e7zC}6veOf1i7|_p;7M(;5k*29tCHPiJU+!KH%rVLFAzTk zzVx(q=_(}I5=G@(txw(`6^x`4G)B`t%8ao}O^G#CAgdrjiH4Z^?m>*|;ri=e&b;-) z)|R<^W~knCgSVhAt|6J+=shoxO8l($X6|wGZKzXl8x95UPCDr#4enNUa*)Ybw(?o3 z*uiF_*%iPKdtnlIA?-@QlCq>d8~9T55?tU5d`q1{c{Z(;pkPzez^PAXDUk)=#^0OU z^fz``L4$}@vO`|2s>c(5X08E<+jxnxQ|^Rku0zaoP&vi3-aJxp0gVQ@jT~YYC4ZQ+a@sh~y(^7P!vF4R5hTPh1qn zqVN%!s`0&o{~?GB`NJ`x)U;BtkHoDBQbwwI*rm=>9h^r1MF1&Ro`>hQ6-#3~qK@$_ z>!HijC6r9L(JL(=W*}YKcT1-)C^w@7%H<&V9L#Ik*m{27wT{n!YzVm~o+_qis0Bjh zk#uNc0RXgm=Gt3Bv{Y(QBZ7^kze-Oa`xDBar)b8WaFhY*3$wUrr6iOpVz55KioL1P z#QO7O^9t2$jE*IF?i2DtvZ!NSf!Xd!9{oho0iYTz1^B7gE%jcmLoJvWYxY|*Tqr0| z*QvYDC5nS|74379{b=zV3YTQ{p0q+A9ax@^4+X82mvL${m94@{0g&-FZ5=p-<5Trk zup9FK6DM++@Gq3ABOE20M^0Q^0wXX8W=ho>))wGMbpT~gXam{)h0zJ6+)NVY3ER*! z?B`Xb@&AAJzWlk3am}kAc78L)u)Mv4WspZ2 z?i6KRTjp8LLv)Pz9@}i0X(v44g)W`+E^d%7<=q^y_CjbIXe>_}yssbTbZzd98Z_?a z;bx{5=AwxG-Q&M`66$}cWdjrZYBYwgUq@`$SEEt+YBXrGqQUoIf9a_`!;@X_&M|$} z@s2y1KdET~j`i890(+fR+sGxQ^HGbvA_A^}yGaVhNQ8*zWaECA1B6+>h7@m`gkTALxG3^;D|fghM`bo+ga;_*Ow;9+s8~b}1@tJxk1^)9;T96*Np|8) zD01*sD&erLygF7_B zj@K;_!3KDy?Om&Kgc2Vhk%}S+&0K}V#t;#RbFQBZ{mF?Ew$RwRv)TXxs=RN5_1wJU z_V_`qLh~z3hhYy2-?1jHXXm{QoGEl62g?!!JAQvG11H5>VkRxEi7fvv!uJ+;yJ;6M zL?%S@X3xrOSq;K@Qfa`jp;!U#VQb_Q791g3j|!N$Jv}q)qISBO0;Kk^P--#2Se%T{ z9rNB>6w}kGxJV*VF&TCo8O=lf#TLQOD650X5QfO)S0qgAFQba<1O1j%AgT2)HSQC* zGXtz|Sv1N_L&wmS#Vi^LdXf^B1~?;7fSO$%r|;+4^fj|XT&VYH%9cksOJ%SSS8VCr zTK?%Q&;g})P1@ty8xbjpnam)`{Z% z)K~Ll*~pEa+RB9%tg=cV5St*ANb=!B$b-|?{Dt|Tkf>hi_M0@+x)2cUXlrhGLx2oE zqDa_Fn`@is-@wp^Tu#KVBtBIFQIIE;3POVz za7f=Y4y(-{k!0@|B5Z?jMtxCIWtefz;FbyF&9HlZjzSCi%FQ*t;xx2$v$(lv0Faeb zB1i1}*co}+MW%@~fioHU-V3)l(%_Z%Eah4;ZlHAKVGA|+q<*4b@{nkU7{b&3jEPG^ ztzH4(0Pu-znMa|BtAU5m7e@_h_;HWY$9aL~(>c0*-#~%O_ec9I?dcahd^;LL3Q1?) zDu+h~L4(p}4mE=!IBG*XARgk_f}M)C6)&A=tJXv@M6$-OR+%3_4%;+}DL%W*6@yGr zbDBL`*t$gq%LF~PpQ2Mr+WZ|(EI3HP!e1_~=c(&T)j1f}GbIYNHV3Y4ZtT@-`_*QB zgXIBQniO+|{(yz(o+JJtdWKly>=q=zt@SbmBM{`P8QA&6#sJSOGH2Fi<2~>TU}1~n zfluavw-Qha7btkK$lz*WbA!@t^oA=M8s>dR_84aNkxfQ8M>)nY(-J>5n&6@(Zm-6L_y?tL6udEykz3de$ez)p!(s>47^y^9vUq*g z?L9*`yvDI$l9-{%z1@WQrD4+Ykli<+6q>bIn3X*-xjY^@L*KtPU<+#=Kd@%DF9C8t z2)kI`!`i^c4bo<7U!U?Ll%N$+@UsW*EkOn2b)3HnpeVhpk_%B@zcwRgcK)yTn>c2# z9OMK_)iqr?V{4#5(ySWF@Ns)QqwC7A!NnVN1^i^@ghE*}e<)%f>?4=I27(HKU#cW!~EMxH+be53k zF~6MAzDqr|qk@Ss=7r2j!j%=Z*%J@Umh=-TfrpM2EAE4N{+j23 z#Ws^tfywx472~?GE2s74ov-4K&BlUDQ0e5}nn}`O9gdyOna4Qd%_#kIhEm7Myq5dr zGx#=zn0g+a3xrjXPAmOY_YfLtquZXzD@H{GmWoHj5a}nVH;fRp1hG&G;j)hk^(4KcePfBN&FOkCV#(b-%a(Ab$L}$!OT}(wO`RTpL~*Fk$Img9!te z4An5EwaGq#8k$CX6#o{r$^MhTCIs9#3CLyxJ%9-IF!Z8OlbsP#iB|(Gf5HLy&DAh) zUcE>}vPip92`lgKe%!d)IIFyW-G4oKa&z=MFD9T7Q{G7BKp80{;SS-cpdB@kwr?O? zMZtRlXM&JswFuxbR3@>0dEFO=PG@Svw&9{;sSjF?D#}HME2@J&qkU2jGDF6PvKU5+ z4rB%5wAdtltpCds4<->HC)5*Tshgf1uz*l<-xuU_mnmWESS%aXF+7aPUhpNZ${bNd z$I<7-?kFVuXbNtFKCbMApKv& zy7!5(c?sE{!WQv5R5)OMIm!*x{BYQA9OS#%v_-~kfXp;|Sq?Bu_SVrU=jbr&2jhqP zgn~%7*wm~GIN+;Iq;Ukj^1HIsnHj;81B5FakHGjWL*33x1Oq*zu}xfxcJ)@RdQ8&! zL1fHpbn;&atAC3CGQ;#^v?;@|3}PZaYfCqT1I05%a;*Ar*f>P!9CGm=(p|@oEZdYC zl*bIpv~Wc9H`OTrLlhZ#l$+v0Bfmk7?}K{#{n1_x1Ci68%K<)vr;8eDML7fKJJ&ZJ^t3CMd#2UT>glonK;CHTVtvVa((un3otwIyBX z2ubY?+a6q2y5OtHA8;gq06lhyB3qIEQ#2vk1#m04#Y#EmsLcqcH6%E-vc@I7PFzmK+&MoEvS_Kg*2*Wn^NQ35vs1!cKGg<%Y}+r@*}t zj~F9`=4+QGEC`WdY*5Uj+3VMI#~?RY#kda)DGK)+bC~wzxwo)t@GM9E%7f`AZH(Jmn|{2BhUYiZIwUrc%X`GI{{WzaKKd zg4i3YXpvt0Q-xcNMPi?IANF$j$h*fzp}mQ+lWdyl4Ys|0-8j_69aJaMS)-I^+A?}pEtWlyc3ok--j$INQLRBm!}eTuNe0vcxD93Q80Ot zopeUv1>zxZ#~`T-jrDZ_c=u}W=mIo`^t2X2drm|M>N}zQQ8WAvRbjP1ZEtPC=#$pJ zmn?orLa`_wwvIp38p&lg2@T|eBrmrCjQL|TwZY?@)|P~a1ZqI|+3IjCl| z(2(R`b*dmhUI{g^R^S&@ZV`6fPtmp{%TK95wkg`j=7J|}>_d1BdCoGLiK%C9%s(M^ z_A)axzzFKSqLi=V7S+6(hobVmtYu;-I6cVY92GX^Mf#764(qo({>l<|xI(hpodFr; zS5Xmeu1=7x;*7chQedtuzwR)I!{;~AT1Z3BMXck@kk{Ye@|cM(fCf;sFueX7l@aq# zP308RDGmuPNQ3;?@1cuB<~8fbSppd1KUi9sFUb^{#}!=M#7ZUUGXIn1@zM4vl1yZ? zWHOnM+<&plvYzCCrRrnX502YEcK-cCT@tB$A3K9~hUJ?ZDX%|;QUTVLm+#qL)dZh| z{3ARqJcuK;>;)P4_) z{9P&uYy?Yi!KFYrN+72+a}JT=?%C_x?C+hckgMT2bZuaFxR5h6i{*NYQVc_I11%Ix zU?+rncy#!-+OF<*Y|CFi98g7QBLf--5Pt19Y8H*vgM6HQBj(Ce)z2W(8BR&*smm$( z6eN(J;FhwSqHL74^sD2i*KiF4^tH7VzE$>sjb3 zB940x-lGUMI-SV9;Pd{JbO0V#-B10in=Ag&yTCh>{y#+EdIM&eBH02(Jk+esM6YqU z7!?GZn3WMd4b7&=kyhsWcK@hKkiN?9!6nA!EQIn9x8cU!=FIEO5ZJ~OtRE5LAvA}) zL_pgP^exIKNg9q}B%J~YBhalV3@n&(TMQEw`eWC=ho9uoge;#)%Drm4ZlbV3N@Sef zF7)p7LCD9SDVEQCWDWgHXeC7~4eC9A_G~vGR^{)|n(2*+W7@9GO-YRSKP^3;mJD&* zKFw@OyrU5AhL8w!)41{k;OZJjIFuZNMx+Gi%%M~r3Sk;f>7da5msJnK ze#6ik+`SV5z|Qe*mawtaBkhm!ju-Vuh1Iy>j<0+s1v11S8}2L2%<&ux<=+>LgO#TqR}DQNUXvEI9zUW>(7A8?-!U*dRt!r5${Q5N; zzy`wi1&OB@ym(=ktCB0e>24l+jf~>uL46YIL?TJd^f`4Q!Z23$jfKu)S)z&^F}7T} zYthIrah>_ex*Oa9K z$`@a=yka#Cm)Al(LS(_^R-y<3Q+jOIpm43GG|=$qkfyeTS?2Gx5^!NxMi!R%N*NZ_ zMuUeqTRVp|9Z!U_jBebhO)xfb_!(CeO8uxUpRXA?ij z50EG4S9Rl!edT`TpDNvtg_fWkn^Y?Yit7{}KYSo8hv}335Ll+dX^ytVFDSTUUS1r9 z0=Y&JpE-Ub*}TbZKz3~B_6R}B8`+9|xV@GPr-VZ39sihha%LSK^sOhz>2|cw_IIz0qmV@Kv!X zv0qw*Bx1>PJmGH0kMbR>Xu)zZH6sk^S%(y{6C)+BUwZ#`7*dzL2SOioc(YsC z1=$sV^6qK-*WRN-_M5r+o=6AG zI>OqXqw;R9R(UMM$8{KK?^)==*ZwTFAe!1i)RkhDsjXS9XNK_f)51=}#Qlr_MZLha zZt?s;i|jCExwrFrjBGfEXc)YEJ2v%9%mF*%byC<7)oAFmm?A_*$i40_U>Z6gF~eTM z)q~NHr<(|tnY+EFtC|GD5C+7#l$IFkpY~aGPd0=!7RIgQD?JFs=<~1RYTH>4;gk_i zsd7QXau>K4VS=m;Wf`Fh%iYUi!d}F7Jif?g2IB0yByngjGsODucKZ6EDFE;hbE_kt3J~(eeRi z!A27I#P(eaYX_J@dF4owV8B{Uabk@5Dlj=!;U`@}3WbcTORF!NLKAJvrRuH(Hx!jW zCKaB%dn$x=%83v&jKo(i8kw-^0PlJt)G32hDt^TCey1yE=b181b2Mf4%eroP`TRvH z$ZGCu6~B2H(l-{RD5Ys;9ZfK#;Kzhmd>Jkm6#9fA7wZK|&kQ|MVMYDPqsr^bN9eT? z8}me~1|r)CLeE+vU(91FsitI$s%c1Z8vyW>_ryd6LhWt#HjHF3IOVoVQV7qrP|w!G zvnOy$;T_?Bk!nx8^pgS6Sj9bG>doZWu^5dPAf-^_w@*&bZSvwwOe~k%*xrpan@k=a zTgxp>??M&gq9!}Dk31}?-h>FT_X6@vToW59h8>il z0#2+oVuD2mK|IW|Sw}uIli3^Xw%kMZ(|Uab9WyE@{@WXv)Z00T_>`2Cef2DO1f~S^ zFtv-H#p}3^gy=WONGFQ0bU~86H^Dq&V(2bzu=z$tEMyD&PS-65!TW36x9pzu2WYj1 zIk3LPRsZ4={o@T6-RnF^?3^Q$>;_cDExb#-#>l58hn?nb9<=IBxywzAfvlfS+=fWu zI~Osq55wt?)n!pWF&X0=AiO-@N{kn)gL%VIDf_W;+7l> zd;Q!1*|&3h-gv>x?_Cop=#GyHvb343rG1V-1#IA{exfgKr{&XwSTSCfL(7uM25_Qd zhvWw)nYGZIK^UTpvaerb4Gp{g_=oEYAeDiSpw*IW`(j70SP*qKBFjWm1(Mi0p9{HY zY9byP|Mu_QpdpH+=Ve61#UWWhF2^HOhn`eEu+6gd<<-lRcv2=-R2m<*?1`G6FWRIG zGU6m_$$^_DWjdU!lGYQ9Of&M+_M|i1B;}+u(%op!t%7#+dljtkH#+kJy1q2Ju30&u znQMz|l-F_7K`L-08Un7#YFktsUUSC+B6YnHK{Blm(Ease@0#}{bko7>b$KVpz4FCV z@S?I13nC;oGLfK?&rzJ0qgwYmyl{oIPNF;9=<)puIZ~vv=brzIjcV2)<#0vyh%UUb zDqgef?fNrhlP|<8Q;6P4nS=L8O+$=FV9|HZjgzkiaWa}-{?R5*0yZ5ZEGWaNDQKFI zwO=ZJ=AxvG>=0dh^~|0;^Yk;EvUOu^l)@AYAssWS%_t60|8zaV{kwd95fZsu;fVke zH~Y5lW6Yu;9R&bp@GVmIBQgbB3c?Gl#;VxR0E+b7`FjV}jV(quq2nx6_mEjJ#k0L<-?At~(N|LFg)P zNSgH^WaMdLD4KS*9aH|w{_WQi9G$Stg61dabQtsV4Tez4UkC1|v_*w~j_a->X6=KM zGfOAXEtI2D$4@#)k)*2%Uk-WQ`HF@5DtyT89!_2LQZ?IA0g2a2y#0E>kc3$d(`QFa)h{3~UZuM~DRG56U;UVds-zpEb~p}5LV zGX*=jK7~FG-Hp?qaZt~+Q`{5e?Gm|IjLb+RMz~m_=gD|pP}I`jhYh*IdmX~8TLCN^ zi_$)7R6LY^RTPX#n^IJ5 z$FIWWf6bn?u}|CeAEX|bUqQRc8-s`DH(D)&Q$79!H(Z`+CNH*ffp%B!q?p?uCAQiOrw$y5Y=|O*?9Az z%`}r2DgFRXN-6-tNX5$;SV+D57>n^adc?L`82x2RCfU9t_N^&uw!NJa$4^&L%k;y6 zl+Jsa(j9yz$&#@#@vSTT_H-7)NeIN+fq0dY98i3Sy9YDQWI@5F#?Cnb+3%`p;)1Bx-9Z>2uPU8jrKm;0^yJNYmvDTwUGK0K~UkrQ)bx+9q}4YqQ>ySql2ve4 zQlB^L`|k4;%g{~$TNM<-i1E9P#j)N*0ezW3ifuQ;pNFH{s7d*7__xEO@1--yR>~Nj z_Q$7#DBo+1W=-<-UTmj0uOBCQuMjNvUu>tie}(&LpJNm_I6ADe>-&pWDdm(;lL*N7 zZv0m%8Mx}6cF)eDhUK7ItM2X5w!BOVFT_7;S|IuK6J9<~%^S;bbWp6r9P#|Ov zbTT~{DODg0b#P`vQa8tgm-6TU@98W^PdykZ|IT=@NifEZ^&q8mmELR;3|(3eMoM7e z0VY8}wlWCGwE|vl5&~S^3_@}xhsT?Q0JqnJkd)aO5TJSDcL=_ zo~cD|jzc|4I*7>ooeAi>YBL9Eh904N`Z*q)l=P~%GaHV_pX8p}I6g^0#{2Ow zO3APBfs&AnBjiC!`7+KOO2TqJkq0d$#l{~_!ZJ>=2Pq|m-BVnN=v~EJlxl6i(XJn0 zx!&H|O;N~vpTxuf$uQYXQOLL|Nl3nL#XpIrEVUanJ5XN+yCKVmZH$C4WGB)+unYeT39WFBtjO9hfT_` z*@|`yjK>Idh?cC)M$JLm*-hy&DU~L+(s}23YEJrfaz^C3N8OzlDWirG*Rg55X>cR9 z{p|US?~;S#V>kb2&r|b<{YVTB^Wnx%*#P}IiGqUgut>?h;b)8nhLxm4I+TJ^I=I3& ziO1@j^|xq{){;>Dc6v+hU?ivG0NEMs>?GqeW&_ka!%f53w9E#mzW1R?I}1oD8UqrN zHKH4C0699Y>k-6OiniwaZsH`vz^K}zjAWb*aFPLJ0I>mN%p_$)0D%GY1UXC?9p9(4 z4c{{WE;OCNBsm}v!g_p4SrSW~lqIp`X*R2j=m5KvyKW(Y&a;ps!$@oox0Le^h(hsM z;DqcMtmO6+ut@t^pvV9ZQp#f7+{8~|K7268Fv;)_zf2;)&)w*+l7828l0M66x3Z(0 z=gIBn#Vio-0vJiJYdVpeus0O3-yDyS1HDI7x zC~qfp$I(R)aP}H{qtb;?QKxlSJ#M`}lEd6r zi@{1_*!BTh40m2VP1z&{2a%w85w+s*;GUvB!aJ^LyRVWfiGz{E$^o(%0a}W$@Ewu} z!FllTNv$guLJ}Pd#=|DHo=hi6WZEqcm((g^zE7fJfOwdsI5nM2|1krX_J3s9Bv%aw zV+KA3P=?WVYUSWAD~S&l6c(o%-H2JBng%w+7fPlopx9UJ z+v=hEP%l!Ni0_ifrAfIbQ( zrLTa3cAT?Bf&KywK+^ zR9}y-Z;%v;+X!+?)I$X&T+L;yb6&dQrMXxpWmYF@SoaG6}?{nc*G$2Qh$p4#oj=OYfhw+M!LFIqGarw>-`;PJ& z8O%&|#%0lI_mj5Z^byJ3YRNFjKbSGJD{w*EhQSb+#`(i3lJ9Vj-xQnv`{?`}m7sAy z0xcQk+MA%KtsfWf{D>lQgge<_#|AXq_#_P=wdeWy%^0SL#j%{E`=afY&?*{Db(v^H zk$tU(1Kmmgdw`RUDLM~0;#PUl1F2KEsTwqCyhfiDSV~x;u8{$s$f-LW8MTvd%piM) zRAr2I?TCc~-f8bz8ZKo`sWYL=-wDiyFFct!?4SN}eR=)OH=CQ47Ebe|Q=E7xQh4y= z6FgCMz%@Ny7xY#;(q~v{(4Be1;yl<8NV!5P&tK(IgzW^15uV_%aPz7=yy*@$d&5mz zzvD@t<7^nHPlyV?4zCnjz?Hv`gdW|&e^&l<{b#;OA$5-(6IoUe*h%j{<*&IT&rjUz zEcC(Bb6oOF`E*o7hvh(N1ypE8o6g30@NgoX?d9(MV?x5)a-ACE;Huqu9}T~Cc{L5C zzrDom1X`Kb-&P*BYsZ_7<42Dx-)?T&-#5P{n1_eG>6`k82D+DzEAE@W;+w|t51Xyy zAMnu`D(gW*a7)@CobiDm5R9FU*v^T52Zgorr%feLj+A(gdrc6oI4Sv9dx%$R;4LPG z&W}1LP)X)Yemy~LtuFdPcI5rvlfC_6|BvX)gKZCclg~nd+I5SaRRRU~nAbHdx=$8E z$9=mbN=$m;M2keRPgqfpqNek%NR|wi0W<{1XL7NG#Id3kn?97P^5Ep=9HlcSk%8d<(N;-QzMj$!jeV%J;ps3U_Tm7 zdJ|zM8l5Be(@rdjI6CJJz}g7n_Q?dBic>)I$;7qFJ{KYlKXXvA!`y(tX7x^yi?3=U zy_7S#Mk5K-kAjXFqKirsI!i_3)S8gkmSA#o&C)mkf^G*$vmjjb6h`Qu1r953Z-yG0 z9pG)YEEf-!88banWr z^vwvZt{7Uc7!2%#X#@M1yw@-ABNp4ym{Z*R#v0#>7~hT|dF9~)Cu_DG@&l`Y*n|yl z2J9c}bj+&N__U?B1vDWwgtv|H^+@!nP^ALJ&$+48yK3nvqQ6(GO)1qUF zy=%7f%KHH7HozldY=~Y>u+WQR=zKzYRD&*Cgky(+PY6psK_P_61e^QZe!{pUQqgrf zzL6c2aX12h!_@YUdmKVocBHqVQ%*AC0qmjVJ3A*>$ApM2xwSk4h>f$81qi()mFJTY z^|grbosp4K>ztiHaWX>2s90Ao8+6pjD!jpUZQKQ5lD3p3a2B3h|GbZl$8uu48iB(Q zf==874FcWK8IVuT>-K8pu^C$jafR5H&Ap%Z(nU8+>_7(|cl+3Ik?P`xKSq>+mKEJr z*a%N1ij5BTenykdZ_wCwct)(CpQw(OM=KfxxZcXd7e{D`p%?80Ra`Ve1U zvP_BWZ@QHhPH}2&W%whBR@foY@LWI37$XSK5Gb}hzz7jBSlj{?;)GUv3S*MZgtj2q zK^bB*!$wwX~^+t5z&q>I)# zL~nrh9&hV1S%FIK-Aa11t{~! zkjG%a*VtoLtQ^MzZWEb*2AVYyGr|ecdS}3sTo|EqVOJ2B>UQY5#OXv0qR!{xgS^7H zEt0%|-B%`$5o`IjH>C_nLwh+DSeKSdN8AlypVV{}2Vd7?x>gjtl-_9%-t$5CB4RYW zhoTo?ALwEtUYJz3c5vpNA*`8F6 zVX?_F?>mu)(=N8dBD?&^i7z6JMpE9Oa0&OQ+^eGJ4^Uv+3j}fG0eYf2*cnMM1`q(CPzShhPh%nWig0f?a= z{Ew-hAlEs9YGSf5pD}Lqpfn`o()_uy71bY=2n>X^upo+18&6_p>5XDXFseSr9)gI( zZZa9+%!A=g#gyz=(issvHU!cfRq_MehH9FD5ZGA1tgAQ2;yUX+{Hii{q%wK=fTe)k z&Q>4cX6xo;(u0L(fD3V5)A-1)K3ouSlqgmmdcxJl2n5w6^SS%y6i8Yy%4bgf@Td^? zQ<)H9bZRqKSKdJfp$w+)t5K6|C$fU0uDYRs=O_nv3k$6;S#pCpk~xt8v~GuV(Z#y1 zf0|hISN-bTlO;(-AzPD-%!z|bE%3BL*EnpJ1AWMpftnF4M`?X9qj>AcT%C|6%+9Tb zR&uyyR|XWe*-*WnFZ^ypWtG6Q2&N-~xXPiN6RR1bZtTrU8++tk^g6~mc@(tx2GRX0 zoU99MfzUyN2a^Az`v@q)n-Mp}mmDA(%itKKC{PB8#6s*h902?EEIA`WK4r)|_`Zxgx zCF7=lwT9ubeTaC z??&&F9~vxz_4Sc z>v?yul*IVp^ij=jsM;m?Bk*SPC$J}hw;qljH7o+33mNn0#@(wNi;nr5Y{@jr z{mZgRF*IzFX@g5X+5wl|^e$xS^LqA`V1Rs`(+we)JV>3udJjztb|$F%he1R|k8#-N zTqITh{Jx2zTi)NUNqg|yVXM(<*AHtyhQFeSNi+8=E_8Ojt2bMXqeJgq{(5*6dGLJ| z1!bTt8GfjT-On9n{l?_+_41&fRg%LV3pxgEK1 z50=2=;xe9CO}hmL&Am%V9^?h-(K*qxvos_hjd7c_JDm9En?>4#x(wgLQ+KDow5b~ojU|k1o#3DufC%jDaDrw& z1S3bD2x}>(I6q7b?t{$@O>Dv;{FjRZ@O`(e8E0&zc%R+?-^98nxdCwK zJ$#AWl3P*R#pa7k7YCl`96Sl&47>^57Xc%(42mEdt%B*`TmGy~;DMGgO$5SylQig>`= zlJqH0lPS^yh+#jNY;&s-K;m1eHP}=fM@*L#_-5R$u1Dsr68<7m&%wW%+o8%JiM(5;J&BNIVCYH1VV!tD;kfcciWcm(AIrcqYI>@v6u$uPCdKBkK+sxblHs zS-icJJVK_CO0E@%(Cc35lo`CYZ$m=_c`&?ivZ4gjNJ)-&JY`XG2K(@!?gwAcYpG{) z?8~&AvT~&@|7N?encwf72Sj68oQ$_a5r=Q>ds0ca)Xk_+LC?UMyvdyz38BY3LPs?2 z$dagVggoowf_$I^v5TKK^~heL3g9F@V?Qh>fFlkZEh_}LykJvVwgBxUPXtXff2-*- zmc6-?(npS zZk$jg$p>A9aEKHE)^fD-12UQct)e?1h>VNPyJmAe+SE0VuA&f8-=YMWMx-3tz^w5N4&aSaPe=-5dSTAc$%{iFTq)|RAQmP^?>CT3ev5(OeEHC9y!4?f$&U`)h|qw>{n=hkisfpmhwdu z7Fn{%y1;mX2|zPcpquG6vS&nvWRD`*7g*YOY^Ya<$|z3{)i!eUPk6<7XKQfjW$Wzx$Z(`7l- zvI!BRM#RHE;A~TOQ34p{t0ogvuas+0OG+;QTum+<|56hS#$mdST|K>dB3B35*ZO8y z%gU{SCNWvYtZ1ilTL#2T2nW;(fi=UZ_{-0SU*;zSljX518$qU`o#1Wqk=9aKW-=Tw zHyiEDFkQ=TWNfCG=@vvU_J52a2Gm!rm;=Uj1Q`|_y7l;K-%U@;rJIjfb2<2nm8!!Vv)fwiCuby$QNAOMf!%#|-hv?(krA);~uEgjr zo6sd!4Fh2VH)wHzHD^ezBgcAv5u(iQX*_LGmTNs+G&)vS5eWeHCT(Lrma6e)NI zL;zOFAJF`12MDON*Pp<{Wz}N6=(=7~ogtcEAeEgI3ULC8ddH+$aZ^+DnHhMm54 zR`NIPM6`BKh%%W#`YTrahe;rdU88C8);N!!kS~A}uKpc+cjX zC58xlgmd!kny2k0%7(}n zsFTsm*x@umbhIQS{9Crq=g@)?m8NbXr*K)Y7Tc56TOsyxQ0@ONEPIf zbM5Hs4%q71>h&a&-sE~E$(D29O_Y;@+sPDD+#s^7Fy}0sx0TaCWV~Zaho#i(HtOWUIT@~Yf)f;P z!lj85@ul>@kom7wT&2`}4Fkg6KEq9R7P4U?0`PNDt?nsHxZ_fblr;wvx1SlRShJq1 z#uEyx%vi!6PDOC@AR}uq-CU*b?Aw@zR8554;sZhAWsm#;Zir4we;hw45P8Zt`(ocR zG_rp}YNXIO0xeQ8&gaOxay_t5d&W}_$tuQ<@B{C zXR_QvpaY#~u9Z=9%3fx>$$8CGNk=xFhgC%<7WO%U`V!&ity+>(OdiFusn{Q(h;cx+{)mXG)}xc!0M4o&)D6{qfn?o&&#{o&&4A}M(cD4WA%Cz^0okoT8d5!^}=N5MVj zuAT5@kDO|Z6Qbk3T@oeR+M|e(eF7Jbp1QrH__Z;PYfWXFo_uYLQ|!8P-y7rTB4w>F zHZabVx`PX=fmu|?DVcl6DvA4HU7c~#tCVDIafzx)zUZB8o@QnXn=Ra$ninWD49xi# z24uI3jph2A7Z^lLB5pXz$oW;8Nv3c=FZ07zcxYm+5{oq1VNQur6g6K36WZP0sqb9 zaVe{-^{$c4O*wzN{$2@c477|jMoAh3sE8JEvt@CuE(LZ#-}0}@rPNdB^|e<5+zoDS z)ewTOkT_TK5zgAW%tw~R<;w>?_ zt)@u*dfG4eTBLyIsF8n@-*;ULOID)&f>KJCd&IKzPgCgRt0w;MYro)YPKovl>CK;< zMXOZGl7z!`Ij*-|)A-}U8N5bKctEcp=W9v9!LzFl&f&fDd7}YVA&AusomlOV-q0Ge z$Tt-5irX!CQqKUifkK?C>uczsv?lz;Xl)nvm$(HUg+Mw1!Z!*~Kn(5nvACvRc->jLK}5j%5UKb}<=sWWTnCuy$C2 zX*{k{`hMv?mnz|UV3rjdlB(3UMzzV-%5ePkwT4i6G!kwV&x_h*2PV@;T(nh zEf@2(w~$cvlq@_MDQDQQ@S9S+p@v3VNX$^owXNZb#&Xt8yCIN% z6)2QZV#+diCmk-7wib*3T^%k|5$xQT=x~uXFjF0yS$TXW{FhC%y54+>|o8 zWX7sZHPj>uxZFx36qN^Gn`+#QaZUL*(^Nx6QCJJ3;<4CepE0$>i}J;86sMO3Eh{nqcF;Hr^P6n%5(3{3`Nb8jIMP^U8rW z7l~IfRM3#aBpa7HTefAlDQ3-h8Tk?tXrX>_8RWoU>&3_G#gmWDp<73s#BzCU!l<&% z3h>0W7O{q_wlvV?TgUlD8XD-(L25te>KhSrJ=-S!Q_o#^)!N?QR(GP`N*fQ~LYL@c zkaiKQrdic!#x3=Fw8IYei|7Xj|7yVF2K=|BCRWVWswi68)%5x>(K4w!Y+6%D*(8MW zjfM6I@y z9P7Mk!H0hhP6N`yEvS`k`$RA?1!DGyY#frux7I>f>vSlr*;oirN%((XEK z`EeCPO$|*n5b@Z-4i-#f>keiW7WF<*f)qKp+=g7(hq1}K>U!IZc+A59NzMrdhDtVC zn`|>un16VN5!wY_x3flphamE|Ny=HG&4@Q9nUt>pPpAt<=2Tat;*02t_Tvynvd01+ z^Y2^*~=R%_i(d6WnVx)ddOhfWA7m+4j_-^`ncf^A+z{jLwJS%EXfR zRkp}lqjYymQfLT;YIoS)#1n1y$XIF_Bi)LNSUEQYgOkflXINho6pzP%zuYpmfQ=Bj zA=b{mD(~co<-RmQ$uT&;1m>Hdq&N2>iEJn$+PKDEDIS-;c&`+XIx~8u%pr<4Iw4tV zchgkGqtMr;D$H;Z8gAd(B9A$+DBmPRkx> zby!vz{s>F8NEKDd%9u=UM`QF6TvHF1w8VH#L`b$T*6c;)=4-Q;MV(oXPxnZAy!I!Q zo-f!HM&;+;b%jwq_sBAnSqttlt*y{bDkOAmeH~1n{dO`=n zHG1JJavp?h{Ng>6&9UtQlk)=GcwL-=fC=6!+;sA$7V{w^-Ez`o%38k=qdV-XqlEh3(N#wU zJR>c*l(jQiu1iOnbA?_QD&}9X36GWiuT6N+Q<-sHVY2O>Qu*41=g*#%vnf;eq6v>G zXtC8x^kQj2(VRM~DIdcNU%z@6ks~qJ+_XnESjq*+3=(~`;K-V?0V?4(S;qEqvd{BP zdz8!t`h}S@>xiBfiDh||i=$+f-u+x~U^qn@46YcnMW^%^K+N?_@Du}Vv&2y*4?E`G z_^QvO3luM*)}IdgD9}+E^iRg!@#n|r0@gphWJP(rgp2Gbcs4;N^lGc#`M%j`*Z-;i zt{olLJ~W&4!`hGLm+z~MHg7jxp@khT1WkI{TPr+>xV@FaoKJ?m=_cA!-gF0>z2T;G z9(sa`&Zu069%E()wfT)AQF-{Sj=5KVTm7)#{`PTY>(L)=d-^rPuQlt{c0B}N>w=UM zJ@NvA=&p%=VoGDFKL|SZhsaVu`_4Yl?{$%kc8(4YOiQvafPm)6%vM5KJ89bWA4r$& zj4su|WK`*X?DhxUlL6{(StjyLN#fvM{kA(kW8Flwq3ECV2mR@15t?7gq~F%twf7y8 zwiV9Z;4c}gac(`S96|QSxBUqirUiA!>}BDy+aBrw4pCbl-8`sm zas=pF=|Msohpl?ET|t_{SZY#EFwmqj9J%&%f|*H*19Ck&y|fkx#%g=x-@3z%?N=|hDqF9&wkjXmwMRmLgZ{8j4*}CXQ=7b+BJ}qZ8r{RKAvVo zY)!jk7z{S4>z-}gj{6{{XS&zTO|j6SE`%6}#NHtSu%LUP7`gGiQ8nL>9Pdv?1FhIP zz}h^3Oo(88OL9pI*B5VIoCx6xjqgk(YzNTY0d~PqMhVKv=*Huh8K{pte}Qo*<$b3?m4@Na&p0p zML!@6#-QNR>3iSbgqA@Jc3n&KLEu<>e(4rI4NcTEjEVApYggyyLNPN&}g^o6t9;N z1q+C6TcG9{X~m1K275*hPd|VAn2xDBJy*T%kW39(2TM1wZ( zf&jp;(k`WO!mQo$z!hsXT5Y;wRQ=~`Add1A#Hl=l&U`x=cCVpx({CTmB^Fy;WqJa| zLGYc_k`K8q7-~*XK5Uj2IU;&|1>}WvYmLjJ=jMX8o?&kqrMuTUsc8J0j0S3;$t2W-ebIuD;o)8zypPw~0sBQ!JRW zcx#_qJ*q6qHZsx6?M_KlmsvYB^?rc4c5S?!}>&N@mnz*rB zuOiguJ8q-=a{Cn#OA^@}A+C|i9R34h5!LQTuBe`uvmqCjh zpEB2IkCh>@-)Np<&5p4X}J7+*D1 zFpQ9+)rMi^+Cz0GF(R{&ciwdNkKW;V0>=BjrUMb77D2#hyH_a7Nm_VE$-kCUxBcOn_Ay(U;7Fjw*Ll1ZAVLi0pejLn z=H|s|uV8_^LJAo$9bF?b%6N^L01mna2z69$t|izp!DVH==DGBA5C?K|nI|83H+RFO z$tWKhH(jEf?#9Y3K>`Je1_^98$H*-YE)h;7D8!%DMw- z+bsejwThRf5kevx`gxvIl55#CwU5U)2#4xHd~sxiO|HAAP<=#FY^ejrI(dL0kv5~H z5w*nd==Tm)o8%^{Nw0(cKM<5x6I6=g{b4`TLqqV7qrR{&jTOJj;Zq$9M%?>TB8V@V zqxaeiQ(`u&5GyQLRdlp>d~Zw9qwp)ahMD-nc4di3C*B*J--5(lG?y$b4X zUL(9}9fVR6a|J+oLBXkKS|dJ1AI@VnhXIF?Yw+Mxz*2L8S8L#`u*eR3w~<9wN}zj_ zIh5MK^uYLp1aq#AVH{+TrTm>i$iBdno2y~;qkv$aH%?D+-HmMt!6LQpqjCSDKa7nR zkn_`GpBiF2*MUck#*1j|i3Q<#1}K6zNK_mhGQ{+{%hpd&!Wn~5D zVXPqX5?9jwG|*@|atBwfDI)i<};srRp5*|&HNtht$f zTfs%BaUaJda+P7}bHlFl)*X1z6hl^u_mvfjn5B3&&L%8{R&gKw9?uxjBrEmkh z4TTq1g(Y2DNjid4D|^GwqZELFcl0a&vy(8)J)9 zjwmNM9R4}aG9ks3Zav&MX3Mn@yRJ8z^zyst#H|+6LbaYjY$b<28gzsZyCcqiAGhdd%m=*|P z!W6&qX!k~gl4#@09NMk!M>=!;J0HFxv#3lkNy(%LzAVK6cqu*X22<06 zdk3%)A(!uxSQof3x$F%FEAl{KEW-q~E|wE>Tsx9dMwr6|c_+e#?AsOike=ckMr5Ps z2Q(!JY#wMRtHHGYVauOVO*Py)4AqiXkR3_O1q{(~>0_1i3uI5kxUbEO=*lDPa8LKX0F_PMmN{Y z1C3cU0!*(MaK`1!9JW;i&p*=Vv>{4t4(UDEx?D?(Qc!VgHnl~P%6JZ1Su5CQ*T=jr zXqS*x90=q#BLHcu_jxmzO<(yeM_ffpH>q&?G}XQo-)}>#%x2y|h7HimAc+`z(hMn7 zY%dj1K+vYdaN$^+V;Y^GGfAapAutFcPhN8ssZHOwFrFltcTFnxoCU#+kmJN#lnT1c zi$~?*$NmKOHIVIyb*|Kmkh?p{4x2n-S=G1*;KC$sFo~R^s+(UDdBB6Z=edzE{7bn< z=L3bEn}Y7+7zD=Ek{*H&vP)7cjk>khUAucKH6b2L^iQMHv9^ZWFJ~o~*{OJJMo=*O zGh*VVK1cj`FoCrFhk+(#bCxCV&L$r9$HkS69>RnZ7u0+PNOr4P{TKAcWcGRA9%lgF zX&7%^xPVY>^)JPD+_oqvp)o1sw=-JHSQ5g_F|r{di?bXOEAFNs8aXUE1*${QQAyfv zW#0hxQUhT-)MGDZv?G%pJ3W|oaeN=+hRgU0#?ClYCb)iuJ3zd2(i=l5k$+ka`H2pc z)I8iIb4dXmgA|ny@g&4@;4A6Cyyl|KwmxH5b~5Rq^BqFfd_i0%bEen1H4aq?8O7nE z(j+8Xezg;I__+@!&IwN`$`Hhi1&`7hjA!1AW~%CIm{b{md2`_A%Jd{uzsl0zZqg^CbCg-=V*f0f?O0F>^U2_6mb5Gc2VexH1DJ!ZK2p$oen#L6 zU_1OY$B7!xi6A9z2GFAM=xUY75hsv5e$tf#X|8fcwsguHXAwQ48eQ|OF`EV%ApZ#tPXCoX`;KX+EoAuJ{vM@54OllQ^%4YXZ;Y9*St1Z*nMR*4)X55Vo{n!}_wE zW8Rq0K~28Nq4su!Cess}93>Y8?Y<~acDdHP%EpcYFdf|#ch@uVmM?Nxx4Gw_d(17* zMW5HQoj#XKUg75e=qPHI_zWr>4VUKR(x8m!Ch<2=5fjY-1?#*{1SWi~^T-Y;);JCJ zQc29Bg{aKhxPZgRJKzGK&c@%%yT?%|A{f)pnjB`cRaUSjCqG|gS>PT^xR);_R|IIL zLl}Wbkr@ozVBIh8e-S|J{s2PUrVdUiyb0D^BFG>G*zffQh#{G964p28`D!NEHSSO_ zPv6B+%4s{|v)#`dI!a#Ht`KBFTn7g%D7{if=>>SlOyS`JA6_uk7AAtiLvAW|)`%4j zZe*5bH7T`BaJx^?`RQfDm6@A`3gL5rf=L}?zwCI15k|NiFgO>Il;1!*5c$cl+Elr_ zI1VIcB2a=^WI=YEx+2DhJ4D9WGJIn29N%Md z21+nJ6MA+W1ZO@{tLRp6q7vrI#4vj=a=>0{#t1iiUVyQP*)U~hEFhC&X=cocxuQpQ z+aa@sbw|%+5`jVY%EMvr0x<=oL})oC)`jEwyc{s;yGSA^cghD$0n7`|+xg?t7mCM} za5F4KPM<&mW^+AYX(|{bS(?kd1Rx%Fl(D^72#BNV{(^8reZCKY&@#BFP99q3#eC8YHfpqd|nj zXt*ZRGrk4Kuy=JM=Zf6>W)UaEvhV|U#EduK-Ya6|xcKVIvQ8?Odb60H3C}PDYK*Z! zBudUnF0w$BJG=g=iH*{4VFFr2iOB74>}>4XudjGO3rXeHau#MZd7tN@ zJKjtD__&5y|J#{%Z;UEZN$_*!tj}8x6asecKpU3RasL{THn9@Z&)2=~rPN*I4QQ;) zrHJOh6ts(#a+i-WIe29FS-@;=#{ApkjB#)bq>VyGH8m4F=yl6oIJkkn`IpHJ-&WbT z7?7AsY~O+-z-xvFM89zl489RJVVH}z<&?iaqF61e`y!|(m&M9&JpqVN^1NDM;WZHB zCcSAc4Vqj`e~SrOEL()YX1L^Mv2wFwjGobjc@D zrk#&q+*Q$7fUJ~GVTcV2e?#Esr^-{ja%Z)G-LbHxOCyf49uQohYId^9C0xFoc{)*kJ|1RFF@=)eV_H-}9F!BD;po5n0&;Qe+$T8%-!e~ieV8qc zm-!%v6*=oi047}RKsWBaG%F5AK&9l=Ky`#OD}ddsmy=VAYPRVQ#gPC*#WaF+4@-#?jOxZ2VCMNjfLyrD#RR)o$$Px;J1}g-xC3s7a4A&=RKS^r z+bi1HNPYs}t?;|jli^n5E+%8QFtN#)^Yk^(B!8%Gw;^lbi~*fy4k{I4$7Y;|HE|~5 zKv>aOMalp+HID<{A6+vUc?mFp7r;K`{}hErxYLxsd!r^g}4I+cIc? z0#fk<+sV^F&x8cF#*CY~+lZW5$}`AYk%br?BhGNwa(FSlT!k>`tx_=Z<%xrUlJ2h( zdvi&bTG~h%;t^GkfGnRf42W1||9ZQ3n@zHHE|aI1F(Td#DMXkJA&LZ8P>NQOmoFnO z^IQod5jlZaKp56_5-EI$&?3q8c{8#AA>fl>9&w&xXofM?Yz|^_d@qf`LZ)CAjn=9E zF{&lyz$`K43?YPMN!?c(lvntOh~I%g%u^0gcc9{1|2axx&fVP}|1r88^pPhVq%?d>cx3~#GnCYtf=}ARO zylDyL2`>ATJh{92c*#NY(T)=4#OM)`Cdr~ZQS(kY2g9IhZ7@{Kj#b!f*-bkWhP|di zB~23aGf$t<;H)!~MtouBRvpqX8v$rA#zWA+1Jedn zK}{cdrn2%^gV~g&jbq=*(uTA_K8t;L5*zT1R27^z=1FW!^J#L}c`{=p;Nb&K7@{J8 z@Ly0C|E~n(pB8QY+v33&yx$#up`=M8X7*$D?>-{QL$5(rwn|yD?qqUvmAw0Cm~wZ2AU2c7s;jnDk5kRdlglgEZ z>!*?oH;YPITR<|eO?83QR0$G0%F5gtD=|ws%quwhV-NCDwFG2LOwtSkNl<8kk!+g! zYj%Ty92WE|9Zw%gwoECrK~OxgbZf3z35=zXwVp%Bsiw)Pw8JCEbBr8BW;seq$y0wH zLTrw*o6QP#Qu+PxW-$1ppU@fES6HNS84$(kdnreyX3tH;oY{Lr1a)|FbKiNnuE|@R za+8O{Iza-Qp_{{W2Hjoh45yfWa zGC#Hy%Fg?|v5<(aq#5_L!o(9uKfgl9>}$Dm#D1VEg!pxA~I#Jf=wr}&GQn5qh>Uzhrtjjq-b40J?tSW# zg!lkr_Q88723=6k!q7OiW>8v)G8k*9t1>_PhSs?<%h=4Y6xy zXrT@1zUd<=49V`(K9MyLRNRbgS=8x zRm$AXAdQa1IC8xFt)as&MnT2hlF-G@=h0GA3Sl=BIfXPLI`vX!f3+hB_=>rhv{OJs zZrL9FUDdfe_)lxM-D}yh4D=&%7ddRepxiE1{uP01R;2%*|L59D*0h$45d~PbHI%)% z^-9;|)p4H8&7GYG8wxr|WBZ1Od!|1`N|fA^+BnoD9M9ke-i~hl+E#tLL}T zGvIktm@9?$yw{-SYZPzFPMB$qq+lk-BP@q9JEcsG0$Emt3=2=rOYg3UxyQGY^MGGG zKA}&@)?u!W(n=@wF!aSPbMts)rdeWjn#*0H;}bv*YXch8F=HN2H(QFFJJfXB?0>eNV zSW`21^DltKzsyX`zwB>MW-T{}Y+Ns|JyNZi*>%<~f%}QeD7-2p zotJoQ)LqFRw(#`ZYWxpkyExHr~072Mgpo2dYBd@6ANWGC+qhjC$j zWwsC)9I$1lV$7y|9W|PB*=7cIQ-$S`p91cwmxNV?kL1Sky5@{l_PGi-^8|4{Q^s68 zpD8(GlyF@Cl#68?ztEg9o0*eFDj+sANchoa?y=)I?8dGAF}FuPb{Wq^mI@MdO8L#) z0vA(U7bHo^Ub8x;PmNs9S)NbQVJs$y7{p9wm(>UF`cTPDU_3)4L54OWiRKX`S){UAeL{KW~ggqS#NUR4A7q|UsJL|*o6YJ46_aQZU`%5DElZ>u^W#t$|Gw1Spm(Y}g)z$cvZNMEdroiJ1?svx?4ipOECs*D#_06tQVi2B zmm3PsiElXB$RzbMM2rQCuq%r%RE8<`+*!Dcd%^NuDSYM24F&7awXq*!lMW)8N!cJ1 zhL224;CBq#jJ*J4Qf1_+9=@+UB{{;syBP_1h~y#@LS+#IMCHvDcqC9(n@|PS_msv+ z4&YhVV{msW0e4Eh=GNLbJWZH$UM(OyI?FgkP=t$3131XqB^X&Sgsv*LBz=sa8=R~p z7s91R(vvYKgMzBB6$&hy3O5jUjs7zXOx>C=42)eJ3L&DPEA|Q-UY56Ha7-(IhcOyY zar7HPGzo^>t!sX0oNn%pJo7T(F^2)Nwj^!lAv zKW9}@R1VjMewcmWxbOtD+_5w==~kI^I_n64XG~g;E#cAYsUb`iti5qAvG-TeI3Npoo{55Kj!v$doBqh{yLezo?uZy#5-9{ur~#4FAE z9$wf^zwoYEuOH%-o%Aa|*7x_1zQ;Se>381jf2iY)r|CBis_*KD?J8b+mVT-BW0lA} zPrvc~`$n51y@nl9ILk zBQdtS&ytj^9UUB0)wVxNlCySn{G(u#BxtQ!ugXfdn_j8vKQx4`&y!?(+c2w4l5p?q z`&Xy-$7fDjLGKG1OBz4PEhnGq1$6Klo zFO#%xWeV{!N$Hj@gD;a*Zs|JvGD+c9eZO840>4a3a?7}GFO!noGArH7G^YJWHsBlmPGO>GZOlGqMRlFqP7jsKu|d%7JZVzqO4)I6wi{Y^ZF=>xJKsGQHA zJ=={UTGbSrLl?W@`Jwx93DS5f9mFXDci{h~0%q?+p&PrW&&71X}#%`&a=_GNFLX}z{D7iKy`&+Rvbxz12h{if4; z-;lu6?(VZ^PoM72kd{uZ-J~I%Wk?KA7z(`j{KfVbtVvX!s{8vIW9qN6ohRmTug`yfG5zDeR<@qJdb0KCPbcF|x#W-55<|%; zKqvgUb>6tj0^}@b1O~)&Z!@xb&!Jbb3u2 zcZsK$BjlA9-?vY$aPwa7%)8Jw8=HC;+|hgzr)}rB_ln~i({W9*EOFmnt5}@yem!r| z`)9{)3R6}u5ehCaB#9|e_3jXjo{?^kN`vP7E4yf)p`iofo+!GEqTS2C{to9#zmu{4 zG(G!sgWc2qw26NaEPpxZb%!`*3Vv(hFcu`m9KP!gZhDhHWKTDzWAkZZgr9TpInF-r z^%G~@NJEVQBvzpj77}%o51?fCOcK^6DA|A_4p&`>5hnx$_%)JJv?>}P@E(g+EHH%i zX2N&bkgVU^xJ19$tL|{)0(I1`w>Ku2-R;N8$4~V+&oWZ)pjnb)EwA#eB`8Aa#muuW z49=D+=6RYRtO8P!9#F20@uX|##y`&{BB~iWb6JX}x2W;anU2sRj_RF#YGzU`)PZ2@ zk1opJ;rQ}&{P`M%%vhZRhcgqT9ih65k{W%jCS8a^_XepELl$0=Mt{=9`Qbse_Q=r0 zW4qwa>kZ~x)B|Px5jkH}JgJ(BXHG=s&QrhQJQdP?ou}f-c`BZ%d2VKQ#^#+FBl?HR zMkTN0FmNokagBQ>q$p0Lt%gpVIY7yf8$2Elqtn+G8g+8hAD{vey1uh2 z(#?dw5pwtXdOW%wqr_3K@?;Z>+Ijy1$;G(WBI&bFDl~h6xg!R&cp+Xyil$N?U5x-C zX#;KjEb-`!)A;}u2?uPE81q`QXEThTvw*~JVJFhLsWmr#=4cALR`WBD$D`?p{a7=R zovZEeX+gj21LJ}mvKJT}L|bP|R!6$Zw``8A<*%?o+36g#-gO%95DKfqcR&3ZcPAlH zaje^UYd*WS?}Z~bgxOdrSRRWzxnWPVRU6cA6wq* zfy;dZR}25_4sN@jCmkped&4d>6PS_Scswfle{&`i!5kVVspurdEH99y+)z!OnY+{| zE9*9Im!Gq?l=Q%^T=j899u0OO>{^Xo8HelcuJn{b(ak12QGRbAf3CRStz1k@k)leFPFe_KAkN_hF$N<+-5|hP6?CmIm8%iV{wh(8jPAL> zh9lDhbbRNQ$c6?`v5f@;ME179Xf_3NfuN?O(PNdkeJXT~f0+Xkcj?`HzSg@S_RkHvJtnkEhsFzbZ z24XhoX5SA9vGHG&;vKViu(gs*Er)65&(a+|${W$sf6B@&Zis!NtK^^sD2vqomwRjAmm_oEM5#UE1+0ZzP3jweb zUCQ`YGmPN^BR(ffh;CwV(`JCx0-nNTa*HVH@@9jGA|qQr|22z+8XYTAc1BjDj?D~Z zhi2J8YT3w{zl4g$Pq`V9`*5909%gd;HS+?Jt;NuN; z!M)#{cTCDLS@4&h%{I0eZm*p*jQbxk(?#9{cdjqTUAT!r^dMnliQ38xc)&_L z)S?);B7u7|Hv`eclinlUxsc}u>eUT=D4aea@bD3C-&xeQWmXMV#uj8=N(hBA9hq=S z4ju6*l-ab5h#GWPU957lYF5#b^2)DIz?!pPugG!={!;h9MzTZA9gN_yb*vqZt6J_I zXxr$jKZUM|PU-z!9D-`4ZN}srIJ@P?57iLG}6IaAXtKUC>>tUk-%3* z7YLIb9wvF)9iMf$Lqj~w+^~Tm0)0!rX`@Fl-Hn5#A>$ft@_Icdpg~vM^BMp)&al z#$0_nsciP9r<(+L+P%gO5G!vWnW`ox9MT(pj9|lG&BlrA3O!V~y6{{Jr?k4EqPf`= zMS+{xA4|&s*4{P6APjXGJlBh1B%3)Ya}mMldzQa2BygoEILH35J4iy)(i;(Q z@1-Wk((nYkjzUdwviOeSC{|=;Be@~_Ox!IwKr&>bEg60-f9se%I&S<>-*1Ie%*D4yE&dC4ycNbU~bj^s;-w3!Q%egR;HP&{zYLe(z*D~ovW)0bz|?) z>t2=E1ya-l%^H8O$DHe!cgF{VMSVpgrA6t9HyqXt~JV-or+b|s%KnSrt2Oc3xO7|FXU9dyLKjgXU6Lle%>>P01T_{S+P$+!ff5m}rdF<7T@c4t!0#6m z#I|C`DP_<+{rH!&^g%UL5jiQW&g2OJQAx%wgr8b*+Gy4lCcB^X) zJf1V+^W`|_6J1nnKG)3BjlHhD7L$>ILs+L?eiT-XB>-!CvrN+IT@z1GT5nPB)3D&lYdl@ahLqPu*0z= zlp#@SmDmGP9I(zXuMGEtXRO&_Vtk$`c5%1IF(yQiVc4?K5r~SplVEZ{C>VMnG>jNH z#DcKFf>~AB$D9=@uJ|uQX|%hNb9!W4j>ZV{oK+mu<%QXOx`B39NnySwGmQ;Cwv55m zU=vx&XlI>!8$NL0JHkcc=U5b)`R?FieJ-{n>1VeiSslSi)^nc)3&6nocu z>odUOZs|!8bNLmzfp$Zc6J!_Q${oX&5jeV2V!G@ta7gTw#JpYiPI>j>Ov)E@2hgfB zmN7sk4H1=OK2|h^Ms~$J!%o1papAZ-{#oSG_7-D42@n2x zQ5el_ajpNfcZMsCsNye-Hn*+u8V-5;lb;2Uxxr=9uYvc?kk<=|sTn*RgQJ4x**GMq z6qttAqS*o}evms5Zl+42y~0F>aYAT}=PHhbBU^`~ptS>N3lbxNEi57J$vkFaPQ6n;LyaY$2BA8!D>(?p| zO24E?EMxTLvbqVb;)=@uXYWn7+d8gw(f@ghHMlvpA#ajuY^PCdT~j1TV~1S`FtU=H zL4hPFAp!v&0F=b!>@n^`+$TIwa=vdiwQ99!NIG_+b8ogOthK6U&6+i9_OooK#SpWY zyEl;TI#2kW*?(rE4U@{vPz)Zm9>!(@LdzvYH{cfYBnh0DiDZ=bx=?8$t63CuML-(z z-mGlMb52QavXAr+HlYx0a4*;dqaN9}PDK66KyTHDMvrs`~ zWSXW3skkK<8C|v_GyJAs57=9|p+E;P0hf1D8Zpn>uM=6Tw+v zz+HMV0bzlv+2BsnCh1_alpb8hKqp59aja#HD70^)Jys7G7T=|Esj~H^$*y@VCQL3t zw08Dqp7dv_AdNkIb}EAT`8!xElmGMo{r}09)Ix&S13G|oROWgXJL+QcmJutDIbR_o zp4;}-cm&*NDF*XqI$w7Ug2Tlo8vdUDMjW+-GB0 zZ8;l>B*KW*CiyUZ`s5iUw@H63L9EyqK^5r1juI^0N3b7Rm=(9eZAY5j!(Z-&a<-d0 zn5vv%HO;7PKFl-gJq@ z%qw9N!b|t{C&3!CZ0gQaCO$8^^V*&5)*)@x79Dth*IT=T?jif9GQpCNHII)U7&Oda z=QuPkle_uoa1T}2D<4^{au7lBGp!DvDPtUl)af$S!^5*5q$gOmR(N=L@FzL6*@DaA z>1i9yPf+0)70S^XMyj4?3b&^(g72a((q8mpw&r;H=3cAaX&y9>^RJdvNB(p*VCiH( z5ALxYCO_`)Q6+&va~@9Sg7OB&LpcS0wyrjHm(+8L7Ba_27ZluzHsTJH1g$^^Z_u~> z7yjzEkNYnY4@uT`v*ETQjQ*aeSQN_p!|R*r-0d9b31D)+WA%L10YR0!$)4s|hR2 z$mu-FgBA#R0JR4A#DzB)jiiYuVl?>TJ2(%B*{>{J@N2v?g%ske`vzsWpNJKNe?2W- zEB93LGsQ00Y9Fru_P5{sZXGWJGMEu;BRRk`8A@8~610=f&iZfF1QYBkF_N*Fke1>R zf_p(JLFQ=5lkEx0E>D(QNS3s^z3k~NC(I1K!Zk}j#E7y zP<{fYOG3HIj-xvFXos7iN?R}?aRsyFjp|dnK6Fhd`Fv2-Jjcy^=!2?f{ug*EguOX` zfisx@hP$kUo4^kQ&%VGs1&BC#%RfQPkgRC~lZ0-ut0I@OJMNEegbnB+ zLm3(~$RLW0MG&c`n~N`+fJRn~%U@tT70|%2G=+t`YHZQ365(aw-(eNJXnsm2a5|h6 z`2dU|0U&tSzIgsc#wK!t3N2(aM~X-KB*7SA>lmH=4L8)n+yESRT|doT*v|Nn+^18y z$qgLPYSpV9T;Z{ou!At=fLBj&wFqCd!3kI}D{*U(Vk!{B&8Yvi@jE3A74)!7T$Nxyx3_9AC1{r2pIm`nYUn@o$W8b~=c7~me2<*z0GX@F+7qm6o&-J?GA>X32=JavZq0}jWy@Q2&z5Y zPYuvhKdR9_`l*#8DLEQEZp2moD;_jiLF}`q| zC#WUDNhF*J`U5iIz&L^wE;j&%<*sOTY)bJNevtuq7E6nvjW`&AnwFlg@WJ9|ihKA^ zVoMKkrUKoZa$(^TDLYz*w6fD;p;Ba~5IvClqdv37QR|U&)}@Y4IxeC*!?+K0gwn|> z7ZGSYL!O2E!Z77`#J|*est^k9aH2HqJ9DNYA>m)_yro2j2-iT-%bq(oR~hz~I%77* z10AXygr5)4=L@M`?=yl~_C(waMFXHBIAxcYi{ANwHWCJt+~t(`xa&GD`Wc=N9_YyU zR5eTZ_dZ5&v40|~6E!WPn%?0S(tSNG(Mf~8${Mg$*OX?Np7t-QUeGwdniqy6WL$zw ziy%Ct)o>cbz?fVI1vPu6up;fjIZUa0}@F4wP*>enwueW2UdXR3t%^Lfpk zR}HVXj5WJH;1EHWb`O1KwEDn?=4tV?Ye`^z57tr%28b-MG&f~D1!;wQuMg5k_i1TN zq(k8YAI<9Cr+x}`S545Ym<&c5@R`@y>`^F^d@9YO&?)Kyw>!KRGL4Q%c<~~}J4G1E z;qfVgSenNO20KMZ?N;aYDMCZG5%jXl57j1cmfFr1H!iW5l3$XPM6w3(&%6sw5{c!U zXCFq^Q$MzjJurx6B@A^Y3Hrs+e_twujJqDjy?1%zvrP&ohVJaS7?Sn=`^=FW%CHSkHfiMl0!(aN-B;@SdE8zF3c9>G~8Eo3Sx&cXUaTVY5_}D z>5Flv*4De5;d|yC$&UyUQb3Z;G-@?;3qi;k$|>|w&td&zAK^(>)!4!>3ZCH!x>Sy# zL9%f+1I`f0CKU=XyCi)h0CzBgt5E}S={N3An4i`i@G?p*2~;H*Z<9*=Au=f>5DrjH zLYIJ-WeKGPN42bnPg4?Z2mQvTqQcbA=46* zNw3hft!1UUBs*eHRgp4#DKw(^85J$7M}SP{Veb?P{%1YN9o4U$j|Mkau!n{hqn%_d zK|Cbmo#9bKoq$vovs7clLQ@?A0;5JGqc|+;eSkDAiW+B|1kF8CqJDS7GI~fE@5?^r z2`weBc+a_QIR!=V&D3rSPLhL!K*K;!-)Wz}jBEXfFDq~0vBSorMhij>rJ#U%4xtV$ z$1mVbpN?2I8;<(>;2l{~#WE3ISjIFq{nuO^2^Dstylfm@FzQ;PmU!%l$PHv~ z*)IC9L{cvJ(MA=DDLKxYCF5U@XwuL|MskkPOiT`q&4xtGP;^7%SHzYjuZG%Q9n&dE`$D@$V|Pw0sV8_SOZb30r4Jogv*XMa3J5p^T>QUInNrPTCt1dAdlou4J5*k zVk((I5(E~uS-4k=fdLB2<4W_2ipV@VtxG+xq>#J)hAqS}$gTz|&U%B<$IKuGNeA10i3UNV zkECKp4D$g)O(jh|N$cE2RATQ7a8-5g4pm5EVj%1HWJxI<~=Oo z)eo&sb8h%w8TLuQ0Mb=vQV+1CgMRAS6jONn+7t#jc;@Z_Z%_rNh7& zQq#$z+!@bc4=PO?dH8C^%E47gyXO?1Y%c}`P24w<&C_mLvM|q*u23rI!i*ZulgMF| zPoUW}t+k@=XL!-~rgJ^`1p{50$W?Hl{N4=Ui-Q`?<3Lu~q{?h4x0h^Na;6dPmI7U9 zlo4{7#-|wb)P{*neEJKFe1eFAI;W4dFV+1>161X7)LGZlOqqac8?H=SRA`;`J+56C z_Tn2Ue-%l|oDGkeso>HiIKy8s7-1G~pW z#td|t9xS1y`KXe5jBQ|nDwP^>cTqKOe8El7@TP;qgQnFTDt&so-`qbuex0xJlMc{+ zebCuttvFU$D<7h{*W5?+R2wgSRsK?om3vy-r=7z;G+9q5Qx_*PR7_k{OYV5(%! zBiyPjglw^X8b-@h`AJ8^{d>CKYVU7$wpdB)H|1k(pB(MAwl+J>)6Gujxb^a+Lwse5 z6Qx7`_sPK@PB(WDF?PCrxOHj^$NRr49~^+9_>)DJ9XEIIChB&VuIc0e<;hwH&24*~ zud=dQ$?}hzTPMfu)}NZWkt=p+6I%#aCA^KJR_xKs&22&Gsli#XM=w!1?f7+W=8Am^ z7%fEE*&G!+hh00`+uQ;!i29=zp|03IY{|7wl zt?kXuCQ3_fQ9Q*5¬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

    PUQd=6Q`X4 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

    >OvwU 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

    -;DUe(8pJ_E6rOLUqr-nWx}-H*D%DXds`8*GlK; ze8i9Uq4k!QSu`qto9V_fTErb@Ch`+OL_{ld&SN8mxF^QRy`B-=vLf#{n>s7(W0W zYaS-_2w-<5j8+4^v|8YuOSG)9-#Ew}$>%~XpWvGy@93rHO7T^t* zh9{wGa`iMT9BEqYw6xZ@w5%fZsOGD_ztZ`7r`^bTgS8R_03-AI7nA0fVIaDx_-U7k zQ&OqIBatS2q=jJ8k^1q4SBCp8@wub3zx>mY!j`& zu+||pv?!oPCTjfgZ-}yCQ+^_KxoZ9d9(xHOr_0; zbCIqt-$iTg^M~~#O;IvS!~ERs8lFi!WXtRw=qbi}OpOrbsHBxdax=b|O9hu09&okw zx)NVu^Nph%&o={%P(XZh;(8Wrk9~q7!b5DMEvP#yc-ZMH{| zb#b>=S1EkLWdb*6OIC+Oyt70ER+*Pplg)hZ;LDatER)0~!C1V$aDcLq-*?d}C_qMV z6I~0Lb`pe5xXP$z5Cg%A!f4Mb^~c0f3IVy2WV~R{$aWSaW#`y<7OJybM@P0r9)7UG zPQ;4FH$rOnB&a+X?-Dd7VMr})%p%EX8Kswed&w5$a)=YO?lw+rBN1$s&3oE0Gf5(Z zj+Cs3lVPUG@Og^5axl9L3uZRXqty(e6ukHPWSJk7@db&|zynVPL~3w={S^R_T48R( zY!*#fW={QP(ol1Wc-Q8A?)G*WZcMwJ1O95{$(DG(#B>XdhAkj8ldhk`T(Tl9lJu{z zlvhg*%I7+z_hKw3gOmILM$-O$a*{zxO2TiwIiMBwLDv^K$KtpVh4LJJLX3qKD^9Oa z9`N})XWSw!L4$EXU``@EkkSZTd%T z{CQ>hFXfm2R#CZQ53>jbxjr0I&2fTiq19VRvxv@NK*i9@#Exv6+AU6DHP-bW@u!3k zs+x}h$o<{aUkU?{iqU$D+7=-XyKm7^&|et;MAd*~4I(^+)`kXM+%{7^^du` ze|&QP5B%@LM}PSIzMI`0q>LC3Uk+TdbY9z|!ctPgG$F;I5L&AWi-A=WxZ~SsBg7IF z<`#5E9H7O75|0!C$U7$puAogW`K@EIM4+$3afUyamLze%PZ<==10EYr~`YpZFh*@aomqYinP3I<1#$+fK4l z;8I6I8F4J0%B(JMFcqW@9YK~l?;TPd*jP)#FQO(#i+F(yk)Jv&twtCw?IVr~nCK2~ zu>hcq$>Ozoh7`Y7GZwppCvygS6o=l&11O%+0}>o<6djEIJQ zqGd=EWPFVbf6s30-Dc4u*aIGi+|Y26BFPh$JXp!Qu+$woon2
  • lDYG# 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

    ad7cYmzcr*Ww- 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/sebastian/global-state/src/Blacklist.php b/vendor/sebastian/global-state/src/Blacklist.php deleted file mode 100644 index ce8f25c..0000000 --- a/vendor/sebastian/global-state/src/Blacklist.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -/** - * A blacklist for global state elements that should not be snapshotted. - */ -final class Blacklist -{ - /** - * @var array - */ - private $globalVariables = []; - - /** - * @var string[] - */ - private $classes = []; - - /** - * @var string[] - */ - private $classNamePrefixes = []; - - /** - * @var string[] - */ - private $parentClasses = []; - - /** - * @var string[] - */ - private $interfaces = []; - - /** - * @var array - */ - private $staticAttributes = []; - - public function addGlobalVariable(string $variableName): void - { - $this->globalVariables[$variableName] = true; - } - - public function addClass(string $className): void - { - $this->classes[] = $className; - } - - public function addSubclassesOf(string $className): void - { - $this->parentClasses[] = $className; - } - - public function addImplementorsOf(string $interfaceName): void - { - $this->interfaces[] = $interfaceName; - } - - public function addClassNamePrefix(string $classNamePrefix): void - { - $this->classNamePrefixes[] = $classNamePrefix; - } - - public function addStaticAttribute(string $className, string $attributeName): void - { - if (!isset($this->staticAttributes[$className])) { - $this->staticAttributes[$className] = []; - } - - $this->staticAttributes[$className][$attributeName] = true; - } - - public function isGlobalVariableBlacklisted(string $variableName): bool - { - return isset($this->globalVariables[$variableName]); - } - - public function isStaticAttributeBlacklisted(string $className, string $attributeName): bool - { - if (\in_array($className, $this->classes)) { - return true; - } - - foreach ($this->classNamePrefixes as $prefix) { - if (\strpos($className, $prefix) === 0) { - return true; - } - } - - $class = new \ReflectionClass($className); - - foreach ($this->parentClasses as $type) { - if ($class->isSubclassOf($type)) { - return true; - } - } - - foreach ($this->interfaces as $type) { - if ($class->implementsInterface($type)) { - return true; - } - } - - if (isset($this->staticAttributes[$className][$attributeName])) { - return true; - } - - return false; - } -} diff --git a/vendor/sebastian/global-state/src/CodeExporter.php b/vendor/sebastian/global-state/src/CodeExporter.php deleted file mode 100644 index 860457b..0000000 --- a/vendor/sebastian/global-state/src/CodeExporter.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -/** - * Exports parts of a Snapshot as PHP code. - */ -final class CodeExporter -{ - public function constants(Snapshot $snapshot): string - { - $result = ''; - - foreach ($snapshot->constants() as $name => $value) { - $result .= \sprintf( - 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", - $name, - $name, - $this->exportVariable($value) - ); - } - - return $result; - } - - public function globalVariables(Snapshot $snapshot): string - { - $result = '$GLOBALS = [];' . \PHP_EOL; - - foreach ($snapshot->globalVariables() as $name => $value) { - $result .= \sprintf( - '$GLOBALS[%s] = %s;' . \PHP_EOL, - $this->exportVariable($name), - $this->exportVariable($value) - ); - } - - return $result; - } - - public function iniSettings(Snapshot $snapshot): string - { - $result = ''; - - foreach ($snapshot->iniSettings() as $key => $value) { - $result .= \sprintf( - '@ini_set(%s, %s);' . "\n", - $this->exportVariable($key), - $this->exportVariable($value) - ); - } - - return $result; - } - - private function exportVariable($variable): string - { - if (\is_scalar($variable) || null === $variable || - (\is_array($variable) && $this->arrayOnlyContainsScalars($variable))) { - return \var_export($variable, true); - } - - return 'unserialize(' . \var_export(\serialize($variable), true) . ')'; - } - - private function arrayOnlyContainsScalars(array $array): bool - { - $result = true; - - foreach ($array as $element) { - if (\is_array($element)) { - $result = $this->arrayOnlyContainsScalars($element); - } elseif (!\is_scalar($element) && null !== $element) { - $result = false; - } - - if ($result === false) { - break; - } - } - - return $result; - } -} diff --git a/vendor/sebastian/global-state/src/Restorer.php b/vendor/sebastian/global-state/src/Restorer.php deleted file mode 100644 index ed55d9f..0000000 --- a/vendor/sebastian/global-state/src/Restorer.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -/** - * Restorer of snapshots of global state. - */ -class Restorer -{ - /** - * Deletes function definitions that are not defined in a snapshot. - * - * @throws RuntimeException when the uopz_delete() function is not available - * - * @see https://github.com/krakjoe/uopz - */ - public function restoreFunctions(Snapshot $snapshot): void - { - if (!\function_exists('uopz_delete')) { - throw new RuntimeException('The uopz_delete() function is required for this operation'); - } - - $functions = \get_defined_functions(); - - foreach (\array_diff($functions['user'], $snapshot->functions()) as $function) { - uopz_delete($function); - } - } - - /** - * Restores all global and super-global variables from a snapshot. - */ - public function restoreGlobalVariables(Snapshot $snapshot): void - { - $superGlobalArrays = $snapshot->superGlobalArrays(); - - foreach ($superGlobalArrays as $superGlobalArray) { - $this->restoreSuperGlobalArray($snapshot, $superGlobalArray); - } - - $globalVariables = $snapshot->globalVariables(); - - foreach (\array_keys($GLOBALS) as $key) { - if ($key !== 'GLOBALS' && - !\in_array($key, $superGlobalArrays) && - !$snapshot->blacklist()->isGlobalVariableBlacklisted($key)) { - if (\array_key_exists($key, $globalVariables)) { - $GLOBALS[$key] = $globalVariables[$key]; - } else { - unset($GLOBALS[$key]); - } - } - } - } - - /** - * Restores all static attributes in user-defined classes from this snapshot. - */ - public function restoreStaticAttributes(Snapshot $snapshot): void - { - $current = new Snapshot($snapshot->blacklist(), false, false, false, false, true, false, false, false, false); - $newClasses = \array_diff($current->classes(), $snapshot->classes()); - - unset($current); - - foreach ($snapshot->staticAttributes() as $className => $staticAttributes) { - foreach ($staticAttributes as $name => $value) { - $reflector = new \ReflectionProperty($className, $name); - $reflector->setAccessible(true); - $reflector->setValue($value); - } - } - - foreach ($newClasses as $className) { - $class = new \ReflectionClass($className); - $defaults = $class->getDefaultProperties(); - - foreach ($class->getProperties() as $attribute) { - if (!$attribute->isStatic()) { - continue; - } - - $name = $attribute->getName(); - - if ($snapshot->blacklist()->isStaticAttributeBlacklisted($className, $name)) { - continue; - } - - if (!isset($defaults[$name])) { - continue; - } - - $attribute->setAccessible(true); - $attribute->setValue($defaults[$name]); - } - } - } - - /** - * Restores a super-global variable array from this snapshot. - */ - private function restoreSuperGlobalArray(Snapshot $snapshot, string $superGlobalArray): void - { - $superGlobalVariables = $snapshot->superGlobalVariables(); - - if (isset($GLOBALS[$superGlobalArray]) && - \is_array($GLOBALS[$superGlobalArray]) && - isset($superGlobalVariables[$superGlobalArray])) { - $keys = \array_keys( - \array_merge( - $GLOBALS[$superGlobalArray], - $superGlobalVariables[$superGlobalArray] - ) - ); - - foreach ($keys as $key) { - if (isset($superGlobalVariables[$superGlobalArray][$key])) { - $GLOBALS[$superGlobalArray][$key] = $superGlobalVariables[$superGlobalArray][$key]; - } else { - unset($GLOBALS[$superGlobalArray][$key]); - } - } - } - } -} diff --git a/vendor/sebastian/global-state/src/Snapshot.php b/vendor/sebastian/global-state/src/Snapshot.php deleted file mode 100644 index d66d590..0000000 --- a/vendor/sebastian/global-state/src/Snapshot.php +++ /dev/null @@ -1,415 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -use SebastianBergmann\ObjectReflector\ObjectReflector; -use SebastianBergmann\RecursionContext\Context; - -/** - * A snapshot of global state. - */ -class Snapshot -{ - /** - * @var Blacklist - */ - private $blacklist; - - /** - * @var array - */ - private $globalVariables = []; - - /** - * @var array - */ - private $superGlobalArrays = []; - - /** - * @var array - */ - private $superGlobalVariables = []; - - /** - * @var array - */ - private $staticAttributes = []; - - /** - * @var array - */ - private $iniSettings = []; - - /** - * @var array - */ - private $includedFiles = []; - - /** - * @var array - */ - private $constants = []; - - /** - * @var array - */ - private $functions = []; - - /** - * @var array - */ - private $interfaces = []; - - /** - * @var array - */ - private $classes = []; - - /** - * @var array - */ - private $traits = []; - - /** - * Creates a snapshot of the current global state. - */ - public function __construct(Blacklist $blacklist = null, bool $includeGlobalVariables = true, bool $includeStaticAttributes = true, bool $includeConstants = true, bool $includeFunctions = true, bool $includeClasses = true, bool $includeInterfaces = true, bool $includeTraits = true, bool $includeIniSettings = true, bool $includeIncludedFiles = true) - { - $this->blacklist = $blacklist ?: new Blacklist; - - if ($includeConstants) { - $this->snapshotConstants(); - } - - if ($includeFunctions) { - $this->snapshotFunctions(); - } - - if ($includeClasses || $includeStaticAttributes) { - $this->snapshotClasses(); - } - - if ($includeInterfaces) { - $this->snapshotInterfaces(); - } - - if ($includeGlobalVariables) { - $this->setupSuperGlobalArrays(); - $this->snapshotGlobals(); - } - - if ($includeStaticAttributes) { - $this->snapshotStaticAttributes(); - } - - if ($includeIniSettings) { - $this->iniSettings = \ini_get_all(null, false); - } - - if ($includeIncludedFiles) { - $this->includedFiles = \get_included_files(); - } - - $this->traits = \get_declared_traits(); - } - - public function blacklist(): Blacklist - { - return $this->blacklist; - } - - public function globalVariables(): array - { - return $this->globalVariables; - } - - public function superGlobalVariables(): array - { - return $this->superGlobalVariables; - } - - public function superGlobalArrays(): array - { - return $this->superGlobalArrays; - } - - public function staticAttributes(): array - { - return $this->staticAttributes; - } - - public function iniSettings(): array - { - return $this->iniSettings; - } - - public function includedFiles(): array - { - return $this->includedFiles; - } - - public function constants(): array - { - return $this->constants; - } - - public function functions(): array - { - return $this->functions; - } - - public function interfaces(): array - { - return $this->interfaces; - } - - public function classes(): array - { - return $this->classes; - } - - public function traits(): array - { - return $this->traits; - } - - /** - * Creates a snapshot user-defined constants. - */ - private function snapshotConstants(): void - { - $constants = \get_defined_constants(true); - - if (isset($constants['user'])) { - $this->constants = $constants['user']; - } - } - - /** - * Creates a snapshot user-defined functions. - */ - private function snapshotFunctions(): void - { - $functions = \get_defined_functions(); - - $this->functions = $functions['user']; - } - - /** - * Creates a snapshot user-defined classes. - */ - private function snapshotClasses(): void - { - foreach (\array_reverse(\get_declared_classes()) as $className) { - $class = new \ReflectionClass($className); - - if (!$class->isUserDefined()) { - break; - } - - $this->classes[] = $className; - } - - $this->classes = \array_reverse($this->classes); - } - - /** - * Creates a snapshot user-defined interfaces. - */ - private function snapshotInterfaces(): void - { - foreach (\array_reverse(\get_declared_interfaces()) as $interfaceName) { - $class = new \ReflectionClass($interfaceName); - - if (!$class->isUserDefined()) { - break; - } - - $this->interfaces[] = $interfaceName; - } - - $this->interfaces = \array_reverse($this->interfaces); - } - - /** - * Creates a snapshot of all global and super-global variables. - */ - private function snapshotGlobals(): void - { - $superGlobalArrays = $this->superGlobalArrays(); - - foreach ($superGlobalArrays as $superGlobalArray) { - $this->snapshotSuperGlobalArray($superGlobalArray); - } - - foreach (\array_keys($GLOBALS) as $key) { - if ($key !== 'GLOBALS' && - !\in_array($key, $superGlobalArrays) && - $this->canBeSerialized($GLOBALS[$key]) && - !$this->blacklist->isGlobalVariableBlacklisted($key)) { - /* @noinspection UnserializeExploitsInspection */ - $this->globalVariables[$key] = \unserialize(\serialize($GLOBALS[$key])); - } - } - } - - /** - * Creates a snapshot a super-global variable array. - */ - private function snapshotSuperGlobalArray(string $superGlobalArray): void - { - $this->superGlobalVariables[$superGlobalArray] = []; - - if (isset($GLOBALS[$superGlobalArray]) && \is_array($GLOBALS[$superGlobalArray])) { - foreach ($GLOBALS[$superGlobalArray] as $key => $value) { - /* @noinspection UnserializeExploitsInspection */ - $this->superGlobalVariables[$superGlobalArray][$key] = \unserialize(\serialize($value)); - } - } - } - - /** - * Creates a snapshot of all static attributes in user-defined classes. - */ - private function snapshotStaticAttributes(): void - { - foreach ($this->classes as $className) { - $class = new \ReflectionClass($className); - $snapshot = []; - - foreach ($class->getProperties() as $attribute) { - if ($attribute->isStatic()) { - $name = $attribute->getName(); - - if ($this->blacklist->isStaticAttributeBlacklisted($className, $name)) { - continue; - } - - $attribute->setAccessible(true); - $value = $attribute->getValue(); - - if ($this->canBeSerialized($value)) { - /* @noinspection UnserializeExploitsInspection */ - $snapshot[$name] = \unserialize(\serialize($value)); - } - } - } - - if (!empty($snapshot)) { - $this->staticAttributes[$className] = $snapshot; - } - } - } - - /** - * Returns a list of all super-global variable arrays. - */ - private function setupSuperGlobalArrays(): void - { - $this->superGlobalArrays = [ - '_ENV', - '_POST', - '_GET', - '_COOKIE', - '_SERVER', - '_FILES', - '_REQUEST', - ]; - } - - private function canBeSerialized($variable): bool - { - if (\is_scalar($variable) || $variable === null) { - return true; - } - - if (\is_resource($variable)) { - return false; - } - - foreach ($this->enumerateObjectsAndResources($variable) as $value) { - if (\is_resource($value)) { - return false; - } - - if (\is_object($value)) { - $class = new \ReflectionClass($value); - - if ($class->isAnonymous()) { - return false; - } - - try { - @\serialize($value); - } catch (\Throwable $t) { - return false; - } - } - } - - return true; - } - - private function enumerateObjectsAndResources($variable): array - { - if (isset(\func_get_args()[1])) { - $processed = \func_get_args()[1]; - } else { - $processed = new Context; - } - - $result = []; - - if ($processed->contains($variable)) { - return $result; - } - - $array = $variable; - $processed->add($variable); - - if (\is_array($variable)) { - foreach ($array as $element) { - if (!\is_array($element) && !\is_object($element) && !\is_resource($element)) { - continue; - } - - if (!\is_resource($element)) { - /** @noinspection SlowArrayOperationsInLoopInspection */ - $result = \array_merge( - $result, - $this->enumerateObjectsAndResources($element, $processed) - ); - } else { - $result[] = $element; - } - } - } else { - $result[] = $variable; - - foreach ((new ObjectReflector)->getAttributes($variable) as $value) { - if (!\is_array($value) && !\is_object($value) && !\is_resource($value)) { - continue; - } - - if (!\is_resource($value)) { - /** @noinspection SlowArrayOperationsInLoopInspection */ - $result = \array_merge( - $result, - $this->enumerateObjectsAndResources($value, $processed) - ); - } else { - $result[] = $value; - } - } - } - - return $result; - } -} diff --git a/vendor/sebastian/global-state/src/exceptions/Exception.php b/vendor/sebastian/global-state/src/exceptions/Exception.php deleted file mode 100644 index d8fd3c3..0000000 --- a/vendor/sebastian/global-state/src/exceptions/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -interface Exception -{ -} diff --git a/vendor/sebastian/global-state/src/exceptions/RuntimeException.php b/vendor/sebastian/global-state/src/exceptions/RuntimeException.php deleted file mode 100644 index 79f02a1..0000000 --- a/vendor/sebastian/global-state/src/exceptions/RuntimeException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/sebastian/global-state/tests/BlacklistTest.php b/vendor/sebastian/global-state/tests/BlacklistTest.php deleted file mode 100644 index 4d1b64d..0000000 --- a/vendor/sebastian/global-state/tests/BlacklistTest.php +++ /dev/null @@ -1,117 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -use PHPUnit\Framework\TestCase; -use SebastianBergmann\GlobalState\TestFixture\BlacklistedChildClass; -use SebastianBergmann\GlobalState\TestFixture\BlacklistedClass; -use SebastianBergmann\GlobalState\TestFixture\BlacklistedImplementor; -use SebastianBergmann\GlobalState\TestFixture\BlacklistedInterface; - -/** - * @covers \SebastianBergmann\GlobalState\Blacklist - */ -final class BlacklistTest extends TestCase -{ - /** - * @var \SebastianBergmann\GlobalState\Blacklist - */ - private $blacklist; - - protected function setUp(): void - { - $this->blacklist = new Blacklist; - } - - public function testGlobalVariableThatIsNotBlacklistedIsNotTreatedAsBlacklisted(): void - { - $this->assertFalse($this->blacklist->isGlobalVariableBlacklisted('variable')); - } - - public function testGlobalVariableCanBeBlacklisted(): void - { - $this->blacklist->addGlobalVariable('variable'); - - $this->assertTrue($this->blacklist->isGlobalVariableBlacklisted('variable')); - } - - public function testStaticAttributeThatIsNotBlacklistedIsNotTreatedAsBlacklisted(): void - { - $this->assertFalse( - $this->blacklist->isStaticAttributeBlacklisted( - BlacklistedClass::class, - 'attribute' - ) - ); - } - - public function testClassCanBeBlacklisted(): void - { - $this->blacklist->addClass(BlacklistedClass::class); - - $this->assertTrue( - $this->blacklist->isStaticAttributeBlacklisted( - BlacklistedClass::class, - 'attribute' - ) - ); - } - - public function testSubclassesCanBeBlacklisted(): void - { - $this->blacklist->addSubclassesOf(BlacklistedClass::class); - - $this->assertTrue( - $this->blacklist->isStaticAttributeBlacklisted( - BlacklistedChildClass::class, - 'attribute' - ) - ); - } - - public function testImplementorsCanBeBlacklisted(): void - { - $this->blacklist->addImplementorsOf(BlacklistedInterface::class); - - $this->assertTrue( - $this->blacklist->isStaticAttributeBlacklisted( - BlacklistedImplementor::class, - 'attribute' - ) - ); - } - - public function testClassNamePrefixesCanBeBlacklisted(): void - { - $this->blacklist->addClassNamePrefix('SebastianBergmann\GlobalState'); - - $this->assertTrue( - $this->blacklist->isStaticAttributeBlacklisted( - BlacklistedClass::class, - 'attribute' - ) - ); - } - - public function testStaticAttributeCanBeBlacklisted(): void - { - $this->blacklist->addStaticAttribute( - BlacklistedClass::class, - 'attribute' - ); - - $this->assertTrue( - $this->blacklist->isStaticAttributeBlacklisted( - BlacklistedClass::class, - 'attribute' - ) - ); - } -} diff --git a/vendor/sebastian/global-state/tests/CodeExporterTest.php b/vendor/sebastian/global-state/tests/CodeExporterTest.php deleted file mode 100644 index 88789fa..0000000 --- a/vendor/sebastian/global-state/tests/CodeExporterTest.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \SebastianBergmann\GlobalState\CodeExporter - */ -final class CodeExporterTest extends TestCase -{ - /** - * @runInSeparateProcess - */ - public function testCanExportGlobalVariablesToCode(): void - { - $GLOBALS = ['foo' => 'bar']; - - $snapshot = new Snapshot(null, true, false, false, false, false, false, false, false, false); - - $exporter = new CodeExporter; - - $this->assertEquals( - '$GLOBALS = [];' . \PHP_EOL . '$GLOBALS[\'foo\'] = \'bar\';' . \PHP_EOL, - $exporter->globalVariables($snapshot) - ); - } - - /** - * @runInSeparateProcess - */ - public function testCanExportIniSettingsToCode(): void - { - $iniSettingName = 'display_errors'; - ini_set($iniSettingName, '1'); - $iniValue = ini_get($iniSettingName); - - $snapshot = new Snapshot(null, false, false, false, false, false, false, false, true, false); - - $exporter = new CodeExporter; - $export = $exporter->iniSettings($snapshot); - - $pattern = "/@ini_set\(\'$iniSettingName\', \'$iniValue\'\);/"; - - $this->assertRegExp( - $pattern, - $export - ); - } - - /** - * @runInSeparateProcess - */ - public function testCanExportConstantsToCode(): void - { - define('FOO', 'BAR'); - - $snapshot = new Snapshot(null, false, false, true, false, false, false, false, false, false); - - $exporter = new CodeExporter; - - $this->assertStringContainsString( - "if (!defined('FOO')) define('FOO', 'BAR');", - $exporter->constants($snapshot) - ); - } -} diff --git a/vendor/sebastian/global-state/tests/RestorerTest.php b/vendor/sebastian/global-state/tests/RestorerTest.php deleted file mode 100644 index 6dcb94e..0000000 --- a/vendor/sebastian/global-state/tests/RestorerTest.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \SebastianBergmann\GlobalState\Restorer - * - * @uses \SebastianBergmann\GlobalState\Blacklist - * @uses \SebastianBergmann\GlobalState\Snapshot - */ -final class RestorerTest extends TestCase -{ - public static function setUpBeforeClass(): void - { - $GLOBALS['varBool'] = false; - $GLOBALS['varNull'] = null; - $_GET['varGet'] = 0; - } - - public function testRestorerGlobalVariable(): void - { - $snapshot = new Snapshot(null, true, false, false, false, false, false, false, false, false); - $restorer = new Restorer; - $restorer->restoreGlobalVariables($snapshot); - - $this->assertArrayHasKey('varBool', $GLOBALS); - $this->assertEquals(false, $GLOBALS['varBool']); - $this->assertArrayHasKey('varNull', $GLOBALS); - $this->assertEquals(null, $GLOBALS['varNull']); - $this->assertArrayHasKey('varGet', $_GET); - $this->assertEquals(0, $_GET['varGet']); - } - - /** - * @backupGlobals enabled - */ - public function testIntegrationRestorerGlobalVariables(): void - { - $this->assertArrayHasKey('varBool', $GLOBALS); - $this->assertEquals(false, $GLOBALS['varBool']); - $this->assertArrayHasKey('varNull', $GLOBALS); - $this->assertEquals(null, $GLOBALS['varNull']); - $this->assertArrayHasKey('varGet', $_GET); - $this->assertEquals(0, $_GET['varGet']); - } - - /** - * @depends testIntegrationRestorerGlobalVariables - */ - public function testIntegrationRestorerGlobalVariables2(): void - { - $this->assertArrayHasKey('varBool', $GLOBALS); - $this->assertEquals(false, $GLOBALS['varBool']); - $this->assertArrayHasKey('varNull', $GLOBALS); - $this->assertEquals(null, $GLOBALS['varNull']); - $this->assertArrayHasKey('varGet', $_GET); - $this->assertEquals(0, $_GET['varGet']); - } -} diff --git a/vendor/sebastian/global-state/tests/SnapshotTest.php b/vendor/sebastian/global-state/tests/SnapshotTest.php deleted file mode 100644 index 6bfe58f..0000000 --- a/vendor/sebastian/global-state/tests/SnapshotTest.php +++ /dev/null @@ -1,167 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -use PHPUnit\Framework\TestCase; -use SebastianBergmann\GlobalState\TestFixture\BlacklistedInterface; -use SebastianBergmann\GlobalState\TestFixture\SnapshotClass; -use SebastianBergmann\GlobalState\TestFixture\SnapshotTrait; - -/** - * @covers \SebastianBergmann\GlobalState\Snapshot - * - * @uses \SebastianBergmann\GlobalState\Blacklist - */ -final class SnapshotTest extends TestCase -{ - /** - * @var Blacklist - */ - private $blacklist; - - protected function setUp(): void - { - $this->blacklist = new Blacklist; - } - - public function testStaticAttributes(): void - { - SnapshotClass::init(); - - $this->blacklistAllLoadedClassesExceptSnapshotClass(); - - $snapshot = new Snapshot($this->blacklist, false, true, false, false, false, false, false, false, false); - - $expected = [ - SnapshotClass::class => [ - 'string' => 'string', - 'objects' => [new \stdClass], - ], - ]; - - $this->assertEquals($expected, $snapshot->staticAttributes()); - } - - public function testConstructorExcludesAspectsWhenTheyShouldNotBeIncluded(): void - { - $snapshot = new Snapshot( - $this->blacklist, - false, - false, - false, - false, - false, - false, - false, - false, - false - ); - - $this->assertEmpty($snapshot->constants()); - $this->assertEmpty($snapshot->functions()); - $this->assertEmpty($snapshot->globalVariables()); - $this->assertEmpty($snapshot->includedFiles()); - $this->assertEmpty($snapshot->iniSettings()); - $this->assertEmpty($snapshot->interfaces()); - $this->assertEmpty($snapshot->staticAttributes()); - $this->assertEmpty($snapshot->superGlobalArrays()); - $this->assertEmpty($snapshot->superGlobalVariables()); - $this->assertEmpty($snapshot->traits()); - } - - public function testBlacklistCanBeAccessed(): void - { - $snapshot = new Snapshot( - $this->blacklist, - false, - false, - true, - false, - false, - false, - false, - false, - false - ); - - $this->assertSame($this->blacklist, $snapshot->blacklist()); - } - - public function testConstants(): void - { - $snapshot = new Snapshot($this->blacklist, false, false, true, false, false, false, false, false, false); - - $this->assertArrayHasKey('GLOBALSTATE_TESTSUITE', $snapshot->constants()); - } - - public function testFunctions(): void - { - $snapshot = new Snapshot($this->blacklist, false, false, false, true, false, false, false, false, false); - $functions = $snapshot->functions(); - - $this->assertContains('sebastianbergmann\globalstate\testfixture\snapshotfunction', $functions); - $this->assertNotContains('assert', $functions); - } - - public function testClasses(): void - { - $snapshot = new Snapshot($this->blacklist, false, false, false, false, true, false, false, false, false); - $classes = $snapshot->classes(); - - $this->assertContains(TestCase::class, $classes); - $this->assertNotContains(Exception::class, $classes); - } - - public function testInterfaces(): void - { - $this->blacklist->addClass(BlacklistedInterface::class); - - $snapshot = new Snapshot($this->blacklist, false, false, false, false, false, true, false, false, false); - $interfaces = $snapshot->interfaces(); - - $this->assertContains(BlacklistedInterface::class, $interfaces); - $this->assertNotContains(\Countable::class, $interfaces); - } - - public function testTraits(): void - { - \spl_autoload_call('SebastianBergmann\GlobalState\TestFixture\SnapshotTrait'); - - $snapshot = new Snapshot($this->blacklist, false, false, false, false, false, false, true, false, false); - - $this->assertContains(SnapshotTrait::class, $snapshot->traits()); - } - - public function testIniSettings(): void - { - $snapshot = new Snapshot($this->blacklist, false, false, false, false, false, false, false, true, false); - $iniSettings = $snapshot->iniSettings(); - - $this->assertArrayHasKey('date.timezone', $iniSettings); - $this->assertEquals('Etc/UTC', $iniSettings['date.timezone']); - } - - public function testIncludedFiles(): void - { - $snapshot = new Snapshot($this->blacklist, false, false, false, false, false, false, false, false, true); - $this->assertContains(__FILE__, $snapshot->includedFiles()); - } - - private function blacklistAllLoadedClassesExceptSnapshotClass(): void - { - foreach (\get_declared_classes() as $class) { - if ($class === SnapshotClass::class) { - continue; - } - - $this->blacklist->addClass($class); - } - } -} diff --git a/vendor/sebastian/global-state/tests/_fixture/BlacklistedChildClass.php b/vendor/sebastian/global-state/tests/_fixture/BlacklistedChildClass.php deleted file mode 100644 index 585c396..0000000 --- a/vendor/sebastian/global-state/tests/_fixture/BlacklistedChildClass.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState\TestFixture; - -class BlacklistedChildClass extends BlacklistedClass -{ -} diff --git a/vendor/sebastian/global-state/tests/_fixture/BlacklistedClass.php b/vendor/sebastian/global-state/tests/_fixture/BlacklistedClass.php deleted file mode 100644 index c1dc259..0000000 --- a/vendor/sebastian/global-state/tests/_fixture/BlacklistedClass.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState\TestFixture; - -class BlacklistedClass -{ - private static $attribute; -} diff --git a/vendor/sebastian/global-state/tests/_fixture/BlacklistedImplementor.php b/vendor/sebastian/global-state/tests/_fixture/BlacklistedImplementor.php deleted file mode 100644 index c42751e..0000000 --- a/vendor/sebastian/global-state/tests/_fixture/BlacklistedImplementor.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState\TestFixture; - -class BlacklistedImplementor implements BlacklistedInterface -{ - private static $attribute; -} diff --git a/vendor/sebastian/global-state/tests/_fixture/BlacklistedInterface.php b/vendor/sebastian/global-state/tests/_fixture/BlacklistedInterface.php deleted file mode 100644 index f531a3a..0000000 --- a/vendor/sebastian/global-state/tests/_fixture/BlacklistedInterface.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState\TestFixture; - -interface BlacklistedInterface -{ -} diff --git a/vendor/sebastian/global-state/tests/_fixture/SnapshotClass.php b/vendor/sebastian/global-state/tests/_fixture/SnapshotClass.php deleted file mode 100644 index bf3305d..0000000 --- a/vendor/sebastian/global-state/tests/_fixture/SnapshotClass.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState\TestFixture; - -class SnapshotClass -{ - private static $string = 'string'; - - private static $closures = []; - - private static $files = []; - - private static $resources = []; - - private static $objects = []; - - public static function init(): void - { - self::$closures[] = function (): void { - }; - - self::$files[] = new \SplFileInfo(__FILE__); - - self::$resources[] = \fopen('php://memory', 'r'); - - self::$objects[] = new \stdClass; - } -} diff --git a/vendor/sebastian/global-state/tests/_fixture/SnapshotDomDocument.php b/vendor/sebastian/global-state/tests/_fixture/SnapshotDomDocument.php deleted file mode 100644 index 42eafd0..0000000 --- a/vendor/sebastian/global-state/tests/_fixture/SnapshotDomDocument.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState\TestFixture; - -use DomDocument; - -class SnapshotDomDocument extends DomDocument -{ -} diff --git a/vendor/sebastian/global-state/tests/_fixture/SnapshotFunctions.php b/vendor/sebastian/global-state/tests/_fixture/SnapshotFunctions.php deleted file mode 100644 index b3e8d00..0000000 --- a/vendor/sebastian/global-state/tests/_fixture/SnapshotFunctions.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState\TestFixture; - -function snapshotFunction(): void -{ -} diff --git a/vendor/sebastian/global-state/tests/_fixture/SnapshotTrait.php b/vendor/sebastian/global-state/tests/_fixture/SnapshotTrait.php deleted file mode 100644 index c3490a6..0000000 --- a/vendor/sebastian/global-state/tests/_fixture/SnapshotTrait.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState\TestFixture; - -trait SnapshotTrait -{ -} diff --git a/vendor/sebastian/object-enumerator/.gitattributes b/vendor/sebastian/object-enumerator/.gitattributes deleted file mode 100644 index 57afb81..0000000 --- a/vendor/sebastian/object-enumerator/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -/.github export-ignore -/.phive export-ignore -/.php_cs.dist export-ignore -/build.xml export-ignore -/psalm.xml export-ignore -/tests export-ignore -/tools export-ignore -/tools/* binary - -*.php diff=php diff --git a/vendor/sebastian/object-enumerator/.gitignore b/vendor/sebastian/object-enumerator/.gitignore deleted file mode 100644 index 96c0f28..0000000 --- a/vendor/sebastian/object-enumerator/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/.idea -/.php_cs -/.php_cs.cache -/.phpunit.result.cache -/composer.lock -/vendor diff --git a/vendor/sebastian/object-enumerator/ChangeLog.md b/vendor/sebastian/object-enumerator/ChangeLog.md deleted file mode 100644 index dfbaa41..0000000 --- a/vendor/sebastian/object-enumerator/ChangeLog.md +++ /dev/null @@ -1,74 +0,0 @@ -# Change Log - -All notable changes to `sebastianbergmann/object-enumerator` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [4.0.2] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [4.0.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## [4.0.0] - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 7.0, PHP 7.1, and PHP 7.2 - -## [3.0.3] - 2017-08-03 - -### Changed - -* Bumped required version of `sebastian/object-reflector` - -## [3.0.2] - 2017-03-12 - -### Changed - -* `sebastian/object-reflector` is now a dependency - -## [3.0.1] - 2017-03-12 - -### Fixed - -* Objects aggregated in inherited attributes are not enumerated - -## [3.0.0] - 2017-03-03 - -### Removed - -* This component is no longer supported on PHP 5.6 - -## [2.0.1] - 2017-02-18 - -### Fixed - -* Fixed [#2](https://github.com/sebastianbergmann/phpunit/pull/2): Exceptions in `ReflectionProperty::getValue()` are not handled - -## [2.0.0] - 2016-11-19 - -### Changed - -* This component is now compatible with `sebastian/recursion-context: ~1.0.4` - -## 1.0.0 - 2016-02-04 - -### Added - -* Initial release - -[4.0.2]: https://github.com/sebastianbergmann/object-enumerator/compare/4.0.1...4.0.2 -[4.0.1]: https://github.com/sebastianbergmann/object-enumerator/compare/4.0.0...4.0.1 -[4.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.3...4.0.0 -[3.0.3]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.2...3.0.3 -[3.0.2]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/2.0...3.0.0 -[2.0.1]: https://github.com/sebastianbergmann/object-enumerator/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/1.0...2.0.0 - diff --git a/vendor/sebastian/object-enumerator/LICENSE b/vendor/sebastian/object-enumerator/LICENSE deleted file mode 100644 index 1389ad3..0000000 --- a/vendor/sebastian/object-enumerator/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -Object Enumerator - -Copyright (c) 2016-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/object-enumerator/README.md b/vendor/sebastian/object-enumerator/README.md deleted file mode 100644 index afca017..0000000 --- a/vendor/sebastian/object-enumerator/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# sebastian/object-enumerator - -[![CI Status](https://github.com/sebastianbergmann/object-enumerator/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/object-enumerator/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/object-enumerator/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/object-enumerator) - -Traverses array structures and object graphs to enumerate all referenced objects. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/object-enumerator -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/object-enumerator -``` diff --git a/vendor/sebastian/object-enumerator/composer.json b/vendor/sebastian/object-enumerator/composer.json deleted file mode 100644 index c5b3db1..0000000 --- a/vendor/sebastian/object-enumerator/composer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "sebastian/object-enumerator", - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "prefer-stable": true, - "config": { - "optimize-autoloader": true, - "sort-packages": true - }, - "require": { - "php": "^7.3 || ^8.0", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_fixture/" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - } -} diff --git a/vendor/sebastian/object-enumerator/phpunit.xml b/vendor/sebastian/object-enumerator/phpunit.xml deleted file mode 100644 index e0ce8df..0000000 --- a/vendor/sebastian/object-enumerator/phpunit.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - tests - - - - - src - - - diff --git a/vendor/sebastian/object-enumerator/src/Enumerator.php b/vendor/sebastian/object-enumerator/src/Enumerator.php deleted file mode 100644 index de75d17..0000000 --- a/vendor/sebastian/object-enumerator/src/Enumerator.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\ObjectEnumerator; - -use function array_merge; -use function func_get_args; -use function is_array; -use function is_object; -use SebastianBergmann\ObjectReflector\ObjectReflector; -use SebastianBergmann\RecursionContext\Context; - -/** - * Traverses array structures and object graphs - * to enumerate all referenced objects. - */ -class Enumerator -{ - /** - * Returns an array of all objects referenced either - * directly or indirectly by a variable. - * - * @param array|object $variable - * - * @return object[] - */ - public function enumerate($variable) - { - if (!is_array($variable) && !is_object($variable)) { - throw new InvalidArgumentException; - } - - if (isset(func_get_args()[1])) { - if (!func_get_args()[1] instanceof Context) { - throw new InvalidArgumentException; - } - - $processed = func_get_args()[1]; - } else { - $processed = new Context; - } - - $objects = []; - - if ($processed->contains($variable)) { - return $objects; - } - - $array = $variable; - $processed->add($variable); - - if (is_array($variable)) { - foreach ($array as $element) { - if (!is_array($element) && !is_object($element)) { - continue; - } - - $objects = array_merge( - $objects, - $this->enumerate($element, $processed) - ); - } - } else { - $objects[] = $variable; - - $reflector = new ObjectReflector; - - foreach ($reflector->getAttributes($variable) as $value) { - if (!is_array($value) && !is_object($value)) { - continue; - } - - $objects = array_merge( - $objects, - $this->enumerate($value, $processed) - ); - } - } - - return $objects; - } -} diff --git a/vendor/sebastian/object-enumerator/src/Exception.php b/vendor/sebastian/object-enumerator/src/Exception.php deleted file mode 100644 index 9c45bdc..0000000 --- a/vendor/sebastian/object-enumerator/src/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\ObjectEnumerator; - -interface Exception -{ -} diff --git a/vendor/sebastian/object-enumerator/src/InvalidArgumentException.php b/vendor/sebastian/object-enumerator/src/InvalidArgumentException.php deleted file mode 100644 index ce2037c..0000000 --- a/vendor/sebastian/object-enumerator/src/InvalidArgumentException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\ObjectEnumerator; - -class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/sebastian/object-reflector/.gitattributes b/vendor/sebastian/object-reflector/.gitattributes deleted file mode 100644 index ecc5fb8..0000000 --- a/vendor/sebastian/object-reflector/.gitattributes +++ /dev/null @@ -1,11 +0,0 @@ -/.github export-ignore -/.phive export-ignore -/.php_cs.dist export-ignore -/build.xml export-ignore -/phpunit.xml export-ignore -/psalm.xml export-ignore -/tests export-ignore -/tools export-ignore -/tools/* binary - -*.php diff=php diff --git a/vendor/sebastian/object-reflector/.gitignore b/vendor/sebastian/object-reflector/.gitignore deleted file mode 100644 index 96c0f28..0000000 --- a/vendor/sebastian/object-reflector/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/.idea -/.php_cs -/.php_cs.cache -/.phpunit.result.cache -/composer.lock -/vendor diff --git a/vendor/sebastian/object-reflector/ChangeLog.md b/vendor/sebastian/object-reflector/ChangeLog.md deleted file mode 100644 index 7b0170d..0000000 --- a/vendor/sebastian/object-reflector/ChangeLog.md +++ /dev/null @@ -1,41 +0,0 @@ -# Change Log - -All notable changes to `sebastianbergmann/object-reflector` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [2.0.2] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [2.0.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## [2.0.0] - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 7.0, PHP 7.1, and PHP 7.2 - -## [1.1.1] - 2017-03-29 - -* Fixed [#1](https://github.com/sebastianbergmann/object-reflector/issues/1): Attributes with non-string names are not handled correctly - -## [1.1.0] - 2017-03-16 - -### Changed - -* Changed implementation of `ObjectReflector::getattributes()` to use `(array)` cast instead of `ReflectionObject` - -## 1.0.0 - 2017-03-12 - -* Initial release - -[2.0.2]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/object-reflector/compare/1.1.1...2.0.0 -[1.1.1]: https://github.com/sebastianbergmann/object-reflector/compare/1.1.0...1.1.1 -[1.1.0]: https://github.com/sebastianbergmann/object-reflector/compare/1.0.0...1.1.0 diff --git a/vendor/sebastian/object-reflector/LICENSE b/vendor/sebastian/object-reflector/LICENSE deleted file mode 100644 index a80c161..0000000 --- a/vendor/sebastian/object-reflector/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -Object Reflector - -Copyright (c) 2017-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/object-reflector/README.md b/vendor/sebastian/object-reflector/README.md deleted file mode 100644 index b7d5ae9..0000000 --- a/vendor/sebastian/object-reflector/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# sebastian/object-reflector - -[![CI Status](https://github.com/sebastianbergmann/object-reflector/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/object-reflector/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/object-reflector/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/object-reflector) - -Allows reflection of object attributes, including inherited and non-public ones. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/object-reflector -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/object-reflector -``` diff --git a/vendor/sebastian/object-reflector/composer.json b/vendor/sebastian/object-reflector/composer.json deleted file mode 100644 index 3950a61..0000000 --- a/vendor/sebastian/object-reflector/composer.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "sebastian/object-reflector", - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "prefer-stable": true, - "config": { - "platform": { - "php": "7.3.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_fixture/" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - } -} diff --git a/vendor/sebastian/object-reflector/src/Exception.php b/vendor/sebastian/object-reflector/src/Exception.php deleted file mode 100644 index 34e976e..0000000 --- a/vendor/sebastian/object-reflector/src/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\ObjectReflector; - -interface Exception -{ -} diff --git a/vendor/sebastian/object-reflector/src/InvalidArgumentException.php b/vendor/sebastian/object-reflector/src/InvalidArgumentException.php deleted file mode 100644 index 34b4cca..0000000 --- a/vendor/sebastian/object-reflector/src/InvalidArgumentException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\ObjectReflector; - -class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/sebastian/object-reflector/src/ObjectReflector.php b/vendor/sebastian/object-reflector/src/ObjectReflector.php deleted file mode 100644 index 4abb5f5..0000000 --- a/vendor/sebastian/object-reflector/src/ObjectReflector.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\ObjectReflector; - -use function count; -use function explode; -use function get_class; -use function is_object; - -class ObjectReflector -{ - /** - * @param object $object - * - * @throws InvalidArgumentException - */ - public function getAttributes($object): array - { - if (!is_object($object)) { - throw new InvalidArgumentException; - } - - $attributes = []; - $className = get_class($object); - - foreach ((array) $object as $name => $value) { - $name = explode("\0", (string) $name); - - if (count($name) === 1) { - $name = $name[0]; - } else { - if ($name[1] !== $className) { - $name = $name[1] . '::' . $name[2]; - } else { - $name = $name[2]; - } - } - - $attributes[$name] = $value; - } - - return $attributes; - } -} diff --git a/vendor/sebastian/recursion-context/.gitattributes b/vendor/sebastian/recursion-context/.gitattributes deleted file mode 100644 index ecc5fb8..0000000 --- a/vendor/sebastian/recursion-context/.gitattributes +++ /dev/null @@ -1,11 +0,0 @@ -/.github export-ignore -/.phive export-ignore -/.php_cs.dist export-ignore -/build.xml export-ignore -/phpunit.xml export-ignore -/psalm.xml export-ignore -/tests export-ignore -/tools export-ignore -/tools/* binary - -*.php diff=php diff --git a/vendor/sebastian/recursion-context/.gitignore b/vendor/sebastian/recursion-context/.gitignore deleted file mode 100644 index a34073c..0000000 --- a/vendor/sebastian/recursion-context/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/.idea -/composer.lock -/vendor -/.php_cs.cache -/.phpunit.result.cache diff --git a/vendor/sebastian/recursion-context/ChangeLog.md b/vendor/sebastian/recursion-context/ChangeLog.md deleted file mode 100644 index 4f1821c..0000000 --- a/vendor/sebastian/recursion-context/ChangeLog.md +++ /dev/null @@ -1,18 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [4.0.2] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [4.0.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -[4.0.2]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.1...4.0.2 -[4.0.1]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.0...4.0.1 diff --git a/vendor/sebastian/recursion-context/LICENSE b/vendor/sebastian/recursion-context/LICENSE deleted file mode 100644 index 0faffbb..0000000 --- a/vendor/sebastian/recursion-context/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -Recursion Context - -Copyright (c) 2002-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/recursion-context/README.md b/vendor/sebastian/recursion-context/README.md deleted file mode 100644 index 8e4d2a0..0000000 --- a/vendor/sebastian/recursion-context/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# sebastian/recursion-context - -[![CI Status](https://github.com/sebastianbergmann/recursion-context/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/recursion-context/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/recursion-context/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/recursion-context) - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/recursion-context -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/recursion-context -``` diff --git a/vendor/sebastian/recursion-context/composer.json b/vendor/sebastian/recursion-context/composer.json deleted file mode 100644 index 291ed5b..0000000 --- a/vendor/sebastian/recursion-context/composer.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "sebastian/recursion-context", - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "prefer-stable": true, - "config": { - "platform": { - "php": "7.3.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - } -} diff --git a/vendor/sebastian/recursion-context/src/Context.php b/vendor/sebastian/recursion-context/src/Context.php deleted file mode 100644 index 1548046..0000000 --- a/vendor/sebastian/recursion-context/src/Context.php +++ /dev/null @@ -1,178 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\RecursionContext; - -use const PHP_INT_MAX; -use const PHP_INT_MIN; -use function array_pop; -use function array_slice; -use function count; -use function is_array; -use function is_object; -use function random_int; -use function spl_object_hash; -use SplObjectStorage; - -/** - * A context containing previously processed arrays and objects - * when recursively processing a value. - */ -final class Context -{ - /** - * @var array[] - */ - private $arrays; - - /** - * @var SplObjectStorage - */ - private $objects; - - /** - * Initialises the context. - */ - public function __construct() - { - $this->arrays = []; - $this->objects = new SplObjectStorage; - } - - /** - * @codeCoverageIgnore - */ - public function __destruct() - { - foreach ($this->arrays as &$array) { - if (is_array($array)) { - array_pop($array); - array_pop($array); - } - } - } - - /** - * Adds a value to the context. - * - * @param array|object $value the value to add - * - * @throws InvalidArgumentException Thrown if $value is not an array or object - * - * @return bool|int|string the ID of the stored value, either as a string or integer - */ - public function add(&$value) - { - if (is_array($value)) { - return $this->addArray($value); - } - - if (is_object($value)) { - return $this->addObject($value); - } - - throw new InvalidArgumentException( - 'Only arrays and objects are supported' - ); - } - - /** - * Checks if the given value exists within the context. - * - * @param array|object $value the value to check - * - * @throws InvalidArgumentException Thrown if $value is not an array or object - * - * @return false|int|string the string or integer ID of the stored value if it has already been seen, or false if the value is not stored - */ - public function contains(&$value) - { - if (is_array($value)) { - return $this->containsArray($value); - } - - if (is_object($value)) { - return $this->containsObject($value); - } - - throw new InvalidArgumentException( - 'Only arrays and objects are supported' - ); - } - - /** - * @return bool|int - */ - private function addArray(array &$array) - { - $key = $this->containsArray($array); - - if ($key !== false) { - return $key; - } - - $key = count($this->arrays); - $this->arrays[] = &$array; - - if (!isset($array[PHP_INT_MAX]) && !isset($array[PHP_INT_MAX - 1])) { - $array[] = $key; - $array[] = $this->objects; - } else { /* cover the improbable case too */ - do { - $key = random_int(PHP_INT_MIN, PHP_INT_MAX); - } while (isset($array[$key])); - - $array[$key] = $key; - - do { - $key = random_int(PHP_INT_MIN, PHP_INT_MAX); - } while (isset($array[$key])); - - $array[$key] = $this->objects; - } - - return $key; - } - - /** - * @param object $object - */ - private function addObject($object): string - { - if (!$this->objects->contains($object)) { - $this->objects->attach($object); - } - - return spl_object_hash($object); - } - - /** - * @return false|int - */ - private function containsArray(array &$array) - { - $end = array_slice($array, -2); - - return isset($end[1]) && $end[1] === $this->objects ? $end[0] : false; - } - - /** - * @param object $value - * - * @return false|string - */ - private function containsObject($value) - { - if ($this->objects->contains($value)) { - return spl_object_hash($value); - } - - return false; - } -} diff --git a/vendor/sebastian/recursion-context/src/Exception.php b/vendor/sebastian/recursion-context/src/Exception.php deleted file mode 100644 index 375b239..0000000 --- a/vendor/sebastian/recursion-context/src/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\RecursionContext; - -interface Exception -{ -} diff --git a/vendor/sebastian/recursion-context/src/InvalidArgumentException.php b/vendor/sebastian/recursion-context/src/InvalidArgumentException.php deleted file mode 100644 index 627c8bd..0000000 --- a/vendor/sebastian/recursion-context/src/InvalidArgumentException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\RecursionContext; - -final class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/sebastian/resource-operations/.gitattributes b/vendor/sebastian/resource-operations/.gitattributes deleted file mode 100644 index 85e55eb..0000000 --- a/vendor/sebastian/resource-operations/.gitattributes +++ /dev/null @@ -1,7 +0,0 @@ -/.github export-ignore -/.php_cs.dist export-ignore -/build.xml export-ignore -/phpunit.xml export-ignore -/tests export-ignore - -*.php diff=php diff --git a/vendor/sebastian/resource-operations/.gitignore b/vendor/sebastian/resource-operations/.gitignore deleted file mode 100644 index a086c78..0000000 --- a/vendor/sebastian/resource-operations/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/.idea -/.php_cs.cache -/build/FunctionSignatureMap.php -/composer.lock -/vendor -/.phpunit.result.cache diff --git a/vendor/sebastian/resource-operations/ChangeLog.md b/vendor/sebastian/resource-operations/ChangeLog.md deleted file mode 100644 index ece39f5..0000000 --- a/vendor/sebastian/resource-operations/ChangeLog.md +++ /dev/null @@ -1,47 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [3.0.2] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [3.0.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## [3.0.0] - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 7.1 and PHP 7.2 - -## [2.0.1] - 2018-10-04 - -### Fixed - -* Functions and methods with nullable parameters of type `resource` are now also considered - -## [2.0.0] - 2018-09-27 - -### Changed - -* [FunctionSignatureMap.php](https://raw.githubusercontent.com/phan/phan/master/src/Phan/Language/Internal/FunctionSignatureMap.php) from `phan/phan` is now used instead of [arginfo.php](https://raw.githubusercontent.com/rlerdorf/phan/master/includes/arginfo.php) from `rlerdorf/phan` - -### Removed - -* This component is no longer supported on PHP 5.6 and PHP 7.0 - -## 1.0.0 - 2015-07-28 - -* Initial release - -[3.0.2]: https://github.com/sebastianbergmann/comparator/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/comparator/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/comparator/compare/2.0.1...3.0.0 -[2.0.1]: https://github.com/sebastianbergmann/comparator/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/comparator/compare/1.0.0...2.0.0 diff --git a/vendor/sebastian/resource-operations/LICENSE b/vendor/sebastian/resource-operations/LICENSE deleted file mode 100644 index dccd6b0..0000000 --- a/vendor/sebastian/resource-operations/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -Resource Operations - -Copyright (c) 2015-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/resource-operations/README.md b/vendor/sebastian/resource-operations/README.md deleted file mode 100644 index 88b05cc..0000000 --- a/vendor/sebastian/resource-operations/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Resource Operations - -Provides a list of PHP built-in functions that operate on resources. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require sebastian/resource-operations - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev sebastian/resource-operations - diff --git a/vendor/sebastian/resource-operations/build/generate.php b/vendor/sebastian/resource-operations/build/generate.php deleted file mode 100755 index 0354dc4..0000000 --- a/vendor/sebastian/resource-operations/build/generate.php +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env php - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -$functions = require __DIR__ . '/FunctionSignatureMap.php'; -$resourceFunctions = []; - -foreach ($functions as $function => $arguments) { - foreach ($arguments as $argument) { - if (strpos($argument, '?') === 0) { - $argument = substr($argument, 1); - } - - if ($argument === 'resource') { - $resourceFunctions[] = explode('\'', $function)[0]; - } - } -} - -$resourceFunctions = array_unique($resourceFunctions); -sort($resourceFunctions); - -$buffer = << - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\ResourceOperations; - -final class ResourceOperations -{ - /** - * @return string[] - */ - public static function getFunctions(): array - { - return [ - -EOT; - -foreach ($resourceFunctions as $function) { - $buffer .= sprintf(" '%s',\n", $function); -} - -$buffer .= <<< EOT - ]; - } -} - -EOT; - -file_put_contents(__DIR__ . '/../src/ResourceOperations.php', $buffer); - diff --git a/vendor/sebastian/resource-operations/composer.json b/vendor/sebastian/resource-operations/composer.json deleted file mode 100644 index eec7247..0000000 --- a/vendor/sebastian/resource-operations/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "sebastian/resource-operations", - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "prefer-stable": true, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "config": { - "platform": { - "php": "7.3.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - } -} - diff --git a/vendor/sebastian/resource-operations/src/ResourceOperations.php b/vendor/sebastian/resource-operations/src/ResourceOperations.php deleted file mode 100644 index f3911f3..0000000 --- a/vendor/sebastian/resource-operations/src/ResourceOperations.php +++ /dev/null @@ -1,2232 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\ResourceOperations; - -final class ResourceOperations -{ - /** - * @return string[] - */ - public static function getFunctions(): array - { - return [ - 'Directory::close', - 'Directory::read', - 'Directory::rewind', - 'DirectoryIterator::openFile', - 'FilesystemIterator::openFile', - 'Gmagick::readimagefile', - 'HttpResponse::getRequestBodyStream', - 'HttpResponse::getStream', - 'HttpResponse::setStream', - 'Imagick::pingImageFile', - 'Imagick::readImageFile', - 'Imagick::writeImageFile', - 'Imagick::writeImagesFile', - 'MongoGridFSCursor::__construct', - 'MongoGridFSFile::getResource', - 'MysqlndUhConnection::stmtInit', - 'MysqlndUhConnection::storeResult', - 'MysqlndUhConnection::useResult', - 'PDF_activate_item', - 'PDF_add_launchlink', - 'PDF_add_locallink', - 'PDF_add_nameddest', - 'PDF_add_note', - 'PDF_add_pdflink', - 'PDF_add_table_cell', - 'PDF_add_textflow', - 'PDF_add_thumbnail', - 'PDF_add_weblink', - 'PDF_arc', - 'PDF_arcn', - 'PDF_attach_file', - 'PDF_begin_document', - 'PDF_begin_font', - 'PDF_begin_glyph', - 'PDF_begin_item', - 'PDF_begin_layer', - 'PDF_begin_page', - 'PDF_begin_page_ext', - 'PDF_begin_pattern', - 'PDF_begin_template', - 'PDF_begin_template_ext', - 'PDF_circle', - 'PDF_clip', - 'PDF_close', - 'PDF_close_image', - 'PDF_close_pdi', - 'PDF_close_pdi_page', - 'PDF_closepath', - 'PDF_closepath_fill_stroke', - 'PDF_closepath_stroke', - 'PDF_concat', - 'PDF_continue_text', - 'PDF_create_3dview', - 'PDF_create_action', - 'PDF_create_annotation', - 'PDF_create_bookmark', - 'PDF_create_field', - 'PDF_create_fieldgroup', - 'PDF_create_gstate', - 'PDF_create_pvf', - 'PDF_create_textflow', - 'PDF_curveto', - 'PDF_define_layer', - 'PDF_delete', - 'PDF_delete_pvf', - 'PDF_delete_table', - 'PDF_delete_textflow', - 'PDF_encoding_set_char', - 'PDF_end_document', - 'PDF_end_font', - 'PDF_end_glyph', - 'PDF_end_item', - 'PDF_end_layer', - 'PDF_end_page', - 'PDF_end_page_ext', - 'PDF_end_pattern', - 'PDF_end_template', - 'PDF_endpath', - 'PDF_fill', - 'PDF_fill_imageblock', - 'PDF_fill_pdfblock', - 'PDF_fill_stroke', - 'PDF_fill_textblock', - 'PDF_findfont', - 'PDF_fit_image', - 'PDF_fit_pdi_page', - 'PDF_fit_table', - 'PDF_fit_textflow', - 'PDF_fit_textline', - 'PDF_get_apiname', - 'PDF_get_buffer', - 'PDF_get_errmsg', - 'PDF_get_errnum', - 'PDF_get_parameter', - 'PDF_get_pdi_parameter', - 'PDF_get_pdi_value', - 'PDF_get_value', - 'PDF_info_font', - 'PDF_info_matchbox', - 'PDF_info_table', - 'PDF_info_textflow', - 'PDF_info_textline', - 'PDF_initgraphics', - 'PDF_lineto', - 'PDF_load_3ddata', - 'PDF_load_font', - 'PDF_load_iccprofile', - 'PDF_load_image', - 'PDF_makespotcolor', - 'PDF_moveto', - 'PDF_new', - 'PDF_open_ccitt', - 'PDF_open_file', - 'PDF_open_image', - 'PDF_open_image_file', - 'PDF_open_memory_image', - 'PDF_open_pdi', - 'PDF_open_pdi_document', - 'PDF_open_pdi_page', - 'PDF_pcos_get_number', - 'PDF_pcos_get_stream', - 'PDF_pcos_get_string', - 'PDF_place_image', - 'PDF_place_pdi_page', - 'PDF_process_pdi', - 'PDF_rect', - 'PDF_restore', - 'PDF_resume_page', - 'PDF_rotate', - 'PDF_save', - 'PDF_scale', - 'PDF_set_border_color', - 'PDF_set_border_dash', - 'PDF_set_border_style', - 'PDF_set_gstate', - 'PDF_set_info', - 'PDF_set_layer_dependency', - 'PDF_set_parameter', - 'PDF_set_text_pos', - 'PDF_set_value', - 'PDF_setcolor', - 'PDF_setdash', - 'PDF_setdashpattern', - 'PDF_setflat', - 'PDF_setfont', - 'PDF_setgray', - 'PDF_setgray_fill', - 'PDF_setgray_stroke', - 'PDF_setlinecap', - 'PDF_setlinejoin', - 'PDF_setlinewidth', - 'PDF_setmatrix', - 'PDF_setmiterlimit', - 'PDF_setrgbcolor', - 'PDF_setrgbcolor_fill', - 'PDF_setrgbcolor_stroke', - 'PDF_shading', - 'PDF_shading_pattern', - 'PDF_shfill', - 'PDF_show', - 'PDF_show_boxed', - 'PDF_show_xy', - 'PDF_skew', - 'PDF_stringwidth', - 'PDF_stroke', - 'PDF_suspend_page', - 'PDF_translate', - 'PDF_utf16_to_utf8', - 'PDF_utf32_to_utf16', - 'PDF_utf8_to_utf16', - 'PDO::pgsqlLOBOpen', - 'RarEntry::getStream', - 'SQLite3::openBlob', - 'SWFMovie::saveToFile', - 'SplFileInfo::openFile', - 'SplFileObject::openFile', - 'SplTempFileObject::openFile', - 'V8Js::compileString', - 'V8Js::executeScript', - 'Vtiful\Kernel\Excel::setColumn', - 'Vtiful\Kernel\Excel::setRow', - 'Vtiful\Kernel\Format::align', - 'Vtiful\Kernel\Format::bold', - 'Vtiful\Kernel\Format::italic', - 'Vtiful\Kernel\Format::underline', - 'XMLWriter::openMemory', - 'XMLWriter::openURI', - 'ZipArchive::getStream', - 'Zookeeper::setLogStream', - 'apc_bin_dumpfile', - 'apc_bin_loadfile', - 'bbcode_add_element', - 'bbcode_add_smiley', - 'bbcode_create', - 'bbcode_destroy', - 'bbcode_parse', - 'bbcode_set_arg_parser', - 'bbcode_set_flags', - 'bcompiler_read', - 'bcompiler_write_class', - 'bcompiler_write_constant', - 'bcompiler_write_exe_footer', - 'bcompiler_write_file', - 'bcompiler_write_footer', - 'bcompiler_write_function', - 'bcompiler_write_functions_from_file', - 'bcompiler_write_header', - 'bcompiler_write_included_filename', - 'bzclose', - 'bzerrno', - 'bzerror', - 'bzerrstr', - 'bzflush', - 'bzopen', - 'bzread', - 'bzwrite', - 'cairo_surface_write_to_png', - 'closedir', - 'copy', - 'crack_closedict', - 'crack_opendict', - 'cubrid_bind', - 'cubrid_close_prepare', - 'cubrid_close_request', - 'cubrid_col_get', - 'cubrid_col_size', - 'cubrid_column_names', - 'cubrid_column_types', - 'cubrid_commit', - 'cubrid_connect', - 'cubrid_connect_with_url', - 'cubrid_current_oid', - 'cubrid_db_parameter', - 'cubrid_disconnect', - 'cubrid_drop', - 'cubrid_fetch', - 'cubrid_free_result', - 'cubrid_get', - 'cubrid_get_autocommit', - 'cubrid_get_charset', - 'cubrid_get_class_name', - 'cubrid_get_db_parameter', - 'cubrid_get_query_timeout', - 'cubrid_get_server_info', - 'cubrid_insert_id', - 'cubrid_is_instance', - 'cubrid_lob2_bind', - 'cubrid_lob2_close', - 'cubrid_lob2_export', - 'cubrid_lob2_import', - 'cubrid_lob2_new', - 'cubrid_lob2_read', - 'cubrid_lob2_seek', - 'cubrid_lob2_seek64', - 'cubrid_lob2_size', - 'cubrid_lob2_size64', - 'cubrid_lob2_tell', - 'cubrid_lob2_tell64', - 'cubrid_lob2_write', - 'cubrid_lob_export', - 'cubrid_lob_get', - 'cubrid_lob_send', - 'cubrid_lob_size', - 'cubrid_lock_read', - 'cubrid_lock_write', - 'cubrid_move_cursor', - 'cubrid_next_result', - 'cubrid_num_cols', - 'cubrid_num_rows', - 'cubrid_pconnect', - 'cubrid_pconnect_with_url', - 'cubrid_prepare', - 'cubrid_put', - 'cubrid_query', - 'cubrid_rollback', - 'cubrid_schema', - 'cubrid_seq_add', - 'cubrid_seq_drop', - 'cubrid_seq_insert', - 'cubrid_seq_put', - 'cubrid_set_add', - 'cubrid_set_autocommit', - 'cubrid_set_db_parameter', - 'cubrid_set_drop', - 'cubrid_set_query_timeout', - 'cubrid_unbuffered_query', - 'curl_close', - 'curl_copy_handle', - 'curl_errno', - 'curl_error', - 'curl_escape', - 'curl_exec', - 'curl_getinfo', - 'curl_multi_add_handle', - 'curl_multi_close', - 'curl_multi_errno', - 'curl_multi_exec', - 'curl_multi_getcontent', - 'curl_multi_info_read', - 'curl_multi_remove_handle', - 'curl_multi_select', - 'curl_multi_setopt', - 'curl_pause', - 'curl_reset', - 'curl_setopt', - 'curl_setopt_array', - 'curl_share_close', - 'curl_share_errno', - 'curl_share_init', - 'curl_share_setopt', - 'curl_unescape', - 'cyrus_authenticate', - 'cyrus_bind', - 'cyrus_close', - 'cyrus_connect', - 'cyrus_query', - 'cyrus_unbind', - 'db2_autocommit', - 'db2_bind_param', - 'db2_client_info', - 'db2_close', - 'db2_column_privileges', - 'db2_columns', - 'db2_commit', - 'db2_conn_error', - 'db2_conn_errormsg', - 'db2_connect', - 'db2_cursor_type', - 'db2_exec', - 'db2_execute', - 'db2_fetch_array', - 'db2_fetch_assoc', - 'db2_fetch_both', - 'db2_fetch_object', - 'db2_fetch_row', - 'db2_field_display_size', - 'db2_field_name', - 'db2_field_num', - 'db2_field_precision', - 'db2_field_scale', - 'db2_field_type', - 'db2_field_width', - 'db2_foreign_keys', - 'db2_free_result', - 'db2_free_stmt', - 'db2_get_option', - 'db2_last_insert_id', - 'db2_lob_read', - 'db2_next_result', - 'db2_num_fields', - 'db2_num_rows', - 'db2_pclose', - 'db2_pconnect', - 'db2_prepare', - 'db2_primary_keys', - 'db2_procedure_columns', - 'db2_procedures', - 'db2_result', - 'db2_rollback', - 'db2_server_info', - 'db2_set_option', - 'db2_special_columns', - 'db2_statistics', - 'db2_stmt_error', - 'db2_stmt_errormsg', - 'db2_table_privileges', - 'db2_tables', - 'dba_close', - 'dba_delete', - 'dba_exists', - 'dba_fetch', - 'dba_firstkey', - 'dba_insert', - 'dba_nextkey', - 'dba_open', - 'dba_optimize', - 'dba_popen', - 'dba_replace', - 'dba_sync', - 'dbplus_add', - 'dbplus_aql', - 'dbplus_close', - 'dbplus_curr', - 'dbplus_find', - 'dbplus_first', - 'dbplus_flush', - 'dbplus_freelock', - 'dbplus_freerlocks', - 'dbplus_getlock', - 'dbplus_getunique', - 'dbplus_info', - 'dbplus_last', - 'dbplus_lockrel', - 'dbplus_next', - 'dbplus_open', - 'dbplus_prev', - 'dbplus_rchperm', - 'dbplus_rcreate', - 'dbplus_rcrtexact', - 'dbplus_rcrtlike', - 'dbplus_restorepos', - 'dbplus_rkeys', - 'dbplus_ropen', - 'dbplus_rquery', - 'dbplus_rrename', - 'dbplus_rsecindex', - 'dbplus_runlink', - 'dbplus_rzap', - 'dbplus_savepos', - 'dbplus_setindex', - 'dbplus_setindexbynumber', - 'dbplus_sql', - 'dbplus_tremove', - 'dbplus_undo', - 'dbplus_undoprepare', - 'dbplus_unlockrel', - 'dbplus_unselect', - 'dbplus_update', - 'dbplus_xlockrel', - 'dbplus_xunlockrel', - 'deflate_add', - 'dio_close', - 'dio_fcntl', - 'dio_open', - 'dio_read', - 'dio_seek', - 'dio_stat', - 'dio_tcsetattr', - 'dio_truncate', - 'dio_write', - 'dir', - 'eio_busy', - 'eio_cancel', - 'eio_chmod', - 'eio_chown', - 'eio_close', - 'eio_custom', - 'eio_dup2', - 'eio_fallocate', - 'eio_fchmod', - 'eio_fchown', - 'eio_fdatasync', - 'eio_fstat', - 'eio_fstatvfs', - 'eio_fsync', - 'eio_ftruncate', - 'eio_futime', - 'eio_get_last_error', - 'eio_grp', - 'eio_grp_add', - 'eio_grp_cancel', - 'eio_grp_limit', - 'eio_link', - 'eio_lstat', - 'eio_mkdir', - 'eio_mknod', - 'eio_nop', - 'eio_open', - 'eio_read', - 'eio_readahead', - 'eio_readdir', - 'eio_readlink', - 'eio_realpath', - 'eio_rename', - 'eio_rmdir', - 'eio_seek', - 'eio_sendfile', - 'eio_stat', - 'eio_statvfs', - 'eio_symlink', - 'eio_sync', - 'eio_sync_file_range', - 'eio_syncfs', - 'eio_truncate', - 'eio_unlink', - 'eio_utime', - 'eio_write', - 'enchant_broker_describe', - 'enchant_broker_dict_exists', - 'enchant_broker_free', - 'enchant_broker_free_dict', - 'enchant_broker_get_dict_path', - 'enchant_broker_get_error', - 'enchant_broker_init', - 'enchant_broker_list_dicts', - 'enchant_broker_request_dict', - 'enchant_broker_request_pwl_dict', - 'enchant_broker_set_dict_path', - 'enchant_broker_set_ordering', - 'enchant_dict_add_to_personal', - 'enchant_dict_add_to_session', - 'enchant_dict_check', - 'enchant_dict_describe', - 'enchant_dict_get_error', - 'enchant_dict_is_in_session', - 'enchant_dict_quick_check', - 'enchant_dict_store_replacement', - 'enchant_dict_suggest', - 'event_add', - 'event_base_free', - 'event_base_loop', - 'event_base_loopbreak', - 'event_base_loopexit', - 'event_base_new', - 'event_base_priority_init', - 'event_base_reinit', - 'event_base_set', - 'event_buffer_base_set', - 'event_buffer_disable', - 'event_buffer_enable', - 'event_buffer_fd_set', - 'event_buffer_free', - 'event_buffer_new', - 'event_buffer_priority_set', - 'event_buffer_read', - 'event_buffer_set_callback', - 'event_buffer_timeout_set', - 'event_buffer_watermark_set', - 'event_buffer_write', - 'event_del', - 'event_free', - 'event_new', - 'event_priority_set', - 'event_set', - 'event_timer_add', - 'event_timer_del', - 'event_timer_pending', - 'event_timer_set', - 'expect_expectl', - 'expect_popen', - 'fam_cancel_monitor', - 'fam_close', - 'fam_monitor_collection', - 'fam_monitor_directory', - 'fam_monitor_file', - 'fam_next_event', - 'fam_open', - 'fam_pending', - 'fam_resume_monitor', - 'fam_suspend_monitor', - 'fann_cascadetrain_on_data', - 'fann_cascadetrain_on_file', - 'fann_clear_scaling_params', - 'fann_copy', - 'fann_create_from_file', - 'fann_create_shortcut_array', - 'fann_create_standard', - 'fann_create_standard_array', - 'fann_create_train', - 'fann_create_train_from_callback', - 'fann_descale_input', - 'fann_descale_output', - 'fann_descale_train', - 'fann_destroy', - 'fann_destroy_train', - 'fann_duplicate_train_data', - 'fann_get_MSE', - 'fann_get_activation_function', - 'fann_get_activation_steepness', - 'fann_get_bias_array', - 'fann_get_bit_fail', - 'fann_get_bit_fail_limit', - 'fann_get_cascade_activation_functions', - 'fann_get_cascade_activation_functions_count', - 'fann_get_cascade_activation_steepnesses', - 'fann_get_cascade_activation_steepnesses_count', - 'fann_get_cascade_candidate_change_fraction', - 'fann_get_cascade_candidate_limit', - 'fann_get_cascade_candidate_stagnation_epochs', - 'fann_get_cascade_max_cand_epochs', - 'fann_get_cascade_max_out_epochs', - 'fann_get_cascade_min_cand_epochs', - 'fann_get_cascade_min_out_epochs', - 'fann_get_cascade_num_candidate_groups', - 'fann_get_cascade_num_candidates', - 'fann_get_cascade_output_change_fraction', - 'fann_get_cascade_output_stagnation_epochs', - 'fann_get_cascade_weight_multiplier', - 'fann_get_connection_array', - 'fann_get_connection_rate', - 'fann_get_errno', - 'fann_get_errstr', - 'fann_get_layer_array', - 'fann_get_learning_momentum', - 'fann_get_learning_rate', - 'fann_get_network_type', - 'fann_get_num_input', - 'fann_get_num_layers', - 'fann_get_num_output', - 'fann_get_quickprop_decay', - 'fann_get_quickprop_mu', - 'fann_get_rprop_decrease_factor', - 'fann_get_rprop_delta_max', - 'fann_get_rprop_delta_min', - 'fann_get_rprop_delta_zero', - 'fann_get_rprop_increase_factor', - 'fann_get_sarprop_step_error_shift', - 'fann_get_sarprop_step_error_threshold_factor', - 'fann_get_sarprop_temperature', - 'fann_get_sarprop_weight_decay_shift', - 'fann_get_total_connections', - 'fann_get_total_neurons', - 'fann_get_train_error_function', - 'fann_get_train_stop_function', - 'fann_get_training_algorithm', - 'fann_init_weights', - 'fann_length_train_data', - 'fann_merge_train_data', - 'fann_num_input_train_data', - 'fann_num_output_train_data', - 'fann_randomize_weights', - 'fann_read_train_from_file', - 'fann_reset_errno', - 'fann_reset_errstr', - 'fann_run', - 'fann_save', - 'fann_save_train', - 'fann_scale_input', - 'fann_scale_input_train_data', - 'fann_scale_output', - 'fann_scale_output_train_data', - 'fann_scale_train', - 'fann_scale_train_data', - 'fann_set_activation_function', - 'fann_set_activation_function_hidden', - 'fann_set_activation_function_layer', - 'fann_set_activation_function_output', - 'fann_set_activation_steepness', - 'fann_set_activation_steepness_hidden', - 'fann_set_activation_steepness_layer', - 'fann_set_activation_steepness_output', - 'fann_set_bit_fail_limit', - 'fann_set_callback', - 'fann_set_cascade_activation_functions', - 'fann_set_cascade_activation_steepnesses', - 'fann_set_cascade_candidate_change_fraction', - 'fann_set_cascade_candidate_limit', - 'fann_set_cascade_candidate_stagnation_epochs', - 'fann_set_cascade_max_cand_epochs', - 'fann_set_cascade_max_out_epochs', - 'fann_set_cascade_min_cand_epochs', - 'fann_set_cascade_min_out_epochs', - 'fann_set_cascade_num_candidate_groups', - 'fann_set_cascade_output_change_fraction', - 'fann_set_cascade_output_stagnation_epochs', - 'fann_set_cascade_weight_multiplier', - 'fann_set_error_log', - 'fann_set_input_scaling_params', - 'fann_set_learning_momentum', - 'fann_set_learning_rate', - 'fann_set_output_scaling_params', - 'fann_set_quickprop_decay', - 'fann_set_quickprop_mu', - 'fann_set_rprop_decrease_factor', - 'fann_set_rprop_delta_max', - 'fann_set_rprop_delta_min', - 'fann_set_rprop_delta_zero', - 'fann_set_rprop_increase_factor', - 'fann_set_sarprop_step_error_shift', - 'fann_set_sarprop_step_error_threshold_factor', - 'fann_set_sarprop_temperature', - 'fann_set_sarprop_weight_decay_shift', - 'fann_set_scaling_params', - 'fann_set_train_error_function', - 'fann_set_train_stop_function', - 'fann_set_training_algorithm', - 'fann_set_weight', - 'fann_set_weight_array', - 'fann_shuffle_train_data', - 'fann_subset_train_data', - 'fann_test', - 'fann_test_data', - 'fann_train', - 'fann_train_epoch', - 'fann_train_on_data', - 'fann_train_on_file', - 'fbsql_affected_rows', - 'fbsql_autocommit', - 'fbsql_blob_size', - 'fbsql_change_user', - 'fbsql_clob_size', - 'fbsql_close', - 'fbsql_commit', - 'fbsql_connect', - 'fbsql_create_blob', - 'fbsql_create_clob', - 'fbsql_create_db', - 'fbsql_data_seek', - 'fbsql_database', - 'fbsql_database_password', - 'fbsql_db_query', - 'fbsql_db_status', - 'fbsql_drop_db', - 'fbsql_errno', - 'fbsql_error', - 'fbsql_fetch_array', - 'fbsql_fetch_assoc', - 'fbsql_fetch_field', - 'fbsql_fetch_lengths', - 'fbsql_fetch_object', - 'fbsql_fetch_row', - 'fbsql_field_flags', - 'fbsql_field_len', - 'fbsql_field_name', - 'fbsql_field_seek', - 'fbsql_field_table', - 'fbsql_field_type', - 'fbsql_free_result', - 'fbsql_get_autostart_info', - 'fbsql_hostname', - 'fbsql_insert_id', - 'fbsql_list_dbs', - 'fbsql_list_fields', - 'fbsql_list_tables', - 'fbsql_next_result', - 'fbsql_num_fields', - 'fbsql_num_rows', - 'fbsql_password', - 'fbsql_pconnect', - 'fbsql_query', - 'fbsql_read_blob', - 'fbsql_read_clob', - 'fbsql_result', - 'fbsql_rollback', - 'fbsql_rows_fetched', - 'fbsql_select_db', - 'fbsql_set_characterset', - 'fbsql_set_lob_mode', - 'fbsql_set_password', - 'fbsql_set_transaction', - 'fbsql_start_db', - 'fbsql_stop_db', - 'fbsql_table_name', - 'fbsql_username', - 'fclose', - 'fdf_add_doc_javascript', - 'fdf_add_template', - 'fdf_close', - 'fdf_create', - 'fdf_enum_values', - 'fdf_get_ap', - 'fdf_get_attachment', - 'fdf_get_encoding', - 'fdf_get_file', - 'fdf_get_flags', - 'fdf_get_opt', - 'fdf_get_status', - 'fdf_get_value', - 'fdf_get_version', - 'fdf_next_field_name', - 'fdf_open', - 'fdf_open_string', - 'fdf_remove_item', - 'fdf_save', - 'fdf_save_string', - 'fdf_set_ap', - 'fdf_set_encoding', - 'fdf_set_file', - 'fdf_set_flags', - 'fdf_set_javascript_action', - 'fdf_set_on_import_javascript', - 'fdf_set_opt', - 'fdf_set_status', - 'fdf_set_submit_form_action', - 'fdf_set_target_frame', - 'fdf_set_value', - 'fdf_set_version', - 'feof', - 'fflush', - 'ffmpeg_frame::__construct', - 'ffmpeg_frame::toGDImage', - 'fgetc', - 'fgetcsv', - 'fgets', - 'fgetss', - 'file', - 'file_get_contents', - 'file_put_contents', - 'finfo::buffer', - 'finfo::file', - 'finfo_buffer', - 'finfo_close', - 'finfo_file', - 'finfo_open', - 'finfo_set_flags', - 'flock', - 'fopen', - 'fpassthru', - 'fprintf', - 'fputcsv', - 'fputs', - 'fread', - 'fscanf', - 'fseek', - 'fstat', - 'ftell', - 'ftp_alloc', - 'ftp_append', - 'ftp_cdup', - 'ftp_chdir', - 'ftp_chmod', - 'ftp_close', - 'ftp_delete', - 'ftp_exec', - 'ftp_fget', - 'ftp_fput', - 'ftp_get', - 'ftp_get_option', - 'ftp_login', - 'ftp_mdtm', - 'ftp_mkdir', - 'ftp_mlsd', - 'ftp_nb_continue', - 'ftp_nb_fget', - 'ftp_nb_fput', - 'ftp_nb_get', - 'ftp_nb_put', - 'ftp_nlist', - 'ftp_pasv', - 'ftp_put', - 'ftp_pwd', - 'ftp_quit', - 'ftp_raw', - 'ftp_rawlist', - 'ftp_rename', - 'ftp_rmdir', - 'ftp_set_option', - 'ftp_site', - 'ftp_size', - 'ftp_systype', - 'ftruncate', - 'fwrite', - 'get_resource_type', - 'gmp_div', - 'gnupg::init', - 'gnupg_adddecryptkey', - 'gnupg_addencryptkey', - 'gnupg_addsignkey', - 'gnupg_cleardecryptkeys', - 'gnupg_clearencryptkeys', - 'gnupg_clearsignkeys', - 'gnupg_decrypt', - 'gnupg_decryptverify', - 'gnupg_encrypt', - 'gnupg_encryptsign', - 'gnupg_export', - 'gnupg_geterror', - 'gnupg_getprotocol', - 'gnupg_import', - 'gnupg_init', - 'gnupg_keyinfo', - 'gnupg_setarmor', - 'gnupg_seterrormode', - 'gnupg_setsignmode', - 'gnupg_sign', - 'gnupg_verify', - 'gupnp_context_get_host_ip', - 'gupnp_context_get_port', - 'gupnp_context_get_subscription_timeout', - 'gupnp_context_host_path', - 'gupnp_context_new', - 'gupnp_context_set_subscription_timeout', - 'gupnp_context_timeout_add', - 'gupnp_context_unhost_path', - 'gupnp_control_point_browse_start', - 'gupnp_control_point_browse_stop', - 'gupnp_control_point_callback_set', - 'gupnp_control_point_new', - 'gupnp_device_action_callback_set', - 'gupnp_device_info_get', - 'gupnp_device_info_get_service', - 'gupnp_root_device_get_available', - 'gupnp_root_device_get_relative_location', - 'gupnp_root_device_new', - 'gupnp_root_device_set_available', - 'gupnp_root_device_start', - 'gupnp_root_device_stop', - 'gupnp_service_action_get', - 'gupnp_service_action_return', - 'gupnp_service_action_return_error', - 'gupnp_service_action_set', - 'gupnp_service_freeze_notify', - 'gupnp_service_info_get', - 'gupnp_service_info_get_introspection', - 'gupnp_service_introspection_get_state_variable', - 'gupnp_service_notify', - 'gupnp_service_proxy_action_get', - 'gupnp_service_proxy_action_set', - 'gupnp_service_proxy_add_notify', - 'gupnp_service_proxy_callback_set', - 'gupnp_service_proxy_get_subscribed', - 'gupnp_service_proxy_remove_notify', - 'gupnp_service_proxy_send_action', - 'gupnp_service_proxy_set_subscribed', - 'gupnp_service_thaw_notify', - 'gzclose', - 'gzeof', - 'gzgetc', - 'gzgets', - 'gzgetss', - 'gzpassthru', - 'gzputs', - 'gzread', - 'gzrewind', - 'gzseek', - 'gztell', - 'gzwrite', - 'hash_update_stream', - 'http\Env\Response::send', - 'http_get_request_body_stream', - 'ibase_add_user', - 'ibase_affected_rows', - 'ibase_backup', - 'ibase_blob_add', - 'ibase_blob_cancel', - 'ibase_blob_close', - 'ibase_blob_create', - 'ibase_blob_get', - 'ibase_blob_open', - 'ibase_close', - 'ibase_commit', - 'ibase_commit_ret', - 'ibase_connect', - 'ibase_db_info', - 'ibase_delete_user', - 'ibase_drop_db', - 'ibase_execute', - 'ibase_fetch_assoc', - 'ibase_fetch_object', - 'ibase_fetch_row', - 'ibase_field_info', - 'ibase_free_event_handler', - 'ibase_free_query', - 'ibase_free_result', - 'ibase_gen_id', - 'ibase_maintain_db', - 'ibase_modify_user', - 'ibase_name_result', - 'ibase_num_fields', - 'ibase_num_params', - 'ibase_param_info', - 'ibase_pconnect', - 'ibase_prepare', - 'ibase_query', - 'ibase_restore', - 'ibase_rollback', - 'ibase_rollback_ret', - 'ibase_server_info', - 'ibase_service_attach', - 'ibase_service_detach', - 'ibase_set_event_handler', - 'ibase_trans', - 'ifx_affected_rows', - 'ifx_close', - 'ifx_connect', - 'ifx_do', - 'ifx_error', - 'ifx_fetch_row', - 'ifx_fieldproperties', - 'ifx_fieldtypes', - 'ifx_free_result', - 'ifx_getsqlca', - 'ifx_htmltbl_result', - 'ifx_num_fields', - 'ifx_num_rows', - 'ifx_pconnect', - 'ifx_prepare', - 'ifx_query', - 'image2wbmp', - 'imageaffine', - 'imagealphablending', - 'imageantialias', - 'imagearc', - 'imagebmp', - 'imagechar', - 'imagecharup', - 'imagecolorallocate', - 'imagecolorallocatealpha', - 'imagecolorat', - 'imagecolorclosest', - 'imagecolorclosestalpha', - 'imagecolorclosesthwb', - 'imagecolordeallocate', - 'imagecolorexact', - 'imagecolorexactalpha', - 'imagecolormatch', - 'imagecolorresolve', - 'imagecolorresolvealpha', - 'imagecolorset', - 'imagecolorsforindex', - 'imagecolorstotal', - 'imagecolortransparent', - 'imageconvolution', - 'imagecopy', - 'imagecopymerge', - 'imagecopymergegray', - 'imagecopyresampled', - 'imagecopyresized', - 'imagecrop', - 'imagecropauto', - 'imagedashedline', - 'imagedestroy', - 'imageellipse', - 'imagefill', - 'imagefilledarc', - 'imagefilledellipse', - 'imagefilledpolygon', - 'imagefilledrectangle', - 'imagefilltoborder', - 'imagefilter', - 'imageflip', - 'imagefttext', - 'imagegammacorrect', - 'imagegd', - 'imagegd2', - 'imagegetclip', - 'imagegif', - 'imagegrabscreen', - 'imagegrabwindow', - 'imageinterlace', - 'imageistruecolor', - 'imagejpeg', - 'imagelayereffect', - 'imageline', - 'imageopenpolygon', - 'imagepalettecopy', - 'imagepalettetotruecolor', - 'imagepng', - 'imagepolygon', - 'imagepsencodefont', - 'imagepsextendfont', - 'imagepsfreefont', - 'imagepsloadfont', - 'imagepsslantfont', - 'imagepstext', - 'imagerectangle', - 'imageresolution', - 'imagerotate', - 'imagesavealpha', - 'imagescale', - 'imagesetbrush', - 'imagesetclip', - 'imagesetinterpolation', - 'imagesetpixel', - 'imagesetstyle', - 'imagesetthickness', - 'imagesettile', - 'imagestring', - 'imagestringup', - 'imagesx', - 'imagesy', - 'imagetruecolortopalette', - 'imagettftext', - 'imagewbmp', - 'imagewebp', - 'imagexbm', - 'imap_append', - 'imap_body', - 'imap_bodystruct', - 'imap_check', - 'imap_clearflag_full', - 'imap_close', - 'imap_create', - 'imap_createmailbox', - 'imap_delete', - 'imap_deletemailbox', - 'imap_expunge', - 'imap_fetch_overview', - 'imap_fetchbody', - 'imap_fetchheader', - 'imap_fetchmime', - 'imap_fetchstructure', - 'imap_fetchtext', - 'imap_gc', - 'imap_get_quota', - 'imap_get_quotaroot', - 'imap_getacl', - 'imap_getmailboxes', - 'imap_getsubscribed', - 'imap_header', - 'imap_headerinfo', - 'imap_headers', - 'imap_list', - 'imap_listmailbox', - 'imap_listscan', - 'imap_listsubscribed', - 'imap_lsub', - 'imap_mail_copy', - 'imap_mail_move', - 'imap_mailboxmsginfo', - 'imap_msgno', - 'imap_num_msg', - 'imap_num_recent', - 'imap_ping', - 'imap_rename', - 'imap_renamemailbox', - 'imap_reopen', - 'imap_savebody', - 'imap_scan', - 'imap_scanmailbox', - 'imap_search', - 'imap_set_quota', - 'imap_setacl', - 'imap_setflag_full', - 'imap_sort', - 'imap_status', - 'imap_subscribe', - 'imap_thread', - 'imap_uid', - 'imap_undelete', - 'imap_unsubscribe', - 'inflate_add', - 'inflate_get_read_len', - 'inflate_get_status', - 'ingres_autocommit', - 'ingres_autocommit_state', - 'ingres_charset', - 'ingres_close', - 'ingres_commit', - 'ingres_connect', - 'ingres_cursor', - 'ingres_errno', - 'ingres_error', - 'ingres_errsqlstate', - 'ingres_escape_string', - 'ingres_execute', - 'ingres_fetch_array', - 'ingres_fetch_assoc', - 'ingres_fetch_object', - 'ingres_fetch_proc_return', - 'ingres_fetch_row', - 'ingres_field_length', - 'ingres_field_name', - 'ingres_field_nullable', - 'ingres_field_precision', - 'ingres_field_scale', - 'ingres_field_type', - 'ingres_free_result', - 'ingres_next_error', - 'ingres_num_fields', - 'ingres_num_rows', - 'ingres_pconnect', - 'ingres_prepare', - 'ingres_query', - 'ingres_result_seek', - 'ingres_rollback', - 'ingres_set_environment', - 'ingres_unbuffered_query', - 'inotify_add_watch', - 'inotify_init', - 'inotify_queue_len', - 'inotify_read', - 'inotify_rm_watch', - 'kadm5_chpass_principal', - 'kadm5_create_principal', - 'kadm5_delete_principal', - 'kadm5_destroy', - 'kadm5_flush', - 'kadm5_get_policies', - 'kadm5_get_principal', - 'kadm5_get_principals', - 'kadm5_init_with_password', - 'kadm5_modify_principal', - 'ldap_add', - 'ldap_bind', - 'ldap_close', - 'ldap_compare', - 'ldap_control_paged_result', - 'ldap_control_paged_result_response', - 'ldap_count_entries', - 'ldap_delete', - 'ldap_errno', - 'ldap_error', - 'ldap_exop', - 'ldap_exop_passwd', - 'ldap_exop_refresh', - 'ldap_exop_whoami', - 'ldap_first_attribute', - 'ldap_first_entry', - 'ldap_first_reference', - 'ldap_free_result', - 'ldap_get_attributes', - 'ldap_get_dn', - 'ldap_get_entries', - 'ldap_get_option', - 'ldap_get_values', - 'ldap_get_values_len', - 'ldap_mod_add', - 'ldap_mod_del', - 'ldap_mod_replace', - 'ldap_modify', - 'ldap_modify_batch', - 'ldap_next_attribute', - 'ldap_next_entry', - 'ldap_next_reference', - 'ldap_parse_exop', - 'ldap_parse_reference', - 'ldap_parse_result', - 'ldap_rename', - 'ldap_sasl_bind', - 'ldap_set_option', - 'ldap_set_rebind_proc', - 'ldap_sort', - 'ldap_start_tls', - 'ldap_unbind', - 'libxml_set_streams_context', - 'm_checkstatus', - 'm_completeauthorizations', - 'm_connect', - 'm_connectionerror', - 'm_deletetrans', - 'm_destroyconn', - 'm_getcell', - 'm_getcellbynum', - 'm_getcommadelimited', - 'm_getheader', - 'm_initconn', - 'm_iscommadelimited', - 'm_maxconntimeout', - 'm_monitor', - 'm_numcolumns', - 'm_numrows', - 'm_parsecommadelimited', - 'm_responsekeys', - 'm_responseparam', - 'm_returnstatus', - 'm_setblocking', - 'm_setdropfile', - 'm_setip', - 'm_setssl', - 'm_setssl_cafile', - 'm_setssl_files', - 'm_settimeout', - 'm_transactionssent', - 'm_transinqueue', - 'm_transkeyval', - 'm_transnew', - 'm_transsend', - 'm_validateidentifier', - 'm_verifyconnection', - 'm_verifysslcert', - 'mailparse_determine_best_xfer_encoding', - 'mailparse_msg_create', - 'mailparse_msg_extract_part', - 'mailparse_msg_extract_part_file', - 'mailparse_msg_extract_whole_part_file', - 'mailparse_msg_free', - 'mailparse_msg_get_part', - 'mailparse_msg_get_part_data', - 'mailparse_msg_get_structure', - 'mailparse_msg_parse', - 'mailparse_msg_parse_file', - 'mailparse_stream_encode', - 'mailparse_uudecode_all', - 'maxdb::use_result', - 'maxdb_affected_rows', - 'maxdb_connect', - 'maxdb_disable_rpl_parse', - 'maxdb_dump_debug_info', - 'maxdb_embedded_connect', - 'maxdb_enable_reads_from_master', - 'maxdb_enable_rpl_parse', - 'maxdb_errno', - 'maxdb_error', - 'maxdb_fetch_lengths', - 'maxdb_field_tell', - 'maxdb_get_host_info', - 'maxdb_get_proto_info', - 'maxdb_get_server_info', - 'maxdb_get_server_version', - 'maxdb_info', - 'maxdb_init', - 'maxdb_insert_id', - 'maxdb_master_query', - 'maxdb_more_results', - 'maxdb_next_result', - 'maxdb_num_fields', - 'maxdb_num_rows', - 'maxdb_rpl_parse_enabled', - 'maxdb_rpl_probe', - 'maxdb_select_db', - 'maxdb_sqlstate', - 'maxdb_stmt::result_metadata', - 'maxdb_stmt_affected_rows', - 'maxdb_stmt_errno', - 'maxdb_stmt_error', - 'maxdb_stmt_num_rows', - 'maxdb_stmt_param_count', - 'maxdb_stmt_result_metadata', - 'maxdb_stmt_sqlstate', - 'maxdb_thread_id', - 'maxdb_use_result', - 'maxdb_warning_count', - 'mcrypt_enc_get_algorithms_name', - 'mcrypt_enc_get_block_size', - 'mcrypt_enc_get_iv_size', - 'mcrypt_enc_get_key_size', - 'mcrypt_enc_get_modes_name', - 'mcrypt_enc_get_supported_key_sizes', - 'mcrypt_enc_is_block_algorithm', - 'mcrypt_enc_is_block_algorithm_mode', - 'mcrypt_enc_is_block_mode', - 'mcrypt_enc_self_test', - 'mcrypt_generic', - 'mcrypt_generic_deinit', - 'mcrypt_generic_end', - 'mcrypt_generic_init', - 'mcrypt_module_close', - 'mcrypt_module_open', - 'mdecrypt_generic', - 'mkdir', - 'mqseries_back', - 'mqseries_begin', - 'mqseries_close', - 'mqseries_cmit', - 'mqseries_conn', - 'mqseries_connx', - 'mqseries_disc', - 'mqseries_get', - 'mqseries_inq', - 'mqseries_open', - 'mqseries_put', - 'mqseries_put1', - 'mqseries_set', - 'msg_get_queue', - 'msg_receive', - 'msg_remove_queue', - 'msg_send', - 'msg_set_queue', - 'msg_stat_queue', - 'msql_affected_rows', - 'msql_close', - 'msql_connect', - 'msql_create_db', - 'msql_data_seek', - 'msql_db_query', - 'msql_drop_db', - 'msql_fetch_array', - 'msql_fetch_field', - 'msql_fetch_object', - 'msql_fetch_row', - 'msql_field_flags', - 'msql_field_len', - 'msql_field_name', - 'msql_field_seek', - 'msql_field_table', - 'msql_field_type', - 'msql_free_result', - 'msql_list_dbs', - 'msql_list_fields', - 'msql_list_tables', - 'msql_num_fields', - 'msql_num_rows', - 'msql_pconnect', - 'msql_query', - 'msql_result', - 'msql_select_db', - 'mssql_bind', - 'mssql_close', - 'mssql_connect', - 'mssql_data_seek', - 'mssql_execute', - 'mssql_fetch_array', - 'mssql_fetch_assoc', - 'mssql_fetch_batch', - 'mssql_fetch_field', - 'mssql_fetch_object', - 'mssql_fetch_row', - 'mssql_field_length', - 'mssql_field_name', - 'mssql_field_seek', - 'mssql_field_type', - 'mssql_free_result', - 'mssql_free_statement', - 'mssql_init', - 'mssql_next_result', - 'mssql_num_fields', - 'mssql_num_rows', - 'mssql_pconnect', - 'mssql_query', - 'mssql_result', - 'mssql_rows_affected', - 'mssql_select_db', - 'mysql_affected_rows', - 'mysql_client_encoding', - 'mysql_close', - 'mysql_connect', - 'mysql_create_db', - 'mysql_data_seek', - 'mysql_db_name', - 'mysql_db_query', - 'mysql_drop_db', - 'mysql_errno', - 'mysql_error', - 'mysql_fetch_array', - 'mysql_fetch_assoc', - 'mysql_fetch_field', - 'mysql_fetch_lengths', - 'mysql_fetch_object', - 'mysql_fetch_row', - 'mysql_field_flags', - 'mysql_field_len', - 'mysql_field_name', - 'mysql_field_seek', - 'mysql_field_table', - 'mysql_field_type', - 'mysql_free_result', - 'mysql_get_host_info', - 'mysql_get_proto_info', - 'mysql_get_server_info', - 'mysql_info', - 'mysql_insert_id', - 'mysql_list_dbs', - 'mysql_list_fields', - 'mysql_list_processes', - 'mysql_list_tables', - 'mysql_num_fields', - 'mysql_num_rows', - 'mysql_pconnect', - 'mysql_ping', - 'mysql_query', - 'mysql_real_escape_string', - 'mysql_result', - 'mysql_select_db', - 'mysql_set_charset', - 'mysql_stat', - 'mysql_tablename', - 'mysql_thread_id', - 'mysql_unbuffered_query', - 'mysqlnd_uh_convert_to_mysqlnd', - 'ncurses_bottom_panel', - 'ncurses_del_panel', - 'ncurses_delwin', - 'ncurses_getmaxyx', - 'ncurses_getyx', - 'ncurses_hide_panel', - 'ncurses_keypad', - 'ncurses_meta', - 'ncurses_move_panel', - 'ncurses_mvwaddstr', - 'ncurses_new_panel', - 'ncurses_newpad', - 'ncurses_newwin', - 'ncurses_panel_above', - 'ncurses_panel_below', - 'ncurses_panel_window', - 'ncurses_pnoutrefresh', - 'ncurses_prefresh', - 'ncurses_replace_panel', - 'ncurses_show_panel', - 'ncurses_top_panel', - 'ncurses_waddch', - 'ncurses_waddstr', - 'ncurses_wattroff', - 'ncurses_wattron', - 'ncurses_wattrset', - 'ncurses_wborder', - 'ncurses_wclear', - 'ncurses_wcolor_set', - 'ncurses_werase', - 'ncurses_wgetch', - 'ncurses_whline', - 'ncurses_wmouse_trafo', - 'ncurses_wmove', - 'ncurses_wnoutrefresh', - 'ncurses_wrefresh', - 'ncurses_wstandend', - 'ncurses_wstandout', - 'ncurses_wvline', - 'newt_button', - 'newt_button_bar', - 'newt_checkbox', - 'newt_checkbox_get_value', - 'newt_checkbox_set_flags', - 'newt_checkbox_set_value', - 'newt_checkbox_tree', - 'newt_checkbox_tree_add_item', - 'newt_checkbox_tree_find_item', - 'newt_checkbox_tree_get_current', - 'newt_checkbox_tree_get_entry_value', - 'newt_checkbox_tree_get_multi_selection', - 'newt_checkbox_tree_get_selection', - 'newt_checkbox_tree_multi', - 'newt_checkbox_tree_set_current', - 'newt_checkbox_tree_set_entry', - 'newt_checkbox_tree_set_entry_value', - 'newt_checkbox_tree_set_width', - 'newt_compact_button', - 'newt_component_add_callback', - 'newt_component_takes_focus', - 'newt_create_grid', - 'newt_draw_form', - 'newt_entry', - 'newt_entry_get_value', - 'newt_entry_set', - 'newt_entry_set_filter', - 'newt_entry_set_flags', - 'newt_form', - 'newt_form_add_component', - 'newt_form_add_components', - 'newt_form_add_hot_key', - 'newt_form_destroy', - 'newt_form_get_current', - 'newt_form_run', - 'newt_form_set_background', - 'newt_form_set_height', - 'newt_form_set_size', - 'newt_form_set_timer', - 'newt_form_set_width', - 'newt_form_watch_fd', - 'newt_grid_add_components_to_form', - 'newt_grid_basic_window', - 'newt_grid_free', - 'newt_grid_get_size', - 'newt_grid_h_close_stacked', - 'newt_grid_h_stacked', - 'newt_grid_place', - 'newt_grid_set_field', - 'newt_grid_simple_window', - 'newt_grid_v_close_stacked', - 'newt_grid_v_stacked', - 'newt_grid_wrapped_window', - 'newt_grid_wrapped_window_at', - 'newt_label', - 'newt_label_set_text', - 'newt_listbox', - 'newt_listbox_append_entry', - 'newt_listbox_clear', - 'newt_listbox_clear_selection', - 'newt_listbox_delete_entry', - 'newt_listbox_get_current', - 'newt_listbox_get_selection', - 'newt_listbox_insert_entry', - 'newt_listbox_item_count', - 'newt_listbox_select_item', - 'newt_listbox_set_current', - 'newt_listbox_set_current_by_key', - 'newt_listbox_set_data', - 'newt_listbox_set_entry', - 'newt_listbox_set_width', - 'newt_listitem', - 'newt_listitem_get_data', - 'newt_listitem_set', - 'newt_radio_get_current', - 'newt_radiobutton', - 'newt_run_form', - 'newt_scale', - 'newt_scale_set', - 'newt_scrollbar_set', - 'newt_textbox', - 'newt_textbox_get_num_lines', - 'newt_textbox_reflowed', - 'newt_textbox_set_height', - 'newt_textbox_set_text', - 'newt_vertical_scrollbar', - 'oci_bind_array_by_name', - 'oci_bind_by_name', - 'oci_cancel', - 'oci_close', - 'oci_commit', - 'oci_connect', - 'oci_define_by_name', - 'oci_error', - 'oci_execute', - 'oci_fetch', - 'oci_fetch_all', - 'oci_fetch_array', - 'oci_fetch_assoc', - 'oci_fetch_object', - 'oci_fetch_row', - 'oci_field_is_null', - 'oci_field_name', - 'oci_field_precision', - 'oci_field_scale', - 'oci_field_size', - 'oci_field_type', - 'oci_field_type_raw', - 'oci_free_cursor', - 'oci_free_statement', - 'oci_get_implicit_resultset', - 'oci_new_collection', - 'oci_new_connect', - 'oci_new_cursor', - 'oci_new_descriptor', - 'oci_num_fields', - 'oci_num_rows', - 'oci_parse', - 'oci_pconnect', - 'oci_register_taf_callback', - 'oci_result', - 'oci_rollback', - 'oci_server_version', - 'oci_set_action', - 'oci_set_client_identifier', - 'oci_set_client_info', - 'oci_set_module_name', - 'oci_set_prefetch', - 'oci_statement_type', - 'oci_unregister_taf_callback', - 'odbc_autocommit', - 'odbc_close', - 'odbc_columnprivileges', - 'odbc_columns', - 'odbc_commit', - 'odbc_connect', - 'odbc_cursor', - 'odbc_data_source', - 'odbc_do', - 'odbc_error', - 'odbc_errormsg', - 'odbc_exec', - 'odbc_execute', - 'odbc_fetch_array', - 'odbc_fetch_into', - 'odbc_fetch_row', - 'odbc_field_len', - 'odbc_field_name', - 'odbc_field_num', - 'odbc_field_precision', - 'odbc_field_scale', - 'odbc_field_type', - 'odbc_foreignkeys', - 'odbc_free_result', - 'odbc_gettypeinfo', - 'odbc_next_result', - 'odbc_num_fields', - 'odbc_num_rows', - 'odbc_pconnect', - 'odbc_prepare', - 'odbc_primarykeys', - 'odbc_procedurecolumns', - 'odbc_procedures', - 'odbc_result', - 'odbc_result_all', - 'odbc_rollback', - 'odbc_setoption', - 'odbc_specialcolumns', - 'odbc_statistics', - 'odbc_tableprivileges', - 'odbc_tables', - 'openal_buffer_create', - 'openal_buffer_data', - 'openal_buffer_destroy', - 'openal_buffer_get', - 'openal_buffer_loadwav', - 'openal_context_create', - 'openal_context_current', - 'openal_context_destroy', - 'openal_context_process', - 'openal_context_suspend', - 'openal_device_close', - 'openal_device_open', - 'openal_source_create', - 'openal_source_destroy', - 'openal_source_get', - 'openal_source_pause', - 'openal_source_play', - 'openal_source_rewind', - 'openal_source_set', - 'openal_source_stop', - 'openal_stream', - 'opendir', - 'openssl_csr_new', - 'openssl_dh_compute_key', - 'openssl_free_key', - 'openssl_pkey_export', - 'openssl_pkey_free', - 'openssl_pkey_get_details', - 'openssl_spki_new', - 'openssl_x509_free', - 'pclose', - 'pfsockopen', - 'pg_affected_rows', - 'pg_cancel_query', - 'pg_client_encoding', - 'pg_close', - 'pg_connect_poll', - 'pg_connection_busy', - 'pg_connection_reset', - 'pg_connection_status', - 'pg_consume_input', - 'pg_convert', - 'pg_copy_from', - 'pg_copy_to', - 'pg_dbname', - 'pg_delete', - 'pg_end_copy', - 'pg_escape_bytea', - 'pg_escape_identifier', - 'pg_escape_literal', - 'pg_escape_string', - 'pg_execute', - 'pg_fetch_all', - 'pg_fetch_all_columns', - 'pg_fetch_array', - 'pg_fetch_assoc', - 'pg_fetch_row', - 'pg_field_name', - 'pg_field_num', - 'pg_field_size', - 'pg_field_table', - 'pg_field_type', - 'pg_field_type_oid', - 'pg_flush', - 'pg_free_result', - 'pg_get_notify', - 'pg_get_pid', - 'pg_get_result', - 'pg_host', - 'pg_insert', - 'pg_last_error', - 'pg_last_notice', - 'pg_last_oid', - 'pg_lo_close', - 'pg_lo_create', - 'pg_lo_export', - 'pg_lo_import', - 'pg_lo_open', - 'pg_lo_read', - 'pg_lo_read_all', - 'pg_lo_seek', - 'pg_lo_tell', - 'pg_lo_truncate', - 'pg_lo_unlink', - 'pg_lo_write', - 'pg_meta_data', - 'pg_num_fields', - 'pg_num_rows', - 'pg_options', - 'pg_parameter_status', - 'pg_ping', - 'pg_port', - 'pg_prepare', - 'pg_put_line', - 'pg_query', - 'pg_query_params', - 'pg_result_error', - 'pg_result_error_field', - 'pg_result_seek', - 'pg_result_status', - 'pg_select', - 'pg_send_execute', - 'pg_send_prepare', - 'pg_send_query', - 'pg_send_query_params', - 'pg_set_client_encoding', - 'pg_set_error_verbosity', - 'pg_socket', - 'pg_trace', - 'pg_transaction_status', - 'pg_tty', - 'pg_untrace', - 'pg_update', - 'pg_version', - 'php_user_filter::filter', - 'proc_close', - 'proc_get_status', - 'proc_terminate', - 'ps_add_bookmark', - 'ps_add_launchlink', - 'ps_add_locallink', - 'ps_add_note', - 'ps_add_pdflink', - 'ps_add_weblink', - 'ps_arc', - 'ps_arcn', - 'ps_begin_page', - 'ps_begin_pattern', - 'ps_begin_template', - 'ps_circle', - 'ps_clip', - 'ps_close', - 'ps_close_image', - 'ps_closepath', - 'ps_closepath_stroke', - 'ps_continue_text', - 'ps_curveto', - 'ps_delete', - 'ps_end_page', - 'ps_end_pattern', - 'ps_end_template', - 'ps_fill', - 'ps_fill_stroke', - 'ps_findfont', - 'ps_get_buffer', - 'ps_get_parameter', - 'ps_get_value', - 'ps_hyphenate', - 'ps_include_file', - 'ps_lineto', - 'ps_makespotcolor', - 'ps_moveto', - 'ps_new', - 'ps_open_file', - 'ps_open_image', - 'ps_open_image_file', - 'ps_open_memory_image', - 'ps_place_image', - 'ps_rect', - 'ps_restore', - 'ps_rotate', - 'ps_save', - 'ps_scale', - 'ps_set_border_color', - 'ps_set_border_dash', - 'ps_set_border_style', - 'ps_set_info', - 'ps_set_parameter', - 'ps_set_text_pos', - 'ps_set_value', - 'ps_setcolor', - 'ps_setdash', - 'ps_setflat', - 'ps_setfont', - 'ps_setgray', - 'ps_setlinecap', - 'ps_setlinejoin', - 'ps_setlinewidth', - 'ps_setmiterlimit', - 'ps_setoverprintmode', - 'ps_setpolydash', - 'ps_shading', - 'ps_shading_pattern', - 'ps_shfill', - 'ps_show', - 'ps_show2', - 'ps_show_boxed', - 'ps_show_xy', - 'ps_show_xy2', - 'ps_string_geometry', - 'ps_stringwidth', - 'ps_stroke', - 'ps_symbol', - 'ps_symbol_name', - 'ps_symbol_width', - 'ps_translate', - 'px_close', - 'px_create_fp', - 'px_date2string', - 'px_delete', - 'px_delete_record', - 'px_get_field', - 'px_get_info', - 'px_get_parameter', - 'px_get_record', - 'px_get_schema', - 'px_get_value', - 'px_insert_record', - 'px_new', - 'px_numfields', - 'px_numrecords', - 'px_open_fp', - 'px_put_record', - 'px_retrieve_record', - 'px_set_blob_file', - 'px_set_parameter', - 'px_set_tablename', - 'px_set_targetencoding', - 'px_set_value', - 'px_timestamp2string', - 'px_update_record', - 'radius_acct_open', - 'radius_add_server', - 'radius_auth_open', - 'radius_close', - 'radius_config', - 'radius_create_request', - 'radius_demangle', - 'radius_demangle_mppe_key', - 'radius_get_attr', - 'radius_put_addr', - 'radius_put_attr', - 'radius_put_int', - 'radius_put_string', - 'radius_put_vendor_addr', - 'radius_put_vendor_attr', - 'radius_put_vendor_int', - 'radius_put_vendor_string', - 'radius_request_authenticator', - 'radius_salt_encrypt_attr', - 'radius_send_request', - 'radius_server_secret', - 'radius_strerror', - 'readdir', - 'readfile', - 'recode_file', - 'rename', - 'rewind', - 'rewinddir', - 'rmdir', - 'rpm_close', - 'rpm_get_tag', - 'rpm_open', - 'sapi_windows_vt100_support', - 'scandir', - 'sem_acquire', - 'sem_get', - 'sem_release', - 'sem_remove', - 'set_file_buffer', - 'shm_attach', - 'shm_detach', - 'shm_get_var', - 'shm_has_var', - 'shm_put_var', - 'shm_remove', - 'shm_remove_var', - 'shmop_close', - 'shmop_delete', - 'shmop_open', - 'shmop_read', - 'shmop_size', - 'shmop_write', - 'socket_accept', - 'socket_addrinfo_bind', - 'socket_addrinfo_connect', - 'socket_addrinfo_explain', - 'socket_bind', - 'socket_clear_error', - 'socket_close', - 'socket_connect', - 'socket_export_stream', - 'socket_get_option', - 'socket_get_status', - 'socket_getopt', - 'socket_getpeername', - 'socket_getsockname', - 'socket_import_stream', - 'socket_last_error', - 'socket_listen', - 'socket_read', - 'socket_recv', - 'socket_recvfrom', - 'socket_recvmsg', - 'socket_send', - 'socket_sendmsg', - 'socket_sendto', - 'socket_set_block', - 'socket_set_blocking', - 'socket_set_nonblock', - 'socket_set_option', - 'socket_set_timeout', - 'socket_shutdown', - 'socket_write', - 'sqlite_close', - 'sqlite_fetch_string', - 'sqlite_has_more', - 'sqlite_open', - 'sqlite_popen', - 'sqlsrv_begin_transaction', - 'sqlsrv_cancel', - 'sqlsrv_client_info', - 'sqlsrv_close', - 'sqlsrv_commit', - 'sqlsrv_connect', - 'sqlsrv_execute', - 'sqlsrv_fetch', - 'sqlsrv_fetch_array', - 'sqlsrv_fetch_object', - 'sqlsrv_field_metadata', - 'sqlsrv_free_stmt', - 'sqlsrv_get_field', - 'sqlsrv_has_rows', - 'sqlsrv_next_result', - 'sqlsrv_num_fields', - 'sqlsrv_num_rows', - 'sqlsrv_prepare', - 'sqlsrv_query', - 'sqlsrv_rollback', - 'sqlsrv_rows_affected', - 'sqlsrv_send_stream_data', - 'sqlsrv_server_info', - 'ssh2_auth_agent', - 'ssh2_auth_hostbased_file', - 'ssh2_auth_none', - 'ssh2_auth_password', - 'ssh2_auth_pubkey_file', - 'ssh2_disconnect', - 'ssh2_exec', - 'ssh2_fetch_stream', - 'ssh2_fingerprint', - 'ssh2_methods_negotiated', - 'ssh2_publickey_add', - 'ssh2_publickey_init', - 'ssh2_publickey_list', - 'ssh2_publickey_remove', - 'ssh2_scp_recv', - 'ssh2_scp_send', - 'ssh2_sftp', - 'ssh2_sftp_chmod', - 'ssh2_sftp_lstat', - 'ssh2_sftp_mkdir', - 'ssh2_sftp_readlink', - 'ssh2_sftp_realpath', - 'ssh2_sftp_rename', - 'ssh2_sftp_rmdir', - 'ssh2_sftp_stat', - 'ssh2_sftp_symlink', - 'ssh2_sftp_unlink', - 'ssh2_shell', - 'ssh2_tunnel', - 'stomp_connect', - 'streamWrapper::stream_cast', - 'stream_bucket_append', - 'stream_bucket_make_writeable', - 'stream_bucket_new', - 'stream_bucket_prepend', - 'stream_context_create', - 'stream_context_get_default', - 'stream_context_get_options', - 'stream_context_get_params', - 'stream_context_set_default', - 'stream_context_set_params', - 'stream_copy_to_stream', - 'stream_encoding', - 'stream_filter_append', - 'stream_filter_prepend', - 'stream_filter_remove', - 'stream_get_contents', - 'stream_get_line', - 'stream_get_meta_data', - 'stream_isatty', - 'stream_set_blocking', - 'stream_set_chunk_size', - 'stream_set_read_buffer', - 'stream_set_timeout', - 'stream_set_write_buffer', - 'stream_socket_accept', - 'stream_socket_client', - 'stream_socket_enable_crypto', - 'stream_socket_get_name', - 'stream_socket_recvfrom', - 'stream_socket_sendto', - 'stream_socket_server', - 'stream_socket_shutdown', - 'stream_supports_lock', - 'svn_fs_abort_txn', - 'svn_fs_apply_text', - 'svn_fs_begin_txn2', - 'svn_fs_change_node_prop', - 'svn_fs_check_path', - 'svn_fs_contents_changed', - 'svn_fs_copy', - 'svn_fs_delete', - 'svn_fs_dir_entries', - 'svn_fs_file_contents', - 'svn_fs_file_length', - 'svn_fs_is_dir', - 'svn_fs_is_file', - 'svn_fs_make_dir', - 'svn_fs_make_file', - 'svn_fs_node_created_rev', - 'svn_fs_node_prop', - 'svn_fs_props_changed', - 'svn_fs_revision_prop', - 'svn_fs_revision_root', - 'svn_fs_txn_root', - 'svn_fs_youngest_rev', - 'svn_repos_create', - 'svn_repos_fs', - 'svn_repos_fs_begin_txn_for_commit', - 'svn_repos_fs_commit_txn', - 'svn_repos_open', - 'sybase_affected_rows', - 'sybase_close', - 'sybase_connect', - 'sybase_data_seek', - 'sybase_fetch_array', - 'sybase_fetch_assoc', - 'sybase_fetch_field', - 'sybase_fetch_object', - 'sybase_fetch_row', - 'sybase_field_seek', - 'sybase_free_result', - 'sybase_num_fields', - 'sybase_num_rows', - 'sybase_pconnect', - 'sybase_query', - 'sybase_result', - 'sybase_select_db', - 'sybase_set_message_handler', - 'sybase_unbuffered_query', - 'tmpfile', - 'udm_add_search_limit', - 'udm_alloc_agent', - 'udm_alloc_agent_array', - 'udm_cat_list', - 'udm_cat_path', - 'udm_check_charset', - 'udm_clear_search_limits', - 'udm_crc32', - 'udm_errno', - 'udm_error', - 'udm_find', - 'udm_free_agent', - 'udm_free_res', - 'udm_get_doc_count', - 'udm_get_res_field', - 'udm_get_res_param', - 'udm_hash32', - 'udm_load_ispell_data', - 'udm_set_agent_param', - 'unlink', - 'vfprintf', - 'w32api_init_dtype', - 'wddx_add_vars', - 'wddx_packet_end', - 'wddx_packet_start', - 'xml_get_current_byte_index', - 'xml_get_current_column_number', - 'xml_get_current_line_number', - 'xml_get_error_code', - 'xml_parse', - 'xml_parse_into_struct', - 'xml_parser_create', - 'xml_parser_create_ns', - 'xml_parser_free', - 'xml_parser_get_option', - 'xml_parser_set_option', - 'xml_set_character_data_handler', - 'xml_set_default_handler', - 'xml_set_element_handler', - 'xml_set_end_namespace_decl_handler', - 'xml_set_external_entity_ref_handler', - 'xml_set_notation_decl_handler', - 'xml_set_object', - 'xml_set_processing_instruction_handler', - 'xml_set_start_namespace_decl_handler', - 'xml_set_unparsed_entity_decl_handler', - 'xmlrpc_server_add_introspection_data', - 'xmlrpc_server_call_method', - 'xmlrpc_server_create', - 'xmlrpc_server_destroy', - 'xmlrpc_server_register_introspection_callback', - 'xmlrpc_server_register_method', - 'xmlwriter_end_attribute', - 'xmlwriter_end_cdata', - 'xmlwriter_end_comment', - 'xmlwriter_end_document', - 'xmlwriter_end_dtd', - 'xmlwriter_end_dtd_attlist', - 'xmlwriter_end_dtd_element', - 'xmlwriter_end_dtd_entity', - 'xmlwriter_end_element', - 'xmlwriter_end_pi', - 'xmlwriter_flush', - 'xmlwriter_full_end_element', - 'xmlwriter_open_memory', - 'xmlwriter_open_uri', - 'xmlwriter_output_memory', - 'xmlwriter_set_indent', - 'xmlwriter_set_indent_string', - 'xmlwriter_start_attribute', - 'xmlwriter_start_attribute_ns', - 'xmlwriter_start_cdata', - 'xmlwriter_start_comment', - 'xmlwriter_start_document', - 'xmlwriter_start_dtd', - 'xmlwriter_start_dtd_attlist', - 'xmlwriter_start_dtd_element', - 'xmlwriter_start_dtd_entity', - 'xmlwriter_start_element', - 'xmlwriter_start_element_ns', - 'xmlwriter_start_pi', - 'xmlwriter_text', - 'xmlwriter_write_attribute', - 'xmlwriter_write_attribute_ns', - 'xmlwriter_write_cdata', - 'xmlwriter_write_comment', - 'xmlwriter_write_dtd', - 'xmlwriter_write_dtd_attlist', - 'xmlwriter_write_dtd_element', - 'xmlwriter_write_dtd_entity', - 'xmlwriter_write_element', - 'xmlwriter_write_element_ns', - 'xmlwriter_write_pi', - 'xmlwriter_write_raw', - 'xslt_create', - 'yaz_addinfo', - 'yaz_ccl_conf', - 'yaz_ccl_parse', - 'yaz_close', - 'yaz_database', - 'yaz_element', - 'yaz_errno', - 'yaz_error', - 'yaz_es', - 'yaz_es_result', - 'yaz_get_option', - 'yaz_hits', - 'yaz_itemorder', - 'yaz_present', - 'yaz_range', - 'yaz_record', - 'yaz_scan', - 'yaz_scan_result', - 'yaz_schema', - 'yaz_search', - 'yaz_sort', - 'yaz_syntax', - 'zip_close', - 'zip_entry_close', - 'zip_entry_compressedsize', - 'zip_entry_compressionmethod', - 'zip_entry_filesize', - 'zip_entry_name', - 'zip_entry_open', - 'zip_entry_read', - 'zip_open', - 'zip_read', - ]; - } -} diff --git a/vendor/sebastian/type/.gitattributes b/vendor/sebastian/type/.gitattributes deleted file mode 100644 index ed5bfa1..0000000 --- a/vendor/sebastian/type/.gitattributes +++ /dev/null @@ -1,11 +0,0 @@ -/.github export-ignore -/.phive export-ignore -/.psalm export-ignore -/.php_cs.dist export-ignore -/build.xml export-ignore -/phpunit.xml export-ignore -/tests export-ignore -/tools export-ignore -/tools/* binary - -*.php diff=php diff --git a/vendor/sebastian/type/.gitignore b/vendor/sebastian/type/.gitignore deleted file mode 100644 index 96c0f28..0000000 --- a/vendor/sebastian/type/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/.idea -/.php_cs -/.php_cs.cache -/.phpunit.result.cache -/composer.lock -/vendor diff --git a/vendor/sebastian/type/ChangeLog.md b/vendor/sebastian/type/ChangeLog.md deleted file mode 100644 index 6f441de..0000000 --- a/vendor/sebastian/type/ChangeLog.md +++ /dev/null @@ -1,83 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [2.2.1] - 2020-07-05 - -### Fixed - -* Fixed handling of `mixed` type in `ReflectionMapper::fromMethodReturnType()` - -## [2.2.0] - 2020-07-05 - -### Added - -* Added `MixedType` object for representing PHP 8's `mixed` type - -## [2.1.1] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [2.1.0] - 2020-06-01 - -### Added - -* Added `UnionType` object for representing PHP 8's Union Types -* Added `ReflectionMapper::fromMethodReturnType()` for mapping `\ReflectionMethod::getReturnType()` to a `Type` object -* Added `Type::name()` for retrieving the name of a type -* Added `Type::asString()` for retrieving a textual representation of a type - -### Changed - -* Deprecated `Type::getReturnTypeDeclaration()` (use `Type::asString()` instead and prefix its result with `': '`) -* Deprecated `TypeName::getNamespaceName()` (use `TypeName::namespaceName()` instead) -* Deprecated `TypeName::getSimpleName()` (use `TypeName::simpleName()` instead) -* Deprecated `TypeName::getQualifiedName()` (use `TypeName::qualifiedName()` instead) - -## [2.0.0] - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 7.2 - -## [1.1.3] - 2019-07-02 - -### Fixed - -* Fixed class name comparison in `ObjectType` to be case-insensitive - -## [1.1.2] - 2019-06-19 - -### Fixed - -* Fixed handling of `object` type - -## [1.1.1] - 2019-06-08 - -### Fixed - -* Fixed autoloading of `callback_function.php` fixture file - -## [1.1.0] - 2019-06-07 - -### Added - -* Added support for `callable` type -* Added support for `iterable` type - -## [1.0.0] - 2019-06-06 - -* Initial release based on [code contributed by Michel Hartmann to PHPUnit](https://github.com/sebastianbergmann/phpunit/pull/3673) - -[2.2.1]: https://github.com/sebastianbergmann/type/compare/2.2.0...2.2.1 -[2.2.0]: https://github.com/sebastianbergmann/type/compare/2.1.1...2.2.0 -[2.1.1]: https://github.com/sebastianbergmann/type/compare/2.1.0...2.1.1 -[2.1.0]: https://github.com/sebastianbergmann/type/compare/2.0.0...2.1.0 -[2.0.0]: https://github.com/sebastianbergmann/type/compare/1.1.3...2.0.0 -[1.1.3]: https://github.com/sebastianbergmann/type/compare/1.1.2...1.1.3 -[1.1.2]: https://github.com/sebastianbergmann/type/compare/1.1.1...1.1.2 -[1.1.1]: https://github.com/sebastianbergmann/type/compare/1.1.0...1.1.1 -[1.1.0]: https://github.com/sebastianbergmann/type/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/sebastianbergmann/type/compare/ff74aa41746bd8d10e931843ebf37d42da513ede...1.0.0 diff --git a/vendor/sebastian/type/LICENSE b/vendor/sebastian/type/LICENSE deleted file mode 100644 index b840591..0000000 --- a/vendor/sebastian/type/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -sebastian/type - -Copyright (c) 2019-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/type/README.md b/vendor/sebastian/type/README.md deleted file mode 100644 index 1036ce7..0000000 --- a/vendor/sebastian/type/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# sebastian/type - -[![CI Status](https://github.com/sebastianbergmann/type/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/type/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/type/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/type) - -Collection of value objects that represent the types of the PHP type system. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/type -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/type -``` diff --git a/vendor/sebastian/type/composer.json b/vendor/sebastian/type/composer.json deleted file mode 100644 index ee414e7..0000000 --- a/vendor/sebastian/type/composer.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "sebastian/type", - "description": "Collection of value objects that represent the types of the PHP type system", - "type": "library", - "homepage": "https://github.com/sebastianbergmann/type", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues" - }, - "prefer-stable": true, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.2" - }, - "config": { - "platform": { - "php": "7.3.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_fixture" - ], - "files": [ - "tests/_fixture/callback_function.php" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - } - } -} diff --git a/vendor/sebastian/type/src/CallableType.php b/vendor/sebastian/type/src/CallableType.php deleted file mode 100644 index 026762e..0000000 --- a/vendor/sebastian/type/src/CallableType.php +++ /dev/null @@ -1,197 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function assert; -use function class_exists; -use function count; -use function explode; -use function function_exists; -use function is_array; -use function is_object; -use function is_string; -use function strpos; -use Closure; -use ReflectionClass; -use ReflectionException; -use ReflectionObject; - -final class CallableType extends Type -{ - /** - * @var bool - */ - private $allowsNull; - - public function __construct(bool $nullable) - { - $this->allowsNull = $nullable; - } - - /** - * @throws RuntimeException - */ - public function isAssignable(Type $other): bool - { - if ($this->allowsNull && $other instanceof NullType) { - return true; - } - - if ($other instanceof self) { - return true; - } - - if ($other instanceof ObjectType) { - if ($this->isClosure($other)) { - return true; - } - - if ($this->hasInvokeMethod($other)) { - return true; - } - } - - if ($other instanceof SimpleType) { - if ($this->isFunction($other)) { - return true; - } - - if ($this->isClassCallback($other)) { - return true; - } - - if ($this->isObjectCallback($other)) { - return true; - } - } - - return false; - } - - public function name(): string - { - return 'callable'; - } - - public function allowsNull(): bool - { - return $this->allowsNull; - } - - private function isClosure(ObjectType $type): bool - { - return !$type->className()->isNamespaced() && $type->className()->simpleName() === Closure::class; - } - - /** - * @throws RuntimeException - */ - private function hasInvokeMethod(ObjectType $type): bool - { - $className = $type->className()->qualifiedName(); - assert(class_exists($className)); - - try { - $class = new ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - // @codeCoverageIgnoreEnd - } - - if ($class->hasMethod('__invoke')) { - return true; - } - - return false; - } - - private function isFunction(SimpleType $type): bool - { - if (!is_string($type->value())) { - return false; - } - - return function_exists($type->value()); - } - - private function isObjectCallback(SimpleType $type): bool - { - if (!is_array($type->value())) { - return false; - } - - if (count($type->value()) !== 2) { - return false; - } - - if (!is_object($type->value()[0]) || !is_string($type->value()[1])) { - return false; - } - - [$object, $methodName] = $type->value(); - - return (new ReflectionObject($object))->hasMethod($methodName); - } - - private function isClassCallback(SimpleType $type): bool - { - if (!is_string($type->value()) && !is_array($type->value())) { - return false; - } - - if (is_string($type->value())) { - if (strpos($type->value(), '::') === false) { - return false; - } - - [$className, $methodName] = explode('::', $type->value()); - } - - if (is_array($type->value())) { - if (count($type->value()) !== 2) { - return false; - } - - if (!is_string($type->value()[0]) || !is_string($type->value()[1])) { - return false; - } - - [$className, $methodName] = $type->value(); - } - - assert(isset($className) && is_string($className) && class_exists($className)); - assert(isset($methodName) && is_string($methodName)); - - try { - $class = new ReflectionClass($className); - - if ($class->hasMethod($methodName)) { - $method = $class->getMethod($methodName); - - return $method->isPublic() && $method->isStatic(); - } - // @codeCoverageIgnoreStart - } catch (ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - // @codeCoverageIgnoreEnd - } - - return false; - } -} diff --git a/vendor/sebastian/type/src/GenericObjectType.php b/vendor/sebastian/type/src/GenericObjectType.php deleted file mode 100644 index 6871008..0000000 --- a/vendor/sebastian/type/src/GenericObjectType.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class GenericObjectType extends Type -{ - /** - * @var bool - */ - private $allowsNull; - - public function __construct(bool $nullable) - { - $this->allowsNull = $nullable; - } - - public function isAssignable(Type $other): bool - { - if ($this->allowsNull && $other instanceof NullType) { - return true; - } - - if (!$other instanceof ObjectType) { - return false; - } - - return true; - } - - public function name(): string - { - return 'object'; - } - - public function allowsNull(): bool - { - return $this->allowsNull; - } -} diff --git a/vendor/sebastian/type/src/IterableType.php b/vendor/sebastian/type/src/IterableType.php deleted file mode 100644 index c5bc662..0000000 --- a/vendor/sebastian/type/src/IterableType.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function assert; -use function class_exists; -use function is_iterable; -use ReflectionClass; -use ReflectionException; - -final class IterableType extends Type -{ - /** - * @var bool - */ - private $allowsNull; - - public function __construct(bool $nullable) - { - $this->allowsNull = $nullable; - } - - /** - * @throws RuntimeException - */ - public function isAssignable(Type $other): bool - { - if ($this->allowsNull && $other instanceof NullType) { - return true; - } - - if ($other instanceof self) { - return true; - } - - if ($other instanceof SimpleType) { - return is_iterable($other->value()); - } - - if ($other instanceof ObjectType) { - $className = $other->className()->qualifiedName(); - assert(class_exists($className)); - - try { - return (new ReflectionClass($className))->isIterable(); - // @codeCoverageIgnoreStart - } catch (ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - // @codeCoverageIgnoreEnd - } - } - - return false; - } - - public function name(): string - { - return 'iterable'; - } - - public function allowsNull(): bool - { - return $this->allowsNull; - } -} diff --git a/vendor/sebastian/type/src/MixedType.php b/vendor/sebastian/type/src/MixedType.php deleted file mode 100644 index 7ad9191..0000000 --- a/vendor/sebastian/type/src/MixedType.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class MixedType extends Type -{ - public function isAssignable(Type $other): bool - { - return !$other instanceof VoidType; - } - - public function asString(): string - { - return 'mixed'; - } - - public function name(): string - { - return 'mixed'; - } - - public function allowsNull(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/NullType.php b/vendor/sebastian/type/src/NullType.php deleted file mode 100644 index 8481fce..0000000 --- a/vendor/sebastian/type/src/NullType.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class NullType extends Type -{ - public function isAssignable(Type $other): bool - { - return !($other instanceof VoidType); - } - - public function name(): string - { - return 'null'; - } - - public function asString(): string - { - return 'null'; - } - - /** - * @deprecated - * - * @codeCoverageIgnore - */ - public function getReturnTypeDeclaration(): string - { - return ''; - } - - public function allowsNull(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/ObjectType.php b/vendor/sebastian/type/src/ObjectType.php deleted file mode 100644 index c71273c..0000000 --- a/vendor/sebastian/type/src/ObjectType.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function is_subclass_of; -use function strcasecmp; - -final class ObjectType extends Type -{ - /** - * @var TypeName - */ - private $className; - - /** - * @var bool - */ - private $allowsNull; - - public function __construct(TypeName $className, bool $allowsNull) - { - $this->className = $className; - $this->allowsNull = $allowsNull; - } - - public function isAssignable(Type $other): bool - { - if ($this->allowsNull && $other instanceof NullType) { - return true; - } - - if ($other instanceof self) { - if (0 === strcasecmp($this->className->qualifiedName(), $other->className->qualifiedName())) { - return true; - } - - if (is_subclass_of($other->className->qualifiedName(), $this->className->qualifiedName(), true)) { - return true; - } - } - - return false; - } - - public function name(): string - { - return $this->className->qualifiedName(); - } - - public function allowsNull(): bool - { - return $this->allowsNull; - } - - public function className(): TypeName - { - return $this->className; - } -} diff --git a/vendor/sebastian/type/src/ReflectionMapper.php b/vendor/sebastian/type/src/ReflectionMapper.php deleted file mode 100644 index b8c5d46..0000000 --- a/vendor/sebastian/type/src/ReflectionMapper.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function assert; -use function sprintf; -use ReflectionMethod; -use ReflectionNamedType; -use ReflectionUnionType; - -final class ReflectionMapper -{ - public function fromMethodReturnType(ReflectionMethod $method): Type - { - if (!$method->hasReturnType()) { - return new UnknownType; - } - - $returnType = $method->getReturnType(); - - assert($returnType instanceof ReflectionNamedType || $returnType instanceof ReflectionUnionType); - - if ($returnType instanceof ReflectionNamedType) { - if ($returnType->getName() === 'self') { - return ObjectType::fromName( - $method->getDeclaringClass()->getName(), - $returnType->allowsNull() - ); - } - - if ($returnType->getName() === 'mixed') { - return new MixedType; - } - - if ($returnType->getName() === 'parent') { - $parentClass = $method->getDeclaringClass()->getParentClass(); - - // @codeCoverageIgnoreStart - if ($parentClass === false) { - throw new RuntimeException( - sprintf( - '%s::%s() has a "parent" return type declaration but %s does not have a parent class', - $method->getDeclaringClass()->getName(), - $method->getName(), - $method->getDeclaringClass()->getName() - ) - ); - } - // @codeCoverageIgnoreEnd - - return ObjectType::fromName( - $parentClass->getName(), - $returnType->allowsNull() - ); - } - - return Type::fromName( - $returnType->getName(), - $returnType->allowsNull() - ); - } - - $types = []; - - foreach ($returnType->getTypes() as $type) { - if ($type->getName() === 'self') { - $types[] = ObjectType::fromName( - $method->getDeclaringClass()->getName(), - false - ); - } else { - $types[] = Type::fromName($type->getName(), false); - } - } - - return new UnionType(...$types); - } -} diff --git a/vendor/sebastian/type/src/SimpleType.php b/vendor/sebastian/type/src/SimpleType.php deleted file mode 100644 index dbb4f0c..0000000 --- a/vendor/sebastian/type/src/SimpleType.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function strtolower; - -final class SimpleType extends Type -{ - /** - * @var string - */ - private $name; - - /** - * @var bool - */ - private $allowsNull; - - /** - * @var mixed - */ - private $value; - - public function __construct(string $name, bool $nullable, $value = null) - { - $this->name = $this->normalize($name); - $this->allowsNull = $nullable; - $this->value = $value; - } - - public function isAssignable(Type $other): bool - { - if ($this->allowsNull && $other instanceof NullType) { - return true; - } - - if ($other instanceof self) { - return $this->name === $other->name; - } - - return false; - } - - public function name(): string - { - return $this->name; - } - - public function allowsNull(): bool - { - return $this->allowsNull; - } - - public function value() - { - return $this->value; - } - - private function normalize(string $name): string - { - $name = strtolower($name); - - switch ($name) { - case 'boolean': - return 'bool'; - - case 'real': - case 'double': - return 'float'; - - case 'integer': - return 'int'; - - case '[]': - return 'array'; - - default: - return $name; - } - } -} diff --git a/vendor/sebastian/type/src/Type.php b/vendor/sebastian/type/src/Type.php deleted file mode 100644 index cf64923..0000000 --- a/vendor/sebastian/type/src/Type.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function get_class; -use function gettype; -use function strtolower; - -abstract class Type -{ - public static function fromValue($value, bool $allowsNull): self - { - $typeName = gettype($value); - - if ($typeName === 'object') { - return new ObjectType(TypeName::fromQualifiedName(get_class($value)), $allowsNull); - } - - $type = self::fromName($typeName, $allowsNull); - - if ($type instanceof SimpleType) { - $type = new SimpleType($typeName, $allowsNull, $value); - } - - return $type; - } - - public static function fromName(string $typeName, bool $allowsNull): self - { - switch (strtolower($typeName)) { - case 'callable': - return new CallableType($allowsNull); - - case 'iterable': - return new IterableType($allowsNull); - - case 'null': - return new NullType; - - case 'object': - return new GenericObjectType($allowsNull); - - case 'unknown type': - return new UnknownType; - - case 'void': - return new VoidType; - - case 'array': - case 'bool': - case 'boolean': - case 'double': - case 'float': - case 'int': - case 'integer': - case 'real': - case 'resource': - case 'resource (closed)': - case 'string': - return new SimpleType($typeName, $allowsNull); - - default: - return new ObjectType(TypeName::fromQualifiedName($typeName), $allowsNull); - } - } - - public function asString(): string - { - return ($this->allowsNull() ? '?' : '') . $this->name(); - } - - /** - * @deprecated - * - * @codeCoverageIgnore - */ - public function getReturnTypeDeclaration(): string - { - return ': ' . $this->asString(); - } - - abstract public function isAssignable(Type $other): bool; - - abstract public function name(): string; - - abstract public function allowsNull(): bool; -} diff --git a/vendor/sebastian/type/src/TypeName.php b/vendor/sebastian/type/src/TypeName.php deleted file mode 100644 index b076e89..0000000 --- a/vendor/sebastian/type/src/TypeName.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function array_pop; -use function explode; -use function implode; -use function substr; -use ReflectionClass; - -final class TypeName -{ - /** - * @var ?string - */ - private $namespaceName; - - /** - * @var string - */ - private $simpleName; - - public static function fromQualifiedName(string $fullClassName): self - { - if ($fullClassName[0] === '\\') { - $fullClassName = substr($fullClassName, 1); - } - - $classNameParts = explode('\\', $fullClassName); - - $simpleName = array_pop($classNameParts); - $namespaceName = implode('\\', $classNameParts); - - return new self($namespaceName, $simpleName); - } - - public static function fromReflection(ReflectionClass $type): self - { - return new self( - $type->getNamespaceName(), - $type->getShortName() - ); - } - - public function __construct(?string $namespaceName, string $simpleName) - { - if ($namespaceName === '') { - $namespaceName = null; - } - - $this->namespaceName = $namespaceName; - $this->simpleName = $simpleName; - } - - public function namespaceName(): ?string - { - return $this->namespaceName; - } - - public function simpleName(): string - { - return $this->simpleName; - } - - public function qualifiedName(): string - { - return $this->namespaceName === null - ? $this->simpleName - : $this->namespaceName . '\\' . $this->simpleName; - } - - /** - * @deprecated Use namespaceName() instead - * - * @codeCoverageIgnore - */ - public function getNamespaceName(): ?string - { - return $this->namespaceName(); - } - - /** - * @deprecated Use simpleName() instead - * - * @codeCoverageIgnore - */ - public function getSimpleName(): string - { - return $this->simpleName(); - } - - /** - * @deprecated Use qualifiedName() instead - * - * @codeCoverageIgnore - */ - public function getQualifiedName(): string - { - return $this->qualifiedName(); - } - - public function isNamespaced(): bool - { - return $this->namespaceName !== null; - } -} diff --git a/vendor/sebastian/type/src/UnionType.php b/vendor/sebastian/type/src/UnionType.php deleted file mode 100644 index 10c4a49..0000000 --- a/vendor/sebastian/type/src/UnionType.php +++ /dev/null @@ -1,115 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function count; -use function implode; -use function sort; - -final class UnionType extends Type -{ - /** - * @psalm-var list - */ - private $types; - - /** - * @throws RuntimeException - */ - public function __construct(Type ...$types) - { - $this->ensureMinimumOfTwoTypes(...$types); - $this->ensureOnlyValidTypes(...$types); - - $this->types = $types; - } - - public function isAssignable(Type $other): bool - { - foreach ($this->types as $type) { - if ($type->isAssignable($other)) { - return true; - } - } - - return false; - } - - public function asString(): string - { - return $this->name(); - } - - /** - * @deprecated - * - * @codeCoverageIgnore - */ - public function getReturnTypeDeclaration(): string - { - return ': ' . $this->name(); - } - - public function name(): string - { - $types = []; - - foreach ($this->types as $type) { - $types[] = $type->name(); - } - - sort($types); - - return implode('|', $types); - } - - public function allowsNull(): bool - { - foreach ($this->types as $type) { - if ($type instanceof NullType) { - return true; - } - } - - return false; - } - - /** - * @throws RuntimeException - */ - private function ensureMinimumOfTwoTypes(Type ...$types): void - { - if (count($types) < 2) { - throw new RuntimeException( - 'A union type must be composed of at least two types' - ); - } - } - - /** - * @throws RuntimeException - */ - private function ensureOnlyValidTypes(Type ...$types): void - { - foreach ($types as $type) { - if ($type instanceof UnknownType) { - throw new RuntimeException( - 'A union type must not be composed of an unknown type' - ); - } - - if ($type instanceof VoidType) { - throw new RuntimeException( - 'A union type must not be composed of a void type' - ); - } - } - } -} diff --git a/vendor/sebastian/type/src/UnknownType.php b/vendor/sebastian/type/src/UnknownType.php deleted file mode 100644 index dde4c67..0000000 --- a/vendor/sebastian/type/src/UnknownType.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class UnknownType extends Type -{ - public function isAssignable(Type $other): bool - { - return true; - } - - public function name(): string - { - return 'unknown type'; - } - - public function asString(): string - { - return ''; - } - - /** - * @deprecated - * - * @codeCoverageIgnore - */ - public function getReturnTypeDeclaration(): string - { - return ''; - } - - public function allowsNull(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/VoidType.php b/vendor/sebastian/type/src/VoidType.php deleted file mode 100644 index 18c0175..0000000 --- a/vendor/sebastian/type/src/VoidType.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class VoidType extends Type -{ - public function isAssignable(Type $other): bool - { - return $other instanceof self; - } - - public function name(): string - { - return 'void'; - } - - public function allowsNull(): bool - { - return false; - } -} diff --git a/vendor/sebastian/type/src/exception/Exception.php b/vendor/sebastian/type/src/exception/Exception.php deleted file mode 100644 index 9f0de24..0000000 --- a/vendor/sebastian/type/src/exception/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -interface Exception -{ -} diff --git a/vendor/sebastian/type/src/exception/RuntimeException.php b/vendor/sebastian/type/src/exception/RuntimeException.php deleted file mode 100644 index 4dfea6a..0000000 --- a/vendor/sebastian/type/src/exception/RuntimeException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/sebastian/version/.gitattributes b/vendor/sebastian/version/.gitattributes deleted file mode 100644 index 54b8953..0000000 --- a/vendor/sebastian/version/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -/.github export-ignore -/.php_cs.dist export-ignore - -*.php diff=php diff --git a/vendor/sebastian/version/.gitignore b/vendor/sebastian/version/.gitignore deleted file mode 100644 index ff5ec9a..0000000 --- a/vendor/sebastian/version/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/.php_cs.cache -/.idea diff --git a/vendor/sebastian/version/LICENSE b/vendor/sebastian/version/LICENSE deleted file mode 100644 index aa6bca2..0000000 --- a/vendor/sebastian/version/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -Version - -Copyright (c) 2013-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/version/README.md b/vendor/sebastian/version/README.md deleted file mode 100644 index 2864c81..0000000 --- a/vendor/sebastian/version/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Version - -**Version** is a library that helps with managing the version number of Git-hosted PHP projects. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require sebastian/version - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev sebastian/version - -## Usage - -The constructor of the `SebastianBergmann\Version` class expects two parameters: - -* `$release` is the version number of the latest release (`X.Y.Z`, for instance) or the name of the release series (`X.Y`) when no release has been made from that branch / for that release series yet. -* `$path` is the path to the directory (or a subdirectory thereof) where the sourcecode of the project can be found. Simply passing `__DIR__` here usually suffices. - -Apart from the constructor, the `SebastianBergmann\Version` class has a single public method: `getVersion()`. - -Here is a contrived example that shows the basic usage: - - getVersion()); - ?> - - string(18) "3.7.10-17-g00f3408" - -When a new release is prepared, the string that is passed to the constructor as the first argument needs to be updated. - -### How SebastianBergmann\Version::getVersion() works - -* If `$path` is not (part of) a Git repository and `$release` is in `X.Y.Z` format then `$release` is returned as-is. -* If `$path` is not (part of) a Git repository and `$release` is in `X.Y` format then `$release` is returned suffixed with `-dev`. -* If `$path` is (part of) a Git repository and `$release` is in `X.Y.Z` format then the output of `git describe --tags` is returned as-is. -* If `$path` is (part of) a Git repository and `$release` is in `X.Y` format then a string is returned that begins with `X.Y` and ends with information from `git describe --tags`. diff --git a/vendor/sebastian/version/composer.json b/vendor/sebastian/version/composer.json deleted file mode 100644 index e33d4d6..0000000 --- a/vendor/sebastian/version/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "sebastian/version", - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues" - }, - "config": { - "platform": { - "php": "7.3.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "prefer-stable": true, - "require": { - "php": "^7.3 || ^8.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - } -} diff --git a/vendor/sebastian/version/src/Version.php b/vendor/sebastian/version/src/Version.php deleted file mode 100644 index 53ae789..0000000 --- a/vendor/sebastian/version/src/Version.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace SebastianBergmann; - -final class Version -{ - /** - * @var string - */ - private $path; - - /** - * @var string - */ - private $release; - - /** - * @var string - */ - private $version; - - public function __construct(string $release, string $path) - { - $this->release = $release; - $this->path = $path; - } - - public function getVersion(): string - { - if ($this->version === null) { - if (\substr_count($this->release, '.') + 1 === 3) { - $this->version = $this->release; - } else { - $this->version = $this->release . '-dev'; - } - - $git = $this->getGitInformation($this->path); - - if ($git) { - if (\substr_count($this->release, '.') + 1 === 3) { - $this->version = $git; - } else { - $git = \explode('-', $git); - - $this->version = $this->release . '-' . \end($git); - } - } - } - - return $this->version; - } - - /** - * @return bool|string - */ - private function getGitInformation(string $path) - { - if (!\is_dir($path . DIRECTORY_SEPARATOR . '.git')) { - return false; - } - - $process = \proc_open( - 'git describe --tags', - [ - 1 => ['pipe', 'w'], - 2 => ['pipe', 'w'], - ], - $pipes, - $path - ); - - if (!\is_resource($process)) { - return false; - } - - $result = \trim(\stream_get_contents($pipes[1])); - - \fclose($pipes[1]); - \fclose($pipes[2]); - - $returnCode = \proc_close($process); - - if ($returnCode !== 0) { - return false; - } - - return $result; - } -} diff --git a/vendor/squizlabs/php_codesniffer/.cspell.json b/vendor/squizlabs/php_codesniffer/.cspell.json deleted file mode 100644 index a495f45..0000000 --- a/vendor/squizlabs/php_codesniffer/.cspell.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "language": "en-GB", - "dictionaries": ["php"], - "allowCompoundWords": true, - "ignorePaths": [ - "src/Standards/*/Tests/*/*.{inc,js,css}", - "src/Standards/*/Tests/*/*.{inc,js,css}.fixed" - ], - "ignoreRegExpList": ["email", "^\\s+\\*\\s+@(author|copyright)\\s+.*$"], - "words": [ - "analyzer", - "analyzing", - "asperand", - "autoload", - "autoloaded", - "autoloaders", - "autoloading", - "basepath", - "bom", - "changeset", - "changesets", - "checkstyle", - "codesniffer", - "cyclomatic", - "cygwin", - "decrementor", - "devnull", - "dnumber", - "docblock", - "encapsed", - "gjslint", - "groupid", - "gsjlint", - "hashbang", - "heredoc", - "hgblame", - "jquery", - "junit", - "kernighan", - "lnumber", - "markup", - "minified", - "mins", - "nekudotayim", - "nowdoc", - "paamayim", - "pcre", - "php's", - "phpcbf", - "phpcs", - "phpunit", - "recurse", - "recurses", - "refs", - "retval", - "ruleset", - "rulesets", - "secs", - "squiz", - "standard's", - "stty", - "studly", - "symlink", - "symlinks", - "tokeniser", - "tostring", - "unary", - "wnohang", - "xmlwriter", - "yoda" - ] -} diff --git a/vendor/squizlabs/php_codesniffer/.gitattributes b/vendor/squizlabs/php_codesniffer/.gitattributes deleted file mode 100644 index 56dcc5d..0000000 --- a/vendor/squizlabs/php_codesniffer/.gitattributes +++ /dev/null @@ -1,5 +0,0 @@ -.travis.yml export-ignore -package.xml export-ignore -phpunit.xml.dist export-ignore -php5-testingConfig.ini export-ignore -php7-testingConfig.ini export-ignore diff --git a/vendor/squizlabs/php_codesniffer/.gitignore b/vendor/squizlabs/php_codesniffer/.gitignore deleted file mode 100644 index 9965895..0000000 --- a/vendor/squizlabs/php_codesniffer/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/CodeSniffer.conf -/phpcs.xml -/phpunit.xml -.idea/* -/vendor/ -composer.lock diff --git a/vendor/squizlabs/php_codesniffer/CONTRIBUTING.md b/vendor/squizlabs/php_codesniffer/CONTRIBUTING.md deleted file mode 100644 index 5cc7363..0000000 --- a/vendor/squizlabs/php_codesniffer/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -Contributing -------------- - -Before you contribute code to PHP\_CodeSniffer, please make sure it conforms to the PHPCS coding standard and that the PHP\_CodeSniffer unit tests still pass. The easiest way to contribute is to work on a checkout of the repository, or your own fork, rather than an installed PEAR version. If you do this, you can run the following commands to check if everything is ready to submit: - - cd PHP_CodeSniffer - php bin/phpcs - -Which should display no coding standard errors. And then: - - phpunit - -Which should give you no failures or errors. You can ignore any skipped tests as these are for external tools. diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer.conf.dist b/vendor/squizlabs/php_codesniffer/CodeSniffer.conf.dist deleted file mode 100644 index 62dc395..0000000 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer.conf.dist +++ /dev/null @@ -1,9 +0,0 @@ - 'PSR2', - 'report_format' => 'summary', - 'show_warnings' => '0', - 'show_progress' => '1', - 'report_width' => '120', -) -?> diff --git a/vendor/squizlabs/php_codesniffer/README.md b/vendor/squizlabs/php_codesniffer/README.md deleted file mode 100644 index 7452f7f..0000000 --- a/vendor/squizlabs/php_codesniffer/README.md +++ /dev/null @@ -1,130 +0,0 @@ -## About - -PHP_CodeSniffer is a set of two PHP scripts; the main `phpcs` script that tokenizes PHP, JavaScript and CSS files to detect violations of a defined coding standard, and a second `phpcbf` script to automatically correct coding standard violations. PHP_CodeSniffer is an essential development tool that ensures your code remains clean and consistent. - -[![Build Status](https://travis-ci.org/squizlabs/PHP_CodeSniffer.svg?branch=phpcs-fixer)](https://travis-ci.org/squizlabs/PHP_CodeSniffer) [![Code consistency](http://squizlabs.github.io/PHP_CodeSniffer/analysis/squizlabs/PHP_CodeSniffer/grade.svg)](http://squizlabs.github.io/PHP_CodeSniffer/analysis/squizlabs/PHP_CodeSniffer) [![Join the chat at https://gitter.im/squizlabs/PHP_CodeSniffer](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/squizlabs/PHP_CodeSniffer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - -## Requirements - -PHP_CodeSniffer requires PHP version 5.4.0 or greater, although individual sniffs may have additional requirements such as external applications and scripts. See the [Configuration Options manual page](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Configuration-Options) for a list of these requirements. - -If you're using PHP_CodeSniffer as part of a team, or you're running it on a [CI](https://en.wikipedia.org/wiki/Continuous_integration) server, you may want to configure your project's settings [using a configuration file](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Advanced-Usage#using-a-default-configuration-file). - - -## Installation - -The easiest way to get started with PHP_CodeSniffer is to download the Phar files for each of the commands: -``` -# Download using curl -curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar -curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar - -# Or download using wget -wget https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar -wget https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar - -# Then test the downloaded PHARs -php phpcs.phar -h -php phpcbf.phar -h -``` - -### Composer -If you use Composer, you can install PHP_CodeSniffer system-wide with the following command: - - composer global require "squizlabs/php_codesniffer=*" - -Make sure you have the composer bin dir in your PATH. The default value is `~/.composer/vendor/bin/`, but you can check the value that you need to use by running `composer global config bin-dir --absolute`. - -Or alternatively, include a dependency for `squizlabs/php_codesniffer` in your `composer.json` file. For example: - -```json -{ - "require-dev": { - "squizlabs/php_codesniffer": "3.*" - } -} -``` - -You will then be able to run PHP_CodeSniffer from the vendor bin directory: - - ./vendor/bin/phpcs -h - ./vendor/bin/phpcbf -h - -### Phive -If you use Phive, you can install PHP_CodeSniffer as a project tool using the following commands: - - phive install phpcs - phive install phpcbf - -You will then be able to run PHP_CodeSniffer from the tools directory: - - ./tools/phpcs -h - ./tools/phpcbf -h - -### PEAR -If you use PEAR, you can install PHP_CodeSniffer using the PEAR installer. This will make the `phpcs` and `phpcbf` commands immediately available for use. To install PHP_CodeSniffer using the PEAR installer, first ensure you have [installed PEAR](http://pear.php.net/manual/en/installation.getting.php) and then run the following command: - - pear install PHP_CodeSniffer - -### Git Clone -You can also download the PHP_CodeSniffer source and run the `phpcs` and `phpcbf` commands directly from the Git clone: - - git clone https://github.com/squizlabs/PHP_CodeSniffer.git - cd PHP_CodeSniffer - php bin/phpcs -h - php bin/phpcbf -h - -## Getting Started - -The default coding standard used by PHP_CodeSniffer is the PEAR coding standard. To check a file against the PEAR coding standard, simply specify the file's location: - - $ phpcs /path/to/code/myfile.php - -Or if you wish to check an entire directory you can specify the directory location instead of a file. - - $ phpcs /path/to/code-directory - -If you wish to check your code against the PSR-2 coding standard, use the `--standard` command line argument: - - $ phpcs --standard=PSR2 /path/to/code-directory - -If PHP_CodeSniffer finds any coding standard errors, a report will be shown after running the command. - -Full usage information and example reports are available on the [usage page](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Usage). - -## Documentation - -The documentation for PHP_CodeSniffer is available on the [Github wiki](https://github.com/squizlabs/PHP_CodeSniffer/wiki). - -## Issues - -Bug reports and feature requests can be submitted on the [Github Issue Tracker](https://github.com/squizlabs/PHP_CodeSniffer/issues). - -## Contributing - -See [CONTRIBUTING.md](CONTRIBUTING.md) for information. - -## Versioning - -PHP_CodeSniffer uses a `MAJOR.MINOR.PATCH` version number format. - -The `MAJOR` version is incremented when: -- backwards-incompatible changes are made to how the `phpcs` or `phpcbf` commands are used, or -- backwards-incompatible changes are made to the `ruleset.xml` format, or -- backwards-incompatible changes are made to the API used by sniff developers, or -- custom PHP_CodeSniffer token types are removed, or -- existing sniffs are removed from PHP_CodeSniffer entirely - -The `MINOR` version is incremented when: -- new backwards-compatible features are added to the `phpcs` and `phpcbf` commands, or -- backwards-compatible changes are made to the `ruleset.xml` format, or -- backwards-compatible changes are made to the API used by sniff developers, or -- new sniffs are added to an included standard, or -- existing sniffs are removed from an included standard - -> NOTE: Backwards-compatible changes to the API used by sniff developers will allow an existing sniff to continue running without producing fatal errors but may not result in the sniff reporting the same errors as it did previously without changes being required. - -The `PATCH` version is incremented when: -- backwards-compatible bug fixes are made - -> NOTE: As PHP_CodeSniffer exists to report and fix issues, most bugs are the result of coding standard errors being incorrectly reported or coding standard errors not being reported when they should be. This means that the messages produced by PHP_CodeSniffer, and the fixes it makes, are likely to be different between PATCH versions. diff --git a/vendor/squizlabs/php_codesniffer/autoload.php b/vendor/squizlabs/php_codesniffer/autoload.php deleted file mode 100644 index 165ff1a..0000000 --- a/vendor/squizlabs/php_codesniffer/autoload.php +++ /dev/null @@ -1,300 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -if (class_exists('PHP_CodeSniffer\Autoload', false) === false) { - class Autoload - { - - /** - * The composer autoloader. - * - * @var \Composer\Autoload\ClassLoader - */ - private static $composerAutoloader = null; - - /** - * A mapping of file names to class names. - * - * @var array - */ - private static $loadedClasses = []; - - /** - * A mapping of class names to file names. - * - * @var array - */ - private static $loadedFiles = []; - - /** - * A list of additional directories to search during autoloading. - * - * This is typically a list of coding standard directories. - * - * @var string[] - */ - private static $searchPaths = []; - - - /** - * Loads a class. - * - * This method only loads classes that exist in the PHP_CodeSniffer namespace. - * All other classes are ignored and loaded by subsequent autoloaders. - * - * @param string $class The name of the class to load. - * - * @return bool - */ - public static function load($class) - { - // Include the composer autoloader if there is one, but re-register it - // so this autoloader runs before the composer one as we need to include - // all files so we can figure out what the class/interface/trait name is. - if (self::$composerAutoloader === null) { - // Make sure we don't try to load any of Composer's classes - // while the autoloader is being setup. - if (strpos($class, 'Composer\\') === 0) { - return; - } - - if (strpos(__DIR__, 'phar://') !== 0 - && @file_exists(__DIR__.'/../../autoload.php') === true - ) { - self::$composerAutoloader = include __DIR__.'/../../autoload.php'; - if (self::$composerAutoloader instanceof \Composer\Autoload\ClassLoader) { - self::$composerAutoloader->unregister(); - self::$composerAutoloader->register(); - } else { - // Something went wrong, so keep going without the autoloader - // although namespaced sniffs might error. - self::$composerAutoloader = false; - } - } else { - self::$composerAutoloader = false; - } - }//end if - - $ds = DIRECTORY_SEPARATOR; - $path = false; - - if (substr($class, 0, 16) === 'PHP_CodeSniffer\\') { - if (substr($class, 0, 22) === 'PHP_CodeSniffer\Tests\\') { - $isInstalled = !is_dir(__DIR__.$ds.'tests'); - if ($isInstalled === false) { - $path = __DIR__.$ds.'tests'; - } else { - $path = '@test_dir@'.$ds.'PHP_CodeSniffer'.$ds.'CodeSniffer'; - } - - $path .= $ds.substr(str_replace('\\', $ds, $class), 22).'.php'; - } else { - $path = __DIR__.$ds.'src'.$ds.substr(str_replace('\\', $ds, $class), 16).'.php'; - } - } - - // See if the composer autoloader knows where the class is. - if ($path === false && self::$composerAutoloader !== false) { - $path = self::$composerAutoloader->findFile($class); - } - - // See if the class is inside one of our alternate search paths. - if ($path === false) { - foreach (self::$searchPaths as $searchPath => $nsPrefix) { - $className = $class; - if ($nsPrefix !== '' && substr($class, 0, strlen($nsPrefix)) === $nsPrefix) { - $className = substr($class, (strlen($nsPrefix) + 1)); - } - - $path = $searchPath.$ds.str_replace('\\', $ds, $className).'.php'; - if (is_file($path) === true) { - break; - } - - $path = false; - } - } - - if ($path !== false && is_file($path) === true) { - self::loadFile($path); - return true; - } - - return false; - - }//end load() - - - /** - * Includes a file and tracks what class or interface was loaded as a result. - * - * @param string $path The path of the file to load. - * - * @return string The fully qualified name of the class in the loaded file. - */ - public static function loadFile($path) - { - if (strpos(__DIR__, 'phar://') !== 0) { - $path = realpath($path); - if ($path === false) { - return false; - } - } - - if (isset(self::$loadedClasses[$path]) === true) { - return self::$loadedClasses[$path]; - } - - $classes = get_declared_classes(); - $interfaces = get_declared_interfaces(); - $traits = get_declared_traits(); - - include $path; - - $className = null; - $newClasses = array_reverse(array_diff(get_declared_classes(), $classes)); - foreach ($newClasses as $name) { - if (isset(self::$loadedFiles[$name]) === false) { - $className = $name; - break; - } - } - - if ($className === null) { - $newClasses = array_reverse(array_diff(get_declared_interfaces(), $interfaces)); - foreach ($newClasses as $name) { - if (isset(self::$loadedFiles[$name]) === false) { - $className = $name; - break; - } - } - } - - if ($className === null) { - $newClasses = array_reverse(array_diff(get_declared_traits(), $traits)); - foreach ($newClasses as $name) { - if (isset(self::$loadedFiles[$name]) === false) { - $className = $name; - break; - } - } - } - - self::$loadedClasses[$path] = $className; - self::$loadedFiles[$className] = $path; - return self::$loadedClasses[$path]; - - }//end loadFile() - - - /** - * Adds a directory to search during autoloading. - * - * @param string $path The path to the directory to search. - * @param string $nsPrefix The namespace prefix used by files under this path. - * - * @return void - */ - public static function addSearchPath($path, $nsPrefix='') - { - self::$searchPaths[$path] = rtrim(trim((string) $nsPrefix), '\\'); - - }//end addSearchPath() - - - /** - * Retrieve the namespaces and paths registered by external standards. - * - * @return array - */ - public static function getSearchPaths() - { - return self::$searchPaths; - - }//end getSearchPaths() - - - /** - * Gets the class name for the given file path. - * - * @param string $path The name of the file. - * - * @throws \Exception If the file path has not been loaded. - * @return string - */ - public static function getLoadedClassName($path) - { - if (isset(self::$loadedClasses[$path]) === false) { - throw new \Exception("Cannot get class name for $path; file has not been included"); - } - - return self::$loadedClasses[$path]; - - }//end getLoadedClassName() - - - /** - * Gets the file path for the given class name. - * - * @param string $class The name of the class. - * - * @throws \Exception If the class name has not been loaded - * @return string - */ - public static function getLoadedFileName($class) - { - if (isset(self::$loadedFiles[$class]) === false) { - throw new \Exception("Cannot get file name for $class; class has not been included"); - } - - return self::$loadedFiles[$class]; - - }//end getLoadedFileName() - - - /** - * Gets the mapping of file names to class names. - * - * @return array - */ - public static function getLoadedClasses() - { - return self::$loadedClasses; - - }//end getLoadedClasses() - - - /** - * Gets the mapping of class names to file names. - * - * @return array - */ - public static function getLoadedFiles() - { - return self::$loadedFiles; - - }//end getLoadedFiles() - - - }//end class - - // Register the autoloader before any existing autoloaders to ensure - // it gets a chance to hear about every autoload request, and record - // the file and class name for it. - spl_autoload_register(__NAMESPACE__.'\Autoload::load', true, true); -}//end if diff --git a/vendor/squizlabs/php_codesniffer/bin/phpcbf b/vendor/squizlabs/php_codesniffer/bin/phpcbf deleted file mode 100755 index 45b43f4..0000000 --- a/vendor/squizlabs/php_codesniffer/bin/phpcbf +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env php - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -if (is_file(__DIR__.'/../autoload.php') === true) { - include_once __DIR__.'/../autoload.php'; -} else { - include_once 'PHP/CodeSniffer/autoload.php'; -} - -$runner = new PHP_CodeSniffer\Runner(); -$exitCode = $runner->runPHPCBF(); -exit($exitCode); diff --git a/vendor/squizlabs/php_codesniffer/bin/phpcbf.bat b/vendor/squizlabs/php_codesniffer/bin/phpcbf.bat deleted file mode 100644 index 5b07a7d..0000000 --- a/vendor/squizlabs/php_codesniffer/bin/phpcbf.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -REM PHP Code Beautifier and Fixer fixes violations of a defined coding standard. -REM -REM @author Greg Sherwood -REM @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) -REM @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - -if "%PHP_PEAR_PHP_BIN%" neq "" ( - set PHPBIN=%PHP_PEAR_PHP_BIN% -) else set PHPBIN=php - -"%PHPBIN%" "%~dp0\phpcbf" %* diff --git a/vendor/squizlabs/php_codesniffer/bin/phpcs b/vendor/squizlabs/php_codesniffer/bin/phpcs deleted file mode 100755 index 52d28cd..0000000 --- a/vendor/squizlabs/php_codesniffer/bin/phpcs +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env php - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -if (is_file(__DIR__.'/../autoload.php') === true) { - include_once __DIR__.'/../autoload.php'; -} else { - include_once 'PHP/CodeSniffer/autoload.php'; -} - -$runner = new PHP_CodeSniffer\Runner(); -$exitCode = $runner->runPHPCS(); -exit($exitCode); diff --git a/vendor/squizlabs/php_codesniffer/bin/phpcs.bat b/vendor/squizlabs/php_codesniffer/bin/phpcs.bat deleted file mode 100755 index 9f9be72..0000000 --- a/vendor/squizlabs/php_codesniffer/bin/phpcs.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -REM PHP_CodeSniffer detects violations of a defined coding standard. -REM -REM @author Greg Sherwood -REM @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) -REM @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - -if "%PHP_PEAR_PHP_BIN%" neq "" ( - set PHPBIN=%PHP_PEAR_PHP_BIN% -) else set PHPBIN=php - -"%PHPBIN%" "%~dp0\phpcs" %* diff --git a/vendor/squizlabs/php_codesniffer/composer.json b/vendor/squizlabs/php_codesniffer/composer.json deleted file mode 100644 index 7605a5d..0000000 --- a/vendor/squizlabs/php_codesniffer/composer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "squizlabs/php_codesniffer", - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "type": "library", - "keywords": [ - "phpcs", - "standards" - ], - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki", - "source": "https://github.com/squizlabs/PHP_CodeSniffer" - }, - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "require": { - "php": ">=5.4.0", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "ext-simplexml": "*" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ] -} diff --git a/vendor/squizlabs/php_codesniffer/licence.txt b/vendor/squizlabs/php_codesniffer/licence.txt deleted file mode 100644 index f95432c..0000000 --- a/vendor/squizlabs/php_codesniffer/licence.txt +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2012, Squiz Pty Ltd (ABN 77 084 670 600) -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Squiz Pty Ltd nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/squizlabs/php_codesniffer/phpcs.xml.dist b/vendor/squizlabs/php_codesniffer/phpcs.xml.dist deleted file mode 100644 index 48cbdd8..0000000 --- a/vendor/squizlabs/php_codesniffer/phpcs.xml.dist +++ /dev/null @@ -1,149 +0,0 @@ - - - The coding standard for PHP_CodeSniffer itself. - - autoload.php - bin - scripts - src - tests - - */src/Standards/*/Tests/*\.(inc|css|js)$ - */tests/Core/*/*Test\.(inc|css|js)$ - - - - - - - - - error - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - error - - - - - error - - - - - tests/bootstrap.php - - - diff --git a/vendor/squizlabs/php_codesniffer/phpcs.xsd b/vendor/squizlabs/php_codesniffer/phpcs.xsd deleted file mode 100644 index d93dd86..0000000 --- a/vendor/squizlabs/php_codesniffer/phpcs.xsd +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/phpstan.neon b/vendor/squizlabs/php_codesniffer/phpstan.neon deleted file mode 100644 index bfd9130..0000000 --- a/vendor/squizlabs/php_codesniffer/phpstan.neon +++ /dev/null @@ -1,16 +0,0 @@ -parameters: - level: 0 - paths: - - src - autoload_files: - - tests/bootstrap.php - ignoreErrors: - - - count: 1 - message: '~^Undefined variable: \$phpCodeSnifferConfig$~' - path: %currentWorkingDirectory%/src/Config.php - - dynamicConstantNames: - - PHP_CODESNIFFER_IN_TESTS - - PHP_CODESNIFFER_CBF - - PHP_CODESNIFFER_VERBOSITY diff --git a/vendor/squizlabs/php_codesniffer/scripts/ValidatePEAR/ValidatePEARPackageXML.php b/vendor/squizlabs/php_codesniffer/scripts/ValidatePEAR/ValidatePEARPackageXML.php deleted file mode 100644 index 11d73bc..0000000 --- a/vendor/squizlabs/php_codesniffer/scripts/ValidatePEAR/ValidatePEARPackageXML.php +++ /dev/null @@ -1,362 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -use PHP_CodeSniffer\Tests\FileList; - -/** - * Validate the PHP_CodeSniffer PEAR package.xml file. - */ -class ValidatePEARPackageXML -{ - - /** - * The root directory of the project. - * - * @var string - */ - protected $projectRoot = ''; - - /** - * The contents of the package.xml file. - * - * @var \SimpleXMLElement - */ - protected $packageXML; - - /** - * List of all files in the repo. - * - * @var array - */ - protected $allFiles = []; - - /** - * Valid file roles. - * - * @var array - * - * @link https://pear.php.net/manual/en/developers.packagedef.intro.php#developers.packagedef.roles - */ - private $validRoles = [ - 'data' => true, - 'doc' => true, - 'ext' => true, - 'extsrc' => true, - 'php' => true, - 'script' => true, - 'src' => true, - 'test' => true, - ]; - - /** - * Files encountered in the package.xml tag. - * - * @var array - */ - private $listedContents = []; - - - /** - * Constructor. - */ - public function __construct() - { - $this->projectRoot = dirname(dirname(__DIR__)).'/'; - $this->packageXML = simplexml_load_file($this->projectRoot.'package.xml'); - - $allFiles = (new FileList($this->projectRoot, $this->projectRoot))->getList(); - $this->allFiles = array_flip($allFiles); - - }//end __construct() - - - /** - * Validate the file listings in the package.xml file. - * - * @return void - */ - public function validate() - { - $exitCode = 0; - if ($this->checkContents() !== true) { - $exitCode = 1; - } - - if ($this->checkPHPRelease() !== true) { - $exitCode = 1; - } - - exit($exitCode); - - }//end validate() - - - /** - * Validate the file listings in the tag. - * - * @return bool - */ - protected function checkContents() - { - echo PHP_EOL.'Checking Contents tag'.PHP_EOL; - echo '====================='.PHP_EOL; - - $valid = true; - - /* - * - Check that every file that is mentioned in the `` tag exists in the repo. - * - Check that the "role" value is valid. - * - Check that the "baseinstalldir" value is valid. - */ - - $valid = $this->walkDirTag($this->packageXML->contents); - if ($valid === true) { - echo "Existing listings in the Contents tag are valid.".PHP_EOL; - } - - /* - * Verify that all files in the `src` and the `tests` directories are listed in the `` tag. - */ - - $srcFiles = (new FileList( - $this->projectRoot.'src/', - $this->projectRoot, - '`\.(css|fixed|inc|js|php|xml)$`Di' - ))->getList(); - $testsFiles = (new FileList( - $this->projectRoot.'tests/', - $this->projectRoot, - '`\.(css|inc|js|php|xml)$`Di' - ))->getList(); - $files = array_merge($srcFiles, $testsFiles); - - foreach ($files as $file) { - if (isset($this->listedContents[$file]) === true) { - continue; - } - - echo "- File '{$file}' is missing from Contents tag.".PHP_EOL; - $valid = false; - } - - if ($valid === true) { - echo "No missing files in the Contents tag.".PHP_EOL; - } - - return $valid; - - }//end checkContents() - - - /** - * Validate all child tags within a

    tag. - * - * @param \SimpleXMLElement $tag The current XML tag to examine. - * @param string $currentDirectory The complete relative path to the - * directory being examined. - * - * @return bool - */ - protected function walkDirTag($tag, $currentDirectory='') - { - $valid = true; - $name = (string) $tag['name']; - if ($name !== '/' && empty($name) === false) { - $currentDirectory .= $name.'/'; - } - - $children = $tag->children(); - foreach ($children as $key => $value) { - if ($key === 'dir') { - if ($this->walkDirTag($value, $currentDirectory) === false) { - $valid = false; - } - } - - if ($key === 'file') { - if ($this->checkFileTag($value, $currentDirectory) === false) { - $valid = false; - } - } - } - - return $valid; - - }//end walkDirTag() - - - /** - * Validate the information within a tag. - * - * @param \SimpleXMLElement $tag The current XML tag to examine. - * @param string $currentDirectory The complete relative path to the - * directory being examined. - * - * @return bool - */ - protected function checkFileTag($tag, $currentDirectory='') - { - $valid = true; - $attributes = $tag->attributes(); - $baseinstalldir = (string) $attributes['baseinstalldir']; - $name = $currentDirectory.(string) $attributes['name']; - $role = (string) $attributes['role']; - - $this->listedContents[$name] = true; - - if (empty($name) === true) { - echo "- Name attribute missing.".PHP_EOL; - $valid = false; - } else { - if (isset($this->allFiles[$name]) === false) { - echo "- File '{$name}' does not exist.".PHP_EOL; - $valid = false; - } - - if (empty($role) === true) { - echo "- Role attribute missing for file '{$name}'.".PHP_EOL; - $valid = false; - } else { - if (isset($this->validRoles[$role]) === false) { - echo "- Role for file '{$name}' is invalid.".PHP_EOL; - $valid = false; - } else { - // Limited validation of the "role" tags. - if (strpos($name, 'Test.') !== false && $role !== 'test') { - echo "- Test files should have the role 'test'. Found: '$role' for file '{$name}'.".PHP_EOL; - $valid = false; - } else if ((strpos($name, 'Standard.xml') !== false || strpos($name, 'Sniff.php') !== false) - && $role !== 'php' - ) { - echo "- Sniff files, including sniff documentation files should have the role 'php'. Found: '$role' for file '{$name}'.".PHP_EOL; - $valid = false; - } - } - - if (empty($baseinstalldir) === true) { - if ($role !== 'script' && strpos($name, 'tests/') !== 0) { - echo "- Baseinstalldir attribute missing for file '{$name}'.".PHP_EOL; - $valid = false; - } - } else { - if ($role === 'script' || strpos($name, 'tests/') === 0) { - echo "- Baseinstalldir for file '{$name}' should be empty.".PHP_EOL; - $valid = false; - } - - if ($role !== 'script' && $baseinstalldir !== 'PHP/CodeSniffer') { - echo "- Baseinstalldir for file '{$name}' is invalid.".PHP_EOL; - $valid = false; - } - } - }//end if - }//end if - - return $valid; - - }//end checkFileTag() - - - /** - * Validate the file listings in the tags. - * - * @return bool True if the info in the "phprelease" tags is valid. False otherwise. - */ - protected function checkPHPRelease() - { - echo PHP_EOL.'Checking PHPRelease tags'.PHP_EOL; - echo '========================'.PHP_EOL; - - $valid = true; - $listedFiles = []; - $releaseTags = 1; - - /* - * - Check that every file that is mentioned in the `` tags exists in the repo. - * - Check that the "as" value is valid. - */ - - foreach ($this->packageXML->phprelease as $release) { - foreach ($release->filelist->install as $install) { - $attributes = $install->attributes(); - $name = (string) $attributes['name']; - $as = (string) $attributes['as']; - - $listedFiles[$releaseTags][$name] = $as; - - if (empty($as) === true || empty($name) === true) { - continue; - } - - if (isset($this->allFiles[$name]) === false) { - echo "- File '{$name}' does not exist.".PHP_EOL; - $valid = false; - } - - // Rest of the checks only apply to the test files. - if (strpos($name, 'tests/') !== 0) { - continue; - } - - // Check validity of the tags for files in the tests root directory. - if (preg_match('`^tests/([^/]+\.php)$`', $name, $matches) === 1 - && ($as === $name || $as === $matches[1]) - ) { - continue; - } - - // Check validity of the tags for files in the tests root subdirectories. - if (preg_match('`^tests/.+\.(php|inc|js|css|xml)$`', $name) === 1 - && $as === str_replace('tests/', 'CodeSniffer/', $name) - ) { - continue; - } - - echo "- Invalid 'as' attribute '{$as}' for test file '{$name}'.".PHP_EOL; - $valid = false; - }//end foreach - - ++$releaseTags; - }//end foreach - - if ($valid === true) { - echo "Existing PHPRelease tags are valid.".PHP_EOL; - } - - /* - * Verify that all files in the `tests` directory are listed in both `` tags. - */ - - $testFiles = (new FileList($this->projectRoot.'tests/', $this->projectRoot, '`\.(inc|php|js|css|xml)$`Di'))->getList(); - - foreach ($testFiles as $file) { - foreach ($listedFiles as $key => $listed) { - if (isset($listed[$file]) === true) { - continue; - } - - echo "- File '{$file}' is missing from PHPRelease tag [{$key}] .".PHP_EOL; - $valid = false; - } - } - - if ($valid === true) { - echo "No missing PHPRelease tags.".PHP_EOL; - } - - return $valid; - - }//end checkPHPRelease() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/scripts/build-phar.php b/vendor/squizlabs/php_codesniffer/scripts/build-phar.php deleted file mode 100644 index 6b2800c..0000000 --- a/vendor/squizlabs/php_codesniffer/scripts/build-phar.php +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env php - - * @author Greg Sherwood - * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - * @link http://pear.php.net/package/PHP_CodeSniffer - */ - -error_reporting(E_ALL | E_STRICT); - -if (ini_get('phar.readonly') === '1') { - echo 'Unable to build, phar.readonly in php.ini is set to read only.'.PHP_EOL; - exit(1); -} - -$scripts = [ - 'phpcs', - 'phpcbf', -]; - -foreach ($scripts as $script) { - echo "Building $script phar".PHP_EOL; - - $pharName = $script.'.phar'; - $pharFile = getcwd().'/'.$pharName; - echo "\t=> $pharFile".PHP_EOL; - if (file_exists($pharFile) === true) { - echo "\t** file exists, removing **".PHP_EOL; - unlink($pharFile); - } - - $phar = new Phar($pharFile, 0, $pharName); - - /* - Add the files. - */ - - echo "\t=> adding files... "; - - $srcDir = realpath(__DIR__.'/../src'); - $srcDirLen = strlen($srcDir); - - $rdi = new \RecursiveDirectoryIterator($srcDir, \RecursiveDirectoryIterator::FOLLOW_SYMLINKS); - $di = new \RecursiveIteratorIterator($rdi, 0, \RecursiveIteratorIterator::CATCH_GET_CHILD); - - foreach ($di as $file) { - $filename = $file->getFilename(); - - // Skip hidden files. - if (substr($filename, 0, 1) === '.') { - continue; - } - - $fullpath = $file->getPathname(); - if (strpos($fullpath, '/Tests/') !== false) { - continue; - } - - $path = 'src'.substr($fullpath, $srcDirLen); - - $phar->addFromString($path, php_strip_whitespace($fullpath)); - } - - // Add autoloader. - $phar->addFromString('autoload.php', php_strip_whitespace(realpath(__DIR__.'/../autoload.php'))); - - // Add licence file. - $phar->addFromString('licence.txt', php_strip_whitespace(realpath(__DIR__.'/../licence.txt'))); - - echo 'done'.PHP_EOL; - - /* - Add the stub. - */ - - echo "\t=> adding stub... "; - $stub = '#!/usr/bin/env php'."\n"; - $stub .= 'run'.$script.'();'."\n"; - $stub .= 'exit($exitCode);'."\n"; - $stub .= '__HALT_COMPILER();'; - $phar->setStub($stub); - - echo 'done'.PHP_EOL; -}//end foreach diff --git a/vendor/squizlabs/php_codesniffer/scripts/validate-pear-package.php b/vendor/squizlabs/php_codesniffer/scripts/validate-pear-package.php deleted file mode 100644 index 1d373f2..0000000 --- a/vendor/squizlabs/php_codesniffer/scripts/validate-pear-package.php +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env php - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -require_once dirname(__DIR__).'/tests/FileList.php'; -require_once __DIR__.'/ValidatePEAR/ValidatePEARPackageXML.php'; - -$validate = new ValidatePEARPackageXML(); -$validate->validate(); diff --git a/vendor/squizlabs/php_codesniffer/src/Config.php b/vendor/squizlabs/php_codesniffer/src/Config.php deleted file mode 100644 index 23b327f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Config.php +++ /dev/null @@ -1,1703 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -use PHP_CodeSniffer\Exceptions\DeepExitException; -use PHP_CodeSniffer\Exceptions\RuntimeException; - -/** - * Stores the configuration used to run PHPCS and PHPCBF. - * - * @property string[] $files The files and directories to check. - * @property string[] $standards The standards being used for checking. - * @property int $verbosity How verbose the output should be. - * 0: no unnecessary output - * 1: basic output for files being checked - * 2: ruleset and file parsing output - * 3: sniff execution output - * @property bool $interactive Enable interactive checking mode. - * @property bool $parallel Check files in parallel. - * @property bool $cache Enable the use of the file cache. - * @property bool $cacheFile A file where the cache data should be written - * @property bool $colors Display colours in output. - * @property bool $explain Explain the coding standards. - * @property bool $local Process local files in directories only (no recursion). - * @property bool $showSources Show sniff source codes in report output. - * @property bool $showProgress Show basic progress information while running. - * @property bool $quiet Quiet mode; disables progress and verbose output. - * @property bool $annotations Process phpcs: annotations. - * @property int $tabWidth How many spaces each tab is worth. - * @property string $encoding The encoding of the files being checked. - * @property string[] $sniffs The sniffs that should be used for checking. - * If empty, all sniffs in the supplied standards will be used. - * @property string[] $exclude The sniffs that should be excluded from checking. - * If empty, all sniffs in the supplied standards will be used. - * @property string[] $ignored Regular expressions used to ignore files and folders during checking. - * @property string $reportFile A file where the report output should be written. - * @property string $generator The documentation generator to use. - * @property string $filter The filter to use for the run. - * @property string[] $bootstrap One of more files to include before the run begins. - * @property int $reportWidth The maximum number of columns that reports should use for output. - * Set to "auto" for have this value changed to the width of the terminal. - * @property int $errorSeverity The minimum severity an error must have to be displayed. - * @property int $warningSeverity The minimum severity a warning must have to be displayed. - * @property bool $recordErrors Record the content of error messages as well as error counts. - * @property string $suffix A suffix to add to fixed files. - * @property string $basepath A file system location to strip from the paths of files shown in reports. - * @property bool $stdin Read content from STDIN instead of supplied files. - * @property string $stdinContent Content passed directly to PHPCS on STDIN. - * @property string $stdinPath The path to use for content passed on STDIN. - * - * @property array $extensions File extensions that should be checked, and what tokenizer to use. - * E.g., array('inc' => 'PHP'); - * @property array $reports The reports to use for printing output after the run. - * The format of the array is: - * array( - * 'reportName1' => 'outputFile', - * 'reportName2' => null, - * ); - * If the array value is NULL, the report will be written to the screen. - * - * @property string[] $unknown Any arguments gathered on the command line that are unknown to us. - * E.g., using `phpcs -c` will give array('c'); - */ -class Config -{ - - /** - * The current version. - * - * @var string - */ - const VERSION = '3.5.5'; - - /** - * Package stability; either stable, beta or alpha. - * - * @var string - */ - const STABILITY = 'stable'; - - /** - * An array of settings that PHPCS and PHPCBF accept. - * - * This array is not meant to be accessed directly. Instead, use the settings - * as if they are class member vars so the __get() and __set() magic methods - * can be used to validate the values. For example, to set the verbosity level to - * level 2, use $this->verbosity = 2; instead of accessing this property directly. - * - * Each of these settings is described in the class comment property list. - * - * @var array - */ - private $settings = [ - 'files' => null, - 'standards' => null, - 'verbosity' => null, - 'interactive' => null, - 'parallel' => null, - 'cache' => null, - 'cacheFile' => null, - 'colors' => null, - 'explain' => null, - 'local' => null, - 'showSources' => null, - 'showProgress' => null, - 'quiet' => null, - 'annotations' => null, - 'tabWidth' => null, - 'encoding' => null, - 'extensions' => null, - 'sniffs' => null, - 'exclude' => null, - 'ignored' => null, - 'reportFile' => null, - 'generator' => null, - 'filter' => null, - 'bootstrap' => null, - 'reports' => null, - 'basepath' => null, - 'reportWidth' => null, - 'errorSeverity' => null, - 'warningSeverity' => null, - 'recordErrors' => null, - 'suffix' => null, - 'stdin' => null, - 'stdinContent' => null, - 'stdinPath' => null, - 'unknown' => null, - ]; - - /** - * Whether or not to kill the process when an unknown command line arg is found. - * - * If FALSE, arguments that are not command line options or file/directory paths - * will be ignored and execution will continue. These values will be stored in - * $this->unknown. - * - * @var boolean - */ - public $dieOnUnknownArg; - - /** - * The current command line arguments we are processing. - * - * @var string[] - */ - private $cliArgs = []; - - /** - * Command line values that the user has supplied directly. - * - * @var array - */ - private static $overriddenDefaults = []; - - /** - * Config file data that has been loaded for the run. - * - * @var array - */ - private static $configData = null; - - /** - * The full path to the config data file that has been loaded. - * - * @var string - */ - private static $configDataFile = null; - - /** - * Automatically discovered executable utility paths. - * - * @var array - */ - private static $executablePaths = []; - - - /** - * Get the value of an inaccessible property. - * - * @param string $name The name of the property. - * - * @return mixed - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the setting name is invalid. - */ - public function __get($name) - { - if (array_key_exists($name, $this->settings) === false) { - throw new RuntimeException("ERROR: unable to get value of property \"$name\""); - } - - return $this->settings[$name]; - - }//end __get() - - - /** - * Set the value of an inaccessible property. - * - * @param string $name The name of the property. - * @param mixed $value The value of the property. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the setting name is invalid. - */ - public function __set($name, $value) - { - if (array_key_exists($name, $this->settings) === false) { - throw new RuntimeException("Can't __set() $name; setting doesn't exist"); - } - - switch ($name) { - case 'reportWidth' : - // Support auto terminal width. - if ($value === 'auto' - && function_exists('shell_exec') === true - && preg_match('|\d+ (\d+)|', shell_exec('stty size 2>&1'), $matches) === 1 - ) { - $value = (int) $matches[1]; - } else { - $value = (int) $value; - } - break; - case 'standards' : - $cleaned = []; - - // Check if the standard name is valid, or if the case is invalid. - $installedStandards = Util\Standards::getInstalledStandards(); - foreach ($value as $standard) { - foreach ($installedStandards as $validStandard) { - if (strtolower($standard) === strtolower($validStandard)) { - $standard = $validStandard; - break; - } - } - - $cleaned[] = $standard; - } - - $value = $cleaned; - break; - default : - // No validation required. - break; - }//end switch - - $this->settings[$name] = $value; - - }//end __set() - - - /** - * Check if the value of an inaccessible property is set. - * - * @param string $name The name of the property. - * - * @return bool - */ - public function __isset($name) - { - return isset($this->settings[$name]); - - }//end __isset() - - - /** - * Unset the value of an inaccessible property. - * - * @param string $name The name of the property. - * - * @return void - */ - public function __unset($name) - { - $this->settings[$name] = null; - - }//end __unset() - - - /** - * Get the array of all config settings. - * - * @return array - */ - public function getSettings() - { - return $this->settings; - - }//end getSettings() - - - /** - * Set the array of all config settings. - * - * @param array $settings The array of config settings. - * - * @return void - */ - public function setSettings($settings) - { - return $this->settings = $settings; - - }//end setSettings() - - - /** - * Creates a Config object and populates it with command line values. - * - * @param array $cliArgs An array of values gathered from CLI args. - * @param bool $dieOnUnknownArg Whether or not to kill the process when an - * unknown command line arg is found. - * - * @return void - */ - public function __construct(array $cliArgs=[], $dieOnUnknownArg=true) - { - if (defined('PHP_CODESNIFFER_IN_TESTS') === true) { - // Let everything through during testing so that we can - // make use of PHPUnit command line arguments as well. - $this->dieOnUnknownArg = false; - } else { - $this->dieOnUnknownArg = $dieOnUnknownArg; - } - - if (empty($cliArgs) === true) { - $cliArgs = $_SERVER['argv']; - array_shift($cliArgs); - } - - $this->restoreDefaults(); - $this->setCommandLineValues($cliArgs); - - if (isset(self::$overriddenDefaults['standards']) === false) { - // They did not supply a standard to use. - // Look for a default ruleset in the current directory or higher. - $currentDir = getcwd(); - - $defaultFiles = [ - '.phpcs.xml', - 'phpcs.xml', - '.phpcs.xml.dist', - 'phpcs.xml.dist', - ]; - - do { - foreach ($defaultFiles as $defaultFilename) { - $default = $currentDir.DIRECTORY_SEPARATOR.$defaultFilename; - if (is_file($default) === true) { - $this->standards = [$default]; - break(2); - } - } - - $lastDir = $currentDir; - $currentDir = dirname($currentDir); - } while ($currentDir !== '.' && $currentDir !== $lastDir && @is_readable($currentDir) === true); - }//end if - - if (defined('STDIN') === false - || strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' - ) { - return; - } - - $handle = fopen('php://stdin', 'r'); - - // Check for content on STDIN. - if ($this->stdin === true - || (Util\Common::isStdinATTY() === false - && feof($handle) === false) - ) { - $readStreams = [$handle]; - $writeSteams = null; - - $fileContents = ''; - while (is_resource($handle) === true && feof($handle) === false) { - // Set a timeout of 200ms. - if (stream_select($readStreams, $writeSteams, $writeSteams, 0, 200000) === 0) { - break; - } - - $fileContents .= fgets($handle); - } - - if (trim($fileContents) !== '') { - $this->stdin = true; - $this->stdinContent = $fileContents; - self::$overriddenDefaults['stdin'] = true; - self::$overriddenDefaults['stdinContent'] = true; - } - }//end if - - fclose($handle); - - }//end __construct() - - - /** - * Set the command line values. - * - * @param array $args An array of command line arguments to set. - * - * @return void - */ - public function setCommandLineValues($args) - { - $this->cliArgs = $args; - $numArgs = count($args); - - for ($i = 0; $i < $numArgs; $i++) { - $arg = $this->cliArgs[$i]; - if ($arg === '') { - continue; - } - - if ($arg[0] === '-') { - if ($arg === '-') { - // Asking to read from STDIN. - $this->stdin = true; - self::$overriddenDefaults['stdin'] = true; - continue; - } - - if ($arg === '--') { - // Empty argument, ignore it. - continue; - } - - if ($arg[1] === '-') { - $this->processLongArgument(substr($arg, 2), $i); - } else { - $switches = str_split($arg); - foreach ($switches as $switch) { - if ($switch === '-') { - continue; - } - - $this->processShortArgument($switch, $i); - } - } - } else { - $this->processUnknownArgument($arg, $i); - }//end if - }//end for - - }//end setCommandLineValues() - - - /** - * Restore default values for all possible command line arguments. - * - * @return array - */ - public function restoreDefaults() - { - $this->files = []; - $this->standards = ['PEAR']; - $this->verbosity = 0; - $this->interactive = false; - $this->cache = false; - $this->cacheFile = null; - $this->colors = false; - $this->explain = false; - $this->local = false; - $this->showSources = false; - $this->showProgress = false; - $this->quiet = false; - $this->annotations = true; - $this->parallel = 1; - $this->tabWidth = 0; - $this->encoding = 'utf-8'; - $this->extensions = [ - 'php' => 'PHP', - 'inc' => 'PHP', - 'js' => 'JS', - 'css' => 'CSS', - ]; - $this->sniffs = []; - $this->exclude = []; - $this->ignored = []; - $this->reportFile = null; - $this->generator = null; - $this->filter = null; - $this->bootstrap = []; - $this->basepath = null; - $this->reports = ['full' => null]; - $this->reportWidth = 'auto'; - $this->errorSeverity = 5; - $this->warningSeverity = 5; - $this->recordErrors = true; - $this->suffix = ''; - $this->stdin = false; - $this->stdinContent = null; - $this->stdinPath = null; - $this->unknown = []; - - $standard = self::getConfigData('default_standard'); - if ($standard !== null) { - $this->standards = explode(',', $standard); - } - - $reportFormat = self::getConfigData('report_format'); - if ($reportFormat !== null) { - $this->reports = [$reportFormat => null]; - } - - $tabWidth = self::getConfigData('tab_width'); - if ($tabWidth !== null) { - $this->tabWidth = (int) $tabWidth; - } - - $encoding = self::getConfigData('encoding'); - if ($encoding !== null) { - $this->encoding = strtolower($encoding); - } - - $severity = self::getConfigData('severity'); - if ($severity !== null) { - $this->errorSeverity = (int) $severity; - $this->warningSeverity = (int) $severity; - } - - $severity = self::getConfigData('error_severity'); - if ($severity !== null) { - $this->errorSeverity = (int) $severity; - } - - $severity = self::getConfigData('warning_severity'); - if ($severity !== null) { - $this->warningSeverity = (int) $severity; - } - - $showWarnings = self::getConfigData('show_warnings'); - if ($showWarnings !== null) { - $showWarnings = (bool) $showWarnings; - if ($showWarnings === false) { - $this->warningSeverity = 0; - } - } - - $reportWidth = self::getConfigData('report_width'); - if ($reportWidth !== null) { - $this->reportWidth = $reportWidth; - } - - $showProgress = self::getConfigData('show_progress'); - if ($showProgress !== null) { - $this->showProgress = (bool) $showProgress; - } - - $quiet = self::getConfigData('quiet'); - if ($quiet !== null) { - $this->quiet = (bool) $quiet; - } - - $colors = self::getConfigData('colors'); - if ($colors !== null) { - $this->colors = (bool) $colors; - } - - if (defined('PHP_CODESNIFFER_IN_TESTS') === false) { - $cache = self::getConfigData('cache'); - if ($cache !== null) { - $this->cache = (bool) $cache; - } - - $parallel = self::getConfigData('parallel'); - if ($parallel !== null) { - $this->parallel = max((int) $parallel, 1); - } - } - - }//end restoreDefaults() - - - /** - * Processes a short (-e) command line argument. - * - * @param string $arg The command line argument. - * @param int $pos The position of the argument on the command line. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function processShortArgument($arg, $pos) - { - switch ($arg) { - case 'h': - case '?': - ob_start(); - $this->printUsage(); - $output = ob_get_contents(); - ob_end_clean(); - throw new DeepExitException($output, 0); - case 'i' : - ob_start(); - Util\Standards::printInstalledStandards(); - $output = ob_get_contents(); - ob_end_clean(); - throw new DeepExitException($output, 0); - case 'v' : - if ($this->quiet === true) { - // Ignore when quiet mode is enabled. - break; - } - - $this->verbosity++; - self::$overriddenDefaults['verbosity'] = true; - break; - case 'l' : - $this->local = true; - self::$overriddenDefaults['local'] = true; - break; - case 's' : - $this->showSources = true; - self::$overriddenDefaults['showSources'] = true; - break; - case 'a' : - $this->interactive = true; - self::$overriddenDefaults['interactive'] = true; - break; - case 'e': - $this->explain = true; - self::$overriddenDefaults['explain'] = true; - break; - case 'p' : - if ($this->quiet === true) { - // Ignore when quiet mode is enabled. - break; - } - - $this->showProgress = true; - self::$overriddenDefaults['showProgress'] = true; - break; - case 'q' : - // Quiet mode disables a few other settings as well. - $this->quiet = true; - $this->showProgress = false; - $this->verbosity = 0; - - self::$overriddenDefaults['quiet'] = true; - break; - case 'm' : - $this->recordErrors = false; - self::$overriddenDefaults['recordErrors'] = true; - break; - case 'd' : - $ini = explode('=', $this->cliArgs[($pos + 1)]); - $this->cliArgs[($pos + 1)] = ''; - if (isset($ini[1]) === true) { - ini_set($ini[0], $ini[1]); - } else { - ini_set($ini[0], true); - } - break; - case 'n' : - if (isset(self::$overriddenDefaults['warningSeverity']) === false) { - $this->warningSeverity = 0; - self::$overriddenDefaults['warningSeverity'] = true; - } - break; - case 'w' : - if (isset(self::$overriddenDefaults['warningSeverity']) === false) { - $this->warningSeverity = $this->errorSeverity; - self::$overriddenDefaults['warningSeverity'] = true; - } - break; - default: - if ($this->dieOnUnknownArg === false) { - $unknown = $this->unknown; - $unknown[] = $arg; - $this->unknown = $unknown; - } else { - $this->processUnknownArgument('-'.$arg, $pos); - } - }//end switch - - }//end processShortArgument() - - - /** - * Processes a long (--example) command line argument. - * - * @param string $arg The command line argument. - * @param int $pos The position of the argument on the command line. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function processLongArgument($arg, $pos) - { - switch ($arg) { - case 'help': - ob_start(); - $this->printUsage(); - $output = ob_get_contents(); - ob_end_clean(); - throw new DeepExitException($output, 0); - case 'version': - $output = 'PHP_CodeSniffer version '.self::VERSION.' ('.self::STABILITY.') '; - $output .= 'by Squiz (http://www.squiz.net)'.PHP_EOL; - throw new DeepExitException($output, 0); - case 'colors': - if (isset(self::$overriddenDefaults['colors']) === true) { - break; - } - - $this->colors = true; - self::$overriddenDefaults['colors'] = true; - break; - case 'no-colors': - if (isset(self::$overriddenDefaults['colors']) === true) { - break; - } - - $this->colors = false; - self::$overriddenDefaults['colors'] = true; - break; - case 'cache': - if (isset(self::$overriddenDefaults['cache']) === true) { - break; - } - - if (defined('PHP_CODESNIFFER_IN_TESTS') === false) { - $this->cache = true; - self::$overriddenDefaults['cache'] = true; - } - break; - case 'no-cache': - if (isset(self::$overriddenDefaults['cache']) === true) { - break; - } - - $this->cache = false; - self::$overriddenDefaults['cache'] = true; - break; - case 'ignore-annotations': - if (isset(self::$overriddenDefaults['annotations']) === true) { - break; - } - - $this->annotations = false; - self::$overriddenDefaults['annotations'] = true; - break; - case 'config-set': - if (isset($this->cliArgs[($pos + 1)]) === false - || isset($this->cliArgs[($pos + 2)]) === false - ) { - $error = 'ERROR: Setting a config option requires a name and value'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $key = $this->cliArgs[($pos + 1)]; - $value = $this->cliArgs[($pos + 2)]; - $current = self::getConfigData($key); - - try { - $this->setConfigData($key, $value); - } catch (\Exception $e) { - throw new DeepExitException($e->getMessage().PHP_EOL, 3); - } - - $output = 'Using config file: '.self::$configDataFile.PHP_EOL.PHP_EOL; - - if ($current === null) { - $output .= "Config value \"$key\" added successfully".PHP_EOL; - } else { - $output .= "Config value \"$key\" updated successfully; old value was \"$current\"".PHP_EOL; - } - throw new DeepExitException($output, 0); - case 'config-delete': - if (isset($this->cliArgs[($pos + 1)]) === false) { - $error = 'ERROR: Deleting a config option requires the name of the option'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $output = 'Using config file: '.self::$configDataFile.PHP_EOL.PHP_EOL; - - $key = $this->cliArgs[($pos + 1)]; - $current = self::getConfigData($key); - if ($current === null) { - $output .= "Config value \"$key\" has not been set".PHP_EOL; - } else { - try { - $this->setConfigData($key, null); - } catch (\Exception $e) { - throw new DeepExitException($e->getMessage().PHP_EOL, 3); - } - - $output .= "Config value \"$key\" removed successfully; old value was \"$current\"".PHP_EOL; - } - throw new DeepExitException($output, 0); - case 'config-show': - ob_start(); - $data = self::getAllConfigData(); - echo 'Using config file: '.self::$configDataFile.PHP_EOL.PHP_EOL; - $this->printConfigData($data); - $output = ob_get_contents(); - ob_end_clean(); - throw new DeepExitException($output, 0); - case 'runtime-set': - if (isset($this->cliArgs[($pos + 1)]) === false - || isset($this->cliArgs[($pos + 2)]) === false - ) { - $error = 'ERROR: Setting a runtime config option requires a name and value'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $key = $this->cliArgs[($pos + 1)]; - $value = $this->cliArgs[($pos + 2)]; - $this->cliArgs[($pos + 1)] = ''; - $this->cliArgs[($pos + 2)] = ''; - self::setConfigData($key, $value, true); - if (isset(self::$overriddenDefaults['runtime-set']) === false) { - self::$overriddenDefaults['runtime-set'] = []; - } - - self::$overriddenDefaults['runtime-set'][$key] = true; - break; - default: - if (substr($arg, 0, 7) === 'sniffs=') { - if (isset(self::$overriddenDefaults['sniffs']) === true) { - break; - } - - $sniffs = explode(',', substr($arg, 7)); - foreach ($sniffs as $sniff) { - if (substr_count($sniff, '.') !== 2) { - $error = 'ERROR: The specified sniff code "'.$sniff.'" is invalid'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - } - - $this->sniffs = $sniffs; - self::$overriddenDefaults['sniffs'] = true; - } else if (substr($arg, 0, 8) === 'exclude=') { - if (isset(self::$overriddenDefaults['exclude']) === true) { - break; - } - - $sniffs = explode(',', substr($arg, 8)); - foreach ($sniffs as $sniff) { - if (substr_count($sniff, '.') !== 2) { - $error = 'ERROR: The specified sniff code "'.$sniff.'" is invalid'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - } - - $this->exclude = $sniffs; - self::$overriddenDefaults['exclude'] = true; - } else if (defined('PHP_CODESNIFFER_IN_TESTS') === false - && substr($arg, 0, 6) === 'cache=' - ) { - if ((isset(self::$overriddenDefaults['cache']) === true - && $this->cache === false) - || isset(self::$overriddenDefaults['cacheFile']) === true - ) { - break; - } - - // Turn caching on. - $this->cache = true; - self::$overriddenDefaults['cache'] = true; - - $this->cacheFile = Util\Common::realpath(substr($arg, 6)); - - // It may not exist and return false instead. - if ($this->cacheFile === false) { - $this->cacheFile = substr($arg, 6); - - $dir = dirname($this->cacheFile); - if (is_dir($dir) === false) { - $error = 'ERROR: The specified cache file path "'.$this->cacheFile.'" points to a non-existent directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - if ($dir === '.') { - // Passed cache file is a file in the current directory. - $this->cacheFile = getcwd().'/'.basename($this->cacheFile); - } else { - if ($dir[0] === '/') { - // An absolute path. - $dir = Util\Common::realpath($dir); - } else { - $dir = Util\Common::realpath(getcwd().'/'.$dir); - } - - if ($dir !== false) { - // Cache file path is relative. - $this->cacheFile = $dir.'/'.basename($this->cacheFile); - } - } - }//end if - - self::$overriddenDefaults['cacheFile'] = true; - - if (is_dir($this->cacheFile) === true) { - $error = 'ERROR: The specified cache file path "'.$this->cacheFile.'" is a directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - } else if (substr($arg, 0, 10) === 'bootstrap=') { - $files = explode(',', substr($arg, 10)); - $bootstrap = []; - foreach ($files as $file) { - $path = Util\Common::realpath($file); - if ($path === false) { - $error = 'ERROR: The specified bootstrap file "'.$file.'" does not exist'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $bootstrap[] = $path; - } - - $this->bootstrap = array_merge($this->bootstrap, $bootstrap); - self::$overriddenDefaults['bootstrap'] = true; - } else if (substr($arg, 0, 10) === 'file-list=') { - $fileList = substr($arg, 10); - $path = Util\Common::realpath($fileList); - if ($path === false) { - $error = 'ERROR: The specified file list "'.$fileList.'" does not exist'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $files = file($path); - foreach ($files as $inputFile) { - $inputFile = trim($inputFile); - - // Skip empty lines. - if ($inputFile === '') { - continue; - } - - $this->processFilePath($inputFile); - } - } else if (substr($arg, 0, 11) === 'stdin-path=') { - if (isset(self::$overriddenDefaults['stdinPath']) === true) { - break; - } - - $this->stdinPath = Util\Common::realpath(substr($arg, 11)); - - // It may not exist and return false instead, so use whatever they gave us. - if ($this->stdinPath === false) { - $this->stdinPath = trim(substr($arg, 11)); - } - - self::$overriddenDefaults['stdinPath'] = true; - } else if (PHP_CODESNIFFER_CBF === false && substr($arg, 0, 12) === 'report-file=') { - if (isset(self::$overriddenDefaults['reportFile']) === true) { - break; - } - - $this->reportFile = Util\Common::realpath(substr($arg, 12)); - - // It may not exist and return false instead. - if ($this->reportFile === false) { - $this->reportFile = substr($arg, 12); - - $dir = Util\Common::realpath(dirname($this->reportFile)); - if (is_dir($dir) === false) { - $error = 'ERROR: The specified report file path "'.$this->reportFile.'" points to a non-existent directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $this->reportFile = $dir.'/'.basename($this->reportFile); - }//end if - - self::$overriddenDefaults['reportFile'] = true; - - if (is_dir($this->reportFile) === true) { - $error = 'ERROR: The specified report file path "'.$this->reportFile.'" is a directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - } else if (substr($arg, 0, 13) === 'report-width=') { - if (isset(self::$overriddenDefaults['reportWidth']) === true) { - break; - } - - $this->reportWidth = substr($arg, 13); - self::$overriddenDefaults['reportWidth'] = true; - } else if (substr($arg, 0, 9) === 'basepath=') { - if (isset(self::$overriddenDefaults['basepath']) === true) { - break; - } - - self::$overriddenDefaults['basepath'] = true; - - if (substr($arg, 9) === '') { - $this->basepath = null; - break; - } - - $this->basepath = Util\Common::realpath(substr($arg, 9)); - - // It may not exist and return false instead. - if ($this->basepath === false) { - $this->basepath = substr($arg, 9); - } - - if (is_dir($this->basepath) === false) { - $error = 'ERROR: The specified basepath "'.$this->basepath.'" points to a non-existent directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - } else if ((substr($arg, 0, 7) === 'report=' || substr($arg, 0, 7) === 'report-')) { - $reports = []; - - if ($arg[6] === '-') { - // This is a report with file output. - $split = strpos($arg, '='); - if ($split === false) { - $report = substr($arg, 7); - $output = null; - } else { - $report = substr($arg, 7, ($split - 7)); - $output = substr($arg, ($split + 1)); - if ($output === false) { - $output = null; - } else { - $dir = Util\Common::realpath(dirname($output)); - if (is_dir($dir) === false) { - $error = 'ERROR: The specified '.$report.' report file path "'.$output.'" points to a non-existent directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $output = $dir.'/'.basename($output); - - if (is_dir($output) === true) { - $error = 'ERROR: The specified '.$report.' report file path "'.$output.'" is a directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - }//end if - }//end if - - $reports[$report] = $output; - } else { - // This is a single report. - if (isset(self::$overriddenDefaults['reports']) === true) { - break; - } - - $reportNames = explode(',', substr($arg, 7)); - foreach ($reportNames as $report) { - $reports[$report] = null; - } - }//end if - - // Remove the default value so the CLI value overrides it. - if (isset(self::$overriddenDefaults['reports']) === false) { - $this->reports = $reports; - } else { - $this->reports = array_merge($this->reports, $reports); - } - - self::$overriddenDefaults['reports'] = true; - } else if (substr($arg, 0, 7) === 'filter=') { - if (isset(self::$overriddenDefaults['filter']) === true) { - break; - } - - $this->filter = substr($arg, 7); - self::$overriddenDefaults['filter'] = true; - } else if (substr($arg, 0, 9) === 'standard=') { - $standards = trim(substr($arg, 9)); - if ($standards !== '') { - $this->standards = explode(',', $standards); - } - - self::$overriddenDefaults['standards'] = true; - } else if (substr($arg, 0, 11) === 'extensions=') { - if (isset(self::$overriddenDefaults['extensions']) === true) { - break; - } - - $extensions = explode(',', substr($arg, 11)); - $newExtensions = []; - foreach ($extensions as $ext) { - $slash = strpos($ext, '/'); - if ($slash !== false) { - // They specified the tokenizer too. - list($ext, $tokenizer) = explode('/', $ext); - $newExtensions[$ext] = strtoupper($tokenizer); - continue; - } - - if (isset($this->extensions[$ext]) === true) { - $newExtensions[$ext] = $this->extensions[$ext]; - } else { - $newExtensions[$ext] = 'PHP'; - } - } - - $this->extensions = $newExtensions; - self::$overriddenDefaults['extensions'] = true; - } else if (substr($arg, 0, 7) === 'suffix=') { - if (isset(self::$overriddenDefaults['suffix']) === true) { - break; - } - - $this->suffix = substr($arg, 7); - self::$overriddenDefaults['suffix'] = true; - } else if (substr($arg, 0, 9) === 'parallel=') { - if (isset(self::$overriddenDefaults['parallel']) === true) { - break; - } - - $this->parallel = max((int) substr($arg, 9), 1); - self::$overriddenDefaults['parallel'] = true; - } else if (substr($arg, 0, 9) === 'severity=') { - $this->errorSeverity = (int) substr($arg, 9); - $this->warningSeverity = $this->errorSeverity; - if (isset(self::$overriddenDefaults['errorSeverity']) === false) { - self::$overriddenDefaults['errorSeverity'] = true; - } - - if (isset(self::$overriddenDefaults['warningSeverity']) === false) { - self::$overriddenDefaults['warningSeverity'] = true; - } - } else if (substr($arg, 0, 15) === 'error-severity=') { - if (isset(self::$overriddenDefaults['errorSeverity']) === true) { - break; - } - - $this->errorSeverity = (int) substr($arg, 15); - self::$overriddenDefaults['errorSeverity'] = true; - } else if (substr($arg, 0, 17) === 'warning-severity=') { - if (isset(self::$overriddenDefaults['warningSeverity']) === true) { - break; - } - - $this->warningSeverity = (int) substr($arg, 17); - self::$overriddenDefaults['warningSeverity'] = true; - } else if (substr($arg, 0, 7) === 'ignore=') { - if (isset(self::$overriddenDefaults['ignored']) === true) { - break; - } - - // Split the ignore string on commas, unless the comma is escaped - // using 1 or 3 slashes (\, or \\\,). - $patterns = preg_split( - '/(?<=(?ignored = $ignored; - self::$overriddenDefaults['ignored'] = true; - } else if (substr($arg, 0, 10) === 'generator=' - && PHP_CODESNIFFER_CBF === false - ) { - if (isset(self::$overriddenDefaults['generator']) === true) { - break; - } - - $this->generator = substr($arg, 10); - self::$overriddenDefaults['generator'] = true; - } else if (substr($arg, 0, 9) === 'encoding=') { - if (isset(self::$overriddenDefaults['encoding']) === true) { - break; - } - - $this->encoding = strtolower(substr($arg, 9)); - self::$overriddenDefaults['encoding'] = true; - } else if (substr($arg, 0, 10) === 'tab-width=') { - if (isset(self::$overriddenDefaults['tabWidth']) === true) { - break; - } - - $this->tabWidth = (int) substr($arg, 10); - self::$overriddenDefaults['tabWidth'] = true; - } else { - if ($this->dieOnUnknownArg === false) { - $eqPos = strpos($arg, '='); - try { - if ($eqPos === false) { - $this->values[$arg] = $arg; - } else { - $value = substr($arg, ($eqPos + 1)); - $arg = substr($arg, 0, $eqPos); - $this->values[$arg] = $value; - } - } catch (RuntimeException $e) { - // Value is not valid, so just ignore it. - } - } else { - $this->processUnknownArgument('--'.$arg, $pos); - } - }//end if - break; - }//end switch - - }//end processLongArgument() - - - /** - * Processes an unknown command line argument. - * - * Assumes all unknown arguments are files and folders to check. - * - * @param string $arg The command line argument. - * @param int $pos The position of the argument on the command line. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function processUnknownArgument($arg, $pos) - { - // We don't know about any additional switches; just files. - if ($arg[0] === '-') { - if ($this->dieOnUnknownArg === false) { - return; - } - - $error = "ERROR: option \"$arg\" not known".PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $this->processFilePath($arg); - - }//end processUnknownArgument() - - - /** - * Processes a file path and add it to the file list. - * - * @param string $path The path to the file to add. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function processFilePath($path) - { - // If we are processing STDIN, don't record any files to check. - if ($this->stdin === true) { - return; - } - - $file = Util\Common::realpath($path); - if (file_exists($file) === false) { - if ($this->dieOnUnknownArg === false) { - return; - } - - $error = 'ERROR: The file "'.$path.'" does not exist.'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } else { - // Can't modify the files array directly because it's not a real - // class member, so need to use this little get/modify/set trick. - $files = $this->files; - $files[] = $file; - $this->files = $files; - self::$overriddenDefaults['files'] = true; - } - - }//end processFilePath() - - - /** - * Prints out the usage information for this script. - * - * @return void - */ - public function printUsage() - { - echo PHP_EOL; - - if (PHP_CODESNIFFER_CBF === true) { - $this->printPHPCBFUsage(); - } else { - $this->printPHPCSUsage(); - } - - echo PHP_EOL; - - }//end printUsage() - - - /** - * Prints out the short usage information for this script. - * - * @param bool $return If TRUE, the usage string is returned - * instead of output to screen. - * - * @return string|void - */ - public function printShortUsage($return=false) - { - if (PHP_CODESNIFFER_CBF === true) { - $usage = 'Run "phpcbf --help" for usage information'; - } else { - $usage = 'Run "phpcs --help" for usage information'; - } - - $usage .= PHP_EOL.PHP_EOL; - - if ($return === true) { - return $usage; - } - - echo $usage; - - }//end printShortUsage() - - - /** - * Prints out the usage information for PHPCS. - * - * @return void - */ - public function printPHPCSUsage() - { - echo 'Usage: phpcs [-nwlsaepqvi] [-d key[=value]] [--colors] [--no-colors]'.PHP_EOL; - echo ' [--cache[=]] [--no-cache] [--tab-width=]'.PHP_EOL; - echo ' [--report=] [--report-file=] [--report-=]'.PHP_EOL; - echo ' [--report-width=] [--basepath=] [--bootstrap=]'.PHP_EOL; - echo ' [--severity=] [--error-severity=] [--warning-severity=]'.PHP_EOL; - echo ' [--runtime-set key value] [--config-set key value] [--config-delete key] [--config-show]'.PHP_EOL; - echo ' [--standard=] [--sniffs=] [--exclude=]'.PHP_EOL; - echo ' [--encoding=] [--parallel=] [--generator=]'.PHP_EOL; - echo ' [--extensions=] [--ignore=] [--ignore-annotations]'.PHP_EOL; - echo ' [--stdin-path=] [--file-list=] [--filter=] - ...'.PHP_EOL; - echo PHP_EOL; - echo ' - Check STDIN instead of local files and directories'.PHP_EOL; - echo ' -n Do not print warnings (shortcut for --warning-severity=0)'.PHP_EOL; - echo ' -w Print both warnings and errors (this is the default)'.PHP_EOL; - echo ' -l Local directory only, no recursion'.PHP_EOL; - echo ' -s Show sniff codes in all reports'.PHP_EOL; - echo ' -a Run interactively'.PHP_EOL; - echo ' -e Explain a standard by showing the sniffs it includes'.PHP_EOL; - echo ' -p Show progress of the run'.PHP_EOL; - echo ' -q Quiet mode; disables progress and verbose output'.PHP_EOL; - echo ' -m Stop error messages from being recorded'.PHP_EOL; - echo ' (saves a lot of memory, but stops many reports from being used)'.PHP_EOL; - echo ' -v Print processed files'.PHP_EOL; - echo ' -vv Print ruleset and token output'.PHP_EOL; - echo ' -vvv Print sniff processing information'.PHP_EOL; - echo ' -i Show a list of installed coding standards'.PHP_EOL; - echo ' -d Set the [key] php.ini value to [value] or [true] if value is omitted'.PHP_EOL; - echo PHP_EOL; - echo ' --help Print this help message'.PHP_EOL; - echo ' --version Print version information'.PHP_EOL; - echo ' --colors Use colors in output'.PHP_EOL; - echo ' --no-colors Do not use colors in output (this is the default)'.PHP_EOL; - echo ' --cache Cache results between runs'.PHP_EOL; - echo ' --no-cache Do not cache results between runs (this is the default)'.PHP_EOL; - echo ' --ignore-annotations Ignore all phpcs: annotations in code comments'.PHP_EOL; - echo PHP_EOL; - echo ' Use a specific file for caching (uses a temporary file by default)'.PHP_EOL; - echo ' A path to strip from the front of file paths inside reports'.PHP_EOL; - echo ' A comma separated list of files to run before processing begins'.PHP_EOL; - echo ' The encoding of the files being checked (default is utf-8)'.PHP_EOL; - echo ' A comma separated list of file extensions to check'.PHP_EOL; - echo ' The type of the file can be specified using: ext/type'.PHP_EOL; - echo ' e.g., module/php,es/js'.PHP_EOL; - echo ' One or more files and/or directories to check'.PHP_EOL; - echo ' A file containing a list of files and/or directories to check (one per line)'.PHP_EOL; - echo ' Use either the "gitmodified" or "gitstaged" filter,'.PHP_EOL; - echo ' or specify the path to a custom filter class'.PHP_EOL; - echo ' Use either the "HTML", "Markdown" or "Text" generator'.PHP_EOL; - echo ' (forces documentation generation instead of checking)'.PHP_EOL; - echo ' A comma separated list of patterns to ignore files and directories'.PHP_EOL; - echo ' How many files should be checked simultaneously (default is 1)'.PHP_EOL; - echo ' Print either the "full", "xml", "checkstyle", "csv"'.PHP_EOL; - echo ' "json", "junit", "emacs", "source", "summary", "diff"'.PHP_EOL; - echo ' "svnblame", "gitblame", "hgblame" or "notifysend" report,'.PHP_EOL; - echo ' or specify the path to a custom report class'.PHP_EOL; - echo ' (the "full" report is printed by default)'.PHP_EOL; - echo ' Write the report to the specified file path'.PHP_EOL; - echo ' How many columns wide screen reports should be printed'.PHP_EOL; - echo ' or set to "auto" to use current screen width, where supported'.PHP_EOL; - echo ' The minimum severity required to display an error or warning'.PHP_EOL; - echo ' A comma separated list of sniff codes to include or exclude from checking'.PHP_EOL; - echo ' (all sniffs must be part of the specified standard)'.PHP_EOL; - echo ' The name or path of the coding standard to use'.PHP_EOL; - echo ' If processing STDIN, the file path that STDIN will be processed as'.PHP_EOL; - echo ' The number of spaces each tab represents'.PHP_EOL; - - }//end printPHPCSUsage() - - - /** - * Prints out the usage information for PHPCBF. - * - * @return void - */ - public function printPHPCBFUsage() - { - echo 'Usage: phpcbf [-nwli] [-d key[=value]] [--ignore-annotations] [--bootstrap=]'.PHP_EOL; - echo ' [--standard=] [--sniffs=] [--exclude=] [--suffix=]'.PHP_EOL; - echo ' [--severity=] [--error-severity=] [--warning-severity=]'.PHP_EOL; - echo ' [--tab-width=] [--encoding=] [--parallel=]'.PHP_EOL; - echo ' [--basepath=] [--extensions=] [--ignore=]'.PHP_EOL; - echo ' [--stdin-path=] [--file-list=] [--filter=] - ...'.PHP_EOL; - echo PHP_EOL; - echo ' - Fix STDIN instead of local files and directories'.PHP_EOL; - echo ' -n Do not fix warnings (shortcut for --warning-severity=0)'.PHP_EOL; - echo ' -w Fix both warnings and errors (on by default)'.PHP_EOL; - echo ' -l Local directory only, no recursion'.PHP_EOL; - echo ' -p Show progress of the run'.PHP_EOL; - echo ' -q Quiet mode; disables progress and verbose output'.PHP_EOL; - echo ' -v Print processed files'.PHP_EOL; - echo ' -vv Print ruleset and token output'.PHP_EOL; - echo ' -vvv Print sniff processing information'.PHP_EOL; - echo ' -i Show a list of installed coding standards'.PHP_EOL; - echo ' -d Set the [key] php.ini value to [value] or [true] if value is omitted'.PHP_EOL; - echo PHP_EOL; - echo ' --help Print this help message'.PHP_EOL; - echo ' --version Print version information'.PHP_EOL; - echo ' --ignore-annotations Ignore all phpcs: annotations in code comments'.PHP_EOL; - echo PHP_EOL; - echo ' A path to strip from the front of file paths inside reports'.PHP_EOL; - echo ' A comma separated list of files to run before processing begins'.PHP_EOL; - echo ' The encoding of the files being fixed (default is utf-8)'.PHP_EOL; - echo ' A comma separated list of file extensions to fix'.PHP_EOL; - echo ' The type of the file can be specified using: ext/type'.PHP_EOL; - echo ' e.g., module/php,es/js'.PHP_EOL; - echo ' One or more files and/or directories to fix'.PHP_EOL; - echo ' A file containing a list of files and/or directories to fix (one per line)'.PHP_EOL; - echo ' Use either the "gitmodified" or "gitstaged" filter,'.PHP_EOL; - echo ' or specify the path to a custom filter class'.PHP_EOL; - echo ' A comma separated list of patterns to ignore files and directories'.PHP_EOL; - echo ' How many files should be fixed simultaneously (default is 1)'.PHP_EOL; - echo ' The minimum severity required to fix an error or warning'.PHP_EOL; - echo ' A comma separated list of sniff codes to include or exclude from fixing'.PHP_EOL; - echo ' (all sniffs must be part of the specified standard)'.PHP_EOL; - echo ' The name or path of the coding standard to use'.PHP_EOL; - echo ' If processing STDIN, the file path that STDIN will be processed as'.PHP_EOL; - echo ' Write modified files to a filename using this suffix'.PHP_EOL; - echo ' ("diff" and "patch" are not used in this mode)'.PHP_EOL; - echo ' The number of spaces each tab represents'.PHP_EOL; - - }//end printPHPCBFUsage() - - - /** - * Get a single config value. - * - * @param string $key The name of the config value. - * - * @return string|null - * @see setConfigData() - * @see getAllConfigData() - */ - public static function getConfigData($key) - { - $phpCodeSnifferConfig = self::getAllConfigData(); - - if ($phpCodeSnifferConfig === null) { - return null; - } - - if (isset($phpCodeSnifferConfig[$key]) === false) { - return null; - } - - return $phpCodeSnifferConfig[$key]; - - }//end getConfigData() - - - /** - * Get the path to an executable utility. - * - * @param string $name The name of the executable utility. - * - * @return string|null - * @see getConfigData() - */ - public static function getExecutablePath($name) - { - $data = self::getConfigData($name.'_path'); - if ($data !== null) { - return $data; - } - - if ($name === "php") { - // For php, we know the executable path. There's no need to look it up. - return PHP_BINARY; - } - - if (array_key_exists($name, self::$executablePaths) === true) { - return self::$executablePaths[$name]; - } - - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $cmd = 'where '.escapeshellarg($name).' 2> nul'; - } else { - $cmd = 'which '.escapeshellarg($name).' 2> /dev/null'; - } - - $result = exec($cmd, $output, $retVal); - if ($retVal !== 0) { - $result = null; - } - - self::$executablePaths[$name] = $result; - return $result; - - }//end getExecutablePath() - - - /** - * Set a single config value. - * - * @param string $key The name of the config value. - * @param string|null $value The value to set. If null, the config - * entry is deleted, reverting it to the - * default value. - * @param boolean $temp Set this config data temporarily for this - * script run. This will not write the config - * data to the config file. - * - * @return bool - * @see getConfigData() - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If the config file can not be written. - */ - public static function setConfigData($key, $value, $temp=false) - { - if (isset(self::$overriddenDefaults['runtime-set']) === true - && isset(self::$overriddenDefaults['runtime-set'][$key]) === true - ) { - return false; - } - - if ($temp === false) { - $path = ''; - if (is_callable('\Phar::running') === true) { - $path = \Phar::running(false); - } - - if ($path !== '') { - $configFile = dirname($path).DIRECTORY_SEPARATOR.'CodeSniffer.conf'; - } else { - $configFile = dirname(__DIR__).DIRECTORY_SEPARATOR.'CodeSniffer.conf'; - if (is_file($configFile) === false - && strpos('@data_dir@', '@data_dir') === false - ) { - // If data_dir was replaced, this is a PEAR install and we can - // use the PEAR data dir to store the conf file. - $configFile = '@data_dir@/PHP_CodeSniffer/CodeSniffer.conf'; - } - } - - if (is_file($configFile) === true - && is_writable($configFile) === false - ) { - $error = 'ERROR: Config file '.$configFile.' is not writable'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - }//end if - - $phpCodeSnifferConfig = self::getAllConfigData(); - - if ($value === null) { - if (isset($phpCodeSnifferConfig[$key]) === true) { - unset($phpCodeSnifferConfig[$key]); - } - } else { - $phpCodeSnifferConfig[$key] = $value; - } - - if ($temp === false) { - $output = '<'.'?php'."\n".' $phpCodeSnifferConfig = '; - $output .= var_export($phpCodeSnifferConfig, true); - $output .= "\n?".'>'; - - if (file_put_contents($configFile, $output) === false) { - $error = 'ERROR: Config file '.$configFile.' could not be written'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - self::$configDataFile = $configFile; - } - - self::$configData = $phpCodeSnifferConfig; - - // If the installed paths are being set, make sure all known - // standards paths are added to the autoloader. - if ($key === 'installed_paths') { - $installedStandards = Util\Standards::getInstalledStandardDetails(); - foreach ($installedStandards as $name => $details) { - Autoload::addSearchPath($details['path'], $details['namespace']); - } - } - - return true; - - }//end setConfigData() - - - /** - * Get all config data. - * - * @return array - * @see getConfigData() - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If the config file could not be read. - */ - public static function getAllConfigData() - { - if (self::$configData !== null) { - return self::$configData; - } - - $path = ''; - if (is_callable('\Phar::running') === true) { - $path = \Phar::running(false); - } - - if ($path !== '') { - $configFile = dirname($path).DIRECTORY_SEPARATOR.'CodeSniffer.conf'; - } else { - $configFile = dirname(__DIR__).DIRECTORY_SEPARATOR.'CodeSniffer.conf'; - if (is_file($configFile) === false - && strpos('@data_dir@', '@data_dir') === false - ) { - $configFile = '@data_dir@/PHP_CodeSniffer/CodeSniffer.conf'; - } - } - - if (is_file($configFile) === false) { - self::$configData = []; - return []; - } - - if (is_readable($configFile) === false) { - $error = 'ERROR: Config file '.$configFile.' is not readable'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - include $configFile; - self::$configDataFile = $configFile; - self::$configData = $phpCodeSnifferConfig; - return self::$configData; - - }//end getAllConfigData() - - - /** - * Prints out the gathered config data. - * - * @param array $data The config data to print. - * - * @return void - */ - public function printConfigData($data) - { - $max = 0; - $keys = array_keys($data); - foreach ($keys as $key) { - $len = strlen($key); - if (strlen($key) > $max) { - $max = $len; - } - } - - if ($max === 0) { - return; - } - - $max += 2; - ksort($data); - foreach ($data as $name => $value) { - echo str_pad($name.': ', $max).$value.PHP_EOL; - } - - }//end printConfigData() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Exceptions/DeepExitException.php b/vendor/squizlabs/php_codesniffer/src/Exceptions/DeepExitException.php deleted file mode 100644 index b144094..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Exceptions/DeepExitException.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Exceptions; - -class DeepExitException extends \Exception -{ - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Exceptions/RuntimeException.php b/vendor/squizlabs/php_codesniffer/src/Exceptions/RuntimeException.php deleted file mode 100644 index 093bf13..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Exceptions/RuntimeException.php +++ /dev/null @@ -1,15 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Exceptions; - -class RuntimeException extends \RuntimeException -{ - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Exceptions/TokenizerException.php b/vendor/squizlabs/php_codesniffer/src/Exceptions/TokenizerException.php deleted file mode 100644 index ceba00c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Exceptions/TokenizerException.php +++ /dev/null @@ -1,15 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Exceptions; - -class TokenizerException extends \Exception -{ - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Files/DummyFile.php b/vendor/squizlabs/php_codesniffer/src/Files/DummyFile.php deleted file mode 100644 index 3275bf0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Files/DummyFile.php +++ /dev/null @@ -1,82 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Files; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Config; - -class DummyFile extends File -{ - - - /** - * Creates a DummyFile object and sets the content. - * - * @param string $content The content of the file. - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - */ - public function __construct($content, Ruleset $ruleset, Config $config) - { - $this->setContent($content); - - // See if a filename was defined in the content. - // This is done by including: phpcs_input_file: [file path] - // as the first line of content. - $path = 'STDIN'; - if ($content !== null) { - if (substr($content, 0, 17) === 'phpcs_input_file:') { - $eolPos = strpos($content, $this->eolChar); - $filename = trim(substr($content, 17, ($eolPos - 17))); - $content = substr($content, ($eolPos + strlen($this->eolChar))); - $path = $filename; - - $this->setContent($content); - } - } - - // The CLI arg overrides anything passed in the content. - if ($config->stdinPath !== null) { - $path = $config->stdinPath; - } - - parent::__construct($path, $ruleset, $config); - - }//end __construct() - - - /** - * Set the error, warning, and fixable counts for the file. - * - * @param int $errorCount The number of errors found. - * @param int $warningCount The number of warnings found. - * @param int $fixableCount The number of fixable errors found. - * @param int $fixedCount The number of errors that were fixed. - * - * @return void - */ - public function setErrorCounts($errorCount, $warningCount, $fixableCount, $fixedCount) - { - $this->errorCount = $errorCount; - $this->warningCount = $warningCount; - $this->fixableCount = $fixableCount; - $this->fixedCount = $fixedCount; - - }//end setErrorCounts() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Files/File.php b/vendor/squizlabs/php_codesniffer/src/Files/File.php deleted file mode 100644 index 56fd5c1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Files/File.php +++ /dev/null @@ -1,2636 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Files; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Fixer; -use PHP_CodeSniffer\Util; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Exceptions\TokenizerException; - -class File -{ - - /** - * The absolute path to the file associated with this object. - * - * @var string - */ - public $path = ''; - - /** - * The content of the file. - * - * @var string - */ - protected $content = ''; - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - public $config = null; - - /** - * The ruleset used for the run. - * - * @var \PHP_CodeSniffer\Ruleset - */ - public $ruleset = null; - - /** - * If TRUE, the entire file is being ignored. - * - * @var boolean - */ - public $ignored = false; - - /** - * The EOL character this file uses. - * - * @var string - */ - public $eolChar = ''; - - /** - * The Fixer object to control fixing errors. - * - * @var \PHP_CodeSniffer\Fixer - */ - public $fixer = null; - - /** - * The tokenizer being used for this file. - * - * @var \PHP_CodeSniffer\Tokenizers\Tokenizer - */ - public $tokenizer = null; - - /** - * The name of the tokenizer being used for this file. - * - * @var string - */ - public $tokenizerType = 'PHP'; - - /** - * Was the file loaded from cache? - * - * If TRUE, the file was loaded from a local cache. - * If FALSE, the file was tokenized and processed fully. - * - * @var boolean - */ - public $fromCache = false; - - /** - * The number of tokens in this file. - * - * Stored here to save calling count() everywhere. - * - * @var integer - */ - public $numTokens = 0; - - /** - * The tokens stack map. - * - * @var array - */ - protected $tokens = []; - - /** - * The errors raised from sniffs. - * - * @var array - * @see getErrors() - */ - protected $errors = []; - - /** - * The warnings raised from sniffs. - * - * @var array - * @see getWarnings() - */ - protected $warnings = []; - - /** - * The metrics recorded by sniffs. - * - * @var array - * @see getMetrics() - */ - protected $metrics = []; - - /** - * The metrics recorded for each token. - * - * Stops the same metric being recorded for the same token twice. - * - * @var array - * @see getMetrics() - */ - private $metricTokens = []; - - /** - * The total number of errors raised. - * - * @var integer - */ - protected $errorCount = 0; - - /** - * The total number of warnings raised. - * - * @var integer - */ - protected $warningCount = 0; - - /** - * The total number of errors and warnings that can be fixed. - * - * @var integer - */ - protected $fixableCount = 0; - - /** - * The total number of errors and warnings that were fixed. - * - * @var integer - */ - protected $fixedCount = 0; - - /** - * TRUE if errors are being replayed from the cache. - * - * @var boolean - */ - protected $replayingErrors = false; - - /** - * An array of sniffs that are being ignored. - * - * @var array - */ - protected $ignoredListeners = []; - - /** - * An array of message codes that are being ignored. - * - * @var array - */ - protected $ignoredCodes = []; - - /** - * An array of sniffs listening to this file's processing. - * - * @var \PHP_CodeSniffer\Sniffs\Sniff[] - */ - protected $listeners = []; - - /** - * The class name of the sniff currently processing the file. - * - * @var string - */ - protected $activeListener = ''; - - /** - * An array of sniffs being processed and how long they took. - * - * @var array - */ - protected $listenerTimes = []; - - /** - * A cache of often used config settings to improve performance. - * - * Storing them here saves 10k+ calls to __get() in the Config class. - * - * @var array - */ - protected $configCache = []; - - - /** - * Constructs a file. - * - * @param string $path The absolute path to the file to process. - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - */ - public function __construct($path, Ruleset $ruleset, Config $config) - { - $this->path = $path; - $this->ruleset = $ruleset; - $this->config = $config; - $this->fixer = new Fixer(); - - $parts = explode('.', $path); - $extension = array_pop($parts); - if (isset($config->extensions[$extension]) === true) { - $this->tokenizerType = $config->extensions[$extension]; - } else { - // Revert to default. - $this->tokenizerType = 'PHP'; - } - - $this->configCache['cache'] = $this->config->cache; - $this->configCache['sniffs'] = array_map('strtolower', $this->config->sniffs); - $this->configCache['exclude'] = array_map('strtolower', $this->config->exclude); - $this->configCache['errorSeverity'] = $this->config->errorSeverity; - $this->configCache['warningSeverity'] = $this->config->warningSeverity; - $this->configCache['recordErrors'] = $this->config->recordErrors; - $this->configCache['ignorePatterns'] = $this->ruleset->ignorePatterns; - $this->configCache['includePatterns'] = $this->ruleset->includePatterns; - - }//end __construct() - - - /** - * Set the content of the file. - * - * Setting the content also calculates the EOL char being used. - * - * @param string $content The file content. - * - * @return void - */ - public function setContent($content) - { - $this->content = $content; - $this->tokens = []; - - try { - $this->eolChar = Util\Common::detectLineEndings($content); - } catch (RuntimeException $e) { - $this->addWarningOnLine($e->getMessage(), 1, 'Internal.DetectLineEndings'); - return; - } - - }//end setContent() - - - /** - * Reloads the content of the file. - * - * By default, we have no idea where our content comes from, - * so we can't do anything. - * - * @return void - */ - public function reloadContent() - { - - }//end reloadContent() - - - /** - * Disables caching of this file. - * - * @return void - */ - public function disableCaching() - { - $this->configCache['cache'] = false; - - }//end disableCaching() - - - /** - * Starts the stack traversal and tells listeners when tokens are found. - * - * @return void - */ - public function process() - { - if ($this->ignored === true) { - return; - } - - $this->errors = []; - $this->warnings = []; - $this->errorCount = 0; - $this->warningCount = 0; - $this->fixableCount = 0; - - $this->parse(); - - // Check if tokenizer errors cause this file to be ignored. - if ($this->ignored === true) { - return; - } - - $this->fixer->startFile($this); - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - echo "\t*** START TOKEN PROCESSING ***".PHP_EOL; - } - - $foundCode = false; - $listenerIgnoreTo = []; - $inTests = defined('PHP_CODESNIFFER_IN_TESTS'); - $checkAnnotations = $this->config->annotations; - - // Foreach of the listeners that have registered to listen for this - // token, get them to process it. - foreach ($this->tokens as $stackPtr => $token) { - // Check for ignored lines. - if ($checkAnnotations === true - && ($token['code'] === T_COMMENT - || $token['code'] === T_PHPCS_IGNORE_FILE - || $token['code'] === T_PHPCS_SET - || $token['code'] === T_DOC_COMMENT_STRING - || $token['code'] === T_DOC_COMMENT_TAG - || ($inTests === true && $token['code'] === T_INLINE_HTML)) - ) { - $commentText = ltrim($this->tokens[$stackPtr]['content'], ' /*'); - $commentTextLower = strtolower($commentText); - if (strpos($commentText, '@codingStandards') !== false) { - if (strpos($commentText, '@codingStandardsIgnoreFile') !== false) { - // Ignoring the whole file, just a little late. - $this->errors = []; - $this->warnings = []; - $this->errorCount = 0; - $this->warningCount = 0; - $this->fixableCount = 0; - return; - } else if (strpos($commentText, '@codingStandardsChangeSetting') !== false) { - $start = strpos($commentText, '@codingStandardsChangeSetting'); - $comment = substr($commentText, ($start + 30)); - $parts = explode(' ', $comment); - if (count($parts) >= 2) { - $sniffParts = explode('.', $parts[0]); - if (count($sniffParts) >= 3) { - // If the sniff code is not known to us, it has not been registered in this run. - // But don't throw an error as it could be there for a different standard to use. - if (isset($this->ruleset->sniffCodes[$parts[0]]) === true) { - $listenerCode = array_shift($parts); - $propertyCode = array_shift($parts); - $propertyValue = rtrim(implode(' ', $parts), " */\r\n"); - $listenerClass = $this->ruleset->sniffCodes[$listenerCode]; - $this->ruleset->setSniffProperty($listenerClass, $propertyCode, $propertyValue); - } - } - } - }//end if - } else if (substr($commentTextLower, 0, 16) === 'phpcs:ignorefile' - || substr($commentTextLower, 0, 17) === '@phpcs:ignorefile' - ) { - // Ignoring the whole file, just a little late. - $this->errors = []; - $this->warnings = []; - $this->errorCount = 0; - $this->warningCount = 0; - $this->fixableCount = 0; - return; - } else if (substr($commentTextLower, 0, 9) === 'phpcs:set' - || substr($commentTextLower, 0, 10) === '@phpcs:set' - ) { - if (isset($token['sniffCode']) === true) { - $listenerCode = $token['sniffCode']; - if (isset($this->ruleset->sniffCodes[$listenerCode]) === true) { - $propertyCode = $token['sniffProperty']; - $propertyValue = $token['sniffPropertyValue']; - $listenerClass = $this->ruleset->sniffCodes[$listenerCode]; - $this->ruleset->setSniffProperty($listenerClass, $propertyCode, $propertyValue); - } - } - }//end if - }//end if - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - $type = $token['type']; - $content = Util\Common::prepareForOutput($token['content']); - echo "\t\tProcess token $stackPtr: $type => $content".PHP_EOL; - } - - if ($token['code'] !== T_INLINE_HTML) { - $foundCode = true; - } - - if (isset($this->ruleset->tokenListeners[$token['code']]) === false) { - continue; - } - - foreach ($this->ruleset->tokenListeners[$token['code']] as $listenerData) { - if (isset($this->ignoredListeners[$listenerData['class']]) === true - || (isset($listenerIgnoreTo[$listenerData['class']]) === true - && $listenerIgnoreTo[$listenerData['class']] > $stackPtr) - ) { - // This sniff is ignoring past this token, or the whole file. - continue; - } - - // Make sure this sniff supports the tokenizer - // we are currently using. - $class = $listenerData['class']; - - if (isset($listenerData['tokenizers'][$this->tokenizerType]) === false) { - continue; - } - - // If the file path matches one of our ignore patterns, skip it. - // While there is support for a type of each pattern - // (absolute or relative) we don't actually support it here. - foreach ($listenerData['ignore'] as $pattern) { - // We assume a / directory separator, as do the exclude rules - // most developers write, so we need a special case for any system - // that is different. - if (DIRECTORY_SEPARATOR === '\\') { - $pattern = str_replace('/', '\\\\', $pattern); - } - - $pattern = '`'.$pattern.'`i'; - if (preg_match($pattern, $this->path) === 1) { - $this->ignoredListeners[$class] = true; - continue(2); - } - } - - // If the file path does not match one of our include patterns, skip it. - // While there is support for a type of each pattern - // (absolute or relative) we don't actually support it here. - if (empty($listenerData['include']) === false) { - $included = false; - foreach ($listenerData['include'] as $pattern) { - // We assume a / directory separator, as do the exclude rules - // most developers write, so we need a special case for any system - // that is different. - if (DIRECTORY_SEPARATOR === '\\') { - $pattern = str_replace('/', '\\\\', $pattern); - } - - $pattern = '`'.$pattern.'`i'; - if (preg_match($pattern, $this->path) === 1) { - $included = true; - break; - } - } - - if ($included === false) { - $this->ignoredListeners[$class] = true; - continue; - } - }//end if - - $this->activeListener = $class; - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - $startTime = microtime(true); - echo "\t\t\tProcessing ".$this->activeListener.'... '; - } - - $ignoreTo = $this->ruleset->sniffs[$class]->process($this, $stackPtr); - if ($ignoreTo !== null) { - $listenerIgnoreTo[$this->activeListener] = $ignoreTo; - } - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - $timeTaken = (microtime(true) - $startTime); - if (isset($this->listenerTimes[$this->activeListener]) === false) { - $this->listenerTimes[$this->activeListener] = 0; - } - - $this->listenerTimes[$this->activeListener] += $timeTaken; - - $timeTaken = round(($timeTaken), 4); - echo "DONE in $timeTaken seconds".PHP_EOL; - } - - $this->activeListener = ''; - }//end foreach - }//end foreach - - // If short open tags are off but the file being checked uses - // short open tags, the whole content will be inline HTML - // and nothing will be checked. So try and handle this case. - // We don't show this error for STDIN because we can't be sure the content - // actually came directly from the user. It could be something like - // refs from a Git pre-push hook. - if ($foundCode === false && $this->tokenizerType === 'PHP' && $this->path !== 'STDIN') { - $shortTags = (bool) ini_get('short_open_tag'); - if ($shortTags === false) { - $error = 'No PHP code was found in this file and short open tags are not allowed by this install of PHP. This file may be using short open tags but PHP does not allow them.'; - $this->addWarning($error, null, 'Internal.NoCodeFound'); - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - echo "\t*** END TOKEN PROCESSING ***".PHP_EOL; - echo "\t*** START SNIFF PROCESSING REPORT ***".PHP_EOL; - - asort($this->listenerTimes, SORT_NUMERIC); - $this->listenerTimes = array_reverse($this->listenerTimes, true); - foreach ($this->listenerTimes as $listener => $timeTaken) { - echo "\t$listener: ".round(($timeTaken), 4).' secs'.PHP_EOL; - } - - echo "\t*** END SNIFF PROCESSING REPORT ***".PHP_EOL; - } - - $this->fixedCount += $this->fixer->getFixCount(); - - }//end process() - - - /** - * Tokenizes the file and prepares it for the test run. - * - * @return void - */ - public function parse() - { - if (empty($this->tokens) === false) { - // File has already been parsed. - return; - } - - try { - $tokenizerClass = 'PHP_CodeSniffer\Tokenizers\\'.$this->tokenizerType; - $this->tokenizer = new $tokenizerClass($this->content, $this->config, $this->eolChar); - $this->tokens = $this->tokenizer->getTokens(); - } catch (TokenizerException $e) { - $this->ignored = true; - $this->addWarning($e->getMessage(), null, 'Internal.Tokenizer.Exception'); - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo "[$this->tokenizerType => tokenizer error]... "; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - } - - return; - } - - $this->numTokens = count($this->tokens); - - // Check for mixed line endings as these can cause tokenizer errors and we - // should let the user know that the results they get may be incorrect. - // This is done by removing all backslashes, removing the newline char we - // detected, then converting newlines chars into text. If any backslashes - // are left at the end, we have additional newline chars in use. - $contents = str_replace('\\', '', $this->content); - $contents = str_replace($this->eolChar, '', $contents); - $contents = str_replace("\n", '\n', $contents); - $contents = str_replace("\r", '\r', $contents); - if (strpos($contents, '\\') !== false) { - $error = 'File has mixed line endings; this may cause incorrect results'; - $this->addWarningOnLine($error, 1, 'Internal.LineEndings.Mixed'); - } - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - if ($this->numTokens === 0) { - $numLines = 0; - } else { - $numLines = $this->tokens[($this->numTokens - 1)]['line']; - } - - echo "[$this->tokenizerType => $this->numTokens tokens in $numLines lines]... "; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - } - - }//end parse() - - - /** - * Returns the token stack for this file. - * - * @return array - */ - public function getTokens() - { - return $this->tokens; - - }//end getTokens() - - - /** - * Remove vars stored in this file that are no longer required. - * - * @return void - */ - public function cleanUp() - { - $this->listenerTimes = null; - $this->content = null; - $this->tokens = null; - $this->metricTokens = null; - $this->tokenizer = null; - $this->fixer = null; - $this->config = null; - $this->ruleset = null; - - }//end cleanUp() - - - /** - * Records an error against a specific token in the file. - * - * @param string $error The error message. - * @param int $stackPtr The stack position where the error occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the error message. - * @param int $severity The severity level for this error. A value of 0 - * will be converted into the default severity level. - * @param boolean $fixable Can the error be fixed by the sniff? - * - * @return boolean - */ - public function addError( - $error, - $stackPtr, - $code, - $data=[], - $severity=0, - $fixable=false - ) { - if ($stackPtr === null) { - $line = 1; - $column = 1; - } else { - $line = $this->tokens[$stackPtr]['line']; - $column = $this->tokens[$stackPtr]['column']; - } - - return $this->addMessage(true, $error, $line, $column, $code, $data, $severity, $fixable); - - }//end addError() - - - /** - * Records a warning against a specific token in the file. - * - * @param string $warning The error message. - * @param int $stackPtr The stack position where the error occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the warning message. - * @param int $severity The severity level for this warning. A value of 0 - * will be converted into the default severity level. - * @param boolean $fixable Can the warning be fixed by the sniff? - * - * @return boolean - */ - public function addWarning( - $warning, - $stackPtr, - $code, - $data=[], - $severity=0, - $fixable=false - ) { - if ($stackPtr === null) { - $line = 1; - $column = 1; - } else { - $line = $this->tokens[$stackPtr]['line']; - $column = $this->tokens[$stackPtr]['column']; - } - - return $this->addMessage(false, $warning, $line, $column, $code, $data, $severity, $fixable); - - }//end addWarning() - - - /** - * Records an error against a specific line in the file. - * - * @param string $error The error message. - * @param int $line The line on which the error occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the error message. - * @param int $severity The severity level for this error. A value of 0 - * will be converted into the default severity level. - * - * @return boolean - */ - public function addErrorOnLine( - $error, - $line, - $code, - $data=[], - $severity=0 - ) { - return $this->addMessage(true, $error, $line, 1, $code, $data, $severity, false); - - }//end addErrorOnLine() - - - /** - * Records a warning against a specific token in the file. - * - * @param string $warning The error message. - * @param int $line The line on which the warning occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the warning message. - * @param int $severity The severity level for this warning. A value of 0 will - * will be converted into the default severity level. - * - * @return boolean - */ - public function addWarningOnLine( - $warning, - $line, - $code, - $data=[], - $severity=0 - ) { - return $this->addMessage(false, $warning, $line, 1, $code, $data, $severity, false); - - }//end addWarningOnLine() - - - /** - * Records a fixable error against a specific token in the file. - * - * Returns true if the error was recorded and should be fixed. - * - * @param string $error The error message. - * @param int $stackPtr The stack position where the error occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the error message. - * @param int $severity The severity level for this error. A value of 0 - * will be converted into the default severity level. - * - * @return boolean - */ - public function addFixableError( - $error, - $stackPtr, - $code, - $data=[], - $severity=0 - ) { - $recorded = $this->addError($error, $stackPtr, $code, $data, $severity, true); - if ($recorded === true && $this->fixer->enabled === true) { - return true; - } - - return false; - - }//end addFixableError() - - - /** - * Records a fixable warning against a specific token in the file. - * - * Returns true if the warning was recorded and should be fixed. - * - * @param string $warning The error message. - * @param int $stackPtr The stack position where the error occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the warning message. - * @param int $severity The severity level for this warning. A value of 0 - * will be converted into the default severity level. - * - * @return boolean - */ - public function addFixableWarning( - $warning, - $stackPtr, - $code, - $data=[], - $severity=0 - ) { - $recorded = $this->addWarning($warning, $stackPtr, $code, $data, $severity, true); - if ($recorded === true && $this->fixer->enabled === true) { - return true; - } - - return false; - - }//end addFixableWarning() - - - /** - * Adds an error to the error stack. - * - * @param boolean $error Is this an error message? - * @param string $message The text of the message. - * @param int $line The line on which the message occurred. - * @param int $column The column at which the message occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the message. - * @param int $severity The severity level for this message. A value of 0 - * will be converted into the default severity level. - * @param boolean $fixable Can the problem be fixed by the sniff? - * - * @return boolean - */ - protected function addMessage($error, $message, $line, $column, $code, $data, $severity, $fixable) - { - // Check if this line is ignoring all message codes. - if (isset($this->tokenizer->ignoredLines[$line]['.all']) === true) { - return false; - } - - // Work out which sniff generated the message. - $parts = explode('.', $code); - if ($parts[0] === 'Internal') { - // An internal message. - $listenerCode = Util\Common::getSniffCode($this->activeListener); - $sniffCode = $code; - $checkCodes = [$sniffCode]; - } else { - if ($parts[0] !== $code) { - // The full message code has been passed in. - $sniffCode = $code; - $listenerCode = substr($sniffCode, 0, strrpos($sniffCode, '.')); - } else { - $listenerCode = Util\Common::getSniffCode($this->activeListener); - $sniffCode = $listenerCode.'.'.$code; - $parts = explode('.', $sniffCode); - } - - $checkCodes = [ - $sniffCode, - $parts[0].'.'.$parts[1].'.'.$parts[2], - $parts[0].'.'.$parts[1], - $parts[0], - ]; - }//end if - - if (isset($this->tokenizer->ignoredLines[$line]) === true) { - // Check if this line is ignoring this specific message. - $ignored = false; - foreach ($checkCodes as $checkCode) { - if (isset($this->tokenizer->ignoredLines[$line][$checkCode]) === true) { - $ignored = true; - break; - } - } - - // If it is ignored, make sure it's not whitelisted. - if ($ignored === true - && isset($this->tokenizer->ignoredLines[$line]['.except']) === true - ) { - foreach ($checkCodes as $checkCode) { - if (isset($this->tokenizer->ignoredLines[$line]['.except'][$checkCode]) === true) { - $ignored = false; - break; - } - } - } - - if ($ignored === true) { - return false; - } - }//end if - - $includeAll = true; - if ($this->configCache['cache'] === false - || $this->configCache['recordErrors'] === false - ) { - $includeAll = false; - } - - // Filter out any messages for sniffs that shouldn't have run - // due to the use of the --sniffs command line argument. - if ($includeAll === false - && ((empty($this->configCache['sniffs']) === false - && in_array(strtolower($listenerCode), $this->configCache['sniffs'], true) === false) - || (empty($this->configCache['exclude']) === false - && in_array(strtolower($listenerCode), $this->configCache['exclude'], true) === true)) - ) { - return false; - } - - // If we know this sniff code is being ignored for this file, return early. - foreach ($checkCodes as $checkCode) { - if (isset($this->ignoredCodes[$checkCode]) === true) { - return false; - } - } - - $oppositeType = 'warning'; - if ($error === false) { - $oppositeType = 'error'; - } - - foreach ($checkCodes as $checkCode) { - // Make sure this message type has not been set to the opposite message type. - if (isset($this->ruleset->ruleset[$checkCode]['type']) === true - && $this->ruleset->ruleset[$checkCode]['type'] === $oppositeType - ) { - $error = !$error; - break; - } - } - - if ($error === true) { - $configSeverity = $this->configCache['errorSeverity']; - $messageCount = &$this->errorCount; - $messages = &$this->errors; - } else { - $configSeverity = $this->configCache['warningSeverity']; - $messageCount = &$this->warningCount; - $messages = &$this->warnings; - } - - if ($includeAll === false && $configSeverity === 0) { - // Don't bother doing any processing as these messages are just going to - // be hidden in the reports anyway. - return false; - } - - if ($severity === 0) { - $severity = 5; - } - - foreach ($checkCodes as $checkCode) { - // Make sure we are interested in this severity level. - if (isset($this->ruleset->ruleset[$checkCode]['severity']) === true) { - $severity = $this->ruleset->ruleset[$checkCode]['severity']; - break; - } - } - - if ($includeAll === false && $configSeverity > $severity) { - return false; - } - - // Make sure we are not ignoring this file. - $included = null; - foreach ($checkCodes as $checkCode) { - $patterns = null; - - if (isset($this->configCache['includePatterns'][$checkCode]) === true) { - $patterns = $this->configCache['includePatterns'][$checkCode]; - $excluding = false; - } else if (isset($this->configCache['ignorePatterns'][$checkCode]) === true) { - $patterns = $this->configCache['ignorePatterns'][$checkCode]; - $excluding = true; - } - - if ($patterns === null) { - continue; - } - - foreach ($patterns as $pattern => $type) { - // While there is support for a type of each pattern - // (absolute or relative) we don't actually support it here. - $replacements = [ - '\\,' => ',', - '*' => '.*', - ]; - - // We assume a / directory separator, as do the exclude rules - // most developers write, so we need a special case for any system - // that is different. - if (DIRECTORY_SEPARATOR === '\\') { - $replacements['/'] = '\\\\'; - } - - $pattern = '`'.strtr($pattern, $replacements).'`i'; - $matched = preg_match($pattern, $this->path); - - if ($matched === 0) { - if ($excluding === false && $included === null) { - // This file path is not being included. - $included = false; - } - - continue; - } - - if ($excluding === true) { - // This file path is being excluded. - $this->ignoredCodes[$checkCode] = true; - return false; - } - - // This file path is being included. - $included = true; - break; - }//end foreach - }//end foreach - - if ($included === false) { - // There were include rules set, but this file - // path didn't match any of them. - return false; - } - - $messageCount++; - if ($fixable === true) { - $this->fixableCount++; - } - - if ($this->configCache['recordErrors'] === false - && $includeAll === false - ) { - return true; - } - - // See if there is a custom error message format to use. - // But don't do this if we are replaying errors because replayed - // errors have already used the custom format and have had their - // data replaced. - if ($this->replayingErrors === false - && isset($this->ruleset->ruleset[$sniffCode]['message']) === true - ) { - $message = $this->ruleset->ruleset[$sniffCode]['message']; - } - - if (empty($data) === false) { - $message = vsprintf($message, $data); - } - - if (isset($messages[$line]) === false) { - $messages[$line] = []; - } - - if (isset($messages[$line][$column]) === false) { - $messages[$line][$column] = []; - } - - $messages[$line][$column][] = [ - 'message' => $message, - 'source' => $sniffCode, - 'listener' => $this->activeListener, - 'severity' => $severity, - 'fixable' => $fixable, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1 - && $this->fixer->enabled === true - && $fixable === true - ) { - @ob_end_clean(); - echo "\tE: [Line $line] $message ($sniffCode)".PHP_EOL; - ob_start(); - } - - return true; - - }//end addMessage() - - - /** - * Record a metric about the file being examined. - * - * @param int $stackPtr The stack position where the metric was recorded. - * @param string $metric The name of the metric being recorded. - * @param string $value The value of the metric being recorded. - * - * @return boolean - */ - public function recordMetric($stackPtr, $metric, $value) - { - if (isset($this->metrics[$metric]) === false) { - $this->metrics[$metric] = ['values' => [$value => 1]]; - $this->metricTokens[$metric][$stackPtr] = true; - } else if (isset($this->metricTokens[$metric][$stackPtr]) === false) { - $this->metricTokens[$metric][$stackPtr] = true; - if (isset($this->metrics[$metric]['values'][$value]) === false) { - $this->metrics[$metric]['values'][$value] = 1; - } else { - $this->metrics[$metric]['values'][$value]++; - } - } - - return true; - - }//end recordMetric() - - - /** - * Returns the number of errors raised. - * - * @return int - */ - public function getErrorCount() - { - return $this->errorCount; - - }//end getErrorCount() - - - /** - * Returns the number of warnings raised. - * - * @return int - */ - public function getWarningCount() - { - return $this->warningCount; - - }//end getWarningCount() - - - /** - * Returns the number of fixable errors/warnings raised. - * - * @return int - */ - public function getFixableCount() - { - return $this->fixableCount; - - }//end getFixableCount() - - - /** - * Returns the number of fixed errors/warnings. - * - * @return int - */ - public function getFixedCount() - { - return $this->fixedCount; - - }//end getFixedCount() - - - /** - * Returns the list of ignored lines. - * - * @return array - */ - public function getIgnoredLines() - { - return $this->tokenizer->ignoredLines; - - }//end getIgnoredLines() - - - /** - * Returns the errors raised from processing this file. - * - * @return array - */ - public function getErrors() - { - return $this->errors; - - }//end getErrors() - - - /** - * Returns the warnings raised from processing this file. - * - * @return array - */ - public function getWarnings() - { - return $this->warnings; - - }//end getWarnings() - - - /** - * Returns the metrics found while processing this file. - * - * @return array - */ - public function getMetrics() - { - return $this->metrics; - - }//end getMetrics() - - - /** - * Returns the absolute filename of this file. - * - * @return string - */ - public function getFilename() - { - return $this->path; - - }//end getFilename() - - - /** - * Returns the declaration names for classes, interfaces, traits, and functions. - * - * @param int $stackPtr The position of the declaration token which - * declared the class, interface, trait, or function. - * - * @return string|null The name of the class, interface, trait, or function; - * or NULL if the function or class is anonymous. - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified token is not of type - * T_FUNCTION, T_CLASS, T_ANON_CLASS, - * T_CLOSURE, T_TRAIT, or T_INTERFACE. - */ - public function getDeclarationName($stackPtr) - { - $tokenCode = $this->tokens[$stackPtr]['code']; - - if ($tokenCode === T_ANON_CLASS || $tokenCode === T_CLOSURE) { - return null; - } - - if ($tokenCode !== T_FUNCTION - && $tokenCode !== T_CLASS - && $tokenCode !== T_INTERFACE - && $tokenCode !== T_TRAIT - ) { - throw new RuntimeException('Token type "'.$this->tokens[$stackPtr]['type'].'" is not T_FUNCTION, T_CLASS, T_INTERFACE or T_TRAIT'); - } - - if ($tokenCode === T_FUNCTION - && strtolower($this->tokens[$stackPtr]['content']) !== 'function' - ) { - // This is a function declared without the "function" keyword. - // So this token is the function name. - return $this->tokens[$stackPtr]['content']; - } - - $content = null; - for ($i = $stackPtr; $i < $this->numTokens; $i++) { - if ($this->tokens[$i]['code'] === T_STRING) { - $content = $this->tokens[$i]['content']; - break; - } - } - - return $content; - - }//end getDeclarationName() - - - /** - * Returns the method parameters for the specified function token. - * - * Also supports passing in a USE token for a closure use group. - * - * Each parameter is in the following format: - * - * - * 0 => array( - * 'name' => '$var', // The variable name. - * 'token' => integer, // The stack pointer to the variable name. - * 'content' => string, // The full content of the variable definition. - * 'pass_by_reference' => boolean, // Is the variable passed by reference? - * 'reference_token' => integer, // The stack pointer to the reference operator - * // or FALSE if the param is not passed by reference. - * 'variable_length' => boolean, // Is the param of variable length through use of `...` ? - * 'variadic_token' => integer, // The stack pointer to the ... operator - * // or FALSE if the param is not variable length. - * 'type_hint' => string, // The type hint for the variable. - * 'type_hint_token' => integer, // The stack pointer to the start of the type hint - * // or FALSE if there is no type hint. - * 'type_hint_end_token' => integer, // The stack pointer to the end of the type hint - * // or FALSE if there is no type hint. - * 'nullable_type' => boolean, // TRUE if the var type is nullable. - * 'comma_token' => integer, // The stack pointer to the comma after the param - * // or FALSE if this is the last param. - * ) - * - * - * Parameters with default values have an additional array indexes of: - * 'default' => string, // The full content of the default value. - * 'default_token' => integer, // The stack pointer to the start of the default value. - * 'default_equal_token' => integer, // The stack pointer to the equals sign. - * - * @param int $stackPtr The position in the stack of the function token - * to acquire the parameters for. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified $stackPtr is not of - * type T_FUNCTION, T_CLOSURE, T_USE, - * or T_FN. - */ - public function getMethodParameters($stackPtr) - { - if ($this->tokens[$stackPtr]['code'] !== T_FUNCTION - && $this->tokens[$stackPtr]['code'] !== T_CLOSURE - && $this->tokens[$stackPtr]['code'] !== T_USE - && $this->tokens[$stackPtr]['code'] !== T_FN - ) { - throw new RuntimeException('$stackPtr must be of type T_FUNCTION or T_CLOSURE or T_USE or T_FN'); - } - - if ($this->tokens[$stackPtr]['code'] === T_USE) { - $opener = $this->findNext(T_OPEN_PARENTHESIS, ($stackPtr + 1)); - if ($opener === false || isset($this->tokens[$opener]['parenthesis_owner']) === true) { - throw new RuntimeException('$stackPtr was not a valid T_USE'); - } - } else { - if (isset($this->tokens[$stackPtr]['parenthesis_opener']) === false) { - // Live coding or syntax error, so no params to find. - return []; - } - - $opener = $this->tokens[$stackPtr]['parenthesis_opener']; - } - - if (isset($this->tokens[$opener]['parenthesis_closer']) === false) { - // Live coding or syntax error, so no params to find. - return []; - } - - $closer = $this->tokens[$opener]['parenthesis_closer']; - - $vars = []; - $currVar = null; - $paramStart = ($opener + 1); - $defaultStart = null; - $equalToken = null; - $paramCount = 0; - $passByReference = false; - $referenceToken = false; - $variableLength = false; - $variadicToken = false; - $typeHint = ''; - $typeHintToken = false; - $typeHintEndToken = false; - $nullableType = false; - - for ($i = $paramStart; $i <= $closer; $i++) { - // Check to see if this token has a parenthesis or bracket opener. If it does - // it's likely to be an array which might have arguments in it. This - // could cause problems in our parsing below, so lets just skip to the - // end of it. - if (isset($this->tokens[$i]['parenthesis_opener']) === true) { - // Don't do this if it's the close parenthesis for the method. - if ($i !== $this->tokens[$i]['parenthesis_closer']) { - $i = ($this->tokens[$i]['parenthesis_closer'] + 1); - } - } - - if (isset($this->tokens[$i]['bracket_opener']) === true) { - // Don't do this if it's the close parenthesis for the method. - if ($i !== $this->tokens[$i]['bracket_closer']) { - $i = ($this->tokens[$i]['bracket_closer'] + 1); - } - } - - switch ($this->tokens[$i]['code']) { - case T_BITWISE_AND: - if ($defaultStart === null) { - $passByReference = true; - $referenceToken = $i; - } - break; - case T_VARIABLE: - $currVar = $i; - break; - case T_ELLIPSIS: - $variableLength = true; - $variadicToken = $i; - break; - case T_CALLABLE: - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $this->tokens[$i]['content']; - $typeHintEndToken = $i; - break; - case T_SELF: - case T_PARENT: - case T_STATIC: - // Self and parent are valid, static invalid, but was probably intended as type hint. - if (isset($defaultStart) === false) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $this->tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_STRING: - // This is a string, so it may be a type hint, but it could - // also be a constant used as a default value. - $prevComma = false; - for ($t = $i; $t >= $opener; $t--) { - if ($this->tokens[$t]['code'] === T_COMMA) { - $prevComma = $t; - break; - } - } - - if ($prevComma !== false) { - $nextEquals = false; - for ($t = $prevComma; $t < $i; $t++) { - if ($this->tokens[$t]['code'] === T_EQUAL) { - $nextEquals = $t; - break; - } - } - - if ($nextEquals !== false) { - break; - } - } - - if ($defaultStart === null) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $this->tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_NS_SEPARATOR: - // Part of a type hint or default value. - if ($defaultStart === null) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $this->tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_NULLABLE: - if ($defaultStart === null) { - $nullableType = true; - $typeHint .= $this->tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_CLOSE_PARENTHESIS: - case T_COMMA: - // If it's null, then there must be no parameters for this - // method. - if ($currVar === null) { - continue 2; - } - - $vars[$paramCount] = []; - $vars[$paramCount]['token'] = $currVar; - $vars[$paramCount]['name'] = $this->tokens[$currVar]['content']; - $vars[$paramCount]['content'] = trim($this->getTokensAsString($paramStart, ($i - $paramStart))); - - if ($defaultStart !== null) { - $vars[$paramCount]['default'] = trim($this->getTokensAsString($defaultStart, ($i - $defaultStart))); - $vars[$paramCount]['default_token'] = $defaultStart; - $vars[$paramCount]['default_equal_token'] = $equalToken; - } - - $vars[$paramCount]['pass_by_reference'] = $passByReference; - $vars[$paramCount]['reference_token'] = $referenceToken; - $vars[$paramCount]['variable_length'] = $variableLength; - $vars[$paramCount]['variadic_token'] = $variadicToken; - $vars[$paramCount]['type_hint'] = $typeHint; - $vars[$paramCount]['type_hint_token'] = $typeHintToken; - $vars[$paramCount]['type_hint_end_token'] = $typeHintEndToken; - $vars[$paramCount]['nullable_type'] = $nullableType; - - if ($this->tokens[$i]['code'] === T_COMMA) { - $vars[$paramCount]['comma_token'] = $i; - } else { - $vars[$paramCount]['comma_token'] = false; - } - - // Reset the vars, as we are about to process the next parameter. - $currVar = null; - $paramStart = ($i + 1); - $defaultStart = null; - $equalToken = null; - $passByReference = false; - $referenceToken = false; - $variableLength = false; - $variadicToken = false; - $typeHint = ''; - $typeHintToken = false; - $typeHintEndToken = false; - $nullableType = false; - - $paramCount++; - break; - case T_EQUAL: - $defaultStart = $this->findNext(Util\Tokens::$emptyTokens, ($i + 1), null, true); - $equalToken = $i; - break; - }//end switch - }//end for - - return $vars; - - }//end getMethodParameters() - - - /** - * Returns the visibility and implementation properties of a method. - * - * The format of the return value is: - * - * array( - * 'scope' => 'public', // Public, private, or protected - * 'scope_specified' => true, // TRUE if the scope keyword was found. - * 'return_type' => '', // The return type of the method. - * 'return_type_token' => integer, // The stack pointer to the start of the return type - * // or FALSE if there is no return type. - * 'nullable_return_type' => false, // TRUE if the return type is nullable. - * 'is_abstract' => false, // TRUE if the abstract keyword was found. - * 'is_final' => false, // TRUE if the final keyword was found. - * 'is_static' => false, // TRUE if the static keyword was found. - * 'has_body' => false, // TRUE if the method has a body - * ); - * - * - * @param int $stackPtr The position in the stack of the function token to - * acquire the properties for. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified position is not a - * T_FUNCTION, T_CLOSURE, or T_FN token. - */ - public function getMethodProperties($stackPtr) - { - if ($this->tokens[$stackPtr]['code'] !== T_FUNCTION - && $this->tokens[$stackPtr]['code'] !== T_CLOSURE - && $this->tokens[$stackPtr]['code'] !== T_FN - ) { - throw new RuntimeException('$stackPtr must be of type T_FUNCTION or T_CLOSURE or T_FN'); - } - - if ($this->tokens[$stackPtr]['code'] === T_FUNCTION) { - $valid = [ - T_PUBLIC => T_PUBLIC, - T_PRIVATE => T_PRIVATE, - T_PROTECTED => T_PROTECTED, - T_STATIC => T_STATIC, - T_FINAL => T_FINAL, - T_ABSTRACT => T_ABSTRACT, - T_WHITESPACE => T_WHITESPACE, - T_COMMENT => T_COMMENT, - T_DOC_COMMENT => T_DOC_COMMENT, - ]; - } else { - $valid = [ - T_STATIC => T_STATIC, - T_WHITESPACE => T_WHITESPACE, - T_COMMENT => T_COMMENT, - T_DOC_COMMENT => T_DOC_COMMENT, - ]; - } - - $scope = 'public'; - $scopeSpecified = false; - $isAbstract = false; - $isFinal = false; - $isStatic = false; - - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if (isset($valid[$this->tokens[$i]['code']]) === false) { - break; - } - - switch ($this->tokens[$i]['code']) { - case T_PUBLIC: - $scope = 'public'; - $scopeSpecified = true; - break; - case T_PRIVATE: - $scope = 'private'; - $scopeSpecified = true; - break; - case T_PROTECTED: - $scope = 'protected'; - $scopeSpecified = true; - break; - case T_ABSTRACT: - $isAbstract = true; - break; - case T_FINAL: - $isFinal = true; - break; - case T_STATIC: - $isStatic = true; - break; - }//end switch - }//end for - - $returnType = ''; - $returnTypeToken = false; - $nullableReturnType = false; - $hasBody = true; - - if (isset($this->tokens[$stackPtr]['parenthesis_closer']) === true) { - $scopeOpener = null; - if (isset($this->tokens[$stackPtr]['scope_opener']) === true) { - $scopeOpener = $this->tokens[$stackPtr]['scope_opener']; - } - - $valid = [ - T_STRING => T_STRING, - T_CALLABLE => T_CALLABLE, - T_SELF => T_SELF, - T_PARENT => T_PARENT, - T_NS_SEPARATOR => T_NS_SEPARATOR, - ]; - - for ($i = $this->tokens[$stackPtr]['parenthesis_closer']; $i < $this->numTokens; $i++) { - if (($scopeOpener === null && $this->tokens[$i]['code'] === T_SEMICOLON) - || ($scopeOpener !== null && $i === $scopeOpener) - ) { - // End of function definition. - break; - } - - if ($this->tokens[$i]['code'] === T_NULLABLE) { - $nullableReturnType = true; - } - - if (isset($valid[$this->tokens[$i]['code']]) === true) { - if ($returnTypeToken === false) { - $returnTypeToken = $i; - } - - $returnType .= $this->tokens[$i]['content']; - } - } - - if ($this->tokens[$stackPtr]['code'] === T_FN) { - $bodyToken = T_FN_ARROW; - } else { - $bodyToken = T_OPEN_CURLY_BRACKET; - } - - $end = $this->findNext([$bodyToken, T_SEMICOLON], $this->tokens[$stackPtr]['parenthesis_closer']); - $hasBody = $this->tokens[$end]['code'] === $bodyToken; - }//end if - - if ($returnType !== '' && $nullableReturnType === true) { - $returnType = '?'.$returnType; - } - - return [ - 'scope' => $scope, - 'scope_specified' => $scopeSpecified, - 'return_type' => $returnType, - 'return_type_token' => $returnTypeToken, - 'nullable_return_type' => $nullableReturnType, - 'is_abstract' => $isAbstract, - 'is_final' => $isFinal, - 'is_static' => $isStatic, - 'has_body' => $hasBody, - ]; - - }//end getMethodProperties() - - - /** - * Returns the visibility and implementation properties of a class member var. - * - * The format of the return value is: - * - * - * array( - * 'scope' => string, // Public, private, or protected. - * 'scope_specified' => boolean, // TRUE if the scope was explicitly specified. - * 'is_static' => boolean, // TRUE if the static keyword was found. - * 'type' => string, // The type of the var (empty if no type specified). - * 'type_token' => integer, // The stack pointer to the start of the type - * // or FALSE if there is no type. - * 'type_end_token' => integer, // The stack pointer to the end of the type - * // or FALSE if there is no type. - * 'nullable_type' => boolean, // TRUE if the type is nullable. - * ); - * - * - * @param int $stackPtr The position in the stack of the T_VARIABLE token to - * acquire the properties for. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified position is not a - * T_VARIABLE token, or if the position is not - * a class member variable. - */ - public function getMemberProperties($stackPtr) - { - if ($this->tokens[$stackPtr]['code'] !== T_VARIABLE) { - throw new RuntimeException('$stackPtr must be of type T_VARIABLE'); - } - - $conditions = array_keys($this->tokens[$stackPtr]['conditions']); - $ptr = array_pop($conditions); - if (isset($this->tokens[$ptr]) === false - || ($this->tokens[$ptr]['code'] !== T_CLASS - && $this->tokens[$ptr]['code'] !== T_ANON_CLASS - && $this->tokens[$ptr]['code'] !== T_TRAIT) - ) { - if (isset($this->tokens[$ptr]) === true - && $this->tokens[$ptr]['code'] === T_INTERFACE - ) { - // T_VARIABLEs in interfaces can actually be method arguments - // but they wont be seen as being inside the method because there - // are no scope openers and closers for abstract methods. If it is in - // parentheses, we can be pretty sure it is a method argument. - if (isset($this->tokens[$stackPtr]['nested_parenthesis']) === false - || empty($this->tokens[$stackPtr]['nested_parenthesis']) === true - ) { - $error = 'Possible parse error: interfaces may not include member vars'; - $this->addWarning($error, $stackPtr, 'Internal.ParseError.InterfaceHasMemberVar'); - return []; - } - } else { - throw new RuntimeException('$stackPtr is not a class member var'); - } - } - - // Make sure it's not a method parameter. - if (empty($this->tokens[$stackPtr]['nested_parenthesis']) === false) { - $parenthesis = array_keys($this->tokens[$stackPtr]['nested_parenthesis']); - $deepestOpen = array_pop($parenthesis); - if ($deepestOpen > $ptr - && isset($this->tokens[$deepestOpen]['parenthesis_owner']) === true - && $this->tokens[$this->tokens[$deepestOpen]['parenthesis_owner']]['code'] === T_FUNCTION - ) { - throw new RuntimeException('$stackPtr is not a class member var'); - } - } - - $valid = [ - T_PUBLIC => T_PUBLIC, - T_PRIVATE => T_PRIVATE, - T_PROTECTED => T_PROTECTED, - T_STATIC => T_STATIC, - T_VAR => T_VAR, - ]; - - $valid += Util\Tokens::$emptyTokens; - - $scope = 'public'; - $scopeSpecified = false; - $isStatic = false; - - $startOfStatement = $this->findPrevious( - [ - T_SEMICOLON, - T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET, - ], - ($stackPtr - 1) - ); - - for ($i = ($startOfStatement + 1); $i < $stackPtr; $i++) { - if (isset($valid[$this->tokens[$i]['code']]) === false) { - break; - } - - switch ($this->tokens[$i]['code']) { - case T_PUBLIC: - $scope = 'public'; - $scopeSpecified = true; - break; - case T_PRIVATE: - $scope = 'private'; - $scopeSpecified = true; - break; - case T_PROTECTED: - $scope = 'protected'; - $scopeSpecified = true; - break; - case T_STATIC: - $isStatic = true; - break; - } - }//end for - - $type = ''; - $typeToken = false; - $typeEndToken = false; - $nullableType = false; - - if ($i < $stackPtr) { - // We've found a type. - $valid = [ - T_STRING => T_STRING, - T_CALLABLE => T_CALLABLE, - T_SELF => T_SELF, - T_PARENT => T_PARENT, - T_NS_SEPARATOR => T_NS_SEPARATOR, - ]; - - for ($i; $i < $stackPtr; $i++) { - if ($this->tokens[$i]['code'] === T_VARIABLE) { - // Hit another variable in a group definition. - break; - } - - if ($this->tokens[$i]['code'] === T_NULLABLE) { - $nullableType = true; - } - - if (isset($valid[$this->tokens[$i]['code']]) === true) { - $typeEndToken = $i; - if ($typeToken === false) { - $typeToken = $i; - } - - $type .= $this->tokens[$i]['content']; - } - } - - if ($type !== '' && $nullableType === true) { - $type = '?'.$type; - } - }//end if - - return [ - 'scope' => $scope, - 'scope_specified' => $scopeSpecified, - 'is_static' => $isStatic, - 'type' => $type, - 'type_token' => $typeToken, - 'type_end_token' => $typeEndToken, - 'nullable_type' => $nullableType, - ]; - - }//end getMemberProperties() - - - /** - * Returns the visibility and implementation properties of a class. - * - * The format of the return value is: - * - * array( - * 'is_abstract' => false, // true if the abstract keyword was found. - * 'is_final' => false, // true if the final keyword was found. - * ); - * - * - * @param int $stackPtr The position in the stack of the T_CLASS token to - * acquire the properties for. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified position is not a - * T_CLASS token. - */ - public function getClassProperties($stackPtr) - { - if ($this->tokens[$stackPtr]['code'] !== T_CLASS) { - throw new RuntimeException('$stackPtr must be of type T_CLASS'); - } - - $valid = [ - T_FINAL => T_FINAL, - T_ABSTRACT => T_ABSTRACT, - T_WHITESPACE => T_WHITESPACE, - T_COMMENT => T_COMMENT, - T_DOC_COMMENT => T_DOC_COMMENT, - ]; - - $isAbstract = false; - $isFinal = false; - - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if (isset($valid[$this->tokens[$i]['code']]) === false) { - break; - } - - switch ($this->tokens[$i]['code']) { - case T_ABSTRACT: - $isAbstract = true; - break; - - case T_FINAL: - $isFinal = true; - break; - } - }//end for - - return [ - 'is_abstract' => $isAbstract, - 'is_final' => $isFinal, - ]; - - }//end getClassProperties() - - - /** - * Determine if the passed token is a reference operator. - * - * Returns true if the specified token position represents a reference. - * Returns false if the token represents a bitwise operator. - * - * @param int $stackPtr The position of the T_BITWISE_AND token. - * - * @return boolean - */ - public function isReference($stackPtr) - { - if ($this->tokens[$stackPtr]['code'] !== T_BITWISE_AND) { - return false; - } - - $tokenBefore = $this->findPrevious( - Util\Tokens::$emptyTokens, - ($stackPtr - 1), - null, - true - ); - - if ($this->tokens[$tokenBefore]['code'] === T_FUNCTION - || $this->tokens[$tokenBefore]['code'] === T_FN - ) { - // Function returns a reference. - return true; - } - - if ($this->tokens[$tokenBefore]['code'] === T_DOUBLE_ARROW) { - // Inside a foreach loop or array assignment, this is a reference. - return true; - } - - if ($this->tokens[$tokenBefore]['code'] === T_AS) { - // Inside a foreach loop, this is a reference. - return true; - } - - if (isset(Util\Tokens::$assignmentTokens[$this->tokens[$tokenBefore]['code']]) === true) { - // This is directly after an assignment. It's a reference. Even if - // it is part of an operation, the other tests will handle it. - return true; - } - - $tokenAfter = $this->findNext( - Util\Tokens::$emptyTokens, - ($stackPtr + 1), - null, - true - ); - - if ($this->tokens[$tokenAfter]['code'] === T_NEW) { - return true; - } - - if (isset($this->tokens[$stackPtr]['nested_parenthesis']) === true) { - $brackets = $this->tokens[$stackPtr]['nested_parenthesis']; - $lastBracket = array_pop($brackets); - if (isset($this->tokens[$lastBracket]['parenthesis_owner']) === true) { - $owner = $this->tokens[$this->tokens[$lastBracket]['parenthesis_owner']]; - if ($owner['code'] === T_FUNCTION - || $owner['code'] === T_CLOSURE - ) { - $params = $this->getMethodParameters($this->tokens[$lastBracket]['parenthesis_owner']); - foreach ($params as $param) { - $varToken = $tokenAfter; - if ($param['variable_length'] === true) { - $varToken = $this->findNext( - (Util\Tokens::$emptyTokens + [T_ELLIPSIS]), - ($stackPtr + 1), - null, - true - ); - } - - if ($param['token'] === $varToken - && $param['pass_by_reference'] === true - ) { - // Function parameter declared to be passed by reference. - return true; - } - } - }//end if - } else { - $prev = false; - for ($t = ($this->tokens[$lastBracket]['parenthesis_opener'] - 1); $t >= 0; $t--) { - if ($this->tokens[$t]['code'] !== T_WHITESPACE) { - $prev = $t; - break; - } - } - - if ($prev !== false && $this->tokens[$prev]['code'] === T_USE) { - // Closure use by reference. - return true; - } - }//end if - }//end if - - // Pass by reference in function calls and assign by reference in arrays. - if ($this->tokens[$tokenBefore]['code'] === T_OPEN_PARENTHESIS - || $this->tokens[$tokenBefore]['code'] === T_COMMA - || $this->tokens[$tokenBefore]['code'] === T_OPEN_SHORT_ARRAY - ) { - if ($this->tokens[$tokenAfter]['code'] === T_VARIABLE) { - return true; - } else { - $skip = Util\Tokens::$emptyTokens; - $skip[] = T_NS_SEPARATOR; - $skip[] = T_SELF; - $skip[] = T_PARENT; - $skip[] = T_STATIC; - $skip[] = T_STRING; - $skip[] = T_NAMESPACE; - $skip[] = T_DOUBLE_COLON; - - $nextSignificantAfter = $this->findNext( - $skip, - ($stackPtr + 1), - null, - true - ); - if ($this->tokens[$nextSignificantAfter]['code'] === T_VARIABLE) { - return true; - } - }//end if - }//end if - - return false; - - }//end isReference() - - - /** - * Returns the content of the tokens from the specified start position in - * the token stack for the specified length. - * - * @param int $start The position to start from in the token stack. - * @param int $length The length of tokens to traverse from the start pos. - * @param bool $origContent Whether the original content or the tab replaced - * content should be used. - * - * @return string The token contents. - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified position does not exist. - */ - public function getTokensAsString($start, $length, $origContent=false) - { - if (is_int($start) === false || isset($this->tokens[$start]) === false) { - throw new RuntimeException('The $start position for getTokensAsString() must exist in the token stack'); - } - - if (is_int($length) === false || $length <= 0) { - return ''; - } - - $str = ''; - $end = ($start + $length); - if ($end > $this->numTokens) { - $end = $this->numTokens; - } - - for ($i = $start; $i < $end; $i++) { - // If tabs are being converted to spaces by the tokeniser, the - // original content should be used instead of the converted content. - if ($origContent === true && isset($this->tokens[$i]['orig_content']) === true) { - $str .= $this->tokens[$i]['orig_content']; - } else { - $str .= $this->tokens[$i]['content']; - } - } - - return $str; - - }//end getTokensAsString() - - - /** - * Returns the position of the previous specified token(s). - * - * If a value is specified, the previous token of the specified type(s) - * containing the specified value will be returned. - * - * Returns false if no token can be found. - * - * @param int|string|array $types The type(s) of tokens to search for. - * @param int $start The position to start searching from in the - * token stack. - * @param int $end The end position to fail if no token is found. - * if not specified or null, end will default to - * the start of the token stack. - * @param bool $exclude If true, find the previous token that is NOT of - * the types specified in $types. - * @param string $value The value that the token(s) must be equal to. - * If value is omitted, tokens with any value will - * be returned. - * @param bool $local If true, tokens outside the current statement - * will not be checked. IE. checking will stop - * at the previous semi-colon found. - * - * @return int|false - * @see findNext() - */ - public function findPrevious( - $types, - $start, - $end=null, - $exclude=false, - $value=null, - $local=false - ) { - $types = (array) $types; - - if ($end === null) { - $end = 0; - } - - for ($i = $start; $i >= $end; $i--) { - $found = (bool) $exclude; - foreach ($types as $type) { - if ($this->tokens[$i]['code'] === $type) { - $found = !$exclude; - break; - } - } - - if ($found === true) { - if ($value === null) { - return $i; - } else if ($this->tokens[$i]['content'] === $value) { - return $i; - } - } - - if ($local === true) { - if (isset($this->tokens[$i]['scope_opener']) === true - && $i === $this->tokens[$i]['scope_closer'] - ) { - $i = $this->tokens[$i]['scope_opener']; - } else if (isset($this->tokens[$i]['bracket_opener']) === true - && $i === $this->tokens[$i]['bracket_closer'] - ) { - $i = $this->tokens[$i]['bracket_opener']; - } else if (isset($this->tokens[$i]['parenthesis_opener']) === true - && $i === $this->tokens[$i]['parenthesis_closer'] - ) { - $i = $this->tokens[$i]['parenthesis_opener']; - } else if ($this->tokens[$i]['code'] === T_SEMICOLON) { - break; - } - } - }//end for - - return false; - - }//end findPrevious() - - - /** - * Returns the position of the next specified token(s). - * - * If a value is specified, the next token of the specified type(s) - * containing the specified value will be returned. - * - * Returns false if no token can be found. - * - * @param int|string|array $types The type(s) of tokens to search for. - * @param int $start The position to start searching from in the - * token stack. - * @param int $end The end position to fail if no token is found. - * if not specified or null, end will default to - * the end of the token stack. - * @param bool $exclude If true, find the next token that is NOT of - * a type specified in $types. - * @param string $value The value that the token(s) must be equal to. - * If value is omitted, tokens with any value will - * be returned. - * @param bool $local If true, tokens outside the current statement - * will not be checked. i.e., checking will stop - * at the next semi-colon found. - * - * @return int|false - * @see findPrevious() - */ - public function findNext( - $types, - $start, - $end=null, - $exclude=false, - $value=null, - $local=false - ) { - $types = (array) $types; - - if ($end === null || $end > $this->numTokens) { - $end = $this->numTokens; - } - - for ($i = $start; $i < $end; $i++) { - $found = (bool) $exclude; - foreach ($types as $type) { - if ($this->tokens[$i]['code'] === $type) { - $found = !$exclude; - break; - } - } - - if ($found === true) { - if ($value === null) { - return $i; - } else if ($this->tokens[$i]['content'] === $value) { - return $i; - } - } - - if ($local === true && $this->tokens[$i]['code'] === T_SEMICOLON) { - break; - } - }//end for - - return false; - - }//end findNext() - - - /** - * Returns the position of the first non-whitespace token in a statement. - * - * @param int $start The position to start searching from in the token stack. - * @param int|string|array $ignore Token types that should not be considered stop points. - * - * @return int - */ - public function findStartOfStatement($start, $ignore=null) - { - $endTokens = Util\Tokens::$blockOpeners; - - $endTokens[T_COLON] = true; - $endTokens[T_COMMA] = true; - $endTokens[T_DOUBLE_ARROW] = true; - $endTokens[T_SEMICOLON] = true; - $endTokens[T_OPEN_TAG] = true; - $endTokens[T_CLOSE_TAG] = true; - $endTokens[T_OPEN_SHORT_ARRAY] = true; - - if ($ignore !== null) { - $ignore = (array) $ignore; - foreach ($ignore as $code) { - unset($endTokens[$code]); - } - } - - $lastNotEmpty = $start; - - for ($i = $start; $i >= 0; $i--) { - if (isset($endTokens[$this->tokens[$i]['code']]) === true) { - // Found the end of the previous statement. - return $lastNotEmpty; - } - - if (isset($this->tokens[$i]['scope_opener']) === true - && $i === $this->tokens[$i]['scope_closer'] - && $this->tokens[$i]['code'] !== T_CLOSE_PARENTHESIS - ) { - // Found the end of the previous scope block. - return $lastNotEmpty; - } - - // Skip nested statements. - if (isset($this->tokens[$i]['bracket_opener']) === true - && $i === $this->tokens[$i]['bracket_closer'] - ) { - $i = $this->tokens[$i]['bracket_opener']; - } else if (isset($this->tokens[$i]['parenthesis_opener']) === true - && $i === $this->tokens[$i]['parenthesis_closer'] - ) { - $i = $this->tokens[$i]['parenthesis_opener']; - } - - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$i]['code']]) === false) { - $lastNotEmpty = $i; - } - }//end for - - return 0; - - }//end findStartOfStatement() - - - /** - * Returns the position of the last non-whitespace token in a statement. - * - * @param int $start The position to start searching from in the token stack. - * @param int|string|array $ignore Token types that should not be considered stop points. - * - * @return int - */ - public function findEndOfStatement($start, $ignore=null) - { - $endTokens = [ - T_COLON => true, - T_COMMA => true, - T_DOUBLE_ARROW => true, - T_SEMICOLON => true, - T_CLOSE_PARENTHESIS => true, - T_CLOSE_SQUARE_BRACKET => true, - T_CLOSE_CURLY_BRACKET => true, - T_CLOSE_SHORT_ARRAY => true, - T_OPEN_TAG => true, - T_CLOSE_TAG => true, - ]; - - if ($ignore !== null) { - $ignore = (array) $ignore; - foreach ($ignore as $code) { - unset($endTokens[$code]); - } - } - - $lastNotEmpty = $start; - for ($i = $start; $i < $this->numTokens; $i++) { - if ($i !== $start && isset($endTokens[$this->tokens[$i]['code']]) === true) { - // Found the end of the statement. - if ($this->tokens[$i]['code'] === T_CLOSE_PARENTHESIS - || $this->tokens[$i]['code'] === T_CLOSE_SQUARE_BRACKET - || $this->tokens[$i]['code'] === T_CLOSE_CURLY_BRACKET - || $this->tokens[$i]['code'] === T_CLOSE_SHORT_ARRAY - || $this->tokens[$i]['code'] === T_OPEN_TAG - || $this->tokens[$i]['code'] === T_CLOSE_TAG - ) { - return $lastNotEmpty; - } - - return $i; - } - - // Skip nested statements. - if (isset($this->tokens[$i]['scope_closer']) === true - && ($i === $this->tokens[$i]['scope_opener'] - || $i === $this->tokens[$i]['scope_condition']) - ) { - if ($this->tokens[$i]['code'] === T_FN) { - $lastNotEmpty = $this->tokens[$i]['scope_closer']; - $i = ($this->tokens[$i]['scope_closer'] - 1); - continue; - } - - if ($i === $start && isset(Util\Tokens::$scopeOpeners[$this->tokens[$i]['code']]) === true) { - return $this->tokens[$i]['scope_closer']; - } - - $i = $this->tokens[$i]['scope_closer']; - } else if (isset($this->tokens[$i]['bracket_closer']) === true - && $i === $this->tokens[$i]['bracket_opener'] - ) { - $i = $this->tokens[$i]['bracket_closer']; - } else if (isset($this->tokens[$i]['parenthesis_closer']) === true - && $i === $this->tokens[$i]['parenthesis_opener'] - ) { - $i = $this->tokens[$i]['parenthesis_closer']; - } else if ($this->tokens[$i]['code'] === T_OPEN_USE_GROUP) { - $end = $this->findNext(T_CLOSE_USE_GROUP, ($i + 1)); - if ($end !== false) { - $i = $end; - } - }//end if - - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$i]['code']]) === false) { - $lastNotEmpty = $i; - } - }//end for - - return ($this->numTokens - 1); - - }//end findEndOfStatement() - - - /** - * Returns the position of the first token on a line, matching given type. - * - * Returns false if no token can be found. - * - * @param int|string|array $types The type(s) of tokens to search for. - * @param int $start The position to start searching from in the - * token stack. The first token matching on - * this line before this token will be returned. - * @param bool $exclude If true, find the token that is NOT of - * the types specified in $types. - * @param string $value The value that the token must be equal to. - * If value is omitted, tokens with any value will - * be returned. - * - * @return int|false - */ - public function findFirstOnLine($types, $start, $exclude=false, $value=null) - { - if (is_array($types) === false) { - $types = [$types]; - } - - $foundToken = false; - - for ($i = $start; $i >= 0; $i--) { - if ($this->tokens[$i]['line'] < $this->tokens[$start]['line']) { - break; - } - - $found = $exclude; - foreach ($types as $type) { - if ($exclude === false) { - if ($this->tokens[$i]['code'] === $type) { - $found = true; - break; - } - } else { - if ($this->tokens[$i]['code'] === $type) { - $found = false; - break; - } - } - } - - if ($found === true) { - if ($value === null) { - $foundToken = $i; - } else if ($this->tokens[$i]['content'] === $value) { - $foundToken = $i; - } - } - }//end for - - return $foundToken; - - }//end findFirstOnLine() - - - /** - * Determine if the passed token has a condition of one of the passed types. - * - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array $types The type(s) of tokens to search for. - * - * @return boolean - */ - public function hasCondition($stackPtr, $types) - { - // Check for the existence of the token. - if (isset($this->tokens[$stackPtr]) === false) { - return false; - } - - // Make sure the token has conditions. - if (isset($this->tokens[$stackPtr]['conditions']) === false) { - return false; - } - - $types = (array) $types; - $conditions = $this->tokens[$stackPtr]['conditions']; - - foreach ($types as $type) { - if (in_array($type, $conditions, true) === true) { - // We found a token with the required type. - return true; - } - } - - return false; - - }//end hasCondition() - - - /** - * Return the position of the condition for the passed token. - * - * Returns FALSE if the token does not have the condition. - * - * @param int $stackPtr The position of the token we are checking. - * @param int|string $type The type of token to search for. - * @param bool $first If TRUE, will return the matched condition - * furtherest away from the passed token. - * If FALSE, will return the matched condition - * closest to the passed token. - * - * @return int|false - */ - public function getCondition($stackPtr, $type, $first=true) - { - // Check for the existence of the token. - if (isset($this->tokens[$stackPtr]) === false) { - return false; - } - - // Make sure the token has conditions. - if (isset($this->tokens[$stackPtr]['conditions']) === false) { - return false; - } - - $conditions = $this->tokens[$stackPtr]['conditions']; - if ($first === false) { - $conditions = array_reverse($conditions, true); - } - - foreach ($conditions as $token => $condition) { - if ($condition === $type) { - return $token; - } - } - - return false; - - }//end getCondition() - - - /** - * Returns the name of the class that the specified class extends. - * (works for classes, anonymous classes and interfaces) - * - * Returns FALSE on error or if there is no extended class name. - * - * @param int $stackPtr The stack position of the class. - * - * @return string|false - */ - public function findExtendedClassName($stackPtr) - { - // Check for the existence of the token. - if (isset($this->tokens[$stackPtr]) === false) { - return false; - } - - if ($this->tokens[$stackPtr]['code'] !== T_CLASS - && $this->tokens[$stackPtr]['code'] !== T_ANON_CLASS - && $this->tokens[$stackPtr]['code'] !== T_INTERFACE - ) { - return false; - } - - if (isset($this->tokens[$stackPtr]['scope_opener']) === false) { - return false; - } - - $classOpenerIndex = $this->tokens[$stackPtr]['scope_opener']; - $extendsIndex = $this->findNext(T_EXTENDS, $stackPtr, $classOpenerIndex); - if ($extendsIndex === false) { - return false; - } - - $find = [ - T_NS_SEPARATOR, - T_STRING, - T_WHITESPACE, - ]; - - $end = $this->findNext($find, ($extendsIndex + 1), ($classOpenerIndex + 1), true); - $name = $this->getTokensAsString(($extendsIndex + 1), ($end - $extendsIndex - 1)); - $name = trim($name); - - if ($name === '') { - return false; - } - - return $name; - - }//end findExtendedClassName() - - - /** - * Returns the names of the interfaces that the specified class implements. - * - * Returns FALSE on error or if there are no implemented interface names. - * - * @param int $stackPtr The stack position of the class. - * - * @return array|false - */ - public function findImplementedInterfaceNames($stackPtr) - { - // Check for the existence of the token. - if (isset($this->tokens[$stackPtr]) === false) { - return false; - } - - if ($this->tokens[$stackPtr]['code'] !== T_CLASS - && $this->tokens[$stackPtr]['code'] !== T_ANON_CLASS - ) { - return false; - } - - if (isset($this->tokens[$stackPtr]['scope_closer']) === false) { - return false; - } - - $classOpenerIndex = $this->tokens[$stackPtr]['scope_opener']; - $implementsIndex = $this->findNext(T_IMPLEMENTS, $stackPtr, $classOpenerIndex); - if ($implementsIndex === false) { - return false; - } - - $find = [ - T_NS_SEPARATOR, - T_STRING, - T_WHITESPACE, - T_COMMA, - ]; - - $end = $this->findNext($find, ($implementsIndex + 1), ($classOpenerIndex + 1), true); - $name = $this->getTokensAsString(($implementsIndex + 1), ($end - $implementsIndex - 1)); - $name = trim($name); - - if ($name === '') { - return false; - } else { - $names = explode(',', $name); - $names = array_map('trim', $names); - return $names; - } - - }//end findImplementedInterfaceNames() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Files/FileList.php b/vendor/squizlabs/php_codesniffer/src/Files/FileList.php deleted file mode 100644 index 877b1c0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Files/FileList.php +++ /dev/null @@ -1,248 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Files; - -use PHP_CodeSniffer\Autoload; -use PHP_CodeSniffer\Util; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\DeepExitException; - -class FileList implements \Iterator, \Countable -{ - - /** - * A list of file paths that are included in the list. - * - * @var array - */ - private $files = []; - - /** - * The number of files in the list. - * - * @var integer - */ - private $numFiles = 0; - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - public $config = null; - - /** - * The ruleset used for the run. - * - * @var \PHP_CodeSniffer\Ruleset - */ - public $ruleset = null; - - /** - * An array of patterns to use for skipping files. - * - * @var array - */ - protected $ignorePatterns = []; - - - /** - * Constructs a file list and loads in an array of file paths to process. - * - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * - * @return void - */ - public function __construct(Config $config, Ruleset $ruleset) - { - $this->ruleset = $ruleset; - $this->config = $config; - - $paths = $config->files; - foreach ($paths as $path) { - $isPharFile = Util\Common::isPharFile($path); - if (is_dir($path) === true || $isPharFile === true) { - if ($isPharFile === true) { - $path = 'phar://'.$path; - } - - $filterClass = $this->getFilterClass(); - - $di = new \RecursiveDirectoryIterator($path, (\RecursiveDirectoryIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS)); - $filter = new $filterClass($di, $path, $config, $ruleset); - $iterator = new \RecursiveIteratorIterator($filter); - - foreach ($iterator as $file) { - $this->files[$file->getPathname()] = null; - $this->numFiles++; - } - } else { - $this->addFile($path); - }//end if - }//end foreach - - reset($this->files); - - }//end __construct() - - - /** - * Add a file to the list. - * - * If a file object has already been created, it can be passed here. - * If it is left NULL, it will be created when accessed. - * - * @param string $path The path to the file being added. - * @param \PHP_CodeSniffer\Files\File $file The file being added. - * - * @return void - */ - public function addFile($path, $file=null) - { - // No filtering is done for STDIN when the filename - // has not been specified. - if ($path === 'STDIN') { - $this->files[$path] = $file; - $this->numFiles++; - return; - } - - $filterClass = $this->getFilterClass(); - - $di = new \RecursiveArrayIterator([$path]); - $filter = new $filterClass($di, $path, $this->config, $this->ruleset); - $iterator = new \RecursiveIteratorIterator($filter); - - foreach ($iterator as $path) { - $this->files[$path] = $file; - $this->numFiles++; - } - - }//end addFile() - - - /** - * Get the class name of the filter being used for the run. - * - * @return string - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If the specified filter could not be found. - */ - private function getFilterClass() - { - $filterType = $this->config->filter; - - if ($filterType === null) { - $filterClass = '\PHP_CodeSniffer\Filters\Filter'; - } else { - if (strpos($filterType, '.') !== false) { - // This is a path to a custom filter class. - $filename = realpath($filterType); - if ($filename === false) { - $error = "ERROR: Custom filter \"$filterType\" not found".PHP_EOL; - throw new DeepExitException($error, 3); - } - - $filterClass = Autoload::loadFile($filename); - } else { - $filterClass = '\PHP_CodeSniffer\Filters\\'.$filterType; - } - } - - return $filterClass; - - }//end getFilterClass() - - - /** - * Rewind the iterator to the first file. - * - * @return void - */ - public function rewind() - { - reset($this->files); - - }//end rewind() - - - /** - * Get the file that is currently being processed. - * - * @return \PHP_CodeSniffer\Files\File - */ - public function current() - { - $path = key($this->files); - if ($this->files[$path] === null) { - $this->files[$path] = new LocalFile($path, $this->ruleset, $this->config); - } - - return $this->files[$path]; - - }//end current() - - - /** - * Return the file path of the current file being processed. - * - * @return void - */ - public function key() - { - return key($this->files); - - }//end key() - - - /** - * Move forward to the next file. - * - * @return void - */ - public function next() - { - next($this->files); - - }//end next() - - - /** - * Checks if current position is valid. - * - * @return boolean - */ - public function valid() - { - if (current($this->files) === false) { - return false; - } - - return true; - - }//end valid() - - - /** - * Return the number of files in the list. - * - * @return integer - */ - public function count() - { - return $this->numFiles; - - }//end count() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Files/LocalFile.php b/vendor/squizlabs/php_codesniffer/src/Files/LocalFile.php deleted file mode 100644 index 7c2c671..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Files/LocalFile.php +++ /dev/null @@ -1,218 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Files; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Util\Cache; - -class LocalFile extends File -{ - - - /** - * Creates a LocalFile object and sets the content. - * - * @param string $path The absolute path to the file. - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - */ - public function __construct($path, Ruleset $ruleset, Config $config) - { - $this->path = trim($path); - if (is_readable($this->path) === false) { - parent::__construct($this->path, $ruleset, $config); - $error = 'Error opening file; file no longer exists or you do not have access to read the file'; - $this->addMessage(true, $error, 1, 1, 'Internal.LocalFile', [], 5, false); - $this->ignored = true; - return; - } - - // Before we go and spend time tokenizing this file, just check - // to see if there is a tag up top to indicate that the whole - // file should be ignored. It must be on one of the first two lines. - if ($config->annotations === true) { - $handle = fopen($this->path, 'r'); - if ($handle !== false) { - $firstContent = fgets($handle); - $firstContent .= fgets($handle); - fclose($handle); - - if (strpos($firstContent, '@codingStandardsIgnoreFile') !== false - || stripos($firstContent, 'phpcs:ignorefile') !== false - ) { - // We are ignoring the whole file. - $this->ignored = true; - return; - } - } - } - - $this->reloadContent(); - - parent::__construct($this->path, $ruleset, $config); - - }//end __construct() - - - /** - * Loads the latest version of the file's content from the file system. - * - * @return void - */ - public function reloadContent() - { - $this->setContent(file_get_contents($this->path)); - - }//end reloadContent() - - - /** - * Processes the file. - * - * @return void - */ - public function process() - { - if ($this->ignored === true) { - return; - } - - if ($this->configCache['cache'] === false) { - parent::process(); - return; - } - - $hash = md5_file($this->path); - $hash .= fileperms($this->path); - $cache = Cache::get($this->path); - if ($cache !== false && $cache['hash'] === $hash) { - // We can't filter metrics, so just load all of them. - $this->metrics = $cache['metrics']; - - if ($this->configCache['recordErrors'] === true) { - // Replay the cached errors and warnings to filter out the ones - // we don't need for this specific run. - $this->configCache['cache'] = false; - $this->replayErrors($cache['errors'], $cache['warnings']); - $this->configCache['cache'] = true; - } else { - $this->errorCount = $cache['errorCount']; - $this->warningCount = $cache['warningCount']; - $this->fixableCount = $cache['fixableCount']; - } - - if (PHP_CODESNIFFER_VERBOSITY > 0 - || (PHP_CODESNIFFER_CBF === true && empty($this->config->files) === false) - ) { - echo "[loaded from cache]... "; - } - - $this->numTokens = $cache['numTokens']; - $this->fromCache = true; - return; - }//end if - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - - parent::process(); - - $cache = [ - 'hash' => $hash, - 'errors' => $this->errors, - 'warnings' => $this->warnings, - 'metrics' => $this->metrics, - 'errorCount' => $this->errorCount, - 'warningCount' => $this->warningCount, - 'fixableCount' => $this->fixableCount, - 'numTokens' => $this->numTokens, - ]; - - Cache::set($this->path, $cache); - - // During caching, we don't filter out errors in any way, so - // we need to do that manually now by replaying them. - if ($this->configCache['recordErrors'] === true) { - $this->configCache['cache'] = false; - $this->replayErrors($this->errors, $this->warnings); - $this->configCache['cache'] = true; - } - - }//end process() - - - /** - * Clears and replays error and warnings for the file. - * - * Replaying errors and warnings allows for filtering rules to be changed - * and then errors and warnings to be reapplied with the new rules. This is - * particularly useful while caching. - * - * @param array $errors The list of errors to replay. - * @param array $warnings The list of warnings to replay. - * - * @return void - */ - private function replayErrors($errors, $warnings) - { - $this->errors = []; - $this->warnings = []; - $this->errorCount = 0; - $this->warningCount = 0; - $this->fixableCount = 0; - - $this->replayingErrors = true; - - foreach ($errors as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $this->activeListener = $error['listener']; - $this->addMessage( - true, - $error['message'], - $line, - $column, - $error['source'], - [], - $error['severity'], - $error['fixable'] - ); - } - } - } - - foreach ($warnings as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $this->activeListener = $error['listener']; - $this->addMessage( - false, - $error['message'], - $line, - $column, - $error['source'], - [], - $error['severity'], - $error['fixable'] - ); - } - } - } - - $this->replayingErrors = false; - - }//end replayErrors() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Filters/ExactMatch.php b/vendor/squizlabs/php_codesniffer/src/Filters/ExactMatch.php deleted file mode 100644 index 13af8ff..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Filters/ExactMatch.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Filters; - -use PHP_CodeSniffer\Util; - -abstract class ExactMatch extends Filter -{ - - /** - * A list of files to exclude. - * - * @var array - */ - private $blacklist = null; - - /** - * A list of files to include. - * - * If the whitelist is empty, only files in the blacklist will be excluded. - * - * @var array - */ - private $whitelist = null; - - - /** - * Check whether the current element of the iterator is acceptable. - * - * If a file is both blacklisted and whitelisted, it will be deemed unacceptable. - * - * @return bool - */ - public function accept() - { - if (parent::accept() === false) { - return false; - } - - if ($this->blacklist === null) { - $this->blacklist = $this->getblacklist(); - } - - if ($this->whitelist === null) { - $this->whitelist = $this->getwhitelist(); - } - - $filePath = Util\Common::realpath($this->current()); - - // If file is both blacklisted and whitelisted, the blacklist takes precedence. - if (isset($this->blacklist[$filePath]) === true) { - return false; - } - - if (empty($this->whitelist) === true && empty($this->blacklist) === false) { - // We are only checking a blacklist, so everything else should be whitelisted. - return true; - } - - return isset($this->whitelist[$filePath]); - - }//end accept() - - - /** - * Returns an iterator for the current entry. - * - * Ensures that the blacklist and whitelist are preserved so they don't have - * to be generated each time. - * - * @return \RecursiveIterator - */ - public function getChildren() - { - $children = parent::getChildren(); - $children->blacklist = $this->blacklist; - $children->whitelist = $this->whitelist; - return $children; - - }//end getChildren() - - - /** - * Get a list of blacklisted file paths. - * - * @return array - */ - abstract protected function getBlacklist(); - - - /** - * Get a list of whitelisted file paths. - * - * @return array - */ - abstract protected function getWhitelist(); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Filters/Filter.php b/vendor/squizlabs/php_codesniffer/src/Filters/Filter.php deleted file mode 100644 index fa7360f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Filters/Filter.php +++ /dev/null @@ -1,282 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Filters; - -use PHP_CodeSniffer\Util; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Config; - -class Filter extends \RecursiveFilterIterator -{ - - /** - * The top-level path we are filtering. - * - * @var string - */ - protected $basedir = null; - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - protected $config = null; - - /** - * The ruleset used for the run. - * - * @var \PHP_CodeSniffer\Ruleset - */ - protected $ruleset = null; - - /** - * A list of ignore patterns that apply to directories only. - * - * @var array - */ - protected $ignoreDirPatterns = null; - - /** - * A list of ignore patterns that apply to files only. - * - * @var array - */ - protected $ignoreFilePatterns = null; - - /** - * A list of file paths we've already accepted. - * - * Used to ensure we aren't following circular symlinks. - * - * @var array - */ - protected $acceptedPaths = []; - - - /** - * Constructs a filter. - * - * @param \RecursiveIterator $iterator The iterator we are using to get file paths. - * @param string $basedir The top-level path we are filtering. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * - * @return void - */ - public function __construct($iterator, $basedir, Config $config, Ruleset $ruleset) - { - parent::__construct($iterator); - $this->basedir = $basedir; - $this->config = $config; - $this->ruleset = $ruleset; - - }//end __construct() - - - /** - * Check whether the current element of the iterator is acceptable. - * - * Files are checked for allowed extensions and ignore patterns. - * Directories are checked for ignore patterns only. - * - * @return bool - */ - public function accept() - { - $filePath = $this->current(); - $realPath = Util\Common::realpath($filePath); - - if ($realPath !== false) { - // It's a real path somewhere, so record it - // to check for circular symlinks. - if (isset($this->acceptedPaths[$realPath]) === true) { - // We've been here before. - return false; - } - } - - $filePath = $this->current(); - if (is_dir($filePath) === true) { - if ($this->config->local === true) { - return false; - } - } else if ($this->shouldProcessFile($filePath) === false) { - return false; - } - - if ($this->shouldIgnorePath($filePath) === true) { - return false; - } - - $this->acceptedPaths[$realPath] = true; - return true; - - }//end accept() - - - /** - * Returns an iterator for the current entry. - * - * Ensures that the ignore patterns are preserved so they don't have - * to be generated each time. - * - * @return \RecursiveIterator - */ - public function getChildren() - { - $filterClass = get_called_class(); - $children = new $filterClass( - new \RecursiveDirectoryIterator($this->current(), (\RecursiveDirectoryIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS)), - $this->basedir, - $this->config, - $this->ruleset - ); - - // Set the ignore patterns so we don't have to generate them again. - $children->ignoreDirPatterns = $this->ignoreDirPatterns; - $children->ignoreFilePatterns = $this->ignoreFilePatterns; - $children->acceptedPaths = $this->acceptedPaths; - return $children; - - }//end getChildren() - - - /** - * Checks filtering rules to see if a file should be checked. - * - * Checks both file extension filters and path ignore filters. - * - * @param string $path The path to the file being checked. - * - * @return bool - */ - protected function shouldProcessFile($path) - { - // Check that the file's extension is one we are checking. - // We are strict about checking the extension and we don't - // let files through with no extension or that start with a dot. - $fileName = basename($path); - $fileParts = explode('.', $fileName); - if ($fileParts[0] === $fileName || $fileParts[0] === '') { - return false; - } - - // Checking multi-part file extensions, so need to create a - // complete extension list and make sure one is allowed. - $extensions = []; - array_shift($fileParts); - foreach ($fileParts as $part) { - $extensions[implode('.', $fileParts)] = 1; - array_shift($fileParts); - } - - $matches = array_intersect_key($extensions, $this->config->extensions); - if (empty($matches) === true) { - return false; - } - - return true; - - }//end shouldProcessFile() - - - /** - * Checks filtering rules to see if a path should be ignored. - * - * @param string $path The path to the file or directory being checked. - * - * @return bool - */ - protected function shouldIgnorePath($path) - { - if ($this->ignoreFilePatterns === null) { - $this->ignoreDirPatterns = []; - $this->ignoreFilePatterns = []; - - $ignorePatterns = $this->config->ignored; - $rulesetIgnorePatterns = $this->ruleset->getIgnorePatterns(); - foreach ($rulesetIgnorePatterns as $pattern => $type) { - // Ignore standard/sniff specific exclude rules. - if (is_array($type) === true) { - continue; - } - - $ignorePatterns[$pattern] = $type; - } - - foreach ($ignorePatterns as $pattern => $type) { - // If the ignore pattern ends with /* then it is ignoring an entire directory. - if (substr($pattern, -2) === '/*') { - // Need to check this pattern for dirs as well as individual file paths. - $this->ignoreFilePatterns[$pattern] = $type; - - $pattern = substr($pattern, 0, -2); - $this->ignoreDirPatterns[$pattern] = $type; - } else { - // This is a file-specific pattern, so only need to check this - // for individual file paths. - $this->ignoreFilePatterns[$pattern] = $type; - } - } - }//end if - - $relativePath = $path; - if (strpos($path, $this->basedir) === 0) { - // The +1 cuts off the directory separator as well. - $relativePath = substr($path, (strlen($this->basedir) + 1)); - } - - if (is_dir($path) === true) { - $ignorePatterns = $this->ignoreDirPatterns; - } else { - $ignorePatterns = $this->ignoreFilePatterns; - } - - foreach ($ignorePatterns as $pattern => $type) { - // Maintains backwards compatibility in case the ignore pattern does - // not have a relative/absolute value. - if (is_int($pattern) === true) { - $pattern = $type; - $type = 'absolute'; - } - - $replacements = [ - '\\,' => ',', - '*' => '.*', - ]; - - // We assume a / directory separator, as do the exclude rules - // most developers write, so we need a special case for any system - // that is different. - if (DIRECTORY_SEPARATOR === '\\') { - $replacements['/'] = '\\\\'; - } - - $pattern = strtr($pattern, $replacements); - - if ($type === 'relative') { - $testPath = $relativePath; - } else { - $testPath = $path; - } - - $pattern = '`'.$pattern.'`i'; - if (preg_match($pattern, $testPath) === 1) { - return true; - } - }//end foreach - - return false; - - }//end shouldIgnorePath() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Filters/GitModified.php b/vendor/squizlabs/php_codesniffer/src/Filters/GitModified.php deleted file mode 100644 index 4b6ef3f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Filters/GitModified.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Filters; - -use PHP_CodeSniffer\Util; - -class GitModified extends ExactMatch -{ - - - /** - * Get a list of blacklisted file paths. - * - * @return array - */ - protected function getBlacklist() - { - return []; - - }//end getBlacklist() - - - /** - * Get a list of whitelisted file paths. - * - * @return array - */ - protected function getWhitelist() - { - $modified = []; - - $cmd = 'git ls-files -o -m --exclude-standard -- '.escapeshellarg($this->basedir); - $output = []; - exec($cmd, $output); - - $basedir = $this->basedir; - if (is_dir($basedir) === false) { - $basedir = dirname($basedir); - } - - foreach ($output as $path) { - $path = Util\Common::realpath($path); - - if ($path === false) { - continue; - } - - do { - $modified[$path] = true; - $path = dirname($path); - } while ($path !== $basedir); - } - - return $modified; - - }//end getWhitelist() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Filters/GitStaged.php b/vendor/squizlabs/php_codesniffer/src/Filters/GitStaged.php deleted file mode 100644 index fcb92c3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Filters/GitStaged.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2018 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Filters; - -use PHP_CodeSniffer\Util; - -class GitStaged extends ExactMatch -{ - - - /** - * Get a list of blacklisted file paths. - * - * @return array - */ - protected function getBlacklist() - { - return []; - - }//end getBlacklist() - - - /** - * Get a list of whitelisted file paths. - * - * @return array - */ - protected function getWhitelist() - { - $modified = []; - - $cmd = 'git diff --cached --name-only -- '.escapeshellarg($this->basedir); - $output = []; - exec($cmd, $output); - - $basedir = $this->basedir; - if (is_dir($basedir) === false) { - $basedir = dirname($basedir); - } - - foreach ($output as $path) { - $path = Util\Common::realpath($path); - if ($path === false) { - // Skip deleted files. - continue; - } - - do { - $modified[$path] = true; - $path = dirname($path); - } while ($path !== $basedir); - } - - return $modified; - - }//end getWhitelist() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Fixer.php b/vendor/squizlabs/php_codesniffer/src/Fixer.php deleted file mode 100644 index 897e147..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Fixer.php +++ /dev/null @@ -1,798 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Common; - -class Fixer -{ - - /** - * Is the fixer enabled and fixing a file? - * - * Sniffs should check this value to ensure they are not - * doing extra processing to prepare for a fix when fixing is - * not required. - * - * @var boolean - */ - public $enabled = false; - - /** - * The number of times we have looped over a file. - * - * @var integer - */ - public $loops = 0; - - /** - * The file being fixed. - * - * @var \PHP_CodeSniffer\Files\File - */ - private $currentFile = null; - - /** - * The list of tokens that make up the file contents. - * - * This is a simplified list which just contains the token content and nothing - * else. This is the array that is updated as fixes are made, not the file's - * token array. Imploding this array will give you the file content back. - * - * @var array - */ - private $tokens = []; - - /** - * A list of tokens that have already been fixed. - * - * We don't allow the same token to be fixed more than once each time - * through a file as this can easily cause conflicts between sniffs. - * - * @var int[] - */ - private $fixedTokens = []; - - /** - * The last value of each fixed token. - * - * If a token is being "fixed" back to its last value, the fix is - * probably conflicting with another. - * - * @var array - */ - private $oldTokenValues = []; - - /** - * A list of tokens that have been fixed during a changeset. - * - * All changes in changeset must be able to be applied, or else - * the entire changeset is rejected. - * - * @var array - */ - private $changeset = []; - - /** - * Is there an open changeset. - * - * @var boolean - */ - private $inChangeset = false; - - /** - * Is the current fixing loop in conflict? - * - * @var boolean - */ - private $inConflict = false; - - /** - * The number of fixes that have been performed. - * - * @var integer - */ - private $numFixes = 0; - - - /** - * Starts fixing a new file. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being fixed. - * - * @return void - */ - public function startFile(File $phpcsFile) - { - $this->currentFile = $phpcsFile; - $this->numFixes = 0; - $this->fixedTokens = []; - - $tokens = $phpcsFile->getTokens(); - $this->tokens = []; - foreach ($tokens as $index => $token) { - if (isset($token['orig_content']) === true) { - $this->tokens[$index] = $token['orig_content']; - } else { - $this->tokens[$index] = $token['content']; - } - } - - }//end startFile() - - - /** - * Attempt to fix the file by processing it until no fixes are made. - * - * @return boolean - */ - public function fixFile() - { - $fixable = $this->currentFile->getFixableCount(); - if ($fixable === 0) { - // Nothing to fix. - return false; - } - - $this->enabled = true; - - $this->loops = 0; - while ($this->loops < 50) { - ob_start(); - - // Only needed once file content has changed. - $contents = $this->getContents(); - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - @ob_end_clean(); - echo '---START FILE CONTENT---'.PHP_EOL; - $lines = explode($this->currentFile->eolChar, $contents); - $max = strlen(count($lines)); - foreach ($lines as $lineNum => $line) { - $lineNum++; - echo str_pad($lineNum, $max, ' ', STR_PAD_LEFT).'|'.$line.PHP_EOL; - } - - echo '--- END FILE CONTENT ---'.PHP_EOL; - ob_start(); - } - - $this->inConflict = false; - $this->currentFile->ruleset->populateTokenListeners(); - $this->currentFile->setContent($contents); - $this->currentFile->process(); - ob_end_clean(); - - $this->loops++; - - if (PHP_CODESNIFFER_CBF === true && PHP_CODESNIFFER_VERBOSITY > 0) { - echo "\r".str_repeat(' ', 80)."\r"; - echo "\t=> Fixing file: $this->numFixes/$fixable violations remaining [made $this->loops pass"; - if ($this->loops > 1) { - echo 'es'; - } - - echo ']... '; - } - - if ($this->numFixes === 0 && $this->inConflict === false) { - // Nothing left to do. - break; - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* fixed $this->numFixes violations, starting loop ".($this->loops + 1).' *'.PHP_EOL; - } - }//end while - - $this->enabled = false; - - if ($this->numFixes > 0) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if (ob_get_level() > 0) { - ob_end_clean(); - } - - echo "\t*** Reached maximum number of loops with $this->numFixes violations left unfixed ***".PHP_EOL; - ob_start(); - } - - return false; - } - - return true; - - }//end fixFile() - - - /** - * Generates a text diff of the original file and the new content. - * - * @param string $filePath Optional file path to diff the file against. - * If not specified, the original version of the - * file will be used. - * @param boolean $colors Print coloured output or not. - * - * @return string - */ - public function generateDiff($filePath=null, $colors=true) - { - if ($filePath === null) { - $filePath = $this->currentFile->getFilename(); - } - - $cwd = getcwd().DIRECTORY_SEPARATOR; - if (strpos($filePath, $cwd) === 0) { - $filename = substr($filePath, strlen($cwd)); - } else { - $filename = $filePath; - } - - $contents = $this->getContents(); - - $tempName = tempnam(sys_get_temp_dir(), 'phpcs-fixer'); - $fixedFile = fopen($tempName, 'w'); - fwrite($fixedFile, $contents); - - // We must use something like shell_exec() because whitespace at the end - // of lines is critical to diff files. - $filename = escapeshellarg($filename); - $cmd = "diff -u -L$filename -LPHP_CodeSniffer $filename \"$tempName\""; - - $diff = shell_exec($cmd); - - fclose($fixedFile); - if (is_file($tempName) === true) { - unlink($tempName); - } - - if ($colors === false) { - return $diff; - } - - $diffLines = explode(PHP_EOL, $diff); - if (count($diffLines) === 1) { - // Seems to be required for cygwin. - $diffLines = explode("\n", $diff); - } - - $diff = []; - foreach ($diffLines as $line) { - if (isset($line[0]) === true) { - switch ($line[0]) { - case '-': - $diff[] = "\033[31m$line\033[0m"; - break; - case '+': - $diff[] = "\033[32m$line\033[0m"; - break; - default: - $diff[] = $line; - } - } - } - - $diff = implode(PHP_EOL, $diff); - - return $diff; - - }//end generateDiff() - - - /** - * Get a count of fixes that have been performed on the file. - * - * This value is reset every time a new file is started, or an existing - * file is restarted. - * - * @return int - */ - public function getFixCount() - { - return $this->numFixes; - - }//end getFixCount() - - - /** - * Get the current content of the file, as a string. - * - * @return string - */ - public function getContents() - { - $contents = implode($this->tokens); - return $contents; - - }//end getContents() - - - /** - * Get the current fixed content of a token. - * - * This function takes changesets into account so should be used - * instead of directly accessing the token array. - * - * @param int $stackPtr The position of the token in the token stack. - * - * @return string - */ - public function getTokenContent($stackPtr) - { - if ($this->inChangeset === true - && isset($this->changeset[$stackPtr]) === true - ) { - return $this->changeset[$stackPtr]; - } else { - return $this->tokens[$stackPtr]; - } - - }//end getTokenContent() - - - /** - * Start recording actions for a changeset. - * - * @return void - */ - public function beginChangeset() - { - if ($this->inConflict === true) { - return false; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - if ($bt[1]['class'] === __CLASS__) { - $sniff = 'Fixer'; - } else { - $sniff = Util\Common::getSniffCode($bt[1]['class']); - } - - $line = $bt[0]['line']; - - @ob_end_clean(); - echo "\t=> Changeset started by $sniff:$line".PHP_EOL; - ob_start(); - } - - $this->changeset = []; - $this->inChangeset = true; - - }//end beginChangeset() - - - /** - * Stop recording actions for a changeset, and apply logged changes. - * - * @return boolean - */ - public function endChangeset() - { - if ($this->inConflict === true) { - return false; - } - - $this->inChangeset = false; - - $success = true; - $applied = []; - foreach ($this->changeset as $stackPtr => $content) { - $success = $this->replaceToken($stackPtr, $content); - if ($success === false) { - break; - } else { - $applied[] = $stackPtr; - } - } - - if ($success === false) { - // Rolling back all changes. - foreach ($applied as $stackPtr) { - $this->revertToken($stackPtr); - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - @ob_end_clean(); - echo "\t=> Changeset failed to apply".PHP_EOL; - ob_start(); - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - $fixes = count($this->changeset); - @ob_end_clean(); - echo "\t=> Changeset ended: $fixes changes applied".PHP_EOL; - ob_start(); - } - - $this->changeset = []; - - }//end endChangeset() - - - /** - * Stop recording actions for a changeset, and discard logged changes. - * - * @return void - */ - public function rollbackChangeset() - { - $this->inChangeset = false; - $this->inConflict = false; - - if (empty($this->changeset) === false) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $bt = debug_backtrace(); - if ($bt[1]['class'] === 'PHP_CodeSniffer\Fixer') { - $sniff = $bt[2]['class']; - $line = $bt[1]['line']; - } else { - $sniff = $bt[1]['class']; - $line = $bt[0]['line']; - } - - $sniff = Util\Common::getSniffCode($sniff); - - $numChanges = count($this->changeset); - - @ob_end_clean(); - echo "\t\tR: $sniff:$line rolled back the changeset ($numChanges changes)".PHP_EOL; - echo "\t=> Changeset rolled back".PHP_EOL; - ob_start(); - } - - $this->changeset = []; - }//end if - - }//end rollbackChangeset() - - - /** - * Replace the entire contents of a token. - * - * @param int $stackPtr The position of the token in the token stack. - * @param string $content The new content of the token. - * - * @return bool If the change was accepted. - */ - public function replaceToken($stackPtr, $content) - { - if ($this->inConflict === true) { - return false; - } - - if ($this->inChangeset === false - && isset($this->fixedTokens[$stackPtr]) === true - ) { - $indent = "\t"; - if (empty($this->changeset) === false) { - $indent .= "\t"; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - @ob_end_clean(); - echo "$indent* token $stackPtr has already been modified, skipping *".PHP_EOL; - ob_start(); - } - - return false; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - if ($bt[1]['class'] === 'PHP_CodeSniffer\Fixer') { - $sniff = $bt[2]['class']; - $line = $bt[1]['line']; - } else { - $sniff = $bt[1]['class']; - $line = $bt[0]['line']; - } - - $sniff = Util\Common::getSniffCode($sniff); - - $tokens = $this->currentFile->getTokens(); - $type = $tokens[$stackPtr]['type']; - $tokenLine = $tokens[$stackPtr]['line']; - $oldContent = Common::prepareForOutput($this->tokens[$stackPtr]); - $newContent = Common::prepareForOutput($content); - if (trim($this->tokens[$stackPtr]) === '' && isset($this->tokens[($stackPtr + 1)]) === true) { - // Add some context for whitespace only changes. - $append = Common::prepareForOutput($this->tokens[($stackPtr + 1)]); - $oldContent .= $append; - $newContent .= $append; - } - }//end if - - if ($this->inChangeset === true) { - $this->changeset[$stackPtr] = $content; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - @ob_end_clean(); - echo "\t\tQ: $sniff:$line replaced token $stackPtr ($type on line $tokenLine) \"$oldContent\" => \"$newContent\"".PHP_EOL; - ob_start(); - } - - return true; - } - - if (isset($this->oldTokenValues[$stackPtr]) === false) { - $this->oldTokenValues[$stackPtr] = [ - 'curr' => $content, - 'prev' => $this->tokens[$stackPtr], - 'loop' => $this->loops, - ]; - } else { - if ($this->oldTokenValues[$stackPtr]['prev'] === $content - && $this->oldTokenValues[$stackPtr]['loop'] === ($this->loops - 1) - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $indent = "\t"; - if (empty($this->changeset) === false) { - $indent .= "\t"; - } - - $loop = $this->oldTokenValues[$stackPtr]['loop']; - - @ob_end_clean(); - echo "$indent**** $sniff:$line has possible conflict with another sniff on loop $loop; caused by the following change ****".PHP_EOL; - echo "$indent**** replaced token $stackPtr ($type on line $tokenLine) \"$oldContent\" => \"$newContent\" ****".PHP_EOL; - } - - if ($this->oldTokenValues[$stackPtr]['loop'] >= ($this->loops - 1)) { - $this->inConflict = true; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "$indent**** ignoring all changes until next loop ****".PHP_EOL; - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - ob_start(); - } - - return false; - }//end if - - $this->oldTokenValues[$stackPtr]['prev'] = $this->oldTokenValues[$stackPtr]['curr']; - $this->oldTokenValues[$stackPtr]['curr'] = $content; - $this->oldTokenValues[$stackPtr]['loop'] = $this->loops; - }//end if - - $this->fixedTokens[$stackPtr] = $this->tokens[$stackPtr]; - $this->tokens[$stackPtr] = $content; - $this->numFixes++; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $indent = "\t"; - if (empty($this->changeset) === false) { - $indent .= "\tA: "; - } - - if (ob_get_level() > 0) { - ob_end_clean(); - } - - echo "$indent$sniff:$line replaced token $stackPtr ($type on line $tokenLine) \"$oldContent\" => \"$newContent\"".PHP_EOL; - ob_start(); - } - - return true; - - }//end replaceToken() - - - /** - * Reverts the previous fix made to a token. - * - * @param int $stackPtr The position of the token in the token stack. - * - * @return bool If a change was reverted. - */ - public function revertToken($stackPtr) - { - if (isset($this->fixedTokens[$stackPtr]) === false) { - return false; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - if ($bt[1]['class'] === 'PHP_CodeSniffer\Fixer') { - $sniff = $bt[2]['class']; - $line = $bt[1]['line']; - } else { - $sniff = $bt[1]['class']; - $line = $bt[0]['line']; - } - - $sniff = Util\Common::getSniffCode($sniff); - - $tokens = $this->currentFile->getTokens(); - $type = $tokens[$stackPtr]['type']; - $tokenLine = $tokens[$stackPtr]['line']; - $oldContent = Common::prepareForOutput($this->tokens[$stackPtr]); - $newContent = Common::prepareForOutput($this->fixedTokens[$stackPtr]); - if (trim($this->tokens[$stackPtr]) === '' && isset($tokens[($stackPtr + 1)]) === true) { - // Add some context for whitespace only changes. - $append = Common::prepareForOutput($this->tokens[($stackPtr + 1)]); - $oldContent .= $append; - $newContent .= $append; - } - }//end if - - $this->tokens[$stackPtr] = $this->fixedTokens[$stackPtr]; - unset($this->fixedTokens[$stackPtr]); - $this->numFixes--; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $indent = "\t"; - if (empty($this->changeset) === false) { - $indent .= "\tR: "; - } - - @ob_end_clean(); - echo "$indent$sniff:$line reverted token $stackPtr ($type on line $tokenLine) \"$oldContent\" => \"$newContent\"".PHP_EOL; - ob_start(); - } - - return true; - - }//end revertToken() - - - /** - * Replace the content of a token with a part of its current content. - * - * @param int $stackPtr The position of the token in the token stack. - * @param int $start The first character to keep. - * @param int $length The number of characters to keep. If NULL, the content of - * the token from $start to the end of the content is kept. - * - * @return bool If the change was accepted. - */ - public function substrToken($stackPtr, $start, $length=null) - { - $current = $this->getTokenContent($stackPtr); - - if ($length === null) { - $newContent = substr($current, $start); - } else { - $newContent = substr($current, $start, $length); - } - - return $this->replaceToken($stackPtr, $newContent); - - }//end substrToken() - - - /** - * Adds a newline to end of a token's content. - * - * @param int $stackPtr The position of the token in the token stack. - * - * @return bool If the change was accepted. - */ - public function addNewline($stackPtr) - { - $current = $this->getTokenContent($stackPtr); - return $this->replaceToken($stackPtr, $current.$this->currentFile->eolChar); - - }//end addNewline() - - - /** - * Adds a newline to the start of a token's content. - * - * @param int $stackPtr The position of the token in the token stack. - * - * @return bool If the change was accepted. - */ - public function addNewlineBefore($stackPtr) - { - $current = $this->getTokenContent($stackPtr); - return $this->replaceToken($stackPtr, $this->currentFile->eolChar.$current); - - }//end addNewlineBefore() - - - /** - * Adds content to the end of a token's current content. - * - * @param int $stackPtr The position of the token in the token stack. - * @param string $content The content to add. - * - * @return bool If the change was accepted. - */ - public function addContent($stackPtr, $content) - { - $current = $this->getTokenContent($stackPtr); - return $this->replaceToken($stackPtr, $current.$content); - - }//end addContent() - - - /** - * Adds content to the start of a token's current content. - * - * @param int $stackPtr The position of the token in the token stack. - * @param string $content The content to add. - * - * @return bool If the change was accepted. - */ - public function addContentBefore($stackPtr, $content) - { - $current = $this->getTokenContent($stackPtr); - return $this->replaceToken($stackPtr, $content.$current); - - }//end addContentBefore() - - - /** - * Adjust the indent of a code block. - * - * @param int $start The position of the token in the token stack - * to start adjusting the indent from. - * @param int $end The position of the token in the token stack - * to end adjusting the indent. - * @param int $change The number of spaces to adjust the indent by - * (positive or negative). - * - * @return bool If the change was accepted. - */ - public function changeCodeBlockIndent($start, $end, $change) - { - $tokens = $this->currentFile->getTokens(); - - $baseIndent = ''; - if ($change > 0) { - $baseIndent = str_repeat(' ', $change); - } - - $useChangeset = false; - if ($this->inChangeset === false) { - $this->beginChangeset(); - $useChangeset = true; - } - - for ($i = $start; $i <= $end; $i++) { - if ($tokens[$i]['column'] !== 1 - || $tokens[($i + 1)]['line'] !== $tokens[$i]['line'] - ) { - continue; - } - - $length = 0; - if ($tokens[$i]['code'] === T_WHITESPACE - || $tokens[$i]['code'] === T_DOC_COMMENT_WHITESPACE - ) { - $length = $tokens[$i]['length']; - - $padding = ($length + $change); - if ($padding > 0) { - $padding = str_repeat(' ', $padding); - } else { - $padding = ''; - } - - $newContent = $padding.ltrim($tokens[$i]['content']); - } else { - $newContent = $baseIndent.$tokens[$i]['content']; - } - - $this->replaceToken($i, $newContent); - }//end for - - if ($useChangeset === true) { - $this->endChangeset(); - } - - }//end changeCodeBlockIndent() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Generators/Generator.php b/vendor/squizlabs/php_codesniffer/src/Generators/Generator.php deleted file mode 100644 index 5604976..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Generators/Generator.php +++ /dev/null @@ -1,117 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Generators; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Autoload; - -abstract class Generator -{ - - /** - * The ruleset used for the run. - * - * @var \PHP_CodeSniffer\Ruleset - */ - public $ruleset = null; - - /** - * XML documentation files used to produce the final output. - * - * @var string[] - */ - public $docFiles = []; - - - /** - * Constructs a doc generator. - * - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * - * @see generate() - */ - public function __construct(Ruleset $ruleset) - { - $this->ruleset = $ruleset; - - foreach ($ruleset->sniffs as $className => $sniffClass) { - $file = Autoload::getLoadedFileName($className); - $docFile = str_replace( - DIRECTORY_SEPARATOR.'Sniffs'.DIRECTORY_SEPARATOR, - DIRECTORY_SEPARATOR.'Docs'.DIRECTORY_SEPARATOR, - $file - ); - $docFile = str_replace('Sniff.php', 'Standard.xml', $docFile); - - if (is_file($docFile) === true) { - $this->docFiles[] = $docFile; - } - } - - }//end __construct() - - - /** - * Retrieves the title of the sniff from the DOMNode supplied. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @return string - */ - protected function getTitle(\DOMNode $doc) - { - return $doc->getAttribute('title'); - - }//end getTitle() - - - /** - * Generates the documentation for a standard. - * - * It's probably wise for doc generators to override this method so they - * have control over how the docs are produced. Otherwise, the processSniff - * method should be overridden to output content for each sniff. - * - * @return void - * @see processSniff() - */ - public function generate() - { - foreach ($this->docFiles as $file) { - $doc = new \DOMDocument(); - $doc->load($file); - $documentation = $doc->getElementsByTagName('documentation')->item(0); - $this->processSniff($documentation); - } - - }//end generate() - - - /** - * Process the documentation for a single sniff. - * - * Doc generators must implement this function to produce output. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @return void - * @see generate() - */ - abstract protected function processSniff(\DOMNode $doc); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Generators/HTML.php b/vendor/squizlabs/php_codesniffer/src/Generators/HTML.php deleted file mode 100644 index db26468..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Generators/HTML.php +++ /dev/null @@ -1,270 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Generators; - -use PHP_CodeSniffer\Config; - -class HTML extends Generator -{ - - - /** - * Generates the documentation for a standard. - * - * @return void - * @see processSniff() - */ - public function generate() - { - ob_start(); - $this->printHeader(); - $this->printToc(); - - foreach ($this->docFiles as $file) { - $doc = new \DOMDocument(); - $doc->load($file); - $documentation = $doc->getElementsByTagName('documentation')->item(0); - $this->processSniff($documentation); - } - - $this->printFooter(); - - $content = ob_get_contents(); - ob_end_clean(); - - echo $content; - - }//end generate() - - - /** - * Print the header of the HTML page. - * - * @return void - */ - protected function printHeader() - { - $standard = $this->ruleset->name; - echo ''.PHP_EOL; - echo ' '.PHP_EOL; - echo " $standard Coding Standards".PHP_EOL; - echo ' '.PHP_EOL; - echo ' '.PHP_EOL; - echo ' '.PHP_EOL; - echo "

    $standard Coding Standards

    ".PHP_EOL; - - }//end printHeader() - - - /** - * Print the table of contents for the standard. - * - * The TOC is just an unordered list of bookmarks to sniffs on the page. - * - * @return void - */ - protected function printToc() - { - echo '

    Table of Contents

    '.PHP_EOL; - echo '
    '.PHP_EOL; - - }//end printToc() - - - /** - * Print the footer of the HTML page. - * - * @return void - */ - protected function printFooter() - { - // Turn off errors so we don't get timezone warnings if people - // don't have their timezone set. - $errorLevel = error_reporting(0); - echo '
    '; - echo 'Documentation generated on '.date('r'); - echo ' by PHP_CodeSniffer '.Config::VERSION.''; - echo '
    '.PHP_EOL; - error_reporting($errorLevel); - - echo ' '.PHP_EOL; - echo ''.PHP_EOL; - - }//end printFooter() - - - /** - * Process the documentation for a single sniff. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @return void - */ - public function processSniff(\DOMNode $doc) - { - $title = $this->getTitle($doc); - echo ' '.PHP_EOL; - echo "

    $title

    ".PHP_EOL; - - foreach ($doc->childNodes as $node) { - if ($node->nodeName === 'standard') { - $this->printTextBlock($node); - } else if ($node->nodeName === 'code_comparison') { - $this->printCodeComparisonBlock($node); - } - } - - }//end processSniff() - - - /** - * Print a text block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the text block. - * - * @return void - */ - protected function printTextBlock(\DOMNode $node) - { - $content = trim($node->nodeValue); - $content = htmlspecialchars($content); - - // Allow em tags only. - $content = str_replace('<em>', '', $content); - $content = str_replace('</em>', '', $content); - - echo "

    $content

    ".PHP_EOL; - - }//end printTextBlock() - - - /** - * Print a code comparison block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the code comparison block. - * - * @return void - */ - protected function printCodeComparisonBlock(\DOMNode $node) - { - $codeBlocks = $node->getElementsByTagName('code'); - - $firstTitle = $codeBlocks->item(0)->getAttribute('title'); - $first = trim($codeBlocks->item(0)->nodeValue); - $first = str_replace('', $first); - $first = str_replace(' ', ' ', $first); - $first = str_replace('', '', $first); - $first = str_replace('', '', $first); - - $secondTitle = $codeBlocks->item(1)->getAttribute('title'); - $second = trim($codeBlocks->item(1)->nodeValue); - $second = str_replace('', $second); - $second = str_replace(' ', ' ', $second); - $second = str_replace('', '', $second); - $second = str_replace('', '', $second); - - echo ' '.PHP_EOL; - echo ' '.PHP_EOL; - echo " ".PHP_EOL; - echo " ".PHP_EOL; - echo ' '.PHP_EOL; - echo ' '.PHP_EOL; - echo " ".PHP_EOL; - echo " ".PHP_EOL; - echo ' '.PHP_EOL; - echo '
    $firstTitle$secondTitle
    $first$second
    '.PHP_EOL; - - }//end printCodeComparisonBlock() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Generators/Markdown.php b/vendor/squizlabs/php_codesniffer/src/Generators/Markdown.php deleted file mode 100644 index b51b267..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Generators/Markdown.php +++ /dev/null @@ -1,161 +0,0 @@ - - * @copyright 2014 Arroba IT - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Generators; - -use PHP_CodeSniffer\Config; - -class Markdown extends Generator -{ - - - /** - * Generates the documentation for a standard. - * - * @return void - * @see processSniff() - */ - public function generate() - { - ob_start(); - $this->printHeader(); - - foreach ($this->docFiles as $file) { - $doc = new \DOMDocument(); - $doc->load($file); - $documentation = $doc->getElementsByTagName('documentation')->item(0); - $this->processSniff($documentation); - } - - $this->printFooter(); - $content = ob_get_contents(); - ob_end_clean(); - - echo $content; - - }//end generate() - - - /** - * Print the markdown header. - * - * @return void - */ - protected function printHeader() - { - $standard = $this->ruleset->name; - - echo "# $standard Coding Standard".PHP_EOL; - - }//end printHeader() - - - /** - * Print the markdown footer. - * - * @return void - */ - protected function printFooter() - { - // Turn off errors so we don't get timezone warnings if people - // don't have their timezone set. - error_reporting(0); - echo 'Documentation generated on '.date('r'); - echo ' by [PHP_CodeSniffer '.Config::VERSION.'](https://github.com/squizlabs/PHP_CodeSniffer)'.PHP_EOL; - - }//end printFooter() - - - /** - * Process the documentation for a single sniff. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @return void - */ - protected function processSniff(\DOMNode $doc) - { - $title = $this->getTitle($doc); - echo "## $title".PHP_EOL; - - foreach ($doc->childNodes as $node) { - if ($node->nodeName === 'standard') { - $this->printTextBlock($node); - } else if ($node->nodeName === 'code_comparison') { - $this->printCodeComparisonBlock($node); - } - } - - }//end processSniff() - - - /** - * Print a text block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the text block. - * - * @return void - */ - protected function printTextBlock(\DOMNode $node) - { - $content = trim($node->nodeValue); - $content = htmlspecialchars($content); - - $content = str_replace('<em>', '*', $content); - $content = str_replace('</em>', '*', $content); - - echo $content.PHP_EOL; - - }//end printTextBlock() - - - /** - * Print a code comparison block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the code comparison block. - * - * @return void - */ - protected function printCodeComparisonBlock(\DOMNode $node) - { - $codeBlocks = $node->getElementsByTagName('code'); - - $firstTitle = $codeBlocks->item(0)->getAttribute('title'); - $first = trim($codeBlocks->item(0)->nodeValue); - $first = str_replace("\n", "\n ", $first); - $first = str_replace('', '', $first); - $first = str_replace('', '', $first); - - $secondTitle = $codeBlocks->item(1)->getAttribute('title'); - $second = trim($codeBlocks->item(1)->nodeValue); - $second = str_replace("\n", "\n ", $second); - $second = str_replace('', '', $second); - $second = str_replace('', '', $second); - - echo ' '.PHP_EOL; - echo ' '.PHP_EOL; - echo " ".PHP_EOL; - echo " ".PHP_EOL; - echo ' '.PHP_EOL; - echo ' '.PHP_EOL; - echo ''.PHP_EOL; - echo ''.PHP_EOL; - echo ' '.PHP_EOL; - echo '
    $firstTitle$secondTitle
    '.PHP_EOL.PHP_EOL; - echo " $first".PHP_EOL.PHP_EOL; - echo ''.PHP_EOL.PHP_EOL; - echo " $second".PHP_EOL.PHP_EOL; - echo '
    '.PHP_EOL; - - }//end printCodeComparisonBlock() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Generators/Text.php b/vendor/squizlabs/php_codesniffer/src/Generators/Text.php deleted file mode 100644 index ffff206..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Generators/Text.php +++ /dev/null @@ -1,253 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Generators; - -class Text extends Generator -{ - - - /** - * Process the documentation for a single sniff. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @return void - */ - public function processSniff(\DOMNode $doc) - { - $this->printTitle($doc); - - foreach ($doc->childNodes as $node) { - if ($node->nodeName === 'standard') { - $this->printTextBlock($node); - } else if ($node->nodeName === 'code_comparison') { - $this->printCodeComparisonBlock($node); - } - } - - }//end processSniff() - - - /** - * Prints the title area for a single sniff. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @return void - */ - protected function printTitle(\DOMNode $doc) - { - $title = $this->getTitle($doc); - $standard = $this->ruleset->name; - - echo PHP_EOL; - echo str_repeat('-', (strlen("$standard CODING STANDARD: $title") + 4)); - echo strtoupper(PHP_EOL."| $standard CODING STANDARD: $title |".PHP_EOL); - echo str_repeat('-', (strlen("$standard CODING STANDARD: $title") + 4)); - echo PHP_EOL.PHP_EOL; - - }//end printTitle() - - - /** - * Print a text block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the text block. - * - * @return void - */ - protected function printTextBlock(\DOMNode $node) - { - $text = trim($node->nodeValue); - $text = str_replace('', '*', $text); - $text = str_replace('', '*', $text); - - $nodeLines = explode("\n", $text); - $lines = []; - - foreach ($nodeLines as $currentLine) { - $currentLine = trim($currentLine); - if ($currentLine === '') { - // The text contained a blank line. Respect this. - $lines[] = ''; - continue; - } - - $tempLine = ''; - $words = explode(' ', $currentLine); - - foreach ($words as $word) { - $currentLength = strlen($tempLine.$word); - if ($currentLength < 99) { - $tempLine .= $word.' '; - continue; - } - - if ($currentLength === 99 || $currentLength === 100) { - // We are already at the edge, so we are done. - $lines[] = $tempLine.$word; - $tempLine = ''; - } else { - $lines[] = rtrim($tempLine); - $tempLine = $word.' '; - } - }//end foreach - - if ($tempLine !== '') { - $lines[] = rtrim($tempLine); - } - }//end foreach - - echo implode(PHP_EOL, $lines).PHP_EOL.PHP_EOL; - - }//end printTextBlock() - - - /** - * Print a code comparison block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the code comparison block. - * - * @return void - */ - protected function printCodeComparisonBlock(\DOMNode $node) - { - $codeBlocks = $node->getElementsByTagName('code'); - $first = trim($codeBlocks->item(0)->nodeValue); - $firstTitle = $codeBlocks->item(0)->getAttribute('title'); - - $firstTitleLines = []; - $tempTitle = ''; - $words = explode(' ', $firstTitle); - - foreach ($words as $word) { - if (strlen($tempTitle.$word) >= 45) { - if (strlen($tempTitle.$word) === 45) { - // Adding the extra space will push us to the edge - // so we are done. - $firstTitleLines[] = $tempTitle.$word; - $tempTitle = ''; - } else if (strlen($tempTitle.$word) === 46) { - // We are already at the edge, so we are done. - $firstTitleLines[] = $tempTitle.$word; - $tempTitle = ''; - } else { - $firstTitleLines[] = $tempTitle; - $tempTitle = $word.' '; - } - } else { - $tempTitle .= $word.' '; - } - }//end foreach - - if ($tempTitle !== '') { - $firstTitleLines[] = $tempTitle; - } - - $first = str_replace('', '', $first); - $first = str_replace('', '', $first); - $firstLines = explode("\n", $first); - - $second = trim($codeBlocks->item(1)->nodeValue); - $secondTitle = $codeBlocks->item(1)->getAttribute('title'); - - $secondTitleLines = []; - $tempTitle = ''; - $words = explode(' ', $secondTitle); - - foreach ($words as $word) { - if (strlen($tempTitle.$word) >= 45) { - if (strlen($tempTitle.$word) === 45) { - // Adding the extra space will push us to the edge - // so we are done. - $secondTitleLines[] = $tempTitle.$word; - $tempTitle = ''; - } else if (strlen($tempTitle.$word) === 46) { - // We are already at the edge, so we are done. - $secondTitleLines[] = $tempTitle.$word; - $tempTitle = ''; - } else { - $secondTitleLines[] = $tempTitle; - $tempTitle = $word.' '; - } - } else { - $tempTitle .= $word.' '; - } - }//end foreach - - if ($tempTitle !== '') { - $secondTitleLines[] = $tempTitle; - } - - $second = str_replace('', '', $second); - $second = str_replace('', '', $second); - $secondLines = explode("\n", $second); - - $maxCodeLines = max(count($firstLines), count($secondLines)); - $maxTitleLines = max(count($firstTitleLines), count($secondTitleLines)); - - echo str_repeat('-', 41); - echo ' CODE COMPARISON '; - echo str_repeat('-', 42).PHP_EOL; - - for ($i = 0; $i < $maxTitleLines; $i++) { - if (isset($firstTitleLines[$i]) === true) { - $firstLineText = $firstTitleLines[$i]; - } else { - $firstLineText = ''; - } - - if (isset($secondTitleLines[$i]) === true) { - $secondLineText = $secondTitleLines[$i]; - } else { - $secondLineText = ''; - } - - echo '| '; - echo $firstLineText.str_repeat(' ', (46 - strlen($firstLineText))); - echo ' | '; - echo $secondLineText.str_repeat(' ', (47 - strlen($secondLineText))); - echo ' |'.PHP_EOL; - }//end for - - echo str_repeat('-', 100).PHP_EOL; - - for ($i = 0; $i < $maxCodeLines; $i++) { - if (isset($firstLines[$i]) === true) { - $firstLineText = $firstLines[$i]; - } else { - $firstLineText = ''; - } - - if (isset($secondLines[$i]) === true) { - $secondLineText = $secondLines[$i]; - } else { - $secondLineText = ''; - } - - echo '| '; - echo $firstLineText.str_repeat(' ', max(0, (47 - strlen($firstLineText)))); - echo '| '; - echo $secondLineText.str_repeat(' ', max(0, (48 - strlen($secondLineText)))); - echo '|'.PHP_EOL; - }//end for - - echo str_repeat('-', 100).PHP_EOL.PHP_EOL; - - }//end printCodeComparisonBlock() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reporter.php b/vendor/squizlabs/php_codesniffer/src/Reporter.php deleted file mode 100644 index e89a20e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reporter.php +++ /dev/null @@ -1,423 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -use PHP_CodeSniffer\Exceptions\DeepExitException; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Reports\Report; -use PHP_CodeSniffer\Util\Common; - -class Reporter -{ - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - public $config = null; - - /** - * Total number of files that contain errors or warnings. - * - * @var integer - */ - public $totalFiles = 0; - - /** - * Total number of errors found during the run. - * - * @var integer - */ - public $totalErrors = 0; - - /** - * Total number of warnings found during the run. - * - * @var integer - */ - public $totalWarnings = 0; - - /** - * Total number of errors/warnings that can be fixed. - * - * @var integer - */ - public $totalFixable = 0; - - /** - * Total number of errors/warnings that were fixed. - * - * @var integer - */ - public $totalFixed = 0; - - /** - * When the PHPCS run started. - * - * @var float - */ - public static $startTime = 0; - - /** - * A cache of report objects. - * - * @var array - */ - private $reports = []; - - /** - * A cache of opened temporary files. - * - * @var array - */ - private $tmpFiles = []; - - - /** - * Initialise the reporter. - * - * All reports specified in the config will be created and their - * output file (or a temp file if none is specified) initialised by - * clearing the current contents. - * - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If a custom report class could not be found. - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If a report class is incorrectly set up. - */ - public function __construct(Config $config) - { - $this->config = $config; - - foreach ($config->reports as $type => $output) { - if ($output === null) { - $output = $config->reportFile; - } - - $reportClassName = ''; - if (strpos($type, '.') !== false) { - // This is a path to a custom report class. - $filename = realpath($type); - if ($filename === false) { - $error = "ERROR: Custom report \"$type\" not found".PHP_EOL; - throw new DeepExitException($error, 3); - } - - $reportClassName = Autoload::loadFile($filename); - } else if (class_exists('PHP_CodeSniffer\Reports\\'.ucfirst($type)) === true) { - // PHPCS native report. - $reportClassName = 'PHP_CodeSniffer\Reports\\'.ucfirst($type); - } else if (class_exists($type) === true) { - // FQN of a custom report. - $reportClassName = $type; - } else { - // OK, so not a FQN, try and find the report using the registered namespaces. - $registeredNamespaces = Autoload::getSearchPaths(); - $trimmedType = ltrim($type, '\\'); - - foreach ($registeredNamespaces as $nsPrefix) { - if ($nsPrefix === '') { - continue; - } - - if (class_exists($nsPrefix.'\\'.$trimmedType) === true) { - $reportClassName = $nsPrefix.'\\'.$trimmedType; - break; - } - } - }//end if - - if ($reportClassName === '') { - $error = "ERROR: Class file for report \"$type\" not found".PHP_EOL; - throw new DeepExitException($error, 3); - } - - $reportClass = new $reportClassName(); - if (($reportClass instanceof Report) === false) { - throw new RuntimeException('Class "'.$reportClassName.'" must implement the "PHP_CodeSniffer\Report" interface.'); - } - - $this->reports[$type] = [ - 'output' => $output, - 'class' => $reportClass, - ]; - - if ($output === null) { - // Using a temp file. - // This needs to be set in the constructor so that all - // child procs use the same report file when running in parallel. - $this->tmpFiles[$type] = tempnam(sys_get_temp_dir(), 'phpcs'); - file_put_contents($this->tmpFiles[$type], ''); - } else { - file_put_contents($output, ''); - } - }//end foreach - - }//end __construct() - - - /** - * Generates and prints final versions of all reports. - * - * Returns TRUE if any of the reports output content to the screen - * or FALSE if all reports were silently printed to a file. - * - * @return bool - */ - public function printReports() - { - $toScreen = false; - foreach ($this->reports as $type => $report) { - if ($report['output'] === null) { - $toScreen = true; - } - - $this->printReport($type); - } - - return $toScreen; - - }//end printReports() - - - /** - * Generates and prints a single final report. - * - * @param string $report The report type to print. - * - * @return void - */ - public function printReport($report) - { - $reportClass = $this->reports[$report]['class']; - $reportFile = $this->reports[$report]['output']; - - if ($reportFile !== null) { - $filename = $reportFile; - $toScreen = false; - } else { - if (isset($this->tmpFiles[$report]) === true) { - $filename = $this->tmpFiles[$report]; - } else { - $filename = null; - } - - $toScreen = true; - } - - $reportCache = ''; - if ($filename !== null) { - $reportCache = file_get_contents($filename); - } - - ob_start(); - $reportClass->generate( - $reportCache, - $this->totalFiles, - $this->totalErrors, - $this->totalWarnings, - $this->totalFixable, - $this->config->showSources, - $this->config->reportWidth, - $this->config->interactive, - $toScreen - ); - $generatedReport = ob_get_contents(); - ob_end_clean(); - - if ($this->config->colors !== true || $reportFile !== null) { - $generatedReport = preg_replace('`\033\[[0-9;]+m`', '', $generatedReport); - } - - if ($reportFile !== null) { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo $generatedReport; - } - - file_put_contents($reportFile, $generatedReport.PHP_EOL); - } else { - echo $generatedReport; - if ($filename !== null && file_exists($filename) === true) { - unlink($filename); - unset($this->tmpFiles[$report]); - } - } - - }//end printReport() - - - /** - * Caches the result of a single processed file for all reports. - * - * The report content that is generated is appended to the output file - * assigned to each report. This content may be an intermediate report format - * and not reflect the final report output. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file that has been processed. - * - * @return void - */ - public function cacheFileReport(File $phpcsFile) - { - if (isset($this->config->reports) === false) { - // This happens during unit testing, or any time someone just wants - // the error data and not the printed report. - return; - } - - $reportData = $this->prepareFileReport($phpcsFile); - $errorsShown = false; - - foreach ($this->reports as $type => $report) { - $reportClass = $report['class']; - - ob_start(); - $result = $reportClass->generateFileReport($reportData, $phpcsFile, $this->config->showSources, $this->config->reportWidth); - if ($result === true) { - $errorsShown = true; - } - - $generatedReport = ob_get_contents(); - ob_end_clean(); - - if ($report['output'] === null) { - // Using a temp file. - if (isset($this->tmpFiles[$type]) === false) { - // When running in interactive mode, the reporter prints the full - // report many times, which will unlink the temp file. So we need - // to create a new one if it doesn't exist. - $this->tmpFiles[$type] = tempnam(sys_get_temp_dir(), 'phpcs'); - file_put_contents($this->tmpFiles[$type], ''); - } - - file_put_contents($this->tmpFiles[$type], $generatedReport, (FILE_APPEND | LOCK_EX)); - } else { - file_put_contents($report['output'], $generatedReport, (FILE_APPEND | LOCK_EX)); - }//end if - }//end foreach - - if ($errorsShown === true || PHP_CODESNIFFER_CBF === true) { - $this->totalFiles++; - $this->totalErrors += $reportData['errors']; - $this->totalWarnings += $reportData['warnings']; - - // When PHPCBF is running, we need to use the fixable error values - // after the report has run and fixed what it can. - if (PHP_CODESNIFFER_CBF === true) { - $this->totalFixable += $phpcsFile->getFixableCount(); - $this->totalFixed += $phpcsFile->getFixedCount(); - } else { - $this->totalFixable += $reportData['fixable']; - } - } - - }//end cacheFileReport() - - - /** - * Generate summary information to be used during report generation. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file that has been processed. - * - * @return array - */ - public function prepareFileReport(File $phpcsFile) - { - $report = [ - 'filename' => Common::stripBasepath($phpcsFile->getFilename(), $this->config->basepath), - 'errors' => $phpcsFile->getErrorCount(), - 'warnings' => $phpcsFile->getWarningCount(), - 'fixable' => $phpcsFile->getFixableCount(), - 'messages' => [], - ]; - - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Prefect score! - return $report; - } - - if ($this->config->recordErrors === false) { - $message = 'Errors are not being recorded but this report requires error messages. '; - $message .= 'This report will not show the correct information.'; - $report['messages'][1][1] = [ - [ - 'message' => $message, - 'source' => 'Internal.RecordErrors', - 'severity' => 5, - 'fixable' => false, - 'type' => 'ERROR', - ], - ]; - return $report; - } - - $errors = []; - - // Merge errors and warnings. - foreach ($phpcsFile->getErrors() as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - $newErrors = []; - foreach ($colErrors as $data) { - $newErrors[] = [ - 'message' => $data['message'], - 'source' => $data['source'], - 'severity' => $data['severity'], - 'fixable' => $data['fixable'], - 'type' => 'ERROR', - ]; - } - - $errors[$line][$column] = $newErrors; - } - - ksort($errors[$line]); - }//end foreach - - foreach ($phpcsFile->getWarnings() as $line => $lineWarnings) { - foreach ($lineWarnings as $column => $colWarnings) { - $newWarnings = []; - foreach ($colWarnings as $data) { - $newWarnings[] = [ - 'message' => $data['message'], - 'source' => $data['source'], - 'severity' => $data['severity'], - 'fixable' => $data['fixable'], - 'type' => 'WARNING', - ]; - } - - if (isset($errors[$line]) === false) { - $errors[$line] = []; - } - - if (isset($errors[$line][$column]) === true) { - $errors[$line][$column] = array_merge( - $newWarnings, - $errors[$line][$column] - ); - } else { - $errors[$line][$column] = $newWarnings; - } - }//end foreach - - ksort($errors[$line]); - }//end foreach - - ksort($errors); - $report['messages'] = $errors; - return $report; - - }//end prepareFileReport() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Cbf.php b/vendor/squizlabs/php_codesniffer/src/Reports/Cbf.php deleted file mode 100644 index 25249e8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Cbf.php +++ /dev/null @@ -1,250 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Exceptions\DeepExitException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util; - -class Cbf implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $errors = $phpcsFile->getFixableCount(); - if ($errors !== 0) { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - ob_end_clean(); - $startTime = microtime(true); - echo "\t=> Fixing file: $errors/$errors violations remaining"; - } - - $fixed = $phpcsFile->fixer->fixFile(); - } - - if ($phpcsFile->config->stdin === true) { - // Replacing STDIN, so output current file to STDOUT - // even if nothing was fixed. Exit here because we - // can't process any more than 1 file in this setup. - $fixedContent = $phpcsFile->fixer->getContents(); - throw new DeepExitException($fixedContent, 1); - } - - if ($errors === 0) { - return false; - } - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - if ($fixed === false) { - echo 'ERROR'; - } else { - echo 'DONE'; - } - - $timeTaken = ((microtime(true) - $startTime) * 1000); - if ($timeTaken < 1000) { - $timeTaken = round($timeTaken); - echo " in {$timeTaken}ms".PHP_EOL; - } else { - $timeTaken = round(($timeTaken / 1000), 2); - echo " in $timeTaken secs".PHP_EOL; - } - } - - if ($fixed === true) { - // The filename in the report may be truncated due to a basepath setting - // but we are using it for writing here and not display, - // so find the correct path if basepath is in use. - $newFilename = $report['filename'].$phpcsFile->config->suffix; - if ($phpcsFile->config->basepath !== null) { - $newFilename = $phpcsFile->config->basepath.DIRECTORY_SEPARATOR.$newFilename; - } - - $newContent = $phpcsFile->fixer->getContents(); - file_put_contents($newFilename, $newContent); - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - if ($newFilename === $report['filename']) { - echo "\t=> File was overwritten".PHP_EOL; - } else { - echo "\t=> Fixed file written to ".basename($newFilename).PHP_EOL; - } - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - ob_start(); - } - - $errorCount = $phpcsFile->getErrorCount(); - $warningCount = $phpcsFile->getWarningCount(); - $fixableCount = $phpcsFile->getFixableCount(); - $fixedCount = ($errors - $fixableCount); - echo $report['filename'].">>$errorCount>>$warningCount>>$fixableCount>>$fixedCount".PHP_EOL; - - return $fixed; - - }//end generateFileReport() - - - /** - * Prints a summary of fixed files. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $lines = explode(PHP_EOL, $cachedData); - array_pop($lines); - - if (empty($lines) === true) { - echo PHP_EOL.'No fixable errors were found'.PHP_EOL; - return; - } - - $reportFiles = []; - $maxLength = 0; - $totalFixed = 0; - $failures = 0; - - foreach ($lines as $line) { - $parts = explode('>>', $line); - $fileLen = strlen($parts[0]); - $reportFiles[$parts[0]] = [ - 'errors' => $parts[1], - 'warnings' => $parts[2], - 'fixable' => $parts[3], - 'fixed' => $parts[4], - 'strlen' => $fileLen, - ]; - - $maxLength = max($maxLength, $fileLen); - - $totalFixed += $parts[4]; - - if ($parts[3] > 0) { - $failures++; - } - } - - $width = min($width, ($maxLength + 21)); - $width = max($width, 70); - - echo PHP_EOL."\033[1m".'PHPCBF RESULT SUMMARY'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1m".'FILE'.str_repeat(' ', ($width - 20)).'FIXED REMAINING'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - - foreach ($reportFiles as $file => $data) { - $padding = ($width - 18 - $data['strlen']); - if ($padding < 0) { - $file = '...'.substr($file, (($padding * -1) + 3)); - $padding = 0; - } - - echo $file.str_repeat(' ', $padding).' '; - - if ($data['fixable'] > 0) { - echo "\033[31mFAILED TO FIX\033[0m".PHP_EOL; - continue; - } - - $remaining = ($data['errors'] + $data['warnings']); - - if ($data['fixed'] !== 0) { - echo $data['fixed']; - echo str_repeat(' ', (7 - strlen((string) $data['fixed']))); - } else { - echo '0 '; - } - - if ($remaining !== 0) { - echo $remaining; - } else { - echo '0'; - } - - echo PHP_EOL; - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1mA TOTAL OF $totalFixed ERROR"; - if ($totalFixed !== 1) { - echo 'S'; - } - - $numFiles = count($reportFiles); - echo ' WERE FIXED IN '.$numFiles.' FILE'; - if ($numFiles !== 1) { - echo 'S'; - } - - echo "\033[0m"; - - if ($failures > 0) { - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - echo "\033[1mPHPCBF FAILED TO FIX $failures FILE"; - if ($failures !== 1) { - echo 'S'; - } - - echo "\033[0m"; - } - - echo PHP_EOL.str_repeat('-', $width).PHP_EOL.PHP_EOL; - - if ($toScreen === true && $interactive === false) { - Util\Timing::printRunTime(); - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Checkstyle.php b/vendor/squizlabs/php_codesniffer/src/Reports/Checkstyle.php deleted file mode 100644 index 06a78e1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Checkstyle.php +++ /dev/null @@ -1,109 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; - -class Checkstyle implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $out = new \XMLWriter; - $out->openMemory(); - $out->setIndent(true); - - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - $out->startElement('file'); - $out->writeAttribute('name', $report['filename']); - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $error['type'] = strtolower($error['type']); - if ($phpcsFile->config->encoding !== 'utf-8') { - $error['message'] = iconv($phpcsFile->config->encoding, 'utf-8', $error['message']); - } - - $out->startElement('error'); - $out->writeAttribute('line', $line); - $out->writeAttribute('column', $column); - $out->writeAttribute('severity', $error['type']); - $out->writeAttribute('message', $error['message']); - $out->writeAttribute('source', $error['source']); - $out->endElement(); - } - } - }//end foreach - - $out->endElement(); - echo $out->flush(); - - return true; - - }//end generateFileReport() - - - /** - * Prints all violations for processed files, in a Checkstyle format. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo ''.PHP_EOL; - echo ''.PHP_EOL; - echo $cachedData; - echo ''.PHP_EOL; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Code.php b/vendor/squizlabs/php_codesniffer/src/Reports/Code.php deleted file mode 100644 index c54c1e1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Code.php +++ /dev/null @@ -1,362 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util; - -class Code implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - // How many lines to show about and below the error line. - $surroundingLines = 2; - - $file = $report['filename']; - $tokens = $phpcsFile->getTokens(); - if (empty($tokens) === true) { - if (PHP_CODESNIFFER_VERBOSITY === 1) { - $startTime = microtime(true); - echo 'CODE report is parsing '.basename($file).' '; - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "CODE report is forcing parse of $file".PHP_EOL; - } - - try { - $phpcsFile->parse(); - } catch (\Exception $e) { - // This is a second parse, so ignore exceptions. - // They would have been added to the file's error list already. - } - - if (PHP_CODESNIFFER_VERBOSITY === 1) { - $timeTaken = ((microtime(true) - $startTime) * 1000); - if ($timeTaken < 1000) { - $timeTaken = round($timeTaken); - echo "DONE in {$timeTaken}ms"; - } else { - $timeTaken = round(($timeTaken / 1000), 2); - echo "DONE in $timeTaken secs"; - } - - echo PHP_EOL; - } - - $tokens = $phpcsFile->getTokens(); - }//end if - - // Create an array that maps lines to the first token on the line. - $lineTokens = []; - $lastLine = 0; - $stackPtr = 0; - foreach ($tokens as $stackPtr => $token) { - if ($token['line'] !== $lastLine) { - if ($lastLine > 0) { - $lineTokens[$lastLine]['end'] = ($stackPtr - 1); - } - - $lastLine++; - $lineTokens[$lastLine] = [ - 'start' => $stackPtr, - 'end' => null, - ]; - } - } - - // Make sure the last token in the file sits on an imaginary - // last line so it is easier to generate code snippets at the - // end of the file. - $lineTokens[$lastLine]['end'] = $stackPtr; - - // Determine the longest code line we will be showing. - $maxSnippetLength = 0; - $eolLen = strlen($phpcsFile->eolChar); - foreach ($report['messages'] as $line => $lineErrors) { - $startLine = max(($line - $surroundingLines), 1); - $endLine = min(($line + $surroundingLines), $lastLine); - - $maxLineNumLength = strlen($endLine); - - for ($i = $startLine; $i <= $endLine; $i++) { - if ($i === 1) { - continue; - } - - $lineLength = ($tokens[($lineTokens[$i]['start'] - 1)]['column'] + $tokens[($lineTokens[$i]['start'] - 1)]['length'] - $eolLen); - $maxSnippetLength = max($lineLength, $maxSnippetLength); - } - } - - $maxSnippetLength += ($maxLineNumLength + 8); - - // Determine the longest error message we will be showing. - $maxErrorLength = 0; - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $length = strlen($error['message']); - if ($showSources === true) { - $length += (strlen($error['source']) + 3); - } - - $maxErrorLength = max($maxErrorLength, ($length + 1)); - } - } - } - - // The padding that all lines will require that are printing an error message overflow. - if ($report['warnings'] > 0) { - $typeLength = 7; - } else { - $typeLength = 5; - } - - $errorPadding = str_repeat(' ', ($maxLineNumLength + 7)); - $errorPadding .= str_repeat(' ', $typeLength); - $errorPadding .= ' '; - if ($report['fixable'] > 0) { - $errorPadding .= ' '; - } - - $errorPaddingLength = strlen($errorPadding); - - // The maximum amount of space an error message can use. - $maxErrorSpace = ($width - $errorPaddingLength); - if ($showSources === true) { - // Account for the chars used to print colors. - $maxErrorSpace += 8; - } - - // Figure out the max report width we need and can use. - $fileLength = strlen($file); - $maxWidth = max(($fileLength + 6), ($maxErrorLength + $errorPaddingLength)); - $width = max(min($width, $maxWidth), $maxSnippetLength); - if ($width < 70) { - $width = 70; - } - - // Print the file header. - echo PHP_EOL."\033[1mFILE: "; - if ($fileLength <= ($width - 6)) { - echo $file; - } else { - echo '...'.substr($file, ($fileLength - ($width - 6))); - } - - echo "\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - - echo "\033[1m".'FOUND '.$report['errors'].' ERROR'; - if ($report['errors'] !== 1) { - echo 'S'; - } - - if ($report['warnings'] > 0) { - echo ' AND '.$report['warnings'].' WARNING'; - if ($report['warnings'] !== 1) { - echo 'S'; - } - } - - echo ' AFFECTING '.count($report['messages']).' LINE'; - if (count($report['messages']) !== 1) { - echo 'S'; - } - - echo "\033[0m".PHP_EOL; - - foreach ($report['messages'] as $line => $lineErrors) { - $startLine = max(($line - $surroundingLines), 1); - $endLine = min(($line + $surroundingLines), $lastLine); - - $snippet = ''; - if (isset($lineTokens[$startLine]) === true) { - for ($i = $lineTokens[$startLine]['start']; $i <= $lineTokens[$endLine]['end']; $i++) { - $snippetLine = $tokens[$i]['line']; - if ($lineTokens[$snippetLine]['start'] === $i) { - // Starting a new line. - if ($snippetLine === $line) { - $snippet .= "\033[1m".'>> '; - } else { - $snippet .= ' '; - } - - $snippet .= str_repeat(' ', ($maxLineNumLength - strlen($snippetLine))); - $snippet .= $snippetLine.': '; - if ($snippetLine === $line) { - $snippet .= "\033[0m"; - } - } - - if (isset($tokens[$i]['orig_content']) === true) { - $tokenContent = $tokens[$i]['orig_content']; - } else { - $tokenContent = $tokens[$i]['content']; - } - - if (strpos($tokenContent, "\t") !== false) { - $token = $tokens[$i]; - $token['content'] = $tokenContent; - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $tab = "\000"; - } else { - $tab = "\033[30;1m»\033[0m"; - } - - $phpcsFile->tokenizer->replaceTabsInToken($token, $tab, "\000"); - $tokenContent = $token['content']; - } - - $tokenContent = Util\Common::prepareForOutput($tokenContent, ["\r", "\n", "\t"]); - $tokenContent = str_replace("\000", ' ', $tokenContent); - - $underline = false; - if ($snippetLine === $line && isset($lineErrors[$tokens[$i]['column']]) === true) { - $underline = true; - } - - // Underline invisible characters as well. - if ($underline === true && trim($tokenContent) === '') { - $snippet .= "\033[4m".' '."\033[0m".$tokenContent; - } else { - if ($underline === true) { - $snippet .= "\033[4m"; - } - - $snippet .= $tokenContent; - - if ($underline === true) { - $snippet .= "\033[0m"; - } - } - }//end for - }//end if - - echo str_repeat('-', $width).PHP_EOL; - - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $padding = ($maxLineNumLength - strlen($line)); - echo 'LINE '.str_repeat(' ', $padding).$line.': '; - - if ($error['type'] === 'ERROR') { - echo "\033[31mERROR\033[0m"; - if ($report['warnings'] > 0) { - echo ' '; - } - } else { - echo "\033[33mWARNING\033[0m"; - } - - echo ' '; - if ($report['fixable'] > 0) { - echo '['; - if ($error['fixable'] === true) { - echo 'x'; - } else { - echo ' '; - } - - echo '] '; - } - - $message = $error['message']; - $message = str_replace("\n", "\n".$errorPadding, $message); - if ($showSources === true) { - $message = "\033[1m".$message."\033[0m".' ('.$error['source'].')'; - } - - $errorMsg = wordwrap( - $message, - $maxErrorSpace, - PHP_EOL.$errorPadding - ); - - echo $errorMsg.PHP_EOL; - }//end foreach - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - echo rtrim($snippet).PHP_EOL; - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - if ($report['fixable'] > 0) { - echo "\033[1m".'PHPCBF CAN FIX THE '.$report['fixable'].' MARKED SNIFF VIOLATIONS AUTOMATICALLY'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - } - - return true; - - }//end generateFileReport() - - - /** - * Prints all errors and warnings for each file processed. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - if ($cachedData === '') { - return; - } - - echo $cachedData; - - if ($toScreen === true && $interactive === false) { - Util\Timing::printRunTime(); - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Csv.php b/vendor/squizlabs/php_codesniffer/src/Reports/Csv.php deleted file mode 100644 index 6db7ecf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Csv.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; - -class Csv implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $filename = str_replace('"', '\"', $report['filename']); - $message = str_replace('"', '\"', $error['message']); - $type = strtolower($error['type']); - $source = $error['source']; - $severity = $error['severity']; - $fixable = (int) $error['fixable']; - echo "\"$filename\",$line,$column,$type,\"$message\",$source,$severity,$fixable".PHP_EOL; - } - } - } - - return true; - - }//end generateFileReport() - - - /** - * Generates a csv report. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo 'File,Line,Column,Type,Message,Source,Severity,Fixable'.PHP_EOL; - echo $cachedData; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Diff.php b/vendor/squizlabs/php_codesniffer/src/Reports/Diff.php deleted file mode 100644 index ce4b31f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Diff.php +++ /dev/null @@ -1,130 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; - -class Diff implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $errors = $phpcsFile->getFixableCount(); - if ($errors === 0) { - return false; - } - - $phpcsFile->disableCaching(); - $tokens = $phpcsFile->getTokens(); - if (empty($tokens) === true) { - if (PHP_CODESNIFFER_VERBOSITY === 1) { - $startTime = microtime(true); - echo 'DIFF report is parsing '.basename($report['filename']).' '; - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo 'DIFF report is forcing parse of '.$report['filename'].PHP_EOL; - } - - $phpcsFile->parse(); - - if (PHP_CODESNIFFER_VERBOSITY === 1) { - $timeTaken = ((microtime(true) - $startTime) * 1000); - if ($timeTaken < 1000) { - $timeTaken = round($timeTaken); - echo "DONE in {$timeTaken}ms"; - } else { - $timeTaken = round(($timeTaken / 1000), 2); - echo "DONE in $timeTaken secs"; - } - - echo PHP_EOL; - } - - $phpcsFile->fixer->startFile($phpcsFile); - }//end if - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - ob_end_clean(); - echo "\t*** START FILE FIXING ***".PHP_EOL; - } - - $fixed = $phpcsFile->fixer->fixFile(); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END FILE FIXING ***".PHP_EOL; - ob_start(); - } - - if ($fixed === false) { - return false; - } - - $diff = $phpcsFile->fixer->generateDiff(); - if ($diff === '') { - // Nothing to print. - return false; - } - - echo $diff.PHP_EOL; - return true; - - }//end generateFileReport() - - - /** - * Prints all errors and warnings for each file processed. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo $cachedData; - if ($toScreen === true && $cachedData !== '') { - echo PHP_EOL; - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Emacs.php b/vendor/squizlabs/php_codesniffer/src/Reports/Emacs.php deleted file mode 100644 index 3555f55..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Emacs.php +++ /dev/null @@ -1,90 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; - -class Emacs implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $message = $error['message']; - if ($showSources === true) { - $message .= ' ('.$error['source'].')'; - } - - $type = strtolower($error['type']); - echo $report['filename'].':'.$line.':'.$column.': '.$type.' - '.$message.PHP_EOL; - } - } - } - - return true; - - }//end generateFileReport() - - - /** - * Generates an emacs report. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo $cachedData; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Full.php b/vendor/squizlabs/php_codesniffer/src/Reports/Full.php deleted file mode 100644 index 084bc8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Full.php +++ /dev/null @@ -1,231 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util; - -class Full implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - // The length of the word ERROR or WARNING; used for padding. - if ($report['warnings'] > 0) { - $typeLength = 7; - } else { - $typeLength = 5; - } - - // Work out the max line number length for formatting. - $maxLineNumLength = max(array_map('strlen', array_keys($report['messages']))); - - // The padding that all lines will require that are - // printing an error message overflow. - $paddingLine2 = str_repeat(' ', ($maxLineNumLength + 1)); - $paddingLine2 .= ' | '; - $paddingLine2 .= str_repeat(' ', $typeLength); - $paddingLine2 .= ' | '; - if ($report['fixable'] > 0) { - $paddingLine2 .= ' '; - } - - $paddingLength = strlen($paddingLine2); - - // Make sure the report width isn't too big. - $maxErrorLength = 0; - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $length = strlen($error['message']); - if ($showSources === true) { - $length += (strlen($error['source']) + 3); - } - - $maxErrorLength = max($maxErrorLength, ($length + 1)); - } - } - } - - $file = $report['filename']; - $fileLength = strlen($file); - $maxWidth = max(($fileLength + 6), ($maxErrorLength + $paddingLength)); - $width = min($width, $maxWidth); - if ($width < 70) { - $width = 70; - } - - echo PHP_EOL."\033[1mFILE: "; - if ($fileLength <= ($width - 6)) { - echo $file; - } else { - echo '...'.substr($file, ($fileLength - ($width - 6))); - } - - echo "\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - - echo "\033[1m".'FOUND '.$report['errors'].' ERROR'; - if ($report['errors'] !== 1) { - echo 'S'; - } - - if ($report['warnings'] > 0) { - echo ' AND '.$report['warnings'].' WARNING'; - if ($report['warnings'] !== 1) { - echo 'S'; - } - } - - echo ' AFFECTING '.count($report['messages']).' LINE'; - if (count($report['messages']) !== 1) { - echo 'S'; - } - - echo "\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - - // The maximum amount of space an error message can use. - $maxErrorSpace = ($width - $paddingLength - 1); - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $message = $error['message']; - $msgLines = [$message]; - if (strpos($message, "\n") !== false) { - $msgLines = explode("\n", $message); - } - - $errorMsg = ''; - $lastLine = (count($msgLines) - 1); - foreach ($msgLines as $k => $msgLine) { - if ($k === 0) { - if ($showSources === true) { - $errorMsg .= "\033[1m"; - } - } else { - $errorMsg .= PHP_EOL.$paddingLine2; - } - - if ($k === $lastLine && $showSources === true) { - $msgLine .= "\033[0m".' ('.$error['source'].')'; - } - - $errorMsg .= wordwrap( - $msgLine, - $maxErrorSpace, - PHP_EOL.$paddingLine2 - ); - } - - // The padding that goes on the front of the line. - $padding = ($maxLineNumLength - strlen($line)); - - echo ' '.str_repeat(' ', $padding).$line.' | '; - if ($error['type'] === 'ERROR') { - echo "\033[31mERROR\033[0m"; - if ($report['warnings'] > 0) { - echo ' '; - } - } else { - echo "\033[33mWARNING\033[0m"; - } - - echo ' | '; - if ($report['fixable'] > 0) { - echo '['; - if ($error['fixable'] === true) { - echo 'x'; - } else { - echo ' '; - } - - echo '] '; - } - - echo $errorMsg.PHP_EOL; - }//end foreach - }//end foreach - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - if ($report['fixable'] > 0) { - echo "\033[1m".'PHPCBF CAN FIX THE '.$report['fixable'].' MARKED SNIFF VIOLATIONS AUTOMATICALLY'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - } - - echo PHP_EOL; - return true; - - }//end generateFileReport() - - - /** - * Prints all errors and warnings for each file processed. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - if ($cachedData === '') { - return; - } - - echo $cachedData; - - if ($toScreen === true && $interactive === false) { - Util\Timing::printRunTime(); - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Gitblame.php b/vendor/squizlabs/php_codesniffer/src/Reports/Gitblame.php deleted file mode 100644 index 947f3d8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Gitblame.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Exceptions\DeepExitException; - -class Gitblame extends VersionControl -{ - - /** - * The name of the report we want in the output - * - * @var string - */ - protected $reportName = 'GIT'; - - - /** - * Extract the author from a blame line. - * - * @param string $line Line to parse. - * - * @return mixed string or false if impossible to recover. - */ - protected function getAuthor($line) - { - $blameParts = []; - $line = preg_replace('|\s+|', ' ', $line); - preg_match( - '|\(.+[0-9]{4}-[0-9]{2}-[0-9]{2}\s+[0-9]+\)|', - $line, - $blameParts - ); - - if (isset($blameParts[0]) === false) { - return false; - } - - $parts = explode(' ', $blameParts[0]); - - if (count($parts) < 2) { - return false; - } - - $parts = array_slice($parts, 0, (count($parts) - 2)); - $author = preg_replace('|\(|', '', implode(' ', $parts)); - return $author; - - }//end getAuthor() - - - /** - * Gets the blame output. - * - * @param string $filename File to blame. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - protected function getBlameContent($filename) - { - $cwd = getcwd(); - - chdir(dirname($filename)); - $command = 'git blame --date=short "'.$filename.'" 2>&1'; - $handle = popen($command, 'r'); - if ($handle === false) { - $error = 'ERROR: Could not execute "'.$command.'"'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - $rawContent = stream_get_contents($handle); - fclose($handle); - - $blames = explode("\n", $rawContent); - chdir($cwd); - - return $blames; - - }//end getBlameContent() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Hgblame.php b/vendor/squizlabs/php_codesniffer/src/Reports/Hgblame.php deleted file mode 100644 index b0af664..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Hgblame.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Exceptions\DeepExitException; - -class Hgblame extends VersionControl -{ - - /** - * The name of the report we want in the output - * - * @var string - */ - protected $reportName = 'MERCURIAL'; - - - /** - * Extract the author from a blame line. - * - * @param string $line Line to parse. - * - * @return mixed string or false if impossible to recover. - */ - protected function getAuthor($line) - { - $blameParts = []; - $line = preg_replace('|\s+|', ' ', $line); - - preg_match( - '|(.+[0-9]{2}:[0-9]{2}:[0-9]{2}\s[0-9]{4}\s.[0-9]{4}:)|', - $line, - $blameParts - ); - - if (isset($blameParts[0]) === false) { - return false; - } - - $parts = explode(' ', $blameParts[0]); - - if (count($parts) < 6) { - return false; - } - - $parts = array_slice($parts, 0, (count($parts) - 6)); - - return trim(preg_replace('|<.+>|', '', implode(' ', $parts))); - - }//end getAuthor() - - - /** - * Gets the blame output. - * - * @param string $filename File to blame. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - protected function getBlameContent($filename) - { - $cwd = getcwd(); - - $fileParts = explode(DIRECTORY_SEPARATOR, $filename); - $found = false; - $location = ''; - while (empty($fileParts) === false) { - array_pop($fileParts); - $location = implode(DIRECTORY_SEPARATOR, $fileParts); - if (is_dir($location.DIRECTORY_SEPARATOR.'.hg') === true) { - $found = true; - break; - } - } - - if ($found === true) { - chdir($location); - } else { - $error = 'ERROR: Could not locate .hg directory '.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - $command = 'hg blame -u -d -v "'.$filename.'" 2>&1'; - $handle = popen($command, 'r'); - if ($handle === false) { - $error = 'ERROR: Could not execute "'.$command.'"'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - $rawContent = stream_get_contents($handle); - fclose($handle); - - $blames = explode("\n", $rawContent); - chdir($cwd); - - return $blames; - - }//end getBlameContent() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Info.php b/vendor/squizlabs/php_codesniffer/src/Reports/Info.php deleted file mode 100644 index 3181bcc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Info.php +++ /dev/null @@ -1,172 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Timing; - -class Info implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $metrics = $phpcsFile->getMetrics(); - foreach ($metrics as $metric => $data) { - foreach ($data['values'] as $value => $count) { - echo "$metric>>$value>>$count".PHP_EOL; - } - } - - return true; - - }//end generateFileReport() - - - /** - * Prints the source of all errors and warnings. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $lines = explode(PHP_EOL, $cachedData); - array_pop($lines); - - if (empty($lines) === true) { - return; - } - - $metrics = []; - foreach ($lines as $line) { - $parts = explode('>>', $line); - $metric = $parts[0]; - $value = $parts[1]; - $count = $parts[2]; - if (isset($metrics[$metric]) === false) { - $metrics[$metric] = []; - } - - if (isset($metrics[$metric][$value]) === false) { - $metrics[$metric][$value] = $count; - } else { - $metrics[$metric][$value] += $count; - } - } - - ksort($metrics); - - echo PHP_EOL."\033[1m".'PHP CODE SNIFFER INFORMATION REPORT'."\033[0m".PHP_EOL; - echo str_repeat('-', 70).PHP_EOL; - - foreach ($metrics as $metric => $values) { - if (count($values) === 1) { - $count = reset($values); - $value = key($values); - - echo "$metric: \033[4m$value\033[0m [$count/$count, 100%]".PHP_EOL; - } else { - $totalCount = 0; - $valueWidth = 0; - foreach ($values as $value => $count) { - $totalCount += $count; - $valueWidth = max($valueWidth, strlen($value)); - } - - // Length of the total string, plus however many - // thousands separators there are. - $countWidth = strlen($totalCount); - $thousandSeparatorCount = floor($countWidth / 3); - $countWidth += $thousandSeparatorCount; - - // Account for 'total' line. - $valueWidth = max(5, $valueWidth); - - echo "$metric:".PHP_EOL; - - ksort($values, SORT_NATURAL); - arsort($values); - - $percentPrefixWidth = 0; - $percentWidth = 6; - foreach ($values as $value => $count) { - $percent = round(($count / $totalCount * 100), 2); - $percentPrefix = ''; - if ($percent === 0.00) { - $percent = 0.01; - $percentPrefix = '<'; - $percentPrefixWidth = 2; - $percentWidth = 4; - } - - printf( - "\t%-{$valueWidth}s => %{$countWidth}s (%{$percentPrefixWidth}s%{$percentWidth}.2f%%)".PHP_EOL, - $value, - number_format($count), - $percentPrefix, - $percent - ); - } - - echo "\t".str_repeat('-', ($valueWidth + $countWidth + 15)).PHP_EOL; - printf( - "\t%-{$valueWidth}s => %{$countWidth}s (100.00%%)".PHP_EOL, - 'total', - number_format($totalCount) - ); - }//end if - - echo PHP_EOL; - }//end foreach - - echo str_repeat('-', 70).PHP_EOL; - - if ($toScreen === true && $interactive === false) { - Timing::printRunTime(); - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Json.php b/vendor/squizlabs/php_codesniffer/src/Reports/Json.php deleted file mode 100644 index 59d8f30..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Json.php +++ /dev/null @@ -1,106 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; - -class Json implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $filename = str_replace('\\', '\\\\', $report['filename']); - $filename = str_replace('"', '\"', $filename); - $filename = str_replace('/', '\/', $filename); - echo '"'.$filename.'":{'; - echo '"errors":'.$report['errors'].',"warnings":'.$report['warnings'].',"messages":['; - - $messages = ''; - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $error['message'] = str_replace("\n", '\n', $error['message']); - $error['message'] = str_replace("\r", '\r', $error['message']); - $error['message'] = str_replace("\t", '\t', $error['message']); - - $fixable = false; - if ($error['fixable'] === true) { - $fixable = true; - } - - $messagesObject = (object) $error; - $messagesObject->line = $line; - $messagesObject->column = $column; - $messagesObject->fixable = $fixable; - - $messages .= json_encode($messagesObject).","; - } - } - }//end foreach - - echo rtrim($messages, ','); - echo ']},'; - - return true; - - }//end generateFileReport() - - - /** - * Generates a JSON report. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo '{"totals":{"errors":'.$totalErrors.',"warnings":'.$totalWarnings.',"fixable":'.$totalFixable.'},"files":{'; - echo rtrim($cachedData, ','); - echo "}}".PHP_EOL; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Junit.php b/vendor/squizlabs/php_codesniffer/src/Reports/Junit.php deleted file mode 100644 index d3ede61..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Junit.php +++ /dev/null @@ -1,131 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; - -class Junit implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $out = new \XMLWriter; - $out->openMemory(); - $out->setIndent(true); - - $out->startElement('testsuite'); - $out->writeAttribute('name', $report['filename']); - $out->writeAttribute('errors', 0); - - if (count($report['messages']) === 0) { - $out->writeAttribute('tests', 1); - $out->writeAttribute('failures', 0); - - $out->startElement('testcase'); - $out->writeAttribute('name', $report['filename']); - $out->endElement(); - } else { - $failures = ($report['errors'] + $report['warnings']); - $out->writeAttribute('tests', $failures); - $out->writeAttribute('failures', $failures); - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $out->startElement('testcase'); - $out->writeAttribute('name', $error['source'].' at '.$report['filename']." ($line:$column)"); - - $error['type'] = strtolower($error['type']); - if ($phpcsFile->config->encoding !== 'utf-8') { - $error['message'] = iconv($phpcsFile->config->encoding, 'utf-8', $error['message']); - } - - $out->startElement('failure'); - $out->writeAttribute('type', $error['type']); - $out->writeAttribute('message', $error['message']); - $out->endElement(); - - $out->endElement(); - } - } - } - }//end if - - $out->endElement(); - echo $out->flush(); - return true; - - }//end generateFileReport() - - - /** - * Prints all violations for processed files, in a proprietary XML format. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - // Figure out the total number of tests. - $tests = 0; - $matches = []; - preg_match_all('/tests="([0-9]+)"/', $cachedData, $matches); - if (isset($matches[1]) === true) { - foreach ($matches[1] as $match) { - $tests += $match; - } - } - - $failures = ($totalErrors + $totalWarnings); - echo ''.PHP_EOL; - echo ''.PHP_EOL; - echo $cachedData; - echo ''.PHP_EOL; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Notifysend.php b/vendor/squizlabs/php_codesniffer/src/Reports/Notifysend.php deleted file mode 100644 index 5ffc5ba..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Notifysend.php +++ /dev/null @@ -1,241 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2012-2014 Christian Weiske - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; - -class Notifysend implements Report -{ - - /** - * Notification timeout in milliseconds. - * - * @var integer - */ - protected $timeout = 3000; - - /** - * Path to notify-send command. - * - * @var string - */ - protected $path = 'notify-send'; - - /** - * Show "ok, all fine" messages. - * - * @var boolean - */ - protected $showOk = true; - - /** - * Version of installed notify-send executable. - * - * @var string - */ - protected $version = null; - - - /** - * Load configuration data. - */ - public function __construct() - { - $path = Config::getExecutablePath('notifysend'); - if ($path !== null) { - $this->path = escapeshellcmd($path); - } - - $timeout = Config::getConfigData('notifysend_timeout'); - if ($timeout !== null) { - $this->timeout = (int) $timeout; - } - - $showOk = Config::getConfigData('notifysend_showok'); - if ($showOk !== null) { - $this->showOk = (bool) $showOk; - } - - $this->version = str_replace( - 'notify-send ', - '', - exec($this->path.' --version') - ); - - }//end __construct() - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - echo $report['filename'].PHP_EOL; - - // We want this file counted in the total number - // of checked files even if it has no errors. - return true; - - }//end generateFileReport() - - - /** - * Generates a summary of errors and warnings for each file processed. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $checkedFiles = explode(PHP_EOL, trim($cachedData)); - - $msg = $this->generateMessage($checkedFiles, $totalErrors, $totalWarnings); - if ($msg === null) { - if ($this->showOk === true) { - $this->notifyAllFine(); - } - } else { - $this->notifyErrors($msg); - } - - }//end generate() - - - /** - * Generate the error message to show to the user. - * - * @param string[] $checkedFiles The files checked during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * - * @return string Error message or NULL if no error/warning found. - */ - protected function generateMessage($checkedFiles, $totalErrors, $totalWarnings) - { - if ($totalErrors === 0 && $totalWarnings === 0) { - // Nothing to print. - return null; - } - - $totalFiles = count($checkedFiles); - - $msg = ''; - if ($totalFiles > 1) { - $msg .= 'Checked '.$totalFiles.' files'.PHP_EOL; - } else { - $msg .= $checkedFiles[0].PHP_EOL; - } - - if ($totalWarnings > 0) { - $msg .= $totalWarnings.' warnings'.PHP_EOL; - } - - if ($totalErrors > 0) { - $msg .= $totalErrors.' errors'.PHP_EOL; - } - - return $msg; - - }//end generateMessage() - - - /** - * Tell the user that all is fine and no error/warning has been found. - * - * @return void - */ - protected function notifyAllFine() - { - $cmd = $this->getBasicCommand(); - $cmd .= ' -i info'; - $cmd .= ' "PHP CodeSniffer: Ok"'; - $cmd .= ' "All fine"'; - exec($cmd); - - }//end notifyAllFine() - - - /** - * Tell the user that errors/warnings have been found. - * - * @param string $msg Message to display. - * - * @return void - */ - protected function notifyErrors($msg) - { - $cmd = $this->getBasicCommand(); - $cmd .= ' -i error'; - $cmd .= ' "PHP CodeSniffer: Error"'; - $cmd .= ' '.escapeshellarg(trim($msg)); - exec($cmd); - - }//end notifyErrors() - - - /** - * Generate and return the basic notify-send command string to execute. - * - * @return string Shell command with common parameters. - */ - protected function getBasicCommand() - { - $cmd = $this->path; - $cmd .= ' --category dev.validate'; - $cmd .= ' -h int:transient:1'; - $cmd .= ' -t '.(int) $this->timeout; - if (version_compare($this->version, '0.7.3', '>=') === true) { - $cmd .= ' -a phpcs'; - } - - return $cmd; - - }//end getBasicCommand() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Report.php b/vendor/squizlabs/php_codesniffer/src/Reports/Report.php deleted file mode 100644 index 38f8a62..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Report.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; - -interface Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80); - - - /** - * Generate the actual report. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ); - - -}//end interface diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Source.php b/vendor/squizlabs/php_codesniffer/src/Reports/Source.php deleted file mode 100644 index ce8c3cf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Source.php +++ /dev/null @@ -1,336 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Timing; - -class Source implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - $sources = []; - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $src = $error['source']; - if (isset($sources[$src]) === false) { - $sources[$src] = [ - 'fixable' => (int) $error['fixable'], - 'count' => 1, - ]; - } else { - $sources[$src]['count']++; - } - } - } - } - - foreach ($sources as $source => $data) { - echo $source.'>>'.$data['fixable'].'>>'.$data['count'].PHP_EOL; - } - - return true; - - }//end generateFileReport() - - - /** - * Prints the source of all errors and warnings. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $lines = explode(PHP_EOL, $cachedData); - array_pop($lines); - - if (empty($lines) === true) { - return; - } - - $sources = []; - $maxLength = 0; - - foreach ($lines as $line) { - $parts = explode('>>', $line); - $source = $parts[0]; - $fixable = (bool) $parts[1]; - $count = $parts[2]; - - if (isset($sources[$source]) === false) { - if ($showSources === true) { - $parts = null; - $sniff = $source; - } else { - $parts = explode('.', $source); - if ($parts[0] === 'Internal') { - $parts[2] = $parts[1]; - $parts[1] = ''; - } - - $parts[1] = $this->makeFriendlyName($parts[1]); - - $sniff = $this->makeFriendlyName($parts[2]); - if (isset($parts[3]) === true) { - $name = $this->makeFriendlyName($parts[3]); - $name[0] = strtolower($name[0]); - $sniff .= ' '.$name; - unset($parts[3]); - } - - $parts[2] = $sniff; - }//end if - - $maxLength = max($maxLength, strlen($sniff)); - - $sources[$source] = [ - 'count' => $count, - 'fixable' => $fixable, - 'parts' => $parts, - ]; - } else { - $sources[$source]['count'] += $count; - }//end if - }//end foreach - - if ($showSources === true) { - $width = min($width, ($maxLength + 11)); - } else { - $width = min($width, ($maxLength + 41)); - } - - $width = max($width, 70); - - // Sort the data based on counts and source code. - $sourceCodes = array_keys($sources); - $counts = []; - foreach ($sources as $source => $data) { - $counts[$source] = $data['count']; - } - - array_multisort($counts, SORT_DESC, $sourceCodes, SORT_ASC, SORT_NATURAL, $sources); - - echo PHP_EOL."\033[1mPHP CODE SNIFFER VIOLATION SOURCE SUMMARY\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL."\033[1m"; - if ($showSources === true) { - if ($totalFixable > 0) { - echo ' SOURCE'.str_repeat(' ', ($width - 15)).'COUNT'.PHP_EOL; - } else { - echo 'SOURCE'.str_repeat(' ', ($width - 11)).'COUNT'.PHP_EOL; - } - } else { - if ($totalFixable > 0) { - echo ' STANDARD CATEGORY SNIFF'.str_repeat(' ', ($width - 44)).'COUNT'.PHP_EOL; - } else { - echo 'STANDARD CATEGORY SNIFF'.str_repeat(' ', ($width - 40)).'COUNT'.PHP_EOL; - } - } - - echo "\033[0m".str_repeat('-', $width).PHP_EOL; - - $fixableSources = 0; - - if ($showSources === true) { - $maxSniffWidth = ($width - 7); - } else { - $maxSniffWidth = ($width - 37); - } - - if ($totalFixable > 0) { - $maxSniffWidth -= 4; - } - - foreach ($sources as $source => $sourceData) { - if ($totalFixable > 0) { - echo '['; - if ($sourceData['fixable'] === true) { - echo 'x'; - $fixableSources++; - } else { - echo ' '; - } - - echo '] '; - } - - if ($showSources === true) { - if (strlen($source) > $maxSniffWidth) { - $source = substr($source, 0, $maxSniffWidth); - } - - echo $source; - if ($totalFixable > 0) { - echo str_repeat(' ', ($width - 9 - strlen($source))); - } else { - echo str_repeat(' ', ($width - 5 - strlen($source))); - } - } else { - $parts = $sourceData['parts']; - - if (strlen($parts[0]) > 8) { - $parts[0] = substr($parts[0], 0, ((strlen($parts[0]) - 8) * -1)); - } - - echo $parts[0].str_repeat(' ', (10 - strlen($parts[0]))); - - $category = $parts[1]; - if (strlen($category) > 18) { - $category = substr($category, 0, ((strlen($category) - 18) * -1)); - } - - echo $category.str_repeat(' ', (20 - strlen($category))); - - $sniff = $parts[2]; - if (strlen($sniff) > $maxSniffWidth) { - $sniff = substr($sniff, 0, $maxSniffWidth); - } - - if ($totalFixable > 0) { - echo $sniff.str_repeat(' ', ($width - 39 - strlen($sniff))); - } else { - echo $sniff.str_repeat(' ', ($width - 35 - strlen($sniff))); - } - }//end if - - echo $sourceData['count'].PHP_EOL; - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1m".'A TOTAL OF '.($totalErrors + $totalWarnings).' SNIFF VIOLATION'; - if (($totalErrors + $totalWarnings) > 1) { - echo 'S'; - } - - echo ' WERE FOUND IN '.count($sources).' SOURCE'; - if (count($sources) !== 1) { - echo 'S'; - } - - echo "\033[0m"; - - if ($totalFixable > 0) { - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - echo "\033[1mPHPCBF CAN FIX THE $fixableSources MARKED SOURCES AUTOMATICALLY ($totalFixable VIOLATIONS IN TOTAL)\033[0m"; - } - - echo PHP_EOL.str_repeat('-', $width).PHP_EOL.PHP_EOL; - - if ($toScreen === true && $interactive === false) { - Timing::printRunTime(); - } - - }//end generate() - - - /** - * Converts a camel caps name into a readable string. - * - * @param string $name The camel caps name to convert. - * - * @return string - */ - public function makeFriendlyName($name) - { - if (trim($name) === '') { - return ''; - } - - $friendlyName = ''; - $length = strlen($name); - - $lastWasUpper = false; - $lastWasNumeric = false; - for ($i = 0; $i < $length; $i++) { - if (is_numeric($name[$i]) === true) { - if ($lastWasNumeric === false) { - $friendlyName .= ' '; - } - - $lastWasUpper = false; - $lastWasNumeric = true; - } else { - $lastWasNumeric = false; - - $char = strtolower($name[$i]); - if ($char === $name[$i]) { - // Lowercase. - $lastWasUpper = false; - } else { - // Uppercase. - if ($lastWasUpper === false) { - $friendlyName .= ' '; - if ($i < ($length - 1)) { - $next = $name[($i + 1)]; - if (strtolower($next) === $next) { - // Next char is lowercase so it is a word boundary. - $name[$i] = strtolower($name[$i]); - } - } - } - - $lastWasUpper = true; - } - }//end if - - $friendlyName .= $name[$i]; - }//end for - - $friendlyName = trim($friendlyName); - $friendlyName[0] = strtoupper($friendlyName[0]); - - return $friendlyName; - - }//end makeFriendlyName() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Summary.php b/vendor/squizlabs/php_codesniffer/src/Reports/Summary.php deleted file mode 100644 index 8fe18e7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Summary.php +++ /dev/null @@ -1,183 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util; - -class Summary implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if (PHP_CODESNIFFER_VERBOSITY === 0 - && $report['errors'] === 0 - && $report['warnings'] === 0 - ) { - // Nothing to print. - return false; - } - - echo $report['filename'].'>>'.$report['errors'].'>>'.$report['warnings'].PHP_EOL; - return true; - - }//end generateFileReport() - - - /** - * Generates a summary of errors and warnings for each file processed. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $lines = explode(PHP_EOL, $cachedData); - array_pop($lines); - - if (empty($lines) === true) { - return; - } - - $reportFiles = []; - $maxLength = 0; - - foreach ($lines as $line) { - $parts = explode('>>', $line); - $fileLen = strlen($parts[0]); - $reportFiles[$parts[0]] = [ - 'errors' => $parts[1], - 'warnings' => $parts[2], - 'strlen' => $fileLen, - ]; - - $maxLength = max($maxLength, $fileLen); - } - - uksort( - $reportFiles, - function ($keyA, $keyB) { - $pathPartsA = explode(DIRECTORY_SEPARATOR, $keyA); - $pathPartsB = explode(DIRECTORY_SEPARATOR, $keyB); - - do { - $partA = array_shift($pathPartsA); - $partB = array_shift($pathPartsB); - } while ($partA === $partB && empty($pathPartsA) === false && empty($pathPartsB) === false); - - if (empty($pathPartsA) === false && empty($pathPartsB) === true) { - return 1; - } else if (empty($pathPartsA) === true && empty($pathPartsB) === false) { - return -1; - } else { - return strcasecmp($partA, $partB); - } - } - ); - - $width = min($width, ($maxLength + 21)); - $width = max($width, 70); - - echo PHP_EOL."\033[1m".'PHP CODE SNIFFER REPORT SUMMARY'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1m".'FILE'.str_repeat(' ', ($width - 20)).'ERRORS WARNINGS'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - - foreach ($reportFiles as $file => $data) { - $padding = ($width - 18 - $data['strlen']); - if ($padding < 0) { - $file = '...'.substr($file, (($padding * -1) + 3)); - $padding = 0; - } - - echo $file.str_repeat(' ', $padding).' '; - if ($data['errors'] !== 0) { - echo "\033[31m".$data['errors']."\033[0m"; - echo str_repeat(' ', (8 - strlen((string) $data['errors']))); - } else { - echo '0 '; - } - - if ($data['warnings'] !== 0) { - echo "\033[33m".$data['warnings']."\033[0m"; - } else { - echo '0'; - } - - echo PHP_EOL; - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1mA TOTAL OF $totalErrors ERROR"; - if ($totalErrors !== 1) { - echo 'S'; - } - - echo ' AND '.$totalWarnings.' WARNING'; - if ($totalWarnings !== 1) { - echo 'S'; - } - - echo ' WERE FOUND IN '.$totalFiles.' FILE'; - if ($totalFiles !== 1) { - echo 'S'; - } - - echo "\033[0m"; - - if ($totalFixable > 0) { - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - echo "\033[1mPHPCBF CAN FIX $totalFixable OF THESE SNIFF VIOLATIONS AUTOMATICALLY\033[0m"; - } - - echo PHP_EOL.str_repeat('-', $width).PHP_EOL.PHP_EOL; - - if ($toScreen === true && $interactive === false) { - Util\Timing::printRunTime(); - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Svnblame.php b/vendor/squizlabs/php_codesniffer/src/Reports/Svnblame.php deleted file mode 100644 index f4719fe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Svnblame.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Exceptions\DeepExitException; - -class Svnblame extends VersionControl -{ - - /** - * The name of the report we want in the output - * - * @var string - */ - protected $reportName = 'SVN'; - - - /** - * Extract the author from a blame line. - * - * @param string $line Line to parse. - * - * @return mixed string or false if impossible to recover. - */ - protected function getAuthor($line) - { - $blameParts = []; - preg_match('|\s*([^\s]+)\s+([^\s]+)|', $line, $blameParts); - - if (isset($blameParts[2]) === false) { - return false; - } - - return $blameParts[2]; - - }//end getAuthor() - - - /** - * Gets the blame output. - * - * @param string $filename File to blame. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - protected function getBlameContent($filename) - { - $command = 'svn blame "'.$filename.'" 2>&1'; - $handle = popen($command, 'r'); - if ($handle === false) { - $error = 'ERROR: Could not execute "'.$command.'"'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - $rawContent = stream_get_contents($handle); - fclose($handle); - - $blames = explode("\n", $rawContent); - - return $blames; - - }//end getBlameContent() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/VersionControl.php b/vendor/squizlabs/php_codesniffer/src/Reports/VersionControl.php deleted file mode 100644 index 0f41456..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/VersionControl.php +++ /dev/null @@ -1,376 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Timing; - -abstract class VersionControl implements Report -{ - - /** - * The name of the report we want in the output. - * - * @var string - */ - protected $reportName = 'VERSION CONTROL'; - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $blames = $this->getBlameContent($report['filename']); - - $authorCache = []; - $praiseCache = []; - $sourceCache = []; - - foreach ($report['messages'] as $line => $lineErrors) { - $author = 'Unknown'; - if (isset($blames[($line - 1)]) === true) { - $blameAuthor = $this->getAuthor($blames[($line - 1)]); - if ($blameAuthor !== false) { - $author = $blameAuthor; - } - } - - if (isset($authorCache[$author]) === false) { - $authorCache[$author] = 0; - $praiseCache[$author] = [ - 'good' => 0, - 'bad' => 0, - ]; - } - - $praiseCache[$author]['bad']++; - - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $authorCache[$author]++; - - if ($showSources === true) { - $source = $error['source']; - if (isset($sourceCache[$author][$source]) === false) { - $sourceCache[$author][$source] = [ - 'count' => 1, - 'fixable' => $error['fixable'], - ]; - } else { - $sourceCache[$author][$source]['count']++; - } - } - } - } - - unset($blames[($line - 1)]); - }//end foreach - - // Now go through and give the authors some credit for - // all the lines that do not have errors. - foreach ($blames as $line) { - $author = $this->getAuthor($line); - if ($author === false) { - $author = 'Unknown'; - } - - if (isset($authorCache[$author]) === false) { - // This author doesn't have any errors. - if (PHP_CODESNIFFER_VERBOSITY === 0) { - continue; - } - - $authorCache[$author] = 0; - $praiseCache[$author] = [ - 'good' => 0, - 'bad' => 0, - ]; - } - - $praiseCache[$author]['good']++; - }//end foreach - - foreach ($authorCache as $author => $errors) { - echo "AUTHOR>>$author>>$errors".PHP_EOL; - } - - foreach ($praiseCache as $author => $praise) { - echo "PRAISE>>$author>>".$praise['good'].'>>'.$praise['bad'].PHP_EOL; - } - - foreach ($sourceCache as $author => $sources) { - foreach ($sources as $source => $sourceData) { - $count = $sourceData['count']; - $fixable = (int) $sourceData['fixable']; - echo "SOURCE>>$author>>$source>>$count>>$fixable".PHP_EOL; - } - } - - return true; - - }//end generateFileReport() - - - /** - * Prints the author of all errors and warnings, as given by "version control blame". - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $errorsShown = ($totalErrors + $totalWarnings); - if ($errorsShown === 0) { - // Nothing to show. - return; - } - - $lines = explode(PHP_EOL, $cachedData); - array_pop($lines); - - if (empty($lines) === true) { - return; - } - - $authorCache = []; - $praiseCache = []; - $sourceCache = []; - - foreach ($lines as $line) { - $parts = explode('>>', $line); - switch ($parts[0]) { - case 'AUTHOR': - if (isset($authorCache[$parts[1]]) === false) { - $authorCache[$parts[1]] = $parts[2]; - } else { - $authorCache[$parts[1]] += $parts[2]; - } - break; - case 'PRAISE': - if (isset($praiseCache[$parts[1]]) === false) { - $praiseCache[$parts[1]] = [ - 'good' => $parts[2], - 'bad' => $parts[3], - ]; - } else { - $praiseCache[$parts[1]]['good'] += $parts[2]; - $praiseCache[$parts[1]]['bad'] += $parts[3]; - } - break; - case 'SOURCE': - if (isset($praiseCache[$parts[1]]) === false) { - $praiseCache[$parts[1]] = []; - } - - if (isset($sourceCache[$parts[1]][$parts[2]]) === false) { - $sourceCache[$parts[1]][$parts[2]] = [ - 'count' => $parts[3], - 'fixable' => (bool) $parts[4], - ]; - } else { - $sourceCache[$parts[1]][$parts[2]]['count'] += $parts[3]; - } - break; - default: - break; - }//end switch - }//end foreach - - // Make sure the report width isn't too big. - $maxLength = 0; - foreach ($authorCache as $author => $count) { - $maxLength = max($maxLength, strlen($author)); - if ($showSources === true && isset($sourceCache[$author]) === true) { - foreach ($sourceCache[$author] as $source => $sourceData) { - if ($source === 'count') { - continue; - } - - $maxLength = max($maxLength, (strlen($source) + 9)); - } - } - } - - $width = min($width, ($maxLength + 30)); - $width = max($width, 70); - arsort($authorCache); - - echo PHP_EOL."\033[1m".'PHP CODE SNIFFER '.$this->reportName.' BLAME SUMMARY'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL."\033[1m"; - if ($showSources === true) { - echo 'AUTHOR SOURCE'.str_repeat(' ', ($width - 43)).'(Author %) (Overall %) COUNT'.PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - } else { - echo 'AUTHOR'.str_repeat(' ', ($width - 34)).'(Author %) (Overall %) COUNT'.PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - } - - echo "\033[0m"; - - if ($showSources === true) { - $maxSniffWidth = ($width - 15); - - if ($totalFixable > 0) { - $maxSniffWidth -= 4; - } - } - - $fixableSources = 0; - - foreach ($authorCache as $author => $count) { - if ($praiseCache[$author]['good'] === 0) { - $percent = 0; - } else { - $total = ($praiseCache[$author]['bad'] + $praiseCache[$author]['good']); - $percent = round(($praiseCache[$author]['bad'] / $total * 100), 2); - } - - $overallPercent = '('.round((($count / $errorsShown) * 100), 2).')'; - $authorPercent = '('.$percent.')'; - $line = str_repeat(' ', (6 - strlen($count))).$count; - $line = str_repeat(' ', (12 - strlen($overallPercent))).$overallPercent.$line; - $line = str_repeat(' ', (11 - strlen($authorPercent))).$authorPercent.$line; - $line = $author.str_repeat(' ', ($width - strlen($author) - strlen($line))).$line; - - if ($showSources === true) { - $line = "\033[1m$line\033[0m"; - } - - echo $line.PHP_EOL; - - if ($showSources === true && isset($sourceCache[$author]) === true) { - $errors = $sourceCache[$author]; - asort($errors); - $errors = array_reverse($errors); - - foreach ($errors as $source => $sourceData) { - if ($source === 'count') { - continue; - } - - $count = $sourceData['count']; - - $srcLength = strlen($source); - if ($srcLength > $maxSniffWidth) { - $source = substr($source, 0, $maxSniffWidth); - } - - $line = str_repeat(' ', (5 - strlen($count))).$count; - - echo ' '; - if ($totalFixable > 0) { - echo '['; - if ($sourceData['fixable'] === true) { - echo 'x'; - $fixableSources++; - } else { - echo ' '; - } - - echo '] '; - } - - echo $source; - if ($totalFixable > 0) { - echo str_repeat(' ', ($width - 18 - strlen($source))); - } else { - echo str_repeat(' ', ($width - 14 - strlen($source))); - } - - echo $line.PHP_EOL; - }//end foreach - }//end if - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1m".'A TOTAL OF '.$errorsShown.' SNIFF VIOLATION'; - if ($errorsShown !== 1) { - echo 'S'; - } - - echo ' WERE COMMITTED BY '.count($authorCache).' AUTHOR'; - if (count($authorCache) !== 1) { - echo 'S'; - } - - echo "\033[0m"; - - if ($totalFixable > 0) { - if ($showSources === true) { - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - echo "\033[1mPHPCBF CAN FIX THE $fixableSources MARKED SOURCES AUTOMATICALLY ($totalFixable VIOLATIONS IN TOTAL)\033[0m"; - } else { - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - echo "\033[1mPHPCBF CAN FIX $totalFixable OF THESE SNIFF VIOLATIONS AUTOMATICALLY\033[0m"; - } - } - - echo PHP_EOL.str_repeat('-', $width).PHP_EOL.PHP_EOL; - - if ($toScreen === true && $interactive === false) { - Timing::printRunTime(); - } - - }//end generate() - - - /** - * Extract the author from a blame line. - * - * @param string $line Line to parse. - * - * @return mixed string or false if impossible to recover. - */ - abstract protected function getAuthor($line); - - - /** - * Gets the blame output. - * - * @param string $filename File to blame. - * - * @return array - */ - abstract protected function getBlameContent($filename); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Xml.php b/vendor/squizlabs/php_codesniffer/src/Reports/Xml.php deleted file mode 100644 index 066383d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Xml.php +++ /dev/null @@ -1,126 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; - -class Xml implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $out = new \XMLWriter; - $out->openMemory(); - $out->setIndent(true); - $out->setIndentString(' '); - $out->startDocument('1.0', 'UTF-8'); - - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - $out->startElement('file'); - $out->writeAttribute('name', $report['filename']); - $out->writeAttribute('errors', $report['errors']); - $out->writeAttribute('warnings', $report['warnings']); - $out->writeAttribute('fixable', $report['fixable']); - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $error['type'] = strtolower($error['type']); - if ($phpcsFile->config->encoding !== 'utf-8') { - $error['message'] = iconv($phpcsFile->config->encoding, 'utf-8', $error['message']); - } - - $out->startElement($error['type']); - $out->writeAttribute('line', $line); - $out->writeAttribute('column', $column); - $out->writeAttribute('source', $error['source']); - $out->writeAttribute('severity', $error['severity']); - $out->writeAttribute('fixable', (int) $error['fixable']); - $out->text($error['message']); - $out->endElement(); - } - } - }//end foreach - - $out->endElement(); - - // Remove the start of the document because we will - // add that manually later. We only have it in here to - // properly set the encoding. - $content = $out->flush(); - if (strpos($content, PHP_EOL) !== false) { - $content = substr($content, (strpos($content, PHP_EOL) + strlen(PHP_EOL))); - } else if (strpos($content, "\n") !== false) { - $content = substr($content, (strpos($content, "\n") + 1)); - } - - echo $content; - - return true; - - }//end generateFileReport() - - - /** - * Prints all violations for processed files, in a proprietary XML format. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo ''.PHP_EOL; - echo ''.PHP_EOL; - echo $cachedData; - echo ''.PHP_EOL; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Ruleset.php b/vendor/squizlabs/php_codesniffer/src/Ruleset.php deleted file mode 100644 index 3220a18..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Ruleset.php +++ /dev/null @@ -1,1383 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Util; - -class Ruleset -{ - - /** - * The name of the coding standard being used. - * - * If a top-level standard includes other standards, or sniffs - * from other standards, only the name of the top-level standard - * will be stored in here. - * - * If multiple top-level standards are being loaded into - * a single ruleset object, this will store a comma separated list - * of the top-level standard names. - * - * @var string - */ - public $name = ''; - - /** - * A list of file paths for the ruleset files being used. - * - * @var string[] - */ - public $paths = []; - - /** - * A list of regular expressions used to ignore specific sniffs for files and folders. - * - * Is also used to set global exclude patterns. - * The key is the regular expression and the value is the type - * of ignore pattern (absolute or relative). - * - * @var array - */ - public $ignorePatterns = []; - - /** - * A list of regular expressions used to include specific sniffs for files and folders. - * - * The key is the sniff code and the value is an array with - * the key being a regular expression and the value is the type - * of ignore pattern (absolute or relative). - * - * @var array> - */ - public $includePatterns = []; - - /** - * An array of sniff objects that are being used to check files. - * - * The key is the fully qualified name of the sniff class - * and the value is the sniff object. - * - * @var array - */ - public $sniffs = []; - - /** - * A mapping of sniff codes to fully qualified class names. - * - * The key is the sniff code and the value - * is the fully qualified name of the sniff class. - * - * @var array - */ - public $sniffCodes = []; - - /** - * An array of token types and the sniffs that are listening for them. - * - * The key is the token name being listened for and the value - * is the sniff object. - * - * @var array - */ - public $tokenListeners = []; - - /** - * An array of rules from the ruleset.xml file. - * - * It may be empty, indicating that the ruleset does not override - * any of the default sniff settings. - * - * @var array - */ - public $ruleset = []; - - /** - * The directories that the processed rulesets are in. - * - * @var string[] - */ - protected $rulesetDirs = []; - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - private $config = null; - - - /** - * Initialise the ruleset that the run will use. - * - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If no sniffs were registered. - */ - public function __construct(Config $config) - { - // Ignore sniff restrictions if caching is on. - $restrictions = []; - $exclusions = []; - if ($config->cache === false) { - $restrictions = $config->sniffs; - $exclusions = $config->exclude; - } - - $this->config = $config; - $sniffs = []; - - $standardPaths = []; - foreach ($config->standards as $standard) { - $installed = Util\Standards::getInstalledStandardPath($standard); - if ($installed === null) { - $standard = Util\Common::realpath($standard); - if (is_dir($standard) === true - && is_file(Util\Common::realpath($standard.DIRECTORY_SEPARATOR.'ruleset.xml')) === true - ) { - $standard = Util\Common::realpath($standard.DIRECTORY_SEPARATOR.'ruleset.xml'); - } - } else { - $standard = $installed; - } - - $standardPaths[] = $standard; - } - - foreach ($standardPaths as $standard) { - $ruleset = @simplexml_load_string(file_get_contents($standard)); - if ($ruleset !== false) { - $standardName = (string) $ruleset['name']; - if ($this->name !== '') { - $this->name .= ', '; - } - - $this->name .= $standardName; - - // Allow autoloading of custom files inside this standard. - if (isset($ruleset['namespace']) === true) { - $namespace = (string) $ruleset['namespace']; - } else { - $namespace = basename(dirname($standard)); - } - - Autoload::addSearchPath(dirname($standard), $namespace); - } - - if (defined('PHP_CODESNIFFER_IN_TESTS') === true && empty($restrictions) === false) { - // In unit tests, only register the sniffs that the test wants and not the entire standard. - try { - foreach ($restrictions as $restriction) { - $sniffs = array_merge($sniffs, $this->expandRulesetReference($restriction, dirname($standard))); - } - } catch (RuntimeException $e) { - // Sniff reference could not be expanded, which probably means this - // is an installed standard. Let the unit test system take care of - // setting the correct sniff for testing. - return; - } - - break; - } - - if (PHP_CODESNIFFER_VERBOSITY === 1) { - echo "Registering sniffs in the $standardName standard... "; - if (count($config->standards) > 1 || PHP_CODESNIFFER_VERBOSITY > 2) { - echo PHP_EOL; - } - } - - $sniffs = array_merge($sniffs, $this->processRuleset($standard)); - }//end foreach - - $sniffRestrictions = []; - foreach ($restrictions as $sniffCode) { - $parts = explode('.', strtolower($sniffCode)); - $sniffName = $parts[0].'\sniffs\\'.$parts[1].'\\'.$parts[2].'sniff'; - $sniffRestrictions[$sniffName] = true; - } - - $sniffExclusions = []; - foreach ($exclusions as $sniffCode) { - $parts = explode('.', strtolower($sniffCode)); - $sniffName = $parts[0].'\sniffs\\'.$parts[1].'\\'.$parts[2].'sniff'; - $sniffExclusions[$sniffName] = true; - } - - $this->registerSniffs($sniffs, $sniffRestrictions, $sniffExclusions); - $this->populateTokenListeners(); - - $numSniffs = count($this->sniffs); - if (PHP_CODESNIFFER_VERBOSITY === 1) { - echo "DONE ($numSniffs sniffs registered)".PHP_EOL; - } - - if ($numSniffs === 0) { - throw new RuntimeException('No sniffs were registered'); - } - - }//end __construct() - - - /** - * Prints a report showing the sniffs contained in a standard. - * - * @return void - */ - public function explain() - { - $sniffs = array_keys($this->sniffCodes); - sort($sniffs); - - ob_start(); - - $lastStandard = null; - $lastCount = ''; - $sniffCount = count($sniffs); - - // Add a dummy entry to the end so we loop - // one last time and clear the output buffer. - $sniffs[] = ''; - - echo PHP_EOL."The $this->name standard contains $sniffCount sniffs".PHP_EOL; - - ob_start(); - - foreach ($sniffs as $i => $sniff) { - if ($i === $sniffCount) { - $currentStandard = null; - } else { - $currentStandard = substr($sniff, 0, strpos($sniff, '.')); - if ($lastStandard === null) { - $lastStandard = $currentStandard; - } - } - - if ($currentStandard !== $lastStandard) { - $sniffList = ob_get_contents(); - ob_end_clean(); - - echo PHP_EOL.$lastStandard.' ('.$lastCount.' sniff'; - if ($lastCount > 1) { - echo 's'; - } - - echo ')'.PHP_EOL; - echo str_repeat('-', (strlen($lastStandard.$lastCount) + 10)); - echo PHP_EOL; - echo $sniffList; - - $lastStandard = $currentStandard; - $lastCount = 0; - - if ($currentStandard === null) { - break; - } - - ob_start(); - }//end if - - echo ' '.$sniff.PHP_EOL; - $lastCount++; - }//end foreach - - }//end explain() - - - /** - * Processes a single ruleset and returns a list of the sniffs it represents. - * - * Rules founds within the ruleset are processed immediately, but sniff classes - * are not registered by this method. - * - * @param string $rulesetPath The path to a ruleset XML file. - * @param int $depth How many nested processing steps we are in. This - * is only used for debug output. - * - * @return string[] - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException - If the ruleset path is invalid. - * - If a specified autoload file could not be found. - */ - public function processRuleset($rulesetPath, $depth=0) - { - $rulesetPath = Util\Common::realpath($rulesetPath); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo 'Processing ruleset '.Util\Common::stripBasepath($rulesetPath, $this->config->basepath).PHP_EOL; - } - - libxml_use_internal_errors(true); - $ruleset = simplexml_load_string(file_get_contents($rulesetPath)); - if ($ruleset === false) { - $errorMsg = "Ruleset $rulesetPath is not valid".PHP_EOL; - $errors = libxml_get_errors(); - foreach ($errors as $error) { - $errorMsg .= '- On line '.$error->line.', column '.$error->column.': '.$error->message; - } - - libxml_clear_errors(); - throw new RuntimeException($errorMsg); - } - - libxml_use_internal_errors(false); - - $ownSniffs = []; - $includedSniffs = []; - $excludedSniffs = []; - - $this->paths[] = $rulesetPath; - $rulesetDir = dirname($rulesetPath); - $this->rulesetDirs[] = $rulesetDir; - - $sniffDir = $rulesetDir.DIRECTORY_SEPARATOR.'Sniffs'; - if (is_dir($sniffDir) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\tAdding sniff files from ".Util\Common::stripBasepath($sniffDir, $this->config->basepath).' directory'.PHP_EOL; - } - - $ownSniffs = $this->expandSniffDirectory($sniffDir, $depth); - } - - // Include custom autoloaders. - foreach ($ruleset->{'autoload'} as $autoload) { - if ($this->shouldProcessElement($autoload) === false) { - continue; - } - - $autoloadPath = (string) $autoload; - - // Try relative autoload paths first. - $relativePath = Util\Common::realPath(dirname($rulesetPath).DIRECTORY_SEPARATOR.$autoloadPath); - - if ($relativePath !== false && is_file($relativePath) === true) { - $autoloadPath = $relativePath; - } else if (is_file($autoloadPath) === false) { - throw new RuntimeException('The specified autoload file "'.$autoload.'" does not exist'); - } - - include_once $autoloadPath; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> included autoloader $autoloadPath".PHP_EOL; - } - }//end foreach - - // Process custom sniff config settings. - foreach ($ruleset->{'config'} as $config) { - if ($this->shouldProcessElement($config) === false) { - continue; - } - - Config::setConfigData((string) $config['name'], (string) $config['value'], true); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> set config value ".(string) $config['name'].': '.(string) $config['value'].PHP_EOL; - } - } - - foreach ($ruleset->rule as $rule) { - if (isset($rule['ref']) === false - || $this->shouldProcessElement($rule) === false - ) { - continue; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\tProcessing rule \"".$rule['ref'].'"'.PHP_EOL; - } - - $expandedSniffs = $this->expandRulesetReference((string) $rule['ref'], $rulesetDir, $depth); - $newSniffs = array_diff($expandedSniffs, $includedSniffs); - $includedSniffs = array_merge($includedSniffs, $expandedSniffs); - - $parts = explode('.', $rule['ref']); - if (count($parts) === 4 - && $parts[0] !== '' - && $parts[1] !== '' - && $parts[2] !== '' - ) { - $sniffCode = $parts[0].'.'.$parts[1].'.'.$parts[2]; - if (isset($this->ruleset[$sniffCode]['severity']) === true - && $this->ruleset[$sniffCode]['severity'] === 0 - ) { - // This sniff code has already been turned off, but now - // it is being explicitly included again, so turn it back on. - $this->ruleset[(string) $rule['ref']]['severity'] = 5; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* disabling sniff exclusion for specific message code *".PHP_EOL; - echo str_repeat("\t", $depth); - echo "\t\t=> severity set to 5".PHP_EOL; - } - } else if (empty($newSniffs) === false) { - $newSniff = $newSniffs[0]; - if (in_array($newSniff, $ownSniffs, true) === false) { - // Including a sniff that hasn't been included higher up, but - // only including a single message from it. So turn off all messages in - // the sniff, except this one. - $this->ruleset[$sniffCode]['severity'] = 0; - $this->ruleset[(string) $rule['ref']]['severity'] = 5; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\tExcluding sniff \"".$sniffCode.'" except for "'.$parts[3].'"'.PHP_EOL; - } - } - }//end if - }//end if - - if (isset($rule->exclude) === true) { - foreach ($rule->exclude as $exclude) { - if (isset($exclude['name']) === false) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* ignoring empty exclude rule *".PHP_EOL; - echo "\t\t\t=> ".$exclude->asXML().PHP_EOL; - } - - continue; - } - - if ($this->shouldProcessElement($exclude) === false) { - continue; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\tExcluding rule \"".$exclude['name'].'"'.PHP_EOL; - } - - // Check if a single code is being excluded, which is a shortcut - // for setting the severity of the message to 0. - $parts = explode('.', $exclude['name']); - if (count($parts) === 4) { - $this->ruleset[(string) $exclude['name']]['severity'] = 0; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> severity set to 0".PHP_EOL; - } - } else { - $excludedSniffs = array_merge( - $excludedSniffs, - $this->expandRulesetReference((string) $exclude['name'], $rulesetDir, ($depth + 1)) - ); - } - }//end foreach - }//end if - - $this->processRule($rule, $newSniffs, $depth); - }//end foreach - - // Process custom command line arguments. - $cliArgs = []; - foreach ($ruleset->{'arg'} as $arg) { - if ($this->shouldProcessElement($arg) === false) { - continue; - } - - if (isset($arg['name']) === true) { - $argString = '--'.(string) $arg['name']; - if (isset($arg['value']) === true) { - $argString .= '='.(string) $arg['value']; - } - } else { - $argString = '-'.(string) $arg['value']; - } - - $cliArgs[] = $argString; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> set command line value $argString".PHP_EOL; - } - }//end foreach - - // Set custom php ini values as CLI args. - foreach ($ruleset->{'ini'} as $arg) { - if ($this->shouldProcessElement($arg) === false) { - continue; - } - - if (isset($arg['name']) === false) { - continue; - } - - $name = (string) $arg['name']; - $argString = $name; - if (isset($arg['value']) === true) { - $value = (string) $arg['value']; - $argString .= "=$value"; - } else { - $value = 'true'; - } - - $cliArgs[] = '-d'; - $cliArgs[] = $argString; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> set PHP ini value $name to $value".PHP_EOL; - } - }//end foreach - - if (empty($this->config->files) === true) { - // Process hard-coded file paths. - foreach ($ruleset->{'file'} as $file) { - $file = (string) $file; - $cliArgs[] = $file; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> added \"$file\" to the file list".PHP_EOL; - } - } - } - - if (empty($cliArgs) === false) { - // Change the directory so all relative paths are worked - // out based on the location of the ruleset instead of - // the location of the user. - $inPhar = Util\Common::isPharFile($rulesetDir); - if ($inPhar === false) { - $currentDir = getcwd(); - chdir($rulesetDir); - } - - $this->config->setCommandLineValues($cliArgs); - - if ($inPhar === false) { - chdir($currentDir); - } - } - - // Process custom ignore pattern rules. - foreach ($ruleset->{'exclude-pattern'} as $pattern) { - if ($this->shouldProcessElement($pattern) === false) { - continue; - } - - if (isset($pattern['type']) === false) { - $pattern['type'] = 'absolute'; - } - - $this->ignorePatterns[(string) $pattern] = (string) $pattern['type']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> added global ".(string) $pattern['type'].' ignore pattern: '.(string) $pattern.PHP_EOL; - } - } - - $includedSniffs = array_unique(array_merge($ownSniffs, $includedSniffs)); - $excludedSniffs = array_unique($excludedSniffs); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $included = count($includedSniffs); - $excluded = count($excludedSniffs); - echo str_repeat("\t", $depth); - echo "=> Ruleset processing complete; included $included sniffs and excluded $excluded".PHP_EOL; - } - - // Merge our own sniff list with our externally included - // sniff list, but filter out any excluded sniffs. - $files = []; - foreach ($includedSniffs as $sniff) { - if (in_array($sniff, $excludedSniffs, true) === true) { - continue; - } else { - $files[] = Util\Common::realpath($sniff); - } - } - - return $files; - - }//end processRuleset() - - - /** - * Expands a directory into a list of sniff files within. - * - * @param string $directory The path to a directory. - * @param int $depth How many nested processing steps we are in. This - * is only used for debug output. - * - * @return array - */ - private function expandSniffDirectory($directory, $depth=0) - { - $sniffs = []; - - $rdi = new \RecursiveDirectoryIterator($directory, \RecursiveDirectoryIterator::FOLLOW_SYMLINKS); - $di = new \RecursiveIteratorIterator($rdi, 0, \RecursiveIteratorIterator::CATCH_GET_CHILD); - - $dirLen = strlen($directory); - - foreach ($di as $file) { - $filename = $file->getFilename(); - - // Skip hidden files. - if (substr($filename, 0, 1) === '.') { - continue; - } - - // We are only interested in PHP and sniff files. - $fileParts = explode('.', $filename); - if (array_pop($fileParts) !== 'php') { - continue; - } - - $basename = basename($filename, '.php'); - if (substr($basename, -5) !== 'Sniff') { - continue; - } - - $path = $file->getPathname(); - - // Skip files in hidden directories within the Sniffs directory of this - // standard. We use the offset with strpos() to allow hidden directories - // before, valid example: - // /home/foo/.composer/vendor/squiz/custom_tool/MyStandard/Sniffs/... - if (strpos($path, DIRECTORY_SEPARATOR.'.', $dirLen) !== false) { - continue; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> ".Util\Common::stripBasepath($path, $this->config->basepath).PHP_EOL; - } - - $sniffs[] = $path; - }//end foreach - - return $sniffs; - - }//end expandSniffDirectory() - - - /** - * Expands a ruleset reference into a list of sniff files. - * - * @param string $ref The reference from the ruleset XML file. - * @param string $rulesetDir The directory of the ruleset XML file, used to - * evaluate relative paths. - * @param int $depth How many nested processing steps we are in. This - * is only used for debug output. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the reference is invalid. - */ - private function expandRulesetReference($ref, $rulesetDir, $depth=0) - { - // Ignore internal sniffs codes as they are used to only - // hide and change internal messages. - if (substr($ref, 0, 9) === 'Internal.') { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* ignoring internal sniff code *".PHP_EOL; - } - - return []; - } - - // As sniffs can't begin with a full stop, assume references in - // this format are relative paths and attempt to convert them - // to absolute paths. If this fails, let the reference run through - // the normal checks and have it fail as normal. - if (substr($ref, 0, 1) === '.') { - $realpath = Util\Common::realpath($rulesetDir.'/'.$ref); - if ($realpath !== false) { - $ref = $realpath; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> ".Util\Common::stripBasepath($ref, $this->config->basepath).PHP_EOL; - } - } - } - - // As sniffs can't begin with a tilde, assume references in - // this format are relative to the user's home directory. - if (substr($ref, 0, 2) === '~/') { - $realpath = Util\Common::realpath($ref); - if ($realpath !== false) { - $ref = $realpath; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> ".Util\Common::stripBasepath($ref, $this->config->basepath).PHP_EOL; - } - } - } - - if (is_file($ref) === true) { - if (substr($ref, -9) === 'Sniff.php') { - // A single external sniff. - $this->rulesetDirs[] = dirname(dirname(dirname($ref))); - return [$ref]; - } - } else { - // See if this is a whole standard being referenced. - $path = Util\Standards::getInstalledStandardPath($ref); - if (Util\Common::isPharFile($path) === true && strpos($path, 'ruleset.xml') === false) { - // If the ruleset exists inside the phar file, use it. - if (file_exists($path.DIRECTORY_SEPARATOR.'ruleset.xml') === true) { - $path .= DIRECTORY_SEPARATOR.'ruleset.xml'; - } else { - $path = null; - } - } - - if ($path !== null) { - $ref = $path; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> ".Util\Common::stripBasepath($ref, $this->config->basepath).PHP_EOL; - } - } else if (is_dir($ref) === false) { - // Work out the sniff path. - $sepPos = strpos($ref, DIRECTORY_SEPARATOR); - if ($sepPos !== false) { - $stdName = substr($ref, 0, $sepPos); - $path = substr($ref, $sepPos); - } else { - $parts = explode('.', $ref); - $stdName = $parts[0]; - if (count($parts) === 1) { - // A whole standard? - $path = ''; - } else if (count($parts) === 2) { - // A directory of sniffs? - $path = DIRECTORY_SEPARATOR.'Sniffs'.DIRECTORY_SEPARATOR.$parts[1]; - } else { - // A single sniff? - $path = DIRECTORY_SEPARATOR.'Sniffs'.DIRECTORY_SEPARATOR.$parts[1].DIRECTORY_SEPARATOR.$parts[2].'Sniff.php'; - } - } - - $newRef = false; - $stdPath = Util\Standards::getInstalledStandardPath($stdName); - if ($stdPath !== null && $path !== '') { - if (Util\Common::isPharFile($stdPath) === true - && strpos($stdPath, 'ruleset.xml') === false - ) { - // Phar files can only return the directory, - // since ruleset can be omitted if building one standard. - $newRef = Util\Common::realpath($stdPath.$path); - } else { - $newRef = Util\Common::realpath(dirname($stdPath).$path); - } - } - - if ($newRef === false) { - // The sniff is not locally installed, so check if it is being - // referenced as a remote sniff outside the install. We do this - // by looking through all directories where we have found ruleset - // files before, looking for ones for this particular standard, - // and seeing if it is in there. - foreach ($this->rulesetDirs as $dir) { - if (strtolower(basename($dir)) !== strtolower($stdName)) { - continue; - } - - $newRef = Util\Common::realpath($dir.$path); - - if ($newRef !== false) { - $ref = $newRef; - } - } - } else { - $ref = $newRef; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> ".Util\Common::stripBasepath($ref, $this->config->basepath).PHP_EOL; - } - }//end if - }//end if - - if (is_dir($ref) === true) { - if (is_file($ref.DIRECTORY_SEPARATOR.'ruleset.xml') === true) { - // We are referencing an external coding standard. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* rule is referencing a standard using directory name; processing *".PHP_EOL; - } - - return $this->processRuleset($ref.DIRECTORY_SEPARATOR.'ruleset.xml', ($depth + 2)); - } else { - // We are referencing a whole directory of sniffs. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* rule is referencing a directory of sniffs *".PHP_EOL; - echo str_repeat("\t", $depth); - echo "\t\tAdding sniff files from directory".PHP_EOL; - } - - return $this->expandSniffDirectory($ref, ($depth + 1)); - } - } else { - if (is_file($ref) === false) { - $error = "Referenced sniff \"$ref\" does not exist"; - throw new RuntimeException($error); - } - - if (substr($ref, -9) === 'Sniff.php') { - // A single sniff. - return [$ref]; - } else { - // Assume an external ruleset.xml file. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* rule is referencing a standard using ruleset path; processing *".PHP_EOL; - } - - return $this->processRuleset($ref, ($depth + 2)); - } - }//end if - - }//end expandRulesetReference() - - - /** - * Processes a rule from a ruleset XML file, overriding built-in defaults. - * - * @param \SimpleXMLElement $rule The rule object from a ruleset XML file. - * @param string[] $newSniffs An array of sniffs that got included by this rule. - * @param int $depth How many nested processing steps we are in. - * This is only used for debug output. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If rule settings are invalid. - */ - private function processRule($rule, $newSniffs, $depth=0) - { - $ref = (string) $rule['ref']; - $todo = [$ref]; - - $parts = explode('.', $ref); - $partsCount = count($parts); - if ($partsCount <= 2 - || $partsCount > count(array_filter($parts)) - || in_array($ref, $newSniffs) === true - ) { - // We are processing a standard, a category of sniffs or a relative path inclusion. - foreach ($newSniffs as $sniffFile) { - $parts = explode(DIRECTORY_SEPARATOR, $sniffFile); - if (count($parts) === 1 && DIRECTORY_SEPARATOR === '\\') { - // Path using forward slashes while running on Windows. - $parts = explode('/', $sniffFile); - } - - $sniffName = array_pop($parts); - $sniffCategory = array_pop($parts); - array_pop($parts); - $sniffStandard = array_pop($parts); - $todo[] = $sniffStandard.'.'.$sniffCategory.'.'.substr($sniffName, 0, -9); - } - } - - foreach ($todo as $code) { - // Custom severity. - if (isset($rule->severity) === true - && $this->shouldProcessElement($rule->severity) === true - ) { - if (isset($this->ruleset[$code]) === false) { - $this->ruleset[$code] = []; - } - - $this->ruleset[$code]['severity'] = (int) $rule->severity; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> severity set to ".(int) $rule->severity; - if ($code !== $ref) { - echo " for $code"; - } - - echo PHP_EOL; - } - } - - // Custom message type. - if (isset($rule->type) === true - && $this->shouldProcessElement($rule->type) === true - ) { - if (isset($this->ruleset[$code]) === false) { - $this->ruleset[$code] = []; - } - - $type = strtolower((string) $rule->type); - if ($type !== 'error' && $type !== 'warning') { - throw new RuntimeException("Message type \"$type\" is invalid; must be \"error\" or \"warning\""); - } - - $this->ruleset[$code]['type'] = $type; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> message type set to ".(string) $rule->type; - if ($code !== $ref) { - echo " for $code"; - } - - echo PHP_EOL; - } - }//end if - - // Custom message. - if (isset($rule->message) === true - && $this->shouldProcessElement($rule->message) === true - ) { - if (isset($this->ruleset[$code]) === false) { - $this->ruleset[$code] = []; - } - - $this->ruleset[$code]['message'] = (string) $rule->message; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> message set to ".(string) $rule->message; - if ($code !== $ref) { - echo " for $code"; - } - - echo PHP_EOL; - } - } - - // Custom properties. - if (isset($rule->properties) === true - && $this->shouldProcessElement($rule->properties) === true - ) { - foreach ($rule->properties->property as $prop) { - if ($this->shouldProcessElement($prop) === false) { - continue; - } - - if (isset($this->ruleset[$code]) === false) { - $this->ruleset[$code] = [ - 'properties' => [], - ]; - } else if (isset($this->ruleset[$code]['properties']) === false) { - $this->ruleset[$code]['properties'] = []; - } - - $name = (string) $prop['name']; - if (isset($prop['type']) === true - && (string) $prop['type'] === 'array' - ) { - $values = []; - if (isset($prop['extend']) === true - && (string) $prop['extend'] === 'true' - && isset($this->ruleset[$code]['properties'][$name]) === true - ) { - $values = $this->ruleset[$code]['properties'][$name]; - } - - if (isset($prop->element) === true) { - $printValue = ''; - foreach ($prop->element as $element) { - if ($this->shouldProcessElement($element) === false) { - continue; - } - - $value = (string) $element['value']; - if (isset($element['key']) === true) { - $key = (string) $element['key']; - $values[$key] = $value; - $printValue .= $key.'=>'.$value.','; - } else { - $values[] = $value; - $printValue .= $value.','; - } - } - - $printValue = rtrim($printValue, ','); - } else { - $value = (string) $prop['value']; - $printValue = $value; - foreach (explode(',', $value) as $val) { - list($k, $v) = explode('=>', $val.'=>'); - if ($v !== '') { - $values[trim($k)] = trim($v); - } else { - $values[] = trim($k); - } - } - }//end if - - $this->ruleset[$code]['properties'][$name] = $values; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> array property \"$name\" set to \"$printValue\""; - if ($code !== $ref) { - echo " for $code"; - } - - echo PHP_EOL; - } - } else { - $this->ruleset[$code]['properties'][$name] = (string) $prop['value']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> property \"$name\" set to \"".(string) $prop['value'].'"'; - if ($code !== $ref) { - echo " for $code"; - } - - echo PHP_EOL; - } - }//end if - }//end foreach - }//end if - - // Ignore patterns. - foreach ($rule->{'exclude-pattern'} as $pattern) { - if ($this->shouldProcessElement($pattern) === false) { - continue; - } - - if (isset($this->ignorePatterns[$code]) === false) { - $this->ignorePatterns[$code] = []; - } - - if (isset($pattern['type']) === false) { - $pattern['type'] = 'absolute'; - } - - $this->ignorePatterns[$code][(string) $pattern] = (string) $pattern['type']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> added rule-specific ".(string) $pattern['type'].' ignore pattern'; - if ($code !== $ref) { - echo " for $code"; - } - - echo ': '.(string) $pattern.PHP_EOL; - } - }//end foreach - - // Include patterns. - foreach ($rule->{'include-pattern'} as $pattern) { - if ($this->shouldProcessElement($pattern) === false) { - continue; - } - - if (isset($this->includePatterns[$code]) === false) { - $this->includePatterns[$code] = []; - } - - if (isset($pattern['type']) === false) { - $pattern['type'] = 'absolute'; - } - - $this->includePatterns[$code][(string) $pattern] = (string) $pattern['type']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> added rule-specific ".(string) $pattern['type'].' include pattern'; - if ($code !== $ref) { - echo " for $code"; - } - - echo ': '.(string) $pattern.PHP_EOL; - } - }//end foreach - }//end foreach - - }//end processRule() - - - /** - * Determine if an element should be processed or ignored. - * - * @param \SimpleXMLElement $element An object from a ruleset XML file. - * - * @return bool - */ - private function shouldProcessElement($element) - { - if (isset($element['phpcbf-only']) === false - && isset($element['phpcs-only']) === false - ) { - // No exceptions are being made. - return true; - } - - if (PHP_CODESNIFFER_CBF === true - && isset($element['phpcbf-only']) === true - && (string) $element['phpcbf-only'] === 'true' - ) { - return true; - } - - if (PHP_CODESNIFFER_CBF === false - && isset($element['phpcs-only']) === true - && (string) $element['phpcs-only'] === 'true' - ) { - return true; - } - - return false; - - }//end shouldProcessElement() - - - /** - * Loads and stores sniffs objects used for sniffing files. - * - * @param array $files Paths to the sniff files to register. - * @param array $restrictions The sniff class names to restrict the allowed - * listeners to. - * @param array $exclusions The sniff class names to exclude from the - * listeners list. - * - * @return void - */ - public function registerSniffs($files, $restrictions, $exclusions) - { - $listeners = []; - - foreach ($files as $file) { - // Work out where the position of /StandardName/Sniffs/... is - // so we can determine what the class will be called. - $sniffPos = strrpos($file, DIRECTORY_SEPARATOR.'Sniffs'.DIRECTORY_SEPARATOR); - if ($sniffPos === false) { - continue; - } - - $slashPos = strrpos(substr($file, 0, $sniffPos), DIRECTORY_SEPARATOR); - if ($slashPos === false) { - continue; - } - - $className = Autoload::loadFile($file); - $compareName = Util\Common::cleanSniffClass($className); - - // If they have specified a list of sniffs to restrict to, check - // to see if this sniff is allowed. - if (empty($restrictions) === false - && isset($restrictions[$compareName]) === false - ) { - continue; - } - - // If they have specified a list of sniffs to exclude, check - // to see if this sniff is allowed. - if (empty($exclusions) === false - && isset($exclusions[$compareName]) === true - ) { - continue; - } - - // Skip abstract classes. - $reflection = new \ReflectionClass($className); - if ($reflection->isAbstract() === true) { - continue; - } - - $listeners[$className] = $className; - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - echo "Registered $className".PHP_EOL; - } - }//end foreach - - $this->sniffs = $listeners; - - }//end registerSniffs() - - - /** - * Populates the array of PHP_CodeSniffer_Sniff objects for this file. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If sniff registration fails. - */ - public function populateTokenListeners() - { - // Construct a list of listeners indexed by token being listened for. - $this->tokenListeners = []; - - foreach ($this->sniffs as $sniffClass => $sniffObject) { - $this->sniffs[$sniffClass] = null; - $this->sniffs[$sniffClass] = new $sniffClass(); - - $sniffCode = Util\Common::getSniffCode($sniffClass); - $this->sniffCodes[$sniffCode] = $sniffClass; - - // Set custom properties. - if (isset($this->ruleset[$sniffCode]['properties']) === true) { - foreach ($this->ruleset[$sniffCode]['properties'] as $name => $value) { - $this->setSniffProperty($sniffClass, $name, $value); - } - } - - $tokenizers = []; - $vars = get_class_vars($sniffClass); - if (isset($vars['supportedTokenizers']) === true) { - foreach ($vars['supportedTokenizers'] as $tokenizer) { - $tokenizers[$tokenizer] = $tokenizer; - } - } else { - $tokenizers = ['PHP' => 'PHP']; - } - - $tokens = $this->sniffs[$sniffClass]->register(); - if (is_array($tokens) === false) { - $msg = "Sniff $sniffClass register() method must return an array"; - throw new RuntimeException($msg); - } - - $ignorePatterns = []; - $patterns = $this->getIgnorePatterns($sniffCode); - foreach ($patterns as $pattern => $type) { - $replacements = [ - '\\,' => ',', - '*' => '.*', - ]; - - $ignorePatterns[] = strtr($pattern, $replacements); - } - - $includePatterns = []; - $patterns = $this->getIncludePatterns($sniffCode); - foreach ($patterns as $pattern => $type) { - $replacements = [ - '\\,' => ',', - '*' => '.*', - ]; - - $includePatterns[] = strtr($pattern, $replacements); - } - - foreach ($tokens as $token) { - if (isset($this->tokenListeners[$token]) === false) { - $this->tokenListeners[$token] = []; - } - - if (isset($this->tokenListeners[$token][$sniffClass]) === false) { - $this->tokenListeners[$token][$sniffClass] = [ - 'class' => $sniffClass, - 'source' => $sniffCode, - 'tokenizers' => $tokenizers, - 'ignore' => $ignorePatterns, - 'include' => $includePatterns, - ]; - } - } - }//end foreach - - }//end populateTokenListeners() - - - /** - * Set a single property for a sniff. - * - * @param string $sniffClass The class name of the sniff. - * @param string $name The name of the property to change. - * @param string $value The new value of the property. - * - * @return void - */ - public function setSniffProperty($sniffClass, $name, $value) - { - // Setting a property for a sniff we are not using. - if (isset($this->sniffs[$sniffClass]) === false) { - return; - } - - $name = trim($name); - if (is_string($value) === true) { - $value = trim($value); - } - - if ($value === '') { - $value = null; - } - - // Special case for booleans. - if ($value === 'true') { - $value = true; - } else if ($value === 'false') { - $value = false; - } else if (substr($name, -2) === '[]') { - $name = substr($name, 0, -2); - $values = []; - if ($value !== null) { - foreach (explode(',', $value) as $val) { - list($k, $v) = explode('=>', $val.'=>'); - if ($v !== '') { - $values[trim($k)] = trim($v); - } else { - $values[] = trim($k); - } - } - } - - $value = $values; - } - - $this->sniffs[$sniffClass]->$name = $value; - - }//end setSniffProperty() - - - /** - * Gets the array of ignore patterns. - * - * Optionally takes a listener to get ignore patterns specified - * for that sniff only. - * - * @param string $listener The listener to get patterns for. If NULL, all - * patterns are returned. - * - * @return array - */ - public function getIgnorePatterns($listener=null) - { - if ($listener === null) { - return $this->ignorePatterns; - } - - if (isset($this->ignorePatterns[$listener]) === true) { - return $this->ignorePatterns[$listener]; - } - - return []; - - }//end getIgnorePatterns() - - - /** - * Gets the array of include patterns. - * - * Optionally takes a listener to get include patterns specified - * for that sniff only. - * - * @param string $listener The listener to get patterns for. If NULL, all - * patterns are returned. - * - * @return array - */ - public function getIncludePatterns($listener=null) - { - if ($listener === null) { - return $this->includePatterns; - } - - if (isset($this->includePatterns[$listener]) === true) { - return $this->includePatterns[$listener]; - } - - return []; - - }//end getIncludePatterns() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Runner.php b/vendor/squizlabs/php_codesniffer/src/Runner.php deleted file mode 100644 index bbed3c9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Runner.php +++ /dev/null @@ -1,886 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -use PHP_CodeSniffer\Exceptions\DeepExitException; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Files\DummyFile; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Files\FileList; -use PHP_CodeSniffer\Util\Cache; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Standards; - -class Runner -{ - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - public $config = null; - - /** - * The ruleset used for the run. - * - * @var \PHP_CodeSniffer\Ruleset - */ - public $ruleset = null; - - /** - * The reporter used for generating reports after the run. - * - * @var \PHP_CodeSniffer\Reporter - */ - public $reporter = null; - - - /** - * Run the PHPCS script. - * - * @return array - */ - public function runPHPCS() - { - try { - Util\Timing::startTiming(); - Runner::checkRequirements(); - - if (defined('PHP_CODESNIFFER_CBF') === false) { - define('PHP_CODESNIFFER_CBF', false); - } - - // Creating the Config object populates it with all required settings - // based on the CLI arguments provided to the script and any config - // values the user has set. - $this->config = new Config(); - - // Init the run and load the rulesets to set additional config vars. - $this->init(); - - // Print a list of sniffs in each of the supplied standards. - // We fudge the config here so that each standard is explained in isolation. - if ($this->config->explain === true) { - $standards = $this->config->standards; - foreach ($standards as $standard) { - $this->config->standards = [$standard]; - $ruleset = new Ruleset($this->config); - $ruleset->explain(); - } - - return 0; - } - - // Generate documentation for each of the supplied standards. - if ($this->config->generator !== null) { - $standards = $this->config->standards; - foreach ($standards as $standard) { - $this->config->standards = [$standard]; - $ruleset = new Ruleset($this->config); - $class = 'PHP_CodeSniffer\Generators\\'.$this->config->generator; - $generator = new $class($ruleset); - $generator->generate(); - } - - return 0; - } - - // Other report formats don't really make sense in interactive mode - // so we hard-code the full report here and when outputting. - // We also ensure parallel processing is off because we need to do one file at a time. - if ($this->config->interactive === true) { - $this->config->reports = ['full' => null]; - $this->config->parallel = 1; - $this->config->showProgress = false; - } - - // Disable caching if we are processing STDIN as we can't be 100% - // sure where the file came from or if it will change in the future. - if ($this->config->stdin === true) { - $this->config->cache = false; - } - - $numErrors = $this->run(); - - // Print all the reports for this run. - $toScreen = $this->reporter->printReports(); - - // Only print timer output if no reports were - // printed to the screen so we don't put additional output - // in something like an XML report. If we are printing to screen, - // the report types would have already worked out who should - // print the timer info. - if ($this->config->interactive === false - && ($toScreen === false - || (($this->reporter->totalErrors + $this->reporter->totalWarnings) === 0 && $this->config->showProgress === true)) - ) { - Util\Timing::printRunTime(); - } - } catch (DeepExitException $e) { - echo $e->getMessage(); - return $e->getCode(); - }//end try - - if ($numErrors === 0) { - // No errors found. - return 0; - } else if ($this->reporter->totalFixable === 0) { - // Errors found, but none of them can be fixed by PHPCBF. - return 1; - } else { - // Errors found, and some can be fixed by PHPCBF. - return 2; - } - - }//end runPHPCS() - - - /** - * Run the PHPCBF script. - * - * @return array - */ - public function runPHPCBF() - { - if (defined('PHP_CODESNIFFER_CBF') === false) { - define('PHP_CODESNIFFER_CBF', true); - } - - try { - Util\Timing::startTiming(); - Runner::checkRequirements(); - - // Creating the Config object populates it with all required settings - // based on the CLI arguments provided to the script and any config - // values the user has set. - $this->config = new Config(); - - // When processing STDIN, we can't output anything to the screen - // or it will end up mixed in with the file output. - if ($this->config->stdin === true) { - $this->config->verbosity = 0; - } - - // Init the run and load the rulesets to set additional config vars. - $this->init(); - - // When processing STDIN, we only process one file at a time and - // we don't process all the way through, so we can't use the parallel - // running system. - if ($this->config->stdin === true) { - $this->config->parallel = 1; - } - - // Override some of the command line settings that might break the fixes. - $this->config->generator = null; - $this->config->explain = false; - $this->config->interactive = false; - $this->config->cache = false; - $this->config->showSources = false; - $this->config->recordErrors = false; - $this->config->reportFile = null; - $this->config->reports = ['cbf' => null]; - - // If a standard tries to set command line arguments itself, some - // may be blocked because PHPCBF is running, so stop the script - // dying if any are found. - $this->config->dieOnUnknownArg = false; - - $this->run(); - $this->reporter->printReports(); - - echo PHP_EOL; - Util\Timing::printRunTime(); - } catch (DeepExitException $e) { - echo $e->getMessage(); - return $e->getCode(); - }//end try - - if ($this->reporter->totalFixed === 0) { - // Nothing was fixed by PHPCBF. - if ($this->reporter->totalFixable === 0) { - // Nothing found that could be fixed. - return 0; - } else { - // Something failed to fix. - return 2; - } - } - - if ($this->reporter->totalFixable === 0) { - // PHPCBF fixed all fixable errors. - return 1; - } - - // PHPCBF fixed some fixable errors, but others failed to fix. - return 2; - - }//end runPHPCBF() - - - /** - * Exits if the minimum requirements of PHP_CodeSniffer are not met. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If the requirements are not met. - */ - public function checkRequirements() - { - // Check the PHP version. - if (PHP_VERSION_ID < 50400) { - $error = 'ERROR: PHP_CodeSniffer requires PHP version 5.4.0 or greater.'.PHP_EOL; - throw new DeepExitException($error, 3); - } - - $requiredExtensions = [ - 'tokenizer', - 'xmlwriter', - 'SimpleXML', - ]; - $missingExtensions = []; - - foreach ($requiredExtensions as $extension) { - if (extension_loaded($extension) === false) { - $missingExtensions[] = $extension; - } - } - - if (empty($missingExtensions) === false) { - $last = array_pop($requiredExtensions); - $required = implode(', ', $requiredExtensions); - $required .= ' and '.$last; - - if (count($missingExtensions) === 1) { - $missing = $missingExtensions[0]; - } else { - $last = array_pop($missingExtensions); - $missing = implode(', ', $missingExtensions); - $missing .= ' and '.$last; - } - - $error = 'ERROR: PHP_CodeSniffer requires the %s extensions to be enabled. Please enable %s.'.PHP_EOL; - $error = sprintf($error, $required, $missing); - throw new DeepExitException($error, 3); - } - - }//end checkRequirements() - - - /** - * Init the rulesets and other high-level settings. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If a referenced standard is not installed. - */ - public function init() - { - if (defined('PHP_CODESNIFFER_CBF') === false) { - define('PHP_CODESNIFFER_CBF', false); - } - - // Ensure this option is enabled or else line endings will not always - // be detected properly for files created on a Mac with the /r line ending. - ini_set('auto_detect_line_endings', true); - - // Disable the PCRE JIT as this caused issues with parallel running. - ini_set('pcre.jit', false); - - // Check that the standards are valid. - foreach ($this->config->standards as $standard) { - if (Util\Standards::isInstalledStandard($standard) === false) { - // They didn't select a valid coding standard, so help them - // out by letting them know which standards are installed. - $error = 'ERROR: the "'.$standard.'" coding standard is not installed. '; - ob_start(); - Util\Standards::printInstalledStandards(); - $error .= ob_get_contents(); - ob_end_clean(); - throw new DeepExitException($error, 3); - } - } - - // Saves passing the Config object into other objects that only need - // the verbosity flag for debug output. - if (defined('PHP_CODESNIFFER_VERBOSITY') === false) { - define('PHP_CODESNIFFER_VERBOSITY', $this->config->verbosity); - } - - // Create this class so it is autoloaded and sets up a bunch - // of PHP_CodeSniffer-specific token type constants. - $tokens = new Util\Tokens(); - - // Allow autoloading of custom files inside installed standards. - $installedStandards = Standards::getInstalledStandardDetails(); - foreach ($installedStandards as $name => $details) { - Autoload::addSearchPath($details['path'], $details['namespace']); - } - - // The ruleset contains all the information about how the files - // should be checked and/or fixed. - try { - $this->ruleset = new Ruleset($this->config); - } catch (RuntimeException $e) { - $error = 'ERROR: '.$e->getMessage().PHP_EOL.PHP_EOL; - $error .= $this->config->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - }//end init() - - - /** - * Performs the run. - * - * @return int The number of errors and warnings found. - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException - */ - private function run() - { - // The class that manages all reporters for the run. - $this->reporter = new Reporter($this->config); - - // Include bootstrap files. - foreach ($this->config->bootstrap as $bootstrap) { - include $bootstrap; - } - - if ($this->config->stdin === true) { - $fileContents = $this->config->stdinContent; - if ($fileContents === null) { - $handle = fopen('php://stdin', 'r'); - stream_set_blocking($handle, true); - $fileContents = stream_get_contents($handle); - fclose($handle); - } - - $todo = new FileList($this->config, $this->ruleset); - $dummy = new DummyFile($fileContents, $this->ruleset, $this->config); - $todo->addFile($dummy->path, $dummy); - } else { - if (empty($this->config->files) === true) { - $error = 'ERROR: You must supply at least one file or directory to process.'.PHP_EOL.PHP_EOL; - $error .= $this->config->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo 'Creating file list... '; - } - - $todo = new FileList($this->config, $this->ruleset); - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - $numFiles = count($todo); - echo "DONE ($numFiles files in queue)".PHP_EOL; - } - - if ($this->config->cache === true) { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo 'Loading cache... '; - } - - Cache::load($this->ruleset, $this->config); - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - $size = Cache::getSize(); - echo "DONE ($size files in cache)".PHP_EOL; - } - } - }//end if - - // Turn all sniff errors into exceptions. - set_error_handler([$this, 'handleErrors']); - - // If verbosity is too high, turn off parallelism so the - // debug output is clean. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $this->config->parallel = 1; - } - - // If the PCNTL extension isn't installed, we can't fork. - if (function_exists('pcntl_fork') === false) { - $this->config->parallel = 1; - } - - $lastDir = ''; - $numFiles = count($todo); - - if ($this->config->parallel === 1) { - // Running normally. - $numProcessed = 0; - foreach ($todo as $path => $file) { - if ($file->ignored === false) { - $currDir = dirname($path); - if ($lastDir !== $currDir) { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo 'Changing into directory '.Common::stripBasepath($currDir, $this->config->basepath).PHP_EOL; - } - - $lastDir = $currDir; - } - - $this->processFile($file); - } else if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo 'Skipping '.basename($file->path).PHP_EOL; - } - - $numProcessed++; - $this->printProgress($file, $numFiles, $numProcessed); - } - } else { - // Batching and forking. - $childProcs = []; - $numPerBatch = ceil($numFiles / $this->config->parallel); - - for ($batch = 0; $batch < $this->config->parallel; $batch++) { - $startAt = ($batch * $numPerBatch); - if ($startAt >= $numFiles) { - break; - } - - $endAt = ($startAt + $numPerBatch); - if ($endAt > $numFiles) { - $endAt = $numFiles; - } - - $childOutFilename = tempnam(sys_get_temp_dir(), 'phpcs-child'); - $pid = pcntl_fork(); - if ($pid === -1) { - throw new RuntimeException('Failed to create child process'); - } else if ($pid !== 0) { - $childProcs[] = [ - 'pid' => $pid, - 'out' => $childOutFilename, - ]; - } else { - // Move forward to the start of the batch. - $todo->rewind(); - for ($i = 0; $i < $startAt; $i++) { - $todo->next(); - } - - // Reset the reporter to make sure only figures from this - // file batch are recorded. - $this->reporter->totalFiles = 0; - $this->reporter->totalErrors = 0; - $this->reporter->totalWarnings = 0; - $this->reporter->totalFixable = 0; - $this->reporter->totalFixed = 0; - - // Process the files. - $pathsProcessed = []; - ob_start(); - for ($i = $startAt; $i < $endAt; $i++) { - $path = $todo->key(); - $file = $todo->current(); - - if ($file->ignored === true) { - continue; - } - - $currDir = dirname($path); - if ($lastDir !== $currDir) { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo 'Changing into directory '.Common::stripBasepath($currDir, $this->config->basepath).PHP_EOL; - } - - $lastDir = $currDir; - } - - $this->processFile($file); - - $pathsProcessed[] = $path; - $todo->next(); - }//end for - - $debugOutput = ob_get_contents(); - ob_end_clean(); - - // Write information about the run to the filesystem - // so it can be picked up by the main process. - $childOutput = [ - 'totalFiles' => $this->reporter->totalFiles, - 'totalErrors' => $this->reporter->totalErrors, - 'totalWarnings' => $this->reporter->totalWarnings, - 'totalFixable' => $this->reporter->totalFixable, - 'totalFixed' => $this->reporter->totalFixed, - ]; - - $output = '<'.'?php'."\n".' $childOutput = '; - $output .= var_export($childOutput, true); - $output .= ";\n\$debugOutput = "; - $output .= var_export($debugOutput, true); - - if ($this->config->cache === true) { - $childCache = []; - foreach ($pathsProcessed as $path) { - $childCache[$path] = Cache::get($path); - } - - $output .= ";\n\$childCache = "; - $output .= var_export($childCache, true); - } - - $output .= ";\n?".'>'; - file_put_contents($childOutFilename, $output); - exit($pid); - }//end if - }//end for - - $success = $this->processChildProcs($childProcs); - if ($success === false) { - throw new RuntimeException('One or more child processes failed to run'); - } - }//end if - - restore_error_handler(); - - if (PHP_CODESNIFFER_VERBOSITY === 0 - && $this->config->interactive === false - && $this->config->showProgress === true - ) { - echo PHP_EOL.PHP_EOL; - } - - if ($this->config->cache === true) { - Cache::save(); - } - - $ignoreWarnings = Config::getConfigData('ignore_warnings_on_exit'); - $ignoreErrors = Config::getConfigData('ignore_errors_on_exit'); - - $return = ($this->reporter->totalErrors + $this->reporter->totalWarnings); - if ($ignoreErrors !== null) { - $ignoreErrors = (bool) $ignoreErrors; - if ($ignoreErrors === true) { - $return -= $this->reporter->totalErrors; - } - } - - if ($ignoreWarnings !== null) { - $ignoreWarnings = (bool) $ignoreWarnings; - if ($ignoreWarnings === true) { - $return -= $this->reporter->totalWarnings; - } - } - - return $return; - - }//end run() - - - /** - * Converts all PHP errors into exceptions. - * - * This method forces a sniff to stop processing if it is not - * able to handle a specific piece of code, instead of continuing - * and potentially getting into a loop. - * - * @param int $code The level of error raised. - * @param string $message The error message. - * @param string $file The path of the file that raised the error. - * @param int $line The line number the error was raised at. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException - */ - public function handleErrors($code, $message, $file, $line) - { - if ((error_reporting() & $code) === 0) { - // This type of error is being muted. - return true; - } - - throw new RuntimeException("$message in $file on line $line"); - - }//end handleErrors() - - - /** - * Processes a single file, including checking and fixing. - * - * @param \PHP_CodeSniffer\Files\File $file The file to be processed. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function processFile($file) - { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - $startTime = microtime(true); - echo 'Processing '.basename($file->path).' '; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - } - - try { - $file->process(); - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - $timeTaken = ((microtime(true) - $startTime) * 1000); - if ($timeTaken < 1000) { - $timeTaken = round($timeTaken); - echo "DONE in {$timeTaken}ms"; - } else { - $timeTaken = round(($timeTaken / 1000), 2); - echo "DONE in $timeTaken secs"; - } - - if (PHP_CODESNIFFER_CBF === true) { - $errors = $file->getFixableCount(); - echo " ($errors fixable violations)".PHP_EOL; - } else { - $errors = $file->getErrorCount(); - $warnings = $file->getWarningCount(); - echo " ($errors errors, $warnings warnings)".PHP_EOL; - } - } - } catch (\Exception $e) { - $error = 'An error occurred during processing; checking has been aborted. The error message was: '.$e->getMessage(); - $file->addErrorOnLine($error, 1, 'Internal.Exception'); - }//end try - - $this->reporter->cacheFileReport($file, $this->config); - - if ($this->config->interactive === true) { - /* - Running interactively. - Print the error report for the current file and then wait for user input. - */ - - // Get current violations and then clear the list to make sure - // we only print violations for a single file each time. - $numErrors = null; - while ($numErrors !== 0) { - $numErrors = ($file->getErrorCount() + $file->getWarningCount()); - if ($numErrors === 0) { - continue; - } - - $this->reporter->printReport('full'); - - echo ' to recheck, [s] to skip or [q] to quit : '; - $input = fgets(STDIN); - $input = trim($input); - - switch ($input) { - case 's': - break(2); - case 'q': - throw new DeepExitException('', 0); - default: - // Repopulate the sniffs because some of them save their state - // and only clear it when the file changes, but we are rechecking - // the same file. - $file->ruleset->populateTokenListeners(); - $file->reloadContent(); - $file->process(); - $this->reporter->cacheFileReport($file, $this->config); - break; - } - }//end while - }//end if - - // Clean up the file to save (a lot of) memory. - $file->cleanUp(); - - }//end processFile() - - - /** - * Waits for child processes to complete and cleans up after them. - * - * The reporting information returned by each child process is merged - * into the main reporter class. - * - * @param array $childProcs An array of child processes to wait for. - * - * @return bool - */ - private function processChildProcs($childProcs) - { - $numProcessed = 0; - $totalBatches = count($childProcs); - - $success = true; - - while (count($childProcs) > 0) { - foreach ($childProcs as $key => $procData) { - $res = pcntl_waitpid($procData['pid'], $status, WNOHANG); - if ($res === $procData['pid']) { - if (file_exists($procData['out']) === true) { - include $procData['out']; - - unlink($procData['out']); - unset($childProcs[$key]); - - $numProcessed++; - - if (isset($childOutput) === false) { - // The child process died, so the run has failed. - $file = new DummyFile(null, $this->ruleset, $this->config); - $file->setErrorCounts(1, 0, 0, 0); - $this->printProgress($file, $totalBatches, $numProcessed); - $success = false; - continue; - } - - $this->reporter->totalFiles += $childOutput['totalFiles']; - $this->reporter->totalErrors += $childOutput['totalErrors']; - $this->reporter->totalWarnings += $childOutput['totalWarnings']; - $this->reporter->totalFixable += $childOutput['totalFixable']; - $this->reporter->totalFixed += $childOutput['totalFixed']; - - if (isset($debugOutput) === true) { - echo $debugOutput; - } - - if (isset($childCache) === true) { - foreach ($childCache as $path => $cache) { - Cache::set($path, $cache); - } - } - - // Fake a processed file so we can print progress output for the batch. - $file = new DummyFile(null, $this->ruleset, $this->config); - $file->setErrorCounts( - $childOutput['totalErrors'], - $childOutput['totalWarnings'], - $childOutput['totalFixable'], - $childOutput['totalFixed'] - ); - $this->printProgress($file, $totalBatches, $numProcessed); - }//end if - }//end if - }//end foreach - }//end while - - return $success; - - }//end processChildProcs() - - - /** - * Print progress information for a single processed file. - * - * @param \PHP_CodeSniffer\Files\File $file The file that was processed. - * @param int $numFiles The total number of files to process. - * @param int $numProcessed The number of files that have been processed, - * including this one. - * - * @return void - */ - public function printProgress(File $file, $numFiles, $numProcessed) - { - if (PHP_CODESNIFFER_VERBOSITY > 0 - || $this->config->showProgress === false - ) { - return; - } - - // Show progress information. - if ($file->ignored === true) { - echo 'S'; - } else { - $errors = $file->getErrorCount(); - $warnings = $file->getWarningCount(); - $fixable = $file->getFixableCount(); - $fixed = $file->getFixedCount(); - - if (PHP_CODESNIFFER_CBF === true) { - // Files with fixed errors or warnings are F (green). - // Files with unfixable errors or warnings are E (red). - // Files with no errors or warnings are . (black). - if ($fixable > 0) { - if ($this->config->colors === true) { - echo "\033[31m"; - } - - echo 'E'; - - if ($this->config->colors === true) { - echo "\033[0m"; - } - } else if ($fixed > 0) { - if ($this->config->colors === true) { - echo "\033[32m"; - } - - echo 'F'; - - if ($this->config->colors === true) { - echo "\033[0m"; - } - } else { - echo '.'; - }//end if - } else { - // Files with errors are E (red). - // Files with fixable errors are E (green). - // Files with warnings are W (yellow). - // Files with fixable warnings are W (green). - // Files with no errors or warnings are . (black). - if ($errors > 0) { - if ($this->config->colors === true) { - if ($fixable > 0) { - echo "\033[32m"; - } else { - echo "\033[31m"; - } - } - - echo 'E'; - - if ($this->config->colors === true) { - echo "\033[0m"; - } - } else if ($warnings > 0) { - if ($this->config->colors === true) { - if ($fixable > 0) { - echo "\033[32m"; - } else { - echo "\033[33m"; - } - } - - echo 'W'; - - if ($this->config->colors === true) { - echo "\033[0m"; - } - } else { - echo '.'; - }//end if - }//end if - }//end if - - $numPerLine = 60; - if ($numProcessed !== $numFiles && ($numProcessed % $numPerLine) !== 0) { - return; - } - - $percent = round(($numProcessed / $numFiles) * 100); - $padding = (strlen($numFiles) - strlen($numProcessed)); - if ($numProcessed === $numFiles && $numFiles > $numPerLine) { - $padding += ($numPerLine - ($numFiles - (floor($numFiles / $numPerLine) * $numPerLine))); - } - - echo str_repeat(' ', $padding)." $numProcessed / $numFiles ($percent%)".PHP_EOL; - - }//end printProgress() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractArraySniff.php b/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractArraySniff.php deleted file mode 100644 index 141b9a1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractArraySniff.php +++ /dev/null @@ -1,172 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Sniffs; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -abstract class AbstractArraySniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - final public function register() - { - return [ - T_ARRAY, - T_OPEN_SHORT_ARRAY, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_ARRAY) { - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'no'); - - $arrayStart = $tokens[$stackPtr]['parenthesis_opener']; - if (isset($tokens[$arrayStart]['parenthesis_closer']) === false) { - // Incomplete array. - return; - } - - $arrayEnd = $tokens[$arrayStart]['parenthesis_closer']; - } else { - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'yes'); - $arrayStart = $stackPtr; - $arrayEnd = $tokens[$stackPtr]['bracket_closer']; - } - - $lastContent = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($arrayEnd - 1), null, true); - if ($tokens[$lastContent]['code'] === T_COMMA) { - // Last array item ends with a comma. - $phpcsFile->recordMetric($stackPtr, 'Array end comma', 'yes'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Array end comma', 'no'); - } - - $indices = []; - - $current = $arrayStart; - while (($next = $phpcsFile->findNext(Tokens::$emptyTokens, ($current + 1), $arrayEnd, true)) !== false) { - $end = $this->getNext($phpcsFile, $next, $arrayEnd); - - if ($tokens[$end]['code'] === T_DOUBLE_ARROW) { - $indexEnd = $phpcsFile->findPrevious(T_WHITESPACE, ($end - 1), null, true); - $valueStart = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - - $indices[] = [ - 'index_start' => $next, - 'index_end' => $indexEnd, - 'arrow' => $end, - 'value_start' => $valueStart, - ]; - } else { - $valueStart = $next; - $indices[] = ['value_start' => $valueStart]; - } - - $current = $this->getNext($phpcsFile, $valueStart, $arrayEnd); - } - - if ($tokens[$arrayStart]['line'] === $tokens[$arrayEnd]['line']) { - $this->processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); - } else { - $this->processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); - } - - }//end process() - - - /** - * Find next separator in array - either: comma or double arrow. - * - * @param File $phpcsFile The current file being checked. - * @param int $ptr The position of current token. - * @param int $arrayEnd The token that ends the array definition. - * - * @return int - */ - private function getNext(File $phpcsFile, $ptr, $arrayEnd) - { - $tokens = $phpcsFile->getTokens(); - - while ($ptr < $arrayEnd) { - if (isset($tokens[$ptr]['scope_closer']) === true) { - $ptr = $tokens[$ptr]['scope_closer']; - } else if (isset($tokens[$ptr]['parenthesis_closer']) === true) { - $ptr = $tokens[$ptr]['parenthesis_closer']; - } else if (isset($tokens[$ptr]['bracket_closer']) === true) { - $ptr = $tokens[$ptr]['bracket_closer']; - } - - if ($tokens[$ptr]['code'] === T_COMMA - || $tokens[$ptr]['code'] === T_DOUBLE_ARROW - ) { - return $ptr; - } - - ++$ptr; - } - - return $ptr; - - }//end getNext() - - - /** - * Processes a single-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - abstract protected function processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); - - - /** - * Processes a multi-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - abstract protected function processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractPatternSniff.php b/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractPatternSniff.php deleted file mode 100644 index 66bc2f5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractPatternSniff.php +++ /dev/null @@ -1,936 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Sniffs; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHP_CodeSniffer\Tokenizers\PHP; -use PHP_CodeSniffer\Exceptions\RuntimeException; - -abstract class AbstractPatternSniff implements Sniff -{ - - /** - * If true, comments will be ignored if they are found in the code. - * - * @var boolean - */ - public $ignoreComments = false; - - /** - * The current file being checked. - * - * @var string - */ - protected $currFile = ''; - - /** - * The parsed patterns array. - * - * @var array - */ - private $parsedPatterns = []; - - /** - * Tokens that this sniff wishes to process outside of the patterns. - * - * @var int[] - * @see registerSupplementary() - * @see processSupplementary() - */ - private $supplementaryTokens = []; - - /** - * Positions in the stack where errors have occurred. - * - * @var array - */ - private $errorPos = []; - - - /** - * Constructs a AbstractPatternSniff. - * - * @param boolean $ignoreComments If true, comments will be ignored. - */ - public function __construct($ignoreComments=null) - { - // This is here for backwards compatibility. - if ($ignoreComments !== null) { - $this->ignoreComments = $ignoreComments; - } - - $this->supplementaryTokens = $this->registerSupplementary(); - - }//end __construct() - - - /** - * Registers the tokens to listen to. - * - * Classes extending AbstractPatternTest should implement the - * getPatterns() method to register the patterns they wish to test. - * - * @return int[] - * @see process() - */ - final public function register() - { - $listenTypes = []; - $patterns = $this->getPatterns(); - - foreach ($patterns as $pattern) { - $parsedPattern = $this->parse($pattern); - - // Find a token position in the pattern that we can use - // for a listener token. - $pos = $this->getListenerTokenPos($parsedPattern); - $tokenType = $parsedPattern[$pos]['token']; - $listenTypes[] = $tokenType; - - $patternArray = [ - 'listen_pos' => $pos, - 'pattern' => $parsedPattern, - 'pattern_code' => $pattern, - ]; - - if (isset($this->parsedPatterns[$tokenType]) === false) { - $this->parsedPatterns[$tokenType] = []; - } - - $this->parsedPatterns[$tokenType][] = $patternArray; - }//end foreach - - return array_unique(array_merge($listenTypes, $this->supplementaryTokens)); - - }//end register() - - - /** - * Returns the token types that the specified pattern is checking for. - * - * Returned array is in the format: - * - * array( - * T_WHITESPACE => 0, // 0 is the position where the T_WHITESPACE token - * // should occur in the pattern. - * ); - * - * - * @param array $pattern The parsed pattern to find the acquire the token - * types from. - * - * @return array - */ - private function getPatternTokenTypes($pattern) - { - $tokenTypes = []; - foreach ($pattern as $pos => $patternInfo) { - if ($patternInfo['type'] === 'token') { - if (isset($tokenTypes[$patternInfo['token']]) === false) { - $tokenTypes[$patternInfo['token']] = $pos; - } - } - } - - return $tokenTypes; - - }//end getPatternTokenTypes() - - - /** - * Returns the position in the pattern that this test should register as - * a listener for the pattern. - * - * @param array $pattern The pattern to acquire the listener for. - * - * @return int The position in the pattern that this test should register - * as the listener. - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If we could not determine a token to listen for. - */ - private function getListenerTokenPos($pattern) - { - $tokenTypes = $this->getPatternTokenTypes($pattern); - $tokenCodes = array_keys($tokenTypes); - $token = Tokens::getHighestWeightedToken($tokenCodes); - - // If we could not get a token. - if ($token === false) { - $error = 'Could not determine a token to listen for'; - throw new RuntimeException($error); - } - - return $tokenTypes[$token]; - - }//end getListenerTokenPos() - - - /** - * Processes the test. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack - * where the listening token type - * was found. - * - * @return void - * @see register() - */ - final public function process(File $phpcsFile, $stackPtr) - { - $file = $phpcsFile->getFilename(); - if ($this->currFile !== $file) { - // We have changed files, so clean up. - $this->errorPos = []; - $this->currFile = $file; - } - - $tokens = $phpcsFile->getTokens(); - - if (in_array($tokens[$stackPtr]['code'], $this->supplementaryTokens, true) === true) { - $this->processSupplementary($phpcsFile, $stackPtr); - } - - $type = $tokens[$stackPtr]['code']; - - // If the type is not set, then it must have been a token registered - // with registerSupplementary(). - if (isset($this->parsedPatterns[$type]) === false) { - return; - } - - $allErrors = []; - - // Loop over each pattern that is listening to the current token type - // that we are processing. - foreach ($this->parsedPatterns[$type] as $patternInfo) { - // If processPattern returns false, then the pattern that we are - // checking the code with must not be designed to check that code. - $errors = $this->processPattern($patternInfo, $phpcsFile, $stackPtr); - if ($errors === false) { - // The pattern didn't match. - continue; - } else if (empty($errors) === true) { - // The pattern matched, but there were no errors. - break; - } - - foreach ($errors as $stackPtr => $error) { - if (isset($this->errorPos[$stackPtr]) === false) { - $this->errorPos[$stackPtr] = true; - $allErrors[$stackPtr] = $error; - } - } - } - - foreach ($allErrors as $stackPtr => $error) { - $phpcsFile->addError($error, $stackPtr, 'Found'); - } - - }//end process() - - - /** - * Processes the pattern and verifies the code at $stackPtr. - * - * @param array $patternInfo Information about the pattern used - * for checking, which includes are - * parsed token representation of the - * pattern. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack where - * the listening token type was found. - * - * @return array - */ - protected function processPattern($patternInfo, File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $pattern = $patternInfo['pattern']; - $patternCode = $patternInfo['pattern_code']; - $errors = []; - $found = ''; - - $ignoreTokens = [T_WHITESPACE => T_WHITESPACE]; - if ($this->ignoreComments === true) { - $ignoreTokens += Tokens::$commentTokens; - } - - $origStackPtr = $stackPtr; - $hasError = false; - - if ($patternInfo['listen_pos'] > 0) { - $stackPtr--; - - for ($i = ($patternInfo['listen_pos'] - 1); $i >= 0; $i--) { - if ($pattern[$i]['type'] === 'token') { - if ($pattern[$i]['token'] === T_WHITESPACE) { - if ($tokens[$stackPtr]['code'] === T_WHITESPACE) { - $found = $tokens[$stackPtr]['content'].$found; - } - - // Only check the size of the whitespace if this is not - // the first token. We don't care about the size of - // leading whitespace, just that there is some. - if ($i !== 0) { - if ($tokens[$stackPtr]['content'] !== $pattern[$i]['value']) { - $hasError = true; - } - } - } else { - // Check to see if this important token is the same as the - // previous important token in the pattern. If it is not, - // then the pattern cannot be for this piece of code. - $prev = $phpcsFile->findPrevious( - $ignoreTokens, - $stackPtr, - null, - true - ); - - if ($prev === false - || $tokens[$prev]['code'] !== $pattern[$i]['token'] - ) { - return false; - } - - // If we skipped past some whitespace tokens, then add them - // to the found string. - $tokenContent = $phpcsFile->getTokensAsString( - ($prev + 1), - ($stackPtr - $prev - 1) - ); - - $found = $tokens[$prev]['content'].$tokenContent.$found; - - if (isset($pattern[($i - 1)]) === true - && $pattern[($i - 1)]['type'] === 'skip' - ) { - $stackPtr = $prev; - } else { - $stackPtr = ($prev - 1); - } - }//end if - } else if ($pattern[$i]['type'] === 'skip') { - // Skip to next piece of relevant code. - if ($pattern[$i]['to'] === 'parenthesis_closer') { - $to = 'parenthesis_opener'; - } else { - $to = 'scope_opener'; - } - - // Find the previous opener. - $next = $phpcsFile->findPrevious( - $ignoreTokens, - $stackPtr, - null, - true - ); - - if ($next === false || isset($tokens[$next][$to]) === false) { - // If there was not opener, then we must be - // using the wrong pattern. - return false; - } - - if ($to === 'parenthesis_opener') { - $found = '{'.$found; - } else { - $found = '('.$found; - } - - $found = '...'.$found; - - // Skip to the opening token. - $stackPtr = ($tokens[$next][$to] - 1); - } else if ($pattern[$i]['type'] === 'string') { - $found = 'abc'; - } else if ($pattern[$i]['type'] === 'newline') { - if ($this->ignoreComments === true - && isset(Tokens::$commentTokens[$tokens[$stackPtr]['code']]) === true - ) { - $startComment = $phpcsFile->findPrevious( - Tokens::$commentTokens, - ($stackPtr - 1), - null, - true - ); - - if ($tokens[$startComment]['line'] !== $tokens[($startComment + 1)]['line']) { - $startComment++; - } - - $tokenContent = $phpcsFile->getTokensAsString( - $startComment, - ($stackPtr - $startComment + 1) - ); - - $found = $tokenContent.$found; - $stackPtr = ($startComment - 1); - } - - if ($tokens[$stackPtr]['code'] === T_WHITESPACE) { - if ($tokens[$stackPtr]['content'] !== $phpcsFile->eolChar) { - $found = $tokens[$stackPtr]['content'].$found; - - // This may just be an indent that comes after a newline - // so check the token before to make sure. If it is a newline, we - // can ignore the error here. - if (($tokens[($stackPtr - 1)]['content'] !== $phpcsFile->eolChar) - && ($this->ignoreComments === true - && isset(Tokens::$commentTokens[$tokens[($stackPtr - 1)]['code']]) === false) - ) { - $hasError = true; - } else { - $stackPtr--; - } - } else { - $found = 'EOL'.$found; - } - } else { - $found = $tokens[$stackPtr]['content'].$found; - $hasError = true; - }//end if - - if ($hasError === false && $pattern[($i - 1)]['type'] !== 'newline') { - // Make sure they only have 1 newline. - $prev = $phpcsFile->findPrevious($ignoreTokens, ($stackPtr - 1), null, true); - if ($prev !== false && $tokens[$prev]['line'] !== $tokens[$stackPtr]['line']) { - $hasError = true; - } - } - }//end if - }//end for - }//end if - - $stackPtr = $origStackPtr; - $lastAddedStackPtr = null; - $patternLen = count($pattern); - - for ($i = $patternInfo['listen_pos']; $i < $patternLen; $i++) { - if (isset($tokens[$stackPtr]) === false) { - break; - } - - if ($pattern[$i]['type'] === 'token') { - if ($pattern[$i]['token'] === T_WHITESPACE) { - if ($this->ignoreComments === true) { - // If we are ignoring comments, check to see if this current - // token is a comment. If so skip it. - if (isset(Tokens::$commentTokens[$tokens[$stackPtr]['code']]) === true) { - continue; - } - - // If the next token is a comment, the we need to skip the - // current token as we should allow a space before a - // comment for readability. - if (isset($tokens[($stackPtr + 1)]) === true - && isset(Tokens::$commentTokens[$tokens[($stackPtr + 1)]['code']]) === true - ) { - continue; - } - } - - $tokenContent = ''; - if ($tokens[$stackPtr]['code'] === T_WHITESPACE) { - if (isset($pattern[($i + 1)]) === false) { - // This is the last token in the pattern, so just compare - // the next token of content. - $tokenContent = $tokens[$stackPtr]['content']; - } else { - // Get all the whitespace to the next token. - $next = $phpcsFile->findNext( - Tokens::$emptyTokens, - $stackPtr, - null, - true - ); - - $tokenContent = $phpcsFile->getTokensAsString( - $stackPtr, - ($next - $stackPtr) - ); - - $lastAddedStackPtr = $stackPtr; - $stackPtr = $next; - }//end if - - if ($stackPtr !== $lastAddedStackPtr) { - $found .= $tokenContent; - } - } else { - if ($stackPtr !== $lastAddedStackPtr) { - $found .= $tokens[$stackPtr]['content']; - $lastAddedStackPtr = $stackPtr; - } - }//end if - - if (isset($pattern[($i + 1)]) === true - && $pattern[($i + 1)]['type'] === 'skip' - ) { - // The next token is a skip token, so we just need to make - // sure the whitespace we found has *at least* the - // whitespace required. - if (strpos($tokenContent, $pattern[$i]['value']) !== 0) { - $hasError = true; - } - } else { - if ($tokenContent !== $pattern[$i]['value']) { - $hasError = true; - } - } - } else { - // Check to see if this important token is the same as the - // next important token in the pattern. If it is not, then - // the pattern cannot be for this piece of code. - $next = $phpcsFile->findNext( - $ignoreTokens, - $stackPtr, - null, - true - ); - - if ($next === false - || $tokens[$next]['code'] !== $pattern[$i]['token'] - ) { - // The next important token did not match the pattern. - return false; - } - - if ($lastAddedStackPtr !== null) { - if (($tokens[$next]['code'] === T_OPEN_CURLY_BRACKET - || $tokens[$next]['code'] === T_CLOSE_CURLY_BRACKET) - && isset($tokens[$next]['scope_condition']) === true - && $tokens[$next]['scope_condition'] > $lastAddedStackPtr - ) { - // This is a brace, but the owner of it is after the current - // token, which means it does not belong to any token in - // our pattern. This means the pattern is not for us. - return false; - } - - if (($tokens[$next]['code'] === T_OPEN_PARENTHESIS - || $tokens[$next]['code'] === T_CLOSE_PARENTHESIS) - && isset($tokens[$next]['parenthesis_owner']) === true - && $tokens[$next]['parenthesis_owner'] > $lastAddedStackPtr - ) { - // This is a bracket, but the owner of it is after the current - // token, which means it does not belong to any token in - // our pattern. This means the pattern is not for us. - return false; - } - }//end if - - // If we skipped past some whitespace tokens, then add them - // to the found string. - if (($next - $stackPtr) > 0) { - $hasComment = false; - for ($j = $stackPtr; $j < $next; $j++) { - $found .= $tokens[$j]['content']; - if (isset(Tokens::$commentTokens[$tokens[$j]['code']]) === true) { - $hasComment = true; - } - } - - // If we are not ignoring comments, this additional - // whitespace or comment is not allowed. If we are - // ignoring comments, there needs to be at least one - // comment for this to be allowed. - if ($this->ignoreComments === false - || ($this->ignoreComments === true - && $hasComment === false) - ) { - $hasError = true; - } - - // Even when ignoring comments, we are not allowed to include - // newlines without the pattern specifying them, so - // everything should be on the same line. - if ($tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - $hasError = true; - } - }//end if - - if ($next !== $lastAddedStackPtr) { - $found .= $tokens[$next]['content']; - $lastAddedStackPtr = $next; - } - - if (isset($pattern[($i + 1)]) === true - && $pattern[($i + 1)]['type'] === 'skip' - ) { - $stackPtr = $next; - } else { - $stackPtr = ($next + 1); - } - }//end if - } else if ($pattern[$i]['type'] === 'skip') { - if ($pattern[$i]['to'] === 'unknown') { - $next = $phpcsFile->findNext( - $pattern[($i + 1)]['token'], - $stackPtr - ); - - if ($next === false) { - // Couldn't find the next token, so we must - // be using the wrong pattern. - return false; - } - - $found .= '...'; - $stackPtr = $next; - } else { - // Find the previous opener. - $next = $phpcsFile->findPrevious( - Tokens::$blockOpeners, - $stackPtr - ); - - if ($next === false - || isset($tokens[$next][$pattern[$i]['to']]) === false - ) { - // If there was not opener, then we must - // be using the wrong pattern. - return false; - } - - $found .= '...'; - if ($pattern[$i]['to'] === 'parenthesis_closer') { - $found .= ')'; - } else { - $found .= '}'; - } - - // Skip to the closing token. - $stackPtr = ($tokens[$next][$pattern[$i]['to']] + 1); - }//end if - } else if ($pattern[$i]['type'] === 'string') { - if ($tokens[$stackPtr]['code'] !== T_STRING) { - $hasError = true; - } - - if ($stackPtr !== $lastAddedStackPtr) { - $found .= 'abc'; - $lastAddedStackPtr = $stackPtr; - } - - $stackPtr++; - } else if ($pattern[$i]['type'] === 'newline') { - // Find the next token that contains a newline character. - $newline = 0; - for ($j = $stackPtr; $j < $phpcsFile->numTokens; $j++) { - if (strpos($tokens[$j]['content'], $phpcsFile->eolChar) !== false) { - $newline = $j; - break; - } - } - - if ($newline === 0) { - // We didn't find a newline character in the rest of the file. - $next = ($phpcsFile->numTokens - 1); - $hasError = true; - } else { - if ($this->ignoreComments === false) { - // The newline character cannot be part of a comment. - if (isset(Tokens::$commentTokens[$tokens[$newline]['code']]) === true) { - $hasError = true; - } - } - - if ($newline === $stackPtr) { - $next = ($stackPtr + 1); - } else { - // Check that there were no significant tokens that we - // skipped over to find our newline character. - $next = $phpcsFile->findNext( - $ignoreTokens, - $stackPtr, - null, - true - ); - - if ($next < $newline) { - // We skipped a non-ignored token. - $hasError = true; - } else { - $next = ($newline + 1); - } - } - }//end if - - if ($stackPtr !== $lastAddedStackPtr) { - $found .= $phpcsFile->getTokensAsString( - $stackPtr, - ($next - $stackPtr) - ); - - $lastAddedStackPtr = ($next - 1); - } - - $stackPtr = $next; - }//end if - }//end for - - if ($hasError === true) { - $error = $this->prepareError($found, $patternCode); - $errors[$origStackPtr] = $error; - } - - return $errors; - - }//end processPattern() - - - /** - * Prepares an error for the specified patternCode. - * - * @param string $found The actual found string in the code. - * @param string $patternCode The expected pattern code. - * - * @return string The error message. - */ - protected function prepareError($found, $patternCode) - { - $found = str_replace("\r\n", '\n', $found); - $found = str_replace("\n", '\n', $found); - $found = str_replace("\r", '\n', $found); - $found = str_replace("\t", '\t', $found); - $found = str_replace('EOL', '\n', $found); - $expected = str_replace('EOL', '\n', $patternCode); - - $error = "Expected \"$expected\"; found \"$found\""; - - return $error; - - }//end prepareError() - - - /** - * Returns the patterns that should be checked. - * - * @return string[] - */ - abstract protected function getPatterns(); - - - /** - * Registers any supplementary tokens that this test might wish to process. - * - * A sniff may wish to register supplementary tests when it wishes to group - * an arbitrary validation that cannot be performed using a pattern, with - * other pattern tests. - * - * @return int[] - * @see processSupplementary() - */ - protected function registerSupplementary() - { - return []; - - }//end registerSupplementary() - - - /** - * Processes any tokens registered with registerSupplementary(). - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where to - * process the skip. - * @param int $stackPtr The position in the tokens stack to - * process. - * - * @return void - * @see registerSupplementary() - */ - protected function processSupplementary(File $phpcsFile, $stackPtr) - { - - }//end processSupplementary() - - - /** - * Parses a pattern string into an array of pattern steps. - * - * @param string $pattern The pattern to parse. - * - * @return array The parsed pattern array. - * @see createSkipPattern() - * @see createTokenPattern() - */ - private function parse($pattern) - { - $patterns = []; - $length = strlen($pattern); - $lastToken = 0; - $firstToken = 0; - - for ($i = 0; $i < $length; $i++) { - $specialPattern = false; - $isLastChar = ($i === ($length - 1)); - $oldFirstToken = $firstToken; - - if (substr($pattern, $i, 3) === '...') { - // It's a skip pattern. The skip pattern requires the - // content of the token in the "from" position and the token - // to skip to. - $specialPattern = $this->createSkipPattern($pattern, ($i - 1)); - $lastToken = ($i - $firstToken); - $firstToken = ($i + 3); - $i += 2; - - if ($specialPattern['to'] !== 'unknown') { - $firstToken++; - } - } else if (substr($pattern, $i, 3) === 'abc') { - $specialPattern = ['type' => 'string']; - $lastToken = ($i - $firstToken); - $firstToken = ($i + 3); - $i += 2; - } else if (substr($pattern, $i, 3) === 'EOL') { - $specialPattern = ['type' => 'newline']; - $lastToken = ($i - $firstToken); - $firstToken = ($i + 3); - $i += 2; - }//end if - - if ($specialPattern !== false || $isLastChar === true) { - // If we are at the end of the string, don't worry about a limit. - if ($isLastChar === true) { - // Get the string from the end of the last skip pattern, if any, - // to the end of the pattern string. - $str = substr($pattern, $oldFirstToken); - } else { - // Get the string from the end of the last special pattern, - // if any, to the start of this special pattern. - if ($lastToken === 0) { - // Note that if the last special token was zero characters ago, - // there will be nothing to process so we can skip this bit. - // This happens if you have something like: EOL... in your pattern. - $str = ''; - } else { - $str = substr($pattern, $oldFirstToken, $lastToken); - } - } - - if ($str !== '') { - $tokenPatterns = $this->createTokenPattern($str); - foreach ($tokenPatterns as $tokenPattern) { - $patterns[] = $tokenPattern; - } - } - - // Make sure we don't skip the last token. - if ($isLastChar === false && $i === ($length - 1)) { - $i--; - } - }//end if - - // Add the skip pattern *after* we have processed - // all the tokens from the end of the last skip pattern - // to the start of this skip pattern. - if ($specialPattern !== false) { - $patterns[] = $specialPattern; - } - }//end for - - return $patterns; - - }//end parse() - - - /** - * Creates a skip pattern. - * - * @param string $pattern The pattern being parsed. - * @param string $from The token content that the skip pattern starts from. - * - * @return array The pattern step. - * @see createTokenPattern() - * @see parse() - */ - private function createSkipPattern($pattern, $from) - { - $skip = ['type' => 'skip']; - - $nestedParenthesis = 0; - $nestedBraces = 0; - for ($start = $from; $start >= 0; $start--) { - switch ($pattern[$start]) { - case '(': - if ($nestedParenthesis === 0) { - $skip['to'] = 'parenthesis_closer'; - } - - $nestedParenthesis--; - break; - case '{': - if ($nestedBraces === 0) { - $skip['to'] = 'scope_closer'; - } - - $nestedBraces--; - break; - case '}': - $nestedBraces++; - break; - case ')': - $nestedParenthesis++; - break; - }//end switch - - if (isset($skip['to']) === true) { - break; - } - }//end for - - if (isset($skip['to']) === false) { - $skip['to'] = 'unknown'; - } - - return $skip; - - }//end createSkipPattern() - - - /** - * Creates a token pattern. - * - * @param string $str The tokens string that the pattern should match. - * - * @return array The pattern step. - * @see createSkipPattern() - * @see parse() - */ - private function createTokenPattern($str) - { - // Don't add a space after the closing php tag as it will add a new - // whitespace token. - $tokenizer = new PHP('', null); - - // Remove the getTokens(); - $tokens = array_slice($tokens, 1, (count($tokens) - 2)); - - $patterns = []; - foreach ($tokens as $patternInfo) { - $patterns[] = [ - 'type' => 'token', - 'token' => $patternInfo['code'], - 'value' => $patternInfo['content'], - ]; - } - - return $patterns; - - }//end createTokenPattern() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractScopeSniff.php b/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractScopeSniff.php deleted file mode 100644 index 70d8720..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractScopeSniff.php +++ /dev/null @@ -1,191 +0,0 @@ - - * class ClassScopeTest extends PHP_CodeSniffer_Standards_AbstractScopeSniff - * { - * public function __construct() - * { - * parent::__construct(array(T_CLASS), array(T_FUNCTION)); - * } - * - * protected function processTokenWithinScope(\PHP_CodeSniffer\Files\File $phpcsFile, $stackPtr, $currScope) - * { - * $className = $phpcsFile->getDeclarationName($currScope); - * echo 'encountered a method within class '.$className; - * } - * } - * - * - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Sniffs; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Exceptions\RuntimeException; - -abstract class AbstractScopeSniff implements Sniff -{ - - /** - * The token types that this test wishes to listen to within the scope. - * - * @var array - */ - private $tokens = []; - - /** - * The type of scope opener tokens that this test wishes to listen to. - * - * @var string - */ - private $scopeTokens = []; - - /** - * True if this test should fire on tokens outside of the scope. - * - * @var boolean - */ - private $listenOutside = false; - - - /** - * Constructs a new AbstractScopeTest. - * - * @param array $scopeTokens The type of scope the test wishes to listen to. - * @param array $tokens The tokens that the test wishes to listen to - * within the scope. - * @param boolean $listenOutside If true this test will also alert the - * extending class when a token is found outside - * the scope, by calling the - * processTokenOutsideScope method. - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified tokens arrays are empty - * or invalid. - */ - public function __construct( - array $scopeTokens, - array $tokens, - $listenOutside=false - ) { - if (empty($scopeTokens) === true) { - $error = 'The scope tokens list cannot be empty'; - throw new RuntimeException($error); - } - - if (empty($tokens) === true) { - $error = 'The tokens list cannot be empty'; - throw new RuntimeException($error); - } - - $invalidScopeTokens = array_intersect($scopeTokens, $tokens); - if (empty($invalidScopeTokens) === false) { - $invalid = implode(', ', $invalidScopeTokens); - $error = "Scope tokens [$invalid] can't be in the tokens array"; - throw new RuntimeException($error); - } - - $this->listenOutside = $listenOutside; - $this->scopeTokens = array_flip($scopeTokens); - $this->tokens = $tokens; - - }//end __construct() - - - /** - * The method that is called to register the tokens this test wishes to - * listen to. - * - * DO NOT OVERRIDE THIS METHOD. Use the constructor of this class to register - * for the desired tokens and scope. - * - * @return int[] - * @see __constructor() - */ - final public function register() - { - return $this->tokens; - - }//end register() - - - /** - * Processes the tokens that this test is listening for. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return ($phpcsFile->numTokens + 1) to skip - * the rest of the file. - * @see processTokenWithinScope() - */ - final public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $foundScope = false; - $skipTokens = []; - foreach ($tokens[$stackPtr]['conditions'] as $scope => $code) { - if (isset($this->scopeTokens[$code]) === true) { - $skipTokens[] = $this->processTokenWithinScope($phpcsFile, $stackPtr, $scope); - $foundScope = true; - } - } - - if ($this->listenOutside === true && $foundScope === false) { - $skipTokens[] = $this->processTokenOutsideScope($phpcsFile, $stackPtr); - } - - if (empty($skipTokens) === false) { - return min($skipTokens); - } - - return; - - }//end process() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * @param int $currScope The position in the tokens array that - * opened the scope that this test is - * listening for. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return ($phpcsFile->numTokens + 1) to skip - * the rest of the file. - */ - abstract protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope); - - - /** - * Processes a token that is found outside the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return (count($tokens) + 1) to skip - * the rest of the file. - */ - abstract protected function processTokenOutsideScope(File $phpcsFile, $stackPtr); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractVariableSniff.php b/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractVariableSniff.php deleted file mode 100644 index 5dc8ba5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractVariableSniff.php +++ /dev/null @@ -1,230 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Sniffs; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -abstract class AbstractVariableSniff extends AbstractScopeSniff -{ - - /** - * List of PHP Reserved variables. - * - * Used by various naming convention sniffs. - * - * @var array - */ - protected $phpReservedVars = [ - '_SERVER' => true, - '_GET' => true, - '_POST' => true, - '_REQUEST' => true, - '_SESSION' => true, - '_ENV' => true, - '_COOKIE' => true, - '_FILES' => true, - 'GLOBALS' => true, - 'http_response_header' => true, - 'HTTP_RAW_POST_DATA' => true, - 'php_errormsg' => true, - ]; - - - /** - * Constructs an AbstractVariableTest. - */ - public function __construct() - { - $scopes = Tokens::$ooScopeTokens; - - $listen = [ - T_VARIABLE, - T_DOUBLE_QUOTED_STRING, - T_HEREDOC, - ]; - - parent::__construct($scopes, $listen, true); - - }//end __construct() - - - /** - * Processes the token in the specified PHP_CodeSniffer\Files\File. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this - * token was found. - * @param int $stackPtr The position where the token was found. - * @param int $currScope The current scope opener token. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return ($phpcsFile->numTokens + 1) to skip - * the rest of the file. - */ - final protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_DOUBLE_QUOTED_STRING - || $tokens[$stackPtr]['code'] === T_HEREDOC - ) { - // Check to see if this string has a variable in it. - $pattern = '|(?processVariableInString($phpcsFile, $stackPtr); - } - - return; - } - - // If this token is nested inside a function at a deeper - // level than the current OO scope that was found, it's a normal - // variable and not a member var. - $conditions = array_reverse($tokens[$stackPtr]['conditions'], true); - $inFunction = false; - foreach ($conditions as $scope => $code) { - if (isset(Tokens::$ooScopeTokens[$code]) === true) { - break; - } - - if ($code === T_FUNCTION || $code === T_CLOSURE) { - $inFunction = true; - } - } - - if ($scope !== $currScope) { - // We found a closer scope to this token, so ignore - // this particular time through the sniff. We will process - // this token when this closer scope is found to avoid - // duplicate checks. - return; - } - - // Just make sure this isn't a variable in a function declaration. - if ($inFunction === false && isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - foreach ($tokens[$stackPtr]['nested_parenthesis'] as $opener => $closer) { - if (isset($tokens[$opener]['parenthesis_owner']) === false) { - // Check if this is a USE statement for a closure. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($opener - 1), null, true); - if ($tokens[$prev]['code'] === T_USE) { - $inFunction = true; - break; - } - - continue; - } - - $owner = $tokens[$opener]['parenthesis_owner']; - if ($tokens[$owner]['code'] === T_FUNCTION - || $tokens[$owner]['code'] === T_CLOSURE - ) { - $inFunction = true; - break; - } - } - }//end if - - if ($inFunction === true) { - return $this->processVariable($phpcsFile, $stackPtr); - } else { - return $this->processMemberVar($phpcsFile, $stackPtr); - } - - }//end processTokenWithinScope() - - - /** - * Processes the token outside the scope in the file. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this - * token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return ($phpcsFile->numTokens + 1) to skip - * the rest of the file. - */ - final protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - // These variables are not member vars. - if ($tokens[$stackPtr]['code'] === T_VARIABLE) { - return $this->processVariable($phpcsFile, $stackPtr); - } else if ($tokens[$stackPtr]['code'] === T_DOUBLE_QUOTED_STRING - || $tokens[$stackPtr]['code'] === T_HEREDOC - ) { - // Check to see if this string has a variable in it. - $pattern = '|(?processVariableInString($phpcsFile, $stackPtr); - } - } - - }//end processTokenOutsideScope() - - - /** - * Called to process class member vars. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this - * token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return ($phpcsFile->numTokens + 1) to skip - * the rest of the file. - */ - abstract protected function processMemberVar(File $phpcsFile, $stackPtr); - - - /** - * Called to process normal member vars. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this - * token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return ($phpcsFile->numTokens + 1) to skip - * the rest of the file. - */ - abstract protected function processVariable(File $phpcsFile, $stackPtr); - - - /** - * Called to process variables found in double quoted strings or heredocs. - * - * Note that there may be more than one variable in the string, which will - * result only in one call for the string or one call per line for heredocs. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this - * token was found. - * @param int $stackPtr The position where the double quoted - * string was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return ($phpcsFile->numTokens + 1) to skip - * the rest of the file. - */ - abstract protected function processVariableInString(File $phpcsFile, $stackPtr); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Sniffs/Sniff.php b/vendor/squizlabs/php_codesniffer/src/Sniffs/Sniff.php deleted file mode 100644 index c9d7dae..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Sniffs/Sniff.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Sniffs; - -use PHP_CodeSniffer\Files\File; - -interface Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * An example return value for a sniff that wants to listen for whitespace - * and any comments would be: - * - * - * return array( - * T_WHITESPACE, - * T_DOC_COMMENT, - * T_COMMENT, - * ); - * - * - * @return mixed[] - * @see Tokens.php - */ - public function register(); - - - /** - * Called when one of the token types that this sniff is listening for - * is found. - * - * The stackPtr variable indicates where in the stack the token was found. - * A sniff can acquire information this token, along with all the other - * tokens within the stack by first acquiring the token stack: - * - * - * $tokens = $phpcsFile->getTokens(); - * echo 'Encountered a '.$tokens[$stackPtr]['type'].' token'; - * echo 'token information: '; - * print_r($tokens[$stackPtr]); - * - * - * If the sniff discovers an anomaly in the code, they can raise an error - * by calling addError() on the \PHP_CodeSniffer\Files\File object, specifying an error - * message and the position of the offending token: - * - * - * $phpcsFile->addError('Encountered an error', $stackPtr); - * - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $stackPtr The position in the PHP_CodeSniffer - * file's token stack where the token - * was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return (count($tokens) + 1) to skip - * the rest of the file. - */ - public function process(File $phpcsFile, $stackPtr); - - -}//end interface diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowLongArraySyntaxStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowLongArraySyntaxStandard.xml deleted file mode 100644 index 21b0d27..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowLongArraySyntaxStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - [ - 'foo' => 'bar', -]; - ]]> - - - array( - 'foo' => 'bar', -); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowShortArraySyntaxStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowShortArraySyntaxStandard.xml deleted file mode 100644 index f24767c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowShortArraySyntaxStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - array( - 'foo' => 'bar', -); - ]]> - - - [ - 'foo' => 'bar', -]; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml deleted file mode 100644 index 4b0ec96..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - Foo -{ -} - ]]> - - - Foo -{ -} - -class Foo -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/OpeningBraceSameLineStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/OpeningBraceSameLineStandard.xml deleted file mode 100644 index 6226a3f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/OpeningBraceSameLineStandard.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - { -} - ]]> - - - { -} - ]]> - - - // Start of class. -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/AssignmentInConditionStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/AssignmentInConditionStandard.xml deleted file mode 100644 index 9961ea0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/AssignmentInConditionStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - $test === 'abc') { - // Code. -} - ]]> - - - $test = 'abc') { - // Code. -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyStatementStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyStatementStandard.xml deleted file mode 100644 index c400d75..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyStatementStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - // do nothing -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopShouldBeWhileLoopStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopShouldBeWhileLoopStandard.xml deleted file mode 100644 index 06f0b7a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopShouldBeWhileLoopStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - $i = 0; $i < 10; $i++) { - echo "{$i}\n"; -} - ]]> - - - ;$test;) { - $test = doSomething(); -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopWithTestFunctionCallStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopWithTestFunctionCallStandard.xml deleted file mode 100644 index f40d94b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopWithTestFunctionCallStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - $end = count($foo); -for ($i = 0; $i < $end; $i++) { - echo $foo[$i]."\n"; -} - ]]> - - - count($foo); $i++) { - echo $foo[$i]."\n"; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/JumbledIncrementerStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/JumbledIncrementerStandard.xml deleted file mode 100644 index 50f0782..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/JumbledIncrementerStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - $i++) { - for ($j = 0; $j < 10; $j++) { - } -} - ]]> - - - $i++) { - for ($j = 0; $j < 10; $i++) { - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnconditionalIfStatementStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnconditionalIfStatementStandard.xml deleted file mode 100644 index b2eaabe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnconditionalIfStatementStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - $test) { - $var = 1; -} - ]]> - - - true) { - $var = 1; -} - ]]> - - - - - $test) { - $var = 1; -} - ]]> - - - false) { - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnnecessaryFinalModifierStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnnecessaryFinalModifierStandard.xml deleted file mode 100644 index 8936740..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnnecessaryFinalModifierStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - final function bar() - { - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnusedFunctionParameterStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnusedFunctionParameterStandard.xml deleted file mode 100644 index 181dff4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnusedFunctionParameterStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - $a + $b + $c; -} - ]]> - - - $a + $b; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UselessOverridingMethodStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UselessOverridingMethodStandard.xml deleted file mode 100644 index ba8bd7e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UselessOverridingMethodStandard.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - $this->doSomethingElse(); - } -} - ]]> - - - parent::bar(); - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/FixmeStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/FixmeStandard.xml deleted file mode 100644 index 174c6b0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/FixmeStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - Handle strange case -if ($test) { - $var = 1; -} - ]]> - - - FIXME: This needs to be fixed! -if ($test) { - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/TodoStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/TodoStandard.xml deleted file mode 100644 index c9c4fc0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/TodoStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - Handle strange case -if ($test) { - $var = 1; -} - ]]> - - - TODO: This needs to be fixed! -if ($test) { - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/DisallowYodaConditionsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/DisallowYodaConditionsStandard.xml deleted file mode 100644 index 570e419..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/DisallowYodaConditionsStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - { - $var = 1; -} - ]]> - - - { - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/InlineControlStructureStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/InlineControlStructureStandard.xml deleted file mode 100644 index 06ae14b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/InlineControlStructureStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - { - $var = 1; -} - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/CSSLintStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/CSSLintStandard.xml deleted file mode 100644 index b57a970..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/CSSLintStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - %; } - ]]> - - - %; } - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/ClosureLinterStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/ClosureLinterStandard.xml deleted file mode 100644 index 9df9aec..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/ClosureLinterStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - ]; - ]]> - - - ,]; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/JSHintStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/JSHintStandard.xml deleted file mode 100644 index 7525e9e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/JSHintStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - var foo = 5; - ]]> - - - foo = 5; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ByteOrderMarkStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ByteOrderMarkStandard.xml deleted file mode 100644 index 88591f9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ByteOrderMarkStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNewlineStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNewlineStandard.xml deleted file mode 100644 index aa757ed..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNewlineStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNoNewlineStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNoNewlineStandard.xml deleted file mode 100644 index 227d562..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNoNewlineStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ExecutableFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ExecutableFileStandard.xml deleted file mode 100644 index 6114f24..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ExecutableFileStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/InlineHTMLStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/InlineHTMLStandard.xml deleted file mode 100644 index 3fbf502..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/InlineHTMLStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - some string here - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineEndingsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineEndingsStandard.xml deleted file mode 100644 index 4554d0f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineEndingsStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineLengthStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineLengthStandard.xml deleted file mode 100644 index 31342e3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineLengthStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LowercasedFilenameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LowercasedFilenameStandard.xml deleted file mode 100644 index a1be34c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LowercasedFilenameStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneClassPerFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneClassPerFileStandard.xml deleted file mode 100644 index 7b58576..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneClassPerFileStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - class Foo -{ -} - ]]> - - - class Foo -{ -} - -class Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneInterfacePerFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneInterfacePerFileStandard.xml deleted file mode 100644 index de97531..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneInterfacePerFileStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - interface Foo -{ -} - ]]> - - - interface Foo -{ -} - -interface Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneObjectStructurePerFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneObjectStructurePerFileStandard.xml deleted file mode 100644 index 4d957e7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneObjectStructurePerFileStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - trait Foo -{ -} - ]]> - - - trait Foo -{ -} - -class Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneTraitPerFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneTraitPerFileStandard.xml deleted file mode 100644 index 58a6482..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneTraitPerFileStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - trait Foo -{ -} - ]]> - - - trait Foo -{ -} - -trait Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/DisallowMultipleStatementsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/DisallowMultipleStatementsStandard.xml deleted file mode 100644 index f0d4490..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/DisallowMultipleStatementsStandard.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/MultipleStatementAlignmentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/MultipleStatementAlignmentStandard.xml deleted file mode 100644 index 4c33d76..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/MultipleStatementAlignmentStandard.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - = (1 + 2); -$veryLongVarName = 'string'; -$var = foo($bar, $baz); - ]]> - - - = (1 + 2); -$veryLongVarName = 'string'; -$var = foo($bar, $baz); - ]]> - - - - - - - - += 1; -$veryLongVarName = 1; - ]]> - - - += 1; -$veryLongVarName = 1; - ]]> - - - - - = 1; -$veryLongVarName -= 1; - ]]> - - - = 1; -$veryLongVarName -= 1; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/NoSpaceAfterCastStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/NoSpaceAfterCastStandard.xml deleted file mode 100644 index 042e4f8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/NoSpaceAfterCastStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - 1; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterCastStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterCastStandard.xml deleted file mode 100644 index 75eba77..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterCastStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - 1; - ]]> - - - 1; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterNotStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterNotStandard.xml deleted file mode 100644 index dd3e773..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterNotStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - $someVar || ! $x instanceOf stdClass) {}; - ]]> - - - $someVar || !$x instanceOf stdClass) {}; - ]]> - - - $someVar || ! - $x instanceOf stdClass) {}; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/CallTimePassByReferenceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/CallTimePassByReferenceStandard.xml deleted file mode 100644 index 738998d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/CallTimePassByReferenceStandard.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - &$bar) -{ - $bar++; -} - -$baz = 1; -foo($baz); - ]]> - - - &$baz); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/FunctionCallArgumentSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/FunctionCallArgumentSpacingStandard.xml deleted file mode 100644 index 9809844..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/FunctionCallArgumentSpacingStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - $baz) -{ -} - ]]> - - - $baz) -{ -} - ]]> - - - - - = true) -{ -} - ]]> - - - =true) -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceBsdAllmanStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceBsdAllmanStandard.xml deleted file mode 100644 index 414dc28..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceBsdAllmanStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - { - ... -} - ]]> - - - { - ... -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceKernighanRitchieStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceKernighanRitchieStandard.xml deleted file mode 100644 index 84c2bdd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceKernighanRitchieStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - { - ... -} - ]]> - - - { - ... -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/CyclomaticComplexityStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/CyclomaticComplexityStandard.xml deleted file mode 100644 index a928e7d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/CyclomaticComplexityStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/NestingLevelStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/NestingLevelStandard.xml deleted file mode 100644 index f66cd92..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/NestingLevelStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/CamelCapsFunctionNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/CamelCapsFunctionNameStandard.xml deleted file mode 100644 index f5345b7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/CamelCapsFunctionNameStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - doSomething() -{ -} - ]]> - - - do_something() -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/ConstructorNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/ConstructorNameStandard.xml deleted file mode 100644 index 9dfc175..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/ConstructorNameStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - __construct() - { - } -} - ]]> - - - Foo() - { - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/UpperCaseConstantNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/UpperCaseConstantNameStandard.xml deleted file mode 100644 index 6ef61b9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/UpperCaseConstantNameStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - FOO_CONSTANT', 'foo'); - -class FooClass -{ - const FOO_CONSTANT = 'foo'; -} - ]]> - - - Foo_Constant', 'foo'); - -class FooClass -{ - const foo_constant = 'foo'; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/BacktickOperatorStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/BacktickOperatorStandard.xml deleted file mode 100644 index 4ebd677..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/BacktickOperatorStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/CharacterBeforePHPOpeningTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/CharacterBeforePHPOpeningTagStandard.xml deleted file mode 100644 index df5a0eb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/CharacterBeforePHPOpeningTagStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - Beginning content - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ClosingPHPTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ClosingPHPTagStandard.xml deleted file mode 100644 index 09afb2d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ClosingPHPTagStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - -echo 'Foo'; -?> - ]]> - - - -echo 'Foo'; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DeprecatedFunctionsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DeprecatedFunctionsStandard.xml deleted file mode 100644 index 33b803a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DeprecatedFunctionsStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - explode('a', $bar); - ]]> - - - split('a', $bar); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowAlternativePHPTagsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowAlternativePHPTagsStandard.xml deleted file mode 100644 index bdfd5dc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowAlternativePHPTagsStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - to delimit PHP code, do not use the ASP <% %> style tags nor the tags. This is the most portable way to include PHP code on differing operating systems and setups. - ]]> - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowRequestSuperglobalStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowRequestSuperglobalStandard.xml deleted file mode 100644 index f947694..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowRequestSuperglobalStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowShortOpenTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowShortOpenTagStandard.xml deleted file mode 100644 index 8086ea2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowShortOpenTagStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - to delimit PHP code, not the shorthand. This is the most portable way to include PHP code on differing operating systems and setups. - ]]> - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DiscourageGotoStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DiscourageGotoStandard.xml deleted file mode 100644 index 83bceef..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DiscourageGotoStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ForbiddenFunctionsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ForbiddenFunctionsStandard.xml deleted file mode 100644 index c0f18b5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ForbiddenFunctionsStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - count($bar); - ]]> - - - sizeof($bar); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseConstantStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseConstantStandard.xml deleted file mode 100644 index 7dc30c1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseConstantStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - true, false and null constants must always be lowercase. - ]]> - - - - false || $var === null) { - $var = true; -} - ]]> - - - FALSE || $var === NULL) { - $var = TRUE; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseKeywordStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseKeywordStandard.xml deleted file mode 100644 index 965742d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseKeywordStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - array(); - ]]> - - - Array(); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseTypeStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseTypeStandard.xml deleted file mode 100644 index f38df3a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseTypeStandard.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - Int $foo) : STRING { -} - ]]> - - - - - - - - - - - (BOOL) $isValid; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/NoSilencedErrorsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/NoSilencedErrorsStandard.xml deleted file mode 100644 index df69887..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/NoSilencedErrorsStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - isset($foo) && $foo) { - echo "Hello\n"; -} - ]]> - - - @$foo) { - echo "Hello\n"; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SAPIUsageStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SAPIUsageStandard.xml deleted file mode 100644 index e74005a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SAPIUsageStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - PHP_SAPI === 'cli') { - echo "Hello, CLI user."; -} - ]]> - - - php_sapi_name() === 'cli') { - echo "Hello, CLI user."; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/UpperCaseConstantStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/UpperCaseConstantStandard.xml deleted file mode 100644 index 1f337f7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/UpperCaseConstantStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - true, false and null constants must always be uppercase. - ]]> - - - - FALSE || $var === NULL) { - $var = TRUE; -} - ]]> - - - false || $var === null) { - $var = true; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryStringConcatStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryStringConcatStandard.xml deleted file mode 100644 index a4c9887..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryStringConcatStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/VersionControl/SubversionPropertiesStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/VersionControl/SubversionPropertiesStandard.xml deleted file mode 100644 index f4f3e19..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/VersionControl/SubversionPropertiesStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ArbitraryParenthesesSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ArbitraryParenthesesSpacingStandard.xml deleted file mode 100644 index 30e0def..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ArbitraryParenthesesSpacingStandard.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowSpaceIndentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowSpaceIndentStandard.xml deleted file mode 100644 index 2e399b3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowSpaceIndentStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowTabIndentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowTabIndentStandard.xml deleted file mode 100644 index 7013ffd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowTabIndentStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ScopeIndentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ScopeIndentStandard.xml deleted file mode 100644 index bdd36d4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ScopeIndentStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - $var = 1; -} - ]]> - - - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/SpreadOperatorSpacingAfterStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/SpreadOperatorSpacingAfterStandard.xml deleted file mode 100644 index d33b605..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/SpreadOperatorSpacingAfterStandard.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - &...$spread) { - bar(...$spread); - - bar( - [...$foo], - ...array_values($keyedArray) - ); -} - ]]> - - - ... $spread) { - bar(... - $spread - ); - - bar( - [... $foo ],.../*comment*/array_values($keyedArray) - ); -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/ArrayIndentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/ArrayIndentSniff.php deleted file mode 100644 index cffea80..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/ArrayIndentSniff.php +++ /dev/null @@ -1,143 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays; - -use PHP_CodeSniffer\Sniffs\AbstractArraySniff; -use PHP_CodeSniffer\Util\Tokens; - -class ArrayIndentSniff extends AbstractArraySniff -{ - - /** - * The number of spaces each array key should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Processes a single-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - public function processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices) - { - - }//end processSingleLineArray() - - - /** - * Processes a multi-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - public function processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices) - { - $tokens = $phpcsFile->getTokens(); - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - $expectedIndent = ($tokens[$first]['column'] - 1 + $this->indent); - - foreach ($indices as $index) { - if (isset($index['index_start']) === true) { - $start = $index['index_start']; - } else { - $start = $index['value_start']; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($start - 1), null, true); - if ($tokens[$prev]['line'] === $tokens[$start]['line']) { - // This index isn't the only content on the line - // so we can't check indent rules. - continue; - } - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $start, true); - - $foundIndent = ($tokens[$first]['column'] - 1); - if ($foundIndent === $expectedIndent) { - continue; - } - - $error = 'Array key not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $first, 'KeyIncorrect', $data); - if ($fix === false) { - continue; - } - - $padding = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($first, $padding); - } else { - $phpcsFile->fixer->replaceToken(($first - 1), $padding); - } - }//end foreach - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($arrayEnd - 1), null, true); - if ($tokens[$prev]['line'] === $tokens[$arrayEnd]['line']) { - $error = 'Closing brace of array declaration must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $arrayEnd, 'CloseBraceNotNewLine'); - if ($fix === true) { - $padding = $phpcsFile->eolChar.str_repeat(' ', $expectedIndent); - $phpcsFile->fixer->addContentBefore($arrayEnd, $padding); - } - - return; - } - - // The close brace must be indented one stop less. - $expectedIndent -= $this->indent; - $foundIndent = ($tokens[$arrayEnd]['column'] - 1); - if ($foundIndent === $expectedIndent) { - return; - } - - $error = 'Array close brace not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $arrayEnd, 'CloseBraceIncorrect', $data); - if ($fix === false) { - return; - } - - $padding = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($arrayEnd, $padding); - } else { - $phpcsFile->fixer->replaceToken(($arrayEnd - 1), $padding); - } - - }//end processMultiLineArray() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php deleted file mode 100644 index bf7f3ed..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php +++ /dev/null @@ -1,78 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowLongArraySyntaxSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - return [T_ARRAY]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'no'); - - $error = 'Short array syntax must be used to define arrays'; - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - ) { - // Live coding/parse error, just show the error, don't try and fix it. - $phpcsFile->addError($error, $stackPtr, 'Found'); - return; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Found'); - - if ($fix === true) { - $opener = $tokens[$stackPtr]['parenthesis_opener']; - $closer = $tokens[$stackPtr]['parenthesis_closer']; - - $phpcsFile->fixer->beginChangeset(); - - if ($opener === null) { - $phpcsFile->fixer->replaceToken($stackPtr, '[]'); - } else { - $phpcsFile->fixer->replaceToken($stackPtr, ''); - $phpcsFile->fixer->replaceToken($opener, '['); - $phpcsFile->fixer->replaceToken($closer, ']'); - } - - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php deleted file mode 100644 index 2ba42d6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowShortArraySyntaxSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_SHORT_ARRAY]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'yes'); - - $error = 'Short array syntax is not allowed'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Found'); - - if ($fix === true) { - $tokens = $phpcsFile->getTokens(); - $opener = $tokens[$stackPtr]['bracket_opener']; - $closer = $tokens[$stackPtr]['bracket_closer']; - - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($opener, 'array('); - $phpcsFile->fixer->replaceToken($closer, ')'); - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php deleted file mode 100644 index 8374bfd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php +++ /dev/null @@ -1,117 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DuplicateClassNameSniff implements Sniff -{ - - /** - * List of classes that have been found during checking. - * - * @var array - */ - protected $foundClasses = []; - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $namespace = ''; - $findTokens = [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_NAMESPACE, - T_CLOSE_TAG, - ]; - - $stackPtr = $phpcsFile->findNext($findTokens, ($stackPtr + 1)); - while ($stackPtr !== false) { - if ($tokens[$stackPtr]['code'] === T_CLOSE_TAG) { - // We can stop here. The sniff will continue from the next open - // tag when PHPCS reaches that token, if there is one. - return; - } - - // Keep track of what namespace we are in. - if ($tokens[$stackPtr]['code'] === T_NAMESPACE) { - $nsEnd = $phpcsFile->findNext( - [ - T_NS_SEPARATOR, - T_STRING, - T_WHITESPACE, - ], - ($stackPtr + 1), - null, - true - ); - - $namespace = trim($phpcsFile->getTokensAsString(($stackPtr + 1), ($nsEnd - $stackPtr - 1))); - $stackPtr = $nsEnd; - } else { - $nameToken = $phpcsFile->findNext(T_STRING, $stackPtr); - $name = $tokens[$nameToken]['content']; - if ($namespace !== '') { - $name = $namespace.'\\'.$name; - } - - $compareName = strtolower($name); - if (isset($this->foundClasses[$compareName]) === true) { - $type = strtolower($tokens[$stackPtr]['content']); - $file = $this->foundClasses[$compareName]['file']; - $line = $this->foundClasses[$compareName]['line']; - $error = 'Duplicate %s name "%s" found; first defined in %s on line %s'; - $data = [ - $type, - $name, - $file, - $line, - ]; - $phpcsFile->addWarning($error, $stackPtr, 'Found', $data); - } else { - $this->foundClasses[$compareName] = [ - 'file' => $phpcsFile->getFilename(), - 'line' => $tokens[$stackPtr]['line'], - ]; - } - }//end if - - $stackPtr = $phpcsFile->findNext($findTokens, ($stackPtr + 1)); - }//end while - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/OpeningBraceSameLineSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/OpeningBraceSameLineSniff.php deleted file mode 100644 index fb92d82..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/OpeningBraceSameLineSniff.php +++ /dev/null @@ -1,123 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OpeningBraceSameLineSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $scopeIdentifier = $phpcsFile->findNext(T_STRING, ($stackPtr + 1)); - $errorData = [strtolower($tokens[$stackPtr]['content']).' '.$tokens[$scopeIdentifier]['content']]; - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - $error = 'Possible parse error: %s missing opening or closing brace'; - $phpcsFile->addWarning($error, $stackPtr, 'MissingBrace', $errorData); - return; - } - - $openingBrace = $tokens[$stackPtr]['scope_opener']; - - // Is the brace on the same line as the class/interface/trait declaration ? - $lastClassLineToken = $phpcsFile->findPrevious(T_WHITESPACE, ($openingBrace - 1), $stackPtr, true); - $lastClassLine = $tokens[$lastClassLineToken]['line']; - $braceLine = $tokens[$openingBrace]['line']; - $lineDifference = ($braceLine - $lastClassLine); - - if ($lineDifference > 0) { - $phpcsFile->recordMetric($stackPtr, 'Class opening brace placement', 'new line'); - $error = 'Opening brace should be on the same line as the declaration for %s'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'BraceOnNewLine', $errorData); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($lastClassLineToken, ' {'); - $phpcsFile->fixer->replaceToken($openingBrace, ''); - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Class opening brace placement', 'same line'); - } - - // Is the opening brace the last thing on the line ? - $next = $phpcsFile->findNext(T_WHITESPACE, ($openingBrace + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$openingBrace]['line']) { - if ($next === $tokens[$stackPtr]['scope_closer']) { - // Ignore empty classes. - return; - } - - $error = 'Opening brace must be the last content on the line'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'ContentAfterBrace'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($openingBrace); - } - } - - // Only continue checking if the opening brace looks good. - if ($lineDifference > 0) { - return; - } - - // Is there precisely one space before the opening brace ? - if ($tokens[($openingBrace - 1)]['code'] !== T_WHITESPACE) { - $length = 0; - } else if ($tokens[($openingBrace - 1)]['content'] === "\t") { - $length = '\t'; - } else { - $length = $tokens[($openingBrace - 1)]['length']; - } - - if ($length !== 1) { - $error = 'Expected 1 space before opening brace; found %s'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'SpaceBeforeBrace', $data); - if ($fix === true) { - if ($length === 0 || $length === '\t') { - $phpcsFile->fixer->addContentBefore($openingBrace, ' '); - } else { - $phpcsFile->fixer->replaceToken(($openingBrace - 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/AssignmentInConditionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/AssignmentInConditionSniff.php deleted file mode 100644 index 63e8319..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/AssignmentInConditionSniff.php +++ /dev/null @@ -1,170 +0,0 @@ - - * @copyright 2017 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class AssignmentInConditionSniff implements Sniff -{ - - /** - * Assignment tokens to trigger on. - * - * Set in the register() method. - * - * @var array - */ - protected $assignmentTokens = []; - - /** - * The tokens that indicate the start of a condition. - * - * @var array - */ - protected $conditionStartTokens = []; - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - $this->assignmentTokens = Tokens::$assignmentTokens; - unset($this->assignmentTokens[T_DOUBLE_ARROW]); - - $starters = Tokens::$booleanOperators; - $starters[T_SEMICOLON] = T_SEMICOLON; - $starters[T_OPEN_PARENTHESIS] = T_OPEN_PARENTHESIS; - - $this->conditionStartTokens = $starters; - - return [ - T_IF, - T_ELSEIF, - T_FOR, - T_SWITCH, - T_CASE, - T_WHILE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Find the condition opener/closer. - if ($token['code'] === T_FOR) { - if (isset($token['parenthesis_opener'], $token['parenthesis_closer']) === false) { - return; - } - - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($token['parenthesis_opener'] + 1), ($token['parenthesis_closer'])); - if ($semicolon === false) { - return; - } - - $opener = $semicolon; - - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($opener + 1), ($token['parenthesis_closer'])); - if ($semicolon === false) { - return; - } - - $closer = $semicolon; - unset($semicolon); - } else if ($token['code'] === T_CASE) { - if (isset($token['scope_opener']) === false) { - return; - } - - $opener = $stackPtr; - $closer = $token['scope_opener']; - } else { - if (isset($token['parenthesis_opener'], $token['parenthesis_closer']) === false) { - return; - } - - $opener = $token['parenthesis_opener']; - $closer = $token['parenthesis_closer']; - }//end if - - $startPos = $opener; - - do { - $hasAssignment = $phpcsFile->findNext($this->assignmentTokens, ($startPos + 1), $closer); - if ($hasAssignment === false) { - return; - } - - // Examine whether the left side is a variable. - $hasVariable = false; - $conditionStart = $startPos; - $altConditionStart = $phpcsFile->findPrevious($this->conditionStartTokens, ($hasAssignment - 1), $startPos); - if ($altConditionStart !== false) { - $conditionStart = $altConditionStart; - } - - for ($i = $hasAssignment; $i > $conditionStart; $i--) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - // If this is a variable or array, we've seen all we need to see. - if ($tokens[$i]['code'] === T_VARIABLE || $tokens[$i]['code'] === T_CLOSE_SQUARE_BRACKET) { - $hasVariable = true; - break; - } - - // If this is a function call or something, we are OK. - if ($tokens[$i]['code'] === T_CLOSE_PARENTHESIS) { - break; - } - } - - if ($hasVariable === true) { - $errorCode = 'Found'; - if ($token['code'] === T_WHILE) { - $errorCode = 'FoundInWhileCondition'; - } - - $phpcsFile->addWarning( - 'Variable assignment found within a condition. Did you mean to do a comparison ?', - $hasAssignment, - $errorCode - ); - } - - $startPos = $hasAssignment; - } while ($startPos < $closer); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyPHPStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyPHPStatementSniff.php deleted file mode 100644 index a37d6cc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyPHPStatementSniff.php +++ /dev/null @@ -1,162 +0,0 @@ - - * @copyright 2017 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EmptyPHPStatementSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return int[] - */ - public function register() - { - return [ - T_SEMICOLON, - T_CLOSE_TAG, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - switch ($tokens[$stackPtr]['type']) { - // Detect `something();;`. - case 'T_SEMICOLON': - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - if ($prevNonEmpty === false) { - return; - } - - if ($tokens[$prevNonEmpty]['code'] !== T_SEMICOLON - && $tokens[$prevNonEmpty]['code'] !== T_OPEN_TAG - && $tokens[$prevNonEmpty]['code'] !== T_OPEN_TAG_WITH_ECHO - ) { - if (isset($tokens[$prevNonEmpty]['scope_condition']) === false) { - return; - } - - if ($tokens[$prevNonEmpty]['scope_opener'] !== $prevNonEmpty - && $tokens[$prevNonEmpty]['code'] !== T_CLOSE_CURLY_BRACKET - ) { - return; - } - - $scopeOwner = $tokens[$tokens[$prevNonEmpty]['scope_condition']]['code']; - if ($scopeOwner === T_CLOSURE || $scopeOwner === T_ANON_CLASS) { - return; - } - - // Else, it's something like `if (foo) {};` and the semi-colon is not needed. - } - - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $nested = $tokens[$stackPtr]['nested_parenthesis']; - $lastCloser = array_pop($nested); - if (isset($tokens[$lastCloser]['parenthesis_owner']) === true - && $tokens[$tokens[$lastCloser]['parenthesis_owner']]['code'] === T_FOR - ) { - // Empty for() condition. - return; - } - } - - $fix = $phpcsFile->addFixableWarning( - 'Empty PHP statement detected: superfluous semi-colon.', - $stackPtr, - 'SemicolonWithoutCodeDetected' - ); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - if ($tokens[$prevNonEmpty]['code'] === T_OPEN_TAG - || $tokens[$prevNonEmpty]['code'] === T_OPEN_TAG_WITH_ECHO - ) { - // Check for superfluous whitespace after the semi-colon which will be - // removed as the `fixer->replaceToken(($stackPtr + 1), $replacement); - } - } - - for ($i = $stackPtr; $i > $prevNonEmpty; $i--) { - if ($tokens[$i]['code'] !== T_SEMICOLON - && $tokens[$i]['code'] !== T_WHITESPACE - ) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - break; - - // Detect ``. - case 'T_CLOSE_TAG': - $prevNonEmpty = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - - if ($prevNonEmpty === false - || ($tokens[$prevNonEmpty]['code'] !== T_OPEN_TAG - && $tokens[$prevNonEmpty]['code'] !== T_OPEN_TAG_WITH_ECHO) - ) { - return; - } - - $fix = $phpcsFile->addFixableWarning( - 'Empty PHP open/close tag combination detected.', - $prevNonEmpty, - 'EmptyPHPOpenCloseTagsDetected' - ); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = $prevNonEmpty; $i <= $stackPtr; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - break; - - default: - // Deliberately left empty. - break; - }//end switch - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php deleted file mode 100644 index d9248af..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php +++ /dev/null @@ -1,96 +0,0 @@ - - * stmt { - * // foo - * } - * stmt (conditions) { - * // foo - * } - * - * - * @author Manuel Pichler - * @author Greg Sherwood - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EmptyStatementSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - return [ - T_TRY, - T_CATCH, - T_FINALLY, - T_DO, - T_ELSE, - T_ELSEIF, - T_FOR, - T_FOREACH, - T_IF, - T_SWITCH, - T_WHILE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip statements without a body. - if (isset($token['scope_opener']) === false) { - return; - } - - $next = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($token['scope_opener'] + 1), - ($token['scope_closer'] - 1), - true - ); - - if ($next !== false) { - return; - } - - // Get token identifier. - $name = strtoupper($token['content']); - $error = 'Empty %s statement detected'; - $phpcsFile->addError($error, $stackPtr, 'Detected'.ucfirst(strtolower($name)), [$name]); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php deleted file mode 100644 index f583e93..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php +++ /dev/null @@ -1,91 +0,0 @@ - - * class Foo - * { - * public function bar($x) - * { - * for (;true;) true; // No Init or Update part, may as well be: while (true) - * } - * } - * - * - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ForLoopShouldBeWhileLoopSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - return [T_FOR]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip invalid statement. - if (isset($token['parenthesis_opener']) === false) { - return; - } - - $next = ++$token['parenthesis_opener']; - $end = --$token['parenthesis_closer']; - - $parts = [ - 0, - 0, - 0, - ]; - $index = 0; - - for (; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - if ($code === T_SEMICOLON) { - ++$index; - } else if (isset(Tokens::$emptyTokens[$code]) === false) { - ++$parts[$index]; - } - } - - if ($parts[0] === 0 && $parts[2] === 0 && $parts[1] > 0) { - $error = 'This FOR loop can be simplified to a WHILE loop'; - $phpcsFile->addWarning($error, $stackPtr, 'CanSimplify'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php deleted file mode 100644 index 62a07b2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php +++ /dev/null @@ -1,101 +0,0 @@ - - * class Foo - * { - * public function bar($x) - * { - * $a = array(1, 2, 3, 4); - * for ($i = 0; $i < count($a); $i++) { - * $a[$i] *= $i; - * } - * } - * } - * - * - * @author Greg Sherwood - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ForLoopWithTestFunctionCallSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - return [T_FOR]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip invalid statement. - if (isset($token['parenthesis_opener']) === false) { - return; - } - - $next = ++$token['parenthesis_opener']; - $end = --$token['parenthesis_closer']; - - $position = 0; - - for (; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - if ($code === T_SEMICOLON) { - ++$position; - } - - if ($position < 1) { - continue; - } else if ($position > 1) { - break; - } else if ($code !== T_VARIABLE && $code !== T_STRING) { - continue; - } - - // Find next non empty token, if it is a open curly brace we have a - // function call. - $index = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - - if ($tokens[$index]['code'] === T_OPEN_PARENTHESIS) { - $error = 'Avoid function calls in a FOR loop test part'; - $phpcsFile->addWarning($error, $stackPtr, 'NotAllowed'); - break; - } - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php deleted file mode 100644 index 364658d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php +++ /dev/null @@ -1,134 +0,0 @@ - - * class Foo - * { - * public function bar($x) - * { - * for ($i = 0; $i < 10; $i++) - * { - * for ($k = 0; $k < 20; $i++) - * { - * echo 'Hello'; - * } - * } - * } - * } - * - * - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class JumbledIncrementerSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - return [T_FOR]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip for-loop without body. - if (isset($token['scope_opener']) === false) { - return; - } - - // Find incrementors for outer loop. - $outer = $this->findIncrementers($tokens, $token); - - // Skip if empty. - if (count($outer) === 0) { - return; - } - - // Find nested for loops. - $start = ++$token['scope_opener']; - $end = --$token['scope_closer']; - - for (; $start <= $end; ++$start) { - if ($tokens[$start]['code'] !== T_FOR) { - continue; - } - - $inner = $this->findIncrementers($tokens, $tokens[$start]); - $diff = array_intersect($outer, $inner); - - if (count($diff) !== 0) { - $error = 'Loop incrementor (%s) jumbling with inner loop'; - $data = [join(', ', $diff)]; - $phpcsFile->addWarning($error, $stackPtr, 'Found', $data); - } - } - - }//end process() - - - /** - * Get all used variables in the incrementer part of a for statement. - * - * @param array(integer=>array) $tokens Array with all code sniffer tokens. - * @param array(string=>mixed) $token Current for loop token - * - * @return string[] List of all found incrementer variables. - */ - protected function findIncrementers(array $tokens, array $token) - { - // Skip invalid statement. - if (isset($token['parenthesis_opener']) === false) { - return []; - } - - $start = ++$token['parenthesis_opener']; - $end = --$token['parenthesis_closer']; - - $incrementers = []; - $semicolons = 0; - for ($next = $start; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - if ($code === T_SEMICOLON) { - ++$semicolons; - } else if ($semicolons === 2 && $code === T_VARIABLE) { - $incrementers[] = $tokens[$next]['content']; - } - } - - return $incrementers; - - }//end findIncrementers() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php deleted file mode 100644 index 94eab1f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php +++ /dev/null @@ -1,93 +0,0 @@ -true
    or false - * - * - * class Foo - * { - * public function close() - * { - * if (true) - * { - * // ... - * } - * } - * } - * - * - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UnconditionalIfStatementSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - return [ - T_IF, - T_ELSEIF, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip for-loop without body. - if (isset($token['parenthesis_opener']) === false) { - return; - } - - $next = ++$token['parenthesis_opener']; - $end = --$token['parenthesis_closer']; - - $goodCondition = false; - for (; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - - if (isset(Tokens::$emptyTokens[$code]) === true) { - continue; - } else if ($code !== T_TRUE && $code !== T_FALSE) { - $goodCondition = true; - } - } - - if ($goodCondition === false) { - $error = 'Avoid IF statements that are always true or false'; - $phpcsFile->addWarning($error, $stackPtr, 'Found'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php deleted file mode 100644 index bed67c9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php +++ /dev/null @@ -1,85 +0,0 @@ - - * final class Foo - * { - * public final function bar() - * { - * } - * } - * - * - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UnnecessaryFinalModifierSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - return [T_CLASS]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip for-statements without body. - if (isset($token['scope_opener']) === false) { - return; - } - - // Fetch previous token. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - // Skip for non final class. - if ($prev === false || $tokens[$prev]['code'] !== T_FINAL) { - return; - } - - $next = ++$token['scope_opener']; - $end = --$token['scope_closer']; - - for (; $next <= $end; ++$next) { - if ($tokens[$next]['code'] === T_FINAL) { - $error = 'Unnecessary FINAL modifier in FINAL class'; - $phpcsFile->addWarning($error, $next, 'Found'); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php deleted file mode 100644 index 427f509..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php +++ /dev/null @@ -1,236 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UnusedFunctionParameterSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - T_FN, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip broken function declarations. - if (isset($token['scope_opener']) === false || isset($token['parenthesis_opener']) === false) { - return; - } - - $errorCode = 'Found'; - $implements = false; - $extends = false; - $classPtr = $phpcsFile->getCondition($stackPtr, T_CLASS); - if ($classPtr !== false) { - $implements = $phpcsFile->findImplementedInterfaceNames($classPtr); - $extends = $phpcsFile->findExtendedClassName($classPtr); - if ($extends !== false) { - $errorCode .= 'InExtendedClass'; - } else if ($implements !== false) { - $errorCode .= 'InImplementedInterface'; - } - } - - $params = []; - $methodParams = $phpcsFile->getMethodParameters($stackPtr); - - // Skip when no parameters found. - $methodParamsCount = count($methodParams); - if ($methodParamsCount === 0) { - return; - } - - foreach ($methodParams as $param) { - $params[$param['name']] = $stackPtr; - } - - $next = ++$token['scope_opener']; - $end = --$token['scope_closer']; - - $foundContent = false; - $validTokens = [ - T_HEREDOC => T_HEREDOC, - T_NOWDOC => T_NOWDOC, - T_END_HEREDOC => T_END_HEREDOC, - T_END_NOWDOC => T_END_NOWDOC, - T_DOUBLE_QUOTED_STRING => T_DOUBLE_QUOTED_STRING, - ]; - $validTokens += Tokens::$emptyTokens; - - for (; $next <= $end; ++$next) { - $token = $tokens[$next]; - $code = $token['code']; - - // Ignorable tokens. - if (isset(Tokens::$emptyTokens[$code]) === true) { - continue; - } - - if ($foundContent === false) { - // A throw statement as the first content indicates an interface method. - if ($code === T_THROW && $implements !== false) { - return; - } - - // A return statement as the first content indicates an interface method. - if ($code === T_RETURN) { - $tmp = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - if ($tmp === false && $implements !== false) { - return; - } - - // There is a return. - if ($tokens[$tmp]['code'] === T_SEMICOLON && $implements !== false) { - return; - } - - $tmp = $phpcsFile->findNext(Tokens::$emptyTokens, ($tmp + 1), null, true); - if ($tmp !== false && $tokens[$tmp]['code'] === T_SEMICOLON && $implements !== false) { - // There is a return . - return; - } - }//end if - }//end if - - $foundContent = true; - - if ($code === T_VARIABLE && isset($params[$token['content']]) === true) { - unset($params[$token['content']]); - } else if ($code === T_DOLLAR) { - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($next + 1), null, true); - if ($tokens[$nextToken]['code'] === T_OPEN_CURLY_BRACKET) { - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($nextToken + 1), null, true); - if ($tokens[$nextToken]['code'] === T_STRING) { - $varContent = '$'.$tokens[$nextToken]['content']; - if (isset($params[$varContent]) === true) { - unset($params[$varContent]); - } - } - } - } else if ($code === T_DOUBLE_QUOTED_STRING - || $code === T_START_HEREDOC - || $code === T_START_NOWDOC - ) { - // Tokenize strings that can contain variables. - // Make sure the string is re-joined if it occurs over multiple lines. - $content = $token['content']; - for ($i = ($next + 1); $i <= $end; $i++) { - if (isset($validTokens[$tokens[$i]['code']]) === true) { - $content .= $tokens[$i]['content']; - $next++; - } else { - break; - } - } - - $stringTokens = token_get_all(sprintf('', $content)); - foreach ($stringTokens as $stringPtr => $stringToken) { - if (is_array($stringToken) === false) { - continue; - } - - $varContent = ''; - if ($stringToken[0] === T_DOLLAR_OPEN_CURLY_BRACES) { - $varContent = '$'.$stringTokens[($stringPtr + 1)][1]; - } else if ($stringToken[0] === T_VARIABLE) { - $varContent = $stringToken[1]; - } - - if ($varContent !== '' && isset($params[$varContent]) === true) { - unset($params[$varContent]); - } - } - }//end if - }//end for - - if ($foundContent === true && count($params) > 0) { - $error = 'The method parameter %s is never used'; - - // If there is only one parameter and it is unused, no need for additional errorcode toggling logic. - if ($methodParamsCount === 1) { - foreach ($params as $paramName => $position) { - $data = [$paramName]; - $phpcsFile->addWarning($error, $position, $errorCode, $data); - } - - return; - } - - $foundLastUsed = false; - $lastIndex = ($methodParamsCount - 1); - $errorInfo = []; - for ($i = $lastIndex; $i >= 0; --$i) { - if ($foundLastUsed !== false) { - if (isset($params[$methodParams[$i]['name']]) === true) { - $errorInfo[$methodParams[$i]['name']] = [ - 'position' => $params[$methodParams[$i]['name']], - 'errorcode' => $errorCode.'BeforeLastUsed', - ]; - } - } else { - if (isset($params[$methodParams[$i]['name']]) === false) { - $foundLastUsed = true; - } else { - $errorInfo[$methodParams[$i]['name']] = [ - 'position' => $params[$methodParams[$i]['name']], - 'errorcode' => $errorCode.'AfterLastUsed', - ]; - } - } - } - - if (count($errorInfo) > 0) { - $errorInfo = array_reverse($errorInfo); - foreach ($errorInfo as $paramName => $info) { - $data = [$paramName]; - $phpcsFile->addWarning($error, $info['position'], $info['errorcode'], $data); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php deleted file mode 100644 index fded929..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php +++ /dev/null @@ -1,161 +0,0 @@ - - * class FooBar { - * public function __construct($a, $b) { - * parent::__construct($a, $b); - * } - * } - * - * - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UselessOverridingMethodSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip function without body. - if (isset($token['scope_opener']) === false) { - return; - } - - // Get function name. - $methodName = $phpcsFile->getDeclarationName($stackPtr); - - // Get all parameters from method signature. - $signature = []; - foreach ($phpcsFile->getMethodParameters($stackPtr) as $param) { - $signature[] = $param['name']; - } - - $next = ++$token['scope_opener']; - $end = --$token['scope_closer']; - - for (; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - - if (isset(Tokens::$emptyTokens[$code]) === true) { - continue; - } else if ($code === T_RETURN) { - continue; - } - - break; - } - - // Any token except 'parent' indicates correct code. - if ($tokens[$next]['code'] !== T_PARENT) { - return; - } - - // Find next non empty token index, should be double colon. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - - // Skip for invalid code. - if ($next === false || $tokens[$next]['code'] !== T_DOUBLE_COLON) { - return; - } - - // Find next non empty token index, should be the function name. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - - // Skip for invalid code or other method. - if ($next === false || $tokens[$next]['content'] !== $methodName) { - return; - } - - // Find next non empty token index, should be the open parenthesis. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - - // Skip for invalid code. - if ($next === false || $tokens[$next]['code'] !== T_OPEN_PARENTHESIS) { - return; - } - - $parameters = ['']; - $parenthesisCount = 1; - $count = count($tokens); - for (++$next; $next < $count; ++$next) { - $code = $tokens[$next]['code']; - - if ($code === T_OPEN_PARENTHESIS) { - ++$parenthesisCount; - } else if ($code === T_CLOSE_PARENTHESIS) { - --$parenthesisCount; - } else if ($parenthesisCount === 1 && $code === T_COMMA) { - $parameters[] = ''; - } else if (isset(Tokens::$emptyTokens[$code]) === false) { - $parameters[(count($parameters) - 1)] .= $tokens[$next]['content']; - } - - if ($parenthesisCount === 0) { - break; - } - }//end for - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - if ($next === false || $tokens[$next]['code'] !== T_SEMICOLON) { - return; - } - - // Check rest of the scope. - for (++$next; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - // Skip for any other content. - if (isset(Tokens::$emptyTokens[$code]) === false) { - return; - } - } - - $parameters = array_map('trim', $parameters); - $parameters = array_filter($parameters); - - if (count($parameters) === count($signature) && $parameters === $signature) { - $phpcsFile->addWarning('Possible useless method overriding detected', $stackPtr, 'Found'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/DocCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/DocCommentSniff.php deleted file mode 100644 index 545319b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/DocCommentSniff.php +++ /dev/null @@ -1,353 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DocCommentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DOC_COMMENT_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['comment_closer']) === false - || ($tokens[$tokens[$stackPtr]['comment_closer']]['content'] === '' - && $tokens[$stackPtr]['comment_closer'] === ($phpcsFile->numTokens - 1)) - ) { - // Don't process an unfinished comment during live coding. - return; - } - - $commentStart = $stackPtr; - $commentEnd = $tokens[$stackPtr]['comment_closer']; - - $empty = [ - T_DOC_COMMENT_WHITESPACE, - T_DOC_COMMENT_STAR, - ]; - - $short = $phpcsFile->findNext($empty, ($stackPtr + 1), $commentEnd, true); - if ($short === false) { - // No content at all. - $error = 'Doc comment is empty'; - $phpcsFile->addError($error, $stackPtr, 'Empty'); - return; - } - - // The first line of the comment should just be the /** code. - if ($tokens[$short]['line'] === $tokens[$stackPtr]['line']) { - $error = 'The open comment tag must be the only content on the line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentAfterOpen'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($stackPtr); - $phpcsFile->fixer->addContentBefore($short, '* '); - $phpcsFile->fixer->endChangeset(); - } - } - - // The last line of the comment should just be the */ code. - $prev = $phpcsFile->findPrevious($empty, ($commentEnd - 1), $stackPtr, true); - if ($tokens[$prev]['line'] === $tokens[$commentEnd]['line']) { - $error = 'The close comment tag must be the only content on the line'; - $fix = $phpcsFile->addFixableError($error, $commentEnd, 'ContentBeforeClose'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($commentEnd); - } - } - - // Check for additional blank lines at the end of the comment. - if ($tokens[$prev]['line'] < ($tokens[$commentEnd]['line'] - 1)) { - $error = 'Additional blank lines found at end of doc comment'; - $fix = $phpcsFile->addFixableError($error, $commentEnd, 'SpacingAfter'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $commentEnd; $i++) { - if ($tokens[($i + 1)]['line'] === $tokens[$commentEnd]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - // Check for a comment description. - if ($tokens[$short]['code'] !== T_DOC_COMMENT_STRING) { - $error = 'Missing short description in doc comment'; - $phpcsFile->addError($error, $stackPtr, 'MissingShort'); - } else { - // No extra newline before short description. - if ($tokens[$short]['line'] !== ($tokens[$stackPtr]['line'] + 1)) { - $error = 'Doc comment short description must be on the first line'; - $fix = $phpcsFile->addFixableError($error, $short, 'SpacingBeforeShort'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = $stackPtr; $i < $short; $i++) { - if ($tokens[$i]['line'] === $tokens[$stackPtr]['line']) { - continue; - } else if ($tokens[$i]['line'] === $tokens[$short]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - // Account for the fact that a short description might cover - // multiple lines. - $shortContent = $tokens[$short]['content']; - $shortEnd = $short; - for ($i = ($short + 1); $i < $commentEnd; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_STRING) { - if ($tokens[$i]['line'] === ($tokens[$shortEnd]['line'] + 1)) { - $shortContent .= $tokens[$i]['content']; - $shortEnd = $i; - } else { - break; - } - } - } - - if (preg_match('/^\p{Ll}/u', $shortContent) === 1) { - $error = 'Doc comment short description must start with a capital letter'; - $phpcsFile->addError($error, $short, 'ShortNotCapital'); - } - - $long = $phpcsFile->findNext($empty, ($shortEnd + 1), ($commentEnd - 1), true); - if ($long !== false && $tokens[$long]['code'] === T_DOC_COMMENT_STRING) { - if ($tokens[$long]['line'] !== ($tokens[$shortEnd]['line'] + 2)) { - $error = 'There must be exactly one blank line between descriptions in a doc comment'; - $fix = $phpcsFile->addFixableError($error, $long, 'SpacingBetween'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($shortEnd + 1); $i < $long; $i++) { - if ($tokens[$i]['line'] === $tokens[$shortEnd]['line']) { - continue; - } else if ($tokens[$i]['line'] === ($tokens[$long]['line'] - 1)) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - if (preg_match('/^\p{Ll}/u', $tokens[$long]['content']) === 1) { - $error = 'Doc comment long description must start with a capital letter'; - $phpcsFile->addError($error, $long, 'LongNotCapital'); - } - }//end if - }//end if - - if (empty($tokens[$commentStart]['comment_tags']) === true) { - // No tags in the comment. - return; - } - - $firstTag = $tokens[$commentStart]['comment_tags'][0]; - $prev = $phpcsFile->findPrevious($empty, ($firstTag - 1), $stackPtr, true); - if ($tokens[$firstTag]['line'] !== ($tokens[$prev]['line'] + 2) - && $tokens[$prev]['code'] !== T_DOC_COMMENT_OPEN_TAG - ) { - $error = 'There must be exactly one blank line before the tags in a doc comment'; - $fix = $phpcsFile->addFixableError($error, $firstTag, 'SpacingBeforeTags'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $firstTag; $i++) { - if ($tokens[$i]['line'] === $tokens[$firstTag]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $indent = str_repeat(' ', $tokens[$stackPtr]['column']); - $phpcsFile->fixer->addContent($prev, $phpcsFile->eolChar.$indent.'*'.$phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - } - - // Break out the tags into groups and check alignment within each. - // A tag group is one where there are no blank lines between tags. - // The param tag group is special as it requires all @param tags to be inside. - $tagGroups = []; - $groupid = 0; - $paramGroupid = null; - foreach ($tokens[$commentStart]['comment_tags'] as $pos => $tag) { - if ($pos > 0) { - $prev = $phpcsFile->findPrevious( - T_DOC_COMMENT_STRING, - ($tag - 1), - $tokens[$commentStart]['comment_tags'][($pos - 1)] - ); - - if ($prev === false) { - $prev = $tokens[$commentStart]['comment_tags'][($pos - 1)]; - } - - if ($tokens[$prev]['line'] !== ($tokens[$tag]['line'] - 1)) { - $groupid++; - } - } - - if ($tokens[$tag]['content'] === '@param') { - if ($paramGroupid !== null - && $paramGroupid !== $groupid - ) { - $error = 'Parameter tags must be grouped together in a doc comment'; - $phpcsFile->addError($error, $tag, 'ParamGroup'); - } - - if ($paramGroupid === null) { - $paramGroupid = $groupid; - } - }//end if - - $tagGroups[$groupid][] = $tag; - }//end foreach - - foreach ($tagGroups as $groupid => $group) { - $maxLength = 0; - $paddings = []; - foreach ($group as $pos => $tag) { - if ($paramGroupid === $groupid - && $tokens[$tag]['content'] !== '@param' - ) { - $error = 'Tag %s cannot be grouped with parameter tags in a doc comment'; - $data = [$tokens[$tag]['content']]; - $phpcsFile->addError($error, $tag, 'NonParamGroup', $data); - } - - $tagLength = $tokens[$tag]['length']; - if ($tagLength > $maxLength) { - $maxLength = $tagLength; - } - - // Check for a value. No value means no padding needed. - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $tag, $commentEnd); - if ($string !== false && $tokens[$string]['line'] === $tokens[$tag]['line']) { - $paddings[$tag] = $tokens[($tag + 1)]['length']; - } - } - - // Check that there was single blank line after the tag block - // but account for a multi-line tag comments. - $lastTag = $group[$pos]; - $next = $phpcsFile->findNext(T_DOC_COMMENT_TAG, ($lastTag + 3), $commentEnd); - if ($next !== false) { - $prev = $phpcsFile->findPrevious([T_DOC_COMMENT_TAG, T_DOC_COMMENT_STRING], ($next - 1), $commentStart); - if ($tokens[$next]['line'] !== ($tokens[$prev]['line'] + 2)) { - $error = 'There must be a single blank line after a tag group'; - $fix = $phpcsFile->addFixableError($error, $lastTag, 'SpacingAfterTagGroup'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $indent = str_repeat(' ', $tokens[$stackPtr]['column']); - $phpcsFile->fixer->addContent($prev, $phpcsFile->eolChar.$indent.'*'.$phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - // Now check paddings. - foreach ($paddings as $tag => $padding) { - $required = ($maxLength - $tokens[$tag]['length'] + 1); - - if ($padding !== $required) { - $error = 'Tag value for %s tag indented incorrectly; expected %s spaces but found %s'; - $data = [ - $tokens[$tag]['content'], - $required, - $padding, - ]; - - $fix = $phpcsFile->addFixableError($error, ($tag + 1), 'TagValueIndent', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($tag + 1), str_repeat(' ', $required)); - } - } - } - }//end foreach - - // If there is a param group, it needs to be first. - if ($paramGroupid !== null && $paramGroupid !== 0) { - $error = 'Parameter tags must be defined first in a doc comment'; - $phpcsFile->addError($error, $tagGroups[$paramGroupid][0], 'ParamNotFirst'); - } - - $foundTags = []; - foreach ($tokens[$stackPtr]['comment_tags'] as $pos => $tag) { - $tagName = $tokens[$tag]['content']; - if (isset($foundTags[$tagName]) === true) { - $lastTag = $tokens[$stackPtr]['comment_tags'][($pos - 1)]; - if ($tokens[$lastTag]['content'] !== $tagName) { - $error = 'Tags must be grouped together in a doc comment'; - $phpcsFile->addError($error, $tag, 'TagsNotGrouped'); - } - - continue; - } - - $foundTags[$tagName] = true; - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/FixmeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/FixmeSniff.php deleted file mode 100644 index 8438522..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/FixmeSniff.php +++ /dev/null @@ -1,78 +0,0 @@ - - * @author Sam Graham - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FixmeSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return array_diff(Tokens::$commentTokens, Tokens::$phpcsCommentTokens); - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $matches = []; - preg_match('/(?:\A|[^\p{L}]+)fixme([^\p{L}]+(.*)|\Z)/ui', $content, $matches); - if (empty($matches) === false) { - // Clear whitespace and some common characters not required at - // the end of a fixme message to make the error more informative. - $type = 'CommentFound'; - $fixmeMessage = trim($matches[1]); - $fixmeMessage = trim($fixmeMessage, '-:[](). '); - $error = 'Comment refers to a FIXME task'; - $data = [$fixmeMessage]; - if ($fixmeMessage !== '') { - $type = 'TaskFound'; - $error .= ' "%s"'; - } - - $phpcsFile->addError($error, $stackPtr, $type, $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php deleted file mode 100644 index 6396804..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class TodoSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return array_diff(Tokens::$commentTokens, Tokens::$phpcsCommentTokens); - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $matches = []; - preg_match('/(?:\A|[^\p{L}]+)todo([^\p{L}]+(.*)|\Z)/ui', $content, $matches); - if (empty($matches) === false) { - // Clear whitespace and some common characters not required at - // the end of a to-do message to make the warning more informative. - $type = 'CommentFound'; - $todoMessage = trim($matches[1]); - $todoMessage = trim($todoMessage, '-:[](). '); - $error = 'Comment refers to a TODO task'; - $data = [$todoMessage]; - if ($todoMessage !== '') { - $type = 'TaskFound'; - $error .= ' "%s"'; - } - - $phpcsFile->addWarning($error, $stackPtr, $type, $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/DisallowYodaConditionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/DisallowYodaConditionsSniff.php deleted file mode 100644 index f760fa1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/DisallowYodaConditionsSniff.php +++ /dev/null @@ -1,188 +0,0 @@ - - * @author Mark Scherer - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DisallowYodaConditionsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$comparisonTokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $previousIndex = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - $relevantTokens = [ - T_CLOSE_SHORT_ARRAY, - T_CLOSE_PARENTHESIS, - T_TRUE, - T_FALSE, - T_NULL, - T_LNUMBER, - T_DNUMBER, - T_CONSTANT_ENCAPSED_STRING, - ]; - - if ($previousIndex === false - || in_array($tokens[$previousIndex]['code'], $relevantTokens, true) === false - ) { - return; - } - - if ($tokens[$previousIndex]['code'] === T_CLOSE_SHORT_ARRAY) { - $previousIndex = $tokens[$previousIndex]['bracket_opener']; - if ($this->isArrayStatic($phpcsFile, $previousIndex) === false) { - return; - } - } - - $prevIndex = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($previousIndex - 1), null, true); - if ($prevIndex === false) { - return; - } - - if (in_array($tokens[$prevIndex]['code'], Tokens::$arithmeticTokens, true) === true) { - return; - } - - if ($tokens[$prevIndex]['code'] === T_STRING_CONCAT) { - return; - } - - // Is it a parenthesis. - if ($tokens[$previousIndex]['code'] === T_CLOSE_PARENTHESIS) { - // Check what exists inside the parenthesis. - $closeParenthesisIndex = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($tokens[$previousIndex]['parenthesis_opener'] - 1), - null, - true - ); - - if ($closeParenthesisIndex === false || $tokens[$closeParenthesisIndex]['code'] !== T_ARRAY) { - if ($tokens[$closeParenthesisIndex]['code'] === T_STRING) { - return; - } - - // If it is not an array check what is inside. - $found = $phpcsFile->findPrevious( - T_VARIABLE, - ($previousIndex - 1), - $tokens[$previousIndex]['parenthesis_opener'] - ); - - // If a variable exists, it is not Yoda. - if ($found !== false) { - return; - } - - // If there is nothing inside the parenthesis, it it not a Yoda. - $opener = $tokens[$previousIndex]['parenthesis_opener']; - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($previousIndex - 1), ($opener + 1), true); - if ($prev === false) { - return; - } - } else if ($tokens[$closeParenthesisIndex]['code'] === T_ARRAY - && $this->isArrayStatic($phpcsFile, $closeParenthesisIndex) === false - ) { - return; - }//end if - }//end if - - $phpcsFile->addError( - 'Usage of Yoda conditions is not allowed; switch the expression order', - $stackPtr, - 'Found' - ); - - }//end process() - - - /** - * Determines if an array is a static definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $arrayToken The position of the array token. - * - * @return bool - */ - public function isArrayStatic(File $phpcsFile, $arrayToken) - { - $tokens = $phpcsFile->getTokens(); - - $arrayEnd = null; - if ($tokens[$arrayToken]['code'] === T_OPEN_SHORT_ARRAY) { - $start = $arrayToken; - $end = $tokens[$arrayToken]['bracket_closer']; - } else if ($tokens[$arrayToken]['code'] === T_ARRAY) { - $start = $tokens[$arrayToken]['parenthesis_opener']; - $end = $tokens[$arrayToken]['parenthesis_closer']; - } else { - return true; - } - - $staticTokens = Tokens::$emptyTokens; - $staticTokens += Tokens::$textStringTokens; - $staticTokens += Tokens::$assignmentTokens; - $staticTokens += Tokens::$equalityTokens; - $staticTokens += Tokens::$comparisonTokens; - $staticTokens += Tokens::$arithmeticTokens; - $staticTokens += Tokens::$operators; - $staticTokens += Tokens::$booleanOperators; - $staticTokens += Tokens::$castTokens; - $staticTokens += Tokens::$bracketTokens; - $staticTokens += [ - T_DOUBLE_ARROW => T_DOUBLE_ARROW, - T_COMMA => T_COMMA, - T_TRUE => T_TRUE, - T_FALSE => T_FALSE, - ]; - - for ($i = ($start + 1); $i < $end; $i++) { - if (isset($tokens[$i]['scope_closer']) === true) { - $i = $tokens[$i]['scope_closer']; - continue; - } - - if (isset($staticTokens[$tokens[$i]['code']]) === false) { - return false; - } - } - - return true; - - }//end isArrayStatic() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php deleted file mode 100644 index d48a477..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php +++ /dev/null @@ -1,371 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class InlineControlStructureSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * If true, an error will be thrown; otherwise a warning. - * - * @var boolean - */ - public $error = true; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_ELSE, - T_ELSEIF, - T_FOREACH, - T_WHILE, - T_DO, - T_SWITCH, - T_FOR, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener']) === true) { - $phpcsFile->recordMetric($stackPtr, 'Control structure defined inline', 'no'); - return; - } - - // Ignore the ELSE in ELSE IF. We'll process the IF part later. - if ($tokens[$stackPtr]['code'] === T_ELSE) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_IF) { - return; - } - } - - if ($tokens[$stackPtr]['code'] === T_WHILE || $tokens[$stackPtr]['code'] === T_FOR) { - // This could be from a DO WHILE, which doesn't have an opening brace or a while/for without body. - if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { - $afterParensCloser = $phpcsFile->findNext(Tokens::$emptyTokens, ($tokens[$stackPtr]['parenthesis_closer'] + 1), null, true); - if ($afterParensCloser === false) { - // Live coding. - return; - } - - if ($tokens[$afterParensCloser]['code'] === T_SEMICOLON) { - $phpcsFile->recordMetric($stackPtr, 'Control structure defined inline', 'no'); - return; - } - } - - // In Javascript DO WHILE loops without curly braces are legal. This - // is only valid if a single statement is present between the DO and - // the WHILE. We can detect this by checking only a single semicolon - // is present between them. - if ($tokens[$stackPtr]['code'] === T_WHILE && $phpcsFile->tokenizerType === 'JS') { - $lastDo = $phpcsFile->findPrevious(T_DO, ($stackPtr - 1)); - $lastSemicolon = $phpcsFile->findPrevious(T_SEMICOLON, ($stackPtr - 1)); - if ($lastDo !== false && $lastSemicolon !== false && $lastDo < $lastSemicolon) { - $precedingSemicolon = $phpcsFile->findPrevious(T_SEMICOLON, ($lastSemicolon - 1)); - if ($precedingSemicolon === false || $precedingSemicolon < $lastDo) { - return; - } - } - } - }//end if - - if (isset($tokens[$stackPtr]['parenthesis_opener'], $tokens[$stackPtr]['parenthesis_closer']) === false - && $tokens[$stackPtr]['code'] !== T_ELSE - ) { - if ($tokens[$stackPtr]['code'] !== T_DO) { - // Live coding or parse error. - return; - } - - $nextWhile = $phpcsFile->findNext(T_WHILE, ($stackPtr + 1)); - if ($nextWhile !== false - && isset($tokens[$nextWhile]['parenthesis_opener'], $tokens[$nextWhile]['parenthesis_closer']) === false - ) { - // Live coding or parse error. - return; - } - - unset($nextWhile); - } - - $start = $stackPtr; - if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { - $start = $tokens[$stackPtr]['parenthesis_closer']; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($start + 1), null, true); - if ($nextNonEmpty === false) { - // Live coding or parse error. - return; - } - - if ($tokens[$nextNonEmpty]['code'] === T_COLON) { - // Alternative control structure. - // T_END... missing. Either live coding, parse error or end - // tag in short open tags and scan run with short_open_tag=Off. - // Bow out completely as any further detection will be unreliable - // and create incorrect fixes or cause fixer conflicts. - return ($phpcsFile->numTokens + 1); - } - - unset($nextNonEmpty, $start); - - // This is a control structure without an opening brace, - // so it is an inline statement. - if ($this->error === true) { - $fix = $phpcsFile->addFixableError('Inline control structures are not allowed', $stackPtr, 'NotAllowed'); - } else { - $fix = $phpcsFile->addFixableWarning('Inline control structures are discouraged', $stackPtr, 'Discouraged'); - } - - $phpcsFile->recordMetric($stackPtr, 'Control structure defined inline', 'yes'); - - // Stop here if we are not fixing the error. - if ($fix !== true) { - return; - } - - $phpcsFile->fixer->beginChangeset(); - if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { - $closer = $tokens[$stackPtr]['parenthesis_closer']; - } else { - $closer = $stackPtr; - } - - if ($tokens[($closer + 1)]['code'] === T_WHITESPACE - || $tokens[($closer + 1)]['code'] === T_SEMICOLON - ) { - $phpcsFile->fixer->addContent($closer, ' {'); - } else { - $phpcsFile->fixer->addContent($closer, ' { '); - } - - $fixableScopeOpeners = $this->register(); - - $lastNonEmpty = $closer; - for ($end = ($closer + 1); $end < $phpcsFile->numTokens; $end++) { - if ($tokens[$end]['code'] === T_SEMICOLON) { - break; - } - - if ($tokens[$end]['code'] === T_CLOSE_TAG) { - $end = $lastNonEmpty; - break; - } - - if (in_array($tokens[$end]['code'], $fixableScopeOpeners, true) === true - && isset($tokens[$end]['scope_opener']) === false - ) { - // The best way to fix nested inline scopes is middle-out. - // So skip this one. It will be detected and fixed on a future loop. - $phpcsFile->fixer->rollbackChangeset(); - return; - } - - if (isset($tokens[$end]['scope_opener']) === true) { - $type = $tokens[$end]['code']; - $end = $tokens[$end]['scope_closer']; - if ($type === T_DO || $type === T_IF || $type === T_ELSEIF || $type === T_TRY) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - if ($next === false) { - break; - } - - $nextType = $tokens[$next]['code']; - - // Let additional conditions loop and find their ending. - if (($type === T_IF - || $type === T_ELSEIF) - && ($nextType === T_ELSEIF - || $nextType === T_ELSE) - ) { - continue; - } - - // Account for DO... WHILE conditions. - if ($type === T_DO && $nextType === T_WHILE) { - $end = $phpcsFile->findNext(T_SEMICOLON, ($next + 1)); - } - - // Account for TRY... CATCH statements. - if ($type === T_TRY && $nextType === T_CATCH) { - $end = $tokens[$next]['scope_closer']; - } - } else if ($type === T_CLOSURE) { - // There should be a semicolon after the closing brace. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - if ($next !== false && $tokens[$next]['code'] === T_SEMICOLON) { - $end = $next; - } - }//end if - - if ($tokens[$end]['code'] !== T_END_HEREDOC - && $tokens[$end]['code'] !== T_END_NOWDOC - ) { - break; - } - }//end if - - if (isset($tokens[$end]['parenthesis_closer']) === true) { - $end = $tokens[$end]['parenthesis_closer']; - $lastNonEmpty = $end; - continue; - } - - if ($tokens[$end]['code'] !== T_WHITESPACE) { - $lastNonEmpty = $end; - } - }//end for - - if ($end === $phpcsFile->numTokens) { - $end = $lastNonEmpty; - } - - $nextContent = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - if ($nextContent === false || $tokens[$nextContent]['line'] !== $tokens[$end]['line']) { - // Looks for completely empty statements. - $next = $phpcsFile->findNext(T_WHITESPACE, ($closer + 1), ($end + 1), true); - } else { - $next = ($end + 1); - $endLine = $end; - } - - if ($next !== $end) { - if ($nextContent === false || $tokens[$nextContent]['line'] !== $tokens[$end]['line']) { - // Account for a comment on the end of the line. - for ($endLine = $end; $endLine < $phpcsFile->numTokens; $endLine++) { - if (isset($tokens[($endLine + 1)]) === false - || $tokens[$endLine]['line'] !== $tokens[($endLine + 1)]['line'] - ) { - break; - } - } - - if (isset(Tokens::$commentTokens[$tokens[$endLine]['code']]) === false - && ($tokens[$endLine]['code'] !== T_WHITESPACE - || isset(Tokens::$commentTokens[$tokens[($endLine - 1)]['code']]) === false) - ) { - $endLine = $end; - } - } - - if ($endLine !== $end) { - $endToken = $endLine; - $addedContent = ''; - } else { - $endToken = $end; - $addedContent = $phpcsFile->eolChar; - - if ($tokens[$end]['code'] !== T_SEMICOLON - && $tokens[$end]['code'] !== T_CLOSE_CURLY_BRACKET - ) { - $phpcsFile->fixer->addContent($end, '; '); - } - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($endToken + 1), null, true); - if ($next !== false - && ($tokens[$next]['code'] === T_ELSE - || $tokens[$next]['code'] === T_ELSEIF) - ) { - $phpcsFile->fixer->addContentBefore($next, '} '); - } else { - $indent = ''; - for ($first = $stackPtr; $first > 0; $first--) { - if ($tokens[$first]['column'] === 1) { - break; - } - } - - if ($tokens[$first]['code'] === T_WHITESPACE) { - $indent = $tokens[$first]['content']; - } else if ($tokens[$first]['code'] === T_INLINE_HTML - || $tokens[$first]['code'] === T_OPEN_TAG - ) { - $addedContent = ''; - } - - $addedContent .= $indent.'}'; - if ($next !== false && $tokens[$endToken]['code'] === T_COMMENT) { - $addedContent .= $phpcsFile->eolChar; - } - - $phpcsFile->fixer->addContent($endToken, $addedContent); - }//end if - } else { - if ($nextContent === false || $tokens[$nextContent]['line'] !== $tokens[$end]['line']) { - // Account for a comment on the end of the line. - for ($endLine = $end; $endLine < $phpcsFile->numTokens; $endLine++) { - if (isset($tokens[($endLine + 1)]) === false - || $tokens[$endLine]['line'] !== $tokens[($endLine + 1)]['line'] - ) { - break; - } - } - - if ($tokens[$endLine]['code'] !== T_COMMENT - && ($tokens[$endLine]['code'] !== T_WHITESPACE - || $tokens[($endLine - 1)]['code'] !== T_COMMENT) - ) { - $endLine = $end; - } - } - - if ($endLine !== $end) { - $phpcsFile->fixer->replaceToken($end, ''); - $phpcsFile->fixer->addNewlineBefore($endLine); - $phpcsFile->fixer->addContent($endLine, '}'); - } else { - $phpcsFile->fixer->replaceToken($end, '}'); - } - }//end if - - $phpcsFile->fixer->endChangeset(); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/CSSLintSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/CSSLintSniff.php deleted file mode 100644 index d299dc8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/CSSLintSniff.php +++ /dev/null @@ -1,95 +0,0 @@ - - * @copyright 2013-2014 Roman Levishchenko - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class CSSLintSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $csslintPath = Config::getExecutablePath('csslint'); - if ($csslintPath === null) { - return; - } - - $fileName = $phpcsFile->getFilename(); - - $cmd = escapeshellcmd($csslintPath).' '.escapeshellarg($fileName).' 2>&1'; - exec($cmd, $output, $retval); - - if (is_array($output) === false) { - return; - } - - $count = count($output); - - for ($i = 0; $i < $count; $i++) { - $matches = []; - $numMatches = preg_match( - '/(error|warning) at line (\d+)/', - $output[$i], - $matches - ); - - if ($numMatches === 0) { - continue; - } - - $line = (int) $matches[2]; - $message = 'csslint says: '.$output[($i + 1)]; - // First line is message with error line and error code. - // Second is error message. - // Third is wrong line in file. - // Fourth is empty line. - $i += 4; - - $phpcsFile->addWarningOnLine($message, $line, 'ExternalTool'); - }//end for - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ClosureLinterSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ClosureLinterSniff.php deleted file mode 100644 index f6b6b72..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ClosureLinterSniff.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClosureLinterSniff implements Sniff -{ - - /** - * A list of error codes that should show errors. - * - * All other error codes will show warnings. - * - * @var integer - */ - public $errorCodes = []; - - /** - * A list of error codes to ignore. - * - * @var integer - */ - public $ignoreCodes = []; - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If jslint.js could not be run - */ - public function process(File $phpcsFile, $stackPtr) - { - $lintPath = Config::getExecutablePath('gjslint'); - if ($lintPath === null) { - return; - } - - $fileName = $phpcsFile->getFilename(); - - $lintPath = escapeshellcmd($lintPath); - $cmd = $lintPath.' --nosummary --notime --unix_mode '.escapeshellarg($fileName); - exec($cmd, $output, $retval); - - if (is_array($output) === false) { - return; - } - - foreach ($output as $finding) { - $matches = []; - $numMatches = preg_match('/^(.*):([0-9]+):\(.*?([0-9]+)\)(.*)$/', $finding, $matches); - if ($numMatches === 0) { - continue; - } - - // Skip error codes we are ignoring. - $code = $matches[3]; - if (in_array($code, $this->ignoreCodes) === true) { - continue; - } - - $line = (int) $matches[2]; - $error = trim($matches[4]); - - $message = 'gjslint says: (%s) %s'; - $data = [ - $code, - $error, - ]; - if (in_array($code, $this->errorCodes) === true) { - $phpcsFile->addErrorOnLine($message, $line, 'ExternalToolError', $data); - } else { - $phpcsFile->addWarningOnLine($message, $line, 'ExternalTool', $data); - } - }//end foreach - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ESLintSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ESLintSniff.php deleted file mode 100644 index 081c3c1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ESLintSniff.php +++ /dev/null @@ -1,112 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ESLintSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - /** - * ESLint configuration file path. - * - * @var string|null Path to eslintrc. Null to autodetect. - */ - public $configFile = null; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If jshint.js could not be run - */ - public function process(File $phpcsFile, $stackPtr) - { - $eslintPath = Config::getExecutablePath('eslint'); - if ($eslintPath === null) { - return; - } - - $filename = $phpcsFile->getFilename(); - - $configFile = $this->configFile; - if (empty($configFile) === true) { - // Attempt to autodetect. - $candidates = glob('.eslintrc{.js,.yaml,.yml,.json}', GLOB_BRACE); - if (empty($candidates) === false) { - $configFile = $candidates[0]; - } - } - - $eslintOptions = ['--format json']; - if (empty($configFile) === false) { - $eslintOptions[] = '--config '.escapeshellarg($configFile); - } - - $cmd = escapeshellcmd(escapeshellarg($eslintPath).' '.implode(' ', $eslintOptions).' '.escapeshellarg($filename)); - - // Execute! - exec($cmd, $stdout, $code); - - if ($code <= 0) { - // No errors, continue. - return ($phpcsFile->numTokens + 1); - } - - $data = json_decode(implode("\n", $stdout)); - if (json_last_error() !== JSON_ERROR_NONE) { - // Ignore any errors. - return ($phpcsFile->numTokens + 1); - } - - // Data is a list of files, but we only pass a single one. - $messages = $data[0]->messages; - foreach ($messages as $error) { - $message = 'eslint says: '.$error->message; - if (empty($error->fatal) === false || $error->severity === 2) { - $phpcsFile->addErrorOnLine($message, $error->line, 'ExternalTool'); - } else { - $phpcsFile->addWarningOnLine($message, $error->line, 'ExternalTool'); - } - } - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/JSHintSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/JSHintSniff.php deleted file mode 100644 index 8e1f18b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/JSHintSniff.php +++ /dev/null @@ -1,94 +0,0 @@ - - * @author Alexander Wei§ - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class JSHintSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If jshint.js could not be run - */ - public function process(File $phpcsFile, $stackPtr) - { - $rhinoPath = Config::getExecutablePath('rhino'); - $jshintPath = Config::getExecutablePath('jshint'); - if ($rhinoPath === null && $jshintPath === null) { - return; - } - - $fileName = $phpcsFile->getFilename(); - $jshintPath = escapeshellcmd($jshintPath); - - if ($rhinoPath !== null) { - $rhinoPath = escapeshellcmd($rhinoPath); - $cmd = "$rhinoPath \"$jshintPath\" ".escapeshellarg($fileName); - exec($cmd, $output, $retval); - - $regex = '`^(?P.+)\(.+:(?P[0-9]+).*:[0-9]+\)$`'; - } else { - $cmd = "$jshintPath ".escapeshellarg($fileName); - exec($cmd, $output, $retval); - - $regex = '`^(.+?): line (?P[0-9]+), col [0-9]+, (?P.+)$`'; - } - - if (is_array($output) === true) { - foreach ($output as $finding) { - $matches = []; - $numMatches = preg_match($regex, $finding, $matches); - if ($numMatches === 0) { - continue; - } - - $line = (int) $matches['line']; - $message = 'jshint says: '.trim($matches['error']); - $phpcsFile->addWarningOnLine($message, $line, 'ExternalTool'); - } - } - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ByteOrderMarkSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ByteOrderMarkSniff.php deleted file mode 100644 index cee8ecc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ByteOrderMarkSniff.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2010-2014 mediaSELF Sp. z o.o. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ByteOrderMarkSniff implements Sniff -{ - - /** - * List of supported BOM definitions. - * - * Use encoding names as keys and hex BOM representations as values. - * - * @var array - */ - protected $bomDefinitions = [ - 'UTF-8' => 'efbbbf', - 'UTF-16 (BE)' => 'feff', - 'UTF-16 (LE)' => 'fffe', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_INLINE_HTML]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // The BOM will be the very first token in the file. - if ($stackPtr !== 0) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - foreach ($this->bomDefinitions as $bomName => $expectedBomHex) { - $bomByteLength = (strlen($expectedBomHex) / 2); - $htmlBomHex = bin2hex(substr($tokens[$stackPtr]['content'], 0, $bomByteLength)); - if ($htmlBomHex === $expectedBomHex) { - $errorData = [$bomName]; - $error = 'File contains %s byte order mark, which may corrupt your application'; - $phpcsFile->addError($error, $stackPtr, 'Found', $errorData); - $phpcsFile->recordMetric($stackPtr, 'Using byte order mark', 'yes'); - return; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Using byte order mark', 'no'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNewlineSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNewlineSniff.php deleted file mode 100644 index ee52a1b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNewlineSniff.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class EndFileNewlineSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - 'CSS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - // Skip to the end of the file. - $tokens = $phpcsFile->getTokens(); - $stackPtr = ($phpcsFile->numTokens - 1); - - if ($tokens[$stackPtr]['content'] === '') { - $stackPtr--; - } - - $eolCharLen = strlen($phpcsFile->eolChar); - $lastChars = substr($tokens[$stackPtr]['content'], ($eolCharLen * -1)); - if ($lastChars !== $phpcsFile->eolChar) { - $phpcsFile->recordMetric($stackPtr, 'Newline at EOF', 'no'); - - $error = 'File must end with a newline character'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotFound'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($stackPtr); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Newline at EOF', 'yes'); - } - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNoNewlineSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNoNewlineSniff.php deleted file mode 100644 index 2c7fcd3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNoNewlineSniff.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class EndFileNoNewlineSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - 'CSS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - // Skip to the end of the file. - $tokens = $phpcsFile->getTokens(); - $stackPtr = ($phpcsFile->numTokens - 1); - - if ($tokens[$stackPtr]['content'] === '') { - --$stackPtr; - } - - $eolCharLen = strlen($phpcsFile->eolChar); - $lastChars = substr($tokens[$stackPtr]['content'], ($eolCharLen * -1)); - if ($lastChars === $phpcsFile->eolChar) { - $error = 'File must not end with a newline character'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Found'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = $stackPtr; $i > 0; $i--) { - $newContent = rtrim($tokens[$i]['content'], $phpcsFile->eolChar); - $phpcsFile->fixer->replaceToken($i, $newContent); - - if ($newContent !== '') { - break; - } - } - - $phpcsFile->fixer->endChangeset(); - } - } - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ExecutableFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ExecutableFileSniff.php deleted file mode 100644 index 51534bf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ExecutableFileSniff.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2019 Matthew Peveler - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ExecutableFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $filename = $phpcsFile->getFilename(); - - if ($filename !== 'STDIN') { - $perms = fileperms($phpcsFile->getFilename()); - if (($perms & 0x0040) !== 0 || ($perms & 0x0008) !== 0 || ($perms & 0x0001) !== 0) { - $error = 'A PHP file should not be executable; found file permissions set to %s'; - $data = [substr(sprintf('%o', $perms), -4)]; - $phpcsFile->addError($error, 0, 'Executable', $data); - } - } - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/InlineHTMLSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/InlineHTMLSniff.php deleted file mode 100644 index eb01da8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/InlineHTMLSniff.php +++ /dev/null @@ -1,79 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class InlineHTMLSniff implements Sniff -{ - - /** - * List of supported BOM definitions. - * - * Use encoding names as keys and hex BOM representations as values. - * - * @var array - */ - protected $bomDefinitions = [ - 'UTF-8' => 'efbbbf', - 'UTF-16 (BE)' => 'feff', - 'UTF-16 (LE)' => 'fffe', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_INLINE_HTML]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int|null - */ - public function process(File $phpcsFile, $stackPtr) - { - // Allow a byte-order mark. - $tokens = $phpcsFile->getTokens(); - foreach ($this->bomDefinitions as $bomName => $expectedBomHex) { - $bomByteLength = (strlen($expectedBomHex) / 2); - $htmlBomHex = bin2hex(substr($tokens[0]['content'], 0, $bomByteLength)); - if ($htmlBomHex === $expectedBomHex && strlen($tokens[0]['content']) === $bomByteLength) { - return; - } - } - - // Ignore shebang lines. - $tokens = $phpcsFile->getTokens(); - if (substr($tokens[$stackPtr]['content'], 0, 2) === '#!') { - return; - } - - $error = 'PHP files must only contain PHP code'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineEndingsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineEndingsSniff.php deleted file mode 100644 index 763e786..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineEndingsSniff.php +++ /dev/null @@ -1,145 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class LineEndingsSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - 'CSS', - ]; - - /** - * The valid EOL character. - * - * @var string - */ - public $eolChar = '\n'; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $found = $phpcsFile->eolChar; - $found = str_replace("\n", '\n', $found); - $found = str_replace("\r", '\r', $found); - - $phpcsFile->recordMetric($stackPtr, 'EOL char', $found); - - if ($found === $this->eolChar) { - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - } - - // Check for single line files without an EOL. This is a very special - // case and the EOL char is set to \n when this happens. - if ($found === '\n') { - $tokens = $phpcsFile->getTokens(); - $lastToken = ($phpcsFile->numTokens - 1); - if ($tokens[$lastToken]['line'] === 1 - && $tokens[$lastToken]['content'] !== "\n" - ) { - return; - } - } - - $error = 'End of line character is invalid; expected "%s" but found "%s"'; - $expected = $this->eolChar; - $expected = str_replace("\n", '\n', $expected); - $expected = str_replace("\r", '\r', $expected); - $data = [ - $expected, - $found, - ]; - - // Errors are always reported on line 1, no matter where the first PHP tag is. - $fix = $phpcsFile->addFixableError($error, 0, 'InvalidEOLChar', $data); - - if ($fix === true) { - $tokens = $phpcsFile->getTokens(); - switch ($this->eolChar) { - case '\n': - $eolChar = "\n"; - break; - case '\r': - $eolChar = "\r"; - break; - case '\r\n': - $eolChar = "\r\n"; - break; - default: - $eolChar = $this->eolChar; - break; - } - - for ($i = 0; $i < $phpcsFile->numTokens; $i++) { - if (isset($tokens[($i + 1)]) === true - && $tokens[($i + 1)]['line'] <= $tokens[$i]['line'] - ) { - continue; - } - - // Token is the last on a line. - if (isset($tokens[$i]['orig_content']) === true) { - $tokenContent = $tokens[$i]['orig_content']; - } else { - $tokenContent = $tokens[$i]['content']; - } - - if ($tokenContent === '') { - // Special case for JS/CSS close tag. - continue; - } - - $newContent = rtrim($tokenContent, "\r\n"); - $newContent .= $eolChar; - if ($tokenContent !== $newContent) { - $phpcsFile->fixer->replaceToken($i, $newContent); - } - }//end for - }//end if - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineLengthSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineLengthSniff.php deleted file mode 100644 index 5aa45ea..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineLengthSniff.php +++ /dev/null @@ -1,201 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class LineLengthSniff implements Sniff -{ - - /** - * The limit that the length of a line should not exceed. - * - * @var integer - */ - public $lineLimit = 80; - - /** - * The limit that the length of a line must not exceed. - * - * Set to zero (0) to disable. - * - * @var integer - */ - public $absoluteLineLimit = 100; - - /** - * Whether or not to ignore trailing comments. - * - * This has the effect of also ignoring all lines - * that only contain comments. - * - * @var boolean - */ - public $ignoreComments = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - for ($i = 1; $i < $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['column'] === 1) { - $this->checkLineLength($phpcsFile, $tokens, $i); - } - } - - $this->checkLineLength($phpcsFile, $tokens, $i); - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - - /** - * Checks if a line is too long. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tokens The token stack. - * @param int $stackPtr The first token on the next line. - * - * @return void - */ - protected function checkLineLength($phpcsFile, $tokens, $stackPtr) - { - // The passed token is the first on the line. - $stackPtr--; - - if ($tokens[$stackPtr]['column'] === 1 - && $tokens[$stackPtr]['length'] === 0 - ) { - // Blank line. - return; - } - - if ($tokens[$stackPtr]['column'] !== 1 - && $tokens[$stackPtr]['content'] === $phpcsFile->eolChar - ) { - $stackPtr--; - } - - $onlyComment = false; - if (isset(Tokens::$commentTokens[$tokens[$stackPtr]['code']]) === true) { - $prevNonWhiteSpace = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$stackPtr]['line'] !== $tokens[$prevNonWhiteSpace]['line']) { - $onlyComment = true; - } - } - - if ($onlyComment === true - && isset(Tokens::$phpcsCommentTokens[$tokens[$stackPtr]['code']]) === true - ) { - // Ignore PHPCS annotation comments that are on a line by themselves. - return; - } - - $lineLength = ($tokens[$stackPtr]['column'] + $tokens[$stackPtr]['length'] - 1); - - if ($this->ignoreComments === true - && isset(Tokens::$commentTokens[$tokens[$stackPtr]['code']]) === true - ) { - // Trailing comments are being ignored in line length calculations. - if ($onlyComment === true) { - // The comment is the only thing on the line, so no need to check length. - return; - } - - $lineLength -= $tokens[$stackPtr]['length']; - } - - // Record metrics for common line length groupings. - if ($lineLength <= 80) { - $phpcsFile->recordMetric($stackPtr, 'Line length', '80 or less'); - } else if ($lineLength <= 120) { - $phpcsFile->recordMetric($stackPtr, 'Line length', '81-120'); - } else if ($lineLength <= 150) { - $phpcsFile->recordMetric($stackPtr, 'Line length', '121-150'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Line length', '151 or more'); - } - - if ($onlyComment === true) { - // If this is a long comment, check if it can be broken up onto multiple lines. - // Some comments contain unbreakable strings like URLs and so it makes sense - // to ignore the line length in these cases if the URL would be longer than the max - // line length once you indent it to the correct level. - if ($lineLength > $this->lineLimit) { - $oldLength = strlen($tokens[$stackPtr]['content']); - $newLength = strlen(ltrim($tokens[$stackPtr]['content'], "/#\t ")); - $indent = (($tokens[$stackPtr]['column'] - 1) + ($oldLength - $newLength)); - - $nonBreakingLength = $tokens[$stackPtr]['length']; - - $space = strrpos($tokens[$stackPtr]['content'], ' '); - if ($space !== false) { - $nonBreakingLength -= ($space + 1); - } - - if (($nonBreakingLength + $indent) > $this->lineLimit) { - return; - } - } - }//end if - - if ($this->absoluteLineLimit > 0 - && $lineLength > $this->absoluteLineLimit - ) { - $data = [ - $this->absoluteLineLimit, - $lineLength, - ]; - - $error = 'Line exceeds maximum limit of %s characters; contains %s characters'; - $phpcsFile->addError($error, $stackPtr, 'MaxExceeded', $data); - } else if ($lineLength > $this->lineLimit) { - $data = [ - $this->lineLimit, - $lineLength, - ]; - - $warning = 'Line exceeds %s characters; contains %s characters'; - $phpcsFile->addWarning($warning, $stackPtr, 'TooLong', $data); - } - - }//end checkLineLength() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LowercasedFilenameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LowercasedFilenameSniff.php deleted file mode 100644 index 2f442b1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LowercasedFilenameSniff.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2010-2014 Andy Grunwald - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class LowercasedFilenameSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $filename = $phpcsFile->getFilename(); - if ($filename === 'STDIN') { - return; - } - - $filename = basename($filename); - $lowercaseFilename = strtolower($filename); - if ($filename !== $lowercaseFilename) { - $data = [ - $filename, - $lowercaseFilename, - ]; - $error = 'Filename "%s" doesn\'t match the expected filename "%s"'; - $phpcsFile->addError($error, $stackPtr, 'NotFound', $data); - $phpcsFile->recordMetric($stackPtr, 'Lowercase filename', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Lowercase filename', 'yes'); - } - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneClassPerFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneClassPerFileSniff.php deleted file mode 100644 index 9bcc00c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneClassPerFileSniff.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2010-2014 Andy Grunwald - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OneClassPerFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CLASS]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $nextClass = $phpcsFile->findNext($this->register(), ($stackPtr + 1)); - if ($nextClass !== false) { - $error = 'Only one class is allowed in a file'; - $phpcsFile->addError($error, $nextClass, 'MultipleFound'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneInterfacePerFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneInterfacePerFileSniff.php deleted file mode 100644 index f7cfa8d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneInterfacePerFileSniff.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2010-2014 Andy Grunwald - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OneInterfacePerFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_INTERFACE]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $nextInterface = $phpcsFile->findNext($this->register(), ($stackPtr + 1)); - if ($nextInterface !== false) { - $error = 'Only one interface is allowed in a file'; - $phpcsFile->addError($error, $nextInterface, 'MultipleFound'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneObjectStructurePerFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneObjectStructurePerFileSniff.php deleted file mode 100644 index d9d71b6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneObjectStructurePerFileSniff.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OneObjectStructurePerFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $nextClass = $phpcsFile->findNext($this->register(), ($stackPtr + 1)); - if ($nextClass !== false) { - $error = 'Only one object structure is allowed in a file'; - $phpcsFile->addError($error, $nextClass, 'MultipleFound'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneTraitPerFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneTraitPerFileSniff.php deleted file mode 100644 index dd97da8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneTraitPerFileSniff.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2010-2014 Alexander Obuhovich - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OneTraitPerFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_TRAIT]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $nextClass = $phpcsFile->findNext($this->register(), ($stackPtr + 1)); - if ($nextClass !== false) { - $error = 'Only one trait is allowed in a file'; - $phpcsFile->addError($error, $nextClass, 'MultipleFound'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php deleted file mode 100644 index d67bb76..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowMultipleStatementsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_SEMICOLON]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $fixable = true; - $prev = $stackPtr; - - do { - $prev = $phpcsFile->findPrevious([T_SEMICOLON, T_OPEN_TAG, T_OPEN_TAG_WITH_ECHO, T_PHPCS_IGNORE], ($prev - 1)); - if ($prev === false - || $tokens[$prev]['code'] === T_OPEN_TAG - || $tokens[$prev]['code'] === T_OPEN_TAG_WITH_ECHO - ) { - $phpcsFile->recordMetric($stackPtr, 'Multiple statements on same line', 'no'); - return; - } - - if ($tokens[$prev]['code'] === T_PHPCS_IGNORE) { - $fixable = false; - } - } while ($tokens[$prev]['code'] === T_PHPCS_IGNORE); - - // Ignore multiple statements in a FOR condition. - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - foreach ($tokens[$stackPtr]['nested_parenthesis'] as $bracket) { - if (isset($tokens[$bracket]['parenthesis_owner']) === false) { - // Probably a closure sitting inside a function call. - continue; - } - - $owner = $tokens[$bracket]['parenthesis_owner']; - if ($tokens[$owner]['code'] === T_FOR) { - return; - } - } - } - - if ($tokens[$prev]['line'] === $tokens[$stackPtr]['line']) { - $phpcsFile->recordMetric($stackPtr, 'Multiple statements on same line', 'yes'); - - $error = 'Each PHP statement must be on a line by itself'; - $code = 'SameLine'; - if ($fixable === false) { - $phpcsFile->addError($error, $stackPtr, $code); - return; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $code); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($prev); - if ($tokens[($prev + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($prev + 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Multiple statements on same line', 'no'); - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php deleted file mode 100644 index ab7caa9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php +++ /dev/null @@ -1,403 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class MultipleStatementAlignmentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * If true, an error will be thrown; otherwise a warning. - * - * @var boolean - */ - public $error = false; - - /** - * The maximum amount of padding before the alignment is ignored. - * - * If the amount of padding required to align this assignment with the - * surrounding assignments exceeds this number, the assignment will be - * ignored and no errors or warnings will be thrown. - * - * @var integer - */ - public $maxPadding = 1000; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $tokens = Tokens::$assignmentTokens; - unset($tokens[T_DOUBLE_ARROW]); - return $tokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore assignments used in a condition, like an IF or FOR. - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - // If the parenthesis is on the same line as the assignment, - // then it should be ignored as it is specifically being grouped. - $parens = $tokens[$stackPtr]['nested_parenthesis']; - $lastParen = array_pop($parens); - if ($tokens[$lastParen]['line'] === $tokens[$stackPtr]['line']) { - return; - } - - foreach ($tokens[$stackPtr]['nested_parenthesis'] as $start => $end) { - if (isset($tokens[$start]['parenthesis_owner']) === true) { - return; - } - } - } - - $lastAssign = $this->checkAlignment($phpcsFile, $stackPtr); - return ($lastAssign + 1); - - }//end process() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $end The token where checking should end. - * If NULL, the entire file will be checked. - * - * @return int - */ - public function checkAlignment($phpcsFile, $stackPtr, $end=null) - { - $tokens = $phpcsFile->getTokens(); - - $assignments = []; - $prevAssign = null; - $lastLine = $tokens[$stackPtr]['line']; - $maxPadding = null; - $stopped = null; - $lastCode = $stackPtr; - $lastSemi = null; - $arrayEnd = null; - - if ($end === null) { - $end = $phpcsFile->numTokens; - } - - $find = Tokens::$assignmentTokens; - unset($find[T_DOUBLE_ARROW]); - - $scopes = Tokens::$scopeOpeners; - unset($scopes[T_CLOSURE]); - unset($scopes[T_ANON_CLASS]); - unset($scopes[T_OBJECT]); - - for ($assign = $stackPtr; $assign < $end; $assign++) { - if ($tokens[$assign]['level'] < $tokens[$stackPtr]['level']) { - // Statement is in a different context, so the block is over. - break; - } - - if (isset($scopes[$tokens[$assign]['code']]) === true - && isset($tokens[$assign]['scope_opener']) === true - && $tokens[$assign]['level'] === $tokens[$stackPtr]['level'] - ) { - break; - } - - if ($assign === $arrayEnd) { - $arrayEnd = null; - } - - if (isset($find[$tokens[$assign]['code']]) === false) { - // A blank line indicates that the assignment block has ended. - if (isset(Tokens::$emptyTokens[$tokens[$assign]['code']]) === false - && ($tokens[$assign]['line'] - $tokens[$lastCode]['line']) > 1 - && $tokens[$assign]['level'] === $tokens[$stackPtr]['level'] - && $arrayEnd === null - ) { - break; - } - - if ($tokens[$assign]['code'] === T_CLOSE_TAG) { - // Breaking out of PHP ends the assignment block. - break; - } - - if ($tokens[$assign]['code'] === T_OPEN_SHORT_ARRAY - && isset($tokens[$assign]['bracket_closer']) === true - ) { - $arrayEnd = $tokens[$assign]['bracket_closer']; - } - - if ($tokens[$assign]['code'] === T_ARRAY - && isset($tokens[$assign]['parenthesis_opener']) === true - && isset($tokens[$tokens[$assign]['parenthesis_opener']]['parenthesis_closer']) === true - ) { - $arrayEnd = $tokens[$tokens[$assign]['parenthesis_opener']]['parenthesis_closer']; - } - - if (isset(Tokens::$emptyTokens[$tokens[$assign]['code']]) === false) { - $lastCode = $assign; - - if ($tokens[$assign]['code'] === T_SEMICOLON) { - if ($tokens[$assign]['conditions'] === $tokens[$stackPtr]['conditions']) { - if ($lastSemi !== null && $prevAssign !== null && $lastSemi > $prevAssign) { - // This statement did not have an assignment operator in it. - break; - } else { - $lastSemi = $assign; - } - } else if ($tokens[$assign]['level'] < $tokens[$stackPtr]['level']) { - // Statement is in a different context, so the block is over. - break; - } - } - }//end if - - continue; - } else if ($assign !== $stackPtr && $tokens[$assign]['line'] === $lastLine) { - // Skip multiple assignments on the same line. We only need to - // try and align the first assignment. - continue; - }//end if - - if ($assign !== $stackPtr) { - if ($tokens[$assign]['level'] > $tokens[$stackPtr]['level']) { - // Has to be nested inside the same conditions as the first assignment. - // We've gone one level down, so process this new block. - $assign = $this->checkAlignment($phpcsFile, $assign); - $lastCode = $assign; - continue; - } else if ($tokens[$assign]['level'] < $tokens[$stackPtr]['level']) { - // We've gone one level up, so the block we are processing is done. - break; - } else if ($arrayEnd !== null) { - // Assignments inside arrays are not part of - // the original block, so process this new block. - $assign = ($this->checkAlignment($phpcsFile, $assign, $arrayEnd) - 1); - $arrayEnd = null; - $lastCode = $assign; - continue; - } - - // Make sure it is not assigned inside a condition (eg. IF, FOR). - if (isset($tokens[$assign]['nested_parenthesis']) === true) { - // If the parenthesis is on the same line as the assignment, - // then it should be ignored as it is specifically being grouped. - $parens = $tokens[$assign]['nested_parenthesis']; - $lastParen = array_pop($parens); - if ($tokens[$lastParen]['line'] === $tokens[$assign]['line']) { - break; - } - - foreach ($tokens[$assign]['nested_parenthesis'] as $start => $end) { - if (isset($tokens[$start]['parenthesis_owner']) === true) { - break(2); - } - } - } - }//end if - - $var = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($assign - 1), - null, - true - ); - - // Make sure we wouldn't break our max padding length if we - // aligned with this statement, or they wouldn't break the max - // padding length if they aligned with us. - $varEnd = $tokens[($var + 1)]['column']; - $assignLen = $tokens[$assign]['length']; - if ($assign !== $stackPtr) { - if ($prevAssign === null) { - // Processing an inner block but no assignments found. - break; - } - - if (($varEnd + 1) > $assignments[$prevAssign]['assign_col']) { - $padding = 1; - $assignColumn = ($varEnd + 1); - } else { - $padding = ($assignments[$prevAssign]['assign_col'] - $varEnd + $assignments[$prevAssign]['assign_len'] - $assignLen); - if ($padding <= 0) { - $padding = 1; - } - - if ($padding > $this->maxPadding) { - $stopped = $assign; - break; - } - - $assignColumn = ($varEnd + $padding); - }//end if - - if (($assignColumn + $assignLen) > ($assignments[$maxPadding]['assign_col'] + $assignments[$maxPadding]['assign_len'])) { - $newPadding = ($varEnd - $assignments[$maxPadding]['var_end'] + $assignLen - $assignments[$maxPadding]['assign_len'] + 1); - if ($newPadding > $this->maxPadding) { - $stopped = $assign; - break; - } else { - // New alignment settings for previous assignments. - foreach ($assignments as $i => $data) { - if ($i === $assign) { - break; - } - - $newPadding = ($varEnd - $data['var_end'] + $assignLen - $data['assign_len'] + 1); - $assignments[$i]['expected'] = $newPadding; - $assignments[$i]['assign_col'] = ($data['var_end'] + $newPadding); - } - - $padding = 1; - $assignColumn = ($varEnd + 1); - } - } else if ($padding > $assignments[$maxPadding]['expected']) { - $maxPadding = $assign; - }//end if - } else { - $padding = 1; - $assignColumn = ($varEnd + 1); - $maxPadding = $assign; - }//end if - - $found = 0; - if ($tokens[($var + 1)]['code'] === T_WHITESPACE) { - $found = $tokens[($var + 1)]['length']; - if ($found === 0) { - // This means a newline was found. - $found = 1; - } - } - - $assignments[$assign] = [ - 'var_end' => $varEnd, - 'assign_len' => $assignLen, - 'assign_col' => $assignColumn, - 'expected' => $padding, - 'found' => $found, - ]; - - $lastLine = $tokens[$assign]['line']; - $prevAssign = $assign; - }//end for - - if (empty($assignments) === true) { - return $stackPtr; - } - - $numAssignments = count($assignments); - - $errorGenerated = false; - foreach ($assignments as $assignment => $data) { - if ($data['found'] === $data['expected']) { - continue; - } - - $expectedText = $data['expected'].' space'; - if ($data['expected'] !== 1) { - $expectedText .= 's'; - } - - if ($data['found'] === null) { - $foundText = 'a new line'; - } else { - $foundText = $data['found'].' space'; - if ($data['found'] !== 1) { - $foundText .= 's'; - } - } - - if ($numAssignments === 1) { - $type = 'Incorrect'; - $error = 'Equals sign not aligned correctly; expected %s but found %s'; - } else { - $type = 'NotSame'; - $error = 'Equals sign not aligned with surrounding assignments; expected %s but found %s'; - } - - $errorData = [ - $expectedText, - $foundText, - ]; - - if ($this->error === true) { - $fix = $phpcsFile->addFixableError($error, $assignment, $type, $errorData); - } else { - $fix = $phpcsFile->addFixableWarning($error, $assignment, $type.'Warning', $errorData); - } - - $errorGenerated = true; - - if ($fix === true && $data['found'] !== null) { - $newContent = str_repeat(' ', $data['expected']); - if ($data['found'] === 0) { - $phpcsFile->fixer->addContentBefore($assignment, $newContent); - } else { - $phpcsFile->fixer->replaceToken(($assignment - 1), $newContent); - } - } - }//end foreach - - if ($numAssignments > 1) { - if ($errorGenerated === true) { - $phpcsFile->recordMetric($stackPtr, 'Adjacent assignments aligned', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Adjacent assignments aligned', 'yes'); - } - } - - if ($stopped !== null) { - return $this->checkAlignment($phpcsFile, $stopped); - } else { - return $assign; - } - - }//end checkAlignment() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php deleted file mode 100644 index f6a37da..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - * - * @deprecated 3.4.0 Use the Generic.Formatting.SpaceAfterCast sniff with - * the $spacing property set to 0 instead. - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class NoSpaceAfterCastSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$castTokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - return; - } - - $error = 'A cast statement must not be followed by a space'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceFound'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php deleted file mode 100644 index f19489e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php +++ /dev/null @@ -1,153 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SpaceAfterCastSniff implements Sniff -{ - - /** - * The number of spaces desired after a cast token. - * - * @var integer - */ - public $spacing = 1; - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$castTokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $this->spacing = (int) $this->spacing; - - if ($tokens[$stackPtr]['code'] === T_BINARY_CAST - && $tokens[$stackPtr]['content'] === 'b' - ) { - // You can't replace a space after this type of binary casting. - return; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - return; - } - - if ($this->ignoreNewlines === true - && $tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line'] - ) { - $phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', 'newline'); - return; - } - - if ($this->spacing === 0 && $nextNonEmpty === ($stackPtr + 1)) { - $phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', 0); - return; - } - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($nextNonEmpty !== $nextNonWhitespace) { - $error = 'Expected %s space(s) after cast statement; comment found'; - $data = [$this->spacing]; - $phpcsFile->addError($error, $stackPtr, 'CommentFound', $data); - - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', $tokens[($stackPtr + 1)]['length']); - } else { - $phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', 0); - } - - return; - } - - $found = 0; - if ($tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line']) { - $found = 'newline'; - } else if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $found = $tokens[($stackPtr + 1)]['length']; - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', $found); - - if ($found === $this->spacing) { - return; - } - - $error = 'Expected %s space(s) after cast statement; %s found'; - $data = [ - $this->spacing, - $found, - ]; - - $errorCode = 'TooMuchSpace'; - if ($this->spacing !== 0) { - if ($found === 0) { - $errorCode = 'NoSpace'; - } else if ($found !== 'newline' && $found < $this->spacing) { - $errorCode = 'TooLittleSpace'; - } - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); - - if ($fix === true) { - $padding = str_repeat(' ', $this->spacing); - if ($found === 0) { - $phpcsFile->fixer->addContent($stackPtr, $padding); - } else { - $phpcsFile->fixer->beginChangeset(); - $start = ($stackPtr + 1); - - if ($this->spacing > 0) { - $phpcsFile->fixer->replaceToken($start, $padding); - ++$start; - } - - for ($i = $start; $i < $nextNonWhitespace; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php deleted file mode 100644 index b74ca80..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php +++ /dev/null @@ -1,135 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SpaceAfterNotSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The number of spaces desired after the NOT operator. - * - * @var integer - */ - public $spacing = 1; - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_BOOLEAN_NOT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $this->spacing = (int) $this->spacing; - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - return; - } - - if ($this->ignoreNewlines === true - && $tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line'] - ) { - return; - } - - if ($this->spacing === 0 && $nextNonEmpty === ($stackPtr + 1)) { - return; - } - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($nextNonEmpty !== $nextNonWhitespace) { - $error = 'Expected %s space(s) after NOT operator; comment found'; - $data = [$this->spacing]; - $phpcsFile->addError($error, $stackPtr, 'CommentFound', $data); - return; - } - - $found = 0; - if ($tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line']) { - $found = 'newline'; - } else if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $found = $tokens[($stackPtr + 1)]['length']; - } - - if ($found === $this->spacing) { - return; - } - - $error = 'Expected %s space(s) after NOT operator; %s found'; - $data = [ - $this->spacing, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Incorrect', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->spacing); - if ($found === 0) { - $phpcsFile->fixer->addContent($stackPtr, $padding); - } else { - $phpcsFile->fixer->beginChangeset(); - $start = ($stackPtr + 1); - - if ($this->spacing > 0) { - $phpcsFile->fixer->replaceToken($start, $padding); - ++$start; - } - - for ($i = $start; $i < $nextNonWhitespace; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceBeforeCastSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceBeforeCastSniff.php deleted file mode 100644 index a4f85ae..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceBeforeCastSniff.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SpaceBeforeCastSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$castTokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['column'] === 1) { - return; - } - - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $error = 'A cast statement must be preceded by a single space'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpace'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing before cast statement', 0); - return; - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing before cast statement', $tokens[($stackPtr - 1)]['length']); - - if ($tokens[($stackPtr - 1)]['column'] !== 1 && $tokens[($stackPtr - 1)]['length'] !== 1) { - $error = 'A cast statement must be preceded by a single space'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'TooMuchSpace'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php deleted file mode 100644 index 425748c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php +++ /dev/null @@ -1,141 +0,0 @@ - - * @copyright 2009-2014 Florian Grandel - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class CallTimePassByReferenceSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_STRING, - T_VARIABLE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $findTokens = Tokens::$emptyTokens; - $findTokens[] = T_BITWISE_AND; - - $prev = $phpcsFile->findPrevious($findTokens, ($stackPtr - 1), null, true); - - // Skip tokens that are the names of functions or classes - // within their definitions. For example: function myFunction... - // "myFunction" is T_STRING but we should skip because it is not a - // function or method *call*. - $prevCode = $tokens[$prev]['code']; - if ($prevCode === T_FUNCTION || $prevCode === T_CLASS) { - return; - } - - // If the next non-whitespace token after the function or method call - // is not an opening parenthesis then it cant really be a *call*. - $functionName = $stackPtr; - $openBracket = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($functionName + 1), - null, - true - ); - - if ($tokens[$openBracket]['code'] !== T_OPEN_PARENTHESIS) { - return; - } - - if (isset($tokens[$openBracket]['parenthesis_closer']) === false) { - return; - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - $nextSeparator = $openBracket; - $find = [ - T_VARIABLE, - T_OPEN_SHORT_ARRAY, - ]; - - while (($nextSeparator = $phpcsFile->findNext($find, ($nextSeparator + 1), $closeBracket)) !== false) { - if (isset($tokens[$nextSeparator]['nested_parenthesis']) === false) { - continue; - } - - if ($tokens[$nextSeparator]['code'] === T_OPEN_SHORT_ARRAY) { - $nextSeparator = $tokens[$nextSeparator]['bracket_closer']; - continue; - } - - // Make sure the variable belongs directly to this function call - // and is not inside a nested function call or array. - $brackets = $tokens[$nextSeparator]['nested_parenthesis']; - $lastBracket = array_pop($brackets); - if ($lastBracket !== $closeBracket) { - continue; - } - - $tokenBefore = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($nextSeparator - 1), - null, - true - ); - - if ($tokens[$tokenBefore]['code'] === T_BITWISE_AND) { - if ($phpcsFile->isReference($tokenBefore) === false) { - continue; - } - - // We also want to ignore references used in assignment - // operations passed as function arguments, but isReference() - // sees them as valid references (which they are). - $tokenBefore = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($tokenBefore - 1), - null, - true - ); - - if (isset(Tokens::$assignmentTokens[$tokens[$tokenBefore]['code']]) === true) { - continue; - } - - // T_BITWISE_AND represents a pass-by-reference. - $error = 'Call-time pass-by-reference calls are prohibited'; - $phpcsFile->addError($error, $tokenBefore, 'NotAllowed'); - }//end if - }//end while - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php deleted file mode 100644 index ca92238..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php +++ /dev/null @@ -1,185 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionCallArgumentSpacingSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return[ - T_STRING, - T_ISSET, - T_UNSET, - T_SELF, - T_STATIC, - T_VARIABLE, - T_CLOSE_CURLY_BRACKET, - T_CLOSE_PARENTHESIS, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Skip tokens that are the names of functions or classes - // within their definitions. For example: - // function myFunction... - // "myFunction" is T_STRING but we should skip because it is not a - // function or method *call*. - $functionName = $stackPtr; - $ignoreTokens = Tokens::$emptyTokens; - $ignoreTokens[] = T_BITWISE_AND; - $functionKeyword = $phpcsFile->findPrevious($ignoreTokens, ($stackPtr - 1), null, true); - if ($tokens[$functionKeyword]['code'] === T_FUNCTION || $tokens[$functionKeyword]['code'] === T_CLASS) { - return; - } - - if ($tokens[$stackPtr]['code'] === T_CLOSE_CURLY_BRACKET - && isset($tokens[$stackPtr]['scope_condition']) === true - ) { - // Not a function call. - return; - } - - // If the next non-whitespace token after the function or method call - // is not an opening parenthesis then it can't really be a *call*. - $openBracket = $phpcsFile->findNext(Tokens::$emptyTokens, ($functionName + 1), null, true); - if ($tokens[$openBracket]['code'] !== T_OPEN_PARENTHESIS) { - return; - } - - if (isset($tokens[$openBracket]['parenthesis_closer']) === false) { - return; - } - - $this->checkSpacing($phpcsFile, $stackPtr, $openBracket); - - }//end process() - - - /** - * Checks the spacing around commas. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * - * @return void - */ - public function checkSpacing(File $phpcsFile, $stackPtr, $openBracket) - { - $tokens = $phpcsFile->getTokens(); - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - $nextSeparator = $openBracket; - - $find = [ - T_COMMA, - T_CLOSURE, - T_ANON_CLASS, - T_OPEN_SHORT_ARRAY, - ]; - - while (($nextSeparator = $phpcsFile->findNext($find, ($nextSeparator + 1), $closeBracket)) !== false) { - if ($tokens[$nextSeparator]['code'] === T_CLOSURE - || $tokens[$nextSeparator]['code'] === T_ANON_CLASS - ) { - // Skip closures. - $nextSeparator = $tokens[$nextSeparator]['scope_closer']; - continue; - } else if ($tokens[$nextSeparator]['code'] === T_OPEN_SHORT_ARRAY) { - // Skips arrays using short notation. - $nextSeparator = $tokens[$nextSeparator]['bracket_closer']; - continue; - } - - // Make sure the comma or variable belongs directly to this function call, - // and is not inside a nested function call or array. - $brackets = $tokens[$nextSeparator]['nested_parenthesis']; - $lastBracket = array_pop($brackets); - if ($lastBracket !== $closeBracket) { - continue; - } - - if ($tokens[$nextSeparator]['code'] === T_COMMA) { - if ($tokens[($nextSeparator - 1)]['code'] === T_WHITESPACE) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($nextSeparator - 2), null, true); - if (isset(Tokens::$heredocTokens[$tokens[$prev]['code']]) === false) { - $error = 'Space found before comma in argument list'; - $fix = $phpcsFile->addFixableError($error, $nextSeparator, 'SpaceBeforeComma'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - if ($tokens[$prev]['line'] !== $tokens[$nextSeparator]['line']) { - $phpcsFile->fixer->addContent($prev, ','); - $phpcsFile->fixer->replaceToken($nextSeparator, ''); - } else { - $phpcsFile->fixer->replaceToken(($nextSeparator - 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - if ($tokens[($nextSeparator + 1)]['code'] !== T_WHITESPACE) { - $error = 'No space found after comma in argument list'; - $fix = $phpcsFile->addFixableError($error, $nextSeparator, 'NoSpaceAfterComma'); - if ($fix === true) { - $phpcsFile->fixer->addContent($nextSeparator, ' '); - } - } else { - // If there is a newline in the space, then they must be formatting - // each argument on a newline, which is valid, so ignore it. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextSeparator + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$nextSeparator]['line']) { - $space = $tokens[($nextSeparator + 1)]['length']; - if ($space > 1) { - $error = 'Expected 1 space after comma in argument list; %s found'; - $data = [$space]; - $fix = $phpcsFile->addFixableError($error, $nextSeparator, 'TooMuchSpaceAfterComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($nextSeparator + 1), ' '); - } - } - } - }//end if - }//end if - }//end while - - }//end checkSpacing() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php deleted file mode 100644 index be1464d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php +++ /dev/null @@ -1,213 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class OpeningFunctionBraceBsdAllmanSniff implements Sniff -{ - - /** - * Should this sniff check function braces? - * - * @var boolean - */ - public $checkFunctions = true; - - /** - * Should this sniff check closure braces? - * - * @var boolean - */ - public $checkClosures = false; - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return int[] - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - if (($tokens[$stackPtr]['code'] === T_FUNCTION - && (bool) $this->checkFunctions === false) - || ($tokens[$stackPtr]['code'] === T_CLOSURE - && (bool) $this->checkClosures === false) - ) { - return; - } - - $openingBrace = $tokens[$stackPtr]['scope_opener']; - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - $openBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - } - } - - // Find the end of the function declaration. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($openingBrace - 1), $closeBracket, true); - - $functionLine = $tokens[$prev]['line']; - $braceLine = $tokens[$openingBrace]['line']; - - $lineDifference = ($braceLine - $functionLine); - - $metricType = 'Function'; - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $metricType = 'Closure'; - } - - if ($lineDifference === 0) { - $error = 'Opening brace should be on a new line'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'BraceOnSameLine'); - if ($fix === true) { - $hasTrailingAnnotation = false; - for ($nextLine = ($openingBrace + 1); $nextLine < $phpcsFile->numTokens; $nextLine++) { - if ($tokens[$openingBrace]['line'] !== $tokens[$nextLine]['line']) { - break; - } - - if (isset(Tokens::$phpcsCommentTokens[$tokens[$nextLine]['code']]) === true) { - $hasTrailingAnnotation = true; - } - } - - $phpcsFile->fixer->beginChangeset(); - $indent = $phpcsFile->findFirstOnLine([], $openingBrace); - - if ($hasTrailingAnnotation === false || $nextLine === false) { - if ($tokens[$indent]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->addContentBefore($openingBrace, $tokens[$indent]['content']); - } - - if ($tokens[($openingBrace - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($openingBrace - 1), ''); - } - - $phpcsFile->fixer->addNewlineBefore($openingBrace); - } else { - $phpcsFile->fixer->replaceToken($openingBrace, ''); - $phpcsFile->fixer->addNewlineBefore($nextLine); - $phpcsFile->fixer->addContentBefore($nextLine, '{'); - - if ($tokens[$indent]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->addContentBefore($nextLine, $tokens[$indent]['content']); - } - } - - $phpcsFile->fixer->endChangeset(); - }//end if - - $phpcsFile->recordMetric($stackPtr, "$metricType opening brace placement", 'same line'); - } else if ($lineDifference > 1) { - $error = 'Opening brace should be on the line after the declaration; found %s blank line(s)'; - $data = [($lineDifference - 1)]; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'BraceSpacing', $data); - if ($fix === true) { - for ($i = ($tokens[$stackPtr]['parenthesis_closer'] + 1); $i < $openingBrace; $i++) { - if ($tokens[$i]['line'] === $braceLine) { - $phpcsFile->fixer->addNewLineBefore($i); - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - } - }//end if - - $ignore = Tokens::$phpcsCommentTokens; - $ignore[] = T_WHITESPACE; - $next = $phpcsFile->findNext($ignore, ($openingBrace + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$openingBrace]['line']) { - if ($next === $tokens[$stackPtr]['scope_closer']) { - // Ignore empty functions. - return; - } - - $error = 'Opening brace must be the last content on the line'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'ContentAfterBrace'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($openingBrace); - } - } - - // Only continue checking if the opening brace looks good. - if ($lineDifference !== 1) { - return; - } - - // We need to actually find the first piece of content on this line, - // as if this is a method with tokens before it (public, static etc) - // or an if with an else before it, then we need to start the scope - // checking from there, rather than the current token. - $lineStart = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - - // The opening brace is on the correct line, now it needs to be - // checked to be correctly indented. - $startColumn = $tokens[$lineStart]['column']; - $braceIndent = $tokens[$openingBrace]['column']; - - if ($braceIndent !== $startColumn) { - $expected = ($startColumn - 1); - $found = ($braceIndent - 1); - - $error = 'Opening brace indented incorrectly; expected %s spaces, found %s'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'BraceIndent', $data); - if ($fix === true) { - $indent = str_repeat(' ', $expected); - if ($found === 0) { - $phpcsFile->fixer->addContentBefore($openingBrace, $indent); - } else { - $phpcsFile->fixer->replaceToken(($openingBrace - 1), $indent); - } - } - }//end if - - $phpcsFile->recordMetric($stackPtr, "$metricType opening brace placement", 'new line'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php deleted file mode 100644 index 62eafc1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php +++ /dev/null @@ -1,184 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class OpeningFunctionBraceKernighanRitchieSniff implements Sniff -{ - - /** - * Should this sniff check function braces? - * - * @var boolean - */ - public $checkFunctions = true; - - /** - * Should this sniff check closure braces? - * - * @var boolean - */ - public $checkClosures = false; - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return void - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - if (($tokens[$stackPtr]['code'] === T_FUNCTION - && (bool) $this->checkFunctions === false) - || ($tokens[$stackPtr]['code'] === T_CLOSURE - && (bool) $this->checkClosures === false) - ) { - return; - } - - $openingBrace = $tokens[$stackPtr]['scope_opener']; - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - $openBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - } - } - - // Find the end of the function declaration. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($openingBrace - 1), $closeBracket, true); - - $functionLine = $tokens[$prev]['line']; - $braceLine = $tokens[$openingBrace]['line']; - - $lineDifference = ($braceLine - $functionLine); - - $metricType = 'Function'; - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $metricType = 'Closure'; - } - - if ($lineDifference > 0) { - $phpcsFile->recordMetric($stackPtr, "$metricType opening brace placement", 'new line'); - $error = 'Opening brace should be on the same line as the declaration'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'BraceOnNewLine'); - if ($fix === true) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($openingBrace - 1), $closeBracket, true); - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($prev, ' {'); - $phpcsFile->fixer->replaceToken($openingBrace, ''); - if ($tokens[($openingBrace + 1)]['code'] === T_WHITESPACE - && $tokens[($openingBrace + 2)]['line'] > $tokens[$openingBrace]['line'] - ) { - // Brace is followed by a new line, so remove it to ensure we don't - // leave behind a blank line at the top of the block. - $phpcsFile->fixer->replaceToken(($openingBrace + 1), ''); - - if ($tokens[($openingBrace - 1)]['code'] === T_WHITESPACE - && $tokens[($openingBrace - 1)]['line'] === $tokens[$openingBrace]['line'] - && $tokens[($openingBrace - 2)]['line'] < $tokens[$openingBrace]['line'] - ) { - // Brace is preceded by indent, so remove it to ensure we don't - // leave behind more indent than is required for the first line. - $phpcsFile->fixer->replaceToken(($openingBrace - 1), ''); - } - } - - $phpcsFile->fixer->endChangeset(); - }//end if - } else { - $phpcsFile->recordMetric($stackPtr, "$metricType opening brace placement", 'same line'); - }//end if - - $ignore = Tokens::$phpcsCommentTokens; - $ignore[] = T_WHITESPACE; - $next = $phpcsFile->findNext($ignore, ($openingBrace + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$openingBrace]['line']) { - if ($next === $tokens[$stackPtr]['scope_closer'] - || $tokens[$next]['code'] === T_CLOSE_TAG - ) { - // Ignore empty functions. - return; - } - - $error = 'Opening brace must be the last content on the line'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'ContentAfterBrace'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($openingBrace); - } - } - - // Only continue checking if the opening brace looks good. - if ($lineDifference > 0) { - return; - } - - // We are looking for tabs, even if they have been replaced, because - // we enforce a space here. - if (isset($tokens[($openingBrace - 1)]['orig_content']) === true) { - $spacing = $tokens[($openingBrace - 1)]['orig_content']; - } else { - $spacing = $tokens[($openingBrace - 1)]['content']; - } - - if ($tokens[($openingBrace - 1)]['code'] !== T_WHITESPACE) { - $length = 0; - } else if ($spacing === "\t") { - $length = '\t'; - } else { - $length = strlen($spacing); - } - - if ($length !== 1) { - $error = 'Expected 1 space before opening brace; found %s'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'SpaceBeforeBrace', $data); - if ($fix === true) { - if ($length === 0 || $length === '\t') { - $phpcsFile->fixer->addContentBefore($openingBrace, ' '); - } else { - $phpcsFile->fixer->replaceToken(($openingBrace - 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php deleted file mode 100644 index df70df2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php +++ /dev/null @@ -1,113 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2007-2014 Mayflower GmbH - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class CyclomaticComplexitySniff implements Sniff -{ - - /** - * A complexity higher than this value will throw a warning. - * - * @var integer - */ - public $complexity = 10; - - /** - * A complexity higher than this value will throw an error. - * - * @var integer - */ - public $absoluteComplexity = 20; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore abstract methods. - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - // Detect start and end of this function definition. - $start = $tokens[$stackPtr]['scope_opener']; - $end = $tokens[$stackPtr]['scope_closer']; - - // Predicate nodes for PHP. - $find = [ - T_CASE => true, - T_DEFAULT => true, - T_CATCH => true, - T_IF => true, - T_FOR => true, - T_FOREACH => true, - T_WHILE => true, - T_DO => true, - T_ELSEIF => true, - ]; - - $complexity = 1; - - // Iterate from start to end and count predicate nodes. - for ($i = ($start + 1); $i < $end; $i++) { - if (isset($find[$tokens[$i]['code']]) === true) { - $complexity++; - } - } - - if ($complexity > $this->absoluteComplexity) { - $error = 'Function\'s cyclomatic complexity (%s) exceeds allowed maximum of %s'; - $data = [ - $complexity, - $this->absoluteComplexity, - ]; - $phpcsFile->addError($error, $stackPtr, 'MaxExceeded', $data); - } else if ($complexity > $this->complexity) { - $warning = 'Function\'s cyclomatic complexity (%s) exceeds %s; consider refactoring the function'; - $data = [ - $complexity, - $this->complexity, - ]; - $phpcsFile->addWarning($warning, $stackPtr, 'TooHigh', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php deleted file mode 100644 index d001ded..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php +++ /dev/null @@ -1,100 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2007-2014 Mayflower GmbH - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class NestingLevelSniff implements Sniff -{ - - /** - * A nesting level higher than this value will throw a warning. - * - * @var integer - */ - public $nestingLevel = 5; - - /** - * A nesting level higher than this value will throw an error. - * - * @var integer - */ - public $absoluteNestingLevel = 10; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore abstract methods. - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - // Detect start and end of this function definition. - $start = $tokens[$stackPtr]['scope_opener']; - $end = $tokens[$stackPtr]['scope_closer']; - - $nestingLevel = 0; - - // Find the maximum nesting level of any token in the function. - for ($i = ($start + 1); $i < $end; $i++) { - $level = $tokens[$i]['level']; - if ($nestingLevel < $level) { - $nestingLevel = $level; - } - } - - // We subtract the nesting level of the function itself. - $nestingLevel = ($nestingLevel - $tokens[$stackPtr]['level'] - 1); - - if ($nestingLevel > $this->absoluteNestingLevel) { - $error = 'Function\'s nesting level (%s) exceeds allowed maximum of %s'; - $data = [ - $nestingLevel, - $this->absoluteNestingLevel, - ]; - $phpcsFile->addError($error, $stackPtr, 'MaxExceeded', $data); - } else if ($nestingLevel > $this->nestingLevel) { - $warning = 'Function\'s nesting level (%s) exceeds %s; consider refactoring the function'; - $data = [ - $nestingLevel, - $this->nestingLevel, - ]; - $phpcsFile->addWarning($warning, $stackPtr, 'TooHigh', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/CamelCapsFunctionNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/CamelCapsFunctionNameSniff.php deleted file mode 100644 index 64e1268..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/CamelCapsFunctionNameSniff.php +++ /dev/null @@ -1,221 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class CamelCapsFunctionNameSniff extends AbstractScopeSniff -{ - - /** - * A list of all PHP magic methods. - * - * @var array - */ - protected $magicMethods = [ - 'construct' => true, - 'destruct' => true, - 'call' => true, - 'callstatic' => true, - 'get' => true, - 'set' => true, - 'isset' => true, - 'unset' => true, - 'sleep' => true, - 'wakeup' => true, - 'tostring' => true, - 'set_state' => true, - 'clone' => true, - 'invoke' => true, - 'debuginfo' => true, - ]; - - /** - * A list of all PHP non-magic methods starting with a double underscore. - * - * These come from PHP modules such as SOAPClient. - * - * @var array - */ - protected $methodsDoubleUnderscore = [ - 'dorequest' => true, - 'getcookies' => true, - 'getfunctions' => true, - 'getlastrequest' => true, - 'getlastrequestheaders' => true, - 'getlastresponse' => true, - 'getlastresponseheaders' => true, - 'gettypes' => true, - 'setcookie' => true, - 'setlocation' => true, - 'setsoapheaders' => true, - 'soapcall' => true, - ]; - - /** - * A list of all PHP magic functions. - * - * @var array - */ - protected $magicFunctions = ['autoload' => true]; - - /** - * If TRUE, the string must not have two capital letters next to each other. - * - * @var boolean - */ - public $strict = true; - - - /** - * Constructs a Generic_Sniffs_NamingConventions_CamelCapsFunctionNameSniff. - */ - public function __construct() - { - parent::__construct(Tokens::$ooScopeTokens, [T_FUNCTION], true); - - }//end __construct() - - - /** - * Processes the tokens within the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * @param int $currScope The position of the current scope. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Ignore closures. - return; - } - - $className = $phpcsFile->getDeclarationName($currScope); - if (isset($className) === false) { - $className = '[Anonymous Class]'; - } - - $errorData = [$className.'::'.$methodName]; - - $methodNameLc = strtolower($methodName); - $classNameLc = strtolower($className); - - // Is this a magic method. i.e., is prefixed with "__" ? - if (preg_match('|^__[^_]|', $methodName) !== 0) { - $magicPart = substr($methodNameLc, 2); - if (isset($this->magicMethods[$magicPart]) === true - || isset($this->methodsDoubleUnderscore[$magicPart]) === true - ) { - return; - } - - $error = 'Method name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $phpcsFile->addError($error, $stackPtr, 'MethodDoubleUnderscore', $errorData); - } - - // PHP4 constructors are allowed to break our rules. - if ($methodNameLc === $classNameLc) { - return; - } - - // PHP4 destructors are allowed to break our rules. - if ($methodNameLc === '_'.$classNameLc) { - return; - } - - // Ignore first underscore in methods prefixed with "_". - $methodName = ltrim($methodName, '_'); - - $methodProps = $phpcsFile->getMethodProperties($stackPtr); - if (Common::isCamelCaps($methodName, false, true, $this->strict) === false) { - if ($methodProps['scope_specified'] === true) { - $error = '%s method name "%s" is not in camel caps format'; - $data = [ - ucfirst($methodProps['scope']), - $errorData[0], - ]; - $phpcsFile->addError($error, $stackPtr, 'ScopeNotCamelCaps', $data); - } else { - $error = 'Method name "%s" is not in camel caps format'; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $errorData); - } - - $phpcsFile->recordMetric($stackPtr, 'CamelCase method name', 'no'); - return; - } else { - $phpcsFile->recordMetric($stackPtr, 'CamelCase method name', 'yes'); - } - - }//end processTokenWithinScope() - - - /** - * Processes the tokens outside the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if ($functionName === null) { - // Ignore closures. - return; - } - - $errorData = [$functionName]; - - // Is this a magic function. i.e., it is prefixed with "__". - if (preg_match('|^__[^_]|', $functionName) !== 0) { - $magicPart = strtolower(substr($functionName, 2)); - if (isset($this->magicFunctions[$magicPart]) === true) { - return; - } - - $error = 'Function name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $phpcsFile->addError($error, $stackPtr, 'FunctionDoubleUnderscore', $errorData); - } - - // Ignore first underscore in functions prefixed with "_". - $functionName = ltrim($functionName, '_'); - - if (Common::isCamelCaps($functionName, false, true, $this->strict) === false) { - $error = 'Function name "%s" is not in camel caps format'; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $errorData); - $phpcsFile->recordMetric($stackPtr, 'CamelCase function name', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'CamelCase method name', 'yes'); - } - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/ConstructorNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/ConstructorNameSniff.php deleted file mode 100644 index b7f5427..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/ConstructorNameSniff.php +++ /dev/null @@ -1,158 +0,0 @@ - - * @author Leif Wickland - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; - -class ConstructorNameSniff extends AbstractScopeSniff -{ - - /** - * The name of the class we are currently checking. - * - * @var string - */ - private $currentClass = ''; - - /** - * A list of functions in the current class. - * - * @var string[] - */ - private $functionList = []; - - - /** - * Constructs the test with the tokens it wishes to listen for. - */ - public function __construct() - { - parent::__construct([T_CLASS, T_ANON_CLASS], [T_FUNCTION], true); - - }//end __construct() - - - /** - * Processes this test when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $currScope A pointer to the start of the scope. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $className = strtolower($phpcsFile->getDeclarationName($currScope)); - if ($className !== $this->currentClass) { - $this->loadFunctionNamesInScope($phpcsFile, $currScope); - $this->currentClass = $className; - } - - $methodName = strtolower($phpcsFile->getDeclarationName($stackPtr)); - - if ($methodName === $className) { - if (in_array('__construct', $this->functionList, true) === false) { - $error = 'PHP4 style constructors are not allowed; use "__construct()" instead'; - $phpcsFile->addError($error, $stackPtr, 'OldStyle'); - } - } else if ($methodName !== '__construct') { - // Not a constructor. - return; - } - - // Stop if the constructor doesn't have a body, like when it is abstract. - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $parentClassName = strtolower($phpcsFile->findExtendedClassName($currScope)); - if ($parentClassName === false) { - return; - } - - $endFunctionIndex = $tokens[$stackPtr]['scope_closer']; - $startIndex = $stackPtr; - while (($doubleColonIndex = $phpcsFile->findNext(T_DOUBLE_COLON, $startIndex, $endFunctionIndex)) !== false) { - if ($tokens[($doubleColonIndex + 1)]['code'] === T_STRING - && strtolower($tokens[($doubleColonIndex + 1)]['content']) === $parentClassName - ) { - $error = 'PHP4 style calls to parent constructors are not allowed; use "parent::__construct()" instead'; - $phpcsFile->addError($error, ($doubleColonIndex + 1), 'OldStyleCall'); - } - - $startIndex = ($doubleColonIndex + 1); - } - - }//end processTokenWithinScope() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - - /** - * Extracts all the function names found in the given scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned. - * @param int $currScope A pointer to the start of the scope. - * - * @return void - */ - protected function loadFunctionNamesInScope(File $phpcsFile, $currScope) - { - $this->functionList = []; - $tokens = $phpcsFile->getTokens(); - - for ($i = ($tokens[$currScope]['scope_opener'] + 1); $i < $tokens[$currScope]['scope_closer']; $i++) { - if ($tokens[$i]['code'] !== T_FUNCTION) { - continue; - } - - $this->functionList[] = trim(strtolower($phpcsFile->getDeclarationName($i))); - - if (isset($tokens[$i]['scope_closer']) !== false) { - // Skip past nested functions and such. - $i = $tokens[$i]['scope_closer']; - } - } - - }//end loadFunctionNamesInScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php deleted file mode 100644 index e4173d9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php +++ /dev/null @@ -1,140 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UpperCaseConstantNameSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_STRING, - T_CONST, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_CONST) { - // This is a class constant. - $constant = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($constant === false) { - return; - } - - $constName = $tokens[$constant]['content']; - - if (strtoupper($constName) !== $constName) { - if (strtolower($constName) === $constName) { - $phpcsFile->recordMetric($constant, 'Constant name case', 'lower'); - } else { - $phpcsFile->recordMetric($constant, 'Constant name case', 'mixed'); - } - - $error = 'Class constants must be uppercase; expected %s but found %s'; - $data = [ - strtoupper($constName), - $constName, - ]; - $phpcsFile->addError($error, $constant, 'ClassConstantNotUpperCase', $data); - } else { - $phpcsFile->recordMetric($constant, 'Constant name case', 'upper'); - } - - return; - }//end if - - // Only interested in define statements now. - if (strtolower($tokens[$stackPtr]['content']) !== 'define') { - return; - } - - // Make sure this is not a method call. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_OBJECT_OPERATOR - || $tokens[$prev]['code'] === T_DOUBLE_COLON - ) { - return; - } - - // If the next non-whitespace token after this token - // is not an opening parenthesis then it is not a function call. - $openBracket = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($openBracket === false) { - return; - } - - // The next non-whitespace token must be the constant name. - $constPtr = $phpcsFile->findNext(T_WHITESPACE, ($openBracket + 1), null, true); - if ($tokens[$constPtr]['code'] !== T_CONSTANT_ENCAPSED_STRING) { - return; - } - - $constName = $tokens[$constPtr]['content']; - - // Check for constants like self::CONSTANT. - $prefix = ''; - $splitPos = strpos($constName, '::'); - if ($splitPos !== false) { - $prefix = substr($constName, 0, ($splitPos + 2)); - $constName = substr($constName, ($splitPos + 2)); - } - - // Strip namespace from constant like /foo/bar/CONSTANT. - $splitPos = strrpos($constName, '\\'); - if ($splitPos !== false) { - $prefix = substr($constName, 0, ($splitPos + 1)); - $constName = substr($constName, ($splitPos + 1)); - } - - if (strtoupper($constName) !== $constName) { - if (strtolower($constName) === $constName) { - $phpcsFile->recordMetric($stackPtr, 'Constant name case', 'lower'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Constant name case', 'mixed'); - } - - $error = 'Constants must be uppercase; expected %s but found %s'; - $data = [ - $prefix.strtoupper($constName), - $prefix.$constName, - ]; - $phpcsFile->addError($error, $stackPtr, 'ConstantNotUpperCase', $data); - } else { - $phpcsFile->recordMetric($stackPtr, 'Constant name case', 'upper'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/BacktickOperatorSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/BacktickOperatorSniff.php deleted file mode 100644 index d455845..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/BacktickOperatorSniff.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class BacktickOperatorSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_BACKTICK]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $error = 'Use of the backtick operator is forbidden'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php deleted file mode 100644 index f52180d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright 2010-2014 Andy Grunwald - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class CharacterBeforePHPOpeningTagSniff implements Sniff -{ - - /** - * List of supported BOM definitions. - * - * Use encoding names as keys and hex BOM representations as values. - * - * @var array - */ - protected $bomDefinitions = [ - 'UTF-8' => 'efbbbf', - 'UTF-16 (BE)' => 'feff', - 'UTF-16 (LE)' => 'fffe', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $expected = 0; - if ($stackPtr > 0) { - // Allow a byte-order mark. - $tokens = $phpcsFile->getTokens(); - foreach ($this->bomDefinitions as $bomName => $expectedBomHex) { - $bomByteLength = (strlen($expectedBomHex) / 2); - $htmlBomHex = bin2hex(substr($tokens[0]['content'], 0, $bomByteLength)); - if ($htmlBomHex === $expectedBomHex) { - $expected++; - break; - } - } - - // Allow a shebang line. - if (substr($tokens[0]['content'], 0, 2) === '#!') { - $expected++; - } - } - - if ($stackPtr !== $expected) { - $error = 'The opening PHP tag must be the first content in the file'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - } - - // Skip the rest of the file so we don't pick up additional - // open tags, typically embedded in HTML. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/ClosingPHPTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/ClosingPHPTagSniff.php deleted file mode 100644 index e59ed5f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/ClosingPHPTagSniff.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2010-2014 Stefano Kowalke - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClosingPHPTagSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $closeTag = $phpcsFile->findNext(T_CLOSE_TAG, $stackPtr); - if ($closeTag === false) { - $error = 'The PHP open tag does not have a corresponding PHP close tag'; - $phpcsFile->addError($error, $stackPtr, 'NotFound'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php deleted file mode 100644 index 42eaa40..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\PHP; - -class DeprecatedFunctionsSniff extends ForbiddenFunctionsSniff -{ - - /** - * A list of forbidden functions with their alternatives. - * - * The value is NULL if no alternative exists. IE, the - * function should just not be used. - * - * @var array - */ - public $forbiddenFunctions = []; - - - /** - * Constructor. - * - * Uses the Reflection API to get a list of deprecated functions. - */ - public function __construct() - { - $functions = get_defined_functions(); - - foreach ($functions['internal'] as $functionName) { - $function = new \ReflectionFunction($functionName); - - if ($function->isDeprecated() === true) { - $this->forbiddenFunctions[$functionName] = null; - } - } - - }//end __construct() - - - /** - * Generates the error or warning for this sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the forbidden function - * in the token array. - * @param string $function The name of the forbidden function. - * @param string $pattern The pattern used for the match. - * - * @return void - */ - protected function addError($phpcsFile, $stackPtr, $function, $pattern=null) - { - $data = [$function]; - $error = 'Function %s() has been deprecated'; - $type = 'Deprecated'; - - if ($this->error === true) { - $phpcsFile->addError($error, $stackPtr, $type, $data); - } else { - $phpcsFile->addWarning($error, $stackPtr, $type, $data); - } - - }//end addError() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowAlternativePHPTagsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowAlternativePHPTagsSniff.php deleted file mode 100644 index 433750a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowAlternativePHPTagsSniff.php +++ /dev/null @@ -1,253 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\PHP; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowAlternativePHPTagsSniff implements Sniff -{ - - /** - * Whether ASP tags are enabled or not. - * - * @var boolean - */ - private $aspTags = false; - - /** - * The current PHP version. - * - * @var integer - */ - private $phpVersion = null; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - if ($this->phpVersion === null) { - $this->phpVersion = Config::getConfigData('php_version'); - if ($this->phpVersion === null) { - $this->phpVersion = PHP_VERSION_ID; - } - } - - if ($this->phpVersion < 70000) { - $this->aspTags = (bool) ini_get('asp_tags'); - } - - return [ - T_OPEN_TAG, - T_OPEN_TAG_WITH_ECHO, - T_INLINE_HTML, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $openTag = $tokens[$stackPtr]; - $content = $openTag['content']; - - if (trim($content) === '') { - return; - } - - if ($openTag['code'] === T_OPEN_TAG) { - if ($content === '<%') { - $error = 'ASP style opening tag used; expected "findClosingTag($phpcsFile, $tokens, $stackPtr, '%>'); - $errorCode = 'ASPOpenTagFound'; - } else if (strpos($content, ''); - $errorCode = 'ScriptOpenTagFound'; - } - - if (isset($error, $closer, $errorCode) === true) { - $data = [$content]; - - if ($closer === false) { - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); - if ($fix === true) { - $this->addChangeset($phpcsFile, $tokens, $stackPtr, $closer); - } - } - } - - return; - }//end if - - if ($openTag['code'] === T_OPEN_TAG_WITH_ECHO && $content === '<%=') { - $error = 'ASP style opening tag used with echo; expected "findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - $snippet = $this->getSnippet($tokens[$nextVar]['content']); - $data = [ - $snippet, - $content, - $snippet, - ]; - - $closer = $this->findClosingTag($phpcsFile, $tokens, $stackPtr, '%>'); - - if ($closer === false) { - $phpcsFile->addError($error, $stackPtr, 'ASPShortOpenTagFound', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ASPShortOpenTagFound', $data); - if ($fix === true) { - $this->addChangeset($phpcsFile, $tokens, $stackPtr, $closer, true); - } - } - - return; - }//end if - - // Account for incorrect script open tags. - if ($openTag['code'] === T_INLINE_HTML - && preg_match('`( - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.1.inc.fixed deleted file mode 100644 index 2a695c8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.1.inc.fixed +++ /dev/null @@ -1,14 +0,0 @@ -
    - -Some content here. - - - - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc deleted file mode 100644 index cd5a662..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc +++ /dev/null @@ -1,6 +0,0 @@ -
    -<% echo $var; %> -

    Some text <% echo $var; %> and some more text

    -<%= $var . ' and some more text to make sure the snippet works'; %> -

    Some text <%= $var %> and some more text

    -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc.fixed deleted file mode 100644 index 6eafb42..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc.fixed +++ /dev/null @@ -1,6 +0,0 @@ -
    - -

    Some text and some more text

    - -

    Some text and some more text

    -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.3.inc deleted file mode 100644 index ba86345..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.3.inc +++ /dev/null @@ -1,7 +0,0 @@ - -
    -<% echo $var; %> -

    Some text <% echo $var; %> and some more text

    -<%= $var . ' and some more text to make sure the snippet works'; %> -

    Some text <%= $var %> and some more text

    -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.php deleted file mode 100644 index 953e8ad..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.php +++ /dev/null @@ -1,105 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowAlternativePHPTagsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of all test files to check. - * - * @param string $testFileBase The base path that the unit tests files will have. - * - * @return string[] - */ - protected function getTestFiles($testFileBase) - { - $testFiles = [$testFileBase.'1.inc']; - - $aspTags = false; - if (PHP_VERSION_ID < 70000) { - $aspTags = (bool) ini_get('asp_tags'); - } - - if ($aspTags === true) { - $testFiles[] = $testFileBase.'2.inc'; - } else { - $testFiles[] = $testFileBase.'3.inc'; - } - - return $testFiles; - - }//end getTestFiles() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'DisallowAlternativePHPTagsUnitTest.1.inc': - return [ - 4 => 1, - 7 => 1, - 8 => 1, - 11 => 1, - ]; - case 'DisallowAlternativePHPTagsUnitTest.2.inc': - return [ - 2 => 1, - 3 => 1, - 4 => 1, - 5 => 1, - ]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - if ($testFile === 'DisallowAlternativePHPTagsUnitTest.3.inc') { - return [ - 3 => 1, - 4 => 1, - 5 => 1, - 6 => 1, - ]; - } - - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.inc deleted file mode 100644 index 974e45c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.inc +++ /dev/null @@ -1,16 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.php deleted file mode 100644 index 7ece551..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowRequestSuperglobalUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - protected function getErrorList() - { - return [ - 2 => 1, - 12 => 1, - 13 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - protected function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc deleted file mode 100644 index 040e62d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc +++ /dev/null @@ -1,11 +0,0 @@ -
    - -Some content here. - - -Some content Some more content - - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc.fixed deleted file mode 100644 index 1ea281a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc.fixed +++ /dev/null @@ -1,11 +0,0 @@ -
    - -Some content here. - - -Some content Some more content - - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc deleted file mode 100644 index 85617de..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc +++ /dev/null @@ -1,8 +0,0 @@ -
    - -Some content Some more content - - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc.fixed deleted file mode 100644 index afe5d8f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc.fixed +++ /dev/null @@ -1,8 +0,0 @@ -
    - -Some content Some more content - - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.3.inc deleted file mode 100644 index 9b7ccd6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.3.inc +++ /dev/null @@ -1,16 +0,0 @@ -// Test warning for when short_open_tag is off. - -Some content Some more content - -// Test multi-line. -Some content Some more content - -// Make sure skipping works. -Some content Some more content - -// Only recognize closing tag after opener. -Some?> content - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowShortOpenTagUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of all test files to check. - * - * @param string $testFileBase The base path that the unit tests files will have. - * - * @return string[] - */ - protected function getTestFiles($testFileBase) - { - $testFiles = [$testFileBase.'1.inc']; - - $option = (bool) ini_get('short_open_tag'); - if ($option === true) { - $testFiles[] = $testFileBase.'2.inc'; - } else { - $testFiles[] = $testFileBase.'3.inc'; - } - - return $testFiles; - - }//end getTestFiles() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'DisallowShortOpenTagUnitTest.1.inc': - return [ - 5 => 1, - 6 => 1, - 7 => 1, - 10 => 1, - ]; - case 'DisallowShortOpenTagUnitTest.2.inc': - return [ - 2 => 1, - 3 => 1, - 4 => 1, - 7 => 1, - ]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'DisallowShortOpenTagUnitTest.1.inc': - return []; - case 'DisallowShortOpenTagUnitTest.3.inc': - return [ - 3 => 1, - 6 => 1, - 11 => 1, - ]; - default: - return []; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DiscourageGotoUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DiscourageGotoUnitTest.inc deleted file mode 100644 index f564215..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DiscourageGotoUnitTest.inc +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2006-2017 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DiscourageGotoUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 3 => 1, - 6 => 1, - 11 => 1, - 16 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.inc deleted file mode 100644 index 4659b73..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.inc +++ /dev/null @@ -1,57 +0,0 @@ -sizeof($array); -$size = $class->count($array); -$class->delete($filepath); -$class->unset($filepath); - -function delete() {} -function unset() {} -function sizeof() {} -function count() {} - -trait DelProvider { - public function delete() { - //irrelevant - } -} - -class LeftSideTest { - use DelProvider { - delete as protected unsetter; - } -} - -class RightSideTest { - use DelProvider { - delete as delete; - } -} - -class RightSideVisTest { - use DelProvider { - delete as protected delete; - DelProvider::delete insteadof delete; - } -} - -namespace Something\sizeof; -$var = new Sizeof(); -class SizeOf implements Something {} - -function mymodule_form_callback(SizeOf $sizeof) { -} - -?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.php deleted file mode 100644 index 760e807..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ForbiddenFunctionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - $errors = [ - 2 => 1, - 4 => 1, - 6 => 1, - ]; - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.inc deleted file mode 100644 index 63aea51..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.inc +++ /dev/null @@ -1,83 +0,0 @@ -NULL = 7; - -use Zend\Log\Writer\NULL as NullWriter; -new \Zend\Log\Writer\NULL(); - -namespace False; - -class True extends Null implements False {} - -use True\Something; -use Something\True; -class MyClass -{ - public function myFunction() - { - $var = array('foo' => new True()); - } -} - -$x = $f?FALSE:true; -$x = $f? FALSE:true; - -class MyClass -{ - // Spice things up a little. - const TRUE = false; -} - -var_dump(MyClass::TRUE); - -function tRUE() {} - -$input->getFilterChain()->attachByName('Null', ['type' => Null::TYPE_STRING]); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.inc.fixed deleted file mode 100644 index b3c3d8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.inc.fixed +++ /dev/null @@ -1,83 +0,0 @@ -NULL = 7; - -use Zend\Log\Writer\NULL as NullWriter; -new \Zend\Log\Writer\NULL(); - -namespace False; - -class True extends Null implements False {} - -use True\Something; -use Something\True; -class MyClass -{ - public function myFunction() - { - $var = array('foo' => new True()); - } -} - -$x = $f?false:true; -$x = $f? false:true; - -class MyClass -{ - // Spice things up a little. - const TRUE = false; -} - -var_dump(MyClass::TRUE); - -function tRUE() {} - -$input->getFilterChain()->attachByName('Null', ['type' => Null::TYPE_STRING]); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.js deleted file mode 100644 index 87cfb82..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.js +++ /dev/null @@ -1,14 +0,0 @@ -if (variable === true) { } -if (variable === TRUE) { } -if (variable === True) { } -variable = True; - -if (variable === false) { } -if (variable === FALSE) { } -if (variable === False) { } -variable = false; - -if (variable === null) { } -if (variable === NULL) { } -if (variable === Null) { } -variable = NULL; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.js.fixed deleted file mode 100644 index 7dbf3ad..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.js.fixed +++ /dev/null @@ -1,14 +0,0 @@ -if (variable === true) { } -if (variable === true) { } -if (variable === true) { } -variable = true; - -if (variable === false) { } -if (variable === false) { } -if (variable === false) { } -variable = false; - -if (variable === null) { } -if (variable === null) { } -if (variable === null) { } -variable = null; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.php deleted file mode 100644 index 85e8f70..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.php +++ /dev/null @@ -1,84 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LowerCaseConstantUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='LowerCaseConstantUnitTest.inc') - { - switch ($testFile) { - case 'LowerCaseConstantUnitTest.inc': - return [ - 7 => 1, - 10 => 1, - 15 => 1, - 16 => 1, - 23 => 1, - 26 => 1, - 31 => 1, - 32 => 1, - 39 => 1, - 42 => 1, - 47 => 1, - 48 => 1, - 70 => 1, - 71 => 1, - ]; - break; - case 'LowerCaseConstantUnitTest.js': - return [ - 2 => 1, - 3 => 1, - 4 => 1, - 7 => 1, - 8 => 1, - 12 => 1, - 13 => 1, - 14 => 1, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc deleted file mode 100644 index 96c2062..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc +++ /dev/null @@ -1,33 +0,0 @@ - $x; -__HALT_COMPILER(); // An exception due to phar support. -function diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc.fixed deleted file mode 100644 index f7d3b39..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc.fixed +++ /dev/null @@ -1,33 +0,0 @@ - $x; -__HALT_COMPILER(); // An exception due to phar support. -function diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.php deleted file mode 100644 index 2b92390..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LowerCaseKeywordUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 10 => 3, - 11 => 4, - 12 => 1, - 13 => 3, - 14 => 7, - 15 => 1, - 19 => 1, - 20 => 1, - 21 => 1, - 25 => 1, - 28 => 1, - 31 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc deleted file mode 100644 index f4e0dd4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc +++ /dev/null @@ -1,47 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LowerCaseTypeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 14 => 1, - 15 => 1, - 16 => 1, - 17 => 1, - 18 => 1, - 21 => 4, - 22 => 3, - 23 => 3, - 25 => 1, - 26 => 2, - 27 => 2, - 32 => 4, - 36 => 1, - 37 => 1, - 38 => 1, - 39 => 1, - 43 => 2, - 44 => 1, - 46 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.inc deleted file mode 100644 index 7ff31ba..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.inc +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.php deleted file mode 100644 index 40b509b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class NoSilencedErrorsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [5 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.1.inc deleted file mode 100644 index 387cec2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.1.inc +++ /dev/null @@ -1,8 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class RequireStrictTypesUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'RequireStrictTypesUnitTest.1.inc': - return []; - break; - } - - return [1 => 1]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.inc deleted file mode 100644 index 8f378c8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.inc +++ /dev/null @@ -1,4 +0,0 @@ -php_sapi_name() === true) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.php deleted file mode 100644 index 08c0ccd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class SAPIUsageUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [2 => 1]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.inc deleted file mode 100644 index 4f0d9d8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.inc +++ /dev/null @@ -1,4 +0,0 @@ - - * @author Blaine Schmeisser - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class SyntaxUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [3 => 1]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc deleted file mode 100644 index 965bf3b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc +++ /dev/null @@ -1,81 +0,0 @@ -null = 7; - -use Zend\Log\Writer\Null as NullWriter; -new \Zend\Log\Writer\Null(); - -namespace False; - -class True extends Null implements False {} - -use True\Something; -use Something\True; -class MyClass -{ - public function myFunction() - { - $var = array('foo' => new True()); - } -} - -$x = $f?false:TRUE; -$x = $f? false:TRUE; - -class MyClass -{ - // Spice things up a little. - const true = FALSE; -} - -var_dump(MyClass::true); - -function true() {} \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc.fixed deleted file mode 100644 index ae83dc9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc.fixed +++ /dev/null @@ -1,81 +0,0 @@ -null = 7; - -use Zend\Log\Writer\Null as NullWriter; -new \Zend\Log\Writer\Null(); - -namespace False; - -class True extends Null implements False {} - -use True\Something; -use Something\True; -class MyClass -{ - public function myFunction() - { - $var = array('foo' => new True()); - } -} - -$x = $f?FALSE:TRUE; -$x = $f? FALSE:TRUE; - -class MyClass -{ - // Spice things up a little. - const true = FALSE; -} - -var_dump(MyClass::true); - -function true() {} \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.php deleted file mode 100644 index 0bdafe6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class UpperCaseConstantUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 10 => 1, - 15 => 1, - 16 => 1, - 23 => 1, - 26 => 1, - 31 => 1, - 32 => 1, - 39 => 1, - 42 => 1, - 47 => 1, - 48 => 1, - 70 => 1, - 71 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.inc deleted file mode 100644 index 43c05a1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.inc +++ /dev/null @@ -1,21 +0,0 @@ -'; -$code = '<'.'?php '; - -$string = 'This is a really long string. ' - . 'It is being used for errors. ' - . 'The message is not translated.'; -?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.js deleted file mode 100644 index 6be7900..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.js +++ /dev/null @@ -1,15 +0,0 @@ -var x = 'My ' + 'string'; -var x = 'My ' + 1234; -var x = 'My ' + y + ' test'; - -this.errors['test'] = x; -this.errors['test' + 10] = x; -this.errors['test' + y] = x; -this.errors['test' + 'blah'] = x; -this.errors[y] = x; -this.errors[y + z] = x; -this.errors[y + z + 'My' + 'String'] = x; - -var long = 'This is a really long string. ' - + 'It is being used for errors. ' - + 'The message is not translated.'; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.php deleted file mode 100644 index 6a92848..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\Strings; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class UnnecessaryStringConcatUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='UnnecessaryStringConcatUnitTest.inc') - { - switch ($testFile) { - case 'UnnecessaryStringConcatUnitTest.inc': - return [ - 2 => 1, - 6 => 1, - 9 => 1, - 12 => 1, - 19 => 1, - 20 => 1, - ]; - break; - case 'UnnecessaryStringConcatUnitTest.js': - return [ - 1 => 1, - 8 => 1, - 11 => 1, - 14 => 1, - 15 => 1, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.css b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.css deleted file mode 100644 index de84a94..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.css +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This is a CSS comment. -<<<<<<< HEAD - * This is a merge conflict... -======= - * which should be detected. ->>>>>>> ref/heads/feature-branch - */ - -.SettingsTabPaneWidgetType-tab-mid { - background: transparent url(tab_inact_mid.png) repeat-x; -<<<<<<< HEAD - line-height: -25px; -======= - line-height: -20px; ->>>>>>> ref/heads/feature-branch - cursor: pointer; - -moz-user-select: none; -} - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries, subsequent boundaries will still - * be detected correctly. - */ - -/* - * This is a CSS comment. -<<<<<<< HEAD - * This is a merge conflict... -======= - * which should be detected. ->>>>>>> ref/heads/feature-branch - */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.inc deleted file mode 100644 index 470c3b8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.inc +++ /dev/null @@ -1,61 +0,0 @@ -> -1); -var_dump( -1 -<< --1 -); - -$string = -<< 'a' -<<<<<<< HEAD - 'b' => 'b' -======= - 'c' => 'c' ->>>>>>> master - ); - } - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries - i.e. after the first merge conflict - * opener in non-comment, non-heredoc/nowdoc, non-inline HTML code -, subsequent - * merge conflict boundaries will still be detected correctly. - */ - -/* - * Testing detecting subsequent merge conflicts. - * -<<<<<<< HEAD - * @var string $bar - */ -public function foo($bar){ } - -/** -============ -The above is not the boundary, the below is. -======= - * @var string $bar ->>>>>>> f19f8a5... Commit message -*/ - -// Test that stray boundaries, i.e. an opener without closer and such, are detected. -<<<<<<< HEAD -$a = 1; -======= diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.css b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.css deleted file mode 100644 index 6caa78d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.css +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This is a CSS comment. -<<<<<<< HEAD - * This is a merge conflict started in a comment, ending in a CSS block. - */ -.SettingsTabPaneWidgetType-tab-mid { - background: transparent url(tab_inact_mid.png) repeat-x; -======= - * which should be detected. - **/ -.SettingsTabPaneWidgetType-tab-start { - line-height: -25px; ->>>>>>> ref/heads/feature-branch - cursor: pointer; - -moz-user-select: none; -} - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries, subsequent boundaries will still - * be detected correctly. - */ - -/* - * This is a CSS comment. -<<<<<<< HEAD - * This is a merge conflict... -======= - * which should be detected. ->>>>>>> ref/heads/feature-branch - */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.inc deleted file mode 100644 index 809b17d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.inc +++ /dev/null @@ -1,31 +0,0 @@ ->>>>>> master - */ - -/* - * Testing detecting merge conflicts using different comment styles. - * -<<<<<<< HEAD - * @var string $bar - */ -public function foo($bar){ } - -/* -======= - * @var string $bar ->>>>>>> master -*/ - -// Comment -<<<<<<< HEAD -// Second comment line. NOTE: The above opener breaks the tokenizer. -======= -// New second comment line ->>>>>>> master -// Third comment line diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.3.inc deleted file mode 100644 index ce70941..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.3.inc +++ /dev/null @@ -1,43 +0,0 @@ - -
    -<<<<<<< HEAD -

    Testing a merge conflict.

    -======= -

    Another text string.

    ->>>>>>> ref/heads/feature-branch -
    - - -
    -<<<<<<< HEAD -

    -======= -

    ->>>>>>> ref/heads/feature-branch -
    - ->>>>>> master - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries - i.e. after the first merge conflict - * opener in non-comment, non-heredoc/nowdoc, non-inline HTML code -, subsequent - * merge conflict boundaries will still be detected correctly. - */ -?> - -
    -<<<<<<< HEAD -

    Testing a merge conflict.

    -======= -

    Another text string.

    ->>>>>>> ref/heads/feature-branch -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.4.inc deleted file mode 100644 index 99c0b99..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.4.inc +++ /dev/null @@ -1,71 +0,0 @@ ->>>>>> ref/heads/other-branchname -And now they are. -EOD; - -// Heredoc with a merge conflict starter, the closer is outside the heredoc. -$string = -<<>>>>>> ref/heads/other-branchname - -// Merge conflict starter outside with a closer inside of the heredoc. -// This breaks the tokenizer. -<<<<<<< HEAD -$string = -<<>>>>>> ref/heads/other-branchname -EOD; - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries - i.e. after the first merge conflict - * opener in non-comment, non-heredoc/nowdoc, non-inline HTML code -, subsequent - * merge conflict boundaries will still be detected correctly. - */ - -$string = -<<>>>>>> ref/heads/other-branchname -And now they are. -EOD; - -$string = -<<>>>>>> ref/heads/other-branchname diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.5.inc deleted file mode 100644 index 7d55f6d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.5.inc +++ /dev/null @@ -1,34 +0,0 @@ ->>>>>> ref/heads/other-branchname -And now they are. -EOD; - -// Break the tokenizer. -<<<<<<< HEAD - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries - i.e. after the first merge conflict - * opener in non-comment, non-heredoc/nowdoc, non-inline HTML code -, subsequent - * merge conflict boundaries will still be detected correctly. - */ - -$string = -<<<'EOD' -can be problematic. -<<<<<<< HEAD -were previously not detected. -======= -should also be detected. ->>>>>>> ref/heads/other-branchname -And now they are. -EOD; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.6.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.6.inc deleted file mode 100644 index aaea324..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.6.inc +++ /dev/null @@ -1,34 +0,0 @@ ->>>>>> ref/heads/other-branchname - And now they are. - EOD; - -// Break the tokenizer. ->>>>>>> master - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries - i.e. after the first merge conflict - * opener in non-comment, non-heredoc/nowdoc, non-inline HTML code -, subsequent - * merge conflict boundaries will still be detected correctly. - */ - -$string = - <<<"EOD" - Merge conflicts in PHP 7.3 indented heredocs -<<<<<<< HEAD - can be problematic. -======= - should also be detected. ->>>>>>> ref/heads/other-branchname - And now they are. - EOD; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.js deleted file mode 100644 index cd7bc76..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.js +++ /dev/null @@ -1,33 +0,0 @@ - -result = x?y:z; -result = x ? y : z; - -<<<<<<< HEAD -if (something === true -======= -if (something === false ->>>>>>> develop - ^ somethingElse === true -) { -<<<<<<< HEAD - return true; -======= - return false; ->>>>>>> develop -} - -y = 1 - + 2 - - 3; - -/* -<<<<<<< HEAD - * @var string $bar - */ -if (something === true - -/** -======= - * @var string $foo ->>>>>>> master - */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.php deleted file mode 100644 index a36caaf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.php +++ /dev/null @@ -1,160 +0,0 @@ - - * @copyright 2017 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\VersionControl; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class GitMergeConflictUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='GitMergeConflictUnitTest.1.inc') - { - switch ($testFile) { - case 'GitMergeConflictUnitTest.1.inc': - return [ - 26 => 1, - 28 => 1, - 30 => 1, - 45 => 1, - 53 => 1, - 55 => 1, - 59 => 1, - 61 => 1, - ]; - - case 'GitMergeConflictUnitTest.2.inc': - return [ - 4 => 1, - 6 => 1, - 8 => 1, - 14 => 1, - 20 => 1, - 22 => 1, - 26 => 1, - 28 => 1, - 30 => 1, - ]; - - case 'GitMergeConflictUnitTest.3.inc': - return [ - 3 => 1, - 5 => 1, - 7 => 1, - 12 => 1, - 14 => 1, - 16 => 1, - 22 => 1, - 24 => 1, - 26 => 1, - 38 => 1, - 40 => 1, - 42 => 1, - ]; - - case 'GitMergeConflictUnitTest.4.inc': - return [ - 6 => 1, - 8 => 1, - 10 => 1, - 18 => 1, - 22 => 1, - 25 => 1, - 29 => 1, - 34 => 1, - 39 => 1, - 53 => 1, - 55 => 1, - 57 => 1, - 64 => 1, - 68 => 1, - 71 => 1, - ]; - case 'GitMergeConflictUnitTest.5.inc': - case 'GitMergeConflictUnitTest.6.inc': - return [ - 6 => 1, - 8 => 1, - 10 => 1, - 15 => 1, - 28 => 1, - 30 => 1, - 32 => 1, - ]; - - case 'GitMergeConflictUnitTest.1.css': - return [ - 3 => 1, - 5 => 1, - 7 => 1, - 12 => 1, - 14 => 1, - 16 => 1, - 30 => 1, - 32 => 1, - 34 => 1, - ]; - - case 'GitMergeConflictUnitTest.2.css': - return [ - 3 => 1, - 8 => 1, - 13 => 1, - 27 => 1, - 29 => 1, - 31 => 1, - ]; - - case 'GitMergeConflictUnitTest.js': - return [ - 5 => 1, - 7 => 1, - 9 => 1, - 12 => 1, - 14 => 1, - 16 => 1, - 24 => 1, - 30 => 1, - 32 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/SubversionPropertiesUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/SubversionPropertiesUnitTest.inc deleted file mode 100644 index e4110de..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/SubversionPropertiesUnitTest.inc +++ /dev/null @@ -1,3 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\VersionControl; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class SubversionPropertiesUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Should this test be skipped for some reason. - * - * @return void - */ - protected function shouldSkipTest() - { - // This sniff cannot be tested as no SVN version control directory is available. - return true; - - }//end shouldSkipTest() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.inc deleted file mode 100644 index bad3998..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.inc +++ /dev/null @@ -1,165 +0,0 @@ -{$var}( $foo,$bar ); - -$bar(function( $a, $b ) { - return function( $c, $d ) use ( $a, $b ) { - echo $a, $b, $c, $d; - }; -})( 'a','b' )( 'c','d' ); - -$closure( $foo,$bar ); -$var = $closure() + $closure( $foo,$bar ) + self::$closure( $foo,$bar ); - -class Test { - public static function baz( $foo, $bar ) { - $a = new self( $foo,$bar ); - $b = new static( $foo,$bar ); - } -} - -/* - * Test warning for empty parentheses. - */ -$a = 4 + (); // Warning. -$a = 4 + ( ); // Warning. -$a = 4 + (/* Not empty */); - -/* - * Test the actual sniff. - */ -if ((null !== $extra) && ($row->extra !== $extra)) {} - -if (( null !== $extra ) && ( $row->extra !== $extra )) {} // Bad x 4. - -if (( null !== $extra // Bad x 1. - && is_int($extra)) - && ( $row->extra !== $extra // Bad x 1. - || $something ) // Bad x 1. -) {} - -if (( null !== $extra ) // Bad x 2. - && ( $row->extra !== $extra ) // Bad x 2. -) {} - -$a = (null !== $extra); -$a = ( null !== $extra ); // Bad x 2. - -$sx = $vert ? ($w - 1) : 0; - -$this->is_overloaded = ( ( ini_get("mbstring.func_overload") & 2 ) != 0 ) && function_exists('mb_substr'); // Bad x 4. - -$image->flip( ($operation->axis & 1) != 0, ($operation->axis & 2) != 0 ); - -if ( $success && ('nothumb' == $target || 'all' == $target) ) {} - -$directory = ('/' == $file[ strlen($file)-1 ]); - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 1 -if ((null !== $extra) && ($row->extra !== $extra)) {} // Bad x 4. - -if (( null !== $extra ) && ( $row->extra !== $extra )) {} - -if (( null !== $extra // Bad x 1. - && is_int($extra)) // Bad x 1. - && ( $row->extra !== $extra - || $something ) // Bad x 1. -) {} - -if ((null !== $extra) // Bad x 2. - && ($row->extra !== $extra) // Bad x 2. -) {} - -$a = (null !== $extra); // Bad x 2. -$a = ( null !== $extra ); - -$sx = $vert ? ($w - 1) : 0; // Bad x 2. - -$this->is_overloaded = ((ini_get("mbstring.func_overload") & 2) != 0) && function_exists('mb_substr'); // Bad x 4. - -$image->flip( ($operation->axis & 1) != 0, ($operation->axis & 2) != 0 ); // Bad x 4. - -if ( $success && ('nothumb' == $target || 'all' == $target) ) {} // Bad x 2. - -$directory = ('/' == $file[ strlen($file)-1 ]); // Bad x 2. - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 0 - -/* - * Test handling of ignoreNewlines. - */ -if ( - ( - null !== $extra - ) && ( - $row->extra !== $extra - ) -) {} // Bad x 4, 1 x line 123, 2 x line 125, 1 x line 127. - - -$a = ( - null !== $extra -); // Bad x 2, 1 x line 131, 1 x line 133. - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 1 -if ( - ( - null !== $extra - ) && ( - $row->extra !== $extra - ) -) {} // Bad x 4, 1 x line 137, 2 x line 139, 1 x line 141. - -$a = ( - null !== $extra -); // Bad x 2, 1 x line 144, 1 x line 146. -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 0 - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing ignoreNewlines true -if ( - ( - null !== $extra - ) && ( - $row->extra !== $extra - ) -) {} - -$a = ( - null !== $extra -); -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing ignoreNewlines false - -if (true) {} ( 1+2) === 3 ? $a = 1 : $a = 2; -class A {} ( 1+2) === 3 ? $a = 1 : $a = 2; -function foo() {} ( 1+2) === 3 ? $a = 1 : $a = 2; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.inc.fixed deleted file mode 100644 index 08fcd62..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,153 +0,0 @@ -{$var}( $foo,$bar ); - -$bar(function( $a, $b ) { - return function( $c, $d ) use ( $a, $b ) { - echo $a, $b, $c, $d; - }; -})( 'a','b' )( 'c','d' ); - -$closure( $foo,$bar ); -$var = $closure() + $closure( $foo,$bar ) + self::$closure( $foo,$bar ); - -class Test { - public static function baz( $foo, $bar ) { - $a = new self( $foo,$bar ); - $b = new static( $foo,$bar ); - } -} - -/* - * Test warning for empty parentheses. - */ -$a = 4 + (); // Warning. -$a = 4 + ( ); // Warning. -$a = 4 + (/* Not empty */); - -/* - * Test the actual sniff. - */ -if ((null !== $extra) && ($row->extra !== $extra)) {} - -if ((null !== $extra) && ($row->extra !== $extra)) {} // Bad x 4. - -if ((null !== $extra // Bad x 1. - && is_int($extra)) - && ($row->extra !== $extra // Bad x 1. - || $something) // Bad x 1. -) {} - -if ((null !== $extra) // Bad x 2. - && ($row->extra !== $extra) // Bad x 2. -) {} - -$a = (null !== $extra); -$a = (null !== $extra); // Bad x 2. - -$sx = $vert ? ($w - 1) : 0; - -$this->is_overloaded = ((ini_get("mbstring.func_overload") & 2) != 0) && function_exists('mb_substr'); // Bad x 4. - -$image->flip( ($operation->axis & 1) != 0, ($operation->axis & 2) != 0 ); - -if ( $success && ('nothumb' == $target || 'all' == $target) ) {} - -$directory = ('/' == $file[ strlen($file)-1 ]); - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 1 -if (( null !== $extra ) && ( $row->extra !== $extra )) {} // Bad x 4. - -if (( null !== $extra ) && ( $row->extra !== $extra )) {} - -if (( null !== $extra // Bad x 1. - && is_int($extra) ) // Bad x 1. - && ( $row->extra !== $extra - || $something ) // Bad x 1. -) {} - -if (( null !== $extra ) // Bad x 2. - && ( $row->extra !== $extra ) // Bad x 2. -) {} - -$a = ( null !== $extra ); // Bad x 2. -$a = ( null !== $extra ); - -$sx = $vert ? ( $w - 1 ) : 0; // Bad x 2. - -$this->is_overloaded = ( ( ini_get("mbstring.func_overload") & 2 ) != 0 ) && function_exists('mb_substr'); // Bad x 4. - -$image->flip( ( $operation->axis & 1 ) != 0, ( $operation->axis & 2 ) != 0 ); // Bad x 4. - -if ( $success && ( 'nothumb' == $target || 'all' == $target ) ) {} // Bad x 2. - -$directory = ( '/' == $file[ strlen($file)-1 ] ); // Bad x 2. - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 0 - -/* - * Test handling of ignoreNewlines. - */ -if ( - (null !== $extra) && ($row->extra !== $extra) -) {} // Bad x 4, 1 x line 123, 2 x line 125, 1 x line 127. - - -$a = (null !== $extra); // Bad x 2, 1 x line 131, 1 x line 133. - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 1 -if ( - ( null !== $extra ) && ( $row->extra !== $extra ) -) {} // Bad x 4, 1 x line 137, 2 x line 139, 1 x line 141. - -$a = ( null !== $extra ); // Bad x 2, 1 x line 144, 1 x line 146. -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 0 - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing ignoreNewlines true -if ( - ( - null !== $extra - ) && ( - $row->extra !== $extra - ) -) {} - -$a = ( - null !== $extra -); -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing ignoreNewlines false - -if (true) {} (1+2) === 3 ? $a = 1 : $a = 2; -class A {} (1+2) === 3 ? $a = 1 : $a = 2; -function foo() {} (1+2) === 3 ? $a = 1 : $a = 2; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.php deleted file mode 100644 index 0f70e28..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.php +++ /dev/null @@ -1,85 +0,0 @@ - - * @copyright 2006-2017 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ArbitraryParenthesesSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 64 => 4, - 66 => 1, - 68 => 1, - 69 => 1, - 72 => 2, - 73 => 2, - 77 => 2, - 81 => 4, - 90 => 4, - 94 => 1, - 95 => 1, - 97 => 1, - 100 => 2, - 101 => 2, - 104 => 2, - 107 => 2, - 109 => 4, - 111 => 4, - 113 => 2, - 115 => 2, - 123 => 1, - 125 => 2, - 127 => 1, - 131 => 1, - 133 => 1, - 137 => 1, - 139 => 2, - 141 => 1, - 144 => 1, - 146 => 1, - 163 => 1, - 164 => 1, - 165 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 55 => 1, - 56 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.1.inc deleted file mode 100644 index 1826b58..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.1.inc +++ /dev/null @@ -1,118 +0,0 @@ -"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// [space][space][space][tab]return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// Doc comments are indent with tabs and one space -//[tab]/** -//[tab][space]* - /** - * CVS revision for HTTP headers. - * - * @var string - * @access private - */ - /** - * - */ - -$str = 'hello - there'; - -/** - * This PHP DocBlock should be fine, even though there is a single space at the beginning. - * - * @var int $x - */ -$x = 1; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - -"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// [space][space][space][tab]return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// Doc comments are indent with tabs and one space -//[tab]/** -//[tab][space]* - /** - * CVS revision for HTTP headers. - * - * @var string - * @access private - */ - /** - * - */ - -$str = 'hello - there'; - -/** - * This PHP DocBlock should be fine, even though there is a single space at the beginning. - * - * @var int $x - */ -$x = 1; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - -"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// [space][space][space][tab]return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// Doc comments are indent with tabs and one space -//[tab]/** -//[tab][space]* - /** - * CVS revision for HTTP headers. - * - * @var string - * @access private - */ - /** - * - */ - -$str = 'hello - there'; - -/** - * This PHP DocBlock should be fine, even though there is a single space at the beginning. - * - * @var int $x - */ -$x = 1; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - -"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// [space][space][space][tab]return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// Doc comments are indent with tabs and one space -//[tab]/** -//[tab][space]* - /** - * CVS revision for HTTP headers. - * - * @var string - * @access private - */ - /** - * - */ - -$str = 'hello - there'; - -/** - * This PHP DocBlock should be fine, even though there is a single space at the beginning. - * - * @var int $x - */ -$x = 1; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowSpaceIndentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - if ($testFile === 'DisallowSpaceIndentUnitTest.2.inc') { - return; - } - - $config->tabWidth = 4; - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='DisallowSpaceIndentUnitTest.1.inc') - { - switch ($testFile) { - case 'DisallowSpaceIndentUnitTest.1.inc': - case 'DisallowSpaceIndentUnitTest.2.inc': - return [ - 5 => 1, - 9 => 1, - 15 => 1, - 22 => 1, - 24 => 1, - 30 => 1, - 35 => 1, - 50 => 1, - 55 => 1, - 57 => 1, - 58 => 1, - 59 => 1, - 60 => 1, - 65 => 1, - 66 => 1, - 67 => 1, - 68 => 1, - 69 => 1, - 70 => 1, - 73 => 1, - 77 => 1, - 81 => 1, - 104 => 1, - 105 => 1, - 106 => 1, - 107 => 1, - 108 => 1, - 110 => 1, - 111 => 1, - 112 => 1, - 114 => 1, - 115 => 1, - 117 => 1, - 118 => 1, - ]; - break; - case 'DisallowSpaceIndentUnitTest.js': - return [3 => 1]; - break; - case 'DisallowSpaceIndentUnitTest.css': - return [2 => 1]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.css deleted file mode 100644 index 80870da..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.css +++ /dev/null @@ -1,5 +0,0 @@ -#login-container { - margin-left: -225px; - width: 450px; -} - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.css.fixed deleted file mode 100644 index a8fa12b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.css.fixed +++ /dev/null @@ -1,5 +0,0 @@ -#login-container { - margin-left: -225px; - width: 450px; -} - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.inc deleted file mode 100644 index cf61177..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.inc +++ /dev/null @@ -1,93 +0,0 @@ - 'Czech republic', - 'România' => 'Romania', - 'Magyarország' => 'Hungary', -); - -$var = "$hello $there"; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - - 'Czech republic', - 'România' => 'Romania', - 'Magyarország' => 'Hungary', -); - -$var = "$hello $there"; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowTabIndentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - $config->tabWidth = 4; - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='DisallowTabIndentUnitTest.inc') - { - switch ($testFile) { - case 'DisallowTabIndentUnitTest.inc': - return [ - 5 => 2, - 9 => 1, - 15 => 1, - 20 => 2, - 21 => 1, - 22 => 2, - 23 => 1, - 24 => 2, - 31 => 1, - 32 => 2, - 33 => 2, - 41 => 1, - 42 => 1, - 43 => 1, - 44 => 1, - 45 => 1, - 46 => 1, - 47 => 1, - 48 => 1, - 54 => 1, - 55 => 1, - 56 => 1, - 57 => 1, - 58 => 1, - 59 => 1, - 79 => 1, - 80 => 1, - 81 => 1, - 82 => 1, - 83 => 1, - 85 => 1, - 86 => 1, - 87 => 1, - 89 => 1, - 90 => 1, - 92 => 1, - 93 => 1, - ]; - break; - case 'DisallowTabIndentUnitTest.js': - return [ - 3 => 1, - 5 => 1, - 6 => 1, - ]; - break; - case 'DisallowTabIndentUnitTest.css': - return [ - 1 => 1, - 2 => 1, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc deleted file mode 100644 index 22c611b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2018 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class IncrementDecrementSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='IncrementDecrementSpacingUnitTest.inc') - { - switch ($testFile) { - case 'IncrementDecrementSpacingUnitTest.inc': - case 'IncrementDecrementSpacingUnitTest.js': - return [ - 5 => 1, - 6 => 1, - 8 => 1, - 10 => 1, - 13 => 1, - 14 => 1, - 16 => 1, - 17 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc deleted file mode 100644 index 505cb6e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc +++ /dev/null @@ -1,79 +0,0 @@ - - * @copyright 2006-2017 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LanguageConstructSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 7 => 1, - 11 => 1, - 15 => 1, - 19 => 1, - 23 => 1, - 27 => 1, - 30 => 1, - 33 => 1, - 34 => 1, - 35 => 1, - 36 => 1, - 38 => 1, - 44 => 1, - 45 => 1, - 46 => 2, - 49 => 1, - 51 => 1, - 59 => 1, - 61 => 1, - 63 => 1, - 67 => 1, - 70 => 1, - 71 => 1, - 75 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc deleted file mode 100644 index bcce855..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc +++ /dev/null @@ -1,1476 +0,0 @@ -phpcs:set Generic.WhiteSpace.ScopeIndent tabIndent false - -hello(); - } - - function hello() - { - echo 'hello'; -}//end hello() - - function hello2() - { - if (TRUE) { - echo 'hello'; // no error here as its more than 4 spaces. - } else { - echo 'bye'; - } - - while (TRUE) { - echo 'hello'; - } - - do { - echo 'hello'; - } while (TRUE); - } - - function hello3() - { - switch ($hello) { - case 'hello': - break; - } - } - -} - -?> -
    -
    -
    -validate()) {
    -    $safe = $form->getSubmitValues();
    -}
    -?>
    -
    -open(); // error here - } - - public function open() - { - // Some inline stuff that shouldn't error - if (TRUE) echo 'hello'; - foreach ($tokens as $token) echo $token; - } - - /** - * This is a comment 1. - * This is a comment 2. - * This is a comment 3. - * This is a comment 4. - */ - public function close() - { - // All ok. - if (TRUE) { - if (TRUE) { - } else if (FALSE) { - foreach ($tokens as $token) { - switch ($token) { - case '1': - case '2': - if (true) { - if (false) { - if (false) { - if (false) { - echo 'hello'; - } - } - } - } - break; - case '5': - break; - } - do { - while (true) { - foreach ($tokens as $token) { - for ($i = 0; $i < $token; $i++) { - echo 'hello'; - } - } - } - } while (true); - } - } - } - } - - /* - This is another c style comment 1. - This is another c style comment 2. - This is another c style comment 3. - This is another c style comment 4. - This is another c style comment 5. - */ - - /* This is a T_COMMENT - * - * - * - */ - - /** This is a T_DOC_COMMENT - */ - - /* - This T_COMMENT has a newline in it. - - */ - - public function read() - { - echo 'hello'; - - // no errors below. - $array = array( - 'this', - 'that' => array( - 'hello', - 'hello again' => array( - 'hello', - ), - ), - ); - } -} - -abstract class Test3 -{ - public function parse() - { - - foreach ($t as $ndx => $token) { - if (is_array($token)) { - echo 'here'; - } else { - $ts[] = array("token" => $token, "value" => ''); - - $last = count($ts) - 1; - - switch ($token) { - case '(': - - if ($last >= 3 && - $ts[0]['token'] != T_CLASS && - $ts[$last - 2]['token'] == T_OBJECT_OPERATOR && - $ts[$last - 3]['token'] == T_VARIABLE ) { - - - if (true) { - echo 'hello'; - } - } - array_push($braces, $token); - break; - } - } - } - } -} - -function test() -{ - $o = << - - - - doSomething( - function () { - echo 123; - } - ); - } -} - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -$myFunction = function() { - $a = 403; - if ($a === 404) { - $a = 403; - } -}; - -class Whatever -{ - protected $_protectedArray = array( - 'normalString' => 'That email address is already in use!', - 'offendingString' => <<<'STRING' -Each line of this string is always said to be at column 0, - no matter how many spaces are placed - at the beginning of each line -and the ending STRING on the next line is reported as having to be indented. -STRING - ); -} - -class MyClass -{ - public static function myFunction() - { - if (empty($keywords) === FALSE) { - $keywords = 'foo'; - $existing = 'foo'; - } - - return $keywords; - - }//end myFunction() - -}//end class - -$var = call_user_func( - $new_var = function () use (&$a) { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - } -); - -class AnonymousFn -{ - public function getAnonFn() - { - return array( - 'functions' => Array( - 'function1' => function ($a, $b, $c) { - $a = $b + $c; - $b = $c / 2; - return Array($a, $b, $c); - }, - ), - ); - } -} -?> - -
    - -
    -
    - -
    -
    - -
    - - "") { - $test = true; - } else { - $test = true; - } - } - ?> - - - -
    -
    -
    - -
    -
    -
    - - -

    some text

    - function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -if ($foo) { - foreach ($bar as $baz) { - if ($baz) { - ?> -
    -
    -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - -<?= CHtml::encode($this->pageTitle); ?> - -expects($this->at(2)) - ->with($this->callback( - function ($subject) - { - } - ) - ); - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -echo $string->append('foo') - ->appaend('bar') - ->appaend('baz') - ->outputUsing( - function () - { - } - ); - -echo PHP_EOL; - -switch ($arg) { - case 1: - break; - case 2: - if ($arg2 == 'foo') { - } - case 3: - default: - echo 'default'; -} - -if ($tokens[$stackPtr]['content']{0} === '#') { -} else if ($tokens[$stackPtr]['content']{0} === '/' - && $tokens[$stackPtr]['content']{1} === '/' -) { -} - -$var = call_user_func( - function() { - if ($foo) { - $new_var = function() { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - }; - } - } -); - -a( - function() { - $a = function() { - $b = false; - }; - true; - } -); - -$var = [ - [ - '1' => - function () { - return true; - }, - ], - [ - '1' => - function () { - return true; - }, - '2' => true, - ] -]; - -if ($foo) { - ?> -

    - self::_replaceKeywords($failingComment, $result), - 'screenshot' => Test::getScreenshotPath( - $projectid, - $result['class_name'], - ), - ); - -} - -$this->mockedDatabase - ->with( - $this->callback( - function () { - return; - } - ) - ); - -$this->subject->recordLogin(); - -function a() -{ - if (true) { - static::$a[$b] = - static::where($c) - ->where($c) - ->where( - function ($d) { - $d->whereNull(); - $d->orWhere(); - } - ) - ->first(); - - if (static::$a[$b] === null) { - static::$a[$b] = new static( - array( - 'a' => $a->id, - 'a' => $a->id, - ) - ); - } - } - - return static::$a[$b]; -} - -$foo->load( - array( - 'bar' => function ($baz) { - $baz->call(); - } - ) -); - -hello(); - -$foo = array_unique( - array_map( - function ($entry) { - return $entry * 2; - }, - array() - ) -); -bar($foo); - -class PHP_CodeSniffer_Tokenizers_JS -{ - - public $scopeOpeners = array( - T_CASE => array( - 'end' => array( - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - ), - 'strict' => true, - ), - ); -} - -echo $string-> - append('foo')-> - appaend('bar')-> - appaend('baz')-> - outputUsing( - function () - { - } - ); - -$str = 'the items I want to show are: ' . - implode( - ', ', - array('a', 'b', 'c') - ); - -echo $str; - -$str = 'foo' - . '1' - . '2'; - -echo $str; - -bar([ - 'foo' => foo(function () { - return 'foo'; - }) -]); - -$domains = array_unique( - array_map( - function ($url) { - $urlObject = new \Purl\Url($url); - return $urlObject->registerableDomain; - }, - $sites - ) -); - -return $domains; - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -if ($foo): -if ($bar) $foo = 1; -elseif ($baz) $foo = 2; -endif; - -$this - ->method(array( - 'foo' => 'bar', - ), 'arg', array( - 'foo' => 'bar', - )); - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -foo(); - -array( - 'key1' => function ($bar) { - return $bar; - }, - 'key2' => function ($foo) { - return $foo; - }, -); - -?> - - 1, - ]; -$c = 2; - -class foo -{ - public function get() - { - $foo = ['b' => 'c', - 'd' => [ - ['e' => 'f'] - ]]; - echo '42'; - - $foo = array('b' => 'c', - 'd' => array( - array('e' => 'f') - )); - echo '42'; - } -} - -switch ($foo) { - case 1: - return array(); - case 2: - return ''; - case 3: - return $function(); - case 4: - return $functionCall($param[0]); - case 5: - return array() + array(); // Array Merge - case 6: - // String connect - return $functionReturningString('') . $functionReturningString(array()); - case 7: - return functionCall( - $withMultiLineParam[0], - array(), - $functionReturningString( - $withMultiLineParam[1] - ) - ); - case 8: - return $param[0][0]; -} - -class Test { - - public - $foo - ,$bar - ,$baz = [ ] - ; - - public function wtfindent() { - } -} - -switch ($x) { - case 1: - return [1]; - default: - return [2]; -} - -switch ($foo) { - case self::FOO: - return $this->bar($gfoo, function ($id) { - return FOO::bar($id); - }, $values); - case self::BAR: - $values = $this->bar($foo, $values); - break; -} - -$var = array( - 'long description' => - array(0, 'something'), - 'another long description' => - array(1, "something else") -); - -$services = array( - 'service 1' => - Mockery::mock('class 1') - ->shouldReceive('setFilter')->once() - ->shouldReceive('getNbResults')->atLeast()->once() - ->shouldReceive('getSlice')->once()->andReturn(array()) - ->getMock(), - 'service 2' => - Mockery::mock('class 2') - ->shouldReceive('__invoke')->once() - ->getMock() -); - -class Foo -{ - public function setUp() - { - $this->foo = new class { - public $name = 'Some value'; - }; - } -} - -try { - foo(); -} catch (\Exception $e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -if ($foo) { - foo(); -} else if ($e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} else { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -switch ($parameter) { - case null: - return [ - 'foo' => in_array( - 'foo', - [] - ), - ]; - - default: - return []; -} - -class SomeClass -{ - public function someFunc() - { - a(function () { - echo "a"; - })->b(function () { - echo "b"; - }); - - if (true) { - echo "c"; - } - echo "d"; - } -} - -$params = self::validate_parameters(self::read_competency_framework_parameters(), - array( - 'id' => $id, - )); - -$framework = api::read_framework($params['id']); -self::validate_context($framework->get_context()); -$output = $PAGE->get_renderer('tool_lp'); - -class Test123 -{ - protected static - $prop1 = [ - 'testA' => 123, - ], - $prop2 = [ - 'testB' => 456, - ]; - - protected static - $prop3 = array( - 'testA' => 123, - ), - $prop4 = array( - 'testB' => 456, - ); - - protected static $prop5; -} - -$foo = foo( - function () { - $foo->debug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -if (somethingIsTrue()) { - ?> -
    - -
    - bar(foo(function () { - }), foo(function () { - })); - -echo 'foo'; - -class Test { - - public function a() { - ?>adebug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -function test() -{ - $array = []; - foreach ($array as $data) { - [ - 'key1' => $var1, - 'key2' => $var2, - ] = $data; - foreach ($var1 as $method) { - echo $method . $var2; - } - } -} - -switch ($a) { - case 0: - $a = function () { - }; - case 1: - break; -} - -class Test -{ - public function __construct() - { -if (false) { -echo 0; - } - } -} - -return [ - 'veryLongKeySoIWantToMakeALineBreak' - => 'veryLonValueSoIWantToMakeALineBreak', - - 'someOtherKey' => [ - 'someValue' - ], - - 'arrayWithArraysInThere' => [ - ['Value1', 'Value1'] - ], -]; - -switch ($sContext) { - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -array_map( - static function ( $item ) { - echo $item; - }, - $some_array -); - -/** - * Comment. - */ -$a(function () use ($app) { - echo 'hi'; -})(); - -$app->run(); - -function foo() -{ - $foo('some - long description', function () { - }); - - $foo('some - long - description', function () { - }); - - $foo( -'some long description', function () { - }); -} - -switch ( $a ) { -case 'a': - $b = 2; - /** - * A comment. - */ - apply_filter( 'something', $b ); - break; - -case 'aa': - $b = 2; - /* - * A comment. - */ - apply_filter( 'something', $b ); - break; - -case 'b': - $b = 3; -?> - - - - - -
    - -
    - -
    - -
    - - -
    - - - -
    - [ - ], - 'b' => <<<'FOO' -foo; -FOO - ], - $a, -]; - -$query = Model::query() - ->when($a, function () { - static $b = ''; - }); - -$result = array_map( - static fn(int $number) : int => $number + 1, - $numbers -); - -$a = $a === true ? [ - 'a' => 1, - ] : [ - 'a' => 100, -]; - -return [ - Url::make('View Song', fn($song) => $song->url()) - ->onlyOnDetail(), - - new Panel('Information', [ - Text::make('Title') - ]), -]; - -?> - - - - - -"> -hello(); - } - - function hello() - { - echo 'hello'; - }//end hello() - - function hello2() - { - if (TRUE) { - echo 'hello'; // no error here as its more than 4 spaces. - } else { - echo 'bye'; - } - - while (TRUE) { - echo 'hello'; - } - - do { - echo 'hello'; - } while (TRUE); - } - - function hello3() - { - switch ($hello) { - case 'hello': - break; - } - } - -} - -?> -
    -
    -
    -validate()) {
    -    $safe = $form->getSubmitValues();
    -}
    -?>
    -
    -open(); // error here - } - - public function open() - { - // Some inline stuff that shouldn't error - if (TRUE) echo 'hello'; - foreach ($tokens as $token) echo $token; - } - - /** - * This is a comment 1. - * This is a comment 2. - * This is a comment 3. - * This is a comment 4. - */ - public function close() - { - // All ok. - if (TRUE) { - if (TRUE) { - } else if (FALSE) { - foreach ($tokens as $token) { - switch ($token) { - case '1': - case '2': - if (true) { - if (false) { - if (false) { - if (false) { - echo 'hello'; - } - } - } - } - break; - case '5': - break; - } - do { - while (true) { - foreach ($tokens as $token) { - for ($i = 0; $i < $token; $i++) { - echo 'hello'; - } - } - } - } while (true); - } - } - } - } - - /* - This is another c style comment 1. - This is another c style comment 2. - This is another c style comment 3. - This is another c style comment 4. - This is another c style comment 5. - */ - - /* This is a T_COMMENT - * - * - * - */ - - /** This is a T_DOC_COMMENT - */ - - /* - This T_COMMENT has a newline in it. - - */ - - public function read() - { - echo 'hello'; - - // no errors below. - $array = array( - 'this', - 'that' => array( - 'hello', - 'hello again' => array( - 'hello', - ), - ), - ); - } -} - -abstract class Test3 -{ - public function parse() - { - - foreach ($t as $ndx => $token) { - if (is_array($token)) { - echo 'here'; - } else { - $ts[] = array("token" => $token, "value" => ''); - - $last = count($ts) - 1; - - switch ($token) { - case '(': - - if ($last >= 3 && - $ts[0]['token'] != T_CLASS && - $ts[$last - 2]['token'] == T_OBJECT_OPERATOR && - $ts[$last - 3]['token'] == T_VARIABLE ) { - - - if (true) { - echo 'hello'; - } - } - array_push($braces, $token); - break; - } - } - } - } -} - -function test() -{ - $o = << - - - - doSomething( - function () { - echo 123; - } - ); - } -} - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -$myFunction = function() { - $a = 403; - if ($a === 404) { - $a = 403; - } -}; - -class Whatever -{ - protected $_protectedArray = array( - 'normalString' => 'That email address is already in use!', - 'offendingString' => <<<'STRING' -Each line of this string is always said to be at column 0, - no matter how many spaces are placed - at the beginning of each line -and the ending STRING on the next line is reported as having to be indented. -STRING - ); -} - -class MyClass -{ - public static function myFunction() - { - if (empty($keywords) === FALSE) { - $keywords = 'foo'; - $existing = 'foo'; - } - - return $keywords; - - }//end myFunction() - -}//end class - -$var = call_user_func( - $new_var = function () use (&$a) { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - } -); - -class AnonymousFn -{ - public function getAnonFn() - { - return array( - 'functions' => Array( - 'function1' => function ($a, $b, $c) { - $a = $b + $c; - $b = $c / 2; - return Array($a, $b, $c); - }, - ), - ); - } -} -?> - -
    - -
    -
    - -
    -
    - -
    - - "") { - $test = true; - } else { - $test = true; - } - } - ?> - - - -
    -
    -
    - -
    -
    -
    - - -

    some text

    - function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -if ($foo) { - foreach ($bar as $baz) { - if ($baz) { - ?> -
    -
    -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - -<?= CHtml::encode($this->pageTitle); ?> - -expects($this->at(2)) - ->with($this->callback( - function ($subject) - { - } - ) - ); - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -echo $string->append('foo') - ->appaend('bar') - ->appaend('baz') - ->outputUsing( - function () - { - } - ); - -echo PHP_EOL; - -switch ($arg) { - case 1: - break; - case 2: - if ($arg2 == 'foo') { - } - case 3: - default: - echo 'default'; -} - -if ($tokens[$stackPtr]['content']{0} === '#') { -} else if ($tokens[$stackPtr]['content']{0} === '/' - && $tokens[$stackPtr]['content']{1} === '/' -) { -} - -$var = call_user_func( - function() { - if ($foo) { - $new_var = function() { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - }; - } - } -); - -a( - function() { - $a = function() { - $b = false; - }; - true; - } -); - -$var = [ - [ - '1' => - function () { - return true; - }, - ], - [ - '1' => - function () { - return true; - }, - '2' => true, - ] -]; - -if ($foo) { - ?> -

    - self::_replaceKeywords($failingComment, $result), - 'screenshot' => Test::getScreenshotPath( - $projectid, - $result['class_name'], - ), - ); - -} - -$this->mockedDatabase - ->with( - $this->callback( - function () { - return; - } - ) - ); - -$this->subject->recordLogin(); - -function a() -{ - if (true) { - static::$a[$b] = - static::where($c) - ->where($c) - ->where( - function ($d) { - $d->whereNull(); - $d->orWhere(); - } - ) - ->first(); - - if (static::$a[$b] === null) { - static::$a[$b] = new static( - array( - 'a' => $a->id, - 'a' => $a->id, - ) - ); - } - } - - return static::$a[$b]; -} - -$foo->load( - array( - 'bar' => function ($baz) { - $baz->call(); - } - ) -); - -hello(); - -$foo = array_unique( - array_map( - function ($entry) { - return $entry * 2; - }, - array() - ) -); -bar($foo); - -class PHP_CodeSniffer_Tokenizers_JS -{ - - public $scopeOpeners = array( - T_CASE => array( - 'end' => array( - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - ), - 'strict' => true, - ), - ); -} - -echo $string-> - append('foo')-> - appaend('bar')-> - appaend('baz')-> - outputUsing( - function () - { - } - ); - -$str = 'the items I want to show are: ' . - implode( - ', ', - array('a', 'b', 'c') - ); - -echo $str; - -$str = 'foo' - . '1' - . '2'; - -echo $str; - -bar([ - 'foo' => foo(function () { - return 'foo'; - }) -]); - -$domains = array_unique( - array_map( - function ($url) { - $urlObject = new \Purl\Url($url); - return $urlObject->registerableDomain; - }, - $sites - ) -); - -return $domains; - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -if ($foo): - if ($bar) $foo = 1; - elseif ($baz) $foo = 2; -endif; - -$this - ->method(array( - 'foo' => 'bar', - ), 'arg', array( - 'foo' => 'bar', - )); - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -foo(); - -array( - 'key1' => function ($bar) { - return $bar; - }, - 'key2' => function ($foo) { - return $foo; - }, -); - -?> - - 1, - ]; -$c = 2; - -class foo -{ - public function get() - { - $foo = ['b' => 'c', - 'd' => [ - ['e' => 'f'] - ]]; - echo '42'; - - $foo = array('b' => 'c', - 'd' => array( - array('e' => 'f') - )); - echo '42'; - } -} - -switch ($foo) { - case 1: - return array(); - case 2: - return ''; - case 3: - return $function(); - case 4: - return $functionCall($param[0]); - case 5: - return array() + array(); // Array Merge - case 6: - // String connect - return $functionReturningString('') . $functionReturningString(array()); - case 7: - return functionCall( - $withMultiLineParam[0], - array(), - $functionReturningString( - $withMultiLineParam[1] - ) - ); - case 8: - return $param[0][0]; -} - -class Test { - - public - $foo - ,$bar - ,$baz = [ ] - ; - - public function wtfindent() { - } -} - -switch ($x) { - case 1: - return [1]; - default: - return [2]; -} - -switch ($foo) { - case self::FOO: - return $this->bar($gfoo, function ($id) { - return FOO::bar($id); - }, $values); - case self::BAR: - $values = $this->bar($foo, $values); - break; -} - -$var = array( - 'long description' => - array(0, 'something'), - 'another long description' => - array(1, "something else") -); - -$services = array( - 'service 1' => - Mockery::mock('class 1') - ->shouldReceive('setFilter')->once() - ->shouldReceive('getNbResults')->atLeast()->once() - ->shouldReceive('getSlice')->once()->andReturn(array()) - ->getMock(), - 'service 2' => - Mockery::mock('class 2') - ->shouldReceive('__invoke')->once() - ->getMock() -); - -class Foo -{ - public function setUp() - { - $this->foo = new class { - public $name = 'Some value'; - }; - } -} - -try { - foo(); -} catch (\Exception $e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -if ($foo) { - foo(); -} else if ($e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} else { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -switch ($parameter) { - case null: - return [ - 'foo' => in_array( - 'foo', - [] - ), - ]; - - default: - return []; -} - -class SomeClass -{ - public function someFunc() - { - a(function () { - echo "a"; - })->b(function () { - echo "b"; - }); - - if (true) { - echo "c"; - } - echo "d"; - } -} - -$params = self::validate_parameters(self::read_competency_framework_parameters(), - array( - 'id' => $id, - )); - -$framework = api::read_framework($params['id']); -self::validate_context($framework->get_context()); -$output = $PAGE->get_renderer('tool_lp'); - -class Test123 -{ - protected static - $prop1 = [ - 'testA' => 123, - ], - $prop2 = [ - 'testB' => 456, - ]; - - protected static - $prop3 = array( - 'testA' => 123, - ), - $prop4 = array( - 'testB' => 456, - ); - - protected static $prop5; -} - -$foo = foo( - function () { - $foo->debug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -if (somethingIsTrue()) { - ?> -
    - -
    - bar(foo(function () { - }), foo(function () { - })); - -echo 'foo'; - -class Test { - - public function a() { - ?>adebug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -function test() -{ - $array = []; - foreach ($array as $data) { - [ - 'key1' => $var1, - 'key2' => $var2, - ] = $data; - foreach ($var1 as $method) { - echo $method . $var2; - } - } -} - -switch ($a) { - case 0: - $a = function () { - }; - case 1: - break; -} - -class Test -{ - public function __construct() - { - if (false) { - echo 0; - } - } -} - -return [ - 'veryLongKeySoIWantToMakeALineBreak' - => 'veryLonValueSoIWantToMakeALineBreak', - - 'someOtherKey' => [ - 'someValue' - ], - - 'arrayWithArraysInThere' => [ - ['Value1', 'Value1'] - ], -]; - -switch ($sContext) { - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -array_map( - static function ( $item ) { - echo $item; - }, - $some_array -); - -/** - * Comment. - */ -$a(function () use ($app) { - echo 'hi'; -})(); - -$app->run(); - -function foo() -{ - $foo('some - long description', function () { - }); - - $foo('some - long - description', function () { - }); - - $foo( - 'some long description', function () { - }); -} - -switch ( $a ) { - case 'a': - $b = 2; - /** - * A comment. - */ - apply_filter( 'something', $b ); - break; - - case 'aa': - $b = 2; - /* - * A comment. - */ - apply_filter( 'something', $b ); - break; - - case 'b': - $b = 3; - ?> - - - - - -
    - -
    - -
    - -
    - - -
    - - - -
    - [ - ], - 'b' => <<<'FOO' -foo; -FOO - ], - $a, -]; - -$query = Model::query() - ->when($a, function () { - static $b = ''; - }); - -$result = array_map( - static fn(int $number) : int => $number + 1, - $numbers -); - -$a = $a === true ? [ - 'a' => 1, - ] : [ - 'a' => 100, -]; - -return [ - Url::make('View Song', fn($song) => $song->url()) - ->onlyOnDetail(), - - new Panel('Information', [ - Text::make('Title') - ]), -]; - -?> - - - - - -"> -hello(); - } - - function hello() - { - echo 'hello'; -}//end hello() - - function hello2() - { - if (TRUE) { - echo 'hello'; // no error here as its more than 4 spaces. - } else { - echo 'bye'; - } - - while (TRUE) { - echo 'hello'; - } - - do { - echo 'hello'; - } while (TRUE); - } - - function hello3() - { - switch ($hello) { - case 'hello': - break; - } - } - -} - -?> -
    -
    -
    -validate()) {
    -	$safe = $form->getSubmitValues();
    -}
    -?>
    -
    -open(); // error here - } - - public function open() - { - // Some inline stuff that shouldn't error - if (TRUE) echo 'hello'; - foreach ($tokens as $token) echo $token; - } - - /** - * This is a comment 1. - * This is a comment 2. - * This is a comment 3. - * This is a comment 4. - */ - public function close() - { - // All ok. - if (TRUE) { - if (TRUE) { - } else if (FALSE) { - foreach ($tokens as $token) { - switch ($token) { - case '1': - case '2': - if (true) { - if (false) { - if (false) { - if (false) { - echo 'hello'; - } - } - } - } - break; - case '5': - break; - } - do { - while (true) { - foreach ($tokens as $token) { - for ($i = 0; $i < $token; $i++) { - echo 'hello'; - } - } - } - } while (true); - } - } - } - } - - /* - This is another c style comment 1. - This is another c style comment 2. - This is another c style comment 3. - This is another c style comment 4. - This is another c style comment 5. - */ - - /* This is a T_COMMENT - * - * - * - */ - - /** This is a T_DOC_COMMENT - */ - - /* - This T_COMMENT has a newline in it. - - */ - - public function read() - { - echo 'hello'; - - // no errors below. - $array = array( - 'this', - 'that' => array( - 'hello', - 'hello again' => array( - 'hello', - ), - ), - ); - } -} - -abstract class Test3 -{ - public function parse() - { - - foreach ($t as $ndx => $token) { - if (is_array($token)) { - echo 'here'; - } else { - $ts[] = array("token" => $token, "value" => ''); - - $last = count($ts) - 1; - - switch ($token) { - case '(': - - if ($last >= 3 && - $ts[0]['token'] != T_CLASS && - $ts[$last - 2]['token'] == T_OBJECT_OPERATOR && - $ts[$last - 3]['token'] == T_VARIABLE ) { - - - if (true) { - echo 'hello'; - } - } - array_push($braces, $token); - break; - } - } - } - } -} - -function test() -{ - $o = << - - - - doSomething( - function () { - echo 123; - } - ); - } -} - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -$myFunction = function() { - $a = 403; - if ($a === 404) { - $a = 403; - } -}; - -class Whatever -{ - protected $_protectedArray = array( - 'normalString' => 'That email address is already in use!', - 'offendingString' => <<<'STRING' -Each line of this string is always said to be at column 0, - no matter how many spaces are placed - at the beginning of each line -and the ending STRING on the next line is reported as having to be indented. -STRING - ); -} - -class MyClass -{ - public static function myFunction() - { - if (empty($keywords) === FALSE) { - $keywords = 'foo'; - $existing = 'foo'; - } - - return $keywords; - - }//end myFunction() - -}//end class - -$var = call_user_func( - $new_var = function () use (&$a) { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - } -); - -class AnonymousFn -{ - public function getAnonFn() - { - return array( - 'functions' => Array( - 'function1' => function ($a, $b, $c) { - $a = $b + $c; - $b = $c / 2; - return Array($a, $b, $c); - }, - ), - ); - } -} -?> - -
    - -
    -
    - -
    -
    - -
    - - "") { - $test = true; - } else { - $test = true; - } - } - ?> - - - -
    -
    -
    - -
    -
    -
    - - -

    some text

    - function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -if ($foo) { - foreach ($bar as $baz) { - if ($baz) { - ?> -
    -
    -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - -<?= CHtml::encode($this->pageTitle); ?> - -expects($this->at(2)) - ->with($this->callback( - function ($subject) - { - } - ) - ); - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -echo $string->append('foo') - ->appaend('bar') - ->appaend('baz') - ->outputUsing( - function () - { - } - ); - -echo PHP_EOL; - -switch ($arg) { - case 1: - break; - case 2: - if ($arg2 == 'foo') { - } - case 3: - default: - echo 'default'; -} - -if ($tokens[$stackPtr]['content']{0} === '#') { -} else if ($tokens[$stackPtr]['content']{0} === '/' - && $tokens[$stackPtr]['content']{1} === '/' -) { -} - -$var = call_user_func( - function() { - if ($foo) { - $new_var = function() { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - }; - } - } -); - -a( - function() { - $a = function() { - $b = false; - }; - true; - } -); - -$var = [ - [ - '1' => - function () { - return true; - }, - ], - [ - '1' => - function () { - return true; - }, - '2' => true, - ] -]; - -if ($foo) { - ?> -

    - self::_replaceKeywords($failingComment, $result), - 'screenshot' => Test::getScreenshotPath( - $projectid, - $result['class_name'], - ), - ); - -} - -$this->mockedDatabase - ->with( - $this->callback( - function () { - return; - } - ) - ); - -$this->subject->recordLogin(); - -function a() -{ - if (true) { - static::$a[$b] = - static::where($c) - ->where($c) - ->where( - function ($d) { - $d->whereNull(); - $d->orWhere(); - } - ) - ->first(); - - if (static::$a[$b] === null) { - static::$a[$b] = new static( - array( - 'a' => $a->id, - 'a' => $a->id, - ) - ); - } - } - - return static::$a[$b]; -} - -$foo->load( - array( - 'bar' => function ($baz) { - $baz->call(); - } - ) -); - -hello(); - -$foo = array_unique( - array_map( - function ($entry) { - return $entry * 2; - }, - array() - ) -); -bar($foo); - -class PHP_CodeSniffer_Tokenizers_JS -{ - - public $scopeOpeners = array( - T_CASE => array( - 'end' => array( - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - ), - 'strict' => true, - ), - ); -} - -echo $string-> - append('foo')-> - appaend('bar')-> - appaend('baz')-> - outputUsing( - function () - { - } - ); - -$str = 'the items I want to show are: ' . - implode( - ', ', - array('a', 'b', 'c') - ); - -echo $str; - -$str = 'foo' - . '1' - . '2'; - -echo $str; - -bar([ - 'foo' => foo(function () { - return 'foo'; - }) -]); - -$domains = array_unique( - array_map( - function ($url) { - $urlObject = new \Purl\Url($url); - return $urlObject->registerableDomain; - }, - $sites - ) -); - -return $domains; - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -if ($foo): -if ($bar) $foo = 1; -elseif ($baz) $foo = 2; -endif; - -$this - ->method(array( - 'foo' => 'bar', - ), 'arg', array( - 'foo' => 'bar', - )); - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -foo(); - -array( - 'key1' => function ($bar) { - return $bar; - }, - 'key2' => function ($foo) { - return $foo; - }, -); - -?> - - 1, - ]; -$c = 2; - -class foo -{ - public function get() - { - $foo = ['b' => 'c', - 'd' => [ - ['e' => 'f'] - ]]; - echo '42'; - - $foo = array('b' => 'c', - 'd' => array( - array('e' => 'f') - )); - echo '42'; - } -} - -switch ($foo) { - case 1: - return array(); - case 2: - return ''; - case 3: - return $function(); - case 4: - return $functionCall($param[0]); - case 5: - return array() + array(); // Array Merge - case 6: - // String connect - return $functionReturningString('') . $functionReturningString(array()); - case 7: - return functionCall( - $withMultiLineParam[0], - array(), - $functionReturningString( - $withMultiLineParam[1] - ) - ); - case 8: - return $param[0][0]; -} - -class Test { - - public - $foo - ,$bar - ,$baz = [ ] - ; - - public function wtfindent() { - } -} - -switch ($x) { - case 1: - return [1]; - default: - return [2]; -} - -switch ($foo) { - case self::FOO: - return $this->bar($gfoo, function ($id) { - return FOO::bar($id); - }, $values); - case self::BAR: - $values = $this->bar($foo, $values); - break; -} - -$var = array( - 'long description' => - array(0, 'something'), - 'another long description' => - array(1, "something else") -); - -$services = array( - 'service 1' => - Mockery::mock('class 1') - ->shouldReceive('setFilter')->once() - ->shouldReceive('getNbResults')->atLeast()->once() - ->shouldReceive('getSlice')->once()->andReturn(array()) - ->getMock(), - 'service 2' => - Mockery::mock('class 2') - ->shouldReceive('__invoke')->once() - ->getMock() -); - -class Foo -{ - public function setUp() - { - $this->foo = new class { - public $name = 'Some value'; - }; - } -} - -try { - foo(); -} catch (\Exception $e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -if ($foo) { - foo(); -} else if ($e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} else { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -switch ($parameter) { - case null: - return [ - 'foo' => in_array( - 'foo', - [] - ), - ]; - - default: - return []; -} - -class SomeClass -{ - public function someFunc() - { - a(function () { - echo "a"; - })->b(function () { - echo "b"; - }); - - if (true) { - echo "c"; - } - echo "d"; - } -} - -$params = self::validate_parameters(self::read_competency_framework_parameters(), - array( - 'id' => $id, - )); - -$framework = api::read_framework($params['id']); -self::validate_context($framework->get_context()); -$output = $PAGE->get_renderer('tool_lp'); - -class Test123 -{ - protected static - $prop1 = [ - 'testA' => 123, - ], - $prop2 = [ - 'testB' => 456, - ]; - - protected static - $prop3 = array( - 'testA' => 123, - ), - $prop4 = array( - 'testB' => 456, - ); - - protected static $prop5; -} - -$foo = foo( - function () { - $foo->debug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -if (somethingIsTrue()) { - ?> -
    - -
    - bar(foo(function () { - }), foo(function () { - })); - -echo 'foo'; - -class Test { - - public function a() { - ?>adebug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -function test() -{ - $array = []; - foreach ($array as $data) { - [ - 'key1' => $var1, - 'key2' => $var2, - ] = $data; - foreach ($var1 as $method) { - echo $method . $var2; - } - } -} - -switch ($a) { - case 0: - $a = function () { - }; - case 1: - break; -} - -class Test -{ - public function __construct() - { -if (false) { -echo 0; - } - } -} - -return [ - 'veryLongKeySoIWantToMakeALineBreak' - => 'veryLonValueSoIWantToMakeALineBreak', - - 'someOtherKey' => [ - 'someValue' - ], - - 'arrayWithArraysInThere' => [ - ['Value1', 'Value1'] - ], -]; - -switch ($sContext) { - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -array_map( - static function ( $item ) { - echo $item; - }, - $some_array -); - -/** - * Comment. - */ -$a(function () use ($app) { - echo 'hi'; -})(); - -$app->run(); - -function foo() -{ - $foo('some - long description', function () { - }); - - $foo('some - long - description', function () { - }); - - $foo( -'some long description', function () { - }); -} - -switch ( $a ) { -case 'a': - $b = 2; - /** - * A comment. - */ - apply_filter( 'something', $b ); - break; - -case 'aa': - $b = 2; - /* - * A comment. - */ - apply_filter( 'something', $b ); - break; - -case 'b': - $b = 3; -?> - - - - - -
    - -
    - -
    - -
    - - -
    - - - -
    - [ - ], - 'b' => <<<'FOO' -foo; -FOO - ], - $a, -]; - -$query = Model::query() - ->when($a, function () { - static $b = ''; - }); - -$result = array_map( - static fn(int $number) : int => $number + 1, - $numbers -); - -$a = $a === true ? [ - 'a' => 1, - ] : [ - 'a' => 100, -]; - -return [ - Url::make('View Song', fn($song) => $song->url()) - ->onlyOnDetail(), - - new Panel('Information', [ - Text::make('Title') - ]), -]; - -?> - - - - - -"> -hello(); - } - - function hello() - { - echo 'hello'; - }//end hello() - - function hello2() - { - if (TRUE) { - echo 'hello'; // no error here as its more than 4 spaces. - } else { - echo 'bye'; - } - - while (TRUE) { - echo 'hello'; - } - - do { - echo 'hello'; - } while (TRUE); - } - - function hello3() - { - switch ($hello) { - case 'hello': - break; - } - } - -} - -?> -
    -
    -
    -validate()) {
    -	$safe = $form->getSubmitValues();
    -}
    -?>
    -
    -open(); // error here - } - - public function open() - { - // Some inline stuff that shouldn't error - if (TRUE) echo 'hello'; - foreach ($tokens as $token) echo $token; - } - - /** - * This is a comment 1. - * This is a comment 2. - * This is a comment 3. - * This is a comment 4. - */ - public function close() - { - // All ok. - if (TRUE) { - if (TRUE) { - } else if (FALSE) { - foreach ($tokens as $token) { - switch ($token) { - case '1': - case '2': - if (true) { - if (false) { - if (false) { - if (false) { - echo 'hello'; - } - } - } - } - break; - case '5': - break; - } - do { - while (true) { - foreach ($tokens as $token) { - for ($i = 0; $i < $token; $i++) { - echo 'hello'; - } - } - } - } while (true); - } - } - } - } - - /* - This is another c style comment 1. - This is another c style comment 2. - This is another c style comment 3. - This is another c style comment 4. - This is another c style comment 5. - */ - - /* This is a T_COMMENT - * - * - * - */ - - /** This is a T_DOC_COMMENT - */ - - /* - This T_COMMENT has a newline in it. - - */ - - public function read() - { - echo 'hello'; - - // no errors below. - $array = array( - 'this', - 'that' => array( - 'hello', - 'hello again' => array( - 'hello', - ), - ), - ); - } -} - -abstract class Test3 -{ - public function parse() - { - - foreach ($t as $ndx => $token) { - if (is_array($token)) { - echo 'here'; - } else { - $ts[] = array("token" => $token, "value" => ''); - - $last = count($ts) - 1; - - switch ($token) { - case '(': - - if ($last >= 3 && - $ts[0]['token'] != T_CLASS && - $ts[$last - 2]['token'] == T_OBJECT_OPERATOR && - $ts[$last - 3]['token'] == T_VARIABLE ) { - - - if (true) { - echo 'hello'; - } - } - array_push($braces, $token); - break; - } - } - } - } -} - -function test() -{ - $o = << - - - - doSomething( - function () { - echo 123; - } - ); - } -} - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -$myFunction = function() { - $a = 403; - if ($a === 404) { - $a = 403; - } -}; - -class Whatever -{ - protected $_protectedArray = array( - 'normalString' => 'That email address is already in use!', - 'offendingString' => <<<'STRING' -Each line of this string is always said to be at column 0, - no matter how many spaces are placed - at the beginning of each line -and the ending STRING on the next line is reported as having to be indented. -STRING - ); -} - -class MyClass -{ - public static function myFunction() - { - if (empty($keywords) === FALSE) { - $keywords = 'foo'; - $existing = 'foo'; - } - - return $keywords; - - }//end myFunction() - -}//end class - -$var = call_user_func( - $new_var = function () use (&$a) { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - } -); - -class AnonymousFn -{ - public function getAnonFn() - { - return array( - 'functions' => Array( - 'function1' => function ($a, $b, $c) { - $a = $b + $c; - $b = $c / 2; - return Array($a, $b, $c); - }, - ), - ); - } -} -?> - -
    - -
    -
    - -
    -
    - -
    - - "") { - $test = true; - } else { - $test = true; - } - } - ?> - - - -
    -
    -
    - -
    -
    -
    - - -

    some text

    - function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -if ($foo) { - foreach ($bar as $baz) { - if ($baz) { - ?> -
    -
    -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - -<?= CHtml::encode($this->pageTitle); ?> - -expects($this->at(2)) - ->with($this->callback( - function ($subject) - { - } - ) - ); - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -echo $string->append('foo') - ->appaend('bar') - ->appaend('baz') - ->outputUsing( - function () - { - } - ); - -echo PHP_EOL; - -switch ($arg) { - case 1: - break; - case 2: - if ($arg2 == 'foo') { - } - case 3: - default: - echo 'default'; -} - -if ($tokens[$stackPtr]['content']{0} === '#') { -} else if ($tokens[$stackPtr]['content']{0} === '/' - && $tokens[$stackPtr]['content']{1} === '/' -) { -} - -$var = call_user_func( - function() { - if ($foo) { - $new_var = function() { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - }; - } - } -); - -a( - function() { - $a = function() { - $b = false; - }; - true; - } -); - -$var = [ - [ - '1' => - function () { - return true; - }, - ], - [ - '1' => - function () { - return true; - }, - '2' => true, - ] -]; - -if ($foo) { - ?> -

    - self::_replaceKeywords($failingComment, $result), - 'screenshot' => Test::getScreenshotPath( - $projectid, - $result['class_name'], - ), - ); - -} - -$this->mockedDatabase - ->with( - $this->callback( - function () { - return; - } - ) - ); - -$this->subject->recordLogin(); - -function a() -{ - if (true) { - static::$a[$b] = - static::where($c) - ->where($c) - ->where( - function ($d) { - $d->whereNull(); - $d->orWhere(); - } - ) - ->first(); - - if (static::$a[$b] === null) { - static::$a[$b] = new static( - array( - 'a' => $a->id, - 'a' => $a->id, - ) - ); - } - } - - return static::$a[$b]; -} - -$foo->load( - array( - 'bar' => function ($baz) { - $baz->call(); - } - ) -); - -hello(); - -$foo = array_unique( - array_map( - function ($entry) { - return $entry * 2; - }, - array() - ) -); -bar($foo); - -class PHP_CodeSniffer_Tokenizers_JS -{ - - public $scopeOpeners = array( - T_CASE => array( - 'end' => array( - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - ), - 'strict' => true, - ), - ); -} - -echo $string-> - append('foo')-> - appaend('bar')-> - appaend('baz')-> - outputUsing( - function () - { - } - ); - -$str = 'the items I want to show are: ' . - implode( - ', ', - array('a', 'b', 'c') - ); - -echo $str; - -$str = 'foo' - . '1' - . '2'; - -echo $str; - -bar([ - 'foo' => foo(function () { - return 'foo'; - }) -]); - -$domains = array_unique( - array_map( - function ($url) { - $urlObject = new \Purl\Url($url); - return $urlObject->registerableDomain; - }, - $sites - ) -); - -return $domains; - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -if ($foo): - if ($bar) $foo = 1; - elseif ($baz) $foo = 2; -endif; - -$this - ->method(array( - 'foo' => 'bar', - ), 'arg', array( - 'foo' => 'bar', - )); - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -foo(); - -array( - 'key1' => function ($bar) { - return $bar; - }, - 'key2' => function ($foo) { - return $foo; - }, -); - -?> - - 1, - ]; -$c = 2; - -class foo -{ - public function get() - { - $foo = ['b' => 'c', - 'd' => [ - ['e' => 'f'] - ]]; - echo '42'; - - $foo = array('b' => 'c', - 'd' => array( - array('e' => 'f') - )); - echo '42'; - } -} - -switch ($foo) { - case 1: - return array(); - case 2: - return ''; - case 3: - return $function(); - case 4: - return $functionCall($param[0]); - case 5: - return array() + array(); // Array Merge - case 6: - // String connect - return $functionReturningString('') . $functionReturningString(array()); - case 7: - return functionCall( - $withMultiLineParam[0], - array(), - $functionReturningString( - $withMultiLineParam[1] - ) - ); - case 8: - return $param[0][0]; -} - -class Test { - - public - $foo - ,$bar - ,$baz = [ ] - ; - - public function wtfindent() { - } -} - -switch ($x) { - case 1: - return [1]; - default: - return [2]; -} - -switch ($foo) { - case self::FOO: - return $this->bar($gfoo, function ($id) { - return FOO::bar($id); - }, $values); - case self::BAR: - $values = $this->bar($foo, $values); - break; -} - -$var = array( - 'long description' => - array(0, 'something'), - 'another long description' => - array(1, "something else") -); - -$services = array( - 'service 1' => - Mockery::mock('class 1') - ->shouldReceive('setFilter')->once() - ->shouldReceive('getNbResults')->atLeast()->once() - ->shouldReceive('getSlice')->once()->andReturn(array()) - ->getMock(), - 'service 2' => - Mockery::mock('class 2') - ->shouldReceive('__invoke')->once() - ->getMock() -); - -class Foo -{ - public function setUp() - { - $this->foo = new class { - public $name = 'Some value'; - }; - } -} - -try { - foo(); -} catch (\Exception $e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -if ($foo) { - foo(); -} else if ($e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} else { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -switch ($parameter) { - case null: - return [ - 'foo' => in_array( - 'foo', - [] - ), - ]; - - default: - return []; -} - -class SomeClass -{ - public function someFunc() - { - a(function () { - echo "a"; - })->b(function () { - echo "b"; - }); - - if (true) { - echo "c"; - } - echo "d"; - } -} - -$params = self::validate_parameters(self::read_competency_framework_parameters(), - array( - 'id' => $id, - )); - -$framework = api::read_framework($params['id']); -self::validate_context($framework->get_context()); -$output = $PAGE->get_renderer('tool_lp'); - -class Test123 -{ - protected static - $prop1 = [ - 'testA' => 123, - ], - $prop2 = [ - 'testB' => 456, - ]; - - protected static - $prop3 = array( - 'testA' => 123, - ), - $prop4 = array( - 'testB' => 456, - ); - - protected static $prop5; -} - -$foo = foo( - function () { - $foo->debug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -if (somethingIsTrue()) { - ?> -
    - -
    - bar(foo(function () { - }), foo(function () { - })); - -echo 'foo'; - -class Test { - - public function a() { - ?>adebug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -function test() -{ - $array = []; - foreach ($array as $data) { - [ - 'key1' => $var1, - 'key2' => $var2, - ] = $data; - foreach ($var1 as $method) { - echo $method . $var2; - } - } -} - -switch ($a) { - case 0: - $a = function () { - }; - case 1: - break; -} - -class Test -{ - public function __construct() - { - if (false) { - echo 0; - } - } -} - -return [ - 'veryLongKeySoIWantToMakeALineBreak' - => 'veryLonValueSoIWantToMakeALineBreak', - - 'someOtherKey' => [ - 'someValue' - ], - - 'arrayWithArraysInThere' => [ - ['Value1', 'Value1'] - ], -]; - -switch ($sContext) { - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -array_map( - static function ( $item ) { - echo $item; - }, - $some_array -); - -/** - * Comment. - */ -$a(function () use ($app) { - echo 'hi'; -})(); - -$app->run(); - -function foo() -{ - $foo('some - long description', function () { - }); - - $foo('some - long - description', function () { - }); - - $foo( - 'some long description', function () { - }); -} - -switch ( $a ) { - case 'a': - $b = 2; - /** - * A comment. - */ - apply_filter( 'something', $b ); - break; - - case 'aa': - $b = 2; - /* - * A comment. - */ - apply_filter( 'something', $b ); - break; - - case 'b': - $b = 3; - ?> - - - - - -
    - -
    - -
    - -
    - - -
    - - - -
    - [ - ], - 'b' => <<<'FOO' -foo; -FOO - ], - $a, -]; - -$query = Model::query() - ->when($a, function () { - static $b = ''; - }); - -$result = array_map( - static fn(int $number) : int => $number + 1, - $numbers -); - -$a = $a === true ? [ - 'a' => 1, - ] : [ - 'a' => 100, -]; - -return [ - Url::make('View Song', fn($song) => $song->url()) - ->onlyOnDetail(), - - new Panel('Information', [ - Text::make('Title') - ]), -]; - -?> - - - - - - $enabled, - 'compression' => $compression, - ] = $options; -} - -$this->foo() - ->bar() - ->baz(); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc.fixed deleted file mode 100644 index e9ae5ff..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc.fixed +++ /dev/null @@ -1,28 +0,0 @@ -phpcs:set Generic.WhiteSpace.ScopeIndent tabIndent false -phpcs:set Generic.WhiteSpace.ScopeIndent exact true - $enabled, - 'compression' => $compression, - ] = $options; -} - -$this->foo() - ->bar() - ->baz(); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.4.inc deleted file mode 100644 index e58dc4d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.4.inc +++ /dev/null @@ -1,6 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ScopeIndentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - // Tab width setting is only needed for the tabbed file. - if ($testFile === 'ScopeIndentUnitTest.2.inc') { - $config->tabWidth = 4; - } else { - $config->tabWidth = 0; - } - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='ScopeIndentUnitTest.inc') - { - if ($testFile === 'ScopeIndentUnitTest.1.js') { - return [ - 6 => 1, - 14 => 1, - 21 => 1, - 30 => 1, - 32 => 1, - 33 => 1, - 34 => 1, - 39 => 1, - 42 => 1, - 59 => 1, - 60 => 1, - 75 => 1, - 120 => 1, - 121 => 1, - 122 => 1, - 123 => 1, - 141 => 1, - 142 => 1, - 155 => 1, - 156 => 1, - 168 => 1, - 184 => 1, - ]; - }//end if - - if ($testFile === 'ScopeIndentUnitTest.3.inc') { - return [ - 6 => 1, - 7 => 1, - 10 => 1, - ]; - } - - if ($testFile === 'ScopeIndentUnitTest.4.inc') { - return []; - } - - return [ - 7 => 1, - 10 => 1, - 13 => 1, - 17 => 1, - 20 => 1, - 24 => 1, - 25 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - 30 => 1, - 58 => 1, - 123 => 1, - 224 => 1, - 225 => 1, - 279 => 1, - 280 => 1, - 281 => 1, - 282 => 1, - 283 => 1, - 284 => 1, - 285 => 1, - 286 => 1, - 336 => 1, - 349 => 1, - 380 => 1, - 386 => 1, - 387 => 1, - 388 => 1, - 389 => 1, - 390 => 1, - 397 => 1, - 419 => 1, - 420 => 1, - 465 => 1, - 467 => 1, - 472 => 1, - 473 => 1, - 474 => 1, - 496 => 1, - 498 => 1, - 500 => 1, - 524 => 1, - 526 => 1, - 544 => 1, - 545 => 1, - 546 => 1, - 639 => 1, - 660 => 1, - 662 => 1, - 802 => 1, - 803 => 1, - 823 => 1, - 858 => 1, - 879 => 1, - 1163 => 1, - 1197 => 1, - 1198 => 1, - 1259 => 1, - 1264 => 1, - 1265 => 1, - 1266 => 1, - 1269 => 1, - 1272 => 1, - 1273 => 1, - 1274 => 1, - 1275 => 1, - 1276 => 1, - 1277 => 1, - 1280 => 1, - 1281 => 1, - 1282 => 1, - 1284 => 1, - 1285 => 1, - 1288 => 1, - 1289 => 1, - 1290 => 1, - 1292 => 1, - 1293 => 1, - 1310 => 1, - 1312 => 1, - 1327 => 1, - 1328 => 1, - 1329 => 1, - 1330 => 1, - 1331 => 1, - 1332 => 1, - 1335 => 1, - 1340 => 1, - 1342 => 1, - 1345 => 1, - 1464 => 1, - 1465 => 1, - 1466 => 1, - 1467 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.inc deleted file mode 100644 index edce4dc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.inc +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class SpreadOperatorSpacingAfterUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 12 => 1, - 13 => 1, - 20 => 2, - 40 => 1, - 41 => 1, - 46 => 2, - 60 => 1, - 61 => 1, - 66 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/ruleset.xml deleted file mode 100644 index 728426e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/ruleset.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - A collection of generic sniffs. This standard is not designed to be used to check code. - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/CSS/BrowserSpecificStylesSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/CSS/BrowserSpecificStylesSniff.php deleted file mode 100644 index 9575398..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/CSS/BrowserSpecificStylesSniff.php +++ /dev/null @@ -1,87 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\CSS; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class BrowserSpecificStylesSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - /** - * A list of specific stylesheet suffixes we allow. - * - * These stylesheets contain browser specific styles - * so this sniff ignore them files in the form: - * *_moz.css and *_ie7.css etc. - * - * @var array - */ - protected $specificStylesheets = [ - 'moz' => true, - 'ie' => true, - 'ie7' => true, - 'ie8' => true, - 'webkit' => true, - ]; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Ignore files with browser-specific suffixes. - $filename = $phpcsFile->getFilename(); - $breakChar = strrpos($filename, '_'); - if ($breakChar !== false && substr($filename, -4) === '.css') { - $specific = substr($filename, ($breakChar + 1), -4); - if (isset($this->specificStylesheets[$specific]) === true) { - return; - } - } - - $tokens = $phpcsFile->getTokens(); - $content = $tokens[$stackPtr]['content']; - - if ($content[0] === '-') { - $error = 'Browser-specific styles are not allowed'; - $phpcsFile->addError($error, $stackPtr, 'ForbiddenStyle'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/DisallowSelfActionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/DisallowSelfActionsSniff.php deleted file mode 100644 index 81b7f1b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/DisallowSelfActionsSniff.php +++ /dev/null @@ -1,125 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Channels; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class DisallowSelfActionsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CLASS]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // We are not interested in abstract classes. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($prev !== false && $tokens[$prev]['code'] === T_ABSTRACT) { - return; - } - - // We are only interested in Action classes. - $classNameToken = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - $className = $tokens[$classNameToken]['content']; - if (substr($className, -7) !== 'Actions') { - return; - } - - $foundFunctions = []; - $foundCalls = []; - - // Find all static method calls in the form self::method() in the class. - $classEnd = $tokens[$stackPtr]['scope_closer']; - for ($i = ($classNameToken + 1); $i < $classEnd; $i++) { - if ($tokens[$i]['code'] !== T_DOUBLE_COLON) { - if ($tokens[$i]['code'] === T_FUNCTION) { - // Cache the function information. - $funcName = $phpcsFile->findNext(T_STRING, ($i + 1)); - $funcScope = $phpcsFile->findPrevious(Tokens::$scopeModifiers, ($i - 1)); - - $foundFunctions[$tokens[$funcName]['content']] = strtolower($tokens[$funcScope]['content']); - } - - continue; - } - - $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($i - 1), null, true); - if ($tokens[$prevToken]['content'] !== 'self' - && $tokens[$prevToken]['content'] !== 'static' - ) { - continue; - } - - $funcNameToken = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), null, true); - if ($tokens[$funcNameToken]['code'] === T_VARIABLE) { - // We are only interested in function calls. - continue; - } - - $funcName = $tokens[$funcNameToken]['content']; - - // We've found the function, now we need to find it and see if it is - // public, private or protected. If it starts with an underscore we - // can assume it is private. - if ($funcName[0] === '_') { - continue; - } - - $foundCalls[$i] = [ - 'name' => $funcName, - 'type' => strtolower($tokens[$prevToken]['content']), - ]; - }//end for - - $errorClassName = substr($className, 0, -7); - - foreach ($foundCalls as $token => $funcData) { - if (isset($foundFunctions[$funcData['name']]) === false) { - // Function was not in this class, might have come from the parent. - // Either way, we can't really check this. - continue; - } else if ($foundFunctions[$funcData['name']] === 'public') { - $type = $funcData['type']; - $error = "Static calls to public methods in Action classes must not use the $type keyword; use %s::%s() instead"; - $data = [ - $errorClassName, - $funcName, - ]; - $phpcsFile->addError($error, $token, 'Found'.ucfirst($funcData['type']), $data); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeOwnSystemSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeOwnSystemSniff.php deleted file mode 100644 index 2d56261..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeOwnSystemSniff.php +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Channels; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class IncludeOwnSystemSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DOUBLE_COLON]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $fileName = $phpcsFile->getFilename(); - $matches = []; - if (preg_match('|/systems/(.*)/([^/]+)?actions.inc$|i', $fileName, $matches) === 0) { - // Not an actions file. - return; - } - - $ownClass = $matches[2]; - $tokens = $phpcsFile->getTokens(); - - $typeName = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($stackPtr + 2), null, false, true); - $typeName = trim($tokens[$typeName]['content'], " '"); - switch (strtolower($tokens[($stackPtr + 1)]['content'])) { - case 'includesystem' : - $included = strtolower($typeName); - break; - case 'includeasset' : - $included = strtolower($typeName).'assettype'; - break; - case 'includewidget' : - $included = strtolower($typeName).'widgettype'; - break; - default: - return; - } - - if ($included === strtolower($ownClass)) { - $error = "You do not need to include \"%s\" from within the system's own actions file"; - $data = [$ownClass]; - $phpcsFile->addError($error, $stackPtr, 'NotRequired', $data); - } - - }//end process() - - - /** - * Determines the included class name from given token. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param array $tokens The array of file tokens. - * @param int $stackPtr The position in the tokens array of the - * potentially included class. - * - * @return string - */ - protected function getIncludedClassFromToken( - $phpcsFile, - array $tokens, - $stackPtr - ) { - - return false; - - }//end getIncludedClassFromToken() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeSystemSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeSystemSniff.php deleted file mode 100644 index 8bbd91e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeSystemSniff.php +++ /dev/null @@ -1,314 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Channels; - -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class IncludeSystemSniff extends AbstractScopeSniff -{ - - /** - * A list of classes that don't need to be included. - * - * @var string[] - */ - private $ignore = [ - 'self' => true, - 'static' => true, - 'parent' => true, - 'channels' => true, - 'basesystem' => true, - 'dal' => true, - 'init' => true, - 'pdo' => true, - 'util' => true, - 'ziparchive' => true, - 'phpunit_framework_assert' => true, - 'abstractmysourceunittest' => true, - 'abstractdatacleanunittest' => true, - 'exception' => true, - 'abstractwidgetwidgettype' => true, - 'domdocument' => true, - ]; - - - /** - * Constructs an AbstractScopeSniff. - */ - public function __construct() - { - parent::__construct([T_FUNCTION], [T_DOUBLE_COLON, T_EXTENDS], true); - - }//end __construct() - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param integer $stackPtr The position where the token was found. - * @param integer $currScope The current scope opener token. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine the name of the class that the static function - // is being called on. - $classNameToken = $phpcsFile->findPrevious( - T_WHITESPACE, - ($stackPtr - 1), - null, - true - ); - - // Don't process class names represented by variables as this can be - // an inexact science. - if ($tokens[$classNameToken]['code'] === T_VARIABLE) { - return; - } - - $className = $tokens[$classNameToken]['content']; - if (isset($this->ignore[strtolower($className)]) === true) { - return; - } - - $includedClasses = []; - - $fileName = strtolower($phpcsFile->getFilename()); - $matches = []; - if (preg_match('|/systems/(.*)/([^/]+)?actions.inc$|', $fileName, $matches) !== 0) { - // This is an actions file, which means we don't - // have to include the system in which it exists. - $includedClasses[$matches[2]] = true; - - // Or a system it implements. - $class = $phpcsFile->getCondition($stackPtr, T_CLASS); - $implements = $phpcsFile->findNext(T_IMPLEMENTS, $class, ($class + 10)); - if ($implements !== false) { - $implementsClass = $phpcsFile->findNext(T_STRING, $implements); - $implementsClassName = strtolower($tokens[$implementsClass]['content']); - if (substr($implementsClassName, -7) === 'actions') { - $includedClasses[substr($implementsClassName, 0, -7)] = true; - } - } - } - - // Go searching for includeSystem and includeAsset calls within this - // function, or the inclusion of .inc files, which - // would be library files. - for ($i = ($currScope + 1); $i < $stackPtr; $i++) { - $name = $this->getIncludedClassFromToken($phpcsFile, $tokens, $i); - if ($name !== false) { - $includedClasses[$name] = true; - // Special case for Widgets cause they are, well, special. - } else if (strtolower($tokens[$i]['content']) === 'includewidget') { - $typeName = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($i + 1)); - $typeName = trim($tokens[$typeName]['content'], " '"); - $includedClasses[strtolower($typeName).'widgettype'] = true; - } - } - - // Now go searching for includeSystem, includeAsset or require/include - // calls outside our scope. If we are in a class, look outside the - // class. If we are not, look outside the function. - $condPtr = $currScope; - if ($phpcsFile->hasCondition($stackPtr, T_CLASS) === true) { - foreach ($tokens[$stackPtr]['conditions'] as $condPtr => $condType) { - if ($condType === T_CLASS) { - break; - } - } - } - - for ($i = 0; $i < $condPtr; $i++) { - // Skip other scopes. - if (isset($tokens[$i]['scope_closer']) === true) { - $i = $tokens[$i]['scope_closer']; - continue; - } - - $name = $this->getIncludedClassFromToken($phpcsFile, $tokens, $i); - if ($name !== false) { - $includedClasses[$name] = true; - } - } - - // If we are in a testing class, we might have also included - // some systems and classes in our setUp() method. - $setupFunction = null; - if ($phpcsFile->hasCondition($stackPtr, T_CLASS) === true) { - foreach ($tokens[$stackPtr]['conditions'] as $condPtr => $condType) { - if ($condType === T_CLASS) { - // Is this is a testing class? - $name = $phpcsFile->findNext(T_STRING, $condPtr); - $name = $tokens[$name]['content']; - if (substr($name, -8) === 'UnitTest') { - // Look for a method called setUp(). - $end = $tokens[$condPtr]['scope_closer']; - $function = $phpcsFile->findNext(T_FUNCTION, ($condPtr + 1), $end); - while ($function !== false) { - $name = $phpcsFile->findNext(T_STRING, $function); - if ($tokens[$name]['content'] === 'setUp') { - $setupFunction = $function; - break; - } - - $function = $phpcsFile->findNext(T_FUNCTION, ($function + 1), $end); - } - } - } - }//end foreach - }//end if - - if ($setupFunction !== null) { - $start = ($tokens[$setupFunction]['scope_opener'] + 1); - $end = $tokens[$setupFunction]['scope_closer']; - for ($i = $start; $i < $end; $i++) { - $name = $this->getIncludedClassFromToken($phpcsFile, $tokens, $i); - if ($name !== false) { - $includedClasses[$name] = true; - } - } - }//end if - - if (isset($includedClasses[strtolower($className)]) === false) { - $error = 'Static method called on non-included class or system "%s"; include system with Channels::includeSystem() or include class with require_once'; - $data = [$className]; - $phpcsFile->addError($error, $stackPtr, 'NotIncludedCall', $data); - } - - }//end processTokenWithinScope() - - - /** - * Processes a token within the scope that this test is listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * this token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_EXTENDS) { - // Find the class name. - $classNameToken = $phpcsFile->findNext(T_STRING, ($stackPtr + 1)); - $className = $tokens[$classNameToken]['content']; - } else { - // Determine the name of the class that the static function - // is being called on. But don't process class names represented by - // variables as this can be an inexact science. - $classNameToken = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$classNameToken]['code'] === T_VARIABLE) { - return; - } - - $className = $tokens[$classNameToken]['content']; - } - - // Some systems are always available. - if (isset($this->ignore[strtolower($className)]) === true) { - return; - } - - $includedClasses = []; - - $fileName = strtolower($phpcsFile->getFilename()); - $matches = []; - if (preg_match('|/systems/([^/]+)/([^/]+)?actions.inc$|', $fileName, $matches) !== 0) { - // This is an actions file, which means we don't - // have to include the system in which it exists - // We know the system from the path. - $includedClasses[$matches[1]] = true; - } - - // Go searching for includeSystem, includeAsset or require/include - // calls outside our scope. - for ($i = 0; $i < $stackPtr; $i++) { - // Skip classes and functions as will we never get - // into their scopes when including this file, although - // we have a chance of getting into IF, WHILE etc. - if (($tokens[$i]['code'] === T_CLASS - || $tokens[$i]['code'] === T_INTERFACE - || $tokens[$i]['code'] === T_FUNCTION) - && isset($tokens[$i]['scope_closer']) === true - ) { - $i = $tokens[$i]['scope_closer']; - continue; - } - - $name = $this->getIncludedClassFromToken($phpcsFile, $tokens, $i); - if ($name !== false) { - $includedClasses[$name] = true; - // Special case for Widgets cause they are, well, special. - } else if (strtolower($tokens[$i]['content']) === 'includewidget') { - $typeName = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($i + 1)); - $typeName = trim($tokens[$typeName]['content'], " '"); - $includedClasses[strtolower($typeName).'widgettype'] = true; - } - }//end for - - if (isset($includedClasses[strtolower($className)]) === false) { - if ($tokens[$stackPtr]['code'] === T_EXTENDS) { - $error = 'Class extends non-included class or system "%s"; include system with Channels::includeSystem() or include class with require_once'; - $data = [$className]; - $phpcsFile->addError($error, $stackPtr, 'NotIncludedExtends', $data); - } else { - $error = 'Static method called on non-included class or system "%s"; include system with Channels::includeSystem() or include class with require_once'; - $data = [$className]; - $phpcsFile->addError($error, $stackPtr, 'NotIncludedCall', $data); - } - } - - }//end processTokenOutsideScope() - - - /** - * Determines the included class name from given token. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param array $tokens The array of file tokens. - * @param int $stackPtr The position in the tokens array of the - * potentially included class. - * - * @return string - */ - protected function getIncludedClassFromToken(File $phpcsFile, array $tokens, $stackPtr) - { - if (strtolower($tokens[$stackPtr]['content']) === 'includesystem') { - $systemName = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($stackPtr + 1)); - $systemName = trim($tokens[$systemName]['content'], " '"); - return strtolower($systemName); - } else if (strtolower($tokens[$stackPtr]['content']) === 'includeasset') { - $typeName = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($stackPtr + 1)); - $typeName = trim($tokens[$typeName]['content'], " '"); - return strtolower($typeName).'assettype'; - } else if (isset(Tokens::$includeTokens[$tokens[$stackPtr]['code']]) === true) { - $filePath = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($stackPtr + 1)); - $filePath = $tokens[$filePath]['content']; - $filePath = trim($filePath, " '"); - $filePath = basename($filePath, '.inc'); - return strtolower($filePath); - } - - return false; - - }//end getIncludedClassFromToken() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/UnusedSystemSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/UnusedSystemSniff.php deleted file mode 100644 index 6b10cd3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/UnusedSystemSniff.php +++ /dev/null @@ -1,141 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Channels; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class UnusedSystemSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DOUBLE_COLON]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check if this is a call to includeSystem, includeAsset or includeWidget. - $methodName = strtolower($tokens[($stackPtr + 1)]['content']); - if ($methodName === 'includesystem' - || $methodName === 'includeasset' - || $methodName === 'includewidget' - ) { - $systemName = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 3), null, true); - if ($systemName === false || $tokens[$systemName]['code'] !== T_CONSTANT_ENCAPSED_STRING) { - // Must be using a variable instead of a specific system name. - // We can't accurately check that. - return; - } - - $systemName = trim($tokens[$systemName]['content'], " '"); - } else { - return; - } - - if ($methodName === 'includeasset') { - $systemName .= 'assettype'; - } else if ($methodName === 'includewidget') { - $systemName .= 'widgettype'; - } - - $systemName = strtolower($systemName); - - // Now check if this system is used anywhere in this scope. - $level = $tokens[$stackPtr]['level']; - for ($i = ($stackPtr + 1); $i < $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['level'] < $level) { - // We have gone out of scope. - // If the original include was inside an IF statement that - // is checking if the system exists, check the outer scope - // as well. - if ($tokens[$stackPtr]['level'] === $level) { - // We are still in the base level, so this is the first - // time we have got here. - $conditions = array_keys($tokens[$stackPtr]['conditions']); - if (empty($conditions) === false) { - $cond = array_pop($conditions); - if ($tokens[$cond]['code'] === T_IF) { - $i = $tokens[$cond]['scope_closer']; - $level--; - continue; - } - } - } - - break; - }//end if - - if ($tokens[$i]['code'] !== T_DOUBLE_COLON - && $tokens[$i]['code'] !== T_EXTENDS - && $tokens[$i]['code'] !== T_IMPLEMENTS - ) { - continue; - } - - switch ($tokens[$i]['code']) { - case T_DOUBLE_COLON: - $usedName = strtolower($tokens[($i - 1)]['content']); - if ($usedName === $systemName) { - // The included system was used, so it is fine. - return; - } - break; - case T_EXTENDS: - $classNameToken = $phpcsFile->findNext(T_STRING, ($i + 1)); - $className = strtolower($tokens[$classNameToken]['content']); - if ($className === $systemName) { - // The included system was used, so it is fine. - return; - } - break; - case T_IMPLEMENTS: - $endImplements = $phpcsFile->findNext([T_EXTENDS, T_OPEN_CURLY_BRACKET], ($i + 1)); - for ($x = ($i + 1); $x < $endImplements; $x++) { - if ($tokens[$x]['code'] === T_STRING) { - $className = strtolower($tokens[$x]['content']); - if ($className === $systemName) { - // The included system was used, so it is fine. - return; - } - } - } - break; - }//end switch - }//end for - - // If we get to here, the system was not use. - $error = 'Included system "%s" is never used'; - $data = [$systemName]; - $phpcsFile->addError($error, $stackPtr, 'Found', $data); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Commenting/FunctionCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Commenting/FunctionCommentSniff.php deleted file mode 100644 index fd75bcb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Commenting/FunctionCommentSniff.php +++ /dev/null @@ -1,84 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Commenting; - -use PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\FunctionCommentSniff as SquizFunctionCommentSniff; -use PHP_CodeSniffer\Util\Tokens; -use PHP_CodeSniffer\Files\File; - -class FunctionCommentSniff extends SquizFunctionCommentSniff -{ - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - parent::process($phpcsFile, $stackPtr); - - $tokens = $phpcsFile->getTokens(); - $find = Tokens::$methodPrefixes; - $find[] = T_WHITESPACE; - - $commentEnd = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true); - if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG) { - return; - } - - $commentStart = $tokens[$commentEnd]['comment_opener']; - $hasApiTag = false; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] === '@api') { - if ($hasApiTag === true) { - // We've come across an API tag already, which means - // we were not the first tag in the API list. - $error = 'The @api tag must come first in the @api tag list in a function comment'; - $phpcsFile->addError($error, $tag, 'ApiNotFirst'); - } - - $hasApiTag = true; - - // There needs to be a blank line before the @api tag. - $prev = $phpcsFile->findPrevious([T_DOC_COMMENT_STRING, T_DOC_COMMENT_TAG], ($tag - 1)); - if ($tokens[$prev]['line'] !== ($tokens[$tag]['line'] - 2)) { - $error = 'There must be one blank line before the @api tag in a function comment'; - $phpcsFile->addError($error, $tag, 'ApiSpacing'); - } - } else if (substr($tokens[$tag]['content'], 0, 5) === '@api-') { - $hasApiTag = true; - - $prev = $phpcsFile->findPrevious([T_DOC_COMMENT_STRING, T_DOC_COMMENT_TAG], ($tag - 1)); - if ($tokens[$prev]['line'] !== ($tokens[$tag]['line'] - 1)) { - $error = 'There must be no blank line before the @%s tag in a function comment'; - $data = [$tokens[$tag]['content']]; - $phpcsFile->addError($error, $tag, 'ApiTagSpacing', $data); - } - }//end if - }//end foreach - - if ($hasApiTag === true && substr($tokens[$tag]['content'], 0, 4) !== '@api') { - // API tags must be the last tags in a function comment. - $error = 'The @api tags must be the last tags in a function comment'; - $phpcsFile->addError($error, $commentEnd, 'ApiNotLast'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/DebugCodeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/DebugCodeSniff.php deleted file mode 100644 index eccf6fe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/DebugCodeSniff.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Debug; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class DebugCodeSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DOUBLE_COLON]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $className = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if (strtolower($tokens[$className]['content']) === 'debug') { - $method = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - $error = 'Call to debug function Debug::%s() must be removed'; - $data = [$tokens[$method]['content']]; - $phpcsFile->addError($error, $stackPtr, 'Found', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/FirebugConsoleSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/FirebugConsoleSniff.php deleted file mode 100644 index 3115bac..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/FirebugConsoleSniff.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Debug; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class FirebugConsoleSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_STRING, - T_PROPERTY, - T_LABEL, - T_OBJECT, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (strtolower($tokens[$stackPtr]['content']) === 'console') { - $error = 'Variables, functions and labels must not be named "console"; name may conflict with Firebug internal variable'; - $phpcsFile->addError($error, $stackPtr, 'ConflictFound'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/AssignThisSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/AssignThisSniff.php deleted file mode 100644 index 0a3c9cf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/AssignThisSniff.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Objects; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class AssignThisSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_THIS]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore this.something and other uses of "this" that are not - // direct assignments. - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] !== T_SEMICOLON) { - if ($tokens[$next]['line'] === $tokens[$stackPtr]['line']) { - return; - } - } - - // Something must be assigned to "this". - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] !== T_EQUAL) { - return; - } - - // A variable needs to be assigned to "this". - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($prev - 1), null, true); - if ($tokens[$prev]['code'] !== T_STRING) { - return; - } - - // We can only assign "this" to a var called "self". - if ($tokens[$prev]['content'] !== 'self' && $tokens[$prev]['content'] !== '_self') { - $error = 'Keyword "this" can only be assigned to a variable called "self" or "_self"'; - $phpcsFile->addError($error, $prev, 'NotSelf'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/CreateWidgetTypeCallbackSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/CreateWidgetTypeCallbackSniff.php deleted file mode 100644 index 8fb8937..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/CreateWidgetTypeCallbackSniff.php +++ /dev/null @@ -1,218 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Objects; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class CreateWidgetTypeCallbackSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OBJECT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $className = $phpcsFile->findPrevious(T_STRING, ($stackPtr - 1)); - if (substr(strtolower($tokens[$className]['content']), -10) !== 'widgettype') { - return; - } - - // Search for a create method. - $create = $phpcsFile->findNext(T_PROPERTY, $stackPtr, $tokens[$stackPtr]['bracket_closer'], null, 'create'); - if ($create === false) { - return; - } - - $function = $phpcsFile->findNext([T_WHITESPACE, T_COLON], ($create + 1), null, true); - if ($tokens[$function]['code'] !== T_FUNCTION - && $tokens[$function]['code'] !== T_CLOSURE - ) { - return; - } - - $start = ($tokens[$function]['scope_opener'] + 1); - $end = ($tokens[$function]['scope_closer'] - 1); - - // Check that the first argument is called "callback". - $arg = $phpcsFile->findNext(T_WHITESPACE, ($tokens[$function]['parenthesis_opener'] + 1), null, true); - if ($tokens[$arg]['content'] !== 'callback') { - $error = 'The first argument of the create() method of a widget type must be called "callback"'; - $phpcsFile->addError($error, $arg, 'FirstArgNotCallback'); - } - - /* - Look for return statements within the function. They cannot return - anything and must be preceded by the callback.call() line. The - callback itself must contain "self" or "this" as the first argument - and there needs to be a call to the callback function somewhere - in the create method. All calls to the callback function must be - followed by a return statement or the end of the method. - */ - - $foundCallback = false; - $passedCallback = false; - $nestedFunction = null; - for ($i = $start; $i <= $end; $i++) { - // Keep track of nested functions. - if ($nestedFunction !== null) { - if ($i === $nestedFunction) { - $nestedFunction = null; - continue; - } - } else if (($tokens[$i]['code'] === T_FUNCTION - || $tokens[$i]['code'] === T_CLOSURE) - && isset($tokens[$i]['scope_closer']) === true - ) { - $nestedFunction = $tokens[$i]['scope_closer']; - continue; - } - - if ($nestedFunction === null && $tokens[$i]['code'] === T_RETURN) { - // Make sure return statements are not returning anything. - if ($tokens[($i + 1)]['code'] !== T_SEMICOLON) { - $error = 'The create() method of a widget type must not return a value'; - $phpcsFile->addError($error, $i, 'ReturnValue'); - } - - continue; - } else if ($tokens[$i]['code'] !== T_STRING - || $tokens[$i]['content'] !== 'callback' - ) { - continue; - } - - // If this is the form "callback.call(" then it is a call - // to the callback function. - if ($tokens[($i + 1)]['code'] !== T_OBJECT_OPERATOR - || $tokens[($i + 2)]['content'] !== 'call' - || $tokens[($i + 3)]['code'] !== T_OPEN_PARENTHESIS - ) { - // One last chance; this might be the callback function - // being passed to another function, like this - // "this.init(something, callback, something)". - if (isset($tokens[$i]['nested_parenthesis']) === false) { - continue; - } - - // Just make sure those brackets don't belong to anyone, - // like an IF or FOR statement. - foreach ($tokens[$i]['nested_parenthesis'] as $bracket) { - if (isset($tokens[$bracket]['parenthesis_owner']) === true) { - continue(2); - } - } - - // Note that we use this endBracket down further when checking - // for a RETURN statement. - $nestedParens = $tokens[$i]['nested_parenthesis']; - $endBracket = end($nestedParens); - $bracket = key($nestedParens); - - $prev = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($bracket - 1), - null, - true - ); - - if ($tokens[$prev]['code'] !== T_STRING) { - // This is not a function passing the callback. - continue; - } - - $passedCallback = true; - }//end if - - $foundCallback = true; - - if ($passedCallback === false) { - // The first argument must be "this" or "self". - $arg = $phpcsFile->findNext(T_WHITESPACE, ($i + 4), null, true); - if ($tokens[$arg]['content'] !== 'this' - && $tokens[$arg]['content'] !== 'self' - ) { - $error = 'The first argument passed to the callback function must be "this" or "self"'; - $phpcsFile->addError($error, $arg, 'FirstArgNotSelf'); - } - } - - // Now it must be followed by a return statement or the end of the function. - if ($passedCallback === false) { - $endBracket = $tokens[($i + 3)]['parenthesis_closer']; - } - - for ($next = $endBracket; $next <= $end; $next++) { - // Skip whitespace so we find the next content after the call. - if (isset(Tokens::$emptyTokens[$tokens[$next]['code']]) === true) { - continue; - } - - // Skip closing braces like END IF because it is not executable code. - if ($tokens[$next]['code'] === T_CLOSE_CURLY_BRACKET) { - continue; - } - - // We don't care about anything on the current line, like a - // semicolon. It doesn't matter if there are other statements on the - // line because another sniff will check for those. - if ($tokens[$next]['line'] === $tokens[$endBracket]['line']) { - continue; - } - - break; - } - - if ($next !== $tokens[$function]['scope_closer'] - && $tokens[$next]['code'] !== T_RETURN - ) { - $error = 'The call to the callback function must be followed by a return statement if it is not the last statement in the create() method'; - $phpcsFile->addError($error, $i, 'NoReturn'); - } - }//end for - - if ($foundCallback === false) { - $error = 'The create() method of a widget type must call the callback function'; - $phpcsFile->addError($error, $create, 'CallbackNotCalled'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/DisallowNewWidgetSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/DisallowNewWidgetSniff.php deleted file mode 100644 index cae7c08..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/DisallowNewWidgetSniff.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Objects; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class DisallowNewWidgetSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_NEW]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $className = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$className]['code'] !== T_STRING) { - return; - } - - if (substr(strtolower($tokens[$className]['content']), -10) === 'widgettype') { - $widgetType = substr($tokens[$className]['content'], 0, -10); - $error = 'Manual creation of widget objects is banned; use Widget::getWidget(\'%s\'); instead'; - $data = [$widgetType]; - $phpcsFile->addError($error, $stackPtr, 'Found', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/AjaxNullComparisonSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/AjaxNullComparisonSniff.php deleted file mode 100644 index 3914b7b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/AjaxNullComparisonSniff.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\PHP; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class AjaxNullComparisonSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Make sure it is an API function. We know this by the doc comment. - $commentEnd = $phpcsFile->findPrevious(T_DOC_COMMENT_CLOSE_TAG, $stackPtr); - $commentStart = $phpcsFile->findPrevious(T_DOC_COMMENT_OPEN_TAG, ($commentEnd - 1)); - // If function doesn't contain any doc comments - skip it. - if ($commentEnd === false || $commentStart === false) { - return; - } - - $comment = $phpcsFile->getTokensAsString($commentStart, ($commentEnd - $commentStart)); - if (strpos($comment, '* @api') === false) { - return; - } - - // Find all the vars passed in as we are only interested in comparisons - // to NULL for these specific variables. - $foundVars = []; - $open = $tokens[$stackPtr]['parenthesis_opener']; - $close = $tokens[$stackPtr]['parenthesis_closer']; - for ($i = ($open + 1); $i < $close; $i++) { - if ($tokens[$i]['code'] === T_VARIABLE) { - $foundVars[$tokens[$i]['content']] = true; - } - } - - if (empty($foundVars) === true) { - return; - } - - $start = $tokens[$stackPtr]['scope_opener']; - $end = $tokens[$stackPtr]['scope_closer']; - for ($i = ($start + 1); $i < $end; $i++) { - if ($tokens[$i]['code'] !== T_VARIABLE - || isset($foundVars[$tokens[$i]['content']]) === false - ) { - continue; - } - - $operator = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), null, true); - if ($tokens[$operator]['code'] !== T_IS_IDENTICAL - && $tokens[$operator]['code'] !== T_IS_NOT_IDENTICAL - ) { - continue; - } - - $nullValue = $phpcsFile->findNext(T_WHITESPACE, ($operator + 1), null, true); - if ($tokens[$nullValue]['code'] !== T_NULL) { - continue; - } - - $error = 'Values submitted via Ajax requests should not be compared directly to NULL; use empty() instead'; - $phpcsFile->addWarning($error, $nullValue, 'Found'); - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php deleted file mode 100644 index 67b3572..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php +++ /dev/null @@ -1,114 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\PHP; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class EvalObjectFactorySniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_EVAL]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - /* - We need to find all strings that will be in the eval - to determine if the "new" keyword is being used. - */ - - $openBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($stackPtr + 1)); - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - $strings = []; - $vars = []; - - for ($i = ($openBracket + 1); $i < $closeBracket; $i++) { - if (isset(Tokens::$stringTokens[$tokens[$i]['code']]) === true) { - $strings[$i] = $tokens[$i]['content']; - } else if ($tokens[$i]['code'] === T_VARIABLE) { - $vars[$i] = $tokens[$i]['content']; - } - } - - /* - We now have some variables that we need to expand into - the strings that were assigned to them, if any. - */ - - foreach ($vars as $varPtr => $varName) { - while (($prev = $phpcsFile->findPrevious(T_VARIABLE, ($varPtr - 1))) !== false) { - // Make sure this is an assignment of the variable. That means - // it will be the first thing on the line. - $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, ($prev - 1), null, true); - if ($tokens[$prevContent]['line'] === $tokens[$prev]['line']) { - $varPtr = $prevContent; - continue; - } - - if ($tokens[$prev]['content'] !== $varName) { - // This variable has a different name. - $varPtr = $prevContent; - continue; - } - - // We found one. - break; - }//end while - - if ($prev !== false) { - // Find all strings on the line. - $lineEnd = $phpcsFile->findNext(T_SEMICOLON, ($prev + 1)); - for ($i = ($prev + 1); $i < $lineEnd; $i++) { - if (isset(Tokens::$stringTokens[$tokens[$i]['code']]) === true) { - $strings[$i] = $tokens[$i]['content']; - } - } - } - }//end foreach - - foreach ($strings as $string) { - // If the string has "new" in it, it is not allowed. - // We don't bother checking if the word "new" is printed to screen - // because that is unlikely to happen. We assume the use - // of "new" is for object instantiation. - if (strstr($string, ' new ') !== false) { - $error = 'Do not use eval() to create objects dynamically; use reflection instead'; - $phpcsFile->addWarning($error, $stackPtr, 'Found'); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/GetRequestDataSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/GetRequestDataSniff.php deleted file mode 100644 index 82419fc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/GetRequestDataSniff.php +++ /dev/null @@ -1,106 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\PHP; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class GetRequestDataSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_VARIABLE]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $varName = $tokens[$stackPtr]['content']; - if ($varName !== '$_REQUEST' - && $varName !== '$_GET' - && $varName !== '$_POST' - && $varName !== '$_FILES' - ) { - return; - } - - // The only place these super globals can be accessed directly is - // in the getRequestData() method of the Security class. - $inClass = false; - foreach ($tokens[$stackPtr]['conditions'] as $i => $type) { - if ($tokens[$i]['code'] === T_CLASS) { - $className = $phpcsFile->findNext(T_STRING, $i); - $className = $tokens[$className]['content']; - if (strtolower($className) === 'security') { - $inClass = true; - } else { - // We don't have nested classes. - break; - } - } else if ($inClass === true && $tokens[$i]['code'] === T_FUNCTION) { - $funcName = $phpcsFile->findNext(T_STRING, $i); - $funcName = $tokens[$funcName]['content']; - if (strtolower($funcName) === 'getrequestdata') { - // This is valid. - return; - } else { - // We don't have nested functions. - break; - } - }//end if - }//end foreach - - // If we get to here, the super global was used incorrectly. - // First find out how it is being used. - $globalName = strtolower(substr($varName, 2)); - $usedVar = ''; - - $openBracket = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$openBracket]['code'] === T_OPEN_SQUARE_BRACKET) { - $closeBracket = $tokens[$openBracket]['bracket_closer']; - $usedVar = $phpcsFile->getTokensAsString(($openBracket + 1), ($closeBracket - $openBracket - 1)); - } - - $type = 'SuperglobalAccessed'; - $error = 'The %s super global must not be accessed directly; use Security::getRequestData('; - $data = [$varName]; - if ($usedVar !== '') { - $type .= 'WithVar'; - $error .= '%s, \'%s\''; - $data[] = $usedVar; - $data[] = $globalName; - } - - $error .= ') instead'; - $phpcsFile->addError($error, $stackPtr, $type, $data); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/ReturnFunctionValueSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/ReturnFunctionValueSniff.php deleted file mode 100644 index 9b2029a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/ReturnFunctionValueSniff.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\PHP; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class ReturnFunctionValueSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_RETURN]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $functionName = $phpcsFile->findNext(T_STRING, ($stackPtr + 1), null, false, null, true); - - while ($functionName !== false) { - // Check if this is really a function. - $bracket = $phpcsFile->findNext(T_WHITESPACE, ($functionName + 1), null, true); - if ($tokens[$bracket]['code'] !== T_OPEN_PARENTHESIS) { - // Not a function call. - $functionName = $phpcsFile->findNext(T_STRING, ($functionName + 1), null, false, null, true); - continue; - } - - $error = 'The result of a function call should be assigned to a variable before being returned'; - $phpcsFile->addWarning($error, $stackPtr, 'NotAssigned'); - break; - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Strings/JoinStringsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Strings/JoinStringsSniff.php deleted file mode 100644 index 311cf68..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Strings/JoinStringsSniff.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Strings; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class JoinStringsSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_STRING]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param integer $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['content'] !== 'join') { - return; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] !== T_OBJECT_OPERATOR) { - return; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - if ($tokens[$prev]['code'] === T_CLOSE_SQUARE_BRACKET) { - $opener = $tokens[$prev]['bracket_opener']; - if ($tokens[($opener - 1)]['code'] !== T_STRING) { - // This means the array is declared inline, like x = [a,b,c].join() - // and not elsewhere, like x = y[a].join() - // The first is not allowed while the second is. - $error = 'Joining strings using inline arrays is not allowed; use the + operator instead'; - $phpcsFile->addError($error, $stackPtr, 'ArrayNotAllowed'); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.css deleted file mode 100644 index 339ee15..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.css +++ /dev/null @@ -1,13 +0,0 @@ -.SettingsTabPaneWidgetType-tab-mid { - background: transparent url(tab_inact_mid.png) repeat-x; - line-height: -25px; - cursor: pointer; - -moz-user-select: none; -} - -.AssetLineageWidgetType-item { - float: left; - list-style: none; - height: 22px; - cursor: pointer; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.php deleted file mode 100644 index 2135349..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class BrowserSpecificStylesUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [5 => 1]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.inc deleted file mode 100644 index 95fd04b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.inc +++ /dev/null @@ -1,51 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.php deleted file mode 100644 index d29bf5c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Channels; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowSelfActionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 12 => 1, - 13 => 1, - 28 => 1, - 29 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.inc deleted file mode 100644 index ccb0273..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.inc +++ /dev/null @@ -1,112 +0,0 @@ -fetch(PDO::FETCH_NUM) -BaseSystem::getDataDir(); -Util::getArrayIndex(array(), ''); - - -Channels::includeSystem('Widget'); -Widget::includeWidget('AbstractContainer'); -class MyWidget extends AbstractContainerWidgetType {} -class MyOtherWidget extends BookWidgetType {} - -$zip = new ZipArchive(); -$res = $zip->open($path, ZipArchive::CREATE); - -class AssetListingUnitTest extends AbstractMySourceUnitTest -{ - function setUp() { - parent::setUp(); - Channels::includeSystem('MySystem2'); - include_once 'Libs/FileSystem.inc'; - } - - function two() { - $siteid = MySystem2::getCurrentSiteId(); - $parserFiles = FileSystem::listDirectory(); - } - - function three() { - $siteid = MySystem3::getCurrentSiteId(); - $parserFiles = FileSystem::listDirectory(); - } -} - -if (Channels::systemExists('Log') === TRUE) { - Channels::includeSystem('Log'); -} else { - return; -} - -Log::addProjectLog('metadata.field.update', $msg); - -function two() { - Widget::includeWidget('CacheAdminScreen'); - $barChart = CacheAdminScreenWidgetType::constructBarchart($data); -} - -$adjustDialog->setOrientation(AbstractWidgetWidgetType::CENTER); - -$className = 'SquizPerspective'.ucfirst($property['type']).'PropertyType'; -Channels::includeSystem($className); -$className::setValue($assetid, $propertyid, $perspectives, $value, (array) $property['settings']); -?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.php deleted file mode 100644 index 0320038..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Channels; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class IncludeSystemUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 14 => 1, - 24 => 1, - 27 => 1, - 28 => 1, - 31 => 1, - 36 => 1, - 41 => 1, - 61 => 1, - 70 => 1, - 89 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.inc deleted file mode 100644 index c7bd473..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.inc +++ /dev/null @@ -1,67 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.php deleted file mode 100644 index fbc0ac7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Channels; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class UnusedSystemUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 5 => 1, - 8 => 1, - 24 => 1, - 34 => 1, - 54 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.inc deleted file mode 100644 index 19d5c5d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.inc +++ /dev/null @@ -1,101 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.php deleted file mode 100644 index 5cc43b6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 28 => 1, - 36 => 1, - 37 => 2, - 49 => 1, - 58 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.inc deleted file mode 100644 index 3490161..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.inc +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.php deleted file mode 100644 index 78da9c9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Debug; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DebugCodeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 3 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.js deleted file mode 100644 index d5e3df5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.js +++ /dev/null @@ -1,8 +0,0 @@ -console.info(); -console.warn(); -console.test(); -con.sole(); -var console = { - console: 'string'; -}; -function console() {} \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.php deleted file mode 100644 index 3a9c235..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Debug; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FirebugConsoleUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='FirebugConsoleUnitTest.js') - { - if ($testFile !== 'FirebugConsoleUnitTest.js') { - return []; - } - - return [ - 1 => 1, - 2 => 1, - 3 => 1, - 5 => 1, - 6 => 1, - 8 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.js deleted file mode 100644 index 747a100..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.js +++ /dev/null @@ -1,20 +0,0 @@ -var self = this; -buttonWidget.addClickEvent(function() { - self.addDynamicSouce(); -}); - -var x = self; -var y = this; - -var test = ''; -if (true) { - test = this -} - -var itemid = this.items[i].getAttribute('itemid'); - -for (var x = this; y < 10; y++) { - var x = this + 1; -} - -var _self = this; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.php deleted file mode 100644 index f28dff1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class AssignThisUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='AssignThisUnitTest.js') - { - if ($testFile !== 'AssignThisUnitTest.js') { - return []; - } - - return [ - 7 => 1, - 11 => 1, - 16 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.js deleted file mode 100644 index 22822d3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.js +++ /dev/null @@ -1,186 +0,0 @@ -SampleWidgetType.prototype = { - - create: function(callback) - { - if (x === 1) { - return; - } - - if (y === 1) { - callback.call(this); - // A comment here to explain the return is okay. - return; - } - - if (a === 1) { - // Cant return value even after calling callback. - callback.call(this); - return something; - } - - if (a === 1) { - // Need to pass self or this to callback function. - callback.call(a); - } - - callback.call(self); - - var self = this; - this.createChildren(null, function() { - callback.call(self, div); - }); - - // Never good to return a value. - return something; - - callback.call(self); - } - -}; - -AnotherSampleWidgetType.prototype = { - - create: function(input) - { - return; - } - - getSomething: function(input) - { - return 1; - } - -}; - - -NoCreateWidgetType.prototype = { - - getSomething: function(input) - { - return; - } - -}; - - -SomeRandom.prototype = { - - create: function(input) - { - return; - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - if (a === 1) { - // This is ok because it is the last statement, - // even though it is conditional. - callback.call(self); - } - - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - var something = callback; - - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - // Also valid because we are passing the callback to - // someone else to call. - if (y === 1) { - this.something(callback); - return; - } - - this.init(callback); - - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - // Also valid because we are passing the callback to - // someone else to call. - if (y === 1) { - this.something(callback); - } - - this.init(callback); - - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - if (a === 1) { - // This is ok because it is the last statement, - // even though it is conditional. - this.something(callback); - } - - } - -}; - - -SampleWidgetType.prototype = { - - create: function(callback) - { - if (dfx.isFn(callback) === true) { - callback.call(this, cont); - return; - } - } - -}; - - -SampleWidgetType.prototype = { - - create: function(callback) - { - dfx.foreach(items, function(item) { - return true; - }); - - if (dfx.isFn(callback) === true) { - callback.call(this); - } - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - var self = this; - this.createChildren(null, function() { - callback.call(self, div); - return; - }); - } - -}; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.php deleted file mode 100644 index a3c55bf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class CreateWidgetTypeCallbackUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='CreateWidgetTypeCallbackUnitTest.js') - { - return [ - 18 => 1, - 23 => 2, - 26 => 1, - 30 => 1, - 34 => 1, - 43 => 2, - 91 => 1, - 123 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.inc deleted file mode 100644 index acf9baf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.inc +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.php deleted file mode 100644 index 333952f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowNewWidgetUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [4 => 1]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.inc deleted file mode 100644 index 337914a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.inc +++ /dev/null @@ -1,182 +0,0 @@ -getMessage()); - }//end try - - if ($something === NULL) { - if ($bar !== NULL) { - } - } - - return $issueid; - -}//end addIssue() - -/** - * Adds a new issue. - * - * Returns the new issue id. - * - * @param string $title Title of the new issue. - * @param string $description The description of the issue. - * @param string $reporter Asset id of the reporter. - * @param integer $projectid Id of the project that the issue belongs to. - * @param array $tags Array of tags. - * @param string $status The status of the issue. - * @param string $assignedTo The asset id of the user that the issue is - * assigned to. - * @param string $reportedDate If set then this date will be used instead of the - * current date and time. - * @param integer $reportedMilestone Reported milestone. - * - * @return integer - * @throws ChannelException If there is an error. - * - */ -public static function addIssue( - $title, - $description, - $reporter=NULL, - $projectid=NULL, - array $tags=array(), - $status=NULL, - $assignedTo=NULL, - $reportedDate=NULL, - $reportedMilestone=NULL -) { - // Get current projectid if not specified. - if ($projectid === NULL) { - Channels::includeSystem('Project'); - $projectid = Project::getCurrentProjectId(); - Channels::modifyBasket('project', $projectid); - } - -}//end addIssue() diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.php deleted file mode 100644 index 315808b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class AjaxNullComparisonUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 41 => 1, - 53 => 1, - 64 => 1, - 77 => 1, - 92 => 1, - 122 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.inc deleted file mode 100644 index 992a7dc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.inc +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.php deleted file mode 100644 index 423f242..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class EvalObjectFactoryUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 4 => 1, - 12 => 1, - 21 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.inc deleted file mode 100644 index 7999763..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.inc +++ /dev/null @@ -1,30 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.php deleted file mode 100644 index 16e4cfb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class GetRequestDataUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 5 => 1, - 8 => 1, - 21 => 1, - 26 => 1, - 27 => 1, - 28 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.inc deleted file mode 100644 index f9148a7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.inc +++ /dev/null @@ -1,9 +0,0 @@ -myFunction(); -return $obj->variable; -return MyClass::VARIABLE; -return $variable; -return ($var + 1); -?> \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.php deleted file mode 100644 index 3236378..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ReturnFunctionValueUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 2 => 1, - 3 => 1, - 4 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.js deleted file mode 100644 index 46d90cf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.js +++ /dev/null @@ -1,18 +0,0 @@ -one = (1 + 2); -two = (one + 2); -two = (one + one); -three = ('1' + 2); - -four = ['1', two].join(); -four = ['1', two].join(''); -four = ['1', [one, two].join(',')].join(' '); -four = ['1', [one, two].join()].join(' '); -four = ['1', [one, two].join()].join(); - -five = 'string' + ['1', [one, two].join()].join() + 'string'; - -six = myArray.join(' '); -six = [arrayOne, arrayTwo].join(); - -// This is fine because the array is not created inline. -var x = 'x' + test[x].join('p') + 't'; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.php deleted file mode 100644 index ecd490a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Strings; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class JoinStringsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='JoinStringsUnitTest.js') - { - if ($testFile !== 'JoinStringsUnitTest.js') { - return []; - } - - return [ - 6 => 1, - 7 => 1, - 8 => 2, - 9 => 2, - 10 => 2, - 12 => 2, - 15 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/ruleset.xml deleted file mode 100644 index 9240795..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/ruleset.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - The MySource coding standard builds on the Squiz coding standard. Currently used for MySource Mini development. - - */Tests/* - */Oven/* - */data/* - */jquery.js - */jquery.*.js - */viper/* - DALConf.inc - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Classes/ClassDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Classes/ClassDeclarationStandard.xml deleted file mode 100644 index b5d53fd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Classes/ClassDeclarationStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - { -} - ]]> - - - { -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/ClassCommentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/ClassCommentStandard.xml deleted file mode 100644 index fe81620..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/ClassCommentStandard.xml +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - /** - * The Foo class. - */ -class Foo -{ -} - ]]> - - - - - - - - /** - * The Foo class. - */ -class Foo -{ -} - ]]> - - - - - - - - /** - * The Foo class. - */ -class Foo -{ -} - ]]> - - - /** - * The Foo class. - */ - -class Foo -{ -} - ]]> - - - - - The Foo class. - */ -class Foo -{ -} - ]]> - - - The Foo class. - */ -class Foo -{ -} - ]]> - - - - - - * A helper for the Bar class. - * - * @see Bar - */ -class Foo -{ -} - ]]> - - - - * - * A helper for the Bar class. - * - * - * @see Bar - */ -class Foo -{ -} - ]]> - - - - - - * @see Bar - */ -class Foo -{ -} - ]]> - - - - * - * @see Bar - */ -class Foo -{ -} - ]]> - - - - - Release: 1.0 - */ -class Foo -{ -} - ]]> - - - 1.0 - */ -class Foo -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FileCommentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FileCommentStandard.xml deleted file mode 100644 index eef0b4e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FileCommentStandard.xml +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - /** - * Short description here. - * - * PHP version 5 - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - ]]> - - - - - Short description here. - * - * PHP version 5 - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - * Short description here. - * - * PHP version 5 - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - - * PHP version 5 - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - * - * PHP version 5 - * - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - - - - @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - @category Foo - * @category Bar - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - PHP version 5 - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - @package Foo_Helpers - * @category Foo - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FunctionCommentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FunctionCommentStandard.xml deleted file mode 100644 index 621649f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FunctionCommentStandard.xml +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - /** - * Short description here. - * - * @return void - */ - function foo() - { - } - ]]> - - - - - - - - Short description here. - * - * @return void - */ - function foo() - { - } - ]]> - - - - * Short description here. - * - * @return void - */ - function foo() - { - } - ]]> - - - - - - * Long description here. - * - * @return void - */ - function foo() - { - } - ]]> - - - - * - * Long description here. - * - * - * @return void - */ - function foo() - { - } - ]]> - - - - - - * @return void - */ - function foo() - { - } - ]]> - - - - * - * @return void - */ - function foo() - { - } - ]]> - - - - - FooException - */ - function foo() - { - } - ]]> - - - @throws - */ - function foo() - { - } - ]]> - - - - - @return void - */ - function foo() - { - } - ]]> - - - - - - - - $foo Foo parameter - * @param string $bar Bar parameter - * @return void - */ - function foo($foo, $bar) - { - } - ]]> - - - $qux Bar parameter - * @return void - */ - function foo($foo, $bar) - { - } - ]]> - - - - - $foo Foo parameter - * @param string $bar Bar parameter - * @return void - */ - function foo($foo, $bar) - { - } - ]]> - - - $bar Bar parameter - * @param string $foo Foo parameter - * @return void - */ - function foo($foo, $bar) - { - } - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/InlineCommentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/InlineCommentStandard.xml deleted file mode 100644 index 53056e2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/InlineCommentStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - // A comment. - ]]> - - - # A comment. - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/ControlSignatureStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/ControlSignatureStandard.xml deleted file mode 100644 index ce430fb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/ControlSignatureStandard.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - ($foo) { -} - ]]> - - - ($foo){ -} - ]]> - - - - - { -} - ]]> - - - { -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/MultiLineConditionStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/MultiLineConditionStandard.xml deleted file mode 100644 index 96d451d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/MultiLineConditionStandard.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - && $bar -) { -} - ]]> - - - && $bar -) { -} - ]]> - - - - - && $bar -) { -} - ]]> - - - && - $bar -) { -} - ]]> - - - - - ) { -} - ]]> - - - ) { -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/IncludingFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/IncludingFileStandard.xml deleted file mode 100644 index 6d115be..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/IncludingFileStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - require_once. Anywhere you are conditionally including a class file (for example, factory methods), use include_once. Either of these will ensure that class files are included only once. They share the same file list, so you don't need to worry about mixing them - a file included with require_once will not be included again by include_once. - ]]> - - - include_once and require_once are statements, not functions. Parentheses should not surround the subject filename. - ]]> - - - - - - - ('PHP/CodeSniffer.php'); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/LineLengthStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/LineLengthStandard.xml deleted file mode 100644 index e4911ef..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/LineLengthStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Formatting/MultiLineAssignmentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Formatting/MultiLineAssignmentStandard.xml deleted file mode 100644 index e825c55..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Formatting/MultiLineAssignmentStandard.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - = $bar; - ]]> - - - = - $bar; - ]]> - - - - - = $bar; - ]]> - - - = $bar; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionCallSignatureStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionCallSignatureStandard.xml deleted file mode 100644 index f874227..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionCallSignatureStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - ( $bar, $baz, $quux ) ; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionDeclarationStandard.xml deleted file mode 100644 index ced9ae2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionDeclarationStandard.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - () use ($bar) { -}; - ]]> - - - ()use($bar){ -}; - ]]> - - - - - $bar, - $baz -) { -}; - ]]> - - - $bar, -$baz) -{ -}; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/ValidDefaultValueStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/ValidDefaultValueStandard.xml deleted file mode 100644 index 56196cb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/ValidDefaultValueStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - $persistent = false) -{ - ... -} - ]]> - - - $persistent = false, $dsn) -{ - ... -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidClassNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidClassNameStandard.xml deleted file mode 100644 index d160879..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidClassNameStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidFunctionNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidFunctionNameStandard.xml deleted file mode 100644 index 60841dd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidFunctionNameStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidVariableNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidVariableNameStandard.xml deleted file mode 100644 index 4c707bd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidVariableNameStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - publicVar; - protected $protectedVar; - private $_privateVar; -} - ]]> - - - _publicVar; - protected $_protectedVar; - private $privateVar; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ObjectOperatorIndentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ObjectOperatorIndentStandard.xml deleted file mode 100644 index 9dee905..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ObjectOperatorIndentStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - ->bar() - ->baz(); - ]]> - - - -> - bar()-> - baz(); - ]]> - - - - - ->bar() - ->baz(); - ]]> - - - ->bar() -->baz(); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeClosingBraceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeClosingBraceStandard.xml deleted file mode 100644 index c8d6e27..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeClosingBraceStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - } - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeIndentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeIndentStandard.xml deleted file mode 100644 index fafa07a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeIndentStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - if ($test) { - $var = 1; - } -} - ]]> - - - if ($test) { -$var = 1; -} -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Classes/ClassDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Classes/ClassDeclarationSniff.php deleted file mode 100644 index a5b07a9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Classes/ClassDeclarationSniff.php +++ /dev/null @@ -1,149 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClassDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param integer $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $errorData = [strtolower($tokens[$stackPtr]['content'])]; - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - $error = 'Possible parse error: %s missing opening or closing brace'; - $phpcsFile->addWarning($error, $stackPtr, 'MissingBrace', $errorData); - return; - } - - $curlyBrace = $tokens[$stackPtr]['scope_opener']; - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($curlyBrace - 1), $stackPtr, true); - $classLine = $tokens[$lastContent]['line']; - $braceLine = $tokens[$curlyBrace]['line']; - if ($braceLine === $classLine) { - $phpcsFile->recordMetric($stackPtr, 'Class opening brace placement', 'same line'); - $error = 'Opening brace of a %s must be on the line after the definition'; - $fix = $phpcsFile->addFixableError($error, $curlyBrace, 'OpenBraceNewLine', $errorData); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if ($tokens[($curlyBrace - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($curlyBrace - 1), ''); - } - - $phpcsFile->fixer->addNewlineBefore($curlyBrace); - $phpcsFile->fixer->endChangeset(); - } - - return; - } else { - $phpcsFile->recordMetric($stackPtr, 'Class opening brace placement', 'new line'); - - if ($braceLine > ($classLine + 1)) { - $error = 'Opening brace of a %s must be on the line following the %s declaration; found %s line(s)'; - $data = [ - $tokens[$stackPtr]['content'], - $tokens[$stackPtr]['content'], - ($braceLine - $classLine - 1), - ]; - $fix = $phpcsFile->addFixableError($error, $curlyBrace, 'OpenBraceWrongLine', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($curlyBrace - 1); $i > $lastContent; $i--) { - if ($tokens[$i]['line'] === ($tokens[$curlyBrace]['line'] + 1)) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - }//end if - }//end if - - if ($tokens[($curlyBrace + 1)]['content'] !== $phpcsFile->eolChar) { - $error = 'Opening %s brace must be on a line by itself'; - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($curlyBrace + 1), null, true); - if ($tokens[$nextNonWhitespace]['code'] === T_PHPCS_IGNORE) { - // Don't auto-fix if the next thing is a PHPCS ignore annotation. - $phpcsFile->addError($error, $curlyBrace, 'OpenBraceNotAlone', $errorData); - } else { - $fix = $phpcsFile->addFixableError($error, $curlyBrace, 'OpenBraceNotAlone', $errorData); - if ($fix === true) { - $phpcsFile->fixer->addNewline($curlyBrace); - } - } - } - - if ($tokens[($curlyBrace - 1)]['code'] === T_WHITESPACE) { - $prevContent = $tokens[($curlyBrace - 1)]['content']; - if ($prevContent === $phpcsFile->eolChar) { - $spaces = 0; - } else { - $spaces = $tokens[($curlyBrace - 1)]['length']; - } - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - $expected = ($tokens[$first]['column'] - 1); - if ($spaces !== $expected) { - $error = 'Expected %s spaces before opening brace; %s found'; - $data = [ - $expected, - $spaces, - ]; - - $fix = $phpcsFile->addFixableError($error, $curlyBrace, 'SpaceBeforeBrace', $data); - if ($fix === true) { - $indent = str_repeat(' ', $expected); - if ($spaces === 0) { - $phpcsFile->fixer->addContentBefore($curlyBrace, $indent); - } else { - $phpcsFile->fixer->replaceToken(($curlyBrace - 1), $indent); - } - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php deleted file mode 100644 index 90e9eb8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php +++ /dev/null @@ -1,104 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class ClassCommentSniff extends FileCommentSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $type = strtolower($tokens[$stackPtr]['content']); - $errorData = [$type]; - - $find = Tokens::$methodPrefixes; - $find[] = T_WHITESPACE; - - $commentEnd = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true); - if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG - && $tokens[$commentEnd]['code'] !== T_COMMENT - ) { - $errorData[] = $phpcsFile->getDeclarationName($stackPtr); - $phpcsFile->addError('Missing doc comment for %s %s', $stackPtr, 'Missing', $errorData); - $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'no'); - return; - } - - $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'yes'); - - if ($tokens[$commentEnd]['code'] === T_COMMENT) { - $phpcsFile->addError('You must use "/**" style comments for a %s comment', $stackPtr, 'WrongStyle', $errorData); - return; - } - - // Check each tag. - $this->processTags($phpcsFile, $stackPtr, $tokens[$commentEnd]['comment_opener']); - - }//end process() - - - /** - * Process the version tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processVersion($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - if ((strstr($content, 'Release:') === false)) { - $error = 'Invalid version "%s" in doc comment; consider "Release: " instead'; - $data = [$content]; - $phpcsFile->addWarning($error, $tag, 'InvalidVersion', $data); - } - } - - }//end processVersion() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php deleted file mode 100644 index 86f5b00..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php +++ /dev/null @@ -1,569 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Common; - -class FileCommentSniff implements Sniff -{ - - /** - * Tags in correct order and related info. - * - * @var array - */ - protected $tags = [ - '@category' => [ - 'required' => true, - 'allow_multiple' => false, - ], - '@package' => [ - 'required' => true, - 'allow_multiple' => false, - ], - '@subpackage' => [ - 'required' => false, - 'allow_multiple' => false, - ], - '@author' => [ - 'required' => true, - 'allow_multiple' => true, - ], - '@copyright' => [ - 'required' => false, - 'allow_multiple' => true, - ], - '@license' => [ - 'required' => true, - 'allow_multiple' => false, - ], - '@version' => [ - 'required' => false, - 'allow_multiple' => false, - ], - '@link' => [ - 'required' => true, - 'allow_multiple' => true, - ], - '@see' => [ - 'required' => false, - 'allow_multiple' => true, - ], - '@since' => [ - 'required' => false, - 'allow_multiple' => false, - ], - '@deprecated' => [ - 'required' => false, - 'allow_multiple' => false, - ], - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Find the next non whitespace token. - $commentStart = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - - // Allow declare() statements at the top of the file. - if ($tokens[$commentStart]['code'] === T_DECLARE) { - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($commentStart + 1)); - $commentStart = $phpcsFile->findNext(T_WHITESPACE, ($semicolon + 1), null, true); - } - - // Ignore vim header. - if ($tokens[$commentStart]['code'] === T_COMMENT) { - if (strstr($tokens[$commentStart]['content'], 'vim:') !== false) { - $commentStart = $phpcsFile->findNext( - T_WHITESPACE, - ($commentStart + 1), - null, - true - ); - } - } - - $errorToken = ($stackPtr + 1); - if (isset($tokens[$errorToken]) === false) { - $errorToken--; - } - - if ($tokens[$commentStart]['code'] === T_CLOSE_TAG) { - // We are only interested if this is the first open tag. - return ($phpcsFile->numTokens + 1); - } else if ($tokens[$commentStart]['code'] === T_COMMENT) { - $error = 'You must use "/**" style comments for a file comment'; - $phpcsFile->addError($error, $errorToken, 'WrongStyle'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); - return ($phpcsFile->numTokens + 1); - } else if ($commentStart === false - || $tokens[$commentStart]['code'] !== T_DOC_COMMENT_OPEN_TAG - ) { - $phpcsFile->addError('Missing file doc comment', $errorToken, 'Missing'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); - return ($phpcsFile->numTokens + 1); - } - - $commentEnd = $tokens[$commentStart]['comment_closer']; - - $nextToken = $phpcsFile->findNext( - T_WHITESPACE, - ($commentEnd + 1), - null, - true - ); - - $ignore = [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_FUNCTION, - T_CLOSURE, - T_PUBLIC, - T_PRIVATE, - T_PROTECTED, - T_FINAL, - T_STATIC, - T_ABSTRACT, - T_CONST, - T_PROPERTY, - ]; - - if (in_array($tokens[$nextToken]['code'], $ignore, true) === true) { - $phpcsFile->addError('Missing file doc comment', $stackPtr, 'Missing'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); - return ($phpcsFile->numTokens + 1); - } - - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); - - // Check the PHP Version, which should be in some text before the first tag. - $found = false; - for ($i = ($commentStart + 1); $i < $commentEnd; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_TAG) { - break; - } else if ($tokens[$i]['code'] === T_DOC_COMMENT_STRING - && strstr(strtolower($tokens[$i]['content']), 'php version') !== false - ) { - $found = true; - break; - } - } - - if ($found === false) { - $error = 'PHP version not specified'; - $phpcsFile->addWarning($error, $commentEnd, 'MissingVersion'); - } - - // Check each tag. - $this->processTags($phpcsFile, $stackPtr, $commentStart); - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - - /** - * Processes each required or optional tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart Position in the stack where the comment started. - * - * @return void - */ - protected function processTags($phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - - if (get_class($this) === 'PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting\FileCommentSniff') { - $docBlock = 'file'; - } else { - $docBlock = 'class'; - } - - $commentEnd = $tokens[$commentStart]['comment_closer']; - - $foundTags = []; - $tagTokens = []; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - $name = $tokens[$tag]['content']; - if (isset($this->tags[$name]) === false) { - continue; - } - - if ($this->tags[$name]['allow_multiple'] === false && isset($tagTokens[$name]) === true) { - $error = 'Only one %s tag is allowed in a %s comment'; - $data = [ - $name, - $docBlock, - ]; - $phpcsFile->addError($error, $tag, 'Duplicate'.ucfirst(substr($name, 1)).'Tag', $data); - } - - $foundTags[] = $name; - $tagTokens[$name][] = $tag; - - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $tag, $commentEnd); - if ($string === false || $tokens[$string]['line'] !== $tokens[$tag]['line']) { - $error = 'Content missing for %s tag in %s comment'; - $data = [ - $name, - $docBlock, - ]; - $phpcsFile->addError($error, $tag, 'Empty'.ucfirst(substr($name, 1)).'Tag', $data); - continue; - } - }//end foreach - - // Check if the tags are in the correct position. - $pos = 0; - foreach ($this->tags as $tag => $tagData) { - if (isset($tagTokens[$tag]) === false) { - if ($tagData['required'] === true) { - $error = 'Missing %s tag in %s comment'; - $data = [ - $tag, - $docBlock, - ]; - $phpcsFile->addError($error, $commentEnd, 'Missing'.ucfirst(substr($tag, 1)).'Tag', $data); - } - - continue; - } else { - $method = 'process'.substr($tag, 1); - if (method_exists($this, $method) === true) { - // Process each tag if a method is defined. - call_user_func([$this, $method], $phpcsFile, $tagTokens[$tag]); - } - } - - if (isset($foundTags[$pos]) === false) { - break; - } - - if ($foundTags[$pos] !== $tag) { - $error = 'The tag in position %s should be the %s tag'; - $data = [ - ($pos + 1), - $tag, - ]; - $phpcsFile->addError($error, $tokens[$commentStart]['comment_tags'][$pos], ucfirst(substr($tag, 1)).'TagOrder', $data); - } - - // Account for multiple tags. - $pos++; - while (isset($foundTags[$pos]) === true && $foundTags[$pos] === $tag) { - $pos++; - } - }//end foreach - - }//end processTags() - - - /** - * Process the category tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processCategory($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - if (Common::isUnderscoreName($content) !== true) { - $newContent = str_replace(' ', '_', $content); - $nameBits = explode('_', $newContent); - $firstBit = array_shift($nameBits); - $newName = ucfirst($firstBit).'_'; - foreach ($nameBits as $bit) { - if ($bit !== '') { - $newName .= ucfirst($bit).'_'; - } - } - - $error = 'Category name "%s" is not valid; consider "%s" instead'; - $validName = trim($newName, '_'); - $data = [ - $content, - $validName, - ]; - $phpcsFile->addError($error, $tag, 'InvalidCategory', $data); - } - }//end foreach - - }//end processCategory() - - - /** - * Process the package tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processPackage($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - if (Common::isUnderscoreName($content) === true) { - continue; - } - - $newContent = str_replace(' ', '_', $content); - $newContent = trim($newContent, '_'); - $newContent = preg_replace('/[^A-Za-z_]/', '', $newContent); - - if ($newContent === '') { - $error = 'Package name "%s" is not valid'; - $data = [$content]; - $phpcsFile->addError($error, $tag, 'InvalidPackageValue', $data); - } else { - $nameBits = explode('_', $newContent); - $firstBit = array_shift($nameBits); - $newName = strtoupper($firstBit[0]).substr($firstBit, 1).'_'; - foreach ($nameBits as $bit) { - if ($bit !== '') { - $newName .= strtoupper($bit[0]).substr($bit, 1).'_'; - } - } - - $error = 'Package name "%s" is not valid; consider "%s" instead'; - $validName = trim($newName, '_'); - $data = [ - $content, - $validName, - ]; - $phpcsFile->addError($error, $tag, 'InvalidPackage', $data); - }//end if - }//end foreach - - }//end processPackage() - - - /** - * Process the subpackage tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processSubpackage($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - if (Common::isUnderscoreName($content) === true) { - continue; - } - - $newContent = str_replace(' ', '_', $content); - $nameBits = explode('_', $newContent); - $firstBit = array_shift($nameBits); - $newName = strtoupper($firstBit[0]).substr($firstBit, 1).'_'; - foreach ($nameBits as $bit) { - if ($bit !== '') { - $newName .= strtoupper($bit[0]).substr($bit, 1).'_'; - } - } - - $error = 'Subpackage name "%s" is not valid; consider "%s" instead'; - $validName = trim($newName, '_'); - $data = [ - $content, - $validName, - ]; - $phpcsFile->addError($error, $tag, 'InvalidSubpackage', $data); - }//end foreach - - }//end processSubpackage() - - - /** - * Process the author tag(s) that this header comment has. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processAuthor($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - $local = '\da-zA-Z-_+'; - // Dot character cannot be the first or last character in the local-part. - $localMiddle = $local.'.\w'; - if (preg_match('/^([^<]*)\s+<(['.$local.'](['.$localMiddle.']*['.$local.'])*@[\da-zA-Z][-.\w]*[\da-zA-Z]\.[a-zA-Z]{2,})>$/', $content) === 0) { - $error = 'Content of the @author tag must be in the form "Display Name "'; - $phpcsFile->addError($error, $tag, 'InvalidAuthors'); - } - } - - }//end processAuthor() - - - /** - * Process the copyright tags. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processCopyright($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - $matches = []; - if (preg_match('/^([0-9]{4})((.{1})([0-9]{4}))? (.+)$/', $content, $matches) !== 0) { - // Check earliest-latest year order. - if ($matches[3] !== '' && $matches[3] !== null) { - if ($matches[3] !== '-') { - $error = 'A hyphen must be used between the earliest and latest year'; - $phpcsFile->addError($error, $tag, 'CopyrightHyphen'); - } - - if ($matches[4] !== '' && $matches[4] !== null && $matches[4] < $matches[1]) { - $error = "Invalid year span \"$matches[1]$matches[3]$matches[4]\" found; consider \"$matches[4]-$matches[1]\" instead"; - $phpcsFile->addWarning($error, $tag, 'InvalidCopyright'); - } - } - } else { - $error = '@copyright tag must contain a year and the name of the copyright holder'; - $phpcsFile->addError($error, $tag, 'IncompleteCopyright'); - } - }//end foreach - - }//end processCopyright() - - - /** - * Process the license tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processLicense($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - $matches = []; - preg_match('/^([^\s]+)\s+(.*)/', $content, $matches); - if (count($matches) !== 3) { - $error = '@license tag must contain a URL and a license name'; - $phpcsFile->addError($error, $tag, 'IncompleteLicense'); - } - } - - }//end processLicense() - - - /** - * Process the version tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processVersion($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - if (strstr($content, 'CVS:') === false - && strstr($content, 'SVN:') === false - && strstr($content, 'GIT:') === false - && strstr($content, 'HG:') === false - ) { - $error = 'Invalid version "%s" in file comment; consider "CVS: " or "SVN: " or "GIT: " or "HG: " instead'; - $data = [$content]; - $phpcsFile->addWarning($error, $tag, 'InvalidVersion', $data); - } - } - - }//end processVersion() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FunctionCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FunctionCommentSniff.php deleted file mode 100644 index a6a51f6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FunctionCommentSniff.php +++ /dev/null @@ -1,472 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionCommentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $find = Tokens::$methodPrefixes; - $find[] = T_WHITESPACE; - - $commentEnd = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true); - if ($tokens[$commentEnd]['code'] === T_COMMENT) { - // Inline comments might just be closing comments for - // control structures or functions instead of function comments - // using the wrong comment type. If there is other code on the line, - // assume they relate to that code. - $prev = $phpcsFile->findPrevious($find, ($commentEnd - 1), null, true); - if ($prev !== false && $tokens[$prev]['line'] === $tokens[$commentEnd]['line']) { - $commentEnd = $prev; - } - } - - if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG - && $tokens[$commentEnd]['code'] !== T_COMMENT - ) { - $function = $phpcsFile->getDeclarationName($stackPtr); - $phpcsFile->addError( - 'Missing doc comment for function %s()', - $stackPtr, - 'Missing', - [$function] - ); - $phpcsFile->recordMetric($stackPtr, 'Function has doc comment', 'no'); - return; - } else { - $phpcsFile->recordMetric($stackPtr, 'Function has doc comment', 'yes'); - } - - if ($tokens[$commentEnd]['code'] === T_COMMENT) { - $phpcsFile->addError('You must use "/**" style comments for a function comment', $stackPtr, 'WrongStyle'); - return; - } - - if ($tokens[$commentEnd]['line'] !== ($tokens[$stackPtr]['line'] - 1)) { - $error = 'There must be no blank lines after the function comment'; - $phpcsFile->addError($error, $commentEnd, 'SpacingAfter'); - } - - $commentStart = $tokens[$commentEnd]['comment_opener']; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] === '@see') { - // Make sure the tag isn't empty. - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $tag, $commentEnd); - if ($string === false || $tokens[$string]['line'] !== $tokens[$tag]['line']) { - $error = 'Content missing for @see tag in function comment'; - $phpcsFile->addError($error, $tag, 'EmptySees'); - } - } - } - - $this->processReturn($phpcsFile, $stackPtr, $commentStart); - $this->processThrows($phpcsFile, $stackPtr, $commentStart); - $this->processParams($phpcsFile, $stackPtr, $commentStart); - - }//end process() - - - /** - * Process the return comment of this function comment. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processReturn(File $phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - - // Skip constructor and destructor. - $methodName = $phpcsFile->getDeclarationName($stackPtr); - $isSpecialMethod = ($methodName === '__construct' || $methodName === '__destruct'); - - $return = null; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] === '@return') { - if ($return !== null) { - $error = 'Only 1 @return tag is allowed in a function comment'; - $phpcsFile->addError($error, $tag, 'DuplicateReturn'); - return; - } - - $return = $tag; - } - } - - if ($isSpecialMethod === true) { - return; - } - - if ($return !== null) { - $content = $tokens[($return + 2)]['content']; - if (empty($content) === true || $tokens[($return + 2)]['code'] !== T_DOC_COMMENT_STRING) { - $error = 'Return type missing for @return tag in function comment'; - $phpcsFile->addError($error, $return, 'MissingReturnType'); - } - } else { - $error = 'Missing @return tag in function comment'; - $phpcsFile->addError($error, $tokens[$commentStart]['comment_closer'], 'MissingReturn'); - }//end if - - }//end processReturn() - - - /** - * Process any throw tags that this function comment has. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processThrows(File $phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] !== '@throws') { - continue; - } - - $exception = null; - if ($tokens[($tag + 2)]['code'] === T_DOC_COMMENT_STRING) { - $matches = []; - preg_match('/([^\s]+)(?:\s+(.*))?/', $tokens[($tag + 2)]['content'], $matches); - $exception = $matches[1]; - } - - if ($exception === null) { - $error = 'Exception type missing for @throws tag in function comment'; - $phpcsFile->addError($error, $tag, 'InvalidThrows'); - } - }//end foreach - - }//end processThrows() - - - /** - * Process the function parameter comments. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processParams(File $phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - - $params = []; - $maxType = 0; - $maxVar = 0; - foreach ($tokens[$commentStart]['comment_tags'] as $pos => $tag) { - if ($tokens[$tag]['content'] !== '@param') { - continue; - } - - $type = ''; - $typeSpace = 0; - $var = ''; - $varSpace = 0; - $comment = ''; - $commentEnd = 0; - $commentTokens = []; - - if ($tokens[($tag + 2)]['code'] === T_DOC_COMMENT_STRING) { - $matches = []; - preg_match('/((?:(?![$.]|&(?=\$)).)*)(?:((?:\.\.\.)?(?:\$|&)[^\s]+)(?:(\s+)(.*))?)?/', $tokens[($tag + 2)]['content'], $matches); - - if (empty($matches) === false) { - $typeLen = strlen($matches[1]); - $type = trim($matches[1]); - $typeSpace = ($typeLen - strlen($type)); - $typeLen = strlen($type); - if ($typeLen > $maxType) { - $maxType = $typeLen; - } - } - - if (isset($matches[2]) === true) { - $var = $matches[2]; - $varLen = strlen($var); - if ($varLen > $maxVar) { - $maxVar = $varLen; - } - - if (isset($matches[4]) === true) { - $varSpace = strlen($matches[3]); - $comment = $matches[4]; - - // Any strings until the next tag belong to this comment. - if (isset($tokens[$commentStart]['comment_tags'][($pos + 1)]) === true) { - $end = $tokens[$commentStart]['comment_tags'][($pos + 1)]; - } else { - $end = $tokens[$commentStart]['comment_closer']; - } - - for ($i = ($tag + 3); $i < $end; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_STRING) { - $comment .= ' '.$tokens[$i]['content']; - $commentEnd = $i; - $commentTokens[] = $i; - } - } - } else { - $error = 'Missing parameter comment'; - $phpcsFile->addError($error, $tag, 'MissingParamComment'); - }//end if - } else { - $error = 'Missing parameter name'; - $phpcsFile->addError($error, $tag, 'MissingParamName'); - }//end if - } else { - $error = 'Missing parameter type'; - $phpcsFile->addError($error, $tag, 'MissingParamType'); - }//end if - - $params[] = [ - 'tag' => $tag, - 'type' => $type, - 'var' => $var, - 'comment' => $comment, - 'comment_end' => $commentEnd, - 'comment_tokens' => $commentTokens, - 'type_space' => $typeSpace, - 'var_space' => $varSpace, - ]; - }//end foreach - - $realParams = $phpcsFile->getMethodParameters($stackPtr); - $foundParams = []; - - // We want to use ... for all variable length arguments, so add - // this prefix to the variable name so comparisons are easier. - foreach ($realParams as $pos => $param) { - if ($param['variable_length'] === true) { - $realParams[$pos]['name'] = '...'.$realParams[$pos]['name']; - } - } - - foreach ($params as $pos => $param) { - if ($param['var'] === '') { - continue; - } - - $foundParams[] = $param['var']; - - if (trim($param['type']) !== '') { - // Check number of spaces after the type. - $spaces = ($maxType - strlen($param['type']) + 1); - if ($param['type_space'] !== $spaces) { - $error = 'Expected %s spaces after parameter type; %s found'; - $data = [ - $spaces, - $param['type_space'], - ]; - - $fix = $phpcsFile->addFixableError($error, $param['tag'], 'SpacingAfterParamType', $data); - if ($fix === true) { - $commentToken = ($param['tag'] + 2); - - $content = $param['type']; - $content .= str_repeat(' ', $spaces); - $content .= $param['var']; - $content .= str_repeat(' ', $param['var_space']); - - $wrapLength = ($tokens[$commentToken]['length'] - $param['type_space'] - $param['var_space'] - strlen($param['type']) - strlen($param['var'])); - - $star = $phpcsFile->findPrevious(T_DOC_COMMENT_STAR, $param['tag']); - $spaceLength = (strlen($content) + $tokens[($commentToken - 1)]['length'] + $tokens[($commentToken - 2)]['length']); - - $padding = str_repeat(' ', ($tokens[$star]['column'] - 1)); - $padding .= '* '; - $padding .= str_repeat(' ', $spaceLength); - - $content .= wordwrap( - $param['comment'], - $wrapLength, - $phpcsFile->eolChar.$padding - ); - - $phpcsFile->fixer->replaceToken($commentToken, $content); - for ($i = ($commentToken + 1); $i <= $param['comment_end']; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - }//end if - }//end if - }//end if - - // Make sure the param name is correct. - if (isset($realParams[$pos]) === true) { - $realName = $realParams[$pos]['name']; - if ($realName !== $param['var']) { - $code = 'ParamNameNoMatch'; - $data = [ - $param['var'], - $realName, - ]; - - $error = 'Doc comment for parameter %s does not match '; - if (strtolower($param['var']) === strtolower($realName)) { - $error .= 'case of '; - $code = 'ParamNameNoCaseMatch'; - } - - $error .= 'actual variable name %s'; - - $phpcsFile->addError($error, $param['tag'], $code, $data); - } - } else if (substr($param['var'], -4) !== ',...') { - // We must have an extra parameter comment. - $error = 'Superfluous parameter comment'; - $phpcsFile->addError($error, $param['tag'], 'ExtraParamComment'); - }//end if - - if ($param['comment'] === '') { - continue; - } - - // Check number of spaces after the param name. - $spaces = ($maxVar - strlen($param['var']) + 1); - if ($param['var_space'] !== $spaces) { - $error = 'Expected %s spaces after parameter name; %s found'; - $data = [ - $spaces, - $param['var_space'], - ]; - - $fix = $phpcsFile->addFixableError($error, $param['tag'], 'SpacingAfterParamName', $data); - if ($fix === true) { - $commentToken = ($param['tag'] + 2); - - $content = $param['type']; - $content .= str_repeat(' ', $param['type_space']); - $content .= $param['var']; - $content .= str_repeat(' ', $spaces); - - $wrapLength = ($tokens[$commentToken]['length'] - $param['type_space'] - $param['var_space'] - strlen($param['type']) - strlen($param['var'])); - - $star = $phpcsFile->findPrevious(T_DOC_COMMENT_STAR, $param['tag']); - $spaceLength = (strlen($content) + $tokens[($commentToken - 1)]['length'] + $tokens[($commentToken - 2)]['length']); - - $padding = str_repeat(' ', ($tokens[$star]['column'] - 1)); - $padding .= '* '; - $padding .= str_repeat(' ', $spaceLength); - - $content .= wordwrap( - $param['comment'], - $wrapLength, - $phpcsFile->eolChar.$padding - ); - - $phpcsFile->fixer->replaceToken($commentToken, $content); - for ($i = ($commentToken + 1); $i <= $param['comment_end']; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - }//end if - }//end if - - // Check the alignment of multi-line param comments. - if ($param['tag'] !== $param['comment_end']) { - $wrapLength = ($tokens[($param['tag'] + 2)]['length'] - $param['type_space'] - $param['var_space'] - strlen($param['type']) - strlen($param['var'])); - - $startColumn = ($tokens[($param['tag'] + 2)]['column'] + $tokens[($param['tag'] + 2)]['length'] - $wrapLength); - - $star = $phpcsFile->findPrevious(T_DOC_COMMENT_STAR, $param['tag']); - $expected = ($startColumn - $tokens[$star]['column'] - 1); - - foreach ($param['comment_tokens'] as $commentToken) { - if ($tokens[$commentToken]['column'] === $startColumn) { - continue; - } - - $found = 0; - if ($tokens[($commentToken - 1)]['code'] === T_DOC_COMMENT_WHITESPACE) { - $found = $tokens[($commentToken - 1)]['length']; - } - - $error = 'Parameter comment not aligned correctly; expected %s spaces but found %s'; - $data = [ - $expected, - $found, - ]; - - if ($found < $expected) { - $code = 'ParamCommentAlignment'; - } else { - $code = 'ParamCommentAlignmentExceeded'; - } - - $fix = $phpcsFile->addFixableError($error, $commentToken, $code, $data); - if ($fix === true) { - $padding = str_repeat(' ', $expected); - if ($tokens[($commentToken - 1)]['code'] === T_DOC_COMMENT_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($commentToken - 1), $padding); - } else { - $phpcsFile->fixer->addContentBefore($commentToken, $padding); - } - } - }//end foreach - }//end if - }//end foreach - - $realNames = []; - foreach ($realParams as $realParam) { - $realNames[] = $realParam['name']; - } - - // Report missing comments. - $diff = array_diff($realNames, $foundParams); - foreach ($diff as $neededParam) { - $error = 'Doc comment for parameter "%s" missing'; - $data = [$neededParam]; - $phpcsFile->addError($error, $commentStart, 'MissingParamTag', $data); - } - - }//end processParams() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/InlineCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/InlineCommentSniff.php deleted file mode 100644 index aa9f375..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/InlineCommentSniff.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class InlineCommentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_COMMENT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['content'][0] === '#') { - $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '# ...'); - - $error = 'Perl-style comments are not allowed. Use "// Comment."'; - $error .= ' or "/* comment */" instead.'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); - if ($fix === true) { - $newComment = ltrim($tokens[$stackPtr]['content'], '# '); - $newComment = '// '.$newComment; - $phpcsFile->fixer->replaceToken($stackPtr, $newComment); - } - } else if ($tokens[$stackPtr]['content'][0] === '/' - && $tokens[$stackPtr]['content'][1] === '/' - ) { - $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '// ...'); - } else if ($tokens[$stackPtr]['content'][0] === '/' - && $tokens[$stackPtr]['content'][1] === '*' - ) { - $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '/* ... */'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php deleted file mode 100644 index 5724592..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php +++ /dev/null @@ -1,47 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Sniffs\AbstractPatternSniff; - -class ControlSignatureSniff extends AbstractPatternSniff -{ - - /** - * If true, comments will be ignored if they are found in the code. - * - * @var boolean - */ - public $ignoreComments = true; - - - /** - * Returns the patterns that this test wishes to verify. - * - * @return string[] - */ - protected function getPatterns() - { - return [ - 'do {EOL...} while (...);EOL', - 'while (...) {EOL', - 'for (...) {EOL', - 'if (...) {EOL', - 'foreach (...) {EOL', - '} else if (...) {EOL', - '} elseif (...) {EOL', - '} else {EOL', - 'do {EOL', - ]; - - }//end getPatterns() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php deleted file mode 100644 index fff62bb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php +++ /dev/null @@ -1,283 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class MultiLineConditionSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_ELSEIF, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false) { - return; - } - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - $spaceAfterOpen = 0; - if ($tokens[($openBracket + 1)]['code'] === T_WHITESPACE) { - if (strpos($tokens[($openBracket + 1)]['content'], $phpcsFile->eolChar) !== false) { - $spaceAfterOpen = 'newline'; - } else { - $spaceAfterOpen = $tokens[($openBracket + 1)]['length']; - } - } - - if ($spaceAfterOpen !== 0) { - $error = 'First condition of a multi-line IF statement must directly follow the opening parenthesis'; - $fix = $phpcsFile->addFixableError($error, ($openBracket + 1), 'SpacingAfterOpenBrace'); - if ($fix === true) { - if ($spaceAfterOpen === 'newline') { - $phpcsFile->fixer->replaceToken(($openBracket + 1), ''); - } else { - $phpcsFile->fixer->replaceToken(($openBracket + 1), ''); - } - } - } - - // We need to work out how far indented the if statement - // itself is, so we can work out how far to indent conditions. - $statementIndent = 0; - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - if ($tokens[$i]['line'] !== $tokens[$stackPtr]['line']) { - $i++; - break; - } - } - - if ($i >= 0 && $tokens[$i]['code'] === T_WHITESPACE) { - $statementIndent = $tokens[$i]['length']; - } - - // Each line between the parenthesis should be indented 4 spaces - // and start with an operator, unless the line is inside a - // function call, in which case it is ignored. - $prevLine = $tokens[$openBracket]['line']; - for ($i = ($openBracket + 1); $i <= $closeBracket; $i++) { - if ($i === $closeBracket && $tokens[$openBracket]['line'] !== $tokens[$i]['line']) { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($i - 1), null, true); - if ($tokens[$prev]['line'] === $tokens[$i]['line']) { - // Closing bracket is on the same line as a condition. - $error = 'Closing parenthesis of a multi-line IF statement must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'CloseBracketNewLine'); - if ($fix === true) { - // Account for a comment at the end of the line. - $next = $phpcsFile->findNext(T_WHITESPACE, ($closeBracket + 1), null, true); - if ($tokens[$next]['code'] !== T_COMMENT - && isset(Tokens::$phpcsCommentTokens[$tokens[$next]['code']]) === false - ) { - $phpcsFile->fixer->addNewlineBefore($closeBracket); - } else { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($closeBracket, ''); - $phpcsFile->fixer->addContentBefore($next, ')'); - $phpcsFile->fixer->endChangeset(); - } - } - } - }//end if - - if ($tokens[$i]['line'] !== $prevLine) { - if ($tokens[$i]['line'] === $tokens[$closeBracket]['line']) { - $next = $phpcsFile->findNext(T_WHITESPACE, $i, null, true); - if ($next !== $closeBracket) { - $expectedIndent = ($statementIndent + $this->indent); - } else { - // Closing brace needs to be indented to the same level - // as the statement. - $expectedIndent = $statementIndent; - }//end if - } else { - $expectedIndent = ($statementIndent + $this->indent); - }//end if - - if ($tokens[$i]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$i]['code']]) === true - ) { - $prevLine = $tokens[$i]['line']; - continue; - } - - // We changed lines, so this should be a whitespace indent token. - if ($tokens[$i]['code'] !== T_WHITESPACE) { - $foundIndent = 0; - } else { - $foundIndent = $tokens[$i]['length']; - } - - if ($expectedIndent !== $foundIndent) { - $error = 'Multi-line IF statement not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $i, 'Alignment', $data); - if ($fix === true) { - $spaces = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($i, $spaces); - } else { - $phpcsFile->fixer->replaceToken($i, $spaces); - } - } - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, $i, null, true); - if ($next !== $closeBracket && $tokens[$next]['line'] === $tokens[$i]['line']) { - if (isset(Tokens::$booleanOperators[$tokens[$next]['code']]) === false) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), $openBracket, true); - $fixable = true; - if (isset(Tokens::$booleanOperators[$tokens[$prev]['code']]) === false - && $phpcsFile->findNext(T_WHITESPACE, ($prev + 1), $next, true) !== false - ) { - // Condition spread over multi-lines interspersed with comments. - $fixable = false; - } - - $error = 'Each line in a multi-line IF statement must begin with a boolean operator'; - if ($fixable === false) { - $phpcsFile->addError($error, $next, 'StartWithBoolean'); - } else { - $fix = $phpcsFile->addFixableError($error, $next, 'StartWithBoolean'); - if ($fix === true) { - if (isset(Tokens::$booleanOperators[$tokens[$prev]['code']]) === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($prev, ''); - $phpcsFile->fixer->addContentBefore($next, $tokens[$prev]['content'].' '); - $phpcsFile->fixer->endChangeset(); - } else { - for ($x = ($prev + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - } - } - } - }//end if - }//end if - - $prevLine = $tokens[$i]['line']; - }//end if - - if ($tokens[$i]['code'] === T_STRING) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), null, true); - if ($tokens[$next]['code'] === T_OPEN_PARENTHESIS) { - // This is a function call, so skip to the end as they - // have their own indentation rules. - $i = $tokens[$next]['parenthesis_closer']; - $prevLine = $tokens[$i]['line']; - continue; - } - } - }//end for - - // From here on, we are checking the spacing of the opening and closing - // braces. If this IF statement does not use braces, we end here. - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - // The opening brace needs to be one space away from the closing parenthesis. - $openBrace = $tokens[$stackPtr]['scope_opener']; - $next = $phpcsFile->findNext(T_WHITESPACE, ($closeBracket + 1), $openBrace, true); - if ($next !== false) { - // Probably comments in between tokens, so don't check. - return; - } - - if ($tokens[$openBrace]['line'] > $tokens[$closeBracket]['line']) { - $length = -1; - } else if ($openBrace === ($closeBracket + 1)) { - $length = 0; - } else if ($openBrace === ($closeBracket + 2) - && $tokens[($closeBracket + 1)]['code'] === T_WHITESPACE - ) { - $length = $tokens[($closeBracket + 1)]['length']; - } else { - // Confused, so don't check. - $length = 1; - } - - if ($length === 1) { - return; - } - - $data = [$length]; - $code = 'SpaceBeforeOpenBrace'; - - $error = 'There must be a single space between the closing parenthesis and the opening brace of a multi-line IF statement; found '; - if ($length === -1) { - $error .= 'newline'; - $code = 'NewlineBeforeOpenBrace'; - } else { - $error .= '%s spaces'; - } - - $fix = $phpcsFile->addFixableError($error, ($closeBracket + 1), $code, $data); - if ($fix === true) { - if ($length === 0) { - $phpcsFile->fixer->addContent($closeBracket, ' '); - } else { - $phpcsFile->fixer->replaceToken(($closeBracket + 1), ' '); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Files/IncludingFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Files/IncludingFileSniff.php deleted file mode 100644 index 04f208d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Files/IncludingFileSniff.php +++ /dev/null @@ -1,136 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class IncludingFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_INCLUDE_ONCE, - T_REQUIRE_ONCE, - T_REQUIRE, - T_INCLUDE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$nextToken]['code'] === T_OPEN_PARENTHESIS) { - $error = '"%s" is a statement not a function; no parentheses are required'; - $data = [$tokens[$stackPtr]['content']]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'BracketsNotRequired', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($tokens[$nextToken]['parenthesis_closer'], ''); - if ($tokens[($nextToken - 1)]['code'] !== T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($nextToken, ' '); - } else { - $phpcsFile->fixer->replaceToken($nextToken, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - if (count($tokens[$stackPtr]['conditions']) !== 0) { - $inCondition = true; - } else { - $inCondition = false; - } - - // Check to see if this including statement is within the parenthesis - // of a condition. If that's the case then we need to process it as being - // within a condition, as they are checking the return value. - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - foreach ($tokens[$stackPtr]['nested_parenthesis'] as $left => $right) { - if (isset($tokens[$left]['parenthesis_owner']) === true) { - $inCondition = true; - } - } - } - - // Check to see if they are assigning the return value of this - // including call. If they are then they are probably checking it, so - // it's conditional. - $previous = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if (isset(Tokens::$assignmentTokens[$tokens[$previous]['code']]) === true) { - // The have assigned the return value to it, so its conditional. - $inCondition = true; - } - - $tokenCode = $tokens[$stackPtr]['code']; - if ($inCondition === true) { - // We are inside a conditional statement. We need an include_once. - if ($tokenCode === T_REQUIRE_ONCE) { - $error = 'File is being conditionally included; '; - $error .= 'use "include_once" instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'UseIncludeOnce'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'include_once'); - } - } else if ($tokenCode === T_REQUIRE) { - $error = 'File is being conditionally included; '; - $error .= 'use "include" instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'UseInclude'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'include'); - } - } - } else { - // We are unconditionally including, we need a require_once. - if ($tokenCode === T_INCLUDE_ONCE) { - $error = 'File is being unconditionally included; '; - $error .= 'use "require_once" instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'UseRequireOnce'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'require_once'); - } - } else if ($tokenCode === T_INCLUDE) { - $error = 'File is being unconditionally included; '; - $error .= 'use "require" instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'UseRequire'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'require'); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Formatting/MultiLineAssignmentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Formatting/MultiLineAssignmentSniff.php deleted file mode 100644 index 0a7ff7d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Formatting/MultiLineAssignmentSniff.php +++ /dev/null @@ -1,106 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class MultiLineAssignmentSniff implements Sniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_EQUAL]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Equal sign can't be the last thing on the line. - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($next === false) { - // Bad assignment. - return; - } - - if ($tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - $error = 'Multi-line assignments must have the equal sign on the second line'; - $phpcsFile->addError($error, $stackPtr, 'EqualSignLine'); - return; - } - - // Make sure it is the first thing on the line, otherwise we ignore it. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), false, true); - if ($prev === false) { - // Bad assignment. - return; - } - - if ($tokens[$prev]['line'] === $tokens[$stackPtr]['line']) { - return; - } - - // Find the required indent based on the ident of the previous line. - $assignmentIndent = 0; - $prevLine = $tokens[$prev]['line']; - for ($i = ($prev - 1); $i >= 0; $i--) { - if ($tokens[$i]['line'] !== $prevLine) { - $i++; - break; - } - } - - if ($tokens[$i]['code'] === T_WHITESPACE) { - $assignmentIndent = $tokens[$i]['length']; - } - - // Find the actual indent. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1)); - - $expectedIndent = ($assignmentIndent + $this->indent); - $foundIndent = $tokens[$prev]['length']; - if ($foundIndent !== $expectedIndent) { - $error = 'Multi-line assignment not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - $phpcsFile->addError($error, $stackPtr, 'Indent', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php deleted file mode 100644 index 162d5e7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php +++ /dev/null @@ -1,627 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionCallSignatureSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - /** - * If TRUE, multiple arguments can be defined per line in a multi-line call. - * - * @var boolean - */ - public $allowMultipleArguments = true; - - /** - * How many spaces should follow the opening bracket. - * - * @var integer - */ - public $requiredSpacesAfterOpen = 0; - - /** - * How many spaces should precede the closing bracket. - * - * @var integer - */ - public $requiredSpacesBeforeClose = 0; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $tokens = Tokens::$functionNameTokens; - - $tokens[] = T_VARIABLE; - $tokens[] = T_CLOSE_CURLY_BRACKET; - $tokens[] = T_CLOSE_PARENTHESIS; - - return $tokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $this->requiredSpacesAfterOpen = (int) $this->requiredSpacesAfterOpen; - $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose; - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_CLOSE_CURLY_BRACKET - && isset($tokens[$stackPtr]['scope_condition']) === true - ) { - // Not a function call. - return; - } - - // Find the next non-empty token. - $openBracket = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - if ($tokens[$openBracket]['code'] !== T_OPEN_PARENTHESIS) { - // Not a function call. - return; - } - - if (isset($tokens[$openBracket]['parenthesis_closer']) === false) { - // Not a function call. - return; - } - - // Find the previous non-empty token. - $search = Tokens::$emptyTokens; - $search[] = T_BITWISE_AND; - $previous = $phpcsFile->findPrevious($search, ($stackPtr - 1), null, true); - if ($tokens[$previous]['code'] === T_FUNCTION) { - // It's a function definition, not a function call. - return; - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - if (($stackPtr + 1) !== $openBracket) { - // Checking this: $value = my_function[*](...). - $error = 'Space before opening parenthesis of function call prohibited'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeOpenBracket'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($stackPtr + 1); $i < $openBracket; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // Modify the bracket as well to ensure a conflict if the bracket - // has been changed in some way by another sniff. - $phpcsFile->fixer->replaceToken($openBracket, '('); - $phpcsFile->fixer->endChangeset(); - } - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($closeBracket + 1), null, true); - if ($tokens[$next]['code'] === T_SEMICOLON) { - if (isset(Tokens::$emptyTokens[$tokens[($closeBracket + 1)]['code']]) === true) { - $error = 'Space after closing parenthesis of function call prohibited'; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'SpaceAfterCloseBracket'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($closeBracket + 1); $i < $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // Modify the bracket as well to ensure a conflict if the bracket - // has been changed in some way by another sniff. - $phpcsFile->fixer->replaceToken($closeBracket, ')'); - $phpcsFile->fixer->endChangeset(); - } - } - } - - // Check if this is a single line or multi-line function call. - if ($this->isMultiLineCall($phpcsFile, $stackPtr, $openBracket, $tokens) === true) { - $this->processMultiLineCall($phpcsFile, $stackPtr, $openBracket, $tokens); - } else { - $this->processSingleLineCall($phpcsFile, $stackPtr, $openBracket, $tokens); - } - - }//end process() - - - /** - * Determine if this is a multi-line function call. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return bool - */ - public function isMultiLineCall(File $phpcsFile, $stackPtr, $openBracket, $tokens) - { - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - if ($tokens[$openBracket]['line'] !== $tokens[$closeBracket]['line']) { - return true; - } - - return false; - - }//end isMultiLineCall() - - - /** - * Processes single-line calls. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processSingleLineCall(File $phpcsFile, $stackPtr, $openBracket, $tokens) - { - $closer = $tokens[$openBracket]['parenthesis_closer']; - if ($openBracket === ($closer - 1)) { - return; - } - - // If the function call has no arguments or comments, enforce 0 spaces. - $next = $phpcsFile->findNext(T_WHITESPACE, ($openBracket + 1), $closer, true); - if ($next === false) { - $requiredSpacesAfterOpen = 0; - $requiredSpacesBeforeClose = 0; - } else { - $requiredSpacesAfterOpen = $this->requiredSpacesAfterOpen; - $requiredSpacesBeforeClose = $this->requiredSpacesBeforeClose; - } - - if ($requiredSpacesAfterOpen === 0 && $tokens[($openBracket + 1)]['code'] === T_WHITESPACE) { - // Checking this: $value = my_function([*]...). - $error = 'Space after opening parenthesis of function call prohibited'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterOpenBracket'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($openBracket + 1), ''); - } - } else if ($requiredSpacesAfterOpen > 0) { - $spaceAfterOpen = 0; - if ($tokens[($openBracket + 1)]['code'] === T_WHITESPACE) { - $spaceAfterOpen = $tokens[($openBracket + 1)]['length']; - } - - if ($spaceAfterOpen !== $requiredSpacesAfterOpen) { - $error = 'Expected %s spaces after opening parenthesis; %s found'; - $data = [ - $requiredSpacesAfterOpen, - $spaceAfterOpen, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterOpenBracket', $data); - if ($fix === true) { - $padding = str_repeat(' ', $requiredSpacesAfterOpen); - if ($spaceAfterOpen === 0) { - $phpcsFile->fixer->addContent($openBracket, $padding); - } else { - $phpcsFile->fixer->replaceToken(($openBracket + 1), $padding); - } - } - } - }//end if - - // Checking this: $value = my_function(...[*]). - $spaceBeforeClose = 0; - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($closer - 1), $openBracket, true); - if ($tokens[$prev]['code'] === T_END_HEREDOC || $tokens[$prev]['code'] === T_END_NOWDOC) { - // Need a newline after these tokens, so ignore this rule. - return; - } - - if ($tokens[$prev]['line'] !== $tokens[$closer]['line']) { - $spaceBeforeClose = 'newline'; - } else if ($tokens[($closer - 1)]['code'] === T_WHITESPACE) { - $spaceBeforeClose = $tokens[($closer - 1)]['length']; - } - - if ($spaceBeforeClose !== $requiredSpacesBeforeClose) { - $error = 'Expected %s spaces before closing parenthesis; %s found'; - $data = [ - $requiredSpacesBeforeClose, - $spaceBeforeClose, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeCloseBracket', $data); - if ($fix === true) { - $padding = str_repeat(' ', $requiredSpacesBeforeClose); - - if ($spaceBeforeClose === 0) { - $phpcsFile->fixer->addContentBefore($closer, $padding); - } else if ($spaceBeforeClose === 'newline') { - $phpcsFile->fixer->beginChangeset(); - - $closingContent = ')'; - - $next = $phpcsFile->findNext(T_WHITESPACE, ($closer + 1), null, true); - if ($tokens[$next]['code'] === T_SEMICOLON) { - $closingContent .= ';'; - for ($i = ($closer + 1); $i <= $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - - // We want to jump over any whitespace or inline comment and - // move the closing parenthesis after any other token. - $prev = ($closer - 1); - while (isset(Tokens::$emptyTokens[$tokens[$prev]['code']]) === true) { - if (($tokens[$prev]['code'] === T_COMMENT) - && (strpos($tokens[$prev]['content'], '*/') !== false) - ) { - break; - } - - $prev--; - } - - $phpcsFile->fixer->addContent($prev, $padding.$closingContent); - - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($closer - 1), null, true); - for ($i = ($prevNonWhitespace + 1); $i <= $closer; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($closer - 1), $padding); - }//end if - }//end if - }//end if - - }//end processSingleLineCall() - - - /** - * Processes multi-line calls. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processMultiLineCall(File $phpcsFile, $stackPtr, $openBracket, $tokens) - { - // We need to work out how far indented the function - // call itself is, so we can work out how far to - // indent the arguments. - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - if ($tokens[$first]['code'] === T_CONSTANT_ENCAPSED_STRING - && $tokens[($first - 1)]['code'] === T_CONSTANT_ENCAPSED_STRING - ) { - // We are in a multi-line string, so find the start and use - // the indent from there. - $prev = $phpcsFile->findPrevious(T_CONSTANT_ENCAPSED_STRING, ($first - 2), null, true); - $first = $phpcsFile->findFirstOnLine(Tokens::$emptyTokens, $prev, true); - if ($first === false) { - $first = ($prev + 1); - } - } - - $foundFunctionIndent = 0; - if ($first !== false) { - if ($tokens[$first]['code'] === T_INLINE_HTML - || ($tokens[$first]['code'] === T_CONSTANT_ENCAPSED_STRING - && $tokens[($first - 1)]['code'] === T_CONSTANT_ENCAPSED_STRING) - ) { - $trimmed = ltrim($tokens[$first]['content']); - if ($trimmed === '') { - $foundFunctionIndent = strlen($tokens[$first]['content']); - } else { - $foundFunctionIndent = (strlen($tokens[$first]['content']) - strlen($trimmed)); - } - } else { - $foundFunctionIndent = ($tokens[$first]['column'] - 1); - } - } - - // Make sure the function indent is divisible by the indent size. - // We round down here because this accounts for times when the - // surrounding code is indented a little too far in, and not correctly - // at a tab stop. Without this, the function will be indented a further - // $indent spaces to the right. - $functionIndent = (int) (floor($foundFunctionIndent / $this->indent) * $this->indent); - $adjustment = 0; - - if ($foundFunctionIndent !== $functionIndent) { - $error = 'Opening statement of multi-line function call not indented correctly; expected %s spaces but found %s'; - $data = [ - $functionIndent, - $foundFunctionIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $first, 'OpeningIndent', $data); - if ($fix === true) { - $adjustment = ($functionIndent - $foundFunctionIndent); - $padding = str_repeat(' ', $functionIndent); - if ($foundFunctionIndent === 0) { - $phpcsFile->fixer->addContentBefore($first, $padding); - } else { - $phpcsFile->fixer->replaceToken(($first - 1), $padding); - } - } - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($openBracket + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$openBracket]['line']) { - $error = 'Opening parenthesis of a multi-line function call must be the last content on the line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentAfterOpenBracket'); - if ($fix === true) { - $phpcsFile->fixer->addContent( - $openBracket, - $phpcsFile->eolChar.str_repeat(' ', ($foundFunctionIndent + $this->indent)) - ); - } - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBracket - 1), null, true); - if ($tokens[$prev]['line'] === $tokens[$closeBracket]['line']) { - $error = 'Closing parenthesis of a multi-line function call must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'CloseBracketLine'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore( - $closeBracket, - $phpcsFile->eolChar.str_repeat(' ', ($foundFunctionIndent + $this->indent)) - ); - } - } - - // Each line between the parenthesis should be indented n spaces. - $lastLine = ($tokens[$openBracket]['line'] - 1); - $argStart = null; - $argEnd = null; - - // Start processing at the first argument. - $i = $phpcsFile->findNext(T_WHITESPACE, ($openBracket + 1), null, true); - - if ($tokens[$i]['line'] > ($tokens[$openBracket]['line'] + 1)) { - $error = 'The first argument in a multi-line function call must be on the line after the opening parenthesis'; - $fix = $phpcsFile->addFixableError($error, $i, 'FirstArgumentPosition'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($openBracket + 1); $x < $i; $x++) { - if ($tokens[$x]['line'] === $tokens[$openBracket]['line']) { - continue; - } - - if ($tokens[$x]['line'] === $tokens[$i]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - $i = $phpcsFile->findNext(Tokens::$emptyTokens, ($openBracket + 1), null, true); - - if ($tokens[($i - 1)]['code'] === T_WHITESPACE - && $tokens[($i - 1)]['line'] === $tokens[$i]['line'] - ) { - // Make sure we check the indent. - $i--; - } - - for ($i; $i < $closeBracket; $i++) { - if ($i > $argStart && $i < $argEnd) { - $inArg = true; - } else { - $inArg = false; - } - - if ($tokens[$i]['line'] !== $lastLine) { - $lastLine = $tokens[$i]['line']; - - // Ignore heredoc indentation. - if (isset(Tokens::$heredocTokens[$tokens[$i]['code']]) === true) { - continue; - } - - // Ignore multi-line string indentation. - if (isset(Tokens::$stringTokens[$tokens[$i]['code']]) === true - && $tokens[$i]['code'] === $tokens[($i - 1)]['code'] - ) { - continue; - } - - // Ignore inline HTML. - if ($tokens[$i]['code'] === T_INLINE_HTML) { - continue; - } - - if ($tokens[$i]['line'] !== $tokens[$openBracket]['line']) { - // We changed lines, so this should be a whitespace indent token, but first make - // sure it isn't a blank line because we don't need to check indent unless there - // is actually some code to indent. - if ($tokens[$i]['code'] === T_WHITESPACE) { - $nextCode = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), ($closeBracket + 1), true); - if ($tokens[$nextCode]['line'] !== $lastLine) { - if ($inArg === false) { - $error = 'Empty lines are not allowed in multi-line function calls'; - $fix = $phpcsFile->addFixableError($error, $i, 'EmptyLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - - continue; - } - } else { - $nextCode = $i; - } - - if ($tokens[$nextCode]['line'] === $tokens[$closeBracket]['line']) { - // Closing brace needs to be indented to the same level - // as the function call. - $inArg = false; - $expectedIndent = ($foundFunctionIndent + $adjustment); - } else { - $expectedIndent = ($foundFunctionIndent + $this->indent + $adjustment); - } - - if ($tokens[$i]['code'] !== T_WHITESPACE - && $tokens[$i]['code'] !== T_DOC_COMMENT_WHITESPACE - ) { - // Just check if it is a multi-line block comment. If so, we can - // calculate the indent from the whitespace before the content. - if ($tokens[$i]['code'] === T_COMMENT - && $tokens[($i - 1)]['code'] === T_COMMENT - ) { - $trimmedLength = strlen(ltrim($tokens[$i]['content'])); - if ($trimmedLength === 0) { - // This is a blank comment line, so indenting it is - // pointless. - continue; - } - - $foundIndent = (strlen($tokens[$i]['content']) - $trimmedLength); - } else { - $foundIndent = 0; - } - } else { - $foundIndent = $tokens[$i]['length']; - } - - if ($foundIndent < $expectedIndent - || ($inArg === false - && $expectedIndent !== $foundIndent) - ) { - $error = 'Multi-line function call not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $i, 'Indent', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $padding = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($i, $padding); - if (isset($tokens[$i]['scope_opener']) === true) { - $phpcsFile->fixer->changeCodeBlockIndent($i, $tokens[$i]['scope_closer'], $expectedIndent); - } - } else { - if ($tokens[$i]['code'] === T_COMMENT) { - $comment = $padding.ltrim($tokens[$i]['content']); - $phpcsFile->fixer->replaceToken($i, $comment); - } else { - $phpcsFile->fixer->replaceToken($i, $padding); - } - - if (isset($tokens[($i + 1)]['scope_opener']) === true) { - $phpcsFile->fixer->changeCodeBlockIndent(($i + 1), $tokens[($i + 1)]['scope_closer'], ($expectedIndent - $foundIndent)); - } - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - } else { - $nextCode = $i; - }//end if - - if ($inArg === false) { - $argStart = $nextCode; - $argEnd = $phpcsFile->findEndOfStatement($nextCode); - } - }//end if - - // If we are within an argument we should be ignoring commas - // as these are not signalling the end of an argument. - if ($inArg === false && $tokens[$i]['code'] === T_COMMA) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), $closeBracket, true); - if ($next === false) { - continue; - } - - if ($this->allowMultipleArguments === false) { - // Comma has to be the last token on the line. - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - $error = 'Only one argument is allowed per line in a multi-line function call'; - $fix = $phpcsFile->addFixableError($error, $next, 'MultipleArguments'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($next - 1); $x > $i; $x--) { - if ($tokens[$x]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContentBefore( - $next, - $phpcsFile->eolChar.str_repeat(' ', ($foundFunctionIndent + $this->indent)) - ); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - $argStart = $next; - $argEnd = $phpcsFile->findEndOfStatement($next); - }//end if - }//end for - - }//end processMultiLineCall() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php deleted file mode 100644 index 9843629..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php +++ /dev/null @@ -1,511 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Standards\Generic\Sniffs\Functions\OpeningFunctionBraceBsdAllmanSniff; -use PHP_CodeSniffer\Standards\Generic\Sniffs\Functions\OpeningFunctionBraceKernighanRitchieSniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionDeclarationSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - || $tokens[$stackPtr]['parenthesis_opener'] === null - || $tokens[$stackPtr]['parenthesis_closer'] === null - ) { - return; - } - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - - if (strtolower($tokens[$stackPtr]['content']) === 'function') { - // Must be one space after the FUNCTION keyword. - if ($tokens[($stackPtr + 1)]['content'] === $phpcsFile->eolChar) { - $spaces = 'newline'; - } else if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $spaces = $tokens[($stackPtr + 1)]['length']; - } else { - $spaces = 0; - } - - if ($spaces !== 1) { - $error = 'Expected 1 space after FUNCTION keyword; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterFunction', $data); - if ($fix === true) { - if ($spaces === 0) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } else { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } - }//end if - - // Must be no space before the opening parenthesis. For closures, this is - // enforced by the previous check because there is no content between the keywords - // and the opening parenthesis. - // Unfinished closures are tokenized as T_FUNCTION however, and can be excluded - // by checking for the scope_opener. - if ($tokens[$stackPtr]['code'] === T_FUNCTION - && (isset($tokens[$stackPtr]['scope_opener']) === true || $phpcsFile->getMethodProperties($stackPtr)['has_body'] === false) - ) { - if ($tokens[($openBracket - 1)]['content'] === $phpcsFile->eolChar) { - $spaces = 'newline'; - } else if ($tokens[($openBracket - 1)]['code'] === T_WHITESPACE) { - $spaces = $tokens[($openBracket - 1)]['length']; - } else { - $spaces = 0; - } - - if ($spaces !== 0) { - $error = 'Expected 0 spaces before opening parenthesis; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $openBracket, 'SpaceBeforeOpenParen', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($openBracket - 1), ''); - } - } - - // Must be no space before semicolon in abstract/interface methods. - if ($phpcsFile->getMethodProperties($stackPtr)['has_body'] === false) { - $end = $phpcsFile->findNext(T_SEMICOLON, $closeBracket); - if ($tokens[($end - 1)]['content'] === $phpcsFile->eolChar) { - $spaces = 'newline'; - } else if ($tokens[($end - 1)]['code'] === T_WHITESPACE) { - $spaces = $tokens[($end - 1)]['length']; - } else { - $spaces = 0; - } - - if ($spaces !== 0) { - $error = 'Expected 0 spaces before semicolon; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $end, 'SpaceBeforeSemicolon', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($end - 1), ''); - } - } - } - }//end if - - // Must be one space before and after USE keyword for closures. - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - if ($tokens[($use + 1)]['code'] !== T_WHITESPACE) { - $length = 0; - } else if ($tokens[($use + 1)]['content'] === "\t") { - $length = '\t'; - } else { - $length = $tokens[($use + 1)]['length']; - } - - if ($length !== 1) { - $error = 'Expected 1 space after USE keyword; found %s'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $use, 'SpaceAfterUse', $data); - if ($fix === true) { - if ($length === 0) { - $phpcsFile->fixer->addContent($use, ' '); - } else { - $phpcsFile->fixer->replaceToken(($use + 1), ' '); - } - } - } - - if ($tokens[($use - 1)]['code'] !== T_WHITESPACE) { - $length = 0; - } else if ($tokens[($use - 1)]['content'] === "\t") { - $length = '\t'; - } else { - $length = $tokens[($use - 1)]['length']; - } - - if ($length !== 1) { - $error = 'Expected 1 space before USE keyword; found %s'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $use, 'SpaceBeforeUse', $data); - if ($fix === true) { - if ($length === 0) { - $phpcsFile->fixer->addContentBefore($use, ' '); - } else { - $phpcsFile->fixer->replaceToken(($use - 1), ' '); - } - } - } - }//end if - }//end if - - if ($this->isMultiLineDeclaration($phpcsFile, $stackPtr, $openBracket, $tokens) === true) { - $this->processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens); - } else { - $this->processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens); - } - - }//end process() - - - /** - * Determine if this is a multi-line function declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return bool - */ - public function isMultiLineDeclaration($phpcsFile, $stackPtr, $openBracket, $tokens) - { - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - if ($tokens[$openBracket]['line'] !== $tokens[$closeBracket]['line']) { - return true; - } - - // Closures may use the USE keyword and so be multi-line in this way. - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - // If the opening and closing parenthesis of the use statement - // are also on the same line, this is a single line declaration. - $open = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - $close = $tokens[$open]['parenthesis_closer']; - if ($tokens[$open]['line'] !== $tokens[$close]['line']) { - return true; - } - } - } - - return false; - - }//end isMultiLineDeclaration() - - - /** - * Processes single-line declarations. - * - * Just uses the Generic BSD-Allman brace sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens) - { - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $sniff = new OpeningFunctionBraceKernighanRitchieSniff(); - } else { - $sniff = new OpeningFunctionBraceBsdAllmanSniff(); - } - - $sniff->checkClosures = true; - $sniff->process($phpcsFile, $stackPtr); - - }//end processSingleLineDeclaration() - - - /** - * Processes multi-line declarations. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens) - { - $this->processArgumentList($phpcsFile, $stackPtr, $this->indent); - - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - $open = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - $closeBracket = $tokens[$open]['parenthesis_closer']; - } - } - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - // The opening brace needs to be one space away from the closing parenthesis. - $opener = $tokens[$stackPtr]['scope_opener']; - if ($tokens[$opener]['line'] !== $tokens[$closeBracket]['line']) { - $error = 'The closing parenthesis and the opening brace of a multi-line function declaration must be on the same line'; - $fix = $phpcsFile->addFixableError($error, $opener, 'NewlineBeforeOpenBrace'); - if ($fix === true) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($opener - 1), $closeBracket, true); - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($prev, ' {'); - - // If the opener is on a line by itself, removing it will create - // an empty line, so just remove the entire line instead. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($opener - 1), $closeBracket, true); - $next = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), null, true); - - if ($tokens[$prev]['line'] < $tokens[$opener]['line'] - && $tokens[$next]['line'] > $tokens[$opener]['line'] - ) { - // Clear the whole line. - for ($i = ($prev + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$opener]['line']) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - } else { - // Just remove the opener. - $phpcsFile->fixer->replaceToken($opener, ''); - if ($tokens[$next]['line'] === $tokens[$opener]['line']) { - $phpcsFile->fixer->replaceToken(($opener + 1), ''); - } - } - - $phpcsFile->fixer->endChangeset(); - }//end if - } else { - $prev = $tokens[($opener - 1)]; - if ($prev['code'] !== T_WHITESPACE) { - $length = 0; - } else { - $length = strlen($prev['content']); - } - - if ($length !== 1) { - $error = 'There must be a single space between the closing parenthesis and the opening brace of a multi-line function declaration; found %s spaces'; - $fix = $phpcsFile->addFixableError($error, ($opener - 1), 'SpaceBeforeOpenBrace', [$length]); - if ($fix === true) { - if ($length === 0) { - $phpcsFile->fixer->addContentBefore($opener, ' '); - } else { - $phpcsFile->fixer->replaceToken(($opener - 1), ' '); - } - } - - return; - }//end if - }//end if - - }//end processMultiLineDeclaration() - - - /** - * Processes multi-line argument list declarations. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $indent The number of spaces code should be indented. - * @param string $type The type of the token the brackets - * belong to. - * - * @return void - */ - public function processArgumentList($phpcsFile, $stackPtr, $indent, $type='function') - { - $tokens = $phpcsFile->getTokens(); - - // We need to work out how far indented the function - // declaration itself is, so we can work out how far to - // indent parameters. - $functionIndent = 0; - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - if ($tokens[$i]['line'] !== $tokens[$stackPtr]['line']) { - break; - } - } - - // Move $i back to the line the function is or to 0. - $i++; - - if ($tokens[$i]['code'] === T_WHITESPACE) { - $functionIndent = $tokens[$i]['length']; - } - - // The closing parenthesis must be on a new line, even - // when checking abstract function definitions. - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - $prev = $phpcsFile->findPrevious( - T_WHITESPACE, - ($closeBracket - 1), - null, - true - ); - - if ($tokens[$closeBracket]['line'] !== $tokens[$tokens[$closeBracket]['parenthesis_opener']]['line'] - && $tokens[$prev]['line'] === $tokens[$closeBracket]['line'] - ) { - $error = 'The closing parenthesis of a multi-line '.$type.' declaration must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'CloseBracketLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($closeBracket); - } - } - - // If this is a closure and is using a USE statement, the closing - // parenthesis we need to look at from now on is the closing parenthesis - // of the USE statement. - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - $open = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - $closeBracket = $tokens[$open]['parenthesis_closer']; - - $prev = $phpcsFile->findPrevious( - T_WHITESPACE, - ($closeBracket - 1), - null, - true - ); - - if ($tokens[$closeBracket]['line'] !== $tokens[$tokens[$closeBracket]['parenthesis_opener']]['line'] - && $tokens[$prev]['line'] === $tokens[$closeBracket]['line'] - ) { - $error = 'The closing parenthesis of a multi-line use declaration must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'UseCloseBracketLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($closeBracket); - } - } - }//end if - }//end if - - // Each line between the parenthesis should be indented 4 spaces. - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $lastLine = $tokens[$openBracket]['line']; - for ($i = ($openBracket + 1); $i < $closeBracket; $i++) { - if ($tokens[$i]['line'] !== $lastLine) { - if ($i === $tokens[$stackPtr]['parenthesis_closer'] - || ($tokens[$i]['code'] === T_WHITESPACE - && (($i + 1) === $closeBracket - || ($i + 1) === $tokens[$stackPtr]['parenthesis_closer'])) - ) { - // Closing braces need to be indented to the same level - // as the function. - $expectedIndent = $functionIndent; - } else { - $expectedIndent = ($functionIndent + $indent); - } - - // We changed lines, so this should be a whitespace indent token. - if ($tokens[$i]['code'] !== T_WHITESPACE) { - $foundIndent = 0; - } else if ($tokens[$i]['line'] !== $tokens[($i + 1)]['line']) { - // This is an empty line, so don't check the indent. - $foundIndent = $expectedIndent; - - $error = 'Blank lines are not allowed in a multi-line '.$type.' declaration'; - $fix = $phpcsFile->addFixableError($error, $i, 'EmptyLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } else { - $foundIndent = $tokens[$i]['length']; - } - - if ($expectedIndent !== $foundIndent) { - $error = 'Multi-line '.$type.' declaration not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $i, 'Indent', $data); - if ($fix === true) { - $spaces = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($i, $spaces); - } else { - $phpcsFile->fixer->replaceToken($i, $spaces); - } - } - } - - $lastLine = $tokens[$i]['line']; - }//end if - - if ($tokens[$i]['code'] === T_ARRAY || $tokens[$i]['code'] === T_OPEN_SHORT_ARRAY) { - // Skip arrays as they have their own indentation rules. - if ($tokens[$i]['code'] === T_OPEN_SHORT_ARRAY) { - $i = $tokens[$i]['bracket_closer']; - } else { - $i = $tokens[$i]['parenthesis_closer']; - } - - $lastLine = $tokens[$i]['line']; - continue; - } - }//end for - - }//end processArgumentList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/ValidDefaultValueSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/ValidDefaultValueSniff.php deleted file mode 100644 index f134707..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/ValidDefaultValueSniff.php +++ /dev/null @@ -1,78 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ValidDefaultValueSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return int[] - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - T_FN, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Flag for when we have found a default in our arg list. - // If there is a value without a default after this, it is an error. - $defaultFound = false; - - $params = $phpcsFile->getMethodParameters($stackPtr); - foreach ($params as $param) { - if ($param['variable_length'] === true) { - continue; - } - - if (array_key_exists('default', $param) === true) { - $defaultFound = true; - // Check if the arg is type hinted and using NULL for the default. - // This does not make the argument optional - it just allows NULL - // to be passed in. - if ($param['type_hint'] !== '' && strtolower($param['default']) === 'null') { - $defaultFound = false; - } - - continue; - } - - if ($defaultFound === true) { - $error = 'Arguments with default values must be at the end of the argument list'; - $phpcsFile->addError($error, $param['token'], 'NotAtEnd'); - return; - } - }//end foreach - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidClassNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidClassNameSniff.php deleted file mode 100644 index 34ca283..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidClassNameSniff.php +++ /dev/null @@ -1,97 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ValidClassNameSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being processed. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $className = $phpcsFile->findNext(T_STRING, $stackPtr); - $name = trim($tokens[$className]['content']); - $errorData = [ucfirst($tokens[$stackPtr]['content'])]; - - // Make sure the first letter is a capital. - if (preg_match('|^[A-Z]|', $name) === 0) { - $error = '%s name must begin with a capital letter'; - $phpcsFile->addError($error, $stackPtr, 'StartWithCapital', $errorData); - } - - // Check that each new word starts with a capital as well, but don't - // check the first word, as it is checked above. - $validName = true; - $nameBits = explode('_', $name); - $firstBit = array_shift($nameBits); - foreach ($nameBits as $bit) { - if ($bit === '' || $bit[0] !== strtoupper($bit[0])) { - $validName = false; - break; - } - } - - if ($validName === false) { - // Strip underscores because they cause the suggested name - // to be incorrect. - $nameBits = explode('_', trim($name, '_')); - $firstBit = array_shift($nameBits); - if ($firstBit === '') { - $error = '%s name is not valid'; - $phpcsFile->addError($error, $stackPtr, 'Invalid', $errorData); - } else { - $newName = strtoupper($firstBit[0]).substr($firstBit, 1).'_'; - foreach ($nameBits as $bit) { - if ($bit !== '') { - $newName .= strtoupper($bit[0]).substr($bit, 1).'_'; - } - } - - $newName = rtrim($newName, '_'); - $error = '%s name is not valid; consider %s instead'; - $data = $errorData; - $data[] = $newName; - $phpcsFile->addError($error, $stackPtr, 'Invalid', $data); - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidFunctionNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidFunctionNameSniff.php deleted file mode 100644 index 49486a5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidFunctionNameSniff.php +++ /dev/null @@ -1,282 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class ValidFunctionNameSniff extends AbstractScopeSniff -{ - - /** - * A list of all PHP magic methods. - * - * @var array - */ - protected $magicMethods = [ - 'construct' => true, - 'destruct' => true, - 'call' => true, - 'callstatic' => true, - 'get' => true, - 'set' => true, - 'isset' => true, - 'unset' => true, - 'sleep' => true, - 'wakeup' => true, - 'tostring' => true, - 'set_state' => true, - 'clone' => true, - 'invoke' => true, - 'debuginfo' => true, - ]; - - /** - * A list of all PHP magic functions. - * - * @var array - */ - protected $magicFunctions = ['autoload' => true]; - - - /** - * Constructs a PEAR_Sniffs_NamingConventions_ValidFunctionNameSniff. - */ - public function __construct() - { - parent::__construct(Tokens::$ooScopeTokens, [T_FUNCTION], true); - - }//end __construct() - - - /** - * Processes the tokens within the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * @param int $currScope The position of the current scope. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Ignore closures. - return; - } - - $className = $phpcsFile->getDeclarationName($currScope); - if (isset($className) === false) { - $className = '[Anonymous Class]'; - } - - $errorData = [$className.'::'.$methodName]; - - $methodNameLc = strtolower($methodName); - $classNameLc = strtolower($className); - - // Is this a magic method. i.e., is prefixed with "__" ? - if (preg_match('|^__[^_]|', $methodName) !== 0) { - $magicPart = substr($methodNameLc, 2); - if (isset($this->magicMethods[$magicPart]) === true) { - return; - } - - $error = 'Method name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $phpcsFile->addError($error, $stackPtr, 'MethodDoubleUnderscore', $errorData); - } - - // PHP4 constructors are allowed to break our rules. - if ($methodNameLc === $classNameLc) { - return; - } - - // PHP4 destructors are allowed to break our rules. - if ($methodNameLc === '_'.$classNameLc) { - return; - } - - $methodProps = $phpcsFile->getMethodProperties($stackPtr); - $scope = $methodProps['scope']; - $scopeSpecified = $methodProps['scope_specified']; - - if ($methodProps['scope'] === 'private') { - $isPublic = false; - } else { - $isPublic = true; - } - - // If it's a private method, it must have an underscore on the front. - if ($isPublic === false) { - if ($methodName[0] !== '_') { - $error = 'Private method name "%s" must be prefixed with an underscore'; - $phpcsFile->addError($error, $stackPtr, 'PrivateNoUnderscore', $errorData); - $phpcsFile->recordMetric($stackPtr, 'Private method prefixed with underscore', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Private method prefixed with underscore', 'yes'); - } - } - - // If it's not a private method, it must not have an underscore on the front. - if ($isPublic === true && $scopeSpecified === true && $methodName[0] === '_') { - $error = '%s method name "%s" must not be prefixed with an underscore'; - $data = [ - ucfirst($scope), - $errorData[0], - ]; - $phpcsFile->addError($error, $stackPtr, 'PublicUnderscore', $data); - } - - $testMethodName = ltrim($methodName, '_'); - - if (Common::isCamelCaps($testMethodName, false, true, false) === false) { - if ($scopeSpecified === true) { - $error = '%s method name "%s" is not in camel caps format'; - $data = [ - ucfirst($scope), - $errorData[0], - ]; - $phpcsFile->addError($error, $stackPtr, 'ScopeNotCamelCaps', $data); - } else { - $error = 'Method name "%s" is not in camel caps format'; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $errorData); - } - } - - }//end processTokenWithinScope() - - - /** - * Processes the tokens outside the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if ($functionName === null) { - // Ignore closures. - return; - } - - if (ltrim($functionName, '_') === '') { - // Ignore special functions. - return; - } - - $errorData = [$functionName]; - - // Is this a magic function. i.e., it is prefixed with "__". - if (preg_match('|^__[^_]|', $functionName) !== 0) { - $magicPart = strtolower(substr($functionName, 2)); - if (isset($this->magicFunctions[$magicPart]) === true) { - return; - } - - $error = 'Function name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $phpcsFile->addError($error, $stackPtr, 'FunctionDoubleUnderscore', $errorData); - } - - // Function names can be in two parts; the package name and - // the function name. - $packagePart = ''; - $underscorePos = strrpos($functionName, '_'); - if ($underscorePos === false) { - $camelCapsPart = $functionName; - } else { - $packagePart = substr($functionName, 0, $underscorePos); - $camelCapsPart = substr($functionName, ($underscorePos + 1)); - - // We don't care about _'s on the front. - $packagePart = ltrim($packagePart, '_'); - } - - // If it has a package part, make sure the first letter is a capital. - if ($packagePart !== '') { - if ($functionName[0] === '_') { - $error = 'Function name "%s" is invalid; only private methods should be prefixed with an underscore'; - $phpcsFile->addError($error, $stackPtr, 'FunctionUnderscore', $errorData); - } - - if ($functionName[0] !== strtoupper($functionName[0])) { - $error = 'Function name "%s" is prefixed with a package name but does not begin with a capital letter'; - $phpcsFile->addError($error, $stackPtr, 'FunctionNoCapital', $errorData); - } - } - - // If it doesn't have a camel caps part, it's not valid. - if (trim($camelCapsPart) === '') { - $error = 'Function name "%s" is not valid; name appears incomplete'; - $phpcsFile->addError($error, $stackPtr, 'FunctionInvalid', $errorData); - return; - } - - $validName = true; - $newPackagePart = $packagePart; - $newCamelCapsPart = $camelCapsPart; - - // Every function must have a camel caps part, so check that first. - if (Common::isCamelCaps($camelCapsPart, false, true, false) === false) { - $validName = false; - $newCamelCapsPart = strtolower($camelCapsPart[0]).substr($camelCapsPart, 1); - } - - if ($packagePart !== '') { - // Check that each new word starts with a capital. - $nameBits = explode('_', $packagePart); - $nameBits = array_filter($nameBits); - foreach ($nameBits as $bit) { - if ($bit[0] !== strtoupper($bit[0])) { - $newPackagePart = ''; - foreach ($nameBits as $bit) { - $newPackagePart .= strtoupper($bit[0]).substr($bit, 1).'_'; - } - - $validName = false; - break; - } - } - } - - if ($validName === false) { - if ($newPackagePart === '') { - $newName = $newCamelCapsPart; - } else { - $newName = rtrim($newPackagePart, '_').'_'.$newCamelCapsPart; - } - - $error = 'Function name "%s" is invalid; consider "%s" instead'; - $data = $errorData; - $data[] = $newName; - $phpcsFile->addError($error, $stackPtr, 'FunctionNameInvalid', $data); - } - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidVariableNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidVariableNameSniff.php deleted file mode 100644 index 89af5df..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidVariableNameSniff.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; - -class ValidVariableNameSniff extends AbstractVariableSniff -{ - - - /** - * Processes class member variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $memberProps = $phpcsFile->getMemberProperties($stackPtr); - if (empty($memberProps) === true) { - return; - } - - $memberName = ltrim($tokens[$stackPtr]['content'], '$'); - $scope = $memberProps['scope']; - $scopeSpecified = $memberProps['scope_specified']; - - if ($memberProps['scope'] === 'private') { - $isPublic = false; - } else { - $isPublic = true; - } - - // If it's a private member, it must have an underscore on the front. - if ($isPublic === false && $memberName[0] !== '_') { - $error = 'Private member variable "%s" must be prefixed with an underscore'; - $data = [$memberName]; - $phpcsFile->addError($error, $stackPtr, 'PrivateNoUnderscore', $data); - return; - } - - // If it's not a private member, it must not have an underscore on the front. - if ($isPublic === true && $scopeSpecified === true && $memberName[0] === '_') { - $error = '%s member variable "%s" must not be prefixed with an underscore'; - $data = [ - ucfirst($scope), - $memberName, - ]; - $phpcsFile->addError($error, $stackPtr, 'PublicUnderscore', $data); - return; - } - - }//end processMemberVar() - - - /** - * Processes normal variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariable() - - - /** - * Processes variables in double quoted strings. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php deleted file mode 100644 index 1929b3b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php +++ /dev/null @@ -1,194 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ObjectOperatorIndentSniff implements Sniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - /** - * Indicates whether multilevel indenting is allowed. - * - * @var boolean - */ - public $multilevel = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return int[] - */ - public function register() - { - return [T_OBJECT_OPERATOR]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile All the tokens found in the document. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Make sure this is the first object operator in a chain of them. - $start = $phpcsFile->findStartOfStatement($stackPtr); - $prev = $phpcsFile->findPrevious(T_OBJECT_OPERATOR, ($stackPtr - 1), $start); - if ($prev !== false) { - return; - } - - // Make sure this is a chained call. - $end = $phpcsFile->findEndOfStatement($stackPtr); - $next = $phpcsFile->findNext(T_OBJECT_OPERATOR, ($stackPtr + 1), $end); - if ($next === false) { - // Not a chained call. - return; - } - - // Determine correct indent. - for ($i = ($start - 1); $i >= 0; $i--) { - if ($tokens[$i]['line'] !== $tokens[$start]['line']) { - $i++; - break; - } - } - - $baseIndent = 0; - if ($i >= 0 && $tokens[$i]['code'] === T_WHITESPACE) { - $baseIndent = $tokens[$i]['length']; - } - - $baseIndent += $this->indent; - - // Determine the scope of the original object operator. - $origBrackets = null; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $origBrackets = $tokens[$stackPtr]['nested_parenthesis']; - } - - $origConditions = null; - if (isset($tokens[$stackPtr]['conditions']) === true) { - $origConditions = $tokens[$stackPtr]['conditions']; - } - - // Check indentation of each object operator in the chain. - // If the first object operator is on a different line than - // the variable, make sure we check its indentation too. - if ($tokens[$stackPtr]['line'] > $tokens[$start]['line']) { - $next = $stackPtr; - } - - $previousIndent = $baseIndent; - - while ($next !== false) { - // Make sure it is in the same scope, otherwise don't check indent. - $brackets = null; - if (isset($tokens[$next]['nested_parenthesis']) === true) { - $brackets = $tokens[$next]['nested_parenthesis']; - } - - $conditions = null; - if (isset($tokens[$next]['conditions']) === true) { - $conditions = $tokens[$next]['conditions']; - } - - if ($origBrackets === $brackets && $origConditions === $conditions) { - // Make sure it starts a line, otherwise don't check indent. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($next - 1), $stackPtr, true); - $indent = $tokens[($next - 1)]; - if ($tokens[$prev]['line'] !== $tokens[$next]['line'] - && $indent['code'] === T_WHITESPACE - ) { - if ($indent['line'] === $tokens[$next]['line']) { - $foundIndent = strlen($indent['content']); - } else { - $foundIndent = 0; - } - - $minIndent = $previousIndent; - $maxIndent = $previousIndent; - $expectedIndent = $previousIndent; - - if ($this->multilevel === true) { - $minIndent = max(($previousIndent - $this->indent), $baseIndent); - $maxIndent = ($previousIndent + $this->indent); - $expectedIndent = min(max($foundIndent, $minIndent), $maxIndent); - } - - if ($foundIndent < $minIndent || $foundIndent > $maxIndent) { - $error = 'Object operator not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $next, 'Incorrect', $data); - if ($fix === true) { - $spaces = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($next, $spaces); - } else { - $phpcsFile->fixer->replaceToken(($next - 1), $spaces); - } - } - } - - $previousIndent = $expectedIndent; - }//end if - - // It cant be the last thing on the line either. - $content = $phpcsFile->findNext(T_WHITESPACE, ($next + 1), null, true); - if ($tokens[$content]['line'] !== $tokens[$next]['line']) { - $error = 'Object operator must be at the start of the line, not the end'; - $fix = $phpcsFile->addFixableError($error, $next, 'StartOfLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($next + 1); $x < $content; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addNewlineBefore($next); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - $next = $phpcsFile->findNext( - T_OBJECT_OPERATOR, - ($next + 1), - null, - false, - null, - true - ); - }//end while - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php deleted file mode 100644 index 097754e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php +++ /dev/null @@ -1,179 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ScopeClosingBraceSniff implements Sniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return int[] - */ - public function register() - { - return Tokens::$scopeOpeners; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile All the tokens found in the document. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // If this is an inline condition (ie. there is no scope opener), then - // return, as this is not a new scope. - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $scopeStart = $tokens[$stackPtr]['scope_opener']; - $scopeEnd = $tokens[$stackPtr]['scope_closer']; - - // If the scope closer doesn't think it belongs to this scope opener - // then the opener is sharing its closer with other tokens. We only - // want to process the closer once, so skip this one. - if (isset($tokens[$scopeEnd]['scope_condition']) === false - || $tokens[$scopeEnd]['scope_condition'] !== $stackPtr - ) { - return; - } - - // We need to actually find the first piece of content on this line, - // because if this is a method with tokens before it (public, static etc) - // or an if with an else before it, then we need to start the scope - // checking from there, rather than the current token. - $lineStart = ($stackPtr - 1); - for ($lineStart; $lineStart > 0; $lineStart--) { - if (strpos($tokens[$lineStart]['content'], $phpcsFile->eolChar) !== false) { - break; - } - } - - $lineStart++; - - $startColumn = 1; - if ($tokens[$lineStart]['code'] === T_WHITESPACE) { - $startColumn = $tokens[($lineStart + 1)]['column']; - } else if ($tokens[$lineStart]['code'] === T_INLINE_HTML) { - $trimmed = ltrim($tokens[$lineStart]['content']); - if ($trimmed === '') { - $startColumn = $tokens[($lineStart + 1)]['column']; - } else { - $startColumn = (strlen($tokens[$lineStart]['content']) - strlen($trimmed)); - } - } - - // Check that the closing brace is on it's own line. - $lastContent = $phpcsFile->findPrevious( - [ - T_WHITESPACE, - T_INLINE_HTML, - T_OPEN_TAG, - ], - ($scopeEnd - 1), - $scopeStart, - true - ); - - if ($tokens[$lastContent]['line'] === $tokens[$scopeEnd]['line']) { - $error = 'Closing brace must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $scopeEnd, 'Line'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($scopeEnd); - } - - return; - } - - // Check now that the closing brace is lined up correctly. - $lineStart = ($scopeEnd - 1); - for ($lineStart; $lineStart > 0; $lineStart--) { - if (strpos($tokens[$lineStart]['content'], $phpcsFile->eolChar) !== false) { - break; - } - } - - $lineStart++; - - $braceIndent = 0; - if ($tokens[$lineStart]['code'] === T_WHITESPACE) { - $braceIndent = ($tokens[($lineStart + 1)]['column'] - 1); - } else if ($tokens[$lineStart]['code'] === T_INLINE_HTML) { - $trimmed = ltrim($tokens[$lineStart]['content']); - if ($trimmed === '') { - $braceIndent = ($tokens[($lineStart + 1)]['column'] - 1); - } else { - $braceIndent = (strlen($tokens[$lineStart]['content']) - strlen($trimmed) - 1); - } - } - - $fix = false; - if ($tokens[$stackPtr]['code'] === T_CASE - || $tokens[$stackPtr]['code'] === T_DEFAULT - ) { - // BREAK statements should be indented n spaces from the - // CASE or DEFAULT statement. - $expectedIndent = ($startColumn + $this->indent - 1); - if ($braceIndent !== $expectedIndent) { - $error = 'Case breaking statement indented incorrectly; expected %s spaces, found %s'; - $data = [ - $expectedIndent, - $braceIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $scopeEnd, 'BreakIndent', $data); - } - } else { - $expectedIndent = max(0, ($startColumn - 1)); - if ($braceIndent !== $expectedIndent) { - $error = 'Closing brace indented incorrectly; expected %s spaces, found %s'; - $data = [ - $expectedIndent, - $braceIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $scopeEnd, 'Indent', $data); - } - }//end if - - if ($fix === true) { - $spaces = str_repeat(' ', $expectedIndent); - if ($braceIndent === 0) { - $phpcsFile->fixer->addContentBefore($lineStart, $spaces); - } else { - $phpcsFile->fixer->replaceToken($lineStart, ltrim($tokens[$lineStart]['content'])); - $phpcsFile->fixer->addContentBefore($lineStart, $spaces); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php deleted file mode 100644 index 2620d20..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\ScopeIndentSniff as GenericScopeIndentSniff; - -class ScopeIndentSniff extends GenericScopeIndentSniff -{ - - /** - * Any scope openers that should not cause an indent. - * - * @var int[] - */ - protected $nonIndentingScopes = [T_SWITCH]; - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc deleted file mode 100644 index d97ef4d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc +++ /dev/null @@ -1,112 +0,0 @@ -setLogger(new class {}); - -var_dump(new class(10) extends SomeClass implements SomeInterface { - private $num; - - public function __construct($num) - { - $this->num = $num; - } - - use SomeTrait; -}); - -class IncorrectClassDeclarationWithCommentAtEnd extends correctClassDeclaration /* Comment */ { -} - -class CorrectClassDeclarationWithCommentAtEnd extends correctClassDeclaration -/* Comment */ -{ -} - -// Don't move phpcs:ignore comments. -class PHPCSIgnoreAnnotationAfterOpeningBrace -{ // phpcs:ignore Standard.Cat.Sniff -- for reasons. -} - -// Moving any of the other trailing phpcs: comments is ok. -class PHPCSAnnotationAfterOpeningBrace -{ // phpcs:disable Standard.Cat.Sniff -- for reasons. -} - -if (!class_exists('ClassOpeningBraceShouldBeIndented')) { - abstract class ClassOpeningBraceShouldBeIndented -{ -} -} - -if (!class_exists('ClassOpeningBraceTooMuchIndentation')) { - final class ClassOpeningBraceTooMuchIndentation - { - } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc.fixed deleted file mode 100644 index 5b0a2f9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc.fixed +++ /dev/null @@ -1,121 +0,0 @@ -setLogger(new class {}); - -var_dump(new class(10) extends SomeClass implements SomeInterface { - private $num; - - public function __construct($num) - { - $this->num = $num; - } - - use SomeTrait; -}); - -class IncorrectClassDeclarationWithCommentAtEnd extends correctClassDeclaration /* Comment */ -{ -} - -class CorrectClassDeclarationWithCommentAtEnd extends correctClassDeclaration -/* Comment */ -{ -} - -// Don't move phpcs:ignore comments. -class PHPCSIgnoreAnnotationAfterOpeningBrace -{ // phpcs:ignore Standard.Cat.Sniff -- for reasons. -} - -// Moving any of the other trailing phpcs: comments is ok. -class PHPCSAnnotationAfterOpeningBrace -{ - // phpcs:disable Standard.Cat.Sniff -- for reasons. -} - -if (!class_exists('ClassOpeningBraceShouldBeIndented')) { - abstract class ClassOpeningBraceShouldBeIndented - { -} -} - -if (!class_exists('ClassOpeningBraceTooMuchIndentation')) { - final class ClassOpeningBraceTooMuchIndentation - { - } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.2.inc deleted file mode 100644 index ac71fc9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.2.inc +++ /dev/null @@ -1,11 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClassDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - if ($testFile === 'ClassDeclarationUnitTest.1.inc') { - return; - } - - $config->tabWidth = 4; - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ClassDeclarationUnitTest.1.inc': - return [ - 21 => 1, - 22 => 1, - 23 => 1, - 27 => 1, - 33 => 1, - 38 => 1, - 49 => 1, - 84 => 1, - 94 => 1, - 99 => 1, - 104 => 1, - 110 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - if ($testFile === 'ClassDeclarationUnitTest.2.inc') { - return [11 => 1]; - } - - return[]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.inc deleted file mode 100644 index 0ca8751..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.inc +++ /dev/null @@ -1,120 +0,0 @@ - - * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - * @version Release: 1.0 - * @link http://pear.php.net/package/PHP_CodeSniffer - */ -class Extra_Description_Newlines -{ - -}//end class - - -/** - * Sample class comment - * @category PHP - * @package PHP_CodeSniffer - * @author Greg Sherwood - * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - * @version - * @link http://pear.php.net/package/PHP_CodeSniffer - */ -class Missing_Newlines_Before_Tags -{ - -}//end class - - -/** - * Simple class comment - * - * @category _wrong_category - * @package PHP_CodeSniffer - * @package ADDITIONAL PACKAGE TAG - * @subpackage SUBPACKAGE TAG - * @author Original Author - * @author Greg Sherwood gsherwood@squiz.net - * @author Mr T - * @author - * @copyright 1997~1994 The PHP Group - * @license http://www.php.net/license/3_0.txt - * @version INVALID VERSION CONTENT - * @see - * @see - * @link sdfsdf - * @see Net_Sample::Net_Sample() - * @see Net_Other - * @deprecated asd - * @unknown Unknown tag - * @since Class available since Release 1.2.0 - */ -class Checking_Tags -{ - class Sub_Class { - - }//end class - - -}//end class - - -/** - * - * - */ -class Empty_Class_Doc -{ - -}//end class - - -/** - * - * - */ -interface Empty_Interface_Doc -{ - -}//end interface - - -/** - * - * - */ -trait Empty_Trait_Doc -{ - -}//end trait diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.php deleted file mode 100644 index 9a4bcf7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClassCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 15 => 1, - 51 => 1, - 63 => 1, - 65 => 2, - 66 => 1, - 68 => 1, - 70 => 1, - 71 => 1, - 72 => 1, - 74 => 2, - 75 => 1, - 76 => 1, - 77 => 1, - 85 => 1, - 96 => 5, - 106 => 5, - 116 => 5, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 71 => 1, - 73 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.inc deleted file mode 100644 index 0b18fa3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.inc +++ /dev/null @@ -1,53 +0,0 @@ - -* @author Greg Sherwood gsherwood@squiz.net -* @author Mr T -* @author -* @copyright 1997~1994 The PHP Group -* @copyright 1997~1994 The PHP Group -* @license http://www.php.net/license/3_0.txt -* @see -* @see -* @version INVALID VERSION CONTENT -* @see Net_Sample::Net_Sample() -* @see Net_Other -* @deprecated asd -* @since Class available since Release 1.2.0 -* @summary An unknown summary tag -* @package '' -* @subpackage !! -* @author Code AUthor -*/ -require_once '/some/path.php'; -?> - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.php deleted file mode 100644 index 119277a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FileCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 21 => 1, - 23 => 2, - 24 => 1, - 26 => 1, - 28 => 1, - 29 => 1, - 30 => 1, - 31 => 1, - 32 => 2, - 33 => 1, - 34 => 1, - 35 => 1, - 40 => 2, - 41 => 2, - 43 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 29 => 1, - 30 => 1, - 34 => 1, - 43 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc deleted file mode 100644 index 461b490..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc +++ /dev/null @@ -1,383 +0,0 @@ - line numbers for each token. - * - * @param array $tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function foo(&$tokens, $tokenizer, $eolChar) -{ - -}//end foo() - -/** - * Gettext. - * - */ -function _() { - return $foo; -} - -class Baz { - /** - * The PHP5 constructor - * - * No return tag - */ - public function __construct() { - - } -} - -/** - * Complete a step. - * - * @param string $status Status of step to complete. - * @param array $array Array. - * @param string $note Optional note. - * - * @return void - */ -function completeStep($status, array $array = [Class1::class, 'test'], $note = '') { - echo 'foo'; -} - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string ...$name2 Comment. - * - * @return void - */ -function myFunction(string $name1, string ...$name2) { -} - - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string $name2 Comment. - * - * @return void - */ -function myFunction(string $name1, string ...$name2) { -} - -/** - * Completely invalid format, but should not cause PHP notices. - * - * @param $bar - * Comment here. - * @param ... - * Additional arguments here. - * - * @return - * Return value - * - */ -function foo($bar) { -} - -/** - * Processes the test. - * - * @param PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack - * where the listening token type - * was found. - * - * @return void - * @see register() - */ -function process(File $phpcsFile, $stackPtr) -{ - -}//end process() - -/** - * Processes the test. - * - * @param int $phpcsFile The PHP_CodeSniffer - * file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack - * where the listening token type - * was found. - * - * @return void - * @see register() - */ -function process(File $phpcsFile, $stackPtr) -{ - -}//end process() - -/** - * @param (Foo&Bar)|null $a Comment. - * @param string $b Comment. - * - * @return void - */ -public function setTranslator($a, &$b): void -{ - $this->translator = $translator; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc.fixed deleted file mode 100644 index 80bf63f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc.fixed +++ /dev/null @@ -1,383 +0,0 @@ - line numbers for each token. - * - * @param array $tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function foo(&$tokens, $tokenizer, $eolChar) -{ - -}//end foo() - -/** - * Gettext. - * - */ -function _() { - return $foo; -} - -class Baz { - /** - * The PHP5 constructor - * - * No return tag - */ - public function __construct() { - - } -} - -/** - * Complete a step. - * - * @param string $status Status of step to complete. - * @param array $array Array. - * @param string $note Optional note. - * - * @return void - */ -function completeStep($status, array $array = [Class1::class, 'test'], $note = '') { - echo 'foo'; -} - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string ...$name2 Comment. - * - * @return void - */ -function myFunction(string $name1, string ...$name2) { -} - - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string $name2 Comment. - * - * @return void - */ -function myFunction(string $name1, string ...$name2) { -} - -/** - * Completely invalid format, but should not cause PHP notices. - * - * @param $bar - * Comment here. - * @param ... - * Additional arguments here. - * - * @return - * Return value - * - */ -function foo($bar) { -} - -/** - * Processes the test. - * - * @param PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack - * where the listening token type - * was found. - * - * @return void - * @see register() - */ -function process(File $phpcsFile, $stackPtr) -{ - -}//end process() - -/** - * Processes the test. - * - * @param int $phpcsFile The PHP_CodeSniffer - * file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack - * where the listening token type - * was found. - * - * @return void - * @see register() - */ -function process(File $phpcsFile, $stackPtr) -{ - -}//end process() - -/** - * @param (Foo&Bar)|null $a Comment. - * @param string $b Comment. - * - * @return void - */ -public function setTranslator($a, &$b): void -{ - $this->translator = $translator; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.php deleted file mode 100644 index 2f27c18..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 10 => 1, - 12 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - 28 => 1, - 76 => 1, - 87 => 1, - 103 => 1, - 109 => 1, - 112 => 1, - 122 => 1, - 123 => 2, - 124 => 2, - 125 => 1, - 126 => 1, - 137 => 1, - 138 => 1, - 139 => 1, - 152 => 1, - 155 => 1, - 165 => 1, - 172 => 1, - 183 => 1, - 190 => 2, - 206 => 1, - 234 => 1, - 272 => 1, - 313 => 1, - 317 => 1, - 327 => 1, - 329 => 1, - 332 => 1, - 344 => 1, - 343 => 1, - 345 => 1, - 346 => 1, - 360 => 1, - 361 => 1, - 363 => 1, - 364 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.inc deleted file mode 100644 index 187228c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.inc +++ /dev/null @@ -1,29 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class InlineCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 15 => 1, - 24 => 1, - 25 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.inc deleted file mode 100644 index 66ab925..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.inc +++ /dev/null @@ -1,159 +0,0 @@ - 0); - -do -{ - echo $i; -} while ($i > 0); - -do -{ - echo $i; -} -while ($i > 0); - -do { echo $i; } while ($i > 0); - -do{ - echo $i; -}while($i > 0); - - -// while -while ($i < 1) { - echo $i; -} - -while($i < 1){ - echo $i; -} - -while ($i < 1) { echo $i; } - - -// for -for ($i = 1; $i < 1; $i++) { - echo $i; -} - -for($i = 1; $i < 1; $i++){ - echo $i; -} - -for ($i = 1; $i < 1; $i++) { echo $i; } - - -// foreach -foreach ($items as $item) { - echo $item; -} - -foreach($items as $item){ - echo $item; -} - -foreach ($items as $item) { echo $item; } - - -// if -if ($i == 0) { - $i = 1; -} - -if($i == 0){ - $i = 1; -} - -if ($i == 0) { $i = 1; } - - -// else -if ($i == 0) { - $i = 1; -} else { - $i = 0; -} - -if ($i == 0) { - $i = 1; -}else{ - $i = 0; -} - -if ($i == 0) { $i = 1; } else { $i = 0; } - - -// else -if ($i == 0) { - $i = 1; -} else { - $i = 0; -} - -if ($i == 0) { - $i = 1; -}else{ - $i = 0; -} - -if ($i == 0) { $i = 1; } else { $i = 0; } - - -// else if -if ($i == 0) { - $i = 1; -} else if ($i == 2) { - $i = 0; -} - -if ($i == 0) { - $i = 1; -} elseif ($i == 2) { - $i = 0; -} - -if ($i == 0) { - $i = 1; -}else if($i == 2){ - $i = 0; -} - -if ($i == 0) { - $i = 1; -}elseif($i == 2){ - $i = 0; -} - -if ($i == 0) { $i = 1; } else if ($i == 2) { $i = 0; } -if ($i == 0) { $i = 1; } elseif ($i == 2) { $i = 0; } - -if ($i == 0) { // this is ok because comments are allowed - $i = 1; -} - -if ($i == 0) {// this is ok because comments are allowed - $i = 1; -} - -if ($i == 0) { /* this is ok because comments are allowed*/ - $i = 1; -} - -if ($i == 0) -{ // this is not ok - $i = 1; -} - -if ($i == 0) /* this is ok */ { -} - -if ($i == 0) { -} -else { -} -?> \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.php deleted file mode 100644 index 5cb2676..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.php +++ /dev/null @@ -1,71 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ControlSignatureUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 14 => 1, - 20 => 1, - 22 => 1, - 32 => 1, - 36 => 1, - 44 => 1, - 48 => 1, - 56 => 1, - 60 => 1, - 68 => 1, - 72 => 1, - 84 => 1, - 88 => 2, - 100 => 1, - 104 => 2, - 122 => 2, - 128 => 1, - 132 => 3, - 133 => 2, - 147 => 1, - 157 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc deleted file mode 100644 index a7a3c69..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc +++ /dev/null @@ -1,251 +0,0 @@ - -

    some text

    -errorCode() == 401 || // comment - $IPP->errorCode() == 3200) /* long comment - here - */ -{ - return false; -} - -if ($IPP->errorCode() == 401 || // comment - $IPP->errorCode() == 3200) // long comment here -{ - return false; -} - -if ($IPP->errorCode() == 401 - // Comment explaining the next condition here. - || $IPP->errorCode() == 3200 -) { - return false; -} - -function bar() { - if ($a - && $b -) { - return false; - } -} - -if ($a - && foo( - 'a', - 'b' - )) { - return false; -} - -?> - - - - - -errorCode() == 401 || // phpcs:ignore Standard.Category.Sniff -- for reasons. - $IPP->errorCode() == 3200) /* - phpcs:ignore Standard.Category.Sniff -- for reasons. - */ -{ - return false; -} - -if ($IPP->errorCode() == 401 || // phpcs:disable Standard.Category.Sniff -- for reasons. - $IPP->errorCode() == 3200) // phpcs:enable -{ - return false; -} - -if ($IPP->errorCode() == 401 - // phpcs:ignore Standard.Category.Sniff -- for reasons. - || $IPP->errorCode() == 3200 -) { - return false; -} - - if ($IPP->errorCode() == 401 || - /* - * phpcs:disable Standard.Category.Sniff -- for reasons. - */ - $IPP->errorCode() == 3200 - ) { - return false; - } - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() == 3200 - // phpcs:ignore Standard.Category.Sniff -- for reasons. -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() - === 'someverylongexpectedoutput' -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() - // A comment. - === 'someverylongexpectedoutput' -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() - // phpcs:ignore Standard.Category.Sniff -- for reasons. - === 'someverylongexpectedoutput' -) { - return false; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc.fixed deleted file mode 100644 index 7d56c46..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc.fixed +++ /dev/null @@ -1,247 +0,0 @@ - -

    some text

    -errorCode() == 401 // comment - || $IPP->errorCode() == 3200 /* long comment - here - */ -) { - return false; -} - -if ($IPP->errorCode() == 401 // comment - || $IPP->errorCode() == 3200 // long comment here -) { - return false; -} - -if ($IPP->errorCode() == 401 - // Comment explaining the next condition here. - || $IPP->errorCode() == 3200 -) { - return false; -} - -function bar() { - if ($a - && $b - ) { - return false; - } -} - -if ($a - && foo( - 'a', - 'b' - ) -) { - return false; -} - -?> - - - - - -errorCode() == 401 // phpcs:ignore Standard.Category.Sniff -- for reasons. - || $IPP->errorCode() == 3200 /* - phpcs:ignore Standard.Category.Sniff -- for reasons. - */ -) { - return false; -} - -if ($IPP->errorCode() == 401 // phpcs:disable Standard.Category.Sniff -- for reasons. - || $IPP->errorCode() == 3200 // phpcs:enable -) { - return false; -} - -if ($IPP->errorCode() == 401 - // phpcs:ignore Standard.Category.Sniff -- for reasons. - || $IPP->errorCode() == 3200 -) { - return false; -} - - if ($IPP->errorCode() == 401 - /* - * phpcs:disable Standard.Category.Sniff -- for reasons. - */ - || $IPP->errorCode() == 3200 - ) { - return false; - } - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() == 3200 - // phpcs:ignore Standard.Category.Sniff -- for reasons. -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() === 'someverylongexpectedoutput' -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() - // A comment. - === 'someverylongexpectedoutput' -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() - // phpcs:ignore Standard.Category.Sniff -- for reasons. - === 'someverylongexpectedoutput' -) { - return false; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js deleted file mode 100644 index 064d7ff..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js +++ /dev/null @@ -1,251 +0,0 @@ -if (blah(param)) { - -} - -if ((condition1 - || condition2) - && condition3 - && condition4 - && condition5 -) { -} - -if ((condition1 || condition2) && condition3 && condition4 && condition5) { -} - -if ((condition1 || condition2) - && condition3 -) { -} - -if ( - (condition1 || condition2) - && condition3 -) { -} - -if ((condition1 - || condition2) -) { -} - -if ((condition1 - || condition2) - && condition3 && - condition4 -) { -} - -if ((condition1 - || condition2) - && condition3 - && condition4 - && condition5 -) { -} - -if (($condition1 - || $condition2) -) { -} - -if ((condition1 - || condition2) - ) { -} - -if ( - ( - condition1 - || condition2 - ) - && condition3 -) { -} - - -if ( condition1 - || condition2 - || condition3 -) { -} - -if (condition1 - || condition2 - || condition3 -) { -} else if (condition1 - || condition2 - || condition3 -) { -} - -if (condition1 - || condition2 - || condition3 -) { -} else if ( - condition1 - || condition2 && - condition3 -) { -} - -if (condition1 - || condition2 -|| condition3) { -} - -if (condition1 - || condition2 || condition3 -){ -} - -if (condition1) - console.info('bar'); - -if (condition1 - || condition2 -|| condition3) - console.info('bar'); - - -if (condition1 - || condition2 || condition3 -) - console.info('bar'); - -if (!a(post) - && (!a(context.header) - ^ a(context.header, 'Content-Type')) -) { -// ... -} - -if (foo) -{ - console.info('bar'); -} - -// Should be no errors even though lines are -// not exactly aligned together. Multi-line function -// call takes precedence. -if (array_key_exists(key, value) - && foo.bar.baz( - key, value2 - ) -) { -} - -if (true) { - foo = true; -}; - -if (foo == 401 || // comment - bar == 3200) /* long comment - here - */ -{ - return false; -} - -if (foo == 401 || // comment - bar == 3200) // long comment here -{ - return false; -} - -if (IPP.errorCode() == 401 - // Comment explaining the next condition here. - || IPP.errorCode() == 3200 -) { - return false; -} - -function bar() { - if (a - && b -) { - return false; - } -} - -if (a - && foo( - 'a', - 'b' - )) { - return false; -} - - - - - - - - - - - - - -if (foo == 401 || // phpcs:ignore Standard.Category.Sniff -- for reasons. - bar == 3200) /* - phpcs:ignore Standard.Category.Sniff -- for reasons. - */ -{ - return false; -} - -if (foo == 401 || // phpcs:disable Standard.Category.Sniff -- for reasons. - bar == 3200) // phpcs:enable -{ - return false; -} - -if (IPP.errorCode() == 401 - // phpcs:ignore Standard.Category.Sniff -- for reasons. - || IPP.errorCode() == 3200 -) { - return false; -} - - if (foo == 401 || - /* - * phpcs:disable Standard.Category.Sniff -- for reasons. - */ - bar == 3200 - ) { - return false; - } - -if (IPP.errorCode() == 401 - || IPP.errorCode() == 3200 - // phpcs:ignore Standard.Category.Sniff -- for reasons. -) { - return false; -} - -if (foo == 401 - || bar - == 'someverylongexpectedoutput' -) { - return false; -} - -if (IPP.errorCode() == 401 - || bar - // A comment. - == 'someverylongexpectedoutput' -) { - return false; -} - -if (foo == 401 - || IPP.errorCode() - // phpcs:ignore Standard.Category.Sniff -- for reasons. - == 'someverylongexpectedoutput' -) { - return false; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js.fixed deleted file mode 100644 index cfde75d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js.fixed +++ /dev/null @@ -1,247 +0,0 @@ -if (blah(param)) { - -} - -if ((condition1 - || condition2) - && condition3 - && condition4 - && condition5 -) { -} - -if ((condition1 || condition2) && condition3 && condition4 && condition5) { -} - -if ((condition1 || condition2) - && condition3 -) { -} - -if ((condition1 || condition2) - && condition3 -) { -} - -if ((condition1 - || condition2) -) { -} - -if ((condition1 - || condition2) - && condition3 - && condition4 -) { -} - -if ((condition1 - || condition2) - && condition3 - && condition4 - && condition5 -) { -} - -if (($condition1 - || $condition2) -) { -} - -if ((condition1 - || condition2) -) { -} - -if ((condition1 - || condition2) - && condition3 -) { -} - - -if (condition1 - || condition2 - || condition3 -) { -} - -if (condition1 - || condition2 - || condition3 -) { -} else if (condition1 - || condition2 - || condition3 -) { -} - -if (condition1 - || condition2 - || condition3 -) { -} else if (condition1 - || condition2 - && condition3 -) { -} - -if (condition1 - || condition2 - || condition3 -) { -} - -if (condition1 - || condition2 || condition3 -) { -} - -if (condition1) - console.info('bar'); - -if (condition1 - || condition2 - || condition3 -) - console.info('bar'); - - -if (condition1 - || condition2 || condition3 -) - console.info('bar'); - -if (!a(post) - && (!a(context.header) - ^ a(context.header, 'Content-Type')) -) { -// ... -} - -if (foo) { - console.info('bar'); -} - -// Should be no errors even though lines are -// not exactly aligned together. Multi-line function -// call takes precedence. -if (array_key_exists(key, value) - && foo.bar.baz( - key, value2 - ) -) { -} - -if (true) { - foo = true; -}; - -if (foo == 401 // comment - || bar == 3200 /* long comment - here - */ -) { - return false; -} - -if (foo == 401 // comment - || bar == 3200 // long comment here -) { - return false; -} - -if (IPP.errorCode() == 401 - // Comment explaining the next condition here. - || IPP.errorCode() == 3200 -) { - return false; -} - -function bar() { - if (a - && b - ) { - return false; - } -} - -if (a - && foo( - 'a', - 'b' - ) -) { - return false; -} - - - - - - - - - - - - - -if (foo == 401 // phpcs:ignore Standard.Category.Sniff -- for reasons. - || bar == 3200 /* - phpcs:ignore Standard.Category.Sniff -- for reasons. - */ -) { - return false; -} - -if (foo == 401 // phpcs:disable Standard.Category.Sniff -- for reasons. - || bar == 3200 // phpcs:enable -) { - return false; -} - -if (IPP.errorCode() == 401 - // phpcs:ignore Standard.Category.Sniff -- for reasons. - || IPP.errorCode() == 3200 -) { - return false; -} - - if (foo == 401 - /* - * phpcs:disable Standard.Category.Sniff -- for reasons. - */ - || bar == 3200 - ) { - return false; - } - -if (IPP.errorCode() == 401 - || IPP.errorCode() == 3200 - // phpcs:ignore Standard.Category.Sniff -- for reasons. -) { - return false; -} - -if (foo == 401 - || bar == 'someverylongexpectedoutput' -) { - return false; -} - -if (IPP.errorCode() == 401 - || bar - // A comment. - == 'someverylongexpectedoutput' -) { - return false; -} - -if (foo == 401 - || IPP.errorCode() - // phpcs:ignore Standard.Category.Sniff -- for reasons. - == 'someverylongexpectedoutput' -) { - return false; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.php deleted file mode 100644 index f78b4e3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class MultiLineConditionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='MultiLineConditionUnitTest.inc') - { - $errors = [ - 21 => 1, - 22 => 1, - 35 => 1, - 40 => 1, - 41 => 1, - 42 => 1, - 43 => 1, - 49 => 1, - 54 => 1, - 57 => 1, - 58 => 1, - 59 => 1, - 61 => 1, - 67 => 1, - 87 => 1, - 88 => 1, - 89 => 1, - 90 => 1, - 96 => 2, - 101 => 1, - 109 => 2, - 125 => 1, - 145 => 2, - 153 => 2, - 168 => 1, - 177 => 1, - 194 => 2, - 202 => 2, - 215 => 1, - 218 => 2, - 232 => 2, - 239 => 1, - 240 => 2, - 248 => 2, - ]; - - if ($testFile === 'MultiLineConditionUnitTest.inc') { - $errors[183] = 1; - } - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.inc deleted file mode 100644 index dadfe92..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.inc +++ /dev/null @@ -1,99 +0,0 @@ - -
    -Some content goes here.
    -
    -
    - -
    -    Some content goes here.
    -    
    -    
    - -
    -Some content goes here.
    -
    -
    - -
    -    Some content goes here.
    -    
    -    
    - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class IncludingFileUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 5 => 1, - 11 => 1, - 12 => 1, - 16 => 1, - 17 => 1, - 33 => 1, - 34 => 1, - 47 => 1, - 48 => 1, - 64 => 1, - 65 => 1, - 73 => 1, - 74 => 1, - 85 => 1, - 86 => 1, - 98 => 1, - 99 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.inc deleted file mode 100644 index fc6aea0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.inc +++ /dev/null @@ -1,22 +0,0 @@ -additionalHeaderData[$this->strApplicationName] - = $this->xajax->getJavascript(t3lib_extMgm::siteRelPath('nr_xajax')); - -$GLOBALS['TSFE']->additionalHeaderData[$this->strApplicationName] - = $this->xajax->getJavascript(t3lib_extMgm::siteRelPath('nr_xajax')); - -$GLOBALS['TSFE']->additionalHeaderData[$this->strApplicationName] = - $this->xajax->getJavascript(t3lib_extMgm::siteRelPath('nr_xajax')); - -$GLOBALS['TSFE']->additionalHeaderData[$this->strApplicationName] - = $this->xajax->getJavascript(t3lib_extMgm::siteRelPath('nr_xajax')); -$GLOBALS['TSFE']->additionalHeaderData[$this->strApplicationName] = 'boo'; - -$var='string'; - -function getInstalledStandards( - $includeGeneric=false, - $standardsDir='' -) { -} -?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.php deleted file mode 100644 index 734d4fc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Formatting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class MultiLineAssignmentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 6 => 1, - 8 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc deleted file mode 100644 index eaa983c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc +++ /dev/null @@ -1,524 +0,0 @@ -getFoo() - ->doBar( - $this->getX() // no comma here - ->doY() // this is still the first method argument - ->doZ() // this is still the first method argument - ); -} - -$var = myFunction( -$foo, -$bar -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments false - -fputs( - STDOUT, - "Examples: - $ {$app} , --all - $ {$app} --all", $something -); - -$array = array(); -array_map( - function($x) - { - return trim($x, $y); - }, $foo, - $array -); - -$bar = new stdClass( - 4, /* thanks */ 5, /* PSR-2 */ 6 -); - -function doSomething() -{ - return $this->getFoo() - ->doBar( - $this->getX() // no comma here - ->doY() // this is still the first method argument - ->doZ() // this is still the first method argument - ); -} - -doError( - 404, // status code - 'Not Found', // error name - 'Check your id' // fix -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments true - -// Don't report errors for closing braces. Leave that to other sniffs. -foo( - [ - 'this', - 'is', - 'an', - 'array' - ], -[ - 'this', - 'is', - 'an', - 'array' - ], - array( - 'this', - 'is', -'an', -'array' - ), - array( - 'this', - 'is', - 'an', - 'array' - ), - function($x) - { - echo 'wee'; - - return trim($x); - } -); - -function foo() -{ - myFunction( - 'string'. - // comment - // comment - 'string'. - /* comment - * comment - */ - 'string' - ); -} - -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 1 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 1 -test($arg, $arg2); -test( $arg, $arg2 ); -test( $arg, $arg2 ); -test(); -test( ); -test( ); -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 0 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 0 - -?> - - - -
  • - log(// ... - 'error', - sprintf( - 'Message: %s', - isset($e->getData()['object']['evidence_details']) - ? $e->getData()['object']['evidence_details']['due_by'] - : '' - ), - array($e->getData()['object']) -); - -?> -
    - $class - ] - ); ?> -
    - - function ($x) { - return true; - }, - 'baz' => false - ) -); -$qux = array_filter( - $quux, function ($x) { - return $x; - } -); - -array_filter( - [1, 2], - function ($i) : bool { - return $i === 0; - } -); - -foo(array( - 'callback' => function () { - $foo = 'foo'; - return; - }, -)); - -foo( - $a, - /* - $c, - - $d, - */ - $e -); - -test( - 1,2,3,4 - ); - -class Test -{ - public function getInstance() - { - return new static( - 'arg', - 'foo' - ); - } - - public function getSelf() - { - return new self( - 'a','b', 'c' - ); - } -} - -$x = $var('y', -'x'); - -$obj->{$x}(1, - 2); - -return (function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})( - 'a','b' -)('c', - 'd'); - -class Foo -{ - public function bar($a, $b) - { - if (!$a || !$b) { - return; - } - - (new stdClass())->a = $a; - } -} - -return (function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})('a','b')('c','d'); - -function foo() -{ - Bar( - function () { - } - ); -} - -$deprecated_functions = [ - 'the_category_ID' - => function_call( // 7 spaces, not 8. This is the problem line. - $a, - $b - ), -]; - -$deprecated_functions = [ - 'the_category_ID' - => function_call( // 9 spaces, not 8. This is the problem line. - $a, - $b - ), -]; - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments false - -printf( - '', - $obj->getName(), // Trailing comment. - $obj->getID(), // phpcs:ignore Standard.Category.SniffName -- for reasons. - $option -); - -// Handling of PHP 7.3 trailing comma's. -functionCall($args, $foo,); -functionCall( - $args, $foo, -); -functionCall( - $args, - $foo, -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments true - -$this->foo( - - ['a','b'], - true - -); - -$this->foo( - - // Comment - ['a','b'], - true - -); - -function m() -{ - $t = ' - ' . (empty(true) ? ' - ' . f( - '1', - '2', - ) . ' - ' : ''); -} - -class C -{ - - public function m() - { - $a = []; - $t = - "SELECT * FROM t -WHERE f IN(" . implode( - ",", - $a - ) . ")"; - } -} - -$notices = array( - 'index' => sprintf( - translation_function('a text string with %s placeholder'), - 'replacement' - ), -); - -$componentType = $this->componentTypeRepository->findByType($this->identifier) ?: - $this->componentTypeFactory->createForType( - $this->identifier, - $this->className, - true, - $this->isPrototypal - ); - -return [ - 'export-path' => 'exports/database/' - . env( - 'APP_CUSTOMER', - 'not-configured' - ) - . '/' . env( - 'APP_IDENTIFIER', - 'not-configured' - ), -]; - -$methods .= - str_replace( - array_keys($replacements), - array_values($replacements), - $methodTemplate - ) - . PHP_EOL . PHP_EOL . str_repeat(' ', 4); - -$rangeValues['min'] = - $this->adjustLowerThreshold( - $this->normalizeRatingForFilter($rangeValues['min']) - ); - -$salesOrderThresholdTransfer->fromArray($salesOrderThresholdEntity->toArray(), true) - ->setSalesOrderThresholdValue( - $this->mapSalesOrderThresholdValueTransfer($salesOrderThresholdTransfer, $salesOrderThresholdEntity) - )->setCurrency( - (new CurrencyTransfer())->fromArray($salesOrderThresholdEntity->getCurrency()->toArray(), true) - )->setStore( - (new StoreTransfer())->fromArray($salesOrderThresholdEntity->getStore()->toArray(), true) - ); - -return trim(preg_replace_callback( - // sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) - // /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ - sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), - function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; - }, - $search - )); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc.fixed deleted file mode 100644 index e040fc8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc.fixed +++ /dev/null @@ -1,536 +0,0 @@ -getFoo() - ->doBar( - $this->getX() // no comma here - ->doY() // this is still the first method argument - ->doZ() // this is still the first method argument - ); -} - -$var = myFunction( - $foo, - $bar -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments false - -fputs( - STDOUT, - "Examples: - $ {$app} , --all - $ {$app} --all", - $something -); - -$array = array(); -array_map( - function($x) - { - return trim($x, $y); - }, - $foo, - $array -); - -$bar = new stdClass( - 4, /* thanks */ - 5, /* PSR-2 */ - 6 -); - -function doSomething() -{ - return $this->getFoo() - ->doBar( - $this->getX() // no comma here - ->doY() // this is still the first method argument - ->doZ() // this is still the first method argument - ); -} - -doError( - 404, // status code - 'Not Found', // error name - 'Check your id' // fix -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments true - -// Don't report errors for closing braces. Leave that to other sniffs. -foo( - [ - 'this', - 'is', - 'an', - 'array' - ], - [ - 'this', - 'is', - 'an', - 'array' - ], - array( - 'this', - 'is', - 'an', - 'array' - ), - array( - 'this', - 'is', - 'an', - 'array' - ), - function($x) - { - echo 'wee'; - - return trim($x); - } -); - -function foo() -{ - myFunction( - 'string'. - // comment - // comment - 'string'. - /* comment - * comment - */ - 'string' - ); -} - -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 1 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 1 -test( $arg, $arg2 ); -test( $arg, $arg2 ); -test( $arg, $arg2 ); -test(); -test(); -test(); -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 0 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 0 - -?> - - - -
  • - log(// ... - 'error', - sprintf( - 'Message: %s', - isset($e->getData()['object']['evidence_details']) - ? $e->getData()['object']['evidence_details']['due_by'] - : '' - ), - array($e->getData()['object']) -); - -?> -
    - $class - ] - ); ?> -
    - - function ($x) { - return true; - }, - 'baz' => false - ) -); -$qux = array_filter( - $quux, function ($x) { - return $x; - } -); - -array_filter( - [1, 2], - function ($i) : bool { - return $i === 0; - } -); - -foo( - array( - 'callback' => function () { - $foo = 'foo'; - return; - }, - ) -); - -foo( - $a, - /* - $c, - - $d, - */ - $e -); - -test( - 1,2,3,4 -); - -class Test -{ - public function getInstance() - { - return new static( - 'arg', - 'foo' - ); - } - - public function getSelf() - { - return new self( - 'a','b', 'c' - ); - } -} - -$x = $var( - 'y', - 'x' -); - -$obj->{$x}( - 1, - 2 -); - -return (function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})( - 'a','b' -)( - 'c', - 'd' -); - -class Foo -{ - public function bar($a, $b) - { - if (!$a || !$b) { - return; - } - - (new stdClass())->a = $a; - } -} - -return (function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})('a','b')('c','d'); - -function foo() -{ - Bar( - function () { - } - ); -} - -$deprecated_functions = [ - 'the_category_ID' - => function_call( // 7 spaces, not 8. This is the problem line. - $a, - $b - ), -]; - -$deprecated_functions = [ - 'the_category_ID' - => function_call( // 9 spaces, not 8. This is the problem line. - $a, - $b - ), -]; - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments false - -printf( - '', - $obj->getName(), // Trailing comment. - $obj->getID(), // phpcs:ignore Standard.Category.SniffName -- for reasons. - $option -); - -// Handling of PHP 7.3 trailing comma's. -functionCall($args, $foo,); -functionCall( - $args, - $foo, -); -functionCall( - $args, - $foo, -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments true - -$this->foo( - ['a','b'], - true -); - -$this->foo( - // Comment - ['a','b'], - true -); - -function m() -{ - $t = ' - ' . (empty(true) ? ' - ' . f( - '1', - '2', - ) . ' - ' : ''); -} - -class C -{ - - public function m() - { - $a = []; - $t = - "SELECT * FROM t -WHERE f IN(" . implode( - ",", - $a - ) . ")"; - } -} - -$notices = array( - 'index' => sprintf( - translation_function('a text string with %s placeholder'), - 'replacement' - ), -); - -$componentType = $this->componentTypeRepository->findByType($this->identifier) ?: - $this->componentTypeFactory->createForType( - $this->identifier, - $this->className, - true, - $this->isPrototypal - ); - -return [ - 'export-path' => 'exports/database/' - . env( - 'APP_CUSTOMER', - 'not-configured' - ) - . '/' . env( - 'APP_IDENTIFIER', - 'not-configured' - ), -]; - -$methods .= - str_replace( - array_keys($replacements), - array_values($replacements), - $methodTemplate - ) - . PHP_EOL . PHP_EOL . str_repeat(' ', 4); - -$rangeValues['min'] = - $this->adjustLowerThreshold( - $this->normalizeRatingForFilter($rangeValues['min']) - ); - -$salesOrderThresholdTransfer->fromArray($salesOrderThresholdEntity->toArray(), true) - ->setSalesOrderThresholdValue( - $this->mapSalesOrderThresholdValueTransfer($salesOrderThresholdTransfer, $salesOrderThresholdEntity) - )->setCurrency( - (new CurrencyTransfer())->fromArray($salesOrderThresholdEntity->getCurrency()->toArray(), true) - )->setStore( - (new StoreTransfer())->fromArray($salesOrderThresholdEntity->getStore()->toArray(), true) - ); - -return trim( - preg_replace_callback( - // sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) - // /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ - sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), - function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; - }, - $search - ) -); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js deleted file mode 100644 index 5e77e57..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js +++ /dev/null @@ -1,80 +0,0 @@ -test( -); -test(); -test(arg, arg2); -test (); -test( ); -test() ; -test( arg); -test( arg ); -test ( arg ); - -if (foo(arg) === true) { - -} - -var something = get(arg1, arg2); -var something = get(arg1, arg2) ; -var something = get(arg1, arg2) ; - -make_foo(string/*the string*/, true/*test*/); -make_foo(string/*the string*/, true/*test*/ ); -make_foo(string /*the string*/, true /*test*/); -make_foo(/*the string*/string, /*test*/true); -make_foo( /*the string*/string, /*test*/true); - -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 1 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 1 -test(arg, arg2); -test( arg, arg2 ); -test( arg, arg2 ); -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 0 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 0 - -this.init = function(data) { - a.b('').a(function(itemid, target) { - b( - itemid, - target, - { - reviewData: _reviewData, - pageid: itemid - }, - '', - function() { - var _showAspectItems = function(itemid) { - a.a(a.c(''), ''); - a.b(a.c('-' + itemid), ''); - }; - a.foo(function(itemid, target) { - _foo(itemid); - }); - } - ); - }); -}; - -a.prototype = { - - a: function() - { - this.addItem( - { - /** - * @return void - */ - a: function() - { - - }, - /** - * @return void - */ - a: function() - { - - }, - } - ); - } -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js.fixed deleted file mode 100644 index 7855ac6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js.fixed +++ /dev/null @@ -1,84 +0,0 @@ -test( -); -test(); -test(arg, arg2); -test(); -test(); -test(); -test(arg); -test(arg); -test(arg); - -if (foo(arg) === true) { - -} - -var something = get(arg1, arg2); -var something = get(arg1, arg2); -var something = get(arg1, arg2); - -make_foo(string/*the string*/, true/*test*/); -make_foo(string/*the string*/, true/*test*/); -make_foo(string /*the string*/, true /*test*/); -make_foo(/*the string*/string, /*test*/true); -make_foo(/*the string*/string, /*test*/true); - -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 1 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 1 -test( arg, arg2 ); -test( arg, arg2 ); -test( arg, arg2 ); -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 0 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 0 - -this.init = function(data) { - a.b('').a( - function(itemid, target) { - b( - itemid, - target, - { - reviewData: _reviewData, - pageid: itemid - }, - '', - function() { - var _showAspectItems = function(itemid) { - a.a(a.c(''), ''); - a.b(a.c('-' + itemid), ''); - }; - a.foo( - function(itemid, target) { - _foo(itemid); - } - ); - } - ); - } - ); -}; - -a.prototype = { - - a: function() - { - this.addItem( - { - /** - * @return void - */ - a: function() - { - - }, - /** - * @return void - */ - a: function() - { - - }, - } - ); - } -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.php deleted file mode 100644 index ae34072..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.php +++ /dev/null @@ -1,148 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionCallSignatureUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='FunctionCallSignatureUnitTest.inc') - { - if ($testFile === 'FunctionCallSignatureUnitTest.js') { - return [ - 5 => 1, - 6 => 2, - 7 => 1, - 8 => 1, - 9 => 2, - 10 => 3, - 17 => 1, - 18 => 1, - 21 => 1, - 24 => 1, - 28 => 2, - 30 => 2, - 35 => 1, - 49 => 1, - 51 => 1, - 54 => 1, - 70 => 1, - 71 => 1, - ]; - }//end if - - return [ - 5 => 1, - 6 => 2, - 7 => 1, - 8 => 1, - 9 => 2, - 10 => 3, - 17 => 1, - 18 => 1, - 31 => 1, - 34 => 1, - 43 => 2, - 57 => 1, - 59 => 1, - 63 => 1, - 64 => 1, - 82 => 1, - 93 => 1, - 100 => 1, - 106 => 2, - 119 => 1, - 120 => 1, - 129 => 1, - 137 => 1, - 142 => 2, - 171 => 1, - 180 => 1, - 181 => 1, - 194 => 1, - 213 => 2, - 215 => 2, - 217 => 2, - 218 => 2, - 277 => 1, - 278 => 1, - 303 => 1, - 308 => 1, - 321 => 1, - 322 => 1, - 329 => 1, - 330 => 1, - 337 => 1, - 342 => 1, - 343 => 1, - 345 => 1, - 346 => 2, - 353 => 1, - 354 => 1, - 355 => 2, - 377 => 1, - 378 => 1, - 379 => 1, - 380 => 1, - 385 => 1, - 386 => 1, - 387 => 1, - 388 => 1, - 393 => 1, - 394 => 1, - 395 => 1, - 396 => 1, - 411 => 1, - 422 => 1, - 424 => 1, - 429 => 1, - 432 => 1, - 440 => 1, - 441 => 1, - 442 => 1, - 464 => 1, - 510 => 1, - 513 => 1, - 514 => 1, - 523 => 1, - 524 => 3, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.inc deleted file mode 100644 index 7af7200..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.inc +++ /dev/null @@ -1,316 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='FunctionDeclarationUnitTest.inc') - { - if ($testFile === 'FunctionDeclarationUnitTest.inc') { - $errors = [ - 3 => 1, - 4 => 1, - 5 => 1, - 9 => 1, - 10 => 1, - 11 => 1, - 14 => 1, - 17 => 1, - 44 => 1, - 52 => 1, - 61 => 2, - 98 => 1, - 110 => 2, - 120 => 3, - 121 => 1, - 140 => 1, - 145 => 1, - 161 => 2, - 162 => 2, - 164 => 2, - 167 => 2, - 171 => 1, - 173 => 1, - 201 => 1, - 206 => 1, - 208 => 1, - 216 => 1, - 223 => 1, - 230 => 1, - 237 => 1, - 243 => 1, - 247 => 1, - 251 => 2, - 253 => 2, - 257 => 2, - 259 => 1, - 263 => 1, - 265 => 1, - 269 => 1, - 273 => 1, - 277 => 1, - 278 => 1, - 283 => 1, - 287 => 2, - 289 => 2, - 293 => 2, - 295 => 1, - 299 => 1, - 301 => 1, - 305 => 1, - 309 => 1, - 313 => 1, - 314 => 1, - ]; - } else { - $errors = [ - 3 => 1, - 4 => 1, - 5 => 1, - 9 => 1, - 10 => 1, - 11 => 1, - 14 => 1, - 17 => 1, - 41 => 1, - 48 => 1, - ]; - }//end if - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.inc deleted file mode 100644 index c923373..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.inc +++ /dev/null @@ -1,104 +0,0 @@ - $a[] = $b; - -// Intentional syntax error. Must be last thing in the file. -function diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.php deleted file mode 100644 index 73489a3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ValidDefaultValueUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 29 => 1, - 34 => 1, - 39 => 1, - 71 => 1, - 76 => 1, - 81 => 1, - 91 => 1, - 99 => 1, - 101 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidClassNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidClassNameUnitTest.inc deleted file mode 100644 index c6d15df..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidClassNameUnitTest.inc +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ValidClassNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 7 => 2, - 9 => 1, - 19 => 1, - 24 => 1, - 26 => 2, - 28 => 1, - 38 => 1, - 40 => 2, - 42 => 2, - 44 => 1, - 46 => 1, - 50 => 1, - 52 => 2, - 54 => 1, - 64 => 1, - 66 => 2, - 68 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidFunctionNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidFunctionNameUnitTest.inc deleted file mode 100644 index 78280cd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidFunctionNameUnitTest.inc +++ /dev/null @@ -1,222 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ValidFunctionNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 11 => 1, - 12 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - 16 => 1, - 17 => 2, - 18 => 2, - 19 => 2, - 20 => 2, - 24 => 1, - 25 => 1, - 26 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - 30 => 2, - 31 => 2, - 32 => 2, - 33 => 2, - 35 => 1, - 36 => 1, - 37 => 2, - 38 => 2, - 39 => 2, - 40 => 2, - 43 => 1, - 44 => 1, - 45 => 1, - 46 => 1, - 50 => 1, - 51 => 1, - 52 => 1, - 53 => 1, - 56 => 1, - 57 => 1, - 58 => 1, - 59 => 1, - 67 => 1, - 68 => 1, - 69 => 1, - 70 => 1, - 71 => 1, - 72 => 1, - 73 => 2, - 74 => 2, - 75 => 2, - 76 => 2, - 80 => 1, - 81 => 1, - 82 => 1, - 83 => 1, - 86 => 1, - 87 => 1, - 88 => 1, - 89 => 1, - 95 => 1, - 96 => 1, - 97 => 1, - 98 => 1, - 99 => 1, - 100 => 1, - 101 => 2, - 102 => 2, - 103 => 2, - 104 => 2, - 123 => 1, - 125 => 1, - 126 => 2, - 129 => 1, - 130 => 1, - 131 => 1, - 132 => 1, - 133 => 1, - 134 => 1, - 135 => 1, - 136 => 1, - 137 => 1, - 138 => 1, - 139 => 1, - 140 => 3, - 141 => 1, - 143 => 1, - 144 => 1, - 145 => 3, - 147 => 2, - 148 => 1, - 149 => 1, - 181 => 1, - 201 => 1, - 203 => 1, - 204 => 2, - 207 => 2, - 212 => 1, - 213 => 1, - 214 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.inc deleted file mode 100644 index 3c03da3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.inc +++ /dev/null @@ -1,101 +0,0 @@ -def["POP_{$cc}_A"]}' - and POP_{$cc}_B = -'{$this->def["POP_{$cc}_B"]}')"; - } -} - -class mpgResponse{ - var $term_id; - var $currentTag; - function characterHandler($parser,$data){ - switch($this->currentTag) - { - case "term_id": { - $this->term_id=$data; - break; - } - } - }//end characterHandler -}//end class mpgResponse - -class foo -{ - const bar = <<setLogger( - new class { - private $varName = 'hello'; - private $_varName = 'hello'; -}); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.php deleted file mode 100644 index 834852c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ValidVariableNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 12 => 1, - 17 => 1, - 22 => 1, - 92 => 1, - 93 => 1, - 94 => 1, - 99 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc deleted file mode 100644 index 70fd3d8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc +++ /dev/null @@ -1,112 +0,0 @@ -someFunction("some", "parameter") -->someOtherFunc(23, 42)-> - someOtherFunc2($one, $two) - - ->someOtherFunc3(23, 42) - ->andAThirdFunction(); - - $someObject->someFunction("some", "parameter") - ->someOtherFunc(23, 42); - -$someObject->someFunction("some", "parameter")->someOtherFunc(23, 42); - -$someObject->someFunction("some", "parameter") - ->someOtherFunc(23, 42); - -func( - $bar->foo() -) - ->bar(); - -func( - $bar->foo() -) - ->bar( - $bar->foo() - ->bar() - ->func() - ); - -$object - ->setBar($foo) - ->setFoo($bar); - -if ($bar) { - $object - ->setBar($foo) - ->setFoo($bar); -} - -$response -> CompletedTrackDetails -> TrackDetails -> Events; -$response - -> CompletedTrackDetails - -> TrackDetails - -> Events; - -$response - -> CompletedTrackDetails --> TrackDetails - -> Events; - -$var = get_object( - $foo->something() - ->query() -)->two() - ->three(); - -$foo->one( - $foo - ->two() -); - -get_object()->one() - ->two() - ->three(); - -someclass::one() - ->two() - ->three(); - -(new someclass())->one() - ->two() - ->three(); - -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel true - -$someObject - ->startSomething() - ->someOtherFunc(23, 42) -->endSomething() -->doSomething(23, 42) -->endEverything(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() -->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel false diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc.fixed deleted file mode 100644 index dfa642f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc.fixed +++ /dev/null @@ -1,112 +0,0 @@ -someFunction("some", "parameter") - ->someOtherFunc(23, 42) - ->someOtherFunc2($one, $two) - - ->someOtherFunc3(23, 42) - ->andAThirdFunction(); - - $someObject->someFunction("some", "parameter") - ->someOtherFunc(23, 42); - -$someObject->someFunction("some", "parameter")->someOtherFunc(23, 42); - -$someObject->someFunction("some", "parameter") - ->someOtherFunc(23, 42); - -func( - $bar->foo() -) - ->bar(); - -func( - $bar->foo() -) - ->bar( - $bar->foo() - ->bar() - ->func() - ); - -$object - ->setBar($foo) - ->setFoo($bar); - -if ($bar) { - $object - ->setBar($foo) - ->setFoo($bar); -} - -$response -> CompletedTrackDetails -> TrackDetails -> Events; -$response - -> CompletedTrackDetails - -> TrackDetails - -> Events; - -$response - -> CompletedTrackDetails - -> TrackDetails - -> Events; - -$var = get_object( - $foo->something() - ->query() -)->two() - ->three(); - -$foo->one( - $foo - ->two() -); - -get_object()->one() - ->two() - ->three(); - -someclass::one() - ->two() - ->three(); - -(new someclass())->one() - ->two() - ->three(); - -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel true - -$someObject - ->startSomething() - ->someOtherFunc(23, 42) - ->endSomething() - ->doSomething(23, 42) - ->endEverything(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel false diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.php deleted file mode 100644 index 0ae7b72..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ObjectOperatorIndentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 2, - 6 => 1, - 15 => 1, - 27 => 1, - 37 => 1, - 38 => 1, - 48 => 1, - 49 => 1, - 50 => 1, - 65 => 1, - 69 => 1, - 73 => 1, - 79 => 1, - 80 => 1, - 81 => 1, - 82 => 1, - 95 => 1, - 103 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc deleted file mode 100644 index ce211da..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc +++ /dev/null @@ -1,146 +0,0 @@ -{$property} =& new $class_name($this->db_index); - $this->modules[$module] =& $this->{$property}; -} - -foreach ($elements as $element) { - if ($something) { - // Do IF. - } else if ($somethingElse) { - // Do ELSE. - } -} - -switch ($foo) { -case 1: - switch ($bar) { - default: - if ($something) { - echo $string{1}; - } else if ($else) { - switch ($else) { - case 1: - // Do something. - break; - default: - // Do something. - break; - } - } - } -break; -case 2: - // Do something; - break; -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - default: - return 'Unknown'; -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - return 'Processing.'; - default: - return 'Unknown'; -} - -switch($i) { -case 1: {} -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - exit; - default: - exit; -} - -if ($foo): - if ($bar): - $foo = 1; - elseif ($baz): - $foo = 2; - endif; -endif; - -if ($foo): -elseif ($baz): $foo = 2; -endif; - -?> -
      - -
    • - -
    -
      - -
    • - -
    -
      - -
    • - -
    - -getSummaryCount(); ?> -
    class="empty"> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc.fixed deleted file mode 100644 index 05c8e8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc.fixed +++ /dev/null @@ -1,150 +0,0 @@ -{$property} =& new $class_name($this->db_index); - $this->modules[$module] =& $this->{$property}; -} - -foreach ($elements as $element) { - if ($something) { - // Do IF. - } else if ($somethingElse) { - // Do ELSE. - } -} - -switch ($foo) { -case 1: - switch ($bar) { - default: - if ($something) { - echo $string{1}; - } else if ($else) { - switch ($else) { - case 1: - // Do something. - break; - default: - // Do something. - break; - } - } - } - break; -case 2: - // Do something; - break; -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - default: - return 'Unknown'; -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - return 'Processing.'; - default: - return 'Unknown'; -} - -switch($i) { -case 1: { - } -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - exit; - default: - exit; -} - -if ($foo): - if ($bar): - $foo = 1; - elseif ($baz): - $foo = 2; - endif; -endif; - -if ($foo): -elseif ($baz): $foo = 2; -endif; - -?> -
      - -
    • - -
    -
      - -
    • - -
    -
      - -
    • - -
    - -getSummaryCount(); ?> -
    class="empty"> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.php deleted file mode 100644 index 9de3a69..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ScopeClosingBraceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 11 => 1, - 13 => 1, - 24 => 1, - 30 => 1, - 61 => 1, - 65 => 1, - 85 => 1, - 89 => 1, - 98 => 1, - 122 => 1, - 127 => 1, - 135 => 1, - 141 => 1, - 146 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeIndentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeIndentUnitTest.inc deleted file mode 100644 index b122a14..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeIndentUnitTest.inc +++ /dev/null @@ -1,314 +0,0 @@ -hello(); // error here - } - - function hello() // error here - { // no error here as brackets can be put anywhere in the pear standard - echo 'hello'; - } - - function hello2() - { - if (TRUE) { // error here - echo 'hello'; // no error here as its more than 4 spaces. - } else { - echo 'bye'; // error here - } - - while (TRUE) { - echo 'hello'; // error here - } - - do { // error here - echo 'hello'; // error here - } while (TRUE); - } - - function hello3() - { - switch ($hello) { - case 'hello': - break; - } - } - -} - -?> -
    -
    -
    -validate()) {
    -    $safe = $form->getSubmitValues();
    -}
    -?>
    -
    -open(); // error here - } - - public function open() - { - // Some inline stuff that shouldn't error - if (TRUE) echo 'hello'; - foreach ($tokens as $token) echo $token; - } - - /** - * This is a comment 1. - * This is a comment 2. - * This is a comment 3. - * This is a comment 4. - */ - public function close() - { - // All ok. - if (TRUE) { - if (TRUE) { - } else if (FALSE) { - foreach ($tokens as $token) { - switch ($token) { - case '1': - case '2': - if (true) { - if (false) { - if (false) { - if (false) { - echo 'hello'; - } - } - } - } - break; - case '5': - break; - } - do { - while (true) { - foreach ($tokens as $token) { - for ($i = 0; $i < $token; $i++) { - echo 'hello'; - } - } - } - } while (true); - } - } - } - } - - /* - This is another c style comment 1. - This is another c style comment 2. - This is another c style comment 3. - This is another c style comment 4. - This is another c style comment 5. - */ - - /* - * - * - * - */ - - /** - */ - - /* - This comment has a newline in it. - - */ - - public function read() - { - echo 'hello'; - - // no errors below. - $array = array( - 'this', - 'that' => array( - 'hello', - 'hello again' => array( - 'hello', - ), - ), - ); - } -} - -abstract class Test3 -{ - public function parse() - { - - foreach ($t as $ndx => $token) { - if (is_array($token)) { - echo 'here'; - } else { - $ts[] = array("token" => $token, "value" => ''); - - $last = count($ts) - 1; - - switch ($token) { - case '(': - - if ($last >= 3 && - $ts[0]['token'] != T_CLASS && - $ts[$last - 2]['token'] == T_OBJECT_OPERATOR && - $ts[$last - 3]['token'] == T_VARIABLE ) { - - - if (true) { - echo 'hello'; - } - } - array_push($braces, $token); - break; - } - } - } - } -} - -function test() -{ - $o = << - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ScopeIndentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 10 => 1, - 17 => 1, - 20 => 1, - 24 => 1, - 25 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - 30 => 1, - 58 => 1, - 123 => 1, - 224 => 1, - 225 => 1, - 279 => 1, - 284 => 1, - 311 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/ruleset.xml deleted file mode 100644 index 1bf94ca..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/ruleset.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - The PEAR coding standard. - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Classes/ClassDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Classes/ClassDeclarationStandard.xml deleted file mode 100644 index eaae99b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Classes/ClassDeclarationStandard.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - class Bar { -} - ]]> - - - class Bar { -} - -class Baz { -} - ]]> - - - - - namespace Foo; - -class Bar { -} - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Files/SideEffectsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Files/SideEffectsStandard.xml deleted file mode 100644 index 0ed04a0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Files/SideEffectsStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - echo "Class Foo loaded." - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Methods/CamelCapsMethodNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Methods/CamelCapsMethodNameStandard.xml deleted file mode 100644 index 8db899d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Methods/CamelCapsMethodNameStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - doBar() - { - } -} - ]]> - - - do_bar() - { - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php deleted file mode 100644 index ac6407d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php +++ /dev/null @@ -1,74 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClassDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param integer $stackPtr The position of the current token in - * the token stack. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $errorData = [strtolower($tokens[$stackPtr]['content'])]; - - $nextClass = $phpcsFile->findNext([T_CLASS, T_INTERFACE, T_TRAIT], ($tokens[$stackPtr]['scope_closer'] + 1)); - if ($nextClass !== false) { - $error = 'Each %s must be in a file by itself'; - $phpcsFile->addError($error, $nextClass, 'MultipleClasses', $errorData); - $phpcsFile->recordMetric($stackPtr, 'One class per file', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'One class per file', 'yes'); - } - - $namespace = $phpcsFile->findNext([T_NAMESPACE, T_CLASS, T_INTERFACE, T_TRAIT], 0); - if ($tokens[$namespace]['code'] !== T_NAMESPACE) { - $error = 'Each %s must be in a namespace of at least one level (a top-level vendor name)'; - $phpcsFile->addError($error, $stackPtr, 'MissingNamespace', $errorData); - $phpcsFile->recordMetric($stackPtr, 'Class defined in namespace', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Class defined in namespace', 'yes'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php deleted file mode 100644 index 12508fa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php +++ /dev/null @@ -1,287 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SideEffectsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the token stack. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $result = $this->searchForConflict($phpcsFile, 0, ($phpcsFile->numTokens - 1), $tokens); - - if ($result['symbol'] !== null && $result['effect'] !== null) { - $error = 'A file should declare new symbols (classes, functions, constants, etc.) and cause no other side effects, or it should execute logic with side effects, but should not do both. The first symbol is defined on line %s and the first side effect is on line %s.'; - $data = [ - $tokens[$result['symbol']]['line'], - $tokens[$result['effect']]['line'], - ]; - $phpcsFile->addWarning($error, 0, 'FoundWithSymbols', $data); - $phpcsFile->recordMetric($stackPtr, 'Declarations and side effects mixed', 'yes'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Declarations and side effects mixed', 'no'); - } - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - - /** - * Searches for symbol declarations and side effects. - * - * Returns the positions of both the first symbol declared and the first - * side effect in the file. A NULL value for either indicates nothing was - * found. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The token to start searching from. - * @param int $end The token to search to. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return array - */ - private function searchForConflict($phpcsFile, $start, $end, $tokens) - { - $symbols = [ - T_CLASS => T_CLASS, - T_INTERFACE => T_INTERFACE, - T_TRAIT => T_TRAIT, - T_FUNCTION => T_FUNCTION, - ]; - - $conditions = [ - T_IF => T_IF, - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - ]; - - $checkAnnotations = $phpcsFile->config->annotations; - - $firstSymbol = null; - $firstEffect = null; - for ($i = $start; $i <= $end; $i++) { - // Respect phpcs:disable comments. - if ($checkAnnotations === true - && $tokens[$i]['code'] === T_PHPCS_DISABLE - && (empty($tokens[$i]['sniffCodes']) === true - || isset($tokens[$i]['sniffCodes']['PSR1']) === true - || isset($tokens[$i]['sniffCodes']['PSR1.Files']) === true - || isset($tokens[$i]['sniffCodes']['PSR1.Files.SideEffects']) === true) - ) { - do { - $i = $phpcsFile->findNext(T_PHPCS_ENABLE, ($i + 1)); - } while ($i !== false - && empty($tokens[$i]['sniffCodes']) === false - && isset($tokens[$i]['sniffCodes']['PSR1']) === false - && isset($tokens[$i]['sniffCodes']['PSR1.Files']) === false - && isset($tokens[$i]['sniffCodes']['PSR1.Files.SideEffects']) === false); - - if ($i === false) { - // The entire rest of the file is disabled, - // so return what we have so far. - break; - } - - continue; - } - - // Ignore whitespace and comments. - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - // Ignore PHP tags. - if ($tokens[$i]['code'] === T_OPEN_TAG - || $tokens[$i]['code'] === T_CLOSE_TAG - ) { - continue; - } - - // Ignore shebang. - if (substr($tokens[$i]['content'], 0, 2) === '#!') { - continue; - } - - // Ignore logical operators. - if (isset(Tokens::$booleanOperators[$tokens[$i]['code']]) === true) { - continue; - } - - // Ignore entire namespace, declare, const and use statements. - if ($tokens[$i]['code'] === T_NAMESPACE - || $tokens[$i]['code'] === T_USE - || $tokens[$i]['code'] === T_DECLARE - || $tokens[$i]['code'] === T_CONST - ) { - if (isset($tokens[$i]['scope_opener']) === true) { - $i = $tokens[$i]['scope_closer']; - if ($tokens[$i]['code'] === T_ENDDECLARE) { - $semicolon = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - if ($semicolon !== false && $tokens[$semicolon]['code'] === T_SEMICOLON) { - $i = $semicolon; - } - } - } else { - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($i + 1)); - if ($semicolon !== false) { - $i = $semicolon; - } - } - - continue; - } - - // Ignore function/class prefixes. - if (isset(Tokens::$methodPrefixes[$tokens[$i]['code']]) === true) { - continue; - } - - // Ignore anon classes. - if ($tokens[$i]['code'] === T_ANON_CLASS) { - $i = $tokens[$i]['scope_closer']; - continue; - } - - // Detect and skip over symbols. - if (isset($symbols[$tokens[$i]['code']]) === true - && isset($tokens[$i]['scope_closer']) === true - ) { - if ($firstSymbol === null) { - $firstSymbol = $i; - } - - $i = $tokens[$i]['scope_closer']; - continue; - } else if ($tokens[$i]['code'] === T_STRING - && strtolower($tokens[$i]['content']) === 'define' - ) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), null, true); - if ($tokens[$prev]['code'] !== T_OBJECT_OPERATOR - && $tokens[$prev]['code'] !== T_DOUBLE_COLON - && $tokens[$prev]['code'] !== T_FUNCTION - ) { - if ($firstSymbol === null) { - $firstSymbol = $i; - } - - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($i + 1)); - if ($semicolon !== false) { - $i = $semicolon; - } - - continue; - } - }//end if - - // Special case for defined() as it can be used to see - // if a constant (a symbol) should be defined or not and - // doesn't need to use a full conditional block. - if ($tokens[$i]['code'] === T_STRING - && strtolower($tokens[$i]['content']) === 'defined' - ) { - $openBracket = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - if ($tokens[$openBracket]['code'] === T_OPEN_PARENTHESIS - && isset($tokens[$openBracket]['parenthesis_closer']) === true - ) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), null, true); - if ($tokens[$prev]['code'] !== T_OBJECT_OPERATOR - && $tokens[$prev]['code'] !== T_DOUBLE_COLON - && $tokens[$prev]['code'] !== T_FUNCTION - ) { - $i = $tokens[$openBracket]['parenthesis_closer']; - continue; - } - } - }//end if - - // Conditional statements are allowed in symbol files as long as the - // contents is only a symbol definition. So don't count these as effects - // in this case. - if (isset($conditions[$tokens[$i]['code']]) === true) { - if (isset($tokens[$i]['scope_opener']) === false) { - // Probably an "else if", so just ignore. - continue; - } - - $result = $this->searchForConflict( - $phpcsFile, - ($tokens[$i]['scope_opener'] + 1), - ($tokens[$i]['scope_closer'] - 1), - $tokens - ); - - if ($result['symbol'] !== null) { - if ($firstSymbol === null) { - $firstSymbol = $result['symbol']; - } - - if ($result['effect'] !== null) { - // Found a conflict. - $firstEffect = $result['effect']; - break; - } - } - - if ($firstEffect === null) { - $firstEffect = $result['effect']; - } - - $i = $tokens[$i]['scope_closer']; - continue; - }//end if - - if ($firstEffect === null) { - $firstEffect = $i; - } - - if ($firstSymbol !== null) { - // We have a conflict we have to report, so no point continuing. - break; - } - }//end for - - return [ - 'symbol' => $firstSymbol, - 'effect' => $firstEffect, - ]; - - }//end searchForConflict() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php deleted file mode 100644 index 2d13814..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Sniffs\Methods; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions\CamelCapsFunctionNameSniff as GenericCamelCapsFunctionNameSniff; -use PHP_CodeSniffer\Util\Common; - -class CamelCapsMethodNameSniff extends GenericCamelCapsFunctionNameSniff -{ - - - /** - * Processes the tokens within the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * @param int $currScope The position of the current scope. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Ignore closures. - return; - } - - // Ignore magic methods. - if (preg_match('|^__[^_]|', $methodName) !== 0) { - $magicPart = strtolower(substr($methodName, 2)); - if (isset($this->magicMethods[$magicPart]) === true - || isset($this->methodsDoubleUnderscore[$magicPart]) === true - ) { - return; - } - } - - $testName = ltrim($methodName, '_'); - if ($testName !== '' && Common::isCamelCaps($testName, false, true, false) === false) { - $error = 'Method name "%s" is not in camel caps format'; - $className = $phpcsFile->getDeclarationName($currScope); - if (isset($className) === false) { - $className = '[Anonymous Class]'; - } - - $errorData = [$className.'::'.$methodName]; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $errorData); - $phpcsFile->recordMetric($stackPtr, 'CamelCase method name', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'CamelCase method name', 'yes'); - } - - }//end processTokenWithinScope() - - - /** - * Processes the tokens outside the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.1.inc deleted file mode 100644 index 58cb85e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.1.inc +++ /dev/null @@ -1,3 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClassDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - if ($testFile === 'ClassDeclarationUnitTest.2.inc') { - return []; - } - - return [ - 2 => 1, - 3 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.1.inc deleted file mode 100644 index fdfd9b0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.1.inc +++ /dev/null @@ -1,72 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.10.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.10.inc deleted file mode 100644 index 63f256d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.10.inc +++ /dev/null @@ -1,8 +0,0 @@ -define(); -echo $object -> define(); -Foo::define(); - -$c = new class extends Something{ - - public function someMethod() - { - // ... - } - -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.3.inc deleted file mode 100644 index d4ae77e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.3.inc +++ /dev/null @@ -1,6 +0,0 @@ - -'; -} - -printHead(); -?> - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.5.inc deleted file mode 100644 index 7265c63..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.5.inc +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.6.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.6.inc deleted file mode 100644 index e02fed4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.6.inc +++ /dev/null @@ -1,9 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class SideEffectsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Set CLI values before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - if ($testFile === 'SideEffectsUnitTest.12.inc') { - $config->annotations = false; - } - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'SideEffectsUnitTest.3.inc': - case 'SideEffectsUnitTest.4.inc': - case 'SideEffectsUnitTest.5.inc': - case 'SideEffectsUnitTest.10.inc': - case 'SideEffectsUnitTest.12.inc': - return [1 => 1]; - default: - return []; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Methods/CamelCapsMethodNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Methods/CamelCapsMethodNameUnitTest.inc deleted file mode 100644 index 7381517..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Methods/CamelCapsMethodNameUnitTest.inc +++ /dev/null @@ -1,81 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Tests\Methods; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class CamelCapsMethodNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 6 => 1, - 7 => 1, - 11 => 1, - 12 => 1, - 13 => 1, - 17 => 1, - 21 => 1, - 25 => 1, - 26 => 1, - 77 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/ruleset.xml deleted file mode 100644 index 65cbe20..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/ruleset.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - The PSR1 coding standard. - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClassInstantiationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClassInstantiationStandard.xml deleted file mode 100644 index ae24611..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClassInstantiationStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/NullableTypeDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/NullableTypeDeclarationStandard.xml deleted file mode 100644 index 2032c9a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/NullableTypeDeclarationStandard.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Keywords/ShortFormTypeKeywordsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Keywords/ShortFormTypeKeywordsStandard.xml deleted file mode 100644 index 9bb5a8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Keywords/ShortFormTypeKeywordsStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - (boolean) $isValid; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Namespaces/CompoundNamespaceDepthStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Namespaces/CompoundNamespaceDepthStandard.xml deleted file mode 100644 index b74e8b4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Namespaces/CompoundNamespaceDepthStandard.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - SubnamespaceOne\AnotherNamespace\ClassA, - SubnamespaceOne\ClassB, - ClassZ, -}; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Operators/OperatorSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Operators/OperatorSpacingStandard.xml deleted file mode 100644 index 981b1d9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Operators/OperatorSpacingStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - $b) { - $variable = $foo ? 'foo' : 'bar'; -} - ]]> - - - $b) { - $variable=$foo?'foo':'bar'; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/AnonClassDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/AnonClassDeclarationSniff.php deleted file mode 100644 index 7a33bd9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/AnonClassDeclarationSniff.php +++ /dev/null @@ -1,242 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\Generic\Sniffs\Functions\FunctionCallArgumentSpacingSniff; -use PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\ClassDeclarationSniff; -use PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\MultiLineFunctionDeclarationSniff; -use PHP_CodeSniffer\Util\Tokens; - -class AnonClassDeclarationSniff extends ClassDeclarationSniff -{ - - /** - * The PSR2 MultiLineFunctionDeclarations sniff. - * - * @var MultiLineFunctionDeclarationSniff - */ - private $multiLineSniff = null; - - /** - * The Generic FunctionCallArgumentSpacing sniff. - * - * @var FunctionCallArgumentSpacingSniff - */ - private $functionCallSniff = null; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_ANON_CLASS]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - $this->multiLineSniff = new MultiLineFunctionDeclarationSniff(); - $this->functionCallSniff = new FunctionCallArgumentSpacingSniff(); - - $this->processOpen($phpcsFile, $stackPtr); - $this->processClose($phpcsFile, $stackPtr); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === true) { - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - if ($this->multiLineSniff->isMultiLineDeclaration($phpcsFile, $stackPtr, $openBracket, $tokens) === true) { - $this->processMultiLineArgumentList($phpcsFile, $stackPtr); - } else { - $this->processSingleLineArgumentList($phpcsFile, $stackPtr); - } - - $this->functionCallSniff->checkSpacing($phpcsFile, $stackPtr, $openBracket); - } - - $opener = $tokens[$stackPtr]['scope_opener']; - if ($tokens[$opener]['line'] === $tokens[$stackPtr]['line']) { - return; - } - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($opener - 1), $stackPtr, true); - - $implements = $phpcsFile->findPrevious(T_IMPLEMENTS, ($opener - 1), $stackPtr); - if ($implements !== false - && $tokens[$opener]['line'] !== $tokens[$implements]['line'] - && $tokens[$opener]['line'] === $tokens[$prev]['line'] - ) { - // Opening brace must be on a new line as implements list wraps. - $error = 'Opening brace must be on the line after the last implemented interface'; - $fix = $phpcsFile->addFixableError($error, $opener, 'OpenBraceSameLine'); - if ($fix === true) { - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - $indent = str_repeat(' ', ($tokens[$first]['column'] - 1)); - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($prev + 1), ''); - $phpcsFile->fixer->addNewline($prev); - $phpcsFile->fixer->addContentBefore($opener, $indent); - $phpcsFile->fixer->endChangeset(); - } - } - - if ($tokens[$opener]['line'] > ($tokens[$prev]['line'] + 1)) { - // Opening brace is on a new line, so there must be no blank line before it. - $error = 'Opening brace must not be preceded by a blank line'; - $fix = $phpcsFile->addFixableError($error, $opener, 'OpenBraceLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($prev + 1); $x < $opener; $x++) { - if ($tokens[$x]['line'] === $tokens[$prev]['line']) { - // Maintain existing newline. - continue; - } - - if ($tokens[$x]['line'] === $tokens[$opener]['line']) { - // Maintain existing indent. - break; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - }//end process() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processSingleLineArgumentList(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - if ($openBracket === ($closeBracket - 1)) { - return; - } - - if ($tokens[($openBracket + 1)]['code'] === T_WHITESPACE) { - $error = 'Space after opening parenthesis of single-line argument list prohibited'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterOpenBracket'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($openBracket + 1), ''); - } - } - - $spaceBeforeClose = 0; - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBracket - 1), $openBracket, true); - if ($tokens[$prev]['code'] === T_END_HEREDOC || $tokens[$prev]['code'] === T_END_NOWDOC) { - // Need a newline after these tokens, so ignore this rule. - return; - } - - if ($tokens[$prev]['line'] !== $tokens[$closeBracket]['line']) { - $spaceBeforeClose = 'newline'; - } else if ($tokens[($closeBracket - 1)]['code'] === T_WHITESPACE) { - $spaceBeforeClose = $tokens[($closeBracket - 1)]['length']; - } - - if ($spaceBeforeClose !== 0) { - $error = 'Space before closing parenthesis of single-line argument list prohibited'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeCloseBracket'); - if ($fix === true) { - if ($spaceBeforeClose === 'newline') { - $phpcsFile->fixer->beginChangeset(); - - $closingContent = ')'; - - $next = $phpcsFile->findNext(T_WHITESPACE, ($closeBracket + 1), null, true); - if ($tokens[$next]['code'] === T_SEMICOLON) { - $closingContent .= ';'; - for ($i = ($closeBracket + 1); $i <= $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - - // We want to jump over any whitespace or inline comment and - // move the closing parenthesis after any other token. - $prev = ($closeBracket - 1); - while (isset(Tokens::$emptyTokens[$tokens[$prev]['code']]) === true) { - if (($tokens[$prev]['code'] === T_COMMENT) - && (strpos($tokens[$prev]['content'], '*/') !== false) - ) { - break; - } - - $prev--; - } - - $phpcsFile->fixer->addContent($prev, $closingContent); - - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBracket - 1), null, true); - for ($i = ($prevNonWhitespace + 1); $i <= $closeBracket; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($closeBracket - 1), ''); - }//end if - }//end if - }//end if - - }//end processSingleLineArgumentList() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processMultiLineArgumentList(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - - $this->multiLineSniff->processBracket($phpcsFile, $openBracket, $tokens, 'argument'); - $this->multiLineSniff->processArgumentList($phpcsFile, $stackPtr, $this->indent, 'argument'); - - }//end processMultiLineArgumentList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClassInstantiationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClassInstantiationSniff.php deleted file mode 100644 index f474a26..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClassInstantiationSniff.php +++ /dev/null @@ -1,100 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassInstantiationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_NEW]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Find the class name. - $allowed = [ - T_STRING => T_STRING, - T_NS_SEPARATOR => T_NS_SEPARATOR, - T_SELF => T_SELF, - T_STATIC => T_STATIC, - T_VARIABLE => T_VARIABLE, - T_DOLLAR => T_DOLLAR, - T_OBJECT_OPERATOR => T_OBJECT_OPERATOR, - T_DOUBLE_COLON => T_DOUBLE_COLON, - ]; - - $allowed += Tokens::$emptyTokens; - - $classNameEnd = null; - for ($i = ($stackPtr + 1); $i < $phpcsFile->numTokens; $i++) { - if (isset($allowed[$tokens[$i]['code']]) === true) { - continue; - } - - if ($tokens[$i]['code'] === T_OPEN_SQUARE_BRACKET - || $tokens[$i]['code'] === T_OPEN_CURLY_BRACKET - ) { - $i = $tokens[$i]['bracket_closer']; - continue; - } - - $classNameEnd = $i; - break; - } - - if ($classNameEnd === null) { - return; - } - - if ($tokens[$classNameEnd]['code'] === T_ANON_CLASS) { - // Ignore anon classes. - return; - } - - if ($tokens[$classNameEnd]['code'] === T_OPEN_PARENTHESIS) { - // Using parenthesis. - return; - } - - $error = 'Parentheses must be used when instantiating a new class'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'MissingParentheses'); - if ($fix === true) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($classNameEnd - 1), null, true); - $phpcsFile->fixer->addContent($prev, '()'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClosingBraceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClosingBraceSniff.php deleted file mode 100644 index 0f9752b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClosingBraceSniff.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClosingBraceSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_FUNCTION, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $closer = $tokens[$stackPtr]['scope_closer']; - $next = $phpcsFile->findNext(T_WHITESPACE, ($closer + 1), null, true); - if ($next === false - || $tokens[$next]['line'] !== $tokens[$closer]['line'] - ) { - return; - } - - $error = 'Closing brace must not be followed by any comment or statement on the same line'; - $phpcsFile->addError($error, $closer, 'StatementAfter'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/BooleanOperatorPlacementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/BooleanOperatorPlacementSniff.php deleted file mode 100644 index ad663db..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/BooleanOperatorPlacementSniff.php +++ /dev/null @@ -1,199 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class BooleanOperatorPlacementSniff implements Sniff -{ - - /** - * Used to restrict the placement of the boolean operator. - * - * Allowed value are "first" or "last". - * - * @var string|null - */ - public $allowOnly = null; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_WHILE, - T_SWITCH, - T_ELSEIF, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - ) { - return; - } - - $parenOpener = $tokens[$stackPtr]['parenthesis_opener']; - $parenCloser = $tokens[$stackPtr]['parenthesis_closer']; - - if ($tokens[$parenOpener]['line'] === $tokens[$parenCloser]['line']) { - // Conditions are all on the same line. - return; - } - - $find = [ - T_BOOLEAN_AND, - T_BOOLEAN_OR, - ]; - - if ($this->allowOnly === 'first' || $this->allowOnly === 'last') { - $position = $this->allowOnly; - } else { - $position = null; - } - - $operator = $parenOpener; - $error = false; - $operators = []; - - do { - $operator = $phpcsFile->findNext($find, ($operator + 1), $parenCloser); - if ($operator === false) { - break; - } - - $operators[] = $operator; - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($operator - 1), $parenOpener, true); - if ($prev === false) { - // Parse error. - return; - } - - if ($tokens[$prev]['line'] < $tokens[$operator]['line']) { - // The boolean operator is the first content on the line. - if ($position === null) { - $position = 'first'; - } - - if ($position !== 'first') { - $error = true; - } - - continue; - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($operator + 1), $parenCloser, true); - if ($next === false) { - // Parse error. - return; - } - - if ($tokens[$next]['line'] > $tokens[$operator]['line']) { - // The boolean operator is the last content on the line. - if ($position === null) { - $position = 'last'; - } - - if ($position !== 'last') { - $error = true; - } - - continue; - } - } while ($operator !== false); - - if ($error === false) { - return; - } - - $error = 'Boolean operators between conditions must be at the beginning or end of the line, but not both'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'FoundMixed'); - if ($fix === false) { - return; - } - - $phpcsFile->fixer->beginChangeset(); - foreach ($operators as $operator) { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($operator - 1), $parenOpener, true); - $next = $phpcsFile->findNext(T_WHITESPACE, ($operator + 1), $parenCloser, true); - - if ($position === 'last') { - if ($tokens[$next]['line'] === $tokens[$operator]['line']) { - if ($tokens[$prev]['line'] === $tokens[$operator]['line']) { - // Move the content after the operator to the next line. - if ($tokens[($operator + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($operator + 1), ''); - } - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $operator, true); - $padding = str_repeat(' ', ($tokens[$first]['column'] - 1)); - $phpcsFile->fixer->addContent($operator, $phpcsFile->eolChar.$padding); - } else { - // Move the operator to the end of the previous line. - if ($tokens[($operator + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($operator + 1), ''); - } - - $phpcsFile->fixer->addContent($prev, ' '.$tokens[$operator]['content']); - $phpcsFile->fixer->replaceToken($operator, ''); - } - }//end if - } else { - if ($tokens[$prev]['line'] === $tokens[$operator]['line']) { - if ($tokens[$next]['line'] === $tokens[$operator]['line']) { - // Move the operator, and the rest of the expression, to the next line. - if ($tokens[($operator - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($operator - 1), ''); - } - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $operator, true); - $padding = str_repeat(' ', ($tokens[$first]['column'] - 1)); - $phpcsFile->fixer->addContentBefore($operator, $phpcsFile->eolChar.$padding); - } else { - // Move the operator to the start of the next line. - if ($tokens[($operator - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($operator - 1), ''); - } - - $phpcsFile->fixer->addContentBefore($next, $tokens[$operator]['content'].' '); - $phpcsFile->fixer->replaceToken($operator, ''); - } - }//end if - }//end if - }//end foreach - - $phpcsFile->fixer->endChangeset(); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/ControlStructureSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/ControlStructureSpacingSniff.php deleted file mode 100644 index fb19f56..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/ControlStructureSpacingSniff.php +++ /dev/null @@ -1,191 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures\ControlStructureSpacingSniff as PSR2Spacing; -use PHP_CodeSniffer\Util\Tokens; - -class ControlStructureSpacingSniff implements Sniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_WHILE, - T_FOREACH, - T_FOR, - T_SWITCH, - T_ELSE, - T_ELSEIF, - T_CATCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - ) { - return; - } - - $parenOpener = $tokens[$stackPtr]['parenthesis_opener']; - $parenCloser = $tokens[$stackPtr]['parenthesis_closer']; - - if ($tokens[$parenOpener]['line'] === $tokens[$parenCloser]['line']) { - // Conditions are all on the same line, so follow PSR2. - $sniff = new PSR2Spacing(); - return $sniff->process($phpcsFile, $stackPtr); - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($parenOpener + 1), $parenCloser, true); - if ($next === false) { - // No conditions; parse error. - return; - } - - // Check the first expression. - if ($tokens[$next]['line'] !== ($tokens[$parenOpener]['line'] + 1)) { - $error = 'The first expression of a multi-line control structure must be on the line after the opening parenthesis'; - $fix = $phpcsFile->addFixableError($error, $next, 'FirstExpressionLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($parenOpener); - } - } - - // Check the indent of each line. - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - $requiredIndent = ($tokens[$first]['column'] + $this->indent - 1); - for ($i = $parenOpener; $i < $parenCloser; $i++) { - if ($tokens[$i]['column'] !== 1 - || $tokens[($i + 1)]['line'] > $tokens[$i]['line'] - || isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true - ) { - continue; - } - - if (($i + 1) === $parenCloser) { - break; - } - - // Leave indentation inside multi-line strings. - if (isset(Tokens::$textStringTokens[$tokens[$i]['code']]) === true - || isset(Tokens::$heredocTokens[$tokens[$i]['code']]) === true - ) { - continue; - } - - if ($tokens[$i]['code'] !== T_WHITESPACE) { - $foundIndent = 0; - } else { - $foundIndent = $tokens[$i]['length']; - } - - if ($foundIndent < $requiredIndent) { - $error = 'Each line in a multi-line control structure must be indented at least once; expected at least %s spaces, but found %s'; - $data = [ - $requiredIndent, - $foundIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $i, 'LineIndent', $data); - if ($fix === true) { - $padding = str_repeat(' ', $requiredIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($i, $padding); - } else { - $phpcsFile->fixer->replaceToken($i, $padding); - } - } - } - }//end for - - // Check the closing parenthesis. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($parenCloser - 1), $parenOpener, true); - if ($tokens[$parenCloser]['line'] !== ($tokens[$prev]['line'] + 1)) { - $error = 'The closing parenthesis of a multi-line control structure must be on the line after the last expression'; - $fix = $phpcsFile->addFixableError($error, $parenCloser, 'CloseParenthesisLine'); - if ($fix === true) { - if ($tokens[$parenCloser]['line'] === $tokens[$prev]['line']) { - $phpcsFile->fixer->addNewlineBefore($parenCloser); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $parenCloser; $i++) { - // Maintain existing newline. - if ($tokens[$i]['line'] === $tokens[$prev]['line']) { - continue; - } - - // Maintain existing indent. - if ($tokens[$i]['line'] === $tokens[$parenCloser]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - if ($tokens[$parenCloser]['line'] !== $tokens[$prev]['line']) { - $requiredIndent = ($tokens[$first]['column'] - 1); - $foundIndent = ($tokens[$parenCloser]['column'] - 1); - if ($foundIndent !== $requiredIndent) { - $error = 'The closing parenthesis of a multi-line control structure must be indented to the same level as start of the control structure; expected %s spaces but found %s'; - $data = [ - $requiredIndent, - $foundIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $parenCloser, 'CloseParenthesisIndent', $data); - if ($fix === true) { - $padding = str_repeat(' ', $requiredIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($parenCloser, $padding); - } else { - $phpcsFile->fixer->replaceToken(($parenCloser - 1), $padding); - } - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/DeclareStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/DeclareStatementSniff.php deleted file mode 100644 index 67776c3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/DeclareStatementSniff.php +++ /dev/null @@ -1,256 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DeclareStatementSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DECLARE]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Allow a byte-order mark. - $tokens = $phpcsFile->getTokens(); - - // There should be no space between declare keyword and opening parenthesis. - $parenthesis = ($stackPtr + 1); - if ($tokens[($stackPtr + 1)]['type'] !== 'T_OPEN_PARENTHESIS') { - $parenthesis = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - $error = 'Expected no space between declare keyword and opening parenthesis in a declare statement'; - - if ($tokens[$parenthesis]['type'] === 'T_OPEN_PARENTHESIS') { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceFoundAfterDeclare'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - } else { - $phpcsFile->addError($error, $parenthesis, 'SpaceFoundAfterDeclare'); - $parenthesis = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($parenthesis + 1)); - } - } - - // There should be no space between open parenthesis and the directive. - $string = $phpcsFile->findNext(T_WHITESPACE, ($parenthesis + 1), null, true); - if ($parenthesis !== false) { - if ($tokens[($parenthesis + 1)]['type'] !== 'T_STRING') { - $error = 'Expected no space between opening parenthesis and directive in a declare statement'; - - if ($tokens[$string]['type'] === 'T_STRING') { - $fix = $phpcsFile->addFixableError($error, $parenthesis, 'SpaceFoundBeforeDirective'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($parenthesis + 1), ''); - } - } else { - $phpcsFile->addError($error, $string, 'SpaceFoundBeforeDirective'); - $string = $phpcsFile->findNext(T_STRING, ($string + 1)); - } - } - } - - // There should be no space between directive and the equal sign. - $equals = $phpcsFile->findNext(T_WHITESPACE, ($string + 1), null, true); - if ($string !== false) { - // The directive must be in lowercase. - if ($tokens[$string]['content'] !== strtolower($tokens[$string]['content'])) { - $error = 'The directive of a declare statement must be in lowercase'; - $fix = $phpcsFile->addFixableError($error, $string, 'DirectiveNotLowercase'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($string, strtolower($tokens[$string]['content'])); - } - } - - if ($tokens[($string + 1)]['type'] !== 'T_EQUAL') { - $error = 'Expected no space between directive and the equals sign in a declare statement'; - - if ($tokens[$equals]['type'] === 'T_EQUAL') { - $fix = $phpcsFile->addFixableError($error, $equals, 'SpaceFoundAfterDirective'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($string + 1), ''); - } - } else { - $phpcsFile->addError($error, $equals, 'SpaceFoundAfterDirective'); - $equals = $phpcsFile->findNext(T_EQUAL, ($equals + 1)); - } - } - }//end if - - // There should be no space between equal sign and directive value. - $value = $phpcsFile->findNext(T_WHITESPACE, ($equals + 1), null, true); - if ($equals !== false) { - if ($tokens[($equals + 1)]['type'] !== 'T_LNUMBER') { - $error = 'Expected no space between equal sign and the directive value in a declare statement'; - - if ($tokens[$value]['type'] === 'T_LNUMBER') { - $fix = $phpcsFile->addFixableError($error, $value, 'SpaceFoundBeforeDirectiveValue'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($equals + 1), ''); - } - } else { - $phpcsFile->addError($error, $value, 'SpaceFoundBeforeDirectiveValue'); - $value = $phpcsFile->findNext(T_LNUMBER, ($value + 1)); - } - } - } - - $parenthesis = $phpcsFile->findNext(T_WHITESPACE, ($value + 1), null, true); - if ($value !== false) { - if ($tokens[($value + 1)]['type'] !== 'T_CLOSE_PARENTHESIS') { - $error = 'Expected no space between the directive value and closing parenthesis in a declare statement'; - - if ($tokens[$parenthesis]['type'] === 'T_CLOSE_PARENTHESIS') { - $fix = $phpcsFile->addFixableError($error, $parenthesis, 'SpaceFoundAfterDirectiveValue'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($value + 1), ''); - } - } else { - $phpcsFile->addError($error, $parenthesis, 'SpaceFoundAfterDirectiveValue'); - $parenthesis = $phpcsFile->findNext(T_CLOSE_PARENTHESIS, ($parenthesis + 1)); - } - } - } - - // Check for semicolon. - $curlyBracket = false; - if ($tokens[($parenthesis + 1)]['type'] !== 'T_SEMICOLON') { - $token = $phpcsFile->findNext(T_WHITESPACE, ($parenthesis + 1), null, true); - - if ($tokens[$token]['type'] === 'T_OPEN_CURLY_BRACKET') { - // Block declaration. - $curlyBracket = $token; - } else if ($tokens[$token]['type'] === 'T_SEMICOLON') { - $error = 'Expected no space between the closing parenthesis and the semicolon in a declare statement'; - $fix = $phpcsFile->addFixableError($error, $parenthesis, 'SpaceFoundBeforeSemicolon'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($parenthesis + 1), ''); - } - } else if ($tokens[$token]['type'] === 'T_CLOSE_TAG') { - if ($tokens[($parenthesis)]['line'] !== $tokens[$token]['line']) { - // Close tag must be on the same line.. - $error = 'The close tag must be on the same line as the declare statement'; - $fix = $phpcsFile->addFixableError($error, $parenthesis, 'CloseTagOnNewLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($parenthesis + 1), ' '); - } - } - } else { - $error = 'Expected no space between the closing parenthesis and the semicolon in a declare statement'; - $phpcsFile->addError($error, $parenthesis, 'SpaceFoundBeforeSemicolon'); - - // See if there is a semicolon or curly bracket after this token. - $token = $phpcsFile->findNext([T_WHITESPACE, T_COMMENT], ($token + 1), null, true); - if ($tokens[$token]['type'] === 'T_OPEN_CURLY_BRACKET') { - $curlyBracket = $token; - } - }//end if - }//end if - - if ($curlyBracket !== false) { - $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($curlyBracket - 1), null, true); - $error = 'Expected one space between closing parenthesis and opening curly bracket in a declare statement'; - - // The opening curly bracket must on the same line with a single space between closing bracket. - if ($tokens[$prevToken]['type'] !== 'T_CLOSE_PARENTHESIS') { - $phpcsFile->addError($error, $curlyBracket, 'ExtraSpaceFoundAfterBracket'); - } else if ($phpcsFile->getTokensAsString(($prevToken + 1), ($curlyBracket - $prevToken - 1)) !== ' ') { - $fix = $phpcsFile->addFixableError($error, $curlyBracket, 'ExtraSpaceFoundAfterBracket'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($prevToken + 1), ' '); - $nextToken = ($prevToken + 2); - while ($nextToken !== $curlyBracket) { - $phpcsFile->fixer->replaceToken($nextToken, ''); - $nextToken++; - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - $closeCurlyBracket = $tokens[$curlyBracket]['bracket_closer']; - - $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($closeCurlyBracket - 1), null, true); - $nextToken = $phpcsFile->findNext([T_WHITESPACE, T_COMMENT], ($closeCurlyBracket + 1), null, true); - $line = $tokens[$closeCurlyBracket]['line']; - - // The closing curly bracket must be on a new line. - if ($tokens[$prevToken]['line'] === $line || $tokens[$nextToken]['line'] === $line) { - if ($tokens[$prevToken]['line'] === $line) { - $error = 'The closing curly bracket of a declare statement must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $prevToken, 'CurlyBracketNotOnNewLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($prevToken); - } - } - }//end if - - // Closing curly bracket must align with the declare keyword. - if ($tokens[$stackPtr]['column'] !== $tokens[$closeCurlyBracket]['column']) { - $error = 'The closing curly bracket of a declare statements must be aligned with the declare keyword'; - - $fix = $phpcsFile->addFixableError($error, $closeCurlyBracket, 'CloseBracketNotAligned'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($closeCurlyBracket - 1), str_repeat(' ', ($tokens[$stackPtr]['column'] - 1))); - } - } - - // The open curly bracket must be the last code on the line. - $token = $phpcsFile->findNext(Tokens::$emptyTokens, ($curlyBracket + 1), null, true); - if ($tokens[$curlyBracket]['line'] === $tokens[$token]['line']) { - $error = 'The open curly bracket of a declare statement must be the last code on the line'; - $fix = $phpcsFile->addFixableError($error, $token, 'CodeFoundAfterCurlyBracket'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($token - 1), null, true); - - for ($i = ($prevToken + 1); $i < $token; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewLineBefore($token); - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/FileHeaderSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/FileHeaderSniff.php deleted file mode 100644 index 430a01b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/FileHeaderSniff.php +++ /dev/null @@ -1,404 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FileHeaderSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current - * token in the stack. - * - * @return int|null - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $possibleHeaders = []; - - $searchFor = Tokens::$ooScopeTokens; - $searchFor[T_OPEN_TAG] = T_OPEN_TAG; - - $openTag = $stackPtr; - do { - $headerLines = $this->getHeaderLines($phpcsFile, $openTag); - if (empty($headerLines) === true && $openTag === $stackPtr) { - // No content in the file. - return; - } - - $possibleHeaders[$openTag] = $headerLines; - if (count($headerLines) > 1) { - break; - } - - $next = $phpcsFile->findNext($searchFor, ($openTag + 1)); - if (isset(Tokens::$ooScopeTokens[$tokens[$next]['code']]) === true) { - // Once we find an OO token, the file content has - // definitely started. - break; - } - - $openTag = $next; - } while ($openTag !== false); - - if ($openTag === false) { - // We never found a proper file header. - // If the file has multiple PHP open tags, we know - // that it must be a mix of PHP and HTML (or similar) - // so the header rules do not apply. - if (count($possibleHeaders) > 1) { - return $phpcsFile->numTokens; - } - - // There is only one possible header. - // If it is the first content in the file, it technically - // serves as the file header, and the open tag needs to - // have a newline after it. Otherwise, ignore it. - if ($stackPtr > 0) { - return $phpcsFile->numTokens; - } - - $openTag = $stackPtr; - } else if (count($possibleHeaders) > 1) { - // There are other PHP blocks before the file header. - $error = 'The file header must be the first content in the file'; - $phpcsFile->addError($error, $openTag, 'HeaderPosition'); - } else { - // The first possible header was the file header block, - // so make sure it is the first content in the file. - if ($openTag !== 0) { - // Allow for hashbang lines. - $hashbang = false; - if ($tokens[($openTag - 1)]['code'] === T_INLINE_HTML) { - $content = trim($tokens[($openTag - 1)]['content']); - if (substr($content, 0, 2) === '#!') { - $hashbang = true; - } - } - - if ($hashbang === false) { - $error = 'The file header must be the first content in the file'; - $phpcsFile->addError($error, $openTag, 'HeaderPosition'); - } - } - }//end if - - $this->processHeaderLines($phpcsFile, $possibleHeaders[$openTag]); - - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Gather information about the statements inside a possible file header. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current - * token in the stack. - * - * @return array - */ - public function getHeaderLines(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($next === false) { - return []; - } - - $headerLines = []; - $headerLines[] = [ - 'type' => 'tag', - 'start' => $stackPtr, - 'end' => $stackPtr, - ]; - - $foundDocblock = false; - - $commentOpeners = Tokens::$scopeOpeners; - unset($commentOpeners[T_NAMESPACE]); - unset($commentOpeners[T_DECLARE]); - unset($commentOpeners[T_USE]); - unset($commentOpeners[T_IF]); - unset($commentOpeners[T_WHILE]); - unset($commentOpeners[T_FOR]); - unset($commentOpeners[T_FOREACH]); - unset($commentOpeners[T_DO]); - unset($commentOpeners[T_TRY]); - - do { - switch ($tokens[$next]['code']) { - case T_DOC_COMMENT_OPEN_TAG: - if ($foundDocblock === true) { - // Found a second docblock, so start of code. - break(2); - } - - // Make sure this is not a code-level docblock. - $end = $tokens[$next]['comment_closer']; - $docToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - - if (isset($commentOpeners[$tokens[$docToken]['code']]) === false - && isset(Tokens::$methodPrefixes[$tokens[$docToken]['code']]) === false - ) { - // Check for an @var annotation. - $annotation = false; - for ($i = $next; $i < $end; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_TAG - && strtolower($tokens[$i]['content']) === '@var' - ) { - $annotation = true; - break; - } - } - - if ($annotation === false) { - $foundDocblock = true; - $headerLines[] = [ - 'type' => 'docblock', - 'start' => $next, - 'end' => $end, - ]; - } - }//end if - - $next = $end; - break; - case T_DECLARE: - case T_NAMESPACE: - $end = $phpcsFile->findEndOfStatement($next); - - $headerLines[] = [ - 'type' => substr(strtolower($tokens[$next]['type']), 2), - 'start' => $next, - 'end' => $end, - ]; - - $next = $end; - break; - case T_USE: - $type = 'use'; - $useType = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - if ($useType !== false && $tokens[$useType]['code'] === T_STRING) { - $content = strtolower($tokens[$useType]['content']); - if ($content === 'function' || $content === 'const') { - $type .= ' '.$content; - } - } - - $end = $phpcsFile->findEndOfStatement($next); - - $headerLines[] = [ - 'type' => $type, - 'start' => $next, - 'end' => $end, - ]; - - $next = $end; - break; - default: - // Skip comments as PSR-12 doesn't say if these are allowed or not. - if (isset(Tokens::$commentTokens[$tokens[$next]['code']]) === true) { - $next = $phpcsFile->findNext(Tokens::$commentTokens, ($next + 1), null, true); - if ($next === false) { - // We reached the end of the file. - break(2); - } - - $next--; - break; - } - - // We found the start of the main code block. - break(2); - }//end switch - - $next = $phpcsFile->findNext(T_WHITESPACE, ($next + 1), null, true); - } while ($next !== false); - - return $headerLines; - - }//end getHeaderLines() - - - /** - * Check the spacing and grouping of the statements inside each header block. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $headerLines Header information, as sourced - * from getHeaderLines(). - * - * @return int|null - */ - public function processHeaderLines(File $phpcsFile, $headerLines) - { - $tokens = $phpcsFile->getTokens(); - - $found = []; - - foreach ($headerLines as $i => $line) { - if (isset($headerLines[($i + 1)]) === false - || $headerLines[($i + 1)]['type'] !== $line['type'] - ) { - // We're at the end of the current header block. - // Make sure there is a single blank line after - // this block. - $next = $phpcsFile->findNext(T_WHITESPACE, ($line['end'] + 1), null, true); - if ($next !== false && $tokens[$next]['line'] !== ($tokens[$line['end']]['line'] + 2)) { - $error = 'Header blocks must be separated by a single blank line'; - $fix = $phpcsFile->addFixableError($error, $line['end'], 'SpacingAfterBlock'); - if ($fix === true) { - if ($tokens[$next]['line'] === $tokens[$line['end']]['line']) { - $phpcsFile->fixer->addContentBefore($next, $phpcsFile->eolChar.$phpcsFile->eolChar); - } else if ($tokens[$next]['line'] === ($tokens[$line['end']]['line'] + 1)) { - $phpcsFile->fixer->addNewline($line['end']); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($line['end'] + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === ($tokens[$line['end']]['line'] + 2)) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - // Make sure we haven't seen this next block before. - if (isset($headerLines[($i + 1)]) === true - && isset($found[$headerLines[($i + 1)]['type']]) === true - ) { - $error = 'Similar statements must be grouped together inside header blocks; '; - $error .= 'the first "%s" statement was found on line %s'; - $data = [ - $headerLines[($i + 1)]['type'], - $tokens[$found[$headerLines[($i + 1)]['type']]['start']]['line'], - ]; - $phpcsFile->addError($error, $headerLines[($i + 1)]['start'], 'IncorrectGrouping', $data); - } - } else if ($headerLines[($i + 1)]['type'] === $line['type']) { - // Still in the same block, so make sure there is no - // blank line after this statement. - $next = $phpcsFile->findNext(T_WHITESPACE, ($line['end'] + 1), null, true); - if ($tokens[$next]['line'] > ($tokens[$line['end']]['line'] + 1)) { - $error = 'Header blocks must not contain blank lines'; - $fix = $phpcsFile->addFixableError($error, $line['end'], 'SpacingInsideBlock'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($line['end'] + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$line['end']]['line']) { - continue; - } - - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - if (isset($found[$line['type']]) === false) { - $found[$line['type']] = $line; - } - }//end foreach - - /* - Next, check that the order of the header blocks - is correct: - Opening php tag. - File-level docblock. - One or more declare statements. - The namespace declaration of the file. - One or more class-based use import statements. - One or more function-based use import statements. - One or more constant-based use import statements. - */ - - $blockOrder = [ - 'tag' => 'opening PHP tag', - 'docblock' => 'file-level docblock', - 'declare' => 'declare statements', - 'namespace' => 'namespace declaration', - 'use' => 'class-based use imports', - 'use function' => 'function-based use imports', - 'use const' => 'constant-based use imports', - ]; - - foreach (array_keys($found) as $type) { - if ($type === 'tag') { - // The opening tag is always in the correct spot. - continue; - } - - do { - $orderedType = next($blockOrder); - } while ($orderedType !== false && key($blockOrder) !== $type); - - if ($orderedType === false) { - // We didn't find the block type in the rest of the - // ordered array, so it is out of place. - // Error and reset the array to the correct position - // so we can check the next block. - reset($blockOrder); - $prevValidType = 'tag'; - do { - $orderedType = next($blockOrder); - if (isset($found[key($blockOrder)]) === true - && key($blockOrder) !== $type - ) { - $prevValidType = key($blockOrder); - } - } while ($orderedType !== false && key($blockOrder) !== $type); - - $error = 'The %s must follow the %s in the file header'; - $data = [ - $blockOrder[$type], - $blockOrder[$prevValidType], - ]; - $phpcsFile->addError($error, $found[$type]['start'], 'IncorrectOrder', $data); - }//end if - }//end foreach - - }//end processHeaderLines() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/ImportStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/ImportStatementSniff.php deleted file mode 100644 index 176aef0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/ImportStatementSniff.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ImportStatementSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_USE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Make sure this is not a closure USE group. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_OPEN_PARENTHESIS) { - return; - } - - if ($phpcsFile->hasCondition($stackPtr, Tokens::$ooScopeTokens) === true) { - // This rule only applies to import statements. - return; - } - - if ($tokens[$next]['code'] === T_STRING - && (strtolower($tokens[$next]['content']) === 'function' - || strtolower($tokens[$next]['content']) === 'const') - ) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - } - - if ($tokens[$next]['code'] !== T_NS_SEPARATOR) { - return; - } - - $error = 'Import statements must not begin with a leading backslash'; - $fix = $phpcsFile->addFixableError($error, $next, 'LeadingSlash'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken($next, ''); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/OpenTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/OpenTagSniff.php deleted file mode 100644 index 4371bee..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/OpenTagSniff.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OpenTagSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current - * token in the stack. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($stackPtr !== 0) { - // This rule only applies if the open tag is on the first line of the file. - return $phpcsFile->numTokens; - } - - $next = $phpcsFile->findNext(T_INLINE_HTML, 0); - if ($next !== false) { - // This rule only applies to PHP-only files. - return $phpcsFile->numTokens; - } - - $tokens = $phpcsFile->getTokens(); - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($next === false) { - // Empty file. - return; - } - - if ($tokens[$next]['line'] === $tokens[$stackPtr]['line']) { - $error = 'Opening PHP tag must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotAlone'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($stackPtr); - } - } - - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/NullableTypeDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/NullableTypeDeclarationSniff.php deleted file mode 100644 index f4d63d4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/NullableTypeDeclarationSniff.php +++ /dev/null @@ -1,90 +0,0 @@ - - * @copyright 2006-2018 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class NullableTypeDeclarationSniff implements Sniff -{ - - /** - * An array of valid tokens after `T_NULLABLE` occurrences. - * - * @var array - */ - private $validTokens = [ - T_STRING => true, - T_NS_SEPARATOR => true, - T_CALLABLE => true, - T_SELF => true, - T_PARENT => true, - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_NULLABLE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $nextNonEmptyPtr = $phpcsFile->findNext([T_WHITESPACE], ($stackPtr + 1), null, true); - if ($nextNonEmptyPtr === false) { - // Parse error or live coding. - return; - } - - $tokens = $phpcsFile->getTokens(); - $nextNonEmptyCode = $tokens[$nextNonEmptyPtr]['code']; - $validTokenFound = isset($this->validTokens[$nextNonEmptyCode]); - - if ($validTokenFound === true && $nextNonEmptyPtr === ($stackPtr + 1)) { - // Valid structure. - return; - } - - $error = 'There must not be a space between the question mark and the type in nullable type declarations'; - - if ($validTokenFound === true) { - // No other tokens then whitespace tokens found; fixable. - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WhitespaceFound'); - if ($fix === true) { - for ($i = ($stackPtr + 1); $i < $nextNonEmptyPtr; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - - return; - } - - // Non-whitespace tokens found; trigger error but don't fix. - $phpcsFile->addError($error, $stackPtr, 'UnexpectedCharactersFound'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/ReturnTypeDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/ReturnTypeDeclarationSniff.php deleted file mode 100644 index 14d91e2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/ReturnTypeDeclarationSniff.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ReturnTypeDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - T_FN, - ]; - - }//end register() - - - /** - * Processes this test when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - || $tokens[$stackPtr]['parenthesis_opener'] === null - || $tokens[$stackPtr]['parenthesis_closer'] === null - ) { - return; - } - - $methodProperties = $phpcsFile->getMethodProperties($stackPtr); - if ($methodProperties['return_type'] === '') { - return; - } - - $returnType = $methodProperties['return_type_token']; - if ($methodProperties['nullable_return_type'] === true) { - $returnType = $phpcsFile->findPrevious(T_NULLABLE, ($returnType - 1)); - } - - if ($tokens[($returnType - 1)]['code'] !== T_WHITESPACE - || $tokens[($returnType - 1)]['content'] !== ' ' - || $tokens[($returnType - 2)]['code'] !== T_COLON - ) { - $error = 'There must be a single space between the colon and type in a return type declaration'; - if ($tokens[($returnType - 1)]['code'] === T_WHITESPACE - && $tokens[($returnType - 2)]['code'] === T_COLON - ) { - $fix = $phpcsFile->addFixableError($error, $returnType, 'SpaceBeforeReturnType'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($returnType - 1), ' '); - } - } else if ($tokens[($returnType - 1)]['code'] === T_COLON) { - $fix = $phpcsFile->addFixableError($error, $returnType, 'SpaceBeforeReturnType'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($returnType, ' '); - } - } else { - $phpcsFile->addError($error, $returnType, 'SpaceBeforeReturnType'); - } - } - - $colon = $phpcsFile->findPrevious(T_COLON, $returnType); - if ($tokens[($colon - 1)]['code'] !== T_CLOSE_PARENTHESIS) { - $error = 'There must not be a space before the colon in a return type declaration'; - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($colon - 1), null, true); - if ($tokens[$prev]['code'] === T_CLOSE_PARENTHESIS) { - $fix = $phpcsFile->addFixableError($error, $colon, 'SpaceBeforeColon'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($prev + 1); $x < $colon; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->addError($error, $colon, 'SpaceBeforeColon'); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Keywords/ShortFormTypeKeywordsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Keywords/ShortFormTypeKeywordsSniff.php deleted file mode 100644 index adf04d9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Keywords/ShortFormTypeKeywordsSniff.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Keywords; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ShortFormTypeKeywordsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_BOOL_CAST, - T_INT_CAST, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $typecast = str_replace(' ', '', $tokens[$stackPtr]['content']); - $typecast = str_replace("\t", '', $typecast); - $typecast = trim($typecast, '()'); - $typecastLc = strtolower($typecast); - - if (($tokens[$stackPtr]['code'] === T_BOOL_CAST - && $typecastLc === 'bool') - || ($tokens[$stackPtr]['code'] === T_INT_CAST - && $typecastLc === 'int') - ) { - return; - } - - $error = 'Short form type keywords must be used. Found: %s'; - $data = [$tokens[$stackPtr]['content']]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'LongFound', $data); - if ($fix === true) { - if ($tokens[$stackPtr]['code'] === T_BOOL_CAST) { - $replacement = str_replace($typecast, 'bool', $tokens[$stackPtr]['content']); - } else { - $replacement = str_replace($typecast, 'int', $tokens[$stackPtr]['content']); - } - - $phpcsFile->fixer->replaceToken($stackPtr, $replacement); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Namespaces/CompoundNamespaceDepthSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Namespaces/CompoundNamespaceDepthSniff.php deleted file mode 100644 index 725fbde..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Namespaces/CompoundNamespaceDepthSniff.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Namespaces; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class CompoundNamespaceDepthSniff implements Sniff -{ - - /** - * The max depth for compound namespaces. - * - * @var integer - */ - public $maxDepth = 2; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_USE_GROUP]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $this->maxDepth = (int) $this->maxDepth; - - $tokens = $phpcsFile->getTokens(); - - $end = $phpcsFile->findNext(T_CLOSE_USE_GROUP, ($stackPtr + 1)); - if ($end === false) { - return; - } - - $depth = 1; - for ($i = ($stackPtr + 1); $i <= $end; $i++) { - if ($tokens[$i]['code'] === T_NS_SEPARATOR) { - $depth++; - continue; - } - - if ($i === $end || $tokens[$i]['code'] === T_COMMA) { - // End of a namespace. - if ($depth > $this->maxDepth) { - $error = 'Compound namespaces cannot have a depth more than %s'; - $data = [$this->maxDepth]; - $phpcsFile->addError($error, $i, 'TooDeep', $data); - } - - $depth = 1; - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Operators/OperatorSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Operators/OperatorSpacingSniff.php deleted file mode 100644 index 8757e05..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Operators/OperatorSpacingSniff.php +++ /dev/null @@ -1,112 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\OperatorSpacingSniff as SquizOperatorSpacingSniff; -use PHP_CodeSniffer\Util\Tokens; - -class OperatorSpacingSniff extends SquizOperatorSpacingSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - parent::register(); - - $targets = Tokens::$comparisonTokens; - $targets += Tokens::$operators; - $targets += Tokens::$assignmentTokens; - $targets += Tokens::$booleanOperators; - $targets[] = T_INLINE_THEN; - $targets[] = T_INLINE_ELSE; - $targets[] = T_STRING_CONCAT; - $targets[] = T_INSTANCEOF; - - return $targets; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($this->isOperator($phpcsFile, $stackPtr) === false) { - return; - } - - $operator = $tokens[$stackPtr]['content']; - - $checkBefore = true; - $checkAfter = true; - - // Skip short ternary. - if ($tokens[($stackPtr)]['code'] === T_INLINE_ELSE - && $tokens[($stackPtr - 1)]['code'] === T_INLINE_THEN - ) { - $checkBefore = false; - } - - // Skip operator with comment on previous line. - if ($tokens[($stackPtr - 1)]['code'] === T_COMMENT - && $tokens[($stackPtr - 1)]['line'] < $tokens[$stackPtr]['line'] - ) { - $checkBefore = false; - } - - if (isset($tokens[($stackPtr + 1)]) === true) { - // Skip short ternary. - if ($tokens[$stackPtr]['code'] === T_INLINE_THEN - && $tokens[($stackPtr + 1)]['code'] === T_INLINE_ELSE - ) { - $checkAfter = false; - } - } else { - // Skip partial files. - $checkAfter = false; - } - - if ($checkBefore === true && $tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected at least 1 space before "%s"; 0 found'; - $data = [$operator]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBefore', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - } - - if ($checkAfter === true && $tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected at least 1 space after "%s"; 0 found'; - $data = [$operator]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfter', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Properties/ConstantVisibilitySniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Properties/ConstantVisibilitySniff.php deleted file mode 100644 index 8a1000f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Properties/ConstantVisibilitySniff.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Properties; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ConstantVisibilitySniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CONST]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Make sure this is a class constant. - if ($phpcsFile->hasCondition($stackPtr, Tokens::$ooScopeTokens) === false) { - return; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if (isset(Tokens::$scopeModifiers[$tokens[$prev]['code']]) === true) { - return; - } - - $error = 'Visibility must be declared on all constants if your project supports PHP 7.1 or later'; - $phpcsFile->addWarning($error, $stackPtr, 'NotFound'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Traits/UseDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Traits/UseDeclarationSniff.php deleted file mode 100644 index 113e8b9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Traits/UseDeclarationSniff.php +++ /dev/null @@ -1,700 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Traits; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UseDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_USE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Needs to be a use statement directly inside a class. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - if (isset(Tokens::$ooScopeTokens[current($conditions)]) === false) { - return; - } - - $ooToken = key($conditions); - $opener = $tokens[$ooToken]['scope_opener']; - - // Figure out where all the use statements are. - $useTokens = [$stackPtr]; - for ($i = ($stackPtr + 1); $i < $tokens[$ooToken]['scope_closer']; $i++) { - if ($tokens[$i]['code'] === T_USE) { - $useTokens[] = $i; - } - - if (isset($tokens[$i]['scope_closer']) === true) { - $i = $tokens[$i]['scope_closer']; - } - } - - $numUseTokens = count($useTokens); - foreach ($useTokens as $usePos => $useToken) { - if ($usePos === 0) { - /* - This is the first use statement. - */ - - // The first non-comment line must be the use line. - $lastValidContent = $useToken; - for ($i = ($useToken - 1); $i > $opener; $i--) { - if ($tokens[$i]['code'] === T_WHITESPACE - && ($tokens[($i - 1)]['line'] === $tokens[$i]['line'] - || $tokens[($i + 1)]['line'] === $tokens[$i]['line']) - ) { - continue; - } - - if (isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - // Skip past the comment. - $i = $tokens[$i]['comment_opener']; - } - - $lastValidContent = $i; - - continue; - } - - break; - }//end for - - if ($tokens[$lastValidContent]['line'] !== ($tokens[$opener]['line'] + 1)) { - $error = 'The first trait import statement must be declared on the first non-comment line after the %s opening brace'; - $data = [strtolower($tokens[$ooToken]['content'])]; - - // Figure out if we can fix this error. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($useToken - 1), ($opener - 1), true); - if ($tokens[$prev]['line'] === $tokens[$opener]['line']) { - $fix = $phpcsFile->addFixableError($error, $useToken, 'UseAfterBrace', $data); - if ($fix === true) { - // We know that the USE statements is the first non-comment content - // in the class, so we just need to remove blank lines. - $phpcsFile->fixer->beginChangeset(); - for ($i = ($useToken - 1); $i > $opener; $i--) { - if ($tokens[$i]['line'] === $tokens[$opener]['line']) { - break; - } - - if ($tokens[$i]['line'] === $tokens[$useToken]['line']) { - continue; - } - - if ($tokens[$i]['code'] === T_WHITESPACE - && $tokens[($i - 1)]['line'] !== $tokens[$i]['line'] - && $tokens[($i + 1)]['line'] !== $tokens[$i]['line'] - ) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - if (isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - // Skip past the comment. - $i = $tokens[$i]['comment_opener']; - } - - $lastValidContent = $i; - } - }//end for - - $phpcsFile->fixer->endChangeset(); - }//end if - } else { - $phpcsFile->addError($error, $useToken, 'UseAfterBrace', $data); - }//end if - }//end if - } else { - // Make sure this use statement is not on the same line as the previous one. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($useToken - 1), null, true); - if ($prev !== false && $tokens[$prev]['line'] === $tokens[$useToken]['line']) { - $error = 'Each imported trait must be on its own line'; - $prevNonWs = $phpcsFile->findPrevious(T_WHITESPACE, ($useToken - 1), null, true); - if ($prevNonWs !== $prev) { - $phpcsFile->addError($error, $useToken, 'SpacingBeforeImport'); - } else { - $fix = $phpcsFile->addFixableError($error, $useToken, 'SpacingBeforeImport'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($useToken - 1); $x > $prev; $x--) { - if ($tokens[$x]['line'] === $tokens[$useToken]['line'] - ) { - // Preserve indent. - continue; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addNewline($prev); - if ($tokens[$prev]['line'] === $tokens[$useToken]['line']) { - if ($tokens[($useToken - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($useToken - 1), ''); - } - - $padding = str_repeat(' ', ($tokens[$useTokens[0]]['column'] - 1)); - $phpcsFile->fixer->addContent($prev, $padding); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - }//end if - }//end if - - // Check the formatting of the statement. - if (isset($tokens[$useToken]['scope_opener']) === true) { - $this->processUseGroup($phpcsFile, $useToken); - $end = $tokens[$useToken]['scope_closer']; - } else { - $this->processUseStatement($phpcsFile, $useToken); - $end = $phpcsFile->findNext(T_SEMICOLON, ($useToken + 1)); - if ($end === false) { - // Syntax error. - return; - } - } - - if ($usePos === ($numUseTokens - 1)) { - /* - This is the last use statement. - */ - - $next = $phpcsFile->findNext(T_WHITESPACE, ($end + 1), null, true); - if ($next === $tokens[$ooToken]['scope_closer']) { - // Last content in the class. - $closer = $tokens[$ooToken]['scope_closer']; - if ($tokens[$closer]['line'] > ($tokens[$end]['line'] + 1)) { - $error = 'There must be no blank line after the last trait import statement at the bottom of a %s'; - $data = [strtolower($tokens[$ooToken]['content'])]; - $fix = $phpcsFile->addFixableError($error, $end, 'BlankLineAfterLastUse', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($end + 1); $i < $closer; $i++) { - if ($tokens[$i]['line'] === $tokens[$end]['line']) { - continue; - } - - if ($tokens[$i]['line'] === $tokens[$closer]['line']) { - // Don't remove indents. - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - } else if ($tokens[$next]['code'] !== T_USE) { - // Comments are allowed on the same line as the use statement, so make sure - // we don't error for those. - for ($next = ($end + 1); $next < $tokens[$ooToken]['scope_closer']; $next++) { - if ($tokens[$next]['code'] === T_WHITESPACE) { - continue; - } - - if (isset(Tokens::$commentTokens[$tokens[$next]['code']]) === true - && $tokens[$next]['line'] === $tokens[$end]['line'] - ) { - continue; - } - - break; - } - - if ($tokens[$next]['line'] <= ($tokens[$end]['line'] + 1)) { - $error = 'There must be a blank line following the last trait import statement'; - $fix = $phpcsFile->addFixableError($error, $end, 'NoBlankLineAfterUse'); - if ($fix === true) { - if ($tokens[$next]['line'] === $tokens[$useToken]['line']) { - $phpcsFile->fixer->addContentBefore($next, $phpcsFile->eolChar.$phpcsFile->eolChar); - } else { - for ($i = ($next - 1); $i > $end; $i--) { - if ($tokens[$i]['line'] !== $tokens[$next]['line']) { - break; - } - } - - $phpcsFile->fixer->addNewlineBefore(($i + 1)); - } - } - } - }//end if - } else { - // Ensure use statements are grouped. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - if ($next !== $useTokens[($usePos + 1)]) { - $error = 'Imported traits must be grouped together'; - $phpcsFile->addError($error, $useTokens[($usePos + 1)], 'NotGrouped'); - } - }//end if - }//end foreach - - return $tokens[$ooToken]['scope_closer']; - - }//end process() - - - /** - * Processes a group use statement. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processUseGroup(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $opener = $tokens[$stackPtr]['scope_opener']; - $closer = $tokens[$stackPtr]['scope_closer']; - - if ($tokens[$opener]['line'] !== $tokens[$stackPtr]['line']) { - $error = 'The opening brace of a trait import statement must be on the same line as the USE keyword'; - // Figure out if we can fix this error. - $canFix = true; - for ($i = ($stackPtr + 1); $i < $opener; $i++) { - if ($tokens[$i]['line'] !== $tokens[($i + 1)]['line'] - && $tokens[$i]['code'] !== T_WHITESPACE - ) { - $canFix = false; - break; - } - } - - if ($canFix === true) { - $fix = $phpcsFile->addFixableError($error, $opener, 'OpenBraceNewLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($stackPtr + 1); $i < $opener; $i++) { - if ($tokens[$i]['line'] !== $tokens[($i + 1)]['line']) { - // Everything should have a single space around it. - $phpcsFile->fixer->replaceToken($i, ' '); - } - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->addError($error, $opener, 'OpenBraceNewLine'); - } - }//end if - - $error = 'Expected 1 space before opening brace in trait import statement; %s found'; - if ($tokens[($opener - 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $opener, 'SpaceBeforeOpeningBrace', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($opener, ' '); - } - } else if ($tokens[($opener - 1)]['content'] !== ' ') { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($opener - 1), null, true); - if ($tokens[$prev]['line'] !== $tokens[$opener]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($opener - 1)]['length']; - } - - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $opener, 'SpaceBeforeOpeningBrace', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($opener - 1); $x > $prev; $x--) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContentBefore($opener, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($opener - 1), ' '); - } - } - }//end if - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($opener + 1), ($closer - 1), true); - if ($next !== false && $tokens[$next]['line'] !== ($tokens[$opener]['line'] + 1)) { - $error = 'First trait conflict resolution statement must be on the line after the opening brace'; - $nextNonWs = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), ($closer - 1), true); - if ($nextNonWs !== $next) { - $phpcsFile->addError($error, $opener, 'SpaceAfterOpeningBrace'); - } else { - $fix = $phpcsFile->addFixableError($error, $opener, 'SpaceAfterOpeningBrace'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($opener + 1); $x < $next; $x++) { - if ($tokens[$x]['line'] === $tokens[$next]['line']) { - // Preserve indent. - break; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addNewline($opener); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - for ($i = ($stackPtr + 1); $i < $opener; $i++) { - if ($tokens[$i]['code'] !== T_COMMA) { - continue; - } - - if ($tokens[($i - 1)]['code'] === T_WHITESPACE) { - $error = 'Expected no space before comma in trait import statement; %s found'; - $data = [$tokens[($i - 1)]['length']]; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($i - 1), ''); - } - } - - $error = 'Expected 1 space after comma in trait import statement; %s found'; - if ($tokens[($i + 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterComma', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($i, ' '); - } - } else if ($tokens[($i + 1)]['content'] !== ' ') { - $next = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), $opener, true); - if ($tokens[$next]['line'] !== $tokens[$i]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($i + 1)]['length']; - } - - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterComma', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($i + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContent($i, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($i + 1), ' '); - } - } - }//end if - }//end for - - for ($i = ($opener + 1); $i < $closer; $i++) { - if ($tokens[$i]['code'] === T_INSTEADOF) { - $error = 'Expected 1 space before INSTEADOF in trait import statement; %s found'; - if ($tokens[($i - 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeInsteadof', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($i, ' '); - } - } else if ($tokens[($i - 1)]['content'] !== ' ') { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($i - 1), $opener, true); - if ($tokens[$prev]['line'] !== $tokens[$i]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($i - 1)]['length']; - } - - $data = [$found]; - - $prevNonWs = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), $opener, true); - if ($prevNonWs !== $prev) { - $phpcsFile->addError($error, $i, 'SpaceBeforeInsteadof', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeInsteadof', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($i - 1); $x > $prev; $x--) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContentBefore($i, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($i - 1), ' '); - } - } - } - }//end if - - $error = 'Expected 1 space after INSTEADOF in trait import statement; %s found'; - if ($tokens[($i + 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterInsteadof', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($i, ' '); - } - } else if ($tokens[($i + 1)]['content'] !== ' ') { - $next = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), $closer, true); - if ($tokens[$next]['line'] !== $tokens[$i]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($i + 1)]['length']; - } - - $data = [$found]; - - $nextNonWs = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), $closer, true); - if ($nextNonWs !== $next) { - $phpcsFile->addError($error, $i, 'SpaceAfterInsteadof', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterInsteadof', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($i + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContent($i, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($i + 1), ' '); - } - } - } - }//end if - }//end if - - if ($tokens[$i]['code'] === T_AS) { - $error = 'Expected 1 space before AS in trait import statement; %s found'; - if ($tokens[($i - 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeAs', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($i, ' '); - } - } else if ($tokens[($i - 1)]['content'] !== ' ') { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($i - 1), $opener, true); - if ($tokens[$prev]['line'] !== $tokens[$i]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($i - 1)]['length']; - } - - $data = [$found]; - - $prevNonWs = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), $opener, true); - if ($prevNonWs !== $prev) { - $phpcsFile->addError($error, $i, 'SpaceBeforeAs', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeAs', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($i - 1); $x > $prev; $x--) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContentBefore($i, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($i - 1), ' '); - } - } - } - }//end if - - $error = 'Expected 1 space after AS in trait import statement; %s found'; - if ($tokens[($i + 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterAs', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($i, ' '); - } - } else if ($tokens[($i + 1)]['content'] !== ' ') { - $next = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), $closer, true); - if ($tokens[$next]['line'] !== $tokens[$i]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($i + 1)]['length']; - } - - $data = [$found]; - - $nextNonWs = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), $closer, true); - if ($nextNonWs !== $next) { - $phpcsFile->addError($error, $i, 'SpaceAfterAs', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterAs', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($i + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContent($i, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($i + 1), ' '); - } - } - } - }//end if - }//end if - - if ($tokens[$i]['code'] === T_SEMICOLON) { - if ($tokens[($i - 1)]['code'] === T_WHITESPACE) { - $error = 'Expected no space before semicolon in trait import statement; %s found'; - $data = [$tokens[($i - 1)]['length']]; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeSemicolon', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($i - 1), ''); - } - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), ($closer - 1), true); - if ($next !== false && $tokens[$next]['line'] === $tokens[$i]['line']) { - $error = 'Each trait conflict resolution statement must be on a line by itself'; - $nextNonWs = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), ($closer - 1), true); - if ($nextNonWs !== $next) { - $phpcsFile->addError($error, $i, 'ConflictSameLine'); - } else { - $fix = $phpcsFile->addFixableError($error, $i, 'ConflictSameLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if ($tokens[($i + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($i + 1), ''); - } - - $phpcsFile->fixer->addNewline($i); - $phpcsFile->fixer->endChangeset(); - } - } - } - }//end if - }//end for - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($closer - 1), ($opener + 1), true); - if ($prev !== false && $tokens[$prev]['line'] !== ($tokens[$closer]['line'] - 1)) { - $error = 'Closing brace must be on the line after the last trait conflict resolution statement'; - $prevNonWs = $phpcsFile->findPrevious(T_WHITESPACE, ($closer - 1), ($opener + 1), true); - if ($prevNonWs !== $prev) { - $phpcsFile->addError($error, $closer, 'SpaceBeforeClosingBrace'); - } else { - $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceBeforeClosingBrace'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($closer - 1); $x > $prev; $x--) { - if ($tokens[$x]['line'] === $tokens[$closer]['line']) { - // Preserve indent. - continue; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addNewline($prev); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - }//end processUseGroup() - - - /** - * Processes a single use statement. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processUseStatement(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $error = 'Expected 1 space after USE in trait import statement; %s found'; - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterAs', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - } else if ($tokens[($stackPtr + 1)]['content'] !== ' ') { - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($stackPtr + 1)]['length']; - } - - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterAs', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($stackPtr + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContent($stackPtr, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - }//end if - - $next = $phpcsFile->findNext([T_COMMA, T_SEMICOLON], ($stackPtr + 1)); - if ($next !== false && $tokens[$next]['code'] === T_COMMA) { - $error = 'Each imported trait must have its own "use" import statement'; - $fix = $phpcsFile->addFixableError($error, $next, 'MultipleImport'); - if ($fix === true) { - $padding = str_repeat(' ', ($tokens[$stackPtr]['column'] - 1)); - $phpcsFile->fixer->replaceToken($next, ';'.$phpcsFile->eolChar.$padding.'use '); - } - } - - }//end processUseStatement() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc deleted file mode 100644 index e132b54..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc +++ /dev/null @@ -1,84 +0,0 @@ -bar( - new class implements Bar { - // ... - }, -); - -foo(new class { -}); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc.fixed deleted file mode 100644 index 921dcc0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,86 +0,0 @@ -bar( - new class implements Bar { - // ... - }, -); - -foo(new class { -}); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.php deleted file mode 100644 index 3f65602..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.php +++ /dev/null @@ -1,71 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class AnonClassDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 28 => 3, - 30 => 1, - 31 => 4, - 32 => 1, - 33 => 1, - 34 => 1, - 35 => 2, - 36 => 1, - 37 => 3, - 39 => 1, - 40 => 1, - 43 => 3, - 44 => 4, - 45 => 1, - 48 => 1, - 52 => 3, - 53 => 1, - 54 => 1, - 55 => 1, - 56 => 2, - 63 => 1, - 75 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc deleted file mode 100644 index dcd849e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc +++ /dev/null @@ -1,34 +0,0 @@ -bar(); -echo (new Foo)->bar(); -echo (new Foo((new Bar)->getBaz()))->bar(); -$foo = (new Foo)::$bar; - -echo (new Foo((new Bar//comment -)->getBaz(new Baz /* comment */)))->bar(); - -$foo = new $bar['a'](); -$foo = new $bar['a']['b'](); -$foo = new $bar['a'][$baz['a']['b']]['b'](); -$foo = new $bar['a'] [$baz['a']/* comment */ ['b']]['b']; - -$a = new self::$transport[$cap_string]; -$renderer = new $this->inline_diff_renderer; -$a = new ${$varHoldingClassName}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc.fixed deleted file mode 100644 index d8438da..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc.fixed +++ /dev/null @@ -1,34 +0,0 @@ -bar(); -echo (new Foo())->bar(); -echo (new Foo((new Bar())->getBaz()))->bar(); -$foo = (new Foo())::$bar; - -echo (new Foo((new Bar()//comment -)->getBaz(new Baz() /* comment */)))->bar(); - -$foo = new $bar['a'](); -$foo = new $bar['a']['b'](); -$foo = new $bar['a'][$baz['a']['b']]['b'](); -$foo = new $bar['a'] [$baz['a']/* comment */ ['b']]['b'](); - -$a = new self::$transport[$cap_string](); -$renderer = new $this->inline_diff_renderer(); -$a = new ${$varHoldingClassName}(); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.php deleted file mode 100644 index 40c90c8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClassInstantiationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 4 => 1, - 9 => 1, - 11 => 1, - 14 => 1, - 16 => 1, - 20 => 1, - 21 => 1, - 22 => 1, - 24 => 1, - 25 => 1, - 30 => 1, - 32 => 1, - 33 => 1, - 34 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.inc deleted file mode 100644 index 1d2e92c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.inc +++ /dev/null @@ -1,47 +0,0 @@ -bar( - $arg1, - function ($arg2) use ($var1) { - // body - }, - $arg3 -); - -$instance = new class extends \Foo implements \HandleableInterface { - // Class content -}; - -$app->get('/hello/{name}', function ($name) use ($app) { - return 'Hello ' . $app->escape($name); -}); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.php deleted file mode 100644 index 1deac1c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClosingBraceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 13 => 1, - 14 => 1, - 19 => 1, - 24 => 1, - 31 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc deleted file mode 100644 index 3289f7e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc +++ /dev/null @@ -1,110 +0,0 @@ - 0 && $n < 10) - || ($n > 10 && $n < 20) - || ($n > 20 && $n < 30) -) { - return $n; -} - -if ( - ( - $expr1 - && $expr2 - && $expr3 - && $expr4 - && $expr5 - && $expr6 - ) - || ($n > 100 && $n < 200) - || ($n > 200 && $n < 300) -) { - return $n; -} - -// phpcs:set PSR12.ControlStructures.BooleanOperatorPlacement allowOnly first -if ( - $expr1 - && $expr2 - && ($expr3 - || $expr4) - && $expr5 -) { - // if body -} elseif ( - $expr1 && - ($expr3 || $expr4) - && $expr5 -) { - // elseif body -} elseif ( - $expr1 - && ($expr3 || $expr4) && - $expr5 -) { - // elseif body -} - -// phpcs:set PSR12.ControlStructures.BooleanOperatorPlacement allowOnly last -if ( - $expr1 - && $expr2 - && ($expr3 - || $expr4) - && $expr5 -) { - // if body -} elseif ( - $expr1 && - ($expr3 || $expr4) - && $expr5 -) { - // elseif body -} elseif ( - $expr1 - && ($expr3 || $expr4) && - $expr5 -) { - // elseif body -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc.fixed deleted file mode 100644 index 5e8f0c3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc.fixed +++ /dev/null @@ -1,120 +0,0 @@ - 0 && $n < 10) - || ($n > 10 && $n < 20) - || ($n > 20 && $n < 30) -) { - return $n; -} - -if ( - ( - $expr1 - && $expr2 - && $expr3 - && $expr4 - && $expr5 - && $expr6 - ) - || ($n > 100 && $n < 200) - || ($n > 200 && $n < 300) -) { - return $n; -} - -// phpcs:set PSR12.ControlStructures.BooleanOperatorPlacement allowOnly first -if ( - $expr1 - && $expr2 - && ($expr3 - || $expr4) - && $expr5 -) { - // if body -} elseif ( - $expr1 - && ($expr3 - || $expr4) - && $expr5 -) { - // elseif body -} elseif ( - $expr1 - && ($expr3 - || $expr4) - && $expr5 -) { - // elseif body -} - -// phpcs:set PSR12.ControlStructures.BooleanOperatorPlacement allowOnly last -if ( - $expr1 && - $expr2 && - ($expr3 || - $expr4) && - $expr5 -) { - // if body -} elseif ( - $expr1 && - ($expr3 || - $expr4) && - $expr5 -) { - // elseif body -} elseif ( - $expr1 && - ($expr3 || - $expr4) && - $expr5 -) { - // elseif body -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.php deleted file mode 100644 index ffd4d68..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class BooleanOperatorPlacementUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 10 => 1, - 16 => 1, - 28 => 1, - 34 => 1, - 75 => 1, - 81 => 1, - 90 => 1, - 98 => 1, - 104 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc deleted file mode 100644 index 2cdb535..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc +++ /dev/null @@ -1,86 +0,0 @@ - $foo - /* - * A multi-line comment. - */ - && $foo === true - ) { - break; - } diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed deleted file mode 100644 index 7f6fbf9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,87 +0,0 @@ - $foo - /* - * A multi-line comment. - */ - && $foo === true - ) { - break; - } diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.php deleted file mode 100644 index c2c0ea9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ControlStructureSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 2, - 16 => 1, - 17 => 1, - 18 => 1, - 22 => 1, - 23 => 1, - 32 => 1, - 33 => 1, - 34 => 1, - 37 => 1, - 38 => 1, - 39 => 1, - 48 => 2, - 58 => 1, - 59 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.inc deleted file mode 100644 index f21daaf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.inc +++ /dev/null @@ -1,50 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DeclareStatementUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 3 => 1, - 4 => 1, - 5 => 2, - 6 => 1, - 7 => 1, - 9 => 2, - 10 => 1, - 11 => 3, - 12 => 2, - 13 => 1, - 14 => 2, - 16 => 3, - 19 => 3, - 22 => 1, - 24 => 1, - 26 => 3, - 28 => 3, - 34 => 2, - 43 => 1, - 46 => 1, - 47 => 1, - 49 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.1.inc deleted file mode 100644 index 1298ed7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.1.inc +++ /dev/null @@ -1,29 +0,0 @@ - - -

    - - - -

    - - - - -

    Demo

    - - -
  • My page
  • -
  • Write
  • -
  • Sign out
  • - -
  • Sign in
  • - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.15.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.15.inc deleted file mode 100644 index 11102be..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.15.inc +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.2.inc deleted file mode 100644 index 1c9e119..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.2.inc +++ /dev/null @@ -1,33 +0,0 @@ - - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FileHeaderUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FileHeaderUnitTest.2.inc': - return [ - 1 => 1, - 6 => 1, - 7 => 1, - 18 => 1, - 20 => 1, - 24 => 1, - ]; - case 'FileHeaderUnitTest.3.inc': - return [ - 9 => 1, - 18 => 1, - ]; - case 'FileHeaderUnitTest.4.inc': - return [ - 1 => 1, - 2 => 1, - 3 => 1, - 7 => 1, - ]; - case 'FileHeaderUnitTest.5.inc': - return [4 => 1]; - case 'FileHeaderUnitTest.7.inc': - case 'FileHeaderUnitTest.10.inc': - case 'FileHeaderUnitTest.11.inc': - return [1 => 1]; - case 'FileHeaderUnitTest.12.inc': - return [4 => 2]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.inc deleted file mode 100644 index 904e3f4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.inc +++ /dev/null @@ -1,19 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ImportStatementUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 4 => 1, - 7 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.1.inc deleted file mode 100644 index 0dbdf01..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.1.inc +++ /dev/null @@ -1,3 +0,0 @@ - -hi diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.4.inc deleted file mode 100644 index 09be8fb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.4.inc +++ /dev/null @@ -1,2 +0,0 @@ - - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class OpenTagUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'OpenTagUnitTest.2.inc': - return [1 => 1]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.inc deleted file mode 100644 index 1f4500c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.inc +++ /dev/null @@ -1,84 +0,0 @@ - - * @copyright 2006-2018 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class NullableTypeDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - protected function getErrorList() - { - return [ - 23 => 1, - 24 => 1, - 25 => 1, - 30 => 1, - 31 => 1, - 32 => 1, - 43 => 2, - 48 => 1, - 50 => 1, - 51 => 1, - 53 => 1, - 57 => 2, - 58 => 2, - 59 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - protected function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc deleted file mode 100644 index 2a68862..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc +++ /dev/null @@ -1,64 +0,0 @@ - $arg; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc.fixed deleted file mode 100644 index 827e03c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,60 +0,0 @@ - $arg; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.php deleted file mode 100644 index fc6b5e1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2018 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ReturnTypeDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - protected function getErrorList() - { - return [ - 27 => 1, - 28 => 1, - 35 => 2, - 41 => 2, - 48 => 2, - 52 => 1, - 55 => 1, - 56 => 1, - 59 => 1, - 60 => 1, - 62 => 1, - 64 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - protected function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.inc deleted file mode 100644 index 6ce930d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.inc +++ /dev/null @@ -1,14 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Keywords; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ShortFormTypeKeywordsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 1, - 7 => 1, - 13 => 1, - 14 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Namespaces/CompoundNamespaceDepthUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Namespaces/CompoundNamespaceDepthUnitTest.inc deleted file mode 100644 index 3336fc2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Namespaces/CompoundNamespaceDepthUnitTest.inc +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Namespaces; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class CompoundNamespaceDepthUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 10 => 1, - 18 => 1, - 21 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.inc deleted file mode 100644 index 82c68f2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.inc +++ /dev/null @@ -1,58 +0,0 @@ - $b) { - $variable =$foo ? 'foo' :'bar'; - $variable.='text'.'text'; -} - -$foo+= $a&$b; -$foo = $a|$b; -$foo =$a^$b; -$foo = ~$a; -$foo *=$a<<$b; -$foo = $a>>$b; - -function foo(&$a,& $b) {} - -$foo = $a and$b; -$foo = $a or $b; -$foo = $a xor$b; -$foo = !$a; -$foo = $a&&$b; -$foo = $a||$b; - -$foo = $a instanceof Foo; -$foo = $a instanceof$b; - -$foo .= 'hi' - .= 'there'; - -$foo .= 'hi' -.= 'there'; - -$foo .= 'hi' // comment -.= 'there'; - -$foo/*comment*/=/*comment*/$a/*comment*/and/*comment*/$b; - -$foo .=//comment -'string' .=/*comment*/ -'string'; - -$foo = $foo ?: 'bar'; -$foo = $foo?:'bar'; - -try { -} catch (ExceptionType1|ExceptionType2 $e) { -} - -if (strpos($tokenContent, 'b"') === 0 && substr($tokenContent, -1) === '"') {} - -$oldConstructorPos = +1; -return -$content; - -function name($a = -1) {} - -$a =& $ref; -$a = [ 'a' => &$something ]; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.inc.fixed deleted file mode 100644 index abab602..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,58 +0,0 @@ - $b) { - $variable = $foo ? 'foo' : 'bar'; - $variable .= 'text' . 'text'; -} - -$foo += $a & $b; -$foo = $a | $b; -$foo = $a ^ $b; -$foo = ~$a; -$foo *= $a << $b; -$foo = $a >> $b; - -function foo(&$a,& $b) {} - -$foo = $a and $b; -$foo = $a or $b; -$foo = $a xor $b; -$foo = !$a; -$foo = $a && $b; -$foo = $a || $b; - -$foo = $a instanceof Foo; -$foo = $a instanceof $b; - -$foo .= 'hi' - .= 'there'; - -$foo .= 'hi' -.= 'there'; - -$foo .= 'hi' // comment -.= 'there'; - -$foo/*comment*/ = /*comment*/$a/*comment*/ and /*comment*/$b; - -$foo .= //comment -'string' .= /*comment*/ -'string'; - -$foo = $foo ?: 'bar'; -$foo = $foo ?: 'bar'; - -try { -} catch (ExceptionType1 | ExceptionType2 $e) { -} - -if (strpos($tokenContent, 'b"') === 0 && substr($tokenContent, -1) === '"') {} - -$oldConstructorPos = +1; -return -$content; - -function name($a = -1) {} - -$a =& $ref; -$a = [ 'a' => &$something ]; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.php deleted file mode 100644 index e23fd96..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Operators; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class OperatorSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 3 => 2, - 4 => 1, - 5 => 2, - 6 => 4, - 9 => 3, - 10 => 2, - 11 => 3, - 13 => 3, - 14 => 2, - 18 => 1, - 20 => 1, - 22 => 2, - 23 => 2, - 26 => 1, - 37 => 4, - 39 => 1, - 40 => 1, - 44 => 2, - 47 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Properties/ConstantVisibilityUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Properties/ConstantVisibilityUnitTest.inc deleted file mode 100644 index c07b1b9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Properties/ConstantVisibilityUnitTest.inc +++ /dev/null @@ -1,7 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Properties; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ConstantVisibilityUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [4 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.inc deleted file mode 100644 index e62489f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.inc +++ /dev/null @@ -1,209 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Traits; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class UseDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 15 => 1, - 29 => 2, - 30 => 1, - 42 => 1, - 57 => 3, - 59 => 3, - 61 => 1, - 63 => 5, - 65 => 1, - 71 => 1, - 73 => 2, - 76 => 1, - 86 => 2, - 103 => 1, - 112 => 1, - 122 => 1, - 132 => 1, - 157 => 1, - 165 => 1, - 170 => 1, - 208 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/ruleset.xml deleted file mode 100644 index 312f27f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/ruleset.xml +++ /dev/null @@ -1,350 +0,0 @@ - - - The PSR-12 coding standard. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - error - Method name "%s" must not be prefixed with an underscore to indicate visibility - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - - - - - - - - - - - - - - - 0 - - - 0 - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/ClassDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/ClassDeclarationStandard.xml deleted file mode 100644 index 4e56bc0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/ClassDeclarationStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - class Foo -{ -} - ]]> - - - class Foo -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/PropertyDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/PropertyDeclarationStandard.xml deleted file mode 100644 index 042c0c6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/PropertyDeclarationStandard.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - bar; -} - ]]> - - - _bar; -} - ]]> - - - - - private $bar; -} - ]]> - - - var $bar; -} - ]]> - - - - - - - - $bar, $baz; -} - ]]> - - - - - static $bar; - private $baz; -} - ]]> - - - static protected $bar; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ControlStructureSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ControlStructureSpacingStandard.xml deleted file mode 100644 index dcbe98f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ControlStructureSpacingStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - $foo) { - $var = 1; -} - ]]> - - - $foo ) { - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ElseIfDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ElseIfDeclarationStandard.xml deleted file mode 100644 index a22dd17..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ElseIfDeclarationStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - elseif ($bar) { - $var = 2; -} - ]]> - - - else if ($bar) { - $var = 2; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/SwitchDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/SwitchDeclarationStandard.xml deleted file mode 100644 index 1d6d053..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/SwitchDeclarationStandard.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - case 'bar': - break; -} - ]]> - - - case 'bar': - break; -} - ]]> - - - - - 'bar': - break; -} - ]]> - - - 'bar': - break; -} - ]]> - - - - - : - break; - default: - break; -} - ]]> - - - : - break; - default : - break; -} - ]]> - - - - - break; -} - ]]> - - - break; -} - ]]> - - - - - // no break - default: - break; -} - ]]> - - - : - break; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/EndFileNewlineStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/EndFileNewlineStandard.xml deleted file mode 100644 index d6d3aad..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/EndFileNewlineStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/MethodDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/MethodDeclarationStandard.xml deleted file mode 100644 index e45469e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/MethodDeclarationStandard.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - bar() - { - } -} - ]]> - - - _bar() - { - } -} - ]]> - - - - - final public static function bar() - { - } -} - ]]> - - - static public final function bar() - { - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/NamespaceDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/NamespaceDeclarationStandard.xml deleted file mode 100644 index 1f4d389..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/NamespaceDeclarationStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - -use \Baz; - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/UseDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/UseDeclarationStandard.xml deleted file mode 100644 index 4082603..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/UseDeclarationStandard.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - \Foo, \Bar; - ]]> - - - - - - - - - - - - - -class Baz -{ -} - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php deleted file mode 100644 index f96b004..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php +++ /dev/null @@ -1,528 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\PEAR\Sniffs\Classes\ClassDeclarationSniff as PEARClassDeclarationSniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassDeclarationSniff extends PEARClassDeclarationSniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // We want all the errors from the PEAR standard, plus some of our own. - parent::process($phpcsFile, $stackPtr); - - // Just in case. - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - $this->processOpen($phpcsFile, $stackPtr); - $this->processClose($phpcsFile, $stackPtr); - - }//end process() - - - /** - * Processes the opening section of a class declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processOpen(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $stackPtrType = strtolower($tokens[$stackPtr]['content']); - - // Check alignment of the keyword and braces. - if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - $prevContent = $tokens[($stackPtr - 1)]['content']; - if ($prevContent !== $phpcsFile->eolChar) { - $blankSpace = substr($prevContent, strpos($prevContent, $phpcsFile->eolChar)); - $spaces = strlen($blankSpace); - - if (in_array($tokens[($stackPtr - 2)]['code'], [T_ABSTRACT, T_FINAL], true) === true - && $spaces !== 1 - ) { - $prevContent = strtolower($tokens[($stackPtr - 2)]['content']); - $error = 'Expected 1 space between %s and %s keywords; %s found'; - $data = [ - $prevContent, - $stackPtrType, - $spaces, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeKeyword', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - } - } - } else if ($tokens[($stackPtr - 2)]['code'] === T_ABSTRACT - || $tokens[($stackPtr - 2)]['code'] === T_FINAL - ) { - $prevContent = strtolower($tokens[($stackPtr - 2)]['content']); - $error = 'Expected 1 space between %s and %s keywords; newline found'; - $data = [ - $prevContent, - $stackPtrType, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NewlineBeforeKeyword', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - } - }//end if - }//end if - - // We'll need the indent of the class/interface declaration for later. - $classIndent = 0; - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if ($tokens[$i]['line'] === $tokens[$stackPtr]['line']) { - continue; - } - - // We changed lines. - if ($tokens[($i + 1)]['code'] === T_WHITESPACE) { - $classIndent = $tokens[($i + 1)]['length']; - } - - break; - } - - $className = null; - $checkSpacing = true; - - if ($tokens[$stackPtr]['code'] !== T_ANON_CLASS) { - $className = $phpcsFile->findNext(T_STRING, $stackPtr); - } else { - // Ignore the spacing check if this is a simple anon class. - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($next === $tokens[$stackPtr]['scope_opener'] - && $tokens[$next]['line'] > $tokens[$stackPtr]['line'] - ) { - $checkSpacing = false; - } - } - - if ($checkSpacing === true) { - // Spacing of the keyword. - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $gap = 0; - } else if ($tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line']) { - $gap = 'newline'; - } else { - $gap = $tokens[($stackPtr + 1)]['length']; - } - - if ($gap !== 1) { - $error = 'Expected 1 space after %s keyword; %s found'; - $data = [ - $stackPtrType, - $gap, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterKeyword', $data); - if ($fix === true) { - if ($gap === 0) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } else { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } - }//end if - - // Check after the class/interface name. - if ($className !== null - && $tokens[($className + 2)]['line'] === $tokens[$className]['line'] - ) { - $gap = $tokens[($className + 1)]['content']; - if (strlen($gap) !== 1) { - $found = strlen($gap); - $error = 'Expected 1 space after %s name; %s found'; - $data = [ - $stackPtrType, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $className, 'SpaceAfterName', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($className + 1), ' '); - } - } - } - - $openingBrace = $tokens[$stackPtr]['scope_opener']; - - // Check positions of the extends and implements keywords. - $compareToken = $stackPtr; - $compareType = 'name'; - if ($tokens[$stackPtr]['code'] === T_ANON_CLASS) { - if (isset($tokens[$stackPtr]['parenthesis_opener']) === true) { - $compareToken = $tokens[$stackPtr]['parenthesis_closer']; - $compareType = 'closing parenthesis'; - } else { - $compareType = 'keyword'; - } - } - - foreach (['extends', 'implements'] as $keywordType) { - $keyword = $phpcsFile->findNext(constant('T_'.strtoupper($keywordType)), ($compareToken + 1), $openingBrace); - if ($keyword !== false) { - if ($tokens[$keyword]['line'] !== $tokens[$compareToken]['line']) { - $error = 'The '.$keywordType.' keyword must be on the same line as the %s '.$compareType; - $data = [$stackPtrType]; - $fix = $phpcsFile->addFixableError($error, $keyword, ucfirst($keywordType).'Line', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $comments = []; - - for ($i = ($compareToken + 1); $i < $keyword; ++$i) { - if ($tokens[$i]['code'] === T_COMMENT) { - $comments[] = trim($tokens[$i]['content']); - } - - if ($tokens[$i]['code'] === T_WHITESPACE - || $tokens[$i]['code'] === T_COMMENT - ) { - $phpcsFile->fixer->replaceToken($i, ' '); - } - } - - $phpcsFile->fixer->addContent($compareToken, ' '); - if (empty($comments) === false) { - $i = $keyword; - while ($tokens[($i + 1)]['line'] === $tokens[$keyword]['line']) { - ++$i; - } - - $phpcsFile->fixer->addContentBefore($i, ' '.implode(' ', $comments)); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - } else { - // Check the whitespace before. Whitespace after is checked - // later by looking at the whitespace before the first class name - // in the list. - $gap = $tokens[($keyword - 1)]['length']; - if ($gap !== 1) { - $error = 'Expected 1 space before '.$keywordType.' keyword; %s found'; - $data = [$gap]; - $fix = $phpcsFile->addFixableError($error, $keyword, 'SpaceBefore'.ucfirst($keywordType), $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($keyword - 1), ' '); - } - } - }//end if - }//end if - }//end foreach - - // Check each of the extends/implements class names. If the extends/implements - // keyword is the last content on the line, it means we need to check for - // the multi-line format, so we do not include the class names - // from the extends/implements list in the following check. - // Note that classes can only extend one other class, so they can't use a - // multi-line extends format, whereas an interface can extend multiple - // other interfaces, and so uses a multi-line extends format. - if ($tokens[$stackPtr]['code'] === T_INTERFACE) { - $keywordTokenType = T_EXTENDS; - } else { - $keywordTokenType = T_IMPLEMENTS; - } - - $implements = $phpcsFile->findNext($keywordTokenType, ($stackPtr + 1), $openingBrace); - $multiLineImplements = false; - if ($implements !== false) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($openingBrace - 1), $implements, true); - if ($tokens[$prev]['line'] !== $tokens[$implements]['line']) { - $multiLineImplements = true; - } - } - - $find = [ - T_STRING, - $keywordTokenType, - ]; - - if ($className !== null) { - $start = $className; - } else if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { - $start = $tokens[$stackPtr]['parenthesis_closer']; - } else { - $start = $stackPtr; - } - - $classNames = []; - $nextClass = $phpcsFile->findNext($find, ($start + 2), ($openingBrace - 1)); - while ($nextClass !== false) { - $classNames[] = $nextClass; - $nextClass = $phpcsFile->findNext($find, ($nextClass + 1), ($openingBrace - 1)); - } - - $classCount = count($classNames); - $checkingImplements = false; - $implementsToken = null; - foreach ($classNames as $n => $className) { - if ($tokens[$className]['code'] === $keywordTokenType) { - $checkingImplements = true; - $implementsToken = $className; - - continue; - } - - if ($checkingImplements === true - && $multiLineImplements === true - && ($tokens[($className - 1)]['code'] !== T_NS_SEPARATOR - || $tokens[($className - 2)]['code'] !== T_STRING) - ) { - $prev = $phpcsFile->findPrevious( - [ - T_NS_SEPARATOR, - T_WHITESPACE, - ], - ($className - 1), - $implements, - true - ); - - if ($prev === $implementsToken && $tokens[$className]['line'] !== ($tokens[$prev]['line'] + 1)) { - if ($keywordTokenType === T_EXTENDS) { - $error = 'The first item in a multi-line extends list must be on the line following the extends keyword'; - $fix = $phpcsFile->addFixableError($error, $className, 'FirstExtendsInterfaceSameLine'); - } else { - $error = 'The first item in a multi-line implements list must be on the line following the implements keyword'; - $fix = $phpcsFile->addFixableError($error, $className, 'FirstInterfaceSameLine'); - } - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $className; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewline($prev); - $phpcsFile->fixer->endChangeset(); - } - } else if ($tokens[$prev]['line'] !== ($tokens[$className]['line'] - 1)) { - if ($keywordTokenType === T_EXTENDS) { - $error = 'Only one interface may be specified per line in a multi-line extends declaration'; - $fix = $phpcsFile->addFixableError($error, $className, 'ExtendsInterfaceSameLine'); - } else { - $error = 'Only one interface may be specified per line in a multi-line implements declaration'; - $fix = $phpcsFile->addFixableError($error, $className, 'InterfaceSameLine'); - } - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $className; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewline($prev); - $phpcsFile->fixer->endChangeset(); - } - } else { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($className - 1), $implements); - if ($tokens[$prev]['line'] !== $tokens[$className]['line']) { - $found = 0; - } else { - $found = $tokens[$prev]['length']; - } - - $expected = ($classIndent + $this->indent); - if ($found !== $expected) { - $error = 'Expected %s spaces before interface name; %s found'; - $data = [ - $expected, - $found, - ]; - $fix = $phpcsFile->addFixableError($error, $className, 'InterfaceWrongIndent', $data); - if ($fix === true) { - $padding = str_repeat(' ', $expected); - if ($found === 0) { - $phpcsFile->fixer->addContent($prev, $padding); - } else { - $phpcsFile->fixer->replaceToken($prev, $padding); - } - } - } - }//end if - } else if ($tokens[($className - 1)]['code'] !== T_NS_SEPARATOR - || $tokens[($className - 2)]['code'] !== T_STRING - ) { - // Not part of a longer fully qualified class name. - if ($tokens[($className - 1)]['code'] === T_COMMA - || ($tokens[($className - 1)]['code'] === T_NS_SEPARATOR - && $tokens[($className - 2)]['code'] === T_COMMA) - ) { - $error = 'Expected 1 space before "%s"; 0 found'; - $data = [$tokens[$className]['content']]; - $fix = $phpcsFile->addFixableError($error, ($nextComma + 1), 'NoSpaceBeforeName', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore(($nextComma + 1), ' '); - } - } else { - if ($tokens[($className - 1)]['code'] === T_NS_SEPARATOR) { - $prev = ($className - 2); - } else { - $prev = ($className - 1); - } - - $last = $phpcsFile->findPrevious(T_WHITESPACE, $prev, null, true); - $content = $phpcsFile->getTokensAsString(($last + 1), ($prev - $last)); - if ($content !== ' ') { - $found = strlen($content); - - $error = 'Expected 1 space before "%s"; %s found'; - $data = [ - $tokens[$className]['content'], - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $className, 'SpaceBeforeName', $data); - if ($fix === true) { - if ($tokens[$prev]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($prev, ' '); - while ($tokens[--$prev]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($prev, ' '); - } - - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->addContent($prev, ' '); - } - } - }//end if - }//end if - }//end if - - if ($checkingImplements === true - && $tokens[($className + 1)]['code'] !== T_NS_SEPARATOR - && $tokens[($className + 1)]['code'] !== T_COMMA - ) { - if ($n !== ($classCount - 1)) { - // This is not the last class name, and the comma - // is not where we expect it to be. - if ($tokens[($className + 2)]['code'] !== $keywordTokenType) { - $error = 'Expected 0 spaces between "%s" and comma; %s found'; - $data = [ - $tokens[$className]['content'], - $tokens[($className + 1)]['length'], - ]; - - $fix = $phpcsFile->addFixableError($error, $className, 'SpaceBeforeComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($className + 1), ''); - } - } - } - - $nextComma = $phpcsFile->findNext(T_COMMA, $className); - } else { - $nextComma = ($className + 1); - }//end if - }//end foreach - - }//end processOpen() - - - /** - * Processes the closing section of a class declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processClose(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check that the closing brace comes right after the code body. - $closeBrace = $tokens[$stackPtr]['scope_closer']; - $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBrace - 1), null, true); - if ($prevContent !== $tokens[$stackPtr]['scope_opener'] - && $tokens[$prevContent]['line'] !== ($tokens[$closeBrace]['line'] - 1) - ) { - $error = 'The closing brace for the %s must go on the next line after the body'; - $data = [$tokens[$stackPtr]['content']]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'CloseBraceAfterBody', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prevContent + 1); $i < $closeBrace; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - if (strpos($tokens[$prevContent]['content'], $phpcsFile->eolChar) === false) { - $phpcsFile->fixer->replaceToken($closeBrace, $phpcsFile->eolChar.$tokens[$closeBrace]['content']); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - if ($tokens[$stackPtr]['code'] !== T_ANON_CLASS) { - // Check the closing brace is on it's own line, but allow - // for comments like "//end class". - $ignoreTokens = Tokens::$phpcsCommentTokens; - $ignoreTokens[] = T_WHITESPACE; - $ignoreTokens[] = T_COMMENT; - $ignoreTokens[] = T_SEMICOLON; - $ignoreTokens[] = T_COMMA; - $nextContent = $phpcsFile->findNext($ignoreTokens, ($closeBrace + 1), null, true); - if ($tokens[$nextContent]['content'] !== $phpcsFile->eolChar - && $tokens[$nextContent]['line'] === $tokens[$closeBrace]['line'] - ) { - $type = strtolower($tokens[$stackPtr]['content']); - $error = 'Closing %s brace must be on a line by itself'; - $data = [$type]; - $phpcsFile->addError($error, $closeBrace, 'CloseBraceSameLine', $data); - } - } - - }//end processClose() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/PropertyDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/PropertyDeclarationSniff.php deleted file mode 100644 index 8a158d9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/PropertyDeclarationSniff.php +++ /dev/null @@ -1,184 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; -use PHP_CodeSniffer\Util\Tokens; - -class PropertyDeclarationSniff extends AbstractVariableSniff -{ - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['content'][1] === '_') { - $error = 'Property name "%s" should not be prefixed with an underscore to indicate visibility'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addWarning($error, $stackPtr, 'Underscore', $data); - } - - // Detect multiple properties defined at the same time. Throw an error - // for this, but also only process the first property in the list so we don't - // repeat errors. - $find = Tokens::$scopeModifiers; - $find[] = T_VARIABLE; - $find[] = T_VAR; - $find[] = T_SEMICOLON; - $find[] = T_OPEN_CURLY_BRACKET; - - $prev = $phpcsFile->findPrevious($find, ($stackPtr - 1)); - if ($tokens[$prev]['code'] === T_VARIABLE) { - return; - } - - if ($tokens[$prev]['code'] === T_VAR) { - $error = 'The var keyword must not be used to declare a property'; - $phpcsFile->addError($error, $stackPtr, 'VarUsed'); - } - - $next = $phpcsFile->findNext([T_VARIABLE, T_SEMICOLON], ($stackPtr + 1)); - if ($next !== false && $tokens[$next]['code'] === T_VARIABLE) { - $error = 'There must not be more than one property declared per statement'; - $phpcsFile->addError($error, $stackPtr, 'Multiple'); - } - - try { - $propertyInfo = $phpcsFile->getMemberProperties($stackPtr); - if (empty($propertyInfo) === true) { - return; - } - } catch (\Exception $e) { - // Turns out not to be a property after all. - return; - } - - if ($propertyInfo['type'] !== '') { - $typeToken = $propertyInfo['type_end_token']; - $error = 'There must be 1 space after the property type declaration; %s found'; - if ($tokens[($typeToken + 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $typeToken, 'SpacingAfterType', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($typeToken, ' '); - } - } else if ($tokens[($typeToken + 1)]['content'] !== ' ') { - $next = $phpcsFile->findNext(T_WHITESPACE, ($typeToken + 1), null, true); - if ($tokens[$next]['line'] !== $tokens[$typeToken]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($typeToken + 1)]['length']; - } - - $data = [$found]; - - $nextNonWs = $phpcsFile->findNext(Tokens::$emptyTokens, ($typeToken + 1), null, true); - if ($nextNonWs !== $next) { - $phpcsFile->addError($error, $typeToken, 'SpacingAfterType', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $typeToken, 'SpacingAfterType', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($typeToken + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContent($typeToken, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($typeToken + 1), ' '); - } - } - } - }//end if - }//end if - - if ($propertyInfo['scope_specified'] === false) { - $error = 'Visibility must be declared on property "%s"'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addError($error, $stackPtr, 'ScopeMissing', $data); - } - - if ($propertyInfo['scope_specified'] === true && $propertyInfo['is_static'] === true) { - $scopePtr = $phpcsFile->findPrevious(Tokens::$scopeModifiers, ($stackPtr - 1)); - $staticPtr = $phpcsFile->findPrevious(T_STATIC, ($stackPtr - 1)); - if ($scopePtr < $staticPtr) { - return; - } - - $error = 'The static declaration must come after the visibility declaration'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'StaticBeforeVisibility'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($scopePtr + 1); $scopePtr < $stackPtr; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken($scopePtr, ''); - $phpcsFile->fixer->addContentBefore($staticPtr, $propertyInfo['scope'].' '); - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - }//end processMemberVar() - - - /** - * Processes normal variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariable() - - - /** - * Processes variables in double quoted strings. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ControlStructureSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ControlStructureSpacingSniff.php deleted file mode 100644 index 7fba165..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ControlStructureSpacingSniff.php +++ /dev/null @@ -1,141 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ControlStructureSpacingSniff implements Sniff -{ - - /** - * How many spaces should follow the opening bracket. - * - * @var integer - */ - public $requiredSpacesAfterOpen = 0; - - /** - * How many spaces should precede the closing bracket. - * - * @var integer - */ - public $requiredSpacesBeforeClose = 0; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_WHILE, - T_FOREACH, - T_FOR, - T_SWITCH, - T_ELSE, - T_ELSEIF, - T_CATCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $this->requiredSpacesAfterOpen = (int) $this->requiredSpacesAfterOpen; - $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose; - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - ) { - return; - } - - $parenOpener = $tokens[$stackPtr]['parenthesis_opener']; - $parenCloser = $tokens[$stackPtr]['parenthesis_closer']; - $nextContent = $phpcsFile->findNext(T_WHITESPACE, ($parenOpener + 1), null, true); - if (in_array($tokens[$nextContent]['code'], Tokens::$commentTokens, true) === false) { - $spaceAfterOpen = 0; - if ($tokens[($parenOpener + 1)]['code'] === T_WHITESPACE) { - if (strpos($tokens[($parenOpener + 1)]['content'], $phpcsFile->eolChar) !== false) { - $spaceAfterOpen = 'newline'; - } else { - $spaceAfterOpen = $tokens[($parenOpener + 1)]['length']; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Spaces after control structure open parenthesis', $spaceAfterOpen); - - if ($spaceAfterOpen !== $this->requiredSpacesAfterOpen) { - $error = 'Expected %s spaces after opening bracket; %s found'; - $data = [ - $this->requiredSpacesAfterOpen, - $spaceAfterOpen, - ]; - $fix = $phpcsFile->addFixableError($error, ($parenOpener + 1), 'SpacingAfterOpenBrace', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesAfterOpen); - if ($spaceAfterOpen === 0) { - $phpcsFile->fixer->addContent($parenOpener, $padding); - } else if ($spaceAfterOpen === 'newline') { - $phpcsFile->fixer->replaceToken(($parenOpener + 1), ''); - } else { - $phpcsFile->fixer->replaceToken(($parenOpener + 1), $padding); - } - } - } - }//end if - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($parenCloser - 1), $parenOpener, true); - if ($tokens[$prev]['line'] === $tokens[$parenCloser]['line']) { - $spaceBeforeClose = 0; - if ($tokens[($parenCloser - 1)]['code'] === T_WHITESPACE) { - $spaceBeforeClose = strlen(ltrim($tokens[($parenCloser - 1)]['content'], $phpcsFile->eolChar)); - } - - $phpcsFile->recordMetric($stackPtr, 'Spaces before control structure close parenthesis', $spaceBeforeClose); - - if ($spaceBeforeClose !== $this->requiredSpacesBeforeClose) { - $error = 'Expected %s spaces before closing bracket; %s found'; - $data = [ - $this->requiredSpacesBeforeClose, - $spaceBeforeClose, - ]; - $fix = $phpcsFile->addFixableError($error, ($parenCloser - 1), 'SpaceBeforeCloseBrace', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesBeforeClose); - if ($spaceBeforeClose === 0) { - $phpcsFile->fixer->addContentBefore($parenCloser, $padding); - } else { - $phpcsFile->fixer->replaceToken(($parenCloser - 1), $padding); - } - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ElseIfDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ElseIfDeclarationSniff.php deleted file mode 100644 index 9f97684..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ElseIfDeclarationSniff.php +++ /dev/null @@ -1,72 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ElseIfDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_ELSE, - T_ELSEIF, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_ELSEIF) { - $phpcsFile->recordMetric($stackPtr, 'Use of ELSE IF or ELSEIF', 'elseif'); - return; - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_IF) { - $phpcsFile->recordMetric($stackPtr, 'Use of ELSE IF or ELSEIF', 'else if'); - $error = 'Usage of ELSE IF is discouraged; use ELSEIF instead'; - $fix = $phpcsFile->addFixableWarning($error, $stackPtr, 'NotAllowed'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($stackPtr, 'elseif'); - for ($i = ($stackPtr + 1); $i <= $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php deleted file mode 100644 index c38a10d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php +++ /dev/null @@ -1,318 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SwitchDeclarationSniff implements Sniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_SWITCH]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // We can't process SWITCH statements unless we know where they start and end. - if (isset($tokens[$stackPtr]['scope_opener']) === false - || isset($tokens[$stackPtr]['scope_closer']) === false - ) { - return; - } - - $switch = $tokens[$stackPtr]; - $nextCase = $stackPtr; - $caseAlignment = ($switch['column'] + $this->indent); - - while (($nextCase = $this->findNextCase($phpcsFile, ($nextCase + 1), $switch['scope_closer'])) !== false) { - if ($tokens[$nextCase]['code'] === T_DEFAULT) { - $type = 'default'; - } else { - $type = 'case'; - } - - if ($tokens[$nextCase]['content'] !== strtolower($tokens[$nextCase]['content'])) { - $expected = strtolower($tokens[$nextCase]['content']); - $error = strtoupper($type).' keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - $expected, - $tokens[$nextCase]['content'], - ]; - - $fix = $phpcsFile->addFixableError($error, $nextCase, $type.'NotLower', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($nextCase, $expected); - } - } - - if ($type === 'case' - && ($tokens[($nextCase + 1)]['code'] !== T_WHITESPACE - || $tokens[($nextCase + 1)]['content'] !== ' ') - ) { - $error = 'CASE keyword must be followed by a single space'; - $fix = $phpcsFile->addFixableError($error, $nextCase, 'SpacingAfterCase'); - if ($fix === true) { - if ($tokens[($nextCase + 1)]['code'] !== T_WHITESPACE) { - $phpcsFile->fixer->addContent($nextCase, ' '); - } else { - $phpcsFile->fixer->replaceToken(($nextCase + 1), ' '); - } - } - } - - $opener = $tokens[$nextCase]['scope_opener']; - $nextCloser = $tokens[$nextCase]['scope_closer']; - if ($tokens[$opener]['code'] === T_COLON) { - if ($tokens[($opener - 1)]['code'] === T_WHITESPACE) { - $error = 'There must be no space before the colon in a '.strtoupper($type).' statement'; - $fix = $phpcsFile->addFixableError($error, $nextCase, 'SpaceBeforeColon'.strtoupper($type)); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($opener - 1), ''); - } - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$opener]['line'] - && ($tokens[$next]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$next]['code']]) === true) - ) { - // Skip comments on the same line. - $next = $phpcsFile->findNext(T_WHITESPACE, ($next + 1), null, true); - } - - if ($tokens[$next]['line'] !== ($tokens[$opener]['line'] + 1)) { - $error = 'The '.strtoupper($type).' body must start on the line following the statement'; - $fix = $phpcsFile->addFixableError($error, $nextCase, 'BodyOnNextLine'.strtoupper($type)); - if ($fix === true) { - if ($tokens[$next]['line'] === $tokens[$opener]['line']) { - $padding = str_repeat(' ', ($caseAlignment + $this->indent - 1)); - $phpcsFile->fixer->addContentBefore($next, $phpcsFile->eolChar.$padding); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($opener + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewLineBefore($i); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - if ($tokens[$nextCloser]['scope_condition'] === $nextCase) { - // Only need to check some things once, even if the - // closer is shared between multiple case statements, or even - // the default case. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($nextCloser - 1), $nextCase, true); - if ($tokens[$prev]['line'] === $tokens[$nextCloser]['line']) { - $error = 'Terminating statement must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $nextCloser, 'BreakNotNewLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewLine($prev); - $phpcsFile->fixer->replaceToken($nextCloser, trim($tokens[$nextCloser]['content'])); - } - } else { - $diff = ($caseAlignment + $this->indent - $tokens[$nextCloser]['column']); - if ($diff !== 0) { - $error = 'Terminating statement must be indented to the same level as the CASE body'; - $fix = $phpcsFile->addFixableError($error, $nextCloser, 'BreakIndent'); - if ($fix === true) { - if ($diff > 0) { - $phpcsFile->fixer->addContentBefore($nextCloser, str_repeat(' ', $diff)); - } else { - $phpcsFile->fixer->substrToken(($nextCloser - 1), 0, $diff); - } - } - } - }//end if - }//end if - } else { - $error = strtoupper($type).' statements must be defined using a colon'; - $phpcsFile->addError($error, $nextCase, 'WrongOpener'.$type); - }//end if - - // We only want cases from here on in. - if ($type !== 'case') { - continue; - } - - $nextCode = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), $nextCloser, true); - - if ($tokens[$nextCode]['code'] !== T_CASE && $tokens[$nextCode]['code'] !== T_DEFAULT) { - // This case statement has content. If the next case or default comes - // before the closer, it means we don't have an obvious terminating - // statement and need to make some more effort to find one. If we - // don't, we do need a comment. - $nextCode = $this->findNextCase($phpcsFile, ($opener + 1), $nextCloser); - if ($nextCode !== false) { - $prevCode = $phpcsFile->findPrevious(T_WHITESPACE, ($nextCode - 1), $nextCase, true); - if ($tokens[$prevCode]['code'] !== T_COMMENT - && $this->findNestedTerminator($phpcsFile, ($opener + 1), $nextCode) === false - ) { - $error = 'There must be a comment when fall-through is intentional in a non-empty case body'; - $phpcsFile->addError($error, $nextCase, 'TerminatingComment'); - } - } - } - }//end while - - }//end process() - - - /** - * Find the next CASE or DEFAULT statement from a point in the file. - * - * Note that nested switches are ignored. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position to start looking at. - * @param int $end The position to stop looking at. - * - * @return int|false - */ - private function findNextCase($phpcsFile, $stackPtr, $end) - { - $tokens = $phpcsFile->getTokens(); - while (($stackPtr = $phpcsFile->findNext([T_CASE, T_DEFAULT, T_SWITCH], $stackPtr, $end)) !== false) { - // Skip nested SWITCH statements; they are handled on their own. - if ($tokens[$stackPtr]['code'] === T_SWITCH) { - $stackPtr = $tokens[$stackPtr]['scope_closer']; - continue; - } - - break; - } - - return $stackPtr; - - }//end findNextCase() - - - /** - * Returns true if a nested terminating statement is found. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position to start looking at. - * @param int $end The position to stop looking at. - * - * @return bool - */ - private function findNestedTerminator($phpcsFile, $stackPtr, $end) - { - $tokens = $phpcsFile->getTokens(); - $terminators = [ - T_RETURN, - T_BREAK, - T_CONTINUE, - T_THROW, - T_EXIT, - ]; - - $lastToken = $phpcsFile->findPrevious(T_WHITESPACE, ($end - 1), $stackPtr, true); - if ($lastToken !== false) { - if ($tokens[$lastToken]['code'] === T_CLOSE_CURLY_BRACKET) { - // We found a closing curly bracket and want to check if its - // block belongs to an IF, ELSEIF or ELSE clause. If yes, we - // continue searching for a terminating statement within that - // block. Note that we have to make sure that every block of - // the entire if/else statement has a terminating statement. - $currentCloser = $lastToken; - $hasElseBlock = false; - do { - $scopeOpener = $tokens[$currentCloser]['scope_opener']; - $scopeCloser = $tokens[$currentCloser]['scope_closer']; - - $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($scopeOpener - 1), $stackPtr, true); - if ($prevToken === false) { - return false; - } - - // IF and ELSEIF clauses possess a condition we have to account for. - if ($tokens[$prevToken]['code'] === T_CLOSE_PARENTHESIS) { - $prevToken = $tokens[$prevToken]['parenthesis_owner']; - } - - if ($tokens[$prevToken]['code'] === T_IF) { - // If we have not encountered an ELSE clause by now, we cannot - // be sure that the whole statement terminates in every case. - if ($hasElseBlock === false) { - return false; - } - - return $this->findNestedTerminator($phpcsFile, ($scopeOpener + 1), $scopeCloser); - } else if ($tokens[$prevToken]['code'] === T_ELSEIF - || $tokens[$prevToken]['code'] === T_ELSE - ) { - // If we find a terminating statement within this block, - // we continue with the previous ELSEIF or IF clause. - $hasTerminator = $this->findNestedTerminator($phpcsFile, ($scopeOpener + 1), $scopeCloser); - if ($hasTerminator === false) { - return false; - } - - $currentCloser = $phpcsFile->findPrevious(T_WHITESPACE, ($prevToken - 1), $stackPtr, true); - if ($tokens[$prevToken]['code'] === T_ELSE) { - $hasElseBlock = true; - } - } else { - return false; - }//end if - } while ($currentCloser !== false && $tokens[$currentCloser]['code'] === T_CLOSE_CURLY_BRACKET); - - return true; - } else if ($tokens[$lastToken]['code'] === T_SEMICOLON) { - // We found the last statement of the CASE. Now we want to - // check whether it is a terminating one. - $terminator = $phpcsFile->findStartOfStatement(($lastToken - 1)); - if (in_array($tokens[$terminator]['code'], $terminators, true) === true) { - return $terminator; - } - }//end if - }//end if - - return false; - - }//end findNestedTerminator() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php deleted file mode 100644 index 853a3a5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClosingTagSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Make sure this file only contains PHP code. - for ($i = 0; $i < $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['code'] === T_INLINE_HTML - && trim($tokens[$i]['content']) !== '' - ) { - return $phpcsFile->numTokens; - } - } - - // Find the last non-empty token. - for ($last = ($phpcsFile->numTokens - 1); $last > 0; $last--) { - if (trim($tokens[$last]['content']) !== '') { - break; - } - } - - if ($tokens[$last]['code'] === T_CLOSE_TAG) { - $error = 'A closing tag is not permitted at the end of a PHP file'; - $fix = $phpcsFile->addFixableError($error, $last, 'NotAllowed'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($last, $phpcsFile->eolChar); - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($last - 1), null, true); - if ($tokens[$prev]['code'] !== T_SEMICOLON - && $tokens[$prev]['code'] !== T_CLOSE_CURLY_BRACKET - ) { - $phpcsFile->fixer->addContent($prev, ';'); - } - - $phpcsFile->fixer->endChangeset(); - } - - $phpcsFile->recordMetric($stackPtr, 'PHP closing tag at end of PHP-only file', 'yes'); - } else { - $phpcsFile->recordMetric($stackPtr, 'PHP closing tag at end of PHP-only file', 'no'); - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php deleted file mode 100644 index 241fa5a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php +++ /dev/null @@ -1,104 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class EndFileNewlineSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($phpcsFile->findNext(T_INLINE_HTML, ($stackPtr + 1)) !== false) { - return ($phpcsFile->numTokens + 1); - } - - // Skip to the end of the file. - $tokens = $phpcsFile->getTokens(); - $lastToken = ($phpcsFile->numTokens - 1); - - if ($tokens[$lastToken]['content'] === '') { - $lastToken--; - } - - // Hard-coding the expected \n in this sniff as it is PSR-2 specific and - // PSR-2 enforces the use of unix style newlines. - if (substr($tokens[$lastToken]['content'], -1) !== "\n") { - $error = 'Expected 1 newline at end of file; 0 found'; - $fix = $phpcsFile->addFixableError($error, $lastToken, 'NoneFound'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($lastToken); - } - - $phpcsFile->recordMetric($stackPtr, 'Number of newlines at EOF', '0'); - return ($phpcsFile->numTokens + 1); - } - - // Go looking for the last non-empty line. - $lastLine = $tokens[$lastToken]['line']; - if ($tokens[$lastToken]['code'] === T_WHITESPACE - || $tokens[$lastToken]['code'] === T_DOC_COMMENT_WHITESPACE - ) { - $lastCode = $phpcsFile->findPrevious([T_WHITESPACE, T_DOC_COMMENT_WHITESPACE], ($lastToken - 1), null, true); - } else { - $lastCode = $lastToken; - } - - $lastCodeLine = $tokens[$lastCode]['line']; - $blankLines = ($lastLine - $lastCodeLine + 1); - $phpcsFile->recordMetric($stackPtr, 'Number of newlines at EOF', $blankLines); - - if ($blankLines > 1) { - $error = 'Expected 1 blank line at end of file; %s found'; - $data = [$blankLines]; - $fix = $phpcsFile->addFixableError($error, $lastCode, 'TooMany', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($lastCode, rtrim($tokens[$lastCode]['content'])); - for ($i = ($lastCode + 1); $i < $lastToken; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken($lastToken, $phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - } - - // Skip the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php deleted file mode 100644 index d7a6522..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php +++ /dev/null @@ -1,79 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\FunctionCallSignatureSniff as PEARFunctionCallSignatureSniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionCallSignatureSniff extends PEARFunctionCallSignatureSniff -{ - - /** - * If TRUE, multiple arguments can be defined per line in a multi-line call. - * - * @var boolean - */ - public $allowMultipleArguments = false; - - - /** - * Processes single-line calls. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function isMultiLineCall(File $phpcsFile, $stackPtr, $openBracket, $tokens) - { - // If the first argument is on a new line, this is a multi-line - // function call, even if there is only one argument. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($openBracket + 1), null, true); - if ($tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - return true; - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - $end = $phpcsFile->findEndOfStatement($openBracket + 1); - while ($tokens[$end]['code'] === T_COMMA) { - // If the next bit of code is not on the same line, this is a - // multi-line function call. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), $closeBracket, true); - if ($next === false) { - return false; - } - - if ($tokens[$next]['line'] !== $tokens[$end]['line']) { - return true; - } - - $end = $phpcsFile->findEndOfStatement($next); - } - - // We've reached the last argument, so see if the next content - // (should be the close bracket) is also on the same line. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), $closeBracket, true); - if ($next !== false && $tokens[$next]['line'] !== $tokens[$end]['line']) { - return true; - } - - return false; - - }//end isMultiLineCall() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php deleted file mode 100644 index 1e11f02..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FunctionClosingBraceSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - // Probably an interface method. - return; - } - - $closeBrace = $tokens[$stackPtr]['scope_closer']; - $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBrace - 1), null, true); - $found = ($tokens[$closeBrace]['line'] - $tokens[$prevContent]['line'] - 1); - - if ($found < 0) { - // Brace isn't on a new line, so not handled by us. - return; - } - - if ($found === 0) { - // All is good. - return; - } - - $error = 'Function closing brace must go on the next line following the body; found %s blank lines before brace'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpacingBeforeClose', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prevContent + 1); $i < $closeBrace; $i++) { - if ($tokens[$i]['line'] === $tokens[$prevContent]['line']) { - continue; - } - - // Don't remove any indentation before the brace. - if ($tokens[$i]['line'] === $tokens[$closeBrace]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php deleted file mode 100644 index d23b8be..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php +++ /dev/null @@ -1,162 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Tokens; - -class MethodDeclarationSniff extends AbstractScopeSniff -{ - - - /** - * Constructs a Squiz_Sniffs_Scope_MethodScopeSniff. - */ - public function __construct() - { - parent::__construct(Tokens::$ooScopeTokens, [T_FUNCTION]); - - }//end __construct() - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * @param int $currScope The current scope opener token. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Ignore closures. - return; - } - - if ($methodName[0] === '_' && isset($methodName[1]) === true && $methodName[1] !== '_') { - $error = 'Method name "%s" should not be prefixed with an underscore to indicate visibility'; - $data = [$methodName]; - $phpcsFile->addWarning($error, $stackPtr, 'Underscore', $data); - } - - $visibility = 0; - $static = 0; - $abstract = 0; - $final = 0; - - $find = (Tokens::$methodPrefixes + Tokens::$emptyTokens); - $prev = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true); - - $prefix = $stackPtr; - while (($prefix = $phpcsFile->findPrevious(Tokens::$methodPrefixes, ($prefix - 1), $prev)) !== false) { - switch ($tokens[$prefix]['code']) { - case T_STATIC: - $static = $prefix; - break; - case T_ABSTRACT: - $abstract = $prefix; - break; - case T_FINAL: - $final = $prefix; - break; - default: - $visibility = $prefix; - break; - } - } - - $fixes = []; - - if ($visibility !== 0 && $final > $visibility) { - $error = 'The final declaration must precede the visibility declaration'; - $fix = $phpcsFile->addFixableError($error, $final, 'FinalAfterVisibility'); - if ($fix === true) { - $fixes[$final] = ''; - $fixes[($final + 1)] = ''; - if (isset($fixes[$visibility]) === true) { - $fixes[$visibility] = 'final '.$fixes[$visibility]; - } else { - $fixes[$visibility] = 'final '.$tokens[$visibility]['content']; - } - } - } - - if ($visibility !== 0 && $abstract > $visibility) { - $error = 'The abstract declaration must precede the visibility declaration'; - $fix = $phpcsFile->addFixableError($error, $abstract, 'AbstractAfterVisibility'); - if ($fix === true) { - $fixes[$abstract] = ''; - $fixes[($abstract + 1)] = ''; - if (isset($fixes[$visibility]) === true) { - $fixes[$visibility] = 'abstract '.$fixes[$visibility]; - } else { - $fixes[$visibility] = 'abstract '.$tokens[$visibility]['content']; - } - } - } - - if ($static !== 0 && $static < $visibility) { - $error = 'The static declaration must come after the visibility declaration'; - $fix = $phpcsFile->addFixableError($error, $static, 'StaticBeforeVisibility'); - if ($fix === true) { - $fixes[$static] = ''; - $fixes[($static + 1)] = ''; - if (isset($fixes[$visibility]) === true) { - $fixes[$visibility] .= ' static'; - } else { - $fixes[$visibility] = $tokens[$visibility]['content'].' static'; - } - } - } - - // Batch all the fixes together to reduce the possibility of conflicts. - if (empty($fixes) === false) { - $phpcsFile->fixer->beginChangeset(); - foreach ($fixes as $stackPtr => $content) { - $phpcsFile->fixer->replaceToken($stackPtr, $content); - } - - $phpcsFile->fixer->endChangeset(); - } - - }//end processTokenWithinScope() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php deleted file mode 100644 index 9607dcc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php +++ /dev/null @@ -1,93 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Namespaces; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class NamespaceDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_NAMESPACE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $end = $phpcsFile->findEndOfStatement($stackPtr); - for ($i = ($end + 1); $i < ($phpcsFile->numTokens - 1); $i++) { - if ($tokens[$i]['line'] === $tokens[$end]['line']) { - continue; - } - - break; - } - - // The $i var now points to the first token on the line after the - // namespace declaration, which must be a blank line. - $next = $phpcsFile->findNext(T_WHITESPACE, $i, $phpcsFile->numTokens, true); - if ($next === false) { - return; - } - - $diff = ($tokens[$next]['line'] - $tokens[$i]['line']); - if ($diff === 1) { - return; - } - - if ($diff < 0) { - $diff = 0; - } - - $error = 'There must be one blank line after the namespace declaration'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'BlankLineAfter'); - - if ($fix === true) { - if ($diff === 0) { - $phpcsFile->fixer->addNewlineBefore($i); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($x = $i; $x < $next; $x++) { - if ($tokens[$x]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addNewline($i); - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php deleted file mode 100644 index ea26657..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php +++ /dev/null @@ -1,293 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Namespaces; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UseDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_USE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->shouldIgnoreUse($phpcsFile, $stackPtr) === true) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - // One space after the use keyword. - if ($tokens[($stackPtr + 1)]['content'] !== ' ') { - $error = 'There must be a single space after the USE keyword'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterUse'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - - // Only one USE declaration allowed per statement. - $next = $phpcsFile->findNext([T_COMMA, T_SEMICOLON, T_OPEN_USE_GROUP, T_CLOSE_TAG], ($stackPtr + 1)); - if ($next !== false - && $tokens[$next]['code'] !== T_SEMICOLON - && $tokens[$next]['code'] !== T_CLOSE_TAG - ) { - $error = 'There must be one USE keyword per declaration'; - - if ($tokens[$next]['code'] === T_COMMA) { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'MultipleDeclarations'); - if ($fix === true) { - switch ($tokens[($stackPtr + 2)]['content']) { - case 'const': - $baseUse = 'use const'; - break; - case 'function': - $baseUse = 'use function'; - break; - default: - $baseUse = 'use'; - } - - $phpcsFile->fixer->replaceToken($next, ';'.$phpcsFile->eolChar.$baseUse); - } - } else { - $closingCurly = $phpcsFile->findNext(T_CLOSE_USE_GROUP, ($next + 1)); - if ($closingCurly === false) { - // Parse error or live coding. Not auto-fixable. - $phpcsFile->addError($error, $stackPtr, 'MultipleDeclarations'); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'MultipleDeclarations'); - if ($fix === true) { - $baseUse = rtrim($phpcsFile->getTokensAsString($stackPtr, ($next - $stackPtr))); - $lastNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($closingCurly - 1), null, true); - - $phpcsFile->fixer->beginChangeset(); - - // Remove base use statement. - for ($i = $stackPtr; $i <= $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - if (preg_match('`^[\r\n]+$`', $tokens[($next + 1)]['content']) === 1) { - $phpcsFile->fixer->replaceToken(($next + 1), ''); - } - - // Convert grouped use statements into full use statements. - do { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), $closingCurly, true); - if ($next === false) { - // Group use statement with trailing comma after last item. - break; - } - - $nonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($next - 1), null, true); - for ($i = ($nonWhitespace + 1); $i < $next; $i++) { - if (preg_match('`^[\r\n]+$`', $tokens[$i]['content']) === 1) { - // Preserve new lines. - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - if ($tokens[$next]['content'] === 'const' || $tokens[$next]['content'] === 'function') { - $phpcsFile->fixer->addContentBefore($next, 'use '); - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), $closingCurly, true); - $phpcsFile->fixer->addContentBefore($next, str_replace('use ', '', $baseUse)); - } else { - $phpcsFile->fixer->addContentBefore($next, $baseUse); - } - - $next = $phpcsFile->findNext(T_COMMA, ($next + 1), $closingCurly); - if ($next !== false) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), $closingCurly, true); - if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['line'] === $tokens[$next]['line']) { - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($nextNonEmpty - 1), $next, true); - if ($prevNonWhitespace === $next) { - $phpcsFile->fixer->replaceToken($next, ';'.$phpcsFile->eolChar); - } else { - $phpcsFile->fixer->replaceToken($next, ';'); - $phpcsFile->fixer->addNewline($prevNonWhitespace); - } - } else { - // Last item with trailing comma or next item already on new line. - $phpcsFile->fixer->replaceToken($next, ';'); - } - } else { - // Last item without trailing comma. - $phpcsFile->fixer->addContent($lastNonWhitespace, ';'); - } - } while ($next !== false); - - // Remove closing curly,semi-colon and any whitespace between last child and closing curly. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($closingCurly + 1), null, true); - if ($next === false || $tokens[$next]['code'] !== T_SEMICOLON) { - // Parse error, forgotten semi-colon. - $next = $closingCurly; - } - - for ($i = ($lastNonWhitespace + 1); $i <= $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - }//end if - }//end if - - // Make sure this USE comes after the first namespace declaration. - $prev = $phpcsFile->findPrevious(T_NAMESPACE, ($stackPtr - 1)); - if ($prev === false) { - $next = $phpcsFile->findNext(T_NAMESPACE, ($stackPtr + 1)); - if ($next !== false) { - $error = 'USE declarations must go after the namespace declaration'; - $phpcsFile->addError($error, $stackPtr, 'UseBeforeNamespace'); - } - } - - // Only interested in the last USE statement from here onwards. - $nextUse = $phpcsFile->findNext(T_USE, ($stackPtr + 1)); - while ($this->shouldIgnoreUse($phpcsFile, $nextUse) === true) { - $nextUse = $phpcsFile->findNext(T_USE, ($nextUse + 1)); - if ($nextUse === false) { - break; - } - } - - if ($nextUse !== false) { - return; - } - - $end = $phpcsFile->findNext([T_SEMICOLON, T_CLOSE_USE_GROUP, T_CLOSE_TAG], ($stackPtr + 1)); - if ($end === false) { - return; - } - - if ($tokens[$end]['code'] === T_CLOSE_USE_GROUP) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - if ($tokens[$nextNonEmpty]['code'] === T_SEMICOLON) { - $end = $nextNonEmpty; - } - } - - // Find either the start of the next line or the beginning of the next statement, - // whichever comes first. - for ($end = ++$end; $end < $phpcsFile->numTokens; $end++) { - if (isset(Tokens::$emptyTokens[$tokens[$end]['code']]) === false) { - break; - } - - if ($tokens[$end]['column'] === 1) { - // Reached the next line. - break; - } - } - - --$end; - - if (($tokens[$end]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$end]['code']]) === true) - && substr($tokens[$end]['content'], 0, 2) === '/*' - && substr($tokens[$end]['content'], -2) !== '*/' - ) { - // Multi-line block comments are not allowed as trailing comment after a use statement. - --$end; - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($end + 1), null, true); - - if ($next === false || $tokens[$next]['code'] === T_CLOSE_TAG) { - return; - } - - $diff = ($tokens[$next]['line'] - $tokens[$end]['line'] - 1); - if ($diff !== 1) { - if ($diff < 0) { - $diff = 0; - } - - $error = 'There must be one blank line after the last USE statement; %s found;'; - $data = [$diff]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterLastUse', $data); - if ($fix === true) { - if ($diff === 0) { - $phpcsFile->fixer->addNewline($end); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($end + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewline($end); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - }//end process() - - - /** - * Check if this use statement is part of the namespace block. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return bool - */ - private function shouldIgnoreUse($phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore USE keywords inside closures and during live coding. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next === false || $tokens[$next]['code'] === T_OPEN_PARENTHESIS) { - return true; - } - - // Ignore USE keywords for traits. - if ($phpcsFile->hasCondition($stackPtr, [T_CLASS, T_TRAIT]) === true) { - return true; - } - - return false; - - }//end shouldIgnoreUse() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc deleted file mode 100644 index 13e596e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc +++ /dev/null @@ -1,241 +0,0 @@ -anonymous = new class extends ArrayObject - { - public function __construct() - { - parent::__construct(['a' => 1, 'b' => 2]); - } - }; - } -} - -class A extends B - implements C -{ -} - -class C2 -{ - -} // phpcs:ignore Standard.Category.Sniff - -interface I1 extends - Foo -{ -} - -interface I2 extends - Bar -{ -} - -interface I3 extends - Foo, - Bar -{ -} - -class C1 extends - Foo -{ -} - -class C2 extends - Bar -{ -} - -class C3 extends Foo implements - Bar -{ -} - -class C4 extends Foo implements - Bar -{ -} - -class C5 extends Foo implements - Bar, - Baz -{ -} - -class C6 extends \Foo\Bar implements - \Baz\Bar -{ -} - -interface I4 extends - \Baz - \Bar -{ -} - -interface I5 extends /* comment */ - \Foo\Bar -{ -} - -interface I6 extends // comment - \Foo\Bar -{ -} - -class C7 extends // comment - \Foo\Bar implements \Baz\Bar -{ -} - -class -C8 -{ -} - -foo(new class { -}); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc.fixed deleted file mode 100644 index 3ee394e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,234 +0,0 @@ -anonymous = new class extends ArrayObject - { - public function __construct() - { - parent::__construct(['a' => 1, 'b' => 2]); - } - }; - } -} - -class A extends B implements C -{ -} - -class C2 -{ - -} // phpcs:ignore Standard.Category.Sniff - -interface I1 extends - Foo -{ -} - -interface I2 extends - Bar -{ -} - -interface I3 extends - Foo, - Bar -{ -} - -class C1 extends Foo -{ -} - -class C2 extends Bar -{ -} - -class C3 extends Foo implements - Bar -{ -} - -class C4 extends Foo implements - Bar -{ -} - -class C5 extends Foo implements - Bar, - Baz -{ -} - -class C6 extends \Foo\Bar implements - \Baz\Bar -{ -} - -interface I4 extends - \Baz\Bar -{ -} - -interface I5 extends /* comment */ - \Foo\Bar -{ -} - -interface I6 extends // comment - \Foo\Bar -{ -} - -class C7 extends \Foo\Bar implements \Baz\Bar // comment -{ -} - -class C8 -{ -} - -foo(new class { -}); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.php deleted file mode 100644 index 635ac71..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClassDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 7 => 3, - 12 => 1, - 13 => 1, - 17 => 1, - 19 => 2, - 20 => 1, - 21 => 1, - 22 => 1, - 25 => 1, - 27 => 2, - 34 => 1, - 35 => 2, - 44 => 1, - 45 => 1, - 63 => 1, - 95 => 1, - 116 => 1, - 118 => 1, - 119 => 1, - 124 => 1, - 130 => 2, - 131 => 1, - 158 => 1, - 168 => 1, - 178 => 1, - 179 => 1, - 184 => 1, - 189 => 1, - 194 => 1, - 204 => 1, - 205 => 1, - 210 => 1, - 215 => 2, - 216 => 1, - 231 => 2, - 235 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.inc deleted file mode 100644 index 031d2a8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.inc +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class PropertyDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 9 => 2, - 10 => 1, - 11 => 1, - 17 => 1, - 18 => 1, - 23 => 1, - 38 => 1, - 41 => 1, - 42 => 1, - 50 => 2, - 51 => 1, - 55 => 1, - 56 => 1, - 61 => 1, - 62 => 1, - 68 => 1, - 69 => 1, - 71 => 1, - 72 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 13 => 1, - 14 => 1, - 15 => 1, - 53 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc deleted file mode 100644 index 24de0dc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc +++ /dev/null @@ -1,70 +0,0 @@ - $that) {} -foreach ( $something as $blah => $that ) {} -foreach ( $something as $blah => $that ) {} -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesAfterOpen 0 -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesBeforeClose 0 - -$binary = b"binary string"; - -if ($expr1 - && $expr2 ) { -} - -if ($expr1 - && $expr2 /* comment */ ) { -} - -if ($expr1 - && $expr2 - /* comment */ ) { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed deleted file mode 100644 index f57e792..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,69 +0,0 @@ - $that ) {} -foreach ( $something as $blah => $that ) {} -foreach ( $something as $blah => $that ) {} -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesAfterOpen 0 -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesBeforeClose 0 - -$binary = b"binary string"; - -if ($expr1 - && $expr2) { -} - -if ($expr1 - && $expr2 /* comment */) { -} - -if ($expr1 - && $expr2 - /* comment */) { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.php deleted file mode 100644 index b7b2519..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ControlStructureSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 14 => 2, - 26 => 2, - 27 => 2, - 31 => 1, - 51 => 2, - 53 => 2, - 60 => 1, - 64 => 1, - 69 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc deleted file mode 100644 index 778659c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc +++ /dev/null @@ -1,17 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc.fixed deleted file mode 100644 index 4a7bfdc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,17 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.php deleted file mode 100644 index 935205b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ElseIfDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 4 => 1, - 12 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc deleted file mode 100644 index af605cd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc +++ /dev/null @@ -1,273 +0,0 @@ - 0) { - return 0; - } else { - return 1; - } - case 2: - return 2; -} - -// ERROR: No else clause -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } elseif ($bar < 0) { - return 1; - } - case 2: - return 2; -} - -// OK: No fall-through present -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } elseif ($bar < 0) { - return 1; - } -} - -// ERROR: No else clause (nested) -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } else { - if ($foo > $bar) { - continue; - } - } - case 2: - return 2; -} - -// OK: Every clause terminates -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } else { - if ($foo > $bar) { - continue; - } else { - break; - } - } - case 2: - return 2; -} - -// ERROR: Non-termination IF clause -switch ($foo) { - case 1: - if ($bar > 0) { - $offset = 0; - } else { - break; - } - case 2: - return 2; -} - -// ERROR: Non-termination IF clause (nested) -switch ($foo) { - case 1: - if ($bar > 0) { - continue; - } else { - if ($foo > $bar) { - $offset = 0; - } else { - break; - } - } - case 2: - return 2; -} - -switch ($sContext) -{ - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -$foo = $foo ? - function () { - switch ($a) { - case 'a': - break; - } - } : - null; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc.fixed deleted file mode 100644 index d5671fe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,276 +0,0 @@ - 0) { - return 0; - } else { - return 1; - } - case 2: - return 2; -} - -// ERROR: No else clause -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } elseif ($bar < 0) { - return 1; - } - case 2: - return 2; -} - -// OK: No fall-through present -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } elseif ($bar < 0) { - return 1; - } -} - -// ERROR: No else clause (nested) -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } else { - if ($foo > $bar) { - continue; - } - } - case 2: - return 2; -} - -// OK: Every clause terminates -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } else { - if ($foo > $bar) { - continue; - } else { - break; - } - } - case 2: - return 2; -} - -// ERROR: Non-termination IF clause -switch ($foo) { - case 1: - if ($bar > 0) { - $offset = 0; - } else { - break; - } - case 2: - return 2; -} - -// ERROR: Non-termination IF clause (nested) -switch ($foo) { - case 1: - if ($bar > 0) { - continue; - } else { - if ($foo > $bar) { - $offset = 0; - } else { - break; - } - } - case 2: - return 2; -} - -switch ($sContext) -{ - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -$foo = $foo ? - function () { - switch ($a) { - case 'a': - break; - } - } : - null; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.php deleted file mode 100644 index 9c17355..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class SwitchDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 10 => 1, - 11 => 1, - 14 => 1, - 16 => 1, - 20 => 1, - 23 => 1, - 29 => 1, - 33 => 1, - 37 => 2, - 108 => 2, - 109 => 1, - 111 => 1, - 113 => 2, - 114 => 1, - 128 => 1, - 141 => 1, - 172 => 1, - 194 => 1, - 224 => 1, - 236 => 1, - 260 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc deleted file mode 100644 index 738e70e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc.fixed deleted file mode 100644 index f70b9eb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc.fixed +++ /dev/null @@ -1,12 +0,0 @@ - - -
    - -
    \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.3.inc deleted file mode 100644 index d6a8617..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.3.inc +++ /dev/null @@ -1,7 +0,0 @@ - - -A: -B: -C: \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc deleted file mode 100644 index dd103cd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc.fixed deleted file mode 100644 index 1058f1f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc.fixed +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.5.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.5.inc.fixed deleted file mode 100644 index 93d55fb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.5.inc.fixed +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.6.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.6.inc.fixed deleted file mode 100644 index 534574d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.6.inc.fixed +++ /dev/null @@ -1,5 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClosingTagUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ClosingTagUnitTest.1.inc': - return [11 => 1]; - - case 'ClosingTagUnitTest.4.inc': - case 'ClosingTagUnitTest.5.inc': - return [1 => 1]; - - case 'ClosingTagUnitTest.6.inc': - return [5 => 1]; - - default: - return []; - } - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.1.inc deleted file mode 100644 index ca2a749..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.1.inc +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.5.inc deleted file mode 100644 index c3a59b6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.5.inc +++ /dev/null @@ -1,6 +0,0 @@ - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class EndFileNewlineUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'EndFileNewlineUnitTest.1.inc': - case 'EndFileNewlineUnitTest.3.inc': - case 'EndFileNewlineUnitTest.6.inc': - case 'EndFileNewlineUnitTest.7.inc': - case 'EndFileNewlineUnitTest.9.inc': - case 'EndFileNewlineUnitTest.10.inc': - return [2 => 1]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc deleted file mode 100644 index dcaf00b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc +++ /dev/null @@ -1,244 +0,0 @@ -get('/hello/{name}', function ($name) use ($app) { - return 'Hello '.$app->escape($name); -}, array( - '1', - '2', - '3', -)); - -// error -somefunction2($foo, $bar, [ - // ... - ], -$baz); - -// ok -somefunction3(// ... - $foo, - $bar, - [ - // ... - ], - $baz -); - -// ok -somefunction4(' - this should not - give an error - because it\'s actually - one line call - with multi-line string -'); - -// ok -somefunction5("hey, -multi-line string with some -extra args", $foo, 12); - -// error -somefunction6(' - but args in a new line - are not ok… - ', - $foo -); - -$this->setFoo(true - ? 1 - : 2, false, array( - 'value', - 'more')); - -$this->setFoo('some' - . 'long' - . 'text', 'string'); - -foo(bar(), $a); -foo();bar(); - -foo( - true -); - -myFunction(<< function ($x) { - return true; - }, - 'baz' => false - ) -); -$qux = array_filter( - $quux, function ($x) { - return $x; - } -); - -$this->listeners[] = $events->getSharedManager()->attach( - 'Zend\Mvc\Application', MvcEvent::EVENT_DISPATCH, [$this, 'selectLayout'], 100 -); - -// phpcs:set PSR2.Methods.FunctionCallSignature requiredSpacesBeforeClose 1 -foo('Testing - multiline text' - ); - -foo('Testing - multiline text: ' // . $text - ); - -foo('Testing - multiline text: ' /* . $text */ - ); - -foo('Testing - multiline text: ' /* . $text */ - // . $other_text - ); - -foo('Testing - multiline text: ' /* - . $text -// . $text2 - */ - ); -// phpcs:set PSR2.Methods.FunctionCallSignature requiredSpacesBeforeClose 0 - -foo('Testing - multiline text' -); - -foo('Testing - multiline text' - ); - -foo('Testing - multiline text' // hello -); - -foo('Testing - multiline text' /* hello */ -); - -foo('Testing - multiline text' - // hello -); - -foo('Testing - multiline text' - /* hello */ -); - -$var = foo('Testing - multiline' - // hi - ) + foo('Testing - multiline' - // hi - ) -; - -class Test -{ - public function getInstance() - { - return new static( - 'arg', - 'foo' - ); - } - - public function getSelf() - { - return new self( - 'a', 'b', 'c' - ); - } -} - -$x = $var('y', - 'x'); - -$obj->{$x}(1, -2); - -(function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})( - 'a','b' -)('c', - 'd'); - -return trim(preg_replace_callback( - // sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) - // /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ - sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), - function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; - }, - $search - )); - -return trim(preg_replace_callback( -// sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) -// /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ -sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), -function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; -}, -$search -)); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc.fixed deleted file mode 100644 index f61b479..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc.fixed +++ /dev/null @@ -1,257 +0,0 @@ -get('/hello/{name}', function ($name) use ($app) { - return 'Hello '.$app->escape($name); -}, array( - '1', - '2', - '3', -)); - -// error -somefunction2( - $foo, - $bar, - [ - // ... - ], - $baz -); - -// ok -somefunction3(// ... - $foo, - $bar, - [ - // ... - ], - $baz -); - -// ok -somefunction4(' - this should not - give an error - because it\'s actually - one line call - with multi-line string -'); - -// ok -somefunction5("hey, -multi-line string with some -extra args", $foo, 12); - -// error -somefunction6( - ' - but args in a new line - are not ok… - ', - $foo -); - -$this->setFoo(true - ? 1 - : 2, false, array( - 'value', - 'more')); - -$this->setFoo('some' - . 'long' - . 'text', 'string'); - -foo(bar(), $a); -foo();bar(); - -foo( - true -); - -myFunction(<< function ($x) { - return true; - }, - 'baz' => false - ) -); -$qux = array_filter( - $quux, - function ($x) { - return $x; - } -); - -$this->listeners[] = $events->getSharedManager()->attach( - 'Zend\Mvc\Application', - MvcEvent::EVENT_DISPATCH, - [$this, 'selectLayout'], - 100 -); - -// phpcs:set PSR2.Methods.FunctionCallSignature requiredSpacesBeforeClose 1 -foo('Testing - multiline text' ); - -foo('Testing - multiline text: ' ); // . $text - - -foo('Testing - multiline text: ' /* . $text */ ); - -foo('Testing - multiline text: ' /* . $text */ ); - // . $other_text - - -foo('Testing - multiline text: ' /* - . $text -// . $text2 - */ ); -// phpcs:set PSR2.Methods.FunctionCallSignature requiredSpacesBeforeClose 0 - -foo('Testing - multiline text'); - -foo('Testing - multiline text'); - -foo('Testing - multiline text'); // hello - - -foo('Testing - multiline text' /* hello */); - -foo('Testing - multiline text'); - // hello - - -foo('Testing - multiline text' - /* hello */); - -$var = foo('Testing - multiline') - // hi - + foo('Testing - multiline'); - // hi - - -class Test -{ - public function getInstance() - { - return new static( - 'arg', - 'foo' - ); - } - - public function getSelf() - { - return new self( - 'a', - 'b', - 'c' - ); - } -} - -$x = $var( - 'y', - 'x' -); - -$obj->{$x}( - 1, - 2 -); - -(function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})( - 'a', - 'b' -)( - 'c', - 'd' -); - -return trim(preg_replace_callback( - // sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) - // /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ - sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), - function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; - }, - $search -)); - -return trim(preg_replace_callback( -// sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) -// /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ - sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), - function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; - }, - $search -)); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.php deleted file mode 100644 index c6862ca..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.php +++ /dev/null @@ -1,90 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Methods; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionCallSignatureUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 18 => 3, - 21 => 1, - 48 => 1, - 87 => 1, - 90 => 1, - 91 => 1, - 103 => 1, - 111 => 1, - 117 => 4, - 121 => 1, - 125 => 1, - 129 => 1, - 133 => 1, - 138 => 1, - 146 => 1, - 150 => 1, - 154 => 1, - 158 => 1, - 162 => 1, - 167 => 1, - 172 => 1, - 175 => 1, - 178 => 1, - 186 => 1, - 187 => 1, - 194 => 3, - 199 => 1, - 200 => 2, - 202 => 1, - 203 => 1, - 210 => 2, - 211 => 1, - 212 => 2, - 217 => 1, - 218 => 1, - 227 => 1, - 228 => 1, - 233 => 1, - 234 => 1, - 242 => 1, - 243 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.inc deleted file mode 100644 index 7bf667e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.inc +++ /dev/null @@ -1,70 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Methods; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionClosingBraceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 16 => 1, - 23 => 1, - 40 => 1, - 47 => 1, - 63 => 1, - 70 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.inc deleted file mode 100644 index 21c0311..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.inc +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Methods; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class MethodDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 11 => 1, - 13 => 1, - 15 => 3, - 24 => 1, - 34 => 1, - 36 => 1, - 38 => 1, - 40 => 3, - 50 => 1, - 52 => 1, - 54 => 1, - 56 => 3, - 63 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 5 => 1, - 21 => 1, - 30 => 1, - 46 => 1, - 63 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.inc deleted file mode 100644 index 2500b64..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.inc +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Namespaces; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class NamespaceDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 6 => 1, - 9 => 1, - 17 => 1, - 19 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.1.inc deleted file mode 100644 index c4e83da..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.1.inc +++ /dev/null @@ -1,38 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.2.inc.fixed deleted file mode 100644 index 21e574d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.2.inc.fixed +++ /dev/null @@ -1,19 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.3.inc deleted file mode 100644 index 8b29095..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.3.inc +++ /dev/null @@ -1,16 +0,0 @@ - -

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.5.inc deleted file mode 100644 index 1fdaccd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.5.inc +++ /dev/null @@ -1,47 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.7.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.7.inc deleted file mode 100644 index dee5686..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.7.inc +++ /dev/null @@ -1 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Namespaces; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class UseDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'UseDeclarationUnitTest.2.inc': - return [ - 4 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 12 => 1, - ]; - case 'UseDeclarationUnitTest.3.inc': - return [ - 4 => 1, - 6 => 1, - ]; - case 'UseDeclarationUnitTest.5.inc': - return [ - 5 => 1, - 6 => 1, - 8 => 1, - 14 => 1, - 17 => 1, - 18 => 1, - 19 => 1, - 21 => 1, - 28 => 1, - 30 => 1, - 35 => 1, - ]; - case 'UseDeclarationUnitTest.10.inc': - case 'UseDeclarationUnitTest.11.inc': - case 'UseDeclarationUnitTest.12.inc': - case 'UseDeclarationUnitTest.13.inc': - case 'UseDeclarationUnitTest.14.inc': - case 'UseDeclarationUnitTest.16.inc': - case 'UseDeclarationUnitTest.17.inc': - return [2 => 1]; - case 'UseDeclarationUnitTest.15.inc': - return [ - 3 => 1, - 4 => 1, - 5 => 1, - ]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/ruleset.xml deleted file mode 100644 index ba5bd4e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/ruleset.xml +++ /dev/null @@ -1,218 +0,0 @@ - - - The PSR-2 coding standard. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - - - - - - - - - - - 0 - - - 0 - - - - - - - 0 - - - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayBracketSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayBracketSpacingStandard.xml deleted file mode 100644 index fc6ccbd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayBracketSpacingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - ['bar']; -]]> - - - [ 'bar' ]; -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayDeclarationStandard.xml deleted file mode 100644 index ce4b9ae..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayDeclarationStandard.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - array keyword must be lowercase. - ]]> - - - - - - - - - - - array keyword. - ]]> - - - - 'value1', - 'key2' => 'value2', - ); - ]]> - - - 'value1', - 'key2' => 'value2', - ); - ]]> - - - - array keyword. The closing parenthesis must be aligned with the start of the array keyword. - ]]> - - - - 'key1' => 'value1', - 'key2' => 'value2', - ); - ]]> - - - 'key1' => 'value1', - 'key2' => 'value2', -); - ]]> - - - - - - - - => 'ValueTen', - 'keyTwenty' => 'ValueTwenty', - ); - ]]> - - - => 'ValueTen', - 'keyTwenty' => 'ValueTwenty', - ); - ]]> - - - - - - - - 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ); - ]]> - - - 'value1', - 'key2' => 'value2', - 'key3' => 'value3' - ); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/LowercaseClassKeywordsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/LowercaseClassKeywordsStandard.xml deleted file mode 100644 index 89fcb5d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/LowercaseClassKeywordsStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - final class Foo extends Bar -{ -} -]]> - - - Final Class Foo Extends Bar -{ -} -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/SelfMemberReferenceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/SelfMemberReferenceStandard.xml deleted file mode 100644 index 59d193f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/SelfMemberReferenceStandard.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - self::foo(); -]]> - - - SELF::foo(); -]]> - - - - - ::foo(); -]]> - - - :: foo(); -]]> - - - - - self::bar(); - } -} -]]> - - - Foo -{ - public static function bar() - { - } - - public static function baz() - { - Foo::bar(); - } -} -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/DocCommentAlignmentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/DocCommentAlignmentStandard.xml deleted file mode 100644 index 414b89a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/DocCommentAlignmentStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - * @see foo() - */ -]]> - - - * @see foo() -*/ -]]> - - - - - @see foo() - */ -]]> - - - @see foo() - */ -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/FunctionCommentThrowTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/FunctionCommentThrowTagStandard.xml deleted file mode 100644 index 81df2e3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/FunctionCommentThrowTagStandard.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - @throws Exception all the time - * @return void - */ -function foo() -{ - throw new Exception('Danger!'); -} -]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForEachLoopDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForEachLoopDeclarationStandard.xml deleted file mode 100644 index 87c6181..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForEachLoopDeclarationStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - $foo as $bar => $baz) { - echo $baz; -} -]]> - - - $foo as $bar=>$baz ) { - echo $baz; -} -]]> - - - - - as $bar => $baz) { - echo $baz; -} -]]> - - - AS $bar => $baz) { - echo $baz; -} -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForLoopDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForLoopDeclarationStandard.xml deleted file mode 100644 index bbc4392..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForLoopDeclarationStandard.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - $i = 0; $i < 10; $i++) { - echo $i; -} -]]> - - - $i = 0; $i < 10; $i++ ) { - echo $i; -} -]]> - - - - - ; $i < 10; $i++) { - echo $i; -} -]]> - - - ; $i < 10 ; $i++) { - echo $i; -} -]]> - - - - - $i < 10; $i++) { - echo $i; -} -]]> - - - $i < 10;$i++) { - echo $i; -} -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/LowercaseDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/LowercaseDeclarationStandard.xml deleted file mode 100644 index 699f1f0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/LowercaseDeclarationStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - if ($foo) { - $bar = true; -} -]]> - - - IF ($foo) { - $bar = true; -} -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/FunctionDuplicateArgumentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/FunctionDuplicateArgumentStandard.xml deleted file mode 100644 index a890aba..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/FunctionDuplicateArgumentStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - isset($foo)) { - echo $foo; -} -]]> - - - isSet($foo)) { - echo $foo; -} -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/LowercaseFunctionKeywordsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/LowercaseFunctionKeywordsStandard.xml deleted file mode 100644 index 46e8a8f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/LowercaseFunctionKeywordsStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - function foo() -{ - return true; -} -]]> - - - FUNCTION foo() -{ - return true; -} -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Scope/StaticThisUsageStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Scope/StaticThisUsageStandard.xml deleted file mode 100644 index 3c97f54..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Scope/StaticThisUsageStandard.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - static function bar() - { - return self::$staticMember; - } -} -]]> - - - static function bar() - { - return $this->$staticMember; - } -} -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Strings/EchoedStringsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Strings/EchoedStringsStandard.xml deleted file mode 100644 index 030f2a6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Strings/EchoedStringsStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - "Hello"; -]]> - - - ("Hello"); -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/CastSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/CastSpacingStandard.xml deleted file mode 100644 index 0fb195c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/CastSpacingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - int)'42'; -]]> - - - int )'42'; -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionOpeningBraceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionOpeningBraceStandard.xml deleted file mode 100644 index d2bc264..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionOpeningBraceStandard.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - { -} -]]> - - - { -} -]]> - - - - - return 42; -} -]]> - - - - return 42; -} -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml deleted file mode 100644 index 608bed0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - "hi"; -]]> - - - "hi"; -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml deleted file mode 100644 index c6194d7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - ) should not have any space around it. - ]]> - - - - ->bar(); -]]> - - - -> bar(); -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeKeywordSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeKeywordSpacingStandard.xml deleted file mode 100644 index 8cadf66..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeKeywordSpacingStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - static function foo() -{ -} -]]> - - - static function foo() -{ -} -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SemicolonSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SemicolonSpacingStandard.xml deleted file mode 100644 index 7b22795..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SemicolonSpacingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - ; -]]> - - - ; -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php deleted file mode 100644 index ee63dea..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php +++ /dev/null @@ -1,95 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ArrayBracketSpacingSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_SQUARE_BRACKET, - T_CLOSE_SQUARE_BRACKET, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (($tokens[$stackPtr]['code'] === T_OPEN_SQUARE_BRACKET - && isset($tokens[$stackPtr]['bracket_closer']) === false) - || ($tokens[$stackPtr]['code'] === T_CLOSE_SQUARE_BRACKET - && isset($tokens[$stackPtr]['bracket_opener']) === false) - ) { - // Bow out for parse error/during live coding. - return; - } - - // Square brackets can not have a space before them. - $prevType = $tokens[($stackPtr - 1)]['code']; - if ($prevType === T_WHITESPACE) { - $nonSpace = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 2), null, true); - $expected = $tokens[$nonSpace]['content'].$tokens[$stackPtr]['content']; - $found = $phpcsFile->getTokensAsString($nonSpace, ($stackPtr - $nonSpace)).$tokens[$stackPtr]['content']; - $error = 'Space found before square bracket; expected "%s" but found "%s"'; - $data = [ - $expected, - $found, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeBracket', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } - } - - // Open square brackets can't ever have spaces after them. - if ($tokens[$stackPtr]['code'] === T_OPEN_SQUARE_BRACKET) { - $nextType = $tokens[($stackPtr + 1)]['code']; - if ($nextType === T_WHITESPACE) { - $nonSpace = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 2), null, true); - $expected = $tokens[$stackPtr]['content'].$tokens[$nonSpace]['content']; - $found = $phpcsFile->getTokensAsString($stackPtr, ($nonSpace - $stackPtr + 1)); - $error = 'Space found after square bracket; expected "%s" but found "%s"'; - $data = [ - $expected, - $found, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterBracket', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php deleted file mode 100644 index de5ee85..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php +++ /dev/null @@ -1,877 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ArrayDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_ARRAY, - T_OPEN_SHORT_ARRAY, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_ARRAY) { - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'no'); - - // Array keyword should be lower case. - if ($tokens[$stackPtr]['content'] !== strtolower($tokens[$stackPtr]['content'])) { - if ($tokens[$stackPtr]['content'] === strtoupper($tokens[$stackPtr]['content'])) { - $phpcsFile->recordMetric($stackPtr, 'Array keyword case', 'upper'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Array keyword case', 'mixed'); - } - - $error = 'Array keyword should be lower case; expected "array" but found "%s"'; - $data = [$tokens[$stackPtr]['content']]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotLowerCase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'array'); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Array keyword case', 'lower'); - } - - $arrayStart = $tokens[$stackPtr]['parenthesis_opener']; - if (isset($tokens[$arrayStart]['parenthesis_closer']) === false) { - return; - } - - $arrayEnd = $tokens[$arrayStart]['parenthesis_closer']; - - if ($arrayStart !== ($stackPtr + 1)) { - $error = 'There must be no space between the "array" keyword and the opening parenthesis'; - - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), $arrayStart, true); - if (isset(Tokens::$commentTokens[$tokens[$next]['code']]) === true) { - // We don't have anywhere to put the comment, so don't attempt to fix it. - $phpcsFile->addError($error, $stackPtr, 'SpaceAfterKeyword'); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterKeyword'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($stackPtr + 1); $i < $arrayStart; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'yes'); - $arrayStart = $stackPtr; - $arrayEnd = $tokens[$stackPtr]['bracket_closer']; - }//end if - - // Check for empty arrays. - $content = $phpcsFile->findNext(T_WHITESPACE, ($arrayStart + 1), ($arrayEnd + 1), true); - if ($content === $arrayEnd) { - // Empty array, but if the brackets aren't together, there's a problem. - if (($arrayEnd - $arrayStart) !== 1) { - $error = 'Empty array declaration must have no space between the parentheses'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceInEmptyArray'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($arrayStart + 1); $i < $arrayEnd; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - // We can return here because there is nothing else to check. All code - // below can assume that the array is not empty. - return; - } - - if ($tokens[$arrayStart]['line'] === $tokens[$arrayEnd]['line']) { - $this->processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd); - } else { - $this->processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd); - } - - }//end process() - - - /** - * Processes a single-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * - * @return void - */ - public function processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd) - { - $tokens = $phpcsFile->getTokens(); - - // Check if there are multiple values. If so, then it has to be multiple lines - // unless it is contained inside a function call or condition. - $valueCount = 0; - $commas = []; - for ($i = ($arrayStart + 1); $i < $arrayEnd; $i++) { - // Skip bracketed statements, like function calls. - if ($tokens[$i]['code'] === T_OPEN_PARENTHESIS) { - $i = $tokens[$i]['parenthesis_closer']; - continue; - } - - if ($tokens[$i]['code'] === T_COMMA) { - // Before counting this comma, make sure we are not - // at the end of the array. - $next = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), $arrayEnd, true); - if ($next !== false) { - $valueCount++; - $commas[] = $i; - } else { - // There is a comma at the end of a single line array. - $error = 'Comma not allowed after last value in single-line array declaration'; - $fix = $phpcsFile->addFixableError($error, $i, 'CommaAfterLast'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - } - }//end for - - // Now check each of the double arrows (if any). - $nextArrow = $arrayStart; - while (($nextArrow = $phpcsFile->findNext(T_DOUBLE_ARROW, ($nextArrow + 1), $arrayEnd)) !== false) { - if ($tokens[($nextArrow - 1)]['code'] !== T_WHITESPACE) { - $content = $tokens[($nextArrow - 1)]['content']; - $error = 'Expected 1 space between "%s" and double arrow; 0 found'; - $data = [$content]; - $fix = $phpcsFile->addFixableError($error, $nextArrow, 'NoSpaceBeforeDoubleArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($nextArrow, ' '); - } - } else { - $spaceLength = $tokens[($nextArrow - 1)]['length']; - if ($spaceLength !== 1) { - $content = $tokens[($nextArrow - 2)]['content']; - $error = 'Expected 1 space between "%s" and double arrow; %s found'; - $data = [ - $content, - $spaceLength, - ]; - - $fix = $phpcsFile->addFixableError($error, $nextArrow, 'SpaceBeforeDoubleArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($nextArrow - 1), ' '); - } - } - }//end if - - if ($tokens[($nextArrow + 1)]['code'] !== T_WHITESPACE) { - $content = $tokens[($nextArrow + 1)]['content']; - $error = 'Expected 1 space between double arrow and "%s"; 0 found'; - $data = [$content]; - $fix = $phpcsFile->addFixableError($error, $nextArrow, 'NoSpaceAfterDoubleArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($nextArrow, ' '); - } - } else { - $spaceLength = $tokens[($nextArrow + 1)]['length']; - if ($spaceLength !== 1) { - $content = $tokens[($nextArrow + 2)]['content']; - $error = 'Expected 1 space between double arrow and "%s"; %s found'; - $data = [ - $content, - $spaceLength, - ]; - - $fix = $phpcsFile->addFixableError($error, $nextArrow, 'SpaceAfterDoubleArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($nextArrow + 1), ' '); - } - } - }//end if - }//end while - - if ($valueCount > 0) { - $nestedParenthesis = false; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $nested = $tokens[$stackPtr]['nested_parenthesis']; - $nestedParenthesis = array_pop($nested); - } - - if ($nestedParenthesis === false - || $tokens[$nestedParenthesis]['line'] !== $tokens[$stackPtr]['line'] - ) { - $error = 'Array with multiple values cannot be declared on a single line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SingleLineNotAllowed'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($arrayStart); - - if ($tokens[($arrayEnd - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($arrayEnd - 1), $phpcsFile->eolChar); - } else { - $phpcsFile->fixer->addNewlineBefore($arrayEnd); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - } - - // We have a multiple value array that is inside a condition or - // function. Check its spacing is correct. - foreach ($commas as $comma) { - if ($tokens[($comma + 1)]['code'] !== T_WHITESPACE) { - $content = $tokens[($comma + 1)]['content']; - $error = 'Expected 1 space between comma and "%s"; 0 found'; - $data = [$content]; - $fix = $phpcsFile->addFixableError($error, $comma, 'NoSpaceAfterComma', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($comma, ' '); - } - } else { - $spaceLength = $tokens[($comma + 1)]['length']; - if ($spaceLength !== 1) { - $content = $tokens[($comma + 2)]['content']; - $error = 'Expected 1 space between comma and "%s"; %s found'; - $data = [ - $content, - $spaceLength, - ]; - - $fix = $phpcsFile->addFixableError($error, $comma, 'SpaceAfterComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($comma + 1), ' '); - } - } - }//end if - - if ($tokens[($comma - 1)]['code'] === T_WHITESPACE) { - $content = $tokens[($comma - 2)]['content']; - $spaceLength = $tokens[($comma - 1)]['length']; - $error = 'Expected 0 spaces between "%s" and comma; %s found'; - $data = [ - $content, - $spaceLength, - ]; - - $fix = $phpcsFile->addFixableError($error, $comma, 'SpaceBeforeComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($comma - 1), ''); - } - } - }//end foreach - }//end if - - }//end processSingleLineArray() - - - /** - * Processes a multi-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * - * @return void - */ - public function processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd) - { - $tokens = $phpcsFile->getTokens(); - $keywordStart = $tokens[$stackPtr]['column']; - - // Check the closing bracket is on a new line. - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($arrayEnd - 1), $arrayStart, true); - if ($tokens[$lastContent]['line'] === $tokens[$arrayEnd]['line']) { - $error = 'Closing parenthesis of array declaration must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $arrayEnd, 'CloseBraceNewLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($arrayEnd); - } - } else if ($tokens[$arrayEnd]['column'] !== $keywordStart) { - // Check the closing bracket is lined up under the "a" in array. - $expected = ($keywordStart - 1); - $found = ($tokens[$arrayEnd]['column'] - 1); - $error = 'Closing parenthesis not aligned correctly; expected %s space(s) but found %s'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $arrayEnd, 'CloseBraceNotAligned', $data); - if ($fix === true) { - if ($found === 0) { - $phpcsFile->fixer->addContent(($arrayEnd - 1), str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($arrayEnd - 1), str_repeat(' ', $expected)); - } - } - }//end if - - $keyUsed = false; - $singleUsed = false; - $indices = []; - $maxLength = 0; - - if ($tokens[$stackPtr]['code'] === T_ARRAY) { - $lastToken = $tokens[$stackPtr]['parenthesis_opener']; - } else { - $lastToken = $stackPtr; - } - - // Find all the double arrows that reside in this scope. - for ($nextToken = ($stackPtr + 1); $nextToken < $arrayEnd; $nextToken++) { - // Skip bracketed statements, like function calls. - if ($tokens[$nextToken]['code'] === T_OPEN_PARENTHESIS - && (isset($tokens[$nextToken]['parenthesis_owner']) === false - || $tokens[$nextToken]['parenthesis_owner'] !== $stackPtr) - ) { - $nextToken = $tokens[$nextToken]['parenthesis_closer']; - continue; - } - - if ($tokens[$nextToken]['code'] === T_ARRAY - || $tokens[$nextToken]['code'] === T_OPEN_SHORT_ARRAY - || $tokens[$nextToken]['code'] === T_CLOSURE - || $tokens[$nextToken]['code'] === T_FN - ) { - // Let subsequent calls of this test handle nested arrays. - if ($tokens[$lastToken]['code'] !== T_DOUBLE_ARROW) { - $indices[] = ['value' => $nextToken]; - $lastToken = $nextToken; - } - - if ($tokens[$nextToken]['code'] === T_ARRAY) { - $nextToken = $tokens[$tokens[$nextToken]['parenthesis_opener']]['parenthesis_closer']; - } else if ($tokens[$nextToken]['code'] === T_OPEN_SHORT_ARRAY) { - $nextToken = $tokens[$nextToken]['bracket_closer']; - } else { - // T_CLOSURE. - $nextToken = $tokens[$nextToken]['scope_closer']; - } - - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($nextToken + 1), null, true); - if ($tokens[$nextToken]['code'] !== T_COMMA) { - $nextToken--; - } else { - $lastToken = $nextToken; - } - - continue; - }//end if - - if ($tokens[$nextToken]['code'] !== T_DOUBLE_ARROW && $tokens[$nextToken]['code'] !== T_COMMA) { - continue; - } - - $currentEntry = []; - - if ($tokens[$nextToken]['code'] === T_COMMA) { - $stackPtrCount = 0; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $stackPtrCount = count($tokens[$stackPtr]['nested_parenthesis']); - } - - $commaCount = 0; - if (isset($tokens[$nextToken]['nested_parenthesis']) === true) { - $commaCount = count($tokens[$nextToken]['nested_parenthesis']); - if ($tokens[$stackPtr]['code'] === T_ARRAY) { - // Remove parenthesis that are used to define the array. - $commaCount--; - } - } - - if ($commaCount > $stackPtrCount) { - // This comma is inside more parenthesis than the ARRAY keyword, - // then there it is actually a comma used to separate arguments - // in a function call. - continue; - } - - if ($keyUsed === true && $tokens[$lastToken]['code'] === T_COMMA) { - $error = 'No key specified for array entry; first entry specifies key'; - $phpcsFile->addError($error, $nextToken, 'NoKeySpecified'); - return; - } - - if ($keyUsed === false) { - if ($tokens[($nextToken - 1)]['code'] === T_WHITESPACE) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($nextToken - 1), null, true); - if (($tokens[$prev]['code'] !== T_END_HEREDOC - && $tokens[$prev]['code'] !== T_END_NOWDOC) - || $tokens[($nextToken - 1)]['line'] === $tokens[$nextToken]['line'] - ) { - if ($tokens[($nextToken - 1)]['content'] === $phpcsFile->eolChar) { - $spaceLength = 'newline'; - } else { - $spaceLength = $tokens[($nextToken - 1)]['length']; - } - - $error = 'Expected 0 spaces before comma; %s found'; - $data = [$spaceLength]; - - $fix = $phpcsFile->addFixableError($error, $nextToken, 'SpaceBeforeComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($nextToken - 1), ''); - } - } - }//end if - - $valueContent = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($lastToken + 1), - $nextToken, - true - ); - - $indices[] = ['value' => $valueContent]; - $singleUsed = true; - }//end if - - $lastToken = $nextToken; - continue; - }//end if - - if ($tokens[$nextToken]['code'] === T_DOUBLE_ARROW) { - if ($singleUsed === true) { - $error = 'Key specified for array entry; first entry has no key'; - $phpcsFile->addError($error, $nextToken, 'KeySpecified'); - return; - } - - $currentEntry['arrow'] = $nextToken; - $keyUsed = true; - - // Find the start of index that uses this double arrow. - $indexEnd = $phpcsFile->findPrevious(T_WHITESPACE, ($nextToken - 1), $arrayStart, true); - $indexStart = $phpcsFile->findStartOfStatement($indexEnd); - - if ($indexStart === $indexEnd) { - $currentEntry['index'] = $indexEnd; - $currentEntry['index_content'] = $tokens[$indexEnd]['content']; - $currentEntry['index_length'] = $tokens[$indexEnd]['length']; - } else { - $currentEntry['index'] = $indexStart; - $currentEntry['index_content'] = ''; - $currentEntry['index_length'] = 0; - for ($i = $indexStart; $i <= $indexEnd; $i++) { - $currentEntry['index_content'] .= $tokens[$i]['content']; - $currentEntry['index_length'] += $tokens[$i]['length']; - } - } - - if ($maxLength < $currentEntry['index_length']) { - $maxLength = $currentEntry['index_length']; - } - - // Find the value of this index. - $nextContent = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($nextToken + 1), - $arrayEnd, - true - ); - - $currentEntry['value'] = $nextContent; - $indices[] = $currentEntry; - $lastToken = $nextToken; - }//end if - }//end for - - // Check for multi-line arrays that should be single-line. - $singleValue = false; - - if (empty($indices) === true) { - $singleValue = true; - } else if (count($indices) === 1 && $tokens[$lastToken]['code'] === T_COMMA) { - // There may be another array value without a comma. - $exclude = Tokens::$emptyTokens; - $exclude[] = T_COMMA; - $nextContent = $phpcsFile->findNext($exclude, ($indices[0]['value'] + 1), $arrayEnd, true); - if ($nextContent === false) { - $singleValue = true; - } - } - - if ($singleValue === true) { - // Before we complain, make sure the single value isn't a here/nowdoc. - $next = $phpcsFile->findNext(Tokens::$heredocTokens, ($arrayStart + 1), ($arrayEnd - 1)); - if ($next === false) { - // Array cannot be empty, so this is a multi-line array with - // a single value. It should be defined on single line. - $error = 'Multi-line array contains a single value; use single-line array instead'; - $errorCode = 'MultiLineNotAllowed'; - - $find = Tokens::$phpcsCommentTokens; - $find[] = T_COMMENT; - $comment = $phpcsFile->findNext($find, ($arrayStart + 1), $arrayEnd); - if ($comment === false) { - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode); - } else { - $fix = false; - $phpcsFile->addError($error, $stackPtr, $errorCode); - } - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($arrayStart + 1); $i < $arrayEnd; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - for ($i = ($arrayEnd - 1); $i > $arrayStart; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - }//end if - }//end if - - /* - This section checks for arrays that don't specify keys. - - Arrays such as: - array( - 'aaa', - 'bbb', - 'd', - ); - */ - - if ($keyUsed === false && empty($indices) === false) { - $count = count($indices); - $lastIndex = $indices[($count - 1)]['value']; - - $trailingContent = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($arrayEnd - 1), - $lastIndex, - true - ); - - if ($tokens[$trailingContent]['code'] !== T_COMMA) { - $phpcsFile->recordMetric($stackPtr, 'Array end comma', 'no'); - $error = 'Comma required after last value in array declaration'; - $fix = $phpcsFile->addFixableError($error, $trailingContent, 'NoCommaAfterLast'); - if ($fix === true) { - $phpcsFile->fixer->addContent($trailingContent, ','); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Array end comma', 'yes'); - } - - foreach ($indices as $valuePosition => $value) { - if (empty($value['value']) === true) { - // Array was malformed and we couldn't figure out - // the array value correctly, so we have to ignore it. - // Other parts of this sniff will correct the error. - continue; - } - - $valuePointer = $value['value']; - - $previous = $phpcsFile->findPrevious([T_WHITESPACE, T_COMMA], ($valuePointer - 1), ($arrayStart + 1), true); - if ($previous === false) { - $previous = $stackPtr; - } - - $previousIsWhitespace = $tokens[($valuePointer - 1)]['code'] === T_WHITESPACE; - if ($tokens[$previous]['line'] === $tokens[$valuePointer]['line']) { - $error = 'Each value in a multi-line array must be on a new line'; - if ($valuePosition === 0) { - $error = 'The first value in a multi-value array must be on a new line'; - } - - $fix = $phpcsFile->addFixableError($error, $valuePointer, 'ValueNoNewline'); - if ($fix === true) { - if ($previousIsWhitespace === true) { - $phpcsFile->fixer->replaceToken(($valuePointer - 1), $phpcsFile->eolChar); - } else { - $phpcsFile->fixer->addNewlineBefore($valuePointer); - } - } - } else if ($previousIsWhitespace === true) { - $expected = $keywordStart; - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $valuePointer, true); - $found = ($tokens[$first]['column'] - 1); - if ($found !== $expected) { - $error = 'Array value not aligned correctly; expected %s spaces but found %s'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $valuePointer, 'ValueNotAligned', $data); - if ($fix === true) { - if ($found === 0) { - $phpcsFile->fixer->addContent(($valuePointer - 1), str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($valuePointer - 1), str_repeat(' ', $expected)); - } - } - } - }//end if - }//end foreach - }//end if - - /* - Below the actual indentation of the array is checked. - Errors will be thrown when a key is not aligned, when - a double arrow is not aligned, and when a value is not - aligned correctly. - If an error is found in one of the above areas, then errors - are not reported for the rest of the line to avoid reporting - spaces and columns incorrectly. Often fixing the first - problem will fix the other 2 anyway. - - For example: - - $a = array( - 'index' => '2', - ); - - or - - $a = [ - 'index' => '2', - ]; - - In this array, the double arrow is indented too far, but this - will also cause an error in the value's alignment. If the arrow were - to be moved back one space however, then both errors would be fixed. - */ - - $indicesStart = ($keywordStart + 1); - foreach ($indices as $valuePosition => $index) { - $valuePointer = $index['value']; - if ($valuePointer === false) { - // Syntax error or live coding. - continue; - } - - if (isset($index['index']) === false) { - // Array value only. - continue; - } - - $indexPointer = $index['index']; - $indexLine = $tokens[$indexPointer]['line']; - - $previous = $phpcsFile->findPrevious([T_WHITESPACE, T_COMMA], ($indexPointer - 1), ($arrayStart + 1), true); - if ($previous === false) { - $previous = $stackPtr; - } - - if ($tokens[$previous]['line'] === $indexLine) { - $error = 'Each index in a multi-line array must be on a new line'; - if ($valuePosition === 0) { - $error = 'The first index in a multi-value array must be on a new line'; - } - - $fix = $phpcsFile->addFixableError($error, $indexPointer, 'IndexNoNewline'); - if ($fix === true) { - if ($tokens[($indexPointer - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($indexPointer - 1), $phpcsFile->eolChar); - } else { - $phpcsFile->fixer->addNewlineBefore($indexPointer); - } - } - - continue; - } - - if ($tokens[$indexPointer]['column'] !== $indicesStart && ($indexPointer - 1) !== $arrayStart) { - $expected = ($indicesStart - 1); - $found = ($tokens[$indexPointer]['column'] - 1); - $error = 'Array key not aligned correctly; expected %s spaces but found %s'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $indexPointer, 'KeyNotAligned', $data); - if ($fix === true) { - if ($found === 0 || $tokens[($indexPointer - 1)]['code'] !== T_WHITESPACE) { - $phpcsFile->fixer->addContent(($indexPointer - 1), str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($indexPointer - 1), str_repeat(' ', $expected)); - } - } - } - - $arrowStart = ($tokens[$indexPointer]['column'] + $maxLength + 1); - if ($tokens[$index['arrow']]['column'] !== $arrowStart) { - $expected = ($arrowStart - ($index['index_length'] + $tokens[$indexPointer]['column'])); - $found = ($tokens[$index['arrow']]['column'] - ($index['index_length'] + $tokens[$indexPointer]['column'])); - $error = 'Array double arrow not aligned correctly; expected %s space(s) but found %s'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $index['arrow'], 'DoubleArrowNotAligned', $data); - if ($fix === true) { - if ($found === 0) { - $phpcsFile->fixer->addContent(($index['arrow'] - 1), str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($index['arrow'] - 1), str_repeat(' ', $expected)); - } - } - - continue; - } - - $valueStart = ($arrowStart + 3); - if ($tokens[$valuePointer]['column'] !== $valueStart) { - $expected = ($valueStart - ($tokens[$index['arrow']]['length'] + $tokens[$index['arrow']]['column'])); - $found = ($tokens[$valuePointer]['column'] - ($tokens[$index['arrow']]['length'] + $tokens[$index['arrow']]['column'])); - if ($found < 0) { - $found = 'newline'; - } - - $error = 'Array value not aligned correctly; expected %s space(s) but found %s'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $index['arrow'], 'ValueNotAligned', $data); - if ($fix === true) { - if ($found === 'newline') { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($valuePointer - 1), null, true); - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $valuePointer; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken(($valuePointer - 1), str_repeat(' ', $expected)); - $phpcsFile->fixer->endChangeset(); - } else if ($found === 0) { - $phpcsFile->fixer->addContent(($valuePointer - 1), str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($valuePointer - 1), str_repeat(' ', $expected)); - } - } - }//end if - - // Check each line ends in a comma. - $valueStart = $valuePointer; - $nextComma = false; - - $end = $phpcsFile->findEndOfStatement($valueStart); - if ($end === false) { - $valueEnd = $valueStart; - } else if ($tokens[$end]['code'] === T_COMMA) { - $valueEnd = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($end - 1), $valueStart, true); - $nextComma = $end; - } else { - $valueEnd = $end; - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), $arrayEnd, true); - if ($next !== false && $tokens[$next]['code'] === T_COMMA) { - $nextComma = $next; - } - } - - $valueLine = $tokens[$valueEnd]['line']; - if ($tokens[$valueEnd]['code'] === T_END_HEREDOC || $tokens[$valueEnd]['code'] === T_END_NOWDOC) { - $valueLine++; - } - - if ($nextComma === false || ($tokens[$nextComma]['line'] !== $valueLine)) { - $error = 'Each line in an array declaration must end in a comma'; - $fix = $phpcsFile->addFixableError($error, $valuePointer, 'NoComma'); - - if ($fix === true) { - // Find the end of the line and put a comma there. - for ($i = ($valuePointer + 1); $i <= $arrayEnd; $i++) { - if ($tokens[$i]['line'] > $valueLine) { - break; - } - } - - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContentBefore(($i - 1), ','); - if ($nextComma !== false) { - $phpcsFile->fixer->replaceToken($nextComma, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - // Check that there is no space before the comma. - if ($nextComma !== false && $tokens[($nextComma - 1)]['code'] === T_WHITESPACE) { - // Here/nowdoc closing tags must have the comma on the next line. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($nextComma - 1), null, true); - if ($tokens[$prev]['code'] !== T_END_HEREDOC && $tokens[$prev]['code'] !== T_END_NOWDOC) { - $content = $tokens[($nextComma - 2)]['content']; - $spaceLength = $tokens[($nextComma - 1)]['length']; - $error = 'Expected 0 spaces between "%s" and comma; %s found'; - $data = [ - $content, - $spaceLength, - ]; - - $fix = $phpcsFile->addFixableError($error, $nextComma, 'SpaceBeforeComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($nextComma - 1), ''); - } - } - } - }//end foreach - - }//end processMultiLineArray() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php deleted file mode 100644 index a9a55fa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php +++ /dev/null @@ -1,134 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassDefinitionClosingBraceSpaceSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_CLOSE_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $next = $stackPtr; - while (true) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($next + 1), null, true); - if ($next === false) { - return; - } - - if (isset(Tokens::$emptyTokens[$tokens[$next]['code']]) === true - && $tokens[$next]['line'] === $tokens[$stackPtr]['line'] - ) { - // Trailing comment. - continue; - } - - break; - } - - if ($tokens[$next]['code'] !== T_CLOSE_TAG) { - $found = (($tokens[$next]['line'] - $tokens[$stackPtr]['line']) - 1); - if ($found !== 1) { - $error = 'Expected one blank line after closing brace of class definition; %s found'; - $data = [max(0, $found)]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterClose', $data); - - if ($fix === true) { - $firstOnLine = $next; - while ($tokens[$firstOnLine]['column'] !== 1) { - --$firstOnLine; - } - - if ($found < 0) { - // Next statement on same line as the closing brace. - $phpcsFile->fixer->addContentBefore($next, $phpcsFile->eolChar.$phpcsFile->eolChar); - } else if ($found === 0) { - // Next statement on next line, no blank line. - $phpcsFile->fixer->addContentBefore($firstOnLine, $phpcsFile->eolChar); - } else { - // Too many blank lines. - $phpcsFile->fixer->beginChangeset(); - for ($i = ($firstOnLine - 1); $i > $stackPtr; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addContentBefore($firstOnLine, $phpcsFile->eolChar.$phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - }//end if - - // Ignore nested style definitions from here on. The spacing before the closing brace - // (a single blank line) will be enforced by the above check, which ensures there is a - // blank line after the last nested class. - $found = $phpcsFile->findPrevious( - T_CLOSE_CURLY_BRACKET, - ($stackPtr - 1), - $tokens[$stackPtr]['bracket_opener'] - ); - - if ($found !== false) { - return; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prev === false) { - return; - } - - if ($tokens[$prev]['line'] === $tokens[$stackPtr]['line']) { - $error = 'Closing brace of class definition must be on new line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentBeforeClose'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($stackPtr); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php deleted file mode 100644 index 4b7efd9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassDefinitionNameSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['bracket_closer']) === false) { - // Syntax error or live coding, bow out. - return; - } - - // Do not check nested style definitions as, for example, in @media style rules. - $nested = $phpcsFile->findNext(T_OPEN_CURLY_BRACKET, ($stackPtr + 1), $tokens[$stackPtr]['bracket_closer']); - if ($nested !== false) { - return; - } - - // Find the first blank line before this opening brace, unless we get - // to another style definition, comment or the start of the file. - $endTokens = [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_OPEN_TAG => T_OPEN_TAG, - ]; - $endTokens += Tokens::$commentTokens; - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - $foundContent = false; - $currentLine = $tokens[$prev]['line']; - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - if (isset($endTokens[$tokens[$i]['code']]) === true) { - break; - } - - if ($tokens[$i]['line'] === $currentLine) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - $foundContent = true; - } - - continue; - } - - // We changed lines. - if ($foundContent === false) { - // Before we throw an error, make sure we are not looking - // at a gap before the style definition. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, $i, null, true); - if ($prev !== false - && isset($endTokens[$tokens[$prev]['code']]) === false - ) { - $error = 'Blank lines are not allowed between class names'; - $phpcsFile->addError($error, ($i + 1), 'BlankLinesFound'); - } - - break; - } - - $foundContent = false; - $currentLine = $tokens[$i]['line']; - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php deleted file mode 100644 index e56dad7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php +++ /dev/null @@ -1,176 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassDefinitionOpeningBraceSpaceSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - - if ($prevNonWhitespace !== false) { - $length = 0; - if ($tokens[$stackPtr]['line'] !== $tokens[$prevNonWhitespace]['line']) { - $length = 'newline'; - } else if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - if (strpos($tokens[($stackPtr - 1)]['content'], "\t") !== false) { - $length = 'tab'; - } else { - $length = $tokens[($stackPtr - 1)]['length']; - } - } - - if ($length === 0) { - $error = 'Expected 1 space before opening brace of class definition; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoneBefore'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - } else if ($length !== 1) { - $error = 'Expected 1 space before opening brace of class definition; %s found'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Before', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($stackPtr - 1); $i > $prevNonWhitespace; $i--) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - return; - } - - if ($tokens[$nextNonEmpty]['line'] === $tokens[$stackPtr]['line']) { - $error = 'Opening brace should be the last content on the line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentBefore'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($stackPtr); - - // Remove potentially left over trailing whitespace. - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - if (isset($tokens[$stackPtr]['bracket_closer']) === false) { - // Syntax error or live coding, bow out. - return; - } - - // Check for nested class definitions. - $found = $phpcsFile->findNext( - T_OPEN_CURLY_BRACKET, - ($stackPtr + 1), - $tokens[$stackPtr]['bracket_closer'] - ); - - if ($found === false) { - // Not nested. - return; - } - - $lastOnLine = $stackPtr; - for ($lastOnLine; $lastOnLine < $tokens[$stackPtr]['bracket_closer']; $lastOnLine++) { - if ($tokens[$lastOnLine]['line'] !== $tokens[($lastOnLine + 1)]['line']) { - break; - } - } - - $nextNonWhiteSpace = $phpcsFile->findNext(T_WHITESPACE, ($lastOnLine + 1), null, true); - if ($nextNonWhiteSpace === false) { - return; - } - - $foundLines = ($tokens[$nextNonWhiteSpace]['line'] - $tokens[$stackPtr]['line'] - 1); - if ($foundLines !== 1) { - $error = 'Expected 1 blank line after opening brace of nesting class definition; %s found'; - $data = [max(0, $foundLines)]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'AfterNesting', $data); - - if ($fix === true) { - $firstOnNextLine = $nextNonWhiteSpace; - while ($tokens[$firstOnNextLine]['column'] !== 1) { - --$firstOnNextLine; - } - - if ($found < 0) { - // First statement on same line as the opening brace. - $phpcsFile->fixer->addContentBefore($nextNonWhiteSpace, $phpcsFile->eolChar.$phpcsFile->eolChar); - } else if ($found === 0) { - // Next statement on next line, no blank line. - $phpcsFile->fixer->addNewlineBefore($firstOnNextLine); - } else { - // Too many blank lines. - $phpcsFile->fixer->beginChangeset(); - for ($i = ($firstOnNextLine - 1); $i > $stackPtr; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addContentBefore($firstOnNextLine, $phpcsFile->eolChar.$phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColonSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColonSpacingSniff.php deleted file mode 100644 index 8548a72..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColonSpacingSniff.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ColonSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_COLON]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] !== T_STYLE) { - // The colon is not part of a style definition. - return; - } - - if ($tokens[$prev]['content'] === 'progid') { - // Special case for IE filters. - return; - } - - if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - $error = 'There must be no space before a colon in a style definition'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Before'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_SEMICOLON || $tokens[$next]['code'] === T_STYLE) { - // Empty style definition, ignore it. - return; - } - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space after colon in style definition; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoneAfter'); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - } else { - $content = $tokens[($stackPtr + 1)]['content']; - if (strpos($content, $phpcsFile->eolChar) === false) { - $length = strlen($content); - if ($length !== 1) { - $error = 'Expected 1 space after colon in style definition; %s found'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'After', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } else { - $error = 'Expected 1 space after colon in style definition; newline found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'AfterNewline'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColourDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColourDefinitionSniff.php deleted file mode 100644 index 6b071ea..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColourDefinitionSniff.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ColourDefinitionSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_COLOUR]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $colour = $tokens[$stackPtr]['content']; - - $expected = strtoupper($colour); - if ($colour !== $expected) { - $error = 'CSS colours must be defined in uppercase; expected %s but found %s'; - $data = [ - $expected, - $colour, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotUpper', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $expected); - } - } - - // Now check if shorthand can be used. - if (strlen($colour) !== 7) { - return; - } - - if ($colour[1] === $colour[2] && $colour[3] === $colour[4] && $colour[5] === $colour[6]) { - $expected = '#'.$colour[1].$colour[3].$colour[5]; - $error = 'CSS colours must use shorthand if available; expected %s but found %s'; - $data = [ - $expected, - $colour, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Shorthand', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $expected); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php deleted file mode 100644 index def95c1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php +++ /dev/null @@ -1,71 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowMultipleStyleDefinitionsSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $next = $phpcsFile->findNext(T_STYLE, ($stackPtr + 1)); - if ($next === false) { - return; - } - - if ($tokens[$next]['content'] === 'progid') { - // Special case for IE filters. - return; - } - - if ($tokens[$next]['line'] === $tokens[$stackPtr]['line']) { - $error = 'Each style definition must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $next, 'Found'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($next); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php deleted file mode 100644 index d489cb1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DuplicateClassDefinitionSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Find the content of each class definition name. - $classNames = []; - $next = $phpcsFile->findNext(T_OPEN_CURLY_BRACKET, ($stackPtr + 1)); - if ($next === false) { - // No class definitions in the file. - return; - } - - // Save the class names in a "scope", - // to prevent false positives with @media blocks. - $scope = 'main'; - - $find = [ - T_CLOSE_CURLY_BRACKET, - T_OPEN_CURLY_BRACKET, - T_OPEN_TAG, - ]; - - while ($next !== false) { - $prev = $phpcsFile->findPrevious($find, ($next - 1)); - - // Check if an inner block was closed. - $beforePrev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - if ($beforePrev !== false - && $tokens[$beforePrev]['code'] === T_CLOSE_CURLY_BRACKET - ) { - $scope = 'main'; - } - - // Create a sorted name for the class so we can compare classes - // even when the individual names are all over the place. - $name = ''; - for ($i = ($prev + 1); $i < $next; $i++) { - $name .= $tokens[$i]['content']; - } - - $name = trim($name); - $name = str_replace("\n", ' ', $name); - $name = preg_replace('|[\s]+|', ' ', $name); - $name = preg_replace('|\s*/\*.*\*/\s*|', '', $name); - $name = str_replace(', ', ',', $name); - - $names = explode(',', $name); - sort($names); - $name = implode(',', $names); - - if ($name[0] === '@') { - // Media block has its own "scope". - $scope = $name; - } else if (isset($classNames[$scope][$name]) === true) { - $first = $classNames[$scope][$name]; - $error = 'Duplicate class definition found; first defined on line %s'; - $data = [$tokens[$first]['line']]; - $phpcsFile->addError($error, $next, 'Found', $data); - } else { - $classNames[$scope][$name] = $next; - } - - $next = $phpcsFile->findNext(T_OPEN_CURLY_BRACKET, ($next + 1)); - }//end while - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateStyleDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateStyleDefinitionSniff.php deleted file mode 100644 index c747975..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateStyleDefinitionSniff.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DuplicateStyleDefinitionSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['bracket_closer']) === false) { - // Syntax error or live coding, bow out. - return; - } - - // Find the content of each style definition name. - $styleNames = []; - - $next = $stackPtr; - $end = $tokens[$stackPtr]['bracket_closer']; - - do { - $next = $phpcsFile->findNext([T_STYLE, T_OPEN_CURLY_BRACKET], ($next + 1), $end); - if ($next === false) { - // Class definition is empty. - break; - } - - if ($tokens[$next]['code'] === T_OPEN_CURLY_BRACKET) { - $next = $tokens[$next]['bracket_closer']; - continue; - } - - $name = $tokens[$next]['content']; - if (isset($styleNames[$name]) === true) { - $first = $styleNames[$name]; - $error = 'Duplicate style definition found; first defined on line %s'; - $data = [$tokens[$first]['line']]; - $phpcsFile->addError($error, $next, 'Found', $data); - } else { - $styleNames[$name] = $next; - } - } while ($next !== false); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php deleted file mode 100644 index d3bb969..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EmptyClassDefinitionSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - if ($next === false || $tokens[$next]['code'] === T_CLOSE_CURLY_BRACKET) { - $error = 'Class definition is empty'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php deleted file mode 100644 index 05f2e51..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EmptyStyleDefinitionSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $ignore = Tokens::$emptyTokens; - $ignore[] = T_COLON; - - $next = $phpcsFile->findNext($ignore, ($stackPtr + 1), null, true); - if ($next === false || $tokens[$next]['code'] === T_SEMICOLON || $tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - $error = 'Style definition is empty'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ForbiddenStylesSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ForbiddenStylesSniff.php deleted file mode 100644 index d8585dc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ForbiddenStylesSniff.php +++ /dev/null @@ -1,177 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ForbiddenStylesSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - /** - * A list of forbidden styles with their alternatives. - * - * The value is NULL if no alternative exists. i.e., the - * style should just not be used. - * - * @var array - */ - protected $forbiddenStyles = [ - '-moz-border-radius' => 'border-radius', - '-webkit-border-radius' => 'border-radius', - '-moz-border-radius-topleft' => 'border-top-left-radius', - '-moz-border-radius-topright' => 'border-top-right-radius', - '-moz-border-radius-bottomright' => 'border-bottom-right-radius', - '-moz-border-radius-bottomleft' => 'border-bottom-left-radius', - '-moz-box-shadow' => 'box-shadow', - '-webkit-box-shadow' => 'box-shadow', - ]; - - /** - * A cache of forbidden style names, for faster lookups. - * - * @var string[] - */ - protected $forbiddenStyleNames = []; - - /** - * If true, forbidden styles will be considered regular expressions. - * - * @var boolean - */ - protected $patternMatch = false; - - /** - * If true, an error will be thrown; otherwise a warning. - * - * @var boolean - */ - public $error = true; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $this->forbiddenStyleNames = array_keys($this->forbiddenStyles); - - if ($this->patternMatch === true) { - foreach ($this->forbiddenStyleNames as $i => $name) { - $this->forbiddenStyleNames[$i] = '/'.$name.'/i'; - } - } - - return [T_STYLE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $style = strtolower($tokens[$stackPtr]['content']); - $pattern = null; - - if ($this->patternMatch === true) { - $count = 0; - $pattern = preg_replace( - $this->forbiddenStyleNames, - $this->forbiddenStyleNames, - $style, - 1, - $count - ); - - if ($count === 0) { - return; - } - - // Remove the pattern delimiters and modifier. - $pattern = substr($pattern, 1, -2); - } else { - if (in_array($style, $this->forbiddenStyleNames, true) === false) { - return; - } - }//end if - - $this->addError($phpcsFile, $stackPtr, $style, $pattern); - - }//end process() - - - /** - * Generates the error or warning for this sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the forbidden style - * in the token array. - * @param string $style The name of the forbidden style. - * @param string $pattern The pattern used for the match. - * - * @return void - */ - protected function addError($phpcsFile, $stackPtr, $style, $pattern=null) - { - $data = [$style]; - $error = 'The use of style %s is '; - if ($this->error === true) { - $type = 'Found'; - $error .= 'forbidden'; - } else { - $type = 'Discouraged'; - $error .= 'discouraged'; - } - - if ($pattern === null) { - $pattern = $style; - } - - if ($this->forbiddenStyles[$pattern] !== null) { - $data[] = $this->forbiddenStyles[$pattern]; - if ($this->error === true) { - $fix = $phpcsFile->addFixableError($error.'; use %s instead', $stackPtr, $type.'WithAlternative', $data); - } else { - $fix = $phpcsFile->addFixableWarning($error.'; use %s instead', $stackPtr, $type.'WithAlternative', $data); - } - - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $this->forbiddenStyles[$pattern]); - } - } else { - if ($this->error === true) { - $phpcsFile->addError($error, $stackPtr, $type, $data); - } else { - $phpcsFile->addWarning($error, $stackPtr, $type, $data); - } - } - - }//end addError() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/IndentationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/IndentationSniff.php deleted file mode 100644 index 5e35f4e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/IndentationSniff.php +++ /dev/null @@ -1,150 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class IndentationSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $numTokens = (count($tokens) - 2); - $indentLevel = 0; - $nestingLevel = 0; - for ($i = 1; $i < $numTokens; $i++) { - if ($tokens[$i]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$i]['code']]) === true - ) { - // Don't check the indent of comments. - continue; - } - - if ($tokens[$i]['code'] === T_OPEN_CURLY_BRACKET) { - $indentLevel++; - - if (isset($tokens[$i]['bracket_closer']) === false) { - // Syntax error or live coding. - // Anything after this would receive incorrect fixes, so bow out. - return; - } - - // Check for nested class definitions. - $found = $phpcsFile->findNext( - T_OPEN_CURLY_BRACKET, - ($i + 1), - $tokens[$i]['bracket_closer'] - ); - - if ($found !== false) { - $nestingLevel = $indentLevel; - } - } - - if (($tokens[$i]['code'] === T_CLOSE_CURLY_BRACKET - && $tokens[$i]['line'] !== $tokens[($i - 1)]['line']) - || ($tokens[($i + 1)]['code'] === T_CLOSE_CURLY_BRACKET - && $tokens[$i]['line'] === $tokens[($i + 1)]['line']) - ) { - $indentLevel--; - if ($indentLevel === 0) { - $nestingLevel = 0; - } - } - - if ($tokens[$i]['column'] !== 1 - || $tokens[$i]['code'] === T_OPEN_CURLY_BRACKET - || $tokens[$i]['code'] === T_CLOSE_CURLY_BRACKET - ) { - continue; - } - - // We started a new line, so check indent. - if ($tokens[$i]['code'] === T_WHITESPACE) { - $content = str_replace($phpcsFile->eolChar, '', $tokens[$i]['content']); - $foundIndent = strlen($content); - } else { - $foundIndent = 0; - } - - $expectedIndent = ($indentLevel * $this->indent); - if ($expectedIndent > 0 - && strpos($tokens[$i]['content'], $phpcsFile->eolChar) !== false - ) { - if ($nestingLevel !== $indentLevel) { - $error = 'Blank lines are not allowed in class definitions'; - $fix = $phpcsFile->addFixableError($error, $i, 'BlankLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - } else if ($foundIndent !== $expectedIndent) { - $error = 'Line indented incorrectly; expected %s spaces, found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $i, 'Incorrect', $data); - if ($fix === true) { - $indent = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($i, $indent); - } else { - $phpcsFile->fixer->replaceToken($i, $indent); - } - } - }//end if - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php deleted file mode 100644 index c80a639..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php +++ /dev/null @@ -1,97 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class LowercaseStyleDefinitionSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $start = ($stackPtr + 1); - $end = ($tokens[$stackPtr]['bracket_closer'] - 1); - $inStyle = null; - - for ($i = $start; $i <= $end; $i++) { - // Skip nested definitions as they are checked individually. - if ($tokens[$i]['code'] === T_OPEN_CURLY_BRACKET) { - $i = $tokens[$i]['bracket_closer']; - continue; - } - - if ($tokens[$i]['code'] === T_STYLE) { - $inStyle = $tokens[$i]['content']; - } - - if ($tokens[$i]['code'] === T_SEMICOLON) { - $inStyle = null; - } - - if ($inStyle === 'progid') { - // Special case for IE filters. - continue; - } - - if ($tokens[$i]['code'] === T_STYLE - || ($inStyle !== null - && $tokens[$i]['code'] === T_STRING) - ) { - $expected = strtolower($tokens[$i]['content']); - if ($expected !== $tokens[$i]['content']) { - $error = 'Style definitions must be lowercase; expected %s but found %s'; - $data = [ - $expected, - $tokens[$i]['content'], - ]; - - $fix = $phpcsFile->addFixableError($error, $i, 'FoundUpper', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($i, $expected); - } - } - } - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/MissingColonSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/MissingColonSniff.php deleted file mode 100644 index dbf7d6c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/MissingColonSniff.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class MissingColonSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['bracket_closer']) === false) { - // Syntax error or live coding, bow out. - return; - } - - $lastLine = $tokens[$stackPtr]['line']; - $end = $tokens[$stackPtr]['bracket_closer']; - - // Do not check nested style definitions as, for example, in @media style rules. - $nested = $phpcsFile->findNext(T_OPEN_CURLY_BRACKET, ($stackPtr + 1), $end); - if ($nested !== false) { - return; - } - - $foundColon = false; - $foundString = false; - for ($i = ($stackPtr + 1); $i <= $end; $i++) { - if ($tokens[$i]['line'] !== $lastLine) { - // We changed lines. - if ($foundColon === false && $foundString !== false) { - // We didn't find a colon on the previous line. - $error = 'No style definition found on line; check for missing colon'; - $phpcsFile->addError($error, $foundString, 'Found'); - } - - $foundColon = false; - $foundString = false; - $lastLine = $tokens[$i]['line']; - } - - if ($tokens[$i]['code'] === T_STRING) { - $foundString = $i; - } else if ($tokens[$i]['code'] === T_COLON) { - $foundColon = $i; - } - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/NamedColoursSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/NamedColoursSniff.php deleted file mode 100644 index 0a51f50..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/NamedColoursSniff.php +++ /dev/null @@ -1,93 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class NamedColoursSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - /** - * A list of named colours. - * - * This is the list of standard colours defined in the CSS specification. - * - * @var array - */ - protected $colourNames = [ - 'aqua' => 'aqua', - 'black' => 'black', - 'blue' => 'blue', - 'fuchsia' => 'fuchsia', - 'gray' => 'gray', - 'green' => 'green', - 'lime' => 'lime', - 'maroon' => 'maroon', - 'navy' => 'navy', - 'olive' => 'olive', - 'orange' => 'orange', - 'purple' => 'purple', - 'red' => 'red', - 'silver' => 'silver', - 'teal' => 'teal', - 'white' => 'white', - 'yellow' => 'yellow', - ]; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_STRING]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[($stackPtr - 1)]['code'] === T_HASH - || $tokens[($stackPtr - 1)]['code'] === T_STRING_CONCAT - ) { - // Class name. - return; - } - - if (isset($this->colourNames[strtolower($tokens[$stackPtr]['content'])]) === true) { - $error = 'Named colours are forbidden; use hex, rgb, or rgba values instead'; - $phpcsFile->addError($error, $stackPtr, 'Forbidden'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/OpacitySniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/OpacitySniff.php deleted file mode 100644 index 1dfbcf6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/OpacitySniff.php +++ /dev/null @@ -1,101 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class OpacitySniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['content'] !== 'opacity') { - return; - } - - $ignore = Tokens::$emptyTokens; - $ignore[] = T_COLON; - - $next = $phpcsFile->findNext($ignore, ($stackPtr + 1), null, true); - - if ($next === false - || ($tokens[$next]['code'] !== T_DNUMBER - && $tokens[$next]['code'] !== T_LNUMBER) - ) { - return; - } - - $value = $tokens[$next]['content']; - if ($tokens[$next]['code'] === T_LNUMBER) { - if ($value !== '0' && $value !== '1') { - $error = 'Opacity values must be between 0 and 1'; - $phpcsFile->addError($error, $next, 'Invalid'); - } - } else { - if (strlen($value) > 3) { - $error = 'Opacity values must have a single value after the decimal point'; - $phpcsFile->addError($error, $next, 'DecimalPrecision'); - } else if ($value === '0.0' || $value === '1.0') { - $error = 'Opacity value does not require decimal point; use %s instead'; - $data = [$value[0]]; - $fix = $phpcsFile->addFixableError($error, $next, 'PointNotRequired', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($next, $value[0]); - } - } else if ($value[0] === '.') { - $error = 'Opacity values must not start with a decimal point; use 0%s instead'; - $data = [$value]; - $fix = $phpcsFile->addFixableError($error, $next, 'StartWithPoint', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($next, '0'.$value); - } - } else if ($value[0] !== '0') { - $error = 'Opacity values must be between 0 and 1'; - $phpcsFile->addError($error, $next, 'Invalid'); - }//end if - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/SemicolonSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/SemicolonSpacingSniff.php deleted file mode 100644 index fdc168e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/SemicolonSpacingSniff.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SemicolonSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextStatement = $phpcsFile->findNext([T_STYLE, T_CLOSE_CURLY_BRACKET], ($stackPtr + 1)); - if ($nextStatement === false) { - return; - } - - $ignore = Tokens::$emptyTokens; - if ($tokens[$nextStatement]['code'] === T_STYLE) { - // Allow for star-prefix hack. - $ignore[] = T_MULTIPLY; - } - - $endOfThisStatement = $phpcsFile->findPrevious($ignore, ($nextStatement - 1), null, true); - if ($tokens[$endOfThisStatement]['code'] !== T_SEMICOLON) { - $error = 'Style definitions must end with a semicolon'; - $phpcsFile->addError($error, $endOfThisStatement, 'NotAtEnd'); - return; - } - - if ($tokens[($endOfThisStatement - 1)]['code'] !== T_WHITESPACE) { - return; - } - - // There is a semi-colon, so now find the last token in the statement. - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($endOfThisStatement - 1), null, true); - $found = $tokens[($endOfThisStatement - 1)]['length']; - if ($tokens[$prevNonEmpty]['line'] !== $tokens[$endOfThisStatement]['line']) { - $found = 'newline'; - } - - $error = 'Expected 0 spaces before semicolon in style definition; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $prevNonEmpty, 'SpaceFound', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($prevNonEmpty, ';'); - $phpcsFile->fixer->replaceToken($endOfThisStatement, ''); - - for ($i = ($endOfThisStatement - 1); $i > $prevNonEmpty; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ShorthandSizeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ShorthandSizeSniff.php deleted file mode 100644 index 8f2d9aa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ShorthandSizeSniff.php +++ /dev/null @@ -1,181 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ShorthandSizeSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - /** - * A list of styles that we shouldn't check. - * - * These have values that looks like sizes, but are not. - * - * @var array - */ - protected $excludeStyles = [ - 'background-position' => 'background-position', - 'box-shadow' => 'box-shadow', - 'transform-origin' => 'transform-origin', - '-webkit-transform-origin' => '-webkit-transform-origin', - '-ms-transform-origin' => '-ms-transform-origin', - ]; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Some styles look like shorthand but are not actually a set of 4 sizes. - $style = strtolower($tokens[$stackPtr]['content']); - if (isset($this->excludeStyles[$style]) === true) { - return; - } - - $end = $phpcsFile->findNext(T_SEMICOLON, ($stackPtr + 1)); - if ($end === false) { - // Live coding or parse error. - return; - } - - // Get the whole style content. - $origContent = $phpcsFile->getTokensAsString(($stackPtr + 1), ($end - $stackPtr - 1)); - $origContent = trim($origContent, ':'); - $origContent = trim($origContent); - - // Account for a !important annotation. - $content = $origContent; - if (substr($content, -10) === '!important') { - $content = substr($content, 0, -10); - $content = trim($content); - } - - // Check if this style value is a set of numbers with optional prefixes. - $content = preg_replace('/\s+/', ' ', $content); - $values = []; - $num = preg_match_all( - '/(?:[0-9]+)(?:[a-zA-Z]{2}\s+|%\s+|\s+)/', - $content.' ', - $values, - PREG_SET_ORDER - ); - - // Only interested in styles that have multiple sizes defined. - if ($num < 2) { - return; - } - - // Rebuild the content we matched to ensure we got everything. - $matched = ''; - foreach ($values as $value) { - $matched .= $value[0]; - } - - if ($content !== trim($matched)) { - return; - } - - if ($num === 3) { - $expected = trim($content.' '.$values[1][0]); - $error = 'Shorthand syntax not allowed here; use %s instead'; - $data = [$expected]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotAllowed', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if (substr($origContent, -10) === '!important') { - $expected .= ' !important'; - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 2), null, true); - $phpcsFile->fixer->replaceToken($next, $expected); - for ($next++; $next < $end; $next++) { - $phpcsFile->fixer->replaceToken($next, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - }//end if - - if ($num === 2) { - if ($values[0][0] !== $values[1][0]) { - // Both values are different, so it is already shorthand. - return; - } - } else if ($values[0][0] !== $values[2][0] || $values[1][0] !== $values[3][0]) { - // Can't shorthand this. - return; - } - - if ($values[0][0] === $values[1][0]) { - // All values are the same. - $expected = trim($values[0][0]); - } else { - $expected = trim($values[0][0]).' '.trim($values[1][0]); - } - - $error = 'Size definitions must use shorthand if available; expected "%s" but found "%s"'; - $data = [ - $expected, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotUsed', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if (substr($origContent, -10) === '!important') { - $expected .= ' !important'; - } - - $next = $phpcsFile->findNext(T_COLON, ($stackPtr + 1)); - $phpcsFile->fixer->addContent($next, ' '.$expected); - for ($next++; $next < $end; $next++) { - $phpcsFile->fixer->replaceToken($next, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassDeclarationSniff.php deleted file mode 100644 index 3d2c4db..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassDeclarationSniff.php +++ /dev/null @@ -1,206 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\ClassDeclarationSniff as PSR2ClassDeclarationSniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassDeclarationSniff extends PSR2ClassDeclarationSniff -{ - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // We want all the errors from the PSR2 standard, plus some of our own. - parent::process($phpcsFile, $stackPtr); - - // Check that this is the only class or interface in the file. - $nextClass = $phpcsFile->findNext([T_CLASS, T_INTERFACE], ($stackPtr + 1)); - if ($nextClass !== false) { - // We have another, so an error is thrown. - $error = 'Only one interface or class is allowed in a file'; - $phpcsFile->addError($error, $nextClass, 'MultipleClasses'); - } - - }//end process() - - - /** - * Processes the opening section of a class declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processOpen(File $phpcsFile, $stackPtr) - { - parent::processOpen($phpcsFile, $stackPtr); - - $tokens = $phpcsFile->getTokens(); - - if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - $prevContent = $tokens[($stackPtr - 1)]['content']; - if ($prevContent !== $phpcsFile->eolChar) { - $blankSpace = substr($prevContent, strpos($prevContent, $phpcsFile->eolChar)); - $spaces = strlen($blankSpace); - - if ($tokens[($stackPtr - 2)]['code'] !== T_ABSTRACT - && $tokens[($stackPtr - 2)]['code'] !== T_FINAL - ) { - if ($spaces !== 0) { - $type = strtolower($tokens[$stackPtr]['content']); - $error = 'Expected 0 spaces before %s keyword; %s found'; - $data = [ - $type, - $spaces, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeKeyword', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } - } - } - }//end if - }//end if - - }//end processOpen() - - - /** - * Processes the closing section of a class declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processClose(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $closeBrace = $tokens[$stackPtr]['scope_closer']; - - // Check that the closing brace has one blank line after it. - for ($nextContent = ($closeBrace + 1); $nextContent < $phpcsFile->numTokens; $nextContent++) { - // Ignore comments on the same line as the brace. - if ($tokens[$nextContent]['line'] === $tokens[$closeBrace]['line'] - && ($tokens[$nextContent]['code'] === T_WHITESPACE - || $tokens[$nextContent]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$nextContent]['code']]) === true) - ) { - continue; - } - - if ($tokens[$nextContent]['code'] !== T_WHITESPACE) { - break; - } - } - - if ($nextContent === $phpcsFile->numTokens) { - // Ignore the line check as this is the very end of the file. - $difference = 1; - } else { - $difference = ($tokens[$nextContent]['line'] - $tokens[$closeBrace]['line'] - 1); - } - - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBrace - 1), $stackPtr, true); - - if ($difference === -1 - || $tokens[$lastContent]['line'] === $tokens[$closeBrace]['line'] - ) { - $error = 'Closing %s brace must be on a line by itself'; - $data = [$tokens[$stackPtr]['content']]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'CloseBraceSameLine', $data); - if ($fix === true) { - if ($difference === -1) { - $phpcsFile->fixer->addNewlineBefore($nextContent); - } - - if ($tokens[$lastContent]['line'] === $tokens[$closeBrace]['line']) { - $phpcsFile->fixer->addNewlineBefore($closeBrace); - } - } - } else if ($tokens[($closeBrace - 1)]['code'] === T_WHITESPACE) { - $prevContent = $tokens[($closeBrace - 1)]['content']; - if ($prevContent !== $phpcsFile->eolChar) { - $blankSpace = substr($prevContent, strpos($prevContent, $phpcsFile->eolChar)); - $spaces = strlen($blankSpace); - if ($spaces !== 0) { - if ($tokens[($closeBrace - 1)]['line'] !== $tokens[$closeBrace]['line']) { - $error = 'Expected 0 spaces before closing brace; newline found'; - $phpcsFile->addError($error, $closeBrace, 'NewLineBeforeCloseBrace'); - } else { - $error = 'Expected 0 spaces before closing brace; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpaceBeforeCloseBrace', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($closeBrace - 1), ''); - } - } - } - } - }//end if - - if ($difference !== -1 && $difference !== 1) { - if ($tokens[$nextContent]['code'] === T_DOC_COMMENT_OPEN_TAG) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($tokens[$nextContent]['comment_closer'] + 1), null, true); - if ($next !== false && $tokens[$next]['code'] === T_FUNCTION) { - return; - } - } - - $error = 'Closing brace of a %s must be followed by a single blank line; found %s'; - $data = [ - $tokens[$stackPtr]['content'], - $difference, - ]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'NewlinesAfterCloseBrace', $data); - if ($fix === true) { - if ($difference === 0) { - $first = $phpcsFile->findFirstOnLine([], $nextContent, true); - $phpcsFile->fixer->addNewlineBefore($first); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($closeBrace + 1); $i < $nextContent; $i++) { - if ($tokens[$i]['line'] <= ($tokens[$closeBrace]['line'] + 1)) { - continue; - } else if ($tokens[$i]['line'] === $tokens[$nextContent]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - }//end processClose() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassFileNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassFileNameSniff.php deleted file mode 100644 index afbec4f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassFileNameSniff.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClassFileNameSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $fullPath = basename($phpcsFile->getFilename()); - $fileName = substr($fullPath, 0, strrpos($fullPath, '.')); - if ($fileName === '') { - // No filename probably means STDIN, so we can't do this check. - return; - } - - $tokens = $phpcsFile->getTokens(); - $decName = $phpcsFile->findNext(T_STRING, $stackPtr); - - if ($tokens[$decName]['content'] !== $fileName) { - $error = '%s name doesn\'t match filename; expected "%s %s"'; - $data = [ - ucfirst($tokens[$stackPtr]['content']), - $tokens[$stackPtr]['content'], - $fileName, - ]; - $phpcsFile->addError($error, $stackPtr, 'NoMatch', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/DuplicatePropertySniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/DuplicatePropertySniff.php deleted file mode 100644 index a632f81..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/DuplicatePropertySniff.php +++ /dev/null @@ -1,82 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DuplicatePropertySniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OBJECT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being processed. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $properties = []; - $wantedTokens = [ - T_PROPERTY, - T_OBJECT, - ]; - - $next = $phpcsFile->findNext($wantedTokens, ($stackPtr + 1), $tokens[$stackPtr]['bracket_closer']); - while ($next !== false && $next < $tokens[$stackPtr]['bracket_closer']) { - if ($tokens[$next]['code'] === T_OBJECT) { - // Skip nested objects. - $next = $tokens[$next]['bracket_closer']; - } else { - $propName = $tokens[$next]['content']; - if (isset($properties[$propName]) === true) { - $error = 'Duplicate property definition found for "%s"; previously defined on line %s'; - $data = [ - $propName, - $tokens[$properties[$propName]]['line'], - ]; - $phpcsFile->addError($error, $next, 'Found', $data); - } - - $properties[$propName] = $next; - }//end if - - $next = $phpcsFile->findNext($wantedTokens, ($next + 1), $tokens[$stackPtr]['bracket_closer']); - }//end while - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/LowercaseClassKeywordsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/LowercaseClassKeywordsSniff.php deleted file mode 100644 index 5f4f78c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/LowercaseClassKeywordsSniff.php +++ /dev/null @@ -1,72 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class LowercaseClassKeywordsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $targets = Tokens::$ooScopeTokens; - $targets[] = T_EXTENDS; - $targets[] = T_IMPLEMENTS; - $targets[] = T_ABSTRACT; - $targets[] = T_FINAL; - $targets[] = T_VAR; - $targets[] = T_CONST; - - return $targets; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $contentLc = strtolower($content); - if ($content !== $contentLc) { - $error = '%s keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - strtoupper($content), - $contentLc, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'FoundUppercase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLc); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php deleted file mode 100644 index d17ca44..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php +++ /dev/null @@ -1,240 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Tokens; - -class SelfMemberReferenceSniff extends AbstractScopeSniff -{ - - - /** - * Constructs a Squiz_Sniffs_Classes_SelfMemberReferenceSniff. - */ - public function __construct() - { - parent::__construct([T_CLASS], [T_DOUBLE_COLON]); - - }//end __construct() - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * @param int $currScope The current scope opener token. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a double colon which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - $conditions = array_reverse($conditions, true); - foreach ($conditions as $conditionToken => $tokenCode) { - if ($tokenCode === T_CLASS || $tokenCode === T_ANON_CLASS || $tokenCode === T_CLOSURE) { - break; - } - } - - if ($conditionToken !== $currScope) { - return; - } - - $calledClassName = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($calledClassName === false) { - // Parse error. - return; - } - - if ($tokens[$calledClassName]['code'] === T_SELF) { - if ($tokens[$calledClassName]['content'] !== 'self') { - $error = 'Must use "self::" for local static member reference; found "%s::"'; - $data = [$tokens[$calledClassName]['content']]; - $fix = $phpcsFile->addFixableError($error, $calledClassName, 'IncorrectCase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($calledClassName, 'self'); - } - - return; - } - } else if ($tokens[$calledClassName]['code'] === T_STRING) { - // If the class is called with a namespace prefix, build fully qualified - // namespace calls for both current scope class and requested class. - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($calledClassName - 1), null, true); - if ($prevNonEmpty !== false && $tokens[$prevNonEmpty]['code'] === T_NS_SEPARATOR) { - $declarationName = $this->getDeclarationNameWithNamespace($tokens, $calledClassName); - $declarationName = ltrim($declarationName, '\\'); - $fullQualifiedClassName = $this->getNamespaceOfScope($phpcsFile, $currScope); - if ($fullQualifiedClassName === '\\') { - $fullQualifiedClassName = ''; - } else { - $fullQualifiedClassName .= '\\'; - } - - $fullQualifiedClassName .= $phpcsFile->getDeclarationName($currScope); - } else { - $declarationName = $phpcsFile->getDeclarationName($currScope); - $fullQualifiedClassName = $tokens[$calledClassName]['content']; - } - - if ($declarationName === $fullQualifiedClassName) { - // Class name is the same as the current class, which is not allowed. - $error = 'Must use "self::" for local static member reference'; - $fix = $phpcsFile->addFixableError($error, $calledClassName, 'NotUsed'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $currentPointer = ($stackPtr - 1); - while ($tokens[$currentPointer]['code'] === T_NS_SEPARATOR - || $tokens[$currentPointer]['code'] === T_STRING - || isset(Tokens::$emptyTokens[$tokens[$currentPointer]['code']]) === true - ) { - if (isset(Tokens::$emptyTokens[$tokens[$currentPointer]['code']]) === true) { - --$currentPointer; - continue; - } - - $phpcsFile->fixer->replaceToken($currentPointer, ''); - --$currentPointer; - } - - $phpcsFile->fixer->replaceToken($stackPtr, 'self::'); - $phpcsFile->fixer->endChangeset(); - - // Fix potential whitespace issues in the next loop. - return; - }//end if - }//end if - }//end if - - if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - $found = $tokens[($stackPtr - 1)]['length']; - $error = 'Expected 0 spaces before double colon; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, ($stackPtr - 1), 'SpaceBefore', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($stackPtr - 1); $tokens[$i]['code'] === T_WHITESPACE; $i--) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $found = $tokens[($stackPtr + 1)]['length']; - $error = 'Expected 0 spaces after double colon; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, ($stackPtr - 1), 'SpaceAfter', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($stackPtr + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - }//end processTokenWithinScope() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - - /** - * Returns the declaration names for classes/interfaces/functions with a namespace. - * - * @param array $tokens Token stack for this file - * @param int $stackPtr The position where the namespace building will start. - * - * @return string - */ - protected function getDeclarationNameWithNamespace(array $tokens, $stackPtr) - { - $nameParts = []; - $currentPointer = $stackPtr; - while ($tokens[$currentPointer]['code'] === T_NS_SEPARATOR - || $tokens[$currentPointer]['code'] === T_STRING - || isset(Tokens::$emptyTokens[$tokens[$currentPointer]['code']]) === true - ) { - if (isset(Tokens::$emptyTokens[$tokens[$currentPointer]['code']]) === true) { - --$currentPointer; - continue; - } - - $nameParts[] = $tokens[$currentPointer]['content']; - --$currentPointer; - } - - $nameParts = array_reverse($nameParts); - return implode('', $nameParts); - - }//end getDeclarationNameWithNamespace() - - - /** - * Returns the namespace declaration of a file. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the search for the - * namespace declaration will start. - * - * @return string - */ - protected function getNamespaceOfScope(File $phpcsFile, $stackPtr) - { - $namespace = '\\'; - $namespaceDeclaration = $phpcsFile->findPrevious(T_NAMESPACE, $stackPtr); - - if ($namespaceDeclaration !== false) { - $endOfNamespaceDeclaration = $phpcsFile->findNext([T_SEMICOLON, T_OPEN_CURLY_BRACKET], $namespaceDeclaration); - $namespace = $this->getDeclarationNameWithNamespace( - $phpcsFile->getTokens(), - ($endOfNamespaceDeclaration - 1) - ); - } - - return $namespace; - - }//end getNamespaceOfScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ValidClassNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ValidClassNameSniff.php deleted file mode 100644 index 10de719..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ValidClassNameSniff.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Common; - -class ValidClassNameSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being processed. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - $error = 'Possible parse error: %s missing opening or closing brace'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addWarning($error, $stackPtr, 'MissingBrace', $data); - return; - } - - // Determine the name of the class or interface. Note that we cannot - // simply look for the first T_STRING because a class name - // starting with the number will be multiple tokens. - $opener = $tokens[$stackPtr]['scope_opener']; - $nameStart = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), $opener, true); - $nameEnd = $phpcsFile->findNext(T_WHITESPACE, $nameStart, $opener); - if ($nameEnd === false) { - $name = $tokens[$nameStart]['content']; - } else { - $name = trim($phpcsFile->getTokensAsString($nameStart, ($nameEnd - $nameStart))); - } - - // Check for PascalCase format. - $valid = Common::isCamelCaps($name, true, true, false); - if ($valid === false) { - $type = ucfirst($tokens[$stackPtr]['content']); - $error = '%s name "%s" is not in PascalCase format'; - $data = [ - $type, - $name, - ]; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $data); - $phpcsFile->recordMetric($stackPtr, 'PascalCase class name', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'PascalCase class name', 'yes'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php deleted file mode 100644 index ae9db79..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php +++ /dev/null @@ -1,388 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class BlockCommentSniff implements Sniff -{ - - /** - * The --tab-width CLI value that is being used. - * - * @var integer - */ - private $tabWidth = null; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_COMMENT, - T_DOC_COMMENT_OPEN_TAG, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->tabWidth === null) { - if (isset($phpcsFile->config->tabWidth) === false || $phpcsFile->config->tabWidth === 0) { - // We have no idea how wide tabs are, so assume 4 spaces for fixing. - $this->tabWidth = 4; - } else { - $this->tabWidth = $phpcsFile->config->tabWidth; - } - } - - $tokens = $phpcsFile->getTokens(); - - // If it's an inline comment, return. - if (substr($tokens[$stackPtr]['content'], 0, 2) !== '/*') { - return; - } - - // If this is a function/class/interface doc block comment, skip it. - // We are only interested in inline doc block comments. - if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT_OPEN_TAG) { - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - $ignore = [ - T_CLASS => true, - T_INTERFACE => true, - T_TRAIT => true, - T_FUNCTION => true, - T_PUBLIC => true, - T_PRIVATE => true, - T_FINAL => true, - T_PROTECTED => true, - T_STATIC => true, - T_ABSTRACT => true, - T_CONST => true, - T_VAR => true, - ]; - if (isset($ignore[$tokens[$nextToken]['code']]) === true) { - return; - } - - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prevToken]['code'] === T_OPEN_TAG) { - return; - } - - $error = 'Block comments must be started with /*'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStart'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, '/*'); - } - - $end = $tokens[$stackPtr]['comment_closer']; - if ($tokens[$end]['content'] !== '*/') { - $error = 'Block comments must be ended with */'; - $fix = $phpcsFile->addFixableError($error, $end, 'WrongEnd'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($end, '*/'); - } - } - - return; - }//end if - - $commentLines = [$stackPtr]; - $nextComment = $stackPtr; - $lastLine = $tokens[$stackPtr]['line']; - $commentString = $tokens[$stackPtr]['content']; - - // Construct the comment into an array. - while (($nextComment = $phpcsFile->findNext(T_WHITESPACE, ($nextComment + 1), null, true)) !== false) { - if ($tokens[$nextComment]['code'] !== $tokens[$stackPtr]['code'] - && isset(Tokens::$phpcsCommentTokens[$tokens[$nextComment]['code']]) === false - ) { - // Found the next bit of code. - break; - } - - if (($tokens[$nextComment]['line'] - 1) !== $lastLine) { - // Not part of the block. - break; - } - - $lastLine = $tokens[$nextComment]['line']; - $commentLines[] = $nextComment; - $commentString .= $tokens[$nextComment]['content']; - if ($tokens[$nextComment]['code'] === T_DOC_COMMENT_CLOSE_TAG - || substr($tokens[$nextComment]['content'], -2) === '*/' - ) { - break; - } - }//end while - - $commentText = str_replace($phpcsFile->eolChar, '', $commentString); - $commentText = trim($commentText, "/* \t"); - if ($commentText === '') { - $error = 'Empty block comment not allowed'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Empty'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($stackPtr, ''); - $lastToken = array_pop($commentLines); - for ($i = ($stackPtr + 1); $i <= $lastToken; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - } - - if (count($commentLines) === 1) { - $error = 'Single line block comment not allowed; use inline ("// text") comment instead'; - - // Only fix comments when they are the last token on a line. - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line']) { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SingleLine'); - if ($fix === true) { - $comment = '// '.$commentText.$phpcsFile->eolChar; - $phpcsFile->fixer->replaceToken($stackPtr, $comment); - } - } else { - $phpcsFile->addError($error, $stackPtr, 'SingleLine'); - } - - return; - } - - $content = trim($tokens[$stackPtr]['content']); - if ($content !== '/*' && $content !== '/**') { - $error = 'Block comment text must start on a new line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoNewLine'); - if ($fix === true) { - $indent = ''; - if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - if (isset($tokens[($stackPtr - 1)]['orig_content']) === true) { - $indent = $tokens[($stackPtr - 1)]['orig_content']; - } else { - $indent = $tokens[($stackPtr - 1)]['content']; - } - } - - $comment = preg_replace( - '/^(\s*\/\*\*?)/', - '$1'.$phpcsFile->eolChar.$indent, - $tokens[$stackPtr]['content'], - 1 - ); - $phpcsFile->fixer->replaceToken($stackPtr, $comment); - } - - return; - }//end if - - $starColumn = $tokens[$stackPtr]['column']; - $hasStars = false; - - // Make sure first line isn't blank. - if (trim($tokens[$commentLines[1]]['content']) === '') { - $error = 'Empty line not allowed at start of comment'; - $fix = $phpcsFile->addFixableError($error, $commentLines[1], 'HasEmptyLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($commentLines[1], ''); - } - } else { - // Check indentation of first line. - $content = $tokens[$commentLines[1]]['content']; - $commentText = ltrim($content); - $leadingSpace = (strlen($content) - strlen($commentText)); - - $expected = ($starColumn + 3); - if ($commentText[0] === '*') { - $expected = $starColumn; - $hasStars = true; - } - - if ($leadingSpace !== $expected) { - $expectedTxt = $expected.' space'; - if ($expected !== 1) { - $expectedTxt .= 's'; - } - - $data = [ - $expectedTxt, - $leadingSpace, - ]; - - $error = 'First line of comment not aligned correctly; expected %s but found %s'; - $fix = $phpcsFile->addFixableError($error, $commentLines[1], 'FirstLineIndent', $data); - if ($fix === true) { - if (isset($tokens[$commentLines[1]]['orig_content']) === true - && $tokens[$commentLines[1]]['orig_content'][0] === "\t" - ) { - // Line is indented using tabs. - $padding = str_repeat("\t", floor($expected / $this->tabWidth)); - $padding .= str_repeat(' ', ($expected % $this->tabWidth)); - } else { - $padding = str_repeat(' ', $expected); - } - - $phpcsFile->fixer->replaceToken($commentLines[1], $padding.$commentText); - } - }//end if - - if (preg_match('/^\p{Ll}/u', $commentText) === 1) { - $error = 'Block comments must start with a capital letter'; - $phpcsFile->addError($error, $commentLines[1], 'NoCapital'); - } - }//end if - - // Check that each line of the comment is indented past the star. - foreach ($commentLines as $line) { - // First and last lines (comment opener and closer) are handled separately. - if ($line === $commentLines[(count($commentLines) - 1)] || $line === $commentLines[0]) { - continue; - } - - // First comment line was handled above. - if ($line === $commentLines[1]) { - continue; - } - - // If it's empty, continue. - if (trim($tokens[$line]['content']) === '') { - continue; - } - - $commentText = ltrim($tokens[$line]['content']); - $leadingSpace = (strlen($tokens[$line]['content']) - strlen($commentText)); - - $expected = ($starColumn + 3); - if ($commentText[0] === '*') { - $expected = $starColumn; - $hasStars = true; - } - - if ($leadingSpace < $expected) { - $expectedTxt = $expected.' space'; - if ($expected !== 1) { - $expectedTxt .= 's'; - } - - $data = [ - $expectedTxt, - $leadingSpace, - ]; - - $error = 'Comment line indented incorrectly; expected at least %s but found %s'; - $fix = $phpcsFile->addFixableError($error, $line, 'LineIndent', $data); - if ($fix === true) { - if (isset($tokens[$line]['orig_content']) === true - && $tokens[$line]['orig_content'][0] === "\t" - ) { - // Line is indented using tabs. - $padding = str_repeat("\t", floor($expected / $this->tabWidth)); - $padding .= str_repeat(' ', ($expected % $this->tabWidth)); - } else { - $padding = str_repeat(' ', $expected); - } - - $phpcsFile->fixer->replaceToken($line, $padding.$commentText); - } - }//end if - }//end foreach - - // Finally, test the last line is correct. - $lastIndex = (count($commentLines) - 1); - $content = $tokens[$commentLines[$lastIndex]]['content']; - $commentText = ltrim($content); - if ($commentText !== '*/' && $commentText !== '**/') { - $error = 'Comment closer must be on a new line'; - $phpcsFile->addError($error, $commentLines[$lastIndex], 'CloserSameLine'); - } else { - $leadingSpace = (strlen($content) - strlen($commentText)); - - $expected = ($starColumn - 1); - if ($hasStars === true) { - $expected = $starColumn; - } - - if ($leadingSpace !== $expected) { - $expectedTxt = $expected.' space'; - if ($expected !== 1) { - $expectedTxt .= 's'; - } - - $data = [ - $expectedTxt, - $leadingSpace, - ]; - - $error = 'Last line of comment aligned incorrectly; expected %s but found %s'; - $fix = $phpcsFile->addFixableError($error, $commentLines[$lastIndex], 'LastLineIndent', $data); - if ($fix === true) { - if (isset($tokens[$line]['orig_content']) === true - && $tokens[$line]['orig_content'][0] === "\t" - ) { - // Line is indented using tabs. - $padding = str_repeat("\t", floor($expected / $this->tabWidth)); - $padding .= str_repeat(' ', ($expected % $this->tabWidth)); - } else { - $padding = str_repeat(' ', $expected); - } - - $phpcsFile->fixer->replaceToken($commentLines[$lastIndex], $padding.$commentText); - } - }//end if - }//end if - - // Check that the lines before and after this comment are blank. - $contentBefore = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ((isset($tokens[$contentBefore]['scope_closer']) === true - && $tokens[$contentBefore]['scope_opener'] === $contentBefore) - || $tokens[$contentBefore]['code'] === T_OPEN_TAG - ) { - if (($tokens[$stackPtr]['line'] - $tokens[$contentBefore]['line']) !== 1) { - $error = 'Empty line not required before block comment'; - $phpcsFile->addError($error, $stackPtr, 'HasEmptyLineBefore'); - } - } else { - if (($tokens[$stackPtr]['line'] - $tokens[$contentBefore]['line']) < 2) { - $error = 'Empty line required before block comment'; - $phpcsFile->addError($error, $stackPtr, 'NoEmptyLineBefore'); - } - } - - $commentCloser = $commentLines[$lastIndex]; - $contentAfter = $phpcsFile->findNext(T_WHITESPACE, ($commentCloser + 1), null, true); - if ($contentAfter !== false && ($tokens[$contentAfter]['line'] - $tokens[$commentCloser]['line']) < 2) { - $error = 'Empty line required after block comment'; - $phpcsFile->addError($error, $commentCloser, 'NoEmptyLineAfter'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php deleted file mode 100644 index 3aa969d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php +++ /dev/null @@ -1,87 +0,0 @@ - - *
  • A class doc comment exists.
  • - *
  • The comment uses the correct docblock style.
  • - *
  • There are no blank lines after the class comment.
  • - *
  • No tags are used in the docblock.
  • - * - * - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassCommentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CLASS]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $find = Tokens::$methodPrefixes; - $find[] = T_WHITESPACE; - - $commentEnd = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true); - if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG - && $tokens[$commentEnd]['code'] !== T_COMMENT - ) { - $class = $phpcsFile->getDeclarationName($stackPtr); - $phpcsFile->addError('Missing doc comment for class %s', $stackPtr, 'Missing', [$class]); - $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'no'); - return; - } - - $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'yes'); - - if ($tokens[$commentEnd]['code'] === T_COMMENT) { - $phpcsFile->addError('You must use "/**" style comments for a class comment', $stackPtr, 'WrongStyle'); - return; - } - - if ($tokens[$commentEnd]['line'] !== ($tokens[$stackPtr]['line'] - 1)) { - $error = 'There must be no blank lines after the class comment'; - $phpcsFile->addError($error, $commentEnd, 'SpacingAfter'); - } - - $commentStart = $tokens[$commentEnd]['comment_opener']; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - $error = '%s tag is not allowed in class comment'; - $data = [$tokens[$tag]['content']]; - $phpcsFile->addWarning($error, $tag, 'TagNotAllowed', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClosingDeclarationCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClosingDeclarationCommentSniff.php deleted file mode 100644 index 6ab6280..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClosingDeclarationCommentSniff.php +++ /dev/null @@ -1,129 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClosingDeclarationCommentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLASS, - T_INTERFACE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens.. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_FUNCTION) { - $methodProps = $phpcsFile->getMethodProperties($stackPtr); - - // Abstract methods do not require a closing comment. - if ($methodProps['is_abstract'] === true) { - return; - } - - // If this function is in an interface then we don't require - // a closing comment. - if ($phpcsFile->hasCondition($stackPtr, T_INTERFACE) === true) { - return; - } - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - $error = 'Possible parse error: non-abstract method defined as abstract'; - $phpcsFile->addWarning($error, $stackPtr, 'Abstract'); - return; - } - - $decName = $phpcsFile->getDeclarationName($stackPtr); - $comment = '//end '.$decName.'()'; - } else if ($tokens[$stackPtr]['code'] === T_CLASS) { - $comment = '//end class'; - } else { - $comment = '//end interface'; - }//end if - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - $error = 'Possible parse error: %s missing opening or closing brace'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addWarning($error, $stackPtr, 'MissingBrace', $data); - return; - } - - $closingBracket = $tokens[$stackPtr]['scope_closer']; - - if ($closingBracket === null) { - // Possible inline structure. Other tests will handle it. - return; - } - - $data = [$comment]; - if (isset($tokens[($closingBracket + 1)]) === false || $tokens[($closingBracket + 1)]['code'] !== T_COMMENT) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($closingBracket + 1), null, true); - if (rtrim($tokens[$next]['content']) === $comment) { - // The comment isn't really missing; it is just in the wrong place. - $fix = $phpcsFile->addFixableError('Expected %s directly after closing brace', $closingBracket, 'Misplaced', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($closingBracket + 1); $i < $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // Just in case, because indentation fixes can add indents onto - // these comments and cause us to be unable to fix them. - $phpcsFile->fixer->replaceToken($next, $comment.$phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - } else { - $fix = $phpcsFile->addFixableError('Expected %s', $closingBracket, 'Missing', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($closingBracket, '}'.$comment.$phpcsFile->eolChar); - } - } - - return; - }//end if - - if (rtrim($tokens[($closingBracket + 1)]['content']) !== $comment) { - $fix = $phpcsFile->addFixableError('Expected %s', $closingBracket, 'Incorrect', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($closingBracket + 1), $comment.$phpcsFile->eolChar); - } - - return; - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php deleted file mode 100644 index 2624bc2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php +++ /dev/null @@ -1,158 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DocCommentAlignmentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DOC_COMMENT_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // We are only interested in function/class/interface doc block comments. - $ignore = Tokens::$emptyTokens; - if ($phpcsFile->tokenizerType === 'JS') { - $ignore[] = T_EQUAL; - $ignore[] = T_STRING; - $ignore[] = T_OBJECT_OPERATOR; - } - - $nextToken = $phpcsFile->findNext($ignore, ($stackPtr + 1), null, true); - $ignore = [ - T_CLASS => true, - T_INTERFACE => true, - T_FUNCTION => true, - T_PUBLIC => true, - T_PRIVATE => true, - T_PROTECTED => true, - T_STATIC => true, - T_ABSTRACT => true, - T_PROPERTY => true, - T_OBJECT => true, - T_PROTOTYPE => true, - T_VAR => true, - ]; - - if ($nextToken === false || isset($ignore[$tokens[$nextToken]['code']]) === false) { - // Could be a file comment. - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prevToken]['code'] !== T_OPEN_TAG) { - return; - } - } - - // There must be one space after each star (unless it is an empty comment line) - // and all the stars must be aligned correctly. - $requiredColumn = ($tokens[$stackPtr]['column'] + 1); - $endComment = $tokens[$stackPtr]['comment_closer']; - for ($i = ($stackPtr + 1); $i <= $endComment; $i++) { - if ($tokens[$i]['code'] !== T_DOC_COMMENT_STAR - && $tokens[$i]['code'] !== T_DOC_COMMENT_CLOSE_TAG - ) { - continue; - } - - if ($tokens[$i]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - if (trim($tokens[$i]['content']) === '') { - // Don't process an unfinished docblock close tag during live coding. - continue; - } - - // Can't process the close tag if it is not the first thing on the line. - $prev = $phpcsFile->findPrevious(T_DOC_COMMENT_WHITESPACE, ($i - 1), $stackPtr, true); - if ($tokens[$prev]['line'] === $tokens[$i]['line']) { - continue; - } - } - - if ($tokens[$i]['column'] !== $requiredColumn) { - $error = 'Expected %s space(s) before asterisk; %s found'; - $data = [ - ($requiredColumn - 1), - ($tokens[$i]['column'] - 1), - ]; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeStar', $data); - if ($fix === true) { - $padding = str_repeat(' ', ($requiredColumn - 1)); - if ($tokens[$i]['column'] === 1) { - $phpcsFile->fixer->addContentBefore($i, $padding); - } else { - $phpcsFile->fixer->replaceToken(($i - 1), $padding); - } - } - } - - if ($tokens[$i]['code'] !== T_DOC_COMMENT_STAR) { - continue; - } - - if ($tokens[($i + 2)]['line'] !== $tokens[$i]['line']) { - // Line is empty. - continue; - } - - if ($tokens[($i + 1)]['code'] !== T_DOC_COMMENT_WHITESPACE) { - $error = 'Expected 1 space after asterisk; 0 found'; - $fix = $phpcsFile->addFixableError($error, $i, 'NoSpaceAfterStar'); - if ($fix === true) { - $phpcsFile->fixer->addContent($i, ' '); - } - } else if ($tokens[($i + 2)]['code'] === T_DOC_COMMENT_TAG - && $tokens[($i + 1)]['content'] !== ' ' - ) { - $error = 'Expected 1 space after asterisk; %s found'; - $data = [$tokens[($i + 1)]['length']]; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterStar', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($i + 1), ' '); - } - } - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/EmptyCatchCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/EmptyCatchCommentSniff.php deleted file mode 100644 index 4fc2521..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/EmptyCatchCommentSniff.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class EmptyCatchCommentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CATCH]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile All the tokens found in the document. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $scopeStart = $tokens[$stackPtr]['scope_opener']; - $firstContent = $phpcsFile->findNext(T_WHITESPACE, ($scopeStart + 1), $tokens[$stackPtr]['scope_closer'], true); - - if ($firstContent === false) { - $error = 'Empty CATCH statement must have a comment to explain why the exception is not handled'; - $phpcsFile->addError($error, $scopeStart, 'Missing'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php deleted file mode 100644 index 66fc5e4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php +++ /dev/null @@ -1,214 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FileCommentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $commentStart = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - - if ($tokens[$commentStart]['code'] === T_COMMENT) { - $phpcsFile->addError('You must use "/**" style comments for a file comment', $commentStart, 'WrongStyle'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); - return ($phpcsFile->numTokens + 1); - } else if ($commentStart === false || $tokens[$commentStart]['code'] !== T_DOC_COMMENT_OPEN_TAG) { - $phpcsFile->addError('Missing file doc comment', $stackPtr, 'Missing'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); - return ($phpcsFile->numTokens + 1); - } - - if (isset($tokens[$commentStart]['comment_closer']) === false - || ($tokens[$tokens[$commentStart]['comment_closer']]['content'] === '' - && $tokens[$commentStart]['comment_closer'] === ($phpcsFile->numTokens - 1)) - ) { - // Don't process an unfinished file comment during live coding. - return ($phpcsFile->numTokens + 1); - } - - $commentEnd = $tokens[$commentStart]['comment_closer']; - - $nextToken = $phpcsFile->findNext( - T_WHITESPACE, - ($commentEnd + 1), - null, - true - ); - - $ignore = [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_FUNCTION, - T_CLOSURE, - T_PUBLIC, - T_PRIVATE, - T_PROTECTED, - T_FINAL, - T_STATIC, - T_ABSTRACT, - T_CONST, - T_PROPERTY, - T_INCLUDE, - T_INCLUDE_ONCE, - T_REQUIRE, - T_REQUIRE_ONCE, - ]; - - if (in_array($tokens[$nextToken]['code'], $ignore, true) === true) { - $phpcsFile->addError('Missing file doc comment', $stackPtr, 'Missing'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); - return ($phpcsFile->numTokens + 1); - } - - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); - - // No blank line between the open tag and the file comment. - if ($tokens[$commentStart]['line'] > ($tokens[$stackPtr]['line'] + 1)) { - $error = 'There must be no blank lines before the file comment'; - $phpcsFile->addError($error, $stackPtr, 'SpacingAfterOpen'); - } - - // Exactly one blank line after the file comment. - $next = $phpcsFile->findNext(T_WHITESPACE, ($commentEnd + 1), null, true); - if ($tokens[$next]['line'] !== ($tokens[$commentEnd]['line'] + 2)) { - $error = 'There must be exactly one blank line after the file comment'; - $phpcsFile->addError($error, $commentEnd, 'SpacingAfterComment'); - } - - // Required tags in correct order. - $required = [ - '@package' => true, - '@subpackage' => true, - '@author' => true, - '@copyright' => true, - ]; - - $foundTags = []; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - $name = $tokens[$tag]['content']; - $isRequired = isset($required[$name]); - - if ($isRequired === true && in_array($name, $foundTags, true) === true) { - $error = 'Only one %s tag is allowed in a file comment'; - $data = [$name]; - $phpcsFile->addError($error, $tag, 'Duplicate'.ucfirst(substr($name, 1)).'Tag', $data); - } - - $foundTags[] = $name; - - if ($isRequired === false) { - continue; - } - - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $tag, $commentEnd); - if ($string === false || $tokens[$string]['line'] !== $tokens[$tag]['line']) { - $error = 'Content missing for %s tag in file comment'; - $data = [$name]; - $phpcsFile->addError($error, $tag, 'Empty'.ucfirst(substr($name, 1)).'Tag', $data); - continue; - } - - if ($name === '@author') { - if ($tokens[$string]['content'] !== 'Squiz Pty Ltd ') { - $error = 'Expected "Squiz Pty Ltd " for author tag'; - $fix = $phpcsFile->addFixableError($error, $tag, 'IncorrectAuthor'); - if ($fix === true) { - $expected = 'Squiz Pty Ltd '; - $phpcsFile->fixer->replaceToken($string, $expected); - } - } - } else if ($name === '@copyright') { - if (preg_match('/^([0-9]{4})(-[0-9]{4})? (Squiz Pty Ltd \(ABN 77 084 670 600\))$/', $tokens[$string]['content']) === 0) { - $error = 'Expected "xxxx-xxxx Squiz Pty Ltd (ABN 77 084 670 600)" for copyright declaration'; - $fix = $phpcsFile->addFixableError($error, $tag, 'IncorrectCopyright'); - if ($fix === true) { - $matches = []; - preg_match('/^(([0-9]{4})(-[0-9]{4})?)?.*$/', $tokens[$string]['content'], $matches); - if (isset($matches[1]) === false) { - $matches[1] = date('Y'); - } - - $expected = $matches[1].' Squiz Pty Ltd (ABN 77 084 670 600)'; - $phpcsFile->fixer->replaceToken($string, $expected); - } - } - }//end if - }//end foreach - - // Check if the tags are in the correct position. - $pos = 0; - foreach ($required as $tag => $true) { - if (in_array($tag, $foundTags, true) === false) { - $error = 'Missing %s tag in file comment'; - $data = [$tag]; - $phpcsFile->addError($error, $commentEnd, 'Missing'.ucfirst(substr($tag, 1)).'Tag', $data); - } - - if (isset($foundTags[$pos]) === false) { - break; - } - - if ($foundTags[$pos] !== $tag) { - $error = 'The tag in position %s should be the %s tag'; - $data = [ - ($pos + 1), - $tag, - ]; - $phpcsFile->addError($error, $tokens[$commentStart]['comment_tags'][$pos], ucfirst(substr($tag, 1)).'TagOrder', $data); - } - - $pos++; - }//end foreach - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php deleted file mode 100644 index 38fc4d0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php +++ /dev/null @@ -1,698 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting\FunctionCommentSniff as PEARFunctionCommentSniff; -use PHP_CodeSniffer\Util\Common; - -class FunctionCommentSniff extends PEARFunctionCommentSniff -{ - - /** - * The current PHP version. - * - * @var integer - */ - private $phpVersion = null; - - - /** - * Process the return comment of this function comment. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processReturn(File $phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - $return = null; - - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] === '@return') { - if ($return !== null) { - $error = 'Only 1 @return tag is allowed in a function comment'; - $phpcsFile->addError($error, $tag, 'DuplicateReturn'); - return; - } - - $return = $tag; - } - } - - // Skip constructor and destructor. - $methodName = $phpcsFile->getDeclarationName($stackPtr); - $isSpecialMethod = ($methodName === '__construct' || $methodName === '__destruct'); - if ($isSpecialMethod === true) { - return; - } - - if ($return !== null) { - $content = $tokens[($return + 2)]['content']; - if (empty($content) === true || $tokens[($return + 2)]['code'] !== T_DOC_COMMENT_STRING) { - $error = 'Return type missing for @return tag in function comment'; - $phpcsFile->addError($error, $return, 'MissingReturnType'); - } else { - // Support both a return type and a description. - preg_match('`^((?:\|?(?:array\([^\)]*\)|[\\\\a-z0-9\[\]]+))*)( .*)?`i', $content, $returnParts); - if (isset($returnParts[1]) === false) { - return; - } - - $returnType = $returnParts[1]; - - // Check return type (can be multiple, separated by '|'). - $typeNames = explode('|', $returnType); - $suggestedNames = []; - foreach ($typeNames as $i => $typeName) { - $suggestedName = Common::suggestType($typeName); - if (in_array($suggestedName, $suggestedNames, true) === false) { - $suggestedNames[] = $suggestedName; - } - } - - $suggestedType = implode('|', $suggestedNames); - if ($returnType !== $suggestedType) { - $error = 'Expected "%s" but found "%s" for function return type'; - $data = [ - $suggestedType, - $returnType, - ]; - $fix = $phpcsFile->addFixableError($error, $return, 'InvalidReturn', $data); - if ($fix === true) { - $replacement = $suggestedType; - if (empty($returnParts[2]) === false) { - $replacement .= $returnParts[2]; - } - - $phpcsFile->fixer->replaceToken(($return + 2), $replacement); - unset($replacement); - } - } - - // If the return type is void, make sure there is - // no return statement in the function. - if ($returnType === 'void') { - if (isset($tokens[$stackPtr]['scope_closer']) === true) { - $endToken = $tokens[$stackPtr]['scope_closer']; - for ($returnToken = $stackPtr; $returnToken < $endToken; $returnToken++) { - if ($tokens[$returnToken]['code'] === T_CLOSURE - || $tokens[$returnToken]['code'] === T_ANON_CLASS - ) { - $returnToken = $tokens[$returnToken]['scope_closer']; - continue; - } - - if ($tokens[$returnToken]['code'] === T_RETURN - || $tokens[$returnToken]['code'] === T_YIELD - || $tokens[$returnToken]['code'] === T_YIELD_FROM - ) { - break; - } - } - - if ($returnToken !== $endToken) { - // If the function is not returning anything, just - // exiting, then there is no problem. - $semicolon = $phpcsFile->findNext(T_WHITESPACE, ($returnToken + 1), null, true); - if ($tokens[$semicolon]['code'] !== T_SEMICOLON) { - $error = 'Function return type is void, but function contains return statement'; - $phpcsFile->addError($error, $return, 'InvalidReturnVoid'); - } - } - }//end if - } else if ($returnType !== 'mixed' && in_array('void', $typeNames, true) === false) { - // If return type is not void, there needs to be a return statement - // somewhere in the function that returns something. - if (isset($tokens[$stackPtr]['scope_closer']) === true) { - $endToken = $tokens[$stackPtr]['scope_closer']; - for ($returnToken = $stackPtr; $returnToken < $endToken; $returnToken++) { - if ($tokens[$returnToken]['code'] === T_CLOSURE - || $tokens[$returnToken]['code'] === T_ANON_CLASS - ) { - $returnToken = $tokens[$returnToken]['scope_closer']; - continue; - } - - if ($tokens[$returnToken]['code'] === T_RETURN - || $tokens[$returnToken]['code'] === T_YIELD - || $tokens[$returnToken]['code'] === T_YIELD_FROM - ) { - break; - } - } - - if ($returnToken === $endToken) { - $error = 'Function return type is not void, but function has no return statement'; - $phpcsFile->addError($error, $return, 'InvalidNoReturn'); - } else { - $semicolon = $phpcsFile->findNext(T_WHITESPACE, ($returnToken + 1), null, true); - if ($tokens[$semicolon]['code'] === T_SEMICOLON) { - $error = 'Function return type is not void, but function is returning void here'; - $phpcsFile->addError($error, $returnToken, 'InvalidReturnNotVoid'); - } - } - }//end if - }//end if - }//end if - } else { - $error = 'Missing @return tag in function comment'; - $phpcsFile->addError($error, $tokens[$commentStart]['comment_closer'], 'MissingReturn'); - }//end if - - }//end processReturn() - - - /** - * Process any throw tags that this function comment has. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processThrows(File $phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - - foreach ($tokens[$commentStart]['comment_tags'] as $pos => $tag) { - if ($tokens[$tag]['content'] !== '@throws') { - continue; - } - - $exception = null; - $comment = null; - if ($tokens[($tag + 2)]['code'] === T_DOC_COMMENT_STRING) { - $matches = []; - preg_match('/([^\s]+)(?:\s+(.*))?/', $tokens[($tag + 2)]['content'], $matches); - $exception = $matches[1]; - if (isset($matches[2]) === true && trim($matches[2]) !== '') { - $comment = $matches[2]; - } - } - - if ($exception === null) { - $error = 'Exception type and comment missing for @throws tag in function comment'; - $phpcsFile->addError($error, $tag, 'InvalidThrows'); - } else if ($comment === null) { - $error = 'Comment missing for @throws tag in function comment'; - $phpcsFile->addError($error, $tag, 'EmptyThrows'); - } else { - // Any strings until the next tag belong to this comment. - if (isset($tokens[$commentStart]['comment_tags'][($pos + 1)]) === true) { - $end = $tokens[$commentStart]['comment_tags'][($pos + 1)]; - } else { - $end = $tokens[$commentStart]['comment_closer']; - } - - for ($i = ($tag + 3); $i < $end; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_STRING) { - $comment .= ' '.$tokens[$i]['content']; - } - } - - // Starts with a capital letter and ends with a fullstop. - $firstChar = $comment[0]; - if (strtoupper($firstChar) !== $firstChar) { - $error = '@throws tag comment must start with a capital letter'; - $phpcsFile->addError($error, ($tag + 2), 'ThrowsNotCapital'); - } - - $lastChar = substr($comment, -1); - if ($lastChar !== '.') { - $error = '@throws tag comment must end with a full stop'; - $phpcsFile->addError($error, ($tag + 2), 'ThrowsNoFullStop'); - } - }//end if - }//end foreach - - }//end processThrows() - - - /** - * Process the function parameter comments. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processParams(File $phpcsFile, $stackPtr, $commentStart) - { - if ($this->phpVersion === null) { - $this->phpVersion = Config::getConfigData('php_version'); - if ($this->phpVersion === null) { - $this->phpVersion = PHP_VERSION_ID; - } - } - - $tokens = $phpcsFile->getTokens(); - - $params = []; - $maxType = 0; - $maxVar = 0; - foreach ($tokens[$commentStart]['comment_tags'] as $pos => $tag) { - if ($tokens[$tag]['content'] !== '@param') { - continue; - } - - $type = ''; - $typeSpace = 0; - $var = ''; - $varSpace = 0; - $comment = ''; - $commentLines = []; - if ($tokens[($tag + 2)]['code'] === T_DOC_COMMENT_STRING) { - $matches = []; - preg_match('/([^$&.]+)(?:((?:\.\.\.)?(?:\$|&)[^\s]+)(?:(\s+)(.*))?)?/', $tokens[($tag + 2)]['content'], $matches); - - if (empty($matches) === false) { - $typeLen = strlen($matches[1]); - $type = trim($matches[1]); - $typeSpace = ($typeLen - strlen($type)); - $typeLen = strlen($type); - if ($typeLen > $maxType) { - $maxType = $typeLen; - } - } - - if (isset($matches[2]) === true) { - $var = $matches[2]; - $varLen = strlen($var); - if ($varLen > $maxVar) { - $maxVar = $varLen; - } - - if (isset($matches[4]) === true) { - $varSpace = strlen($matches[3]); - $comment = $matches[4]; - $commentLines[] = [ - 'comment' => $comment, - 'token' => ($tag + 2), - 'indent' => $varSpace, - ]; - - // Any strings until the next tag belong to this comment. - if (isset($tokens[$commentStart]['comment_tags'][($pos + 1)]) === true) { - $end = $tokens[$commentStart]['comment_tags'][($pos + 1)]; - } else { - $end = $tokens[$commentStart]['comment_closer']; - } - - for ($i = ($tag + 3); $i < $end; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_STRING) { - $indent = 0; - if ($tokens[($i - 1)]['code'] === T_DOC_COMMENT_WHITESPACE) { - $indent = $tokens[($i - 1)]['length']; - } - - $comment .= ' '.$tokens[$i]['content']; - $commentLines[] = [ - 'comment' => $tokens[$i]['content'], - 'token' => $i, - 'indent' => $indent, - ]; - } - } - } else { - $error = 'Missing parameter comment'; - $phpcsFile->addError($error, $tag, 'MissingParamComment'); - $commentLines[] = ['comment' => '']; - }//end if - } else { - $error = 'Missing parameter name'; - $phpcsFile->addError($error, $tag, 'MissingParamName'); - }//end if - } else { - $error = 'Missing parameter type'; - $phpcsFile->addError($error, $tag, 'MissingParamType'); - }//end if - - $params[] = [ - 'tag' => $tag, - 'type' => $type, - 'var' => $var, - 'comment' => $comment, - 'commentLines' => $commentLines, - 'type_space' => $typeSpace, - 'var_space' => $varSpace, - ]; - }//end foreach - - $realParams = $phpcsFile->getMethodParameters($stackPtr); - $foundParams = []; - - // We want to use ... for all variable length arguments, so added - // this prefix to the variable name so comparisons are easier. - foreach ($realParams as $pos => $param) { - if ($param['variable_length'] === true) { - $realParams[$pos]['name'] = '...'.$realParams[$pos]['name']; - } - } - - foreach ($params as $pos => $param) { - // If the type is empty, the whole line is empty. - if ($param['type'] === '') { - continue; - } - - // Check the param type value. - $typeNames = explode('|', $param['type']); - $suggestedTypeNames = []; - - foreach ($typeNames as $typeName) { - // Strip nullable operator. - if ($typeName[0] === '?') { - $typeName = substr($typeName, 1); - } - - $suggestedName = Common::suggestType($typeName); - $suggestedTypeNames[] = $suggestedName; - - if (count($typeNames) > 1) { - continue; - } - - // Check type hint for array and custom type. - $suggestedTypeHint = ''; - if (strpos($suggestedName, 'array') !== false || substr($suggestedName, -2) === '[]') { - $suggestedTypeHint = 'array'; - } else if (strpos($suggestedName, 'callable') !== false) { - $suggestedTypeHint = 'callable'; - } else if (strpos($suggestedName, 'callback') !== false) { - $suggestedTypeHint = 'callable'; - } else if (in_array($suggestedName, Common::$allowedTypes, true) === false) { - $suggestedTypeHint = $suggestedName; - } - - if ($this->phpVersion >= 70000) { - if ($suggestedName === 'string') { - $suggestedTypeHint = 'string'; - } else if ($suggestedName === 'int' || $suggestedName === 'integer') { - $suggestedTypeHint = 'int'; - } else if ($suggestedName === 'float') { - $suggestedTypeHint = 'float'; - } else if ($suggestedName === 'bool' || $suggestedName === 'boolean') { - $suggestedTypeHint = 'bool'; - } - } - - if ($this->phpVersion >= 70200) { - if ($suggestedName === 'object') { - $suggestedTypeHint = 'object'; - } - } - - if ($suggestedTypeHint !== '' && isset($realParams[$pos]) === true) { - $typeHint = $realParams[$pos]['type_hint']; - - // Remove namespace prefixes when comparing. - $compareTypeHint = substr($suggestedTypeHint, (strlen($typeHint) * -1)); - - if ($typeHint === '') { - $error = 'Type hint "%s" missing for %s'; - $data = [ - $suggestedTypeHint, - $param['var'], - ]; - - $errorCode = 'TypeHintMissing'; - if ($suggestedTypeHint === 'string' - || $suggestedTypeHint === 'int' - || $suggestedTypeHint === 'float' - || $suggestedTypeHint === 'bool' - ) { - $errorCode = 'Scalar'.$errorCode; - } - - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } else if ($typeHint !== $compareTypeHint && $typeHint !== '?'.$compareTypeHint) { - $error = 'Expected type hint "%s"; found "%s" for %s'; - $data = [ - $suggestedTypeHint, - $typeHint, - $param['var'], - ]; - $phpcsFile->addError($error, $stackPtr, 'IncorrectTypeHint', $data); - }//end if - } else if ($suggestedTypeHint === '' && isset($realParams[$pos]) === true) { - $typeHint = $realParams[$pos]['type_hint']; - if ($typeHint !== '') { - $error = 'Unknown type hint "%s" found for %s'; - $data = [ - $typeHint, - $param['var'], - ]; - $phpcsFile->addError($error, $stackPtr, 'InvalidTypeHint', $data); - } - }//end if - }//end foreach - - $suggestedType = implode('|', $suggestedTypeNames); - if ($param['type'] !== $suggestedType) { - $error = 'Expected "%s" but found "%s" for parameter type'; - $data = [ - $suggestedType, - $param['type'], - ]; - - $fix = $phpcsFile->addFixableError($error, $param['tag'], 'IncorrectParamVarName', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $content = $suggestedType; - $content .= str_repeat(' ', $param['type_space']); - $content .= $param['var']; - $content .= str_repeat(' ', $param['var_space']); - if (isset($param['commentLines'][0]) === true) { - $content .= $param['commentLines'][0]['comment']; - } - - $phpcsFile->fixer->replaceToken(($param['tag'] + 2), $content); - - // Fix up the indent of additional comment lines. - foreach ($param['commentLines'] as $lineNum => $line) { - if ($lineNum === 0 - || $param['commentLines'][$lineNum]['indent'] === 0 - ) { - continue; - } - - $diff = (strlen($param['type']) - strlen($suggestedType)); - $newIndent = ($param['commentLines'][$lineNum]['indent'] - $diff); - $phpcsFile->fixer->replaceToken( - ($param['commentLines'][$lineNum]['token'] - 1), - str_repeat(' ', $newIndent) - ); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - - if ($param['var'] === '') { - continue; - } - - $foundParams[] = $param['var']; - - // Check number of spaces after the type. - $this->checkSpacingAfterParamType($phpcsFile, $param, $maxType); - - // Make sure the param name is correct. - if (isset($realParams[$pos]) === true) { - $realName = $realParams[$pos]['name']; - if ($realName !== $param['var']) { - $code = 'ParamNameNoMatch'; - $data = [ - $param['var'], - $realName, - ]; - - $error = 'Doc comment for parameter %s does not match '; - if (strtolower($param['var']) === strtolower($realName)) { - $error .= 'case of '; - $code = 'ParamNameNoCaseMatch'; - } - - $error .= 'actual variable name %s'; - - $phpcsFile->addError($error, $param['tag'], $code, $data); - } - } else if (substr($param['var'], -4) !== ',...') { - // We must have an extra parameter comment. - $error = 'Superfluous parameter comment'; - $phpcsFile->addError($error, $param['tag'], 'ExtraParamComment'); - }//end if - - if ($param['comment'] === '') { - continue; - } - - // Check number of spaces after the var name. - $this->checkSpacingAfterParamName($phpcsFile, $param, $maxVar); - - // Param comments must start with a capital letter and end with a full stop. - if (preg_match('/^(\p{Ll}|\P{L})/u', $param['comment']) === 1) { - $error = 'Parameter comment must start with a capital letter'; - $phpcsFile->addError($error, $param['tag'], 'ParamCommentNotCapital'); - } - - $lastChar = substr($param['comment'], -1); - if ($lastChar !== '.') { - $error = 'Parameter comment must end with a full stop'; - $phpcsFile->addError($error, $param['tag'], 'ParamCommentFullStop'); - } - }//end foreach - - $realNames = []; - foreach ($realParams as $realParam) { - $realNames[] = $realParam['name']; - } - - // Report missing comments. - $diff = array_diff($realNames, $foundParams); - foreach ($diff as $neededParam) { - $error = 'Doc comment for parameter "%s" missing'; - $data = [$neededParam]; - $phpcsFile->addError($error, $commentStart, 'MissingParamTag', $data); - } - - }//end processParams() - - - /** - * Check the spacing after the type of a parameter. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $param The parameter to be checked. - * @param int $maxType The maxlength of the longest parameter type. - * @param int $spacing The number of spaces to add after the type. - * - * @return void - */ - protected function checkSpacingAfterParamType(File $phpcsFile, $param, $maxType, $spacing=1) - { - // Check number of spaces after the type. - $spaces = ($maxType - strlen($param['type']) + $spacing); - if ($param['type_space'] !== $spaces) { - $error = 'Expected %s spaces after parameter type; %s found'; - $data = [ - $spaces, - $param['type_space'], - ]; - - $fix = $phpcsFile->addFixableError($error, $param['tag'], 'SpacingAfterParamType', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $content = $param['type']; - $content .= str_repeat(' ', $spaces); - $content .= $param['var']; - $content .= str_repeat(' ', $param['var_space']); - $content .= $param['commentLines'][0]['comment']; - $phpcsFile->fixer->replaceToken(($param['tag'] + 2), $content); - - // Fix up the indent of additional comment lines. - $diff = ($param['type_space'] - $spaces); - foreach ($param['commentLines'] as $lineNum => $line) { - if ($lineNum === 0 - || $param['commentLines'][$lineNum]['indent'] === 0 - ) { - continue; - } - - $newIndent = ($param['commentLines'][$lineNum]['indent'] - $diff); - if ($newIndent <= 0) { - continue; - } - - $phpcsFile->fixer->replaceToken( - ($param['commentLines'][$lineNum]['token'] - 1), - str_repeat(' ', $newIndent) - ); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - - }//end checkSpacingAfterParamType() - - - /** - * Check the spacing after the name of a parameter. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $param The parameter to be checked. - * @param int $maxVar The maxlength of the longest parameter name. - * @param int $spacing The number of spaces to add after the type. - * - * @return void - */ - protected function checkSpacingAfterParamName(File $phpcsFile, $param, $maxVar, $spacing=1) - { - // Check number of spaces after the var name. - $spaces = ($maxVar - strlen($param['var']) + $spacing); - if ($param['var_space'] !== $spaces) { - $error = 'Expected %s spaces after parameter name; %s found'; - $data = [ - $spaces, - $param['var_space'], - ]; - - $fix = $phpcsFile->addFixableError($error, $param['tag'], 'SpacingAfterParamName', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $content = $param['type']; - $content .= str_repeat(' ', $param['type_space']); - $content .= $param['var']; - $content .= str_repeat(' ', $spaces); - $content .= $param['commentLines'][0]['comment']; - $phpcsFile->fixer->replaceToken(($param['tag'] + 2), $content); - - // Fix up the indent of additional comment lines. - foreach ($param['commentLines'] as $lineNum => $line) { - if ($lineNum === 0 - || $param['commentLines'][$lineNum]['indent'] === 0 - ) { - continue; - } - - $diff = ($param['var_space'] - $spaces); - $newIndent = ($param['commentLines'][$lineNum]['indent'] - $diff); - if ($newIndent <= 0) { - continue; - } - - $phpcsFile->fixer->replaceToken( - ($param['commentLines'][$lineNum]['token'] - 1), - str_repeat(' ', $newIndent) - ); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - - }//end checkSpacingAfterParamName() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php deleted file mode 100644 index a168bfe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php +++ /dev/null @@ -1,233 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionCommentThrowTagSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - // Abstract or incomplete. - return; - } - - $find = Tokens::$methodPrefixes; - $find[] = T_WHITESPACE; - - $commentEnd = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true); - if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG) { - // Function doesn't have a doc comment or is using the wrong type of comment. - return; - } - - $stackPtrEnd = $tokens[$stackPtr]['scope_closer']; - - // Find all the exception type tokens within the current scope. - $thrownExceptions = []; - $currPos = $stackPtr; - $foundThrows = false; - $unknownCount = 0; - do { - $currPos = $phpcsFile->findNext([T_THROW, T_ANON_CLASS, T_CLOSURE], ($currPos + 1), $stackPtrEnd); - if ($currPos === false) { - break; - } - - if ($tokens[$currPos]['code'] !== T_THROW) { - $currPos = $tokens[$currPos]['scope_closer']; - continue; - } - - $foundThrows = true; - - /* - If we can't find a NEW, we are probably throwing - a variable or calling a method. - - If we're throwing a variable, and it's the same variable as the - exception container from the nearest 'catch' block, we take that exception - as it is likely to be a re-throw. - - If we can't find a matching catch block, or the variable name - is different, it's probably a different variable, so we ignore it, - but they still need to provide at least one @throws tag, even through we - don't know the exception class. - */ - - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($currPos + 1), null, true); - if ($tokens[$nextToken]['code'] === T_NEW - || $tokens[$nextToken]['code'] === T_NS_SEPARATOR - || $tokens[$nextToken]['code'] === T_STRING - ) { - if ($tokens[$nextToken]['code'] === T_NEW) { - $currException = $phpcsFile->findNext( - [ - T_NS_SEPARATOR, - T_STRING, - ], - $currPos, - $stackPtrEnd, - false, - null, - true - ); - } else { - $currException = $nextToken; - } - - if ($currException !== false) { - $endException = $phpcsFile->findNext( - [ - T_NS_SEPARATOR, - T_STRING, - ], - ($currException + 1), - $stackPtrEnd, - true, - null, - true - ); - - if ($endException === false) { - $thrownExceptions[] = $tokens[$currException]['content']; - } else { - $thrownExceptions[] = $phpcsFile->getTokensAsString($currException, ($endException - $currException)); - } - }//end if - } else if ($tokens[$nextToken]['code'] === T_VARIABLE) { - // Find the nearest catch block in this scope and, if the caught var - // matches our re-thrown var, use the exception types being caught as - // exception types that are being thrown as well. - $catch = $phpcsFile->findPrevious( - T_CATCH, - $currPos, - $tokens[$stackPtr]['scope_opener'], - false, - null, - false - ); - - if ($catch !== false) { - $thrownVar = $phpcsFile->findPrevious( - T_VARIABLE, - ($tokens[$catch]['parenthesis_closer'] - 1), - $tokens[$catch]['parenthesis_opener'] - ); - - if ($tokens[$thrownVar]['content'] === $tokens[$nextToken]['content']) { - $exceptions = explode('|', $phpcsFile->getTokensAsString(($tokens[$catch]['parenthesis_opener'] + 1), ($thrownVar - $tokens[$catch]['parenthesis_opener'] - 1))); - foreach ($exceptions as $exception) { - $thrownExceptions[] = trim($exception); - } - } - } - } else { - ++$unknownCount; - }//end if - } while ($currPos < $stackPtrEnd && $currPos !== false); - - if ($foundThrows === false) { - return; - } - - // Only need one @throws tag for each type of exception thrown. - $thrownExceptions = array_unique($thrownExceptions); - - $throwTags = []; - $commentStart = $tokens[$commentEnd]['comment_opener']; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] !== '@throws') { - continue; - } - - if ($tokens[($tag + 2)]['code'] === T_DOC_COMMENT_STRING) { - $exception = $tokens[($tag + 2)]['content']; - $space = strpos($exception, ' '); - if ($space !== false) { - $exception = substr($exception, 0, $space); - } - - $throwTags[$exception] = true; - } - } - - if (empty($throwTags) === true) { - $error = 'Missing @throws tag in function comment'; - $phpcsFile->addError($error, $commentEnd, 'Missing'); - return; - } else if (empty($thrownExceptions) === true) { - // If token count is zero, it means that only variables are being - // thrown, so we need at least one @throws tag (checked above). - // Nothing more to do. - return; - } - - // Make sure @throws tag count matches thrown count. - $thrownCount = (count($thrownExceptions) + $unknownCount); - $tagCount = count($throwTags); - if ($thrownCount !== $tagCount) { - $error = 'Expected %s @throws tag(s) in function comment; %s found'; - $data = [ - $thrownCount, - $tagCount, - ]; - $phpcsFile->addError($error, $commentEnd, 'WrongNumber', $data); - return; - } - - foreach ($thrownExceptions as $throw) { - if (isset($throwTags[$throw]) === true) { - continue; - } - - foreach ($throwTags as $tag => $ignore) { - if (strrpos($tag, $throw) === (strlen($tag) - strlen($throw))) { - continue 2; - } - } - - $error = 'Missing @throws tag for "%s" exception'; - $data = [$throw]; - $phpcsFile->addError($error, $commentEnd, 'Missing', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php deleted file mode 100644 index 09b4ee2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php +++ /dev/null @@ -1,343 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class InlineCommentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_COMMENT, - T_DOC_COMMENT_OPEN_TAG, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // If this is a function/class/interface doc block comment, skip it. - // We are only interested in inline doc block comments, which are - // not allowed. - if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT_OPEN_TAG) { - $nextToken = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($stackPtr + 1), - null, - true - ); - - $ignore = [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_FUNCTION, - T_CLOSURE, - T_PUBLIC, - T_PRIVATE, - T_PROTECTED, - T_FINAL, - T_STATIC, - T_ABSTRACT, - T_CONST, - T_PROPERTY, - T_INCLUDE, - T_INCLUDE_ONCE, - T_REQUIRE, - T_REQUIRE_ONCE, - ]; - - if (in_array($tokens[$nextToken]['code'], $ignore, true) === true) { - return; - } - - if ($phpcsFile->tokenizerType === 'JS') { - // We allow block comments if a function or object - // is being assigned to a variable. - $ignore = Tokens::$emptyTokens; - $ignore[] = T_EQUAL; - $ignore[] = T_STRING; - $ignore[] = T_OBJECT_OPERATOR; - $nextToken = $phpcsFile->findNext($ignore, ($nextToken + 1), null, true); - if ($tokens[$nextToken]['code'] === T_FUNCTION - || $tokens[$nextToken]['code'] === T_CLOSURE - || $tokens[$nextToken]['code'] === T_OBJECT - || $tokens[$nextToken]['code'] === T_PROTOTYPE - ) { - return; - } - } - - $prevToken = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($stackPtr - 1), - null, - true - ); - - if ($tokens[$prevToken]['code'] === T_OPEN_TAG) { - return; - } - - if ($tokens[$stackPtr]['content'] === '/**') { - $error = 'Inline doc block comments are not allowed; use "/* Comment */" or "// Comment" instead'; - $phpcsFile->addError($error, $stackPtr, 'DocBlock'); - } - }//end if - - if ($tokens[$stackPtr]['content'][0] === '#') { - $error = 'Perl-style comments are not allowed; use "// Comment" instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); - if ($fix === true) { - $comment = ltrim($tokens[$stackPtr]['content'], "# \t"); - $phpcsFile->fixer->replaceToken($stackPtr, "// $comment"); - } - } - - // We don't want end of block comments. Check if the last token before the - // comment is a closing curly brace. - $previousContent = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$previousContent]['line'] === $tokens[$stackPtr]['line']) { - if ($tokens[$previousContent]['code'] === T_CLOSE_CURLY_BRACKET) { - return; - } - - // Special case for JS files. - if ($tokens[$previousContent]['code'] === T_COMMA - || $tokens[$previousContent]['code'] === T_SEMICOLON - ) { - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($previousContent - 1), null, true); - if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) { - return; - } - } - } - - // Only want inline comments. - if (substr($tokens[$stackPtr]['content'], 0, 2) !== '//') { - return; - } - - $commentTokens = [$stackPtr]; - - $nextComment = $stackPtr; - $lastComment = $stackPtr; - while (($nextComment = $phpcsFile->findNext(T_COMMENT, ($nextComment + 1), null, false)) !== false) { - if ($tokens[$nextComment]['line'] !== ($tokens[$lastComment]['line'] + 1)) { - break; - } - - // Only want inline comments. - if (substr($tokens[$nextComment]['content'], 0, 2) !== '//') { - break; - } - - // There is a comment on the very next line. If there is - // no code between the comments, they are part of the same - // comment block. - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($nextComment - 1), $lastComment, true); - if ($prevNonWhitespace !== $lastComment) { - break; - } - - $commentTokens[] = $nextComment; - $lastComment = $nextComment; - }//end while - - $commentText = ''; - foreach ($commentTokens as $lastCommentToken) { - $comment = rtrim($tokens[$lastCommentToken]['content']); - - if (trim(substr($comment, 2)) === '') { - continue; - } - - $spaceCount = 0; - $tabFound = false; - - $commentLength = strlen($comment); - for ($i = 2; $i < $commentLength; $i++) { - if ($comment[$i] === "\t") { - $tabFound = true; - break; - } - - if ($comment[$i] !== ' ') { - break; - } - - $spaceCount++; - } - - $fix = false; - if ($tabFound === true) { - $error = 'Tab found before comment text; expected "// %s" but found "%s"'; - $data = [ - ltrim(substr($comment, 2)), - $comment, - ]; - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'TabBefore', $data); - } else if ($spaceCount === 0) { - $error = 'No space found before comment text; expected "// %s" but found "%s"'; - $data = [ - substr($comment, 2), - $comment, - ]; - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'NoSpaceBefore', $data); - } else if ($spaceCount > 1) { - $error = 'Expected 1 space before comment text but found %s; use block comment if you need indentation'; - $data = [ - $spaceCount, - substr($comment, (2 + $spaceCount)), - $comment, - ]; - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'SpacingBefore', $data); - }//end if - - if ($fix === true) { - $newComment = '// '.ltrim($tokens[$lastCommentToken]['content'], "/\t "); - $phpcsFile->fixer->replaceToken($lastCommentToken, $newComment); - } - - $commentText .= trim(substr($tokens[$lastCommentToken]['content'], 2)); - }//end foreach - - if ($commentText === '') { - $error = 'Blank comments are not allowed'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Empty'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, ''); - } - - return ($lastCommentToken + 1); - } - - if (preg_match('/^\p{Ll}/u', $commentText) === 1) { - $error = 'Inline comments must start with a capital letter'; - $phpcsFile->addError($error, $stackPtr, 'NotCapital'); - } - - // Only check the end of comment character if the start of the comment - // is a letter, indicating that the comment is just standard text. - if (preg_match('/^\p{L}/u', $commentText) === 1) { - $commentCloser = $commentText[(strlen($commentText) - 1)]; - $acceptedClosers = [ - 'full-stops' => '.', - 'exclamation marks' => '!', - 'or question marks' => '?', - ]; - - if (in_array($commentCloser, $acceptedClosers, true) === false) { - $error = 'Inline comments must end in %s'; - $ender = ''; - foreach ($acceptedClosers as $closerName => $symbol) { - $ender .= ' '.$closerName.','; - } - - $ender = trim($ender, ' ,'); - $data = [$ender]; - $phpcsFile->addError($error, $lastCommentToken, 'InvalidEndChar', $data); - } - } - - // Finally, the line below the last comment cannot be empty if this inline - // comment is on a line by itself. - if ($tokens[$previousContent]['line'] < $tokens[$stackPtr]['line']) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($lastCommentToken + 1), null, true); - if ($next === false) { - // Ignore if the comment is the last non-whitespace token in a file. - return ($lastCommentToken + 1); - } - - if ($tokens[$next]['code'] === T_DOC_COMMENT_OPEN_TAG) { - // If this inline comment is followed by a docblock, - // ignore spacing as docblock/function etc spacing rules - // are likely to conflict with our rules. - return ($lastCommentToken + 1); - } - - $errorCode = 'SpacingAfter'; - - if (isset($tokens[$stackPtr]['conditions']) === true) { - $conditions = $tokens[$stackPtr]['conditions']; - $type = end($conditions); - $conditionPtr = key($conditions); - - if (($type === T_FUNCTION || $type === T_CLOSURE) - && $tokens[$conditionPtr]['scope_closer'] === $next - ) { - $errorCode = 'SpacingAfterAtFunctionEnd'; - } - } - - for ($i = ($lastCommentToken + 1); $i < $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['line'] === ($tokens[$lastCommentToken]['line'] + 1)) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - return ($lastCommentToken + 1); - } - } else if ($tokens[$i]['line'] > ($tokens[$lastCommentToken]['line'] + 1)) { - break; - } - } - - $error = 'There must be no blank line following an inline comment'; - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, $errorCode); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($lastCommentToken + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - return ($lastCommentToken + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/LongConditionClosingCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/LongConditionClosingCommentSniff.php deleted file mode 100644 index 8d8c4f8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/LongConditionClosingCommentSniff.php +++ /dev/null @@ -1,206 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class LongConditionClosingCommentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The openers that we are interested in. - * - * @var integer[] - */ - private static $openers = [ - T_SWITCH, - T_IF, - T_FOR, - T_FOREACH, - T_WHILE, - T_TRY, - T_CASE, - ]; - - /** - * The length that a code block must be before - * requiring a closing comment. - * - * @var integer - */ - public $lineLimit = 20; - - /** - * The format the end comment should be in. - * - * The placeholder %s will be replaced with the type of condition opener. - * - * @var string - */ - public $commentFormat = '//end %s'; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CLOSE_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_condition']) === false) { - // No scope condition. It is a function closer. - return; - } - - $startCondition = $tokens[$tokens[$stackPtr]['scope_condition']]; - $startBrace = $tokens[$tokens[$stackPtr]['scope_opener']]; - $endBrace = $tokens[$stackPtr]; - - // We are only interested in some code blocks. - if (in_array($startCondition['code'], self::$openers, true) === false) { - return; - } - - if ($startCondition['code'] === T_IF) { - // If this is actually an ELSE IF, skip it as the brace - // will be checked by the original IF. - $else = $phpcsFile->findPrevious(T_WHITESPACE, ($tokens[$stackPtr]['scope_condition'] - 1), null, true); - if ($tokens[$else]['code'] === T_ELSE) { - return; - } - - // IF statements that have an ELSE block need to use - // "end if" rather than "end else" or "end elseif". - do { - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$nextToken]['code'] === T_ELSE || $tokens[$nextToken]['code'] === T_ELSEIF) { - // Check for ELSE IF (2 tokens) as opposed to ELSEIF (1 token). - if ($tokens[$nextToken]['code'] === T_ELSE - && isset($tokens[$nextToken]['scope_closer']) === false - ) { - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($nextToken + 1), null, true); - if ($tokens[$nextToken]['code'] !== T_IF - || isset($tokens[$nextToken]['scope_closer']) === false - ) { - // Not an ELSE IF or is an inline ELSE IF. - break; - } - } - - if (isset($tokens[$nextToken]['scope_closer']) === false) { - // There isn't going to be anywhere to print the "end if" comment - // because there is no closer. - return; - } - - // The end brace becomes the ELSE's end brace. - $stackPtr = $tokens[$nextToken]['scope_closer']; - $endBrace = $tokens[$stackPtr]; - } else { - break; - }//end if - } while (isset($tokens[$nextToken]['scope_closer']) === true); - }//end if - - if ($startCondition['code'] === T_TRY) { - // TRY statements need to check until the end of all CATCH statements. - do { - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$nextToken]['code'] === T_CATCH - || $tokens[$nextToken]['code'] === T_FINALLY - ) { - // The end brace becomes the CATCH end brace. - $stackPtr = $tokens[$nextToken]['scope_closer']; - $endBrace = $tokens[$stackPtr]; - } else { - break; - } - } while (isset($tokens[$nextToken]['scope_closer']) === true); - } - - $lineDifference = ($endBrace['line'] - $startBrace['line']); - - $expected = sprintf($this->commentFormat, $startCondition['content']); - $comment = $phpcsFile->findNext([T_COMMENT], $stackPtr, null, false); - - if (($comment === false) || ($tokens[$comment]['line'] !== $endBrace['line'])) { - if ($lineDifference >= $this->lineLimit) { - $error = 'End comment for long condition not found; expected "%s"'; - $data = [$expected]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Missing', $data); - - if ($fix === true) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($next !== false && $tokens[$next]['line'] === $tokens[$stackPtr]['line']) { - $expected .= $phpcsFile->eolChar; - } - - $phpcsFile->fixer->addContent($stackPtr, $expected); - } - } - - return; - } - - if (($comment - $stackPtr) !== 1) { - $error = 'Space found before closing comment; expected "%s"'; - $data = [$expected]; - $phpcsFile->addError($error, $stackPtr, 'SpacingBefore', $data); - } - - if (trim($tokens[$comment]['content']) !== $expected) { - $found = trim($tokens[$comment]['content']); - $error = 'Incorrect closing comment; expected "%s" but found "%s"'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Invalid', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($comment, $expected.$phpcsFile->eolChar); - } - - return; - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/PostStatementCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/PostStatementCommentSniff.php deleted file mode 100644 index 1164c6f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/PostStatementCommentSniff.php +++ /dev/null @@ -1,120 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class PostStatementCommentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * Exceptions to the rule. - * - * If post statement comments are found within the condition - * parenthesis of these structures, leave them alone. - * - * @var array - */ - private $controlStructureExceptions = [ - T_IF => true, - T_ELSEIF => true, - T_SWITCH => true, - T_WHILE => true, - T_FOR => true, - T_FOREACH => true, - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_COMMENT]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (substr($tokens[$stackPtr]['content'], 0, 2) !== '//') { - return; - } - - $commentLine = $tokens[$stackPtr]['line']; - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - - if ($lastContent === false - || $tokens[$lastContent]['line'] !== $commentLine - || $tokens[$stackPtr]['column'] === 1 - ) { - return; - } - - if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) { - return; - } - - // Special case for JS files and PHP closures. - if ($tokens[$lastContent]['code'] === T_COMMA - || $tokens[$lastContent]['code'] === T_SEMICOLON - ) { - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($lastContent - 1), null, true); - if ($lastContent === false || $tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) { - return; - } - } - - // Special case for (trailing) comments within multi-line control structures. - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $nestedParens = $tokens[$stackPtr]['nested_parenthesis']; - foreach ($nestedParens as $open => $close) { - if (isset($tokens[$open]['parenthesis_owner']) === true - && isset($this->controlStructureExceptions[$tokens[$tokens[$open]['parenthesis_owner']]['code']]) === true - ) { - return; - } - } - } - - $error = 'Comments may not appear after statements'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Found'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($stackPtr); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/VariableCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/VariableCommentSniff.php deleted file mode 100644 index 7b9fc93..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/VariableCommentSniff.php +++ /dev/null @@ -1,178 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; -use PHP_CodeSniffer\Util\Common; - -class VariableCommentSniff extends AbstractVariableSniff -{ - - - /** - * Called to process class member vars. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $ignore = [ - T_PUBLIC, - T_PRIVATE, - T_PROTECTED, - T_VAR, - T_STATIC, - T_WHITESPACE, - T_STRING, - T_NS_SEPARATOR, - T_NULLABLE, - ]; - - $commentEnd = $phpcsFile->findPrevious($ignore, ($stackPtr - 1), null, true); - if ($commentEnd === false - || ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG - && $tokens[$commentEnd]['code'] !== T_COMMENT) - ) { - $phpcsFile->addError('Missing member variable doc comment', $stackPtr, 'Missing'); - return; - } - - if ($tokens[$commentEnd]['code'] === T_COMMENT) { - $phpcsFile->addError('You must use "/**" style comments for a member variable comment', $stackPtr, 'WrongStyle'); - return; - } - - $commentStart = $tokens[$commentEnd]['comment_opener']; - - $foundVar = null; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] === '@var') { - if ($foundVar !== null) { - $error = 'Only one @var tag is allowed in a member variable comment'; - $phpcsFile->addError($error, $tag, 'DuplicateVar'); - } else { - $foundVar = $tag; - } - } else if ($tokens[$tag]['content'] === '@see') { - // Make sure the tag isn't empty. - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $tag, $commentEnd); - if ($string === false || $tokens[$string]['line'] !== $tokens[$tag]['line']) { - $error = 'Content missing for @see tag in member variable comment'; - $phpcsFile->addError($error, $tag, 'EmptySees'); - } - } else { - $error = '%s tag is not allowed in member variable comment'; - $data = [$tokens[$tag]['content']]; - $phpcsFile->addWarning($error, $tag, 'TagNotAllowed', $data); - }//end if - }//end foreach - - // The @var tag is the only one we require. - if ($foundVar === null) { - $error = 'Missing @var tag in member variable comment'; - $phpcsFile->addError($error, $commentEnd, 'MissingVar'); - return; - } - - $firstTag = $tokens[$commentStart]['comment_tags'][0]; - if ($foundVar !== null && $tokens[$firstTag]['content'] !== '@var') { - $error = 'The @var tag must be the first tag in a member variable comment'; - $phpcsFile->addError($error, $foundVar, 'VarOrder'); - } - - // Make sure the tag isn't empty and has the correct padding. - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $foundVar, $commentEnd); - if ($string === false || $tokens[$string]['line'] !== $tokens[$foundVar]['line']) { - $error = 'Content missing for @var tag in member variable comment'; - $phpcsFile->addError($error, $foundVar, 'EmptyVar'); - return; - } - - // Support both a var type and a description. - preg_match('`^((?:\|?(?:array\([^\)]*\)|[\\\\a-z0-9\[\]]+))*)( .*)?`i', $tokens[($foundVar + 2)]['content'], $varParts); - if (isset($varParts[1]) === false) { - return; - } - - $varType = $varParts[1]; - - // Check var type (can be multiple, separated by '|'). - $typeNames = explode('|', $varType); - $suggestedNames = []; - foreach ($typeNames as $i => $typeName) { - $suggestedName = Common::suggestType($typeName); - if (in_array($suggestedName, $suggestedNames, true) === false) { - $suggestedNames[] = $suggestedName; - } - } - - $suggestedType = implode('|', $suggestedNames); - if ($varType !== $suggestedType) { - $error = 'Expected "%s" but found "%s" for @var tag in member variable comment'; - $data = [ - $suggestedType, - $varType, - ]; - $fix = $phpcsFile->addFixableError($error, $foundVar, 'IncorrectVarType', $data); - if ($fix === true) { - $replacement = $suggestedType; - if (empty($varParts[2]) === false) { - $replacement .= $varParts[2]; - } - - $phpcsFile->fixer->replaceToken(($foundVar + 2), $replacement); - unset($replacement); - } - } - - }//end processMemberVar() - - - /** - * Called to process a normal variable. - * - * Not required for this sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this token was found. - * @param int $stackPtr The position where the double quoted - * string was found. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - - }//end processVariable() - - - /** - * Called to process variables found in double quoted strings. - * - * Not required for this sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this token was found. - * @param int $stackPtr The position where the double quoted - * string was found. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php deleted file mode 100644 index 032c59a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php +++ /dev/null @@ -1,324 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ControlSignatureSniff implements Sniff -{ - - /** - * How many spaces should precede the colon if using alternative syntax. - * - * @var integer - */ - public $requiredSpacesBeforeColon = 1; - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return int[] - */ - public function register() - { - return [ - T_TRY, - T_CATCH, - T_FINALLY, - T_DO, - T_WHILE, - T_FOR, - T_IF, - T_FOREACH, - T_ELSE, - T_ELSEIF, - T_SWITCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - return; - } - - $isAlternative = false; - if (isset($tokens[$stackPtr]['scope_opener']) === true - && $tokens[$tokens[$stackPtr]['scope_opener']]['code'] === T_COLON - ) { - $isAlternative = true; - } - - // Single space after the keyword. - $expected = 1; - if (isset($tokens[$stackPtr]['parenthesis_closer']) === false && $isAlternative === true) { - // Catching cases like: - // if (condition) : ... else: ... endif - // where there is no condition. - $expected = (int) $this->requiredSpacesBeforeColon; - } - - $found = 1; - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $found = 0; - } else if ($tokens[($stackPtr + 1)]['content'] !== ' ') { - if (strpos($tokens[($stackPtr + 1)]['content'], $phpcsFile->eolChar) !== false) { - $found = 'newline'; - } else { - $found = $tokens[($stackPtr + 1)]['length']; - } - } - - if ($found !== $expected) { - $error = 'Expected %s space(s) after %s keyword; %s found'; - $data = [ - $expected, - strtoupper($tokens[$stackPtr]['content']), - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterKeyword', $data); - if ($fix === true) { - if ($found === 0) { - $phpcsFile->fixer->addContent($stackPtr, str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), str_repeat(' ', $expected)); - } - } - } - - // Single space after closing parenthesis. - if (isset($tokens[$stackPtr]['parenthesis_closer']) === true - && isset($tokens[$stackPtr]['scope_opener']) === true - ) { - $expected = 1; - if ($isAlternative === true) { - $expected = (int) $this->requiredSpacesBeforeColon; - } - - $closer = $tokens[$stackPtr]['parenthesis_closer']; - $opener = $tokens[$stackPtr]['scope_opener']; - $content = $phpcsFile->getTokensAsString(($closer + 1), ($opener - $closer - 1)); - - if (trim($content) === '') { - if (strpos($content, $phpcsFile->eolChar) !== false) { - $found = 'newline'; - } else { - $found = strlen($content); - } - } else { - $found = '"'.str_replace($phpcsFile->eolChar, '\n', $content).'"'; - } - - if ($found !== $expected) { - $error = 'Expected %s space(s) after closing parenthesis; found %s'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceAfterCloseParenthesis', $data); - if ($fix === true) { - $padding = str_repeat(' ', $expected); - if ($closer === ($opener - 1)) { - $phpcsFile->fixer->addContent($closer, $padding); - } else { - $phpcsFile->fixer->beginChangeset(); - if (trim($content) === '') { - $phpcsFile->fixer->addContent($closer, $padding); - if ($found !== 0) { - for ($i = ($closer + 1); $i < $opener; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - } else { - $phpcsFile->fixer->addContent($closer, $padding.$tokens[$opener]['content']); - $phpcsFile->fixer->replaceToken($opener, ''); - - if ($tokens[$opener]['line'] !== $tokens[$closer]['line']) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), null, true); - if ($tokens[$next]['line'] !== $tokens[$opener]['line']) { - for ($i = ($opener + 1); $i < $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - } - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - }//end if - }//end if - - // Single newline after opening brace. - if (isset($tokens[$stackPtr]['scope_opener']) === true) { - $opener = $tokens[$stackPtr]['scope_opener']; - for ($next = ($opener + 1); $next < $phpcsFile->numTokens; $next++) { - $code = $tokens[$next]['code']; - - if ($code === T_WHITESPACE - || ($code === T_INLINE_HTML - && trim($tokens[$next]['content']) === '') - ) { - continue; - } - - // Skip all empty tokens on the same line as the opener. - if ($tokens[$next]['line'] === $tokens[$opener]['line'] - && (isset(Tokens::$emptyTokens[$code]) === true - || $code === T_CLOSE_TAG) - ) { - continue; - } - - // We found the first bit of a code, or a comment on the - // following line. - break; - }//end for - - if ($tokens[$next]['line'] === $tokens[$opener]['line']) { - $error = 'Newline required after opening brace'; - $fix = $phpcsFile->addFixableError($error, $opener, 'NewlineAfterOpenBrace'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($opener + 1); $i < $next; $i++) { - if (trim($tokens[$i]['content']) !== '') { - break; - } - - // Remove whitespace. - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addContent($opener, $phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - }//end if - } else if ($tokens[$stackPtr]['code'] === T_WHILE) { - // Zero spaces after parenthesis closer, but only if followed by a semicolon. - $closer = $tokens[$stackPtr]['parenthesis_closer']; - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($closer + 1), null, true); - if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['code'] === T_SEMICOLON) { - $found = 0; - if ($tokens[($closer + 1)]['code'] === T_WHITESPACE) { - if (strpos($tokens[($closer + 1)]['content'], $phpcsFile->eolChar) !== false) { - $found = 'newline'; - } else { - $found = $tokens[($closer + 1)]['length']; - } - } - - if ($found !== 0) { - $error = 'Expected 0 spaces before semicolon; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceBeforeSemicolon', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($closer + 1), ''); - } - } - } - }//end if - - // Only want to check multi-keyword structures from here on. - if ($tokens[$stackPtr]['code'] === T_WHILE) { - if (isset($tokens[$stackPtr]['scope_closer']) !== false) { - return; - } - - $closer = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($closer === false - || $tokens[$closer]['code'] !== T_CLOSE_CURLY_BRACKET - || $tokens[$tokens[$closer]['scope_condition']]['code'] !== T_DO - ) { - return; - } - } else if ($tokens[$stackPtr]['code'] === T_ELSE - || $tokens[$stackPtr]['code'] === T_ELSEIF - || $tokens[$stackPtr]['code'] === T_CATCH - || $tokens[$stackPtr]['code'] === T_FINALLY - ) { - if (isset($tokens[$stackPtr]['scope_opener']) === true - && $tokens[$tokens[$stackPtr]['scope_opener']]['code'] === T_COLON - ) { - // Special case for alternate syntax, where this token is actually - // the closer for the previous block, so there is no spacing to check. - return; - } - - $closer = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($closer === false || $tokens[$closer]['code'] !== T_CLOSE_CURLY_BRACKET) { - return; - } - } else { - return; - }//end if - - // Single space after closing brace. - $found = 1; - if ($tokens[($closer + 1)]['code'] !== T_WHITESPACE) { - $found = 0; - } else if ($tokens[$closer]['line'] !== $tokens[$stackPtr]['line']) { - $found = 'newline'; - } else if ($tokens[($closer + 1)]['content'] !== ' ') { - $found = $tokens[($closer + 1)]['length']; - } - - if ($found !== 1) { - $error = 'Expected 1 space after closing brace; %s found'; - $data = [$found]; - - if ($phpcsFile->findNext(Tokens::$commentTokens, ($closer + 1), $stackPtr) !== false) { - // Comment found between closing brace and keyword, don't auto-fix. - $phpcsFile->addError($error, $closer, 'SpaceAfterCloseBrace', $data); - return; - } - - $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceAfterCloseBrace', $data); - if ($fix === true) { - if ($found === 0) { - $phpcsFile->fixer->addContent($closer, ' '); - } else { - $phpcsFile->fixer->replaceToken(($closer + 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ElseIfDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ElseIfDeclarationSniff.php deleted file mode 100644 index 8abb8fb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ElseIfDeclarationSniff.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ElseIfDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_ELSEIF]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $error = 'Usage of ELSEIF not allowed; use ELSE IF instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotAllowed'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'else if'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php deleted file mode 100644 index c5f22e2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php +++ /dev/null @@ -1,236 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ForEachLoopDeclarationSniff implements Sniff -{ - - /** - * How many spaces should follow the opening bracket. - * - * @var integer - */ - public $requiredSpacesAfterOpen = 0; - - /** - * How many spaces should precede the closing bracket. - * - * @var integer - */ - public $requiredSpacesBeforeClose = 0; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FOREACH]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $this->requiredSpacesAfterOpen = (int) $this->requiredSpacesAfterOpen; - $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose; - $tokens = $phpcsFile->getTokens(); - - $openingBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, $stackPtr); - if ($openingBracket === false) { - $error = 'Possible parse error: FOREACH has no opening parenthesis'; - $phpcsFile->addWarning($error, $stackPtr, 'MissingOpenParenthesis'); - return; - } - - if (isset($tokens[$openingBracket]['parenthesis_closer']) === false) { - $error = 'Possible parse error: FOREACH has no closing parenthesis'; - $phpcsFile->addWarning($error, $stackPtr, 'MissingCloseParenthesis'); - return; - } - - $closingBracket = $tokens[$openingBracket]['parenthesis_closer']; - - if ($this->requiredSpacesAfterOpen === 0 && $tokens[($openingBracket + 1)]['code'] === T_WHITESPACE) { - $error = 'Space found after opening bracket of FOREACH loop'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterOpen'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($openingBracket + 1), ''); - } - } else if ($this->requiredSpacesAfterOpen > 0) { - $spaceAfterOpen = 0; - if ($tokens[($openingBracket + 1)]['code'] === T_WHITESPACE) { - $spaceAfterOpen = $tokens[($openingBracket + 1)]['length']; - } - - if ($spaceAfterOpen !== $this->requiredSpacesAfterOpen) { - $error = 'Expected %s spaces after opening bracket; %s found'; - $data = [ - $this->requiredSpacesAfterOpen, - $spaceAfterOpen, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterOpen', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesAfterOpen); - if ($spaceAfterOpen === 0) { - $phpcsFile->fixer->addContent($openingBracket, $padding); - } else { - $phpcsFile->fixer->replaceToken(($openingBracket + 1), $padding); - } - } - } - }//end if - - if ($this->requiredSpacesBeforeClose === 0 && $tokens[($closingBracket - 1)]['code'] === T_WHITESPACE) { - $error = 'Space found before closing bracket of FOREACH loop'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeClose'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($closingBracket - 1), ''); - } - } else if ($this->requiredSpacesBeforeClose > 0) { - $spaceBeforeClose = 0; - if ($tokens[($closingBracket - 1)]['code'] === T_WHITESPACE) { - $spaceBeforeClose = $tokens[($closingBracket - 1)]['length']; - } - - if ($spaceBeforeClose !== $this->requiredSpacesBeforeClose) { - $error = 'Expected %s spaces before closing bracket; %s found'; - $data = [ - $this->requiredSpacesBeforeClose, - $spaceBeforeClose, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeClose', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesBeforeClose); - if ($spaceBeforeClose === 0) { - $phpcsFile->fixer->addContentBefore($closingBracket, $padding); - } else { - $phpcsFile->fixer->replaceToken(($closingBracket - 1), $padding); - } - } - } - }//end if - - $asToken = $phpcsFile->findNext(T_AS, $openingBracket); - if ($asToken === false) { - $error = 'Possible parse error: FOREACH has no AS statement'; - $phpcsFile->addWarning($error, $stackPtr, 'MissingAs'); - return; - } - - $content = $tokens[$asToken]['content']; - if ($content !== strtolower($content)) { - $expected = strtolower($content); - $error = 'AS keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - $expected, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $asToken, 'AsNotLower', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($asToken, $expected); - } - } - - $doubleArrow = $phpcsFile->findNext(T_DOUBLE_ARROW, $asToken, $closingBracket); - - if ($doubleArrow !== false) { - if ($tokens[($doubleArrow - 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space before "=>"; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBeforeArrow'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($doubleArrow, ' '); - } - } else { - if ($tokens[($doubleArrow - 1)]['length'] !== 1) { - $spaces = $tokens[($doubleArrow - 1)]['length']; - $error = 'Expected 1 space before "=>"; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($doubleArrow - 1), ' '); - } - } - } - - if ($tokens[($doubleArrow + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space after "=>"; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfterArrow'); - if ($fix === true) { - $phpcsFile->fixer->addContent($doubleArrow, ' '); - } - } else { - if ($tokens[($doubleArrow + 1)]['length'] !== 1) { - $spaces = $tokens[($doubleArrow + 1)]['length']; - $error = 'Expected 1 space after "=>"; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($doubleArrow + 1), ' '); - } - } - } - }//end if - - if ($tokens[($asToken - 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space before "as"; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBeforeAs'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($asToken, ' '); - } - } else { - if ($tokens[($asToken - 1)]['length'] !== 1) { - $spaces = $tokens[($asToken - 1)]['length']; - $error = 'Expected 1 space before "as"; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeAs', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($asToken - 1), ' '); - } - } - } - - if ($tokens[($asToken + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space after "as"; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfterAs'); - if ($fix === true) { - $phpcsFile->fixer->addContent($asToken, ' '); - } - } else { - if ($tokens[($asToken + 1)]['length'] !== 1) { - $spaces = $tokens[($asToken + 1)]['length']; - $error = 'Expected 1 space after "as"; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterAs', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($asToken + 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php deleted file mode 100644 index 6803f9a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php +++ /dev/null @@ -1,316 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ForLoopDeclarationSniff implements Sniff -{ - - /** - * How many spaces should follow the opening bracket. - * - * @var integer - */ - public $requiredSpacesAfterOpen = 0; - - /** - * How many spaces should precede the closing bracket. - * - * @var integer - */ - public $requiredSpacesBeforeClose = 0; - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FOR]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $this->requiredSpacesAfterOpen = (int) $this->requiredSpacesAfterOpen; - $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose; - $tokens = $phpcsFile->getTokens(); - - $openingBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, $stackPtr); - if ($openingBracket === false) { - $error = 'Possible parse error: no opening parenthesis for FOR keyword'; - $phpcsFile->addWarning($error, $stackPtr, 'NoOpenBracket'); - return; - } - - $closingBracket = $tokens[$openingBracket]['parenthesis_closer']; - - if ($this->requiredSpacesAfterOpen === 0 - && $tokens[($openingBracket + 1)]['code'] === T_WHITESPACE - ) { - $nextNonWhiteSpace = $phpcsFile->findNext(T_WHITESPACE, ($openingBracket + 1), $closingBracket, true); - if ($this->ignoreNewlines === false - || $tokens[$nextNonWhiteSpace]['line'] === $tokens[$openingBracket]['line'] - ) { - $error = 'Whitespace found after opening bracket of FOR loop'; - $fix = $phpcsFile->addFixableError($error, $openingBracket, 'SpacingAfterOpen'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($openingBracket + 1); $i < $closingBracket; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } else if ($this->requiredSpacesAfterOpen > 0) { - $nextNonWhiteSpace = $phpcsFile->findNext(T_WHITESPACE, ($openingBracket + 1), $closingBracket, true); - $spaceAfterOpen = 0; - if ($tokens[$openingBracket]['line'] !== $tokens[$nextNonWhiteSpace]['line']) { - $spaceAfterOpen = 'newline'; - } else if ($tokens[($openingBracket + 1)]['code'] === T_WHITESPACE) { - $spaceAfterOpen = $tokens[($openingBracket + 1)]['length']; - } - - if ($spaceAfterOpen !== $this->requiredSpacesAfterOpen - && ($this->ignoreNewlines === false - || $spaceAfterOpen !== 'newline') - ) { - $error = 'Expected %s spaces after opening bracket; %s found'; - $data = [ - $this->requiredSpacesAfterOpen, - $spaceAfterOpen, - ]; - $fix = $phpcsFile->addFixableError($error, $openingBracket, 'SpacingAfterOpen', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesAfterOpen); - if ($spaceAfterOpen === 0) { - $phpcsFile->fixer->addContent($openingBracket, $padding); - } else { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($openingBracket + 1), $padding); - for ($i = ($openingBracket + 2); $i < $nextNonWhiteSpace; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - }//end if - - $prevNonWhiteSpace = $phpcsFile->findPrevious(T_WHITESPACE, ($closingBracket - 1), $openingBracket, true); - $beforeClosefixable = true; - if ($tokens[$prevNonWhiteSpace]['line'] !== $tokens[$closingBracket]['line'] - && isset(Tokens::$emptyTokens[$tokens[$prevNonWhiteSpace]['code']]) === true - ) { - $beforeClosefixable = false; - } - - if ($this->requiredSpacesBeforeClose === 0 - && $tokens[($closingBracket - 1)]['code'] === T_WHITESPACE - && ($this->ignoreNewlines === false - || $tokens[$prevNonWhiteSpace]['line'] === $tokens[$closingBracket]['line']) - ) { - $error = 'Whitespace found before closing bracket of FOR loop'; - - if ($beforeClosefixable === false) { - $phpcsFile->addError($error, $closingBracket, 'SpacingBeforeClose'); - } else { - $fix = $phpcsFile->addFixableError($error, $closingBracket, 'SpacingBeforeClose'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($closingBracket - 1); $i > $openingBracket; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } else if ($this->requiredSpacesBeforeClose > 0) { - $spaceBeforeClose = 0; - if ($tokens[$closingBracket]['line'] !== $tokens[$prevNonWhiteSpace]['line']) { - $spaceBeforeClose = 'newline'; - } else if ($tokens[($closingBracket - 1)]['code'] === T_WHITESPACE) { - $spaceBeforeClose = $tokens[($closingBracket - 1)]['length']; - } - - if ($this->requiredSpacesBeforeClose !== $spaceBeforeClose - && ($this->ignoreNewlines === false - || $spaceBeforeClose !== 'newline') - ) { - $error = 'Expected %s spaces before closing bracket; %s found'; - $data = [ - $this->requiredSpacesBeforeClose, - $spaceBeforeClose, - ]; - - if ($beforeClosefixable === false) { - $phpcsFile->addError($error, $closingBracket, 'SpacingBeforeClose', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $closingBracket, 'SpacingBeforeClose', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesBeforeClose); - if ($spaceBeforeClose === 0) { - $phpcsFile->fixer->addContentBefore($closingBracket, $padding); - } else { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($closingBracket - 1), $padding); - for ($i = ($closingBracket - 2); $i > $prevNonWhiteSpace; $i--) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } - }//end if - }//end if - - /* - * Check whitespace around each of the semicolon tokens. - */ - - $semicolonCount = 0; - $semicolon = $openingBracket; - $targetNestinglevel = 0; - if (isset($tokens[$openingBracket]['conditions']) === true) { - $targetNestinglevel += count($tokens[$openingBracket]['conditions']); - } - - do { - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($semicolon + 1), $closingBracket); - if ($semicolon === false) { - break; - } - - if (isset($tokens[$semicolon]['conditions']) === true - && count($tokens[$semicolon]['conditions']) > $targetNestinglevel - ) { - // Semicolon doesn't belong to the for(). - continue; - } - - ++$semicolonCount; - - $humanReadableCount = 'first'; - if ($semicolonCount !== 1) { - $humanReadableCount = 'second'; - } - - $humanReadableCode = ucfirst($humanReadableCount); - $data = [$humanReadableCount]; - - // Only examine the space before the first semicolon if the first expression is not empty. - // If it *is* empty, leave it up to the `SpacingAfterOpen` logic. - $prevNonWhiteSpace = $phpcsFile->findPrevious(T_WHITESPACE, ($semicolon - 1), $openingBracket, true); - if ($semicolonCount !== 1 || $prevNonWhiteSpace !== $openingBracket) { - if ($tokens[($semicolon - 1)]['code'] === T_WHITESPACE) { - $error = 'Whitespace found before %s semicolon of FOR loop'; - $errorCode = 'SpacingBefore'.$humanReadableCode; - $fix = $phpcsFile->addFixableError($error, $semicolon, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($semicolon - 1); $i > $prevNonWhiteSpace; $i--) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } - - // Only examine the space after the second semicolon if the last expression is not empty. - // If it *is* empty, leave it up to the `SpacingBeforeClose` logic. - $nextNonWhiteSpace = $phpcsFile->findNext(T_WHITESPACE, ($semicolon + 1), ($closingBracket + 1), true); - if ($semicolonCount !== 2 || $nextNonWhiteSpace !== $closingBracket) { - if ($tokens[($semicolon + 1)]['code'] !== T_WHITESPACE - && $tokens[($semicolon + 1)]['code'] !== T_SEMICOLON - ) { - $error = 'Expected 1 space after %s semicolon of FOR loop; 0 found'; - $errorCode = 'NoSpaceAfter'.$humanReadableCode; - $fix = $phpcsFile->addFixableError($error, $semicolon, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($semicolon, ' '); - } - } else if ($tokens[($semicolon + 1)]['code'] === T_WHITESPACE - && $tokens[$nextNonWhiteSpace]['code'] !== T_SEMICOLON - ) { - $spaces = $tokens[($semicolon + 1)]['length']; - if ($tokens[$semicolon]['line'] !== $tokens[$nextNonWhiteSpace]['line']) { - $spaces = 'newline'; - } - - if ($spaces !== 1 - && ($this->ignoreNewlines === false - || $spaces !== 'newline') - ) { - $error = 'Expected 1 space after %s semicolon of FOR loop; %s found'; - $errorCode = 'SpacingAfter'.$humanReadableCode; - $data[] = $spaces; - $fix = $phpcsFile->addFixableError($error, $semicolon, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($semicolon + 1), ' '); - for ($i = ($semicolon + 2); $i < $nextNonWhiteSpace; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - }//end if - } while ($semicolonCount < 2); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php deleted file mode 100644 index 2844379..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php +++ /dev/null @@ -1,155 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class InlineIfDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_INLINE_THEN]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $openBracket = null; - $closeBracket = null; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $parens = $tokens[$stackPtr]['nested_parenthesis']; - $openBracket = array_pop($parens); - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - } - - // Find the beginning of the statement. If we don't find a - // semicolon (end of statement) or comma (end of array value) - // then assume the content before the closing parenthesis is the end. - $else = $phpcsFile->findNext(T_INLINE_ELSE, ($stackPtr + 1)); - $statementEnd = $phpcsFile->findNext([T_SEMICOLON, T_COMMA], ($else + 1), $closeBracket); - if ($statementEnd === false) { - $statementEnd = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBracket - 1), null, true); - } - - // Make sure it's all on the same line. - if ($tokens[$statementEnd]['line'] !== $tokens[$stackPtr]['line']) { - $error = 'Inline shorthand IF statement must be declared on a single line'; - $phpcsFile->addError($error, $stackPtr, 'NotSingleLine'); - return; - } - - // Make sure there are spaces around the question mark. - $contentBefore = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - $contentAfter = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$contentBefore]['code'] !== T_CLOSE_PARENTHESIS) { - $error = 'Inline shorthand IF statement requires brackets around comparison'; - $phpcsFile->addError($error, $stackPtr, 'NoBrackets'); - } - - $spaceBefore = ($tokens[$stackPtr]['column'] - ($tokens[$contentBefore]['column'] + $tokens[$contentBefore]['length'])); - if ($spaceBefore !== 1) { - $error = 'Inline shorthand IF statement requires 1 space before THEN; %s found'; - $data = [$spaceBefore]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeThen', $data); - if ($fix === true) { - if ($spaceBefore === 0) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } else { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - } - } - } - - // If there is no content between the ? and the : operators, then they are - // trying to replicate an elvis operator, even though PHP doesn't have one. - // In this case, we want no spaces between the two operators so ?: looks like - // an operator itself. - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_INLINE_ELSE) { - $inlineElse = $next; - if ($inlineElse !== ($stackPtr + 1)) { - $error = 'Inline shorthand IF statement without THEN statement requires 0 spaces between THEN and ELSE'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ElvisSpacing'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - } - } else { - $spaceAfter = (($tokens[$contentAfter]['column']) - ($tokens[$stackPtr]['column'] + 1)); - if ($spaceAfter !== 1) { - $error = 'Inline shorthand IF statement requires 1 space after THEN; %s found'; - $data = [$spaceAfter]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterThen', $data); - if ($fix === true) { - if ($spaceAfter === 0) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } else { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } - - // Make sure the ELSE has the correct spacing. - $inlineElse = $phpcsFile->findNext(T_INLINE_ELSE, ($stackPtr + 1), $statementEnd, false); - $contentBefore = $phpcsFile->findPrevious(T_WHITESPACE, ($inlineElse - 1), null, true); - $spaceBefore = ($tokens[$inlineElse]['column'] - ($tokens[$contentBefore]['column'] + $tokens[$contentBefore]['length'])); - if ($spaceBefore !== 1) { - $error = 'Inline shorthand IF statement requires 1 space before ELSE; %s found'; - $data = [$spaceBefore]; - $fix = $phpcsFile->addFixableError($error, $inlineElse, 'SpacingBeforeElse', $data); - if ($fix === true) { - if ($spaceBefore === 0) { - $phpcsFile->fixer->addContentBefore($inlineElse, ' '); - } else { - $phpcsFile->fixer->replaceToken(($inlineElse - 1), ' '); - } - } - } - }//end if - - $contentAfter = $phpcsFile->findNext(T_WHITESPACE, ($inlineElse + 1), null, true); - $spaceAfter = (($tokens[$contentAfter]['column']) - ($tokens[$inlineElse]['column'] + 1)); - if ($spaceAfter !== 1) { - $error = 'Inline shorthand IF statement requires 1 space after ELSE; %s found'; - $data = [$spaceAfter]; - $fix = $phpcsFile->addFixableError($error, $inlineElse, 'SpacingAfterElse', $data); - if ($fix === true) { - if ($spaceAfter === 0) { - $phpcsFile->fixer->addContent($inlineElse, ' '); - } else { - $phpcsFile->fixer->replaceToken(($inlineElse + 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/LowercaseDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/LowercaseDeclarationSniff.php deleted file mode 100644 index ae4a51e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/LowercaseDeclarationSniff.php +++ /dev/null @@ -1,74 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class LowercaseDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_ELSE, - T_ELSEIF, - T_FOREACH, - T_FOR, - T_DO, - T_SWITCH, - T_WHILE, - T_TRY, - T_CATCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $contentLc = strtolower($content); - if ($content !== $contentLc) { - $error = '%s keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - strtoupper($content), - $contentLc, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'FoundUppercase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLc); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/SwitchDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/SwitchDeclarationSniff.php deleted file mode 100644 index a5f3769..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/SwitchDeclarationSniff.php +++ /dev/null @@ -1,304 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SwitchDeclarationSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_SWITCH]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // We can't process SWITCH statements unless we know where they start and end. - if (isset($tokens[$stackPtr]['scope_opener']) === false - || isset($tokens[$stackPtr]['scope_closer']) === false - ) { - return; - } - - $switch = $tokens[$stackPtr]; - $nextCase = $stackPtr; - $caseAlignment = ($switch['column'] + $this->indent); - $caseCount = 0; - $foundDefault = false; - - while (($nextCase = $phpcsFile->findNext([T_CASE, T_DEFAULT, T_SWITCH], ($nextCase + 1), $switch['scope_closer'])) !== false) { - // Skip nested SWITCH statements; they are handled on their own. - if ($tokens[$nextCase]['code'] === T_SWITCH) { - $nextCase = $tokens[$nextCase]['scope_closer']; - continue; - } - - if ($tokens[$nextCase]['code'] === T_DEFAULT) { - $type = 'Default'; - $foundDefault = true; - } else { - $type = 'Case'; - $caseCount++; - } - - if ($tokens[$nextCase]['content'] !== strtolower($tokens[$nextCase]['content'])) { - $expected = strtolower($tokens[$nextCase]['content']); - $error = strtoupper($type).' keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - $expected, - $tokens[$nextCase]['content'], - ]; - - $fix = $phpcsFile->addFixableError($error, $nextCase, $type.'NotLower', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($nextCase, $expected); - } - } - - if ($tokens[$nextCase]['column'] !== $caseAlignment) { - $error = strtoupper($type).' keyword must be indented '.$this->indent.' spaces from SWITCH keyword'; - $fix = $phpcsFile->addFixableError($error, $nextCase, $type.'Indent'); - - if ($fix === true) { - $padding = str_repeat(' ', ($caseAlignment - 1)); - if ($tokens[$nextCase]['column'] === 1 - || $tokens[($nextCase - 1)]['code'] !== T_WHITESPACE - ) { - $phpcsFile->fixer->addContentBefore($nextCase, $padding); - } else { - $phpcsFile->fixer->replaceToken(($nextCase - 1), $padding); - } - } - } - - if ($type === 'Case' - && ($tokens[($nextCase + 1)]['type'] !== 'T_WHITESPACE' - || $tokens[($nextCase + 1)]['content'] !== ' ') - ) { - $error = 'CASE keyword must be followed by a single space'; - $fix = $phpcsFile->addFixableError($error, $nextCase, 'SpacingAfterCase'); - if ($fix === true) { - if ($tokens[($nextCase + 1)]['type'] !== 'T_WHITESPACE') { - $phpcsFile->fixer->addContent($nextCase, ' '); - } else { - $phpcsFile->fixer->replaceToken(($nextCase + 1), ' '); - } - } - } - - if (isset($tokens[$nextCase]['scope_opener']) === false) { - $error = 'Possible parse error: CASE missing opening colon'; - $phpcsFile->addWarning($error, $nextCase, 'MissingColon'); - continue; - } - - $opener = $tokens[$nextCase]['scope_opener']; - if ($tokens[($opener - 1)]['type'] === 'T_WHITESPACE') { - $error = 'There must be no space before the colon in a '.strtoupper($type).' statement'; - $fix = $phpcsFile->addFixableError($error, $nextCase, 'SpaceBeforeColon'.$type); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($opener - 1), ''); - } - } - - $nextBreak = $tokens[$nextCase]['scope_closer']; - if ($tokens[$nextBreak]['code'] === T_BREAK - || $tokens[$nextBreak]['code'] === T_RETURN - || $tokens[$nextBreak]['code'] === T_CONTINUE - || $tokens[$nextBreak]['code'] === T_THROW - || $tokens[$nextBreak]['code'] === T_EXIT - ) { - if ($tokens[$nextBreak]['scope_condition'] === $nextCase) { - // Only need to check a couple of things once, even if the - // break is shared between multiple case statements, or even - // the default case. - if ($tokens[$nextBreak]['column'] !== $caseAlignment) { - $error = 'Case breaking statement must be indented '.$this->indent.' spaces from SWITCH keyword'; - $fix = $phpcsFile->addFixableError($error, $nextBreak, 'BreakIndent'); - - if ($fix === true) { - $padding = str_repeat(' ', ($caseAlignment - 1)); - if ($tokens[$nextBreak]['column'] === 1 - || $tokens[($nextBreak - 1)]['code'] !== T_WHITESPACE - ) { - $phpcsFile->fixer->addContentBefore($nextBreak, $padding); - } else { - $phpcsFile->fixer->replaceToken(($nextBreak - 1), $padding); - } - } - } - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($nextBreak - 1), $stackPtr, true); - if ($tokens[$prev]['line'] !== ($tokens[$nextBreak]['line'] - 1)) { - $error = 'Blank lines are not allowed before case breaking statements'; - $phpcsFile->addError($error, $nextBreak, 'SpacingBeforeBreak'); - } - - $nextLine = $tokens[$tokens[$stackPtr]['scope_closer']]['line']; - $semicolon = $phpcsFile->findEndOfStatement($nextBreak); - for ($i = ($semicolon + 1); $i < $tokens[$stackPtr]['scope_closer']; $i++) { - if ($tokens[$i]['type'] !== 'T_WHITESPACE') { - $nextLine = $tokens[$i]['line']; - break; - } - } - - if ($type === 'Case') { - // Ensure the BREAK statement is followed by - // a single blank line, or the end switch brace. - if ($nextLine !== ($tokens[$semicolon]['line'] + 2) && $i !== $tokens[$stackPtr]['scope_closer']) { - $error = 'Case breaking statements must be followed by a single blank line'; - $fix = $phpcsFile->addFixableError($error, $nextBreak, 'SpacingAfterBreak'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($semicolon + 1); $i <= $tokens[$stackPtr]['scope_closer']; $i++) { - if ($tokens[$i]['line'] === $nextLine) { - $phpcsFile->fixer->addNewlineBefore($i); - break; - } - - if ($tokens[$i]['line'] === $tokens[$semicolon]['line']) { - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - } else { - // Ensure the BREAK statement is not followed by a blank line. - if ($nextLine !== ($tokens[$semicolon]['line'] + 1)) { - $error = 'Blank lines are not allowed after the DEFAULT case\'s breaking statement'; - $phpcsFile->addError($error, $nextBreak, 'SpacingAfterDefaultBreak'); - } - }//end if - - $caseLine = $tokens[$nextCase]['line']; - $nextLine = $tokens[$nextBreak]['line']; - for ($i = ($opener + 1); $i < $nextBreak; $i++) { - if ($tokens[$i]['type'] !== 'T_WHITESPACE') { - $nextLine = $tokens[$i]['line']; - break; - } - } - - if ($nextLine !== ($caseLine + 1)) { - $error = 'Blank lines are not allowed after '.strtoupper($type).' statements'; - $phpcsFile->addError($error, $nextCase, 'SpacingAfter'.$type); - } - }//end if - - if ($tokens[$nextBreak]['code'] === T_BREAK) { - if ($type === 'Case') { - // Ensure empty CASE statements are not allowed. - // They must have some code content in them. A comment is not enough. - // But count RETURN statements as valid content if they also - // happen to close the CASE statement. - $foundContent = false; - for ($i = ($tokens[$nextCase]['scope_opener'] + 1); $i < $nextBreak; $i++) { - if ($tokens[$i]['code'] === T_CASE) { - $i = $tokens[$i]['scope_opener']; - continue; - } - - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === false) { - $foundContent = true; - break; - } - } - - if ($foundContent === false) { - $error = 'Empty CASE statements are not allowed'; - $phpcsFile->addError($error, $nextCase, 'EmptyCase'); - } - } else { - // Ensure empty DEFAULT statements are not allowed. - // They must (at least) have a comment describing why - // the default case is being ignored. - $foundContent = false; - for ($i = ($tokens[$nextCase]['scope_opener'] + 1); $i < $nextBreak; $i++) { - if ($tokens[$i]['type'] !== 'T_WHITESPACE') { - $foundContent = true; - break; - } - } - - if ($foundContent === false) { - $error = 'Comment required for empty DEFAULT case'; - $phpcsFile->addError($error, $nextCase, 'EmptyDefault'); - } - }//end if - }//end if - } else if ($type === 'Default') { - $error = 'DEFAULT case must have a breaking statement'; - $phpcsFile->addError($error, $nextCase, 'DefaultNoBreak'); - }//end if - }//end while - - if ($foundDefault === false) { - $error = 'All SWITCH statements must contain a DEFAULT case'; - $phpcsFile->addError($error, $stackPtr, 'MissingDefault'); - } - - if ($tokens[$switch['scope_closer']]['column'] !== $switch['column']) { - $error = 'Closing brace of SWITCH statement must be aligned with SWITCH keyword'; - $phpcsFile->addError($error, $switch['scope_closer'], 'CloseBraceAlign'); - } - - if ($caseCount === 0) { - $error = 'SWITCH statements must contain at least one CASE statement'; - $phpcsFile->addError($error, $stackPtr, 'MissingCase'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JSLintSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JSLintSniff.php deleted file mode 100644 index c50e764..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JSLintSniff.php +++ /dev/null @@ -1,85 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class JSLintSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If jslint.js could not be run - */ - public function process(File $phpcsFile, $stackPtr) - { - $rhinoPath = Config::getExecutablePath('jslint'); - $jslintPath = Config::getExecutablePath('jslint'); - if ($rhinoPath === null || $jslintPath === null) { - return; - } - - $fileName = $phpcsFile->getFilename(); - - $rhinoPath = escapeshellcmd($rhinoPath); - $jslintPath = escapeshellcmd($jslintPath); - - $cmd = "$rhinoPath \"$jslintPath\" ".escapeshellarg($fileName); - exec($cmd, $output, $retval); - - if (is_array($output) === true) { - foreach ($output as $finding) { - $matches = []; - $numMatches = preg_match('/Lint at line ([0-9]+).*:(.*)$/', $finding, $matches); - if ($numMatches === 0) { - continue; - } - - $line = (int) $matches[1]; - $message = 'jslint says: '.trim($matches[2]); - $phpcsFile->addWarningOnLine($message, $line, 'ExternalTool'); - } - } - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JavaScriptLintSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JavaScriptLintSniff.php deleted file mode 100644 index 0c0f355..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JavaScriptLintSniff.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class JavaScriptLintSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If Javascript Lint ran into trouble. - */ - public function process(File $phpcsFile, $stackPtr) - { - $jslPath = Config::getExecutablePath('jsl'); - if ($jslPath === null) { - return; - } - - $fileName = $phpcsFile->getFilename(); - - $cmd = '"'.escapeshellcmd($jslPath).'" -nologo -nofilelisting -nocontext -nosummary -output-format __LINE__:__ERROR__ -process '.escapeshellarg($fileName); - $msg = exec($cmd, $output, $retval); - - // Variable $exitCode is the last line of $output if no error occurs, on - // error it is numeric. Try to handle various error conditions and - // provide useful error reporting. - if ($retval === 2 || $retval === 4) { - if (is_array($output) === true) { - $msg = join('\n', $output); - } - - throw new RuntimeException("Failed invoking JavaScript Lint, retval was [$retval], output was [$msg]"); - } - - if (is_array($output) === true) { - foreach ($output as $finding) { - $split = strpos($finding, ':'); - $line = substr($finding, 0, $split); - $message = substr($finding, ($split + 1)); - $phpcsFile->addWarningOnLine(trim($message), $line, 'ExternalTool'); - } - } - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Files/FileExtensionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Files/FileExtensionSniff.php deleted file mode 100644 index bae8821..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Files/FileExtensionSniff.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FileExtensionSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $fileName = $phpcsFile->getFilename(); - $extension = substr($fileName, strrpos($fileName, '.')); - $nextClass = $phpcsFile->findNext([T_CLASS, T_INTERFACE, T_TRAIT], $stackPtr); - - if ($nextClass !== false) { - $phpcsFile->recordMetric($stackPtr, 'File extension for class files', $extension); - if ($extension === '.php') { - $error = '%s found in ".php" file; use ".inc" extension instead'; - $data = [ucfirst($tokens[$nextClass]['content'])]; - $phpcsFile->addError($error, $stackPtr, 'ClassFound', $data); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'File extension for non-class files', $extension); - if ($extension === '.inc') { - $error = 'No interface or class found in ".inc" file; use ".php" extension instead'; - $phpcsFile->addError($error, $stackPtr, 'NoClass'); - } - } - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Formatting/OperatorBracketSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Formatting/OperatorBracketSniff.php deleted file mode 100644 index 3d67f9b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Formatting/OperatorBracketSniff.php +++ /dev/null @@ -1,385 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class OperatorBracketSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$operators; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($phpcsFile->tokenizerType === 'JS' && $tokens[$stackPtr]['code'] === T_PLUS) { - // JavaScript uses the plus operator for string concatenation as well - // so we cannot accurately determine if it is a string concat or addition. - // So just ignore it. - return; - } - - // If the & is a reference, then we don't want to check for brackets. - if ($tokens[$stackPtr]['code'] === T_BITWISE_AND && $phpcsFile->isReference($stackPtr) === true) { - return; - } - - // There is one instance where brackets aren't needed, which involves - // the minus sign being used to assign a negative number to a variable. - if ($tokens[$stackPtr]['code'] === T_MINUS) { - // Check to see if we are trying to return -n. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_RETURN) { - return; - } - - $number = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$number]['code'] === T_LNUMBER || $tokens[$number]['code'] === T_DNUMBER) { - $previous = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($previous !== false) { - $isAssignment = isset(Tokens::$assignmentTokens[$tokens[$previous]['code']]); - $isEquality = isset(Tokens::$equalityTokens[$tokens[$previous]['code']]); - $isComparison = isset(Tokens::$comparisonTokens[$tokens[$previous]['code']]); - if ($isAssignment === true || $isEquality === true || $isComparison === true) { - // This is a negative assignment or comparison. - // We need to check that the minus and the number are - // adjacent. - if (($number - $stackPtr) !== 1) { - $error = 'No space allowed between minus sign and number'; - $phpcsFile->addError($error, $stackPtr, 'SpacingAfterMinus'); - } - - return; - } - } - } - }//end if - - $previousToken = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true, null, true); - if ($previousToken !== false) { - // A list of tokens that indicate that the token is not - // part of an arithmetic operation. - $invalidTokens = [ - T_COMMA => true, - T_COLON => true, - T_OPEN_PARENTHESIS => true, - T_OPEN_SQUARE_BRACKET => true, - T_OPEN_CURLY_BRACKET => true, - T_OPEN_SHORT_ARRAY => true, - T_CASE => true, - ]; - - if (isset($invalidTokens[$tokens[$previousToken]['code']]) === true) { - return; - } - } - - if ($tokens[$stackPtr]['code'] === T_BITWISE_OR - && isset($tokens[$stackPtr]['nested_parenthesis']) === true - ) { - $brackets = $tokens[$stackPtr]['nested_parenthesis']; - $lastBracket = array_pop($brackets); - if (isset($tokens[$lastBracket]['parenthesis_owner']) === true - && $tokens[$tokens[$lastBracket]['parenthesis_owner']]['code'] === T_CATCH - ) { - // This is a pipe character inside a catch statement, so it is acting - // as an exception type separator and not an arithmetic operation. - return; - } - } - - // Tokens that are allowed inside a bracketed operation. - $allowed = [ - T_VARIABLE, - T_LNUMBER, - T_DNUMBER, - T_STRING, - T_WHITESPACE, - T_NS_SEPARATOR, - T_THIS, - T_SELF, - T_STATIC, - T_OBJECT_OPERATOR, - T_DOUBLE_COLON, - T_OPEN_SQUARE_BRACKET, - T_CLOSE_SQUARE_BRACKET, - T_MODULUS, - T_NONE, - T_BITWISE_NOT, - ]; - - $allowed += Tokens::$operators; - - $lastBracket = false; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $parenthesis = array_reverse($tokens[$stackPtr]['nested_parenthesis'], true); - foreach ($parenthesis as $bracket => $endBracket) { - $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($bracket - 1), null, true); - $prevCode = $tokens[$prevToken]['code']; - - if ($prevCode === T_ISSET) { - // This operation is inside an isset() call, but has - // no bracket of it's own. - break; - } - - if ($prevCode === T_STRING || $prevCode === T_SWITCH) { - // We allow simple operations to not be bracketed. - // For example, ceil($one / $two). - for ($prev = ($stackPtr - 1); $prev > $bracket; $prev--) { - if (in_array($tokens[$prev]['code'], $allowed, true) === true) { - continue; - } - - if ($tokens[$prev]['code'] === T_CLOSE_PARENTHESIS) { - $prev = $tokens[$prev]['parenthesis_opener']; - } else { - break; - } - } - - if ($prev !== $bracket) { - break; - } - - for ($next = ($stackPtr + 1); $next < $endBracket; $next++) { - if (in_array($tokens[$next]['code'], $allowed, true) === true) { - continue; - } - - if ($tokens[$next]['code'] === T_OPEN_PARENTHESIS) { - $next = $tokens[$next]['parenthesis_closer']; - } else { - break; - } - } - - if ($next !== $endBracket) { - break; - } - }//end if - - if (in_array($prevCode, Tokens::$scopeOpeners, true) === true) { - // This operation is inside a control structure like FOREACH - // or IF, but has no bracket of it's own. - // The only control structure allowed to do this is SWITCH. - if ($prevCode !== T_SWITCH) { - break; - } - } - - if ($prevCode === T_OPEN_PARENTHESIS) { - // These are two open parenthesis in a row. If the current - // one doesn't enclose the operator, go to the previous one. - if ($endBracket < $stackPtr) { - continue; - } - } - - $lastBracket = $bracket; - break; - }//end foreach - }//end if - - if ($lastBracket === false) { - // It is not in a bracketed statement at all. - $this->addMissingBracketsError($phpcsFile, $stackPtr); - return; - } else if ($tokens[$lastBracket]['parenthesis_closer'] < $stackPtr) { - // There are a set of brackets in front of it that don't include it. - $this->addMissingBracketsError($phpcsFile, $stackPtr); - return; - } else { - // We are enclosed in a set of bracket, so the last thing to - // check is that we are not also enclosed in square brackets - // like this: ($array[$index + 1]), which is invalid. - $brackets = [ - T_OPEN_SQUARE_BRACKET, - T_CLOSE_SQUARE_BRACKET, - ]; - - $squareBracket = $phpcsFile->findPrevious($brackets, ($stackPtr - 1), $lastBracket); - if ($squareBracket !== false && $tokens[$squareBracket]['code'] === T_OPEN_SQUARE_BRACKET) { - $closeSquareBracket = $phpcsFile->findNext($brackets, ($stackPtr + 1)); - if ($closeSquareBracket !== false && $tokens[$closeSquareBracket]['code'] === T_CLOSE_SQUARE_BRACKET) { - $this->addMissingBracketsError($phpcsFile, $stackPtr); - } - } - - return; - }//end if - - $lastAssignment = $phpcsFile->findPrevious(Tokens::$assignmentTokens, $stackPtr, null, false, null, true); - if ($lastAssignment !== false && $lastAssignment > $lastBracket) { - $this->addMissingBracketsError($phpcsFile, $stackPtr); - } - - }//end process() - - - /** - * Add and fix the missing brackets error. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function addMissingBracketsError($phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $allowed = [ - T_VARIABLE => true, - T_LNUMBER => true, - T_DNUMBER => true, - T_STRING => true, - T_CONSTANT_ENCAPSED_STRING => true, - T_DOUBLE_QUOTED_STRING => true, - T_WHITESPACE => true, - T_NS_SEPARATOR => true, - T_THIS => true, - T_SELF => true, - T_STATIC => true, - T_OBJECT_OPERATOR => true, - T_DOUBLE_COLON => true, - T_MODULUS => true, - T_ISSET => true, - T_ARRAY => true, - T_NONE => true, - T_BITWISE_NOT => true, - ]; - - // Find the first token in the expression. - for ($before = ($stackPtr - 1); $before > 0; $before--) { - // Special case for plus operators because we can't tell if they are used - // for addition or string contact. So assume string concat to be safe. - if ($phpcsFile->tokenizerType === 'JS' && $tokens[$before]['code'] === T_PLUS) { - break; - } - - if (isset(Tokens::$emptyTokens[$tokens[$before]['code']]) === true - || isset(Tokens::$operators[$tokens[$before]['code']]) === true - || isset(Tokens::$castTokens[$tokens[$before]['code']]) === true - || isset($allowed[$tokens[$before]['code']]) === true - ) { - continue; - } - - if ($tokens[$before]['code'] === T_CLOSE_PARENTHESIS) { - $before = $tokens[$before]['parenthesis_opener']; - continue; - } - - if ($tokens[$before]['code'] === T_CLOSE_SQUARE_BRACKET) { - $before = $tokens[$before]['bracket_opener']; - continue; - } - - if ($tokens[$before]['code'] === T_CLOSE_SHORT_ARRAY) { - $before = $tokens[$before]['bracket_opener']; - continue; - } - - break; - }//end for - - $before = $phpcsFile->findNext(Tokens::$emptyTokens, ($before + 1), null, true); - - // Find the last token in the expression. - for ($after = ($stackPtr + 1); $after < $phpcsFile->numTokens; $after++) { - // Special case for plus operators because we can't tell if they are used - // for addition or string concat. So assume string concat to be safe. - if ($phpcsFile->tokenizerType === 'JS' && $tokens[$after]['code'] === T_PLUS) { - break; - } - - if (isset(Tokens::$emptyTokens[$tokens[$after]['code']]) === true - || isset(Tokens::$operators[$tokens[$after]['code']]) === true - || isset(Tokens::$castTokens[$tokens[$after]['code']]) === true - || isset($allowed[$tokens[$after]['code']]) === true - ) { - continue; - } - - if ($tokens[$after]['code'] === T_OPEN_PARENTHESIS) { - $after = $tokens[$after]['parenthesis_closer']; - continue; - } - - if ($tokens[$after]['code'] === T_OPEN_SQUARE_BRACKET) { - $after = $tokens[$after]['bracket_closer']; - continue; - } - - if ($tokens[$after]['code'] === T_OPEN_SHORT_ARRAY) { - $after = $tokens[$after]['bracket_closer']; - continue; - } - - break; - }//end for - - $after = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($after - 1), null, true); - - $error = 'Operation must be bracketed'; - if ($before === $after || $before === $stackPtr || $after === $stackPtr) { - $phpcsFile->addError($error, $stackPtr, 'MissingBrackets'); - return; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'MissingBrackets'); - if ($fix === true) { - // Can only fix this error if both tokens are available for fixing. - // Adding one bracket without the other will create parse errors. - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($before, '('.$tokens[$before]['content']); - $phpcsFile->fixer->replaceToken($after, $tokens[$after]['content'].')'); - $phpcsFile->fixer->endChangeset(); - } - - }//end addMissingBracketsError() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php deleted file mode 100644 index 2f0d3ab..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php +++ /dev/null @@ -1,392 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionDeclarationArgumentSpacingSniff implements Sniff -{ - - /** - * How many spaces should surround the equals signs. - * - * @var integer - */ - public $equalsSpacing = 0; - - /** - * How many spaces should follow the opening bracket. - * - * @var integer - */ - public $requiredSpacesAfterOpen = 0; - - /** - * How many spaces should precede the closing bracket. - * - * @var integer - */ - public $requiredSpacesBeforeClose = 0; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - T_FN, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - || $tokens[$stackPtr]['parenthesis_opener'] === null - || $tokens[$stackPtr]['parenthesis_closer'] === null - ) { - return; - } - - $this->equalsSpacing = (int) $this->equalsSpacing; - $this->requiredSpacesAfterOpen = (int) $this->requiredSpacesAfterOpen; - $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose; - - $this->processBracket($phpcsFile, $tokens[$stackPtr]['parenthesis_opener']); - - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($tokens[$stackPtr]['parenthesis_closer'] + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - $openBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1), null); - $this->processBracket($phpcsFile, $openBracket); - } - } - - }//end process() - - - /** - * Processes the contents of a single set of brackets. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $openBracket The position of the open bracket - * in the stack. - * - * @return void - */ - public function processBracket($phpcsFile, $openBracket) - { - $tokens = $phpcsFile->getTokens(); - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - $multiLine = ($tokens[$openBracket]['line'] !== $tokens[$closeBracket]['line']); - - if (isset($tokens[$openBracket]['parenthesis_owner']) === true) { - $stackPtr = $tokens[$openBracket]['parenthesis_owner']; - } else { - $stackPtr = $phpcsFile->findPrevious(T_USE, ($openBracket - 1)); - } - - $params = $phpcsFile->getMethodParameters($stackPtr); - - if (empty($params) === true) { - // Check spacing around parenthesis. - $next = $phpcsFile->findNext(T_WHITESPACE, ($openBracket + 1), $closeBracket, true); - if ($next === false) { - if (($closeBracket - $openBracket) !== 1) { - $error = 'Expected 0 spaces between parenthesis of function declaration; %s found'; - $data = [$tokens[($openBracket + 1)]['length']]; - $fix = $phpcsFile->addFixableError($error, $openBracket, 'SpacingBetween', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($openBracket + 1), ''); - } - } - - // No params, so we don't check normal spacing rules. - return; - } - } - - foreach ($params as $paramNumber => $param) { - if ($param['pass_by_reference'] === true) { - $refToken = $param['reference_token']; - - $gap = 0; - if ($tokens[($refToken + 1)]['code'] === T_WHITESPACE) { - $gap = $tokens[($refToken + 1)]['length']; - } - - if ($gap !== 0) { - $error = 'Expected 0 spaces after reference operator for argument "%s"; %s found'; - $data = [ - $param['name'], - $gap, - ]; - $fix = $phpcsFile->addFixableError($error, $refToken, 'SpacingAfterReference', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($refToken + 1), ''); - } - } - }//end if - - if ($param['variable_length'] === true) { - $variadicToken = $param['variadic_token']; - - $gap = 0; - if ($tokens[($variadicToken + 1)]['code'] === T_WHITESPACE) { - $gap = $tokens[($variadicToken + 1)]['length']; - } - - if ($gap !== 0) { - $error = 'Expected 0 spaces after variadic operator for argument "%s"; %s found'; - $data = [ - $param['name'], - $gap, - ]; - $fix = $phpcsFile->addFixableError($error, $variadicToken, 'SpacingAfterVariadic', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($variadicToken + 1), ''); - } - } - }//end if - - if (isset($param['default_equal_token']) === true) { - $equalToken = $param['default_equal_token']; - - $spacesBefore = 0; - if (($equalToken - $param['token']) > 1) { - $spacesBefore = $tokens[($param['token'] + 1)]['length']; - } - - if ($spacesBefore !== $this->equalsSpacing) { - $error = 'Incorrect spacing between argument "%s" and equals sign; expected '.$this->equalsSpacing.' but found %s'; - $data = [ - $param['name'], - $spacesBefore, - ]; - - $fix = $phpcsFile->addFixableError($error, $equalToken, 'SpaceBeforeEquals', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->equalsSpacing); - if ($spacesBefore === 0) { - $phpcsFile->fixer->addContentBefore($equalToken, $padding); - } else { - $phpcsFile->fixer->replaceToken(($equalToken - 1), $padding); - } - } - }//end if - - $spacesAfter = 0; - if ($tokens[($equalToken + 1)]['code'] === T_WHITESPACE) { - $spacesAfter = $tokens[($equalToken + 1)]['length']; - } - - if ($spacesAfter !== $this->equalsSpacing) { - $error = 'Incorrect spacing between default value and equals sign for argument "%s"; expected '.$this->equalsSpacing.' but found %s'; - $data = [ - $param['name'], - $spacesAfter, - ]; - - $fix = $phpcsFile->addFixableError($error, $equalToken, 'SpaceAfterEquals', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->equalsSpacing); - if ($spacesAfter === 0) { - $phpcsFile->fixer->addContent($equalToken, $padding); - } else { - $phpcsFile->fixer->replaceToken(($equalToken + 1), $padding); - } - } - }//end if - }//end if - - if ($param['type_hint_token'] !== false) { - $typeHintToken = $param['type_hint_end_token']; - - $gap = 0; - if ($tokens[($typeHintToken + 1)]['code'] === T_WHITESPACE) { - $gap = $tokens[($typeHintToken + 1)]['length']; - } - - if ($gap !== 1) { - $error = 'Expected 1 space between type hint and argument "%s"; %s found'; - $data = [ - $param['name'], - $gap, - ]; - $fix = $phpcsFile->addFixableError($error, $typeHintToken, 'SpacingAfterHint', $data); - if ($fix === true) { - if ($gap === 0) { - $phpcsFile->fixer->addContent($typeHintToken, ' '); - } else { - $phpcsFile->fixer->replaceToken(($typeHintToken + 1), ' '); - } - } - } - }//end if - - $commaToken = false; - if ($paramNumber > 0 && $params[($paramNumber - 1)]['comma_token'] !== false) { - $commaToken = $params[($paramNumber - 1)]['comma_token']; - } - - if ($commaToken !== false) { - if ($tokens[($commaToken - 1)]['code'] === T_WHITESPACE) { - $error = 'Expected 0 spaces between argument "%s" and comma; %s found'; - $data = [ - $params[($paramNumber - 1)]['name'], - $tokens[($commaToken - 1)]['length'], - ]; - - $fix = $phpcsFile->addFixableError($error, $commaToken, 'SpaceBeforeComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($commaToken - 1), ''); - } - } - - // Don't check spacing after the comma if it is the last content on the line. - $checkComma = true; - if ($multiLine === true) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($commaToken + 1), $closeBracket, true); - if ($tokens[$next]['line'] !== $tokens[$commaToken]['line']) { - $checkComma = false; - } - } - - if ($checkComma === true) { - if ($param['type_hint_token'] === false) { - $spacesAfter = 0; - if ($tokens[($commaToken + 1)]['code'] === T_WHITESPACE) { - $spacesAfter = $tokens[($commaToken + 1)]['length']; - } - - if ($spacesAfter === 0) { - $error = 'Expected 1 space between comma and argument "%s"; 0 found'; - $data = [$param['name']]; - $fix = $phpcsFile->addFixableError($error, $commaToken, 'NoSpaceBeforeArg', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($commaToken, ' '); - } - } else if ($spacesAfter !== 1) { - $error = 'Expected 1 space between comma and argument "%s"; %s found'; - $data = [ - $param['name'], - $spacesAfter, - ]; - - $fix = $phpcsFile->addFixableError($error, $commaToken, 'SpacingBeforeArg', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($commaToken + 1), ' '); - } - }//end if - } else { - $hint = $phpcsFile->getTokensAsString($param['type_hint_token'], (($param['type_hint_end_token'] - $param['type_hint_token']) + 1)); - if ($param['nullable_type'] === true) { - $hint = '?'.$hint; - } - - if ($tokens[($commaToken + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space between comma and type hint "%s"; 0 found'; - $data = [$hint]; - $fix = $phpcsFile->addFixableError($error, $commaToken, 'NoSpaceBeforeHint', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($commaToken, ' '); - } - } else { - $gap = $tokens[($commaToken + 1)]['length']; - if ($gap !== 1) { - $error = 'Expected 1 space between comma and type hint "%s"; %s found'; - $data = [ - $hint, - $gap, - ]; - $fix = $phpcsFile->addFixableError($error, $commaToken, 'SpacingBeforeHint', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($commaToken + 1), ' '); - } - } - }//end if - }//end if - }//end if - }//end if - }//end foreach - - // Only check spacing around parenthesis for single line definitions. - if ($multiLine === true) { - return; - } - - $gap = 0; - if ($tokens[($closeBracket - 1)]['code'] === T_WHITESPACE) { - $gap = $tokens[($closeBracket - 1)]['length']; - } - - if ($gap !== $this->requiredSpacesBeforeClose) { - $error = 'Expected %s spaces before closing parenthesis; %s found'; - $data = [ - $this->requiredSpacesBeforeClose, - $gap, - ]; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'SpacingBeforeClose', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesBeforeClose); - if ($gap === 0) { - $phpcsFile->fixer->addContentBefore($closeBracket, $padding); - } else { - $phpcsFile->fixer->replaceToken(($closeBracket - 1), $padding); - } - } - } - - $gap = 0; - if ($tokens[($openBracket + 1)]['code'] === T_WHITESPACE) { - $gap = $tokens[($openBracket + 1)]['length']; - } - - if ($gap !== $this->requiredSpacesAfterOpen) { - $error = 'Expected %s spaces after opening parenthesis; %s found'; - $data = [ - $this->requiredSpacesAfterOpen, - $gap, - ]; - $fix = $phpcsFile->addFixableError($error, $openBracket, 'SpacingAfterOpen', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesAfterOpen); - if ($gap === 0) { - $phpcsFile->fixer->addContent($openBracket, $padding); - } else { - $phpcsFile->fixer->replaceToken(($openBracket + 1), $padding); - } - } - } - - }//end processBracket() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationSniff.php deleted file mode 100644 index 4b6a6ac..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationSniff.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Sniffs\AbstractPatternSniff; - -class FunctionDeclarationSniff extends AbstractPatternSniff -{ - - - /** - * Returns an array of patterns to check are correct. - * - * @return array - */ - protected function getPatterns() - { - return [ - 'function abc(...);', - 'function abc(...)', - 'abstract function abc(...);', - ]; - - }//end getPatterns() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDuplicateArgumentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDuplicateArgumentSniff.php deleted file mode 100644 index f6fc383..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDuplicateArgumentSniff.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FunctionDuplicateArgumentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - - $foundVariables = []; - for ($i = ($openBracket + 1); $i < $closeBracket; $i++) { - if ($tokens[$i]['code'] === T_VARIABLE) { - $variable = $tokens[$i]['content']; - if (in_array($variable, $foundVariables, true) === true) { - $error = 'Variable "%s" appears more than once in function declaration'; - $data = [$variable]; - $phpcsFile->addError($error, $i, 'Found', $data); - } else { - $foundVariables[] = $variable; - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/GlobalFunctionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/GlobalFunctionSniff.php deleted file mode 100644 index 24588a9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/GlobalFunctionSniff.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class GlobalFunctionSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (empty($tokens[$stackPtr]['conditions']) === true) { - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if ($functionName === null) { - return; - } - - // Special exception for __autoload as it needs to be global. - if ($functionName !== '__autoload') { - $error = 'Consider putting global function "%s" in a static class'; - $data = [$functionName]; - $phpcsFile->addWarning($error, $stackPtr, 'Found', $data); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/LowercaseFunctionKeywordsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/LowercaseFunctionKeywordsSniff.php deleted file mode 100644 index 2357960..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/LowercaseFunctionKeywordsSniff.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class LowercaseFunctionKeywordsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $tokens = Tokens::$methodPrefixes; - $tokens[] = T_FUNCTION; - $tokens[] = T_CLOSURE; - $tokens[] = T_FN; - - return $tokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $contentLc = strtolower($content); - if ($content !== $contentLc) { - $error = '%s keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - strtoupper($content), - $contentLc, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'FoundUppercase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLc); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php deleted file mode 100644 index a4ea79c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php +++ /dev/null @@ -1,258 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\FunctionDeclarationSniff as PEARFunctionDeclarationSniff; -use PHP_CodeSniffer\Util\Tokens; - -class MultiLineFunctionDeclarationSniff extends PEARFunctionDeclarationSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Determine if this is a multi-line function declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function isMultiLineDeclaration($phpcsFile, $stackPtr, $openBracket, $tokens) - { - $bracketsToCheck = [$stackPtr => $openBracket]; - - // Closures may use the USE keyword and so be multi-line in this way. - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($tokens[$openBracket]['parenthesis_closer'] + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - $open = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - if ($open !== false) { - $bracketsToCheck[$use] = $open; - } - } - } - - foreach ($bracketsToCheck as $stackPtr => $openBracket) { - // If the first argument is on a new line, this is a multi-line - // function declaration, even if there is only one argument. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($openBracket + 1), null, true); - if ($tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - return true; - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - $end = $phpcsFile->findEndOfStatement($openBracket + 1); - while ($tokens[$end]['code'] === T_COMMA) { - // If the next bit of code is not on the same line, this is a - // multi-line function declaration. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), $closeBracket, true); - if ($next === false) { - continue(2); - } - - if ($tokens[$next]['line'] !== $tokens[$end]['line']) { - return true; - } - - $end = $phpcsFile->findEndOfStatement($next); - } - - // We've reached the last argument, so see if the next content - // (should be the close bracket) is also on the same line. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), $closeBracket, true); - if ($next !== false && $tokens[$next]['line'] !== $tokens[$end]['line']) { - return true; - } - }//end foreach - - return false; - - }//end isMultiLineDeclaration() - - - /** - * Processes single-line declarations. - * - * Just uses the Generic BSD-Allman brace sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens) - { - // We do everything the parent sniff does, and a bit more because we - // define multi-line declarations a bit differently. - parent::processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens); - - $openingBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closingBracket = $tokens[$stackPtr]['parenthesis_closer']; - - $prevNonWhiteSpace = $phpcsFile->findPrevious(T_WHITESPACE, ($closingBracket - 1), $openingBracket, true); - if ($tokens[$prevNonWhiteSpace]['line'] !== $tokens[$closingBracket]['line']) { - $error = 'There must not be a newline before the closing parenthesis of a single-line function declaration'; - - if (isset(Tokens::$emptyTokens[$tokens[$prevNonWhiteSpace]['code']]) === true) { - $phpcsFile->addError($error, $closingBracket, 'CloseBracketNewLine'); - } else { - $fix = $phpcsFile->addFixableError($error, $closingBracket, 'CloseBracketNewLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($closingBracket - 1); $i > $openingBracket; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - }//end processSingleLineDeclaration() - - - /** - * Processes multi-line declarations. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens) - { - // We do everything the parent sniff does, and a bit more. - parent::processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens); - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $this->processBracket($phpcsFile, $openBracket, $tokens, 'function'); - - if ($tokens[$stackPtr]['code'] !== T_CLOSURE) { - return; - } - - $use = $phpcsFile->findNext(T_USE, ($tokens[$stackPtr]['parenthesis_closer'] + 1), $tokens[$stackPtr]['scope_opener']); - if ($use === false) { - return; - } - - $openBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1), null); - $this->processBracket($phpcsFile, $openBracket, $tokens, 'use'); - - }//end processMultiLineDeclaration() - - - /** - * Processes the contents of a single set of brackets. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $openBracket The position of the open bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * @param string $type The type of the token the brackets - * belong to (function or use). - * - * @return void - */ - public function processBracket($phpcsFile, $openBracket, $tokens, $type='function') - { - $errorPrefix = ''; - if ($type === 'use') { - $errorPrefix = 'Use'; - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - // The open bracket should be the last thing on the line. - if ($tokens[$openBracket]['line'] !== $tokens[$closeBracket]['line']) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($openBracket + 1), null, true); - if ($tokens[$next]['line'] !== ($tokens[$openBracket]['line'] + 1)) { - $error = 'The first parameter of a multi-line '.$type.' declaration must be on the line after the opening bracket'; - $fix = $phpcsFile->addFixableError($error, $next, $errorPrefix.'FirstParamSpacing'); - if ($fix === true) { - if ($tokens[$next]['line'] === $tokens[$openBracket]['line']) { - $phpcsFile->fixer->addNewline($openBracket); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($x = $openBracket; $x < $next; $x++) { - if ($tokens[$x]['line'] === $tokens[$openBracket]['line']) { - continue; - } - - if ($tokens[$x]['line'] === $tokens[$next]['line']) { - break; - } - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - }//end if - - // Each line between the brackets should contain a single parameter. - $lastComma = null; - for ($i = ($openBracket + 1); $i < $closeBracket; $i++) { - // Skip brackets, like arrays, as they can contain commas. - if (isset($tokens[$i]['bracket_opener']) === true) { - $i = $tokens[$i]['bracket_closer']; - continue; - } - - if (isset($tokens[$i]['parenthesis_opener']) === true) { - $i = $tokens[$i]['parenthesis_closer']; - continue; - } - - if ($tokens[$i]['code'] !== T_COMMA) { - continue; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$i]['line']) { - $error = 'Multi-line '.$type.' declarations must define one parameter per line'; - $fix = $phpcsFile->addFixableError($error, $next, $errorPrefix.'OneParamPerLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($i); - } - } - }//end for - - }//end processBracket() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php deleted file mode 100644 index 878035e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\PEAR\Sniffs\NamingConventions\ValidFunctionNameSniff as PEARValidFunctionNameSniff; -use PHP_CodeSniffer\Util\Common; - -class ValidFunctionNameSniff extends PEARValidFunctionNameSniff -{ - - - /** - * Processes the tokens outside the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if ($functionName === null) { - return; - } - - $errorData = [$functionName]; - - // Does this function claim to be magical? - if (preg_match('|^__[^_]|', $functionName) !== 0) { - $error = 'Function name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $phpcsFile->addError($error, $stackPtr, 'DoubleUnderscore', $errorData); - - $functionName = ltrim($functionName, '_'); - } - - if (Common::isCamelCaps($functionName, false, true, false) === false) { - $error = 'Function name "%s" is not in camel caps format'; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $errorData); - } - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php deleted file mode 100644 index ed25058..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php +++ /dev/null @@ -1,178 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class ValidVariableNameSniff extends AbstractVariableSniff -{ - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $varName = ltrim($tokens[$stackPtr]['content'], '$'); - - // If it's a php reserved var, then its ok. - if (isset($this->phpReservedVars[$varName]) === true) { - return; - } - - $objOperator = $phpcsFile->findNext([T_WHITESPACE], ($stackPtr + 1), null, true); - if ($tokens[$objOperator]['code'] === T_OBJECT_OPERATOR) { - // Check to see if we are using a variable from an object. - $var = $phpcsFile->findNext([T_WHITESPACE], ($objOperator + 1), null, true); - if ($tokens[$var]['code'] === T_STRING) { - $bracket = $phpcsFile->findNext([T_WHITESPACE], ($var + 1), null, true); - if ($tokens[$bracket]['code'] !== T_OPEN_PARENTHESIS) { - $objVarName = $tokens[$var]['content']; - - // There is no way for us to know if the var is public or - // private, so we have to ignore a leading underscore if there is - // one and just check the main part of the variable name. - $originalVarName = $objVarName; - if (substr($objVarName, 0, 1) === '_') { - $objVarName = substr($objVarName, 1); - } - - if (Common::isCamelCaps($objVarName, false, true, false) === false) { - $error = 'Variable "%s" is not in valid camel caps format'; - $data = [$originalVarName]; - $phpcsFile->addError($error, $var, 'NotCamelCaps', $data); - } - }//end if - }//end if - }//end if - - // There is no way for us to know if the var is public or private, - // so we have to ignore a leading underscore if there is one and just - // check the main part of the variable name. - $originalVarName = $varName; - if (substr($varName, 0, 1) === '_') { - $objOperator = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$objOperator]['code'] === T_DOUBLE_COLON) { - // The variable lives within a class, and is referenced like - // this: MyClass::$_variable, so we don't know its scope. - $inClass = true; - } else { - $inClass = $phpcsFile->hasCondition($stackPtr, Tokens::$ooScopeTokens); - } - - if ($inClass === true) { - $varName = substr($varName, 1); - } - } - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Variable "%s" is not in valid camel caps format'; - $data = [$originalVarName]; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $data); - } - - }//end processVariable() - - - /** - * Processes class member variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $varName = ltrim($tokens[$stackPtr]['content'], '$'); - $memberProps = $phpcsFile->getMemberProperties($stackPtr); - if (empty($memberProps) === true) { - // Couldn't get any info about this variable, which - // generally means it is invalid or possibly has a parse - // error. Any errors will be reported by the core, so - // we can ignore it. - return; - } - - $public = ($memberProps['scope'] !== 'private'); - $errorData = [$varName]; - - if ($public === true) { - if (substr($varName, 0, 1) === '_') { - $error = '%s member variable "%s" must not contain a leading underscore'; - $data = [ - ucfirst($memberProps['scope']), - $errorData[0], - ]; - $phpcsFile->addError($error, $stackPtr, 'PublicHasUnderscore', $data); - } - } else { - if (substr($varName, 0, 1) !== '_') { - $error = 'Private member variable "%s" must contain a leading underscore'; - $phpcsFile->addError($error, $stackPtr, 'PrivateNoUnderscore', $errorData); - } - } - - // Remove a potential underscore prefix for testing CamelCaps. - $varName = ltrim($varName, '_'); - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Member variable "%s" is not in valid camel caps format'; - $phpcsFile->addError($error, $stackPtr, 'MemberNotCamelCaps', $errorData); - } - - }//end processMemberVar() - - - /** - * Processes the variable found within a double quoted string. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the double quoted - * string. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (preg_match_all('|[^\\\]\${?([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)|', $tokens[$stackPtr]['content'], $matches) !== 0) { - foreach ($matches[1] as $varName) { - // If it's a php reserved var, then its ok. - if (isset($this->phpReservedVars[$varName]) === true) { - continue; - } - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Variable "%s" is not in valid camel caps format'; - $data = [$varName]; - $phpcsFile->addError($error, $stackPtr, 'StringNotCamelCaps', $data); - } - } - } - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/DisallowObjectStringIndexSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/DisallowObjectStringIndexSniff.php deleted file mode 100644 index c324e20..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/DisallowObjectStringIndexSniff.php +++ /dev/null @@ -1,85 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Objects; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowObjectStringIndexSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_SQUARE_BRACKET]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check if the next non whitespace token is a string. - $index = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$index]['code'] !== T_CONSTANT_ENCAPSED_STRING) { - return; - } - - // Make sure it is the only thing in the square brackets. - $next = $phpcsFile->findNext(T_WHITESPACE, ($index + 1), null, true); - if ($tokens[$next]['code'] !== T_CLOSE_SQUARE_BRACKET) { - return; - } - - // Allow indexes that have dots in them because we can't write - // them in dot notation. - $content = trim($tokens[$index]['content'], '"\' '); - if (strpos($content, '.') !== false) { - return; - } - - // Also ignore reserved words. - if ($content === 'super') { - return; - } - - // Token before the opening square bracket cannot be a var name. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_STRING) { - $error = 'Object indexes must be written in dot notation'; - $phpcsFile->addError($error, $prev, 'Found'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectInstantiationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectInstantiationSniff.php deleted file mode 100644 index fb714e1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectInstantiationSniff.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Objects; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ObjectInstantiationSniff implements Sniff -{ - - - /** - * Registers the token types that this sniff wishes to listen to. - * - * @return array - */ - public function register() - { - return [T_NEW]; - - }//end register() - - - /** - * Process the tokens that this sniff is listening for. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $allowedTokens = Tokens::$emptyTokens; - $allowedTokens[] = T_BITWISE_AND; - - $prev = $phpcsFile->findPrevious($allowedTokens, ($stackPtr - 1), null, true); - - $allowedTokens = [ - T_EQUAL => true, - T_DOUBLE_ARROW => true, - T_THROW => true, - T_RETURN => true, - T_INLINE_THEN => true, - T_INLINE_ELSE => true, - ]; - - if (isset($allowedTokens[$tokens[$prev]['code']]) === false) { - $error = 'New objects must be assigned to a variable'; - $phpcsFile->addError($error, $stackPtr, 'NotAssigned'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectMemberCommaSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectMemberCommaSniff.php deleted file mode 100644 index 787d3fc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectMemberCommaSniff.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Objects; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ObjectMemberCommaSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Registers the token types that this sniff wishes to listen to. - * - * @return array - */ - public function register() - { - return [T_CLOSE_OBJECT]; - - }//end register() - - - /** - * Process the tokens that this sniff is listening for. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_COMMA) { - $error = 'Last member of object must not be followed by a comma'; - $fix = $phpcsFile->addFixableError($error, $prev, 'Found'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($prev, ''); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php deleted file mode 100644 index 85e9825..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php +++ /dev/null @@ -1,235 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ComparisonOperatorUsageSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * A list of valid comparison operators. - * - * @var array - */ - private static $validOps = [ - T_IS_IDENTICAL => true, - T_IS_NOT_IDENTICAL => true, - T_LESS_THAN => true, - T_GREATER_THAN => true, - T_IS_GREATER_OR_EQUAL => true, - T_IS_SMALLER_OR_EQUAL => true, - T_INSTANCEOF => true, - ]; - - /** - * A list of invalid operators with their alternatives. - * - * @var array - */ - private static $invalidOps = [ - 'PHP' => [ - T_IS_EQUAL => '===', - T_IS_NOT_EQUAL => '!==', - T_BOOLEAN_NOT => '=== FALSE', - ], - 'JS' => [ - T_IS_EQUAL => '===', - T_IS_NOT_EQUAL => '!==', - ], - ]; - - - /** - * Registers the token types that this sniff wishes to listen to. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_ELSEIF, - T_INLINE_THEN, - T_WHILE, - T_FOR, - ]; - - }//end register() - - - /** - * Process the tokens that this sniff is listening for. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where the token - * was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenizer = $phpcsFile->tokenizerType; - - if ($tokens[$stackPtr]['code'] === T_INLINE_THEN) { - $end = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$end]['code'] !== T_CLOSE_PARENTHESIS) { - // This inline IF statement does not have its condition - // bracketed, so we need to guess where it starts. - for ($i = ($end - 1); $i >= 0; $i--) { - if ($tokens[$i]['code'] === T_SEMICOLON) { - // Stop here as we assume it is the end - // of the previous statement. - break; - } else if ($tokens[$i]['code'] === T_OPEN_TAG) { - // Stop here as this is the start of the file. - break; - } else if ($tokens[$i]['code'] === T_CLOSE_CURLY_BRACKET) { - // Stop if this is the closing brace of - // a code block. - if (isset($tokens[$i]['scope_opener']) === true) { - break; - } - } else if ($tokens[$i]['code'] === T_OPEN_CURLY_BRACKET) { - // Stop if this is the opening brace of - // a code block. - if (isset($tokens[$i]['scope_closer']) === true) { - break; - } - } else if ($tokens[$i]['code'] === T_OPEN_PARENTHESIS) { - // Stop if this is the start of a pair of - // parentheses that surrounds the inline - // IF statement. - if (isset($tokens[$i]['parenthesis_closer']) === true - && $tokens[$i]['parenthesis_closer'] >= $stackPtr - ) { - break; - } - }//end if - }//end for - - $start = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - } else { - if (isset($tokens[$end]['parenthesis_opener']) === false) { - return; - } - - $start = $tokens[$end]['parenthesis_opener']; - }//end if - } else if ($tokens[$stackPtr]['code'] === T_FOR) { - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false) { - return; - } - - $openingBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closingBracket = $tokens[$stackPtr]['parenthesis_closer']; - - $start = $phpcsFile->findNext(T_SEMICOLON, $openingBracket, $closingBracket); - $end = $phpcsFile->findNext(T_SEMICOLON, ($start + 1), $closingBracket); - if ($start === false || $end === false) { - return; - } - } else { - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false) { - return; - } - - $start = $tokens[$stackPtr]['parenthesis_opener']; - $end = $tokens[$stackPtr]['parenthesis_closer']; - }//end if - - $requiredOps = 0; - $foundOps = 0; - $foundBooleans = 0; - - $lastNonEmpty = $start; - - for ($i = $start; $i <= $end; $i++) { - $type = $tokens[$i]['code']; - if (isset(self::$invalidOps[$tokenizer][$type]) === true) { - $error = 'Operator %s prohibited; use %s instead'; - $data = [ - $tokens[$i]['content'], - self::$invalidOps[$tokenizer][$type], - ]; - $phpcsFile->addError($error, $i, 'NotAllowed', $data); - $foundOps++; - } else if (isset(self::$validOps[$type]) === true) { - $foundOps++; - } - - if ($type === T_OPEN_PARENTHESIS - && isset($tokens[$i]['parenthesis_closer']) === true - && isset(Tokens::$functionNameTokens[$tokens[$lastNonEmpty]['code']]) === true - ) { - $i = $tokens[$i]['parenthesis_closer']; - $lastNonEmpty = $i; - continue; - } - - if ($tokens[$i]['code'] === T_TRUE || $tokens[$i]['code'] === T_FALSE) { - $foundBooleans++; - } - - if ($phpcsFile->tokenizerType !== 'JS' - && ($tokens[$i]['code'] === T_BOOLEAN_AND - || $tokens[$i]['code'] === T_BOOLEAN_OR) - ) { - $requiredOps++; - - // When the instanceof operator is used with another operator - // like ===, you can get more ops than are required. - if ($foundOps > $requiredOps) { - $foundOps = $requiredOps; - } - - // If we get to here and we have not found the right number of - // comparison operators, then we must have had an implicit - // true operation i.e., if ($a) instead of the required - // if ($a === true), so let's add an error. - if ($requiredOps !== $foundOps) { - $error = 'Implicit true comparisons prohibited; use === TRUE instead'; - $phpcsFile->addError($error, $stackPtr, 'ImplicitTrue'); - $foundOps++; - } - } - - if (isset(Tokens::$emptyTokens[$type]) === false) { - $lastNonEmpty = $i; - } - }//end for - - $requiredOps++; - - if ($phpcsFile->tokenizerType !== 'JS' - && $foundOps < $requiredOps - && ($requiredOps !== $foundBooleans) - ) { - $error = 'Implicit true comparisons prohibited; use === TRUE instead'; - $phpcsFile->addError($error, $stackPtr, 'ImplicitTrue'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php deleted file mode 100644 index c3a8b39..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php +++ /dev/null @@ -1,224 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class IncrementDecrementUsageSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_EQUAL, - T_PLUS_EQUAL, - T_MINUS_EQUAL, - T_INC, - T_DEC, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_INC || $tokens[$stackPtr]['code'] === T_DEC) { - $this->processIncDec($phpcsFile, $stackPtr); - } else { - $this->processAssignment($phpcsFile, $stackPtr); - } - - }//end process() - - - /** - * Checks to ensure increment and decrement operators are not confusing. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - protected function processIncDec($phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Work out where the variable is so we know where to - // start looking for other operators. - if ($tokens[($stackPtr - 1)]['code'] === T_VARIABLE - || ($tokens[($stackPtr - 1)]['code'] === T_STRING - && $tokens[($stackPtr - 2)]['code'] === T_OBJECT_OPERATOR) - ) { - $start = ($stackPtr + 1); - } else { - $start = ($stackPtr + 2); - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, $start, null, true); - if ($next === false) { - return; - } - - if (isset(Tokens::$arithmeticTokens[$tokens[$next]['code']]) === true) { - $error = 'Increment and decrement operators cannot be used in an arithmetic operation'; - $phpcsFile->addError($error, $stackPtr, 'NotAllowed'); - return; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($start - 3), null, true); - if ($prev === false) { - return; - } - - // Check if this is in a string concat. - if ($tokens[$next]['code'] === T_STRING_CONCAT || $tokens[$prev]['code'] === T_STRING_CONCAT) { - $error = 'Increment and decrement operators must be bracketed when used in string concatenation'; - $phpcsFile->addError($error, $stackPtr, 'NoBrackets'); - } - - }//end processIncDec() - - - /** - * Checks to ensure increment and decrement operators are used. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - protected function processAssignment($phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $assignedVar = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - // Not an assignment, return. - if ($tokens[$assignedVar]['code'] !== T_VARIABLE) { - return; - } - - $statementEnd = $phpcsFile->findNext([T_SEMICOLON, T_CLOSE_PARENTHESIS, T_CLOSE_SQUARE_BRACKET, T_CLOSE_CURLY_BRACKET], $stackPtr); - - // If there is anything other than variables, numbers, spaces or operators we need to return. - $noiseTokens = $phpcsFile->findNext([T_LNUMBER, T_VARIABLE, T_WHITESPACE, T_PLUS, T_MINUS, T_OPEN_PARENTHESIS], ($stackPtr + 1), $statementEnd, true); - - if ($noiseTokens !== false) { - return; - } - - // If we are already using += or -=, we need to ignore - // the statement if a variable is being used. - if ($tokens[$stackPtr]['code'] !== T_EQUAL) { - $nextVar = $phpcsFile->findNext(T_VARIABLE, ($stackPtr + 1), $statementEnd); - if ($nextVar !== false) { - return; - } - } - - if ($tokens[$stackPtr]['code'] === T_EQUAL) { - $nextVar = ($stackPtr + 1); - $previousVariable = ($stackPtr + 1); - $variableCount = 0; - while (($nextVar = $phpcsFile->findNext(T_VARIABLE, ($nextVar + 1), $statementEnd)) !== false) { - $previousVariable = $nextVar; - $variableCount++; - } - - if ($variableCount !== 1) { - return; - } - - $nextVar = $previousVariable; - if ($tokens[$nextVar]['content'] !== $tokens[$assignedVar]['content']) { - return; - } - } - - // We have only one variable, and it's the same as what is being assigned, - // so we need to check what is being added or subtracted. - $nextNumber = ($stackPtr + 1); - $previousNumber = ($stackPtr + 1); - $numberCount = 0; - while (($nextNumber = $phpcsFile->findNext([T_LNUMBER], ($nextNumber + 1), $statementEnd, false)) !== false) { - $previousNumber = $nextNumber; - $numberCount++; - } - - if ($numberCount !== 1) { - return; - } - - $nextNumber = $previousNumber; - if ($tokens[$nextNumber]['content'] === '1') { - if ($tokens[$stackPtr]['code'] === T_EQUAL) { - $opToken = $phpcsFile->findNext([T_PLUS, T_MINUS], ($nextVar + 1), $statementEnd); - if ($opToken === false) { - // Operator was before the variable, like: - // $var = 1 + $var; - // So we ignore it. - return; - } - - $operator = $tokens[$opToken]['content']; - } else { - $operator = substr($tokens[$stackPtr]['content'], 0, 1); - } - - // If we are adding or subtracting negative value, the operator - // needs to be reversed. - if ($tokens[$stackPtr]['code'] !== T_EQUAL) { - $negative = $phpcsFile->findPrevious(T_MINUS, ($nextNumber - 1), $stackPtr); - if ($negative !== false) { - if ($operator === '+') { - $operator = '-'; - } else { - $operator = '+'; - } - } - } - - $expected = $operator.$operator.$tokens[$assignedVar]['content']; - $found = $phpcsFile->getTokensAsString($assignedVar, ($statementEnd - $assignedVar + 1)); - - if ($operator === '+') { - $error = 'Increment'; - } else { - $error = 'Decrement'; - } - - $error .= " operators should be used where possible; found \"$found\" but expected \"$expected\""; - $phpcsFile->addError($error, $stackPtr, 'Found'); - }//end if - - }//end processAssignment() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ValidLogicalOperatorsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ValidLogicalOperatorsSniff.php deleted file mode 100644 index f9ea620..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ValidLogicalOperatorsSniff.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ValidLogicalOperatorsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_LOGICAL_AND, - T_LOGICAL_OR, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $replacements = [ - 'and' => '&&', - 'or' => '||', - ]; - - $operator = strtolower($tokens[$stackPtr]['content']); - if (isset($replacements[$operator]) === false) { - return; - } - - $error = 'Logical operator "%s" is prohibited; use "%s" instead'; - $data = [ - $operator, - $replacements[$operator], - ]; - $phpcsFile->addError($error, $stackPtr, 'NotAllowed', $data); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php deleted file mode 100644 index 04d0633..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php +++ /dev/null @@ -1,288 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Exceptions\TokenizerException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class CommentedOutCodeSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'CSS', - ]; - - /** - * If a comment is more than $maxPercentage% code, a warning will be shown. - * - * @var integer - */ - public $maxPercentage = 35; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_COMMENT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore comments at the end of code blocks. - if (substr($tokens[$stackPtr]['content'], 0, 6) === '//end ') { - return; - } - - $content = ''; - $lastLineSeen = $tokens[$stackPtr]['line']; - $commentStyle = 'line'; - if (strpos($tokens[$stackPtr]['content'], '/*') === 0) { - $commentStyle = 'block'; - } - - $lastCommentBlockToken = $stackPtr; - for ($i = $stackPtr; $i < $phpcsFile->numTokens; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === false) { - break; - } - - if ($tokens[$i]['code'] === T_WHITESPACE) { - continue; - } - - if (isset(Tokens::$phpcsCommentTokens[$tokens[$i]['code']]) === true) { - $lastLineSeen = $tokens[$i]['line']; - continue; - } - - if ($commentStyle === 'line' - && ($lastLineSeen + 1) <= $tokens[$i]['line'] - && strpos($tokens[$i]['content'], '/*') === 0 - ) { - // First non-whitespace token on a new line is start of a different style comment. - break; - } - - if ($commentStyle === 'line' - && ($lastLineSeen + 1) < $tokens[$i]['line'] - ) { - // Blank line breaks a '//' style comment block. - break; - } - - /* - Trim as much off the comment as possible so we don't - have additional whitespace tokens or comment tokens - */ - - $tokenContent = trim($tokens[$i]['content']); - $break = false; - - if ($commentStyle === 'line') { - if (substr($tokenContent, 0, 2) === '//') { - $tokenContent = substr($tokenContent, 2); - } - - if (substr($tokenContent, 0, 1) === '#') { - $tokenContent = substr($tokenContent, 1); - } - } else { - if (substr($tokenContent, 0, 3) === '/**') { - $tokenContent = substr($tokenContent, 3); - } - - if (substr($tokenContent, 0, 2) === '/*') { - $tokenContent = substr($tokenContent, 2); - } - - if (substr($tokenContent, -2) === '*/') { - $tokenContent = substr($tokenContent, 0, -2); - $break = true; - } - - if (substr($tokenContent, 0, 1) === '*') { - $tokenContent = substr($tokenContent, 1); - } - }//end if - - $content .= $tokenContent.$phpcsFile->eolChar; - $lastLineSeen = $tokens[$i]['line']; - - $lastCommentBlockToken = $i; - - if ($break === true) { - // Closer of a block comment found. - break; - } - }//end for - - // Ignore typical warning suppression annotations from other tools. - if (preg_match('`^\s*@[A-Za-z()\._-]+\s*$`', $content) === 1) { - return ($lastCommentBlockToken + 1); - } - - // Quite a few comments use multiple dashes, equals signs etc - // to frame comments and licence headers. - $content = preg_replace('/[-=#*]{2,}/', '-', $content); - - // Random numbers sitting inside the content can throw parse errors - // for invalid literals in PHP7+, so strip those. - $content = preg_replace('/\d+/', '', $content); - - $content = trim($content); - - if ($content === '') { - return ($lastCommentBlockToken + 1); - } - - if ($phpcsFile->tokenizerType === 'PHP') { - $content = ''; - } - - // Because we are not really parsing code, the tokenizer can throw all sorts - // of errors that don't mean anything, so ignore them. - $oldErrors = ini_get('error_reporting'); - ini_set('error_reporting', 0); - try { - $tokenizerClass = get_class($phpcsFile->tokenizer); - $tokenizer = new $tokenizerClass($content, $phpcsFile->config, $phpcsFile->eolChar); - $stringTokens = $tokenizer->getTokens(); - } catch (TokenizerException $e) { - // We couldn't check the comment, so ignore it. - ini_set('error_reporting', $oldErrors); - return ($lastCommentBlockToken + 1); - } - - ini_set('error_reporting', $oldErrors); - - $numTokens = count($stringTokens); - - /* - We know what the first two and last two tokens should be - (because we put them there) so ignore this comment if those - tokens were not parsed correctly. It obviously means this is not - valid code. - */ - - // First token is always the opening tag. - if ($stringTokens[0]['code'] !== T_OPEN_TAG) { - return ($lastCommentBlockToken + 1); - } else { - array_shift($stringTokens); - --$numTokens; - } - - // Last token is always the closing tag, unless something went wrong. - if (isset($stringTokens[($numTokens - 1)]) === false - || $stringTokens[($numTokens - 1)]['code'] !== T_CLOSE_TAG - ) { - return ($lastCommentBlockToken + 1); - } else { - array_pop($stringTokens); - --$numTokens; - } - - // Second last token is always whitespace or a comment, depending - // on the code inside the comment. - if ($phpcsFile->tokenizerType === 'PHP') { - if (isset(Tokens::$emptyTokens[$stringTokens[($numTokens - 1)]['code']]) === false) { - return ($lastCommentBlockToken + 1); - } - - if ($stringTokens[($numTokens - 1)]['code'] === T_WHITESPACE) { - array_pop($stringTokens); - --$numTokens; - } - } - - $emptyTokens = [ - T_WHITESPACE => true, - T_STRING => true, - T_STRING_CONCAT => true, - T_ENCAPSED_AND_WHITESPACE => true, - T_NONE => true, - T_COMMENT => true, - ]; - $emptyTokens += Tokens::$phpcsCommentTokens; - - $numComment = 0; - $numPossible = 0; - $numCode = 0; - $numNonWhitespace = 0; - - for ($i = 0; $i < $numTokens; $i++) { - if (isset($emptyTokens[$stringTokens[$i]['code']]) === true) { - // Looks like comment. - $numComment++; - } else if (isset(Tokens::$comparisonTokens[$stringTokens[$i]['code']]) === true - || isset(Tokens::$arithmeticTokens[$stringTokens[$i]['code']]) === true - || $stringTokens[$i]['code'] === T_GOTO_LABEL - ) { - // Commented out HTML/XML and other docs contain a lot of these - // characters, so it is best to not use them directly. - $numPossible++; - } else { - // Looks like code. - $numCode++; - } - - if ($stringTokens[$i]['code'] !== T_WHITESPACE) { - ++$numNonWhitespace; - } - } - - // Ignore comments with only two or less non-whitespace tokens. - // Sample size too small for a reliably determination. - if ($numNonWhitespace <= 2) { - return ($lastCommentBlockToken + 1); - } - - $percentCode = ceil((($numCode / $numTokens) * 100)); - if ($percentCode > $this->maxPercentage) { - // Just in case. - $percentCode = min(100, $percentCode); - - $error = 'This comment is %s%% valid code; is this commented out code?'; - $data = [$percentCode]; - $phpcsFile->addWarning($error, $stackPtr, 'Found', $data); - } - - return ($lastCommentBlockToken + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowBooleanStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowBooleanStatementSniff.php deleted file mode 100644 index 9d8077f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowBooleanStatementSniff.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DisallowBooleanStatementSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$booleanOperators; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - foreach ($tokens[$stackPtr]['nested_parenthesis'] as $open => $close) { - if (isset($tokens[$open]['parenthesis_owner']) === true) { - // Any owner means we are not just a simple statement. - return; - } - } - } - - $error = 'Boolean operators are not allowed outside of control structure conditions'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowComparisonAssignmentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowComparisonAssignmentSniff.php deleted file mode 100644 index aaed48d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowComparisonAssignmentSniff.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DisallowComparisonAssignmentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_EQUAL]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore default value assignments in function definitions. - $function = $phpcsFile->findPrevious(T_FUNCTION, ($stackPtr - 1), null, false, null, true); - if ($function !== false) { - $opener = $tokens[$function]['parenthesis_opener']; - $closer = $tokens[$function]['parenthesis_closer']; - if ($opener < $stackPtr && $closer > $stackPtr) { - return; - } - } - - // Ignore values in array definitions. - $array = $phpcsFile->findNext( - T_ARRAY, - ($stackPtr + 1), - null, - false, - null, - true - ); - - if ($array !== false) { - return; - } - - // Ignore function calls. - $ignore = [ - T_STRING, - T_WHITESPACE, - T_OBJECT_OPERATOR, - ]; - - $next = $phpcsFile->findNext($ignore, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_OPEN_PARENTHESIS - && $tokens[($next - 1)]['code'] === T_STRING - ) { - // Code will look like: $var = myFunction( - // and will be ignored. - return; - } - - $endStatement = $phpcsFile->findEndOfStatement($stackPtr); - for ($i = ($stackPtr + 1); $i < $endStatement; $i++) { - if ((isset(Tokens::$comparisonTokens[$tokens[$i]['code']]) === true - && $tokens[$i]['code'] !== T_COALESCE) - || $tokens[$i]['code'] === T_INLINE_THEN - ) { - $error = 'The value of a comparison must not be assigned to a variable'; - $phpcsFile->addError($error, $stackPtr, 'AssignedComparison'); - break; - } - - if (isset(Tokens::$booleanOperators[$tokens[$i]['code']]) === true - || $tokens[$i]['code'] === T_BOOLEAN_NOT - ) { - $error = 'The value of a boolean operation must not be assigned to a variable'; - $phpcsFile->addError($error, $stackPtr, 'AssignedBool'); - break; - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowInlineIfSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowInlineIfSniff.php deleted file mode 100644 index 60b0c37..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowInlineIfSniff.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowInlineIfSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_INLINE_THEN]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $phpcsFile->addError('Inline IF statements are not allowed', $stackPtr, 'Found'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowMultipleAssignmentsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowMultipleAssignmentsSniff.php deleted file mode 100644 index 84032fe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowMultipleAssignmentsSniff.php +++ /dev/null @@ -1,184 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DisallowMultipleAssignmentsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_EQUAL]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore default value assignments in function definitions. - $function = $phpcsFile->findPrevious([T_FUNCTION, T_CLOSURE], ($stackPtr - 1), null, false, null, true); - if ($function !== false) { - $opener = $tokens[$function]['parenthesis_opener']; - $closer = $tokens[$function]['parenthesis_closer']; - if ($opener < $stackPtr && $closer > $stackPtr) { - return; - } - } - - // Ignore assignments in WHILE loop conditions. - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $nested = $tokens[$stackPtr]['nested_parenthesis']; - foreach ($nested as $opener => $closer) { - if (isset($tokens[$opener]['parenthesis_owner']) === true - && $tokens[$tokens[$opener]['parenthesis_owner']]['code'] === T_WHILE - ) { - return; - } - } - } - - // Ignore member var definitions. - if (empty($tokens[$stackPtr]['conditions']) === false) { - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if (isset(Tokens::$ooScopeTokens[$tokens[$deepestScope]['code']]) === true) { - return; - } - } - - /* - The general rule is: - Find an equal sign and go backwards along the line. If you hit an - end bracket, skip to the opening bracket. When you find a variable, - stop. That variable must be the first non-empty token on the line - or in the statement. If not, throw an error. - */ - - for ($varToken = ($stackPtr - 1); $varToken >= 0; $varToken--) { - // Skip brackets. - if (isset($tokens[$varToken]['parenthesis_opener']) === true && $tokens[$varToken]['parenthesis_opener'] < $varToken) { - $varToken = $tokens[$varToken]['parenthesis_opener']; - continue; - } - - if (isset($tokens[$varToken]['bracket_opener']) === true) { - $varToken = $tokens[$varToken]['bracket_opener']; - continue; - } - - if ($tokens[$varToken]['code'] === T_SEMICOLON) { - // We've reached the next statement, so we - // didn't find a variable. - return; - } - - if ($tokens[$varToken]['code'] === T_VARIABLE) { - // We found our variable. - break; - } - }//end for - - if ($varToken <= 0) { - // Didn't find a variable. - return; - } - - $start = $phpcsFile->findStartOfStatement($varToken); - - $allowed = Tokens::$emptyTokens; - - $allowed[T_STRING] = T_STRING; - $allowed[T_NS_SEPARATOR] = T_NS_SEPARATOR; - $allowed[T_DOUBLE_COLON] = T_DOUBLE_COLON; - $allowed[T_OBJECT_OPERATOR] = T_OBJECT_OPERATOR; - $allowed[T_ASPERAND] = T_ASPERAND; - $allowed[T_DOLLAR] = T_DOLLAR; - $allowed[T_SELF] = T_SELF; - $allowed[T_PARENT] = T_PARENT; - $allowed[T_STATIC] = T_STATIC; - - $varToken = $phpcsFile->findPrevious($allowed, ($varToken - 1), null, true); - - if ($varToken < $start - && $tokens[$varToken]['code'] !== T_OPEN_PARENTHESIS - && $tokens[$varToken]['code'] !== T_OPEN_SQUARE_BRACKET - ) { - $varToken = $start; - } - - // Ignore the first part of FOR loops as we are allowed to - // assign variables there even though the variable is not the - // first thing on the line. - if ($tokens[$varToken]['code'] === T_OPEN_PARENTHESIS && isset($tokens[$varToken]['parenthesis_owner']) === true) { - $owner = $tokens[$varToken]['parenthesis_owner']; - if ($tokens[$owner]['code'] === T_FOR) { - return; - } - } - - if ($tokens[$varToken]['code'] === T_VARIABLE - || $tokens[$varToken]['code'] === T_OPEN_TAG - || $tokens[$varToken]['code'] === T_INLINE_THEN - || $tokens[$varToken]['code'] === T_INLINE_ELSE - || $tokens[$varToken]['code'] === T_SEMICOLON - || $tokens[$varToken]['code'] === T_CLOSE_PARENTHESIS - || isset($allowed[$tokens[$varToken]['code']]) === true - ) { - return; - } - - $error = 'Assignments must be the first block of code on a line'; - $errorCode = 'Found'; - - if (isset($nested) === true) { - $controlStructures = [ - T_IF => T_IF, - T_ELSEIF => T_ELSEIF, - T_SWITCH => T_SWITCH, - T_CASE => T_CASE, - T_FOR => T_FOR, - ]; - foreach ($nested as $opener => $closer) { - if (isset($tokens[$opener]['parenthesis_owner']) === true - && isset($controlStructures[$tokens[$tokens[$opener]['parenthesis_owner']]['code']]) === true - ) { - $errorCode .= 'InControlStructure'; - break; - } - } - } - - $phpcsFile->addError($error, $stackPtr, $errorCode); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowSizeFunctionsInLoopsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowSizeFunctionsInLoopsSniff.php deleted file mode 100644 index cb14366..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowSizeFunctionsInLoopsSniff.php +++ /dev/null @@ -1,114 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowSizeFunctionsInLoopsSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * An array of functions we don't want in the condition of loops. - * - * @var array - */ - protected $forbiddenFunctions = [ - 'PHP' => [ - 'sizeof' => true, - 'strlen' => true, - 'count' => true, - ], - 'JS' => ['length' => true], - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_WHILE, - T_FOR, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenizer = $phpcsFile->tokenizerType; - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - - if ($tokens[$stackPtr]['code'] === T_FOR) { - // We only want to check the condition in FOR loops. - $start = $phpcsFile->findNext(T_SEMICOLON, ($openBracket + 1)); - $end = $phpcsFile->findPrevious(T_SEMICOLON, ($closeBracket - 1)); - } else { - $start = $openBracket; - $end = $closeBracket; - } - - for ($i = ($start + 1); $i < $end; $i++) { - if ($tokens[$i]['code'] === T_STRING - && isset($this->forbiddenFunctions[$tokenizer][$tokens[$i]['content']]) === true - ) { - $functionName = $tokens[$i]['content']; - if ($tokenizer === 'JS') { - // Needs to be in the form object.function to be valid. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($i - 1), null, true); - if ($prev === false || $tokens[$prev]['code'] !== T_OBJECT_OPERATOR) { - continue; - } - - $functionName = 'object.'.$functionName; - } else { - // Make sure it isn't a member var. - if ($tokens[($i - 1)]['code'] === T_OBJECT_OPERATOR) { - continue; - } - - $functionName .= '()'; - } - - $error = 'The use of %s inside a loop condition is not allowed; assign the return value to a variable and use the variable in the loop condition instead'; - $data = [$functionName]; - $phpcsFile->addError($error, $i, 'Found', $data); - }//end if - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DiscouragedFunctionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DiscouragedFunctionsSniff.php deleted file mode 100644 index 9f86a17..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DiscouragedFunctionsSniff.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\ForbiddenFunctionsSniff as GenericForbiddenFunctionsSniff; - -class DiscouragedFunctionsSniff extends GenericForbiddenFunctionsSniff -{ - - /** - * A list of forbidden functions with their alternatives. - * - * The value is NULL if no alternative exists. IE, the - * function should just not be used. - * - * @var array - */ - public $forbiddenFunctions = [ - 'error_log' => null, - 'print_r' => null, - 'var_dump' => null, - ]; - - /** - * If true, an error will be thrown; otherwise a warning. - * - * @var boolean - */ - public $error = false; - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EmbeddedPhpSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EmbeddedPhpSniff.php deleted file mode 100644 index ef11aa6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EmbeddedPhpSniff.php +++ /dev/null @@ -1,402 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EmbeddedPhpSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // If the close php tag is on the same line as the opening - // then we have an inline embedded PHP block. - $closeTag = $phpcsFile->findNext(T_CLOSE_TAG, $stackPtr); - if ($closeTag === false || $tokens[$stackPtr]['line'] !== $tokens[$closeTag]['line']) { - $this->validateMultilineEmbeddedPhp($phpcsFile, $stackPtr); - } else { - $this->validateInlineEmbeddedPhp($phpcsFile, $stackPtr); - } - - }//end process() - - - /** - * Validates embedded PHP that exists on multiple lines. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - private function validateMultilineEmbeddedPhp($phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $prevTag = $phpcsFile->findPrevious(T_OPEN_TAG, ($stackPtr - 1)); - if ($prevTag === false) { - // This is the first open tag. - return; - } - - $firstContent = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - $closingTag = $phpcsFile->findNext(T_CLOSE_TAG, $stackPtr); - if ($closingTag !== false) { - $nextContent = $phpcsFile->findNext(T_WHITESPACE, ($closingTag + 1), $phpcsFile->numTokens, true); - if ($nextContent === false) { - // Final closing tag. It will be handled elsewhere. - return; - } - - // We have an opening and a closing tag, that lie within other content. - if ($firstContent === $closingTag) { - $error = 'Empty embedded PHP tag found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Empty'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = $stackPtr; $i <= $closingTag; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - } - }//end if - - if ($tokens[$firstContent]['line'] === $tokens[$stackPtr]['line']) { - $error = 'Opening PHP tag must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentAfterOpen'); - if ($fix === true) { - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - $padding = (strlen($tokens[$first]['content']) - strlen(ltrim($tokens[$first]['content']))); - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($stackPtr); - $phpcsFile->fixer->addContent($stackPtr, str_repeat(' ', $padding)); - $phpcsFile->fixer->endChangeset(); - } - } else { - // Check the indent of the first line, except if it is a scope closer. - if (isset($tokens[$firstContent]['scope_closer']) === false - || $tokens[$firstContent]['scope_closer'] !== $firstContent - ) { - // Check for a blank line at the top. - if ($tokens[$firstContent]['line'] > ($tokens[$stackPtr]['line'] + 1)) { - // Find a token on the blank line to throw the error on. - $i = $stackPtr; - do { - $i++; - } while ($tokens[$i]['line'] !== ($tokens[$stackPtr]['line'] + 1)); - - $error = 'Blank line found at start of embedded PHP content'; - $fix = $phpcsFile->addFixableError($error, $i, 'SpacingBefore'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($stackPtr + 1); $i < $firstContent; $i++) { - if ($tokens[$i]['line'] === $tokens[$firstContent]['line'] - || $tokens[$i]['line'] === $tokens[$stackPtr]['line'] - ) { - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr); - if ($first === false) { - $first = $phpcsFile->findFirstOnLine(T_INLINE_HTML, $stackPtr); - $indent = (strlen($tokens[$first]['content']) - strlen(ltrim($tokens[$first]['content']))); - } else { - $indent = ($tokens[($first + 1)]['column'] - 1); - } - - $contentColumn = ($tokens[$firstContent]['column'] - 1); - if ($contentColumn !== $indent) { - $error = 'First line of embedded PHP code must be indented %s spaces; %s found'; - $data = [ - $indent, - $contentColumn, - ]; - $fix = $phpcsFile->addFixableError($error, $firstContent, 'Indent', $data); - if ($fix === true) { - $padding = str_repeat(' ', $indent); - if ($contentColumn === 0) { - $phpcsFile->fixer->addContentBefore($firstContent, $padding); - } else { - $phpcsFile->fixer->replaceToken(($firstContent - 1), $padding); - } - } - } - }//end if - }//end if - - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$lastContent]['line'] === $tokens[$stackPtr]['line'] - && trim($tokens[$lastContent]['content']) !== '' - ) { - $error = 'Opening PHP tag must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentBeforeOpen'); - if ($fix === true) { - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr); - if ($first === false) { - $first = $phpcsFile->findFirstOnLine(T_INLINE_HTML, $stackPtr); - $padding = (strlen($tokens[$first]['content']) - strlen(ltrim($tokens[$first]['content']))); - } else { - $padding = ($tokens[($first + 1)]['column'] - 1); - } - - $phpcsFile->fixer->addContentBefore($stackPtr, $phpcsFile->eolChar.str_repeat(' ', $padding)); - } - } else { - // Find the first token on the first non-empty line we find. - for ($first = ($stackPtr - 1); $first > 0; $first--) { - if ($tokens[$first]['line'] === $tokens[$stackPtr]['line']) { - continue; - } else if (trim($tokens[$first]['content']) !== '') { - $first = $phpcsFile->findFirstOnLine([], $first, true); - break; - } - } - - $expected = 0; - if ($tokens[$first]['code'] === T_INLINE_HTML - && trim($tokens[$first]['content']) !== '' - ) { - $expected = (strlen($tokens[$first]['content']) - strlen(ltrim($tokens[$first]['content']))); - } else if ($tokens[$first]['code'] === T_WHITESPACE) { - $expected = ($tokens[($first + 1)]['column'] - 1); - } - - $expected += 4; - $found = ($tokens[$stackPtr]['column'] - 1); - if ($found > $expected) { - $error = 'Opening PHP tag indent incorrect; expected no more than %s spaces but found %s'; - $data = [ - $expected, - $found, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'OpenTagIndent', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), str_repeat(' ', $expected)); - } - } - }//end if - - if ($closingTag === false) { - return; - } - - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closingTag - 1), ($stackPtr + 1), true); - $nextContent = $phpcsFile->findNext(T_WHITESPACE, ($closingTag + 1), null, true); - - if ($tokens[$lastContent]['line'] === $tokens[$closingTag]['line']) { - $error = 'Closing PHP tag must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $closingTag, 'ContentBeforeEnd'); - if ($fix === true) { - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $closingTag, true); - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContentBefore($closingTag, str_repeat(' ', ($tokens[$first]['column'] - 1))); - $phpcsFile->fixer->addNewlineBefore($closingTag); - $phpcsFile->fixer->endChangeset(); - } - } else if ($tokens[$nextContent]['line'] === $tokens[$closingTag]['line']) { - $error = 'Closing PHP tag must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $closingTag, 'ContentAfterEnd'); - if ($fix === true) { - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $closingTag, true); - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($closingTag); - $phpcsFile->fixer->addContent($closingTag, str_repeat(' ', ($tokens[$first]['column'] - 1))); - $phpcsFile->fixer->endChangeset(); - } - }//end if - - $next = $phpcsFile->findNext(T_OPEN_TAG, ($closingTag + 1)); - if ($next === false) { - return; - } - - // Check for a blank line at the bottom. - if ((isset($tokens[$lastContent]['scope_closer']) === false - || $tokens[$lastContent]['scope_closer'] !== $lastContent) - && $tokens[$lastContent]['line'] < ($tokens[$closingTag]['line'] - 1) - ) { - // Find a token on the blank line to throw the error on. - $i = $closingTag; - do { - $i--; - } while ($tokens[$i]['line'] !== ($tokens[$closingTag]['line'] - 1)); - - $error = 'Blank line found at end of embedded PHP content'; - $fix = $phpcsFile->addFixableError($error, $i, 'SpacingAfter'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($lastContent + 1); $i < $closingTag; $i++) { - if ($tokens[$i]['line'] === $tokens[$lastContent]['line'] - || $tokens[$i]['line'] === $tokens[$closingTag]['line'] - ) { - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - }//end validateMultilineEmbeddedPhp() - - - /** - * Validates embedded PHP that exists on one line. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - private function validateInlineEmbeddedPhp($phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // We only want one line PHP sections, so return if the closing tag is - // on the next line. - $closeTag = $phpcsFile->findNext(T_CLOSE_TAG, $stackPtr, null, false); - if ($tokens[$stackPtr]['line'] !== $tokens[$closeTag]['line']) { - return; - } - - // Check that there is one, and only one space at the start of the statement. - $firstContent = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), $closeTag, true); - - if ($firstContent === false) { - $error = 'Empty embedded PHP tag found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Empty'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = $stackPtr; $i <= $closeTag; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - } - - // The open tag token always contains a single space after it. - $leadingSpace = 1; - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $leadingSpace = ($tokens[($stackPtr + 1)]['length'] + 1); - } - - if ($leadingSpace !== 1) { - $error = 'Expected 1 space after opening PHP tag; %s found'; - $data = [$leadingSpace]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterOpen', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($closeTag - 1), $stackPtr, true); - if ($prev !== $stackPtr) { - if ((isset($tokens[$prev]['scope_opener']) === false - || $tokens[$prev]['scope_opener'] !== $prev) - && (isset($tokens[$prev]['scope_closer']) === false - || $tokens[$prev]['scope_closer'] !== $prev) - && $tokens[$prev]['code'] !== T_SEMICOLON - ) { - $error = 'Inline PHP statement must end with a semicolon'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSemicolon'); - if ($fix === true) { - $phpcsFile->fixer->addContent($prev, ';'); - } - } else if ($tokens[$prev]['code'] === T_SEMICOLON) { - $statementCount = 1; - for ($i = ($stackPtr + 1); $i < $prev; $i++) { - if ($tokens[$i]['code'] === T_SEMICOLON) { - $statementCount++; - } - } - - if ($statementCount > 1) { - $error = 'Inline PHP statement must contain a single statement; %s found'; - $data = [$statementCount]; - $phpcsFile->addError($error, $stackPtr, 'MultipleStatements', $data); - } - } - }//end if - - $trailingSpace = 0; - if ($tokens[($closeTag - 1)]['code'] === T_WHITESPACE) { - $trailingSpace = $tokens[($closeTag - 1)]['length']; - } else if (($tokens[($closeTag - 1)]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[($closeTag - 1)]['code']]) === true) - && substr($tokens[($closeTag - 1)]['content'], -1) === ' ' - ) { - $trailingSpace = (strlen($tokens[($closeTag - 1)]['content']) - strlen(rtrim($tokens[($closeTag - 1)]['content']))); - } - - if ($trailingSpace !== 1) { - $error = 'Expected 1 space before closing PHP tag; %s found'; - $data = [$trailingSpace]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeClose', $data); - if ($fix === true) { - if ($trailingSpace === 0) { - $phpcsFile->fixer->addContentBefore($closeTag, ' '); - } else if ($tokens[($closeTag - 1)]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[($closeTag - 1)]['code']]) === true - ) { - $phpcsFile->fixer->replaceToken(($closeTag - 1), rtrim($tokens[($closeTag - 1)]['content']).' '); - } else { - $phpcsFile->fixer->replaceToken(($closeTag - 1), ' '); - } - } - } - - }//end validateInlineEmbeddedPhp() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EvalSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EvalSniff.php deleted file mode 100644 index 3162c14..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EvalSniff.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class EvalSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_EVAL]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $error = 'Use of eval() is discouraged'; - $phpcsFile->addWarning($error, $stackPtr, 'Discouraged'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/GlobalKeywordSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/GlobalKeywordSniff.php deleted file mode 100644 index 024eff8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/GlobalKeywordSniff.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class GlobalKeywordSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_GLOBAL]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextVar = $tokens[$phpcsFile->findNext([T_VARIABLE], $stackPtr)]; - $varName = str_replace('$', '', $nextVar['content']); - $error = 'Use of the "global" keyword is forbidden; use "$GLOBALS[\'%s\']" instead'; - $data = [$varName]; - $phpcsFile->addError($error, $stackPtr, 'NotAllowed', $data); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/HeredocSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/HeredocSniff.php deleted file mode 100644 index 67369cb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/HeredocSniff.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class HeredocSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_START_HEREDOC, - T_START_NOWDOC, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $error = 'Use of heredoc and nowdoc syntax ("<<<") is not allowed; use standard strings or inline HTML instead'; - $phpcsFile->addError($error, $stackPtr, 'NotAllowed'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php deleted file mode 100644 index 4e3ee21..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class InnerFunctionsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $function = $phpcsFile->getCondition($stackPtr, T_FUNCTION); - if ($function === false) { - // Not a nested function. - return; - } - - $class = $phpcsFile->getCondition($stackPtr, T_ANON_CLASS, false); - if ($class !== false && $class > $function) { - // Ignore methods in anon classes. - return; - } - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_EQUAL) { - // Ignore closures. - return; - } - - $error = 'The use of inner functions is forbidden'; - $phpcsFile->addError($error, $stackPtr, 'NotAllowed'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php deleted file mode 100644 index 486edcc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php +++ /dev/null @@ -1,160 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class LowercasePHPFunctionsSniff implements Sniff -{ - - /** - * String -> int hash map of all php built in function names - * - * @var array - */ - private $builtInFunctions; - - - /** - * Construct the LowercasePHPFunctionSniff - */ - public function __construct() - { - - $allFunctions = get_defined_functions(); - $this->builtInFunctions = array_flip($allFunctions['internal']); - - }//end __construct() - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_STRING]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $contentLc = strtolower($content); - if ($content === $contentLc) { - return; - } - - // Make sure it is an inbuilt PHP function. - // PHP_CodeSniffer can possibly include user defined functions - // through the use of vendor/autoload.php. - if (isset($this->builtInFunctions[$contentLc]) === false) { - return; - } - - // Make sure this is a function call or a use statement. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next === false) { - // Not a function call. - return; - } - - $ignore = Tokens::$emptyTokens; - $ignore[] = T_BITWISE_AND; - $prev = $phpcsFile->findPrevious($ignore, ($stackPtr - 1), null, true); - $prevPrev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - - if ($tokens[$next]['code'] !== T_OPEN_PARENTHESIS) { - // Is this a use statement importing a PHP native function ? - if ($tokens[$next]['code'] !== T_NS_SEPARATOR - && $tokens[$prev]['code'] === T_STRING - && $tokens[$prev]['content'] === 'function' - && $prevPrev !== false - && $tokens[$prevPrev]['code'] === T_USE - ) { - $error = 'Use statements for PHP native functions must be lowercase; expected "%s" but found "%s"'; - $data = [ - $contentLc, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'UseStatementUppercase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLc); - } - } - - // No open parenthesis; not a "use function" statement nor a function call. - return; - }//end if - - if ($tokens[$prev]['code'] === T_FUNCTION) { - // Function declaration, not a function call. - return; - } - - if ($tokens[$prev]['code'] === T_NS_SEPARATOR) { - if ($prevPrev !== false - && ($tokens[$prevPrev]['code'] === T_STRING - || $tokens[$prevPrev]['code'] === T_NAMESPACE - || $tokens[$prevPrev]['code'] === T_NEW) - ) { - // Namespaced class/function, not an inbuilt function. - // Could potentially give false negatives for non-namespaced files - // when namespace\functionName() is encountered. - return; - } - } - - if ($tokens[$prev]['code'] === T_NEW) { - // Object creation, not an inbuilt function. - return; - } - - if ($tokens[$prev]['code'] === T_OBJECT_OPERATOR) { - // Not an inbuilt function. - return; - } - - if ($tokens[$prev]['code'] === T_DOUBLE_COLON) { - // Not an inbuilt function. - return; - } - - $error = 'Calls to PHP native functions must be lowercase; expected "%s" but found "%s"'; - $data = [ - $contentLc, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'CallUppercase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLc); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php deleted file mode 100644 index fa3da74..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php +++ /dev/null @@ -1,273 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class NonExecutableCodeSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_BREAK, - T_CONTINUE, - T_RETURN, - T_THROW, - T_EXIT, - T_GOTO, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // If this token is preceded with an "or", it only relates to one line - // and should be ignored. For example: fopen() or die(). - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_LOGICAL_OR || $tokens[$prev]['code'] === T_BOOLEAN_OR) { - return; - } - - // Check if this token is actually part of a one-line IF or ELSE statement. - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if ($tokens[$i]['code'] === T_CLOSE_PARENTHESIS) { - $i = $tokens[$i]['parenthesis_opener']; - continue; - } else if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - break; - } - - if ($tokens[$i]['code'] === T_IF - || $tokens[$i]['code'] === T_ELSE - || $tokens[$i]['code'] === T_ELSEIF - ) { - return; - } - - if ($tokens[$stackPtr]['code'] === T_RETURN) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_SEMICOLON) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($next + 1), null, true); - if ($tokens[$next]['code'] === T_CLOSE_CURLY_BRACKET) { - // If this is the closing brace of a function - // then this return statement doesn't return anything - // and is not required anyway. - $owner = $tokens[$next]['scope_condition']; - if ($tokens[$owner]['code'] === T_FUNCTION) { - $warning = 'Empty return statement not required here'; - $phpcsFile->addWarning($warning, $stackPtr, 'ReturnNotRequired'); - return; - } - } - } - } - - if (isset($tokens[$stackPtr]['scope_opener']) === true) { - $owner = $tokens[$stackPtr]['scope_condition']; - if ($tokens[$owner]['code'] === T_CASE || $tokens[$owner]['code'] === T_DEFAULT) { - // This token closes the scope of a CASE or DEFAULT statement - // so any code between this statement and the next CASE, DEFAULT or - // end of SWITCH token will not be executable. - $end = $phpcsFile->findEndOfStatement($stackPtr); - $next = $phpcsFile->findNext( - [ - T_CASE, - T_DEFAULT, - T_CLOSE_CURLY_BRACKET, - T_ENDSWITCH, - ], - ($end + 1) - ); - - if ($next !== false) { - $lastLine = $tokens[$end]['line']; - for ($i = ($stackPtr + 1); $i < $next; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - $line = $tokens[$i]['line']; - if ($line > $lastLine) { - $type = substr($tokens[$stackPtr]['type'], 2); - $warning = 'Code after the %s statement on line %s cannot be executed'; - $data = [ - $type, - $tokens[$stackPtr]['line'], - ]; - $phpcsFile->addWarning($warning, $i, 'Unreachable', $data); - $lastLine = $line; - } - } - }//end if - - // That's all we have to check for these types of statements. - return; - }//end if - }//end if - - // This token may be part of an inline condition. - // If we find a closing parenthesis that belongs to a condition - // we should ignore this token. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if (isset($tokens[$prev]['parenthesis_owner']) === true) { - $owner = $tokens[$prev]['parenthesis_owner']; - $ignore = [ - T_IF => true, - T_ELSE => true, - T_ELSEIF => true, - ]; - if (isset($ignore[$tokens[$owner]['code']]) === true) { - return; - } - } - - $ourConditions = array_keys($tokens[$stackPtr]['conditions']); - - if (empty($ourConditions) === false) { - $condition = array_pop($ourConditions); - - if (isset($tokens[$condition]['scope_closer']) === false) { - return; - } - - // Special case for BREAK statements sitting directly inside SWITCH - // statements. If we get to this point, we know the BREAK is not being - // used to close a CASE statement, so it is most likely non-executable - // code itself (as is the case when you put return; break; at the end of - // a case). So we need to ignore this token. - if ($tokens[$condition]['code'] === T_SWITCH - && $tokens[$stackPtr]['code'] === T_BREAK - ) { - return; - } - - $closer = $tokens[$condition]['scope_closer']; - - // If the closer for our condition is shared with other openers, - // we will need to throw errors from this token to the next - // shared opener (if there is one), not to the scope closer. - $nextOpener = null; - for ($i = ($stackPtr + 1); $i < $closer; $i++) { - if (isset($tokens[$i]['scope_closer']) === true) { - if ($tokens[$i]['scope_closer'] === $closer) { - // We found an opener that shares the same - // closing token as us. - $nextOpener = $i; - break; - } - } - }//end for - - if ($nextOpener === null) { - $end = $closer; - } else { - $end = ($nextOpener - 1); - } - } else { - // This token is in the global scope. - if ($tokens[$stackPtr]['code'] === T_BREAK) { - return; - } - - // Throw an error for all lines until the end of the file. - $end = ($phpcsFile->numTokens - 1); - }//end if - - // Find the semicolon that ends this statement, skipping - // nested statements like FOR loops and closures. - for ($start = ($stackPtr + 1); $start < $phpcsFile->numTokens; $start++) { - if ($start === $end) { - break; - } - - if ($tokens[$start]['code'] === T_OPEN_PARENTHESIS) { - $start = $tokens[$start]['parenthesis_closer']; - continue; - } - - if ($tokens[$start]['code'] === T_OPEN_CURLY_BRACKET) { - $start = $tokens[$start]['bracket_closer']; - continue; - } - - if ($tokens[$start]['code'] === T_SEMICOLON) { - break; - } - }//end for - - if (isset($tokens[$start]) === false) { - return; - } - - $lastLine = $tokens[$start]['line']; - for ($i = ($start + 1); $i < $end; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true - || isset(Tokens::$bracketTokens[$tokens[$i]['code']]) === true - || $tokens[$i]['code'] === T_SEMICOLON - ) { - continue; - } - - // Skip whole functions and classes/interfaces because they are not - // technically executed code, but rather declarations that may be used. - if (isset(Tokens::$ooScopeTokens[$tokens[$i]['code']]) === true - || $tokens[$i]['code'] === T_FUNCTION - || $tokens[$i]['code'] === T_CLOSURE - ) { - if (isset($tokens[$i]['scope_closer']) === false) { - // Parse error/Live coding. - return; - } - - $i = $tokens[$i]['scope_closer']; - continue; - } - - $line = $tokens[$i]['line']; - if ($line > $lastLine) { - $type = substr($tokens[$stackPtr]['type'], 2); - $warning = 'Code after the %s statement on line %s cannot be executed'; - $data = [ - $type, - $tokens[$stackPtr]['line'], - ]; - $phpcsFile->addWarning($warning, $i, 'Unreachable', $data); - $lastLine = $line; - } - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MemberVarScopeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MemberVarScopeSniff.php deleted file mode 100644 index 5239b64..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MemberVarScopeSniff.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Scope; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; - -class MemberVarScopeSniff extends AbstractVariableSniff -{ - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $properties = $phpcsFile->getMemberProperties($stackPtr); - - if ($properties === [] || $properties['scope_specified'] !== false) { - return; - } - - $error = 'Scope modifier not specified for member variable "%s"'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addError($error, $stackPtr, 'Missing', $data); - - }//end processMemberVar() - - - /** - * Processes normal variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariable() - - - /** - * Processes variables in double quoted strings. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MethodScopeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MethodScopeSniff.php deleted file mode 100644 index 8c60208..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MethodScopeSniff.php +++ /dev/null @@ -1,92 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Scope; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Tokens; - -class MethodScopeSniff extends AbstractScopeSniff -{ - - - /** - * Constructs a Squiz_Sniffs_Scope_MethodScopeSniff. - */ - public function __construct() - { - parent::__construct(Tokens::$ooScopeTokens, [T_FUNCTION]); - - }//end __construct() - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * @param int $currScope The current scope opener token. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Ignore closures. - return; - } - - $modifier = null; - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if ($tokens[$i]['line'] < $tokens[$stackPtr]['line']) { - break; - } else if (isset(Tokens::$scopeModifiers[$tokens[$i]['code']]) === true) { - $modifier = $i; - break; - } - } - - if ($modifier === null) { - $error = 'Visibility must be declared on method "%s"'; - $data = [$methodName]; - $phpcsFile->addError($error, $stackPtr, 'Missing', $data); - } - - }//end processTokenWithinScope() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/StaticThisUsageSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/StaticThisUsageSniff.php deleted file mode 100644 index 032d880..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/StaticThisUsageSniff.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Scope; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Tokens; - -class StaticThisUsageSniff extends AbstractScopeSniff -{ - - - /** - * Constructs the test with the tokens it wishes to listen for. - */ - public function __construct() - { - parent::__construct([T_CLASS, T_TRAIT, T_ANON_CLASS], [T_FUNCTION]); - - }//end __construct() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param int $currScope A pointer to the start of the scope. - * - * @return void - */ - public function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - // Ignore abstract functions. - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next === false || $tokens[$next]['code'] !== T_STRING) { - // Not a function declaration, or incomplete. - return; - } - - $methodProps = $phpcsFile->getMethodProperties($stackPtr); - if ($methodProps['is_static'] === false) { - return; - } - - $next = $stackPtr; - $end = $tokens[$stackPtr]['scope_closer']; - - do { - $next = $phpcsFile->findNext([T_VARIABLE, T_CLOSURE, T_ANON_CLASS], ($next + 1), $end); - if ($next === false) { - continue; - } else if ($tokens[$next]['code'] === T_CLOSURE - || $tokens[$next]['code'] === T_ANON_CLASS - ) { - $next = $tokens[$next]['scope_closer']; - continue; - } else if (strtolower($tokens[$next]['content']) !== '$this') { - continue; - } - - $error = 'Usage of "$this" in static methods will cause runtime errors'; - $phpcsFile->addError($error, $next, 'Found'); - } while ($next !== false); - - }//end processTokenWithinScope() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/ConcatenationSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/ConcatenationSpacingSniff.php deleted file mode 100644 index 4125b63..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/ConcatenationSpacingSniff.php +++ /dev/null @@ -1,160 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Strings; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ConcatenationSpacingSniff implements Sniff -{ - - /** - * The number of spaces before and after a string concat. - * - * @var integer - */ - public $spacing = 0; - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_STRING_CONCAT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $ignoreBefore = false; - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_END_HEREDOC || $tokens[$prev]['code'] === T_END_NOWDOC) { - // Spacing before must be preserved due to the here/nowdoc closing tag. - $ignoreBefore = true; - } - - $this->spacing = (int) $this->spacing; - - if ($ignoreBefore === false) { - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $before = 0; - } else { - if ($tokens[($stackPtr - 2)]['line'] !== $tokens[$stackPtr]['line']) { - $before = 'newline'; - } else { - $before = $tokens[($stackPtr - 1)]['length']; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing before string concat', $before); - } - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $after = 0; - } else { - if ($tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line']) { - $after = 'newline'; - } else { - $after = $tokens[($stackPtr + 1)]['length']; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing after string concat', $after); - - if (($ignoreBefore === true - || $before === $this->spacing - || ($before === 'newline' - && $this->ignoreNewlines === true)) - && ($after === $this->spacing - || ($after === 'newline' - && $this->ignoreNewlines === true)) - ) { - return; - } - - if ($this->spacing === 0) { - $message = 'Concat operator must not be surrounded by spaces'; - $data = []; - } else { - if ($this->spacing > 1) { - $message = 'Concat operator must be surrounded by %s spaces'; - } else { - $message = 'Concat operator must be surrounded by a single space'; - } - - $data = [$this->spacing]; - } - - $fix = $phpcsFile->addFixableError($message, $stackPtr, 'PaddingFound', $data); - - if ($fix === true) { - $padding = str_repeat(' ', $this->spacing); - if ($ignoreBefore === false && ($before !== 'newline' || $this->ignoreNewlines === false)) { - if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($stackPtr - 1), $padding); - if ($this->spacing === 0 - && ($tokens[($stackPtr - 2)]['code'] === T_LNUMBER - || $tokens[($stackPtr - 2)]['code'] === T_DNUMBER) - ) { - $phpcsFile->fixer->replaceToken(($stackPtr - 2), '('.$tokens[($stackPtr - 2)]['content'].')'); - } - - $phpcsFile->fixer->endChangeset(); - } else if ($this->spacing > 0) { - $phpcsFile->fixer->addContent(($stackPtr - 1), $padding); - } - } - - if ($after !== 'newline' || $this->ignoreNewlines === false) { - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($stackPtr + 1), $padding); - if ($this->spacing === 0 - && ($tokens[($stackPtr + 2)]['code'] === T_LNUMBER - || $tokens[($stackPtr + 2)]['code'] === T_DNUMBER) - ) { - $phpcsFile->fixer->replaceToken(($stackPtr + 2), '('.$tokens[($stackPtr + 2)]['content'].')'); - } - - $phpcsFile->fixer->endChangeset(); - } else if ($this->spacing > 0) { - $phpcsFile->fixer->addContent($stackPtr, $padding); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/DoubleQuoteUsageSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/DoubleQuoteUsageSniff.php deleted file mode 100644 index 1ff99b9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/DoubleQuoteUsageSniff.php +++ /dev/null @@ -1,144 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Strings; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DoubleQuoteUsageSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CONSTANT_ENCAPSED_STRING, - T_DOUBLE_QUOTED_STRING, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // If tabs are being converted to spaces by the tokeniser, the - // original content should be used instead of the converted content. - if (isset($tokens[$stackPtr]['orig_content']) === true) { - $workingString = $tokens[$stackPtr]['orig_content']; - } else { - $workingString = $tokens[$stackPtr]['content']; - } - - $lastStringToken = $stackPtr; - - $i = ($stackPtr + 1); - if (isset($tokens[$i]) === true) { - while ($i < $phpcsFile->numTokens - && $tokens[$i]['code'] === $tokens[$stackPtr]['code'] - ) { - if (isset($tokens[$i]['orig_content']) === true) { - $workingString .= $tokens[$i]['orig_content']; - } else { - $workingString .= $tokens[$i]['content']; - } - - $lastStringToken = $i; - $i++; - } - } - - $skipTo = ($lastStringToken + 1); - - // Check if it's a double quoted string. - if ($workingString[0] !== '"' || substr($workingString, -1) !== '"') { - return $skipTo; - } - - // The use of variables in double quoted strings is not allowed. - if ($tokens[$stackPtr]['code'] === T_DOUBLE_QUOTED_STRING) { - $stringTokens = token_get_all('addError($error, $stackPtr, 'ContainsVar', $data); - } - } - - return $skipTo; - }//end if - - $allowedChars = [ - '\0', - '\1', - '\2', - '\3', - '\4', - '\5', - '\6', - '\7', - '\n', - '\r', - '\f', - '\t', - '\v', - '\x', - '\b', - '\e', - '\u', - '\'', - ]; - - foreach ($allowedChars as $testChar) { - if (strpos($workingString, $testChar) !== false) { - return $skipTo; - } - } - - $error = 'String %s does not require double quotes; use single quotes instead'; - $data = [str_replace(["\r", "\n"], ['\r', '\n'], $workingString)]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotRequired', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $innerContent = substr($workingString, 1, -1); - $innerContent = str_replace('\"', '"', $innerContent); - $innerContent = str_replace('\\$', '$', $innerContent); - $phpcsFile->fixer->replaceToken($stackPtr, "'$innerContent'"); - while ($lastStringToken !== $stackPtr) { - $phpcsFile->fixer->replaceToken($lastStringToken, ''); - $lastStringToken--; - } - - $phpcsFile->fixer->endChangeset(); - } - - return $skipTo; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/EchoedStringsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/EchoedStringsSniff.php deleted file mode 100644 index 512d878..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/EchoedStringsSniff.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Strings; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EchoedStringsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_ECHO]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $firstContent = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - // If the first non-whitespace token is not an opening parenthesis, then we are not concerned. - if ($tokens[$firstContent]['code'] !== T_OPEN_PARENTHESIS) { - $phpcsFile->recordMetric($stackPtr, 'Brackets around echoed strings', 'no'); - return; - } - - $end = $phpcsFile->findNext([T_SEMICOLON, T_CLOSE_TAG], $stackPtr, null, false); - - // If the token before the semi-colon is not a closing parenthesis, then we are not concerned. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($end - 1), null, true); - if ($tokens[$prev]['code'] !== T_CLOSE_PARENTHESIS) { - $phpcsFile->recordMetric($stackPtr, 'Brackets around echoed strings', 'no'); - return; - } - - // If the parenthesis don't match, then we are not concerned. - if ($tokens[$firstContent]['parenthesis_closer'] !== $prev) { - $phpcsFile->recordMetric($stackPtr, 'Brackets around echoed strings', 'no'); - return; - } - - $phpcsFile->recordMetric($stackPtr, 'Brackets around echoed strings', 'yes'); - - if (($phpcsFile->findNext(Tokens::$operators, $stackPtr, $end, false)) === false) { - // There are no arithmetic operators in this. - $error = 'Echoed strings should not be bracketed'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'HasBracket'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($firstContent, ''); - if ($tokens[($firstContent - 1)]['code'] !== T_WHITESPACE) { - $phpcsFile->fixer->addContent(($firstContent - 1), ' '); - } - - $phpcsFile->fixer->replaceToken($prev, ''); - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/CastSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/CastSpacingSniff.php deleted file mode 100644 index 95f95ed..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/CastSpacingSniff.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class CastSpacingSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$castTokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $expected = str_replace(' ', '', $content); - $expected = str_replace("\t", '', $expected); - - if ($content !== $expected) { - $error = 'Cast statements must not contain whitespace; expected "%s" but found "%s"'; - $data = [ - $expected, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContainsWhiteSpace', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $expected); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php deleted file mode 100644 index cfeb657..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php +++ /dev/null @@ -1,347 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ControlStructureSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_WHILE, - T_FOREACH, - T_FOR, - T_SWITCH, - T_DO, - T_ELSE, - T_ELSEIF, - T_TRY, - T_CATCH, - T_FINALLY, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === true - && isset($tokens[$stackPtr]['parenthesis_closer']) === true - ) { - $parenOpener = $tokens[$stackPtr]['parenthesis_opener']; - $parenCloser = $tokens[$stackPtr]['parenthesis_closer']; - if ($tokens[($parenOpener + 1)]['code'] === T_WHITESPACE) { - $gap = $tokens[($parenOpener + 1)]['length']; - - if ($gap === 0) { - $phpcsFile->recordMetric($stackPtr, 'Spaces after control structure open parenthesis', 'newline'); - $gap = 'newline'; - } else { - $phpcsFile->recordMetric($stackPtr, 'Spaces after control structure open parenthesis', $gap); - } - - $error = 'Expected 0 spaces after opening bracket; %s found'; - $data = [$gap]; - $fix = $phpcsFile->addFixableError($error, ($parenOpener + 1), 'SpacingAfterOpenBrace', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($parenOpener + 1), ''); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Spaces after control structure open parenthesis', 0); - } - - if ($tokens[$parenOpener]['line'] === $tokens[$parenCloser]['line'] - && $tokens[($parenCloser - 1)]['code'] === T_WHITESPACE - ) { - $gap = $tokens[($parenCloser - 1)]['length']; - $error = 'Expected 0 spaces before closing bracket; %s found'; - $data = [$gap]; - $fix = $phpcsFile->addFixableError($error, ($parenCloser - 1), 'SpaceBeforeCloseBrace', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($parenCloser - 1), ''); - } - - if ($gap === 0) { - $phpcsFile->recordMetric($stackPtr, 'Spaces before control structure close parenthesis', 'newline'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Spaces before control structure close parenthesis', $gap); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Spaces before control structure close parenthesis', 0); - } - }//end if - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $scopeOpener = $tokens[$stackPtr]['scope_opener']; - $scopeCloser = $tokens[$stackPtr]['scope_closer']; - - for ($firstContent = ($scopeOpener + 1); $firstContent < $phpcsFile->numTokens; $firstContent++) { - $code = $tokens[$firstContent]['code']; - - if ($code === T_WHITESPACE - || ($code === T_INLINE_HTML - && trim($tokens[$firstContent]['content']) === '') - ) { - continue; - } - - // Skip all empty tokens on the same line as the opener. - if ($tokens[$firstContent]['line'] === $tokens[$scopeOpener]['line'] - && (isset(Tokens::$emptyTokens[$code]) === true - || $code === T_CLOSE_TAG) - ) { - continue; - } - - break; - } - - // We ignore spacing for some structures that tend to have their own rules. - $ignore = [ - T_FUNCTION => true, - T_CLASS => true, - T_INTERFACE => true, - T_TRAIT => true, - T_DOC_COMMENT_OPEN_TAG => true, - ]; - - if (isset($ignore[$tokens[$firstContent]['code']]) === false - && $tokens[$firstContent]['line'] >= ($tokens[$scopeOpener]['line'] + 2) - ) { - $gap = ($tokens[$firstContent]['line'] - $tokens[$scopeOpener]['line'] - 1); - $phpcsFile->recordMetric($stackPtr, 'Blank lines at start of control structure', $gap); - - $error = 'Blank line found at start of control structure'; - $fix = $phpcsFile->addFixableError($error, $scopeOpener, 'SpacingAfterOpen'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $i = ($scopeOpener + 1); - while ($tokens[$i]['line'] !== $tokens[$firstContent]['line']) { - // Start removing content from the line after the opener. - if ($tokens[$i]['line'] !== $tokens[$scopeOpener]['line']) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $i++; - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Blank lines at start of control structure', 0); - }//end if - - if ($firstContent !== $scopeCloser) { - $lastContent = $phpcsFile->findPrevious( - T_WHITESPACE, - ($scopeCloser - 1), - null, - true - ); - - $lastNonEmptyContent = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($scopeCloser - 1), - null, - true - ); - - $checkToken = $lastContent; - if (isset($tokens[$lastNonEmptyContent]['scope_condition']) === true) { - $checkToken = $tokens[$lastNonEmptyContent]['scope_condition']; - } - - if (isset($ignore[$tokens[$checkToken]['code']]) === false - && $tokens[$lastContent]['line'] <= ($tokens[$scopeCloser]['line'] - 2) - ) { - $errorToken = $scopeCloser; - for ($i = ($scopeCloser - 1); $i > $lastContent; $i--) { - if ($tokens[$i]['line'] < $tokens[$scopeCloser]['line']) { - $errorToken = $i; - break; - } - } - - $gap = ($tokens[$scopeCloser]['line'] - $tokens[$lastContent]['line'] - 1); - $phpcsFile->recordMetric($stackPtr, 'Blank lines at end of control structure', $gap); - - $error = 'Blank line found at end of control structure'; - $fix = $phpcsFile->addFixableError($error, $errorToken, 'SpacingBeforeClose'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($scopeCloser - 1); $i > $lastContent; $i--) { - if ($tokens[$i]['line'] === $tokens[$scopeCloser]['line']) { - continue; - } - - if ($tokens[$i]['line'] === $tokens[$lastContent]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Blank lines at end of control structure', 0); - }//end if - }//end if - - $trailingContent = $phpcsFile->findNext( - T_WHITESPACE, - ($scopeCloser + 1), - null, - true - ); - - if ($tokens[$trailingContent]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$trailingContent]['code']]) === true - ) { - // Special exception for code where the comment about - // an ELSE or ELSEIF is written between the control structures. - $nextCode = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($scopeCloser + 1), - null, - true - ); - - if ($tokens[$nextCode]['code'] === T_ELSE - || $tokens[$nextCode]['code'] === T_ELSEIF - || $tokens[$trailingContent]['line'] === $tokens[$scopeCloser]['line'] - ) { - $trailingContent = $nextCode; - } - }//end if - - if ($tokens[$trailingContent]['code'] === T_ELSE) { - if ($tokens[$stackPtr]['code'] === T_IF) { - // IF with ELSE. - return; - } - } - - if ($tokens[$trailingContent]['code'] === T_WHILE - && $tokens[$stackPtr]['code'] === T_DO - ) { - // DO with WHILE. - return; - } - - if ($tokens[$trailingContent]['code'] === T_CLOSE_TAG) { - // At the end of the script or embedded code. - return; - } - - if (isset($tokens[$trailingContent]['scope_condition']) === true - && $tokens[$trailingContent]['scope_condition'] !== $trailingContent - && isset($tokens[$trailingContent]['scope_opener']) === true - && $tokens[$trailingContent]['scope_opener'] !== $trailingContent - ) { - // Another control structure's closing brace. - $owner = $tokens[$trailingContent]['scope_condition']; - if ($tokens[$owner]['code'] === T_FUNCTION) { - // The next content is the closing brace of a function - // so normal function rules apply and we can ignore it. - return; - } - - if ($tokens[$owner]['code'] === T_CLOSURE - && ($phpcsFile->hasCondition($stackPtr, [T_FUNCTION, T_CLOSURE]) === true - || isset($tokens[$stackPtr]['nested_parenthesis']) === true) - ) { - return; - } - - if ($tokens[$trailingContent]['line'] !== ($tokens[$scopeCloser]['line'] + 1)) { - $error = 'Blank line found after control structure'; - $fix = $phpcsFile->addFixableError($error, $scopeCloser, 'LineAfterClose'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $i = ($scopeCloser + 1); - while ($tokens[$i]['line'] !== $tokens[$trailingContent]['line']) { - $phpcsFile->fixer->replaceToken($i, ''); - $i++; - } - - $phpcsFile->fixer->addNewline($scopeCloser); - $phpcsFile->fixer->endChangeset(); - } - } - } else if ($tokens[$trailingContent]['code'] !== T_ELSE - && $tokens[$trailingContent]['code'] !== T_ELSEIF - && $tokens[$trailingContent]['code'] !== T_CATCH - && $tokens[$trailingContent]['code'] !== T_FINALLY - && $tokens[$trailingContent]['line'] === ($tokens[$scopeCloser]['line'] + 1) - ) { - $error = 'No blank line found after control structure'; - $fix = $phpcsFile->addFixableError($error, $scopeCloser, 'NoLineAfterClose'); - if ($fix === true) { - $trailingContent = $phpcsFile->findNext( - T_WHITESPACE, - ($scopeCloser + 1), - null, - true - ); - - if (($tokens[$trailingContent]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$trailingContent]['code']]) === true) - && $tokens[$trailingContent]['line'] === $tokens[$scopeCloser]['line'] - ) { - $phpcsFile->fixer->addNewline($trailingContent); - } else { - $phpcsFile->fixer->addNewline($scopeCloser); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php deleted file mode 100644 index 6887199..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php +++ /dev/null @@ -1,164 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FunctionClosingBraceSpaceSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - // Probably an interface method. - return; - } - - $closeBrace = $tokens[$stackPtr]['scope_closer']; - $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBrace - 1), null, true); - - // Special case for empty JS functions. - if ($phpcsFile->tokenizerType === 'JS' && $prevContent === $tokens[$stackPtr]['scope_opener']) { - // In this case, the opening and closing brace must be - // right next to each other. - if ($tokens[$stackPtr]['scope_closer'] !== ($tokens[$stackPtr]['scope_opener'] + 1)) { - $error = 'The opening and closing braces of empty functions must be directly next to each other; e.g., function () {}'; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpacingBetween'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($tokens[$stackPtr]['scope_opener'] + 1); $i < $closeBrace; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - return; - } - - $nestedFunction = false; - if ($phpcsFile->hasCondition($stackPtr, [T_FUNCTION, T_CLOSURE]) === true - || isset($tokens[$stackPtr]['nested_parenthesis']) === true - ) { - $nestedFunction = true; - } - - $braceLine = $tokens[$closeBrace]['line']; - $prevLine = $tokens[$prevContent]['line']; - $found = ($braceLine - $prevLine - 1); - - if ($nestedFunction === true) { - if ($found < 0) { - $error = 'Closing brace of nested function must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'ContentBeforeClose'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($closeBrace); - } - } else if ($found > 0) { - $error = 'Expected 0 blank lines before closing brace of nested function; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpacingBeforeNestedClose', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $changeMade = false; - for ($i = ($prevContent + 1); $i < $closeBrace; $i++) { - // Try and maintain indentation. - if ($tokens[$i]['line'] === ($braceLine - 1)) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - $changeMade = true; - } - - // Special case for when the last content contains the newline - // token as well, like with a comment. - if ($changeMade === false) { - $phpcsFile->fixer->replaceToken(($prevContent + 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - } else { - if ($found !== 1) { - if ($found < 0) { - $found = 0; - } - - $error = 'Expected 1 blank line before closing function brace; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpacingBeforeClose', $data); - - if ($fix === true) { - if ($found > 1) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prevContent + 1); $i < ($closeBrace - 1); $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken($i, $phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } else { - // Try and maintain indentation. - if ($tokens[($closeBrace - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->addNewlineBefore($closeBrace - 1); - } else { - $phpcsFile->fixer->addNewlineBefore($closeBrace); - } - } - } - }//end if - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php deleted file mode 100644 index 09c5a48..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FunctionOpeningBraceSpaceSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - // Probably an interface or abstract method. - return; - } - - $openBrace = $tokens[$stackPtr]['scope_opener']; - $nextContent = $phpcsFile->findNext(T_WHITESPACE, ($openBrace + 1), null, true); - - if ($nextContent === $tokens[$stackPtr]['scope_closer']) { - // The next bit of content is the closing brace, so this - // is an empty function and should have a blank line - // between the opening and closing braces. - return; - } - - $braceLine = $tokens[$openBrace]['line']; - $nextLine = $tokens[$nextContent]['line']; - - $found = ($nextLine - $braceLine - 1); - if ($found > 0) { - $error = 'Expected 0 blank lines after opening function brace; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $openBrace, 'SpacingAfter', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($openBrace + 1); $i < $nextContent; $i++) { - if ($tokens[$i]['line'] === $nextLine) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewline($openBrace); - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionSpacingSniff.php deleted file mode 100644 index 83a62d3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionSpacingSniff.php +++ /dev/null @@ -1,353 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionSpacingSniff implements Sniff -{ - - /** - * The number of blank lines between functions. - * - * @var integer - */ - public $spacing = 2; - - /** - * The number of blank lines before the first function in a class. - * - * @var integer - */ - public $spacingBeforeFirst = 2; - - /** - * The number of blank lines after the last function in a class. - * - * @var integer - */ - public $spacingAfterLast = 2; - - /** - * Original properties as set in a custom ruleset (if any). - * - * @var array|null - */ - private $rulesetProperties = null; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this sniff when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $previousNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($previousNonEmpty !== false - && $tokens[$previousNonEmpty]['code'] === T_OPEN_TAG - && $tokens[$previousNonEmpty]['line'] !== 1 - ) { - // Ignore functions at the start of an embedded PHP block. - return; - } - - // If the ruleset has only overridden the spacing property, use - // that value for all spacing rules. - if ($this->rulesetProperties === null) { - $this->rulesetProperties = []; - if (isset($phpcsFile->ruleset->ruleset['Squiz.WhiteSpace.FunctionSpacing']) === true - && isset($phpcsFile->ruleset->ruleset['Squiz.WhiteSpace.FunctionSpacing']['properties']) === true - ) { - $this->rulesetProperties = $phpcsFile->ruleset->ruleset['Squiz.WhiteSpace.FunctionSpacing']['properties']; - if (isset($this->rulesetProperties['spacing']) === true) { - if (isset($this->rulesetProperties['spacingBeforeFirst']) === false) { - $this->spacingBeforeFirst = $this->spacing; - } - - if (isset($this->rulesetProperties['spacingAfterLast']) === false) { - $this->spacingAfterLast = $this->spacing; - } - } - } - } - - $this->spacing = (int) $this->spacing; - $this->spacingBeforeFirst = (int) $this->spacingBeforeFirst; - $this->spacingAfterLast = (int) $this->spacingAfterLast; - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - // Must be an interface method, so the closer is the semicolon. - $closer = $phpcsFile->findNext(T_SEMICOLON, $stackPtr); - } else { - $closer = $tokens[$stackPtr]['scope_closer']; - } - - $isFirst = false; - $isLast = false; - - $ignore = ([T_WHITESPACE => T_WHITESPACE] + Tokens::$methodPrefixes); - - $prev = $phpcsFile->findPrevious($ignore, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - // Skip past function docblocks. - $prev = $phpcsFile->findPrevious($ignore, ($tokens[$prev]['comment_opener'] - 1), null, true); - } - - if ($tokens[$prev]['code'] === T_OPEN_CURLY_BRACKET) { - $isFirst = true; - } - - $next = $phpcsFile->findNext($ignore, ($closer + 1), null, true); - if (isset(Tokens::$emptyTokens[$tokens[$next]['code']]) === true - && $tokens[$next]['line'] === $tokens[$closer]['line'] - ) { - // Skip past "end" comments. - $next = $phpcsFile->findNext($ignore, ($next + 1), null, true); - } - - if ($tokens[$next]['code'] === T_CLOSE_CURLY_BRACKET) { - $isLast = true; - } - - /* - Check the number of blank lines - after the function. - */ - - // Allow for comments on the same line as the closer. - for ($nextLineToken = ($closer + 1); $nextLineToken < $phpcsFile->numTokens; $nextLineToken++) { - if ($tokens[$nextLineToken]['line'] !== $tokens[$closer]['line']) { - break; - } - } - - $requiredSpacing = $this->spacing; - $errorCode = 'After'; - if ($isLast === true) { - $requiredSpacing = $this->spacingAfterLast; - $errorCode = 'AfterLast'; - } - - $foundLines = 0; - if ($nextLineToken === ($phpcsFile->numTokens - 1)) { - // We are at the end of the file. - // Don't check spacing after the function because this - // should be done by an EOF sniff. - $foundLines = $requiredSpacing; - } else { - $nextContent = $phpcsFile->findNext(T_WHITESPACE, $nextLineToken, null, true); - if ($nextContent === false) { - // We are at the end of the file. - // Don't check spacing after the function because this - // should be done by an EOF sniff. - $foundLines = $requiredSpacing; - } else { - $foundLines = ($tokens[$nextContent]['line'] - $tokens[$nextLineToken]['line']); - } - } - - if ($isLast === true) { - $phpcsFile->recordMetric($stackPtr, 'Function spacing after last', $foundLines); - } else { - $phpcsFile->recordMetric($stackPtr, 'Function spacing after', $foundLines); - } - - if ($foundLines !== $requiredSpacing) { - $error = 'Expected %s blank line'; - if ($requiredSpacing !== 1) { - $error .= 's'; - } - - $error .= ' after function; %s found'; - $data = [ - $requiredSpacing, - $foundLines, - ]; - - $fix = $phpcsFile->addFixableError($error, $closer, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = $nextLineToken; $i <= $nextContent; $i++) { - if ($tokens[$i]['line'] === $tokens[$nextContent]['line']) { - $phpcsFile->fixer->addContentBefore($i, str_repeat($phpcsFile->eolChar, $requiredSpacing)); - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - - /* - Check the number of blank lines - before the function. - */ - - $prevLineToken = null; - for ($i = $stackPtr; $i >= 0; $i--) { - if ($tokens[$i]['line'] === $tokens[$stackPtr]['line']) { - continue; - } - - $prevLineToken = $i; - break; - } - - if ($prevLineToken === null) { - // Never found the previous line, which means - // there are 0 blank lines before the function. - $foundLines = 0; - $prevContent = 0; - $prevLineToken = 0; - } else { - $currentLine = $tokens[$stackPtr]['line']; - - $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, $prevLineToken, null, true); - - if ($tokens[$prevContent]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$prevContent]['code']]) === true - ) { - // Ignore comments as they can have different spacing rules, and this - // isn't a proper function comment anyway. - return; - } - - if ($tokens[$prevContent]['code'] === T_DOC_COMMENT_CLOSE_TAG - && $tokens[$prevContent]['line'] === ($currentLine - 1) - ) { - // Account for function comments. - $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, ($tokens[$prevContent]['comment_opener'] - 1), null, true); - } - - $prevLineToken = $prevContent; - - // Before we throw an error, check that we are not throwing an error - // for another function. We don't want to error for no blank lines after - // the previous function and no blank lines before this one as well. - $prevLine = ($tokens[$prevContent]['line'] - 1); - $i = ($stackPtr - 1); - $foundLines = 0; - - $stopAt = 0; - if (isset($tokens[$stackPtr]['conditions']) === true) { - $conditions = $tokens[$stackPtr]['conditions']; - $conditions = array_keys($conditions); - $stopAt = array_pop($conditions); - } - - while ($currentLine !== $prevLine && $currentLine > 1 && $i > $stopAt) { - if ($tokens[$i]['code'] === T_FUNCTION) { - // Found another interface or abstract function. - return; - } - - if ($tokens[$i]['code'] === T_CLOSE_CURLY_BRACKET - && $tokens[$tokens[$i]['scope_condition']]['code'] === T_FUNCTION - ) { - // Found a previous function. - return; - } - - $currentLine = $tokens[$i]['line']; - if ($currentLine === $prevLine) { - break; - } - - if ($tokens[($i - 1)]['line'] < $currentLine && $tokens[($i + 1)]['line'] > $currentLine) { - // This token is on a line by itself. If it is whitespace, the line is empty. - if ($tokens[$i]['code'] === T_WHITESPACE) { - $foundLines++; - } - } - - $i--; - }//end while - }//end if - - $requiredSpacing = $this->spacing; - $errorCode = 'Before'; - if ($isFirst === true) { - $requiredSpacing = $this->spacingBeforeFirst; - $errorCode = 'BeforeFirst'; - - $phpcsFile->recordMetric($stackPtr, 'Function spacing before first', $foundLines); - } else { - $phpcsFile->recordMetric($stackPtr, 'Function spacing before', $foundLines); - } - - if ($foundLines !== $requiredSpacing) { - $error = 'Expected %s blank line'; - if ($requiredSpacing !== 1) { - $error .= 's'; - } - - $error .= ' before function; %s found'; - $data = [ - $requiredSpacing, - $foundLines, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); - if ($fix === true) { - $nextSpace = $phpcsFile->findNext(T_WHITESPACE, ($prevContent + 1), $stackPtr); - if ($nextSpace === false) { - $nextSpace = ($stackPtr - 1); - } - - if ($foundLines < $requiredSpacing) { - $padding = str_repeat($phpcsFile->eolChar, ($requiredSpacing - $foundLines)); - $phpcsFile->fixer->addContent($prevLineToken, $padding); - } else { - $nextContent = $phpcsFile->findNext(T_WHITESPACE, ($nextSpace + 1), null, true); - $phpcsFile->fixer->beginChangeset(); - for ($i = $nextSpace; $i < $nextContent; $i++) { - if ($tokens[$i]['line'] === $tokens[$prevContent]['line']) { - continue; - } - - if ($tokens[$i]['line'] === $tokens[$nextContent]['line']) { - $phpcsFile->fixer->addContentBefore($i, str_repeat($phpcsFile->eolChar, $requiredSpacing)); - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php deleted file mode 100644 index c1492bf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php +++ /dev/null @@ -1,89 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util; - -class LanguageConstructSpacingSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_ECHO, - T_PRINT, - T_RETURN, - T_INCLUDE, - T_INCLUDE_ONCE, - T_REQUIRE, - T_REQUIRE_ONCE, - T_NEW, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[($stackPtr + 1)]) === false) { - // Skip if there is no next token. - return; - } - - if ($tokens[($stackPtr + 1)]['code'] === T_SEMICOLON) { - // No content for this language construct. - return; - } - - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $content = $tokens[($stackPtr + 1)]['content']; - if ($content !== ' ') { - $error = 'Language constructs must be followed by a single space; expected 1 space but found "%s"'; - $data = [Util\Common::prepareForOutput($content)]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'IncorrectSingle', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } else if ($tokens[($stackPtr + 1)]['code'] !== T_OPEN_PARENTHESIS) { - $error = 'Language constructs must be followed by a single space; expected "%s" but found "%s"'; - $data = [ - $tokens[$stackPtr]['content'].' '.$tokens[($stackPtr + 1)]['content'], - $tokens[$stackPtr]['content'].$tokens[($stackPtr + 1)]['content'], - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Incorrect', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LogicalOperatorSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LogicalOperatorSpacingSniff.php deleted file mode 100644 index a89a02a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LogicalOperatorSpacingSniff.php +++ /dev/null @@ -1,102 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class LogicalOperatorSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$booleanOperators; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check there is one space before the operator. - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space before logical operator; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBefore'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - } else { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$stackPtr]['line'] === $tokens[$prev]['line'] - && $tokens[($stackPtr - 1)]['length'] !== 1 - ) { - $found = $tokens[($stackPtr - 1)]['length']; - $error = 'Expected 1 space before logical operator; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'TooMuchSpaceBefore', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - } - } - } - - // Check there is one space after the operator. - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space after logical operator; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfter'); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - } else { - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$stackPtr]['line'] === $tokens[$next]['line'] - && $tokens[($stackPtr + 1)]['length'] !== 1 - ) { - $found = $tokens[($stackPtr + 1)]['length']; - $error = 'Expected 1 space after logical operator; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'TooMuchSpaceAfter', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php deleted file mode 100644 index f0c84fb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php +++ /dev/null @@ -1,219 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; -use PHP_CodeSniffer\Util\Tokens; - -class MemberVarSpacingSniff extends AbstractVariableSniff -{ - - /** - * The number of blank lines between member vars. - * - * @var integer - */ - public $spacing = 1; - - /** - * The number of blank lines before the first member var. - * - * @var integer - */ - public $spacingBeforeFirst = 1; - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $validPrefixes = Tokens::$methodPrefixes; - $validPrefixes[] = T_VAR; - - $startOfStatement = $phpcsFile->findPrevious($validPrefixes, ($stackPtr - 1), null, false, null, true); - if ($startOfStatement === false) { - return; - } - - $endOfStatement = $phpcsFile->findNext(T_SEMICOLON, ($stackPtr + 1), null, false, null, true); - - $ignore = $validPrefixes; - $ignore[] = T_WHITESPACE; - - $start = $startOfStatement; - $prev = $phpcsFile->findPrevious($ignore, ($startOfStatement - 1), null, true); - if (isset(Tokens::$commentTokens[$tokens[$prev]['code']]) === true) { - // Assume the comment belongs to the member var if it is on a line by itself. - $prevContent = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - if ($tokens[$prevContent]['line'] !== $tokens[$prev]['line']) { - // Check the spacing, but then skip it. - $foundLines = ($tokens[$startOfStatement]['line'] - $tokens[$prev]['line'] - 1); - if ($foundLines > 0) { - $error = 'Expected 0 blank lines after member var comment; %s found'; - $data = [$foundLines]; - $fix = $phpcsFile->addFixableError($error, $prev, 'AfterComment', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - // Inline comments have the newline included in the content but - // docblock do not. - if ($tokens[$prev]['code'] === T_COMMENT) { - $phpcsFile->fixer->replaceToken($prev, rtrim($tokens[$prev]['content'])); - } - - for ($i = ($prev + 1); $i <= $startOfStatement; $i++) { - if ($tokens[$i]['line'] === $tokens[$startOfStatement]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewline($prev); - $phpcsFile->fixer->endChangeset(); - } - }//end if - - $start = $prev; - }//end if - }//end if - - // There needs to be n blank lines before the var, not counting comments. - if ($start === $startOfStatement) { - // No comment found. - $first = $phpcsFile->findFirstOnLine(Tokens::$emptyTokens, $start, true); - if ($first === false) { - $first = $start; - } - } else if ($tokens[$start]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - $first = $tokens[$start]['comment_opener']; - } else { - $first = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($start - 1), null, true); - $first = $phpcsFile->findNext(Tokens::$commentTokens, ($first + 1)); - } - - // Determine if this is the first member var. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($first - 1), null, true); - if ($tokens[$prev]['code'] === T_CLOSE_CURLY_BRACKET - && isset($tokens[$prev]['scope_condition']) === true - && $tokens[$tokens[$prev]['scope_condition']]['code'] === T_FUNCTION - ) { - return; - } - - if ($tokens[$prev]['code'] === T_OPEN_CURLY_BRACKET - && isset(Tokens::$ooScopeTokens[$tokens[$tokens[$prev]['scope_condition']]['code']]) === true - ) { - $errorMsg = 'Expected %s blank line(s) before first member var; %s found'; - $errorCode = 'FirstIncorrect'; - $spacing = (int) $this->spacingBeforeFirst; - } else { - $errorMsg = 'Expected %s blank line(s) before member var; %s found'; - $errorCode = 'Incorrect'; - $spacing = (int) $this->spacing; - } - - $foundLines = ($tokens[$first]['line'] - $tokens[$prev]['line'] - 1); - - if ($errorCode === 'FirstIncorrect') { - $phpcsFile->recordMetric($stackPtr, 'Member var spacing before first', $foundLines); - } else { - $phpcsFile->recordMetric($stackPtr, 'Member var spacing before', $foundLines); - } - - if ($foundLines === $spacing) { - if ($endOfStatement !== false) { - return $endOfStatement; - } - - return; - } - - $data = [ - $spacing, - $foundLines, - ]; - - $fix = $phpcsFile->addFixableError($errorMsg, $startOfStatement, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $first; $i++) { - if ($tokens[$i]['line'] === $tokens[$prev]['line']) { - continue; - } - - if ($tokens[$i]['line'] === $tokens[$first]['line']) { - for ($x = 1; $x <= $spacing; $x++) { - $phpcsFile->fixer->addNewlineBefore($i); - } - - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - - if ($endOfStatement !== false) { - return $endOfStatement; - } - - return; - - }//end processMemberVar() - - - /** - * Processes normal variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariable() - - - /** - * Processes variables in double quoted strings. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php deleted file mode 100644 index a1e83aa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php +++ /dev/null @@ -1,166 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ObjectOperatorSpacingSniff implements Sniff -{ - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OBJECT_OPERATOR, - T_DOUBLE_COLON, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $before = 0; - } else { - if ($tokens[($stackPtr - 2)]['line'] !== $tokens[$stackPtr]['line']) { - $before = 'newline'; - } else { - $before = $tokens[($stackPtr - 1)]['length']; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing before object operator', $before); - $this->checkSpacingBeforeOperator($phpcsFile, $stackPtr, $before); - - if (isset($tokens[($stackPtr + 1)]) === false - || isset($tokens[($stackPtr + 2)]) === false - ) { - return; - } - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $after = 0; - } else { - if ($tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line']) { - $after = 'newline'; - } else { - $after = $tokens[($stackPtr + 1)]['length']; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing after object operator', $after); - $this->checkSpacingAfterOperator($phpcsFile, $stackPtr, $after); - - }//end process() - - - /** - * Check the spacing before the operator. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param mixed $before The number of spaces found before the - * operator or the string 'newline'. - * - * @return boolean true if there was no error, false otherwise. - */ - protected function checkSpacingBeforeOperator(File $phpcsFile, $stackPtr, $before) - { - if ($before !== 0 - && ($before !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Space found before object operator'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Before'); - if ($fix === true) { - $tokens = $phpcsFile->getTokens(); - $curPos = ($stackPtr - 1); - - $phpcsFile->fixer->beginChangeset(); - while ($tokens[$curPos]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($curPos, ''); - --$curPos; - } - - $phpcsFile->fixer->endChangeset(); - } - - return false; - } - - return true; - - }//end checkSpacingBeforeOperator() - - - /** - * Check the spacing after the operator. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param mixed $after The number of spaces found after the - * operator or the string 'newline'. - * - * @return boolean true if there was no error, false otherwise. - */ - protected function checkSpacingAfterOperator(File $phpcsFile, $stackPtr, $after) - { - if ($after !== 0 - && ($after !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Space found after object operator'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'After'); - if ($fix === true) { - $tokens = $phpcsFile->getTokens(); - $curPos = ($stackPtr + 1); - - $phpcsFile->fixer->beginChangeset(); - while ($tokens[$curPos]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($curPos, ''); - ++$curPos; - } - - $phpcsFile->fixer->endChangeset(); - } - - return false; - } - - return true; - - }//end checkSpacingAfterOperator() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php deleted file mode 100644 index c69b0b6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php +++ /dev/null @@ -1,386 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class OperatorSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - /** - * Don't check spacing for assignment operators. - * - * This allows multiple assignment statements to be aligned. - * - * @var boolean - */ - public $ignoreSpacingBeforeAssignments = true; - - /** - * A list of tokens that aren't considered as operands. - * - * @var string[] - */ - private $nonOperandTokens = []; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - /* - First we setup an array of all the tokens that can come before - a T_MINUS or T_PLUS token to indicate that the token is not being - used as an operator. - */ - - // Trying to operate on a negative value; eg. ($var * -1). - $this->nonOperandTokens = Tokens::$operators; - - // Trying to compare a negative value; eg. ($var === -1). - $this->nonOperandTokens += Tokens::$comparisonTokens; - - // Trying to compare a negative value; eg. ($var || -1 === $b). - $this->nonOperandTokens += Tokens::$booleanOperators; - - // Trying to assign a negative value; eg. ($var = -1). - $this->nonOperandTokens += Tokens::$assignmentTokens; - - // Returning/printing a negative value; eg. (return -1). - $this->nonOperandTokens += [ - T_RETURN => T_RETURN, - T_ECHO => T_ECHO, - T_PRINT => T_PRINT, - T_YIELD => T_YIELD, - ]; - - // Trying to use a negative value; eg. myFunction($var, -2). - $this->nonOperandTokens += [ - T_COMMA => T_COMMA, - T_OPEN_PARENTHESIS => T_OPEN_PARENTHESIS, - T_OPEN_SQUARE_BRACKET => T_OPEN_SQUARE_BRACKET, - T_OPEN_SHORT_ARRAY => T_OPEN_SHORT_ARRAY, - T_DOUBLE_ARROW => T_DOUBLE_ARROW, - T_COLON => T_COLON, - T_INLINE_THEN => T_INLINE_THEN, - T_INLINE_ELSE => T_INLINE_ELSE, - T_CASE => T_CASE, - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - ]; - - // Casting a negative value; eg. (array) -$a. - $this->nonOperandTokens += [ - T_ARRAY_CAST => T_ARRAY_CAST, - T_BOOL_CAST => T_BOOL_CAST, - T_DOUBLE_CAST => T_DOUBLE_CAST, - T_INT_CAST => T_INT_CAST, - T_OBJECT_CAST => T_OBJECT_CAST, - T_STRING_CAST => T_STRING_CAST, - T_UNSET_CAST => T_UNSET_CAST, - ]; - - /* - These are the tokens the sniff is looking for. - */ - - $targets = Tokens::$comparisonTokens; - $targets += Tokens::$operators; - $targets += Tokens::$assignmentTokens; - $targets[] = T_INLINE_THEN; - $targets[] = T_INLINE_ELSE; - $targets[] = T_INSTANCEOF; - - return $targets; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($this->isOperator($phpcsFile, $stackPtr) === false) { - return; - } - - if ($tokens[$stackPtr]['code'] === T_BITWISE_AND) { - // Check there is one space before the & operator. - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space before "&" operator; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBeforeAmp'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - - $phpcsFile->recordMetric($stackPtr, 'Space before operator', 0); - } else { - if ($tokens[($stackPtr - 2)]['line'] !== $tokens[$stackPtr]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($stackPtr - 1)]['length']; - } - - $phpcsFile->recordMetric($stackPtr, 'Space before operator', $found); - if ($found !== 1 - && ($found !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Expected 1 space before "&" operator; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeAmp', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - } - } - }//end if - - $hasNext = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($hasNext === false) { - // Live coding/parse error at end of file. - return; - } - - // Check there is one space after the & operator. - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space after "&" operator; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfterAmp'); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - - $phpcsFile->recordMetric($stackPtr, 'Space after operator', 0); - } else { - if ($tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($stackPtr + 1)]['length']; - } - - $phpcsFile->recordMetric($stackPtr, 'Space after operator', $found); - if ($found !== 1 - && ($found !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Expected 1 space after "&" operator; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterAmp', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - }//end if - - return; - }//end if - - $operator = $tokens[$stackPtr]['content']; - - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE - && (($tokens[($stackPtr - 1)]['code'] === T_INLINE_THEN - && $tokens[($stackPtr)]['code'] === T_INLINE_ELSE) === false) - ) { - $error = "Expected 1 space before \"$operator\"; 0 found"; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBefore'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - - $phpcsFile->recordMetric($stackPtr, 'Space before operator', 0); - } else if (isset(Tokens::$assignmentTokens[$tokens[$stackPtr]['code']]) === false - || $this->ignoreSpacingBeforeAssignments === false - ) { - // Throw an error for assignments only if enabled using the sniff property - // because other standards allow multiple spaces to align assignments. - if ($tokens[($stackPtr - 2)]['line'] !== $tokens[$stackPtr]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($stackPtr - 1)]['length']; - } - - $phpcsFile->recordMetric($stackPtr, 'Space before operator', $found); - if ($found !== 1 - && ($found !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Expected 1 space before "%s"; %s found'; - $data = [ - $operator, - $found, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBefore', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if ($found === 'newline') { - $i = ($stackPtr - 2); - while ($tokens[$i]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($i, ''); - $i--; - } - } - - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - $hasNext = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($hasNext === false) { - // Live coding/parse error at end of file. - return; - } - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - // Skip short ternary such as: "$foo = $bar ?: true;". - if (($tokens[$stackPtr]['code'] === T_INLINE_THEN - && $tokens[($stackPtr + 1)]['code'] === T_INLINE_ELSE) - ) { - return; - } - - $error = "Expected 1 space after \"$operator\"; 0 found"; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfter'); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - - $phpcsFile->recordMetric($stackPtr, 'Space after operator', 0); - } else { - if (isset($tokens[($stackPtr + 2)]) === true - && $tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line'] - ) { - $found = 'newline'; - } else { - $found = $tokens[($stackPtr + 1)]['length']; - } - - $phpcsFile->recordMetric($stackPtr, 'Space after operator', $found); - if ($found !== 1 - && ($found !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Expected 1 space after "%s"; %s found'; - $data = [ - $operator, - $found, - ]; - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($nextNonWhitespace !== false - && isset(Tokens::$commentTokens[$tokens[$nextNonWhitespace]['code']]) === true - && $found === 'newline' - ) { - // Don't auto-fix when it's a comment or PHPCS annotation on a new line as - // it causes fixer conflicts and can cause the meaning of annotations to change. - $phpcsFile->addError($error, $stackPtr, 'SpacingAfter', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfter', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - }//end if - }//end if - - }//end process() - - - /** - * Checks if an operator is actually a different type of token in the current context. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the operator in - * the stack. - * - * @return boolean - */ - protected function isOperator(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Skip default values in function declarations. - // Skip declare statements. - if ($tokens[$stackPtr]['code'] === T_EQUAL - || $tokens[$stackPtr]['code'] === T_MINUS - ) { - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $parenthesis = array_keys($tokens[$stackPtr]['nested_parenthesis']); - $bracket = array_pop($parenthesis); - if (isset($tokens[$bracket]['parenthesis_owner']) === true) { - $function = $tokens[$bracket]['parenthesis_owner']; - if ($tokens[$function]['code'] === T_FUNCTION - || $tokens[$function]['code'] === T_CLOSURE - || $tokens[$function]['code'] === T_DECLARE - ) { - return false; - } - } - } - } - - if ($tokens[$stackPtr]['code'] === T_EQUAL) { - // Skip for '=&' case. - if (isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)]['code'] === T_BITWISE_AND - ) { - return false; - } - } - - if ($tokens[$stackPtr]['code'] === T_BITWISE_AND) { - // If it's not a reference, then we expect one space either side of the - // bitwise operator. - if ($phpcsFile->isReference($stackPtr) === true) { - return false; - } - } - - if ($tokens[$stackPtr]['code'] === T_MINUS || $tokens[$stackPtr]['code'] === T_PLUS) { - // Check minus spacing, but make sure we aren't just assigning - // a minus value or returning one. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if (isset($this->nonOperandTokens[$tokens[$prev]['code']]) === true) { - return false; - } - }//end if - - return true; - - }//end isOperator() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php deleted file mode 100644 index 198460d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php +++ /dev/null @@ -1,79 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class PropertyLabelSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_PROPERTY, - T_LABEL, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $colon = $phpcsFile->findNext(T_COLON, ($stackPtr + 1)); - - if ($colon !== ($stackPtr + 1)) { - $error = 'There must be no space before the colon in a property/label declaration'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Before'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - } - - if ($tokens[($colon + 1)]['code'] !== T_WHITESPACE || $tokens[($colon + 1)]['content'] !== ' ') { - $error = 'There must be a single space after the colon in a property/label declaration'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'After'); - if ($fix === true) { - if ($tokens[($colon + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($colon + 1), ' '); - } else { - $phpcsFile->fixer->addContent($colon, ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php deleted file mode 100644 index f686139..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php +++ /dev/null @@ -1,105 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ScopeClosingBraceSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$scopeOpeners; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile All the tokens found in the document. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // If this is an inline condition (ie. there is no scope opener), then - // return, as this is not a new scope. - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - // We need to actually find the first piece of content on this line, - // as if this is a method with tokens before it (public, static etc) - // or an if with an else before it, then we need to start the scope - // checking from there, rather than the current token. - $lineStart = $phpcsFile->findFirstOnLine([T_WHITESPACE, T_INLINE_HTML], $stackPtr, true); - while ($tokens[$lineStart]['code'] === T_CONSTANT_ENCAPSED_STRING - && $tokens[($lineStart - 1)]['code'] === T_CONSTANT_ENCAPSED_STRING - ) { - $lineStart = $phpcsFile->findFirstOnLine([T_WHITESPACE, T_INLINE_HTML], ($lineStart - 1), true); - } - - $startColumn = $tokens[$lineStart]['column']; - $scopeStart = $tokens[$stackPtr]['scope_opener']; - $scopeEnd = $tokens[$stackPtr]['scope_closer']; - - // Check that the closing brace is on it's own line. - $lastContent = $phpcsFile->findPrevious([T_INLINE_HTML, T_WHITESPACE, T_OPEN_TAG], ($scopeEnd - 1), $scopeStart, true); - if ($tokens[$lastContent]['line'] === $tokens[$scopeEnd]['line']) { - $error = 'Closing brace must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $scopeEnd, 'ContentBefore'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($scopeEnd); - } - - return; - } - - // Check now that the closing brace is lined up correctly. - $lineStart = $phpcsFile->findFirstOnLine([T_WHITESPACE, T_INLINE_HTML], $scopeEnd, true); - $braceIndent = $tokens[$lineStart]['column']; - if ($tokens[$stackPtr]['code'] !== T_DEFAULT - && $tokens[$stackPtr]['code'] !== T_CASE - && $braceIndent !== $startColumn - ) { - $error = 'Closing brace indented incorrectly; expected %s spaces, found %s'; - $data = [ - ($startColumn - 1), - ($braceIndent - 1), - ]; - - $fix = $phpcsFile->addFixableError($error, $scopeEnd, 'Indent', $data); - if ($fix === true) { - $diff = ($startColumn - $braceIndent); - if ($diff > 0) { - $phpcsFile->fixer->addContentBefore($lineStart, str_repeat(' ', $diff)); - } else { - $phpcsFile->fixer->substrToken(($lineStart - 1), 0, $diff); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php deleted file mode 100644 index e0fab85..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php +++ /dev/null @@ -1,125 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ScopeKeywordSpacingSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $register = Tokens::$scopeModifiers; - $register[] = T_STATIC; - return $register; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[($stackPtr + 1)]) === false) { - return; - } - - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - if ($tokens[$stackPtr]['code'] === T_STATIC - && (($nextToken === false || $tokens[$nextToken]['code'] === T_DOUBLE_COLON) - || $tokens[$prevToken]['code'] === T_NEW) - ) { - // Late static binding, e.g., static:: OR new static() usage or live coding. - return; - } - - if ($tokens[$prevToken]['code'] === T_AS) { - // Trait visibility change, e.g., "use HelloWorld { sayHello as private; }". - return; - } - - if ($nextToken !== false && $tokens[$nextToken]['code'] === T_VARIABLE) { - $endOfStatement = $phpcsFile->findNext(T_SEMICOLON, ($nextToken + 1)); - if ($endOfStatement === false) { - // Live coding. - return; - } - - $multiProperty = $phpcsFile->findNext(T_VARIABLE, ($nextToken + 1), $endOfStatement); - if ($multiProperty !== false - && $tokens[$stackPtr]['line'] !== $tokens[$nextToken]['line'] - && $tokens[$nextToken]['line'] !== $tokens[$endOfStatement]['line'] - ) { - // Allow for multiple properties definitions to each be on their own line. - return; - } - } - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $spacing = 0; - } else { - if ($tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line']) { - $spacing = 'newline'; - } else { - $spacing = $tokens[($stackPtr + 1)]['length']; - } - } - - if ($spacing !== 1) { - $error = 'Scope keyword "%s" must be followed by a single space; found %s'; - $data = [ - $tokens[$stackPtr]['content'], - $spacing, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Incorrect', $data); - if ($fix === true) { - if ($spacing === 0) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } else { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($stackPtr + 2); $i < $phpcsFile->numTokens; $i++) { - if (isset($tokens[$i]) === false || $tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SemicolonSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SemicolonSpacingSniff.php deleted file mode 100644 index bdcf9a5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SemicolonSpacingSniff.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SemicolonSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_SEMICOLON]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $prevType = $tokens[($stackPtr - 1)]['code']; - if (isset(Tokens::$emptyTokens[$prevType]) === false) { - return; - } - - $nonSpace = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 2), null, true); - - // Detect whether this is a semi-colon for a condition in a `for()` control structure. - $forCondition = false; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $nestedParens = $tokens[$stackPtr]['nested_parenthesis']; - $closeParenthesis = end($nestedParens); - - if (isset($tokens[$closeParenthesis]['parenthesis_owner']) === true) { - $owner = $tokens[$closeParenthesis]['parenthesis_owner']; - - if ($tokens[$owner]['code'] === T_FOR) { - $forCondition = true; - $nonSpace = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 2), null, true); - } - } - } - - if ($tokens[$nonSpace]['code'] === T_SEMICOLON - || ($forCondition === true && $nonSpace === $tokens[$owner]['parenthesis_opener']) - || (isset($tokens[$nonSpace]['scope_opener']) === true - && $tokens[$nonSpace]['scope_opener'] === $nonSpace) - ) { - // Empty statement. - return; - } - - $expected = $tokens[$nonSpace]['content'].';'; - $found = $phpcsFile->getTokensAsString($nonSpace, ($stackPtr - $nonSpace)).';'; - $found = str_replace("\n", '\n', $found); - $found = str_replace("\r", '\r', $found); - $found = str_replace("\t", '\t', $found); - $error = 'Space found before semicolon; expected "%s" but found "%s"'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Incorrect', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $i = ($stackPtr - 1); - while (($tokens[$i]['code'] === T_WHITESPACE) && ($i > $nonSpace)) { - $phpcsFile->fixer->replaceToken($i, ''); - $i--; - } - - $phpcsFile->fixer->addContent($nonSpace, ';'); - $phpcsFile->fixer->replaceToken($stackPtr, ''); - - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php deleted file mode 100644 index 831e832..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php +++ /dev/null @@ -1,264 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class SuperfluousWhitespaceSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - 'CSS', - ]; - - /** - * If TRUE, whitespace rules are not checked for blank lines. - * - * Blank lines are those that contain only whitespace. - * - * @var boolean - */ - public $ignoreBlankLines = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_TAG, - T_CLOSE_TAG, - T_WHITESPACE, - T_COMMENT, - T_DOC_COMMENT_WHITESPACE, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_OPEN_TAG) { - /* - Check for start of file whitespace. - */ - - if ($phpcsFile->tokenizerType !== 'PHP') { - // The first token is always the open tag inserted when tokenized - // and the second token is always the first piece of content in - // the file. If the second token is whitespace, there was - // whitespace at the start of the file. - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - return; - } - - if ($phpcsFile->fixer->enabled === true) { - $stackPtr = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - } - } else { - // If it's the first token, then there is no space. - if ($stackPtr === 0) { - return; - } - - $beforeOpen = ''; - - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - // If we find something that isn't inline html then there is something previous in the file. - if ($tokens[$i]['type'] !== 'T_INLINE_HTML') { - return; - } - - $beforeOpen .= $tokens[$i]['content']; - } - - // If we have ended up with inline html make sure it isn't just whitespace. - if (preg_match('`^[\pZ\s]+$`u', $beforeOpen) !== 1) { - return; - } - }//end if - - $fix = $phpcsFile->addFixableError('Additional whitespace found at start of file', $stackPtr, 'StartFile'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = 0; $i < $stackPtr; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else if ($tokens[$stackPtr]['code'] === T_CLOSE_TAG) { - /* - Check for end of file whitespace. - */ - - if ($phpcsFile->tokenizerType === 'PHP') { - if (isset($tokens[($stackPtr + 1)]) === false) { - // The close PHP token is the last in the file. - return; - } - - $afterClose = ''; - - for ($i = ($stackPtr + 1); $i < $phpcsFile->numTokens; $i++) { - // If we find something that isn't inline HTML then there - // is more to the file. - if ($tokens[$i]['type'] !== 'T_INLINE_HTML') { - return; - } - - $afterClose .= $tokens[$i]['content']; - } - - // If we have ended up with inline html make sure it isn't just whitespace. - if (preg_match('`^[\pZ\s]+$`u', $afterClose) !== 1) { - return; - } - } else { - // The last token is always the close tag inserted when tokenized - // and the second last token is always the last piece of content in - // the file. If the second last token is whitespace, there was - // whitespace at the end of the file. - $stackPtr--; - - // The pointer is now looking at the last content in the file and - // not the fake PHP end tag the tokenizer inserted. - if ($tokens[$stackPtr]['code'] !== T_WHITESPACE) { - return; - } - - // Allow a single newline at the end of the last line in the file. - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE - && $tokens[$stackPtr]['content'] === $phpcsFile->eolChar - ) { - return; - } - }//end if - - $fix = $phpcsFile->addFixableError('Additional whitespace found at end of file', $stackPtr, 'EndFile'); - if ($fix === true) { - if ($phpcsFile->tokenizerType !== 'PHP') { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - $stackPtr = ($prev + 1); - } - - $phpcsFile->fixer->beginChangeset(); - for ($i = ($stackPtr + 1); $i < $phpcsFile->numTokens; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - /* - Check for end of line whitespace. - */ - - // Ignore whitespace that is not at the end of a line. - if (isset($tokens[($stackPtr + 1)]['line']) === true - && $tokens[($stackPtr + 1)]['line'] === $tokens[$stackPtr]['line'] - ) { - return; - } - - // Ignore blank lines if required. - if ($this->ignoreBlankLines === true - && $tokens[$stackPtr]['code'] === T_WHITESPACE - && $tokens[($stackPtr - 1)]['line'] !== $tokens[$stackPtr]['line'] - ) { - return; - } - - $tokenContent = rtrim($tokens[$stackPtr]['content'], $phpcsFile->eolChar); - if (empty($tokenContent) === false) { - if ($tokenContent !== rtrim($tokenContent)) { - $fix = $phpcsFile->addFixableError('Whitespace found at end of line', $stackPtr, 'EndLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, rtrim($tokenContent).$phpcsFile->eolChar); - } - } - } else if ($tokens[($stackPtr - 1)]['content'] !== rtrim($tokens[($stackPtr - 1)]['content']) - && $tokens[($stackPtr - 1)]['line'] === $tokens[$stackPtr]['line'] - ) { - $fix = $phpcsFile->addFixableError('Whitespace found at end of line', ($stackPtr - 1), 'EndLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), rtrim($tokens[($stackPtr - 1)]['content'])); - } - } - - /* - Check for multiple blank lines in a function. - */ - - if (($phpcsFile->hasCondition($stackPtr, [T_FUNCTION, T_CLOSURE]) === true) - && $tokens[($stackPtr - 1)]['line'] < $tokens[$stackPtr]['line'] - && $tokens[($stackPtr - 2)]['line'] === $tokens[($stackPtr - 1)]['line'] - ) { - // Properties and functions in nested classes have their own rules for spacing. - $conditions = $tokens[$stackPtr]['conditions']; - $deepestScope = end($conditions); - if ($deepestScope === T_ANON_CLASS) { - return; - } - - // This is an empty line and the line before this one is not - // empty, so this could be the start of a multiple empty - // line block. - $next = $phpcsFile->findNext(T_WHITESPACE, $stackPtr, null, true); - $lines = ($tokens[$next]['line'] - $tokens[$stackPtr]['line']); - if ($lines > 1) { - $error = 'Functions must not contain multiple empty lines in a row; found %s empty lines'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'EmptyLines', [$lines]); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $i = $stackPtr; - while ($tokens[$i]['line'] !== $tokens[$next]['line']) { - $phpcsFile->fixer->replaceToken($i, ''); - $i++; - } - - $phpcsFile->fixer->addNewlineBefore($i); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc deleted file mode 100644 index 8ffc868..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc +++ /dev/null @@ -1,31 +0,0 @@ - 'bar', - 'bar' => 'foo', -]; - -if ($foo) {} -[$a, $b] = $c; - -echo foo()[ 1 ]; - -echo $this->addedCustomFunctions['nonce']; -echo $this->deprecated_functions[ $function_name ]['version']; - -echo [ 1,2,3 ][0]; -echo [ 1,2,3 ][ 0 ]; -echo 'PHP'[ 0 ]; - -$array = []; -$var = $var[$var[$var]]]; // Syntax error -$var = $var[$var[$var]; // Syntax error - -$myArray[ /* key start */'key'] = $value; -$myArray[ /* key start */'key'/* key end */ ] = $value; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc.fixed deleted file mode 100644 index 41d6640..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,31 +0,0 @@ - 'bar', - 'bar' => 'foo', -]; - -if ($foo) {} -[$a, $b] = $c; - -echo foo()[1]; - -echo $this->addedCustomFunctions['nonce']; -echo $this->deprecated_functions[$function_name]['version']; - -echo [ 1,2,3 ][0]; -echo [ 1,2,3 ][0]; -echo 'PHP'[0]; - -$array = []; -$var = $var[$var[$var]]]; // Syntax error -$var = $var[$var[$var]; // Syntax error - -$myArray[/* key start */'key'] = $value; -$myArray[/* key start */'key'/* key end */] = $value; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.php deleted file mode 100644 index 304a0d4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Arrays; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ArrayBracketSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 3, - 7 => 3, - 17 => 2, - 20 => 2, - 23 => 2, - 24 => 2, - 30 => 1, - 31 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc deleted file mode 100644 index e6fdbdc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc +++ /dev/null @@ -1,453 +0,0 @@ - 1, - ); -} - -class TestClass -{ - public $good = array( - 'width' => '', - 'height' => '', - ); - - private $_bad = Array( - 'width' => '', - 'height' => '' - ); - - - public function test() - { - $truck = array( - 'width' => '', - 'height' => '', - ); - - $plane = Array( - 'width' => '', - 'height' => '', - ); - - $car = array( - 'width' => '', - 'height' => '', - ); - - $bus = array( - 'width' => '', - 'height' => '' - ); - - $train = array ( - TRUE, - FALSE, - 'aaa' - ); - - $inline = array('aaa', 'bbb', 'ccc'); - $inline = array('aaa'); - $inline = Array('aaa'); - - $bigone = array( - 'name' => 'bigone', - 'children' => Array( - '1a' => 'child', - '11b' => 'child', - '111c' => 'child', - 'children' => Array( - 'child' => 'aaa', - ), - ), - 'short_name' => 'big' - ); - } - -}//end class - -$value = array ( ); -$value = array( ); -$value = array('1'=>$one, '2' => $two, '3'=> $three, '4' =>$four); -$value = array('1'=>$one); - -if (in_array('1', array('1','2','3')) === TRUE) { - $value = in_array('1', array('1' , '2', '3','4')); -} - -$value = array( - '1'=> TRUE, - FALSE, - '3' => 'aaa',); - -$value = array( - '1'=> TRUE, - FALSE, - ); - -$value = array( - TRUE, - '1' => FALSE, - ); - -$value = array(1, - 2 , - 3 , - ); - -$value = array(1 => $one, - 2 => $two , - 3 => $three , - ); - -$value = array( - 'tag' => $tag, - 'space' => $this->_getIndentation($tag, $tagElement), - ); - -$expected = array( - array( - '1' => 1, - '1' => 2, - ), - ); - -$expected = array( - array( - '1' => 1, - '1' => 2 - ) - ); - -// Space in second arg. -$args = array( - '"'.$this->id.'"', - (int) $hasSessions, - ); - -// No errors. -$paths = array( - Init::ROOT_DIR.'/Systems' => 'Systems', - Init::ROOT_DIR.'/Installer' => 'Systems', - ); - -$x = array( - ); - -$x = array('test' - ); -$x = array('test', - ); -$x = array('name' => 'test', - ); - -$x = array( - $x, - ); - -$func = array( - $x, - 'get'.$x.'Replacement' - ); - -$array = array( - 'input_one' => 'one', - 'inputTwo' => 'two', - 'input_3' => 3, - ); - -$array = array( - 'input_one', - 'inputTwo', - 'input_3', - ); - -// Malformed -$foo = array(1 -, 2); - -$listItems[$aliasPath] = array('itemContent' => implode('
    ', $aliases)); - -$listItems[$aliasPath] = array( - 'itemContent' => implode('
    ', $aliases) - ); - -$x = array - ( - $x, - $y, - ); - -$x = array -( - $x, - $y, - ); - -$x = array( - - $x, - $y, - ); - -$test = array( - 'test' => TestFunction::blah( - $value1, - $value2 - ), - ); - -$c = array('a' => 1,); - -function b() -{ - $a = array( - 'a' => a('a'), - - ); - -} - -$foo = Array('[',']',':',"\n","\r"); -$bar = Array('[',']',':',' ',' '); - -function foo() -{ - return array($a, $b->screen); -} - -$array = array( - 'name' => 'contactSubject', - 'required' => TRUE, - 'validators' => array( - new \Zend\Validator\InArray(array('haystack' => array_keys($aSubjects))), - ), - ); - -$var = array( - 'ViewHelper', - array('Foo'), - 'Errors', - ); - -$data = array( - 'first', - 'second', - 'third', - // Add more here - ); - -$data = array( - 'first', - 'second', - //'third', - ); - -$data = array( - 'first', - 'second' - //'third', - ); - -$foo = array( - $this->getViewName() . '.id' => 'value', - $this->getViewName() . '.title' => 'value', - ); - -$foo = array( - $this->getViewName() . '.id', - $this->getViewName() . '.title', - ); - -$weightings = array( - T_CLOSURE => 100, - - /* - Conditions. - */ - - T_WHILE => 50, - - /* - Operators and arithmetic. - */ - - T_BITWISE_AND => 8, - - T_BOOLEAN_AND => 5, - - /* - Equality. - */ - - T_IS_GREATER_OR_EQUAL => 5, - ); - -foreach (array( - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ) as $key => $value) { -} - -$ids = array( - '1', // Foo. - '13', // Bar. - ); - -array( - 'key1' => function($bar) { - return $bar; - }, - 'key2' => function($foo) { - return $foo; - }, - 'key3' => function($bar) { - return $bar; - } -); - -array( - 'key1' => array( - '1', - '2', - ) -); - -$var = array( - 'tab_template' => ' -
  • %s
  • ', - 'panel_template' => ' -
    - %s -
    ', - ); - -function test() : array -{ - return []; -} - -$fields = array( - 'id' => array('type' => 'INT'), - 'value' => array('type' => 'VARCHAR')); - -get_current_screen()->add_help_tab( array( - 'id' => << false); - -$x = array( - 'xxxx' => array('aaaaaaaaaa' => 'ccccccccccc', - 'bbbbbbbb' => false), -); - -$foo = array - ('foo' => array - ('bar1' => 1 - ,'bar2' => 1 - ,'bar3' => 1 - ,'bar4' => 1 - ,'bar5' => 1 - ) - ); - -$foo = array( - '1' => $row['status'] === 'rejected' - ? self::REJECTED_CODE - : self::VERIFIED_CODE, - '2' => in_array($row['status'], array('notverified', 'unverified'), true) - ? self::STATUS_PENDING - : self::STATUS_VERIFIED, - '3' => strtotime($row['date']), - ); - -$foo = foo( - array( - // comment - ) -); - -$foo = array( - << lorem( - 1 - ), 2 => 2, -); - -$foo = array( - 'тип' => 'авто', - 'цвет' => 'синий', - ); - -$paths = array( - Init::ROOT_DIR.'/тип' => 'авто', - Init::ROOT_DIR.'/цвет' => 'синий', - ); - -$foo = array(<< fn() => return 1, - 'bb' => fn() => return 2, - 'ccc' => ( true ) ? - fn() => return 1 : - fn() => return 2, - ); - -$array = array( - 1 => '1', - 2 => fn ($x) => yield 'a' => $x, - 3 => '3', - ); - -$foo = array( - $this->fn => 'value', - $foo->fn => 'value', - ); - -array($a, $b, -$c); - -array('a' => $a, 'b' => $b, -'c' => $c); - -// Intentional syntax error. -$a = array( - 'a' => - ); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc.fixed deleted file mode 100644 index 336ab0a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc.fixed +++ /dev/null @@ -1,489 +0,0 @@ - 1); -} - -class TestClass -{ - public $good = array( - 'width' => '', - 'height' => '', - ); - - private $_bad = array( - 'width' => '', - 'height' => '', - ); - - - public function test() - { - $truck = array( - 'width' => '', - 'height' => '', - ); - - $plane = array( - 'width' => '', - 'height' => '', - ); - - $car = array( - 'width' => '', - 'height' => '', - ); - - $bus = array( - 'width' => '', - 'height' => '', - ); - - $train = array( - TRUE, - FALSE, - 'aaa', - ); - - $inline = array( - 'aaa', - 'bbb', - 'ccc', - ); - $inline = array('aaa'); - $inline = array('aaa'); - - $bigone = array( - 'name' => 'bigone', - 'children' => array( - '1a' => 'child', - '11b' => 'child', - '111c' => 'child', - 'children' => array('child' => 'aaa'), - ), - 'short_name' => 'big', - ); - } - -}//end class - -$value = array(); -$value = array(); -$value = array( - '1' => $one, - '2' => $two, - '3' => $three, - '4' => $four, - ); -$value = array('1' => $one); - -if (in_array('1', array('1', '2', '3')) === TRUE) { - $value = in_array('1', array('1', '2', '3', '4')); -} - -$value = array( - '1'=> TRUE, - FALSE, - '3' => 'aaa', - ); - -$value = array( - '1'=> TRUE, - FALSE, - ); - -$value = array( - TRUE, - '1' => FALSE, - ); - -$value = array( - 1, - 2, - 3, - ); - -$value = array( - 1 => $one, - 2 => $two, - 3 => $three, - ); - -$value = array( - 'tag' => $tag, - 'space' => $this->_getIndentation($tag, $tagElement), - ); - -$expected = array( - array( - '1' => 1, - '1' => 2, - ), - ); - -$expected = array( - array( - '1' => 1, - '1' => 2, - ), - ); - -// Space in second arg. -$args = array( - '"'.$this->id.'"', - (int) $hasSessions, - ); - -// No errors. -$paths = array( - Init::ROOT_DIR.'/Systems' => 'Systems', - Init::ROOT_DIR.'/Installer' => 'Systems', - ); - -$x = array(); - -$x = array('test'); -$x = array('test'); -$x = array('name' => 'test'); - -$x = array($x); - -$func = array( - $x, - 'get'.$x.'Replacement', - ); - -$array = array( - 'input_one' => 'one', - 'inputTwo' => 'two', - 'input_3' => 3, - ); - -$array = array( - 'input_one', - 'inputTwo', - 'input_3', - ); - -// Malformed -$foo = array( - 1, - 2, - ); - -$listItems[$aliasPath] = array('itemContent' => implode('
    ', $aliases)); - -$listItems[$aliasPath] = array( - 'itemContent' => implode('
    ', $aliases), - ); - -$x = array( - $x, - $y, - ); - -$x = array( - $x, - $y, - ); - -$x = array( - - $x, - $y, - ); - -$test = array( - 'test' => TestFunction::blah( - $value1, - $value2 - ), - ); - -$c = array('a' => 1); - -function b() -{ - $a = array( - 'a' => a('a'), - - ); - -} - -$foo = array( - '[', - ']', - ':', - "\n", - "\r", - ); -$bar = array( - '[', - ']', - ':', - ' ', - ' ', - ); - -function foo() -{ - return array( - $a, - $b->screen, - ); -} - -$array = array( - 'name' => 'contactSubject', - 'required' => TRUE, - 'validators' => array( - new \Zend\Validator\InArray(array('haystack' => array_keys($aSubjects))), - ), - ); - -$var = array( - 'ViewHelper', - array('Foo'), - 'Errors', - ); - -$data = array( - 'first', - 'second', - 'third', - // Add more here - ); - -$data = array( - 'first', - 'second', - //'third', - ); - -$data = array( - 'first', - 'second', - //'third', - ); - -$foo = array( - $this->getViewName() . '.id' => 'value', - $this->getViewName() . '.title' => 'value', - ); - -$foo = array( - $this->getViewName() . '.id', - $this->getViewName() . '.title', - ); - -$weightings = array( - T_CLOSURE => 100, - - /* - Conditions. - */ - - T_WHILE => 50, - - /* - Operators and arithmetic. - */ - - T_BITWISE_AND => 8, - - T_BOOLEAN_AND => 5, - - /* - Equality. - */ - - T_IS_GREATER_OR_EQUAL => 5, - ); - -foreach (array( - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ) as $key => $value) { -} - -$ids = array( - '1', // Foo. - '13', // Bar. - ); - -array( - 'key1' => function($bar) { - return $bar; - }, - 'key2' => function($foo) { - return $foo; - }, - 'key3' => function($bar) { - return $bar; - }, -); - -array( - 'key1' => array( - '1', - '2', - ), -); - -$var = array( - 'tab_template' => ' -
  • %s
  • ', - 'panel_template' => ' -
    - %s -
    ', - ); - -function test() : array -{ - return []; -} - -$fields = array( - 'id' => array('type' => 'INT'), - 'value' => array('type' => 'VARCHAR'), - ); - -get_current_screen()->add_help_tab( array( - 'id' => << false); - -$x = array( - 'xxxx' => array( - 'aaaaaaaaaa' => 'ccccccccccc', - 'bbbbbbbb' => false, - ), - ); - -$foo = array( - 'foo' => array( - 'bar1' => 1, - 'bar2' => 1, - 'bar3' => 1, - 'bar4' => 1, - 'bar5' => 1, - ), - ); - -$foo = array( - '1' => $row['status'] === 'rejected' - ? self::REJECTED_CODE - : self::VERIFIED_CODE, - '2' => in_array($row['status'], array('notverified', 'unverified'), true) - ? self::STATUS_PENDING - : self::STATUS_VERIFIED, - '3' => strtotime($row['date']), - ); - -$foo = foo( - array( - // comment - ) -); - -$foo = array( - << lorem( - 1 - ), - 2 => 2, -); - -$foo = array( - 'тип' => 'авто', - 'цвет' => 'синий', - ); - -$paths = array( - Init::ROOT_DIR.'/тип' => 'авто', - Init::ROOT_DIR.'/цвет' => 'синий', - ); - -$foo = array(<< fn() => return 1, - 'bb' => fn() => return 2, - 'ccc' => ( true ) ? - fn() => return 1 : - fn() => return 2, - ); - -$array = array( - 1 => '1', - 2 => fn ($x) => yield 'a' => $x, - 3 => '3', - ); - -$foo = array( - $this->fn => 'value', - $foo->fn => 'value', - ); - -array( - $a, - $b, - $c, -); - -array( - 'a' => $a, - 'b' => $b, - 'c' => $c, -); - -// Intentional syntax error. -$a = array( - 'a' => - ); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc deleted file mode 100644 index 60ff35d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc +++ /dev/null @@ -1,442 +0,0 @@ - 1, - ]; -} - -class TestClass -{ - public $good = [ - 'width' => '', - 'height' => '', - ]; - - private $_bad = [ - 'width' => '', - 'height' => '' - ]; - - - public function test() - { - $truck = [ - 'width' => '', - 'height' => '', - ]; - - $plane = [ - 'width' => '', - 'height' => '', - ]; - - $car = [ - 'width' => '', - 'height' => '', - ]; - - $bus = [ - 'width' => '', - 'height' => '' - ]; - - $train = [ - TRUE, - FALSE, - 'aaa' - ]; - - $inline = ['aaa', 'bbb', 'ccc']; - $inline = ['aaa']; - $inline = ['aaa']; - - $bigone = [ - 'name' => 'bigone', - 'children' => [ - '1a' => 'child', - '11b' => 'child', - '111c' => 'child', - 'children' => [ - 'child' => 'aaa', - ], - ], - 'short_name' => 'big' - ]; - } - -}//end class - -$value = [ ]; -$value = [ ]; -$value = ['1'=>$one, '2' => $two, '3'=> $three, '4' =>$four]; -$value = ['1'=>$one]; - -if (in_array('1', ['1','2','3']) === TRUE) { - $value = in_array('1', ['1' , '2', '3','4']); -} - -$value = [ - '1'=> TRUE, - FALSE, - '3' => 'aaa',]; - -$value = [ - '1'=> TRUE, - FALSE, - ]; - -$value = [ - TRUE, - '1' => FALSE, - ]; - -$value = [1, - 2 , - 3 , - ]; - -$value = [1 => $one, - 2 => $two , - 3 => $three , - ]; - -$value = [ - 'tag' => $tag, - 'space' => $this->_getIndentation($tag, $tagElement), - ]; - -$expected = [ - [ - '1' => 1, - '1' => 2, - ], - ]; - -$expected = [ - [ - '1' => 1, - '1' => 2 - ] - ]; - -// Space in second arg. -$args = [ - '"'.$this->id.'"', - (int) $hasSessions, - ]; - -// No errors. -$paths = [ - Init::ROOT_DIR.'/Systems' => 'Systems', - Init::ROOT_DIR.'/Installer' => 'Systems', - ]; - -$x = [ - ]; - -$x = ['test' - ]; -$x = ['test', - ]; -$x = ['name' => 'test', - ]; - -$x = [ - $x, - ]; - -$func = [ - $x, - 'get'.$x.'Replacement' - ]; - -$array = [ - 'input_one' => 'one', - 'inputTwo' => 'two', - 'input_3' => 3, - ]; - -$array = [ - 'input_one', - 'inputTwo', - 'input_3', - ]; - -// Malformed -$foo = [1 -, 2]; - -$listItems[$aliasPath] = ['itemContent' => implode('
    ', $aliases)]; - -$listItems[$aliasPath] = [ - 'itemContent' => implode('
    ', $aliases) - ]; - -$x = - [ - $x, - $y, - ]; - -$x = -[ - $x, - $y, - ]; - -$x = [ - - $x, - $y, - ]; - -$test = [ - 'test' => TestFunction::blah( - $value1, - $value2 - ), - ]; - -$c = ['a' => 1,]; -$c->{$var}[ ] = 2; - -$foo = ['[',']',':',"\n","\r"]; -$bar = ['[',']',':',' ',' ']; - -function foo() -{ - return [$a, $b->screen]; -} - -$array = [ - 'name' => 'contactSubject', - 'required' => TRUE, - 'validators' => [ - new \Zend\Validator\InArray(['haystack' => array_keys($aSubjects)]), - ], - ]; - -$var = [ - 'ViewHelper', - ['Foo'], - 'Errors', - ]; - -$data = [ - 'first', - 'second', - 'third', - // Add more here - ]; - -$data = [ - 'first', - 'second', - //'third', - ]; - -$data = [ - 'first', - 'second' - //'third', - ]; - -$foo = [ - $this->getViewName() . '.id' => 'value', - $this->getViewName() . '.title' => 'value', - ]; - -$foo = [ - $this->getViewName() . '.id', - $this->getViewName() . '.title', - ]; - -$weightings = [ - T_CLOSURE => 100, - - /* - Conditions. - */ - - T_WHILE => 50, - - /* - Operators and arithmetic. - */ - - T_BITWISE_AND => 8, - - T_BOOLEAN_AND => 5, - - /* - Equality. - */ - - T_IS_GREATER_OR_EQUAL => 5, - ]; - -foreach ([ - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ] as $key => $value) { -} - -$ids = [ - '1', // Foo. - '13', // Bar. - ]; - -[ - 'key1' => function($bar) { - return $bar; - }, - 'key2' => function($foo) { - return $foo; - }, - 'key3' => function($bar) { - return $bar; - } -]; - -[ - 'key1' => [ - '1', - '2', - ] -]; - -$var = [ - 'tab_template' => ' -
  • %s
  • ', - 'panel_template' => ' -
    - %s -
    ', - ]; - -function test() : array -{ - return []; -} - -$fields = [ - 'id' => ['type' => 'INT'], - 'value' => ['type' => 'VARCHAR']]; - -get_current_screen()->add_help_tab( [ - 'id' => << false]; - -$x = [ - 'xxxx' => ['aaaaaaaaaa' => 'ccccccccccc', - 'bbbbbbbb' => false], -]; - -$foo = ['foo' => ['bar1' => 1 - ,'bar2' => 1 - ,'bar3' => 1 - ,'bar4' => 1 - ,'bar5' => 1 - ] - ]; - -$foo = [ - '1' => $row['status'] === 'rejected' - ? self::REJECTED_CODE - : self::VERIFIED_CODE, - '2' => in_array($row['status'], ['notverified', 'unverified'], true) - ? self::STATUS_PENDING - : self::STATUS_VERIFIED, - '3' => strtotime($row['date']), - ]; - - -$foo = foo( - [ - // comment - ] -); - -$foo = [ - << lorem( - 1 - ), 2 => 2, -]; - -$foo = [ - 'тип' => 'авто', - 'цвет' => 'синий', - ]; - -$paths = [ - Init::ROOT_DIR.'/тип' => 'авто', - Init::ROOT_DIR.'/цвет' => 'синий', - ]; - -$foo = [<< fn() => return 1, - 'bb' => fn() => return 2, - 'ccc' => ( true ) ? - fn() => return 1 : - fn() => return 2, - ]; - -$array = [ - 1 => '1', - 2 => fn ($x) => yield 'a' => $x, - 3 => '3', - ]; - -$foo = [ - $this->fn => 'value', - $foo->fn => 'value', - ]; - -[$a, $b, -$c]; - -['a' => $a, 'b' => $b, -'c' => $c]; - -// Intentional syntax error. -$a = [ - 'a' => - ]; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc.fixed deleted file mode 100644 index 1d17fa0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc.fixed +++ /dev/null @@ -1,476 +0,0 @@ - 1]; -} - -class TestClass -{ - public $good = [ - 'width' => '', - 'height' => '', - ]; - - private $_bad = [ - 'width' => '', - 'height' => '', - ]; - - - public function test() - { - $truck = [ - 'width' => '', - 'height' => '', - ]; - - $plane = [ - 'width' => '', - 'height' => '', - ]; - - $car = [ - 'width' => '', - 'height' => '', - ]; - - $bus = [ - 'width' => '', - 'height' => '', - ]; - - $train = [ - TRUE, - FALSE, - 'aaa', - ]; - - $inline = [ - 'aaa', - 'bbb', - 'ccc', - ]; - $inline = ['aaa']; - $inline = ['aaa']; - - $bigone = [ - 'name' => 'bigone', - 'children' => [ - '1a' => 'child', - '11b' => 'child', - '111c' => 'child', - 'children' => ['child' => 'aaa'], - ], - 'short_name' => 'big', - ]; - } - -}//end class - -$value = []; -$value = []; -$value = [ - '1' => $one, - '2' => $two, - '3' => $three, - '4' => $four, - ]; -$value = ['1' => $one]; - -if (in_array('1', ['1', '2', '3']) === TRUE) { - $value = in_array('1', ['1', '2', '3', '4']); -} - -$value = [ - '1'=> TRUE, - FALSE, - '3' => 'aaa', - ]; - -$value = [ - '1'=> TRUE, - FALSE, - ]; - -$value = [ - TRUE, - '1' => FALSE, - ]; - -$value = [ - 1, - 2, - 3, - ]; - -$value = [ - 1 => $one, - 2 => $two, - 3 => $three, - ]; - -$value = [ - 'tag' => $tag, - 'space' => $this->_getIndentation($tag, $tagElement), - ]; - -$expected = [ - [ - '1' => 1, - '1' => 2, - ], - ]; - -$expected = [ - [ - '1' => 1, - '1' => 2, - ], - ]; - -// Space in second arg. -$args = [ - '"'.$this->id.'"', - (int) $hasSessions, - ]; - -// No errors. -$paths = [ - Init::ROOT_DIR.'/Systems' => 'Systems', - Init::ROOT_DIR.'/Installer' => 'Systems', - ]; - -$x = []; - -$x = ['test']; -$x = ['test']; -$x = ['name' => 'test']; - -$x = [$x]; - -$func = [ - $x, - 'get'.$x.'Replacement', - ]; - -$array = [ - 'input_one' => 'one', - 'inputTwo' => 'two', - 'input_3' => 3, - ]; - -$array = [ - 'input_one', - 'inputTwo', - 'input_3', - ]; - -// Malformed -$foo = [ - 1, - 2, - ]; - -$listItems[$aliasPath] = ['itemContent' => implode('
    ', $aliases)]; - -$listItems[$aliasPath] = [ - 'itemContent' => implode('
    ', $aliases), - ]; - -$x = - [ - $x, - $y, - ]; - -$x = -[ - $x, - $y, -]; - -$x = [ - - $x, - $y, - ]; - -$test = [ - 'test' => TestFunction::blah( - $value1, - $value2 - ), - ]; - -$c = ['a' => 1]; -$c->{$var}[ ] = 2; - -$foo = [ - '[', - ']', - ':', - "\n", - "\r", - ]; -$bar = [ - '[', - ']', - ':', - ' ', - ' ', - ]; - -function foo() -{ - return [ - $a, - $b->screen, - ]; -} - -$array = [ - 'name' => 'contactSubject', - 'required' => TRUE, - 'validators' => [ - new \Zend\Validator\InArray(['haystack' => array_keys($aSubjects)]), - ], - ]; - -$var = [ - 'ViewHelper', - ['Foo'], - 'Errors', - ]; - -$data = [ - 'first', - 'second', - 'third', - // Add more here - ]; - -$data = [ - 'first', - 'second', - //'third', - ]; - -$data = [ - 'first', - 'second', - //'third', - ]; - -$foo = [ - $this->getViewName() . '.id' => 'value', - $this->getViewName() . '.title' => 'value', - ]; - -$foo = [ - $this->getViewName() . '.id', - $this->getViewName() . '.title', - ]; - -$weightings = [ - T_CLOSURE => 100, - - /* - Conditions. - */ - - T_WHILE => 50, - - /* - Operators and arithmetic. - */ - - T_BITWISE_AND => 8, - - T_BOOLEAN_AND => 5, - - /* - Equality. - */ - - T_IS_GREATER_OR_EQUAL => 5, - ]; - -foreach ([ - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ] as $key => $value) { -} - -$ids = [ - '1', // Foo. - '13', // Bar. - ]; - -[ - 'key1' => function($bar) { - return $bar; - }, - 'key2' => function($foo) { - return $foo; - }, - 'key3' => function($bar) { - return $bar; - }, -]; - -[ - 'key1' => [ - '1', - '2', - ], -]; - -$var = [ - 'tab_template' => ' -
  • %s
  • ', - 'panel_template' => ' -
    - %s -
    ', - ]; - -function test() : array -{ - return []; -} - -$fields = [ - 'id' => ['type' => 'INT'], - 'value' => ['type' => 'VARCHAR'], - ]; - -get_current_screen()->add_help_tab( [ - 'id' => << false]; - -$x = [ - 'xxxx' => [ - 'aaaaaaaaaa' => 'ccccccccccc', - 'bbbbbbbb' => false, - ], - ]; - -$foo = [ - 'foo' => [ - 'bar1' => 1, - 'bar2' => 1, - 'bar3' => 1, - 'bar4' => 1, - 'bar5' => 1, - ], - ]; - -$foo = [ - '1' => $row['status'] === 'rejected' - ? self::REJECTED_CODE - : self::VERIFIED_CODE, - '2' => in_array($row['status'], ['notverified', 'unverified'], true) - ? self::STATUS_PENDING - : self::STATUS_VERIFIED, - '3' => strtotime($row['date']), - ]; - - -$foo = foo( - [ - // comment - ] -); - -$foo = [ - << lorem( - 1 - ), - 2 => 2, -]; - -$foo = [ - 'тип' => 'авто', - 'цвет' => 'синий', - ]; - -$paths = [ - Init::ROOT_DIR.'/тип' => 'авто', - Init::ROOT_DIR.'/цвет' => 'синий', - ]; - -$foo = [<< fn() => return 1, - 'bb' => fn() => return 2, - 'ccc' => ( true ) ? - fn() => return 1 : - fn() => return 2, - ]; - -$array = [ - 1 => '1', - 2 => fn ($x) => yield 'a' => $x, - 3 => '3', - ]; - -$foo = [ - $this->fn => 'value', - $foo->fn => 'value', - ]; - -[ - $a, - $b, - $c, -]; - -[ - 'a' => $a, - 'b' => $b, - 'c' => $c, -]; - -// Intentional syntax error. -$a = [ - 'a' => - ]; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.php deleted file mode 100644 index 818b1b5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.php +++ /dev/null @@ -1,230 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Arrays; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ArrayDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ArrayDeclarationUnitTest.1.inc': - return [ - 2 => 1, - 8 => 2, - 10 => 2, - 22 => 1, - 23 => 2, - 24 => 2, - 25 => 1, - 31 => 2, - 35 => 1, - 36 => 2, - 41 => 1, - 46 => 1, - 47 => 1, - 50 => 1, - 51 => 1, - 53 => 1, - 56 => 1, - 58 => 1, - 61 => 1, - 62 => 1, - 63 => 1, - 64 => 1, - 65 => 1, - 66 => 3, - 70 => 1, - 76 => 2, - 77 => 1, - 78 => 7, - 79 => 2, - 81 => 2, - 82 => 4, - 87 => 1, - 88 => 1, - 92 => 1, - 97 => 1, - 100 => 1, - 101 => 1, - 102 => 1, - 105 => 1, - 106 => 1, - 107 => 1, - 125 => 1, - 126 => 1, - 141 => 1, - 144 => 1, - 146 => 1, - 148 => 1, - 151 => 1, - 157 => 1, - 173 => 1, - 174 => 3, - 179 => 1, - 182 => 1, - 188 => 1, - 207 => 1, - 212 => 2, - 214 => 1, - 218 => 2, - 219 => 2, - 223 => 1, - 255 => 1, - 294 => 1, - 295 => 1, - 296 => 1, - 311 => 1, - 317 => 1, - 339 => 2, - 348 => 2, - 352 => 2, - 355 => 3, - 358 => 3, - 359 => 2, - 360 => 1, - 362 => 1, - 363 => 2, - 364 => 1, - 365 => 2, - 366 => 2, - 367 => 2, - 368 => 2, - 369 => 1, - 370 => 1, - 383 => 1, - 394 => 1, - 400 => 1, - 406 => 1, - 441 => 1, - 444 => 2, - 445 => 2, - 447 => 2, - 448 => 3, - ]; - case 'ArrayDeclarationUnitTest.2.inc': - return [ - 2 => 1, - 10 => 1, - 23 => 2, - 24 => 2, - 25 => 1, - 31 => 2, - 36 => 2, - 41 => 1, - 46 => 1, - 47 => 1, - 51 => 1, - 53 => 1, - 56 => 1, - 61 => 1, - 63 => 1, - 64 => 1, - 65 => 1, - 66 => 2, - 70 => 1, - 76 => 1, - 77 => 1, - 78 => 7, - 79 => 2, - 81 => 2, - 82 => 4, - 87 => 1, - 88 => 1, - 92 => 1, - 97 => 1, - 100 => 1, - 101 => 1, - 102 => 1, - 105 => 1, - 106 => 1, - 107 => 1, - 125 => 1, - 126 => 1, - 141 => 1, - 144 => 1, - 146 => 1, - 148 => 1, - 151 => 1, - 157 => 1, - 173 => 1, - 174 => 3, - 179 => 1, - 190 => 1, - 191 => 1, - 192 => 1, - 207 => 1, - 210 => 1, - 211 => 1, - 215 => 1, - 247 => 1, - 286 => 1, - 287 => 1, - 288 => 1, - 303 => 1, - 309 => 1, - 331 => 2, - 345 => 3, - 348 => 3, - 349 => 2, - 350 => 1, - 352 => 2, - 353 => 2, - 354 => 2, - 355 => 2, - 356 => 2, - 357 => 1, - 358 => 1, - 372 => 1, - 383 => 1, - 389 => 1, - 395 => 1, - 430 => 1, - 433 => 2, - 434 => 2, - 436 => 2, - 437 => 3, - ]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css deleted file mode 100644 index 39abce2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css +++ /dev/null @@ -1,81 +0,0 @@ -.my-style { -} - - -.my-style { -} - -/* Comment */ - -.my-style { -} - - -/* Comment */ - -.my-style { - float: left; - -} - -.AssetLineageWidgetType-item { - color: #CCC; -} - -/*.AssetLineageWidgetType-item2 .selected, -.AssetLineageWidgetType-item .selected { -}*/ - -.AssetLineageWidgetType-item.selected { -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } -} - -.GUITextBox.container:after {} - -@media screen and (max-device-width: 769px) { - .no-blank-line-after { - } - .no-blank-line-after-second-def { - } .my-style { - } - - .no-blank-line-and-trailing-comment { - } /* end long class */ - .too-many-blank-lines-and-trailing-comment-extra-whitespace-after-brace { - } /* end long class */ - - - - .has-blank-line-and-trailing-comment { - } /* end long class */ - - .no-blank-line-and-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - .too-many-blank-lines-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - - - - .has-blank-line-and-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%;}} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css.fixed deleted file mode 100644 index ca77e83..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css.fixed +++ /dev/null @@ -1,85 +0,0 @@ -.my-style { -} - -.my-style { -} - -/* Comment */ - -.my-style { -} - -/* Comment */ - -.my-style { - float: left; - -} - -.AssetLineageWidgetType-item { - color: #CCC; -} - -/*.AssetLineageWidgetType-item2 .selected, -.AssetLineageWidgetType-item .selected { -}*/ - -.AssetLineageWidgetType-item.selected { -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -.GUITextBox.container:after { -} - -@media screen and (max-device-width: 769px) { - .no-blank-line-after { - } - - .no-blank-line-after-second-def { - } - -.my-style { - } - - .no-blank-line-and-trailing-comment { - } /* end long class */ - - .too-many-blank-lines-and-trailing-comment-extra-whitespace-after-brace { - } /* end long class */ - - .has-blank-line-and-trailing-comment { - } /* end long class */ - - .no-blank-line-and-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - - .too-many-blank-lines-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - - .has-blank-line-and-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; -} - -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.php deleted file mode 100644 index 528fcfd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClassDefinitionClosingBraceSpaceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 11 => 1, - 44 => 1, - 47 => 1, - 51 => 1, - 53 => 1, - 57 => 1, - 59 => 1, - 67 => 1, - 69 => 1, - 81 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.css deleted file mode 100644 index 6496cb8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.css +++ /dev/null @@ -1,66 +0,0 @@ -.AssetListingEditWidgetType-BottomPanel select, -#EditEditingModeWidgetType-assetEditor-filters-assetTypes-addNew { - float: left; -} - -.AssetListingEditWidgetType-BottomPanel select, - -#EditEditingModeWidgetType-assetEditor-filters-assetTypes-addNew { - float: left; -} - -.AssetListingEditWidgetType-BottomPanel select, -/*.AssetListingEditWidgetType-BottomPanel ul,*/ -#EditEditingModeWidgetType-assetEditor-filters-assetTypes-addNew { - float: left; -} - -.AssetListingEditWidgetType-BottomPanel select, - -.AssetListingEditWidgetType-BottomPanel ul, -#EditEditingModeWidgetType-assetEditor-filters-assetTypes-addNew { - float: left; -} - -#SuperUsersSystemConfigScreen-table { - display: block; - left: 50%; - margin-left: -500px; - margin-top: 180px; - position: relative; - width: 1000px; -} - -/** - * More styles below here. - */ - -td.TableWidgetType-header.TableWidgetType-header-lastLogin, -td.TableWidgetType-header.TableWidgetType-header-remove, -td.TableWidgetType-header.TableWidgetType-header-email, -td.TableWidgetType-header.TableWidgetType-header-userName { - background: url(images/ScreenImages/table_header_bg.png) repeat-x; - border-top: 1px solid #D4D4D4; - color: #787878; - height: 33px; - padding-left: 12px; - width: 150px; -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - padding: 20px; - margin: 40px; - } -} - -.foo -{ - border: none; -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.php deleted file mode 100644 index 41202bc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClassDefinitionNameSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 19 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css deleted file mode 100644 index 98c8fa5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css +++ /dev/null @@ -1,108 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title{ - float: left; -} -.HelpWidgetType-new-bug-title { - - float: left; -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - - - - header #logo img { - max-width: 100%; - } - -} - -.GUITextBox.container:after {} - -.single-line {float: left;} - -#opening-brace-on-different-line - - -{ - color: #FFFFFF; -} - -#opening-brace-on-different-line-and-inline-style - - -{color: #FFFFFF;} - -@media screen and (max-device-width: 769px) { .everything-on-one-line { float: left; } } - -/* Document handling of comments in various places */ -.no-space-before-opening-with-comment /* comment*/{ - float: left; -} - -.space-before-opening-with-comment-on-next-line -/* comment*/ { - float: left; -} - -#opening-brace-on-different-line-with-comment-between -/*comment*/ -{ - padding: 0; -} - -.single-line-with-comment { /* comment*/ float: left; } - -.multi-line-with-trailing-comment { /* comment*/ - float: left; -} - - -@media screen and (max-device-width: 769px) { - /*comment*/ - .comment-line-after-nesting-class-opening { - } -} - -@media screen and (max-device-width: 769px) { - - /*comment*/ - .blank-line-and-comment-line-after-nesting-class-opening { - } -} - -@media screen and (max-device-width: 769px) { - - - - /* phpcs:ignore Standard.Category.Sniffname -- for reasons */ - .blank-line-and-annotation-after-nesting-class-opening { - } -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css.fixed deleted file mode 100644 index b3f48a5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css.fixed +++ /dev/null @@ -1,106 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - - float: left; -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -.GUITextBox.container:after { -} - -.single-line { -float: left;} - -#opening-brace-on-different-line { - color: #FFFFFF; -} - -#opening-brace-on-different-line-and-inline-style { -color: #FFFFFF;} - -@media screen and (max-device-width: 769px) { - -.everything-on-one-line { -float: left; } } - -/* Document handling of comments in various places */ -.no-space-before-opening-with-comment /* comment*/ { - float: left; -} - -.space-before-opening-with-comment-on-next-line -/* comment*/ { - float: left; -} - -#opening-brace-on-different-line-with-comment-between -/*comment*/ { - padding: 0; -} - -.single-line-with-comment { -/* comment*/ float: left; } - -.multi-line-with-trailing-comment { /* comment*/ - float: left; -} - - -@media screen and (max-device-width: 769px) { - - /*comment*/ - .comment-line-after-nesting-class-opening { - } -} - -@media screen and (max-device-width: 769px) { - - /*comment*/ - .blank-line-and-comment-line-after-nesting-class-opening { - } -} - -@media screen and (max-device-width: 769px) { - - /* phpcs:ignore Standard.Category.Sniffname -- for reasons */ - .blank-line-and-annotation-after-nesting-class-opening { - } -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.php deleted file mode 100644 index d1e4421..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClassDefinitionOpeningBraceSpaceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 7 => 1, - 10 => 1, - 26 => 1, - 33 => 1, - 43 => 1, - 45 => 1, - 50 => 1, - 57 => 2, - 59 => 2, - 62 => 1, - 73 => 1, - 77 => 1, - 84 => 1, - 97 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css deleted file mode 100644 index 391bc85..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css +++ /dev/null @@ -1,42 +0,0 @@ -body { -font-family: Arial, Helvetica, sans-serif; -margin : 40px 0 0 0; -padding : 0; -background: #8FB7DB url(diag_lines_bg.gif) top left; -margin-top: -10px; -margin-bottom: -0px; -} - -.TableWidgetType .recover:hover { - background-color: #FFF; -} - -#clearCache-settings:rootNodes-list_0 { - border-top: none; -} - -.LookupEditScreenWidgetType-urls a, .LookupEditScreenWidgetType-urls a:visited { - text-decoration: none; - color: #444; -} - -/* checking embedded PHP */ -li { - background:url(/images//bullet.gif) left px no-repeat; - margin:0px; - padding-left:10px; - margin-bottom:px; - margin-top: px; - line-height:13px; - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#2e62a8, endColorstr=#123363); -} - -/* Empty style defs. */ -.p { - margin:; - margin-right: - margin-left: 10px; - float:/* Some comment. */ ; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css.fixed deleted file mode 100644 index e68bddc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css.fixed +++ /dev/null @@ -1,40 +0,0 @@ -body { -font-family: Arial, Helvetica, sans-serif; -margin: 40px 0 0 0; -padding: 0; -background: #8FB7DB url(diag_lines_bg.gif) top left; -margin-top: 10px; -margin-bottom: 0px; -} - -.TableWidgetType .recover:hover { - background-color: #FFF; -} - -#clearCache-settings:rootNodes-list_0 { - border-top: none; -} - -.LookupEditScreenWidgetType-urls a, .LookupEditScreenWidgetType-urls a:visited { - text-decoration: none; - color: #444; -} - -/* checking embedded PHP */ -li { - background: url(/images//bullet.gif) left px no-repeat; - margin: 0px; - padding-left: 10px; - margin-bottom: px; - margin-top: px; - line-height: 13px; - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#2e62a8, endColorstr=#123363); -} - -/* Empty style defs. */ -.p { - margin:; - margin-right: - margin-left: 10px; - float: /* Some comment. */ ; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.php deleted file mode 100644 index 9b8aa10..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ColonSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 4 => 2, - 5 => 1, - 6 => 1, - 8 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - 30 => 1, - 32 => 1, - 41 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css deleted file mode 100644 index 2dfd22a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css +++ /dev/null @@ -1,16 +0,0 @@ -#title-bar-bottom-right { - background-color: #333333; - padding: 10px; - border-bottom: 1px dotted #F0F0F0; - border-top: 1px dotted #FF00FF; - background: #08f7db url(diag_lines_bg.gif) top left; - - /* The sniff only deals with HEX colours. */ - color: DarkSlateGray; - background-color: rgb(255, 0, 0); - background-color: rgba(0, 0, 255, 0.3); - background-color: hsl(120, 100%, 50%); -} - -#add-new-comment { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css.fixed deleted file mode 100644 index 039209d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css.fixed +++ /dev/null @@ -1,16 +0,0 @@ -#title-bar-bottom-right { - background-color: #333; - padding: 10px; - border-bottom: 1px dotted #F0F0F0; - border-top: 1px dotted #F0F; - background: #08F7DB url(diag_lines_bg.gif) top left; - - /* The sniff only deals with HEX colours. */ - color: DarkSlateGray; - background-color: rgb(255, 0, 0); - background-color: rgba(0, 0, 255, 0.3); - background-color: hsl(120, 100%, 50%); -} - -#add-new-comment { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.php deleted file mode 100644 index d535fdc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ColourDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 5 => 1, - 6 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css deleted file mode 100644 index 4c11bea..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css +++ /dev/null @@ -1,17 +0,0 @@ -.SettingsTabPaneWidgetType-tab-mid { - background: transparent url(tab_inact_mid.png) repeat-x; - height: 100%;float: left; - line-height: -25px; - cursor: pointer; margin: 10px; float: right; -} - -/* testing embedded PHP */ -li { - background:url(/images//bullet.gif) left px no-repeat; margin:0px; padding-left:10px; margin-bottom:px; line-height:13px; - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#2e62a8, endColorstr=#123363); -} - -/* Document handling of comments and annotations. */ -div#annotations {-webkit-tap-highlight-color:transparent;/* phpcs:disable Standard.Cat.SniffName */-webkit-touch-callout:none;/*phpcs:enable*/-webkit-user-select:none;} - -div#comments {height:100%;/*comment*/width:100%;} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css.fixed deleted file mode 100644 index 93a7815..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css.fixed +++ /dev/null @@ -1,27 +0,0 @@ -.SettingsTabPaneWidgetType-tab-mid { - background: transparent url(tab_inact_mid.png) repeat-x; - height: 100%; -float: left; - line-height: -25px; - cursor: pointer; -margin: 10px; -float: right; -} - -/* testing embedded PHP */ -li { - background:url(/images//bullet.gif) left px no-repeat; -margin:0px; -padding-left:10px; -margin-bottom:px; -line-height:13px; - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#2e62a8, endColorstr=#123363); -} - -/* Document handling of comments and annotations. */ -div#annotations {-webkit-tap-highlight-color:transparent;/* phpcs:disable Standard.Cat.SniffName */ --webkit-touch-callout:none;/*phpcs:enable*/ --webkit-user-select:none;} - -div#comments {height:100%;/*comment*/ -width:100%;} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.php deleted file mode 100644 index 8e3b487..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowMultipleStyleDefinitionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 2, - 10 => 4, - 15 => 2, - 17 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.css deleted file mode 100644 index 8ac9501..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.css +++ /dev/null @@ -1,103 +0,0 @@ -.AssetLineageWidgetType-item { - color: #FFF; -} - -.AssetLineageWidgetType-title { - color: #CCC; -} - -.AssetLineageWidgetType-item { - color: #CCC; -} - -.AssetLineageWidgetType-item .selected { -} - -.AssetLineageWidgetType-item.selected { -} - -#Blah .AssetLineageWidgetType-item { -} - -#X.selected, -.AssetLineageWidgetType-item { -} - -.MyClass, .YourClass { -} - -.YourClass, .MyClass { -} - -.YourClass, .MyClass, .OurClass { -} - - -.ClassAtTopOfMediaBlock { -} - -@media print { - .ClassAtTopOfMediaBlock { - } - - .ClassInMultipleMediaBlocks { - } -} - -.ClassNotAtTopOfMediaBlock { -} - -@media handheld { - .SameClassInMediaBlock { - } - - .ClassNotAtTopOfMediaBlock { - } - - .SameClassInMediaBlock { - } -} - -@media braille { - .PlaceholderClass { - } - - .ClassNotAtTopOfMediaBlock { - } - - .ClassInMultipleMediaBlocks { - } -} - -.foo /* any comment */ -{ color: red; } - -/* print comment */ -@media print { - /* comment1 */ - td { - } - - /* comment2 */ - img { - } - - /* comment3 */ - td { - } -} - -@media handheld /* handheld comment */ -{ - td /* comment1 */ - { - } - - img /* comment2 */ - { - } - - td /* comment3 */ - { - } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.php deleted file mode 100644 index 2a95971..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DuplicateClassDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 29 => 1, - 57 => 1, - 86 => 1, - 101 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.css deleted file mode 100644 index c9c849f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.css +++ /dev/null @@ -1,27 +0,0 @@ -.ViperSubToolbar-wrapper { - height: 34px; - left: 0; - position: fixed; - top: 60px; - z-index: 997; - left: 50%; -} - -.expandable { - -moz-transition-property: margin-left, margin-right; - -moz-transition-duration: 0.2s; - -moz-transition-timing-function: ease; - -webkit-transition-property: margin-left, margin-right; - -webkit-transition-duration: 0.2s; - -webkit-transition-timing-function: ease; - z-index: 2; -} - -@media only screen and (max-width: 480px) { - header nav.meta a { display: none; } - header nav.meta a.search { display: block; } -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.php deleted file mode 100644 index c555461..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DuplicateStyleDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [7 => 1]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.css deleted file mode 100644 index 801dcda..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.css +++ /dev/null @@ -1,15 +0,0 @@ -.HelpWidgetType-new-bug-title {} -.HelpWidgetType-new-bug-title { -} -.HelpWidgetType-new-bug-title { - -} -.HelpWidgetType-new-bug-title { - -} -.HelpWidgetType-new-bug-title { - /* Nothing to see here */ -} -.HelpWidgetType-new-bug-title { - float: left; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.php deleted file mode 100644 index b3fd318..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class EmptyClassDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 1 => 1, - 2 => 1, - 4 => 1, - 7 => 1, - 10 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.css deleted file mode 100644 index 24910b7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.css +++ /dev/null @@ -1,11 +0,0 @@ -#MetadataAdminScreen-addField-fieldType { - margin-left: 10px; - margin-right: - float: ; -} - -#MetadataAdminScreen-addField-fieldType li { - margin-right: /* @todo */ - margin-left: 10px; - float: /* Some comment. */ ; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.php deleted file mode 100644 index f5bc858..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class EmptyStyleDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 4 => 1, - 8 => 1, - 10 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css deleted file mode 100644 index dbd5487..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css +++ /dev/null @@ -1,18 +0,0 @@ -#add-new-comment { - -moz-border-radius: 1px; - -webkit-border-radius: 1px; - border-radius: 1px; - - -moz-border-radius-topleft: 1px; - -moz-border-radius-topright: 1px; - -moz-border-radius-bottomright: 1px; - -moz-border-radius-bottomleft: 1px; - border-top-left-radius: 1px; - border-top-right-radius: 1px; - border-bottom-right-radius: 1px; - border-bottom-left-radius: 1px; - - -moz-box-shadow: 1px; - -webkit-box-shadow: 1px; - box-shadow: 1px; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css.fixed deleted file mode 100644 index a8ea270..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css.fixed +++ /dev/null @@ -1,18 +0,0 @@ -#add-new-comment { - border-radius: 1px; - border-radius: 1px; - border-radius: 1px; - - border-top-left-radius: 1px; - border-top-right-radius: 1px; - border-bottom-right-radius: 1px; - border-bottom-left-radius: 1px; - border-top-left-radius: 1px; - border-top-right-radius: 1px; - border-bottom-right-radius: 1px; - border-bottom-left-radius: 1px; - - box-shadow: 1px; - box-shadow: 1px; - box-shadow: 1px; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.php deleted file mode 100644 index 28aa8ec..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ForbiddenStylesUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 3 => 1, - 6 => 1, - 7 => 1, - 8 => 1, - 9 => 1, - 15 => 1, - 16 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css deleted file mode 100644 index 216f00e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css +++ /dev/null @@ -1,79 +0,0 @@ -body { - - font-family: Arial, Helvetica, sans-serif; - margin: 40px 0 0 0; -padding: 0; - background: #8FB7DB url(diag_lines_bg.gif) top left; - -} - -td { - margin: 40px; - - padding: 20px; -} - -/* -#AdminScreenModeWidgetType-tab_pane-containers .TabPaneWidgetType-tab-selected-left { - background: transparent url(images/ScreenImages/tab_on_left.png) no-repeat; -} -#AdminScreenModeWidgetType-tab_pane-containers .TabPaneWidgetType-tab-selected-right { - background: transparent url(images/ScreenImages/tab_on_right.png) no-repeat; -} -*/ - -.GUITextBox.container:after {} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - padding: 20px; - margin: 40px; - } -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - - header #logo img { - min-width: 100%; - } - -} - -td { - margin: 40px; - - padding: 20px; - - -} - -.GUIFileUpload { -/* opacity: 0.25; */ -} - -.foo -{ - border: none; -} - -.mortgage-calculator h2 { - background: #072237; - color: #fff; - font-weight: normal; - height: 50px; - line-height: 50px; - padding: 0 0 0 30px; - } - -.WhitelistCommentIndentationShouldBeIgnored { -/* phpcs:disable Standard.Category.Sniff -- for reasons. */ -} - -/* syntax error */ ---------------------------------------------- */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css.fixed deleted file mode 100644 index 1fd128a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css.fixed +++ /dev/null @@ -1,73 +0,0 @@ -body { - font-family: Arial, Helvetica, sans-serif; - margin: 40px 0 0 0; - padding: 0; - background: #8FB7DB url(diag_lines_bg.gif) top left; -} - -td { - margin: 40px; - padding: 20px; -} - -/* -#AdminScreenModeWidgetType-tab_pane-containers .TabPaneWidgetType-tab-selected-left { - background: transparent url(images/ScreenImages/tab_on_left.png) no-repeat; -} -#AdminScreenModeWidgetType-tab_pane-containers .TabPaneWidgetType-tab-selected-right { - background: transparent url(images/ScreenImages/tab_on_right.png) no-repeat; -} -*/ - -.GUITextBox.container:after {} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - padding: 20px; - margin: 40px; - } -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - - header #logo img { - min-width: 100%; - } - -} - -td { - margin: 40px; - padding: 20px; -} - -.GUIFileUpload { -/* opacity: 0.25; */ -} - -.foo -{ - border: none; -} - -.mortgage-calculator h2 { - background: #072237; - color: #fff; - font-weight: normal; - height: 50px; - line-height: 50px; - padding: 0 0 0 30px; -} - -.WhitelistCommentIndentationShouldBeIgnored { -/* phpcs:disable Standard.Category.Sniff -- for reasons. */ -} - -/* syntax error */ ---------------------------------------------- */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.2.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.2.css deleted file mode 100644 index 48b22f6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.2.css +++ /dev/null @@ -1,3 +0,0 @@ -/* Live coding. Has to be the last (only) test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.php deleted file mode 100644 index 9413b4f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class IndentationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'IndentationUnitTest.1.css': - return [ - 2 => 1, - 3 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 12 => 1, - 30 => 1, - 32 => 1, - 50 => 1, - 52 => 1, - 53 => 1, - 66 => 1, - 67 => 1, - 68 => 1, - 69 => 1, - 70 => 1, - 71 => 1, - 72 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.css deleted file mode 100644 index d0f2982..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.css +++ /dev/null @@ -1,14 +0,0 @@ -.SettingsTabPaneWidgetType-tab-mid { - font-family: Arial; - Font-Family: arial; - background-color: #DA9393; - BACKGROUND-IMAGE: URL(Warning_Close.png); -} - -@media screen and (max-device-width: 769px) { - - .SettingsTabPaneWidgetType-tab-mid { - Font-Family: arial; - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#2e62a8, endColorstr=#123363); - } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.php deleted file mode 100644 index 1a25aaa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LowercaseStyleDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 3 => 1, - 5 => 2, - 11 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.css deleted file mode 100644 index 6c947e5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.css +++ /dev/null @@ -1,21 +0,0 @@ -.my-style { - margin-right 15px; - float: left; - margin-left 15px; - margin-top: 15px; - margin-bottom 15px; -} - -@media screen and (max-device-width: 769px) { - header #logo img { - max-width: 100%; - margin-bottom 15px; - } -} - -#foo { background-color: #FF0000; -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.php deleted file mode 100644 index dc0809e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class MissingColonUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 4 => 1, - 6 => 1, - 12 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.css deleted file mode 100644 index 05637a6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.css +++ /dev/null @@ -1,25 +0,0 @@ -#red { - background-color: red; -} - -.red { - border-bottom: 1px dotted black; - border-top: 1px dotted gray; -} - -#red.yellow { - background: yellow url(diag_lines_bg.gif) top left; - text-shadow: 0 1px 0 white; -} - -.something--white { - border: 0; -} - -.something--------------white { - border: 0; -} - -.-white { - border: 0; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.php deleted file mode 100644 index a8032fa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class NamedColoursUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 6 => 1, - 7 => 1, - 11 => 1, - 12 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css deleted file mode 100644 index c656c78..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css +++ /dev/null @@ -1,35 +0,0 @@ -.my-style { - opacity: 0; - opacity: 0.0; - opacity: 1; - opacity: 1.0; - opacity: 1.5; - opacity: .5; - opacity: 0.5; - opacity: 2; - opacity: -1; - opacity: 0.55; -} - -div { - font-size: 1.2em; - background: linear-gradient(to bottom, #00F, #0F0) repeat scroll 50% 50% #EEE; - min-width: 250px; - max-width: 100%; - padding-bottom: 50px; - box-shadow: 2px -3px 3px rgba(100, 100, 100, 0.33); - border-left: 1px solid #000; - border-right: 1px solid #000; - border-top: 1px solid #000; - border-bottom: 1px dotted #000; - background: url(../1/2/3/4-5-6_7_100x100.png) repeat scroll 50% 50% #EEE; - opacity: -1; -} - -.my-commented-style { - opacity: /*comment*/ 0; - opacity: /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ - 0.0; - opacity: /*comment*/ 1.0; - opacity: /*comment*/ .5; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css.fixed deleted file mode 100644 index 257e41a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css.fixed +++ /dev/null @@ -1,35 +0,0 @@ -.my-style { - opacity: 0; - opacity: 0; - opacity: 1; - opacity: 1; - opacity: 1.5; - opacity: 0.5; - opacity: 0.5; - opacity: 2; - opacity: -1; - opacity: 0.55; -} - -div { - font-size: 1.2em; - background: linear-gradient(to bottom, #00F, #0F0) repeat scroll 50% 50% #EEE; - min-width: 250px; - max-width: 100%; - padding-bottom: 50px; - box-shadow: 2px -3px 3px rgba(100, 100, 100, 0.33); - border-left: 1px solid #000; - border-right: 1px solid #000; - border-top: 1px solid #000; - border-bottom: 1px dotted #000; - background: url(../1/2/3/4-5-6_7_100x100.png) repeat scroll 50% 50% #EEE; - opacity: -1; -} - -.my-commented-style { - opacity: /*comment*/ 0; - opacity: /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ - 0; - opacity: /*comment*/ 1; - opacity: /*comment*/ 0.5; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.php deleted file mode 100644 index 9fe839d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class OpacityUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 9 => 1, - 10 => 1, - 11 => 1, - 26 => 1, - 32 => 1, - 33 => 1, - 34 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css deleted file mode 100644 index 3ccb162..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css +++ /dev/null @@ -1,61 +0,0 @@ -.HelpWidgetType-new-bug-title { - width: 308px - float: left; -} - -#MetadataAdminScreen-addField-add { - float: left ; -} - -.TableWidgetType .recover:hover { - background-color: #FFF; -} - -#clearCache-settings:rootNodes-list_0 { - border-top: none; -} - -.HelpWidgetType-list { - list-style-image: url(); -} - -@media (min-width: 320px) and (max-width: 961px) { - .tooltipsrt:hover span.tltp, - .tooltipstp:hover span.tltp { - visibility: hidden; - } -} - -#single-line-multi-statement-no-semicolon { - padding: 0 border: 20; -} - -#multi-line-style-no-semicolon { - padding: 0 /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ - border: - 20 - margin: - 0px /* top */ - 10px /* right + left */ -} - -#multi-line-style-whitespace { - padding: 0 /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ ; - border: - 20 ; - margin: - 10px /* top */ - 0px /* right + left */ - - - ; -} - -.allow-for-star-hack { - cursor: pointer; - *cursor: hand; -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css.fixed deleted file mode 100644 index 7efef58..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css.fixed +++ /dev/null @@ -1,58 +0,0 @@ -.HelpWidgetType-new-bug-title { - width: 308px - float: left; -} - -#MetadataAdminScreen-addField-add { - float: left; -} - -.TableWidgetType .recover:hover { - background-color: #FFF; -} - -#clearCache-settings:rootNodes-list_0 { - border-top: none; -} - -.HelpWidgetType-list { - list-style-image: url(); -} - -@media (min-width: 320px) and (max-width: 961px) { - .tooltipsrt:hover span.tltp, - .tooltipstp:hover span.tltp { - visibility: hidden; - } -} - -#single-line-multi-statement-no-semicolon { - padding: 0 border: 20; -} - -#multi-line-style-no-semicolon { - padding: 0 /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ - border: - 20 - margin: - 0px /* top */ - 10px /* right + left */ -} - -#multi-line-style-whitespace { - padding: 0; /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ - border: - 20; - margin: - 10px /* top */ - 0px; /* right + left */ -} - -.allow-for-star-hack { - cursor: pointer; - *cursor: hand; -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.php deleted file mode 100644 index 897df65..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class SemicolonSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 7 => 1, - 30 => 1, - 34 => 1, - 36 => 1, - 39 => 1, - 43 => 1, - 45 => 1, - 48 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.css deleted file mode 100644 index cfc4503..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.css +++ /dev/null @@ -1,45 +0,0 @@ -#add-new-comment { - background-color: #333333; - padding: 10px; - border-bottom: 1px dotted #F0F0F0; - border-top: 1px dotted #FF00FF; - background: #8fb7db url(diag_lines_bg.gif) top left; - tab-size: 1; - margin: 8px 8px 8px 8px; - margin: 8px 8px; - margin: 0 0 0 0; - margin: 0 8px 0 8px; - margin: 8px 4px 8px 4px; - margin: 8px 4% 8px 4%; - margin: 6px 2px 9px 2px; - margin: 6px 2px 9px; - border-radius: 2px 2px 2px 2px !important; - border-width: 2px 2px 2px 2px; - border-width: 1px 2px 2px 4px; - margin: 97px auto 0 auto; - text-shadow: 0 1px 0 #fff; - border-width: - 2px - 4px - 2px - 4px; - - /* These are style names excluded from this rule. */ - background-position: 0 0; - box-shadow: 2px 2px 2px 2px; - transform-origin: 0 110% 0; - - /* Sizes with comments between them will be ignored for the purposes of this sniff. */ - margin: 8px /*top*/ 8px /*right*/ 8px /*bottom*/ 8px /*left*/; - - /* Same with PHPCS annotations. */ - border-width: - 2px /* phpcs:ignore Standard.Category.SniffName -- for reasons */ - 4px - 2px /* phpcs:disable Standard.Category.SniffName -- for reasons */ - 4px; -} - -/* Intentional parse error. Live coding resilience. This has to be the last test in the file. */ -#live-coding { - margin: 8px 8px 8px 8px diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.css.fixed deleted file mode 100644 index 3472cb1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.css.fixed +++ /dev/null @@ -1,41 +0,0 @@ -#add-new-comment { - background-color: #333333; - padding: 10px; - border-bottom: 1px dotted #F0F0F0; - border-top: 1px dotted #FF00FF; - background: #8fb7db url(diag_lines_bg.gif) top left; - tab-size: 1; - margin: 8px; - margin: 8px; - margin: 0; - margin: 0 8px; - margin: 8px 4px; - margin: 8px 4%; - margin: 6px 2px 9px 2px; - margin: 6px 2px 9px 2px; - border-radius: 2px !important; - border-width: 2px; - border-width: 1px 2px 2px 4px; - margin: 97px auto 0 auto; - text-shadow: 0 1px 0 #fff; - border-width: 2px 4px; - - /* These are style names excluded from this rule. */ - background-position: 0 0; - box-shadow: 2px 2px 2px 2px; - transform-origin: 0 110% 0; - - /* Sizes with comments between them will be ignored for the purposes of this sniff. */ - margin: 8px /*top*/ 8px /*right*/ 8px /*bottom*/ 8px /*left*/; - - /* Same with PHPCS annotations. */ - border-width: - 2px /* phpcs:ignore Standard.Category.SniffName -- for reasons */ - 4px - 2px /* phpcs:disable Standard.Category.SniffName -- for reasons */ - 4px; -} - -/* Intentional parse error. Live coding resilience. This has to be the last test in the file. */ -#live-coding { - margin: 8px 8px 8px 8px diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.php deleted file mode 100644 index 3d0baaa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ShorthandSizeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 8 => 1, - 9 => 1, - 10 => 1, - 11 => 1, - 12 => 1, - 13 => 1, - 15 => 1, - 16 => 1, - 17 => 1, - 21 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.inc deleted file mode 100644 index 43ef6c9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.inc +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClassDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 6 => 1, - 10 => 1, - 15 => 2, - 18 => 1, - 22 => 4, - 23 => 4, - 24 => 4, - 27 => 2, - 30 => 2, - 34 => 1, - 35 => 1, - 39 => 1, - 42 => 1, - 45 => 1, - 48 => 1, - 50 => 2, - 51 => 1, - 55 => 1, - 59 => 4, - 63 => 1, - 65 => 1, - 69 => 3, - 74 => 2, - 77 => 1, - 80 => 1, - 85 => 3, - 89 => 1, - 92 => 1, - 97 => 1, - 108 => 1, - 114 => 1, - 116 => 1, - 118 => 1, - 121 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameUnitTest.inc deleted file mode 100644 index a346a00..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameUnitTest.inc +++ /dev/null @@ -1,37 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameUnitTest.php deleted file mode 100644 index b229a2f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameUnitTest.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClassFileNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 11 => 1, - 12 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - 16 => 1, - 17 => 1, - 18 => 1, - 19 => 1, - 23 => 1, - 24 => 1, - 25 => 1, - 26 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - 30 => 1, - 31 => 1, - 32 => 1, - 33 => 1, - 34 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.js deleted file mode 100644 index 04126f8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.js +++ /dev/null @@ -1,45 +0,0 @@ -var x = { - abc: 1, - zyz: 2, - abc: 5, - mno: { - abc: 4 - }, - abc: 5 - - this.request({ - action: 'getSubmissions' - }); - - this.request({ - action: 'deleteSubmission' - }); -} - - -LinkingEditScreenWidgetType.prototype = { - - _addDeleteButtonEvent: function(parentid) - { - var params = { - screen: 'LinkingEditScreenWidget', - assetid: self.assetid, - parentid: parentid, - assetid: parentid, - op: 'deleteLink' - }; - - }, - - saveDesignEdit: function() - { - var params = { - screen: [this.id, 'Widget'].join(''), - assetid: this.assetid, - changes: dfx.jsonEncode(this.currnetLinksWdgt.getChanges()), - op: 'saveLinkEdit' - }; - - } - -}; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.php deleted file mode 100644 index 1b71eb2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DuplicatePropertyUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 8 => 1, - 28 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.inc deleted file mode 100644 index 511bbe4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.inc +++ /dev/null @@ -1,13 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LowercaseClassKeywordsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - $errors = [ - 2 => 3, - 3 => 3, - 4 => 1, - 5 => 1, - 9 => 1, - 10 => 1, - 13 => 1, - ]; - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc deleted file mode 100644 index 0a0729a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc +++ /dev/null @@ -1,174 +0,0 @@ -testResults; - - - // Correct call to self. - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = parent::selfMemberReferenceUnitTestFunction(); - - // Incorrect case. - $testResults[] = Self::selfMemberReferenceUnitTestFunction(); - $testResults[] = SELF::selfMemberReferenceUnitTestFunction(); - $testResults[] = SelfMemberReferenceUnitTestExample::selfMemberReferenceUnitTestFunction(); - - - // Incorrect spacing. - $testResults[] = self ::selfMemberReferenceUnitTestFunction(); - $testResults[] = self:: selfMemberReferenceUnitTestFunction(); - $testResults[] = self :: selfMemberReferenceUnitTestFunction(); - - // Remove ALL the newlines - $testResults[] = self - - - - - :: - - - - - selfMemberReferenceUnitTestFunction(); - - } - - - function selfMemberReferenceUnitTestFunction() - { - $this->testCount = $this->testCount + 1; - return $this->testCount; - - } - - -} - - -class MyClass { - - public static function test($value) { - echo "$value\n"; - } - - public static function walk() { - $callback = function($value, $key) { - // This is valid because you can't use self:: in a closure. - MyClass::test($value); - }; - - $array = array(1,2,3); - array_walk($array, $callback); - } -} - -MyClass::walk(); - -class Controller -{ - public function Action() - { - Doctrine\Common\Util\Debug::dump(); - } -} - -class Foo -{ - public static function bar() - { - \Foo::baz(); - } -} - -namespace TYPO3\CMS\Reports; - -class Status { - const NOTICE = -2; - const INFO = -1; - const OK = 0; - const WARNING = 1; - const ERROR = 2; -} - -namespace TYPO3\CMS\Reports\Report\Status; - -class Status implements \TYPO3\CMS\Reports\ReportInterface { - public function getHighestSeverity(array $statusCollection) { - $highestSeverity = \TYPO3\CMS\Reports\Status::NOTICE; - } -} - -namespace Foo; - -class Bar { - - function myFunction() - { - \Foo\Whatever::something(); - \Foo\Bar::something(); - } -} - -namespace Foo\Bar; - -class Baz { - - function myFunction() - { - \Foo\Bar\Whatever::something(); - \Foo\Bar\Baz::something(); - } -} - -class Nested_Anon_Class { - public function getAnonymousClass() { - // Spacing/comments should not cause false negatives for the NotUsed error. - Nested_Anon_Class :: $prop; - Nested_Anon_Class - /* some comment */ - - :: - - // phpcs:ignore Standard.Category.SniffName -- for reasons. - Bar(); - - // Anonymous class is a different scope. - return new class() { - public function nested_function() { - Nested_Anon_Class::$prop; - Nested_Anon_Class::BAR; - } - }; - } -} - -// Test dealing with scoped namespaces. -namespace Foo\Baz { - class BarFoo { - public function foo() { - echo Foo\Baz\BarFoo::$prop; - } - } -} - -// Prevent false negative when namespace has whitespace/comments. -namespace Foo /*comment*/ \ Bah { - class BarFoo { - public function foo() { - echo Foo \ /*comment*/ Bah\BarFoo::$prop; - } - } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc.fixed deleted file mode 100644 index f2c1731..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc.fixed +++ /dev/null @@ -1,162 +0,0 @@ -testResults; - - - // Correct call to self. - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = parent::selfMemberReferenceUnitTestFunction(); - - // Incorrect case. - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - - - // Incorrect spacing. - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - - // Remove ALL the newlines - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - - } - - - function selfMemberReferenceUnitTestFunction() - { - $this->testCount = $this->testCount + 1; - return $this->testCount; - - } - - -} - - -class MyClass { - - public static function test($value) { - echo "$value\n"; - } - - public static function walk() { - $callback = function($value, $key) { - // This is valid because you can't use self:: in a closure. - MyClass::test($value); - }; - - $array = array(1,2,3); - array_walk($array, $callback); - } -} - -MyClass::walk(); - -class Controller -{ - public function Action() - { - Doctrine\Common\Util\Debug::dump(); - } -} - -class Foo -{ - public static function bar() - { - self::baz(); - } -} - -namespace TYPO3\CMS\Reports; - -class Status { - const NOTICE = -2; - const INFO = -1; - const OK = 0; - const WARNING = 1; - const ERROR = 2; -} - -namespace TYPO3\CMS\Reports\Report\Status; - -class Status implements \TYPO3\CMS\Reports\ReportInterface { - public function getHighestSeverity(array $statusCollection) { - $highestSeverity = \TYPO3\CMS\Reports\Status::NOTICE; - } -} - -namespace Foo; - -class Bar { - - function myFunction() - { - \Foo\Whatever::something(); - self::something(); - } -} - -namespace Foo\Bar; - -class Baz { - - function myFunction() - { - \Foo\Bar\Whatever::something(); - self::something(); - } -} - -class Nested_Anon_Class { - public function getAnonymousClass() { - // Spacing/comments should not cause false negatives for the NotUsed error. - self::$prop; - - /* some comment */ - - self::// phpcs:ignore Standard.Category.SniffName -- for reasons. - Bar(); - - // Anonymous class is a different scope. - return new class() { - public function nested_function() { - Nested_Anon_Class::$prop; - Nested_Anon_Class::BAR; - } - }; - } -} - -// Test dealing with scoped namespaces. -namespace Foo\Baz { - class BarFoo { - public function foo() { - echo self::$prop; - } - } -} - -// Prevent false negative when namespace has whitespace/comments. -namespace Foo /*comment*/ \ Bah { - class BarFoo { - public function foo() { - echo /*comment*/ self::$prop; - } - } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.php deleted file mode 100644 index ea493d3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class SelfMemberReferenceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 24 => 1, - 25 => 1, - 26 => 1, - 30 => 1, - 31 => 1, - 32 => 2, - 40 => 2, - 92 => 1, - 121 => 1, - 132 => 1, - 139 => 3, - 140 => 1, - 143 => 2, - 162 => 1, - 171 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.inc deleted file mode 100644 index aadbab5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.inc +++ /dev/null @@ -1,147 +0,0 @@ -anonymous = new class extends ArrayObject - { - public function __construct() - { - parent::__construct(['a' => 1, 'b' => 2]); - } - }; - } -} - -// Valid interface name. -interface ValidCamelCaseClass extends MyClass {} - - -// Incorrect usage of camel case. -interface invalidCamelCaseClass extends MyClass {} -interface Invalid_Camel_Case_Class_With_Underscores implements MyClass {} - - -// All lowercase. -interface invalidlowercaseclass extends MyClass {} -interface invalid_lowercase_class_with_underscores extends MyClass {} - - -// All uppercase. -interface VALIDUPPERCASECLASS extends MyClass {} -interface INVALID_UPPERCASE_CLASS_WITH_UNDERSCORES extends MyClass {} - - -// Mix camel case with uppercase. -interface ValidCamelCaseClassWithUPPERCASE extends MyClass {} - - -// Usage of numeric characters. -interface ValidCamelCaseClassWith1Number extends MyClass {} -interface ValidCamelCaseClassWith12345Numbers extends MyClass {} -interface 5InvalidCamelCaseClassStartingWithNumber extends MyClass {} -interface ValidCamelCaseClassEndingWithNumber5 extends MyClass {} -interface 12345 extends MyClass {} - -interface Testing{} - -interface Base -{ - protected $anonymous; - - public function __construct(); -} - - -// Valid trait name. -trait ValidCamelCaseClass extends MyClass {} - - -// Incorrect usage of camel case. -trait invalidCamelCaseClass extends MyClass {} -trait Invalid_Camel_Case_Class_With_Underscores implements MyClass {} - - -// All lowercase. -trait invalidlowercaseclass extends MyClass {} -trait invalid_lowercase_class_with_underscores extends MyClass {} - - -// All uppercase. -trait VALIDUPPERCASECLASS extends MyClass {} -trait INVALID_UPPERCASE_CLASS_WITH_UNDERSCORES extends MyClass {} - - -// Mix camel case with uppercase. -trait ValidCamelCaseClassWithUPPERCASE extends MyClass {} - - -// Usage of numeric characters. -trait ValidCamelCaseClassWith1Number extends MyClass {} -trait ValidCamelCaseClassWith12345Numbers extends MyClass {} -trait 5InvalidCamelCaseClassStartingWithNumber extends MyClass {} -trait ValidCamelCaseClassEndingWithNumber5 extends MyClass {} -trait 12345 extends MyClass {} - -trait Testing{} - -trait Base -{ - protected $anonymous; - - public function __construct() - { - $this->anonymous = new class extends ArrayObject - { - public function __construct() - { - parent::__construct(['a' => 1, 'b' => 2]); - } - }; - } -} - -if ( class_exists( Test :: class ) ) {} -if ( class_exists( Test2 ::class ) ) {} - -$foo = new class( - new class implements Countable { - } -) extends DateTime { -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.php deleted file mode 100644 index 70777c5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ValidClassNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 10 => 1, - 14 => 1, - 15 => 1, - 20 => 1, - 30 => 1, - 32 => 1, - 57 => 1, - 58 => 1, - 62 => 1, - 63 => 1, - 68 => 1, - 78 => 1, - 80 => 1, - 97 => 1, - 98 => 1, - 102 => 1, - 103 => 1, - 108 => 1, - 118 => 1, - 120 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.inc deleted file mode 100644 index 877bca6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.inc +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class BlockCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - $config->tabWidth = 4; - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - $errors = [ - 3 => 1, - 8 => 1, - 20 => 1, - 24 => 1, - 30 => 1, - 31 => 1, - 34 => 1, - 40 => 1, - 45 => 1, - 49 => 1, - 51 => 1, - 53 => 1, - 57 => 1, - 60 => 1, - 61 => 1, - 63 => 1, - 65 => 1, - 68 => 1, - 70 => 1, - 72 => 1, - 75 => 1, - 84 => 1, - 87 => 1, - 89 => 1, - 92 => 1, - 111 => 1, - 159 => 1, - 181 => 1, - 188 => 1, - 208 => 1, - 214 => 1, - 226 => 1, - 227 => 1, - 232 => 1, - 233 => 1, - 256 => 1, - ]; - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClassCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClassCommentUnitTest.inc deleted file mode 100644 index eefa44c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClassCommentUnitTest.inc +++ /dev/null @@ -1,125 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClassCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 15 => 1, - 31 => 1, - 54 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 29 => 1, - 30 => 1, - 50 => 1, - 66 => 1, - 67 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.inc deleted file mode 100644 index 9c3255c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.inc +++ /dev/null @@ -1,82 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.php deleted file mode 100644 index cdc89ba..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClosingDeclarationCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 13 => 1, - 17 => 1, - 31 => 1, - 41 => 1, - 59 => 1, - 63 => 1, - 67 => 1, - 79 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [71 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc deleted file mode 100644 index e7d880d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc +++ /dev/null @@ -1,83 +0,0 @@ - line numbers for each token. - * - * Long description with some points: - * - one - * - two - * - three - * - * @param array &$tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to - * process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function myFunction() {} - -class MyClass2 -{ - /** - * Some info about the variable here. - */ - var $x; -} - -/** ************************************************************************ - * Example with no errors. - **************************************************************************/ -function example() {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc.fixed deleted file mode 100644 index 4d8cb39..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc.fixed +++ /dev/null @@ -1,83 +0,0 @@ - line numbers for each token. - * - * Long description with some points: - * - one - * - two - * - three - * - * @param array &$tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to - * process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function myFunction() {} - -class MyClass2 -{ - /** - * Some info about the variable here. - */ - var $x; -} - -/** ************************************************************************ - * Example with no errors. - **************************************************************************/ -function example() {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js deleted file mode 100644 index 6e1a878..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js +++ /dev/null @@ -1,76 +0,0 @@ - -/** -* Some info about the class here - * - */ -foo.prototype = { - - /** - * Some info about the function here. - * - *@return void - */ - bar: function() {} -} - -/** - * Some info about the class here - * - */ -foo.prototype = { - - /** - *Some info about the function here. - * - * @return void - */ - bar: function() {} -} - -/** - * Some info about the class here - * -*/ -foo.prototype = { - - /** - * Some info about the function here. - * - * @return void - */ - bar: function() {} -} - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -function myFunction() -{ - console.info('hi'); - /** - Comment here. - */ -} - -/** - * Creates a map of tokens => line numbers for each token. - * - * Long description with some points: - * - one - * - two - * - three - * - * @param array &$tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to - * process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function myFunction() {} - -$.extend(Datepicker.prototype, { - _widgetDatepicker: function() { - }, - /* Action for selecting a new month/year. */ -}); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js.fixed deleted file mode 100644 index 9edb4cc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js.fixed +++ /dev/null @@ -1,76 +0,0 @@ - -/** - * Some info about the class here - * - */ -foo.prototype = { - - /** - * Some info about the function here. - * - * @return void - */ - bar: function() {} -} - -/** - * Some info about the class here - * - */ -foo.prototype = { - - /** - * Some info about the function here. - * - * @return void - */ - bar: function() {} -} - -/** - * Some info about the class here - * - */ -foo.prototype = { - - /** - * Some info about the function here. - * - * @return void - */ - bar: function() {} -} - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -function myFunction() -{ - console.info('hi'); - /** - Comment here. - */ -} - -/** - * Creates a map of tokens => line numbers for each token. - * - * Long description with some points: - * - one - * - two - * - three - * - * @param array &$tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to - * process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function myFunction() {} - -$.extend(Datepicker.prototype, { - _widgetDatepicker: function() { - }, - /* Action for selecting a new month/year. */ -}); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.php deleted file mode 100644 index 974951c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DocCommentAlignmentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='DocCommentAlignmentUnitTest.inc') - { - $errors = [ - 3 => 1, - 11 => 1, - 17 => 1, - 18 => 1, - 19 => 1, - 23 => 2, - 24 => 1, - 25 => 2, - 26 => 1, - 32 => 1, - 33 => 1, - 38 => 1, - 39 => 1, - ]; - - if ($testFile === 'DocCommentAlignmentUnitTest.inc') { - $errors[75] = 1; - } - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.inc deleted file mode 100644 index cde6e46..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.inc +++ /dev/null @@ -1,55 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.php deleted file mode 100644 index 3c1668e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class EmptyCatchCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 13 => 1, - 33 => 1, - 49 => 1, - 50 => 1, - 51 => 1, - 52 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc deleted file mode 100644 index 1db2861..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc +++ /dev/null @@ -1,43 +0,0 @@ - -* @author -* @copyright 1997~1994 The PHP Group -* @copyright 1994-1997 The PHP Group -* @copyright The PHP Group -* @license http://www.php.net/license/3_0.txt -* @summary An unknown summary tag -* -*/ - - -?> - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc.fixed deleted file mode 100644 index bae8e7f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc.fixed +++ /dev/null @@ -1,43 +0,0 @@ - -* @author -* @copyright 1997 Squiz Pty Ltd (ABN 77 084 670 600) -* @copyright 1994-1997 Squiz Pty Ltd (ABN 77 084 670 600) -* @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) -* @license http://www.php.net/license/3_0.txt -* @summary An unknown summary tag -* -*/ - - -?> - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js deleted file mode 100644 index 57d8d37..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js +++ /dev/null @@ -1,40 +0,0 @@ - - - - -/** -* -* 0Multi-line short description without full stop -* -* -* asdasd -* long description for file (if any) -* asdasdadada -* -* PHP versio -* -* LICENSE: This source file is subject to version 3.0 of the PHP license -* that is available through the world-wide-web at the following URI: -* http://www.php.net/license/3_0.txt. If you did not receive a copy of -* the PHP License and are unable to obtain it through the web, please -* send a note to license@php.net so we can mail you a copy immediately. -* @package SquizCMS -* @package ADDITIONAL PACKAGE TAG -* @subpkg not_camelcased -* @author Antônio Carlos Venâncio Júnior -* @author -* @copyright 1997~1994 The PHP Group -* @copyright 1994-1997 The PHP Group -* @copyright The PHP Group -* @license http://www.php.net/license/3_0.txt -* @summary An unknown summary tag -* -*/ - - -/** -* This bit here is not qualified as file comment -* -* as it is not the first comment in the file -* -*/ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js.fixed deleted file mode 100644 index 82d63d9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js.fixed +++ /dev/null @@ -1,40 +0,0 @@ - - - - -/** -* -* 0Multi-line short description without full stop -* -* -* asdasd -* long description for file (if any) -* asdasdadada -* -* PHP versio -* -* LICENSE: This source file is subject to version 3.0 of the PHP license -* that is available through the world-wide-web at the following URI: -* http://www.php.net/license/3_0.txt. If you did not receive a copy of -* the PHP License and are unable to obtain it through the web, please -* send a note to license@php.net so we can mail you a copy immediately. -* @package SquizCMS -* @package ADDITIONAL PACKAGE TAG -* @subpkg not_camelcased -* @author Squiz Pty Ltd -* @author -* @copyright 1997 Squiz Pty Ltd (ABN 77 084 670 600) -* @copyright 1994-1997 Squiz Pty Ltd (ABN 77 084 670 600) -* @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) -* @license http://www.php.net/license/3_0.txt -* @summary An unknown summary tag -* -*/ - - -/** -* This bit here is not qualified as file comment -* -* as it is not the first comment in the file -* -*/ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.inc deleted file mode 100644 index 520d349..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.inc +++ /dev/null @@ -1,11 +0,0 @@ - - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - */ - -echo 'hi'; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.js deleted file mode 100644 index 4bb4d50..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * File comment. - * - * @package Package - * @subpackage Subpackage - * @author Squiz Pty Ltd - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - */ - -print 'hi'; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.3.inc deleted file mode 100644 index b47603f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.3.inc +++ /dev/null @@ -1,9 +0,0 @@ - - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - * diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.4.inc deleted file mode 100644 index 2fdeeba..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.4.inc +++ /dev/null @@ -1,3 +0,0 @@ - - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - */ - -class Foo { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.php deleted file mode 100644 index b3708e8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.php +++ /dev/null @@ -1,74 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FileCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='FileCommentUnitTest.inc') - { - switch ($testFile) { - case 'FileCommentUnitTest.1.inc': - case 'FileCommentUnitTest.1.js': - return [ - 1 => 1, - 22 => 2, - 23 => 1, - 24 => 2, - 25 => 2, - 26 => 1, - 27 => 2, - 28 => 2, - 32 => 2, - ]; - - case 'FileCommentUnitTest.4.inc': - case 'FileCommentUnitTest.6.inc': - return [1 => 1]; - - case 'FileCommentUnitTest.5.inc': - return [2 => 1]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.inc deleted file mode 100644 index 7e94bb2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.inc +++ /dev/null @@ -1,511 +0,0 @@ -callSomeFunction(); - - }//end okFunction() - - - /** - * Comment inside function. - * - * @throws Exception - */ - function okFunction() - { - /** - * @var FooClass - */ - $foo = FooFactory::factory(); - throw new Exception; - - }//end okFunction - - /** - * Needs at throws tag for rethrown exception, - * even though we have one throws tag. - * - * @throws PHP_Exception1 - */ - public function notOkVariableRethrown() - { - throw new PHP_Exception1('Error'); - - try { - // Do something. - } catch (PHP_Exception2 $e) { - logError(); - throw $e; - } - - }//end notOkVariableRethrown() - - /** - * Needs at throws tag for rethrown exception, - * even though we have one throws tag. - * - * @throws PHP_Exception1 - */ - public function notOkVariableRethrown() - { - throw new PHP_Exception1('Error'); - - try { - // Do something. - } catch (PHP_Exception1 | PHP_Exception2 $e) { - logError(); - throw $e; - } - - }//end notOkVariableRethrown() - - /** - * Has correct throws tags for all exceptions - * - * @throws PHP_Exception1 - * @throws PHP_Exception2 - */ - public function okVariableRethrown() - { - throw new PHP_Exception1('Error'); - - try { - // Do something. - } catch (PHP_Exception2 $e) { - logError(); - throw $e; - } - - }//end okVariableRethrown() - - /** - * Has correct throws tags for all exceptions - * - * @throws PHP_Exception1 - * @throws PHP_Exception2 - */ - public function okVariableMultiRethrown() - { - try { - // Do something. - } catch (PHP_Exception1 | PHP_Exception2 $e) { - logError(); - throw $e; - } - - }//end okVariableMultiRethrown() -}//end class - -class NamespacedException { - /** - * @throws \Exception - */ - public function foo() { - throw new \Exception(); - } - - /** - * @throws \Foo\Bar\FooBarException - */ - public function fooBar2() { - throw new \Foo\Bar\FooBarException(); - } - - /** - * @throws FooBarException - */ - public function fooBar2() { - throw new \Foo\Bar\FooBarException(); - } -} - -class Foo { - /** - * Comment - */ - public function foo() { - }//end foo() - - public function bar() { - throw new Exception(); - } - - /** - * Returns information for a test. - * - * This info includes parameters, their valid values. - * - * @param integer $projectid Id of the project. - * - * @return array - * @throws ChannelException If the project is invalid. - */ - public static function getTestInfo($projectid=NULL) - { - try { - DAL::beginTransaction(); - DAL::commit(); - } catch (DALException $e) { - DAL::rollBack(); - throw new ChannelException($e); - } - } -} - -class Test -{ - /** - * Folder name. - * - * @var string - */ - protected $folderName; - - protected function setUp() - { - parent::setUp(); - - if ( !strlen($this->folderName) ) { - throw new \RuntimeException('The $this->folderName must be specified before proceeding.'); - } - } - - /* - * - */ - protected function foo() - { - } - - /** - * @return Closure - */ - public function getStuff() - { - return function () { - throw new RuntimeException("bam!"); - }; - } -} - -/** - * Class comment. - */ -class A -{ - /** - * Function B. - */ - public function b() - { - return new class { - public function c() - { - throw new \Exception(); - } - } - } -} - -/** - * Class comment. - */ -class A -{ - /** - * Function B. - */ - public function b() - { - return new class { - /** - * Tag and token number mismatch. - * - * @throws PHP_Exception1 - * @throws PHP_Exception2 - */ - public function oneLessThrowsTagNeeded() - { - throw new PHP_Exception1('Error'); - - }//end oneLessThrowsTagNeeded() - } - } -} - -abstract class SomeClass { - /** - * Comment here. - */ - abstract public function getGroups(); -} - -class SomeClass { - /** - * Validates something. - * - * @param string $method The set method parameter. - * - * @return string The validated method. - * - * @throws Prefix_Invalid_Argument_Exception The invalid argument exception. - * @throws InvalidArgumentException The invalid argument exception. - */ - protected function validate_something( $something ) { - if ( ! Prefix_Validator::is_string( $something ) ) { - throw Prefix_Invalid_Argument_Exception::invalid_string_parameter( $something, 'something' ); - } - - if ( ! in_array( $something, $this->valid_http_something, true ) ) { - throw new InvalidArgumentException( sprintf( '%s is not a valid HTTP something', $something ) ); - } - - return $something; - } - - /** - * Comment - * - * @throws Exception1 Comment. - * @throws Exception2 Comment. - * @throws Exception3 Comment. - */ - public function foo() { - switch ($foo) { - case 1: - throw Exception1::a(); - case 2: - throw Exception1::b(); - case 3: - throw Exception1::c(); - case 4: - throw Exception2::a(); - case 5: - throw Exception2::b(); - default: - throw new Exception3; - - } - } -} - -namespace Test\Admin { - class NameSpacedClass { - /** - * @throws \ExceptionFromGlobalNamespace - */ - public function ExceptionInGlobalNamespace() { - throw new \ExceptionFromGlobalNamespace(); - } - - /** - * @throws ExceptionFromSameNamespace - */ - public function ExceptionInSameNamespace() { - throw new ExceptionFromSameNamespace(); - } - - /** - * @throws \Test\Admin\ExceptionFromSameNamespace - */ - public function ExceptionInSameNamespaceToo() { - throw new ExceptionFromSameNamespace(); - } - - /** - * @throws \Different\NameSpaceName\ExceptionFromDifferentNamespace - */ - public function ExceptionInSameNamespaceToo() { - throw new \Different\NameSpaceName\ExceptionFromDifferentNamespace(); - } - } -} - -namespace { - class GlobalNameSpaceClass { - /** - * @throws SomeGlobalException - */ - public function ThrowGlobalException() { - throw new SomeGlobalException(); - } - - /** - * @throws \SomeGlobalException - */ - public function ThrowGlobalExceptionToo() { - throw new SomeGlobalException(); - } - } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.php deleted file mode 100644 index 1e2d07f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionCommentThrowTagUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 21 => 1, - 35 => 1, - 47 => 1, - 61 => 2, - 106 => 1, - 123 => 1, - 200 => 1, - 219 => 1, - 287 => 1, - 397 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc deleted file mode 100644 index 1a70200..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc +++ /dev/null @@ -1,1002 +0,0 @@ -MyClass) - */ -public function caseSensitive($a1, $a2, $a3, arRay $a4, $a5, $a6, myclas $a7) -{ - -}//end caseSensitive() - - -/** - * More type hint check for custom type and array. - * - * @param array $a1 Comment here. - * @param array $a2 Comment here. - * @param MyClass $a3 Comment here. - * @param MyClass $a4 Comment here. - * - * @return array(int => MyClass) - */ -public function typeHint(MyClass $a1, $a2, myclass $a3, $a4) -{ - return (3 => 'myclass obj'); - -}//end typeHint() - - -/** - * Mixed variable type separated by a '|'. - * - * @param array|string $a1 Comment here. - * @param mixed $a2 Comment here. - * @param string|array $a3 Comment here. - * @param MyClass|int $a4 Comment here. - * - * @return bool - */ -public function mixedType($a1, $a2, $a3, $a4) -{ - return true; - -}//end mixedType() - - -/** - * Array type. - * - * @param array(MyClass) $a1 OK. - * @param array() $a2 Invalid type. - * @param array( $a3 Typo. - * @param array(int) $a4 Use 'array(integer)' instead. - * @param array(int => integer) $a5 Use 'array(integer => integer)' instead. - * @param array(integer => bool) $a6 Use 'array(integer => boolean)' instead. - * @param aRRay $a7 Use 'array' instead. - * @param string $a8 String with unknown type hint. - * - * @return int - */ -public function mixedArrayType($a1, $a2, array $a3, $a4, $a5, $a6, $a7, unknownTypeHint $a8) -{ - return 1; - -}//end mixedArrayType() - - -/** - */ -function empty1() -{ -}//end empty1() - - -/** - * - */ -function empty2() -{ -}//end empty2() - - -/** - * - * - * - */ -function empty3() -{ -}//end empty3 - - -/** - * @return boolean - */ -public function missingShortDescriptionInFunctionComment() -{ - return true; - -}//end missingShortDescriptionInFunctionComment() - - -class Another_Class -{ - - /** - * Destructor should not include a return tag. - * - * @return void - */ - function __destruct() - { - return; - } - - /** - * Constructor should not include a return tag. - * - * @return void - */ - function __construct() - { - return; - } - -}//end class - - -/** - * Comment param alignment test. - * - * @param string $varrr1 Comment1.. - * @param string $vr2 Comment2. - * @param string $var3 Comment3.. - * - * @return void - */ -public static function paramAlign($varrr1, $vr2, $var3) -{ - -}//end paramAlign() - - -/** - * Comment. - * - * @param string $id Comment. - * @param array $design Comment. - * - * @return void - */ -public static function paint($id, array $design) -{ - -}//end paint() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @since 4.0.0 - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - } - -}//end myFunction() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - return; - } - - return 'blah'; - -}//end myFunction() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - } - - return 'blah'; - -}//end myFunction() - -/** - * Test function. - * - * @param string $arg1 An argument - * - * @access public - * @return bool - */ - -echo $blah; - -function myFunction($arg1) {} - -class MyClass() { - /** - * An abstract function. - * - * @return string[] - */ - abstract final protected function myFunction(); -} - -/** - * Comment. - * - * @param mixed $test An argument. - * - * @return mixed - */ -function test($test) -{ - if ($test === TRUE) { - return; - } - - return $test; - -}//end test() - - -/** Comment. - * - * @return mixed - * - */ -function test() -{ - -}//end test() - -/** - * Comment. - * - * @param \other\ns\item $test An argument. - * - * @return mixed - */ -function test(\other\ns\item $test) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param item $test An argument. - * - * @return mixed - */ -function test(\other\ns\item $test) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param \first\ns\item $test An argument. - * - * @return mixed - */ -function test(\first\ns\item $test = \second\ns::CONSTANT) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param \first\item $test An argument. - * - * @return mixed - */ -function test(\first\ns\item $test = \second\ns::CONSTANT) -{ - return $test; - -}//end test() - -// Closures should be ignored. -preg_replace_callback( - '~-([a-z])~', - function ($match) { - return strtoupper($match[1]); - }, - 'hello-world' -); - -$callback = function ($bar) use ($foo) - { - $bar += $foo; - }; - -/** - * Comment should end with '*', not '**' before the slash. - **/ -function test123() { - -} - -/** - * Cant use resource for type hint. - * - * @param resource $test An argument. - * - * @return mixed - */ -function test($test) -{ - return $test; - -}//end test() - -/** - * Variable number of args. - * - * @param string $a1 Comment here. - * @param string $a2 Comment here. - * @param string $a2,... Comment here. - * - * @return boolean - */ -public function variableArgs($a1, $a2) -{ - return true; - -}//end variableArgs() - -/** - * Contains closure. - * - * @return void - */ -public function containsClosure() -{ - function ($e) { - return new Event($e); - }, - -}//end containsClosure() - -/** - * 这是一条测试评论. - * - * @return void - */ -public function test() -{ - -}//end variableArgs() - -/** - * Uses callable. - * - * @param callable $cb Test parameter. - * - * @return void - */ -public function usesCallable(callable $cb) { - $cb(); -}//end usesCallable() - -/** - * Creates a map of tokens => line numbers for each token. - * - * @param array $tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to process this file. - * @param string $eolChar The EOL character - * to use for splitting strings. - * - * @return void - * @throws Exception If something really bad - * happens while doing foo. - */ -public function foo(array &$tokens, $tokenizer, $eolChar) -{ - -}//end foo() - -/** - * Some description. - * - * @param \Vendor\Package\SomeClass $someclass Some class. - * @param \OtherVendor\Package\SomeClass2 $someclass2 Some class. - * @param \OtherVendor\Package\SomeClass2 $someclass3 Some class. - * - * @return void - */ -public function foo(SomeClass $someclass, \OtherVendor\Package\SomeClass2 $someclass2, SomeClass3 $someclass3) -{ -} - -/** - * Gettext. - * - * @return string - */ -public function _() { - return $foo; -} - -class Baz { - /** - * The PHP5 constructor - * - * No return tag - */ - public function __construct() { - - } -} - -/** - * Test - * - * @return void - * @throws E - */ -function myFunction() {} - -/** - * Yield test - * - * @return integer - */ -function yieldTest() -{ - for ($i = 0; $i < 5; $i++) { - yield $i; - } -} - -/** - * Yield test - * - * @return void - */ -function yieldTest() -{ - for ($i = 0; $i < 5; $i++) { - yield $i; - } -} - -/** - * Using "array" as a type hint should satisfy a specified array parameter type. - * - * @param MyClass[] $values An array of MyClass objects. - * - * @return void - */ -public function specifiedArray(array $values) { - -}// end specifiedArray() - -/** - * Using "callable" as a type hint should satisfy a "callback" parameter type. - * - * @param callback $cb A callback. - * - * @return void - */ -public function callableCallback(callable $cb) { - -}// end callableCallback() - -/** - * PHP7 type hints. - * - * @param string $name1 Comment. - * @param integer $name2 Comment. - * @param float $name3 Comment. - * @param boolean $name4 Comment. - * - * @return void - */ -public function myFunction (string $name1, int $name2, float $name3, bool $name4) { -} - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string ...$name2 Comment. - * - * @return void - */ -public function myFunction(string $name1, string ...$name2) { -} - - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string $name2 Comment. - * - * @return void - */ -public function myFunction(string $name1, string ...$name2) { -} - -/** - * Return description function + correct type. - * - * @return integer This is a description. - */ -public function myFunction() { - return 5; -} - -/** - * Return description function + incorrect type. - * - * @return int This is a description. - */ -public function myFunction() { - return 5; -} - -/** - * Return description function + no return. - * - * @return void This is a description. - */ -public function myFunction() { -} - -/** - * Return description function + mixed return. - * - * @return mixed This is a description. - */ -public function myFunction() { -} - -/** - * Function comment. - * - * @param $bar - * Comment here. - * @param ... - * Additional arguments here. - * - * @return - * Return value - * - */ -function foo($bar) { -} - -/** - * Do something. - * - * @return void - */ -public function someFunc(): void -{ - $class = new class - { - /** - * Do something. - * - * @return string - */ - public function getString(): string - { - return 'some string'; - } - }; -} - -/** - * Return description function + mixed return types. - * - * @return bool|int This is a description. - */ -function returnTypeWithDescriptionA() -{ - return 5; - -}//end returnTypeWithDescriptionA() - - -/** - * Return description function + mixed return types. - * - * @return real|bool This is a description. - */ -function returnTypeWithDescriptionB() -{ - return 5; - -}//end returnTypeWithDescriptionB() - - -/** - * Return description function + lots of different mixed return types. - * - * @return int|object|string[]|real|double|float|bool|array(int=>MyClass)|callable And here we have a description - */ -function returnTypeWithDescriptionC() -{ - return 5; - -}//end returnTypeWithDescriptionC() - - -/** - * Return description function + lots of different mixed return types. - * - * @return array(int=>bool)|\OtherVendor\Package\SomeClass2|MyClass[]|void And here we have a description - */ -function returnTypeWithDescriptionD() -{ - -}//end returnTypeWithDescriptionD() - -/** - * Yield from test - * - * @return int[] - */ -function yieldFromTest() -{ - yield from foo(); -} - -/** - * Audio - * - * Generates an audio element to embed sounds - * - * @param mixed $src Either a source string or - * an array of sources. - * @param mixed $unsupportedMessage The message to display - * if the media tag is not supported by the browser. - * @param mixed $attributes HTML attributes. - * @return string - */ -function audio( - $src, - $unsupportedMessage = '', - $attributes = '', -) -{ - return 'test'; -} - -/** - * Test function - * - * @return array - */ -function returnArrayWithClosure() -{ - function () { - return; - }; - - return []; -} - -/** - * Test function - * - * @return array - */ -function returnArrayWithAnonymousClass() -{ - new class { - /** - * @return void - */ - public function test() { - return; - } - }; - - return []; -} - -/** - * @return void - */ -function returnVoidWithClosure() -{ - function () { - return 1; - }; -} - -/** - * @return void - */ -function returnVoidWithAnonymousClass() -{ - new class { - /** - * @return integer - */ - public function test() - { - return 1; - } - }; -} - -class TestReturnVoid -{ - /** - * @return void - */ - public function test() - { - function () { - return 4; - }; - } -} - -/** - * Comment here. - * - * @param integer $a This is A. - * @param ?array $b This is B. - * - * @return void - */ -public static function foo(?int $a, ?array $b) {} - -/** - * Comment here. - * - * @param object $a This is A. - * @param object $b This is B. - * - * @return void - */ -public function foo(object $a, ?object $b) {} - -/** - * Prepares given PHP class method for later code building. - * - * @param integer $foo Comment. - * - Additional comment. - * - * @return void - */ -function foo($foo) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc.fixed deleted file mode 100644 index 4d91ecd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc.fixed +++ /dev/null @@ -1,1002 +0,0 @@ - MyClass) - */ -public function caseSensitive($a1, $a2, $a3, arRay $a4, $a5, $a6, myclas $a7) -{ - -}//end caseSensitive() - - -/** - * More type hint check for custom type and array. - * - * @param array $a1 Comment here. - * @param array $a2 Comment here. - * @param MyClass $a3 Comment here. - * @param MyClass $a4 Comment here. - * - * @return array(integer => MyClass) - */ -public function typeHint(MyClass $a1, $a2, myclass $a3, $a4) -{ - return (3 => 'myclass obj'); - -}//end typeHint() - - -/** - * Mixed variable type separated by a '|'. - * - * @param array|string $a1 Comment here. - * @param mixed $a2 Comment here. - * @param string|array $a3 Comment here. - * @param MyClass|integer $a4 Comment here. - * - * @return boolean - */ -public function mixedType($a1, $a2, $a3, $a4) -{ - return true; - -}//end mixedType() - - -/** - * Array type. - * - * @param array(MyClass) $a1 OK. - * @param array $a2 Invalid type. - * @param array $a3 Typo. - * @param array(integer) $a4 Use 'array(integer)' instead. - * @param array(integer => integer) $a5 Use 'array(integer => integer)' instead. - * @param array(integer => boolean) $a6 Use 'array(integer => boolean)' instead. - * @param array $a7 Use 'array' instead. - * @param string $a8 String with unknown type hint. - * - * @return integer - */ -public function mixedArrayType($a1, $a2, array $a3, $a4, $a5, $a6, $a7, unknownTypeHint $a8) -{ - return 1; - -}//end mixedArrayType() - - -/** - */ -function empty1() -{ -}//end empty1() - - -/** - * - */ -function empty2() -{ -}//end empty2() - - -/** - * - * - * - */ -function empty3() -{ -}//end empty3 - - -/** - * @return boolean - */ -public function missingShortDescriptionInFunctionComment() -{ - return true; - -}//end missingShortDescriptionInFunctionComment() - - -class Another_Class -{ - - /** - * Destructor should not include a return tag. - * - * @return void - */ - function __destruct() - { - return; - } - - /** - * Constructor should not include a return tag. - * - * @return void - */ - function __construct() - { - return; - } - -}//end class - - -/** - * Comment param alignment test. - * - * @param string $varrr1 Comment1.. - * @param string $vr2 Comment2. - * @param string $var3 Comment3.. - * - * @return void - */ -public static function paramAlign($varrr1, $vr2, $var3) -{ - -}//end paramAlign() - - -/** - * Comment. - * - * @param string $id Comment. - * @param array $design Comment. - * - * @return void - */ -public static function paint($id, array $design) -{ - -}//end paint() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @since 4.0.0 - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - } - -}//end myFunction() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - return; - } - - return 'blah'; - -}//end myFunction() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - } - - return 'blah'; - -}//end myFunction() - -/** - * Test function. - * - * @param string $arg1 An argument - * - * @access public - * @return bool - */ - -echo $blah; - -function myFunction($arg1) {} - -class MyClass() { - /** - * An abstract function. - * - * @return string[] - */ - abstract final protected function myFunction(); -} - -/** - * Comment. - * - * @param mixed $test An argument. - * - * @return mixed - */ -function test($test) -{ - if ($test === TRUE) { - return; - } - - return $test; - -}//end test() - - -/** Comment. - * - * @return mixed - * - */ -function test() -{ - -}//end test() - -/** - * Comment. - * - * @param \other\ns\item $test An argument. - * - * @return mixed - */ -function test(\other\ns\item $test) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param item $test An argument. - * - * @return mixed - */ -function test(\other\ns\item $test) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param \first\ns\item $test An argument. - * - * @return mixed - */ -function test(\first\ns\item $test = \second\ns::CONSTANT) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param \first\item $test An argument. - * - * @return mixed - */ -function test(\first\ns\item $test = \second\ns::CONSTANT) -{ - return $test; - -}//end test() - -// Closures should be ignored. -preg_replace_callback( - '~-([a-z])~', - function ($match) { - return strtoupper($match[1]); - }, - 'hello-world' -); - -$callback = function ($bar) use ($foo) - { - $bar += $foo; - }; - -/** - * Comment should end with '*', not '**' before the slash. - **/ -function test123() { - -} - -/** - * Cant use resource for type hint. - * - * @param resource $test An argument. - * - * @return mixed - */ -function test($test) -{ - return $test; - -}//end test() - -/** - * Variable number of args. - * - * @param string $a1 Comment here. - * @param string $a2 Comment here. - * @param string $a2,... Comment here. - * - * @return boolean - */ -public function variableArgs($a1, $a2) -{ - return true; - -}//end variableArgs() - -/** - * Contains closure. - * - * @return void - */ -public function containsClosure() -{ - function ($e) { - return new Event($e); - }, - -}//end containsClosure() - -/** - * 这是一条测试评论. - * - * @return void - */ -public function test() -{ - -}//end variableArgs() - -/** - * Uses callable. - * - * @param callable $cb Test parameter. - * - * @return void - */ -public function usesCallable(callable $cb) { - $cb(); -}//end usesCallable() - -/** - * Creates a map of tokens => line numbers for each token. - * - * @param array $tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to process this file. - * @param string $eolChar The EOL character - * to use for splitting strings. - * - * @return void - * @throws Exception If something really bad - * happens while doing foo. - */ -public function foo(array &$tokens, $tokenizer, $eolChar) -{ - -}//end foo() - -/** - * Some description. - * - * @param \Vendor\Package\SomeClass $someclass Some class. - * @param \OtherVendor\Package\SomeClass2 $someclass2 Some class. - * @param \OtherVendor\Package\SomeClass2 $someclass3 Some class. - * - * @return void - */ -public function foo(SomeClass $someclass, \OtherVendor\Package\SomeClass2 $someclass2, SomeClass3 $someclass3) -{ -} - -/** - * Gettext. - * - * @return string - */ -public function _() { - return $foo; -} - -class Baz { - /** - * The PHP5 constructor - * - * No return tag - */ - public function __construct() { - - } -} - -/** - * Test - * - * @return void - * @throws E - */ -function myFunction() {} - -/** - * Yield test - * - * @return integer - */ -function yieldTest() -{ - for ($i = 0; $i < 5; $i++) { - yield $i; - } -} - -/** - * Yield test - * - * @return void - */ -function yieldTest() -{ - for ($i = 0; $i < 5; $i++) { - yield $i; - } -} - -/** - * Using "array" as a type hint should satisfy a specified array parameter type. - * - * @param MyClass[] $values An array of MyClass objects. - * - * @return void - */ -public function specifiedArray(array $values) { - -}// end specifiedArray() - -/** - * Using "callable" as a type hint should satisfy a "callback" parameter type. - * - * @param callback $cb A callback. - * - * @return void - */ -public function callableCallback(callable $cb) { - -}// end callableCallback() - -/** - * PHP7 type hints. - * - * @param string $name1 Comment. - * @param integer $name2 Comment. - * @param float $name3 Comment. - * @param boolean $name4 Comment. - * - * @return void - */ -public function myFunction (string $name1, int $name2, float $name3, bool $name4) { -} - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string ...$name2 Comment. - * - * @return void - */ -public function myFunction(string $name1, string ...$name2) { -} - - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string $name2 Comment. - * - * @return void - */ -public function myFunction(string $name1, string ...$name2) { -} - -/** - * Return description function + correct type. - * - * @return integer This is a description. - */ -public function myFunction() { - return 5; -} - -/** - * Return description function + incorrect type. - * - * @return integer This is a description. - */ -public function myFunction() { - return 5; -} - -/** - * Return description function + no return. - * - * @return void This is a description. - */ -public function myFunction() { -} - -/** - * Return description function + mixed return. - * - * @return mixed This is a description. - */ -public function myFunction() { -} - -/** - * Function comment. - * - * @param $bar - * Comment here. - * @param ... - * Additional arguments here. - * - * @return - * Return value - * - */ -function foo($bar) { -} - -/** - * Do something. - * - * @return void - */ -public function someFunc(): void -{ - $class = new class - { - /** - * Do something. - * - * @return string - */ - public function getString(): string - { - return 'some string'; - } - }; -} - -/** - * Return description function + mixed return types. - * - * @return boolean|integer This is a description. - */ -function returnTypeWithDescriptionA() -{ - return 5; - -}//end returnTypeWithDescriptionA() - - -/** - * Return description function + mixed return types. - * - * @return float|boolean This is a description. - */ -function returnTypeWithDescriptionB() -{ - return 5; - -}//end returnTypeWithDescriptionB() - - -/** - * Return description function + lots of different mixed return types. - * - * @return integer|object|string[]|float|boolean|array(integer => MyClass)|callable And here we have a description - */ -function returnTypeWithDescriptionC() -{ - return 5; - -}//end returnTypeWithDescriptionC() - - -/** - * Return description function + lots of different mixed return types. - * - * @return array(integer => boolean)|\OtherVendor\Package\SomeClass2|MyClass[]|void And here we have a description - */ -function returnTypeWithDescriptionD() -{ - -}//end returnTypeWithDescriptionD() - -/** - * Yield from test - * - * @return int[] - */ -function yieldFromTest() -{ - yield from foo(); -} - -/** - * Audio - * - * Generates an audio element to embed sounds - * - * @param mixed $src Either a source string or - * an array of sources. - * @param mixed $unsupportedMessage The message to display - * if the media tag is not supported by the browser. - * @param mixed $attributes HTML attributes. - * @return string - */ -function audio( - $src, - $unsupportedMessage = '', - $attributes = '', -) -{ - return 'test'; -} - -/** - * Test function - * - * @return array - */ -function returnArrayWithClosure() -{ - function () { - return; - }; - - return []; -} - -/** - * Test function - * - * @return array - */ -function returnArrayWithAnonymousClass() -{ - new class { - /** - * @return void - */ - public function test() { - return; - } - }; - - return []; -} - -/** - * @return void - */ -function returnVoidWithClosure() -{ - function () { - return 1; - }; -} - -/** - * @return void - */ -function returnVoidWithAnonymousClass() -{ - new class { - /** - * @return integer - */ - public function test() - { - return 1; - } - }; -} - -class TestReturnVoid -{ - /** - * @return void - */ - public function test() - { - function () { - return 4; - }; - } -} - -/** - * Comment here. - * - * @param integer $a This is A. - * @param array $b This is B. - * - * @return void - */ -public static function foo(?int $a, ?array $b) {} - -/** - * Comment here. - * - * @param object $a This is A. - * @param object $b This is B. - * - * @return void - */ -public function foo(object $a, ?object $b) {} - -/** - * Prepares given PHP class method for later code building. - * - * @param integer $foo Comment. - * - Additional comment. - * - * @return void - */ -function foo($foo) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.php deleted file mode 100644 index e8e02f8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.php +++ /dev/null @@ -1,165 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - $errors = [ - 5 => 1, - 10 => 3, - 12 => 2, - 13 => 2, - 14 => 1, - 15 => 1, - 28 => 1, - 43 => 1, - 76 => 1, - 87 => 1, - 103 => 1, - 109 => 1, - 112 => 1, - 122 => 1, - 123 => 3, - 124 => 2, - 125 => 1, - 126 => 1, - 137 => 4, - 138 => 4, - 139 => 4, - 143 => 2, - 152 => 1, - 155 => 2, - 159 => 1, - 166 => 1, - 173 => 1, - 183 => 1, - 190 => 2, - 193 => 2, - 196 => 1, - 199 => 2, - 210 => 1, - 211 => 1, - 222 => 1, - 223 => 1, - 224 => 1, - 225 => 1, - 226 => 1, - 227 => 1, - 230 => 2, - 232 => 2, - 246 => 1, - 248 => 4, - 261 => 1, - 263 => 1, - 276 => 1, - 277 => 1, - 278 => 1, - 279 => 1, - 280 => 1, - 281 => 1, - 284 => 1, - 286 => 7, - 294 => 1, - 302 => 1, - 312 => 1, - 358 => 1, - 359 => 2, - 372 => 1, - 373 => 1, - 387 => 1, - 407 => 1, - 441 => 1, - 500 => 1, - 526 => 1, - 548 => 1, - 641 => 1, - 669 => 1, - 688 => 1, - 744 => 1, - 748 => 1, - 767 => 1, - 789 => 1, - 792 => 1, - 794 => 1, - 797 => 1, - 801 => 1, - 828 => 1, - 840 => 1, - 852 => 1, - 864 => 1, - 886 => 1, - 888 => 1, - 890 => 1, - 978 => 1, - 997 => 1, - ]; - - // Scalar type hints only work from PHP 7 onwards. - if (PHP_VERSION_ID >= 70000) { - $errors[17] = 3; - $errors[128] = 1; - $errors[143] = 3; - $errors[161] = 2; - $errors[201] = 1; - $errors[232] = 7; - $errors[363] = 3; - $errors[377] = 1; - $errors[575] = 2; - $errors[627] = 1; - $errors[1002] = 1; - } else { - $errors[729] = 4; - $errors[740] = 2; - $errors[752] = 2; - $errors[982] = 1; - } - - // Object type hints only work from PHP 7.2 onwards. - if (PHP_VERSION_ID >= 70200) { - $errors[627] = 2; - } else { - $errors[992] = 2; - } - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc deleted file mode 100644 index 377db02..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc +++ /dev/null @@ -1,159 +0,0 @@ - One -// -> One.One -// -> Two - -/* - Here is some inline example code: - -> One - -> One.One - -> Two -*/ - -/** - * Comment should be ignored in PHP 5.4. - * - */ -trait MyTrait { - -} - -$foo = 'foo'; // Var set to foo. - -echo $foo; - -// Comment here. -echo $foo; - -/** - * Comments about the include - */ -include_once($blah); - -// some comment without capital or full stop -echo $foo; // An unrelated comment. - -// An unrelated comment. -echo $foo; // some comment without capital or full stop - -class Foo -{ - // This is fine. - - /** - * Spacing is ignored above. - */ - function bar(){} -} - -if ($foo) { -}//end if -// Another comment here. -$foo++; - -if ($foo) { -}//end if -// another comment here. -$foo++; - -/* - * N.B.: The below test line must be the last test in the file. - * Testing that a new line after an inline comment when it's the last non-whitespace - * token in a file, does *not* throw an error as this would conflict with the common - * "new line required at end of file" rule. - */ - -// For this test line having an empty line below it, is fine. diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc.fixed deleted file mode 100644 index 975143f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc.fixed +++ /dev/null @@ -1,152 +0,0 @@ - One -// -> One.One -// -> Two -/* - Here is some inline example code: - -> One - -> One.One - -> Two -*/ - -/** - * Comment should be ignored in PHP 5.4. - * - */ -trait MyTrait { - -} - -$foo = 'foo'; // Var set to foo. - -echo $foo; - -// Comment here. -echo $foo; - -/** - * Comments about the include - */ -include_once($blah); - -// some comment without capital or full stop -echo $foo; // An unrelated comment. - -// An unrelated comment. -echo $foo; // some comment without capital or full stop - -class Foo -{ - // This is fine. - - /** - * Spacing is ignored above. - */ - function bar(){} -} - -if ($foo) { -}//end if -// Another comment here. -$foo++; - -if ($foo) { -}//end if -// another comment here. -$foo++; - -/* - * N.B.: The below test line must be the last test in the file. - * Testing that a new line after an inline comment when it's the last non-whitespace - * token in a file, does *not* throw an error as this would conflict with the common - * "new line required at end of file" rule. - */ - -// For this test line having an empty line below it, is fine. diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js deleted file mode 100644 index 6b1093e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js +++ /dev/null @@ -1,129 +0,0 @@ -// Some content here. -var code = 'hello'; - -// This comment contains # multiple -// hash signs (#). -code = 'hello'; - -/** - * This is the first line of a function comment. - * This is the second line. - */ -function testFunction() -{ - // Callback methods which are added by external objects. - this.callbacks = {}; - -}//end testFunction() - -/** - * This is the first line of a class comment. - * This is the second line. - */ -myClass.prototype = { - - /** - * This is the first line of a method comment. - * This is the second line. - */ - load: function(url, callback) - { - // Some code here. - - } -}; - -// some code goes here! - -/* - A longer comment goes here. - It spans multiple lines!! - Or does it? -*/ - -// 0This is a simple multi-line -// comment! -code = 'hello'; - -//This is not valid. -code = 'hello'; - -// Neither is this! -code = 'hello'; - -// -code = 'hello'; - -/** Neither is this! **/ -code = 'hello'; - -/** - * This is the first line of a function comment. - * This is the second line. - */ -var myFunction = function() { -} - -/** - * This is the first line of a function comment. - * This is the second line. - */ -myFunction = function() { -} - -/** - * This is the first line of a function comment. - * This is the second line. - */ -myClass.myFunction = function() { -} - -dfx.getIframeDocument = function(iframe) -{ - return doc; - -};//end dfx.getIframeDocument() - -mig.Gallery.prototype = { - - init: function(cb) - { - - },//end init() - - imageClicked: function(id) - { - - }//end imageClicked() - -}; - -// Here is some inline example code: -// -> One -// -> One.One -// -> Two - -/* - Here is some inline example code: - -> One - -> One.One - -> Two -*/ - - -var foo = 'foo'; // Var set to foo. - -console.info(foo); - -// Comment here. -console.info(foo); - -//** -* invalid comment -*/ - -// some comment without capital or full stop -console.log(foo); // An unrelated comment. - -// An unrelated comment. -console.log(foo); // some comment without capital or full stop diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js.fixed deleted file mode 100644 index 20e5041..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js.fixed +++ /dev/null @@ -1,125 +0,0 @@ -// Some content here. -var code = 'hello'; - -// This comment contains # multiple -// hash signs (#). -code = 'hello'; - -/** - * This is the first line of a function comment. - * This is the second line. - */ -function testFunction() -{ - // Callback methods which are added by external objects. - this.callbacks = {}; - -}//end testFunction() - -/** - * This is the first line of a class comment. - * This is the second line. - */ -myClass.prototype = { - - /** - * This is the first line of a method comment. - * This is the second line. - */ - load: function(url, callback) - { - // Some code here. - } -}; - -// some code goes here! -/* - A longer comment goes here. - It spans multiple lines!! - Or does it? -*/ - -// 0This is a simple multi-line -// comment! -code = 'hello'; - -// This is not valid. -code = 'hello'; - -// Neither is this! -code = 'hello'; - -code = 'hello'; - -/** Neither is this! **/ -code = 'hello'; - -/** - * This is the first line of a function comment. - * This is the second line. - */ -var myFunction = function() { -} - -/** - * This is the first line of a function comment. - * This is the second line. - */ -myFunction = function() { -} - -/** - * This is the first line of a function comment. - * This is the second line. - */ -myClass.myFunction = function() { -} - -dfx.getIframeDocument = function(iframe) -{ - return doc; - -};//end dfx.getIframeDocument() - -mig.Gallery.prototype = { - - init: function(cb) - { - - },//end init() - - imageClicked: function(id) - { - - }//end imageClicked() - -}; - -// Here is some inline example code: -// -> One -// -> One.One -// -> Two -/* - Here is some inline example code: - -> One - -> One.One - -> Two -*/ - - -var foo = 'foo'; // Var set to foo. - -console.info(foo); - -// Comment here. -console.info(foo); - -// ** -* invalid comment -*/ - -// some comment without capital or full stop -console.log(foo); // An unrelated comment. - -// An unrelated comment. -console.log(foo); // some comment without capital or full stop diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.php deleted file mode 100644 index e4a5298..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class InlineCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='InlineCommentUnitTest.inc') - { - switch ($testFile) { - case 'InlineCommentUnitTest.inc': - $errors = [ - 17 => 1, - 27 => 1, - 28 => 1, - 32 => 2, - 36 => 1, - 44 => 2, - 58 => 1, - 61 => 1, - 64 => 1, - 67 => 1, - 95 => 1, - 96 => 1, - 97 => 3, - 118 => 1, - 126 => 2, - 130 => 2, - 149 => 1, - ]; - - return $errors; - case 'InlineCommentUnitTest.js': - return [ - 31 => 1, - 36 => 2, - 48 => 1, - 51 => 1, - 54 => 1, - 57 => 1, - 102 => 1, - 103 => 1, - 104 => 3, - 118 => 1, - 121 => 1, - 125 => 2, - 129 => 2, - ]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc deleted file mode 100644 index 732003b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc +++ /dev/null @@ -1,962 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LongConditionClosingCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='LongConditionClosingCommentUnitTest.inc') - { - switch ($testFile) { - case 'LongConditionClosingCommentUnitTest.inc': - return [ - 49 => 1, - 99 => 1, - 146 => 1, - 192 => 1, - 215 => 1, - 238 => 1, - 261 => 1, - 286 => 1, - 309 => 1, - 332 => 1, - 355 => 1, - 378 => 1, - 493 => 1, - 531 => 1, - 536 => 1, - 540 => 1, - 562 => 1, - 601 => 1, - 629 => 1, - 663 => 1, - 765 => 1, - 798 => 1, - 811 => 1, - 897 => 1, - 931 => 1, - 962 => 1, - ]; - break; - case 'LongConditionClosingCommentUnitTest.js': - return [ - 47 => 1, - 97 => 1, - 144 => 1, - 190 => 1, - 213 => 1, - 238 => 1, - 261 => 1, - 284 => 1, - 307 => 1, - 401 => 1, - 439 => 1, - 444 => 1, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js deleted file mode 100644 index 6de6421..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js +++ /dev/null @@ -1,36 +0,0 @@ -function test(id, buttons) // cool function -{ - alert('hello'); - alert('hello again'); // And again. - // Valid comment. - -}//end test() - -var good = true; // Indeed. - -mig.Gallery.prototype = { - - init: function(cb) - { - - },//end init() - - imageClicked: function(id) - { - - }//end imageClicked() - -}; - -dfx.getIframeDocument = function(iframe) -{ - - return doc; - -};//end dfx.getIframeDocument() - -// Verify that multi-line control structure with comments and annotations are left alone. -if (condition // comment - && anotherCondition) { - condition = true; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js.fixed deleted file mode 100644 index 1953760..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js.fixed +++ /dev/null @@ -1,39 +0,0 @@ -function test(id, buttons) -// cool function -{ - alert('hello'); - alert('hello again'); -// And again. - // Valid comment. - -}//end test() - -var good = true; -// Indeed. - -mig.Gallery.prototype = { - - init: function(cb) - { - - },//end init() - - imageClicked: function(id) - { - - }//end imageClicked() - -}; - -dfx.getIframeDocument = function(iframe) -{ - - return doc; - -};//end dfx.getIframeDocument() - -// Verify that multi-line control structure with comments and annotations are left alone. -if (condition // comment - && anotherCondition) { - condition = true; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.2.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.2.js deleted file mode 100644 index 88d0e7d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.2.js +++ /dev/null @@ -1,2 +0,0 @@ -// Comment as first thing in a JS file. -var i = 100; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc deleted file mode 100644 index 5650e19..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc +++ /dev/null @@ -1,48 +0,0 @@ - function($b) { - }, // comment. - 'key' => 'value', // phpcs:ignore Standard.Category.SniffName -- for reasons. - 'key' => 'value', // comment. -]; - -// Verify that multi-line control structure with comments and annotations are left alone. -for ( - $i = 0; /* Start */ - $i < 10; /* phpcs:ignore Standard.Category.SniffName -- for reasons. */ - $i++ // comment - -) {} - -if ( $condition === true // comment - && $anotherCondition === false -) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc.fixed deleted file mode 100644 index 99c9e92..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc.fixed +++ /dev/null @@ -1,52 +0,0 @@ - function($b) { - }, // comment. - 'key' => 'value', // phpcs:ignore Standard.Category.SniffName -- for reasons. - 'key' => 'value', -// comment. -]; - -// Verify that multi-line control structure with comments and annotations are left alone. -for ( - $i = 0; /* Start */ - $i < 10; /* phpcs:ignore Standard.Category.SniffName -- for reasons. */ - $i++ // comment - -) {} - -if ( $condition === true // comment - && $anotherCondition === false -) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.php deleted file mode 100644 index fbc0800..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class PostStatementCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='PostStatementCommentUnitTest.inc') - { - switch ($testFile) { - case 'PostStatementCommentUnitTest.inc': - return [ - 6 => 1, - 10 => 1, - 18 => 1, - 35 => 1, - ]; - - case 'PostStatementCommentUnitTest.1.js': - return [ - 1 => 1, - 4 => 1, - 9 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc deleted file mode 100644 index 65f4389..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc +++ /dev/null @@ -1,365 +0,0 @@ - $content) { - echo $content; - } - - return $var1; - - }//end checkVariable() - - - /** - * - * - */ - $emptyVarDoc = ''; - - /** - * Var type checking (int v.s. integer). - * - * @var int - */ - private $_varSimpleTypeCheck; - - - /** - * Var type checking (array(int => string) v.s. array(int => string)). - * - * @var array(int => string) - */ - private $_varArrayTypeCheck; - - - /** - * Boolean @var tag Capitalized - * - * @var Boolean - */ - public $CapBoolTag = true; - - - /** - * Boolean @var tag Capitalized - * - * @var BOOLEAN - */ - public $CapBoolTag2 = true; - - - /** - * Double @var tag Capitalized - * - * @var Double - */ - public $CapDoubleTag = 1; - - - /** - * Double @var tag Capitalized - * - * @var DOUBLE - */ - public $CapDoubleTag2 = 1; - - - /** - * Real @var tag Capitalized - * - * @var Real - */ - public $CapRealTag = 1; - - - /** - * Real @var tag Capitalized - * - * @var REAL - */ - public $CapRealTag2 = 1; - - - /** - * Float @var tag Capitalized - * - * @var Float - */ - public $CapFloatTag = 1; - - - /** - * Float @var tag Capitalized - * - * @var FLOAT - */ - public $CapFloatTag2 = 1; - - - /** - * Int @var tag Capitalized - * - * @var Int - */ - public $CapIntTag = 1; - - - /** - * Int @var tag Capitalized - * - * @var INT - */ - public $CapIntTag2 = 1; - - - /** - * Integer @var tag Capitalized - * - * @var Integer - */ - public $CapIntTag3 = 1; - - - /** - * Integer @var tag Capitalized - * - * @var INTEGER - */ - public $CapIntTag4 = 1; - - - /** - * Array @var tag Capitalized - * - * @var Array - */ - public $CapVarTag = []; - - - /** - * Array @var tag All Caps - * - * @var ARRAY - */ - public $CapVarTag2 = []; - - - /** - * Array @var tag Capitalized - * - * @var Array() - */ - public $CapVarTag3 = []; - - - /** - * Array @var tag All Caps - * - * @var ARRAY() - */ - public $CapVarTag4 = []; - - - /** - * Var type checking (STRING v.s. string). - * - * @var STRING - */ - private $_varCaseTypeCheck; - - - /** - * @var integer - */ - private $_varWithNoShortComment; - - protected $noComment2 = ''; - - - /** - * @var int Var type checking (int v.s. integer) with single-line comment. - */ - private $_varSimpleTypeCheckSingleLine; - - -}//end class - - -/** - * VariableCommentUnitTest2. - * - * Long description goes here. - * - */ -class VariableCommentUnitTest2 -{ - - public $hello; - - /** Comment starts here. - * - * @var string - * - */ - private $_varCaseTypeCheck; - - /** - * 这是一条测试评论. - * - * @var string - */ - public $foo; - -}//end class - - -/* - * Class comment - */ -class Foo -{ - - protected $bar; - - /** - * Short description of the member variable. - * - * @var array - */ - public static array $variableName = array(); - -} - -class Foo -{ - - /** - * Short description of the member variable. - * - * @var array - */ - public array $variableName = array(); - - - // Not "/**" style comment. - // - // @var string - private ?Folder\ClassName $_incorrectCommentStyle = null; - - - var int $noComment = 1; - } diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc.fixed deleted file mode 100644 index ca0b052..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc.fixed +++ /dev/null @@ -1,365 +0,0 @@ - $content) { - echo $content; - } - - return $var1; - - }//end checkVariable() - - - /** - * - * - */ - $emptyVarDoc = ''; - - /** - * Var type checking (int v.s. integer). - * - * @var integer - */ - private $_varSimpleTypeCheck; - - - /** - * Var type checking (array(int => string) v.s. array(int => string)). - * - * @var array(integer => string) - */ - private $_varArrayTypeCheck; - - - /** - * Boolean @var tag Capitalized - * - * @var boolean - */ - public $CapBoolTag = true; - - - /** - * Boolean @var tag Capitalized - * - * @var boolean - */ - public $CapBoolTag2 = true; - - - /** - * Double @var tag Capitalized - * - * @var float - */ - public $CapDoubleTag = 1; - - - /** - * Double @var tag Capitalized - * - * @var float - */ - public $CapDoubleTag2 = 1; - - - /** - * Real @var tag Capitalized - * - * @var float - */ - public $CapRealTag = 1; - - - /** - * Real @var tag Capitalized - * - * @var float - */ - public $CapRealTag2 = 1; - - - /** - * Float @var tag Capitalized - * - * @var float - */ - public $CapFloatTag = 1; - - - /** - * Float @var tag Capitalized - * - * @var float - */ - public $CapFloatTag2 = 1; - - - /** - * Int @var tag Capitalized - * - * @var integer - */ - public $CapIntTag = 1; - - - /** - * Int @var tag Capitalized - * - * @var integer - */ - public $CapIntTag2 = 1; - - - /** - * Integer @var tag Capitalized - * - * @var integer - */ - public $CapIntTag3 = 1; - - - /** - * Integer @var tag Capitalized - * - * @var integer - */ - public $CapIntTag4 = 1; - - - /** - * Array @var tag Capitalized - * - * @var array - */ - public $CapVarTag = []; - - - /** - * Array @var tag All Caps - * - * @var array - */ - public $CapVarTag2 = []; - - - /** - * Array @var tag Capitalized - * - * @var array - */ - public $CapVarTag3 = []; - - - /** - * Array @var tag All Caps - * - * @var array - */ - public $CapVarTag4 = []; - - - /** - * Var type checking (STRING v.s. string). - * - * @var string - */ - private $_varCaseTypeCheck; - - - /** - * @var integer - */ - private $_varWithNoShortComment; - - protected $noComment2 = ''; - - - /** - * @var integer Var type checking (int v.s. integer) with single-line comment. - */ - private $_varSimpleTypeCheckSingleLine; - - -}//end class - - -/** - * VariableCommentUnitTest2. - * - * Long description goes here. - * - */ -class VariableCommentUnitTest2 -{ - - public $hello; - - /** Comment starts here. - * - * @var string - * - */ - private $_varCaseTypeCheck; - - /** - * 这是一条测试评论. - * - * @var string - */ - public $foo; - -}//end class - - -/* - * Class comment - */ -class Foo -{ - - protected $bar; - - /** - * Short description of the member variable. - * - * @var array - */ - public static array $variableName = array(); - -} - -class Foo -{ - - /** - * Short description of the member variable. - * - * @var array - */ - public array $variableName = array(); - - - // Not "/**" style comment. - // - // @var string - private ?Folder\ClassName $_incorrectCommentStyle = null; - - - var int $noComment = 1; - } diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.php deleted file mode 100644 index f3ee3c7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class VariableCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 21 => 1, - 24 => 1, - 56 => 1, - 64 => 1, - 73 => 1, - 84 => 1, - 130 => 1, - 136 => 1, - 144 => 1, - 152 => 1, - 160 => 1, - 168 => 1, - 176 => 1, - 184 => 1, - 192 => 1, - 200 => 1, - 208 => 1, - 216 => 1, - 224 => 1, - 232 => 1, - 240 => 1, - 248 => 1, - 256 => 1, - 264 => 1, - 272 => 1, - 280 => 1, - 290 => 1, - 294 => 1, - 311 => 1, - 336 => 1, - 361 => 1, - 364 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [93 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.inc deleted file mode 100644 index 249ae15..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.inc +++ /dev/null @@ -1,304 +0,0 @@ - 0); - -do -{ - echo $i; -} while ($i > 0); - -do -{ - echo $i; -} -while ($i > 0); - -do { echo $i; } while ($i > 0); - -do{ - echo $i; -}while($i > 0); - -while ($i < 1) { - echo $i; -} - -while($i < 1){ - echo $i; -} - -while ($i < 1) { echo $i; } - -for ($i = 1; $i < 1; $i++) { - echo $i; -} - -for($i = 1; $i < 1; $i++){ - echo $i; -} - -for ($i = 1; $i < 1; $i++) { echo $i; } - -if ($i == 0) { - $i = 1; -} - -if($i == 0){ - $i = 1; -} - -if ($i == 0) { $i = 1; } - -if ($i == 0) { - $i = 1; -} else { - $i = 0; -} - -if ($i == 0) { - $i = 1; -}else{ - $i = 0; -} - -if ($i == 0) { $i = 1; } else { $i = 0; } - -if ($i == 0) { - $i = 1; -} else if ($i == 2) { - $i = 0; -} - -if ($i == 0) { - $i = 1; -}else if($i == 2){ - $i = 0; -} - -if ($i == 0) { $i = 1; } else if ($i == 2) { $i = 0; } - -if ($i == 0) { // comments are allowed - $i = 1; -} - -if ($i == 0) {// comments are allowed - $i = 1; -} - -if ($i == 0) { /* comments are allowed*/ - $i = 1; -} - -if ($i == 0) -{ // this is ok - $i = 1; -} - -if ($i == 0) /* this is ok */ { -} - -try { - $code = 'this'; -} catch (Exception $e) { - // Caught! -} - -try { $code = 'this'; } catch (Exception $e) { - // Caught! -} - -do { echo $i; -} while ($i > 0); - -if ($i === 0) { - - $i = 1 -} - -if ($a) { - -} -elseif ($b) { -} - -foreach ($items as $item) { - echo $item; -} - -foreach($items as $item){ - echo $item; -} - -if ($a && $b) // && $c) -{ -} - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -try { - // try body -} -catch (FirstExceptionType $e) { - // catch body -} -catch (OtherExceptionType $e) { - // catch body -} - -switch($foo) { - - case 'bar': - break; - -} - -if ($foo) : -endif; - -?> - -getRow()): ?> -

    - - - -
    - -
    - - - - - - - hello - - - - hello - - - - -getRow()) : ?> -

    - - - - - - - - hello - - - - hello - - 0); - -do { - echo $i; -} while ($i > 0); - -do { - echo $i; -} while ($i > 0); - -do { -echo $i; } while ($i > 0); - -do { - echo $i; -} while ($i > 0); - -while ($i < 1) { - echo $i; -} - -while ($i < 1) { - echo $i; -} - -while ($i < 1) { -echo $i; } - -for ($i = 1; $i < 1; $i++) { - echo $i; -} - -for ($i = 1; $i < 1; $i++) { - echo $i; -} - -for ($i = 1; $i < 1; $i++) { -echo $i; } - -if ($i == 0) { - $i = 1; -} - -if ($i == 0) { - $i = 1; -} - -if ($i == 0) { -$i = 1; } - -if ($i == 0) { - $i = 1; -} else { - $i = 0; -} - -if ($i == 0) { - $i = 1; -} else { - $i = 0; -} - -if ($i == 0) { -$i = 1; } else { -$i = 0; } - -if ($i == 0) { - $i = 1; -} else if ($i == 2) { - $i = 0; -} - -if ($i == 0) { - $i = 1; -} else if ($i == 2) { - $i = 0; -} - -if ($i == 0) { -$i = 1; } else if ($i == 2) { -$i = 0; } - -if ($i == 0) { // comments are allowed - $i = 1; -} - -if ($i == 0) {// comments are allowed - $i = 1; -} - -if ($i == 0) { /* comments are allowed*/ - $i = 1; -} - -if ($i == 0) { // this is ok - $i = 1; -} - -if ($i == 0) { /* this is ok */ -} - -try { - $code = 'this'; -} catch (Exception $e) { - // Caught! -} - -try { -$code = 'this'; } catch (Exception $e) { - // Caught! -} - -do { -echo $i; -} while ($i > 0); - -if ($i === 0) { - - $i = 1 -} - -if ($a) { - -} elseif ($b) { -} - -foreach ($items as $item) { - echo $item; -} - -foreach ($items as $item) { - echo $item; -} - -if ($a && $b) { // && $c) -} - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -try { - // try body -} catch (FirstExceptionType $e) { - // catch body -} catch (OtherExceptionType $e) { - // catch body -} - -switch ($foo) { - - case 'bar': - break; - -} - -if ($foo) : -endif; - -?> - -getRow()) : ?> -

    - - - -
    - -
    - - - - - - - hello - - - - hello - - - - -getRow()): ?> -

    - - - - - - - - hello - - - - hello - - 0); - -do -{ - i = 0; -} while (i > 0); - -do -{ - i = 0; -} -while (i > 0); - -do { i = 0; } while (i > 0); - -do{ - i = 0; -}while(i > 0); - -while (i < 1) { - i = 0; -} - -while(i < 1){ - i = 0; -} - -while (i < 1) { i = 0; } - -for (i = 1; i < 1; i++) { - i = 0; -} - -for(i = 1; i < 1; i++){ - i = 0; -} - -for (i = 1; i < 1; i++) { i = 0; } - -if (i == 0) { - i = 1; -} - -if(i == 0){ - i = 1; -} - -if (i == 0) { i = 1; } - -if (i == 0) { - i = 1; -} else { - i = 0; -} - -if (i == 0) { - i = 1; -}else{ - i = 0; -} - -if (i == 0) { i = 1; } else { i = 0; } - -if (i == 0) { - i = 1; -} else if (i == 2) { - i = 0; -} - -if (i == 0) { - i = 1; -}else if(i == 2){ - i = 0; -} - -if (i == 0) { i = 1; } else if (i == 2) { i = 0; } - -if (i == 0) { // comments are allowed - i = 1; -} - -if (i == 0) {// comments are allowed - i = 1; -} - -if (i == 0) { /* comments are allowed*/ - i = 1; -} - -if (i == 0) -{ // this is ok - i = 1; -} - -if (i == 0) /* this is ok */ { -} - -try { - code = 'this'; -} catch (e) { - // Caught! -} - -try { code = 'this'; } catch (e) { - // Caught! -} - -do { i = 0; -} while (i > 0); - -if (i === 0) { - - i = 1 -} - -if (window.jQuery)(function($) { - $.fn.reset = function() { - return this.each(function() { - try { - this.reset(); - } catch (e) { - } - }); - }; -})(jQuery); - -if ($("#myid").rotationDegrees()=='90') - $('.modal').css({'transform': 'rotate(90deg)'}); - -if ($("#myid").rotationDegrees()=='90') - $foo = {'transform': 'rotate(90deg)'}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.js.fixed deleted file mode 100644 index e3ed6de..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.js.fixed +++ /dev/null @@ -1,141 +0,0 @@ - -i = 0; -do { - i = 0; -} while (i > 0); - -do { - i = 0; -} while (i > 0); - -do { - i = 0; -} while (i > 0); - -do { -i = 0; } while (i > 0); - -do { - i = 0; -} while (i > 0); - -while (i < 1) { - i = 0; -} - -while (i < 1) { - i = 0; -} - -while (i < 1) { -i = 0; } - -for (i = 1; i < 1; i++) { - i = 0; -} - -for (i = 1; i < 1; i++) { - i = 0; -} - -for (i = 1; i < 1; i++) { -i = 0; } - -if (i == 0) { - i = 1; -} - -if (i == 0) { - i = 1; -} - -if (i == 0) { -i = 1; } - -if (i == 0) { - i = 1; -} else { - i = 0; -} - -if (i == 0) { - i = 1; -} else { - i = 0; -} - -if (i == 0) { -i = 1; } else { -i = 0; } - -if (i == 0) { - i = 1; -} else if (i == 2) { - i = 0; -} - -if (i == 0) { - i = 1; -} else if (i == 2) { - i = 0; -} - -if (i == 0) { -i = 1; } else if (i == 2) { -i = 0; } - -if (i == 0) { // comments are allowed - i = 1; -} - -if (i == 0) {// comments are allowed - i = 1; -} - -if (i == 0) { /* comments are allowed*/ - i = 1; -} - -if (i == 0) { // this is ok - i = 1; -} - -if (i == 0) { /* this is ok */ -} - -try { - code = 'this'; -} catch (e) { - // Caught! -} - -try { -code = 'this'; } catch (e) { - // Caught! -} - -do { -i = 0; -} while (i > 0); - -if (i === 0) { - - i = 1 -} - -if (window.jQuery)(function($) { - $.fn.reset = function() { - return this.each(function() { - try { - this.reset(); - } catch (e) { - } - }); - }; -})(jQuery); - -if ($("#myid").rotationDegrees()=='90') - $('.modal').css({'transform': 'rotate(90deg)'}); - -if ($("#myid").rotationDegrees()=='90') - $foo = {'transform': 'rotate(90deg)'}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.php deleted file mode 100644 index 07e57b4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.php +++ /dev/null @@ -1,101 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ControlSignatureUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='ControlSignatureUnitTest.inc') - { - $errors = [ - 7 => 1, - 12 => 1, - 15 => 1, - 18 => 1, - 20 => 1, - 22 => 2, - 28 => 2, - 32 => 1, - 38 => 2, - 42 => 1, - 48 => 2, - 52 => 1, - 62 => 2, - 66 => 2, - 76 => 4, - 80 => 2, - 94 => 1, - 99 => 1, - 108 => 1, - 112 => 1, - ]; - - if ($testFile === 'ControlSignatureUnitTest.inc') { - $errors[122] = 1; - $errors[130] = 2; - $errors[134] = 1; - $errors[150] = 1; - $errors[153] = 1; - $errors[158] = 1; - $errors[165] = 1; - $errors[170] = 2; - $errors[185] = 1; - $errors[190] = 2; - $errors[191] = 2; - $errors[195] = 1; - $errors[227] = 1; - $errors[234] = 1; - $errors[239] = 2; - $errors[243] = 2; - $errors[244] = 2; - $errors[248] = 1; - $errors[259] = 1; - $errors[262] = 1; - $errors[267] = 1; - $errors[269] = 1; - $errors[276] = 1; - $errors[279] = 1; - $errors[283] = 1; - }//end if - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc deleted file mode 100644 index 91d0a23..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc +++ /dev/null @@ -1,14 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ElseIfDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 8 => 1, - 13 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc deleted file mode 100644 index 4709923..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc +++ /dev/null @@ -1,36 +0,0 @@ - $that) { -} - -// Invalid. -foreach ( $something as $blah => $that ) { -} - -foreach ($something as $blah => $that) { -} - -foreach ($something as $blah => $that) { -} - -foreach (${something}AS$blah=>$that) { -} - -// The works. -foreach ( $something aS $blah => $that ) { -} - -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesBeforeClose 1 -foreach ($something as $blah => $that) {} -foreach ( $something as $blah => $that ) {} -foreach ( $something as $blah => $that ) {} -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesBeforeClose 0 - -foreach ([ - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ] as $key => $value) { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc.fixed deleted file mode 100644 index b0de6eb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,36 +0,0 @@ - $that) { -} - -// Invalid. -foreach ($something as $blah => $that) { -} - -foreach ($something as $blah => $that) { -} - -foreach ($something as $blah => $that) { -} - -foreach (${something} as $blah => $that) { -} - -// The works. -foreach ($something as $blah => $that) { -} - -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesBeforeClose 1 -foreach ( $something as $blah => $that ) {} -foreach ( $something as $blah => $that ) {} -foreach ( $something as $blah => $that ) {} -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesBeforeClose 0 - -foreach ([ - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ] as $key => $value) { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.php deleted file mode 100644 index 6957ff6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ForEachLoopDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 8 => 2, - 11 => 2, - 14 => 2, - 17 => 5, - 21 => 7, - 26 => 2, - 28 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.inc deleted file mode 100644 index 5022e74..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.inc +++ /dev/null @@ -1,129 +0,0 @@ -i ; }; $i < function() { return $this->max; }; $i++) {} -for ($i = function() { return $this->i; }; $i < function() { return $this->max; } ; $i++) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration ignoreNewlines true -for ( - $i = 0; - $i < 5; - $i++ -) { - // body here -} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration ignoreNewlines false - -// This test has to be the last one in the file! Intentional parse error check. -for diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.inc.fixed deleted file mode 100644 index 6a1e763..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,95 +0,0 @@ -i ; }; $i < function() { return $this->max; }; $i++) {} -for ($i = function() { return $this->i; }; $i < function() { return $this->max; }; $i++) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration ignoreNewlines true -for ( - $i = 0; - $i < 5; - $i++ -) { - // body here -} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration ignoreNewlines false - -// This test has to be the last one in the file! Intentional parse error check. -for diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.js deleted file mode 100644 index cfda6c1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.js +++ /dev/null @@ -1,125 +0,0 @@ -// Valid. -for (var i = 0; i < 10; i++) { -} - -// Invalid. -for ( i = 0; i < 10; i++ ) { -} - -for (i = 0; i < 10; i++) { -} - -for (var i = 0 ; i < 10 ; i++) { -} - -for (i = 0;i < 10;i++) { -} - -// The works. -for ( var i = 0 ; i < 10 ; i++ ) { -} - -this.formats = {}; -dfx.inherits('ContentFormat', 'Widget'); - -for (var widgetid in this.loadedContents) { - if (dfx.isset(widget) === true) { - widget.loadAutoSaveCWidgetStore.setData('activeScreen', null);widget.getContents(this.loadedContents[widgetid], function() {self.widgetLoaded(widget.id);}); - } -} - -for (var i = 0; i < 10;) { -} -for (var i = 0; i < 10; ) { -} - -for (var i = 0; ; i++) { -} -for (var i = 0;; i++) { -} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for (var i = 0; i < 10; i++) {} -for ( var i = 0; i < 10; i++ ) {} -for ( var i = 0; i < 10; i++ ) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -for ( ; i < 10; i++) {} -for (; i < 10; i++) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for ( ; i < 10; i++ ) {} -for ( ; i < 10; i++ ) {} -for (; i < 10; i++ ) {} - -for ( i = 0; i < 10; ) {} -for ( i = 0; i < 10;) {} -for ( i = 0; i < 10; ) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -// Test handling of comments and inline annotations. -for ( /*phpcs:enable*/ i = 0 /*start*/ ; /*end*/i < 10/*comment*/; i++ /*comment*/ ) {} - -// Test multi-line FOR control structure. -for ( - i = 0; - i < 10; - i++ -) {} - -// Test multi-line FOR control structure with comments and annotations. -for ( - i = 0; /* Start */ - i < 10; /* phpcs:ignore Standard.Category.SniffName -- for reasons. */ - i++ // comment - -) {} - -// Test fixing each error in one go. Note: lines 84 + 88 contain trailing whitespace on purpose. -for ( - - - i = 0 - - ; - - i < 10 - - ; - - i++ - - -) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for ( - - - - i = 0 - - ; - - i < 10 - - ; - - i++ - - -) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -// Test with semi-colon not belonging to for. -for (i = function() {self.widgetLoaded(widget.id) ; }; i < function() {self.widgetLoaded(widget.id);}; i++) {} -for (i = function() {self.widgetLoaded(widget.id);}; i < function() {self.widgetLoaded(widget.id);} ; i++) {} - -// This test has to be the last one in the file! Intentional parse error check. -for diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.js.fixed deleted file mode 100644 index 00ced64..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.js.fixed +++ /dev/null @@ -1,91 +0,0 @@ -// Valid. -for (var i = 0; i < 10; i++) { -} - -// Invalid. -for (i = 0; i < 10; i++) { -} - -for (i = 0; i < 10; i++) { -} - -for (var i = 0; i < 10; i++) { -} - -for (i = 0; i < 10; i++) { -} - -// The works. -for (var i = 0; i < 10; i++) { -} - -this.formats = {}; -dfx.inherits('ContentFormat', 'Widget'); - -for (var widgetid in this.loadedContents) { - if (dfx.isset(widget) === true) { - widget.loadAutoSaveCWidgetStore.setData('activeScreen', null);widget.getContents(this.loadedContents[widgetid], function() {self.widgetLoaded(widget.id);}); - } -} - -for (var i = 0; i < 10;) { -} -for (var i = 0; i < 10;) { -} - -for (var i = 0;; i++) { -} -for (var i = 0;; i++) { -} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for ( var i = 0; i < 10; i++ ) {} -for ( var i = 0; i < 10; i++ ) {} -for ( var i = 0; i < 10; i++ ) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -for (; i < 10; i++) {} -for (; i < 10; i++) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for ( ; i < 10; i++ ) {} -for ( ; i < 10; i++ ) {} -for ( ; i < 10; i++ ) {} - -for ( i = 0; i < 10; ) {} -for ( i = 0; i < 10; ) {} -for ( i = 0; i < 10; ) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -// Test handling of comments and inline annotations. -for (/*phpcs:enable*/ i = 0 /*start*/; /*end*/i < 10/*comment*/; i++ /*comment*/) {} - -// Test multi-line FOR control structure. -for (i = 0; i < 10; i++) {} - -// Test multi-line FOR control structure with comments and annotations. -for (i = 0; /* Start */ - i < 10; /* phpcs:ignore Standard.Category.SniffName -- for reasons. */ - i++ // comment - -) {} - -// Test fixing each error in one go. Note: lines 84 + 88 contain trailing whitespace on purpose. -for (i = 0; i < 10; i++) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for ( i = 0; i < 10; i++ ) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -// Test with semi-colon not belonging to for. -for (i = function() {self.widgetLoaded(widget.id) ; }; i < function() {self.widgetLoaded(widget.id);}; i++) {} -for (i = function() {self.widgetLoaded(widget.id);}; i < function() {self.widgetLoaded(widget.id);}; i++) {} - -// This test has to be the last one in the file! Intentional parse error check. -for diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.php deleted file mode 100644 index 5163886..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.php +++ /dev/null @@ -1,132 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ForLoopDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='ForLoopDeclarationUnitTest.inc') - { - switch ($testFile) { - case 'ForLoopDeclarationUnitTest.inc': - return [ - 8 => 2, - 11 => 2, - 14 => 2, - 17 => 2, - 21 => 6, - 27 => 1, - 30 => 1, - 37 => 2, - 39 => 2, - 43 => 1, - 49 => 1, - 50 => 1, - 53 => 1, - 54 => 1, - 59 => 4, - 62 => 1, - 63 => 1, - 64 => 1, - 66 => 1, - 69 => 1, - 74 => 1, - 77 => 1, - 82 => 2, - 86 => 2, - 91 => 1, - 95 => 1, - 101 => 2, - 105 => 2, - 110 => 1, - 116 => 2, - ]; - - case 'ForLoopDeclarationUnitTest.js': - return [ - 6 => 2, - 9 => 2, - 12 => 2, - 15 => 2, - 19 => 6, - 33 => 1, - 36 => 1, - 43 => 2, - 45 => 2, - 49 => 1, - 55 => 1, - 56 => 1, - 59 => 1, - 60 => 1, - 65 => 4, - 68 => 1, - 69 => 1, - 70 => 1, - 72 => 1, - 75 => 1, - 80 => 1, - 83 => 1, - 88 => 2, - 92 => 2, - 97 => 1, - 101 => 1, - 107 => 2, - 111 => 2, - 116 => 1, - 122 => 2, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='ForLoopDeclarationUnitTest.inc') - { - switch ($testFile) { - case 'ForLoopDeclarationUnitTest.inc': - return [129 => 1]; - - case 'ForLoopDeclarationUnitTest.js': - return [125 => 1]; - - default: - return []; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc deleted file mode 100644 index f54ed8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc +++ /dev/null @@ -1,48 +0,0 @@ -id.'"', - '"'.$this->stepInfo['title'].'"', - '"'.((isset($this->stepInfo['description']) === TRUE) ? $this->stepInfo['description'] : '').'"', - '"'.(isset($this->stepInfo['description']) === TRUE ? $this->stepInfo['description'] : '').'"', - '"'.$this->stepInfo['title'].'"', - ); - -echo (TRUE)?'Hello':'Bye'; - -$array = array( - 'one' => ($test == 1) ? true : false, - 'two' => (($test == 1) ? true : false), - 'three' => (($test == 1) ? true : false) -); -$var = ($test == 1) ? true : false; -$var = (myFunc(1,2,3) == 1) ? true : false; - -set('config', function() { - $foo = ($bar === "on") ? "1" : "2"; -}); - -$config = function() { - $foo = ($bar === "on") ? "1" : "2"; -}; - -rand(0, 1) ? 'ěščřžýáí' : NULL; - -$c = ($argv[1]) ? : ""; -$filepath = realpath($argv[1]) ?: $argv[1]; -$c = ($argv[1]) ? /* comment */ : ""; -$c = ($argv[1]) ? -: ""; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc.fixed deleted file mode 100644 index f7aa1d6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,48 +0,0 @@ -id.'"', - '"'.$this->stepInfo['title'].'"', - '"'.((isset($this->stepInfo['description']) === TRUE) ? $this->stepInfo['description'] : '').'"', - '"'.(isset($this->stepInfo['description']) === TRUE ? $this->stepInfo['description'] : '').'"', - '"'.$this->stepInfo['title'].'"', - ); - -echo (TRUE) ? 'Hello' : 'Bye'; - -$array = array( - 'one' => ($test == 1) ? true : false, - 'two' => (($test == 1) ? true : false), - 'three' => (($test == 1) ? true : false) -); -$var = ($test == 1) ? true : false; -$var = (myFunc(1,2,3) == 1) ? true : false; - -set('config', function() { - $foo = ($bar === "on") ? "1" : "2"; -}); - -$config = function() { - $foo = ($bar === "on") ? "1" : "2"; -}; - -rand(0, 1) ? 'ěščřžýáí' : NULL; - -$c = ($argv[1]) ?: ""; -$filepath = realpath($argv[1]) ?: $argv[1]; -$c = ($argv[1]) ? /* comment */ : ""; -$c = ($argv[1]) ? -: ""; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.php deleted file mode 100644 index 97212db..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class InlineIfDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getCliValues($testFile) - { - return ['--encoding=utf-8']; - - }//end getCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 8 => 1, - 9 => 1, - 10 => 1, - 13 => 1, - 20 => 1, - 24 => 4, - 44 => 1, - 47 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.inc deleted file mode 100644 index c82f35a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.inc +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LowercaseDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 1, - 7 => 1, - 9 => 1, - 10 => 1, - 12 => 1, - 14 => 1, - 15 => 1, - 16 => 1, - 20 => 1, - 21 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.inc deleted file mode 100644 index cf39760..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.inc +++ /dev/null @@ -1,333 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class SwitchDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='SwitchDeclarationUnitTest.inc') - { - switch ($testFile) { - case 'SwitchDeclarationUnitTest.inc': - return [ - 27 => 1, - 29 => 1, - 34 => 1, - 36 => 1, - 44 => 1, - 48 => 1, - 52 => 1, - 54 => 1, - 55 => 1, - 56 => 1, - 58 => 1, - 59 => 1, - 61 => 1, - 62 => 1, - 79 => 1, - 85 => 2, - 88 => 2, - 89 => 2, - 92 => 1, - 95 => 3, - 99 => 1, - 116 => 1, - 122 => 1, - 127 => 2, - 134 => 2, - 135 => 1, - 138 => 1, - 143 => 1, - 144 => 1, - 147 => 1, - 165 => 1, - 172 => 1, - 176 => 2, - 180 => 1, - 192 => 2, - 196 => 1, - 223 => 1, - 266 => 1, - 282 => 1, - 284 => 2, - 322 => 1, - 323 => 1, - 327 => 1, - 329 => 1, - 330 => 1, - ]; - - case 'SwitchDeclarationUnitTest.js': - return [ - 27 => 1, - 29 => 1, - 34 => 1, - 36 => 1, - 44 => 1, - 48 => 1, - 52 => 1, - 54 => 1, - 55 => 1, - 56 => 1, - 58 => 1, - 59 => 1, - 61 => 1, - 62 => 1, - 79 => 1, - 85 => 2, - 88 => 2, - 89 => 2, - 92 => 1, - 95 => 3, - 99 => 1, - 116 => 1, - 122 => 1, - 127 => 2, - 134 => 2, - 135 => 1, - 138 => 1, - 143 => 1, - 144 => 1, - 147 => 1, - 165 => 1, - 172 => 1, - 176 => 2, - 180 => 1, - 192 => 2, - 196 => 1, - 223 => 1, - 266 => 1, - 282 => 1, - 284 => 2, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='SwitchDeclarationUnitTest.inc') - { - if ($testFile === 'SwitchDeclarationUnitTest.js') { - return [273 => 1]; - } - - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.js deleted file mode 100644 index 797e0ee..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.js +++ /dev/null @@ -1,2 +0,0 @@ -alert('hi') -alert('hi'); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.php deleted file mode 100644 index 7ccfe1a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Debug; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; -use PHP_CodeSniffer\Config; - -class JSLintUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Should this test be skipped for some reason. - * - * @return void - */ - protected function shouldSkipTest() - { - $jslPath = Config::getExecutablePath('jslint'); - if ($jslPath === null) { - return true; - } - - return false; - - }//end shouldSkipTest() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 1 => 2, - 2 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.js deleted file mode 100644 index 797e0ee..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.js +++ /dev/null @@ -1,2 +0,0 @@ -alert('hi') -alert('hi'); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.php deleted file mode 100644 index 1e83f1f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Debug; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; -use PHP_CodeSniffer\Config; - -class JavaScriptLintUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Should this test be skipped for some reason. - * - * @return void - */ - protected function shouldSkipTest() - { - $jslPath = Config::getExecutablePath('jsl'); - if ($jslPath === null) { - return true; - } - - return false; - - }//end shouldSkipTest() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [2 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.1.inc deleted file mode 100644 index 3279edb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.1.inc +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.2.inc deleted file mode 100644 index 05be633..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.2.inc +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.3.inc deleted file mode 100644 index ec1b023..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.3.inc +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.4.inc deleted file mode 100644 index ed04564..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.4.inc +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.php deleted file mode 100644 index 7e613b3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FileExtensionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FileExtensionUnitTest.1.inc': - return [1 => 1]; - default: - return []; - } - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.inc deleted file mode 100644 index e9c8061..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.inc +++ /dev/null @@ -1,172 +0,0 @@ -words[$wordPos-1]) || $this->words[$wordPos-1] !== ' ') { -} else if ($this->tokens[$pos + 1] === "\n") { -} - -if ($pos === count($this->tokens) - 1) { - $file = '...'.substr($file, (($padding * -1) + 3)); -} - -if (substr($basename, -5) !== 'Sniff') { - $i = ($this->_tokens[$i]['parenthesis_closer'] + 1); -} - -$pos = $this->_getShortCommentEndPos(); -if ($pos === -1) { - $stackPtr = ($tokens[$next][$to] - 1); - $stackPtr = ($tokens[$next][$pattern[$i]['to']] + 1); - $var = (($var1 + $var2) + $var3 + $var4) -} - -$commentStart = ($phpcsFile->findPrevious(T_DOC_COMMENT, ($commentEnd - 1), null, true) + 1); -$commentEnd = ($this->_phpcsFile->findNext(T_DOC_COMMENT, ($commentStart + 1), null, true) - 1); -$expected .= '...'.substr($tokens[($stackPtr - 2)]['content'], -5).$tokens[$stackPtr]['content']; - -if (($tokens[$nextToken - 1]['code']) !== T_WHITESPACE) { - $errorPos = ($params[(count($params) - 1)]->getLine() + $commentStart); -} - -while (($nextSpace = $phpcsFile->findNext(T_WHITESPACE, $nextSpace + 1, $nextBreak)) !== false) { -} - -foreach ($attributes as $id => &$attribute) { -} - -class MyClass -{ - - - public function &myFunction(array &$one, array &$two) - { - - }//end myFunction() - - -}//end class - -if ($index < -1) $index = 0; -if ($index < - 1) $index = 0; - -$three = ceil($one / $two); -$three = ceil(($one / $two) / $four); -$three = ceil($one / ($two / $four)); - -$four = -0.25; - -$three = ceil($one[1] / $two); - -switch ($number % 10) { - case -1: - $suffix = 'st'; - break; -} - -$expectedPermission = array( - 'granted' => 4, - 'denied' => 1, - 'cascade' => TRUE, - 'blockergranted' => 2, - 'blockerdenied' => - 3, - 'effective' => TRUE, - ); - -$value = (int) isset($blah) + 2; -$value = (int) isset($blah) + (int) isset($foo) + (int) isset($bar); - -doSomething(getValue($var, 2)) - $y; - -$codeFiles = array($global => $codeFiles[$global]) + $codeFiles; - -$var = array(-1); -$var = [-1]; -$var = [0, -1, -2]; - -$cntPages = ceil(count($items) / self::ON_PAGE); - -error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); -error_reporting(E_ALL & ~E_NOTICE | ~E_WARNING); -$results = $stmt->fetchAll(\PDO::FETCH_ASSOC | \PDO::FETCH_GROUP | \PDO::FETCH_UNIQUE); -$di = new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS); -foo(1 + 2 + 3); - -if (empty($foo[-1]) === true) { - $foo[-1] = 'foo'; -} - -try { -} catch (AException | BException $e) { -} - -$var = $foo['blah'] + []; - -$a = 2 * ${x} - ${minus}; - -$foo = $bar ?? $baz ?? ''; - -$foo = $myString{-1}; - -$value = (binary) $blah + b"binary $foo"; - -$test = (1 * static::TEST); -$test = myfunc(1 * static::TEST); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.inc.fixed deleted file mode 100644 index a0e0a89..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.inc.fixed +++ /dev/null @@ -1,172 +0,0 @@ -words[($wordPos-1)]) || $this->words[($wordPos-1)] !== ' ') { -} else if ($this->tokens[($pos + 1)] === "\n") { -} - -if ($pos === (count($this->tokens) - 1)) { - $file = '...'.substr($file, (($padding * -1) + 3)); -} - -if (substr($basename, -5) !== 'Sniff') { - $i = ($this->_tokens[$i]['parenthesis_closer'] + 1); -} - -$pos = $this->_getShortCommentEndPos(); -if ($pos === -1) { - $stackPtr = ($tokens[$next][$to] - 1); - $stackPtr = ($tokens[$next][$pattern[$i]['to']] + 1); - $var = (($var1 + $var2) + $var3 + $var4) -} - -$commentStart = ($phpcsFile->findPrevious(T_DOC_COMMENT, ($commentEnd - 1), null, true) + 1); -$commentEnd = ($this->_phpcsFile->findNext(T_DOC_COMMENT, ($commentStart + 1), null, true) - 1); -$expected .= '...'.substr($tokens[($stackPtr - 2)]['content'], -5).$tokens[$stackPtr]['content']; - -if (($tokens[($nextToken - 1)]['code']) !== T_WHITESPACE) { - $errorPos = ($params[(count($params) - 1)]->getLine() + $commentStart); -} - -while (($nextSpace = $phpcsFile->findNext(T_WHITESPACE, ($nextSpace + 1), $nextBreak)) !== false) { -} - -foreach ($attributes as $id => &$attribute) { -} - -class MyClass -{ - - - public function &myFunction(array &$one, array &$two) - { - - }//end myFunction() - - -}//end class - -if ($index < -1) $index = 0; -if ($index < - 1) $index = 0; - -$three = ceil($one / $two); -$three = ceil(($one / $two) / $four); -$three = ceil($one / ($two / $four)); - -$four = -0.25; - -$three = ceil($one[1] / $two); - -switch ($number % 10) { - case -1: - $suffix = 'st'; - break; -} - -$expectedPermission = array( - 'granted' => 4, - 'denied' => 1, - 'cascade' => TRUE, - 'blockergranted' => 2, - 'blockerdenied' => - 3, - 'effective' => TRUE, - ); - -$value = ((int) isset($blah) + 2); -$value = ((int) isset($blah) + (int) isset($foo) + (int) isset($bar)); - -(doSomething(getValue($var, 2)) - $y); - -$codeFiles = (array($global => $codeFiles[$global]) + $codeFiles); - -$var = array(-1); -$var = [-1]; -$var = [0, -1, -2]; - -$cntPages = ceil(count($items) / self::ON_PAGE); - -error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); -error_reporting(E_ALL & ~E_NOTICE | ~E_WARNING); -$results = $stmt->fetchAll(\PDO::FETCH_ASSOC | \PDO::FETCH_GROUP | \PDO::FETCH_UNIQUE); -$di = new \RecursiveDirectoryIterator($path, (\RecursiveDirectoryIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS)); -foo(1 + 2 + 3); - -if (empty($foo[-1]) === true) { - $foo[-1] = 'foo'; -} - -try { -} catch (AException | BException $e) { -} - -$var = ($foo['blah'] + []); - -$a = 2 * ${x} - ${minus}; - -$foo = ($bar ?? $baz ?? ''); - -$foo = $myString{-1}; - -$value = ((binary) $blah + b"binary $foo"); - -$test = (1 * static::TEST); -$test = myfunc(1 * static::TEST); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js deleted file mode 100644 index 92ed803..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js +++ /dev/null @@ -1,118 +0,0 @@ -value = (one + two); -value = one + two; - -value = (one - two); -value = one - two; - -value = (one * two); -value = one * two; - -value = (one / two); -value = one / two; - -value = (one % two); -value = one % two; - -value = (one + two + three); -value = one + two + three; -value = (one + (two + three)); -value = one + (two + three); - -value++; -value--; -value = -1; -value = - 1; - -value = (1 + 2); -value = 1 + 2; - -value = (1 - 2); -value = 1 - 2; - -value = (1 * 2); -value = 1 * 2; - -value = (1 / 2); -value = 1 / 2; - -value = (1 % 2); -value = 1 % 2; - -value = (1 + 2 + 3); -value = 1 + 2 + 3; -value = (1 + (2 + 3)); -value = 1 + (2 + 3); - -value = one + 2 + 3 - (four * five * (6 + 7)) + nine + 2; -value = myFunction(tokens[stackPtr - 1]); - -for (i = 1 + 2; i < 4 + 5; i++) { -} - -function myFunction() -{ - value = (one + 1) + (two + 2) + (myFunction() + 2); - value = myFunction() + 2; - value = (myFunction(mvar) + myFunction2(mvar)); - return -1; -} - -params['mode'] = id.replace(/WidgetType/, ''); - -if (index < -1) index = 0; -if (index < - 1) index = 0; - -var classN = prvId.replace(/\./g, '-'); - -three = myFunction(one / two); -three = myFunction((one / two) / four); -three = myFunction(one / (two / four)); - -four = -0.25; - -id = id.replace(/row\/:/gi, ''); -return /MSIE/.test(navigator.userAgent); - -var re = new RegExp(/<\/?(\w+)((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?>/gim); - -var options = { - minVal: -1, - maxVal: -1 -}; - -stepWidth = Math.round(this.width / 5); - -date.setMonth(d[2] - 1); - -switch (number % 10) { - case -1: - suffix = 'st'; - break; -} - -var pathSplit = ipt.value.split(/\/|\\/); - -if (pairs[i].search(/=/) !== -1) { -} - -if (urlValue.search(/[a-zA-z]+:\/\//) !== 0) { -} - -if (urlValue.search(/[a-zA-z]+:\/\/*/) !== 0) { -} - -if (!value || /^\s*$/.test(value)) { - return true; -} - -parseInt(dfx.attr(selectors[idx], 'elemOffsetTop'), 10) - scrollCoords.y + 'px' - -if (something === true - ^ somethingElse === true -) { - return false; -} - -if (true === /^\d*\.?\d*$/.test(input)) return true; - -if ( ! /^(?:a|select)$/i.test( element.tagName ) ) return true; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js.fixed deleted file mode 100644 index 04e35d9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js.fixed +++ /dev/null @@ -1,118 +0,0 @@ -value = (one + two); -value = one + two; - -value = (one - two); -value = (one - two); - -value = (one * two); -value = (one * two); - -value = (one / two); -value = (one / two); - -value = (one % two); -value = (one % two); - -value = (one + two + three); -value = one + two + three; -value = (one + (two + three)); -value = one + (two + three); - -value++; -value--; -value = -1; -value = - 1; - -value = (1 + 2); -value = 1 + 2; - -value = (1 - 2); -value = (1 - 2); - -value = (1 * 2); -value = (1 * 2); - -value = (1 / 2); -value = (1 / 2); - -value = (1 % 2); -value = (1 % 2); - -value = (1 + 2 + 3); -value = 1 + 2 + 3; -value = (1 + (2 + 3)); -value = 1 + (2 + 3); - -value = one + 2 + (3 - (four * five * (6 + 7))) + nine + 2; -value = myFunction(tokens[(stackPtr - 1)]); - -for (i = 1 + 2; i < 4 + 5; i++) { -} - -function myFunction() -{ - value = (one + 1) + (two + 2) + (myFunction() + 2); - value = myFunction() + 2; - value = (myFunction(mvar) + myFunction2(mvar)); - return -1; -} - -params['mode'] = id.replace(/WidgetType/, ''); - -if (index < -1) index = 0; -if (index < - 1) index = 0; - -var classN = prvId.replace(/\./g, '-'); - -three = myFunction(one / two); -three = myFunction((one / two) / four); -three = myFunction(one / (two / four)); - -four = -0.25; - -id = id.replace(/row\/:/gi, ''); -return /MSIE/.test(navigator.userAgent); - -var re = new RegExp(/<\/?(\w+)((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?>/gim); - -var options = { - minVal: -1, - maxVal: -1 -}; - -stepWidth = Math.round(this.width / 5); - -date.setMonth(d[2] - 1); - -switch (number % 10) { - case -1: - suffix = 'st'; - break; -} - -var pathSplit = ipt.value.split(/\/|\\/); - -if (pairs[i].search(/=/) !== -1) { -} - -if (urlValue.search(/[a-zA-z]+:\/\//) !== 0) { -} - -if (urlValue.search(/[a-zA-z]+:\/\/*/) !== 0) { -} - -if (!value || /^\s*$/.test(value)) { - return true; -} - -(parseInt(dfx.attr(selectors[idx], 'elemOffsetTop'), 10) - scrollCoords.y) + 'px' - -if (something === true - ^ somethingElse === true -) { - return false; -} - -if (true === /^\d*\.?\d*$/.test(input)) return true; - -if ( ! /^(?:a|select)$/i.test( element.tagName ) ) return true; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.php deleted file mode 100644 index 651319b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Formatting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class OperatorBracketUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='OperatorBracketUnitTest.inc') - { - switch ($testFile) { - case 'OperatorBracketUnitTest.inc': - return [ - 3 => 1, - 6 => 1, - 9 => 1, - 12 => 1, - 15 => 1, - 18 => 2, - 20 => 1, - 25 => 1, - 28 => 1, - 31 => 1, - 34 => 1, - 37 => 1, - 40 => 1, - 43 => 2, - 45 => 1, - 47 => 5, - 48 => 1, - 50 => 2, - 55 => 2, - 56 => 1, - 63 => 2, - 64 => 1, - 67 => 1, - 86 => 1, - 90 => 1, - 109 => 1, - 130 => 1, - 134 => 1, - 135 => 2, - 137 => 1, - 139 => 1, - 150 => 1, - 161 => 1, - 163 => 2, - 165 => 2, - 169 => 1, - ]; - break; - case 'OperatorBracketUnitTest.js': - return [ - 5 => 1, - 8 => 1, - 11 => 1, - 14 => 1, - 24 => 1, - 30 => 1, - 33 => 1, - 36 => 1, - 39 => 1, - 46 => 1, - 47 => 1, - 63 => 1, - 108 => 1, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.inc deleted file mode 100644 index 33564e2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.inc +++ /dev/null @@ -1,111 +0,0 @@ - $a($b); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.inc.fixed deleted file mode 100644 index 68fb1c1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,111 +0,0 @@ - $a($b); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.php deleted file mode 100644 index 65e987d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionDeclarationArgumentSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 2, - 7 => 2, - 8 => 2, - 9 => 2, - 11 => 2, - 13 => 7, - 14 => 2, - 15 => 2, - 16 => 4, - 18 => 2, - 35 => 2, - 36 => 2, - 44 => 2, - 45 => 1, - 46 => 1, - 51 => 2, - 53 => 2, - 55 => 1, - 56 => 1, - 58 => 1, - 73 => 7, - 76 => 1, - 77 => 1, - 81 => 1, - 89 => 2, - 92 => 1, - 93 => 1, - 94 => 1, - 95 => 1, - 99 => 11, - 100 => 2, - 101 => 2, - 102 => 2, - 106 => 1, - 107 => 2, - 111 => 3, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.inc deleted file mode 100644 index 0cde113..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.inc +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 55 => 1, - 68 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.inc deleted file mode 100644 index 27102d0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.inc +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.php deleted file mode 100644 index da09cef..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionDuplicateArgumentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 4 => 2, - 5 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.inc deleted file mode 100644 index b7b7f20..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.inc +++ /dev/null @@ -1,17 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.php deleted file mode 100644 index 7be7648..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class GlobalFunctionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [2 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc deleted file mode 100644 index 4e86833..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc +++ /dev/null @@ -1,28 +0,0 @@ - $x; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc.fixed deleted file mode 100644 index 48c9977..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc.fixed +++ /dev/null @@ -1,28 +0,0 @@ - $x; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.php deleted file mode 100644 index 1e1537b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LowercaseFunctionKeywordsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 16 => 1, - 17 => 1, - 20 => 1, - 21 => 1, - 22 => 1, - 23 => 1, - 24 => 3, - 25 => 4, - 28 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.inc deleted file mode 100644 index 3076104..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.inc +++ /dev/null @@ -1,199 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class MultiLineFunctionDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='MultiLineFunctionDeclarationUnitTest.inc') - { - if ($testFile === 'MultiLineFunctionDeclarationUnitTest.inc') { - $errors = [ - 2 => 1, - 3 => 1, - 4 => 2, - 5 => 1, - 7 => 1, - 11 => 1, - 12 => 1, - 13 => 1, - 16 => 1, - 36 => 1, - 43 => 2, - 48 => 1, - 81 => 1, - 82 => 2, - 88 => 1, - 102 => 2, - 137 => 1, - 141 => 2, - 142 => 1, - 158 => 1, - 160 => 1, - 182 => 2, - 186 => 2, - 190 => 2, - 194 => 1, - 195 => 1, - 196 => 1, - ]; - } else { - $errors = [ - 2 => 1, - 3 => 1, - 4 => 2, - 5 => 1, - 7 => 1, - 11 => 1, - 12 => 1, - 13 => 1, - 16 => 1, - 26 => 1, - 36 => 1, - 43 => 2, - 48 => 1, - 65 => 1, - ]; - }//end if - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.inc deleted file mode 100644 index aacef34..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.inc +++ /dev/null @@ -1,27 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.php deleted file mode 100644 index 77f13bb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ValidFunctionNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 8 => 1, - 9 => 1, - 11 => 1, - 12 => 1, - 13 => 1, - 14 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.inc deleted file mode 100644 index 5692d6b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.inc +++ /dev/null @@ -1,144 +0,0 @@ -varName2; -echo $this->var_name2; -echo $this->varname2; -echo $this->_varName2; -echo $object->varName2; -echo $object->var_name2; -echo $object_name->varname2; -echo $object_name->_varName2; - -echo $this->myFunction($one, $two); -echo $object->myFunction($one_two); - -$error = "format is \$GLOBALS['$varName']"; - -echo $_SESSION['var_name']; -echo $_FILES['var_name']; -echo $_ENV['var_name']; -echo $_COOKIE['var_name']; - -$XML = 'hello'; -$myXML = 'hello'; -$XMLParser = 'hello'; -$xmlParser = 'hello'; - -echo "{$_SERVER['HOSTNAME']} $var_name"; - -// Need to be the last thing in this test file. -$obj->$classVar = $prefix.'-'.$type; - -class foo -{ - const bar = << - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ValidVariableNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - $errors = [ - 3 => 1, - 5 => 1, - 10 => 1, - 12 => 1, - 15 => 1, - 17 => 1, - 20 => 1, - 22 => 1, - 25 => 1, - 27 => 1, - 31 => 1, - 33 => 1, - 36 => 1, - 37 => 1, - 39 => 1, - 42 => 1, - 44 => 1, - 53 => 1, - 58 => 1, - 62 => 1, - 63 => 1, - 64 => 1, - 67 => 1, - 81 => 1, - 106 => 1, - 107 => 2, - 108 => 1, - 111 => 1, - 112 => 1, - 113 => 1, - 114 => 1, - 123 => 1, - 138 => 1, - 141 => 1, - ]; - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.js deleted file mode 100644 index 1c61fbf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.js +++ /dev/null @@ -1,37 +0,0 @@ -function test(id) -{ - - this.id = id; - -} -/**/ -test.prototype = { - init: function() - { - var x = {}; - x.name = 'test'; - x['phone'] = 123124324; - var t = ['test', 'this'].join(''); - var y = ['test'].join(''); - var a = x[0]; - var z = x[x['name']]; - var p = x[x.name]; - } - -}; - -function test() { - this.errors['step_' + step] = errors; - this.errors['test'] = x; - this.errors['test' + 10] = x; - this.errors['test' + y] = x; - this.errors['test' + 'blah'] = x; - this.errors[y] = x; - this.errors[y + z] = x; - this.permissions['workflow.cancel'] = x; -} - -if (child.prototype) { - above.prototype['constructor'] = parent; - child.prototype['super'] = new above(); -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.php deleted file mode 100644 index cb2d58e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowObjectStringIndexUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='DisallowObjectStringIndexUnitTest.js') - { - if ($testFile !== 'DisallowObjectStringIndexUnitTest.js') { - return []; - } - - return [ - 13 => 1, - 17 => 1, - 25 => 1, - 35 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.inc deleted file mode 100644 index 8a5c232..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.inc +++ /dev/null @@ -1,17 +0,0 @@ - new MyClass()); -$object->myFunction(new MyClass()); - -throw new MyException($msg); - -function foo() { return new MyClass(); } - -$doodad = $x ? new Foo : new Bar; - -function new -?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.php deleted file mode 100644 index fa32521..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ObjectInstantiationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 8 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js deleted file mode 100644 index 28bf85a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js +++ /dev/null @@ -1,47 +0,0 @@ -this.request({ action: 'getTypeFormatContents', }); - -addTypeFormatButton.addClickEvent(function() { - self.addNewTypeFormat(); -}); - -var x = {}; - -var y = { - VarOne : 'If you ask me, thats if you ask', - VarTwo : ['Alonzo played you', 'for a fool', 'esse'], - VarThree: function(arg) { - console.info(1); - } -}; - -var z = { - VarOne : 'If you ask me, thats if you ask', - VarTwo : ['Alonzo played you', 'for a fool', 'esse'], - VarThree: function(arg) { - console.info(1); - }, -}; - -var x = function() { - console.info(2); -}; - -AssetListingEditWidgetType.prototype = { - init: function(data, assetid, editables) - { - } -}; - -AssetListingEditWidgetType.prototype = { - init: function(data, assetid, editables) - { - }, -}; - -AssetListingEditWidgetType.prototype = { - // phpcs: disable Standard.Cat.SniffName -- testing annotation between closing brace and comma - init: function(data, assetid, editables) - { - }, - // phpcs:enable -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js.fixed deleted file mode 100644 index df548c7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js.fixed +++ /dev/null @@ -1,47 +0,0 @@ -this.request({ action: 'getTypeFormatContents' }); - -addTypeFormatButton.addClickEvent(function() { - self.addNewTypeFormat(); -}); - -var x = {}; - -var y = { - VarOne : 'If you ask me, thats if you ask', - VarTwo : ['Alonzo played you', 'for a fool', 'esse'], - VarThree: function(arg) { - console.info(1); - } -}; - -var z = { - VarOne : 'If you ask me, thats if you ask', - VarTwo : ['Alonzo played you', 'for a fool', 'esse'], - VarThree: function(arg) { - console.info(1); - } -}; - -var x = function() { - console.info(2); -}; - -AssetListingEditWidgetType.prototype = { - init: function(data, assetid, editables) - { - } -}; - -AssetListingEditWidgetType.prototype = { - init: function(data, assetid, editables) - { - } -}; - -AssetListingEditWidgetType.prototype = { - // phpcs: disable Standard.Cat.SniffName -- testing annotation between closing brace and comma - init: function(data, assetid, editables) - { - } - // phpcs:enable -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.php deleted file mode 100644 index ab1cf81..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ObjectMemberCommaUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 1 => 1, - 22 => 1, - 38 => 1, - 45 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.inc deleted file mode 100644 index 8522438..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.inc +++ /dev/null @@ -1,138 +0,0 @@ - - 0)) { -} - -myFunction($var1 === true ? "" : "foobar"); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.js deleted file mode 100644 index 048223b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.js +++ /dev/null @@ -1,71 +0,0 @@ -if (value === TRUE) { -} else if (value === FALSE) { -} - -if (value == TRUE) { -} else if (value == FALSE) { -} - -if (value) { -} else if (!value) { -} - -if (value.isSomething === TRUE) { -} else if (myFunction(value) === FALSE) { -} - -if (value.isSomething == TRUE) { -} else if (myFunction(value) == FALSE) { -} - -if (value.isSomething) { -} else if (!myFunction(value)) { -} - -if (value === TRUE || other === FALSE) { -} - -if (value == TRUE || other == FALSE) { -} - -if (value || !other) { -} - -if (one === TRUE || two === TRUE || three === FALSE || four === TRUE) { -} - -if (one || two || !three || four) { -} - -while (one == true) { -} - -while (one === true) { -} - -do { -} while (one == true); - -do { -} while (one === true); - -for (one = 10; one != 0; one--) { -} - -for (one = 10; one !== 0; one--) { -} - -for (type in types) { -} - -variable = (variable2 === true) ? variable1 : "foobar"; - -variable = (variable2 == true) ? variable1 : "foobar"; - -variable = (variable2 === false) ? variable1 : "foobar"; - -variable = (variable2 == false) ? variable1 : "foobar"; - -variable = (variable2 === 0) ? variable1 : "foobar"; - -variable = (variable2 == 0) ? variable1 : "foobar"; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.php deleted file mode 100644 index 5618a7f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.php +++ /dev/null @@ -1,101 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Operators; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ComparisonOperatorUsageUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='ComparisonOperatorUsageUnitTest.inc') - { - switch ($testFile) { - case 'ComparisonOperatorUsageUnitTest.inc': - return [ - 6 => 1, - 7 => 1, - 10 => 1, - 11 => 1, - 18 => 1, - 19 => 1, - 22 => 1, - 23 => 1, - 29 => 2, - 32 => 2, - 38 => 4, - 47 => 2, - 69 => 1, - 72 => 1, - 75 => 1, - 78 => 1, - 80 => 1, - 82 => 1, - 83 => 1, - 89 => 1, - 92 => 1, - 100 => 1, - 106 => 1, - 112 => 1, - 123 => 1, - 127 => 1, - 131 => 1, - 135 => 1, - ]; - break; - case 'ComparisonOperatorUsageUnitTest.js': - return [ - 5 => 1, - 6 => 1, - 17 => 1, - 18 => 1, - 28 => 2, - 40 => 1, - 47 => 1, - 52 => 1, - 63 => 1, - 67 => 1, - 71 => 1, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.inc deleted file mode 100644 index e8d3beb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.inc +++ /dev/null @@ -1,40 +0,0 @@ -i++).$id; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.php deleted file mode 100644 index 768911b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Operators; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class IncrementDecrementUsageUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 6 => 1, - 12 => 1, - 16 => 1, - 25 => 1, - 26 => 1, - 27 => 1, - 29 => 1, - 31 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.inc deleted file mode 100644 index 328ccc5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.inc +++ /dev/null @@ -1,28 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.php deleted file mode 100644 index fc35131..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Operators; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ValidLogicalOperatorsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 11 => 1, - 17 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.css deleted file mode 100644 index 94cc8f2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.css +++ /dev/null @@ -1,23 +0,0 @@ -/* CSS Document */ - -body { -font-family: Arial, Helvetica, sans-serif; -margin : 40px 0 0 0; -padding : 0; -/*background: #8FB7DB url(login_glow_bg.jpg) no-repeat 30% 0;*/ -background: #8FB7DB url(diag_lines_bg.gif) top left; -} - -#login-container { - margin-left: -225px; - margin-top: -161px; - position:absolute; - top :50%; - /*left :50%;*/ - width:450px; -} - -#cacheConfig-dayLabel, #cacheConfig-hourLabel, #cacheConfig-minuteLabel { - float: left; - padding-right: 8px; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.inc deleted file mode 100644 index 121240a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.inc +++ /dev/null @@ -1,158 +0,0 @@ - - * - * Title - * Contents - * - * ... - * - * - * - * - * @return void - */ - -/* - [^\'"] -*/ - -// http://www.google.com - -// Base config function. - -// function () - -// T_STRING is not a function call or not listed in _getFunctionListWithCallableArgument(). - - // function myFunction( $param ) - // { - // do_something(); - // }//end myFunction() - // - -/* -function myFunction( $param ) -{ - // phpcs:disable Standard.Category.Sniff -- for reasons. - if ( preg_match( '`[abc]`', $param ) > 0 ) { - do_something(); - } - // phpcs:enable Standard.Category.Sniff -- for reasons. - -}//end myFunction() -*/ - - /* - * function myFunction( $param ) // @phpcs:ignore Standard.Category.Sniff -- for reasons. - * { - * - * }//end myFunction() - */ - - /* - * function myFunction( $param ) - * { - * // phpcs:disable Standard.Category.Sniff -- for reasons. - * if ( preg_match( '`[abc]`', $param ) > 0 ) { - * do_something(); - * } - * // phpcs:enable Standard.Category.Sniff -- for reasons. - * - * }//end myFunction() - */ - - // function myFunction( $param ) - // { - // phpcs:disable Standard.Category.Sniff -- for reasons. - // do_something(); - // phpcs:enable Standard.Category.Sniff -- for reasons. - // }//end myFunction() - // - -echo 'something'; // @codeCoverageIgnore -echo 'something'; // @codeCoverageIgnoreStart -echo 'something'; // @SuppressWarnings(PHPMD.UnusedLocalVariable) - -// Ok! - -/* Go! */ - -// ISO-639-3 - - // But override with a different text if any. - /* - $id = intval( str_replace( 'hook_name', '', $order_method['method_id'] ) ); - if ( ! empty( $id ) ) { - $info_text = get_post_meta( $location_id, 'meta_name' ); - - if ( ! empty( $info_text ) ) { - $text = $info_text; - } - - } - */ - // function() { $a = $b; }; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.php deleted file mode 100644 index d51f23c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class CommentedOutCodeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='CommentedOutCodeUnitTest.inc') - { - switch ($testFile) { - case 'CommentedOutCodeUnitTest.inc': - return [ - 6 => 1, - 8 => 1, - 15 => 1, - 19 => 1, - 35 => 1, - 87 => 1, - 91 => 1, - 97 => 1, - 109 => 1, - 116 => 1, - 128 => 1, - 147 => 1, - 158 => 1, - ]; - break; - case 'CommentedOutCodeUnitTest.css': - return [ - 7 => 1, - 16 => 1, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.inc deleted file mode 100644 index 4701c23..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.inc +++ /dev/null @@ -1,27 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.php deleted file mode 100644 index 6439b63..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowBooleanStatementUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 8 => 1, - 13 => 1, - 15 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.inc deleted file mode 100644 index d4fce10..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.inc +++ /dev/null @@ -1,64 +0,0 @@ -nextSibling; $node; $node = $node->nextSibling) { - if ($node->nodeType !== XML_ELEMENT_NODE) { - continue; - } - - for ($node = $fields->nextSibling; $node; $node = $node->nextSibling) { - if ($node->nodeType !== XML_ELEMENT_NODE) { - continue; - } - } -} - -$a = $b ? $c : $d; -$a = $b === true ? $c : $d; - -$this->_args = $this->_getArgs(($_SERVER['argv'] ?? [])); -$args = ($_SERVER['argv'] ?? []); - -$a = [ - 'a' => ($foo) ? $foo : $bar, -]; - -$a = [ - 'a' => ($foo) ? fn() => return 1 : fn() => return 2, -]; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.php deleted file mode 100644 index c8d8b0b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowComparisonAssignmentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 8 => 1, - 10 => 1, - 52 => 1, - 53 => 1, - 58 => 1, - 62 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.inc deleted file mode 100644 index f57e071..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.inc +++ /dev/null @@ -1,18 +0,0 @@ - $x; - -$b = fn ($b) => $b ? true : false; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.js deleted file mode 100644 index 56387c0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.js +++ /dev/null @@ -1,2 +0,0 @@ -x = (x?a:x); -id = id.replace(/row\/:/gi, ''); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.php deleted file mode 100644 index 27083ce..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowInlineIfUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='DisallowInlineIfUnitTest.inc') - { - switch ($testFile) { - case 'DisallowInlineIfUnitTest.inc': - return [ - 8 => 1, - 18 => 1, - ]; - break; - case 'DisallowInlineIfUnitTest.js': - return [1 => 1]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.inc deleted file mode 100644 index 98c1bb5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.inc +++ /dev/null @@ -1,77 +0,0 @@ -fetch(PDO::FETCH_NUM)) { - $result[$row[0]] = array(); - $result[$row[0]][] = $current; - - self::$_inTransaction = TRUE; - parent::$_inTransaction = TRUE; - static::$_inTransaction = TRUE; - $$varName = $varValue; - } - -}//end getVar() - -class myClass -{ - private static $_dbh = NULL; - public $dbh = NULL; - protected $dbh = NULL; - var $dbh = NULL; // Old PHP4 compatible code. -} - -A::$a = 'b'; -\A::$a = 'c'; -\A\B\C::$d = 'd'; -B\C::$d = 'e'; - -@$a = 1; - -$a = []; -foreach ($a as $b) - $c = 'd'; - -$var = $var2; -list ($a, $b) = explode(',', $c); -$var1 ? $var2 = 0 : $var2 = 1; - -$obj->$classVar = $prefix.'-'.$type; - -$closureWithDefaultParamter = function(array $testArray=array()) {}; -?> - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowMultipleAssignmentsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 5 => 2, - 7 => 1, - 9 => 1, - 12 => 1, - 14 => 1, - 15 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.inc deleted file mode 100644 index 76ec499..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.inc +++ /dev/null @@ -1,58 +0,0 @@ -children); $i++) { -} - - - -for ($i = 0; $i < sizeof($array); $i++) { -} - -$num = sizeof($array); - -while ($i < sizeof($array)) { -} - -do { -} while ($i < sizeof($array)); - -for ($i = 0; $i < sizeof($this->children); $i++) { -} - - - - -for ($i = 0; $i < strlen($string); $i++) { -} - -$num = strlen($string); - -while ($i < strlen($string)) { -} - -do { -} while ($i < strlen($string)); - -for ($i = 0; $i < strlen($this->string); $i++) { -} - -for ($i = sizeof($array); $i > 0; $i--) { -} - -do { - echo $a->count; - $a->count--; -} while($a->count); - -for ($i = 0; $i < $a->count; $i++) {} -?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.js deleted file mode 100644 index 8f7f7b9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.js +++ /dev/null @@ -1,13 +0,0 @@ -for (var i = 0; i < permissions.length; i++) { - // Code here. -} - -var permLen = permissions.length; -for (var length = 0; i < permLen; i++) { - // Code here. -} - -var myArray = [1, 2, 3, 4]; -for (var i = myArray.length; i >= 0; i--) { - var x = i; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.php deleted file mode 100644 index 21260ad..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DisallowSizeFunctionsInLoopsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='DisallowSizeFunctionsInLoopsUnitTest.inc') - { - switch ($testFile) { - case 'DisallowSizeFunctionsInLoopsUnitTest.inc': - return [ - 2 => 1, - 7 => 1, - 11 => 1, - 13 => 1, - 18 => 1, - 23 => 1, - 27 => 1, - 29 => 1, - 35 => 1, - 40 => 1, - 44 => 1, - 46 => 1, - ]; - break; - case 'DisallowSizeFunctionsInLoopsUnitTest.js': - return [1 => 1]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.inc deleted file mode 100644 index ca457a2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.inc +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.php deleted file mode 100644 index 2b2ff5b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DiscouragedFunctionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 2 => 1, - 3 => 1, - 4 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.inc deleted file mode 100644 index c61d5a3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.inc +++ /dev/null @@ -1,119 +0,0 @@ - - - -<?php echo $title ?> - - - - - hello - - - - - - - - - - - - - - - - - - - - - -section as $section) { - ?> - - - - - - section as $section) { - ?> -
    - - - - - - - - -?> - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.inc.fixed deleted file mode 100644 index 5b43d84..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.inc.fixed +++ /dev/null @@ -1,119 +0,0 @@ - - - -<?php echo $title; ?> - - - - - hello - - - - - - - - - - - - - - - - - - - -section as $section) { - ?> -
    - - - - - section as $section) { - ?> -
    - - - - - - - - - - - - -?> - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.php deleted file mode 100644 index f8cf4cc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.php +++ /dev/null @@ -1,78 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class EmbeddedPhpUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 12 => 1, - 18 => 1, - 19 => 2, - 20 => 1, - 21 => 1, - 22 => 3, - 24 => 1, - 26 => 1, - 29 => 1, - 30 => 1, - 31 => 1, - 34 => 1, - 36 => 1, - 40 => 1, - 41 => 1, - 44 => 1, - 45 => 1, - 49 => 1, - 59 => 1, - 63 => 1, - 93 => 1, - 94 => 2, - 100 => 1, - 102 => 1, - 112 => 1, - 113 => 1, - 116 => 1, - 117 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.inc deleted file mode 100644 index ee4c73e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.inc +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.php deleted file mode 100644 index adee788..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class EvalUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 2 => 1, - 4 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.inc deleted file mode 100644 index 4b2a210..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.inc +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.php deleted file mode 100644 index 52f6a00..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class GlobalKeywordUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 8 => 1, - 9 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.inc deleted file mode 100644 index 56f4393..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.inc +++ /dev/null @@ -1,27 +0,0 @@ -foo. -Now, I am printing some {$foo->bar[1]}. -This should not print a capital 'A': \x41 -EOT; - -// The following function has a simulated git conflict for testing. -// This is not a merge conflict - it is a valid test case. -// Please do not remove. -function test() - { - $arr = array( - 'a' => 'a' -<<<<<<< HEAD - 'b' => 'b' -======= - 'c' => 'c' ->>>>>>> master - ); - } diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.php deleted file mode 100644 index 2f06f0b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class HeredocUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 8 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/InnerFunctionsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/InnerFunctionsUnitTest.inc deleted file mode 100644 index dd85146..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/InnerFunctionsUnitTest.inc +++ /dev/null @@ -1,50 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class InnerFunctionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 46 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc deleted file mode 100644 index 330919d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc +++ /dev/null @@ -1,41 +0,0 @@ -Count(); -$count = $object::Count(); -$count = $object->count(); -$count = $object::count(); -class MyClass { - public function Count() {} -} - -function &Sort() { - -} - -$connection = new Db\Adapter\Pdo\Mysql($config); - -namespace Strtolower\Silly; - -use function strToUpper as somethingElse; -use function MyClass\WordsToUpper as UCWords; // Intentional redeclared function error. -use function strToUpper\NotTheFunction; - -class ArrayUnique {} - -$sillyComments = strToLower /*comment*/ ($string); - -$callToGlobalFunction = \STR_REPEAT($a, 2); -$callToGlobalFunction = \ /*comment*/ str_Repeat($a, 2); - -$callToNamespacedFunction = MyNamespace /* phpcs:ignore Standard */ \STR_REPEAT($a, 2); -$callToNamespacedFunction = namespace\STR_REPEAT($a, 2); // Could potentially be false negative. - -$filePath = new \File($path); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc.fixed deleted file mode 100644 index eae5b4a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc.fixed +++ /dev/null @@ -1,41 +0,0 @@ -Count(); -$count = $object::Count(); -$count = $object->count(); -$count = $object::count(); -class MyClass { - public function Count() {} -} - -function &Sort() { - -} - -$connection = new Db\Adapter\Pdo\Mysql($config); - -namespace Strtolower\Silly; - -use function strtoupper as somethingElse; -use function MyClass\WordsToUpper as UCWords; // Intentional redeclared function error. -use function strToUpper\NotTheFunction; - -class ArrayUnique {} - -$sillyComments = strtolower /*comment*/ ($string); - -$callToGlobalFunction = \str_repeat($a, 2); -$callToGlobalFunction = \ /*comment*/ str_repeat($a, 2); - -$callToNamespacedFunction = MyNamespace /* phpcs:ignore Standard */ \STR_REPEAT($a, 2); -$callToNamespacedFunction = namespace\STR_REPEAT($a, 2); // Could potentially be false negative. - -$filePath = new \File($path); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.php deleted file mode 100644 index 708d01e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LowercasePHPFunctionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 4 => 1, - 27 => 1, - 33 => 1, - 35 => 1, - 36 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.1.inc deleted file mode 100644 index 163c312..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.1.inc +++ /dev/null @@ -1,298 +0,0 @@ -{$action . 'JsonAction'}(); -} - -switch (true) { - case 1: - return foo( - function () { - $foo = $bar; // when this is removed it works ok - return false; // from here on it reports unreachable - } - ); -} - -for($i=0,$j=50; $i<100; $i++) { - while($j--) { - if($j==17) { - goto end; - echo 'unreachable'; - } - } -} - -switch ($var) { - case '1': - goto end; - echo 'hi'; - - case '2': - case '3': - if ($something === true) { - goto end; - echo 'hi'; - } - break; - default: - goto end; - - if ($something === true) { - goto end; - echo 'hi'; - } -} - -end: -echo 'j hit 17'; - -// Issue 2512. -class TestAlternativeControlStructures { - - public function alternative_switch_in_function( $var ) { - - switch ( $var ) : - case 'value1': - do_something(); - break; - - default: - case 'value2': - do_something_else(); - break; - endswitch; - } - - public function various_alternative_control_structures() { - $_while = 1; - - for ( $a = 0; $a++ < 1; ) : - foreach ( [ 1 ] as $b ) : - while ( $_while-- ) : - if ( 1 ) : - switch ( 1 ) : - default: - echo 'yay, we made it!'; - break; - endswitch; - endif; - endwhile; - endforeach; - endfor; - } -} - -$var_after_class_in_global_space = 1; -do_something_else(); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.2.inc deleted file mode 100644 index 407c474..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.2.inc +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class NonExecutableCodeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'NonExecutableCodeUnitTest.1.inc': - return [ - 5 => 1, - 11 => 1, - 17 => 1, - 18 => 1, - 19 => 2, - 28 => 1, - 32 => 1, - 33 => 2, - 34 => 2, - 42 => 1, - 45 => 1, - 54 => 1, - 58 => 1, - 73 => 1, - 83 => 1, - 95 => 1, - 105 => 1, - 123 => 1, - 147 => 1, - 150 => 1, - 153 => 1, - 166 => 1, - 180 => 1, - 232 => 1, - 240 => 1, - 246 => 1, - 252 => 1, - 253 => 1, - 254 => 2, - ]; - break; - case 'NonExecutableCodeUnitTest.2.inc': - return [ - 7 => 1, - 8 => 1, - 9 => 1, - 10 => 2, - 14 => 1, - 48 => 2, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MemberVarScopeUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MemberVarScopeUnitTest.inc deleted file mode 100644 index 6df12cc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MemberVarScopeUnitTest.inc +++ /dev/null @@ -1,72 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Scope; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class MemberVarScopeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 25 => 1, - 29 => 1, - 33 => 1, - 39 => 1, - 41 => 1, - 66 => 2, - 67 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [71 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MethodScopeUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MethodScopeUnitTest.inc deleted file mode 100644 index cec0355..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MethodScopeUnitTest.inc +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Scope; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class MethodScopeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 6 => 1, - 30 => 1, - 39 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.inc deleted file mode 100644 index 6684aa1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.inc +++ /dev/null @@ -1,78 +0,0 @@ -func2()); - $result = $this->getValue($value); - return $this->setValue($result); - } - - public static function /* */ func1() - { - return $this->setValue($result); - } - - public static function - func1() - { - return $this->setValue($result); - } - - public function func1() - { - $value = 'hello'; - $newValue = array($this->func2()); - $result = $this->getValue($value); - return $this->setValue($result); - } - - function func1() - { - $value = 'hello'; - $newValue = array($this->func2()); - $result = $this->getValue($value); - return $this->setValue($result); - } - - public static function func1() { - return function() { - echo $this->name; - }; - } - - private static function func1(array $data) - { - return new class() - { - private $data; - - public function __construct(array $data) - { - $this->data = $data; - } - }; - } - - public function getAnonymousClass() { - return new class() { - public static function something() { - $this->doSomething(); - } - }; - } -} - -trait MyTrait { - public static function myFunc() { - $this->doSomething(); - } -} - -$b = new class() -{ - public static function myFunc() { - $this->doSomething(); - } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.php deleted file mode 100644 index 6816fb4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Scope; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class StaticThisUsageUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 8 => 1, - 9 => 1, - 14 => 1, - 20 => 1, - 61 => 1, - 69 => 1, - 76 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc deleted file mode 100644 index 3bf4186..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc +++ /dev/null @@ -1,49 +0,0 @@ -add_help_tab( array( -'id' => <<', -) ); - -// phpcs:set Squiz.Strings.ConcatenationSpacing spacing 1 - -$string = 'Hello'.$there.'. How are'.$you.$going. "today $okay"; -$string = 'Hello' . $there . '. How are' . $you . $going . "today $okay"; -$string = 'Hello'.$there; -$string = 'Hello'. $there; -$string = 'Hello' .$there; - -// phpcs:set Squiz.Strings.ConcatenationSpacing ignoreNewlines true -$y = '1' - . '2' - . '3'; - -$y = '1' . - '2' . - '3'; - -$y = '1' -. '2' -. '3'; - -$y = '1' - .'2'. - '3' - . '4'; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc.fixed deleted file mode 100644 index b45f1a4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,47 +0,0 @@ -add_help_tab( array( -'id' => <<', -) ); - -// phpcs:set Squiz.Strings.ConcatenationSpacing spacing 1 - -$string = 'Hello' . $there . '. How are' . $you . $going . "today $okay"; -$string = 'Hello' . $there . '. How are' . $you . $going . "today $okay"; -$string = 'Hello' . $there; -$string = 'Hello' . $there; -$string = 'Hello' . $there; - -// phpcs:set Squiz.Strings.ConcatenationSpacing ignoreNewlines true -$y = '1' - . '2' - . '3'; - -$y = '1' . - '2' . - '3'; - -$y = '1' -. '2' -. '3'; - -$y = '1' - . '2' . - '3' - . '4'; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.php deleted file mode 100644 index 862af7d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Strings; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ConcatenationSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 5, - 5 => 1, - 6 => 1, - 9 => 1, - 10 => 1, - 12 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - 16 => 5, - 22 => 1, - 27 => 5, - 29 => 1, - 30 => 1, - 31 => 1, - 47 => 2, - 49 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc deleted file mode 100644 index c8cc638..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc +++ /dev/null @@ -1,37 +0,0 @@ -"; -$string = "Value: $var[test]"; -$string = "\0"; -$string = "\$var"; - -$x = "bar = '$z', -baz = '" . $a . "'...$x"; - -$string = "Hello -there"; -$string = 'Hello -there'; - -$string = "\123 \234"."\u123"."\e"; - -echo "window.location = \"".$url."\";\n"; -echo "" - -$string = "Hello - there"; - -function test() { - echo "It Worked'; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc.fixed deleted file mode 100644 index 9730919..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc.fixed +++ /dev/null @@ -1,37 +0,0 @@ -"; -$string = "Value: $var[test]"; -$string = "\0"; -$string = '$var'; - -$x = "bar = '$z', -baz = '" . $a . "'...$x"; - -$string = 'Hello -there'; -$string = 'Hello -there'; - -$string = "\123 \234"."\u123"."\e"; - -echo 'window.location = "'.$url."\";\n"; -echo '' - -$string = 'Hello - there'; - -function test() { - echo "It Worked'; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.php deleted file mode 100644 index a95d188..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Strings; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class DoubleQuoteUsageUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 5 => 1, - 6 => 1, - 8 => 2, - 14 => 1, - 15 => 1, - 17 => 1, - 19 => 1, - 20 => 1, - 22 => 1, - 29 => 1, - 30 => 1, - 32 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc deleted file mode 100644 index 9e0391d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc +++ /dev/null @@ -1,13 +0,0 @@ -returndate == 0) ? 'Not returned' : date('d/m/Y', $loan_device->returndate); -?> -

    -

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc.fixed deleted file mode 100644 index 37c7d24..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc.fixed +++ /dev/null @@ -1,13 +0,0 @@ -returndate == 0) ? 'Not returned' : date('d/m/Y', $loan_device->returndate); -?> -

    -

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.php deleted file mode 100644 index 0d9af1e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Strings; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class EchoedStringsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 6 => 1, - 7 => 1, - 8 => 1, - 9 => 1, - 13 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.inc deleted file mode 100644 index fa65112..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.inc +++ /dev/null @@ -1,9 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class CastSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 4 => 1, - 5 => 1, - 6 => 1, - 9 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc deleted file mode 100644 index 785a4a8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc +++ /dev/null @@ -1,253 +0,0 @@ - -
    - - - -
    - children as $child) { - // There should be no error after this - // foreach, because it is followed by a - // close PHP tag. - } - ?> -
    -children as $child) { - echo $child; - -} - -if ($defaultPageDesign === 0 - && $defaultCascade === TRUE - && $defaultChildDesign === 0 -) { - $settingsUpdated = FALSE; -} - -foreach ( $blah as $var ) { - if ( $blah ) { - } -} - -if ( - $defaultPageDesign === 0 - && $defaultCascade === TRUE - && $defaultChildDesign === 0 -) { - $settingsUpdated = FALSE; -} - -$moo = 'blar'; -switch ($moo) -{ - case 'blar': - if ($moo === 'blar2') { - $moo = 'blar' - } - return $moo; - - default: - $moo = 'moo'; - break; -} - -do { -} -while (true); - -try { - // Something -} catch (Exception $e) { - // Something -} - -try { - - // Something - -} catch (Exception $e) { - - // Something - -} - -if ($one) { -} -elseif ($two) { -} -// else if something -else if ($three) { -} // else do something -else { -} - -if ($one) { - -} - -do { - echo 'hi'; -} while ( $blah ); - -if ($one) { -} -// No blank line here. -if ($two) { -} - -switch ($moo) -{ - case 'blar': - if ($moo === 'blar2') { - $moo = 'blar' - } - - return $moo; -} - -try { - // Something -} -catch (Exception $e) { - // Something -} -finally { - // Something -} - -if ($foo) { - - - /** - * Comment - */ - function foo() { - // Code here - } - - - /** - * Comment - */ - class bar() { - - }//end class - - -} - -if (true) { // some comment goes here - - echo 'foo'; -} - -if (true) { echo 'foo'; - - echo 'foo'; -} - -if ($true) { - echo 'hi 2'; -}//end if -echo 'hi'; - -if ($true) { - echo 'hi 2'; -} // phpcs:enable Standard.Category.Sniff -- for reasons. -echo 'hi'; - -?> - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc.fixed deleted file mode 100644 index 1674b3d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,246 +0,0 @@ - - - - - -
    - children as $child) { - // There should be no error after this - // foreach, because it is followed by a - // close PHP tag. - } - ?> -
    -children as $child) { - echo $child; -} - -if ($defaultPageDesign === 0 - && $defaultCascade === TRUE - && $defaultChildDesign === 0 -) { - $settingsUpdated = FALSE; -} - -foreach ($blah as $var) { - if ($blah) { - } -} - -if ($defaultPageDesign === 0 - && $defaultCascade === TRUE - && $defaultChildDesign === 0 -) { - $settingsUpdated = FALSE; -} - -$moo = 'blar'; -switch ($moo) -{ - case 'blar': - if ($moo === 'blar2') { - $moo = 'blar' - } - return $moo; - - default: - $moo = 'moo'; - break; -} - -do { -} -while (true); - -try { - // Something -} catch (Exception $e) { - // Something -} - -try { - // Something -} catch (Exception $e) { - // Something -} - -if ($one) { -} -elseif ($two) { -} -// else if something -else if ($three) { -} // else do something -else { -} - -if ($one) { -} - -do { - echo 'hi'; -} while ($blah); - -if ($one) { -} - -// No blank line here. -if ($two) { -} - -switch ($moo) -{ - case 'blar': - if ($moo === 'blar2') { - $moo = 'blar' - } - return $moo; -} - -try { - // Something -} -catch (Exception $e) { - // Something -} -finally { - // Something -} - -if ($foo) { - - - /** - * Comment - */ - function foo() { - // Code here - } - - - /** - * Comment - */ - class bar() { - - }//end class - - -} - -if (true) { // some comment goes here - echo 'foo'; -} - -if (true) { echo 'foo'; - - echo 'foo'; -} - -if ($true) { - echo 'hi 2'; -}//end if - -echo 'hi'; - -if ($true) { - echo 'hi 2'; -} // phpcs:enable Standard.Category.Sniff -- for reasons. - -echo 'hi'; - -?> - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js deleted file mode 100644 index 1c889a1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js +++ /dev/null @@ -1,93 +0,0 @@ - -if (something) { -} -for (i = 0; i < 10; i++) { -} - -while (true) { - for (i = 0; i < 10; i++) { - } - if (something) { - } - - do { - } while (true); - -} - -if (one) { -} else (two) { -} else if (three) { -} -if (one) { -} else (two) { -} else if (three) { -} - -switch (blah) { - case 'one': - if (blah) { - // There are no spaces before break. - } - break; - - default: - if (blah) { - // There are no spaces before break. - } - break; -} - -switch (blah) { - case 'one': - if (blah) { - // There are no spaces before break. - } - break; - - default: - if (blah) { - // Code here. - } -} - -for (i = 0; i < 10; i++) { - if (blah) { - } - break; -} - -while (true) { - for (i = 0; i < 10; i++) { - - if (something) { - } - - } - - do { - - alert(i); - } while (true); -} - -for ( i = 0; i < 10; i++ ) { - if ( blah ) { - } -} - -var x = { - a: function () { - if (blah) { - } - - }, -}; - -if (one) { -} -// else if something -else if (two) { -} // else do something -else { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js.fixed deleted file mode 100644 index bb979bc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js.fixed +++ /dev/null @@ -1,93 +0,0 @@ - -if (something) { -} - -for (i = 0; i < 10; i++) { -} - -while (true) { - for (i = 0; i < 10; i++) { - } - - if (something) { - } - - do { - } while (true); -} - -if (one) { -} else (two) { -} else if (three) { -} - -if (one) { -} else (two) { -} else if (three) { -} - -switch (blah) { - case 'one': - if (blah) { - // There are no spaces before break. - } - break; - - default: - if (blah) { - // There are no spaces before break. - } - break; -} - -switch (blah) { - case 'one': - if (blah) { - // There are no spaces before break. - } - break; - - default: - if (blah) { - // Code here. - } -} - -for (i = 0; i < 10; i++) { - if (blah) { - } - - break; -} - -while (true) { - for (i = 0; i < 10; i++) { - if (something) { - } - } - - do { - alert(i); - } while (true); -} - -for (i = 0; i < 10; i++) { - if (blah) { - } -} - -var x = { - a: function () { - if (blah) { - } - - }, -}; - -if (one) { -} -// else if something -else if (two) { -} // else do something -else { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.php deleted file mode 100644 index eeef2b0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.php +++ /dev/null @@ -1,100 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ControlStructureSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='ControlStructureSpacingUnitTest.inc') - { - switch ($testFile) { - case 'ControlStructureSpacingUnitTest.inc': - return [ - 3 => 1, - 5 => 1, - 8 => 1, - 15 => 1, - 23 => 1, - 74 => 1, - 79 => 1, - 82 => 1, - 83 => 1, - 87 => 1, - 103 => 1, - 113 => 2, - 114 => 2, - 118 => 1, - 150 => 1, - 153 => 1, - 154 => 1, - 157 => 1, - 170 => 1, - 176 => 2, - 179 => 1, - 189 => 1, - 225 => 1, - 237 => 1, - 242 => 1, - 246 => 1, - 248 => 1, - ]; - break; - case 'ControlStructureSpacingUnitTest.js': - return [ - 3 => 1, - 9 => 1, - 15 => 1, - 21 => 1, - 56 => 1, - 61 => 1, - 64 => 1, - 65 => 1, - 68 => 1, - 74 => 2, - 75 => 2, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.inc deleted file mode 100644 index e831e25..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.inc +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionClosingBraceSpaceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='FunctionClosingBraceSpaceUnitTest.inc') - { - switch ($testFile) { - case 'FunctionClosingBraceSpaceUnitTest.inc': - return [ - 10 => 1, - 21 => 1, - 28 => 1, - 29 => 1, - 31 => 1, - 39 => 1, - ]; - break; - case 'FunctionClosingBraceSpaceUnitTest.js': - return [ - 13 => 1, - 25 => 1, - 32 => 1, - 53 => 1, - 59 => 1, - 67 => 1, - 84 => 1, - 128 => 1, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.inc deleted file mode 100644 index fe2c903..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.inc +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionOpeningBraceSpaceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='FunctionOpeningBraceSpaceUnitTest.inc') - { - switch ($testFile) { - case 'FunctionOpeningBraceSpaceUnitTest.inc': - return [ - 10 => 1, - 25 => 1, - 49 => 1, - ]; - - case 'FunctionOpeningBraceSpaceUnitTest.js': - return [ - 11 => 1, - 31 => 1, - 38 => 1, - 88 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.1.inc deleted file mode 100644 index 2e05805..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.1.inc +++ /dev/null @@ -1,545 +0,0 @@ -setLogger(new class { - public function a(){} - private function b(){} - protected function c(){} -}); - -?> - -setLogger(new class { - - public function a(){} - - private function b(){} - - protected function c(){} - -}); - -?> - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class FunctionSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FunctionSpacingUnitTest.1.inc': - return [ - 26 => 1, - 35 => 1, - 44 => 1, - 51 => 1, - 55 => 1, - 61 => 1, - 64 => 1, - 66 => 1, - 81 => 1, - 100 => 1, - 111 => 1, - 113 => 1, - 119 => 2, - 141 => 1, - 160 => 1, - 173 => 2, - 190 => 1, - 224 => 2, - 281 => 1, - 282 => 1, - 295 => 1, - 297 => 1, - 303 => 1, - 327 => 1, - 329 => 1, - 338 => 1, - 344 => 1, - 345 => 1, - 354 => 2, - 355 => 1, - 356 => 1, - 360 => 2, - 361 => 1, - 362 => 1, - 385 => 1, - 399 => 1, - 411 => 2, - 418 => 2, - 426 => 2, - 432 => 1, - 437 => 1, - 438 => 1, - 442 => 2, - 444 => 1, - 449 => 1, - 458 => 2, - 459 => 1, - 460 => 1, - 465 => 2, - 466 => 1, - 467 => 1, - 471 => 1, - 473 => 2, - 475 => 1, - 478 => 2, - 479 => 1, - 483 => 2, - 495 => 1, - 529 => 1, - 539 => 1, - ]; - - case 'FunctionSpacingUnitTest.2.inc': - return [2 => 1]; - - case 'FunctionSpacingUnitTest.3.inc': - return [7 => 1]; - - case 'FunctionSpacingUnitTest.5.inc': - return [5 => 1]; - - case 'FunctionSpacingUnitTest.6.inc': - return [10 => 1]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc deleted file mode 100644 index e8f2eda..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc +++ /dev/null @@ -1,43 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LanguageConstructSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 7 => 1, - 11 => 1, - 15 => 1, - 19 => 1, - 23 => 1, - 27 => 1, - 31 => 1, - 34 => 1, - 35 => 1, - 39 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.inc deleted file mode 100644 index c2f4ec7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.inc +++ /dev/null @@ -1,19 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class LogicalOperatorSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='LogicalOperatorSpacingUnitTest.inc') - { - return [ - 4 => 2, - 5 => 3, - 6 => 3, - 15 => 1, - 17 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.inc deleted file mode 100644 index fd7c6e3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.inc +++ /dev/null @@ -1,334 +0,0 @@ - 'a', 'b' => 'b' ), - $varQ = 'string', - $varR = 123; -} - -// Make sure the determination of whether a property is the first property or not is done correctly. -class ClassUsingSimpleTraits -{ - use HelloWorld; - - - /* comment */ - public $firstVar = array( 'a', 'b' ); - protected $secondVar = true; -} - -class ClassUsingComplexTraits -{ - use A, B { - B::smallTalk insteadof A; - A::bigTalk insteadof B; - } - - - - public $firstVar = array( 'a', 'b' ); - - - /* comment */ - protected $secondVar = true; -} - -class Foo -{ - - - private function foo() - { - } - - - /* no error here because after function */ - private $bar = false; -} - -class CommentedOutCodeAtStartOfClass { - - /** - * Description. - * - * @var bool - */ - //public $commented_out_property = true; - - /** - * Description. - * - * @var bool - */ - public $property = true; -} - -class CommentedOutCodeAtStartOfClassNoBlankLine { - - // phpcs:disable Stnd.Cat.Sniff -- For reasons. - /** - * Description. - * - * @var bool - */ - public $property = true; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.inc.fixed deleted file mode 100644 index b6ebcc9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,321 +0,0 @@ - 'a', 'b' => 'b' ), - $varQ = 'string', - $varR = 123; -} - -// Make sure the determination of whether a property is the first property or not is done correctly. -class ClassUsingSimpleTraits -{ - use HelloWorld; - - /* comment */ - public $firstVar = array( 'a', 'b' ); - - protected $secondVar = true; -} - -class ClassUsingComplexTraits -{ - use A, B { - B::smallTalk insteadof A; - A::bigTalk insteadof B; - } - - public $firstVar = array( 'a', 'b' ); - - /* comment */ - protected $secondVar = true; -} - -class Foo -{ - - - private function foo() - { - } - - - /* no error here because after function */ - private $bar = false; -} - -class CommentedOutCodeAtStartOfClass { - - /** - * Description. - * - * @var bool - */ - //public $commented_out_property = true; - - /** - * Description. - * - * @var bool - */ - public $property = true; -} - -class CommentedOutCodeAtStartOfClassNoBlankLine { - - // phpcs:disable Stnd.Cat.Sniff -- For reasons. - - /** - * Description. - * - * @var bool - */ - public $property = true; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.php deleted file mode 100644 index 08a11bc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class MemberVarSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 7 => 1, - 20 => 1, - 30 => 1, - 35 => 1, - 44 => 1, - 50 => 1, - 73 => 1, - 86 => 1, - 106 => 1, - 115 => 1, - 150 => 1, - 160 => 1, - 165 => 1, - 177 => 1, - 186 => 1, - 200 => 1, - 209 => 1, - 211 => 1, - 224 => 1, - 229 => 1, - 241 => 1, - 246 => 1, - 252 => 1, - 254 => 1, - 261 => 1, - 275 => 1, - 276 => 1, - 288 => 1, - 292 => 1, - 333 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc deleted file mode 100644 index bcea3dc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc +++ /dev/null @@ -1,48 +0,0 @@ -testThis(); -$this-> testThis(); -$this -> testThis(); -$this-> /* comment here */testThis(); -$this/* comment here */ -> testThis(); -$this - ->testThis(); -$this-> - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines true - -$this->testThis(); -$this-> testThis(); -$this -> testThis(); -$this->/* comment here */testThis(); -$this/* comment here */ -> testThis(); -$this - ->testThis(); -$this-> - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines false - -thisObject::testThis(); -thisObject:: testThis(); -thisObject :: testThis(); -thisObject::/* comment here */testThis(); -thisObject/* comment here */ :: testThis(); -thisObject - ::testThis(); -thisObject:: - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines true - -thisObject::testThis(); -thisObject:: testThis(); -thisObject :: testThis(); -thisObject::/* comment here */testThis(); -thisObject/* comment here */ :: testThis(); -thisObject - ::testThis(); -thisObject:: - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines false diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc.fixed deleted file mode 100644 index fdeb6f3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,44 +0,0 @@ -testThis(); -$this->testThis(); -$this->testThis(); -$this->/* comment here */testThis(); -$this/* comment here */->testThis(); -$this->testThis(); -$this->testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines true - -$this->testThis(); -$this->testThis(); -$this->testThis(); -$this->/* comment here */testThis(); -$this/* comment here */->testThis(); -$this - ->testThis(); -$this-> - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines false - -thisObject::testThis(); -thisObject::testThis(); -thisObject::testThis(); -thisObject::/* comment here */testThis(); -thisObject/* comment here */::testThis(); -thisObject::testThis(); -thisObject::testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines true - -thisObject::testThis(); -thisObject::testThis(); -thisObject::testThis(); -thisObject::/* comment here */testThis(); -thisObject/* comment here */::testThis(); -thisObject - ::testThis(); -thisObject:: - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines false diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.php deleted file mode 100644 index 48208ce..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ObjectOperatorSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 4 => 2, - 5 => 1, - 6 => 2, - 8 => 1, - 9 => 1, - 15 => 1, - 16 => 2, - 18 => 2, - 27 => 1, - 28 => 2, - 30 => 2, - 32 => 1, - 33 => 1, - 39 => 1, - 40 => 2, - 42 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.inc deleted file mode 100644 index 8d0efb3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.inc +++ /dev/null @@ -1,467 +0,0 @@ - $j && $k< $l && $m>= $n && $o<= $p && $q<> $r; - -$a ==$b && $c !=$d && $e ===$f && $g !==$h; -$i >$j && $k <$l && $m >=$n && $o <=$p && $q <>$r; - -function myFunction($variable=0, $var2='string') {} - -if (index > -1) { -} - -array_walk_recursive($array, function(&$item) use (&$something) { -}); - -$var = saveFile(&$model, &$foo); - -// This is all valid. -$boo = -$foo; -function foo($boo = -1) {} -$foo = array('boo' => -1); -$x = $test ? -1 : 1; -$y = $test ? 1 : -1; -$z = $test ?: false; - -$closureWithDefaultParameter = function (array $testArray=array()) {}; - -switch ($foo) { - case -1: - break; -} - -$y = 1 * -1; -$y = -1 * 1; -$y = -1 * $var; -$y = 10 / -2; -$y = -10 / 2; -$y = (-10 / 2); -$y = (-10 / $var); -$y = 10 + -2; -$y = -10 + 2; - -$a = $x?$y:$z; -$a = $x ? $y : $z; - -$y = 1 - + 2 - - 3; - -$y = 1 + - 2 - - 3; - -$y = 1 -+ 2 -- 3; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines true -$y = 1 - + 2 - - 3; - -$y = 1 + - 2 - - 3; - -$y = 1 -+ 2 -- 3; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines false - -if (true || -1 == $b) { -} - -$var = array(-1); -$var = [-1]; -$var = [0, -1, -2]; - -$y = array(&$x); -$y = [&$x]; -$y = array(&$a, &$b, &$c); -$y = [&$a, &$b, &$c]; -$y = array(&$a => 1, 2 => &$b, &$c); -$y = [&$a => 1, 2 => &$b, &$c]; - -if ($a <=> $b) { -} - -if ($a <=>$b) { -} - -$a |= $b; -$a **= $b; -$a ??= $b; - -$a = +1; - -function bar($boo = +1) {} - -$username = $_GET['user']??'nobody'; - -function foo(string $bar, array $baz, ?MyClass $object) : MyClass {} - -declare(strict_types=1); - -function foo($c = ((BAR)?10:100)) {} - -$res = $a ?: $b; -$res = $a ?: $b; -$res = $a ?: $b; -$res = $a ?: $b; - -$res = $a ? : $b; -$res = $a ? : $b; -$res = $a ? : $b; -$res = $a ? : $b; - -function foo(string $a = '', ?string $b = ''): ?string {} - -// Issue #1605. -$text = preg_replace_callback( - self::CHAR_REFS_REGEX, - [ 'Sanitizer', 'decodeCharReferencesCallback' ], - $text, /* limit */ -1, $count ); - -if (true || /* test */ -1 == $b) {} -$y = 10 + /* test */ -2; - -// Issue #1604. -Hooks::run( 'ParserOptionsRegister', [ - &self::$defaults, - &self::$inCacheKey, - &self::$lazyOptions, -] ); - -$x = $foo ? function (): int { - return 1; -} : $bar; - -$x = $foo ? function ($foo) - // comment - : int { - return 1; -} : $bar; - -$x = $foo ? function ($foo) use /* comment */ ($bar): int { - return 1; -} : $bar; - -$x = !$foo ? $bar : function (): int { - return 1; -}; - -$a = - // Comment. - [ - 'a', - 'b', - ]; - -$a = -// phpcs:ignore Standard.Category.Sniff -- for reasons. -[ - 'a', - 'b', -]; - -$foo = is_array($bar) ? array_map( - function () {}, - $bar - ) : $bar; - -function bar(): array {} - -if ($line{-1} === ':') { - $line = substr($line, 0, -1); -} - -$a = $a instanceof $b; -$a = $a instanceof $b; -$a = ($a)instanceof$b; - -fn&($x) => $x; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments false -$a = 3; - -yield -1; -echo -1; -$a = -1; -func(-1); -$a = [-1]; -return -1; -print -1; -$a &= -1; -switch ($a) { - case -1: -} -$a = $a ?? -1; -$a .= -1; -$a /= -1; -$a = [1 => -1]; -$a = $a == -1; -$a = $a >= -1; -$a = $a === -1; -$a = $a != -1; -$a = $a !== -1; -$a = $a <= -1; -$a = $a <=> -1; -$a = $a and -1; -$a = $a or -1; -$a = $a xor -1; -$a -= -1; -$a %= -1; -$a *= -1; -$a |= -1; -$a += -1; -$a = $a ** -1; -$a **= -1; -$a = $a << -1; -$a <<= -1; -$a = $a >> -1; -$a >>= -1; -$a = (string) -1; -$a = (array) -1; -$a = (bool) -1; -$a = (object) -1; -$a = (unset) -1; -$a = (float) -1; -$a = (int) -1; -$a ^= -1; -$a = [$a, -1]; -$a = $a[-1]; -$a = $a ? -1 : -1; - -yield - 1; -echo - 1; -$a = - 1; -func(- 1); -$a = [- 1]; -return - 1; -print - 1; -$a &= - 1; -switch ($a) { - case - 1: -} -$a = $a ?? - 1; -$a .= - 1; -$a /= - 1; -$a = [1 => - 1]; -$a = $a == - 1; -$a = $a >= - 1; -$a = $a === - 1; -$a = $a != - 1; -$a = $a !== - 1; -$a = $a <= - 1; -$a = $a <=> - 1; -$a = $a and - 1; -$a = $a or - 1; -$a = $a xor - 1; -$a -= - 1; -$a %= - 1; -$a *= - 1; -$a |= - 1; -$a += - 1; -$a = $a ** - 1; -$a **= - 1; -$a = $a << - 1; -$a <<= - 1; -$a = $a >> - 1; -$a >>= - 1; -$a = (string) - 1; -$a = (array) - 1; -$a = (bool) - 1; -$a = (object) - 1; -$a = (unset) - 1; -$a = (float) - 1; -$a = (int) - 1; -$a ^= - 1; -$a = [$a, - 1]; -$a = $a[- 1]; -$a = $a ? - 1 : - 1; - - -yield -$b; -echo -$b; -$a = -$b; -func(-$b); -$a = [-$b]; -return -$b; -print -$b; -$a &= -$b; -switch ($a) { - case -$b: -} -$a = $a ?? -$b; -$a .= -$b; -$a /= -$b; -$a = [1 => -$b]; -$a = $a == -$b; -$a = $a >= -$b; -$a = $a === -$b; -$a = $a != -$b; -$a = $a !== -$b; -$a = $a <= -$b; -$a = $a <=> -$b; -$a = $a and -$b; -$a = $a or -$b; -$a = $a xor -$b; -$a -= -$b; -$a %= -$b; -$a *= -$b; -$a |= -$b; -$a += -$b; -$a = $a ** -$b; -$a **= -$b; -$a = $a << -$b; -$a <<= -$b; -$a = $a >> -$b; -$a >>= -$b; -$a = (string) -$b; -$a = (array) -$b; -$a = (bool) -$b; -$a = (object) -$b; -$a = (unset) -$b; -$a = (float) -$b; -$a = (int) -$b; -$a ^= -$b; -$a = [$a, -$b]; -$a = $a[-$b]; -$a = $a ? -$b : -$b; - -yield - $b; -echo - $b; -$a = - $b; -func(- $b); -$a = [- $b]; -return - $b; -print - $b; -$a &= - $b; -switch ($a) { - case - $b: -} -$a = $a ?? - $b; -$a .= - $b; -$a /= - $b; -$a = [1 => - $b]; -$a = $a == - $b; -$a = $a >= - $b; -$a = $a === - $b; -$a = $a != - $b; -$a = $a !== - $b; -$a = $a <= - $b; -$a = $a <=> - $b; -$a = $a and - $b; -$a = $a or - $b; -$a = $a xor - $b; -$a -= - $b; -$a %= - $b; -$a *= - $b; -$a |= - $b; -$a += - $b; -$a = $a ** - $b; -$a **= - $b; -$a = $a << - $b; -$a <<= - $b; -$a = $a >> - $b; -$a >>= - $b; -$a = (string) - $b; -$a = (array) - $b; -$a = (bool) - $b; -$a = (object) - $b; -$a = (unset) - $b; -$a = (float) - $b; -$a = (int) - $b; -$a ^= - $b; -$a = [$a, - $b]; -$a = $a[- $b]; -$a = $a ? - $b : - $b; - -/* Intentional parse error. This has to be the last test in the file. */ -$a = 10 + diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.inc.fixed deleted file mode 100644 index a03b642..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,461 +0,0 @@ - $j && $k < $l && $m >= $n && $o <= $p && $q <> $r; - -$a == $b && $c != $d && $e === $f && $g !== $h; -$i > $j && $k < $l && $m >= $n && $o <= $p && $q <> $r; - -function myFunction($variable=0, $var2='string') {} - -if (index > -1) { -} - -array_walk_recursive($array, function(&$item) use (&$something) { -}); - -$var = saveFile(&$model, &$foo); - -// This is all valid. -$boo = -$foo; -function foo($boo = -1) {} -$foo = array('boo' => -1); -$x = $test ? -1 : 1; -$y = $test ? 1 : -1; -$z = $test ?: false; - -$closureWithDefaultParameter = function (array $testArray=array()) {}; - -switch ($foo) { - case -1: - break; -} - -$y = 1 * -1; -$y = -1 * 1; -$y = -1 * $var; -$y = 10 / -2; -$y = -10 / 2; -$y = (-10 / 2); -$y = (-10 / $var); -$y = 10 + -2; -$y = -10 + 2; - -$a = $x ? $y : $z; -$a = $x ? $y : $z; - -$y = 1 + 2 - 3; - -$y = 1 + 2 - 3; - -$y = 1 + 2 - 3; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines true -$y = 1 - + 2 - - 3; - -$y = 1 + - 2 - - 3; - -$y = 1 -+ 2 -- 3; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines false - -if (true || -1 == $b) { -} - -$var = array(-1); -$var = [-1]; -$var = [0, -1, -2]; - -$y = array(&$x); -$y = [&$x]; -$y = array(&$a, &$b, &$c); -$y = [&$a, &$b, &$c]; -$y = array(&$a => 1, 2 => &$b, &$c); -$y = [&$a => 1, 2 => &$b, &$c]; - -if ($a <=> $b) { -} - -if ($a <=> $b) { -} - -$a |= $b; -$a **= $b; -$a ??= $b; - -$a = +1; - -function bar($boo = +1) {} - -$username = $_GET['user'] ?? 'nobody'; - -function foo(string $bar, array $baz, ?MyClass $object) : MyClass {} - -declare(strict_types=1); - -function foo($c = ((BAR) ? 10 : 100)) {} - -$res = $a ?: $b; -$res = $a ?: $b; -$res = $a ?: $b; -$res = $a ?: $b; - -$res = $a ? : $b; -$res = $a ? : $b; -$res = $a ? : $b; -$res = $a ? : $b; - -function foo(string $a = '', ?string $b = ''): ?string {} - -// Issue #1605. -$text = preg_replace_callback( - self::CHAR_REFS_REGEX, - [ 'Sanitizer', 'decodeCharReferencesCallback' ], - $text, /* limit */ -1, $count ); - -if (true || /* test */ -1 == $b) {} -$y = 10 + /* test */ -2; - -// Issue #1604. -Hooks::run( 'ParserOptionsRegister', [ - &self::$defaults, - &self::$inCacheKey, - &self::$lazyOptions, -] ); - -$x = $foo ? function (): int { - return 1; -} : $bar; - -$x = $foo ? function ($foo) - // comment - : int { - return 1; -} : $bar; - -$x = $foo ? function ($foo) use /* comment */ ($bar): int { - return 1; -} : $bar; - -$x = !$foo ? $bar : function (): int { - return 1; -}; - -$a = - // Comment. - [ - 'a', - 'b', - ]; - -$a = -// phpcs:ignore Standard.Category.Sniff -- for reasons. -[ - 'a', - 'b', -]; - -$foo = is_array($bar) ? array_map( - function () {}, - $bar - ) : $bar; - -function bar(): array {} - -if ($line{-1} === ':') { - $line = substr($line, 0, -1); -} - -$a = $a instanceof $b; -$a = $a instanceof $b; -$a = ($a) instanceof $b; - -fn&($x) => $x; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments false -$a = 3; - -yield -1; -echo -1; -$a = -1; -func(-1); -$a = [-1]; -return -1; -print -1; -$a &= -1; -switch ($a) { - case -1: -} -$a = $a ?? -1; -$a .= -1; -$a /= -1; -$a = [1 => -1]; -$a = $a == -1; -$a = $a >= -1; -$a = $a === -1; -$a = $a != -1; -$a = $a !== -1; -$a = $a <= -1; -$a = $a <=> -1; -$a = $a and -1; -$a = $a or -1; -$a = $a xor -1; -$a -= -1; -$a %= -1; -$a *= -1; -$a |= -1; -$a += -1; -$a = $a ** -1; -$a **= -1; -$a = $a << -1; -$a <<= -1; -$a = $a >> -1; -$a >>= -1; -$a = (string) -1; -$a = (array) -1; -$a = (bool) -1; -$a = (object) -1; -$a = (unset) -1; -$a = (float) -1; -$a = (int) -1; -$a ^= -1; -$a = [$a, -1]; -$a = $a[-1]; -$a = $a ? -1 : -1; - -yield - 1; -echo - 1; -$a = - 1; -func(- 1); -$a = [- 1]; -return - 1; -print - 1; -$a &= - 1; -switch ($a) { - case - 1: -} -$a = $a ?? - 1; -$a .= - 1; -$a /= - 1; -$a = [1 => - 1]; -$a = $a == - 1; -$a = $a >= - 1; -$a = $a === - 1; -$a = $a != - 1; -$a = $a !== - 1; -$a = $a <= - 1; -$a = $a <=> - 1; -$a = $a and - 1; -$a = $a or - 1; -$a = $a xor - 1; -$a -= - 1; -$a %= - 1; -$a *= - 1; -$a |= - 1; -$a += - 1; -$a = $a ** - 1; -$a **= - 1; -$a = $a << - 1; -$a <<= - 1; -$a = $a >> - 1; -$a >>= - 1; -$a = (string) - 1; -$a = (array) - 1; -$a = (bool) - 1; -$a = (object) - 1; -$a = (unset) - 1; -$a = (float) - 1; -$a = (int) - 1; -$a ^= - 1; -$a = [$a, - 1]; -$a = $a[- 1]; -$a = $a ? - 1 : - 1; - - -yield -$b; -echo -$b; -$a = -$b; -func(-$b); -$a = [-$b]; -return -$b; -print -$b; -$a &= -$b; -switch ($a) { - case -$b: -} -$a = $a ?? -$b; -$a .= -$b; -$a /= -$b; -$a = [1 => -$b]; -$a = $a == -$b; -$a = $a >= -$b; -$a = $a === -$b; -$a = $a != -$b; -$a = $a !== -$b; -$a = $a <= -$b; -$a = $a <=> -$b; -$a = $a and -$b; -$a = $a or -$b; -$a = $a xor -$b; -$a -= -$b; -$a %= -$b; -$a *= -$b; -$a |= -$b; -$a += -$b; -$a = $a ** -$b; -$a **= -$b; -$a = $a << -$b; -$a <<= -$b; -$a = $a >> -$b; -$a >>= -$b; -$a = (string) -$b; -$a = (array) -$b; -$a = (bool) -$b; -$a = (object) -$b; -$a = (unset) -$b; -$a = (float) -$b; -$a = (int) -$b; -$a ^= -$b; -$a = [$a, -$b]; -$a = $a[-$b]; -$a = $a ? -$b : -$b; - -yield - $b; -echo - $b; -$a = - $b; -func(- $b); -$a = [- $b]; -return - $b; -print - $b; -$a &= - $b; -switch ($a) { - case - $b: -} -$a = $a ?? - $b; -$a .= - $b; -$a /= - $b; -$a = [1 => - $b]; -$a = $a == - $b; -$a = $a >= - $b; -$a = $a === - $b; -$a = $a != - $b; -$a = $a !== - $b; -$a = $a <= - $b; -$a = $a <=> - $b; -$a = $a and - $b; -$a = $a or - $b; -$a = $a xor - $b; -$a -= - $b; -$a %= - $b; -$a *= - $b; -$a |= - $b; -$a += - $b; -$a = $a ** - $b; -$a **= - $b; -$a = $a << - $b; -$a <<= - $b; -$a = $a >> - $b; -$a >>= - $b; -$a = (string) - $b; -$a = (array) - $b; -$a = (bool) - $b; -$a = (object) - $b; -$a = (unset) - $b; -$a = (float) - $b; -$a = (int) - $b; -$a ^= - $b; -$a = [$a, - $b]; -$a = $a[- $b]; -$a = $a ? - $b : - $b; - -/* Intentional parse error. This has to be the last test in the file. */ -$a = 10 + diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js deleted file mode 100644 index 16eb130..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js +++ /dev/null @@ -1,103 +0,0 @@ - - -result = 1 + 2; -result = 1 + 2; -result = 1 + 2; -result = 1 +2; -result = 1+ 2; -result = 1+2; - -result = 1 - 2; -result = 1 - 2; -result = 1 - 2; -result = 1 -2; -result = 1- 2; -result = 1-2; - -result = 1 * 2; -result = 1 * 2; -result = 1 * 2; -result = 1 *2; -result = 1* 2; -result = 1*2; - -result = 1 / 2; -result = 1 / 2; -result = 1 / 2; -result = 1 /2; -result = 1/ 2; -result = 1/2; - -result = 1 % 2; -result = 1 % 2; -result = 1 % 2; -result = 1 %2; -result = 1% 2; -result = 1%2; -result = '100%'; - -result += 4; -result+=4; -result -= 4; -result-=4; -result /= 4; -result/=4; -result *=4; -result*=4; - -$.localScroll({offset: {top: -32}}); - -switch (result) { - case -1: - break; -} - -result = x?y:z; -result = x ? y : z; - -if (something === true - ^ somethingElse === true -) { - return false; -} - -y = 1 - + 2 - - 3; - -y = 1 + - 2 - - 3; - -y = 1 -+ 2 -- 3; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines true -y = 1 - + 2 - - 3; - -y = 1 + - 2 - - 3; - -y = 1 -+ 2 -- 3; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines false - -if (true || -1 == b) { -} - -x = x << y; -x <<= y; -x = x >> y; -x >>= y; -x = x >>> y; -x >>>= y; - -var foo = bar.map(baz=> baz.length); - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments false -a = 3; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed deleted file mode 100644 index 877db46..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed +++ /dev/null @@ -1,97 +0,0 @@ - - -result = 1 + 2; -result = 1 + 2; -result = 1 + 2; -result = 1 + 2; -result = 1 + 2; -result = 1 + 2; - -result = 1 - 2; -result = 1 - 2; -result = 1 - 2; -result = 1 - 2; -result = 1 - 2; -result = 1 - 2; - -result = 1 * 2; -result = 1 * 2; -result = 1 * 2; -result = 1 * 2; -result = 1 * 2; -result = 1 * 2; - -result = 1 / 2; -result = 1 / 2; -result = 1 / 2; -result = 1 / 2; -result = 1 / 2; -result = 1 / 2; - -result = 1 % 2; -result = 1 % 2; -result = 1 % 2; -result = 1 % 2; -result = 1 % 2; -result = 1 % 2; -result = '100%'; - -result += 4; -result += 4; -result -= 4; -result -= 4; -result /= 4; -result /= 4; -result *= 4; -result *= 4; - -$.localScroll({offset: {top: -32}}); - -switch (result) { - case -1: - break; -} - -result = x ? y : z; -result = x ? y : z; - -if (something === true - ^ somethingElse === true -) { - return false; -} - -y = 1 + 2 - 3; - -y = 1 + 2 - 3; - -y = 1 + 2 - 3; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines true -y = 1 - + 2 - - 3; - -y = 1 + - 2 - - 3; - -y = 1 -+ 2 -- 3; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines false - -if (true || -1 == b) { -} - -x = x << y; -x <<= y; -x = x >> y; -x >>= y; -x = x >>> y; -x >>>= y; - -var foo = bar.map(baz => baz.length); - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments false -a = 3; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php deleted file mode 100644 index 8e8ad98..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php +++ /dev/null @@ -1,170 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class OperatorSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='OperatorSpacingUnitTest.inc') - { - switch ($testFile) { - case 'OperatorSpacingUnitTest.inc': - return [ - 4 => 1, - 5 => 2, - 6 => 1, - 7 => 1, - 8 => 2, - 11 => 1, - 12 => 2, - 13 => 1, - 14 => 1, - 15 => 2, - 18 => 1, - 19 => 2, - 20 => 1, - 21 => 1, - 22 => 2, - 25 => 1, - 26 => 2, - 27 => 1, - 28 => 1, - 29 => 2, - 32 => 1, - 33 => 2, - 34 => 1, - 35 => 1, - 36 => 2, - 40 => 2, - 42 => 2, - 44 => 2, - 45 => 1, - 46 => 2, - 53 => 4, - 54 => 3, - 59 => 10, - 64 => 1, - 77 => 4, - 78 => 1, - 79 => 1, - 80 => 2, - 81 => 1, - 84 => 6, - 85 => 6, - 87 => 4, - 88 => 5, - 90 => 4, - 91 => 5, - 128 => 4, - 132 => 1, - 133 => 1, - 135 => 1, - 136 => 1, - 140 => 1, - 141 => 1, - 174 => 1, - 177 => 1, - 178 => 1, - 179 => 1, - 185 => 2, - 191 => 4, - 194 => 1, - 195 => 1, - 196 => 2, - 199 => 1, - 200 => 1, - 201 => 2, - 239 => 1, - 246 => 1, - 265 => 2, - 266 => 2, - 271 => 2, - ]; - break; - case 'OperatorSpacingUnitTest.js': - return [ - 4 => 1, - 5 => 2, - 6 => 1, - 7 => 1, - 8 => 2, - 11 => 1, - 12 => 2, - 13 => 1, - 14 => 1, - 15 => 2, - 18 => 1, - 19 => 2, - 20 => 1, - 21 => 1, - 22 => 2, - 25 => 1, - 26 => 2, - 27 => 1, - 28 => 1, - 29 => 2, - 32 => 1, - 33 => 2, - 34 => 1, - 35 => 1, - 36 => 2, - 40 => 2, - 42 => 2, - 44 => 2, - 45 => 1, - 46 => 2, - 55 => 4, - 65 => 1, - 66 => 1, - 68 => 1, - 69 => 1, - 73 => 1, - 74 => 1, - 100 => 1, - 103 => 2, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js deleted file mode 100644 index 15890b9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js +++ /dev/null @@ -1,40 +0,0 @@ -var x = { - b: 'x', - xasd: x, - abc:x, - a: function () { - alert('thats right'); - x = (x?a:x); - }, - casdasd : 123123, - omgwtfbbq: { - a: 1, - b: 2 - } -}; - -id = id.replace(/row\/:/gi, ''); - -outer_loop: -for (i=0; i<3; i++) { - for (j=0; j<5; j++) { - if (j==x) - break outer_loop; - } -} -alert('hi'); - -even_number: if ((i % 2) == 0) { - if (i == 12) - break even_number; -} - -switch (blah) { - case dfx.DOM_VK_LEFT: - this.caretLeft(shiftKey); - break; - default: - if (blah) { - } - break; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js.fixed deleted file mode 100644 index f332878..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js.fixed +++ /dev/null @@ -1,39 +0,0 @@ -var x = { - b: 'x', - xasd: x, - abc: x, - a: function () { - alert('thats right'); - x = (x?a:x); - }, - casdasd: 123123, - omgwtfbbq: { - a: 1, - b: 2 - } -}; - -id = id.replace(/row\/:/gi, ''); - -outer_loop: for (i=0; i<3; i++) { - for (j=0; j<5; j++) { - if (j==x) - break outer_loop; - } -} -alert('hi'); - -even_number: if ((i % 2) == 0) { - if (i == 12) - break even_number; -} - -switch (blah) { - case dfx.DOM_VK_LEFT: - this.caretLeft(shiftKey); - break; - default: - if (blah) { - } - break; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.php deleted file mode 100644 index e80f936..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class PropertyLabelSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 4 => 1, - 9 => 2, - 10 => 1, - 12 => 1, - 18 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc deleted file mode 100644 index 95cd371..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc +++ /dev/null @@ -1,109 +0,0 @@ -{$property} =& new $class_name($this->db_index); - $this->modules[$module] =& $this->{$property}; -} - -foreach ($elements as $element) { - if ($something) { - // Do IF. - } else if ($somethingElse) { - // Do ELSE. - } -} - -if ($token['code'] === T_COMMENT - && $multiLineComment === false - && (substr($token['content'], 0, 2) === '//' - || $token['content']{0} === '#') -) { -} - -switch ($blah) { - case 'one': - echo 'one'; - break; - default: - echo 'another'; -} - -?> - -getRow()): ?> -

    - - - -
    - -

    o hai!

    - -
    - - - - - - - - - - - - $x + $y; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc.fixed deleted file mode 100644 index 1cdd313..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc.fixed +++ /dev/null @@ -1,110 +0,0 @@ -{$property} =& new $class_name($this->db_index); - $this->modules[$module] =& $this->{$property}; -} - -foreach ($elements as $element) { - if ($something) { - // Do IF. - } else if ($somethingElse) { - // Do ELSE. - } -} - -if ($token['code'] === T_COMMENT - && $multiLineComment === false - && (substr($token['content'], 0, 2) === '//' - || $token['content']{0} === '#') -) { -} - -switch ($blah) { - case 'one': - echo 'one'; - break; - default: - echo 'another'; -} - -?> - -getRow()): ?> -

    - - - -
    - -

    o hai!

    - -
    - - - - - - - - - - - - $x + $y; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.php deleted file mode 100644 index 53b473b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ScopeClosingBraceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 11 => 1, - 13 => 1, - 24 => 1, - 80 => 1, - 102 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.inc deleted file mode 100644 index 791cc83..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.inc +++ /dev/null @@ -1,84 +0,0 @@ - 'a', 'b' => 'b' ), - $varQ = 'string', - $varR = 123; - - // Intentionally missing a semi-colon for testing. - public - $varS, - $varT -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.inc.fixed deleted file mode 100644 index a4b792b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,79 +0,0 @@ - 'a', 'b' => 'b' ), - $varQ = 'string', - $varR = 123; - - // Intentionally missing a semi-colon for testing. - public - $varS, - $varT -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php deleted file mode 100644 index c24dcc4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ScopeKeywordSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 2, - 8 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - 17 => 2, - 26 => 1, - 28 => 1, - 29 => 1, - 64 => 1, - 67 => 1, - 71 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc deleted file mode 100644 index 393f484..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc +++ /dev/null @@ -1,42 +0,0 @@ -testThis(); -$test = $this->testThis() ; -$test = $this->testThis() ; -for ($var = 1 ; $var < 10 ; $var++) { - echo $var ; -} -$test = $this->testThis() /* comment here */; -$test = $this->testThis() /* comment here */ ; - -$hello ='foo'; -; - -$sum = $a /* + $b */; -$sum = $a // + $b -; -$sum = $a /* + $b - + $c */ ; - -/* - * Test that the sniff does *not* throw incorrect errors for semi-colons in - * "empty" parts of a `for` control structure. - */ -for ($i = 1; ; $i++) {} -for ( ; $ptr >= 0; $ptr-- ) {} -for ( ; ; ) {} - -// But it should when the semi-colon in a `for` follows a comment (but shouldn't move the semi-colon). -for ( /* Deliberately left empty. */ ; $ptr >= 0; $ptr-- ) {} -for ( $i = 1 ; /* Deliberately left empty. */ ; $i++ ) {} - -switch ($foo) { - case 'foo': - ; - break - ; -} - -// This is an empty statement and should be ignored. -if ($foo) { -; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc.fixed deleted file mode 100644 index 0d06324..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,41 +0,0 @@ -testThis(); -$test = $this->testThis(); -$test = $this->testThis(); -for ($var = 1; $var < 10; $var++) { - echo $var; -} -$test = $this->testThis(); /* comment here */ -$test = $this->testThis(); /* comment here */ - -$hello ='foo'; -; - -$sum = $a; /* + $b */ -$sum = $a; // + $b - -$sum = $a; /* + $b - + $c */ - -/* - * Test that the sniff does *not* throw incorrect errors for semi-colons in - * "empty" parts of a `for` control structure. - */ -for ($i = 1; ; $i++) {} -for ( ; $ptr >= 0; $ptr-- ) {} -for ( ; ; ) {} - -// But it should when the semi-colon in a `for` follows a comment (but shouldn't move the semi-colon). -for ( /* Deliberately left empty. */; $ptr >= 0; $ptr-- ) {} -for ( $i = 1; /* Deliberately left empty. */; $i++ ) {} - -switch ($foo) { - case 'foo': - ; - break; -} - -// This is an empty statement and should be ignored. -if ($foo) { -; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js deleted file mode 100644 index 3aafd6d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js +++ /dev/null @@ -1,25 +0,0 @@ -var x = { - a: function () { - alert('thats right') ; - x = (x?a:x) ; - }, -} ; - -id = id.replace(/row\/:;/gi, ''); - -for (i=0 ; i<3 ; i++) { - for (j=0; j<5 ; j++) { - if (j==x) - break ; - } -} -alert('hi'); -; - -var sum = a /* + b */; - -var sum = a // +b -; - -var sum = a /* +b - + c */ ; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js.fixed deleted file mode 100644 index a547144..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js.fixed +++ /dev/null @@ -1,25 +0,0 @@ -var x = { - a: function () { - alert('thats right'); - x = (x?a:x); - }, -}; - -id = id.replace(/row\/:;/gi, ''); - -for (i=0; i<3; i++) { - for (j=0; j<5; j++) { - if (j==x) - break; - } -} -alert('hi'); -; - -var sum = a; /* + b */ - -var sum = a; // +b - - -var sum = a; /* +b - + c */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.php deleted file mode 100644 index 72196f8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.php +++ /dev/null @@ -1,83 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class SemicolonSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='SemicolonSpacingUnitTest.inc') - { - switch ($testFile) { - case 'SemicolonSpacingUnitTest.inc': - return [ - 3 => 1, - 4 => 1, - 5 => 2, - 6 => 1, - 8 => 1, - 9 => 1, - 14 => 1, - 16 => 1, - 18 => 1, - 29 => 1, - 30 => 2, - 36 => 1, - ]; - break; - case 'SemicolonSpacingUnitTest.js': - return [ - 3 => 1, - 4 => 1, - 6 => 1, - 10 => 2, - 11 => 1, - 13 => 1, - 19 => 1, - 22 => 1, - 25 => 1, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css deleted file mode 100644 index 1dd1b6e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css +++ /dev/null @@ -1,25 +0,0 @@ - -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} - -.HelpWidgetType-new-bug-title{ - float: left; -} - -/* phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines true */ -.HelpWidgetType-new-bug-title{ - float: left; -} - -.HelpWidgetType-new-bug-title{ - float: left; -} -/* phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines false */ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css.fixed deleted file mode 100644 index 59ddddb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css.fixed +++ /dev/null @@ -1,23 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} - -.HelpWidgetType-new-bug-title{ - float: left; -} - -/* phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines true */ -.HelpWidgetType-new-bug-title{ - float: left; -} - -.HelpWidgetType-new-bug-title{ - float: left; -} -/* phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines false */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc deleted file mode 100644 index f9dca29..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc +++ /dev/null @@ -1,74 +0,0 @@ - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc.fixed deleted file mode 100644 index 1d764eb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc.fixed +++ /dev/null @@ -1,68 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js deleted file mode 100644 index be542e7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js +++ /dev/null @@ -1,56 +0,0 @@ - -alert('hi'); -alert('hello'); - -if (something) { - -} - - -function myFunction() -{ - alert('code here'); - - alert('code here'); - - - // Hello. - - /* - HI - */ - - -} - -function myFunction2() -{ - alert('code here'); - - - alert('code here'); - -} - -MyFunction = function() -{ - alert('code here'); - - - alert('code here'); - -}; - -// phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines true - -function myFunction2() -{ - alert('code here'); - - alert('code here'); - -} - -// phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines false - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js.fixed deleted file mode 100644 index 960111a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js.fixed +++ /dev/null @@ -1,50 +0,0 @@ -alert('hi'); -alert('hello'); - -if (something) { - -} - - -function myFunction() -{ - alert('code here'); - - alert('code here'); - - // Hello. - - /* - HI - */ - -} - -function myFunction2() -{ - alert('code here'); - - alert('code here'); - -} - -MyFunction = function() -{ - alert('code here'); - - alert('code here'); - -}; - -// phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines true - -function myFunction2() -{ - alert('code here'); - - alert('code here'); - -} - -// phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines false - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css deleted file mode 100644 index 2025eeb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css +++ /dev/null @@ -1,3 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css.fixed deleted file mode 100644 index 2025eeb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css.fixed +++ /dev/null @@ -1,3 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc deleted file mode 100644 index a6e2b8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc +++ /dev/null @@ -1,9 +0,0 @@ - - -

    - -

    - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc.fixed deleted file mode 100644 index 78c4525..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc.fixed +++ /dev/null @@ -1,7 +0,0 @@ - -

    - -

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js deleted file mode 100644 index 7b0c8ea..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js +++ /dev/null @@ -1 +0,0 @@ -alert('hi'); \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js.fixed deleted file mode 100644 index 7b0c8ea..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js.fixed +++ /dev/null @@ -1 +0,0 @@ -alert('hi'); \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css deleted file mode 100644 index 9f794a0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css +++ /dev/null @@ -1,3 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css.fixed deleted file mode 100644 index 2025eeb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css.fixed +++ /dev/null @@ -1,3 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc deleted file mode 100644 index 661ebda..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc.fixed deleted file mode 100644 index 0cb9748..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc.fixed +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js deleted file mode 100644 index 70f6719..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js +++ /dev/null @@ -1 +0,0 @@ -alert('hi'); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js.fixed deleted file mode 100644 index 70f6719..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js.fixed +++ /dev/null @@ -1 +0,0 @@ -alert('hi'); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc deleted file mode 100644 index 96860ff..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc.fixed deleted file mode 100644 index b26b5b2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc.fixed +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc deleted file mode 100644 index 4d6f06b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc +++ /dev/null @@ -1,5 +0,0 @@ -   -  \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc.fixed deleted file mode 100644 index 8ec5f30..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc.fixed +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.php deleted file mode 100644 index b9ff96f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.php +++ /dev/null @@ -1,113 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class SuperfluousWhitespaceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='SuperfluousWhitespaceUnitTest.inc') - { - switch ($testFile) { - case 'SuperfluousWhitespaceUnitTest.1.inc': - return [ - 2 => 1, - 4 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 16 => 1, - 23 => 1, - 28 => 1, - 33 => 1, - 49 => 1, - 62 => 1, - 65 => 1, - 73 => 1, - ]; - break; - case 'SuperfluousWhitespaceUnitTest.2.inc': - return [ - 2 => 1, - 8 => 1, - ]; - break; - case 'SuperfluousWhitespaceUnitTest.3.inc': - return [ - 6 => 1, - 10 => 1, - ]; - break; - case 'SuperfluousWhitespaceUnitTest.4.inc': - case 'SuperfluousWhitespaceUnitTest.5.inc': - return [ - 1 => 1, - 4 => 1, - ]; - break; - case 'SuperfluousWhitespaceUnitTest.1.js': - return [ - 1 => 1, - 3 => 1, - 4 => 1, - 5 => 1, - 6 => 1, - 15 => 1, - 22 => 1, - 29 => 1, - 38 => 1, - 56 => 1, - ]; - break; - case 'SuperfluousWhitespaceUnitTest.1.css': - return [ - 1 => 1, - 8 => 1, - 9 => 1, - 11 => 1, - 25 => 1, - ]; - break; - default: - return []; - break; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/ruleset.xml deleted file mode 100644 index 87ab4c3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/ruleset.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - The Squiz coding standard. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - %2$s - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - - - - - - - - - - 0 - - - error - - - - - 0 - - - error - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Debug/CodeAnalyzerStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Debug/CodeAnalyzerStandard.xml deleted file mode 100644 index c462b4f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Debug/CodeAnalyzerStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - $bar + $baz; -} - ]]> - - - $bar + 2; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Files/ClosingTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Files/ClosingTagStandard.xml deleted file mode 100644 index aa60b8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Files/ClosingTagStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - ?> - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/NamingConventions/ValidVariableNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/NamingConventions/ValidVariableNameStandard.xml deleted file mode 100644 index 5bcde4b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/NamingConventions/ValidVariableNameStandard.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - $testNumber = 1; - ]]> - - - $Test_Number = 1; - ]]> - - - - - _bar; -} - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Debug/CodeAnalyzerSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Debug/CodeAnalyzerSniff.php deleted file mode 100644 index d18c947..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Debug/CodeAnalyzerSniff.php +++ /dev/null @@ -1,97 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Zend\Sniffs\Debug; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\RuntimeException; - -class CodeAnalyzerSniff implements Sniff -{ - - - /** - * Returns the token types that this sniff is interested in. - * - * @return int[] - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return int - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If ZendCodeAnalyzer could not be run. - */ - public function process(File $phpcsFile, $stackPtr) - { - $analyzerPath = Config::getExecutablePath('zend_ca'); - if ($analyzerPath === null) { - return; - } - - $fileName = $phpcsFile->getFilename(); - - // In the command, 2>&1 is important because the code analyzer sends its - // findings to stderr. $output normally contains only stdout, so using 2>&1 - // will pipe even stderr to stdout. - $cmd = escapeshellcmd($analyzerPath).' '.escapeshellarg($fileName).' 2>&1'; - - // There is the possibility to pass "--ide" as an option to the analyzer. - // This would result in an output format which would be easier to parse. - // The problem here is that no cleartext error messages are returned; only - // error-code-labels. So for a start we go for cleartext output. - $exitCode = exec($cmd, $output, $retval); - - // Variable $exitCode is the last line of $output if no error occurs, on - // error it is numeric. Try to handle various error conditions and - // provide useful error reporting. - if (is_numeric($exitCode) === true && $exitCode > 0) { - if (is_array($output) === true) { - $msg = join('\n', $output); - } - - throw new RuntimeException("Failed invoking ZendCodeAnalyzer, exitcode was [$exitCode], retval was [$retval], output was [$msg]"); - } - - if (is_array($output) === true) { - foreach ($output as $finding) { - // The first two lines of analyzer output contain - // something like this: - // > Zend Code Analyzer 1.2.2 - // > Analyzing ... - // So skip these... - $res = preg_match("/^.+\(line ([0-9]+)\):(.+)$/", $finding, $regs); - if (empty($regs) === true || $res === false) { - continue; - } - - $phpcsFile->addWarningOnLine(trim($regs[2]), $regs[1], 'ExternalTool'); - } - } - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Files/ClosingTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Files/ClosingTagSniff.php deleted file mode 100644 index 0ed34d1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Files/ClosingTagSniff.php +++ /dev/null @@ -1,79 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Zend\Sniffs\Files; - -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class ClosingTagSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Find the last non-empty token. - $tokens = $phpcsFile->getTokens(); - for ($last = ($phpcsFile->numTokens - 1); $last > 0; $last--) { - if (trim($tokens[$last]['content']) !== '') { - break; - } - } - - if ($tokens[$last]['code'] === T_CLOSE_TAG) { - $error = 'A closing tag is not permitted at the end of a PHP file'; - $fix = $phpcsFile->addFixableError($error, $last, 'NotAllowed'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($last, $phpcsFile->eolChar); - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($last - 1), null, true); - if ($tokens[$prev]['code'] !== T_SEMICOLON - && $tokens[$prev]['code'] !== T_CLOSE_CURLY_BRACKET - && $tokens[$prev]['code'] !== T_OPEN_TAG - ) { - $phpcsFile->fixer->addContent($prev, ';'); - } - - $phpcsFile->fixer->endChangeset(); - } - - $phpcsFile->recordMetric($stackPtr, 'PHP closing tag at EOF', 'yes'); - } else { - $phpcsFile->recordMetric($stackPtr, 'PHP closing tag at EOF', 'no'); - }//end if - - // Ignore the rest of the file. - return ($phpcsFile->numTokens + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/NamingConventions/ValidVariableNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/NamingConventions/ValidVariableNameSniff.php deleted file mode 100644 index ea98fd2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/NamingConventions/ValidVariableNameSniff.php +++ /dev/null @@ -1,194 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Zend\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class ValidVariableNameSniff extends AbstractVariableSniff -{ - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $varName = ltrim($tokens[$stackPtr]['content'], '$'); - - // If it's a php reserved var, then its ok. - if (isset($this->phpReservedVars[$varName]) === true) { - return; - } - - $objOperator = $phpcsFile->findNext([T_WHITESPACE], ($stackPtr + 1), null, true); - if ($tokens[$objOperator]['code'] === T_OBJECT_OPERATOR) { - // Check to see if we are using a variable from an object. - $var = $phpcsFile->findNext([T_WHITESPACE], ($objOperator + 1), null, true); - if ($tokens[$var]['code'] === T_STRING) { - // Either a var name or a function call, so check for bracket. - $bracket = $phpcsFile->findNext([T_WHITESPACE], ($var + 1), null, true); - - if ($tokens[$bracket]['code'] !== T_OPEN_PARENTHESIS) { - $objVarName = $tokens[$var]['content']; - - // There is no way for us to know if the var is public or private, - // so we have to ignore a leading underscore if there is one and just - // check the main part of the variable name. - $originalVarName = $objVarName; - if (substr($objVarName, 0, 1) === '_') { - $objVarName = substr($objVarName, 1); - } - - if (Common::isCamelCaps($objVarName, false, true, false) === false) { - $error = 'Variable "%s" is not in valid camel caps format'; - $data = [$originalVarName]; - $phpcsFile->addError($error, $var, 'NotCamelCaps', $data); - } else if (preg_match('|\d|', $objVarName) === 1) { - $warning = 'Variable "%s" contains numbers but this is discouraged'; - $data = [$originalVarName]; - $phpcsFile->addWarning($warning, $stackPtr, 'ContainsNumbers', $data); - } - }//end if - }//end if - }//end if - - // There is no way for us to know if the var is public or private, - // so we have to ignore a leading underscore if there is one and just - // check the main part of the variable name. - $originalVarName = $varName; - if (substr($varName, 0, 1) === '_') { - $objOperator = $phpcsFile->findPrevious([T_WHITESPACE], ($stackPtr - 1), null, true); - if ($tokens[$objOperator]['code'] === T_DOUBLE_COLON) { - // The variable lives within a class, and is referenced like - // this: MyClass::$_variable, so we don't know its scope. - $inClass = true; - } else { - $inClass = $phpcsFile->hasCondition($stackPtr, Tokens::$ooScopeTokens); - } - - if ($inClass === true) { - $varName = substr($varName, 1); - } - } - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Variable "%s" is not in valid camel caps format'; - $data = [$originalVarName]; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $data); - } else if (preg_match('|\d|', $varName) === 1) { - $warning = 'Variable "%s" contains numbers but this is discouraged'; - $data = [$originalVarName]; - $phpcsFile->addWarning($warning, $stackPtr, 'ContainsNumbers', $data); - } - - }//end processVariable() - - - /** - * Processes class member variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $varName = ltrim($tokens[$stackPtr]['content'], '$'); - $memberProps = $phpcsFile->getMemberProperties($stackPtr); - if (empty($memberProps) === true) { - // Exception encountered. - return; - } - - $public = ($memberProps['scope'] === 'public'); - - if ($public === true) { - if (substr($varName, 0, 1) === '_') { - $error = 'Public member variable "%s" must not contain a leading underscore'; - $data = [$varName]; - $phpcsFile->addError($error, $stackPtr, 'PublicHasUnderscore', $data); - } - } else { - if (substr($varName, 0, 1) !== '_') { - $scope = ucfirst($memberProps['scope']); - $error = '%s member variable "%s" must contain a leading underscore'; - $data = [ - $scope, - $varName, - ]; - $phpcsFile->addError($error, $stackPtr, 'PrivateNoUnderscore', $data); - } - } - - // Remove a potential underscore prefix for testing CamelCaps. - $varName = ltrim($varName, '_'); - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Member variable "%s" is not in valid camel caps format'; - $data = [$varName]; - $phpcsFile->addError($error, $stackPtr, 'MemberVarNotCamelCaps', $data); - } else if (preg_match('|\d|', $varName) === 1) { - $warning = 'Member variable "%s" contains numbers but this is discouraged'; - $data = [$varName]; - $phpcsFile->addWarning($warning, $stackPtr, 'MemberVarContainsNumbers', $data); - } - - }//end processMemberVar() - - - /** - * Processes the variable found within a double quoted string. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the double quoted - * string. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (preg_match_all('|[^\\\]\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)|', $tokens[$stackPtr]['content'], $matches) !== 0) { - foreach ($matches[1] as $varName) { - // If it's a php reserved var, then its ok. - if (isset($this->phpReservedVars[$varName]) === true) { - continue; - } - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Variable "%s" is not in valid camel caps format'; - $data = [$varName]; - $phpcsFile->addError($error, $stackPtr, 'StringVarNotCamelCaps', $data); - } else if (preg_match('|\d|', $varName) === 1) { - $warning = 'Variable "%s" contains numbers but this is discouraged'; - $data = [$varName]; - $phpcsFile->addWarning($warning, $stackPtr, 'StringVarContainsNumbers', $data); - } - }//end foreach - }//end if - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.inc deleted file mode 100644 index c8d0499..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.inc +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.php deleted file mode 100644 index efd3b90..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Zend\Tests\Debug; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; -use PHP_CodeSniffer\Config; - -class CodeAnalyzerUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Should this test be skipped for some reason. - * - * @return void - */ - protected function shouldSkipTest() - { - $analyzerPath = Config::getExecutablePath('zend_ca'); - if ($analyzerPath === null) { - return true; - } - - return false; - - }//end shouldSkipTest() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [2 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc deleted file mode 100644 index 7e7089d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc.fixed deleted file mode 100644 index caf3b38..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc.fixed +++ /dev/null @@ -1,12 +0,0 @@ - - -

    - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc deleted file mode 100644 index 63df04d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc +++ /dev/null @@ -1 +0,0 @@ -add('arg'))?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc.fixed deleted file mode 100644 index b4c4621..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc.fixed +++ /dev/null @@ -1 +0,0 @@ -add('arg')); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc deleted file mode 100644 index 539365d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc +++ /dev/null @@ -1 +0,0 @@ -add('arg')) /* comment */ ?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc.fixed deleted file mode 100644 index 4cc31a5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc.fixed +++ /dev/null @@ -1 +0,0 @@ -add('arg')); /* comment */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc deleted file mode 100644 index 09e4844..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc +++ /dev/null @@ -1 +0,0 @@ -add('arg')); } ?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc.fixed deleted file mode 100644 index 9ff112a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc.fixed +++ /dev/null @@ -1 +0,0 @@ -add('arg')); } diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc deleted file mode 100644 index 48de7e0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc.fixed deleted file mode 100644 index 796727a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc.fixed +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.7.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.7.inc.fixed deleted file mode 100644 index dc84e23..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.7.inc.fixed +++ /dev/null @@ -1 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Zend\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ClosingTagUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ClosingTagUnitTest.1.inc': - return [11 => 1]; - - case 'ClosingTagUnitTest.3.inc': - case 'ClosingTagUnitTest.4.inc': - case 'ClosingTagUnitTest.5.inc': - case 'ClosingTagUnitTest.7.inc': - return [1 => 1]; - - case 'ClosingTagUnitTest.6.inc': - return [3 => 1]; - - default: - return []; - } - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.inc deleted file mode 100644 index 1bf486c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.inc +++ /dev/null @@ -1,118 +0,0 @@ -varName; -echo $this->var_name; -echo $this->varname; -echo $this->_varName; -echo $this->varName2; -echo $object->varName; -echo $object->var_name; -echo $object->varName2; -echo $object_name->varname; -echo $object_name->_varName; -echo $object_name->varName2; - -echo $this->myFunction($one, $two); -echo $object->myFunction($one_two, $var2); - -$error = "format is \$GLOBALS['$varName']"; -$error = "format is \$GLOBALS['$varName2']"; - -echo $_SESSION['var_name']; -echo $_FILES['var_name']; -echo $_ENV['var_name']; -echo $_COOKIE['var_name']; -echo $_COOKIE['var_name2']; - -$XML = 'hello'; -$myXML = 'hello'; -$XMLParser = 'hello'; -$xmlParser = 'hello'; -$xmlParser2 = 'hello'; - -echo "{$_SERVER['HOSTNAME']} $var_name"; - -$someObject->{$name}; -$someObject->my_function($var_name); - -var_dump($http_response_header); -var_dump($HTTP_RAW_POST_DATA); -var_dump($php_errormsg); - -interface Base -{ - protected $anonymous; - - public function __construct(); -} - -$anonClass = new class() { - public function foo($foo, $_foo, $foo_bar) { - $bar = 1; - $_bar = 2; - $bar_foo = 3; - } -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.php deleted file mode 100644 index d22b24f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.php +++ /dev/null @@ -1,93 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Zend\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -class ValidVariableNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 1, - 11 => 1, - 13 => 1, - 17 => 1, - 19 => 1, - 23 => 1, - 25 => 1, - 29 => 1, - 31 => 1, - 36 => 1, - 38 => 1, - 42 => 1, - 44 => 1, - 48 => 1, - 50 => 1, - 61 => 1, - 67 => 1, - 72 => 1, - 74 => 1, - 75 => 1, - 76 => 1, - 79 => 1, - 96 => 1, - 99 => 1, - 113 => 1, - 116 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 6 => 1, - 14 => 1, - 20 => 1, - 26 => 1, - 32 => 1, - 39 => 1, - 45 => 1, - 51 => 1, - 64 => 1, - 70 => 1, - 73 => 1, - 76 => 1, - 79 => 1, - 82 => 1, - 94 => 1, - 107 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/ruleset.xml deleted file mode 100644 index d10b103..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/ruleset.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - A coding standard based on an early Zend Framework coding standard. Note that this standard is out of date. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Tokenizers/CSS.php b/vendor/squizlabs/php_codesniffer/src/Tokenizers/CSS.php deleted file mode 100644 index b7c2018..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Tokenizers/CSS.php +++ /dev/null @@ -1,537 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tokenizers; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\TokenizerException; -use PHP_CodeSniffer\Util; - -class CSS extends PHP -{ - - - /** - * Initialise the tokenizer. - * - * Pre-checks the content to see if it looks minified. - * - * @param string $content The content to tokenize, - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * @param string $eolChar The EOL char used in the content. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the file appears to be minified. - */ - public function __construct($content, Config $config, $eolChar='\n') - { - if ($this->isMinifiedContent($content, $eolChar) === true) { - throw new TokenizerException('File appears to be minified and cannot be processed'); - } - - parent::__construct($content, $config, $eolChar); - - }//end __construct() - - - /** - * Creates an array of tokens when given some CSS code. - * - * Uses the PHP tokenizer to do all the tricky work - * - * @param string $string The string to tokenize. - * - * @return array - */ - public function tokenize($string) - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START CSS TOKENIZING 1ST PASS ***".PHP_EOL; - } - - // If the content doesn't have an EOL char on the end, add one so - // the open and close tags we add are parsed correctly. - $eolAdded = false; - if (substr($string, (strlen($this->eolChar) * -1)) !== $this->eolChar) { - $string .= $this->eolChar; - $eolAdded = true; - } - - $string = str_replace('', '^PHPCS_CSS_T_CLOSE_TAG^', $string); - $tokens = parent::tokenize(''); - - $finalTokens = []; - $finalTokens[0] = [ - 'code' => T_OPEN_TAG, - 'type' => 'T_OPEN_TAG', - 'content' => '', - ]; - - $newStackPtr = 1; - $numTokens = count($tokens); - $multiLineComment = false; - for ($stackPtr = 1; $stackPtr < $numTokens; $stackPtr++) { - $token = $tokens[$stackPtr]; - - // CSS files don't have lists, breaks etc, so convert these to - // standard strings early so they can be converted into T_STYLE - // tokens and joined with other strings if needed. - if ($token['code'] === T_BREAK - || $token['code'] === T_LIST - || $token['code'] === T_DEFAULT - || $token['code'] === T_SWITCH - || $token['code'] === T_FOR - || $token['code'] === T_FOREACH - || $token['code'] === T_WHILE - || $token['code'] === T_DEC - || $token['code'] === T_NEW - ) { - $token['type'] = 'T_STRING'; - $token['code'] = T_STRING; - } - - $token['content'] = str_replace('^PHPCS_CSS_T_OPEN_TAG^', '', $token['content']); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $token['type']; - $content = Util\Common::prepareForOutput($token['content']); - echo "\tProcess token $stackPtr: $type => $content".PHP_EOL; - } - - if ($token['code'] === T_BITWISE_XOR - && $tokens[($stackPtr + 1)]['content'] === 'PHPCS_CSS_T_OPEN_TAG' - ) { - $content = ''; - $stackPtr += 2; - break; - } else { - $content .= $tokens[$stackPtr]['content']; - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> Found embedded PHP code: "; - $cleanContent = Util\Common::prepareForOutput($content); - echo $cleanContent.PHP_EOL; - } - - $finalTokens[$newStackPtr] = [ - 'type' => 'T_EMBEDDED_PHP', - 'code' => T_EMBEDDED_PHP, - 'content' => $content, - ]; - - $newStackPtr++; - continue; - }//end if - - if ($token['code'] === T_GOTO_LABEL) { - // Convert these back to T_STRING followed by T_COLON so we can - // more easily process style definitions. - $finalTokens[$newStackPtr] = [ - 'type' => 'T_STRING', - 'code' => T_STRING, - 'content' => substr($token['content'], 0, -1), - ]; - $newStackPtr++; - $finalTokens[$newStackPtr] = [ - 'type' => 'T_COLON', - 'code' => T_COLON, - 'content' => ':', - ]; - $newStackPtr++; - continue; - } - - if ($token['code'] === T_FUNCTION) { - // There are no functions in CSS, so convert this to a string. - $finalTokens[$newStackPtr] = [ - 'type' => 'T_STRING', - 'code' => T_STRING, - 'content' => $token['content'], - ]; - - $newStackPtr++; - continue; - } - - if ($token['code'] === T_COMMENT - && substr($token['content'], 0, 2) === '/*' - ) { - // Multi-line comment. Record it so we can ignore other - // comment tags until we get out of this one. - $multiLineComment = true; - } - - if ($token['code'] === T_COMMENT - && $multiLineComment === false - && (substr($token['content'], 0, 2) === '//' - || $token['content'][0] === '#') - ) { - $content = ltrim($token['content'], '#/'); - - // Guard against PHP7+ syntax errors by stripping - // leading zeros so the content doesn't look like an invalid int. - $leadingZero = false; - if ($content[0] === '0') { - $content = '1'.$content; - $leadingZero = true; - } - - $commentTokens = parent::tokenize(''); - - // The first and last tokens are the open/close tags. - array_shift($commentTokens); - array_pop($commentTokens); - - if ($leadingZero === true) { - $commentTokens[0]['content'] = substr($commentTokens[0]['content'], 1); - $content = substr($content, 1); - } - - if ($token['content'][0] === '#') { - // The # character is not a comment in CSS files, so - // determine what it means in this context. - $firstContent = $commentTokens[0]['content']; - - // If the first content is just a number, it is probably a - // colour like 8FB7DB, which PHP splits into 8 and FB7DB. - if (($commentTokens[0]['code'] === T_LNUMBER - || $commentTokens[0]['code'] === T_DNUMBER) - && $commentTokens[1]['code'] === T_STRING - ) { - $firstContent .= $commentTokens[1]['content']; - array_shift($commentTokens); - } - - // If the first content looks like a colour and not a class - // definition, join the tokens together. - if (preg_match('/^[ABCDEF0-9]+$/i', $firstContent) === 1 - && $commentTokens[1]['content'] !== '-' - ) { - array_shift($commentTokens); - // Work out what we trimmed off above and remember to re-add it. - $trimmed = substr($token['content'], 0, (strlen($token['content']) - strlen($content))); - $finalTokens[$newStackPtr] = [ - 'type' => 'T_COLOUR', - 'code' => T_COLOUR, - 'content' => $trimmed.$firstContent, - ]; - } else { - $finalTokens[$newStackPtr] = [ - 'type' => 'T_HASH', - 'code' => T_HASH, - 'content' => '#', - ]; - } - } else { - $finalTokens[$newStackPtr] = [ - 'type' => 'T_STRING', - 'code' => T_STRING, - 'content' => '//', - ]; - }//end if - - $newStackPtr++; - - array_splice($tokens, $stackPtr, 1, $commentTokens); - $numTokens = count($tokens); - $stackPtr--; - continue; - }//end if - - if ($token['code'] === T_COMMENT - && substr($token['content'], -2) === '*/' - ) { - // Multi-line comment is done. - $multiLineComment = false; - } - - $finalTokens[$newStackPtr] = $token; - $newStackPtr++; - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END CSS TOKENIZING 1ST PASS ***".PHP_EOL; - echo "\t*** START CSS TOKENIZING 2ND PASS ***".PHP_EOL; - } - - // A flag to indicate if we are inside a style definition, - // which is defined using curly braces. - $inStyleDef = false; - - // A flag to indicate if an At-rule like "@media" is used, which will result - // in nested curly brackets. - $asperandStart = false; - - $numTokens = count($finalTokens); - for ($stackPtr = 0; $stackPtr < $numTokens; $stackPtr++) { - $token = $finalTokens[$stackPtr]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $token['type']; - $content = Util\Common::prepareForOutput($token['content']); - echo "\tProcess token $stackPtr: $type => $content".PHP_EOL; - } - - switch ($token['code']) { - case T_OPEN_CURLY_BRACKET: - // Opening curly brackets for an At-rule do not start a style - // definition. We also reset the asperand flag here because the next - // opening curly bracket could be indeed the start of a style - // definition. - if ($asperandStart === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if ($inStyleDef === true) { - echo "\t\t* style definition closed *".PHP_EOL; - } - - if ($asperandStart === true) { - echo "\t\t* at-rule definition closed *".PHP_EOL; - } - } - - $inStyleDef = false; - $asperandStart = false; - } else { - $inStyleDef = true; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* style definition opened *".PHP_EOL; - } - } - break; - case T_CLOSE_CURLY_BRACKET: - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if ($inStyleDef === true) { - echo "\t\t* style definition closed *".PHP_EOL; - } - - if ($asperandStart === true) { - echo "\t\t* at-rule definition closed *".PHP_EOL; - } - } - - $inStyleDef = false; - $asperandStart = false; - break; - case T_MINUS: - // Minus signs are often used instead of spaces inside - // class names, IDs and styles. - if ($finalTokens[($stackPtr + 1)]['code'] === T_STRING) { - if ($finalTokens[($stackPtr - 1)]['code'] === T_STRING) { - $newContent = $finalTokens[($stackPtr - 1)]['content'].'-'.$finalTokens[($stackPtr + 1)]['content']; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token is a string joiner; ignoring this and previous token".PHP_EOL; - $old = Util\Common::prepareForOutput($finalTokens[($stackPtr + 1)]['content']); - $new = Util\Common::prepareForOutput($newContent); - echo "\t\t=> token ".($stackPtr + 1)." content changed from \"$old\" to \"$new\"".PHP_EOL; - } - - $finalTokens[($stackPtr + 1)]['content'] = $newContent; - unset($finalTokens[$stackPtr]); - unset($finalTokens[($stackPtr - 1)]); - } else { - $newContent = '-'.$finalTokens[($stackPtr + 1)]['content']; - - $finalTokens[($stackPtr + 1)]['content'] = $newContent; - unset($finalTokens[$stackPtr]); - } - } else if ($finalTokens[($stackPtr + 1)]['code'] === T_LNUMBER) { - // They can also be used to provide negative numbers. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token is part of a negative number; adding content to next token and ignoring *".PHP_EOL; - $content = Util\Common::prepareForOutput($finalTokens[($stackPtr + 1)]['content']); - echo "\t\t=> token ".($stackPtr + 1)." content changed from \"$content\" to \"-$content\"".PHP_EOL; - } - - $finalTokens[($stackPtr + 1)]['content'] = '-'.$finalTokens[($stackPtr + 1)]['content']; - unset($finalTokens[$stackPtr]); - }//end if - break; - case T_COLON: - // Only interested in colons that are defining styles. - if ($inStyleDef === false) { - break; - } - - for ($x = ($stackPtr - 1); $x >= 0; $x--) { - if (isset(Util\Tokens::$emptyTokens[$finalTokens[$x]['code']]) === false) { - break; - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $finalTokens[$x]['type']; - echo "\t\t=> token $x changed from $type to T_STYLE".PHP_EOL; - } - - $finalTokens[$x]['type'] = 'T_STYLE'; - $finalTokens[$x]['code'] = T_STYLE; - break; - case T_STRING: - if (strtolower($token['content']) === 'url') { - // Find the next content. - for ($x = ($stackPtr + 1); $x < $numTokens; $x++) { - if (isset(Util\Tokens::$emptyTokens[$finalTokens[$x]['code']]) === false) { - break; - } - } - - // Needs to be in the format "url(" for it to be a URL. - if ($finalTokens[$x]['code'] !== T_OPEN_PARENTHESIS) { - continue 2; - } - - // Make sure the content isn't empty. - for ($y = ($x + 1); $y < $numTokens; $y++) { - if (isset(Util\Tokens::$emptyTokens[$finalTokens[$y]['code']]) === false) { - break; - } - } - - if ($finalTokens[$y]['code'] === T_CLOSE_PARENTHESIS) { - continue 2; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - for ($i = ($stackPtr + 1); $i <= $y; $i++) { - $type = $finalTokens[$i]['type']; - $content = Util\Common::prepareForOutput($finalTokens[$i]['content']); - echo "\tProcess token $i: $type => $content".PHP_EOL; - } - - echo "\t\t* token starts a URL *".PHP_EOL; - } - - // Join all the content together inside the url() statement. - $newContent = ''; - for ($i = ($x + 2); $i < $numTokens; $i++) { - if ($finalTokens[$i]['code'] === T_CLOSE_PARENTHESIS) { - break; - } - - $newContent .= $finalTokens[$i]['content']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($finalTokens[$i]['content']); - echo "\t\t=> token $i added to URL string and ignored: $content".PHP_EOL; - } - - unset($finalTokens[$i]); - } - - $stackPtr = $i; - - // If the content inside the "url()" is in double quotes - // there will only be one token and so we don't have to do - // anything except change its type. If it is not empty, - // we need to do some token merging. - $finalTokens[($x + 1)]['type'] = 'T_URL'; - $finalTokens[($x + 1)]['code'] = T_URL; - - if ($newContent !== '') { - $finalTokens[($x + 1)]['content'] .= $newContent; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($finalTokens[($x + 1)]['content']); - echo "\t\t=> token content changed to: $content".PHP_EOL; - } - } - } else if ($finalTokens[$stackPtr]['content'][0] === '-' - && $finalTokens[($stackPtr + 1)]['code'] === T_STRING - ) { - if (isset($finalTokens[($stackPtr - 1)]) === true - && $finalTokens[($stackPtr - 1)]['code'] === T_STRING - ) { - $newContent = $finalTokens[($stackPtr - 1)]['content'].$finalTokens[$stackPtr]['content'].$finalTokens[($stackPtr + 1)]['content']; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token is a string joiner; ignoring this and previous token".PHP_EOL; - $old = Util\Common::prepareForOutput($finalTokens[($stackPtr + 1)]['content']); - $new = Util\Common::prepareForOutput($newContent); - echo "\t\t=> token ".($stackPtr + 1)." content changed from \"$old\" to \"$new\"".PHP_EOL; - } - - $finalTokens[($stackPtr + 1)]['content'] = $newContent; - unset($finalTokens[$stackPtr]); - unset($finalTokens[($stackPtr - 1)]); - } else { - $newContent = $finalTokens[$stackPtr]['content'].$finalTokens[($stackPtr + 1)]['content']; - - $finalTokens[($stackPtr + 1)]['content'] = $newContent; - unset($finalTokens[$stackPtr]); - } - }//end if - break; - case T_ASPERAND: - $asperandStart = true; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* at-rule definition opened *".PHP_EOL; - } - break; - default: - // Nothing special to be done with this token. - break; - }//end switch - }//end for - - // Reset the array keys to avoid gaps. - $finalTokens = array_values($finalTokens); - $numTokens = count($finalTokens); - - // Blank out the content of the end tag. - $finalTokens[($numTokens - 1)]['content'] = ''; - - if ($eolAdded === true) { - // Strip off the extra EOL char we added for tokenizing. - $finalTokens[($numTokens - 2)]['content'] = substr( - $finalTokens[($numTokens - 2)]['content'], - 0, - (strlen($this->eolChar) * -1) - ); - - if ($finalTokens[($numTokens - 2)]['content'] === '') { - unset($finalTokens[($numTokens - 2)]); - $finalTokens = array_values($finalTokens); - $numTokens = count($finalTokens); - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END CSS TOKENIZING 2ND PASS ***".PHP_EOL; - } - - return $finalTokens; - - }//end tokenize() - - - /** - * Performs additional processing after main tokenizing. - * - * @return void - */ - public function processAdditional() - { - /* - We override this method because we don't want the PHP version to - run during CSS processing because it is wasted processing time. - */ - - }//end processAdditional() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Tokenizers/Comment.php b/vendor/squizlabs/php_codesniffer/src/Tokenizers/Comment.php deleted file mode 100644 index beba53c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Tokenizers/Comment.php +++ /dev/null @@ -1,277 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tokenizers; - -use PHP_CodeSniffer\Util; - -class Comment -{ - - - /** - * Creates an array of tokens when given some PHP code. - * - * Starts by using token_get_all() but does a lot of extra processing - * to insert information about the context of the token. - * - * @param string $string The string to tokenize. - * @param string $eolChar The EOL character to use for splitting strings. - * @param int $stackPtr The position of the first token in the file. - * - * @return array - */ - public function tokenizeString($string, $eolChar, $stackPtr) - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t*** START COMMENT TOKENIZING ***".PHP_EOL; - } - - $tokens = []; - $numChars = strlen($string); - - /* - Doc block comments start with /*, but typically contain an - extra star when they are used for function and class comments. - */ - - $char = ($numChars - strlen(ltrim($string, '/*'))); - $openTag = substr($string, 0, $char); - $string = ltrim($string, '/*'); - - $tokens[$stackPtr] = [ - 'content' => $openTag, - 'code' => T_DOC_COMMENT_OPEN_TAG, - 'type' => 'T_DOC_COMMENT_OPEN_TAG', - 'comment_tags' => [], - ]; - - $openPtr = $stackPtr; - $stackPtr++; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($openTag); - echo "\t\tCreate comment token: T_DOC_COMMENT_OPEN_TAG => $content".PHP_EOL; - } - - /* - Strip off the close tag so it doesn't interfere with any - of our comment line processing. The token will be added to the - stack just before we return it. - */ - - $closeTag = [ - 'content' => substr($string, strlen(rtrim($string, '/*'))), - 'code' => T_DOC_COMMENT_CLOSE_TAG, - 'type' => 'T_DOC_COMMENT_CLOSE_TAG', - 'comment_opener' => $openPtr, - ]; - - if ($closeTag['content'] === false) { - $closeTag['content'] = ''; - } - - $string = rtrim($string, '/*'); - - /* - Process each line of the comment. - */ - - $lines = explode($eolChar, $string); - $numLines = count($lines); - foreach ($lines as $lineNum => $string) { - if ($lineNum !== ($numLines - 1)) { - $string .= $eolChar; - } - - $char = 0; - $numChars = strlen($string); - - // We've started a new line, so process the indent. - $space = $this->collectWhitespace($string, $char, $numChars); - if ($space !== null) { - $tokens[$stackPtr] = $space; - $stackPtr++; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($space['content']); - echo "\t\tCreate comment token: T_DOC_COMMENT_WHITESPACE => $content".PHP_EOL; - } - - $char += strlen($space['content']); - if ($char === $numChars) { - break; - } - } - - if ($string === '') { - continue; - } - - if ($lineNum > 0 && $string[$char] === '*') { - // This is a function or class doc block line. - $char++; - $tokens[$stackPtr] = [ - 'content' => '*', - 'code' => T_DOC_COMMENT_STAR, - 'type' => 'T_DOC_COMMENT_STAR', - ]; - - $stackPtr++; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\tCreate comment token: T_DOC_COMMENT_STAR => *".PHP_EOL; - } - } - - // Now we are ready to process the actual content of the line. - $lineTokens = $this->processLine($string, $eolChar, $char, $numChars); - foreach ($lineTokens as $lineToken) { - $tokens[$stackPtr] = $lineToken; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($lineToken['content']); - $type = $lineToken['type']; - echo "\t\tCreate comment token: $type => $content".PHP_EOL; - } - - if ($lineToken['code'] === T_DOC_COMMENT_TAG) { - $tokens[$openPtr]['comment_tags'][] = $stackPtr; - } - - $stackPtr++; - } - }//end foreach - - $tokens[$stackPtr] = $closeTag; - $tokens[$openPtr]['comment_closer'] = $stackPtr; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($closeTag['content']); - echo "\t\tCreate comment token: T_DOC_COMMENT_CLOSE_TAG => $content".PHP_EOL; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t*** END COMMENT TOKENIZING ***".PHP_EOL; - } - - return $tokens; - - }//end tokenizeString() - - - /** - * Process a single line of a comment. - * - * @param string $string The comment string being tokenized. - * @param string $eolChar The EOL character to use for splitting strings. - * @param int $start The position in the string to start processing. - * @param int $end The position in the string to end processing. - * - * @return array - */ - private function processLine($string, $eolChar, $start, $end) - { - $tokens = []; - - // Collect content padding. - $space = $this->collectWhitespace($string, $start, $end); - if ($space !== null) { - $tokens[] = $space; - $start += strlen($space['content']); - } - - if (isset($string[$start]) === false) { - return $tokens; - } - - if ($string[$start] === '@') { - // The content up until the first whitespace is the tag name. - $matches = []; - preg_match('/@[^\s]+/', $string, $matches, 0, $start); - if (isset($matches[0]) === true - && substr(strtolower($matches[0]), 0, 7) !== '@phpcs:' - ) { - $tagName = $matches[0]; - $start += strlen($tagName); - $tokens[] = [ - 'content' => $tagName, - 'code' => T_DOC_COMMENT_TAG, - 'type' => 'T_DOC_COMMENT_TAG', - ]; - - // Then there will be some whitespace. - $space = $this->collectWhitespace($string, $start, $end); - if ($space !== null) { - $tokens[] = $space; - $start += strlen($space['content']); - } - } - }//end if - - // Process the rest of the line. - $eol = strpos($string, $eolChar, $start); - if ($eol === false) { - $eol = $end; - } - - if ($eol > $start) { - $tokens[] = [ - 'content' => substr($string, $start, ($eol - $start)), - 'code' => T_DOC_COMMENT_STRING, - 'type' => 'T_DOC_COMMENT_STRING', - ]; - } - - if ($eol !== $end) { - $tokens[] = [ - 'content' => substr($string, $eol, strlen($eolChar)), - 'code' => T_DOC_COMMENT_WHITESPACE, - 'type' => 'T_DOC_COMMENT_WHITESPACE', - ]; - } - - return $tokens; - - }//end processLine() - - - /** - * Collect consecutive whitespace into a single token. - * - * @param string $string The comment string being tokenized. - * @param int $start The position in the string to start processing. - * @param int $end The position in the string to end processing. - * - * @return array|null - */ - private function collectWhitespace($string, $start, $end) - { - $space = ''; - for ($start; $start < $end; $start++) { - if ($string[$start] !== ' ' && $string[$start] !== "\t") { - break; - } - - $space .= $string[$start]; - } - - if ($space === '') { - return null; - } - - $token = [ - 'content' => $space, - 'code' => T_DOC_COMMENT_WHITESPACE, - 'type' => 'T_DOC_COMMENT_WHITESPACE', - ]; - - return $token; - - }//end collectWhitespace() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Tokenizers/JS.php b/vendor/squizlabs/php_codesniffer/src/Tokenizers/JS.php deleted file mode 100644 index ee2f842..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Tokenizers/JS.php +++ /dev/null @@ -1,1256 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tokenizers; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\TokenizerException; -use PHP_CodeSniffer\Util; - -class JS extends Tokenizer -{ - - /** - * A list of tokens that are allowed to open a scope. - * - * This array also contains information about what kind of token the scope - * opener uses to open and close the scope, if the token strictly requires - * an opener, if the token can share a scope closer, and who it can be shared - * with. An example of a token that shares a scope closer is a CASE scope. - * - * @var array - */ - public $scopeOpeners = [ - T_IF => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_TRY => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_CATCH => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_ELSE => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_FOR => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_CLASS => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_FUNCTION => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_WHILE => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_DO => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_SWITCH => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_CASE => [ - 'start' => [T_COLON => T_COLON], - 'end' => [ - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - T_CONTINUE => T_CONTINUE, - T_THROW => T_THROW, - ], - 'strict' => true, - 'shared' => true, - 'with' => [ - T_DEFAULT => T_DEFAULT, - T_CASE => T_CASE, - T_SWITCH => T_SWITCH, - ], - ], - T_DEFAULT => [ - 'start' => [T_COLON => T_COLON], - 'end' => [ - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - T_CONTINUE => T_CONTINUE, - T_THROW => T_THROW, - ], - 'strict' => true, - 'shared' => true, - 'with' => [ - T_CASE => T_CASE, - T_SWITCH => T_SWITCH, - ], - ], - ]; - - /** - * A list of tokens that end the scope. - * - * This array is just a unique collection of the end tokens - * from the _scopeOpeners array. The data is duplicated here to - * save time during parsing of the file. - * - * @var array - */ - public $endScopeTokens = [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_BREAK => T_BREAK, - ]; - - /** - * A list of special JS tokens and their types. - * - * @var array - */ - protected $tokenValues = [ - 'class' => 'T_CLASS', - 'function' => 'T_FUNCTION', - 'prototype' => 'T_PROTOTYPE', - 'try' => 'T_TRY', - 'catch' => 'T_CATCH', - 'return' => 'T_RETURN', - 'throw' => 'T_THROW', - 'break' => 'T_BREAK', - 'switch' => 'T_SWITCH', - 'continue' => 'T_CONTINUE', - 'if' => 'T_IF', - 'else' => 'T_ELSE', - 'do' => 'T_DO', - 'while' => 'T_WHILE', - 'for' => 'T_FOR', - 'var' => 'T_VAR', - 'case' => 'T_CASE', - 'default' => 'T_DEFAULT', - 'true' => 'T_TRUE', - 'false' => 'T_FALSE', - 'null' => 'T_NULL', - 'this' => 'T_THIS', - 'typeof' => 'T_TYPEOF', - '(' => 'T_OPEN_PARENTHESIS', - ')' => 'T_CLOSE_PARENTHESIS', - '{' => 'T_OPEN_CURLY_BRACKET', - '}' => 'T_CLOSE_CURLY_BRACKET', - '[' => 'T_OPEN_SQUARE_BRACKET', - ']' => 'T_CLOSE_SQUARE_BRACKET', - '?' => 'T_INLINE_THEN', - '.' => 'T_OBJECT_OPERATOR', - '+' => 'T_PLUS', - '-' => 'T_MINUS', - '*' => 'T_MULTIPLY', - '%' => 'T_MODULUS', - '/' => 'T_DIVIDE', - '^' => 'T_LOGICAL_XOR', - ',' => 'T_COMMA', - ';' => 'T_SEMICOLON', - ':' => 'T_COLON', - '<' => 'T_LESS_THAN', - '>' => 'T_GREATER_THAN', - '<<' => 'T_SL', - '>>' => 'T_SR', - '>>>' => 'T_ZSR', - '<<=' => 'T_SL_EQUAL', - '>>=' => 'T_SR_EQUAL', - '>>>=' => 'T_ZSR_EQUAL', - '<=' => 'T_IS_SMALLER_OR_EQUAL', - '>=' => 'T_IS_GREATER_OR_EQUAL', - '=>' => 'T_DOUBLE_ARROW', - '!' => 'T_BOOLEAN_NOT', - '||' => 'T_BOOLEAN_OR', - '&&' => 'T_BOOLEAN_AND', - '|' => 'T_BITWISE_OR', - '&' => 'T_BITWISE_AND', - '!=' => 'T_IS_NOT_EQUAL', - '!==' => 'T_IS_NOT_IDENTICAL', - '=' => 'T_EQUAL', - '==' => 'T_IS_EQUAL', - '===' => 'T_IS_IDENTICAL', - '-=' => 'T_MINUS_EQUAL', - '+=' => 'T_PLUS_EQUAL', - '*=' => 'T_MUL_EQUAL', - '/=' => 'T_DIV_EQUAL', - '%=' => 'T_MOD_EQUAL', - '++' => 'T_INC', - '--' => 'T_DEC', - '//' => 'T_COMMENT', - '/*' => 'T_COMMENT', - '/**' => 'T_DOC_COMMENT', - '*/' => 'T_COMMENT', - ]; - - /** - * A list string delimiters. - * - * @var array - */ - protected $stringTokens = [ - '\'' => '\'', - '"' => '"', - ]; - - /** - * A list tokens that start and end comments. - * - * @var array - */ - protected $commentTokens = [ - '//' => null, - '/*' => '*/', - '/**' => '*/', - ]; - - - /** - * Initialise the tokenizer. - * - * Pre-checks the content to see if it looks minified. - * - * @param string $content The content to tokenize, - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * @param string $eolChar The EOL char used in the content. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the file appears to be minified. - */ - public function __construct($content, Config $config, $eolChar='\n') - { - if ($this->isMinifiedContent($content, $eolChar) === true) { - throw new TokenizerException('File appears to be minified and cannot be processed'); - } - - parent::__construct($content, $config, $eolChar); - - }//end __construct() - - - /** - * Creates an array of tokens when given some JS code. - * - * @param string $string The string to tokenize. - * - * @return array - */ - public function tokenize($string) - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START JS TOKENIZING ***".PHP_EOL; - } - - $maxTokenLength = 0; - foreach ($this->tokenValues as $token => $values) { - if (strlen($token) > $maxTokenLength) { - $maxTokenLength = strlen($token); - } - } - - $tokens = []; - $inString = ''; - $stringChar = null; - $inComment = ''; - $buffer = ''; - $preStringBuffer = ''; - $cleanBuffer = false; - - $commentTokenizer = new Comment(); - - $tokens[] = [ - 'code' => T_OPEN_TAG, - 'type' => 'T_OPEN_TAG', - 'content' => '', - ]; - - // Convert newlines to single characters for ease of - // processing. We will change them back later. - $string = str_replace($this->eolChar, "\n", $string); - - $chars = str_split($string); - $numChars = count($chars); - for ($i = 0; $i < $numChars; $i++) { - $char = $chars[$i]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($char); - $bufferContent = Util\Common::prepareForOutput($buffer); - - if ($inString !== '') { - echo "\t"; - } - - if ($inComment !== '') { - echo "\t"; - } - - echo "\tProcess char $i => $content (buffer: $bufferContent)".PHP_EOL; - }//end if - - if ($inString === '' && $inComment === '' && $buffer !== '') { - // If the buffer only has whitespace and we are about to - // add a character, store the whitespace first. - if (trim($char) !== '' && trim($buffer) === '') { - $tokens[] = [ - 'code' => T_WHITESPACE, - 'type' => 'T_WHITESPACE', - 'content' => str_replace("\n", $this->eolChar, $buffer), - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token T_WHITESPACE ($content)".PHP_EOL; - } - - $buffer = ''; - } - - // If the buffer is not whitespace and we are about to - // add a whitespace character, store the content first. - if ($inString === '' - && $inComment === '' - && trim($char) === '' - && trim($buffer) !== '' - ) { - $tokens[] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => str_replace("\n", $this->eolChar, $buffer), - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token T_STRING ($content)".PHP_EOL; - } - - $buffer = ''; - } - }//end if - - // Process strings. - if ($inComment === '' && isset($this->stringTokens[$char]) === true) { - if ($inString === $char) { - // This could be the end of the string, but make sure it - // is not escaped first. - $escapes = 0; - for ($x = ($i - 1); $x >= 0; $x--) { - if ($chars[$x] !== '\\') { - break; - } - - $escapes++; - } - - if ($escapes === 0 || ($escapes % 2) === 0) { - // There is an even number escape chars, - // so this is not escaped, it is the end of the string. - $tokens[] = [ - 'code' => T_CONSTANT_ENCAPSED_STRING, - 'type' => 'T_CONSTANT_ENCAPSED_STRING', - 'content' => str_replace("\n", $this->eolChar, $buffer).$char, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* found end of string *".PHP_EOL; - $content = Util\Common::prepareForOutput($buffer.$char); - echo "\t=> Added token T_CONSTANT_ENCAPSED_STRING ($content)".PHP_EOL; - } - - $buffer = ''; - $preStringBuffer = ''; - $inString = ''; - $stringChar = null; - continue; - }//end if - } else if ($inString === '') { - $inString = $char; - $stringChar = $i; - $preStringBuffer = $buffer; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* looking for string closer *".PHP_EOL; - } - }//end if - }//end if - - if ($inString !== '' && $char === "\n") { - // Unless this newline character is escaped, the string did not - // end before the end of the line, which means it probably - // wasn't a string at all (maybe a regex). - if ($chars[($i - 1)] !== '\\') { - $i = $stringChar; - $buffer = $preStringBuffer; - $preStringBuffer = ''; - $inString = ''; - $stringChar = null; - $char = $chars[$i]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* found newline before end of string, bailing *".PHP_EOL; - } - } - } - - $buffer .= $char; - - // We don't look for special tokens inside strings, - // so if we are in a string, we can continue here now - // that the current char is in the buffer. - if ($inString !== '') { - continue; - } - - // Special case for T_DIVIDE which can actually be - // the start of a regular expression. - if ($buffer === $char && $char === '/' && $chars[($i + 1)] !== '*') { - $regex = $this->getRegexToken($i, $string, $chars, $tokens); - if ($regex !== null) { - $tokens[] = [ - 'code' => T_REGULAR_EXPRESSION, - 'type' => 'T_REGULAR_EXPRESSION', - 'content' => $regex['content'], - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($regex['content']); - echo "\t=> Added token T_REGULAR_EXPRESSION ($content)".PHP_EOL; - } - - $i = $regex['end']; - $buffer = ''; - $cleanBuffer = false; - continue; - }//end if - }//end if - - // Check for known tokens, but ignore tokens found that are not at - // the end of a string, like FOR and this.FORmat. - if (isset($this->tokenValues[strtolower($buffer)]) === true - && (preg_match('|[a-zA-z0-9_]|', $char) === 0 - || isset($chars[($i + 1)]) === false - || preg_match('|[a-zA-z0-9_]|', $chars[($i + 1)]) === 0) - ) { - $matchedToken = false; - $lookAheadLength = ($maxTokenLength - strlen($buffer)); - - if ($lookAheadLength > 0) { - // The buffer contains a token type, but we need - // to look ahead at the next chars to see if this is - // actually part of a larger token. For example, - // FOR and FOREACH. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* buffer possibly contains token, looking ahead $lookAheadLength chars *".PHP_EOL; - } - - $charBuffer = $buffer; - for ($x = 1; $x <= $lookAheadLength; $x++) { - if (isset($chars[($i + $x)]) === false) { - break; - } - - $charBuffer .= $chars[($i + $x)]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($charBuffer); - echo "\t\t=> Looking ahead $x chars => $content".PHP_EOL; - } - - if (isset($this->tokenValues[strtolower($charBuffer)]) === true) { - // We've found something larger that matches - // so we can ignore this char. Except for 1 very specific - // case where a comment like /**/ needs to tokenize as - // T_COMMENT and not T_DOC_COMMENT. - $oldType = $this->tokenValues[strtolower($buffer)]; - $newType = $this->tokenValues[strtolower($charBuffer)]; - if ($oldType === 'T_COMMENT' - && $newType === 'T_DOC_COMMENT' - && $chars[($i + $x + 1)] === '/' - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* look ahead ignored T_DOC_COMMENT, continuing *".PHP_EOL; - } - } else { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* look ahead found more specific token ($newType), ignoring $i *".PHP_EOL; - } - - $matchedToken = true; - break; - } - }//end if - }//end for - }//end if - - if ($matchedToken === false) { - if (PHP_CODESNIFFER_VERBOSITY > 1 && $lookAheadLength > 0) { - echo "\t\t* look ahead found nothing *".PHP_EOL; - } - - $value = $this->tokenValues[strtolower($buffer)]; - - if ($value === 'T_FUNCTION' && $buffer !== 'function') { - // The function keyword needs to be all lowercase or else - // it is just a function called "Function". - $value = 'T_STRING'; - } - - $tokens[] = [ - 'code' => constant($value), - 'type' => $value, - 'content' => $buffer, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token $value ($content)".PHP_EOL; - } - - $cleanBuffer = true; - }//end if - } else if (isset($this->tokenValues[strtolower($char)]) === true) { - // No matter what token we end up using, we don't - // need the content in the buffer any more because we have - // found a valid token. - $newContent = substr(str_replace("\n", $this->eolChar, $buffer), 0, -1); - if ($newContent !== '') { - $tokens[] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => $newContent, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput(substr($buffer, 0, -1)); - echo "\t=> Added token T_STRING ($content)".PHP_EOL; - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* char is token, looking ahead ".($maxTokenLength - 1).' chars *'.PHP_EOL; - } - - // The char is a token type, but we need to look ahead at the - // next chars to see if this is actually part of a larger token. - // For example, = and ===. - $charBuffer = $char; - $matchedToken = false; - for ($x = 1; $x <= $maxTokenLength; $x++) { - if (isset($chars[($i + $x)]) === false) { - break; - } - - $charBuffer .= $chars[($i + $x)]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($charBuffer); - echo "\t\t=> Looking ahead $x chars => $content".PHP_EOL; - } - - if (isset($this->tokenValues[strtolower($charBuffer)]) === true) { - // We've found something larger that matches - // so we can ignore this char. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokenValues[strtolower($charBuffer)]; - echo "\t\t* look ahead found more specific token ($type), ignoring $i *".PHP_EOL; - } - - $matchedToken = true; - break; - } - }//end for - - if ($matchedToken === false) { - $value = $this->tokenValues[strtolower($char)]; - $tokens[] = [ - 'code' => constant($value), - 'type' => $value, - 'content' => $char, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* look ahead found nothing *".PHP_EOL; - $content = Util\Common::prepareForOutput($char); - echo "\t=> Added token $value ($content)".PHP_EOL; - } - - $cleanBuffer = true; - } else { - $buffer = $char; - }//end if - }//end if - - // Keep track of content inside comments. - if ($inComment === '' - && array_key_exists($buffer, $this->commentTokens) === true - ) { - // This is not really a comment if the content - // looks like \// (i.e., it is escaped). - if (isset($chars[($i - 2)]) === true && $chars[($i - 2)] === '\\') { - $lastToken = array_pop($tokens); - $lastContent = $lastToken['content']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $value = $this->tokenValues[strtolower($lastContent)]; - $content = Util\Common::prepareForOutput($lastContent); - echo "\t=> Removed token $value ($content)".PHP_EOL; - } - - $lastChars = str_split($lastContent); - $lastNumChars = count($lastChars); - for ($x = 0; $x < $lastNumChars; $x++) { - $lastChar = $lastChars[$x]; - $value = $this->tokenValues[strtolower($lastChar)]; - $tokens[] = [ - 'code' => constant($value), - 'type' => $value, - 'content' => $lastChar, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($lastChar); - echo "\t=> Added token $value ($content)".PHP_EOL; - } - } - } else { - // We have started a comment. - $inComment = $buffer; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* looking for end of comment *".PHP_EOL; - } - }//end if - } else if ($inComment !== '') { - if ($this->commentTokens[$inComment] === null) { - // Comment ends at the next newline. - if (strpos($buffer, "\n") !== false) { - $inComment = ''; - } - } else { - if ($this->commentTokens[$inComment] === $buffer) { - $inComment = ''; - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if ($inComment === '') { - echo "\t\t* found end of comment *".PHP_EOL; - } - } - - if ($inComment === '' && $cleanBuffer === false) { - $tokens[] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => str_replace("\n", $this->eolChar, $buffer), - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token T_STRING ($content)".PHP_EOL; - } - - $buffer = ''; - } - }//end if - - if ($cleanBuffer === true) { - $buffer = ''; - $cleanBuffer = false; - } - }//end for - - if (empty($buffer) === false) { - if ($inString !== '') { - // The string did not end before the end of the file, - // which means there was probably a syntax error somewhere. - $tokens[] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => str_replace("\n", $this->eolChar, $buffer), - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token T_STRING ($content)".PHP_EOL; - } - } else { - // Buffer contains whitespace from the end of the file. - $tokens[] = [ - 'code' => T_WHITESPACE, - 'type' => 'T_WHITESPACE', - 'content' => str_replace("\n", $this->eolChar, $buffer), - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token T_WHITESPACE ($content)".PHP_EOL; - } - }//end if - }//end if - - $tokens[] = [ - 'code' => T_CLOSE_TAG, - 'type' => 'T_CLOSE_TAG', - 'content' => '', - ]; - - /* - Now that we have done some basic tokenizing, we need to - modify the tokens to join some together and split some apart - so they match what the PHP tokenizer does. - */ - - $finalTokens = []; - $newStackPtr = 0; - $numTokens = count($tokens); - for ($stackPtr = 0; $stackPtr < $numTokens; $stackPtr++) { - $token = $tokens[$stackPtr]; - - /* - Look for comments and join the tokens together. - */ - - if ($token['code'] === T_COMMENT || $token['code'] === T_DOC_COMMENT) { - $newContent = ''; - $tokenContent = $token['content']; - - $endContent = null; - if (isset($this->commentTokens[$tokenContent]) === true) { - $endContent = $this->commentTokens[$tokenContent]; - } - - while ($tokenContent !== $endContent) { - if ($endContent === null - && strpos($tokenContent, $this->eolChar) !== false - ) { - // A null end token means the comment ends at the end of - // the line so we look for newlines and split the token. - $tokens[$stackPtr]['content'] = substr( - $tokenContent, - (strpos($tokenContent, $this->eolChar) + strlen($this->eolChar)) - ); - - $tokenContent = substr( - $tokenContent, - 0, - (strpos($tokenContent, $this->eolChar) + strlen($this->eolChar)) - ); - - // If the substr failed, skip the token as the content - // will now be blank. - if ($tokens[$stackPtr]['content'] !== false - && $tokens[$stackPtr]['content'] !== '' - ) { - $stackPtr--; - } - - break; - }//end if - - $stackPtr++; - $newContent .= $tokenContent; - if (isset($tokens[$stackPtr]) === false) { - break; - } - - $tokenContent = $tokens[$stackPtr]['content']; - }//end while - - if ($token['code'] === T_DOC_COMMENT) { - $commentTokens = $commentTokenizer->tokenizeString($newContent.$tokenContent, $this->eolChar, $newStackPtr); - foreach ($commentTokens as $commentToken) { - $finalTokens[$newStackPtr] = $commentToken; - $newStackPtr++; - } - - continue; - } else { - // Save the new content in the current token so - // the code below can chop it up on newlines. - $token['content'] = $newContent.$tokenContent; - } - }//end if - - /* - If this token has newlines in its content, split each line up - and create a new token for each line. We do this so it's easier - to ascertain where errors occur on a line. - Note that $token[1] is the token's content. - */ - - if (strpos($token['content'], $this->eolChar) !== false) { - $tokenLines = explode($this->eolChar, $token['content']); - $numLines = count($tokenLines); - - for ($i = 0; $i < $numLines; $i++) { - $newToken = ['content' => $tokenLines[$i]]; - if ($i === ($numLines - 1)) { - if ($tokenLines[$i] === '') { - break; - } - } else { - $newToken['content'] .= $this->eolChar; - } - - $newToken['type'] = $token['type']; - $newToken['code'] = $token['code']; - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - } - } else { - $finalTokens[$newStackPtr] = $token; - $newStackPtr++; - }//end if - - // Convert numbers, including decimals. - if ($token['code'] === T_STRING - || $token['code'] === T_OBJECT_OPERATOR - ) { - $newContent = ''; - $oldStackPtr = $stackPtr; - while (preg_match('|^[0-9\.]+$|', $tokens[$stackPtr]['content']) !== 0) { - $newContent .= $tokens[$stackPtr]['content']; - $stackPtr++; - } - - if ($newContent !== '' && $newContent !== '.') { - $finalTokens[($newStackPtr - 1)]['content'] = $newContent; - if (ctype_digit($newContent) === true) { - $finalTokens[($newStackPtr - 1)]['code'] = constant('T_LNUMBER'); - $finalTokens[($newStackPtr - 1)]['type'] = 'T_LNUMBER'; - } else { - $finalTokens[($newStackPtr - 1)]['code'] = constant('T_DNUMBER'); - $finalTokens[($newStackPtr - 1)]['type'] = 'T_DNUMBER'; - } - - $stackPtr--; - continue; - } else { - $stackPtr = $oldStackPtr; - } - }//end if - - // Convert the token after an object operator into a string, in most cases. - if ($token['code'] === T_OBJECT_OPERATOR) { - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (isset(Util\Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - if ($tokens[$i]['code'] !== T_PROTOTYPE - && $tokens[$i]['code'] !== T_LNUMBER - && $tokens[$i]['code'] !== T_DNUMBER - ) { - $tokens[$i]['code'] = T_STRING; - $tokens[$i]['type'] = 'T_STRING'; - } - - break; - } - } - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END TOKENIZING ***".PHP_EOL; - } - - return $finalTokens; - - }//end tokenize() - - - /** - * Tokenizes a regular expression if one is found. - * - * If a regular expression is not found, NULL is returned. - * - * @param string $char The index of the possible regex start character. - * @param string $string The complete content of the string being tokenized. - * @param string $chars An array of characters being tokenized. - * @param string $tokens The current array of tokens found in the string. - * - * @return array|null - */ - public function getRegexToken($char, $string, $chars, $tokens) - { - $beforeTokens = [ - T_EQUAL => true, - T_IS_NOT_EQUAL => true, - T_IS_IDENTICAL => true, - T_IS_NOT_IDENTICAL => true, - T_OPEN_PARENTHESIS => true, - T_OPEN_SQUARE_BRACKET => true, - T_RETURN => true, - T_BOOLEAN_OR => true, - T_BOOLEAN_AND => true, - T_BOOLEAN_NOT => true, - T_BITWISE_OR => true, - T_BITWISE_AND => true, - T_COMMA => true, - T_COLON => true, - T_TYPEOF => true, - T_INLINE_THEN => true, - T_INLINE_ELSE => true, - ]; - - $afterTokens = [ - ',' => true, - ')' => true, - ']' => true, - ';' => true, - ' ' => true, - '.' => true, - ':' => true, - $this->eolChar => true, - ]; - - // Find the last non-whitespace token that was added - // to the tokens array. - $numTokens = count($tokens); - for ($prev = ($numTokens - 1); $prev >= 0; $prev--) { - if (isset(Util\Tokens::$emptyTokens[$tokens[$prev]['code']]) === false) { - break; - } - } - - if (isset($beforeTokens[$tokens[$prev]['code']]) === false) { - return null; - } - - // This is probably a regular expression, so look for the end of it. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* token possibly starts a regular expression *".PHP_EOL; - } - - $numChars = count($chars); - for ($next = ($char + 1); $next < $numChars; $next++) { - if ($chars[$next] === '/') { - // Just make sure this is not escaped first. - if ($chars[($next - 1)] !== '\\') { - // In the simple form: /.../ so we found the end. - break; - } else if ($chars[($next - 2)] === '\\') { - // In the form: /...\\/ so we found the end. - break; - } - } else { - $possibleEolChar = substr($string, $next, strlen($this->eolChar)); - if ($possibleEolChar === $this->eolChar) { - // This is the last token on the line and regular - // expressions need to be defined on a single line, - // so this is not a regular expression. - break; - } - } - } - - if ($chars[$next] !== '/') { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* could not find end of regular expression *".PHP_EOL; - } - - return null; - } - - while (preg_match('|[a-zA-Z]|', $chars[($next + 1)]) !== 0) { - // The token directly after the end of the regex can - // be modifiers like global and case insensitive - // (.e.g, /pattern/gi). - $next++; - } - - $regexEnd = $next; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* found end of regular expression at token $regexEnd *".PHP_EOL; - } - - for ($next += 1; $next < $numChars; $next++) { - if ($chars[$next] !== ' ') { - break; - } else { - $possibleEolChar = substr($string, $next, strlen($this->eolChar)); - if ($possibleEolChar === $this->eolChar) { - // This is the last token on the line. - break; - } - } - } - - if (isset($afterTokens[$chars[$next]]) === false) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* tokens after regular expression do not look correct *".PHP_EOL; - } - - return null; - } - - // This is a regular expression, so join all the tokens together. - $content = ''; - for ($x = $char; $x <= $regexEnd; $x++) { - $content .= $chars[$x]; - } - - $token = [ - 'start' => $char, - 'end' => $regexEnd, - 'content' => $content, - ]; - - return $token; - - }//end getRegexToken() - - - /** - * Performs additional processing after main tokenizing. - * - * This additional processing looks for properties, closures, labels and objects. - * - * @return void - */ - public function processAdditional() - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START ADDITIONAL JS PROCESSING ***".PHP_EOL; - } - - $numTokens = count($this->tokens); - $classStack = []; - - for ($i = 0; $i < $numTokens; $i++) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$i]['type']; - $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); - - echo str_repeat("\t", count($classStack)); - echo "\tProcess token $i: $type => $content".PHP_EOL; - } - - // Looking for functions that are actually closures. - if ($this->tokens[$i]['code'] === T_FUNCTION && isset($this->tokens[$i]['scope_opener']) === true) { - for ($x = ($i + 1); $x < $numTokens; $x++) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - break; - } - } - - if ($this->tokens[$x]['code'] === T_OPEN_PARENTHESIS) { - $this->tokens[$i]['code'] = T_CLOSURE; - $this->tokens[$i]['type'] = 'T_CLOSURE'; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo str_repeat("\t", count($classStack)); - echo "\t* token $i on line $line changed from T_FUNCTION to T_CLOSURE *".PHP_EOL; - } - - for ($x = ($this->tokens[$i]['scope_opener'] + 1); $x < $this->tokens[$i]['scope_closer']; $x++) { - if (isset($this->tokens[$x]['conditions'][$i]) === false) { - continue; - } - - $this->tokens[$x]['conditions'][$i] = T_CLOSURE; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - echo str_repeat("\t", count($classStack)); - echo "\t\t* cleaned $x ($type) *".PHP_EOL; - } - } - }//end if - - continue; - } else if ($this->tokens[$i]['code'] === T_OPEN_CURLY_BRACKET - && isset($this->tokens[$i]['scope_condition']) === false - && isset($this->tokens[$i]['bracket_closer']) === true - ) { - $condition = $this->tokens[$i]['conditions']; - $condition = end($condition); - if ($condition === T_CLASS) { - // Possibly an ES6 method. To be classified as one, the previous - // non-empty tokens need to be a set of parenthesis, and then a string - // (the method name). - for ($parenCloser = ($i - 1); $parenCloser > 0; $parenCloser--) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$parenCloser]['code']]) === false) { - break; - } - } - - if ($this->tokens[$parenCloser]['code'] === T_CLOSE_PARENTHESIS) { - $parenOpener = $this->tokens[$parenCloser]['parenthesis_opener']; - for ($name = ($parenOpener - 1); $name > 0; $name--) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$name]['code']]) === false) { - break; - } - } - - if ($this->tokens[$name]['code'] === T_STRING) { - // We found a method name. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$name]['line']; - echo str_repeat("\t", count($classStack)); - echo "\t* token $name on line $line changed from T_STRING to T_FUNCTION *".PHP_EOL; - } - - $closer = $this->tokens[$i]['bracket_closer']; - - $this->tokens[$name]['code'] = T_FUNCTION; - $this->tokens[$name]['type'] = 'T_FUNCTION'; - - foreach ([$name, $i, $closer] as $token) { - $this->tokens[$token]['scope_condition'] = $name; - $this->tokens[$token]['scope_opener'] = $i; - $this->tokens[$token]['scope_closer'] = $closer; - $this->tokens[$token]['parenthesis_opener'] = $parenOpener; - $this->tokens[$token]['parenthesis_closer'] = $parenCloser; - $this->tokens[$token]['parenthesis_owner'] = $name; - } - - $this->tokens[$parenOpener]['parenthesis_owner'] = $name; - $this->tokens[$parenCloser]['parenthesis_owner'] = $name; - - for ($x = ($i + 1); $x < $closer; $x++) { - $this->tokens[$x]['conditions'][$name] = T_FUNCTION; - ksort($this->tokens[$x]['conditions'], SORT_NUMERIC); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - echo str_repeat("\t", count($classStack)); - echo "\t\t* added T_FUNCTION condition to $x ($type) *".PHP_EOL; - } - } - - continue; - }//end if - }//end if - }//end if - - $classStack[] = $i; - - $closer = $this->tokens[$i]['bracket_closer']; - $this->tokens[$i]['code'] = T_OBJECT; - $this->tokens[$i]['type'] = 'T_OBJECT'; - $this->tokens[$closer]['code'] = T_CLOSE_OBJECT; - $this->tokens[$closer]['type'] = 'T_CLOSE_OBJECT'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($classStack)); - echo "\t* token $i converted from T_OPEN_CURLY_BRACKET to T_OBJECT *".PHP_EOL; - echo str_repeat("\t", count($classStack)); - echo "\t* token $closer converted from T_CLOSE_CURLY_BRACKET to T_CLOSE_OBJECT *".PHP_EOL; - } - - for ($x = ($i + 1); $x < $closer; $x++) { - $this->tokens[$x]['conditions'][$i] = T_OBJECT; - ksort($this->tokens[$x]['conditions'], SORT_NUMERIC); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - echo str_repeat("\t", count($classStack)); - echo "\t\t* added T_OBJECT condition to $x ($type) *".PHP_EOL; - } - } - } else if ($this->tokens[$i]['code'] === T_CLOSE_OBJECT) { - $opener = array_pop($classStack); - } else if ($this->tokens[$i]['code'] === T_COLON) { - // If it is a scope opener, it belongs to a - // DEFAULT or CASE statement. - if (isset($this->tokens[$i]['scope_condition']) === true) { - continue; - } - - // Make sure this is not part of an inline IF statement. - for ($x = ($i - 1); $x >= 0; $x--) { - if ($this->tokens[$x]['code'] === T_INLINE_THEN) { - $this->tokens[$i]['code'] = T_INLINE_ELSE; - $this->tokens[$i]['type'] = 'T_INLINE_ELSE'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($classStack)); - echo "\t* token $i converted from T_COLON to T_INLINE_THEN *".PHP_EOL; - } - - continue(2); - } else if ($this->tokens[$x]['line'] < $this->tokens[$i]['line']) { - break; - } - } - - // The string to the left of the colon is either a property or label. - for ($label = ($i - 1); $label >= 0; $label--) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$label]['code']]) === false) { - break; - } - } - - if ($this->tokens[$label]['code'] !== T_STRING - && $this->tokens[$label]['code'] !== T_CONSTANT_ENCAPSED_STRING - ) { - continue; - } - - if (empty($classStack) === false) { - $this->tokens[$label]['code'] = T_PROPERTY; - $this->tokens[$label]['type'] = 'T_PROPERTY'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($classStack)); - echo "\t* token $label converted from T_STRING to T_PROPERTY *".PHP_EOL; - } - } else { - $this->tokens[$label]['code'] = T_LABEL; - $this->tokens[$label]['type'] = 'T_LABEL'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($classStack)); - echo "\t* token $label converted from T_STRING to T_LABEL *".PHP_EOL; - } - }//end if - }//end if - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END ADDITIONAL JS PROCESSING ***".PHP_EOL; - } - - }//end processAdditional() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Tokenizers/PHP.php b/vendor/squizlabs/php_codesniffer/src/Tokenizers/PHP.php deleted file mode 100644 index 993d937..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Tokenizers/PHP.php +++ /dev/null @@ -1,2409 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tokenizers; - -use PHP_CodeSniffer\Util; - -class PHP extends Tokenizer -{ - - /** - * A list of tokens that are allowed to open a scope. - * - * This array also contains information about what kind of token the scope - * opener uses to open and close the scope, if the token strictly requires - * an opener, if the token can share a scope closer, and who it can be shared - * with. An example of a token that shares a scope closer is a CASE scope. - * - * @var array - */ - public $scopeOpeners = [ - T_IF => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDIF => T_ENDIF, - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - ], - 'strict' => false, - 'shared' => false, - 'with' => [ - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - ], - ], - T_TRY => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_CATCH => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_FINALLY => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_ELSE => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDIF => T_ENDIF, - ], - 'strict' => false, - 'shared' => false, - 'with' => [ - T_IF => T_IF, - T_ELSEIF => T_ELSEIF, - ], - ], - T_ELSEIF => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDIF => T_ENDIF, - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - ], - 'strict' => false, - 'shared' => false, - 'with' => [ - T_IF => T_IF, - T_ELSE => T_ELSE, - ], - ], - T_FOR => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDFOR => T_ENDFOR, - ], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_FOREACH => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDFOREACH => T_ENDFOREACH, - ], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_INTERFACE => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_FUNCTION => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_CLASS => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_TRAIT => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_USE => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_DECLARE => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDDECLARE => T_ENDDECLARE, - ], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_NAMESPACE => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_WHILE => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDWHILE => T_ENDWHILE, - ], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_DO => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_SWITCH => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDSWITCH => T_ENDSWITCH, - ], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_CASE => [ - 'start' => [ - T_COLON => T_COLON, - T_SEMICOLON => T_SEMICOLON, - ], - 'end' => [ - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - T_CONTINUE => T_CONTINUE, - T_THROW => T_THROW, - T_EXIT => T_EXIT, - ], - 'strict' => true, - 'shared' => true, - 'with' => [ - T_DEFAULT => T_DEFAULT, - T_CASE => T_CASE, - T_SWITCH => T_SWITCH, - ], - ], - T_DEFAULT => [ - 'start' => [ - T_COLON => T_COLON, - T_SEMICOLON => T_SEMICOLON, - ], - 'end' => [ - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - T_CONTINUE => T_CONTINUE, - T_THROW => T_THROW, - T_EXIT => T_EXIT, - ], - 'strict' => true, - 'shared' => true, - 'with' => [ - T_CASE => T_CASE, - T_SWITCH => T_SWITCH, - ], - ], - T_START_HEREDOC => [ - 'start' => [T_START_HEREDOC => T_START_HEREDOC], - 'end' => [T_END_HEREDOC => T_END_HEREDOC], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_START_NOWDOC => [ - 'start' => [T_START_NOWDOC => T_START_NOWDOC], - 'end' => [T_END_NOWDOC => T_END_NOWDOC], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - ]; - - /** - * A list of tokens that end the scope. - * - * This array is just a unique collection of the end tokens - * from the scopeOpeners array. The data is duplicated here to - * save time during parsing of the file. - * - * @var array - */ - public $endScopeTokens = [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDIF => T_ENDIF, - T_ENDFOR => T_ENDFOR, - T_ENDFOREACH => T_ENDFOREACH, - T_ENDWHILE => T_ENDWHILE, - T_ENDSWITCH => T_ENDSWITCH, - T_BREAK => T_BREAK, - T_END_HEREDOC => T_END_HEREDOC, - ]; - - /** - * Known lengths of tokens. - * - * @var array - */ - public $knownLengths = [ - T_ABSTRACT => 8, - T_AND_EQUAL => 2, - T_ARRAY => 5, - T_AS => 2, - T_BOOLEAN_AND => 2, - T_BOOLEAN_OR => 2, - T_BREAK => 5, - T_CALLABLE => 8, - T_CASE => 4, - T_CATCH => 5, - T_CLASS => 5, - T_CLASS_C => 9, - T_CLONE => 5, - T_CONCAT_EQUAL => 2, - T_CONST => 5, - T_CONTINUE => 8, - T_CURLY_OPEN => 2, - T_DEC => 2, - T_DECLARE => 7, - T_DEFAULT => 7, - T_DIR => 7, - T_DIV_EQUAL => 2, - T_DO => 2, - T_DOLLAR_OPEN_CURLY_BRACES => 2, - T_DOUBLE_ARROW => 2, - T_DOUBLE_COLON => 2, - T_ECHO => 4, - T_ELSE => 4, - T_ELSEIF => 6, - T_EMPTY => 5, - T_ENDDECLARE => 10, - T_ENDFOR => 6, - T_ENDFOREACH => 10, - T_ENDIF => 5, - T_ENDSWITCH => 9, - T_ENDWHILE => 8, - T_EVAL => 4, - T_EXTENDS => 7, - T_FILE => 8, - T_FINAL => 5, - T_FINALLY => 7, - T_FOR => 3, - T_FOREACH => 7, - T_FUNCTION => 8, - T_FUNC_C => 12, - T_GLOBAL => 6, - T_GOTO => 4, - T_HALT_COMPILER => 15, - T_IF => 2, - T_IMPLEMENTS => 10, - T_INC => 2, - T_INCLUDE => 7, - T_INCLUDE_ONCE => 12, - T_INSTANCEOF => 10, - T_INSTEADOF => 9, - T_INTERFACE => 9, - T_ISSET => 5, - T_IS_EQUAL => 2, - T_IS_GREATER_OR_EQUAL => 2, - T_IS_IDENTICAL => 3, - T_IS_NOT_EQUAL => 2, - T_IS_NOT_IDENTICAL => 3, - T_IS_SMALLER_OR_EQUAL => 2, - T_LINE => 8, - T_LIST => 4, - T_LOGICAL_AND => 3, - T_LOGICAL_OR => 2, - T_LOGICAL_XOR => 3, - T_METHOD_C => 10, - T_MINUS_EQUAL => 2, - T_POW_EQUAL => 3, - T_MOD_EQUAL => 2, - T_MUL_EQUAL => 2, - T_NAMESPACE => 9, - T_NS_C => 13, - T_NS_SEPARATOR => 1, - T_NEW => 3, - T_OBJECT_OPERATOR => 2, - T_OPEN_TAG_WITH_ECHO => 3, - T_OR_EQUAL => 2, - T_PLUS_EQUAL => 2, - T_PRINT => 5, - T_PRIVATE => 7, - T_PUBLIC => 6, - T_PROTECTED => 9, - T_REQUIRE => 7, - T_REQUIRE_ONCE => 12, - T_RETURN => 6, - T_STATIC => 6, - T_SWITCH => 6, - T_THROW => 5, - T_TRAIT => 5, - T_TRAIT_C => 9, - T_TRY => 3, - T_UNSET => 5, - T_USE => 3, - T_VAR => 3, - T_WHILE => 5, - T_XOR_EQUAL => 2, - T_YIELD => 5, - T_OPEN_CURLY_BRACKET => 1, - T_CLOSE_CURLY_BRACKET => 1, - T_OPEN_SQUARE_BRACKET => 1, - T_CLOSE_SQUARE_BRACKET => 1, - T_OPEN_PARENTHESIS => 1, - T_CLOSE_PARENTHESIS => 1, - T_COLON => 1, - T_STRING_CONCAT => 1, - T_INLINE_THEN => 1, - T_INLINE_ELSE => 1, - T_NULLABLE => 1, - T_NULL => 4, - T_FALSE => 5, - T_TRUE => 4, - T_SEMICOLON => 1, - T_EQUAL => 1, - T_MULTIPLY => 1, - T_DIVIDE => 1, - T_PLUS => 1, - T_MINUS => 1, - T_MODULUS => 1, - T_POW => 2, - T_SPACESHIP => 3, - T_COALESCE => 2, - T_COALESCE_EQUAL => 3, - T_BITWISE_AND => 1, - T_BITWISE_OR => 1, - T_BITWISE_XOR => 1, - T_SL => 2, - T_SR => 2, - T_SL_EQUAL => 3, - T_SR_EQUAL => 3, - T_GREATER_THAN => 1, - T_LESS_THAN => 1, - T_BOOLEAN_NOT => 1, - T_SELF => 4, - T_PARENT => 6, - T_COMMA => 1, - T_THIS => 4, - T_CLOSURE => 8, - T_BACKTICK => 1, - T_OPEN_SHORT_ARRAY => 1, - T_CLOSE_SHORT_ARRAY => 1, - ]; - - /** - * A cache of different token types, resolved into arrays. - * - * @var array - * @see standardiseToken() - */ - private static $resolveTokenCache = []; - - - /** - * Creates an array of tokens when given some PHP code. - * - * Starts by using token_get_all() but does a lot of extra processing - * to insert information about the context of the token. - * - * @param string $string The string to tokenize. - * - * @return array - */ - protected function tokenize($string) - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START PHP TOKENIZING ***".PHP_EOL; - $isWin = false; - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $isWin = true; - } - } - - $tokens = @token_get_all($string); - $finalTokens = []; - - $newStackPtr = 0; - $numTokens = count($tokens); - $lastNotEmptyToken = 0; - - $insideInlineIf = []; - $insideUseGroup = false; - - $commentTokenizer = new Comment(); - - for ($stackPtr = 0; $stackPtr < $numTokens; $stackPtr++) { - // Special case for tokens we have needed to blank out. - if ($tokens[$stackPtr] === null) { - continue; - } - - $token = (array) $tokens[$stackPtr]; - $tokenIsArray = isset($token[1]); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if ($tokenIsArray === true) { - $type = Util\Tokens::tokenName($token[0]); - $content = Util\Common::prepareForOutput($token[1]); - } else { - $newToken = self::resolveSimpleToken($token[0]); - $type = $newToken['type']; - $content = Util\Common::prepareForOutput($token[0]); - } - - echo "\tProcess token "; - if ($tokenIsArray === true) { - echo "[$stackPtr]"; - } else { - echo " $stackPtr "; - } - - echo ": $type => $content"; - }//end if - - if ($newStackPtr > 0 - && isset(Util\Tokens::$emptyTokens[$finalTokens[($newStackPtr - 1)]['code']]) === false - ) { - $lastNotEmptyToken = ($newStackPtr - 1); - } - - /* - If we are using \r\n newline characters, the \r and \n are sometimes - split over two tokens. This normally occurs after comments. We need - to merge these two characters together so that our line endings are - consistent for all lines. - */ - - if ($tokenIsArray === true && substr($token[1], -1) === "\r") { - if (isset($tokens[($stackPtr + 1)]) === true - && is_array($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][1][0] === "\n" - ) { - $token[1] .= "\n"; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if ($isWin === true) { - echo '\n'; - } else { - echo "\033[30;1m\\n\033[0m"; - } - } - - if ($tokens[($stackPtr + 1)][1] === "\n") { - // This token's content has been merged into the previous, - // so we can skip it. - $tokens[($stackPtr + 1)] = ''; - } else { - $tokens[($stackPtr + 1)][1] = substr($tokens[($stackPtr + 1)][1], 1); - } - } - }//end if - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - - /* - Parse doc blocks into something that can be easily iterated over. - */ - - if ($tokenIsArray === true - && ($token[0] === T_DOC_COMMENT - || ($token[0] === T_COMMENT && strpos($token[1], '/**') === 0)) - ) { - $commentTokens = $commentTokenizer->tokenizeString($token[1], $this->eolChar, $newStackPtr); - foreach ($commentTokens as $commentToken) { - $finalTokens[$newStackPtr] = $commentToken; - $newStackPtr++; - } - - continue; - } - - /* - If this is a double quoted string, PHP will tokenize the whole - thing which causes problems with the scope map when braces are - within the string. So we need to merge the tokens together to - provide a single string. - */ - - if ($tokenIsArray === false && ($token[0] === '"' || $token[0] === 'b"')) { - // Binary casts need a special token. - if ($token[0] === 'b"') { - $finalTokens[$newStackPtr] = [ - 'code' => T_BINARY_CAST, - 'type' => 'T_BINARY_CAST', - 'content' => 'b', - ]; - $newStackPtr++; - } - - $tokenContent = '"'; - $nestedVars = []; - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - $subToken = (array) $tokens[$i]; - $subTokenIsArray = isset($subToken[1]); - - if ($subTokenIsArray === true) { - $tokenContent .= $subToken[1]; - if ($subToken[1] === '{' - && $subToken[0] !== T_ENCAPSED_AND_WHITESPACE - ) { - $nestedVars[] = $i; - } - } else { - $tokenContent .= $subToken[0]; - if ($subToken[0] === '}') { - array_pop($nestedVars); - } - } - - if ($subTokenIsArray === false - && $subToken[0] === '"' - && empty($nestedVars) === true - ) { - // We found the other end of the double quoted string. - break; - } - }//end for - - $stackPtr = $i; - - // Convert each line within the double quoted string to a - // new token, so it conforms with other multiple line tokens. - $tokenLines = explode($this->eolChar, $tokenContent); - $numLines = count($tokenLines); - $newToken = []; - - for ($j = 0; $j < $numLines; $j++) { - $newToken['content'] = $tokenLines[$j]; - if ($j === ($numLines - 1)) { - if ($tokenLines[$j] === '') { - break; - } - } else { - $newToken['content'] .= $this->eolChar; - } - - $newToken['code'] = T_DOUBLE_QUOTED_STRING; - $newToken['type'] = 'T_DOUBLE_QUOTED_STRING'; - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - } - - // Continue, as we're done with this token. - continue; - }//end if - - /* - Detect binary casting and assign the casts their own token. - */ - - if ($tokenIsArray === true - && $token[0] === T_CONSTANT_ENCAPSED_STRING - && (substr($token[1], 0, 2) === 'b"' - || substr($token[1], 0, 2) === "b'") - ) { - $finalTokens[$newStackPtr] = [ - 'code' => T_BINARY_CAST, - 'type' => 'T_BINARY_CAST', - 'content' => 'b', - ]; - $newStackPtr++; - $token[1] = substr($token[1], 1); - } - - if ($tokenIsArray === true - && $token[0] === T_STRING_CAST - && preg_match('`^\(\s*binary\s*\)$`i', $token[1]) === 1 - ) { - $finalTokens[$newStackPtr] = [ - 'code' => T_BINARY_CAST, - 'type' => 'T_BINARY_CAST', - 'content' => $token[1], - ]; - $newStackPtr++; - continue; - } - - /* - If this is a heredoc, PHP will tokenize the whole - thing which causes problems when heredocs don't - contain real PHP code, which is almost never. - We want to leave the start and end heredoc tokens - alone though. - */ - - if ($tokenIsArray === true && $token[0] === T_START_HEREDOC) { - // Add the start heredoc token to the final array. - $finalTokens[$newStackPtr] = self::standardiseToken($token); - - // Check if this is actually a nowdoc and use a different token - // to help the sniffs. - $nowdoc = false; - if (strpos($token[1], "'") !== false) { - $finalTokens[$newStackPtr]['code'] = T_START_NOWDOC; - $finalTokens[$newStackPtr]['type'] = 'T_START_NOWDOC'; - $nowdoc = true; - } - - $tokenContent = ''; - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - $subTokenIsArray = is_array($tokens[$i]); - if ($subTokenIsArray === true - && $tokens[$i][0] === T_END_HEREDOC - ) { - // We found the other end of the heredoc. - break; - } - - if ($subTokenIsArray === true) { - $tokenContent .= $tokens[$i][1]; - } else { - $tokenContent .= $tokens[$i]; - } - } - - if ($i === $numTokens) { - // We got to the end of the file and never - // found the closing token, so this probably wasn't - // a heredoc. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $finalTokens[$newStackPtr]['type']; - echo "\t\t* failed to find the end of the here/nowdoc".PHP_EOL; - echo "\t\t* token $stackPtr changed from $type to T_STRING".PHP_EOL; - } - - $finalTokens[$newStackPtr]['code'] = T_STRING; - $finalTokens[$newStackPtr]['type'] = 'T_STRING'; - $newStackPtr++; - continue; - } - - $stackPtr = $i; - $newStackPtr++; - - // Convert each line within the heredoc to a - // new token, so it conforms with other multiple line tokens. - $tokenLines = explode($this->eolChar, $tokenContent); - $numLines = count($tokenLines); - $newToken = []; - - for ($j = 0; $j < $numLines; $j++) { - $newToken['content'] = $tokenLines[$j]; - if ($j === ($numLines - 1)) { - if ($tokenLines[$j] === '') { - break; - } - } else { - $newToken['content'] .= $this->eolChar; - } - - if ($nowdoc === true) { - $newToken['code'] = T_NOWDOC; - $newToken['type'] = 'T_NOWDOC'; - } else { - $newToken['code'] = T_HEREDOC; - $newToken['type'] = 'T_HEREDOC'; - } - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - }//end for - - // Add the end heredoc token to the final array. - $finalTokens[$newStackPtr] = self::standardiseToken($tokens[$stackPtr]); - - if ($nowdoc === true) { - $finalTokens[$newStackPtr]['code'] = T_END_NOWDOC; - $finalTokens[$newStackPtr]['type'] = 'T_END_NOWDOC'; - } - - $newStackPtr++; - - // Continue, as we're done with this token. - continue; - }//end if - - /* - Before PHP 7.0, the "yield from" was tokenized as - T_YIELD, T_WHITESPACE and T_STRING. So look for - and change this token in earlier versions. - */ - - if (PHP_VERSION_ID < 70000 - && PHP_VERSION_ID >= 50500 - && $tokenIsArray === true - && $token[0] === T_YIELD - && isset($tokens[($stackPtr + 1)]) === true - && isset($tokens[($stackPtr + 2)]) === true - && $tokens[($stackPtr + 1)][0] === T_WHITESPACE - && $tokens[($stackPtr + 2)][0] === T_STRING - && strtolower($tokens[($stackPtr + 2)][1]) === 'from' - ) { - // Could be multi-line, so just the token stack. - $token[0] = T_YIELD_FROM; - $token[1] .= $tokens[($stackPtr + 1)][1].$tokens[($stackPtr + 2)][1]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - for ($i = ($stackPtr + 1); $i <= ($stackPtr + 2); $i++) { - $type = Util\Tokens::tokenName($tokens[$i][0]); - $content = Util\Common::prepareForOutput($tokens[$i][1]); - echo "\t\t* token $i merged into T_YIELD_FROM; was: $type => $content".PHP_EOL; - } - } - - $tokens[($stackPtr + 1)] = null; - $tokens[($stackPtr + 2)] = null; - } - - /* - Before PHP 5.5, the yield keyword was tokenized as - T_STRING. So look for and change this token in - earlier versions. - Checks also if it is just "yield" or "yield from". - */ - - if (PHP_VERSION_ID < 50500 - && $tokenIsArray === true - && $token[0] === T_STRING - && strtolower($token[1]) === 'yield' - ) { - if (isset($tokens[($stackPtr + 1)]) === true - && isset($tokens[($stackPtr + 2)]) === true - && $tokens[($stackPtr + 1)][0] === T_WHITESPACE - && $tokens[($stackPtr + 2)][0] === T_STRING - && strtolower($tokens[($stackPtr + 2)][1]) === 'from' - ) { - // Could be multi-line, so just just the token stack. - $token[0] = T_YIELD_FROM; - $token[1] .= $tokens[($stackPtr + 1)][1].$tokens[($stackPtr + 2)][1]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - for ($i = ($stackPtr + 1); $i <= ($stackPtr + 2); $i++) { - $type = Util\Tokens::tokenName($tokens[$i][0]); - $content = Util\Common::prepareForOutput($tokens[$i][1]); - echo "\t\t* token $i merged into T_YIELD_FROM; was: $type => $content".PHP_EOL; - } - } - - $tokens[($stackPtr + 1)] = null; - $tokens[($stackPtr + 2)] = null; - } else { - $newToken = []; - $newToken['code'] = T_YIELD; - $newToken['type'] = 'T_YIELD'; - $newToken['content'] = $token[1]; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - continue; - }//end if - }//end if - - /* - Before PHP 5.6, the ... operator was tokenized as three - T_STRING_CONCAT tokens in a row. So look for and combine - these tokens in earlier versions. - */ - - if ($tokenIsArray === false - && $token[0] === '.' - && isset($tokens[($stackPtr + 1)]) === true - && isset($tokens[($stackPtr + 2)]) === true - && $tokens[($stackPtr + 1)] === '.' - && $tokens[($stackPtr + 2)] === '.' - ) { - $newToken = []; - $newToken['code'] = T_ELLIPSIS; - $newToken['type'] = 'T_ELLIPSIS'; - $newToken['content'] = '...'; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr += 2; - continue; - } - - /* - Before PHP 5.6, the ** operator was tokenized as two - T_MULTIPLY tokens in a row. So look for and combine - these tokens in earlier versions. - */ - - if ($tokenIsArray === false - && $token[0] === '*' - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)] === '*' - ) { - $newToken = []; - $newToken['code'] = T_POW; - $newToken['type'] = 'T_POW'; - $newToken['content'] = '**'; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr++; - continue; - } - - /* - Before PHP 5.6, the **= operator was tokenized as - T_MULTIPLY followed by T_MUL_EQUAL. So look for and combine - these tokens in earlier versions. - */ - - if ($tokenIsArray === false - && $token[0] === '*' - && isset($tokens[($stackPtr + 1)]) === true - && is_array($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][1] === '*=' - ) { - $newToken = []; - $newToken['code'] = T_POW_EQUAL; - $newToken['type'] = 'T_POW_EQUAL'; - $newToken['content'] = '**='; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr++; - continue; - } - - /* - Before PHP 7, the ??= operator was tokenized as - T_INLINE_THEN, T_INLINE_THEN, T_EQUAL. - Between PHP 7.0 and 7.2, the ??= operator was tokenized as - T_COALESCE, T_EQUAL. - So look for and combine these tokens in earlier versions. - */ - - if (($tokenIsArray === false - && $token[0] === '?' - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === '?' - && isset($tokens[($stackPtr + 2)]) === true - && $tokens[($stackPtr + 2)][0] === '=') - || ($tokenIsArray === true - && $token[0] === T_COALESCE - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === '=') - ) { - $newToken = []; - $newToken['code'] = T_COALESCE_EQUAL; - $newToken['type'] = 'T_COALESCE_EQUAL'; - $newToken['content'] = '??='; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr++; - - if ($tokenIsArray === false) { - // Pre PHP 7. - $stackPtr++; - } - - continue; - } - - /* - Before PHP 7, the ?? operator was tokenized as - T_INLINE_THEN followed by T_INLINE_THEN. - So look for and combine these tokens in earlier versions. - */ - - if ($tokenIsArray === false - && $token[0] === '?' - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === '?' - ) { - $newToken = []; - $newToken['code'] = T_COALESCE; - $newToken['type'] = 'T_COALESCE'; - $newToken['content'] = '??'; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr++; - continue; - } - - /* - Before PHP 7.4, underscores inside T_LNUMBER and T_DNUMBER - tokens split the token with a T_STRING. So look for - and change these tokens in earlier versions. - */ - - if (PHP_VERSION_ID < 70400 - && ($tokenIsArray === true - && ($token[0] === T_LNUMBER - || $token[0] === T_DNUMBER) - && isset($tokens[($stackPtr + 1)]) === true - && is_array($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === T_STRING - && $tokens[($stackPtr + 1)][1][0] === '_') - ) { - $newContent = $token[1]; - $newType = $token[0]; - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === false) { - break; - } - - if ($tokens[$i][0] === T_LNUMBER - || $tokens[$i][0] === T_DNUMBER - ) { - $newContent .= $tokens[$i][1]; - continue; - } - - if ($tokens[$i][0] === T_STRING - && $tokens[$i][1][0] === '_' - && ((strpos($newContent, '0x') === 0 - && preg_match('`^((? PHP_INT_MAX) - || (stripos($newContent, '0b') === 0 && bindec(str_replace('_', '', $newContent)) > PHP_INT_MAX) - || (stripos($newContent, '0x') !== 0 - && stripos($newContent, 'e') !== false || strpos($newContent, '.') !== false) - || (strpos($newContent, '0') === 0 && stripos($newContent, '0x') !== 0 - && stripos($newContent, '0b') !== 0 && octdec(str_replace('_', '', $newContent)) > PHP_INT_MAX) - || (strpos($newContent, '0') !== 0 && str_replace('_', '', $newContent) > PHP_INT_MAX)) - ) { - $newType = T_DNUMBER; - } - - $newToken = []; - $newToken['code'] = $newType; - $newToken['type'] = Util\Tokens::tokenName($newType); - $newToken['content'] = $newContent; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr = ($i - 1); - continue; - }//end if - - /* - Convert ? to T_NULLABLE OR T_INLINE_THEN - */ - - if ($tokenIsArray === false && $token[0] === '?') { - $newToken = []; - $newToken['content'] = '?'; - - /* - * Check if the next non-empty token is one of the tokens which can be used - * in type declarations. If not, it's definitely a ternary. - * At this point, the only token types which need to be taken into consideration - * as potential type declarations are T_STRING, T_ARRAY, T_CALLABLE and T_NS_SEPARATOR. - */ - - $lastRelevantNonEmpty = null; - - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === true) { - $tokenType = $tokens[$i][0]; - } else { - $tokenType = $tokens[$i]; - } - - if (isset(Util\Tokens::$emptyTokens[$tokenType]) === true) { - continue; - } - - if ($tokenType === T_STRING - || $tokenType === T_ARRAY - || $tokenType === T_NS_SEPARATOR - ) { - $lastRelevantNonEmpty = $tokenType; - continue; - } - - if (($tokenType !== T_CALLABLE - && isset($lastRelevantNonEmpty) === false) - || ($lastRelevantNonEmpty === T_ARRAY - && $tokenType === '(') - || ($lastRelevantNonEmpty === T_STRING - && ($tokenType === T_DOUBLE_COLON - || $tokenType === '(' - || $tokenType === ':')) - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from ? to T_INLINE_THEN".PHP_EOL; - } - - $newToken['code'] = T_INLINE_THEN; - $newToken['type'] = 'T_INLINE_THEN'; - - $insideInlineIf[] = $stackPtr; - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - continue 2; - } - - break; - }//end for - - /* - * This can still be a nullable type or a ternary. - * Do additional checking. - */ - - $prevNonEmpty = null; - $lastSeenNonEmpty = null; - - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - if (is_array($tokens[$i]) === true) { - $tokenType = $tokens[$i][0]; - } else { - $tokenType = $tokens[$i]; - } - - if ($tokenType === T_STATIC - && ($lastSeenNonEmpty === T_DOUBLE_COLON - || $lastSeenNonEmpty === '(') - ) { - $lastSeenNonEmpty = $tokenType; - continue; - } - - if ($prevNonEmpty === null - && isset(Util\Tokens::$emptyTokens[$tokenType]) === false - ) { - // Found the previous non-empty token. - if ($tokenType === ':' || $tokenType === ',') { - $newToken['code'] = T_NULLABLE; - $newToken['type'] = 'T_NULLABLE'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from ? to T_NULLABLE".PHP_EOL; - } - - break; - } - - $prevNonEmpty = $tokenType; - } - - if ($tokenType === T_FUNCTION - || $tokenType === T_FN - || isset(Util\Tokens::$methodPrefixes[$tokenType]) === true - || $tokenType === T_VAR - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from ? to T_NULLABLE".PHP_EOL; - } - - $newToken['code'] = T_NULLABLE; - $newToken['type'] = 'T_NULLABLE'; - break; - } else if (in_array($tokenType, [T_DOUBLE_ARROW, T_OPEN_TAG, T_OPEN_TAG_WITH_ECHO, '=', '{', ';'], true) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from ? to T_INLINE_THEN".PHP_EOL; - } - - $newToken['code'] = T_INLINE_THEN; - $newToken['type'] = 'T_INLINE_THEN'; - - $insideInlineIf[] = $stackPtr; - break; - } - - if (isset(Util\Tokens::$emptyTokens[$tokenType]) === false) { - $lastSeenNonEmpty = $tokenType; - } - }//end for - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - continue; - }//end if - - /* - Tokens after a double colon may look like scope openers, - such as when writing code like Foo::NAMESPACE, but they are - only ever variables or strings. - */ - - if ($stackPtr > 1 - && (is_array($tokens[($stackPtr - 1)]) === true - && $tokens[($stackPtr - 1)][0] === T_PAAMAYIM_NEKUDOTAYIM) - && $tokenIsArray === true - && $token[0] !== T_STRING - && $token[0] !== T_VARIABLE - && $token[0] !== T_DOLLAR - && isset(Util\Tokens::$emptyTokens[$token[0]]) === false - ) { - $newToken = []; - $newToken['code'] = T_STRING; - $newToken['type'] = 'T_STRING'; - $newToken['content'] = $token[1]; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - continue; - } - - /* - Backfill the T_FN token for PHP versions < 7.4. - */ - - if ($tokenIsArray === true - && $token[0] === T_STRING - && strtolower($token[1]) === 'fn' - ) { - // Modify the original token stack so that - // future checks (like looking for T_NULLABLE) can - // detect the T_FN token more easily. - $tokens[$stackPtr][0] = T_FN; - $token[0] = T_FN; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from T_STRING to T_FN".PHP_EOL; - } - } - - /* - The string-like token after a function keyword should always be - tokenized as T_STRING even if it appears to be a different token, - such as when writing code like: function default(): foo - so go forward and change the token type before it is processed. - */ - - if ($tokenIsArray === true - && ($token[0] === T_FUNCTION - || $token[0] === T_FN) - && $finalTokens[$lastNotEmptyToken]['code'] !== T_USE - ) { - if ($token[0] === T_FUNCTION) { - for ($x = ($stackPtr + 1); $x < $numTokens; $x++) { - if (is_array($tokens[$x]) === false - || isset(Util\Tokens::$emptyTokens[$tokens[$x][0]]) === false - ) { - // Non-empty content. - break; - } - } - - if ($x < $numTokens && is_array($tokens[$x]) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $oldType = Util\Tokens::tokenName($tokens[$x][0]); - echo "\t\t* token $x changed from $oldType to T_STRING".PHP_EOL; - } - - $tokens[$x][0] = T_STRING; - } - }//end if - - /* - This is a special condition for T_ARRAY tokens used for - function return types. We want to keep the parenthesis map clean, - so let's tag these tokens as T_STRING. - */ - - // Go looking for the colon to start the return type hint. - // Start by finding the closing parenthesis of the function. - $parenthesisStack = []; - $parenthesisCloser = false; - for ($x = ($stackPtr + 1); $x < $numTokens; $x++) { - if (is_array($tokens[$x]) === false && $tokens[$x] === '(') { - $parenthesisStack[] = $x; - } else if (is_array($tokens[$x]) === false && $tokens[$x] === ')') { - array_pop($parenthesisStack); - if (empty($parenthesisStack) === true) { - $parenthesisCloser = $x; - break; - } - } - } - - if ($parenthesisCloser !== false) { - for ($x = ($parenthesisCloser + 1); $x < $numTokens; $x++) { - if (is_array($tokens[$x]) === false - || isset(Util\Tokens::$emptyTokens[$tokens[$x][0]]) === false - ) { - // Non-empty content. - if (is_array($tokens[$x]) === true && $tokens[$x][0] === T_USE) { - // Found a use statements, so search ahead for the closing parenthesis. - for ($x += 1; $x < $numTokens; $x++) { - if (is_array($tokens[$x]) === false && $tokens[$x] === ')') { - continue(2); - } - } - } - - break; - } - } - - if (isset($tokens[$x]) === true - && is_array($tokens[$x]) === false - && $tokens[$x] === ':' - ) { - $allowed = [ - T_STRING => T_STRING, - T_ARRAY => T_ARRAY, - T_CALLABLE => T_CALLABLE, - T_SELF => T_SELF, - T_PARENT => T_PARENT, - T_NS_SEPARATOR => T_NS_SEPARATOR, - ]; - - $allowed += Util\Tokens::$emptyTokens; - - // Find the start of the return type. - for ($x += 1; $x < $numTokens; $x++) { - if (is_array($tokens[$x]) === true - && isset(Util\Tokens::$emptyTokens[$tokens[$x][0]]) === true - ) { - // Whitespace or comments before the return type. - continue; - } - - if (is_array($tokens[$x]) === false && $tokens[$x] === '?') { - // Found a nullable operator, so skip it. - // But also covert the token to save the tokenizer - // a bit of time later on. - $tokens[$x] = [ - T_NULLABLE, - '?', - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $x changed from ? to T_NULLABLE".PHP_EOL; - } - - continue; - } - - break; - }//end for - - // Any T_ARRAY tokens we find between here and the next - // token that can't be part of the return type need to be - // converted to T_STRING tokens. - for ($x; $x < $numTokens; $x++) { - if (is_array($tokens[$x]) === false || isset($allowed[$tokens[$x][0]]) === false) { - break; - } else if ($tokens[$x][0] === T_ARRAY) { - $tokens[$x][0] = T_STRING; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $x changed from T_ARRAY to T_STRING".PHP_EOL; - } - } - } - }//end if - }//end if - }//end if - - /* - Before PHP 7, the <=> operator was tokenized as - T_IS_SMALLER_OR_EQUAL followed by T_GREATER_THAN. - So look for and combine these tokens in earlier versions. - */ - - if ($tokenIsArray === true - && $token[0] === T_IS_SMALLER_OR_EQUAL - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === '>' - ) { - $newToken = []; - $newToken['code'] = T_SPACESHIP; - $newToken['type'] = 'T_SPACESHIP'; - $newToken['content'] = '<=>'; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr++; - continue; - } - - /* - PHP doesn't assign a token to goto labels, so we have to. - These are just string tokens with a single colon after them. Double - colons are already tokenized and so don't interfere with this check. - But we do have to account for CASE statements, that look just like - goto labels. - */ - - if ($tokenIsArray === true - && $token[0] === T_STRING - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)] === ':' - && $tokens[($stackPtr - 1)][0] !== T_PAAMAYIM_NEKUDOTAYIM - ) { - $stopTokens = [ - T_CASE => true, - T_SEMICOLON => true, - T_OPEN_CURLY_BRACKET => true, - T_INLINE_THEN => true, - ]; - - for ($x = ($newStackPtr - 1); $x > 0; $x--) { - if (isset($stopTokens[$finalTokens[$x]['code']]) === true) { - break; - } - } - - if ($finalTokens[$x]['code'] !== T_CASE - && $finalTokens[$x]['code'] !== T_INLINE_THEN - ) { - $finalTokens[$newStackPtr] = [ - 'content' => $token[1].':', - 'code' => T_GOTO_LABEL, - 'type' => 'T_GOTO_LABEL', - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from T_STRING to T_GOTO_LABEL".PHP_EOL; - echo "\t\t* skipping T_COLON token ".($stackPtr + 1).PHP_EOL; - } - - $newStackPtr++; - $stackPtr++; - continue; - } - }//end if - - /* - If this token has newlines in its content, split each line up - and create a new token for each line. We do this so it's easier - to ascertain where errors occur on a line. - Note that $token[1] is the token's content. - */ - - if ($tokenIsArray === true && strpos($token[1], $this->eolChar) !== false) { - $tokenLines = explode($this->eolChar, $token[1]); - $numLines = count($tokenLines); - $newToken = [ - 'type' => Util\Tokens::tokenName($token[0]), - 'code' => $token[0], - 'content' => '', - ]; - - for ($i = 0; $i < $numLines; $i++) { - $newToken['content'] = $tokenLines[$i]; - if ($i === ($numLines - 1)) { - if ($tokenLines[$i] === '') { - break; - } - } else { - $newToken['content'] .= $this->eolChar; - } - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - } - } else { - if ($tokenIsArray === true && $token[0] === T_STRING) { - // Some T_STRING tokens should remain that way - // due to their context. - $context = [ - T_OBJECT_OPERATOR => true, - T_FUNCTION => true, - T_CLASS => true, - T_EXTENDS => true, - T_IMPLEMENTS => true, - T_NEW => true, - T_CONST => true, - T_NS_SEPARATOR => true, - T_USE => true, - T_NAMESPACE => true, - T_PAAMAYIM_NEKUDOTAYIM => true, - ]; - - if (isset($context[$finalTokens[$lastNotEmptyToken]['code']]) === true) { - // Special case for syntax like: return new self - // where self should not be a string. - if ($finalTokens[$lastNotEmptyToken]['code'] === T_NEW - && strtolower($token[1]) === 'self' - ) { - $finalTokens[$newStackPtr] = [ - 'content' => $token[1], - 'code' => T_SELF, - 'type' => 'T_SELF', - ]; - } else { - $finalTokens[$newStackPtr] = [ - 'content' => $token[1], - 'code' => T_STRING, - 'type' => 'T_STRING', - ]; - } - - $newStackPtr++; - continue; - }//end if - }//end if - - $newToken = null; - if ($tokenIsArray === false) { - if (isset(self::$resolveTokenCache[$token[0]]) === true) { - $newToken = self::$resolveTokenCache[$token[0]]; - } - } else { - $cacheKey = null; - if ($token[0] === T_STRING) { - $cacheKey = strtolower($token[1]); - } else if ($token[0] !== T_CURLY_OPEN) { - $cacheKey = $token[0]; - } - - if ($cacheKey !== null && isset(self::$resolveTokenCache[$cacheKey]) === true) { - $newToken = self::$resolveTokenCache[$cacheKey]; - $newToken['content'] = $token[1]; - } - } - - if ($newToken === null) { - $newToken = self::standardiseToken($token); - } - - // Convert colons that are actually the ELSE component of an - // inline IF statement. - if (empty($insideInlineIf) === false && $newToken['code'] === T_COLON) { - // Make sure this isn't the return type separator of a closure. - $isInlineIf = true; - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if (is_array($tokens[$i]) === false - || ($tokens[$i][0] !== T_DOC_COMMENT - && $tokens[$i][0] !== T_COMMENT - && $tokens[$i][0] !== T_WHITESPACE) - ) { - break; - } - } - - if ($tokens[$i] === ')') { - $parenCount = 1; - for ($i--; $i > 0; $i--) { - if ($tokens[$i] === '(') { - $parenCount--; - if ($parenCount === 0) { - break; - } - } else if ($tokens[$i] === ')') { - $parenCount++; - } - } - - // We've found the open parenthesis, so if the previous - // non-empty token is FUNCTION or USE, this is a closure. - for ($i--; $i > 0; $i--) { - if (is_array($tokens[$i]) === false - || ($tokens[$i][0] !== T_DOC_COMMENT - && $tokens[$i][0] !== T_COMMENT - && $tokens[$i][0] !== T_WHITESPACE) - ) { - break; - } - } - - if ($tokens[$i][0] === T_FUNCTION || $tokens[$i][0] === T_FN || $tokens[$i][0] === T_USE) { - $isInlineIf = false; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token is function return type, not T_INLINE_ELSE".PHP_EOL; - } - } - }//end if - - // Check to see if this is a CASE or DEFAULT opener. - $inlineIfToken = $insideInlineIf[(count($insideInlineIf) - 1)]; - for ($i = $stackPtr; $i > $inlineIfToken; $i--) { - if (is_array($tokens[$i]) === true - && ($tokens[$i][0] === T_CASE - || $tokens[$i][0] === T_DEFAULT) - ) { - $isInlineIf = false; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token is T_CASE or T_DEFAULT opener, not T_INLINE_ELSE".PHP_EOL; - } - - break; - } - - if (is_array($tokens[$i]) === false - && ($tokens[$i] === ';' - || $tokens[$i] === '{') - ) { - break; - } - } - - if ($isInlineIf === true) { - array_pop($insideInlineIf); - $newToken['code'] = T_INLINE_ELSE; - $newToken['type'] = 'T_INLINE_ELSE'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token changed from T_COLON to T_INLINE_ELSE".PHP_EOL; - } - } - }//end if - - // This is a special condition for T_ARRAY tokens used for - // type hinting function arguments as being arrays. We want to keep - // the parenthesis map clean, so let's tag these tokens as - // T_STRING. - if ($newToken['code'] === T_ARRAY) { - for ($i = $stackPtr; $i < $numTokens; $i++) { - if ($tokens[$i] === '(') { - break; - } else if ($tokens[$i][0] === T_VARIABLE) { - $newToken['code'] = T_STRING; - $newToken['type'] = 'T_STRING'; - break; - } - } - } - - // This is a special case when checking PHP 5.5+ code in PHP < 5.5 - // where "finally" should be T_FINALLY instead of T_STRING. - if ($newToken['code'] === T_STRING - && strtolower($newToken['content']) === 'finally' - ) { - $newToken['code'] = T_FINALLY; - $newToken['type'] = 'T_FINALLY'; - } - - // This is a special case for the PHP 5.5 classname::class syntax - // where "class" should be T_STRING instead of T_CLASS. - if (($newToken['code'] === T_CLASS - || $newToken['code'] === T_FUNCTION) - && $finalTokens[$lastNotEmptyToken]['code'] === T_DOUBLE_COLON - ) { - $newToken['code'] = T_STRING; - $newToken['type'] = 'T_STRING'; - } - - // This is a special case for PHP 5.6 use function and use const - // where "function" and "const" should be T_STRING instead of T_FUNCTION - // and T_CONST. - if (($newToken['code'] === T_FUNCTION - || $newToken['code'] === T_CONST) - && ($finalTokens[$lastNotEmptyToken]['code'] === T_USE || $insideUseGroup === true) - ) { - $newToken['code'] = T_STRING; - $newToken['type'] = 'T_STRING'; - } - - // This is a special case for use groups in PHP 7+ where leaving - // the curly braces as their normal tokens would confuse - // the scope map and sniffs. - if ($newToken['code'] === T_OPEN_CURLY_BRACKET - && $finalTokens[$lastNotEmptyToken]['code'] === T_NS_SEPARATOR - ) { - $newToken['code'] = T_OPEN_USE_GROUP; - $newToken['type'] = 'T_OPEN_USE_GROUP'; - $insideUseGroup = true; - } - - if ($insideUseGroup === true && $newToken['code'] === T_CLOSE_CURLY_BRACKET) { - $newToken['code'] = T_CLOSE_USE_GROUP; - $newToken['type'] = 'T_CLOSE_USE_GROUP'; - $insideUseGroup = false; - } - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - }//end if - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END PHP TOKENIZING ***".PHP_EOL; - } - - return $finalTokens; - - }//end tokenize() - - - /** - * Performs additional processing after main tokenizing. - * - * This additional processing checks for CASE statements that are using curly - * braces for scope openers and closers. It also turns some T_FUNCTION tokens - * into T_CLOSURE when they are not standard function definitions. It also - * detects short array syntax and converts those square brackets into new tokens. - * It also corrects some usage of the static and class keywords. It also - * assigns tokens to function return types. - * - * @return void - */ - protected function processAdditional() - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START ADDITIONAL PHP PROCESSING ***".PHP_EOL; - } - - $numTokens = count($this->tokens); - for ($i = ($numTokens - 1); $i >= 0; $i--) { - // Check for any unset scope conditions due to alternate IF/ENDIF syntax. - if (isset($this->tokens[$i]['scope_opener']) === true - && isset($this->tokens[$i]['scope_condition']) === false - ) { - $this->tokens[$i]['scope_condition'] = $this->tokens[$this->tokens[$i]['scope_opener']]['scope_condition']; - } - - if ($this->tokens[$i]['code'] === T_FUNCTION) { - /* - Detect functions that are actually closures and - assign them a different token. - */ - - if (isset($this->tokens[$i]['scope_opener']) === true) { - for ($x = ($i + 1); $x < $numTokens; $x++) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false - && $this->tokens[$x]['code'] !== T_BITWISE_AND - ) { - break; - } - } - - if ($this->tokens[$x]['code'] === T_OPEN_PARENTHESIS) { - $this->tokens[$i]['code'] = T_CLOSURE; - $this->tokens[$i]['type'] = 'T_CLOSURE'; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t* token $i on line $line changed from T_FUNCTION to T_CLOSURE".PHP_EOL; - } - - for ($x = ($this->tokens[$i]['scope_opener'] + 1); $x < $this->tokens[$i]['scope_closer']; $x++) { - if (isset($this->tokens[$x]['conditions'][$i]) === false) { - continue; - } - - $this->tokens[$x]['conditions'][$i] = T_CLOSURE; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - echo "\t\t* cleaned $x ($type) *".PHP_EOL; - } - } - } - }//end if - - continue; - } else if ($this->tokens[$i]['code'] === T_CLASS && isset($this->tokens[$i]['scope_opener']) === true) { - /* - Detect anonymous classes and assign them a different token. - */ - - for ($x = ($i + 1); $x < $numTokens; $x++) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - break; - } - } - - if ($this->tokens[$x]['code'] === T_OPEN_PARENTHESIS - || $this->tokens[$x]['code'] === T_OPEN_CURLY_BRACKET - || $this->tokens[$x]['code'] === T_EXTENDS - || $this->tokens[$x]['code'] === T_IMPLEMENTS - ) { - $this->tokens[$i]['code'] = T_ANON_CLASS; - $this->tokens[$i]['type'] = 'T_ANON_CLASS'; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t* token $i on line $line changed from T_CLASS to T_ANON_CLASS".PHP_EOL; - } - - if ($this->tokens[$x]['code'] === T_OPEN_PARENTHESIS - && isset($this->tokens[$x]['parenthesis_closer']) === true - ) { - $closer = $this->tokens[$x]['parenthesis_closer']; - - $this->tokens[$i]['parenthesis_opener'] = $x; - $this->tokens[$i]['parenthesis_closer'] = $closer; - $this->tokens[$i]['parenthesis_owner'] = $i; - $this->tokens[$x]['parenthesis_owner'] = $i; - $this->tokens[$closer]['parenthesis_owner'] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t\t* added parenthesis keys to T_ANON_CLASS token $i on line $line".PHP_EOL; - } - } - - for ($x = ($this->tokens[$i]['scope_opener'] + 1); $x < $this->tokens[$i]['scope_closer']; $x++) { - if (isset($this->tokens[$x]['conditions'][$i]) === false) { - continue; - } - - $this->tokens[$x]['conditions'][$i] = T_ANON_CLASS; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - echo "\t\t* cleaned $x ($type) *".PHP_EOL; - } - } - }//end if - - continue; - } else if ($this->tokens[$i]['code'] === T_FN && isset($this->tokens[($i + 1)]) === true) { - // Possible arrow function. - for ($x = ($i + 1); $x < $numTokens; $x++) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false - && $this->tokens[$x]['code'] !== T_BITWISE_AND - ) { - // Non-whitespace content. - break; - } - } - - if (isset($this->tokens[$x]) === true && $this->tokens[$x]['code'] === T_OPEN_PARENTHESIS) { - $ignore = Util\Tokens::$emptyTokens; - $ignore += [ - T_STRING => T_STRING, - T_ARRAY => T_ARRAY, - T_COLON => T_COLON, - T_NS_SEPARATOR => T_NS_SEPARATOR, - T_NULLABLE => T_NULLABLE, - T_CALLABLE => T_CALLABLE, - T_PARENT => T_PARENT, - T_SELF => T_SELF, - ]; - - $closer = $this->tokens[$x]['parenthesis_closer']; - for ($arrow = ($closer + 1); $arrow < $numTokens; $arrow++) { - if (isset($ignore[$this->tokens[$arrow]['code']]) === false) { - break; - } - } - - if ($this->tokens[$arrow]['code'] === T_DOUBLE_ARROW) { - $endTokens = [ - T_COLON => true, - T_COMMA => true, - T_SEMICOLON => true, - T_CLOSE_PARENTHESIS => true, - T_CLOSE_SQUARE_BRACKET => true, - T_CLOSE_CURLY_BRACKET => true, - T_CLOSE_SHORT_ARRAY => true, - T_OPEN_TAG => true, - T_CLOSE_TAG => true, - ]; - - $inTernary = false; - $lastEndToken = null; - - for ($scopeCloser = ($arrow + 1); $scopeCloser < $numTokens; $scopeCloser++) { - if (isset($endTokens[$this->tokens[$scopeCloser]['code']]) === true) { - if ($lastEndToken !== null - && $this->tokens[$scopeCloser]['code'] === T_CLOSE_PARENTHESIS - && $this->tokens[$scopeCloser]['parenthesis_opener'] < $arrow - ) { - $scopeCloser = $lastEndToken; - } - - break; - } - - if (isset($this->tokens[$scopeCloser]['scope_closer']) === true - && $this->tokens[$scopeCloser]['code'] !== T_INLINE_ELSE - ) { - // We minus 1 here in case the closer can be shared with us. - $scopeCloser = ($this->tokens[$scopeCloser]['scope_closer'] - 1); - continue; - } - - if (isset($this->tokens[$scopeCloser]['parenthesis_closer']) === true) { - $scopeCloser = $this->tokens[$scopeCloser]['parenthesis_closer']; - $lastEndToken = $scopeCloser; - continue; - } - - if (isset($this->tokens[$scopeCloser]['bracket_closer']) === true) { - $scopeCloser = $this->tokens[$scopeCloser]['bracket_closer']; - $lastEndToken = $scopeCloser; - continue; - } - - if ($this->tokens[$scopeCloser]['code'] === T_INLINE_THEN) { - $inTernary = true; - continue; - } - - if ($this->tokens[$scopeCloser]['code'] === T_INLINE_ELSE) { - if ($inTernary === false) { - break; - } - - $inTernary = false; - continue; - } - }//end for - - if ($scopeCloser !== $numTokens) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t=> token $i on line $line processed as arrow function".PHP_EOL; - echo "\t\t* scope opener set to $arrow *".PHP_EOL; - echo "\t\t* scope closer set to $scopeCloser *".PHP_EOL; - echo "\t\t* parenthesis opener set to $x *".PHP_EOL; - echo "\t\t* parenthesis closer set to $closer *".PHP_EOL; - } - - $this->tokens[$i]['code'] = T_FN; - $this->tokens[$i]['type'] = 'T_FN'; - $this->tokens[$i]['scope_condition'] = $i; - $this->tokens[$i]['scope_opener'] = $arrow; - $this->tokens[$i]['scope_closer'] = $scopeCloser; - $this->tokens[$i]['parenthesis_owner'] = $i; - $this->tokens[$i]['parenthesis_opener'] = $x; - $this->tokens[$i]['parenthesis_closer'] = $closer; - - $this->tokens[$arrow]['code'] = T_FN_ARROW; - $this->tokens[$arrow]['type'] = 'T_FN_ARROW'; - - $this->tokens[$arrow]['scope_condition'] = $i; - $this->tokens[$arrow]['scope_opener'] = $arrow; - $this->tokens[$arrow]['scope_closer'] = $scopeCloser; - $this->tokens[$scopeCloser]['scope_condition'] = $i; - $this->tokens[$scopeCloser]['scope_opener'] = $arrow; - $this->tokens[$scopeCloser]['scope_closer'] = $scopeCloser; - - $opener = $this->tokens[$i]['parenthesis_opener']; - $closer = $this->tokens[$i]['parenthesis_closer']; - $this->tokens[$opener]['parenthesis_owner'] = $i; - $this->tokens[$closer]['parenthesis_owner'] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$arrow]['line']; - echo "\t\t* token $arrow on line $line changed from T_DOUBLE_ARROW to T_FN_ARROW".PHP_EOL; - } - }//end if - }//end if - }//end if - - // If after all that, the extra tokens are not set, this is not an arrow function. - if (isset($this->tokens[$i]['scope_closer']) === false) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t=> token $i on line $line is not an arrow function".PHP_EOL; - echo "\t\t* token changed from T_FN to T_STRING".PHP_EOL; - } - - $this->tokens[$i]['code'] = T_STRING; - $this->tokens[$i]['type'] = 'T_STRING'; - } - } else if ($this->tokens[$i]['code'] === T_OPEN_SQUARE_BRACKET) { - if (isset($this->tokens[$i]['bracket_closer']) === false) { - continue; - } - - // Unless there is a variable or a bracket before this token, - // it is the start of an array being defined using the short syntax. - $isShortArray = false; - $allowed = [ - T_CLOSE_SQUARE_BRACKET => T_CLOSE_SQUARE_BRACKET, - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_CLOSE_PARENTHESIS => T_CLOSE_PARENTHESIS, - T_VARIABLE => T_VARIABLE, - T_OBJECT_OPERATOR => T_OBJECT_OPERATOR, - T_STRING => T_STRING, - T_CONSTANT_ENCAPSED_STRING => T_CONSTANT_ENCAPSED_STRING, - ]; - - for ($x = ($i - 1); $x >= 0; $x--) { - // If we hit a scope opener, the statement has ended - // without finding anything, so it's probably an array - // using PHP 7.1 short list syntax. - if (isset($this->tokens[$x]['scope_opener']) === true) { - $isShortArray = true; - break; - } - - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - if (isset($allowed[$this->tokens[$x]['code']]) === false) { - $isShortArray = true; - } - - break; - } - } - - if ($isShortArray === true) { - $this->tokens[$i]['code'] = T_OPEN_SHORT_ARRAY; - $this->tokens[$i]['type'] = 'T_OPEN_SHORT_ARRAY'; - - $closer = $this->tokens[$i]['bracket_closer']; - $this->tokens[$closer]['code'] = T_CLOSE_SHORT_ARRAY; - $this->tokens[$closer]['type'] = 'T_CLOSE_SHORT_ARRAY'; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t* token $i on line $line changed from T_OPEN_SQUARE_BRACKET to T_OPEN_SHORT_ARRAY".PHP_EOL; - $line = $this->tokens[$closer]['line']; - echo "\t* token $closer on line $line changed from T_CLOSE_SQUARE_BRACKET to T_CLOSE_SHORT_ARRAY".PHP_EOL; - } - } - - continue; - } else if ($this->tokens[$i]['code'] === T_STATIC) { - for ($x = ($i - 1); $x > 0; $x--) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - break; - } - } - - if ($this->tokens[$x]['code'] === T_INSTANCEOF) { - $this->tokens[$i]['code'] = T_STRING; - $this->tokens[$i]['type'] = 'T_STRING'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t* token $i on line $line changed from T_STATIC to T_STRING".PHP_EOL; - } - } - - continue; - } else if ($this->tokens[$i]['code'] === T_TRUE - || $this->tokens[$i]['code'] === T_FALSE - || $this->tokens[$i]['code'] === T_NULL - ) { - for ($x = ($i + 1); $i < $numTokens; $x++) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - // Non-whitespace content. - break; - } - } - - $context = [ - T_OBJECT_OPERATOR => true, - T_NS_SEPARATOR => true, - T_PAAMAYIM_NEKUDOTAYIM => true, - ]; - if (isset($context[$this->tokens[$x]['code']]) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - $type = $this->tokens[$i]['type']; - echo "\t* token $i on line $line changed from $type to T_STRING".PHP_EOL; - } - - $this->tokens[$i]['code'] = T_STRING; - $this->tokens[$i]['type'] = 'T_STRING'; - } - } else if ($this->tokens[$i]['code'] === T_CONST) { - // Context sensitive keywords support. - for ($x = ($i + 1); $i < $numTokens; $x++) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - // Non-whitespace content. - break; - } - } - - if ($this->tokens[$x]['code'] !== T_STRING) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$x]['line']; - $type = $this->tokens[$x]['type']; - echo "\t* token $x on line $line changed from $type to T_STRING".PHP_EOL; - } - - $this->tokens[$x]['code'] = T_STRING; - $this->tokens[$x]['type'] = 'T_STRING'; - } - }//end if - - if (($this->tokens[$i]['code'] !== T_CASE - && $this->tokens[$i]['code'] !== T_DEFAULT) - || isset($this->tokens[$i]['scope_opener']) === false - ) { - // Only interested in CASE and DEFAULT statements from here on in. - continue; - } - - $scopeOpener = $this->tokens[$i]['scope_opener']; - $scopeCloser = $this->tokens[$i]['scope_closer']; - - // If the first char after the opener is a curly brace - // and that brace has been ignored, it is actually - // opening this case statement and the opener and closer are - // probably set incorrectly. - for ($x = ($scopeOpener + 1); $x < $numTokens; $x++) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - // Non-whitespace content. - break; - } - } - - if ($this->tokens[$x]['code'] === T_CASE || $this->tokens[$x]['code'] === T_DEFAULT) { - // Special case for multiple CASE statements that share the same - // closer. Because we are going backwards through the file, this next - // CASE statement is already fixed, so just use its closer and don't - // worry about fixing anything. - $newCloser = $this->tokens[$x]['scope_closer']; - $this->tokens[$i]['scope_closer'] = $newCloser; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $oldType = $this->tokens[$scopeCloser]['type']; - $newType = $this->tokens[$newCloser]['type']; - $line = $this->tokens[$i]['line']; - echo "\t* token $i (T_CASE) on line $line closer changed from $scopeCloser ($oldType) to $newCloser ($newType)".PHP_EOL; - } - - continue; - } - - if ($this->tokens[$x]['code'] !== T_OPEN_CURLY_BRACKET - || isset($this->tokens[$x]['scope_condition']) === true - ) { - // Not a CASE/DEFAULT with a curly brace opener. - continue; - } - - // The closer for this CASE/DEFAULT should be the closing curly brace and - // not whatever it already is. The opener needs to be the opening curly - // brace so everything matches up. - $newCloser = $this->tokens[$x]['bracket_closer']; - foreach ([$i, $x, $newCloser] as $index) { - $this->tokens[$index]['scope_condition'] = $i; - $this->tokens[$index]['scope_opener'] = $x; - $this->tokens[$index]['scope_closer'] = $newCloser; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - $tokenType = $this->tokens[$i]['type']; - - $oldType = $this->tokens[$scopeOpener]['type']; - $newType = $this->tokens[$x]['type']; - echo "\t* token $i ($tokenType) on line $line opener changed from $scopeOpener ($oldType) to $x ($newType)".PHP_EOL; - - $oldType = $this->tokens[$scopeCloser]['type']; - $newType = $this->tokens[$newCloser]['type']; - echo "\t* token $i ($tokenType) on line $line closer changed from $scopeCloser ($oldType) to $newCloser ($newType)".PHP_EOL; - } - - if ($this->tokens[$scopeOpener]['scope_condition'] === $i) { - unset($this->tokens[$scopeOpener]['scope_condition']); - unset($this->tokens[$scopeOpener]['scope_opener']); - unset($this->tokens[$scopeOpener]['scope_closer']); - } - - if ($this->tokens[$scopeCloser]['scope_condition'] === $i) { - unset($this->tokens[$scopeCloser]['scope_condition']); - unset($this->tokens[$scopeCloser]['scope_opener']); - unset($this->tokens[$scopeCloser]['scope_closer']); - } else { - // We were using a shared closer. All tokens that were - // sharing this closer with us, except for the scope condition - // and it's opener, need to now point to the new closer. - $condition = $this->tokens[$scopeCloser]['scope_condition']; - $start = ($this->tokens[$condition]['scope_opener'] + 1); - for ($y = $start; $y < $scopeCloser; $y++) { - if (isset($this->tokens[$y]['scope_closer']) === true - && $this->tokens[$y]['scope_closer'] === $scopeCloser - ) { - $this->tokens[$y]['scope_closer'] = $newCloser; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$y]['line']; - $tokenType = $this->tokens[$y]['type']; - $oldType = $this->tokens[$scopeCloser]['type']; - $newType = $this->tokens[$newCloser]['type']; - echo "\t\t* token $y ($tokenType) on line $line closer changed from $scopeCloser ($oldType) to $newCloser ($newType)".PHP_EOL; - } - } - } - }//end if - - unset($this->tokens[$x]['bracket_opener']); - unset($this->tokens[$x]['bracket_closer']); - unset($this->tokens[$newCloser]['bracket_opener']); - unset($this->tokens[$newCloser]['bracket_closer']); - $this->tokens[$scopeCloser]['conditions'][] = $i; - - // Now fix up all the tokens that think they are - // inside the CASE/DEFAULT statement when they are really outside. - for ($x = $newCloser; $x < $scopeCloser; $x++) { - foreach ($this->tokens[$x]['conditions'] as $num => $oldCond) { - if ($oldCond === $this->tokens[$i]['code']) { - $oldConditions = $this->tokens[$x]['conditions']; - unset($this->tokens[$x]['conditions'][$num]); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - $oldConds = ''; - foreach ($oldConditions as $condition) { - $oldConds .= Util\Tokens::tokenName($condition).','; - } - - $oldConds = rtrim($oldConds, ','); - - $newConds = ''; - foreach ($this->tokens[$x]['conditions'] as $condition) { - $newConds .= Util\Tokens::tokenName($condition).','; - } - - $newConds = rtrim($newConds, ','); - - echo "\t\t* cleaned $x ($type) *".PHP_EOL; - echo "\t\t\t=> conditions changed from $oldConds to $newConds".PHP_EOL; - } - - break; - }//end if - }//end foreach - }//end for - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END ADDITIONAL PHP PROCESSING ***".PHP_EOL; - } - - }//end processAdditional() - - - /** - * Takes a token produced from token_get_all() and produces a - * more uniform token. - * - * @param string|array $token The token to convert. - * - * @return array The new token. - */ - public static function standardiseToken($token) - { - if (isset($token[1]) === false) { - if (isset(self::$resolveTokenCache[$token[0]]) === true) { - return self::$resolveTokenCache[$token[0]]; - } - } else { - $cacheKey = null; - if ($token[0] === T_STRING) { - $cacheKey = strtolower($token[1]); - } else if ($token[0] !== T_CURLY_OPEN) { - $cacheKey = $token[0]; - } - - if ($cacheKey !== null && isset(self::$resolveTokenCache[$cacheKey]) === true) { - $newToken = self::$resolveTokenCache[$cacheKey]; - $newToken['content'] = $token[1]; - return $newToken; - } - } - - if (isset($token[1]) === false) { - return self::resolveSimpleToken($token[0]); - } - - if ($token[0] === T_STRING) { - switch ($cacheKey) { - case 'false': - $newToken['type'] = 'T_FALSE'; - break; - case 'true': - $newToken['type'] = 'T_TRUE'; - break; - case 'null': - $newToken['type'] = 'T_NULL'; - break; - case 'self': - $newToken['type'] = 'T_SELF'; - break; - case 'parent': - $newToken['type'] = 'T_PARENT'; - break; - default: - $newToken['type'] = 'T_STRING'; - break; - } - - $newToken['code'] = constant($newToken['type']); - - self::$resolveTokenCache[$cacheKey] = $newToken; - } else if ($token[0] === T_CURLY_OPEN) { - $newToken = [ - 'code' => T_OPEN_CURLY_BRACKET, - 'type' => 'T_OPEN_CURLY_BRACKET', - ]; - } else { - $newToken = [ - 'code' => $token[0], - 'type' => Util\Tokens::tokenName($token[0]), - ]; - - self::$resolveTokenCache[$token[0]] = $newToken; - }//end if - - $newToken['content'] = $token[1]; - return $newToken; - - }//end standardiseToken() - - - /** - * Converts simple tokens into a format that conforms to complex tokens - * produced by token_get_all(). - * - * Simple tokens are tokens that are not in array form when produced from - * token_get_all(). - * - * @param string $token The simple token to convert. - * - * @return array The new token in array format. - */ - public static function resolveSimpleToken($token) - { - $newToken = []; - - switch ($token) { - case '{': - $newToken['type'] = 'T_OPEN_CURLY_BRACKET'; - break; - case '}': - $newToken['type'] = 'T_CLOSE_CURLY_BRACKET'; - break; - case '[': - $newToken['type'] = 'T_OPEN_SQUARE_BRACKET'; - break; - case ']': - $newToken['type'] = 'T_CLOSE_SQUARE_BRACKET'; - break; - case '(': - $newToken['type'] = 'T_OPEN_PARENTHESIS'; - break; - case ')': - $newToken['type'] = 'T_CLOSE_PARENTHESIS'; - break; - case ':': - $newToken['type'] = 'T_COLON'; - break; - case '.': - $newToken['type'] = 'T_STRING_CONCAT'; - break; - case ';': - $newToken['type'] = 'T_SEMICOLON'; - break; - case '=': - $newToken['type'] = 'T_EQUAL'; - break; - case '*': - $newToken['type'] = 'T_MULTIPLY'; - break; - case '/': - $newToken['type'] = 'T_DIVIDE'; - break; - case '+': - $newToken['type'] = 'T_PLUS'; - break; - case '-': - $newToken['type'] = 'T_MINUS'; - break; - case '%': - $newToken['type'] = 'T_MODULUS'; - break; - case '^': - $newToken['type'] = 'T_BITWISE_XOR'; - break; - case '&': - $newToken['type'] = 'T_BITWISE_AND'; - break; - case '|': - $newToken['type'] = 'T_BITWISE_OR'; - break; - case '~': - $newToken['type'] = 'T_BITWISE_NOT'; - break; - case '<': - $newToken['type'] = 'T_LESS_THAN'; - break; - case '>': - $newToken['type'] = 'T_GREATER_THAN'; - break; - case '!': - $newToken['type'] = 'T_BOOLEAN_NOT'; - break; - case ',': - $newToken['type'] = 'T_COMMA'; - break; - case '@': - $newToken['type'] = 'T_ASPERAND'; - break; - case '$': - $newToken['type'] = 'T_DOLLAR'; - break; - case '`': - $newToken['type'] = 'T_BACKTICK'; - break; - default: - $newToken['type'] = 'T_NONE'; - break; - }//end switch - - $newToken['code'] = constant($newToken['type']); - $newToken['content'] = $token; - - self::$resolveTokenCache[$token] = $newToken; - return $newToken; - - }//end resolveSimpleToken() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Tokenizers/Tokenizer.php b/vendor/squizlabs/php_codesniffer/src/Tokenizers/Tokenizer.php deleted file mode 100644 index 82b2b9c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Tokenizers/Tokenizer.php +++ /dev/null @@ -1,1702 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tokenizers; - -use PHP_CodeSniffer\Exceptions\TokenizerException; -use PHP_CodeSniffer\Util; - -abstract class Tokenizer -{ - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - protected $config = null; - - /** - * The EOL char used in the content. - * - * @var string - */ - protected $eolChar = []; - - /** - * A token-based representation of the content. - * - * @var array - */ - protected $tokens = []; - - /** - * The number of tokens in the tokens array. - * - * @var integer - */ - protected $numTokens = 0; - - /** - * A list of tokens that are allowed to open a scope. - * - * @var array - */ - public $scopeOpeners = []; - - /** - * A list of tokens that end the scope. - * - * @var array - */ - public $endScopeTokens = []; - - /** - * Known lengths of tokens. - * - * @var array - */ - public $knownLengths = []; - - /** - * A list of lines being ignored due to error suppression comments. - * - * @var array - */ - public $ignoredLines = []; - - - /** - * Initialise and run the tokenizer. - * - * @param string $content The content to tokenize, - * @param \PHP_CodeSniffer\Config | null $config The config data for the run. - * @param string $eolChar The EOL char used in the content. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the file appears to be minified. - */ - public function __construct($content, $config, $eolChar='\n') - { - $this->eolChar = $eolChar; - - $this->config = $config; - $this->tokens = $this->tokenize($content); - - if ($config === null) { - return; - } - - $this->createPositionMap(); - $this->createTokenMap(); - $this->createParenthesisNestingMap(); - $this->createScopeMap(); - $this->createLevelMap(); - - // Allow the tokenizer to do additional processing if required. - $this->processAdditional(); - - }//end __construct() - - - /** - * Checks the content to see if it looks minified. - * - * @param string $content The content to tokenize. - * @param string $eolChar The EOL char used in the content. - * - * @return boolean - */ - protected function isMinifiedContent($content, $eolChar='\n') - { - // Minified files often have a very large number of characters per line - // and cause issues when tokenizing. - $numChars = strlen($content); - $numLines = (substr_count($content, $eolChar) + 1); - $average = ($numChars / $numLines); - if ($average > 100) { - return true; - } - - return false; - - }//end isMinifiedContent() - - - /** - * Gets the array of tokens. - * - * @return array - */ - public function getTokens() - { - return $this->tokens; - - }//end getTokens() - - - /** - * Creates an array of tokens when given some content. - * - * @param string $string The string to tokenize. - * - * @return array - */ - abstract protected function tokenize($string); - - - /** - * Performs additional processing after main tokenizing. - * - * @return void - */ - abstract protected function processAdditional(); - - - /** - * Sets token position information. - * - * Can also convert tabs into spaces. Each tab can represent between - * 1 and $width spaces, so this cannot be a straight string replace. - * - * @return void - */ - private function createPositionMap() - { - $currColumn = 1; - $lineNumber = 1; - $eolLen = strlen($this->eolChar); - $ignoring = null; - $inTests = defined('PHP_CODESNIFFER_IN_TESTS'); - - $checkEncoding = false; - if (function_exists('iconv_strlen') === true) { - $checkEncoding = true; - } - - $checkAnnotations = $this->config->annotations; - $encoding = $this->config->encoding; - $tabWidth = $this->config->tabWidth; - - $tokensWithTabs = [ - T_WHITESPACE => true, - T_COMMENT => true, - T_DOC_COMMENT => true, - T_DOC_COMMENT_WHITESPACE => true, - T_DOC_COMMENT_STRING => true, - T_CONSTANT_ENCAPSED_STRING => true, - T_DOUBLE_QUOTED_STRING => true, - T_HEREDOC => true, - T_NOWDOC => true, - T_INLINE_HTML => true, - ]; - - $this->numTokens = count($this->tokens); - for ($i = 0; $i < $this->numTokens; $i++) { - $this->tokens[$i]['line'] = $lineNumber; - $this->tokens[$i]['column'] = $currColumn; - - if (isset($this->knownLengths[$this->tokens[$i]['code']]) === true) { - // There are no tabs in the tokens we know the length of. - $length = $this->knownLengths[$this->tokens[$i]['code']]; - $currColumn += $length; - } else if ($tabWidth === 0 - || isset($tokensWithTabs[$this->tokens[$i]['code']]) === false - || strpos($this->tokens[$i]['content'], "\t") === false - ) { - // There are no tabs in this content, or we aren't replacing them. - if ($checkEncoding === true) { - // Not using the default encoding, so take a bit more care. - $oldLevel = error_reporting(); - error_reporting(0); - $length = iconv_strlen($this->tokens[$i]['content'], $encoding); - error_reporting($oldLevel); - - if ($length === false) { - // String contained invalid characters, so revert to default. - $length = strlen($this->tokens[$i]['content']); - } - } else { - $length = strlen($this->tokens[$i]['content']); - } - - $currColumn += $length; - } else { - $this->replaceTabsInToken($this->tokens[$i]); - $length = $this->tokens[$i]['length']; - $currColumn += $length; - }//end if - - $this->tokens[$i]['length'] = $length; - - if (isset($this->knownLengths[$this->tokens[$i]['code']]) === false - && strpos($this->tokens[$i]['content'], $this->eolChar) !== false - ) { - $lineNumber++; - $currColumn = 1; - - // Newline chars are not counted in the token length. - $this->tokens[$i]['length'] -= $eolLen; - } - - if ($this->tokens[$i]['code'] === T_COMMENT - || $this->tokens[$i]['code'] === T_DOC_COMMENT_STRING - || $this->tokens[$i]['code'] === T_DOC_COMMENT_TAG - || ($inTests === true && $this->tokens[$i]['code'] === T_INLINE_HTML) - ) { - $commentText = ltrim($this->tokens[$i]['content'], " \t/*"); - $commentText = rtrim($commentText, " */\t\r\n"); - $commentTextLower = strtolower($commentText); - if (strpos($commentText, '@codingStandards') !== false) { - // If this comment is the only thing on the line, it tells us - // to ignore the following line. If the line contains other content - // then we are just ignoring this one single line. - $ownLine = false; - if ($i > 0) { - for ($prev = ($i - 1); $prev >= 0; $prev--) { - if ($this->tokens[$prev]['code'] === T_WHITESPACE) { - continue; - } - - break; - } - - if ($this->tokens[$prev]['line'] !== $this->tokens[$i]['line']) { - $ownLine = true; - } - } - - if ($ignoring === null - && strpos($commentText, '@codingStandardsIgnoreStart') !== false - ) { - $ignoring = ['.all' => true]; - if ($ownLine === true) { - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - } - } else if ($ignoring !== null - && strpos($commentText, '@codingStandardsIgnoreEnd') !== false - ) { - if ($ownLine === true) { - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; - } else { - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - } - - $ignoring = null; - } else if ($ignoring === null - && strpos($commentText, '@codingStandardsIgnoreLine') !== false - ) { - $ignoring = ['.all' => true]; - if ($ownLine === true) { - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - $this->ignoredLines[($this->tokens[$i]['line'] + 1)] = $ignoring; - } else { - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - } - - $ignoring = null; - }//end if - } else if (substr($commentTextLower, 0, 6) === 'phpcs:' - || substr($commentTextLower, 0, 7) === '@phpcs:' - ) { - // If the @phpcs: syntax is being used, strip the @ to make - // comparisons easier. - if ($commentText[0] === '@') { - $commentText = substr($commentText, 1); - $commentTextLower = strtolower($commentText); - } - - // If there is a comment on the end, strip it off. - $commentStart = strpos($commentTextLower, ' --'); - if ($commentStart !== false) { - $commentText = substr($commentText, 0, $commentStart); - $commentTextLower = strtolower($commentText); - } - - // If this comment is the only thing on the line, it tells us - // to ignore the following line. If the line contains other content - // then we are just ignoring this one single line. - $lineHasOtherContent = false; - $lineHasOtherTokens = false; - if ($i > 0) { - for ($prev = ($i - 1); $prev > 0; $prev--) { - if ($this->tokens[$prev]['line'] !== $this->tokens[$i]['line']) { - // Changed lines. - break; - } - - if ($this->tokens[$prev]['code'] === T_WHITESPACE - || $this->tokens[$prev]['code'] === T_DOC_COMMENT_WHITESPACE - || ($this->tokens[$prev]['code'] === T_INLINE_HTML - && trim($this->tokens[$prev]['content']) === '') - ) { - continue; - } - - $lineHasOtherTokens = true; - - if ($this->tokens[$prev]['code'] === T_OPEN_TAG - || $this->tokens[$prev]['code'] === T_DOC_COMMENT_STAR - ) { - continue; - } - - $lineHasOtherContent = true; - break; - }//end for - - $changedLines = false; - for ($next = $i; $next < $this->numTokens; $next++) { - if ($changedLines === true) { - // Changed lines. - break; - } - - if (isset($this->knownLengths[$this->tokens[$next]['code']]) === false - && strpos($this->tokens[$next]['content'], $this->eolChar) !== false - ) { - // Last token on the current line. - $changedLines = true; - } - - if ($next === $i) { - continue; - } - - if ($this->tokens[$next]['code'] === T_WHITESPACE - || $this->tokens[$next]['code'] === T_DOC_COMMENT_WHITESPACE - || ($this->tokens[$next]['code'] === T_INLINE_HTML - && trim($this->tokens[$next]['content']) === '') - ) { - continue; - } - - $lineHasOtherTokens = true; - - if ($this->tokens[$next]['code'] === T_CLOSE_TAG) { - continue; - } - - $lineHasOtherContent = true; - break; - }//end for - }//end if - - if (substr($commentTextLower, 0, 9) === 'phpcs:set') { - // Ignore standards for complete lines that change sniff settings. - if ($lineHasOtherTokens === false) { - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; - } - - // Need to maintain case here, to get the correct sniff code. - $parts = explode(' ', substr($commentText, 10)); - if (count($parts) >= 2) { - $sniffParts = explode('.', $parts[0]); - if (count($sniffParts) >= 3) { - $this->tokens[$i]['sniffCode'] = array_shift($parts); - $this->tokens[$i]['sniffProperty'] = array_shift($parts); - $this->tokens[$i]['sniffPropertyValue'] = rtrim(implode(' ', $parts), " */\r\n"); - } - } - - $this->tokens[$i]['code'] = T_PHPCS_SET; - $this->tokens[$i]['type'] = 'T_PHPCS_SET'; - } else if (substr($commentTextLower, 0, 16) === 'phpcs:ignorefile') { - // The whole file will be ignored, but at least set the correct token. - $this->tokens[$i]['code'] = T_PHPCS_IGNORE_FILE; - $this->tokens[$i]['type'] = 'T_PHPCS_IGNORE_FILE'; - } else if (substr($commentTextLower, 0, 13) === 'phpcs:disable') { - if ($lineHasOtherContent === false) { - // Completely ignore the comment line. - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; - } - - if ($ignoring === null) { - $ignoring = []; - } - - $disabledSniffs = []; - - $additionalText = substr($commentText, 14); - if ($additionalText === false) { - $ignoring = ['.all' => true]; - } else { - $parts = explode(',', substr($commentText, 13)); - foreach ($parts as $sniffCode) { - $sniffCode = trim($sniffCode); - $disabledSniffs[$sniffCode] = true; - $ignoring[$sniffCode] = true; - - // This newly disabled sniff might be disabling an existing - // enabled exception that we are tracking. - if (isset($ignoring['.except']) === true) { - foreach (array_keys($ignoring['.except']) as $ignoredSniffCode) { - if ($ignoredSniffCode === $sniffCode - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 - ) { - unset($ignoring['.except'][$ignoredSniffCode]); - } - } - - if (empty($ignoring['.except']) === true) { - unset($ignoring['.except']); - } - } - }//end foreach - }//end if - - $this->tokens[$i]['code'] = T_PHPCS_DISABLE; - $this->tokens[$i]['type'] = 'T_PHPCS_DISABLE'; - $this->tokens[$i]['sniffCodes'] = $disabledSniffs; - } else if (substr($commentTextLower, 0, 12) === 'phpcs:enable') { - if ($ignoring !== null) { - $enabledSniffs = []; - - $additionalText = substr($commentText, 13); - if ($additionalText === false) { - $ignoring = null; - } else { - $parts = explode(',', substr($commentText, 13)); - foreach ($parts as $sniffCode) { - $sniffCode = trim($sniffCode); - $enabledSniffs[$sniffCode] = true; - - // This new enabled sniff might remove previously disabled - // sniffs if it is actually a standard or category of sniffs. - foreach (array_keys($ignoring) as $ignoredSniffCode) { - if ($ignoredSniffCode === $sniffCode - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 - ) { - unset($ignoring[$ignoredSniffCode]); - } - } - - // This new enabled sniff might be able to clear up - // previously enabled sniffs if it is actually a standard or - // category of sniffs. - if (isset($ignoring['.except']) === true) { - foreach (array_keys($ignoring['.except']) as $ignoredSniffCode) { - if ($ignoredSniffCode === $sniffCode - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 - ) { - unset($ignoring['.except'][$ignoredSniffCode]); - } - } - } - }//end foreach - - if (empty($ignoring) === true) { - $ignoring = null; - } else { - if (isset($ignoring['.except']) === true) { - $ignoring['.except'] += $enabledSniffs; - } else { - $ignoring['.except'] = $enabledSniffs; - } - } - }//end if - - if ($lineHasOtherContent === false) { - // Completely ignore the comment line. - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; - } else { - // The comment is on the same line as the code it is ignoring, - // so respect the new ignore rules. - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - } - - $this->tokens[$i]['sniffCodes'] = $enabledSniffs; - }//end if - - $this->tokens[$i]['code'] = T_PHPCS_ENABLE; - $this->tokens[$i]['type'] = 'T_PHPCS_ENABLE'; - } else if (substr($commentTextLower, 0, 12) === 'phpcs:ignore') { - $ignoreRules = []; - - $additionalText = substr($commentText, 13); - if ($additionalText === false) { - $ignoreRules = ['.all' => true]; - } else { - $parts = explode(',', substr($commentText, 13)); - foreach ($parts as $sniffCode) { - $ignoreRules[trim($sniffCode)] = true; - } - } - - $this->tokens[$i]['code'] = T_PHPCS_IGNORE; - $this->tokens[$i]['type'] = 'T_PHPCS_IGNORE'; - $this->tokens[$i]['sniffCodes'] = $ignoreRules; - - if ($ignoring !== null) { - $ignoreRules += $ignoring; - } - - if ($lineHasOtherContent === false) { - // Completely ignore the comment line, and set the following - // line to include the ignore rules we've set. - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; - $this->ignoredLines[($this->tokens[$i]['line'] + 1)] = $ignoreRules; - } else { - // The comment is on the same line as the code it is ignoring, - // so respect the ignore rules it set. - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoreRules; - } - }//end if - }//end if - }//end if - - if ($ignoring !== null && isset($this->ignoredLines[$this->tokens[$i]['line']]) === false) { - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - } - }//end for - - // If annotations are being ignored, we clear out all the ignore rules - // but leave the annotations tokenized as normal. - if ($checkAnnotations === false) { - $this->ignoredLines = []; - } - - }//end createPositionMap() - - - /** - * Replaces tabs in original token content with spaces. - * - * Each tab can represent between 1 and $config->tabWidth spaces, - * so this cannot be a straight string replace. The original content - * is placed into an orig_content index and the new token length is also - * set in the length index. - * - * @param array $token The token to replace tabs inside. - * @param string $prefix The character to use to represent the start of a tab. - * @param string $padding The character to use to represent the end of a tab. - * @param int $tabWidth The number of spaces each tab represents. - * - * @return void - */ - public function replaceTabsInToken(&$token, $prefix=' ', $padding=' ', $tabWidth=null) - { - $checkEncoding = false; - if (function_exists('iconv_strlen') === true) { - $checkEncoding = true; - } - - $currColumn = $token['column']; - if ($tabWidth === null) { - $tabWidth = $this->config->tabWidth; - if ($tabWidth === 0) { - $tabWidth = 1; - } - } - - if (rtrim($token['content'], "\t") === '') { - // String only contains tabs, so we can shortcut the process. - $numTabs = strlen($token['content']); - - $firstTabSize = ($tabWidth - (($currColumn - 1) % $tabWidth)); - $length = ($firstTabSize + ($tabWidth * ($numTabs - 1))); - $newContent = $prefix.str_repeat($padding, ($length - 1)); - } else { - // We need to determine the length of each tab. - $tabs = explode("\t", $token['content']); - - $numTabs = (count($tabs) - 1); - $tabNum = 0; - $newContent = ''; - $length = 0; - - foreach ($tabs as $content) { - if ($content !== '') { - $newContent .= $content; - if ($checkEncoding === true) { - // Not using the default encoding, so take a bit more care. - $oldLevel = error_reporting(); - error_reporting(0); - $contentLength = iconv_strlen($content, $this->config->encoding); - error_reporting($oldLevel); - if ($contentLength === false) { - // String contained invalid characters, so revert to default. - $contentLength = strlen($content); - } - } else { - $contentLength = strlen($content); - } - - $currColumn += $contentLength; - $length += $contentLength; - } - - // The last piece of content does not have a tab after it. - if ($tabNum === $numTabs) { - break; - } - - // Process the tab that comes after the content. - $lastCurrColumn = $currColumn; - $tabNum++; - - // Move the pointer to the next tab stop. - if (($currColumn % $tabWidth) === 0) { - // This is the first tab, and we are already at a - // tab stop, so this tab counts as a single space. - $currColumn++; - } else { - $currColumn++; - while (($currColumn % $tabWidth) !== 0) { - $currColumn++; - } - - $currColumn++; - } - - $length += ($currColumn - $lastCurrColumn); - $newContent .= $prefix.str_repeat($padding, ($currColumn - $lastCurrColumn - 1)); - }//end foreach - }//end if - - $token['orig_content'] = $token['content']; - $token['content'] = $newContent; - $token['length'] = $length; - - }//end replaceTabsInToken() - - - /** - * Creates a map of brackets positions. - * - * @return void - */ - private function createTokenMap() - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START TOKEN MAP ***".PHP_EOL; - } - - $squareOpeners = []; - $curlyOpeners = []; - $this->numTokens = count($this->tokens); - - $openers = []; - $openOwner = null; - - for ($i = 0; $i < $this->numTokens; $i++) { - /* - Parenthesis mapping. - */ - - if (isset(Util\Tokens::$parenthesisOpeners[$this->tokens[$i]['code']]) === true) { - $this->tokens[$i]['parenthesis_opener'] = null; - $this->tokens[$i]['parenthesis_closer'] = null; - $this->tokens[$i]['parenthesis_owner'] = $i; - $openOwner = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", (count($openers) + 1)); - echo "=> Found parenthesis owner at $i".PHP_EOL; - } - } else if ($this->tokens[$i]['code'] === T_OPEN_PARENTHESIS) { - $openers[] = $i; - $this->tokens[$i]['parenthesis_opener'] = $i; - if ($openOwner !== null) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($openers)); - echo "=> Found parenthesis opener at $i for $openOwner".PHP_EOL; - } - - $this->tokens[$openOwner]['parenthesis_opener'] = $i; - $this->tokens[$i]['parenthesis_owner'] = $openOwner; - $openOwner = null; - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($openers)); - echo "=> Found unowned parenthesis opener at $i".PHP_EOL; - } - } else if ($this->tokens[$i]['code'] === T_CLOSE_PARENTHESIS) { - // Did we set an owner for this set of parenthesis? - $numOpeners = count($openers); - if ($numOpeners !== 0) { - $opener = array_pop($openers); - if (isset($this->tokens[$opener]['parenthesis_owner']) === true) { - $owner = $this->tokens[$opener]['parenthesis_owner']; - - $this->tokens[$owner]['parenthesis_closer'] = $i; - $this->tokens[$i]['parenthesis_owner'] = $owner; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", (count($openers) + 1)); - echo "=> Found parenthesis closer at $i for $owner".PHP_EOL; - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", (count($openers) + 1)); - echo "=> Found unowned parenthesis closer at $i for $opener".PHP_EOL; - } - - $this->tokens[$i]['parenthesis_opener'] = $opener; - $this->tokens[$i]['parenthesis_closer'] = $i; - $this->tokens[$opener]['parenthesis_closer'] = $i; - }//end if - }//end if - - /* - Bracket mapping. - */ - - switch ($this->tokens[$i]['code']) { - case T_OPEN_SQUARE_BRACKET: - $squareOpeners[] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($squareOpeners)); - echo str_repeat("\t", count($curlyOpeners)); - echo "=> Found square bracket opener at $i".PHP_EOL; - } - break; - case T_OPEN_CURLY_BRACKET: - if (isset($this->tokens[$i]['scope_closer']) === false) { - $curlyOpeners[] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($squareOpeners)); - echo str_repeat("\t", count($curlyOpeners)); - echo "=> Found curly bracket opener at $i".PHP_EOL; - } - } - break; - case T_CLOSE_SQUARE_BRACKET: - if (empty($squareOpeners) === false) { - $opener = array_pop($squareOpeners); - $this->tokens[$i]['bracket_opener'] = $opener; - $this->tokens[$i]['bracket_closer'] = $i; - $this->tokens[$opener]['bracket_opener'] = $opener; - $this->tokens[$opener]['bracket_closer'] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($squareOpeners)); - echo str_repeat("\t", count($curlyOpeners)); - echo "\t=> Found square bracket closer at $i for $opener".PHP_EOL; - } - } - break; - case T_CLOSE_CURLY_BRACKET: - if (empty($curlyOpeners) === false - && isset($this->tokens[$i]['scope_opener']) === false - ) { - $opener = array_pop($curlyOpeners); - $this->tokens[$i]['bracket_opener'] = $opener; - $this->tokens[$i]['bracket_closer'] = $i; - $this->tokens[$opener]['bracket_opener'] = $opener; - $this->tokens[$opener]['bracket_closer'] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($squareOpeners)); - echo str_repeat("\t", count($curlyOpeners)); - echo "\t=> Found curly bracket closer at $i for $opener".PHP_EOL; - } - } - break; - default: - continue 2; - }//end switch - }//end for - - // Cleanup for any openers that we didn't find closers for. - // This typically means there was a syntax error breaking things. - foreach ($openers as $opener) { - unset($this->tokens[$opener]['parenthesis_opener']); - unset($this->tokens[$opener]['parenthesis_owner']); - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END TOKEN MAP ***".PHP_EOL; - } - - }//end createTokenMap() - - - /** - * Creates a map for the parenthesis tokens that surround other tokens. - * - * @return void - */ - private function createParenthesisNestingMap() - { - $map = []; - for ($i = 0; $i < $this->numTokens; $i++) { - if (isset($this->tokens[$i]['parenthesis_opener']) === true - && $i === $this->tokens[$i]['parenthesis_opener'] - ) { - if (empty($map) === false) { - $this->tokens[$i]['nested_parenthesis'] = $map; - } - - if (isset($this->tokens[$i]['parenthesis_closer']) === true) { - $map[$this->tokens[$i]['parenthesis_opener']] - = $this->tokens[$i]['parenthesis_closer']; - } - } else if (isset($this->tokens[$i]['parenthesis_closer']) === true - && $i === $this->tokens[$i]['parenthesis_closer'] - ) { - array_pop($map); - if (empty($map) === false) { - $this->tokens[$i]['nested_parenthesis'] = $map; - } - } else { - if (empty($map) === false) { - $this->tokens[$i]['nested_parenthesis'] = $map; - } - }//end if - }//end for - - }//end createParenthesisNestingMap() - - - /** - * Creates a scope map of tokens that open scopes. - * - * @return void - * @see recurseScopeMap() - */ - private function createScopeMap() - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START SCOPE MAP ***".PHP_EOL; - } - - for ($i = 0; $i < $this->numTokens; $i++) { - // Check to see if the current token starts a new scope. - if (isset($this->scopeOpeners[$this->tokens[$i]['code']]) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$i]['type']; - $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); - echo "\tStart scope map at $i:$type => $content".PHP_EOL; - } - - if (isset($this->tokens[$i]['scope_condition']) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* already processed, skipping *".PHP_EOL; - } - - continue; - } - - $i = $this->recurseScopeMap($i); - }//end if - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END SCOPE MAP ***".PHP_EOL; - } - - }//end createScopeMap() - - - /** - * Recurses though the scope openers to build a scope map. - * - * @param int $stackPtr The position in the stack of the token that - * opened the scope (eg. an IF token or FOR token). - * @param int $depth How many scope levels down we are. - * @param int $ignore How many curly braces we are ignoring. - * - * @return int The position in the stack that closed the scope. - * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the nesting level gets too deep. - */ - private function recurseScopeMap($stackPtr, $depth=1, &$ignore=0) - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "=> Begin scope map recursion at token $stackPtr with depth $depth".PHP_EOL; - } - - $opener = null; - $currType = $this->tokens[$stackPtr]['code']; - $startLine = $this->tokens[$stackPtr]['line']; - - // We will need this to restore the value if we end up - // returning a token ID that causes our calling function to go back - // over already ignored braces. - $originalIgnore = $ignore; - - // If the start token for this scope opener is the same as - // the scope token, we have already found our opener. - if (isset($this->scopeOpeners[$currType]['start'][$currType]) === true) { - $opener = $stackPtr; - } - - for ($i = ($stackPtr + 1); $i < $this->numTokens; $i++) { - $tokenType = $this->tokens[$i]['code']; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$i]['type']; - $line = $this->tokens[$i]['line']; - $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); - - echo str_repeat("\t", $depth); - echo "Process token $i on line $line ["; - if ($opener !== null) { - echo "opener:$opener;"; - } - - if ($ignore > 0) { - echo "ignore=$ignore;"; - } - - echo "]: $type => $content".PHP_EOL; - }//end if - - // Very special case for IF statements in PHP that can be defined without - // scope tokens. E.g., if (1) 1; 1 ? (1 ? 1 : 1) : 1; - // If an IF statement below this one has an opener but no - // keyword, the opener will be incorrectly assigned to this IF statement. - // The same case also applies to USE statements, which don't have to have - // openers, so a following USE statement can cause an incorrect brace match. - if (($currType === T_IF || $currType === T_ELSE || $currType === T_USE) - && $opener === null - && ($this->tokens[$i]['code'] === T_SEMICOLON - || $this->tokens[$i]['code'] === T_CLOSE_TAG) - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - if ($this->tokens[$i]['code'] === T_SEMICOLON) { - $closerType = 'semicolon'; - } else { - $closerType = 'close tag'; - } - - echo "=> Found $closerType before scope opener for $stackPtr:$type, bailing".PHP_EOL; - } - - return $i; - } - - // Special case for PHP control structures that have no braces. - // If we find a curly brace closer before we find the opener, - // we're not going to find an opener. That closer probably belongs to - // a control structure higher up. - if ($opener === null - && $ignore === 0 - && $tokenType === T_CLOSE_CURLY_BRACKET - && isset($this->scopeOpeners[$currType]['end'][$tokenType]) === true - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found curly brace closer before scope opener for $stackPtr:$type, bailing".PHP_EOL; - } - - return ($i - 1); - } - - if ($opener !== null - && (isset($this->tokens[$i]['scope_opener']) === false - || $this->scopeOpeners[$this->tokens[$stackPtr]['code']]['shared'] === true) - && isset($this->scopeOpeners[$currType]['end'][$tokenType]) === true - ) { - if ($ignore > 0 && $tokenType === T_CLOSE_CURLY_BRACKET) { - // The last opening bracket must have been for a string - // offset or alike, so let's ignore it. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* finished ignoring curly brace *'.PHP_EOL; - } - - $ignore--; - continue; - } else if ($this->tokens[$opener]['code'] === T_OPEN_CURLY_BRACKET - && $tokenType !== T_CLOSE_CURLY_BRACKET - ) { - // The opener is a curly bracket so the closer must be a curly bracket as well. - // We ignore this closer to handle cases such as T_ELSE or T_ELSEIF being considered - // a closer of T_IF when it should not. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Ignoring non-curly scope closer for $stackPtr:$type".PHP_EOL; - } - } else { - $scopeCloser = $i; - $todo = [ - $stackPtr, - $opener, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - $closerType = $this->tokens[$scopeCloser]['type']; - echo str_repeat("\t", $depth); - echo "=> Found scope closer ($scopeCloser:$closerType) for $stackPtr:$type".PHP_EOL; - } - - $validCloser = true; - if (($this->tokens[$stackPtr]['code'] === T_IF || $this->tokens[$stackPtr]['code'] === T_ELSEIF) - && ($tokenType === T_ELSE || $tokenType === T_ELSEIF) - ) { - // To be a closer, this token must have an opener. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "* closer needs to be tested *".PHP_EOL; - } - - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); - - if (isset($this->tokens[$scopeCloser]['scope_opener']) === false) { - $validCloser = false; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "* closer is not valid (no opener found) *".PHP_EOL; - } - } else if ($this->tokens[$this->tokens[$scopeCloser]['scope_opener']]['code'] !== $this->tokens[$opener]['code']) { - $validCloser = false; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - $type = $this->tokens[$this->tokens[$scopeCloser]['scope_opener']]['type']; - $openerType = $this->tokens[$opener]['type']; - echo "* closer is not valid (mismatched opener type; $type != $openerType) *".PHP_EOL; - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "* closer was valid *".PHP_EOL; - } - } else { - // The closer was not processed, so we need to - // complete that token as well. - $todo[] = $scopeCloser; - }//end if - - if ($validCloser === true) { - foreach ($todo as $token) { - $this->tokens[$token]['scope_condition'] = $stackPtr; - $this->tokens[$token]['scope_opener'] = $opener; - $this->tokens[$token]['scope_closer'] = $scopeCloser; - } - - if ($this->scopeOpeners[$this->tokens[$stackPtr]['code']]['shared'] === true) { - // As we are going back to where we started originally, restore - // the ignore value back to its original value. - $ignore = $originalIgnore; - return $opener; - } else if ($scopeCloser === $i - && isset($this->scopeOpeners[$tokenType]) === true - ) { - // Unset scope_condition here or else the token will appear to have - // already been processed, and it will be skipped. Normally we want that, - // but in this case, the token is both a closer and an opener, so - // it needs to act like an opener. This is also why we return the - // token before this one; so the closer has a chance to be processed - // a second time, but as an opener. - unset($this->tokens[$scopeCloser]['scope_condition']); - return ($i - 1); - } else { - return $i; - } - } else { - continue; - }//end if - }//end if - }//end if - - // Is this an opening condition ? - if (isset($this->scopeOpeners[$tokenType]) === true) { - if ($opener === null) { - if ($tokenType === T_USE) { - // PHP use keywords are special because they can be - // used as blocks but also inline in function definitions. - // So if we find them nested inside another opener, just skip them. - continue; - } - - if ($tokenType === T_FUNCTION - && $this->tokens[$stackPtr]['code'] !== T_FUNCTION - ) { - // Probably a closure, so process it manually. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found function before scope opener for $stackPtr:$type, processing manually".PHP_EOL; - } - - if (isset($this->tokens[$i]['scope_closer']) === true) { - // We've already processed this closure. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* already processed, skipping *'.PHP_EOL; - } - - $i = $this->tokens[$i]['scope_closer']; - continue; - } - - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); - continue; - }//end if - - if ($tokenType === T_CLASS) { - // Probably an anonymous class inside another anonymous class, - // so process it manually. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found class before scope opener for $stackPtr:$type, processing manually".PHP_EOL; - } - - if (isset($this->tokens[$i]['scope_closer']) === true) { - // We've already processed this anon class. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* already processed, skipping *'.PHP_EOL; - } - - $i = $this->tokens[$i]['scope_closer']; - continue; - } - - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); - continue; - }//end if - - // Found another opening condition but still haven't - // found our opener, so we are never going to find one. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found new opening condition before scope opener for $stackPtr:$type, "; - } - - if (($this->tokens[$stackPtr]['code'] === T_IF - || $this->tokens[$stackPtr]['code'] === T_ELSEIF - || $this->tokens[$stackPtr]['code'] === T_ELSE) - && ($this->tokens[$i]['code'] === T_ELSE - || $this->tokens[$i]['code'] === T_ELSEIF) - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "continuing".PHP_EOL; - } - - return ($i - 1); - } else { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "backtracking".PHP_EOL; - } - - return $stackPtr; - } - }//end if - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* token is an opening condition *'.PHP_EOL; - } - - $isShared = ($this->scopeOpeners[$tokenType]['shared'] === true); - - if (isset($this->tokens[$i]['scope_condition']) === true) { - // We've been here before. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* already processed, skipping *'.PHP_EOL; - } - - if ($isShared === false - && isset($this->tokens[$i]['scope_closer']) === true - ) { - $i = $this->tokens[$i]['scope_closer']; - } - - continue; - } else if ($currType === $tokenType - && $isShared === false - && $opener === null - ) { - // We haven't yet found our opener, but we have found another - // scope opener which is the same type as us, and we don't - // share openers, so we will never find one. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* it was another token\'s opener, bailing *'.PHP_EOL; - } - - return $stackPtr; - } else { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* searching for opener *'.PHP_EOL; - } - - if (isset($this->scopeOpeners[$tokenType]['end'][T_CLOSE_CURLY_BRACKET]) === true) { - $oldIgnore = $ignore; - $ignore = 0; - } - - // PHP has a max nesting level for functions. Stop before we hit that limit - // because too many loops means we've run into trouble anyway. - if ($depth > 50) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* reached maximum nesting level; aborting *'.PHP_EOL; - } - - throw new TokenizerException('Maximum nesting level reached; file could not be processed'); - } - - $oldDepth = $depth; - if ($isShared === true - && isset($this->scopeOpeners[$tokenType]['with'][$currType]) === true - ) { - // Don't allow the depth to increment because this is - // possibly not a true nesting if we are sharing our closer. - // This can happen, for example, when a SWITCH has a large - // number of CASE statements with the same shared BREAK. - $depth--; - } - - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); - $depth = $oldDepth; - - if (isset($this->scopeOpeners[$tokenType]['end'][T_CLOSE_CURLY_BRACKET]) === true) { - $ignore = $oldIgnore; - } - }//end if - }//end if - - if (isset($this->scopeOpeners[$currType]['start'][$tokenType]) === true - && $opener === null - ) { - if ($tokenType === T_OPEN_CURLY_BRACKET) { - if (isset($this->tokens[$stackPtr]['parenthesis_closer']) === true - && $i < $this->tokens[$stackPtr]['parenthesis_closer'] - ) { - // We found a curly brace inside the condition of the - // current scope opener, so it must be a string offset. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* ignoring curly brace inside condition *'.PHP_EOL; - } - - $ignore++; - } else { - // Make sure this is actually an opener and not a - // string offset (e.g., $var{0}). - for ($x = ($i - 1); $x > 0; $x--) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === true) { - continue; - } else { - // If the first non-whitespace/comment token looks like this - // brace is a string offset, or this brace is mid-way through - // a new statement, it isn't a scope opener. - $disallowed = Util\Tokens::$assignmentTokens; - $disallowed += [ - T_DOLLAR => true, - T_VARIABLE => true, - T_OBJECT_OPERATOR => true, - T_COMMA => true, - T_OPEN_PARENTHESIS => true, - ]; - - if (isset($disallowed[$this->tokens[$x]['code']]) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* ignoring curly brace *'.PHP_EOL; - } - - $ignore++; - } - - break; - }//end if - }//end for - }//end if - }//end if - - if ($ignore === 0 || $tokenType !== T_OPEN_CURLY_BRACKET) { - $openerNested = isset($this->tokens[$i]['nested_parenthesis']); - $ownerNested = isset($this->tokens[$stackPtr]['nested_parenthesis']); - - if (($openerNested === true && $ownerNested === false) - || ($openerNested === false && $ownerNested === true) - || ($openerNested === true - && $this->tokens[$i]['nested_parenthesis'] !== $this->tokens[$stackPtr]['nested_parenthesis']) - ) { - // We found the a token that looks like the opener, but it's nested differently. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$i]['type']; - echo str_repeat("\t", $depth); - echo "* ignoring possible opener $i:$type as nested parenthesis don't match *".PHP_EOL; - } - } else { - // We found the opening scope token for $currType. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found scope opener for $stackPtr:$type".PHP_EOL; - } - - $opener = $i; - } - }//end if - } else if ($tokenType === T_SEMICOLON - && $opener === null - && (isset($this->tokens[$stackPtr]['parenthesis_closer']) === false - || $i > $this->tokens[$stackPtr]['parenthesis_closer']) - ) { - // Found the end of a statement but still haven't - // found our opener, so we are never going to find one. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found end of statement before scope opener for $stackPtr:$type, continuing".PHP_EOL; - } - - return ($i - 1); - } else if ($tokenType === T_OPEN_PARENTHESIS) { - if (isset($this->tokens[$i]['parenthesis_owner']) === true) { - $owner = $this->tokens[$i]['parenthesis_owner']; - if (isset(Util\Tokens::$scopeOpeners[$this->tokens[$owner]['code']]) === true - && isset($this->tokens[$i]['parenthesis_closer']) === true - ) { - // If we get into here, then we opened a parenthesis for - // a scope (eg. an if or else if) so we need to update the - // start of the line so that when we check to see - // if the closing parenthesis is more than n lines away from - // the statement, we check from the closing parenthesis. - $startLine = $this->tokens[$this->tokens[$i]['parenthesis_closer']]['line']; - } - } - } else if ($tokenType === T_OPEN_CURLY_BRACKET && $opener !== null) { - // We opened something that we don't have a scope opener for. - // Examples of this are curly brackets for string offsets etc. - // We want to ignore this so that we don't have an invalid scope - // map. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* ignoring curly brace *'.PHP_EOL; - } - - $ignore++; - } else if ($tokenType === T_CLOSE_CURLY_BRACKET && $ignore > 0) { - // We found the end token for the opener we were ignoring. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* finished ignoring curly brace *'.PHP_EOL; - } - - $ignore--; - } else if ($opener === null - && isset($this->scopeOpeners[$currType]) === true - ) { - // If we still haven't found the opener after 30 lines, - // we're not going to find it, unless we know it requires - // an opener (in which case we better keep looking) or the last - // token was empty (in which case we'll just confirm there is - // more code in this file and not just a big comment). - if ($this->tokens[$i]['line'] >= ($startLine + 30) - && isset(Util\Tokens::$emptyTokens[$this->tokens[($i - 1)]['code']]) === false - ) { - if ($this->scopeOpeners[$currType]['strict'] === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - $lines = ($this->tokens[$i]['line'] - $startLine); - echo str_repeat("\t", $depth); - echo "=> Still looking for $stackPtr:$type scope opener after $lines lines".PHP_EOL; - } - } else { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Couldn't find scope opener for $stackPtr:$type, bailing".PHP_EOL; - } - - return $stackPtr; - } - } - } else if ($opener !== null - && $tokenType !== T_BREAK - && isset($this->endScopeTokens[$tokenType]) === true - ) { - if (isset($this->tokens[$i]['scope_condition']) === false) { - if ($ignore > 0) { - // We found the end token for the opener we were ignoring. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* finished ignoring curly brace *'.PHP_EOL; - } - - $ignore--; - } else { - // We found a token that closes the scope but it doesn't - // have a condition, so it belongs to another token and - // our token doesn't have a closer, so pretend this is - // the closer. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found (unexpected) scope closer for $stackPtr:$type".PHP_EOL; - } - - foreach ([$stackPtr, $opener] as $token) { - $this->tokens[$token]['scope_condition'] = $stackPtr; - $this->tokens[$token]['scope_opener'] = $opener; - $this->tokens[$token]['scope_closer'] = $i; - } - - return ($i - 1); - }//end if - }//end if - }//end if - }//end for - - return $stackPtr; - - }//end recurseScopeMap() - - - /** - * Constructs the level map. - * - * The level map adds a 'level' index to each token which indicates the - * depth that a token within a set of scope blocks. It also adds a - * 'conditions' index which is an array of the scope conditions that opened - * each of the scopes - position 0 being the first scope opener. - * - * @return void - */ - private function createLevelMap() - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START LEVEL MAP ***".PHP_EOL; - } - - $this->numTokens = count($this->tokens); - $level = 0; - $conditions = []; - $lastOpener = null; - $openers = []; - - for ($i = 0; $i < $this->numTokens; $i++) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$i]['type']; - $line = $this->tokens[$i]['line']; - $len = $this->tokens[$i]['length']; - $col = $this->tokens[$i]['column']; - - $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); - - echo str_repeat("\t", ($level + 1)); - echo "Process token $i on line $line [col:$col;len:$len;lvl:$level;"; - if (empty($conditions) !== true) { - $conditionString = 'conds;'; - foreach ($conditions as $condition) { - $conditionString .= Util\Tokens::tokenName($condition).','; - } - - echo rtrim($conditionString, ',').';'; - } - - echo "]: $type => $content".PHP_EOL; - }//end if - - $this->tokens[$i]['level'] = $level; - $this->tokens[$i]['conditions'] = $conditions; - - if (isset($this->tokens[$i]['scope_condition']) === true) { - // Check to see if this token opened the scope. - if ($this->tokens[$i]['scope_opener'] === $i) { - $stackPtr = $this->tokens[$i]['scope_condition']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", ($level + 1)); - echo "=> Found scope opener for $stackPtr:$type".PHP_EOL; - } - - $stackPtr = $this->tokens[$i]['scope_condition']; - - // If we find a scope opener that has a shared closer, - // then we need to go back over the condition map that we - // just created and fix ourselves as we just added some - // conditions where there was none. This happens for T_CASE - // statements that are using the same break statement. - if ($lastOpener !== null && $this->tokens[$lastOpener]['scope_closer'] === $this->tokens[$i]['scope_closer']) { - // This opener shares its closer with the previous opener, - // but we still need to check if the two openers share their - // closer with each other directly (like CASE and DEFAULT) - // or if they are just sharing because one doesn't have a - // closer (like CASE with no BREAK using a SWITCHes closer). - $thisType = $this->tokens[$this->tokens[$i]['scope_condition']]['code']; - $opener = $this->tokens[$lastOpener]['scope_condition']; - - $isShared = isset($this->scopeOpeners[$thisType]['with'][$this->tokens[$opener]['code']]); - - reset($this->scopeOpeners[$thisType]['end']); - reset($this->scopeOpeners[$this->tokens[$opener]['code']]['end']); - $sameEnd = (current($this->scopeOpeners[$thisType]['end']) === current($this->scopeOpeners[$this->tokens[$opener]['code']]['end'])); - - if ($isShared === true && $sameEnd === true) { - $badToken = $opener; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$badToken]['type']; - echo str_repeat("\t", ($level + 1)); - echo "* shared closer, cleaning up $badToken:$type *".PHP_EOL; - } - - for ($x = $this->tokens[$i]['scope_condition']; $x <= $i; $x++) { - $oldConditions = $this->tokens[$x]['conditions']; - $oldLevel = $this->tokens[$x]['level']; - $this->tokens[$x]['level']--; - unset($this->tokens[$x]['conditions'][$badToken]); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - $oldConds = ''; - foreach ($oldConditions as $condition) { - $oldConds .= Util\Tokens::tokenName($condition).','; - } - - $oldConds = rtrim($oldConds, ','); - - $newConds = ''; - foreach ($this->tokens[$x]['conditions'] as $condition) { - $newConds .= Util\Tokens::tokenName($condition).','; - } - - $newConds = rtrim($newConds, ','); - - $newLevel = $this->tokens[$x]['level']; - echo str_repeat("\t", ($level + 1)); - echo "* cleaned $x:$type *".PHP_EOL; - echo str_repeat("\t", ($level + 2)); - echo "=> level changed from $oldLevel to $newLevel".PHP_EOL; - echo str_repeat("\t", ($level + 2)); - echo "=> conditions changed from $oldConds to $newConds".PHP_EOL; - }//end if - }//end for - - unset($conditions[$badToken]); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$badToken]['type']; - echo str_repeat("\t", ($level + 1)); - echo "* token $badToken:$type removed from conditions array *".PHP_EOL; - } - - unset($openers[$lastOpener]); - - $level--; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", ($level + 2)); - echo '* level decreased *'.PHP_EOL; - } - }//end if - }//end if - - $level++; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", ($level + 1)); - echo '* level increased *'.PHP_EOL; - } - - $conditions[$stackPtr] = $this->tokens[$stackPtr]['code']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", ($level + 1)); - echo "* token $stackPtr:$type added to conditions array *".PHP_EOL; - } - - $lastOpener = $this->tokens[$i]['scope_opener']; - if ($lastOpener !== null) { - $openers[$lastOpener] = $lastOpener; - } - } else if ($lastOpener !== null && $this->tokens[$lastOpener]['scope_closer'] === $i) { - foreach (array_reverse($openers) as $opener) { - if ($this->tokens[$opener]['scope_closer'] === $i) { - $oldOpener = array_pop($openers); - if (empty($openers) === false) { - $lastOpener = array_pop($openers); - $openers[$lastOpener] = $lastOpener; - } else { - $lastOpener = null; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$oldOpener]['type']; - echo str_repeat("\t", ($level + 1)); - echo "=> Found scope closer for $oldOpener:$type".PHP_EOL; - } - - $oldCondition = array_pop($conditions); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", ($level + 1)); - echo '* token '.Util\Tokens::tokenName($oldCondition).' removed from conditions array *'.PHP_EOL; - } - - // Make sure this closer actually belongs to us. - // Either the condition also has to think this is the - // closer, or it has to allow sharing with us. - $condition = $this->tokens[$this->tokens[$i]['scope_condition']]['code']; - if ($condition !== $oldCondition) { - if (isset($this->scopeOpeners[$oldCondition]['with'][$condition]) === false) { - $badToken = $this->tokens[$oldOpener]['scope_condition']; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = Util\Tokens::tokenName($oldCondition); - echo str_repeat("\t", ($level + 1)); - echo "* scope closer was bad, cleaning up $badToken:$type *".PHP_EOL; - } - - for ($x = ($oldOpener + 1); $x <= $i; $x++) { - $oldConditions = $this->tokens[$x]['conditions']; - $oldLevel = $this->tokens[$x]['level']; - $this->tokens[$x]['level']--; - unset($this->tokens[$x]['conditions'][$badToken]); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - $oldConds = ''; - foreach ($oldConditions as $condition) { - $oldConds .= Util\Tokens::tokenName($condition).','; - } - - $oldConds = rtrim($oldConds, ','); - - $newConds = ''; - foreach ($this->tokens[$x]['conditions'] as $condition) { - $newConds .= Util\Tokens::tokenName($condition).','; - } - - $newConds = rtrim($newConds, ','); - - $newLevel = $this->tokens[$x]['level']; - echo str_repeat("\t", ($level + 1)); - echo "* cleaned $x:$type *".PHP_EOL; - echo str_repeat("\t", ($level + 2)); - echo "=> level changed from $oldLevel to $newLevel".PHP_EOL; - echo str_repeat("\t", ($level + 2)); - echo "=> conditions changed from $oldConds to $newConds".PHP_EOL; - }//end if - }//end for - }//end if - }//end if - - $level--; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", ($level + 2)); - echo '* level decreased *'.PHP_EOL; - } - - $this->tokens[$i]['level'] = $level; - $this->tokens[$i]['conditions'] = $conditions; - }//end if - }//end foreach - }//end if - }//end if - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END LEVEL MAP ***".PHP_EOL; - } - - }//end createLevelMap() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/Cache.php b/vendor/squizlabs/php_codesniffer/src/Util/Cache.php deleted file mode 100644 index c7810bd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/Cache.php +++ /dev/null @@ -1,346 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -use PHP_CodeSniffer\Autoload; -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Ruleset; - -class Cache -{ - - /** - * The filesystem location of the cache file. - * - * @var void - */ - private static $path = ''; - - /** - * The cached data. - * - * @var array - */ - private static $cache = []; - - - /** - * Loads existing cache data for the run, if any. - * - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - */ - public static function load(Ruleset $ruleset, Config $config) - { - // Look at every loaded sniff class so far and use their file contents - // to generate a hash for the code used during the run. - // At this point, the loaded class list contains the core PHPCS code - // and all sniffs that have been loaded as part of the run. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL."\tGenerating loaded file list for code hash".PHP_EOL; - } - - $codeHashFiles = []; - - $classes = array_keys(Autoload::getLoadedClasses()); - sort($classes); - - $installDir = dirname(__DIR__); - $installDirLen = strlen($installDir); - $standardDir = $installDir.DIRECTORY_SEPARATOR.'Standards'; - $standardDirLen = strlen($standardDir); - foreach ($classes as $file) { - if (substr($file, 0, $standardDirLen) !== $standardDir) { - if (substr($file, 0, $installDirLen) === $installDir) { - // We are only interested in sniffs here. - continue; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> external file: $file".PHP_EOL; - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> internal sniff: $file".PHP_EOL; - } - - $codeHashFiles[] = $file; - } - - // Add the content of the used rulesets to the hash so that sniff setting - // changes in the ruleset invalidate the cache. - $rulesets = $ruleset->paths; - sort($rulesets); - foreach ($rulesets as $file) { - if (substr($file, 0, $standardDirLen) !== $standardDir) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> external ruleset: $file".PHP_EOL; - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> internal ruleset: $file".PHP_EOL; - } - - $codeHashFiles[] = $file; - } - - // Go through the core PHPCS code and add those files to the file - // hash. This ensures that core PHPCS changes will also invalidate the cache. - // Note that we ignore sniffs here, and any files that don't affect - // the outcome of the run. - $di = new \RecursiveDirectoryIterator($installDir); - $filter = new \RecursiveCallbackFilterIterator( - $di, - function ($file, $key, $iterator) { - // Skip hidden files. - $filename = $file->getFilename(); - if (substr($filename, 0, 1) === '.') { - return false; - } - - $filePath = Common::realpath($file->getPathname()); - if ($filePath === false) { - return false; - } - - if (is_dir($filePath) === true - && ($filename === 'Standards' - || $filename === 'Exceptions' - || $filename === 'Reports' - || $filename === 'Generators') - ) { - return false; - } - - return true; - } - ); - - $iterator = new \RecursiveIteratorIterator($filter); - foreach ($iterator as $file) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> core file: $file".PHP_EOL; - } - - $codeHashFiles[] = $file->getPathname(); - } - - $codeHash = ''; - sort($codeHashFiles); - foreach ($codeHashFiles as $file) { - $codeHash .= md5_file($file); - } - - $codeHash = md5($codeHash); - - // Along with the code hash, use various settings that can affect - // the results of a run to create a new hash. This hash will be used - // in the cache file name. - $rulesetHash = md5(var_export($ruleset->ignorePatterns, true).var_export($ruleset->includePatterns, true)); - $configData = [ - 'phpVersion' => PHP_VERSION_ID, - 'tabWidth' => $config->tabWidth, - 'encoding' => $config->encoding, - 'recordErrors' => $config->recordErrors, - 'annotations' => $config->annotations, - 'configData' => Config::getAllConfigData(), - 'codeHash' => $codeHash, - 'rulesetHash' => $rulesetHash, - ]; - - $configString = var_export($configData, true); - $cacheHash = substr(sha1($configString), 0, 12); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\tGenerating cache key data".PHP_EOL; - foreach ($configData as $key => $value) { - if (is_array($value) === true) { - echo "\t\t=> $key:".PHP_EOL; - foreach ($value as $subKey => $subValue) { - echo "\t\t\t=> $subKey: $subValue".PHP_EOL; - } - - continue; - } - - if ($value === true || $value === false) { - $value = (int) $value; - } - - echo "\t\t=> $key: $value".PHP_EOL; - } - - echo "\t\t=> cacheHash: $cacheHash".PHP_EOL; - }//end if - - if ($config->cacheFile !== null) { - $cacheFile = $config->cacheFile; - } else { - // Determine the common paths for all files being checked. - // We can use this to locate an existing cache file, or to - // determine where to create a new one. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\tChecking possible cache file paths".PHP_EOL; - } - - $paths = []; - foreach ($config->files as $file) { - $file = Common::realpath($file); - while ($file !== DIRECTORY_SEPARATOR) { - if (isset($paths[$file]) === false) { - $paths[$file] = 1; - } else { - $paths[$file]++; - } - - $lastFile = $file; - $file = dirname($file); - if ($file === $lastFile) { - // Just in case something went wrong, - // we don't want to end up in an infinite loop. - break; - } - } - } - - ksort($paths); - $paths = array_reverse($paths); - - $numFiles = count($config->files); - - $cacheFile = null; - $cacheDir = getenv('XDG_CACHE_HOME'); - if ($cacheDir === false || is_dir($cacheDir) === false) { - $cacheDir = sys_get_temp_dir(); - } - - foreach ($paths as $file => $count) { - if ($count !== $numFiles) { - unset($paths[$file]); - continue; - } - - $fileHash = substr(sha1($file), 0, 12); - $testFile = $cacheDir.DIRECTORY_SEPARATOR."phpcs.$fileHash.$cacheHash.cache"; - if ($cacheFile === null) { - // This will be our default location if we can't find - // an existing file. - $cacheFile = $testFile; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> $testFile".PHP_EOL; - echo "\t\t\t * based on shared location: $file *".PHP_EOL; - } - - if (file_exists($testFile) === true) { - $cacheFile = $testFile; - break; - } - }//end foreach - - if ($cacheFile === null) { - // Unlikely, but just in case $paths is empty for some reason. - $cacheFile = $cacheDir.DIRECTORY_SEPARATOR."phpcs.$cacheHash.cache"; - } - }//end if - - self::$path = $cacheFile; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t=> Using cache file: ".self::$path.PHP_EOL; - } - - if (file_exists(self::$path) === true) { - self::$cache = json_decode(file_get_contents(self::$path), true); - - // Verify the contents of the cache file. - if (self::$cache['config'] !== $configData) { - self::$cache = []; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* cache was invalid and has been cleared *".PHP_EOL; - } - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* cache file does not exist *".PHP_EOL; - } - - self::$cache['config'] = $configData; - - }//end load() - - - /** - * Saves the current cache to the filesystem. - * - * @return void - */ - public static function save() - { - file_put_contents(self::$path, json_encode(self::$cache)); - - }//end save() - - - /** - * Retrieves a single entry from the cache. - * - * @param string $key The key of the data to get. If NULL, - * everything in the cache is returned. - * - * @return mixed - */ - public static function get($key=null) - { - if ($key === null) { - return self::$cache; - } - - if (isset(self::$cache[$key]) === true) { - return self::$cache[$key]; - } - - return false; - - }//end get() - - - /** - * Retrieves a single entry from the cache. - * - * @param string $key The key of the data to set. If NULL, - * sets the entire cache. - * @param mixed $value The value to set. - * - * @return void - */ - public static function set($key, $value) - { - if ($key === null) { - self::$cache = $value; - } else { - self::$cache[$key] = $value; - } - - }//end set() - - - /** - * Retrieves the number of cache entries. - * - * @return int - */ - public static function getSize() - { - return (count(self::$cache) - 1); - - }//end getSize() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/Common.php b/vendor/squizlabs/php_codesniffer/src/Util/Common.php deleted file mode 100644 index f939fc7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/Common.php +++ /dev/null @@ -1,520 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -class Common -{ - - /** - * An array of variable types for param/var we will check. - * - * @var string[] - */ - public static $allowedTypes = [ - 'array', - 'boolean', - 'float', - 'integer', - 'mixed', - 'object', - 'string', - 'resource', - 'callable', - ]; - - - /** - * Return TRUE if the path is a PHAR file. - * - * @param string $path The path to use. - * - * @return mixed - */ - public static function isPharFile($path) - { - if (strpos($path, 'phar://') === 0) { - return true; - } - - return false; - - }//end isPharFile() - - - /** - * CodeSniffer alternative for realpath. - * - * Allows for PHAR support. - * - * @param string $path The path to use. - * - * @return mixed - */ - public static function realpath($path) - { - // Support the path replacement of ~ with the user's home directory. - if (substr($path, 0, 2) === '~/') { - $homeDir = getenv('HOME'); - if ($homeDir !== false) { - $path = $homeDir.substr($path, 1); - } - } - - // Check for process substitution. - if (strpos($path, '/dev/fd') === 0) { - return str_replace('/dev/fd', 'php://fd', $path); - } - - // No extra work needed if this is not a phar file. - if (self::isPharFile($path) === false) { - return realpath($path); - } - - // Before trying to break down the file path, - // check if it exists first because it will mostly not - // change after running the below code. - if (file_exists($path) === true) { - return $path; - } - - $phar = \Phar::running(false); - $extra = str_replace('phar://'.$phar, '', $path); - $path = realpath($phar); - if ($path === false) { - return false; - } - - $path = 'phar://'.$path.$extra; - if (file_exists($path) === true) { - return $path; - } - - return false; - - }//end realpath() - - - /** - * Removes a base path from the front of a file path. - * - * @param string $path The path of the file. - * @param string $basepath The base path to remove. This should not end - * with a directory separator. - * - * @return string - */ - public static function stripBasepath($path, $basepath) - { - if (empty($basepath) === true) { - return $path; - } - - $basepathLen = strlen($basepath); - if (substr($path, 0, $basepathLen) === $basepath) { - $path = substr($path, $basepathLen); - } - - $path = ltrim($path, DIRECTORY_SEPARATOR); - if ($path === '') { - $path = '.'; - } - - return $path; - - }//end stripBasepath() - - - /** - * Detects the EOL character being used in a string. - * - * @param string $contents The contents to check. - * - * @return string - */ - public static function detectLineEndings($contents) - { - if (preg_match("/\r\n?|\n/", $contents, $matches) !== 1) { - // Assume there are no newlines. - $eolChar = "\n"; - } else { - $eolChar = $matches[0]; - } - - return $eolChar; - - }//end detectLineEndings() - - - /** - * Check if STDIN is a TTY. - * - * @return boolean - */ - public static function isStdinATTY() - { - // The check is slow (especially calling `tty`) so we static - // cache the result. - static $isTTY = null; - - if ($isTTY !== null) { - return $isTTY; - } - - if (defined('STDIN') === false) { - return false; - } - - // If PHP has the POSIX extensions we will use them. - if (function_exists('posix_isatty') === true) { - $isTTY = (posix_isatty(STDIN) === true); - return $isTTY; - } - - // Next try is detecting whether we have `tty` installed and use that. - if (defined('PHP_WINDOWS_VERSION_PLATFORM') === true) { - $devnull = 'NUL'; - $which = 'where'; - } else { - $devnull = '/dev/null'; - $which = 'which'; - } - - $tty = trim(shell_exec("$which tty 2> $devnull")); - if (empty($tty) === false) { - exec("tty -s 2> $devnull", $output, $returnValue); - $isTTY = ($returnValue === 0); - return $isTTY; - } - - // Finally we will use fstat. The solution borrowed from - // https://stackoverflow.com/questions/11327367/detect-if-a-php-script-is-being-run-interactively-or-not - // This doesn't work on Mingw/Cygwin/... using Mintty but they - // have `tty` installed. - $type = [ - 'S_IFMT' => 0170000, - 'S_IFIFO' => 0010000, - ]; - - $stat = fstat(STDIN); - $mode = ($stat['mode'] & $type['S_IFMT']); - $isTTY = ($mode !== $type['S_IFIFO']); - - return $isTTY; - - }//end isStdinATTY() - - - /** - * Prepares token content for output to screen. - * - * Replaces invisible characters so they are visible. On non-Windows - * operating systems it will also colour the invisible characters. - * - * @param string $content The content to prepare. - * @param string[] $exclude A list of characters to leave invisible. - * Can contain \r, \n, \t and a space. - * - * @return string - */ - public static function prepareForOutput($content, $exclude=[]) - { - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - if (in_array("\r", $exclude, true) === false) { - $content = str_replace("\r", '\r', $content); - } - - if (in_array("\n", $exclude, true) === false) { - $content = str_replace("\n", '\n', $content); - } - - if (in_array("\t", $exclude, true) === false) { - $content = str_replace("\t", '\t', $content); - } - } else { - if (in_array("\r", $exclude, true) === false) { - $content = str_replace("\r", "\033[30;1m\\r\033[0m", $content); - } - - if (in_array("\n", $exclude, true) === false) { - $content = str_replace("\n", "\033[30;1m\\n\033[0m", $content); - } - - if (in_array("\t", $exclude, true) === false) { - $content = str_replace("\t", "\033[30;1m\\t\033[0m", $content); - } - - if (in_array(' ', $exclude, true) === false) { - $content = str_replace(' ', "\033[30;1m·\033[0m", $content); - } - }//end if - - return $content; - - }//end prepareForOutput() - - - /** - * Returns true if the specified string is in the camel caps format. - * - * @param string $string The string the verify. - * @param boolean $classFormat If true, check to see if the string is in the - * class format. Class format strings must start - * with a capital letter and contain no - * underscores. - * @param boolean $public If true, the first character in the string - * must be an a-z character. If false, the - * character must be an underscore. This - * argument is only applicable if $classFormat - * is false. - * @param boolean $strict If true, the string must not have two capital - * letters next to each other. If false, a - * relaxed camel caps policy is used to allow - * for acronyms. - * - * @return boolean - */ - public static function isCamelCaps( - $string, - $classFormat=false, - $public=true, - $strict=true - ) { - // Check the first character first. - if ($classFormat === false) { - $legalFirstChar = ''; - if ($public === false) { - $legalFirstChar = '[_]'; - } - - if ($strict === false) { - // Can either start with a lowercase letter, or multiple uppercase - // in a row, representing an acronym. - $legalFirstChar .= '([A-Z]{2,}|[a-z])'; - } else { - $legalFirstChar .= '[a-z]'; - } - } else { - $legalFirstChar = '[A-Z]'; - } - - if (preg_match("/^$legalFirstChar/", $string) === 0) { - return false; - } - - // Check that the name only contains legal characters. - $legalChars = 'a-zA-Z0-9'; - if (preg_match("|[^$legalChars]|", substr($string, 1)) > 0) { - return false; - } - - if ($strict === true) { - // Check that there are not two capital letters next to each other. - $length = strlen($string); - $lastCharWasCaps = $classFormat; - - for ($i = 1; $i < $length; $i++) { - $ascii = ord($string[$i]); - if ($ascii >= 48 && $ascii <= 57) { - // The character is a number, so it cant be a capital. - $isCaps = false; - } else { - if (strtoupper($string[$i]) === $string[$i]) { - $isCaps = true; - } else { - $isCaps = false; - } - } - - if ($isCaps === true && $lastCharWasCaps === true) { - return false; - } - - $lastCharWasCaps = $isCaps; - } - }//end if - - return true; - - }//end isCamelCaps() - - - /** - * Returns true if the specified string is in the underscore caps format. - * - * @param string $string The string to verify. - * - * @return boolean - */ - public static function isUnderscoreName($string) - { - // If there are space in the name, it can't be valid. - if (strpos($string, ' ') !== false) { - return false; - } - - $validName = true; - $nameBits = explode('_', $string); - - if (preg_match('|^[A-Z]|', $string) === 0) { - // Name does not begin with a capital letter. - $validName = false; - } else { - foreach ($nameBits as $bit) { - if ($bit === '') { - continue; - } - - if ($bit[0] !== strtoupper($bit[0])) { - $validName = false; - break; - } - } - } - - return $validName; - - }//end isUnderscoreName() - - - /** - * Returns a valid variable type for param/var tags. - * - * If type is not one of the standard types, it must be a custom type. - * Returns the correct type name suggestion if type name is invalid. - * - * @param string $varType The variable type to process. - * - * @return string - */ - public static function suggestType($varType) - { - if ($varType === '') { - return ''; - } - - if (in_array($varType, self::$allowedTypes, true) === true) { - return $varType; - } else { - $lowerVarType = strtolower($varType); - switch ($lowerVarType) { - case 'bool': - case 'boolean': - return 'boolean'; - case 'double': - case 'real': - case 'float': - return 'float'; - case 'int': - case 'integer': - return 'integer'; - case 'array()': - case 'array': - return 'array'; - }//end switch - - if (strpos($lowerVarType, 'array(') !== false) { - // Valid array declaration: - // array, array(type), array(type1 => type2). - $matches = []; - $pattern = '/^array\(\s*([^\s^=^>]*)(\s*=>\s*(.*))?\s*\)/i'; - if (preg_match($pattern, $varType, $matches) !== 0) { - $type1 = ''; - if (isset($matches[1]) === true) { - $type1 = $matches[1]; - } - - $type2 = ''; - if (isset($matches[3]) === true) { - $type2 = $matches[3]; - } - - $type1 = self::suggestType($type1); - $type2 = self::suggestType($type2); - if ($type2 !== '') { - $type2 = ' => '.$type2; - } - - return "array($type1$type2)"; - } else { - return 'array'; - }//end if - } else if (in_array($lowerVarType, self::$allowedTypes, true) === true) { - // A valid type, but not lower cased. - return $lowerVarType; - } else { - // Must be a custom type name. - return $varType; - }//end if - }//end if - - }//end suggestType() - - - /** - * Given a sniff class name, returns the code for the sniff. - * - * @param string $sniffClass The fully qualified sniff class name. - * - * @return string - */ - public static function getSniffCode($sniffClass) - { - $parts = explode('\\', $sniffClass); - $sniff = array_pop($parts); - - if (substr($sniff, -5) === 'Sniff') { - // Sniff class name. - $sniff = substr($sniff, 0, -5); - } else { - // Unit test class name. - $sniff = substr($sniff, 0, -8); - } - - $category = array_pop($parts); - $sniffDir = array_pop($parts); - $standard = array_pop($parts); - $code = $standard.'.'.$category.'.'.$sniff; - return $code; - - }//end getSniffCode() - - - /** - * Removes project-specific information from a sniff class name. - * - * @param string $sniffClass The fully qualified sniff class name. - * - * @return string - */ - public static function cleanSniffClass($sniffClass) - { - $newName = strtolower($sniffClass); - - $sniffPos = strrpos($newName, '\sniffs\\'); - if ($sniffPos === false) { - // Nothing we can do as it isn't in a known format. - return $newName; - } - - $end = (strlen($newName) - $sniffPos + 1); - $start = strrpos($newName, '\\', ($end * -1)); - - if ($start === false) { - // Nothing needs to be cleaned. - return $newName; - } - - $newName = substr($newName, ($start + 1)); - return $newName; - - }//end cleanSniffClass() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/Standards.php b/vendor/squizlabs/php_codesniffer/src/Util/Standards.php deleted file mode 100644 index 50f58f0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/Standards.php +++ /dev/null @@ -1,334 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -use PHP_CodeSniffer\Config; - -class Standards -{ - - - /** - * Get a list of paths where standards are installed. - * - * Unresolvable relative paths will be excluded from the results. - * - * @return array - */ - public static function getInstalledStandardPaths() - { - $ds = DIRECTORY_SEPARATOR; - - $installedPaths = [dirname(dirname(__DIR__)).$ds.'src'.$ds.'Standards']; - $configPaths = Config::getConfigData('installed_paths'); - if ($configPaths !== null) { - $installedPaths = array_merge($installedPaths, explode(',', $configPaths)); - } - - $resolvedInstalledPaths = []; - foreach ($installedPaths as $installedPath) { - if (substr($installedPath, 0, 1) === '.') { - $installedPath = Common::realPath(__DIR__.$ds.'..'.$ds.'..'.$ds.$installedPath); - if ($installedPath === false) { - continue; - } - } - - $resolvedInstalledPaths[] = $installedPath; - } - - return $resolvedInstalledPaths; - - }//end getInstalledStandardPaths() - - - /** - * Get the details of all coding standards installed. - * - * Coding standards are directories located in the - * CodeSniffer/Standards directory. Valid coding standards - * include a Sniffs subdirectory. - * - * The details returned for each standard are: - * - path: the path to the coding standard's main directory - * - name: the name of the coding standard, as sourced from the ruleset.xml file - * - namespace: the namespace used by the coding standard, as sourced from the ruleset.xml file - * - * If you only need the paths to the installed standards, - * use getInstalledStandardPaths() instead as it performs less work to - * retrieve coding standard names. - * - * @param boolean $includeGeneric If true, the special "Generic" - * coding standard will be included - * if installed. - * @param string $standardsDir A specific directory to look for standards - * in. If not specified, PHP_CodeSniffer will - * look in its default locations. - * - * @return array - * @see getInstalledStandardPaths() - */ - public static function getInstalledStandardDetails( - $includeGeneric=false, - $standardsDir='' - ) { - $rulesets = []; - - if ($standardsDir === '') { - $installedPaths = self::getInstalledStandardPaths(); - } else { - $installedPaths = [$standardsDir]; - } - - foreach ($installedPaths as $standardsDir) { - // Check if the installed dir is actually a standard itself. - $csFile = $standardsDir.'/ruleset.xml'; - if (is_file($csFile) === true) { - $rulesets[] = $csFile; - continue; - } - - if (is_dir($standardsDir) === false) { - continue; - } - - $di = new \DirectoryIterator($standardsDir); - foreach ($di as $file) { - if ($file->isDir() === true && $file->isDot() === false) { - $filename = $file->getFilename(); - - // Ignore the special "Generic" standard. - if ($includeGeneric === false && $filename === 'Generic') { - continue; - } - - // Valid coding standard dirs include a ruleset. - $csFile = $file->getPathname().'/ruleset.xml'; - if (is_file($csFile) === true) { - $rulesets[] = $csFile; - } - } - } - }//end foreach - - $installedStandards = []; - - foreach ($rulesets as $rulesetPath) { - $ruleset = @simplexml_load_string(file_get_contents($rulesetPath)); - if ($ruleset === false) { - continue; - } - - $standardName = (string) $ruleset['name']; - $dirname = basename(dirname($rulesetPath)); - - if (isset($ruleset['namespace']) === true) { - $namespace = (string) $ruleset['namespace']; - } else { - $namespace = $dirname; - } - - $installedStandards[$dirname] = [ - 'path' => dirname($rulesetPath), - 'name' => $standardName, - 'namespace' => $namespace, - ]; - }//end foreach - - return $installedStandards; - - }//end getInstalledStandardDetails() - - - /** - * Get a list of all coding standards installed. - * - * Coding standards are directories located in the - * CodeSniffer/Standards directory. Valid coding standards - * include a Sniffs subdirectory. - * - * @param boolean $includeGeneric If true, the special "Generic" - * coding standard will be included - * if installed. - * @param string $standardsDir A specific directory to look for standards - * in. If not specified, PHP_CodeSniffer will - * look in its default locations. - * - * @return array - * @see isInstalledStandard() - */ - public static function getInstalledStandards( - $includeGeneric=false, - $standardsDir='' - ) { - $installedStandards = []; - - if ($standardsDir === '') { - $installedPaths = self::getInstalledStandardPaths(); - } else { - $installedPaths = [$standardsDir]; - } - - foreach ($installedPaths as $standardsDir) { - // Check if the installed dir is actually a standard itself. - $csFile = $standardsDir.'/ruleset.xml'; - if (is_file($csFile) === true) { - $installedStandards[] = basename($standardsDir); - continue; - } - - if (is_dir($standardsDir) === false) { - // Doesn't exist. - continue; - } - - $di = new \DirectoryIterator($standardsDir); - foreach ($di as $file) { - if ($file->isDir() === true && $file->isDot() === false) { - $filename = $file->getFilename(); - - // Ignore the special "Generic" standard. - if ($includeGeneric === false && $filename === 'Generic') { - continue; - } - - // Valid coding standard dirs include a ruleset. - $csFile = $file->getPathname().'/ruleset.xml'; - if (is_file($csFile) === true) { - $installedStandards[] = $filename; - } - } - } - }//end foreach - - return $installedStandards; - - }//end getInstalledStandards() - - - /** - * Determine if a standard is installed. - * - * Coding standards are directories located in the - * CodeSniffer/Standards directory. Valid coding standards - * include a ruleset.xml file. - * - * @param string $standard The name of the coding standard. - * - * @return boolean - * @see getInstalledStandards() - */ - public static function isInstalledStandard($standard) - { - $path = self::getInstalledStandardPath($standard); - if ($path !== null && strpos($path, 'ruleset.xml') !== false) { - return true; - } else { - // This could be a custom standard, installed outside our - // standards directory. - $standard = Common::realPath($standard); - if ($standard === false) { - return false; - } - - // Might be an actual ruleset file itUtil. - // If it has an XML extension, let's at least try it. - if (is_file($standard) === true - && (substr(strtolower($standard), -4) === '.xml' - || substr(strtolower($standard), -9) === '.xml.dist') - ) { - return true; - } - - // If it is a directory with a ruleset.xml file in it, - // it is a standard. - $ruleset = rtrim($standard, ' /\\').DIRECTORY_SEPARATOR.'ruleset.xml'; - if (is_file($ruleset) === true) { - return true; - } - }//end if - - return false; - - }//end isInstalledStandard() - - - /** - * Return the path of an installed coding standard. - * - * Coding standards are directories located in the - * CodeSniffer/Standards directory. Valid coding standards - * include a ruleset.xml file. - * - * @param string $standard The name of the coding standard. - * - * @return string|null - */ - public static function getInstalledStandardPath($standard) - { - if (strpos($standard, '.') !== false) { - return null; - } - - $installedPaths = self::getInstalledStandardPaths(); - foreach ($installedPaths as $installedPath) { - $standardPath = $installedPath.DIRECTORY_SEPARATOR.$standard; - if (file_exists($standardPath) === false) { - if (basename($installedPath) !== $standard) { - continue; - } - - $standardPath = $installedPath; - } - - $path = Common::realpath($standardPath.DIRECTORY_SEPARATOR.'ruleset.xml'); - - if ($path !== false && is_file($path) === true) { - return $path; - } else if (Common::isPharFile($standardPath) === true) { - $path = Common::realpath($standardPath); - if ($path !== false) { - return $path; - } - } - }//end foreach - - return null; - - }//end getInstalledStandardPath() - - - /** - * Prints out a list of installed coding standards. - * - * @return void - */ - public static function printInstalledStandards() - { - $installedStandards = self::getInstalledStandards(); - $numStandards = count($installedStandards); - - if ($numStandards === 0) { - echo 'No coding standards are installed.'.PHP_EOL; - } else { - $lastStandard = array_pop($installedStandards); - if ($numStandards === 1) { - echo "The only coding standard installed is $lastStandard".PHP_EOL; - } else { - $standardList = implode(', ', $installedStandards); - $standardList .= ' and '.$lastStandard; - echo 'The installed coding standards are '.$standardList.PHP_EOL; - } - } - - }//end printInstalledStandards() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/Timing.php b/vendor/squizlabs/php_codesniffer/src/Util/Timing.php deleted file mode 100644 index cf27dcf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/Timing.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -class Timing -{ - - /** - * The start time of the run. - * - * @var float - */ - private static $startTime; - - /** - * Used to make sure we only print the run time once per run. - * - * @var boolean - */ - private static $printed = false; - - - /** - * Start recording time for the run. - * - * @return void - */ - public static function startTiming() - { - - self::$startTime = microtime(true); - - }//end startTiming() - - - /** - * Print information about the run. - * - * @param boolean $force If TRUE, prints the output even if it has - * already been printed during the run. - * - * @return void - */ - public static function printRunTime($force=false) - { - if ($force === false && self::$printed === true) { - // A double call. - return; - } - - if (self::$startTime === null) { - // Timing was never started. - return; - } - - $time = ((microtime(true) - self::$startTime) * 1000); - - if ($time > 60000) { - $mins = floor($time / 60000); - $secs = round((($time % 60000) / 1000), 2); - $time = $mins.' mins'; - if ($secs !== 0) { - $time .= ", $secs secs"; - } - } else if ($time > 1000) { - $time = round(($time / 1000), 2).' secs'; - } else { - $time = round($time).'ms'; - } - - $mem = round((memory_get_peak_usage(true) / (1024 * 1024)), 2).'MB'; - echo "Time: $time; Memory: $mem".PHP_EOL.PHP_EOL; - - self::$printed = true; - - }//end printRunTime() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/Tokens.php b/vendor/squizlabs/php_codesniffer/src/Util/Tokens.php deleted file mode 100644 index d11b193..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/Tokens.php +++ /dev/null @@ -1,656 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -define('T_NONE', 'PHPCS_T_NONE'); -define('T_OPEN_CURLY_BRACKET', 'PHPCS_T_OPEN_CURLY_BRACKET'); -define('T_CLOSE_CURLY_BRACKET', 'PHPCS_T_CLOSE_CURLY_BRACKET'); -define('T_OPEN_SQUARE_BRACKET', 'PHPCS_T_OPEN_SQUARE_BRACKET'); -define('T_CLOSE_SQUARE_BRACKET', 'PHPCS_T_CLOSE_SQUARE_BRACKET'); -define('T_OPEN_PARENTHESIS', 'PHPCS_T_OPEN_PARENTHESIS'); -define('T_CLOSE_PARENTHESIS', 'PHPCS_T_CLOSE_PARENTHESIS'); -define('T_COLON', 'PHPCS_T_COLON'); -define('T_NULLABLE', 'PHPCS_T_NULLABLE'); -define('T_STRING_CONCAT', 'PHPCS_T_STRING_CONCAT'); -define('T_INLINE_THEN', 'PHPCS_T_INLINE_THEN'); -define('T_INLINE_ELSE', 'PHPCS_T_INLINE_ELSE'); -define('T_NULL', 'PHPCS_T_NULL'); -define('T_FALSE', 'PHPCS_T_FALSE'); -define('T_TRUE', 'PHPCS_T_TRUE'); -define('T_SEMICOLON', 'PHPCS_T_SEMICOLON'); -define('T_EQUAL', 'PHPCS_T_EQUAL'); -define('T_MULTIPLY', 'PHPCS_T_MULTIPLY'); -define('T_DIVIDE', 'PHPCS_T_DIVIDE'); -define('T_PLUS', 'PHPCS_T_PLUS'); -define('T_MINUS', 'PHPCS_T_MINUS'); -define('T_MODULUS', 'PHPCS_T_MODULUS'); -define('T_BITWISE_AND', 'PHPCS_T_BITWISE_AND'); -define('T_BITWISE_OR', 'PHPCS_T_BITWISE_OR'); -define('T_BITWISE_XOR', 'PHPCS_T_BITWISE_XOR'); -define('T_BITWISE_NOT', 'PHPCS_T_BITWISE_NOT'); -define('T_ARRAY_HINT', 'PHPCS_T_ARRAY_HINT'); -define('T_GREATER_THAN', 'PHPCS_T_GREATER_THAN'); -define('T_LESS_THAN', 'PHPCS_T_LESS_THAN'); -define('T_BOOLEAN_NOT', 'PHPCS_T_BOOLEAN_NOT'); -define('T_SELF', 'PHPCS_T_SELF'); -define('T_PARENT', 'PHPCS_T_PARENT'); -define('T_DOUBLE_QUOTED_STRING', 'PHPCS_T_DOUBLE_QUOTED_STRING'); -define('T_COMMA', 'PHPCS_T_COMMA'); -define('T_HEREDOC', 'PHPCS_T_HEREDOC'); -define('T_PROTOTYPE', 'PHPCS_T_PROTOTYPE'); -define('T_THIS', 'PHPCS_T_THIS'); -define('T_REGULAR_EXPRESSION', 'PHPCS_T_REGULAR_EXPRESSION'); -define('T_PROPERTY', 'PHPCS_T_PROPERTY'); -define('T_LABEL', 'PHPCS_T_LABEL'); -define('T_OBJECT', 'PHPCS_T_OBJECT'); -define('T_CLOSE_OBJECT', 'PHPCS_T_CLOSE_OBJECT'); -define('T_COLOUR', 'PHPCS_T_COLOUR'); -define('T_HASH', 'PHPCS_T_HASH'); -define('T_URL', 'PHPCS_T_URL'); -define('T_STYLE', 'PHPCS_T_STYLE'); -define('T_ASPERAND', 'PHPCS_T_ASPERAND'); -define('T_DOLLAR', 'PHPCS_T_DOLLAR'); -define('T_TYPEOF', 'PHPCS_T_TYPEOF'); -define('T_CLOSURE', 'PHPCS_T_CLOSURE'); -define('T_ANON_CLASS', 'PHPCS_T_ANON_CLASS'); -define('T_BACKTICK', 'PHPCS_T_BACKTICK'); -define('T_START_NOWDOC', 'PHPCS_T_START_NOWDOC'); -define('T_NOWDOC', 'PHPCS_T_NOWDOC'); -define('T_END_NOWDOC', 'PHPCS_T_END_NOWDOC'); -define('T_OPEN_SHORT_ARRAY', 'PHPCS_T_OPEN_SHORT_ARRAY'); -define('T_CLOSE_SHORT_ARRAY', 'PHPCS_T_CLOSE_SHORT_ARRAY'); -define('T_GOTO_LABEL', 'PHPCS_T_GOTO_LABEL'); -define('T_BINARY_CAST', 'PHPCS_T_BINARY_CAST'); -define('T_EMBEDDED_PHP', 'PHPCS_T_EMBEDDED_PHP'); -define('T_RETURN_TYPE', 'PHPCS_T_RETURN_TYPE'); -define('T_OPEN_USE_GROUP', 'PHPCS_T_OPEN_USE_GROUP'); -define('T_CLOSE_USE_GROUP', 'PHPCS_T_CLOSE_USE_GROUP'); -define('T_ZSR', 'PHPCS_T_ZSR'); -define('T_ZSR_EQUAL', 'PHPCS_T_ZSR_EQUAL'); -define('T_FN_ARROW', 'T_FN_ARROW'); - -// Some PHP 5.5 tokens, replicated for lower versions. -if (defined('T_FINALLY') === false) { - define('T_FINALLY', 'PHPCS_T_FINALLY'); -} - -if (defined('T_YIELD') === false) { - define('T_YIELD', 'PHPCS_T_YIELD'); -} - -// Some PHP 5.6 tokens, replicated for lower versions. -if (defined('T_ELLIPSIS') === false) { - define('T_ELLIPSIS', 'PHPCS_T_ELLIPSIS'); -} - -if (defined('T_POW') === false) { - define('T_POW', 'PHPCS_T_POW'); -} - -if (defined('T_POW_EQUAL') === false) { - define('T_POW_EQUAL', 'PHPCS_T_POW_EQUAL'); -} - -// Some PHP 7 tokens, replicated for lower versions. -if (defined('T_SPACESHIP') === false) { - define('T_SPACESHIP', 'PHPCS_T_SPACESHIP'); -} - -if (defined('T_COALESCE') === false) { - define('T_COALESCE', 'PHPCS_T_COALESCE'); -} - -if (defined('T_COALESCE_EQUAL') === false) { - define('T_COALESCE_EQUAL', 'PHPCS_T_COALESCE_EQUAL'); -} - -if (defined('T_YIELD_FROM') === false) { - define('T_YIELD_FROM', 'PHPCS_T_YIELD_FROM'); -} - -// Some PHP 7.4 tokens, replicated for lower versions. -if (defined('T_BAD_CHARACTER') === false) { - define('T_BAD_CHARACTER', 'PHPCS_T_BAD_CHARACTER'); -} - -if (defined('T_FN') === false) { - define('T_FN', 'PHPCS_T_FN'); -} - -// Tokens used for parsing doc blocks. -define('T_DOC_COMMENT_STAR', 'PHPCS_T_DOC_COMMENT_STAR'); -define('T_DOC_COMMENT_WHITESPACE', 'PHPCS_T_DOC_COMMENT_WHITESPACE'); -define('T_DOC_COMMENT_TAG', 'PHPCS_T_DOC_COMMENT_TAG'); -define('T_DOC_COMMENT_OPEN_TAG', 'PHPCS_T_DOC_COMMENT_OPEN_TAG'); -define('T_DOC_COMMENT_CLOSE_TAG', 'PHPCS_T_DOC_COMMENT_CLOSE_TAG'); -define('T_DOC_COMMENT_STRING', 'PHPCS_T_DOC_COMMENT_STRING'); - -// Tokens used for PHPCS instruction comments. -define('T_PHPCS_ENABLE', 'PHPCS_T_PHPCS_ENABLE'); -define('T_PHPCS_DISABLE', 'PHPCS_T_PHPCS_DISABLE'); -define('T_PHPCS_SET', 'PHPCS_T_PHPCS_SET'); -define('T_PHPCS_IGNORE', 'PHPCS_T_PHPCS_IGNORE'); -define('T_PHPCS_IGNORE_FILE', 'PHPCS_T_PHPCS_IGNORE_FILE'); - -final class Tokens -{ - - /** - * The token weightings. - * - * @var array - */ - public static $weightings = [ - T_CLASS => 1000, - T_INTERFACE => 1000, - T_TRAIT => 1000, - T_NAMESPACE => 1000, - T_FUNCTION => 100, - T_CLOSURE => 100, - - /* - * Conditions. - */ - - T_WHILE => 50, - T_FOR => 50, - T_FOREACH => 50, - T_IF => 50, - T_ELSE => 50, - T_ELSEIF => 50, - T_DO => 50, - T_TRY => 50, - T_CATCH => 50, - T_FINALLY => 50, - T_SWITCH => 50, - - T_SELF => 25, - T_PARENT => 25, - - /* - * Operators and arithmetic. - */ - - T_BITWISE_AND => 8, - T_BITWISE_OR => 8, - T_BITWISE_XOR => 8, - - T_MULTIPLY => 5, - T_DIVIDE => 5, - T_PLUS => 5, - T_MINUS => 5, - T_MODULUS => 5, - T_POW => 5, - T_SPACESHIP => 5, - T_COALESCE => 5, - T_COALESCE_EQUAL => 5, - - T_SL => 5, - T_SR => 5, - T_SL_EQUAL => 5, - T_SR_EQUAL => 5, - - T_EQUAL => 5, - T_AND_EQUAL => 5, - T_CONCAT_EQUAL => 5, - T_DIV_EQUAL => 5, - T_MINUS_EQUAL => 5, - T_MOD_EQUAL => 5, - T_MUL_EQUAL => 5, - T_OR_EQUAL => 5, - T_PLUS_EQUAL => 5, - T_XOR_EQUAL => 5, - - T_BOOLEAN_AND => 5, - T_BOOLEAN_OR => 5, - - /* - * Equality. - */ - - T_IS_EQUAL => 5, - T_IS_NOT_EQUAL => 5, - T_IS_IDENTICAL => 5, - T_IS_NOT_IDENTICAL => 5, - T_IS_SMALLER_OR_EQUAL => 5, - T_IS_GREATER_OR_EQUAL => 5, - ]; - - /** - * Tokens that represent assignments. - * - * @var array - */ - public static $assignmentTokens = [ - T_EQUAL => T_EQUAL, - T_AND_EQUAL => T_AND_EQUAL, - T_OR_EQUAL => T_OR_EQUAL, - T_CONCAT_EQUAL => T_CONCAT_EQUAL, - T_DIV_EQUAL => T_DIV_EQUAL, - T_MINUS_EQUAL => T_MINUS_EQUAL, - T_POW_EQUAL => T_POW_EQUAL, - T_MOD_EQUAL => T_MOD_EQUAL, - T_MUL_EQUAL => T_MUL_EQUAL, - T_PLUS_EQUAL => T_PLUS_EQUAL, - T_XOR_EQUAL => T_XOR_EQUAL, - T_DOUBLE_ARROW => T_DOUBLE_ARROW, - T_SL_EQUAL => T_SL_EQUAL, - T_SR_EQUAL => T_SR_EQUAL, - T_COALESCE_EQUAL => T_COALESCE_EQUAL, - T_ZSR_EQUAL => T_ZSR_EQUAL, - ]; - - /** - * Tokens that represent equality comparisons. - * - * @var array - */ - public static $equalityTokens = [ - T_IS_EQUAL => T_IS_EQUAL, - T_IS_NOT_EQUAL => T_IS_NOT_EQUAL, - T_IS_IDENTICAL => T_IS_IDENTICAL, - T_IS_NOT_IDENTICAL => T_IS_NOT_IDENTICAL, - T_IS_SMALLER_OR_EQUAL => T_IS_SMALLER_OR_EQUAL, - T_IS_GREATER_OR_EQUAL => T_IS_GREATER_OR_EQUAL, - ]; - - /** - * Tokens that represent comparison operator. - * - * @var array - */ - public static $comparisonTokens = [ - T_IS_EQUAL => T_IS_EQUAL, - T_IS_IDENTICAL => T_IS_IDENTICAL, - T_IS_NOT_EQUAL => T_IS_NOT_EQUAL, - T_IS_NOT_IDENTICAL => T_IS_NOT_IDENTICAL, - T_LESS_THAN => T_LESS_THAN, - T_GREATER_THAN => T_GREATER_THAN, - T_IS_SMALLER_OR_EQUAL => T_IS_SMALLER_OR_EQUAL, - T_IS_GREATER_OR_EQUAL => T_IS_GREATER_OR_EQUAL, - T_SPACESHIP => T_SPACESHIP, - T_COALESCE => T_COALESCE, - ]; - - /** - * Tokens that represent arithmetic operators. - * - * @var array - */ - public static $arithmeticTokens = [ - T_PLUS => T_PLUS, - T_MINUS => T_MINUS, - T_MULTIPLY => T_MULTIPLY, - T_DIVIDE => T_DIVIDE, - T_MODULUS => T_MODULUS, - T_POW => T_POW, - ]; - - /** - * Tokens that perform operations. - * - * @var array - */ - public static $operators = [ - T_MINUS => T_MINUS, - T_PLUS => T_PLUS, - T_MULTIPLY => T_MULTIPLY, - T_DIVIDE => T_DIVIDE, - T_MODULUS => T_MODULUS, - T_POW => T_POW, - T_SPACESHIP => T_SPACESHIP, - T_COALESCE => T_COALESCE, - T_BITWISE_AND => T_BITWISE_AND, - T_BITWISE_OR => T_BITWISE_OR, - T_BITWISE_XOR => T_BITWISE_XOR, - T_SL => T_SL, - T_SR => T_SR, - ]; - - /** - * Tokens that perform boolean operations. - * - * @var array - */ - public static $booleanOperators = [ - T_BOOLEAN_AND => T_BOOLEAN_AND, - T_BOOLEAN_OR => T_BOOLEAN_OR, - T_LOGICAL_AND => T_LOGICAL_AND, - T_LOGICAL_OR => T_LOGICAL_OR, - T_LOGICAL_XOR => T_LOGICAL_XOR, - ]; - - /** - * Tokens that represent casting. - * - * @var array - */ - public static $castTokens = [ - T_INT_CAST => T_INT_CAST, - T_STRING_CAST => T_STRING_CAST, - T_DOUBLE_CAST => T_DOUBLE_CAST, - T_ARRAY_CAST => T_ARRAY_CAST, - T_BOOL_CAST => T_BOOL_CAST, - T_OBJECT_CAST => T_OBJECT_CAST, - T_UNSET_CAST => T_UNSET_CAST, - T_BINARY_CAST => T_BINARY_CAST, - ]; - - /** - * Token types that open parenthesis. - * - * @var array - */ - public static $parenthesisOpeners = [ - T_ARRAY => T_ARRAY, - T_LIST => T_LIST, - T_FUNCTION => T_FUNCTION, - T_CLOSURE => T_CLOSURE, - T_ANON_CLASS => T_ANON_CLASS, - T_WHILE => T_WHILE, - T_FOR => T_FOR, - T_FOREACH => T_FOREACH, - T_SWITCH => T_SWITCH, - T_IF => T_IF, - T_ELSEIF => T_ELSEIF, - T_CATCH => T_CATCH, - T_DECLARE => T_DECLARE, - ]; - - /** - * Tokens that are allowed to open scopes. - * - * @var array - */ - public static $scopeOpeners = [ - T_CLASS => T_CLASS, - T_ANON_CLASS => T_ANON_CLASS, - T_INTERFACE => T_INTERFACE, - T_TRAIT => T_TRAIT, - T_NAMESPACE => T_NAMESPACE, - T_FUNCTION => T_FUNCTION, - T_CLOSURE => T_CLOSURE, - T_IF => T_IF, - T_SWITCH => T_SWITCH, - T_CASE => T_CASE, - T_DECLARE => T_DECLARE, - T_DEFAULT => T_DEFAULT, - T_WHILE => T_WHILE, - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - T_FOR => T_FOR, - T_FOREACH => T_FOREACH, - T_DO => T_DO, - T_TRY => T_TRY, - T_CATCH => T_CATCH, - T_FINALLY => T_FINALLY, - T_PROPERTY => T_PROPERTY, - T_OBJECT => T_OBJECT, - T_USE => T_USE, - ]; - - /** - * Tokens that represent scope modifiers. - * - * @var array - */ - public static $scopeModifiers = [ - T_PRIVATE => T_PRIVATE, - T_PUBLIC => T_PUBLIC, - T_PROTECTED => T_PROTECTED, - ]; - - /** - * Tokens that can prefix a method name - * - * @var array - */ - public static $methodPrefixes = [ - T_PRIVATE => T_PRIVATE, - T_PUBLIC => T_PUBLIC, - T_PROTECTED => T_PROTECTED, - T_ABSTRACT => T_ABSTRACT, - T_STATIC => T_STATIC, - T_FINAL => T_FINAL, - ]; - - /** - * Tokens that open code blocks. - * - * @var array - */ - public static $blockOpeners = [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_OPEN_SQUARE_BRACKET => T_OPEN_SQUARE_BRACKET, - T_OPEN_PARENTHESIS => T_OPEN_PARENTHESIS, - T_OBJECT => T_OBJECT, - ]; - - /** - * Tokens that don't represent code. - * - * @var array - */ - public static $emptyTokens = [ - T_WHITESPACE => T_WHITESPACE, - T_COMMENT => T_COMMENT, - T_DOC_COMMENT => T_DOC_COMMENT, - T_DOC_COMMENT_STAR => T_DOC_COMMENT_STAR, - T_DOC_COMMENT_WHITESPACE => T_DOC_COMMENT_WHITESPACE, - T_DOC_COMMENT_TAG => T_DOC_COMMENT_TAG, - T_DOC_COMMENT_OPEN_TAG => T_DOC_COMMENT_OPEN_TAG, - T_DOC_COMMENT_CLOSE_TAG => T_DOC_COMMENT_CLOSE_TAG, - T_DOC_COMMENT_STRING => T_DOC_COMMENT_STRING, - T_PHPCS_ENABLE => T_PHPCS_ENABLE, - T_PHPCS_DISABLE => T_PHPCS_DISABLE, - T_PHPCS_SET => T_PHPCS_SET, - T_PHPCS_IGNORE => T_PHPCS_IGNORE, - T_PHPCS_IGNORE_FILE => T_PHPCS_IGNORE_FILE, - ]; - - /** - * Tokens that are comments. - * - * @var array - */ - public static $commentTokens = [ - T_COMMENT => T_COMMENT, - T_DOC_COMMENT => T_DOC_COMMENT, - T_DOC_COMMENT_STAR => T_DOC_COMMENT_STAR, - T_DOC_COMMENT_WHITESPACE => T_DOC_COMMENT_WHITESPACE, - T_DOC_COMMENT_TAG => T_DOC_COMMENT_TAG, - T_DOC_COMMENT_OPEN_TAG => T_DOC_COMMENT_OPEN_TAG, - T_DOC_COMMENT_CLOSE_TAG => T_DOC_COMMENT_CLOSE_TAG, - T_DOC_COMMENT_STRING => T_DOC_COMMENT_STRING, - T_PHPCS_ENABLE => T_PHPCS_ENABLE, - T_PHPCS_DISABLE => T_PHPCS_DISABLE, - T_PHPCS_SET => T_PHPCS_SET, - T_PHPCS_IGNORE => T_PHPCS_IGNORE, - T_PHPCS_IGNORE_FILE => T_PHPCS_IGNORE_FILE, - ]; - - /** - * Tokens that are comments containing PHPCS instructions. - * - * @var array - */ - public static $phpcsCommentTokens = [ - T_PHPCS_ENABLE => T_PHPCS_ENABLE, - T_PHPCS_DISABLE => T_PHPCS_DISABLE, - T_PHPCS_SET => T_PHPCS_SET, - T_PHPCS_IGNORE => T_PHPCS_IGNORE, - T_PHPCS_IGNORE_FILE => T_PHPCS_IGNORE_FILE, - ]; - - /** - * Tokens that represent strings. - * - * Note that T_STRINGS are NOT represented in this list. - * - * @var array - */ - public static $stringTokens = [ - T_CONSTANT_ENCAPSED_STRING => T_CONSTANT_ENCAPSED_STRING, - T_DOUBLE_QUOTED_STRING => T_DOUBLE_QUOTED_STRING, - ]; - - /** - * Tokens that represent text strings. - * - * @var array - */ - public static $textStringTokens = [ - T_CONSTANT_ENCAPSED_STRING => T_CONSTANT_ENCAPSED_STRING, - T_DOUBLE_QUOTED_STRING => T_DOUBLE_QUOTED_STRING, - T_INLINE_HTML => T_INLINE_HTML, - T_HEREDOC => T_HEREDOC, - T_NOWDOC => T_NOWDOC, - ]; - - /** - * Tokens that represent brackets and parenthesis. - * - * @var array - */ - public static $bracketTokens = [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_OPEN_SQUARE_BRACKET => T_OPEN_SQUARE_BRACKET, - T_CLOSE_SQUARE_BRACKET => T_CLOSE_SQUARE_BRACKET, - T_OPEN_PARENTHESIS => T_OPEN_PARENTHESIS, - T_CLOSE_PARENTHESIS => T_CLOSE_PARENTHESIS, - ]; - - /** - * Tokens that include files. - * - * @var array - */ - public static $includeTokens = [ - T_REQUIRE_ONCE => T_REQUIRE_ONCE, - T_REQUIRE => T_REQUIRE, - T_INCLUDE_ONCE => T_INCLUDE_ONCE, - T_INCLUDE => T_INCLUDE, - ]; - - /** - * Tokens that make up a heredoc string. - * - * @var array - */ - public static $heredocTokens = [ - T_START_HEREDOC => T_START_HEREDOC, - T_END_HEREDOC => T_END_HEREDOC, - T_HEREDOC => T_HEREDOC, - T_START_NOWDOC => T_START_NOWDOC, - T_END_NOWDOC => T_END_NOWDOC, - T_NOWDOC => T_NOWDOC, - ]; - - /** - * Tokens that represent the names of called functions. - * - * Mostly, these are just strings. But PHP tokenizes some language - * constructs and functions using their own tokens. - * - * @var array - */ - public static $functionNameTokens = [ - T_STRING => T_STRING, - T_EVAL => T_EVAL, - T_EXIT => T_EXIT, - T_INCLUDE => T_INCLUDE, - T_INCLUDE_ONCE => T_INCLUDE_ONCE, - T_REQUIRE => T_REQUIRE, - T_REQUIRE_ONCE => T_REQUIRE_ONCE, - T_ISSET => T_ISSET, - T_UNSET => T_UNSET, - T_EMPTY => T_EMPTY, - T_SELF => T_SELF, - T_STATIC => T_STATIC, - ]; - - /** - * Tokens that open class and object scopes. - * - * @var array - */ - public static $ooScopeTokens = [ - T_CLASS => T_CLASS, - T_ANON_CLASS => T_ANON_CLASS, - T_INTERFACE => T_INTERFACE, - T_TRAIT => T_TRAIT, - ]; - - - /** - * Given a token, returns the name of the token. - * - * If passed an integer, the token name is sourced from PHP's token_name() - * function. If passed a string, it is assumed to be a PHPCS-supplied token - * that begins with PHPCS_T_, so the name is sourced from the token value itself. - * - * @param int|string $token The token to get the name for. - * - * @return string - */ - public static function tokenName($token) - { - if (is_string($token) === false) { - // PHP-supplied token name. - return token_name($token); - } - - return substr($token, 6); - - }//end tokenName() - - - /** - * Returns the highest weighted token type. - * - * Tokens are weighted by their approximate frequency of appearance in code - * - the less frequently they appear in the code, the higher the weighting. - * For example T_CLASS tokens appear very infrequently in a file, and - * therefore have a high weighting. - * - * Returns false if there are no weightings for any of the specified tokens. - * - * @param array $tokens The token types to get the highest weighted - * type for. - * - * @return int|false The highest weighted token. - */ - public static function getHighestWeightedToken(array $tokens) - { - $highest = -1; - $highestType = false; - - $weights = self::$weightings; - - foreach ($tokens as $token) { - if (isset($weights[$token]) === true) { - $weight = $weights[$token]; - } else { - $weight = 0; - } - - if ($weight > $highest) { - $highest = $weight; - $highestType = $token; - } - } - - return $highestType; - - }//end getHighestWeightedToken() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/AllTests.php b/vendor/squizlabs/php_codesniffer/tests/AllTests.php deleted file mode 100644 index 4ed001d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/AllTests.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests; - -$GLOBALS['PHP_CODESNIFFER_PEAR'] = false; - -if (is_file(__DIR__.'/../autoload.php') === true) { - include_once 'Core/AllTests.php'; - include_once 'Standards/AllSniffs.php'; -} else { - include_once 'CodeSniffer/Core/AllTests.php'; - include_once 'CodeSniffer/Standards/AllSniffs.php'; - include_once 'FileList.php'; - $GLOBALS['PHP_CODESNIFFER_PEAR'] = true; -} - -// PHPUnit 7 made the TestSuite run() method incompatible with -// older PHPUnit versions due to return type hints, so maintain -// two different suite objects. -$phpunit7 = false; -if (class_exists('\PHPUnit\Runner\Version') === true) { - $version = \PHPUnit\Runner\Version::id(); - if ($version[0] === '7') { - $phpunit7 = true; - } -} - -if ($phpunit7 === true) { - include_once 'TestSuite7.php'; -} else { - include_once 'TestSuite.php'; -} - -class PHP_CodeSniffer_AllTests -{ - - - /** - * Add all PHP_CodeSniffer test suites into a single test suite. - * - * @return \PHPUnit\Framework\TestSuite - */ - public static function suite() - { - $GLOBALS['PHP_CODESNIFFER_STANDARD_DIRS'] = []; - $GLOBALS['PHP_CODESNIFFER_TEST_DIRS'] = []; - - // Use a special PHP_CodeSniffer test suite so that we can - // unset our autoload function after the run. - $suite = new TestSuite('PHP CodeSniffer'); - - $suite->addTest(Core\AllTests::suite()); - $suite->addTest(Standards\AllSniffs::suite()); - - return $suite; - - }//end suite() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/AbstractMethodUnitTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/AbstractMethodUnitTest.php deleted file mode 100644 index 4d4f546..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/AbstractMethodUnitTest.php +++ /dev/null @@ -1,140 +0,0 @@ - - * @copyright 2018-2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Files\DummyFile; -use PHPUnit\Framework\TestCase; - -abstract class AbstractMethodUnitTest extends TestCase -{ - - /** - * The file extension of the test case file (without leading dot). - * - * This allows child classes to overrule the default `inc` with, for instance, - * `js` or `css` when applicable. - * - * @var string - */ - protected static $fileExtension = 'inc'; - - /** - * The \PHP_CodeSniffer\Files\File object containing the parsed contents of the test case file. - * - * @var \PHP_CodeSniffer\Files\File - */ - protected static $phpcsFile; - - - /** - * Initialize & tokenize \PHP_CodeSniffer\Files\File with code from the test case file. - * - * The test case file for a unit test class has to be in the same directory - * directory and use the same file name as the test class, using the .inc extension. - * - * @return void - */ - public static function setUpBeforeClass() - { - $config = new Config(); - $config->standards = ['PSR1']; - - $ruleset = new Ruleset($config); - - // Default to a file with the same name as the test class. Extension is property based. - $relativeCN = str_replace(__NAMESPACE__, '', get_called_class()); - $relativePath = str_replace('\\', DIRECTORY_SEPARATOR, $relativeCN); - $pathToTestFile = realpath(__DIR__).$relativePath.'.'.static::$fileExtension; - - // Make sure the file gets parsed correctly based on the file type. - $contents = 'phpcs_input_file: '.$pathToTestFile.PHP_EOL; - $contents .= file_get_contents($pathToTestFile); - - self::$phpcsFile = new DummyFile($contents, $ruleset, $config); - self::$phpcsFile->process(); - - }//end setUpBeforeClass() - - - /** - * Clean up after finished test. - * - * @return void - */ - public static function tearDownAfterClass() - { - self::$phpcsFile = null; - - }//end tearDownAfterClass() - - - /** - * Get the token pointer for a target token based on a specific comment found on the line before. - * - * Note: the test delimiter comment MUST start with "/* test" to allow this function to - * distinguish between comments used *in* a test and test delimiters. - * - * @param string $commentString The delimiter comment to look for. - * @param int|string|array $tokenType The type of token(s) to look for. - * @param string $tokenContent Optional. The token content for the target token. - * - * @return int - */ - public function getTargetToken($commentString, $tokenType, $tokenContent=null) - { - $start = (self::$phpcsFile->numTokens - 1); - $comment = self::$phpcsFile->findPrevious( - T_COMMENT, - $start, - null, - false, - $commentString - ); - - $tokens = self::$phpcsFile->getTokens(); - $end = ($start + 1); - - // Limit the token finding to between this and the next delimiter comment. - for ($i = ($comment + 1); $i < $end; $i++) { - if ($tokens[$i]['code'] !== T_COMMENT) { - continue; - } - - if (stripos($tokens[$i]['content'], '/* test') === 0) { - $end = $i; - break; - } - } - - $target = self::$phpcsFile->findNext( - $tokenType, - ($comment + 1), - $end, - false, - $tokenContent - ); - - if ($target === false) { - $msg = 'Failed to find test target token for comment string: '.$commentString; - if ($tokenContent !== null) { - $msg .= ' With token content: '.$tokenContent; - } - - $this->assertFalse(true, $msg); - } - - return $target; - - }//end getTargetToken() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/AllTests.php b/vendor/squizlabs/php_codesniffer/tests/Core/AllTests.php deleted file mode 100644 index 304690e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/AllTests.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @author Juliette Reinders Folmer - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core; - -use PHP_CodeSniffer\Tests\FileList; -use PHPUnit\TextUI\TestRunner; -use PHPUnit\Framework\TestSuite; - -class AllTests -{ - - - /** - * Prepare the test runner. - * - * @return void - */ - public static function main() - { - TestRunner::run(self::suite()); - - }//end main() - - - /** - * Add all core unit tests into a test suite. - * - * @return \PHPUnit\Framework\TestSuite - */ - public static function suite() - { - $suite = new TestSuite('PHP CodeSniffer Core'); - - $testFileIterator = new FileList(__DIR__, '', '`Test\.php$`Di'); - foreach ($testFileIterator->fileIterator as $file) { - if (strpos($file, 'AbstractMethodUnitTest.php') !== false) { - continue; - } - - include_once $file; - - $class = str_replace(__DIR__, '', $file); - $class = str_replace('.php', '', $class); - $class = str_replace('/', '\\', $class); - $class = 'PHP_CodeSniffer\Tests\Core'.$class; - - $suite->addTestSuite($class); - } - - return $suite; - - }//end suite() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/ErrorSuppressionTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/ErrorSuppressionTest.php deleted file mode 100644 index f031b33..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/ErrorSuppressionTest.php +++ /dev/null @@ -1,1265 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Files\DummyFile; -use PHPUnit\Framework\TestCase; - -class ErrorSuppressionTest extends TestCase -{ - - - /** - * Test suppressing a single error. - * - * @return void - */ - public function testSuppressError() - { - $config = new Config(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.PHP.LowerCaseConstant']; - - $ruleset = new Ruleset($config); - - // Process without suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with inline comment suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with multi-line inline comment suppression, tab-indented. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with inline @ comment suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with inline comment suppression mixed case. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with inline comment suppression (deprecated syntax). - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with block comment suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with multi-line block comment suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with multi-line block comment suppression, each line starred. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with multi-line block comment suppression, tab-indented. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with block comment suppression (deprecated syntax). - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with multi-line block comment suppression (deprecated syntax). - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with a docblock suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with a docblock suppression (deprecated syntax). - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - }//end testSuppressError() - - - /** - * Test suppressing 1 out of 2 errors. - * - * @return void - */ - public function testSuppressSomeErrors() - { - $config = new Config(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.PHP.LowerCaseConstant']; - - $ruleset = new Ruleset($config); - - // Process without suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(2, $numErrors); - $this->assertCount(2, $errors); - - // Process with suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with @ suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with suppression (deprecated syntax). - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with a PHPDoc block suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with a PHPDoc block suppression (deprecated syntax). - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - }//end testSuppressSomeErrors() - - - /** - * Test suppressing a single warning. - * - * @return void - */ - public function testSuppressWarning() - { - $config = new Config(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.Commenting.Todo']; - - $ruleset = new Ruleset($config); - - // Process without suppression. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Process with suppression. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with @ suppression. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with suppression (deprecated syntax). - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with a docblock suppression. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with a docblock suppression (deprecated syntax). - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - }//end testSuppressWarning() - - - /** - * Test suppressing a single error using a single line ignore. - * - * @return void - */ - public function testSuppressLine() - { - $config = new Config(); - $config->standards = ['Generic']; - $config->sniffs = [ - 'Generic.PHP.LowerCaseConstant', - 'Generic.Files.LineLength', - ]; - - $ruleset = new Ruleset($config); - - // Process without suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(2, $numErrors); - $this->assertCount(2, $errors); - - // Process with suppression on line before. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with @ suppression on line before. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with suppression on line before. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with @ suppression on line before. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with suppression on line before (deprecated syntax). - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with @ suppression on line before inside docblock. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with suppression on same line. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with @ suppression on same line. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - // Process with suppression on same line (deprecated syntax). - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - - }//end testSuppressLine() - - - /** - * Test that using a single line ignore does not interfere with other suppressions. - * - * @return void - */ - public function testNestedSuppressLine() - { - $config = new Config(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.PHP.LowerCaseConstant']; - - $ruleset = new Ruleset($config); - - // Process with disable/enable suppression and no single line suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with disable/enable @ suppression and no single line suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with disable/enable suppression and no single line suppression (deprecated syntax). - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with line suppression nested within disable/enable suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with line @ suppression nested within disable/enable @ suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with line suppression nested within disable/enable suppression (deprecated syntax). - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - }//end testNestedSuppressLine() - - - /** - * Test suppressing a scope opener. - * - * @return void - */ - public function testSuppressScope() - { - $config = new Config(); - $config->standards = ['PEAR']; - $config->sniffs = ['PEAR.NamingConventions.ValidVariableName']; - - $ruleset = new Ruleset($config); - - // Process without suppression. - $content = 'foo();'.PHP_EOL.'}'.PHP_EOL.'}'; - $file = new DummyFile($content, $ruleset, $config); - $file->process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with suppression. - $content = 'foo();'.PHP_EOL.'}'.PHP_EOL.'}'; - $file = new DummyFile($content, $ruleset, $config); - $file->process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with suppression. - $content = 'foo();'.PHP_EOL.'}'.PHP_EOL.'}'; - $file = new DummyFile($content, $ruleset, $config); - $file->process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with suppression (deprecated syntax). - $content = 'foo();'.PHP_EOL.'}'.PHP_EOL.'}'; - $file = new DummyFile($content, $ruleset, $config); - $file->process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with a docblock suppression. - $content = 'foo();'.PHP_EOL.'}'.PHP_EOL.'}'; - $file = new DummyFile($content, $ruleset, $config); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with a docblock @ suppression. - $content = 'foo();'.PHP_EOL.'}'.PHP_EOL.'}'; - $file = new DummyFile($content, $ruleset, $config); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - // Process with a docblock suppression (deprecated syntax). - $content = 'foo();'.PHP_EOL.'}'.PHP_EOL.'}'; - $file = new DummyFile($content, $ruleset, $config); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - - }//end testSuppressScope() - - - /** - * Test suppressing a whole file. - * - * @return void - */ - public function testSuppressFile() - { - $config = new Config(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.Commenting.Todo']; - - $ruleset = new Ruleset($config); - - // Process without suppression. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Process with suppression. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with @ suppression. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with suppression (deprecated syntax). - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process mixed case. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process late comment. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process late comment (deprecated syntax). - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with a block comment suppression. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with a multi-line block comment suppression. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with a block comment suppression (deprecated syntax). - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with a multi-line block comment suppression (deprecated syntax). - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with docblock suppression. - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Process with docblock suppression (deprecated syntax). - $content = 'process(); - - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - }//end testSuppressFile() - - - /** - * Test disabling specific sniffs. - * - * @return void - */ - public function testDisableSelected() - { - $config = new Config(); - $config->standards = ['Generic']; - $config->sniffs = [ - 'Generic.PHP.LowerCaseConstant', - 'Generic.Commenting.Todo', - ]; - - $ruleset = new Ruleset($config); - - // Suppress a single sniff. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Suppress multiple sniffs. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Suppress adding sniffs. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Suppress a category of sniffs. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Suppress a whole standard. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Suppress using docblocks. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Suppress wrong category using docblocks. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - }//end testDisableSelected() - - - /** - * Test re-enabling specific sniffs that have been disabled. - * - * @return void - */ - public function testEnableSelected() - { - $config = new Config(); - $config->standards = ['Generic']; - $config->sniffs = [ - 'Generic.PHP.LowerCaseConstant', - 'Generic.Commenting.Todo', - ]; - - $ruleset = new Ruleset($config); - - // Suppress a single sniff and re-enable. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress multiple sniffs and re-enable. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress multiple sniffs and re-enable one. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress a category of sniffs and re-enable. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress a whole standard and re-enable. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress a whole standard and re-enable a category. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress a category and re-enable a whole standard. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress a sniff and re-enable a category. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress a whole standard and re-enable a sniff. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress a whole standard and re-enable and re-disable a sniff. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(2, $numWarnings); - $this->assertCount(2, $warnings); - - // Suppress a whole standard and re-enable 2 specific sniffs independently. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(2, $numWarnings); - $this->assertCount(2, $warnings); - - }//end testEnableSelected() - - - /** - * Test ignoring specific sniffs. - * - * @return void - */ - public function testIgnoreSelected() - { - $config = new Config(); - $config->standards = ['Generic']; - $config->sniffs = [ - 'Generic.PHP.LowerCaseConstant', - 'Generic.Commenting.Todo', - ]; - - $ruleset = new Ruleset($config); - - // No suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(2, $numErrors); - $this->assertCount(2, $errors); - $this->assertEquals(2, $numWarnings); - $this->assertCount(2, $warnings); - - // Suppress a single sniff. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(2, $numErrors); - $this->assertCount(2, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress multiple sniffs. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Add to suppression. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Suppress a category of sniffs. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(2, $numErrors); - $this->assertCount(2, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress a whole standard. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - }//end testIgnoreSelected() - - - /** - * Test ignoring specific sniffs. - * - * @return void - */ - public function testCommenting() - { - $config = new Config(); - $config->standards = ['Generic']; - $config->sniffs = [ - 'Generic.PHP.LowerCaseConstant', - 'Generic.Commenting.Todo', - ]; - - $ruleset = new Ruleset($config); - - // Suppress a single sniff. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(2, $numErrors); - $this->assertCount(2, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress a single sniff and re-enable. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Suppress a single sniff using block comments. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(1, $numErrors); - $this->assertCount(1, $errors); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - // Suppress a single sniff with a multi-line comment. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(2, $numErrors); - $this->assertCount(2, $errors); - $this->assertEquals(1, $numWarnings); - $this->assertCount(1, $warnings); - - // Ignore an enable before a disable. - $content = 'process(); - - $errors = $file->getErrors(); - $numErrors = $file->getErrorCount(); - $warnings = $file->getWarnings(); - $numWarnings = $file->getWarningCount(); - $this->assertEquals(0, $numErrors); - $this->assertCount(0, $errors); - $this->assertEquals(0, $numWarnings); - $this->assertCount(0, $warnings); - - }//end testCommenting() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/FindEndOfStatementTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/File/FindEndOfStatementTest.inc deleted file mode 100644 index 1d72d7d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/FindEndOfStatementTest.inc +++ /dev/null @@ -1,55 +0,0 @@ - fn() => return 1, - 'b' => fn() => return 1, -]; - -/* testStaticArrowFunction */ -static fn ($a) => $a; - -/* testArrowFunctionReturnValue */ -fn(): array => [a($a, $b)]; - -/* testArrowFunctionAsArgument */ -$foo = foo( - fn() => bar() -); - -/* testArrowFunctionWithArrayAsArgument */ -$foo = foo( - fn() => [$row[0], $row[3]] -); - -return 0; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/FindEndOfStatementTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/File/FindEndOfStatementTest.php deleted file mode 100644 index 5e5fa6a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/FindEndOfStatementTest.php +++ /dev/null @@ -1,257 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -class FindEndOfStatementTest extends AbstractMethodUnitTest -{ - - - /** - * Test a simple assignment. - * - * @return void - */ - public function testSimpleAssignment() - { - $start = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testSimpleAssignment */') + 2); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 5)], $tokens[$found]); - - }//end testSimpleAssignment() - - - /** - * Test a direct call to a control structure. - * - * @return void - */ - public function testControlStructure() - { - $start = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testControlStructure */') + 2); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 6)], $tokens[$found]); - - }//end testControlStructure() - - - /** - * Test the assignment of a closure. - * - * @return void - */ - public function testClosureAssignment() - { - $start = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testClosureAssignment */') + 2); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 13)], $tokens[$found]); - - }//end testClosureAssignment() - - - /** - * Test using a heredoc in a function argument. - * - * @return void - */ - public function testHeredocFunctionArg() - { - // Find the end of the function. - $start = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testHeredocFunctionArg */') + 2); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 10)], $tokens[$found]); - - // Find the end of the heredoc. - $start += 2; - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 4)], $tokens[$found]); - - // Find the end of the last arg. - $start = ($found + 2); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[$start], $tokens[$found]); - - }//end testHeredocFunctionArg() - - - /** - * Test parts of a switch statement. - * - * @return void - */ - public function testSwitch() - { - // Find the end of the switch. - $start = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testSwitch */') + 2); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 28)], $tokens[$found]); - - // Find the end of the case. - $start += 9; - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 8)], $tokens[$found]); - - // Find the end of default case. - $start += 11; - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 6)], $tokens[$found]); - - }//end testSwitch() - - - /** - * Test statements that are array values. - * - * @return void - */ - public function testStatementAsArrayValue() - { - // Test short array syntax. - $start = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testStatementAsArrayValue */') + 7); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 2)], $tokens[$found]); - - // Test long array syntax. - $start += 12; - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 2)], $tokens[$found]); - - // Test same statement outside of array. - $start += 10; - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 3)], $tokens[$found]); - - }//end testStatementAsArrayValue() - - - /** - * Test a use group. - * - * @return void - */ - public function testUseGroup() - { - $start = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testUseGroup */') + 2); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 23)], $tokens[$found]); - - }//end testUseGroup() - - - /** - * Test a use group. - * - * @return void - */ - public function testArrowFunctionArrayValue() - { - $start = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testArrowFunctionArrayValue */') + 7); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 9)], $tokens[$found]); - - }//end testArrowFunctionArrayValue() - - - /** - * Test static arrow function. - * - * @return void - */ - public function testStaticArrowFunction() - { - $static = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testStaticArrowFunction */') + 2); - $fn = self::$phpcsFile->findNext(T_FN, ($static + 1)); - - $endOfStatementStatic = self::$phpcsFile->findEndOfStatement($static); - $endOfStatementFn = self::$phpcsFile->findEndOfStatement($fn); - - $this->assertSame($endOfStatementFn, $endOfStatementStatic); - - }//end testStaticArrowFunction() - - - /** - * Test arrow function with return value. - * - * @return void - */ - public function testArrowFunctionReturnValue() - { - $start = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testArrowFunctionReturnValue */') + 2); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 18)], $tokens[$found]); - - }//end testArrowFunctionReturnValue() - - - /** - * Test arrow function used as a function argument. - * - * @return void - */ - public function testArrowFunctionAsArgument() - { - $start = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testArrowFunctionAsArgument */') + 10); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 8)], $tokens[$found]); - - }//end testArrowFunctionAsArgument() - - - /** - * Test arrow function with arrays used as a function argument. - * - * @return void - */ - public function testArrowFunctionWithArrayAsArgument() - { - $start = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testArrowFunctionWithArrayAsArgument */') + 10); - $found = self::$phpcsFile->findEndOfStatement($start); - - $tokens = self::$phpcsFile->getTokens(); - $this->assertSame($tokens[($start + 17)], $tokens[$found]); - - }//end testArrowFunctionWithArrayAsArgument() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/FindExtendedClassNameTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/File/FindExtendedClassNameTest.inc deleted file mode 100644 index aead06c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/FindExtendedClassNameTest.inc +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -class FindExtendedClassNameTest extends AbstractMethodUnitTest -{ - - - /** - * Test retrieving the name of the class being extended by another class - * (or interface). - * - * @param string $identifier Comment which precedes the test case. - * @param bool $expected Expected function output. - * - * @dataProvider dataExtendedClass - * - * @return void - */ - public function testFindExtendedClassName($identifier, $expected) - { - $OOToken = $this->getTargetToken($identifier, [T_CLASS, T_ANON_CLASS, T_INTERFACE]); - $result = self::$phpcsFile->findExtendedClassName($OOToken); - $this->assertSame($expected, $result); - - }//end testFindExtendedClassName() - - - /** - * Data provider for the FindExtendedClassName test. - * - * @see testFindExtendedClassName() - * - * @return array - */ - public function dataExtendedClass() - { - return [ - [ - '/* testExtendedClass */', - 'testFECNClass', - ], - [ - '/* testNamespacedClass */', - '\PHP_CodeSniffer\Tests\Core\File\testFECNClass', - ], - [ - '/* testNonExtendedClass */', - false, - ], - [ - '/* testInterface */', - false, - ], - [ - '/* testInterfaceThatExtendsInterface */', - 'testFECNInterface', - ], - [ - '/* testInterfaceThatExtendsFQCNInterface */', - '\PHP_CodeSniffer\Tests\Core\File\testFECNInterface', - ], - [ - '/* testNestedExtendedClass */', - false, - ], - [ - '/* testNestedExtendedAnonClass */', - 'testFECNAnonClass', - ], - [ - '/* testClassThatExtendsAndImplements */', - 'testFECNClass', - ], - [ - '/* testClassThatImplementsAndExtends */', - 'testFECNClass', - ], - ]; - - }//end dataExtendedClass() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/FindImplementedInterfaceNamesTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/File/FindImplementedInterfaceNamesTest.inc deleted file mode 100644 index 3885b27..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/FindImplementedInterfaceNamesTest.inc +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -class FindImplementedInterfaceNamesTest extends AbstractMethodUnitTest -{ - - - /** - * Test retrieving the name(s) of the interfaces being implemented by a class. - * - * @param string $identifier Comment which precedes the test case. - * @param bool $expected Expected function output. - * - * @dataProvider dataImplementedInterface - * - * @return void - */ - public function testFindImplementedInterfaceNames($identifier, $expected) - { - $OOToken = $this->getTargetToken($identifier, [T_CLASS, T_ANON_CLASS, T_INTERFACE]); - $result = self::$phpcsFile->findImplementedInterfaceNames($OOToken); - $this->assertSame($expected, $result); - - }//end testFindImplementedInterfaceNames() - - - /** - * Data provider for the FindImplementedInterfaceNames test. - * - * @see testFindImplementedInterfaceNames() - * - * @return array - */ - public function dataImplementedInterface() - { - return [ - [ - '/* testImplementedClass */', - ['testFIINInterface'], - ], - [ - '/* testMultiImplementedClass */', - [ - 'testFIINInterface', - 'testFIINInterface2', - ], - ], - [ - '/* testNamespacedClass */', - ['\PHP_CodeSniffer\Tests\Core\File\testFIINInterface'], - ], - [ - '/* testNonImplementedClass */', - false, - ], - [ - '/* testInterface */', - false, - ], - [ - '/* testClassThatExtendsAndImplements */', - [ - 'InterfaceA', - '\NameSpaced\Cat\InterfaceB', - ], - ], - [ - '/* testClassThatImplementsAndExtends */', - [ - '\InterfaceA', - 'InterfaceB', - ], - ], - ]; - - }//end dataImplementedInterface() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMemberPropertiesTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMemberPropertiesTest.inc deleted file mode 100644 index af52ff7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMemberPropertiesTest.inc +++ /dev/null @@ -1,181 +0,0 @@ - 'a', 'b' => 'b' ), - /* testGroupPrivate 3 */ - $varQ = 'string', - /* testGroupPrivate 4 */ - $varR = 123, - /* testGroupPrivate 5 */ - $varS = ONE / self::THREE, - /* testGroupPrivate 6 */ - $varT = [ - 'a' => 'a', - 'b' => 'b' - ], - /* testGroupPrivate 7 */ - $varU = __DIR__ . "/base"; - - - /* testMethodParam */ - public function methodName($param) { - /* testImportedGlobal */ - global $importedGlobal = true; - - /* testLocalVariable */ - $localVariable = true; - } - - /* testPropertyAfterMethod */ - private static $varV = true; - - /* testMessyNullableType */ - public /* comment - */ ? //comment - array $foo = []; - - /* testNamespaceType */ - public \MyNamespace\MyClass $foo; - - /* testNullableNamespaceType 1 */ - private ?ClassName $nullableClassType; - - /* testNullableNamespaceType 2 */ - protected ?Folder\ClassName $nullableClassType2; - - /* testMultilineNamespaceType */ - public \MyNamespace /** comment *\/ comment */ - \MyClass /* comment */ - \Foo $foo; - -} - -interface Base -{ - /* testInterfaceProperty */ - protected $anonymous; -} - -/* testGlobalVariable */ -$globalVariable = true; - -/* testNotAVariable */ -return; - -$a = ( $foo == $bar ? new stdClass() : - new class() { - /* testNestedProperty 1 */ - public $var = true; - - /* testNestedMethodParam 1 */ - public function something($var = false) {} - } -); - -function_call( 'param', new class { - /* testNestedProperty 2 */ - public $year = 2017; - - /* testNestedMethodParam 2 */ - public function __construct( $open, $post_id ) {} -}, 10, 2 ); diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMemberPropertiesTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMemberPropertiesTest.php deleted file mode 100644 index a4bff22..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMemberPropertiesTest.php +++ /dev/null @@ -1,524 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -class GetMemberPropertiesTest extends AbstractMethodUnitTest -{ - - - /** - * Test the getMemberProperties() method. - * - * @param string $identifier Comment which precedes the test case. - * @param bool $expected Expected function output. - * - * @dataProvider dataGetMemberProperties - * - * @return void - */ - public function testGetMemberProperties($identifier, $expected) - { - $variable = $this->getTargetToken($identifier, T_VARIABLE); - $result = self::$phpcsFile->getMemberProperties($variable); - - $this->assertArraySubset($expected, $result, true); - - }//end testGetMemberProperties() - - - /** - * Data provider for the GetMemberProperties test. - * - * @see testGetMemberProperties() - * - * @return array - */ - public function dataGetMemberProperties() - { - return [ - [ - '/* testVar */', - [ - 'scope' => 'public', - 'scope_specified' => false, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testVarType */', - [ - 'scope' => 'public', - 'scope_specified' => false, - 'is_static' => false, - 'type' => '?int', - 'nullable_type' => true, - ], - ], - [ - '/* testPublic */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testPublicType */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => false, - 'type' => 'string', - 'nullable_type' => false, - ], - ], - [ - '/* testProtected */', - [ - 'scope' => 'protected', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testProtectedType */', - [ - 'scope' => 'protected', - 'scope_specified' => true, - 'is_static' => false, - 'type' => 'bool', - 'nullable_type' => false, - ], - ], - [ - '/* testPrivate */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testPrivateType */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => false, - 'type' => 'array', - 'nullable_type' => false, - ], - ], - [ - '/* testStatic */', - [ - 'scope' => 'public', - 'scope_specified' => false, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testStaticType */', - [ - 'scope' => 'public', - 'scope_specified' => false, - 'is_static' => true, - 'type' => '?string', - 'nullable_type' => true, - ], - ], - [ - '/* testStaticVar */', - [ - 'scope' => 'public', - 'scope_specified' => false, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testVarStatic */', - [ - 'scope' => 'public', - 'scope_specified' => false, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testPublicStatic */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testProtectedStatic */', - [ - 'scope' => 'protected', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testPrivateStatic */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testPublicStaticWithDocblock */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testProtectedStaticWithDocblock */', - [ - 'scope' => 'protected', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testPrivateStaticWithDocblock */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupType 1 */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => false, - 'type' => 'float', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupType 2 */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => false, - 'type' => 'float', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupNullableType 1 */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '?string', - 'nullable_type' => true, - ], - ], - [ - '/* testGroupNullableType 2 */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '?string', - 'nullable_type' => true, - ], - ], - [ - '/* testNoPrefix */', - [ - 'scope' => 'public', - 'scope_specified' => false, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupProtectedStatic 1 */', - [ - 'scope' => 'protected', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupProtectedStatic 2 */', - [ - 'scope' => 'protected', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupProtectedStatic 3 */', - [ - 'scope' => 'protected', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupPrivate 1 */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupPrivate 2 */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupPrivate 3 */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupPrivate 4 */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupPrivate 5 */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupPrivate 6 */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testGroupPrivate 7 */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testMessyNullableType */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '?array', - 'nullable_type' => true, - ], - ], - [ - '/* testNamespaceType */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '\MyNamespace\MyClass', - 'nullable_type' => false, - ], - ], - [ - '/* testNullableNamespaceType 1 */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '?ClassName', - 'nullable_type' => true, - ], - ], - [ - '/* testNullableNamespaceType 2 */', - [ - 'scope' => 'protected', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '?Folder\ClassName', - 'nullable_type' => true, - ], - ], - [ - '/* testMultilineNamespaceType */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '\MyNamespace\MyClass\Foo', - 'nullable_type' => false, - ], - ], - [ - '/* testPropertyAfterMethod */', - [ - 'scope' => 'private', - 'scope_specified' => true, - 'is_static' => true, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testInterfaceProperty */', - [], - ], - [ - '/* testNestedProperty 1 */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - [ - '/* testNestedProperty 2 */', - [ - 'scope' => 'public', - 'scope_specified' => true, - 'is_static' => false, - 'type' => '', - 'nullable_type' => false, - ], - ], - ]; - - }//end dataGetMemberProperties() - - - /** - * Test receiving an expected exception when a non property is passed. - * - * @param string $identifier Comment which precedes the test case. - * - * @expectedException PHP_CodeSniffer\Exceptions\RuntimeException - * @expectedExceptionMessage $stackPtr is not a class member var - * - * @dataProvider dataNotClassProperty - * - * @return void - */ - public function testNotClassPropertyException($identifier) - { - $variable = $this->getTargetToken($identifier, T_VARIABLE); - $result = self::$phpcsFile->getMemberProperties($variable); - - }//end testNotClassPropertyException() - - - /** - * Data provider for the NotClassPropertyException test. - * - * @see testNotClassPropertyException() - * - * @return array - */ - public function dataNotClassProperty() - { - return [ - ['/* testMethodParam */'], - ['/* testImportedGlobal */'], - ['/* testLocalVariable */'], - ['/* testGlobalVariable */'], - ['/* testNestedMethodParam 1 */'], - ['/* testNestedMethodParam 2 */'], - ]; - - }//end dataNotClassProperty() - - - /** - * Test receiving an expected exception when a non variable is passed. - * - * @expectedException PHP_CodeSniffer\Exceptions\RuntimeException - * @expectedExceptionMessage $stackPtr must be of type T_VARIABLE - * - * @return void - */ - public function testNotAVariableException() - { - $next = $this->getTargetToken('/* testNotAVariable */', T_RETURN); - $result = self::$phpcsFile->getMemberProperties($next); - - }//end testNotAVariableException() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodParametersTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodParametersTest.inc deleted file mode 100644 index 86eff8d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodParametersTest.inc +++ /dev/null @@ -1,33 +0,0 @@ - $b; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodParametersTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodParametersTest.php deleted file mode 100644 index 1e8595d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodParametersTest.php +++ /dev/null @@ -1,295 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -class GetMethodParametersTest extends AbstractMethodUnitTest -{ - - - /** - * Verify pass-by-reference parsing. - * - * @return void - */ - public function testPassByReference() - { - $expected = []; - $expected[0] = [ - 'name' => '$var', - 'content' => '&$var', - 'pass_by_reference' => true, - 'variable_length' => false, - 'type_hint' => '', - 'nullable_type' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPassByReference() - - - /** - * Verify array hint parsing. - * - * @return void - */ - public function testArrayHint() - { - $expected = []; - $expected[0] = [ - 'name' => '$var', - 'content' => 'array $var', - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => 'array', - 'nullable_type' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrayHint() - - - /** - * Verify type hint parsing. - * - * @return void - */ - public function testTypeHint() - { - $expected = []; - $expected[0] = [ - 'name' => '$var1', - 'content' => 'foo $var1', - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => 'foo', - 'nullable_type' => false, - ]; - - $expected[1] = [ - 'name' => '$var2', - 'content' => 'bar $var2', - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => 'bar', - 'nullable_type' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testTypeHint() - - - /** - * Verify self type hint parsing. - * - * @return void - */ - public function testSelfTypeHint() - { - $expected = []; - $expected[0] = [ - 'name' => '$var', - 'content' => 'self $var', - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => 'self', - 'nullable_type' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testSelfTypeHint() - - - /** - * Verify nullable type hint parsing. - * - * @return void - */ - public function testNullableTypeHint() - { - $expected = []; - $expected[0] = [ - 'name' => '$var1', - 'content' => '?int $var1', - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => '?int', - 'nullable_type' => true, - ]; - - $expected[1] = [ - 'name' => '$var2', - 'content' => '?\bar $var2', - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => '?\bar', - 'nullable_type' => true, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testNullableTypeHint() - - - /** - * Verify variable. - * - * @return void - */ - public function testVariable() - { - $expected = []; - $expected[0] = [ - 'name' => '$var', - 'content' => '$var', - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => '', - 'nullable_type' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testVariable() - - - /** - * Verify default value parsing with a single function param. - * - * @return void - */ - public function testSingleDefaultValue() - { - $expected = []; - $expected[0] = [ - 'name' => '$var1', - 'content' => '$var1=self::CONSTANT', - 'default' => 'self::CONSTANT', - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => '', - 'nullable_type' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testSingleDefaultValue() - - - /** - * Verify default value parsing. - * - * @return void - */ - public function testDefaultValues() - { - $expected = []; - $expected[0] = [ - 'name' => '$var1', - 'content' => '$var1=1', - 'default' => '1', - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => '', - 'nullable_type' => false, - ]; - $expected[1] = [ - 'name' => '$var2', - 'content' => "\$var2='value'", - 'default' => "'value'", - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => '', - 'nullable_type' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testDefaultValues() - - - /** - * Verify "bitwise and" in default value !== pass-by-reference. - * - * @return void - */ - public function testBitwiseAndConstantExpressionDefaultValue() - { - $expected = []; - $expected[0] = [ - 'name' => '$a', - 'content' => '$a = 10 & 20', - 'default' => '10 & 20', - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => '', - 'nullable_type' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testBitwiseAndConstantExpressionDefaultValue() - - - /** - * Verify that arrow functions are supported. - * - * @return void - */ - public function testArrowFunction() - { - $expected = []; - $expected[0] = [ - 'name' => '$a', - 'content' => 'int $a', - 'pass_by_reference' => false, - 'variable_length' => false, - 'type_hint' => 'int', - 'nullable_type' => false, - ]; - - $expected[1] = [ - 'name' => '$b', - 'content' => '...$b', - 'pass_by_reference' => false, - 'variable_length' => true, - 'type_hint' => '', - 'nullable_type' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrowFunction() - - - /** - * Test helper. - * - * @param string $commentString The comment which preceeds the test. - * @param array $expected The expected function output. - * - * @return void - */ - private function getMethodParametersTestHelper($commentString, $expected) - { - $function = $this->getTargetToken($commentString, [T_FUNCTION, T_FN]); - $found = self::$phpcsFile->getMethodParameters($function); - - $this->assertArraySubset($expected, $found, true); - - }//end getMethodParametersTestHelper() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodPropertiesTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodPropertiesTest.inc deleted file mode 100644 index 7b6223e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodPropertiesTest.inc +++ /dev/null @@ -1,68 +0,0 @@ - $number + 1, - $numbers -); diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodPropertiesTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodPropertiesTest.php deleted file mode 100644 index b0b2d5e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/GetMethodPropertiesTest.php +++ /dev/null @@ -1,404 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -class GetMethodPropertiesTest extends AbstractMethodUnitTest -{ - - - /** - * Test a basic function. - * - * @return void - */ - public function testBasicFunction() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testBasicFunction() - - - /** - * Test a function with a return type. - * - * @return void - */ - public function testReturnFunction() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'array', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testReturnFunction() - - - /** - * Test a closure used as a function argument. - * - * @return void - */ - public function testNestedClosure() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'int', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testNestedClosure() - - - /** - * Test a basic method. - * - * @return void - */ - public function testBasicMethod() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testBasicMethod() - - - /** - * Test a private static method. - * - * @return void - */ - public function testPrivateStaticMethod() - { - $expected = [ - 'scope' => 'private', - 'scope_specified' => true, - 'return_type' => '', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => true, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPrivateStaticMethod() - - - /** - * Test a basic final method. - * - * @return void - */ - public function testFinalMethod() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => true, - 'return_type' => '', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => true, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testFinalMethod() - - - /** - * Test a protected method with a return type. - * - * @return void - */ - public function testProtectedReturnMethod() - { - $expected = [ - 'scope' => 'protected', - 'scope_specified' => true, - 'return_type' => 'int', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testProtectedReturnMethod() - - - /** - * Test a public method with a return type. - * - * @return void - */ - public function testPublicReturnMethod() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => true, - 'return_type' => 'array', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPublicReturnMethod() - - - /** - * Test a public method with a nullable return type. - * - * @return void - */ - public function testNullableReturnMethod() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => true, - 'return_type' => '?array', - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testNullableReturnMethod() - - - /** - * Test a public method with a nullable return type. - * - * @return void - */ - public function testMessyNullableReturnMethod() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => true, - 'return_type' => '?array', - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testMessyNullableReturnMethod() - - - /** - * Test a method with a namespaced return type. - * - * @return void - */ - public function testReturnNamespace() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '\MyNamespace\MyClass', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testReturnNamespace() - - - /** - * Test a method with a messy namespaces return type. - * - * @return void - */ - public function testReturnMultilineNamespace() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '\MyNamespace\MyClass\Foo', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testReturnMultilineNamespace() - - - /** - * Test a basic abstract method. - * - * @return void - */ - public function testAbstractMethod() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '', - 'nullable_return_type' => false, - 'is_abstract' => true, - 'is_final' => false, - 'is_static' => false, - 'has_body' => false, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testAbstractMethod() - - - /** - * Test an abstract method with a return type. - * - * @return void - */ - public function testAbstractReturnMethod() - { - $expected = [ - 'scope' => 'protected', - 'scope_specified' => true, - 'return_type' => 'bool', - 'nullable_return_type' => false, - 'is_abstract' => true, - 'is_final' => false, - 'is_static' => false, - 'has_body' => false, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testAbstractReturnMethod() - - - /** - * Test a basic interface method. - * - * @return void - */ - public function testInterfaceMethod() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => false, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testInterfaceMethod() - - - /** - * Test a static arrow function. - * - * @return void - */ - public function testArrowFunction() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'int', - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => true, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrowFunction() - - - /** - * Test helper. - * - * @param string $commentString The comment which preceeds the test. - * @param array $expected The expected function output. - * - * @return void - */ - private function getMethodPropertiesTestHelper($commentString, $expected) - { - $function = $this->getTargetToken($commentString, [T_FUNCTION, T_CLOSURE, T_FN]); - $found = self::$phpcsFile->getMethodProperties($function); - - $this->assertArraySubset($expected, $found, true); - - }//end getMethodPropertiesTestHelper() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/IsReferenceTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/File/IsReferenceTest.inc deleted file mode 100644 index 4702405..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/IsReferenceTest.inc +++ /dev/null @@ -1,141 +0,0 @@ - $first, 'b' => $something & $somethingElse ]; - -/* testBitwiseAndF */ -$a = array( 'a' => $first, 'b' => $something & \MyClass::$somethingElse ); - -/* testBitwiseAndG */ -$a = $something & $somethingElse; - -/* testBitwiseAndH */ -function myFunction($a = 10 & 20) {} - -/* testBitwiseAndI */ -$closure = function ($a = MY_CONSTANT & parent::OTHER_CONSTANT) {}; - -/* testFunctionReturnByReference */ -function &myFunction() {} - -/* testFunctionPassByReferenceA */ -function myFunction( &$a ) {} - -/* testFunctionPassByReferenceB */ -function myFunction( $a, &$b ) {} - -/* testFunctionPassByReferenceC */ -$closure = function ( &$a ) {}; - -/* testFunctionPassByReferenceD */ -$closure = function ( $a, &$b ) {}; - -/* testFunctionPassByReferenceE */ -function myFunction(array &$one) {} - -/* testFunctionPassByReferenceF */ -$closure = function (\MyClass &$one) {}; - -/* testFunctionPassByReferenceG */ -$closure = function myFunc($param, &...$moreParams) {}; - -/* testForeachValueByReference */ -foreach( $array as $key => &$value ) {} - -/* testForeachKeyByReference */ -foreach( $array as &$key => $value ) {} - -/* testArrayValueByReferenceA */ -$a = [ 'a' => &$something ]; - -/* testArrayValueByReferenceB */ -$a = [ 'a' => $something, 'b' => &$somethingElse ]; - -/* testArrayValueByReferenceC */ -$a = [ &$something ]; - -/* testArrayValueByReferenceD */ -$a = [ $something, &$somethingElse ]; - -/* testArrayValueByReferenceE */ -$a = array( 'a' => &$something ); - -/* testArrayValueByReferenceF */ -$a = array( 'a' => $something, 'b' => &$somethingElse ); - -/* testArrayValueByReferenceG */ -$a = array( &$something ); - -/* testArrayValueByReferenceH */ -$a = array( $something, &$somethingElse ); - -/* testAssignByReferenceA */ -$b = &$something; - -/* testAssignByReferenceB */ -$b =& $something; - -/* testAssignByReferenceC */ -$b .= &$something; - -/* testAssignByReferenceD */ -$myValue = &$obj->getValue(); - -/* testAssignByReferenceE */ -$collection = &collector(); - -/* testPassByReferenceA */ -functionCall(&$something, $somethingElse); - -/* testPassByReferenceB */ -functionCall($something, &$somethingElse); - -/* testPassByReferenceC */ -functionCall($something, &$this->somethingElse); - -/* testPassByReferenceD */ -functionCall($something, &self::$somethingElse); - -/* testPassByReferenceE */ -functionCall($something, &parent::$somethingElse); - -/* testPassByReferenceF */ -functionCall($something, &static::$somethingElse); - -/* testPassByReferenceG */ -functionCall($something, &SomeClass::$somethingElse); - -/* testPassByReferenceH */ -functionCall(&\SomeClass::$somethingElse); - -/* testPassByReferenceI */ -functionCall($something, &\SomeNS\SomeClass::$somethingElse); - -/* testPassByReferenceJ */ -functionCall($something, &namespace\SomeClass::$somethingElse); - -/* testNewByReferenceA */ -$foobar2 = &new Foobar(); - -/* testNewByReferenceB */ -functionCall( $something , &new Foobar() ); - -/* testUseByReference */ -$closure = function() use (&$var){}; - -/* testArrowFunctionReturnByReference */ -fn&($x) => $x; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/File/IsReferenceTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/File/IsReferenceTest.php deleted file mode 100644 index be45ee2..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/File/IsReferenceTest.php +++ /dev/null @@ -1,236 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -class IsReferenceTest extends AbstractMethodUnitTest -{ - - - /** - * Test a class that extends another. - * - * @param string $identifier Comment which precedes the test case. - * @param bool $expected Expected function output. - * - * @dataProvider dataIsReference - * - * @return void - */ - public function testIsReference($identifier, $expected) - { - $bitwiseAnd = $this->getTargetToken($identifier, T_BITWISE_AND); - $result = self::$phpcsFile->isReference($bitwiseAnd); - $this->assertSame($expected, $result); - - }//end testIsReference() - - - /** - * Data provider for the IsReference test. - * - * @see testIsReference() - * - * @return array - */ - public function dataIsReference() - { - return [ - [ - '/* testBitwiseAndA */', - false, - ], - [ - '/* testBitwiseAndB */', - false, - ], - [ - '/* testBitwiseAndC */', - false, - ], - [ - '/* testBitwiseAndD */', - false, - ], - [ - '/* testBitwiseAndE */', - false, - ], - [ - '/* testBitwiseAndF */', - false, - ], - [ - '/* testBitwiseAndG */', - false, - ], - [ - '/* testBitwiseAndH */', - false, - ], - [ - '/* testBitwiseAndI */', - false, - ], - [ - '/* testFunctionReturnByReference */', - true, - ], - [ - '/* testFunctionPassByReferenceA */', - true, - ], - [ - '/* testFunctionPassByReferenceB */', - true, - ], - [ - '/* testFunctionPassByReferenceC */', - true, - ], - [ - '/* testFunctionPassByReferenceD */', - true, - ], - [ - '/* testFunctionPassByReferenceE */', - true, - ], - [ - '/* testFunctionPassByReferenceF */', - true, - ], - [ - '/* testFunctionPassByReferenceG */', - true, - ], - [ - '/* testForeachValueByReference */', - true, - ], - [ - '/* testForeachKeyByReference */', - true, - ], - [ - '/* testArrayValueByReferenceA */', - true, - ], - [ - '/* testArrayValueByReferenceB */', - true, - ], - [ - '/* testArrayValueByReferenceC */', - true, - ], - [ - '/* testArrayValueByReferenceD */', - true, - ], - [ - '/* testArrayValueByReferenceE */', - true, - ], - [ - '/* testArrayValueByReferenceF */', - true, - ], - [ - '/* testArrayValueByReferenceG */', - true, - ], - [ - '/* testArrayValueByReferenceH */', - true, - ], - [ - '/* testAssignByReferenceA */', - true, - ], - [ - '/* testAssignByReferenceB */', - true, - ], - [ - '/* testAssignByReferenceC */', - true, - ], - [ - '/* testAssignByReferenceD */', - true, - ], - [ - '/* testAssignByReferenceE */', - true, - ], - [ - '/* testPassByReferenceA */', - true, - ], - [ - '/* testPassByReferenceB */', - true, - ], - [ - '/* testPassByReferenceC */', - true, - ], - [ - '/* testPassByReferenceD */', - true, - ], - [ - '/* testPassByReferenceE */', - true, - ], - [ - '/* testPassByReferenceF */', - true, - ], - [ - '/* testPassByReferenceG */', - true, - ], - [ - '/* testPassByReferenceH */', - true, - ], - [ - '/* testPassByReferenceI */', - true, - ], - [ - '/* testPassByReferenceJ */', - true, - ], - [ - '/* testNewByReferenceA */', - true, - ], - [ - '/* testNewByReferenceB */', - true, - ], - [ - '/* testUseByReference */', - true, - ], - [ - '/* testArrowFunctionReturnByReference */', - true, - ], - ]; - - }//end dataIsReference() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.php deleted file mode 100644 index 5d928c3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.php +++ /dev/null @@ -1,150 +0,0 @@ - - * @author Juliette Reinders Folmer - * @copyright 2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Filters\Filter; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Filters\Filter; -use PHP_CodeSniffer\Ruleset; -use PHPUnit\Framework\TestCase; - -class AcceptTest extends TestCase -{ - - /** - * The Config object. - * - * @var \PHP_CodeSniffer\Config - */ - protected static $config; - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - protected static $ruleset; - - - /** - * Initialize the test. - * - * @return void - */ - public function setUp() - { - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // PEAR installs test and sniff files into different locations - // so these tests will not pass as they directly reference files - // by relative location. - $this->markTestSkipped('Test cannot run from a PEAR install'); - } - - }//end setUp() - - - /** - * Initialize the config and ruleset objects based on the `AcceptTest.xml` ruleset file. - * - * @return void - */ - public static function setUpBeforeClass() - { - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // This test will be skipped. - return; - } - - $standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; - self::$config = new Config(["--standard=$standard", "--ignore=*/somethingelse/*"]); - self::$ruleset = new Ruleset(self::$config); - - }//end setUpBeforeClass() - - - /** - * Test filtering a file list for excluded paths. - * - * @param array $inputPaths List of file paths to be filtered. - * @param array $expectedOutput Expected filtering result. - * - * @dataProvider dataExcludePatterns - * - * @return void - */ - public function testExcludePatterns($inputPaths, $expectedOutput) - { - $fakeDI = new \RecursiveArrayIterator($inputPaths); - $filter = new Filter($fakeDI, '/', self::$config, self::$ruleset); - $iterator = new \RecursiveIteratorIterator($filter); - $files = []; - - foreach ($iterator as $file) { - $files[] = $file; - } - - $this->assertEquals($expectedOutput, $files); - - }//end testExcludePatterns() - - - /** - * Data provider. - * - * @see testExcludePatterns - * - * @return array - */ - public function dataExcludePatterns() - { - $testCases = [ - // Test top-level exclude patterns. - [ - [ - '/path/to/src/Main.php', - '/path/to/src/Something/Main.php', - '/path/to/src/Somethingelse/Main.php', - '/path/to/src/Other/Main.php', - ], - ['/path/to/src/Main.php'], - ], - - // Test ignoring standard/sniff specific exclude patterns. - [ - [ - '/path/to/src/generic-project/Main.php', - '/path/to/src/generic/Main.php', - '/path/to/src/anything-generic/Main.php', - ], - [ - '/path/to/src/generic-project/Main.php', - '/path/to/src/generic/Main.php', - '/path/to/src/anything-generic/Main.php', - ], - ], - ]; - - // Allow these tests to work on Windows as well. - if (DIRECTORY_SEPARATOR === '\\') { - foreach ($testCases as $key => $case) { - foreach ($case as $nr => $param) { - foreach ($param as $file => $value) { - $testCases[$key][$nr][$file] = strtr($value, '/', '\\'); - } - } - } - } - - return $testCases; - - }//end dataExcludePatterns() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.xml deleted file mode 100644 index 3d3e1de..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - Ruleset to test the filtering based on exclude patterns. - - - */something/* - - */Other/Main\.php$ - - - - /anything/* - - /YetAnother/Main\.php - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/IsCamelCapsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/IsCamelCapsTest.php deleted file mode 100644 index b60d524..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/IsCamelCapsTest.php +++ /dev/null @@ -1,135 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core; - -use PHP_CodeSniffer\Util\Common; -use PHPUnit\Framework\TestCase; - -class IsCamelCapsTest extends TestCase -{ - - - /** - * Test valid public function/method names. - * - * @return void - */ - public function testValidNotClassFormatPublic() - { - $this->assertTrue(Common::isCamelCaps('thisIsCamelCaps', false, true, true)); - $this->assertTrue(Common::isCamelCaps('thisISCamelCaps', false, true, false)); - - }//end testValidNotClassFormatPublic() - - - /** - * Test invalid public function/method names. - * - * @return void - */ - public function testInvalidNotClassFormatPublic() - { - $this->assertFalse(Common::isCamelCaps('_thisIsCamelCaps', false, true, true)); - $this->assertFalse(Common::isCamelCaps('thisISCamelCaps', false, true, true)); - $this->assertFalse(Common::isCamelCaps('ThisIsCamelCaps', false, true, true)); - - $this->assertFalse(Common::isCamelCaps('3thisIsCamelCaps', false, true, true)); - $this->assertFalse(Common::isCamelCaps('*thisIsCamelCaps', false, true, true)); - $this->assertFalse(Common::isCamelCaps('-thisIsCamelCaps', false, true, true)); - - $this->assertFalse(Common::isCamelCaps('this*IsCamelCaps', false, true, true)); - $this->assertFalse(Common::isCamelCaps('this-IsCamelCaps', false, true, true)); - $this->assertFalse(Common::isCamelCaps('this_IsCamelCaps', false, true, true)); - $this->assertFalse(Common::isCamelCaps('this_is_camel_caps', false, true, true)); - - }//end testInvalidNotClassFormatPublic() - - - /** - * Test valid private method names. - * - * @return void - */ - public function testValidNotClassFormatPrivate() - { - $this->assertTrue(Common::isCamelCaps('_thisIsCamelCaps', false, false, true)); - $this->assertTrue(Common::isCamelCaps('_thisISCamelCaps', false, false, false)); - $this->assertTrue(Common::isCamelCaps('_i18N', false, false, true)); - $this->assertTrue(Common::isCamelCaps('_i18n', false, false, true)); - - }//end testValidNotClassFormatPrivate() - - - /** - * Test invalid private method names. - * - * @return void - */ - public function testInvalidNotClassFormatPrivate() - { - $this->assertFalse(Common::isCamelCaps('thisIsCamelCaps', false, false, true)); - $this->assertFalse(Common::isCamelCaps('_thisISCamelCaps', false, false, true)); - $this->assertFalse(Common::isCamelCaps('_ThisIsCamelCaps', false, false, true)); - $this->assertFalse(Common::isCamelCaps('__thisIsCamelCaps', false, false, true)); - $this->assertFalse(Common::isCamelCaps('__thisISCamelCaps', false, false, false)); - - $this->assertFalse(Common::isCamelCaps('3thisIsCamelCaps', false, false, true)); - $this->assertFalse(Common::isCamelCaps('*thisIsCamelCaps', false, false, true)); - $this->assertFalse(Common::isCamelCaps('-thisIsCamelCaps', false, false, true)); - $this->assertFalse(Common::isCamelCaps('_this_is_camel_caps', false, false, true)); - - }//end testInvalidNotClassFormatPrivate() - - - /** - * Test valid class names. - * - * @return void - */ - public function testValidClassFormatPublic() - { - $this->assertTrue(Common::isCamelCaps('ThisIsCamelCaps', true, true, true)); - $this->assertTrue(Common::isCamelCaps('ThisISCamelCaps', true, true, false)); - $this->assertTrue(Common::isCamelCaps('This3IsCamelCaps', true, true, false)); - - }//end testValidClassFormatPublic() - - - /** - * Test invalid class names. - * - * @return void - */ - public function testInvalidClassFormat() - { - $this->assertFalse(Common::isCamelCaps('thisIsCamelCaps', true)); - $this->assertFalse(Common::isCamelCaps('This-IsCamelCaps', true)); - $this->assertFalse(Common::isCamelCaps('This_Is_Camel_Caps', true)); - - }//end testInvalidClassFormat() - - - /** - * Test invalid class names with the private flag set. - * - * Note that the private flag is ignored if the class format - * flag is set, so these names are all invalid. - * - * @return void - */ - public function testInvalidClassFormatPrivate() - { - $this->assertFalse(Common::isCamelCaps('_ThisIsCamelCaps', true, true)); - $this->assertFalse(Common::isCamelCaps('_ThisIsCamelCaps', true, false)); - - }//end testInvalidClassFormatPrivate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php deleted file mode 100644 index 8b138e0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php +++ /dev/null @@ -1,118 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Ruleset; -use PHPUnit\Framework\TestCase; - -class RuleInclusionAbsoluteLinuxTest extends TestCase -{ - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - protected $ruleset; - - /** - * Path to the ruleset file. - * - * @var string - */ - private $standard = ''; - - /** - * The original content of the ruleset. - * - * @var string - */ - private $contents = ''; - - - /** - * Initialize the config and ruleset objects. - * - * @return void - */ - public function setUp() - { - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // PEAR installs test and sniff files into different locations - // so these tests will not pass as they directly reference files - // by relative location. - $this->markTestSkipped('Test cannot run from a PEAR install'); - } - - $this->standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; - $repoRootDir = dirname(dirname(dirname(__DIR__))); - - // On-the-fly adjust the ruleset test file to be able to test sniffs included with absolute paths. - $contents = file_get_contents($this->standard); - $this->contents = $contents; - - $newPath = $repoRootDir; - if (DIRECTORY_SEPARATOR === '\\') { - $newPath = str_replace('\\', '/', $repoRootDir); - } - - $adjusted = str_replace('%path_slash_forward%', $newPath, $contents); - - if (file_put_contents($this->standard, $adjusted) === false) { - $this->markTestSkipped('On the fly ruleset adjustment failed'); - } - - // Initialize the config and ruleset objects for the test. - $config = new Config(["--standard={$this->standard}"]); - $this->ruleset = new Ruleset($config); - - }//end setUp() - - - /** - * Reset ruleset file. - * - * @return void - */ - public function tearDown() - { - file_put_contents($this->standard, $this->contents); - - }//end tearDown() - - - /** - * Test that sniffs registed with a Linux absolute path are correctly recognized and that - * properties are correctly set for them. - * - * @return void - */ - public function testLinuxStylePathRuleInclusion() - { - // Test that the sniff is correctly registered. - $this->assertObjectHasAttribute('sniffCodes', $this->ruleset); - $this->assertCount(1, $this->ruleset->sniffCodes); - $this->assertArrayHasKey('Generic.Formatting.SpaceAfterNot', $this->ruleset->sniffCodes); - $this->assertSame( - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterNotSniff', - $this->ruleset->sniffCodes['Generic.Formatting.SpaceAfterNot'] - ); - - // Test that the sniff properties are correctly set. - $this->assertSame( - '10', - $this->ruleset->sniffs['PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterNotSniff']->spacing - ); - - }//end testLinuxStylePathRuleInclusion() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml deleted file mode 100644 index 64d1aae..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php deleted file mode 100644 index f8e3255..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php +++ /dev/null @@ -1,119 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Ruleset; -use PHPUnit\Framework\TestCase; - -class RuleInclusionAbsoluteWindowsTest extends TestCase -{ - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - protected $ruleset; - - /** - * Path to the ruleset file. - * - * @var string - */ - private $standard = ''; - - /** - * The original content of the ruleset. - * - * @var string - */ - private $contents = ''; - - - /** - * Initialize the config and ruleset objects. - * - * @return void - */ - public function setUp() - { - if (DIRECTORY_SEPARATOR === '/') { - $this->markTestSkipped('Windows specific test'); - } - - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // PEAR installs test and sniff files into different locations - // so these tests will not pass as they directly reference files - // by relative location. - $this->markTestSkipped('Test cannot run from a PEAR install'); - } - - $this->standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; - $repoRootDir = dirname(dirname(dirname(__DIR__))); - - // On-the-fly adjust the ruleset test file to be able to test sniffs included with absolute paths. - $contents = file_get_contents($this->standard); - $this->contents = $contents; - - $adjusted = str_replace('%path_slash_back%', $repoRootDir, $contents); - - if (file_put_contents($this->standard, $adjusted) === false) { - $this->markTestSkipped('On the fly ruleset adjustment failed'); - } - - // Initialize the config and ruleset objects for the test. - $config = new Config(["--standard={$this->standard}"]); - $this->ruleset = new Ruleset($config); - - }//end setUp() - - - /** - * Reset ruleset file. - * - * @return void - */ - public function tearDown() - { - if (DIRECTORY_SEPARATOR !== '/') { - file_put_contents($this->standard, $this->contents); - } - - }//end tearDown() - - - /** - * Test that sniffs registed with a Windows absolute path are correctly recognized and that - * properties are correctly set for them. - * - * @return void - */ - public function testWindowsStylePathRuleInclusion() - { - // Test that the sniff is correctly registered. - $this->assertObjectHasAttribute('sniffCodes', $this->ruleset); - $this->assertCount(1, $this->ruleset->sniffCodes); - $this->assertArrayHasKey('Generic.Formatting.SpaceAfterCast', $this->ruleset->sniffCodes); - $this->assertSame( - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterCastSniff', - $this->ruleset->sniffCodes['Generic.Formatting.SpaceAfterCast'] - ); - - // Test that the sniff property is correctly set. - $this->assertSame( - '10', - $this->ruleset->sniffs['PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterCastSniff']->spacing - ); - - }//end testWindowsStylePathRuleInclusion() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml deleted file mode 100644 index 15710d2..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest-include.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest-include.xml deleted file mode 100644 index ca116d4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest-include.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.php deleted file mode 100644 index 24abe8d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.php +++ /dev/null @@ -1,297 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Ruleset; -use PHPUnit\Framework\TestCase; - -class RuleInclusionTest extends TestCase -{ - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - protected static $ruleset; - - /** - * Path to the ruleset file. - * - * @var string - */ - private static $standard = ''; - - /** - * The original content of the ruleset. - * - * @var string - */ - private static $contents = ''; - - - /** - * Initialize the test. - * - * @return void - */ - public function setUp() - { - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // PEAR installs test and sniff files into different locations - // so these tests will not pass as they directly reference files - // by relative location. - $this->markTestSkipped('Test cannot run from a PEAR install'); - } - - }//end setUp() - - - /** - * Initialize the config and ruleset objects based on the `RuleInclusionTest.xml` ruleset file. - * - * @return void - */ - public static function setUpBeforeClass() - { - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // This test will be skipped. - return; - } - - $standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; - self::$standard = $standard; - - // On-the-fly adjust the ruleset test file to be able to test - // sniffs included with relative paths. - $contents = file_get_contents($standard); - self::$contents = $contents; - - $repoRootDir = basename(dirname(dirname(dirname(__DIR__)))); - - $newPath = $repoRootDir; - if (DIRECTORY_SEPARATOR === '\\') { - $newPath = str_replace('\\', '/', $repoRootDir); - } - - $adjusted = str_replace('%path_root_dir%', $newPath, $contents); - - if (file_put_contents($standard, $adjusted) === false) { - self::markTestSkipped('On the fly ruleset adjustment failed'); - } - - $config = new Config(["--standard=$standard"]); - self::$ruleset = new Ruleset($config); - - }//end setUpBeforeClass() - - - /** - * Reset ruleset file. - * - * @return void - */ - public function tearDown() - { - file_put_contents(self::$standard, self::$contents); - - }//end tearDown() - - - /** - * Test that sniffs are registered. - * - * @return void - */ - public function testHasSniffCodes() - { - $this->assertObjectHasAttribute('sniffCodes', self::$ruleset); - $this->assertCount(14, self::$ruleset->sniffCodes); - - }//end testHasSniffCodes() - - - /** - * Test that sniffs are correctly registered, independently on the syntax used to include the sniff. - * - * @param string $key Expected array key. - * @param string $value Expected array value. - * - * @dataProvider dataRegisteredSniffCodes - * - * @return void - */ - public function testRegisteredSniffCodes($key, $value) - { - $this->assertArrayHasKey($key, self::$ruleset->sniffCodes); - $this->assertSame($value, self::$ruleset->sniffCodes[$key]); - - }//end testRegisteredSniffCodes() - - - /** - * Data provider. - * - * @see self::testRegisteredSniffCodes() - * - * @return array - */ - public function dataRegisteredSniffCodes() - { - return [ - [ - 'PSR1.Classes.ClassDeclaration', - 'PHP_CodeSniffer\Standards\PSR1\Sniffs\Classes\ClassDeclarationSniff', - ], - [ - 'PSR1.Files.SideEffects', - 'PHP_CodeSniffer\Standards\PSR1\Sniffs\Files\SideEffectsSniff', - ], - [ - 'PSR1.Methods.CamelCapsMethodName', - 'PHP_CodeSniffer\Standards\PSR1\Sniffs\Methods\CamelCapsMethodNameSniff', - ], - [ - 'Generic.PHP.DisallowAlternativePHPTags', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\DisallowAlternativePHPTagsSniff', - ], - [ - 'Generic.PHP.DisallowShortOpenTag', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\DisallowShortOpenTagSniff', - ], - [ - 'Generic.Files.ByteOrderMark', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Files\ByteOrderMarkSniff', - ], - [ - 'Squiz.Classes.ValidClassName', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes\ValidClassNameSniff', - ], - [ - 'Generic.NamingConventions.UpperCaseConstantName', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions\UpperCaseConstantNameSniff', - ], - [ - 'Zend.NamingConventions.ValidVariableName', - 'PHP_CodeSniffer\Standards\Zend\Sniffs\NamingConventions\ValidVariableNameSniff', - ], - [ - 'Generic.Arrays.ArrayIndent', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays\ArrayIndentSniff', - ], - [ - 'Generic.Metrics.CyclomaticComplexity', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\CyclomaticComplexitySniff', - ], - [ - 'Generic.Files.LineLength', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Files\LineLengthSniff', - ], - [ - 'Generic.NamingConventions.CamelCapsFunctionName', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions\CamelCapsFunctionNameSniff', - ], - [ - 'Generic.Metrics.NestingLevel', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\NestingLevelSniff', - ], - ]; - - }//end dataRegisteredSniffCodes() - - - /** - * Test that setting properties for standards, categories, sniffs works for all supported rule - * inclusion methods. - * - * @param string $sniffClass The name of the sniff class. - * @param string $propertyName The name of the changed property. - * @param mixed $expectedValue The value expected for the property. - * - * @dataProvider dataSettingProperties - * - * @return void - */ - public function testSettingProperties($sniffClass, $propertyName, $expectedValue) - { - $this->assertObjectHasAttribute('sniffs', self::$ruleset); - $this->assertArrayHasKey($sniffClass, self::$ruleset->sniffs); - $this->assertObjectHasAttribute($propertyName, self::$ruleset->sniffs[$sniffClass]); - - $actualValue = self::$ruleset->sniffs[$sniffClass]->$propertyName; - $this->assertSame($expectedValue, $actualValue); - - }//end testSettingProperties() - - - /** - * Data provider. - * - * @see self::testSettingProperties() - * - * @return array - */ - public function dataSettingProperties() - { - return [ - 'ClassDeclarationSniff' => [ - 'PHP_CodeSniffer\Standards\PSR1\Sniffs\Classes\ClassDeclarationSniff', - 'setforallsniffs', - true, - ], - 'SideEffectsSniff' => [ - 'PHP_CodeSniffer\Standards\PSR1\Sniffs\Files\SideEffectsSniff', - 'setforallsniffs', - true, - ], - 'ValidVariableNameSniff' => [ - 'PHP_CodeSniffer\Standards\Zend\Sniffs\NamingConventions\ValidVariableNameSniff', - 'setforallincategory', - true, - ], - 'ArrayIndentSniff' => [ - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays\ArrayIndentSniff', - 'indent', - '2', - ], - 'LineLengthSniff' => [ - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Files\LineLengthSniff', - 'lineLimit', - '10', - ], - 'CamelCapsFunctionNameSniff' => [ - 'PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions\CamelCapsFunctionNameSniff', - 'strict', - false, - ], - 'NestingLevelSniff-nestingLevel' => [ - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\NestingLevelSniff', - 'nestingLevel', - '2', - ], - 'NestingLevelSniff-setforsniffsinincludedruleset' => [ - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\NestingLevelSniff', - 'setforsniffsinincludedruleset', - true, - ], - - // Testing that setting a property at error code level does *not* work. - 'CyclomaticComplexitySniff' => [ - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\CyclomaticComplexitySniff', - 'complexity', - 10, - ], - ]; - - }//end dataSettingProperties() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.xml deleted file mode 100644 index 06ce040..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.inc deleted file mode 100644 index 4882295..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.inc +++ /dev/null @@ -1,51 +0,0 @@ -1,'2'=>2,'3'=>3]; - -/* testMissingKeys */ -$foo = ['1'=>1,2,'3'=>3]; - -/* testMultiTokenKeys */ -$paths = array( - Init::ROOT_DIR.'/a' => 'a', - Init::ROOT_DIR.'/b' => 'b', -); - -/* testMissingKeysCoalesceTernary */ -return [ - $a => static function () { return [1,2,3]; }, - $b ?? $c, - $d ? [$e] : [$f], -]; - -/* testTernaryValues */ -$foo = [ - '1' => $row['status'] === 'rejected' - ? self::REJECTED_CODE - : self::VERIFIED_CODE, - '2' => in_array($row['status'], array('notverified', 'unverified'), true) - ? self::STATUS_PENDING - : self::STATUS_VERIFIED, - '3' => strtotime($row['date']), -]; - -/* testHeredocValues */ -$foo = array( - << '1', - 2 => fn ($x) => yield 'a' => $x, - 3 => '3', -); diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.php deleted file mode 100644 index 20c28d6..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.php +++ /dev/null @@ -1,290 +0,0 @@ - - * @copyright 2006-2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Sniffs; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -class AbstractArraySniffTest extends AbstractMethodUnitTest -{ - - /** - * The sniff objects we are testing. - * - * This extends the \PHP_CodeSniffer\Sniffs\AbstractArraySniff class to make the - * internal workings of the sniff observable. - * - * @var \PHP_CodeSniffer\Sniffs\AbstractArraySniffTestable - */ - protected static $sniff; - - - /** - * Initialize & tokenize \PHP_CodeSniffer\Files\File with code from the test case file. - * - * The test case file for a unit test class has to be in the same directory - * directory and use the same file name as the test class, using the .inc extension. - * - * @return void - */ - public static function setUpBeforeClass() - { - self::$sniff = new AbstractArraySniffTestable(); - parent::setUpBeforeClass(); - - }//end setUpBeforeClass() - - - /** - * Test an array of simple values only. - * - * @return void - */ - public function testSimpleValues() - { - $token = $this->getTargetToken('/* testSimpleValues */', T_OPEN_SHORT_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => ['value_start' => ($token + 1)], - 1 => ['value_start' => ($token + 3)], - 2 => ['value_start' => ($token + 5)], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testSimpleValues() - - - /** - * Test an array of simple keys and values. - * - * @return void - */ - public function testSimpleKeyValues() - { - $token = $this->getTargetToken('/* testSimpleKeyValues */', T_OPEN_SHORT_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 1), - 'index_end' => ($token + 1), - 'arrow' => ($token + 2), - 'value_start' => ($token + 3), - ], - 1 => [ - 'index_start' => ($token + 5), - 'index_end' => ($token + 5), - 'arrow' => ($token + 6), - 'value_start' => ($token + 7), - ], - 2 => [ - 'index_start' => ($token + 9), - 'index_end' => ($token + 9), - 'arrow' => ($token + 10), - 'value_start' => ($token + 11), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testSimpleKeyValues() - - - /** - * Test an array of simple keys and values. - * - * @return void - */ - public function testMissingKeys() - { - $token = $this->getTargetToken('/* testMissingKeys */', T_OPEN_SHORT_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 1), - 'index_end' => ($token + 1), - 'arrow' => ($token + 2), - 'value_start' => ($token + 3), - ], - 1 => [ - 'value_start' => ($token + 5), - ], - 2 => [ - 'index_start' => ($token + 7), - 'index_end' => ($token + 7), - 'arrow' => ($token + 8), - 'value_start' => ($token + 9), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testMissingKeys() - - - /** - * Test an array with keys that span multiple tokens. - * - * @return void - */ - public function testMultiTokenKeys() - { - $token = $this->getTargetToken('/* testMultiTokenKeys */', T_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 4), - 'index_end' => ($token + 8), - 'arrow' => ($token + 10), - 'value_start' => ($token + 12), - ], - 1 => [ - 'index_start' => ($token + 16), - 'index_end' => ($token + 20), - 'arrow' => ($token + 22), - 'value_start' => ($token + 24), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testMultiTokenKeys() - - - /** - * Test an array of simple keys and values. - * - * @return void - */ - public function testMissingKeysCoalesceTernary() - { - $token = $this->getTargetToken('/* testMissingKeysCoalesceTernary */', T_OPEN_SHORT_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 3), - 'index_end' => ($token + 3), - 'arrow' => ($token + 5), - 'value_start' => ($token + 7), - ], - 1 => [ - 'value_start' => ($token + 31), - ], - 2 => [ - 'value_start' => ($token + 39), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testMissingKeysCoalesceTernary() - - - /** - * Test an array of ternary values. - * - * @return void - */ - public function testTernaryValues() - { - $token = $this->getTargetToken('/* testTernaryValues */', T_OPEN_SHORT_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 3), - 'index_end' => ($token + 3), - 'arrow' => ($token + 5), - 'value_start' => ($token + 7), - ], - 1 => [ - 'index_start' => ($token + 32), - 'index_end' => ($token + 32), - 'arrow' => ($token + 34), - 'value_start' => ($token + 36), - ], - 2 => [ - 'index_start' => ($token + 72), - 'index_end' => ($token + 72), - 'arrow' => ($token + 74), - 'value_start' => ($token + 76), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testTernaryValues() - - - /** - * Test an array of heredocs. - * - * @return void - */ - public function testHeredocValues() - { - $token = $this->getTargetToken('/* testHeredocValues */', T_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'value_start' => ($token + 4), - ], - 1 => [ - 'value_start' => ($token + 10), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testHeredocValues() - - - /** - * Test an array of with an arrow function as a value. - * - * @return void - */ - public function testArrowFunctionValue() - { - $token = $this->getTargetToken('/* testArrowFunctionValue */', T_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 4), - 'index_end' => ($token + 4), - 'arrow' => ($token + 6), - 'value_start' => ($token + 8), - ], - 1 => [ - 'index_start' => ($token + 12), - 'index_end' => ($token + 12), - 'arrow' => ($token + 14), - 'value_start' => ($token + 16), - ], - 2 => [ - 'index_start' => ($token + 34), - 'index_end' => ($token + 34), - 'arrow' => ($token + 36), - 'value_start' => ($token + 38), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testArrowFunctionValue() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTestable.php b/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTestable.php deleted file mode 100644 index a224012..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTestable.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2006-2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Sniffs; - -use PHP_CodeSniffer\Sniffs\AbstractArraySniff; - -class AbstractArraySniffTestable extends AbstractArraySniff -{ - - /** - * The array indicies that were found during processing. - * - * @var array - */ - public $indicies = []; - - - /** - * Processes a single-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - public function processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices) - { - $this->indicies = $indices; - - }//end processSingleLineArray() - - - /** - * Processes a multi-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - public function processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices) - { - $this->indicies = $indices; - - }//end processMultiLineArray() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/AnonClassParenthesisOwnerTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/AnonClassParenthesisOwnerTest.inc deleted file mode 100644 index 5867691..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/AnonClassParenthesisOwnerTest.inc +++ /dev/null @@ -1,19 +0,0 @@ - - * @copyright 2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -class AnonClassParenthesisOwnerTest extends AbstractMethodUnitTest -{ - - - /** - * Test that anonymous class tokens without parenthesis do not get assigned a parenthesis owner. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataAnonClassNoParentheses - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testAnonClassNoParentheses($testMarker) - { - $tokens = self::$phpcsFile->getTokens(); - - $anonClass = $this->getTargetToken($testMarker, T_ANON_CLASS); - $this->assertFalse(array_key_exists('parenthesis_owner', $tokens[$anonClass])); - $this->assertFalse(array_key_exists('parenthesis_opener', $tokens[$anonClass])); - $this->assertFalse(array_key_exists('parenthesis_closer', $tokens[$anonClass])); - - }//end testAnonClassNoParentheses() - - - /** - * Test that the next open/close parenthesis after an anonymous class without parenthesis - * do not get assigned the anonymous class as a parenthesis owner. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataAnonClassNoParentheses - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testAnonClassNoParenthesesNextOpenClose($testMarker) - { - $tokens = self::$phpcsFile->getTokens(); - $function = $this->getTargetToken($testMarker, T_FUNCTION); - - $opener = $this->getTargetToken($testMarker, T_OPEN_PARENTHESIS); - $this->assertTrue(array_key_exists('parenthesis_owner', $tokens[$opener])); - $this->assertSame($function, $tokens[$opener]['parenthesis_owner']); - - $closer = $this->getTargetToken($testMarker, T_CLOSE_PARENTHESIS); - $this->assertTrue(array_key_exists('parenthesis_owner', $tokens[$closer])); - $this->assertSame($function, $tokens[$closer]['parenthesis_owner']); - - }//end testAnonClassNoParenthesesNextOpenClose() - - - /** - * Data provider. - * - * @see testAnonClassNoParentheses() - * @see testAnonClassNoParenthesesNextOpenClose() - * - * @return array - */ - public function dataAnonClassNoParentheses() - { - return [ - ['/* testNoParentheses */'], - ['/* testNoParenthesesAndEmptyTokens */'], - ]; - - }//end dataAnonClassNoParentheses() - - - /** - * Test that anonymous class tokens with parenthesis get assigned a parenthesis owner, - * opener and closer; and that the opener/closer get the anonymous class assigned as owner. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataAnonClassWithParentheses - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testAnonClassWithParentheses($testMarker) - { - $tokens = self::$phpcsFile->getTokens(); - $anonClass = $this->getTargetToken($testMarker, T_ANON_CLASS); - $opener = $this->getTargetToken($testMarker, T_OPEN_PARENTHESIS); - $closer = $this->getTargetToken($testMarker, T_CLOSE_PARENTHESIS); - - $this->assertTrue(array_key_exists('parenthesis_owner', $tokens[$anonClass])); - $this->assertTrue(array_key_exists('parenthesis_opener', $tokens[$anonClass])); - $this->assertTrue(array_key_exists('parenthesis_closer', $tokens[$anonClass])); - $this->assertSame($anonClass, $tokens[$anonClass]['parenthesis_owner']); - $this->assertSame($opener, $tokens[$anonClass]['parenthesis_opener']); - $this->assertSame($closer, $tokens[$anonClass]['parenthesis_closer']); - - $this->assertTrue(array_key_exists('parenthesis_owner', $tokens[$opener])); - $this->assertTrue(array_key_exists('parenthesis_opener', $tokens[$opener])); - $this->assertTrue(array_key_exists('parenthesis_closer', $tokens[$opener])); - $this->assertSame($anonClass, $tokens[$opener]['parenthesis_owner']); - $this->assertSame($opener, $tokens[$opener]['parenthesis_opener']); - $this->assertSame($closer, $tokens[$opener]['parenthesis_closer']); - - $this->assertTrue(array_key_exists('parenthesis_owner', $tokens[$closer])); - $this->assertTrue(array_key_exists('parenthesis_opener', $tokens[$closer])); - $this->assertTrue(array_key_exists('parenthesis_closer', $tokens[$closer])); - $this->assertSame($anonClass, $tokens[$closer]['parenthesis_owner']); - $this->assertSame($opener, $tokens[$closer]['parenthesis_opener']); - $this->assertSame($closer, $tokens[$closer]['parenthesis_closer']); - - }//end testAnonClassWithParentheses() - - - /** - * Data provider. - * - * @see testAnonClassWithParentheses() - * - * @return array - */ - public function dataAnonClassWithParentheses() - { - return [ - ['/* testWithParentheses */'], - ['/* testWithParenthesesAndEmptyTokens */'], - ]; - - }//end dataAnonClassWithParentheses() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillFnTokenTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillFnTokenTest.inc deleted file mode 100644 index ab57fbb..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillFnTokenTest.inc +++ /dev/null @@ -1,124 +0,0 @@ - $x + $y; - -/* testMixedCase */ -$fn1 = Fn($x) => $x + $y; - -/* testWhitespace */ -$fn1 = fn ($x) => $x + $y; - -/* testComment */ -$fn1 = fn /* comment here */ ($x) => $x + $y; - -/* testFunctionName */ -function fn() {} - -/* testNestedOuter */ -$fn = fn($x) => /* testNestedInner */ fn($y) => $x * $y + $z; - -/* testFunctionCall */ -$extended = fn($c) => $callable($factory($c), $c); - -/* testChainedFunctionCall */ -$result = Collection::from([1, 2]) - ->map(fn($v) => $v * 2) - ->reduce(/* testFunctionArgument */ fn($tmp, $v) => $tmp + $v, 0); - -/* testClosure */ -$extended = fn($c) => $callable(function() { - for ($x = 1; $x < 10; $x++) { - echo $x; - } - - echo 'done'; -}, $c); - -$result = array_map( - /* testReturnType */ - static fn(int $number) : int => $number + 1, - $numbers -); - -/* testReference */ -fn&($x) => $x; - -/* testGrouped */ -(fn($x) => $x) + $y; - -/* testArrayValue */ -$a = [ - 'a' => fn() => return 1, -]; - -/* testYield */ -$a = fn($x) => yield 'k' => $x; - -/* testNullableNamespace */ -$a = fn(?\DateTime $x) : ?\DateTime => $x; - -/* testSelfReturnType */ -fn(self $a) : self => $a; - -/* testParentReturnType */ -fn(parent $a) : parent => $a; - -/* testCallableReturnType */ -fn(callable $a) : callable => $a; - -/* testArrayReturnType */ -fn(array $a) : array => $a; - -/* testTernary */ -$fn = fn($a) => $a ? /* testTernaryThen */ fn() : string => 'a' : /* testTernaryElse */ fn() : string => 'b'; - -/* testConstantDeclaration */ -const FN = 'a'; - -/* testConstantDeclarationLower */ -const fn = 'a'; - -class Foo { - /* testStaticMethodName */ - public static function fn($param) { - /* testNestedInMethod */ - $fn = fn($c) => $callable($factory($c), $c); - } - - public function foo() { - /* testPropertyAssignment */ - $this->fn = 'a'; - } -} - -$anon = new class() { - /* testAnonClassMethodName */ - protected function fN($param) { - } -} - -/* testNonArrowStaticMethodCall */ -$a = Foo::fn($param); - -/* testNonArrowConstantAccess */ -$a = MyClass::FN; - -/* testNonArrowConstantAccessMixed */ -$a = MyClass::Fn; - -/* testNonArrowObjectMethodCall */ -$a = $obj->fn($param); - -/* testNonArrowObjectMethodCallUpper */ -$a = $obj->FN($param); - -/* testNonArrowNamespacedFunctionCall */ -$a = MyNS\Sub\Fn($param); - -/* testNonArrowNamespaceOperatorFunctionCall */ -$a = namespace\fn($param); - -/* testLiveCoding */ -// Intentional parse error. This has to be the last test in the file. -$fn = fn diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillFnTokenTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillFnTokenTest.php deleted file mode 100644 index 0b6c3bf..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillFnTokenTest.php +++ /dev/null @@ -1,685 +0,0 @@ - - * @copyright 2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -class BackfillFnTokenTest extends AbstractMethodUnitTest -{ - - - /** - * Test simple arrow functions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testSimple() - { - $tokens = self::$phpcsFile->getTokens(); - - foreach (['/* testStandard */', '/* testMixedCase */'] as $comment) { - $token = $this->getTargetToken($comment, T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 5), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 12), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 5), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 12), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 5), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 12), 'Closer scope closer is not the semicolon token'); - } - - }//end testSimple() - - - /** - * Test whitespace inside arrow function definitions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testWhitespace() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testWhitespace */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 6), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 13), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 6), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 13), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 6), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 13), 'Closer scope closer is not the semicolon token'); - - }//end testWhitespace() - - - /** - * Test comments inside arrow function definitions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testComments() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testComment */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 8), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 15), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 8), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 15), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 8), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 15), 'Closer scope closer is not the semicolon token'); - - }//end testComments() - - - /** - * Test nested arrow functions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNestedOuter() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testNestedOuter */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 5), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 25), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 5), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 25), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 5), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 25), 'Closer scope closer is not the semicolon token'); - - }//end testNestedOuter() - - - /** - * Test nested arrow functions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNestedInner() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testNestedInner */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 5), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 16), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 5), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 16), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 5), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 16), 'Closer scope closer is not the semicolon token'); - - }//end testNestedInner() - - - /** - * Test arrow functions that call functions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testFunctionCall() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testFunctionCall */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 5), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 17), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 5), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 17), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 5), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 17), 'Closer scope closer is not the semicolon token'); - - }//end testFunctionCall() - - - /** - * Test arrow functions that are included in chained calls. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testChainedFunctionCall() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testChainedFunctionCall */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 5), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 12), 'Scope closer is not the bracket token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 5), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 12), 'Opener scope closer is not the bracket token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 5), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 12), 'Closer scope closer is not the bracket token'); - - }//end testChainedFunctionCall() - - - /** - * Test arrow functions that are used as function arguments. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testFunctionArgument() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testFunctionArgument */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 8), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 15), 'Scope closer is not the comma token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 8), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 15), 'Opener scope closer is not the comma token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 8), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 15), 'Closer scope closer is not the comma token'); - - }//end testFunctionArgument() - - - /** - * Test arrow functions that use closures. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testClosure() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testClosure */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 5), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 60), 'Scope closer is not the comma token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 5), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 60), 'Opener scope closer is not the comma token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 5), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 60), 'Closer scope closer is not the comma token'); - - }//end testClosure() - - - /** - * Test arrow functions with a return type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testReturnType() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testReturnType */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 11), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 18), 'Scope closer is not the comma token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 11), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 18), 'Opener scope closer is not the comma token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 11), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 18), 'Closer scope closer is not the comma token'); - - }//end testReturnType() - - - /** - * Test arrow functions that return a reference. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testReference() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testReference */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 6), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 9), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 6), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 9), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 6), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 9), 'Closer scope closer is not the semicolon token'); - - }//end testReference() - - - /** - * Test arrow functions that are grouped by parenthesis. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testGrouped() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testGrouped */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 5), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 8), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 5), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 8), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 5), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 8), 'Closer scope closer is not the semicolon token'); - - }//end testGrouped() - - - /** - * Test arrow functions that are used as array values. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testArrayValue() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testArrayValue */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 4), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 9), 'Scope closer is not the comma token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 4), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 9), 'Opener scope closer is not the comma token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 4), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 9), 'Closer scope closer is not the comma token'); - - }//end testArrayValue() - - - /** - * Test arrow functions that use the yield keyword. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testYield() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testYield */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 5), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 14), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 5), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 14), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 5), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 14), 'Closer scope closer is not the semicolon token'); - - }//end testYield() - - - /** - * Test arrow functions that use nullable namespace types. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNullableNamespace() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testNullableNamespace */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 15), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 18), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 15), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 18), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 15), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 18), 'Closer scope closer is not the semicolon token'); - - }//end testNullableNamespace() - - - /** - * Test arrow functions that use self/parent/callable return types. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testKeywordReturnTypes() - { - $tokens = self::$phpcsFile->getTokens(); - - $testMarkers = [ - 'Self', - 'Parent', - 'Callable', - 'Array', - ]; - - foreach ($testMarkers as $marker) { - $token = $this->getTargetToken('/* test'.$marker.'ReturnType */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 11), "Scope opener is not the arrow token (for $marker)"); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 14), "Scope closer is not the semicolon token(for $marker)"); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 11), "Opener scope opener is not the arrow token(for $marker)"); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 14), "Opener scope closer is not the semicolon token(for $marker)"); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 11), "Closer scope opener is not the arrow token(for $marker)"); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 14), "Closer scope closer is not the semicolon token(for $marker)"); - } - - }//end testKeywordReturnTypes() - - - /** - * Test arrow functions used in ternary operators. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testTernary() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testTernary */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 5), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 40), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 5), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 40), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 5), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 40), 'Closer scope closer is not the semicolon token'); - - $token = $this->getTargetToken('/* testTernaryThen */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 8), 'Scope opener for THEN is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 12), 'Scope closer for THEN is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 8), 'Opener scope opener for THEN is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 12), 'Opener scope closer for THEN is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 8), 'Closer scope opener for THEN is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 12), 'Closer scope closer for THEN is not the semicolon token'); - - $token = $this->getTargetToken('/* testTernaryElse */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 8), 'Scope opener for ELSE is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 11), 'Scope closer for ELSE is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 8), 'Opener scope opener for ELSE is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 11), 'Opener scope closer for ELSE is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 8), 'Closer scope opener for ELSE is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 11), 'Closer scope closer for ELSE is not the semicolon token'); - - }//end testTernary() - - - /** - * Test arrow function nested within a method declaration. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNestedInMethod() - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testNestedInMethod */', T_FN); - $this->backfillHelper($token); - - $this->assertSame($tokens[$token]['scope_opener'], ($token + 5), 'Scope opener is not the arrow token'); - $this->assertSame($tokens[$token]['scope_closer'], ($token + 17), 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$opener]['scope_opener'], ($token + 5), 'Opener scope opener is not the arrow token'); - $this->assertSame($tokens[$opener]['scope_closer'], ($token + 17), 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertSame($tokens[$closer]['scope_opener'], ($token + 5), 'Closer scope opener is not the arrow token'); - $this->assertSame($tokens[$closer]['scope_closer'], ($token + 17), 'Closer scope closer is not the semicolon token'); - - }//end testNestedInMethod() - - - /** - * Verify that "fn" keywords which are not arrow functions get tokenized as T_STRING and don't - * have the extra token array indexes. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to look for. - * - * @dataProvider dataNotAnArrowFunction - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNotAnArrowFunction($testMarker, $testContent='fn') - { - $tokens = self::$phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_STRING, T_FN], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING'); - - $this->assertArrayNotHasKey('scope_condition', $tokenArray, 'Scope condition is set'); - $this->assertArrayNotHasKey('scope_opener', $tokenArray, 'Scope opener is set'); - $this->assertArrayNotHasKey('scope_closer', $tokenArray, 'Scope closer is set'); - $this->assertArrayNotHasKey('parenthesis_owner', $tokenArray, 'Parenthesis owner is set'); - $this->assertArrayNotHasKey('parenthesis_opener', $tokenArray, 'Parenthesis opener is set'); - $this->assertArrayNotHasKey('parenthesis_closer', $tokenArray, 'Parenthesis closer is set'); - - }//end testNotAnArrowFunction() - - - /** - * Data provider. - * - * @see testNotAnArrowFunction() - * - * @return array - */ - public function dataNotAnArrowFunction() - { - return [ - ['/* testFunctionName */'], - [ - '/* testConstantDeclaration */', - 'FN', - ], - [ - '/* testConstantDeclarationLower */', - 'fn', - ], - ['/* testStaticMethodName */'], - ['/* testPropertyAssignment */'], - [ - '/* testAnonClassMethodName */', - 'fN', - ], - ['/* testNonArrowStaticMethodCall */'], - [ - '/* testNonArrowConstantAccess */', - 'FN', - ], - [ - '/* testNonArrowConstantAccessMixed */', - 'Fn', - ], - ['/* testNonArrowObjectMethodCall */'], - [ - '/* testNonArrowNamespacedFunctionCall */', - 'Fn', - ], - [ - '/* testNonArrowObjectMethodCallUpper */', - 'FN', - ], - ['/* testNonArrowNamespaceOperatorFunctionCall */'], - ['/* testLiveCoding */'], - ]; - - }//end dataNotAnArrowFunction() - - - /** - * Helper function to check that all token keys are correctly set for T_FN tokens. - * - * @param string $token The T_FN token to check. - * - * @return void - */ - private function backfillHelper($token) - { - $tokens = self::$phpcsFile->getTokens(); - - $this->assertTrue(array_key_exists('scope_condition', $tokens[$token]), 'Scope condition is not set'); - $this->assertTrue(array_key_exists('scope_opener', $tokens[$token]), 'Scope opener is not set'); - $this->assertTrue(array_key_exists('scope_closer', $tokens[$token]), 'Scope closer is not set'); - $this->assertSame($tokens[$token]['scope_condition'], $token, 'Scope condition is not the T_FN token'); - $this->assertTrue(array_key_exists('parenthesis_owner', $tokens[$token]), 'Parenthesis owner is not set'); - $this->assertTrue(array_key_exists('parenthesis_opener', $tokens[$token]), 'Parenthesis opener is not set'); - $this->assertTrue(array_key_exists('parenthesis_closer', $tokens[$token]), 'Parenthesis closer is not set'); - $this->assertSame($tokens[$token]['parenthesis_owner'], $token, 'Parenthesis owner is not the T_FN token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertTrue(array_key_exists('scope_condition', $tokens[$opener]), 'Opener scope condition is not set'); - $this->assertTrue(array_key_exists('scope_opener', $tokens[$opener]), 'Opener scope opener is not set'); - $this->assertTrue(array_key_exists('scope_closer', $tokens[$opener]), 'Opener scope closer is not set'); - $this->assertSame($tokens[$opener]['scope_condition'], $token, 'Opener scope condition is not the T_FN token'); - - $closer = $tokens[$token]['scope_opener']; - $this->assertTrue(array_key_exists('scope_condition', $tokens[$closer]), 'Closer scope condition is not set'); - $this->assertTrue(array_key_exists('scope_opener', $tokens[$closer]), 'Closer scope opener is not set'); - $this->assertTrue(array_key_exists('scope_closer', $tokens[$closer]), 'Closer scope closer is not set'); - $this->assertSame($tokens[$closer]['scope_condition'], $token, 'Closer scope condition is not the T_FN token'); - - $opener = $tokens[$token]['parenthesis_opener']; - $this->assertTrue(array_key_exists('parenthesis_owner', $tokens[$opener]), 'Opening parenthesis owner is not set'); - $this->assertSame($tokens[$opener]['parenthesis_owner'], $token, 'Opening parenthesis owner is not the T_FN token'); - - $closer = $tokens[$token]['parenthesis_closer']; - $this->assertTrue(array_key_exists('parenthesis_owner', $tokens[$closer]), 'Closing parenthesis owner is not set'); - $this->assertSame($tokens[$closer]['parenthesis_owner'], $token, 'Closing parenthesis owner is not the T_FN token'); - - }//end backfillHelper() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillNumericSeparatorTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillNumericSeparatorTest.inc deleted file mode 100644 index eef53f5..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizer/BackfillNumericSeparatorTest.inc +++ /dev/null @@ -1,82 +0,0 @@ - - * @copyright 2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -class BackfillNumericSeparatorTest extends AbstractMethodUnitTest -{ - - - /** - * Test that numbers using numeric seperators are tokenized correctly. - * - * @param array $testData The data required for the specific test case. - * - * @dataProvider dataTestBackfill - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testBackfill($testData) - { - $tokens = self::$phpcsFile->getTokens(); - $number = $this->getTargetToken($testData['marker'], [T_LNUMBER, T_DNUMBER]); - - $this->assertSame(constant($testData['type']), $tokens[$number]['code']); - $this->assertSame($testData['type'], $tokens[$number]['type']); - $this->assertSame($testData['value'], $tokens[$number]['content']); - - }//end testBackfill() - - - /** - * Data provider. - * - * @see testBackfill() - * - * @return array - */ - public function dataTestBackfill() - { - $testHexType = 'T_LNUMBER'; - if (PHP_INT_MAX < 0xCAFEF00D) { - $testHexType = 'T_DNUMBER'; - } - - $testHexMultipleType = 'T_LNUMBER'; - if (PHP_INT_MAX < 0x42726F776E) { - $testHexMultipleType = 'T_DNUMBER'; - } - - $testIntMoreThanMaxType = 'T_LNUMBER'; - if (PHP_INT_MAX < 10223372036854775807) { - $testIntMoreThanMaxType = 'T_DNUMBER'; - } - - return [ - [ - [ - 'marker' => '/* testSimpleLNumber */', - 'type' => 'T_LNUMBER', - 'value' => '1_000_000_000', - ], - ], - [ - [ - 'marker' => '/* testSimpleDNumber */', - 'type' => 'T_DNUMBER', - 'value' => '107_925_284.88', - ], - ], - [ - [ - 'marker' => '/* testFloat */', - 'type' => 'T_DNUMBER', - 'value' => '6.674_083e-11', - ], - ], - [ - [ - 'marker' => '/* testFloat2 */', - 'type' => 'T_DNUMBER', - 'value' => '6.674_083e+11', - ], - ], - [ - [ - 'marker' => '/* testFloat3 */', - 'type' => 'T_DNUMBER', - 'value' => '1_2.3_4e1_23', - ], - ], - [ - [ - 'marker' => '/* testHex */', - 'type' => $testHexType, - 'value' => '0xCAFE_F00D', - ], - ], - [ - [ - 'marker' => '/* testHexMultiple */', - 'type' => $testHexMultipleType, - 'value' => '0x42_72_6F_77_6E', - ], - ], - [ - [ - 'marker' => '/* testHexInt */', - 'type' => 'T_LNUMBER', - 'value' => '0x42_72_6F', - ], - ], - [ - [ - 'marker' => '/* testBinary */', - 'type' => 'T_LNUMBER', - 'value' => '0b0101_1111', - ], - ], - [ - [ - 'marker' => '/* testOctal */', - 'type' => 'T_LNUMBER', - 'value' => '0137_041', - ], - ], - [ - [ - 'marker' => '/* testIntMoreThanMax */', - 'type' => $testIntMoreThanMaxType, - 'value' => '10_223_372_036_854_775_807', - ], - ], - ]; - - }//end dataTestBackfill() - - - /** - * Test that numbers using numeric seperators which are considered parse errors and/or - * which aren't relevant to the backfill, do not incorrectly trigger the backfill anyway. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param array $expectedTokens The token type and content of the expected token sequence. - * - * @dataProvider dataNoBackfill - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testNoBackfill($testMarker, $expectedTokens) - { - $tokens = self::$phpcsFile->getTokens(); - $number = $this->getTargetToken($testMarker, [T_LNUMBER, T_DNUMBER]); - - foreach ($expectedTokens as $key => $expectedToken) { - $i = ($number + $key); - $this->assertSame($expectedToken['code'], $tokens[$i]['code']); - $this->assertSame($expectedToken['content'], $tokens[$i]['content']); - } - - }//end testNoBackfill() - - - /** - * Data provider. - * - * @see testBackfill() - * - * @return array - */ - public function dataNoBackfill() - { - return [ - [ - '/* testInvalid1 */', - [ - [ - 'code' => T_LNUMBER, - 'content' => '100', - ], - [ - 'code' => T_STRING, - 'content' => '_', - ], - ], - ], - [ - '/* testInvalid2 */', - [ - [ - 'code' => T_LNUMBER, - 'content' => '1', - ], - [ - 'code' => T_STRING, - 'content' => '__1', - ], - ], - ], - [ - '/* testInvalid3 */', - [ - [ - 'code' => T_LNUMBER, - 'content' => '1', - ], - [ - 'code' => T_STRING, - 'content' => '_', - ], - [ - 'code' => T_DNUMBER, - 'content' => '.0', - ], - ], - ], - [ - '/* testInvalid4 */', - [ - [ - 'code' => T_DNUMBER, - 'content' => '1.', - ], - [ - 'code' => T_STRING, - 'content' => '_0', - ], - ], - ], - [ - '/* testInvalid5 */', - [ - [ - 'code' => T_LNUMBER, - 'content' => '0', - ], - [ - 'code' => T_STRING, - 'content' => 'x_123', - ], - ], - ], - [ - '/* testInvalid6 */', - [ - [ - 'code' => T_LNUMBER, - 'content' => '0', - ], - [ - 'code' => T_STRING, - 'content' => 'b_101', - ], - ], - ], - [ - '/* testInvalid7 */', - [ - [ - 'code' => T_LNUMBER, - 'content' => '1', - ], - [ - 'code' => T_STRING, - 'content' => '_e2', - ], - ], - ], - [ - '/* testInvalid8 */', - [ - [ - 'code' => T_LNUMBER, - 'content' => '1', - ], - [ - 'code' => T_STRING, - 'content' => 'e_2', - ], - ], - ], - [ - '/* testInvalid9 */', - [ - [ - 'code' => T_LNUMBER, - 'content' => '107_925_284', - ], - [ - 'code' => T_WHITESPACE, - 'content' => ' ', - ], - [ - 'code' => T_DNUMBER, - 'content' => '.88', - ], - ], - ], - [ - '/* testInvalid10 */', - [ - [ - 'code' => T_LNUMBER, - 'content' => '107_925_284', - ], - [ - 'code' => T_COMMENT, - 'content' => '/*comment*/', - ], - [ - 'code' => T_DNUMBER, - 'content' => '.88', - ], - ], - ], - [ - '/* testCalc1 */', - [ - [ - 'code' => T_LNUMBER, - 'content' => '667_083', - ], - [ - 'code' => T_WHITESPACE, - 'content' => ' ', - ], - [ - 'code' => T_MINUS, - 'content' => '-', - ], - [ - 'code' => T_WHITESPACE, - 'content' => ' ', - ], - [ - 'code' => T_LNUMBER, - 'content' => '11', - ], - ], - ], - [ - '/* test Calc2 */', - [ - [ - 'code' => T_DNUMBER, - 'content' => '6.674_08e3', - ], - [ - 'code' => T_WHITESPACE, - 'content' => ' ', - ], - [ - 'code' => T_PLUS, - 'content' => '+', - ], - [ - 'code' => T_WHITESPACE, - 'content' => ' ', - ], - [ - 'code' => T_LNUMBER, - 'content' => '11', - ], - ], - ], - ]; - - }//end dataNoBackfill() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/FileList.php b/vendor/squizlabs/php_codesniffer/tests/FileList.php deleted file mode 100644 index 8ef57b7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/FileList.php +++ /dev/null @@ -1,94 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests; - -class FileList -{ - - /** - * The path to the project root directory. - * - * @var string - */ - protected $rootPath; - - /** - * Recursive directory iterator. - * - * @var \DirectoryIterator - */ - public $fileIterator; - - /** - * Base regex to use if no filter regex is provided. - * - * Matches based on: - * - File path starts with the project root (replacement done in constructor). - * - Don't match .git/ files. - * - Don't match dot files, i.e. "." or "..". - * - Don't match backup files. - * - Match everything else in a case-insensitive manner. - * - * @var string - */ - private $baseRegex = '`^%s(?!\.git/)(?!(.*/)?\.+$)(?!.*\.(bak|orig)).*$`Dix'; - - - /** - * Constructor. - * - * @param string $directory The directory to examine. - * @param string $rootPath Path to the project root. - * @param string $filter PCRE regular expression to filter the file list with. - */ - public function __construct($directory, $rootPath='', $filter='') - { - $this->rootPath = $rootPath; - - $directory = new \RecursiveDirectoryIterator( - $directory, - \RecursiveDirectoryIterator::UNIX_PATHS - ); - $flattened = new \RecursiveIteratorIterator( - $directory, - \RecursiveIteratorIterator::LEAVES_ONLY, - \RecursiveIteratorIterator::CATCH_GET_CHILD - ); - - if ($filter === '') { - $filter = sprintf($this->baseRegex, preg_quote($this->rootPath)); - } - - $this->fileIterator = new \RegexIterator($flattened, $filter); - - return $this; - - }//end __construct() - - - /** - * Retrieve the filtered file list as an array. - * - * @return array - */ - public function getList() - { - $fileList = []; - - foreach ($this->fileIterator as $file) { - $fileList[] = str_replace($this->rootPath, '', $file); - } - - return $fileList; - - }//end getList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Standards/AbstractSniffUnitTest.php b/vendor/squizlabs/php_codesniffer/tests/Standards/AbstractSniffUnitTest.php deleted file mode 100644 index dc7c14c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Standards/AbstractSniffUnitTest.php +++ /dev/null @@ -1,450 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Standards; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Files\LocalFile; -use PHP_CodeSniffer\Util\Common; -use PHPUnit\Framework\TestCase; - -abstract class AbstractSniffUnitTest extends TestCase -{ - - /** - * Enable or disable the backup and restoration of the $GLOBALS array. - * Overwrite this attribute in a child class of TestCase. - * Setting this attribute in setUp() has no effect! - * - * @var boolean - */ - protected $backupGlobals = false; - - /** - * The path to the standard's main directory. - * - * @var string - */ - public $standardsDir = null; - - /** - * The path to the standard's test directory. - * - * @var string - */ - public $testsDir = null; - - - /** - * Sets up this unit test. - * - * @return void - */ - protected function setUp() - { - $class = get_class($this); - $this->standardsDir = $GLOBALS['PHP_CODESNIFFER_STANDARD_DIRS'][$class]; - $this->testsDir = $GLOBALS['PHP_CODESNIFFER_TEST_DIRS'][$class]; - - }//end setUp() - - - /** - * Get a list of all test files to check. - * - * These will have the same base as the sniff name but different extensions. - * We ignore the .php file as it is the class. - * - * @param string $testFileBase The base path that the unit tests files will have. - * - * @return string[] - */ - protected function getTestFiles($testFileBase) - { - $testFiles = []; - - $dir = substr($testFileBase, 0, strrpos($testFileBase, DIRECTORY_SEPARATOR)); - $di = new \DirectoryIterator($dir); - - foreach ($di as $file) { - $path = $file->getPathname(); - if (substr($path, 0, strlen($testFileBase)) === $testFileBase) { - if ($path !== $testFileBase.'php' && substr($path, -5) !== 'fixed' && substr($path, -4) !== '.bak') { - $testFiles[] = $path; - } - } - } - - // Put them in order. - sort($testFiles); - - return $testFiles; - - }//end getTestFiles() - - - /** - * Should this test be skipped for some reason. - * - * @return boolean - */ - protected function shouldSkipTest() - { - return false; - - }//end shouldSkipTest() - - - /** - * Tests the extending classes Sniff class. - * - * @return void - * @throws \PHPUnit\Framework\Exception - */ - final public function testSniff() - { - // Skip this test if we can't run in this environment. - if ($this->shouldSkipTest() === true) { - $this->markTestSkipped(); - } - - $sniffCode = Common::getSniffCode(get_class($this)); - list($standardName, $categoryName, $sniffName) = explode('.', $sniffCode); - - $testFileBase = $this->testsDir.$categoryName.DIRECTORY_SEPARATOR.$sniffName.'UnitTest.'; - - // Get a list of all test files to check. - $testFiles = $this->getTestFiles($testFileBase); - $GLOBALS['PHP_CODESNIFFER_SNIFF_CASE_FILES'][] = $testFiles; - - if (isset($GLOBALS['PHP_CODESNIFFER_CONFIG']) === true) { - $config = $GLOBALS['PHP_CODESNIFFER_CONFIG']; - } else { - $config = new Config(); - $config->cache = false; - $GLOBALS['PHP_CODESNIFFER_CONFIG'] = $config; - } - - $config->standards = [$standardName]; - $config->sniffs = [$sniffCode]; - $config->ignored = []; - - if (isset($GLOBALS['PHP_CODESNIFFER_RULESETS']) === false) { - $GLOBALS['PHP_CODESNIFFER_RULESETS'] = []; - } - - if (isset($GLOBALS['PHP_CODESNIFFER_RULESETS'][$standardName]) === false) { - $ruleset = new Ruleset($config); - $GLOBALS['PHP_CODESNIFFER_RULESETS'][$standardName] = $ruleset; - } - - $ruleset = $GLOBALS['PHP_CODESNIFFER_RULESETS'][$standardName]; - - $sniffFile = $this->standardsDir.DIRECTORY_SEPARATOR.'Sniffs'.DIRECTORY_SEPARATOR.$categoryName.DIRECTORY_SEPARATOR.$sniffName.'Sniff.php'; - - $sniffClassName = substr(get_class($this), 0, -8).'Sniff'; - $sniffClassName = str_replace('\Tests\\', '\Sniffs\\', $sniffClassName); - $sniffClassName = Common::cleanSniffClass($sniffClassName); - - $restrictions = [strtolower($sniffClassName) => true]; - $ruleset->registerSniffs([$sniffFile], $restrictions, []); - $ruleset->populateTokenListeners(); - - $failureMessages = []; - foreach ($testFiles as $testFile) { - $filename = basename($testFile); - $oldConfig = $config->getSettings(); - - try { - $this->setCliValues($filename, $config); - $phpcsFile = new LocalFile($testFile, $ruleset, $config); - $phpcsFile->process(); - } catch (RuntimeException $e) { - $this->fail('An unexpected exception has been caught: '.$e->getMessage()); - } - - $failures = $this->generateFailureMessages($phpcsFile); - $failureMessages = array_merge($failureMessages, $failures); - - if ($phpcsFile->getFixableCount() > 0) { - // Attempt to fix the errors. - $phpcsFile->fixer->fixFile(); - $fixable = $phpcsFile->getFixableCount(); - if ($fixable > 0) { - $failureMessages[] = "Failed to fix $fixable fixable violations in $filename"; - } - - // Check for a .fixed file to check for accuracy of fixes. - $fixedFile = $testFile.'.fixed'; - if (file_exists($fixedFile) === true) { - $diff = $phpcsFile->fixer->generateDiff($fixedFile); - if (trim($diff) !== '') { - $filename = basename($testFile); - $fixedFilename = basename($fixedFile); - $failureMessages[] = "Fixed version of $filename does not match expected version in $fixedFilename; the diff is\n$diff"; - } - } - } - - // Restore the config. - $config->setSettings($oldConfig); - }//end foreach - - if (empty($failureMessages) === false) { - $this->fail(implode(PHP_EOL, $failureMessages)); - } - - }//end testSniff() - - - /** - * Generate a list of test failures for a given sniffed file. - * - * @param \PHP_CodeSniffer\Files\LocalFile $file The file being tested. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException - */ - public function generateFailureMessages(LocalFile $file) - { - $testFile = $file->getFilename(); - - $foundErrors = $file->getErrors(); - $foundWarnings = $file->getWarnings(); - $expectedErrors = $this->getErrorList(basename($testFile)); - $expectedWarnings = $this->getWarningList(basename($testFile)); - - if (is_array($expectedErrors) === false) { - throw new RuntimeException('getErrorList() must return an array'); - } - - if (is_array($expectedWarnings) === false) { - throw new RuntimeException('getWarningList() must return an array'); - } - - /* - We merge errors and warnings together to make it easier - to iterate over them and produce the errors string. In this way, - we can report on errors and warnings in the same line even though - it's not really structured to allow that. - */ - - $allProblems = []; - $failureMessages = []; - - foreach ($foundErrors as $line => $lineErrors) { - foreach ($lineErrors as $column => $errors) { - if (isset($allProblems[$line]) === false) { - $allProblems[$line] = [ - 'expected_errors' => 0, - 'expected_warnings' => 0, - 'found_errors' => [], - 'found_warnings' => [], - ]; - } - - $foundErrorsTemp = []; - foreach ($allProblems[$line]['found_errors'] as $foundError) { - $foundErrorsTemp[] = $foundError; - } - - $errorsTemp = []; - foreach ($errors as $foundError) { - $errorsTemp[] = $foundError['message'].' ('.$foundError['source'].')'; - - $source = $foundError['source']; - if (in_array($source, $GLOBALS['PHP_CODESNIFFER_SNIFF_CODES'], true) === false) { - $GLOBALS['PHP_CODESNIFFER_SNIFF_CODES'][] = $source; - } - - if ($foundError['fixable'] === true - && in_array($source, $GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES'], true) === false - ) { - $GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES'][] = $source; - } - } - - $allProblems[$line]['found_errors'] = array_merge($foundErrorsTemp, $errorsTemp); - }//end foreach - - if (isset($expectedErrors[$line]) === true) { - $allProblems[$line]['expected_errors'] = $expectedErrors[$line]; - } else { - $allProblems[$line]['expected_errors'] = 0; - } - - unset($expectedErrors[$line]); - }//end foreach - - foreach ($expectedErrors as $line => $numErrors) { - if (isset($allProblems[$line]) === false) { - $allProblems[$line] = [ - 'expected_errors' => 0, - 'expected_warnings' => 0, - 'found_errors' => [], - 'found_warnings' => [], - ]; - } - - $allProblems[$line]['expected_errors'] = $numErrors; - } - - foreach ($foundWarnings as $line => $lineWarnings) { - foreach ($lineWarnings as $column => $warnings) { - if (isset($allProblems[$line]) === false) { - $allProblems[$line] = [ - 'expected_errors' => 0, - 'expected_warnings' => 0, - 'found_errors' => [], - 'found_warnings' => [], - ]; - } - - $foundWarningsTemp = []; - foreach ($allProblems[$line]['found_warnings'] as $foundWarning) { - $foundWarningsTemp[] = $foundWarning; - } - - $warningsTemp = []; - foreach ($warnings as $warning) { - $warningsTemp[] = $warning['message'].' ('.$warning['source'].')'; - } - - $allProblems[$line]['found_warnings'] = array_merge($foundWarningsTemp, $warningsTemp); - }//end foreach - - if (isset($expectedWarnings[$line]) === true) { - $allProblems[$line]['expected_warnings'] = $expectedWarnings[$line]; - } else { - $allProblems[$line]['expected_warnings'] = 0; - } - - unset($expectedWarnings[$line]); - }//end foreach - - foreach ($expectedWarnings as $line => $numWarnings) { - if (isset($allProblems[$line]) === false) { - $allProblems[$line] = [ - 'expected_errors' => 0, - 'expected_warnings' => 0, - 'found_errors' => [], - 'found_warnings' => [], - ]; - } - - $allProblems[$line]['expected_warnings'] = $numWarnings; - } - - // Order the messages by line number. - ksort($allProblems); - - foreach ($allProblems as $line => $problems) { - $numErrors = count($problems['found_errors']); - $numWarnings = count($problems['found_warnings']); - $expectedErrors = $problems['expected_errors']; - $expectedWarnings = $problems['expected_warnings']; - - $errors = ''; - $foundString = ''; - - if ($expectedErrors !== $numErrors || $expectedWarnings !== $numWarnings) { - $lineMessage = "[LINE $line]"; - $expectedMessage = 'Expected '; - $foundMessage = 'in '.basename($testFile).' but found '; - - if ($expectedErrors !== $numErrors) { - $expectedMessage .= "$expectedErrors error(s)"; - $foundMessage .= "$numErrors error(s)"; - if ($numErrors !== 0) { - $foundString .= 'error(s)'; - $errors .= implode(PHP_EOL.' -> ', $problems['found_errors']); - } - - if ($expectedWarnings !== $numWarnings) { - $expectedMessage .= ' and '; - $foundMessage .= ' and '; - if ($numWarnings !== 0) { - if ($foundString !== '') { - $foundString .= ' and '; - } - } - } - } - - if ($expectedWarnings !== $numWarnings) { - $expectedMessage .= "$expectedWarnings warning(s)"; - $foundMessage .= "$numWarnings warning(s)"; - if ($numWarnings !== 0) { - $foundString .= 'warning(s)'; - if (empty($errors) === false) { - $errors .= PHP_EOL.' -> '; - } - - $errors .= implode(PHP_EOL.' -> ', $problems['found_warnings']); - } - } - - $fullMessage = "$lineMessage $expectedMessage $foundMessage."; - if ($errors !== '') { - $fullMessage .= " The $foundString found were:".PHP_EOL." -> $errors"; - } - - $failureMessages[] = $fullMessage; - }//end if - }//end foreach - - return $failureMessages; - - }//end generateFailureMessages() - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $filename The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - */ - public function setCliValues($filename, $config) - { - return; - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - abstract protected function getErrorList(); - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - abstract protected function getWarningList(); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Standards/AllSniffs.php b/vendor/squizlabs/php_codesniffer/tests/Standards/AllSniffs.php deleted file mode 100644 index 24527dd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Standards/AllSniffs.php +++ /dev/null @@ -1,123 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Standards; - -use PHP_CodeSniffer\Util\Standards; -use PHP_CodeSniffer\Autoload; -use PHPUnit\TextUI\TestRunner; -use PHPUnit\Framework\TestSuite; - -class AllSniffs -{ - - - /** - * Prepare the test runner. - * - * @return void - */ - public static function main() - { - TestRunner::run(self::suite()); - - }//end main() - - - /** - * Add all sniff unit tests into a test suite. - * - * Sniff unit tests are found by recursing through the 'Tests' directory - * of each installed coding standard. - * - * @return \PHPUnit\Framework\TestSuite - */ - public static function suite() - { - $GLOBALS['PHP_CODESNIFFER_SNIFF_CODES'] = []; - $GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES'] = []; - $GLOBALS['PHP_CODESNIFFER_SNIFF_CASE_FILES'] = []; - - $suite = new TestSuite('PHP CodeSniffer Standards'); - - $isInstalled = !is_file(__DIR__.'/../../autoload.php'); - - // Optionally allow for ignoring the tests for one or more standards. - $ignoreTestsForStandards = getenv('PHPCS_IGNORE_TESTS'); - if ($ignoreTestsForStandards === false) { - $ignoreTestsForStandards = []; - } else { - $ignoreTestsForStandards = explode(',', $ignoreTestsForStandards); - } - - $installedStandards = self::getInstalledStandardDetails(); - - foreach ($installedStandards as $standard => $details) { - Autoload::addSearchPath($details['path'], $details['namespace']); - - // If the test is running PEAR installed, the built-in standards - // are split into different directories; one for the sniffs and - // a different file system location for tests. - if ($isInstalled === true && is_dir(dirname($details['path']).DIRECTORY_SEPARATOR.'Generic') === true) { - $testPath = realpath(__DIR__.'/../../src/Standards/'.$standard); - } else { - $testPath = $details['path']; - } - - if (in_array($standard, $ignoreTestsForStandards, true) === true) { - continue; - } - - $testsDir = $testPath.DIRECTORY_SEPARATOR.'Tests'.DIRECTORY_SEPARATOR; - if (is_dir($testsDir) === false) { - // No tests for this standard. - continue; - } - - $di = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($testsDir)); - - foreach ($di as $file) { - // Skip hidden files. - if (substr($file->getFilename(), 0, 1) === '.') { - continue; - } - - // Tests must have the extension 'php'. - $parts = explode('.', $file); - $ext = array_pop($parts); - if ($ext !== 'php') { - continue; - } - - $className = Autoload::loadFile($file->getPathname()); - $GLOBALS['PHP_CODESNIFFER_STANDARD_DIRS'][$className] = $details['path']; - $GLOBALS['PHP_CODESNIFFER_TEST_DIRS'][$className] = $testsDir; - $suite->addTestSuite($className); - } - }//end foreach - - return $suite; - - }//end suite() - - - /** - * Get the details of all coding standards installed. - * - * @return array - * @see Standards::getInstalledStandardDetails() - */ - protected static function getInstalledStandardDetails() - { - return Standards::getInstalledStandardDetails(true); - - }//end getInstalledStandardDetails() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/TestSuite.php b/vendor/squizlabs/php_codesniffer/tests/TestSuite.php deleted file mode 100644 index 9eb269f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/TestSuite.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests; - -use PHPUnit\Framework\TestSuite as PHPUnit_TestSuite; -use PHPUnit\Framework\TestResult; - -class TestSuite extends PHPUnit_TestSuite -{ - - - /** - * Runs the tests and collects their result in a TestResult. - * - * @param \PHPUnit\Framework\TestResult $result A test result. - * - * @return \PHPUnit\Framework\TestResult - */ - public function run(TestResult $result=null) - { - $result = parent::run($result); - printPHPCodeSnifferTestOutput(); - return $result; - - }//end run() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/TestSuite7.php b/vendor/squizlabs/php_codesniffer/tests/TestSuite7.php deleted file mode 100644 index 43db293..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/TestSuite7.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests; - -use PHPUnit\Framework\TestSuite as PHPUnit_TestSuite; -use PHPUnit\Framework\TestResult; - -class TestSuite extends PHPUnit_TestSuite -{ - - - /** - * Runs the tests and collects their result in a TestResult. - * - * @param \PHPUnit\Framework\TestResult $result A test result. - * - * @return \PHPUnit\Framework\TestResult - */ - public function run(TestResult $result=null): TestResult - { - $result = parent::run($result); - printPHPCodeSnifferTestOutput(); - return $result; - - }//end run() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/bootstrap.php b/vendor/squizlabs/php_codesniffer/tests/bootstrap.php deleted file mode 100644 index 560253c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/bootstrap.php +++ /dev/null @@ -1,84 +0,0 @@ - - * @copyright 2006-2017 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -if (defined('PHP_CODESNIFFER_IN_TESTS') === false) { - define('PHP_CODESNIFFER_IN_TESTS', true); -} - -if (defined('PHP_CODESNIFFER_CBF') === false) { - define('PHP_CODESNIFFER_CBF', false); -} - -if (defined('PHP_CODESNIFFER_VERBOSITY') === false) { - define('PHP_CODESNIFFER_VERBOSITY', 0); -} - -if (is_file(__DIR__.'/../autoload.php') === true) { - include_once __DIR__.'/../autoload.php'; -} else { - include_once 'PHP/CodeSniffer/autoload.php'; -} - -$tokens = new \PHP_CodeSniffer\Util\Tokens(); - -// Compatibility for PHPUnit < 6 and PHPUnit 6+. -if (class_exists('PHPUnit_Framework_TestSuite') === true && class_exists('PHPUnit\Framework\TestSuite') === false) { - class_alias('PHPUnit_Framework_TestSuite', 'PHPUnit'.'\Framework\TestSuite'); -} - -if (class_exists('PHPUnit_Framework_TestCase') === true && class_exists('PHPUnit\Framework\TestCase') === false) { - class_alias('PHPUnit_Framework_TestCase', 'PHPUnit'.'\Framework\TestCase'); -} - -if (class_exists('PHPUnit_TextUI_TestRunner') === true && class_exists('PHPUnit\TextUI\TestRunner') === false) { - class_alias('PHPUnit_TextUI_TestRunner', 'PHPUnit'.'\TextUI\TestRunner'); -} - -if (class_exists('PHPUnit_Framework_TestResult') === true && class_exists('PHPUnit\Framework\TestResult') === false) { - class_alias('PHPUnit_Framework_TestResult', 'PHPUnit'.'\Framework\TestResult'); -} - - -/** - * A global util function to help print unit test fixing data. - * - * @return void - */ -function printPHPCodeSnifferTestOutput() -{ - echo PHP_EOL.PHP_EOL; - - $output = 'The test files'; - $data = []; - - $codeCount = count($GLOBALS['PHP_CODESNIFFER_SNIFF_CODES']); - if (empty($GLOBALS['PHP_CODESNIFFER_SNIFF_CASE_FILES']) === false) { - $files = call_user_func_array('array_merge', $GLOBALS['PHP_CODESNIFFER_SNIFF_CASE_FILES']); - $files = array_unique($files); - $fileCount = count($files); - - $output = '%d sniff test files'; - $data[] = $fileCount; - } - - $output .= ' generated %d unique error codes'; - $data[] = $codeCount; - - if ($codeCount > 0) { - $fixes = count($GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES']); - $percent = round(($fixes / $codeCount * 100), 2); - - $output .= '; %d were fixable (%d%%)'; - $data[] = $fixes; - $data[] = $percent; - } - - vprintf($output, $data); - -}//end printPHPCodeSnifferTestOutput() diff --git a/vendor/symfony/config/CHANGELOG.md b/vendor/symfony/config/CHANGELOG.md deleted file mode 100644 index 6e873cf..0000000 --- a/vendor/symfony/config/CHANGELOG.md +++ /dev/null @@ -1,124 +0,0 @@ -CHANGELOG -========= - -5.1.0 ------ - - * updated the signature of method `NodeDefinition::setDeprecated()` to `NodeDefinition::setDeprecation(string $package, string $version, string $message)` - * updated the signature of method `BaseNode::setDeprecated()` to `BaseNode::setDeprecation(string $package, string $version, string $message)` - * deprecated passing a null message to `BaseNode::setDeprecated()` to un-deprecate a node - * deprecated `BaseNode::getDeprecationMessage()`, use `BaseNode::getDeprecation()` instead - -5.0.0 ------ - - * Dropped support for constructing a `TreeBuilder` without passing root node information. - * Removed the `root()` method in `TreeBuilder`, pass the root node information to the constructor instead - * Added method `getChildNodeDefinitions()` to ParentNodeDefinitionInterface - * Removed `FileLoaderLoadException`, use `LoaderLoadException` instead - -4.4.0 ------ - - * added a way to exclude patterns of resources from being imported by the `import()` method - -4.3.0 ------ - - * deprecated using environment variables with `cannotBeEmpty()` if the value is validated with `validate()` - * made `Resource\*` classes final and not implement `Serializable` anymore - * deprecated the `root()` method in `TreeBuilder`, pass the root node information to the constructor instead - -4.2.0 ------ - - * deprecated constructing a `TreeBuilder` without passing root node information - * renamed `FileLoaderLoadException` to `LoaderLoadException` - -4.1.0 ------ - - * added `setPathSeparator` method to `NodeBuilder` class - * added third `$pathSeparator` constructor argument to `BaseNode` - * the `Processor` class has been made final - -4.0.0 ------ - - * removed `ConfigCachePass` - -3.4.0 ------ - - * added `setDeprecated()` method to indicate a deprecated node - * added `XmlUtils::parse()` method to parse an XML string - * deprecated `ConfigCachePass` - -3.3.0 ------ - - * added `ReflectionClassResource` class - * added second `$exists` constructor argument to `ClassExistenceResource` - * made `ClassExistenceResource` work with interfaces and traits - * added `ConfigCachePass` (originally in FrameworkBundle) - * added `castToArray()` helper to turn any config value into an array - -3.0.0 ------ - - * removed `ReferenceDumper` class - * removed the `ResourceInterface::isFresh()` method - * removed `BCResourceInterfaceChecker` class - * removed `ResourceInterface::getResource()` method - -2.8.0 ------ - -The edge case of defining just one value for nodes of type Enum is now allowed: - -```php -$rootNode - ->children() - ->enumNode('variable') - ->values(['value']) - ->end() - ->end() -; -``` - -Before: `InvalidArgumentException` (variable must contain at least two -distinct elements). -After: the code will work as expected and it will restrict the values of the -`variable` option to just `value`. - - * deprecated the `ResourceInterface::isFresh()` method. If you implement custom resource types and they - can be validated that way, make them implement the new `SelfCheckingResourceInterface`. - * deprecated the getResource() method in ResourceInterface. You can still call this method - on concrete classes implementing the interface, but it does not make sense at the interface - level as you need to know about the particular type of resource at hand to understand the - semantics of the returned value. - -2.7.0 ------ - - * added `ConfigCacheInterface`, `ConfigCacheFactoryInterface` and a basic `ConfigCacheFactory` - implementation to delegate creation of ConfigCache instances - -2.2.0 ------ - - * added `ArrayNodeDefinition::canBeEnabled()` and `ArrayNodeDefinition::canBeDisabled()` - to ease configuration when some sections are respectively disabled / enabled - by default. - * added a `normalizeKeys()` method for array nodes (to avoid key normalization) - * added numerical type handling for config definitions - * added convenience methods for optional configuration sections to `ArrayNodeDefinition` - * added a utils class for XML manipulations - -2.1.0 ------ - - * added a way to add documentation on configuration - * implemented `Serializable` on resources - * `LoaderResolverInterface` is now used instead of `LoaderResolver` for type - hinting diff --git a/vendor/symfony/config/ConfigCache.php b/vendor/symfony/config/ConfigCache.php deleted file mode 100644 index 053059b..0000000 --- a/vendor/symfony/config/ConfigCache.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config; - -use Symfony\Component\Config\Resource\SelfCheckingResourceChecker; - -/** - * ConfigCache caches arbitrary content in files on disk. - * - * When in debug mode, those metadata resources that implement - * \Symfony\Component\Config\Resource\SelfCheckingResourceInterface will - * be used to check cache freshness. - * - * @author Fabien Potencier - * @author Matthias Pigulla - */ -class ConfigCache extends ResourceCheckerConfigCache -{ - private $debug; - - /** - * @param string $file The absolute cache path - * @param bool $debug Whether debugging is enabled or not - */ - public function __construct(string $file, bool $debug) - { - $this->debug = $debug; - - $checkers = []; - if (true === $this->debug) { - $checkers = [new SelfCheckingResourceChecker()]; - } - - parent::__construct($file, $checkers); - } - - /** - * Checks if the cache is still fresh. - * - * This implementation always returns true when debug is off and the - * cache file exists. - * - * @return bool true if the cache is fresh, false otherwise - */ - public function isFresh() - { - if (!$this->debug && is_file($this->getPath())) { - return true; - } - - return parent::isFresh(); - } -} diff --git a/vendor/symfony/config/ConfigCacheFactory.php b/vendor/symfony/config/ConfigCacheFactory.php deleted file mode 100644 index 11fd3cb..0000000 --- a/vendor/symfony/config/ConfigCacheFactory.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config; - -/** - * Basic implementation of ConfigCacheFactoryInterface that - * creates an instance of the default ConfigCache. - * - * This factory and/or cache do not support cache validation - * by means of ResourceChecker instances (that is, service-based). - * - * @author Matthias Pigulla - */ -class ConfigCacheFactory implements ConfigCacheFactoryInterface -{ - private $debug; - - /** - * @param bool $debug The debug flag to pass to ConfigCache - */ - public function __construct(bool $debug) - { - $this->debug = $debug; - } - - /** - * {@inheritdoc} - */ - public function cache(string $file, callable $callback) - { - $cache = new ConfigCache($file, $this->debug); - if (!$cache->isFresh()) { - $callback($cache); - } - - return $cache; - } -} diff --git a/vendor/symfony/config/ConfigCacheFactoryInterface.php b/vendor/symfony/config/ConfigCacheFactoryInterface.php deleted file mode 100644 index 7dfa0f2..0000000 --- a/vendor/symfony/config/ConfigCacheFactoryInterface.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config; - -/** - * Interface for a ConfigCache factory. This factory creates - * an instance of ConfigCacheInterface and initializes the - * cache if necessary. - * - * @author Matthias Pigulla - */ -interface ConfigCacheFactoryInterface -{ - /** - * Creates a cache instance and (re-)initializes it if necessary. - * - * @param string $file The absolute cache file path - * @param callable $callable The callable to be executed when the cache needs to be filled (i. e. is not fresh). The cache will be passed as the only parameter to this callback - * - * @return ConfigCacheInterface The cache instance - */ - public function cache(string $file, callable $callable); -} diff --git a/vendor/symfony/config/ConfigCacheInterface.php b/vendor/symfony/config/ConfigCacheInterface.php deleted file mode 100644 index 001e7e7..0000000 --- a/vendor/symfony/config/ConfigCacheInterface.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config; - -use Symfony\Component\Config\Resource\ResourceInterface; - -/** - * Interface for ConfigCache. - * - * @author Matthias Pigulla - */ -interface ConfigCacheInterface -{ - /** - * Gets the cache file path. - * - * @return string The cache file path - */ - public function getPath(); - - /** - * Checks if the cache is still fresh. - * - * This check should take the metadata passed to the write() method into consideration. - * - * @return bool Whether the cache is still fresh - */ - public function isFresh(); - - /** - * Writes the given content into the cache file. Metadata will be stored - * independently and can be used to check cache freshness at a later time. - * - * @param string $content The content to write into the cache - * @param ResourceInterface[]|null $metadata An array of ResourceInterface instances - * - * @throws \RuntimeException When the cache file cannot be written - */ - public function write(string $content, array $metadata = null); -} diff --git a/vendor/symfony/config/Definition/ArrayNode.php b/vendor/symfony/config/Definition/ArrayNode.php deleted file mode 100644 index ddb104f..0000000 --- a/vendor/symfony/config/Definition/ArrayNode.php +++ /dev/null @@ -1,407 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; -use Symfony\Component\Config\Definition\Exception\InvalidTypeException; -use Symfony\Component\Config\Definition\Exception\UnsetKeyException; - -/** - * Represents an Array node in the config tree. - * - * @author Johannes M. Schmitt - */ -class ArrayNode extends BaseNode implements PrototypeNodeInterface -{ - protected $xmlRemappings = []; - protected $children = []; - protected $allowFalse = false; - protected $allowNewKeys = true; - protected $addIfNotSet = false; - protected $performDeepMerging = true; - protected $ignoreExtraKeys = false; - protected $removeExtraKeys = true; - protected $normalizeKeys = true; - - public function setNormalizeKeys($normalizeKeys) - { - $this->normalizeKeys = (bool) $normalizeKeys; - } - - /** - * {@inheritdoc} - * - * Namely, you mostly have foo_bar in YAML while you have foo-bar in XML. - * After running this method, all keys are normalized to foo_bar. - * - * If you have a mixed key like foo-bar_moo, it will not be altered. - * The key will also not be altered if the target key already exists. - */ - protected function preNormalize($value) - { - if (!$this->normalizeKeys || !\is_array($value)) { - return $value; - } - - $normalized = []; - - foreach ($value as $k => $v) { - if (false !== strpos($k, '-') && false === strpos($k, '_') && !\array_key_exists($normalizedKey = str_replace('-', '_', $k), $value)) { - $normalized[$normalizedKey] = $v; - } else { - $normalized[$k] = $v; - } - } - - return $normalized; - } - - /** - * Retrieves the children of this node. - * - * @return array The children - */ - public function getChildren() - { - return $this->children; - } - - /** - * Sets the xml remappings that should be performed. - * - * @param array $remappings An array of the form [[string, string]] - */ - public function setXmlRemappings(array $remappings) - { - $this->xmlRemappings = $remappings; - } - - /** - * Gets the xml remappings that should be performed. - * - * @return array an array of the form [[string, string]] - */ - public function getXmlRemappings() - { - return $this->xmlRemappings; - } - - /** - * Sets whether to add default values for this array if it has not been - * defined in any of the configuration files. - */ - public function setAddIfNotSet(bool $boolean) - { - $this->addIfNotSet = $boolean; - } - - /** - * Sets whether false is allowed as value indicating that the array should be unset. - */ - public function setAllowFalse(bool $allow) - { - $this->allowFalse = $allow; - } - - /** - * Sets whether new keys can be defined in subsequent configurations. - */ - public function setAllowNewKeys(bool $allow) - { - $this->allowNewKeys = $allow; - } - - /** - * Sets if deep merging should occur. - */ - public function setPerformDeepMerging(bool $boolean) - { - $this->performDeepMerging = $boolean; - } - - /** - * Whether extra keys should just be ignored without an exception. - * - * @param bool $boolean To allow extra keys - * @param bool $remove To remove extra keys - */ - public function setIgnoreExtraKeys(bool $boolean, bool $remove = true) - { - $this->ignoreExtraKeys = $boolean; - $this->removeExtraKeys = $this->ignoreExtraKeys && $remove; - } - - /** - * {@inheritdoc} - */ - public function setName(string $name) - { - $this->name = $name; - } - - /** - * {@inheritdoc} - */ - public function hasDefaultValue() - { - return $this->addIfNotSet; - } - - /** - * {@inheritdoc} - */ - public function getDefaultValue() - { - if (!$this->hasDefaultValue()) { - throw new \RuntimeException(sprintf('The node at path "%s" has no default value.', $this->getPath())); - } - - $defaults = []; - foreach ($this->children as $name => $child) { - if ($child->hasDefaultValue()) { - $defaults[$name] = $child->getDefaultValue(); - } - } - - return $defaults; - } - - /** - * Adds a child node. - * - * @throws \InvalidArgumentException when the child node has no name - * @throws \InvalidArgumentException when the child node's name is not unique - */ - public function addChild(NodeInterface $node) - { - $name = $node->getName(); - if (!\strlen($name)) { - throw new \InvalidArgumentException('Child nodes must be named.'); - } - if (isset($this->children[$name])) { - throw new \InvalidArgumentException(sprintf('A child node named "%s" already exists.', $name)); - } - - $this->children[$name] = $node; - } - - /** - * Finalizes the value of this node. - * - * @param mixed $value - * - * @return mixed The finalised value - * - * @throws UnsetKeyException - * @throws InvalidConfigurationException if the node doesn't have enough children - */ - protected function finalizeValue($value) - { - if (false === $value) { - throw new UnsetKeyException(sprintf('Unsetting key for path "%s", value: %s.', $this->getPath(), json_encode($value))); - } - - foreach ($this->children as $name => $child) { - if (!\array_key_exists($name, $value)) { - if ($child->isRequired()) { - $ex = new InvalidConfigurationException(sprintf('The child node "%s" at path "%s" must be configured.', $name, $this->getPath())); - $ex->setPath($this->getPath()); - - throw $ex; - } - - if ($child->hasDefaultValue()) { - $value[$name] = $child->getDefaultValue(); - } - - continue; - } - - if ($child->isDeprecated()) { - $deprecation = $child->getDeprecation($name, $this->getPath()); - trigger_deprecation($deprecation['package'], $deprecation['version'], $deprecation['message']); - } - - try { - $value[$name] = $child->finalize($value[$name]); - } catch (UnsetKeyException $e) { - unset($value[$name]); - } - } - - return $value; - } - - /** - * Validates the type of the value. - * - * @param mixed $value - * - * @throws InvalidTypeException - */ - protected function validateType($value) - { - if (!\is_array($value) && (!$this->allowFalse || false !== $value)) { - $ex = new InvalidTypeException(sprintf('Invalid type for path "%s". Expected "array", but got "%s"', $this->getPath(), get_debug_type($value))); - if ($hint = $this->getInfo()) { - $ex->addHint($hint); - } - $ex->setPath($this->getPath()); - - throw $ex; - } - } - - /** - * Normalizes the value. - * - * @param mixed $value The value to normalize - * - * @return mixed The normalized value - * - * @throws InvalidConfigurationException - */ - protected function normalizeValue($value) - { - if (false === $value) { - return $value; - } - - $value = $this->remapXml($value); - - $normalized = []; - foreach ($value as $name => $val) { - if (isset($this->children[$name])) { - try { - $normalized[$name] = $this->children[$name]->normalize($val); - } catch (UnsetKeyException $e) { - } - unset($value[$name]); - } elseif (!$this->removeExtraKeys) { - $normalized[$name] = $val; - } - } - - // if extra fields are present, throw exception - if (\count($value) && !$this->ignoreExtraKeys) { - $proposals = array_keys($this->children); - sort($proposals); - $guesses = []; - - foreach (array_keys($value) as $subject) { - $minScore = INF; - foreach ($proposals as $proposal) { - $distance = levenshtein($subject, $proposal); - if ($distance <= $minScore && $distance < 3) { - $guesses[$proposal] = $distance; - $minScore = $distance; - } - } - } - - $msg = sprintf('Unrecognized option%s "%s" under "%s"', 1 === \count($value) ? '' : 's', implode(', ', array_keys($value)), $this->getPath()); - - if (\count($guesses)) { - asort($guesses); - $msg .= sprintf('. Did you mean "%s"?', implode('", "', array_keys($guesses))); - } else { - $msg .= sprintf('. Available option%s %s "%s".', 1 === \count($proposals) ? '' : 's', 1 === \count($proposals) ? 'is' : 'are', implode('", "', $proposals)); - } - - $ex = new InvalidConfigurationException($msg); - $ex->setPath($this->getPath()); - - throw $ex; - } - - return $normalized; - } - - /** - * Remaps multiple singular values to a single plural value. - * - * @return array The remapped values - */ - protected function remapXml(array $value) - { - foreach ($this->xmlRemappings as list($singular, $plural)) { - if (!isset($value[$singular])) { - continue; - } - - $value[$plural] = Processor::normalizeConfig($value, $singular, $plural); - unset($value[$singular]); - } - - return $value; - } - - /** - * Merges values together. - * - * @param mixed $leftSide The left side to merge - * @param mixed $rightSide The right side to merge - * - * @return mixed The merged values - * - * @throws InvalidConfigurationException - * @throws \RuntimeException - */ - protected function mergeValues($leftSide, $rightSide) - { - if (false === $rightSide) { - // if this is still false after the last config has been merged the - // finalization pass will take care of removing this key entirely - return false; - } - - if (false === $leftSide || !$this->performDeepMerging) { - return $rightSide; - } - - foreach ($rightSide as $k => $v) { - // no conflict - if (!\array_key_exists($k, $leftSide)) { - if (!$this->allowNewKeys) { - $ex = new InvalidConfigurationException(sprintf('You are not allowed to define new elements for path "%s". Please define all elements for this path in one config file. If you are trying to overwrite an element, make sure you redefine it with the same name.', $this->getPath())); - $ex->setPath($this->getPath()); - - throw $ex; - } - - $leftSide[$k] = $v; - continue; - } - - if (!isset($this->children[$k])) { - if (!$this->ignoreExtraKeys || $this->removeExtraKeys) { - throw new \RuntimeException('merge() expects a normalized config array.'); - } - - $leftSide[$k] = $v; - continue; - } - - $leftSide[$k] = $this->children[$k]->merge($leftSide[$k], $v); - } - - return $leftSide; - } - - /** - * {@inheritdoc} - */ - protected function allowPlaceholders(): bool - { - return false; - } -} diff --git a/vendor/symfony/config/Definition/BaseNode.php b/vendor/symfony/config/Definition/BaseNode.php deleted file mode 100644 index e5f3a28..0000000 --- a/vendor/symfony/config/Definition/BaseNode.php +++ /dev/null @@ -1,591 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -use Symfony\Component\Config\Definition\Exception\Exception; -use Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException; -use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; -use Symfony\Component\Config\Definition\Exception\InvalidTypeException; -use Symfony\Component\Config\Definition\Exception\UnsetKeyException; - -/** - * The base node class. - * - * @author Johannes M. Schmitt - */ -abstract class BaseNode implements NodeInterface -{ - const DEFAULT_PATH_SEPARATOR = '.'; - - private static $placeholderUniquePrefixes = []; - private static $placeholders = []; - - protected $name; - protected $parent; - protected $normalizationClosures = []; - protected $finalValidationClosures = []; - protected $allowOverwrite = true; - protected $required = false; - protected $deprecation = []; - protected $equivalentValues = []; - protected $attributes = []; - protected $pathSeparator; - - private $handlingPlaceholder; - - /** - * @throws \InvalidArgumentException if the name contains a period - */ - public function __construct(?string $name, NodeInterface $parent = null, string $pathSeparator = self::DEFAULT_PATH_SEPARATOR) - { - if (false !== strpos($name = (string) $name, $pathSeparator)) { - throw new \InvalidArgumentException('The name must not contain ".'.$pathSeparator.'".'); - } - - $this->name = $name; - $this->parent = $parent; - $this->pathSeparator = $pathSeparator; - } - - /** - * Register possible (dummy) values for a dynamic placeholder value. - * - * Matching configuration values will be processed with a provided value, one by one. After a provided value is - * successfully processed the configuration value is returned as is, thus preserving the placeholder. - * - * @internal - */ - public static function setPlaceholder(string $placeholder, array $values): void - { - if (!$values) { - throw new \InvalidArgumentException('At least one value must be provided.'); - } - - self::$placeholders[$placeholder] = $values; - } - - /** - * Adds a common prefix for dynamic placeholder values. - * - * Matching configuration values will be skipped from being processed and are returned as is, thus preserving the - * placeholder. An exact match provided by {@see setPlaceholder()} might take precedence. - * - * @internal - */ - public static function setPlaceholderUniquePrefix(string $prefix): void - { - self::$placeholderUniquePrefixes[] = $prefix; - } - - /** - * Resets all current placeholders available. - * - * @internal - */ - public static function resetPlaceholders(): void - { - self::$placeholderUniquePrefixes = []; - self::$placeholders = []; - } - - public function setAttribute(string $key, $value) - { - $this->attributes[$key] = $value; - } - - /** - * @return mixed - */ - public function getAttribute(string $key, $default = null) - { - return isset($this->attributes[$key]) ? $this->attributes[$key] : $default; - } - - /** - * @return bool - */ - public function hasAttribute(string $key) - { - return isset($this->attributes[$key]); - } - - /** - * @return array - */ - public function getAttributes() - { - return $this->attributes; - } - - public function setAttributes(array $attributes) - { - $this->attributes = $attributes; - } - - public function removeAttribute(string $key) - { - unset($this->attributes[$key]); - } - - /** - * Sets an info message. - */ - public function setInfo(string $info) - { - $this->setAttribute('info', $info); - } - - /** - * Returns info message. - * - * @return string|null The info text - */ - public function getInfo() - { - return $this->getAttribute('info'); - } - - /** - * Sets the example configuration for this node. - * - * @param string|array $example - */ - public function setExample($example) - { - $this->setAttribute('example', $example); - } - - /** - * Retrieves the example configuration for this node. - * - * @return string|array|null The example - */ - public function getExample() - { - return $this->getAttribute('example'); - } - - /** - * Adds an equivalent value. - * - * @param mixed $originalValue - * @param mixed $equivalentValue - */ - public function addEquivalentValue($originalValue, $equivalentValue) - { - $this->equivalentValues[] = [$originalValue, $equivalentValue]; - } - - /** - * Set this node as required. - * - * @param bool $boolean Required node - */ - public function setRequired(bool $boolean) - { - $this->required = $boolean; - } - - /** - * Sets this node as deprecated. - * - * @param string $package The name of the composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string $message The deprecation message to use - * - * You can use %node% and %path% placeholders in your message to display, - * respectively, the node name and its complete path. - */ - public function setDeprecated(?string $package/*, string $version, string $message = 'The child node "%node%" at path "%path%" is deprecated.' */) - { - $args = \func_get_args(); - - if (\func_num_args() < 2) { - trigger_deprecation('symfony/config', '5.1', 'The signature of method "%s()" requires 3 arguments: "string $package, string $version, string $message", not defining them is deprecated.', __METHOD__); - - if (!isset($args[0])) { - trigger_deprecation('symfony/config', '5.1', 'Passing a null message to un-deprecate a node is deprecated.'); - - $this->deprecation = []; - - return; - } - - $message = (string) $args[0]; - $package = $version = ''; - } else { - $package = (string) $args[0]; - $version = (string) $args[1]; - $message = (string) ($args[2] ?? 'The child node "%node%" at path "%path%" is deprecated.'); - } - - $this->deprecation = [ - 'package' => $package, - 'version' => $version, - 'message' => $message, - ]; - } - - /** - * Sets if this node can be overridden. - */ - public function setAllowOverwrite(bool $allow) - { - $this->allowOverwrite = $allow; - } - - /** - * Sets the closures used for normalization. - * - * @param \Closure[] $closures An array of Closures used for normalization - */ - public function setNormalizationClosures(array $closures) - { - $this->normalizationClosures = $closures; - } - - /** - * Sets the closures used for final validation. - * - * @param \Closure[] $closures An array of Closures used for final validation - */ - public function setFinalValidationClosures(array $closures) - { - $this->finalValidationClosures = $closures; - } - - /** - * {@inheritdoc} - */ - public function isRequired() - { - return $this->required; - } - - /** - * Checks if this node is deprecated. - * - * @return bool - */ - public function isDeprecated() - { - return (bool) $this->deprecation; - } - - /** - * Returns the deprecated message. - * - * @param string $node the configuration node name - * @param string $path the path of the node - * - * @return string - * - * @deprecated since Symfony 5.1, use "getDeprecation()" instead. - */ - public function getDeprecationMessage(string $node, string $path) - { - trigger_deprecation('symfony/config', '5.1', 'The "%s()" method is deprecated, use "getDeprecation()" instead.', __METHOD__); - - return $this->getDeprecation($node, $path)['message']; - } - - /** - * @param string $node The configuration node name - * @param string $path The path of the node - */ - public function getDeprecation(string $node, string $path): array - { - return [ - 'package' => $this->deprecation['package'] ?? '', - 'version' => $this->deprecation['version'] ?? '', - 'message' => strtr($this->deprecation['message'] ?? '', ['%node%' => $node, '%path%' => $path]), - ]; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - /** - * {@inheritdoc} - */ - public function getPath() - { - if (null !== $this->parent) { - return $this->parent->getPath().$this->pathSeparator.$this->name; - } - - return $this->name; - } - - /** - * {@inheritdoc} - */ - final public function merge($leftSide, $rightSide) - { - if (!$this->allowOverwrite) { - throw new ForbiddenOverwriteException(sprintf('Configuration path "%s" cannot be overwritten. You have to define all options for this path, and any of its sub-paths in one configuration section.', $this->getPath())); - } - - if ($leftSide !== $leftPlaceholders = self::resolvePlaceholderValue($leftSide)) { - foreach ($leftPlaceholders as $leftPlaceholder) { - $this->handlingPlaceholder = $leftSide; - try { - $this->merge($leftPlaceholder, $rightSide); - } finally { - $this->handlingPlaceholder = null; - } - } - - return $rightSide; - } - - if ($rightSide !== $rightPlaceholders = self::resolvePlaceholderValue($rightSide)) { - foreach ($rightPlaceholders as $rightPlaceholder) { - $this->handlingPlaceholder = $rightSide; - try { - $this->merge($leftSide, $rightPlaceholder); - } finally { - $this->handlingPlaceholder = null; - } - } - - return $rightSide; - } - - $this->doValidateType($leftSide); - $this->doValidateType($rightSide); - - return $this->mergeValues($leftSide, $rightSide); - } - - /** - * {@inheritdoc} - */ - final public function normalize($value) - { - $value = $this->preNormalize($value); - - // run custom normalization closures - foreach ($this->normalizationClosures as $closure) { - $value = $closure($value); - } - - // resolve placeholder value - if ($value !== $placeholders = self::resolvePlaceholderValue($value)) { - foreach ($placeholders as $placeholder) { - $this->handlingPlaceholder = $value; - try { - $this->normalize($placeholder); - } finally { - $this->handlingPlaceholder = null; - } - } - - return $value; - } - - // replace value with their equivalent - foreach ($this->equivalentValues as $data) { - if ($data[0] === $value) { - $value = $data[1]; - } - } - - // validate type - $this->doValidateType($value); - - // normalize value - return $this->normalizeValue($value); - } - - /** - * Normalizes the value before any other normalization is applied. - * - * @param mixed $value - * - * @return mixed The normalized array value - */ - protected function preNormalize($value) - { - return $value; - } - - /** - * Returns parent node for this node. - * - * @return NodeInterface|null - */ - public function getParent() - { - return $this->parent; - } - - /** - * {@inheritdoc} - */ - final public function finalize($value) - { - if ($value !== $placeholders = self::resolvePlaceholderValue($value)) { - foreach ($placeholders as $placeholder) { - $this->handlingPlaceholder = $value; - try { - $this->finalize($placeholder); - } finally { - $this->handlingPlaceholder = null; - } - } - - return $value; - } - - $this->doValidateType($value); - - $value = $this->finalizeValue($value); - - // Perform validation on the final value if a closure has been set. - // The closure is also allowed to return another value. - foreach ($this->finalValidationClosures as $closure) { - try { - $value = $closure($value); - } catch (Exception $e) { - if ($e instanceof UnsetKeyException && null !== $this->handlingPlaceholder) { - continue; - } - - throw $e; - } catch (\Exception $e) { - throw new InvalidConfigurationException(sprintf('Invalid configuration for path "%s": ', $this->getPath()).$e->getMessage(), $e->getCode(), $e); - } - } - - return $value; - } - - /** - * Validates the type of a Node. - * - * @param mixed $value The value to validate - * - * @throws InvalidTypeException when the value is invalid - */ - abstract protected function validateType($value); - - /** - * Normalizes the value. - * - * @param mixed $value The value to normalize - * - * @return mixed The normalized value - */ - abstract protected function normalizeValue($value); - - /** - * Merges two values together. - * - * @param mixed $leftSide - * @param mixed $rightSide - * - * @return mixed The merged value - */ - abstract protected function mergeValues($leftSide, $rightSide); - - /** - * Finalizes a value. - * - * @param mixed $value The value to finalize - * - * @return mixed The finalized value - */ - abstract protected function finalizeValue($value); - - /** - * Tests if placeholder values are allowed for this node. - */ - protected function allowPlaceholders(): bool - { - return true; - } - - /** - * Tests if a placeholder is being handled currently. - */ - protected function isHandlingPlaceholder(): bool - { - return null !== $this->handlingPlaceholder; - } - - /** - * Gets allowed dynamic types for this node. - */ - protected function getValidPlaceholderTypes(): array - { - return []; - } - - private static function resolvePlaceholderValue($value) - { - if (\is_string($value)) { - if (isset(self::$placeholders[$value])) { - return self::$placeholders[$value]; - } - - foreach (self::$placeholderUniquePrefixes as $placeholderUniquePrefix) { - if (0 === strpos($value, $placeholderUniquePrefix)) { - return []; - } - } - } - - return $value; - } - - private function doValidateType($value): void - { - if (null !== $this->handlingPlaceholder && !$this->allowPlaceholders()) { - $e = new InvalidTypeException(sprintf('A dynamic value is not compatible with a "%s" node type at path "%s".', static::class, $this->getPath())); - $e->setPath($this->getPath()); - - throw $e; - } - - if (null === $this->handlingPlaceholder || null === $value) { - $this->validateType($value); - - return; - } - - $knownTypes = array_keys(self::$placeholders[$this->handlingPlaceholder]); - $validTypes = $this->getValidPlaceholderTypes(); - - if ($validTypes && array_diff($knownTypes, $validTypes)) { - $e = new InvalidTypeException(sprintf( - 'Invalid type for path "%s". Expected %s, but got %s.', - $this->getPath(), - 1 === \count($validTypes) ? '"'.reset($validTypes).'"' : 'one of "'.implode('", "', $validTypes).'"', - 1 === \count($knownTypes) ? '"'.reset($knownTypes).'"' : 'one of "'.implode('", "', $knownTypes).'"' - )); - if ($hint = $this->getInfo()) { - $e->addHint($hint); - } - $e->setPath($this->getPath()); - - throw $e; - } - - $this->validateType($value); - } -} diff --git a/vendor/symfony/config/Definition/BooleanNode.php b/vendor/symfony/config/Definition/BooleanNode.php deleted file mode 100644 index c64ecb8..0000000 --- a/vendor/symfony/config/Definition/BooleanNode.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -use Symfony\Component\Config\Definition\Exception\InvalidTypeException; - -/** - * This node represents a Boolean value in the config tree. - * - * @author Johannes M. Schmitt - */ -class BooleanNode extends ScalarNode -{ - /** - * {@inheritdoc} - */ - protected function validateType($value) - { - if (!\is_bool($value)) { - $ex = new InvalidTypeException(sprintf('Invalid type for path "%s". Expected "bool", but got "%s".', $this->getPath(), get_debug_type($value))); - if ($hint = $this->getInfo()) { - $ex->addHint($hint); - } - $ex->setPath($this->getPath()); - - throw $ex; - } - } - - /** - * {@inheritdoc} - */ - protected function isValueEmpty($value) - { - // a boolean value cannot be empty - return false; - } - - /** - * {@inheritdoc} - */ - protected function getValidPlaceholderTypes(): array - { - return ['bool']; - } -} diff --git a/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php b/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php deleted file mode 100644 index 1668e8f..0000000 --- a/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php +++ /dev/null @@ -1,549 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -use Symfony\Component\Config\Definition\ArrayNode; -use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException; -use Symfony\Component\Config\Definition\PrototypedArrayNode; - -/** - * This class provides a fluent interface for defining an array node. - * - * @author Johannes M. Schmitt - */ -class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinitionInterface -{ - protected $performDeepMerging = true; - protected $ignoreExtraKeys = false; - protected $removeExtraKeys = true; - protected $children = []; - protected $prototype; - protected $atLeastOne = false; - protected $allowNewKeys = true; - protected $key; - protected $removeKeyItem; - protected $addDefaults = false; - protected $addDefaultChildren = false; - protected $nodeBuilder; - protected $normalizeKeys = true; - - /** - * {@inheritdoc} - */ - public function __construct(?string $name, NodeParentInterface $parent = null) - { - parent::__construct($name, $parent); - - $this->nullEquivalent = []; - $this->trueEquivalent = []; - } - - /** - * {@inheritdoc} - */ - public function setBuilder(NodeBuilder $builder) - { - $this->nodeBuilder = $builder; - } - - /** - * {@inheritdoc} - */ - public function children() - { - return $this->getNodeBuilder(); - } - - /** - * Sets a prototype for child nodes. - * - * @return NodeDefinition - */ - public function prototype(string $type) - { - return $this->prototype = $this->getNodeBuilder()->node(null, $type)->setParent($this); - } - - /** - * @return VariableNodeDefinition - */ - public function variablePrototype() - { - return $this->prototype('variable'); - } - - /** - * @return ScalarNodeDefinition - */ - public function scalarPrototype() - { - return $this->prototype('scalar'); - } - - /** - * @return BooleanNodeDefinition - */ - public function booleanPrototype() - { - return $this->prototype('boolean'); - } - - /** - * @return IntegerNodeDefinition - */ - public function integerPrototype() - { - return $this->prototype('integer'); - } - - /** - * @return FloatNodeDefinition - */ - public function floatPrototype() - { - return $this->prototype('float'); - } - - /** - * @return ArrayNodeDefinition - */ - public function arrayPrototype() - { - return $this->prototype('array'); - } - - /** - * @return EnumNodeDefinition - */ - public function enumPrototype() - { - return $this->prototype('enum'); - } - - /** - * Adds the default value if the node is not set in the configuration. - * - * This method is applicable to concrete nodes only (not to prototype nodes). - * If this function has been called and the node is not set during the finalization - * phase, it's default value will be derived from its children default values. - * - * @return $this - */ - public function addDefaultsIfNotSet() - { - $this->addDefaults = true; - - return $this; - } - - /** - * Adds children with a default value when none are defined. - * - * This method is applicable to prototype nodes only. - * - * @param int|string|array|null $children The number of children|The child name|The children names to be added - * - * @return $this - */ - public function addDefaultChildrenIfNoneSet($children = null) - { - $this->addDefaultChildren = $children; - - return $this; - } - - /** - * Requires the node to have at least one element. - * - * This method is applicable to prototype nodes only. - * - * @return $this - */ - public function requiresAtLeastOneElement() - { - $this->atLeastOne = true; - - return $this; - } - - /** - * Disallows adding news keys in a subsequent configuration. - * - * If used all keys have to be defined in the same configuration file. - * - * @return $this - */ - public function disallowNewKeysInSubsequentConfigs() - { - $this->allowNewKeys = false; - - return $this; - } - - /** - * Sets a normalization rule for XML configurations. - * - * @param string $singular The key to remap - * @param string|null $plural The plural of the key for irregular plurals - * - * @return $this - */ - public function fixXmlConfig(string $singular, string $plural = null) - { - $this->normalization()->remap($singular, $plural); - - return $this; - } - - /** - * Sets the attribute which value is to be used as key. - * - * This is useful when you have an indexed array that should be an - * associative array. You can select an item from within the array - * to be the key of the particular item. For example, if "id" is the - * "key", then: - * - * [ - * ['id' => 'my_name', 'foo' => 'bar'], - * ]; - * - * becomes - * - * [ - * 'my_name' => ['foo' => 'bar'], - * ]; - * - * If you'd like "'id' => 'my_name'" to still be present in the resulting - * array, then you can set the second argument of this method to false. - * - * This method is applicable to prototype nodes only. - * - * @param string $name The name of the key - * @param bool $removeKeyItem Whether or not the key item should be removed - * - * @return $this - */ - public function useAttributeAsKey(string $name, bool $removeKeyItem = true) - { - $this->key = $name; - $this->removeKeyItem = $removeKeyItem; - - return $this; - } - - /** - * Sets whether the node can be unset. - * - * @return $this - */ - public function canBeUnset(bool $allow = true) - { - $this->merge()->allowUnset($allow); - - return $this; - } - - /** - * Adds an "enabled" boolean to enable the current section. - * - * By default, the section is disabled. If any configuration is specified then - * the node will be automatically enabled: - * - * enableableArrayNode: {enabled: true, ...} # The config is enabled & default values get overridden - * enableableArrayNode: ~ # The config is enabled & use the default values - * enableableArrayNode: true # The config is enabled & use the default values - * enableableArrayNode: {other: value, ...} # The config is enabled & default values get overridden - * enableableArrayNode: {enabled: false, ...} # The config is disabled - * enableableArrayNode: false # The config is disabled - * - * @return $this - */ - public function canBeEnabled() - { - $this - ->addDefaultsIfNotSet() - ->treatFalseLike(['enabled' => false]) - ->treatTrueLike(['enabled' => true]) - ->treatNullLike(['enabled' => true]) - ->beforeNormalization() - ->ifArray() - ->then(function ($v) { - $v['enabled'] = isset($v['enabled']) ? $v['enabled'] : true; - - return $v; - }) - ->end() - ->children() - ->booleanNode('enabled') - ->defaultFalse() - ; - - return $this; - } - - /** - * Adds an "enabled" boolean to enable the current section. - * - * By default, the section is enabled. - * - * @return $this - */ - public function canBeDisabled() - { - $this - ->addDefaultsIfNotSet() - ->treatFalseLike(['enabled' => false]) - ->treatTrueLike(['enabled' => true]) - ->treatNullLike(['enabled' => true]) - ->children() - ->booleanNode('enabled') - ->defaultTrue() - ; - - return $this; - } - - /** - * Disables the deep merging of the node. - * - * @return $this - */ - public function performNoDeepMerging() - { - $this->performDeepMerging = false; - - return $this; - } - - /** - * Allows extra config keys to be specified under an array without - * throwing an exception. - * - * Those config values are ignored and removed from the resulting - * array. This should be used only in special cases where you want - * to send an entire configuration array through a special tree that - * processes only part of the array. - * - * @param bool $remove Whether to remove the extra keys - * - * @return $this - */ - public function ignoreExtraKeys(bool $remove = true) - { - $this->ignoreExtraKeys = true; - $this->removeExtraKeys = $remove; - - return $this; - } - - /** - * Sets whether to enable key normalization. - * - * @return $this - */ - public function normalizeKeys(bool $bool) - { - $this->normalizeKeys = $bool; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function append(NodeDefinition $node) - { - $this->children[$node->name] = $node->setParent($this); - - return $this; - } - - /** - * Returns a node builder to be used to add children and prototype. - * - * @return NodeBuilder The node builder - */ - protected function getNodeBuilder() - { - if (null === $this->nodeBuilder) { - $this->nodeBuilder = new NodeBuilder(); - } - - return $this->nodeBuilder->setParent($this); - } - - /** - * {@inheritdoc} - */ - protected function createNode() - { - if (null === $this->prototype) { - $node = new ArrayNode($this->name, $this->parent, $this->pathSeparator); - - $this->validateConcreteNode($node); - - $node->setAddIfNotSet($this->addDefaults); - - foreach ($this->children as $child) { - $child->parent = $node; - $node->addChild($child->getNode()); - } - } else { - $node = new PrototypedArrayNode($this->name, $this->parent, $this->pathSeparator); - - $this->validatePrototypeNode($node); - - if (null !== $this->key) { - $node->setKeyAttribute($this->key, $this->removeKeyItem); - } - - if (true === $this->atLeastOne || false === $this->allowEmptyValue) { - $node->setMinNumberOfElements(1); - } - - if ($this->default) { - if (!\is_array($this->defaultValue)) { - throw new \InvalidArgumentException(sprintf('%s: the default value of an array node has to be an array.', $node->getPath())); - } - - $node->setDefaultValue($this->defaultValue); - } - - if (false !== $this->addDefaultChildren) { - $node->setAddChildrenIfNoneSet($this->addDefaultChildren); - if ($this->prototype instanceof static && null === $this->prototype->prototype) { - $this->prototype->addDefaultsIfNotSet(); - } - } - - $this->prototype->parent = $node; - $node->setPrototype($this->prototype->getNode()); - } - - $node->setAllowNewKeys($this->allowNewKeys); - $node->addEquivalentValue(null, $this->nullEquivalent); - $node->addEquivalentValue(true, $this->trueEquivalent); - $node->addEquivalentValue(false, $this->falseEquivalent); - $node->setPerformDeepMerging($this->performDeepMerging); - $node->setRequired($this->required); - $node->setIgnoreExtraKeys($this->ignoreExtraKeys, $this->removeExtraKeys); - $node->setNormalizeKeys($this->normalizeKeys); - - if ($this->deprecation) { - $node->setDeprecated($this->deprecation['package'], $this->deprecation['version'], $this->deprecation['message']); - } - - if (null !== $this->normalization) { - $node->setNormalizationClosures($this->normalization->before); - $node->setXmlRemappings($this->normalization->remappings); - } - - if (null !== $this->merge) { - $node->setAllowOverwrite($this->merge->allowOverwrite); - $node->setAllowFalse($this->merge->allowFalse); - } - - if (null !== $this->validation) { - $node->setFinalValidationClosures($this->validation->rules); - } - - return $node; - } - - /** - * Validate the configuration of a concrete node. - * - * @throws InvalidDefinitionException - */ - protected function validateConcreteNode(ArrayNode $node) - { - $path = $node->getPath(); - - if (null !== $this->key) { - throw new InvalidDefinitionException(sprintf('->useAttributeAsKey() is not applicable to concrete nodes at path "%s".', $path)); - } - - if (false === $this->allowEmptyValue) { - throw new InvalidDefinitionException(sprintf('->cannotBeEmpty() is not applicable to concrete nodes at path "%s".', $path)); - } - - if (true === $this->atLeastOne) { - throw new InvalidDefinitionException(sprintf('->requiresAtLeastOneElement() is not applicable to concrete nodes at path "%s".', $path)); - } - - if ($this->default) { - throw new InvalidDefinitionException(sprintf('->defaultValue() is not applicable to concrete nodes at path "%s".', $path)); - } - - if (false !== $this->addDefaultChildren) { - throw new InvalidDefinitionException(sprintf('->addDefaultChildrenIfNoneSet() is not applicable to concrete nodes at path "%s".', $path)); - } - } - - /** - * Validate the configuration of a prototype node. - * - * @throws InvalidDefinitionException - */ - protected function validatePrototypeNode(PrototypedArrayNode $node) - { - $path = $node->getPath(); - - if ($this->addDefaults) { - throw new InvalidDefinitionException(sprintf('->addDefaultsIfNotSet() is not applicable to prototype nodes at path "%s".', $path)); - } - - if (false !== $this->addDefaultChildren) { - if ($this->default) { - throw new InvalidDefinitionException(sprintf('A default value and default children might not be used together at path "%s".', $path)); - } - - if (null !== $this->key && (null === $this->addDefaultChildren || \is_int($this->addDefaultChildren) && $this->addDefaultChildren > 0)) { - throw new InvalidDefinitionException(sprintf('->addDefaultChildrenIfNoneSet() should set default children names as ->useAttributeAsKey() is used at path "%s".', $path)); - } - - if (null === $this->key && (\is_string($this->addDefaultChildren) || \is_array($this->addDefaultChildren))) { - throw new InvalidDefinitionException(sprintf('->addDefaultChildrenIfNoneSet() might not set default children names as ->useAttributeAsKey() is not used at path "%s".', $path)); - } - } - } - - /** - * @return NodeDefinition[] - */ - public function getChildNodeDefinitions() - { - return $this->children; - } - - /** - * Finds a node defined by the given $nodePath. - * - * @param string $nodePath The path of the node to find. e.g "doctrine.orm.mappings" - */ - public function find(string $nodePath): NodeDefinition - { - $firstPathSegment = (false === $pathSeparatorPos = strpos($nodePath, $this->pathSeparator)) - ? $nodePath - : substr($nodePath, 0, $pathSeparatorPos); - - if (null === $node = ($this->children[$firstPathSegment] ?? null)) { - throw new \RuntimeException(sprintf('Node with name "%s" does not exist in the current node "%s".', $firstPathSegment, $this->name)); - } - - if (false === $pathSeparatorPos) { - return $node; - } - - return $node->find(substr($nodePath, $pathSeparatorPos + \strlen($this->pathSeparator))); - } -} diff --git a/vendor/symfony/config/Definition/Builder/BooleanNodeDefinition.php b/vendor/symfony/config/Definition/Builder/BooleanNodeDefinition.php deleted file mode 100644 index d193242..0000000 --- a/vendor/symfony/config/Definition/Builder/BooleanNodeDefinition.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -use Symfony\Component\Config\Definition\BooleanNode; -use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException; - -/** - * This class provides a fluent interface for defining a node. - * - * @author Johannes M. Schmitt - */ -class BooleanNodeDefinition extends ScalarNodeDefinition -{ - /** - * {@inheritdoc} - */ - public function __construct(?string $name, NodeParentInterface $parent = null) - { - parent::__construct($name, $parent); - - $this->nullEquivalent = true; - } - - /** - * Instantiate a Node. - * - * @return BooleanNode The node - */ - protected function instantiateNode() - { - return new BooleanNode($this->name, $this->parent, $this->pathSeparator); - } - - /** - * {@inheritdoc} - * - * @throws InvalidDefinitionException - */ - public function cannotBeEmpty() - { - throw new InvalidDefinitionException('->cannotBeEmpty() is not applicable to BooleanNodeDefinition.'); - } -} diff --git a/vendor/symfony/config/Definition/Builder/BuilderAwareInterface.php b/vendor/symfony/config/Definition/Builder/BuilderAwareInterface.php deleted file mode 100644 index f30b873..0000000 --- a/vendor/symfony/config/Definition/Builder/BuilderAwareInterface.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -/** - * An interface that can be implemented by nodes which build other nodes. - * - * @author Roland Franssen - */ -interface BuilderAwareInterface -{ - /** - * Sets a custom children builder. - */ - public function setBuilder(NodeBuilder $builder); -} diff --git a/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php b/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php deleted file mode 100644 index 9a9c096..0000000 --- a/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -use Symfony\Component\Config\Definition\EnumNode; - -/** - * Enum Node Definition. - * - * @author Johannes M. Schmitt - */ -class EnumNodeDefinition extends ScalarNodeDefinition -{ - private $values; - - /** - * @return $this - */ - public function values(array $values) - { - $values = array_unique($values); - - if (empty($values)) { - throw new \InvalidArgumentException('->values() must be called with at least one value.'); - } - - $this->values = $values; - - return $this; - } - - /** - * Instantiate a Node. - * - * @return EnumNode The node - * - * @throws \RuntimeException - */ - protected function instantiateNode() - { - if (null === $this->values) { - throw new \RuntimeException('You must call ->values() on enum nodes.'); - } - - return new EnumNode($this->name, $this->parent, $this->values, $this->pathSeparator); - } -} diff --git a/vendor/symfony/config/Definition/Builder/ExprBuilder.php b/vendor/symfony/config/Definition/Builder/ExprBuilder.php deleted file mode 100644 index 0be19a2..0000000 --- a/vendor/symfony/config/Definition/Builder/ExprBuilder.php +++ /dev/null @@ -1,246 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -use Symfony\Component\Config\Definition\Exception\UnsetKeyException; - -/** - * This class builds an if expression. - * - * @author Johannes M. Schmitt - * @author Christophe Coevoet - */ -class ExprBuilder -{ - protected $node; - public $ifPart; - public $thenPart; - - public function __construct(NodeDefinition $node) - { - $this->node = $node; - } - - /** - * Marks the expression as being always used. - * - * @return $this - */ - public function always(\Closure $then = null) - { - $this->ifPart = function ($v) { return true; }; - - if (null !== $then) { - $this->thenPart = $then; - } - - return $this; - } - - /** - * Sets a closure to use as tests. - * - * The default one tests if the value is true. - * - * @return $this - */ - public function ifTrue(\Closure $closure = null) - { - if (null === $closure) { - $closure = function ($v) { return true === $v; }; - } - - $this->ifPart = $closure; - - return $this; - } - - /** - * Tests if the value is a string. - * - * @return $this - */ - public function ifString() - { - $this->ifPart = function ($v) { return \is_string($v); }; - - return $this; - } - - /** - * Tests if the value is null. - * - * @return $this - */ - public function ifNull() - { - $this->ifPart = function ($v) { return null === $v; }; - - return $this; - } - - /** - * Tests if the value is empty. - * - * @return ExprBuilder - */ - public function ifEmpty() - { - $this->ifPart = function ($v) { return empty($v); }; - - return $this; - } - - /** - * Tests if the value is an array. - * - * @return $this - */ - public function ifArray() - { - $this->ifPart = function ($v) { return \is_array($v); }; - - return $this; - } - - /** - * Tests if the value is in an array. - * - * @return $this - */ - public function ifInArray(array $array) - { - $this->ifPart = function ($v) use ($array) { return \in_array($v, $array, true); }; - - return $this; - } - - /** - * Tests if the value is not in an array. - * - * @return $this - */ - public function ifNotInArray(array $array) - { - $this->ifPart = function ($v) use ($array) { return !\in_array($v, $array, true); }; - - return $this; - } - - /** - * Transforms variables of any type into an array. - * - * @return $this - */ - public function castToArray() - { - $this->ifPart = function ($v) { return !\is_array($v); }; - $this->thenPart = function ($v) { return [$v]; }; - - return $this; - } - - /** - * Sets the closure to run if the test pass. - * - * @return $this - */ - public function then(\Closure $closure) - { - $this->thenPart = $closure; - - return $this; - } - - /** - * Sets a closure returning an empty array. - * - * @return $this - */ - public function thenEmptyArray() - { - $this->thenPart = function ($v) { return []; }; - - return $this; - } - - /** - * Sets a closure marking the value as invalid at processing time. - * - * if you want to add the value of the node in your message just use a %s placeholder. - * - * @return $this - * - * @throws \InvalidArgumentException - */ - public function thenInvalid(string $message) - { - $this->thenPart = function ($v) use ($message) { throw new \InvalidArgumentException(sprintf($message, json_encode($v))); }; - - return $this; - } - - /** - * Sets a closure unsetting this key of the array at processing time. - * - * @return $this - * - * @throws UnsetKeyException - */ - public function thenUnset() - { - $this->thenPart = function ($v) { throw new UnsetKeyException('Unsetting key.'); }; - - return $this; - } - - /** - * Returns the related node. - * - * @return NodeDefinition|ArrayNodeDefinition|VariableNodeDefinition - * - * @throws \RuntimeException - */ - public function end() - { - if (null === $this->ifPart) { - throw new \RuntimeException('You must specify an if part.'); - } - if (null === $this->thenPart) { - throw new \RuntimeException('You must specify a then part.'); - } - - return $this->node; - } - - /** - * Builds the expressions. - * - * @param ExprBuilder[] $expressions An array of ExprBuilder instances to build - * - * @return array - */ - public static function buildExpressions(array $expressions) - { - foreach ($expressions as $k => $expr) { - if ($expr instanceof self) { - $if = $expr->ifPart; - $then = $expr->thenPart; - $expressions[$k] = function ($v) use ($if, $then) { - return $if($v) ? $then($v) : $v; - }; - } - } - - return $expressions; - } -} diff --git a/vendor/symfony/config/Definition/Builder/FloatNodeDefinition.php b/vendor/symfony/config/Definition/Builder/FloatNodeDefinition.php deleted file mode 100644 index 7b74271..0000000 --- a/vendor/symfony/config/Definition/Builder/FloatNodeDefinition.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -use Symfony\Component\Config\Definition\FloatNode; - -/** - * This class provides a fluent interface for defining a float node. - * - * @author Jeanmonod David - */ -class FloatNodeDefinition extends NumericNodeDefinition -{ - /** - * Instantiates a Node. - * - * @return FloatNode The node - */ - protected function instantiateNode() - { - return new FloatNode($this->name, $this->parent, $this->min, $this->max, $this->pathSeparator); - } -} diff --git a/vendor/symfony/config/Definition/Builder/IntegerNodeDefinition.php b/vendor/symfony/config/Definition/Builder/IntegerNodeDefinition.php deleted file mode 100644 index 0472a98..0000000 --- a/vendor/symfony/config/Definition/Builder/IntegerNodeDefinition.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -use Symfony\Component\Config\Definition\IntegerNode; - -/** - * This class provides a fluent interface for defining an integer node. - * - * @author Jeanmonod David - */ -class IntegerNodeDefinition extends NumericNodeDefinition -{ - /** - * Instantiates a Node. - * - * @return IntegerNode The node - */ - protected function instantiateNode() - { - return new IntegerNode($this->name, $this->parent, $this->min, $this->max, $this->pathSeparator); - } -} diff --git a/vendor/symfony/config/Definition/Builder/MergeBuilder.php b/vendor/symfony/config/Definition/Builder/MergeBuilder.php deleted file mode 100644 index a88d49b..0000000 --- a/vendor/symfony/config/Definition/Builder/MergeBuilder.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -/** - * This class builds merge conditions. - * - * @author Johannes M. Schmitt - */ -class MergeBuilder -{ - protected $node; - public $allowFalse = false; - public $allowOverwrite = true; - - public function __construct(NodeDefinition $node) - { - $this->node = $node; - } - - /** - * Sets whether the node can be unset. - * - * @return $this - */ - public function allowUnset(bool $allow = true) - { - $this->allowFalse = $allow; - - return $this; - } - - /** - * Sets whether the node can be overwritten. - * - * @return $this - */ - public function denyOverwrite(bool $deny = true) - { - $this->allowOverwrite = !$deny; - - return $this; - } - - /** - * Returns the related node. - * - * @return NodeDefinition|ArrayNodeDefinition|VariableNodeDefinition - */ - public function end() - { - return $this->node; - } -} diff --git a/vendor/symfony/config/Definition/Builder/NodeBuilder.php b/vendor/symfony/config/Definition/Builder/NodeBuilder.php deleted file mode 100644 index bab439b..0000000 --- a/vendor/symfony/config/Definition/Builder/NodeBuilder.php +++ /dev/null @@ -1,219 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -/** - * This class provides a fluent interface for building a node. - * - * @author Johannes M. Schmitt - */ -class NodeBuilder implements NodeParentInterface -{ - protected $parent; - protected $nodeMapping; - - public function __construct() - { - $this->nodeMapping = [ - 'variable' => VariableNodeDefinition::class, - 'scalar' => ScalarNodeDefinition::class, - 'boolean' => BooleanNodeDefinition::class, - 'integer' => IntegerNodeDefinition::class, - 'float' => FloatNodeDefinition::class, - 'array' => ArrayNodeDefinition::class, - 'enum' => EnumNodeDefinition::class, - ]; - } - - /** - * Set the parent node. - * - * @return $this - */ - public function setParent(ParentNodeDefinitionInterface $parent = null) - { - $this->parent = $parent; - - return $this; - } - - /** - * Creates a child array node. - * - * @return ArrayNodeDefinition The child node - */ - public function arrayNode(string $name) - { - return $this->node($name, 'array'); - } - - /** - * Creates a child scalar node. - * - * @return ScalarNodeDefinition The child node - */ - public function scalarNode(string $name) - { - return $this->node($name, 'scalar'); - } - - /** - * Creates a child Boolean node. - * - * @return BooleanNodeDefinition The child node - */ - public function booleanNode(string $name) - { - return $this->node($name, 'boolean'); - } - - /** - * Creates a child integer node. - * - * @return IntegerNodeDefinition The child node - */ - public function integerNode(string $name) - { - return $this->node($name, 'integer'); - } - - /** - * Creates a child float node. - * - * @return FloatNodeDefinition The child node - */ - public function floatNode(string $name) - { - return $this->node($name, 'float'); - } - - /** - * Creates a child EnumNode. - * - * @return EnumNodeDefinition - */ - public function enumNode(string $name) - { - return $this->node($name, 'enum'); - } - - /** - * Creates a child variable node. - * - * @return VariableNodeDefinition The builder of the child node - */ - public function variableNode(string $name) - { - return $this->node($name, 'variable'); - } - - /** - * Returns the parent node. - * - * @return NodeDefinition&ParentNodeDefinitionInterface The parent node - */ - public function end() - { - return $this->parent; - } - - /** - * Creates a child node. - * - * @return NodeDefinition The child node - * - * @throws \RuntimeException When the node type is not registered - * @throws \RuntimeException When the node class is not found - */ - public function node(?string $name, string $type) - { - $class = $this->getNodeClass($type); - - $node = new $class($name); - - $this->append($node); - - return $node; - } - - /** - * Appends a node definition. - * - * Usage: - * - * $node = new ArrayNodeDefinition('name') - * ->children() - * ->scalarNode('foo')->end() - * ->scalarNode('baz')->end() - * ->append($this->getBarNodeDefinition()) - * ->end() - * ; - * - * @return $this - */ - public function append(NodeDefinition $node) - { - if ($node instanceof BuilderAwareInterface) { - $builder = clone $this; - $builder->setParent(null); - $node->setBuilder($builder); - } - - if (null !== $this->parent) { - $this->parent->append($node); - // Make this builder the node parent to allow for a fluid interface - $node->setParent($this); - } - - return $this; - } - - /** - * Adds or overrides a node Type. - * - * @param string $type The name of the type - * @param string $class The fully qualified name the node definition class - * - * @return $this - */ - public function setNodeClass(string $type, string $class) - { - $this->nodeMapping[strtolower($type)] = $class; - - return $this; - } - - /** - * Returns the class name of the node definition. - * - * @return string The node definition class name - * - * @throws \RuntimeException When the node type is not registered - * @throws \RuntimeException When the node class is not found - */ - protected function getNodeClass(string $type) - { - $type = strtolower($type); - - if (!isset($this->nodeMapping[$type])) { - throw new \RuntimeException(sprintf('The node type "%s" is not registered.', $type)); - } - - $class = $this->nodeMapping[$type]; - - if (!class_exists($class)) { - throw new \RuntimeException(sprintf('The node class "%s" does not exist.', $class)); - } - - return $class; - } -} diff --git a/vendor/symfony/config/Definition/Builder/NodeDefinition.php b/vendor/symfony/config/Definition/Builder/NodeDefinition.php deleted file mode 100644 index 2551abc..0000000 --- a/vendor/symfony/config/Definition/Builder/NodeDefinition.php +++ /dev/null @@ -1,383 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -use Symfony\Component\Config\Definition\BaseNode; -use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException; -use Symfony\Component\Config\Definition\NodeInterface; - -/** - * This class provides a fluent interface for defining a node. - * - * @author Johannes M. Schmitt - */ -abstract class NodeDefinition implements NodeParentInterface -{ - protected $name; - protected $normalization; - protected $validation; - protected $defaultValue; - protected $default = false; - protected $required = false; - protected $deprecation = []; - protected $merge; - protected $allowEmptyValue = true; - protected $nullEquivalent; - protected $trueEquivalent = true; - protected $falseEquivalent = false; - protected $pathSeparator = BaseNode::DEFAULT_PATH_SEPARATOR; - protected $parent; - protected $attributes = []; - - public function __construct(?string $name, NodeParentInterface $parent = null) - { - $this->parent = $parent; - $this->name = $name; - } - - /** - * Sets the parent node. - * - * @return $this - */ - public function setParent(NodeParentInterface $parent) - { - $this->parent = $parent; - - return $this; - } - - /** - * Sets info message. - * - * @return $this - */ - public function info(string $info) - { - return $this->attribute('info', $info); - } - - /** - * Sets example configuration. - * - * @param string|array $example - * - * @return $this - */ - public function example($example) - { - return $this->attribute('example', $example); - } - - /** - * Sets an attribute on the node. - * - * @param mixed $value - * - * @return $this - */ - public function attribute(string $key, $value) - { - $this->attributes[$key] = $value; - - return $this; - } - - /** - * Returns the parent node. - * - * @return NodeParentInterface|NodeBuilder|NodeDefinition|ArrayNodeDefinition|VariableNodeDefinition|null The builder of the parent node - */ - public function end() - { - return $this->parent; - } - - /** - * Creates the node. - * - * @param bool $forceRootNode Whether to force this node as the root node - * - * @return NodeInterface - */ - public function getNode(bool $forceRootNode = false) - { - if ($forceRootNode) { - $this->parent = null; - } - - if (null !== $this->normalization) { - $this->normalization->before = ExprBuilder::buildExpressions($this->normalization->before); - } - - if (null !== $this->validation) { - $this->validation->rules = ExprBuilder::buildExpressions($this->validation->rules); - } - - $node = $this->createNode(); - $node->setAttributes($this->attributes); - - return $node; - } - - /** - * Sets the default value. - * - * @param mixed $value The default value - * - * @return $this - */ - public function defaultValue($value) - { - $this->default = true; - $this->defaultValue = $value; - - return $this; - } - - /** - * Sets the node as required. - * - * @return $this - */ - public function isRequired() - { - $this->required = true; - - return $this; - } - - /** - * Sets the node as deprecated. - * - * @param string $package The name of the composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string $message The deprecation message to use - * - * You can use %node% and %path% placeholders in your message to display, - * respectively, the node name and its complete path. - * - * @return $this - */ - public function setDeprecated(/* string $package, string $version, string $message = 'The child node "%node%" at path "%path%" is deprecated.' */) - { - $args = \func_get_args(); - - if (\func_num_args() < 2) { - trigger_deprecation('symfony/config', '5.1', 'The signature of method "%s()" requires 3 arguments: "string $package, string $version, string $message", not defining them is deprecated.', __METHOD__); - - $message = $args[0] ?? 'The child node "%node%" at path "%path%" is deprecated.'; - $package = $version = ''; - } else { - $package = (string) $args[0]; - $version = (string) $args[1]; - $message = (string) ($args[2] ?? 'The child node "%node%" at path "%path%" is deprecated.'); - } - - $this->deprecation = [ - 'package' => $package, - 'version' => $version, - 'message' => $message, - ]; - - return $this; - } - - /** - * Sets the equivalent value used when the node contains null. - * - * @param mixed $value - * - * @return $this - */ - public function treatNullLike($value) - { - $this->nullEquivalent = $value; - - return $this; - } - - /** - * Sets the equivalent value used when the node contains true. - * - * @param mixed $value - * - * @return $this - */ - public function treatTrueLike($value) - { - $this->trueEquivalent = $value; - - return $this; - } - - /** - * Sets the equivalent value used when the node contains false. - * - * @param mixed $value - * - * @return $this - */ - public function treatFalseLike($value) - { - $this->falseEquivalent = $value; - - return $this; - } - - /** - * Sets null as the default value. - * - * @return $this - */ - public function defaultNull() - { - return $this->defaultValue(null); - } - - /** - * Sets true as the default value. - * - * @return $this - */ - public function defaultTrue() - { - return $this->defaultValue(true); - } - - /** - * Sets false as the default value. - * - * @return $this - */ - public function defaultFalse() - { - return $this->defaultValue(false); - } - - /** - * Sets an expression to run before the normalization. - * - * @return ExprBuilder - */ - public function beforeNormalization() - { - return $this->normalization()->before(); - } - - /** - * Denies the node value being empty. - * - * @return $this - */ - public function cannotBeEmpty() - { - $this->allowEmptyValue = false; - - return $this; - } - - /** - * Sets an expression to run for the validation. - * - * The expression receives the value of the node and must return it. It can - * modify it. - * An exception should be thrown when the node is not valid. - * - * @return ExprBuilder - */ - public function validate() - { - return $this->validation()->rule(); - } - - /** - * Sets whether the node can be overwritten. - * - * @return $this - */ - public function cannotBeOverwritten(bool $deny = true) - { - $this->merge()->denyOverwrite($deny); - - return $this; - } - - /** - * Gets the builder for validation rules. - * - * @return ValidationBuilder - */ - protected function validation() - { - if (null === $this->validation) { - $this->validation = new ValidationBuilder($this); - } - - return $this->validation; - } - - /** - * Gets the builder for merging rules. - * - * @return MergeBuilder - */ - protected function merge() - { - if (null === $this->merge) { - $this->merge = new MergeBuilder($this); - } - - return $this->merge; - } - - /** - * Gets the builder for normalization rules. - * - * @return NormalizationBuilder - */ - protected function normalization() - { - if (null === $this->normalization) { - $this->normalization = new NormalizationBuilder($this); - } - - return $this->normalization; - } - - /** - * Instantiate and configure the node according to this definition. - * - * @return NodeInterface The node instance - * - * @throws InvalidDefinitionException When the definition is invalid - */ - abstract protected function createNode(); - - /** - * Set PathSeparator to use. - * - * @return $this - */ - public function setPathSeparator(string $separator) - { - if ($this instanceof ParentNodeDefinitionInterface) { - foreach ($this->getChildNodeDefinitions() as $child) { - $child->setPathSeparator($separator); - } - } - - $this->pathSeparator = $separator; - - return $this; - } -} diff --git a/vendor/symfony/config/Definition/Builder/NodeParentInterface.php b/vendor/symfony/config/Definition/Builder/NodeParentInterface.php deleted file mode 100644 index 305e993..0000000 --- a/vendor/symfony/config/Definition/Builder/NodeParentInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -/** - * An interface that must be implemented by all node parents. - * - * @author Victor Berchet - */ -interface NodeParentInterface -{ -} diff --git a/vendor/symfony/config/Definition/Builder/NormalizationBuilder.php b/vendor/symfony/config/Definition/Builder/NormalizationBuilder.php deleted file mode 100644 index 06cbbd4..0000000 --- a/vendor/symfony/config/Definition/Builder/NormalizationBuilder.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -/** - * This class builds normalization conditions. - * - * @author Johannes M. Schmitt - */ -class NormalizationBuilder -{ - protected $node; - public $before = []; - public $remappings = []; - - public function __construct(NodeDefinition $node) - { - $this->node = $node; - } - - /** - * Registers a key to remap to its plural form. - * - * @param string $key The key to remap - * @param string|null $plural The plural of the key in case of irregular plural - * - * @return $this - */ - public function remap(string $key, string $plural = null) - { - $this->remappings[] = [$key, null === $plural ? $key.'s' : $plural]; - - return $this; - } - - /** - * Registers a closure to run before the normalization or an expression builder to build it if null is provided. - * - * @return ExprBuilder|$this - */ - public function before(\Closure $closure = null) - { - if (null !== $closure) { - $this->before[] = $closure; - - return $this; - } - - return $this->before[] = new ExprBuilder($this->node); - } -} diff --git a/vendor/symfony/config/Definition/Builder/NumericNodeDefinition.php b/vendor/symfony/config/Definition/Builder/NumericNodeDefinition.php deleted file mode 100644 index 390b113..0000000 --- a/vendor/symfony/config/Definition/Builder/NumericNodeDefinition.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException; - -/** - * Abstract class that contains common code of integer and float node definitions. - * - * @author David Jeanmonod - */ -abstract class NumericNodeDefinition extends ScalarNodeDefinition -{ - protected $min; - protected $max; - - /** - * Ensures that the value is smaller than the given reference. - * - * @param mixed $max - * - * @return $this - * - * @throws \InvalidArgumentException when the constraint is inconsistent - */ - public function max($max) - { - if (isset($this->min) && $this->min > $max) { - throw new \InvalidArgumentException(sprintf('You cannot define a max(%s) as you already have a min(%s).', $max, $this->min)); - } - $this->max = $max; - - return $this; - } - - /** - * Ensures that the value is bigger than the given reference. - * - * @param mixed $min - * - * @return $this - * - * @throws \InvalidArgumentException when the constraint is inconsistent - */ - public function min($min) - { - if (isset($this->max) && $this->max < $min) { - throw new \InvalidArgumentException(sprintf('You cannot define a min(%s) as you already have a max(%s).', $min, $this->max)); - } - $this->min = $min; - - return $this; - } - - /** - * {@inheritdoc} - * - * @throws InvalidDefinitionException - */ - public function cannotBeEmpty() - { - throw new InvalidDefinitionException('->cannotBeEmpty() is not applicable to NumericNodeDefinition.'); - } -} diff --git a/vendor/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php b/vendor/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php deleted file mode 100644 index 449b91a..0000000 --- a/vendor/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -/** - * An interface that must be implemented by nodes which can have children. - * - * @author Victor Berchet - */ -interface ParentNodeDefinitionInterface extends BuilderAwareInterface -{ - /** - * Returns a builder to add children nodes. - * - * @return NodeBuilder - */ - public function children(); - - /** - * Appends a node definition. - * - * Usage: - * - * $node = $parentNode - * ->children() - * ->scalarNode('foo')->end() - * ->scalarNode('baz')->end() - * ->append($this->getBarNodeDefinition()) - * ->end() - * ; - * - * @return $this - */ - public function append(NodeDefinition $node); - - /** - * Gets the child node definitions. - * - * @return NodeDefinition[] - */ - public function getChildNodeDefinitions(); -} diff --git a/vendor/symfony/config/Definition/Builder/ScalarNodeDefinition.php b/vendor/symfony/config/Definition/Builder/ScalarNodeDefinition.php deleted file mode 100644 index 428f612..0000000 --- a/vendor/symfony/config/Definition/Builder/ScalarNodeDefinition.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -use Symfony\Component\Config\Definition\ScalarNode; - -/** - * This class provides a fluent interface for defining a node. - * - * @author Johannes M. Schmitt - */ -class ScalarNodeDefinition extends VariableNodeDefinition -{ - /** - * Instantiate a Node. - * - * @return ScalarNode The node - */ - protected function instantiateNode() - { - return new ScalarNode($this->name, $this->parent, $this->pathSeparator); - } -} diff --git a/vendor/symfony/config/Definition/Builder/TreeBuilder.php b/vendor/symfony/config/Definition/Builder/TreeBuilder.php deleted file mode 100644 index 13a18db..0000000 --- a/vendor/symfony/config/Definition/Builder/TreeBuilder.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -use Symfony\Component\Config\Definition\NodeInterface; - -/** - * This is the entry class for building a config tree. - * - * @author Johannes M. Schmitt - */ -class TreeBuilder implements NodeParentInterface -{ - protected $tree; - protected $root; - - public function __construct(string $name, string $type = 'array', NodeBuilder $builder = null) - { - $builder = $builder ?: new NodeBuilder(); - $this->root = $builder->node($name, $type)->setParent($this); - } - - /** - * @return NodeDefinition|ArrayNodeDefinition The root node (as an ArrayNodeDefinition when the type is 'array') - */ - public function getRootNode(): NodeDefinition - { - return $this->root; - } - - /** - * Builds the tree. - * - * @return NodeInterface - * - * @throws \RuntimeException - */ - public function buildTree() - { - if (null !== $this->tree) { - return $this->tree; - } - - return $this->tree = $this->root->getNode(true); - } - - public function setPathSeparator(string $separator) - { - // unset last built as changing path separator changes all nodes - $this->tree = null; - - $this->root->setPathSeparator($separator); - } -} diff --git a/vendor/symfony/config/Definition/Builder/ValidationBuilder.php b/vendor/symfony/config/Definition/Builder/ValidationBuilder.php deleted file mode 100644 index 4efc726..0000000 --- a/vendor/symfony/config/Definition/Builder/ValidationBuilder.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -/** - * This class builds validation conditions. - * - * @author Christophe Coevoet - */ -class ValidationBuilder -{ - protected $node; - public $rules = []; - - public function __construct(NodeDefinition $node) - { - $this->node = $node; - } - - /** - * Registers a closure to run as normalization or an expression builder to build it if null is provided. - * - * @return ExprBuilder|$this - */ - public function rule(\Closure $closure = null) - { - if (null !== $closure) { - $this->rules[] = $closure; - - return $this; - } - - return $this->rules[] = new ExprBuilder($this->node); - } -} diff --git a/vendor/symfony/config/Definition/Builder/VariableNodeDefinition.php b/vendor/symfony/config/Definition/Builder/VariableNodeDefinition.php deleted file mode 100644 index 5f1254c..0000000 --- a/vendor/symfony/config/Definition/Builder/VariableNodeDefinition.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Builder; - -use Symfony\Component\Config\Definition\VariableNode; - -/** - * This class provides a fluent interface for defining a node. - * - * @author Johannes M. Schmitt - */ -class VariableNodeDefinition extends NodeDefinition -{ - /** - * Instantiate a Node. - * - * @return VariableNode The node - */ - protected function instantiateNode() - { - return new VariableNode($this->name, $this->parent, $this->pathSeparator); - } - - /** - * {@inheritdoc} - */ - protected function createNode() - { - $node = $this->instantiateNode(); - - if (null !== $this->normalization) { - $node->setNormalizationClosures($this->normalization->before); - } - - if (null !== $this->merge) { - $node->setAllowOverwrite($this->merge->allowOverwrite); - } - - if (true === $this->default) { - $node->setDefaultValue($this->defaultValue); - } - - $node->setAllowEmptyValue($this->allowEmptyValue); - $node->addEquivalentValue(null, $this->nullEquivalent); - $node->addEquivalentValue(true, $this->trueEquivalent); - $node->addEquivalentValue(false, $this->falseEquivalent); - $node->setRequired($this->required); - - if ($this->deprecation) { - $node->setDeprecated($this->deprecation['package'], $this->deprecation['version'], $this->deprecation['message']); - } - - if (null !== $this->validation) { - $node->setFinalValidationClosures($this->validation->rules); - } - - return $node; - } -} diff --git a/vendor/symfony/config/Definition/ConfigurationInterface.php b/vendor/symfony/config/Definition/ConfigurationInterface.php deleted file mode 100644 index d6456ed..0000000 --- a/vendor/symfony/config/Definition/ConfigurationInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -/** - * Configuration interface. - * - * @author Victor Berchet - */ -interface ConfigurationInterface -{ - /** - * Generates the configuration tree builder. - * - * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder - */ - public function getConfigTreeBuilder(); -} diff --git a/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php b/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php deleted file mode 100644 index b86f7e7..0000000 --- a/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php +++ /dev/null @@ -1,303 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Dumper; - -use Symfony\Component\Config\Definition\ArrayNode; -use Symfony\Component\Config\Definition\ConfigurationInterface; -use Symfony\Component\Config\Definition\EnumNode; -use Symfony\Component\Config\Definition\NodeInterface; -use Symfony\Component\Config\Definition\PrototypedArrayNode; - -/** - * Dumps a XML reference configuration for the given configuration/node instance. - * - * @author Wouter J - */ -class XmlReferenceDumper -{ - private $reference; - - public function dump(ConfigurationInterface $configuration, string $namespace = null) - { - return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree(), $namespace); - } - - public function dumpNode(NodeInterface $node, string $namespace = null) - { - $this->reference = ''; - $this->writeNode($node, 0, true, $namespace); - $ref = $this->reference; - $this->reference = null; - - return $ref; - } - - private function writeNode(NodeInterface $node, int $depth = 0, bool $root = false, string $namespace = null) - { - $rootName = ($root ? 'config' : $node->getName()); - $rootNamespace = ($namespace ?: ($root ? 'http://example.org/schema/dic/'.$node->getName() : null)); - - // xml remapping - if ($node->getParent()) { - $remapping = array_filter($node->getParent()->getXmlRemappings(), function ($mapping) use ($rootName) { - return $rootName === $mapping[1]; - }); - - if (\count($remapping)) { - list($singular) = current($remapping); - $rootName = $singular; - } - } - $rootName = str_replace('_', '-', $rootName); - - $rootAttributes = []; - $rootAttributeComments = []; - $rootChildren = []; - $rootComments = []; - - if ($node instanceof ArrayNode) { - $children = $node->getChildren(); - - // comments about the root node - if ($rootInfo = $node->getInfo()) { - $rootComments[] = $rootInfo; - } - - if ($rootNamespace) { - $rootComments[] = 'Namespace: '.$rootNamespace; - } - - // render prototyped nodes - if ($node instanceof PrototypedArrayNode) { - $prototype = $node->getPrototype(); - - $info = 'prototype'; - if (null !== $prototype->getInfo()) { - $info .= ': '.$prototype->getInfo(); - } - array_unshift($rootComments, $info); - - if ($key = $node->getKeyAttribute()) { - $rootAttributes[$key] = str_replace('-', ' ', $rootName).' '.$key; - } - - if ($prototype instanceof PrototypedArrayNode) { - $prototype->setName($key ?? ''); - $children = [$key => $prototype]; - } elseif ($prototype instanceof ArrayNode) { - $children = $prototype->getChildren(); - } else { - if ($prototype->hasDefaultValue()) { - $prototypeValue = $prototype->getDefaultValue(); - } else { - switch (\get_class($prototype)) { - case 'Symfony\Component\Config\Definition\ScalarNode': - $prototypeValue = 'scalar value'; - break; - - case 'Symfony\Component\Config\Definition\FloatNode': - case 'Symfony\Component\Config\Definition\IntegerNode': - $prototypeValue = 'numeric value'; - break; - - case 'Symfony\Component\Config\Definition\BooleanNode': - $prototypeValue = 'true|false'; - break; - - case 'Symfony\Component\Config\Definition\EnumNode': - $prototypeValue = implode('|', array_map('json_encode', $prototype->getValues())); - break; - - default: - $prototypeValue = 'value'; - } - } - } - } - - // get attributes and elements - foreach ($children as $child) { - if (!$child instanceof ArrayNode) { - // get attributes - - // metadata - $name = str_replace('_', '-', $child->getName()); - $value = '%%%%not_defined%%%%'; // use a string which isn't used in the normal world - - // comments - $comments = []; - if ($info = $child->getInfo()) { - $comments[] = $info; - } - - if ($example = $child->getExample()) { - $comments[] = 'Example: '.$example; - } - - if ($child->isRequired()) { - $comments[] = 'Required'; - } - - if ($child->isDeprecated()) { - $deprecation = $child->getDeprecation($child->getName(), $node->getPath()); - $comments[] = sprintf('Deprecated (%s)', ($deprecation['package'] || $deprecation['version'] ? "Since {$deprecation['package']} {$deprecation['version']}: " : '').$deprecation['message']); - } - - if ($child instanceof EnumNode) { - $comments[] = 'One of '.implode('; ', array_map('json_encode', $child->getValues())); - } - - if (\count($comments)) { - $rootAttributeComments[$name] = implode(";\n", $comments); - } - - // default values - if ($child->hasDefaultValue()) { - $value = $child->getDefaultValue(); - } - - // append attribute - $rootAttributes[$name] = $value; - } else { - // get elements - $rootChildren[] = $child; - } - } - } - - // render comments - - // root node comment - if (\count($rootComments)) { - foreach ($rootComments as $comment) { - $this->writeLine('', $depth); - } - } - - // attribute comments - if (\count($rootAttributeComments)) { - foreach ($rootAttributeComments as $attrName => $comment) { - $commentDepth = $depth + 4 + \strlen($attrName) + 2; - $commentLines = explode("\n", $comment); - $multiline = (\count($commentLines) > 1); - $comment = implode(PHP_EOL.str_repeat(' ', $commentDepth), $commentLines); - - if ($multiline) { - $this->writeLine('', $depth); - } else { - $this->writeLine('', $depth); - } - } - } - - // render start tag + attributes - $rootIsVariablePrototype = isset($prototypeValue); - $rootIsEmptyTag = (0 === \count($rootChildren) && !$rootIsVariablePrototype); - $rootOpenTag = '<'.$rootName; - if (1 >= ($attributesCount = \count($rootAttributes))) { - if (1 === $attributesCount) { - $rootOpenTag .= sprintf(' %s="%s"', current(array_keys($rootAttributes)), $this->writeValue(current($rootAttributes))); - } - - $rootOpenTag .= $rootIsEmptyTag ? ' />' : '>'; - - if ($rootIsVariablePrototype) { - $rootOpenTag .= $prototypeValue.''; - } - - $this->writeLine($rootOpenTag, $depth); - } else { - $this->writeLine($rootOpenTag, $depth); - - $i = 1; - - foreach ($rootAttributes as $attrName => $attrValue) { - $attr = sprintf('%s="%s"', $attrName, $this->writeValue($attrValue)); - - $this->writeLine($attr, $depth + 4); - - if ($attributesCount === $i++) { - $this->writeLine($rootIsEmptyTag ? '/>' : '>', $depth); - - if ($rootIsVariablePrototype) { - $rootOpenTag .= $prototypeValue.''; - } - } - } - } - - // render children tags - foreach ($rootChildren as $child) { - $this->writeLine(''); - $this->writeNode($child, $depth + 4); - } - - // render end tag - if (!$rootIsEmptyTag && !$rootIsVariablePrototype) { - $this->writeLine(''); - - $rootEndTag = ''; - $this->writeLine($rootEndTag, $depth); - } - } - - /** - * Outputs a single config reference line. - */ - private function writeLine(string $text, int $indent = 0) - { - $indent = \strlen($text) + $indent; - $format = '%'.$indent.'s'; - - $this->reference .= sprintf($format, $text).PHP_EOL; - } - - /** - * Renders the string conversion of the value. - * - * @param mixed $value - */ - private function writeValue($value): string - { - if ('%%%%not_defined%%%%' === $value) { - return ''; - } - - if (\is_string($value) || is_numeric($value)) { - return $value; - } - - if (false === $value) { - return 'false'; - } - - if (true === $value) { - return 'true'; - } - - if (null === $value) { - return 'null'; - } - - if (empty($value)) { - return ''; - } - - if (\is_array($value)) { - return implode(',', $value); - } - - return ''; - } -} diff --git a/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php b/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php deleted file mode 100644 index 70f740e..0000000 --- a/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php +++ /dev/null @@ -1,243 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Dumper; - -use Symfony\Component\Config\Definition\ArrayNode; -use Symfony\Component\Config\Definition\ConfigurationInterface; -use Symfony\Component\Config\Definition\EnumNode; -use Symfony\Component\Config\Definition\NodeInterface; -use Symfony\Component\Config\Definition\PrototypedArrayNode; -use Symfony\Component\Config\Definition\ScalarNode; -use Symfony\Component\Yaml\Inline; - -/** - * Dumps a Yaml reference configuration for the given configuration/node instance. - * - * @author Kevin Bond - */ -class YamlReferenceDumper -{ - private $reference; - - public function dump(ConfigurationInterface $configuration) - { - return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree()); - } - - public function dumpAtPath(ConfigurationInterface $configuration, string $path) - { - $rootNode = $node = $configuration->getConfigTreeBuilder()->buildTree(); - - foreach (explode('.', $path) as $step) { - if (!$node instanceof ArrayNode) { - throw new \UnexpectedValueException(sprintf('Unable to find node at path "%s.%s".', $rootNode->getName(), $path)); - } - - /** @var NodeInterface[] $children */ - $children = $node instanceof PrototypedArrayNode ? $this->getPrototypeChildren($node) : $node->getChildren(); - - foreach ($children as $child) { - if ($child->getName() === $step) { - $node = $child; - - continue 2; - } - } - - throw new \UnexpectedValueException(sprintf('Unable to find node at path "%s.%s".', $rootNode->getName(), $path)); - } - - return $this->dumpNode($node); - } - - public function dumpNode(NodeInterface $node) - { - $this->reference = ''; - $this->writeNode($node); - $ref = $this->reference; - $this->reference = null; - - return $ref; - } - - private function writeNode(NodeInterface $node, NodeInterface $parentNode = null, int $depth = 0, bool $prototypedArray = false) - { - $comments = []; - $default = ''; - $defaultArray = null; - $children = null; - $example = $node->getExample(); - - // defaults - if ($node instanceof ArrayNode) { - $children = $node->getChildren(); - - if ($node instanceof PrototypedArrayNode) { - $children = $this->getPrototypeChildren($node); - } - - if (!$children) { - if ($node->hasDefaultValue() && \count($defaultArray = $node->getDefaultValue())) { - $default = ''; - } elseif (!\is_array($example)) { - $default = '[]'; - } - } - } elseif ($node instanceof EnumNode) { - $comments[] = 'One of '.implode('; ', array_map('json_encode', $node->getValues())); - $default = $node->hasDefaultValue() ? Inline::dump($node->getDefaultValue()) : '~'; - } else { - $default = '~'; - - if ($node->hasDefaultValue()) { - $default = $node->getDefaultValue(); - - if (\is_array($default)) { - if (\count($defaultArray = $node->getDefaultValue())) { - $default = ''; - } elseif (!\is_array($example)) { - $default = '[]'; - } - } else { - $default = Inline::dump($default); - } - } - } - - // required? - if ($node->isRequired()) { - $comments[] = 'Required'; - } - - // deprecated? - if ($node->isDeprecated()) { - $deprecation = $node->getDeprecation($node->getName(), $parentNode ? $parentNode->getPath() : $node->getPath()); - $comments[] = sprintf('Deprecated (%s)', ($deprecation['package'] || $deprecation['version'] ? "Since {$deprecation['package']} {$deprecation['version']}: " : '').$deprecation['message']); - } - - // example - if ($example && !\is_array($example)) { - $comments[] = 'Example: '.$example; - } - - $default = '' != (string) $default ? ' '.$default : ''; - $comments = \count($comments) ? '# '.implode(', ', $comments) : ''; - - $key = $prototypedArray ? '-' : $node->getName().':'; - $text = rtrim(sprintf('%-21s%s %s', $key, $default, $comments), ' '); - - if ($info = $node->getInfo()) { - $this->writeLine(''); - // indenting multi-line info - $info = str_replace("\n", sprintf("\n%".($depth * 4).'s# ', ' '), $info); - $this->writeLine('# '.$info, $depth * 4); - } - - $this->writeLine($text, $depth * 4); - - // output defaults - if ($defaultArray) { - $this->writeLine(''); - - $message = \count($defaultArray) > 1 ? 'Defaults' : 'Default'; - - $this->writeLine('# '.$message.':', $depth * 4 + 4); - - $this->writeArray($defaultArray, $depth + 1); - } - - if (\is_array($example)) { - $this->writeLine(''); - - $message = \count($example) > 1 ? 'Examples' : 'Example'; - - $this->writeLine('# '.$message.':', $depth * 4 + 4); - - $this->writeArray($example, $depth + 1); - } - - if ($children) { - foreach ($children as $childNode) { - $this->writeNode($childNode, $node, $depth + 1, $node instanceof PrototypedArrayNode && !$node->getKeyAttribute()); - } - } - } - - /** - * Outputs a single config reference line. - */ - private function writeLine(string $text, int $indent = 0) - { - $indent = \strlen($text) + $indent; - $format = '%'.$indent.'s'; - - $this->reference .= sprintf($format, $text)."\n"; - } - - private function writeArray(array $array, int $depth) - { - $isIndexed = array_values($array) === $array; - - foreach ($array as $key => $value) { - if (\is_array($value)) { - $val = ''; - } else { - $val = $value; - } - - if ($isIndexed) { - $this->writeLine('- '.$val, $depth * 4); - } else { - $this->writeLine(sprintf('%-20s %s', $key.':', $val), $depth * 4); - } - - if (\is_array($value)) { - $this->writeArray($value, $depth + 1); - } - } - } - - private function getPrototypeChildren(PrototypedArrayNode $node): array - { - $prototype = $node->getPrototype(); - $key = $node->getKeyAttribute(); - - // Do not expand prototype if it isn't an array node nor uses attribute as key - if (!$key && !$prototype instanceof ArrayNode) { - return $node->getChildren(); - } - - if ($prototype instanceof ArrayNode) { - $keyNode = new ArrayNode($key, $node); - $children = $prototype->getChildren(); - - if ($prototype instanceof PrototypedArrayNode && $prototype->getKeyAttribute()) { - $children = $this->getPrototypeChildren($prototype); - } - - // add children - foreach ($children as $childNode) { - $keyNode->addChild($childNode); - } - } else { - $keyNode = new ScalarNode($key, $node); - } - - $info = 'Prototype'; - if (null !== $prototype->getInfo()) { - $info .= ': '.$prototype->getInfo(); - } - $keyNode->setInfo($info); - - return [$key => $keyNode]; - } -} diff --git a/vendor/symfony/config/Definition/EnumNode.php b/vendor/symfony/config/Definition/EnumNode.php deleted file mode 100644 index 23fc508..0000000 --- a/vendor/symfony/config/Definition/EnumNode.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; - -/** - * Node which only allows a finite set of values. - * - * @author Johannes M. Schmitt - */ -class EnumNode extends ScalarNode -{ - private $values; - - public function __construct(?string $name, NodeInterface $parent = null, array $values = [], string $pathSeparator = BaseNode::DEFAULT_PATH_SEPARATOR) - { - $values = array_unique($values); - if (empty($values)) { - throw new \InvalidArgumentException('$values must contain at least one element.'); - } - - parent::__construct($name, $parent, $pathSeparator); - $this->values = $values; - } - - public function getValues() - { - return $this->values; - } - - protected function finalizeValue($value) - { - $value = parent::finalizeValue($value); - - if (!\in_array($value, $this->values, true)) { - $ex = new InvalidConfigurationException(sprintf('The value %s is not allowed for path "%s". Permissible values: %s', json_encode($value), $this->getPath(), implode(', ', array_map('json_encode', $this->values)))); - $ex->setPath($this->getPath()); - - throw $ex; - } - - return $value; - } - - /** - * {@inheritdoc} - */ - protected function allowPlaceholders(): bool - { - return false; - } -} diff --git a/vendor/symfony/config/Definition/Exception/DuplicateKeyException.php b/vendor/symfony/config/Definition/Exception/DuplicateKeyException.php deleted file mode 100644 index 48dd932..0000000 --- a/vendor/symfony/config/Definition/Exception/DuplicateKeyException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Exception; - -/** - * This exception is thrown whenever the key of an array is not unique. This can - * only be the case if the configuration is coming from an XML file. - * - * @author Johannes M. Schmitt - */ -class DuplicateKeyException extends InvalidConfigurationException -{ -} diff --git a/vendor/symfony/config/Definition/Exception/Exception.php b/vendor/symfony/config/Definition/Exception/Exception.php deleted file mode 100644 index 8933a49..0000000 --- a/vendor/symfony/config/Definition/Exception/Exception.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Exception; - -/** - * Base exception for all configuration exceptions. - * - * @author Johannes M. Schmitt - */ -class Exception extends \RuntimeException -{ -} diff --git a/vendor/symfony/config/Definition/Exception/ForbiddenOverwriteException.php b/vendor/symfony/config/Definition/Exception/ForbiddenOverwriteException.php deleted file mode 100644 index 726c07f..0000000 --- a/vendor/symfony/config/Definition/Exception/ForbiddenOverwriteException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Exception; - -/** - * This exception is thrown when a configuration path is overwritten from a - * subsequent configuration file, but the entry node specifically forbids this. - * - * @author Johannes M. Schmitt - */ -class ForbiddenOverwriteException extends InvalidConfigurationException -{ -} diff --git a/vendor/symfony/config/Definition/Exception/InvalidConfigurationException.php b/vendor/symfony/config/Definition/Exception/InvalidConfigurationException.php deleted file mode 100644 index fcaaf49..0000000 --- a/vendor/symfony/config/Definition/Exception/InvalidConfigurationException.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Exception; - -/** - * A very general exception which can be thrown whenever non of the more specific - * exceptions is suitable. - * - * @author Johannes M. Schmitt - */ -class InvalidConfigurationException extends Exception -{ - private $path; - private $containsHints = false; - - public function setPath($path) - { - $this->path = $path; - } - - public function getPath() - { - return $this->path; - } - - /** - * Adds extra information that is suffixed to the original exception message. - */ - public function addHint(string $hint) - { - if (!$this->containsHints) { - $this->message .= "\nHint: ".$hint; - $this->containsHints = true; - } else { - $this->message .= ', '.$hint; - } - } -} diff --git a/vendor/symfony/config/Definition/Exception/InvalidDefinitionException.php b/vendor/symfony/config/Definition/Exception/InvalidDefinitionException.php deleted file mode 100644 index 98310da..0000000 --- a/vendor/symfony/config/Definition/Exception/InvalidDefinitionException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Exception; - -/** - * Thrown when an error is detected in a node Definition. - * - * @author Victor Berchet - */ -class InvalidDefinitionException extends Exception -{ -} diff --git a/vendor/symfony/config/Definition/Exception/InvalidTypeException.php b/vendor/symfony/config/Definition/Exception/InvalidTypeException.php deleted file mode 100644 index d7ca8c9..0000000 --- a/vendor/symfony/config/Definition/Exception/InvalidTypeException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Exception; - -/** - * This exception is thrown if an invalid type is encountered. - * - * @author Johannes M. Schmitt - */ -class InvalidTypeException extends InvalidConfigurationException -{ -} diff --git a/vendor/symfony/config/Definition/Exception/UnsetKeyException.php b/vendor/symfony/config/Definition/Exception/UnsetKeyException.php deleted file mode 100644 index 863181a..0000000 --- a/vendor/symfony/config/Definition/Exception/UnsetKeyException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition\Exception; - -/** - * This exception is usually not encountered by the end-user, but only used - * internally to signal the parent scope to unset a key. - * - * @author Johannes M. Schmitt - */ -class UnsetKeyException extends Exception -{ -} diff --git a/vendor/symfony/config/Definition/FloatNode.php b/vendor/symfony/config/Definition/FloatNode.php deleted file mode 100644 index 527f996..0000000 --- a/vendor/symfony/config/Definition/FloatNode.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -use Symfony\Component\Config\Definition\Exception\InvalidTypeException; - -/** - * This node represents a float value in the config tree. - * - * @author Jeanmonod David - */ -class FloatNode extends NumericNode -{ - /** - * {@inheritdoc} - */ - protected function validateType($value) - { - // Integers are also accepted, we just cast them - if (\is_int($value)) { - $value = (float) $value; - } - - if (!\is_float($value)) { - $ex = new InvalidTypeException(sprintf('Invalid type for path "%s". Expected "float", but got "%s".', $this->getPath(), get_debug_type($value))); - if ($hint = $this->getInfo()) { - $ex->addHint($hint); - } - $ex->setPath($this->getPath()); - - throw $ex; - } - } - - /** - * {@inheritdoc} - */ - protected function getValidPlaceholderTypes(): array - { - return ['float']; - } -} diff --git a/vendor/symfony/config/Definition/IntegerNode.php b/vendor/symfony/config/Definition/IntegerNode.php deleted file mode 100644 index dfb4cc6..0000000 --- a/vendor/symfony/config/Definition/IntegerNode.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -use Symfony\Component\Config\Definition\Exception\InvalidTypeException; - -/** - * This node represents an integer value in the config tree. - * - * @author Jeanmonod David - */ -class IntegerNode extends NumericNode -{ - /** - * {@inheritdoc} - */ - protected function validateType($value) - { - if (!\is_int($value)) { - $ex = new InvalidTypeException(sprintf('Invalid type for path "%s". Expected "int", but got "%s".', $this->getPath(), get_debug_type($value))); - if ($hint = $this->getInfo()) { - $ex->addHint($hint); - } - $ex->setPath($this->getPath()); - - throw $ex; - } - } - - /** - * {@inheritdoc} - */ - protected function getValidPlaceholderTypes(): array - { - return ['int']; - } -} diff --git a/vendor/symfony/config/Definition/NodeInterface.php b/vendor/symfony/config/Definition/NodeInterface.php deleted file mode 100644 index 45f1f68..0000000 --- a/vendor/symfony/config/Definition/NodeInterface.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -use Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException; -use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; -use Symfony\Component\Config\Definition\Exception\InvalidTypeException; - -/** - * Common Interface among all nodes. - * - * In most cases, it is better to inherit from BaseNode instead of implementing - * this interface yourself. - * - * @author Johannes M. Schmitt - */ -interface NodeInterface -{ - /** - * Returns the name of the node. - * - * @return string The name of the node - */ - public function getName(); - - /** - * Returns the path of the node. - * - * @return string The node path - */ - public function getPath(); - - /** - * Returns true when the node is required. - * - * @return bool If the node is required - */ - public function isRequired(); - - /** - * Returns true when the node has a default value. - * - * @return bool If the node has a default value - */ - public function hasDefaultValue(); - - /** - * Returns the default value of the node. - * - * @return mixed The default value - * - * @throws \RuntimeException if the node has no default value - */ - public function getDefaultValue(); - - /** - * Normalizes a value. - * - * @param mixed $value The value to normalize - * - * @return mixed The normalized value - * - * @throws InvalidTypeException if the value type is invalid - */ - public function normalize($value); - - /** - * Merges two values together. - * - * @param mixed $leftSide - * @param mixed $rightSide - * - * @return mixed The merged value - * - * @throws ForbiddenOverwriteException if the configuration path cannot be overwritten - * @throws InvalidTypeException if the value type is invalid - */ - public function merge($leftSide, $rightSide); - - /** - * Finalizes a value. - * - * @param mixed $value The value to finalize - * - * @return mixed The finalized value - * - * @throws InvalidTypeException if the value type is invalid - * @throws InvalidConfigurationException if the value is invalid configuration - */ - public function finalize($value); -} diff --git a/vendor/symfony/config/Definition/NumericNode.php b/vendor/symfony/config/Definition/NumericNode.php deleted file mode 100644 index 19c96e8..0000000 --- a/vendor/symfony/config/Definition/NumericNode.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; - -/** - * This node represents a numeric value in the config tree. - * - * @author David Jeanmonod - */ -class NumericNode extends ScalarNode -{ - protected $min; - protected $max; - - public function __construct(?string $name, NodeInterface $parent = null, $min = null, $max = null, string $pathSeparator = BaseNode::DEFAULT_PATH_SEPARATOR) - { - parent::__construct($name, $parent, $pathSeparator); - $this->min = $min; - $this->max = $max; - } - - /** - * {@inheritdoc} - */ - protected function finalizeValue($value) - { - $value = parent::finalizeValue($value); - - $errorMsg = null; - if (isset($this->min) && $value < $this->min) { - $errorMsg = sprintf('The value %s is too small for path "%s". Should be greater than or equal to %s', $value, $this->getPath(), $this->min); - } - if (isset($this->max) && $value > $this->max) { - $errorMsg = sprintf('The value %s is too big for path "%s". Should be less than or equal to %s', $value, $this->getPath(), $this->max); - } - if (isset($errorMsg)) { - $ex = new InvalidConfigurationException($errorMsg); - $ex->setPath($this->getPath()); - throw $ex; - } - - return $value; - } - - /** - * {@inheritdoc} - */ - protected function isValueEmpty($value) - { - // a numeric value cannot be empty - return false; - } -} diff --git a/vendor/symfony/config/Definition/Processor.php b/vendor/symfony/config/Definition/Processor.php deleted file mode 100644 index 76f4700..0000000 --- a/vendor/symfony/config/Definition/Processor.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -/** - * This class is the entry point for config normalization/merging/finalization. - * - * @author Johannes M. Schmitt - * - * @final - */ -class Processor -{ - /** - * Processes an array of configurations. - * - * @param array $configs An array of configuration items to process - * - * @return array The processed configuration - */ - public function process(NodeInterface $configTree, array $configs): array - { - $currentConfig = []; - foreach ($configs as $config) { - $config = $configTree->normalize($config); - $currentConfig = $configTree->merge($currentConfig, $config); - } - - return $configTree->finalize($currentConfig); - } - - /** - * Processes an array of configurations. - * - * @param array $configs An array of configuration items to process - * - * @return array The processed configuration - */ - public function processConfiguration(ConfigurationInterface $configuration, array $configs): array - { - return $this->process($configuration->getConfigTreeBuilder()->buildTree(), $configs); - } - - /** - * Normalizes a configuration entry. - * - * This method returns a normalize configuration array for a given key - * to remove the differences due to the original format (YAML and XML mainly). - * - * Here is an example. - * - * The configuration in XML: - * - * twig.extension.foo - * twig.extension.bar - * - * And the same configuration in YAML: - * - * extensions: ['twig.extension.foo', 'twig.extension.bar'] - * - * @param array $config A config array - * @param string $key The key to normalize - * @param string $plural The plural form of the key if it is irregular - */ - public static function normalizeConfig(array $config, string $key, string $plural = null): array - { - if (null === $plural) { - $plural = $key.'s'; - } - - if (isset($config[$plural])) { - return $config[$plural]; - } - - if (isset($config[$key])) { - if (\is_string($config[$key]) || !\is_int(key($config[$key]))) { - // only one - return [$config[$key]]; - } - - return $config[$key]; - } - - return []; - } -} diff --git a/vendor/symfony/config/Definition/PrototypeNodeInterface.php b/vendor/symfony/config/Definition/PrototypeNodeInterface.php deleted file mode 100644 index b160aa9..0000000 --- a/vendor/symfony/config/Definition/PrototypeNodeInterface.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -/** - * This interface must be implemented by nodes which can be used as prototypes. - * - * @author Johannes M. Schmitt - */ -interface PrototypeNodeInterface extends NodeInterface -{ - /** - * Sets the name of the node. - */ - public function setName(string $name); -} diff --git a/vendor/symfony/config/Definition/PrototypedArrayNode.php b/vendor/symfony/config/Definition/PrototypedArrayNode.php deleted file mode 100644 index 8e18d07..0000000 --- a/vendor/symfony/config/Definition/PrototypedArrayNode.php +++ /dev/null @@ -1,365 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -use Symfony\Component\Config\Definition\Exception\DuplicateKeyException; -use Symfony\Component\Config\Definition\Exception\Exception; -use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; -use Symfony\Component\Config\Definition\Exception\UnsetKeyException; - -/** - * Represents a prototyped Array node in the config tree. - * - * @author Johannes M. Schmitt - */ -class PrototypedArrayNode extends ArrayNode -{ - protected $prototype; - protected $keyAttribute; - protected $removeKeyAttribute = false; - protected $minNumberOfElements = 0; - protected $defaultValue = []; - protected $defaultChildren; - /** - * @var NodeInterface[] An array of the prototypes of the simplified value children - */ - private $valuePrototypes = []; - - /** - * Sets the minimum number of elements that a prototype based node must - * contain. By default this is zero, meaning no elements. - */ - public function setMinNumberOfElements(int $number) - { - $this->minNumberOfElements = $number; - } - - /** - * Sets the attribute which value is to be used as key. - * - * This is useful when you have an indexed array that should be an - * associative array. You can select an item from within the array - * to be the key of the particular item. For example, if "id" is the - * "key", then: - * - * [ - * ['id' => 'my_name', 'foo' => 'bar'], - * ]; - * - * becomes - * - * [ - * 'my_name' => ['foo' => 'bar'], - * ]; - * - * If you'd like "'id' => 'my_name'" to still be present in the resulting - * array, then you can set the second argument of this method to false. - * - * @param string $attribute The name of the attribute which value is to be used as a key - * @param bool $remove Whether or not to remove the key - */ - public function setKeyAttribute(string $attribute, bool $remove = true) - { - $this->keyAttribute = $attribute; - $this->removeKeyAttribute = $remove; - } - - /** - * Retrieves the name of the attribute which value should be used as key. - * - * @return string|null The name of the attribute - */ - public function getKeyAttribute() - { - return $this->keyAttribute; - } - - /** - * Sets the default value of this node. - */ - public function setDefaultValue(array $value) - { - $this->defaultValue = $value; - } - - /** - * {@inheritdoc} - */ - public function hasDefaultValue() - { - return true; - } - - /** - * Adds default children when none are set. - * - * @param int|string|array|null $children The number of children|The child name|The children names to be added - */ - public function setAddChildrenIfNoneSet($children = ['defaults']) - { - if (null === $children) { - $this->defaultChildren = ['defaults']; - } else { - $this->defaultChildren = \is_int($children) && $children > 0 ? range(1, $children) : (array) $children; - } - } - - /** - * {@inheritdoc} - * - * The default value could be either explicited or derived from the prototype - * default value. - */ - public function getDefaultValue() - { - if (null !== $this->defaultChildren) { - $default = $this->prototype->hasDefaultValue() ? $this->prototype->getDefaultValue() : []; - $defaults = []; - foreach (array_values($this->defaultChildren) as $i => $name) { - $defaults[null === $this->keyAttribute ? $i : $name] = $default; - } - - return $defaults; - } - - return $this->defaultValue; - } - - /** - * Sets the node prototype. - */ - public function setPrototype(PrototypeNodeInterface $node) - { - $this->prototype = $node; - } - - /** - * Retrieves the prototype. - * - * @return PrototypeNodeInterface The prototype - */ - public function getPrototype() - { - return $this->prototype; - } - - /** - * Disable adding concrete children for prototyped nodes. - * - * @throws Exception - */ - public function addChild(NodeInterface $node) - { - throw new Exception('A prototyped array node can not have concrete children.'); - } - - /** - * Finalizes the value of this node. - * - * @param mixed $value - * - * @return mixed The finalized value - * - * @throws UnsetKeyException - * @throws InvalidConfigurationException if the node doesn't have enough children - */ - protected function finalizeValue($value) - { - if (false === $value) { - throw new UnsetKeyException(sprintf('Unsetting key for path "%s", value: %s.', $this->getPath(), json_encode($value))); - } - - foreach ($value as $k => $v) { - $prototype = $this->getPrototypeForChild($k); - try { - $value[$k] = $prototype->finalize($v); - } catch (UnsetKeyException $e) { - unset($value[$k]); - } - } - - if (\count($value) < $this->minNumberOfElements) { - $ex = new InvalidConfigurationException(sprintf('The path "%s" should have at least %d element(s) defined.', $this->getPath(), $this->minNumberOfElements)); - $ex->setPath($this->getPath()); - - throw $ex; - } - - return $value; - } - - /** - * Normalizes the value. - * - * @param mixed $value The value to normalize - * - * @return mixed The normalized value - * - * @throws InvalidConfigurationException - * @throws DuplicateKeyException - */ - protected function normalizeValue($value) - { - if (false === $value) { - return $value; - } - - $value = $this->remapXml($value); - - $isAssoc = array_keys($value) !== range(0, \count($value) - 1); - $normalized = []; - foreach ($value as $k => $v) { - if (null !== $this->keyAttribute && \is_array($v)) { - if (!isset($v[$this->keyAttribute]) && \is_int($k) && !$isAssoc) { - $ex = new InvalidConfigurationException(sprintf('The attribute "%s" must be set for path "%s".', $this->keyAttribute, $this->getPath())); - $ex->setPath($this->getPath()); - - throw $ex; - } elseif (isset($v[$this->keyAttribute])) { - $k = $v[$this->keyAttribute]; - - // remove the key attribute when required - if ($this->removeKeyAttribute) { - unset($v[$this->keyAttribute]); - } - - // if only "value" is left - if (array_keys($v) === ['value']) { - $v = $v['value']; - if ($this->prototype instanceof ArrayNode && ($children = $this->prototype->getChildren()) && \array_key_exists('value', $children)) { - $valuePrototype = current($this->valuePrototypes) ?: clone $children['value']; - $valuePrototype->parent = $this; - $originalClosures = $this->prototype->normalizationClosures; - if (\is_array($originalClosures)) { - $valuePrototypeClosures = $valuePrototype->normalizationClosures; - $valuePrototype->normalizationClosures = \is_array($valuePrototypeClosures) ? array_merge($originalClosures, $valuePrototypeClosures) : $originalClosures; - } - $this->valuePrototypes[$k] = $valuePrototype; - } - } - } - - if (\array_key_exists($k, $normalized)) { - $ex = new DuplicateKeyException(sprintf('Duplicate key "%s" for path "%s".', $k, $this->getPath())); - $ex->setPath($this->getPath()); - - throw $ex; - } - } - - $prototype = $this->getPrototypeForChild($k); - if (null !== $this->keyAttribute || $isAssoc) { - $normalized[$k] = $prototype->normalize($v); - } else { - $normalized[] = $prototype->normalize($v); - } - } - - return $normalized; - } - - /** - * Merges values together. - * - * @param mixed $leftSide The left side to merge - * @param mixed $rightSide The right side to merge - * - * @return mixed The merged values - * - * @throws InvalidConfigurationException - * @throws \RuntimeException - */ - protected function mergeValues($leftSide, $rightSide) - { - if (false === $rightSide) { - // if this is still false after the last config has been merged the - // finalization pass will take care of removing this key entirely - return false; - } - - if (false === $leftSide || !$this->performDeepMerging) { - return $rightSide; - } - - foreach ($rightSide as $k => $v) { - // prototype, and key is irrelevant, append the element - if (null === $this->keyAttribute) { - $leftSide[] = $v; - continue; - } - - // no conflict - if (!\array_key_exists($k, $leftSide)) { - if (!$this->allowNewKeys) { - $ex = new InvalidConfigurationException(sprintf('You are not allowed to define new elements for path "%s". Please define all elements for this path in one config file.', $this->getPath())); - $ex->setPath($this->getPath()); - - throw $ex; - } - - $leftSide[$k] = $v; - continue; - } - - $prototype = $this->getPrototypeForChild($k); - $leftSide[$k] = $prototype->merge($leftSide[$k], $v); - } - - return $leftSide; - } - - /** - * Returns a prototype for the child node that is associated to $key in the value array. - * For general child nodes, this will be $this->prototype. - * But if $this->removeKeyAttribute is true and there are only two keys in the child node: - * one is same as this->keyAttribute and the other is 'value', then the prototype will be different. - * - * For example, assume $this->keyAttribute is 'name' and the value array is as follows: - * - * [ - * [ - * 'name' => 'name001', - * 'value' => 'value001' - * ] - * ] - * - * Now, the key is 0 and the child node is: - * - * [ - * 'name' => 'name001', - * 'value' => 'value001' - * ] - * - * When normalizing the value array, the 'name' element will removed from the child node - * and its value becomes the new key of the child node: - * - * [ - * 'name001' => ['value' => 'value001'] - * ] - * - * Now only 'value' element is left in the child node which can be further simplified into a string: - * - * ['name001' => 'value001'] - * - * Now, the key becomes 'name001' and the child node becomes 'value001' and - * the prototype of child node 'name001' should be a ScalarNode instead of an ArrayNode instance. - * - * @return mixed The prototype instance - */ - private function getPrototypeForChild(string $key) - { - $prototype = isset($this->valuePrototypes[$key]) ? $this->valuePrototypes[$key] : $this->prototype; - $prototype->setName($key); - - return $prototype; - } -} diff --git a/vendor/symfony/config/Definition/ScalarNode.php b/vendor/symfony/config/Definition/ScalarNode.php deleted file mode 100644 index 5296c27..0000000 --- a/vendor/symfony/config/Definition/ScalarNode.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -use Symfony\Component\Config\Definition\Exception\InvalidTypeException; - -/** - * This node represents a scalar value in the config tree. - * - * The following values are considered scalars: - * * booleans - * * strings - * * null - * * integers - * * floats - * - * @author Johannes M. Schmitt - */ -class ScalarNode extends VariableNode -{ - /** - * {@inheritdoc} - */ - protected function validateType($value) - { - if (!is_scalar($value) && null !== $value) { - $ex = new InvalidTypeException(sprintf('Invalid type for path "%s". Expected "scalar", but got "%s".', $this->getPath(), get_debug_type($value))); - if ($hint = $this->getInfo()) { - $ex->addHint($hint); - } - $ex->setPath($this->getPath()); - - throw $ex; - } - } - - /** - * {@inheritdoc} - */ - protected function isValueEmpty($value) - { - // assume environment variables are never empty (which in practice is likely to be true during runtime) - // not doing so breaks many configs that are valid today - if ($this->isHandlingPlaceholder()) { - return false; - } - - return null === $value || '' === $value; - } - - /** - * {@inheritdoc} - */ - protected function getValidPlaceholderTypes(): array - { - return ['bool', 'int', 'float', 'string']; - } -} diff --git a/vendor/symfony/config/Definition/VariableNode.php b/vendor/symfony/config/Definition/VariableNode.php deleted file mode 100644 index e868ece..0000000 --- a/vendor/symfony/config/Definition/VariableNode.php +++ /dev/null @@ -1,142 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Definition; - -use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; - -/** - * This node represents a value of variable type in the config tree. - * - * This node is intended for values of arbitrary type. - * Any PHP type is accepted as a value. - * - * @author Jeremy Mikola - */ -class VariableNode extends BaseNode implements PrototypeNodeInterface -{ - protected $defaultValueSet = false; - protected $defaultValue; - protected $allowEmptyValue = true; - - public function setDefaultValue($value) - { - $this->defaultValueSet = true; - $this->defaultValue = $value; - } - - /** - * {@inheritdoc} - */ - public function hasDefaultValue() - { - return $this->defaultValueSet; - } - - /** - * {@inheritdoc} - */ - public function getDefaultValue() - { - $v = $this->defaultValue; - - return $v instanceof \Closure ? $v() : $v; - } - - /** - * Sets if this node is allowed to have an empty value. - * - * @param bool $boolean True if this entity will accept empty values - */ - public function setAllowEmptyValue(bool $boolean) - { - $this->allowEmptyValue = $boolean; - } - - /** - * {@inheritdoc} - */ - public function setName(string $name) - { - $this->name = $name; - } - - /** - * {@inheritdoc} - */ - protected function validateType($value) - { - } - - /** - * {@inheritdoc} - */ - protected function finalizeValue($value) - { - // deny environment variables only when using custom validators - // this avoids ever passing an empty value to final validation closures - if (!$this->allowEmptyValue && $this->isHandlingPlaceholder() && $this->finalValidationClosures) { - $e = new InvalidConfigurationException(sprintf('The path "%s" cannot contain an environment variable when empty values are not allowed by definition and are validated.', $this->getPath())); - if ($hint = $this->getInfo()) { - $e->addHint($hint); - } - $e->setPath($this->getPath()); - - throw $e; - } - - if (!$this->allowEmptyValue && $this->isValueEmpty($value)) { - $ex = new InvalidConfigurationException(sprintf('The path "%s" cannot contain an empty value, but got %s.', $this->getPath(), json_encode($value))); - if ($hint = $this->getInfo()) { - $ex->addHint($hint); - } - $ex->setPath($this->getPath()); - - throw $ex; - } - - return $value; - } - - /** - * {@inheritdoc} - */ - protected function normalizeValue($value) - { - return $value; - } - - /** - * {@inheritdoc} - */ - protected function mergeValues($leftSide, $rightSide) - { - return $rightSide; - } - - /** - * Evaluates if the given value is to be treated as empty. - * - * By default, PHP's empty() function is used to test for emptiness. This - * method may be overridden by subtypes to better match their understanding - * of empty data. - * - * @param mixed $value - * - * @return bool - * - * @see finalizeValue() - */ - protected function isValueEmpty($value) - { - return empty($value); - } -} diff --git a/vendor/symfony/config/Exception/FileLoaderImportCircularReferenceException.php b/vendor/symfony/config/Exception/FileLoaderImportCircularReferenceException.php deleted file mode 100644 index 8c5e736..0000000 --- a/vendor/symfony/config/Exception/FileLoaderImportCircularReferenceException.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Exception; - -/** - * Exception class for when a circular reference is detected when importing resources. - * - * @author Fabien Potencier - */ -class FileLoaderImportCircularReferenceException extends LoaderLoadException -{ - public function __construct(array $resources, int $code = null, \Throwable $previous = null) - { - $message = sprintf('Circular reference detected in "%s" ("%s" > "%s").', $this->varToString($resources[0]), implode('" > "', $resources), $resources[0]); - - \Exception::__construct($message, $code, $previous); - } -} diff --git a/vendor/symfony/config/Exception/FileLocatorFileNotFoundException.php b/vendor/symfony/config/Exception/FileLocatorFileNotFoundException.php deleted file mode 100644 index 3ee4b93..0000000 --- a/vendor/symfony/config/Exception/FileLocatorFileNotFoundException.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Exception; - -/** - * File locator exception if a file does not exist. - * - * @author Leo Feyer - */ -class FileLocatorFileNotFoundException extends \InvalidArgumentException -{ - private $paths; - - public function __construct(string $message = '', int $code = 0, \Throwable $previous = null, array $paths = []) - { - parent::__construct($message, $code, $previous); - - $this->paths = $paths; - } - - public function getPaths() - { - return $this->paths; - } -} diff --git a/vendor/symfony/config/Exception/LoaderLoadException.php b/vendor/symfony/config/Exception/LoaderLoadException.php deleted file mode 100644 index dcec320..0000000 --- a/vendor/symfony/config/Exception/LoaderLoadException.php +++ /dev/null @@ -1,109 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Exception; - -/** - * Exception class for when a resource cannot be loaded or imported. - * - * @author Ryan Weaver - */ -class LoaderLoadException extends \Exception -{ - /** - * @param string $resource The resource that could not be imported - * @param string $sourceResource The original resource importing the new resource - * @param int $code The error code - * @param \Throwable $previous A previous exception - * @param string $type The type of resource - */ - public function __construct(string $resource, string $sourceResource = null, int $code = null, \Throwable $previous = null, string $type = null) - { - $message = ''; - if ($previous) { - // Include the previous exception, to help the user see what might be the underlying cause - - // Trim the trailing period of the previous message. We only want 1 period remove so no rtrim... - if ('.' === substr($previous->getMessage(), -1)) { - $trimmedMessage = substr($previous->getMessage(), 0, -1); - $message .= sprintf('%s', $trimmedMessage).' in '; - } else { - $message .= sprintf('%s', $previous->getMessage()).' in '; - } - $message .= $resource.' '; - - // show tweaked trace to complete the human readable sentence - if (null === $sourceResource) { - $message .= sprintf('(which is loaded in resource "%s")', $resource); - } else { - $message .= sprintf('(which is being imported from "%s")', $sourceResource); - } - $message .= '.'; - - // if there's no previous message, present it the default way - } elseif (null === $sourceResource) { - $message .= sprintf('Cannot load resource "%s".', $resource); - } else { - $message .= sprintf('Cannot import resource "%s" from "%s".', $resource, $sourceResource); - } - - // Is the resource located inside a bundle? - if ('@' === $resource[0]) { - $parts = explode(\DIRECTORY_SEPARATOR, $resource); - $bundle = substr($parts[0], 1); - $message .= sprintf(' Make sure the "%s" bundle is correctly registered and loaded in the application kernel class.', $bundle); - $message .= sprintf(' If the bundle is registered, make sure the bundle path "%s" is not empty.', $resource); - } elseif (null !== $type) { - // maybe there is no loader for this specific type - if ('annotation' === $type) { - $message .= ' Make sure annotations are installed and enabled.'; - } else { - $message .= sprintf(' Make sure there is a loader supporting the "%s" type.', $type); - } - } - - parent::__construct($message, $code, $previous); - } - - protected function varToString($var) - { - if (\is_object($var)) { - return sprintf('Object(%s)', \get_class($var)); - } - - if (\is_array($var)) { - $a = []; - foreach ($var as $k => $v) { - $a[] = sprintf('%s => %s', $k, $this->varToString($v)); - } - - return sprintf('Array(%s)', implode(', ', $a)); - } - - if (\is_resource($var)) { - return sprintf('Resource(%s)', get_resource_type($var)); - } - - if (null === $var) { - return 'null'; - } - - if (false === $var) { - return 'false'; - } - - if (true === $var) { - return 'true'; - } - - return (string) $var; - } -} diff --git a/vendor/symfony/config/FileLocator.php b/vendor/symfony/config/FileLocator.php deleted file mode 100644 index 2e82bf0..0000000 --- a/vendor/symfony/config/FileLocator.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config; - -use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException; - -/** - * FileLocator uses an array of pre-defined paths to find files. - * - * @author Fabien Potencier - */ -class FileLocator implements FileLocatorInterface -{ - protected $paths; - - /** - * @param string|string[] $paths A path or an array of paths where to look for resources - */ - public function __construct($paths = []) - { - $this->paths = (array) $paths; - } - - /** - * {@inheritdoc} - */ - public function locate(string $name, string $currentPath = null, bool $first = true) - { - if ('' === $name) { - throw new \InvalidArgumentException('An empty file name is not valid to be located.'); - } - - if ($this->isAbsolutePath($name)) { - if (!file_exists($name)) { - throw new FileLocatorFileNotFoundException(sprintf('The file "%s" does not exist.', $name), 0, null, [$name]); - } - - return $name; - } - - $paths = $this->paths; - - if (null !== $currentPath) { - array_unshift($paths, $currentPath); - } - - $paths = array_unique($paths); - $filepaths = $notfound = []; - - foreach ($paths as $path) { - if (@file_exists($file = $path.\DIRECTORY_SEPARATOR.$name)) { - if (true === $first) { - return $file; - } - $filepaths[] = $file; - } else { - $notfound[] = $file; - } - } - - if (!$filepaths) { - throw new FileLocatorFileNotFoundException(sprintf('The file "%s" does not exist (in: "%s").', $name, implode('", "', $paths)), 0, null, $notfound); - } - - return $filepaths; - } - - /** - * Returns whether the file path is an absolute path. - */ - private function isAbsolutePath(string $file): bool - { - if ('/' === $file[0] || '\\' === $file[0] - || (\strlen($file) > 3 && ctype_alpha($file[0]) - && ':' === $file[1] - && ('\\' === $file[2] || '/' === $file[2]) - ) - || null !== parse_url($file, PHP_URL_SCHEME) - ) { - return true; - } - - return false; - } -} diff --git a/vendor/symfony/config/FileLocatorInterface.php b/vendor/symfony/config/FileLocatorInterface.php deleted file mode 100644 index e3ca1d4..0000000 --- a/vendor/symfony/config/FileLocatorInterface.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config; - -use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException; - -/** - * @author Fabien Potencier - */ -interface FileLocatorInterface -{ - /** - * Returns a full path for a given file name. - * - * @param string $name The file name to locate - * @param string|null $currentPath The current path - * @param bool $first Whether to return the first occurrence or an array of filenames - * - * @return string|array The full path to the file or an array of file paths - * - * @throws \InvalidArgumentException If $name is empty - * @throws FileLocatorFileNotFoundException If a file is not found - */ - public function locate(string $name, string $currentPath = null, bool $first = true); -} diff --git a/vendor/symfony/config/LICENSE b/vendor/symfony/config/LICENSE deleted file mode 100644 index 9e936ec..0000000 --- a/vendor/symfony/config/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/config/Loader/DelegatingLoader.php b/vendor/symfony/config/Loader/DelegatingLoader.php deleted file mode 100644 index 2ec64cb..0000000 --- a/vendor/symfony/config/Loader/DelegatingLoader.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Loader; - -use Symfony\Component\Config\Exception\LoaderLoadException; - -/** - * DelegatingLoader delegates loading to other loaders using a loader resolver. - * - * This loader acts as an array of LoaderInterface objects - each having - * a chance to load a given resource (handled by the resolver) - * - * @author Fabien Potencier - */ -class DelegatingLoader extends Loader -{ - public function __construct(LoaderResolverInterface $resolver) - { - $this->resolver = $resolver; - } - - /** - * {@inheritdoc} - */ - public function load($resource, string $type = null) - { - if (false === $loader = $this->resolver->resolve($resource, $type)) { - throw new LoaderLoadException($resource, null, null, null, $type); - } - - return $loader->load($resource, $type); - } - - /** - * {@inheritdoc} - */ - public function supports($resource, string $type = null) - { - return false !== $this->resolver->resolve($resource, $type); - } -} diff --git a/vendor/symfony/config/Loader/FileLoader.php b/vendor/symfony/config/Loader/FileLoader.php deleted file mode 100644 index 926b208..0000000 --- a/vendor/symfony/config/Loader/FileLoader.php +++ /dev/null @@ -1,179 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Loader; - -use Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceException; -use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException; -use Symfony\Component\Config\Exception\LoaderLoadException; -use Symfony\Component\Config\FileLocatorInterface; -use Symfony\Component\Config\Resource\FileExistenceResource; -use Symfony\Component\Config\Resource\GlobResource; - -/** - * FileLoader is the abstract class used by all built-in loaders that are file based. - * - * @author Fabien Potencier - */ -abstract class FileLoader extends Loader -{ - protected static $loading = []; - - protected $locator; - - private $currentDir; - - public function __construct(FileLocatorInterface $locator) - { - $this->locator = $locator; - } - - /** - * Sets the current directory. - */ - public function setCurrentDir(string $dir) - { - $this->currentDir = $dir; - } - - /** - * Returns the file locator used by this loader. - * - * @return FileLocatorInterface - */ - public function getLocator() - { - return $this->locator; - } - - /** - * Imports a resource. - * - * @param mixed $resource A Resource - * @param string|null $type The resource type or null if unknown - * @param bool $ignoreErrors Whether to ignore import errors or not - * @param string|null $sourceResource The original resource importing the new resource - * @param string|string[]|null $exclude Glob patterns to exclude from the import - * - * @return mixed - * - * @throws LoaderLoadException - * @throws FileLoaderImportCircularReferenceException - * @throws FileLocatorFileNotFoundException - */ - public function import($resource, string $type = null, bool $ignoreErrors = false, string $sourceResource = null, $exclude = null) - { - if (\is_string($resource) && \strlen($resource) !== $i = strcspn($resource, '*?{[')) { - $excluded = []; - foreach ((array) $exclude as $pattern) { - foreach ($this->glob($pattern, true, $_, false, true) as $path => $info) { - // normalize Windows slashes - $excluded[str_replace('\\', '/', $path)] = true; - } - } - - $ret = []; - $isSubpath = 0 !== $i && false !== strpos(substr($resource, 0, $i), '/'); - foreach ($this->glob($resource, false, $_, $ignoreErrors || !$isSubpath, false, $excluded) as $path => $info) { - if (null !== $res = $this->doImport($path, 'glob' === $type ? null : $type, $ignoreErrors, $sourceResource)) { - $ret[] = $res; - } - $isSubpath = true; - } - - if ($isSubpath) { - return isset($ret[1]) ? $ret : (isset($ret[0]) ? $ret[0] : null); - } - } - - return $this->doImport($resource, $type, $ignoreErrors, $sourceResource); - } - - /** - * @internal - */ - protected function glob(string $pattern, bool $recursive, &$resource = null, bool $ignoreErrors = false, bool $forExclusion = false, array $excluded = []) - { - if (\strlen($pattern) === $i = strcspn($pattern, '*?{[')) { - $prefix = $pattern; - $pattern = ''; - } elseif (0 === $i || false === strpos(substr($pattern, 0, $i), '/')) { - $prefix = '.'; - $pattern = '/'.$pattern; - } else { - $prefix = \dirname(substr($pattern, 0, 1 + $i)); - $pattern = substr($pattern, \strlen($prefix)); - } - - try { - $prefix = $this->locator->locate($prefix, $this->currentDir, true); - } catch (FileLocatorFileNotFoundException $e) { - if (!$ignoreErrors) { - throw $e; - } - - $resource = []; - foreach ($e->getPaths() as $path) { - $resource[] = new FileExistenceResource($path); - } - - return; - } - $resource = new GlobResource($prefix, $pattern, $recursive, $forExclusion, $excluded); - - yield from $resource; - } - - private function doImport($resource, string $type = null, bool $ignoreErrors = false, string $sourceResource = null) - { - try { - $loader = $this->resolve($resource, $type); - - if ($loader instanceof self && null !== $this->currentDir) { - $resource = $loader->getLocator()->locate($resource, $this->currentDir, false); - } - - $resources = \is_array($resource) ? $resource : [$resource]; - for ($i = 0; $i < $resourcesCount = \count($resources); ++$i) { - if (isset(self::$loading[$resources[$i]])) { - if ($i == $resourcesCount - 1) { - throw new FileLoaderImportCircularReferenceException(array_keys(self::$loading)); - } - } else { - $resource = $resources[$i]; - break; - } - } - self::$loading[$resource] = true; - - try { - $ret = $loader->load($resource, $type); - } finally { - unset(self::$loading[$resource]); - } - - return $ret; - } catch (FileLoaderImportCircularReferenceException $e) { - throw $e; - } catch (\Exception $e) { - if (!$ignoreErrors) { - // prevent embedded imports from nesting multiple exceptions - if ($e instanceof LoaderLoadException) { - throw $e; - } - - throw new LoaderLoadException($resource, $sourceResource, null, $e, $type); - } - } - - return null; - } -} diff --git a/vendor/symfony/config/Loader/GlobFileLoader.php b/vendor/symfony/config/Loader/GlobFileLoader.php deleted file mode 100644 index fecb1c5..0000000 --- a/vendor/symfony/config/Loader/GlobFileLoader.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Loader; - -/** - * GlobFileLoader loads files from a glob pattern. - * - * @author Fabien Potencier - */ -class GlobFileLoader extends FileLoader -{ - /** - * {@inheritdoc} - */ - public function load($resource, string $type = null) - { - return $this->import($resource); - } - - /** - * {@inheritdoc} - */ - public function supports($resource, string $type = null) - { - return 'glob' === $type; - } -} diff --git a/vendor/symfony/config/Loader/Loader.php b/vendor/symfony/config/Loader/Loader.php deleted file mode 100644 index 62cae68..0000000 --- a/vendor/symfony/config/Loader/Loader.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Loader; - -use Symfony\Component\Config\Exception\LoaderLoadException; - -/** - * Loader is the abstract class used by all built-in loaders. - * - * @author Fabien Potencier - */ -abstract class Loader implements LoaderInterface -{ - protected $resolver; - - /** - * {@inheritdoc} - */ - public function getResolver() - { - return $this->resolver; - } - - /** - * {@inheritdoc} - */ - public function setResolver(LoaderResolverInterface $resolver) - { - $this->resolver = $resolver; - } - - /** - * Imports a resource. - * - * @param mixed $resource A resource - * @param string|null $type The resource type or null if unknown - * - * @return mixed - */ - public function import($resource, string $type = null) - { - return $this->resolve($resource, $type)->load($resource, $type); - } - - /** - * Finds a loader able to load an imported resource. - * - * @param mixed $resource A resource - * @param string|null $type The resource type or null if unknown - * - * @return $this|LoaderInterface - * - * @throws LoaderLoadException If no loader is found - */ - public function resolve($resource, string $type = null) - { - if ($this->supports($resource, $type)) { - return $this; - } - - $loader = null === $this->resolver ? false : $this->resolver->resolve($resource, $type); - - if (false === $loader) { - throw new LoaderLoadException($resource, null, null, null, $type); - } - - return $loader; - } -} diff --git a/vendor/symfony/config/Loader/LoaderInterface.php b/vendor/symfony/config/Loader/LoaderInterface.php deleted file mode 100644 index 4dfb42c..0000000 --- a/vendor/symfony/config/Loader/LoaderInterface.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Loader; - -/** - * LoaderInterface is the interface implemented by all loader classes. - * - * @author Fabien Potencier - */ -interface LoaderInterface -{ - /** - * Loads a resource. - * - * @param mixed $resource The resource - * - * @throws \Exception If something went wrong - */ - public function load($resource, string $type = null); - - /** - * Returns whether this class supports the given resource. - * - * @param mixed $resource A resource - * - * @return bool True if this class supports the given resource, false otherwise - */ - public function supports($resource, string $type = null); - - /** - * Gets the loader resolver. - * - * @return LoaderResolverInterface A LoaderResolverInterface instance - */ - public function getResolver(); - - /** - * Sets the loader resolver. - */ - public function setResolver(LoaderResolverInterface $resolver); -} diff --git a/vendor/symfony/config/Loader/LoaderResolver.php b/vendor/symfony/config/Loader/LoaderResolver.php deleted file mode 100644 index d243b91..0000000 --- a/vendor/symfony/config/Loader/LoaderResolver.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Loader; - -/** - * LoaderResolver selects a loader for a given resource. - * - * A resource can be anything (e.g. a full path to a config file or a Closure). - * Each loader determines whether it can load a resource and how. - * - * @author Fabien Potencier - */ -class LoaderResolver implements LoaderResolverInterface -{ - /** - * @var LoaderInterface[] An array of LoaderInterface objects - */ - private $loaders = []; - - /** - * @param LoaderInterface[] $loaders An array of loaders - */ - public function __construct(array $loaders = []) - { - foreach ($loaders as $loader) { - $this->addLoader($loader); - } - } - - /** - * {@inheritdoc} - */ - public function resolve($resource, string $type = null) - { - foreach ($this->loaders as $loader) { - if ($loader->supports($resource, $type)) { - return $loader; - } - } - - return false; - } - - public function addLoader(LoaderInterface $loader) - { - $this->loaders[] = $loader; - $loader->setResolver($this); - } - - /** - * Returns the registered loaders. - * - * @return LoaderInterface[] An array of LoaderInterface instances - */ - public function getLoaders() - { - return $this->loaders; - } -} diff --git a/vendor/symfony/config/Loader/LoaderResolverInterface.php b/vendor/symfony/config/Loader/LoaderResolverInterface.php deleted file mode 100644 index 2c45a4c..0000000 --- a/vendor/symfony/config/Loader/LoaderResolverInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Loader; - -/** - * LoaderResolverInterface selects a loader for a given resource. - * - * @author Fabien Potencier - */ -interface LoaderResolverInterface -{ - /** - * Returns a loader able to load the resource. - * - * @param mixed $resource A resource - * @param string|null $type The resource type or null if unknown - * - * @return LoaderInterface|false The loader or false if none is able to load the resource - */ - public function resolve($resource, string $type = null); -} diff --git a/vendor/symfony/config/README.md b/vendor/symfony/config/README.md deleted file mode 100644 index 0bbde55..0000000 --- a/vendor/symfony/config/README.md +++ /dev/null @@ -1,15 +0,0 @@ -Config Component -================ - -The Config component provides several classes to help you find, load, combine, -autofill and validate configuration values of any kind, whatever their source -may be (YAML, XML, INI files, or for instance a database). - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/config.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/config/Resource/ClassExistenceResource.php b/vendor/symfony/config/Resource/ClassExistenceResource.php deleted file mode 100644 index 507791c..0000000 --- a/vendor/symfony/config/Resource/ClassExistenceResource.php +++ /dev/null @@ -1,238 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Resource; - -/** - * ClassExistenceResource represents a class existence. - * Freshness is only evaluated against resource existence. - * - * The resource must be a fully-qualified class name. - * - * @author Fabien Potencier - * - * @final - */ -class ClassExistenceResource implements SelfCheckingResourceInterface -{ - private $resource; - private $exists; - - private static $autoloadLevel = 0; - private static $autoloadedClass; - private static $existsCache = []; - - /** - * @param string $resource The fully-qualified class name - * @param bool|null $exists Boolean when the existency check has already been done - */ - public function __construct(string $resource, bool $exists = null) - { - $this->resource = $resource; - if (null !== $exists) { - $this->exists = [(bool) $exists, null]; - } - } - - /** - * {@inheritdoc} - */ - public function __toString(): string - { - return $this->resource; - } - - /** - * @return string The file path to the resource - */ - public function getResource(): string - { - return $this->resource; - } - - /** - * {@inheritdoc} - * - * @throws \ReflectionException when a parent class/interface/trait is not found - */ - public function isFresh(int $timestamp): bool - { - $loaded = class_exists($this->resource, false) || interface_exists($this->resource, false) || trait_exists($this->resource, false); - - if (null !== $exists = &self::$existsCache[$this->resource]) { - if ($loaded) { - $exists = [true, null]; - } elseif (0 >= $timestamp && !$exists[0] && null !== $exists[1]) { - throw new \ReflectionException($exists[1]); - } - } elseif ([false, null] === $exists = [$loaded, null]) { - if (!self::$autoloadLevel++) { - spl_autoload_register(__CLASS__.'::throwOnRequiredClass'); - } - $autoloadedClass = self::$autoloadedClass; - self::$autoloadedClass = ltrim($this->resource, '\\'); - - try { - $exists[0] = class_exists($this->resource) || interface_exists($this->resource, false) || trait_exists($this->resource, false); - } catch (\Exception $e) { - $exists[1] = $e->getMessage(); - - try { - self::throwOnRequiredClass($this->resource, $e); - } catch (\ReflectionException $e) { - if (0 >= $timestamp) { - throw $e; - } - } - } catch (\Throwable $e) { - $exists[1] = $e->getMessage(); - - throw $e; - } finally { - self::$autoloadedClass = $autoloadedClass; - if (!--self::$autoloadLevel) { - spl_autoload_unregister(__CLASS__.'::throwOnRequiredClass'); - } - } - } - - if (null === $this->exists) { - $this->exists = $exists; - } - - return $this->exists[0] xor !$exists[0]; - } - - /** - * @internal - */ - public function __sleep(): array - { - if (null === $this->exists) { - $this->isFresh(0); - } - - return ['resource', 'exists']; - } - - /** - * @internal - */ - public function __wakeup() - { - if (\is_bool($this->exists)) { - $this->exists = [$this->exists, null]; - } - } - - /** - * Throws a reflection exception when the passed class does not exist but is required. - * - * A class is considered "not required" when it's loaded as part of a "class_exists" or similar check. - * - * This function can be used as an autoload function to throw a reflection - * exception if the class was not found by previous autoload functions. - * - * A previous exception can be passed. In this case, the class is considered as being - * required totally, so if it doesn't exist, a reflection exception is always thrown. - * If it exists, the previous exception is rethrown. - * - * @throws \ReflectionException - * - * @internal - */ - public static function throwOnRequiredClass(string $class, \Exception $previous = null) - { - // If the passed class is the resource being checked, we shouldn't throw. - if (null === $previous && self::$autoloadedClass === $class) { - return; - } - - if (class_exists($class, false) || interface_exists($class, false) || trait_exists($class, false)) { - if (null !== $previous) { - throw $previous; - } - - return; - } - - if ($previous instanceof \ReflectionException) { - throw $previous; - } - - $message = sprintf('Class "%s" not found.', $class); - - if (self::$autoloadedClass !== $class) { - $message = substr_replace($message, sprintf(' while loading "%s"', self::$autoloadedClass), -1, 0); - } - - if (null !== $previous) { - $message = $previous->getMessage(); - } - - $e = new \ReflectionException($message, 0, $previous); - - if (null !== $previous) { - throw $e; - } - - $trace = debug_backtrace(); - $autoloadFrame = [ - 'function' => 'spl_autoload_call', - 'args' => [$class], - ]; - - if (\PHP_VERSION_ID >= 80000 && isset($trace[1])) { - $callerFrame = $trace[1]; - $i = 2; - } elseif (false !== $i = array_search($autoloadFrame, $trace, true)) { - $callerFrame = $trace[++$i]; - } else { - throw $e; - } - - if (isset($callerFrame['function']) && !isset($callerFrame['class'])) { - switch ($callerFrame['function']) { - case 'get_class_methods': - case 'get_class_vars': - case 'get_parent_class': - case 'is_a': - case 'is_subclass_of': - case 'class_exists': - case 'class_implements': - case 'class_parents': - case 'trait_exists': - case 'defined': - case 'interface_exists': - case 'method_exists': - case 'property_exists': - case 'is_callable': - return; - } - - $props = [ - 'file' => isset($callerFrame['file']) ? $callerFrame['file'] : null, - 'line' => isset($callerFrame['line']) ? $callerFrame['line'] : null, - 'trace' => \array_slice($trace, 1 + $i), - ]; - - foreach ($props as $p => $v) { - if (null !== $v) { - $r = new \ReflectionProperty('Exception', $p); - $r->setAccessible(true); - $r->setValue($e, $v); - } - } - } - - throw $e; - } -} diff --git a/vendor/symfony/config/Resource/ComposerResource.php b/vendor/symfony/config/Resource/ComposerResource.php deleted file mode 100644 index b8bf577..0000000 --- a/vendor/symfony/config/Resource/ComposerResource.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Resource; - -/** - * ComposerResource tracks the PHP version and Composer dependencies. - * - * @author Nicolas Grekas - * - * @final - */ -class ComposerResource implements SelfCheckingResourceInterface -{ - private $vendors; - - private static $runtimeVendors; - - public function __construct() - { - self::refresh(); - $this->vendors = self::$runtimeVendors; - } - - public function getVendors(): array - { - return array_keys($this->vendors); - } - - /** - * {@inheritdoc} - */ - public function __toString(): string - { - return __CLASS__; - } - - /** - * {@inheritdoc} - */ - public function isFresh(int $timestamp): bool - { - self::refresh(); - - return array_values(self::$runtimeVendors) === array_values($this->vendors); - } - - private static function refresh() - { - self::$runtimeVendors = []; - - foreach (get_declared_classes() as $class) { - if ('C' === $class[0] && 0 === strpos($class, 'ComposerAutoloaderInit')) { - $r = new \ReflectionClass($class); - $v = \dirname($r->getFileName(), 2); - if (is_file($v.'/composer/installed.json')) { - self::$runtimeVendors[$v] = @filemtime($v.'/composer/installed.json'); - } - } - } - } -} diff --git a/vendor/symfony/config/Resource/DirectoryResource.php b/vendor/symfony/config/Resource/DirectoryResource.php deleted file mode 100644 index 1a28881..0000000 --- a/vendor/symfony/config/Resource/DirectoryResource.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Resource; - -/** - * DirectoryResource represents a resources stored in a subdirectory tree. - * - * @author Fabien Potencier - * - * @final - */ -class DirectoryResource implements SelfCheckingResourceInterface -{ - private $resource; - private $pattern; - - /** - * @param string $resource The file path to the resource - * @param string|null $pattern A pattern to restrict monitored files - * - * @throws \InvalidArgumentException - */ - public function __construct(string $resource, string $pattern = null) - { - $this->resource = realpath($resource) ?: (file_exists($resource) ? $resource : false); - $this->pattern = $pattern; - - if (false === $this->resource || !is_dir($this->resource)) { - throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist.', $resource)); - } - } - - /** - * {@inheritdoc} - */ - public function __toString(): string - { - return md5(serialize([$this->resource, $this->pattern])); - } - - /** - * @return string The file path to the resource - */ - public function getResource(): string - { - return $this->resource; - } - - /** - * Returns the pattern to restrict monitored files. - */ - public function getPattern(): ?string - { - return $this->pattern; - } - - /** - * {@inheritdoc} - */ - public function isFresh(int $timestamp): bool - { - if (!is_dir($this->resource)) { - return false; - } - - if ($timestamp < filemtime($this->resource)) { - return false; - } - - foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) as $file) { - // if regex filtering is enabled only check matching files - if ($this->pattern && $file->isFile() && !preg_match($this->pattern, $file->getBasename())) { - continue; - } - - // always monitor directories for changes, except the .. entries - // (otherwise deleted files wouldn't get detected) - if ($file->isDir() && '/..' === substr($file, -3)) { - continue; - } - - // for broken links - try { - $fileMTime = $file->getMTime(); - } catch (\RuntimeException $e) { - continue; - } - - // early return if a file's mtime exceeds the passed timestamp - if ($timestamp < $fileMTime) { - return false; - } - } - - return true; - } -} diff --git a/vendor/symfony/config/Resource/FileExistenceResource.php b/vendor/symfony/config/Resource/FileExistenceResource.php deleted file mode 100644 index ca2d2c3..0000000 --- a/vendor/symfony/config/Resource/FileExistenceResource.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Resource; - -/** - * FileExistenceResource represents a resource stored on the filesystem. - * Freshness is only evaluated against resource creation or deletion. - * - * The resource can be a file or a directory. - * - * @author Charles-Henri Bruyand - * - * @final - */ -class FileExistenceResource implements SelfCheckingResourceInterface -{ - private $resource; - - private $exists; - - /** - * @param string $resource The file path to the resource - */ - public function __construct(string $resource) - { - $this->resource = $resource; - $this->exists = file_exists($resource); - } - - /** - * {@inheritdoc} - */ - public function __toString(): string - { - return $this->resource; - } - - /** - * @return string The file path to the resource - */ - public function getResource(): string - { - return $this->resource; - } - - /** - * {@inheritdoc} - */ - public function isFresh(int $timestamp): bool - { - return file_exists($this->resource) === $this->exists; - } -} diff --git a/vendor/symfony/config/Resource/FileResource.php b/vendor/symfony/config/Resource/FileResource.php deleted file mode 100644 index 4274d07..0000000 --- a/vendor/symfony/config/Resource/FileResource.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Resource; - -/** - * FileResource represents a resource stored on the filesystem. - * - * The resource can be a file or a directory. - * - * @author Fabien Potencier - * - * @final - */ -class FileResource implements SelfCheckingResourceInterface -{ - /** - * @var string|false - */ - private $resource; - - /** - * @param string $resource The file path to the resource - * - * @throws \InvalidArgumentException - */ - public function __construct(string $resource) - { - $this->resource = realpath($resource) ?: (file_exists($resource) ? $resource : false); - - if (false === $this->resource) { - throw new \InvalidArgumentException(sprintf('The file "%s" does not exist.', $resource)); - } - } - - /** - * {@inheritdoc} - */ - public function __toString(): string - { - return $this->resource; - } - - /** - * @return string The canonicalized, absolute path to the resource - */ - public function getResource(): string - { - return $this->resource; - } - - /** - * {@inheritdoc} - */ - public function isFresh(int $timestamp): bool - { - return false !== ($filemtime = @filemtime($this->resource)) && $filemtime <= $timestamp; - } -} diff --git a/vendor/symfony/config/Resource/GlobResource.php b/vendor/symfony/config/Resource/GlobResource.php deleted file mode 100644 index 8f5a2f1..0000000 --- a/vendor/symfony/config/Resource/GlobResource.php +++ /dev/null @@ -1,230 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Resource; - -use Symfony\Component\Finder\Finder; -use Symfony\Component\Finder\Glob; - -/** - * GlobResource represents a set of resources stored on the filesystem. - * - * Only existence/removal is tracked (not mtimes.) - * - * @author Nicolas Grekas - * - * @final - */ -class GlobResource implements \IteratorAggregate, SelfCheckingResourceInterface -{ - private $prefix; - private $pattern; - private $recursive; - private $hash; - private $forExclusion; - private $excludedPrefixes; - private $globBrace; - - /** - * @param string $prefix A directory prefix - * @param string $pattern A glob pattern - * @param bool $recursive Whether directories should be scanned recursively or not - * - * @throws \InvalidArgumentException - */ - public function __construct(string $prefix, string $pattern, bool $recursive, bool $forExclusion = false, array $excludedPrefixes = []) - { - ksort($excludedPrefixes); - $this->prefix = realpath($prefix) ?: (file_exists($prefix) ? $prefix : false); - $this->pattern = $pattern; - $this->recursive = $recursive; - $this->forExclusion = $forExclusion; - $this->excludedPrefixes = $excludedPrefixes; - $this->globBrace = \defined('GLOB_BRACE') ? GLOB_BRACE : 0; - - if (false === $this->prefix) { - throw new \InvalidArgumentException(sprintf('The path "%s" does not exist.', $prefix)); - } - } - - public function getPrefix(): string - { - return $this->prefix; - } - - /** - * {@inheritdoc} - */ - public function __toString(): string - { - return 'glob.'.$this->prefix.(int) $this->recursive.$this->pattern.(int) $this->forExclusion.implode("\0", $this->excludedPrefixes); - } - - /** - * {@inheritdoc} - */ - public function isFresh(int $timestamp): bool - { - $hash = $this->computeHash(); - - if (null === $this->hash) { - $this->hash = $hash; - } - - return $this->hash === $hash; - } - - /** - * @internal - */ - public function __sleep(): array - { - if (null === $this->hash) { - $this->hash = $this->computeHash(); - } - - return ['prefix', 'pattern', 'recursive', 'hash', 'forExclusion', 'excludedPrefixes']; - } - - public function getIterator(): \Traversable - { - if (!file_exists($this->prefix) || (!$this->recursive && '' === $this->pattern)) { - return; - } - $prefix = str_replace('\\', '/', $this->prefix); - $paths = null; - - if (0 !== strpos($this->prefix, 'phar://') && false === strpos($this->pattern, '/**/')) { - if ($this->globBrace || false === strpos($this->pattern, '{')) { - $paths = glob($this->prefix.$this->pattern, GLOB_NOSORT | $this->globBrace); - } elseif (false === strpos($this->pattern, '\\') || !preg_match('/\\\\[,{}]/', $this->pattern)) { - foreach ($this->expandGlob($this->pattern) as $p) { - $paths[] = glob($this->prefix.$p, GLOB_NOSORT); - } - $paths = array_merge(...$paths); - } - } - - if (null !== $paths) { - sort($paths); - foreach ($paths as $path) { - if ($this->excludedPrefixes) { - $normalizedPath = str_replace('\\', '/', $path); - do { - if (isset($this->excludedPrefixes[$dirPath = $normalizedPath])) { - continue 2; - } - } while ($prefix !== $dirPath && $dirPath !== $normalizedPath = \dirname($dirPath)); - } - - if (is_file($path)) { - yield $path => new \SplFileInfo($path); - } - if (!is_dir($path)) { - continue; - } - if ($this->forExclusion) { - yield $path => new \SplFileInfo($path); - continue; - } - if (!$this->recursive || isset($this->excludedPrefixes[str_replace('\\', '/', $path)])) { - continue; - } - $files = iterator_to_array(new \RecursiveIteratorIterator( - new \RecursiveCallbackFilterIterator( - new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), - function (\SplFileInfo $file, $path) { - return !isset($this->excludedPrefixes[str_replace('\\', '/', $path)]) && '.' !== $file->getBasename()[0]; - } - ), - \RecursiveIteratorIterator::LEAVES_ONLY - )); - uasort($files, 'strnatcmp'); - - foreach ($files as $path => $info) { - if ($info->isFile()) { - yield $path => $info; - } - } - } - - return; - } - - if (!class_exists(Finder::class)) { - throw new \LogicException(sprintf('Extended glob pattern "%s" cannot be used as the Finder component is not installed.', $this->pattern)); - } - - $finder = new Finder(); - $regex = Glob::toRegex($this->pattern); - if ($this->recursive) { - $regex = substr_replace($regex, '(/|$)', -2, 1); - } - - $prefixLen = \strlen($this->prefix); - foreach ($finder->followLinks()->sortByName()->in($this->prefix) as $path => $info) { - $normalizedPath = str_replace('\\', '/', $path); - if (!preg_match($regex, substr($normalizedPath, $prefixLen)) || !$info->isFile()) { - continue; - } - if ($this->excludedPrefixes) { - do { - if (isset($this->excludedPrefixes[$dirPath = $normalizedPath])) { - continue 2; - } - } while ($prefix !== $dirPath && $dirPath !== $normalizedPath = \dirname($dirPath)); - } - - yield $path => $info; - } - } - - private function computeHash(): string - { - $hash = hash_init('md5'); - - foreach ($this->getIterator() as $path => $info) { - hash_update($hash, $path."\n"); - } - - return hash_final($hash); - } - - private function expandGlob(string $pattern): array - { - $segments = preg_split('/\{([^{}]*+)\}/', $pattern, -1, PREG_SPLIT_DELIM_CAPTURE); - $paths = [$segments[0]]; - $patterns = []; - - for ($i = 1; $i < \count($segments); $i += 2) { - $patterns = []; - - foreach (explode(',', $segments[$i]) as $s) { - foreach ($paths as $p) { - $patterns[] = $p.$s.$segments[1 + $i]; - } - } - - $paths = $patterns; - } - - $j = 0; - foreach ($patterns as $i => $p) { - if (false !== strpos($p, '{')) { - $p = $this->expandGlob($p); - array_splice($paths, $i + $j, 1, $p); - $j += \count($p) - 1; - } - } - - return $paths; - } -} diff --git a/vendor/symfony/config/Resource/ReflectionClassResource.php b/vendor/symfony/config/Resource/ReflectionClassResource.php deleted file mode 100644 index bcf807e..0000000 --- a/vendor/symfony/config/Resource/ReflectionClassResource.php +++ /dev/null @@ -1,226 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Resource; - -use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Component\Messenger\Handler\MessageSubscriberInterface; -use Symfony\Contracts\Service\ServiceSubscriberInterface; - -/** - * @author Nicolas Grekas - * - * @final - */ -class ReflectionClassResource implements SelfCheckingResourceInterface -{ - private $files = []; - private $className; - private $classReflector; - private $excludedVendors = []; - private $hash; - - public function __construct(\ReflectionClass $classReflector, array $excludedVendors = []) - { - $this->className = $classReflector->name; - $this->classReflector = $classReflector; - $this->excludedVendors = $excludedVendors; - } - - /** - * {@inheritdoc} - */ - public function isFresh(int $timestamp): bool - { - if (null === $this->hash) { - $this->hash = $this->computeHash(); - $this->loadFiles($this->classReflector); - } - - foreach ($this->files as $file => $v) { - if (false === $filemtime = @filemtime($file)) { - return false; - } - - if ($filemtime > $timestamp) { - return $this->hash === $this->computeHash(); - } - } - - return true; - } - - public function __toString(): string - { - return 'reflection.'.$this->className; - } - - /** - * @internal - */ - public function __sleep(): array - { - if (null === $this->hash) { - $this->hash = $this->computeHash(); - $this->loadFiles($this->classReflector); - } - - return ['files', 'className', 'hash']; - } - - private function loadFiles(\ReflectionClass $class) - { - foreach ($class->getInterfaces() as $v) { - $this->loadFiles($v); - } - do { - $file = $class->getFileName(); - if (false !== $file && is_file($file)) { - foreach ($this->excludedVendors as $vendor) { - if (0 === strpos($file, $vendor) && false !== strpbrk(substr($file, \strlen($vendor), 1), '/'.\DIRECTORY_SEPARATOR)) { - $file = false; - break; - } - } - if ($file) { - $this->files[$file] = null; - } - } - foreach ($class->getTraits() as $v) { - $this->loadFiles($v); - } - } while ($class = $class->getParentClass()); - } - - private function computeHash(): string - { - if (null === $this->classReflector) { - try { - $this->classReflector = new \ReflectionClass($this->className); - } catch (\ReflectionException $e) { - // the class does not exist anymore - return false; - } - } - $hash = hash_init('md5'); - - foreach ($this->generateSignature($this->classReflector) as $info) { - hash_update($hash, $info); - } - - return hash_final($hash); - } - - private function generateSignature(\ReflectionClass $class): iterable - { - yield $class->getDocComment(); - yield (int) $class->isFinal(); - yield (int) $class->isAbstract(); - - if ($class->isTrait()) { - yield print_r(class_uses($class->name), true); - } else { - yield print_r(class_parents($class->name), true); - yield print_r(class_implements($class->name), true); - yield print_r($class->getConstants(), true); - } - - if (!$class->isInterface()) { - $defaults = $class->getDefaultProperties(); - - foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED) as $p) { - yield $p->getDocComment(); - yield $p->isDefault() ? '' : ''; - yield $p->isPublic() ? 'public' : 'protected'; - yield $p->isStatic() ? 'static' : ''; - yield '$'.$p->name; - yield print_r(isset($defaults[$p->name]) && !\is_object($defaults[$p->name]) ? $defaults[$p->name] : null, true); - } - } - - foreach ($class->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) as $m) { - $defaults = []; - $parametersWithUndefinedConstants = []; - foreach ($m->getParameters() as $p) { - if (!$p->isDefaultValueAvailable()) { - $defaults[$p->name] = null; - - continue; - } - - if (!$p->isDefaultValueConstant() || \defined($p->getDefaultValueConstantName())) { - $defaults[$p->name] = $p->getDefaultValue(); - - continue; - } - - $defaults[$p->name] = $p->getDefaultValueConstantName(); - $parametersWithUndefinedConstants[$p->name] = true; - } - - if (!$parametersWithUndefinedConstants) { - yield preg_replace('/^ @@.*/m', '', $m); - } else { - $t = $m->getReturnType(); - $stack = [ - $m->getDocComment(), - $m->getName(), - $m->isAbstract(), - $m->isFinal(), - $m->isStatic(), - $m->isPublic(), - $m->isPrivate(), - $m->isProtected(), - $m->returnsReference(), - $t instanceof \ReflectionNamedType ? ((string) $t->allowsNull()).$t->getName() : (string) $t, - ]; - - foreach ($m->getParameters() as $p) { - if (!isset($parametersWithUndefinedConstants[$p->name])) { - $stack[] = (string) $p; - } else { - $t = $p->getType(); - $stack[] = $p->isOptional(); - $stack[] = $t instanceof \ReflectionNamedType ? ((string) $t->allowsNull()).$t->getName() : (string) $t; - $stack[] = $p->isPassedByReference(); - $stack[] = $p->isVariadic(); - $stack[] = $p->getName(); - } - } - - yield implode(',', $stack); - } - - yield print_r($defaults, true); - } - - if ($class->isAbstract() || $class->isInterface() || $class->isTrait()) { - return; - } - - if (interface_exists(EventSubscriberInterface::class, false) && $class->isSubclassOf(EventSubscriberInterface::class)) { - yield EventSubscriberInterface::class; - yield print_r($class->name::getSubscribedEvents(), true); - } - - if (interface_exists(MessageSubscriberInterface::class, false) && $class->isSubclassOf(MessageSubscriberInterface::class)) { - yield MessageSubscriberInterface::class; - foreach ($class->name::getHandledMessages() as $key => $value) { - yield $key.print_r($value, true); - } - } - - if (interface_exists(ServiceSubscriberInterface::class, false) && $class->isSubclassOf(ServiceSubscriberInterface::class)) { - yield ServiceSubscriberInterface::class; - yield print_r($class->name::getSubscribedServices(), true); - } - } -} diff --git a/vendor/symfony/config/Resource/ResourceInterface.php b/vendor/symfony/config/Resource/ResourceInterface.php deleted file mode 100644 index d98fd42..0000000 --- a/vendor/symfony/config/Resource/ResourceInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Resource; - -/** - * ResourceInterface is the interface that must be implemented by all Resource classes. - * - * @author Fabien Potencier - */ -interface ResourceInterface -{ - /** - * Returns a string representation of the Resource. - * - * This method is necessary to allow for resource de-duplication, for example by means - * of array_unique(). The string returned need not have a particular meaning, but has - * to be identical for different ResourceInterface instances referring to the same - * resource; and it should be unlikely to collide with that of other, unrelated - * resource instances. - * - * @return string A string representation unique to the underlying Resource - */ - public function __toString(); -} diff --git a/vendor/symfony/config/Resource/SelfCheckingResourceChecker.php b/vendor/symfony/config/Resource/SelfCheckingResourceChecker.php deleted file mode 100644 index eab3323..0000000 --- a/vendor/symfony/config/Resource/SelfCheckingResourceChecker.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Resource; - -use Symfony\Component\Config\ResourceCheckerInterface; - -/** - * Resource checker for instances of SelfCheckingResourceInterface. - * - * As these resources perform the actual check themselves, we can provide - * this class as a standard way of validating them. - * - * @author Matthias Pigulla - */ -class SelfCheckingResourceChecker implements ResourceCheckerInterface -{ - public function supports(ResourceInterface $metadata) - { - return $metadata instanceof SelfCheckingResourceInterface; - } - - public function isFresh(ResourceInterface $resource, int $timestamp) - { - /* @var SelfCheckingResourceInterface $resource */ - return $resource->isFresh($timestamp); - } -} diff --git a/vendor/symfony/config/Resource/SelfCheckingResourceInterface.php b/vendor/symfony/config/Resource/SelfCheckingResourceInterface.php deleted file mode 100644 index c08d969..0000000 --- a/vendor/symfony/config/Resource/SelfCheckingResourceInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Resource; - -/** - * Interface for Resources that can check for freshness autonomously, - * without special support from external services. - * - * @author Matthias Pigulla - */ -interface SelfCheckingResourceInterface extends ResourceInterface -{ - /** - * Returns true if the resource has not been updated since the given timestamp. - * - * @param int $timestamp The last time the resource was loaded - * - * @return bool True if the resource has not been updated, false otherwise - */ - public function isFresh(int $timestamp); -} diff --git a/vendor/symfony/config/ResourceCheckerConfigCache.php b/vendor/symfony/config/ResourceCheckerConfigCache.php deleted file mode 100644 index 753ee4d..0000000 --- a/vendor/symfony/config/ResourceCheckerConfigCache.php +++ /dev/null @@ -1,188 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config; - -use Symfony\Component\Config\Resource\ResourceInterface; -use Symfony\Component\Filesystem\Exception\IOException; -use Symfony\Component\Filesystem\Filesystem; - -/** - * ResourceCheckerConfigCache uses instances of ResourceCheckerInterface - * to check whether cached data is still fresh. - * - * @author Matthias Pigulla - */ -class ResourceCheckerConfigCache implements ConfigCacheInterface -{ - /** - * @var string - */ - private $file; - - /** - * @var iterable|ResourceCheckerInterface[] - */ - private $resourceCheckers; - - /** - * @param string $file The absolute cache path - * @param iterable|ResourceCheckerInterface[] $resourceCheckers The ResourceCheckers to use for the freshness check - */ - public function __construct(string $file, iterable $resourceCheckers = []) - { - $this->file = $file; - $this->resourceCheckers = $resourceCheckers; - } - - /** - * {@inheritdoc} - */ - public function getPath() - { - return $this->file; - } - - /** - * Checks if the cache is still fresh. - * - * This implementation will make a decision solely based on the ResourceCheckers - * passed in the constructor. - * - * The first ResourceChecker that supports a given resource is considered authoritative. - * Resources with no matching ResourceChecker will silently be ignored and considered fresh. - * - * @return bool true if the cache is fresh, false otherwise - */ - public function isFresh() - { - if (!is_file($this->file)) { - return false; - } - - if ($this->resourceCheckers instanceof \Traversable && !$this->resourceCheckers instanceof \Countable) { - $this->resourceCheckers = iterator_to_array($this->resourceCheckers); - } - - if (!\count($this->resourceCheckers)) { - return true; // shortcut - if we don't have any checkers we don't need to bother with the meta file at all - } - - $metadata = $this->getMetaFile(); - - if (!is_file($metadata)) { - return false; - } - - $meta = $this->safelyUnserialize($metadata); - - if (false === $meta) { - return false; - } - - $time = filemtime($this->file); - - foreach ($meta as $resource) { - /* @var ResourceInterface $resource */ - foreach ($this->resourceCheckers as $checker) { - if (!$checker->supports($resource)) { - continue; // next checker - } - if ($checker->isFresh($resource, $time)) { - break; // no need to further check this resource - } - - return false; // cache is stale - } - // no suitable checker found, ignore this resource - } - - return true; - } - - /** - * Writes cache. - * - * @param string $content The content to write in the cache - * @param ResourceInterface[] $metadata An array of metadata - * - * @throws \RuntimeException When cache file can't be written - */ - public function write(string $content, array $metadata = null) - { - $mode = 0666; - $umask = umask(); - $filesystem = new Filesystem(); - $filesystem->dumpFile($this->file, $content); - try { - $filesystem->chmod($this->file, $mode, $umask); - } catch (IOException $e) { - // discard chmod failure (some filesystem may not support it) - } - - if (null !== $metadata) { - $filesystem->dumpFile($this->getMetaFile(), serialize($metadata)); - try { - $filesystem->chmod($this->getMetaFile(), $mode, $umask); - } catch (IOException $e) { - // discard chmod failure (some filesystem may not support it) - } - } - - if (\function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN)) { - @opcache_invalidate($this->file, true); - } - } - - /** - * Gets the meta file path. - */ - private function getMetaFile(): string - { - return $this->file.'.meta'; - } - - private function safelyUnserialize(string $file) - { - $meta = false; - $content = file_get_contents($file); - $signalingException = new \UnexpectedValueException(); - $prevUnserializeHandler = ini_set('unserialize_callback_func', self::class.'::handleUnserializeCallback'); - $prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) use (&$prevErrorHandler, $signalingException) { - if (__FILE__ === $file) { - throw $signalingException; - } - - return $prevErrorHandler ? $prevErrorHandler($type, $msg, $file, $line, $context) : false; - }); - - try { - $meta = unserialize($content); - } catch (\Throwable $e) { - if ($e !== $signalingException) { - throw $e; - } - } finally { - restore_error_handler(); - ini_set('unserialize_callback_func', $prevUnserializeHandler); - } - - return $meta; - } - - /** - * @internal - */ - public static function handleUnserializeCallback($class) - { - trigger_error('Class not found: '.$class); - } -} diff --git a/vendor/symfony/config/ResourceCheckerConfigCacheFactory.php b/vendor/symfony/config/ResourceCheckerConfigCacheFactory.php deleted file mode 100644 index a789644..0000000 --- a/vendor/symfony/config/ResourceCheckerConfigCacheFactory.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config; - -/** - * A ConfigCacheFactory implementation that validates the - * cache with an arbitrary set of ResourceCheckers. - * - * @author Matthias Pigulla - */ -class ResourceCheckerConfigCacheFactory implements ConfigCacheFactoryInterface -{ - private $resourceCheckers = []; - - /** - * @param iterable|ResourceCheckerInterface[] $resourceCheckers - */ - public function __construct(iterable $resourceCheckers = []) - { - $this->resourceCheckers = $resourceCheckers; - } - - /** - * {@inheritdoc} - */ - public function cache(string $file, callable $callable) - { - $cache = new ResourceCheckerConfigCache($file, $this->resourceCheckers); - if (!$cache->isFresh()) { - $callable($cache); - } - - return $cache; - } -} diff --git a/vendor/symfony/config/ResourceCheckerInterface.php b/vendor/symfony/config/ResourceCheckerInterface.php deleted file mode 100644 index 0688f51..0000000 --- a/vendor/symfony/config/ResourceCheckerInterface.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config; - -use Symfony\Component\Config\Resource\ResourceInterface; - -/** - * Interface for ResourceCheckers. - * - * When a ResourceCheckerConfigCache instance is checked for freshness, all its associated - * metadata resources are passed to ResourceCheckers. The ResourceCheckers - * can then inspect the resources and decide whether the cache can be considered - * fresh or not. - * - * @author Matthias Pigulla - * @author Benjamin Klotz - */ -interface ResourceCheckerInterface -{ - /** - * Queries the ResourceChecker whether it can validate a given - * resource or not. - * - * @return bool True if the ResourceChecker can handle this resource type, false if not - */ - public function supports(ResourceInterface $metadata); - - /** - * Validates the resource. - * - * @param int $timestamp The timestamp at which the cache associated with this resource was created - * - * @return bool True if the resource has not changed since the given timestamp, false otherwise - */ - public function isFresh(ResourceInterface $resource, int $timestamp); -} diff --git a/vendor/symfony/config/Util/Exception/InvalidXmlException.php b/vendor/symfony/config/Util/Exception/InvalidXmlException.php deleted file mode 100644 index a335bbd..0000000 --- a/vendor/symfony/config/Util/Exception/InvalidXmlException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Util\Exception; - -/** - * Exception class for when XML parsing with an XSD schema file path or a callable validator produces errors unrelated - * to the actual XML parsing. - * - * @author Ole Rößner - */ -class InvalidXmlException extends XmlParsingException -{ -} diff --git a/vendor/symfony/config/Util/Exception/XmlParsingException.php b/vendor/symfony/config/Util/Exception/XmlParsingException.php deleted file mode 100644 index 9bceed6..0000000 --- a/vendor/symfony/config/Util/Exception/XmlParsingException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Util\Exception; - -/** - * Exception class for when XML cannot be parsed properly. - * - * @author Ole Rößner - */ -class XmlParsingException extends \InvalidArgumentException -{ -} diff --git a/vendor/symfony/config/Util/XmlUtils.php b/vendor/symfony/config/Util/XmlUtils.php deleted file mode 100644 index 5c8d387..0000000 --- a/vendor/symfony/config/Util/XmlUtils.php +++ /dev/null @@ -1,278 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Config\Util; - -use Symfony\Component\Config\Util\Exception\InvalidXmlException; -use Symfony\Component\Config\Util\Exception\XmlParsingException; - -/** - * XMLUtils is a bunch of utility methods to XML operations. - * - * This class contains static methods only and is not meant to be instantiated. - * - * @author Fabien Potencier - * @author Martin Hasoň - * @author Ole Rößner - */ -class XmlUtils -{ - /** - * This class should not be instantiated. - */ - private function __construct() - { - } - - /** - * Parses an XML string. - * - * @param string $content An XML string - * @param string|callable|null $schemaOrCallable An XSD schema file path, a callable, or null to disable validation - * - * @return \DOMDocument - * - * @throws XmlParsingException When parsing of XML file returns error - * @throws InvalidXmlException When parsing of XML with schema or callable produces any errors unrelated to the XML parsing itself - * @throws \RuntimeException When DOM extension is missing - */ - public static function parse(string $content, $schemaOrCallable = null) - { - if (!\extension_loaded('dom')) { - throw new \LogicException('Extension DOM is required.'); - } - - $internalErrors = libxml_use_internal_errors(true); - $disableEntities = libxml_disable_entity_loader(true); - libxml_clear_errors(); - - $dom = new \DOMDocument(); - $dom->validateOnParse = true; - if (!$dom->loadXML($content, LIBXML_NONET | (\defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0))) { - libxml_disable_entity_loader($disableEntities); - - throw new XmlParsingException(implode("\n", static::getXmlErrors($internalErrors))); - } - - $dom->normalizeDocument(); - - libxml_use_internal_errors($internalErrors); - libxml_disable_entity_loader($disableEntities); - - foreach ($dom->childNodes as $child) { - if (XML_DOCUMENT_TYPE_NODE === $child->nodeType) { - throw new XmlParsingException('Document types are not allowed.'); - } - } - - if (null !== $schemaOrCallable) { - $internalErrors = libxml_use_internal_errors(true); - libxml_clear_errors(); - - $e = null; - if (\is_callable($schemaOrCallable)) { - try { - $valid = $schemaOrCallable($dom, $internalErrors); - } catch (\Exception $e) { - $valid = false; - } - } elseif (!\is_array($schemaOrCallable) && is_file((string) $schemaOrCallable)) { - $schemaSource = file_get_contents((string) $schemaOrCallable); - $valid = @$dom->schemaValidateSource($schemaSource); - } else { - libxml_use_internal_errors($internalErrors); - - throw new XmlParsingException('The schemaOrCallable argument has to be a valid path to XSD file or callable.'); - } - - if (!$valid) { - $messages = static::getXmlErrors($internalErrors); - if (empty($messages)) { - throw new InvalidXmlException('The XML is not valid.', 0, $e); - } - throw new XmlParsingException(implode("\n", $messages), 0, $e); - } - } - - libxml_clear_errors(); - libxml_use_internal_errors($internalErrors); - - return $dom; - } - - /** - * Loads an XML file. - * - * @param string $file An XML file path - * @param string|callable|null $schemaOrCallable An XSD schema file path, a callable, or null to disable validation - * - * @return \DOMDocument - * - * @throws \InvalidArgumentException When loading of XML file returns error - * @throws XmlParsingException When XML parsing returns any errors - * @throws \RuntimeException When DOM extension is missing - */ - public static function loadFile(string $file, $schemaOrCallable = null) - { - if (!is_file($file)) { - throw new \InvalidArgumentException(sprintf('Resource "%s" is not a file.', $file)); - } - - if (!is_readable($file)) { - throw new \InvalidArgumentException(sprintf('File "%s" is not readable.', $file)); - } - - $content = @file_get_contents($file); - - if ('' === trim($content)) { - throw new \InvalidArgumentException(sprintf('File "%s" does not contain valid XML, it is empty.', $file)); - } - - try { - return static::parse($content, $schemaOrCallable); - } catch (InvalidXmlException $e) { - throw new XmlParsingException(sprintf('The XML file "%s" is not valid.', $file), 0, $e->getPrevious()); - } - } - - /** - * Converts a \DOMElement object to a PHP array. - * - * The following rules applies during the conversion: - * - * * Each tag is converted to a key value or an array - * if there is more than one "value" - * - * * The content of a tag is set under a "value" key (bar) - * if the tag also has some nested tags - * - * * The attributes are converted to keys () - * - * * The nested-tags are converted to keys (bar) - * - * @param \DOMElement $element A \DOMElement instance - * @param bool $checkPrefix Check prefix in an element or an attribute name - * - * @return mixed - */ - public static function convertDomElementToArray(\DOMElement $element, bool $checkPrefix = true) - { - $prefix = (string) $element->prefix; - $empty = true; - $config = []; - foreach ($element->attributes as $name => $node) { - if ($checkPrefix && !\in_array((string) $node->prefix, ['', $prefix], true)) { - continue; - } - $config[$name] = static::phpize($node->value); - $empty = false; - } - - $nodeValue = false; - foreach ($element->childNodes as $node) { - if ($node instanceof \DOMText) { - if ('' !== trim($node->nodeValue)) { - $nodeValue = trim($node->nodeValue); - $empty = false; - } - } elseif ($checkPrefix && $prefix != (string) $node->prefix) { - continue; - } elseif (!$node instanceof \DOMComment) { - $value = static::convertDomElementToArray($node, $checkPrefix); - - $key = $node->localName; - if (isset($config[$key])) { - if (!\is_array($config[$key]) || !\is_int(key($config[$key]))) { - $config[$key] = [$config[$key]]; - } - $config[$key][] = $value; - } else { - $config[$key] = $value; - } - - $empty = false; - } - } - - if (false !== $nodeValue) { - $value = static::phpize($nodeValue); - if (\count($config)) { - $config['value'] = $value; - } else { - $config = $value; - } - } - - return !$empty ? $config : null; - } - - /** - * Converts an xml value to a PHP type. - * - * @param mixed $value - * - * @return mixed - */ - public static function phpize($value) - { - $value = (string) $value; - $lowercaseValue = strtolower($value); - - switch (true) { - case 'null' === $lowercaseValue: - return null; - case ctype_digit($value): - $raw = $value; - $cast = (int) $value; - - return '0' == $value[0] ? octdec($value) : (((string) $raw === (string) $cast) ? $cast : $raw); - case isset($value[1]) && '-' === $value[0] && ctype_digit(substr($value, 1)): - $raw = $value; - $cast = (int) $value; - - return '0' == $value[1] ? octdec($value) : (((string) $raw === (string) $cast) ? $cast : $raw); - case 'true' === $lowercaseValue: - return true; - case 'false' === $lowercaseValue: - return false; - case isset($value[1]) && '0b' == $value[0].$value[1] && preg_match('/^0b[01]*$/', $value): - return bindec($value); - case is_numeric($value): - return '0x' === $value[0].$value[1] ? hexdec($value) : (float) $value; - case preg_match('/^0x[0-9a-f]++$/i', $value): - return hexdec($value); - case preg_match('/^[+-]?[0-9]+(\.[0-9]+)?$/', $value): - return (float) $value; - default: - return $value; - } - } - - protected static function getXmlErrors(bool $internalErrors) - { - $errors = []; - foreach (libxml_get_errors() as $error) { - $errors[] = sprintf('[%s %s] %s (in %s - line %d, column %d)', - LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR', - $error->code, - trim($error->message), - $error->file ?: 'n/a', - $error->line, - $error->column - ); - } - - libxml_clear_errors(); - libxml_use_internal_errors($internalErrors); - - return $errors; - } -} diff --git a/vendor/symfony/config/composer.json b/vendor/symfony/config/composer.json deleted file mode 100644 index 70072cf..0000000 --- a/vendor/symfony/config/composer.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "symfony/config", - "type": "library", - "description": "Symfony Config Component", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15" - }, - "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^4.4|^5.0" - }, - "conflict": { - "symfony/finder": "<4.4" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Config\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - } -} diff --git a/vendor/symfony/console/Application.php b/vendor/symfony/console/Application.php deleted file mode 100644 index 199ed68..0000000 --- a/vendor/symfony/console/Application.php +++ /dev/null @@ -1,1269 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Command\HelpCommand; -use Symfony\Component\Console\Command\ListCommand; -use Symfony\Component\Console\CommandLoader\CommandLoaderInterface; -use Symfony\Component\Console\Event\ConsoleCommandEvent; -use Symfony\Component\Console\Event\ConsoleErrorEvent; -use Symfony\Component\Console\Event\ConsoleTerminateEvent; -use Symfony\Component\Console\Exception\CommandNotFoundException; -use Symfony\Component\Console\Exception\ExceptionInterface; -use Symfony\Component\Console\Exception\LogicException; -use Symfony\Component\Console\Exception\NamespaceNotFoundException; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Helper\DebugFormatterHelper; -use Symfony\Component\Console\Helper\FormatterHelper; -use Symfony\Component\Console\Helper\Helper; -use Symfony\Component\Console\Helper\HelperSet; -use Symfony\Component\Console\Helper\ProcessHelper; -use Symfony\Component\Console\Helper\QuestionHelper; -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputAwareInterface; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Debug\ErrorHandler as LegacyErrorHandler; -use Symfony\Component\Debug\Exception\FatalThrowableError; -use Symfony\Component\ErrorHandler\ErrorHandler; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; -use Symfony\Contracts\Service\ResetInterface; - -/** - * An Application is the container for a collection of commands. - * - * It is the main entry point of a Console application. - * - * This class is optimized for a standard CLI environment. - * - * Usage: - * - * $app = new Application('myapp', '1.0 (stable)'); - * $app->add(new SimpleCommand()); - * $app->run(); - * - * @author Fabien Potencier - */ -class Application implements ResetInterface -{ - private $commands = []; - private $wantHelps = false; - private $runningCommand; - private $name; - private $version; - private $commandLoader; - private $catchExceptions = true; - private $autoExit = true; - private $definition; - private $helperSet; - private $dispatcher; - private $terminal; - private $defaultCommand; - private $singleCommand = false; - private $initialized; - - /** - * @param string $name The name of the application - * @param string $version The version of the application - */ - public function __construct(string $name = 'UNKNOWN', string $version = 'UNKNOWN') - { - $this->name = $name; - $this->version = $version; - $this->terminal = new Terminal(); - $this->defaultCommand = 'list'; - } - - /** - * @final since Symfony 4.3, the type-hint will be updated to the interface from symfony/contracts in 5.0 - */ - public function setDispatcher(EventDispatcherInterface $dispatcher) - { - $this->dispatcher = LegacyEventDispatcherProxy::decorate($dispatcher); - } - - public function setCommandLoader(CommandLoaderInterface $commandLoader) - { - $this->commandLoader = $commandLoader; - } - - /** - * Runs the current application. - * - * @return int 0 if everything went fine, or an error code - * - * @throws \Exception When running fails. Bypass this when {@link setCatchExceptions()}. - */ - public function run(InputInterface $input = null, OutputInterface $output = null) - { - putenv('LINES='.$this->terminal->getHeight()); - putenv('COLUMNS='.$this->terminal->getWidth()); - - if (null === $input) { - $input = new ArgvInput(); - } - - if (null === $output) { - $output = new ConsoleOutput(); - } - - $renderException = function (\Throwable $e) use ($output) { - if ($output instanceof ConsoleOutputInterface) { - $this->renderThrowable($e, $output->getErrorOutput()); - } else { - $this->renderThrowable($e, $output); - } - }; - if ($phpHandler = set_exception_handler($renderException)) { - restore_exception_handler(); - if (!\is_array($phpHandler) || (!$phpHandler[0] instanceof ErrorHandler && !$phpHandler[0] instanceof LegacyErrorHandler)) { - $errorHandler = true; - } elseif ($errorHandler = $phpHandler[0]->setExceptionHandler($renderException)) { - $phpHandler[0]->setExceptionHandler($errorHandler); - } - } - - $this->configureIO($input, $output); - - try { - $exitCode = $this->doRun($input, $output); - } catch (\Exception $e) { - if (!$this->catchExceptions) { - throw $e; - } - - $renderException($e); - - $exitCode = $e->getCode(); - if (is_numeric($exitCode)) { - $exitCode = (int) $exitCode; - if (0 === $exitCode) { - $exitCode = 1; - } - } else { - $exitCode = 1; - } - } finally { - // if the exception handler changed, keep it - // otherwise, unregister $renderException - if (!$phpHandler) { - if (set_exception_handler($renderException) === $renderException) { - restore_exception_handler(); - } - restore_exception_handler(); - } elseif (!$errorHandler) { - $finalHandler = $phpHandler[0]->setExceptionHandler(null); - if ($finalHandler !== $renderException) { - $phpHandler[0]->setExceptionHandler($finalHandler); - } - } - } - - if ($this->autoExit) { - if ($exitCode > 255) { - $exitCode = 255; - } - - exit($exitCode); - } - - return $exitCode; - } - - /** - * Runs the current application. - * - * @return int 0 if everything went fine, or an error code - */ - public function doRun(InputInterface $input, OutputInterface $output) - { - if (true === $input->hasParameterOption(['--version', '-V'], true)) { - $output->writeln($this->getLongVersion()); - - return 0; - } - - try { - // Makes ArgvInput::getFirstArgument() able to distinguish an option from an argument. - $input->bind($this->getDefinition()); - } catch (ExceptionInterface $e) { - // Errors must be ignored, full binding/validation happens later when the command is known. - } - - $name = $this->getCommandName($input); - if (true === $input->hasParameterOption(['--help', '-h'], true)) { - if (!$name) { - $name = 'help'; - $input = new ArrayInput(['command_name' => $this->defaultCommand]); - } else { - $this->wantHelps = true; - } - } - - if (!$name) { - $name = $this->defaultCommand; - $definition = $this->getDefinition(); - $definition->setArguments(array_merge( - $definition->getArguments(), - [ - 'command' => new InputArgument('command', InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name), - ] - )); - } - - try { - $this->runningCommand = null; - // the command name MUST be the first element of the input - $command = $this->find($name); - } catch (\Throwable $e) { - if (!($e instanceof CommandNotFoundException && !$e instanceof NamespaceNotFoundException) || 1 !== \count($alternatives = $e->getAlternatives()) || !$input->isInteractive()) { - if (null !== $this->dispatcher) { - $event = new ConsoleErrorEvent($input, $output, $e); - $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); - - if (0 === $event->getExitCode()) { - return 0; - } - - $e = $event->getError(); - } - - throw $e; - } - - $alternative = $alternatives[0]; - - $style = new SymfonyStyle($input, $output); - $style->block(sprintf("\nCommand \"%s\" is not defined.\n", $name), null, 'error'); - if (!$style->confirm(sprintf('Do you want to run "%s" instead? ', $alternative), false)) { - if (null !== $this->dispatcher) { - $event = new ConsoleErrorEvent($input, $output, $e); - $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); - - return $event->getExitCode(); - } - - return 1; - } - - $command = $this->find($alternative); - } - - $this->runningCommand = $command; - $exitCode = $this->doRunCommand($command, $input, $output); - $this->runningCommand = null; - - return $exitCode; - } - - /** - * {@inheritdoc} - */ - public function reset() - { - } - - public function setHelperSet(HelperSet $helperSet) - { - $this->helperSet = $helperSet; - } - - /** - * Get the helper set associated with the command. - * - * @return HelperSet The HelperSet instance associated with this command - */ - public function getHelperSet() - { - if (!$this->helperSet) { - $this->helperSet = $this->getDefaultHelperSet(); - } - - return $this->helperSet; - } - - public function setDefinition(InputDefinition $definition) - { - $this->definition = $definition; - } - - /** - * Gets the InputDefinition related to this Application. - * - * @return InputDefinition The InputDefinition instance - */ - public function getDefinition() - { - if (!$this->definition) { - $this->definition = $this->getDefaultInputDefinition(); - } - - if ($this->singleCommand) { - $inputDefinition = $this->definition; - $inputDefinition->setArguments(); - - return $inputDefinition; - } - - return $this->definition; - } - - /** - * Gets the help message. - * - * @return string A help message - */ - public function getHelp() - { - return $this->getLongVersion(); - } - - /** - * Gets whether to catch exceptions or not during commands execution. - * - * @return bool Whether to catch exceptions or not during commands execution - */ - public function areExceptionsCaught() - { - return $this->catchExceptions; - } - - /** - * Sets whether to catch exceptions or not during commands execution. - * - * @param bool $boolean Whether to catch exceptions or not during commands execution - */ - public function setCatchExceptions($boolean) - { - $this->catchExceptions = (bool) $boolean; - } - - /** - * Gets whether to automatically exit after a command execution or not. - * - * @return bool Whether to automatically exit after a command execution or not - */ - public function isAutoExitEnabled() - { - return $this->autoExit; - } - - /** - * Sets whether to automatically exit after a command execution or not. - * - * @param bool $boolean Whether to automatically exit after a command execution or not - */ - public function setAutoExit($boolean) - { - $this->autoExit = (bool) $boolean; - } - - /** - * Gets the name of the application. - * - * @return string The application name - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the application name. - * - * @param string $name The application name - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Gets the application version. - * - * @return string The application version - */ - public function getVersion() - { - return $this->version; - } - - /** - * Sets the application version. - * - * @param string $version The application version - */ - public function setVersion($version) - { - $this->version = $version; - } - - /** - * Returns the long version of the application. - * - * @return string The long application version - */ - public function getLongVersion() - { - if ('UNKNOWN' !== $this->getName()) { - if ('UNKNOWN' !== $this->getVersion()) { - return sprintf('%s %s', $this->getName(), $this->getVersion()); - } - - return $this->getName(); - } - - return 'Console Tool'; - } - - /** - * Registers a new command. - * - * @param string $name The command name - * - * @return Command The newly created command - */ - public function register($name) - { - return $this->add(new Command($name)); - } - - /** - * Adds an array of command objects. - * - * If a Command is not enabled it will not be added. - * - * @param Command[] $commands An array of commands - */ - public function addCommands(array $commands) - { - foreach ($commands as $command) { - $this->add($command); - } - } - - /** - * Adds a command object. - * - * If a command with the same name already exists, it will be overridden. - * If the command is not enabled it will not be added. - * - * @return Command|null The registered command if enabled or null - */ - public function add(Command $command) - { - $this->init(); - - $command->setApplication($this); - - if (!$command->isEnabled()) { - $command->setApplication(null); - - return null; - } - - // Will throw if the command is not correctly initialized. - $command->getDefinition(); - - if (!$command->getName()) { - throw new LogicException(sprintf('The command defined in "%s" cannot have an empty name.', \get_class($command))); - } - - $this->commands[$command->getName()] = $command; - - foreach ($command->getAliases() as $alias) { - $this->commands[$alias] = $command; - } - - return $command; - } - - /** - * Returns a registered command by name or alias. - * - * @param string $name The command name or alias - * - * @return Command A Command object - * - * @throws CommandNotFoundException When given command name does not exist - */ - public function get($name) - { - $this->init(); - - if (!$this->has($name)) { - throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name)); - } - - $command = $this->commands[$name]; - - if ($this->wantHelps) { - $this->wantHelps = false; - - $helpCommand = $this->get('help'); - $helpCommand->setCommand($command); - - return $helpCommand; - } - - return $command; - } - - /** - * Returns true if the command exists, false otherwise. - * - * @param string $name The command name or alias - * - * @return bool true if the command exists, false otherwise - */ - public function has($name) - { - $this->init(); - - return isset($this->commands[$name]) || ($this->commandLoader && $this->commandLoader->has($name) && $this->add($this->commandLoader->get($name))); - } - - /** - * Returns an array of all unique namespaces used by currently registered commands. - * - * It does not return the global namespace which always exists. - * - * @return string[] An array of namespaces - */ - public function getNamespaces() - { - $namespaces = []; - foreach ($this->all() as $command) { - if ($command->isHidden()) { - continue; - } - - $namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName())); - - foreach ($command->getAliases() as $alias) { - $namespaces = array_merge($namespaces, $this->extractAllNamespaces($alias)); - } - } - - return array_values(array_unique(array_filter($namespaces))); - } - - /** - * Finds a registered namespace by a name or an abbreviation. - * - * @param string $namespace A namespace or abbreviation to search for - * - * @return string A registered namespace - * - * @throws NamespaceNotFoundException When namespace is incorrect or ambiguous - */ - public function findNamespace($namespace) - { - $allNamespaces = $this->getNamespaces(); - $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $namespace); - $namespaces = preg_grep('{^'.$expr.'}', $allNamespaces); - - if (empty($namespaces)) { - $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace); - - if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) { - if (1 == \count($alternatives)) { - $message .= "\n\nDid you mean this?\n "; - } else { - $message .= "\n\nDid you mean one of these?\n "; - } - - $message .= implode("\n ", $alternatives); - } - - throw new NamespaceNotFoundException($message, $alternatives); - } - - $exact = \in_array($namespace, $namespaces, true); - if (\count($namespaces) > 1 && !$exact) { - throw new NamespaceNotFoundException(sprintf("The namespace \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $namespace, $this->getAbbreviationSuggestions(array_values($namespaces))), array_values($namespaces)); - } - - return $exact ? $namespace : reset($namespaces); - } - - /** - * Finds a command by name or alias. - * - * Contrary to get, this command tries to find the best - * match if you give it an abbreviation of a name or alias. - * - * @param string $name A command name or a command alias - * - * @return Command A Command instance - * - * @throws CommandNotFoundException When command name is incorrect or ambiguous - */ - public function find($name) - { - $this->init(); - - $aliases = []; - - foreach ($this->commands as $command) { - foreach ($command->getAliases() as $alias) { - if (!$this->has($alias)) { - $this->commands[$alias] = $command; - } - } - } - - if ($this->has($name)) { - return $this->get($name); - } - - $allCommands = $this->commandLoader ? array_merge($this->commandLoader->getNames(), array_keys($this->commands)) : array_keys($this->commands); - $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $name); - $commands = preg_grep('{^'.$expr.'}', $allCommands); - - if (empty($commands)) { - $commands = preg_grep('{^'.$expr.'}i', $allCommands); - } - - // if no commands matched or we just matched namespaces - if (empty($commands) || \count(preg_grep('{^'.$expr.'$}i', $commands)) < 1) { - if (false !== $pos = strrpos($name, ':')) { - // check if a namespace exists and contains commands - $this->findNamespace(substr($name, 0, $pos)); - } - - $message = sprintf('Command "%s" is not defined.', $name); - - if ($alternatives = $this->findAlternatives($name, $allCommands)) { - // remove hidden commands - $alternatives = array_filter($alternatives, function ($name) { - return !$this->get($name)->isHidden(); - }); - - if (1 == \count($alternatives)) { - $message .= "\n\nDid you mean this?\n "; - } else { - $message .= "\n\nDid you mean one of these?\n "; - } - $message .= implode("\n ", $alternatives); - } - - throw new CommandNotFoundException($message, array_values($alternatives)); - } - - // filter out aliases for commands which are already on the list - if (\count($commands) > 1) { - $commandList = $this->commandLoader ? array_merge(array_flip($this->commandLoader->getNames()), $this->commands) : $this->commands; - $commands = array_unique(array_filter($commands, function ($nameOrAlias) use (&$commandList, $commands, &$aliases) { - if (!$commandList[$nameOrAlias] instanceof Command) { - $commandList[$nameOrAlias] = $this->commandLoader->get($nameOrAlias); - } - - $commandName = $commandList[$nameOrAlias]->getName(); - - $aliases[$nameOrAlias] = $commandName; - - return $commandName === $nameOrAlias || !\in_array($commandName, $commands); - })); - } - - if (\count($commands) > 1) { - $usableWidth = $this->terminal->getWidth() - 10; - $abbrevs = array_values($commands); - $maxLen = 0; - foreach ($abbrevs as $abbrev) { - $maxLen = max(Helper::strlen($abbrev), $maxLen); - } - $abbrevs = array_map(function ($cmd) use ($commandList, $usableWidth, $maxLen, &$commands) { - if ($commandList[$cmd]->isHidden()) { - unset($commands[array_search($cmd, $commands)]); - - return false; - } - - $abbrev = str_pad($cmd, $maxLen, ' ').' '.$commandList[$cmd]->getDescription(); - - return Helper::strlen($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3).'...' : $abbrev; - }, array_values($commands)); - - if (\count($commands) > 1) { - $suggestions = $this->getAbbreviationSuggestions(array_filter($abbrevs)); - - throw new CommandNotFoundException(sprintf("Command \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $name, $suggestions), array_values($commands)); - } - } - - $command = $this->get(reset($commands)); - - if ($command->isHidden()) { - @trigger_error(sprintf('Command "%s" is hidden, finding it using an abbreviation is deprecated since Symfony 4.4, use its full name instead.', $command->getName()), E_USER_DEPRECATED); - } - - return $command; - } - - /** - * Gets the commands (registered in the given namespace if provided). - * - * The array keys are the full names and the values the command instances. - * - * @param string $namespace A namespace name - * - * @return Command[] An array of Command instances - */ - public function all($namespace = null) - { - $this->init(); - - if (null === $namespace) { - if (!$this->commandLoader) { - return $this->commands; - } - - $commands = $this->commands; - foreach ($this->commandLoader->getNames() as $name) { - if (!isset($commands[$name]) && $this->has($name)) { - $commands[$name] = $this->get($name); - } - } - - return $commands; - } - - $commands = []; - foreach ($this->commands as $name => $command) { - if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) { - $commands[$name] = $command; - } - } - - if ($this->commandLoader) { - foreach ($this->commandLoader->getNames() as $name) { - if (!isset($commands[$name]) && $namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1) && $this->has($name)) { - $commands[$name] = $this->get($name); - } - } - } - - return $commands; - } - - /** - * Returns an array of possible abbreviations given a set of names. - * - * @param array $names An array of names - * - * @return array An array of abbreviations - */ - public static function getAbbreviations($names) - { - $abbrevs = []; - foreach ($names as $name) { - for ($len = \strlen($name); $len > 0; --$len) { - $abbrev = substr($name, 0, $len); - $abbrevs[$abbrev][] = $name; - } - } - - return $abbrevs; - } - - /** - * Renders a caught exception. - * - * @deprecated since Symfony 4.4, use "renderThrowable()" instead - */ - public function renderException(\Exception $e, OutputInterface $output) - { - @trigger_error(sprintf('The "%s::renderException()" method is deprecated since Symfony 4.4, use "renderThrowable()" instead.', __CLASS__), E_USER_DEPRECATED); - - $output->writeln('', OutputInterface::VERBOSITY_QUIET); - - $this->doRenderException($e, $output); - - $this->finishRenderThrowableOrException($output); - } - - public function renderThrowable(\Throwable $e, OutputInterface $output): void - { - if (__CLASS__ !== static::class && __CLASS__ === (new \ReflectionMethod($this, 'renderThrowable'))->getDeclaringClass()->getName() && __CLASS__ !== (new \ReflectionMethod($this, 'renderException'))->getDeclaringClass()->getName()) { - @trigger_error(sprintf('The "%s::renderException()" method is deprecated since Symfony 4.4, use "renderThrowable()" instead.', __CLASS__), E_USER_DEPRECATED); - - if (!$e instanceof \Exception) { - $e = class_exists(FatalThrowableError::class) ? new FatalThrowableError($e) : new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine()); - } - - $this->renderException($e, $output); - - return; - } - - $output->writeln('', OutputInterface::VERBOSITY_QUIET); - - $this->doRenderThrowable($e, $output); - - $this->finishRenderThrowableOrException($output); - } - - private function finishRenderThrowableOrException(OutputInterface $output): void - { - if (null !== $this->runningCommand) { - $output->writeln(sprintf('%s', sprintf($this->runningCommand->getSynopsis(), $this->getName())), OutputInterface::VERBOSITY_QUIET); - $output->writeln('', OutputInterface::VERBOSITY_QUIET); - } - } - - /** - * @deprecated since Symfony 4.4, use "doRenderThrowable()" instead - */ - protected function doRenderException(\Exception $e, OutputInterface $output) - { - @trigger_error(sprintf('The "%s::doRenderException()" method is deprecated since Symfony 4.4, use "doRenderThrowable()" instead.', __CLASS__), E_USER_DEPRECATED); - - $this->doActuallyRenderThrowable($e, $output); - } - - protected function doRenderThrowable(\Throwable $e, OutputInterface $output): void - { - if (__CLASS__ !== static::class && __CLASS__ === (new \ReflectionMethod($this, 'doRenderThrowable'))->getDeclaringClass()->getName() && __CLASS__ !== (new \ReflectionMethod($this, 'doRenderException'))->getDeclaringClass()->getName()) { - @trigger_error(sprintf('The "%s::doRenderException()" method is deprecated since Symfony 4.4, use "doRenderThrowable()" instead.', __CLASS__), E_USER_DEPRECATED); - - if (!$e instanceof \Exception) { - $e = class_exists(FatalThrowableError::class) ? new FatalThrowableError($e) : new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine()); - } - - $this->doRenderException($e, $output); - - return; - } - - $this->doActuallyRenderThrowable($e, $output); - } - - private function doActuallyRenderThrowable(\Throwable $e, OutputInterface $output): void - { - do { - $message = trim($e->getMessage()); - if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { - $class = get_debug_type($e); - $title = sprintf(' [%s%s] ', $class, 0 !== ($code = $e->getCode()) ? ' ('.$code.')' : ''); - $len = Helper::strlen($title); - } else { - $len = 0; - } - - if (false !== strpos($message, "@anonymous\0")) { - $message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) { - return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; - }, $message); - } - - $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : PHP_INT_MAX; - $lines = []; - foreach ('' !== $message ? preg_split('/\r?\n/', $message) : [] as $line) { - foreach ($this->splitStringByWidth($line, $width - 4) as $line) { - // pre-format lines to get the right string length - $lineLength = Helper::strlen($line) + 4; - $lines[] = [$line, $lineLength]; - - $len = max($lineLength, $len); - } - } - - $messages = []; - if (!$e instanceof ExceptionInterface || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { - $messages[] = sprintf('%s', OutputFormatter::escape(sprintf('In %s line %s:', basename($e->getFile()) ?: 'n/a', $e->getLine() ?: 'n/a'))); - } - $messages[] = $emptyLine = sprintf('%s', str_repeat(' ', $len)); - if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { - $messages[] = sprintf('%s%s', $title, str_repeat(' ', max(0, $len - Helper::strlen($title)))); - } - foreach ($lines as $line) { - $messages[] = sprintf(' %s %s', OutputFormatter::escape($line[0]), str_repeat(' ', $len - $line[1])); - } - $messages[] = $emptyLine; - $messages[] = ''; - - $output->writeln($messages, OutputInterface::VERBOSITY_QUIET); - - if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { - $output->writeln('Exception trace:', OutputInterface::VERBOSITY_QUIET); - - // exception related properties - $trace = $e->getTrace(); - - array_unshift($trace, [ - 'function' => '', - 'file' => $e->getFile() ?: 'n/a', - 'line' => $e->getLine() ?: 'n/a', - 'args' => [], - ]); - - for ($i = 0, $count = \count($trace); $i < $count; ++$i) { - $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : ''; - $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : ''; - $function = isset($trace[$i]['function']) ? $trace[$i]['function'] : ''; - $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a'; - $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a'; - - $output->writeln(sprintf(' %s%s at %s:%s', $class, $function ? $type.$function.'()' : '', $file, $line), OutputInterface::VERBOSITY_QUIET); - } - - $output->writeln('', OutputInterface::VERBOSITY_QUIET); - } - } while ($e = $e->getPrevious()); - } - - /** - * Configures the input and output instances based on the user arguments and options. - */ - protected function configureIO(InputInterface $input, OutputInterface $output) - { - if (true === $input->hasParameterOption(['--ansi'], true)) { - $output->setDecorated(true); - } elseif (true === $input->hasParameterOption(['--no-ansi'], true)) { - $output->setDecorated(false); - } - - if (true === $input->hasParameterOption(['--no-interaction', '-n'], true)) { - $input->setInteractive(false); - } - - switch ($shellVerbosity = (int) getenv('SHELL_VERBOSITY')) { - case -1: $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); break; - case 1: $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); break; - case 2: $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); break; - case 3: $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); break; - default: $shellVerbosity = 0; break; - } - - if (true === $input->hasParameterOption(['--quiet', '-q'], true)) { - $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); - $shellVerbosity = -1; - } else { - if ($input->hasParameterOption('-vvv', true) || $input->hasParameterOption('--verbose=3', true) || 3 === $input->getParameterOption('--verbose', false, true)) { - $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); - $shellVerbosity = 3; - } elseif ($input->hasParameterOption('-vv', true) || $input->hasParameterOption('--verbose=2', true) || 2 === $input->getParameterOption('--verbose', false, true)) { - $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); - $shellVerbosity = 2; - } elseif ($input->hasParameterOption('-v', true) || $input->hasParameterOption('--verbose=1', true) || $input->hasParameterOption('--verbose', true) || $input->getParameterOption('--verbose', false, true)) { - $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); - $shellVerbosity = 1; - } - } - - if (-1 === $shellVerbosity) { - $input->setInteractive(false); - } - - putenv('SHELL_VERBOSITY='.$shellVerbosity); - $_ENV['SHELL_VERBOSITY'] = $shellVerbosity; - $_SERVER['SHELL_VERBOSITY'] = $shellVerbosity; - } - - /** - * Runs the current command. - * - * If an event dispatcher has been attached to the application, - * events are also dispatched during the life-cycle of the command. - * - * @return int 0 if everything went fine, or an error code - */ - protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output) - { - foreach ($command->getHelperSet() as $helper) { - if ($helper instanceof InputAwareInterface) { - $helper->setInput($input); - } - } - - if (null === $this->dispatcher) { - return $command->run($input, $output); - } - - // bind before the console.command event, so the listeners have access to input options/arguments - try { - $command->mergeApplicationDefinition(); - $input->bind($command->getDefinition()); - } catch (ExceptionInterface $e) { - // ignore invalid options/arguments for now, to allow the event listeners to customize the InputDefinition - } - - $event = new ConsoleCommandEvent($command, $input, $output); - $e = null; - - try { - $this->dispatcher->dispatch($event, ConsoleEvents::COMMAND); - - if ($event->commandShouldRun()) { - $exitCode = $command->run($input, $output); - } else { - $exitCode = ConsoleCommandEvent::RETURN_CODE_DISABLED; - } - } catch (\Throwable $e) { - $event = new ConsoleErrorEvent($input, $output, $e, $command); - $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); - $e = $event->getError(); - - if (0 === $exitCode = $event->getExitCode()) { - $e = null; - } - } - - $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode); - $this->dispatcher->dispatch($event, ConsoleEvents::TERMINATE); - - if (null !== $e) { - throw $e; - } - - return $event->getExitCode(); - } - - /** - * Gets the name of the command based on input. - * - * @return string|null - */ - protected function getCommandName(InputInterface $input) - { - return $this->singleCommand ? $this->defaultCommand : $input->getFirstArgument(); - } - - /** - * Gets the default input definition. - * - * @return InputDefinition An InputDefinition instance - */ - protected function getDefaultInputDefinition() - { - return new InputDefinition([ - new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'), - - new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message'), - new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'), - new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'), - new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version'), - new InputOption('--ansi', '', InputOption::VALUE_NONE, 'Force ANSI output'), - new InputOption('--no-ansi', '', InputOption::VALUE_NONE, 'Disable ANSI output'), - new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question'), - ]); - } - - /** - * Gets the default commands that should always be available. - * - * @return Command[] An array of default Command instances - */ - protected function getDefaultCommands() - { - return [new HelpCommand(), new ListCommand()]; - } - - /** - * Gets the default helper set with the helpers that should always be available. - * - * @return HelperSet A HelperSet instance - */ - protected function getDefaultHelperSet() - { - return new HelperSet([ - new FormatterHelper(), - new DebugFormatterHelper(), - new ProcessHelper(), - new QuestionHelper(), - ]); - } - - /** - * Returns abbreviated suggestions in string format. - */ - private function getAbbreviationSuggestions(array $abbrevs): string - { - return ' '.implode("\n ", $abbrevs); - } - - /** - * Returns the namespace part of the command name. - * - * This method is not part of public API and should not be used directly. - * - * @param string $name The full name of the command - * @param string $limit The maximum number of parts of the namespace - * - * @return string The namespace of the command - */ - public function extractNamespace($name, $limit = null) - { - $parts = explode(':', $name, -1); - - return implode(':', null === $limit ? $parts : \array_slice($parts, 0, $limit)); - } - - /** - * Finds alternative of $name among $collection, - * if nothing is found in $collection, try in $abbrevs. - * - * @return string[] A sorted array of similar string - */ - private function findAlternatives(string $name, iterable $collection): array - { - $threshold = 1e3; - $alternatives = []; - - $collectionParts = []; - foreach ($collection as $item) { - $collectionParts[$item] = explode(':', $item); - } - - foreach (explode(':', $name) as $i => $subname) { - foreach ($collectionParts as $collectionName => $parts) { - $exists = isset($alternatives[$collectionName]); - if (!isset($parts[$i]) && $exists) { - $alternatives[$collectionName] += $threshold; - continue; - } elseif (!isset($parts[$i])) { - continue; - } - - $lev = levenshtein($subname, $parts[$i]); - if ($lev <= \strlen($subname) / 3 || '' !== $subname && false !== strpos($parts[$i], $subname)) { - $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev; - } elseif ($exists) { - $alternatives[$collectionName] += $threshold; - } - } - } - - foreach ($collection as $item) { - $lev = levenshtein($name, $item); - if ($lev <= \strlen($name) / 3 || false !== strpos($item, $name)) { - $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev; - } - } - - $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { return $lev < 2 * $threshold; }); - ksort($alternatives, SORT_NATURAL | SORT_FLAG_CASE); - - return array_keys($alternatives); - } - - /** - * Sets the default Command name. - * - * @param string $commandName The Command name - * @param bool $isSingleCommand Set to true if there is only one command in this application - * - * @return self - */ - public function setDefaultCommand($commandName, $isSingleCommand = false) - { - $this->defaultCommand = $commandName; - - if ($isSingleCommand) { - // Ensure the command exist - $this->find($commandName); - - $this->singleCommand = true; - } - - return $this; - } - - /** - * @internal - */ - public function isSingleCommand(): bool - { - return $this->singleCommand; - } - - private function splitStringByWidth(string $string, int $width): array - { - // str_split is not suitable for multi-byte characters, we should use preg_split to get char array properly. - // additionally, array_slice() is not enough as some character has doubled width. - // we need a function to split string not by character count but by string width - if (false === $encoding = mb_detect_encoding($string, null, true)) { - return str_split($string, $width); - } - - $utf8String = mb_convert_encoding($string, 'utf8', $encoding); - $lines = []; - $line = ''; - - $offset = 0; - while (preg_match('/.{1,10000}/u', $utf8String, $m, 0, $offset)) { - $offset += \strlen($m[0]); - - foreach (preg_split('//u', $m[0]) as $char) { - // test if $char could be appended to current line - if (mb_strwidth($line.$char, 'utf8') <= $width) { - $line .= $char; - continue; - } - // if not, push current line to array and make new line - $lines[] = str_pad($line, $width); - $line = $char; - } - } - - $lines[] = \count($lines) ? str_pad($line, $width) : $line; - - mb_convert_variables($encoding, 'utf8', $lines); - - return $lines; - } - - /** - * Returns all namespaces of the command name. - * - * @return string[] The namespaces of the command - */ - private function extractAllNamespaces(string $name): array - { - // -1 as third argument is needed to skip the command short name when exploding - $parts = explode(':', $name, -1); - $namespaces = []; - - foreach ($parts as $part) { - if (\count($namespaces)) { - $namespaces[] = end($namespaces).':'.$part; - } else { - $namespaces[] = $part; - } - } - - return $namespaces; - } - - private function init() - { - if ($this->initialized) { - return; - } - $this->initialized = true; - - foreach ($this->getDefaultCommands() as $command) { - $this->add($command); - } - } -} diff --git a/vendor/symfony/console/CHANGELOG.md b/vendor/symfony/console/CHANGELOG.md deleted file mode 100644 index 482c8cd..0000000 --- a/vendor/symfony/console/CHANGELOG.md +++ /dev/null @@ -1,162 +0,0 @@ -CHANGELOG -========= - -4.4.0 ------ - - * deprecated finding hidden commands using an abbreviation, use the full name instead - * added `Question::setTrimmable` default to true to allow the answer to be trimmed - * added method `minSecondsBetweenRedraws()` and `maxSecondsBetweenRedraws()` on `ProgressBar` - * `Application` implements `ResetInterface` - * marked all dispatched event classes as `@final` - * added support for displaying table horizontally - * deprecated returning `null` from `Command::execute()`, return `0` instead - * Deprecated the `Application::renderException()` and `Application::doRenderException()` methods, - use `renderThrowable()` and `doRenderThrowable()` instead. - * added support for the `NO_COLOR` env var (https://no-color.org/) - -4.3.0 ------ - - * added support for hyperlinks - * added `ProgressBar::iterate()` method that simplify updating the progress bar when iterating - * added `Question::setAutocompleterCallback()` to provide a callback function - that dynamically generates suggestions as the user types - -4.2.0 ------ - - * allowed passing commands as `[$process, 'ENV_VAR' => 'value']` to - `ProcessHelper::run()` to pass environment variables - * deprecated passing a command as a string to `ProcessHelper::run()`, - pass it the command as an array of its arguments instead - * made the `ProcessHelper` class final - * added `WrappableOutputFormatterInterface::formatAndWrap()` (implemented in `OutputFormatter`) - * added `capture_stderr_separately` option to `CommandTester::execute()` - -4.1.0 ------ - - * added option to run suggested command if command is not found and only 1 alternative is available - * added option to modify console output and print multiple modifiable sections - * added support for iterable messages in output `write` and `writeln` methods - -4.0.0 ------ - - * `OutputFormatter` throws an exception when unknown options are used - * removed `QuestionHelper::setInputStream()/getInputStream()` - * removed `Application::getTerminalWidth()/getTerminalHeight()` and - `Application::setTerminalDimensions()/getTerminalDimensions()` -* removed `ConsoleExceptionEvent` -* removed `ConsoleEvents::EXCEPTION` - -3.4.0 ------ - - * added `SHELL_VERBOSITY` env var to control verbosity - * added `CommandLoaderInterface`, `FactoryCommandLoader` and PSR-11 - `ContainerCommandLoader` for commands lazy-loading - * added a case-insensitive command name matching fallback - * added static `Command::$defaultName/getDefaultName()`, allowing for - commands to be registered at compile time in the application command loader. - Setting the `$defaultName` property avoids the need for filling the `command` - attribute on the `console.command` tag when using `AddConsoleCommandPass`. - -3.3.0 ------ - -* added `ExceptionListener` -* added `AddConsoleCommandPass` (originally in FrameworkBundle) -* [BC BREAK] `Input::getOption()` no longer returns the default value for options - with value optional explicitly passed empty -* added console.error event to catch exceptions thrown by other listeners -* deprecated console.exception event in favor of console.error -* added ability to handle `CommandNotFoundException` through the - `console.error` event -* deprecated default validation in `SymfonyQuestionHelper::ask` - -3.2.0 ------- - -* added `setInputs()` method to CommandTester for ease testing of commands expecting inputs -* added `setStream()` and `getStream()` methods to Input (implement StreamableInputInterface) -* added StreamableInputInterface -* added LockableTrait - -3.1.0 ------ - - * added truncate method to FormatterHelper - * added setColumnWidth(s) method to Table - -2.8.3 ------ - - * remove readline support from the question helper as it caused issues - -2.8.0 ------ - - * use readline for user input in the question helper when available to allow - the use of arrow keys - -2.6.0 ------ - - * added a Process helper - * added a DebugFormatter helper - -2.5.0 ------ - - * deprecated the dialog helper (use the question helper instead) - * deprecated TableHelper in favor of Table - * deprecated ProgressHelper in favor of ProgressBar - * added ConsoleLogger - * added a question helper - * added a way to set the process name of a command - * added a way to set a default command instead of `ListCommand` - -2.4.0 ------ - - * added a way to force terminal dimensions - * added a convenient method to detect verbosity level - * [BC BREAK] made descriptors use output instead of returning a string - -2.3.0 ------ - - * added multiselect support to the select dialog helper - * added Table Helper for tabular data rendering - * added support for events in `Application` - * added a way to normalize EOLs in `ApplicationTester::getDisplay()` and `CommandTester::getDisplay()` - * added a way to set the progress bar progress via the `setCurrent` method - * added support for multiple InputOption shortcuts, written as `'-a|-b|-c'` - * added two additional verbosity levels, VERBOSITY_VERY_VERBOSE and VERBOSITY_DEBUG - -2.2.0 ------ - - * added support for colorization on Windows via ConEmu - * add a method to Dialog Helper to ask for a question and hide the response - * added support for interactive selections in console (DialogHelper::select()) - * added support for autocompletion as you type in Dialog Helper - -2.1.0 ------ - - * added ConsoleOutputInterface - * added the possibility to disable a command (Command::isEnabled()) - * added suggestions when a command does not exist - * added a --raw option to the list command - * added support for STDERR in the console output class (errors are now sent - to STDERR) - * made the defaults (helper set, commands, input definition) in Application - more easily customizable - * added support for the shell even if readline is not available - * added support for process isolation in Symfony shell via - `--process-isolation` switch - * added support for `--`, which disables options parsing after that point - (tokens will be parsed as arguments) diff --git a/vendor/symfony/console/Command/Command.php b/vendor/symfony/console/Command/Command.php deleted file mode 100644 index 26a09fb..0000000 --- a/vendor/symfony/console/Command/Command.php +++ /dev/null @@ -1,660 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Exception\ExceptionInterface; -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; -use Symfony\Component\Console\Helper\HelperSet; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Base class for all commands. - * - * @author Fabien Potencier - */ -class Command -{ - /** - * @var string|null The default command name - */ - protected static $defaultName; - - private $application; - private $name; - private $processTitle; - private $aliases = []; - private $definition; - private $hidden = false; - private $help = ''; - private $description = ''; - private $ignoreValidationErrors = false; - private $applicationDefinitionMerged = false; - private $applicationDefinitionMergedWithArgs = false; - private $code; - private $synopsis = []; - private $usages = []; - private $helperSet; - - /** - * @return string|null The default command name or null when no default name is set - */ - public static function getDefaultName() - { - $class = static::class; - $r = new \ReflectionProperty($class, 'defaultName'); - - return $class === $r->class ? static::$defaultName : null; - } - - /** - * @param string|null $name The name of the command; passing null means it must be set in configure() - * - * @throws LogicException When the command name is empty - */ - public function __construct(string $name = null) - { - $this->definition = new InputDefinition(); - - if (null !== $name || null !== $name = static::getDefaultName()) { - $this->setName($name); - } - - $this->configure(); - } - - /** - * Ignores validation errors. - * - * This is mainly useful for the help command. - */ - public function ignoreValidationErrors() - { - $this->ignoreValidationErrors = true; - } - - public function setApplication(Application $application = null) - { - $this->application = $application; - if ($application) { - $this->setHelperSet($application->getHelperSet()); - } else { - $this->helperSet = null; - } - } - - public function setHelperSet(HelperSet $helperSet) - { - $this->helperSet = $helperSet; - } - - /** - * Gets the helper set. - * - * @return HelperSet|null A HelperSet instance - */ - public function getHelperSet() - { - return $this->helperSet; - } - - /** - * Gets the application instance for this command. - * - * @return Application|null An Application instance - */ - public function getApplication() - { - return $this->application; - } - - /** - * Checks whether the command is enabled or not in the current environment. - * - * Override this to check for x or y and return false if the command can not - * run properly under the current conditions. - * - * @return bool - */ - public function isEnabled() - { - return true; - } - - /** - * Configures the current command. - */ - protected function configure() - { - } - - /** - * Executes the current command. - * - * This method is not abstract because you can use this class - * as a concrete class. In this case, instead of defining the - * execute() method, you set the code to execute by passing - * a Closure to the setCode() method. - * - * @return int 0 if everything went fine, or an exit code - * - * @throws LogicException When this abstract method is not implemented - * - * @see setCode() - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - throw new LogicException('You must override the execute() method in the concrete command class.'); - } - - /** - * Interacts with the user. - * - * This method is executed before the InputDefinition is validated. - * This means that this is the only place where the command can - * interactively ask for values of missing required arguments. - */ - protected function interact(InputInterface $input, OutputInterface $output) - { - } - - /** - * Initializes the command after the input has been bound and before the input - * is validated. - * - * This is mainly useful when a lot of commands extends one main command - * where some things need to be initialized based on the input arguments and options. - * - * @see InputInterface::bind() - * @see InputInterface::validate() - */ - protected function initialize(InputInterface $input, OutputInterface $output) - { - } - - /** - * Runs the command. - * - * The code to execute is either defined directly with the - * setCode() method or by overriding the execute() method - * in a sub-class. - * - * @return int The command exit code - * - * @throws \Exception When binding input fails. Bypass this by calling {@link ignoreValidationErrors()}. - * - * @see setCode() - * @see execute() - */ - public function run(InputInterface $input, OutputInterface $output) - { - // force the creation of the synopsis before the merge with the app definition - $this->getSynopsis(true); - $this->getSynopsis(false); - - // add the application arguments and options - $this->mergeApplicationDefinition(); - - // bind the input against the command specific arguments/options - try { - $input->bind($this->definition); - } catch (ExceptionInterface $e) { - if (!$this->ignoreValidationErrors) { - throw $e; - } - } - - $this->initialize($input, $output); - - if (null !== $this->processTitle) { - if (\function_exists('cli_set_process_title')) { - if (!@cli_set_process_title($this->processTitle)) { - if ('Darwin' === PHP_OS) { - $output->writeln('Running "cli_set_process_title" as an unprivileged user is not supported on MacOS.', OutputInterface::VERBOSITY_VERY_VERBOSE); - } else { - cli_set_process_title($this->processTitle); - } - } - } elseif (\function_exists('setproctitle')) { - setproctitle($this->processTitle); - } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) { - $output->writeln('Install the proctitle PECL to be able to change the process title.'); - } - } - - if ($input->isInteractive()) { - $this->interact($input, $output); - } - - // The command name argument is often omitted when a command is executed directly with its run() method. - // It would fail the validation if we didn't make sure the command argument is present, - // since it's required by the application. - if ($input->hasArgument('command') && null === $input->getArgument('command')) { - $input->setArgument('command', $this->getName()); - } - - $input->validate(); - - if ($this->code) { - $statusCode = ($this->code)($input, $output); - } else { - $statusCode = $this->execute($input, $output); - - if (!\is_int($statusCode)) { - @trigger_error(sprintf('Return value of "%s::execute()" should always be of the type int since Symfony 4.4, %s returned.', static::class, \gettype($statusCode)), E_USER_DEPRECATED); - } - } - - return is_numeric($statusCode) ? (int) $statusCode : 0; - } - - /** - * Sets the code to execute when running this command. - * - * If this method is used, it overrides the code defined - * in the execute() method. - * - * @param callable $code A callable(InputInterface $input, OutputInterface $output) - * - * @return $this - * - * @throws InvalidArgumentException - * - * @see execute() - */ - public function setCode(callable $code) - { - if ($code instanceof \Closure) { - $r = new \ReflectionFunction($code); - if (null === $r->getClosureThis()) { - $code = \Closure::bind($code, $this); - } - } - - $this->code = $code; - - return $this; - } - - /** - * Merges the application definition with the command definition. - * - * This method is not part of public API and should not be used directly. - * - * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments - */ - public function mergeApplicationDefinition($mergeArgs = true) - { - if (null === $this->application || (true === $this->applicationDefinitionMerged && ($this->applicationDefinitionMergedWithArgs || !$mergeArgs))) { - return; - } - - $this->definition->addOptions($this->application->getDefinition()->getOptions()); - - $this->applicationDefinitionMerged = true; - - if ($mergeArgs) { - $currentArguments = $this->definition->getArguments(); - $this->definition->setArguments($this->application->getDefinition()->getArguments()); - $this->definition->addArguments($currentArguments); - - $this->applicationDefinitionMergedWithArgs = true; - } - } - - /** - * Sets an array of argument and option instances. - * - * @param array|InputDefinition $definition An array of argument and option instances or a definition instance - * - * @return $this - */ - public function setDefinition($definition) - { - if ($definition instanceof InputDefinition) { - $this->definition = $definition; - } else { - $this->definition->setDefinition($definition); - } - - $this->applicationDefinitionMerged = false; - - return $this; - } - - /** - * Gets the InputDefinition attached to this Command. - * - * @return InputDefinition An InputDefinition instance - */ - public function getDefinition() - { - if (null === $this->definition) { - throw new LogicException(sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', static::class)); - } - - return $this->definition; - } - - /** - * Gets the InputDefinition to be used to create representations of this Command. - * - * Can be overridden to provide the original command representation when it would otherwise - * be changed by merging with the application InputDefinition. - * - * This method is not part of public API and should not be used directly. - * - * @return InputDefinition An InputDefinition instance - */ - public function getNativeDefinition() - { - return $this->getDefinition(); - } - - /** - * Adds an argument. - * - * @param string $name The argument name - * @param int|null $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL - * @param string $description A description text - * @param string|string[]|null $default The default value (for InputArgument::OPTIONAL mode only) - * - * @throws InvalidArgumentException When argument mode is not valid - * - * @return $this - */ - public function addArgument($name, $mode = null, $description = '', $default = null) - { - $this->definition->addArgument(new InputArgument($name, $mode, $description, $default)); - - return $this; - } - - /** - * Adds an option. - * - * @param string $name The option name - * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts - * @param int|null $mode The option mode: One of the InputOption::VALUE_* constants - * @param string $description A description text - * @param string|string[]|int|bool|null $default The default value (must be null for InputOption::VALUE_NONE) - * - * @throws InvalidArgumentException If option mode is invalid or incompatible - * - * @return $this - */ - public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null) - { - $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default)); - - return $this; - } - - /** - * Sets the name of the command. - * - * This method can set both the namespace and the name if - * you separate them by a colon (:) - * - * $command->setName('foo:bar'); - * - * @param string $name The command name - * - * @return $this - * - * @throws InvalidArgumentException When the name is invalid - */ - public function setName($name) - { - $this->validateName($name); - - $this->name = $name; - - return $this; - } - - /** - * Sets the process title of the command. - * - * This feature should be used only when creating a long process command, - * like a daemon. - * - * @param string $title The process title - * - * @return $this - */ - public function setProcessTitle($title) - { - $this->processTitle = $title; - - return $this; - } - - /** - * Returns the command name. - * - * @return string|null - */ - public function getName() - { - return $this->name; - } - - /** - * @param bool $hidden Whether or not the command should be hidden from the list of commands - * - * @return Command The current instance - */ - public function setHidden($hidden) - { - $this->hidden = (bool) $hidden; - - return $this; - } - - /** - * @return bool whether the command should be publicly shown or not - */ - public function isHidden() - { - return $this->hidden; - } - - /** - * Sets the description for the command. - * - * @param string $description The description for the command - * - * @return $this - */ - public function setDescription($description) - { - $this->description = $description; - - return $this; - } - - /** - * Returns the description for the command. - * - * @return string The description for the command - */ - public function getDescription() - { - return $this->description; - } - - /** - * Sets the help for the command. - * - * @param string $help The help for the command - * - * @return $this - */ - public function setHelp($help) - { - $this->help = $help; - - return $this; - } - - /** - * Returns the help for the command. - * - * @return string The help for the command - */ - public function getHelp() - { - return $this->help; - } - - /** - * Returns the processed help for the command replacing the %command.name% and - * %command.full_name% patterns with the real values dynamically. - * - * @return string The processed help for the command - */ - public function getProcessedHelp() - { - $name = $this->name; - $isSingleCommand = $this->application && $this->application->isSingleCommand(); - - $placeholders = [ - '%command.name%', - '%command.full_name%', - ]; - $replacements = [ - $name, - $isSingleCommand ? $_SERVER['PHP_SELF'] : $_SERVER['PHP_SELF'].' '.$name, - ]; - - return str_replace($placeholders, $replacements, $this->getHelp() ?: $this->getDescription()); - } - - /** - * Sets the aliases for the command. - * - * @param string[] $aliases An array of aliases for the command - * - * @return $this - * - * @throws InvalidArgumentException When an alias is invalid - */ - public function setAliases($aliases) - { - if (!\is_array($aliases) && !$aliases instanceof \Traversable) { - throw new InvalidArgumentException('$aliases must be an array or an instance of \Traversable.'); - } - - foreach ($aliases as $alias) { - $this->validateName($alias); - } - - $this->aliases = $aliases; - - return $this; - } - - /** - * Returns the aliases for the command. - * - * @return array An array of aliases for the command - */ - public function getAliases() - { - return $this->aliases; - } - - /** - * Returns the synopsis for the command. - * - * @param bool $short Whether to show the short version of the synopsis (with options folded) or not - * - * @return string The synopsis - */ - public function getSynopsis($short = false) - { - $key = $short ? 'short' : 'long'; - - if (!isset($this->synopsis[$key])) { - $this->synopsis[$key] = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis($short))); - } - - return $this->synopsis[$key]; - } - - /** - * Add a command usage example. - * - * @param string $usage The usage, it'll be prefixed with the command name - * - * @return $this - */ - public function addUsage($usage) - { - if (0 !== strpos($usage, $this->name)) { - $usage = sprintf('%s %s', $this->name, $usage); - } - - $this->usages[] = $usage; - - return $this; - } - - /** - * Returns alternative usages of the command. - * - * @return array - */ - public function getUsages() - { - return $this->usages; - } - - /** - * Gets a helper instance by name. - * - * @param string $name The helper name - * - * @return mixed The helper value - * - * @throws LogicException if no HelperSet is defined - * @throws InvalidArgumentException if the helper is not defined - */ - public function getHelper($name) - { - if (null === $this->helperSet) { - throw new LogicException(sprintf('Cannot retrieve helper "%s" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.', $name)); - } - - return $this->helperSet->get($name); - } - - /** - * Validates a command name. - * - * It must be non-empty and parts can optionally be separated by ":". - * - * @throws InvalidArgumentException When the name is invalid - */ - private function validateName(string $name) - { - if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) { - throw new InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name)); - } - } -} diff --git a/vendor/symfony/console/Command/HelpCommand.php b/vendor/symfony/console/Command/HelpCommand.php deleted file mode 100644 index b32be4c..0000000 --- a/vendor/symfony/console/Command/HelpCommand.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Helper\DescriptorHelper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * HelpCommand displays the help for a given command. - * - * @author Fabien Potencier - */ -class HelpCommand extends Command -{ - private $command; - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->ignoreValidationErrors(); - - $this - ->setName('help') - ->setDefinition([ - new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'), - new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'), - new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'), - ]) - ->setDescription('Displays help for a command') - ->setHelp(<<<'EOF' -The %command.name% command displays help for a given command: - - php %command.full_name% list - -You can also output the help in other formats by using the --format option: - - php %command.full_name% --format=xml list - -To display the list of available commands, please use the list command. -EOF - ) - ; - } - - public function setCommand(Command $command) - { - $this->command = $command; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - if (null === $this->command) { - $this->command = $this->getApplication()->find($input->getArgument('command_name')); - } - - $helper = new DescriptorHelper(); - $helper->describe($output, $this->command, [ - 'format' => $input->getOption('format'), - 'raw_text' => $input->getOption('raw'), - ]); - - $this->command = null; - - return 0; - } -} diff --git a/vendor/symfony/console/Command/ListCommand.php b/vendor/symfony/console/Command/ListCommand.php deleted file mode 100644 index 8af9526..0000000 --- a/vendor/symfony/console/Command/ListCommand.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Helper\DescriptorHelper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * ListCommand displays the list of all available commands for the application. - * - * @author Fabien Potencier - */ -class ListCommand extends Command -{ - /** - * {@inheritdoc} - */ - protected function configure() - { - $this - ->setName('list') - ->setDefinition($this->createDefinition()) - ->setDescription('Lists commands') - ->setHelp(<<<'EOF' -The %command.name% command lists all commands: - - php %command.full_name% - -You can also display the commands for a specific namespace: - - php %command.full_name% test - -You can also output the information in other formats by using the --format option: - - php %command.full_name% --format=xml - -It's also possible to get raw list of commands (useful for embedding command runner): - - php %command.full_name% --raw -EOF - ) - ; - } - - /** - * {@inheritdoc} - */ - public function getNativeDefinition() - { - return $this->createDefinition(); - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $helper = new DescriptorHelper(); - $helper->describe($output, $this->getApplication(), [ - 'format' => $input->getOption('format'), - 'raw_text' => $input->getOption('raw'), - 'namespace' => $input->getArgument('namespace'), - ]); - - return 0; - } - - private function createDefinition(): InputDefinition - { - return new InputDefinition([ - new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'), - new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), - new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'), - ]); - } -} diff --git a/vendor/symfony/console/Command/LockableTrait.php b/vendor/symfony/console/Command/LockableTrait.php deleted file mode 100644 index 60cfe36..0000000 --- a/vendor/symfony/console/Command/LockableTrait.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Exception\LogicException; -use Symfony\Component\Lock\Lock; -use Symfony\Component\Lock\LockFactory; -use Symfony\Component\Lock\Store\FlockStore; -use Symfony\Component\Lock\Store\SemaphoreStore; - -/** - * Basic lock feature for commands. - * - * @author Geoffrey Brier - */ -trait LockableTrait -{ - /** @var Lock */ - private $lock; - - /** - * Locks a command. - */ - private function lock(string $name = null, bool $blocking = false): bool - { - if (!class_exists(SemaphoreStore::class)) { - throw new LogicException('To enable the locking feature you must install the symfony/lock component.'); - } - - if (null !== $this->lock) { - throw new LogicException('A lock is already in place.'); - } - - if (SemaphoreStore::isSupported()) { - $store = new SemaphoreStore(); - } else { - $store = new FlockStore(); - } - - $this->lock = (new LockFactory($store))->createLock($name ?: $this->getName()); - if (!$this->lock->acquire($blocking)) { - $this->lock = null; - - return false; - } - - return true; - } - - /** - * Releases the command lock if there is one. - */ - private function release() - { - if ($this->lock) { - $this->lock->release(); - $this->lock = null; - } - } -} diff --git a/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php b/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php deleted file mode 100644 index ca1029c..0000000 --- a/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\CommandLoader; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Exception\CommandNotFoundException; - -/** - * @author Robin Chalas - */ -interface CommandLoaderInterface -{ - /** - * Loads a command. - * - * @param string $name - * - * @return Command - * - * @throws CommandNotFoundException - */ - public function get($name); - - /** - * Checks if a command exists. - * - * @param string $name - * - * @return bool - */ - public function has($name); - - /** - * @return string[] All registered command names - */ - public function getNames(); -} diff --git a/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php b/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php deleted file mode 100644 index 50e5950..0000000 --- a/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\CommandLoader; - -use Psr\Container\ContainerInterface; -use Symfony\Component\Console\Exception\CommandNotFoundException; - -/** - * Loads commands from a PSR-11 container. - * - * @author Robin Chalas - */ -class ContainerCommandLoader implements CommandLoaderInterface -{ - private $container; - private $commandMap; - - /** - * @param array $commandMap An array with command names as keys and service ids as values - */ - public function __construct(ContainerInterface $container, array $commandMap) - { - $this->container = $container; - $this->commandMap = $commandMap; - } - - /** - * {@inheritdoc} - */ - public function get($name) - { - if (!$this->has($name)) { - throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name)); - } - - return $this->container->get($this->commandMap[$name]); - } - - /** - * {@inheritdoc} - */ - public function has($name) - { - return isset($this->commandMap[$name]) && $this->container->has($this->commandMap[$name]); - } - - /** - * {@inheritdoc} - */ - public function getNames() - { - return array_keys($this->commandMap); - } -} diff --git a/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php b/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php deleted file mode 100644 index d9c2055..0000000 --- a/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\CommandLoader; - -use Symfony\Component\Console\Exception\CommandNotFoundException; - -/** - * A simple command loader using factories to instantiate commands lazily. - * - * @author Maxime Steinhausser - */ -class FactoryCommandLoader implements CommandLoaderInterface -{ - private $factories; - - /** - * @param callable[] $factories Indexed by command names - */ - public function __construct(array $factories) - { - $this->factories = $factories; - } - - /** - * {@inheritdoc} - */ - public function has($name) - { - return isset($this->factories[$name]); - } - - /** - * {@inheritdoc} - */ - public function get($name) - { - if (!isset($this->factories[$name])) { - throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name)); - } - - $factory = $this->factories[$name]; - - return $factory(); - } - - /** - * {@inheritdoc} - */ - public function getNames() - { - return array_keys($this->factories); - } -} diff --git a/vendor/symfony/console/ConsoleEvents.php b/vendor/symfony/console/ConsoleEvents.php deleted file mode 100644 index 4975643..0000000 --- a/vendor/symfony/console/ConsoleEvents.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -/** - * Contains all events dispatched by an Application. - * - * @author Francesco Levorato - */ -final class ConsoleEvents -{ - /** - * The COMMAND event allows you to attach listeners before any command is - * executed by the console. It also allows you to modify the command, input and output - * before they are handled to the command. - * - * @Event("Symfony\Component\Console\Event\ConsoleCommandEvent") - */ - const COMMAND = 'console.command'; - - /** - * The TERMINATE event allows you to attach listeners after a command is - * executed by the console. - * - * @Event("Symfony\Component\Console\Event\ConsoleTerminateEvent") - */ - const TERMINATE = 'console.terminate'; - - /** - * The ERROR event occurs when an uncaught exception or error appears. - * - * This event allows you to deal with the exception/error or - * to modify the thrown exception. - * - * @Event("Symfony\Component\Console\Event\ConsoleErrorEvent") - */ - const ERROR = 'console.error'; -} diff --git a/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php b/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php deleted file mode 100644 index 666c8fa..0000000 --- a/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\DependencyInjection; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\CommandLoader\ContainerCommandLoader; -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\TypedReference; - -/** - * Registers console commands. - * - * @author Grégoire Pineau - */ -class AddConsoleCommandPass implements CompilerPassInterface -{ - private $commandLoaderServiceId; - private $commandTag; - - public function __construct(string $commandLoaderServiceId = 'console.command_loader', string $commandTag = 'console.command') - { - $this->commandLoaderServiceId = $commandLoaderServiceId; - $this->commandTag = $commandTag; - } - - public function process(ContainerBuilder $container) - { - $commandServices = $container->findTaggedServiceIds($this->commandTag, true); - $lazyCommandMap = []; - $lazyCommandRefs = []; - $serviceIds = []; - - foreach ($commandServices as $id => $tags) { - $definition = $container->getDefinition($id); - $class = $container->getParameterBag()->resolveValue($definition->getClass()); - - if (isset($tags[0]['command'])) { - $commandName = $tags[0]['command']; - } else { - if (!$r = $container->getReflectionClass($class)) { - throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); - } - if (!$r->isSubclassOf(Command::class)) { - throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); - } - $commandName = $class::getDefaultName(); - } - - if (null === $commandName) { - if (!$definition->isPublic() || $definition->isPrivate()) { - $commandId = 'console.command.public_alias.'.$id; - $container->setAlias($commandId, $id)->setPublic(true); - $id = $commandId; - } - $serviceIds[] = $id; - - continue; - } - - unset($tags[0]); - $lazyCommandMap[$commandName] = $id; - $lazyCommandRefs[$id] = new TypedReference($id, $class); - $aliases = []; - - foreach ($tags as $tag) { - if (isset($tag['command'])) { - $aliases[] = $tag['command']; - $lazyCommandMap[$tag['command']] = $id; - } - } - - $definition->addMethodCall('setName', [$commandName]); - - if ($aliases) { - $definition->addMethodCall('setAliases', [$aliases]); - } - } - - $container - ->register($this->commandLoaderServiceId, ContainerCommandLoader::class) - ->setPublic(true) - ->setArguments([ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap]); - - $container->setParameter('console.command.ids', $serviceIds); - } -} diff --git a/vendor/symfony/console/Descriptor/ApplicationDescription.php b/vendor/symfony/console/Descriptor/ApplicationDescription.php deleted file mode 100644 index d361b48..0000000 --- a/vendor/symfony/console/Descriptor/ApplicationDescription.php +++ /dev/null @@ -1,143 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Exception\CommandNotFoundException; - -/** - * @author Jean-François Simon - * - * @internal - */ -class ApplicationDescription -{ - const GLOBAL_NAMESPACE = '_global'; - - private $application; - private $namespace; - private $showHidden; - - /** - * @var array - */ - private $namespaces; - - /** - * @var Command[] - */ - private $commands; - - /** - * @var Command[] - */ - private $aliases; - - public function __construct(Application $application, string $namespace = null, bool $showHidden = false) - { - $this->application = $application; - $this->namespace = $namespace; - $this->showHidden = $showHidden; - } - - public function getNamespaces(): array - { - if (null === $this->namespaces) { - $this->inspectApplication(); - } - - return $this->namespaces; - } - - /** - * @return Command[] - */ - public function getCommands(): array - { - if (null === $this->commands) { - $this->inspectApplication(); - } - - return $this->commands; - } - - /** - * @throws CommandNotFoundException - */ - public function getCommand(string $name): Command - { - if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) { - throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name)); - } - - return isset($this->commands[$name]) ? $this->commands[$name] : $this->aliases[$name]; - } - - private function inspectApplication() - { - $this->commands = []; - $this->namespaces = []; - - $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null); - foreach ($this->sortCommands($all) as $namespace => $commands) { - $names = []; - - /** @var Command $command */ - foreach ($commands as $name => $command) { - if (!$command->getName() || (!$this->showHidden && $command->isHidden())) { - continue; - } - - if ($command->getName() === $name) { - $this->commands[$name] = $command; - } else { - $this->aliases[$name] = $command; - } - - $names[] = $name; - } - - $this->namespaces[$namespace] = ['id' => $namespace, 'commands' => $names]; - } - } - - private function sortCommands(array $commands): array - { - $namespacedCommands = []; - $globalCommands = []; - $sortedCommands = []; - foreach ($commands as $name => $command) { - $key = $this->application->extractNamespace($name, 1); - if (\in_array($key, ['', self::GLOBAL_NAMESPACE], true)) { - $globalCommands[$name] = $command; - } else { - $namespacedCommands[$key][$name] = $command; - } - } - - if ($globalCommands) { - ksort($globalCommands); - $sortedCommands[self::GLOBAL_NAMESPACE] = $globalCommands; - } - - if ($namespacedCommands) { - ksort($namespacedCommands); - foreach ($namespacedCommands as $key => $commandsSet) { - ksort($commandsSet); - $sortedCommands[$key] = $commandsSet; - } - } - - return $sortedCommands; - } -} diff --git a/vendor/symfony/console/Descriptor/Descriptor.php b/vendor/symfony/console/Descriptor/Descriptor.php deleted file mode 100644 index d25a708..0000000 --- a/vendor/symfony/console/Descriptor/Descriptor.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Jean-François Simon - * - * @internal - */ -abstract class Descriptor implements DescriptorInterface -{ - /** - * @var OutputInterface - */ - protected $output; - - /** - * {@inheritdoc} - */ - public function describe(OutputInterface $output, $object, array $options = []) - { - $this->output = $output; - - switch (true) { - case $object instanceof InputArgument: - $this->describeInputArgument($object, $options); - break; - case $object instanceof InputOption: - $this->describeInputOption($object, $options); - break; - case $object instanceof InputDefinition: - $this->describeInputDefinition($object, $options); - break; - case $object instanceof Command: - $this->describeCommand($object, $options); - break; - case $object instanceof Application: - $this->describeApplication($object, $options); - break; - default: - throw new InvalidArgumentException(sprintf('Object of type "%s" is not describable.', \get_class($object))); - } - } - - /** - * Writes content to output. - * - * @param string $content - * @param bool $decorated - */ - protected function write($content, $decorated = false) - { - $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW); - } - - /** - * Describes an InputArgument instance. - * - * @return string|mixed - */ - abstract protected function describeInputArgument(InputArgument $argument, array $options = []); - - /** - * Describes an InputOption instance. - * - * @return string|mixed - */ - abstract protected function describeInputOption(InputOption $option, array $options = []); - - /** - * Describes an InputDefinition instance. - * - * @return string|mixed - */ - abstract protected function describeInputDefinition(InputDefinition $definition, array $options = []); - - /** - * Describes a Command instance. - * - * @return string|mixed - */ - abstract protected function describeCommand(Command $command, array $options = []); - - /** - * Describes an Application instance. - * - * @return string|mixed - */ - abstract protected function describeApplication(Application $application, array $options = []); -} diff --git a/vendor/symfony/console/Descriptor/DescriptorInterface.php b/vendor/symfony/console/Descriptor/DescriptorInterface.php deleted file mode 100644 index e3184a6..0000000 --- a/vendor/symfony/console/Descriptor/DescriptorInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Descriptor interface. - * - * @author Jean-François Simon - */ -interface DescriptorInterface -{ - /** - * Describes an object if supported. - * - * @param object $object - */ - public function describe(OutputInterface $output, $object, array $options = []); -} diff --git a/vendor/symfony/console/Descriptor/JsonDescriptor.php b/vendor/symfony/console/Descriptor/JsonDescriptor.php deleted file mode 100644 index 131fef1..0000000 --- a/vendor/symfony/console/Descriptor/JsonDescriptor.php +++ /dev/null @@ -1,156 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; - -/** - * JSON descriptor. - * - * @author Jean-François Simon - * - * @internal - */ -class JsonDescriptor extends Descriptor -{ - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = []) - { - $this->writeData($this->getInputArgumentData($argument), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = []) - { - $this->writeData($this->getInputOptionData($option), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = []) - { - $this->writeData($this->getInputDefinitionData($definition), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = []) - { - $this->writeData($this->getCommandData($command), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = []) - { - $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null; - $description = new ApplicationDescription($application, $describedNamespace, true); - $commands = []; - - foreach ($description->getCommands() as $command) { - $commands[] = $this->getCommandData($command); - } - - $data = []; - if ('UNKNOWN' !== $application->getName()) { - $data['application']['name'] = $application->getName(); - if ('UNKNOWN' !== $application->getVersion()) { - $data['application']['version'] = $application->getVersion(); - } - } - - $data['commands'] = $commands; - - if ($describedNamespace) { - $data['namespace'] = $describedNamespace; - } else { - $data['namespaces'] = array_values($description->getNamespaces()); - } - - $this->writeData($data, $options); - } - - /** - * Writes data as json. - */ - private function writeData(array $data, array $options) - { - $flags = isset($options['json_encoding']) ? $options['json_encoding'] : 0; - - $this->write(json_encode($data, $flags)); - } - - private function getInputArgumentData(InputArgument $argument): array - { - return [ - 'name' => $argument->getName(), - 'is_required' => $argument->isRequired(), - 'is_array' => $argument->isArray(), - 'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $argument->getDescription()), - 'default' => INF === $argument->getDefault() ? 'INF' : $argument->getDefault(), - ]; - } - - private function getInputOptionData(InputOption $option): array - { - return [ - 'name' => '--'.$option->getName(), - 'shortcut' => $option->getShortcut() ? '-'.str_replace('|', '|-', $option->getShortcut()) : '', - 'accept_value' => $option->acceptValue(), - 'is_value_required' => $option->isValueRequired(), - 'is_multiple' => $option->isArray(), - 'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $option->getDescription()), - 'default' => INF === $option->getDefault() ? 'INF' : $option->getDefault(), - ]; - } - - private function getInputDefinitionData(InputDefinition $definition): array - { - $inputArguments = []; - foreach ($definition->getArguments() as $name => $argument) { - $inputArguments[$name] = $this->getInputArgumentData($argument); - } - - $inputOptions = []; - foreach ($definition->getOptions() as $name => $option) { - $inputOptions[$name] = $this->getInputOptionData($option); - } - - return ['arguments' => $inputArguments, 'options' => $inputOptions]; - } - - private function getCommandData(Command $command): array - { - $command->getSynopsis(); - $command->mergeApplicationDefinition(false); - - return [ - 'name' => $command->getName(), - 'usage' => array_merge([$command->getSynopsis()], $command->getUsages(), $command->getAliases()), - 'description' => $command->getDescription(), - 'help' => $command->getProcessedHelp(), - 'definition' => $this->getInputDefinitionData($command->getNativeDefinition()), - 'hidden' => $command->isHidden(), - ]; - } -} diff --git a/vendor/symfony/console/Descriptor/MarkdownDescriptor.php b/vendor/symfony/console/Descriptor/MarkdownDescriptor.php deleted file mode 100644 index 02b8c30..0000000 --- a/vendor/symfony/console/Descriptor/MarkdownDescriptor.php +++ /dev/null @@ -1,182 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Helper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Markdown descriptor. - * - * @author Jean-François Simon - * - * @internal - */ -class MarkdownDescriptor extends Descriptor -{ - /** - * {@inheritdoc} - */ - public function describe(OutputInterface $output, $object, array $options = []) - { - $decorated = $output->isDecorated(); - $output->setDecorated(false); - - parent::describe($output, $object, $options); - - $output->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - protected function write($content, $decorated = true) - { - parent::write($content, $decorated); - } - - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = []) - { - $this->write( - '#### `'.($argument->getName() ?: '')."`\n\n" - .($argument->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $argument->getDescription())."\n\n" : '') - .'* Is required: '.($argument->isRequired() ? 'yes' : 'no')."\n" - .'* Is array: '.($argument->isArray() ? 'yes' : 'no')."\n" - .'* Default: `'.str_replace("\n", '', var_export($argument->getDefault(), true)).'`' - ); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = []) - { - $name = '--'.$option->getName(); - if ($option->getShortcut()) { - $name .= '|-'.str_replace('|', '|-', $option->getShortcut()).''; - } - - $this->write( - '#### `'.$name.'`'."\n\n" - .($option->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $option->getDescription())."\n\n" : '') - .'* Accept value: '.($option->acceptValue() ? 'yes' : 'no')."\n" - .'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no')."\n" - .'* Is multiple: '.($option->isArray() ? 'yes' : 'no')."\n" - .'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`' - ); - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = []) - { - if ($showArguments = \count($definition->getArguments()) > 0) { - $this->write('### Arguments'); - foreach ($definition->getArguments() as $argument) { - $this->write("\n\n"); - $this->write($this->describeInputArgument($argument)); - } - } - - if (\count($definition->getOptions()) > 0) { - if ($showArguments) { - $this->write("\n\n"); - } - - $this->write('### Options'); - foreach ($definition->getOptions() as $option) { - $this->write("\n\n"); - $this->write($this->describeInputOption($option)); - } - } - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = []) - { - $command->getSynopsis(); - $command->mergeApplicationDefinition(false); - - $this->write( - '`'.$command->getName()."`\n" - .str_repeat('-', Helper::strlen($command->getName()) + 2)."\n\n" - .($command->getDescription() ? $command->getDescription()."\n\n" : '') - .'### Usage'."\n\n" - .array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), function ($carry, $usage) { - return $carry.'* `'.$usage.'`'."\n"; - }) - ); - - if ($help = $command->getProcessedHelp()) { - $this->write("\n"); - $this->write($help); - } - - if ($command->getNativeDefinition()) { - $this->write("\n\n"); - $this->describeInputDefinition($command->getNativeDefinition()); - } - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = []) - { - $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null; - $description = new ApplicationDescription($application, $describedNamespace); - $title = $this->getApplicationTitle($application); - - $this->write($title."\n".str_repeat('=', Helper::strlen($title))); - - foreach ($description->getNamespaces() as $namespace) { - if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { - $this->write("\n\n"); - $this->write('**'.$namespace['id'].':**'); - } - - $this->write("\n\n"); - $this->write(implode("\n", array_map(function ($commandName) use ($description) { - return sprintf('* [`%s`](#%s)', $commandName, str_replace(':', '', $description->getCommand($commandName)->getName())); - }, $namespace['commands']))); - } - - foreach ($description->getCommands() as $command) { - $this->write("\n\n"); - $this->write($this->describeCommand($command)); - } - } - - private function getApplicationTitle(Application $application): string - { - if ('UNKNOWN' !== $application->getName()) { - if ('UNKNOWN' !== $application->getVersion()) { - return sprintf('%s %s', $application->getName(), $application->getVersion()); - } - - return $application->getName(); - } - - return 'Console Tool'; - } -} diff --git a/vendor/symfony/console/Descriptor/TextDescriptor.php b/vendor/symfony/console/Descriptor/TextDescriptor.php deleted file mode 100644 index ef6d8af..0000000 --- a/vendor/symfony/console/Descriptor/TextDescriptor.php +++ /dev/null @@ -1,342 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Helper\Helper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; - -/** - * Text descriptor. - * - * @author Jean-François Simon - * - * @internal - */ -class TextDescriptor extends Descriptor -{ - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = []) - { - if (null !== $argument->getDefault() && (!\is_array($argument->getDefault()) || \count($argument->getDefault()))) { - $default = sprintf(' [default: %s]', $this->formatDefaultValue($argument->getDefault())); - } else { - $default = ''; - } - - $totalWidth = isset($options['total_width']) ? $options['total_width'] : Helper::strlen($argument->getName()); - $spacingWidth = $totalWidth - \strlen($argument->getName()); - - $this->writeText(sprintf(' %s %s%s%s', - $argument->getName(), - str_repeat(' ', $spacingWidth), - // + 4 = 2 spaces before , 2 spaces after - preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $argument->getDescription()), - $default - ), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = []) - { - if ($option->acceptValue() && null !== $option->getDefault() && (!\is_array($option->getDefault()) || \count($option->getDefault()))) { - $default = sprintf(' [default: %s]', $this->formatDefaultValue($option->getDefault())); - } else { - $default = ''; - } - - $value = ''; - if ($option->acceptValue()) { - $value = '='.strtoupper($option->getName()); - - if ($option->isValueOptional()) { - $value = '['.$value.']'; - } - } - - $totalWidth = isset($options['total_width']) ? $options['total_width'] : $this->calculateTotalWidthForOptions([$option]); - $synopsis = sprintf('%s%s', - $option->getShortcut() ? sprintf('-%s, ', $option->getShortcut()) : ' ', - sprintf('--%s%s', $option->getName(), $value) - ); - - $spacingWidth = $totalWidth - Helper::strlen($synopsis); - - $this->writeText(sprintf(' %s %s%s%s%s', - $synopsis, - str_repeat(' ', $spacingWidth), - // + 4 = 2 spaces before , 2 spaces after - preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $option->getDescription()), - $default, - $option->isArray() ? ' (multiple values allowed)' : '' - ), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = []) - { - $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions()); - foreach ($definition->getArguments() as $argument) { - $totalWidth = max($totalWidth, Helper::strlen($argument->getName())); - } - - if ($definition->getArguments()) { - $this->writeText('Arguments:', $options); - $this->writeText("\n"); - foreach ($definition->getArguments() as $argument) { - $this->describeInputArgument($argument, array_merge($options, ['total_width' => $totalWidth])); - $this->writeText("\n"); - } - } - - if ($definition->getArguments() && $definition->getOptions()) { - $this->writeText("\n"); - } - - if ($definition->getOptions()) { - $laterOptions = []; - - $this->writeText('Options:', $options); - foreach ($definition->getOptions() as $option) { - if (\strlen($option->getShortcut()) > 1) { - $laterOptions[] = $option; - continue; - } - $this->writeText("\n"); - $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth])); - } - foreach ($laterOptions as $option) { - $this->writeText("\n"); - $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth])); - } - } - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = []) - { - $command->getSynopsis(true); - $command->getSynopsis(false); - $command->mergeApplicationDefinition(false); - - if ($description = $command->getDescription()) { - $this->writeText('Description:', $options); - $this->writeText("\n"); - $this->writeText(' '.$description); - $this->writeText("\n\n"); - } - - $this->writeText('Usage:', $options); - foreach (array_merge([$command->getSynopsis(true)], $command->getAliases(), $command->getUsages()) as $usage) { - $this->writeText("\n"); - $this->writeText(' '.OutputFormatter::escape($usage), $options); - } - $this->writeText("\n"); - - $definition = $command->getNativeDefinition(); - if ($definition->getOptions() || $definition->getArguments()) { - $this->writeText("\n"); - $this->describeInputDefinition($definition, $options); - $this->writeText("\n"); - } - - $help = $command->getProcessedHelp(); - if ($help && $help !== $description) { - $this->writeText("\n"); - $this->writeText('Help:', $options); - $this->writeText("\n"); - $this->writeText(' '.str_replace("\n", "\n ", $help), $options); - $this->writeText("\n"); - } - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = []) - { - $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null; - $description = new ApplicationDescription($application, $describedNamespace); - - if (isset($options['raw_text']) && $options['raw_text']) { - $width = $this->getColumnWidth($description->getCommands()); - - foreach ($description->getCommands() as $command) { - $this->writeText(sprintf("%-{$width}s %s", $command->getName(), $command->getDescription()), $options); - $this->writeText("\n"); - } - } else { - if ('' != $help = $application->getHelp()) { - $this->writeText("$help\n\n", $options); - } - - $this->writeText("Usage:\n", $options); - $this->writeText(" command [options] [arguments]\n\n", $options); - - $this->describeInputDefinition(new InputDefinition($application->getDefinition()->getOptions()), $options); - - $this->writeText("\n"); - $this->writeText("\n"); - - $commands = $description->getCommands(); - $namespaces = $description->getNamespaces(); - if ($describedNamespace && $namespaces) { - // make sure all alias commands are included when describing a specific namespace - $describedNamespaceInfo = reset($namespaces); - foreach ($describedNamespaceInfo['commands'] as $name) { - $commands[$name] = $description->getCommand($name); - } - } - - // calculate max. width based on available commands per namespace - $width = $this->getColumnWidth(array_merge(...array_values(array_map(function ($namespace) use ($commands) { - return array_intersect($namespace['commands'], array_keys($commands)); - }, $namespaces)))); - - if ($describedNamespace) { - $this->writeText(sprintf('Available commands for the "%s" namespace:', $describedNamespace), $options); - } else { - $this->writeText('Available commands:', $options); - } - - foreach ($namespaces as $namespace) { - $namespace['commands'] = array_filter($namespace['commands'], function ($name) use ($commands) { - return isset($commands[$name]); - }); - - if (!$namespace['commands']) { - continue; - } - - if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { - $this->writeText("\n"); - $this->writeText(' '.$namespace['id'].'', $options); - } - - foreach ($namespace['commands'] as $name) { - $this->writeText("\n"); - $spacingWidth = $width - Helper::strlen($name); - $command = $commands[$name]; - $commandAliases = $name === $command->getName() ? $this->getCommandAliasesText($command) : ''; - $this->writeText(sprintf(' %s%s%s', $name, str_repeat(' ', $spacingWidth), $commandAliases.$command->getDescription()), $options); - } - } - - $this->writeText("\n"); - } - } - - /** - * {@inheritdoc} - */ - private function writeText(string $content, array $options = []) - { - $this->write( - isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content, - isset($options['raw_output']) ? !$options['raw_output'] : true - ); - } - - /** - * Formats command aliases to show them in the command description. - */ - private function getCommandAliasesText(Command $command): string - { - $text = ''; - $aliases = $command->getAliases(); - - if ($aliases) { - $text = '['.implode('|', $aliases).'] '; - } - - return $text; - } - - /** - * Formats input option/argument default value. - * - * @param mixed $default - */ - private function formatDefaultValue($default): string - { - if (INF === $default) { - return 'INF'; - } - - if (\is_string($default)) { - $default = OutputFormatter::escape($default); - } elseif (\is_array($default)) { - foreach ($default as $key => $value) { - if (\is_string($value)) { - $default[$key] = OutputFormatter::escape($value); - } - } - } - - return str_replace('\\\\', '\\', json_encode($default, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); - } - - /** - * @param (Command|string)[] $commands - */ - private function getColumnWidth(array $commands): int - { - $widths = []; - - foreach ($commands as $command) { - if ($command instanceof Command) { - $widths[] = Helper::strlen($command->getName()); - foreach ($command->getAliases() as $alias) { - $widths[] = Helper::strlen($alias); - } - } else { - $widths[] = Helper::strlen($command); - } - } - - return $widths ? max($widths) + 2 : 0; - } - - /** - * @param InputOption[] $options - */ - private function calculateTotalWidthForOptions(array $options): int - { - $totalWidth = 0; - foreach ($options as $option) { - // "-" + shortcut + ", --" + name - $nameLength = 1 + max(Helper::strlen($option->getShortcut()), 1) + 4 + Helper::strlen($option->getName()); - - if ($option->acceptValue()) { - $valueLength = 1 + Helper::strlen($option->getName()); // = + value - $valueLength += $option->isValueOptional() ? 2 : 0; // [ + ] - - $nameLength += $valueLength; - } - $totalWidth = max($totalWidth, $nameLength); - } - - return $totalWidth; - } -} diff --git a/vendor/symfony/console/Descriptor/XmlDescriptor.php b/vendor/symfony/console/Descriptor/XmlDescriptor.php deleted file mode 100644 index 3d5dce1..0000000 --- a/vendor/symfony/console/Descriptor/XmlDescriptor.php +++ /dev/null @@ -1,231 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; - -/** - * XML descriptor. - * - * @author Jean-François Simon - * - * @internal - */ -class XmlDescriptor extends Descriptor -{ - public function getInputDefinitionDocument(InputDefinition $definition): \DOMDocument - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->appendChild($definitionXML = $dom->createElement('definition')); - - $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments')); - foreach ($definition->getArguments() as $argument) { - $this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument)); - } - - $definitionXML->appendChild($optionsXML = $dom->createElement('options')); - foreach ($definition->getOptions() as $option) { - $this->appendDocument($optionsXML, $this->getInputOptionDocument($option)); - } - - return $dom; - } - - public function getCommandDocument(Command $command): \DOMDocument - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->appendChild($commandXML = $dom->createElement('command')); - - $command->getSynopsis(); - $command->mergeApplicationDefinition(false); - - $commandXML->setAttribute('id', $command->getName()); - $commandXML->setAttribute('name', $command->getName()); - $commandXML->setAttribute('hidden', $command->isHidden() ? 1 : 0); - - $commandXML->appendChild($usagesXML = $dom->createElement('usages')); - - foreach (array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()) as $usage) { - $usagesXML->appendChild($dom->createElement('usage', $usage)); - } - - $commandXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getDescription()))); - - $commandXML->appendChild($helpXML = $dom->createElement('help')); - $helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getProcessedHelp()))); - - $definitionXML = $this->getInputDefinitionDocument($command->getNativeDefinition()); - $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0)); - - return $dom; - } - - public function getApplicationDocument(Application $application, string $namespace = null): \DOMDocument - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->appendChild($rootXml = $dom->createElement('symfony')); - - if ('UNKNOWN' !== $application->getName()) { - $rootXml->setAttribute('name', $application->getName()); - if ('UNKNOWN' !== $application->getVersion()) { - $rootXml->setAttribute('version', $application->getVersion()); - } - } - - $rootXml->appendChild($commandsXML = $dom->createElement('commands')); - - $description = new ApplicationDescription($application, $namespace, true); - - if ($namespace) { - $commandsXML->setAttribute('namespace', $namespace); - } - - foreach ($description->getCommands() as $command) { - $this->appendDocument($commandsXML, $this->getCommandDocument($command)); - } - - if (!$namespace) { - $rootXml->appendChild($namespacesXML = $dom->createElement('namespaces')); - - foreach ($description->getNamespaces() as $namespaceDescription) { - $namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace')); - $namespaceArrayXML->setAttribute('id', $namespaceDescription['id']); - - foreach ($namespaceDescription['commands'] as $name) { - $namespaceArrayXML->appendChild($commandXML = $dom->createElement('command')); - $commandXML->appendChild($dom->createTextNode($name)); - } - } - } - - return $dom; - } - - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = []) - { - $this->writeDocument($this->getInputArgumentDocument($argument)); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = []) - { - $this->writeDocument($this->getInputOptionDocument($option)); - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = []) - { - $this->writeDocument($this->getInputDefinitionDocument($definition)); - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = []) - { - $this->writeDocument($this->getCommandDocument($command)); - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = []) - { - $this->writeDocument($this->getApplicationDocument($application, isset($options['namespace']) ? $options['namespace'] : null)); - } - - /** - * Appends document children to parent node. - */ - private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent) - { - foreach ($importedParent->childNodes as $childNode) { - $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true)); - } - } - - /** - * Writes DOM document. - */ - private function writeDocument(\DOMDocument $dom) - { - $dom->formatOutput = true; - $this->write($dom->saveXML()); - } - - private function getInputArgumentDocument(InputArgument $argument): \DOMDocument - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - - $dom->appendChild($objectXML = $dom->createElement('argument')); - $objectXML->setAttribute('name', $argument->getName()); - $objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0); - $objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0); - $objectXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode($argument->getDescription())); - - $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); - $defaults = \is_array($argument->getDefault()) ? $argument->getDefault() : (\is_bool($argument->getDefault()) ? [var_export($argument->getDefault(), true)] : ($argument->getDefault() ? [$argument->getDefault()] : [])); - foreach ($defaults as $default) { - $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); - $defaultXML->appendChild($dom->createTextNode($default)); - } - - return $dom; - } - - private function getInputOptionDocument(InputOption $option): \DOMDocument - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - - $dom->appendChild($objectXML = $dom->createElement('option')); - $objectXML->setAttribute('name', '--'.$option->getName()); - $pos = strpos($option->getShortcut(), '|'); - if (false !== $pos) { - $objectXML->setAttribute('shortcut', '-'.substr($option->getShortcut(), 0, $pos)); - $objectXML->setAttribute('shortcuts', '-'.str_replace('|', '|-', $option->getShortcut())); - } else { - $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : ''); - } - $objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0); - $objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0); - $objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0); - $objectXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode($option->getDescription())); - - if ($option->acceptValue()) { - $defaults = \is_array($option->getDefault()) ? $option->getDefault() : (\is_bool($option->getDefault()) ? [var_export($option->getDefault(), true)] : ($option->getDefault() ? [$option->getDefault()] : [])); - $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); - - if (!empty($defaults)) { - foreach ($defaults as $default) { - $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); - $defaultXML->appendChild($dom->createTextNode($default)); - } - } - } - - return $dom; - } -} diff --git a/vendor/symfony/console/Event/ConsoleCommandEvent.php b/vendor/symfony/console/Event/ConsoleCommandEvent.php deleted file mode 100644 index 79a5190..0000000 --- a/vendor/symfony/console/Event/ConsoleCommandEvent.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -/** - * Allows to do things before the command is executed, like skipping the command or changing the input. - * - * @author Fabien Potencier - * - * @final since Symfony 4.4 - */ -class ConsoleCommandEvent extends ConsoleEvent -{ - /** - * The return code for skipped commands, this will also be passed into the terminate event. - */ - const RETURN_CODE_DISABLED = 113; - - /** - * Indicates if the command should be run or skipped. - */ - private $commandShouldRun = true; - - /** - * Disables the command, so it won't be run. - * - * @return bool - */ - public function disableCommand() - { - return $this->commandShouldRun = false; - } - - /** - * Enables the command. - * - * @return bool - */ - public function enableCommand() - { - return $this->commandShouldRun = true; - } - - /** - * Returns true if the command is runnable, false otherwise. - * - * @return bool - */ - public function commandShouldRun() - { - return $this->commandShouldRun; - } -} diff --git a/vendor/symfony/console/Event/ConsoleErrorEvent.php b/vendor/symfony/console/Event/ConsoleErrorEvent.php deleted file mode 100644 index 25d9b88..0000000 --- a/vendor/symfony/console/Event/ConsoleErrorEvent.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Allows to handle throwables thrown while running a command. - * - * @author Wouter de Jong - */ -final class ConsoleErrorEvent extends ConsoleEvent -{ - private $error; - private $exitCode; - - public function __construct(InputInterface $input, OutputInterface $output, \Throwable $error, Command $command = null) - { - parent::__construct($command, $input, $output); - - $this->error = $error; - } - - public function getError(): \Throwable - { - return $this->error; - } - - public function setError(\Throwable $error): void - { - $this->error = $error; - } - - public function setExitCode(int $exitCode): void - { - $this->exitCode = $exitCode; - - $r = new \ReflectionProperty($this->error, 'code'); - $r->setAccessible(true); - $r->setValue($this->error, $this->exitCode); - } - - public function getExitCode(): int - { - return null !== $this->exitCode ? $this->exitCode : (\is_int($this->error->getCode()) && 0 !== $this->error->getCode() ? $this->error->getCode() : 1); - } -} diff --git a/vendor/symfony/console/Event/ConsoleEvent.php b/vendor/symfony/console/Event/ConsoleEvent.php deleted file mode 100644 index 5440da2..0000000 --- a/vendor/symfony/console/Event/ConsoleEvent.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\EventDispatcher\Event; - -/** - * Allows to inspect input and output of a command. - * - * @author Francesco Levorato - */ -class ConsoleEvent extends Event -{ - protected $command; - - private $input; - private $output; - - public function __construct(Command $command = null, InputInterface $input, OutputInterface $output) - { - $this->command = $command; - $this->input = $input; - $this->output = $output; - } - - /** - * Gets the command that is executed. - * - * @return Command|null A Command instance - */ - public function getCommand() - { - return $this->command; - } - - /** - * Gets the input instance. - * - * @return InputInterface An InputInterface instance - */ - public function getInput() - { - return $this->input; - } - - /** - * Gets the output instance. - * - * @return OutputInterface An OutputInterface instance - */ - public function getOutput() - { - return $this->output; - } -} diff --git a/vendor/symfony/console/Event/ConsoleTerminateEvent.php b/vendor/symfony/console/Event/ConsoleTerminateEvent.php deleted file mode 100644 index 43d0f8a..0000000 --- a/vendor/symfony/console/Event/ConsoleTerminateEvent.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Allows to manipulate the exit code of a command after its execution. - * - * @author Francesco Levorato - * - * @final since Symfony 4.4 - */ -class ConsoleTerminateEvent extends ConsoleEvent -{ - private $exitCode; - - public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $exitCode) - { - parent::__construct($command, $input, $output); - - $this->setExitCode($exitCode); - } - - /** - * Sets the exit code. - * - * @param int $exitCode The command exit code - */ - public function setExitCode($exitCode) - { - $this->exitCode = (int) $exitCode; - } - - /** - * Gets the exit code. - * - * @return int The command exit code - */ - public function getExitCode() - { - return $this->exitCode; - } -} diff --git a/vendor/symfony/console/EventListener/ErrorListener.php b/vendor/symfony/console/EventListener/ErrorListener.php deleted file mode 100644 index a340757..0000000 --- a/vendor/symfony/console/EventListener/ErrorListener.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\EventListener; - -use Psr\Log\LoggerInterface; -use Symfony\Component\Console\ConsoleEvents; -use Symfony\Component\Console\Event\ConsoleErrorEvent; -use Symfony\Component\Console\Event\ConsoleEvent; -use Symfony\Component\Console\Event\ConsoleTerminateEvent; -use Symfony\Component\EventDispatcher\EventSubscriberInterface; - -/** - * @author James Halsall - * @author Robin Chalas - */ -class ErrorListener implements EventSubscriberInterface -{ - private $logger; - - public function __construct(LoggerInterface $logger = null) - { - $this->logger = $logger; - } - - public function onConsoleError(ConsoleErrorEvent $event) - { - if (null === $this->logger) { - return; - } - - $error = $event->getError(); - - if (!$inputString = $this->getInputString($event)) { - $this->logger->error('An error occurred while using the console. Message: "{message}"', ['exception' => $error, 'message' => $error->getMessage()]); - - return; - } - - $this->logger->error('Error thrown while running command "{command}". Message: "{message}"', ['exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()]); - } - - public function onConsoleTerminate(ConsoleTerminateEvent $event) - { - if (null === $this->logger) { - return; - } - - $exitCode = $event->getExitCode(); - - if (0 === $exitCode) { - return; - } - - if (!$inputString = $this->getInputString($event)) { - $this->logger->debug('The console exited with code "{code}"', ['code' => $exitCode]); - - return; - } - - $this->logger->debug('Command "{command}" exited with code "{code}"', ['command' => $inputString, 'code' => $exitCode]); - } - - public static function getSubscribedEvents() - { - return [ - ConsoleEvents::ERROR => ['onConsoleError', -128], - ConsoleEvents::TERMINATE => ['onConsoleTerminate', -128], - ]; - } - - private static function getInputString(ConsoleEvent $event): ?string - { - $commandName = $event->getCommand() ? $event->getCommand()->getName() : null; - $input = $event->getInput(); - - if (method_exists($input, '__toString')) { - if ($commandName) { - return str_replace(["'$commandName'", "\"$commandName\""], $commandName, (string) $input); - } - - return (string) $input; - } - - return $commandName; - } -} diff --git a/vendor/symfony/console/Exception/CommandNotFoundException.php b/vendor/symfony/console/Exception/CommandNotFoundException.php deleted file mode 100644 index 69d5cb9..0000000 --- a/vendor/symfony/console/Exception/CommandNotFoundException.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * Represents an incorrect command name typed in the console. - * - * @author Jérôme Tamarelle - */ -class CommandNotFoundException extends \InvalidArgumentException implements ExceptionInterface -{ - private $alternatives; - - /** - * @param string $message Exception message to throw - * @param array $alternatives List of similar defined names - * @param int $code Exception code - * @param \Throwable $previous Previous exception used for the exception chaining - */ - public function __construct(string $message, array $alternatives = [], int $code = 0, \Throwable $previous = null) - { - parent::__construct($message, $code, $previous); - - $this->alternatives = $alternatives; - } - - /** - * @return array A list of similar defined names - */ - public function getAlternatives() - { - return $this->alternatives; - } -} diff --git a/vendor/symfony/console/Exception/ExceptionInterface.php b/vendor/symfony/console/Exception/ExceptionInterface.php deleted file mode 100644 index 1624e13..0000000 --- a/vendor/symfony/console/Exception/ExceptionInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * ExceptionInterface. - * - * @author Jérôme Tamarelle - */ -interface ExceptionInterface extends \Throwable -{ -} diff --git a/vendor/symfony/console/Exception/InvalidArgumentException.php b/vendor/symfony/console/Exception/InvalidArgumentException.php deleted file mode 100644 index 07cc0b6..0000000 --- a/vendor/symfony/console/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * @author Jérôme Tamarelle - */ -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/console/Exception/InvalidOptionException.php b/vendor/symfony/console/Exception/InvalidOptionException.php deleted file mode 100644 index b2eec61..0000000 --- a/vendor/symfony/console/Exception/InvalidOptionException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * Represents an incorrect option name typed in the console. - * - * @author Jérôme Tamarelle - */ -class InvalidOptionException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/console/Exception/LogicException.php b/vendor/symfony/console/Exception/LogicException.php deleted file mode 100644 index fc37b8d..0000000 --- a/vendor/symfony/console/Exception/LogicException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * @author Jérôme Tamarelle - */ -class LogicException extends \LogicException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/console/Exception/MissingInputException.php b/vendor/symfony/console/Exception/MissingInputException.php deleted file mode 100644 index 04f02ad..0000000 --- a/vendor/symfony/console/Exception/MissingInputException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * Represents failure to read input from stdin. - * - * @author Gabriel Ostrolucký - */ -class MissingInputException extends RuntimeException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/console/Exception/NamespaceNotFoundException.php b/vendor/symfony/console/Exception/NamespaceNotFoundException.php deleted file mode 100644 index dd16e45..0000000 --- a/vendor/symfony/console/Exception/NamespaceNotFoundException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * Represents an incorrect namespace typed in the console. - * - * @author Pierre du Plessis - */ -class NamespaceNotFoundException extends CommandNotFoundException -{ -} diff --git a/vendor/symfony/console/Exception/RuntimeException.php b/vendor/symfony/console/Exception/RuntimeException.php deleted file mode 100644 index 51d7d80..0000000 --- a/vendor/symfony/console/Exception/RuntimeException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * @author Jérôme Tamarelle - */ -class RuntimeException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/console/Formatter/OutputFormatter.php b/vendor/symfony/console/Formatter/OutputFormatter.php deleted file mode 100644 index 27b6085..0000000 --- a/vendor/symfony/console/Formatter/OutputFormatter.php +++ /dev/null @@ -1,277 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * Formatter class for console output. - * - * @author Konstantin Kudryashov - * @author Roland Franssen - */ -class OutputFormatter implements WrappableOutputFormatterInterface -{ - private $decorated; - private $styles = []; - private $styleStack; - - /** - * Escapes "<" special char in given text. - * - * @param string $text Text to escape - * - * @return string Escaped text - */ - public static function escape($text) - { - $text = preg_replace('/([^\\\\]?) FormatterStyle" instances - */ - public function __construct(bool $decorated = false, array $styles = []) - { - $this->decorated = $decorated; - - $this->setStyle('error', new OutputFormatterStyle('white', 'red')); - $this->setStyle('info', new OutputFormatterStyle('green')); - $this->setStyle('comment', new OutputFormatterStyle('yellow')); - $this->setStyle('question', new OutputFormatterStyle('black', 'cyan')); - - foreach ($styles as $name => $style) { - $this->setStyle($name, $style); - } - - $this->styleStack = new OutputFormatterStyleStack(); - } - - /** - * {@inheritdoc} - */ - public function setDecorated($decorated) - { - $this->decorated = (bool) $decorated; - } - - /** - * {@inheritdoc} - */ - public function isDecorated() - { - return $this->decorated; - } - - /** - * {@inheritdoc} - */ - public function setStyle($name, OutputFormatterStyleInterface $style) - { - $this->styles[strtolower($name)] = $style; - } - - /** - * {@inheritdoc} - */ - public function hasStyle($name) - { - return isset($this->styles[strtolower($name)]); - } - - /** - * {@inheritdoc} - */ - public function getStyle($name) - { - if (!$this->hasStyle($name)) { - throw new InvalidArgumentException(sprintf('Undefined style: "%s".', $name)); - } - - return $this->styles[strtolower($name)]; - } - - /** - * {@inheritdoc} - */ - public function format($message) - { - return $this->formatAndWrap((string) $message, 0); - } - - /** - * {@inheritdoc} - */ - public function formatAndWrap(string $message, int $width) - { - $offset = 0; - $output = ''; - $tagRegex = '[a-z][^<>]*+'; - $currentLineLength = 0; - preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#ix", $message, $matches, PREG_OFFSET_CAPTURE); - foreach ($matches[0] as $i => $match) { - $pos = $match[1]; - $text = $match[0]; - - if (0 != $pos && '\\' == $message[$pos - 1]) { - continue; - } - - // add the text up to the next tag - $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength); - $offset = $pos + \strlen($text); - - // opening tag? - if ($open = '/' != $text[1]) { - $tag = $matches[1][$i][0]; - } else { - $tag = isset($matches[3][$i][0]) ? $matches[3][$i][0] : ''; - } - - if (!$open && !$tag) { - // - $this->styleStack->pop(); - } elseif (null === $style = $this->createStyleFromString($tag)) { - $output .= $this->applyCurrentStyle($text, $output, $width, $currentLineLength); - } elseif ($open) { - $this->styleStack->push($style); - } else { - $this->styleStack->pop($style); - } - } - - $output .= $this->applyCurrentStyle(substr($message, $offset), $output, $width, $currentLineLength); - - if (false !== strpos($output, "\0")) { - return strtr($output, ["\0" => '\\', '\\<' => '<']); - } - - return str_replace('\\<', '<', $output); - } - - /** - * @return OutputFormatterStyleStack - */ - public function getStyleStack() - { - return $this->styleStack; - } - - /** - * Tries to create new style instance from string. - */ - private function createStyleFromString(string $string): ?OutputFormatterStyleInterface - { - if (isset($this->styles[$string])) { - return $this->styles[$string]; - } - - if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', $string, $matches, PREG_SET_ORDER)) { - return null; - } - - $style = new OutputFormatterStyle(); - foreach ($matches as $match) { - array_shift($match); - $match[0] = strtolower($match[0]); - - if ('fg' == $match[0]) { - $style->setForeground(strtolower($match[1])); - } elseif ('bg' == $match[0]) { - $style->setBackground(strtolower($match[1])); - } elseif ('href' === $match[0]) { - $style->setHref($match[1]); - } elseif ('options' === $match[0]) { - preg_match_all('([^,;]+)', strtolower($match[1]), $options); - $options = array_shift($options); - foreach ($options as $option) { - $style->setOption($option); - } - } else { - return null; - } - } - - return $style; - } - - /** - * Applies current style from stack to text, if must be applied. - */ - private function applyCurrentStyle(string $text, string $current, int $width, int &$currentLineLength): string - { - if ('' === $text) { - return ''; - } - - if (!$width) { - return $this->isDecorated() ? $this->styleStack->getCurrent()->apply($text) : $text; - } - - if (!$currentLineLength && '' !== $current) { - $text = ltrim($text); - } - - if ($currentLineLength) { - $prefix = substr($text, 0, $i = $width - $currentLineLength)."\n"; - $text = substr($text, $i); - } else { - $prefix = ''; - } - - preg_match('~(\\n)$~', $text, $matches); - $text = $prefix.preg_replace('~([^\\n]{'.$width.'})\\ *~', "\$1\n", $text); - $text = rtrim($text, "\n").($matches[1] ?? ''); - - if (!$currentLineLength && '' !== $current && "\n" !== substr($current, -1)) { - $text = "\n".$text; - } - - $lines = explode("\n", $text); - - foreach ($lines as $line) { - $currentLineLength += \strlen($line); - if ($width <= $currentLineLength) { - $currentLineLength = 0; - } - } - - if ($this->isDecorated()) { - foreach ($lines as $i => $line) { - $lines[$i] = $this->styleStack->getCurrent()->apply($line); - } - } - - return implode("\n", $lines); - } -} diff --git a/vendor/symfony/console/Formatter/OutputFormatterInterface.php b/vendor/symfony/console/Formatter/OutputFormatterInterface.php deleted file mode 100644 index 22f40a3..0000000 --- a/vendor/symfony/console/Formatter/OutputFormatterInterface.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter interface for console output. - * - * @author Konstantin Kudryashov - */ -interface OutputFormatterInterface -{ - /** - * Sets the decorated flag. - * - * @param bool $decorated Whether to decorate the messages or not - */ - public function setDecorated($decorated); - - /** - * Gets the decorated flag. - * - * @return bool true if the output will decorate messages, false otherwise - */ - public function isDecorated(); - - /** - * Sets a new style. - * - * @param string $name The style name - */ - public function setStyle($name, OutputFormatterStyleInterface $style); - - /** - * Checks if output formatter has style with specified name. - * - * @param string $name - * - * @return bool - */ - public function hasStyle($name); - - /** - * Gets style options from style with specified name. - * - * @param string $name - * - * @return OutputFormatterStyleInterface - * - * @throws \InvalidArgumentException When style isn't defined - */ - public function getStyle($name); - - /** - * Formats a message according to the given styles. - * - * @param string $message The message to style - * - * @return string The styled message - */ - public function format($message); -} diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyle.php b/vendor/symfony/console/Formatter/OutputFormatterStyle.php deleted file mode 100644 index 272c3e6..0000000 --- a/vendor/symfony/console/Formatter/OutputFormatterStyle.php +++ /dev/null @@ -1,196 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * Formatter style class for defining styles. - * - * @author Konstantin Kudryashov - */ -class OutputFormatterStyle implements OutputFormatterStyleInterface -{ - private static $availableForegroundColors = [ - 'black' => ['set' => 30, 'unset' => 39], - 'red' => ['set' => 31, 'unset' => 39], - 'green' => ['set' => 32, 'unset' => 39], - 'yellow' => ['set' => 33, 'unset' => 39], - 'blue' => ['set' => 34, 'unset' => 39], - 'magenta' => ['set' => 35, 'unset' => 39], - 'cyan' => ['set' => 36, 'unset' => 39], - 'white' => ['set' => 37, 'unset' => 39], - 'default' => ['set' => 39, 'unset' => 39], - ]; - private static $availableBackgroundColors = [ - 'black' => ['set' => 40, 'unset' => 49], - 'red' => ['set' => 41, 'unset' => 49], - 'green' => ['set' => 42, 'unset' => 49], - 'yellow' => ['set' => 43, 'unset' => 49], - 'blue' => ['set' => 44, 'unset' => 49], - 'magenta' => ['set' => 45, 'unset' => 49], - 'cyan' => ['set' => 46, 'unset' => 49], - 'white' => ['set' => 47, 'unset' => 49], - 'default' => ['set' => 49, 'unset' => 49], - ]; - private static $availableOptions = [ - 'bold' => ['set' => 1, 'unset' => 22], - 'underscore' => ['set' => 4, 'unset' => 24], - 'blink' => ['set' => 5, 'unset' => 25], - 'reverse' => ['set' => 7, 'unset' => 27], - 'conceal' => ['set' => 8, 'unset' => 28], - ]; - - private $foreground; - private $background; - private $href; - private $options = []; - private $handlesHrefGracefully; - - /** - * Initializes output formatter style. - * - * @param string|null $foreground The style foreground color name - * @param string|null $background The style background color name - */ - public function __construct(string $foreground = null, string $background = null, array $options = []) - { - if (null !== $foreground) { - $this->setForeground($foreground); - } - if (null !== $background) { - $this->setBackground($background); - } - if (\count($options)) { - $this->setOptions($options); - } - } - - /** - * {@inheritdoc} - */ - public function setForeground($color = null) - { - if (null === $color) { - $this->foreground = null; - - return; - } - - if (!isset(static::$availableForegroundColors[$color])) { - throw new InvalidArgumentException(sprintf('Invalid foreground color specified: "%s". Expected one of (%s).', $color, implode(', ', array_keys(static::$availableForegroundColors)))); - } - - $this->foreground = static::$availableForegroundColors[$color]; - } - - /** - * {@inheritdoc} - */ - public function setBackground($color = null) - { - if (null === $color) { - $this->background = null; - - return; - } - - if (!isset(static::$availableBackgroundColors[$color])) { - throw new InvalidArgumentException(sprintf('Invalid background color specified: "%s". Expected one of (%s).', $color, implode(', ', array_keys(static::$availableBackgroundColors)))); - } - - $this->background = static::$availableBackgroundColors[$color]; - } - - public function setHref(string $url): void - { - $this->href = $url; - } - - /** - * {@inheritdoc} - */ - public function setOption($option) - { - if (!isset(static::$availableOptions[$option])) { - throw new InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s).', $option, implode(', ', array_keys(static::$availableOptions)))); - } - - if (!\in_array(static::$availableOptions[$option], $this->options)) { - $this->options[] = static::$availableOptions[$option]; - } - } - - /** - * {@inheritdoc} - */ - public function unsetOption($option) - { - if (!isset(static::$availableOptions[$option])) { - throw new InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s).', $option, implode(', ', array_keys(static::$availableOptions)))); - } - - $pos = array_search(static::$availableOptions[$option], $this->options); - if (false !== $pos) { - unset($this->options[$pos]); - } - } - - /** - * {@inheritdoc} - */ - public function setOptions(array $options) - { - $this->options = []; - - foreach ($options as $option) { - $this->setOption($option); - } - } - - /** - * {@inheritdoc} - */ - public function apply($text) - { - $setCodes = []; - $unsetCodes = []; - - if (null === $this->handlesHrefGracefully) { - $this->handlesHrefGracefully = 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR') && !getenv('KONSOLE_VERSION'); - } - - if (null !== $this->foreground) { - $setCodes[] = $this->foreground['set']; - $unsetCodes[] = $this->foreground['unset']; - } - if (null !== $this->background) { - $setCodes[] = $this->background['set']; - $unsetCodes[] = $this->background['unset']; - } - - foreach ($this->options as $option) { - $setCodes[] = $option['set']; - $unsetCodes[] = $option['unset']; - } - - if (null !== $this->href && $this->handlesHrefGracefully) { - $text = "\033]8;;$this->href\033\\$text\033]8;;\033\\"; - } - - if (0 === \count($setCodes)) { - return $text; - } - - return sprintf("\033[%sm%s\033[%sm", implode(';', $setCodes), $text, implode(';', $unsetCodes)); - } -} diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php b/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php deleted file mode 100644 index af171c2..0000000 --- a/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter style interface for defining styles. - * - * @author Konstantin Kudryashov - */ -interface OutputFormatterStyleInterface -{ - /** - * Sets style foreground color. - * - * @param string|null $color The color name - */ - public function setForeground($color = null); - - /** - * Sets style background color. - * - * @param string $color The color name - */ - public function setBackground($color = null); - - /** - * Sets some specific style option. - * - * @param string $option The option name - */ - public function setOption($option); - - /** - * Unsets some specific style option. - * - * @param string $option The option name - */ - public function unsetOption($option); - - /** - * Sets multiple style options at once. - */ - public function setOptions(array $options); - - /** - * Applies the style to a given text. - * - * @param string $text The text to style - * - * @return string - */ - public function apply($text); -} diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php deleted file mode 100644 index 33f7d52..0000000 --- a/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php +++ /dev/null @@ -1,110 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Contracts\Service\ResetInterface; - -/** - * @author Jean-François Simon - */ -class OutputFormatterStyleStack implements ResetInterface -{ - /** - * @var OutputFormatterStyleInterface[] - */ - private $styles; - - private $emptyStyle; - - public function __construct(OutputFormatterStyleInterface $emptyStyle = null) - { - $this->emptyStyle = $emptyStyle ?: new OutputFormatterStyle(); - $this->reset(); - } - - /** - * Resets stack (ie. empty internal arrays). - */ - public function reset() - { - $this->styles = []; - } - - /** - * Pushes a style in the stack. - */ - public function push(OutputFormatterStyleInterface $style) - { - $this->styles[] = $style; - } - - /** - * Pops a style from the stack. - * - * @return OutputFormatterStyleInterface - * - * @throws InvalidArgumentException When style tags incorrectly nested - */ - public function pop(OutputFormatterStyleInterface $style = null) - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - if (null === $style) { - return array_pop($this->styles); - } - - foreach (array_reverse($this->styles, true) as $index => $stackedStyle) { - if ($style->apply('') === $stackedStyle->apply('')) { - $this->styles = \array_slice($this->styles, 0, $index); - - return $stackedStyle; - } - } - - throw new InvalidArgumentException('Incorrectly nested style tag found.'); - } - - /** - * Computes current style with stacks top codes. - * - * @return OutputFormatterStyle - */ - public function getCurrent() - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - return $this->styles[\count($this->styles) - 1]; - } - - /** - * @return $this - */ - public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle) - { - $this->emptyStyle = $emptyStyle; - - return $this; - } - - /** - * @return OutputFormatterStyleInterface - */ - public function getEmptyStyle() - { - return $this->emptyStyle; - } -} diff --git a/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php b/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php deleted file mode 100644 index 6694053..0000000 --- a/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter interface for console output that supports word wrapping. - * - * @author Roland Franssen - */ -interface WrappableOutputFormatterInterface extends OutputFormatterInterface -{ - /** - * Formats a message according to the given styles, wrapping at `$width` (0 means no wrapping). - */ - public function formatAndWrap(string $message, int $width); -} diff --git a/vendor/symfony/console/Helper/DebugFormatterHelper.php b/vendor/symfony/console/Helper/DebugFormatterHelper.php deleted file mode 100644 index 1653ede..0000000 --- a/vendor/symfony/console/Helper/DebugFormatterHelper.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * Helps outputting debug information when running an external program from a command. - * - * An external program can be a Process, an HTTP request, or anything else. - * - * @author Fabien Potencier - */ -class DebugFormatterHelper extends Helper -{ - private $colors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default']; - private $started = []; - private $count = -1; - - /** - * Starts a debug formatting session. - * - * @param string $id The id of the formatting session - * @param string $message The message to display - * @param string $prefix The prefix to use - * - * @return string - */ - public function start($id, $message, $prefix = 'RUN') - { - $this->started[$id] = ['border' => ++$this->count % \count($this->colors)]; - - return sprintf("%s %s %s\n", $this->getBorder($id), $prefix, $message); - } - - /** - * Adds progress to a formatting session. - * - * @param string $id The id of the formatting session - * @param string $buffer The message to display - * @param bool $error Whether to consider the buffer as error - * @param string $prefix The prefix for output - * @param string $errorPrefix The prefix for error output - * - * @return string - */ - public function progress($id, $buffer, $error = false, $prefix = 'OUT', $errorPrefix = 'ERR') - { - $message = ''; - - if ($error) { - if (isset($this->started[$id]['out'])) { - $message .= "\n"; - unset($this->started[$id]['out']); - } - if (!isset($this->started[$id]['err'])) { - $message .= sprintf('%s %s ', $this->getBorder($id), $errorPrefix); - $this->started[$id]['err'] = true; - } - - $message .= str_replace("\n", sprintf("\n%s %s ", $this->getBorder($id), $errorPrefix), $buffer); - } else { - if (isset($this->started[$id]['err'])) { - $message .= "\n"; - unset($this->started[$id]['err']); - } - if (!isset($this->started[$id]['out'])) { - $message .= sprintf('%s %s ', $this->getBorder($id), $prefix); - $this->started[$id]['out'] = true; - } - - $message .= str_replace("\n", sprintf("\n%s %s ", $this->getBorder($id), $prefix), $buffer); - } - - return $message; - } - - /** - * Stops a formatting session. - * - * @param string $id The id of the formatting session - * @param string $message The message to display - * @param bool $successful Whether to consider the result as success - * @param string $prefix The prefix for the end output - * - * @return string - */ - public function stop($id, $message, $successful, $prefix = 'RES') - { - $trailingEOL = isset($this->started[$id]['out']) || isset($this->started[$id]['err']) ? "\n" : ''; - - if ($successful) { - return sprintf("%s%s %s %s\n", $trailingEOL, $this->getBorder($id), $prefix, $message); - } - - $message = sprintf("%s%s %s %s\n", $trailingEOL, $this->getBorder($id), $prefix, $message); - - unset($this->started[$id]['out'], $this->started[$id]['err']); - - return $message; - } - - private function getBorder(string $id): string - { - return sprintf(' ', $this->colors[$this->started[$id]['border']]); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'debug_formatter'; - } -} diff --git a/vendor/symfony/console/Helper/DescriptorHelper.php b/vendor/symfony/console/Helper/DescriptorHelper.php deleted file mode 100644 index 3055bae..0000000 --- a/vendor/symfony/console/Helper/DescriptorHelper.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Descriptor\DescriptorInterface; -use Symfony\Component\Console\Descriptor\JsonDescriptor; -use Symfony\Component\Console\Descriptor\MarkdownDescriptor; -use Symfony\Component\Console\Descriptor\TextDescriptor; -use Symfony\Component\Console\Descriptor\XmlDescriptor; -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * This class adds helper method to describe objects in various formats. - * - * @author Jean-François Simon - */ -class DescriptorHelper extends Helper -{ - /** - * @var DescriptorInterface[] - */ - private $descriptors = []; - - public function __construct() - { - $this - ->register('txt', new TextDescriptor()) - ->register('xml', new XmlDescriptor()) - ->register('json', new JsonDescriptor()) - ->register('md', new MarkdownDescriptor()) - ; - } - - /** - * Describes an object if supported. - * - * Available options are: - * * format: string, the output format name - * * raw_text: boolean, sets output type as raw - * - * @param object $object - * - * @throws InvalidArgumentException when the given format is not supported - */ - public function describe(OutputInterface $output, $object, array $options = []) - { - $options = array_merge([ - 'raw_text' => false, - 'format' => 'txt', - ], $options); - - if (!isset($this->descriptors[$options['format']])) { - throw new InvalidArgumentException(sprintf('Unsupported format "%s".', $options['format'])); - } - - $descriptor = $this->descriptors[$options['format']]; - $descriptor->describe($output, $object, $options); - } - - /** - * Registers a descriptor. - * - * @param string $format - * - * @return $this - */ - public function register($format, DescriptorInterface $descriptor) - { - $this->descriptors[$format] = $descriptor; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'descriptor'; - } -} diff --git a/vendor/symfony/console/Helper/Dumper.php b/vendor/symfony/console/Helper/Dumper.php deleted file mode 100644 index b013b6c..0000000 --- a/vendor/symfony/console/Helper/Dumper.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\VarDumper\Cloner\ClonerInterface; -use Symfony\Component\VarDumper\Cloner\VarCloner; -use Symfony\Component\VarDumper\Dumper\CliDumper; - -/** - * @author Roland Franssen - */ -final class Dumper -{ - private $output; - private $dumper; - private $cloner; - private $handler; - - public function __construct(OutputInterface $output, CliDumper $dumper = null, ClonerInterface $cloner = null) - { - $this->output = $output; - $this->dumper = $dumper; - $this->cloner = $cloner; - - if (class_exists(CliDumper::class)) { - $this->handler = function ($var): string { - $dumper = $this->dumper ?? $this->dumper = new CliDumper(null, null, CliDumper::DUMP_LIGHT_ARRAY | CliDumper::DUMP_COMMA_SEPARATOR); - $dumper->setColors($this->output->isDecorated()); - - return rtrim($dumper->dump(($this->cloner ?? $this->cloner = new VarCloner())->cloneVar($var)->withRefHandles(false), true)); - }; - } else { - $this->handler = function ($var): string { - switch (true) { - case null === $var: - return 'null'; - case true === $var: - return 'true'; - case false === $var: - return 'false'; - case \is_string($var): - return '"'.$var.'"'; - default: - return rtrim(print_r($var, true)); - } - }; - } - } - - public function __invoke($var): string - { - return ($this->handler)($var); - } -} diff --git a/vendor/symfony/console/Helper/FormatterHelper.php b/vendor/symfony/console/Helper/FormatterHelper.php deleted file mode 100644 index d6eccee..0000000 --- a/vendor/symfony/console/Helper/FormatterHelper.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * The Formatter class provides helpers to format messages. - * - * @author Fabien Potencier - */ -class FormatterHelper extends Helper -{ - /** - * Formats a message within a section. - * - * @param string $section The section name - * @param string $message The message - * @param string $style The style to apply to the section - * - * @return string The format section - */ - public function formatSection($section, $message, $style = 'info') - { - return sprintf('<%s>[%s] %s', $style, $section, $style, $message); - } - - /** - * Formats a message as a block of text. - * - * @param string|array $messages The message to write in the block - * @param string $style The style to apply to the whole block - * @param bool $large Whether to return a large block - * - * @return string The formatter message - */ - public function formatBlock($messages, $style, $large = false) - { - if (!\is_array($messages)) { - $messages = [$messages]; - } - - $len = 0; - $lines = []; - foreach ($messages as $message) { - $message = OutputFormatter::escape($message); - $lines[] = sprintf($large ? ' %s ' : ' %s ', $message); - $len = max(self::strlen($message) + ($large ? 4 : 2), $len); - } - - $messages = $large ? [str_repeat(' ', $len)] : []; - for ($i = 0; isset($lines[$i]); ++$i) { - $messages[] = $lines[$i].str_repeat(' ', $len - self::strlen($lines[$i])); - } - if ($large) { - $messages[] = str_repeat(' ', $len); - } - - for ($i = 0; isset($messages[$i]); ++$i) { - $messages[$i] = sprintf('<%s>%s', $style, $messages[$i], $style); - } - - return implode("\n", $messages); - } - - /** - * Truncates a message to the given length. - * - * @param string $message - * @param int $length - * @param string $suffix - * - * @return string - */ - public function truncate($message, $length, $suffix = '...') - { - $computedLength = $length - self::strlen($suffix); - - if ($computedLength > self::strlen($message)) { - return $message; - } - - return self::substr($message, 0, $length).$suffix; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'formatter'; - } -} diff --git a/vendor/symfony/console/Helper/Helper.php b/vendor/symfony/console/Helper/Helper.php deleted file mode 100644 index 0ddddf6..0000000 --- a/vendor/symfony/console/Helper/Helper.php +++ /dev/null @@ -1,138 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * Helper is the base class for all helper classes. - * - * @author Fabien Potencier - */ -abstract class Helper implements HelperInterface -{ - protected $helperSet = null; - - /** - * {@inheritdoc} - */ - public function setHelperSet(HelperSet $helperSet = null) - { - $this->helperSet = $helperSet; - } - - /** - * {@inheritdoc} - */ - public function getHelperSet() - { - return $this->helperSet; - } - - /** - * Returns the length of a string, using mb_strwidth if it is available. - * - * @param string $string The string to check its length - * - * @return int The length of the string - */ - public static function strlen($string) - { - if (false === $encoding = mb_detect_encoding($string, null, true)) { - return \strlen($string); - } - - return mb_strwidth($string, $encoding); - } - - /** - * Returns the subset of a string, using mb_substr if it is available. - * - * @param string $string String to subset - * @param int $from Start offset - * @param int|null $length Length to read - * - * @return string The string subset - */ - public static function substr($string, $from, $length = null) - { - if (false === $encoding = mb_detect_encoding($string, null, true)) { - return substr($string, $from, $length); - } - - return mb_substr($string, $from, $length, $encoding); - } - - public static function formatTime($secs) - { - static $timeFormats = [ - [0, '< 1 sec'], - [1, '1 sec'], - [2, 'secs', 1], - [60, '1 min'], - [120, 'mins', 60], - [3600, '1 hr'], - [7200, 'hrs', 3600], - [86400, '1 day'], - [172800, 'days', 86400], - ]; - - foreach ($timeFormats as $index => $format) { - if ($secs >= $format[0]) { - if ((isset($timeFormats[$index + 1]) && $secs < $timeFormats[$index + 1][0]) - || $index == \count($timeFormats) - 1 - ) { - if (2 == \count($format)) { - return $format[1]; - } - - return floor($secs / $format[2]).' '.$format[1]; - } - } - } - } - - public static function formatMemory($memory) - { - if ($memory >= 1024 * 1024 * 1024) { - return sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024); - } - - if ($memory >= 1024 * 1024) { - return sprintf('%.1f MiB', $memory / 1024 / 1024); - } - - if ($memory >= 1024) { - return sprintf('%d KiB', $memory / 1024); - } - - return sprintf('%d B', $memory); - } - - public static function strlenWithoutDecoration(OutputFormatterInterface $formatter, $string) - { - return self::strlen(self::removeDecoration($formatter, $string)); - } - - public static function removeDecoration(OutputFormatterInterface $formatter, $string) - { - $isDecorated = $formatter->isDecorated(); - $formatter->setDecorated(false); - // remove <...> formatting - $string = $formatter->format($string); - // remove already formatted characters - $string = preg_replace("/\033\[[^m]*m/", '', $string); - $formatter->setDecorated($isDecorated); - - return $string; - } -} diff --git a/vendor/symfony/console/Helper/HelperInterface.php b/vendor/symfony/console/Helper/HelperInterface.php deleted file mode 100644 index 1ce8235..0000000 --- a/vendor/symfony/console/Helper/HelperInterface.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * HelperInterface is the interface all helpers must implement. - * - * @author Fabien Potencier - */ -interface HelperInterface -{ - /** - * Sets the helper set associated with this helper. - */ - public function setHelperSet(HelperSet $helperSet = null); - - /** - * Gets the helper set associated with this helper. - * - * @return HelperSet A HelperSet instance - */ - public function getHelperSet(); - - /** - * Returns the canonical name of this helper. - * - * @return string The canonical name - */ - public function getName(); -} diff --git a/vendor/symfony/console/Helper/HelperSet.php b/vendor/symfony/console/Helper/HelperSet.php deleted file mode 100644 index d9d73f2..0000000 --- a/vendor/symfony/console/Helper/HelperSet.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * HelperSet represents a set of helpers to be used with a command. - * - * @author Fabien Potencier - */ -class HelperSet implements \IteratorAggregate -{ - /** - * @var Helper[] - */ - private $helpers = []; - private $command; - - /** - * @param Helper[] $helpers An array of helper - */ - public function __construct(array $helpers = []) - { - foreach ($helpers as $alias => $helper) { - $this->set($helper, \is_int($alias) ? null : $alias); - } - } - - /** - * Sets a helper. - * - * @param string $alias An alias - */ - public function set(HelperInterface $helper, $alias = null) - { - $this->helpers[$helper->getName()] = $helper; - if (null !== $alias) { - $this->helpers[$alias] = $helper; - } - - $helper->setHelperSet($this); - } - - /** - * Returns true if the helper if defined. - * - * @param string $name The helper name - * - * @return bool true if the helper is defined, false otherwise - */ - public function has($name) - { - return isset($this->helpers[$name]); - } - - /** - * Gets a helper value. - * - * @param string $name The helper name - * - * @return HelperInterface The helper instance - * - * @throws InvalidArgumentException if the helper is not defined - */ - public function get($name) - { - if (!$this->has($name)) { - throw new InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name)); - } - - return $this->helpers[$name]; - } - - public function setCommand(Command $command = null) - { - $this->command = $command; - } - - /** - * Gets the command associated with this helper set. - * - * @return Command A Command instance - */ - public function getCommand() - { - return $this->command; - } - - /** - * @return Helper[] - */ - public function getIterator() - { - return new \ArrayIterator($this->helpers); - } -} diff --git a/vendor/symfony/console/Helper/InputAwareHelper.php b/vendor/symfony/console/Helper/InputAwareHelper.php deleted file mode 100644 index 0d0dba2..0000000 --- a/vendor/symfony/console/Helper/InputAwareHelper.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Input\InputAwareInterface; -use Symfony\Component\Console\Input\InputInterface; - -/** - * An implementation of InputAwareInterface for Helpers. - * - * @author Wouter J - */ -abstract class InputAwareHelper extends Helper implements InputAwareInterface -{ - protected $input; - - /** - * {@inheritdoc} - */ - public function setInput(InputInterface $input) - { - $this->input = $input; - } -} diff --git a/vendor/symfony/console/Helper/ProcessHelper.php b/vendor/symfony/console/Helper/ProcessHelper.php deleted file mode 100644 index f519919..0000000 --- a/vendor/symfony/console/Helper/ProcessHelper.php +++ /dev/null @@ -1,154 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Process\Exception\ProcessFailedException; -use Symfony\Component\Process\Process; - -/** - * The ProcessHelper class provides helpers to run external processes. - * - * @author Fabien Potencier - * - * @final since Symfony 4.2 - */ -class ProcessHelper extends Helper -{ - /** - * Runs an external process. - * - * @param array|Process $cmd An instance of Process or an array of the command and arguments - * @param string|null $error An error message that must be displayed if something went wrong - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * @param int $verbosity The threshold for verbosity - * - * @return Process The process that ran - */ - public function run(OutputInterface $output, $cmd, $error = null, callable $callback = null, $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE) - { - if (!class_exists(Process::class)) { - throw new \LogicException('The ProcessHelper cannot be run as the Process component is not installed. Try running "compose require symfony/process".'); - } - - if ($output instanceof ConsoleOutputInterface) { - $output = $output->getErrorOutput(); - } - - $formatter = $this->getHelperSet()->get('debug_formatter'); - - if ($cmd instanceof Process) { - $cmd = [$cmd]; - } - - if (!\is_array($cmd)) { - @trigger_error(sprintf('Passing a command as a string to "%s()" is deprecated since Symfony 4.2, pass it the command as an array of arguments instead.', __METHOD__), E_USER_DEPRECATED); - $cmd = [method_exists(Process::class, 'fromShellCommandline') ? Process::fromShellCommandline($cmd) : new Process($cmd)]; - } - - if (\is_string($cmd[0] ?? null)) { - $process = new Process($cmd); - $cmd = []; - } elseif (($cmd[0] ?? null) instanceof Process) { - $process = $cmd[0]; - unset($cmd[0]); - } else { - throw new \InvalidArgumentException(sprintf('Invalid command provided to "%s()": the command should be an array whose first element is either the path to the binary to run or a "Process" object.', __METHOD__)); - } - - if ($verbosity <= $output->getVerbosity()) { - $output->write($formatter->start(spl_object_hash($process), $this->escapeString($process->getCommandLine()))); - } - - if ($output->isDebug()) { - $callback = $this->wrapCallback($output, $process, $callback); - } - - $process->run($callback, $cmd); - - if ($verbosity <= $output->getVerbosity()) { - $message = $process->isSuccessful() ? 'Command ran successfully' : sprintf('%s Command did not run successfully', $process->getExitCode()); - $output->write($formatter->stop(spl_object_hash($process), $message, $process->isSuccessful())); - } - - if (!$process->isSuccessful() && null !== $error) { - $output->writeln(sprintf('%s', $this->escapeString($error))); - } - - return $process; - } - - /** - * Runs the process. - * - * This is identical to run() except that an exception is thrown if the process - * exits with a non-zero exit code. - * - * @param string|Process $cmd An instance of Process or a command to run - * @param string|null $error An error message that must be displayed if something went wrong - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @return Process The process that ran - * - * @throws ProcessFailedException - * - * @see run() - */ - public function mustRun(OutputInterface $output, $cmd, $error = null, callable $callback = null) - { - $process = $this->run($output, $cmd, $error, $callback); - - if (!$process->isSuccessful()) { - throw new ProcessFailedException($process); - } - - return $process; - } - - /** - * Wraps a Process callback to add debugging output. - * - * @return callable - */ - public function wrapCallback(OutputInterface $output, Process $process, callable $callback = null) - { - if ($output instanceof ConsoleOutputInterface) { - $output = $output->getErrorOutput(); - } - - $formatter = $this->getHelperSet()->get('debug_formatter'); - - return function ($type, $buffer) use ($output, $process, $callback, $formatter) { - $output->write($formatter->progress(spl_object_hash($process), $this->escapeString($buffer), Process::ERR === $type)); - - if (null !== $callback) { - $callback($type, $buffer); - } - }; - } - - private function escapeString(string $str): string - { - return str_replace('<', '\\<', $str); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'process'; - } -} diff --git a/vendor/symfony/console/Helper/ProgressBar.php b/vendor/symfony/console/Helper/ProgressBar.php deleted file mode 100644 index e4f0a99..0000000 --- a/vendor/symfony/console/Helper/ProgressBar.php +++ /dev/null @@ -1,592 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Exception\LogicException; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\ConsoleSectionOutput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Terminal; - -/** - * The ProgressBar provides helpers to display progress output. - * - * @author Fabien Potencier - * @author Chris Jones - */ -final class ProgressBar -{ - private $barWidth = 28; - private $barChar; - private $emptyBarChar = '-'; - private $progressChar = '>'; - private $format; - private $internalFormat; - private $redrawFreq = 1; - private $writeCount; - private $lastWriteTime; - private $minSecondsBetweenRedraws = 0; - private $maxSecondsBetweenRedraws = 1; - private $output; - private $step = 0; - private $max; - private $startTime; - private $stepWidth; - private $percent = 0.0; - private $formatLineCount; - private $messages = []; - private $overwrite = true; - private $terminal; - private $previousMessage; - - private static $formatters; - private static $formats; - - /** - * @param int $max Maximum steps (0 if unknown) - */ - public function __construct(OutputInterface $output, int $max = 0, float $minSecondsBetweenRedraws = 0.1) - { - if ($output instanceof ConsoleOutputInterface) { - $output = $output->getErrorOutput(); - } - - $this->output = $output; - $this->setMaxSteps($max); - $this->terminal = new Terminal(); - - if (0 < $minSecondsBetweenRedraws) { - $this->redrawFreq = null; - $this->minSecondsBetweenRedraws = $minSecondsBetweenRedraws; - } - - if (!$this->output->isDecorated()) { - // disable overwrite when output does not support ANSI codes. - $this->overwrite = false; - - // set a reasonable redraw frequency so output isn't flooded - $this->redrawFreq = null; - } - - $this->startTime = time(); - } - - /** - * Sets a placeholder formatter for a given name. - * - * This method also allow you to override an existing placeholder. - * - * @param string $name The placeholder name (including the delimiter char like %) - * @param callable $callable A PHP callable - */ - public static function setPlaceholderFormatterDefinition(string $name, callable $callable): void - { - if (!self::$formatters) { - self::$formatters = self::initPlaceholderFormatters(); - } - - self::$formatters[$name] = $callable; - } - - /** - * Gets the placeholder formatter for a given name. - * - * @param string $name The placeholder name (including the delimiter char like %) - * - * @return callable|null A PHP callable - */ - public static function getPlaceholderFormatterDefinition(string $name): ?callable - { - if (!self::$formatters) { - self::$formatters = self::initPlaceholderFormatters(); - } - - return isset(self::$formatters[$name]) ? self::$formatters[$name] : null; - } - - /** - * Sets a format for a given name. - * - * This method also allow you to override an existing format. - * - * @param string $name The format name - * @param string $format A format string - */ - public static function setFormatDefinition(string $name, string $format): void - { - if (!self::$formats) { - self::$formats = self::initFormats(); - } - - self::$formats[$name] = $format; - } - - /** - * Gets the format for a given name. - * - * @param string $name The format name - * - * @return string|null A format string - */ - public static function getFormatDefinition(string $name): ?string - { - if (!self::$formats) { - self::$formats = self::initFormats(); - } - - return isset(self::$formats[$name]) ? self::$formats[$name] : null; - } - - /** - * Associates a text with a named placeholder. - * - * The text is displayed when the progress bar is rendered but only - * when the corresponding placeholder is part of the custom format line - * (by wrapping the name with %). - * - * @param string $message The text to associate with the placeholder - * @param string $name The name of the placeholder - */ - public function setMessage(string $message, string $name = 'message') - { - $this->messages[$name] = $message; - } - - public function getMessage(string $name = 'message') - { - return $this->messages[$name]; - } - - public function getStartTime(): int - { - return $this->startTime; - } - - public function getMaxSteps(): int - { - return $this->max; - } - - public function getProgress(): int - { - return $this->step; - } - - private function getStepWidth(): int - { - return $this->stepWidth; - } - - public function getProgressPercent(): float - { - return $this->percent; - } - - public function getBarOffset(): int - { - return floor($this->max ? $this->percent * $this->barWidth : (null === $this->redrawFreq ? min(5, $this->barWidth / 15) * $this->writeCount : $this->step) % $this->barWidth); - } - - public function setBarWidth(int $size) - { - $this->barWidth = max(1, $size); - } - - public function getBarWidth(): int - { - return $this->barWidth; - } - - public function setBarCharacter(string $char) - { - $this->barChar = $char; - } - - public function getBarCharacter(): string - { - if (null === $this->barChar) { - return $this->max ? '=' : $this->emptyBarChar; - } - - return $this->barChar; - } - - public function setEmptyBarCharacter(string $char) - { - $this->emptyBarChar = $char; - } - - public function getEmptyBarCharacter(): string - { - return $this->emptyBarChar; - } - - public function setProgressCharacter(string $char) - { - $this->progressChar = $char; - } - - public function getProgressCharacter(): string - { - return $this->progressChar; - } - - public function setFormat(string $format) - { - $this->format = null; - $this->internalFormat = $format; - } - - /** - * Sets the redraw frequency. - * - * @param int|float $freq The frequency in steps - */ - public function setRedrawFrequency(?int $freq) - { - $this->redrawFreq = null !== $freq ? max(1, $freq) : null; - } - - public function minSecondsBetweenRedraws(float $seconds): void - { - $this->minSecondsBetweenRedraws = $seconds; - } - - public function maxSecondsBetweenRedraws(float $seconds): void - { - $this->maxSecondsBetweenRedraws = $seconds; - } - - /** - * Returns an iterator that will automatically update the progress bar when iterated. - * - * @param int|null $max Number of steps to complete the bar (0 if indeterminate), if null it will be inferred from $iterable - */ - public function iterate(iterable $iterable, int $max = null): iterable - { - $this->start($max ?? (is_countable($iterable) ? \count($iterable) : 0)); - - foreach ($iterable as $key => $value) { - yield $key => $value; - - $this->advance(); - } - - $this->finish(); - } - - /** - * Starts the progress output. - * - * @param int|null $max Number of steps to complete the bar (0 if indeterminate), null to leave unchanged - */ - public function start(int $max = null) - { - $this->startTime = time(); - $this->step = 0; - $this->percent = 0.0; - - if (null !== $max) { - $this->setMaxSteps($max); - } - - $this->display(); - } - - /** - * Advances the progress output X steps. - * - * @param int $step Number of steps to advance - */ - public function advance(int $step = 1) - { - $this->setProgress($this->step + $step); - } - - /** - * Sets whether to overwrite the progressbar, false for new line. - */ - public function setOverwrite(bool $overwrite) - { - $this->overwrite = $overwrite; - } - - public function setProgress(int $step) - { - if ($this->max && $step > $this->max) { - $this->max = $step; - } elseif ($step < 0) { - $step = 0; - } - - $redrawFreq = $this->redrawFreq ?? (($this->max ?: 10) / 10); - $prevPeriod = (int) ($this->step / $redrawFreq); - $currPeriod = (int) ($step / $redrawFreq); - $this->step = $step; - $this->percent = $this->max ? (float) $this->step / $this->max : 0; - $timeInterval = microtime(true) - $this->lastWriteTime; - - // Draw regardless of other limits - if ($this->max === $step) { - $this->display(); - - return; - } - - // Throttling - if ($timeInterval < $this->minSecondsBetweenRedraws) { - return; - } - - // Draw each step period, but not too late - if ($prevPeriod !== $currPeriod || $timeInterval >= $this->maxSecondsBetweenRedraws) { - $this->display(); - } - } - - public function setMaxSteps(int $max) - { - $this->format = null; - $this->max = max(0, $max); - $this->stepWidth = $this->max ? Helper::strlen((string) $this->max) : 4; - } - - /** - * Finishes the progress output. - */ - public function finish(): void - { - if (!$this->max) { - $this->max = $this->step; - } - - if ($this->step === $this->max && !$this->overwrite) { - // prevent double 100% output - return; - } - - $this->setProgress($this->max); - } - - /** - * Outputs the current progress string. - */ - public function display(): void - { - if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { - return; - } - - if (null === $this->format) { - $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat()); - } - - $this->overwrite($this->buildLine()); - } - - /** - * Removes the progress bar from the current line. - * - * This is useful if you wish to write some output - * while a progress bar is running. - * Call display() to show the progress bar again. - */ - public function clear(): void - { - if (!$this->overwrite) { - return; - } - - if (null === $this->format) { - $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat()); - } - - $this->overwrite(''); - } - - private function setRealFormat(string $format) - { - // try to use the _nomax variant if available - if (!$this->max && null !== self::getFormatDefinition($format.'_nomax')) { - $this->format = self::getFormatDefinition($format.'_nomax'); - } elseif (null !== self::getFormatDefinition($format)) { - $this->format = self::getFormatDefinition($format); - } else { - $this->format = $format; - } - - $this->formatLineCount = substr_count($this->format, "\n"); - } - - /** - * Overwrites a previous message to the output. - */ - private function overwrite(string $message): void - { - if ($this->previousMessage === $message) { - return; - } - - $originalMessage = $message; - - if ($this->overwrite) { - if (null !== $this->previousMessage) { - if ($this->output instanceof ConsoleSectionOutput) { - $lines = floor(Helper::strlen($message) / $this->terminal->getWidth()) + $this->formatLineCount + 1; - $this->output->clear($lines); - } else { - // Erase previous lines - if ($this->formatLineCount > 0) { - $message = str_repeat("\x1B[1A\x1B[2K", $this->formatLineCount).$message; - } - - // Move the cursor to the beginning of the line and erase the line - $message = "\x0D\x1B[2K$message"; - } - } - } elseif ($this->step > 0) { - $message = PHP_EOL.$message; - } - - $this->previousMessage = $originalMessage; - $this->lastWriteTime = microtime(true); - - $this->output->write($message); - ++$this->writeCount; - } - - private function determineBestFormat(): string - { - switch ($this->output->getVerbosity()) { - // OutputInterface::VERBOSITY_QUIET: display is disabled anyway - case OutputInterface::VERBOSITY_VERBOSE: - return $this->max ? 'verbose' : 'verbose_nomax'; - case OutputInterface::VERBOSITY_VERY_VERBOSE: - return $this->max ? 'very_verbose' : 'very_verbose_nomax'; - case OutputInterface::VERBOSITY_DEBUG: - return $this->max ? 'debug' : 'debug_nomax'; - default: - return $this->max ? 'normal' : 'normal_nomax'; - } - } - - private static function initPlaceholderFormatters(): array - { - return [ - 'bar' => function (self $bar, OutputInterface $output) { - $completeBars = $bar->getBarOffset(); - $display = str_repeat($bar->getBarCharacter(), $completeBars); - if ($completeBars < $bar->getBarWidth()) { - $emptyBars = $bar->getBarWidth() - $completeBars - Helper::strlenWithoutDecoration($output->getFormatter(), $bar->getProgressCharacter()); - $display .= $bar->getProgressCharacter().str_repeat($bar->getEmptyBarCharacter(), $emptyBars); - } - - return $display; - }, - 'elapsed' => function (self $bar) { - return Helper::formatTime(time() - $bar->getStartTime()); - }, - 'remaining' => function (self $bar) { - if (!$bar->getMaxSteps()) { - throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.'); - } - - if (!$bar->getProgress()) { - $remaining = 0; - } else { - $remaining = round((time() - $bar->getStartTime()) / $bar->getProgress() * ($bar->getMaxSteps() - $bar->getProgress())); - } - - return Helper::formatTime($remaining); - }, - 'estimated' => function (self $bar) { - if (!$bar->getMaxSteps()) { - throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.'); - } - - if (!$bar->getProgress()) { - $estimated = 0; - } else { - $estimated = round((time() - $bar->getStartTime()) / $bar->getProgress() * $bar->getMaxSteps()); - } - - return Helper::formatTime($estimated); - }, - 'memory' => function (self $bar) { - return Helper::formatMemory(memory_get_usage(true)); - }, - 'current' => function (self $bar) { - return str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', STR_PAD_LEFT); - }, - 'max' => function (self $bar) { - return $bar->getMaxSteps(); - }, - 'percent' => function (self $bar) { - return floor($bar->getProgressPercent() * 100); - }, - ]; - } - - private static function initFormats(): array - { - return [ - 'normal' => ' %current%/%max% [%bar%] %percent:3s%%', - 'normal_nomax' => ' %current% [%bar%]', - - 'verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%', - 'verbose_nomax' => ' %current% [%bar%] %elapsed:6s%', - - 'very_verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%', - 'very_verbose_nomax' => ' %current% [%bar%] %elapsed:6s%', - - 'debug' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%', - 'debug_nomax' => ' %current% [%bar%] %elapsed:6s% %memory:6s%', - ]; - } - - private function buildLine(): string - { - $regex = "{%([a-z\-_]+)(?:\:([^%]+))?%}i"; - $callback = function ($matches) { - if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) { - $text = $formatter($this, $this->output); - } elseif (isset($this->messages[$matches[1]])) { - $text = $this->messages[$matches[1]]; - } else { - return $matches[0]; - } - - if (isset($matches[2])) { - $text = sprintf('%'.$matches[2], $text); - } - - return $text; - }; - $line = preg_replace_callback($regex, $callback, $this->format); - - // gets string length for each sub line with multiline format - $linesLength = array_map(function ($subLine) { - return Helper::strlenWithoutDecoration($this->output->getFormatter(), rtrim($subLine, "\r")); - }, explode("\n", $line)); - - $linesWidth = max($linesLength); - - $terminalWidth = $this->terminal->getWidth(); - if ($linesWidth <= $terminalWidth) { - return $line; - } - - $this->setBarWidth($this->barWidth - $linesWidth + $terminalWidth); - - return preg_replace_callback($regex, $callback, $this->format); - } -} diff --git a/vendor/symfony/console/Helper/ProgressIndicator.php b/vendor/symfony/console/Helper/ProgressIndicator.php deleted file mode 100644 index 04db8f7..0000000 --- a/vendor/symfony/console/Helper/ProgressIndicator.php +++ /dev/null @@ -1,266 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Kevin Bond - */ -class ProgressIndicator -{ - private $output; - private $startTime; - private $format; - private $message; - private $indicatorValues; - private $indicatorCurrent; - private $indicatorChangeInterval; - private $indicatorUpdateTime; - private $started = false; - - private static $formatters; - private static $formats; - - /** - * @param string|null $format Indicator format - * @param int $indicatorChangeInterval Change interval in milliseconds - * @param array|null $indicatorValues Animated indicator characters - */ - public function __construct(OutputInterface $output, string $format = null, int $indicatorChangeInterval = 100, array $indicatorValues = null) - { - $this->output = $output; - - if (null === $format) { - $format = $this->determineBestFormat(); - } - - if (null === $indicatorValues) { - $indicatorValues = ['-', '\\', '|', '/']; - } - - $indicatorValues = array_values($indicatorValues); - - if (2 > \count($indicatorValues)) { - throw new InvalidArgumentException('Must have at least 2 indicator value characters.'); - } - - $this->format = self::getFormatDefinition($format); - $this->indicatorChangeInterval = $indicatorChangeInterval; - $this->indicatorValues = $indicatorValues; - $this->startTime = time(); - } - - /** - * Sets the current indicator message. - * - * @param string|null $message - */ - public function setMessage($message) - { - $this->message = $message; - - $this->display(); - } - - /** - * Starts the indicator output. - * - * @param $message - */ - public function start($message) - { - if ($this->started) { - throw new LogicException('Progress indicator already started.'); - } - - $this->message = $message; - $this->started = true; - $this->startTime = time(); - $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval; - $this->indicatorCurrent = 0; - - $this->display(); - } - - /** - * Advances the indicator. - */ - public function advance() - { - if (!$this->started) { - throw new LogicException('Progress indicator has not yet been started.'); - } - - if (!$this->output->isDecorated()) { - return; - } - - $currentTime = $this->getCurrentTimeInMilliseconds(); - - if ($currentTime < $this->indicatorUpdateTime) { - return; - } - - $this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval; - ++$this->indicatorCurrent; - - $this->display(); - } - - /** - * Finish the indicator with message. - * - * @param $message - */ - public function finish($message) - { - if (!$this->started) { - throw new LogicException('Progress indicator has not yet been started.'); - } - - $this->message = $message; - $this->display(); - $this->output->writeln(''); - $this->started = false; - } - - /** - * Gets the format for a given name. - * - * @param string $name The format name - * - * @return string|null A format string - */ - public static function getFormatDefinition($name) - { - if (!self::$formats) { - self::$formats = self::initFormats(); - } - - return isset(self::$formats[$name]) ? self::$formats[$name] : null; - } - - /** - * Sets a placeholder formatter for a given name. - * - * This method also allow you to override an existing placeholder. - * - * @param string $name The placeholder name (including the delimiter char like %) - * @param callable $callable A PHP callable - */ - public static function setPlaceholderFormatterDefinition($name, $callable) - { - if (!self::$formatters) { - self::$formatters = self::initPlaceholderFormatters(); - } - - self::$formatters[$name] = $callable; - } - - /** - * Gets the placeholder formatter for a given name. - * - * @param string $name The placeholder name (including the delimiter char like %) - * - * @return callable|null A PHP callable - */ - public static function getPlaceholderFormatterDefinition($name) - { - if (!self::$formatters) { - self::$formatters = self::initPlaceholderFormatters(); - } - - return isset(self::$formatters[$name]) ? self::$formatters[$name] : null; - } - - private function display() - { - if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { - return; - } - - $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) { - if ($formatter = self::getPlaceholderFormatterDefinition($matches[1])) { - return $formatter($this); - } - - return $matches[0]; - }, $this->format)); - } - - private function determineBestFormat(): string - { - switch ($this->output->getVerbosity()) { - // OutputInterface::VERBOSITY_QUIET: display is disabled anyway - case OutputInterface::VERBOSITY_VERBOSE: - return $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi'; - case OutputInterface::VERBOSITY_VERY_VERBOSE: - case OutputInterface::VERBOSITY_DEBUG: - return $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi'; - default: - return $this->output->isDecorated() ? 'normal' : 'normal_no_ansi'; - } - } - - /** - * Overwrites a previous message to the output. - */ - private function overwrite(string $message) - { - if ($this->output->isDecorated()) { - $this->output->write("\x0D\x1B[2K"); - $this->output->write($message); - } else { - $this->output->writeln($message); - } - } - - private function getCurrentTimeInMilliseconds(): float - { - return round(microtime(true) * 1000); - } - - private static function initPlaceholderFormatters(): array - { - return [ - 'indicator' => function (self $indicator) { - return $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)]; - }, - 'message' => function (self $indicator) { - return $indicator->message; - }, - 'elapsed' => function (self $indicator) { - return Helper::formatTime(time() - $indicator->startTime); - }, - 'memory' => function () { - return Helper::formatMemory(memory_get_usage(true)); - }, - ]; - } - - private static function initFormats(): array - { - return [ - 'normal' => ' %indicator% %message%', - 'normal_no_ansi' => ' %message%', - - 'verbose' => ' %indicator% %message% (%elapsed:6s%)', - 'verbose_no_ansi' => ' %message% (%elapsed:6s%)', - - 'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)', - 'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)', - ]; - } -} diff --git a/vendor/symfony/console/Helper/QuestionHelper.php b/vendor/symfony/console/Helper/QuestionHelper.php deleted file mode 100644 index eb4f211..0000000 --- a/vendor/symfony/console/Helper/QuestionHelper.php +++ /dev/null @@ -1,506 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Exception\MissingInputException; -use Symfony\Component\Console\Exception\RuntimeException; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\OutputFormatterStyle; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\StreamableInputInterface; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\ConsoleSectionOutput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Question\ChoiceQuestion; -use Symfony\Component\Console\Question\Question; -use Symfony\Component\Console\Terminal; - -/** - * The QuestionHelper class provides helpers to interact with the user. - * - * @author Fabien Potencier - */ -class QuestionHelper extends Helper -{ - private $inputStream; - private static $shell; - private static $stty = true; - private static $stdinIsInteractive; - - /** - * Asks a question to the user. - * - * @return mixed The user answer - * - * @throws RuntimeException If there is no data to read in the input stream - */ - public function ask(InputInterface $input, OutputInterface $output, Question $question) - { - if ($output instanceof ConsoleOutputInterface) { - $output = $output->getErrorOutput(); - } - - if (!$input->isInteractive()) { - return $this->getDefaultAnswer($question); - } - - if ($input instanceof StreamableInputInterface && $stream = $input->getStream()) { - $this->inputStream = $stream; - } - - try { - if (!$question->getValidator()) { - return $this->doAsk($output, $question); - } - - $interviewer = function () use ($output, $question) { - return $this->doAsk($output, $question); - }; - - return $this->validateAttempts($interviewer, $output, $question); - } catch (MissingInputException $exception) { - $input->setInteractive(false); - - if (null === $fallbackOutput = $this->getDefaultAnswer($question)) { - throw $exception; - } - - return $fallbackOutput; - } - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'question'; - } - - /** - * Prevents usage of stty. - */ - public static function disableStty() - { - self::$stty = false; - } - - /** - * Asks the question to the user. - * - * @return bool|mixed|string|null - * - * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden - */ - private function doAsk(OutputInterface $output, Question $question) - { - $this->writePrompt($output, $question); - - $inputStream = $this->inputStream ?: STDIN; - $autocomplete = $question->getAutocompleterCallback(); - - if (\function_exists('sapi_windows_cp_set')) { - // Codepage used by cmd.exe on Windows to allow special characters (éàüñ). - sapi_windows_cp_set(1252); - } - - if (null === $autocomplete || !self::$stty || !Terminal::hasSttyAvailable()) { - $ret = false; - if ($question->isHidden()) { - try { - $hiddenResponse = $this->getHiddenResponse($output, $inputStream, $question->isTrimmable()); - $ret = $question->isTrimmable() ? trim($hiddenResponse) : $hiddenResponse; - } catch (RuntimeException $e) { - if (!$question->isHiddenFallback()) { - throw $e; - } - } - } - - if (false === $ret) { - $ret = fgets($inputStream, 4096); - if (false === $ret) { - throw new MissingInputException('Aborted.'); - } - if ($question->isTrimmable()) { - $ret = trim($ret); - } - } - } else { - $autocomplete = $this->autocomplete($output, $question, $inputStream, $autocomplete); - $ret = $question->isTrimmable() ? trim($autocomplete) : $autocomplete; - } - - if ($output instanceof ConsoleSectionOutput) { - $output->addContent($ret); - } - - $ret = \strlen($ret) > 0 ? $ret : $question->getDefault(); - - if ($normalizer = $question->getNormalizer()) { - return $normalizer($ret); - } - - return $ret; - } - - /** - * @return mixed - */ - private function getDefaultAnswer(Question $question) - { - $default = $question->getDefault(); - - if (null === $default) { - return $default; - } - - if ($validator = $question->getValidator()) { - return \call_user_func($question->getValidator(), $default); - } elseif ($question instanceof ChoiceQuestion) { - $choices = $question->getChoices(); - - if (!$question->isMultiselect()) { - return isset($choices[$default]) ? $choices[$default] : $default; - } - - $default = explode(',', $default); - foreach ($default as $k => $v) { - $v = $question->isTrimmable() ? trim($v) : $v; - $default[$k] = isset($choices[$v]) ? $choices[$v] : $v; - } - } - - return $default; - } - - /** - * Outputs the question prompt. - */ - protected function writePrompt(OutputInterface $output, Question $question) - { - $message = $question->getQuestion(); - - if ($question instanceof ChoiceQuestion) { - $output->writeln(array_merge([ - $question->getQuestion(), - ], $this->formatChoiceQuestionChoices($question, 'info'))); - - $message = $question->getPrompt(); - } - - $output->write($message); - } - - /** - * @param string $tag - * - * @return string[] - */ - protected function formatChoiceQuestionChoices(ChoiceQuestion $question, $tag) - { - $messages = []; - - $maxWidth = max(array_map('self::strlen', array_keys($choices = $question->getChoices()))); - - foreach ($choices as $key => $value) { - $padding = str_repeat(' ', $maxWidth - self::strlen($key)); - - $messages[] = sprintf(" [<$tag>%s$padding] %s", $key, $value); - } - - return $messages; - } - - /** - * Outputs an error message. - */ - protected function writeError(OutputInterface $output, \Exception $error) - { - if (null !== $this->getHelperSet() && $this->getHelperSet()->has('formatter')) { - $message = $this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error'); - } else { - $message = ''.$error->getMessage().''; - } - - $output->writeln($message); - } - - /** - * Autocompletes a question. - * - * @param resource $inputStream - */ - private function autocomplete(OutputInterface $output, Question $question, $inputStream, callable $autocomplete): string - { - $fullChoice = ''; - $ret = ''; - - $i = 0; - $ofs = -1; - $matches = $autocomplete($ret); - $numMatches = \count($matches); - - $sttyMode = shell_exec('stty -g'); - - // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead) - shell_exec('stty -icanon -echo'); - - // Add highlighted text style - $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white')); - - // Read a keypress - while (!feof($inputStream)) { - $c = fread($inputStream, 1); - - // as opposed to fgets(), fread() returns an empty string when the stream content is empty, not false. - if (false === $c || ('' === $ret && '' === $c && null === $question->getDefault())) { - shell_exec(sprintf('stty %s', $sttyMode)); - throw new MissingInputException('Aborted.'); - } elseif ("\177" === $c) { // Backspace Character - if (0 === $numMatches && 0 !== $i) { - --$i; - $fullChoice = self::substr($fullChoice, 0, $i); - // Move cursor backwards - $output->write("\033[1D"); - } - - if (0 === $i) { - $ofs = -1; - $matches = $autocomplete($ret); - $numMatches = \count($matches); - } else { - $numMatches = 0; - } - - // Pop the last character off the end of our string - $ret = self::substr($ret, 0, $i); - } elseif ("\033" === $c) { - // Did we read an escape sequence? - $c .= fread($inputStream, 2); - - // A = Up Arrow. B = Down Arrow - if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) { - if ('A' === $c[2] && -1 === $ofs) { - $ofs = 0; - } - - if (0 === $numMatches) { - continue; - } - - $ofs += ('A' === $c[2]) ? -1 : 1; - $ofs = ($numMatches + $ofs) % $numMatches; - } - } elseif (\ord($c) < 32) { - if ("\t" === $c || "\n" === $c) { - if ($numMatches > 0 && -1 !== $ofs) { - $ret = (string) $matches[$ofs]; - // Echo out remaining chars for current match - $remainingCharacters = substr($ret, \strlen(trim($this->mostRecentlyEnteredValue($fullChoice)))); - $output->write($remainingCharacters); - $fullChoice .= $remainingCharacters; - $i = self::strlen($fullChoice); - - $matches = array_filter( - $autocomplete($ret), - function ($match) use ($ret) { - return '' === $ret || 0 === strpos($match, $ret); - } - ); - $numMatches = \count($matches); - $ofs = -1; - } - - if ("\n" === $c) { - $output->write($c); - break; - } - - $numMatches = 0; - } - - continue; - } else { - if ("\x80" <= $c) { - $c .= fread($inputStream, ["\xC0" => 1, "\xD0" => 1, "\xE0" => 2, "\xF0" => 3][$c & "\xF0"]); - } - - $output->write($c); - $ret .= $c; - $fullChoice .= $c; - ++$i; - - $tempRet = $ret; - - if ($question instanceof ChoiceQuestion && $question->isMultiselect()) { - $tempRet = $this->mostRecentlyEnteredValue($fullChoice); - } - - $numMatches = 0; - $ofs = 0; - - foreach ($autocomplete($ret) as $value) { - // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle) - if (0 === strpos($value, $tempRet)) { - $matches[$numMatches++] = $value; - } - } - } - - // Erase characters from cursor to end of line - $output->write("\033[K"); - - if ($numMatches > 0 && -1 !== $ofs) { - // Save cursor position - $output->write("\0337"); - // Write highlighted text, complete the partially entered response - $charactersEntered = \strlen(trim($this->mostRecentlyEnteredValue($fullChoice))); - $output->write(''.OutputFormatter::escapeTrailingBackslash(substr($matches[$ofs], $charactersEntered)).''); - // Restore cursor position - $output->write("\0338"); - } - } - - // Reset stty so it behaves normally again - shell_exec(sprintf('stty %s', $sttyMode)); - - return $fullChoice; - } - - private function mostRecentlyEnteredValue(string $entered): string - { - // Determine the most recent value that the user entered - if (false === strpos($entered, ',')) { - return $entered; - } - - $choices = explode(',', $entered); - if (\strlen($lastChoice = trim($choices[\count($choices) - 1])) > 0) { - return $lastChoice; - } - - return $entered; - } - - /** - * Gets a hidden response from user. - * - * @param resource $inputStream The handler resource - * @param bool $trimmable Is the answer trimmable - * - * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden - */ - private function getHiddenResponse(OutputInterface $output, $inputStream, bool $trimmable = true): string - { - if ('\\' === \DIRECTORY_SEPARATOR) { - $exe = __DIR__.'/../Resources/bin/hiddeninput.exe'; - - // handle code running from a phar - if ('phar:' === substr(__FILE__, 0, 5)) { - $tmpExe = sys_get_temp_dir().'/hiddeninput.exe'; - copy($exe, $tmpExe); - $exe = $tmpExe; - } - - $sExec = shell_exec($exe); - $value = $trimmable ? rtrim($sExec) : $sExec; - $output->writeln(''); - - if (isset($tmpExe)) { - unlink($tmpExe); - } - - return $value; - } - - if (self::$stty && Terminal::hasSttyAvailable()) { - $sttyMode = shell_exec('stty -g'); - shell_exec('stty -echo'); - } elseif ($this->isInteractiveInput($inputStream)) { - throw new RuntimeException('Unable to hide the response.'); - } - - $value = fgets($inputStream, 4096); - - if (self::$stty && Terminal::hasSttyAvailable()) { - shell_exec(sprintf('stty %s', $sttyMode)); - } - - if (false === $value) { - throw new MissingInputException('Aborted.'); - } - if ($trimmable) { - $value = trim($value); - } - $output->writeln(''); - - return $value; - } - - /** - * Validates an attempt. - * - * @param callable $interviewer A callable that will ask for a question and return the result - * - * @return mixed The validated response - * - * @throws \Exception In case the max number of attempts has been reached and no valid response has been given - */ - private function validateAttempts(callable $interviewer, OutputInterface $output, Question $question) - { - $error = null; - $attempts = $question->getMaxAttempts(); - - while (null === $attempts || $attempts--) { - if (null !== $error) { - $this->writeError($output, $error); - } - - try { - return $question->getValidator()($interviewer()); - } catch (RuntimeException $e) { - throw $e; - } catch (\Exception $error) { - } - } - - throw $error; - } - - private function isInteractiveInput($inputStream): bool - { - if ('php://stdin' !== (stream_get_meta_data($inputStream)['uri'] ?? null)) { - return false; - } - - if (null !== self::$stdinIsInteractive) { - return self::$stdinIsInteractive; - } - - if (\function_exists('stream_isatty')) { - return self::$stdinIsInteractive = stream_isatty(fopen('php://stdin', 'r')); - } - - if (\function_exists('posix_isatty')) { - return self::$stdinIsInteractive = posix_isatty(fopen('php://stdin', 'r')); - } - - if (!\function_exists('exec')) { - return self::$stdinIsInteractive = true; - } - - exec('stty 2> /dev/null', $output, $status); - - return self::$stdinIsInteractive = 1 !== $status; - } -} diff --git a/vendor/symfony/console/Helper/SymfonyQuestionHelper.php b/vendor/symfony/console/Helper/SymfonyQuestionHelper.php deleted file mode 100644 index e4e87b2..0000000 --- a/vendor/symfony/console/Helper/SymfonyQuestionHelper.php +++ /dev/null @@ -1,96 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Question\ChoiceQuestion; -use Symfony\Component\Console\Question\ConfirmationQuestion; -use Symfony\Component\Console\Question\Question; -use Symfony\Component\Console\Style\SymfonyStyle; - -/** - * Symfony Style Guide compliant question helper. - * - * @author Kevin Bond - */ -class SymfonyQuestionHelper extends QuestionHelper -{ - /** - * {@inheritdoc} - */ - protected function writePrompt(OutputInterface $output, Question $question) - { - $text = OutputFormatter::escapeTrailingBackslash($question->getQuestion()); - $default = $question->getDefault(); - - switch (true) { - case null === $default: - $text = sprintf(' %s:', $text); - - break; - - case $question instanceof ConfirmationQuestion: - $text = sprintf(' %s (yes/no) [%s]:', $text, $default ? 'yes' : 'no'); - - break; - - case $question instanceof ChoiceQuestion && $question->isMultiselect(): - $choices = $question->getChoices(); - $default = explode(',', $default); - - foreach ($default as $key => $value) { - $default[$key] = $choices[trim($value)]; - } - - $text = sprintf(' %s [%s]:', $text, OutputFormatter::escape(implode(', ', $default))); - - break; - - case $question instanceof ChoiceQuestion: - $choices = $question->getChoices(); - $text = sprintf(' %s [%s]:', $text, OutputFormatter::escape(isset($choices[$default]) ? $choices[$default] : $default)); - - break; - - default: - $text = sprintf(' %s [%s]:', $text, OutputFormatter::escape($default)); - } - - $output->writeln($text); - - $prompt = ' > '; - - if ($question instanceof ChoiceQuestion) { - $output->writeln($this->formatChoiceQuestionChoices($question, 'comment')); - - $prompt = $question->getPrompt(); - } - - $output->write($prompt); - } - - /** - * {@inheritdoc} - */ - protected function writeError(OutputInterface $output, \Exception $error) - { - if ($output instanceof SymfonyStyle) { - $output->newLine(); - $output->error($error->getMessage()); - - return; - } - - parent::writeError($output, $error); - } -} diff --git a/vendor/symfony/console/Helper/Table.php b/vendor/symfony/console/Helper/Table.php deleted file mode 100644 index 756b846..0000000 --- a/vendor/symfony/console/Helper/Table.php +++ /dev/null @@ -1,848 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\RuntimeException; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface; -use Symfony\Component\Console\Output\ConsoleSectionOutput; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Provides helpers to display a table. - * - * @author Fabien Potencier - * @author Саша Стаменковић - * @author Abdellatif Ait boudad - * @author Max Grigorian - * @author Dany Maillard - */ -class Table -{ - private const SEPARATOR_TOP = 0; - private const SEPARATOR_TOP_BOTTOM = 1; - private const SEPARATOR_MID = 2; - private const SEPARATOR_BOTTOM = 3; - private const BORDER_OUTSIDE = 0; - private const BORDER_INSIDE = 1; - - private $headerTitle; - private $footerTitle; - - /** - * Table headers. - */ - private $headers = []; - - /** - * Table rows. - */ - private $rows = []; - private $horizontal = false; - - /** - * Column widths cache. - */ - private $effectiveColumnWidths = []; - - /** - * Number of columns cache. - * - * @var int - */ - private $numberOfColumns; - - /** - * @var OutputInterface - */ - private $output; - - /** - * @var TableStyle - */ - private $style; - - /** - * @var array - */ - private $columnStyles = []; - - /** - * User set column widths. - * - * @var array - */ - private $columnWidths = []; - private $columnMaxWidths = []; - - private static $styles; - - private $rendered = false; - - public function __construct(OutputInterface $output) - { - $this->output = $output; - - if (!self::$styles) { - self::$styles = self::initStyles(); - } - - $this->setStyle('default'); - } - - /** - * Sets a style definition. - * - * @param string $name The style name - */ - public static function setStyleDefinition($name, TableStyle $style) - { - if (!self::$styles) { - self::$styles = self::initStyles(); - } - - self::$styles[$name] = $style; - } - - /** - * Gets a style definition by name. - * - * @param string $name The style name - * - * @return TableStyle - */ - public static function getStyleDefinition($name) - { - if (!self::$styles) { - self::$styles = self::initStyles(); - } - - if (isset(self::$styles[$name])) { - return self::$styles[$name]; - } - - throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name)); - } - - /** - * Sets table style. - * - * @param TableStyle|string $name The style name or a TableStyle instance - * - * @return $this - */ - public function setStyle($name) - { - $this->style = $this->resolveStyle($name); - - return $this; - } - - /** - * Gets the current table style. - * - * @return TableStyle - */ - public function getStyle() - { - return $this->style; - } - - /** - * Sets table column style. - * - * @param int $columnIndex Column index - * @param TableStyle|string $name The style name or a TableStyle instance - * - * @return $this - */ - public function setColumnStyle($columnIndex, $name) - { - $columnIndex = (int) $columnIndex; - - $this->columnStyles[$columnIndex] = $this->resolveStyle($name); - - return $this; - } - - /** - * Gets the current style for a column. - * - * If style was not set, it returns the global table style. - * - * @param int $columnIndex Column index - * - * @return TableStyle - */ - public function getColumnStyle($columnIndex) - { - return $this->columnStyles[$columnIndex] ?? $this->getStyle(); - } - - /** - * Sets the minimum width of a column. - * - * @param int $columnIndex Column index - * @param int $width Minimum column width in characters - * - * @return $this - */ - public function setColumnWidth($columnIndex, $width) - { - $this->columnWidths[(int) $columnIndex] = (int) $width; - - return $this; - } - - /** - * Sets the minimum width of all columns. - * - * @return $this - */ - public function setColumnWidths(array $widths) - { - $this->columnWidths = []; - foreach ($widths as $index => $width) { - $this->setColumnWidth($index, $width); - } - - return $this; - } - - /** - * Sets the maximum width of a column. - * - * Any cell within this column which contents exceeds the specified width will be wrapped into multiple lines, while - * formatted strings are preserved. - * - * @return $this - */ - public function setColumnMaxWidth(int $columnIndex, int $width): self - { - if (!$this->output->getFormatter() instanceof WrappableOutputFormatterInterface) { - throw new \LogicException(sprintf('Setting a maximum column width is only supported when using a "%s" formatter, got "%s".', WrappableOutputFormatterInterface::class, \get_class($this->output->getFormatter()))); - } - - $this->columnMaxWidths[$columnIndex] = $width; - - return $this; - } - - public function setHeaders(array $headers) - { - $headers = array_values($headers); - if (!empty($headers) && !\is_array($headers[0])) { - $headers = [$headers]; - } - - $this->headers = $headers; - - return $this; - } - - public function setRows(array $rows) - { - $this->rows = []; - - return $this->addRows($rows); - } - - public function addRows(array $rows) - { - foreach ($rows as $row) { - $this->addRow($row); - } - - return $this; - } - - public function addRow($row) - { - if ($row instanceof TableSeparator) { - $this->rows[] = $row; - - return $this; - } - - if (!\is_array($row)) { - throw new InvalidArgumentException('A row must be an array or a TableSeparator instance.'); - } - - $this->rows[] = array_values($row); - - return $this; - } - - /** - * Adds a row to the table, and re-renders the table. - */ - public function appendRow($row): self - { - if (!$this->output instanceof ConsoleSectionOutput) { - throw new RuntimeException(sprintf('Output should be an instance of "%s" when calling "%s".', ConsoleSectionOutput::class, __METHOD__)); - } - - if ($this->rendered) { - $this->output->clear($this->calculateRowCount()); - } - - $this->addRow($row); - $this->render(); - - return $this; - } - - public function setRow($column, array $row) - { - $this->rows[$column] = $row; - - return $this; - } - - public function setHeaderTitle(?string $title): self - { - $this->headerTitle = $title; - - return $this; - } - - public function setFooterTitle(?string $title): self - { - $this->footerTitle = $title; - - return $this; - } - - public function setHorizontal(bool $horizontal = true): self - { - $this->horizontal = $horizontal; - - return $this; - } - - /** - * Renders table to output. - * - * Example: - * - * +---------------+-----------------------+------------------+ - * | ISBN | Title | Author | - * +---------------+-----------------------+------------------+ - * | 99921-58-10-7 | Divine Comedy | Dante Alighieri | - * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | - * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | - * +---------------+-----------------------+------------------+ - */ - public function render() - { - $divider = new TableSeparator(); - if ($this->horizontal) { - $rows = []; - foreach ($this->headers[0] ?? [] as $i => $header) { - $rows[$i] = [$header]; - foreach ($this->rows as $row) { - if ($row instanceof TableSeparator) { - continue; - } - if (isset($row[$i])) { - $rows[$i][] = $row[$i]; - } elseif ($rows[$i][0] instanceof TableCell && $rows[$i][0]->getColspan() >= 2) { - // Noop, there is a "title" - } else { - $rows[$i][] = null; - } - } - } - } else { - $rows = array_merge($this->headers, [$divider], $this->rows); - } - - $this->calculateNumberOfColumns($rows); - - $rows = $this->buildTableRows($rows); - $this->calculateColumnsWidth($rows); - - $isHeader = !$this->horizontal; - $isFirstRow = $this->horizontal; - foreach ($rows as $row) { - if ($divider === $row) { - $isHeader = false; - $isFirstRow = true; - - continue; - } - if ($row instanceof TableSeparator) { - $this->renderRowSeparator(); - - continue; - } - if (!$row) { - continue; - } - - if ($isHeader || $isFirstRow) { - if ($isFirstRow) { - $this->renderRowSeparator(self::SEPARATOR_TOP_BOTTOM); - $isFirstRow = false; - } else { - $this->renderRowSeparator(self::SEPARATOR_TOP, $this->headerTitle, $this->style->getHeaderTitleFormat()); - } - } - if ($this->horizontal) { - $this->renderRow($row, $this->style->getCellRowFormat(), $this->style->getCellHeaderFormat()); - } else { - $this->renderRow($row, $isHeader ? $this->style->getCellHeaderFormat() : $this->style->getCellRowFormat()); - } - } - $this->renderRowSeparator(self::SEPARATOR_BOTTOM, $this->footerTitle, $this->style->getFooterTitleFormat()); - - $this->cleanup(); - $this->rendered = true; - } - - /** - * Renders horizontal header separator. - * - * Example: - * - * +-----+-----------+-------+ - */ - private function renderRowSeparator(int $type = self::SEPARATOR_MID, string $title = null, string $titleFormat = null) - { - if (0 === $count = $this->numberOfColumns) { - return; - } - - $borders = $this->style->getBorderChars(); - if (!$borders[0] && !$borders[2] && !$this->style->getCrossingChar()) { - return; - } - - $crossings = $this->style->getCrossingChars(); - if (self::SEPARATOR_MID === $type) { - list($horizontal, $leftChar, $midChar, $rightChar) = [$borders[2], $crossings[8], $crossings[0], $crossings[4]]; - } elseif (self::SEPARATOR_TOP === $type) { - list($horizontal, $leftChar, $midChar, $rightChar) = [$borders[0], $crossings[1], $crossings[2], $crossings[3]]; - } elseif (self::SEPARATOR_TOP_BOTTOM === $type) { - list($horizontal, $leftChar, $midChar, $rightChar) = [$borders[0], $crossings[9], $crossings[10], $crossings[11]]; - } else { - list($horizontal, $leftChar, $midChar, $rightChar) = [$borders[0], $crossings[7], $crossings[6], $crossings[5]]; - } - - $markup = $leftChar; - for ($column = 0; $column < $count; ++$column) { - $markup .= str_repeat($horizontal, $this->effectiveColumnWidths[$column]); - $markup .= $column === $count - 1 ? $rightChar : $midChar; - } - - if (null !== $title) { - $titleLength = Helper::strlenWithoutDecoration($formatter = $this->output->getFormatter(), $formattedTitle = sprintf($titleFormat, $title)); - $markupLength = Helper::strlen($markup); - if ($titleLength > $limit = $markupLength - 4) { - $titleLength = $limit; - $formatLength = Helper::strlenWithoutDecoration($formatter, sprintf($titleFormat, '')); - $formattedTitle = sprintf($titleFormat, Helper::substr($title, 0, $limit - $formatLength - 3).'...'); - } - - $titleStart = ($markupLength - $titleLength) / 2; - if (false === mb_detect_encoding($markup, null, true)) { - $markup = substr_replace($markup, $formattedTitle, $titleStart, $titleLength); - } else { - $markup = mb_substr($markup, 0, $titleStart).$formattedTitle.mb_substr($markup, $titleStart + $titleLength); - } - } - - $this->output->writeln(sprintf($this->style->getBorderFormat(), $markup)); - } - - /** - * Renders vertical column separator. - */ - private function renderColumnSeparator(int $type = self::BORDER_OUTSIDE): string - { - $borders = $this->style->getBorderChars(); - - return sprintf($this->style->getBorderFormat(), self::BORDER_OUTSIDE === $type ? $borders[1] : $borders[3]); - } - - /** - * Renders table row. - * - * Example: - * - * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | - */ - private function renderRow(array $row, string $cellFormat, string $firstCellFormat = null) - { - $rowContent = $this->renderColumnSeparator(self::BORDER_OUTSIDE); - $columns = $this->getRowColumns($row); - $last = \count($columns) - 1; - foreach ($columns as $i => $column) { - if ($firstCellFormat && 0 === $i) { - $rowContent .= $this->renderCell($row, $column, $firstCellFormat); - } else { - $rowContent .= $this->renderCell($row, $column, $cellFormat); - } - $rowContent .= $this->renderColumnSeparator($last === $i ? self::BORDER_OUTSIDE : self::BORDER_INSIDE); - } - $this->output->writeln($rowContent); - } - - /** - * Renders table cell with padding. - */ - private function renderCell(array $row, int $column, string $cellFormat): string - { - $cell = isset($row[$column]) ? $row[$column] : ''; - $width = $this->effectiveColumnWidths[$column]; - if ($cell instanceof TableCell && $cell->getColspan() > 1) { - // add the width of the following columns(numbers of colspan). - foreach (range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) { - $width += $this->getColumnSeparatorWidth() + $this->effectiveColumnWidths[$nextColumn]; - } - } - - // str_pad won't work properly with multi-byte strings, we need to fix the padding - if (false !== $encoding = mb_detect_encoding($cell, null, true)) { - $width += \strlen($cell) - mb_strwidth($cell, $encoding); - } - - $style = $this->getColumnStyle($column); - - if ($cell instanceof TableSeparator) { - return sprintf($style->getBorderFormat(), str_repeat($style->getBorderChars()[2], $width)); - } - - $width += Helper::strlen($cell) - Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell); - $content = sprintf($style->getCellRowContentFormat(), $cell); - - return sprintf($cellFormat, str_pad($content, $width, $style->getPaddingChar(), $style->getPadType())); - } - - /** - * Calculate number of columns for this table. - */ - private function calculateNumberOfColumns(array $rows) - { - $columns = [0]; - foreach ($rows as $row) { - if ($row instanceof TableSeparator) { - continue; - } - - $columns[] = $this->getNumberOfColumns($row); - } - - $this->numberOfColumns = max($columns); - } - - private function buildTableRows(array $rows): TableRows - { - /** @var WrappableOutputFormatterInterface $formatter */ - $formatter = $this->output->getFormatter(); - $unmergedRows = []; - for ($rowKey = 0; $rowKey < \count($rows); ++$rowKey) { - $rows = $this->fillNextRows($rows, $rowKey); - - // Remove any new line breaks and replace it with a new line - foreach ($rows[$rowKey] as $column => $cell) { - $colspan = $cell instanceof TableCell ? $cell->getColspan() : 1; - - if (isset($this->columnMaxWidths[$column]) && Helper::strlenWithoutDecoration($formatter, $cell) > $this->columnMaxWidths[$column]) { - $cell = $formatter->formatAndWrap($cell, $this->columnMaxWidths[$column] * $colspan); - } - if (!strstr($cell, "\n")) { - continue; - } - $escaped = implode("\n", array_map([OutputFormatter::class, 'escapeTrailingBackslash'], explode("\n", $cell))); - $cell = $cell instanceof TableCell ? new TableCell($escaped, ['colspan' => $cell->getColspan()]) : $escaped; - $lines = explode("\n", str_replace("\n", "\n", $cell)); - foreach ($lines as $lineKey => $line) { - if ($colspan > 1) { - $line = new TableCell($line, ['colspan' => $colspan]); - } - if (0 === $lineKey) { - $rows[$rowKey][$column] = $line; - } else { - $unmergedRows[$rowKey][$lineKey][$column] = $line; - } - } - } - } - - return new TableRows(function () use ($rows, $unmergedRows): \Traversable { - foreach ($rows as $rowKey => $row) { - yield $this->fillCells($row); - - if (isset($unmergedRows[$rowKey])) { - foreach ($unmergedRows[$rowKey] as $row) { - yield $row; - } - } - } - }); - } - - private function calculateRowCount(): int - { - $numberOfRows = \count(iterator_to_array($this->buildTableRows(array_merge($this->headers, [new TableSeparator()], $this->rows)))); - - if ($this->headers) { - ++$numberOfRows; // Add row for header separator - } - - if (\count($this->rows) > 0) { - ++$numberOfRows; // Add row for footer separator - } - - return $numberOfRows; - } - - /** - * fill rows that contains rowspan > 1. - * - * @throws InvalidArgumentException - */ - private function fillNextRows(array $rows, int $line): array - { - $unmergedRows = []; - foreach ($rows[$line] as $column => $cell) { - if (null !== $cell && !$cell instanceof TableCell && !is_scalar($cell) && !(\is_object($cell) && method_exists($cell, '__toString'))) { - throw new InvalidArgumentException(sprintf('A cell must be a TableCell, a scalar or an object implementing "__toString()", "%s" given.', \gettype($cell))); - } - if ($cell instanceof TableCell && $cell->getRowspan() > 1) { - $nbLines = $cell->getRowspan() - 1; - $lines = [$cell]; - if (strstr($cell, "\n")) { - $lines = explode("\n", str_replace("\n", "\n", $cell)); - $nbLines = \count($lines) > $nbLines ? substr_count($cell, "\n") : $nbLines; - - $rows[$line][$column] = new TableCell($lines[0], ['colspan' => $cell->getColspan()]); - unset($lines[0]); - } - - // create a two dimensional array (rowspan x colspan) - $unmergedRows = array_replace_recursive(array_fill($line + 1, $nbLines, []), $unmergedRows); - foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) { - $value = isset($lines[$unmergedRowKey - $line]) ? $lines[$unmergedRowKey - $line] : ''; - $unmergedRows[$unmergedRowKey][$column] = new TableCell($value, ['colspan' => $cell->getColspan()]); - if ($nbLines === $unmergedRowKey - $line) { - break; - } - } - } - } - - foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) { - // we need to know if $unmergedRow will be merged or inserted into $rows - if (isset($rows[$unmergedRowKey]) && \is_array($rows[$unmergedRowKey]) && ($this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns)) { - foreach ($unmergedRow as $cellKey => $cell) { - // insert cell into row at cellKey position - array_splice($rows[$unmergedRowKey], $cellKey, 0, [$cell]); - } - } else { - $row = $this->copyRow($rows, $unmergedRowKey - 1); - foreach ($unmergedRow as $column => $cell) { - if (!empty($cell)) { - $row[$column] = $unmergedRow[$column]; - } - } - array_splice($rows, $unmergedRowKey, 0, [$row]); - } - } - - return $rows; - } - - /** - * fill cells for a row that contains colspan > 1. - */ - private function fillCells($row) - { - $newRow = []; - foreach ($row as $column => $cell) { - $newRow[] = $cell; - if ($cell instanceof TableCell && $cell->getColspan() > 1) { - foreach (range($column + 1, $column + $cell->getColspan() - 1) as $position) { - // insert empty value at column position - $newRow[] = ''; - } - } - } - - return $newRow ?: $row; - } - - private function copyRow(array $rows, int $line): array - { - $row = $rows[$line]; - foreach ($row as $cellKey => $cellValue) { - $row[$cellKey] = ''; - if ($cellValue instanceof TableCell) { - $row[$cellKey] = new TableCell('', ['colspan' => $cellValue->getColspan()]); - } - } - - return $row; - } - - /** - * Gets number of columns by row. - */ - private function getNumberOfColumns(array $row): int - { - $columns = \count($row); - foreach ($row as $column) { - $columns += $column instanceof TableCell ? ($column->getColspan() - 1) : 0; - } - - return $columns; - } - - /** - * Gets list of columns for the given row. - */ - private function getRowColumns(array $row): array - { - $columns = range(0, $this->numberOfColumns - 1); - foreach ($row as $cellKey => $cell) { - if ($cell instanceof TableCell && $cell->getColspan() > 1) { - // exclude grouped columns. - $columns = array_diff($columns, range($cellKey + 1, $cellKey + $cell->getColspan() - 1)); - } - } - - return $columns; - } - - /** - * Calculates columns widths. - */ - private function calculateColumnsWidth(iterable $rows) - { - for ($column = 0; $column < $this->numberOfColumns; ++$column) { - $lengths = []; - foreach ($rows as $row) { - if ($row instanceof TableSeparator) { - continue; - } - - foreach ($row as $i => $cell) { - if ($cell instanceof TableCell) { - $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell); - $textLength = Helper::strlen($textContent); - if ($textLength > 0) { - $contentColumns = str_split($textContent, ceil($textLength / $cell->getColspan())); - foreach ($contentColumns as $position => $content) { - $row[$i + $position] = $content; - } - } - } - } - - $lengths[] = $this->getCellWidth($row, $column); - } - - $this->effectiveColumnWidths[$column] = max($lengths) + Helper::strlen($this->style->getCellRowContentFormat()) - 2; - } - } - - private function getColumnSeparatorWidth(): int - { - return Helper::strlen(sprintf($this->style->getBorderFormat(), $this->style->getBorderChars()[3])); - } - - private function getCellWidth(array $row, int $column): int - { - $cellWidth = 0; - - if (isset($row[$column])) { - $cell = $row[$column]; - $cellWidth = Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell); - } - - $columnWidth = isset($this->columnWidths[$column]) ? $this->columnWidths[$column] : 0; - $cellWidth = max($cellWidth, $columnWidth); - - return isset($this->columnMaxWidths[$column]) ? min($this->columnMaxWidths[$column], $cellWidth) : $cellWidth; - } - - /** - * Called after rendering to cleanup cache data. - */ - private function cleanup() - { - $this->effectiveColumnWidths = []; - $this->numberOfColumns = null; - } - - private static function initStyles(): array - { - $borderless = new TableStyle(); - $borderless - ->setHorizontalBorderChars('=') - ->setVerticalBorderChars(' ') - ->setDefaultCrossingChar(' ') - ; - - $compact = new TableStyle(); - $compact - ->setHorizontalBorderChars('') - ->setVerticalBorderChars(' ') - ->setDefaultCrossingChar('') - ->setCellRowContentFormat('%s') - ; - - $styleGuide = new TableStyle(); - $styleGuide - ->setHorizontalBorderChars('-') - ->setVerticalBorderChars(' ') - ->setDefaultCrossingChar(' ') - ->setCellHeaderFormat('%s') - ; - - $box = (new TableStyle()) - ->setHorizontalBorderChars('─') - ->setVerticalBorderChars('│') - ->setCrossingChars('┼', '┌', '┬', '┐', '┤', '┘', '┴', '└', '├') - ; - - $boxDouble = (new TableStyle()) - ->setHorizontalBorderChars('═', '─') - ->setVerticalBorderChars('║', '│') - ->setCrossingChars('┼', '╔', '╤', '╗', '╢', '╝', '╧', '╚', '╟', '╠', '╪', '╣') - ; - - return [ - 'default' => new TableStyle(), - 'borderless' => $borderless, - 'compact' => $compact, - 'symfony-style-guide' => $styleGuide, - 'box' => $box, - 'box-double' => $boxDouble, - ]; - } - - private function resolveStyle($name): TableStyle - { - if ($name instanceof TableStyle) { - return $name; - } - - if (isset(self::$styles[$name])) { - return self::$styles[$name]; - } - - throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name)); - } -} diff --git a/vendor/symfony/console/Helper/TableCell.php b/vendor/symfony/console/Helper/TableCell.php deleted file mode 100644 index 5b6af4a..0000000 --- a/vendor/symfony/console/Helper/TableCell.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * @author Abdellatif Ait boudad - */ -class TableCell -{ - private $value; - private $options = [ - 'rowspan' => 1, - 'colspan' => 1, - ]; - - public function __construct(string $value = '', array $options = []) - { - $this->value = $value; - - // check option names - if ($diff = array_diff(array_keys($options), array_keys($this->options))) { - throw new InvalidArgumentException(sprintf('The TableCell does not support the following options: \'%s\'.', implode('\', \'', $diff))); - } - - $this->options = array_merge($this->options, $options); - } - - /** - * Returns the cell value. - * - * @return string - */ - public function __toString() - { - return $this->value; - } - - /** - * Gets number of colspan. - * - * @return int - */ - public function getColspan() - { - return (int) $this->options['colspan']; - } - - /** - * Gets number of rowspan. - * - * @return int - */ - public function getRowspan() - { - return (int) $this->options['rowspan']; - } -} diff --git a/vendor/symfony/console/Helper/TableRows.php b/vendor/symfony/console/Helper/TableRows.php deleted file mode 100644 index 16aabb3..0000000 --- a/vendor/symfony/console/Helper/TableRows.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * @internal - */ -class TableRows implements \IteratorAggregate -{ - private $generator; - - public function __construct(callable $generator) - { - $this->generator = $generator; - } - - public function getIterator(): \Traversable - { - $g = $this->generator; - - return $g(); - } -} diff --git a/vendor/symfony/console/Helper/TableSeparator.php b/vendor/symfony/console/Helper/TableSeparator.php deleted file mode 100644 index e541c53..0000000 --- a/vendor/symfony/console/Helper/TableSeparator.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * Marks a row as being a separator. - * - * @author Fabien Potencier - */ -class TableSeparator extends TableCell -{ - public function __construct(array $options = []) - { - parent::__construct('', $options); - } -} diff --git a/vendor/symfony/console/Helper/TableStyle.php b/vendor/symfony/console/Helper/TableStyle.php deleted file mode 100644 index 6166f11..0000000 --- a/vendor/symfony/console/Helper/TableStyle.php +++ /dev/null @@ -1,458 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; - -/** - * Defines the styles for a Table. - * - * @author Fabien Potencier - * @author Саша Стаменковић - * @author Dany Maillard - */ -class TableStyle -{ - private $paddingChar = ' '; - private $horizontalOutsideBorderChar = '-'; - private $horizontalInsideBorderChar = '-'; - private $verticalOutsideBorderChar = '|'; - private $verticalInsideBorderChar = '|'; - private $crossingChar = '+'; - private $crossingTopRightChar = '+'; - private $crossingTopMidChar = '+'; - private $crossingTopLeftChar = '+'; - private $crossingMidRightChar = '+'; - private $crossingBottomRightChar = '+'; - private $crossingBottomMidChar = '+'; - private $crossingBottomLeftChar = '+'; - private $crossingMidLeftChar = '+'; - private $crossingTopLeftBottomChar = '+'; - private $crossingTopMidBottomChar = '+'; - private $crossingTopRightBottomChar = '+'; - private $headerTitleFormat = ' %s '; - private $footerTitleFormat = ' %s '; - private $cellHeaderFormat = '%s'; - private $cellRowFormat = '%s'; - private $cellRowContentFormat = ' %s '; - private $borderFormat = '%s'; - private $padType = STR_PAD_RIGHT; - - /** - * Sets padding character, used for cell padding. - * - * @param string $paddingChar - * - * @return $this - */ - public function setPaddingChar($paddingChar) - { - if (!$paddingChar) { - throw new LogicException('The padding char must not be empty.'); - } - - $this->paddingChar = $paddingChar; - - return $this; - } - - /** - * Gets padding character, used for cell padding. - * - * @return string - */ - public function getPaddingChar() - { - return $this->paddingChar; - } - - /** - * Sets horizontal border characters. - * - * - * ╔═══════════════╤══════════════════════════╤══════════════════╗ - * 1 ISBN 2 Title │ Author ║ - * ╠═══════════════╪══════════════════════════╪══════════════════╣ - * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ - * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ - * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ - * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ - * ╚═══════════════╧══════════════════════════╧══════════════════╝ - * - * - * @param string $outside Outside border char (see #1 of example) - * @param string|null $inside Inside border char (see #2 of example), equals $outside if null - */ - public function setHorizontalBorderChars(string $outside, string $inside = null): self - { - $this->horizontalOutsideBorderChar = $outside; - $this->horizontalInsideBorderChar = $inside ?? $outside; - - return $this; - } - - /** - * Sets horizontal border character. - * - * @param string $horizontalBorderChar - * - * @return $this - * - * @deprecated since Symfony 4.1, use {@link setHorizontalBorderChars()} instead. - */ - public function setHorizontalBorderChar($horizontalBorderChar) - { - @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.1, use setHorizontalBorderChars() instead.', __METHOD__), E_USER_DEPRECATED); - - return $this->setHorizontalBorderChars($horizontalBorderChar, $horizontalBorderChar); - } - - /** - * Gets horizontal border character. - * - * @return string - * - * @deprecated since Symfony 4.1, use {@link getBorderChars()} instead. - */ - public function getHorizontalBorderChar() - { - @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.1, use getBorderChars() instead.', __METHOD__), E_USER_DEPRECATED); - - return $this->horizontalOutsideBorderChar; - } - - /** - * Sets vertical border characters. - * - * - * ╔═══════════════╤══════════════════════════╤══════════════════╗ - * ║ ISBN │ Title │ Author ║ - * ╠═══════1═══════╪══════════════════════════╪══════════════════╣ - * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ - * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ - * ╟───────2───────┼──────────────────────────┼──────────────────╢ - * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ - * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ - * ╚═══════════════╧══════════════════════════╧══════════════════╝ - * - * - * @param string $outside Outside border char (see #1 of example) - * @param string|null $inside Inside border char (see #2 of example), equals $outside if null - */ - public function setVerticalBorderChars(string $outside, string $inside = null): self - { - $this->verticalOutsideBorderChar = $outside; - $this->verticalInsideBorderChar = $inside ?? $outside; - - return $this; - } - - /** - * Sets vertical border character. - * - * @param string $verticalBorderChar - * - * @return $this - * - * @deprecated since Symfony 4.1, use {@link setVerticalBorderChars()} instead. - */ - public function setVerticalBorderChar($verticalBorderChar) - { - @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.1, use setVerticalBorderChars() instead.', __METHOD__), E_USER_DEPRECATED); - - return $this->setVerticalBorderChars($verticalBorderChar, $verticalBorderChar); - } - - /** - * Gets vertical border character. - * - * @return string - * - * @deprecated since Symfony 4.1, use {@link getBorderChars()} instead. - */ - public function getVerticalBorderChar() - { - @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.1, use getBorderChars() instead.', __METHOD__), E_USER_DEPRECATED); - - return $this->verticalOutsideBorderChar; - } - - /** - * Gets border characters. - * - * @internal - */ - public function getBorderChars(): array - { - return [ - $this->horizontalOutsideBorderChar, - $this->verticalOutsideBorderChar, - $this->horizontalInsideBorderChar, - $this->verticalInsideBorderChar, - ]; - } - - /** - * Sets crossing characters. - * - * Example: - * - * 1═══════════════2══════════════════════════2══════════════════3 - * ║ ISBN │ Title │ Author ║ - * 8'══════════════0'═════════════════════════0'═════════════════4' - * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ - * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ - * 8───────────────0──────────────────────────0──────────────────4 - * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ - * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ - * 7═══════════════6══════════════════════════6══════════════════5 - * - * - * @param string $cross Crossing char (see #0 of example) - * @param string $topLeft Top left char (see #1 of example) - * @param string $topMid Top mid char (see #2 of example) - * @param string $topRight Top right char (see #3 of example) - * @param string $midRight Mid right char (see #4 of example) - * @param string $bottomRight Bottom right char (see #5 of example) - * @param string $bottomMid Bottom mid char (see #6 of example) - * @param string $bottomLeft Bottom left char (see #7 of example) - * @param string $midLeft Mid left char (see #8 of example) - * @param string|null $topLeftBottom Top left bottom char (see #8' of example), equals to $midLeft if null - * @param string|null $topMidBottom Top mid bottom char (see #0' of example), equals to $cross if null - * @param string|null $topRightBottom Top right bottom char (see #4' of example), equals to $midRight if null - */ - public function setCrossingChars(string $cross, string $topLeft, string $topMid, string $topRight, string $midRight, string $bottomRight, string $bottomMid, string $bottomLeft, string $midLeft, string $topLeftBottom = null, string $topMidBottom = null, string $topRightBottom = null): self - { - $this->crossingChar = $cross; - $this->crossingTopLeftChar = $topLeft; - $this->crossingTopMidChar = $topMid; - $this->crossingTopRightChar = $topRight; - $this->crossingMidRightChar = $midRight; - $this->crossingBottomRightChar = $bottomRight; - $this->crossingBottomMidChar = $bottomMid; - $this->crossingBottomLeftChar = $bottomLeft; - $this->crossingMidLeftChar = $midLeft; - $this->crossingTopLeftBottomChar = $topLeftBottom ?? $midLeft; - $this->crossingTopMidBottomChar = $topMidBottom ?? $cross; - $this->crossingTopRightBottomChar = $topRightBottom ?? $midRight; - - return $this; - } - - /** - * Sets default crossing character used for each cross. - * - * @see {@link setCrossingChars()} for setting each crossing individually. - */ - public function setDefaultCrossingChar(string $char): self - { - return $this->setCrossingChars($char, $char, $char, $char, $char, $char, $char, $char, $char); - } - - /** - * Sets crossing character. - * - * @param string $crossingChar - * - * @return $this - * - * @deprecated since Symfony 4.1. Use {@link setDefaultCrossingChar()} instead. - */ - public function setCrossingChar($crossingChar) - { - @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.1. Use setDefaultCrossingChar() instead.', __METHOD__), E_USER_DEPRECATED); - - return $this->setDefaultCrossingChar($crossingChar); - } - - /** - * Gets crossing character. - * - * @return string - */ - public function getCrossingChar() - { - return $this->crossingChar; - } - - /** - * Gets crossing characters. - * - * @internal - */ - public function getCrossingChars(): array - { - return [ - $this->crossingChar, - $this->crossingTopLeftChar, - $this->crossingTopMidChar, - $this->crossingTopRightChar, - $this->crossingMidRightChar, - $this->crossingBottomRightChar, - $this->crossingBottomMidChar, - $this->crossingBottomLeftChar, - $this->crossingMidLeftChar, - $this->crossingTopLeftBottomChar, - $this->crossingTopMidBottomChar, - $this->crossingTopRightBottomChar, - ]; - } - - /** - * Sets header cell format. - * - * @param string $cellHeaderFormat - * - * @return $this - */ - public function setCellHeaderFormat($cellHeaderFormat) - { - $this->cellHeaderFormat = $cellHeaderFormat; - - return $this; - } - - /** - * Gets header cell format. - * - * @return string - */ - public function getCellHeaderFormat() - { - return $this->cellHeaderFormat; - } - - /** - * Sets row cell format. - * - * @param string $cellRowFormat - * - * @return $this - */ - public function setCellRowFormat($cellRowFormat) - { - $this->cellRowFormat = $cellRowFormat; - - return $this; - } - - /** - * Gets row cell format. - * - * @return string - */ - public function getCellRowFormat() - { - return $this->cellRowFormat; - } - - /** - * Sets row cell content format. - * - * @param string $cellRowContentFormat - * - * @return $this - */ - public function setCellRowContentFormat($cellRowContentFormat) - { - $this->cellRowContentFormat = $cellRowContentFormat; - - return $this; - } - - /** - * Gets row cell content format. - * - * @return string - */ - public function getCellRowContentFormat() - { - return $this->cellRowContentFormat; - } - - /** - * Sets table border format. - * - * @param string $borderFormat - * - * @return $this - */ - public function setBorderFormat($borderFormat) - { - $this->borderFormat = $borderFormat; - - return $this; - } - - /** - * Gets table border format. - * - * @return string - */ - public function getBorderFormat() - { - return $this->borderFormat; - } - - /** - * Sets cell padding type. - * - * @param int $padType STR_PAD_* - * - * @return $this - */ - public function setPadType($padType) - { - if (!\in_array($padType, [STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH], true)) { - throw new InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).'); - } - - $this->padType = $padType; - - return $this; - } - - /** - * Gets cell padding type. - * - * @return int - */ - public function getPadType() - { - return $this->padType; - } - - public function getHeaderTitleFormat(): string - { - return $this->headerTitleFormat; - } - - public function setHeaderTitleFormat(string $format): self - { - $this->headerTitleFormat = $format; - - return $this; - } - - public function getFooterTitleFormat(): string - { - return $this->footerTitleFormat; - } - - public function setFooterTitleFormat(string $format): self - { - $this->footerTitleFormat = $format; - - return $this; - } -} diff --git a/vendor/symfony/console/Input/ArgvInput.php b/vendor/symfony/console/Input/ArgvInput.php deleted file mode 100644 index 3bc2055..0000000 --- a/vendor/symfony/console/Input/ArgvInput.php +++ /dev/null @@ -1,352 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\RuntimeException; - -/** - * ArgvInput represents an input coming from the CLI arguments. - * - * Usage: - * - * $input = new ArgvInput(); - * - * By default, the `$_SERVER['argv']` array is used for the input values. - * - * This can be overridden by explicitly passing the input values in the constructor: - * - * $input = new ArgvInput($_SERVER['argv']); - * - * If you pass it yourself, don't forget that the first element of the array - * is the name of the running application. - * - * When passing an argument to the constructor, be sure that it respects - * the same rules as the argv one. It's almost always better to use the - * `StringInput` when you want to provide your own input. - * - * @author Fabien Potencier - * - * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html - * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02 - */ -class ArgvInput extends Input -{ - private $tokens; - private $parsed; - - /** - * @param array|null $argv An array of parameters from the CLI (in the argv format) - */ - public function __construct(array $argv = null, InputDefinition $definition = null) - { - if (null === $argv) { - $argv = $_SERVER['argv']; - } - - // strip the application name - array_shift($argv); - - $this->tokens = $argv; - - parent::__construct($definition); - } - - protected function setTokens(array $tokens) - { - $this->tokens = $tokens; - } - - /** - * {@inheritdoc} - */ - protected function parse() - { - $parseOptions = true; - $this->parsed = $this->tokens; - while (null !== $token = array_shift($this->parsed)) { - if ($parseOptions && '' == $token) { - $this->parseArgument($token); - } elseif ($parseOptions && '--' == $token) { - $parseOptions = false; - } elseif ($parseOptions && 0 === strpos($token, '--')) { - $this->parseLongOption($token); - } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) { - $this->parseShortOption($token); - } else { - $this->parseArgument($token); - } - } - } - - /** - * Parses a short option. - */ - private function parseShortOption(string $token) - { - $name = substr($token, 1); - - if (\strlen($name) > 1) { - if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) { - // an option with a value (with no space) - $this->addShortOption($name[0], substr($name, 1)); - } else { - $this->parseShortOptionSet($name); - } - } else { - $this->addShortOption($name, null); - } - } - - /** - * Parses a short option set. - * - * @throws RuntimeException When option given doesn't exist - */ - private function parseShortOptionSet(string $name) - { - $len = \strlen($name); - for ($i = 0; $i < $len; ++$i) { - if (!$this->definition->hasShortcut($name[$i])) { - $encoding = mb_detect_encoding($name, null, true); - throw new RuntimeException(sprintf('The "-%s" option does not exist.', false === $encoding ? $name[$i] : mb_substr($name, $i, 1, $encoding))); - } - - $option = $this->definition->getOptionForShortcut($name[$i]); - if ($option->acceptValue()) { - $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1)); - - break; - } else { - $this->addLongOption($option->getName(), null); - } - } - } - - /** - * Parses a long option. - */ - private function parseLongOption(string $token) - { - $name = substr($token, 2); - - if (false !== $pos = strpos($name, '=')) { - if (0 === \strlen($value = substr($name, $pos + 1))) { - array_unshift($this->parsed, $value); - } - $this->addLongOption(substr($name, 0, $pos), $value); - } else { - $this->addLongOption($name, null); - } - } - - /** - * Parses an argument. - * - * @throws RuntimeException When too many arguments are given - */ - private function parseArgument(string $token) - { - $c = \count($this->arguments); - - // if input is expecting another argument, add it - if ($this->definition->hasArgument($c)) { - $arg = $this->definition->getArgument($c); - $this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token; - - // if last argument isArray(), append token to last argument - } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) { - $arg = $this->definition->getArgument($c - 1); - $this->arguments[$arg->getName()][] = $token; - - // unexpected argument - } else { - $all = $this->definition->getArguments(); - if (\count($all)) { - throw new RuntimeException(sprintf('Too many arguments, expected arguments "%s".', implode('" "', array_keys($all)))); - } - - throw new RuntimeException(sprintf('No arguments expected, got "%s".', $token)); - } - } - - /** - * Adds a short option value. - * - * @throws RuntimeException When option given doesn't exist - */ - private function addShortOption(string $shortcut, $value) - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * Adds a long option value. - * - * @throws RuntimeException When option given doesn't exist - */ - private function addLongOption(string $name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new RuntimeException(sprintf('The "--%s" option does not exist.', $name)); - } - - $option = $this->definition->getOption($name); - - if (null !== $value && !$option->acceptValue()) { - throw new RuntimeException(sprintf('The "--%s" option does not accept a value.', $name)); - } - - if (\in_array($value, ['', null], true) && $option->acceptValue() && \count($this->parsed)) { - // if option accepts an optional or mandatory argument - // let's see if there is one provided - $next = array_shift($this->parsed); - if ((isset($next[0]) && '-' !== $next[0]) || \in_array($next, ['', null], true)) { - $value = $next; - } else { - array_unshift($this->parsed, $next); - } - } - - if (null === $value) { - if ($option->isValueRequired()) { - throw new RuntimeException(sprintf('The "--%s" option requires a value.', $name)); - } - - if (!$option->isArray() && !$option->isValueOptional()) { - $value = true; - } - } - - if ($option->isArray()) { - $this->options[$name][] = $value; - } else { - $this->options[$name] = $value; - } - } - - /** - * {@inheritdoc} - */ - public function getFirstArgument() - { - $isOption = false; - foreach ($this->tokens as $i => $token) { - if ($token && '-' === $token[0]) { - if (false !== strpos($token, '=') || !isset($this->tokens[$i + 1])) { - continue; - } - - // If it's a long option, consider that everything after "--" is the option name. - // Otherwise, use the last char (if it's a short option set, only the last one can take a value with space separator) - $name = '-' === $token[1] ? substr($token, 2) : substr($token, -1); - if (!isset($this->options[$name]) && !$this->definition->hasShortcut($name)) { - // noop - } elseif ((isset($this->options[$name]) || isset($this->options[$name = $this->definition->shortcutToName($name)])) && $this->tokens[$i + 1] === $this->options[$name]) { - $isOption = true; - } - - continue; - } - - if ($isOption) { - $isOption = false; - continue; - } - - return $token; - } - - return null; - } - - /** - * {@inheritdoc} - */ - public function hasParameterOption($values, $onlyParams = false) - { - $values = (array) $values; - - foreach ($this->tokens as $token) { - if ($onlyParams && '--' === $token) { - return false; - } - foreach ($values as $value) { - // Options with values: - // For long options, test for '--option=' at beginning - // For short options, test for '-o' at beginning - $leading = 0 === strpos($value, '--') ? $value.'=' : $value; - if ($token === $value || '' !== $leading && 0 === strpos($token, $leading)) { - return true; - } - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function getParameterOption($values, $default = false, $onlyParams = false) - { - $values = (array) $values; - $tokens = $this->tokens; - - while (0 < \count($tokens)) { - $token = array_shift($tokens); - if ($onlyParams && '--' === $token) { - return $default; - } - - foreach ($values as $value) { - if ($token === $value) { - return array_shift($tokens); - } - // Options with values: - // For long options, test for '--option=' at beginning - // For short options, test for '-o' at beginning - $leading = 0 === strpos($value, '--') ? $value.'=' : $value; - if ('' !== $leading && 0 === strpos($token, $leading)) { - return substr($token, \strlen($leading)); - } - } - } - - return $default; - } - - /** - * Returns a stringified representation of the args passed to the command. - * - * @return string - */ - public function __toString() - { - $tokens = array_map(function ($token) { - if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) { - return $match[1].$this->escapeToken($match[2]); - } - - if ($token && '-' !== $token[0]) { - return $this->escapeToken($token); - } - - return $token; - }, $this->tokens); - - return implode(' ', $tokens); - } -} diff --git a/vendor/symfony/console/Input/ArrayInput.php b/vendor/symfony/console/Input/ArrayInput.php deleted file mode 100644 index 25d2b75..0000000 --- a/vendor/symfony/console/Input/ArrayInput.php +++ /dev/null @@ -1,202 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\InvalidOptionException; - -/** - * ArrayInput represents an input provided as an array. - * - * Usage: - * - * $input = new ArrayInput(['command' => 'foo:bar', 'foo' => 'bar', '--bar' => 'foobar']); - * - * @author Fabien Potencier - */ -class ArrayInput extends Input -{ - private $parameters; - - public function __construct(array $parameters, InputDefinition $definition = null) - { - $this->parameters = $parameters; - - parent::__construct($definition); - } - - /** - * {@inheritdoc} - */ - public function getFirstArgument() - { - foreach ($this->parameters as $param => $value) { - if ($param && \is_string($param) && '-' === $param[0]) { - continue; - } - - return $value; - } - - return null; - } - - /** - * {@inheritdoc} - */ - public function hasParameterOption($values, $onlyParams = false) - { - $values = (array) $values; - - foreach ($this->parameters as $k => $v) { - if (!\is_int($k)) { - $v = $k; - } - - if ($onlyParams && '--' === $v) { - return false; - } - - if (\in_array($v, $values)) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function getParameterOption($values, $default = false, $onlyParams = false) - { - $values = (array) $values; - - foreach ($this->parameters as $k => $v) { - if ($onlyParams && ('--' === $k || (\is_int($k) && '--' === $v))) { - return $default; - } - - if (\is_int($k)) { - if (\in_array($v, $values)) { - return true; - } - } elseif (\in_array($k, $values)) { - return $v; - } - } - - return $default; - } - - /** - * Returns a stringified representation of the args passed to the command. - * - * @return string - */ - public function __toString() - { - $params = []; - foreach ($this->parameters as $param => $val) { - if ($param && \is_string($param) && '-' === $param[0]) { - if (\is_array($val)) { - foreach ($val as $v) { - $params[] = $param.('' != $v ? '='.$this->escapeToken($v) : ''); - } - } else { - $params[] = $param.('' != $val ? '='.$this->escapeToken($val) : ''); - } - } else { - $params[] = \is_array($val) ? implode(' ', array_map([$this, 'escapeToken'], $val)) : $this->escapeToken($val); - } - } - - return implode(' ', $params); - } - - /** - * {@inheritdoc} - */ - protected function parse() - { - foreach ($this->parameters as $key => $value) { - if ('--' === $key) { - return; - } - if (0 === strpos($key, '--')) { - $this->addLongOption(substr($key, 2), $value); - } elseif (0 === strpos($key, '-')) { - $this->addShortOption(substr($key, 1), $value); - } else { - $this->addArgument($key, $value); - } - } - } - - /** - * Adds a short option value. - * - * @throws InvalidOptionException When option given doesn't exist - */ - private function addShortOption(string $shortcut, $value) - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new InvalidOptionException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * Adds a long option value. - * - * @throws InvalidOptionException When option given doesn't exist - * @throws InvalidOptionException When a required value is missing - */ - private function addLongOption(string $name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new InvalidOptionException(sprintf('The "--%s" option does not exist.', $name)); - } - - $option = $this->definition->getOption($name); - - if (null === $value) { - if ($option->isValueRequired()) { - throw new InvalidOptionException(sprintf('The "--%s" option requires a value.', $name)); - } - - if (!$option->isValueOptional()) { - $value = true; - } - } - - $this->options[$name] = $value; - } - - /** - * Adds an argument value. - * - * @param string|int $name The argument name - * @param mixed $value The value for the argument - * - * @throws InvalidArgumentException When argument given doesn't exist - */ - private function addArgument($name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } -} diff --git a/vendor/symfony/console/Input/Input.php b/vendor/symfony/console/Input/Input.php deleted file mode 100644 index c122031..0000000 --- a/vendor/symfony/console/Input/Input.php +++ /dev/null @@ -1,203 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\RuntimeException; - -/** - * Input is the base class for all concrete Input classes. - * - * Three concrete classes are provided by default: - * - * * `ArgvInput`: The input comes from the CLI arguments (argv) - * * `StringInput`: The input is provided as a string - * * `ArrayInput`: The input is provided as an array - * - * @author Fabien Potencier - */ -abstract class Input implements InputInterface, StreamableInputInterface -{ - protected $definition; - protected $stream; - protected $options = []; - protected $arguments = []; - protected $interactive = true; - - public function __construct(InputDefinition $definition = null) - { - if (null === $definition) { - $this->definition = new InputDefinition(); - } else { - $this->bind($definition); - $this->validate(); - } - } - - /** - * {@inheritdoc} - */ - public function bind(InputDefinition $definition) - { - $this->arguments = []; - $this->options = []; - $this->definition = $definition; - - $this->parse(); - } - - /** - * Processes command line arguments. - */ - abstract protected function parse(); - - /** - * {@inheritdoc} - */ - public function validate() - { - $definition = $this->definition; - $givenArguments = $this->arguments; - - $missingArguments = array_filter(array_keys($definition->getArguments()), function ($argument) use ($definition, $givenArguments) { - return !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired(); - }); - - if (\count($missingArguments) > 0) { - throw new RuntimeException(sprintf('Not enough arguments (missing: "%s").', implode(', ', $missingArguments))); - } - } - - /** - * {@inheritdoc} - */ - public function isInteractive() - { - return $this->interactive; - } - - /** - * {@inheritdoc} - */ - public function setInteractive($interactive) - { - $this->interactive = (bool) $interactive; - } - - /** - * {@inheritdoc} - */ - public function getArguments() - { - return array_merge($this->definition->getArgumentDefaults(), $this->arguments); - } - - /** - * {@inheritdoc} - */ - public function getArgument($name) - { - if (!$this->definition->hasArgument($name)) { - throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - return isset($this->arguments[$name]) ? $this->arguments[$name] : $this->definition->getArgument($name)->getDefault(); - } - - /** - * {@inheritdoc} - */ - public function setArgument($name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } - - /** - * {@inheritdoc} - */ - public function hasArgument($name) - { - return $this->definition->hasArgument($name); - } - - /** - * {@inheritdoc} - */ - public function getOptions() - { - return array_merge($this->definition->getOptionDefaults(), $this->options); - } - - /** - * {@inheritdoc} - */ - public function getOption($name) - { - if (!$this->definition->hasOption($name)) { - throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - return \array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault(); - } - - /** - * {@inheritdoc} - */ - public function setOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - $this->options[$name] = $value; - } - - /** - * {@inheritdoc} - */ - public function hasOption($name) - { - return $this->definition->hasOption($name); - } - - /** - * Escapes a token through escapeshellarg if it contains unsafe chars. - * - * @param string $token - * - * @return string - */ - public function escapeToken($token) - { - return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token); - } - - /** - * {@inheritdoc} - */ - public function setStream($stream) - { - $this->stream = $stream; - } - - /** - * {@inheritdoc} - */ - public function getStream() - { - return $this->stream; - } -} diff --git a/vendor/symfony/console/Input/InputArgument.php b/vendor/symfony/console/Input/InputArgument.php deleted file mode 100644 index b6aa645..0000000 --- a/vendor/symfony/console/Input/InputArgument.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; - -/** - * Represents a command line argument. - * - * @author Fabien Potencier - */ -class InputArgument -{ - const REQUIRED = 1; - const OPTIONAL = 2; - const IS_ARRAY = 4; - - private $name; - private $mode; - private $default; - private $description; - - /** - * @param string $name The argument name - * @param int|null $mode The argument mode: self::REQUIRED or self::OPTIONAL - * @param string $description A description text - * @param string|string[]|null $default The default value (for self::OPTIONAL mode only) - * - * @throws InvalidArgumentException When argument mode is not valid - */ - public function __construct(string $name, int $mode = null, string $description = '', $default = null) - { - if (null === $mode) { - $mode = self::OPTIONAL; - } elseif ($mode > 7 || $mode < 1) { - throw new InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->mode = $mode; - $this->description = $description; - - $this->setDefault($default); - } - - /** - * Returns the argument name. - * - * @return string The argument name - */ - public function getName() - { - return $this->name; - } - - /** - * Returns true if the argument is required. - * - * @return bool true if parameter mode is self::REQUIRED, false otherwise - */ - public function isRequired() - { - return self::REQUIRED === (self::REQUIRED & $this->mode); - } - - /** - * Returns true if the argument can take multiple values. - * - * @return bool true if mode is self::IS_ARRAY, false otherwise - */ - public function isArray() - { - return self::IS_ARRAY === (self::IS_ARRAY & $this->mode); - } - - /** - * Sets the default value. - * - * @param string|string[]|null $default The default value - * - * @throws LogicException When incorrect default value is given - */ - public function setDefault($default = null) - { - if (self::REQUIRED === $this->mode && null !== $default) { - throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = []; - } elseif (!\is_array($default)) { - throw new LogicException('A default value for an array argument must be an array.'); - } - } - - $this->default = $default; - } - - /** - * Returns the default value. - * - * @return string|string[]|null The default value - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns the description text. - * - * @return string The description text - */ - public function getDescription() - { - return $this->description; - } -} diff --git a/vendor/symfony/console/Input/InputAwareInterface.php b/vendor/symfony/console/Input/InputAwareInterface.php deleted file mode 100644 index 5a288de..0000000 --- a/vendor/symfony/console/Input/InputAwareInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * InputAwareInterface should be implemented by classes that depends on the - * Console Input. - * - * @author Wouter J - */ -interface InputAwareInterface -{ - /** - * Sets the Console Input. - */ - public function setInput(InputInterface $input); -} diff --git a/vendor/symfony/console/Input/InputDefinition.php b/vendor/symfony/console/Input/InputDefinition.php deleted file mode 100644 index 75a9752..0000000 --- a/vendor/symfony/console/Input/InputDefinition.php +++ /dev/null @@ -1,400 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; - -/** - * A InputDefinition represents a set of valid command line arguments and options. - * - * Usage: - * - * $definition = new InputDefinition([ - * new InputArgument('name', InputArgument::REQUIRED), - * new InputOption('foo', 'f', InputOption::VALUE_REQUIRED), - * ]); - * - * @author Fabien Potencier - */ -class InputDefinition -{ - private $arguments; - private $requiredCount; - private $hasAnArrayArgument = false; - private $hasOptional; - private $options; - private $shortcuts; - - /** - * @param array $definition An array of InputArgument and InputOption instance - */ - public function __construct(array $definition = []) - { - $this->setDefinition($definition); - } - - /** - * Sets the definition of the input. - */ - public function setDefinition(array $definition) - { - $arguments = []; - $options = []; - foreach ($definition as $item) { - if ($item instanceof InputOption) { - $options[] = $item; - } else { - $arguments[] = $item; - } - } - - $this->setArguments($arguments); - $this->setOptions($options); - } - - /** - * Sets the InputArgument objects. - * - * @param InputArgument[] $arguments An array of InputArgument objects - */ - public function setArguments($arguments = []) - { - $this->arguments = []; - $this->requiredCount = 0; - $this->hasOptional = false; - $this->hasAnArrayArgument = false; - $this->addArguments($arguments); - } - - /** - * Adds an array of InputArgument objects. - * - * @param InputArgument[] $arguments An array of InputArgument objects - */ - public function addArguments($arguments = []) - { - if (null !== $arguments) { - foreach ($arguments as $argument) { - $this->addArgument($argument); - } - } - } - - /** - * @throws LogicException When incorrect argument is given - */ - public function addArgument(InputArgument $argument) - { - if (isset($this->arguments[$argument->getName()])) { - throw new LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName())); - } - - if ($this->hasAnArrayArgument) { - throw new LogicException('Cannot add an argument after an array argument.'); - } - - if ($argument->isRequired() && $this->hasOptional) { - throw new LogicException('Cannot add a required argument after an optional one.'); - } - - if ($argument->isArray()) { - $this->hasAnArrayArgument = true; - } - - if ($argument->isRequired()) { - ++$this->requiredCount; - } else { - $this->hasOptional = true; - } - - $this->arguments[$argument->getName()] = $argument; - } - - /** - * Returns an InputArgument by name or by position. - * - * @param string|int $name The InputArgument name or position - * - * @return InputArgument An InputArgument object - * - * @throws InvalidArgumentException When argument given doesn't exist - */ - public function getArgument($name) - { - if (!$this->hasArgument($name)) { - throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $arguments = \is_int($name) ? array_values($this->arguments) : $this->arguments; - - return $arguments[$name]; - } - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|int $name The InputArgument name or position - * - * @return bool true if the InputArgument object exists, false otherwise - */ - public function hasArgument($name) - { - $arguments = \is_int($name) ? array_values($this->arguments) : $this->arguments; - - return isset($arguments[$name]); - } - - /** - * Gets the array of InputArgument objects. - * - * @return InputArgument[] An array of InputArgument objects - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Returns the number of InputArguments. - * - * @return int The number of InputArguments - */ - public function getArgumentCount() - { - return $this->hasAnArrayArgument ? PHP_INT_MAX : \count($this->arguments); - } - - /** - * Returns the number of required InputArguments. - * - * @return int The number of required InputArguments - */ - public function getArgumentRequiredCount() - { - return $this->requiredCount; - } - - /** - * Gets the default values. - * - * @return array An array of default values - */ - public function getArgumentDefaults() - { - $values = []; - foreach ($this->arguments as $argument) { - $values[$argument->getName()] = $argument->getDefault(); - } - - return $values; - } - - /** - * Sets the InputOption objects. - * - * @param InputOption[] $options An array of InputOption objects - */ - public function setOptions($options = []) - { - $this->options = []; - $this->shortcuts = []; - $this->addOptions($options); - } - - /** - * Adds an array of InputOption objects. - * - * @param InputOption[] $options An array of InputOption objects - */ - public function addOptions($options = []) - { - foreach ($options as $option) { - $this->addOption($option); - } - } - - /** - * @throws LogicException When option given already exist - */ - public function addOption(InputOption $option) - { - if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { - throw new LogicException(sprintf('An option named "%s" already exists.', $option->getName())); - } - - if ($option->getShortcut()) { - foreach (explode('|', $option->getShortcut()) as $shortcut) { - if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) { - throw new LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut)); - } - } - } - - $this->options[$option->getName()] = $option; - if ($option->getShortcut()) { - foreach (explode('|', $option->getShortcut()) as $shortcut) { - $this->shortcuts[$shortcut] = $option->getName(); - } - } - } - - /** - * Returns an InputOption by name. - * - * @param string $name The InputOption name - * - * @return InputOption A InputOption object - * - * @throws InvalidArgumentException When option given doesn't exist - */ - public function getOption($name) - { - if (!$this->hasOption($name)) { - throw new InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); - } - - return $this->options[$name]; - } - - /** - * Returns true if an InputOption object exists by name. - * - * This method can't be used to check if the user included the option when - * executing the command (use getOption() instead). - * - * @param string $name The InputOption name - * - * @return bool true if the InputOption object exists, false otherwise - */ - public function hasOption($name) - { - return isset($this->options[$name]); - } - - /** - * Gets the array of InputOption objects. - * - * @return InputOption[] An array of InputOption objects - */ - public function getOptions() - { - return $this->options; - } - - /** - * Returns true if an InputOption object exists by shortcut. - * - * @param string $name The InputOption shortcut - * - * @return bool true if the InputOption object exists, false otherwise - */ - public function hasShortcut($name) - { - return isset($this->shortcuts[$name]); - } - - /** - * Gets an InputOption by shortcut. - * - * @param string $shortcut The Shortcut name - * - * @return InputOption An InputOption object - */ - public function getOptionForShortcut($shortcut) - { - return $this->getOption($this->shortcutToName($shortcut)); - } - - /** - * Gets an array of default values. - * - * @return array An array of all default values - */ - public function getOptionDefaults() - { - $values = []; - foreach ($this->options as $option) { - $values[$option->getName()] = $option->getDefault(); - } - - return $values; - } - - /** - * Returns the InputOption name given a shortcut. - * - * @throws InvalidArgumentException When option given does not exist - * - * @internal - */ - public function shortcutToName(string $shortcut): string - { - if (!isset($this->shortcuts[$shortcut])) { - throw new InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - return $this->shortcuts[$shortcut]; - } - - /** - * Gets the synopsis. - * - * @param bool $short Whether to return the short version (with options folded) or not - * - * @return string The synopsis - */ - public function getSynopsis($short = false) - { - $elements = []; - - if ($short && $this->getOptions()) { - $elements[] = '[options]'; - } elseif (!$short) { - foreach ($this->getOptions() as $option) { - $value = ''; - if ($option->acceptValue()) { - $value = sprintf( - ' %s%s%s', - $option->isValueOptional() ? '[' : '', - strtoupper($option->getName()), - $option->isValueOptional() ? ']' : '' - ); - } - - $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : ''; - $elements[] = sprintf('[%s--%s%s]', $shortcut, $option->getName(), $value); - } - } - - if (\count($elements) && $this->getArguments()) { - $elements[] = '[--]'; - } - - $tail = ''; - foreach ($this->getArguments() as $argument) { - $element = '<'.$argument->getName().'>'; - if ($argument->isArray()) { - $element .= '...'; - } - - if (!$argument->isRequired()) { - $element = '['.$element; - $tail .= ']'; - } - - $elements[] = $element; - } - - return implode(' ', $elements).$tail; - } -} diff --git a/vendor/symfony/console/Input/InputInterface.php b/vendor/symfony/console/Input/InputInterface.php deleted file mode 100644 index b9bcf3b..0000000 --- a/vendor/symfony/console/Input/InputInterface.php +++ /dev/null @@ -1,163 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\RuntimeException; - -/** - * InputInterface is the interface implemented by all input classes. - * - * @author Fabien Potencier - */ -interface InputInterface -{ - /** - * Returns the first argument from the raw parameters (not parsed). - * - * @return string|null The value of the first argument or null otherwise - */ - public function getFirstArgument(); - - /** - * Returns true if the raw parameters (not parsed) contain a value. - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * Does not necessarily return the correct result for short options - * when multiple flags are combined in the same option. - * - * @param string|array $values The values to look for in the raw parameters (can be an array) - * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal - * - * @return bool true if the value is contained in the raw parameters - */ - public function hasParameterOption($values, $onlyParams = false); - - /** - * Returns the value of a raw option (not parsed). - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * Does not necessarily return the correct result for short options - * when multiple flags are combined in the same option. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * @param mixed $default The default value to return if no result is found - * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal - * - * @return mixed The option value - */ - public function getParameterOption($values, $default = false, $onlyParams = false); - - /** - * Binds the current Input instance with the given arguments and options. - * - * @throws RuntimeException - */ - public function bind(InputDefinition $definition); - - /** - * Validates the input. - * - * @throws RuntimeException When not enough arguments are given - */ - public function validate(); - - /** - * Returns all the given arguments merged with the default values. - * - * @return array - */ - public function getArguments(); - - /** - * Returns the argument value for a given argument name. - * - * @param string $name The argument name - * - * @return string|string[]|null The argument value - * - * @throws InvalidArgumentException When argument given doesn't exist - */ - public function getArgument($name); - - /** - * Sets an argument value by name. - * - * @param string $name The argument name - * @param string|string[]|null $value The argument value - * - * @throws InvalidArgumentException When argument given doesn't exist - */ - public function setArgument($name, $value); - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|int $name The InputArgument name or position - * - * @return bool true if the InputArgument object exists, false otherwise - */ - public function hasArgument($name); - - /** - * Returns all the given options merged with the default values. - * - * @return array - */ - public function getOptions(); - - /** - * Returns the option value for a given option name. - * - * @param string $name The option name - * - * @return string|string[]|bool|null The option value - * - * @throws InvalidArgumentException When option given doesn't exist - */ - public function getOption($name); - - /** - * Sets an option value by name. - * - * @param string $name The option name - * @param string|string[]|bool|null $value The option value - * - * @throws InvalidArgumentException When option given doesn't exist - */ - public function setOption($name, $value); - - /** - * Returns true if an InputOption object exists by name. - * - * @param string $name The InputOption name - * - * @return bool true if the InputOption object exists, false otherwise - */ - public function hasOption($name); - - /** - * Is this input means interactive? - * - * @return bool - */ - public function isInteractive(); - - /** - * Sets the input interactivity. - * - * @param bool $interactive If the input should be interactive - */ - public function setInteractive($interactive); -} diff --git a/vendor/symfony/console/Input/InputOption.php b/vendor/symfony/console/Input/InputOption.php deleted file mode 100644 index d62e0ae..0000000 --- a/vendor/symfony/console/Input/InputOption.php +++ /dev/null @@ -1,208 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; - -/** - * Represents a command line option. - * - * @author Fabien Potencier - */ -class InputOption -{ - const VALUE_NONE = 1; - const VALUE_REQUIRED = 2; - const VALUE_OPTIONAL = 4; - const VALUE_IS_ARRAY = 8; - - private $name; - private $shortcut; - private $mode; - private $default; - private $description; - - /** - * @param string $name The option name - * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts - * @param int|null $mode The option mode: One of the VALUE_* constants - * @param string $description A description text - * @param string|string[]|int|bool|null $default The default value (must be null for self::VALUE_NONE) - * - * @throws InvalidArgumentException If option mode is invalid or incompatible - */ - public function __construct(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null) - { - if (0 === strpos($name, '--')) { - $name = substr($name, 2); - } - - if (empty($name)) { - throw new InvalidArgumentException('An option name cannot be empty.'); - } - - if (empty($shortcut)) { - $shortcut = null; - } - - if (null !== $shortcut) { - if (\is_array($shortcut)) { - $shortcut = implode('|', $shortcut); - } - $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-')); - $shortcuts = array_filter($shortcuts); - $shortcut = implode('|', $shortcuts); - - if (empty($shortcut)) { - throw new InvalidArgumentException('An option shortcut cannot be empty.'); - } - } - - if (null === $mode) { - $mode = self::VALUE_NONE; - } elseif ($mode > 15 || $mode < 1) { - throw new InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->shortcut = $shortcut; - $this->mode = $mode; - $this->description = $description; - - if ($this->isArray() && !$this->acceptValue()) { - throw new InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.'); - } - - $this->setDefault($default); - } - - /** - * Returns the option shortcut. - * - * @return string|null The shortcut - */ - public function getShortcut() - { - return $this->shortcut; - } - - /** - * Returns the option name. - * - * @return string The name - */ - public function getName() - { - return $this->name; - } - - /** - * Returns true if the option accepts a value. - * - * @return bool true if value mode is not self::VALUE_NONE, false otherwise - */ - public function acceptValue() - { - return $this->isValueRequired() || $this->isValueOptional(); - } - - /** - * Returns true if the option requires a value. - * - * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise - */ - public function isValueRequired() - { - return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode); - } - - /** - * Returns true if the option takes an optional value. - * - * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise - */ - public function isValueOptional() - { - return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode); - } - - /** - * Returns true if the option can take multiple values. - * - * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise - */ - public function isArray() - { - return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode); - } - - /** - * Sets the default value. - * - * @param string|string[]|int|bool|null $default The default value - * - * @throws LogicException When incorrect default value is given - */ - public function setDefault($default = null) - { - if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) { - throw new LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = []; - } elseif (!\is_array($default)) { - throw new LogicException('A default value for an array option must be an array.'); - } - } - - $this->default = $this->acceptValue() ? $default : false; - } - - /** - * Returns the default value. - * - * @return string|string[]|int|bool|null The default value - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns the description text. - * - * @return string The description text - */ - public function getDescription() - { - return $this->description; - } - - /** - * Checks whether the given option equals this one. - * - * @return bool - */ - public function equals(self $option) - { - return $option->getName() === $this->getName() - && $option->getShortcut() === $this->getShortcut() - && $option->getDefault() === $this->getDefault() - && $option->isArray() === $this->isArray() - && $option->isValueRequired() === $this->isValueRequired() - && $option->isValueOptional() === $this->isValueOptional() - ; - } -} diff --git a/vendor/symfony/console/Input/StreamableInputInterface.php b/vendor/symfony/console/Input/StreamableInputInterface.php deleted file mode 100644 index d7e462f..0000000 --- a/vendor/symfony/console/Input/StreamableInputInterface.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * StreamableInputInterface is the interface implemented by all input classes - * that have an input stream. - * - * @author Robin Chalas - */ -interface StreamableInputInterface extends InputInterface -{ - /** - * Sets the input stream to read from when interacting with the user. - * - * This is mainly useful for testing purpose. - * - * @param resource $stream The input stream - */ - public function setStream($stream); - - /** - * Returns the input stream. - * - * @return resource|null - */ - public function getStream(); -} diff --git a/vendor/symfony/console/Input/StringInput.php b/vendor/symfony/console/Input/StringInput.php deleted file mode 100644 index 6fddf64..0000000 --- a/vendor/symfony/console/Input/StringInput.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * StringInput represents an input provided as a string. - * - * Usage: - * - * $input = new StringInput('foo --bar="foobar"'); - * - * @author Fabien Potencier - */ -class StringInput extends ArgvInput -{ - const REGEX_STRING = '([^\s]+?)(?:\s|(?setTokens($this->tokenize($input)); - } - - /** - * Tokenizes a string. - * - * @throws InvalidArgumentException When unable to parse input (should never happen) - */ - private function tokenize(string $input): array - { - $tokens = []; - $length = \strlen($input); - $cursor = 0; - while ($cursor < $length) { - if (preg_match('/\s+/A', $input, $match, null, $cursor)) { - } elseif (preg_match('/([^="\'\s]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, null, $cursor)) { - $tokens[] = $match[1].$match[2].stripcslashes(str_replace(['"\'', '\'"', '\'\'', '""'], '', substr($match[3], 1, \strlen($match[3]) - 2))); - } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, null, $cursor)) { - $tokens[] = stripcslashes(substr($match[0], 1, \strlen($match[0]) - 2)); - } elseif (preg_match('/'.self::REGEX_STRING.'/A', $input, $match, null, $cursor)) { - $tokens[] = stripcslashes($match[1]); - } else { - // should never happen - throw new InvalidArgumentException(sprintf('Unable to parse input near "... %s ...".', substr($input, $cursor, 10))); - } - - $cursor += \strlen($match[0]); - } - - return $tokens; - } -} diff --git a/vendor/symfony/console/LICENSE b/vendor/symfony/console/LICENSE deleted file mode 100644 index 9e936ec..0000000 --- a/vendor/symfony/console/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/console/Logger/ConsoleLogger.php b/vendor/symfony/console/Logger/ConsoleLogger.php deleted file mode 100644 index 3236118..0000000 --- a/vendor/symfony/console/Logger/ConsoleLogger.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Logger; - -use Psr\Log\AbstractLogger; -use Psr\Log\InvalidArgumentException; -use Psr\Log\LogLevel; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * PSR-3 compliant console logger. - * - * @author Kévin Dunglas - * - * @see https://www.php-fig.org/psr/psr-3/ - */ -class ConsoleLogger extends AbstractLogger -{ - const INFO = 'info'; - const ERROR = 'error'; - - private $output; - private $verbosityLevelMap = [ - LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL, - LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL, - LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL, - LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL, - LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL, - LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE, - LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE, - LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG, - ]; - private $formatLevelMap = [ - LogLevel::EMERGENCY => self::ERROR, - LogLevel::ALERT => self::ERROR, - LogLevel::CRITICAL => self::ERROR, - LogLevel::ERROR => self::ERROR, - LogLevel::WARNING => self::INFO, - LogLevel::NOTICE => self::INFO, - LogLevel::INFO => self::INFO, - LogLevel::DEBUG => self::INFO, - ]; - private $errored = false; - - public function __construct(OutputInterface $output, array $verbosityLevelMap = [], array $formatLevelMap = []) - { - $this->output = $output; - $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap; - $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap; - } - - /** - * {@inheritdoc} - * - * @return void - */ - public function log($level, $message, array $context = []) - { - if (!isset($this->verbosityLevelMap[$level])) { - throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $level)); - } - - $output = $this->output; - - // Write to the error output if necessary and available - if (self::ERROR === $this->formatLevelMap[$level]) { - if ($this->output instanceof ConsoleOutputInterface) { - $output = $output->getErrorOutput(); - } - $this->errored = true; - } - - // the if condition check isn't necessary -- it's the same one that $output will do internally anyway. - // We only do it for efficiency here as the message formatting is relatively expensive. - if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) { - $output->writeln(sprintf('<%1$s>[%2$s] %3$s', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context)), $this->verbosityLevelMap[$level]); - } - } - - /** - * Returns true when any messages have been logged at error levels. - * - * @return bool - */ - public function hasErrored() - { - return $this->errored; - } - - /** - * Interpolates context values into the message placeholders. - * - * @author PHP Framework Interoperability Group - */ - private function interpolate(string $message, array $context): string - { - if (false === strpos($message, '{')) { - return $message; - } - - $replacements = []; - foreach ($context as $key => $val) { - if (null === $val || is_scalar($val) || (\is_object($val) && method_exists($val, '__toString'))) { - $replacements["{{$key}}"] = $val; - } elseif ($val instanceof \DateTimeInterface) { - $replacements["{{$key}}"] = $val->format(\DateTime::RFC3339); - } elseif (\is_object($val)) { - $replacements["{{$key}}"] = '[object '.\get_class($val).']'; - } else { - $replacements["{{$key}}"] = '['.\gettype($val).']'; - } - } - - return strtr($message, $replacements); - } -} diff --git a/vendor/symfony/console/Output/BufferedOutput.php b/vendor/symfony/console/Output/BufferedOutput.php deleted file mode 100644 index 8afc893..0000000 --- a/vendor/symfony/console/Output/BufferedOutput.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -/** - * @author Jean-François Simon - */ -class BufferedOutput extends Output -{ - private $buffer = ''; - - /** - * Empties buffer and returns its content. - * - * @return string - */ - public function fetch() - { - $content = $this->buffer; - $this->buffer = ''; - - return $content; - } - - /** - * {@inheritdoc} - */ - protected function doWrite($message, $newline) - { - $this->buffer .= $message; - - if ($newline) { - $this->buffer .= PHP_EOL; - } - } -} diff --git a/vendor/symfony/console/Output/ConsoleOutput.php b/vendor/symfony/console/Output/ConsoleOutput.php deleted file mode 100644 index 9684ad6..0000000 --- a/vendor/symfony/console/Output/ConsoleOutput.php +++ /dev/null @@ -1,159 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * ConsoleOutput is the default class for all CLI output. It uses STDOUT and STDERR. - * - * This class is a convenient wrapper around `StreamOutput` for both STDOUT and STDERR. - * - * $output = new ConsoleOutput(); - * - * This is equivalent to: - * - * $output = new StreamOutput(fopen('php://stdout', 'w')); - * $stdErr = new StreamOutput(fopen('php://stderr', 'w')); - * - * @author Fabien Potencier - */ -class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface -{ - private $stderr; - private $consoleSectionOutputs = []; - - /** - * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) - * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) - * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) - */ - public function __construct(int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = null, OutputFormatterInterface $formatter = null) - { - parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter); - - $actualDecorated = $this->isDecorated(); - $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated, $this->getFormatter()); - - if (null === $decorated) { - $this->setDecorated($actualDecorated && $this->stderr->isDecorated()); - } - } - - /** - * Creates a new output section. - */ - public function section(): ConsoleSectionOutput - { - return new ConsoleSectionOutput($this->getStream(), $this->consoleSectionOutputs, $this->getVerbosity(), $this->isDecorated(), $this->getFormatter()); - } - - /** - * {@inheritdoc} - */ - public function setDecorated($decorated) - { - parent::setDecorated($decorated); - $this->stderr->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - parent::setFormatter($formatter); - $this->stderr->setFormatter($formatter); - } - - /** - * {@inheritdoc} - */ - public function setVerbosity($level) - { - parent::setVerbosity($level); - $this->stderr->setVerbosity($level); - } - - /** - * {@inheritdoc} - */ - public function getErrorOutput() - { - return $this->stderr; - } - - /** - * {@inheritdoc} - */ - public function setErrorOutput(OutputInterface $error) - { - $this->stderr = $error; - } - - /** - * Returns true if current environment supports writing console output to - * STDOUT. - * - * @return bool - */ - protected function hasStdoutSupport() - { - return false === $this->isRunningOS400(); - } - - /** - * Returns true if current environment supports writing console output to - * STDERR. - * - * @return bool - */ - protected function hasStderrSupport() - { - return false === $this->isRunningOS400(); - } - - /** - * Checks if current executing environment is IBM iSeries (OS400), which - * doesn't properly convert character-encodings between ASCII to EBCDIC. - */ - private function isRunningOS400(): bool - { - $checks = [ - \function_exists('php_uname') ? php_uname('s') : '', - getenv('OSTYPE'), - PHP_OS, - ]; - - return false !== stripos(implode(';', $checks), 'OS400'); - } - - /** - * @return resource - */ - private function openOutputStream() - { - if (!$this->hasStdoutSupport()) { - return fopen('php://output', 'w'); - } - - return @fopen('php://stdout', 'w') ?: fopen('php://output', 'w'); - } - - /** - * @return resource - */ - private function openErrorStream() - { - return fopen($this->hasStderrSupport() ? 'php://stderr' : 'php://output', 'w'); - } -} diff --git a/vendor/symfony/console/Output/ConsoleOutputInterface.php b/vendor/symfony/console/Output/ConsoleOutputInterface.php deleted file mode 100644 index f4c2fa6..0000000 --- a/vendor/symfony/console/Output/ConsoleOutputInterface.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -/** - * ConsoleOutputInterface is the interface implemented by ConsoleOutput class. - * This adds information about stderr and section output stream. - * - * @author Dariusz Górecki - * - * @method ConsoleSectionOutput section() Creates a new output section - */ -interface ConsoleOutputInterface extends OutputInterface -{ - /** - * Gets the OutputInterface for errors. - * - * @return OutputInterface - */ - public function getErrorOutput(); - - public function setErrorOutput(OutputInterface $error); -} diff --git a/vendor/symfony/console/Output/ConsoleSectionOutput.php b/vendor/symfony/console/Output/ConsoleSectionOutput.php deleted file mode 100644 index 024d99d..0000000 --- a/vendor/symfony/console/Output/ConsoleSectionOutput.php +++ /dev/null @@ -1,143 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\Console\Helper\Helper; -use Symfony\Component\Console\Terminal; - -/** - * @author Pierre du Plessis - * @author Gabriel Ostrolucký - */ -class ConsoleSectionOutput extends StreamOutput -{ - private $content = []; - private $lines = 0; - private $sections; - private $terminal; - - /** - * @param resource $stream - * @param ConsoleSectionOutput[] $sections - */ - public function __construct($stream, array &$sections, int $verbosity, bool $decorated, OutputFormatterInterface $formatter) - { - parent::__construct($stream, $verbosity, $decorated, $formatter); - array_unshift($sections, $this); - $this->sections = &$sections; - $this->terminal = new Terminal(); - } - - /** - * Clears previous output for this section. - * - * @param int $lines Number of lines to clear. If null, then the entire output of this section is cleared - */ - public function clear(int $lines = null) - { - if (empty($this->content) || !$this->isDecorated()) { - return; - } - - if ($lines) { - array_splice($this->content, -($lines * 2)); // Multiply lines by 2 to cater for each new line added between content - } else { - $lines = $this->lines; - $this->content = []; - } - - $this->lines -= $lines; - - parent::doWrite($this->popStreamContentUntilCurrentSection($lines), false); - } - - /** - * Overwrites the previous output with a new message. - * - * @param array|string $message - */ - public function overwrite($message) - { - $this->clear(); - $this->writeln($message); - } - - public function getContent(): string - { - return implode('', $this->content); - } - - /** - * @internal - */ - public function addContent(string $input) - { - foreach (explode(PHP_EOL, $input) as $lineContent) { - $this->lines += ceil($this->getDisplayLength($lineContent) / $this->terminal->getWidth()) ?: 1; - $this->content[] = $lineContent; - $this->content[] = PHP_EOL; - } - } - - /** - * {@inheritdoc} - */ - protected function doWrite($message, $newline) - { - if (!$this->isDecorated()) { - parent::doWrite($message, $newline); - - return; - } - - $erasedContent = $this->popStreamContentUntilCurrentSection(); - - $this->addContent($message); - - parent::doWrite($message, true); - parent::doWrite($erasedContent, false); - } - - /** - * At initial stage, cursor is at the end of stream output. This method makes cursor crawl upwards until it hits - * current section. Then it erases content it crawled through. Optionally, it erases part of current section too. - */ - private function popStreamContentUntilCurrentSection(int $numberOfLinesToClearFromCurrentSection = 0): string - { - $numberOfLinesToClear = $numberOfLinesToClearFromCurrentSection; - $erasedContent = []; - - foreach ($this->sections as $section) { - if ($section === $this) { - break; - } - - $numberOfLinesToClear += $section->lines; - $erasedContent[] = $section->getContent(); - } - - if ($numberOfLinesToClear > 0) { - // move cursor up n lines - parent::doWrite(sprintf("\x1b[%dA", $numberOfLinesToClear), false); - // erase to end of screen - parent::doWrite("\x1b[0J", false); - } - - return implode('', array_reverse($erasedContent)); - } - - private function getDisplayLength(string $text): string - { - return Helper::strlenWithoutDecoration($this->getFormatter(), str_replace("\t", ' ', $text)); - } -} diff --git a/vendor/symfony/console/Output/NullOutput.php b/vendor/symfony/console/Output/NullOutput.php deleted file mode 100644 index 218f285..0000000 --- a/vendor/symfony/console/Output/NullOutput.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * NullOutput suppresses all output. - * - * $output = new NullOutput(); - * - * @author Fabien Potencier - * @author Tobias Schultze - */ -class NullOutput implements OutputInterface -{ - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function getFormatter() - { - // to comply with the interface we must return a OutputFormatterInterface - return new OutputFormatter(); - } - - /** - * {@inheritdoc} - */ - public function setDecorated($decorated) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function isDecorated() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function setVerbosity($level) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function getVerbosity() - { - return self::VERBOSITY_QUIET; - } - - /** - * {@inheritdoc} - */ - public function isQuiet() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function isVerbose() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function isVeryVerbose() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function isDebug() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function writeln($messages, $options = self::OUTPUT_NORMAL) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function write($messages, $newline = false, $options = self::OUTPUT_NORMAL) - { - // do nothing - } -} diff --git a/vendor/symfony/console/Output/Output.php b/vendor/symfony/console/Output/Output.php deleted file mode 100644 index 9dd7651..0000000 --- a/vendor/symfony/console/Output/Output.php +++ /dev/null @@ -1,177 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * Base class for output classes. - * - * There are five levels of verbosity: - * - * * normal: no option passed (normal output) - * * verbose: -v (more output) - * * very verbose: -vv (highly extended output) - * * debug: -vvv (all debug output) - * * quiet: -q (no output) - * - * @author Fabien Potencier - */ -abstract class Output implements OutputInterface -{ - private $verbosity; - private $formatter; - - /** - * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) - * @param bool $decorated Whether to decorate messages - * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) - */ - public function __construct(?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = false, OutputFormatterInterface $formatter = null) - { - $this->verbosity = null === $verbosity ? self::VERBOSITY_NORMAL : $verbosity; - $this->formatter = $formatter ?: new OutputFormatter(); - $this->formatter->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - $this->formatter = $formatter; - } - - /** - * {@inheritdoc} - */ - public function getFormatter() - { - return $this->formatter; - } - - /** - * {@inheritdoc} - */ - public function setDecorated($decorated) - { - $this->formatter->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function isDecorated() - { - return $this->formatter->isDecorated(); - } - - /** - * {@inheritdoc} - */ - public function setVerbosity($level) - { - $this->verbosity = (int) $level; - } - - /** - * {@inheritdoc} - */ - public function getVerbosity() - { - return $this->verbosity; - } - - /** - * {@inheritdoc} - */ - public function isQuiet() - { - return self::VERBOSITY_QUIET === $this->verbosity; - } - - /** - * {@inheritdoc} - */ - public function isVerbose() - { - return self::VERBOSITY_VERBOSE <= $this->verbosity; - } - - /** - * {@inheritdoc} - */ - public function isVeryVerbose() - { - return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity; - } - - /** - * {@inheritdoc} - */ - public function isDebug() - { - return self::VERBOSITY_DEBUG <= $this->verbosity; - } - - /** - * {@inheritdoc} - */ - public function writeln($messages, $options = self::OUTPUT_NORMAL) - { - $this->write($messages, true, $options); - } - - /** - * {@inheritdoc} - */ - public function write($messages, $newline = false, $options = self::OUTPUT_NORMAL) - { - if (!is_iterable($messages)) { - $messages = [$messages]; - } - - $types = self::OUTPUT_NORMAL | self::OUTPUT_RAW | self::OUTPUT_PLAIN; - $type = $types & $options ?: self::OUTPUT_NORMAL; - - $verbosities = self::VERBOSITY_QUIET | self::VERBOSITY_NORMAL | self::VERBOSITY_VERBOSE | self::VERBOSITY_VERY_VERBOSE | self::VERBOSITY_DEBUG; - $verbosity = $verbosities & $options ?: self::VERBOSITY_NORMAL; - - if ($verbosity > $this->getVerbosity()) { - return; - } - - foreach ($messages as $message) { - switch ($type) { - case OutputInterface::OUTPUT_NORMAL: - $message = $this->formatter->format($message); - break; - case OutputInterface::OUTPUT_RAW: - break; - case OutputInterface::OUTPUT_PLAIN: - $message = strip_tags($this->formatter->format($message)); - break; - } - - $this->doWrite($message, $newline); - } - } - - /** - * Writes a message to the output. - * - * @param string $message A message to write to the output - * @param bool $newline Whether to add a newline or not - */ - abstract protected function doWrite($message, $newline); -} diff --git a/vendor/symfony/console/Output/OutputInterface.php b/vendor/symfony/console/Output/OutputInterface.php deleted file mode 100644 index 0dfd12b..0000000 --- a/vendor/symfony/console/Output/OutputInterface.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * OutputInterface is the interface implemented by all Output classes. - * - * @author Fabien Potencier - */ -interface OutputInterface -{ - const VERBOSITY_QUIET = 16; - const VERBOSITY_NORMAL = 32; - const VERBOSITY_VERBOSE = 64; - const VERBOSITY_VERY_VERBOSE = 128; - const VERBOSITY_DEBUG = 256; - - const OUTPUT_NORMAL = 1; - const OUTPUT_RAW = 2; - const OUTPUT_PLAIN = 4; - - /** - * Writes a message to the output. - * - * @param string|iterable $messages The message as an iterable of strings or a single string - * @param bool $newline Whether to add a newline - * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL - */ - public function write($messages, $newline = false, $options = 0); - - /** - * Writes a message to the output and adds a newline at the end. - * - * @param string|iterable $messages The message as an iterable of strings or a single string - * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL - */ - public function writeln($messages, $options = 0); - - /** - * Sets the verbosity of the output. - * - * @param int $level The level of verbosity (one of the VERBOSITY constants) - */ - public function setVerbosity($level); - - /** - * Gets the current verbosity of the output. - * - * @return int The current level of verbosity (one of the VERBOSITY constants) - */ - public function getVerbosity(); - - /** - * Returns whether verbosity is quiet (-q). - * - * @return bool true if verbosity is set to VERBOSITY_QUIET, false otherwise - */ - public function isQuiet(); - - /** - * Returns whether verbosity is verbose (-v). - * - * @return bool true if verbosity is set to VERBOSITY_VERBOSE, false otherwise - */ - public function isVerbose(); - - /** - * Returns whether verbosity is very verbose (-vv). - * - * @return bool true if verbosity is set to VERBOSITY_VERY_VERBOSE, false otherwise - */ - public function isVeryVerbose(); - - /** - * Returns whether verbosity is debug (-vvv). - * - * @return bool true if verbosity is set to VERBOSITY_DEBUG, false otherwise - */ - public function isDebug(); - - /** - * Sets the decorated flag. - * - * @param bool $decorated Whether to decorate the messages - */ - public function setDecorated($decorated); - - /** - * Gets the decorated flag. - * - * @return bool true if the output will decorate messages, false otherwise - */ - public function isDecorated(); - - public function setFormatter(OutputFormatterInterface $formatter); - - /** - * Returns current output formatter instance. - * - * @return OutputFormatterInterface - */ - public function getFormatter(); -} diff --git a/vendor/symfony/console/Output/StreamOutput.php b/vendor/symfony/console/Output/StreamOutput.php deleted file mode 100644 index f39422a..0000000 --- a/vendor/symfony/console/Output/StreamOutput.php +++ /dev/null @@ -1,125 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * StreamOutput writes the output to a given stream. - * - * Usage: - * - * $output = new StreamOutput(fopen('php://stdout', 'w')); - * - * As `StreamOutput` can use any stream, you can also use a file: - * - * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false)); - * - * @author Fabien Potencier - */ -class StreamOutput extends Output -{ - private $stream; - - /** - * @param resource $stream A stream resource - * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) - * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) - * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) - * - * @throws InvalidArgumentException When first argument is not a real stream - */ - public function __construct($stream, int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = null, OutputFormatterInterface $formatter = null) - { - if (!\is_resource($stream) || 'stream' !== get_resource_type($stream)) { - throw new InvalidArgumentException('The StreamOutput class needs a stream as its first argument.'); - } - - $this->stream = $stream; - - if (null === $decorated) { - $decorated = $this->hasColorSupport(); - } - - parent::__construct($verbosity, $decorated, $formatter); - } - - /** - * Gets the stream attached to this StreamOutput instance. - * - * @return resource A stream resource - */ - public function getStream() - { - return $this->stream; - } - - /** - * {@inheritdoc} - */ - protected function doWrite($message, $newline) - { - if ($newline) { - $message .= PHP_EOL; - } - - @fwrite($this->stream, $message); - - fflush($this->stream); - } - - /** - * Returns true if the stream supports colorization. - * - * Colorization is disabled if not supported by the stream: - * - * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo - * terminals via named pipes, so we can only check the environment. - * - * Reference: Composer\XdebugHandler\Process::supportsColor - * https://github.com/composer/xdebug-handler - * - * @return bool true if the stream supports colorization, false otherwise - */ - protected function hasColorSupport() - { - // Follow https://no-color.org/ - if (isset($_SERVER['NO_COLOR']) || false !== getenv('NO_COLOR')) { - return false; - } - - if ('Hyper' === getenv('TERM_PROGRAM')) { - return true; - } - - if (\DIRECTORY_SEPARATOR === '\\') { - return (\function_exists('sapi_windows_vt100_support') - && @sapi_windows_vt100_support($this->stream)) - || false !== getenv('ANSICON') - || 'ON' === getenv('ConEmuANSI') - || 'xterm' === getenv('TERM'); - } - - if (\function_exists('stream_isatty')) { - return @stream_isatty($this->stream); - } - - if (\function_exists('posix_isatty')) { - return @posix_isatty($this->stream); - } - - $stat = @fstat($this->stream); - // Check if formatted mode is S_IFCHR - return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; - } -} diff --git a/vendor/symfony/console/Question/ChoiceQuestion.php b/vendor/symfony/console/Question/ChoiceQuestion.php deleted file mode 100644 index 72703fb..0000000 --- a/vendor/symfony/console/Question/ChoiceQuestion.php +++ /dev/null @@ -1,188 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Question; - -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * Represents a choice question. - * - * @author Fabien Potencier - */ -class ChoiceQuestion extends Question -{ - private $choices; - private $multiselect = false; - private $prompt = ' > '; - private $errorMessage = 'Value "%s" is invalid'; - - /** - * @param string $question The question to ask to the user - * @param array $choices The list of available choices - * @param mixed $default The default answer to return - */ - public function __construct(string $question, array $choices, $default = null) - { - if (!$choices) { - throw new \LogicException('Choice question must have at least 1 choice available.'); - } - - parent::__construct($question, $default); - - $this->choices = $choices; - $this->setValidator($this->getDefaultValidator()); - $this->setAutocompleterValues($choices); - } - - /** - * Returns available choices. - * - * @return array - */ - public function getChoices() - { - return $this->choices; - } - - /** - * Sets multiselect option. - * - * When multiselect is set to true, multiple choices can be answered. - * - * @param bool $multiselect - * - * @return $this - */ - public function setMultiselect($multiselect) - { - $this->multiselect = $multiselect; - $this->setValidator($this->getDefaultValidator()); - - return $this; - } - - /** - * Returns whether the choices are multiselect. - * - * @return bool - */ - public function isMultiselect() - { - return $this->multiselect; - } - - /** - * Gets the prompt for choices. - * - * @return string - */ - public function getPrompt() - { - return $this->prompt; - } - - /** - * Sets the prompt for choices. - * - * @param string $prompt - * - * @return $this - */ - public function setPrompt($prompt) - { - $this->prompt = $prompt; - - return $this; - } - - /** - * Sets the error message for invalid values. - * - * The error message has a string placeholder (%s) for the invalid value. - * - * @param string $errorMessage - * - * @return $this - */ - public function setErrorMessage($errorMessage) - { - $this->errorMessage = $errorMessage; - $this->setValidator($this->getDefaultValidator()); - - return $this; - } - - private function getDefaultValidator(): callable - { - $choices = $this->choices; - $errorMessage = $this->errorMessage; - $multiselect = $this->multiselect; - $isAssoc = $this->isAssoc($choices); - - return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) { - if ($multiselect) { - // Check for a separated comma values - if (!preg_match('/^[^,]+(?:,[^,]+)*$/', $selected, $matches)) { - throw new InvalidArgumentException(sprintf($errorMessage, $selected)); - } - - $selectedChoices = explode(',', $selected); - } else { - $selectedChoices = [$selected]; - } - - if ($this->isTrimmable()) { - foreach ($selectedChoices as $k => $v) { - $selectedChoices[$k] = trim($v); - } - } - - $multiselectChoices = []; - foreach ($selectedChoices as $value) { - $results = []; - foreach ($choices as $key => $choice) { - if ($choice === $value) { - $results[] = $key; - } - } - - if (\count($results) > 1) { - throw new InvalidArgumentException(sprintf('The provided answer is ambiguous. Value should be one of "%s".', implode('" or "', $results))); - } - - $result = array_search($value, $choices); - - if (!$isAssoc) { - if (false !== $result) { - $result = $choices[$result]; - } elseif (isset($choices[$value])) { - $result = $choices[$value]; - } - } elseif (false === $result && isset($choices[$value])) { - $result = $value; - } - - if (false === $result) { - throw new InvalidArgumentException(sprintf($errorMessage, $value)); - } - - $multiselectChoices[] = (string) $result; - } - - if ($multiselect) { - return $multiselectChoices; - } - - return current($multiselectChoices); - }; - } -} diff --git a/vendor/symfony/console/Question/ConfirmationQuestion.php b/vendor/symfony/console/Question/ConfirmationQuestion.php deleted file mode 100644 index 4228521..0000000 --- a/vendor/symfony/console/Question/ConfirmationQuestion.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Question; - -/** - * Represents a yes/no question. - * - * @author Fabien Potencier - */ -class ConfirmationQuestion extends Question -{ - private $trueAnswerRegex; - - /** - * @param string $question The question to ask to the user - * @param bool $default The default answer to return, true or false - * @param string $trueAnswerRegex A regex to match the "yes" answer - */ - public function __construct(string $question, bool $default = true, string $trueAnswerRegex = '/^y/i') - { - parent::__construct($question, $default); - - $this->trueAnswerRegex = $trueAnswerRegex; - $this->setNormalizer($this->getDefaultNormalizer()); - } - - /** - * Returns the default answer normalizer. - */ - private function getDefaultNormalizer(): callable - { - $default = $this->getDefault(); - $regex = $this->trueAnswerRegex; - - return function ($answer) use ($default, $regex) { - if (\is_bool($answer)) { - return $answer; - } - - $answerIsTrue = (bool) preg_match($regex, $answer); - if (false === $default) { - return $answer && $answerIsTrue; - } - - return '' === $answer || $answerIsTrue; - }; - } -} diff --git a/vendor/symfony/console/Question/Question.php b/vendor/symfony/console/Question/Question.php deleted file mode 100644 index c28e0bf..0000000 --- a/vendor/symfony/console/Question/Question.php +++ /dev/null @@ -1,289 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Question; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; - -/** - * Represents a Question. - * - * @author Fabien Potencier - */ -class Question -{ - private $question; - private $attempts; - private $hidden = false; - private $hiddenFallback = true; - private $autocompleterCallback; - private $validator; - private $default; - private $normalizer; - private $trimmable = true; - - /** - * @param string $question The question to ask to the user - * @param mixed $default The default answer to return if the user enters nothing - */ - public function __construct(string $question, $default = null) - { - $this->question = $question; - $this->default = $default; - } - - /** - * Returns the question. - * - * @return string - */ - public function getQuestion() - { - return $this->question; - } - - /** - * Returns the default answer. - * - * @return mixed - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns whether the user response must be hidden. - * - * @return bool - */ - public function isHidden() - { - return $this->hidden; - } - - /** - * Sets whether the user response must be hidden or not. - * - * @param bool $hidden - * - * @return $this - * - * @throws LogicException In case the autocompleter is also used - */ - public function setHidden($hidden) - { - if ($this->autocompleterCallback) { - throw new LogicException('A hidden question cannot use the autocompleter.'); - } - - $this->hidden = (bool) $hidden; - - return $this; - } - - /** - * In case the response can not be hidden, whether to fallback on non-hidden question or not. - * - * @return bool - */ - public function isHiddenFallback() - { - return $this->hiddenFallback; - } - - /** - * Sets whether to fallback on non-hidden question if the response can not be hidden. - * - * @param bool $fallback - * - * @return $this - */ - public function setHiddenFallback($fallback) - { - $this->hiddenFallback = (bool) $fallback; - - return $this; - } - - /** - * Gets values for the autocompleter. - * - * @return iterable|null - */ - public function getAutocompleterValues() - { - $callback = $this->getAutocompleterCallback(); - - return $callback ? $callback('') : null; - } - - /** - * Sets values for the autocompleter. - * - * @param iterable|null $values - * - * @return $this - * - * @throws InvalidArgumentException - * @throws LogicException - */ - public function setAutocompleterValues($values) - { - if (\is_array($values)) { - $values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values); - - $callback = static function () use ($values) { - return $values; - }; - } elseif ($values instanceof \Traversable) { - $valueCache = null; - $callback = static function () use ($values, &$valueCache) { - return $valueCache ?? $valueCache = iterator_to_array($values, false); - }; - } elseif (null === $values) { - $callback = null; - } else { - throw new InvalidArgumentException('Autocompleter values can be either an array, "null" or a "Traversable" object.'); - } - - return $this->setAutocompleterCallback($callback); - } - - /** - * Gets the callback function used for the autocompleter. - */ - public function getAutocompleterCallback(): ?callable - { - return $this->autocompleterCallback; - } - - /** - * Sets the callback function used for the autocompleter. - * - * The callback is passed the user input as argument and should return an iterable of corresponding suggestions. - * - * @return $this - */ - public function setAutocompleterCallback(callable $callback = null): self - { - if ($this->hidden && null !== $callback) { - throw new LogicException('A hidden question cannot use the autocompleter.'); - } - - $this->autocompleterCallback = $callback; - - return $this; - } - - /** - * Sets a validator for the question. - * - * @return $this - */ - public function setValidator(callable $validator = null) - { - $this->validator = $validator; - - return $this; - } - - /** - * Gets the validator for the question. - * - * @return callable|null - */ - public function getValidator() - { - return $this->validator; - } - - /** - * Sets the maximum number of attempts. - * - * Null means an unlimited number of attempts. - * - * @param int|null $attempts - * - * @return $this - * - * @throws InvalidArgumentException in case the number of attempts is invalid - */ - public function setMaxAttempts($attempts) - { - if (null !== $attempts && $attempts < 1) { - throw new InvalidArgumentException('Maximum number of attempts must be a positive value.'); - } - - $this->attempts = $attempts; - - return $this; - } - - /** - * Gets the maximum number of attempts. - * - * Null means an unlimited number of attempts. - * - * @return int|null - */ - public function getMaxAttempts() - { - return $this->attempts; - } - - /** - * Sets a normalizer for the response. - * - * The normalizer can be a callable (a string), a closure or a class implementing __invoke. - * - * @return $this - */ - public function setNormalizer(callable $normalizer) - { - $this->normalizer = $normalizer; - - return $this; - } - - /** - * Gets the normalizer for the response. - * - * The normalizer can ba a callable (a string), a closure or a class implementing __invoke. - * - * @return callable|null - */ - public function getNormalizer() - { - return $this->normalizer; - } - - protected function isAssoc($array) - { - return (bool) \count(array_filter(array_keys($array), 'is_string')); - } - - public function isTrimmable(): bool - { - return $this->trimmable; - } - - /** - * @return $this - */ - public function setTrimmable(bool $trimmable): self - { - $this->trimmable = $trimmable; - - return $this; - } -} diff --git a/vendor/symfony/console/README.md b/vendor/symfony/console/README.md deleted file mode 100644 index 3e2fc60..0000000 --- a/vendor/symfony/console/README.md +++ /dev/null @@ -1,20 +0,0 @@ -Console Component -================= - -The Console component eases the creation of beautiful and testable command line -interfaces. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/console.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) - -Credits -------- - -`Resources/bin/hiddeninput.exe` is a third party binary provided within this -component. Find sources and license at https://github.com/Seldaek/hidden-input. diff --git a/vendor/symfony/console/Resources/bin/hiddeninput.exe b/vendor/symfony/console/Resources/bin/hiddeninput.exe deleted file mode 100644 index c8cf65e8d819e6e525121cf6b21f1c2429746038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9216 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 J0sQ~1{4brj`U(I5 diff --git a/vendor/symfony/console/Style/OutputStyle.php b/vendor/symfony/console/Style/OutputStyle.php deleted file mode 100644 index b1262b5..0000000 --- a/vendor/symfony/console/Style/OutputStyle.php +++ /dev/null @@ -1,155 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Style; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\Console\Helper\ProgressBar; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Decorates output to add console style guide helpers. - * - * @author Kevin Bond - */ -abstract class OutputStyle implements OutputInterface, StyleInterface -{ - private $output; - - public function __construct(OutputInterface $output) - { - $this->output = $output; - } - - /** - * {@inheritdoc} - */ - public function newLine($count = 1) - { - $this->output->write(str_repeat(PHP_EOL, $count)); - } - - /** - * @param int $max - * - * @return ProgressBar - */ - public function createProgressBar($max = 0) - { - return new ProgressBar($this->output, $max); - } - - /** - * {@inheritdoc} - */ - public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL) - { - $this->output->write($messages, $newline, $type); - } - - /** - * {@inheritdoc} - */ - public function writeln($messages, $type = self::OUTPUT_NORMAL) - { - $this->output->writeln($messages, $type); - } - - /** - * {@inheritdoc} - */ - public function setVerbosity($level) - { - $this->output->setVerbosity($level); - } - - /** - * {@inheritdoc} - */ - public function getVerbosity() - { - return $this->output->getVerbosity(); - } - - /** - * {@inheritdoc} - */ - public function setDecorated($decorated) - { - $this->output->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function isDecorated() - { - return $this->output->isDecorated(); - } - - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - $this->output->setFormatter($formatter); - } - - /** - * {@inheritdoc} - */ - public function getFormatter() - { - return $this->output->getFormatter(); - } - - /** - * {@inheritdoc} - */ - public function isQuiet() - { - return $this->output->isQuiet(); - } - - /** - * {@inheritdoc} - */ - public function isVerbose() - { - return $this->output->isVerbose(); - } - - /** - * {@inheritdoc} - */ - public function isVeryVerbose() - { - return $this->output->isVeryVerbose(); - } - - /** - * {@inheritdoc} - */ - public function isDebug() - { - return $this->output->isDebug(); - } - - protected function getErrorOutput() - { - if (!$this->output instanceof ConsoleOutputInterface) { - return $this->output; - } - - return $this->output->getErrorOutput(); - } -} diff --git a/vendor/symfony/console/Style/StyleInterface.php b/vendor/symfony/console/Style/StyleInterface.php deleted file mode 100644 index 3b5b8af..0000000 --- a/vendor/symfony/console/Style/StyleInterface.php +++ /dev/null @@ -1,153 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Style; - -/** - * Output style helpers. - * - * @author Kevin Bond - */ -interface StyleInterface -{ - /** - * Formats a command title. - * - * @param string $message - */ - public function title($message); - - /** - * Formats a section title. - * - * @param string $message - */ - public function section($message); - - /** - * Formats a list. - */ - public function listing(array $elements); - - /** - * Formats informational text. - * - * @param string|array $message - */ - public function text($message); - - /** - * Formats a success result bar. - * - * @param string|array $message - */ - public function success($message); - - /** - * Formats an error result bar. - * - * @param string|array $message - */ - public function error($message); - - /** - * Formats an warning result bar. - * - * @param string|array $message - */ - public function warning($message); - - /** - * Formats a note admonition. - * - * @param string|array $message - */ - public function note($message); - - /** - * Formats a caution admonition. - * - * @param string|array $message - */ - public function caution($message); - - /** - * Formats a table. - */ - public function table(array $headers, array $rows); - - /** - * Asks a question. - * - * @param string $question - * @param string|null $default - * @param callable|null $validator - * - * @return mixed - */ - public function ask($question, $default = null, $validator = null); - - /** - * Asks a question with the user input hidden. - * - * @param string $question - * @param callable|null $validator - * - * @return mixed - */ - public function askHidden($question, $validator = null); - - /** - * Asks for confirmation. - * - * @param string $question - * @param bool $default - * - * @return bool - */ - public function confirm($question, $default = true); - - /** - * Asks a choice question. - * - * @param string $question - * @param string|int|null $default - * - * @return mixed - */ - public function choice($question, array $choices, $default = null); - - /** - * Add newline(s). - * - * @param int $count The number of newlines - */ - public function newLine($count = 1); - - /** - * Starts the progress output. - * - * @param int $max Maximum steps (0 if unknown) - */ - public function progressStart($max = 0); - - /** - * Advances the progress output X steps. - * - * @param int $step Number of steps to advance - */ - public function progressAdvance($step = 1); - - /** - * Finishes the progress output. - */ - public function progressFinish(); -} diff --git a/vendor/symfony/console/Style/SymfonyStyle.php b/vendor/symfony/console/Style/SymfonyStyle.php deleted file mode 100644 index 5efe2d4..0000000 --- a/vendor/symfony/console/Style/SymfonyStyle.php +++ /dev/null @@ -1,504 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Style; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\RuntimeException; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Helper\Helper; -use Symfony\Component\Console\Helper\ProgressBar; -use Symfony\Component\Console\Helper\SymfonyQuestionHelper; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableCell; -use Symfony\Component\Console\Helper\TableSeparator; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\BufferedOutput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Question\ChoiceQuestion; -use Symfony\Component\Console\Question\ConfirmationQuestion; -use Symfony\Component\Console\Question\Question; -use Symfony\Component\Console\Terminal; - -/** - * Output decorator helpers for the Symfony Style Guide. - * - * @author Kevin Bond - */ -class SymfonyStyle extends OutputStyle -{ - const MAX_LINE_LENGTH = 120; - - private $input; - private $questionHelper; - private $progressBar; - private $lineLength; - private $bufferedOutput; - - public function __construct(InputInterface $input, OutputInterface $output) - { - $this->input = $input; - $this->bufferedOutput = new BufferedOutput($output->getVerbosity(), false, clone $output->getFormatter()); - // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not. - $width = (new Terminal())->getWidth() ?: self::MAX_LINE_LENGTH; - $this->lineLength = min($width - (int) (\DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH); - - parent::__construct($output); - } - - /** - * Formats a message as a block of text. - * - * @param string|array $messages The message to write in the block - * @param string|null $type The block type (added in [] on first line) - * @param string|null $style The style to apply to the whole block - * @param string $prefix The prefix for the block - * @param bool $padding Whether to add vertical padding - * @param bool $escape Whether to escape the message - */ - public function block($messages, $type = null, $style = null, $prefix = ' ', $padding = false, $escape = true) - { - $messages = \is_array($messages) ? array_values($messages) : [$messages]; - - $this->autoPrependBlock(); - $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, $escape)); - $this->newLine(); - } - - /** - * {@inheritdoc} - */ - public function title($message) - { - $this->autoPrependBlock(); - $this->writeln([ - sprintf('%s', OutputFormatter::escapeTrailingBackslash($message)), - sprintf('%s', str_repeat('=', Helper::strlenWithoutDecoration($this->getFormatter(), $message))), - ]); - $this->newLine(); - } - - /** - * {@inheritdoc} - */ - public function section($message) - { - $this->autoPrependBlock(); - $this->writeln([ - sprintf('%s', OutputFormatter::escapeTrailingBackslash($message)), - sprintf('%s', str_repeat('-', Helper::strlenWithoutDecoration($this->getFormatter(), $message))), - ]); - $this->newLine(); - } - - /** - * {@inheritdoc} - */ - public function listing(array $elements) - { - $this->autoPrependText(); - $elements = array_map(function ($element) { - return sprintf(' * %s', $element); - }, $elements); - - $this->writeln($elements); - $this->newLine(); - } - - /** - * {@inheritdoc} - */ - public function text($message) - { - $this->autoPrependText(); - - $messages = \is_array($message) ? array_values($message) : [$message]; - foreach ($messages as $message) { - $this->writeln(sprintf(' %s', $message)); - } - } - - /** - * Formats a command comment. - * - * @param string|array $message - */ - public function comment($message) - { - $this->block($message, null, null, ' // ', false, false); - } - - /** - * {@inheritdoc} - */ - public function success($message) - { - $this->block($message, 'OK', 'fg=black;bg=green', ' ', true); - } - - /** - * {@inheritdoc} - */ - public function error($message) - { - $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true); - } - - /** - * {@inheritdoc} - */ - public function warning($message) - { - $this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', true); - } - - /** - * {@inheritdoc} - */ - public function note($message) - { - $this->block($message, 'NOTE', 'fg=yellow', ' ! '); - } - - /** - * {@inheritdoc} - */ - public function caution($message) - { - $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true); - } - - /** - * {@inheritdoc} - */ - public function table(array $headers, array $rows) - { - $style = clone Table::getStyleDefinition('symfony-style-guide'); - $style->setCellHeaderFormat('%s'); - - $table = new Table($this); - $table->setHeaders($headers); - $table->setRows($rows); - $table->setStyle($style); - - $table->render(); - $this->newLine(); - } - - /** - * Formats a horizontal table. - */ - public function horizontalTable(array $headers, array $rows) - { - $style = clone Table::getStyleDefinition('symfony-style-guide'); - $style->setCellHeaderFormat('%s'); - - $table = new Table($this); - $table->setHeaders($headers); - $table->setRows($rows); - $table->setStyle($style); - $table->setHorizontal(true); - - $table->render(); - $this->newLine(); - } - - /** - * Formats a list of key/value horizontally. - * - * Each row can be one of: - * * 'A title' - * * ['key' => 'value'] - * * new TableSeparator() - * - * @param string|array|TableSeparator ...$list - */ - public function definitionList(...$list) - { - $style = clone Table::getStyleDefinition('symfony-style-guide'); - $style->setCellHeaderFormat('%s'); - - $table = new Table($this); - $headers = []; - $row = []; - foreach ($list as $value) { - if ($value instanceof TableSeparator) { - $headers[] = $value; - $row[] = $value; - continue; - } - if (\is_string($value)) { - $headers[] = new TableCell($value, ['colspan' => 2]); - $row[] = null; - continue; - } - if (!\is_array($value)) { - throw new InvalidArgumentException('Value should be an array, string, or an instance of TableSeparator.'); - } - $headers[] = key($value); - $row[] = current($value); - } - - $table->setHeaders($headers); - $table->setRows([$row]); - $table->setHorizontal(); - $table->setStyle($style); - - $table->render(); - $this->newLine(); - } - - /** - * {@inheritdoc} - */ - public function ask($question, $default = null, $validator = null) - { - $question = new Question($question, $default); - $question->setValidator($validator); - - return $this->askQuestion($question); - } - - /** - * {@inheritdoc} - */ - public function askHidden($question, $validator = null) - { - $question = new Question($question); - - $question->setHidden(true); - $question->setValidator($validator); - - return $this->askQuestion($question); - } - - /** - * {@inheritdoc} - */ - public function confirm($question, $default = true) - { - return $this->askQuestion(new ConfirmationQuestion($question, $default)); - } - - /** - * {@inheritdoc} - */ - public function choice($question, array $choices, $default = null) - { - if (null !== $default) { - $values = array_flip($choices); - $default = isset($values[$default]) ? $values[$default] : $default; - } - - return $this->askQuestion(new ChoiceQuestion($question, $choices, $default)); - } - - /** - * {@inheritdoc} - */ - public function progressStart($max = 0) - { - $this->progressBar = $this->createProgressBar($max); - $this->progressBar->start(); - } - - /** - * {@inheritdoc} - */ - public function progressAdvance($step = 1) - { - $this->getProgressBar()->advance($step); - } - - /** - * {@inheritdoc} - */ - public function progressFinish() - { - $this->getProgressBar()->finish(); - $this->newLine(2); - $this->progressBar = null; - } - - /** - * {@inheritdoc} - */ - public function createProgressBar($max = 0) - { - $progressBar = parent::createProgressBar($max); - - if ('\\' !== \DIRECTORY_SEPARATOR || 'Hyper' === getenv('TERM_PROGRAM')) { - $progressBar->setEmptyBarCharacter('░'); // light shade character \u2591 - $progressBar->setProgressCharacter(''); - $progressBar->setBarCharacter('▓'); // dark shade character \u2593 - } - - return $progressBar; - } - - /** - * @return mixed - */ - public function askQuestion(Question $question) - { - if ($this->input->isInteractive()) { - $this->autoPrependBlock(); - } - - if (!$this->questionHelper) { - $this->questionHelper = new SymfonyQuestionHelper(); - } - - $answer = $this->questionHelper->ask($this->input, $this, $question); - - if ($this->input->isInteractive()) { - $this->newLine(); - $this->bufferedOutput->write("\n"); - } - - return $answer; - } - - /** - * {@inheritdoc} - */ - public function writeln($messages, $type = self::OUTPUT_NORMAL) - { - if (!is_iterable($messages)) { - $messages = [$messages]; - } - - foreach ($messages as $message) { - parent::writeln($message, $type); - $this->writeBuffer($message, true, $type); - } - } - - /** - * {@inheritdoc} - */ - public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL) - { - if (!is_iterable($messages)) { - $messages = [$messages]; - } - - foreach ($messages as $message) { - parent::write($message, $newline, $type); - $this->writeBuffer($message, $newline, $type); - } - } - - /** - * {@inheritdoc} - */ - public function newLine($count = 1) - { - parent::newLine($count); - $this->bufferedOutput->write(str_repeat("\n", $count)); - } - - /** - * Returns a new instance which makes use of stderr if available. - * - * @return self - */ - public function getErrorStyle() - { - return new self($this->input, $this->getErrorOutput()); - } - - private function getProgressBar(): ProgressBar - { - if (!$this->progressBar) { - throw new RuntimeException('The ProgressBar is not started.'); - } - - return $this->progressBar; - } - - private function autoPrependBlock(): void - { - $chars = substr(str_replace(PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2); - - if (!isset($chars[0])) { - $this->newLine(); //empty history, so we should start with a new line. - - return; - } - //Prepend new line for each non LF chars (This means no blank line was output before) - $this->newLine(2 - substr_count($chars, "\n")); - } - - private function autoPrependText(): void - { - $fetched = $this->bufferedOutput->fetch(); - //Prepend new line if last char isn't EOL: - if ("\n" !== substr($fetched, -1)) { - $this->newLine(); - } - } - - private function writeBuffer(string $message, bool $newLine, int $type): void - { - // We need to know if the two last chars are PHP_EOL - // Preserve the last 4 chars inserted (PHP_EOL on windows is two chars) in the history buffer - $this->bufferedOutput->write(substr($message, -4), $newLine, $type); - } - - private function createBlock(iterable $messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = false): array - { - $indentLength = 0; - $prefixLength = Helper::strlenWithoutDecoration($this->getFormatter(), $prefix); - $lines = []; - - if (null !== $type) { - $type = sprintf('[%s] ', $type); - $indentLength = \strlen($type); - $lineIndentation = str_repeat(' ', $indentLength); - } - - // wrap and add newlines for each element - foreach ($messages as $key => $message) { - if ($escape) { - $message = OutputFormatter::escape($message); - } - - $lines = array_merge($lines, explode(PHP_EOL, wordwrap($message, $this->lineLength - $prefixLength - $indentLength, PHP_EOL, true))); - - if (\count($messages) > 1 && $key < \count($messages) - 1) { - $lines[] = ''; - } - } - - $firstLineIndex = 0; - if ($padding && $this->isDecorated()) { - $firstLineIndex = 1; - array_unshift($lines, ''); - $lines[] = ''; - } - - foreach ($lines as $i => &$line) { - if (null !== $type) { - $line = $firstLineIndex === $i ? $type.$line : $lineIndentation.$line; - } - - $line = $prefix.$line; - $line .= str_repeat(' ', $this->lineLength - Helper::strlenWithoutDecoration($this->getFormatter(), $line)); - - if ($style) { - $line = sprintf('<%s>%s', $style, $line); - } - } - - return $lines; - } -} diff --git a/vendor/symfony/console/Terminal.php b/vendor/symfony/console/Terminal.php deleted file mode 100644 index 5e5a3c2..0000000 --- a/vendor/symfony/console/Terminal.php +++ /dev/null @@ -1,174 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -class Terminal -{ - private static $width; - private static $height; - private static $stty; - - /** - * Gets the terminal width. - * - * @return int - */ - public function getWidth() - { - $width = getenv('COLUMNS'); - if (false !== $width) { - return (int) trim($width); - } - - if (null === self::$width) { - self::initDimensions(); - } - - return self::$width ?: 80; - } - - /** - * Gets the terminal height. - * - * @return int - */ - public function getHeight() - { - $height = getenv('LINES'); - if (false !== $height) { - return (int) trim($height); - } - - if (null === self::$height) { - self::initDimensions(); - } - - return self::$height ?: 50; - } - - /** - * @internal - * - * @return bool - */ - public static function hasSttyAvailable() - { - if (null !== self::$stty) { - return self::$stty; - } - - // skip check if exec function is disabled - if (!\function_exists('exec')) { - return false; - } - - exec('stty 2>&1', $output, $exitcode); - - return self::$stty = 0 === $exitcode; - } - - private static function initDimensions() - { - if ('\\' === \DIRECTORY_SEPARATOR) { - if (preg_match('/^(\d+)x(\d+)(?: \((\d+)x(\d+)\))?$/', trim(getenv('ANSICON')), $matches)) { - // extract [w, H] from "wxh (WxH)" - // or [w, h] from "wxh" - self::$width = (int) $matches[1]; - self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2]; - } elseif (!self::hasVt100Support() && self::hasSttyAvailable()) { - // only use stty on Windows if the terminal does not support vt100 (e.g. Windows 7 + git-bash) - // testing for stty in a Windows 10 vt100-enabled console will implicitly disable vt100 support on STDOUT - self::initDimensionsUsingStty(); - } elseif (null !== $dimensions = self::getConsoleMode()) { - // extract [w, h] from "wxh" - self::$width = (int) $dimensions[0]; - self::$height = (int) $dimensions[1]; - } - } else { - self::initDimensionsUsingStty(); - } - } - - /** - * Returns whether STDOUT has vt100 support (some Windows 10+ configurations). - */ - private static function hasVt100Support(): bool - { - return \function_exists('sapi_windows_vt100_support') && sapi_windows_vt100_support(fopen('php://stdout', 'w')); - } - - /** - * Initializes dimensions using the output of an stty columns line. - */ - private static function initDimensionsUsingStty() - { - if ($sttyString = self::getSttyColumns()) { - if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) { - // extract [w, h] from "rows h; columns w;" - self::$width = (int) $matches[2]; - self::$height = (int) $matches[1]; - } elseif (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) { - // extract [w, h] from "; h rows; w columns" - self::$width = (int) $matches[2]; - self::$height = (int) $matches[1]; - } - } - } - - /** - * Runs and parses mode CON if it's available, suppressing any error output. - * - * @return int[]|null An array composed of the width and the height or null if it could not be parsed - */ - private static function getConsoleMode(): ?array - { - $info = self::readFromProcess('mode CON'); - - if (null === $info || !preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { - return null; - } - - return [(int) $matches[2], (int) $matches[1]]; - } - - /** - * Runs and parses stty -a if it's available, suppressing any error output. - */ - private static function getSttyColumns(): ?string - { - return self::readFromProcess('stty -a | grep columns'); - } - - private static function readFromProcess(string $command): ?string - { - if (!\function_exists('proc_open')) { - return null; - } - - $descriptorspec = [ - 1 => ['pipe', 'w'], - 2 => ['pipe', 'w'], - ]; - - $process = proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true]); - if (!\is_resource($process)) { - return null; - } - - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - return $info; - } -} diff --git a/vendor/symfony/console/Tester/ApplicationTester.php b/vendor/symfony/console/Tester/ApplicationTester.php deleted file mode 100644 index 4f99da1..0000000 --- a/vendor/symfony/console/Tester/ApplicationTester.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\ArrayInput; - -/** - * Eases the testing of console applications. - * - * When testing an application, don't forget to disable the auto exit flag: - * - * $application = new Application(); - * $application->setAutoExit(false); - * - * @author Fabien Potencier - */ -class ApplicationTester -{ - use TesterTrait; - - private $application; - private $input; - private $statusCode; - - public function __construct(Application $application) - { - $this->application = $application; - } - - /** - * Executes the application. - * - * Available options: - * - * * interactive: Sets the input interactive flag - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * * capture_stderr_separately: Make output of stdOut and stdErr separately available - * - * @param array $input An array of arguments and options - * @param array $options An array of options - * - * @return int The command exit code - */ - public function run(array $input, $options = []) - { - $this->input = new ArrayInput($input); - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); - } - - if ($this->inputs) { - $this->input->setStream(self::createStream($this->inputs)); - } - - $this->initOutput($options); - - return $this->statusCode = $this->application->run($this->input, $this->output); - } -} diff --git a/vendor/symfony/console/Tester/CommandTester.php b/vendor/symfony/console/Tester/CommandTester.php deleted file mode 100644 index 57efc9a..0000000 --- a/vendor/symfony/console/Tester/CommandTester.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\ArrayInput; - -/** - * Eases the testing of console commands. - * - * @author Fabien Potencier - * @author Robin Chalas - */ -class CommandTester -{ - use TesterTrait; - - private $command; - private $input; - private $statusCode; - - public function __construct(Command $command) - { - $this->command = $command; - } - - /** - * Executes the command. - * - * Available execution options: - * - * * interactive: Sets the input interactive flag - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * * capture_stderr_separately: Make output of stdOut and stdErr separately available - * - * @param array $input An array of command arguments and options - * @param array $options An array of execution options - * - * @return int The command exit code - */ - public function execute(array $input, array $options = []) - { - // set the command name automatically if the application requires - // this argument and no command name was passed - if (!isset($input['command']) - && (null !== $application = $this->command->getApplication()) - && $application->getDefinition()->hasArgument('command') - ) { - $input = array_merge(['command' => $this->command->getName()], $input); - } - - $this->input = new ArrayInput($input); - // Use an in-memory input stream even if no inputs are set so that QuestionHelper::ask() does not rely on the blocking STDIN. - $this->input->setStream(self::createStream($this->inputs)); - - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); - } - - if (!isset($options['decorated'])) { - $options['decorated'] = false; - } - - $this->initOutput($options); - - return $this->statusCode = $this->command->run($this->input, $this->output); - } -} diff --git a/vendor/symfony/console/Tester/TesterTrait.php b/vendor/symfony/console/Tester/TesterTrait.php deleted file mode 100644 index a5c2088..0000000 --- a/vendor/symfony/console/Tester/TesterTrait.php +++ /dev/null @@ -1,180 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\StreamOutput; - -/** - * @author Amrouche Hamza - */ -trait TesterTrait -{ - /** @var StreamOutput */ - private $output; - private $inputs = []; - private $captureStreamsIndependently = false; - - /** - * Gets the display returned by the last execution of the command or application. - * - * @param bool $normalize Whether to normalize end of lines to \n or not - * - * @return string The display - */ - public function getDisplay($normalize = false) - { - if (null === $this->output) { - throw new \RuntimeException('Output not initialized, did you execute the command before requesting the display?'); - } - - rewind($this->output->getStream()); - - $display = stream_get_contents($this->output->getStream()); - - if ($normalize) { - $display = str_replace(PHP_EOL, "\n", $display); - } - - return $display; - } - - /** - * Gets the output written to STDERR by the application. - * - * @param bool $normalize Whether to normalize end of lines to \n or not - * - * @return string - */ - public function getErrorOutput($normalize = false) - { - if (!$this->captureStreamsIndependently) { - throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.'); - } - - rewind($this->output->getErrorOutput()->getStream()); - - $display = stream_get_contents($this->output->getErrorOutput()->getStream()); - - if ($normalize) { - $display = str_replace(PHP_EOL, "\n", $display); - } - - return $display; - } - - /** - * Gets the input instance used by the last execution of the command or application. - * - * @return InputInterface The current input instance - */ - public function getInput() - { - return $this->input; - } - - /** - * Gets the output instance used by the last execution of the command or application. - * - * @return OutputInterface The current output instance - */ - public function getOutput() - { - return $this->output; - } - - /** - * Gets the status code returned by the last execution of the command or application. - * - * @return int The status code - */ - public function getStatusCode() - { - return $this->statusCode; - } - - /** - * Sets the user inputs. - * - * @param array $inputs An array of strings representing each input - * passed to the command input stream - * - * @return $this - */ - public function setInputs(array $inputs) - { - $this->inputs = $inputs; - - return $this; - } - - /** - * Initializes the output property. - * - * Available options: - * - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * * capture_stderr_separately: Make output of stdOut and stdErr separately available - */ - private function initOutput(array $options) - { - $this->captureStreamsIndependently = \array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately']; - if (!$this->captureStreamsIndependently) { - $this->output = new StreamOutput(fopen('php://memory', 'w', false)); - if (isset($options['decorated'])) { - $this->output->setDecorated($options['decorated']); - } - if (isset($options['verbosity'])) { - $this->output->setVerbosity($options['verbosity']); - } - } else { - $this->output = new ConsoleOutput( - isset($options['verbosity']) ? $options['verbosity'] : ConsoleOutput::VERBOSITY_NORMAL, - isset($options['decorated']) ? $options['decorated'] : null - ); - - $errorOutput = new StreamOutput(fopen('php://memory', 'w', false)); - $errorOutput->setFormatter($this->output->getFormatter()); - $errorOutput->setVerbosity($this->output->getVerbosity()); - $errorOutput->setDecorated($this->output->isDecorated()); - - $reflectedOutput = new \ReflectionObject($this->output); - $strErrProperty = $reflectedOutput->getProperty('stderr'); - $strErrProperty->setAccessible(true); - $strErrProperty->setValue($this->output, $errorOutput); - - $reflectedParent = $reflectedOutput->getParentClass(); - $streamProperty = $reflectedParent->getProperty('stream'); - $streamProperty->setAccessible(true); - $streamProperty->setValue($this->output, fopen('php://memory', 'w', false)); - } - } - - /** - * @return resource - */ - private static function createStream(array $inputs) - { - $stream = fopen('php://memory', 'r+', false); - - foreach ($inputs as $input) { - fwrite($stream, $input.PHP_EOL); - } - - rewind($stream); - - return $stream; - } -} diff --git a/vendor/symfony/console/composer.json b/vendor/symfony/console/composer.json deleted file mode 100644 index 42d7497..0000000 --- a/vendor/symfony/console/composer.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "symfony/console", - "type": "library", - "description": "Symfony Console Component", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2" - }, - "require-dev": { - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0", - "psr/log": "~1.0" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "suggest": { - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "", - "psr/log": "For using the console logger" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", - "symfony/lock": "<4.4", - "symfony/process": "<3.3" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Console\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - } -} diff --git a/vendor/symfony/dependency-injection/Alias.php b/vendor/symfony/dependency-injection/Alias.php deleted file mode 100644 index 0cc8f39..0000000 --- a/vendor/symfony/dependency-injection/Alias.php +++ /dev/null @@ -1,167 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -class Alias -{ - private $id; - private $public; - private $private; - private $deprecation = []; - - private static $defaultDeprecationTemplate = 'The "%alias_id%" service alias is deprecated. You should stop using it, as it will be removed in the future.'; - - public function __construct(string $id, bool $public = true) - { - $this->id = $id; - $this->public = $public; - $this->private = 2 > \func_num_args(); - } - - /** - * Checks if this DI Alias should be public or not. - * - * @return bool - */ - public function isPublic() - { - return $this->public; - } - - /** - * Sets if this Alias is public. - * - * @return $this - */ - public function setPublic(bool $boolean) - { - $this->public = $boolean; - $this->private = false; - - return $this; - } - - /** - * Sets if this Alias is private. - * - * When set, the "private" state has a higher precedence than "public". - * In version 3.4, a "private" alias always remains publicly accessible, - * but triggers a deprecation notice when accessed from the container, - * so that the alias can be made really private in 4.0. - * - * @return $this - */ - public function setPrivate(bool $boolean) - { - $this->private = $boolean; - - return $this; - } - - /** - * Whether this alias is private. - * - * @return bool - */ - public function isPrivate() - { - return $this->private; - } - - /** - * Whether this alias is deprecated, that means it should not be referenced - * anymore. - * - * @param string $package The name of the composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string $message The deprecation message to use - * - * @return $this - * - * @throws InvalidArgumentException when the message template is invalid - */ - public function setDeprecated(/* string $package, string $version, string $message */) - { - $args = \func_get_args(); - - if (\func_num_args() < 3) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'The signature of method "%s()" requires 3 arguments: "string $package, string $version, string $message", not defining them is deprecated.', __METHOD__); - - $status = $args[0] ?? true; - - if (!$status) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'Passing a null message to un-deprecate a node is deprecated.'); - } - - $message = (string) ($args[1] ?? null); - $package = $version = ''; - } else { - $status = true; - $package = (string) $args[0]; - $version = (string) $args[1]; - $message = (string) $args[2]; - } - - if ('' !== $message) { - if (preg_match('#[\r\n]|\*/#', $message)) { - throw new InvalidArgumentException('Invalid characters found in deprecation template.'); - } - - if (false === strpos($message, '%alias_id%')) { - throw new InvalidArgumentException('The deprecation template must contain the "%alias_id%" placeholder.'); - } - } - - $this->deprecation = $status ? ['package' => $package, 'version' => $version, 'message' => $message ?: self::$defaultDeprecationTemplate] : []; - - return $this; - } - - public function isDeprecated(): bool - { - return (bool) $this->deprecation; - } - - /** - * @deprecated since Symfony 5.1, use "getDeprecation()" instead. - */ - public function getDeprecationMessage(string $id): string - { - trigger_deprecation('symfony/dependency-injection', '5.1', 'The "%s()" method is deprecated, use "getDeprecation()" instead.', __METHOD__); - - return $this->getDeprecation($id)['message']; - } - - /** - * @param string $id Service id relying on this definition - */ - public function getDeprecation(string $id): array - { - return [ - 'package' => $this->deprecation['package'], - 'version' => $this->deprecation['version'], - 'message' => str_replace('%alias_id%', $id, $this->deprecation['message']), - ]; - } - - /** - * Returns the Id of this alias. - * - * @return string The alias id - */ - public function __toString() - { - return $this->id; - } -} diff --git a/vendor/symfony/dependency-injection/Argument/AbstractArgument.php b/vendor/symfony/dependency-injection/Argument/AbstractArgument.php deleted file mode 100644 index 3ba5ff3..0000000 --- a/vendor/symfony/dependency-injection/Argument/AbstractArgument.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Argument; - -/** - * Represents an abstract service argument, which have to be set by a compiler pass or a DI extension. - */ -final class AbstractArgument -{ - private $text; - private $context; - - public function __construct(string $text = '') - { - $this->text = trim($text, '. '); - } - - public function setContext(string $context): void - { - $this->context = $context.' is abstract'.('' === $this->text ? '' : ': '); - } - - public function getText(): string - { - return $this->text; - } - - public function getTextWithContext(): string - { - return $this->context.$this->text.'.'; - } -} diff --git a/vendor/symfony/dependency-injection/Argument/ArgumentInterface.php b/vendor/symfony/dependency-injection/Argument/ArgumentInterface.php deleted file mode 100644 index b46eb77..0000000 --- a/vendor/symfony/dependency-injection/Argument/ArgumentInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Argument; - -/** - * Represents a complex argument containing nested values. - * - * @author Titouan Galopin - */ -interface ArgumentInterface -{ - /** - * @return array - */ - public function getValues(); - - public function setValues(array $values); -} diff --git a/vendor/symfony/dependency-injection/Argument/BoundArgument.php b/vendor/symfony/dependency-injection/Argument/BoundArgument.php deleted file mode 100644 index 6005926..0000000 --- a/vendor/symfony/dependency-injection/Argument/BoundArgument.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Argument; - -/** - * @author Guilhem Niot - */ -final class BoundArgument implements ArgumentInterface -{ - const SERVICE_BINDING = 0; - const DEFAULTS_BINDING = 1; - const INSTANCEOF_BINDING = 2; - - private static $sequence = 0; - - private $value; - private $identifier; - private $used; - private $type; - private $file; - - public function __construct($value, bool $trackUsage = true, int $type = 0, string $file = null) - { - $this->value = $value; - if ($trackUsage) { - $this->identifier = ++self::$sequence; - } else { - $this->used = true; - } - $this->type = $type; - $this->file = $file; - } - - /** - * {@inheritdoc} - */ - public function getValues(): array - { - return [$this->value, $this->identifier, $this->used, $this->type, $this->file]; - } - - /** - * {@inheritdoc} - */ - public function setValues(array $values) - { - if (5 === \count($values)) { - list($this->value, $this->identifier, $this->used, $this->type, $this->file) = $values; - } else { - list($this->value, $this->identifier, $this->used) = $values; - } - } -} diff --git a/vendor/symfony/dependency-injection/Argument/IteratorArgument.php b/vendor/symfony/dependency-injection/Argument/IteratorArgument.php deleted file mode 100644 index d413678..0000000 --- a/vendor/symfony/dependency-injection/Argument/IteratorArgument.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Argument; - -/** - * Represents a collection of values to lazily iterate over. - * - * @author Titouan Galopin - */ -class IteratorArgument implements ArgumentInterface -{ - use ReferenceSetArgumentTrait; -} diff --git a/vendor/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php b/vendor/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php deleted file mode 100644 index 777e405..0000000 --- a/vendor/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Argument; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * @author Titouan Galopin - * @author Nicolas Grekas - */ -trait ReferenceSetArgumentTrait -{ - private $values; - - /** - * @param Reference[] $values - */ - public function __construct(array $values) - { - $this->setValues($values); - } - - /** - * @return Reference[] The values in the set - */ - public function getValues() - { - return $this->values; - } - - /** - * @param Reference[] $values The service references to put in the set - */ - public function setValues(array $values) - { - foreach ($values as $k => $v) { - if (null !== $v && !$v instanceof Reference) { - throw new InvalidArgumentException(sprintf('A "%s" must hold only Reference instances, "%s" given.', __CLASS__, get_debug_type($v))); - } - } - - $this->values = $values; - } -} diff --git a/vendor/symfony/dependency-injection/Argument/RewindableGenerator.php b/vendor/symfony/dependency-injection/Argument/RewindableGenerator.php deleted file mode 100644 index 41fec78..0000000 --- a/vendor/symfony/dependency-injection/Argument/RewindableGenerator.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Argument; - -/** - * @internal - */ -class RewindableGenerator implements \IteratorAggregate, \Countable -{ - private $generator; - private $count; - - /** - * @param int|callable $count - */ - public function __construct(callable $generator, $count) - { - $this->generator = $generator; - $this->count = $count; - } - - public function getIterator(): \Traversable - { - $g = $this->generator; - - return $g(); - } - - public function count(): int - { - if (\is_callable($count = $this->count)) { - $this->count = $count(); - } - - return $this->count; - } -} diff --git a/vendor/symfony/dependency-injection/Argument/ServiceClosureArgument.php b/vendor/symfony/dependency-injection/Argument/ServiceClosureArgument.php deleted file mode 100644 index 6331aff..0000000 --- a/vendor/symfony/dependency-injection/Argument/ServiceClosureArgument.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Argument; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Represents a service wrapped in a memoizing closure. - * - * @author Nicolas Grekas - */ -class ServiceClosureArgument implements ArgumentInterface -{ - private $values; - - public function __construct(Reference $reference) - { - $this->values = [$reference]; - } - - /** - * {@inheritdoc} - */ - public function getValues() - { - return $this->values; - } - - /** - * {@inheritdoc} - */ - public function setValues(array $values) - { - if ([0] !== array_keys($values) || !($values[0] instanceof Reference || null === $values[0])) { - throw new InvalidArgumentException('A ServiceClosureArgument must hold one and only one Reference.'); - } - - $this->values = $values; - } -} diff --git a/vendor/symfony/dependency-injection/Argument/ServiceLocator.php b/vendor/symfony/dependency-injection/Argument/ServiceLocator.php deleted file mode 100644 index 2001a95..0000000 --- a/vendor/symfony/dependency-injection/Argument/ServiceLocator.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Argument; - -use Symfony\Component\DependencyInjection\ServiceLocator as BaseServiceLocator; - -/** - * @author Nicolas Grekas - * - * @internal - */ -class ServiceLocator extends BaseServiceLocator -{ - private $factory; - private $serviceMap; - private $serviceTypes; - - public function __construct(\Closure $factory, array $serviceMap, array $serviceTypes = null) - { - $this->factory = $factory; - $this->serviceMap = $serviceMap; - $this->serviceTypes = $serviceTypes; - parent::__construct($serviceMap); - } - - /** - * {@inheritdoc} - */ - public function get($id) - { - return isset($this->serviceMap[$id]) ? ($this->factory)(...$this->serviceMap[$id]) : parent::get($id); - } - - /** - * {@inheritdoc} - */ - public function getProvidedServices(): array - { - return $this->serviceTypes ?? $this->serviceTypes = array_map(function () { return '?'; }, $this->serviceMap); - } -} diff --git a/vendor/symfony/dependency-injection/Argument/ServiceLocatorArgument.php b/vendor/symfony/dependency-injection/Argument/ServiceLocatorArgument.php deleted file mode 100644 index fcbf478..0000000 --- a/vendor/symfony/dependency-injection/Argument/ServiceLocatorArgument.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Argument; - -use Symfony\Component\DependencyInjection\Reference; - -/** - * Represents a closure acting as a service locator. - * - * @author Nicolas Grekas - */ -class ServiceLocatorArgument implements ArgumentInterface -{ - use ReferenceSetArgumentTrait; - - private $taggedIteratorArgument; - - /** - * @param Reference[]|TaggedIteratorArgument $values - */ - public function __construct($values = []) - { - if ($values instanceof TaggedIteratorArgument) { - $this->taggedIteratorArgument = $values; - $this->values = []; - } else { - $this->setValues($values); - } - } - - public function getTaggedIteratorArgument(): ?TaggedIteratorArgument - { - return $this->taggedIteratorArgument; - } -} diff --git a/vendor/symfony/dependency-injection/Argument/TaggedIteratorArgument.php b/vendor/symfony/dependency-injection/Argument/TaggedIteratorArgument.php deleted file mode 100644 index d1d5f6d..0000000 --- a/vendor/symfony/dependency-injection/Argument/TaggedIteratorArgument.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Argument; - -/** - * Represents a collection of services found by tag name to lazily iterate over. - * - * @author Roland Franssen - */ -class TaggedIteratorArgument extends IteratorArgument -{ - private $tag; - private $indexAttribute; - private $defaultIndexMethod; - private $defaultPriorityMethod; - private $needsIndexes = false; - - /** - * @param string $tag The name of the tag identifying the target services - * @param string|null $indexAttribute The name of the attribute that defines the key referencing each service in the tagged collection - * @param string|null $defaultIndexMethod The static method that should be called to get each service's key when their tag doesn't define the previous attribute - * @param bool $needsIndexes Whether indexes are required and should be generated when computing the map - * @param string|null $defaultPriorityMethod The static method that should be called to get each service's priority when their tag doesn't define the "priority" attribute - */ - public function __construct(string $tag, string $indexAttribute = null, string $defaultIndexMethod = null, bool $needsIndexes = false, string $defaultPriorityMethod = null) - { - parent::__construct([]); - - if (null === $indexAttribute && $needsIndexes) { - $indexAttribute = preg_match('/[^.]++$/', $tag, $m) ? $m[0] : $tag; - } - - $this->tag = $tag; - $this->indexAttribute = $indexAttribute; - $this->defaultIndexMethod = $defaultIndexMethod ?: ('getDefault'.str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $indexAttribute ?? ''))).'Name'); - $this->needsIndexes = $needsIndexes; - $this->defaultPriorityMethod = $defaultPriorityMethod ?: ('getDefault'.str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $indexAttribute ?? ''))).'Priority'); - } - - public function getTag() - { - return $this->tag; - } - - public function getIndexAttribute(): ?string - { - return $this->indexAttribute; - } - - public function getDefaultIndexMethod(): ?string - { - return $this->defaultIndexMethod; - } - - public function needsIndexes(): bool - { - return $this->needsIndexes; - } - - public function getDefaultPriorityMethod(): ?string - { - return $this->defaultPriorityMethod; - } -} diff --git a/vendor/symfony/dependency-injection/CHANGELOG.md b/vendor/symfony/dependency-injection/CHANGELOG.md deleted file mode 100644 index 8f1cddf..0000000 --- a/vendor/symfony/dependency-injection/CHANGELOG.md +++ /dev/null @@ -1,271 +0,0 @@ -CHANGELOG -========= - -5.1.0 ------ - - * deprecated `inline()` in favor of `inline_service()` and `ref()` in favor of `service()` when using the PHP-DSL - * allow decorators to reference their decorated service using the special `.inner` id - * added support to autowire public typed properties in php 7.4 - * added support for defining method calls, a configurator, and property setters in `InlineServiceConfigurator` - * added possibility to define abstract service arguments - * allowed mixing "parent" and instanceof-conditionals/defaults/bindings - * updated the signature of method `Definition::setDeprecated()` to `Definition::setDeprecation(string $package, string $version, string $message)` - * updated the signature of method `Alias::setDeprecated()` to `Alias::setDeprecation(string $package, string $version, string $message)` - * updated the signature of method `DeprecateTrait::deprecate()` to `DeprecateTrait::deprecation(string $package, string $version, string $message)` - * deprecated the `Psr\Container\ContainerInterface` and `Symfony\Component\DependencyInjection\ContainerInterface` aliases of the `service_container` service, - configure them explicitly instead - * added class `Symfony\Component\DependencyInjection\Dumper\Preloader` to help with preloading on PHP 7.4+ - * added tags `container.preload`/`.no_preload` to declare extra classes to preload/services to not preload - * allowed loading and dumping tags with an attribute named "name" - * deprecated `Definition::getDeprecationMessage()`, use `Definition::getDeprecation()` instead - * deprecated `Alias::getDeprecationMessage()`, use `Alias::getDeprecation()` instead - * deprecated PHP-DSL's `inline()` function, use `service()` instead - * added support of PHP8 static return type for withers - * added `AliasDeprecatedPublicServicesPass` to deprecate public services to private - -5.0.0 ------ - - * removed support for auto-discovered extension configuration class which does not implement `ConfigurationInterface` - * removed support for non-string default env() parameters - * moved `ServiceSubscriberInterface` to the `Symfony\Contracts\Service` namespace - * removed `RepeatedPass` and `RepeatablePassInterface` - * removed support for short factory/configurator syntax from `YamlFileLoader` - * removed `ResettableContainerInterface`, use `ResetInterface` instead - * added argument `$returnsClone` to `Definition::addMethodCall()` - * removed `tagged`, use `tagged_iterator` instead - -4.4.0 ------ - - * added `CheckTypeDeclarationsPass` to check injected parameters type during compilation - * added support for opcache.preload by generating a preloading script in the cache folder - * added support for dumping the container in one file instead of many files - * deprecated support for short factories and short configurators in Yaml - * added `tagged_iterator` alias for `tagged` which might be deprecated in a future version - * deprecated passing an instance of `Symfony\Component\DependencyInjection\Parameter` as class name to `Symfony\Component\DependencyInjection\Definition` - * added support for binding iterable and tagged services - * made singly-implemented interfaces detection be scoped by file - * added ability to define a static priority method for tagged service - * added support for improved syntax to define method calls in Yaml - * made the `%env(base64:...)%` processor able to decode base64url - * added ability to choose behavior of decorations on non existent decorated services - -4.3.0 ------ - - * added `%env(trim:...)%` processor to trim a string value - * added `%env(default:param_name:...)%` processor to fallback to a parameter or to null when using `%env(default::...)%` - * added `%env(url:...)%` processor to convert an URL or DNS into an array of components - * added `%env(query_string:...)%` processor to convert a query string into an array of key values - * added support for deprecating aliases - * made `ContainerParametersResource` final and not implement `Serializable` anymore - * added `ReverseContainer`: a container that turns services back to their ids - * added ability to define an index for a tagged collection - * added ability to define an index for services in an injected service locator argument - * made `ServiceLocator` implement `ServiceProviderInterface` - * deprecated support for non-string default env() parameters - * added `%env(require:...)%` processor to `require()` a PHP file and use the value returned from it - -4.2.0 ------ - - * added `ContainerBuilder::registerAliasForArgument()` to support autowiring by type+name - * added support for binding by type+name - * added `ServiceSubscriberTrait` to ease implementing `ServiceSubscriberInterface` using methods' return types - * added `ServiceLocatorArgument` and `!service_locator` config tag for creating optimized service-locators - * added support for autoconfiguring bindings - * added `%env(key:...)%` processor to fetch a specific key from an array - * deprecated `ServiceSubscriberInterface`, use the same interface from the `Symfony\Contracts\Service` namespace instead - * deprecated `ResettableContainerInterface`, use `Symfony\Contracts\Service\ResetInterface` instead - -4.1.0 ------ - - * added support for variadics in named arguments - * added PSR-11 `ContainerBagInterface` and its `ContainerBag` implementation to access parameters as-a-service - * added support for service's decorators autowiring - * deprecated the `TypedReference::canBeAutoregistered()` and `TypedReference::getRequiringClass()` methods - * environment variables are validated when used in extension configuration - * deprecated support for auto-discovered extension configuration class which does not implement `ConfigurationInterface` - -4.0.0 ------ - - * Relying on service auto-registration while autowiring is not supported anymore. - Explicitly inject your dependencies or create services whose ids are - their fully-qualified class name. - - Before: - - ```php - namespace App\Controller; - - use App\Mailer; - - class DefaultController - { - public function __construct(Mailer $mailer) { - // ... - } - - // ... - } - ``` - ```yml - services: - App\Controller\DefaultController: - autowire: true - ``` - - After: - - ```php - // same PHP code - ``` - ```yml - services: - App\Controller\DefaultController: - autowire: true - - # or - # App\Controller\DefaultController: - # arguments: { $mailer: "@App\Mailer" } - - App\Mailer: - autowire: true - ``` - * removed autowiring services based on the types they implement - * added a third `$methodName` argument to the `getProxyFactoryCode()` method - of the `DumperInterface` - * removed support for autowiring types - * removed `Container::isFrozen` - * removed support for dumping an ucompiled container in `PhpDumper` - * removed support for generating a dumped `Container` without populating the method map - * removed support for case insensitive service identifiers - * removed the `DefinitionDecorator` class, replaced by `ChildDefinition` - * removed the `AutowireServiceResource` class and related `AutowirePass::createResourceForClass()` method - * removed `LoggingFormatter`, `Compiler::getLoggingFormatter()` and `addLogMessage()` class and methods, use the `ContainerBuilder::log()` method instead - * removed `FactoryReturnTypePass` - * removed `ContainerBuilder::addClassResource()`, use the `addObjectResource()` or the `getReflectionClass()` method instead. - * removed support for top-level anonymous services - * removed silent behavior for unused attributes and elements - * removed support for setting and accessing private services in `Container` - * removed support for setting pre-defined services in `Container` - * removed support for case insensitivity of parameter names - * removed `AutowireExceptionPass` and `AutowirePass::getAutowiringExceptions()`, use `Definition::addError()` and the `DefinitionErrorExceptionPass` instead - -3.4.0 ------ - - * moved the `ExtensionCompilerPass` to before-optimization passes with priority -1000 - * deprecated "public-by-default" definitions and aliases, the new default will be "private" in 4.0 - * added `EnvVarProcessorInterface` and corresponding "container.env_var_processor" tag for processing env vars - * added support for ignore-on-uninitialized references - * deprecated service auto-registration while autowiring - * deprecated the ability to check for the initialization of a private service with the `Container::initialized()` method - * deprecated support for top-level anonymous services in XML - * deprecated case insensitivity of parameter names - * deprecated the `ResolveDefinitionTemplatesPass` class in favor of `ResolveChildDefinitionsPass` - * added `TaggedIteratorArgument` with YAML (`!tagged foo`) and XML (``) support - * deprecated `AutowireExceptionPass` and `AutowirePass::getAutowiringExceptions()`, use `Definition::addError()` and the `DefinitionErrorExceptionPass` instead - - -3.3.0 ------ - - * deprecated autowiring services based on the types they implement; - rename (or alias) your services to their FQCN id to make them autowirable - * added "ServiceSubscriberInterface" - to allow for per-class explicit service-locator definitions - * added "container.service_locator" tag for defining service-locator services - * added anonymous services support in YAML configuration files using the `!service` tag. - * added "TypedReference" and "ServiceClosureArgument" for creating service-locator services - * added `ServiceLocator` - a PSR-11 container holding a set of services to be lazily loaded - * added "instanceof" section for local interface-defined configs - * added prototype services for PSR4-based discovery and registration - * added `ContainerBuilder::getReflectionClass()` for retrieving and tracking reflection class info - * deprecated `ContainerBuilder::getClassResource()`, use `ContainerBuilder::getReflectionClass()` or `ContainerBuilder::addObjectResource()` instead - * added `ContainerBuilder::fileExists()` for checking and tracking file or directory existence - * deprecated autowiring-types, use aliases instead - * added support for omitting the factory class name in a service definition if the definition class is set - * deprecated case insensitivity of service identifiers - * added "iterator" argument type for lazy iteration over a set of values and services - * added file-wide configurable defaults for service attributes "public", "tags", - "autowire" and "autoconfigure" - * made the "class" attribute optional, using the "id" as fallback - * using the `PhpDumper` with an uncompiled `ContainerBuilder` is deprecated and - will not be supported anymore in 4.0 - * deprecated the `DefinitionDecorator` class in favor of `ChildDefinition` - * allow config files to be loaded using a glob pattern - * [BC BREAK] the `NullDumper` class is now final - -3.2.0 ------ - - * allowed to prioritize compiler passes by introducing a third argument to `PassConfig::addPass()`, to `Compiler::addPass` and to `ContainerBuilder::addCompilerPass()` - * added support for PHP constants in YAML configuration files - * deprecated the ability to set or unset a private service with the `Container::set()` method - * deprecated the ability to check for the existence of a private service with the `Container::has()` method - * deprecated the ability to request a private service with the `Container::get()` method - * deprecated support for generating a dumped `Container` without populating the method map - -3.0.0 ------ - - * removed all deprecated codes from 2.x versions - -2.8.0 ------ - - * deprecated the abstract ContainerAware class in favor of ContainerAwareTrait - * deprecated IntrospectableContainerInterface, to be merged with ContainerInterface in 3.0 - * allowed specifying a directory to recursively load all configuration files it contains - * deprecated the concept of scopes - * added `Definition::setShared()` and `Definition::isShared()` - * added ResettableContainerInterface to be able to reset the container to release memory on shutdown - * added a way to define the priority of service decoration - * added support for service autowiring - -2.7.0 ------ - - * deprecated synchronized services - -2.6.0 ------ - - * added new factory syntax and deprecated the old one - -2.5.0 ------ - -* added DecoratorServicePass and a way to override a service definition (Definition::setDecoratedService()) -* deprecated SimpleXMLElement class. - -2.4.0 ------ - - * added support for expressions in service definitions - * added ContainerAwareTrait to add default container aware behavior to a class - -2.2.0 ------ - - * added Extension::isConfigEnabled() to ease working with enableable configurations - * added an Extension base class with sensible defaults to be used in conjunction - with the Config component. - * added PrependExtensionInterface (to be able to allow extensions to prepend - application configuration settings for any Bundle) - -2.1.0 ------ - - * added IntrospectableContainerInterface (to be able to check if a service - has been initialized or not) - * added ConfigurationExtensionInterface - * added Definition::clearTag() - * component exceptions that inherit base SPL classes are now used exclusively - (this includes dumped containers) - * [BC BREAK] fixed unescaping of class arguments, method - ParameterBag::unescapeValue() was made public diff --git a/vendor/symfony/dependency-injection/ChildDefinition.php b/vendor/symfony/dependency-injection/ChildDefinition.php deleted file mode 100644 index 063a727..0000000 --- a/vendor/symfony/dependency-injection/ChildDefinition.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException; - -/** - * This definition extends another definition. - * - * @author Johannes M. Schmitt - */ -class ChildDefinition extends Definition -{ - private $parent; - - /** - * @param string $parent The id of Definition instance to decorate - */ - public function __construct(string $parent) - { - $this->parent = $parent; - $this->setPrivate(false); - } - - /** - * Returns the Definition to inherit from. - * - * @return string - */ - public function getParent() - { - return $this->parent; - } - - /** - * Sets the Definition to inherit from. - * - * @param string $parent - * - * @return $this - */ - public function setParent($parent) - { - $this->parent = $parent; - - return $this; - } - - /** - * Gets an argument to pass to the service constructor/factory method. - * - * If replaceArgument() has been used to replace an argument, this method - * will return the replacement value. - * - * @param int|string $index - * - * @return mixed The argument value - * - * @throws OutOfBoundsException When the argument does not exist - */ - public function getArgument($index) - { - if (\array_key_exists('index_'.$index, $this->arguments)) { - return $this->arguments['index_'.$index]; - } - - return parent::getArgument($index); - } - - /** - * You should always use this method when overwriting existing arguments - * of the parent definition. - * - * If you directly call setArguments() keep in mind that you must follow - * certain conventions when you want to overwrite the arguments of the - * parent definition, otherwise your arguments will only be appended. - * - * @param int|string $index - * @param mixed $value - * - * @return $this - * - * @throws InvalidArgumentException when $index isn't an integer - */ - public function replaceArgument($index, $value) - { - if (\is_int($index)) { - $this->arguments['index_'.$index] = $value; - } elseif (0 === strpos($index, '$')) { - $this->arguments[$index] = $value; - } else { - throw new InvalidArgumentException('The argument must be an existing index or the name of a constructor\'s parameter.'); - } - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php b/vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php deleted file mode 100644 index 76c954a..0000000 --- a/vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php +++ /dev/null @@ -1,223 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\LogicException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\ExpressionLanguage; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\ExpressionLanguage\Expression; - -/** - * @author Nicolas Grekas - */ -abstract class AbstractRecursivePass implements CompilerPassInterface -{ - /** - * @var ContainerBuilder - */ - protected $container; - protected $currentId; - - private $processExpressions = false; - private $expressionLanguage; - private $inExpression = false; - - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - $this->container = $container; - - try { - $this->processValue($container->getDefinitions(), true); - } finally { - $this->container = null; - } - } - - protected function enableExpressionProcessing() - { - $this->processExpressions = true; - } - - protected function inExpression(bool $reset = true): bool - { - $inExpression = $this->inExpression; - if ($reset) { - $this->inExpression = false; - } - - return $inExpression; - } - - /** - * Processes a value found in a definition tree. - * - * @param mixed $value - * - * @return mixed The processed value - */ - protected function processValue($value, bool $isRoot = false) - { - if (\is_array($value)) { - foreach ($value as $k => $v) { - if ($isRoot) { - $this->currentId = $k; - } - if ($v !== $processedValue = $this->processValue($v, $isRoot)) { - $value[$k] = $processedValue; - } - } - } elseif ($value instanceof ArgumentInterface) { - $value->setValues($this->processValue($value->getValues())); - } elseif ($value instanceof Expression && $this->processExpressions) { - $this->getExpressionLanguage()->compile((string) $value, ['this' => 'container']); - } elseif ($value instanceof Definition) { - $value->setArguments($this->processValue($value->getArguments())); - $value->setProperties($this->processValue($value->getProperties())); - $value->setMethodCalls($this->processValue($value->getMethodCalls())); - - $changes = $value->getChanges(); - if (isset($changes['factory'])) { - $value->setFactory($this->processValue($value->getFactory())); - } - if (isset($changes['configurator'])) { - $value->setConfigurator($this->processValue($value->getConfigurator())); - } - } - - return $value; - } - - /** - * @return \ReflectionFunctionAbstract|null - * - * @throws RuntimeException - */ - protected function getConstructor(Definition $definition, bool $required) - { - if ($definition->isSynthetic()) { - return null; - } - - if (\is_string($factory = $definition->getFactory())) { - if (!\function_exists($factory)) { - throw new RuntimeException(sprintf('Invalid service "%s": function "%s" does not exist.', $this->currentId, $factory)); - } - $r = new \ReflectionFunction($factory); - if (false !== $r->getFileName() && file_exists($r->getFileName())) { - $this->container->fileExists($r->getFileName()); - } - - return $r; - } - - if ($factory) { - list($class, $method) = $factory; - if ($class instanceof Reference) { - $class = $this->container->findDefinition((string) $class)->getClass(); - } elseif ($class instanceof Definition) { - $class = $class->getClass(); - } elseif (null === $class) { - $class = $definition->getClass(); - } - - if ('__construct' === $method) { - throw new RuntimeException(sprintf('Invalid service "%s": "__construct()" cannot be used as a factory method.', $this->currentId)); - } - - return $this->getReflectionMethod(new Definition($class), $method); - } - - $class = $definition->getClass(); - - try { - if (!$r = $this->container->getReflectionClass($class)) { - throw new RuntimeException(sprintf('Invalid service "%s": class "%s" does not exist.', $this->currentId, $class)); - } - } catch (\ReflectionException $e) { - throw new RuntimeException(sprintf('Invalid service "%s": ', $this->currentId).lcfirst($e->getMessage())); - } - if (!$r = $r->getConstructor()) { - if ($required) { - throw new RuntimeException(sprintf('Invalid service "%s": class%s has no constructor.', $this->currentId, sprintf($class !== $this->currentId ? ' "%s"' : '', $class))); - } - } elseif (!$r->isPublic()) { - throw new RuntimeException(sprintf('Invalid service "%s": ', $this->currentId).sprintf($class !== $this->currentId ? 'constructor of class "%s"' : 'its constructor', $class).' must be public.'); - } - - return $r; - } - - /** - * @throws RuntimeException - * - * @return \ReflectionFunctionAbstract - */ - protected function getReflectionMethod(Definition $definition, string $method) - { - if ('__construct' === $method) { - return $this->getConstructor($definition, true); - } - - if (!$class = $definition->getClass()) { - throw new RuntimeException(sprintf('Invalid service "%s": the class is not set.', $this->currentId)); - } - - if (!$r = $this->container->getReflectionClass($class)) { - throw new RuntimeException(sprintf('Invalid service "%s": class "%s" does not exist.', $this->currentId, $class)); - } - - if (!$r->hasMethod($method)) { - throw new RuntimeException(sprintf('Invalid service "%s": method "%s()" does not exist.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method)); - } - - $r = $r->getMethod($method); - if (!$r->isPublic()) { - throw new RuntimeException(sprintf('Invalid service "%s": method "%s()" must be public.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method)); - } - - return $r; - } - - private function getExpressionLanguage(): ExpressionLanguage - { - if (null === $this->expressionLanguage) { - if (!class_exists(ExpressionLanguage::class)) { - throw new LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); - } - - $providers = $this->container->getExpressionLanguageProviders(); - $this->expressionLanguage = new ExpressionLanguage(null, $providers, function (string $arg): string { - if ('""' === substr_replace($arg, '', 1, -1)) { - $id = stripcslashes(substr($arg, 1, -1)); - $this->inExpression = true; - $arg = $this->processValue(new Reference($id)); - $this->inExpression = false; - if (!$arg instanceof Reference) { - throw new RuntimeException(sprintf('"%s::processValue()" must return a Reference when processing an expression, "%s" returned for service("%s").', static::class, get_debug_type($arg), $id)); - } - $arg = sprintf('"%s"', $arg); - } - - return sprintf('$this->get(%s)', $arg); - }); - } - - return $this->expressionLanguage; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.php b/vendor/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.php deleted file mode 100644 index 802c407..0000000 --- a/vendor/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Reference; - -final class AliasDeprecatedPublicServicesPass extends AbstractRecursivePass -{ - private $tagName; - - private $aliases = []; - - public function __construct(string $tagName = 'container.private') - { - $this->tagName = $tagName; - } - - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if ($value instanceof Reference && isset($this->aliases[$id = (string) $value])) { - return new Reference($this->aliases[$id], $value->getInvalidBehavior()); - } - - return parent::processValue($value, $isRoot); - } - - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - foreach ($container->findTaggedServiceIds($this->tagName) as $id => $tags) { - if (null === $package = $tags[0]['package'] ?? null) { - throw new InvalidArgumentException(sprintf('The "package" attribute is mandatory for the "%s" tag on the "%s" service.', $this->tagName, $id)); - } - - if (null === $version = $tags[0]['version'] ?? null) { - throw new InvalidArgumentException(sprintf('The "version" attribute is mandatory for the "%s" tag on the "%s" service.', $this->tagName, $id)); - } - - $definition = $container->getDefinition($id); - if (!$definition->isPublic() || $definition->isPrivate()) { - throw new InvalidArgumentException(sprintf('The "%s" service is private: it cannot have the "%s" tag.', $id, $this->tagName)); - } - - $container - ->setAlias($id, $aliasId = '.'.$this->tagName.'.'.$id) - ->setPublic(true) - ->setDeprecated($package, $version, 'Accessing the "%alias_id%" service directly from the container is deprecated, use dependency injection instead.'); - - $container->setDefinition($aliasId, $definition); - - $this->aliases[$id] = $aliasId; - } - - parent::process($container); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php b/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php deleted file mode 100644 index beb4882..0000000 --- a/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php +++ /dev/null @@ -1,184 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Run this pass before passes that need to know more about the relation of - * your services. - * - * This class will populate the ServiceReferenceGraph with information. You can - * retrieve the graph in other passes from the compiler. - * - * @author Johannes M. Schmitt - * @author Nicolas Grekas - */ -class AnalyzeServiceReferencesPass extends AbstractRecursivePass -{ - private $graph; - private $currentDefinition; - private $onlyConstructorArguments; - private $hasProxyDumper; - private $lazy; - private $byConstructor; - private $definitions; - private $aliases; - - /** - * @param bool $onlyConstructorArguments Sets this Service Reference pass to ignore method calls - */ - public function __construct(bool $onlyConstructorArguments = false, bool $hasProxyDumper = true) - { - $this->onlyConstructorArguments = $onlyConstructorArguments; - $this->hasProxyDumper = $hasProxyDumper; - $this->enableExpressionProcessing(); - } - - /** - * Processes a ContainerBuilder object to populate the service reference graph. - */ - public function process(ContainerBuilder $container) - { - $this->container = $container; - $this->graph = $container->getCompiler()->getServiceReferenceGraph(); - $this->graph->clear(); - $this->lazy = false; - $this->byConstructor = false; - $this->definitions = $container->getDefinitions(); - $this->aliases = $container->getAliases(); - - foreach ($this->aliases as $id => $alias) { - $targetId = $this->getDefinitionId((string) $alias); - $this->graph->connect($id, $alias, $targetId, null !== $targetId ? $this->container->getDefinition($targetId) : null, null); - } - - try { - parent::process($container); - } finally { - $this->aliases = $this->definitions = []; - } - } - - protected function processValue($value, bool $isRoot = false) - { - $lazy = $this->lazy; - $inExpression = $this->inExpression(); - - if ($value instanceof ArgumentInterface) { - $this->lazy = true; - parent::processValue($value->getValues()); - $this->lazy = $lazy; - - return $value; - } - if ($value instanceof Reference) { - $targetId = $this->getDefinitionId((string) $value); - $targetDefinition = null !== $targetId ? $this->container->getDefinition($targetId) : null; - - $this->graph->connect( - $this->currentId, - $this->currentDefinition, - $targetId, - $targetDefinition, - $value, - $this->lazy || ($this->hasProxyDumper && $targetDefinition && $targetDefinition->isLazy()), - ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $value->getInvalidBehavior(), - $this->byConstructor - ); - - if ($inExpression) { - $this->graph->connect( - '.internal.reference_in_expression', - null, - $targetId, - $targetDefinition, - $value, - $this->lazy || ($targetDefinition && $targetDefinition->isLazy()), - true - ); - } - - return $value; - } - if (!$value instanceof Definition) { - return parent::processValue($value, $isRoot); - } - if ($isRoot) { - if ($value->isSynthetic() || $value->isAbstract()) { - return $value; - } - $this->currentDefinition = $value; - } elseif ($this->currentDefinition === $value) { - return $value; - } - $this->lazy = false; - - $byConstructor = $this->byConstructor; - $this->byConstructor = $isRoot || $byConstructor; - $this->processValue($value->getFactory()); - $this->processValue($value->getArguments()); - - $properties = $value->getProperties(); - $setters = $value->getMethodCalls(); - - // Any references before a "wither" are part of the constructor-instantiation graph - $lastWitherIndex = null; - foreach ($setters as $k => $call) { - if ($call[2] ?? false) { - $lastWitherIndex = $k; - } - } - - if (null !== $lastWitherIndex) { - $this->processValue($properties); - $setters = $properties = []; - - foreach ($value->getMethodCalls() as $k => $call) { - if (null === $lastWitherIndex) { - $setters[] = $call; - continue; - } - - if ($lastWitherIndex === $k) { - $lastWitherIndex = null; - } - - $this->processValue($call); - } - } - - $this->byConstructor = $byConstructor; - - if (!$this->onlyConstructorArguments) { - $this->processValue($properties); - $this->processValue($setters); - $this->processValue($value->getConfigurator()); - } - $this->lazy = $lazy; - - return $value; - } - - private function getDefinitionId(string $id): ?string - { - while (isset($this->aliases[$id])) { - $id = (string) $this->aliases[$id]; - } - - return isset($this->definitions[$id]) ? $id : null; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.php b/vendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.php deleted file mode 100644 index 0342068..0000000 --- a/vendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Alias; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -/** - * Sets a service to be an alias of another one, given a format pattern. - */ -class AutoAliasServicePass implements CompilerPassInterface -{ - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - foreach ($container->findTaggedServiceIds('auto_alias') as $serviceId => $tags) { - foreach ($tags as $tag) { - if (!isset($tag['format'])) { - throw new InvalidArgumentException(sprintf('Missing tag information "format" on auto_alias service "%s".', $serviceId)); - } - - $aliasId = $container->getParameterBag()->resolveValue($tag['format']); - if ($container->hasDefinition($aliasId) || $container->hasAlias($aliasId)) { - $container->setAlias($serviceId, new Alias($aliasId, true)); - } - } - } - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/AutowirePass.php b/vendor/symfony/dependency-injection/Compiler/AutowirePass.php deleted file mode 100644 index ba10e92..0000000 --- a/vendor/symfony/dependency-injection/Compiler/AutowirePass.php +++ /dev/null @@ -1,475 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\Config\Resource\ClassExistenceResource; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\AutowiringFailedException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\LazyProxy\ProxyHelper; -use Symfony\Component\DependencyInjection\TypedReference; - -/** - * Inspects existing service definitions and wires the autowired ones using the type hints of their classes. - * - * @author Kévin Dunglas - * @author Nicolas Grekas - */ -class AutowirePass extends AbstractRecursivePass -{ - private $types; - private $ambiguousServiceTypes; - private $lastFailure; - private $throwOnAutowiringException; - private $decoratedClass; - private $decoratedId; - private $methodCalls; - private $getPreviousValue; - private $decoratedMethodIndex; - private $decoratedMethodArgumentIndex; - private $typesClone; - - public function __construct(bool $throwOnAutowireException = true) - { - $this->throwOnAutowiringException = $throwOnAutowireException; - } - - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - try { - $this->typesClone = clone $this; - parent::process($container); - } finally { - $this->decoratedClass = null; - $this->decoratedId = null; - $this->methodCalls = null; - $this->getPreviousValue = null; - $this->decoratedMethodIndex = null; - $this->decoratedMethodArgumentIndex = null; - $this->typesClone = null; - } - } - - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - try { - return $this->doProcessValue($value, $isRoot); - } catch (AutowiringFailedException $e) { - if ($this->throwOnAutowiringException) { - throw $e; - } - - $this->container->getDefinition($this->currentId)->addError($e->getMessageCallback() ?? $e->getMessage()); - - return parent::processValue($value, $isRoot); - } - } - - /** - * @return mixed - */ - private function doProcessValue($value, bool $isRoot = false) - { - if ($value instanceof TypedReference) { - if ($ref = $this->getAutowiredReference($value)) { - return $ref; - } - if (ContainerBuilder::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE === $value->getInvalidBehavior()) { - $message = $this->createTypeNotFoundMessageCallback($value, 'it'); - - // since the error message varies by referenced id and $this->currentId, so should the id of the dummy errored definition - $this->container->register($id = sprintf('.errored.%s.%s', $this->currentId, (string) $value), $value->getType()) - ->addError($message); - - return new TypedReference($id, $value->getType(), $value->getInvalidBehavior(), $value->getName()); - } - } - $value = parent::processValue($value, $isRoot); - - if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) { - return $value; - } - if (!$reflectionClass = $this->container->getReflectionClass($value->getClass(), false)) { - $this->container->log($this, sprintf('Skipping service "%s": Class or interface "%s" cannot be loaded.', $this->currentId, $value->getClass())); - - return $value; - } - - $this->methodCalls = $value->getMethodCalls(); - - try { - $constructor = $this->getConstructor($value, false); - } catch (RuntimeException $e) { - throw new AutowiringFailedException($this->currentId, $e->getMessage(), 0, $e); - } - - if ($constructor) { - array_unshift($this->methodCalls, [$constructor, $value->getArguments()]); - } - - $this->methodCalls = $this->autowireCalls($reflectionClass, $isRoot); - - if ($constructor) { - list(, $arguments) = array_shift($this->methodCalls); - - if ($arguments !== $value->getArguments()) { - $value->setArguments($arguments); - } - } - - if ($this->methodCalls !== $value->getMethodCalls()) { - $value->setMethodCalls($this->methodCalls); - } - - return $value; - } - - private function autowireCalls(\ReflectionClass $reflectionClass, bool $isRoot): array - { - $this->decoratedId = null; - $this->decoratedClass = null; - $this->getPreviousValue = null; - - if ($isRoot && ($definition = $this->container->getDefinition($this->currentId)) && $this->container->has($this->decoratedId = $definition->innerServiceId)) { - $this->decoratedClass = $this->container->findDefinition($this->decoratedId)->getClass(); - } - - foreach ($this->methodCalls as $i => $call) { - $this->decoratedMethodIndex = $i; - list($method, $arguments) = $call; - - if ($method instanceof \ReflectionFunctionAbstract) { - $reflectionMethod = $method; - } else { - $definition = new Definition($reflectionClass->name); - try { - $reflectionMethod = $this->getReflectionMethod($definition, $method); - } catch (RuntimeException $e) { - if ($definition->getFactory()) { - continue; - } - throw $e; - } - } - - $arguments = $this->autowireMethod($reflectionMethod, $arguments); - - if ($arguments !== $call[1]) { - $this->methodCalls[$i][1] = $arguments; - } - } - - return $this->methodCalls; - } - - /** - * Autowires the constructor or a method. - * - * @return array The autowired arguments - * - * @throws AutowiringFailedException - */ - private function autowireMethod(\ReflectionFunctionAbstract $reflectionMethod, array $arguments): array - { - $class = $reflectionMethod instanceof \ReflectionMethod ? $reflectionMethod->class : $this->currentId; - $method = $reflectionMethod->name; - $parameters = $reflectionMethod->getParameters(); - if ($reflectionMethod->isVariadic()) { - array_pop($parameters); - } - - foreach ($parameters as $index => $parameter) { - if (\array_key_exists($index, $arguments) && '' !== $arguments[$index]) { - continue; - } - - $type = ProxyHelper::getTypeHint($reflectionMethod, $parameter, true); - - if (!$type) { - if (isset($arguments[$index])) { - continue; - } - - // no default value? Then fail - if (!$parameter->isDefaultValueAvailable()) { - // For core classes, isDefaultValueAvailable() can - // be false when isOptional() returns true. If the - // argument *is* optional, allow it to be missing - if ($parameter->isOptional()) { - continue; - } - $type = ProxyHelper::getTypeHint($reflectionMethod, $parameter, false); - $type = $type ? sprintf('is type-hinted "%s"', ltrim($type, '\\')) : 'has no type-hint'; - - throw new AutowiringFailedException($this->currentId, sprintf('Cannot autowire service "%s": argument "$%s" of method "%s()" %s, you should configure its value explicitly.', $this->currentId, $parameter->name, $class !== $this->currentId ? $class.'::'.$method : $method, $type)); - } - - // specifically pass the default value - $arguments[$index] = $parameter->getDefaultValue(); - - continue; - } - - $getValue = function () use ($type, $parameter, $class, $method) { - if (!$value = $this->getAutowiredReference($ref = new TypedReference($type, $type, ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE, $parameter->name))) { - $failureMessage = $this->createTypeNotFoundMessageCallback($ref, sprintf('argument "$%s" of method "%s()"', $parameter->name, $class !== $this->currentId ? $class.'::'.$method : $method)); - - if ($parameter->isDefaultValueAvailable()) { - $value = $parameter->getDefaultValue(); - } elseif (!$parameter->allowsNull()) { - throw new AutowiringFailedException($this->currentId, $failureMessage); - } - } - - return $value; - }; - - if ($this->decoratedClass && $isDecorated = is_a($this->decoratedClass, $type, true)) { - if ($this->getPreviousValue) { - // The inner service is injected only if there is only 1 argument matching the type of the decorated class - // across all arguments of all autowired methods. - // If a second matching argument is found, the default behavior is restored. - - $getPreviousValue = $this->getPreviousValue; - $this->methodCalls[$this->decoratedMethodIndex][1][$this->decoratedMethodArgumentIndex] = $getPreviousValue(); - $this->decoratedClass = null; // Prevent further checks - } else { - $arguments[$index] = new TypedReference($this->decoratedId, $this->decoratedClass); - $this->getPreviousValue = $getValue; - $this->decoratedMethodArgumentIndex = $index; - - continue; - } - } - - $arguments[$index] = $getValue(); - } - - if ($parameters && !isset($arguments[++$index])) { - while (0 <= --$index) { - $parameter = $parameters[$index]; - if (!$parameter->isDefaultValueAvailable() || $parameter->getDefaultValue() !== $arguments[$index]) { - break; - } - unset($arguments[$index]); - } - } - - // it's possible index 1 was set, then index 0, then 2, etc - // make sure that we re-order so they're injected as expected - ksort($arguments); - - return $arguments; - } - - /** - * Returns a reference to the service matching the given type, if any. - */ - private function getAutowiredReference(TypedReference $reference): ?TypedReference - { - $this->lastFailure = null; - $type = $reference->getType(); - - if ($type !== (string) $reference) { - return $reference; - } - - if (null !== $name = $reference->getName()) { - if ($this->container->has($alias = $type.' $'.$name) && !$this->container->findDefinition($alias)->isAbstract()) { - return new TypedReference($alias, $type, $reference->getInvalidBehavior()); - } - - if ($this->container->has($name) && !$this->container->findDefinition($name)->isAbstract()) { - foreach ($this->container->getAliases() as $id => $alias) { - if ($name === (string) $alias && 0 === strpos($id, $type.' $')) { - return new TypedReference($name, $type, $reference->getInvalidBehavior()); - } - } - } - } - - if ($this->container->has($type) && !$this->container->findDefinition($type)->isAbstract()) { - return new TypedReference($type, $type, $reference->getInvalidBehavior()); - } - - return null; - } - - /** - * Populates the list of available types. - */ - private function populateAvailableTypes(ContainerBuilder $container) - { - $this->types = []; - $this->ambiguousServiceTypes = []; - - foreach ($container->getDefinitions() as $id => $definition) { - $this->populateAvailableType($container, $id, $definition); - } - } - - /** - * Populates the list of available types for a given definition. - */ - private function populateAvailableType(ContainerBuilder $container, string $id, Definition $definition) - { - // Never use abstract services - if ($definition->isAbstract()) { - return; - } - - if ('' === $id || '.' === $id[0] || $definition->isDeprecated() || !$reflectionClass = $container->getReflectionClass($definition->getClass(), false)) { - return; - } - - foreach ($reflectionClass->getInterfaces() as $reflectionInterface) { - $this->set($reflectionInterface->name, $id); - } - - do { - $this->set($reflectionClass->name, $id); - } while ($reflectionClass = $reflectionClass->getParentClass()); - } - - /** - * Associates a type and a service id if applicable. - */ - private function set(string $type, string $id) - { - // is this already a type/class that is known to match multiple services? - if (isset($this->ambiguousServiceTypes[$type])) { - $this->ambiguousServiceTypes[$type][] = $id; - - return; - } - - // check to make sure the type doesn't match multiple services - if (!isset($this->types[$type]) || $this->types[$type] === $id) { - $this->types[$type] = $id; - - return; - } - - // keep an array of all services matching this type - if (!isset($this->ambiguousServiceTypes[$type])) { - $this->ambiguousServiceTypes[$type] = [$this->types[$type]]; - unset($this->types[$type]); - } - $this->ambiguousServiceTypes[$type][] = $id; - } - - private function createTypeNotFoundMessageCallback(TypedReference $reference, string $label): callable - { - if (null === $this->typesClone->container) { - $this->typesClone->container = new ContainerBuilder($this->container->getParameterBag()); - $this->typesClone->container->setAliases($this->container->getAliases()); - $this->typesClone->container->setDefinitions($this->container->getDefinitions()); - $this->typesClone->container->setResourceTracking(false); - } - $currentId = $this->currentId; - - return (function () use ($reference, $label, $currentId) { - return $this->createTypeNotFoundMessage($reference, $label, $currentId); - })->bindTo($this->typesClone); - } - - private function createTypeNotFoundMessage(TypedReference $reference, string $label, string $currentId): string - { - if (!$r = $this->container->getReflectionClass($type = $reference->getType(), false)) { - // either $type does not exist or a parent class does not exist - try { - $resource = new ClassExistenceResource($type, false); - // isFresh() will explode ONLY if a parent class/trait does not exist - $resource->isFresh(0); - $parentMsg = false; - } catch (\ReflectionException $e) { - $parentMsg = $e->getMessage(); - } - - $message = sprintf('has type "%s" but this class %s.', $type, $parentMsg ? sprintf('is missing a parent class (%s)', $parentMsg) : 'was not found'); - } else { - $alternatives = $this->createTypeAlternatives($this->container, $reference); - $message = $this->container->has($type) ? 'this service is abstract' : 'no such service exists'; - $message = sprintf('references %s "%s" but %s.%s', $r->isInterface() ? 'interface' : 'class', $type, $message, $alternatives); - - if ($r->isInterface() && !$alternatives) { - $message .= ' Did you create a class that implements this interface?'; - } - } - - $message = sprintf('Cannot autowire service "%s": %s %s', $currentId, $label, $message); - - if (null !== $this->lastFailure) { - $message = $this->lastFailure."\n".$message; - $this->lastFailure = null; - } - - return $message; - } - - private function createTypeAlternatives(ContainerBuilder $container, TypedReference $reference): string - { - // try suggesting available aliases first - if ($message = $this->getAliasesSuggestionForType($container, $type = $reference->getType())) { - return ' '.$message; - } - if (null === $this->ambiguousServiceTypes) { - $this->populateAvailableTypes($container); - } - - $servicesAndAliases = $container->getServiceIds(); - if (!$container->has($type) && false !== $key = array_search(strtolower($type), array_map('strtolower', $servicesAndAliases))) { - return sprintf(' Did you mean "%s"?', $servicesAndAliases[$key]); - } elseif (isset($this->ambiguousServiceTypes[$type])) { - $message = sprintf('one of these existing services: "%s"', implode('", "', $this->ambiguousServiceTypes[$type])); - } elseif (isset($this->types[$type])) { - $message = sprintf('the existing "%s" service', $this->types[$type]); - } else { - return ''; - } - - return sprintf(' You should maybe alias this %s to %s.', class_exists($type, false) ? 'class' : 'interface', $message); - } - - private function getAliasesSuggestionForType(ContainerBuilder $container, string $type): ?string - { - $aliases = []; - foreach (class_parents($type) + class_implements($type) as $parent) { - if ($container->has($parent) && !$container->findDefinition($parent)->isAbstract()) { - $aliases[] = $parent; - } - } - - if (1 < $len = \count($aliases)) { - $message = 'Try changing the type-hint to one of its parents: '; - for ($i = 0, --$len; $i < $len; ++$i) { - $message .= sprintf('%s "%s", ', class_exists($aliases[$i], false) ? 'class' : 'interface', $aliases[$i]); - } - $message .= sprintf('or %s "%s".', class_exists($aliases[$i], false) ? 'class' : 'interface', $aliases[$i]); - - return $message; - } - - if ($aliases) { - return sprintf('Try changing the type-hint to "%s" instead.', $aliases[0]); - } - - return null; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php b/vendor/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php deleted file mode 100644 index 2c774f7..0000000 --- a/vendor/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Definition; - -/** - * Looks for definitions with autowiring enabled and registers their corresponding "@required" methods as setters. - * - * @author Nicolas Grekas - */ -class AutowireRequiredMethodsPass extends AbstractRecursivePass -{ - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - $value = parent::processValue($value, $isRoot); - - if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) { - return $value; - } - if (!$reflectionClass = $this->container->getReflectionClass($value->getClass(), false)) { - return $value; - } - - $alreadyCalledMethods = []; - $withers = []; - - foreach ($value->getMethodCalls() as list($method)) { - $alreadyCalledMethods[strtolower($method)] = true; - } - - foreach ($reflectionClass->getMethods() as $reflectionMethod) { - $r = $reflectionMethod; - - if ($r->isConstructor() || isset($alreadyCalledMethods[strtolower($r->name)])) { - continue; - } - - while (true) { - if (false !== $doc = $r->getDocComment()) { - if (false !== stripos($doc, '@required') && preg_match('#(?:^/\*\*|\n\s*+\*)\s*+@required(?:\s|\*/$)#i', $doc)) { - if ($this->isWither($reflectionMethod, $doc)) { - $withers[] = [$reflectionMethod->name, [], true]; - } else { - $value->addMethodCall($reflectionMethod->name, []); - } - break; - } - if (false === stripos($doc, '@inheritdoc') || !preg_match('#(?:^/\*\*|\n\s*+\*)\s*+(?:\{@inheritdoc\}|@inheritdoc)(?:\s|\*/$)#i', $doc)) { - break; - } - } - try { - $r = $r->getPrototype(); - } catch (\ReflectionException $e) { - break; // method has no prototype - } - } - } - - if ($withers) { - // Prepend withers to prevent creating circular loops - $setters = $value->getMethodCalls(); - $value->setMethodCalls($withers); - foreach ($setters as $call) { - $value->addMethodCall($call[0], $call[1], $call[2] ?? false); - } - } - - return $value; - } - - private function isWither(\ReflectionMethod $reflectionMethod, string $doc): bool - { - $match = preg_match('#(?:^/\*\*|\n\s*+\*)\s*+@return\s++(static|\$this)[\s\*]#i', $doc, $matches); - if ($match && 'static' === $matches[1]) { - return true; - } - - if ($match && '$this' === $matches[1]) { - return false; - } - - $reflectionType = $reflectionMethod->hasReturnType() ? $reflectionMethod->getReturnType() : null; - - return $reflectionType instanceof \ReflectionNamedType && 'static' === $reflectionType->getName(); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php b/vendor/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php deleted file mode 100644 index 24f9c41..0000000 --- a/vendor/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\TypedReference; - -/** - * Looks for definitions with autowiring enabled and registers their corresponding "@required" properties. - * - * @author Sebastien Morel (Plopix) - * @author Nicolas Grekas - */ -class AutowireRequiredPropertiesPass extends AbstractRecursivePass -{ - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if (\PHP_VERSION_ID < 70400) { - return $value; - } - $value = parent::processValue($value, $isRoot); - - if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) { - return $value; - } - if (!$reflectionClass = $this->container->getReflectionClass($value->getClass(), false)) { - return $value; - } - - $properties = $value->getProperties(); - foreach ($reflectionClass->getProperties() as $reflectionProperty) { - if (!($type = $reflectionProperty->getType()) instanceof \ReflectionNamedType) { - continue; - } - if (false === $doc = $reflectionProperty->getDocComment()) { - continue; - } - if (false === stripos($doc, '@required') || !preg_match('#(?:^/\*\*|\n\s*+\*)\s*+@required(?:\s|\*/$)#i', $doc)) { - continue; - } - if (\array_key_exists($name = $reflectionProperty->getName(), $properties)) { - continue; - } - - $type = $type->getName(); - $value->setProperty($name, new TypedReference($type, $type, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, $name)); - } - - return $value; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php b/vendor/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php deleted file mode 100644 index 348498d..0000000 --- a/vendor/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; - -/** - * Checks if arguments of methods are properly configured. - * - * @author Kévin Dunglas - * @author Nicolas Grekas - */ -class CheckArgumentsValidityPass extends AbstractRecursivePass -{ - private $throwExceptions; - - public function __construct(bool $throwExceptions = true) - { - $this->throwExceptions = $throwExceptions; - } - - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if (!$value instanceof Definition) { - return parent::processValue($value, $isRoot); - } - - $i = 0; - foreach ($value->getArguments() as $k => $v) { - if ($k !== $i++) { - if (!\is_int($k)) { - $msg = sprintf('Invalid constructor argument for service "%s": integer expected but found string "%s". Check your service definition.', $this->currentId, $k); - $value->addError($msg); - if ($this->throwExceptions) { - throw new RuntimeException($msg); - } - - break; - } - - $msg = sprintf('Invalid constructor argument %d for service "%s": argument %d must be defined before. Check your service definition.', 1 + $k, $this->currentId, $i); - $value->addError($msg); - if ($this->throwExceptions) { - throw new RuntimeException($msg); - } - } - } - - foreach ($value->getMethodCalls() as $methodCall) { - $i = 0; - foreach ($methodCall[1] as $k => $v) { - if ($k !== $i++) { - if (!\is_int($k)) { - $msg = sprintf('Invalid argument for method call "%s" of service "%s": integer expected but found string "%s". Check your service definition.', $methodCall[0], $this->currentId, $k); - $value->addError($msg); - if ($this->throwExceptions) { - throw new RuntimeException($msg); - } - - break; - } - - $msg = sprintf('Invalid argument %d for method call "%s" of service "%s": argument %d must be defined before. Check your service definition.', 1 + $k, $methodCall[0], $this->currentId, $i); - $value->addError($msg); - if ($this->throwExceptions) { - throw new RuntimeException($msg); - } - } - } - } - - return null; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php b/vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php deleted file mode 100644 index 55d911c..0000000 --- a/vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; - -/** - * Checks your services for circular references. - * - * References from method calls are ignored since we might be able to resolve - * these references depending on the order in which services are called. - * - * Circular reference from method calls will only be detected at run-time. - * - * @author Johannes M. Schmitt - */ -class CheckCircularReferencesPass implements CompilerPassInterface -{ - private $currentPath; - private $checkedNodes; - - /** - * Checks the ContainerBuilder object for circular references. - */ - public function process(ContainerBuilder $container) - { - $graph = $container->getCompiler()->getServiceReferenceGraph(); - - $this->checkedNodes = []; - foreach ($graph->getNodes() as $id => $node) { - $this->currentPath = [$id]; - - $this->checkOutEdges($node->getOutEdges()); - } - } - - /** - * Checks for circular references. - * - * @param ServiceReferenceGraphEdge[] $edges An array of Edges - * - * @throws ServiceCircularReferenceException when a circular reference is found - */ - private function checkOutEdges(array $edges) - { - foreach ($edges as $edge) { - $node = $edge->getDestNode(); - $id = $node->getId(); - - if (empty($this->checkedNodes[$id])) { - // Don't check circular references for lazy edges - if (!$node->getValue() || (!$edge->isLazy() && !$edge->isWeak())) { - $searchKey = array_search($id, $this->currentPath); - $this->currentPath[] = $id; - - if (false !== $searchKey) { - throw new ServiceCircularReferenceException($id, \array_slice($this->currentPath, $searchKey)); - } - - $this->checkOutEdges($node->getOutEdges()); - } - - $this->checkedNodes[$id] = true; - array_pop($this->currentPath); - } - } - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php b/vendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php deleted file mode 100644 index bb87f47..0000000 --- a/vendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\EnvParameterException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Loader\FileLoader; - -/** - * This pass validates each definition individually only taking the information - * into account which is contained in the definition itself. - * - * Later passes can rely on the following, and specifically do not need to - * perform these checks themselves: - * - * - non synthetic, non abstract services always have a class set - * - synthetic services are always public - * - * @author Johannes M. Schmitt - */ -class CheckDefinitionValidityPass implements CompilerPassInterface -{ - /** - * Processes the ContainerBuilder to validate the Definition. - * - * @throws RuntimeException When the Definition is invalid - */ - public function process(ContainerBuilder $container) - { - foreach ($container->getDefinitions() as $id => $definition) { - // synthetic service is public - if ($definition->isSynthetic() && !$definition->isPublic()) { - throw new RuntimeException(sprintf('A synthetic service ("%s") must be public.', $id)); - } - - // non-synthetic, non-abstract service has class - if (!$definition->isAbstract() && !$definition->isSynthetic() && !$definition->getClass() && (!$definition->getFactory() || !preg_match(FileLoader::ANONYMOUS_ID_REGEXP, $id))) { - if ($definition->getFactory()) { - throw new RuntimeException(sprintf('Please add the class to service "%s" even if it is constructed by a factory since we might need to add method calls based on compile-time checks.', $id)); - } - if (class_exists($id) || interface_exists($id, false)) { - if (0 === strpos($id, '\\') && 1 < substr_count($id, '\\')) { - throw new RuntimeException(sprintf('The definition for "%s" has no class attribute, and appears to reference a class or interface. Please specify the class attribute explicitly or remove the leading backslash by renaming the service to "%s" to get rid of this error.', $id, substr($id, 1))); - } - - throw new RuntimeException(sprintf('The definition for "%s" has no class attribute, and appears to reference a class or interface in the global namespace. Leaving out the "class" attribute is only allowed for namespaced classes. Please specify the class attribute explicitly to get rid of this error.', $id)); - } - - throw new RuntimeException(sprintf('The definition for "%s" has no class. If you intend to inject this service dynamically at runtime, please mark it as synthetic=true. If this is an abstract definition solely used by child definitions, please add abstract=true, otherwise specify a class to get rid of this error.', $id)); - } - - // tag attribute values must be scalars - foreach ($definition->getTags() as $name => $tags) { - foreach ($tags as $attributes) { - foreach ($attributes as $attribute => $value) { - if (!is_scalar($value) && null !== $value) { - throw new RuntimeException(sprintf('A "tags" attribute must be of a scalar-type for service "%s", tag "%s", attribute "%s".', $id, $name, $attribute)); - } - } - } - } - - if ($definition->isPublic() && !$definition->isPrivate()) { - $resolvedId = $container->resolveEnvPlaceholders($id, null, $usedEnvs); - if (null !== $usedEnvs) { - throw new EnvParameterException([$resolvedId], null, 'A service name ("%s") cannot contain dynamic values.'); - } - } - } - - foreach ($container->getAliases() as $id => $alias) { - if ($alias->isPublic() && !$alias->isPrivate()) { - $resolvedId = $container->resolveEnvPlaceholders($id, null, $usedEnvs); - if (null !== $usedEnvs) { - throw new EnvParameterException([$resolvedId], null, 'An alias name ("%s") cannot contain dynamic values.'); - } - } - } - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php b/vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php deleted file mode 100644 index 4ffe354..0000000 --- a/vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Checks that all references are pointing to a valid service. - * - * @author Johannes M. Schmitt - */ -class CheckExceptionOnInvalidReferenceBehaviorPass extends AbstractRecursivePass -{ - private $serviceLocatorContextIds = []; - - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - $this->serviceLocatorContextIds = []; - foreach ($container->findTaggedServiceIds('container.service_locator_context') as $id => $tags) { - $this->serviceLocatorContextIds[$id] = $tags[0]['id']; - $container->getDefinition($id)->clearTag('container.service_locator_context'); - } - - try { - return parent::process($container); - } finally { - $this->serviceLocatorContextIds = []; - } - } - - protected function processValue($value, bool $isRoot = false) - { - if (!$value instanceof Reference) { - return parent::processValue($value, $isRoot); - } - if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE < $value->getInvalidBehavior() || $this->container->has($id = (string) $value)) { - return $value; - } - - $currentId = $this->currentId; - $graph = $this->container->getCompiler()->getServiceReferenceGraph(); - - if (isset($this->serviceLocatorContextIds[$currentId])) { - $currentId = $this->serviceLocatorContextIds[$currentId]; - $locator = $this->container->getDefinition($this->currentId)->getFactory()[0]; - - foreach ($locator->getArgument(0) as $k => $v) { - if ($v->getValues()[0] === $value) { - if ($k !== $id) { - $currentId = $k.'" in the container provided to "'.$currentId; - } - throw new ServiceNotFoundException($id, $currentId); - } - } - } - - if ('.' === $currentId[0] && $graph->hasNode($currentId)) { - foreach ($graph->getNode($currentId)->getInEdges() as $edge) { - if (!$edge->getValue() instanceof Reference || ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE < $edge->getValue()->getInvalidBehavior()) { - continue; - } - $sourceId = $edge->getSourceNode()->getId(); - - if ('.' !== $sourceId[0]) { - $currentId = $sourceId; - break; - } - } - } - - throw new ServiceNotFoundException($id, $currentId); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php b/vendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php deleted file mode 100644 index 0349ef7..0000000 --- a/vendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Checks the validity of references. - * - * The following checks are performed by this pass: - * - target definitions are not abstract - * - * @author Johannes M. Schmitt - */ -class CheckReferenceValidityPass extends AbstractRecursivePass -{ - protected function processValue($value, bool $isRoot = false) - { - if ($isRoot && $value instanceof Definition && ($value->isSynthetic() || $value->isAbstract())) { - return $value; - } - if ($value instanceof Reference && $this->container->hasDefinition((string) $value)) { - $targetDefinition = $this->container->getDefinition((string) $value); - - if ($targetDefinition->isAbstract()) { - throw new RuntimeException(sprintf('The definition "%s" has a reference to an abstract definition "%s". Abstract definitions cannot be the target of references.', $this->currentId, $value)); - } - } - - return parent::processValue($value, $isRoot); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php b/vendor/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php deleted file mode 100644 index f4974cc..0000000 --- a/vendor/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php +++ /dev/null @@ -1,301 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Argument\IteratorArgument; -use Symfony\Component\DependencyInjection\Argument\RewindableGenerator; -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; -use Symfony\Component\DependencyInjection\Container; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\InvalidParameterTypeException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\ExpressionLanguage; -use Symfony\Component\DependencyInjection\Parameter; -use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\DependencyInjection\ServiceLocator; -use Symfony\Component\ExpressionLanguage\Expression; - -/** - * Checks whether injected parameters are compatible with type declarations. - * - * This pass should be run after all optimization passes. - * - * It can be added either: - * * before removing passes to check all services even if they are not currently used, - * * after removing passes to check only services are used in the app. - * - * @author Nicolas Grekas - * @author Julien Maulny - */ -final class CheckTypeDeclarationsPass extends AbstractRecursivePass -{ - private const SCALAR_TYPES = [ - 'int' => true, - 'float' => true, - 'bool' => true, - 'string' => true, - ]; - - private const BUILTIN_TYPES = [ - 'array' => true, - 'bool' => true, - 'callable' => true, - 'float' => true, - 'int' => true, - 'iterable' => true, - 'object' => true, - 'string' => true, - ]; - - private $autoload; - private $skippedIds; - - private $expressionLanguage; - - /** - * @param bool $autoload Whether services who's class in not loaded should be checked or not. - * Defaults to false to save loading code during compilation. - * @param array $skippedIds An array indexed by the service ids to skip - */ - public function __construct(bool $autoload = false, array $skippedIds = []) - { - $this->autoload = $autoload; - $this->skippedIds = $skippedIds; - } - - /** - * {@inheritdoc} - */ - protected function processValue($value, $isRoot = false) - { - if (isset($this->skippedIds[$this->currentId])) { - return $value; - } - - if (!$value instanceof Definition || $value->hasErrors()) { - return parent::processValue($value, $isRoot); - } - - if (!$this->autoload && !class_exists($class = $value->getClass(), false) && !interface_exists($class, false)) { - return parent::processValue($value, $isRoot); - } - - if (ServiceLocator::class === $value->getClass()) { - return parent::processValue($value, $isRoot); - } - - if ($constructor = $this->getConstructor($value, false)) { - $this->checkTypeDeclarations($value, $constructor, $value->getArguments()); - } - - foreach ($value->getMethodCalls() as $methodCall) { - try { - $reflectionMethod = $this->getReflectionMethod($value, $methodCall[0]); - } catch (RuntimeException $e) { - if ($value->getFactory()) { - continue; - } - - throw $e; - } - - $this->checkTypeDeclarations($value, $reflectionMethod, $methodCall[1]); - } - - return parent::processValue($value, $isRoot); - } - - /** - * @throws InvalidArgumentException When not enough parameters are defined for the method - */ - private function checkTypeDeclarations(Definition $checkedDefinition, \ReflectionFunctionAbstract $reflectionFunction, array $values): void - { - $numberOfRequiredParameters = $reflectionFunction->getNumberOfRequiredParameters(); - - if (\count($values) < $numberOfRequiredParameters) { - throw new InvalidArgumentException(sprintf('Invalid definition for service "%s": "%s::%s()" requires %d arguments, %d passed.', $this->currentId, $reflectionFunction->class, $reflectionFunction->name, $numberOfRequiredParameters, \count($values))); - } - - $reflectionParameters = $reflectionFunction->getParameters(); - $checksCount = min($reflectionFunction->getNumberOfParameters(), \count($values)); - - $envPlaceholderUniquePrefix = $this->container->getParameterBag() instanceof EnvPlaceholderParameterBag ? $this->container->getParameterBag()->getEnvPlaceholderUniquePrefix() : null; - - for ($i = 0; $i < $checksCount; ++$i) { - if (!$reflectionParameters[$i]->hasType() || $reflectionParameters[$i]->isVariadic()) { - continue; - } - - $this->checkType($checkedDefinition, $values[$i], $reflectionParameters[$i], $envPlaceholderUniquePrefix); - } - - if ($reflectionFunction->isVariadic() && ($lastParameter = end($reflectionParameters))->hasType()) { - $variadicParameters = \array_slice($values, $lastParameter->getPosition()); - - foreach ($variadicParameters as $variadicParameter) { - $this->checkType($checkedDefinition, $variadicParameter, $lastParameter, $envPlaceholderUniquePrefix); - } - } - } - - /** - * @throws InvalidParameterTypeException When a parameter is not compatible with the declared type - */ - private function checkType(Definition $checkedDefinition, $value, \ReflectionParameter $parameter, ?string $envPlaceholderUniquePrefix, string $type = null): void - { - if (null === $type) { - $type = $parameter->getType(); - - if ($type instanceof \ReflectionUnionType) { - foreach ($type->getTypes() as $type) { - try { - $this->checkType($checkedDefinition, $value, $parameter, $envPlaceholderUniquePrefix, $type); - - return; - } catch (InvalidParameterTypeException $e) { - } - } - - throw new InvalidParameterTypeException($this->currentId, $e->getCode(), $parameter); - } - - $type = $type->getName(); - } - - if ($value instanceof Reference) { - if (!$this->container->has($value = (string) $value)) { - return; - } - - if ('service_container' === $value && is_a($type, Container::class, true)) { - return; - } - - $value = $this->container->findDefinition($value); - } - - if ('self' === $type) { - $type = $parameter->getDeclaringClass()->getName(); - } - - if ('static' === $type) { - $type = $checkedDefinition->getClass(); - } - - $class = null; - - if ($value instanceof Definition) { - $class = $value->getClass(); - - if (isset(self::BUILTIN_TYPES[strtolower($class)])) { - $class = strtolower($class); - } elseif (!$class || (!$this->autoload && !class_exists($class, false) && !interface_exists($class, false))) { - return; - } - } elseif ($value instanceof Parameter) { - $value = $this->container->getParameter($value); - } elseif ($value instanceof Expression) { - try { - $value = $this->getExpressionLanguage()->evaluate($value, ['container' => $this->container]); - } catch (\Exception $e) { - // If a service from the expression cannot be fetched from the container, we skip the validation. - return; - } - } elseif (\is_string($value)) { - if ('%' === ($value[0] ?? '') && preg_match('/^%([^%]+)%$/', $value, $match)) { - $value = $this->container->getParameter(substr($value, 1, -1)); - } - - if ($envPlaceholderUniquePrefix && \is_string($value) && false !== strpos($value, 'env_')) { - // If the value is an env placeholder that is either mixed with a string or with another env placeholder, then its resolved value will always be a string, so we don't need to resolve it. - // We don't need to change the value because it is already a string. - if ('' === preg_replace('/'.$envPlaceholderUniquePrefix.'_\w+_[a-f0-9]{32}/U', '', $value, -1, $c) && 1 === $c) { - try { - $value = $this->container->resolveEnvPlaceholders($value, true); - } catch (\Exception $e) { - // If an env placeholder cannot be resolved, we skip the validation. - return; - } - } - } - } - - if (null === $value && $parameter->allowsNull()) { - return; - } - - if (null === $class) { - if ($value instanceof IteratorArgument) { - $class = RewindableGenerator::class; - } elseif ($value instanceof ServiceClosureArgument) { - $class = \Closure::class; - } elseif ($value instanceof ServiceLocatorArgument) { - $class = ServiceLocator::class; - } elseif (\is_object($value)) { - $class = \get_class($value); - } else { - $class = \gettype($value); - $class = ['integer' => 'int', 'double' => 'float', 'boolean' => 'bool'][$class] ?? $class; - } - } - - if (isset(self::SCALAR_TYPES[$type]) && isset(self::SCALAR_TYPES[$class])) { - return; - } - - if ('string' === $type && method_exists($class, '__toString')) { - return; - } - - if ('callable' === $type && (\Closure::class === $class || method_exists($class, '__invoke'))) { - return; - } - - if ('callable' === $type && \is_array($value) && isset($value[0]) && ($value[0] instanceof Reference || $value[0] instanceof Definition || \is_string($value[0]))) { - return; - } - - if ('iterable' === $type && (\is_array($value) || 'array' === $class || is_subclass_of($class, \Traversable::class))) { - return; - } - - if ($type === $class) { - return; - } - - if ('object' === $type && !isset(self::BUILTIN_TYPES[$class])) { - return; - } - - if (is_a($class, $type, true)) { - return; - } - - $checkFunction = sprintf('is_%s', $type); - - if (!$parameter->getType()->isBuiltin() || !$checkFunction($value)) { - throw new InvalidParameterTypeException($this->currentId, \is_object($value) ? $class : get_debug_type($value), $parameter); - } - } - - private function getExpressionLanguage(): ExpressionLanguage - { - if (null === $this->expressionLanguage) { - $this->expressionLanguage = new ExpressionLanguage(null, $this->container->getExpressionLanguageProviders()); - } - - return $this->expressionLanguage; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/Compiler.php b/vendor/symfony/dependency-injection/Compiler/Compiler.php deleted file mode 100644 index 04ae8d5..0000000 --- a/vendor/symfony/dependency-injection/Compiler/Compiler.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\EnvParameterException; - -/** - * This class is used to remove circular dependencies between individual passes. - * - * @author Johannes M. Schmitt - */ -class Compiler -{ - private $passConfig; - private $log = []; - private $serviceReferenceGraph; - - public function __construct() - { - $this->passConfig = new PassConfig(); - $this->serviceReferenceGraph = new ServiceReferenceGraph(); - } - - /** - * Returns the PassConfig. - * - * @return PassConfig The PassConfig instance - */ - public function getPassConfig() - { - return $this->passConfig; - } - - /** - * Returns the ServiceReferenceGraph. - * - * @return ServiceReferenceGraph The ServiceReferenceGraph instance - */ - public function getServiceReferenceGraph() - { - return $this->serviceReferenceGraph; - } - - /** - * Adds a pass to the PassConfig. - */ - public function addPass(CompilerPassInterface $pass, string $type = PassConfig::TYPE_BEFORE_OPTIMIZATION, int $priority = 0) - { - $this->passConfig->addPass($pass, $type, $priority); - } - - /** - * @final - */ - public function log(CompilerPassInterface $pass, string $message) - { - if (false !== strpos($message, "\n")) { - $message = str_replace("\n", "\n".\get_class($pass).': ', trim($message)); - } - - $this->log[] = \get_class($pass).': '.$message; - } - - /** - * Returns the log. - * - * @return array Log array - */ - public function getLog() - { - return $this->log; - } - - /** - * Run the Compiler and process all Passes. - */ - public function compile(ContainerBuilder $container) - { - try { - foreach ($this->passConfig->getPasses() as $pass) { - $pass->process($container); - } - } catch (\Exception $e) { - $usedEnvs = []; - $prev = $e; - - do { - $msg = $prev->getMessage(); - - if ($msg !== $resolvedMsg = $container->resolveEnvPlaceholders($msg, null, $usedEnvs)) { - $r = new \ReflectionProperty($prev, 'message'); - $r->setAccessible(true); - $r->setValue($prev, $resolvedMsg); - } - } while ($prev = $prev->getPrevious()); - - if ($usedEnvs) { - $e = new EnvParameterException($usedEnvs, $e); - } - - throw $e; - } finally { - $this->getServiceReferenceGraph()->clear(); - } - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/CompilerPassInterface.php b/vendor/symfony/dependency-injection/Compiler/CompilerPassInterface.php deleted file mode 100644 index 3085006..0000000 --- a/vendor/symfony/dependency-injection/Compiler/CompilerPassInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * Interface that must be implemented by compilation passes. - * - * @author Johannes M. Schmitt - */ -interface CompilerPassInterface -{ - /** - * You can modify the container here before it is dumped to PHP code. - */ - public function process(ContainerBuilder $container); -} diff --git a/vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php b/vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php deleted file mode 100644 index 55f87b0..0000000 --- a/vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php +++ /dev/null @@ -1,119 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Alias; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Overwrites a service but keeps the overridden one. - * - * @author Christophe Coevoet - * @author Fabien Potencier - * @author Diego Saint Esteben - */ -class DecoratorServicePass extends AbstractRecursivePass -{ - private $innerId = '.inner'; - - public function __construct(?string $innerId = '.inner') - { - $this->innerId = $innerId; - } - - public function process(ContainerBuilder $container) - { - $definitions = new \SplPriorityQueue(); - $order = PHP_INT_MAX; - - foreach ($container->getDefinitions() as $id => $definition) { - if (!$decorated = $definition->getDecoratedService()) { - continue; - } - $definitions->insert([$id, $definition], [$decorated[2], --$order]); - } - $decoratingDefinitions = []; - - foreach ($definitions as list($id, $definition)) { - $decoratedService = $definition->getDecoratedService(); - list($inner, $renamedId) = $decoratedService; - $invalidBehavior = $decoratedService[3] ?? ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; - - $definition->setDecoratedService(null); - - if (!$renamedId) { - $renamedId = $id.'.inner'; - } - - $this->currentId = $renamedId; - $this->processValue($definition); - - $definition->innerServiceId = $renamedId; - $definition->decorationOnInvalid = $invalidBehavior; - - // we create a new alias/service for the service we are replacing - // to be able to reference it in the new one - if ($container->hasAlias($inner)) { - $alias = $container->getAlias($inner); - $public = $alias->isPublic(); - $private = $alias->isPrivate(); - $container->setAlias($renamedId, new Alias((string) $alias, false)); - } elseif ($container->hasDefinition($inner)) { - $decoratedDefinition = $container->getDefinition($inner); - $public = $decoratedDefinition->isPublic(); - $private = $decoratedDefinition->isPrivate(); - $decoratedDefinition->setPublic(false); - $container->setDefinition($renamedId, $decoratedDefinition); - $decoratingDefinitions[$inner] = $decoratedDefinition; - } elseif (ContainerInterface::IGNORE_ON_INVALID_REFERENCE === $invalidBehavior) { - $container->removeDefinition($id); - continue; - } elseif (ContainerInterface::NULL_ON_INVALID_REFERENCE === $invalidBehavior) { - $public = $definition->isPublic(); - $private = $definition->isPrivate(); - } else { - throw new ServiceNotFoundException($inner, $id); - } - - if (isset($decoratingDefinitions[$inner])) { - $decoratingDefinition = $decoratingDefinitions[$inner]; - - $decoratingTags = $decoratingDefinition->getTags(); - $resetTags = []; - - if (isset($decoratingTags['container.service_locator'])) { - // container.service_locator has special logic and it must not be transferred out to decorators - $resetTags = ['container.service_locator' => $decoratingTags['container.service_locator']]; - unset($decoratingTags['container.service_locator']); - } - - $definition->setTags(array_merge($decoratingTags, $definition->getTags())); - $decoratingDefinition->setTags($resetTags); - $decoratingDefinitions[$inner] = $definition; - } - - $container->setAlias($inner, $id)->setPublic($public)->setPrivate($private); - } - } - - protected function processValue($value, bool $isRoot = false) - { - if ($value instanceof Reference && $this->innerId === (string) $value) { - return new Reference($this->currentId, $value->getInvalidBehavior()); - } - - return parent::processValue($value, $isRoot); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php b/vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php deleted file mode 100644 index 5e7ba31..0000000 --- a/vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Throws an exception for any Definitions that have errors and still exist. - * - * @author Ryan Weaver - */ -class DefinitionErrorExceptionPass extends AbstractRecursivePass -{ - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if (!$value instanceof Definition || !$value->hasErrors()) { - return parent::processValue($value, $isRoot); - } - - if ($isRoot && !$value->isPublic()) { - $graph = $this->container->getCompiler()->getServiceReferenceGraph(); - $runtimeException = false; - foreach ($graph->getNode($this->currentId)->getInEdges() as $edge) { - if (!$edge->getValue() instanceof Reference || ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE !== $edge->getValue()->getInvalidBehavior()) { - $runtimeException = false; - break; - } - $runtimeException = true; - } - if ($runtimeException) { - return parent::processValue($value, $isRoot); - } - } - - // only show the first error so the user can focus on it - $errors = $value->getErrors(); - $message = reset($errors); - - throw new RuntimeException($message); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php b/vendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php deleted file mode 100644 index 27e5048..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * A pass to automatically process extensions if they implement - * CompilerPassInterface. - * - * @author Wouter J - */ -class ExtensionCompilerPass implements CompilerPassInterface -{ - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - foreach ($container->getExtensions() as $extension) { - if (!$extension instanceof CompilerPassInterface) { - continue; - } - - $extension->process($container); - } - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php b/vendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php deleted file mode 100644 index 41af126..0000000 --- a/vendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php +++ /dev/null @@ -1,217 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Inline service definitions where this is possible. - * - * @author Johannes M. Schmitt - */ -class InlineServiceDefinitionsPass extends AbstractRecursivePass -{ - private $analyzingPass; - private $cloningIds = []; - private $connectedIds = []; - private $notInlinedIds = []; - private $inlinedIds = []; - private $graph; - - public function __construct(AnalyzeServiceReferencesPass $analyzingPass = null) - { - $this->analyzingPass = $analyzingPass; - } - - public function process(ContainerBuilder $container) - { - $this->container = $container; - if ($this->analyzingPass) { - $analyzedContainer = new ContainerBuilder(); - $analyzedContainer->setAliases($container->getAliases()); - $analyzedContainer->setDefinitions($container->getDefinitions()); - foreach ($container->getExpressionLanguageProviders() as $provider) { - $analyzedContainer->addExpressionLanguageProvider($provider); - } - } else { - $analyzedContainer = $container; - } - try { - $remainingInlinedIds = []; - $this->connectedIds = $this->notInlinedIds = $container->getDefinitions(); - do { - if ($this->analyzingPass) { - $analyzedContainer->setDefinitions(array_intersect_key($analyzedContainer->getDefinitions(), $this->connectedIds)); - $this->analyzingPass->process($analyzedContainer); - } - $this->graph = $analyzedContainer->getCompiler()->getServiceReferenceGraph(); - $notInlinedIds = $this->notInlinedIds; - $this->connectedIds = $this->notInlinedIds = $this->inlinedIds = []; - - foreach ($analyzedContainer->getDefinitions() as $id => $definition) { - if (!$this->graph->hasNode($id)) { - continue; - } - foreach ($this->graph->getNode($id)->getOutEdges() as $edge) { - if (isset($notInlinedIds[$edge->getSourceNode()->getId()])) { - $this->currentId = $id; - $this->processValue($definition, true); - break; - } - } - } - - foreach ($this->inlinedIds as $id => $isPublicOrNotShared) { - if ($isPublicOrNotShared) { - $remainingInlinedIds[$id] = $id; - } else { - $container->removeDefinition($id); - $analyzedContainer->removeDefinition($id); - } - } - } while ($this->inlinedIds && $this->analyzingPass); - - foreach ($remainingInlinedIds as $id) { - $definition = $container->getDefinition($id); - - if (!$definition->isShared() && !$definition->isPublic()) { - $container->removeDefinition($id); - } - } - } finally { - $this->container = null; - $this->connectedIds = $this->notInlinedIds = $this->inlinedIds = []; - $this->graph = null; - } - } - - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if ($value instanceof ArgumentInterface) { - // Reference found in ArgumentInterface::getValues() are not inlineable - return $value; - } - - if ($value instanceof Definition && $this->cloningIds) { - if ($value->isShared()) { - return $value; - } - $value = clone $value; - } - - if (!$value instanceof Reference) { - return parent::processValue($value, $isRoot); - } elseif (!$this->container->hasDefinition($id = (string) $value)) { - return $value; - } - - $definition = $this->container->getDefinition($id); - - if (!$this->isInlineableDefinition($id, $definition)) { - return $value; - } - - $this->container->log($this, sprintf('Inlined service "%s" to "%s".', $id, $this->currentId)); - $this->inlinedIds[$id] = $definition->isPublic() || !$definition->isShared(); - $this->notInlinedIds[$this->currentId] = true; - - if ($definition->isShared()) { - return $definition; - } - - if (isset($this->cloningIds[$id])) { - $ids = array_keys($this->cloningIds); - $ids[] = $id; - - throw new ServiceCircularReferenceException($id, \array_slice($ids, array_search($id, $ids))); - } - - $this->cloningIds[$id] = true; - try { - return $this->processValue($definition); - } finally { - unset($this->cloningIds[$id]); - } - } - - /** - * Checks if the definition is inlineable. - */ - private function isInlineableDefinition(string $id, Definition $definition): bool - { - if ($definition->hasErrors() || $definition->isDeprecated() || $definition->isLazy() || $definition->isSynthetic()) { - return false; - } - - if (!$definition->isShared()) { - if (!$this->graph->hasNode($id)) { - return true; - } - - foreach ($this->graph->getNode($id)->getInEdges() as $edge) { - $srcId = $edge->getSourceNode()->getId(); - $this->connectedIds[$srcId] = true; - if ($edge->isWeak() || $edge->isLazy()) { - return false; - } - } - - return true; - } - - if ($definition->isPublic()) { - return false; - } - - if (!$this->graph->hasNode($id)) { - return true; - } - - if ($this->currentId == $id) { - return false; - } - $this->connectedIds[$id] = true; - - $srcIds = []; - $srcCount = 0; - $isReferencedByConstructor = false; - foreach ($this->graph->getNode($id)->getInEdges() as $edge) { - $isReferencedByConstructor = $isReferencedByConstructor || $edge->isReferencedByConstructor(); - $srcId = $edge->getSourceNode()->getId(); - $this->connectedIds[$srcId] = true; - if ($edge->isWeak() || $edge->isLazy()) { - return false; - } - $srcIds[$srcId] = true; - ++$srcCount; - } - - if (1 !== \count($srcIds)) { - $this->notInlinedIds[$id] = true; - - return false; - } - - if ($srcCount > 1 && \is_array($factory = $definition->getFactory()) && ($factory[0] instanceof Reference || $factory[0] instanceof Definition)) { - return false; - } - - return $this->container->getDefinition($srcId)->isShared(); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php b/vendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php deleted file mode 100644 index 2cc9ed9..0000000 --- a/vendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php +++ /dev/null @@ -1,224 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\Config\Definition\BaseNode; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\LogicException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface; -use Symfony\Component\DependencyInjection\Extension\Extension; -use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; -use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; -use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; - -/** - * Merges extension configs into the container builder. - * - * @author Fabien Potencier - */ -class MergeExtensionConfigurationPass implements CompilerPassInterface -{ - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - $parameters = $container->getParameterBag()->all(); - $definitions = $container->getDefinitions(); - $aliases = $container->getAliases(); - $exprLangProviders = $container->getExpressionLanguageProviders(); - $configAvailable = class_exists(BaseNode::class); - - foreach ($container->getExtensions() as $extension) { - if ($extension instanceof PrependExtensionInterface) { - $extension->prepend($container); - } - } - - foreach ($container->getExtensions() as $name => $extension) { - if (!$config = $container->getExtensionConfig($name)) { - // this extension was not called - continue; - } - $resolvingBag = $container->getParameterBag(); - if ($resolvingBag instanceof EnvPlaceholderParameterBag && $extension instanceof Extension) { - // create a dedicated bag so that we can track env vars per-extension - $resolvingBag = new MergeExtensionConfigurationParameterBag($resolvingBag); - if ($configAvailable) { - BaseNode::setPlaceholderUniquePrefix($resolvingBag->getEnvPlaceholderUniquePrefix()); - } - } - $config = $resolvingBag->resolveValue($config); - - try { - $tmpContainer = new MergeExtensionConfigurationContainerBuilder($extension, $resolvingBag); - $tmpContainer->setResourceTracking($container->isTrackingResources()); - $tmpContainer->addObjectResource($extension); - if ($extension instanceof ConfigurationExtensionInterface && null !== $configuration = $extension->getConfiguration($config, $tmpContainer)) { - $tmpContainer->addObjectResource($configuration); - } - - foreach ($exprLangProviders as $provider) { - $tmpContainer->addExpressionLanguageProvider($provider); - } - - $extension->load($config, $tmpContainer); - } catch (\Exception $e) { - if ($resolvingBag instanceof MergeExtensionConfigurationParameterBag) { - $container->getParameterBag()->mergeEnvPlaceholders($resolvingBag); - } - - if ($configAvailable) { - BaseNode::resetPlaceholders(); - } - - throw $e; - } - - if ($resolvingBag instanceof MergeExtensionConfigurationParameterBag) { - // don't keep track of env vars that are *overridden* when configs are merged - $resolvingBag->freezeAfterProcessing($extension, $tmpContainer); - } - - $container->merge($tmpContainer); - $container->getParameterBag()->add($parameters); - } - - if ($configAvailable) { - BaseNode::resetPlaceholders(); - } - - $container->addDefinitions($definitions); - $container->addAliases($aliases); - } -} - -/** - * @internal - */ -class MergeExtensionConfigurationParameterBag extends EnvPlaceholderParameterBag -{ - private $processedEnvPlaceholders; - - public function __construct(parent $parameterBag) - { - parent::__construct($parameterBag->all()); - $this->mergeEnvPlaceholders($parameterBag); - } - - public function freezeAfterProcessing(Extension $extension, ContainerBuilder $container) - { - if (!$config = $extension->getProcessedConfigs()) { - // Extension::processConfiguration() wasn't called, we cannot know how configs were merged - return; - } - $this->processedEnvPlaceholders = []; - - // serialize config and container to catch env vars nested in object graphs - $config = serialize($config).serialize($container->getDefinitions()).serialize($container->getAliases()).serialize($container->getParameterBag()->all()); - - foreach (parent::getEnvPlaceholders() as $env => $placeholders) { - foreach ($placeholders as $placeholder) { - if (false !== stripos($config, $placeholder)) { - $this->processedEnvPlaceholders[$env] = $placeholders; - break; - } - } - } - } - - /** - * {@inheritdoc} - */ - public function getEnvPlaceholders(): array - { - return null !== $this->processedEnvPlaceholders ? $this->processedEnvPlaceholders : parent::getEnvPlaceholders(); - } - - public function getUnusedEnvPlaceholders(): array - { - return null === $this->processedEnvPlaceholders ? [] : array_diff_key(parent::getEnvPlaceholders(), $this->processedEnvPlaceholders); - } -} - -/** - * A container builder preventing using methods that wouldn't have any effect from extensions. - * - * @internal - */ -class MergeExtensionConfigurationContainerBuilder extends ContainerBuilder -{ - private $extensionClass; - - public function __construct(ExtensionInterface $extension, ParameterBagInterface $parameterBag = null) - { - parent::__construct($parameterBag); - - $this->extensionClass = \get_class($extension); - } - - /** - * {@inheritdoc} - */ - public function addCompilerPass(CompilerPassInterface $pass, string $type = PassConfig::TYPE_BEFORE_OPTIMIZATION, int $priority = 0): self - { - throw new LogicException(sprintf('You cannot add compiler pass "%s" from extension "%s". Compiler passes must be registered before the container is compiled.', get_debug_type($pass), $this->extensionClass)); - } - - /** - * {@inheritdoc} - */ - public function registerExtension(ExtensionInterface $extension) - { - throw new LogicException(sprintf('You cannot register extension "%s" from "%s". Extensions must be registered before the container is compiled.', get_debug_type($extension), $this->extensionClass)); - } - - /** - * {@inheritdoc} - */ - public function compile(bool $resolveEnvPlaceholders = false) - { - throw new LogicException(sprintf('Cannot compile the container in extension "%s".', $this->extensionClass)); - } - - /** - * {@inheritdoc} - */ - public function resolveEnvPlaceholders($value, $format = null, array &$usedEnvs = null) - { - if (true !== $format || !\is_string($value)) { - return parent::resolveEnvPlaceholders($value, $format, $usedEnvs); - } - - $bag = $this->getParameterBag(); - $value = $bag->resolveValue($value); - - if (!$bag instanceof EnvPlaceholderParameterBag) { - return parent::resolveEnvPlaceholders($value, $format, $usedEnvs); - } - - foreach ($bag->getEnvPlaceholders() as $env => $placeholders) { - if (false === strpos($env, ':')) { - continue; - } - foreach ($placeholders as $placeholder) { - if (false !== stripos($value, $placeholder)) { - throw new RuntimeException(sprintf('Using a cast in "env(%s)" is incompatible with resolution at compile time in "%s". The logic in the extension should be moved to a compiler pass, or an env parameter with no cast should be used instead.', $env, $this->extensionClass)); - } - } - } - - return parent::resolveEnvPlaceholders($value, $format, $usedEnvs); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/PassConfig.php b/vendor/symfony/dependency-injection/Compiler/PassConfig.php deleted file mode 100644 index 245c3b5..0000000 --- a/vendor/symfony/dependency-injection/Compiler/PassConfig.php +++ /dev/null @@ -1,271 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -/** - * Compiler Pass Configuration. - * - * This class has a default configuration embedded. - * - * @author Johannes M. Schmitt - */ -class PassConfig -{ - const TYPE_AFTER_REMOVING = 'afterRemoving'; - const TYPE_BEFORE_OPTIMIZATION = 'beforeOptimization'; - const TYPE_BEFORE_REMOVING = 'beforeRemoving'; - const TYPE_OPTIMIZE = 'optimization'; - const TYPE_REMOVE = 'removing'; - - private $mergePass; - private $afterRemovingPasses = []; - private $beforeOptimizationPasses = []; - private $beforeRemovingPasses = []; - private $optimizationPasses; - private $removingPasses; - - public function __construct() - { - $this->mergePass = new MergeExtensionConfigurationPass(); - - $this->beforeOptimizationPasses = [ - 100 => [ - new ResolveClassPass(), - new ResolveInstanceofConditionalsPass(), - new RegisterEnvVarProcessorsPass(), - ], - -1000 => [new ExtensionCompilerPass()], - ]; - - $this->optimizationPasses = [[ - new AutoAliasServicePass(), - new ValidateEnvPlaceholdersPass(), - new ResolveDecoratorStackPass(), - new ResolveChildDefinitionsPass(), - new RegisterServiceSubscribersPass(), - new ResolveParameterPlaceHoldersPass(false, false), - new ResolveFactoryClassPass(), - new ResolveNamedArgumentsPass(), - new AutowireRequiredMethodsPass(), - new AutowireRequiredPropertiesPass(), - new ResolveBindingsPass(), - new ServiceLocatorTagPass(), - new DecoratorServicePass(), - new CheckDefinitionValidityPass(), - new AutowirePass(false), - new ResolveTaggedIteratorArgumentPass(), - new ResolveServiceSubscribersPass(), - new ResolveReferencesToAliasesPass(), - new ResolveInvalidReferencesPass(), - new AnalyzeServiceReferencesPass(true), - new CheckCircularReferencesPass(), - new CheckReferenceValidityPass(), - new CheckArgumentsValidityPass(false), - ]]; - - $this->beforeRemovingPasses = [ - -100 => [ - new ResolvePrivatesPass(), - ], - ]; - - $this->removingPasses = [[ - new RemovePrivateAliasesPass(), - new ReplaceAliasByActualDefinitionPass(), - new RemoveAbstractDefinitionsPass(), - new RemoveUnusedDefinitionsPass(), - new InlineServiceDefinitionsPass(new AnalyzeServiceReferencesPass()), - new AnalyzeServiceReferencesPass(), - new DefinitionErrorExceptionPass(), - ]]; - - $this->afterRemovingPasses = [[ - new CheckExceptionOnInvalidReferenceBehaviorPass(), - new ResolveHotPathPass(), - new ResolveNoPreloadPass(), - new AliasDeprecatedPublicServicesPass(), - ]]; - } - - /** - * Returns all passes in order to be processed. - * - * @return CompilerPassInterface[] - */ - public function getPasses() - { - return array_merge( - [$this->mergePass], - $this->getBeforeOptimizationPasses(), - $this->getOptimizationPasses(), - $this->getBeforeRemovingPasses(), - $this->getRemovingPasses(), - $this->getAfterRemovingPasses() - ); - } - - /** - * Adds a pass. - * - * @throws InvalidArgumentException when a pass type doesn't exist - */ - public function addPass(CompilerPassInterface $pass, string $type = self::TYPE_BEFORE_OPTIMIZATION, int $priority = 0) - { - $property = $type.'Passes'; - if (!isset($this->$property)) { - throw new InvalidArgumentException(sprintf('Invalid type "%s".', $type)); - } - - $passes = &$this->$property; - - if (!isset($passes[$priority])) { - $passes[$priority] = []; - } - $passes[$priority][] = $pass; - } - - /** - * Gets all passes for the AfterRemoving pass. - * - * @return CompilerPassInterface[] - */ - public function getAfterRemovingPasses() - { - return $this->sortPasses($this->afterRemovingPasses); - } - - /** - * Gets all passes for the BeforeOptimization pass. - * - * @return CompilerPassInterface[] - */ - public function getBeforeOptimizationPasses() - { - return $this->sortPasses($this->beforeOptimizationPasses); - } - - /** - * Gets all passes for the BeforeRemoving pass. - * - * @return CompilerPassInterface[] - */ - public function getBeforeRemovingPasses() - { - return $this->sortPasses($this->beforeRemovingPasses); - } - - /** - * Gets all passes for the Optimization pass. - * - * @return CompilerPassInterface[] - */ - public function getOptimizationPasses() - { - return $this->sortPasses($this->optimizationPasses); - } - - /** - * Gets all passes for the Removing pass. - * - * @return CompilerPassInterface[] - */ - public function getRemovingPasses() - { - return $this->sortPasses($this->removingPasses); - } - - /** - * Gets the Merge pass. - * - * @return CompilerPassInterface - */ - public function getMergePass() - { - return $this->mergePass; - } - - public function setMergePass(CompilerPassInterface $pass) - { - $this->mergePass = $pass; - } - - /** - * Sets the AfterRemoving passes. - * - * @param CompilerPassInterface[] $passes - */ - public function setAfterRemovingPasses(array $passes) - { - $this->afterRemovingPasses = [$passes]; - } - - /** - * Sets the BeforeOptimization passes. - * - * @param CompilerPassInterface[] $passes - */ - public function setBeforeOptimizationPasses(array $passes) - { - $this->beforeOptimizationPasses = [$passes]; - } - - /** - * Sets the BeforeRemoving passes. - * - * @param CompilerPassInterface[] $passes - */ - public function setBeforeRemovingPasses(array $passes) - { - $this->beforeRemovingPasses = [$passes]; - } - - /** - * Sets the Optimization passes. - * - * @param CompilerPassInterface[] $passes - */ - public function setOptimizationPasses(array $passes) - { - $this->optimizationPasses = [$passes]; - } - - /** - * Sets the Removing passes. - * - * @param CompilerPassInterface[] $passes - */ - public function setRemovingPasses(array $passes) - { - $this->removingPasses = [$passes]; - } - - /** - * Sort passes by priority. - * - * @param array $passes CompilerPassInterface instances with their priority as key - * - * @return CompilerPassInterface[] - */ - private function sortPasses(array $passes): array - { - if (0 === \count($passes)) { - return []; - } - - krsort($passes); - - // Flatten the array - return array_merge(...$passes); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php b/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php deleted file mode 100644 index 44ceaba..0000000 --- a/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php +++ /dev/null @@ -1,167 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\DependencyInjection\TypedReference; - -/** - * Trait that allows a generic method to find and sort service by priority option in the tag. - * - * @author Iltar van der Berg - */ -trait PriorityTaggedServiceTrait -{ - /** - * Finds all services with the given tag name and order them by their priority. - * - * The order of additions must be respected for services having the same priority, - * and knowing that the \SplPriorityQueue class does not respect the FIFO method, - * we should not use that class. - * - * @see https://bugs.php.net/53710 - * @see https://bugs.php.net/60926 - * - * @param string|TaggedIteratorArgument $tagName - * - * @return Reference[] - */ - private function findAndSortTaggedServices($tagName, ContainerBuilder $container): array - { - $indexAttribute = $defaultIndexMethod = $needsIndexes = $defaultPriorityMethod = null; - - if ($tagName instanceof TaggedIteratorArgument) { - $indexAttribute = $tagName->getIndexAttribute(); - $defaultIndexMethod = $tagName->getDefaultIndexMethod(); - $needsIndexes = $tagName->needsIndexes(); - $defaultPriorityMethod = $tagName->getDefaultPriorityMethod(); - $tagName = $tagName->getTag(); - } - - $i = 0; - $services = []; - - foreach ($container->findTaggedServiceIds($tagName, true) as $serviceId => $attributes) { - $defaultPriority = null; - $defaultIndex = null; - $class = $container->getDefinition($serviceId)->getClass(); - $class = $container->getParameterBag()->resolveValue($class) ?: null; - - foreach ($attributes as $attribute) { - $index = $priority = null; - - if (isset($attribute['priority'])) { - $priority = $attribute['priority']; - } elseif (null === $defaultPriority && $defaultPriorityMethod && $class) { - $defaultPriority = PriorityTaggedServiceUtil::getDefaultPriority($container, $serviceId, $class, $defaultPriorityMethod, $tagName); - } - $priority = $priority ?? $defaultPriority ?? $defaultPriority = 0; - - if (null === $indexAttribute && !$needsIndexes) { - $services[] = [$priority, ++$i, null, $serviceId, null]; - continue 2; - } - - if (null !== $indexAttribute && isset($attribute[$indexAttribute])) { - $index = $attribute[$indexAttribute]; - } elseif (null === $defaultIndex && $defaultIndexMethod && $class) { - $defaultIndex = PriorityTaggedServiceUtil::getDefaultIndex($container, $serviceId, $class, $defaultIndexMethod, $tagName, $indexAttribute); - } - $index = $index ?? $defaultIndex ?? $defaultIndex = $serviceId; - - $services[] = [$priority, ++$i, $index, $serviceId, $class]; - } - } - - uasort($services, static function ($a, $b) { return $b[0] <=> $a[0] ?: $a[1] <=> $b[1]; }); - - $refs = []; - foreach ($services as [, , $index, $serviceId, $class]) { - if (!$class) { - $reference = new Reference($serviceId); - } elseif ($index === $serviceId) { - $reference = new TypedReference($serviceId, $class); - } else { - $reference = new TypedReference($serviceId, $class, ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE, $index); - } - - if (null === $index) { - $refs[] = $reference; - } else { - $refs[$index] = $reference; - } - } - - return $refs; - } -} - -/** - * @internal - */ -class PriorityTaggedServiceUtil -{ - /** - * Gets the index defined by the default index method. - */ - public static function getDefaultIndex(ContainerBuilder $container, string $serviceId, string $class, string $defaultIndexMethod, string $tagName, string $indexAttribute): ?string - { - if (!($r = $container->getReflectionClass($class)) || !$r->hasMethod($defaultIndexMethod)) { - return null; - } - - if (!($rm = $r->getMethod($defaultIndexMethod))->isStatic()) { - throw new InvalidArgumentException(sprintf('Either method "%s::%s()" should be static or tag "%s" on service "%s" is missing attribute "%s".', $class, $defaultIndexMethod, $tagName, $serviceId, $indexAttribute)); - } - - if (!$rm->isPublic()) { - throw new InvalidArgumentException(sprintf('Either method "%s::%s()" should be public or tag "%s" on service "%s" is missing attribute "%s".', $class, $defaultIndexMethod, $tagName, $serviceId, $indexAttribute)); - } - - $defaultIndex = $rm->invoke(null); - - if (!\is_string($defaultIndex)) { - throw new InvalidArgumentException(sprintf('Either method "%s::%s()" should return a string (got "%s") or tag "%s" on service "%s" is missing attribute "%s".', $class, $defaultIndexMethod, get_debug_type($defaultIndex), $tagName, $serviceId, $indexAttribute)); - } - - return $defaultIndex; - } - - /** - * Gets the priority defined by the default priority method. - */ - public static function getDefaultPriority(ContainerBuilder $container, string $serviceId, string $class, string $defaultPriorityMethod, string $tagName): ?int - { - if (!($r = $container->getReflectionClass($class)) || !$r->hasMethod($defaultPriorityMethod)) { - return null; - } - - if (!($rm = $r->getMethod($defaultPriorityMethod))->isStatic()) { - throw new InvalidArgumentException(sprintf('Either method "%s::%s()" should be static or tag "%s" on service "%s" is missing attribute "priority".', $class, $defaultPriorityMethod, $tagName, $serviceId)); - } - - if (!$rm->isPublic()) { - throw new InvalidArgumentException(sprintf('Either method "%s::%s()" should be public or tag "%s" on service "%s" is missing attribute "priority".', $class, $defaultPriorityMethod, $tagName, $serviceId)); - } - - $defaultPriority = $rm->invoke(null); - - if (!\is_int($defaultPriority)) { - throw new InvalidArgumentException(sprintf('Method "%s::%s()" should return an integer (got "%s") or tag "%s" on service "%s" is missing attribute "priority".', $class, $defaultPriorityMethod, get_debug_type($defaultPriority), $tagName, $serviceId)); - } - - return $defaultPriority; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php b/vendor/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php deleted file mode 100644 index a9a133b..0000000 --- a/vendor/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\EnvVarProcessor; -use Symfony\Component\DependencyInjection\EnvVarProcessorInterface; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Creates the container.env_var_processors_locator service. - * - * @author Nicolas Grekas - */ -class RegisterEnvVarProcessorsPass implements CompilerPassInterface -{ - private static $allowedTypes = ['array', 'bool', 'float', 'int', 'string']; - - public function process(ContainerBuilder $container) - { - $bag = $container->getParameterBag(); - $types = []; - $processors = []; - foreach ($container->findTaggedServiceIds('container.env_var_processor') as $id => $tags) { - if (!$r = $container->getReflectionClass($class = $container->getDefinition($id)->getClass())) { - throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); - } elseif (!$r->isSubclassOf(EnvVarProcessorInterface::class)) { - throw new InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, EnvVarProcessorInterface::class)); - } - foreach ($class::getProvidedTypes() as $prefix => $type) { - $processors[$prefix] = new Reference($id); - $types[$prefix] = self::validateProvidedTypes($type, $class); - } - } - - if ($bag instanceof EnvPlaceholderParameterBag) { - foreach (EnvVarProcessor::getProvidedTypes() as $prefix => $type) { - if (!isset($types[$prefix])) { - $types[$prefix] = self::validateProvidedTypes($type, EnvVarProcessor::class); - } - } - $bag->setProvidedTypes($types); - } - - if ($processors) { - $container->setAlias('container.env_var_processors_locator', (string) ServiceLocatorTagPass::register($container, $processors)) - ->setPublic(true) - ; - } - } - - private static function validateProvidedTypes(string $types, string $class): array - { - $types = explode('|', $types); - - foreach ($types as $type) { - if (!\in_array($type, self::$allowedTypes)) { - throw new InvalidArgumentException(sprintf('Invalid type "%s" returned by "%s::getProvidedTypes()", expected one of "%s".', $type, $class, implode('", "', self::$allowedTypes))); - } - } - - return $types; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php b/vendor/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php deleted file mode 100644 index 571eab3..0000000 --- a/vendor/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Reference; - -/** - * @author Nicolas Grekas - */ -class RegisterReverseContainerPass implements CompilerPassInterface -{ - private $beforeRemoving; - private $serviceId; - private $tagName; - - public function __construct(bool $beforeRemoving, string $serviceId = 'reverse_container', string $tagName = 'container.reversible') - { - $this->beforeRemoving = $beforeRemoving; - $this->serviceId = $serviceId; - $this->tagName = $tagName; - } - - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition($this->serviceId)) { - return; - } - - $refType = $this->beforeRemoving ? ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE : ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; - $services = []; - foreach ($container->findTaggedServiceIds($this->tagName) as $id => $tags) { - $services[$id] = new Reference($id, $refType); - } - - if ($this->beforeRemoving) { - // prevent inlining of the reverse container - $services[$this->serviceId] = new Reference($this->serviceId, $refType); - } - $locator = $container->getDefinition($this->serviceId)->getArgument(1); - - if ($locator instanceof Reference) { - $locator = $container->getDefinition((string) $locator); - } - if ($locator instanceof Definition) { - foreach ($services as $id => $ref) { - $services[$id] = new ServiceClosureArgument($ref); - } - $locator->replaceArgument(0, $services); - } else { - $locator->setValues($services); - } - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php b/vendor/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php deleted file mode 100644 index 9e08d79..0000000 --- a/vendor/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Psr\Container\ContainerInterface as PsrContainerInterface; -use Symfony\Component\DependencyInjection\Argument\BoundArgument; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\DependencyInjection\TypedReference; -use Symfony\Contracts\Service\ServiceProviderInterface; -use Symfony\Contracts\Service\ServiceSubscriberInterface; - -/** - * Compiler pass to register tagged services that require a service locator. - * - * @author Nicolas Grekas - */ -class RegisterServiceSubscribersPass extends AbstractRecursivePass -{ - protected function processValue($value, bool $isRoot = false) - { - if (!$value instanceof Definition || $value->isAbstract() || $value->isSynthetic() || !$value->hasTag('container.service_subscriber')) { - return parent::processValue($value, $isRoot); - } - - $serviceMap = []; - $autowire = $value->isAutowired(); - - foreach ($value->getTag('container.service_subscriber') as $attributes) { - if (!$attributes) { - $autowire = true; - continue; - } - ksort($attributes); - if ([] !== array_diff(array_keys($attributes), ['id', 'key'])) { - throw new InvalidArgumentException(sprintf('The "container.service_subscriber" tag accepts only the "key" and "id" attributes, "%s" given for service "%s".', implode('", "', array_keys($attributes)), $this->currentId)); - } - if (!\array_key_exists('id', $attributes)) { - throw new InvalidArgumentException(sprintf('Missing "id" attribute on "container.service_subscriber" tag with key="%s" for service "%s".', $attributes['key'], $this->currentId)); - } - if (!\array_key_exists('key', $attributes)) { - $attributes['key'] = $attributes['id']; - } - if (isset($serviceMap[$attributes['key']])) { - continue; - } - $serviceMap[$attributes['key']] = new Reference($attributes['id']); - } - $class = $value->getClass(); - - if (!$r = $this->container->getReflectionClass($class)) { - throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $this->currentId)); - } - if (!$r->isSubclassOf(ServiceSubscriberInterface::class)) { - throw new InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $this->currentId, ServiceSubscriberInterface::class)); - } - $class = $r->name; - - $subscriberMap = []; - - foreach ($class::getSubscribedServices() as $key => $type) { - if (!\is_string($type) || !preg_match('/^\??[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+$/', $type)) { - throw new InvalidArgumentException(sprintf('"%s::getSubscribedServices()" must return valid PHP types for service "%s" key "%s", "%s" returned.', $class, $this->currentId, $key, \is_string($type) ? $type : get_debug_type($type))); - } - if ($optionalBehavior = '?' === $type[0]) { - $type = substr($type, 1); - $optionalBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE; - } - if (\is_int($name = $key)) { - $key = $type; - $name = null; - } - if (!isset($serviceMap[$key])) { - if (!$autowire) { - throw new InvalidArgumentException(sprintf('Service "%s" misses a "container.service_subscriber" tag with "key"/"id" attributes corresponding to entry "%s" as returned by "%s::getSubscribedServices()".', $this->currentId, $key, $class)); - } - $serviceMap[$key] = new Reference($type); - } - - if (false !== $i = strpos($name, '::get')) { - $name = lcfirst(substr($name, 5 + $i)); - } elseif (false !== strpos($name, '::')) { - $name = null; - } - - if (null !== $name && !$this->container->has($name) && !$this->container->has($type.' $'.$name)) { - $camelCaseName = lcfirst(str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $name)))); - $name = $this->container->has($type.' $'.$camelCaseName) ? $camelCaseName : $name; - } - - $subscriberMap[$key] = new TypedReference((string) $serviceMap[$key], $type, $optionalBehavior ?: ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, $name); - unset($serviceMap[$key]); - } - - if ($serviceMap = array_keys($serviceMap)) { - $message = sprintf(1 < \count($serviceMap) ? 'keys "%s" do' : 'key "%s" does', str_replace('%', '%%', implode('", "', $serviceMap))); - throw new InvalidArgumentException(sprintf('Service %s not exist in the map returned by "%s::getSubscribedServices()" for service "%s".', $message, $class, $this->currentId)); - } - - $locatorRef = ServiceLocatorTagPass::register($this->container, $subscriberMap, $this->currentId); - - $value->addTag('container.service_subscriber.locator', ['id' => (string) $locatorRef]); - - $value->setBindings([ - PsrContainerInterface::class => new BoundArgument($locatorRef, false), - ServiceProviderInterface::class => new BoundArgument($locatorRef, false), - ] + $value->getBindings()); - - return parent::processValue($value); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php b/vendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php deleted file mode 100644 index 04b6852..0000000 --- a/vendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * Removes abstract Definitions. - */ -class RemoveAbstractDefinitionsPass implements CompilerPassInterface -{ - /** - * Removes abstract definitions from the ContainerBuilder. - */ - public function process(ContainerBuilder $container) - { - foreach ($container->getDefinitions() as $id => $definition) { - if ($definition->isAbstract()) { - $container->removeDefinition($id); - $container->log($this, sprintf('Removed service "%s"; reason: abstract.', $id)); - } - } - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php b/vendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php deleted file mode 100644 index 75b36d2..0000000 --- a/vendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * Remove private aliases from the container. They were only used to establish - * dependencies between services, and these dependencies have been resolved in - * one of the previous passes. - * - * @author Johannes M. Schmitt - */ -class RemovePrivateAliasesPass implements CompilerPassInterface -{ - /** - * Removes private aliases from the ContainerBuilder. - */ - public function process(ContainerBuilder $container) - { - foreach ($container->getAliases() as $id => $alias) { - if ($alias->isPublic()) { - continue; - } - - $container->removeAlias($id); - $container->log($this, sprintf('Removed service "%s"; reason: private alias.', $id)); - } - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php b/vendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php deleted file mode 100644 index cf1a3dd..0000000 --- a/vendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Removes unused service definitions from the container. - * - * @author Johannes M. Schmitt - * @author Nicolas Grekas - */ -class RemoveUnusedDefinitionsPass extends AbstractRecursivePass -{ - private $connectedIds = []; - - /** - * Processes the ContainerBuilder to remove unused definitions. - */ - public function process(ContainerBuilder $container) - { - try { - $this->enableExpressionProcessing(); - $this->container = $container; - $connectedIds = []; - $aliases = $container->getAliases(); - - foreach ($aliases as $id => $alias) { - if ($alias->isPublic()) { - $this->connectedIds[] = (string) $aliases[$id]; - } - } - - foreach ($container->getDefinitions() as $id => $definition) { - if ($definition->isPublic()) { - $connectedIds[$id] = true; - $this->processValue($definition); - } - } - - while ($this->connectedIds) { - $ids = $this->connectedIds; - $this->connectedIds = []; - foreach ($ids as $id) { - if (!isset($connectedIds[$id]) && $container->hasDefinition($id)) { - $connectedIds[$id] = true; - $this->processValue($container->getDefinition($id)); - } - } - } - - foreach ($container->getDefinitions() as $id => $definition) { - if (!isset($connectedIds[$id])) { - $container->removeDefinition($id); - $container->resolveEnvPlaceholders(!$definition->hasErrors() ? serialize($definition) : $definition); - $container->log($this, sprintf('Removed service "%s"; reason: unused.', $id)); - } - } - } finally { - $this->container = null; - $this->connectedIds = []; - } - } - - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if (!$value instanceof Reference) { - return parent::processValue($value, $isRoot); - } - - if (ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE !== $value->getInvalidBehavior()) { - $this->connectedIds[] = (string) $value; - } - - return $value; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php b/vendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php deleted file mode 100644 index ca781f2..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Replaces aliases with actual service definitions, effectively removing these - * aliases. - * - * @author Johannes M. Schmitt - */ -class ReplaceAliasByActualDefinitionPass extends AbstractRecursivePass -{ - private $replacements; - - /** - * Process the Container to replace aliases with service definitions. - * - * @throws InvalidArgumentException if the service definition does not exist - */ - public function process(ContainerBuilder $container) - { - // First collect all alias targets that need to be replaced - $seenAliasTargets = []; - $replacements = []; - foreach ($container->getAliases() as $definitionId => $target) { - $targetId = (string) $target; - // Special case: leave this target alone - if ('service_container' === $targetId) { - continue; - } - // Check if target needs to be replaces - if (isset($replacements[$targetId])) { - $container->setAlias($definitionId, $replacements[$targetId])->setPublic($target->isPublic())->setPrivate($target->isPrivate()); - } - // No need to process the same target twice - if (isset($seenAliasTargets[$targetId])) { - continue; - } - // Process new target - $seenAliasTargets[$targetId] = true; - try { - $definition = $container->getDefinition($targetId); - } catch (ServiceNotFoundException $e) { - if ('' !== $e->getId() && '@' === $e->getId()[0]) { - throw new ServiceNotFoundException($e->getId(), $e->getSourceId(), null, [substr($e->getId(), 1)]); - } - - throw $e; - } - if ($definition->isPublic()) { - continue; - } - // Remove private definition and schedule for replacement - $definition->setPublic(!$target->isPrivate()); - $definition->setPrivate($target->isPrivate()); - $container->setDefinition($definitionId, $definition); - $container->removeDefinition($targetId); - $replacements[$targetId] = $definitionId; - } - $this->replacements = $replacements; - - parent::process($container); - $this->replacements = []; - } - - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if ($value instanceof Reference && isset($this->replacements[$referenceId = (string) $value])) { - // Perform the replacement - $newId = $this->replacements[$referenceId]; - $value = new Reference($newId, $value->getInvalidBehavior()); - $this->container->log($this, sprintf('Changed reference of service "%s" previously pointing to "%s" to "%s".', $this->currentId, $referenceId, $newId)); - } - - return parent::processValue($value, $isRoot); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveBindingsPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveBindingsPass.php deleted file mode 100644 index b86c1b7..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveBindingsPass.php +++ /dev/null @@ -1,239 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Argument\BoundArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; -use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\LazyProxy\ProxyHelper; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\DependencyInjection\TypedReference; - -/** - * @author Guilhem Niot - */ -class ResolveBindingsPass extends AbstractRecursivePass -{ - private $usedBindings = []; - private $unusedBindings = []; - private $errorMessages = []; - - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - $this->usedBindings = $container->getRemovedBindingIds(); - - try { - parent::process($container); - - foreach ($this->unusedBindings as list($key, $serviceId, $bindingType, $file)) { - $argumentType = $argumentName = $message = null; - - if (false !== strpos($key, ' ')) { - list($argumentType, $argumentName) = explode(' ', $key, 2); - } elseif ('$' === $key[0]) { - $argumentName = $key; - } else { - $argumentType = $key; - } - - if ($argumentType) { - $message .= sprintf('of type "%s" ', $argumentType); - } - - if ($argumentName) { - $message .= sprintf('named "%s" ', $argumentName); - } - - if (BoundArgument::DEFAULTS_BINDING === $bindingType) { - $message .= 'under "_defaults"'; - } elseif (BoundArgument::INSTANCEOF_BINDING === $bindingType) { - $message .= 'under "_instanceof"'; - } else { - $message .= sprintf('for service "%s"', $serviceId); - } - - if ($file) { - $message .= sprintf(' in file "%s"', $file); - } - - $message = sprintf('A binding is configured for an argument %s, but no corresponding argument has been found. It may be unused and should be removed, or it may have a typo.', $message); - - if ($this->errorMessages) { - $message .= sprintf("\nCould be related to%s:", 1 < \count($this->errorMessages) ? ' one of' : ''); - } - foreach ($this->errorMessages as $m) { - $message .= "\n - ".$m; - } - throw new InvalidArgumentException($message); - } - } finally { - $this->usedBindings = []; - $this->unusedBindings = []; - $this->errorMessages = []; - } - } - - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if ($value instanceof TypedReference && $value->getType() === (string) $value) { - // Already checked - $bindings = $this->container->getDefinition($this->currentId)->getBindings(); - $name = $value->getName(); - - if (isset($name, $bindings[$name = $value.' $'.$name])) { - return $this->getBindingValue($bindings[$name]); - } - - if (isset($bindings[$value->getType()])) { - return $this->getBindingValue($bindings[$value->getType()]); - } - - return parent::processValue($value, $isRoot); - } - - if (!$value instanceof Definition || !$bindings = $value->getBindings()) { - return parent::processValue($value, $isRoot); - } - - $bindingNames = []; - - foreach ($bindings as $key => $binding) { - list($bindingValue, $bindingId, $used, $bindingType, $file) = $binding->getValues(); - if ($used) { - $this->usedBindings[$bindingId] = true; - unset($this->unusedBindings[$bindingId]); - } elseif (!isset($this->usedBindings[$bindingId])) { - $this->unusedBindings[$bindingId] = [$key, $this->currentId, $bindingType, $file]; - } - - if (preg_match('/^(?:(?:array|bool|float|int|string|([^ $]++)) )\$/', $key, $m)) { - $bindingNames[substr($key, \strlen($m[0]))] = $binding; - } - - if (!isset($m[1])) { - continue; - } - - if (null !== $bindingValue && !$bindingValue instanceof Reference && !$bindingValue instanceof Definition && !$bindingValue instanceof TaggedIteratorArgument && !$bindingValue instanceof ServiceLocatorArgument) { - throw new InvalidArgumentException(sprintf('Invalid value for binding key "%s" for service "%s": expected null, "%s", "%s", "%s" or ServiceLocatorArgument, "%s" given.', $key, $this->currentId, Reference::class, Definition::class, TaggedIteratorArgument::class, get_debug_type($bindingValue))); - } - } - - if ($value->isAbstract()) { - return parent::processValue($value, $isRoot); - } - - $calls = $value->getMethodCalls(); - - try { - if ($constructor = $this->getConstructor($value, false)) { - $calls[] = [$constructor, $value->getArguments()]; - } - } catch (RuntimeException $e) { - $this->errorMessages[] = $e->getMessage(); - $this->container->getDefinition($this->currentId)->addError($e->getMessage()); - - return parent::processValue($value, $isRoot); - } - - foreach ($calls as $i => $call) { - list($method, $arguments) = $call; - - if ($method instanceof \ReflectionFunctionAbstract) { - $reflectionMethod = $method; - } else { - try { - $reflectionMethod = $this->getReflectionMethod($value, $method); - } catch (RuntimeException $e) { - if ($value->getFactory()) { - continue; - } - throw $e; - } - } - - foreach ($reflectionMethod->getParameters() as $key => $parameter) { - if (\array_key_exists($key, $arguments) && '' !== $arguments[$key]) { - continue; - } - - $typeHint = ProxyHelper::getTypeHint($reflectionMethod, $parameter); - - if (\array_key_exists($k = ltrim($typeHint, '\\').' $'.$parameter->name, $bindings)) { - $arguments[$key] = $this->getBindingValue($bindings[$k]); - - continue; - } - - if (\array_key_exists('$'.$parameter->name, $bindings)) { - $arguments[$key] = $this->getBindingValue($bindings['$'.$parameter->name]); - - continue; - } - - if ($typeHint && '\\' === $typeHint[0] && isset($bindings[$typeHint = substr($typeHint, 1)])) { - $arguments[$key] = $this->getBindingValue($bindings[$typeHint]); - - continue; - } - - if (isset($bindingNames[$parameter->name])) { - $bindingKey = array_search($binding, $bindings, true); - $argumentType = substr($bindingKey, 0, strpos($bindingKey, ' ')); - $this->errorMessages[] = sprintf('Did you forget to add the type "%s" to argument "$%s" of method "%s::%s()"?', $argumentType, $parameter->name, $reflectionMethod->class, $reflectionMethod->name); - } - } - - if ($arguments !== $call[1]) { - ksort($arguments); - $calls[$i][1] = $arguments; - } - } - - if ($constructor) { - list(, $arguments) = array_pop($calls); - - if ($arguments !== $value->getArguments()) { - $value->setArguments($arguments); - } - } - - if ($calls !== $value->getMethodCalls()) { - $value->setMethodCalls($calls); - } - - return parent::processValue($value, $isRoot); - } - - /** - * @return mixed - */ - private function getBindingValue(BoundArgument $binding) - { - list($bindingValue, $bindingId) = $binding->getValues(); - - $this->usedBindings[$bindingId] = true; - unset($this->unusedBindings[$bindingId]); - - return $bindingValue; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php deleted file mode 100644 index c57b8e7..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php +++ /dev/null @@ -1,196 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ChildDefinition; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\ExceptionInterface; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; - -/** - * This replaces all ChildDefinition instances with their equivalent fully - * merged Definition instance. - * - * @author Johannes M. Schmitt - * @author Nicolas Grekas - */ -class ResolveChildDefinitionsPass extends AbstractRecursivePass -{ - private $currentPath; - - protected function processValue($value, bool $isRoot = false) - { - if (!$value instanceof Definition) { - return parent::processValue($value, $isRoot); - } - if ($isRoot) { - // yes, we are specifically fetching the definition from the - // container to ensure we are not operating on stale data - $value = $this->container->getDefinition($this->currentId); - } - if ($value instanceof ChildDefinition) { - $this->currentPath = []; - $value = $this->resolveDefinition($value); - if ($isRoot) { - $this->container->setDefinition($this->currentId, $value); - } - } - - return parent::processValue($value, $isRoot); - } - - /** - * Resolves the definition. - * - * @throws RuntimeException When the definition is invalid - */ - private function resolveDefinition(ChildDefinition $definition): Definition - { - try { - return $this->doResolveDefinition($definition); - } catch (ServiceCircularReferenceException $e) { - throw $e; - } catch (ExceptionInterface $e) { - $r = new \ReflectionProperty($e, 'message'); - $r->setAccessible(true); - $r->setValue($e, sprintf('Service "%s": %s', $this->currentId, $e->getMessage())); - - throw $e; - } - } - - private function doResolveDefinition(ChildDefinition $definition): Definition - { - if (!$this->container->has($parent = $definition->getParent())) { - throw new RuntimeException(sprintf('Parent definition "%s" does not exist.', $parent)); - } - - $searchKey = array_search($parent, $this->currentPath); - $this->currentPath[] = $parent; - - if (false !== $searchKey) { - throw new ServiceCircularReferenceException($parent, \array_slice($this->currentPath, $searchKey)); - } - - $parentDef = $this->container->findDefinition($parent); - if ($parentDef instanceof ChildDefinition) { - $id = $this->currentId; - $this->currentId = $parent; - $parentDef = $this->resolveDefinition($parentDef); - $this->container->setDefinition($parent, $parentDef); - $this->currentId = $id; - } - - $this->container->log($this, sprintf('Resolving inheritance for "%s" (parent: %s).', $this->currentId, $parent)); - $def = new Definition(); - - // merge in parent definition - // purposely ignored attributes: abstract, shared, tags, autoconfigured - $def->setClass($parentDef->getClass()); - $def->setArguments($parentDef->getArguments()); - $def->setMethodCalls($parentDef->getMethodCalls()); - $def->setProperties($parentDef->getProperties()); - if ($parentDef->isDeprecated()) { - $deprecation = $parentDef->getDeprecation('%service_id%'); - $def->setDeprecated($deprecation['package'], $deprecation['version'], $deprecation['message']); - } - $def->setFactory($parentDef->getFactory()); - $def->setConfigurator($parentDef->getConfigurator()); - $def->setFile($parentDef->getFile()); - $def->setPublic($parentDef->isPublic()); - $def->setLazy($parentDef->isLazy()); - $def->setAutowired($parentDef->isAutowired()); - $def->setChanges($parentDef->getChanges()); - - $def->setBindings($definition->getBindings() + $parentDef->getBindings()); - - // overwrite with values specified in the decorator - $changes = $definition->getChanges(); - if (isset($changes['class'])) { - $def->setClass($definition->getClass()); - } - if (isset($changes['factory'])) { - $def->setFactory($definition->getFactory()); - } - if (isset($changes['configurator'])) { - $def->setConfigurator($definition->getConfigurator()); - } - if (isset($changes['file'])) { - $def->setFile($definition->getFile()); - } - if (isset($changes['public'])) { - $def->setPublic($definition->isPublic()); - } else { - $def->setPrivate($definition->isPrivate() || $parentDef->isPrivate()); - } - if (isset($changes['lazy'])) { - $def->setLazy($definition->isLazy()); - } - if (isset($changes['deprecated'])) { - if ($definition->isDeprecated()) { - $deprecation = $definition->getDeprecation('%service_id%'); - $def->setDeprecated($deprecation['package'], $deprecation['version'], $deprecation['message']); - } else { - $def->setDeprecated(false); - } - } - if (isset($changes['autowired'])) { - $def->setAutowired($definition->isAutowired()); - } - if (isset($changes['shared'])) { - $def->setShared($definition->isShared()); - } - if (isset($changes['decorated_service'])) { - $decoratedService = $definition->getDecoratedService(); - if (null === $decoratedService) { - $def->setDecoratedService($decoratedService); - } else { - $def->setDecoratedService($decoratedService[0], $decoratedService[1], $decoratedService[2], $decoratedService[3] ?? ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE); - } - } - - // merge arguments - foreach ($definition->getArguments() as $k => $v) { - if (is_numeric($k)) { - $def->addArgument($v); - } elseif (0 === strpos($k, 'index_')) { - $def->replaceArgument((int) substr($k, \strlen('index_')), $v); - } else { - $def->setArgument($k, $v); - } - } - - // merge properties - foreach ($definition->getProperties() as $k => $v) { - $def->setProperty($k, $v); - } - - // append method calls - if ($calls = $definition->getMethodCalls()) { - $def->setMethodCalls(array_merge($def->getMethodCalls(), $calls)); - } - - $def->addError($parentDef); - $def->addError($definition); - - // these attributes are always taken from the child - $def->setAbstract($definition->isAbstract()); - $def->setTags($definition->getTags()); - // autoconfigure is never taken from parent (on purpose) - // and it's not legal on an instanceof - $def->setAutoconfigured($definition->isAutoconfigured()); - - return $def; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveClassPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveClassPass.php deleted file mode 100644 index 5932472..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveClassPass.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ChildDefinition; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -/** - * @author Nicolas Grekas - */ -class ResolveClassPass implements CompilerPassInterface -{ - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - foreach ($container->getDefinitions() as $id => $definition) { - if ($definition->isSynthetic() || null !== $definition->getClass()) { - continue; - } - if (preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)++$/', $id)) { - if ($definition instanceof ChildDefinition && !class_exists($id)) { - throw new InvalidArgumentException(sprintf('Service definition "%s" has a parent but no class, and its name looks like a FQCN. Either the class is missing or you want to inherit it from the parent service. To resolve this ambiguity, please rename this service to a non-FQCN (e.g. using dots), or create the missing class.', $id)); - } - $definition->setClass($id); - } - } - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php deleted file mode 100644 index 61202ad..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Alias; -use Symfony\Component\DependencyInjection\ChildDefinition; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * @author Nicolas Grekas - */ -class ResolveDecoratorStackPass implements CompilerPassInterface -{ - private $tag; - - public function __construct(string $tag = 'container.stack') - { - $this->tag = $tag; - } - - public function process(ContainerBuilder $container) - { - $stacks = []; - - foreach ($container->findTaggedServiceIds($this->tag) as $id => $tags) { - $definition = $container->getDefinition($id); - - if (!$definition instanceof ChildDefinition) { - throw new InvalidArgumentException(sprintf('Invalid service "%s": only definitions with a "parent" can have the "%s" tag.', $id, $this->tag)); - } - - if (!$stack = $definition->getArguments()) { - throw new InvalidArgumentException(sprintf('Invalid service "%s": the stack of decorators is empty.', $id)); - } - - $stacks[$id] = $stack; - } - - if (!$stacks) { - return; - } - - $resolvedDefinitions = []; - - foreach ($container->getDefinitions() as $id => $definition) { - if (!isset($stacks[$id])) { - $resolvedDefinitions[$id] = $definition; - continue; - } - - foreach (array_reverse($this->resolveStack($stacks, [$id]), true) as $k => $v) { - $resolvedDefinitions[$k] = $v; - } - - $alias = $container->setAlias($id, $k); - - if ($definition->getChanges()['public'] ?? false) { - $alias->setPublic($definition->isPublic()); - } - - if ($definition->isDeprecated()) { - $alias->setDeprecated(...array_values($definition->getDeprecation('%alias_id%'))); - } - } - - $container->setDefinitions($resolvedDefinitions); - } - - private function resolveStack(array $stacks, array $path): array - { - $definitions = []; - $id = end($path); - $prefix = '.'.$id.'.'; - - if (!isset($stacks[$id])) { - return [$id => new ChildDefinition($id)]; - } - - if (key($path) !== $searchKey = array_search($id, $path)) { - throw new ServiceCircularReferenceException($id, \array_slice($path, $searchKey)); - } - - foreach ($stacks[$id] as $k => $definition) { - if ($definition instanceof ChildDefinition && isset($stacks[$definition->getParent()])) { - $path[] = $definition->getParent(); - $definition = unserialize(serialize($definition)); // deep clone - } elseif ($definition instanceof Definition) { - $definitions[$decoratedId = $prefix.$k] = $definition; - continue; - } elseif ($definition instanceof Reference || $definition instanceof Alias) { - $path[] = (string) $definition; - } else { - throw new InvalidArgumentException(sprintf('Invalid service "%s": unexpected value of type "%s" found in the stack of decorators.', $id, get_debug_type($definition))); - } - - $p = $prefix.$k; - - foreach ($this->resolveStack($stacks, $path) as $k => $v) { - $definitions[$decoratedId = $p.$k] = $definition instanceof ChildDefinition ? $definition->setParent($k) : new ChildDefinition($k); - $definition = null; - } - array_pop($path); - } - - if (1 === \count($path)) { - foreach ($definitions as $k => $definition) { - $definition->setPublic(false)->setTags([])->setDecoratedService($decoratedId); - } - $definition->setDecoratedService(null); - } - - return $definitions; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php deleted file mode 100644 index ea52b14..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Definition; - -/** - * Replaces env var placeholders by their current values. - */ -class ResolveEnvPlaceholdersPass extends AbstractRecursivePass -{ - protected function processValue($value, bool $isRoot = false) - { - if (\is_string($value)) { - return $this->container->resolveEnvPlaceholders($value, true); - } - if ($value instanceof Definition) { - $changes = $value->getChanges(); - if (isset($changes['class'])) { - $value->setClass($this->container->resolveEnvPlaceholders($value->getClass(), true)); - } - if (isset($changes['file'])) { - $value->setFile($this->container->resolveEnvPlaceholders($value->getFile(), true)); - } - } - - $value = parent::processValue($value, $isRoot); - - if ($value && \is_array($value) && !$isRoot) { - $value = array_combine($this->container->resolveEnvPlaceholders(array_keys($value), true), $value); - } - - return $value; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php deleted file mode 100644 index 23f535b..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; - -/** - * @author Maxime Steinhausser - */ -class ResolveFactoryClassPass extends AbstractRecursivePass -{ - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if ($value instanceof Definition && \is_array($factory = $value->getFactory()) && null === $factory[0]) { - if (null === $class = $value->getClass()) { - throw new RuntimeException(sprintf('The "%s" service is defined to be created by a factory, but is missing the factory class. Did you forget to define the factory or service class?', $this->currentId)); - } - - $factory[0] = $class; - $value->setFactory($factory); - } - - return parent::processValue($value, $isRoot); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveHotPathPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveHotPathPass.php deleted file mode 100644 index f6942c4..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveHotPathPass.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Propagate "container.hot_path" tags to referenced services. - * - * @author Nicolas Grekas - */ -class ResolveHotPathPass extends AbstractRecursivePass -{ - private $tagName; - private $resolvedIds = []; - - public function __construct(string $tagName = 'container.hot_path') - { - $this->tagName = $tagName; - } - - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - try { - parent::process($container); - $container->getDefinition('service_container')->clearTag($this->tagName); - } finally { - $this->resolvedIds = []; - } - } - - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if ($value instanceof ArgumentInterface) { - return $value; - } - - if ($value instanceof Definition && $isRoot) { - if ($value->isDeprecated()) { - return $value->clearTag($this->tagName); - } - - $this->resolvedIds[$this->currentId] = true; - - if (!$value->hasTag($this->tagName)) { - return $value; - } - } - - if ($value instanceof Reference && ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE !== $value->getInvalidBehavior() && $this->container->hasDefinition($id = (string) $value)) { - $definition = $this->container->getDefinition($id); - - if ($definition->isDeprecated() || $definition->hasTag($this->tagName)) { - return $value; - } - - $definition->addTag($this->tagName); - - if (isset($this->resolvedIds[$id])) { - parent::processValue($definition, false); - } - - return $value; - } - - return parent::processValue($value, $isRoot); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php deleted file mode 100644 index 60d059f..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php +++ /dev/null @@ -1,167 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ChildDefinition; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; - -/** - * Applies instanceof conditionals to definitions. - * - * @author Nicolas Grekas - */ -class ResolveInstanceofConditionalsPass implements CompilerPassInterface -{ - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - foreach ($container->getAutoconfiguredInstanceof() as $interface => $definition) { - if ($definition->getArguments()) { - throw new InvalidArgumentException(sprintf('Autoconfigured instanceof for type "%s" defines arguments but these are not supported and should be removed.', $interface)); - } - } - - foreach ($container->getDefinitions() as $id => $definition) { - $container->setDefinition($id, $this->processDefinition($container, $id, $definition)); - } - } - - private function processDefinition(ContainerBuilder $container, string $id, Definition $definition): Definition - { - $instanceofConditionals = $definition->getInstanceofConditionals(); - $autoconfiguredInstanceof = $definition->isAutoconfigured() ? $container->getAutoconfiguredInstanceof() : []; - if (!$instanceofConditionals && !$autoconfiguredInstanceof) { - return $definition; - } - - if (!$class = $container->getParameterBag()->resolveValue($definition->getClass())) { - return $definition; - } - - $conditionals = $this->mergeConditionals($autoconfiguredInstanceof, $instanceofConditionals, $container); - - $definition->setInstanceofConditionals([]); - $shared = null; - $instanceofTags = []; - $instanceofCalls = []; - $instanceofBindings = []; - $reflectionClass = null; - $parent = $definition instanceof ChildDefinition ? $definition->getParent() : null; - - foreach ($conditionals as $interface => $instanceofDefs) { - if ($interface !== $class && !(null === $reflectionClass ? $reflectionClass = ($container->getReflectionClass($class, false) ?: false) : $reflectionClass)) { - continue; - } - - if ($interface !== $class && !is_subclass_of($class, $interface)) { - continue; - } - - foreach ($instanceofDefs as $key => $instanceofDef) { - /** @var ChildDefinition $instanceofDef */ - $instanceofDef = clone $instanceofDef; - $instanceofDef->setAbstract(true)->setParent($parent ?: '.abstract.instanceof.'.$id); - $parent = '.instanceof.'.$interface.'.'.$key.'.'.$id; - $container->setDefinition($parent, $instanceofDef); - $instanceofTags[] = $instanceofDef->getTags(); - $instanceofBindings = $instanceofDef->getBindings() + $instanceofBindings; - - foreach ($instanceofDef->getMethodCalls() as $methodCall) { - $instanceofCalls[] = $methodCall; - } - - $instanceofDef->setTags([]); - $instanceofDef->setMethodCalls([]); - $instanceofDef->setBindings([]); - - if (isset($instanceofDef->getChanges()['shared'])) { - $shared = $instanceofDef->isShared(); - } - } - } - - if ($parent) { - $bindings = $definition->getBindings(); - $abstract = $container->setDefinition('.abstract.instanceof.'.$id, $definition); - $definition->setBindings([]); - $definition = serialize($definition); - - if (Definition::class === \get_class($abstract)) { - // cast Definition to ChildDefinition - $definition = substr_replace($definition, '53', 2, 2); - $definition = substr_replace($definition, 'Child', 44, 0); - } - /** @var ChildDefinition $definition */ - $definition = unserialize($definition); - $definition->setParent($parent); - - if (null !== $shared && !isset($definition->getChanges()['shared'])) { - $definition->setShared($shared); - } - - // Don't add tags to service decorators - if (null === $definition->getDecoratedService()) { - $i = \count($instanceofTags); - while (0 <= --$i) { - foreach ($instanceofTags[$i] as $k => $v) { - foreach ($v as $v) { - if ($definition->hasTag($k) && \in_array($v, $definition->getTag($k))) { - continue; - } - $definition->addTag($k, $v); - } - } - } - } - - $definition->setMethodCalls(array_merge($instanceofCalls, $definition->getMethodCalls())); - $definition->setBindings($bindings + $instanceofBindings); - - // reset fields with "merge" behavior - $abstract - ->setBindings([]) - ->setArguments([]) - ->setMethodCalls([]) - ->setDecoratedService(null) - ->setTags([]) - ->setAbstract(true); - } - - return $definition; - } - - private function mergeConditionals(array $autoconfiguredInstanceof, array $instanceofConditionals, ContainerBuilder $container): array - { - // make each value an array of ChildDefinition - $conditionals = array_map(function ($childDef) { return [$childDef]; }, $autoconfiguredInstanceof); - - foreach ($instanceofConditionals as $interface => $instanceofDef) { - // make sure the interface/class exists (but don't validate automaticInstanceofConditionals) - if (!$container->getReflectionClass($interface)) { - throw new RuntimeException(sprintf('"%s" is set as an "instanceof" conditional, but it does not exist.', $interface)); - } - - if (!isset($autoconfiguredInstanceof[$interface])) { - $conditionals[$interface] = []; - } - - $conditionals[$interface][] = $instanceofDef; - } - - return $conditionals; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php deleted file mode 100644 index 948de42..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php +++ /dev/null @@ -1,136 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\DependencyInjection\TypedReference; - -/** - * Emulates the invalid behavior if the reference is not found within the - * container. - * - * @author Johannes M. Schmitt - */ -class ResolveInvalidReferencesPass implements CompilerPassInterface -{ - private $container; - private $signalingException; - private $currentId; - - /** - * Process the ContainerBuilder to resolve invalid references. - */ - public function process(ContainerBuilder $container) - { - $this->container = $container; - $this->signalingException = new RuntimeException('Invalid reference.'); - - try { - foreach ($container->getDefinitions() as $this->currentId => $definition) { - $this->processValue($definition); - } - } finally { - $this->container = $this->signalingException = null; - } - } - - /** - * Processes arguments to determine invalid references. - * - * @return mixed - * - * @throws RuntimeException When an invalid reference is found - */ - private function processValue($value, int $rootLevel = 0, int $level = 0) - { - if ($value instanceof ServiceClosureArgument) { - $value->setValues($this->processValue($value->getValues(), 1, 1)); - } elseif ($value instanceof ArgumentInterface) { - $value->setValues($this->processValue($value->getValues(), $rootLevel, 1 + $level)); - } elseif ($value instanceof Definition) { - if ($value->isSynthetic() || $value->isAbstract()) { - return $value; - } - $value->setArguments($this->processValue($value->getArguments(), 0)); - $value->setProperties($this->processValue($value->getProperties(), 1)); - $value->setMethodCalls($this->processValue($value->getMethodCalls(), 2)); - } elseif (\is_array($value)) { - $i = 0; - - foreach ($value as $k => $v) { - try { - if (false !== $i && $k !== $i++) { - $i = false; - } - if ($v !== $processedValue = $this->processValue($v, $rootLevel, 1 + $level)) { - $value[$k] = $processedValue; - } - } catch (RuntimeException $e) { - if ($rootLevel < $level || ($rootLevel && !$level)) { - unset($value[$k]); - } elseif ($rootLevel) { - throw $e; - } else { - $value[$k] = null; - } - } - } - - // Ensure numerically indexed arguments have sequential numeric keys. - if (false !== $i) { - $value = array_values($value); - } - } elseif ($value instanceof Reference) { - if ($this->container->has($id = (string) $value)) { - return $value; - } - - $currentDefinition = $this->container->getDefinition($this->currentId); - - // resolve decorated service behavior depending on decorator service - if ($currentDefinition->innerServiceId === $id && ContainerInterface::NULL_ON_INVALID_REFERENCE === $currentDefinition->decorationOnInvalid) { - return null; - } - - $invalidBehavior = $value->getInvalidBehavior(); - - if (ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE === $invalidBehavior && $value instanceof TypedReference && !$this->container->has($id)) { - $e = new ServiceNotFoundException($id, $this->currentId); - - // since the error message varies by $id and $this->currentId, so should the id of the dummy errored definition - $this->container->register($id = sprintf('.errored.%s.%s', $this->currentId, $id), $value->getType()) - ->addError($e->getMessage()); - - return new TypedReference($id, $value->getType(), $value->getInvalidBehavior()); - } - - // resolve invalid behavior - if (ContainerInterface::NULL_ON_INVALID_REFERENCE === $invalidBehavior) { - $value = null; - } elseif (ContainerInterface::IGNORE_ON_INVALID_REFERENCE === $invalidBehavior) { - if (0 < $level || $rootLevel) { - throw $this->signalingException; - } - $value = null; - } - } - - return $value; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php deleted file mode 100644 index fd3c5e4..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Argument\AbstractArgument; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\LazyProxy\ProxyHelper; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Resolves named arguments to their corresponding numeric index. - * - * @author Kévin Dunglas - */ -class ResolveNamedArgumentsPass extends AbstractRecursivePass -{ - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if ($value instanceof AbstractArgument && $value->getText().'.' === $value->getTextWithContext()) { - $value->setContext(sprintf('A value found in service "%s"', $this->currentId)); - } - - if (!$value instanceof Definition) { - return parent::processValue($value, $isRoot); - } - - $calls = $value->getMethodCalls(); - $calls[] = ['__construct', $value->getArguments()]; - - foreach ($calls as $i => $call) { - list($method, $arguments) = $call; - $parameters = null; - $resolvedArguments = []; - - foreach ($arguments as $key => $argument) { - if ($argument instanceof AbstractArgument && $argument->getText().'.' === $argument->getTextWithContext()) { - $argument->setContext(sprintf('Argument '.(\is_int($key) ? 1 + $key : '"%3$s"').' of '.('__construct' === $method ? 'service "%s"' : 'method call "%s::%s()"'), $this->currentId, $method, $key)); - } - - if (\is_int($key)) { - $resolvedArguments[$key] = $argument; - continue; - } - - if (null === $parameters) { - $r = $this->getReflectionMethod($value, $method); - $class = $r instanceof \ReflectionMethod ? $r->class : $this->currentId; - $method = $r->getName(); - $parameters = $r->getParameters(); - } - - if (isset($key[0]) && '$' !== $key[0] && !class_exists($key) && !interface_exists($key, false)) { - throw new InvalidArgumentException(sprintf('Invalid service "%s": did you forget to add the "$" prefix to argument "%s"?', $this->currentId, $key)); - } - - if (isset($key[0]) && '$' === $key[0]) { - foreach ($parameters as $j => $p) { - if ($key === '$'.$p->name) { - if ($p->isVariadic() && \is_array($argument)) { - foreach ($argument as $variadicArgument) { - $resolvedArguments[$j++] = $variadicArgument; - } - } else { - $resolvedArguments[$j] = $argument; - } - - continue 2; - } - } - - throw new InvalidArgumentException(sprintf('Invalid service "%s": method "%s()" has no argument named "%s". Check your service definition.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method, $key)); - } - - if (null !== $argument && !$argument instanceof Reference && !$argument instanceof Definition) { - throw new InvalidArgumentException(sprintf('Invalid service "%s": the value of argument "%s" of method "%s()" must be null, an instance of "%s" or an instance of "%s", "%s" given.', $this->currentId, $key, $class !== $this->currentId ? $class.'::'.$method : $method, Reference::class, Definition::class, get_debug_type($argument))); - } - - $typeFound = false; - foreach ($parameters as $j => $p) { - if (!\array_key_exists($j, $resolvedArguments) && ProxyHelper::getTypeHint($r, $p, true) === $key) { - $resolvedArguments[$j] = $argument; - $typeFound = true; - } - } - - if (!$typeFound) { - throw new InvalidArgumentException(sprintf('Invalid service "%s": method "%s()" has no argument type-hinted as "%s". Check your service definition.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method, $key)); - } - } - - if ($resolvedArguments !== $call[1]) { - ksort($resolvedArguments); - $calls[$i][1] = $resolvedArguments; - } - } - - list(, $arguments) = array_pop($calls); - - if ($arguments !== $value->getArguments()) { - $value->setArguments($arguments); - } - if ($calls !== $value->getMethodCalls()) { - $value->setMethodCalls($calls); - } - - foreach ($value->getProperties() as $key => $argument) { - if ($argument instanceof AbstractArgument && $argument->getText().'.' === $argument->getTextWithContext()) { - $argument->setContext(sprintf('Property "%s" of service "%s"', $key, $this->currentId)); - } - } - - return parent::processValue($value, $isRoot); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.php deleted file mode 100644 index 50c35df..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Propagate the "container.no_preload" tag. - * - * @author Nicolas Grekas - */ -class ResolveNoPreloadPass extends AbstractRecursivePass -{ - private const DO_PRELOAD_TAG = '.container.do_preload'; - - private $tagName; - private $resolvedIds = []; - - public function __construct(string $tagName = 'container.no_preload') - { - $this->tagName = $tagName; - } - - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - $this->container = $container; - - try { - foreach ($container->getDefinitions() as $id => $definition) { - if ($definition->isPublic() && !$definition->isPrivate() && !isset($this->resolvedIds[$id])) { - $this->resolvedIds[$id] = true; - $this->processValue($definition, true); - } - } - - foreach ($container->getAliases() as $alias) { - if ($alias->isPublic() && !$alias->isPrivate() && !isset($this->resolvedIds[$id = (string) $alias]) && $container->hasDefinition($id)) { - $this->resolvedIds[$id] = true; - $this->processValue($container->getDefinition($id), true); - } - } - } finally { - $this->resolvedIds = []; - $this->container = null; - } - - foreach ($container->getDefinitions() as $definition) { - if ($definition->hasTag(self::DO_PRELOAD_TAG)) { - $definition->clearTag(self::DO_PRELOAD_TAG); - } elseif (!$definition->isDeprecated() && !$definition->hasErrors()) { - $definition->addTag($this->tagName); - } - } - } - - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if ($value instanceof Reference && ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE !== $value->getInvalidBehavior() && $this->container->hasDefinition($id = (string) $value)) { - $definition = $this->container->getDefinition($id); - - if (!isset($this->resolvedIds[$id]) && (!$definition->isPublic() || $definition->isPrivate())) { - $this->resolvedIds[$id] = true; - $this->processValue($definition, true); - } - - return $value; - } - - if (!$value instanceof Definition) { - return parent::processValue($value, $isRoot); - } - - if ($value->hasTag($this->tagName) || $value->isDeprecated() || $value->hasErrors()) { - return $value; - } - - if ($isRoot) { - $value->addTag(self::DO_PRELOAD_TAG); - } - - return parent::processValue($value, $isRoot); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php deleted file mode 100644 index b1c81ee..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException; - -/** - * Resolves all parameter placeholders "%somevalue%" to their real values. - * - * @author Johannes M. Schmitt - */ -class ResolveParameterPlaceHoldersPass extends AbstractRecursivePass -{ - private $bag; - private $resolveArrays; - private $throwOnResolveException; - - public function __construct($resolveArrays = true, $throwOnResolveException = true) - { - $this->resolveArrays = $resolveArrays; - $this->throwOnResolveException = $throwOnResolveException; - } - - /** - * {@inheritdoc} - * - * @throws ParameterNotFoundException - */ - public function process(ContainerBuilder $container) - { - $this->bag = $container->getParameterBag(); - - try { - parent::process($container); - - $aliases = []; - foreach ($container->getAliases() as $name => $target) { - $this->currentId = $name; - $aliases[$this->bag->resolveValue($name)] = $target; - } - $container->setAliases($aliases); - } catch (ParameterNotFoundException $e) { - $e->setSourceId($this->currentId); - - throw $e; - } - - $this->bag->resolve(); - $this->bag = null; - } - - protected function processValue($value, bool $isRoot = false) - { - if (\is_string($value)) { - try { - $v = $this->bag->resolveValue($value); - } catch (ParameterNotFoundException $e) { - if ($this->throwOnResolveException) { - throw $e; - } - - $v = null; - $this->container->getDefinition($this->currentId)->addError($e->getMessage()); - } - - return $this->resolveArrays || !$v || !\is_array($v) ? $v : $value; - } - if ($value instanceof Definition) { - $value->setBindings($this->processValue($value->getBindings())); - $changes = $value->getChanges(); - if (isset($changes['class'])) { - $value->setClass($this->bag->resolveValue($value->getClass())); - } - if (isset($changes['file'])) { - $value->setFile($this->bag->resolveValue($value->getFile())); - } - } - - $value = parent::processValue($value, $isRoot); - - if ($value && \is_array($value)) { - $value = array_combine($this->bag->resolveValue(array_keys($value)), $value); - } - - return $value; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolvePrivatesPass.php b/vendor/symfony/dependency-injection/Compiler/ResolvePrivatesPass.php deleted file mode 100644 index 1bd9934..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolvePrivatesPass.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * @author Nicolas Grekas - */ -class ResolvePrivatesPass implements CompilerPassInterface -{ - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - foreach ($container->getDefinitions() as $id => $definition) { - if ($definition->isPrivate()) { - $definition->setPublic(false); - $definition->setPrivate(true); - } - } - - foreach ($container->getAliases() as $id => $alias) { - if ($alias->isPrivate()) { - $alias->setPublic(false); - $alias->setPrivate(true); - } - } - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php deleted file mode 100644 index b6c00da..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Replaces all references to aliases with references to the actual service. - * - * @author Johannes M. Schmitt - */ -class ResolveReferencesToAliasesPass extends AbstractRecursivePass -{ - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - parent::process($container); - - foreach ($container->getAliases() as $id => $alias) { - $aliasId = (string) $alias; - $this->currentId = $id; - - if ($aliasId !== $defId = $this->getDefinitionId($aliasId, $container)) { - $container->setAlias($id, $defId)->setPublic($alias->isPublic())->setPrivate($alias->isPrivate()); - } - } - } - - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if (!$value instanceof Reference) { - return parent::processValue($value, $isRoot); - } - - $defId = $this->getDefinitionId($id = (string) $value, $this->container); - - return $defId !== $id ? new Reference($defId, $value->getInvalidBehavior()) : $value; - } - - private function getDefinitionId(string $id, ContainerBuilder $container): string - { - if (!$container->hasAlias($id)) { - return $id; - } - - $alias = $container->getAlias($id); - - if ($alias->isDeprecated()) { - $deprecation = $alias->getDeprecation($id); - trigger_deprecation($deprecation['package'], $deprecation['version'], rtrim($deprecation['message'], '. ').'. It is being referenced by the "%s" '.($container->hasDefinition($this->currentId) ? 'service.' : 'alias.'), $this->currentId); - } - - $seen = []; - do { - if (isset($seen[$id])) { - throw new ServiceCircularReferenceException($id, array_merge(array_keys($seen), [$id])); - } - - $seen[$id] = true; - $id = (string) $container->getAlias($id); - } while ($container->hasAlias($id)); - - return $id; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php deleted file mode 100644 index 518c03d..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Psr\Container\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Contracts\Service\ServiceProviderInterface; - -/** - * Compiler pass to inject their service locator to service subscribers. - * - * @author Nicolas Grekas - */ -class ResolveServiceSubscribersPass extends AbstractRecursivePass -{ - private $serviceLocator; - - protected function processValue($value, bool $isRoot = false) - { - if ($value instanceof Reference && $this->serviceLocator && \in_array((string) $value, [ContainerInterface::class, ServiceProviderInterface::class], true)) { - return new Reference($this->serviceLocator); - } - - if (!$value instanceof Definition) { - return parent::processValue($value, $isRoot); - } - - $serviceLocator = $this->serviceLocator; - $this->serviceLocator = null; - - if ($value->hasTag('container.service_subscriber.locator')) { - $this->serviceLocator = $value->getTag('container.service_subscriber.locator')[0]['id']; - $value->clearTag('container.service_subscriber.locator'); - } - - try { - return parent::processValue($value); - } finally { - $this->serviceLocator = $serviceLocator; - } - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php deleted file mode 100644 index 48a034a..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; - -/** - * Resolves all TaggedIteratorArgument arguments. - * - * @author Roland Franssen - */ -class ResolveTaggedIteratorArgumentPass extends AbstractRecursivePass -{ - use PriorityTaggedServiceTrait; - - /** - * {@inheritdoc} - */ - protected function processValue($value, bool $isRoot = false) - { - if (!$value instanceof TaggedIteratorArgument) { - return parent::processValue($value, $isRoot); - } - - $value->setValues($this->findAndSortTaggedServices($value, $this->container)); - - return $value; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php b/vendor/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php deleted file mode 100644 index 19a6a14..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php +++ /dev/null @@ -1,135 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Alias; -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\DependencyInjection\ServiceLocator; - -/** - * Applies the "container.service_locator" tag by wrapping references into ServiceClosureArgument instances. - * - * @author Nicolas Grekas - */ -final class ServiceLocatorTagPass extends AbstractRecursivePass -{ - use PriorityTaggedServiceTrait; - - protected function processValue($value, bool $isRoot = false) - { - if ($value instanceof ServiceLocatorArgument) { - if ($value->getTaggedIteratorArgument()) { - $value->setValues($this->findAndSortTaggedServices($value->getTaggedIteratorArgument(), $this->container)); - } - - return self::register($this->container, $value->getValues()); - } - - if (!$value instanceof Definition || !$value->hasTag('container.service_locator')) { - return parent::processValue($value, $isRoot); - } - - if (!$value->getClass()) { - $value->setClass(ServiceLocator::class); - } - - $arguments = $value->getArguments(); - if (!isset($arguments[0]) || !\is_array($arguments[0])) { - throw new InvalidArgumentException(sprintf('Invalid definition for service "%s": an array of references is expected as first argument when the "container.service_locator" tag is set.', $this->currentId)); - } - - $i = 0; - - foreach ($arguments[0] as $k => $v) { - if ($v instanceof ServiceClosureArgument) { - continue; - } - if (!$v instanceof Reference) { - throw new InvalidArgumentException(sprintf('Invalid definition for service "%s": an array of references is expected as first argument when the "container.service_locator" tag is set, "%s" found for key "%s".', $this->currentId, get_debug_type($v), $k)); - } - - if ($i === $k) { - unset($arguments[0][$k]); - - $k = (string) $v; - ++$i; - } elseif (\is_int($k)) { - $i = null; - } - $arguments[0][$k] = new ServiceClosureArgument($v); - } - ksort($arguments[0]); - - $value->setArguments($arguments); - - $id = '.service_locator.'.ContainerBuilder::hash($value); - - if ($isRoot) { - if ($id !== $this->currentId) { - $this->container->setAlias($id, new Alias($this->currentId, false)); - } - - return $value; - } - - $this->container->setDefinition($id, $value->setPublic(false)); - - return new Reference($id); - } - - /** - * @param Reference[] $refMap - */ - public static function register(ContainerBuilder $container, array $refMap, string $callerId = null): Reference - { - foreach ($refMap as $id => $ref) { - if (!$ref instanceof Reference) { - throw new InvalidArgumentException(sprintf('Invalid service locator definition: only services can be referenced, "%s" found for key "%s". Inject parameter values using constructors instead.', get_debug_type($ref), $id)); - } - $refMap[$id] = new ServiceClosureArgument($ref); - } - ksort($refMap); - - $locator = (new Definition(ServiceLocator::class)) - ->addArgument($refMap) - ->setPublic(false) - ->addTag('container.service_locator'); - - if (null !== $callerId && $container->hasDefinition($callerId)) { - $locator->setBindings($container->getDefinition($callerId)->getBindings()); - } - - if (!$container->hasDefinition($id = '.service_locator.'.ContainerBuilder::hash($locator))) { - $container->setDefinition($id, $locator); - } - - if (null !== $callerId) { - $locatorId = $id; - // Locators are shared when they hold the exact same list of factories; - // to have them specialized per consumer service, we use a cloning factory - // to derivate customized instances from the prototype one. - $container->register($id .= '.'.$callerId, ServiceLocator::class) - ->setPublic(false) - ->setFactory([new Reference($locatorId), 'withContext']) - ->addTag('container.service_locator_context', ['id' => $callerId]) - ->addArgument($callerId) - ->addArgument(new Reference('service_container')); - } - - return new Reference($id); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php b/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php deleted file mode 100644 index 308abc6..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -/** - * This is a directed graph of your services. - * - * This information can be used by your compiler passes instead of collecting - * it themselves which improves performance quite a lot. - * - * @author Johannes M. Schmitt - * - * @final - */ -class ServiceReferenceGraph -{ - /** - * @var ServiceReferenceGraphNode[] - */ - private $nodes = []; - - public function hasNode(string $id): bool - { - return isset($this->nodes[$id]); - } - - /** - * Gets a node by identifier. - * - * @throws InvalidArgumentException if no node matches the supplied identifier - */ - public function getNode(string $id): ServiceReferenceGraphNode - { - if (!isset($this->nodes[$id])) { - throw new InvalidArgumentException(sprintf('There is no node with id "%s".', $id)); - } - - return $this->nodes[$id]; - } - - /** - * Returns all nodes. - * - * @return ServiceReferenceGraphNode[] - */ - public function getNodes(): array - { - return $this->nodes; - } - - /** - * Clears all nodes. - */ - public function clear() - { - foreach ($this->nodes as $node) { - $node->clear(); - } - $this->nodes = []; - } - - /** - * Connects 2 nodes together in the Graph. - */ - public function connect(?string $sourceId, $sourceValue, ?string $destId, $destValue = null, $reference = null, bool $lazy = false, bool $weak = false, bool $byConstructor = false) - { - if (null === $sourceId || null === $destId) { - return; - } - - $sourceNode = $this->createNode($sourceId, $sourceValue); - $destNode = $this->createNode($destId, $destValue); - $edge = new ServiceReferenceGraphEdge($sourceNode, $destNode, $reference, $lazy, $weak, $byConstructor); - - $sourceNode->addOutEdge($edge); - $destNode->addInEdge($edge); - } - - private function createNode(string $id, $value): ServiceReferenceGraphNode - { - if (isset($this->nodes[$id]) && $this->nodes[$id]->getValue() === $value) { - return $this->nodes[$id]; - } - - return $this->nodes[$id] = new ServiceReferenceGraphNode($id, $value); - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php b/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php deleted file mode 100644 index 9861456..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -/** - * Represents an edge in your service graph. - * - * Value is typically a reference. - * - * @author Johannes M. Schmitt - */ -class ServiceReferenceGraphEdge -{ - private $sourceNode; - private $destNode; - private $value; - private $lazy; - private $weak; - private $byConstructor; - - public function __construct(ServiceReferenceGraphNode $sourceNode, ServiceReferenceGraphNode $destNode, $value = null, bool $lazy = false, bool $weak = false, bool $byConstructor = false) - { - $this->sourceNode = $sourceNode; - $this->destNode = $destNode; - $this->value = $value; - $this->lazy = $lazy; - $this->weak = $weak; - $this->byConstructor = $byConstructor; - } - - /** - * Returns the value of the edge. - * - * @return mixed - */ - public function getValue() - { - return $this->value; - } - - /** - * Returns the source node. - * - * @return ServiceReferenceGraphNode - */ - public function getSourceNode() - { - return $this->sourceNode; - } - - /** - * Returns the destination node. - * - * @return ServiceReferenceGraphNode - */ - public function getDestNode() - { - return $this->destNode; - } - - /** - * Returns true if the edge is lazy, meaning it's a dependency not requiring direct instantiation. - * - * @return bool - */ - public function isLazy() - { - return $this->lazy; - } - - /** - * Returns true if the edge is weak, meaning it shouldn't prevent removing the target service. - * - * @return bool - */ - public function isWeak() - { - return $this->weak; - } - - /** - * Returns true if the edge links with a constructor argument. - * - * @return bool - */ - public function isReferencedByConstructor() - { - return $this->byConstructor; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php b/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php deleted file mode 100644 index fec1424..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\DependencyInjection\Alias; -use Symfony\Component\DependencyInjection\Definition; - -/** - * Represents a node in your service graph. - * - * Value is typically a definition, or an alias. - * - * @author Johannes M. Schmitt - */ -class ServiceReferenceGraphNode -{ - private $id; - private $inEdges = []; - private $outEdges = []; - private $value; - - /** - * @param string $id The node identifier - * @param mixed $value The node value - */ - public function __construct(string $id, $value) - { - $this->id = $id; - $this->value = $value; - } - - public function addInEdge(ServiceReferenceGraphEdge $edge) - { - $this->inEdges[] = $edge; - } - - public function addOutEdge(ServiceReferenceGraphEdge $edge) - { - $this->outEdges[] = $edge; - } - - /** - * Checks if the value of this node is an Alias. - * - * @return bool True if the value is an Alias instance - */ - public function isAlias() - { - return $this->value instanceof Alias; - } - - /** - * Checks if the value of this node is a Definition. - * - * @return bool True if the value is a Definition instance - */ - public function isDefinition() - { - return $this->value instanceof Definition; - } - - /** - * Returns the identifier. - * - * @return string - */ - public function getId() - { - return $this->id; - } - - /** - * Returns the in edges. - * - * @return ServiceReferenceGraphEdge[] - */ - public function getInEdges() - { - return $this->inEdges; - } - - /** - * Returns the out edges. - * - * @return ServiceReferenceGraphEdge[] - */ - public function getOutEdges() - { - return $this->outEdges; - } - - /** - * Returns the value of this Node. - * - * @return mixed The value - */ - public function getValue() - { - return $this->value; - } - - /** - * Clears all edges. - */ - public function clear() - { - $this->inEdges = $this->outEdges = []; - } -} diff --git a/vendor/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php b/vendor/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php deleted file mode 100644 index dcfd0f7..0000000 --- a/vendor/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Compiler; - -use Symfony\Component\Config\Definition\BaseNode; -use Symfony\Component\Config\Definition\ConfigurationInterface; -use Symfony\Component\Config\Definition\Processor; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface; -use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; - -/** - * Validates environment variable placeholders used in extension configuration with dummy values. - * - * @author Roland Franssen - */ -class ValidateEnvPlaceholdersPass implements CompilerPassInterface -{ - private static $typeFixtures = ['array' => [], 'bool' => false, 'float' => 0.0, 'int' => 0, 'string' => '']; - - private $extensionConfig = []; - - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - $this->extensionConfig = []; - - if (!class_exists(BaseNode::class) || !$extensions = $container->getExtensions()) { - return; - } - - $resolvingBag = $container->getParameterBag(); - if (!$resolvingBag instanceof EnvPlaceholderParameterBag) { - return; - } - - $defaultBag = new ParameterBag($resolvingBag->all()); - $envTypes = $resolvingBag->getProvidedTypes(); - try { - foreach ($resolvingBag->getEnvPlaceholders() + $resolvingBag->getUnusedEnvPlaceholders() as $env => $placeholders) { - $values = []; - if (false === $i = strpos($env, ':')) { - $default = $defaultBag->has("env($env)") ? $defaultBag->get("env($env)") : self::$typeFixtures['string']; - $defaultType = null !== $default ? get_debug_type($default) : 'string'; - $values[$defaultType] = $default; - } else { - $prefix = substr($env, 0, $i); - foreach ($envTypes[$prefix] ?? ['string'] as $type) { - $values[$type] = self::$typeFixtures[$type] ?? null; - } - } - foreach ($placeholders as $placeholder) { - BaseNode::setPlaceholder($placeholder, $values); - } - } - - $processor = new Processor(); - - foreach ($extensions as $name => $extension) { - if (!($extension instanceof ConfigurationExtensionInterface || $extension instanceof ConfigurationInterface) - || !$config = array_filter($container->getExtensionConfig($name)) - ) { - // this extension has no semantic configuration or was not called - continue; - } - - $config = $resolvingBag->resolveValue($config); - - if ($extension instanceof ConfigurationInterface) { - $configuration = $extension; - } elseif (null === $configuration = $extension->getConfiguration($config, $container)) { - continue; - } - - $this->extensionConfig[$name] = $processor->processConfiguration($configuration, $config); - } - } finally { - BaseNode::resetPlaceholders(); - } - - $resolvingBag->clearUnusedEnvPlaceholders(); - } - - /** - * @internal - */ - public function getExtensionConfig(): array - { - try { - return $this->extensionConfig; - } finally { - $this->extensionConfig = []; - } - } -} diff --git a/vendor/symfony/dependency-injection/Config/ContainerParametersResource.php b/vendor/symfony/dependency-injection/Config/ContainerParametersResource.php deleted file mode 100644 index 8ffb8dc..0000000 --- a/vendor/symfony/dependency-injection/Config/ContainerParametersResource.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Config; - -use Symfony\Component\Config\Resource\ResourceInterface; - -/** - * Tracks container parameters. - * - * @author Maxime Steinhausser - * - * @final - */ -class ContainerParametersResource implements ResourceInterface -{ - private $parameters; - - /** - * @param array $parameters The container parameters to track - */ - public function __construct(array $parameters) - { - $this->parameters = $parameters; - } - - /** - * {@inheritdoc} - */ - public function __toString(): string - { - return 'container_parameters_'.md5(serialize($this->parameters)); - } - - /** - * @return array Tracked parameters - */ - public function getParameters(): array - { - return $this->parameters; - } -} diff --git a/vendor/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php b/vendor/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php deleted file mode 100644 index 2f2affa..0000000 --- a/vendor/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Config; - -use Symfony\Component\Config\Resource\ResourceInterface; -use Symfony\Component\Config\ResourceCheckerInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; - -/** - * @author Maxime Steinhausser - */ -class ContainerParametersResourceChecker implements ResourceCheckerInterface -{ - /** @var ContainerInterface */ - private $container; - - public function __construct(ContainerInterface $container) - { - $this->container = $container; - } - - /** - * {@inheritdoc} - */ - public function supports(ResourceInterface $metadata) - { - return $metadata instanceof ContainerParametersResource; - } - - /** - * {@inheritdoc} - */ - public function isFresh(ResourceInterface $resource, int $timestamp) - { - foreach ($resource->getParameters() as $key => $value) { - if (!$this->container->hasParameter($key) || $this->container->getParameter($key) !== $value) { - return false; - } - } - - return true; - } -} diff --git a/vendor/symfony/dependency-injection/Container.php b/vendor/symfony/dependency-injection/Container.php deleted file mode 100644 index 1a4a0b7..0000000 --- a/vendor/symfony/dependency-injection/Container.php +++ /dev/null @@ -1,453 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Symfony\Component\DependencyInjection\Argument\RewindableGenerator; -use Symfony\Component\DependencyInjection\Argument\ServiceLocator as ArgumentServiceLocator; -use Symfony\Component\DependencyInjection\Exception\EnvNotFoundException; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; -use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; -use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag; -use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; -use Symfony\Contracts\Service\ResetInterface; - -// Help opcache.preload discover always-needed symbols -class_exists(RewindableGenerator::class); -class_exists(ArgumentServiceLocator::class); - -/** - * Container is a dependency injection container. - * - * It gives access to object instances (services). - * Services and parameters are simple key/pair stores. - * The container can have four possible behaviors when a service - * does not exist (or is not initialized for the last case): - * - * * EXCEPTION_ON_INVALID_REFERENCE: Throws an exception (the default) - * * NULL_ON_INVALID_REFERENCE: Returns null - * * IGNORE_ON_INVALID_REFERENCE: Ignores the wrapping command asking for the reference - * (for instance, ignore a setter if the service does not exist) - * * IGNORE_ON_UNINITIALIZED_REFERENCE: Ignores/returns null for uninitialized services or invalid references - * - * @author Fabien Potencier - * @author Johannes M. Schmitt - */ -class Container implements ContainerInterface, ResetInterface -{ - protected $parameterBag; - protected $services = []; - protected $privates = []; - protected $fileMap = []; - protected $methodMap = []; - protected $factories = []; - protected $aliases = []; - protected $loading = []; - protected $resolving = []; - protected $syntheticIds = []; - - private $envCache = []; - private $compiled = false; - private $getEnv; - - public function __construct(ParameterBagInterface $parameterBag = null) - { - $this->parameterBag = $parameterBag ?: new EnvPlaceholderParameterBag(); - } - - /** - * Compiles the container. - * - * This method does two things: - * - * * Parameter values are resolved; - * * The parameter bag is frozen. - */ - public function compile() - { - $this->parameterBag->resolve(); - - $this->parameterBag = new FrozenParameterBag($this->parameterBag->all()); - - $this->compiled = true; - } - - /** - * Returns true if the container is compiled. - * - * @return bool - */ - public function isCompiled() - { - return $this->compiled; - } - - /** - * Gets the service container parameter bag. - * - * @return ParameterBagInterface A ParameterBagInterface instance - */ - public function getParameterBag() - { - return $this->parameterBag; - } - - /** - * Gets a parameter. - * - * @param string $name The parameter name - * - * @return mixed The parameter value - * - * @throws InvalidArgumentException if the parameter is not defined - */ - public function getParameter(string $name) - { - return $this->parameterBag->get($name); - } - - /** - * Checks if a parameter exists. - * - * @param string $name The parameter name - * - * @return bool The presence of parameter in container - */ - public function hasParameter(string $name) - { - return $this->parameterBag->has($name); - } - - /** - * Sets a parameter. - * - * @param string $name The parameter name - * @param mixed $value The parameter value - */ - public function setParameter(string $name, $value) - { - $this->parameterBag->set($name, $value); - } - - /** - * Sets a service. - * - * Setting a synthetic service to null resets it: has() returns false and get() - * behaves in the same way as if the service was never created. - */ - public function set(string $id, ?object $service) - { - // Runs the internal initializer; used by the dumped container to include always-needed files - if (isset($this->privates['service_container']) && $this->privates['service_container'] instanceof \Closure) { - $initialize = $this->privates['service_container']; - unset($this->privates['service_container']); - $initialize(); - } - - if ('service_container' === $id) { - throw new InvalidArgumentException('You cannot set service "service_container".'); - } - - if (!(isset($this->fileMap[$id]) || isset($this->methodMap[$id]))) { - if (isset($this->syntheticIds[$id]) || !isset($this->getRemovedIds()[$id])) { - // no-op - } elseif (null === $service) { - throw new InvalidArgumentException(sprintf('The "%s" service is private, you cannot unset it.', $id)); - } else { - throw new InvalidArgumentException(sprintf('The "%s" service is private, you cannot replace it.', $id)); - } - } elseif (isset($this->services[$id])) { - throw new InvalidArgumentException(sprintf('The "%s" service is already initialized, you cannot replace it.', $id)); - } - - if (isset($this->aliases[$id])) { - unset($this->aliases[$id]); - } - - if (null === $service) { - unset($this->services[$id]); - - return; - } - - $this->services[$id] = $service; - } - - /** - * Returns true if the given service is defined. - * - * @param string $id The service identifier - * - * @return bool true if the service is defined, false otherwise - */ - public function has($id) - { - if (isset($this->aliases[$id])) { - $id = $this->aliases[$id]; - } - if (isset($this->services[$id])) { - return true; - } - if ('service_container' === $id) { - return true; - } - - return isset($this->fileMap[$id]) || isset($this->methodMap[$id]); - } - - /** - * Gets a service. - * - * @param string $id The service identifier - * @param int $invalidBehavior The behavior when the service does not exist - * - * @return object|null The associated service - * - * @throws ServiceCircularReferenceException When a circular reference is detected - * @throws ServiceNotFoundException When the service is not defined - * @throws \Exception if an exception has been thrown when the service has been resolved - * - * @see Reference - */ - public function get($id, int $invalidBehavior = /* self::EXCEPTION_ON_INVALID_REFERENCE */ 1) - { - return $this->services[$id] - ?? $this->services[$id = $this->aliases[$id] ?? $id] - ?? ('service_container' === $id ? $this : ($this->factories[$id] ?? [$this, 'make'])($id, $invalidBehavior)); - } - - /** - * Creates a service. - * - * As a separate method to allow "get()" to use the really fast `??` operator. - */ - private function make(string $id, int $invalidBehavior) - { - if (isset($this->loading[$id])) { - throw new ServiceCircularReferenceException($id, array_merge(array_keys($this->loading), [$id])); - } - - $this->loading[$id] = true; - - try { - if (isset($this->fileMap[$id])) { - return /* self::IGNORE_ON_UNINITIALIZED_REFERENCE */ 4 === $invalidBehavior ? null : $this->load($this->fileMap[$id]); - } elseif (isset($this->methodMap[$id])) { - return /* self::IGNORE_ON_UNINITIALIZED_REFERENCE */ 4 === $invalidBehavior ? null : $this->{$this->methodMap[$id]}(); - } - } catch (\Exception $e) { - unset($this->services[$id]); - - throw $e; - } finally { - unset($this->loading[$id]); - } - - if (/* self::EXCEPTION_ON_INVALID_REFERENCE */ 1 === $invalidBehavior) { - if (!$id) { - throw new ServiceNotFoundException($id); - } - if (isset($this->syntheticIds[$id])) { - throw new ServiceNotFoundException($id, null, null, [], sprintf('The "%s" service is synthetic, it needs to be set at boot time before it can be used.', $id)); - } - if (isset($this->getRemovedIds()[$id])) { - throw new ServiceNotFoundException($id, null, null, [], sprintf('The "%s" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead.', $id)); - } - - $alternatives = []; - foreach ($this->getServiceIds() as $knownId) { - if ('' === $knownId || '.' === $knownId[0]) { - continue; - } - $lev = levenshtein($id, $knownId); - if ($lev <= \strlen($id) / 3 || false !== strpos($knownId, $id)) { - $alternatives[] = $knownId; - } - } - - throw new ServiceNotFoundException($id, null, null, $alternatives); - } - - return null; - } - - /** - * Returns true if the given service has actually been initialized. - * - * @param string $id The service identifier - * - * @return bool true if service has already been initialized, false otherwise - */ - public function initialized(string $id) - { - if (isset($this->aliases[$id])) { - $id = $this->aliases[$id]; - } - - if ('service_container' === $id) { - return false; - } - - return isset($this->services[$id]); - } - - /** - * {@inheritdoc} - */ - public function reset() - { - $services = $this->services + $this->privates; - $this->services = $this->factories = $this->privates = []; - - foreach ($services as $service) { - try { - if ($service instanceof ResetInterface) { - $service->reset(); - } - } catch (\Throwable $e) { - continue; - } - } - } - - /** - * Gets all service ids. - * - * @return string[] An array of all defined service ids - */ - public function getServiceIds() - { - return array_map('strval', array_unique(array_merge(['service_container'], array_keys($this->fileMap), array_keys($this->methodMap), array_keys($this->aliases), array_keys($this->services)))); - } - - /** - * Gets service ids that existed at compile time. - * - * @return array - */ - public function getRemovedIds() - { - return []; - } - - /** - * Camelizes a string. - * - * @param string $id A string to camelize - * - * @return string The camelized string - */ - public static function camelize($id) - { - return strtr(ucwords(strtr($id, ['_' => ' ', '.' => '_ ', '\\' => '_ '])), [' ' => '']); - } - - /** - * A string to underscore. - * - * @param string $id The string to underscore - * - * @return string The underscored string - */ - public static function underscore($id) - { - return strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], ['\\1_\\2', '\\1_\\2'], str_replace('_', '.', $id))); - } - - /** - * Creates a service by requiring its factory file. - */ - protected function load($file) - { - return require $file; - } - - /** - * Fetches a variable from the environment. - * - * @param string $name The name of the environment variable - * - * @return mixed The value to use for the provided environment variable name - * - * @throws EnvNotFoundException When the environment variable is not found and has no default value - */ - protected function getEnv($name) - { - if (isset($this->resolving[$envName = "env($name)"])) { - throw new ParameterCircularReferenceException(array_keys($this->resolving)); - } - if (isset($this->envCache[$name]) || \array_key_exists($name, $this->envCache)) { - return $this->envCache[$name]; - } - if (!$this->has($id = 'container.env_var_processors_locator')) { - $this->set($id, new ServiceLocator([])); - } - if (!$this->getEnv) { - $this->getEnv = new \ReflectionMethod($this, __FUNCTION__); - $this->getEnv->setAccessible(true); - $this->getEnv = $this->getEnv->getClosure($this); - } - $processors = $this->get($id); - - if (false !== $i = strpos($name, ':')) { - $prefix = substr($name, 0, $i); - $localName = substr($name, 1 + $i); - } else { - $prefix = 'string'; - $localName = $name; - } - $processor = $processors->has($prefix) ? $processors->get($prefix) : new EnvVarProcessor($this); - - $this->resolving[$envName] = true; - try { - return $this->envCache[$name] = $processor->getEnv($prefix, $localName, $this->getEnv); - } finally { - unset($this->resolving[$envName]); - } - } - - /** - * @param string|false $registry - * @param string|bool $load - * - * @return mixed - * - * @internal - */ - final protected function getService($registry, string $id, ?string $method, $load) - { - if ('service_container' === $id) { - return $this; - } - if (\is_string($load)) { - throw new RuntimeException($load); - } - if (null === $method) { - return false !== $registry ? $this->{$registry}[$id] ?? null : null; - } - if (false !== $registry) { - return $this->{$registry}[$id] ?? $this->{$registry}[$id] = $load ? $this->load($method) : $this->{$method}(); - } - if (!$load) { - return $this->{$method}(); - } - - return ($factory = $this->factories[$id] ?? $this->factories['service_container'][$id] ?? null) ? $factory() : $this->load($method); - } - - private function __clone() - { - } -} diff --git a/vendor/symfony/dependency-injection/ContainerAwareInterface.php b/vendor/symfony/dependency-injection/ContainerAwareInterface.php deleted file mode 100644 index e7b9d57..0000000 --- a/vendor/symfony/dependency-injection/ContainerAwareInterface.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -/** - * ContainerAwareInterface should be implemented by classes that depends on a Container. - * - * @author Fabien Potencier - */ -interface ContainerAwareInterface -{ - /** - * Sets the container. - */ - public function setContainer(ContainerInterface $container = null); -} diff --git a/vendor/symfony/dependency-injection/ContainerAwareTrait.php b/vendor/symfony/dependency-injection/ContainerAwareTrait.php deleted file mode 100644 index ee1ea2c..0000000 --- a/vendor/symfony/dependency-injection/ContainerAwareTrait.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -/** - * ContainerAware trait. - * - * @author Fabien Potencier - */ -trait ContainerAwareTrait -{ - /** - * @var ContainerInterface - */ - protected $container; - - public function setContainer(ContainerInterface $container = null) - { - $this->container = $container; - } -} diff --git a/vendor/symfony/dependency-injection/ContainerBuilder.php b/vendor/symfony/dependency-injection/ContainerBuilder.php deleted file mode 100644 index 2153304..0000000 --- a/vendor/symfony/dependency-injection/ContainerBuilder.php +++ /dev/null @@ -1,1616 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Psr\Container\ContainerInterface as PsrContainerInterface; -use Symfony\Component\Config\Resource\ClassExistenceResource; -use Symfony\Component\Config\Resource\ComposerResource; -use Symfony\Component\Config\Resource\DirectoryResource; -use Symfony\Component\Config\Resource\FileExistenceResource; -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Config\Resource\GlobResource; -use Symfony\Component\Config\Resource\ReflectionClassResource; -use Symfony\Component\Config\Resource\ResourceInterface; -use Symfony\Component\DependencyInjection\Argument\AbstractArgument; -use Symfony\Component\DependencyInjection\Argument\IteratorArgument; -use Symfony\Component\DependencyInjection\Argument\RewindableGenerator; -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceLocator; -use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; -use Symfony\Component\DependencyInjection\Compiler\Compiler; -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\Compiler\PassConfig; -use Symfony\Component\DependencyInjection\Compiler\ResolveEnvPlaceholdersPass; -use Symfony\Component\DependencyInjection\Exception\BadMethodCallException; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\LogicException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; -use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; -use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; -use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\InstantiatorInterface; -use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\RealServiceInstantiator; -use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; -use Symfony\Component\ExpressionLanguage\Expression; -use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; - -/** - * ContainerBuilder is a DI container that provides an API to easily describe services. - * - * @author Fabien Potencier - */ -class ContainerBuilder extends Container implements TaggedContainerInterface -{ - /** - * @var ExtensionInterface[] - */ - private $extensions = []; - - /** - * @var ExtensionInterface[] - */ - private $extensionsByNs = []; - - /** - * @var Definition[] - */ - private $definitions = []; - - /** - * @var Alias[] - */ - private $aliasDefinitions = []; - - /** - * @var ResourceInterface[] - */ - private $resources = []; - - private $extensionConfigs = []; - - /** - * @var Compiler - */ - private $compiler; - - private $trackResources; - - /** - * @var InstantiatorInterface|null - */ - private $proxyInstantiator; - - /** - * @var ExpressionLanguage|null - */ - private $expressionLanguage; - - /** - * @var ExpressionFunctionProviderInterface[] - */ - private $expressionLanguageProviders = []; - - /** - * @var string[] with tag names used by findTaggedServiceIds - */ - private $usedTags = []; - - /** - * @var string[][] a map of env var names to their placeholders - */ - private $envPlaceholders = []; - - /** - * @var int[] a map of env vars to their resolution counter - */ - private $envCounters = []; - - /** - * @var string[] the list of vendor directories - */ - private $vendors; - - private $autoconfiguredInstanceof = []; - - private $removedIds = []; - - private $removedBindingIds = []; - - private static $internalTypes = [ - 'int' => true, - 'float' => true, - 'string' => true, - 'bool' => true, - 'resource' => true, - 'object' => true, - 'array' => true, - 'null' => true, - 'callable' => true, - 'iterable' => true, - 'mixed' => true, - ]; - - public function __construct(ParameterBagInterface $parameterBag = null) - { - parent::__construct($parameterBag); - - $this->trackResources = interface_exists('Symfony\Component\Config\Resource\ResourceInterface'); - $this->setDefinition('service_container', (new Definition(ContainerInterface::class))->setSynthetic(true)->setPublic(true)); - $this->setAlias(PsrContainerInterface::class, new Alias('service_container', false))->setDeprecated('symfony/dependency-injection', '5.1', $deprecationMessage = 'The "%alias_id%" autowiring alias is deprecated. Define it explicitly in your app if you want to keep using it.'); - $this->setAlias(ContainerInterface::class, new Alias('service_container', false))->setDeprecated('symfony/dependency-injection', '5.1', $deprecationMessage); - } - - /** - * @var \ReflectionClass[] a list of class reflectors - */ - private $classReflectors; - - /** - * Sets the track resources flag. - * - * If you are not using the loaders and therefore don't want - * to depend on the Config component, set this flag to false. - */ - public function setResourceTracking(bool $track) - { - $this->trackResources = $track; - } - - /** - * Checks if resources are tracked. - * - * @return bool true If resources are tracked, false otherwise - */ - public function isTrackingResources() - { - return $this->trackResources; - } - - /** - * Sets the instantiator to be used when fetching proxies. - */ - public function setProxyInstantiator(InstantiatorInterface $proxyInstantiator) - { - $this->proxyInstantiator = $proxyInstantiator; - } - - public function registerExtension(ExtensionInterface $extension) - { - $this->extensions[$extension->getAlias()] = $extension; - - if (false !== $extension->getNamespace()) { - $this->extensionsByNs[$extension->getNamespace()] = $extension; - } - } - - /** - * Returns an extension by alias or namespace. - * - * @return ExtensionInterface An extension instance - * - * @throws LogicException if the extension is not registered - */ - public function getExtension(string $name) - { - if (isset($this->extensions[$name])) { - return $this->extensions[$name]; - } - - if (isset($this->extensionsByNs[$name])) { - return $this->extensionsByNs[$name]; - } - - throw new LogicException(sprintf('Container extension "%s" is not registered.', $name)); - } - - /** - * Returns all registered extensions. - * - * @return ExtensionInterface[] An array of ExtensionInterface - */ - public function getExtensions() - { - return $this->extensions; - } - - /** - * Checks if we have an extension. - * - * @return bool If the extension exists - */ - public function hasExtension(string $name) - { - return isset($this->extensions[$name]) || isset($this->extensionsByNs[$name]); - } - - /** - * Returns an array of resources loaded to build this configuration. - * - * @return ResourceInterface[] An array of resources - */ - public function getResources() - { - return array_values($this->resources); - } - - /** - * @return $this - */ - public function addResource(ResourceInterface $resource) - { - if (!$this->trackResources) { - return $this; - } - - if ($resource instanceof GlobResource && $this->inVendors($resource->getPrefix())) { - return $this; - } - - $this->resources[(string) $resource] = $resource; - - return $this; - } - - /** - * Sets the resources for this configuration. - * - * @param ResourceInterface[] $resources An array of resources - * - * @return $this - */ - public function setResources(array $resources) - { - if (!$this->trackResources) { - return $this; - } - - $this->resources = $resources; - - return $this; - } - - /** - * Adds the object class hierarchy as resources. - * - * @param object|string $object An object instance or class name - * - * @return $this - */ - public function addObjectResource($object) - { - if ($this->trackResources) { - if (\is_object($object)) { - $object = \get_class($object); - } - if (!isset($this->classReflectors[$object])) { - $this->classReflectors[$object] = new \ReflectionClass($object); - } - $class = $this->classReflectors[$object]; - - foreach ($class->getInterfaceNames() as $name) { - if (null === $interface = &$this->classReflectors[$name]) { - $interface = new \ReflectionClass($name); - } - $file = $interface->getFileName(); - if (false !== $file && file_exists($file)) { - $this->fileExists($file); - } - } - do { - $file = $class->getFileName(); - if (false !== $file && file_exists($file)) { - $this->fileExists($file); - } - foreach ($class->getTraitNames() as $name) { - $this->addObjectResource($name); - } - } while ($class = $class->getParentClass()); - } - - return $this; - } - - /** - * Retrieves the requested reflection class and registers it for resource tracking. - * - * @throws \ReflectionException when a parent class/interface/trait is not found and $throw is true - * - * @final - */ - public function getReflectionClass(?string $class, bool $throw = true): ?\ReflectionClass - { - if (!$class = $this->getParameterBag()->resolveValue($class)) { - return null; - } - - if (isset(self::$internalTypes[$class])) { - return null; - } - - $resource = $classReflector = null; - - try { - if (isset($this->classReflectors[$class])) { - $classReflector = $this->classReflectors[$class]; - } elseif (class_exists(ClassExistenceResource::class)) { - $resource = new ClassExistenceResource($class, false); - $classReflector = $resource->isFresh(0) ? false : new \ReflectionClass($class); - } else { - $classReflector = class_exists($class) ? new \ReflectionClass($class) : false; - } - } catch (\ReflectionException $e) { - if ($throw) { - throw $e; - } - } - - if ($this->trackResources) { - if (!$classReflector) { - $this->addResource($resource ?: new ClassExistenceResource($class, false)); - } elseif (!$classReflector->isInternal()) { - $path = $classReflector->getFileName(); - - if (!$this->inVendors($path)) { - $this->addResource(new ReflectionClassResource($classReflector, $this->vendors)); - } - } - $this->classReflectors[$class] = $classReflector; - } - - return $classReflector ?: null; - } - - /** - * Checks whether the requested file or directory exists and registers the result for resource tracking. - * - * @param string $path The file or directory path for which to check the existence - * @param bool|string $trackContents Whether to track contents of the given resource. If a string is passed, - * it will be used as pattern for tracking contents of the requested directory - * - * @final - */ - public function fileExists(string $path, $trackContents = true): bool - { - $exists = file_exists($path); - - if (!$this->trackResources || $this->inVendors($path)) { - return $exists; - } - - if (!$exists) { - $this->addResource(new FileExistenceResource($path)); - - return $exists; - } - - if (is_dir($path)) { - if ($trackContents) { - $this->addResource(new DirectoryResource($path, \is_string($trackContents) ? $trackContents : null)); - } else { - $this->addResource(new GlobResource($path, '/*', false)); - } - } elseif ($trackContents) { - $this->addResource(new FileResource($path)); - } - - return $exists; - } - - /** - * Loads the configuration for an extension. - * - * @param string $extension The extension alias or namespace - * @param array $values An array of values that customizes the extension - * - * @return $this - * - * @throws BadMethodCallException When this ContainerBuilder is compiled - * @throws \LogicException if the extension is not registered - */ - public function loadFromExtension(string $extension, array $values = null) - { - if ($this->isCompiled()) { - throw new BadMethodCallException('Cannot load from an extension on a compiled container.'); - } - - if (\func_num_args() < 2) { - $values = []; - } - - $namespace = $this->getExtension($extension)->getAlias(); - - $this->extensionConfigs[$namespace][] = $values; - - return $this; - } - - /** - * Adds a compiler pass. - * - * @param string $type The type of compiler pass - * @param int $priority Used to sort the passes - * - * @return $this - */ - public function addCompilerPass(CompilerPassInterface $pass, string $type = PassConfig::TYPE_BEFORE_OPTIMIZATION, int $priority = 0) - { - $this->getCompiler()->addPass($pass, $type, $priority); - - $this->addObjectResource($pass); - - return $this; - } - - /** - * Returns the compiler pass config which can then be modified. - * - * @return PassConfig The compiler pass config - */ - public function getCompilerPassConfig() - { - return $this->getCompiler()->getPassConfig(); - } - - /** - * Returns the compiler. - * - * @return Compiler The compiler - */ - public function getCompiler() - { - if (null === $this->compiler) { - $this->compiler = new Compiler(); - } - - return $this->compiler; - } - - /** - * Sets a service. - * - * @throws BadMethodCallException When this ContainerBuilder is compiled - */ - public function set(string $id, ?object $service) - { - if ($this->isCompiled() && (isset($this->definitions[$id]) && !$this->definitions[$id]->isSynthetic())) { - // setting a synthetic service on a compiled container is alright - throw new BadMethodCallException(sprintf('Setting service "%s" for an unknown or non-synthetic service definition on a compiled container is not allowed.', $id)); - } - - unset($this->definitions[$id], $this->aliasDefinitions[$id], $this->removedIds[$id]); - - parent::set($id, $service); - } - - /** - * Removes a service definition. - */ - public function removeDefinition(string $id) - { - if (isset($this->definitions[$id])) { - unset($this->definitions[$id]); - $this->removedIds[$id] = true; - } - } - - /** - * Returns true if the given service is defined. - * - * @param string $id The service identifier - * - * @return bool true if the service is defined, false otherwise - */ - public function has($id) - { - $id = (string) $id; - - return isset($this->definitions[$id]) || isset($this->aliasDefinitions[$id]) || parent::has($id); - } - - /** - * Gets a service. - * - * @param string $id The service identifier - * @param int $invalidBehavior The behavior when the service does not exist - * - * @return object|null The associated service - * - * @throws InvalidArgumentException when no definitions are available - * @throws ServiceCircularReferenceException When a circular reference is detected - * @throws ServiceNotFoundException When the service is not defined - * @throws \Exception - * - * @see Reference - */ - public function get($id, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE) - { - if ($this->isCompiled() && isset($this->removedIds[$id = (string) $id]) && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE >= $invalidBehavior) { - return parent::get($id); - } - - return $this->doGet($id, $invalidBehavior); - } - - private function doGet(string $id, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, array &$inlineServices = null, bool $isConstructorArgument = false) - { - if (isset($inlineServices[$id])) { - return $inlineServices[$id]; - } - if (null === $inlineServices) { - $isConstructorArgument = true; - $inlineServices = []; - } - try { - if (ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $invalidBehavior) { - return parent::get($id, $invalidBehavior); - } - if ($service = parent::get($id, ContainerInterface::NULL_ON_INVALID_REFERENCE)) { - return $service; - } - } catch (ServiceCircularReferenceException $e) { - if ($isConstructorArgument) { - throw $e; - } - } - - if (!isset($this->definitions[$id]) && isset($this->aliasDefinitions[$id])) { - $alias = $this->aliasDefinitions[$id]; - - if ($alias->isDeprecated()) { - $deprecation = $alias->getDeprecation($id); - trigger_deprecation($deprecation['package'], $deprecation['version'], $deprecation['message']); - } - - return $this->doGet((string) $alias, $invalidBehavior, $inlineServices, $isConstructorArgument); - } - - try { - $definition = $this->getDefinition($id); - } catch (ServiceNotFoundException $e) { - if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE < $invalidBehavior) { - return null; - } - - throw $e; - } - - if ($definition->hasErrors() && $e = $definition->getErrors()) { - throw new RuntimeException(reset($e)); - } - - if ($isConstructorArgument) { - $this->loading[$id] = true; - } - - try { - return $this->createService($definition, $inlineServices, $isConstructorArgument, $id); - } finally { - if ($isConstructorArgument) { - unset($this->loading[$id]); - } - } - } - - /** - * Merges a ContainerBuilder with the current ContainerBuilder configuration. - * - * Service definitions overrides the current defined ones. - * - * But for parameters, they are overridden by the current ones. It allows - * the parameters passed to the container constructor to have precedence - * over the loaded ones. - * - * $container = new ContainerBuilder(new ParameterBag(['foo' => 'bar'])); - * $loader = new LoaderXXX($container); - * $loader->load('resource_name'); - * $container->register('foo', 'stdClass'); - * - * In the above example, even if the loaded resource defines a foo - * parameter, the value will still be 'bar' as defined in the ContainerBuilder - * constructor. - * - * @throws BadMethodCallException When this ContainerBuilder is compiled - */ - public function merge(self $container) - { - if ($this->isCompiled()) { - throw new BadMethodCallException('Cannot merge on a compiled container.'); - } - - $this->addDefinitions($container->getDefinitions()); - $this->addAliases($container->getAliases()); - $this->getParameterBag()->add($container->getParameterBag()->all()); - - if ($this->trackResources) { - foreach ($container->getResources() as $resource) { - $this->addResource($resource); - } - } - - foreach ($this->extensions as $name => $extension) { - if (!isset($this->extensionConfigs[$name])) { - $this->extensionConfigs[$name] = []; - } - - $this->extensionConfigs[$name] = array_merge($this->extensionConfigs[$name], $container->getExtensionConfig($name)); - } - - if ($this->getParameterBag() instanceof EnvPlaceholderParameterBag && $container->getParameterBag() instanceof EnvPlaceholderParameterBag) { - $envPlaceholders = $container->getParameterBag()->getEnvPlaceholders(); - $this->getParameterBag()->mergeEnvPlaceholders($container->getParameterBag()); - } else { - $envPlaceholders = []; - } - - foreach ($container->envCounters as $env => $count) { - if (!$count && !isset($envPlaceholders[$env])) { - continue; - } - if (!isset($this->envCounters[$env])) { - $this->envCounters[$env] = $count; - } else { - $this->envCounters[$env] += $count; - } - } - - foreach ($container->getAutoconfiguredInstanceof() as $interface => $childDefinition) { - if (isset($this->autoconfiguredInstanceof[$interface])) { - throw new InvalidArgumentException(sprintf('"%s" has already been autoconfigured and merge() does not support merging autoconfiguration for the same class/interface.', $interface)); - } - - $this->autoconfiguredInstanceof[$interface] = $childDefinition; - } - } - - /** - * Returns the configuration array for the given extension. - * - * @return array An array of configuration - */ - public function getExtensionConfig(string $name) - { - if (!isset($this->extensionConfigs[$name])) { - $this->extensionConfigs[$name] = []; - } - - return $this->extensionConfigs[$name]; - } - - /** - * Prepends a config array to the configs of the given extension. - */ - public function prependExtensionConfig(string $name, array $config) - { - if (!isset($this->extensionConfigs[$name])) { - $this->extensionConfigs[$name] = []; - } - - array_unshift($this->extensionConfigs[$name], $config); - } - - /** - * Compiles the container. - * - * This method passes the container to compiler - * passes whose job is to manipulate and optimize - * the container. - * - * The main compiler passes roughly do four things: - * - * * The extension configurations are merged; - * * Parameter values are resolved; - * * The parameter bag is frozen; - * * Extension loading is disabled. - * - * @param bool $resolveEnvPlaceholders Whether %env()% parameters should be resolved using the current - * env vars or be replaced by uniquely identifiable placeholders. - * Set to "true" when you want to use the current ContainerBuilder - * directly, keep to "false" when the container is dumped instead. - */ - public function compile(bool $resolveEnvPlaceholders = false) - { - $compiler = $this->getCompiler(); - - if ($this->trackResources) { - foreach ($compiler->getPassConfig()->getPasses() as $pass) { - $this->addObjectResource($pass); - } - } - $bag = $this->getParameterBag(); - - if ($resolveEnvPlaceholders && $bag instanceof EnvPlaceholderParameterBag) { - $compiler->addPass(new ResolveEnvPlaceholdersPass(), PassConfig::TYPE_AFTER_REMOVING, -1000); - } - - $compiler->compile($this); - - foreach ($this->definitions as $id => $definition) { - if ($this->trackResources && $definition->isLazy()) { - $this->getReflectionClass($definition->getClass()); - } - } - - $this->extensionConfigs = []; - - if ($bag instanceof EnvPlaceholderParameterBag) { - if ($resolveEnvPlaceholders) { - $this->parameterBag = new ParameterBag($this->resolveEnvPlaceholders($bag->all(), true)); - } - - $this->envPlaceholders = $bag->getEnvPlaceholders(); - } - - parent::compile(); - - foreach ($this->definitions + $this->aliasDefinitions as $id => $definition) { - if (!$definition->isPublic() || $definition->isPrivate()) { - $this->removedIds[$id] = true; - } - } - } - - /** - * {@inheritdoc} - */ - public function getServiceIds() - { - return array_map('strval', array_unique(array_merge(array_keys($this->getDefinitions()), array_keys($this->aliasDefinitions), parent::getServiceIds()))); - } - - /** - * Gets removed service or alias ids. - * - * @return array - */ - public function getRemovedIds() - { - return $this->removedIds; - } - - /** - * Adds the service aliases. - */ - public function addAliases(array $aliases) - { - foreach ($aliases as $alias => $id) { - $this->setAlias($alias, $id); - } - } - - /** - * Sets the service aliases. - */ - public function setAliases(array $aliases) - { - $this->aliasDefinitions = []; - $this->addAliases($aliases); - } - - /** - * Sets an alias for an existing service. - * - * @param string $alias The alias to create - * @param string|Alias $id The service to alias - * - * @return Alias - * - * @throws InvalidArgumentException if the id is not a string or an Alias - * @throws InvalidArgumentException if the alias is for itself - */ - public function setAlias(string $alias, $id) - { - if ('' === $alias || '\\' === $alias[-1] || \strlen($alias) !== strcspn($alias, "\0\r\n'")) { - throw new InvalidArgumentException(sprintf('Invalid alias id: "%s".', $alias)); - } - - if (\is_string($id)) { - $id = new Alias($id); - } elseif (!$id instanceof Alias) { - throw new InvalidArgumentException('$id must be a string, or an Alias object.'); - } - - if ($alias === (string) $id) { - throw new InvalidArgumentException(sprintf('An alias can not reference itself, got a circular reference on "%s".', $alias)); - } - - unset($this->definitions[$alias], $this->removedIds[$alias]); - - return $this->aliasDefinitions[$alias] = $id; - } - - /** - * Removes an alias. - * - * @param string $alias The alias to remove - */ - public function removeAlias(string $alias) - { - if (isset($this->aliasDefinitions[$alias])) { - unset($this->aliasDefinitions[$alias]); - $this->removedIds[$alias] = true; - } - } - - /** - * Returns true if an alias exists under the given identifier. - * - * @return bool true if the alias exists, false otherwise - */ - public function hasAlias(string $id) - { - return isset($this->aliasDefinitions[$id]); - } - - /** - * Gets all defined aliases. - * - * @return Alias[] An array of aliases - */ - public function getAliases() - { - return $this->aliasDefinitions; - } - - /** - * Gets an alias. - * - * @return Alias An Alias instance - * - * @throws InvalidArgumentException if the alias does not exist - */ - public function getAlias(string $id) - { - if (!isset($this->aliasDefinitions[$id])) { - throw new InvalidArgumentException(sprintf('The service alias "%s" does not exist.', $id)); - } - - return $this->aliasDefinitions[$id]; - } - - /** - * Registers a service definition. - * - * This methods allows for simple registration of service definition - * with a fluid interface. - * - * @return Definition A Definition instance - */ - public function register(string $id, string $class = null) - { - return $this->setDefinition($id, new Definition($class)); - } - - /** - * Registers an autowired service definition. - * - * This method implements a shortcut for using setDefinition() with - * an autowired definition. - * - * @return Definition The created definition - */ - public function autowire(string $id, string $class = null) - { - return $this->setDefinition($id, (new Definition($class))->setAutowired(true)); - } - - /** - * Adds the service definitions. - * - * @param Definition[] $definitions An array of service definitions - */ - public function addDefinitions(array $definitions) - { - foreach ($definitions as $id => $definition) { - $this->setDefinition($id, $definition); - } - } - - /** - * Sets the service definitions. - * - * @param Definition[] $definitions An array of service definitions - */ - public function setDefinitions(array $definitions) - { - $this->definitions = []; - $this->addDefinitions($definitions); - } - - /** - * Gets all service definitions. - * - * @return Definition[] An array of Definition instances - */ - public function getDefinitions() - { - return $this->definitions; - } - - /** - * Sets a service definition. - * - * @return Definition the service definition - * - * @throws BadMethodCallException When this ContainerBuilder is compiled - */ - public function setDefinition(string $id, Definition $definition) - { - if ($this->isCompiled()) { - throw new BadMethodCallException('Adding definition to a compiled container is not allowed.'); - } - - if ('' === $id || '\\' === $id[-1] || \strlen($id) !== strcspn($id, "\0\r\n'")) { - throw new InvalidArgumentException(sprintf('Invalid service id: "%s".', $id)); - } - - unset($this->aliasDefinitions[$id], $this->removedIds[$id]); - - return $this->definitions[$id] = $definition; - } - - /** - * Returns true if a service definition exists under the given identifier. - * - * @return bool true if the service definition exists, false otherwise - */ - public function hasDefinition(string $id) - { - return isset($this->definitions[$id]); - } - - /** - * Gets a service definition. - * - * @return Definition A Definition instance - * - * @throws ServiceNotFoundException if the service definition does not exist - */ - public function getDefinition(string $id) - { - if (!isset($this->definitions[$id])) { - throw new ServiceNotFoundException($id); - } - - return $this->definitions[$id]; - } - - /** - * Gets a service definition by id or alias. - * - * The method "unaliases" recursively to return a Definition instance. - * - * @return Definition A Definition instance - * - * @throws ServiceNotFoundException if the service definition does not exist - */ - public function findDefinition(string $id) - { - $seen = []; - while (isset($this->aliasDefinitions[$id])) { - $id = (string) $this->aliasDefinitions[$id]; - - if (isset($seen[$id])) { - $seen = array_values($seen); - $seen = \array_slice($seen, array_search($id, $seen)); - $seen[] = $id; - - throw new ServiceCircularReferenceException($id, $seen); - } - - $seen[$id] = $id; - } - - return $this->getDefinition($id); - } - - /** - * Creates a service for a service definition. - * - * @return mixed The service described by the service definition - * - * @throws RuntimeException When the factory definition is incomplete - * @throws RuntimeException When the service is a synthetic service - * @throws InvalidArgumentException When configure callable is not callable - */ - private function createService(Definition $definition, array &$inlineServices, bool $isConstructorArgument = false, string $id = null, bool $tryProxy = true) - { - if (null === $id && isset($inlineServices[$h = spl_object_hash($definition)])) { - return $inlineServices[$h]; - } - - if ($definition instanceof ChildDefinition) { - throw new RuntimeException(sprintf('Constructing service "%s" from a parent definition is not supported at build time.', $id)); - } - - if ($definition->isSynthetic()) { - throw new RuntimeException(sprintf('You have requested a synthetic service ("%s"). The DIC does not know how to construct this service.', $id)); - } - - if ($definition->isDeprecated()) { - $deprecation = $definition->getDeprecation($id); - trigger_deprecation($deprecation['package'], $deprecation['version'], $deprecation['message']); - } - - if ($tryProxy && $definition->isLazy() && !$tryProxy = !($proxy = $this->proxyInstantiator) || $proxy instanceof RealServiceInstantiator) { - $proxy = $proxy->instantiateProxy( - $this, - $definition, - $id, function () use ($definition, &$inlineServices, $id) { - return $this->createService($definition, $inlineServices, true, $id, false); - } - ); - $this->shareService($definition, $proxy, $id, $inlineServices); - - return $proxy; - } - - $parameterBag = $this->getParameterBag(); - - if (null !== $definition->getFile()) { - require_once $parameterBag->resolveValue($definition->getFile()); - } - - $arguments = $this->doResolveServices($parameterBag->unescapeValue($parameterBag->resolveValue($definition->getArguments())), $inlineServices, $isConstructorArgument); - - if (null !== $factory = $definition->getFactory()) { - if (\is_array($factory)) { - $factory = [$this->doResolveServices($parameterBag->resolveValue($factory[0]), $inlineServices, $isConstructorArgument), $factory[1]]; - } elseif (!\is_string($factory)) { - throw new RuntimeException(sprintf('Cannot create service "%s" because of invalid factory.', $id)); - } - } - - if (null !== $id && $definition->isShared() && isset($this->services[$id]) && ($tryProxy || !$definition->isLazy())) { - return $this->services[$id]; - } - - if (null !== $factory) { - $service = $factory(...$arguments); - - if (!$definition->isDeprecated() && \is_array($factory) && \is_string($factory[0])) { - $r = new \ReflectionClass($factory[0]); - - if (0 < strpos($r->getDocComment(), "\n * @deprecated ")) { - trigger_deprecation('', '', 'The "%s" service relies on the deprecated "%s" factory class. It should either be deprecated or its factory upgraded.', $id, $r->name); - } - } - } else { - $r = new \ReflectionClass($parameterBag->resolveValue($definition->getClass())); - - $service = null === $r->getConstructor() ? $r->newInstance() : $r->newInstanceArgs($arguments); - - if (!$definition->isDeprecated() && 0 < strpos($r->getDocComment(), "\n * @deprecated ")) { - trigger_deprecation('', '', 'The "%s" service relies on the deprecated "%s" class. It should either be deprecated or its implementation upgraded.', $id, $r->name); - } - } - - $lastWitherIndex = null; - foreach ($definition->getMethodCalls() as $k => $call) { - if ($call[2] ?? false) { - $lastWitherIndex = $k; - } - } - - if (null === $lastWitherIndex && ($tryProxy || !$definition->isLazy())) { - // share only if proxying failed, or if not a proxy, and if no withers are found - $this->shareService($definition, $service, $id, $inlineServices); - } - - $properties = $this->doResolveServices($parameterBag->unescapeValue($parameterBag->resolveValue($definition->getProperties())), $inlineServices); - foreach ($properties as $name => $value) { - $service->$name = $value; - } - - foreach ($definition->getMethodCalls() as $k => $call) { - $service = $this->callMethod($service, $call, $inlineServices); - - if ($lastWitherIndex === $k && ($tryProxy || !$definition->isLazy())) { - // share only if proxying failed, or if not a proxy, and this is the last wither - $this->shareService($definition, $service, $id, $inlineServices); - } - } - - if ($callable = $definition->getConfigurator()) { - if (\is_array($callable)) { - $callable[0] = $parameterBag->resolveValue($callable[0]); - - if ($callable[0] instanceof Reference) { - $callable[0] = $this->doGet((string) $callable[0], $callable[0]->getInvalidBehavior(), $inlineServices); - } elseif ($callable[0] instanceof Definition) { - $callable[0] = $this->createService($callable[0], $inlineServices); - } - } - - if (!\is_callable($callable)) { - throw new InvalidArgumentException(sprintf('The configure callable for class "%s" is not a callable.', get_debug_type($service))); - } - - $callable($service); - } - - return $service; - } - - /** - * Replaces service references by the real service instance and evaluates expressions. - * - * @param mixed $value A value - * - * @return mixed The same value with all service references replaced by - * the real service instances and all expressions evaluated - */ - public function resolveServices($value) - { - return $this->doResolveServices($value); - } - - private function doResolveServices($value, array &$inlineServices = [], bool $isConstructorArgument = false) - { - if (\is_array($value)) { - foreach ($value as $k => $v) { - $value[$k] = $this->doResolveServices($v, $inlineServices, $isConstructorArgument); - } - } elseif ($value instanceof ServiceClosureArgument) { - $reference = $value->getValues()[0]; - $value = function () use ($reference) { - return $this->resolveServices($reference); - }; - } elseif ($value instanceof IteratorArgument) { - $value = new RewindableGenerator(function () use ($value) { - foreach ($value->getValues() as $k => $v) { - foreach (self::getServiceConditionals($v) as $s) { - if (!$this->has($s)) { - continue 2; - } - } - foreach (self::getInitializedConditionals($v) as $s) { - if (!$this->doGet($s, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE)) { - continue 2; - } - } - - yield $k => $this->resolveServices($v); - } - }, function () use ($value): int { - $count = 0; - foreach ($value->getValues() as $v) { - foreach (self::getServiceConditionals($v) as $s) { - if (!$this->has($s)) { - continue 2; - } - } - foreach (self::getInitializedConditionals($v) as $s) { - if (!$this->doGet($s, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE)) { - continue 2; - } - } - - ++$count; - } - - return $count; - }); - } elseif ($value instanceof ServiceLocatorArgument) { - $refs = $types = []; - foreach ($value->getValues() as $k => $v) { - if ($v) { - $refs[$k] = [$v]; - $types[$k] = $v instanceof TypedReference ? $v->getType() : '?'; - } - } - $value = new ServiceLocator(\Closure::fromCallable([$this, 'resolveServices']), $refs, $types); - } elseif ($value instanceof Reference) { - $value = $this->doGet((string) $value, $value->getInvalidBehavior(), $inlineServices, $isConstructorArgument); - } elseif ($value instanceof Definition) { - $value = $this->createService($value, $inlineServices, $isConstructorArgument); - } elseif ($value instanceof Parameter) { - $value = $this->getParameter((string) $value); - } elseif ($value instanceof Expression) { - $value = $this->getExpressionLanguage()->evaluate($value, ['container' => $this]); - } elseif ($value instanceof AbstractArgument) { - throw new RuntimeException($value->getTextWithContext()); - } - - return $value; - } - - /** - * Returns service ids for a given tag. - * - * Example: - * - * $container->register('foo')->addTag('my.tag', ['hello' => 'world']); - * - * $serviceIds = $container->findTaggedServiceIds('my.tag'); - * foreach ($serviceIds as $serviceId => $tags) { - * foreach ($tags as $tag) { - * echo $tag['hello']; - * } - * } - * - * @return array An array of tags with the tagged service as key, holding a list of attribute arrays - */ - public function findTaggedServiceIds(string $name, bool $throwOnAbstract = false) - { - $this->usedTags[] = $name; - $tags = []; - foreach ($this->getDefinitions() as $id => $definition) { - if ($definition->hasTag($name)) { - if ($throwOnAbstract && $definition->isAbstract()) { - throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must not be abstract.', $id, $name)); - } - $tags[$id] = $definition->getTag($name); - } - } - - return $tags; - } - - /** - * Returns all tags the defined services use. - * - * @return array An array of tags - */ - public function findTags() - { - $tags = []; - foreach ($this->getDefinitions() as $id => $definition) { - $tags = array_merge(array_keys($definition->getTags()), $tags); - } - - return array_unique($tags); - } - - /** - * Returns all tags not queried by findTaggedServiceIds. - * - * @return string[] An array of tags - */ - public function findUnusedTags() - { - return array_values(array_diff($this->findTags(), $this->usedTags)); - } - - public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider) - { - $this->expressionLanguageProviders[] = $provider; - } - - /** - * @return ExpressionFunctionProviderInterface[] - */ - public function getExpressionLanguageProviders() - { - return $this->expressionLanguageProviders; - } - - /** - * Returns a ChildDefinition that will be used for autoconfiguring the interface/class. - * - * @return ChildDefinition - */ - public function registerForAutoconfiguration(string $interface) - { - if (!isset($this->autoconfiguredInstanceof[$interface])) { - $this->autoconfiguredInstanceof[$interface] = new ChildDefinition(''); - } - - return $this->autoconfiguredInstanceof[$interface]; - } - - /** - * Registers an autowiring alias that only binds to a specific argument name. - * - * The argument name is derived from $name if provided (from $id otherwise) - * using camel case: "foo.bar" or "foo_bar" creates an alias bound to - * "$fooBar"-named arguments with $type as type-hint. Such arguments will - * receive the service $id when autowiring is used. - */ - public function registerAliasForArgument(string $id, string $type, string $name = null): Alias - { - $name = lcfirst(str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $name ?? $id)))); - - if (!preg_match('/^[a-zA-Z_\x7f-\xff]/', $name)) { - throw new InvalidArgumentException(sprintf('Invalid argument name "%s" for service "%s": the first character must be a letter.', $name, $id)); - } - - return $this->setAlias($type.' $'.$name, $id); - } - - /** - * Returns an array of ChildDefinition[] keyed by interface. - * - * @return ChildDefinition[] - */ - public function getAutoconfiguredInstanceof() - { - return $this->autoconfiguredInstanceof; - } - - /** - * Resolves env parameter placeholders in a string or an array. - * - * @param mixed $value The value to resolve - * @param string|true|null $format A sprintf() format returning the replacement for each env var name or - * null to resolve back to the original "%env(VAR)%" format or - * true to resolve to the actual values of the referenced env vars - * @param array &$usedEnvs Env vars found while resolving are added to this array - * - * @return mixed The value with env parameters resolved if a string or an array is passed - */ - public function resolveEnvPlaceholders($value, $format = null, array &$usedEnvs = null) - { - if (null === $format) { - $format = '%%env(%s)%%'; - } - - $bag = $this->getParameterBag(); - if (true === $format) { - $value = $bag->resolveValue($value); - } - - if ($value instanceof Definition) { - $value = (array) $value; - } - - if (\is_array($value)) { - $result = []; - foreach ($value as $k => $v) { - $result[\is_string($k) ? $this->resolveEnvPlaceholders($k, $format, $usedEnvs) : $k] = $this->resolveEnvPlaceholders($v, $format, $usedEnvs); - } - - return $result; - } - - if (!\is_string($value) || 38 > \strlen($value)) { - return $value; - } - $envPlaceholders = $bag instanceof EnvPlaceholderParameterBag ? $bag->getEnvPlaceholders() : $this->envPlaceholders; - - $completed = false; - foreach ($envPlaceholders as $env => $placeholders) { - foreach ($placeholders as $placeholder) { - if (false !== stripos($value, $placeholder)) { - if (true === $format) { - $resolved = $bag->escapeValue($this->getEnv($env)); - } else { - $resolved = sprintf($format, $env); - } - if ($placeholder === $value) { - $value = $resolved; - $completed = true; - } else { - if (!\is_string($resolved) && !is_numeric($resolved)) { - throw new RuntimeException(sprintf('A string value must be composed of strings and/or numbers, but found parameter "env(%s)" of type "%s" inside string value "%s".', $env, get_debug_type($resolved), $this->resolveEnvPlaceholders($value))); - } - $value = str_ireplace($placeholder, $resolved, $value); - } - $usedEnvs[$env] = $env; - $this->envCounters[$env] = isset($this->envCounters[$env]) ? 1 + $this->envCounters[$env] : 1; - - if ($completed) { - break 2; - } - } - } - } - - return $value; - } - - /** - * Get statistics about env usage. - * - * @return int[] The number of time each env vars has been resolved - */ - public function getEnvCounters() - { - $bag = $this->getParameterBag(); - $envPlaceholders = $bag instanceof EnvPlaceholderParameterBag ? $bag->getEnvPlaceholders() : $this->envPlaceholders; - - foreach ($envPlaceholders as $env => $placeholders) { - if (!isset($this->envCounters[$env])) { - $this->envCounters[$env] = 0; - } - } - - return $this->envCounters; - } - - /** - * @final - */ - public function log(CompilerPassInterface $pass, string $message) - { - $this->getCompiler()->log($pass, $this->resolveEnvPlaceholders($message)); - } - - /** - * Gets removed binding ids. - * - * @internal - */ - public function getRemovedBindingIds(): array - { - return $this->removedBindingIds; - } - - /** - * Removes bindings for a service. - * - * @internal - */ - public function removeBindings(string $id) - { - if ($this->hasDefinition($id)) { - foreach ($this->getDefinition($id)->getBindings() as $key => $binding) { - list(, $bindingId) = $binding->getValues(); - $this->removedBindingIds[(int) $bindingId] = true; - } - } - } - - /** - * Returns the Service Conditionals. - * - * @param mixed $value An array of conditionals to return - * - * @internal - */ - public static function getServiceConditionals($value): array - { - $services = []; - - if (\is_array($value)) { - foreach ($value as $v) { - $services = array_unique(array_merge($services, self::getServiceConditionals($v))); - } - } elseif ($value instanceof Reference && ContainerInterface::IGNORE_ON_INVALID_REFERENCE === $value->getInvalidBehavior()) { - $services[] = (string) $value; - } - - return $services; - } - - /** - * Returns the initialized conditionals. - * - * @param mixed $value An array of conditionals to return - * - * @internal - */ - public static function getInitializedConditionals($value): array - { - $services = []; - - if (\is_array($value)) { - foreach ($value as $v) { - $services = array_unique(array_merge($services, self::getInitializedConditionals($v))); - } - } elseif ($value instanceof Reference && ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $value->getInvalidBehavior()) { - $services[] = (string) $value; - } - - return $services; - } - - /** - * Computes a reasonably unique hash of a value. - * - * @param mixed $value A serializable value - * - * @return string - */ - public static function hash($value) - { - $hash = substr(base64_encode(hash('sha256', serialize($value), true)), 0, 7); - - return str_replace(['/', '+'], ['.', '_'], $hash); - } - - /** - * {@inheritdoc} - */ - protected function getEnv($name) - { - $value = parent::getEnv($name); - $bag = $this->getParameterBag(); - - if (!\is_string($value) || !$bag instanceof EnvPlaceholderParameterBag) { - return $value; - } - - $envPlaceholders = $bag->getEnvPlaceholders(); - if (isset($envPlaceholders[$name][$value])) { - $bag = new ParameterBag($bag->all()); - - return $bag->unescapeValue($bag->get("env($name)")); - } - foreach ($envPlaceholders as $env => $placeholders) { - if (isset($placeholders[$value])) { - return $this->getEnv($env); - } - } - - $this->resolving["env($name)"] = true; - try { - return $bag->unescapeValue($this->resolveEnvPlaceholders($bag->escapeValue($value), true)); - } finally { - unset($this->resolving["env($name)"]); - } - } - - private function callMethod($service, array $call, array &$inlineServices) - { - foreach (self::getServiceConditionals($call[1]) as $s) { - if (!$this->has($s)) { - return $service; - } - } - foreach (self::getInitializedConditionals($call[1]) as $s) { - if (!$this->doGet($s, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE, $inlineServices)) { - return $service; - } - } - - $result = $service->{$call[0]}(...$this->doResolveServices($this->getParameterBag()->unescapeValue($this->getParameterBag()->resolveValue($call[1])), $inlineServices)); - - return empty($call[2]) ? $service : $result; - } - - /** - * Shares a given service in the container. - * - * @param mixed $service - */ - private function shareService(Definition $definition, $service, ?string $id, array &$inlineServices) - { - $inlineServices[null !== $id ? $id : spl_object_hash($definition)] = $service; - - if (null !== $id && $definition->isShared()) { - $this->services[$id] = $service; - unset($this->loading[$id]); - } - } - - private function getExpressionLanguage(): ExpressionLanguage - { - if (null === $this->expressionLanguage) { - if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) { - throw new LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); - } - $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders); - } - - return $this->expressionLanguage; - } - - private function inVendors(string $path): bool - { - if (null === $this->vendors) { - $resource = new ComposerResource(); - $this->vendors = $resource->getVendors(); - $this->addResource($resource); - } - $path = realpath($path) ?: $path; - - foreach ($this->vendors as $vendor) { - if (0 === strpos($path, $vendor) && false !== strpbrk(substr($path, \strlen($vendor), 1), '/'.\DIRECTORY_SEPARATOR)) { - return true; - } - } - - return false; - } -} diff --git a/vendor/symfony/dependency-injection/ContainerInterface.php b/vendor/symfony/dependency-injection/ContainerInterface.php deleted file mode 100644 index 616648f..0000000 --- a/vendor/symfony/dependency-injection/ContainerInterface.php +++ /dev/null @@ -1,96 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Psr\Container\ContainerInterface as PsrContainerInterface; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; -use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; - -/** - * ContainerInterface is the interface implemented by service container classes. - * - * @author Fabien Potencier - * @author Johannes M. Schmitt - */ -interface ContainerInterface extends PsrContainerInterface -{ - const RUNTIME_EXCEPTION_ON_INVALID_REFERENCE = 0; - const EXCEPTION_ON_INVALID_REFERENCE = 1; - const NULL_ON_INVALID_REFERENCE = 2; - const IGNORE_ON_INVALID_REFERENCE = 3; - const IGNORE_ON_UNINITIALIZED_REFERENCE = 4; - - /** - * Sets a service. - */ - public function set(string $id, ?object $service); - - /** - * Gets a service. - * - * @param string $id The service identifier - * @param int $invalidBehavior The behavior when the service does not exist - * - * @return object|null The associated service - * - * @throws ServiceCircularReferenceException When a circular reference is detected - * @throws ServiceNotFoundException When the service is not defined - * - * @see Reference - */ - public function get($id, int $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE); - - /** - * Returns true if the given service is defined. - * - * @param string $id The service identifier - * - * @return bool true if the service is defined, false otherwise - */ - public function has($id); - - /** - * Check for whether or not a service has been initialized. - * - * @return bool true if the service has been initialized, false otherwise - */ - public function initialized(string $id); - - /** - * Gets a parameter. - * - * @param string $name The parameter name - * - * @return mixed The parameter value - * - * @throws InvalidArgumentException if the parameter is not defined - */ - public function getParameter(string $name); - - /** - * Checks if a parameter exists. - * - * @param string $name The parameter name - * - * @return bool The presence of parameter in container - */ - public function hasParameter(string $name); - - /** - * Sets a parameter. - * - * @param string $name The parameter name - * @param mixed $value The parameter value - */ - public function setParameter(string $name, $value); -} diff --git a/vendor/symfony/dependency-injection/Definition.php b/vendor/symfony/dependency-injection/Definition.php deleted file mode 100644 index 163ce42..0000000 --- a/vendor/symfony/dependency-injection/Definition.php +++ /dev/null @@ -1,924 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Symfony\Component\DependencyInjection\Argument\BoundArgument; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException; - -/** - * Definition represents a service definition. - * - * @author Fabien Potencier - */ -class Definition -{ - private $class; - private $file; - private $factory; - private $shared = true; - private $deprecation = []; - private $properties = []; - private $calls = []; - private $instanceof = []; - private $autoconfigured = false; - private $configurator; - private $tags = []; - private $public = true; - private $private = true; - private $synthetic = false; - private $abstract = false; - private $lazy = false; - private $decoratedService; - private $autowired = false; - private $changes = []; - private $bindings = []; - private $errors = []; - - protected $arguments = []; - - private static $defaultDeprecationTemplate = 'The "%service_id%" service is deprecated. You should stop using it, as it will be removed in the future.'; - - /** - * @internal - * - * Used to store the name of the inner id when using service decoration together with autowiring - */ - public $innerServiceId; - - /** - * @internal - * - * Used to store the behavior to follow when using service decoration and the decorated service is invalid - */ - public $decorationOnInvalid; - - public function __construct(string $class = null, array $arguments = []) - { - if (null !== $class) { - $this->setClass($class); - } - $this->arguments = $arguments; - } - - /** - * Returns all changes tracked for the Definition object. - * - * @return array An array of changes for this Definition - */ - public function getChanges() - { - return $this->changes; - } - - /** - * Sets the tracked changes for the Definition object. - * - * @param array $changes An array of changes for this Definition - * - * @return $this - */ - public function setChanges(array $changes) - { - $this->changes = $changes; - - return $this; - } - - /** - * Sets a factory. - * - * @param string|array|Reference $factory A PHP function, reference or an array containing a class/Reference and a method to call - * - * @return $this - */ - public function setFactory($factory) - { - $this->changes['factory'] = true; - - if (\is_string($factory) && false !== strpos($factory, '::')) { - $factory = explode('::', $factory, 2); - } elseif ($factory instanceof Reference) { - $factory = [$factory, '__invoke']; - } - - $this->factory = $factory; - - return $this; - } - - /** - * Gets the factory. - * - * @return string|array|null The PHP function or an array containing a class/Reference and a method to call - */ - public function getFactory() - { - return $this->factory; - } - - /** - * Sets the service that this service is decorating. - * - * @param string|null $id The decorated service id, use null to remove decoration - * @param string|null $renamedId The new decorated service id - * - * @return $this - * - * @throws InvalidArgumentException in case the decorated service id and the new decorated service id are equals - */ - public function setDecoratedService(?string $id, ?string $renamedId = null, int $priority = 0, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE) - { - if ($renamedId && $id === $renamedId) { - throw new InvalidArgumentException(sprintf('The decorated service inner name for "%s" must be different than the service name itself.', $id)); - } - - $this->changes['decorated_service'] = true; - - if (null === $id) { - $this->decoratedService = null; - } else { - $this->decoratedService = [$id, $renamedId, (int) $priority]; - - if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) { - $this->decoratedService[] = $invalidBehavior; - } - } - - return $this; - } - - /** - * Gets the service that this service is decorating. - * - * @return array|null An array composed of the decorated service id, the new id for it and the priority of decoration, null if no service is decorated - */ - public function getDecoratedService() - { - return $this->decoratedService; - } - - /** - * Sets the service class. - * - * @return $this - */ - public function setClass(?string $class) - { - $this->changes['class'] = true; - - $this->class = $class; - - return $this; - } - - /** - * Gets the service class. - * - * @return string|null The service class - */ - public function getClass() - { - return $this->class; - } - - /** - * Sets the arguments to pass to the service constructor/factory method. - * - * @return $this - */ - public function setArguments(array $arguments) - { - $this->arguments = $arguments; - - return $this; - } - - /** - * Sets the properties to define when creating the service. - * - * @return $this - */ - public function setProperties(array $properties) - { - $this->properties = $properties; - - return $this; - } - - /** - * Gets the properties to define when creating the service. - * - * @return array - */ - public function getProperties() - { - return $this->properties; - } - - /** - * Sets a specific property. - * - * @param mixed $value - * - * @return $this - */ - public function setProperty(string $name, $value) - { - $this->properties[$name] = $value; - - return $this; - } - - /** - * Adds an argument to pass to the service constructor/factory method. - * - * @param mixed $argument An argument - * - * @return $this - */ - public function addArgument($argument) - { - $this->arguments[] = $argument; - - return $this; - } - - /** - * Replaces a specific argument. - * - * @param int|string $index - * @param mixed $argument - * - * @return $this - * - * @throws OutOfBoundsException When the replaced argument does not exist - */ - public function replaceArgument($index, $argument) - { - if (0 === \count($this->arguments)) { - throw new OutOfBoundsException('Cannot replace arguments if none have been configured yet.'); - } - - if (\is_int($index) && ($index < 0 || $index > \count($this->arguments) - 1)) { - throw new OutOfBoundsException(sprintf('The index "%d" is not in the range [0, %d].', $index, \count($this->arguments) - 1)); - } - - if (!\array_key_exists($index, $this->arguments)) { - throw new OutOfBoundsException(sprintf('The argument "%s" doesn\'t exist.', $index)); - } - - $this->arguments[$index] = $argument; - - return $this; - } - - /** - * Sets a specific argument. - * - * @param int|string $key - * @param mixed $value - * - * @return $this - */ - public function setArgument($key, $value) - { - $this->arguments[$key] = $value; - - return $this; - } - - /** - * Gets the arguments to pass to the service constructor/factory method. - * - * @return array The array of arguments - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Gets an argument to pass to the service constructor/factory method. - * - * @param int|string $index - * - * @return mixed The argument value - * - * @throws OutOfBoundsException When the argument does not exist - */ - public function getArgument($index) - { - if (!\array_key_exists($index, $this->arguments)) { - throw new OutOfBoundsException(sprintf('The argument "%s" doesn\'t exist.', $index)); - } - - return $this->arguments[$index]; - } - - /** - * Sets the methods to call after service initialization. - * - * @return $this - */ - public function setMethodCalls(array $calls = []) - { - $this->calls = []; - foreach ($calls as $call) { - $this->addMethodCall($call[0], $call[1], $call[2] ?? false); - } - - return $this; - } - - /** - * Adds a method to call after service initialization. - * - * @param string $method The method name to call - * @param array $arguments An array of arguments to pass to the method call - * @param bool $returnsClone Whether the call returns the service instance or not - * - * @return $this - * - * @throws InvalidArgumentException on empty $method param - */ - public function addMethodCall(string $method, array $arguments = [], bool $returnsClone = false) - { - if (empty($method)) { - throw new InvalidArgumentException('Method name cannot be empty.'); - } - $this->calls[] = $returnsClone ? [$method, $arguments, true] : [$method, $arguments]; - - return $this; - } - - /** - * Removes a method to call after service initialization. - * - * @return $this - */ - public function removeMethodCall(string $method) - { - foreach ($this->calls as $i => $call) { - if ($call[0] === $method) { - unset($this->calls[$i]); - break; - } - } - - return $this; - } - - /** - * Check if the current definition has a given method to call after service initialization. - * - * @return bool - */ - public function hasMethodCall(string $method) - { - foreach ($this->calls as $call) { - if ($call[0] === $method) { - return true; - } - } - - return false; - } - - /** - * Gets the methods to call after service initialization. - * - * @return array An array of method calls - */ - public function getMethodCalls() - { - return $this->calls; - } - - /** - * Sets the definition templates to conditionally apply on the current definition, keyed by parent interface/class. - * - * @param ChildDefinition[] $instanceof - * - * @return $this - */ - public function setInstanceofConditionals(array $instanceof) - { - $this->instanceof = $instanceof; - - return $this; - } - - /** - * Gets the definition templates to conditionally apply on the current definition, keyed by parent interface/class. - * - * @return ChildDefinition[] - */ - public function getInstanceofConditionals() - { - return $this->instanceof; - } - - /** - * Sets whether or not instanceof conditionals should be prepended with a global set. - * - * @return $this - */ - public function setAutoconfigured(bool $autoconfigured) - { - $this->changes['autoconfigured'] = true; - - $this->autoconfigured = $autoconfigured; - - return $this; - } - - /** - * @return bool - */ - public function isAutoconfigured() - { - return $this->autoconfigured; - } - - /** - * Sets tags for this definition. - * - * @return $this - */ - public function setTags(array $tags) - { - $this->tags = $tags; - - return $this; - } - - /** - * Returns all tags. - * - * @return array An array of tags - */ - public function getTags() - { - return $this->tags; - } - - /** - * Gets a tag by name. - * - * @return array An array of attributes - */ - public function getTag(string $name) - { - return isset($this->tags[$name]) ? $this->tags[$name] : []; - } - - /** - * Adds a tag for this definition. - * - * @return $this - */ - public function addTag(string $name, array $attributes = []) - { - $this->tags[$name][] = $attributes; - - return $this; - } - - /** - * Whether this definition has a tag with the given name. - * - * @return bool - */ - public function hasTag(string $name) - { - return isset($this->tags[$name]); - } - - /** - * Clears all tags for a given name. - * - * @return $this - */ - public function clearTag(string $name) - { - unset($this->tags[$name]); - - return $this; - } - - /** - * Clears the tags for this definition. - * - * @return $this - */ - public function clearTags() - { - $this->tags = []; - - return $this; - } - - /** - * Sets a file to require before creating the service. - * - * @return $this - */ - public function setFile(?string $file) - { - $this->changes['file'] = true; - - $this->file = $file; - - return $this; - } - - /** - * Gets the file to require before creating the service. - * - * @return string|null The full pathname to include - */ - public function getFile() - { - return $this->file; - } - - /** - * Sets if the service must be shared or not. - * - * @return $this - */ - public function setShared(bool $shared) - { - $this->changes['shared'] = true; - - $this->shared = $shared; - - return $this; - } - - /** - * Whether this service is shared. - * - * @return bool - */ - public function isShared() - { - return $this->shared; - } - - /** - * Sets the visibility of this service. - * - * @return $this - */ - public function setPublic(bool $boolean) - { - $this->changes['public'] = true; - - $this->public = $boolean; - $this->private = false; - - return $this; - } - - /** - * Whether this service is public facing. - * - * @return bool - */ - public function isPublic() - { - return $this->public; - } - - /** - * Sets if this service is private. - * - * When set, the "private" state has a higher precedence than "public". - * In version 3.4, a "private" service always remains publicly accessible, - * but triggers a deprecation notice when accessed from the container, - * so that the service can be made really private in 4.0. - * - * @return $this - */ - public function setPrivate(bool $boolean) - { - $this->private = $boolean; - - return $this; - } - - /** - * Whether this service is private. - * - * @return bool - */ - public function isPrivate() - { - return $this->private; - } - - /** - * Sets the lazy flag of this service. - * - * @return $this - */ - public function setLazy(bool $lazy) - { - $this->changes['lazy'] = true; - - $this->lazy = $lazy; - - return $this; - } - - /** - * Whether this service is lazy. - * - * @return bool - */ - public function isLazy() - { - return $this->lazy; - } - - /** - * Sets whether this definition is synthetic, that is not constructed by the - * container, but dynamically injected. - * - * @return $this - */ - public function setSynthetic(bool $boolean) - { - $this->synthetic = $boolean; - - return $this; - } - - /** - * Whether this definition is synthetic, that is not constructed by the - * container, but dynamically injected. - * - * @return bool - */ - public function isSynthetic() - { - return $this->synthetic; - } - - /** - * Whether this definition is abstract, that means it merely serves as a - * template for other definitions. - * - * @return $this - */ - public function setAbstract(bool $boolean) - { - $this->abstract = $boolean; - - return $this; - } - - /** - * Whether this definition is abstract, that means it merely serves as a - * template for other definitions. - * - * @return bool - */ - public function isAbstract() - { - return $this->abstract; - } - - /** - * Whether this definition is deprecated, that means it should not be called - * anymore. - * - * @param string $package The name of the composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string $message The deprecation message to use - * - * @return $this - * - * @throws InvalidArgumentException when the message template is invalid - */ - public function setDeprecated(/* string $package, string $version, string $message */) - { - $args = \func_get_args(); - - if (\func_num_args() < 3) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'The signature of method "%s()" requires 3 arguments: "string $package, string $version, string $message", not defining them is deprecated.', __METHOD__); - - $status = $args[0] ?? true; - - if (!$status) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'Passing a null message to un-deprecate a node is deprecated.'); - } - - $message = (string) ($args[1] ?? null); - $package = $version = ''; - } else { - $status = true; - $package = (string) $args[0]; - $version = (string) $args[1]; - $message = (string) $args[2]; - } - - if ('' !== $message) { - if (preg_match('#[\r\n]|\*/#', $message)) { - throw new InvalidArgumentException('Invalid characters found in deprecation template.'); - } - - if (false === strpos($message, '%service_id%')) { - throw new InvalidArgumentException('The deprecation template must contain the "%service_id%" placeholder.'); - } - } - - $this->changes['deprecated'] = true; - $this->deprecation = $status ? ['package' => $package, 'version' => $version, 'message' => $message ?: self::$defaultDeprecationTemplate] : []; - - return $this; - } - - /** - * Whether this definition is deprecated, that means it should not be called - * anymore. - * - * @return bool - */ - public function isDeprecated() - { - return (bool) $this->deprecation; - } - - /** - * Message to use if this definition is deprecated. - * - * @deprecated since Symfony 5.1, use "getDeprecation()" instead. - * - * @param string $id Service id relying on this definition - * - * @return string - */ - public function getDeprecationMessage(string $id) - { - trigger_deprecation('symfony/dependency-injection', '5.1', 'The "%s()" method is deprecated, use "getDeprecation()" instead.', __METHOD__); - - return $this->getDeprecation($id)['message']; - } - - /** - * @param string $id Service id relying on this definition - */ - public function getDeprecation(string $id): array - { - return [ - 'package' => $this->deprecation['package'], - 'version' => $this->deprecation['version'], - 'message' => str_replace('%service_id%', $id, $this->deprecation['message']), - ]; - } - - /** - * Sets a configurator to call after the service is fully initialized. - * - * @param string|array|Reference $configurator A PHP function, reference or an array containing a class/Reference and a method to call - * - * @return $this - */ - public function setConfigurator($configurator) - { - $this->changes['configurator'] = true; - - if (\is_string($configurator) && false !== strpos($configurator, '::')) { - $configurator = explode('::', $configurator, 2); - } elseif ($configurator instanceof Reference) { - $configurator = [$configurator, '__invoke']; - } - - $this->configurator = $configurator; - - return $this; - } - - /** - * Gets the configurator to call after the service is fully initialized. - * - * @return callable|array|null - */ - public function getConfigurator() - { - return $this->configurator; - } - - /** - * Is the definition autowired? - * - * @return bool - */ - public function isAutowired() - { - return $this->autowired; - } - - /** - * Enables/disables autowiring. - * - * @return $this - */ - public function setAutowired(bool $autowired) - { - $this->changes['autowired'] = true; - - $this->autowired = $autowired; - - return $this; - } - - /** - * Gets bindings. - * - * @return array|BoundArgument[] - */ - public function getBindings() - { - return $this->bindings; - } - - /** - * Sets bindings. - * - * Bindings map $named or FQCN arguments to values that should be - * injected in the matching parameters (of the constructor, of methods - * called and of controller actions). - * - * @return $this - */ - public function setBindings(array $bindings) - { - foreach ($bindings as $key => $binding) { - if (0 < strpos($key, '$') && $key !== $k = preg_replace('/[ \t]*\$/', ' $', $key)) { - unset($bindings[$key]); - $bindings[$key = $k] = $binding; - } - if (!$binding instanceof BoundArgument) { - $bindings[$key] = new BoundArgument($binding); - } - } - - $this->bindings = $bindings; - - return $this; - } - - /** - * Add an error that occurred when building this Definition. - * - * @param string|\Closure|self $error - * - * @return $this - */ - public function addError($error) - { - if ($error instanceof self) { - $this->errors = array_merge($this->errors, $error->errors); - } else { - $this->errors[] = $error; - } - - return $this; - } - - /** - * Returns any errors that occurred while building this Definition. - * - * @return array - */ - public function getErrors() - { - foreach ($this->errors as $i => $error) { - if ($error instanceof \Closure) { - $this->errors[$i] = (string) $error(); - } elseif (!\is_string($error)) { - $this->errors[$i] = (string) $error; - } - } - - return $this->errors; - } - - public function hasErrors(): bool - { - return (bool) $this->errors; - } -} diff --git a/vendor/symfony/dependency-injection/Dumper/Dumper.php b/vendor/symfony/dependency-injection/Dumper/Dumper.php deleted file mode 100644 index e7407b0..0000000 --- a/vendor/symfony/dependency-injection/Dumper/Dumper.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Dumper; - -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * Dumper is the abstract class for all built-in dumpers. - * - * @author Fabien Potencier - */ -abstract class Dumper implements DumperInterface -{ - protected $container; - - public function __construct(ContainerBuilder $container) - { - $this->container = $container; - } -} diff --git a/vendor/symfony/dependency-injection/Dumper/DumperInterface.php b/vendor/symfony/dependency-injection/Dumper/DumperInterface.php deleted file mode 100644 index 8abc192..0000000 --- a/vendor/symfony/dependency-injection/Dumper/DumperInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Dumper; - -/** - * DumperInterface is the interface implemented by service container dumper classes. - * - * @author Fabien Potencier - */ -interface DumperInterface -{ - /** - * Dumps the service container. - * - * @return string|array The representation of the service container - */ - public function dump(array $options = []); -} diff --git a/vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php b/vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php deleted file mode 100644 index 09836cd..0000000 --- a/vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php +++ /dev/null @@ -1,252 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Dumper; - -use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException; -use Symfony\Component\DependencyInjection\Parameter; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; -use Symfony\Component\DependencyInjection\Reference; - -/** - * GraphvizDumper dumps a service container as a graphviz file. - * - * You can convert the generated dot file with the dot utility (http://www.graphviz.org/): - * - * dot -Tpng container.dot > foo.png - * - * @author Fabien Potencier - */ -class GraphvizDumper extends Dumper -{ - private $nodes; - private $edges; - // All values should be strings - private $options = [ - 'graph' => ['ratio' => 'compress'], - 'node' => ['fontsize' => '11', 'fontname' => 'Arial', 'shape' => 'record'], - 'edge' => ['fontsize' => '9', 'fontname' => 'Arial', 'color' => 'grey', 'arrowhead' => 'open', 'arrowsize' => '0.5'], - 'node.instance' => ['fillcolor' => '#9999ff', 'style' => 'filled'], - 'node.definition' => ['fillcolor' => '#eeeeee'], - 'node.missing' => ['fillcolor' => '#ff9999', 'style' => 'filled'], - ]; - - /** - * Dumps the service container as a graphviz graph. - * - * Available options: - * - * * graph: The default options for the whole graph - * * node: The default options for nodes - * * edge: The default options for edges - * * node.instance: The default options for services that are defined directly by object instances - * * node.definition: The default options for services that are defined via service definition instances - * * node.missing: The default options for missing services - * - * @return string The dot representation of the service container - */ - public function dump(array $options = []) - { - foreach (['graph', 'node', 'edge', 'node.instance', 'node.definition', 'node.missing'] as $key) { - if (isset($options[$key])) { - $this->options[$key] = array_merge($this->options[$key], $options[$key]); - } - } - - $this->nodes = $this->findNodes(); - - $this->edges = []; - foreach ($this->container->getDefinitions() as $id => $definition) { - $this->edges[$id] = array_merge( - $this->findEdges($id, $definition->getArguments(), true, ''), - $this->findEdges($id, $definition->getProperties(), false, '') - ); - - foreach ($definition->getMethodCalls() as $call) { - $this->edges[$id] = array_merge( - $this->edges[$id], - $this->findEdges($id, $call[1], false, $call[0].'()') - ); - } - } - - return $this->container->resolveEnvPlaceholders($this->startDot().$this->addNodes().$this->addEdges().$this->endDot(), '__ENV_%s__'); - } - - private function addNodes(): string - { - $code = ''; - foreach ($this->nodes as $id => $node) { - $aliases = $this->getAliases($id); - - $code .= sprintf(" node_%s [label=\"%s\\n%s\\n\", shape=%s%s];\n", $this->dotize($id), $id.($aliases ? ' ('.implode(', ', $aliases).')' : ''), $node['class'], $this->options['node']['shape'], $this->addAttributes($node['attributes'])); - } - - return $code; - } - - private function addEdges(): string - { - $code = ''; - foreach ($this->edges as $id => $edges) { - foreach ($edges as $edge) { - $code .= sprintf(" node_%s -> node_%s [label=\"%s\" style=\"%s\"%s];\n", $this->dotize($id), $this->dotize($edge['to']), $edge['name'], $edge['required'] ? 'filled' : 'dashed', $edge['lazy'] ? ' color="#9999ff"' : ''); - } - } - - return $code; - } - - /** - * Finds all edges belonging to a specific service id. - */ - private function findEdges(string $id, array $arguments, bool $required, string $name, bool $lazy = false): array - { - $edges = []; - foreach ($arguments as $argument) { - if ($argument instanceof Parameter) { - $argument = $this->container->hasParameter($argument) ? $this->container->getParameter($argument) : null; - } elseif (\is_string($argument) && preg_match('/^%([^%]+)%$/', $argument, $match)) { - $argument = $this->container->hasParameter($match[1]) ? $this->container->getParameter($match[1]) : null; - } - - if ($argument instanceof Reference) { - $lazyEdge = $lazy; - - if (!$this->container->has((string) $argument)) { - $this->nodes[(string) $argument] = ['name' => $name, 'required' => $required, 'class' => '', 'attributes' => $this->options['node.missing']]; - } elseif ('service_container' !== (string) $argument) { - $lazyEdge = $lazy || $this->container->getDefinition((string) $argument)->isLazy(); - } - - $edges[] = ['name' => $name, 'required' => $required, 'to' => $argument, 'lazy' => $lazyEdge]; - } elseif ($argument instanceof ArgumentInterface) { - $edges = array_merge($edges, $this->findEdges($id, $argument->getValues(), $required, $name, true)); - } elseif ($argument instanceof Definition) { - $edges = array_merge($edges, - $this->findEdges($id, $argument->getArguments(), $required, ''), - $this->findEdges($id, $argument->getProperties(), false, '') - ); - foreach ($argument->getMethodCalls() as $call) { - $edges = array_merge($edges, $this->findEdges($id, $call[1], false, $call[0].'()')); - } - } elseif (\is_array($argument)) { - $edges = array_merge($edges, $this->findEdges($id, $argument, $required, $name, $lazy)); - } - } - - return $edges; - } - - private function findNodes(): array - { - $nodes = []; - - $container = $this->cloneContainer(); - - foreach ($container->getDefinitions() as $id => $definition) { - $class = $definition->getClass(); - - if ('\\' === substr($class, 0, 1)) { - $class = substr($class, 1); - } - - try { - $class = $this->container->getParameterBag()->resolveValue($class); - } catch (ParameterNotFoundException $e) { - } - - $nodes[$id] = ['class' => str_replace('\\', '\\\\', $class), 'attributes' => array_merge($this->options['node.definition'], ['style' => $definition->isShared() ? 'filled' : 'dotted'])]; - $container->setDefinition($id, new Definition('stdClass')); - } - - foreach ($container->getServiceIds() as $id) { - if (\array_key_exists($id, $container->getAliases())) { - continue; - } - - if (!$container->hasDefinition($id)) { - $nodes[$id] = ['class' => str_replace('\\', '\\\\', \get_class($container->get($id))), 'attributes' => $this->options['node.instance']]; - } - } - - return $nodes; - } - - private function cloneContainer(): ContainerBuilder - { - $parameterBag = new ParameterBag($this->container->getParameterBag()->all()); - - $container = new ContainerBuilder($parameterBag); - $container->setDefinitions($this->container->getDefinitions()); - $container->setAliases($this->container->getAliases()); - $container->setResources($this->container->getResources()); - foreach ($this->container->getExtensions() as $extension) { - $container->registerExtension($extension); - } - - return $container; - } - - private function startDot(): string - { - return sprintf("digraph sc {\n %s\n node [%s];\n edge [%s];\n\n", - $this->addOptions($this->options['graph']), - $this->addOptions($this->options['node']), - $this->addOptions($this->options['edge']) - ); - } - - private function endDot(): string - { - return "}\n"; - } - - private function addAttributes(array $attributes): string - { - $code = []; - foreach ($attributes as $k => $v) { - $code[] = sprintf('%s="%s"', $k, $v); - } - - return $code ? ', '.implode(', ', $code) : ''; - } - - private function addOptions(array $options): string - { - $code = []; - foreach ($options as $k => $v) { - $code[] = sprintf('%s="%s"', $k, $v); - } - - return implode(' ', $code); - } - - private function dotize(string $id): string - { - return preg_replace('/\W/i', '_', $id); - } - - private function getAliases(string $id): array - { - $aliases = []; - foreach ($this->container->getAliases() as $alias => $origin) { - if ($id == $origin) { - $aliases[] = $alias; - } - } - - return $aliases; - } -} diff --git a/vendor/symfony/dependency-injection/Dumper/PhpDumper.php b/vendor/symfony/dependency-injection/Dumper/PhpDumper.php deleted file mode 100644 index cda9a49..0000000 --- a/vendor/symfony/dependency-injection/Dumper/PhpDumper.php +++ /dev/null @@ -1,2184 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Dumper; - -use Composer\Autoload\ClassLoader; -use Symfony\Component\Debug\DebugClassLoader as LegacyDebugClassLoader; -use Symfony\Component\DependencyInjection\Argument\AbstractArgument; -use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; -use Symfony\Component\DependencyInjection\Argument\IteratorArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceLocator; -use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; -use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass; -use Symfony\Component\DependencyInjection\Compiler\CheckCircularReferencesPass; -use Symfony\Component\DependencyInjection\Compiler\ServiceReferenceGraphEdge; -use Symfony\Component\DependencyInjection\Compiler\ServiceReferenceGraphNode; -use Symfony\Component\DependencyInjection\Container; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\EnvParameterException; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\LogicException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; -use Symfony\Component\DependencyInjection\ExpressionLanguage; -use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface as ProxyDumper; -use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\NullDumper; -use Symfony\Component\DependencyInjection\Loader\FileLoader; -use Symfony\Component\DependencyInjection\Parameter; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\DependencyInjection\ServiceLocator as BaseServiceLocator; -use Symfony\Component\DependencyInjection\TypedReference; -use Symfony\Component\DependencyInjection\Variable; -use Symfony\Component\ErrorHandler\DebugClassLoader; -use Symfony\Component\ExpressionLanguage\Expression; -use Symfony\Component\HttpKernel\Kernel; - -/** - * PhpDumper dumps a service container as a PHP class. - * - * @author Fabien Potencier - * @author Johannes M. Schmitt - */ -class PhpDumper extends Dumper -{ - /** - * Characters that might appear in the generated variable name as first character. - */ - const FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz'; - - /** - * Characters that might appear in the generated variable name as any but the first character. - */ - const NON_FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789_'; - - private $definitionVariables; - private $referenceVariables; - private $variableCount; - private $inlinedDefinitions; - private $serviceCalls; - private $reservedVariables = ['instance', 'class', 'this', 'container']; - private $expressionLanguage; - private $targetDirRegex; - private $targetDirMaxMatches; - private $docStar; - private $serviceIdToMethodNameMap; - private $usedMethodNames; - private $namespace; - private $asFiles; - private $hotPathTag; - private $preloadTags; - private $inlineFactories; - private $inlineRequires; - private $inlinedRequires = []; - private $circularReferences = []; - private $singleUsePrivateIds = []; - private $preload = []; - private $addThrow = false; - private $addGetService = false; - private $locatedIds = []; - private $serviceLocatorTag; - private $exportedVariables = []; - private $baseClass; - - /** - * @var ProxyDumper - */ - private $proxyDumper; - - /** - * {@inheritdoc} - */ - public function __construct(ContainerBuilder $container) - { - if (!$container->isCompiled()) { - throw new LogicException('Cannot dump an uncompiled container.'); - } - - parent::__construct($container); - } - - /** - * Sets the dumper to be used when dumping proxies in the generated container. - */ - public function setProxyDumper(ProxyDumper $proxyDumper) - { - $this->proxyDumper = $proxyDumper; - } - - /** - * Dumps the service container as a PHP class. - * - * Available options: - * - * * class: The class name - * * base_class: The base class name - * * namespace: The class namespace - * * as_files: To split the container in several files - * - * @return string|array A PHP class representing the service container or an array of PHP files if the "as_files" option is set - * - * @throws EnvParameterException When an env var exists but has not been dumped - */ - public function dump(array $options = []) - { - $this->locatedIds = []; - $this->targetDirRegex = null; - $this->inlinedRequires = []; - $this->exportedVariables = []; - $options = array_merge([ - 'class' => 'ProjectServiceContainer', - 'base_class' => 'Container', - 'namespace' => '', - 'as_files' => false, - 'debug' => true, - 'hot_path_tag' => 'container.hot_path', - 'preload_tags' => ['container.preload', 'container.no_preload'], - 'inline_factories_parameter' => 'container.dumper.inline_factories', - 'inline_class_loader_parameter' => 'container.dumper.inline_class_loader', - 'preload_classes' => [], - 'service_locator_tag' => 'container.service_locator', - 'build_time' => time(), - ], $options); - - $this->addThrow = $this->addGetService = false; - $this->namespace = $options['namespace']; - $this->asFiles = $options['as_files']; - $this->hotPathTag = $options['hot_path_tag']; - $this->preloadTags = $options['preload_tags']; - $this->inlineFactories = $this->asFiles && $options['inline_factories_parameter'] && $this->container->hasParameter($options['inline_factories_parameter']) && $this->container->getParameter($options['inline_factories_parameter']); - $this->inlineRequires = $options['inline_class_loader_parameter'] && ($this->container->hasParameter($options['inline_class_loader_parameter']) ? $this->container->getParameter($options['inline_class_loader_parameter']) : (\PHP_VERSION_ID < 70400 || $options['debug'])); - $this->serviceLocatorTag = $options['service_locator_tag']; - - if (0 !== strpos($baseClass = $options['base_class'], '\\') && 'Container' !== $baseClass) { - $baseClass = sprintf('%s\%s', $options['namespace'] ? '\\'.$options['namespace'] : '', $baseClass); - $this->baseClass = $baseClass; - } elseif ('Container' === $baseClass) { - $this->baseClass = Container::class; - } else { - $this->baseClass = $baseClass; - } - - $this->initializeMethodNamesMap('Container' === $baseClass ? Container::class : $baseClass); - - if ($this->getProxyDumper() instanceof NullDumper) { - (new AnalyzeServiceReferencesPass(true, false))->process($this->container); - try { - (new CheckCircularReferencesPass())->process($this->container); - } catch (ServiceCircularReferenceException $e) { - $path = $e->getPath(); - end($path); - $path[key($path)] .= '". Try running "composer require symfony/proxy-manager-bridge'; - - throw new ServiceCircularReferenceException($e->getServiceId(), $path); - } - } - - (new AnalyzeServiceReferencesPass(false, !$this->getProxyDumper() instanceof NullDumper))->process($this->container); - $checkedNodes = []; - $this->circularReferences = []; - $this->singleUsePrivateIds = []; - foreach ($this->container->getCompiler()->getServiceReferenceGraph()->getNodes() as $id => $node) { - if (!$node->getValue() instanceof Definition) { - continue; - } - if (!isset($checkedNodes[$id])) { - $this->analyzeCircularReferences($id, $node->getOutEdges(), $checkedNodes); - } - if ($this->isSingleUsePrivateNode($node)) { - $this->singleUsePrivateIds[$id] = $id; - } - } - $this->container->getCompiler()->getServiceReferenceGraph()->clear(); - $checkedNodes = []; - $this->singleUsePrivateIds = array_diff_key($this->singleUsePrivateIds, $this->circularReferences); - - $this->docStar = $options['debug'] ? '*' : ''; - - if (!empty($options['file']) && is_dir($dir = \dirname($options['file']))) { - // Build a regexp where the first root dirs are mandatory, - // but every other sub-dir is optional up to the full path in $dir - // Mandate at least 1 root dir and not more than 5 optional dirs. - - $dir = explode(\DIRECTORY_SEPARATOR, realpath($dir)); - $i = \count($dir); - - if (2 + (int) ('\\' === \DIRECTORY_SEPARATOR) <= $i) { - $regex = ''; - $lastOptionalDir = $i > 8 ? $i - 5 : (2 + (int) ('\\' === \DIRECTORY_SEPARATOR)); - $this->targetDirMaxMatches = $i - $lastOptionalDir; - - while (--$i >= $lastOptionalDir) { - $regex = sprintf('(%s%s)?', preg_quote(\DIRECTORY_SEPARATOR.$dir[$i], '#'), $regex); - } - - do { - $regex = preg_quote(\DIRECTORY_SEPARATOR.$dir[$i], '#').$regex; - } while (0 < --$i); - - $this->targetDirRegex = '#(^|file://|[:;, \|\r\n])'.preg_quote($dir[0], '#').$regex.'#'; - } - } - - $proxyClasses = $this->inlineFactories ? $this->generateProxyClasses() : null; - - if ($options['preload_classes']) { - $this->preload = array_combine($options['preload_classes'], $options['preload_classes']); - } - - $code = - $this->startClass($options['class'], $baseClass). - $this->addServices($services). - $this->addDeprecatedAliases(). - $this->addDefaultParametersMethod() - ; - - $proxyClasses = $proxyClasses ?? $this->generateProxyClasses(); - - if ($this->addGetService) { - $code = preg_replace( - "/(\r?\n\r?\n public function __construct.+?\\{\r?\n)/s", - "\n protected \$getService;$1 \$this->getService = \\Closure::fromCallable([\$this, 'getService']);\n", - $code, - 1 - ); - } - - if ($this->asFiles) { - $fileTemplate = <<docStar} - * @internal This class has been auto-generated by the Symfony Dependency Injection Component. - */ -class %s extends {$options['class']} -{%s} - -EOF; - $files = []; - $preloadedFiles = []; - $ids = $this->container->getRemovedIds(); - foreach ($this->container->getDefinitions() as $id => $definition) { - if (!$definition->isPublic()) { - $ids[$id] = true; - } - } - if ($ids = array_keys($ids)) { - sort($ids); - $c = "doExport($id)." => true,\n"; - } - $files['removed-ids.php'] = $c."];\n"; - } - - if (!$this->inlineFactories) { - foreach ($this->generateServiceFiles($services) as $file => [$c, $preload]) { - $files[$file] = sprintf($fileTemplate, substr($file, 0, -4), $c); - - if ($preload) { - $preloadedFiles[$file] = $file; - } - } - foreach ($proxyClasses as $file => $c) { - $files[$file] = "endClass(); - - if ($this->inlineFactories) { - foreach ($proxyClasses as $c) { - $code .= $c; - } - } - - $files[$options['class'].'.php'] = $code; - $preloadedFiles[$options['class'].'.php'] = $options['class'].'.php'; - $hash = ucfirst(strtr(ContainerBuilder::hash($files), '._', 'xx')); - $code = []; - - foreach ($files as $file => $c) { - $code["Container{$hash}/{$file}"] = substr_replace($c, "namespace ? "\nnamespace {$this->namespace};\n" : ''; - $time = $options['build_time']; - $id = hash('crc32', $hash.$time); - $this->asFiles = false; - - if ($this->preload && null !== $autoloadFile = $this->getAutoloadFile()) { - $autoloadFile = substr($this->export($autoloadFile), 2, -1); - - $preloadedFiles = array_reverse($preloadedFiles); - $preloadedFiles = implode("';\nrequire __DIR__.'/", $preloadedFiles); - - $code[$options['class'].'.preload.php'] = <<= 7.4 when preloading is desired - -use Symfony\Component\DependencyInjection\Dumper\Preloader; - -if (in_array(PHP_SAPI, ['cli', 'phpdbg'], true)) { - return; -} - -require $autoloadFile; -require __DIR__.'/$preloadedFiles'; - -\$classes = []; - -EOF; - - foreach ($this->preload as $class) { - if (!$class || false !== strpos($class, '$') || \in_array($class, ['int', 'float', 'string', 'bool', 'resource', 'object', 'array', 'null', 'callable', 'iterable', 'mixed', 'void'], true)) { - continue; - } - if (!(class_exists($class, false) || interface_exists($class, false) || trait_exists($class, false)) || (new \ReflectionClass($class))->isUserDefined()) { - $code[$options['class'].'.preload.php'] .= sprintf("\$classes[] = '%s';\n", $class); - } - } - - $code[$options['class'].'.preload.php'] .= <<<'EOF' - -Preloader::preload($classes); - -EOF; - } - - $code[$options['class'].'.php'] = << '$hash', - 'container.build_id' => '$id', - 'container.build_time' => $time, -], __DIR__.\\DIRECTORY_SEPARATOR.'Container{$hash}'); - -EOF; - } else { - $code .= $this->endClass(); - foreach ($proxyClasses as $c) { - $code .= $c; - } - } - - $this->targetDirRegex = null; - $this->inlinedRequires = []; - $this->circularReferences = []; - $this->locatedIds = []; - $this->exportedVariables = []; - $this->preload = []; - - $unusedEnvs = []; - foreach ($this->container->getEnvCounters() as $env => $use) { - if (!$use) { - $unusedEnvs[] = $env; - } - } - if ($unusedEnvs) { - throw new EnvParameterException($unusedEnvs, null, 'Environment variables "%s" are never used. Please, check your container\'s configuration.'); - } - - return $code; - } - - /** - * Retrieves the currently set proxy dumper or instantiates one. - */ - private function getProxyDumper(): ProxyDumper - { - if (!$this->proxyDumper) { - $this->proxyDumper = new NullDumper(); - } - - return $this->proxyDumper; - } - - /** - * @param ServiceReferenceGraphEdge[] $edges - */ - private function analyzeCircularReferences(string $sourceId, array $edges, array &$checkedNodes, array &$currentPath = [], bool $byConstructor = true) - { - $checkedNodes[$sourceId] = true; - $currentPath[$sourceId] = $byConstructor; - - foreach ($edges as $edge) { - $node = $edge->getDestNode(); - $id = $node->getId(); - - if (!$node->getValue() instanceof Definition || $sourceId === $id || $edge->isLazy() || $edge->isWeak()) { - // no-op - } elseif (isset($currentPath[$id])) { - $this->addCircularReferences($id, $currentPath, $edge->isReferencedByConstructor()); - } elseif (!isset($checkedNodes[$id])) { - $this->analyzeCircularReferences($id, $node->getOutEdges(), $checkedNodes, $currentPath, $edge->isReferencedByConstructor()); - } elseif (isset($this->circularReferences[$id])) { - $this->connectCircularReferences($id, $currentPath, $edge->isReferencedByConstructor()); - } - } - unset($currentPath[$sourceId]); - } - - private function connectCircularReferences(string $sourceId, array &$currentPath, bool $byConstructor, array &$subPath = []) - { - $currentPath[$sourceId] = $subPath[$sourceId] = $byConstructor; - - foreach ($this->circularReferences[$sourceId] as $id => $byConstructor) { - if (isset($currentPath[$id])) { - $this->addCircularReferences($id, $currentPath, $byConstructor); - } elseif (!isset($subPath[$id]) && isset($this->circularReferences[$id])) { - $this->connectCircularReferences($id, $currentPath, $byConstructor, $subPath); - } - } - unset($currentPath[$sourceId], $subPath[$sourceId]); - } - - private function addCircularReferences(string $id, array $currentPath, bool $byConstructor) - { - $currentPath[$id] = $byConstructor; - $circularRefs = []; - - foreach (array_reverse($currentPath) as $parentId => $v) { - $byConstructor = $byConstructor && $v; - $circularRefs[] = $parentId; - - if ($parentId === $id) { - break; - } - } - - $currentId = $id; - foreach ($circularRefs as $parentId) { - if (empty($this->circularReferences[$parentId][$currentId])) { - $this->circularReferences[$parentId][$currentId] = $byConstructor; - } - - $currentId = $parentId; - } - } - - private function collectLineage(string $class, array &$lineage) - { - if (isset($lineage[$class])) { - return; - } - if (!$r = $this->container->getReflectionClass($class, false)) { - return; - } - if (is_a($class, $this->baseClass, true)) { - return; - } - $file = $r->getFileName(); - if (!$file || $this->doExport($file) === $exportedFile = $this->export($file)) { - return; - } - - $lineage[$class] = substr($exportedFile, 1, -1); - - if ($parent = $r->getParentClass()) { - $this->collectLineage($parent->name, $lineage); - } - - foreach ($r->getInterfaces() as $parent) { - $this->collectLineage($parent->name, $lineage); - } - - foreach ($r->getTraits() as $parent) { - $this->collectLineage($parent->name, $lineage); - } - - unset($lineage[$class]); - $lineage[$class] = substr($exportedFile, 1, -1); - } - - private function generateProxyClasses(): array - { - $proxyClasses = []; - $alreadyGenerated = []; - $definitions = $this->container->getDefinitions(); - $strip = '' === $this->docStar && method_exists('Symfony\Component\HttpKernel\Kernel', 'stripComments'); - $proxyDumper = $this->getProxyDumper(); - ksort($definitions); - foreach ($definitions as $definition) { - if (!$proxyDumper->isProxyCandidate($definition)) { - continue; - } - if (isset($alreadyGenerated[$class = $definition->getClass()])) { - continue; - } - $alreadyGenerated[$class] = true; - // register class' reflector for resource tracking - $this->container->getReflectionClass($class); - if ("\n" === $proxyCode = "\n".$proxyDumper->getProxyCode($definition)) { - continue; - } - - if ($this->inlineRequires) { - $lineage = []; - $this->collectLineage($class, $lineage); - - $code = ''; - foreach (array_diff_key(array_flip($lineage), $this->inlinedRequires) as $file => $class) { - if ($this->inlineFactories) { - $this->inlinedRequires[$file] = true; - } - $code .= sprintf("include_once %s;\n", $file); - } - - $proxyCode = $code.$proxyCode; - } - - if ($strip) { - $proxyCode = "inlineRequires ? substr($proxyCode, \strlen($code)) : $proxyCode, 3)[1]; - - if ($this->asFiles || $this->namespace) { - $proxyCode .= "\nif (!\\class_exists('$proxyClass', false)) {\n \\class_alias(__NAMESPACE__.'\\\\$proxyClass', '$proxyClass', false);\n}\n"; - } - - $proxyClasses[$proxyClass.'.php'] = $proxyCode; - } - - return $proxyClasses; - } - - private function addServiceInclude(string $cId, Definition $definition): string - { - $code = ''; - - if ($this->inlineRequires && (!$this->isHotPath($definition) || $this->getProxyDumper()->isProxyCandidate($definition))) { - $lineage = []; - foreach ($this->inlinedDefinitions as $def) { - if (!$def->isDeprecated()) { - foreach ($this->getClasses($def, $cId) as $class) { - $this->collectLineage($class, $lineage); - } - } - } - - foreach ($this->serviceCalls as $id => list($callCount, $behavior)) { - if ('service_container' !== $id && $id !== $cId - && ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE !== $behavior - && $this->container->has($id) - && $this->isTrivialInstance($def = $this->container->findDefinition($id)) - ) { - foreach ($this->getClasses($def, $cId) as $class) { - $this->collectLineage($class, $lineage); - } - } - } - - foreach (array_diff_key(array_flip($lineage), $this->inlinedRequires) as $file => $class) { - $code .= sprintf(" include_once %s;\n", $file); - } - } - - foreach ($this->inlinedDefinitions as $def) { - if ($file = $def->getFile()) { - $file = $this->dumpValue($file); - $file = '(' === $file[0] ? substr($file, 1, -1) : $file; - $code .= sprintf(" include_once %s;\n", $file); - } - } - - if ('' !== $code) { - $code .= "\n"; - } - - return $code; - } - - /** - * @throws InvalidArgumentException - * @throws RuntimeException - */ - private function addServiceInstance(string $id, Definition $definition, bool $isSimpleInstance): string - { - $class = $this->dumpValue($definition->getClass()); - - if (0 === strpos($class, "'") && false === strpos($class, '$') && !preg_match('/^\'(?:\\\{2})?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) { - throw new InvalidArgumentException(sprintf('"%s" is not a valid class name for the "%s" service.', $class, $id)); - } - - $isProxyCandidate = $this->getProxyDumper()->isProxyCandidate($definition); - $instantiation = ''; - - $lastWitherIndex = null; - foreach ($definition->getMethodCalls() as $k => $call) { - if ($call[2] ?? false) { - $lastWitherIndex = $k; - } - } - - if (!$isProxyCandidate && $definition->isShared() && !isset($this->singleUsePrivateIds[$id]) && null === $lastWitherIndex) { - $instantiation = sprintf('$this->%s[%s] = %s', $this->container->getDefinition($id)->isPublic() ? 'services' : 'privates', $this->doExport($id), $isSimpleInstance ? '' : '$instance'); - } elseif (!$isSimpleInstance) { - $instantiation = '$instance'; - } - - $return = ''; - if ($isSimpleInstance) { - $return = 'return '; - } else { - $instantiation .= ' = '; - } - - return $this->addNewInstance($definition, ' '.$return.$instantiation, $id); - } - - private function isTrivialInstance(Definition $definition): bool - { - if ($definition->hasErrors()) { - return true; - } - if ($definition->isSynthetic() || $definition->getFile() || $definition->getMethodCalls() || $definition->getProperties() || $definition->getConfigurator()) { - return false; - } - if ($definition->isDeprecated() || $definition->isLazy() || $definition->getFactory() || 3 < \count($definition->getArguments())) { - return false; - } - - foreach ($definition->getArguments() as $arg) { - if (!$arg || $arg instanceof Parameter) { - continue; - } - if (\is_array($arg) && 3 >= \count($arg)) { - foreach ($arg as $k => $v) { - if ($this->dumpValue($k) !== $this->dumpValue($k, false)) { - return false; - } - if (!$v || $v instanceof Parameter) { - continue; - } - if ($v instanceof Reference && $this->container->has($id = (string) $v) && $this->container->findDefinition($id)->isSynthetic()) { - continue; - } - if (!is_scalar($v) || $this->dumpValue($v) !== $this->dumpValue($v, false)) { - return false; - } - } - } elseif ($arg instanceof Reference && $this->container->has($id = (string) $arg) && $this->container->findDefinition($id)->isSynthetic()) { - continue; - } elseif (!is_scalar($arg) || $this->dumpValue($arg) !== $this->dumpValue($arg, false)) { - return false; - } - } - - return true; - } - - private function addServiceMethodCalls(Definition $definition, string $variableName, ?string $sharedNonLazyId): string - { - $lastWitherIndex = null; - foreach ($definition->getMethodCalls() as $k => $call) { - if ($call[2] ?? false) { - $lastWitherIndex = $k; - } - } - - $calls = ''; - foreach ($definition->getMethodCalls() as $k => $call) { - $arguments = []; - foreach ($call[1] as $value) { - $arguments[] = $this->dumpValue($value); - } - - $witherAssignation = ''; - - if ($call[2] ?? false) { - if (null !== $sharedNonLazyId && $lastWitherIndex === $k) { - $witherAssignation = sprintf('$this->%s[\'%s\'] = ', $definition->isPublic() ? 'services' : 'privates', $sharedNonLazyId); - } - $witherAssignation .= sprintf('$%s = ', $variableName); - } - - $calls .= $this->wrapServiceConditionals($call[1], sprintf(" %s\$%s->%s(%s);\n", $witherAssignation, $variableName, $call[0], implode(', ', $arguments))); - } - - return $calls; - } - - private function addServiceProperties(Definition $definition, string $variableName = 'instance'): string - { - $code = ''; - foreach ($definition->getProperties() as $name => $value) { - $code .= sprintf(" \$%s->%s = %s;\n", $variableName, $name, $this->dumpValue($value)); - } - - return $code; - } - - private function addServiceConfigurator(Definition $definition, string $variableName = 'instance'): string - { - if (!$callable = $definition->getConfigurator()) { - return ''; - } - - if (\is_array($callable)) { - if ($callable[0] instanceof Reference - || ($callable[0] instanceof Definition && $this->definitionVariables->contains($callable[0])) - ) { - return sprintf(" %s->%s(\$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName); - } - - $class = $this->dumpValue($callable[0]); - // If the class is a string we can optimize away - if (0 === strpos($class, "'") && false === strpos($class, '$')) { - return sprintf(" %s::%s(\$%s);\n", $this->dumpLiteralClass($class), $callable[1], $variableName); - } - - if (0 === strpos($class, 'new ')) { - return sprintf(" (%s)->%s(\$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName); - } - - return sprintf(" [%s, '%s'](\$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName); - } - - return sprintf(" %s(\$%s);\n", $callable, $variableName); - } - - private function addService(string $id, Definition $definition): array - { - $this->definitionVariables = new \SplObjectStorage(); - $this->referenceVariables = []; - $this->variableCount = 0; - $this->referenceVariables[$id] = new Variable('instance'); - - $return = []; - - if ($class = $definition->getClass()) { - $class = $class instanceof Parameter ? '%'.$class.'%' : $this->container->resolveEnvPlaceholders($class); - $return[] = sprintf(0 === strpos($class, '%') ? '@return object A %1$s instance' : '@return \%s', ltrim($class, '\\')); - } elseif ($definition->getFactory()) { - $factory = $definition->getFactory(); - if (\is_string($factory)) { - $return[] = sprintf('@return object An instance returned by %s()', $factory); - } elseif (\is_array($factory) && (\is_string($factory[0]) || $factory[0] instanceof Definition || $factory[0] instanceof Reference)) { - $class = $factory[0] instanceof Definition ? $factory[0]->getClass() : (string) $factory[0]; - $class = $class instanceof Parameter ? '%'.$class.'%' : $this->container->resolveEnvPlaceholders($class); - $return[] = sprintf('@return object An instance returned by %s::%s()', $class, $factory[1]); - } - } - - if ($definition->isDeprecated()) { - if ($return && 0 === strpos($return[\count($return) - 1], '@return')) { - $return[] = ''; - } - - $deprecation = $definition->getDeprecation($id); - $return[] = sprintf('@deprecated %s', ($deprecation['package'] || $deprecation['version'] ? "Since {$deprecation['package']} {$deprecation['version']}: " : '').$deprecation['message']); - } - - $return = str_replace("\n * \n", "\n *\n", implode("\n * ", $return)); - $return = $this->container->resolveEnvPlaceholders($return); - - $shared = $definition->isShared() ? ' shared' : ''; - $public = $definition->isPublic() ? 'public' : 'private'; - $autowired = $definition->isAutowired() ? ' autowired' : ''; - $asFile = $this->asFiles && !$this->inlineFactories && !$this->isHotPath($definition); - $methodName = $this->generateMethodName($id); - - if ($asFile || $definition->isLazy()) { - $lazyInitialization = '$lazyLoad = true'; - } else { - $lazyInitialization = ''; - } - - $code = <<docStar} - * Gets the $public '$id'$shared$autowired service. - * - * $return -EOF; - $code = str_replace('*/', ' ', $code).<<hasErrors() && $e = $definition->getErrors()) { - $this->addThrow = true; - - $code .= sprintf(" \$this->throw(%s);\n", $this->export(reset($e))); - } else { - $this->serviceCalls = []; - $this->inlinedDefinitions = $this->getDefinitionsFromArguments([$definition], null, $this->serviceCalls); - - if ($definition->isDeprecated()) { - $deprecation = $definition->getDeprecation($id); - $code .= sprintf(" trigger_deprecation(%s, %s, %s);\n\n", $this->export($deprecation['package']), $this->export($deprecation['version']), $this->export($deprecation['message'])); - } elseif ($definition->hasTag($this->hotPathTag) || !$definition->hasTag($this->preloadTags[1])) { - foreach ($this->inlinedDefinitions as $def) { - foreach ($this->getClasses($def, $id) as $class) { - $this->preload[$class] = $class; - } - } - } - - if ($this->getProxyDumper()->isProxyCandidate($definition)) { - $factoryCode = $definition->isShared() ? ($asFile ? "\$this->load('%s', false)" : '$this->%s(false)') : '$this->factories[%2$s](false)'; - $factoryCode = $this->getProxyDumper()->getProxyFactoryCode($definition, $id, sprintf($factoryCode, $methodName, $this->doExport($id))); - $code .= $asFile ? preg_replace('/function \(([^)]*+)\) {/', 'function (\1) use ($container) {', $factoryCode) : $factoryCode; - } - - $code .= $this->addServiceInclude($id, $definition); - $c = $this->addInlineService($id, $definition); - - if (!$definition->isShared()) { - $c = implode("\n", array_map(function ($line) { return $line ? ' '.$line : $line; }, explode("\n", $c))); - $factory = sprintf('$this->factories%s[%s]', $definition->isPublic() ? '' : "['service_container']", $this->doExport($id)); - $lazyloadInitialization = $definition->isLazy() ? '$lazyLoad = true' : ''; - - $c = sprintf(" %s = function (%s) {\n%s };\n\n return %1\$s();\n", $factory, $lazyloadInitialization, $c); - } - - $code .= $c; - } - - if ($asFile) { - $code = str_replace('$this', '$container', $code); - $code = str_replace('function () {', 'function () use ($container) {', $code); - } - - $code .= " }\n"; - - $this->definitionVariables = $this->inlinedDefinitions = null; - $this->referenceVariables = $this->serviceCalls = null; - - return [$file, $code]; - } - - private function addInlineVariables(string $id, Definition $definition, array $arguments, bool $forConstructor): string - { - $code = ''; - - foreach ($arguments as $argument) { - if (\is_array($argument)) { - $code .= $this->addInlineVariables($id, $definition, $argument, $forConstructor); - } elseif ($argument instanceof Reference) { - $code .= $this->addInlineReference($id, $definition, $argument, $forConstructor); - } elseif ($argument instanceof Definition) { - $code .= $this->addInlineService($id, $definition, $argument, $forConstructor); - } - } - - return $code; - } - - private function addInlineReference(string $id, Definition $definition, string $targetId, bool $forConstructor): string - { - while ($this->container->hasAlias($targetId)) { - $targetId = (string) $this->container->getAlias($targetId); - } - - list($callCount, $behavior) = $this->serviceCalls[$targetId]; - - if ($id === $targetId) { - return $this->addInlineService($id, $definition, $definition); - } - - if ('service_container' === $targetId || isset($this->referenceVariables[$targetId])) { - return ''; - } - - $hasSelfRef = isset($this->circularReferences[$id][$targetId]) && !isset($this->definitionVariables[$definition]); - - if ($hasSelfRef && !$forConstructor && !$forConstructor = !$this->circularReferences[$id][$targetId]) { - $code = $this->addInlineService($id, $definition, $definition); - } else { - $code = ''; - } - - if (isset($this->referenceVariables[$targetId]) || (2 > $callCount && (!$hasSelfRef || !$forConstructor))) { - return $code; - } - - $name = $this->getNextVariableName(); - $this->referenceVariables[$targetId] = new Variable($name); - - $reference = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE >= $behavior ? new Reference($targetId, $behavior) : null; - $code .= sprintf(" \$%s = %s;\n", $name, $this->getServiceCall($targetId, $reference)); - - if (!$hasSelfRef || !$forConstructor) { - return $code; - } - - $code .= sprintf(<<<'EOTXT' - - if (isset($this->%s[%s])) { - return $this->%1$s[%2$s]; - } - -EOTXT - , - $this->container->getDefinition($id)->isPublic() ? 'services' : 'privates', - $this->doExport($id) - ); - - return $code; - } - - private function addInlineService(string $id, Definition $definition, Definition $inlineDef = null, bool $forConstructor = true): string - { - $code = ''; - - if ($isSimpleInstance = $isRootInstance = null === $inlineDef) { - foreach ($this->serviceCalls as $targetId => list($callCount, $behavior, $byConstructor)) { - if ($byConstructor && isset($this->circularReferences[$id][$targetId]) && !$this->circularReferences[$id][$targetId]) { - $code .= $this->addInlineReference($id, $definition, $targetId, $forConstructor); - } - } - } - - if (isset($this->definitionVariables[$inlineDef = $inlineDef ?: $definition])) { - return $code; - } - - $arguments = [$inlineDef->getArguments(), $inlineDef->getFactory()]; - - $code .= $this->addInlineVariables($id, $definition, $arguments, $forConstructor); - - if ($arguments = array_filter([$inlineDef->getProperties(), $inlineDef->getMethodCalls(), $inlineDef->getConfigurator()])) { - $isSimpleInstance = false; - } elseif ($definition !== $inlineDef && 2 > $this->inlinedDefinitions[$inlineDef]) { - return $code; - } - - if (isset($this->definitionVariables[$inlineDef])) { - $isSimpleInstance = false; - } else { - $name = $definition === $inlineDef ? 'instance' : $this->getNextVariableName(); - $this->definitionVariables[$inlineDef] = new Variable($name); - $code .= '' !== $code ? "\n" : ''; - - if ('instance' === $name) { - $code .= $this->addServiceInstance($id, $definition, $isSimpleInstance); - } else { - $code .= $this->addNewInstance($inlineDef, ' $'.$name.' = ', $id); - } - - if ('' !== $inline = $this->addInlineVariables($id, $definition, $arguments, false)) { - $code .= "\n".$inline."\n"; - } elseif ($arguments && 'instance' === $name) { - $code .= "\n"; - } - - $code .= $this->addServiceProperties($inlineDef, $name); - $code .= $this->addServiceMethodCalls($inlineDef, $name, !$this->getProxyDumper()->isProxyCandidate($inlineDef) && $inlineDef->isShared() && !isset($this->singleUsePrivateIds[$id]) ? $id : null); - $code .= $this->addServiceConfigurator($inlineDef, $name); - } - - if ($isRootInstance && !$isSimpleInstance) { - $code .= "\n return \$instance;\n"; - } - - return $code; - } - - private function addServices(array &$services = null): string - { - $publicServices = $privateServices = ''; - $definitions = $this->container->getDefinitions(); - ksort($definitions); - foreach ($definitions as $id => $definition) { - if (!$definition->isSynthetic()) { - $services[$id] = $this->addService($id, $definition); - } elseif ($definition->hasTag($this->hotPathTag) || !$definition->hasTag($this->preloadTags[1])) { - $services[$id] = null; - - foreach ($this->getClasses($definition, $id) as $class) { - $this->preload[$class] = $class; - } - } - } - - foreach ($definitions as $id => $definition) { - if (!(list($file, $code) = $services[$id]) || null !== $file) { - continue; - } - if ($definition->isPublic()) { - $publicServices .= $code; - } elseif (!$this->isTrivialInstance($definition) || isset($this->locatedIds[$id])) { - $privateServices .= $code; - } - } - - return $publicServices.$privateServices; - } - - private function generateServiceFiles(array $services): iterable - { - $definitions = $this->container->getDefinitions(); - ksort($definitions); - foreach ($definitions as $id => $definition) { - if ((list($file, $code) = $services[$id]) && null !== $file && ($definition->isPublic() || !$this->isTrivialInstance($definition) || isset($this->locatedIds[$id]))) { - yield $file => [$code, $definition->hasTag($this->hotPathTag) || !$definition->hasTag($this->preloadTags[1]) && !$definition->isDeprecated() && !$definition->hasErrors()]; - } - } - } - - private function addNewInstance(Definition $definition, string $return = '', string $id = null): string - { - $tail = $return ? ";\n" : ''; - - if (BaseServiceLocator::class === $definition->getClass() && $definition->hasTag($this->serviceLocatorTag)) { - $arguments = []; - foreach ($definition->getArgument(0) as $k => $argument) { - $arguments[$k] = $argument->getValues()[0]; - } - - return $return.$this->dumpValue(new ServiceLocatorArgument($arguments)).$tail; - } - - $arguments = []; - foreach ($definition->getArguments() as $value) { - $arguments[] = $this->dumpValue($value); - } - - if (null !== $definition->getFactory()) { - $callable = $definition->getFactory(); - - if (\is_array($callable)) { - if (!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $callable[1])) { - throw new RuntimeException(sprintf('Cannot dump definition because of invalid factory method (%s).', $callable[1] ?: 'n/a')); - } - - if ($callable[0] instanceof Reference - || ($callable[0] instanceof Definition && $this->definitionVariables->contains($callable[0]))) { - return $return.sprintf('%s->%s(%s)', $this->dumpValue($callable[0]), $callable[1], $arguments ? implode(', ', $arguments) : '').$tail; - } - - $class = $this->dumpValue($callable[0]); - // If the class is a string we can optimize away - if (0 === strpos($class, "'") && false === strpos($class, '$')) { - if ("''" === $class) { - throw new RuntimeException(sprintf('Cannot dump definition: "%s" service is defined to be created by a factory but is missing the service reference, did you forget to define the factory service id or class?', $id ? 'The "'.$id.'"' : 'inline')); - } - - return $return.sprintf('%s::%s(%s)', $this->dumpLiteralClass($class), $callable[1], $arguments ? implode(', ', $arguments) : '').$tail; - } - - if (0 === strpos($class, 'new ')) { - return $return.sprintf('(%s)->%s(%s)', $class, $callable[1], $arguments ? implode(', ', $arguments) : '').$tail; - } - - return $return.sprintf("[%s, '%s'](%s)", $class, $callable[1], $arguments ? implode(', ', $arguments) : '').$tail; - } - - return $return.sprintf('%s(%s)', $this->dumpLiteralClass($this->dumpValue($callable)), $arguments ? implode(', ', $arguments) : '').$tail; - } - - if (null === $class = $definition->getClass()) { - throw new RuntimeException('Cannot dump definitions which have no class nor factory.'); - } - - return $return.sprintf('new %s(%s)', $this->dumpLiteralClass($this->dumpValue($class)), implode(', ', $arguments)).$tail; - } - - private function startClass(string $class, string $baseClass): string - { - $namespaceLine = !$this->asFiles && $this->namespace ? "\nnamespace {$this->namespace};\n" : ''; - - $code = <<docStar} - * @internal This class has been auto-generated by the Symfony Dependency Injection Component. - */ -class $class extends $baseClass -{ - protected \$parameters = []; - - public function __construct() - { - -EOF; - if ($this->asFiles) { - $code = str_replace('$parameters = []', "\$containerDir;\n protected \$parameters = [];\n private \$buildParameters", $code); - $code = str_replace('__construct()', '__construct(array $buildParameters = [], $containerDir = __DIR__)', $code); - $code .= " \$this->buildParameters = \$buildParameters;\n"; - $code .= " \$this->containerDir = \$containerDir;\n"; - - if (null !== $this->targetDirRegex) { - $code = str_replace('$parameters = []', "\$targetDir;\n protected \$parameters = []", $code); - $code .= ' $this->targetDir = \\dirname($containerDir);'."\n"; - } - } - - if (Container::class !== $this->baseClass) { - $r = $this->container->getReflectionClass($this->baseClass, false); - if (null !== $r - && (null !== $constructor = $r->getConstructor()) - && 0 === $constructor->getNumberOfRequiredParameters() - && Container::class !== $constructor->getDeclaringClass()->name - ) { - $code .= " parent::__construct();\n"; - $code .= " \$this->parameterBag = null;\n\n"; - } - } - - if ($this->container->getParameterBag()->all()) { - $code .= " \$this->parameters = \$this->getDefaultParameters();\n\n"; - } - $code .= " \$this->services = \$this->privates = [];\n"; - - $code .= $this->addSyntheticIds(); - $code .= $this->addMethodMap(); - $code .= $this->asFiles && !$this->inlineFactories ? $this->addFileMap() : ''; - $code .= $this->addAliases(); - $code .= $this->addInlineRequires(); - $code .= <<addRemovedIds(); - - if ($this->asFiles && !$this->inlineFactories) { - $code .= <<<'EOF' - - protected function load($file, $lazyLoad = true) - { - if (class_exists($class = __NAMESPACE__.'\\'.$file, false)) { - return $class::do($this, $lazyLoad); - } - - if ('.' === $file[-4]) { - $class = substr($class, 0, -4); - } else { - $file .= '.php'; - } - - $service = require $this->containerDir.\DIRECTORY_SEPARATOR.$file; - - return class_exists($class, false) ? $class::do($this, $lazyLoad) : $service; - } - -EOF; - } - - $proxyDumper = $this->getProxyDumper(); - foreach ($this->container->getDefinitions() as $definition) { - if (!$proxyDumper->isProxyCandidate($definition)) { - continue; - } - - if ($this->asFiles && !$this->inlineFactories) { - $proxyLoader = "class_exists(\$class, false) || require __DIR__.'/'.\$class.'.php';\n\n "; - } else { - $proxyLoader = ''; - } - - $code .= <<container->getDefinitions(); - ksort($definitions); - foreach ($definitions as $id => $definition) { - if ($definition->isSynthetic() && 'service_container' !== $id) { - $code .= ' '.$this->doExport($id)." => true,\n"; - } - } - - return $code ? " \$this->syntheticIds = [\n{$code} ];\n" : ''; - } - - private function addRemovedIds(): string - { - $ids = $this->container->getRemovedIds(); - foreach ($this->container->getDefinitions() as $id => $definition) { - if (!$definition->isPublic()) { - $ids[$id] = true; - } - } - if (!$ids) { - return ''; - } - if ($this->asFiles) { - $code = "require \$this->containerDir.\\DIRECTORY_SEPARATOR.'removed-ids.php'"; - } else { - $code = ''; - $ids = array_keys($ids); - sort($ids); - foreach ($ids as $id) { - if (preg_match(FileLoader::ANONYMOUS_ID_REGEXP, $id)) { - continue; - } - $code .= ' '.$this->doExport($id)." => true,\n"; - } - - $code = "[\n{$code} ]"; - } - - return <<container->getDefinitions(); - ksort($definitions); - foreach ($definitions as $id => $definition) { - if (!$definition->isSynthetic() && $definition->isPublic() && (!$this->asFiles || $this->inlineFactories || $this->isHotPath($definition))) { - $code .= ' '.$this->doExport($id).' => '.$this->doExport($this->generateMethodName($id)).",\n"; - } - } - - $aliases = $this->container->getAliases(); - foreach ($aliases as $alias => $id) { - if (!$id->isDeprecated()) { - continue; - } - $code .= ' '.$this->doExport($alias).' => '.$this->doExport($this->generateMethodName($alias)).",\n"; - } - - return $code ? " \$this->methodMap = [\n{$code} ];\n" : ''; - } - - private function addFileMap(): string - { - $code = ''; - $definitions = $this->container->getDefinitions(); - ksort($definitions); - foreach ($definitions as $id => $definition) { - if (!$definition->isSynthetic() && $definition->isPublic() && !$this->isHotPath($definition)) { - $code .= sprintf(" %s => '%s',\n", $this->doExport($id), $this->generateMethodName($id)); - } - } - - return $code ? " \$this->fileMap = [\n{$code} ];\n" : ''; - } - - private function addAliases(): string - { - if (!$aliases = $this->container->getAliases()) { - return "\n \$this->aliases = [];\n"; - } - - $code = " \$this->aliases = [\n"; - ksort($aliases); - foreach ($aliases as $alias => $id) { - if ($id->isDeprecated()) { - continue; - } - - $id = (string) $id; - while (isset($aliases[$id])) { - $id = (string) $aliases[$id]; - } - $code .= ' '.$this->doExport($alias).' => '.$this->doExport($id).",\n"; - } - - return $code." ];\n"; - } - - private function addDeprecatedAliases(): string - { - $code = ''; - $aliases = $this->container->getAliases(); - foreach ($aliases as $alias => $definition) { - if (!$definition->isDeprecated()) { - continue; - } - $public = $definition->isPublic() ? 'public' : 'private'; - $id = (string) $definition; - $methodNameAlias = $this->generateMethodName($alias); - $idExported = $this->export($id); - $deprecation = $definition->getDeprecation($alias); - $packageExported = $this->export($deprecation['package']); - $versionExported = $this->export($deprecation['version']); - $messageExported = $this->export($deprecation['message']); - $code .= <<docStar} - * Gets the $public '$alias' alias. - * - * @return object The "$id" service. - */ - protected function {$methodNameAlias}() - { - trigger_deprecation($packageExported, $versionExported, $messageExported); - - return \$this->get($idExported); - } - -EOF; - } - - return $code; - } - - private function addInlineRequires(): string - { - if (!$this->hotPathTag || !$this->inlineRequires) { - return ''; - } - - $lineage = []; - - foreach ($this->container->findTaggedServiceIds($this->hotPathTag) as $id => $tags) { - $definition = $this->container->getDefinition($id); - - if ($this->getProxyDumper()->isProxyCandidate($definition)) { - continue; - } - - $inlinedDefinitions = $this->getDefinitionsFromArguments([$definition]); - - foreach ($inlinedDefinitions as $def) { - foreach ($this->getClasses($def, $id) as $class) { - $this->collectLineage($class, $lineage); - } - } - } - - $code = ''; - - foreach ($lineage as $file) { - if (!isset($this->inlinedRequires[$file])) { - $this->inlinedRequires[$file] = true; - $code .= sprintf("\n include_once %s;", $file); - } - } - - return $code ? sprintf("\n \$this->privates['service_container'] = function () {%s\n };\n", $code) : ''; - } - - private function addDefaultParametersMethod(): string - { - if (!$this->container->getParameterBag()->all()) { - return ''; - } - - $php = []; - $dynamicPhp = []; - - foreach ($this->container->getParameterBag()->all() as $key => $value) { - if ($key !== $resolvedKey = $this->container->resolveEnvPlaceholders($key)) { - throw new InvalidArgumentException(sprintf('Parameter name cannot use env parameters: "%s".', $resolvedKey)); - } - $export = $this->exportParameters([$value]); - $export = explode('0 => ', substr(rtrim($export, " ]\n"), 2, -1), 2); - - if (preg_match("/\\\$this->(?:getEnv\('(?:\w++:)*+\w++'\)|targetDir\.'')/", $export[1])) { - $dynamicPhp[$key] = sprintf('%scase %s: $value = %s; break;', $export[0], $this->export($key), $export[1]); - } else { - $php[] = sprintf('%s%s => %s,', $export[0], $this->export($key), $export[1]); - } - } - $parameters = sprintf("[\n%s\n%s]", implode("\n", $php), str_repeat(' ', 8)); - - $code = <<<'EOF' - - public function getParameter(string $name) - { - if (isset($this->buildParameters[$name])) { - return $this->buildParameters[$name]; - } - - if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || \array_key_exists($name, $this->parameters))) { - throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name)); - } - if (isset($this->loadedDynamicParameters[$name])) { - return $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name); - } - - return $this->parameters[$name]; - } - - public function hasParameter(string $name): bool - { - if (isset($this->buildParameters[$name])) { - return true; - } - - return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || \array_key_exists($name, $this->parameters); - } - - public function setParameter(string $name, $value): void - { - throw new LogicException('Impossible to call set() on a frozen ParameterBag.'); - } - - public function getParameterBag(): ParameterBagInterface - { - if (null === $this->parameterBag) { - $parameters = $this->parameters; - foreach ($this->loadedDynamicParameters as $name => $loaded) { - $parameters[$name] = $loaded ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name); - } - foreach ($this->buildParameters as $name => $value) { - $parameters[$name] = $value; - } - $this->parameterBag = new FrozenParameterBag($parameters); - } - - return $this->parameterBag; - } - -EOF; - if (!$this->asFiles) { - $code = preg_replace('/^.*buildParameters.*\n.*\n.*\n\n?/m', '', $code); - } - - if ($dynamicPhp) { - $loadedDynamicParameters = $this->exportParameters(array_combine(array_keys($dynamicPhp), array_fill(0, \count($dynamicPhp), false)), '', 8); - $getDynamicParameter = <<<'EOF' - switch ($name) { -%s - default: throw new InvalidArgumentException(sprintf('The dynamic parameter "%%s" must be defined.', $name)); - } - $this->loadedDynamicParameters[$name] = true; - - return $this->dynamicParameters[$name] = $value; -EOF; - $getDynamicParameter = sprintf($getDynamicParameter, implode("\n", $dynamicPhp)); - } else { - $loadedDynamicParameters = '[]'; - $getDynamicParameter = str_repeat(' ', 8).'throw new InvalidArgumentException(sprintf(\'The dynamic parameter "%s" must be defined.\', $name));'; - } - - $code .= << $value) { - if (\is_array($value)) { - $value = $this->exportParameters($value, $path.'/'.$key, $indent + 4); - } elseif ($value instanceof ArgumentInterface) { - throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain special arguments. "%s" found in "%s".', get_debug_type($value), $path.'/'.$key)); - } elseif ($value instanceof Variable) { - throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain variable references. Variable "%s" found in "%s".', $value, $path.'/'.$key)); - } elseif ($value instanceof Definition) { - throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain service definitions. Definition for "%s" found in "%s".', $value->getClass(), $path.'/'.$key)); - } elseif ($value instanceof Reference) { - throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain references to other services (reference to service "%s" found in "%s").', $value, $path.'/'.$key)); - } elseif ($value instanceof Expression) { - throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain expressions. Expression "%s" found in "%s".', $value, $path.'/'.$key)); - } else { - $value = $this->export($value); - } - - $php[] = sprintf('%s%s => %s,', str_repeat(' ', $indent), $this->export($key), $value); - } - - return sprintf("[\n%s\n%s]", implode("\n", $php), str_repeat(' ', $indent - 4)); - } - - private function endClass(): string - { - if ($this->addThrow) { - return <<<'EOF' - - protected function throw($message) - { - throw new RuntimeException($message); - } -} - -EOF; - } - - return <<<'EOF' -} - -EOF; - } - - private function wrapServiceConditionals($value, string $code): string - { - if (!$condition = $this->getServiceConditionals($value)) { - return $code; - } - - // re-indent the wrapped code - $code = implode("\n", array_map(function ($line) { return $line ? ' '.$line : $line; }, explode("\n", $code))); - - return sprintf(" if (%s) {\n%s }\n", $condition, $code); - } - - private function getServiceConditionals($value): string - { - $conditions = []; - foreach (ContainerBuilder::getInitializedConditionals($value) as $service) { - if (!$this->container->hasDefinition($service)) { - return 'false'; - } - $conditions[] = sprintf('isset($this->%s[%s])', $this->container->getDefinition($service)->isPublic() ? 'services' : 'privates', $this->doExport($service)); - } - foreach (ContainerBuilder::getServiceConditionals($value) as $service) { - if ($this->container->hasDefinition($service) && !$this->container->getDefinition($service)->isPublic()) { - continue; - } - - $conditions[] = sprintf('$this->has(%s)', $this->doExport($service)); - } - - if (!$conditions) { - return ''; - } - - return implode(' && ', $conditions); - } - - private function getDefinitionsFromArguments(array $arguments, \SplObjectStorage $definitions = null, array &$calls = [], bool $byConstructor = null): \SplObjectStorage - { - if (null === $definitions) { - $definitions = new \SplObjectStorage(); - } - - foreach ($arguments as $argument) { - if (\is_array($argument)) { - $this->getDefinitionsFromArguments($argument, $definitions, $calls, $byConstructor); - } elseif ($argument instanceof Reference) { - $id = (string) $argument; - - while ($this->container->hasAlias($id)) { - $id = (string) $this->container->getAlias($id); - } - - if (!isset($calls[$id])) { - $calls[$id] = [0, $argument->getInvalidBehavior(), $byConstructor]; - } else { - $calls[$id][1] = min($calls[$id][1], $argument->getInvalidBehavior()); - } - - ++$calls[$id][0]; - } elseif (!$argument instanceof Definition) { - // no-op - } elseif (isset($definitions[$argument])) { - $definitions[$argument] = 1 + $definitions[$argument]; - } else { - $definitions[$argument] = 1; - $arguments = [$argument->getArguments(), $argument->getFactory()]; - $this->getDefinitionsFromArguments($arguments, $definitions, $calls, null === $byConstructor || $byConstructor); - $arguments = [$argument->getProperties(), $argument->getMethodCalls(), $argument->getConfigurator()]; - $this->getDefinitionsFromArguments($arguments, $definitions, $calls, null !== $byConstructor && $byConstructor); - } - } - - return $definitions; - } - - /** - * @throws RuntimeException - */ - private function dumpValue($value, bool $interpolate = true): string - { - if (\is_array($value)) { - if ($value && $interpolate && false !== $param = array_search($value, $this->container->getParameterBag()->all(), true)) { - return $this->dumpValue("%$param%"); - } - $code = []; - foreach ($value as $k => $v) { - $code[] = sprintf('%s => %s', $this->dumpValue($k, $interpolate), $this->dumpValue($v, $interpolate)); - } - - return sprintf('[%s]', implode(', ', $code)); - } elseif ($value instanceof ArgumentInterface) { - $scope = [$this->definitionVariables, $this->referenceVariables]; - $this->definitionVariables = $this->referenceVariables = null; - - try { - if ($value instanceof ServiceClosureArgument) { - $value = $value->getValues()[0]; - $code = $this->dumpValue($value, $interpolate); - - $returnedType = ''; - if ($value instanceof TypedReference) { - $returnedType = sprintf(': %s\%s', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE >= $value->getInvalidBehavior() ? '' : '?', $value->getType()); - } - - $code = sprintf('return %s;', $code); - - return sprintf("function ()%s {\n %s\n }", $returnedType, $code); - } - - if ($value instanceof IteratorArgument) { - $operands = [0]; - $code = []; - $code[] = 'new RewindableGenerator(function () {'; - - if (!$values = $value->getValues()) { - $code[] = ' return new \EmptyIterator();'; - } else { - $countCode = []; - $countCode[] = 'function () {'; - - foreach ($values as $k => $v) { - ($c = $this->getServiceConditionals($v)) ? $operands[] = "(int) ($c)" : ++$operands[0]; - $v = $this->wrapServiceConditionals($v, sprintf(" yield %s => %s;\n", $this->dumpValue($k, $interpolate), $this->dumpValue($v, $interpolate))); - foreach (explode("\n", $v) as $v) { - if ($v) { - $code[] = ' '.$v; - } - } - } - - $countCode[] = sprintf(' return %s;', implode(' + ', $operands)); - $countCode[] = ' }'; - } - - $code[] = sprintf(' }, %s)', \count($operands) > 1 ? implode("\n", $countCode) : $operands[0]); - - return implode("\n", $code); - } - - if ($value instanceof ServiceLocatorArgument) { - $serviceMap = ''; - $serviceTypes = ''; - foreach ($value->getValues() as $k => $v) { - if (!$v) { - continue; - } - $id = (string) $v; - while ($this->container->hasAlias($id)) { - $id = (string) $this->container->getAlias($id); - } - $definition = $this->container->getDefinition($id); - $load = !($definition->hasErrors() && $e = $definition->getErrors()) ? $this->asFiles && !$this->inlineFactories && !$this->isHotPath($definition) : reset($e); - $serviceMap .= sprintf("\n %s => [%s, %s, %s, %s],", - $this->export($k), - $this->export($definition->isShared() ? ($definition->isPublic() ? 'services' : 'privates') : false), - $this->doExport($id), - $this->export(ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE !== $v->getInvalidBehavior() && !\is_string($load) ? $this->generateMethodName($id) : null), - $this->export($load) - ); - $serviceTypes .= sprintf("\n %s => %s,", $this->export($k), $this->export($v instanceof TypedReference ? $v->getType() : '?')); - $this->locatedIds[$id] = true; - } - $this->addGetService = true; - - return sprintf('new \%s($this->getService, [%s%s], [%s%s])', ServiceLocator::class, $serviceMap, $serviceMap ? "\n " : '', $serviceTypes, $serviceTypes ? "\n " : ''); - } - } finally { - list($this->definitionVariables, $this->referenceVariables) = $scope; - } - } elseif ($value instanceof Definition) { - if ($value->hasErrors() && $e = $value->getErrors()) { - $this->addThrow = true; - - return sprintf('$this->throw(%s)', $this->export(reset($e))); - } - if (null !== $this->definitionVariables && $this->definitionVariables->contains($value)) { - return $this->dumpValue($this->definitionVariables[$value], $interpolate); - } - if ($value->getMethodCalls()) { - throw new RuntimeException('Cannot dump definitions which have method calls.'); - } - if ($value->getProperties()) { - throw new RuntimeException('Cannot dump definitions which have properties.'); - } - if (null !== $value->getConfigurator()) { - throw new RuntimeException('Cannot dump definitions which have a configurator.'); - } - - return $this->addNewInstance($value); - } elseif ($value instanceof Variable) { - return '$'.$value; - } elseif ($value instanceof Reference) { - $id = (string) $value; - - while ($this->container->hasAlias($id)) { - $id = (string) $this->container->getAlias($id); - } - - if (null !== $this->referenceVariables && isset($this->referenceVariables[$id])) { - return $this->dumpValue($this->referenceVariables[$id], $interpolate); - } - - return $this->getServiceCall($id, $value); - } elseif ($value instanceof Expression) { - return $this->getExpressionLanguage()->compile((string) $value, ['this' => 'container']); - } elseif ($value instanceof Parameter) { - return $this->dumpParameter($value); - } elseif (true === $interpolate && \is_string($value)) { - if (preg_match('/^%([^%]+)%$/', $value, $match)) { - // we do this to deal with non string values (Boolean, integer, ...) - // the preg_replace_callback converts them to strings - return $this->dumpParameter($match[1]); - } else { - $replaceParameters = function ($match) { - return "'.".$this->dumpParameter($match[2]).".'"; - }; - - $code = str_replace('%%', '%', preg_replace_callback('/(?export($value))); - - return $code; - } - } elseif ($value instanceof AbstractArgument) { - throw new RuntimeException($value->getTextWithContext()); - } elseif (\is_object($value) || \is_resource($value)) { - throw new RuntimeException('Unable to dump a service container if a parameter is an object or a resource.'); - } - - return $this->export($value); - } - - /** - * Dumps a string to a literal (aka PHP Code) class value. - * - * @throws RuntimeException - */ - private function dumpLiteralClass(string $class): string - { - if (false !== strpos($class, '$')) { - return sprintf('${($_ = %s) && false ?: "_"}', $class); - } - if (0 !== strpos($class, "'") || !preg_match('/^\'(?:\\\{2})?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) { - throw new RuntimeException(sprintf('Cannot dump definition because of invalid class name (%s).', $class ?: 'n/a')); - } - - $class = substr(str_replace('\\\\', '\\', $class), 1, -1); - - return 0 === strpos($class, '\\') ? $class : '\\'.$class; - } - - private function dumpParameter(string $name): string - { - if ($this->container->hasParameter($name)) { - $value = $this->container->getParameter($name); - $dumpedValue = $this->dumpValue($value, false); - - if (!$value || !\is_array($value)) { - return $dumpedValue; - } - - if (!preg_match("/\\\$this->(?:getEnv\('(?:\w++:)*+\w++'\)|targetDir\.'')/", $dumpedValue)) { - return sprintf('$this->parameters[%s]', $this->doExport($name)); - } - } - - return sprintf('$this->getParameter(%s)', $this->doExport($name)); - } - - private function getServiceCall(string $id, Reference $reference = null): string - { - while ($this->container->hasAlias($id)) { - $id = (string) $this->container->getAlias($id); - } - - if ('service_container' === $id) { - return '$this'; - } - - if ($this->container->hasDefinition($id) && $definition = $this->container->getDefinition($id)) { - if ($definition->isSynthetic()) { - $code = sprintf('$this->get(%s%s)', $this->doExport($id), null !== $reference ? ', '.$reference->getInvalidBehavior() : ''); - } elseif (null !== $reference && ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $reference->getInvalidBehavior()) { - $code = 'null'; - if (!$definition->isShared()) { - return $code; - } - } elseif ($this->isTrivialInstance($definition)) { - if ($definition->hasErrors() && $e = $definition->getErrors()) { - $this->addThrow = true; - - return sprintf('$this->throw(%s)', $this->export(reset($e))); - } - $code = $this->addNewInstance($definition, '', $id); - if ($definition->isShared() && !isset($this->singleUsePrivateIds[$id])) { - $code = sprintf('$this->%s[%s] = %s', $definition->isPublic() ? 'services' : 'privates', $this->doExport($id), $code); - } - $code = "($code)"; - } else { - $code = $this->asFiles && !$this->inlineFactories && !$this->isHotPath($definition) ? "\$this->load('%s')" : '$this->%s()'; - $code = sprintf($code, $this->generateMethodName($id)); - - if (!$definition->isShared()) { - $factory = sprintf('$this->factories%s[%s]', $definition->isPublic() ? '' : "['service_container']", $this->doExport($id)); - $code = sprintf('(isset(%s) ? %1$s() : %s)', $factory, $code); - } - } - if ($definition->isShared() && !isset($this->singleUsePrivateIds[$id])) { - $code = sprintf('($this->%s[%s] ?? %s)', $definition->isPublic() ? 'services' : 'privates', $this->doExport($id), $code); - } - - return $code; - } - if (null !== $reference && ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $reference->getInvalidBehavior()) { - return 'null'; - } - if (null !== $reference && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE < $reference->getInvalidBehavior()) { - $code = sprintf('$this->get(%s, /* ContainerInterface::NULL_ON_INVALID_REFERENCE */ %d)', $this->doExport($id), ContainerInterface::NULL_ON_INVALID_REFERENCE); - } else { - $code = sprintf('$this->get(%s)', $this->doExport($id)); - } - - return sprintf('($this->services[%s] ?? %s)', $this->doExport($id), $code); - } - - /** - * Initializes the method names map to avoid conflicts with the Container methods. - */ - private function initializeMethodNamesMap(string $class) - { - $this->serviceIdToMethodNameMap = []; - $this->usedMethodNames = []; - - if ($reflectionClass = $this->container->getReflectionClass($class)) { - foreach ($reflectionClass->getMethods() as $method) { - $this->usedMethodNames[strtolower($method->getName())] = true; - } - } - } - - /** - * @throws InvalidArgumentException - */ - private function generateMethodName(string $id): string - { - if (isset($this->serviceIdToMethodNameMap[$id])) { - return $this->serviceIdToMethodNameMap[$id]; - } - - $i = strrpos($id, '\\'); - $name = Container::camelize(false !== $i && isset($id[1 + $i]) ? substr($id, 1 + $i) : $id); - $name = preg_replace('/[^a-zA-Z0-9_\x7f-\xff]/', '', $name); - $methodName = 'get'.$name.'Service'; - $suffix = 1; - - while (isset($this->usedMethodNames[strtolower($methodName)])) { - ++$suffix; - $methodName = 'get'.$name.$suffix.'Service'; - } - - $this->serviceIdToMethodNameMap[$id] = $methodName; - $this->usedMethodNames[strtolower($methodName)] = true; - - return $methodName; - } - - private function getNextVariableName(): string - { - $firstChars = self::FIRST_CHARS; - $firstCharsLength = \strlen($firstChars); - $nonFirstChars = self::NON_FIRST_CHARS; - $nonFirstCharsLength = \strlen($nonFirstChars); - - while (true) { - $name = ''; - $i = $this->variableCount; - - if ('' === $name) { - $name .= $firstChars[$i % $firstCharsLength]; - $i = (int) ($i / $firstCharsLength); - } - - while ($i > 0) { - --$i; - $name .= $nonFirstChars[$i % $nonFirstCharsLength]; - $i = (int) ($i / $nonFirstCharsLength); - } - - ++$this->variableCount; - - // check that the name is not reserved - if (\in_array($name, $this->reservedVariables, true)) { - continue; - } - - return $name; - } - } - - private function getExpressionLanguage(): ExpressionLanguage - { - if (null === $this->expressionLanguage) { - if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) { - throw new LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); - } - $providers = $this->container->getExpressionLanguageProviders(); - $this->expressionLanguage = new ExpressionLanguage(null, $providers, function ($arg) { - $id = '""' === substr_replace($arg, '', 1, -1) ? stripcslashes(substr($arg, 1, -1)) : null; - - if (null !== $id && ($this->container->hasAlias($id) || $this->container->hasDefinition($id))) { - return $this->getServiceCall($id); - } - - return sprintf('$this->get(%s)', $arg); - }); - - if ($this->container->isTrackingResources()) { - foreach ($providers as $provider) { - $this->container->addObjectResource($provider); - } - } - } - - return $this->expressionLanguage; - } - - private function isHotPath(Definition $definition): bool - { - return $this->hotPathTag && $definition->hasTag($this->hotPathTag) && !$definition->isDeprecated(); - } - - private function isSingleUsePrivateNode(ServiceReferenceGraphNode $node): bool - { - if ($node->getValue()->isPublic()) { - return false; - } - $ids = []; - foreach ($node->getInEdges() as $edge) { - if (!$value = $edge->getSourceNode()->getValue()) { - continue; - } - if ($edge->isLazy() || !$value instanceof Definition || !$value->isShared()) { - return false; - } - $ids[$edge->getSourceNode()->getId()] = true; - } - - return 1 === \count($ids); - } - - /** - * @return mixed - */ - private function export($value) - { - if (null !== $this->targetDirRegex && \is_string($value) && preg_match($this->targetDirRegex, $value, $matches, PREG_OFFSET_CAPTURE)) { - $suffix = $matches[0][1] + \strlen($matches[0][0]); - $matches[0][1] += \strlen($matches[1][0]); - $prefix = $matches[0][1] ? $this->doExport(substr($value, 0, $matches[0][1]), true).'.' : ''; - $suffix = isset($value[$suffix]) ? '.'.$this->doExport(substr($value, $suffix), true) : ''; - $dirname = $this->asFiles ? '$this->containerDir' : '__DIR__'; - $offset = 2 + $this->targetDirMaxMatches - \count($matches); - - if (0 < $offset) { - $dirname = sprintf('\dirname(__DIR__, %d)', $offset + (int) $this->asFiles); - } elseif ($this->asFiles) { - $dirname = "\$this->targetDir.''"; // empty string concatenation on purpose - } - - if ($prefix || $suffix) { - return sprintf('(%s%s%s)', $prefix, $dirname, $suffix); - } - - return $dirname; - } - - return $this->doExport($value, true); - } - - /** - * @return mixed - */ - private function doExport($value, bool $resolveEnv = false) - { - $shouldCacheValue = $resolveEnv && \is_string($value); - if ($shouldCacheValue && isset($this->exportedVariables[$value])) { - return $this->exportedVariables[$value]; - } - if (\is_string($value) && false !== strpos($value, "\n")) { - $cleanParts = explode("\n", $value); - $cleanParts = array_map(function ($part) { return var_export($part, true); }, $cleanParts); - $export = implode('."\n".', $cleanParts); - } else { - $export = var_export($value, true); - } - if ($this->asFiles) { - if (false !== strpos($export, '$this')) { - $export = str_replace('$this', "$'.'this", $export); - } - if (false !== strpos($export, 'function () {')) { - $export = str_replace('function () {', "function ('.') {", $export); - } - } - - if ($resolveEnv && "'" === $export[0] && $export !== $resolvedExport = $this->container->resolveEnvPlaceholders($export, "'.\$this->getEnv('string:%s').'")) { - $export = $resolvedExport; - if (".''" === substr($export, -3)) { - $export = substr($export, 0, -3); - if ("'" === $export[1]) { - $export = substr_replace($export, '', 18, 7); - } - } - if ("'" === $export[1]) { - $export = substr($export, 3); - } - } - - if ($shouldCacheValue) { - $this->exportedVariables[$value] = $export; - } - - return $export; - } - - private function getAutoloadFile(): ?string - { - if (null === $this->targetDirRegex) { - return null; - } - - foreach (spl_autoload_functions() as $autoloader) { - if (!\is_array($autoloader)) { - continue; - } - - if ($autoloader[0] instanceof DebugClassLoader || $autoloader[0] instanceof LegacyDebugClassLoader) { - $autoloader = $autoloader[0]->getClassLoader(); - } - - if (!\is_array($autoloader) || !$autoloader[0] instanceof ClassLoader || !$autoloader[0]->findFile(__CLASS__)) { - continue; - } - - foreach (get_declared_classes() as $class) { - if (0 === strpos($class, 'ComposerAutoloaderInit') && $class::getLoader() === $autoloader[0]) { - $file = \dirname((new \ReflectionClass($class))->getFileName(), 2).'/autoload.php'; - - if (preg_match($this->targetDirRegex.'A', $file)) { - return $file; - } - } - } - } - - return null; - } - - private function getClasses(Definition $definition, string $id): array - { - $classes = []; - - while ($definition instanceof Definition) { - foreach ($definition->getTag($this->preloadTags[0]) as $tag) { - if (!isset($tag['class'])) { - throw new InvalidArgumentException(sprintf('Missing attribute "class" on tag "%s" for service "%s".', $this->preloadTags[0], $id)); - } - - $classes[] = trim($tag['class'], '\\'); - } - - $classes[] = trim($definition->getClass(), '\\'); - $factory = $definition->getFactory(); - - if (!\is_array($factory)) { - $factory = [$factory]; - } - - if (\is_string($factory[0])) { - if (false !== $i = strrpos($factory[0], '::')) { - $factory[0] = substr($factory[0], 0, $i); - } - $classes[] = trim($factory[0], '\\'); - } - - $definition = $factory[0]; - } - - return array_filter($classes); - } -} diff --git a/vendor/symfony/dependency-injection/Dumper/Preloader.php b/vendor/symfony/dependency-injection/Dumper/Preloader.php deleted file mode 100644 index ef5a1c3..0000000 --- a/vendor/symfony/dependency-injection/Dumper/Preloader.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Dumper; - -/** - * @author Nicolas Grekas - */ -final class Preloader -{ - public static function append(string $file, array $list): void - { - if (!file_exists($file)) { - throw new \LogicException(sprintf('File "%s" does not exist.', $file)); - } - - $cacheDir = \dirname($file); - $classes = []; - - foreach ($list as $item) { - if (0 === strpos($item, $cacheDir)) { - file_put_contents($file, sprintf("require_once __DIR__.%s;\n", var_export(substr($item, \strlen($cacheDir)), true)), FILE_APPEND); - continue; - } - - $classes[] = sprintf("\$classes[] = %s;\n", var_export($item, true)); - } - - file_put_contents($file, sprintf("\n\$classes = [];\n%sPreloader::preload(\$classes);\n", implode('', $classes)), FILE_APPEND); - } - - public static function preload(array $classes): void - { - set_error_handler(function ($t, $m, $f, $l) { - if (error_reporting() & $t) { - if (__FILE__ !== $f) { - throw new \ErrorException($m, 0, $t, $f, $l); - } - - throw new \ReflectionException($m); - } - }); - - $prev = []; - $preloaded = []; - - try { - while ($prev !== $classes) { - $prev = $classes; - foreach ($classes as $c) { - if (!isset($preloaded[$c])) { - self::doPreload($c, $preloaded); - } - } - $classes = array_merge(get_declared_classes(), get_declared_interfaces(), get_declared_traits()); - } - } finally { - restore_error_handler(); - } - } - - private static function doPreload(string $class, array &$preloaded): void - { - if (isset($preloaded[$class]) || \in_array($class, ['self', 'static', 'parent'], true)) { - return; - } - - $preloaded[$class] = true; - - try { - $r = new \ReflectionClass($class); - - if ($r->isInternal()) { - return; - } - - $r->getConstants(); - $r->getDefaultProperties(); - - if (\PHP_VERSION_ID >= 70400) { - foreach ($r->getProperties(\ReflectionProperty::IS_PUBLIC) as $p) { - self::preloadType($p->getType(), $preloaded); - } - } - - foreach ($r->getMethods(\ReflectionMethod::IS_PUBLIC) as $m) { - foreach ($m->getParameters() as $p) { - if ($p->isDefaultValueAvailable() && $p->isDefaultValueConstant()) { - $c = $p->getDefaultValueConstantName(); - - if ($i = strpos($c, '::')) { - self::doPreload(substr($c, 0, $i), $preloaded); - } - } - - self::preloadType($p->getType(), $preloaded); - } - - self::preloadType($m->getReturnType(), $preloaded); - } - } catch (\ReflectionException $e) { - // ignore missing classes - } - } - - private static function preloadType(?\ReflectionType $t, array &$preloaded): void - { - if (!$t || $t->isBuiltin()) { - return; - } - - foreach ($t instanceof \ReflectionUnionType ? $t->getTypes() : [$t] as $t) { - if (!$t->isBuiltin()) { - self::doPreload($t instanceof \ReflectionNamedType ? $t->getName() : $t, $preloaded); - } - } - } -} diff --git a/vendor/symfony/dependency-injection/Dumper/XmlDumper.php b/vendor/symfony/dependency-injection/Dumper/XmlDumper.php deleted file mode 100644 index 2a0ee95..0000000 --- a/vendor/symfony/dependency-injection/Dumper/XmlDumper.php +++ /dev/null @@ -1,389 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Dumper; - -use Symfony\Component\DependencyInjection\Alias; -use Symfony\Component\DependencyInjection\Argument\AbstractArgument; -use Symfony\Component\DependencyInjection\Argument\IteratorArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; -use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Parameter; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\ExpressionLanguage\Expression; - -/** - * XmlDumper dumps a service container as an XML string. - * - * @author Fabien Potencier - * @author Martin Hasoň - */ -class XmlDumper extends Dumper -{ - /** - * @var \DOMDocument - */ - private $document; - - /** - * Dumps the service container as an XML string. - * - * @return string An xml string representing of the service container - */ - public function dump(array $options = []) - { - $this->document = new \DOMDocument('1.0', 'utf-8'); - $this->document->formatOutput = true; - - $container = $this->document->createElementNS('http://symfony.com/schema/dic/services', 'container'); - $container->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); - $container->setAttribute('xsi:schemaLocation', 'http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd'); - - $this->addParameters($container); - $this->addServices($container); - - $this->document->appendChild($container); - $xml = $this->document->saveXML(); - $this->document = null; - - return $this->container->resolveEnvPlaceholders($xml); - } - - private function addParameters(\DOMElement $parent) - { - $data = $this->container->getParameterBag()->all(); - if (!$data) { - return; - } - - if ($this->container->isCompiled()) { - $data = $this->escape($data); - } - - $parameters = $this->document->createElement('parameters'); - $parent->appendChild($parameters); - $this->convertParameters($data, 'parameter', $parameters); - } - - private function addMethodCalls(array $methodcalls, \DOMElement $parent) - { - foreach ($methodcalls as $methodcall) { - $call = $this->document->createElement('call'); - $call->setAttribute('method', $methodcall[0]); - if (\count($methodcall[1])) { - $this->convertParameters($methodcall[1], 'argument', $call); - } - if ($methodcall[2] ?? false) { - $call->setAttribute('returns-clone', 'true'); - } - $parent->appendChild($call); - } - } - - private function addService(Definition $definition, ?string $id, \DOMElement $parent) - { - $service = $this->document->createElement('service'); - if (null !== $id) { - $service->setAttribute('id', $id); - } - if ($class = $definition->getClass()) { - if ('\\' === substr($class, 0, 1)) { - $class = substr($class, 1); - } - - $service->setAttribute('class', $class); - } - if (!$definition->isShared()) { - $service->setAttribute('shared', 'false'); - } - if (!$definition->isPrivate()) { - $service->setAttribute('public', $definition->isPublic() ? 'true' : 'false'); - } - if ($definition->isSynthetic()) { - $service->setAttribute('synthetic', 'true'); - } - if ($definition->isLazy()) { - $service->setAttribute('lazy', 'true'); - } - if (null !== $decoratedService = $definition->getDecoratedService()) { - list($decorated, $renamedId, $priority) = $decoratedService; - $service->setAttribute('decorates', $decorated); - - $decorationOnInvalid = $decoratedService[3] ?? ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; - if (\in_array($decorationOnInvalid, [ContainerInterface::IGNORE_ON_INVALID_REFERENCE, ContainerInterface::NULL_ON_INVALID_REFERENCE], true)) { - $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE === $decorationOnInvalid ? 'null' : 'ignore'; - $service->setAttribute('decoration-on-invalid', $invalidBehavior); - } - if (null !== $renamedId) { - $service->setAttribute('decoration-inner-name', $renamedId); - } - if (0 !== $priority) { - $service->setAttribute('decoration-priority', $priority); - } - } - - foreach ($definition->getTags() as $name => $tags) { - foreach ($tags as $attributes) { - $tag = $this->document->createElement('tag'); - if (!\array_key_exists('name', $attributes)) { - $tag->setAttribute('name', $name); - } else { - $tag->appendChild($this->document->createTextNode($name)); - } - foreach ($attributes as $key => $value) { - $tag->setAttribute($key, $value); - } - $service->appendChild($tag); - } - } - - if ($definition->getFile()) { - $file = $this->document->createElement('file'); - $file->appendChild($this->document->createTextNode($definition->getFile())); - $service->appendChild($file); - } - - if ($parameters = $definition->getArguments()) { - $this->convertParameters($parameters, 'argument', $service); - } - - if ($parameters = $definition->getProperties()) { - $this->convertParameters($parameters, 'property', $service, 'name'); - } - - $this->addMethodCalls($definition->getMethodCalls(), $service); - - if ($callable = $definition->getFactory()) { - $factory = $this->document->createElement('factory'); - - if (\is_array($callable) && $callable[0] instanceof Definition) { - $this->addService($callable[0], null, $factory); - $factory->setAttribute('method', $callable[1]); - } elseif (\is_array($callable)) { - if (null !== $callable[0]) { - $factory->setAttribute($callable[0] instanceof Reference ? 'service' : 'class', $callable[0]); - } - $factory->setAttribute('method', $callable[1]); - } else { - $factory->setAttribute('function', $callable); - } - $service->appendChild($factory); - } - - if ($definition->isDeprecated()) { - $deprecation = $definition->getDeprecation('%service_id%'); - $deprecated = $this->document->createElement('deprecated'); - $deprecated->appendChild($this->document->createTextNode($definition->getDeprecation('%service_id%')['message'])); - $deprecated->setAttribute('package', $deprecation['package']); - $deprecated->setAttribute('version', $deprecation['version']); - - $service->appendChild($deprecated); - } - - if ($definition->isAutowired()) { - $service->setAttribute('autowire', 'true'); - } - - if ($definition->isAutoconfigured()) { - $service->setAttribute('autoconfigure', 'true'); - } - - if ($definition->isAbstract()) { - $service->setAttribute('abstract', 'true'); - } - - if ($callable = $definition->getConfigurator()) { - $configurator = $this->document->createElement('configurator'); - - if (\is_array($callable) && $callable[0] instanceof Definition) { - $this->addService($callable[0], null, $configurator); - $configurator->setAttribute('method', $callable[1]); - } elseif (\is_array($callable)) { - $configurator->setAttribute($callable[0] instanceof Reference ? 'service' : 'class', $callable[0]); - $configurator->setAttribute('method', $callable[1]); - } else { - $configurator->setAttribute('function', $callable); - } - $service->appendChild($configurator); - } - - $parent->appendChild($service); - } - - private function addServiceAlias(string $alias, Alias $id, \DOMElement $parent) - { - $service = $this->document->createElement('service'); - $service->setAttribute('id', $alias); - $service->setAttribute('alias', $id); - if (!$id->isPrivate()) { - $service->setAttribute('public', $id->isPublic() ? 'true' : 'false'); - } - - if ($id->isDeprecated()) { - $deprecation = $id->getDeprecation('%alias_id%'); - $deprecated = $this->document->createElement('deprecated'); - $deprecated->appendChild($this->document->createTextNode($deprecation['message'])); - $deprecated->setAttribute('package', $deprecation['package']); - $deprecated->setAttribute('version', $deprecation['version']); - - $service->appendChild($deprecated); - } - - $parent->appendChild($service); - } - - private function addServices(\DOMElement $parent) - { - $definitions = $this->container->getDefinitions(); - if (!$definitions) { - return; - } - - $services = $this->document->createElement('services'); - foreach ($definitions as $id => $definition) { - $this->addService($definition, $id, $services); - } - - $aliases = $this->container->getAliases(); - foreach ($aliases as $alias => $id) { - while (isset($aliases[(string) $id])) { - $id = $aliases[(string) $id]; - } - $this->addServiceAlias($alias, $id, $services); - } - $parent->appendChild($services); - } - - private function convertParameters(array $parameters, string $type, \DOMElement $parent, string $keyAttribute = 'key') - { - $withKeys = array_keys($parameters) !== range(0, \count($parameters) - 1); - foreach ($parameters as $key => $value) { - $element = $this->document->createElement($type); - if ($withKeys) { - $element->setAttribute($keyAttribute, $key); - } - - if ($value instanceof ServiceClosureArgument) { - $value = $value->getValues()[0]; - } - if (\is_array($tag = $value)) { - $element->setAttribute('type', 'collection'); - $this->convertParameters($value, $type, $element, 'key'); - } elseif ($value instanceof TaggedIteratorArgument || ($value instanceof ServiceLocatorArgument && $tag = $value->getTaggedIteratorArgument())) { - $element->setAttribute('type', $value instanceof TaggedIteratorArgument ? 'tagged_iterator' : 'tagged_locator'); - $element->setAttribute('tag', $tag->getTag()); - - if (null !== $tag->getIndexAttribute()) { - $element->setAttribute('index-by', $tag->getIndexAttribute()); - - if (null !== $tag->getDefaultIndexMethod()) { - $element->setAttribute('default-index-method', $tag->getDefaultIndexMethod()); - } - if (null !== $tag->getDefaultPriorityMethod()) { - $element->setAttribute('default-priority-method', $tag->getDefaultPriorityMethod()); - } - } - } elseif ($value instanceof IteratorArgument) { - $element->setAttribute('type', 'iterator'); - $this->convertParameters($value->getValues(), $type, $element, 'key'); - } elseif ($value instanceof ServiceLocatorArgument) { - $element->setAttribute('type', 'service_locator'); - $this->convertParameters($value->getValues(), $type, $element, 'key'); - } elseif ($value instanceof Reference) { - $element->setAttribute('type', 'service'); - $element->setAttribute('id', (string) $value); - $behavior = $value->getInvalidBehavior(); - if (ContainerInterface::NULL_ON_INVALID_REFERENCE == $behavior) { - $element->setAttribute('on-invalid', 'null'); - } elseif (ContainerInterface::IGNORE_ON_INVALID_REFERENCE == $behavior) { - $element->setAttribute('on-invalid', 'ignore'); - } elseif (ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE == $behavior) { - $element->setAttribute('on-invalid', 'ignore_uninitialized'); - } - } elseif ($value instanceof Definition) { - $element->setAttribute('type', 'service'); - $this->addService($value, null, $element); - } elseif ($value instanceof Expression) { - $element->setAttribute('type', 'expression'); - $text = $this->document->createTextNode(self::phpToXml((string) $value)); - $element->appendChild($text); - } elseif (\is_string($value) && !preg_match('/^[^\x00-\x08\x0B\x0E-\x1A\x1C-\x1F\x7F]*+$/u', $value)) { - $element->setAttribute('type', 'binary'); - $text = $this->document->createTextNode(self::phpToXml(base64_encode($value))); - $element->appendChild($text); - } elseif ($value instanceof AbstractArgument) { - $element->setAttribute('type', 'abstract'); - $text = $this->document->createTextNode(self::phpToXml($value->getText())); - $element->appendChild($text); - } else { - if (\in_array($value, ['null', 'true', 'false'], true)) { - $element->setAttribute('type', 'string'); - } - - if (\is_string($value) && (is_numeric($value) || preg_match('/^0b[01]*$/', $value) || preg_match('/^0x[0-9a-f]++$/i', $value))) { - $element->setAttribute('type', 'string'); - } - - $text = $this->document->createTextNode(self::phpToXml($value)); - $element->appendChild($text); - } - $parent->appendChild($element); - } - } - - /** - * Escapes arguments. - */ - private function escape(array $arguments): array - { - $args = []; - foreach ($arguments as $k => $v) { - if (\is_array($v)) { - $args[$k] = $this->escape($v); - } elseif (\is_string($v)) { - $args[$k] = str_replace('%', '%%', $v); - } else { - $args[$k] = $v; - } - } - - return $args; - } - - /** - * Converts php types to xml types. - * - * @param mixed $value Value to convert - * - * @throws RuntimeException When trying to dump object or resource - */ - public static function phpToXml($value): string - { - switch (true) { - case null === $value: - return 'null'; - case true === $value: - return 'true'; - case false === $value: - return 'false'; - case $value instanceof Parameter: - return '%'.$value.'%'; - case \is_object($value) || \is_resource($value): - throw new RuntimeException('Unable to dump a service container if a parameter is an object or a resource.'); - default: - return (string) $value; - } - } -} diff --git a/vendor/symfony/dependency-injection/Dumper/YamlDumper.php b/vendor/symfony/dependency-injection/Dumper/YamlDumper.php deleted file mode 100644 index ca57cba..0000000 --- a/vendor/symfony/dependency-injection/Dumper/YamlDumper.php +++ /dev/null @@ -1,367 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Dumper; - -use Symfony\Component\DependencyInjection\Alias; -use Symfony\Component\DependencyInjection\Argument\AbstractArgument; -use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; -use Symfony\Component\DependencyInjection\Argument\IteratorArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; -use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\LogicException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Parameter; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\ExpressionLanguage\Expression; -use Symfony\Component\Yaml\Dumper as YmlDumper; -use Symfony\Component\Yaml\Parser; -use Symfony\Component\Yaml\Tag\TaggedValue; -use Symfony\Component\Yaml\Yaml; - -/** - * YamlDumper dumps a service container as a YAML string. - * - * @author Fabien Potencier - */ -class YamlDumper extends Dumper -{ - private $dumper; - - /** - * Dumps the service container as an YAML string. - * - * @return string A YAML string representing of the service container - */ - public function dump(array $options = []) - { - if (!class_exists('Symfony\Component\Yaml\Dumper')) { - throw new LogicException('Unable to dump the container as the Symfony Yaml Component is not installed.'); - } - - if (null === $this->dumper) { - $this->dumper = new YmlDumper(); - } - - return $this->container->resolveEnvPlaceholders($this->addParameters()."\n".$this->addServices()); - } - - private function addService(string $id, Definition $definition): string - { - $code = " $id:\n"; - if ($class = $definition->getClass()) { - if ('\\' === substr($class, 0, 1)) { - $class = substr($class, 1); - } - - $code .= sprintf(" class: %s\n", $this->dumper->dump($class)); - } - - if (!$definition->isPrivate()) { - $code .= sprintf(" public: %s\n", $definition->isPublic() ? 'true' : 'false'); - } - - $tagsCode = ''; - foreach ($definition->getTags() as $name => $tags) { - foreach ($tags as $attributes) { - $att = []; - foreach ($attributes as $key => $value) { - $att[] = sprintf('%s: %s', $this->dumper->dump($key), $this->dumper->dump($value)); - } - $att = $att ? ': { '.implode(', ', $att).' }' : ''; - - $tagsCode .= sprintf(" - %s%s\n", $this->dumper->dump($name), $att); - } - } - if ($tagsCode) { - $code .= " tags:\n".$tagsCode; - } - - if ($definition->getFile()) { - $code .= sprintf(" file: %s\n", $this->dumper->dump($definition->getFile())); - } - - if ($definition->isSynthetic()) { - $code .= " synthetic: true\n"; - } - - if ($definition->isDeprecated()) { - $code .= " deprecated:\n"; - foreach ($definition->getDeprecation('%service_id%') as $key => $value) { - if ('' !== $value) { - $code .= sprintf(" %s: %s\n", $key, $this->dumper->dump($value)); - } - } - } - - if ($definition->isAutowired()) { - $code .= " autowire: true\n"; - } - - if ($definition->isAutoconfigured()) { - $code .= " autoconfigure: true\n"; - } - - if ($definition->isAbstract()) { - $code .= " abstract: true\n"; - } - - if ($definition->isLazy()) { - $code .= " lazy: true\n"; - } - - if ($definition->getArguments()) { - $code .= sprintf(" arguments: %s\n", $this->dumper->dump($this->dumpValue($definition->getArguments()), 0)); - } - - if ($definition->getProperties()) { - $code .= sprintf(" properties: %s\n", $this->dumper->dump($this->dumpValue($definition->getProperties()), 0)); - } - - if ($definition->getMethodCalls()) { - $code .= sprintf(" calls:\n%s\n", $this->dumper->dump($this->dumpValue($definition->getMethodCalls()), 1, 12)); - } - - if (!$definition->isShared()) { - $code .= " shared: false\n"; - } - - if (null !== $decoratedService = $definition->getDecoratedService()) { - list($decorated, $renamedId, $priority) = $decoratedService; - $code .= sprintf(" decorates: %s\n", $decorated); - if (null !== $renamedId) { - $code .= sprintf(" decoration_inner_name: %s\n", $renamedId); - } - if (0 !== $priority) { - $code .= sprintf(" decoration_priority: %s\n", $priority); - } - - $decorationOnInvalid = $decoratedService[3] ?? ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; - if (\in_array($decorationOnInvalid, [ContainerInterface::IGNORE_ON_INVALID_REFERENCE, ContainerInterface::NULL_ON_INVALID_REFERENCE])) { - $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE === $decorationOnInvalid ? 'null' : 'ignore'; - $code .= sprintf(" decoration_on_invalid: %s\n", $invalidBehavior); - } - } - - if ($callable = $definition->getFactory()) { - $code .= sprintf(" factory: %s\n", $this->dumper->dump($this->dumpCallable($callable), 0)); - } - - if ($callable = $definition->getConfigurator()) { - $code .= sprintf(" configurator: %s\n", $this->dumper->dump($this->dumpCallable($callable), 0)); - } - - return $code; - } - - private function addServiceAlias(string $alias, Alias $id): string - { - $deprecated = ''; - - if ($id->isDeprecated()) { - $deprecated = " deprecated:\n"; - - foreach ($id->getDeprecation('%alias_id%') as $key => $value) { - if ('' !== $value) { - $deprecated .= sprintf(" %s: %s\n", $key, $value); - } - } - } - - if (!$id->isDeprecated() && $id->isPrivate()) { - return sprintf(" %s: '@%s'\n", $alias, $id); - } - - return sprintf(" %s:\n alias: %s\n public: %s\n%s", $alias, $id, $id->isPublic() ? 'true' : 'false', $deprecated); - } - - private function addServices(): string - { - if (!$this->container->getDefinitions()) { - return ''; - } - - $code = "services:\n"; - foreach ($this->container->getDefinitions() as $id => $definition) { - $code .= $this->addService($id, $definition); - } - - $aliases = $this->container->getAliases(); - foreach ($aliases as $alias => $id) { - while (isset($aliases[(string) $id])) { - $id = $aliases[(string) $id]; - } - $code .= $this->addServiceAlias($alias, $id); - } - - return $code; - } - - private function addParameters(): string - { - if (!$this->container->getParameterBag()->all()) { - return ''; - } - - $parameters = $this->prepareParameters($this->container->getParameterBag()->all(), $this->container->isCompiled()); - - return $this->dumper->dump(['parameters' => $parameters], 2); - } - - /** - * Dumps callable to YAML format. - * - * @param mixed $callable - * - * @return mixed - */ - private function dumpCallable($callable) - { - if (\is_array($callable)) { - if ($callable[0] instanceof Reference) { - $callable = [$this->getServiceCall((string) $callable[0], $callable[0]), $callable[1]]; - } else { - $callable = [$callable[0], $callable[1]]; - } - } - - return $callable; - } - - /** - * Dumps the value to YAML format. - * - * @return mixed - * - * @throws RuntimeException When trying to dump object or resource - */ - private function dumpValue($value) - { - if ($value instanceof ServiceClosureArgument) { - $value = $value->getValues()[0]; - } - if ($value instanceof ArgumentInterface) { - $tag = $value; - - if ($value instanceof TaggedIteratorArgument || ($value instanceof ServiceLocatorArgument && $tag = $value->getTaggedIteratorArgument())) { - if (null === $tag->getIndexAttribute()) { - $content = $tag->getTag(); - } else { - $content = [ - 'tag' => $tag->getTag(), - 'index_by' => $tag->getIndexAttribute(), - ]; - - if (null !== $tag->getDefaultIndexMethod()) { - $content['default_index_method'] = $tag->getDefaultIndexMethod(); - } - if (null !== $tag->getDefaultPriorityMethod()) { - $content['default_priority_method'] = $tag->getDefaultPriorityMethod(); - } - } - - return new TaggedValue($value instanceof TaggedIteratorArgument ? 'tagged_iterator' : 'tagged_locator', $content); - } - - if ($value instanceof IteratorArgument) { - $tag = 'iterator'; - } elseif ($value instanceof ServiceLocatorArgument) { - $tag = 'service_locator'; - } else { - throw new RuntimeException(sprintf('Unspecified Yaml tag for type "%s".', get_debug_type($value))); - } - - return new TaggedValue($tag, $this->dumpValue($value->getValues())); - } - - if (\is_array($value)) { - $code = []; - foreach ($value as $k => $v) { - $code[$k] = $this->dumpValue($v); - } - - return $code; - } elseif ($value instanceof Reference) { - return $this->getServiceCall((string) $value, $value); - } elseif ($value instanceof Parameter) { - return $this->getParameterCall((string) $value); - } elseif ($value instanceof Expression) { - return $this->getExpressionCall((string) $value); - } elseif ($value instanceof Definition) { - return new TaggedValue('service', (new Parser())->parse("_:\n".$this->addService('_', $value), Yaml::PARSE_CUSTOM_TAGS)['_']['_']); - } elseif ($value instanceof AbstractArgument) { - return new TaggedValue('abstract', $value->getText()); - } elseif (\is_object($value) || \is_resource($value)) { - throw new RuntimeException('Unable to dump a service container if a parameter is an object or a resource.'); - } - - return $value; - } - - private function getServiceCall(string $id, Reference $reference = null): string - { - if (null !== $reference) { - switch ($reference->getInvalidBehavior()) { - case ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE: break; - case ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE: break; - case ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE: return sprintf('@!%s', $id); - default: return sprintf('@?%s', $id); - } - } - - return sprintf('@%s', $id); - } - - private function getParameterCall(string $id): string - { - return sprintf('%%%s%%', $id); - } - - private function getExpressionCall(string $expression): string - { - return sprintf('@=%s', $expression); - } - - private function prepareParameters(array $parameters, bool $escape = true): array - { - $filtered = []; - foreach ($parameters as $key => $value) { - if (\is_array($value)) { - $value = $this->prepareParameters($value, $escape); - } elseif ($value instanceof Reference || \is_string($value) && 0 === strpos($value, '@')) { - $value = '@'.$value; - } - - $filtered[$key] = $value; - } - - return $escape ? $this->escape($filtered) : $filtered; - } - - private function escape(array $arguments): array - { - $args = []; - foreach ($arguments as $k => $v) { - if (\is_array($v)) { - $args[$k] = $this->escape($v); - } elseif (\is_string($v)) { - $args[$k] = str_replace('%', '%%', $v); - } else { - $args[$k] = $v; - } - } - - return $args; - } -} diff --git a/vendor/symfony/dependency-injection/EnvVarLoaderInterface.php b/vendor/symfony/dependency-injection/EnvVarLoaderInterface.php deleted file mode 100644 index 0c547f8..0000000 --- a/vendor/symfony/dependency-injection/EnvVarLoaderInterface.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -/** - * EnvVarLoaderInterface objects return key/value pairs that are added to the list of available env vars. - * - * @author Nicolas Grekas - */ -interface EnvVarLoaderInterface -{ - /** - * @return string[] Key/value pairs that can be accessed using the regular "%env()%" syntax - */ - public function loadEnvVars(): array; -} diff --git a/vendor/symfony/dependency-injection/EnvVarProcessor.php b/vendor/symfony/dependency-injection/EnvVarProcessor.php deleted file mode 100644 index b16bad1..0000000 --- a/vendor/symfony/dependency-injection/EnvVarProcessor.php +++ /dev/null @@ -1,295 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Symfony\Component\DependencyInjection\Exception\EnvNotFoundException; -use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; - -/** - * @author Nicolas Grekas - */ -class EnvVarProcessor implements EnvVarProcessorInterface -{ - private $container; - private $loaders; - private $loadedVars = []; - - /** - * @param EnvVarLoaderInterface[] $loaders - */ - public function __construct(ContainerInterface $container, \Traversable $loaders = null) - { - $this->container = $container; - $this->loaders = $loaders ?? new \ArrayIterator(); - } - - /** - * {@inheritdoc} - */ - public static function getProvidedTypes() - { - return [ - 'base64' => 'string', - 'bool' => 'bool', - 'const' => 'bool|int|float|string|array', - 'csv' => 'array', - 'file' => 'string', - 'float' => 'float', - 'int' => 'int', - 'json' => 'array', - 'key' => 'bool|int|float|string|array', - 'url' => 'array', - 'query_string' => 'array', - 'resolve' => 'string', - 'default' => 'bool|int|float|string|array', - 'string' => 'string', - 'trim' => 'string', - 'require' => 'bool|int|float|string|array', - ]; - } - - /** - * {@inheritdoc} - */ - public function getEnv(string $prefix, string $name, \Closure $getEnv) - { - $i = strpos($name, ':'); - - if ('key' === $prefix) { - if (false === $i) { - throw new RuntimeException(sprintf('Invalid env "key:%s": a key specifier should be provided.', $name)); - } - - $next = substr($name, $i + 1); - $key = substr($name, 0, $i); - $array = $getEnv($next); - - if (!\is_array($array)) { - throw new RuntimeException(sprintf('Resolved value of "%s" did not result in an array value.', $next)); - } - - if (!isset($array[$key]) && !\array_key_exists($key, $array)) { - throw new EnvNotFoundException(sprintf('Key "%s" not found in %s (resolved from "%s").', $key, json_encode($array), $next)); - } - - return $array[$key]; - } - - if ('default' === $prefix) { - if (false === $i) { - throw new RuntimeException(sprintf('Invalid env "default:%s": a fallback parameter should be provided.', $name)); - } - - $next = substr($name, $i + 1); - $default = substr($name, 0, $i); - - if ('' !== $default && !$this->container->hasParameter($default)) { - throw new RuntimeException(sprintf('Invalid env fallback in "default:%s": parameter "%s" not found.', $name, $default)); - } - - try { - $env = $getEnv($next); - - if ('' !== $env && null !== $env) { - return $env; - } - } catch (EnvNotFoundException $e) { - // no-op - } - - return '' === $default ? null : $this->container->getParameter($default); - } - - if ('file' === $prefix || 'require' === $prefix) { - if (!is_scalar($file = $getEnv($name))) { - throw new RuntimeException(sprintf('Invalid file name: env var "%s" is non-scalar.', $name)); - } - if (!is_file($file)) { - throw new EnvNotFoundException(sprintf('File "%s" not found (resolved from "%s").', $file, $name)); - } - - if ('file' === $prefix) { - return file_get_contents($file); - } else { - return require $file; - } - } - - if (false !== $i || 'string' !== $prefix) { - $env = $getEnv($name); - } elseif (isset($_ENV[$name])) { - $env = $_ENV[$name]; - } elseif (isset($_SERVER[$name]) && 0 !== strpos($name, 'HTTP_')) { - $env = $_SERVER[$name]; - } elseif (false === ($env = getenv($name)) || null === $env) { // null is a possible value because of thread safety issues - foreach ($this->loadedVars as $vars) { - if (false !== $env = ($vars[$name] ?? false)) { - break; - } - } - - if (false === $env || null === $env) { - $loaders = $this->loaders; - $this->loaders = new \ArrayIterator(); - - try { - $i = 0; - $ended = true; - $count = $loaders instanceof \Countable ? $loaders->count() : 0; - foreach ($loaders as $loader) { - if (\count($this->loadedVars) > $i++) { - continue; - } - $this->loadedVars[] = $vars = $loader->loadEnvVars(); - if (false !== $env = $vars[$name] ?? false) { - $ended = false; - break; - } - } - if ($ended || $count === $i) { - $loaders = $this->loaders; - } - } catch (ParameterCircularReferenceException $e) { - // skip loaders that need an env var that is not defined - } finally { - $this->loaders = $loaders; - } - } - - if (false === $env || null === $env) { - if (!$this->container->hasParameter("env($name)")) { - throw new EnvNotFoundException(sprintf('Environment variable not found: "%s".', $name)); - } - - $env = $this->container->getParameter("env($name)"); - } - } - - if (null === $env) { - if (!isset($this->getProvidedTypes()[$prefix])) { - throw new RuntimeException(sprintf('Unsupported env var prefix "%s".', $prefix)); - } - - return null; - } - - if (!is_scalar($env)) { - throw new RuntimeException(sprintf('Non-scalar env var "%s" cannot be cast to "%s".', $name, $prefix)); - } - - if ('string' === $prefix) { - return (string) $env; - } - - if ('bool' === $prefix) { - return (bool) (filter_var($env, FILTER_VALIDATE_BOOLEAN) ?: filter_var($env, FILTER_VALIDATE_INT) ?: filter_var($env, FILTER_VALIDATE_FLOAT)); - } - - if ('int' === $prefix) { - if (false === $env = filter_var($env, FILTER_VALIDATE_INT) ?: filter_var($env, FILTER_VALIDATE_FLOAT)) { - throw new RuntimeException(sprintf('Non-numeric env var "%s" cannot be cast to int.', $name)); - } - - return (int) $env; - } - - if ('float' === $prefix) { - if (false === $env = filter_var($env, FILTER_VALIDATE_FLOAT)) { - throw new RuntimeException(sprintf('Non-numeric env var "%s" cannot be cast to float.', $name)); - } - - return (float) $env; - } - - if ('const' === $prefix) { - if (!\defined($env)) { - throw new RuntimeException(sprintf('Env var "%s" maps to undefined constant "%s".', $name, $env)); - } - - return \constant($env); - } - - if ('base64' === $prefix) { - return base64_decode(strtr($env, '-_', '+/')); - } - - if ('json' === $prefix) { - $env = json_decode($env, true); - - if (JSON_ERROR_NONE !== json_last_error()) { - throw new RuntimeException(sprintf('Invalid JSON in env var "%s": ', $name).json_last_error_msg()); - } - - if (null !== $env && !\is_array($env)) { - throw new RuntimeException(sprintf('Invalid JSON env var "%s": array or null expected, "%s" given.', $name, get_debug_type($env))); - } - - return $env; - } - - if ('url' === $prefix) { - $parsedEnv = parse_url($env); - - if (false === $parsedEnv) { - throw new RuntimeException(sprintf('Invalid URL in env var "%s".', $name)); - } - if (!isset($parsedEnv['scheme'], $parsedEnv['host'])) { - throw new RuntimeException(sprintf('Invalid URL env var "%s": schema and host expected, "%s" given.', $name, $env)); - } - $parsedEnv += [ - 'port' => null, - 'user' => null, - 'pass' => null, - 'path' => null, - 'query' => null, - 'fragment' => null, - ]; - - // remove the '/' separator - $parsedEnv['path'] = '/' === $parsedEnv['path'] ? null : substr($parsedEnv['path'], 1); - - return $parsedEnv; - } - - if ('query_string' === $prefix) { - $queryString = parse_url($env, PHP_URL_QUERY) ?: $env; - parse_str($queryString, $result); - - return $result; - } - - if ('resolve' === $prefix) { - return preg_replace_callback('/%%|%([^%\s]+)%/', function ($match) use ($name) { - if (!isset($match[1])) { - return '%'; - } - $value = $this->container->getParameter($match[1]); - if (!is_scalar($value)) { - throw new RuntimeException(sprintf('Parameter "%s" found when resolving env var "%s" must be scalar, "%s" given.', $match[1], $name, get_debug_type($value))); - } - - return $value; - }, $env); - } - - if ('csv' === $prefix) { - return str_getcsv($env, ',', '"', \PHP_VERSION_ID >= 70400 ? '' : '\\'); - } - - if ('trim' === $prefix) { - return trim($env); - } - - throw new RuntimeException(sprintf('Unsupported env var prefix "%s".', $prefix)); - } -} diff --git a/vendor/symfony/dependency-injection/EnvVarProcessorInterface.php b/vendor/symfony/dependency-injection/EnvVarProcessorInterface.php deleted file mode 100644 index d3275fe..0000000 --- a/vendor/symfony/dependency-injection/EnvVarProcessorInterface.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Symfony\Component\DependencyInjection\Exception\RuntimeException; - -/** - * The EnvVarProcessorInterface is implemented by objects that manage environment-like variables. - * - * @author Nicolas Grekas - */ -interface EnvVarProcessorInterface -{ - /** - * Returns the value of the given variable as managed by the current instance. - * - * @param string $prefix The namespace of the variable - * @param string $name The name of the variable within the namespace - * @param \Closure $getEnv A closure that allows fetching more env vars - * - * @return mixed - * - * @throws RuntimeException on error - */ - public function getEnv(string $prefix, string $name, \Closure $getEnv); - - /** - * @return string[] The PHP-types managed by getEnv(), keyed by prefixes - */ - public static function getProvidedTypes(); -} diff --git a/vendor/symfony/dependency-injection/Exception/AutowiringFailedException.php b/vendor/symfony/dependency-injection/Exception/AutowiringFailedException.php deleted file mode 100644 index c203b85..0000000 --- a/vendor/symfony/dependency-injection/Exception/AutowiringFailedException.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -/** - * Thrown when a definition cannot be autowired. - */ -class AutowiringFailedException extends RuntimeException -{ - private $serviceId; - private $messageCallback; - - public function __construct(string $serviceId, $message = '', int $code = 0, \Throwable $previous = null) - { - $this->serviceId = $serviceId; - - if ($message instanceof \Closure && \function_exists('xdebug_is_enabled') && xdebug_is_enabled()) { - $message = $message(); - } - - if (!$message instanceof \Closure) { - parent::__construct($message, $code, $previous); - - return; - } - - $this->messageCallback = $message; - parent::__construct('', $code, $previous); - - $this->message = new class($this->message, $this->messageCallback) { - private $message; - private $messageCallback; - - public function __construct(&$message, &$messageCallback) - { - $this->message = &$message; - $this->messageCallback = &$messageCallback; - } - - public function __toString(): string - { - $messageCallback = $this->messageCallback; - $this->messageCallback = null; - - try { - return $this->message = $messageCallback(); - } catch (\Throwable $e) { - return $this->message = $e->getMessage(); - } - } - }; - } - - public function getMessageCallback(): ?\Closure - { - return $this->messageCallback; - } - - public function getServiceId() - { - return $this->serviceId; - } -} diff --git a/vendor/symfony/dependency-injection/Exception/BadMethodCallException.php b/vendor/symfony/dependency-injection/Exception/BadMethodCallException.php deleted file mode 100644 index 959238e..0000000 --- a/vendor/symfony/dependency-injection/Exception/BadMethodCallException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -/** - * Base BadMethodCallException for Dependency Injection component. - */ -class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/dependency-injection/Exception/EnvNotFoundException.php b/vendor/symfony/dependency-injection/Exception/EnvNotFoundException.php deleted file mode 100644 index 04ac848..0000000 --- a/vendor/symfony/dependency-injection/Exception/EnvNotFoundException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -/** - * This exception is thrown when an environment variable is not found. - * - * @author Nicolas Grekas - */ -class EnvNotFoundException extends InvalidArgumentException -{ -} diff --git a/vendor/symfony/dependency-injection/Exception/EnvParameterException.php b/vendor/symfony/dependency-injection/Exception/EnvParameterException.php deleted file mode 100644 index 48b5e48..0000000 --- a/vendor/symfony/dependency-injection/Exception/EnvParameterException.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -/** - * This exception wraps exceptions whose messages contain a reference to an env parameter. - * - * @author Nicolas Grekas - */ -class EnvParameterException extends InvalidArgumentException -{ - public function __construct(array $envs, \Throwable $previous = null, string $message = 'Incompatible use of dynamic environment variables "%s" found in parameters.') - { - parent::__construct(sprintf($message, implode('", "', $envs)), 0, $previous); - } -} diff --git a/vendor/symfony/dependency-injection/Exception/ExceptionInterface.php b/vendor/symfony/dependency-injection/Exception/ExceptionInterface.php deleted file mode 100644 index 6202df7..0000000 --- a/vendor/symfony/dependency-injection/Exception/ExceptionInterface.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -use Psr\Container\ContainerExceptionInterface; - -/** - * Base ExceptionInterface for Dependency Injection component. - * - * @author Fabien Potencier - * @author Bulat Shakirzyanov - */ -interface ExceptionInterface extends ContainerExceptionInterface, \Throwable -{ -} diff --git a/vendor/symfony/dependency-injection/Exception/InvalidArgumentException.php b/vendor/symfony/dependency-injection/Exception/InvalidArgumentException.php deleted file mode 100644 index 119bb7d..0000000 --- a/vendor/symfony/dependency-injection/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -/** - * Base InvalidArgumentException for Dependency Injection component. - * - * @author Bulat Shakirzyanov - */ -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/dependency-injection/Exception/InvalidParameterTypeException.php b/vendor/symfony/dependency-injection/Exception/InvalidParameterTypeException.php deleted file mode 100644 index f6f12ad..0000000 --- a/vendor/symfony/dependency-injection/Exception/InvalidParameterTypeException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -/** - * Thrown when trying to inject a parameter into a constructor/method with an incompatible type. - * - * @author Nicolas Grekas - * @author Julien Maulny - */ -class InvalidParameterTypeException extends InvalidArgumentException -{ - public function __construct(string $serviceId, string $type, \ReflectionParameter $parameter) - { - $acceptedType = $parameter->getType(); - $acceptedType = $acceptedType instanceof \ReflectionNamedType ? $acceptedType->getName() : (string) $acceptedType; - $this->code = $type; - - parent::__construct(sprintf('Invalid definition for service "%s": argument %d of "%s::%s" accepts "%s", "%s" passed.', $serviceId, 1 + $parameter->getPosition(), $parameter->getDeclaringClass()->getName(), $parameter->getDeclaringFunction()->getName(), $acceptedType, $type)); - } -} diff --git a/vendor/symfony/dependency-injection/Exception/LogicException.php b/vendor/symfony/dependency-injection/Exception/LogicException.php deleted file mode 100644 index 17a070c..0000000 --- a/vendor/symfony/dependency-injection/Exception/LogicException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -/** - * Base LogicException for Dependency Injection component. - */ -class LogicException extends \LogicException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/dependency-injection/Exception/OutOfBoundsException.php b/vendor/symfony/dependency-injection/Exception/OutOfBoundsException.php deleted file mode 100644 index a61f143..0000000 --- a/vendor/symfony/dependency-injection/Exception/OutOfBoundsException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -/** - * Base OutOfBoundsException for Dependency Injection component. - */ -class OutOfBoundsException extends \OutOfBoundsException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php b/vendor/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php deleted file mode 100644 index 2450ccb..0000000 --- a/vendor/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -/** - * This exception is thrown when a circular reference in a parameter is detected. - * - * @author Fabien Potencier - */ -class ParameterCircularReferenceException extends RuntimeException -{ - private $parameters; - - public function __construct(array $parameters, \Throwable $previous = null) - { - parent::__construct(sprintf('Circular reference detected for parameter "%s" ("%s" > "%s").', $parameters[0], implode('" > "', $parameters), $parameters[0]), 0, $previous); - - $this->parameters = $parameters; - } - - public function getParameters() - { - return $this->parameters; - } -} diff --git a/vendor/symfony/dependency-injection/Exception/ParameterNotFoundException.php b/vendor/symfony/dependency-injection/Exception/ParameterNotFoundException.php deleted file mode 100644 index 7c0c5e3..0000000 --- a/vendor/symfony/dependency-injection/Exception/ParameterNotFoundException.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -use Psr\Container\NotFoundExceptionInterface; - -/** - * This exception is thrown when a non-existent parameter is used. - * - * @author Fabien Potencier - */ -class ParameterNotFoundException extends InvalidArgumentException implements NotFoundExceptionInterface -{ - private $key; - private $sourceId; - private $sourceKey; - private $alternatives; - private $nonNestedAlternative; - - /** - * @param string $key The requested parameter key - * @param string $sourceId The service id that references the non-existent parameter - * @param string $sourceKey The parameter key that references the non-existent parameter - * @param \Throwable $previous The previous exception - * @param string[] $alternatives Some parameter name alternatives - * @param string|null $nonNestedAlternative The alternative parameter name when the user expected dot notation for nested parameters - */ - public function __construct(string $key, string $sourceId = null, string $sourceKey = null, \Throwable $previous = null, array $alternatives = [], string $nonNestedAlternative = null) - { - $this->key = $key; - $this->sourceId = $sourceId; - $this->sourceKey = $sourceKey; - $this->alternatives = $alternatives; - $this->nonNestedAlternative = $nonNestedAlternative; - - parent::__construct('', 0, $previous); - - $this->updateRepr(); - } - - public function updateRepr() - { - if (null !== $this->sourceId) { - $this->message = sprintf('The service "%s" has a dependency on a non-existent parameter "%s".', $this->sourceId, $this->key); - } elseif (null !== $this->sourceKey) { - $this->message = sprintf('The parameter "%s" has a dependency on a non-existent parameter "%s".', $this->sourceKey, $this->key); - } else { - $this->message = sprintf('You have requested a non-existent parameter "%s".', $this->key); - } - - if ($this->alternatives) { - if (1 == \count($this->alternatives)) { - $this->message .= ' Did you mean this: "'; - } else { - $this->message .= ' Did you mean one of these: "'; - } - $this->message .= implode('", "', $this->alternatives).'"?'; - } elseif (null !== $this->nonNestedAlternative) { - $this->message .= ' You cannot access nested array items, do you want to inject "'.$this->nonNestedAlternative.'" instead?'; - } - } - - public function getKey() - { - return $this->key; - } - - public function getSourceId() - { - return $this->sourceId; - } - - public function getSourceKey() - { - return $this->sourceKey; - } - - public function setSourceId($sourceId) - { - $this->sourceId = $sourceId; - - $this->updateRepr(); - } - - public function setSourceKey($sourceKey) - { - $this->sourceKey = $sourceKey; - - $this->updateRepr(); - } -} diff --git a/vendor/symfony/dependency-injection/Exception/RuntimeException.php b/vendor/symfony/dependency-injection/Exception/RuntimeException.php deleted file mode 100644 index 5c24541..0000000 --- a/vendor/symfony/dependency-injection/Exception/RuntimeException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -/** - * Base RuntimeException for Dependency Injection component. - * - * @author Johannes M. Schmitt - */ -class RuntimeException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php b/vendor/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php deleted file mode 100644 index a38671b..0000000 --- a/vendor/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -/** - * This exception is thrown when a circular reference is detected. - * - * @author Johannes M. Schmitt - */ -class ServiceCircularReferenceException extends RuntimeException -{ - private $serviceId; - private $path; - - public function __construct(string $serviceId, array $path, \Throwable $previous = null) - { - parent::__construct(sprintf('Circular reference detected for service "%s", path: "%s".', $serviceId, implode(' -> ', $path)), 0, $previous); - - $this->serviceId = $serviceId; - $this->path = $path; - } - - public function getServiceId() - { - return $this->serviceId; - } - - public function getPath() - { - return $this->path; - } -} diff --git a/vendor/symfony/dependency-injection/Exception/ServiceNotFoundException.php b/vendor/symfony/dependency-injection/Exception/ServiceNotFoundException.php deleted file mode 100644 index f91afae..0000000 --- a/vendor/symfony/dependency-injection/Exception/ServiceNotFoundException.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Exception; - -use Psr\Container\NotFoundExceptionInterface; - -/** - * This exception is thrown when a non-existent service is requested. - * - * @author Johannes M. Schmitt - */ -class ServiceNotFoundException extends InvalidArgumentException implements NotFoundExceptionInterface -{ - private $id; - private $sourceId; - private $alternatives; - - public function __construct(string $id, string $sourceId = null, \Throwable $previous = null, array $alternatives = [], string $msg = null) - { - if (null !== $msg) { - // no-op - } elseif (null === $sourceId) { - $msg = sprintf('You have requested a non-existent service "%s".', $id); - } else { - $msg = sprintf('The service "%s" has a dependency on a non-existent service "%s".', $sourceId, $id); - } - - if ($alternatives) { - if (1 == \count($alternatives)) { - $msg .= ' Did you mean this: "'; - } else { - $msg .= ' Did you mean one of these: "'; - } - $msg .= implode('", "', $alternatives).'"?'; - } - - parent::__construct($msg, 0, $previous); - - $this->id = $id; - $this->sourceId = $sourceId; - $this->alternatives = $alternatives; - } - - public function getId() - { - return $this->id; - } - - public function getSourceId() - { - return $this->sourceId; - } - - public function getAlternatives() - { - return $this->alternatives; - } -} diff --git a/vendor/symfony/dependency-injection/ExpressionLanguage.php b/vendor/symfony/dependency-injection/ExpressionLanguage.php deleted file mode 100644 index 961c737..0000000 --- a/vendor/symfony/dependency-injection/ExpressionLanguage.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Psr\Cache\CacheItemPoolInterface; -use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage; - -if (!class_exists(BaseExpressionLanguage::class)) { - return; -} - -/** - * Adds some function to the default ExpressionLanguage. - * - * @author Fabien Potencier - * - * @see ExpressionLanguageProvider - */ -class ExpressionLanguage extends BaseExpressionLanguage -{ - /** - * {@inheritdoc} - */ - public function __construct(CacheItemPoolInterface $cache = null, array $providers = [], callable $serviceCompiler = null) - { - // prepend the default provider to let users override it easily - array_unshift($providers, new ExpressionLanguageProvider($serviceCompiler)); - - parent::__construct($cache, $providers); - } -} diff --git a/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php b/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php deleted file mode 100644 index 9198ca0..0000000 --- a/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Symfony\Component\ExpressionLanguage\ExpressionFunction; -use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; - -/** - * Define some ExpressionLanguage functions. - * - * To get a service, use service('request'). - * To get a parameter, use parameter('kernel.debug'). - * - * @author Fabien Potencier - */ -class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface -{ - private $serviceCompiler; - - public function __construct(callable $serviceCompiler = null) - { - $this->serviceCompiler = $serviceCompiler; - } - - public function getFunctions() - { - return [ - new ExpressionFunction('service', $this->serviceCompiler ?: function ($arg) { - return sprintf('$this->get(%s)', $arg); - }, function (array $variables, $value) { - return $variables['container']->get($value); - }), - - new ExpressionFunction('parameter', function ($arg) { - return sprintf('$this->getParameter(%s)', $arg); - }, function (array $variables, $value) { - return $variables['container']->getParameter($value); - }), - ]; - } -} diff --git a/vendor/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.php b/vendor/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.php deleted file mode 100644 index c3bd842..0000000 --- a/vendor/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Extension; - -use Symfony\Component\Config\Definition\ConfigurationInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * ConfigurationExtensionInterface is the interface implemented by container extension classes. - * - * @author Kevin Bond - */ -interface ConfigurationExtensionInterface -{ - /** - * Returns extension configuration. - * - * @return ConfigurationInterface|null The configuration or null - */ - public function getConfiguration(array $config, ContainerBuilder $container); -} diff --git a/vendor/symfony/dependency-injection/Extension/Extension.php b/vendor/symfony/dependency-injection/Extension/Extension.php deleted file mode 100644 index 81070c9..0000000 --- a/vendor/symfony/dependency-injection/Extension/Extension.php +++ /dev/null @@ -1,139 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Extension; - -use Symfony\Component\Config\Definition\ConfigurationInterface; -use Symfony\Component\Config\Definition\Processor; -use Symfony\Component\DependencyInjection\Container; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\BadMethodCallException; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\LogicException; - -/** - * Provides useful features shared by many extensions. - * - * @author Fabien Potencier - */ -abstract class Extension implements ExtensionInterface, ConfigurationExtensionInterface -{ - private $processedConfigs = []; - - /** - * {@inheritdoc} - */ - public function getXsdValidationBasePath() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function getNamespace() - { - return 'http://example.org/schema/dic/'.$this->getAlias(); - } - - /** - * Returns the recommended alias to use in XML. - * - * This alias is also the mandatory prefix to use when using YAML. - * - * This convention is to remove the "Extension" postfix from the class - * name and then lowercase and underscore the result. So: - * - * AcmeHelloExtension - * - * becomes - * - * acme_hello - * - * This can be overridden in a sub-class to specify the alias manually. - * - * @return string The alias - * - * @throws BadMethodCallException When the extension name does not follow conventions - */ - public function getAlias() - { - $className = static::class; - if ('Extension' != substr($className, -9)) { - throw new BadMethodCallException('This extension does not follow the naming convention; you must overwrite the getAlias() method.'); - } - $classBaseName = substr(strrchr($className, '\\'), 1, -9); - - return Container::underscore($classBaseName); - } - - /** - * {@inheritdoc} - */ - public function getConfiguration(array $config, ContainerBuilder $container) - { - $class = static::class; - - if (false !== strpos($class, "\0")) { - return null; // ignore anonymous classes - } - - $class = substr_replace($class, '\Configuration', strrpos($class, '\\')); - $class = $container->getReflectionClass($class); - - if (!$class) { - return null; - } - - if (!$class->implementsInterface(ConfigurationInterface::class)) { - throw new LogicException(sprintf('The extension configuration class "%s" must implement "%s".', $class->getName(), ConfigurationInterface::class)); - } - - if (!($constructor = $class->getConstructor()) || !$constructor->getNumberOfRequiredParameters()) { - return $class->newInstance(); - } - - return null; - } - - final protected function processConfiguration(ConfigurationInterface $configuration, array $configs): array - { - $processor = new Processor(); - - return $this->processedConfigs[] = $processor->processConfiguration($configuration, $configs); - } - - /** - * @internal - */ - final public function getProcessedConfigs(): array - { - try { - return $this->processedConfigs; - } finally { - $this->processedConfigs = []; - } - } - - /** - * @return bool Whether the configuration is enabled - * - * @throws InvalidArgumentException When the config is not enableable - */ - protected function isConfigEnabled(ContainerBuilder $container, array $config) - { - if (!\array_key_exists('enabled', $config)) { - throw new InvalidArgumentException("The config array has no 'enabled' key."); - } - - return (bool) $container->getParameterBag()->resolveValue($config['enabled']); - } -} diff --git a/vendor/symfony/dependency-injection/Extension/ExtensionInterface.php b/vendor/symfony/dependency-injection/Extension/ExtensionInterface.php deleted file mode 100644 index 6a7a2cf..0000000 --- a/vendor/symfony/dependency-injection/Extension/ExtensionInterface.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Extension; - -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * ExtensionInterface is the interface implemented by container extension classes. - * - * @author Fabien Potencier - */ -interface ExtensionInterface -{ - /** - * Loads a specific configuration. - * - * @throws \InvalidArgumentException When provided tag is not defined in this extension - */ - public function load(array $configs, ContainerBuilder $container); - - /** - * Returns the namespace to be used for this extension (XML namespace). - * - * @return string The XML namespace - */ - public function getNamespace(); - - /** - * Returns the base path for the XSD files. - * - * @return string|false - */ - public function getXsdValidationBasePath(); - - /** - * Returns the recommended alias to use in XML. - * - * This alias is also the mandatory prefix to use when using YAML. - * - * @return string The alias - */ - public function getAlias(); -} diff --git a/vendor/symfony/dependency-injection/Extension/PrependExtensionInterface.php b/vendor/symfony/dependency-injection/Extension/PrependExtensionInterface.php deleted file mode 100644 index 5bd18d7..0000000 --- a/vendor/symfony/dependency-injection/Extension/PrependExtensionInterface.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Extension; - -use Symfony\Component\DependencyInjection\ContainerBuilder; - -interface PrependExtensionInterface -{ - /** - * Allow an extension to prepend the extension configurations. - */ - public function prepend(ContainerBuilder $container); -} diff --git a/vendor/symfony/dependency-injection/LICENSE b/vendor/symfony/dependency-injection/LICENSE deleted file mode 100644 index 9e936ec..0000000 --- a/vendor/symfony/dependency-injection/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php b/vendor/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php deleted file mode 100644 index a9d7811..0000000 --- a/vendor/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\LazyProxy\Instantiator; - -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; - -/** - * Lazy proxy instantiator, capable of instantiating a proxy given a container, the - * service definitions and a callback that produces the real service instance. - * - * @author Marco Pivetta - */ -interface InstantiatorInterface -{ - /** - * Instantiates a proxy object. - * - * @param string $id Identifier of the requested service - * @param callable $realInstantiator Zero-argument callback that is capable of producing the real service instance - * - * @return object - */ - public function instantiateProxy(ContainerInterface $container, Definition $definition, string $id, callable $realInstantiator); -} diff --git a/vendor/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php b/vendor/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php deleted file mode 100644 index 1696e7a..0000000 --- a/vendor/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\LazyProxy\Instantiator; - -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; - -/** - * {@inheritdoc} - * - * Noop proxy instantiator - produces the real service instead of a proxy instance. - * - * @author Marco Pivetta - */ -class RealServiceInstantiator implements InstantiatorInterface -{ - /** - * {@inheritdoc} - */ - public function instantiateProxy(ContainerInterface $container, Definition $definition, string $id, callable $realInstantiator) - { - return $realInstantiator(); - } -} diff --git a/vendor/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php b/vendor/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php deleted file mode 100644 index 351560d..0000000 --- a/vendor/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\LazyProxy\PhpDumper; - -use Symfony\Component\DependencyInjection\Definition; - -/** - * Lazy proxy dumper capable of generating the instantiation logic PHP code for proxied services. - * - * @author Marco Pivetta - */ -interface DumperInterface -{ - /** - * Inspects whether the given definitions should produce proxy instantiation logic in the dumped container. - * - * @return bool - */ - public function isProxyCandidate(Definition $definition); - - /** - * Generates the code to be used to instantiate a proxy in the dumped factory code. - * - * @return string - */ - public function getProxyFactoryCode(Definition $definition, string $id, string $factoryCode); - - /** - * Generates the code for the lazy proxy. - * - * @return string - */ - public function getProxyCode(Definition $definition); -} diff --git a/vendor/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php b/vendor/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php deleted file mode 100644 index 7e0f14c..0000000 --- a/vendor/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\LazyProxy\PhpDumper; - -use Symfony\Component\DependencyInjection\Definition; - -/** - * Null dumper, negates any proxy code generation for any given service definition. - * - * @author Marco Pivetta - * - * @final - */ -class NullDumper implements DumperInterface -{ - /** - * {@inheritdoc} - */ - public function isProxyCandidate(Definition $definition): bool - { - return false; - } - - /** - * {@inheritdoc} - */ - public function getProxyFactoryCode(Definition $definition, string $id, string $factoryCode): string - { - return ''; - } - - /** - * {@inheritdoc} - */ - public function getProxyCode(Definition $definition): string - { - return ''; - } -} diff --git a/vendor/symfony/dependency-injection/LazyProxy/ProxyHelper.php b/vendor/symfony/dependency-injection/LazyProxy/ProxyHelper.php deleted file mode 100644 index f4a5afb..0000000 --- a/vendor/symfony/dependency-injection/LazyProxy/ProxyHelper.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\LazyProxy; - -/** - * @author Nicolas Grekas - * - * @internal - */ -class ProxyHelper -{ - /** - * @return string|null The FQCN or builtin name of the type hint, or null when the type hint references an invalid self|parent context - */ - public static function getTypeHint(\ReflectionFunctionAbstract $r, \ReflectionParameter $p = null, bool $noBuiltin = false): ?string - { - if ($p instanceof \ReflectionParameter) { - $type = $p->getType(); - } else { - $type = $r->getReturnType(); - } - if (!$type) { - return null; - } - - $types = []; - - foreach ($type instanceof \ReflectionUnionType ? $type->getTypes() : [$type] as $type) { - $name = $type instanceof \ReflectionNamedType ? $type->getName() : (string) $type; - - if ($type->isBuiltin()) { - if (!$noBuiltin) { - $types[] = $name; - } - continue; - } - - $lcName = strtolower($name); - $prefix = $noBuiltin ? '' : '\\'; - - if ('self' !== $lcName && 'parent' !== $lcName) { - $types[] = '' !== $prefix ? $prefix.$name : $name; - continue; - } - if (!$r instanceof \ReflectionMethod) { - continue; - } - if ('self' === $lcName) { - $types[] = $prefix.$r->getDeclaringClass()->name; - } else { - $types[] = ($parent = $r->getDeclaringClass()->getParentClass()) ? $prefix.$parent->name : null; - } - } - - return $types ? implode('|', $types) : null; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/ClosureLoader.php b/vendor/symfony/dependency-injection/Loader/ClosureLoader.php deleted file mode 100644 index 57aa83d..0000000 --- a/vendor/symfony/dependency-injection/Loader/ClosureLoader.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader; - -use Symfony\Component\Config\Loader\Loader; -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * ClosureLoader loads service definitions from a PHP closure. - * - * The Closure has access to the container as its first argument. - * - * @author Fabien Potencier - */ -class ClosureLoader extends Loader -{ - private $container; - - public function __construct(ContainerBuilder $container) - { - $this->container = $container; - } - - /** - * {@inheritdoc} - */ - public function load($resource, string $type = null) - { - $resource($this->container); - } - - /** - * {@inheritdoc} - */ - public function supports($resource, string $type = null) - { - return $resource instanceof \Closure; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php deleted file mode 100644 index 23e64bb..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php +++ /dev/null @@ -1,96 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Parameter; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\ExpressionLanguage\Expression; - -abstract class AbstractConfigurator -{ - const FACTORY = 'unknown'; - - /** - * @var callable(mixed $value, bool $allowService)|null - */ - public static $valuePreProcessor; - - /** @internal */ - protected $definition; - - public function __call(string $method, array $args) - { - if (method_exists($this, 'set'.$method)) { - return $this->{'set'.$method}(...$args); - } - - throw new \BadMethodCallException(sprintf('Call to undefined method "%s::%s()".', static::class, $method)); - } - - /** - * Checks that a value is valid, optionally replacing Definition and Reference configurators by their configure value. - * - * @param mixed $value - * @param bool $allowServices whether Definition and Reference are allowed; by default, only scalars and arrays are - * - * @return mixed the value, optionally cast to a Definition/Reference - */ - public static function processValue($value, $allowServices = false) - { - if (\is_array($value)) { - foreach ($value as $k => $v) { - $value[$k] = static::processValue($v, $allowServices); - } - - return self::$valuePreProcessor ? (self::$valuePreProcessor)($value, $allowServices) : $value; - } - - if (self::$valuePreProcessor) { - $value = (self::$valuePreProcessor)($value, $allowServices); - } - - if ($value instanceof ReferenceConfigurator) { - return new Reference($value->id, $value->invalidBehavior); - } - - if ($value instanceof InlineServiceConfigurator) { - $def = $value->definition; - $value->definition = null; - - return $def; - } - - if ($value instanceof self) { - throw new InvalidArgumentException(sprintf('"%s()" can be used only at the root of service configuration files.', $value::FACTORY)); - } - - switch (true) { - case null === $value: - case is_scalar($value): - return $value; - - case $value instanceof ArgumentInterface: - case $value instanceof Definition: - case $value instanceof Expression: - case $value instanceof Parameter: - case $value instanceof Reference: - if ($allowServices) { - return $value; - } - } - - throw new InvalidArgumentException(sprintf('Cannot use values of type "%s" in service configuration files.', get_debug_type($value))); - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php deleted file mode 100644 index 68b3cb5..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; - -abstract class AbstractServiceConfigurator extends AbstractConfigurator -{ - protected $parent; - protected $id; - private $defaultTags = []; - - public function __construct(ServicesConfigurator $parent, Definition $definition, string $id = null, array $defaultTags = []) - { - $this->parent = $parent; - $this->definition = $definition; - $this->id = $id; - $this->defaultTags = $defaultTags; - } - - public function __destruct() - { - // default tags should be added last - foreach ($this->defaultTags as $name => $attributes) { - foreach ($attributes as $attributes) { - $this->definition->addTag($name, $attributes); - } - } - $this->defaultTags = []; - } - - /** - * Registers a service. - */ - final public function set(?string $id, string $class = null): ServiceConfigurator - { - $this->__destruct(); - - return $this->parent->set($id, $class); - } - - /** - * Creates an alias. - */ - final public function alias(string $id, string $referencedId): AliasConfigurator - { - $this->__destruct(); - - return $this->parent->alias($id, $referencedId); - } - - /** - * Registers a PSR-4 namespace using a glob pattern. - */ - final public function load(string $namespace, string $resource): PrototypeConfigurator - { - $this->__destruct(); - - return $this->parent->load($namespace, $resource); - } - - /** - * Gets an already defined service definition. - * - * @throws ServiceNotFoundException if the service definition does not exist - */ - final public function get(string $id): ServiceConfigurator - { - $this->__destruct(); - - return $this->parent->get($id); - } - - /** - * Registers a stack of decorator services. - * - * @param InlineServiceConfigurator[]|ReferenceConfigurator[] $services - */ - final public function stack(string $id, array $services): AliasConfigurator - { - $this->__destruct(); - - return $this->parent->stack($id, $services); - } - - /** - * Registers a service. - */ - final public function __invoke(string $id, string $class = null): ServiceConfigurator - { - $this->__destruct(); - - return $this->parent->set($id, $class); - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php deleted file mode 100644 index 8ac6357..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\Alias; - -/** - * @author Nicolas Grekas - */ -class AliasConfigurator extends AbstractServiceConfigurator -{ - const FACTORY = 'alias'; - - use Traits\DeprecateTrait; - use Traits\PublicTrait; - - public function __construct(ServicesConfigurator $parent, Alias $alias) - { - $this->parent = $parent; - $this->definition = $alias; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php deleted file mode 100644 index 16eb471..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php +++ /dev/null @@ -1,167 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\Argument\IteratorArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; -use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; -use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; -use Symfony\Component\ExpressionLanguage\Expression; - -/** - * @author Nicolas Grekas - */ -class ContainerConfigurator extends AbstractConfigurator -{ - const FACTORY = 'container'; - - private $container; - private $loader; - private $instanceof; - private $path; - private $file; - private $anonymousCount = 0; - - public function __construct(ContainerBuilder $container, PhpFileLoader $loader, array &$instanceof, string $path, string $file) - { - $this->container = $container; - $this->loader = $loader; - $this->instanceof = &$instanceof; - $this->path = $path; - $this->file = $file; - } - - final public function extension(string $namespace, array $config) - { - if (!$this->container->hasExtension($namespace)) { - $extensions = array_filter(array_map(function (ExtensionInterface $ext) { return $ext->getAlias(); }, $this->container->getExtensions())); - throw new InvalidArgumentException(sprintf('There is no extension able to load the configuration for "%s" (in "%s"). Looked for namespace "%s", found "%s".', $namespace, $this->file, $namespace, $extensions ? implode('", "', $extensions) : 'none')); - } - - $this->container->loadFromExtension($namespace, static::processValue($config)); - } - - final public function import(string $resource, string $type = null, $ignoreErrors = false) - { - $this->loader->setCurrentDir(\dirname($this->path)); - $this->loader->import($resource, $type, $ignoreErrors, $this->file); - } - - final public function parameters(): ParametersConfigurator - { - return new ParametersConfigurator($this->container); - } - - final public function services(): ServicesConfigurator - { - return new ServicesConfigurator($this->container, $this->loader, $this->instanceof, $this->path, $this->anonymousCount); - } - - /** - * @return static - */ - final public function withPath(string $path): self - { - $clone = clone $this; - $clone->path = $clone->file = $path; - - return $clone; - } -} - -/** - * Creates a service reference. - * - * @deprecated since Symfony 5.1, use service() instead. - */ -function ref(string $id): ReferenceConfigurator -{ - trigger_deprecation('symfony/dependency-injection', '5.1', '"%s()" is deprecated, use "service()" instead.', __FUNCTION__); - - return new ReferenceConfigurator($id); -} - -/** - * Creates a reference to a service. - */ -function service(string $serviceId): ReferenceConfigurator -{ - return new ReferenceConfigurator($serviceId); -} - -/** - * Creates an inline service. - * - * @deprecated since Symfony 5.1, use inline_service() instead. - */ -function inline(string $class = null): InlineServiceConfigurator -{ - trigger_deprecation('symfony/dependency-injection', '5.1', '"%s()" is deprecated, use "inline_service()" instead.', __FUNCTION__); - - return new InlineServiceConfigurator(new Definition($class)); -} - -/** - * Creates an inline service. - */ -function inline_service(string $class = null): InlineServiceConfigurator -{ - return new InlineServiceConfigurator(new Definition($class)); -} - -/** - * Creates a service locator. - * - * @param ReferenceConfigurator[] $values - */ -function service_locator(array $values): ServiceLocatorArgument -{ - return new ServiceLocatorArgument(AbstractConfigurator::processValue($values, true)); -} - -/** - * Creates a lazy iterator. - * - * @param ReferenceConfigurator[] $values - */ -function iterator(array $values): IteratorArgument -{ - return new IteratorArgument(AbstractConfigurator::processValue($values, true)); -} - -/** - * Creates a lazy iterator by tag name. - */ -function tagged_iterator(string $tag, string $indexAttribute = null, string $defaultIndexMethod = null, string $defaultPriorityMethod = null): TaggedIteratorArgument -{ - return new TaggedIteratorArgument($tag, $indexAttribute, $defaultIndexMethod, false, $defaultPriorityMethod); -} - -/** - * Creates a service locator by tag name. - */ -function tagged_locator(string $tag, string $indexAttribute = null, string $defaultIndexMethod = null): ServiceLocatorArgument -{ - return new ServiceLocatorArgument(new TaggedIteratorArgument($tag, $indexAttribute, $defaultIndexMethod, true)); -} - -/** - * Creates an expression. - */ -function expr(string $expression): Expression -{ - return new Expression($expression); -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php deleted file mode 100644 index cd9088f..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -/** - * @author Nicolas Grekas - */ -class DefaultsConfigurator extends AbstractServiceConfigurator -{ - const FACTORY = 'defaults'; - - use Traits\AutoconfigureTrait; - use Traits\AutowireTrait; - use Traits\BindTrait; - use Traits\PublicTrait; - - private $path; - - public function __construct(ServicesConfigurator $parent, Definition $definition, string $path = null) - { - parent::__construct($parent, $definition, null, []); - - $this->path = $path; - } - - /** - * Adds a tag for this definition. - * - * @return $this - * - * @throws InvalidArgumentException when an invalid tag name or attribute is provided - */ - final public function tag(string $name, array $attributes = []): self - { - if ('' === $name) { - throw new InvalidArgumentException('The tag name in "_defaults" must be a non-empty string.'); - } - - foreach ($attributes as $attribute => $value) { - if (null !== $value && !is_scalar($value)) { - throw new InvalidArgumentException(sprintf('Tag "%s", attribute "%s" in "_defaults" must be of a scalar-type.', $name, $attribute)); - } - } - - $this->definition->addTag($name, $attributes); - - return $this; - } - - /** - * Defines an instanceof-conditional to be applied to following service definitions. - */ - final public function instanceof(string $fqcn): InstanceofConfigurator - { - return $this->parent->instanceof($fqcn); - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php deleted file mode 100644 index 6bcd1c3..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\Definition; - -/** - * @author Nicolas Grekas - */ -class InlineServiceConfigurator extends AbstractConfigurator -{ - const FACTORY = 'service'; - - use Traits\ArgumentTrait; - use Traits\AutowireTrait; - use Traits\BindTrait; - use Traits\CallTrait; - use Traits\ConfiguratorTrait; - use Traits\FactoryTrait; - use Traits\FileTrait; - use Traits\LazyTrait; - use Traits\ParentTrait; - use Traits\PropertyTrait; - use Traits\TagTrait; - - private $id = '[inline]'; - private $allowParent = true; - private $path = null; - - public function __construct(Definition $definition) - { - $this->definition = $definition; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php deleted file mode 100644 index f75e176..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\Definition; - -/** - * @author Nicolas Grekas - */ -class InstanceofConfigurator extends AbstractServiceConfigurator -{ - const FACTORY = 'instanceof'; - - use Traits\AutowireTrait; - use Traits\CallTrait; - use Traits\ConfiguratorTrait; - use Traits\LazyTrait; - use Traits\PropertyTrait; - use Traits\PublicTrait; - use Traits\ShareTrait; - use Traits\TagTrait; - use Traits\BindTrait; - - private $path; - - public function __construct(ServicesConfigurator $parent, Definition $definition, string $id, string $path = null) - { - parent::__construct($parent, $definition, $id, []); - - $this->path = $path; - } - - /** - * Defines an instanceof-conditional to be applied to following service definitions. - */ - final public function instanceof(string $fqcn): self - { - return $this->parent->instanceof($fqcn); - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php deleted file mode 100644 index a88d28e..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * @author Nicolas Grekas - */ -class ParametersConfigurator extends AbstractConfigurator -{ - const FACTORY = 'parameters'; - - private $container; - - public function __construct(ContainerBuilder $container) - { - $this->container = $container; - } - - /** - * Creates a parameter. - * - * @return $this - */ - final public function set(string $name, $value): self - { - $this->container->setParameter($name, static::processValue($value, true)); - - return $this; - } - - /** - * Creates a parameter. - * - * @return $this - */ - final public function __invoke(string $name, $value): self - { - return $this->set($name, $value); - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/PrototypeConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/PrototypeConfigurator.php deleted file mode 100644 index 1b740ce..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/PrototypeConfigurator.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; - -/** - * @author Nicolas Grekas - */ -class PrototypeConfigurator extends AbstractServiceConfigurator -{ - const FACTORY = 'load'; - - use Traits\AbstractTrait; - use Traits\ArgumentTrait; - use Traits\AutoconfigureTrait; - use Traits\AutowireTrait; - use Traits\BindTrait; - use Traits\CallTrait; - use Traits\ConfiguratorTrait; - use Traits\DeprecateTrait; - use Traits\FactoryTrait; - use Traits\LazyTrait; - use Traits\ParentTrait; - use Traits\PropertyTrait; - use Traits\PublicTrait; - use Traits\ShareTrait; - use Traits\TagTrait; - - private $loader; - private $resource; - private $excludes; - private $allowParent; - - public function __construct(ServicesConfigurator $parent, PhpFileLoader $loader, Definition $defaults, string $namespace, string $resource, bool $allowParent) - { - $definition = new Definition(); - if (!$defaults->isPublic() || !$defaults->isPrivate()) { - $definition->setPublic($defaults->isPublic()); - } - $definition->setAutowired($defaults->isAutowired()); - $definition->setAutoconfigured($defaults->isAutoconfigured()); - // deep clone, to avoid multiple process of the same instance in the passes - $definition->setBindings(unserialize(serialize($defaults->getBindings()))); - $definition->setChanges([]); - - $this->loader = $loader; - $this->resource = $resource; - $this->allowParent = $allowParent; - - parent::__construct($parent, $definition, $namespace, $defaults->getTags()); - } - - public function __destruct() - { - parent::__destruct(); - - if ($this->loader) { - $this->loader->registerClasses($this->definition, $this->id, $this->resource, $this->excludes); - } - $this->loader = null; - } - - /** - * Excludes files from registration using glob patterns. - * - * @param string[]|string $excludes - * - * @return $this - */ - final public function exclude($excludes): self - { - $this->excludes = (array) $excludes; - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/ReferenceConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/ReferenceConfigurator.php deleted file mode 100644 index fa04253..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/ReferenceConfigurator.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\ContainerInterface; - -/** - * @author Nicolas Grekas - */ -class ReferenceConfigurator extends AbstractConfigurator -{ - /** @internal */ - protected $id; - - /** @internal */ - protected $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; - - public function __construct(string $id) - { - $this->id = $id; - } - - /** - * @return $this - */ - final public function ignoreOnInvalid(): self - { - $this->invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE; - - return $this; - } - - /** - * @return $this - */ - final public function nullOnInvalid(): self - { - $this->invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE; - - return $this; - } - - /** - * @return $this - */ - final public function ignoreOnUninitialized(): self - { - $this->invalidBehavior = ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE; - - return $this; - } - - /** - * @return string - */ - public function __toString() - { - return $this->id; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/ServiceConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/ServiceConfigurator.php deleted file mode 100644 index 8f6bfde..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/ServiceConfigurator.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; - -/** - * @author Nicolas Grekas - */ -class ServiceConfigurator extends AbstractServiceConfigurator -{ - const FACTORY = 'services'; - - use Traits\AbstractTrait; - use Traits\ArgumentTrait; - use Traits\AutoconfigureTrait; - use Traits\AutowireTrait; - use Traits\BindTrait; - use Traits\CallTrait; - use Traits\ClassTrait; - use Traits\ConfiguratorTrait; - use Traits\DecorateTrait; - use Traits\DeprecateTrait; - use Traits\FactoryTrait; - use Traits\FileTrait; - use Traits\LazyTrait; - use Traits\ParentTrait; - use Traits\PropertyTrait; - use Traits\PublicTrait; - use Traits\ShareTrait; - use Traits\SyntheticTrait; - use Traits\TagTrait; - - private $container; - private $instanceof; - private $allowParent; - private $path; - - public function __construct(ContainerBuilder $container, array $instanceof, bool $allowParent, ServicesConfigurator $parent, Definition $definition, $id, array $defaultTags, string $path = null) - { - $this->container = $container; - $this->instanceof = $instanceof; - $this->allowParent = $allowParent; - $this->path = $path; - - parent::__construct($parent, $definition, $id, $defaultTags); - } - - public function __destruct() - { - parent::__destruct(); - - $this->container->removeBindings($this->id); - $this->container->setDefinition($this->id, $this->definition->setInstanceofConditionals($this->instanceof)); - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/ServicesConfigurator.php b/vendor/symfony/dependency-injection/Loader/Configurator/ServicesConfigurator.php deleted file mode 100644 index 07392f0..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/ServicesConfigurator.php +++ /dev/null @@ -1,180 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator; - -use Symfony\Component\DependencyInjection\Alias; -use Symfony\Component\DependencyInjection\ChildDefinition; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; -use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; - -/** - * @author Nicolas Grekas - */ -class ServicesConfigurator extends AbstractConfigurator -{ - const FACTORY = 'services'; - - private $defaults; - private $container; - private $loader; - private $instanceof; - private $path; - private $anonymousHash; - private $anonymousCount; - - public function __construct(ContainerBuilder $container, PhpFileLoader $loader, array &$instanceof, string $path = null, int &$anonymousCount = 0) - { - $this->defaults = new Definition(); - $this->container = $container; - $this->loader = $loader; - $this->instanceof = &$instanceof; - $this->path = $path; - $this->anonymousHash = ContainerBuilder::hash($path ?: mt_rand()); - $this->anonymousCount = &$anonymousCount; - $instanceof = []; - } - - /** - * Defines a set of defaults for following service definitions. - */ - final public function defaults(): DefaultsConfigurator - { - return new DefaultsConfigurator($this, $this->defaults = new Definition(), $this->path); - } - - /** - * Defines an instanceof-conditional to be applied to following service definitions. - */ - final public function instanceof(string $fqcn): InstanceofConfigurator - { - $this->instanceof[$fqcn] = $definition = new ChildDefinition(''); - - return new InstanceofConfigurator($this, $definition, $fqcn, $this->path); - } - - /** - * Registers a service. - * - * @param string|null $id The service id, or null to create an anonymous service - * @param string|null $class The class of the service, or null when $id is also the class name - */ - final public function set(?string $id, string $class = null): ServiceConfigurator - { - $defaults = $this->defaults; - $definition = new Definition(); - - if (null === $id) { - if (!$class) { - throw new \LogicException('Anonymous services must have a class name.'); - } - - $id = sprintf('.%d_%s', ++$this->anonymousCount, preg_replace('/^.*\\\\/', '', $class).'~'.$this->anonymousHash); - $definition->setPublic(false); - } elseif (!$defaults->isPublic() || !$defaults->isPrivate()) { - $definition->setPublic($defaults->isPublic() && !$defaults->isPrivate()); - } - - $definition->setAutowired($defaults->isAutowired()); - $definition->setAutoconfigured($defaults->isAutoconfigured()); - // deep clone, to avoid multiple process of the same instance in the passes - $definition->setBindings(unserialize(serialize($defaults->getBindings()))); - $definition->setChanges([]); - - $configurator = new ServiceConfigurator($this->container, $this->instanceof, true, $this, $definition, $id, $defaults->getTags(), $this->path); - - return null !== $class ? $configurator->class($class) : $configurator; - } - - /** - * Creates an alias. - */ - final public function alias(string $id, string $referencedId): AliasConfigurator - { - $ref = static::processValue($referencedId, true); - $alias = new Alias((string) $ref); - if (!$this->defaults->isPublic() || !$this->defaults->isPrivate()) { - $alias->setPublic($this->defaults->isPublic()); - } - $this->container->setAlias($id, $alias); - - return new AliasConfigurator($this, $alias); - } - - /** - * Registers a PSR-4 namespace using a glob pattern. - */ - final public function load(string $namespace, string $resource): PrototypeConfigurator - { - return new PrototypeConfigurator($this, $this->loader, $this->defaults, $namespace, $resource, true); - } - - /** - * Gets an already defined service definition. - * - * @throws ServiceNotFoundException if the service definition does not exist - */ - final public function get(string $id): ServiceConfigurator - { - $definition = $this->container->getDefinition($id); - - return new ServiceConfigurator($this->container, $definition->getInstanceofConditionals(), true, $this, $definition, $id, []); - } - - /** - * Registers a stack of decorator services. - * - * @param InlineServiceConfigurator[]|ReferenceConfigurator[] $services - */ - final public function stack(string $id, array $services): AliasConfigurator - { - foreach ($services as $i => $service) { - if ($service instanceof InlineServiceConfigurator) { - $definition = $service->definition->setInstanceofConditionals($this->instanceof); - - $changes = $definition->getChanges(); - $definition->setAutowired((isset($changes['autowired']) ? $definition : $this->defaults)->isAutowired()); - $definition->setAutoconfigured((isset($changes['autoconfigured']) ? $definition : $this->defaults)->isAutoconfigured()); - $definition->setBindings(array_merge($this->defaults->getBindings(), $definition->getBindings())); - $definition->setChanges($changes); - - $services[$i] = $definition; - } elseif (!$service instanceof ReferenceConfigurator) { - throw new InvalidArgumentException(sprintf('"%s()" expects a list of definitions as returned by "%s()" or "%s()", "%s" given at index "%s" for service "%s".', __METHOD__, InlineServiceConfigurator::FACTORY, ReferenceConfigurator::FACTORY, $service instanceof AbstractConfigurator ? $service::FACTORY.'()' : get_debug_type($service), $i, $id)); - } - } - - $alias = $this->alias($id, ''); - $alias->definition = $this->set($id) - ->parent('') - ->args($services) - ->tag('container.stack') - ->definition; - - return $alias; - } - - /** - * Registers a service. - */ - final public function __invoke(string $id, string $class = null): ServiceConfigurator - { - return $this->set($id, $class); - } - - public function __destruct() - { - $this->loader->registerAliasesForSinglyImplementedInterfaces(); - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/AbstractTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/AbstractTrait.php deleted file mode 100644 index 82ba21d..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/AbstractTrait.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -trait AbstractTrait -{ - /** - * Whether this definition is abstract, that means it merely serves as a - * template for other definitions. - * - * @return $this - */ - final public function abstract(bool $abstract = true): self - { - $this->definition->setAbstract($abstract); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ArgumentTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ArgumentTrait.php deleted file mode 100644 index 5c9a475..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ArgumentTrait.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -trait ArgumentTrait -{ - /** - * Sets the arguments to pass to the service constructor/factory method. - * - * @return $this - */ - final public function args(array $arguments): self - { - $this->definition->setArguments(static::processValue($arguments, true)); - - return $this; - } - - /** - * Sets one argument to pass to the service constructor/factory method. - * - * @param string|int $key - * @param mixed $value - * - * @return $this - */ - final public function arg($key, $value): self - { - $this->definition->setArgument($key, static::processValue($value, true)); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/AutoconfigureTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/AutoconfigureTrait.php deleted file mode 100644 index 9eab22c..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/AutoconfigureTrait.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -trait AutoconfigureTrait -{ - /** - * Sets whether or not instanceof conditionals should be prepended with a global set. - * - * @return $this - * - * @throws InvalidArgumentException when a parent is already set - */ - final public function autoconfigure(bool $autoconfigured = true): self - { - $this->definition->setAutoconfigured($autoconfigured); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/AutowireTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/AutowireTrait.php deleted file mode 100644 index 2837a02..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/AutowireTrait.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -trait AutowireTrait -{ - /** - * Enables/disables autowiring. - * - * @return $this - */ - final public function autowire(bool $autowired = true): self - { - $this->definition->setAutowired($autowired); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/BindTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/BindTrait.php deleted file mode 100644 index 1328494..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/BindTrait.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -use Symfony\Component\DependencyInjection\Argument\BoundArgument; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Loader\Configurator\DefaultsConfigurator; -use Symfony\Component\DependencyInjection\Loader\Configurator\InstanceofConfigurator; -use Symfony\Component\DependencyInjection\Reference; - -trait BindTrait -{ - /** - * Sets bindings. - * - * Bindings map $named or FQCN arguments to values that should be - * injected in the matching parameters (of the constructor, of methods - * called and of controller actions). - * - * @param string $nameOrFqcn A parameter name with its "$" prefix, or a FQCN - * @param mixed $valueOrRef The value or reference to bind - * - * @return $this - */ - final public function bind(string $nameOrFqcn, $valueOrRef): self - { - $valueOrRef = static::processValue($valueOrRef, true); - if (!preg_match('/^(?:(?:array|bool|float|int|string)[ \t]*+)?\$/', $nameOrFqcn) && !$valueOrRef instanceof Reference) { - throw new InvalidArgumentException(sprintf('Invalid binding for service "%s": named arguments must start with a "$", and FQCN must map to references. Neither applies to binding "%s".', $this->id, $nameOrFqcn)); - } - $bindings = $this->definition->getBindings(); - $type = $this instanceof DefaultsConfigurator ? BoundArgument::DEFAULTS_BINDING : ($this instanceof InstanceofConfigurator ? BoundArgument::INSTANCEOF_BINDING : BoundArgument::SERVICE_BINDING); - $bindings[$nameOrFqcn] = new BoundArgument($valueOrRef, true, $type, $this->path ?? null); - $this->definition->setBindings($bindings); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/CallTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/CallTrait.php deleted file mode 100644 index 28f92d2..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/CallTrait.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -trait CallTrait -{ - /** - * Adds a method to call after service initialization. - * - * @param string $method The method name to call - * @param array $arguments An array of arguments to pass to the method call - * @param bool $returnsClone Whether the call returns the service instance or not - * - * @return $this - * - * @throws InvalidArgumentException on empty $method param - */ - final public function call(string $method, array $arguments = [], bool $returnsClone = false): self - { - $this->definition->addMethodCall($method, static::processValue($arguments, true), $returnsClone); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ClassTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ClassTrait.php deleted file mode 100644 index 20da791..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ClassTrait.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -trait ClassTrait -{ - /** - * Sets the service class. - * - * @return $this - */ - final public function class(?string $class): self - { - $this->definition->setClass($class); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ConfiguratorTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ConfiguratorTrait.php deleted file mode 100644 index 25d363c..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ConfiguratorTrait.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -trait ConfiguratorTrait -{ - /** - * Sets a configurator to call after the service is fully initialized. - * - * @param string|array $configurator A PHP callable reference - * - * @return $this - */ - final public function configurator($configurator): self - { - $this->definition->setConfigurator(static::processValue($configurator, true)); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/DecorateTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/DecorateTrait.php deleted file mode 100644 index b3a1ae1..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/DecorateTrait.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -trait DecorateTrait -{ - /** - * Sets the service that this service is decorating. - * - * @param string|null $id The decorated service id, use null to remove decoration - * - * @return $this - * - * @throws InvalidArgumentException in case the decorated service id and the new decorated service id are equals - */ - final public function decorate(?string $id, string $renamedId = null, int $priority = 0, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE): self - { - $this->definition->setDecoratedService($id, $renamedId, $priority, $invalidBehavior); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/DeprecateTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/DeprecateTrait.php deleted file mode 100644 index ea77e45..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/DeprecateTrait.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -trait DeprecateTrait -{ - /** - * Whether this definition is deprecated, that means it should not be called anymore. - * - * @param string $package The name of the composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string $message The deprecation message to use - * - * @return $this - * - * @throws InvalidArgumentException when the message template is invalid - */ - final public function deprecate(/* string $package, string $version, string $message */): self - { - $args = \func_get_args(); - $package = $version = $message = ''; - - if (\func_num_args() < 3) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'The signature of method "%s()" requires 3 arguments: "string $package, string $version, string $message", not defining them is deprecated.', __METHOD__); - - $message = (string) ($args[0] ?? null); - } else { - $package = (string) $args[0]; - $version = (string) $args[1]; - $message = (string) $args[2]; - } - - $this->definition->setDeprecated($package, $version, $message); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/FactoryTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/FactoryTrait.php deleted file mode 100644 index 0b376bf..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/FactoryTrait.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -trait FactoryTrait -{ - /** - * Sets a factory. - * - * @param string|array $factory A PHP callable reference - * - * @return $this - */ - final public function factory($factory): self - { - if (\is_string($factory) && 1 === substr_count($factory, ':')) { - $factoryParts = explode(':', $factory); - - throw new InvalidArgumentException(sprintf('Invalid factory "%s": the "service:method" notation is not available when using PHP-based DI configuration. Use "[service(\'%s\'), \'%s\']" instead.', $factory, $factoryParts[0], $factoryParts[1])); - } - - $this->definition->setFactory(static::processValue($factory, true)); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/FileTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/FileTrait.php deleted file mode 100644 index 5f42aef..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/FileTrait.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -trait FileTrait -{ - /** - * Sets a file to require before creating the service. - * - * @return $this - */ - final public function file(string $file): self - { - $this->definition->setFile($file); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/LazyTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/LazyTrait.php deleted file mode 100644 index 2829def..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/LazyTrait.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -trait LazyTrait -{ - /** - * Sets the lazy flag of this service. - * - * @param bool|string $lazy A FQCN to derivate the lazy proxy from or `true` to make it extend from the definition's class - * - * @return $this - */ - final public function lazy($lazy = true): self - { - $this->definition->setLazy((bool) $lazy); - if (\is_string($lazy)) { - $this->definition->addTag('proxy', ['interface' => $lazy]); - } - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ParentTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ParentTrait.php deleted file mode 100644 index 37194e5..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ParentTrait.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -use Symfony\Component\DependencyInjection\ChildDefinition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -trait ParentTrait -{ - /** - * Sets the Definition to inherit from. - * - * @return $this - * - * @throws InvalidArgumentException when parent cannot be set - */ - final public function parent(string $parent): self - { - if (!$this->allowParent) { - throw new InvalidArgumentException(sprintf('A parent cannot be defined when either "_instanceof" or "_defaults" are also defined for service prototype "%s".', $this->id)); - } - - if ($this->definition instanceof ChildDefinition) { - $this->definition->setParent($parent); - } else { - // cast Definition to ChildDefinition - $definition = serialize($this->definition); - $definition = substr_replace($definition, '53', 2, 2); - $definition = substr_replace($definition, 'Child', 44, 0); - $definition = unserialize($definition); - - $this->definition = $definition->setParent($parent); - } - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/PropertyTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/PropertyTrait.php deleted file mode 100644 index 10fdcfb..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/PropertyTrait.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -trait PropertyTrait -{ - /** - * Sets a specific property. - * - * @return $this - */ - final public function property(string $name, $value): self - { - $this->definition->setProperty($name, static::processValue($value, true)); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/PublicTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/PublicTrait.php deleted file mode 100644 index f15756c..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/PublicTrait.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -trait PublicTrait -{ - /** - * @return $this - */ - final public function public(): self - { - $this->definition->setPublic(true); - - return $this; - } - - /** - * @return $this - */ - final public function private(): self - { - $this->definition->setPublic(false); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ShareTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ShareTrait.php deleted file mode 100644 index 16fde0f..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/ShareTrait.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -trait ShareTrait -{ - /** - * Sets if the service must be shared or not. - * - * @return $this - */ - final public function share(bool $shared = true): self - { - $this->definition->setShared($shared); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/SyntheticTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/SyntheticTrait.php deleted file mode 100644 index cb08b11..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/SyntheticTrait.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -trait SyntheticTrait -{ - /** - * Sets whether this definition is synthetic, that is not constructed by the - * container, but dynamically injected. - * - * @return $this - */ - final public function synthetic(bool $synthetic = true): self - { - $this->definition->setSynthetic($synthetic); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/TagTrait.php b/vendor/symfony/dependency-injection/Loader/Configurator/Traits/TagTrait.php deleted file mode 100644 index f4d5f00..0000000 --- a/vendor/symfony/dependency-injection/Loader/Configurator/Traits/TagTrait.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -trait TagTrait -{ - /** - * Adds a tag for this definition. - * - * @return $this - */ - final public function tag(string $name, array $attributes = []): self - { - if ('' === $name) { - throw new InvalidArgumentException(sprintf('The tag name for service "%s" must be a non-empty string.', $this->id)); - } - - foreach ($attributes as $attribute => $value) { - if (!is_scalar($value) && null !== $value) { - throw new InvalidArgumentException(sprintf('A tag attribute must be of a scalar-type for service "%s", tag "%s", attribute "%s".', $this->id, $name, $attribute)); - } - } - - $this->definition->addTag($name, $attributes); - - return $this; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/DirectoryLoader.php b/vendor/symfony/dependency-injection/Loader/DirectoryLoader.php deleted file mode 100644 index 9439869..0000000 --- a/vendor/symfony/dependency-injection/Loader/DirectoryLoader.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader; - -/** - * DirectoryLoader is a recursive loader to go through directories. - * - * @author Sebastien Lavoie - */ -class DirectoryLoader extends FileLoader -{ - /** - * {@inheritdoc} - */ - public function load($file, string $type = null) - { - $file = rtrim($file, '/'); - $path = $this->locator->locate($file); - $this->container->fileExists($path, false); - - foreach (scandir($path) as $dir) { - if ('.' !== $dir[0]) { - if (is_dir($path.'/'.$dir)) { - $dir .= '/'; // append / to allow recursion - } - - $this->setCurrentDir($path); - - $this->import($dir, null, false, $path); - } - } - } - - /** - * {@inheritdoc} - */ - public function supports($resource, string $type = null) - { - if ('directory' === $type) { - return true; - } - - return null === $type && \is_string($resource) && '/' === substr($resource, -1); - } -} diff --git a/vendor/symfony/dependency-injection/Loader/FileLoader.php b/vendor/symfony/dependency-injection/Loader/FileLoader.php deleted file mode 100644 index 2bdad1e..0000000 --- a/vendor/symfony/dependency-injection/Loader/FileLoader.php +++ /dev/null @@ -1,225 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader; - -use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException; -use Symfony\Component\Config\Exception\LoaderLoadException; -use Symfony\Component\Config\FileLocatorInterface; -use Symfony\Component\Config\Loader\FileLoader as BaseFileLoader; -use Symfony\Component\Config\Loader\Loader; -use Symfony\Component\Config\Resource\GlobResource; -use Symfony\Component\DependencyInjection\ChildDefinition; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -/** - * FileLoader is the abstract class used by all built-in loaders that are file based. - * - * @author Fabien Potencier - */ -abstract class FileLoader extends BaseFileLoader -{ - public const ANONYMOUS_ID_REGEXP = '/^\.\d+_[^~]*+~[._a-zA-Z\d]{7}$/'; - - protected $container; - protected $isLoadingInstanceof = false; - protected $instanceof = []; - protected $interfaces = []; - protected $singlyImplemented = []; - protected $autoRegisterAliasesForSinglyImplementedInterfaces = true; - - public function __construct(ContainerBuilder $container, FileLocatorInterface $locator) - { - $this->container = $container; - - parent::__construct($locator); - } - - /** - * {@inheritdoc} - * - * @param bool|string $ignoreErrors Whether errors should be ignored; pass "not_found" to ignore only when the loaded resource is not found - */ - public function import($resource, $type = null, $ignoreErrors = false, $sourceResource = null, $exclude = null) - { - $args = \func_get_args(); - - if ($ignoreNotFound = 'not_found' === $ignoreErrors) { - $args[2] = false; - } elseif (!\is_bool($ignoreErrors)) { - throw new \TypeError(sprintf('Invalid argument $ignoreErrors provided to "%s::import()": boolean or "not_found" expected, "%s" given.', static::class, get_debug_type($ignoreErrors))); - } - - try { - parent::import(...$args); - } catch (LoaderLoadException $e) { - if (!$ignoreNotFound || !($prev = $e->getPrevious()) instanceof FileLocatorFileNotFoundException) { - throw $e; - } - - foreach ($prev->getTrace() as $frame) { - if ('import' === ($frame['function'] ?? null) && is_a($frame['class'] ?? '', Loader::class, true)) { - break; - } - } - - if (__FILE__ !== $frame['file']) { - throw $e; - } - } - } - - /** - * Registers a set of classes as services using PSR-4 for discovery. - * - * @param Definition $prototype A definition to use as template - * @param string $namespace The namespace prefix of classes in the scanned directory - * @param string $resource The directory to look for classes, glob-patterns allowed - * @param string|string[]|null $exclude A globbed path of files to exclude or an array of globbed paths of files to exclude - */ - public function registerClasses(Definition $prototype, $namespace, $resource, $exclude = null) - { - if ('\\' !== substr($namespace, -1)) { - throw new InvalidArgumentException(sprintf('Namespace prefix must end with a "\\": "%s".', $namespace)); - } - if (!preg_match('/^(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+\\\\)++$/', $namespace)) { - throw new InvalidArgumentException(sprintf('Namespace is not a valid PSR-4 prefix: "%s".', $namespace)); - } - - $classes = $this->findClasses($namespace, $resource, (array) $exclude); - // prepare for deep cloning - $serializedPrototype = serialize($prototype); - - foreach ($classes as $class => $errorMessage) { - if (interface_exists($class, false)) { - $this->interfaces[] = $class; - } else { - $this->setDefinition($class, $definition = unserialize($serializedPrototype)); - if (null !== $errorMessage) { - $definition->addError($errorMessage); - - continue; - } - foreach (class_implements($class, false) as $interface) { - $this->singlyImplemented[$interface] = ($this->singlyImplemented[$interface] ?? $class) !== $class ? false : $class; - } - } - } - - if ($this->autoRegisterAliasesForSinglyImplementedInterfaces) { - $this->registerAliasesForSinglyImplementedInterfaces(); - } - } - - public function registerAliasesForSinglyImplementedInterfaces() - { - foreach ($this->interfaces as $interface) { - if (!empty($this->singlyImplemented[$interface]) && !$this->container->has($interface)) { - $this->container->setAlias($interface, $this->singlyImplemented[$interface])->setPublic(false); - } - } - - $this->interfaces = $this->singlyImplemented = []; - } - - /** - * Registers a definition in the container with its instanceof-conditionals. - * - * @param string $id - */ - protected function setDefinition($id, Definition $definition) - { - $this->container->removeBindings($id); - - if ($this->isLoadingInstanceof) { - if (!$definition instanceof ChildDefinition) { - throw new InvalidArgumentException(sprintf('Invalid type definition "%s": ChildDefinition expected, "%s" given.', $id, get_debug_type($definition))); - } - $this->instanceof[$id] = $definition; - } else { - $this->container->setDefinition($id, $definition->setInstanceofConditionals($this->instanceof)); - } - } - - private function findClasses(string $namespace, string $pattern, array $excludePatterns): array - { - $parameterBag = $this->container->getParameterBag(); - - $excludePaths = []; - $excludePrefix = null; - $excludePatterns = $parameterBag->unescapeValue($parameterBag->resolveValue($excludePatterns)); - foreach ($excludePatterns as $excludePattern) { - foreach ($this->glob($excludePattern, true, $resource, true, true) as $path => $info) { - if (null === $excludePrefix) { - $excludePrefix = $resource->getPrefix(); - } - - // normalize Windows slashes - $excludePaths[str_replace('\\', '/', $path)] = true; - } - } - - $pattern = $parameterBag->unescapeValue($parameterBag->resolveValue($pattern)); - $classes = []; - $extRegexp = '/\\.php$/'; - $prefixLen = null; - foreach ($this->glob($pattern, true, $resource, false, false, $excludePaths) as $path => $info) { - if (null === $prefixLen) { - $prefixLen = \strlen($resource->getPrefix()); - - if ($excludePrefix && 0 !== strpos($excludePrefix, $resource->getPrefix())) { - throw new InvalidArgumentException(sprintf('Invalid "exclude" pattern when importing classes for "%s": make sure your "exclude" pattern (%s) is a subset of the "resource" pattern (%s).', $namespace, $excludePattern, $pattern)); - } - } - - if (isset($excludePaths[str_replace('\\', '/', $path)])) { - continue; - } - - if (!preg_match($extRegexp, $path, $m) || !$info->isReadable()) { - continue; - } - $class = $namespace.ltrim(str_replace('/', '\\', substr($path, $prefixLen, -\strlen($m[0]))), '\\'); - - if (!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+$/', $class)) { - continue; - } - - try { - $r = $this->container->getReflectionClass($class); - } catch (\ReflectionException $e) { - $classes[$class] = $e->getMessage(); - continue; - } - // check to make sure the expected class exists - if (!$r) { - throw new InvalidArgumentException(sprintf('Expected to find class "%s" in file "%s" while importing services from resource "%s", but it was not found! Check the namespace prefix used with the resource.', $class, $path, $pattern)); - } - - if ($r->isInstantiable() || $r->isInterface()) { - $classes[$class] = null; - } - } - - // track only for new & removed files - if ($resource instanceof GlobResource) { - $this->container->addResource($resource); - } else { - foreach ($resource as $path) { - $this->container->fileExists($path, false); - } - } - - return $classes; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/GlobFileLoader.php b/vendor/symfony/dependency-injection/Loader/GlobFileLoader.php deleted file mode 100644 index 53af9cf..0000000 --- a/vendor/symfony/dependency-injection/Loader/GlobFileLoader.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader; - -/** - * GlobFileLoader loads files from a glob pattern. - * - * @author Nicolas Grekas - */ -class GlobFileLoader extends FileLoader -{ - /** - * {@inheritdoc} - */ - public function load($resource, string $type = null) - { - foreach ($this->glob($resource, false, $globResource) as $path => $info) { - $this->import($path); - } - - $this->container->addResource($globResource); - } - - /** - * {@inheritdoc} - */ - public function supports($resource, string $type = null) - { - return 'glob' === $type; - } -} diff --git a/vendor/symfony/dependency-injection/Loader/IniFileLoader.php b/vendor/symfony/dependency-injection/Loader/IniFileLoader.php deleted file mode 100644 index e638480..0000000 --- a/vendor/symfony/dependency-injection/Loader/IniFileLoader.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader; - -use Symfony\Component\Config\Util\XmlUtils; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; - -/** - * IniFileLoader loads parameters from INI files. - * - * @author Fabien Potencier - */ -class IniFileLoader extends FileLoader -{ - /** - * {@inheritdoc} - */ - public function load($resource, string $type = null) - { - $path = $this->locator->locate($resource); - - $this->container->fileExists($path); - - // first pass to catch parsing errors - $result = parse_ini_file($path, true); - if (false === $result || [] === $result) { - throw new InvalidArgumentException(sprintf('The "%s" file is not valid.', $resource)); - } - - // real raw parsing - $result = parse_ini_file($path, true, INI_SCANNER_RAW); - - if (isset($result['parameters']) && \is_array($result['parameters'])) { - foreach ($result['parameters'] as $key => $value) { - $this->container->setParameter($key, $this->phpize($value)); - } - } - } - - /** - * {@inheritdoc} - */ - public function supports($resource, string $type = null) - { - if (!\is_string($resource)) { - return false; - } - - if (null === $type && 'ini' === pathinfo($resource, PATHINFO_EXTENSION)) { - return true; - } - - return 'ini' === $type; - } - - /** - * Note that the following features are not supported: - * * strings with escaped quotes are not supported "foo\"bar"; - * * string concatenation ("foo" "bar"). - * - * @return mixed - */ - private function phpize(string $value) - { - // trim on the right as comments removal keep whitespaces - if ($value !== $v = rtrim($value)) { - $value = '""' === substr_replace($v, '', 1, -1) ? substr($v, 1, -1) : $v; - } - $lowercaseValue = strtolower($value); - - switch (true) { - case \defined($value): - return \constant($value); - case 'yes' === $lowercaseValue || 'on' === $lowercaseValue: - return true; - case 'no' === $lowercaseValue || 'off' === $lowercaseValue || 'none' === $lowercaseValue: - return false; - case isset($value[1]) && ( - ("'" === $value[0] && "'" === $value[\strlen($value) - 1]) || - ('"' === $value[0] && '"' === $value[\strlen($value) - 1]) - ): - // quoted string - return substr($value, 1, -1); - default: - return XmlUtils::phpize($value); - } - } -} diff --git a/vendor/symfony/dependency-injection/Loader/PhpFileLoader.php b/vendor/symfony/dependency-injection/Loader/PhpFileLoader.php deleted file mode 100644 index 207fb83..0000000 --- a/vendor/symfony/dependency-injection/Loader/PhpFileLoader.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader; - -use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; - -/** - * PhpFileLoader loads service definitions from a PHP file. - * - * The PHP file is required and the $container variable can be - * used within the file to change the container. - * - * @author Fabien Potencier - */ -class PhpFileLoader extends FileLoader -{ - protected $autoRegisterAliasesForSinglyImplementedInterfaces = false; - - /** - * {@inheritdoc} - */ - public function load($resource, $type = null) - { - // the container and loader variables are exposed to the included file below - $container = $this->container; - $loader = $this; - - $path = $this->locator->locate($resource); - $this->setCurrentDir(\dirname($path)); - $this->container->fileExists($path); - - // the closure forbids access to the private scope in the included file - $load = \Closure::bind(function ($path) use ($container, $loader, $resource, $type) { - return include $path; - }, $this, ProtectedPhpFileLoader::class); - - try { - $callback = $load($path); - - if (\is_object($callback) && \is_callable($callback)) { - $callback(new ContainerConfigurator($this->container, $this, $this->instanceof, $path, $resource), $this->container, $this); - } - } finally { - $this->instanceof = []; - $this->registerAliasesForSinglyImplementedInterfaces(); - } - } - - /** - * {@inheritdoc} - */ - public function supports($resource, string $type = null) - { - if (!\is_string($resource)) { - return false; - } - - if (null === $type && 'php' === pathinfo($resource, PATHINFO_EXTENSION)) { - return true; - } - - return 'php' === $type; - } -} - -/** - * @internal - */ -final class ProtectedPhpFileLoader extends PhpFileLoader -{ -} diff --git a/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php b/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php deleted file mode 100644 index 7bce62a..0000000 --- a/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php +++ /dev/null @@ -1,718 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader; - -use Symfony\Component\Config\Util\XmlUtils; -use Symfony\Component\DependencyInjection\Alias; -use Symfony\Component\DependencyInjection\Argument\AbstractArgument; -use Symfony\Component\DependencyInjection\Argument\BoundArgument; -use Symfony\Component\DependencyInjection\Argument\IteratorArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; -use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; -use Symfony\Component\DependencyInjection\ChildDefinition; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\ExpressionLanguage\Expression; - -/** - * XmlFileLoader loads XML files service definitions. - * - * @author Fabien Potencier - */ -class XmlFileLoader extends FileLoader -{ - const NS = 'http://symfony.com/schema/dic/services'; - - protected $autoRegisterAliasesForSinglyImplementedInterfaces = false; - - /** - * {@inheritdoc} - */ - public function load($resource, string $type = null) - { - $path = $this->locator->locate($resource); - - $xml = $this->parseFileToDOM($path); - - $this->container->fileExists($path); - - $defaults = $this->getServiceDefaults($xml, $path); - - // anonymous services - $this->processAnonymousServices($xml, $path); - - // imports - $this->parseImports($xml, $path); - - // parameters - $this->parseParameters($xml, $path); - - // extensions - $this->loadFromExtensions($xml); - - // services - try { - $this->parseDefinitions($xml, $path, $defaults); - } finally { - $this->instanceof = []; - $this->registerAliasesForSinglyImplementedInterfaces(); - } - } - - /** - * {@inheritdoc} - */ - public function supports($resource, string $type = null) - { - if (!\is_string($resource)) { - return false; - } - - if (null === $type && 'xml' === pathinfo($resource, PATHINFO_EXTENSION)) { - return true; - } - - return 'xml' === $type; - } - - private function parseParameters(\DOMDocument $xml, string $file) - { - if ($parameters = $this->getChildren($xml->documentElement, 'parameters')) { - $this->container->getParameterBag()->add($this->getArgumentsAsPhp($parameters[0], 'parameter', $file)); - } - } - - private function parseImports(\DOMDocument $xml, string $file) - { - $xpath = new \DOMXPath($xml); - $xpath->registerNamespace('container', self::NS); - - if (false === $imports = $xpath->query('//container:imports/container:import')) { - return; - } - - $defaultDirectory = \dirname($file); - foreach ($imports as $import) { - $this->setCurrentDir($defaultDirectory); - $this->import($import->getAttribute('resource'), XmlUtils::phpize($import->getAttribute('type')) ?: null, XmlUtils::phpize($import->getAttribute('ignore-errors')) ?: false, $file); - } - } - - private function parseDefinitions(\DOMDocument $xml, string $file, Definition $defaults) - { - $xpath = new \DOMXPath($xml); - $xpath->registerNamespace('container', self::NS); - - if (false === $services = $xpath->query('//container:services/container:service|//container:services/container:prototype|//container:services/container:stack')) { - return; - } - $this->setCurrentDir(\dirname($file)); - - $this->instanceof = []; - $this->isLoadingInstanceof = true; - $instanceof = $xpath->query('//container:services/container:instanceof'); - foreach ($instanceof as $service) { - $this->setDefinition((string) $service->getAttribute('id'), $this->parseDefinition($service, $file, new Definition())); - } - - $this->isLoadingInstanceof = false; - foreach ($services as $service) { - if ('stack' === $service->tagName) { - $service->setAttribute('parent', '-'); - $definition = $this->parseDefinition($service, $file, $defaults) - ->setTags(array_merge_recursive(['container.stack' => [[]]], $defaults->getTags())) - ; - $this->setDefinition($id = (string) $service->getAttribute('id'), $definition); - $stack = []; - - foreach ($this->getChildren($service, 'service') as $k => $frame) { - $k = $frame->getAttribute('id') ?: $k; - $frame->setAttribute('id', $id.'" at index "'.$k); - - if ($alias = $frame->getAttribute('alias')) { - $this->validateAlias($frame, $file); - $stack[$k] = new Reference($alias); - } else { - $stack[$k] = $this->parseDefinition($frame, $file, $defaults) - ->setInstanceofConditionals($this->instanceof); - } - } - - $definition->setArguments($stack); - } elseif (null !== $definition = $this->parseDefinition($service, $file, $defaults)) { - if ('prototype' === $service->tagName) { - $excludes = array_column($this->getChildren($service, 'exclude'), 'nodeValue'); - if ($service->hasAttribute('exclude')) { - if (\count($excludes) > 0) { - throw new InvalidArgumentException('You cannot use both the attribute "exclude" and tags at the same time.'); - } - $excludes = [$service->getAttribute('exclude')]; - } - $this->registerClasses($definition, (string) $service->getAttribute('namespace'), (string) $service->getAttribute('resource'), $excludes); - } else { - $this->setDefinition((string) $service->getAttribute('id'), $definition); - } - } - } - } - - private function getServiceDefaults(\DOMDocument $xml, string $file): Definition - { - $xpath = new \DOMXPath($xml); - $xpath->registerNamespace('container', self::NS); - - if (null === $defaultsNode = $xpath->query('//container:services/container:defaults')->item(0)) { - return new Definition(); - } - - $defaultsNode->setAttribute('id', ''); - - return $this->parseDefinition($defaultsNode, $file, new Definition()); - } - - /** - * Parses an individual Definition. - */ - private function parseDefinition(\DOMElement $service, string $file, Definition $defaults): ?Definition - { - if ($alias = $service->getAttribute('alias')) { - $this->validateAlias($service, $file); - - $this->container->setAlias((string) $service->getAttribute('id'), $alias = new Alias($alias)); - if ($publicAttr = $service->getAttribute('public')) { - $alias->setPublic(XmlUtils::phpize($publicAttr)); - } elseif ($defaults->getChanges()['public'] ?? false) { - $alias->setPublic($defaults->isPublic()); - } - - if ($deprecated = $this->getChildren($service, 'deprecated')) { - $message = $deprecated[0]->nodeValue ?: ''; - $package = $deprecated[0]->getAttribute('package') ?: ''; - $version = $deprecated[0]->getAttribute('version') ?: ''; - - if (!$deprecated[0]->hasAttribute('package')) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'Not setting the attribute "package" of the node "deprecated" in "%s" is deprecated.', $file); - } - - if (!$deprecated[0]->hasAttribute('version')) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'Not setting the attribute "version" of the node "deprecated" in "%s" is deprecated.', $file); - } - - $alias->setDeprecated($package, $version, $message); - } - - return null; - } - - if ($this->isLoadingInstanceof) { - $definition = new ChildDefinition(''); - } elseif ($parent = $service->getAttribute('parent')) { - $definition = new ChildDefinition($parent); - } else { - $definition = new Definition(); - } - - if ($defaults->getChanges()['public'] ?? false) { - $definition->setPublic($defaults->isPublic()); - } - $definition->setAutowired($defaults->isAutowired()); - $definition->setAutoconfigured($defaults->isAutoconfigured()); - $definition->setChanges([]); - - foreach (['class', 'public', 'shared', 'synthetic', 'abstract'] as $key) { - if ($value = $service->getAttribute($key)) { - $method = 'set'.$key; - $definition->$method($value = XmlUtils::phpize($value)); - } - } - - if ($value = $service->getAttribute('lazy')) { - $definition->setLazy((bool) $value = XmlUtils::phpize($value)); - if (\is_string($value)) { - $definition->addTag('proxy', ['interface' => $value]); - } - } - - if ($value = $service->getAttribute('autowire')) { - $definition->setAutowired(XmlUtils::phpize($value)); - } - - if ($value = $service->getAttribute('autoconfigure')) { - $definition->setAutoconfigured(XmlUtils::phpize($value)); - } - - if ($files = $this->getChildren($service, 'file')) { - $definition->setFile($files[0]->nodeValue); - } - - if ($deprecated = $this->getChildren($service, 'deprecated')) { - $message = $deprecated[0]->nodeValue ?: ''; - $package = $deprecated[0]->getAttribute('package') ?: ''; - $version = $deprecated[0]->getAttribute('version') ?: ''; - - if ('' === $package) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'Not setting the attribute "package" of the node "deprecated" in "%s" is deprecated.', $file); - } - - if ('' === $version) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'Not setting the attribute "version" of the node "deprecated" in "%s" is deprecated.', $file); - } - - $definition->setDeprecated($package, $version, $message); - } - - $definition->setArguments($this->getArgumentsAsPhp($service, 'argument', $file, $definition instanceof ChildDefinition)); - $definition->setProperties($this->getArgumentsAsPhp($service, 'property', $file)); - - if ($factories = $this->getChildren($service, 'factory')) { - $factory = $factories[0]; - if ($function = $factory->getAttribute('function')) { - $definition->setFactory($function); - } else { - if ($childService = $factory->getAttribute('service')) { - $class = new Reference($childService, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE); - } else { - $class = $factory->hasAttribute('class') ? $factory->getAttribute('class') : null; - } - - $definition->setFactory([$class, $factory->getAttribute('method') ?: '__invoke']); - } - } - - if ($configurators = $this->getChildren($service, 'configurator')) { - $configurator = $configurators[0]; - if ($function = $configurator->getAttribute('function')) { - $definition->setConfigurator($function); - } else { - if ($childService = $configurator->getAttribute('service')) { - $class = new Reference($childService, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE); - } else { - $class = $configurator->getAttribute('class'); - } - - $definition->setConfigurator([$class, $configurator->getAttribute('method') ?: '__invoke']); - } - } - - foreach ($this->getChildren($service, 'call') as $call) { - $definition->addMethodCall($call->getAttribute('method'), $this->getArgumentsAsPhp($call, 'argument', $file), XmlUtils::phpize($call->getAttribute('returns-clone'))); - } - - $tags = $this->getChildren($service, 'tag'); - - foreach ($tags as $tag) { - $parameters = []; - $tagName = $tag->nodeValue; - foreach ($tag->attributes as $name => $node) { - if ('name' === $name && '' === $tagName) { - continue; - } - - if (false !== strpos($name, '-') && false === strpos($name, '_') && !\array_key_exists($normalizedName = str_replace('-', '_', $name), $parameters)) { - $parameters[$normalizedName] = XmlUtils::phpize($node->nodeValue); - } - // keep not normalized key - $parameters[$name] = XmlUtils::phpize($node->nodeValue); - } - - if ('' === $tagName && '' === $tagName = $tag->getAttribute('name')) { - throw new InvalidArgumentException(sprintf('The tag name for service "%s" in "%s" must be a non-empty string.', (string) $service->getAttribute('id'), $file)); - } - - $definition->addTag($tagName, $parameters); - } - - $definition->setTags(array_merge_recursive($definition->getTags(), $defaults->getTags())); - - $bindings = $this->getArgumentsAsPhp($service, 'bind', $file); - $bindingType = $this->isLoadingInstanceof ? BoundArgument::INSTANCEOF_BINDING : BoundArgument::SERVICE_BINDING; - foreach ($bindings as $argument => $value) { - $bindings[$argument] = new BoundArgument($value, true, $bindingType, $file); - } - - // deep clone, to avoid multiple process of the same instance in the passes - $bindings = array_merge(unserialize(serialize($defaults->getBindings())), $bindings); - - if ($bindings) { - $definition->setBindings($bindings); - } - - if ($decorates = $service->getAttribute('decorates')) { - $decorationOnInvalid = $service->getAttribute('decoration-on-invalid') ?: 'exception'; - if ('exception' === $decorationOnInvalid) { - $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; - } elseif ('ignore' === $decorationOnInvalid) { - $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE; - } elseif ('null' === $decorationOnInvalid) { - $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE; - } else { - throw new InvalidArgumentException(sprintf('Invalid value "%s" for attribute "decoration-on-invalid" on service "%s". Did you mean "exception", "ignore" or "null" in "%s"?', $decorationOnInvalid, (string) $service->getAttribute('id'), $file)); - } - - $renameId = $service->hasAttribute('decoration-inner-name') ? $service->getAttribute('decoration-inner-name') : null; - $priority = $service->hasAttribute('decoration-priority') ? $service->getAttribute('decoration-priority') : 0; - - $definition->setDecoratedService($decorates, $renameId, $priority, $invalidBehavior); - } - - return $definition; - } - - /** - * Parses a XML file to a \DOMDocument. - * - * @throws InvalidArgumentException When loading of XML file returns error - */ - private function parseFileToDOM(string $file): \DOMDocument - { - try { - $dom = XmlUtils::loadFile($file, [$this, 'validateSchema']); - } catch (\InvalidArgumentException $e) { - throw new InvalidArgumentException(sprintf('Unable to parse file "%s": ', $file).$e->getMessage(), $e->getCode(), $e); - } - - $this->validateExtensions($dom, $file); - - return $dom; - } - - /** - * Processes anonymous services. - */ - private function processAnonymousServices(\DOMDocument $xml, string $file) - { - $definitions = []; - $count = 0; - $suffix = '~'.ContainerBuilder::hash($file); - - $xpath = new \DOMXPath($xml); - $xpath->registerNamespace('container', self::NS); - - // anonymous services as arguments/properties - if (false !== $nodes = $xpath->query('//container:argument[@type="service"][not(@id)]|//container:property[@type="service"][not(@id)]|//container:bind[not(@id)]|//container:factory[not(@service)]|//container:configurator[not(@service)]')) { - foreach ($nodes as $node) { - if ($services = $this->getChildren($node, 'service')) { - // give it a unique name - $id = sprintf('.%d_%s', ++$count, preg_replace('/^.*\\\\/', '', $services[0]->getAttribute('class')).$suffix); - $node->setAttribute('id', $id); - $node->setAttribute('service', $id); - - $definitions[$id] = [$services[0], $file]; - $services[0]->setAttribute('id', $id); - - // anonymous services are always private - // we could not use the constant false here, because of XML parsing - $services[0]->setAttribute('public', 'false'); - } - } - } - - // anonymous services "in the wild" - if (false !== $nodes = $xpath->query('//container:services/container:service[not(@id)]')) { - foreach ($nodes as $node) { - throw new InvalidArgumentException(sprintf('Top-level services must have "id" attribute, none found in "%s" at line %d.', $file, $node->getLineNo())); - } - } - - // resolve definitions - uksort($definitions, 'strnatcmp'); - foreach (array_reverse($definitions) as $id => list($domElement, $file)) { - if (null !== $definition = $this->parseDefinition($domElement, $file, new Definition())) { - $this->setDefinition($id, $definition); - } - } - } - - private function getArgumentsAsPhp(\DOMElement $node, string $name, string $file, bool $isChildDefinition = false): array - { - $arguments = []; - foreach ($this->getChildren($node, $name) as $arg) { - if ($arg->hasAttribute('name')) { - $arg->setAttribute('key', $arg->getAttribute('name')); - } - - // this is used by ChildDefinition to overwrite a specific - // argument of the parent definition - if ($arg->hasAttribute('index')) { - $key = ($isChildDefinition ? 'index_' : '').$arg->getAttribute('index'); - } elseif (!$arg->hasAttribute('key')) { - // Append an empty argument, then fetch its key to overwrite it later - $arguments[] = null; - $keys = array_keys($arguments); - $key = array_pop($keys); - } else { - $key = $arg->getAttribute('key'); - } - - $onInvalid = $arg->getAttribute('on-invalid'); - $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; - if ('ignore' == $onInvalid) { - $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE; - } elseif ('ignore_uninitialized' == $onInvalid) { - $invalidBehavior = ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE; - } elseif ('null' == $onInvalid) { - $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE; - } - - switch ($arg->getAttribute('type')) { - case 'service': - if ('' === $arg->getAttribute('id')) { - throw new InvalidArgumentException(sprintf('Tag "<%s>" with type="service" has no or empty "id" attribute in "%s".', $name, $file)); - } - - $arguments[$key] = new Reference($arg->getAttribute('id'), $invalidBehavior); - break; - case 'expression': - if (!class_exists(Expression::class)) { - throw new \LogicException(sprintf('The type="expression" attribute cannot be used without the ExpressionLanguage component. Try running "composer require symfony/expression-language".')); - } - - $arguments[$key] = new Expression($arg->nodeValue); - break; - case 'collection': - $arguments[$key] = $this->getArgumentsAsPhp($arg, $name, $file); - break; - case 'iterator': - $arg = $this->getArgumentsAsPhp($arg, $name, $file); - try { - $arguments[$key] = new IteratorArgument($arg); - } catch (InvalidArgumentException $e) { - throw new InvalidArgumentException(sprintf('Tag "<%s>" with type="iterator" only accepts collections of type="service" references in "%s".', $name, $file)); - } - break; - case 'service_locator': - $arg = $this->getArgumentsAsPhp($arg, $name, $file); - try { - $arguments[$key] = new ServiceLocatorArgument($arg); - } catch (InvalidArgumentException $e) { - throw new InvalidArgumentException(sprintf('Tag "<%s>" with type="service_locator" only accepts maps of type="service" references in "%s".', $name, $file)); - } - break; - case 'tagged': - case 'tagged_iterator': - case 'tagged_locator': - $type = $arg->getAttribute('type'); - $forLocator = 'tagged_locator' === $type; - - if (!$arg->getAttribute('tag')) { - throw new InvalidArgumentException(sprintf('Tag "<%s>" with type="%s" has no or empty "tag" attribute in "%s".', $name, $type, $file)); - } - - $arguments[$key] = new TaggedIteratorArgument($arg->getAttribute('tag'), $arg->getAttribute('index-by') ?: null, $arg->getAttribute('default-index-method') ?: null, $forLocator, $arg->getAttribute('default-priority-method') ?: null); - - if ($forLocator) { - $arguments[$key] = new ServiceLocatorArgument($arguments[$key]); - } - break; - case 'binary': - if (false === $value = base64_decode($arg->nodeValue)) { - throw new InvalidArgumentException(sprintf('Tag "<%s>" with type="binary" is not a valid base64 encoded string.', $name)); - } - $arguments[$key] = $value; - break; - case 'abstract': - $arguments[$key] = new AbstractArgument($arg->nodeValue); - break; - case 'string': - $arguments[$key] = $arg->nodeValue; - break; - case 'constant': - $arguments[$key] = \constant(trim($arg->nodeValue)); - break; - default: - $arguments[$key] = XmlUtils::phpize($arg->nodeValue); - } - } - - return $arguments; - } - - /** - * Get child elements by name. - * - * @return \DOMElement[] - */ - private function getChildren(\DOMNode $node, string $name): array - { - $children = []; - foreach ($node->childNodes as $child) { - if ($child instanceof \DOMElement && $child->localName === $name && self::NS === $child->namespaceURI) { - $children[] = $child; - } - } - - return $children; - } - - /** - * Validates a documents XML schema. - * - * @return bool - * - * @throws RuntimeException When extension references a non-existent XSD file - */ - public function validateSchema(\DOMDocument $dom) - { - $schemaLocations = ['http://symfony.com/schema/dic/services' => str_replace('\\', '/', __DIR__.'/schema/dic/services/services-1.0.xsd')]; - - if ($element = $dom->documentElement->getAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation')) { - $items = preg_split('/\s+/', $element); - for ($i = 0, $nb = \count($items); $i < $nb; $i += 2) { - if (!$this->container->hasExtension($items[$i])) { - continue; - } - - if (($extension = $this->container->getExtension($items[$i])) && false !== $extension->getXsdValidationBasePath()) { - $ns = $extension->getNamespace(); - $path = str_replace([$ns, str_replace('http://', 'https://', $ns)], str_replace('\\', '/', $extension->getXsdValidationBasePath()).'/', $items[$i + 1]); - - if (!is_file($path)) { - throw new RuntimeException(sprintf('Extension "%s" references a non-existent XSD file "%s".', get_debug_type($extension), $path)); - } - - $schemaLocations[$items[$i]] = $path; - } - } - } - - $tmpfiles = []; - $imports = ''; - foreach ($schemaLocations as $namespace => $location) { - $parts = explode('/', $location); - $locationstart = 'file:///'; - if (0 === stripos($location, 'phar://')) { - $tmpfile = tempnam(sys_get_temp_dir(), 'symfony'); - if ($tmpfile) { - copy($location, $tmpfile); - $tmpfiles[] = $tmpfile; - $parts = explode('/', str_replace('\\', '/', $tmpfile)); - } else { - array_shift($parts); - $locationstart = 'phar:///'; - } - } - $drive = '\\' === \DIRECTORY_SEPARATOR ? array_shift($parts).'/' : ''; - $location = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts)); - - $imports .= sprintf(' '."\n", $namespace, $location); - } - - $source = << - - - -$imports - -EOF - ; - - $disableEntities = libxml_disable_entity_loader(false); - $valid = @$dom->schemaValidateSource($source); - libxml_disable_entity_loader($disableEntities); - - foreach ($tmpfiles as $tmpfile) { - @unlink($tmpfile); - } - - return $valid; - } - - private function validateAlias(\DOMElement $alias, string $file) - { - foreach ($alias->attributes as $name => $node) { - if (!\in_array($name, ['alias', 'id', 'public'])) { - throw new InvalidArgumentException(sprintf('Invalid attribute "%s" defined for alias "%s" in "%s".', $name, $alias->getAttribute('id'), $file)); - } - } - - foreach ($alias->childNodes as $child) { - if (!$child instanceof \DOMElement || self::NS !== $child->namespaceURI) { - continue; - } - if (!\in_array($child->localName, ['deprecated'], true)) { - throw new InvalidArgumentException(sprintf('Invalid child element "%s" defined for alias "%s" in "%s".', $child->localName, $alias->getAttribute('id'), $file)); - } - } - } - - /** - * Validates an extension. - * - * @throws InvalidArgumentException When no extension is found corresponding to a tag - */ - private function validateExtensions(\DOMDocument $dom, string $file) - { - foreach ($dom->documentElement->childNodes as $node) { - if (!$node instanceof \DOMElement || 'http://symfony.com/schema/dic/services' === $node->namespaceURI) { - continue; - } - - // can it be handled by an extension? - if (!$this->container->hasExtension($node->namespaceURI)) { - $extensionNamespaces = array_filter(array_map(function (ExtensionInterface $ext) { return $ext->getNamespace(); }, $this->container->getExtensions())); - throw new InvalidArgumentException(sprintf('There is no extension able to load the configuration for "%s" (in "%s"). Looked for namespace "%s", found "%s".', $node->tagName, $file, $node->namespaceURI, $extensionNamespaces ? implode('", "', $extensionNamespaces) : 'none')); - } - } - } - - /** - * Loads from an extension. - */ - private function loadFromExtensions(\DOMDocument $xml) - { - foreach ($xml->documentElement->childNodes as $node) { - if (!$node instanceof \DOMElement || self::NS === $node->namespaceURI) { - continue; - } - - $values = static::convertDomElementToArray($node); - if (!\is_array($values)) { - $values = []; - } - - $this->container->loadFromExtension($node->namespaceURI, $values); - } - } - - /** - * Converts a \DOMElement object to a PHP array. - * - * The following rules applies during the conversion: - * - * * Each tag is converted to a key value or an array - * if there is more than one "value" - * - * * The content of a tag is set under a "value" key (bar) - * if the tag also has some nested tags - * - * * The attributes are converted to keys () - * - * * The nested-tags are converted to keys (bar) - * - * @param \DOMElement $element A \DOMElement instance - * - * @return mixed - */ - public static function convertDomElementToArray(\DOMElement $element) - { - return XmlUtils::convertDomElementToArray($element); - } -} diff --git a/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php b/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php deleted file mode 100644 index 417e568..0000000 --- a/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php +++ /dev/null @@ -1,935 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Loader; - -use Symfony\Component\DependencyInjection\Alias; -use Symfony\Component\DependencyInjection\Argument\AbstractArgument; -use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; -use Symfony\Component\DependencyInjection\Argument\BoundArgument; -use Symfony\Component\DependencyInjection\Argument\IteratorArgument; -use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; -use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; -use Symfony\Component\DependencyInjection\ChildDefinition; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\ExpressionLanguage\Expression; -use Symfony\Component\Yaml\Exception\ParseException; -use Symfony\Component\Yaml\Parser as YamlParser; -use Symfony\Component\Yaml\Tag\TaggedValue; -use Symfony\Component\Yaml\Yaml; - -/** - * YamlFileLoader loads YAML files service definitions. - * - * @author Fabien Potencier - */ -class YamlFileLoader extends FileLoader -{ - private static $serviceKeywords = [ - 'alias' => 'alias', - 'parent' => 'parent', - 'class' => 'class', - 'shared' => 'shared', - 'synthetic' => 'synthetic', - 'lazy' => 'lazy', - 'public' => 'public', - 'abstract' => 'abstract', - 'deprecated' => 'deprecated', - 'factory' => 'factory', - 'file' => 'file', - 'arguments' => 'arguments', - 'properties' => 'properties', - 'configurator' => 'configurator', - 'calls' => 'calls', - 'tags' => 'tags', - 'decorates' => 'decorates', - 'decoration_inner_name' => 'decoration_inner_name', - 'decoration_priority' => 'decoration_priority', - 'decoration_on_invalid' => 'decoration_on_invalid', - 'autowire' => 'autowire', - 'autoconfigure' => 'autoconfigure', - 'bind' => 'bind', - ]; - - private static $prototypeKeywords = [ - 'resource' => 'resource', - 'namespace' => 'namespace', - 'exclude' => 'exclude', - 'parent' => 'parent', - 'shared' => 'shared', - 'lazy' => 'lazy', - 'public' => 'public', - 'abstract' => 'abstract', - 'deprecated' => 'deprecated', - 'factory' => 'factory', - 'arguments' => 'arguments', - 'properties' => 'properties', - 'configurator' => 'configurator', - 'calls' => 'calls', - 'tags' => 'tags', - 'autowire' => 'autowire', - 'autoconfigure' => 'autoconfigure', - 'bind' => 'bind', - ]; - - private static $instanceofKeywords = [ - 'shared' => 'shared', - 'lazy' => 'lazy', - 'public' => 'public', - 'properties' => 'properties', - 'configurator' => 'configurator', - 'calls' => 'calls', - 'tags' => 'tags', - 'autowire' => 'autowire', - 'bind' => 'bind', - ]; - - private static $defaultsKeywords = [ - 'public' => 'public', - 'tags' => 'tags', - 'autowire' => 'autowire', - 'autoconfigure' => 'autoconfigure', - 'bind' => 'bind', - ]; - - private $yamlParser; - - private $anonymousServicesCount; - private $anonymousServicesSuffix; - - protected $autoRegisterAliasesForSinglyImplementedInterfaces = false; - - /** - * {@inheritdoc} - */ - public function load($resource, string $type = null) - { - $path = $this->locator->locate($resource); - - $content = $this->loadFile($path); - - $this->container->fileExists($path); - - // empty file - if (null === $content) { - return; - } - - // imports - $this->parseImports($content, $path); - - // parameters - if (isset($content['parameters'])) { - if (!\is_array($content['parameters'])) { - throw new InvalidArgumentException(sprintf('The "parameters" key should contain an array in "%s". Check your YAML syntax.', $path)); - } - - foreach ($content['parameters'] as $key => $value) { - $this->container->setParameter($key, $this->resolveServices($value, $path, true)); - } - } - - // extensions - $this->loadFromExtensions($content); - - // services - $this->anonymousServicesCount = 0; - $this->anonymousServicesSuffix = '~'.ContainerBuilder::hash($path); - $this->setCurrentDir(\dirname($path)); - try { - $this->parseDefinitions($content, $path); - } finally { - $this->instanceof = []; - $this->registerAliasesForSinglyImplementedInterfaces(); - } - } - - /** - * {@inheritdoc} - */ - public function supports($resource, string $type = null) - { - if (!\is_string($resource)) { - return false; - } - - if (null === $type && \in_array(pathinfo($resource, PATHINFO_EXTENSION), ['yaml', 'yml'], true)) { - return true; - } - - return \in_array($type, ['yaml', 'yml'], true); - } - - private function parseImports(array $content, string $file) - { - if (!isset($content['imports'])) { - return; - } - - if (!\is_array($content['imports'])) { - throw new InvalidArgumentException(sprintf('The "imports" key should contain an array in "%s". Check your YAML syntax.', $file)); - } - - $defaultDirectory = \dirname($file); - foreach ($content['imports'] as $import) { - if (!\is_array($import)) { - $import = ['resource' => $import]; - } - if (!isset($import['resource'])) { - throw new InvalidArgumentException(sprintf('An import should provide a resource in "%s". Check your YAML syntax.', $file)); - } - - $this->setCurrentDir($defaultDirectory); - $this->import($import['resource'], $import['type'] ?? null, $import['ignore_errors'] ?? false, $file); - } - } - - private function parseDefinitions(array $content, string $file) - { - if (!isset($content['services'])) { - return; - } - - if (!\is_array($content['services'])) { - throw new InvalidArgumentException(sprintf('The "services" key should contain an array in "%s". Check your YAML syntax.', $file)); - } - - if (\array_key_exists('_instanceof', $content['services'])) { - $instanceof = $content['services']['_instanceof']; - unset($content['services']['_instanceof']); - - if (!\is_array($instanceof)) { - throw new InvalidArgumentException(sprintf('Service "_instanceof" key must be an array, "%s" given in "%s".', get_debug_type($instanceof), $file)); - } - $this->instanceof = []; - $this->isLoadingInstanceof = true; - foreach ($instanceof as $id => $service) { - if (!$service || !\is_array($service)) { - throw new InvalidArgumentException(sprintf('Type definition "%s" must be a non-empty array within "_instanceof" in "%s". Check your YAML syntax.', $id, $file)); - } - if (\is_string($service) && 0 === strpos($service, '@')) { - throw new InvalidArgumentException(sprintf('Type definition "%s" cannot be an alias within "_instanceof" in "%s". Check your YAML syntax.', $id, $file)); - } - $this->parseDefinition($id, $service, $file, []); - } - } - - $this->isLoadingInstanceof = false; - $defaults = $this->parseDefaults($content, $file); - foreach ($content['services'] as $id => $service) { - $this->parseDefinition($id, $service, $file, $defaults); - } - } - - /** - * @throws InvalidArgumentException - */ - private function parseDefaults(array &$content, string $file): array - { - if (!\array_key_exists('_defaults', $content['services'])) { - return []; - } - $defaults = $content['services']['_defaults']; - unset($content['services']['_defaults']); - - if (!\is_array($defaults)) { - throw new InvalidArgumentException(sprintf('Service "_defaults" key must be an array, "%s" given in "%s".', get_debug_type($defaults), $file)); - } - - foreach ($defaults as $key => $default) { - if (!isset(self::$defaultsKeywords[$key])) { - throw new InvalidArgumentException(sprintf('The configuration key "%s" cannot be used to define a default value in "%s". Allowed keys are "%s".', $key, $file, implode('", "', self::$defaultsKeywords))); - } - } - - if (isset($defaults['tags'])) { - if (!\is_array($tags = $defaults['tags'])) { - throw new InvalidArgumentException(sprintf('Parameter "tags" in "_defaults" must be an array in "%s". Check your YAML syntax.', $file)); - } - - foreach ($tags as $tag) { - if (!\is_array($tag)) { - $tag = ['name' => $tag]; - } - - if (1 === \count($tag) && \is_array(current($tag))) { - $name = key($tag); - $tag = current($tag); - } else { - if (!isset($tag['name'])) { - throw new InvalidArgumentException(sprintf('A "tags" entry in "_defaults" is missing a "name" key in "%s".', $file)); - } - $name = $tag['name']; - unset($tag['name']); - } - - if (!\is_string($name) || '' === $name) { - throw new InvalidArgumentException(sprintf('The tag name in "_defaults" must be a non-empty string in "%s".', $file)); - } - - foreach ($tag as $attribute => $value) { - if (!is_scalar($value) && null !== $value) { - throw new InvalidArgumentException(sprintf('Tag "%s", attribute "%s" in "_defaults" must be of a scalar-type in "%s". Check your YAML syntax.', $name, $attribute, $file)); - } - } - } - } - - if (isset($defaults['bind'])) { - if (!\is_array($defaults['bind'])) { - throw new InvalidArgumentException(sprintf('Parameter "bind" in "_defaults" must be an array in "%s". Check your YAML syntax.', $file)); - } - - foreach ($this->resolveServices($defaults['bind'], $file) as $argument => $value) { - $defaults['bind'][$argument] = new BoundArgument($value, true, BoundArgument::DEFAULTS_BINDING, $file); - } - } - - return $defaults; - } - - private function isUsingShortSyntax(array $service): bool - { - foreach ($service as $key => $value) { - if (\is_string($key) && ('' === $key || ('$' !== $key[0] && false === strpos($key, '\\')))) { - return false; - } - } - - return true; - } - - /** - * Parses a definition. - * - * @param array|string $service - * - * @throws InvalidArgumentException When tags are invalid - */ - private function parseDefinition(string $id, $service, string $file, array $defaults, bool $return = false) - { - if (preg_match('/^_[a-zA-Z0-9_]*$/', $id)) { - throw new InvalidArgumentException(sprintf('Service names that start with an underscore are reserved. Rename the "%s" service or define it in XML instead.', $id)); - } - - if (\is_string($service) && 0 === strpos($service, '@')) { - $alias = new Alias(substr($service, 1)); - - if (isset($defaults['public'])) { - $alias->setPublic($defaults['public']); - } - - return $return ? $alias : $this->container->setAlias($id, $alias); - } - - if (\is_array($service) && $this->isUsingShortSyntax($service)) { - $service = ['arguments' => $service]; - } - - if (null === $service) { - $service = []; - } - - if (!\is_array($service)) { - throw new InvalidArgumentException(sprintf('A service definition must be an array or a string starting with "@" but "%s" found for service "%s" in "%s". Check your YAML syntax.', get_debug_type($service), $id, $file)); - } - - if (isset($service['stack'])) { - if (!\is_array($service['stack'])) { - throw new InvalidArgumentException(sprintf('A stack must be an array of definitions, "%s" given for service "%s" in "%s". Check your YAML syntax.', get_debug_type($service), $id, $file)); - } - - $stack = []; - - foreach ($service['stack'] as $k => $frame) { - if (\is_array($frame) && 1 === \count($frame) && !isset(self::$serviceKeywords[key($frame)])) { - $frame = [ - 'class' => key($frame), - 'arguments' => current($frame), - ]; - } - - if (\is_array($frame) && isset($frame['stack'])) { - throw new InvalidArgumentException(sprintf('Service stack "%s" cannot contain another stack in "%s".', $id, $file)); - } - - $definition = $this->parseDefinition($id.'" at index "'.$k, $frame, $file, $defaults, true); - - if ($definition instanceof Definition) { - $definition->setInstanceofConditionals($this->instanceof); - } - - $stack[$k] = $definition; - } - - if ($diff = array_diff(array_keys($service), ['stack', 'public', 'deprecated'])) { - throw new InvalidArgumentException(sprintf('Invalid attribute "%s"; supported ones are "public" and "deprecated" for service "%s" in "%s". Check your YAML syntax.', implode('", "', $diff), $id, $file)); - } - - $service = [ - 'parent' => '', - 'arguments' => $stack, - 'tags' => ['container.stack'], - 'public' => $service['public'] ?? null, - 'deprecated' => $service['deprecated'] ?? null, - ]; - } - - $this->checkDefinition($id, $service, $file); - - if (isset($service['alias'])) { - $alias = new Alias($service['alias']); - - if (isset($service['public'])) { - $alias->setPublic($service['public']); - } elseif (isset($defaults['public'])) { - $alias->setPublic($defaults['public']); - } - - foreach ($service as $key => $value) { - if (!\in_array($key, ['alias', 'public', 'deprecated'])) { - throw new InvalidArgumentException(sprintf('The configuration key "%s" is unsupported for the service "%s" which is defined as an alias in "%s". Allowed configuration keys for service aliases are "alias", "public" and "deprecated".', $key, $id, $file)); - } - - if ('deprecated' === $key) { - $deprecation = \is_array($value) ? $value : ['message' => $value]; - - if (!isset($deprecation['package'])) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'Not setting the attribute "package" of the "deprecated" option in "%s" is deprecated.', $file); - } - - if (!isset($deprecation['version'])) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'Not setting the attribute "version" of the "deprecated" option in "%s" is deprecated.', $file); - } - - $alias->setDeprecated($deprecation['package'] ?? '', $deprecation['version'] ?? '', $deprecation['message']); - } - } - - return $return ? $alias : $this->container->setAlias($id, $alias); - } - - if ($this->isLoadingInstanceof) { - $definition = new ChildDefinition(''); - } elseif (isset($service['parent'])) { - if ('' !== $service['parent'] && '@' === $service['parent'][0]) { - throw new InvalidArgumentException(sprintf('The value of the "parent" option for the "%s" service must be the id of the service without the "@" prefix (replace "%s" with "%s").', $id, $service['parent'], substr($service['parent'], 1))); - } - - $definition = new ChildDefinition($service['parent']); - } else { - $definition = new Definition(); - } - - if (isset($defaults['public'])) { - $definition->setPublic($defaults['public']); - } - if (isset($defaults['autowire'])) { - $definition->setAutowired($defaults['autowire']); - } - if (isset($defaults['autoconfigure'])) { - $definition->setAutoconfigured($defaults['autoconfigure']); - } - - $definition->setChanges([]); - - if (isset($service['class'])) { - $definition->setClass($service['class']); - } - - if (isset($service['shared'])) { - $definition->setShared($service['shared']); - } - - if (isset($service['synthetic'])) { - $definition->setSynthetic($service['synthetic']); - } - - if (isset($service['lazy'])) { - $definition->setLazy((bool) $service['lazy']); - if (\is_string($service['lazy'])) { - $definition->addTag('proxy', ['interface' => $service['lazy']]); - } - } - - if (isset($service['public'])) { - $definition->setPublic($service['public']); - } - - if (isset($service['abstract'])) { - $definition->setAbstract($service['abstract']); - } - - if (isset($service['deprecated'])) { - $deprecation = \is_array($service['deprecated']) ? $service['deprecated'] : ['message' => $service['deprecated']]; - - if (!isset($deprecation['package'])) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'Not setting the attribute "package" of the "deprecated" option in "%s" is deprecated.', $file); - } - - if (!isset($deprecation['version'])) { - trigger_deprecation('symfony/dependency-injection', '5.1', 'Not setting the attribute "version" of the "deprecated" option in "%s" is deprecated.', $file); - } - - $definition->setDeprecated($deprecation['package'] ?? '', $deprecation['version'] ?? '', $deprecation['message']); - } - - if (isset($service['factory'])) { - $definition->setFactory($this->parseCallable($service['factory'], 'factory', $id, $file)); - } - - if (isset($service['file'])) { - $definition->setFile($service['file']); - } - - if (isset($service['arguments'])) { - $definition->setArguments($this->resolveServices($service['arguments'], $file)); - } - - if (isset($service['properties'])) { - $definition->setProperties($this->resolveServices($service['properties'], $file)); - } - - if (isset($service['configurator'])) { - $definition->setConfigurator($this->parseCallable($service['configurator'], 'configurator', $id, $file)); - } - - if (isset($service['calls'])) { - if (!\is_array($service['calls'])) { - throw new InvalidArgumentException(sprintf('Parameter "calls" must be an array for service "%s" in "%s". Check your YAML syntax.', $id, $file)); - } - - foreach ($service['calls'] as $k => $call) { - if (!\is_array($call) && (!\is_string($k) || !$call instanceof TaggedValue)) { - throw new InvalidArgumentException(sprintf('Invalid method call for service "%s": expected map or array, "%s" given in "%s".', $id, $call instanceof TaggedValue ? '!'.$call->getTag() : get_debug_type($call), $file)); - } - - if (\is_string($k)) { - throw new InvalidArgumentException(sprintf('Invalid method call for service "%s", did you forgot a leading dash before "%s: ..." in "%s"?', $id, $k, $file)); - } - - if (isset($call['method'])) { - $method = $call['method']; - $args = $call['arguments'] ?? []; - $returnsClone = $call['returns_clone'] ?? false; - } else { - if (1 === \count($call) && \is_string(key($call))) { - $method = key($call); - $args = $call[$method]; - - if ($args instanceof TaggedValue) { - if ('returns_clone' !== $args->getTag()) { - throw new InvalidArgumentException(sprintf('Unsupported tag "!%s", did you mean "!returns_clone" for service "%s" in "%s"?', $args->getTag(), $id, $file)); - } - - $returnsClone = true; - $args = $args->getValue(); - } else { - $returnsClone = false; - } - } elseif (empty($call[0])) { - throw new InvalidArgumentException(sprintf('Invalid call for service "%s": the method must be defined as the first index of an array or as the only key of a map in "%s".', $id, $file)); - } else { - $method = $call[0]; - $args = $call[1] ?? []; - $returnsClone = $call[2] ?? false; - } - } - - if (!\is_array($args)) { - throw new InvalidArgumentException(sprintf('The second parameter for function call "%s" must be an array of its arguments for service "%s" in "%s". Check your YAML syntax.', $method, $id, $file)); - } - - $args = $this->resolveServices($args, $file); - $definition->addMethodCall($method, $args, $returnsClone); - } - } - - $tags = isset($service['tags']) ? $service['tags'] : []; - if (!\is_array($tags)) { - throw new InvalidArgumentException(sprintf('Parameter "tags" must be an array for service "%s" in "%s". Check your YAML syntax.', $id, $file)); - } - - if (isset($defaults['tags'])) { - $tags = array_merge($tags, $defaults['tags']); - } - - foreach ($tags as $tag) { - if (!\is_array($tag)) { - $tag = ['name' => $tag]; - } - - if (1 === \count($tag) && \is_array(current($tag))) { - $name = key($tag); - $tag = current($tag); - } else { - if (!isset($tag['name'])) { - throw new InvalidArgumentException(sprintf('A "tags" entry is missing a "name" key for service "%s" in "%s".', $id, $file)); - } - $name = $tag['name']; - unset($tag['name']); - } - - if (!\is_string($name) || '' === $name) { - throw new InvalidArgumentException(sprintf('The tag name for service "%s" in "%s" must be a non-empty string.', $id, $file)); - } - - foreach ($tag as $attribute => $value) { - if (!is_scalar($value) && null !== $value) { - throw new InvalidArgumentException(sprintf('A "tags" attribute must be of a scalar-type for service "%s", tag "%s", attribute "%s" in "%s". Check your YAML syntax.', $id, $name, $attribute, $file)); - } - } - - $definition->addTag($name, $tag); - } - - if (null !== $decorates = $service['decorates'] ?? null) { - if ('' !== $decorates && '@' === $decorates[0]) { - throw new InvalidArgumentException(sprintf('The value of the "decorates" option for the "%s" service must be the id of the service without the "@" prefix (replace "%s" with "%s").', $id, $service['decorates'], substr($decorates, 1))); - } - - $decorationOnInvalid = \array_key_exists('decoration_on_invalid', $service) ? $service['decoration_on_invalid'] : 'exception'; - if ('exception' === $decorationOnInvalid) { - $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; - } elseif ('ignore' === $decorationOnInvalid) { - $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE; - } elseif (null === $decorationOnInvalid) { - $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE; - } elseif ('null' === $decorationOnInvalid) { - throw new InvalidArgumentException(sprintf('Invalid value "%s" for attribute "decoration_on_invalid" on service "%s". Did you mean null (without quotes) in "%s"?', $decorationOnInvalid, $id, $file)); - } else { - throw new InvalidArgumentException(sprintf('Invalid value "%s" for attribute "decoration_on_invalid" on service "%s". Did you mean "exception", "ignore" or null in "%s"?', $decorationOnInvalid, $id, $file)); - } - - $renameId = isset($service['decoration_inner_name']) ? $service['decoration_inner_name'] : null; - $priority = isset($service['decoration_priority']) ? $service['decoration_priority'] : 0; - - $definition->setDecoratedService($decorates, $renameId, $priority, $invalidBehavior); - } - - if (isset($service['autowire'])) { - $definition->setAutowired($service['autowire']); - } - - if (isset($defaults['bind']) || isset($service['bind'])) { - // deep clone, to avoid multiple process of the same instance in the passes - $bindings = isset($defaults['bind']) ? unserialize(serialize($defaults['bind'])) : []; - - if (isset($service['bind'])) { - if (!\is_array($service['bind'])) { - throw new InvalidArgumentException(sprintf('Parameter "bind" must be an array for service "%s" in "%s". Check your YAML syntax.', $id, $file)); - } - - $bindings = array_merge($bindings, $this->resolveServices($service['bind'], $file)); - $bindingType = $this->isLoadingInstanceof ? BoundArgument::INSTANCEOF_BINDING : BoundArgument::SERVICE_BINDING; - foreach ($bindings as $argument => $value) { - if (!$value instanceof BoundArgument) { - $bindings[$argument] = new BoundArgument($value, true, $bindingType, $file); - } - } - } - - $definition->setBindings($bindings); - } - - if (isset($service['autoconfigure'])) { - $definition->setAutoconfigured($service['autoconfigure']); - } - - if (\array_key_exists('namespace', $service) && !\array_key_exists('resource', $service)) { - throw new InvalidArgumentException(sprintf('A "resource" attribute must be set when the "namespace" attribute is set for service "%s" in "%s". Check your YAML syntax.', $id, $file)); - } - - if ($return) { - if (\array_key_exists('resource', $service)) { - throw new InvalidArgumentException(sprintf('Invalid "resource" attribute found for service "%s" in "%s". Check your YAML syntax.', $id, $file)); - } - - return $definition; - } - - if (\array_key_exists('resource', $service)) { - if (!\is_string($service['resource'])) { - throw new InvalidArgumentException(sprintf('A "resource" attribute must be of type string for service "%s" in "%s". Check your YAML syntax.', $id, $file)); - } - $exclude = isset($service['exclude']) ? $service['exclude'] : null; - $namespace = isset($service['namespace']) ? $service['namespace'] : $id; - $this->registerClasses($definition, $namespace, $service['resource'], $exclude); - } else { - $this->setDefinition($id, $definition); - } - } - - /** - * Parses a callable. - * - * @param string|array $callable A callable reference - * - * @throws InvalidArgumentException When errors occur - * - * @return string|array|Reference A parsed callable - */ - private function parseCallable($callable, string $parameter, string $id, string $file) - { - if (\is_string($callable)) { - if ('' !== $callable && '@' === $callable[0]) { - if (false === strpos($callable, ':')) { - return [$this->resolveServices($callable, $file), '__invoke']; - } - - throw new InvalidArgumentException(sprintf('The value of the "%s" option for the "%s" service must be the id of the service without the "@" prefix (replace "%s" with "%s" in "%s").', $parameter, $id, $callable, substr($callable, 1), $file)); - } - - return $callable; - } - - if (\is_array($callable)) { - if (isset($callable[0]) && isset($callable[1])) { - return [$this->resolveServices($callable[0], $file), $callable[1]]; - } - - if ('factory' === $parameter && isset($callable[1]) && null === $callable[0]) { - return $callable; - } - - throw new InvalidArgumentException(sprintf('Parameter "%s" must contain an array with two elements for service "%s" in "%s". Check your YAML syntax.', $parameter, $id, $file)); - } - - throw new InvalidArgumentException(sprintf('Parameter "%s" must be a string or an array for service "%s" in "%s". Check your YAML syntax.', $parameter, $id, $file)); - } - - /** - * Loads a YAML file. - * - * @param string $file - * - * @return array The file content - * - * @throws InvalidArgumentException when the given file is not a local file or when it does not exist - */ - protected function loadFile($file) - { - if (!class_exists('Symfony\Component\Yaml\Parser')) { - throw new RuntimeException('Unable to load YAML config files as the Symfony Yaml Component is not installed.'); - } - - if (!stream_is_local($file)) { - throw new InvalidArgumentException(sprintf('This is not a local file "%s".', $file)); - } - - if (!is_file($file)) { - throw new InvalidArgumentException(sprintf('The file "%s" does not exist.', $file)); - } - - if (null === $this->yamlParser) { - $this->yamlParser = new YamlParser(); - } - - try { - $configuration = $this->yamlParser->parseFile($file, Yaml::PARSE_CONSTANT | Yaml::PARSE_CUSTOM_TAGS); - } catch (ParseException $e) { - throw new InvalidArgumentException(sprintf('The file "%s" does not contain valid YAML: ', $file).$e->getMessage(), 0, $e); - } - - return $this->validate($configuration, $file); - } - - /** - * Validates a YAML file. - * - * @throws InvalidArgumentException When service file is not valid - */ - private function validate($content, string $file): ?array - { - if (null === $content) { - return $content; - } - - if (!\is_array($content)) { - throw new InvalidArgumentException(sprintf('The service file "%s" is not valid. It should contain an array. Check your YAML syntax.', $file)); - } - - foreach ($content as $namespace => $data) { - if (\in_array($namespace, ['imports', 'parameters', 'services'])) { - continue; - } - - if (!$this->container->hasExtension($namespace)) { - $extensionNamespaces = array_filter(array_map(function (ExtensionInterface $ext) { return $ext->getAlias(); }, $this->container->getExtensions())); - throw new InvalidArgumentException(sprintf('There is no extension able to load the configuration for "%s" (in "%s"). Looked for namespace "%s", found "%s".', $namespace, $file, $namespace, $extensionNamespaces ? sprintf('"%s"', implode('", "', $extensionNamespaces)) : 'none')); - } - } - - return $content; - } - - /** - * Resolves services. - * - * @return array|string|Reference|ArgumentInterface - */ - private function resolveServices($value, string $file, bool $isParameter = false) - { - if ($value instanceof TaggedValue) { - $argument = $value->getValue(); - if ('iterator' === $value->getTag()) { - if (!\is_array($argument)) { - throw new InvalidArgumentException(sprintf('"!iterator" tag only accepts sequences in "%s".', $file)); - } - $argument = $this->resolveServices($argument, $file, $isParameter); - try { - return new IteratorArgument($argument); - } catch (InvalidArgumentException $e) { - throw new InvalidArgumentException(sprintf('"!iterator" tag only accepts arrays of "@service" references in "%s".', $file)); - } - } - if ('service_locator' === $value->getTag()) { - if (!\is_array($argument)) { - throw new InvalidArgumentException(sprintf('"!service_locator" tag only accepts maps in "%s".', $file)); - } - - $argument = $this->resolveServices($argument, $file, $isParameter); - - try { - return new ServiceLocatorArgument($argument); - } catch (InvalidArgumentException $e) { - throw new InvalidArgumentException(sprintf('"!service_locator" tag only accepts maps of "@service" references in "%s".', $file)); - } - } - if (\in_array($value->getTag(), ['tagged', 'tagged_iterator', 'tagged_locator'], true)) { - $forLocator = 'tagged_locator' === $value->getTag(); - - if (\is_array($argument) && isset($argument['tag']) && $argument['tag']) { - if ($diff = array_diff(array_keys($argument), ['tag', 'index_by', 'default_index_method', 'default_priority_method'])) { - throw new InvalidArgumentException(sprintf('"!%s" tag contains unsupported key "%s"; supported ones are "tag", "index_by", "default_index_method", and "default_priority_method".', $value->getTag(), implode('", "', $diff))); - } - - $argument = new TaggedIteratorArgument($argument['tag'], $argument['index_by'] ?? null, $argument['default_index_method'] ?? null, $forLocator, $argument['default_priority_method'] ?? null); - } elseif (\is_string($argument) && $argument) { - $argument = new TaggedIteratorArgument($argument, null, null, $forLocator); - } else { - throw new InvalidArgumentException(sprintf('"!%s" tags only accept a non empty string or an array with a key "tag" in "%s".', $value->getTag(), $file)); - } - - if ($forLocator) { - $argument = new ServiceLocatorArgument($argument); - } - - return $argument; - } - if ('service' === $value->getTag()) { - if ($isParameter) { - throw new InvalidArgumentException(sprintf('Using an anonymous service in a parameter is not allowed in "%s".', $file)); - } - - $isLoadingInstanceof = $this->isLoadingInstanceof; - $this->isLoadingInstanceof = false; - $instanceof = $this->instanceof; - $this->instanceof = []; - - $id = sprintf('.%d_%s', ++$this->anonymousServicesCount, preg_replace('/^.*\\\\/', '', isset($argument['class']) ? $argument['class'] : '').$this->anonymousServicesSuffix); - $this->parseDefinition($id, $argument, $file, []); - - if (!$this->container->hasDefinition($id)) { - throw new InvalidArgumentException(sprintf('Creating an alias using the tag "!service" is not allowed in "%s".', $file)); - } - - $this->container->getDefinition($id)->setPublic(false); - - $this->isLoadingInstanceof = $isLoadingInstanceof; - $this->instanceof = $instanceof; - - return new Reference($id); - } - if ('abstract' === $value->getTag()) { - return new AbstractArgument($value->getValue()); - } - - throw new InvalidArgumentException(sprintf('Unsupported tag "!%s".', $value->getTag())); - } - - if (\is_array($value)) { - foreach ($value as $k => $v) { - $value[$k] = $this->resolveServices($v, $file, $isParameter); - } - } elseif (\is_string($value) && 0 === strpos($value, '@=')) { - if (!class_exists(Expression::class)) { - throw new \LogicException(sprintf('The "@=" expression syntax cannot be used without the ExpressionLanguage component. Try running "composer require symfony/expression-language".')); - } - - return new Expression(substr($value, 2)); - } elseif (\is_string($value) && 0 === strpos($value, '@')) { - if (0 === strpos($value, '@@')) { - $value = substr($value, 1); - $invalidBehavior = null; - } elseif (0 === strpos($value, '@!')) { - $value = substr($value, 2); - $invalidBehavior = ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE; - } elseif (0 === strpos($value, '@?')) { - $value = substr($value, 2); - $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE; - } else { - $value = substr($value, 1); - $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; - } - - if (null !== $invalidBehavior) { - $value = new Reference($value, $invalidBehavior); - } - } - - return $value; - } - - /** - * Loads from Extensions. - */ - private function loadFromExtensions(array $content) - { - foreach ($content as $namespace => $values) { - if (\in_array($namespace, ['imports', 'parameters', 'services'])) { - continue; - } - - if (!\is_array($values) && null !== $values) { - $values = []; - } - - $this->container->loadFromExtension($namespace, $values); - } - } - - /** - * Checks the keywords used to define a service. - */ - private function checkDefinition(string $id, array $definition, string $file) - { - if ($this->isLoadingInstanceof) { - $keywords = self::$instanceofKeywords; - } elseif (isset($definition['resource']) || isset($definition['namespace'])) { - $keywords = self::$prototypeKeywords; - } else { - $keywords = self::$serviceKeywords; - } - - foreach ($definition as $key => $value) { - if (!isset($keywords[$key])) { - throw new InvalidArgumentException(sprintf('The configuration key "%s" is unsupported for definition "%s" in "%s". Allowed configuration keys are "%s".', $key, $id, $file, implode('", "', $keywords))); - } - } - } -} diff --git a/vendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsd b/vendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsd deleted file mode 100644 index 0398868..0000000 --- a/vendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsd +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/symfony/dependency-injection/Parameter.php b/vendor/symfony/dependency-injection/Parameter.php deleted file mode 100644 index d484ac0..0000000 --- a/vendor/symfony/dependency-injection/Parameter.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -/** - * Parameter represents a parameter reference. - * - * @author Fabien Potencier - */ -class Parameter -{ - private $id; - - public function __construct(string $id) - { - $this->id = $id; - } - - /** - * @return string The parameter key - */ - public function __toString() - { - return $this->id; - } -} diff --git a/vendor/symfony/dependency-injection/ParameterBag/ContainerBag.php b/vendor/symfony/dependency-injection/ParameterBag/ContainerBag.php deleted file mode 100644 index 7671dfc..0000000 --- a/vendor/symfony/dependency-injection/ParameterBag/ContainerBag.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\ParameterBag; - -use Symfony\Component\DependencyInjection\Container; - -/** - * @author Nicolas Grekas - */ -class ContainerBag extends FrozenParameterBag implements ContainerBagInterface -{ - private $container; - - public function __construct(Container $container) - { - $this->container = $container; - } - - /** - * {@inheritdoc} - */ - public function all() - { - return $this->container->getParameterBag()->all(); - } - - /** - * {@inheritdoc} - */ - public function get($name) - { - return $this->container->getParameter($name); - } - - /** - * {@inheritdoc} - */ - public function has($name) - { - return $this->container->hasParameter($name); - } -} diff --git a/vendor/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php b/vendor/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php deleted file mode 100644 index 1c1227a..0000000 --- a/vendor/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\ParameterBag; - -use Psr\Container\ContainerInterface; -use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException; - -/** - * ContainerBagInterface is the interface implemented by objects that manage service container parameters. - * - * @author Nicolas Grekas - */ -interface ContainerBagInterface extends ContainerInterface -{ - /** - * Gets the service container parameters. - * - * @return array An array of parameters - */ - public function all(); - - /** - * Replaces parameter placeholders (%name%) by their values. - * - * @param mixed $value A value - * - * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist - */ - public function resolveValue($value); - - /** - * Escape parameter placeholders %. - * - * @param mixed $value - * - * @return mixed - */ - public function escapeValue($value); - - /** - * Unescape parameter placeholders %. - * - * @param mixed $value - * - * @return mixed - */ - public function unescapeValue($value); -} diff --git a/vendor/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php b/vendor/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php deleted file mode 100644 index ed128fa..0000000 --- a/vendor/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php +++ /dev/null @@ -1,154 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\ParameterBag; - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; - -/** - * @author Nicolas Grekas - */ -class EnvPlaceholderParameterBag extends ParameterBag -{ - private $envPlaceholderUniquePrefix; - private $envPlaceholders = []; - private $unusedEnvPlaceholders = []; - private $providedTypes = []; - - private static $counter = 0; - - /** - * {@inheritdoc} - */ - public function get(string $name) - { - if (0 === strpos($name, 'env(') && ')' === substr($name, -1) && 'env()' !== $name) { - $env = substr($name, 4, -1); - - if (isset($this->envPlaceholders[$env])) { - foreach ($this->envPlaceholders[$env] as $placeholder) { - return $placeholder; // return first result - } - } - if (isset($this->unusedEnvPlaceholders[$env])) { - foreach ($this->unusedEnvPlaceholders[$env] as $placeholder) { - return $placeholder; // return first result - } - } - if (!preg_match('/^(?:[-.\w]*+:)*+\w++$/', $env)) { - throw new InvalidArgumentException(sprintf('Invalid %s name: only "word" characters are allowed.', $name)); - } - if ($this->has($name) && null !== ($defaultValue = parent::get($name)) && !\is_string($defaultValue)) { - throw new RuntimeException(sprintf('The default value of an env() parameter must be a string or null, but "%s" given to "%s".', get_debug_type($defaultValue), $name)); - } - - $uniqueName = md5($name.'_'.self::$counter++); - $placeholder = sprintf('%s_%s_%s', $this->getEnvPlaceholderUniquePrefix(), strtr($env, ':-.', '___'), $uniqueName); - $this->envPlaceholders[$env][$placeholder] = $placeholder; - - return $placeholder; - } - - return parent::get($name); - } - - /** - * Gets the common env placeholder prefix for env vars created by this bag. - */ - public function getEnvPlaceholderUniquePrefix(): string - { - if (null === $this->envPlaceholderUniquePrefix) { - $reproducibleEntropy = unserialize(serialize($this->parameters)); - array_walk_recursive($reproducibleEntropy, function (&$v) { $v = null; }); - $this->envPlaceholderUniquePrefix = 'env_'.substr(md5(serialize($reproducibleEntropy)), -16); - } - - return $this->envPlaceholderUniquePrefix; - } - - /** - * Returns the map of env vars used in the resolved parameter values to their placeholders. - * - * @return string[][] A map of env var names to their placeholders - */ - public function getEnvPlaceholders() - { - return $this->envPlaceholders; - } - - public function getUnusedEnvPlaceholders(): array - { - return $this->unusedEnvPlaceholders; - } - - public function clearUnusedEnvPlaceholders() - { - $this->unusedEnvPlaceholders = []; - } - - /** - * Merges the env placeholders of another EnvPlaceholderParameterBag. - */ - public function mergeEnvPlaceholders(self $bag) - { - if ($newPlaceholders = $bag->getEnvPlaceholders()) { - $this->envPlaceholders += $newPlaceholders; - - foreach ($newPlaceholders as $env => $placeholders) { - $this->envPlaceholders[$env] += $placeholders; - } - } - - if ($newUnusedPlaceholders = $bag->getUnusedEnvPlaceholders()) { - $this->unusedEnvPlaceholders += $newUnusedPlaceholders; - - foreach ($newUnusedPlaceholders as $env => $placeholders) { - $this->unusedEnvPlaceholders[$env] += $placeholders; - } - } - } - - /** - * Maps env prefixes to their corresponding PHP types. - */ - public function setProvidedTypes(array $providedTypes) - { - $this->providedTypes = $providedTypes; - } - - /** - * Gets the PHP types corresponding to env() parameter prefixes. - * - * @return string[][] - */ - public function getProvidedTypes() - { - return $this->providedTypes; - } - - /** - * {@inheritdoc} - */ - public function resolve() - { - if ($this->resolved) { - return; - } - parent::resolve(); - - foreach ($this->envPlaceholders as $env => $placeholders) { - if ($this->has($name = "env($env)") && null !== ($default = $this->parameters[$name]) && !\is_string($default)) { - throw new RuntimeException(sprintf('The default value of env parameter "%s" must be a string or null, "%s" given.', $env, get_debug_type($default))); - } - } - } -} diff --git a/vendor/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php b/vendor/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php deleted file mode 100644 index 5a4aaf8..0000000 --- a/vendor/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\ParameterBag; - -use Symfony\Component\DependencyInjection\Exception\LogicException; - -/** - * Holds read-only parameters. - * - * @author Fabien Potencier - */ -class FrozenParameterBag extends ParameterBag -{ - /** - * For performance reasons, the constructor assumes that - * all keys are already lowercased. - * - * This is always the case when used internally. - * - * @param array $parameters An array of parameters - */ - public function __construct(array $parameters = []) - { - $this->parameters = $parameters; - $this->resolved = true; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - throw new LogicException('Impossible to call clear() on a frozen ParameterBag.'); - } - - /** - * {@inheritdoc} - */ - public function add(array $parameters) - { - throw new LogicException('Impossible to call add() on a frozen ParameterBag.'); - } - - /** - * {@inheritdoc} - */ - public function set(string $name, $value) - { - throw new LogicException('Impossible to call set() on a frozen ParameterBag.'); - } - - /** - * {@inheritdoc} - */ - public function remove(string $name) - { - throw new LogicException('Impossible to call remove() on a frozen ParameterBag.'); - } -} diff --git a/vendor/symfony/dependency-injection/ParameterBag/ParameterBag.php b/vendor/symfony/dependency-injection/ParameterBag/ParameterBag.php deleted file mode 100644 index 77d6630..0000000 --- a/vendor/symfony/dependency-injection/ParameterBag/ParameterBag.php +++ /dev/null @@ -1,286 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\ParameterBag; - -use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException; -use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; - -/** - * Holds parameters. - * - * @author Fabien Potencier - */ -class ParameterBag implements ParameterBagInterface -{ - protected $parameters = []; - protected $resolved = false; - - /** - * @param array $parameters An array of parameters - */ - public function __construct(array $parameters = []) - { - $this->add($parameters); - } - - /** - * Clears all parameters. - */ - public function clear() - { - $this->parameters = []; - } - - /** - * Adds parameters to the service container parameters. - * - * @param array $parameters An array of parameters - */ - public function add(array $parameters) - { - foreach ($parameters as $key => $value) { - $this->set($key, $value); - } - } - - /** - * {@inheritdoc} - */ - public function all() - { - return $this->parameters; - } - - /** - * {@inheritdoc} - */ - public function get(string $name) - { - if (!\array_key_exists($name, $this->parameters)) { - if (!$name) { - throw new ParameterNotFoundException($name); - } - - $alternatives = []; - foreach ($this->parameters as $key => $parameterValue) { - $lev = levenshtein($name, $key); - if ($lev <= \strlen($name) / 3 || false !== strpos($key, $name)) { - $alternatives[] = $key; - } - } - - $nonNestedAlternative = null; - if (!\count($alternatives) && false !== strpos($name, '.')) { - $namePartsLength = array_map('strlen', explode('.', $name)); - $key = substr($name, 0, -1 * (1 + array_pop($namePartsLength))); - while (\count($namePartsLength)) { - if ($this->has($key)) { - if (\is_array($this->get($key))) { - $nonNestedAlternative = $key; - } - break; - } - - $key = substr($key, 0, -1 * (1 + array_pop($namePartsLength))); - } - } - - throw new ParameterNotFoundException($name, null, null, null, $alternatives, $nonNestedAlternative); - } - - return $this->parameters[$name]; - } - - /** - * Sets a service container parameter. - * - * @param string $name The parameter name - * @param mixed $value The parameter value - */ - public function set(string $name, $value) - { - $this->parameters[$name] = $value; - } - - /** - * {@inheritdoc} - */ - public function has(string $name) - { - return \array_key_exists((string) $name, $this->parameters); - } - - /** - * Removes a parameter. - * - * @param string $name The parameter name - */ - public function remove(string $name) - { - unset($this->parameters[$name]); - } - - /** - * {@inheritdoc} - */ - public function resolve() - { - if ($this->resolved) { - return; - } - - $parameters = []; - foreach ($this->parameters as $key => $value) { - try { - $value = $this->resolveValue($value); - $parameters[$key] = $this->unescapeValue($value); - } catch (ParameterNotFoundException $e) { - $e->setSourceKey($key); - - throw $e; - } - } - - $this->parameters = $parameters; - $this->resolved = true; - } - - /** - * Replaces parameter placeholders (%name%) by their values. - * - * @param mixed $value A value - * @param array $resolving An array of keys that are being resolved (used internally to detect circular references) - * - * @return mixed The resolved value - * - * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist - * @throws ParameterCircularReferenceException if a circular reference if detected - * @throws RuntimeException when a given parameter has a type problem - */ - public function resolveValue($value, array $resolving = []) - { - if (\is_array($value)) { - $args = []; - foreach ($value as $k => $v) { - $args[\is_string($k) ? $this->resolveValue($k, $resolving) : $k] = $this->resolveValue($v, $resolving); - } - - return $args; - } - - if (!\is_string($value) || 2 > \strlen($value)) { - return $value; - } - - return $this->resolveString($value, $resolving); - } - - /** - * Resolves parameters inside a string. - * - * @param array $resolving An array of keys that are being resolved (used internally to detect circular references) - * - * @return mixed The resolved string - * - * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist - * @throws ParameterCircularReferenceException if a circular reference if detected - * @throws RuntimeException when a given parameter has a type problem - */ - public function resolveString(string $value, array $resolving = []) - { - // we do this to deal with non string values (Boolean, integer, ...) - // as the preg_replace_callback throw an exception when trying - // a non-string in a parameter value - if (preg_match('/^%([^%\s]+)%$/', $value, $match)) { - $key = $match[1]; - - if (isset($resolving[$key])) { - throw new ParameterCircularReferenceException(array_keys($resolving)); - } - - $resolving[$key] = true; - - return $this->resolved ? $this->get($key) : $this->resolveValue($this->get($key), $resolving); - } - - return preg_replace_callback('/%%|%([^%\s]+)%/', function ($match) use ($resolving, $value) { - // skip %% - if (!isset($match[1])) { - return '%%'; - } - - $key = $match[1]; - if (isset($resolving[$key])) { - throw new ParameterCircularReferenceException(array_keys($resolving)); - } - - $resolved = $this->get($key); - - if (!\is_string($resolved) && !is_numeric($resolved)) { - throw new RuntimeException(sprintf('A string value must be composed of strings and/or numbers, but found parameter "%s" of type "%s" inside string value "%s".', $key, get_debug_type($resolved), $value)); - } - - $resolved = (string) $resolved; - $resolving[$key] = true; - - return $this->isResolved() ? $resolved : $this->resolveString($resolved, $resolving); - }, $value); - } - - public function isResolved() - { - return $this->resolved; - } - - /** - * {@inheritdoc} - */ - public function escapeValue($value) - { - if (\is_string($value)) { - return str_replace('%', '%%', $value); - } - - if (\is_array($value)) { - $result = []; - foreach ($value as $k => $v) { - $result[$k] = $this->escapeValue($v); - } - - return $result; - } - - return $value; - } - - /** - * {@inheritdoc} - */ - public function unescapeValue($value) - { - if (\is_string($value)) { - return str_replace('%%', '%', $value); - } - - if (\is_array($value)) { - $result = []; - foreach ($value as $k => $v) { - $result[$k] = $this->unescapeValue($v); - } - - return $result; - } - - return $value; - } -} diff --git a/vendor/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php b/vendor/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php deleted file mode 100644 index f224216..0000000 --- a/vendor/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php +++ /dev/null @@ -1,108 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\ParameterBag; - -use Symfony\Component\DependencyInjection\Exception\LogicException; -use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException; - -/** - * ParameterBagInterface is the interface implemented by objects that manage service container parameters. - * - * @author Fabien Potencier - */ -interface ParameterBagInterface -{ - /** - * Clears all parameters. - * - * @throws LogicException if the ParameterBagInterface can not be cleared - */ - public function clear(); - - /** - * Adds parameters to the service container parameters. - * - * @param array $parameters An array of parameters - * - * @throws LogicException if the parameter can not be added - */ - public function add(array $parameters); - - /** - * Gets the service container parameters. - * - * @return array An array of parameters - */ - public function all(); - - /** - * Gets a service container parameter. - * - * @return mixed The parameter value - * - * @throws ParameterNotFoundException if the parameter is not defined - */ - public function get(string $name); - - /** - * Removes a parameter. - */ - public function remove(string $name); - - /** - * Sets a service container parameter. - * - * @param mixed $value The parameter value - * - * @throws LogicException if the parameter can not be set - */ - public function set(string $name, $value); - - /** - * Returns true if a parameter name is defined. - * - * @return bool true if the parameter name is defined, false otherwise - */ - public function has(string $name); - - /** - * Replaces parameter placeholders (%name%) by their values for all parameters. - */ - public function resolve(); - - /** - * Replaces parameter placeholders (%name%) by their values. - * - * @param mixed $value A value - * - * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist - */ - public function resolveValue($value); - - /** - * Escape parameter placeholders %. - * - * @param mixed $value - * - * @return mixed - */ - public function escapeValue($value); - - /** - * Unescape parameter placeholders %. - * - * @param mixed $value - * - * @return mixed - */ - public function unescapeValue($value); -} diff --git a/vendor/symfony/dependency-injection/README.md b/vendor/symfony/dependency-injection/README.md deleted file mode 100644 index cb2d4a1..0000000 --- a/vendor/symfony/dependency-injection/README.md +++ /dev/null @@ -1,14 +0,0 @@ -DependencyInjection Component -============================= - -The DependencyInjection component allows you to standardize and centralize the -way objects are constructed in your application. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/dependency_injection.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/dependency-injection/Reference.php b/vendor/symfony/dependency-injection/Reference.php deleted file mode 100644 index c13cf6f..0000000 --- a/vendor/symfony/dependency-injection/Reference.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -/** - * Reference represents a service reference. - * - * @author Fabien Potencier - */ -class Reference -{ - private $id; - private $invalidBehavior; - - public function __construct(string $id, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE) - { - $this->id = $id; - $this->invalidBehavior = $invalidBehavior; - } - - /** - * @return string The service identifier - */ - public function __toString() - { - return $this->id; - } - - /** - * Returns the behavior to be used when the service does not exist. - * - * @return int - */ - public function getInvalidBehavior() - { - return $this->invalidBehavior; - } -} diff --git a/vendor/symfony/dependency-injection/ReverseContainer.php b/vendor/symfony/dependency-injection/ReverseContainer.php deleted file mode 100644 index 280e9e2..0000000 --- a/vendor/symfony/dependency-injection/ReverseContainer.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Psr\Container\ContainerInterface; -use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; - -/** - * Turns public and "container.reversible" services back to their ids. - * - * @author Nicolas Grekas - */ -final class ReverseContainer -{ - private $serviceContainer; - private $reversibleLocator; - private $tagName; - private $getServiceId; - - public function __construct(Container $serviceContainer, ContainerInterface $reversibleLocator, string $tagName = 'container.reversible') - { - $this->serviceContainer = $serviceContainer; - $this->reversibleLocator = $reversibleLocator; - $this->tagName = $tagName; - $this->getServiceId = \Closure::bind(function (object $service): ?string { - return array_search($service, $this->services, true) ?: array_search($service, $this->privates, true) ?: null; - }, $serviceContainer, Container::class); - } - - /** - * Returns the id of the passed object when it exists as a service. - * - * To be reversible, services need to be either public or be tagged with "container.reversible". - */ - public function getId(object $service): ?string - { - if ($this->serviceContainer === $service) { - return 'service_container'; - } - - if (null === $id = ($this->getServiceId)($service)) { - return null; - } - - if ($this->serviceContainer->has($id) || $this->reversibleLocator->has($id)) { - return $id; - } - - return null; - } - - /** - * @throws ServiceNotFoundException When the service is not reversible - */ - public function getService(string $id): object - { - if ($this->serviceContainer->has($id)) { - return $this->serviceContainer->get($id); - } - - if ($this->reversibleLocator->has($id)) { - return $this->reversibleLocator->get($id); - } - - if (isset($this->serviceContainer->getRemovedIds()[$id])) { - throw new ServiceNotFoundException($id, null, null, [], sprintf('The "%s" service is private and cannot be accessed by reference. You should either make it public, or tag it as "%s".', $id, $this->tagName)); - } - - // will throw a ServiceNotFoundException - $this->serviceContainer->get($id); - } -} diff --git a/vendor/symfony/dependency-injection/ServiceLocator.php b/vendor/symfony/dependency-injection/ServiceLocator.php deleted file mode 100644 index dd97e39..0000000 --- a/vendor/symfony/dependency-injection/ServiceLocator.php +++ /dev/null @@ -1,145 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -use Psr\Container\ContainerExceptionInterface; -use Psr\Container\NotFoundExceptionInterface; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; -use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; -use Symfony\Contracts\Service\ServiceLocatorTrait; -use Symfony\Contracts\Service\ServiceProviderInterface; -use Symfony\Contracts\Service\ServiceSubscriberInterface; - -/** - * @author Robin Chalas - * @author Nicolas Grekas - */ -class ServiceLocator implements ServiceProviderInterface -{ - use ServiceLocatorTrait { - get as private doGet; - } - - private $externalId; - private $container; - - public function get($id) - { - if (!$this->externalId) { - return $this->doGet($id); - } - - try { - return $this->doGet($id); - } catch (RuntimeException $e) { - $what = sprintf('service "%s" required by "%s"', $id, $this->externalId); - $message = preg_replace('/service "\.service_locator\.[^"]++"/', $what, $e->getMessage()); - - if ($e->getMessage() === $message) { - $message = sprintf('Cannot resolve %s: %s', $what, $message); - } - - $r = new \ReflectionProperty($e, 'message'); - $r->setAccessible(true); - $r->setValue($e, $message); - - throw $e; - } - } - - public function __invoke(string $id) - { - return isset($this->factories[$id]) ? $this->get($id) : null; - } - - /** - * @internal - * - * @return static - */ - public function withContext(string $externalId, Container $container): self - { - $locator = clone $this; - $locator->externalId = $externalId; - $locator->container = $container; - - return $locator; - } - - private function createNotFoundException(string $id): NotFoundExceptionInterface - { - if ($this->loading) { - $msg = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $this->formatAlternatives()); - - return new ServiceNotFoundException($id, end($this->loading) ?: null, null, [], $msg); - } - - $class = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS, 4); - $class = isset($class[3]['object']) ? \get_class($class[3]['object']) : null; - $externalId = $this->externalId ?: $class; - - $msg = []; - $msg[] = sprintf('Service "%s" not found:', $id); - - if (!$this->container) { - $class = null; - } elseif ($this->container->has($id) || isset($this->container->getRemovedIds()[$id])) { - $msg[] = 'even though it exists in the app\'s container,'; - } else { - try { - $this->container->get($id); - $class = null; - } catch (ServiceNotFoundException $e) { - if ($e->getAlternatives()) { - $msg[] = sprintf('did you mean %s? Anyway,', $this->formatAlternatives($e->getAlternatives(), 'or')); - } else { - $class = null; - } - } - } - if ($externalId) { - $msg[] = sprintf('the container inside "%s" is a smaller service locator that %s', $externalId, $this->formatAlternatives()); - } else { - $msg[] = sprintf('the current service locator %s', $this->formatAlternatives()); - } - - if (!$class) { - // no-op - } elseif (is_subclass_of($class, ServiceSubscriberInterface::class)) { - $msg[] = sprintf('Unless you need extra laziness, try using dependency injection instead. Otherwise, you need to declare it using "%s::getSubscribedServices()".', preg_replace('/([^\\\\]++\\\\)++/', '', $class)); - } else { - $msg[] = 'Try using dependency injection instead.'; - } - - return new ServiceNotFoundException($id, end($this->loading) ?: null, null, [], implode(' ', $msg)); - } - - private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface - { - return new ServiceCircularReferenceException($id, $path); - } - - private function formatAlternatives(array $alternatives = null, string $separator = 'and'): string - { - $format = '"%s"%s'; - if (null === $alternatives) { - if (!$alternatives = array_keys($this->factories)) { - return 'is empty...'; - } - $format = sprintf('only knows about the %s service%s.', $format, 1 < \count($alternatives) ? 's' : ''); - } - $last = array_pop($alternatives); - - return sprintf($format, $alternatives ? implode('", "', $alternatives) : $last, $alternatives ? sprintf(' %s "%s"', $separator, $last) : ''); - } -} diff --git a/vendor/symfony/dependency-injection/TaggedContainerInterface.php b/vendor/symfony/dependency-injection/TaggedContainerInterface.php deleted file mode 100644 index 2e32cd5..0000000 --- a/vendor/symfony/dependency-injection/TaggedContainerInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -/** - * TaggedContainerInterface is the interface implemented when a container knows how to deals with tags. - * - * @author Fabien Potencier - */ -interface TaggedContainerInterface extends ContainerInterface -{ - /** - * Returns service ids for a given tag. - * - * @param string $name The tag name - * - * @return array An array of tags - */ - public function findTaggedServiceIds(string $name); -} diff --git a/vendor/symfony/dependency-injection/TypedReference.php b/vendor/symfony/dependency-injection/TypedReference.php deleted file mode 100644 index 78d8edf..0000000 --- a/vendor/symfony/dependency-injection/TypedReference.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -/** - * Represents a PHP type-hinted service reference. - * - * @author Nicolas Grekas - */ -class TypedReference extends Reference -{ - private $type; - private $name; - - /** - * @param string $id The service identifier - * @param string $type The PHP type of the identified service - * @param int $invalidBehavior The behavior when the service does not exist - * @param string $name The name of the argument targeting the service - */ - public function __construct(string $id, string $type, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, string $name = null) - { - $this->name = $type === $id ? $name : null; - parent::__construct($id, $invalidBehavior); - $this->type = $type; - } - - public function getType() - { - return $this->type; - } - - public function getName(): ?string - { - return $this->name; - } -} diff --git a/vendor/symfony/dependency-injection/Variable.php b/vendor/symfony/dependency-injection/Variable.php deleted file mode 100644 index 21d33eb..0000000 --- a/vendor/symfony/dependency-injection/Variable.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -/** - * Represents a variable. - * - * $var = new Variable('a'); - * - * will be dumped as - * - * $a - * - * by the PHP dumper. - * - * @author Johannes M. Schmitt - */ -class Variable -{ - private $name; - - public function __construct(string $name) - { - $this->name = $name; - } - - /** - * @return string - */ - public function __toString() - { - return $this->name; - } -} diff --git a/vendor/symfony/dependency-injection/composer.json b/vendor/symfony/dependency-injection/composer.json deleted file mode 100644 index 0727067..0000000 --- a/vendor/symfony/dependency-injection/composer.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "symfony/dependency-injection", - "type": "library", - "description": "Symfony DependencyInjection Component", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1.6|^2" - }, - "require-dev": { - "symfony/yaml": "^4.4|^5.0", - "symfony/config": "^5.1", - "symfony/expression-language": "^4.4|^5.0" - }, - "suggest": { - "symfony/yaml": "", - "symfony/config": "", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them" - }, - "conflict": { - "symfony/config": "<5.1", - "symfony/finder": "<4.4", - "symfony/proxy-manager-bridge": "<4.4", - "symfony/yaml": "<4.4" - }, - "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\DependencyInjection\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - } -} diff --git a/vendor/symfony/deprecation-contracts/.gitignore b/vendor/symfony/deprecation-contracts/.gitignore deleted file mode 100644 index c49a5d8..0000000 --- a/vendor/symfony/deprecation-contracts/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/vendor/symfony/deprecation-contracts/CHANGELOG.md b/vendor/symfony/deprecation-contracts/CHANGELOG.md deleted file mode 100644 index e984777..0000000 --- a/vendor/symfony/deprecation-contracts/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -CHANGELOG -========= - -The changelog is maintained for all Symfony contracts at the following URL: -https://github.com/symfony/contracts/blob/master/CHANGELOG.md diff --git a/vendor/symfony/deprecation-contracts/LICENSE b/vendor/symfony/deprecation-contracts/LICENSE deleted file mode 100644 index 5593b1d..0000000 --- a/vendor/symfony/deprecation-contracts/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/deprecation-contracts/README.md b/vendor/symfony/deprecation-contracts/README.md deleted file mode 100644 index 4957933..0000000 --- a/vendor/symfony/deprecation-contracts/README.md +++ /dev/null @@ -1,26 +0,0 @@ -Symfony Deprecation Contracts -============================= - -A generic function and convention to trigger deprecation notices. - -This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices. - -By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component, -the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments. - -The function requires at least 3 arguments: - - the name of the Composer package that is triggering the deprecation - - the version of the package that introduced the deprecation - - the message of the deprecation - - more arguments can be provided: they will be inserted in the message using `printf()` formatting - -Example: -```php -trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin'); -``` - -This will generate the following message: -`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.` - -While not necessarily recommended, the deprecation notices can be completely ignored by declaring an empty -`function trigger_deprecation() {}` in your application. diff --git a/vendor/symfony/deprecation-contracts/composer.json b/vendor/symfony/deprecation-contracts/composer.json deleted file mode 100644 index 2aa3b5d..0000000 --- a/vendor/symfony/deprecation-contracts/composer.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "symfony/deprecation-contracts", - "type": "library", - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - } -} diff --git a/vendor/symfony/deprecation-contracts/function.php b/vendor/symfony/deprecation-contracts/function.php deleted file mode 100644 index 0d3451f..0000000 --- a/vendor/symfony/deprecation-contracts/function.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (!function_exists('trigger_deprecation')) { - /** - * Triggers a silenced deprecation notice. - * - * @param string $package The name of the Composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string $message The message of the deprecation - * @param mixed ...$args Values to insert in the message using printf() formatting - * - * @author Nicolas Grekas - */ - function trigger_deprecation(string $package, string $version, string $message, ...$args): void - { - @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), E_USER_DEPRECATED); - } -} diff --git a/vendor/symfony/event-dispatcher-contracts/.gitignore b/vendor/symfony/event-dispatcher-contracts/.gitignore deleted file mode 100644 index c49a5d8..0000000 --- a/vendor/symfony/event-dispatcher-contracts/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/vendor/symfony/event-dispatcher-contracts/Event.php b/vendor/symfony/event-dispatcher-contracts/Event.php deleted file mode 100644 index 84f60f3..0000000 --- a/vendor/symfony/event-dispatcher-contracts/Event.php +++ /dev/null @@ -1,96 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\EventDispatcher; - -use Psr\EventDispatcher\StoppableEventInterface; - -if (interface_exists(StoppableEventInterface::class)) { - /** - * Event is the base class for classes containing event data. - * - * This class contains no event data. It is used by events that do not pass - * state information to an event handler when an event is raised. - * - * You can call the method stopPropagation() to abort the execution of - * further listeners in your event listener. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - * @author Nicolas Grekas - */ - class Event implements StoppableEventInterface - { - private $propagationStopped = false; - - /** - * Returns whether further event listeners should be triggered. - */ - public function isPropagationStopped(): bool - { - return $this->propagationStopped; - } - - /** - * Stops the propagation of the event to further event listeners. - * - * If multiple event listeners are connected to the same event, no - * further event listener will be triggered once any trigger calls - * stopPropagation(). - */ - public function stopPropagation(): void - { - $this->propagationStopped = true; - } - } -} else { - /** - * Event is the base class for classes containing event data. - * - * This class contains no event data. It is used by events that do not pass - * state information to an event handler when an event is raised. - * - * You can call the method stopPropagation() to abort the execution of - * further listeners in your event listener. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - * @author Nicolas Grekas - */ - class Event - { - private $propagationStopped = false; - - /** - * Returns whether further event listeners should be triggered. - */ - public function isPropagationStopped(): bool - { - return $this->propagationStopped; - } - - /** - * Stops the propagation of the event to further event listeners. - * - * If multiple event listeners are connected to the same event, no - * further event listener will be triggered once any trigger calls - * stopPropagation(). - */ - public function stopPropagation(): void - { - $this->propagationStopped = true; - } - } -} diff --git a/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php b/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php deleted file mode 100644 index 2d470af..0000000 --- a/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\EventDispatcher; - -use Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface; - -if (interface_exists(PsrEventDispatcherInterface::class)) { - /** - * Allows providing hooks on domain-specific lifecycles by dispatching events. - */ - interface EventDispatcherInterface extends PsrEventDispatcherInterface - { - /** - * Dispatches an event to all registered listeners. - * - * For BC with Symfony 4, the $eventName argument is not declared explicitly on the - * signature of the method. Implementations that are not bound by this BC constraint - * MUST declare it explicitly, as allowed by PHP. - * - * @param object $event The event to pass to the event handlers/listeners - * @param string|null $eventName The name of the event to dispatch. If not supplied, - * the class of $event should be used instead. - * - * @return object The passed $event MUST be returned - */ - public function dispatch($event/*, string $eventName = null*/); - } -} else { - /** - * Allows providing hooks on domain-specific lifecycles by dispatching events. - */ - interface EventDispatcherInterface - { - /** - * Dispatches an event to all registered listeners. - * - * For BC with Symfony 4, the $eventName argument is not declared explicitly on the - * signature of the method. Implementations that are not bound by this BC constraint - * MUST declare it explicitly, as allowed by PHP. - * - * @param object $event The event to pass to the event handlers/listeners - * @param string|null $eventName The name of the event to dispatch. If not supplied, - * the class of $event should be used instead. - * - * @return object The passed $event MUST be returned - */ - public function dispatch($event/*, string $eventName = null*/); - } -} diff --git a/vendor/symfony/event-dispatcher-contracts/LICENSE b/vendor/symfony/event-dispatcher-contracts/LICENSE deleted file mode 100644 index 69d925b..0000000 --- a/vendor/symfony/event-dispatcher-contracts/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2018-2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/event-dispatcher-contracts/README.md b/vendor/symfony/event-dispatcher-contracts/README.md deleted file mode 100644 index fb051c7..0000000 --- a/vendor/symfony/event-dispatcher-contracts/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Symfony EventDispatcher Contracts -================================= - -A set of abstractions extracted out of the Symfony components. - -Can be used to build on semantics that the Symfony components proved useful - and -that already have battle tested implementations. - -See https://github.com/symfony/contracts/blob/master/README.md for more information. diff --git a/vendor/symfony/event-dispatcher-contracts/composer.json b/vendor/symfony/event-dispatcher-contracts/composer.json deleted file mode 100644 index 862c256..0000000 --- a/vendor/symfony/event-dispatcher-contracts/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "symfony/event-dispatcher-contracts", - "type": "library", - "description": "Generic abstractions related to dispatching event", - "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1.3" - }, - "suggest": { - "psr/event-dispatcher": "", - "symfony/event-dispatcher-implementation": "" - }, - "autoload": { - "psr-4": { "Symfony\\Contracts\\EventDispatcher\\": "" } - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - } -} diff --git a/vendor/symfony/event-dispatcher/CHANGELOG.md b/vendor/symfony/event-dispatcher/CHANGELOG.md deleted file mode 100644 index 54fd042..0000000 --- a/vendor/symfony/event-dispatcher/CHANGELOG.md +++ /dev/null @@ -1,67 +0,0 @@ -CHANGELOG -========= - -4.4.0 ------ - - * `AddEventAliasesPass` has been added, allowing applications and bundles to extend the event alias mapping used by `RegisterListenersPass`. - * Made the `event` attribute of the `kernel.event_listener` tag optional for FQCN events. - -4.3.0 ------ - - * The signature of the `EventDispatcherInterface::dispatch()` method should be updated to `dispatch($event, string $eventName = null)`, not doing so is deprecated - * deprecated the `Event` class, use `Symfony\Contracts\EventDispatcher\Event` instead - -4.1.0 ------ - - * added support for invokable event listeners tagged with `kernel.event_listener` by default - * The `TraceableEventDispatcher::getOrphanedEvents()` method has been added. - * The `TraceableEventDispatcherInterface` has been deprecated. - -4.0.0 ------ - - * removed the `ContainerAwareEventDispatcher` class - * added the `reset()` method to the `TraceableEventDispatcherInterface` - -3.4.0 ------ - - * Implementing `TraceableEventDispatcherInterface` without the `reset()` method has been deprecated. - -3.3.0 ------ - - * The ContainerAwareEventDispatcher class has been deprecated. Use EventDispatcher with closure factories instead. - -3.0.0 ------ - - * The method `getListenerPriority($eventName, $listener)` has been added to the - `EventDispatcherInterface`. - * The methods `Event::setDispatcher()`, `Event::getDispatcher()`, `Event::setName()` - and `Event::getName()` have been removed. - The event dispatcher and the event name are passed to the listener call. - -2.5.0 ------ - - * added Debug\TraceableEventDispatcher (originally in HttpKernel) - * changed Debug\TraceableEventDispatcherInterface to extend EventDispatcherInterface - * added RegisterListenersPass (originally in HttpKernel) - -2.1.0 ------ - - * added TraceableEventDispatcherInterface - * added ContainerAwareEventDispatcher - * added a reference to the EventDispatcher on the Event - * added a reference to the Event name on the event - * added fluid interface to the dispatch() method which now returns the Event - object - * added GenericEvent event class - * added the possibility for subscribers to subscribe several times for the - same event - * added ImmutableEventDispatcher diff --git a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php deleted file mode 100644 index 4c556c8..0000000 --- a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php +++ /dev/null @@ -1,407 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\Debug; - -use Psr\EventDispatcher\StoppableEventInterface; -use Psr\Log\LoggerInterface; -use Symfony\Component\EventDispatcher\Event; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; -use Symfony\Component\EventDispatcher\LegacyEventProxy; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\Stopwatch\Stopwatch; -use Symfony\Contracts\EventDispatcher\Event as ContractsEvent; - -/** - * Collects some data about event listeners. - * - * This event dispatcher delegates the dispatching to another one. - * - * @author Fabien Potencier - */ -class TraceableEventDispatcher implements TraceableEventDispatcherInterface -{ - protected $logger; - protected $stopwatch; - - private $callStack; - private $dispatcher; - private $wrappedListeners; - private $orphanedEvents; - private $requestStack; - private $currentRequestHash = ''; - - public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null, RequestStack $requestStack = null) - { - $this->dispatcher = LegacyEventDispatcherProxy::decorate($dispatcher); - $this->stopwatch = $stopwatch; - $this->logger = $logger; - $this->wrappedListeners = []; - $this->orphanedEvents = []; - $this->requestStack = $requestStack; - } - - /** - * {@inheritdoc} - */ - public function addListener($eventName, $listener, $priority = 0) - { - $this->dispatcher->addListener($eventName, $listener, $priority); - } - - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - $this->dispatcher->addSubscriber($subscriber); - } - - /** - * {@inheritdoc} - */ - public function removeListener($eventName, $listener) - { - if (isset($this->wrappedListeners[$eventName])) { - foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { - if ($wrappedListener->getWrappedListener() === $listener) { - $listener = $wrappedListener; - unset($this->wrappedListeners[$eventName][$index]); - break; - } - } - } - - return $this->dispatcher->removeListener($eventName, $listener); - } - - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - return $this->dispatcher->removeSubscriber($subscriber); - } - - /** - * {@inheritdoc} - */ - public function getListeners($eventName = null) - { - return $this->dispatcher->getListeners($eventName); - } - - /** - * {@inheritdoc} - */ - public function getListenerPriority($eventName, $listener) - { - // we might have wrapped listeners for the event (if called while dispatching) - // in that case get the priority by wrapper - if (isset($this->wrappedListeners[$eventName])) { - foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { - if ($wrappedListener->getWrappedListener() === $listener) { - return $this->dispatcher->getListenerPriority($eventName, $wrappedListener); - } - } - } - - return $this->dispatcher->getListenerPriority($eventName, $listener); - } - - /** - * {@inheritdoc} - */ - public function hasListeners($eventName = null) - { - return $this->dispatcher->hasListeners($eventName); - } - - /** - * {@inheritdoc} - * - * @param string|null $eventName - */ - public function dispatch($event/*, string $eventName = null*/) - { - if (null === $this->callStack) { - $this->callStack = new \SplObjectStorage(); - } - - $currentRequestHash = $this->currentRequestHash = $this->requestStack && ($request = $this->requestStack->getCurrentRequest()) ? spl_object_hash($request) : ''; - $eventName = 1 < \func_num_args() ? func_get_arg(1) : null; - - if (\is_object($event)) { - $eventName = $eventName ?? \get_class($event); - } else { - @trigger_error(sprintf('Calling the "%s::dispatch()" method with the event name as first argument is deprecated since Symfony 4.3, pass it second and provide the event object first instead.', EventDispatcherInterface::class), E_USER_DEPRECATED); - $swap = $event; - $event = $eventName ?? new Event(); - $eventName = $swap; - - if (!$event instanceof Event) { - throw new \TypeError(sprintf('Argument 1 passed to "%s::dispatch()" must be an instance of "%s", "%s" given.', EventDispatcherInterface::class, Event::class, \is_object($event) ? \get_class($event) : \gettype($event))); - } - } - - if (null !== $this->logger && ($event instanceof Event || $event instanceof ContractsEvent || $event instanceof StoppableEventInterface) && $event->isPropagationStopped()) { - $this->logger->debug(sprintf('The "%s" event is already stopped. No listeners have been called.', $eventName)); - } - - $this->preProcess($eventName); - try { - $this->beforeDispatch($eventName, $event); - try { - $e = $this->stopwatch->start($eventName, 'section'); - try { - $this->dispatcher->dispatch($event, $eventName); - } finally { - if ($e->isStarted()) { - $e->stop(); - } - } - } finally { - $this->afterDispatch($eventName, $event); - } - } finally { - $this->currentRequestHash = $currentRequestHash; - $this->postProcess($eventName); - } - - return $event; - } - - /** - * {@inheritdoc} - * - * @param Request|null $request The request to get listeners for - */ - public function getCalledListeners(/* Request $request = null */) - { - if (null === $this->callStack) { - return []; - } - - $hash = 1 <= \func_num_args() && null !== ($request = func_get_arg(0)) ? spl_object_hash($request) : null; - $called = []; - foreach ($this->callStack as $listener) { - list($eventName, $requestHash) = $this->callStack->getInfo(); - if (null === $hash || $hash === $requestHash) { - $called[] = $listener->getInfo($eventName); - } - } - - return $called; - } - - /** - * {@inheritdoc} - * - * @param Request|null $request The request to get listeners for - */ - public function getNotCalledListeners(/* Request $request = null */) - { - try { - $allListeners = $this->getListeners(); - } catch (\Exception $e) { - if (null !== $this->logger) { - $this->logger->info('An exception was thrown while getting the uncalled listeners.', ['exception' => $e]); - } - - // unable to retrieve the uncalled listeners - return []; - } - - $hash = 1 <= \func_num_args() && null !== ($request = func_get_arg(0)) ? spl_object_hash($request) : null; - $calledListeners = []; - - if (null !== $this->callStack) { - foreach ($this->callStack as $calledListener) { - list(, $requestHash) = $this->callStack->getInfo(); - - if (null === $hash || $hash === $requestHash) { - $calledListeners[] = $calledListener->getWrappedListener(); - } - } - } - - $notCalled = []; - foreach ($allListeners as $eventName => $listeners) { - foreach ($listeners as $listener) { - if (!\in_array($listener, $calledListeners, true)) { - if (!$listener instanceof WrappedListener) { - $listener = new WrappedListener($listener, null, $this->stopwatch, $this); - } - $notCalled[] = $listener->getInfo($eventName); - } - } - } - - uasort($notCalled, [$this, 'sortNotCalledListeners']); - - return $notCalled; - } - - /** - * @param Request|null $request The request to get orphaned events for - */ - public function getOrphanedEvents(/* Request $request = null */): array - { - if (1 <= \func_num_args() && null !== $request = func_get_arg(0)) { - return $this->orphanedEvents[spl_object_hash($request)] ?? []; - } - - if (!$this->orphanedEvents) { - return []; - } - - return array_merge(...array_values($this->orphanedEvents)); - } - - public function reset() - { - $this->callStack = null; - $this->orphanedEvents = []; - $this->currentRequestHash = ''; - } - - /** - * Proxies all method calls to the original event dispatcher. - * - * @param string $method The method name - * @param array $arguments The method arguments - * - * @return mixed - */ - public function __call($method, $arguments) - { - return $this->dispatcher->{$method}(...$arguments); - } - - /** - * Called before dispatching the event. - * - * @param object $event - */ - protected function beforeDispatch(string $eventName, $event) - { - $this->preDispatch($eventName, $event instanceof Event ? $event : new LegacyEventProxy($event)); - } - - /** - * Called after dispatching the event. - * - * @param object $event - */ - protected function afterDispatch(string $eventName, $event) - { - $this->postDispatch($eventName, $event instanceof Event ? $event : new LegacyEventProxy($event)); - } - - /** - * @deprecated since Symfony 4.3, will be removed in 5.0, use beforeDispatch instead - */ - protected function preDispatch($eventName, Event $event) - { - } - - /** - * @deprecated since Symfony 4.3, will be removed in 5.0, use afterDispatch instead - */ - protected function postDispatch($eventName, Event $event) - { - } - - private function preProcess(string $eventName) - { - if (!$this->dispatcher->hasListeners($eventName)) { - $this->orphanedEvents[$this->currentRequestHash][] = $eventName; - - return; - } - - foreach ($this->dispatcher->getListeners($eventName) as $listener) { - $priority = $this->getListenerPriority($eventName, $listener); - $wrappedListener = new WrappedListener($listener instanceof WrappedListener ? $listener->getWrappedListener() : $listener, null, $this->stopwatch, $this); - $this->wrappedListeners[$eventName][] = $wrappedListener; - $this->dispatcher->removeListener($eventName, $listener); - $this->dispatcher->addListener($eventName, $wrappedListener, $priority); - $this->callStack->attach($wrappedListener, [$eventName, $this->currentRequestHash]); - } - } - - private function postProcess(string $eventName) - { - unset($this->wrappedListeners[$eventName]); - $skipped = false; - foreach ($this->dispatcher->getListeners($eventName) as $listener) { - if (!$listener instanceof WrappedListener) { // #12845: a new listener was added during dispatch. - continue; - } - // Unwrap listener - $priority = $this->getListenerPriority($eventName, $listener); - $this->dispatcher->removeListener($eventName, $listener); - $this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority); - - if (null !== $this->logger) { - $context = ['event' => $eventName, 'listener' => $listener->getPretty()]; - } - - if ($listener->wasCalled()) { - if (null !== $this->logger) { - $this->logger->debug('Notified event "{event}" to listener "{listener}".', $context); - } - } else { - $this->callStack->detach($listener); - } - - if (null !== $this->logger && $skipped) { - $this->logger->debug('Listener "{listener}" was not called for event "{event}".', $context); - } - - if ($listener->stoppedPropagation()) { - if (null !== $this->logger) { - $this->logger->debug('Listener "{listener}" stopped propagation of the event "{event}".', $context); - } - - $skipped = true; - } - } - } - - private function sortNotCalledListeners(array $a, array $b) - { - if (0 !== $cmp = strcmp($a['event'], $b['event'])) { - return $cmp; - } - - if (\is_int($a['priority']) && !\is_int($b['priority'])) { - return 1; - } - - if (!\is_int($a['priority']) && \is_int($b['priority'])) { - return -1; - } - - if ($a['priority'] === $b['priority']) { - return 0; - } - - if ($a['priority'] > $b['priority']) { - return -1; - } - - return 1; - } -} diff --git a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php deleted file mode 100644 index 4fedb9a..0000000 --- a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\Debug; - -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Contracts\Service\ResetInterface; - -/** - * @deprecated since Symfony 4.1 - * - * @author Fabien Potencier - */ -interface TraceableEventDispatcherInterface extends EventDispatcherInterface, ResetInterface -{ - /** - * Gets the called listeners. - * - * @param Request|null $request The request to get listeners for - * - * @return array An array of called listeners - */ - public function getCalledListeners(/* Request $request = null */); - - /** - * Gets the not called listeners. - * - * @param Request|null $request The request to get listeners for - * - * @return array An array of not called listeners - */ - public function getNotCalledListeners(/* Request $request = null */); -} diff --git a/vendor/symfony/event-dispatcher/Debug/WrappedListener.php b/vendor/symfony/event-dispatcher/Debug/WrappedListener.php deleted file mode 100644 index e047639..0000000 --- a/vendor/symfony/event-dispatcher/Debug/WrappedListener.php +++ /dev/null @@ -1,136 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\Debug; - -use Psr\EventDispatcher\StoppableEventInterface; -use Symfony\Component\EventDispatcher\Event; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\EventDispatcher\LegacyEventProxy; -use Symfony\Component\Stopwatch\Stopwatch; -use Symfony\Component\VarDumper\Caster\ClassStub; -use Symfony\Contracts\EventDispatcher\Event as ContractsEvent; - -/** - * @author Fabien Potencier - * - * @final since Symfony 4.3: the "Event" type-hint on __invoke() will be replaced by "object" in 5.0 - */ -class WrappedListener -{ - private $listener; - private $optimizedListener; - private $name; - private $called; - private $stoppedPropagation; - private $stopwatch; - private $dispatcher; - private $pretty; - private $stub; - private $priority; - private static $hasClassStub; - - public function __construct($listener, ?string $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null) - { - $this->listener = $listener; - $this->optimizedListener = $listener instanceof \Closure ? $listener : (\is_callable($listener) ? \Closure::fromCallable($listener) : null); - $this->stopwatch = $stopwatch; - $this->dispatcher = $dispatcher; - $this->called = false; - $this->stoppedPropagation = false; - - if (\is_array($listener)) { - $this->name = \is_object($listener[0]) ? \get_class($listener[0]) : $listener[0]; - $this->pretty = $this->name.'::'.$listener[1]; - } elseif ($listener instanceof \Closure) { - $r = new \ReflectionFunction($listener); - if (false !== strpos($r->name, '{closure}')) { - $this->pretty = $this->name = 'closure'; - } elseif ($class = $r->getClosureScopeClass()) { - $this->name = $class->name; - $this->pretty = $this->name.'::'.$r->name; - } else { - $this->pretty = $this->name = $r->name; - } - } elseif (\is_string($listener)) { - $this->pretty = $this->name = $listener; - } else { - $this->name = \get_class($listener); - $this->pretty = $this->name.'::__invoke'; - } - - if (null !== $name) { - $this->name = $name; - } - - if (null === self::$hasClassStub) { - self::$hasClassStub = class_exists(ClassStub::class); - } - } - - public function getWrappedListener() - { - return $this->listener; - } - - public function wasCalled() - { - return $this->called; - } - - public function stoppedPropagation() - { - return $this->stoppedPropagation; - } - - public function getPretty() - { - return $this->pretty; - } - - public function getInfo($eventName) - { - if (null === $this->stub) { - $this->stub = self::$hasClassStub ? new ClassStub($this->pretty.'()', $this->listener) : $this->pretty.'()'; - } - - return [ - 'event' => $eventName, - 'priority' => null !== $this->priority ? $this->priority : (null !== $this->dispatcher ? $this->dispatcher->getListenerPriority($eventName, $this->listener) : null), - 'pretty' => $this->pretty, - 'stub' => $this->stub, - ]; - } - - public function __invoke(Event $event, $eventName, EventDispatcherInterface $dispatcher) - { - if ($event instanceof LegacyEventProxy) { - $event = $event->getEvent(); - } - - $dispatcher = $this->dispatcher ?: $dispatcher; - - $this->called = true; - $this->priority = $dispatcher->getListenerPriority($eventName, $this->listener); - - $e = $this->stopwatch->start($this->name, 'event_listener'); - - ($this->optimizedListener ?? $this->listener)($event, $eventName, $dispatcher); - - if ($e->isStarted()) { - $e->stop(); - } - - if (($event instanceof Event || $event instanceof ContractsEvent || $event instanceof StoppableEventInterface) && $event->isPropagationStopped()) { - $this->stoppedPropagation = true; - } - } -} diff --git a/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php b/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php deleted file mode 100644 index c4ea50f..0000000 --- a/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\DependencyInjection; - -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * This pass allows bundles to extend the list of event aliases. - * - * @author Alexander M. Turek - */ -class AddEventAliasesPass implements CompilerPassInterface -{ - private $eventAliases; - private $eventAliasesParameter; - - public function __construct(array $eventAliases, string $eventAliasesParameter = 'event_dispatcher.event_aliases') - { - $this->eventAliases = $eventAliases; - $this->eventAliasesParameter = $eventAliasesParameter; - } - - public function process(ContainerBuilder $container): void - { - $eventAliases = $container->hasParameter($this->eventAliasesParameter) ? $container->getParameter($this->eventAliasesParameter) : []; - - $container->setParameter( - $this->eventAliasesParameter, - array_merge($eventAliases, $this->eventAliases) - ); - } -} diff --git a/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php b/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php deleted file mode 100644 index 4b27d3b..0000000 --- a/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php +++ /dev/null @@ -1,178 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\DependencyInjection; - -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\EventDispatcher\Event as LegacyEvent; -use Symfony\Component\EventDispatcher\EventDispatcher; -use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Contracts\EventDispatcher\Event; - -/** - * Compiler pass to register tagged services for an event dispatcher. - */ -class RegisterListenersPass implements CompilerPassInterface -{ - protected $dispatcherService; - protected $listenerTag; - protected $subscriberTag; - protected $eventAliasesParameter; - - private $hotPathEvents = []; - private $hotPathTagName; - - public function __construct(string $dispatcherService = 'event_dispatcher', string $listenerTag = 'kernel.event_listener', string $subscriberTag = 'kernel.event_subscriber', string $eventAliasesParameter = 'event_dispatcher.event_aliases') - { - $this->dispatcherService = $dispatcherService; - $this->listenerTag = $listenerTag; - $this->subscriberTag = $subscriberTag; - $this->eventAliasesParameter = $eventAliasesParameter; - } - - public function setHotPathEvents(array $hotPathEvents, $tagName = 'container.hot_path') - { - $this->hotPathEvents = array_flip($hotPathEvents); - $this->hotPathTagName = $tagName; - - return $this; - } - - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition($this->dispatcherService) && !$container->hasAlias($this->dispatcherService)) { - return; - } - - $aliases = []; - - if ($container->hasParameter($this->eventAliasesParameter)) { - $aliases = $container->getParameter($this->eventAliasesParameter); - } - - $definition = $container->findDefinition($this->dispatcherService); - - foreach ($container->findTaggedServiceIds($this->listenerTag, true) as $id => $events) { - foreach ($events as $event) { - $priority = isset($event['priority']) ? $event['priority'] : 0; - - if (!isset($event['event'])) { - if ($container->getDefinition($id)->hasTag($this->subscriberTag)) { - continue; - } - - $event['method'] = $event['method'] ?? '__invoke'; - $event['event'] = $this->getEventFromTypeDeclaration($container, $id, $event['method']); - } - - $event['event'] = $aliases[$event['event']] ?? $event['event']; - - if (!isset($event['method'])) { - $event['method'] = 'on'.preg_replace_callback([ - '/(?<=\b)[a-z]/i', - '/[^a-z0-9]/i', - ], function ($matches) { return strtoupper($matches[0]); }, $event['event']); - $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']); - - if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method']) && $r->hasMethod('__invoke')) { - $event['method'] = '__invoke'; - } - } - - $definition->addMethodCall('addListener', [$event['event'], [new ServiceClosureArgument(new Reference($id)), $event['method']], $priority]); - - if (isset($this->hotPathEvents[$event['event']])) { - $container->getDefinition($id)->addTag($this->hotPathTagName); - } - } - } - - $extractingDispatcher = new ExtractingEventDispatcher(); - - foreach ($container->findTaggedServiceIds($this->subscriberTag, true) as $id => $attributes) { - $def = $container->getDefinition($id); - - // We must assume that the class value has been correctly filled, even if the service is created by a factory - $class = $def->getClass(); - - if (!$r = $container->getReflectionClass($class)) { - throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); - } - if (!$r->isSubclassOf(EventSubscriberInterface::class)) { - throw new InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, EventSubscriberInterface::class)); - } - $class = $r->name; - - ExtractingEventDispatcher::$aliases = $aliases; - ExtractingEventDispatcher::$subscriber = $class; - $extractingDispatcher->addSubscriber($extractingDispatcher); - foreach ($extractingDispatcher->listeners as $args) { - $args[1] = [new ServiceClosureArgument(new Reference($id)), $args[1]]; - $definition->addMethodCall('addListener', $args); - - if (isset($this->hotPathEvents[$args[0]])) { - $container->getDefinition($id)->addTag($this->hotPathTagName); - } - } - $extractingDispatcher->listeners = []; - ExtractingEventDispatcher::$aliases = []; - } - } - - private function getEventFromTypeDeclaration(ContainerBuilder $container, string $id, string $method): string - { - if ( - null === ($class = $container->getDefinition($id)->getClass()) - || !($r = $container->getReflectionClass($class, false)) - || !$r->hasMethod($method) - || 1 > ($m = $r->getMethod($method))->getNumberOfParameters() - || !($type = $m->getParameters()[0]->getType()) instanceof \ReflectionNamedType - || $type->isBuiltin() - || Event::class === ($name = $type->getName()) - || LegacyEvent::class === $name - ) { - throw new InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag)); - } - - return $name; - } -} - -/** - * @internal - */ -class ExtractingEventDispatcher extends EventDispatcher implements EventSubscriberInterface -{ - public $listeners = []; - - public static $aliases = []; - public static $subscriber; - - public function addListener($eventName, $listener, $priority = 0) - { - $this->listeners[] = [$eventName, $listener[1], $priority]; - } - - public static function getSubscribedEvents(): array - { - $events = []; - - foreach ([self::$subscriber, 'getSubscribedEvents']() as $eventName => $params) { - $events[self::$aliases[$eventName] ?? $eventName] = $params; - } - - return $events; - } -} diff --git a/vendor/symfony/event-dispatcher/Event.php b/vendor/symfony/event-dispatcher/Event.php deleted file mode 100644 index 307c4be..0000000 --- a/vendor/symfony/event-dispatcher/Event.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * @deprecated since Symfony 4.3, use "Symfony\Contracts\EventDispatcher\Event" instead - */ -class Event -{ - private $propagationStopped = false; - - /** - * @return bool Whether propagation was already stopped for this event - * - * @deprecated since Symfony 4.3, use "Symfony\Contracts\EventDispatcher\Event" instead - */ - public function isPropagationStopped() - { - return $this->propagationStopped; - } - - /** - * @deprecated since Symfony 4.3, use "Symfony\Contracts\EventDispatcher\Event" instead - */ - public function stopPropagation() - { - $this->propagationStopped = true; - } -} diff --git a/vendor/symfony/event-dispatcher/EventDispatcher.php b/vendor/symfony/event-dispatcher/EventDispatcher.php deleted file mode 100644 index 9f523dc..0000000 --- a/vendor/symfony/event-dispatcher/EventDispatcher.php +++ /dev/null @@ -1,314 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -use Psr\EventDispatcher\StoppableEventInterface; -use Symfony\Component\EventDispatcher\Debug\WrappedListener; -use Symfony\Contracts\EventDispatcher\Event as ContractsEvent; - -/** - * The EventDispatcherInterface is the central point of Symfony's event listener system. - * - * Listeners are registered on the manager and events are dispatched through the - * manager. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - * @author Fabien Potencier - * @author Jordi Boggiano - * @author Jordan Alliot - * @author Nicolas Grekas - */ -class EventDispatcher implements EventDispatcherInterface -{ - private $listeners = []; - private $sorted = []; - private $optimized; - - public function __construct() - { - if (__CLASS__ === static::class) { - $this->optimized = []; - } - } - - /** - * {@inheritdoc} - * - * @param string|null $eventName - */ - public function dispatch($event/*, string $eventName = null*/) - { - $eventName = 1 < \func_num_args() ? func_get_arg(1) : null; - - if (\is_object($event)) { - $eventName = $eventName ?? \get_class($event); - } elseif (\is_string($event) && (null === $eventName || $eventName instanceof ContractsEvent || $eventName instanceof Event)) { - @trigger_error(sprintf('Calling the "%s::dispatch()" method with the event name as the first argument is deprecated since Symfony 4.3, pass it as the second argument and provide the event object as the first argument instead.', EventDispatcherInterface::class), E_USER_DEPRECATED); - $swap = $event; - $event = $eventName ?? new Event(); - $eventName = $swap; - } else { - throw new \TypeError(sprintf('Argument 1 passed to "%s::dispatch()" must be an object, "%s" given.', EventDispatcherInterface::class, \is_object($event) ? \get_class($event) : \gettype($event))); - } - - if (null !== $this->optimized && null !== $eventName) { - $listeners = $this->optimized[$eventName] ?? (empty($this->listeners[$eventName]) ? [] : $this->optimizeListeners($eventName)); - } else { - $listeners = $this->getListeners($eventName); - } - - if ($listeners) { - $this->callListeners($listeners, $eventName, $event); - } - - return $event; - } - - /** - * {@inheritdoc} - */ - public function getListeners($eventName = null) - { - if (null !== $eventName) { - if (empty($this->listeners[$eventName])) { - return []; - } - - if (!isset($this->sorted[$eventName])) { - $this->sortListeners($eventName); - } - - return $this->sorted[$eventName]; - } - - foreach ($this->listeners as $eventName => $eventListeners) { - if (!isset($this->sorted[$eventName])) { - $this->sortListeners($eventName); - } - } - - return array_filter($this->sorted); - } - - /** - * {@inheritdoc} - */ - public function getListenerPriority($eventName, $listener) - { - if (empty($this->listeners[$eventName])) { - return null; - } - - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - - foreach ($this->listeners[$eventName] as $priority => &$listeners) { - foreach ($listeners as &$v) { - if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { - $v[0] = $v[0](); - $v[1] = $v[1] ?? '__invoke'; - } - if ($v === $listener) { - return $priority; - } - } - } - - return null; - } - - /** - * {@inheritdoc} - */ - public function hasListeners($eventName = null) - { - if (null !== $eventName) { - return !empty($this->listeners[$eventName]); - } - - foreach ($this->listeners as $eventListeners) { - if ($eventListeners) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function addListener($eventName, $listener, $priority = 0) - { - $this->listeners[$eventName][$priority][] = $listener; - unset($this->sorted[$eventName], $this->optimized[$eventName]); - } - - /** - * {@inheritdoc} - */ - public function removeListener($eventName, $listener) - { - if (empty($this->listeners[$eventName])) { - return; - } - - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - - foreach ($this->listeners[$eventName] as $priority => &$listeners) { - foreach ($listeners as $k => &$v) { - if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { - $v[0] = $v[0](); - $v[1] = $v[1] ?? '__invoke'; - } - if ($v === $listener) { - unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]); - } - } - - if (!$listeners) { - unset($this->listeners[$eventName][$priority]); - } - } - } - - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { - if (\is_string($params)) { - $this->addListener($eventName, [$subscriber, $params]); - } elseif (\is_string($params[0])) { - $this->addListener($eventName, [$subscriber, $params[0]], isset($params[1]) ? $params[1] : 0); - } else { - foreach ($params as $listener) { - $this->addListener($eventName, [$subscriber, $listener[0]], isset($listener[1]) ? $listener[1] : 0); - } - } - } - } - - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { - if (\is_array($params) && \is_array($params[0])) { - foreach ($params as $listener) { - $this->removeListener($eventName, [$subscriber, $listener[0]]); - } - } else { - $this->removeListener($eventName, [$subscriber, \is_string($params) ? $params : $params[0]]); - } - } - } - - /** - * Triggers the listeners of an event. - * - * This method can be overridden to add functionality that is executed - * for each listener. - * - * @param callable[] $listeners The event listeners - * @param string $eventName The name of the event to dispatch - * @param object $event The event object to pass to the event handlers/listeners - */ - protected function callListeners(iterable $listeners, string $eventName, $event) - { - if ($event instanceof Event) { - $this->doDispatch($listeners, $eventName, $event); - - return; - } - - $stoppable = $event instanceof ContractsEvent || $event instanceof StoppableEventInterface; - - foreach ($listeners as $listener) { - if ($stoppable && $event->isPropagationStopped()) { - break; - } - // @deprecated: the ternary operator is part of a BC layer and should be removed in 5.0 - $listener($listener instanceof WrappedListener ? new LegacyEventProxy($event) : $event, $eventName, $this); - } - } - - /** - * @deprecated since Symfony 4.3, use callListeners() instead - */ - protected function doDispatch($listeners, $eventName, Event $event) - { - foreach ($listeners as $listener) { - if ($event->isPropagationStopped()) { - break; - } - $listener($event, $eventName, $this); - } - } - - /** - * Sorts the internal list of listeners for the given event by priority. - */ - private function sortListeners(string $eventName) - { - krsort($this->listeners[$eventName]); - $this->sorted[$eventName] = []; - - foreach ($this->listeners[$eventName] as &$listeners) { - foreach ($listeners as $k => &$listener) { - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - $this->sorted[$eventName][] = $listener; - } - } - } - - /** - * Optimizes the internal list of listeners for the given event by priority. - */ - private function optimizeListeners(string $eventName): array - { - krsort($this->listeners[$eventName]); - $this->optimized[$eventName] = []; - - foreach ($this->listeners[$eventName] as &$listeners) { - foreach ($listeners as &$listener) { - $closure = &$this->optimized[$eventName][]; - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $closure = static function (...$args) use (&$listener, &$closure) { - if ($listener[0] instanceof \Closure) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - ($closure = \Closure::fromCallable($listener))(...$args); - }; - } else { - $closure = $listener instanceof \Closure || $listener instanceof WrappedListener ? $listener : \Closure::fromCallable($listener); - } - } - } - - return $this->optimized[$eventName]; - } -} diff --git a/vendor/symfony/event-dispatcher/EventDispatcherInterface.php b/vendor/symfony/event-dispatcher/EventDispatcherInterface.php deleted file mode 100644 index ceaa62a..0000000 --- a/vendor/symfony/event-dispatcher/EventDispatcherInterface.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -use Symfony\Contracts\EventDispatcher\EventDispatcherInterface as ContractsEventDispatcherInterface; - -/** - * The EventDispatcherInterface is the central point of Symfony's event listener system. - * Listeners are registered on the manager and events are dispatched through the - * manager. - * - * @author Bernhard Schussek - */ -interface EventDispatcherInterface extends ContractsEventDispatcherInterface -{ - /** - * Adds an event listener that listens on the specified events. - * - * @param string $eventName The event to listen on - * @param callable $listener The listener - * @param int $priority The higher this value, the earlier an event - * listener will be triggered in the chain (defaults to 0) - */ - public function addListener($eventName, $listener, $priority = 0); - - /** - * Adds an event subscriber. - * - * The subscriber is asked for all the events it is - * interested in and added as a listener for these events. - */ - public function addSubscriber(EventSubscriberInterface $subscriber); - - /** - * Removes an event listener from the specified events. - * - * @param string $eventName The event to remove a listener from - * @param callable $listener The listener to remove - */ - public function removeListener($eventName, $listener); - - public function removeSubscriber(EventSubscriberInterface $subscriber); - - /** - * Gets the listeners of a specific event or all listeners sorted by descending priority. - * - * @param string|null $eventName The name of the event - * - * @return array The event listeners for the specified event, or all event listeners by event name - */ - public function getListeners($eventName = null); - - /** - * Gets the listener priority for a specific event. - * - * Returns null if the event or the listener does not exist. - * - * @param string $eventName The name of the event - * @param callable $listener The listener - * - * @return int|null The event listener priority - */ - public function getListenerPriority($eventName, $listener); - - /** - * Checks whether an event has any registered listeners. - * - * @param string|null $eventName The name of the event - * - * @return bool true if the specified event has any listeners, false otherwise - */ - public function hasListeners($eventName = null); -} diff --git a/vendor/symfony/event-dispatcher/EventSubscriberInterface.php b/vendor/symfony/event-dispatcher/EventSubscriberInterface.php deleted file mode 100644 index 741590b..0000000 --- a/vendor/symfony/event-dispatcher/EventSubscriberInterface.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * An EventSubscriber knows itself what events it is interested in. - * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes - * {@link getSubscribedEvents} and registers the subscriber as a listener for all - * returned events. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - */ -interface EventSubscriberInterface -{ - /** - * Returns an array of event names this subscriber wants to listen to. - * - * The array keys are event names and the value can be: - * - * * The method name to call (priority defaults to 0) - * * An array composed of the method name to call and the priority - * * An array of arrays composed of the method names to call and respective - * priorities, or 0 if unset - * - * For instance: - * - * * ['eventName' => 'methodName'] - * * ['eventName' => ['methodName', $priority]] - * * ['eventName' => [['methodName1', $priority], ['methodName2']]] - * - * The code must not depend on runtime state as it will only be called at compile time. - * All logic depending on runtime state must be put into the individual methods handling the events. - * - * @return array The event names to listen to - */ - public static function getSubscribedEvents(); -} diff --git a/vendor/symfony/event-dispatcher/GenericEvent.php b/vendor/symfony/event-dispatcher/GenericEvent.php deleted file mode 100644 index f005e3a..0000000 --- a/vendor/symfony/event-dispatcher/GenericEvent.php +++ /dev/null @@ -1,175 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * Event encapsulation class. - * - * Encapsulates events thus decoupling the observer from the subject they encapsulate. - * - * @author Drak - */ -class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate -{ - protected $subject; - protected $arguments; - - /** - * Encapsulate an event with $subject and $args. - * - * @param mixed $subject The subject of the event, usually an object or a callable - * @param array $arguments Arguments to store in the event - */ - public function __construct($subject = null, array $arguments = []) - { - $this->subject = $subject; - $this->arguments = $arguments; - } - - /** - * Getter for subject property. - * - * @return mixed The observer subject - */ - public function getSubject() - { - return $this->subject; - } - - /** - * Get argument by key. - * - * @param string $key Key - * - * @return mixed Contents of array key - * - * @throws \InvalidArgumentException if key is not found - */ - public function getArgument($key) - { - if ($this->hasArgument($key)) { - return $this->arguments[$key]; - } - - throw new \InvalidArgumentException(sprintf('Argument "%s" not found.', $key)); - } - - /** - * Add argument to event. - * - * @param string $key Argument name - * @param mixed $value Value - * - * @return $this - */ - public function setArgument($key, $value) - { - $this->arguments[$key] = $value; - - return $this; - } - - /** - * Getter for all arguments. - * - * @return array - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Set args property. - * - * @param array $args Arguments - * - * @return $this - */ - public function setArguments(array $args = []) - { - $this->arguments = $args; - - return $this; - } - - /** - * Has argument. - * - * @param string $key Key of arguments array - * - * @return bool - */ - public function hasArgument($key) - { - return \array_key_exists($key, $this->arguments); - } - - /** - * ArrayAccess for argument getter. - * - * @param string $key Array key - * - * @return mixed - * - * @throws \InvalidArgumentException if key does not exist in $this->args - */ - public function offsetGet($key) - { - return $this->getArgument($key); - } - - /** - * ArrayAccess for argument setter. - * - * @param string $key Array key to set - * @param mixed $value Value - */ - public function offsetSet($key, $value) - { - $this->setArgument($key, $value); - } - - /** - * ArrayAccess for unset argument. - * - * @param string $key Array key - */ - public function offsetUnset($key) - { - if ($this->hasArgument($key)) { - unset($this->arguments[$key]); - } - } - - /** - * ArrayAccess has argument. - * - * @param string $key Array key - * - * @return bool - */ - public function offsetExists($key) - { - return $this->hasArgument($key); - } - - /** - * IteratorAggregate for iterating over the object like an array. - * - * @return \ArrayIterator - */ - public function getIterator() - { - return new \ArrayIterator($this->arguments); - } -} diff --git a/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php b/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php deleted file mode 100644 index 75a7d73..0000000 --- a/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * A read-only proxy for an event dispatcher. - * - * @author Bernhard Schussek - */ -class ImmutableEventDispatcher implements EventDispatcherInterface -{ - private $dispatcher; - - public function __construct(EventDispatcherInterface $dispatcher) - { - $this->dispatcher = LegacyEventDispatcherProxy::decorate($dispatcher); - } - - /** - * {@inheritdoc} - * - * @param string|null $eventName - */ - public function dispatch($event/*, string $eventName = null*/) - { - $eventName = 1 < \func_num_args() ? func_get_arg(1) : null; - - if (is_scalar($event)) { - // deprecated - $swap = $event; - $event = $eventName ?? new Event(); - $eventName = $swap; - } - - return $this->dispatcher->dispatch($event, $eventName); - } - - /** - * {@inheritdoc} - */ - public function addListener($eventName, $listener, $priority = 0) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function removeListener($eventName, $listener) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function getListeners($eventName = null) - { - return $this->dispatcher->getListeners($eventName); - } - - /** - * {@inheritdoc} - */ - public function getListenerPriority($eventName, $listener) - { - return $this->dispatcher->getListenerPriority($eventName, $listener); - } - - /** - * {@inheritdoc} - */ - public function hasListeners($eventName = null) - { - return $this->dispatcher->hasListeners($eventName); - } -} diff --git a/vendor/symfony/event-dispatcher/LICENSE b/vendor/symfony/event-dispatcher/LICENSE deleted file mode 100644 index 9e936ec..0000000 --- a/vendor/symfony/event-dispatcher/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php b/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php deleted file mode 100644 index 0a8fa16..0000000 --- a/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php +++ /dev/null @@ -1,147 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -use Psr\EventDispatcher\StoppableEventInterface; -use Symfony\Contracts\EventDispatcher\Event as ContractsEvent; -use Symfony\Contracts\EventDispatcher\EventDispatcherInterface as ContractsEventDispatcherInterface; - -/** - * A helper class to provide BC/FC with the legacy signature of EventDispatcherInterface::dispatch(). - * - * This class should be deprecated in Symfony 5.1 - * - * @author Nicolas Grekas - */ -final class LegacyEventDispatcherProxy implements EventDispatcherInterface -{ - private $dispatcher; - - public static function decorate(?ContractsEventDispatcherInterface $dispatcher): ?ContractsEventDispatcherInterface - { - if (null === $dispatcher) { - return null; - } - $r = new \ReflectionMethod($dispatcher, 'dispatch'); - $param2 = $r->getParameters()[1] ?? null; - - if (!$param2 || !$param2->hasType() || $param2->getType()->isBuiltin()) { - return $dispatcher; - } - - @trigger_error(sprintf('The signature of the "%s::dispatch()" method should be updated to "dispatch($event, string $eventName = null)", not doing so is deprecated since Symfony 4.3.', $r->class), E_USER_DEPRECATED); - - $self = new self(); - $self->dispatcher = $dispatcher; - - return $self; - } - - /** - * {@inheritdoc} - * - * @param string|null $eventName - * - * @return object - */ - public function dispatch($event/*, string $eventName = null*/) - { - $eventName = 1 < \func_num_args() ? func_get_arg(1) : null; - - if (\is_object($event)) { - $eventName = $eventName ?? \get_class($event); - } elseif (\is_string($event) && (null === $eventName || $eventName instanceof ContractsEvent || $eventName instanceof Event)) { - @trigger_error(sprintf('Calling the "%s::dispatch()" method with the event name as the first argument is deprecated since Symfony 4.3, pass it as the second argument and provide the event object as the first argument instead.', ContractsEventDispatcherInterface::class), E_USER_DEPRECATED); - $swap = $event; - $event = $eventName ?? new Event(); - $eventName = $swap; - } else { - throw new \TypeError(sprintf('Argument 1 passed to "%s::dispatch()" must be an object, "%s" given.', ContractsEventDispatcherInterface::class, \is_object($event) ? \get_class($event) : \gettype($event))); - } - - $listeners = $this->getListeners($eventName); - $stoppable = $event instanceof Event || $event instanceof ContractsEvent || $event instanceof StoppableEventInterface; - - foreach ($listeners as $listener) { - if ($stoppable && $event->isPropagationStopped()) { - break; - } - $listener($event, $eventName, $this); - } - - return $event; - } - - /** - * {@inheritdoc} - */ - public function addListener($eventName, $listener, $priority = 0) - { - return $this->dispatcher->addListener($eventName, $listener, $priority); - } - - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - return $this->dispatcher->addSubscriber($subscriber); - } - - /** - * {@inheritdoc} - */ - public function removeListener($eventName, $listener) - { - return $this->dispatcher->removeListener($eventName, $listener); - } - - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - return $this->dispatcher->removeSubscriber($subscriber); - } - - /** - * {@inheritdoc} - */ - public function getListeners($eventName = null): array - { - return $this->dispatcher->getListeners($eventName); - } - - /** - * {@inheritdoc} - */ - public function getListenerPriority($eventName, $listener): ?int - { - return $this->dispatcher->getListenerPriority($eventName, $listener); - } - - /** - * {@inheritdoc} - */ - public function hasListeners($eventName = null): bool - { - return $this->dispatcher->hasListeners($eventName); - } - - /** - * Proxies all method calls to the original event dispatcher. - */ - public function __call($method, $arguments) - { - return $this->dispatcher->{$method}(...$arguments); - } -} diff --git a/vendor/symfony/event-dispatcher/LegacyEventProxy.php b/vendor/symfony/event-dispatcher/LegacyEventProxy.php deleted file mode 100644 index 45ee251..0000000 --- a/vendor/symfony/event-dispatcher/LegacyEventProxy.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -use Psr\EventDispatcher\StoppableEventInterface; -use Symfony\Contracts\EventDispatcher\Event as ContractsEvent; - -/** - * @internal to be removed in 5.0. - */ -final class LegacyEventProxy extends Event -{ - private $event; - - /** - * @param object $event - */ - public function __construct($event) - { - $this->event = $event; - } - - /** - * @return object $event - */ - public function getEvent() - { - return $this->event; - } - - public function isPropagationStopped(): bool - { - if (!$this->event instanceof ContractsEvent && !$this->event instanceof StoppableEventInterface) { - return false; - } - - return $this->event->isPropagationStopped(); - } - - public function stopPropagation() - { - if (!$this->event instanceof ContractsEvent) { - return; - } - - $this->event->stopPropagation(); - } - - public function __call($name, $args) - { - return $this->event->{$name}(...$args); - } -} diff --git a/vendor/symfony/event-dispatcher/README.md b/vendor/symfony/event-dispatcher/README.md deleted file mode 100644 index e0d38ee..0000000 --- a/vendor/symfony/event-dispatcher/README.md +++ /dev/null @@ -1,15 +0,0 @@ -EventDispatcher Component -========================= - -The EventDispatcher component provides tools that allow your application -components to communicate with each other by dispatching events and listening to -them. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/event_dispatcher.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/event-dispatcher/composer.json b/vendor/symfony/event-dispatcher/composer.json deleted file mode 100644 index 62bea6c..0000000 --- a/vendor/symfony/event-dispatcher/composer.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "symfony/event-dispatcher", - "type": "library", - "description": "Symfony EventDispatcher Component", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1" - }, - "require-dev": { - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/dependency-injection": "<3.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - } -} diff --git a/vendor/symfony/filesystem/CHANGELOG.md b/vendor/symfony/filesystem/CHANGELOG.md deleted file mode 100644 index 4a0755b..0000000 --- a/vendor/symfony/filesystem/CHANGELOG.md +++ /dev/null @@ -1,76 +0,0 @@ -CHANGELOG -========= - -5.0.0 ------ - - * `Filesystem::dumpFile()` and `appendToFile()` don't accept arrays anymore - -4.4.0 ------ - - * support for passing a `null` value to `Filesystem::isAbsolutePath()` is deprecated and will be removed in 5.0 - * `tempnam()` now accepts a third argument `$suffix`. - -4.3.0 ------ - - * support for passing arrays to `Filesystem::dumpFile()` is deprecated and will be removed in 5.0 - * support for passing arrays to `Filesystem::appendToFile()` is deprecated and will be removed in 5.0 - -4.0.0 ------ - - * removed `LockHandler` - * Support for passing relative paths to `Filesystem::makePathRelative()` has been removed. - -3.4.0 ------ - - * support for passing relative paths to `Filesystem::makePathRelative()` is deprecated and will be removed in 4.0 - -3.3.0 ------ - - * added `appendToFile()` to append contents to existing files - -3.2.0 ------ - - * added `readlink()` as a platform independent method to read links - -3.0.0 ------ - - * removed `$mode` argument from `Filesystem::dumpFile()` - -2.8.0 ------ - - * added tempnam() a stream aware version of PHP's native tempnam() - -2.6.0 ------ - - * added LockHandler - -2.3.12 ------- - - * deprecated dumpFile() file mode argument. - -2.3.0 ------ - - * added the dumpFile() method to atomically write files - -2.2.0 ------ - - * added a delete option for the mirror() method - -2.1.0 ------ - - * 24eb396 : BC Break : mkdir() function now throws exception in case of failure instead of returning Boolean value - * created the component diff --git a/vendor/symfony/filesystem/Exception/ExceptionInterface.php b/vendor/symfony/filesystem/Exception/ExceptionInterface.php deleted file mode 100644 index fc438d9..0000000 --- a/vendor/symfony/filesystem/Exception/ExceptionInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem\Exception; - -/** - * Exception interface for all exceptions thrown by the component. - * - * @author Romain Neutron - */ -interface ExceptionInterface extends \Throwable -{ -} diff --git a/vendor/symfony/filesystem/Exception/FileNotFoundException.php b/vendor/symfony/filesystem/Exception/FileNotFoundException.php deleted file mode 100644 index 48b6408..0000000 --- a/vendor/symfony/filesystem/Exception/FileNotFoundException.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem\Exception; - -/** - * Exception class thrown when a file couldn't be found. - * - * @author Fabien Potencier - * @author Christian Gärtner - */ -class FileNotFoundException extends IOException -{ - public function __construct(string $message = null, int $code = 0, \Throwable $previous = null, string $path = null) - { - if (null === $message) { - if (null === $path) { - $message = 'File could not be found.'; - } else { - $message = sprintf('File "%s" could not be found.', $path); - } - } - - parent::__construct($message, $code, $previous, $path); - } -} diff --git a/vendor/symfony/filesystem/Exception/IOException.php b/vendor/symfony/filesystem/Exception/IOException.php deleted file mode 100644 index fea26e4..0000000 --- a/vendor/symfony/filesystem/Exception/IOException.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem\Exception; - -/** - * Exception class thrown when a filesystem operation failure happens. - * - * @author Romain Neutron - * @author Christian Gärtner - * @author Fabien Potencier - */ -class IOException extends \RuntimeException implements IOExceptionInterface -{ - private $path; - - public function __construct(string $message, int $code = 0, \Throwable $previous = null, string $path = null) - { - $this->path = $path; - - parent::__construct($message, $code, $previous); - } - - /** - * {@inheritdoc} - */ - public function getPath() - { - return $this->path; - } -} diff --git a/vendor/symfony/filesystem/Exception/IOExceptionInterface.php b/vendor/symfony/filesystem/Exception/IOExceptionInterface.php deleted file mode 100644 index f9d4644..0000000 --- a/vendor/symfony/filesystem/Exception/IOExceptionInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem\Exception; - -/** - * IOException interface for file and input/output stream related exceptions thrown by the component. - * - * @author Christian Gärtner - */ -interface IOExceptionInterface extends ExceptionInterface -{ - /** - * Returns the associated path for the exception. - * - * @return string|null The path - */ - public function getPath(); -} diff --git a/vendor/symfony/filesystem/Exception/InvalidArgumentException.php b/vendor/symfony/filesystem/Exception/InvalidArgumentException.php deleted file mode 100644 index abadc20..0000000 --- a/vendor/symfony/filesystem/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem\Exception; - -/** - * @author Christian Flothmann - */ -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/filesystem/Filesystem.php b/vendor/symfony/filesystem/Filesystem.php deleted file mode 100644 index b6df1bd..0000000 --- a/vendor/symfony/filesystem/Filesystem.php +++ /dev/null @@ -1,739 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem; - -use Symfony\Component\Filesystem\Exception\FileNotFoundException; -use Symfony\Component\Filesystem\Exception\InvalidArgumentException; -use Symfony\Component\Filesystem\Exception\IOException; - -/** - * Provides basic utility to manipulate the file system. - * - * @author Fabien Potencier - */ -class Filesystem -{ - private static $lastError; - - /** - * Copies a file. - * - * If the target file is older than the origin file, it's always overwritten. - * If the target file is newer, it is overwritten only when the - * $overwriteNewerFiles option is set to true. - * - * @throws FileNotFoundException When originFile doesn't exist - * @throws IOException When copy fails - */ - public function copy(string $originFile, string $targetFile, bool $overwriteNewerFiles = false) - { - $originIsLocal = stream_is_local($originFile) || 0 === stripos($originFile, 'file://'); - if ($originIsLocal && !is_file($originFile)) { - throw new FileNotFoundException(sprintf('Failed to copy "%s" because file does not exist.', $originFile), 0, null, $originFile); - } - - $this->mkdir(\dirname($targetFile)); - - $doCopy = true; - if (!$overwriteNewerFiles && null === parse_url($originFile, PHP_URL_HOST) && is_file($targetFile)) { - $doCopy = filemtime($originFile) > filemtime($targetFile); - } - - if ($doCopy) { - // https://bugs.php.net/64634 - if (false === $source = @fopen($originFile, 'r')) { - throw new IOException(sprintf('Failed to copy "%s" to "%s" because source file could not be opened for reading.', $originFile, $targetFile), 0, null, $originFile); - } - - // Stream context created to allow files overwrite when using FTP stream wrapper - disabled by default - if (false === $target = @fopen($targetFile, 'w', null, stream_context_create(['ftp' => ['overwrite' => true]]))) { - throw new IOException(sprintf('Failed to copy "%s" to "%s" because target file could not be opened for writing.', $originFile, $targetFile), 0, null, $originFile); - } - - $bytesCopied = stream_copy_to_stream($source, $target); - fclose($source); - fclose($target); - unset($source, $target); - - if (!is_file($targetFile)) { - throw new IOException(sprintf('Failed to copy "%s" to "%s".', $originFile, $targetFile), 0, null, $originFile); - } - - if ($originIsLocal) { - // Like `cp`, preserve executable permission bits - @chmod($targetFile, fileperms($targetFile) | (fileperms($originFile) & 0111)); - - if ($bytesCopied !== $bytesOrigin = filesize($originFile)) { - throw new IOException(sprintf('Failed to copy the whole content of "%s" to "%s" (%g of %g bytes copied).', $originFile, $targetFile, $bytesCopied, $bytesOrigin), 0, null, $originFile); - } - } - } - } - - /** - * Creates a directory recursively. - * - * @param string|iterable $dirs The directory path - * - * @throws IOException On any directory creation failure - */ - public function mkdir($dirs, int $mode = 0777) - { - foreach ($this->toIterable($dirs) as $dir) { - if (is_dir($dir)) { - continue; - } - - if (!self::box('mkdir', $dir, $mode, true)) { - if (!is_dir($dir)) { - // The directory was not created by a concurrent process. Let's throw an exception with a developer friendly error message if we have one - if (self::$lastError) { - throw new IOException(sprintf('Failed to create "%s": ', $dir).self::$lastError, 0, null, $dir); - } - throw new IOException(sprintf('Failed to create "%s".', $dir), 0, null, $dir); - } - } - } - } - - /** - * Checks the existence of files or directories. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to check - * - * @return bool true if the file exists, false otherwise - */ - public function exists($files) - { - $maxPathLength = PHP_MAXPATHLEN - 2; - - foreach ($this->toIterable($files) as $file) { - if (\strlen($file) > $maxPathLength) { - throw new IOException(sprintf('Could not check if file exist because path length exceeds %d characters.', $maxPathLength), 0, null, $file); - } - - if (!file_exists($file)) { - return false; - } - } - - return true; - } - - /** - * Sets access and modification time of file. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to create - * @param int|null $time The touch time as a Unix timestamp, if not supplied the current system time is used - * @param int|null $atime The access time as a Unix timestamp, if not supplied the current system time is used - * - * @throws IOException When touch fails - */ - public function touch($files, int $time = null, int $atime = null) - { - foreach ($this->toIterable($files) as $file) { - $touch = $time ? @touch($file, $time, $atime) : @touch($file); - if (true !== $touch) { - throw new IOException(sprintf('Failed to touch "%s".', $file), 0, null, $file); - } - } - } - - /** - * Removes files or directories. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to remove - * - * @throws IOException When removal fails - */ - public function remove($files) - { - if ($files instanceof \Traversable) { - $files = iterator_to_array($files, false); - } elseif (!\is_array($files)) { - $files = [$files]; - } - $files = array_reverse($files); - foreach ($files as $file) { - if (is_link($file)) { - // See https://bugs.php.net/52176 - if (!(self::box('unlink', $file) || '\\' !== \DIRECTORY_SEPARATOR || self::box('rmdir', $file)) && file_exists($file)) { - throw new IOException(sprintf('Failed to remove symlink "%s": ', $file).self::$lastError); - } - } elseif (is_dir($file)) { - $this->remove(new \FilesystemIterator($file, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS)); - - if (!self::box('rmdir', $file) && file_exists($file)) { - throw new IOException(sprintf('Failed to remove directory "%s": ', $file).self::$lastError); - } - } elseif (!self::box('unlink', $file) && file_exists($file)) { - throw new IOException(sprintf('Failed to remove file "%s": ', $file).self::$lastError); - } - } - } - - /** - * Change mode for an array of files or directories. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change mode - * @param int $mode The new mode (octal) - * @param int $umask The mode mask (octal) - * @param bool $recursive Whether change the mod recursively or not - * - * @throws IOException When the change fails - */ - public function chmod($files, int $mode, int $umask = 0000, bool $recursive = false) - { - foreach ($this->toIterable($files) as $file) { - if (true !== @chmod($file, $mode & ~$umask)) { - throw new IOException(sprintf('Failed to chmod file "%s".', $file), 0, null, $file); - } - if ($recursive && is_dir($file) && !is_link($file)) { - $this->chmod(new \FilesystemIterator($file), $mode, $umask, true); - } - } - } - - /** - * Change the owner of an array of files or directories. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change owner - * @param string|int $user A user name or number - * @param bool $recursive Whether change the owner recursively or not - * - * @throws IOException When the change fails - */ - public function chown($files, $user, bool $recursive = false) - { - foreach ($this->toIterable($files) as $file) { - if ($recursive && is_dir($file) && !is_link($file)) { - $this->chown(new \FilesystemIterator($file), $user, true); - } - if (is_link($file) && \function_exists('lchown')) { - if (true !== @lchown($file, $user)) { - throw new IOException(sprintf('Failed to chown file "%s".', $file), 0, null, $file); - } - } else { - if (true !== @chown($file, $user)) { - throw new IOException(sprintf('Failed to chown file "%s".', $file), 0, null, $file); - } - } - } - } - - /** - * Change the group of an array of files or directories. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change group - * @param string|int $group A group name or number - * @param bool $recursive Whether change the group recursively or not - * - * @throws IOException When the change fails - */ - public function chgrp($files, $group, bool $recursive = false) - { - foreach ($this->toIterable($files) as $file) { - if ($recursive && is_dir($file) && !is_link($file)) { - $this->chgrp(new \FilesystemIterator($file), $group, true); - } - if (is_link($file) && \function_exists('lchgrp')) { - if (true !== @lchgrp($file, $group)) { - throw new IOException(sprintf('Failed to chgrp file "%s".', $file), 0, null, $file); - } - } else { - if (true !== @chgrp($file, $group)) { - throw new IOException(sprintf('Failed to chgrp file "%s".', $file), 0, null, $file); - } - } - } - } - - /** - * Renames a file or a directory. - * - * @throws IOException When target file or directory already exists - * @throws IOException When origin cannot be renamed - */ - public function rename(string $origin, string $target, bool $overwrite = false) - { - // we check that target does not exist - if (!$overwrite && $this->isReadable($target)) { - throw new IOException(sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target); - } - - if (true !== @rename($origin, $target)) { - if (is_dir($origin)) { - // See https://bugs.php.net/54097 & https://php.net/rename#113943 - $this->mirror($origin, $target, null, ['override' => $overwrite, 'delete' => $overwrite]); - $this->remove($origin); - - return; - } - throw new IOException(sprintf('Cannot rename "%s" to "%s".', $origin, $target), 0, null, $target); - } - } - - /** - * Tells whether a file exists and is readable. - * - * @throws IOException When windows path is longer than 258 characters - */ - private function isReadable(string $filename): bool - { - $maxPathLength = PHP_MAXPATHLEN - 2; - - if (\strlen($filename) > $maxPathLength) { - throw new IOException(sprintf('Could not check if file is readable because path length exceeds %d characters.', $maxPathLength), 0, null, $filename); - } - - return is_readable($filename); - } - - /** - * Creates a symbolic link or copy a directory. - * - * @throws IOException When symlink fails - */ - public function symlink(string $originDir, string $targetDir, bool $copyOnWindows = false) - { - if ('\\' === \DIRECTORY_SEPARATOR) { - $originDir = strtr($originDir, '/', '\\'); - $targetDir = strtr($targetDir, '/', '\\'); - - if ($copyOnWindows) { - $this->mirror($originDir, $targetDir); - - return; - } - } - - $this->mkdir(\dirname($targetDir)); - - if (is_link($targetDir)) { - if (readlink($targetDir) === $originDir) { - return; - } - $this->remove($targetDir); - } - - if (!self::box('symlink', $originDir, $targetDir)) { - $this->linkException($originDir, $targetDir, 'symbolic'); - } - } - - /** - * Creates a hard link, or several hard links to a file. - * - * @param string|string[] $targetFiles The target file(s) - * - * @throws FileNotFoundException When original file is missing or not a file - * @throws IOException When link fails, including if link already exists - */ - public function hardlink(string $originFile, $targetFiles) - { - if (!$this->exists($originFile)) { - throw new FileNotFoundException(null, 0, null, $originFile); - } - - if (!is_file($originFile)) { - throw new FileNotFoundException(sprintf('Origin file "%s" is not a file.', $originFile)); - } - - foreach ($this->toIterable($targetFiles) as $targetFile) { - if (is_file($targetFile)) { - if (fileinode($originFile) === fileinode($targetFile)) { - continue; - } - $this->remove($targetFile); - } - - if (!self::box('link', $originFile, $targetFile)) { - $this->linkException($originFile, $targetFile, 'hard'); - } - } - } - - /** - * @param string $linkType Name of the link type, typically 'symbolic' or 'hard' - */ - private function linkException(string $origin, string $target, string $linkType) - { - if (self::$lastError) { - if ('\\' === \DIRECTORY_SEPARATOR && false !== strpos(self::$lastError, 'error code(1314)')) { - throw new IOException(sprintf('Unable to create "%s" link due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?', $linkType), 0, null, $target); - } - } - throw new IOException(sprintf('Failed to create "%s" link from "%s" to "%s".', $linkType, $origin, $target), 0, null, $target); - } - - /** - * Resolves links in paths. - * - * With $canonicalize = false (default) - * - if $path does not exist or is not a link, returns null - * - if $path is a link, returns the next direct target of the link without considering the existence of the target - * - * With $canonicalize = true - * - if $path does not exist, returns null - * - if $path exists, returns its absolute fully resolved final version - * - * @return string|null - */ - public function readlink(string $path, bool $canonicalize = false) - { - if (!$canonicalize && !is_link($path)) { - return null; - } - - if ($canonicalize) { - if (!$this->exists($path)) { - return null; - } - - if ('\\' === \DIRECTORY_SEPARATOR) { - $path = readlink($path); - } - - return realpath($path); - } - - if ('\\' === \DIRECTORY_SEPARATOR) { - return realpath($path); - } - - return readlink($path); - } - - /** - * Given an existing path, convert it to a path relative to a given starting path. - * - * @return string Path of target relative to starting path - */ - public function makePathRelative(string $endPath, string $startPath) - { - if (!$this->isAbsolutePath($startPath)) { - throw new InvalidArgumentException(sprintf('The start path "%s" is not absolute.', $startPath)); - } - - if (!$this->isAbsolutePath($endPath)) { - throw new InvalidArgumentException(sprintf('The end path "%s" is not absolute.', $endPath)); - } - - // Normalize separators on Windows - if ('\\' === \DIRECTORY_SEPARATOR) { - $endPath = str_replace('\\', '/', $endPath); - $startPath = str_replace('\\', '/', $startPath); - } - - $splitDriveLetter = function ($path) { - return (\strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && ctype_alpha($path[0])) - ? [substr($path, 2), strtoupper($path[0])] - : [$path, null]; - }; - - $splitPath = function ($path) { - $result = []; - - foreach (explode('/', trim($path, '/')) as $segment) { - if ('..' === $segment) { - array_pop($result); - } elseif ('.' !== $segment && '' !== $segment) { - $result[] = $segment; - } - } - - return $result; - }; - - list($endPath, $endDriveLetter) = $splitDriveLetter($endPath); - list($startPath, $startDriveLetter) = $splitDriveLetter($startPath); - - $startPathArr = $splitPath($startPath); - $endPathArr = $splitPath($endPath); - - if ($endDriveLetter && $startDriveLetter && $endDriveLetter != $startDriveLetter) { - // End path is on another drive, so no relative path exists - return $endDriveLetter.':/'.($endPathArr ? implode('/', $endPathArr).'/' : ''); - } - - // Find for which directory the common path stops - $index = 0; - while (isset($startPathArr[$index]) && isset($endPathArr[$index]) && $startPathArr[$index] === $endPathArr[$index]) { - ++$index; - } - - // Determine how deep the start path is relative to the common path (ie, "web/bundles" = 2 levels) - if (1 === \count($startPathArr) && '' === $startPathArr[0]) { - $depth = 0; - } else { - $depth = \count($startPathArr) - $index; - } - - // Repeated "../" for each level need to reach the common path - $traverser = str_repeat('../', $depth); - - $endPathRemainder = implode('/', \array_slice($endPathArr, $index)); - - // Construct $endPath from traversing to the common path, then to the remaining $endPath - $relativePath = $traverser.('' !== $endPathRemainder ? $endPathRemainder.'/' : ''); - - return '' === $relativePath ? './' : $relativePath; - } - - /** - * Mirrors a directory to another. - * - * Copies files and directories from the origin directory into the target directory. By default: - * - * - existing files in the target directory will be overwritten, except if they are newer (see the `override` option) - * - files in the target directory that do not exist in the source directory will not be deleted (see the `delete` option) - * - * @param \Traversable|null $iterator Iterator that filters which files and directories to copy, if null a recursive iterator is created - * @param array $options An array of boolean options - * Valid options are: - * - $options['override'] If true, target files newer than origin files are overwritten (see copy(), defaults to false) - * - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink(), defaults to false) - * - $options['delete'] Whether to delete files that are not in the source directory (defaults to false) - * - * @throws IOException When file type is unknown - */ - public function mirror(string $originDir, string $targetDir, \Traversable $iterator = null, array $options = []) - { - $targetDir = rtrim($targetDir, '/\\'); - $originDir = rtrim($originDir, '/\\'); - $originDirLen = \strlen($originDir); - - if (!$this->exists($originDir)) { - throw new IOException(sprintf('The origin directory specified "%s" was not found.', $originDir), 0, null, $originDir); - } - - // Iterate in destination folder to remove obsolete entries - if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) { - $deleteIterator = $iterator; - if (null === $deleteIterator) { - $flags = \FilesystemIterator::SKIP_DOTS; - $deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, $flags), \RecursiveIteratorIterator::CHILD_FIRST); - } - $targetDirLen = \strlen($targetDir); - foreach ($deleteIterator as $file) { - $origin = $originDir.substr($file->getPathname(), $targetDirLen); - if (!$this->exists($origin)) { - $this->remove($file); - } - } - } - - $copyOnWindows = $options['copy_on_windows'] ?? false; - - if (null === $iterator) { - $flags = $copyOnWindows ? \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS : \FilesystemIterator::SKIP_DOTS; - $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST); - } - - $this->mkdir($targetDir); - $filesCreatedWhileMirroring = []; - - foreach ($iterator as $file) { - if ($file->getPathname() === $targetDir || $file->getRealPath() === $targetDir || isset($filesCreatedWhileMirroring[$file->getRealPath()])) { - continue; - } - - $target = $targetDir.substr($file->getPathname(), $originDirLen); - $filesCreatedWhileMirroring[$target] = true; - - if (!$copyOnWindows && is_link($file)) { - $this->symlink($file->getLinkTarget(), $target); - } elseif (is_dir($file)) { - $this->mkdir($target); - } elseif (is_file($file)) { - $this->copy($file, $target, isset($options['override']) ? $options['override'] : false); - } else { - throw new IOException(sprintf('Unable to guess "%s" file type.', $file), 0, null, $file); - } - } - } - - /** - * Returns whether the file path is an absolute path. - * - * @return bool - */ - public function isAbsolutePath(string $file) - { - return strspn($file, '/\\', 0, 1) - || (\strlen($file) > 3 && ctype_alpha($file[0]) - && ':' === $file[1] - && strspn($file, '/\\', 2, 1) - ) - || null !== parse_url($file, PHP_URL_SCHEME) - ; - } - - /** - * Creates a temporary file with support for custom stream wrappers. - * - * @param string $prefix The prefix of the generated temporary filename - * Note: Windows uses only the first three characters of prefix - * @param string $suffix The suffix of the generated temporary filename - * - * @return string The new temporary filename (with path), or throw an exception on failure - */ - public function tempnam(string $dir, string $prefix/*, string $suffix = ''*/) - { - $suffix = \func_num_args() > 2 ? func_get_arg(2) : ''; - list($scheme, $hierarchy) = $this->getSchemeAndHierarchy($dir); - - // If no scheme or scheme is "file" or "gs" (Google Cloud) create temp file in local filesystem - if ((null === $scheme || 'file' === $scheme || 'gs' === $scheme) && '' === $suffix) { - $tmpFile = @tempnam($hierarchy, $prefix); - - // If tempnam failed or no scheme return the filename otherwise prepend the scheme - if (false !== $tmpFile) { - if (null !== $scheme && 'gs' !== $scheme) { - return $scheme.'://'.$tmpFile; - } - - return $tmpFile; - } - - throw new IOException('A temporary file could not be created.'); - } - - // Loop until we create a valid temp file or have reached 10 attempts - for ($i = 0; $i < 10; ++$i) { - // Create a unique filename - $tmpFile = $dir.'/'.$prefix.uniqid(mt_rand(), true).$suffix; - - // Use fopen instead of file_exists as some streams do not support stat - // Use mode 'x+' to atomically check existence and create to avoid a TOCTOU vulnerability - $handle = @fopen($tmpFile, 'x+'); - - // If unsuccessful restart the loop - if (false === $handle) { - continue; - } - - // Close the file if it was successfully opened - @fclose($handle); - - return $tmpFile; - } - - throw new IOException('A temporary file could not be created.'); - } - - /** - * Atomically dumps content into a file. - * - * @param string|resource $content The data to write into the file - * - * @throws IOException if the file cannot be written to - */ - public function dumpFile(string $filename, $content) - { - if (\is_array($content)) { - throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); - } - - $dir = \dirname($filename); - - if (!is_dir($dir)) { - $this->mkdir($dir); - } - - if (!is_writable($dir)) { - throw new IOException(sprintf('Unable to write to the "%s" directory.', $dir), 0, null, $dir); - } - - // Will create a temp file with 0600 access rights - // when the filesystem supports chmod. - $tmpFile = $this->tempnam($dir, basename($filename)); - - if (false === @file_put_contents($tmpFile, $content)) { - throw new IOException(sprintf('Failed to write file "%s".', $filename), 0, null, $filename); - } - - @chmod($tmpFile, file_exists($filename) ? fileperms($filename) : 0666 & ~umask()); - - $this->rename($tmpFile, $filename, true); - } - - /** - * Appends content to an existing file. - * - * @param string|resource $content The content to append - * - * @throws IOException If the file is not writable - */ - public function appendToFile(string $filename, $content) - { - if (\is_array($content)) { - throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); - } - - $dir = \dirname($filename); - - if (!is_dir($dir)) { - $this->mkdir($dir); - } - - if (!is_writable($dir)) { - throw new IOException(sprintf('Unable to write to the "%s" directory.', $dir), 0, null, $dir); - } - - if (false === @file_put_contents($filename, $content, FILE_APPEND)) { - throw new IOException(sprintf('Failed to write file "%s".', $filename), 0, null, $filename); - } - } - - private function toIterable($files): iterable - { - return \is_array($files) || $files instanceof \Traversable ? $files : [$files]; - } - - /** - * Gets a 2-tuple of scheme (may be null) and hierarchical part of a filename (e.g. file:///tmp -> [file, tmp]). - */ - private function getSchemeAndHierarchy(string $filename): array - { - $components = explode('://', $filename, 2); - - return 2 === \count($components) ? [$components[0], $components[1]] : [null, $components[0]]; - } - - /** - * @return mixed - */ - private static function box(callable $func) - { - self::$lastError = null; - set_error_handler(__CLASS__.'::handleError'); - try { - $result = $func(...\array_slice(\func_get_args(), 1)); - restore_error_handler(); - - return $result; - } catch (\Throwable $e) { - } - restore_error_handler(); - - throw $e; - } - - /** - * @internal - */ - public static function handleError($type, $msg) - { - self::$lastError = $msg; - } -} diff --git a/vendor/symfony/filesystem/LICENSE b/vendor/symfony/filesystem/LICENSE deleted file mode 100644 index 9e936ec..0000000 --- a/vendor/symfony/filesystem/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/filesystem/README.md b/vendor/symfony/filesystem/README.md deleted file mode 100644 index cb03d43..0000000 --- a/vendor/symfony/filesystem/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Filesystem Component -==================== - -The Filesystem component provides basic utilities for the filesystem. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/filesystem.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/filesystem/composer.json b/vendor/symfony/filesystem/composer.json deleted file mode 100644 index 7ec870a..0000000 --- a/vendor/symfony/filesystem/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "symfony/filesystem", - "type": "library", - "description": "Symfony Filesystem Component", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Filesystem\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - } -} diff --git a/vendor/symfony/finder/CHANGELOG.md b/vendor/symfony/finder/CHANGELOG.md deleted file mode 100644 index 33f5bd5..0000000 --- a/vendor/symfony/finder/CHANGELOG.md +++ /dev/null @@ -1,79 +0,0 @@ -CHANGELOG -========= - -5.0.0 ------ - - * added `$useNaturalSort` argument to `Finder::sortByName()` - -4.3.0 ------ - - * added Finder::ignoreVCSIgnored() to ignore files based on rules listed in .gitignore - -4.2.0 ------ - - * added $useNaturalSort option to Finder::sortByName() method - * the `Finder::sortByName()` method will have a new `$useNaturalSort` - argument in version 5.0, not defining it is deprecated - * added `Finder::reverseSorting()` to reverse the sorting - -4.0.0 ------ - - * removed `ExceptionInterface` - * removed `Symfony\Component\Finder\Iterator\FilterIterator` - -3.4.0 ------ - - * deprecated `Symfony\Component\Finder\Iterator\FilterIterator` - * added Finder::hasResults() method to check if any results were found - -3.3.0 ------ - - * added double-star matching to Glob::toRegex() - -3.0.0 ------ - - * removed deprecated classes - -2.8.0 ------ - - * deprecated adapters and related classes - -2.5.0 ------ - * added support for GLOB_BRACE in the paths passed to Finder::in() - -2.3.0 ------ - - * added a way to ignore unreadable directories (via Finder::ignoreUnreadableDirs()) - * unified the way subfolders that are not executable are handled by always throwing an AccessDeniedException exception - -2.2.0 ------ - - * added Finder::path() and Finder::notPath() methods - * added finder adapters to improve performance on specific platforms - * added support for wildcard characters (glob patterns) in the paths passed - to Finder::in() - -2.1.0 ------ - - * added Finder::sortByAccessedTime(), Finder::sortByChangedTime(), and - Finder::sortByModifiedTime() - * added Countable to Finder - * added support for an array of directories as an argument to - Finder::exclude() - * added searching based on the file content via Finder::contains() and - Finder::notContains() - * added support for the != operator in the Comparator - * [BC BREAK] filter expressions (used for file name and content) are no more - considered as regexps but glob patterns when they are enclosed in '*' or '?' diff --git a/vendor/symfony/finder/Comparator/Comparator.php b/vendor/symfony/finder/Comparator/Comparator.php deleted file mode 100644 index cfe3965..0000000 --- a/vendor/symfony/finder/Comparator/Comparator.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Comparator; - -/** - * Comparator. - * - * @author Fabien Potencier - */ -class Comparator -{ - private $target; - private $operator = '=='; - - /** - * Gets the target value. - * - * @return string The target value - */ - public function getTarget() - { - return $this->target; - } - - public function setTarget(string $target) - { - $this->target = $target; - } - - /** - * Gets the comparison operator. - * - * @return string The operator - */ - public function getOperator() - { - return $this->operator; - } - - /** - * Sets the comparison operator. - * - * @throws \InvalidArgumentException - */ - public function setOperator(string $operator) - { - if ('' === $operator) { - $operator = '=='; - } - - if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) { - throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator)); - } - - $this->operator = $operator; - } - - /** - * Tests against the target. - * - * @param mixed $test A test value - * - * @return bool - */ - public function test($test) - { - switch ($this->operator) { - case '>': - return $test > $this->target; - case '>=': - return $test >= $this->target; - case '<': - return $test < $this->target; - case '<=': - return $test <= $this->target; - case '!=': - return $test != $this->target; - } - - return $test == $this->target; - } -} diff --git a/vendor/symfony/finder/Comparator/DateComparator.php b/vendor/symfony/finder/Comparator/DateComparator.php deleted file mode 100644 index d17c77a..0000000 --- a/vendor/symfony/finder/Comparator/DateComparator.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Comparator; - -/** - * DateCompare compiles date comparisons. - * - * @author Fabien Potencier - */ -class DateComparator extends Comparator -{ - /** - * @param string $test A comparison string - * - * @throws \InvalidArgumentException If the test is not understood - */ - public function __construct(string $test) - { - if (!preg_match('#^\s*(==|!=|[<>]=?|after|since|before|until)?\s*(.+?)\s*$#i', $test, $matches)) { - throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a date test.', $test)); - } - - try { - $date = new \DateTime($matches[2]); - $target = $date->format('U'); - } catch (\Exception $e) { - throw new \InvalidArgumentException(sprintf('"%s" is not a valid date.', $matches[2])); - } - - $operator = isset($matches[1]) ? $matches[1] : '=='; - if ('since' === $operator || 'after' === $operator) { - $operator = '>'; - } - - if ('until' === $operator || 'before' === $operator) { - $operator = '<'; - } - - $this->setOperator($operator); - $this->setTarget($target); - } -} diff --git a/vendor/symfony/finder/Comparator/NumberComparator.php b/vendor/symfony/finder/Comparator/NumberComparator.php deleted file mode 100644 index 80667c9..0000000 --- a/vendor/symfony/finder/Comparator/NumberComparator.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Comparator; - -/** - * NumberComparator compiles a simple comparison to an anonymous - * subroutine, which you can call with a value to be tested again. - * - * Now this would be very pointless, if NumberCompare didn't understand - * magnitudes. - * - * The target value may use magnitudes of kilobytes (k, ki), - * megabytes (m, mi), or gigabytes (g, gi). Those suffixed - * with an i use the appropriate 2**n version in accordance with the - * IEC standard: http://physics.nist.gov/cuu/Units/binary.html - * - * Based on the Perl Number::Compare module. - * - * @author Fabien Potencier PHP port - * @author Richard Clamp Perl version - * @copyright 2004-2005 Fabien Potencier - * @copyright 2002 Richard Clamp - * - * @see http://physics.nist.gov/cuu/Units/binary.html - */ -class NumberComparator extends Comparator -{ - /** - * @param string|int $test A comparison string or an integer - * - * @throws \InvalidArgumentException If the test is not understood - */ - public function __construct(?string $test) - { - if (!preg_match('#^\s*(==|!=|[<>]=?)?\s*([0-9\.]+)\s*([kmg]i?)?\s*$#i', $test, $matches)) { - throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a number test.', $test)); - } - - $target = $matches[2]; - if (!is_numeric($target)) { - throw new \InvalidArgumentException(sprintf('Invalid number "%s".', $target)); - } - if (isset($matches[3])) { - // magnitude - switch (strtolower($matches[3])) { - case 'k': - $target *= 1000; - break; - case 'ki': - $target *= 1024; - break; - case 'm': - $target *= 1000000; - break; - case 'mi': - $target *= 1024 * 1024; - break; - case 'g': - $target *= 1000000000; - break; - case 'gi': - $target *= 1024 * 1024 * 1024; - break; - } - } - - $this->setTarget($target); - $this->setOperator(isset($matches[1]) ? $matches[1] : '=='); - } -} diff --git a/vendor/symfony/finder/Exception/AccessDeniedException.php b/vendor/symfony/finder/Exception/AccessDeniedException.php deleted file mode 100644 index ee195ea..0000000 --- a/vendor/symfony/finder/Exception/AccessDeniedException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Exception; - -/** - * @author Jean-François Simon - */ -class AccessDeniedException extends \UnexpectedValueException -{ -} diff --git a/vendor/symfony/finder/Exception/DirectoryNotFoundException.php b/vendor/symfony/finder/Exception/DirectoryNotFoundException.php deleted file mode 100644 index c6cc0f2..0000000 --- a/vendor/symfony/finder/Exception/DirectoryNotFoundException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Exception; - -/** - * @author Andreas Erhard - */ -class DirectoryNotFoundException extends \InvalidArgumentException -{ -} diff --git a/vendor/symfony/finder/Finder.php b/vendor/symfony/finder/Finder.php deleted file mode 100644 index e1bcea3..0000000 --- a/vendor/symfony/finder/Finder.php +++ /dev/null @@ -1,797 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -use Symfony\Component\Finder\Comparator\DateComparator; -use Symfony\Component\Finder\Comparator\NumberComparator; -use Symfony\Component\Finder\Exception\DirectoryNotFoundException; -use Symfony\Component\Finder\Iterator\CustomFilterIterator; -use Symfony\Component\Finder\Iterator\DateRangeFilterIterator; -use Symfony\Component\Finder\Iterator\DepthRangeFilterIterator; -use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator; -use Symfony\Component\Finder\Iterator\FilecontentFilterIterator; -use Symfony\Component\Finder\Iterator\FilenameFilterIterator; -use Symfony\Component\Finder\Iterator\SizeRangeFilterIterator; -use Symfony\Component\Finder\Iterator\SortableIterator; - -/** - * Finder allows to build rules to find files and directories. - * - * It is a thin wrapper around several specialized iterator classes. - * - * All rules may be invoked several times. - * - * All methods return the current Finder object to allow chaining: - * - * $finder = Finder::create()->files()->name('*.php')->in(__DIR__); - * - * @author Fabien Potencier - */ -class Finder implements \IteratorAggregate, \Countable -{ - const IGNORE_VCS_FILES = 1; - const IGNORE_DOT_FILES = 2; - const IGNORE_VCS_IGNORED_FILES = 4; - - private $mode = 0; - private $names = []; - private $notNames = []; - private $exclude = []; - private $filters = []; - private $depths = []; - private $sizes = []; - private $followLinks = false; - private $reverseSorting = false; - private $sort = false; - private $ignore = 0; - private $dirs = []; - private $dates = []; - private $iterators = []; - private $contains = []; - private $notContains = []; - private $paths = []; - private $notPaths = []; - private $ignoreUnreadableDirs = false; - - private static $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg']; - - public function __construct() - { - $this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES; - } - - /** - * Creates a new Finder. - * - * @return static - */ - public static function create() - { - return new static(); - } - - /** - * Restricts the matching to directories only. - * - * @return $this - */ - public function directories() - { - $this->mode = Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES; - - return $this; - } - - /** - * Restricts the matching to files only. - * - * @return $this - */ - public function files() - { - $this->mode = Iterator\FileTypeFilterIterator::ONLY_FILES; - - return $this; - } - - /** - * Adds tests for the directory depth. - * - * Usage: - * - * $finder->depth('> 1') // the Finder will start matching at level 1. - * $finder->depth('< 3') // the Finder will descend at most 3 levels of directories below the starting point. - * $finder->depth(['>= 1', '< 3']) - * - * @param string|int|string[]|int[] $levels The depth level expression or an array of depth levels - * - * @return $this - * - * @see DepthRangeFilterIterator - * @see NumberComparator - */ - public function depth($levels) - { - foreach ((array) $levels as $level) { - $this->depths[] = new Comparator\NumberComparator($level); - } - - return $this; - } - - /** - * Adds tests for file dates (last modified). - * - * The date must be something that strtotime() is able to parse: - * - * $finder->date('since yesterday'); - * $finder->date('until 2 days ago'); - * $finder->date('> now - 2 hours'); - * $finder->date('>= 2005-10-15'); - * $finder->date(['>= 2005-10-15', '<= 2006-05-27']); - * - * @param string|string[] $dates A date range string or an array of date ranges - * - * @return $this - * - * @see strtotime - * @see DateRangeFilterIterator - * @see DateComparator - */ - public function date($dates) - { - foreach ((array) $dates as $date) { - $this->dates[] = new Comparator\DateComparator($date); - } - - return $this; - } - - /** - * Adds rules that files must match. - * - * You can use patterns (delimited with / sign), globs or simple strings. - * - * $finder->name('*.php') - * $finder->name('/\.php$/') // same as above - * $finder->name('test.php') - * $finder->name(['test.py', 'test.php']) - * - * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function name($patterns) - { - $this->names = array_merge($this->names, (array) $patterns); - - return $this; - } - - /** - * Adds rules that files must not match. - * - * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function notName($patterns) - { - $this->notNames = array_merge($this->notNames, (array) $patterns); - - return $this; - } - - /** - * Adds tests that file contents must match. - * - * Strings or PCRE patterns can be used: - * - * $finder->contains('Lorem ipsum') - * $finder->contains('/Lorem ipsum/i') - * $finder->contains(['dolor', '/ipsum/i']) - * - * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns - * - * @return $this - * - * @see FilecontentFilterIterator - */ - public function contains($patterns) - { - $this->contains = array_merge($this->contains, (array) $patterns); - - return $this; - } - - /** - * Adds tests that file contents must not match. - * - * Strings or PCRE patterns can be used: - * - * $finder->notContains('Lorem ipsum') - * $finder->notContains('/Lorem ipsum/i') - * $finder->notContains(['lorem', '/dolor/i']) - * - * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns - * - * @return $this - * - * @see FilecontentFilterIterator - */ - public function notContains($patterns) - { - $this->notContains = array_merge($this->notContains, (array) $patterns); - - return $this; - } - - /** - * Adds rules that filenames must match. - * - * You can use patterns (delimited with / sign) or simple strings. - * - * $finder->path('some/special/dir') - * $finder->path('/some\/special\/dir/') // same as above - * $finder->path(['some dir', 'another/dir']) - * - * Use only / as dirname separator. - * - * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function path($patterns) - { - $this->paths = array_merge($this->paths, (array) $patterns); - - return $this; - } - - /** - * Adds rules that filenames must not match. - * - * You can use patterns (delimited with / sign) or simple strings. - * - * $finder->notPath('some/special/dir') - * $finder->notPath('/some\/special\/dir/') // same as above - * $finder->notPath(['some/file.txt', 'another/file.log']) - * - * Use only / as dirname separator. - * - * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function notPath($patterns) - { - $this->notPaths = array_merge($this->notPaths, (array) $patterns); - - return $this; - } - - /** - * Adds tests for file sizes. - * - * $finder->size('> 10K'); - * $finder->size('<= 1Ki'); - * $finder->size(4); - * $finder->size(['> 10K', '< 20K']) - * - * @param string|int|string[]|int[] $sizes A size range string or an integer or an array of size ranges - * - * @return $this - * - * @see SizeRangeFilterIterator - * @see NumberComparator - */ - public function size($sizes) - { - foreach ((array) $sizes as $size) { - $this->sizes[] = new Comparator\NumberComparator($size); - } - - return $this; - } - - /** - * Excludes directories. - * - * Directories passed as argument must be relative to the ones defined with the `in()` method. For example: - * - * $finder->in(__DIR__)->exclude('ruby'); - * - * @param string|array $dirs A directory path or an array of directories - * - * @return $this - * - * @see ExcludeDirectoryFilterIterator - */ - public function exclude($dirs) - { - $this->exclude = array_merge($this->exclude, (array) $dirs); - - return $this; - } - - /** - * Excludes "hidden" directories and files (starting with a dot). - * - * This option is enabled by default. - * - * @return $this - * - * @see ExcludeDirectoryFilterIterator - */ - public function ignoreDotFiles(bool $ignoreDotFiles) - { - if ($ignoreDotFiles) { - $this->ignore |= static::IGNORE_DOT_FILES; - } else { - $this->ignore &= ~static::IGNORE_DOT_FILES; - } - - return $this; - } - - /** - * Forces the finder to ignore version control directories. - * - * This option is enabled by default. - * - * @return $this - * - * @see ExcludeDirectoryFilterIterator - */ - public function ignoreVCS(bool $ignoreVCS) - { - if ($ignoreVCS) { - $this->ignore |= static::IGNORE_VCS_FILES; - } else { - $this->ignore &= ~static::IGNORE_VCS_FILES; - } - - return $this; - } - - /** - * Forces Finder to obey .gitignore and ignore files based on rules listed there. - * - * This option is disabled by default. - * - * @return $this - */ - public function ignoreVCSIgnored(bool $ignoreVCSIgnored) - { - if ($ignoreVCSIgnored) { - $this->ignore |= static::IGNORE_VCS_IGNORED_FILES; - } else { - $this->ignore &= ~static::IGNORE_VCS_IGNORED_FILES; - } - - return $this; - } - - /** - * Adds VCS patterns. - * - * @see ignoreVCS() - * - * @param string|string[] $pattern VCS patterns to ignore - */ - public static function addVCSPattern($pattern) - { - foreach ((array) $pattern as $p) { - self::$vcsPatterns[] = $p; - } - - self::$vcsPatterns = array_unique(self::$vcsPatterns); - } - - /** - * Sorts files and directories by an anonymous function. - * - * The anonymous function receives two \SplFileInfo instances to compare. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sort(\Closure $closure) - { - $this->sort = $closure; - - return $this; - } - - /** - * Sorts files and directories by name. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByName(bool $useNaturalSort = false) - { - $this->sort = $useNaturalSort ? Iterator\SortableIterator::SORT_BY_NAME_NATURAL : Iterator\SortableIterator::SORT_BY_NAME; - - return $this; - } - - /** - * Sorts files and directories by type (directories before files), then by name. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByType() - { - $this->sort = Iterator\SortableIterator::SORT_BY_TYPE; - - return $this; - } - - /** - * Sorts files and directories by the last accessed time. - * - * This is the time that the file was last accessed, read or written to. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByAccessedTime() - { - $this->sort = Iterator\SortableIterator::SORT_BY_ACCESSED_TIME; - - return $this; - } - - /** - * Reverses the sorting. - * - * @return $this - */ - public function reverseSorting() - { - $this->reverseSorting = true; - - return $this; - } - - /** - * Sorts files and directories by the last inode changed time. - * - * This is the time that the inode information was last modified (permissions, owner, group or other metadata). - * - * On Windows, since inode is not available, changed time is actually the file creation time. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByChangedTime() - { - $this->sort = Iterator\SortableIterator::SORT_BY_CHANGED_TIME; - - return $this; - } - - /** - * Sorts files and directories by the last modified time. - * - * This is the last time the actual contents of the file were last modified. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByModifiedTime() - { - $this->sort = Iterator\SortableIterator::SORT_BY_MODIFIED_TIME; - - return $this; - } - - /** - * Filters the iterator with an anonymous function. - * - * The anonymous function receives a \SplFileInfo and must return false - * to remove files. - * - * @return $this - * - * @see CustomFilterIterator - */ - public function filter(\Closure $closure) - { - $this->filters[] = $closure; - - return $this; - } - - /** - * Forces the following of symlinks. - * - * @return $this - */ - public function followLinks() - { - $this->followLinks = true; - - return $this; - } - - /** - * Tells finder to ignore unreadable directories. - * - * By default, scanning unreadable directories content throws an AccessDeniedException. - * - * @return $this - */ - public function ignoreUnreadableDirs(bool $ignore = true) - { - $this->ignoreUnreadableDirs = $ignore; - - return $this; - } - - /** - * Searches files and directories which match defined rules. - * - * @param string|string[] $dirs A directory path or an array of directories - * - * @return $this - * - * @throws DirectoryNotFoundException if one of the directories does not exist - */ - public function in($dirs) - { - $resolvedDirs = []; - - foreach ((array) $dirs as $dir) { - if (is_dir($dir)) { - $resolvedDirs[] = $this->normalizeDir($dir); - } elseif ($glob = glob($dir, (\defined('GLOB_BRACE') ? GLOB_BRACE : 0) | GLOB_ONLYDIR | GLOB_NOSORT)) { - sort($glob); - $resolvedDirs = array_merge($resolvedDirs, array_map([$this, 'normalizeDir'], $glob)); - } else { - throw new DirectoryNotFoundException(sprintf('The "%s" directory does not exist.', $dir)); - } - } - - $this->dirs = array_merge($this->dirs, $resolvedDirs); - - return $this; - } - - /** - * Returns an Iterator for the current Finder configuration. - * - * This method implements the IteratorAggregate interface. - * - * @return \Iterator|SplFileInfo[] An iterator - * - * @throws \LogicException if the in() method has not been called - */ - public function getIterator() - { - if (0 === \count($this->dirs) && 0 === \count($this->iterators)) { - throw new \LogicException('You must call one of in() or append() methods before iterating over a Finder.'); - } - - if (1 === \count($this->dirs) && 0 === \count($this->iterators)) { - return $this->searchInDirectory($this->dirs[0]); - } - - $iterator = new \AppendIterator(); - foreach ($this->dirs as $dir) { - $iterator->append($this->searchInDirectory($dir)); - } - - foreach ($this->iterators as $it) { - $iterator->append($it); - } - - return $iterator; - } - - /** - * Appends an existing set of files/directories to the finder. - * - * The set can be another Finder, an Iterator, an IteratorAggregate, or even a plain array. - * - * @return $this - * - * @throws \InvalidArgumentException when the given argument is not iterable - */ - public function append(iterable $iterator) - { - if ($iterator instanceof \IteratorAggregate) { - $this->iterators[] = $iterator->getIterator(); - } elseif ($iterator instanceof \Iterator) { - $this->iterators[] = $iterator; - } elseif ($iterator instanceof \Traversable || \is_array($iterator)) { - $it = new \ArrayIterator(); - foreach ($iterator as $file) { - $it->append($file instanceof \SplFileInfo ? $file : new \SplFileInfo($file)); - } - $this->iterators[] = $it; - } else { - throw new \InvalidArgumentException('Finder::append() method wrong argument type.'); - } - - return $this; - } - - /** - * Check if the any results were found. - * - * @return bool - */ - public function hasResults() - { - foreach ($this->getIterator() as $_) { - return true; - } - - return false; - } - - /** - * Counts all the results collected by the iterators. - * - * @return int - */ - public function count() - { - return iterator_count($this->getIterator()); - } - - private function searchInDirectory(string $dir): \Iterator - { - $exclude = $this->exclude; - $notPaths = $this->notPaths; - - if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) { - $exclude = array_merge($exclude, self::$vcsPatterns); - } - - if (static::IGNORE_DOT_FILES === (static::IGNORE_DOT_FILES & $this->ignore)) { - $notPaths[] = '#(^|/)\..+(/|$)#'; - } - - if (static::IGNORE_VCS_IGNORED_FILES === (static::IGNORE_VCS_IGNORED_FILES & $this->ignore)) { - $gitignoreFilePath = sprintf('%s/.gitignore', $dir); - if (!is_readable($gitignoreFilePath)) { - throw new \RuntimeException(sprintf('The "ignoreVCSIgnored" option cannot be used by the Finder as the "%s" file is not readable.', $gitignoreFilePath)); - } - $notPaths = array_merge($notPaths, [Gitignore::toRegex(file_get_contents($gitignoreFilePath))]); - } - - $minDepth = 0; - $maxDepth = PHP_INT_MAX; - - foreach ($this->depths as $comparator) { - switch ($comparator->getOperator()) { - case '>': - $minDepth = $comparator->getTarget() + 1; - break; - case '>=': - $minDepth = $comparator->getTarget(); - break; - case '<': - $maxDepth = $comparator->getTarget() - 1; - break; - case '<=': - $maxDepth = $comparator->getTarget(); - break; - default: - $minDepth = $maxDepth = $comparator->getTarget(); - } - } - - $flags = \RecursiveDirectoryIterator::SKIP_DOTS; - - if ($this->followLinks) { - $flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS; - } - - $iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs); - - if ($exclude) { - $iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $exclude); - } - - $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST); - - if ($minDepth > 0 || $maxDepth < PHP_INT_MAX) { - $iterator = new Iterator\DepthRangeFilterIterator($iterator, $minDepth, $maxDepth); - } - - if ($this->mode) { - $iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode); - } - - if ($this->names || $this->notNames) { - $iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames); - } - - if ($this->contains || $this->notContains) { - $iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains); - } - - if ($this->sizes) { - $iterator = new Iterator\SizeRangeFilterIterator($iterator, $this->sizes); - } - - if ($this->dates) { - $iterator = new Iterator\DateRangeFilterIterator($iterator, $this->dates); - } - - if ($this->filters) { - $iterator = new Iterator\CustomFilterIterator($iterator, $this->filters); - } - - if ($this->paths || $notPaths) { - $iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $notPaths); - } - - if ($this->sort || $this->reverseSorting) { - $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting); - $iterator = $iteratorAggregate->getIterator(); - } - - return $iterator; - } - - /** - * Normalizes given directory names by removing trailing slashes. - * - * Excluding: (s)ftp:// or ssh2.(s)ftp:// wrapper - */ - private function normalizeDir(string $dir): string - { - if ('/' === $dir) { - return $dir; - } - - $dir = rtrim($dir, '/'.\DIRECTORY_SEPARATOR); - - if (preg_match('#^(ssh2\.)?s?ftp://#', $dir)) { - $dir .= '/'; - } - - return $dir; - } -} diff --git a/vendor/symfony/finder/Gitignore.php b/vendor/symfony/finder/Gitignore.php deleted file mode 100644 index 5ffe585..0000000 --- a/vendor/symfony/finder/Gitignore.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -/** - * Gitignore matches against text. - * - * @author Ahmed Abdou - */ -class Gitignore -{ - /** - * Returns a regexp which is the equivalent of the gitignore pattern. - * - * @return string The regexp - */ - public static function toRegex(string $gitignoreFileContent): string - { - $gitignoreFileContent = preg_replace('/^[^\\\r\n]*#.*/m', '', $gitignoreFileContent); - $gitignoreLines = preg_split('/\r\n|\r|\n/', $gitignoreFileContent); - $gitignoreLines = array_map('trim', $gitignoreLines); - $gitignoreLines = array_filter($gitignoreLines); - - $ignoreLinesPositive = array_filter($gitignoreLines, function (string $line) { - return !preg_match('/^!/', $line); - }); - - $ignoreLinesNegative = array_filter($gitignoreLines, function (string $line) { - return preg_match('/^!/', $line); - }); - - $ignoreLinesNegative = array_map(function (string $line) { - return preg_replace('/^!(.*)/', '${1}', $line); - }, $ignoreLinesNegative); - $ignoreLinesNegative = array_map([__CLASS__, 'getRegexFromGitignore'], $ignoreLinesNegative); - - $ignoreLinesPositive = array_map([__CLASS__, 'getRegexFromGitignore'], $ignoreLinesPositive); - if (empty($ignoreLinesPositive)) { - return '/^$/'; - } - - if (empty($ignoreLinesNegative)) { - return sprintf('/%s/', implode('|', $ignoreLinesPositive)); - } - - return sprintf('/(?=^(?:(?!(%s)).)*$)(%s)/', implode('|', $ignoreLinesNegative), implode('|', $ignoreLinesPositive)); - } - - private static function getRegexFromGitignore(string $gitignorePattern): string - { - $regex = '('; - if (0 === strpos($gitignorePattern, '/')) { - $gitignorePattern = substr($gitignorePattern, 1); - $regex .= '^'; - } else { - $regex .= '(^|\/)'; - } - - if ('/' === $gitignorePattern[\strlen($gitignorePattern) - 1]) { - $gitignorePattern = substr($gitignorePattern, 0, -1); - } - - $iMax = \strlen($gitignorePattern); - for ($i = 0; $i < $iMax; ++$i) { - $doubleChars = substr($gitignorePattern, $i, 2); - if ('**' === $doubleChars) { - $regex .= '.+'; - ++$i; - continue; - } - - $c = $gitignorePattern[$i]; - switch ($c) { - case '*': - $regex .= '[^\/]+'; - break; - case '/': - case '.': - case ':': - case '(': - case ')': - case '{': - case '}': - $regex .= '\\'.$c; - break; - default: - $regex .= $c; - } - } - - $regex .= '($|\/)'; - $regex .= ')'; - - return $regex; - } -} diff --git a/vendor/symfony/finder/Glob.php b/vendor/symfony/finder/Glob.php deleted file mode 100644 index 8447932..0000000 --- a/vendor/symfony/finder/Glob.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -/** - * Glob matches globbing patterns against text. - * - * if match_glob("foo.*", "foo.bar") echo "matched\n"; - * - * // prints foo.bar and foo.baz - * $regex = glob_to_regex("foo.*"); - * for (['foo.bar', 'foo.baz', 'foo', 'bar'] as $t) - * { - * if (/$regex/) echo "matched: $car\n"; - * } - * - * Glob implements glob(3) style matching that can be used to match - * against text, rather than fetching names from a filesystem. - * - * Based on the Perl Text::Glob module. - * - * @author Fabien Potencier PHP port - * @author Richard Clamp Perl version - * @copyright 2004-2005 Fabien Potencier - * @copyright 2002 Richard Clamp - */ -class Glob -{ - /** - * Returns a regexp which is the equivalent of the glob pattern. - * - * @return string - */ - public static function toRegex(string $glob, bool $strictLeadingDot = true, bool $strictWildcardSlash = true, string $delimiter = '#') - { - $firstByte = true; - $escaping = false; - $inCurlies = 0; - $regex = ''; - $sizeGlob = \strlen($glob); - for ($i = 0; $i < $sizeGlob; ++$i) { - $car = $glob[$i]; - if ($firstByte && $strictLeadingDot && '.' !== $car) { - $regex .= '(?=[^\.])'; - } - - $firstByte = '/' === $car; - - if ($firstByte && $strictWildcardSlash && isset($glob[$i + 2]) && '**' === $glob[$i + 1].$glob[$i + 2] && (!isset($glob[$i + 3]) || '/' === $glob[$i + 3])) { - $car = '[^/]++/'; - if (!isset($glob[$i + 3])) { - $car .= '?'; - } - - if ($strictLeadingDot) { - $car = '(?=[^\.])'.$car; - } - - $car = '/(?:'.$car.')*'; - $i += 2 + isset($glob[$i + 3]); - - if ('/' === $delimiter) { - $car = str_replace('/', '\\/', $car); - } - } - - if ($delimiter === $car || '.' === $car || '(' === $car || ')' === $car || '|' === $car || '+' === $car || '^' === $car || '$' === $car) { - $regex .= "\\$car"; - } elseif ('*' === $car) { - $regex .= $escaping ? '\\*' : ($strictWildcardSlash ? '[^/]*' : '.*'); - } elseif ('?' === $car) { - $regex .= $escaping ? '\\?' : ($strictWildcardSlash ? '[^/]' : '.'); - } elseif ('{' === $car) { - $regex .= $escaping ? '\\{' : '('; - if (!$escaping) { - ++$inCurlies; - } - } elseif ('}' === $car && $inCurlies) { - $regex .= $escaping ? '}' : ')'; - if (!$escaping) { - --$inCurlies; - } - } elseif (',' === $car && $inCurlies) { - $regex .= $escaping ? ',' : '|'; - } elseif ('\\' === $car) { - if ($escaping) { - $regex .= '\\\\'; - $escaping = false; - } else { - $escaping = true; - } - - continue; - } else { - $regex .= $car; - } - $escaping = false; - } - - return $delimiter.'^'.$regex.'$'.$delimiter; - } -} diff --git a/vendor/symfony/finder/Iterator/CustomFilterIterator.php b/vendor/symfony/finder/Iterator/CustomFilterIterator.php deleted file mode 100644 index a30bbd0..0000000 --- a/vendor/symfony/finder/Iterator/CustomFilterIterator.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * CustomFilterIterator filters files by applying anonymous functions. - * - * The anonymous function receives a \SplFileInfo and must return false - * to remove files. - * - * @author Fabien Potencier - */ -class CustomFilterIterator extends \FilterIterator -{ - private $filters = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param callable[] $filters An array of PHP callbacks - * - * @throws \InvalidArgumentException - */ - public function __construct(\Iterator $iterator, array $filters) - { - foreach ($filters as $filter) { - if (!\is_callable($filter)) { - throw new \InvalidArgumentException('Invalid PHP callback.'); - } - } - $this->filters = $filters; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - $fileinfo = $this->current(); - - foreach ($this->filters as $filter) { - if (false === $filter($fileinfo)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php b/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php deleted file mode 100644 index 2e97e00..0000000 --- a/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Comparator\DateComparator; - -/** - * DateRangeFilterIterator filters out files that are not in the given date range (last modified dates). - * - * @author Fabien Potencier - */ -class DateRangeFilterIterator extends \FilterIterator -{ - private $comparators = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param DateComparator[] $comparators An array of DateComparator instances - */ - public function __construct(\Iterator $iterator, array $comparators) - { - $this->comparators = $comparators; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - $fileinfo = $this->current(); - - if (!file_exists($fileinfo->getPathname())) { - return false; - } - - $filedate = $fileinfo->getMTime(); - foreach ($this->comparators as $compare) { - if (!$compare->test($filedate)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php b/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php deleted file mode 100644 index 436a66d..0000000 --- a/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * DepthRangeFilterIterator limits the directory depth. - * - * @author Fabien Potencier - */ -class DepthRangeFilterIterator extends \FilterIterator -{ - private $minDepth = 0; - - /** - * @param \RecursiveIteratorIterator $iterator The Iterator to filter - * @param int $minDepth The min depth - * @param int $maxDepth The max depth - */ - public function __construct(\RecursiveIteratorIterator $iterator, int $minDepth = 0, int $maxDepth = PHP_INT_MAX) - { - $this->minDepth = $minDepth; - $iterator->setMaxDepth(PHP_INT_MAX === $maxDepth ? -1 : $maxDepth); - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - return $this->getInnerIterator()->getDepth() >= $this->minDepth; - } -} diff --git a/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php b/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php deleted file mode 100644 index 6a1b291..0000000 --- a/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * ExcludeDirectoryFilterIterator filters out directories. - * - * @author Fabien Potencier - */ -class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator -{ - private $iterator; - private $isRecursive; - private $excludedDirs = []; - private $excludedPattern; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param string[] $directories An array of directories to exclude - */ - public function __construct(\Iterator $iterator, array $directories) - { - $this->iterator = $iterator; - $this->isRecursive = $iterator instanceof \RecursiveIterator; - $patterns = []; - foreach ($directories as $directory) { - $directory = rtrim($directory, '/'); - if (!$this->isRecursive || false !== strpos($directory, '/')) { - $patterns[] = preg_quote($directory, '#'); - } else { - $this->excludedDirs[$directory] = true; - } - } - if ($patterns) { - $this->excludedPattern = '#(?:^|/)(?:'.implode('|', $patterns).')(?:/|$)#'; - } - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool True if the value should be kept, false otherwise - */ - public function accept() - { - if ($this->isRecursive && isset($this->excludedDirs[$this->getFilename()]) && $this->isDir()) { - return false; - } - - if ($this->excludedPattern) { - $path = $this->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath(); - $path = str_replace('\\', '/', $path); - - return !preg_match($this->excludedPattern, $path); - } - - return true; - } - - /** - * @return bool - */ - public function hasChildren() - { - return $this->isRecursive && $this->iterator->hasChildren(); - } - - public function getChildren() - { - $children = new self($this->iterator->getChildren(), []); - $children->excludedDirs = $this->excludedDirs; - $children->excludedPattern = $this->excludedPattern; - - return $children; - } -} diff --git a/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php b/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php deleted file mode 100644 index a4c4eec..0000000 --- a/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * FileTypeFilterIterator only keeps files, directories, or both. - * - * @author Fabien Potencier - */ -class FileTypeFilterIterator extends \FilterIterator -{ - const ONLY_FILES = 1; - const ONLY_DIRECTORIES = 2; - - private $mode; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param int $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES) - */ - public function __construct(\Iterator $iterator, int $mode) - { - $this->mode = $mode; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - $fileinfo = $this->current(); - if (self::ONLY_DIRECTORIES === (self::ONLY_DIRECTORIES & $this->mode) && $fileinfo->isFile()) { - return false; - } elseif (self::ONLY_FILES === (self::ONLY_FILES & $this->mode) && $fileinfo->isDir()) { - return false; - } - - return true; - } -} diff --git a/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php b/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php deleted file mode 100644 index b26a368..0000000 --- a/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * FilecontentFilterIterator filters files by their contents using patterns (regexps or strings). - * - * @author Fabien Potencier - * @author Włodzimierz Gajda - */ -class FilecontentFilterIterator extends MultiplePcreFilterIterator -{ - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - if (!$this->matchRegexps && !$this->noMatchRegexps) { - return true; - } - - $fileinfo = $this->current(); - - if ($fileinfo->isDir() || !$fileinfo->isReadable()) { - return false; - } - - $content = $fileinfo->getContents(); - if (!$content) { - return false; - } - - return $this->isAccepted($content); - } - - /** - * Converts string to regexp if necessary. - * - * @param string $str Pattern: string or regexp - * - * @return string regexp corresponding to a given string or regexp - */ - protected function toRegex(string $str) - { - return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/'; - } -} diff --git a/vendor/symfony/finder/Iterator/FilenameFilterIterator.php b/vendor/symfony/finder/Iterator/FilenameFilterIterator.php deleted file mode 100644 index dedd1ca..0000000 --- a/vendor/symfony/finder/Iterator/FilenameFilterIterator.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Glob; - -/** - * FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string). - * - * @author Fabien Potencier - */ -class FilenameFilterIterator extends MultiplePcreFilterIterator -{ - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - return $this->isAccepted($this->current()->getFilename()); - } - - /** - * Converts glob to regexp. - * - * PCRE patterns are left unchanged. - * Glob strings are transformed with Glob::toRegex(). - * - * @param string $str Pattern: glob or regexp - * - * @return string regexp corresponding to a given glob or regexp - */ - protected function toRegex(string $str) - { - return $this->isRegex($str) ? $str : Glob::toRegex($str); - } -} diff --git a/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php b/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php deleted file mode 100644 index 78a34ab..0000000 --- a/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings). - * - * @author Fabien Potencier - */ -abstract class MultiplePcreFilterIterator extends \FilterIterator -{ - protected $matchRegexps = []; - protected $noMatchRegexps = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param string[] $matchPatterns An array of patterns that need to match - * @param string[] $noMatchPatterns An array of patterns that need to not match - */ - public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns) - { - foreach ($matchPatterns as $pattern) { - $this->matchRegexps[] = $this->toRegex($pattern); - } - - foreach ($noMatchPatterns as $pattern) { - $this->noMatchRegexps[] = $this->toRegex($pattern); - } - - parent::__construct($iterator); - } - - /** - * Checks whether the string is accepted by the regex filters. - * - * If there is no regexps defined in the class, this method will accept the string. - * Such case can be handled by child classes before calling the method if they want to - * apply a different behavior. - * - * @return bool - */ - protected function isAccepted(string $string) - { - // should at least not match one rule to exclude - foreach ($this->noMatchRegexps as $regex) { - if (preg_match($regex, $string)) { - return false; - } - } - - // should at least match one rule - if ($this->matchRegexps) { - foreach ($this->matchRegexps as $regex) { - if (preg_match($regex, $string)) { - return true; - } - } - - return false; - } - - // If there is no match rules, the file is accepted - return true; - } - - /** - * Checks whether the string is a regex. - * - * @return bool - */ - protected function isRegex(string $str) - { - if (preg_match('/^(.{3,}?)[imsxuADU]*$/', $str, $m)) { - $start = substr($m[1], 0, 1); - $end = substr($m[1], -1); - - if ($start === $end) { - return !preg_match('/[*?[:alnum:] \\\\]/', $start); - } - - foreach ([['{', '}'], ['(', ')'], ['[', ']'], ['<', '>']] as $delimiters) { - if ($start === $delimiters[0] && $end === $delimiters[1]) { - return true; - } - } - } - - return false; - } - - /** - * Converts string into regexp. - * - * @return string - */ - abstract protected function toRegex(string $str); -} diff --git a/vendor/symfony/finder/Iterator/PathFilterIterator.php b/vendor/symfony/finder/Iterator/PathFilterIterator.php deleted file mode 100644 index 67b71f4..0000000 --- a/vendor/symfony/finder/Iterator/PathFilterIterator.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * PathFilterIterator filters files by path patterns (e.g. some/special/dir). - * - * @author Fabien Potencier - * @author Włodzimierz Gajda - */ -class PathFilterIterator extends MultiplePcreFilterIterator -{ - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - $filename = $this->current()->getRelativePathname(); - - if ('\\' === \DIRECTORY_SEPARATOR) { - $filename = str_replace('\\', '/', $filename); - } - - return $this->isAccepted($filename); - } - - /** - * Converts strings to regexp. - * - * PCRE patterns are left unchanged. - * - * Default conversion: - * 'lorem/ipsum/dolor' ==> 'lorem\/ipsum\/dolor/' - * - * Use only / as directory separator (on Windows also). - * - * @param string $str Pattern: regexp or dirname - * - * @return string regexp corresponding to a given string or regexp - */ - protected function toRegex(string $str) - { - return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/'; - } -} diff --git a/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php b/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php deleted file mode 100644 index 7616b14..0000000 --- a/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php +++ /dev/null @@ -1,144 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Exception\AccessDeniedException; -use Symfony\Component\Finder\SplFileInfo; - -/** - * Extends the \RecursiveDirectoryIterator to support relative paths. - * - * @author Victor Berchet - */ -class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator -{ - /** - * @var bool - */ - private $ignoreUnreadableDirs; - - /** - * @var bool - */ - private $rewindable; - - // these 3 properties take part of the performance optimization to avoid redoing the same work in all iterations - private $rootPath; - private $subPath; - private $directorySeparator = '/'; - - /** - * @throws \RuntimeException - */ - public function __construct(string $path, int $flags, bool $ignoreUnreadableDirs = false) - { - if ($flags & (self::CURRENT_AS_PATHNAME | self::CURRENT_AS_SELF)) { - throw new \RuntimeException('This iterator only support returning current as fileinfo.'); - } - - parent::__construct($path, $flags); - $this->ignoreUnreadableDirs = $ignoreUnreadableDirs; - $this->rootPath = $path; - if ('/' !== \DIRECTORY_SEPARATOR && !($flags & self::UNIX_PATHS)) { - $this->directorySeparator = \DIRECTORY_SEPARATOR; - } - } - - /** - * Return an instance of SplFileInfo with support for relative paths. - * - * @return SplFileInfo File information - */ - public function current() - { - // the logic here avoids redoing the same work in all iterations - - if (null === $subPathname = $this->subPath) { - $subPathname = $this->subPath = (string) $this->getSubPath(); - } - if ('' !== $subPathname) { - $subPathname .= $this->directorySeparator; - } - $subPathname .= $this->getFilename(); - - if ('/' !== $basePath = $this->rootPath) { - $basePath .= $this->directorySeparator; - } - - return new SplFileInfo($basePath.$subPathname, $this->subPath, $subPathname); - } - - /** - * @return \RecursiveIterator - * - * @throws AccessDeniedException - */ - public function getChildren() - { - try { - $children = parent::getChildren(); - - if ($children instanceof self) { - // parent method will call the constructor with default arguments, so unreadable dirs won't be ignored anymore - $children->ignoreUnreadableDirs = $this->ignoreUnreadableDirs; - - // performance optimization to avoid redoing the same work in all children - $children->rewindable = &$this->rewindable; - $children->rootPath = $this->rootPath; - } - - return $children; - } catch (\UnexpectedValueException $e) { - if ($this->ignoreUnreadableDirs) { - // If directory is unreadable and finder is set to ignore it, a fake empty content is returned. - return new \RecursiveArrayIterator([]); - } else { - throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e); - } - } - } - - /** - * Do nothing for non rewindable stream. - */ - public function rewind() - { - if (false === $this->isRewindable()) { - return; - } - - parent::rewind(); - } - - /** - * Checks if the stream is rewindable. - * - * @return bool true when the stream is rewindable, false otherwise - */ - public function isRewindable() - { - if (null !== $this->rewindable) { - return $this->rewindable; - } - - if (false !== $stream = @opendir($this->getPath())) { - $infos = stream_get_meta_data($stream); - closedir($stream); - - if ($infos['seekable']) { - return $this->rewindable = true; - } - } - - return $this->rewindable = false; - } -} diff --git a/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php b/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php deleted file mode 100644 index 2aeef67..0000000 --- a/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Comparator\NumberComparator; - -/** - * SizeRangeFilterIterator filters out files that are not in the given size range. - * - * @author Fabien Potencier - */ -class SizeRangeFilterIterator extends \FilterIterator -{ - private $comparators = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param NumberComparator[] $comparators An array of NumberComparator instances - */ - public function __construct(\Iterator $iterator, array $comparators) - { - $this->comparators = $comparators; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - $fileinfo = $this->current(); - if (!$fileinfo->isFile()) { - return true; - } - - $filesize = $fileinfo->getSize(); - foreach ($this->comparators as $compare) { - if (!$compare->test($filesize)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/symfony/finder/Iterator/SortableIterator.php b/vendor/symfony/finder/Iterator/SortableIterator.php deleted file mode 100644 index 2aca397..0000000 --- a/vendor/symfony/finder/Iterator/SortableIterator.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * SortableIterator applies a sort on a given Iterator. - * - * @author Fabien Potencier - */ -class SortableIterator implements \IteratorAggregate -{ - const SORT_BY_NONE = 0; - const SORT_BY_NAME = 1; - const SORT_BY_TYPE = 2; - const SORT_BY_ACCESSED_TIME = 3; - const SORT_BY_CHANGED_TIME = 4; - const SORT_BY_MODIFIED_TIME = 5; - const SORT_BY_NAME_NATURAL = 6; - - private $iterator; - private $sort; - - /** - * @param \Traversable $iterator The Iterator to filter - * @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback) - * - * @throws \InvalidArgumentException - */ - public function __construct(\Traversable $iterator, $sort, bool $reverseOrder = false) - { - $this->iterator = $iterator; - $order = $reverseOrder ? -1 : 1; - - if (self::SORT_BY_NAME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; - } elseif (self::SORT_BY_NAME_NATURAL === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; - } elseif (self::SORT_BY_TYPE === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - if ($a->isDir() && $b->isFile()) { - return -$order; - } elseif ($a->isFile() && $b->isDir()) { - return $order; - } - - return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; - } elseif (self::SORT_BY_ACCESSED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * ($a->getATime() - $b->getATime()); - }; - } elseif (self::SORT_BY_CHANGED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * ($a->getCTime() - $b->getCTime()); - }; - } elseif (self::SORT_BY_MODIFIED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * ($a->getMTime() - $b->getMTime()); - }; - } elseif (self::SORT_BY_NONE === $sort) { - $this->sort = $order; - } elseif (\is_callable($sort)) { - $this->sort = $reverseOrder ? static function (\SplFileInfo $a, \SplFileInfo $b) use ($sort) { return -$sort($a, $b); } : $sort; - } else { - throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.'); - } - } - - /** - * @return \Traversable - */ - public function getIterator() - { - if (1 === $this->sort) { - return $this->iterator; - } - - $array = iterator_to_array($this->iterator, true); - - if (-1 === $this->sort) { - $array = array_reverse($array); - } else { - uasort($array, $this->sort); - } - - return new \ArrayIterator($array); - } -} diff --git a/vendor/symfony/finder/LICENSE b/vendor/symfony/finder/LICENSE deleted file mode 100644 index 9e936ec..0000000 --- a/vendor/symfony/finder/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/finder/README.md b/vendor/symfony/finder/README.md deleted file mode 100644 index 0b19c75..0000000 --- a/vendor/symfony/finder/README.md +++ /dev/null @@ -1,14 +0,0 @@ -Finder Component -================ - -The Finder component finds files and directories via an intuitive fluent -interface. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/finder.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/finder/SplFileInfo.php b/vendor/symfony/finder/SplFileInfo.php deleted file mode 100644 index 65d7423..0000000 --- a/vendor/symfony/finder/SplFileInfo.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -/** - * Extends \SplFileInfo to support relative paths. - * - * @author Fabien Potencier - */ -class SplFileInfo extends \SplFileInfo -{ - private $relativePath; - private $relativePathname; - - /** - * @param string $file The file name - * @param string $relativePath The relative path - * @param string $relativePathname The relative path name - */ - public function __construct(string $file, string $relativePath, string $relativePathname) - { - parent::__construct($file); - $this->relativePath = $relativePath; - $this->relativePathname = $relativePathname; - } - - /** - * Returns the relative path. - * - * This path does not contain the file name. - * - * @return string the relative path - */ - public function getRelativePath() - { - return $this->relativePath; - } - - /** - * Returns the relative path name. - * - * This path contains the file name. - * - * @return string the relative path name - */ - public function getRelativePathname() - { - return $this->relativePathname; - } - - public function getFilenameWithoutExtension(): string - { - $filename = $this->getFilename(); - - return pathinfo($filename, PATHINFO_FILENAME); - } - - /** - * Returns the contents of the file. - * - * @return string the contents of the file - * - * @throws \RuntimeException - */ - public function getContents() - { - set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); - $content = file_get_contents($this->getPathname()); - restore_error_handler(); - if (false === $content) { - throw new \RuntimeException($error); - } - - return $content; - } -} diff --git a/vendor/symfony/finder/composer.json b/vendor/symfony/finder/composer.json deleted file mode 100644 index c1b0f32..0000000 --- a/vendor/symfony/finder/composer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "symfony/finder", - "type": "library", - "description": "Symfony Finder Component", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Finder\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - } -} diff --git a/vendor/symfony/options-resolver/CHANGELOG.md b/vendor/symfony/options-resolver/CHANGELOG.md deleted file mode 100644 index d996e30..0000000 --- a/vendor/symfony/options-resolver/CHANGELOG.md +++ /dev/null @@ -1,76 +0,0 @@ -CHANGELOG -========= - -5.1.0 ------ - - * added fluent configuration of options using `OptionResolver::define()` - * added `setInfo()` and `getInfo()` methods - * updated the signature of method `OptionsResolver::setDeprecated()` to `OptionsResolver::setDeprecation(string $option, string $package, string $version, $message)` - * deprecated `OptionsResolverIntrospector::getDeprecationMessage()`, use `OptionsResolverIntrospector::getDeprecation()` instead - -5.0.0 ------ - - * added argument `$triggerDeprecation` to `OptionsResolver::offsetGet()` - -4.3.0 ------ - - * added `OptionsResolver::addNormalizer` method - -4.2.0 ------ - - * added support for nested options definition - * added `setDeprecated` and `isDeprecated` methods - -3.4.0 ------ - - * added `OptionsResolverIntrospector` to inspect options definitions inside an `OptionsResolver` instance - * added array of types support in allowed types (e.g int[]) - -2.6.0 ------ - - * deprecated OptionsResolverInterface - * [BC BREAK] removed "array" type hint from OptionsResolverInterface methods - setRequired(), setAllowedValues(), addAllowedValues(), setAllowedTypes() and - addAllowedTypes() - * added OptionsResolver::setDefault() - * added OptionsResolver::hasDefault() - * added OptionsResolver::setNormalizer() - * added OptionsResolver::isRequired() - * added OptionsResolver::getRequiredOptions() - * added OptionsResolver::isMissing() - * added OptionsResolver::getMissingOptions() - * added OptionsResolver::setDefined() - * added OptionsResolver::isDefined() - * added OptionsResolver::getDefinedOptions() - * added OptionsResolver::remove() - * added OptionsResolver::clear() - * deprecated OptionsResolver::replaceDefaults() - * deprecated OptionsResolver::setOptional() in favor of setDefined() - * deprecated OptionsResolver::isKnown() in favor of isDefined() - * [BC BREAK] OptionsResolver::isRequired() returns true now if a required - option has a default value set - * [BC BREAK] merged Options into OptionsResolver and turned Options into an - interface - * deprecated Options::overload() (now in OptionsResolver) - * deprecated Options::set() (now in OptionsResolver) - * deprecated Options::get() (now in OptionsResolver) - * deprecated Options::has() (now in OptionsResolver) - * deprecated Options::replace() (now in OptionsResolver) - * [BC BREAK] Options::get() (now in OptionsResolver) can only be used within - lazy option/normalizer closures now - * [BC BREAK] removed Traversable interface from Options since using within - lazy option/normalizer closures resulted in exceptions - * [BC BREAK] removed Options::all() since using within lazy option/normalizer - closures resulted in exceptions - * [BC BREAK] OptionDefinitionException now extends LogicException instead of - RuntimeException - * [BC BREAK] normalizers are not executed anymore for unset options - * normalizers are executed after validating the options now - * [BC BREAK] an UndefinedOptionsException is now thrown instead of an - InvalidOptionsException when non-existing options are passed diff --git a/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php b/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php deleted file mode 100644 index 95909f3..0000000 --- a/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php +++ /dev/null @@ -1,120 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Debug; - -use Symfony\Component\OptionsResolver\Exception\NoConfigurationException; -use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException; -use Symfony\Component\OptionsResolver\OptionsResolver; - -/** - * @author Maxime Steinhausser - * - * @final - */ -class OptionsResolverIntrospector -{ - private $get; - - public function __construct(OptionsResolver $optionsResolver) - { - $this->get = \Closure::bind(function ($property, $option, $message) { - /** @var OptionsResolver $this */ - if (!$this->isDefined($option)) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist.', $option)); - } - - if (!\array_key_exists($option, $this->{$property})) { - throw new NoConfigurationException($message); - } - - return $this->{$property}[$option]; - }, $optionsResolver, $optionsResolver); - } - - /** - * @return mixed - * - * @throws NoConfigurationException on no configured value - */ - public function getDefault(string $option) - { - return ($this->get)('defaults', $option, sprintf('No default value was set for the "%s" option.', $option)); - } - - /** - * @return \Closure[] - * - * @throws NoConfigurationException on no configured closures - */ - public function getLazyClosures(string $option): array - { - return ($this->get)('lazy', $option, sprintf('No lazy closures were set for the "%s" option.', $option)); - } - - /** - * @return string[] - * - * @throws NoConfigurationException on no configured types - */ - public function getAllowedTypes(string $option): array - { - return ($this->get)('allowedTypes', $option, sprintf('No allowed types were set for the "%s" option.', $option)); - } - - /** - * @return mixed[] - * - * @throws NoConfigurationException on no configured values - */ - public function getAllowedValues(string $option): array - { - return ($this->get)('allowedValues', $option, sprintf('No allowed values were set for the "%s" option.', $option)); - } - - /** - * @throws NoConfigurationException on no configured normalizer - */ - public function getNormalizer(string $option): \Closure - { - return current($this->getNormalizers($option)); - } - - /** - * @throws NoConfigurationException when no normalizer is configured - */ - public function getNormalizers(string $option): array - { - return ($this->get)('normalizers', $option, sprintf('No normalizer was set for the "%s" option.', $option)); - } - - /** - * @return string|\Closure - * - * @throws NoConfigurationException on no configured deprecation - * - * @deprecated since Symfony 5.1, use "getDeprecation()" instead. - */ - public function getDeprecationMessage(string $option) - { - trigger_deprecation('symfony/options-resolver', '5.1', 'The "%s()" method is deprecated, use "getDeprecation()" instead.', __METHOD__); - - return $this->getDeprecation($option)['message']; - } - - /** - * @throws NoConfigurationException on no configured deprecation - */ - public function getDeprecation(string $option): array - { - return ($this->get)('deprecated', $option, sprintf('No deprecation was set for the "%s" option.', $option)); - } -} diff --git a/vendor/symfony/options-resolver/Exception/AccessException.php b/vendor/symfony/options-resolver/Exception/AccessException.php deleted file mode 100644 index c12b680..0000000 --- a/vendor/symfony/options-resolver/Exception/AccessException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Thrown when trying to read an option outside of or write it inside of - * {@link \Symfony\Component\OptionsResolver\Options::resolve()}. - * - * @author Bernhard Schussek - */ -class AccessException extends \LogicException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/options-resolver/Exception/ExceptionInterface.php b/vendor/symfony/options-resolver/Exception/ExceptionInterface.php deleted file mode 100644 index ea99d05..0000000 --- a/vendor/symfony/options-resolver/Exception/ExceptionInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Marker interface for all exceptions thrown by the OptionsResolver component. - * - * @author Bernhard Schussek - */ -interface ExceptionInterface extends \Throwable -{ -} diff --git a/vendor/symfony/options-resolver/Exception/InvalidArgumentException.php b/vendor/symfony/options-resolver/Exception/InvalidArgumentException.php deleted file mode 100644 index 6d421d6..0000000 --- a/vendor/symfony/options-resolver/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Thrown when an argument is invalid. - * - * @author Bernhard Schussek - */ -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/options-resolver/Exception/InvalidOptionsException.php b/vendor/symfony/options-resolver/Exception/InvalidOptionsException.php deleted file mode 100644 index 6fd4f12..0000000 --- a/vendor/symfony/options-resolver/Exception/InvalidOptionsException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Thrown when the value of an option does not match its validation rules. - * - * You should make sure a valid value is passed to the option. - * - * @author Bernhard Schussek - */ -class InvalidOptionsException extends InvalidArgumentException -{ -} diff --git a/vendor/symfony/options-resolver/Exception/MissingOptionsException.php b/vendor/symfony/options-resolver/Exception/MissingOptionsException.php deleted file mode 100644 index faa487f..0000000 --- a/vendor/symfony/options-resolver/Exception/MissingOptionsException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Exception thrown when a required option is missing. - * - * Add the option to the passed options array. - * - * @author Bernhard Schussek - */ -class MissingOptionsException extends InvalidArgumentException -{ -} diff --git a/vendor/symfony/options-resolver/Exception/NoConfigurationException.php b/vendor/symfony/options-resolver/Exception/NoConfigurationException.php deleted file mode 100644 index 6693ec1..0000000 --- a/vendor/symfony/options-resolver/Exception/NoConfigurationException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -use Symfony\Component\OptionsResolver\Debug\OptionsResolverIntrospector; - -/** - * Thrown when trying to introspect an option definition property - * for which no value was configured inside the OptionsResolver instance. - * - * @see OptionsResolverIntrospector - * - * @author Maxime Steinhausser - */ -class NoConfigurationException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/options-resolver/Exception/NoSuchOptionException.php b/vendor/symfony/options-resolver/Exception/NoSuchOptionException.php deleted file mode 100644 index 4c3280f..0000000 --- a/vendor/symfony/options-resolver/Exception/NoSuchOptionException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Thrown when trying to read an option that has no value set. - * - * When accessing optional options from within a lazy option or normalizer you should first - * check whether the optional option is set. You can do this with `isset($options['optional'])`. - * In contrast to the {@link UndefinedOptionsException}, this is a runtime exception that can - * occur when evaluating lazy options. - * - * @author Tobias Schultze - */ -class NoSuchOptionException extends \OutOfBoundsException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/options-resolver/Exception/OptionDefinitionException.php b/vendor/symfony/options-resolver/Exception/OptionDefinitionException.php deleted file mode 100644 index e8e339d..0000000 --- a/vendor/symfony/options-resolver/Exception/OptionDefinitionException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Thrown when two lazy options have a cyclic dependency. - * - * @author Bernhard Schussek - */ -class OptionDefinitionException extends \LogicException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/options-resolver/Exception/UndefinedOptionsException.php b/vendor/symfony/options-resolver/Exception/UndefinedOptionsException.php deleted file mode 100644 index 6ca3fce..0000000 --- a/vendor/symfony/options-resolver/Exception/UndefinedOptionsException.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Exception thrown when an undefined option is passed. - * - * You should remove the options in question from your code or define them - * beforehand. - * - * @author Bernhard Schussek - */ -class UndefinedOptionsException extends InvalidArgumentException -{ -} diff --git a/vendor/symfony/options-resolver/LICENSE b/vendor/symfony/options-resolver/LICENSE deleted file mode 100644 index 9e936ec..0000000 --- a/vendor/symfony/options-resolver/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/options-resolver/OptionConfigurator.php b/vendor/symfony/options-resolver/OptionConfigurator.php deleted file mode 100644 index 47f5bea..0000000 --- a/vendor/symfony/options-resolver/OptionConfigurator.php +++ /dev/null @@ -1,143 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver; - -use Symfony\Component\OptionsResolver\Exception\AccessException; - -final class OptionConfigurator -{ - private $name; - private $resolver; - - public function __construct(string $name, OptionsResolver $resolver) - { - $this->name = $name; - $this->resolver = $resolver; - $this->resolver->setDefined($name); - } - - /** - * Adds allowed types for this option. - * - * @param string ...$types One or more accepted types - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function allowedTypes(string ...$types): self - { - $this->resolver->setAllowedTypes($this->name, $types); - - return $this; - } - - /** - * Sets allowed values for this option. - * - * @param mixed ...$values One or more acceptable values/closures - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function allowedValues(...$values): self - { - $this->resolver->setAllowedValues($this->name, $values); - - return $this; - } - - /** - * Sets the default value for this option. - * - * @param mixed $value The default value of the option - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function default($value): self - { - $this->resolver->setDefault($this->name, $value); - - return $this; - } - - /** - * Defines an option configurator with the given name. - */ - public function define(string $option): self - { - return $this->resolver->define($option); - } - - /** - * Marks this option as deprecated. - * - * @param string $package The name of the composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string|\Closure $message The deprecation message to use - * - * @return $this - */ - public function deprecated(string $package, string $version, $message = 'The option "%name%" is deprecated.'): self - { - $this->resolver->setDeprecated($this->name, $package, $version, $message); - - return $this; - } - - /** - * Sets the normalizer for this option. - * - * @param \Closure $normalizer The normalizer - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function normalize(\Closure $normalizer): self - { - $this->resolver->setNormalizer($this->name, $normalizer); - - return $this; - } - - /** - * Marks this option as required. - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function required(): self - { - $this->resolver->setRequired($this->name); - - return $this; - } - - /** - * Sets an info message for an option. - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function info(string $info): self - { - $this->resolver->setInfo($this->name, $info); - - return $this; - } -} diff --git a/vendor/symfony/options-resolver/Options.php b/vendor/symfony/options-resolver/Options.php deleted file mode 100644 index d444ec4..0000000 --- a/vendor/symfony/options-resolver/Options.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver; - -/** - * Contains resolved option values. - * - * @author Bernhard Schussek - * @author Tobias Schultze - */ -interface Options extends \ArrayAccess, \Countable -{ -} diff --git a/vendor/symfony/options-resolver/OptionsResolver.php b/vendor/symfony/options-resolver/OptionsResolver.php deleted file mode 100644 index a7883d2..0000000 --- a/vendor/symfony/options-resolver/OptionsResolver.php +++ /dev/null @@ -1,1293 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver; - -use Symfony\Component\OptionsResolver\Exception\AccessException; -use Symfony\Component\OptionsResolver\Exception\InvalidArgumentException; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; -use Symfony\Component\OptionsResolver\Exception\MissingOptionsException; -use Symfony\Component\OptionsResolver\Exception\NoSuchOptionException; -use Symfony\Component\OptionsResolver\Exception\OptionDefinitionException; -use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException; - -/** - * Validates options and merges them with default values. - * - * @author Bernhard Schussek - * @author Tobias Schultze - */ -class OptionsResolver implements Options -{ - /** - * The names of all defined options. - */ - private $defined = []; - - /** - * The default option values. - */ - private $defaults = []; - - /** - * A list of closure for nested options. - * - * @var \Closure[][] - */ - private $nested = []; - - /** - * The names of required options. - */ - private $required = []; - - /** - * The resolved option values. - */ - private $resolved = []; - - /** - * A list of normalizer closures. - * - * @var \Closure[][] - */ - private $normalizers = []; - - /** - * A list of accepted values for each option. - */ - private $allowedValues = []; - - /** - * A list of accepted types for each option. - */ - private $allowedTypes = []; - - /** - * A list of info messages for each option. - */ - private $info = []; - - /** - * A list of closures for evaluating lazy options. - */ - private $lazy = []; - - /** - * A list of lazy options whose closure is currently being called. - * - * This list helps detecting circular dependencies between lazy options. - */ - private $calling = []; - - /** - * A list of deprecated options. - */ - private $deprecated = []; - - /** - * The list of options provided by the user. - */ - private $given = []; - - /** - * Whether the instance is locked for reading. - * - * Once locked, the options cannot be changed anymore. This is - * necessary in order to avoid inconsistencies during the resolving - * process. If any option is changed after being read, all evaluated - * lazy options that depend on this option would become invalid. - */ - private $locked = false; - - private $parentsOptions = []; - - private static $typeAliases = [ - 'boolean' => 'bool', - 'integer' => 'int', - 'double' => 'float', - ]; - - /** - * Sets the default value of a given option. - * - * If the default value should be set based on other options, you can pass - * a closure with the following signature: - * - * function (Options $options) { - * // ... - * } - * - * The closure will be evaluated when {@link resolve()} is called. The - * closure has access to the resolved values of other options through the - * passed {@link Options} instance: - * - * function (Options $options) { - * if (isset($options['port'])) { - * // ... - * } - * } - * - * If you want to access the previously set default value, add a second - * argument to the closure's signature: - * - * $options->setDefault('name', 'Default Name'); - * - * $options->setDefault('name', function (Options $options, $previousValue) { - * // 'Default Name' === $previousValue - * }); - * - * This is mostly useful if the configuration of the {@link Options} object - * is spread across different locations of your code, such as base and - * sub-classes. - * - * If you want to define nested options, you can pass a closure with the - * following signature: - * - * $options->setDefault('database', function (OptionsResolver $resolver) { - * $resolver->setDefined(['dbname', 'host', 'port', 'user', 'pass']); - * } - * - * To get access to the parent options, add a second argument to the closure's - * signature: - * - * function (OptionsResolver $resolver, Options $parent) { - * // 'default' === $parent['connection'] - * } - * - * @param string $option The name of the option - * @param mixed $value The default value of the option - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function setDefault(string $option, $value) - { - // Setting is not possible once resolving starts, because then lazy - // options could manipulate the state of the object, leading to - // inconsistent results. - if ($this->locked) { - throw new AccessException('Default values cannot be set from a lazy option or normalizer.'); - } - - // If an option is a closure that should be evaluated lazily, store it - // in the "lazy" property. - if ($value instanceof \Closure) { - $reflClosure = new \ReflectionFunction($value); - $params = $reflClosure->getParameters(); - - if (isset($params[0]) && Options::class === $this->getParameterClassName($params[0])) { - // Initialize the option if no previous value exists - if (!isset($this->defaults[$option])) { - $this->defaults[$option] = null; - } - - // Ignore previous lazy options if the closure has no second parameter - if (!isset($this->lazy[$option]) || !isset($params[1])) { - $this->lazy[$option] = []; - } - - // Store closure for later evaluation - $this->lazy[$option][] = $value; - $this->defined[$option] = true; - - // Make sure the option is processed and is not nested anymore - unset($this->resolved[$option], $this->nested[$option]); - - return $this; - } - - if (isset($params[0]) && null !== ($type = $params[0]->getType()) && self::class === $type->getName() && (!isset($params[1]) || (($type = $params[1]->getType()) instanceof \ReflectionNamedType && Options::class === $type->getName()))) { - // Store closure for later evaluation - $this->nested[$option][] = $value; - $this->defaults[$option] = []; - $this->defined[$option] = true; - - // Make sure the option is processed and is not lazy anymore - unset($this->resolved[$option], $this->lazy[$option]); - - return $this; - } - } - - // This option is not lazy nor nested anymore - unset($this->lazy[$option], $this->nested[$option]); - - // Yet undefined options can be marked as resolved, because we only need - // to resolve options with lazy closures, normalizers or validation - // rules, none of which can exist for undefined options - // If the option was resolved before, update the resolved value - if (!isset($this->defined[$option]) || \array_key_exists($option, $this->resolved)) { - $this->resolved[$option] = $value; - } - - $this->defaults[$option] = $value; - $this->defined[$option] = true; - - return $this; - } - - /** - * Sets a list of default values. - * - * @param array $defaults The default values to set - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function setDefaults(array $defaults) - { - foreach ($defaults as $option => $value) { - $this->setDefault($option, $value); - } - - return $this; - } - - /** - * Returns whether a default value is set for an option. - * - * Returns true if {@link setDefault()} was called for this option. - * An option is also considered set if it was set to null. - * - * @param string $option The option name - * - * @return bool Whether a default value is set - */ - public function hasDefault(string $option) - { - return \array_key_exists($option, $this->defaults); - } - - /** - * Marks one or more options as required. - * - * @param string|string[] $optionNames One or more option names - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function setRequired($optionNames) - { - if ($this->locked) { - throw new AccessException('Options cannot be made required from a lazy option or normalizer.'); - } - - foreach ((array) $optionNames as $option) { - $this->defined[$option] = true; - $this->required[$option] = true; - } - - return $this; - } - - /** - * Returns whether an option is required. - * - * An option is required if it was passed to {@link setRequired()}. - * - * @param string $option The name of the option - * - * @return bool Whether the option is required - */ - public function isRequired(string $option) - { - return isset($this->required[$option]); - } - - /** - * Returns the names of all required options. - * - * @return string[] The names of the required options - * - * @see isRequired() - */ - public function getRequiredOptions() - { - return array_keys($this->required); - } - - /** - * Returns whether an option is missing a default value. - * - * An option is missing if it was passed to {@link setRequired()}, but not - * to {@link setDefault()}. This option must be passed explicitly to - * {@link resolve()}, otherwise an exception will be thrown. - * - * @param string $option The name of the option - * - * @return bool Whether the option is missing - */ - public function isMissing(string $option) - { - return isset($this->required[$option]) && !\array_key_exists($option, $this->defaults); - } - - /** - * Returns the names of all options missing a default value. - * - * @return string[] The names of the missing options - * - * @see isMissing() - */ - public function getMissingOptions() - { - return array_keys(array_diff_key($this->required, $this->defaults)); - } - - /** - * Defines a valid option name. - * - * Defines an option name without setting a default value. The option will - * be accepted when passed to {@link resolve()}. When not passed, the - * option will not be included in the resolved options. - * - * @param string|string[] $optionNames One or more option names - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function setDefined($optionNames) - { - if ($this->locked) { - throw new AccessException('Options cannot be defined from a lazy option or normalizer.'); - } - - foreach ((array) $optionNames as $option) { - $this->defined[$option] = true; - } - - return $this; - } - - /** - * Returns whether an option is defined. - * - * Returns true for any option passed to {@link setDefault()}, - * {@link setRequired()} or {@link setDefined()}. - * - * @param string $option The option name - * - * @return bool Whether the option is defined - */ - public function isDefined(string $option) - { - return isset($this->defined[$option]); - } - - /** - * Returns the names of all defined options. - * - * @return string[] The names of the defined options - * - * @see isDefined() - */ - public function getDefinedOptions() - { - return array_keys($this->defined); - } - - public function isNested(string $option): bool - { - return isset($this->nested[$option]); - } - - /** - * Deprecates an option, allowed types or values. - * - * Instead of passing the message, you may also pass a closure with the - * following signature: - * - * function (Options $options, $value): string { - * // ... - * } - * - * The closure receives the value as argument and should return a string. - * Return an empty string to ignore the option deprecation. - * - * The closure is invoked when {@link resolve()} is called. The parameter - * passed to the closure is the value of the option after validating it - * and before normalizing it. - * - * @param string $package The name of the composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string|\Closure $message The deprecation message to use - */ - public function setDeprecated(string $option/*, string $package, string $version, $message = 'The option "%name%" is deprecated.' */): self - { - if ($this->locked) { - throw new AccessException('Options cannot be deprecated from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist, defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - $args = \func_get_args(); - - if (\func_num_args() < 3) { - trigger_deprecation('symfony/options-resolver', '5.1', 'The signature of method "%s()" requires 2 new arguments: "string $package, string $version", not defining them is deprecated.', __METHOD__); - - $message = $args[1] ?? 'The option "%name%" is deprecated.'; - $package = $version = ''; - } else { - $package = $args[1]; - $version = $args[2]; - $message = $args[3] ?? 'The option "%name%" is deprecated.'; - } - - if (!\is_string($message) && !$message instanceof \Closure) { - throw new InvalidArgumentException(sprintf('Invalid type for deprecation message argument, expected string or \Closure, but got "%s".', get_debug_type($message))); - } - - // ignore if empty string - if ('' === $message) { - return $this; - } - - $this->deprecated[$option] = [ - 'package' => $package, - 'version' => $version, - 'message' => $message, - ]; - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - public function isDeprecated(string $option): bool - { - return isset($this->deprecated[$option]); - } - - /** - * Sets the normalizer for an option. - * - * The normalizer should be a closure with the following signature: - * - * function (Options $options, $value) { - * // ... - * } - * - * The closure is invoked when {@link resolve()} is called. The closure - * has access to the resolved values of other options through the passed - * {@link Options} instance. - * - * The second parameter passed to the closure is the value of - * the option. - * - * The resolved option value is set to the return value of the closure. - * - * @param string $option The option name - * @param \Closure $normalizer The normalizer - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function setNormalizer(string $option, \Closure $normalizer) - { - if ($this->locked) { - throw new AccessException('Normalizers cannot be set from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - $this->normalizers[$option] = [$normalizer]; - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Adds a normalizer for an option. - * - * The normalizer should be a closure with the following signature: - * - * function (Options $options, $value): mixed { - * // ... - * } - * - * The closure is invoked when {@link resolve()} is called. The closure - * has access to the resolved values of other options through the passed - * {@link Options} instance. - * - * The second parameter passed to the closure is the value of - * the option. - * - * The resolved option value is set to the return value of the closure. - * - * @param string $option The option name - * @param \Closure $normalizer The normalizer - * @param bool $forcePrepend If set to true, prepend instead of appending - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function addNormalizer(string $option, \Closure $normalizer, bool $forcePrepend = false): self - { - if ($this->locked) { - throw new AccessException('Normalizers cannot be set from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - if ($forcePrepend) { - $this->normalizers[$option] = $this->normalizers[$option] ?? []; - array_unshift($this->normalizers[$option], $normalizer); - } else { - $this->normalizers[$option][] = $normalizer; - } - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Sets allowed values for an option. - * - * Instead of passing values, you may also pass a closures with the - * following signature: - * - * function ($value) { - * // return true or false - * } - * - * The closure receives the value as argument and should return true to - * accept the value and false to reject the value. - * - * @param string $option The option name - * @param mixed $allowedValues One or more acceptable values/closures - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function setAllowedValues(string $option, $allowedValues) - { - if ($this->locked) { - throw new AccessException('Allowed values cannot be set from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - $this->allowedValues[$option] = \is_array($allowedValues) ? $allowedValues : [$allowedValues]; - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Adds allowed values for an option. - * - * The values are merged with the allowed values defined previously. - * - * Instead of passing values, you may also pass a closures with the - * following signature: - * - * function ($value) { - * // return true or false - * } - * - * The closure receives the value as argument and should return true to - * accept the value and false to reject the value. - * - * @param string $option The option name - * @param mixed $allowedValues One or more acceptable values/closures - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function addAllowedValues(string $option, $allowedValues) - { - if ($this->locked) { - throw new AccessException('Allowed values cannot be added from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - if (!\is_array($allowedValues)) { - $allowedValues = [$allowedValues]; - } - - if (!isset($this->allowedValues[$option])) { - $this->allowedValues[$option] = $allowedValues; - } else { - $this->allowedValues[$option] = array_merge($this->allowedValues[$option], $allowedValues); - } - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Sets allowed types for an option. - * - * Any type for which a corresponding is_() function exists is - * acceptable. Additionally, fully-qualified class or interface names may - * be passed. - * - * @param string $option The option name - * @param string|string[] $allowedTypes One or more accepted types - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function setAllowedTypes(string $option, $allowedTypes) - { - if ($this->locked) { - throw new AccessException('Allowed types cannot be set from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - $this->allowedTypes[$option] = (array) $allowedTypes; - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Adds allowed types for an option. - * - * The types are merged with the allowed types defined previously. - * - * Any type for which a corresponding is_() function exists is - * acceptable. Additionally, fully-qualified class or interface names may - * be passed. - * - * @param string $option The option name - * @param string|string[] $allowedTypes One or more accepted types - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function addAllowedTypes(string $option, $allowedTypes) - { - if ($this->locked) { - throw new AccessException('Allowed types cannot be added from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - if (!isset($this->allowedTypes[$option])) { - $this->allowedTypes[$option] = (array) $allowedTypes; - } else { - $this->allowedTypes[$option] = array_merge($this->allowedTypes[$option], (array) $allowedTypes); - } - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Defines an option configurator with the given name. - */ - public function define(string $option): OptionConfigurator - { - if (isset($this->defined[$option])) { - throw new OptionDefinitionException(sprintf('The option "%s" is already defined.', $option)); - } - - return new OptionConfigurator($option, $this); - } - - /** - * Sets an info message for an option. - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function setInfo(string $option, string $info): self - { - if ($this->locked) { - throw new AccessException('The Info message cannot be set from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - $this->info[$option] = $info; - - return $this; - } - - /** - * Gets the info message for an option. - */ - public function getInfo(string $option): ?string - { - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - return $this->info[$option] ?? null; - } - - /** - * Removes the option with the given name. - * - * Undefined options are ignored. - * - * @param string|string[] $optionNames One or more option names - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function remove($optionNames) - { - if ($this->locked) { - throw new AccessException('Options cannot be removed from a lazy option or normalizer.'); - } - - foreach ((array) $optionNames as $option) { - unset($this->defined[$option], $this->defaults[$option], $this->required[$option], $this->resolved[$option]); - unset($this->lazy[$option], $this->normalizers[$option], $this->allowedTypes[$option], $this->allowedValues[$option], $this->info[$option]); - } - - return $this; - } - - /** - * Removes all options. - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function clear() - { - if ($this->locked) { - throw new AccessException('Options cannot be cleared from a lazy option or normalizer.'); - } - - $this->defined = []; - $this->defaults = []; - $this->nested = []; - $this->required = []; - $this->resolved = []; - $this->lazy = []; - $this->normalizers = []; - $this->allowedTypes = []; - $this->allowedValues = []; - $this->deprecated = []; - $this->info = []; - - return $this; - } - - /** - * Merges options with the default values stored in the container and - * validates them. - * - * Exceptions are thrown if: - * - * - Undefined options are passed; - * - Required options are missing; - * - Options have invalid types; - * - Options have invalid values. - * - * @param array $options A map of option names to values - * - * @return array The merged and validated options - * - * @throws UndefinedOptionsException If an option name is undefined - * @throws InvalidOptionsException If an option doesn't fulfill the - * specified validation rules - * @throws MissingOptionsException If a required option is missing - * @throws OptionDefinitionException If there is a cyclic dependency between - * lazy options and/or normalizers - * @throws NoSuchOptionException If a lazy option reads an unavailable option - * @throws AccessException If called from a lazy option or normalizer - */ - public function resolve(array $options = []) - { - if ($this->locked) { - throw new AccessException('Options cannot be resolved from a lazy option or normalizer.'); - } - - // Allow this method to be called multiple times - $clone = clone $this; - - // Make sure that no unknown options are passed - $diff = array_diff_key($options, $clone->defined); - - if (\count($diff) > 0) { - ksort($clone->defined); - ksort($diff); - - throw new UndefinedOptionsException(sprintf((\count($diff) > 1 ? 'The options "%s" do not exist.' : 'The option "%s" does not exist.').' Defined options are: "%s".', $this->formatOptions(array_keys($diff)), implode('", "', array_keys($clone->defined)))); - } - - // Override options set by the user - foreach ($options as $option => $value) { - $clone->given[$option] = true; - $clone->defaults[$option] = $value; - unset($clone->resolved[$option], $clone->lazy[$option]); - } - - // Check whether any required option is missing - $diff = array_diff_key($clone->required, $clone->defaults); - - if (\count($diff) > 0) { - ksort($diff); - - throw new MissingOptionsException(sprintf(\count($diff) > 1 ? 'The required options "%s" are missing.' : 'The required option "%s" is missing.', $this->formatOptions(array_keys($diff)))); - } - - // Lock the container - $clone->locked = true; - - // Now process the individual options. Use offsetGet(), which resolves - // the option itself and any options that the option depends on - foreach ($clone->defaults as $option => $_) { - $clone->offsetGet($option); - } - - return $clone->resolved; - } - - /** - * Returns the resolved value of an option. - * - * @param string $option The option name - * @param bool $triggerDeprecation Whether to trigger the deprecation or not (true by default) - * - * @return mixed The option value - * - * @throws AccessException If accessing this method outside of - * {@link resolve()} - * @throws NoSuchOptionException If the option is not set - * @throws InvalidOptionsException If the option doesn't fulfill the - * specified validation rules - * @throws OptionDefinitionException If there is a cyclic dependency between - * lazy options and/or normalizers - */ - public function offsetGet($option, bool $triggerDeprecation = true) - { - if (!$this->locked) { - throw new AccessException('Array access is only supported within closures of lazy options and normalizers.'); - } - - // Shortcut for resolved options - if (isset($this->resolved[$option]) || \array_key_exists($option, $this->resolved)) { - if ($triggerDeprecation && isset($this->deprecated[$option]) && (isset($this->given[$option]) || $this->calling) && \is_string($this->deprecated[$option]['message'])) { - trigger_deprecation($this->deprecated[$option]['package'], $this->deprecated[$option]['version'], strtr($this->deprecated[$option]['message'], ['%name%' => $option])); - } - - return $this->resolved[$option]; - } - - // Check whether the option is set at all - if (!isset($this->defaults[$option]) && !\array_key_exists($option, $this->defaults)) { - if (!isset($this->defined[$option])) { - throw new NoSuchOptionException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - throw new NoSuchOptionException(sprintf('The optional option "%s" has no value set. You should make sure it is set with "isset" before reading it.', $this->formatOptions([$option]))); - } - - $value = $this->defaults[$option]; - - // Resolve the option if it is a nested definition - if (isset($this->nested[$option])) { - // If the closure is already being called, we have a cyclic dependency - if (isset($this->calling[$option])) { - throw new OptionDefinitionException(sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling)))); - } - - if (!\is_array($value)) { - throw new InvalidOptionsException(sprintf('The nested option "%s" with value %s is expected to be of type array, but is of type "%s".', $this->formatOptions([$option]), $this->formatValue($value), get_debug_type($value))); - } - - // The following section must be protected from cyclic calls. - $this->calling[$option] = true; - try { - $resolver = new self(); - $resolver->parentsOptions = $this->parentsOptions; - $resolver->parentsOptions[] = $option; - foreach ($this->nested[$option] as $closure) { - $closure($resolver, $this); - } - $value = $resolver->resolve($value); - } finally { - unset($this->calling[$option]); - } - } - - // Resolve the option if the default value is lazily evaluated - if (isset($this->lazy[$option])) { - // If the closure is already being called, we have a cyclic - // dependency - if (isset($this->calling[$option])) { - throw new OptionDefinitionException(sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling)))); - } - - // The following section must be protected from cyclic - // calls. Set $calling for the current $option to detect a cyclic - // dependency - // BEGIN - $this->calling[$option] = true; - try { - foreach ($this->lazy[$option] as $closure) { - $value = $closure($this, $value); - } - } finally { - unset($this->calling[$option]); - } - // END - } - - // Validate the type of the resolved option - if (isset($this->allowedTypes[$option])) { - $valid = true; - $invalidTypes = []; - - foreach ($this->allowedTypes[$option] as $type) { - $type = self::$typeAliases[$type] ?? $type; - - if ($valid = $this->verifyTypes($type, $value, $invalidTypes)) { - break; - } - } - - if (!$valid) { - $fmtActualValue = $this->formatValue($value); - $fmtAllowedTypes = implode('" or "', $this->allowedTypes[$option]); - $fmtProvidedTypes = implode('|', array_keys($invalidTypes)); - $allowedContainsArrayType = \count(array_filter($this->allowedTypes[$option], static function ($item) { - return '[]' === substr(self::$typeAliases[$item] ?? $item, -2); - })) > 0; - - if (\is_array($value) && $allowedContainsArrayType) { - throw new InvalidOptionsException(sprintf('The option "%s" with value %s is expected to be of type "%s", but one of the elements is of type "%s".', $this->formatOptions([$option]), $fmtActualValue, $fmtAllowedTypes, $fmtProvidedTypes)); - } - - throw new InvalidOptionsException(sprintf('The option "%s" with value %s is expected to be of type "%s", but is of type "%s".', $this->formatOptions([$option]), $fmtActualValue, $fmtAllowedTypes, $fmtProvidedTypes)); - } - } - - // Validate the value of the resolved option - if (isset($this->allowedValues[$option])) { - $success = false; - $printableAllowedValues = []; - - foreach ($this->allowedValues[$option] as $allowedValue) { - if ($allowedValue instanceof \Closure) { - if ($allowedValue($value)) { - $success = true; - break; - } - - // Don't include closures in the exception message - continue; - } - - if ($value === $allowedValue) { - $success = true; - break; - } - - $printableAllowedValues[] = $allowedValue; - } - - if (!$success) { - $message = sprintf( - 'The option "%s" with value %s is invalid.', - $option, - $this->formatValue($value) - ); - - if (\count($printableAllowedValues) > 0) { - $message .= sprintf( - ' Accepted values are: %s.', - $this->formatValues($printableAllowedValues) - ); - } - - if (isset($this->info[$option])) { - $message .= sprintf(' Info: %s.', $this->info[$option]); - } - - throw new InvalidOptionsException($message); - } - } - - // Check whether the option is deprecated - // and it is provided by the user or is being called from a lazy evaluation - if ($triggerDeprecation && isset($this->deprecated[$option]) && (isset($this->given[$option]) || ($this->calling && \is_string($this->deprecated[$option])))) { - $deprecation = $this->deprecated[$option]; - $message = $this->deprecated[$option]['message']; - - if ($message instanceof \Closure) { - // If the closure is already being called, we have a cyclic dependency - if (isset($this->calling[$option])) { - throw new OptionDefinitionException(sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling)))); - } - - $this->calling[$option] = true; - try { - if (!\is_string($message = $message($this, $value))) { - throw new InvalidOptionsException(sprintf('Invalid type for deprecation message, expected string but got "%s", return an empty string to ignore.', get_debug_type($message))); - } - } finally { - unset($this->calling[$option]); - } - } - - if ('' !== $message) { - trigger_deprecation($deprecation['package'], $deprecation['version'], strtr($message, ['%name%' => $option])); - } - } - - // Normalize the validated option - if (isset($this->normalizers[$option])) { - // If the closure is already being called, we have a cyclic - // dependency - if (isset($this->calling[$option])) { - throw new OptionDefinitionException(sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling)))); - } - - // The following section must be protected from cyclic - // calls. Set $calling for the current $option to detect a cyclic - // dependency - // BEGIN - $this->calling[$option] = true; - try { - foreach ($this->normalizers[$option] as $normalizer) { - $value = $normalizer($this, $value); - } - } finally { - unset($this->calling[$option]); - } - // END - } - - // Mark as resolved - $this->resolved[$option] = $value; - - return $value; - } - - private function verifyTypes(string $type, $value, array &$invalidTypes, int $level = 0): bool - { - if (\is_array($value) && '[]' === substr($type, -2)) { - $type = substr($type, 0, -2); - $valid = true; - - foreach ($value as $val) { - if (!$this->verifyTypes($type, $val, $invalidTypes, $level + 1)) { - $valid = false; - } - } - - return $valid; - } - - if (('null' === $type && null === $value) || (\function_exists($func = 'is_'.$type) && $func($value)) || $value instanceof $type) { - return true; - } - - if (!$invalidTypes || $level > 0) { - $invalidTypes[get_debug_type($value)] = true; - } - - return false; - } - - /** - * Returns whether a resolved option with the given name exists. - * - * @param string $option The option name - * - * @return bool Whether the option is set - * - * @throws AccessException If accessing this method outside of {@link resolve()} - * - * @see \ArrayAccess::offsetExists() - */ - public function offsetExists($option) - { - if (!$this->locked) { - throw new AccessException('Array access is only supported within closures of lazy options and normalizers.'); - } - - return \array_key_exists($option, $this->defaults); - } - - /** - * Not supported. - * - * @throws AccessException - */ - public function offsetSet($option, $value) - { - throw new AccessException('Setting options via array access is not supported. Use setDefault() instead.'); - } - - /** - * Not supported. - * - * @throws AccessException - */ - public function offsetUnset($option) - { - throw new AccessException('Removing options via array access is not supported. Use remove() instead.'); - } - - /** - * Returns the number of set options. - * - * This may be only a subset of the defined options. - * - * @return int Number of options - * - * @throws AccessException If accessing this method outside of {@link resolve()} - * - * @see \Countable::count() - */ - public function count() - { - if (!$this->locked) { - throw new AccessException('Counting is only supported within closures of lazy options and normalizers.'); - } - - return \count($this->defaults); - } - - /** - * Returns a string representation of the value. - * - * This method returns the equivalent PHP tokens for most scalar types - * (i.e. "false" for false, "1" for 1 etc.). Strings are always wrapped - * in double quotes ("). - * - * @param mixed $value The value to format as string - */ - private function formatValue($value): string - { - if (\is_object($value)) { - return \get_class($value); - } - - if (\is_array($value)) { - return 'array'; - } - - if (\is_string($value)) { - return '"'.$value.'"'; - } - - if (\is_resource($value)) { - return 'resource'; - } - - if (null === $value) { - return 'null'; - } - - if (false === $value) { - return 'false'; - } - - if (true === $value) { - return 'true'; - } - - return (string) $value; - } - - /** - * Returns a string representation of a list of values. - * - * Each of the values is converted to a string using - * {@link formatValue()}. The values are then concatenated with commas. - * - * @see formatValue() - */ - private function formatValues(array $values): string - { - foreach ($values as $key => $value) { - $values[$key] = $this->formatValue($value); - } - - return implode(', ', $values); - } - - private function formatOptions(array $options): string - { - if ($this->parentsOptions) { - $prefix = array_shift($this->parentsOptions); - if ($this->parentsOptions) { - $prefix .= sprintf('[%s]', implode('][', $this->parentsOptions)); - } - - $options = array_map(static function (string $option) use ($prefix): string { - return sprintf('%s[%s]', $prefix, $option); - }, $options); - } - - return implode('", "', $options); - } - - private function getParameterClassName(\ReflectionParameter $parameter): ?string - { - if (!($type = $parameter->getType()) instanceof \ReflectionNamedType || $type->isBuiltin()) { - return null; - } - - return $type->getName(); - } -} diff --git a/vendor/symfony/options-resolver/README.md b/vendor/symfony/options-resolver/README.md deleted file mode 100644 index 245e69b..0000000 --- a/vendor/symfony/options-resolver/README.md +++ /dev/null @@ -1,15 +0,0 @@ -OptionsResolver Component -========================= - -The OptionsResolver component is `array_replace` on steroids. It allows you to -create an options system with required options, defaults, validation (type, -value), normalization and more. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/options_resolver.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/options-resolver/composer.json b/vendor/symfony/options-resolver/composer.json deleted file mode 100644 index 3d098cf..0000000 --- a/vendor/symfony/options-resolver/composer.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "symfony/options-resolver", - "type": "library", - "description": "Symfony OptionsResolver Component", - "keywords": ["options", "config", "configuration"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\OptionsResolver\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - } -} diff --git a/vendor/symfony/polyfill-ctype/Ctype.php b/vendor/symfony/polyfill-ctype/Ctype.php deleted file mode 100644 index 58414dc..0000000 --- a/vendor/symfony/polyfill-ctype/Ctype.php +++ /dev/null @@ -1,227 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Ctype; - -/** - * Ctype implementation through regex. - * - * @internal - * - * @author Gert de Pagter - */ -final class Ctype -{ - /** - * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. - * - * @see https://php.net/ctype-alnum - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_alnum($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); - } - - /** - * Returns TRUE if every character in text is a letter, FALSE otherwise. - * - * @see https://php.net/ctype-alpha - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_alpha($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); - } - - /** - * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. - * - * @see https://php.net/ctype-cntrl - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_cntrl($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); - } - - /** - * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. - * - * @see https://php.net/ctype-digit - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_digit($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); - } - - /** - * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. - * - * @see https://php.net/ctype-graph - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_graph($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); - } - - /** - * Returns TRUE if every character in text is a lowercase letter. - * - * @see https://php.net/ctype-lower - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_lower($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); - } - - /** - * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. - * - * @see https://php.net/ctype-print - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_print($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); - } - - /** - * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. - * - * @see https://php.net/ctype-punct - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_punct($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); - } - - /** - * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. - * - * @see https://php.net/ctype-space - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_space($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); - } - - /** - * Returns TRUE if every character in text is an uppercase letter. - * - * @see https://php.net/ctype-upper - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_upper($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); - } - - /** - * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. - * - * @see https://php.net/ctype-xdigit - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_xdigit($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); - } - - /** - * Converts integers to their char versions according to normal ctype behaviour, if needed. - * - * If an integer between -128 and 255 inclusive is provided, - * it is interpreted as the ASCII value of a single character - * (negative values have 256 added in order to allow characters in the Extended ASCII range). - * Any other integer is interpreted as a string containing the decimal digits of the integer. - * - * @param string|int $int - * - * @return mixed - */ - private static function convert_int_to_char_for_ctype($int) - { - if (!\is_int($int)) { - return $int; - } - - if ($int < -128 || $int > 255) { - return (string) $int; - } - - if ($int < 0) { - $int += 256; - } - - return \chr($int); - } -} diff --git a/vendor/symfony/polyfill-ctype/LICENSE b/vendor/symfony/polyfill-ctype/LICENSE deleted file mode 100644 index 3f853aa..0000000 --- a/vendor/symfony/polyfill-ctype/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2018-2019 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/polyfill-ctype/README.md b/vendor/symfony/polyfill-ctype/README.md deleted file mode 100644 index 8add1ab..0000000 --- a/vendor/symfony/polyfill-ctype/README.md +++ /dev/null @@ -1,12 +0,0 @@ -Symfony Polyfill / Ctype -======================== - -This component provides `ctype_*` functions to users who run php versions without the ctype extension. - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-ctype/bootstrap.php b/vendor/symfony/polyfill-ctype/bootstrap.php deleted file mode 100644 index 8d6fc4b..0000000 --- a/vendor/symfony/polyfill-ctype/bootstrap.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Ctype as p; - -if (!function_exists('ctype_alnum')) { - function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } -} -if (!function_exists('ctype_alpha')) { - function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } -} -if (!function_exists('ctype_cntrl')) { - function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } -} -if (!function_exists('ctype_digit')) { - function ctype_digit($text) { return p\Ctype::ctype_digit($text); } -} -if (!function_exists('ctype_graph')) { - function ctype_graph($text) { return p\Ctype::ctype_graph($text); } -} -if (!function_exists('ctype_lower')) { - function ctype_lower($text) { return p\Ctype::ctype_lower($text); } -} -if (!function_exists('ctype_print')) { - function ctype_print($text) { return p\Ctype::ctype_print($text); } -} -if (!function_exists('ctype_punct')) { - function ctype_punct($text) { return p\Ctype::ctype_punct($text); } -} -if (!function_exists('ctype_space')) { - function ctype_space($text) { return p\Ctype::ctype_space($text); } -} -if (!function_exists('ctype_upper')) { - function ctype_upper($text) { return p\Ctype::ctype_upper($text); } -} -if (!function_exists('ctype_xdigit')) { - function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } -} diff --git a/vendor/symfony/polyfill-ctype/composer.json b/vendor/symfony/polyfill-ctype/composer.json deleted file mode 100644 index 90108c6..0000000 --- a/vendor/symfony/polyfill-ctype/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "symfony/polyfill-ctype", - "type": "library", - "description": "Symfony polyfill for ctype functions", - "keywords": ["polyfill", "compatibility", "portable", "ctype"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=5.3.3" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" }, - "files": [ "bootstrap.php" ] - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/symfony/polyfill-mbstring/LICENSE b/vendor/symfony/polyfill-mbstring/LICENSE deleted file mode 100644 index 4cd8bdd..0000000 --- a/vendor/symfony/polyfill-mbstring/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015-2019 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php deleted file mode 100644 index 15503bc..0000000 --- a/vendor/symfony/polyfill-mbstring/Mbstring.php +++ /dev/null @@ -1,847 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Mbstring; - -/** - * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. - * - * Implemented: - * - mb_chr - Returns a specific character from its Unicode code point - * - mb_convert_encoding - Convert character encoding - * - mb_convert_variables - Convert character code in variable(s) - * - mb_decode_mimeheader - Decode string in MIME header field - * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED - * - mb_decode_numericentity - Decode HTML numeric string reference to character - * - mb_encode_numericentity - Encode character to HTML numeric string reference - * - mb_convert_case - Perform case folding on a string - * - mb_detect_encoding - Detect character encoding - * - mb_get_info - Get internal settings of mbstring - * - mb_http_input - Detect HTTP input character encoding - * - mb_http_output - Set/Get HTTP output character encoding - * - mb_internal_encoding - Set/Get internal character encoding - * - mb_list_encodings - Returns an array of all supported encodings - * - mb_ord - Returns the Unicode code point of a character - * - mb_output_handler - Callback function converts character encoding in output buffer - * - mb_scrub - Replaces ill-formed byte sequences with substitute characters - * - mb_strlen - Get string length - * - mb_strpos - Find position of first occurrence of string in a string - * - mb_strrpos - Find position of last occurrence of a string in a string - * - mb_str_split - Convert a string to an array - * - mb_strtolower - Make a string lowercase - * - mb_strtoupper - Make a string uppercase - * - mb_substitute_character - Set/Get substitution character - * - mb_substr - Get part of string - * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive - * - mb_stristr - Finds first occurrence of a string within another, case insensitive - * - mb_strrchr - Finds the last occurrence of a character in a string within another - * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive - * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive - * - mb_strstr - Finds first occurrence of a string within another - * - mb_strwidth - Return width of string - * - mb_substr_count - Count the number of substring occurrences - * - * Not implemented: - * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) - * - mb_ereg_* - Regular expression with multibyte support - * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable - * - mb_preferred_mime_name - Get MIME charset string - * - mb_regex_encoding - Returns current encoding for multibyte regex as string - * - mb_regex_set_options - Set/Get the default options for mbregex functions - * - mb_send_mail - Send encoded mail - * - mb_split - Split multibyte string using regular expression - * - mb_strcut - Get part of string - * - mb_strimwidth - Get truncated string with specified width - * - * @author Nicolas Grekas - * - * @internal - */ -final class Mbstring -{ - const MB_CASE_FOLD = PHP_INT_MAX; - - private static $encodingList = array('ASCII', 'UTF-8'); - private static $language = 'neutral'; - private static $internalEncoding = 'UTF-8'; - private static $caseFold = array( - array('µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"), - array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'), - ); - - public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) - { - if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) { - $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); - } else { - $fromEncoding = self::getEncoding($fromEncoding); - } - - $toEncoding = self::getEncoding($toEncoding); - - if ('BASE64' === $fromEncoding) { - $s = base64_decode($s); - $fromEncoding = $toEncoding; - } - - if ('BASE64' === $toEncoding) { - return base64_encode($s); - } - - if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { - if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { - $fromEncoding = 'Windows-1252'; - } - if ('UTF-8' !== $fromEncoding) { - $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); - } - - return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s); - } - - if ('HTML-ENTITIES' === $fromEncoding) { - $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8'); - $fromEncoding = 'UTF-8'; - } - - return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); - } - - public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) - { - $vars = array(&$a, &$b, &$c, &$d, &$e, &$f); - - $ok = true; - array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { - if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { - $ok = false; - } - }); - - return $ok ? $fromEncoding : false; - } - - public static function mb_decode_mimeheader($s) - { - return iconv_mime_decode($s, 2, self::$internalEncoding); - } - - public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) - { - trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING); - } - - public static function mb_decode_numericentity($s, $convmap, $encoding = null) - { - if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { - trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING); - - return null; - } - - if (!\is_array($convmap) || !$convmap) { - return false; - } - - if (null !== $encoding && !\is_scalar($encoding)) { - trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING); - - return ''; // Instead of null (cf. mb_encode_numericentity). - } - - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - $cnt = floor(\count($convmap) / 4) * 4; - - for ($i = 0; $i < $cnt; $i += 4) { - // collector_decode_htmlnumericentity ignores $convmap[$i + 3] - $convmap[$i] += $convmap[$i + 2]; - $convmap[$i + 1] += $convmap[$i + 2]; - } - - $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { - $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; - for ($i = 0; $i < $cnt; $i += 4) { - if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { - return Mbstring::mb_chr($c - $convmap[$i + 2]); - } - } - - return $m[0]; - }, $s); - - if (null === $encoding) { - return $s; - } - - return iconv('UTF-8', $encoding.'//IGNORE', $s); - } - - public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) - { - if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { - trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING); - - return null; - } - - if (!\is_array($convmap) || !$convmap) { - return false; - } - - if (null !== $encoding && !\is_scalar($encoding)) { - trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING); - - return null; // Instead of '' (cf. mb_decode_numericentity). - } - - if (null !== $is_hex && !\is_scalar($is_hex)) { - trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', E_USER_WARNING); - - return null; - } - - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); - - $cnt = floor(\count($convmap) / 4) * 4; - $i = 0; - $len = \strlen($s); - $result = ''; - - while ($i < $len) { - $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; - $uchr = substr($s, $i, $ulen); - $i += $ulen; - $c = self::mb_ord($uchr); - - for ($j = 0; $j < $cnt; $j += 4) { - if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { - $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; - $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; - continue 2; - } - } - $result .= $uchr; - } - - if (null === $encoding) { - return $result; - } - - return iconv('UTF-8', $encoding.'//IGNORE', $result); - } - - public static function mb_convert_case($s, $mode, $encoding = null) - { - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - if (MB_CASE_TITLE == $mode) { - static $titleRegexp = null; - if (null === $titleRegexp) { - $titleRegexp = self::getData('titleCaseRegexp'); - } - $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s); - } else { - if (MB_CASE_UPPER == $mode) { - static $upper = null; - if (null === $upper) { - $upper = self::getData('upperCase'); - } - $map = $upper; - } else { - if (self::MB_CASE_FOLD === $mode) { - $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s); - } - - static $lower = null; - if (null === $lower) { - $lower = self::getData('lowerCase'); - } - $map = $lower; - } - - static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); - - $i = 0; - $len = \strlen($s); - - while ($i < $len) { - $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; - $uchr = substr($s, $i, $ulen); - $i += $ulen; - - if (isset($map[$uchr])) { - $uchr = $map[$uchr]; - $nlen = \strlen($uchr); - - if ($nlen == $ulen) { - $nlen = $i; - do { - $s[--$nlen] = $uchr[--$ulen]; - } while ($ulen); - } else { - $s = substr_replace($s, $uchr, $i - $ulen, $ulen); - $len += $nlen - $ulen; - $i += $nlen - $ulen; - } - } - } - } - - if (null === $encoding) { - return $s; - } - - return iconv('UTF-8', $encoding.'//IGNORE', $s); - } - - public static function mb_internal_encoding($encoding = null) - { - if (null === $encoding) { - return self::$internalEncoding; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) { - self::$internalEncoding = $encoding; - - return true; - } - - return false; - } - - public static function mb_language($lang = null) - { - if (null === $lang) { - return self::$language; - } - - switch ($lang = strtolower($lang)) { - case 'uni': - case 'neutral': - self::$language = $lang; - - return true; - } - - return false; - } - - public static function mb_list_encodings() - { - return array('UTF-8'); - } - - public static function mb_encoding_aliases($encoding) - { - switch (strtoupper($encoding)) { - case 'UTF8': - case 'UTF-8': - return array('utf8'); - } - - return false; - } - - public static function mb_check_encoding($var = null, $encoding = null) - { - if (null === $encoding) { - if (null === $var) { - return false; - } - $encoding = self::$internalEncoding; - } - - return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var); - } - - public static function mb_detect_encoding($str, $encodingList = null, $strict = false) - { - if (null === $encodingList) { - $encodingList = self::$encodingList; - } else { - if (!\is_array($encodingList)) { - $encodingList = array_map('trim', explode(',', $encodingList)); - } - $encodingList = array_map('strtoupper', $encodingList); - } - - foreach ($encodingList as $enc) { - switch ($enc) { - case 'ASCII': - if (!preg_match('/[\x80-\xFF]/', $str)) { - return $enc; - } - break; - - case 'UTF8': - case 'UTF-8': - if (preg_match('//u', $str)) { - return 'UTF-8'; - } - break; - - default: - if (0 === strncmp($enc, 'ISO-8859-', 9)) { - return $enc; - } - } - } - - return false; - } - - public static function mb_detect_order($encodingList = null) - { - if (null === $encodingList) { - return self::$encodingList; - } - - if (!\is_array($encodingList)) { - $encodingList = array_map('trim', explode(',', $encodingList)); - } - $encodingList = array_map('strtoupper', $encodingList); - - foreach ($encodingList as $enc) { - switch ($enc) { - default: - if (strncmp($enc, 'ISO-8859-', 9)) { - return false; - } - // no break - case 'ASCII': - case 'UTF8': - case 'UTF-8': - } - } - - self::$encodingList = $encodingList; - - return true; - } - - public static function mb_strlen($s, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return \strlen($s); - } - - return @iconv_strlen($s, $encoding); - } - - public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return strpos($haystack, $needle, $offset); - } - - $needle = (string) $needle; - if ('' === $needle) { - trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING); - - return false; - } - - return iconv_strpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return strrpos($haystack, $needle, $offset); - } - - if ($offset != (int) $offset) { - $offset = 0; - } elseif ($offset = (int) $offset) { - if ($offset < 0) { - if (0 > $offset += self::mb_strlen($needle)) { - $haystack = self::mb_substr($haystack, 0, $offset, $encoding); - } - $offset = 0; - } else { - $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); - } - } - - $pos = iconv_strrpos($haystack, $needle, $encoding); - - return false !== $pos ? $offset + $pos : false; - } - - public static function mb_str_split($string, $split_length = 1, $encoding = null) - { - if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) { - trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', E_USER_WARNING); - - return null; - } - - if (1 > $split_length = (int) $split_length) { - trigger_error('The length of each segment must be greater than zero', E_USER_WARNING); - - return false; - } - - if (null === $encoding) { - $encoding = mb_internal_encoding(); - } - - if ('UTF-8' === $encoding = self::getEncoding($encoding)) { - $rx = '/('; - while (65535 < $split_length) { - $rx .= '.{65535}'; - $split_length -= 65535; - } - $rx .= '.{'.$split_length.'})/us'; - - return preg_split($rx, $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - } - - $result = array(); - $length = mb_strlen($string, $encoding); - - for ($i = 0; $i < $length; $i += $split_length) { - $result[] = mb_substr($string, $i, $split_length, $encoding); - } - - return $result; - } - - public static function mb_strtolower($s, $encoding = null) - { - return self::mb_convert_case($s, MB_CASE_LOWER, $encoding); - } - - public static function mb_strtoupper($s, $encoding = null) - { - return self::mb_convert_case($s, MB_CASE_UPPER, $encoding); - } - - public static function mb_substitute_character($c = null) - { - if (0 === strcasecmp($c, 'none')) { - return true; - } - - return null !== $c ? false : 'none'; - } - - public static function mb_substr($s, $start, $length = null, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return (string) substr($s, $start, null === $length ? 2147483647 : $length); - } - - if ($start < 0) { - $start = iconv_strlen($s, $encoding) + $start; - if ($start < 0) { - $start = 0; - } - } - - if (null === $length) { - $length = 2147483647; - } elseif ($length < 0) { - $length = iconv_strlen($s, $encoding) + $length - $start; - if ($length < 0) { - return ''; - } - } - - return (string) iconv_substr($s, $start, $length, $encoding); - } - - public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) - { - $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); - $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); - - return self::mb_strpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) - { - $pos = self::mb_stripos($haystack, $needle, 0, $encoding); - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return strrchr($haystack, $needle, $part); - } - $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = iconv_strrpos($haystack, $needle, $encoding); - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) - { - $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = self::mb_strripos($haystack, $needle, $encoding); - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) - { - $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); - $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); - - return self::mb_strrpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) - { - $pos = strpos($haystack, $needle); - if (false === $pos) { - return false; - } - if ($part) { - return substr($haystack, 0, $pos); - } - - return substr($haystack, $pos); - } - - public static function mb_get_info($type = 'all') - { - $info = array( - 'internal_encoding' => self::$internalEncoding, - 'http_output' => 'pass', - 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', - 'func_overload' => 0, - 'func_overload_list' => 'no overload', - 'mail_charset' => 'UTF-8', - 'mail_header_encoding' => 'BASE64', - 'mail_body_encoding' => 'BASE64', - 'illegal_chars' => 0, - 'encoding_translation' => 'Off', - 'language' => self::$language, - 'detect_order' => self::$encodingList, - 'substitute_character' => 'none', - 'strict_detection' => 'Off', - ); - - if ('all' === $type) { - return $info; - } - if (isset($info[$type])) { - return $info[$type]; - } - - return false; - } - - public static function mb_http_input($type = '') - { - return false; - } - - public static function mb_http_output($encoding = null) - { - return null !== $encoding ? 'pass' === $encoding : 'pass'; - } - - public static function mb_strwidth($s, $encoding = null) - { - $encoding = self::getEncoding($encoding); - - if ('UTF-8' !== $encoding) { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); - - return ($wide << 1) + iconv_strlen($s, 'UTF-8'); - } - - public static function mb_substr_count($haystack, $needle, $encoding = null) - { - return substr_count($haystack, $needle); - } - - public static function mb_output_handler($contents, $status) - { - return $contents; - } - - public static function mb_chr($code, $encoding = null) - { - if (0x80 > $code %= 0x200000) { - $s = \chr($code); - } elseif (0x800 > $code) { - $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); - } elseif (0x10000 > $code) { - $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } else { - $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } - - if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { - $s = mb_convert_encoding($s, $encoding, 'UTF-8'); - } - - return $s; - } - - public static function mb_ord($s, $encoding = null) - { - if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { - $s = mb_convert_encoding($s, 'UTF-8', $encoding); - } - - if (1 === \strlen($s)) { - return \ord($s); - } - - $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; - if (0xF0 <= $code) { - return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; - } - if (0xE0 <= $code) { - return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; - } - if (0xC0 <= $code) { - return (($code - 0xC0) << 6) + $s[2] - 0x80; - } - - return $code; - } - - private static function getSubpart($pos, $part, $haystack, $encoding) - { - if (false === $pos) { - return false; - } - if ($part) { - return self::mb_substr($haystack, 0, $pos, $encoding); - } - - return self::mb_substr($haystack, $pos, null, $encoding); - } - - private static function html_encoding_callback(array $m) - { - $i = 1; - $entities = ''; - $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8')); - - while (isset($m[$i])) { - if (0x80 > $m[$i]) { - $entities .= \chr($m[$i++]); - continue; - } - if (0xF0 <= $m[$i]) { - $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; - } elseif (0xE0 <= $m[$i]) { - $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; - } else { - $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; - } - - $entities .= '&#'.$c.';'; - } - - return $entities; - } - - private static function title_case(array $s) - { - return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8'); - } - - private static function getData($file) - { - if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { - return require $file; - } - - return false; - } - - private static function getEncoding($encoding) - { - if (null === $encoding) { - return self::$internalEncoding; - } - - if ('UTF-8' === $encoding) { - return 'UTF-8'; - } - - $encoding = strtoupper($encoding); - - if ('8BIT' === $encoding || 'BINARY' === $encoding) { - return 'CP850'; - } - - if ('UTF8' === $encoding) { - return 'UTF-8'; - } - - return $encoding; - } -} diff --git a/vendor/symfony/polyfill-mbstring/README.md b/vendor/symfony/polyfill-mbstring/README.md deleted file mode 100644 index 4efb599..0000000 --- a/vendor/symfony/polyfill-mbstring/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Symfony Polyfill / Mbstring -=========================== - -This component provides a partial, native PHP implementation for the -[Mbstring](https://php.net/mbstring) extension. - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php deleted file mode 100644 index a22eca5..0000000 --- a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +++ /dev/null @@ -1,1397 +0,0 @@ - 'a', - 'B' => 'b', - 'C' => 'c', - 'D' => 'd', - 'E' => 'e', - 'F' => 'f', - 'G' => 'g', - 'H' => 'h', - 'I' => 'i', - 'J' => 'j', - 'K' => 'k', - 'L' => 'l', - 'M' => 'm', - 'N' => 'n', - 'O' => 'o', - 'P' => 'p', - 'Q' => 'q', - 'R' => 'r', - 'S' => 's', - 'T' => 't', - 'U' => 'u', - 'V' => 'v', - 'W' => 'w', - 'X' => 'x', - 'Y' => 'y', - 'Z' => 'z', - 'À' => 'à', - 'Á' => 'á', - 'Â' => 'â', - 'Ã' => 'ã', - 'Ä' => 'ä', - 'Å' => 'å', - 'Æ' => 'æ', - 'Ç' => 'ç', - 'È' => 'è', - 'É' => 'é', - 'Ê' => 'ê', - 'Ë' => 'ë', - 'Ì' => 'ì', - 'Í' => 'í', - 'Î' => 'î', - 'Ï' => 'ï', - 'Ð' => 'ð', - 'Ñ' => 'ñ', - 'Ò' => 'ò', - 'Ó' => 'ó', - 'Ô' => 'ô', - 'Õ' => 'õ', - 'Ö' => 'ö', - 'Ø' => 'ø', - 'Ù' => 'ù', - 'Ú' => 'ú', - 'Û' => 'û', - 'Ü' => 'ü', - 'Ý' => 'ý', - 'Þ' => 'þ', - 'Ā' => 'ā', - 'Ă' => 'ă', - 'Ą' => 'ą', - 'Ć' => 'ć', - 'Ĉ' => 'ĉ', - 'Ċ' => 'ċ', - 'Č' => 'č', - 'Ď' => 'ď', - 'Đ' => 'đ', - 'Ē' => 'ē', - 'Ĕ' => 'ĕ', - 'Ė' => 'ė', - 'Ę' => 'ę', - 'Ě' => 'ě', - 'Ĝ' => 'ĝ', - 'Ğ' => 'ğ', - 'Ġ' => 'ġ', - 'Ģ' => 'ģ', - 'Ĥ' => 'ĥ', - 'Ħ' => 'ħ', - 'Ĩ' => 'ĩ', - 'Ī' => 'ī', - 'Ĭ' => 'ĭ', - 'Į' => 'į', - 'İ' => 'i', - 'IJ' => 'ij', - 'Ĵ' => 'ĵ', - 'Ķ' => 'ķ', - 'Ĺ' => 'ĺ', - 'Ļ' => 'ļ', - 'Ľ' => 'ľ', - 'Ŀ' => 'ŀ', - 'Ł' => 'ł', - 'Ń' => 'ń', - 'Ņ' => 'ņ', - 'Ň' => 'ň', - 'Ŋ' => 'ŋ', - 'Ō' => 'ō', - 'Ŏ' => 'ŏ', - 'Ő' => 'ő', - 'Œ' => 'œ', - 'Ŕ' => 'ŕ', - 'Ŗ' => 'ŗ', - 'Ř' => 'ř', - 'Ś' => 'ś', - 'Ŝ' => 'ŝ', - 'Ş' => 'ş', - 'Š' => 'š', - 'Ţ' => 'ţ', - 'Ť' => 'ť', - 'Ŧ' => 'ŧ', - 'Ũ' => 'ũ', - 'Ū' => 'ū', - 'Ŭ' => 'ŭ', - 'Ů' => 'ů', - 'Ű' => 'ű', - 'Ų' => 'ų', - 'Ŵ' => 'ŵ', - 'Ŷ' => 'ŷ', - 'Ÿ' => 'ÿ', - 'Ź' => 'ź', - 'Ż' => 'ż', - 'Ž' => 'ž', - 'Ɓ' => 'ɓ', - 'Ƃ' => 'ƃ', - 'Ƅ' => 'ƅ', - 'Ɔ' => 'ɔ', - 'Ƈ' => 'ƈ', - 'Ɖ' => 'ɖ', - 'Ɗ' => 'ɗ', - 'Ƌ' => 'ƌ', - 'Ǝ' => 'ǝ', - 'Ə' => 'ə', - 'Ɛ' => 'ɛ', - 'Ƒ' => 'ƒ', - 'Ɠ' => 'ɠ', - 'Ɣ' => 'ɣ', - 'Ɩ' => 'ɩ', - 'Ɨ' => 'ɨ', - 'Ƙ' => 'ƙ', - 'Ɯ' => 'ɯ', - 'Ɲ' => 'ɲ', - 'Ɵ' => 'ɵ', - 'Ơ' => 'ơ', - 'Ƣ' => 'ƣ', - 'Ƥ' => 'ƥ', - 'Ʀ' => 'ʀ', - 'Ƨ' => 'ƨ', - 'Ʃ' => 'ʃ', - 'Ƭ' => 'ƭ', - 'Ʈ' => 'ʈ', - 'Ư' => 'ư', - 'Ʊ' => 'ʊ', - 'Ʋ' => 'ʋ', - 'Ƴ' => 'ƴ', - 'Ƶ' => 'ƶ', - 'Ʒ' => 'ʒ', - 'Ƹ' => 'ƹ', - 'Ƽ' => 'ƽ', - 'DŽ' => 'dž', - 'Dž' => 'dž', - 'LJ' => 'lj', - 'Lj' => 'lj', - 'NJ' => 'nj', - 'Nj' => 'nj', - 'Ǎ' => 'ǎ', - 'Ǐ' => 'ǐ', - 'Ǒ' => 'ǒ', - 'Ǔ' => 'ǔ', - 'Ǖ' => 'ǖ', - 'Ǘ' => 'ǘ', - 'Ǚ' => 'ǚ', - 'Ǜ' => 'ǜ', - 'Ǟ' => 'ǟ', - 'Ǡ' => 'ǡ', - 'Ǣ' => 'ǣ', - 'Ǥ' => 'ǥ', - 'Ǧ' => 'ǧ', - 'Ǩ' => 'ǩ', - 'Ǫ' => 'ǫ', - 'Ǭ' => 'ǭ', - 'Ǯ' => 'ǯ', - 'DZ' => 'dz', - 'Dz' => 'dz', - 'Ǵ' => 'ǵ', - 'Ƕ' => 'ƕ', - 'Ƿ' => 'ƿ', - 'Ǹ' => 'ǹ', - 'Ǻ' => 'ǻ', - 'Ǽ' => 'ǽ', - 'Ǿ' => 'ǿ', - 'Ȁ' => 'ȁ', - 'Ȃ' => 'ȃ', - 'Ȅ' => 'ȅ', - 'Ȇ' => 'ȇ', - 'Ȉ' => 'ȉ', - 'Ȋ' => 'ȋ', - 'Ȍ' => 'ȍ', - 'Ȏ' => 'ȏ', - 'Ȑ' => 'ȑ', - 'Ȓ' => 'ȓ', - 'Ȕ' => 'ȕ', - 'Ȗ' => 'ȗ', - 'Ș' => 'ș', - 'Ț' => 'ț', - 'Ȝ' => 'ȝ', - 'Ȟ' => 'ȟ', - 'Ƞ' => 'ƞ', - 'Ȣ' => 'ȣ', - 'Ȥ' => 'ȥ', - 'Ȧ' => 'ȧ', - 'Ȩ' => 'ȩ', - 'Ȫ' => 'ȫ', - 'Ȭ' => 'ȭ', - 'Ȯ' => 'ȯ', - 'Ȱ' => 'ȱ', - 'Ȳ' => 'ȳ', - 'Ⱥ' => 'ⱥ', - 'Ȼ' => 'ȼ', - 'Ƚ' => 'ƚ', - 'Ⱦ' => 'ⱦ', - 'Ɂ' => 'ɂ', - 'Ƀ' => 'ƀ', - 'Ʉ' => 'ʉ', - 'Ʌ' => 'ʌ', - 'Ɇ' => 'ɇ', - 'Ɉ' => 'ɉ', - 'Ɋ' => 'ɋ', - 'Ɍ' => 'ɍ', - 'Ɏ' => 'ɏ', - 'Ͱ' => 'ͱ', - 'Ͳ' => 'ͳ', - 'Ͷ' => 'ͷ', - 'Ϳ' => 'ϳ', - 'Ά' => 'ά', - 'Έ' => 'έ', - 'Ή' => 'ή', - 'Ί' => 'ί', - 'Ό' => 'ό', - 'Ύ' => 'ύ', - 'Ώ' => 'ώ', - 'Α' => 'α', - 'Β' => 'β', - 'Γ' => 'γ', - 'Δ' => 'δ', - 'Ε' => 'ε', - 'Ζ' => 'ζ', - 'Η' => 'η', - 'Θ' => 'θ', - 'Ι' => 'ι', - 'Κ' => 'κ', - 'Λ' => 'λ', - 'Μ' => 'μ', - 'Ν' => 'ν', - 'Ξ' => 'ξ', - 'Ο' => 'ο', - 'Π' => 'π', - 'Ρ' => 'ρ', - 'Σ' => 'σ', - 'Τ' => 'τ', - 'Υ' => 'υ', - 'Φ' => 'φ', - 'Χ' => 'χ', - 'Ψ' => 'ψ', - 'Ω' => 'ω', - 'Ϊ' => 'ϊ', - 'Ϋ' => 'ϋ', - 'Ϗ' => 'ϗ', - 'Ϙ' => 'ϙ', - 'Ϛ' => 'ϛ', - 'Ϝ' => 'ϝ', - 'Ϟ' => 'ϟ', - 'Ϡ' => 'ϡ', - 'Ϣ' => 'ϣ', - 'Ϥ' => 'ϥ', - 'Ϧ' => 'ϧ', - 'Ϩ' => 'ϩ', - 'Ϫ' => 'ϫ', - 'Ϭ' => 'ϭ', - 'Ϯ' => 'ϯ', - 'ϴ' => 'θ', - 'Ϸ' => 'ϸ', - 'Ϲ' => 'ϲ', - 'Ϻ' => 'ϻ', - 'Ͻ' => 'ͻ', - 'Ͼ' => 'ͼ', - 'Ͽ' => 'ͽ', - 'Ѐ' => 'ѐ', - 'Ё' => 'ё', - 'Ђ' => 'ђ', - 'Ѓ' => 'ѓ', - 'Є' => 'є', - 'Ѕ' => 'ѕ', - 'І' => 'і', - 'Ї' => 'ї', - 'Ј' => 'ј', - 'Љ' => 'љ', - 'Њ' => 'њ', - 'Ћ' => 'ћ', - 'Ќ' => 'ќ', - 'Ѝ' => 'ѝ', - 'Ў' => 'ў', - 'Џ' => 'џ', - 'А' => 'а', - 'Б' => 'б', - 'В' => 'в', - 'Г' => 'г', - 'Д' => 'д', - 'Е' => 'е', - 'Ж' => 'ж', - 'З' => 'з', - 'И' => 'и', - 'Й' => 'й', - 'К' => 'к', - 'Л' => 'л', - 'М' => 'м', - 'Н' => 'н', - 'О' => 'о', - 'П' => 'п', - 'Р' => 'р', - 'С' => 'с', - 'Т' => 'т', - 'У' => 'у', - 'Ф' => 'ф', - 'Х' => 'х', - 'Ц' => 'ц', - 'Ч' => 'ч', - 'Ш' => 'ш', - 'Щ' => 'щ', - 'Ъ' => 'ъ', - 'Ы' => 'ы', - 'Ь' => 'ь', - 'Э' => 'э', - 'Ю' => 'ю', - 'Я' => 'я', - 'Ѡ' => 'ѡ', - 'Ѣ' => 'ѣ', - 'Ѥ' => 'ѥ', - 'Ѧ' => 'ѧ', - 'Ѩ' => 'ѩ', - 'Ѫ' => 'ѫ', - 'Ѭ' => 'ѭ', - 'Ѯ' => 'ѯ', - 'Ѱ' => 'ѱ', - 'Ѳ' => 'ѳ', - 'Ѵ' => 'ѵ', - 'Ѷ' => 'ѷ', - 'Ѹ' => 'ѹ', - 'Ѻ' => 'ѻ', - 'Ѽ' => 'ѽ', - 'Ѿ' => 'ѿ', - 'Ҁ' => 'ҁ', - 'Ҋ' => 'ҋ', - 'Ҍ' => 'ҍ', - 'Ҏ' => 'ҏ', - 'Ґ' => 'ґ', - 'Ғ' => 'ғ', - 'Ҕ' => 'ҕ', - 'Җ' => 'җ', - 'Ҙ' => 'ҙ', - 'Қ' => 'қ', - 'Ҝ' => 'ҝ', - 'Ҟ' => 'ҟ', - 'Ҡ' => 'ҡ', - 'Ң' => 'ң', - 'Ҥ' => 'ҥ', - 'Ҧ' => 'ҧ', - 'Ҩ' => 'ҩ', - 'Ҫ' => 'ҫ', - 'Ҭ' => 'ҭ', - 'Ү' => 'ү', - 'Ұ' => 'ұ', - 'Ҳ' => 'ҳ', - 'Ҵ' => 'ҵ', - 'Ҷ' => 'ҷ', - 'Ҹ' => 'ҹ', - 'Һ' => 'һ', - 'Ҽ' => 'ҽ', - 'Ҿ' => 'ҿ', - 'Ӏ' => 'ӏ', - 'Ӂ' => 'ӂ', - 'Ӄ' => 'ӄ', - 'Ӆ' => 'ӆ', - 'Ӈ' => 'ӈ', - 'Ӊ' => 'ӊ', - 'Ӌ' => 'ӌ', - 'Ӎ' => 'ӎ', - 'Ӑ' => 'ӑ', - 'Ӓ' => 'ӓ', - 'Ӕ' => 'ӕ', - 'Ӗ' => 'ӗ', - 'Ә' => 'ә', - 'Ӛ' => 'ӛ', - 'Ӝ' => 'ӝ', - 'Ӟ' => 'ӟ', - 'Ӡ' => 'ӡ', - 'Ӣ' => 'ӣ', - 'Ӥ' => 'ӥ', - 'Ӧ' => 'ӧ', - 'Ө' => 'ө', - 'Ӫ' => 'ӫ', - 'Ӭ' => 'ӭ', - 'Ӯ' => 'ӯ', - 'Ӱ' => 'ӱ', - 'Ӳ' => 'ӳ', - 'Ӵ' => 'ӵ', - 'Ӷ' => 'ӷ', - 'Ӹ' => 'ӹ', - 'Ӻ' => 'ӻ', - 'Ӽ' => 'ӽ', - 'Ӿ' => 'ӿ', - 'Ԁ' => 'ԁ', - 'Ԃ' => 'ԃ', - 'Ԅ' => 'ԅ', - 'Ԇ' => 'ԇ', - 'Ԉ' => 'ԉ', - 'Ԋ' => 'ԋ', - 'Ԍ' => 'ԍ', - 'Ԏ' => 'ԏ', - 'Ԑ' => 'ԑ', - 'Ԓ' => 'ԓ', - 'Ԕ' => 'ԕ', - 'Ԗ' => 'ԗ', - 'Ԙ' => 'ԙ', - 'Ԛ' => 'ԛ', - 'Ԝ' => 'ԝ', - 'Ԟ' => 'ԟ', - 'Ԡ' => 'ԡ', - 'Ԣ' => 'ԣ', - 'Ԥ' => 'ԥ', - 'Ԧ' => 'ԧ', - 'Ԩ' => 'ԩ', - 'Ԫ' => 'ԫ', - 'Ԭ' => 'ԭ', - 'Ԯ' => 'ԯ', - 'Ա' => 'ա', - 'Բ' => 'բ', - 'Գ' => 'գ', - 'Դ' => 'դ', - 'Ե' => 'ե', - 'Զ' => 'զ', - 'Է' => 'է', - 'Ը' => 'ը', - 'Թ' => 'թ', - 'Ժ' => 'ժ', - 'Ի' => 'ի', - 'Լ' => 'լ', - 'Խ' => 'խ', - 'Ծ' => 'ծ', - 'Կ' => 'կ', - 'Հ' => 'հ', - 'Ձ' => 'ձ', - 'Ղ' => 'ղ', - 'Ճ' => 'ճ', - 'Մ' => 'մ', - 'Յ' => 'յ', - 'Ն' => 'ն', - 'Շ' => 'շ', - 'Ո' => 'ո', - 'Չ' => 'չ', - 'Պ' => 'պ', - 'Ջ' => 'ջ', - 'Ռ' => 'ռ', - 'Ս' => 'ս', - 'Վ' => 'վ', - 'Տ' => 'տ', - 'Ր' => 'ր', - 'Ց' => 'ց', - 'Ւ' => 'ւ', - 'Փ' => 'փ', - 'Ք' => 'ք', - 'Օ' => 'օ', - 'Ֆ' => 'ֆ', - 'Ⴀ' => 'ⴀ', - 'Ⴁ' => 'ⴁ', - 'Ⴂ' => 'ⴂ', - 'Ⴃ' => 'ⴃ', - 'Ⴄ' => 'ⴄ', - 'Ⴅ' => 'ⴅ', - 'Ⴆ' => 'ⴆ', - 'Ⴇ' => 'ⴇ', - 'Ⴈ' => 'ⴈ', - 'Ⴉ' => 'ⴉ', - 'Ⴊ' => 'ⴊ', - 'Ⴋ' => 'ⴋ', - 'Ⴌ' => 'ⴌ', - 'Ⴍ' => 'ⴍ', - 'Ⴎ' => 'ⴎ', - 'Ⴏ' => 'ⴏ', - 'Ⴐ' => 'ⴐ', - 'Ⴑ' => 'ⴑ', - 'Ⴒ' => 'ⴒ', - 'Ⴓ' => 'ⴓ', - 'Ⴔ' => 'ⴔ', - 'Ⴕ' => 'ⴕ', - 'Ⴖ' => 'ⴖ', - 'Ⴗ' => 'ⴗ', - 'Ⴘ' => 'ⴘ', - 'Ⴙ' => 'ⴙ', - 'Ⴚ' => 'ⴚ', - 'Ⴛ' => 'ⴛ', - 'Ⴜ' => 'ⴜ', - 'Ⴝ' => 'ⴝ', - 'Ⴞ' => 'ⴞ', - 'Ⴟ' => 'ⴟ', - 'Ⴠ' => 'ⴠ', - 'Ⴡ' => 'ⴡ', - 'Ⴢ' => 'ⴢ', - 'Ⴣ' => 'ⴣ', - 'Ⴤ' => 'ⴤ', - 'Ⴥ' => 'ⴥ', - 'Ⴧ' => 'ⴧ', - 'Ⴭ' => 'ⴭ', - 'Ꭰ' => 'ꭰ', - 'Ꭱ' => 'ꭱ', - 'Ꭲ' => 'ꭲ', - 'Ꭳ' => 'ꭳ', - 'Ꭴ' => 'ꭴ', - 'Ꭵ' => 'ꭵ', - 'Ꭶ' => 'ꭶ', - 'Ꭷ' => 'ꭷ', - 'Ꭸ' => 'ꭸ', - 'Ꭹ' => 'ꭹ', - 'Ꭺ' => 'ꭺ', - 'Ꭻ' => 'ꭻ', - 'Ꭼ' => 'ꭼ', - 'Ꭽ' => 'ꭽ', - 'Ꭾ' => 'ꭾ', - 'Ꭿ' => 'ꭿ', - 'Ꮀ' => 'ꮀ', - 'Ꮁ' => 'ꮁ', - 'Ꮂ' => 'ꮂ', - 'Ꮃ' => 'ꮃ', - 'Ꮄ' => 'ꮄ', - 'Ꮅ' => 'ꮅ', - 'Ꮆ' => 'ꮆ', - 'Ꮇ' => 'ꮇ', - 'Ꮈ' => 'ꮈ', - 'Ꮉ' => 'ꮉ', - 'Ꮊ' => 'ꮊ', - 'Ꮋ' => 'ꮋ', - 'Ꮌ' => 'ꮌ', - 'Ꮍ' => 'ꮍ', - 'Ꮎ' => 'ꮎ', - 'Ꮏ' => 'ꮏ', - 'Ꮐ' => 'ꮐ', - 'Ꮑ' => 'ꮑ', - 'Ꮒ' => 'ꮒ', - 'Ꮓ' => 'ꮓ', - 'Ꮔ' => 'ꮔ', - 'Ꮕ' => 'ꮕ', - 'Ꮖ' => 'ꮖ', - 'Ꮗ' => 'ꮗ', - 'Ꮘ' => 'ꮘ', - 'Ꮙ' => 'ꮙ', - 'Ꮚ' => 'ꮚ', - 'Ꮛ' => 'ꮛ', - 'Ꮜ' => 'ꮜ', - 'Ꮝ' => 'ꮝ', - 'Ꮞ' => 'ꮞ', - 'Ꮟ' => 'ꮟ', - 'Ꮠ' => 'ꮠ', - 'Ꮡ' => 'ꮡ', - 'Ꮢ' => 'ꮢ', - 'Ꮣ' => 'ꮣ', - 'Ꮤ' => 'ꮤ', - 'Ꮥ' => 'ꮥ', - 'Ꮦ' => 'ꮦ', - 'Ꮧ' => 'ꮧ', - 'Ꮨ' => 'ꮨ', - 'Ꮩ' => 'ꮩ', - 'Ꮪ' => 'ꮪ', - 'Ꮫ' => 'ꮫ', - 'Ꮬ' => 'ꮬ', - 'Ꮭ' => 'ꮭ', - 'Ꮮ' => 'ꮮ', - 'Ꮯ' => 'ꮯ', - 'Ꮰ' => 'ꮰ', - 'Ꮱ' => 'ꮱ', - 'Ꮲ' => 'ꮲ', - 'Ꮳ' => 'ꮳ', - 'Ꮴ' => 'ꮴ', - 'Ꮵ' => 'ꮵ', - 'Ꮶ' => 'ꮶ', - 'Ꮷ' => 'ꮷ', - 'Ꮸ' => 'ꮸ', - 'Ꮹ' => 'ꮹ', - 'Ꮺ' => 'ꮺ', - 'Ꮻ' => 'ꮻ', - 'Ꮼ' => 'ꮼ', - 'Ꮽ' => 'ꮽ', - 'Ꮾ' => 'ꮾ', - 'Ꮿ' => 'ꮿ', - 'Ᏸ' => 'ᏸ', - 'Ᏹ' => 'ᏹ', - 'Ᏺ' => 'ᏺ', - 'Ᏻ' => 'ᏻ', - 'Ᏼ' => 'ᏼ', - 'Ᏽ' => 'ᏽ', - 'Ა' => 'ა', - 'Ბ' => 'ბ', - 'Გ' => 'გ', - 'Დ' => 'დ', - 'Ე' => 'ე', - 'Ვ' => 'ვ', - 'Ზ' => 'ზ', - 'Თ' => 'თ', - 'Ი' => 'ი', - 'Კ' => 'კ', - 'Ლ' => 'ლ', - 'Მ' => 'მ', - 'Ნ' => 'ნ', - 'Ო' => 'ო', - 'Პ' => 'პ', - 'Ჟ' => 'ჟ', - 'Რ' => 'რ', - 'Ს' => 'ს', - 'Ტ' => 'ტ', - 'Უ' => 'უ', - 'Ფ' => 'ფ', - 'Ქ' => 'ქ', - 'Ღ' => 'ღ', - 'Ყ' => 'ყ', - 'Შ' => 'შ', - 'Ჩ' => 'ჩ', - 'Ც' => 'ც', - 'Ძ' => 'ძ', - 'Წ' => 'წ', - 'Ჭ' => 'ჭ', - 'Ხ' => 'ხ', - 'Ჯ' => 'ჯ', - 'Ჰ' => 'ჰ', - 'Ჱ' => 'ჱ', - 'Ჲ' => 'ჲ', - 'Ჳ' => 'ჳ', - 'Ჴ' => 'ჴ', - 'Ჵ' => 'ჵ', - 'Ჶ' => 'ჶ', - 'Ჷ' => 'ჷ', - 'Ჸ' => 'ჸ', - 'Ჹ' => 'ჹ', - 'Ჺ' => 'ჺ', - 'Ჽ' => 'ჽ', - 'Ჾ' => 'ჾ', - 'Ჿ' => 'ჿ', - 'Ḁ' => 'ḁ', - 'Ḃ' => 'ḃ', - 'Ḅ' => 'ḅ', - 'Ḇ' => 'ḇ', - 'Ḉ' => 'ḉ', - 'Ḋ' => 'ḋ', - 'Ḍ' => 'ḍ', - 'Ḏ' => 'ḏ', - 'Ḑ' => 'ḑ', - 'Ḓ' => 'ḓ', - 'Ḕ' => 'ḕ', - 'Ḗ' => 'ḗ', - 'Ḙ' => 'ḙ', - 'Ḛ' => 'ḛ', - 'Ḝ' => 'ḝ', - 'Ḟ' => 'ḟ', - 'Ḡ' => 'ḡ', - 'Ḣ' => 'ḣ', - 'Ḥ' => 'ḥ', - 'Ḧ' => 'ḧ', - 'Ḩ' => 'ḩ', - 'Ḫ' => 'ḫ', - 'Ḭ' => 'ḭ', - 'Ḯ' => 'ḯ', - 'Ḱ' => 'ḱ', - 'Ḳ' => 'ḳ', - 'Ḵ' => 'ḵ', - 'Ḷ' => 'ḷ', - 'Ḹ' => 'ḹ', - 'Ḻ' => 'ḻ', - 'Ḽ' => 'ḽ', - 'Ḿ' => 'ḿ', - 'Ṁ' => 'ṁ', - 'Ṃ' => 'ṃ', - 'Ṅ' => 'ṅ', - 'Ṇ' => 'ṇ', - 'Ṉ' => 'ṉ', - 'Ṋ' => 'ṋ', - 'Ṍ' => 'ṍ', - 'Ṏ' => 'ṏ', - 'Ṑ' => 'ṑ', - 'Ṓ' => 'ṓ', - 'Ṕ' => 'ṕ', - 'Ṗ' => 'ṗ', - 'Ṙ' => 'ṙ', - 'Ṛ' => 'ṛ', - 'Ṝ' => 'ṝ', - 'Ṟ' => 'ṟ', - 'Ṡ' => 'ṡ', - 'Ṣ' => 'ṣ', - 'Ṥ' => 'ṥ', - 'Ṧ' => 'ṧ', - 'Ṩ' => 'ṩ', - 'Ṫ' => 'ṫ', - 'Ṭ' => 'ṭ', - 'Ṯ' => 'ṯ', - 'Ṱ' => 'ṱ', - 'Ṳ' => 'ṳ', - 'Ṵ' => 'ṵ', - 'Ṷ' => 'ṷ', - 'Ṹ' => 'ṹ', - 'Ṻ' => 'ṻ', - 'Ṽ' => 'ṽ', - 'Ṿ' => 'ṿ', - 'Ẁ' => 'ẁ', - 'Ẃ' => 'ẃ', - 'Ẅ' => 'ẅ', - 'Ẇ' => 'ẇ', - 'Ẉ' => 'ẉ', - 'Ẋ' => 'ẋ', - 'Ẍ' => 'ẍ', - 'Ẏ' => 'ẏ', - 'Ẑ' => 'ẑ', - 'Ẓ' => 'ẓ', - 'Ẕ' => 'ẕ', - 'ẞ' => 'ß', - 'Ạ' => 'ạ', - 'Ả' => 'ả', - 'Ấ' => 'ấ', - 'Ầ' => 'ầ', - 'Ẩ' => 'ẩ', - 'Ẫ' => 'ẫ', - 'Ậ' => 'ậ', - 'Ắ' => 'ắ', - 'Ằ' => 'ằ', - 'Ẳ' => 'ẳ', - 'Ẵ' => 'ẵ', - 'Ặ' => 'ặ', - 'Ẹ' => 'ẹ', - 'Ẻ' => 'ẻ', - 'Ẽ' => 'ẽ', - 'Ế' => 'ế', - 'Ề' => 'ề', - 'Ể' => 'ể', - 'Ễ' => 'ễ', - 'Ệ' => 'ệ', - 'Ỉ' => 'ỉ', - 'Ị' => 'ị', - 'Ọ' => 'ọ', - 'Ỏ' => 'ỏ', - 'Ố' => 'ố', - 'Ồ' => 'ồ', - 'Ổ' => 'ổ', - 'Ỗ' => 'ỗ', - 'Ộ' => 'ộ', - 'Ớ' => 'ớ', - 'Ờ' => 'ờ', - 'Ở' => 'ở', - 'Ỡ' => 'ỡ', - 'Ợ' => 'ợ', - 'Ụ' => 'ụ', - 'Ủ' => 'ủ', - 'Ứ' => 'ứ', - 'Ừ' => 'ừ', - 'Ử' => 'ử', - 'Ữ' => 'ữ', - 'Ự' => 'ự', - 'Ỳ' => 'ỳ', - 'Ỵ' => 'ỵ', - 'Ỷ' => 'ỷ', - 'Ỹ' => 'ỹ', - 'Ỻ' => 'ỻ', - 'Ỽ' => 'ỽ', - 'Ỿ' => 'ỿ', - 'Ἀ' => 'ἀ', - 'Ἁ' => 'ἁ', - 'Ἂ' => 'ἂ', - 'Ἃ' => 'ἃ', - 'Ἄ' => 'ἄ', - 'Ἅ' => 'ἅ', - 'Ἆ' => 'ἆ', - 'Ἇ' => 'ἇ', - 'Ἐ' => 'ἐ', - 'Ἑ' => 'ἑ', - 'Ἒ' => 'ἒ', - 'Ἓ' => 'ἓ', - 'Ἔ' => 'ἔ', - 'Ἕ' => 'ἕ', - 'Ἠ' => 'ἠ', - 'Ἡ' => 'ἡ', - 'Ἢ' => 'ἢ', - 'Ἣ' => 'ἣ', - 'Ἤ' => 'ἤ', - 'Ἥ' => 'ἥ', - 'Ἦ' => 'ἦ', - 'Ἧ' => 'ἧ', - 'Ἰ' => 'ἰ', - 'Ἱ' => 'ἱ', - 'Ἲ' => 'ἲ', - 'Ἳ' => 'ἳ', - 'Ἴ' => 'ἴ', - 'Ἵ' => 'ἵ', - 'Ἶ' => 'ἶ', - 'Ἷ' => 'ἷ', - 'Ὀ' => 'ὀ', - 'Ὁ' => 'ὁ', - 'Ὂ' => 'ὂ', - 'Ὃ' => 'ὃ', - 'Ὄ' => 'ὄ', - 'Ὅ' => 'ὅ', - 'Ὑ' => 'ὑ', - 'Ὓ' => 'ὓ', - 'Ὕ' => 'ὕ', - 'Ὗ' => 'ὗ', - 'Ὠ' => 'ὠ', - 'Ὡ' => 'ὡ', - 'Ὢ' => 'ὢ', - 'Ὣ' => 'ὣ', - 'Ὤ' => 'ὤ', - 'Ὥ' => 'ὥ', - 'Ὦ' => 'ὦ', - 'Ὧ' => 'ὧ', - 'ᾈ' => 'ᾀ', - 'ᾉ' => 'ᾁ', - 'ᾊ' => 'ᾂ', - 'ᾋ' => 'ᾃ', - 'ᾌ' => 'ᾄ', - 'ᾍ' => 'ᾅ', - 'ᾎ' => 'ᾆ', - 'ᾏ' => 'ᾇ', - 'ᾘ' => 'ᾐ', - 'ᾙ' => 'ᾑ', - 'ᾚ' => 'ᾒ', - 'ᾛ' => 'ᾓ', - 'ᾜ' => 'ᾔ', - 'ᾝ' => 'ᾕ', - 'ᾞ' => 'ᾖ', - 'ᾟ' => 'ᾗ', - 'ᾨ' => 'ᾠ', - 'ᾩ' => 'ᾡ', - 'ᾪ' => 'ᾢ', - 'ᾫ' => 'ᾣ', - 'ᾬ' => 'ᾤ', - 'ᾭ' => 'ᾥ', - 'ᾮ' => 'ᾦ', - 'ᾯ' => 'ᾧ', - 'Ᾰ' => 'ᾰ', - 'Ᾱ' => 'ᾱ', - 'Ὰ' => 'ὰ', - 'Ά' => 'ά', - 'ᾼ' => 'ᾳ', - 'Ὲ' => 'ὲ', - 'Έ' => 'έ', - 'Ὴ' => 'ὴ', - 'Ή' => 'ή', - 'ῌ' => 'ῃ', - 'Ῐ' => 'ῐ', - 'Ῑ' => 'ῑ', - 'Ὶ' => 'ὶ', - 'Ί' => 'ί', - 'Ῠ' => 'ῠ', - 'Ῡ' => 'ῡ', - 'Ὺ' => 'ὺ', - 'Ύ' => 'ύ', - 'Ῥ' => 'ῥ', - 'Ὸ' => 'ὸ', - 'Ό' => 'ό', - 'Ὼ' => 'ὼ', - 'Ώ' => 'ώ', - 'ῼ' => 'ῳ', - 'Ω' => 'ω', - 'K' => 'k', - 'Å' => 'å', - 'Ⅎ' => 'ⅎ', - 'Ⅰ' => 'ⅰ', - 'Ⅱ' => 'ⅱ', - 'Ⅲ' => 'ⅲ', - 'Ⅳ' => 'ⅳ', - 'Ⅴ' => 'ⅴ', - 'Ⅵ' => 'ⅵ', - 'Ⅶ' => 'ⅶ', - 'Ⅷ' => 'ⅷ', - 'Ⅸ' => 'ⅸ', - 'Ⅹ' => 'ⅹ', - 'Ⅺ' => 'ⅺ', - 'Ⅻ' => 'ⅻ', - 'Ⅼ' => 'ⅼ', - 'Ⅽ' => 'ⅽ', - 'Ⅾ' => 'ⅾ', - 'Ⅿ' => 'ⅿ', - 'Ↄ' => 'ↄ', - 'Ⓐ' => 'ⓐ', - 'Ⓑ' => 'ⓑ', - 'Ⓒ' => 'ⓒ', - 'Ⓓ' => 'ⓓ', - 'Ⓔ' => 'ⓔ', - 'Ⓕ' => 'ⓕ', - 'Ⓖ' => 'ⓖ', - 'Ⓗ' => 'ⓗ', - 'Ⓘ' => 'ⓘ', - 'Ⓙ' => 'ⓙ', - 'Ⓚ' => 'ⓚ', - 'Ⓛ' => 'ⓛ', - 'Ⓜ' => 'ⓜ', - 'Ⓝ' => 'ⓝ', - 'Ⓞ' => 'ⓞ', - 'Ⓟ' => 'ⓟ', - 'Ⓠ' => 'ⓠ', - 'Ⓡ' => 'ⓡ', - 'Ⓢ' => 'ⓢ', - 'Ⓣ' => 'ⓣ', - 'Ⓤ' => 'ⓤ', - 'Ⓥ' => 'ⓥ', - 'Ⓦ' => 'ⓦ', - 'Ⓧ' => 'ⓧ', - 'Ⓨ' => 'ⓨ', - 'Ⓩ' => 'ⓩ', - 'Ⰰ' => 'ⰰ', - 'Ⰱ' => 'ⰱ', - 'Ⰲ' => 'ⰲ', - 'Ⰳ' => 'ⰳ', - 'Ⰴ' => 'ⰴ', - 'Ⰵ' => 'ⰵ', - 'Ⰶ' => 'ⰶ', - 'Ⰷ' => 'ⰷ', - 'Ⰸ' => 'ⰸ', - 'Ⰹ' => 'ⰹ', - 'Ⰺ' => 'ⰺ', - 'Ⰻ' => 'ⰻ', - 'Ⰼ' => 'ⰼ', - 'Ⰽ' => 'ⰽ', - 'Ⰾ' => 'ⰾ', - 'Ⰿ' => 'ⰿ', - 'Ⱀ' => 'ⱀ', - 'Ⱁ' => 'ⱁ', - 'Ⱂ' => 'ⱂ', - 'Ⱃ' => 'ⱃ', - 'Ⱄ' => 'ⱄ', - 'Ⱅ' => 'ⱅ', - 'Ⱆ' => 'ⱆ', - 'Ⱇ' => 'ⱇ', - 'Ⱈ' => 'ⱈ', - 'Ⱉ' => 'ⱉ', - 'Ⱊ' => 'ⱊ', - 'Ⱋ' => 'ⱋ', - 'Ⱌ' => 'ⱌ', - 'Ⱍ' => 'ⱍ', - 'Ⱎ' => 'ⱎ', - 'Ⱏ' => 'ⱏ', - 'Ⱐ' => 'ⱐ', - 'Ⱑ' => 'ⱑ', - 'Ⱒ' => 'ⱒ', - 'Ⱓ' => 'ⱓ', - 'Ⱔ' => 'ⱔ', - 'Ⱕ' => 'ⱕ', - 'Ⱖ' => 'ⱖ', - 'Ⱗ' => 'ⱗ', - 'Ⱘ' => 'ⱘ', - 'Ⱙ' => 'ⱙ', - 'Ⱚ' => 'ⱚ', - 'Ⱛ' => 'ⱛ', - 'Ⱜ' => 'ⱜ', - 'Ⱝ' => 'ⱝ', - 'Ⱞ' => 'ⱞ', - 'Ⱡ' => 'ⱡ', - 'Ɫ' => 'ɫ', - 'Ᵽ' => 'ᵽ', - 'Ɽ' => 'ɽ', - 'Ⱨ' => 'ⱨ', - 'Ⱪ' => 'ⱪ', - 'Ⱬ' => 'ⱬ', - 'Ɑ' => 'ɑ', - 'Ɱ' => 'ɱ', - 'Ɐ' => 'ɐ', - 'Ɒ' => 'ɒ', - 'Ⱳ' => 'ⱳ', - 'Ⱶ' => 'ⱶ', - 'Ȿ' => 'ȿ', - 'Ɀ' => 'ɀ', - 'Ⲁ' => 'ⲁ', - 'Ⲃ' => 'ⲃ', - 'Ⲅ' => 'ⲅ', - 'Ⲇ' => 'ⲇ', - 'Ⲉ' => 'ⲉ', - 'Ⲋ' => 'ⲋ', - 'Ⲍ' => 'ⲍ', - 'Ⲏ' => 'ⲏ', - 'Ⲑ' => 'ⲑ', - 'Ⲓ' => 'ⲓ', - 'Ⲕ' => 'ⲕ', - 'Ⲗ' => 'ⲗ', - 'Ⲙ' => 'ⲙ', - 'Ⲛ' => 'ⲛ', - 'Ⲝ' => 'ⲝ', - 'Ⲟ' => 'ⲟ', - 'Ⲡ' => 'ⲡ', - 'Ⲣ' => 'ⲣ', - 'Ⲥ' => 'ⲥ', - 'Ⲧ' => 'ⲧ', - 'Ⲩ' => 'ⲩ', - 'Ⲫ' => 'ⲫ', - 'Ⲭ' => 'ⲭ', - 'Ⲯ' => 'ⲯ', - 'Ⲱ' => 'ⲱ', - 'Ⲳ' => 'ⲳ', - 'Ⲵ' => 'ⲵ', - 'Ⲷ' => 'ⲷ', - 'Ⲹ' => 'ⲹ', - 'Ⲻ' => 'ⲻ', - 'Ⲽ' => 'ⲽ', - 'Ⲿ' => 'ⲿ', - 'Ⳁ' => 'ⳁ', - 'Ⳃ' => 'ⳃ', - 'Ⳅ' => 'ⳅ', - 'Ⳇ' => 'ⳇ', - 'Ⳉ' => 'ⳉ', - 'Ⳋ' => 'ⳋ', - 'Ⳍ' => 'ⳍ', - 'Ⳏ' => 'ⳏ', - 'Ⳑ' => 'ⳑ', - 'Ⳓ' => 'ⳓ', - 'Ⳕ' => 'ⳕ', - 'Ⳗ' => 'ⳗ', - 'Ⳙ' => 'ⳙ', - 'Ⳛ' => 'ⳛ', - 'Ⳝ' => 'ⳝ', - 'Ⳟ' => 'ⳟ', - 'Ⳡ' => 'ⳡ', - 'Ⳣ' => 'ⳣ', - 'Ⳬ' => 'ⳬ', - 'Ⳮ' => 'ⳮ', - 'Ⳳ' => 'ⳳ', - 'Ꙁ' => 'ꙁ', - 'Ꙃ' => 'ꙃ', - 'Ꙅ' => 'ꙅ', - 'Ꙇ' => 'ꙇ', - 'Ꙉ' => 'ꙉ', - 'Ꙋ' => 'ꙋ', - 'Ꙍ' => 'ꙍ', - 'Ꙏ' => 'ꙏ', - 'Ꙑ' => 'ꙑ', - 'Ꙓ' => 'ꙓ', - 'Ꙕ' => 'ꙕ', - 'Ꙗ' => 'ꙗ', - 'Ꙙ' => 'ꙙ', - 'Ꙛ' => 'ꙛ', - 'Ꙝ' => 'ꙝ', - 'Ꙟ' => 'ꙟ', - 'Ꙡ' => 'ꙡ', - 'Ꙣ' => 'ꙣ', - 'Ꙥ' => 'ꙥ', - 'Ꙧ' => 'ꙧ', - 'Ꙩ' => 'ꙩ', - 'Ꙫ' => 'ꙫ', - 'Ꙭ' => 'ꙭ', - 'Ꚁ' => 'ꚁ', - 'Ꚃ' => 'ꚃ', - 'Ꚅ' => 'ꚅ', - 'Ꚇ' => 'ꚇ', - 'Ꚉ' => 'ꚉ', - 'Ꚋ' => 'ꚋ', - 'Ꚍ' => 'ꚍ', - 'Ꚏ' => 'ꚏ', - 'Ꚑ' => 'ꚑ', - 'Ꚓ' => 'ꚓ', - 'Ꚕ' => 'ꚕ', - 'Ꚗ' => 'ꚗ', - 'Ꚙ' => 'ꚙ', - 'Ꚛ' => 'ꚛ', - 'Ꜣ' => 'ꜣ', - 'Ꜥ' => 'ꜥ', - 'Ꜧ' => 'ꜧ', - 'Ꜩ' => 'ꜩ', - 'Ꜫ' => 'ꜫ', - 'Ꜭ' => 'ꜭ', - 'Ꜯ' => 'ꜯ', - 'Ꜳ' => 'ꜳ', - 'Ꜵ' => 'ꜵ', - 'Ꜷ' => 'ꜷ', - 'Ꜹ' => 'ꜹ', - 'Ꜻ' => 'ꜻ', - 'Ꜽ' => 'ꜽ', - 'Ꜿ' => 'ꜿ', - 'Ꝁ' => 'ꝁ', - 'Ꝃ' => 'ꝃ', - 'Ꝅ' => 'ꝅ', - 'Ꝇ' => 'ꝇ', - 'Ꝉ' => 'ꝉ', - 'Ꝋ' => 'ꝋ', - 'Ꝍ' => 'ꝍ', - 'Ꝏ' => 'ꝏ', - 'Ꝑ' => 'ꝑ', - 'Ꝓ' => 'ꝓ', - 'Ꝕ' => 'ꝕ', - 'Ꝗ' => 'ꝗ', - 'Ꝙ' => 'ꝙ', - 'Ꝛ' => 'ꝛ', - 'Ꝝ' => 'ꝝ', - 'Ꝟ' => 'ꝟ', - 'Ꝡ' => 'ꝡ', - 'Ꝣ' => 'ꝣ', - 'Ꝥ' => 'ꝥ', - 'Ꝧ' => 'ꝧ', - 'Ꝩ' => 'ꝩ', - 'Ꝫ' => 'ꝫ', - 'Ꝭ' => 'ꝭ', - 'Ꝯ' => 'ꝯ', - 'Ꝺ' => 'ꝺ', - 'Ꝼ' => 'ꝼ', - 'Ᵹ' => 'ᵹ', - 'Ꝿ' => 'ꝿ', - 'Ꞁ' => 'ꞁ', - 'Ꞃ' => 'ꞃ', - 'Ꞅ' => 'ꞅ', - 'Ꞇ' => 'ꞇ', - 'Ꞌ' => 'ꞌ', - 'Ɥ' => 'ɥ', - 'Ꞑ' => 'ꞑ', - 'Ꞓ' => 'ꞓ', - 'Ꞗ' => 'ꞗ', - 'Ꞙ' => 'ꞙ', - 'Ꞛ' => 'ꞛ', - 'Ꞝ' => 'ꞝ', - 'Ꞟ' => 'ꞟ', - 'Ꞡ' => 'ꞡ', - 'Ꞣ' => 'ꞣ', - 'Ꞥ' => 'ꞥ', - 'Ꞧ' => 'ꞧ', - 'Ꞩ' => 'ꞩ', - 'Ɦ' => 'ɦ', - 'Ɜ' => 'ɜ', - 'Ɡ' => 'ɡ', - 'Ɬ' => 'ɬ', - 'Ɪ' => 'ɪ', - 'Ʞ' => 'ʞ', - 'Ʇ' => 'ʇ', - 'Ʝ' => 'ʝ', - 'Ꭓ' => 'ꭓ', - 'Ꞵ' => 'ꞵ', - 'Ꞷ' => 'ꞷ', - 'Ꞹ' => 'ꞹ', - 'Ꞻ' => 'ꞻ', - 'Ꞽ' => 'ꞽ', - 'Ꞿ' => 'ꞿ', - 'Ꟃ' => 'ꟃ', - 'Ꞔ' => 'ꞔ', - 'Ʂ' => 'ʂ', - 'Ᶎ' => 'ᶎ', - 'Ꟈ' => 'ꟈ', - 'Ꟊ' => 'ꟊ', - 'Ꟶ' => 'ꟶ', - 'A' => 'a', - 'B' => 'b', - 'C' => 'c', - 'D' => 'd', - 'E' => 'e', - 'F' => 'f', - 'G' => 'g', - 'H' => 'h', - 'I' => 'i', - 'J' => 'j', - 'K' => 'k', - 'L' => 'l', - 'M' => 'm', - 'N' => 'n', - 'O' => 'o', - 'P' => 'p', - 'Q' => 'q', - 'R' => 'r', - 'S' => 's', - 'T' => 't', - 'U' => 'u', - 'V' => 'v', - 'W' => 'w', - 'X' => 'x', - 'Y' => 'y', - 'Z' => 'z', - '𐐀' => '𐐨', - '𐐁' => '𐐩', - '𐐂' => '𐐪', - '𐐃' => '𐐫', - '𐐄' => '𐐬', - '𐐅' => '𐐭', - '𐐆' => '𐐮', - '𐐇' => '𐐯', - '𐐈' => '𐐰', - '𐐉' => '𐐱', - '𐐊' => '𐐲', - '𐐋' => '𐐳', - '𐐌' => '𐐴', - '𐐍' => '𐐵', - '𐐎' => '𐐶', - '𐐏' => '𐐷', - '𐐐' => '𐐸', - '𐐑' => '𐐹', - '𐐒' => '𐐺', - '𐐓' => '𐐻', - '𐐔' => '𐐼', - '𐐕' => '𐐽', - '𐐖' => '𐐾', - '𐐗' => '𐐿', - '𐐘' => '𐑀', - '𐐙' => '𐑁', - '𐐚' => '𐑂', - '𐐛' => '𐑃', - '𐐜' => '𐑄', - '𐐝' => '𐑅', - '𐐞' => '𐑆', - '𐐟' => '𐑇', - '𐐠' => '𐑈', - '𐐡' => '𐑉', - '𐐢' => '𐑊', - '𐐣' => '𐑋', - '𐐤' => '𐑌', - '𐐥' => '𐑍', - '𐐦' => '𐑎', - '𐐧' => '𐑏', - '𐒰' => '𐓘', - '𐒱' => '𐓙', - '𐒲' => '𐓚', - '𐒳' => '𐓛', - '𐒴' => '𐓜', - '𐒵' => '𐓝', - '𐒶' => '𐓞', - '𐒷' => '𐓟', - '𐒸' => '𐓠', - '𐒹' => '𐓡', - '𐒺' => '𐓢', - '𐒻' => '𐓣', - '𐒼' => '𐓤', - '𐒽' => '𐓥', - '𐒾' => '𐓦', - '𐒿' => '𐓧', - '𐓀' => '𐓨', - '𐓁' => '𐓩', - '𐓂' => '𐓪', - '𐓃' => '𐓫', - '𐓄' => '𐓬', - '𐓅' => '𐓭', - '𐓆' => '𐓮', - '𐓇' => '𐓯', - '𐓈' => '𐓰', - '𐓉' => '𐓱', - '𐓊' => '𐓲', - '𐓋' => '𐓳', - '𐓌' => '𐓴', - '𐓍' => '𐓵', - '𐓎' => '𐓶', - '𐓏' => '𐓷', - '𐓐' => '𐓸', - '𐓑' => '𐓹', - '𐓒' => '𐓺', - '𐓓' => '𐓻', - '𐲀' => '𐳀', - '𐲁' => '𐳁', - '𐲂' => '𐳂', - '𐲃' => '𐳃', - '𐲄' => '𐳄', - '𐲅' => '𐳅', - '𐲆' => '𐳆', - '𐲇' => '𐳇', - '𐲈' => '𐳈', - '𐲉' => '𐳉', - '𐲊' => '𐳊', - '𐲋' => '𐳋', - '𐲌' => '𐳌', - '𐲍' => '𐳍', - '𐲎' => '𐳎', - '𐲏' => '𐳏', - '𐲐' => '𐳐', - '𐲑' => '𐳑', - '𐲒' => '𐳒', - '𐲓' => '𐳓', - '𐲔' => '𐳔', - '𐲕' => '𐳕', - '𐲖' => '𐳖', - '𐲗' => '𐳗', - '𐲘' => '𐳘', - '𐲙' => '𐳙', - '𐲚' => '𐳚', - '𐲛' => '𐳛', - '𐲜' => '𐳜', - '𐲝' => '𐳝', - '𐲞' => '𐳞', - '𐲟' => '𐳟', - '𐲠' => '𐳠', - '𐲡' => '𐳡', - '𐲢' => '𐳢', - '𐲣' => '𐳣', - '𐲤' => '𐳤', - '𐲥' => '𐳥', - '𐲦' => '𐳦', - '𐲧' => '𐳧', - '𐲨' => '𐳨', - '𐲩' => '𐳩', - '𐲪' => '𐳪', - '𐲫' => '𐳫', - '𐲬' => '𐳬', - '𐲭' => '𐳭', - '𐲮' => '𐳮', - '𐲯' => '𐳯', - '𐲰' => '𐳰', - '𐲱' => '𐳱', - '𐲲' => '𐳲', - '𑢠' => '𑣀', - '𑢡' => '𑣁', - '𑢢' => '𑣂', - '𑢣' => '𑣃', - '𑢤' => '𑣄', - '𑢥' => '𑣅', - '𑢦' => '𑣆', - '𑢧' => '𑣇', - '𑢨' => '𑣈', - '𑢩' => '𑣉', - '𑢪' => '𑣊', - '𑢫' => '𑣋', - '𑢬' => '𑣌', - '𑢭' => '𑣍', - '𑢮' => '𑣎', - '𑢯' => '𑣏', - '𑢰' => '𑣐', - '𑢱' => '𑣑', - '𑢲' => '𑣒', - '𑢳' => '𑣓', - '𑢴' => '𑣔', - '𑢵' => '𑣕', - '𑢶' => '𑣖', - '𑢷' => '𑣗', - '𑢸' => '𑣘', - '𑢹' => '𑣙', - '𑢺' => '𑣚', - '𑢻' => '𑣛', - '𑢼' => '𑣜', - '𑢽' => '𑣝', - '𑢾' => '𑣞', - '𑢿' => '𑣟', - '𖹀' => '𖹠', - '𖹁' => '𖹡', - '𖹂' => '𖹢', - '𖹃' => '𖹣', - '𖹄' => '𖹤', - '𖹅' => '𖹥', - '𖹆' => '𖹦', - '𖹇' => '𖹧', - '𖹈' => '𖹨', - '𖹉' => '𖹩', - '𖹊' => '𖹪', - '𖹋' => '𖹫', - '𖹌' => '𖹬', - '𖹍' => '𖹭', - '𖹎' => '𖹮', - '𖹏' => '𖹯', - '𖹐' => '𖹰', - '𖹑' => '𖹱', - '𖹒' => '𖹲', - '𖹓' => '𖹳', - '𖹔' => '𖹴', - '𖹕' => '𖹵', - '𖹖' => '𖹶', - '𖹗' => '𖹷', - '𖹘' => '𖹸', - '𖹙' => '𖹹', - '𖹚' => '𖹺', - '𖹛' => '𖹻', - '𖹜' => '𖹼', - '𖹝' => '𖹽', - '𖹞' => '𖹾', - '𖹟' => '𖹿', - '𞤀' => '𞤢', - '𞤁' => '𞤣', - '𞤂' => '𞤤', - '𞤃' => '𞤥', - '𞤄' => '𞤦', - '𞤅' => '𞤧', - '𞤆' => '𞤨', - '𞤇' => '𞤩', - '𞤈' => '𞤪', - '𞤉' => '𞤫', - '𞤊' => '𞤬', - '𞤋' => '𞤭', - '𞤌' => '𞤮', - '𞤍' => '𞤯', - '𞤎' => '𞤰', - '𞤏' => '𞤱', - '𞤐' => '𞤲', - '𞤑' => '𞤳', - '𞤒' => '𞤴', - '𞤓' => '𞤵', - '𞤔' => '𞤶', - '𞤕' => '𞤷', - '𞤖' => '𞤸', - '𞤗' => '𞤹', - '𞤘' => '𞤺', - '𞤙' => '𞤻', - '𞤚' => '𞤼', - '𞤛' => '𞤽', - '𞤜' => '𞤾', - '𞤝' => '𞤿', - '𞤞' => '𞥀', - '𞤟' => '𞥁', - '𞤠' => '𞥂', - '𞤡' => '𞥃', -); diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php deleted file mode 100644 index 2a8f6e7..0000000 --- a/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +++ /dev/null @@ -1,5 +0,0 @@ - 'A', - 'b' => 'B', - 'c' => 'C', - 'd' => 'D', - 'e' => 'E', - 'f' => 'F', - 'g' => 'G', - 'h' => 'H', - 'i' => 'I', - 'j' => 'J', - 'k' => 'K', - 'l' => 'L', - 'm' => 'M', - 'n' => 'N', - 'o' => 'O', - 'p' => 'P', - 'q' => 'Q', - 'r' => 'R', - 's' => 'S', - 't' => 'T', - 'u' => 'U', - 'v' => 'V', - 'w' => 'W', - 'x' => 'X', - 'y' => 'Y', - 'z' => 'Z', - 'µ' => 'Μ', - 'à' => 'À', - 'á' => 'Á', - 'â' => 'Â', - 'ã' => 'Ã', - 'ä' => 'Ä', - 'å' => 'Å', - 'æ' => 'Æ', - 'ç' => 'Ç', - 'è' => 'È', - 'é' => 'É', - 'ê' => 'Ê', - 'ë' => 'Ë', - 'ì' => 'Ì', - 'í' => 'Í', - 'î' => 'Î', - 'ï' => 'Ï', - 'ð' => 'Ð', - 'ñ' => 'Ñ', - 'ò' => 'Ò', - 'ó' => 'Ó', - 'ô' => 'Ô', - 'õ' => 'Õ', - 'ö' => 'Ö', - 'ø' => 'Ø', - 'ù' => 'Ù', - 'ú' => 'Ú', - 'û' => 'Û', - 'ü' => 'Ü', - 'ý' => 'Ý', - 'þ' => 'Þ', - 'ÿ' => 'Ÿ', - 'ā' => 'Ā', - 'ă' => 'Ă', - 'ą' => 'Ą', - 'ć' => 'Ć', - 'ĉ' => 'Ĉ', - 'ċ' => 'Ċ', - 'č' => 'Č', - 'ď' => 'Ď', - 'đ' => 'Đ', - 'ē' => 'Ē', - 'ĕ' => 'Ĕ', - 'ė' => 'Ė', - 'ę' => 'Ę', - 'ě' => 'Ě', - 'ĝ' => 'Ĝ', - 'ğ' => 'Ğ', - 'ġ' => 'Ġ', - 'ģ' => 'Ģ', - 'ĥ' => 'Ĥ', - 'ħ' => 'Ħ', - 'ĩ' => 'Ĩ', - 'ī' => 'Ī', - 'ĭ' => 'Ĭ', - 'į' => 'Į', - 'ı' => 'I', - 'ij' => 'IJ', - 'ĵ' => 'Ĵ', - 'ķ' => 'Ķ', - 'ĺ' => 'Ĺ', - 'ļ' => 'Ļ', - 'ľ' => 'Ľ', - 'ŀ' => 'Ŀ', - 'ł' => 'Ł', - 'ń' => 'Ń', - 'ņ' => 'Ņ', - 'ň' => 'Ň', - 'ŋ' => 'Ŋ', - 'ō' => 'Ō', - 'ŏ' => 'Ŏ', - 'ő' => 'Ő', - 'œ' => 'Œ', - 'ŕ' => 'Ŕ', - 'ŗ' => 'Ŗ', - 'ř' => 'Ř', - 'ś' => 'Ś', - 'ŝ' => 'Ŝ', - 'ş' => 'Ş', - 'š' => 'Š', - 'ţ' => 'Ţ', - 'ť' => 'Ť', - 'ŧ' => 'Ŧ', - 'ũ' => 'Ũ', - 'ū' => 'Ū', - 'ŭ' => 'Ŭ', - 'ů' => 'Ů', - 'ű' => 'Ű', - 'ų' => 'Ų', - 'ŵ' => 'Ŵ', - 'ŷ' => 'Ŷ', - 'ź' => 'Ź', - 'ż' => 'Ż', - 'ž' => 'Ž', - 'ſ' => 'S', - 'ƀ' => 'Ƀ', - 'ƃ' => 'Ƃ', - 'ƅ' => 'Ƅ', - 'ƈ' => 'Ƈ', - 'ƌ' => 'Ƌ', - 'ƒ' => 'Ƒ', - 'ƕ' => 'Ƕ', - 'ƙ' => 'Ƙ', - 'ƚ' => 'Ƚ', - 'ƞ' => 'Ƞ', - 'ơ' => 'Ơ', - 'ƣ' => 'Ƣ', - 'ƥ' => 'Ƥ', - 'ƨ' => 'Ƨ', - 'ƭ' => 'Ƭ', - 'ư' => 'Ư', - 'ƴ' => 'Ƴ', - 'ƶ' => 'Ƶ', - 'ƹ' => 'Ƹ', - 'ƽ' => 'Ƽ', - 'ƿ' => 'Ƿ', - 'Dž' => 'DŽ', - 'dž' => 'DŽ', - 'Lj' => 'LJ', - 'lj' => 'LJ', - 'Nj' => 'NJ', - 'nj' => 'NJ', - 'ǎ' => 'Ǎ', - 'ǐ' => 'Ǐ', - 'ǒ' => 'Ǒ', - 'ǔ' => 'Ǔ', - 'ǖ' => 'Ǖ', - 'ǘ' => 'Ǘ', - 'ǚ' => 'Ǚ', - 'ǜ' => 'Ǜ', - 'ǝ' => 'Ǝ', - 'ǟ' => 'Ǟ', - 'ǡ' => 'Ǡ', - 'ǣ' => 'Ǣ', - 'ǥ' => 'Ǥ', - 'ǧ' => 'Ǧ', - 'ǩ' => 'Ǩ', - 'ǫ' => 'Ǫ', - 'ǭ' => 'Ǭ', - 'ǯ' => 'Ǯ', - 'Dz' => 'DZ', - 'dz' => 'DZ', - 'ǵ' => 'Ǵ', - 'ǹ' => 'Ǹ', - 'ǻ' => 'Ǻ', - 'ǽ' => 'Ǽ', - 'ǿ' => 'Ǿ', - 'ȁ' => 'Ȁ', - 'ȃ' => 'Ȃ', - 'ȅ' => 'Ȅ', - 'ȇ' => 'Ȇ', - 'ȉ' => 'Ȉ', - 'ȋ' => 'Ȋ', - 'ȍ' => 'Ȍ', - 'ȏ' => 'Ȏ', - 'ȑ' => 'Ȑ', - 'ȓ' => 'Ȓ', - 'ȕ' => 'Ȕ', - 'ȗ' => 'Ȗ', - 'ș' => 'Ș', - 'ț' => 'Ț', - 'ȝ' => 'Ȝ', - 'ȟ' => 'Ȟ', - 'ȣ' => 'Ȣ', - 'ȥ' => 'Ȥ', - 'ȧ' => 'Ȧ', - 'ȩ' => 'Ȩ', - 'ȫ' => 'Ȫ', - 'ȭ' => 'Ȭ', - 'ȯ' => 'Ȯ', - 'ȱ' => 'Ȱ', - 'ȳ' => 'Ȳ', - 'ȼ' => 'Ȼ', - 'ȿ' => 'Ȿ', - 'ɀ' => 'Ɀ', - 'ɂ' => 'Ɂ', - 'ɇ' => 'Ɇ', - 'ɉ' => 'Ɉ', - 'ɋ' => 'Ɋ', - 'ɍ' => 'Ɍ', - 'ɏ' => 'Ɏ', - 'ɐ' => 'Ɐ', - 'ɑ' => 'Ɑ', - 'ɒ' => 'Ɒ', - 'ɓ' => 'Ɓ', - 'ɔ' => 'Ɔ', - 'ɖ' => 'Ɖ', - 'ɗ' => 'Ɗ', - 'ə' => 'Ə', - 'ɛ' => 'Ɛ', - 'ɜ' => 'Ɜ', - 'ɠ' => 'Ɠ', - 'ɡ' => 'Ɡ', - 'ɣ' => 'Ɣ', - 'ɥ' => 'Ɥ', - 'ɦ' => 'Ɦ', - 'ɨ' => 'Ɨ', - 'ɩ' => 'Ɩ', - 'ɪ' => 'Ɪ', - 'ɫ' => 'Ɫ', - 'ɬ' => 'Ɬ', - 'ɯ' => 'Ɯ', - 'ɱ' => 'Ɱ', - 'ɲ' => 'Ɲ', - 'ɵ' => 'Ɵ', - 'ɽ' => 'Ɽ', - 'ʀ' => 'Ʀ', - 'ʂ' => 'Ʂ', - 'ʃ' => 'Ʃ', - 'ʇ' => 'Ʇ', - 'ʈ' => 'Ʈ', - 'ʉ' => 'Ʉ', - 'ʊ' => 'Ʊ', - 'ʋ' => 'Ʋ', - 'ʌ' => 'Ʌ', - 'ʒ' => 'Ʒ', - 'ʝ' => 'Ʝ', - 'ʞ' => 'Ʞ', - 'ͅ' => 'Ι', - 'ͱ' => 'Ͱ', - 'ͳ' => 'Ͳ', - 'ͷ' => 'Ͷ', - 'ͻ' => 'Ͻ', - 'ͼ' => 'Ͼ', - 'ͽ' => 'Ͽ', - 'ά' => 'Ά', - 'έ' => 'Έ', - 'ή' => 'Ή', - 'ί' => 'Ί', - 'α' => 'Α', - 'β' => 'Β', - 'γ' => 'Γ', - 'δ' => 'Δ', - 'ε' => 'Ε', - 'ζ' => 'Ζ', - 'η' => 'Η', - 'θ' => 'Θ', - 'ι' => 'Ι', - 'κ' => 'Κ', - 'λ' => 'Λ', - 'μ' => 'Μ', - 'ν' => 'Ν', - 'ξ' => 'Ξ', - 'ο' => 'Ο', - 'π' => 'Π', - 'ρ' => 'Ρ', - 'ς' => 'Σ', - 'σ' => 'Σ', - 'τ' => 'Τ', - 'υ' => 'Υ', - 'φ' => 'Φ', - 'χ' => 'Χ', - 'ψ' => 'Ψ', - 'ω' => 'Ω', - 'ϊ' => 'Ϊ', - 'ϋ' => 'Ϋ', - 'ό' => 'Ό', - 'ύ' => 'Ύ', - 'ώ' => 'Ώ', - 'ϐ' => 'Β', - 'ϑ' => 'Θ', - 'ϕ' => 'Φ', - 'ϖ' => 'Π', - 'ϗ' => 'Ϗ', - 'ϙ' => 'Ϙ', - 'ϛ' => 'Ϛ', - 'ϝ' => 'Ϝ', - 'ϟ' => 'Ϟ', - 'ϡ' => 'Ϡ', - 'ϣ' => 'Ϣ', - 'ϥ' => 'Ϥ', - 'ϧ' => 'Ϧ', - 'ϩ' => 'Ϩ', - 'ϫ' => 'Ϫ', - 'ϭ' => 'Ϭ', - 'ϯ' => 'Ϯ', - 'ϰ' => 'Κ', - 'ϱ' => 'Ρ', - 'ϲ' => 'Ϲ', - 'ϳ' => 'Ϳ', - 'ϵ' => 'Ε', - 'ϸ' => 'Ϸ', - 'ϻ' => 'Ϻ', - 'а' => 'А', - 'б' => 'Б', - 'в' => 'В', - 'г' => 'Г', - 'д' => 'Д', - 'е' => 'Е', - 'ж' => 'Ж', - 'з' => 'З', - 'и' => 'И', - 'й' => 'Й', - 'к' => 'К', - 'л' => 'Л', - 'м' => 'М', - 'н' => 'Н', - 'о' => 'О', - 'п' => 'П', - 'р' => 'Р', - 'с' => 'С', - 'т' => 'Т', - 'у' => 'У', - 'ф' => 'Ф', - 'х' => 'Х', - 'ц' => 'Ц', - 'ч' => 'Ч', - 'ш' => 'Ш', - 'щ' => 'Щ', - 'ъ' => 'Ъ', - 'ы' => 'Ы', - 'ь' => 'Ь', - 'э' => 'Э', - 'ю' => 'Ю', - 'я' => 'Я', - 'ѐ' => 'Ѐ', - 'ё' => 'Ё', - 'ђ' => 'Ђ', - 'ѓ' => 'Ѓ', - 'є' => 'Є', - 'ѕ' => 'Ѕ', - 'і' => 'І', - 'ї' => 'Ї', - 'ј' => 'Ј', - 'љ' => 'Љ', - 'њ' => 'Њ', - 'ћ' => 'Ћ', - 'ќ' => 'Ќ', - 'ѝ' => 'Ѝ', - 'ў' => 'Ў', - 'џ' => 'Џ', - 'ѡ' => 'Ѡ', - 'ѣ' => 'Ѣ', - 'ѥ' => 'Ѥ', - 'ѧ' => 'Ѧ', - 'ѩ' => 'Ѩ', - 'ѫ' => 'Ѫ', - 'ѭ' => 'Ѭ', - 'ѯ' => 'Ѯ', - 'ѱ' => 'Ѱ', - 'ѳ' => 'Ѳ', - 'ѵ' => 'Ѵ', - 'ѷ' => 'Ѷ', - 'ѹ' => 'Ѹ', - 'ѻ' => 'Ѻ', - 'ѽ' => 'Ѽ', - 'ѿ' => 'Ѿ', - 'ҁ' => 'Ҁ', - 'ҋ' => 'Ҋ', - 'ҍ' => 'Ҍ', - 'ҏ' => 'Ҏ', - 'ґ' => 'Ґ', - 'ғ' => 'Ғ', - 'ҕ' => 'Ҕ', - 'җ' => 'Җ', - 'ҙ' => 'Ҙ', - 'қ' => 'Қ', - 'ҝ' => 'Ҝ', - 'ҟ' => 'Ҟ', - 'ҡ' => 'Ҡ', - 'ң' => 'Ң', - 'ҥ' => 'Ҥ', - 'ҧ' => 'Ҧ', - 'ҩ' => 'Ҩ', - 'ҫ' => 'Ҫ', - 'ҭ' => 'Ҭ', - 'ү' => 'Ү', - 'ұ' => 'Ұ', - 'ҳ' => 'Ҳ', - 'ҵ' => 'Ҵ', - 'ҷ' => 'Ҷ', - 'ҹ' => 'Ҹ', - 'һ' => 'Һ', - 'ҽ' => 'Ҽ', - 'ҿ' => 'Ҿ', - 'ӂ' => 'Ӂ', - 'ӄ' => 'Ӄ', - 'ӆ' => 'Ӆ', - 'ӈ' => 'Ӈ', - 'ӊ' => 'Ӊ', - 'ӌ' => 'Ӌ', - 'ӎ' => 'Ӎ', - 'ӏ' => 'Ӏ', - 'ӑ' => 'Ӑ', - 'ӓ' => 'Ӓ', - 'ӕ' => 'Ӕ', - 'ӗ' => 'Ӗ', - 'ә' => 'Ә', - 'ӛ' => 'Ӛ', - 'ӝ' => 'Ӝ', - 'ӟ' => 'Ӟ', - 'ӡ' => 'Ӡ', - 'ӣ' => 'Ӣ', - 'ӥ' => 'Ӥ', - 'ӧ' => 'Ӧ', - 'ө' => 'Ө', - 'ӫ' => 'Ӫ', - 'ӭ' => 'Ӭ', - 'ӯ' => 'Ӯ', - 'ӱ' => 'Ӱ', - 'ӳ' => 'Ӳ', - 'ӵ' => 'Ӵ', - 'ӷ' => 'Ӷ', - 'ӹ' => 'Ӹ', - 'ӻ' => 'Ӻ', - 'ӽ' => 'Ӽ', - 'ӿ' => 'Ӿ', - 'ԁ' => 'Ԁ', - 'ԃ' => 'Ԃ', - 'ԅ' => 'Ԅ', - 'ԇ' => 'Ԇ', - 'ԉ' => 'Ԉ', - 'ԋ' => 'Ԋ', - 'ԍ' => 'Ԍ', - 'ԏ' => 'Ԏ', - 'ԑ' => 'Ԑ', - 'ԓ' => 'Ԓ', - 'ԕ' => 'Ԕ', - 'ԗ' => 'Ԗ', - 'ԙ' => 'Ԙ', - 'ԛ' => 'Ԛ', - 'ԝ' => 'Ԝ', - 'ԟ' => 'Ԟ', - 'ԡ' => 'Ԡ', - 'ԣ' => 'Ԣ', - 'ԥ' => 'Ԥ', - 'ԧ' => 'Ԧ', - 'ԩ' => 'Ԩ', - 'ԫ' => 'Ԫ', - 'ԭ' => 'Ԭ', - 'ԯ' => 'Ԯ', - 'ա' => 'Ա', - 'բ' => 'Բ', - 'գ' => 'Գ', - 'դ' => 'Դ', - 'ե' => 'Ե', - 'զ' => 'Զ', - 'է' => 'Է', - 'ը' => 'Ը', - 'թ' => 'Թ', - 'ժ' => 'Ժ', - 'ի' => 'Ի', - 'լ' => 'Լ', - 'խ' => 'Խ', - 'ծ' => 'Ծ', - 'կ' => 'Կ', - 'հ' => 'Հ', - 'ձ' => 'Ձ', - 'ղ' => 'Ղ', - 'ճ' => 'Ճ', - 'մ' => 'Մ', - 'յ' => 'Յ', - 'ն' => 'Ն', - 'շ' => 'Շ', - 'ո' => 'Ո', - 'չ' => 'Չ', - 'պ' => 'Պ', - 'ջ' => 'Ջ', - 'ռ' => 'Ռ', - 'ս' => 'Ս', - 'վ' => 'Վ', - 'տ' => 'Տ', - 'ր' => 'Ր', - 'ց' => 'Ց', - 'ւ' => 'Ւ', - 'փ' => 'Փ', - 'ք' => 'Ք', - 'օ' => 'Օ', - 'ֆ' => 'Ֆ', - 'ა' => 'Ა', - 'ბ' => 'Ბ', - 'გ' => 'Გ', - 'დ' => 'Დ', - 'ე' => 'Ე', - 'ვ' => 'Ვ', - 'ზ' => 'Ზ', - 'თ' => 'Თ', - 'ი' => 'Ი', - 'კ' => 'Კ', - 'ლ' => 'Ლ', - 'მ' => 'Მ', - 'ნ' => 'Ნ', - 'ო' => 'Ო', - 'პ' => 'Პ', - 'ჟ' => 'Ჟ', - 'რ' => 'Რ', - 'ს' => 'Ს', - 'ტ' => 'Ტ', - 'უ' => 'Უ', - 'ფ' => 'Ფ', - 'ქ' => 'Ქ', - 'ღ' => 'Ღ', - 'ყ' => 'Ყ', - 'შ' => 'Შ', - 'ჩ' => 'Ჩ', - 'ც' => 'Ც', - 'ძ' => 'Ძ', - 'წ' => 'Წ', - 'ჭ' => 'Ჭ', - 'ხ' => 'Ხ', - 'ჯ' => 'Ჯ', - 'ჰ' => 'Ჰ', - 'ჱ' => 'Ჱ', - 'ჲ' => 'Ჲ', - 'ჳ' => 'Ჳ', - 'ჴ' => 'Ჴ', - 'ჵ' => 'Ჵ', - 'ჶ' => 'Ჶ', - 'ჷ' => 'Ჷ', - 'ჸ' => 'Ჸ', - 'ჹ' => 'Ჹ', - 'ჺ' => 'Ჺ', - 'ჽ' => 'Ჽ', - 'ჾ' => 'Ჾ', - 'ჿ' => 'Ჿ', - 'ᏸ' => 'Ᏸ', - 'ᏹ' => 'Ᏹ', - 'ᏺ' => 'Ᏺ', - 'ᏻ' => 'Ᏻ', - 'ᏼ' => 'Ᏼ', - 'ᏽ' => 'Ᏽ', - 'ᲀ' => 'В', - 'ᲁ' => 'Д', - 'ᲂ' => 'О', - 'ᲃ' => 'С', - 'ᲄ' => 'Т', - 'ᲅ' => 'Т', - 'ᲆ' => 'Ъ', - 'ᲇ' => 'Ѣ', - 'ᲈ' => 'Ꙋ', - 'ᵹ' => 'Ᵹ', - 'ᵽ' => 'Ᵽ', - 'ᶎ' => 'Ᶎ', - 'ḁ' => 'Ḁ', - 'ḃ' => 'Ḃ', - 'ḅ' => 'Ḅ', - 'ḇ' => 'Ḇ', - 'ḉ' => 'Ḉ', - 'ḋ' => 'Ḋ', - 'ḍ' => 'Ḍ', - 'ḏ' => 'Ḏ', - 'ḑ' => 'Ḑ', - 'ḓ' => 'Ḓ', - 'ḕ' => 'Ḕ', - 'ḗ' => 'Ḗ', - 'ḙ' => 'Ḙ', - 'ḛ' => 'Ḛ', - 'ḝ' => 'Ḝ', - 'ḟ' => 'Ḟ', - 'ḡ' => 'Ḡ', - 'ḣ' => 'Ḣ', - 'ḥ' => 'Ḥ', - 'ḧ' => 'Ḧ', - 'ḩ' => 'Ḩ', - 'ḫ' => 'Ḫ', - 'ḭ' => 'Ḭ', - 'ḯ' => 'Ḯ', - 'ḱ' => 'Ḱ', - 'ḳ' => 'Ḳ', - 'ḵ' => 'Ḵ', - 'ḷ' => 'Ḷ', - 'ḹ' => 'Ḹ', - 'ḻ' => 'Ḻ', - 'ḽ' => 'Ḽ', - 'ḿ' => 'Ḿ', - 'ṁ' => 'Ṁ', - 'ṃ' => 'Ṃ', - 'ṅ' => 'Ṅ', - 'ṇ' => 'Ṇ', - 'ṉ' => 'Ṉ', - 'ṋ' => 'Ṋ', - 'ṍ' => 'Ṍ', - 'ṏ' => 'Ṏ', - 'ṑ' => 'Ṑ', - 'ṓ' => 'Ṓ', - 'ṕ' => 'Ṕ', - 'ṗ' => 'Ṗ', - 'ṙ' => 'Ṙ', - 'ṛ' => 'Ṛ', - 'ṝ' => 'Ṝ', - 'ṟ' => 'Ṟ', - 'ṡ' => 'Ṡ', - 'ṣ' => 'Ṣ', - 'ṥ' => 'Ṥ', - 'ṧ' => 'Ṧ', - 'ṩ' => 'Ṩ', - 'ṫ' => 'Ṫ', - 'ṭ' => 'Ṭ', - 'ṯ' => 'Ṯ', - 'ṱ' => 'Ṱ', - 'ṳ' => 'Ṳ', - 'ṵ' => 'Ṵ', - 'ṷ' => 'Ṷ', - 'ṹ' => 'Ṹ', - 'ṻ' => 'Ṻ', - 'ṽ' => 'Ṽ', - 'ṿ' => 'Ṿ', - 'ẁ' => 'Ẁ', - 'ẃ' => 'Ẃ', - 'ẅ' => 'Ẅ', - 'ẇ' => 'Ẇ', - 'ẉ' => 'Ẉ', - 'ẋ' => 'Ẋ', - 'ẍ' => 'Ẍ', - 'ẏ' => 'Ẏ', - 'ẑ' => 'Ẑ', - 'ẓ' => 'Ẓ', - 'ẕ' => 'Ẕ', - 'ẛ' => 'Ṡ', - 'ạ' => 'Ạ', - 'ả' => 'Ả', - 'ấ' => 'Ấ', - 'ầ' => 'Ầ', - 'ẩ' => 'Ẩ', - 'ẫ' => 'Ẫ', - 'ậ' => 'Ậ', - 'ắ' => 'Ắ', - 'ằ' => 'Ằ', - 'ẳ' => 'Ẳ', - 'ẵ' => 'Ẵ', - 'ặ' => 'Ặ', - 'ẹ' => 'Ẹ', - 'ẻ' => 'Ẻ', - 'ẽ' => 'Ẽ', - 'ế' => 'Ế', - 'ề' => 'Ề', - 'ể' => 'Ể', - 'ễ' => 'Ễ', - 'ệ' => 'Ệ', - 'ỉ' => 'Ỉ', - 'ị' => 'Ị', - 'ọ' => 'Ọ', - 'ỏ' => 'Ỏ', - 'ố' => 'Ố', - 'ồ' => 'Ồ', - 'ổ' => 'Ổ', - 'ỗ' => 'Ỗ', - 'ộ' => 'Ộ', - 'ớ' => 'Ớ', - 'ờ' => 'Ờ', - 'ở' => 'Ở', - 'ỡ' => 'Ỡ', - 'ợ' => 'Ợ', - 'ụ' => 'Ụ', - 'ủ' => 'Ủ', - 'ứ' => 'Ứ', - 'ừ' => 'Ừ', - 'ử' => 'Ử', - 'ữ' => 'Ữ', - 'ự' => 'Ự', - 'ỳ' => 'Ỳ', - 'ỵ' => 'Ỵ', - 'ỷ' => 'Ỷ', - 'ỹ' => 'Ỹ', - 'ỻ' => 'Ỻ', - 'ỽ' => 'Ỽ', - 'ỿ' => 'Ỿ', - 'ἀ' => 'Ἀ', - 'ἁ' => 'Ἁ', - 'ἂ' => 'Ἂ', - 'ἃ' => 'Ἃ', - 'ἄ' => 'Ἄ', - 'ἅ' => 'Ἅ', - 'ἆ' => 'Ἆ', - 'ἇ' => 'Ἇ', - 'ἐ' => 'Ἐ', - 'ἑ' => 'Ἑ', - 'ἒ' => 'Ἒ', - 'ἓ' => 'Ἓ', - 'ἔ' => 'Ἔ', - 'ἕ' => 'Ἕ', - 'ἠ' => 'Ἠ', - 'ἡ' => 'Ἡ', - 'ἢ' => 'Ἢ', - 'ἣ' => 'Ἣ', - 'ἤ' => 'Ἤ', - 'ἥ' => 'Ἥ', - 'ἦ' => 'Ἦ', - 'ἧ' => 'Ἧ', - 'ἰ' => 'Ἰ', - 'ἱ' => 'Ἱ', - 'ἲ' => 'Ἲ', - 'ἳ' => 'Ἳ', - 'ἴ' => 'Ἴ', - 'ἵ' => 'Ἵ', - 'ἶ' => 'Ἶ', - 'ἷ' => 'Ἷ', - 'ὀ' => 'Ὀ', - 'ὁ' => 'Ὁ', - 'ὂ' => 'Ὂ', - 'ὃ' => 'Ὃ', - 'ὄ' => 'Ὄ', - 'ὅ' => 'Ὅ', - 'ὑ' => 'Ὑ', - 'ὓ' => 'Ὓ', - 'ὕ' => 'Ὕ', - 'ὗ' => 'Ὗ', - 'ὠ' => 'Ὠ', - 'ὡ' => 'Ὡ', - 'ὢ' => 'Ὢ', - 'ὣ' => 'Ὣ', - 'ὤ' => 'Ὤ', - 'ὥ' => 'Ὥ', - 'ὦ' => 'Ὦ', - 'ὧ' => 'Ὧ', - 'ὰ' => 'Ὰ', - 'ά' => 'Ά', - 'ὲ' => 'Ὲ', - 'έ' => 'Έ', - 'ὴ' => 'Ὴ', - 'ή' => 'Ή', - 'ὶ' => 'Ὶ', - 'ί' => 'Ί', - 'ὸ' => 'Ὸ', - 'ό' => 'Ό', - 'ὺ' => 'Ὺ', - 'ύ' => 'Ύ', - 'ὼ' => 'Ὼ', - 'ώ' => 'Ώ', - 'ᾀ' => 'ᾈ', - 'ᾁ' => 'ᾉ', - 'ᾂ' => 'ᾊ', - 'ᾃ' => 'ᾋ', - 'ᾄ' => 'ᾌ', - 'ᾅ' => 'ᾍ', - 'ᾆ' => 'ᾎ', - 'ᾇ' => 'ᾏ', - 'ᾐ' => 'ᾘ', - 'ᾑ' => 'ᾙ', - 'ᾒ' => 'ᾚ', - 'ᾓ' => 'ᾛ', - 'ᾔ' => 'ᾜ', - 'ᾕ' => 'ᾝ', - 'ᾖ' => 'ᾞ', - 'ᾗ' => 'ᾟ', - 'ᾠ' => 'ᾨ', - 'ᾡ' => 'ᾩ', - 'ᾢ' => 'ᾪ', - 'ᾣ' => 'ᾫ', - 'ᾤ' => 'ᾬ', - 'ᾥ' => 'ᾭ', - 'ᾦ' => 'ᾮ', - 'ᾧ' => 'ᾯ', - 'ᾰ' => 'Ᾰ', - 'ᾱ' => 'Ᾱ', - 'ᾳ' => 'ᾼ', - 'ι' => 'Ι', - 'ῃ' => 'ῌ', - 'ῐ' => 'Ῐ', - 'ῑ' => 'Ῑ', - 'ῠ' => 'Ῠ', - 'ῡ' => 'Ῡ', - 'ῥ' => 'Ῥ', - 'ῳ' => 'ῼ', - 'ⅎ' => 'Ⅎ', - 'ⅰ' => 'Ⅰ', - 'ⅱ' => 'Ⅱ', - 'ⅲ' => 'Ⅲ', - 'ⅳ' => 'Ⅳ', - 'ⅴ' => 'Ⅴ', - 'ⅵ' => 'Ⅵ', - 'ⅶ' => 'Ⅶ', - 'ⅷ' => 'Ⅷ', - 'ⅸ' => 'Ⅸ', - 'ⅹ' => 'Ⅹ', - 'ⅺ' => 'Ⅺ', - 'ⅻ' => 'Ⅻ', - 'ⅼ' => 'Ⅼ', - 'ⅽ' => 'Ⅽ', - 'ⅾ' => 'Ⅾ', - 'ⅿ' => 'Ⅿ', - 'ↄ' => 'Ↄ', - 'ⓐ' => 'Ⓐ', - 'ⓑ' => 'Ⓑ', - 'ⓒ' => 'Ⓒ', - 'ⓓ' => 'Ⓓ', - 'ⓔ' => 'Ⓔ', - 'ⓕ' => 'Ⓕ', - 'ⓖ' => 'Ⓖ', - 'ⓗ' => 'Ⓗ', - 'ⓘ' => 'Ⓘ', - 'ⓙ' => 'Ⓙ', - 'ⓚ' => 'Ⓚ', - 'ⓛ' => 'Ⓛ', - 'ⓜ' => 'Ⓜ', - 'ⓝ' => 'Ⓝ', - 'ⓞ' => 'Ⓞ', - 'ⓟ' => 'Ⓟ', - 'ⓠ' => 'Ⓠ', - 'ⓡ' => 'Ⓡ', - 'ⓢ' => 'Ⓢ', - 'ⓣ' => 'Ⓣ', - 'ⓤ' => 'Ⓤ', - 'ⓥ' => 'Ⓥ', - 'ⓦ' => 'Ⓦ', - 'ⓧ' => 'Ⓧ', - 'ⓨ' => 'Ⓨ', - 'ⓩ' => 'Ⓩ', - 'ⰰ' => 'Ⰰ', - 'ⰱ' => 'Ⰱ', - 'ⰲ' => 'Ⰲ', - 'ⰳ' => 'Ⰳ', - 'ⰴ' => 'Ⰴ', - 'ⰵ' => 'Ⰵ', - 'ⰶ' => 'Ⰶ', - 'ⰷ' => 'Ⰷ', - 'ⰸ' => 'Ⰸ', - 'ⰹ' => 'Ⰹ', - 'ⰺ' => 'Ⰺ', - 'ⰻ' => 'Ⰻ', - 'ⰼ' => 'Ⰼ', - 'ⰽ' => 'Ⰽ', - 'ⰾ' => 'Ⰾ', - 'ⰿ' => 'Ⰿ', - 'ⱀ' => 'Ⱀ', - 'ⱁ' => 'Ⱁ', - 'ⱂ' => 'Ⱂ', - 'ⱃ' => 'Ⱃ', - 'ⱄ' => 'Ⱄ', - 'ⱅ' => 'Ⱅ', - 'ⱆ' => 'Ⱆ', - 'ⱇ' => 'Ⱇ', - 'ⱈ' => 'Ⱈ', - 'ⱉ' => 'Ⱉ', - 'ⱊ' => 'Ⱊ', - 'ⱋ' => 'Ⱋ', - 'ⱌ' => 'Ⱌ', - 'ⱍ' => 'Ⱍ', - 'ⱎ' => 'Ⱎ', - 'ⱏ' => 'Ⱏ', - 'ⱐ' => 'Ⱐ', - 'ⱑ' => 'Ⱑ', - 'ⱒ' => 'Ⱒ', - 'ⱓ' => 'Ⱓ', - 'ⱔ' => 'Ⱔ', - 'ⱕ' => 'Ⱕ', - 'ⱖ' => 'Ⱖ', - 'ⱗ' => 'Ⱗ', - 'ⱘ' => 'Ⱘ', - 'ⱙ' => 'Ⱙ', - 'ⱚ' => 'Ⱚ', - 'ⱛ' => 'Ⱛ', - 'ⱜ' => 'Ⱜ', - 'ⱝ' => 'Ⱝ', - 'ⱞ' => 'Ⱞ', - 'ⱡ' => 'Ⱡ', - 'ⱥ' => 'Ⱥ', - 'ⱦ' => 'Ⱦ', - 'ⱨ' => 'Ⱨ', - 'ⱪ' => 'Ⱪ', - 'ⱬ' => 'Ⱬ', - 'ⱳ' => 'Ⱳ', - 'ⱶ' => 'Ⱶ', - 'ⲁ' => 'Ⲁ', - 'ⲃ' => 'Ⲃ', - 'ⲅ' => 'Ⲅ', - 'ⲇ' => 'Ⲇ', - 'ⲉ' => 'Ⲉ', - 'ⲋ' => 'Ⲋ', - 'ⲍ' => 'Ⲍ', - 'ⲏ' => 'Ⲏ', - 'ⲑ' => 'Ⲑ', - 'ⲓ' => 'Ⲓ', - 'ⲕ' => 'Ⲕ', - 'ⲗ' => 'Ⲗ', - 'ⲙ' => 'Ⲙ', - 'ⲛ' => 'Ⲛ', - 'ⲝ' => 'Ⲝ', - 'ⲟ' => 'Ⲟ', - 'ⲡ' => 'Ⲡ', - 'ⲣ' => 'Ⲣ', - 'ⲥ' => 'Ⲥ', - 'ⲧ' => 'Ⲧ', - 'ⲩ' => 'Ⲩ', - 'ⲫ' => 'Ⲫ', - 'ⲭ' => 'Ⲭ', - 'ⲯ' => 'Ⲯ', - 'ⲱ' => 'Ⲱ', - 'ⲳ' => 'Ⲳ', - 'ⲵ' => 'Ⲵ', - 'ⲷ' => 'Ⲷ', - 'ⲹ' => 'Ⲹ', - 'ⲻ' => 'Ⲻ', - 'ⲽ' => 'Ⲽ', - 'ⲿ' => 'Ⲿ', - 'ⳁ' => 'Ⳁ', - 'ⳃ' => 'Ⳃ', - 'ⳅ' => 'Ⳅ', - 'ⳇ' => 'Ⳇ', - 'ⳉ' => 'Ⳉ', - 'ⳋ' => 'Ⳋ', - 'ⳍ' => 'Ⳍ', - 'ⳏ' => 'Ⳏ', - 'ⳑ' => 'Ⳑ', - 'ⳓ' => 'Ⳓ', - 'ⳕ' => 'Ⳕ', - 'ⳗ' => 'Ⳗ', - 'ⳙ' => 'Ⳙ', - 'ⳛ' => 'Ⳛ', - 'ⳝ' => 'Ⳝ', - 'ⳟ' => 'Ⳟ', - 'ⳡ' => 'Ⳡ', - 'ⳣ' => 'Ⳣ', - 'ⳬ' => 'Ⳬ', - 'ⳮ' => 'Ⳮ', - 'ⳳ' => 'Ⳳ', - 'ⴀ' => 'Ⴀ', - 'ⴁ' => 'Ⴁ', - 'ⴂ' => 'Ⴂ', - 'ⴃ' => 'Ⴃ', - 'ⴄ' => 'Ⴄ', - 'ⴅ' => 'Ⴅ', - 'ⴆ' => 'Ⴆ', - 'ⴇ' => 'Ⴇ', - 'ⴈ' => 'Ⴈ', - 'ⴉ' => 'Ⴉ', - 'ⴊ' => 'Ⴊ', - 'ⴋ' => 'Ⴋ', - 'ⴌ' => 'Ⴌ', - 'ⴍ' => 'Ⴍ', - 'ⴎ' => 'Ⴎ', - 'ⴏ' => 'Ⴏ', - 'ⴐ' => 'Ⴐ', - 'ⴑ' => 'Ⴑ', - 'ⴒ' => 'Ⴒ', - 'ⴓ' => 'Ⴓ', - 'ⴔ' => 'Ⴔ', - 'ⴕ' => 'Ⴕ', - 'ⴖ' => 'Ⴖ', - 'ⴗ' => 'Ⴗ', - 'ⴘ' => 'Ⴘ', - 'ⴙ' => 'Ⴙ', - 'ⴚ' => 'Ⴚ', - 'ⴛ' => 'Ⴛ', - 'ⴜ' => 'Ⴜ', - 'ⴝ' => 'Ⴝ', - 'ⴞ' => 'Ⴞ', - 'ⴟ' => 'Ⴟ', - 'ⴠ' => 'Ⴠ', - 'ⴡ' => 'Ⴡ', - 'ⴢ' => 'Ⴢ', - 'ⴣ' => 'Ⴣ', - 'ⴤ' => 'Ⴤ', - 'ⴥ' => 'Ⴥ', - 'ⴧ' => 'Ⴧ', - 'ⴭ' => 'Ⴭ', - 'ꙁ' => 'Ꙁ', - 'ꙃ' => 'Ꙃ', - 'ꙅ' => 'Ꙅ', - 'ꙇ' => 'Ꙇ', - 'ꙉ' => 'Ꙉ', - 'ꙋ' => 'Ꙋ', - 'ꙍ' => 'Ꙍ', - 'ꙏ' => 'Ꙏ', - 'ꙑ' => 'Ꙑ', - 'ꙓ' => 'Ꙓ', - 'ꙕ' => 'Ꙕ', - 'ꙗ' => 'Ꙗ', - 'ꙙ' => 'Ꙙ', - 'ꙛ' => 'Ꙛ', - 'ꙝ' => 'Ꙝ', - 'ꙟ' => 'Ꙟ', - 'ꙡ' => 'Ꙡ', - 'ꙣ' => 'Ꙣ', - 'ꙥ' => 'Ꙥ', - 'ꙧ' => 'Ꙧ', - 'ꙩ' => 'Ꙩ', - 'ꙫ' => 'Ꙫ', - 'ꙭ' => 'Ꙭ', - 'ꚁ' => 'Ꚁ', - 'ꚃ' => 'Ꚃ', - 'ꚅ' => 'Ꚅ', - 'ꚇ' => 'Ꚇ', - 'ꚉ' => 'Ꚉ', - 'ꚋ' => 'Ꚋ', - 'ꚍ' => 'Ꚍ', - 'ꚏ' => 'Ꚏ', - 'ꚑ' => 'Ꚑ', - 'ꚓ' => 'Ꚓ', - 'ꚕ' => 'Ꚕ', - 'ꚗ' => 'Ꚗ', - 'ꚙ' => 'Ꚙ', - 'ꚛ' => 'Ꚛ', - 'ꜣ' => 'Ꜣ', - 'ꜥ' => 'Ꜥ', - 'ꜧ' => 'Ꜧ', - 'ꜩ' => 'Ꜩ', - 'ꜫ' => 'Ꜫ', - 'ꜭ' => 'Ꜭ', - 'ꜯ' => 'Ꜯ', - 'ꜳ' => 'Ꜳ', - 'ꜵ' => 'Ꜵ', - 'ꜷ' => 'Ꜷ', - 'ꜹ' => 'Ꜹ', - 'ꜻ' => 'Ꜻ', - 'ꜽ' => 'Ꜽ', - 'ꜿ' => 'Ꜿ', - 'ꝁ' => 'Ꝁ', - 'ꝃ' => 'Ꝃ', - 'ꝅ' => 'Ꝅ', - 'ꝇ' => 'Ꝇ', - 'ꝉ' => 'Ꝉ', - 'ꝋ' => 'Ꝋ', - 'ꝍ' => 'Ꝍ', - 'ꝏ' => 'Ꝏ', - 'ꝑ' => 'Ꝑ', - 'ꝓ' => 'Ꝓ', - 'ꝕ' => 'Ꝕ', - 'ꝗ' => 'Ꝗ', - 'ꝙ' => 'Ꝙ', - 'ꝛ' => 'Ꝛ', - 'ꝝ' => 'Ꝝ', - 'ꝟ' => 'Ꝟ', - 'ꝡ' => 'Ꝡ', - 'ꝣ' => 'Ꝣ', - 'ꝥ' => 'Ꝥ', - 'ꝧ' => 'Ꝧ', - 'ꝩ' => 'Ꝩ', - 'ꝫ' => 'Ꝫ', - 'ꝭ' => 'Ꝭ', - 'ꝯ' => 'Ꝯ', - 'ꝺ' => 'Ꝺ', - 'ꝼ' => 'Ꝼ', - 'ꝿ' => 'Ꝿ', - 'ꞁ' => 'Ꞁ', - 'ꞃ' => 'Ꞃ', - 'ꞅ' => 'Ꞅ', - 'ꞇ' => 'Ꞇ', - 'ꞌ' => 'Ꞌ', - 'ꞑ' => 'Ꞑ', - 'ꞓ' => 'Ꞓ', - 'ꞔ' => 'Ꞔ', - 'ꞗ' => 'Ꞗ', - 'ꞙ' => 'Ꞙ', - 'ꞛ' => 'Ꞛ', - 'ꞝ' => 'Ꞝ', - 'ꞟ' => 'Ꞟ', - 'ꞡ' => 'Ꞡ', - 'ꞣ' => 'Ꞣ', - 'ꞥ' => 'Ꞥ', - 'ꞧ' => 'Ꞧ', - 'ꞩ' => 'Ꞩ', - 'ꞵ' => 'Ꞵ', - 'ꞷ' => 'Ꞷ', - 'ꞹ' => 'Ꞹ', - 'ꞻ' => 'Ꞻ', - 'ꞽ' => 'Ꞽ', - 'ꞿ' => 'Ꞿ', - 'ꟃ' => 'Ꟃ', - 'ꟈ' => 'Ꟈ', - 'ꟊ' => 'Ꟊ', - 'ꟶ' => 'Ꟶ', - 'ꭓ' => 'Ꭓ', - 'ꭰ' => 'Ꭰ', - 'ꭱ' => 'Ꭱ', - 'ꭲ' => 'Ꭲ', - 'ꭳ' => 'Ꭳ', - 'ꭴ' => 'Ꭴ', - 'ꭵ' => 'Ꭵ', - 'ꭶ' => 'Ꭶ', - 'ꭷ' => 'Ꭷ', - 'ꭸ' => 'Ꭸ', - 'ꭹ' => 'Ꭹ', - 'ꭺ' => 'Ꭺ', - 'ꭻ' => 'Ꭻ', - 'ꭼ' => 'Ꭼ', - 'ꭽ' => 'Ꭽ', - 'ꭾ' => 'Ꭾ', - 'ꭿ' => 'Ꭿ', - 'ꮀ' => 'Ꮀ', - 'ꮁ' => 'Ꮁ', - 'ꮂ' => 'Ꮂ', - 'ꮃ' => 'Ꮃ', - 'ꮄ' => 'Ꮄ', - 'ꮅ' => 'Ꮅ', - 'ꮆ' => 'Ꮆ', - 'ꮇ' => 'Ꮇ', - 'ꮈ' => 'Ꮈ', - 'ꮉ' => 'Ꮉ', - 'ꮊ' => 'Ꮊ', - 'ꮋ' => 'Ꮋ', - 'ꮌ' => 'Ꮌ', - 'ꮍ' => 'Ꮍ', - 'ꮎ' => 'Ꮎ', - 'ꮏ' => 'Ꮏ', - 'ꮐ' => 'Ꮐ', - 'ꮑ' => 'Ꮑ', - 'ꮒ' => 'Ꮒ', - 'ꮓ' => 'Ꮓ', - 'ꮔ' => 'Ꮔ', - 'ꮕ' => 'Ꮕ', - 'ꮖ' => 'Ꮖ', - 'ꮗ' => 'Ꮗ', - 'ꮘ' => 'Ꮘ', - 'ꮙ' => 'Ꮙ', - 'ꮚ' => 'Ꮚ', - 'ꮛ' => 'Ꮛ', - 'ꮜ' => 'Ꮜ', - 'ꮝ' => 'Ꮝ', - 'ꮞ' => 'Ꮞ', - 'ꮟ' => 'Ꮟ', - 'ꮠ' => 'Ꮠ', - 'ꮡ' => 'Ꮡ', - 'ꮢ' => 'Ꮢ', - 'ꮣ' => 'Ꮣ', - 'ꮤ' => 'Ꮤ', - 'ꮥ' => 'Ꮥ', - 'ꮦ' => 'Ꮦ', - 'ꮧ' => 'Ꮧ', - 'ꮨ' => 'Ꮨ', - 'ꮩ' => 'Ꮩ', - 'ꮪ' => 'Ꮪ', - 'ꮫ' => 'Ꮫ', - 'ꮬ' => 'Ꮬ', - 'ꮭ' => 'Ꮭ', - 'ꮮ' => 'Ꮮ', - 'ꮯ' => 'Ꮯ', - 'ꮰ' => 'Ꮰ', - 'ꮱ' => 'Ꮱ', - 'ꮲ' => 'Ꮲ', - 'ꮳ' => 'Ꮳ', - 'ꮴ' => 'Ꮴ', - 'ꮵ' => 'Ꮵ', - 'ꮶ' => 'Ꮶ', - 'ꮷ' => 'Ꮷ', - 'ꮸ' => 'Ꮸ', - 'ꮹ' => 'Ꮹ', - 'ꮺ' => 'Ꮺ', - 'ꮻ' => 'Ꮻ', - 'ꮼ' => 'Ꮼ', - 'ꮽ' => 'Ꮽ', - 'ꮾ' => 'Ꮾ', - 'ꮿ' => 'Ꮿ', - 'a' => 'A', - 'b' => 'B', - 'c' => 'C', - 'd' => 'D', - 'e' => 'E', - 'f' => 'F', - 'g' => 'G', - 'h' => 'H', - 'i' => 'I', - 'j' => 'J', - 'k' => 'K', - 'l' => 'L', - 'm' => 'M', - 'n' => 'N', - 'o' => 'O', - 'p' => 'P', - 'q' => 'Q', - 'r' => 'R', - 's' => 'S', - 't' => 'T', - 'u' => 'U', - 'v' => 'V', - 'w' => 'W', - 'x' => 'X', - 'y' => 'Y', - 'z' => 'Z', - '𐐨' => '𐐀', - '𐐩' => '𐐁', - '𐐪' => '𐐂', - '𐐫' => '𐐃', - '𐐬' => '𐐄', - '𐐭' => '𐐅', - '𐐮' => '𐐆', - '𐐯' => '𐐇', - '𐐰' => '𐐈', - '𐐱' => '𐐉', - '𐐲' => '𐐊', - '𐐳' => '𐐋', - '𐐴' => '𐐌', - '𐐵' => '𐐍', - '𐐶' => '𐐎', - '𐐷' => '𐐏', - '𐐸' => '𐐐', - '𐐹' => '𐐑', - '𐐺' => '𐐒', - '𐐻' => '𐐓', - '𐐼' => '𐐔', - '𐐽' => '𐐕', - '𐐾' => '𐐖', - '𐐿' => '𐐗', - '𐑀' => '𐐘', - '𐑁' => '𐐙', - '𐑂' => '𐐚', - '𐑃' => '𐐛', - '𐑄' => '𐐜', - '𐑅' => '𐐝', - '𐑆' => '𐐞', - '𐑇' => '𐐟', - '𐑈' => '𐐠', - '𐑉' => '𐐡', - '𐑊' => '𐐢', - '𐑋' => '𐐣', - '𐑌' => '𐐤', - '𐑍' => '𐐥', - '𐑎' => '𐐦', - '𐑏' => '𐐧', - '𐓘' => '𐒰', - '𐓙' => '𐒱', - '𐓚' => '𐒲', - '𐓛' => '𐒳', - '𐓜' => '𐒴', - '𐓝' => '𐒵', - '𐓞' => '𐒶', - '𐓟' => '𐒷', - '𐓠' => '𐒸', - '𐓡' => '𐒹', - '𐓢' => '𐒺', - '𐓣' => '𐒻', - '𐓤' => '𐒼', - '𐓥' => '𐒽', - '𐓦' => '𐒾', - '𐓧' => '𐒿', - '𐓨' => '𐓀', - '𐓩' => '𐓁', - '𐓪' => '𐓂', - '𐓫' => '𐓃', - '𐓬' => '𐓄', - '𐓭' => '𐓅', - '𐓮' => '𐓆', - '𐓯' => '𐓇', - '𐓰' => '𐓈', - '𐓱' => '𐓉', - '𐓲' => '𐓊', - '𐓳' => '𐓋', - '𐓴' => '𐓌', - '𐓵' => '𐓍', - '𐓶' => '𐓎', - '𐓷' => '𐓏', - '𐓸' => '𐓐', - '𐓹' => '𐓑', - '𐓺' => '𐓒', - '𐓻' => '𐓓', - '𐳀' => '𐲀', - '𐳁' => '𐲁', - '𐳂' => '𐲂', - '𐳃' => '𐲃', - '𐳄' => '𐲄', - '𐳅' => '𐲅', - '𐳆' => '𐲆', - '𐳇' => '𐲇', - '𐳈' => '𐲈', - '𐳉' => '𐲉', - '𐳊' => '𐲊', - '𐳋' => '𐲋', - '𐳌' => '𐲌', - '𐳍' => '𐲍', - '𐳎' => '𐲎', - '𐳏' => '𐲏', - '𐳐' => '𐲐', - '𐳑' => '𐲑', - '𐳒' => '𐲒', - '𐳓' => '𐲓', - '𐳔' => '𐲔', - '𐳕' => '𐲕', - '𐳖' => '𐲖', - '𐳗' => '𐲗', - '𐳘' => '𐲘', - '𐳙' => '𐲙', - '𐳚' => '𐲚', - '𐳛' => '𐲛', - '𐳜' => '𐲜', - '𐳝' => '𐲝', - '𐳞' => '𐲞', - '𐳟' => '𐲟', - '𐳠' => '𐲠', - '𐳡' => '𐲡', - '𐳢' => '𐲢', - '𐳣' => '𐲣', - '𐳤' => '𐲤', - '𐳥' => '𐲥', - '𐳦' => '𐲦', - '𐳧' => '𐲧', - '𐳨' => '𐲨', - '𐳩' => '𐲩', - '𐳪' => '𐲪', - '𐳫' => '𐲫', - '𐳬' => '𐲬', - '𐳭' => '𐲭', - '𐳮' => '𐲮', - '𐳯' => '𐲯', - '𐳰' => '𐲰', - '𐳱' => '𐲱', - '𐳲' => '𐲲', - '𑣀' => '𑢠', - '𑣁' => '𑢡', - '𑣂' => '𑢢', - '𑣃' => '𑢣', - '𑣄' => '𑢤', - '𑣅' => '𑢥', - '𑣆' => '𑢦', - '𑣇' => '𑢧', - '𑣈' => '𑢨', - '𑣉' => '𑢩', - '𑣊' => '𑢪', - '𑣋' => '𑢫', - '𑣌' => '𑢬', - '𑣍' => '𑢭', - '𑣎' => '𑢮', - '𑣏' => '𑢯', - '𑣐' => '𑢰', - '𑣑' => '𑢱', - '𑣒' => '𑢲', - '𑣓' => '𑢳', - '𑣔' => '𑢴', - '𑣕' => '𑢵', - '𑣖' => '𑢶', - '𑣗' => '𑢷', - '𑣘' => '𑢸', - '𑣙' => '𑢹', - '𑣚' => '𑢺', - '𑣛' => '𑢻', - '𑣜' => '𑢼', - '𑣝' => '𑢽', - '𑣞' => '𑢾', - '𑣟' => '𑢿', - '𖹠' => '𖹀', - '𖹡' => '𖹁', - '𖹢' => '𖹂', - '𖹣' => '𖹃', - '𖹤' => '𖹄', - '𖹥' => '𖹅', - '𖹦' => '𖹆', - '𖹧' => '𖹇', - '𖹨' => '𖹈', - '𖹩' => '𖹉', - '𖹪' => '𖹊', - '𖹫' => '𖹋', - '𖹬' => '𖹌', - '𖹭' => '𖹍', - '𖹮' => '𖹎', - '𖹯' => '𖹏', - '𖹰' => '𖹐', - '𖹱' => '𖹑', - '𖹲' => '𖹒', - '𖹳' => '𖹓', - '𖹴' => '𖹔', - '𖹵' => '𖹕', - '𖹶' => '𖹖', - '𖹷' => '𖹗', - '𖹸' => '𖹘', - '𖹹' => '𖹙', - '𖹺' => '𖹚', - '𖹻' => '𖹛', - '𖹼' => '𖹜', - '𖹽' => '𖹝', - '𖹾' => '𖹞', - '𖹿' => '𖹟', - '𞤢' => '𞤀', - '𞤣' => '𞤁', - '𞤤' => '𞤂', - '𞤥' => '𞤃', - '𞤦' => '𞤄', - '𞤧' => '𞤅', - '𞤨' => '𞤆', - '𞤩' => '𞤇', - '𞤪' => '𞤈', - '𞤫' => '𞤉', - '𞤬' => '𞤊', - '𞤭' => '𞤋', - '𞤮' => '𞤌', - '𞤯' => '𞤍', - '𞤰' => '𞤎', - '𞤱' => '𞤏', - '𞤲' => '𞤐', - '𞤳' => '𞤑', - '𞤴' => '𞤒', - '𞤵' => '𞤓', - '𞤶' => '𞤔', - '𞤷' => '𞤕', - '𞤸' => '𞤖', - '𞤹' => '𞤗', - '𞤺' => '𞤘', - '𞤻' => '𞤙', - '𞤼' => '𞤚', - '𞤽' => '𞤛', - '𞤾' => '𞤜', - '𞤿' => '𞤝', - '𞥀' => '𞤞', - '𞥁' => '𞤟', - '𞥂' => '𞤠', - '𞥃' => '𞤡', -); diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php deleted file mode 100644 index b36a092..0000000 --- a/vendor/symfony/polyfill-mbstring/bootstrap.php +++ /dev/null @@ -1,141 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Mbstring as p; - -if (!function_exists('mb_convert_encoding')) { - function mb_convert_encoding($s, $to, $from = null) { return p\Mbstring::mb_convert_encoding($s, $to, $from); } -} -if (!function_exists('mb_decode_mimeheader')) { - function mb_decode_mimeheader($s) { return p\Mbstring::mb_decode_mimeheader($s); } -} -if (!function_exists('mb_encode_mimeheader')) { - function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent); } -} -if (!function_exists('mb_decode_numericentity')) { - function mb_decode_numericentity($s, $convmap, $enc = null) { return p\Mbstring::mb_decode_numericentity($s, $convmap, $enc); } -} -if (!function_exists('mb_encode_numericentity')) { - function mb_encode_numericentity($s, $convmap, $enc = null, $is_hex = false) { return p\Mbstring::mb_encode_numericentity($s, $convmap, $enc, $is_hex); } -} -if (!function_exists('mb_convert_case')) { - function mb_convert_case($s, $mode, $enc = null) { return p\Mbstring::mb_convert_case($s, $mode, $enc); } -} -if (!function_exists('mb_internal_encoding')) { - function mb_internal_encoding($enc = null) { return p\Mbstring::mb_internal_encoding($enc); } -} -if (!function_exists('mb_language')) { - function mb_language($lang = null) { return p\Mbstring::mb_language($lang); } -} -if (!function_exists('mb_list_encodings')) { - function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } -} -if (!function_exists('mb_encoding_aliases')) { - function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } -} -if (!function_exists('mb_check_encoding')) { - function mb_check_encoding($var = null, $encoding = null) { return p\Mbstring::mb_check_encoding($var, $encoding); } -} -if (!function_exists('mb_detect_encoding')) { - function mb_detect_encoding($str, $encodingList = null, $strict = false) { return p\Mbstring::mb_detect_encoding($str, $encodingList, $strict); } -} -if (!function_exists('mb_detect_order')) { - function mb_detect_order($encodingList = null) { return p\Mbstring::mb_detect_order($encodingList); } -} -if (!function_exists('mb_parse_str')) { - function mb_parse_str($s, &$result = array()) { parse_str($s, $result); } -} -if (!function_exists('mb_strlen')) { - function mb_strlen($s, $enc = null) { return p\Mbstring::mb_strlen($s, $enc); } -} -if (!function_exists('mb_strpos')) { - function mb_strpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strpos($s, $needle, $offset, $enc); } -} -if (!function_exists('mb_strtolower')) { - function mb_strtolower($s, $enc = null) { return p\Mbstring::mb_strtolower($s, $enc); } -} -if (!function_exists('mb_strtoupper')) { - function mb_strtoupper($s, $enc = null) { return p\Mbstring::mb_strtoupper($s, $enc); } -} -if (!function_exists('mb_substitute_character')) { - function mb_substitute_character($char = null) { return p\Mbstring::mb_substitute_character($char); } -} -if (!function_exists('mb_substr')) { - function mb_substr($s, $start, $length = 2147483647, $enc = null) { return p\Mbstring::mb_substr($s, $start, $length, $enc); } -} -if (!function_exists('mb_stripos')) { - function mb_stripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_stripos($s, $needle, $offset, $enc); } -} -if (!function_exists('mb_stristr')) { - function mb_stristr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_stristr($s, $needle, $part, $enc); } -} -if (!function_exists('mb_strrchr')) { - function mb_strrchr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrchr($s, $needle, $part, $enc); } -} -if (!function_exists('mb_strrichr')) { - function mb_strrichr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrichr($s, $needle, $part, $enc); } -} -if (!function_exists('mb_strripos')) { - function mb_strripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strripos($s, $needle, $offset, $enc); } -} -if (!function_exists('mb_strrpos')) { - function mb_strrpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strrpos($s, $needle, $offset, $enc); } -} -if (!function_exists('mb_strstr')) { - function mb_strstr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strstr($s, $needle, $part, $enc); } -} -if (!function_exists('mb_get_info')) { - function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } -} -if (!function_exists('mb_http_output')) { - function mb_http_output($enc = null) { return p\Mbstring::mb_http_output($enc); } -} -if (!function_exists('mb_strwidth')) { - function mb_strwidth($s, $enc = null) { return p\Mbstring::mb_strwidth($s, $enc); } -} -if (!function_exists('mb_substr_count')) { - function mb_substr_count($haystack, $needle, $enc = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $enc); } -} -if (!function_exists('mb_output_handler')) { - function mb_output_handler($contents, $status) { return p\Mbstring::mb_output_handler($contents, $status); } -} -if (!function_exists('mb_http_input')) { - function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); } -} -if (!function_exists('mb_convert_variables')) { - function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f); } -} -if (!function_exists('mb_ord')) { - function mb_ord($s, $enc = null) { return p\Mbstring::mb_ord($s, $enc); } -} -if (!function_exists('mb_chr')) { - function mb_chr($code, $enc = null) { return p\Mbstring::mb_chr($code, $enc); } -} -if (!function_exists('mb_scrub')) { - function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); } -} -if (!function_exists('mb_str_split')) { - function mb_str_split($string, $split_length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $split_length, $encoding); } -} - -if (extension_loaded('mbstring')) { - return; -} - -if (!defined('MB_CASE_UPPER')) { - define('MB_CASE_UPPER', 0); -} -if (!defined('MB_CASE_LOWER')) { - define('MB_CASE_LOWER', 1); -} -if (!defined('MB_CASE_TITLE')) { - define('MB_CASE_TITLE', 2); -} diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json deleted file mode 100644 index 06e6b31..0000000 --- a/vendor/symfony/polyfill-mbstring/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "symfony/polyfill-mbstring", - "type": "library", - "description": "Symfony polyfill for the Mbstring extension", - "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=5.3.3" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, - "files": [ "bootstrap.php" ] - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/symfony/polyfill-php70/LICENSE b/vendor/symfony/polyfill-php70/LICENSE deleted file mode 100644 index 4cd8bdd..0000000 --- a/vendor/symfony/polyfill-php70/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015-2019 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/polyfill-php70/Php70.php b/vendor/symfony/polyfill-php70/Php70.php deleted file mode 100644 index 7f1ad08..0000000 --- a/vendor/symfony/polyfill-php70/Php70.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Php70; - -/** - * @author Nicolas Grekas - * - * @internal - */ -final class Php70 -{ - public static function intdiv($dividend, $divisor) - { - $dividend = self::intArg($dividend, __FUNCTION__, 1); - $divisor = self::intArg($divisor, __FUNCTION__, 2); - - if (0 === $divisor) { - throw new \DivisionByZeroError('Division by zero'); - } - if (-1 === $divisor && ~PHP_INT_MAX === $dividend) { - throw new \ArithmeticError('Division of PHP_INT_MIN by -1 is not an integer'); - } - - return ($dividend - ($dividend % $divisor)) / $divisor; - } - - public static function preg_replace_callback_array(array $patterns, $subject, $limit = -1, &$count = 0) - { - $count = 0; - $result = (string) $subject; - if (0 === $limit = self::intArg($limit, __FUNCTION__, 3)) { - return $result; - } - - foreach ($patterns as $pattern => $callback) { - $result = preg_replace_callback($pattern, $callback, $result, $limit, $c); - $count += $c; - } - - return $result; - } - - public static function error_clear_last() - { - static $handler; - if (!$handler) { - $handler = function () { return false; }; - } - set_error_handler($handler); - @trigger_error(''); - restore_error_handler(); - } - - private static function intArg($value, $caller, $pos) - { - if (\is_int($value)) { - return $value; - } - if (!\is_numeric($value) || PHP_INT_MAX <= ($value += 0) || ~PHP_INT_MAX >= $value) { - throw new \TypeError(sprintf('%s() expects parameter %d to be integer, %s given', $caller, $pos, \gettype($value))); - } - - return (int) $value; - } -} diff --git a/vendor/symfony/polyfill-php70/README.md b/vendor/symfony/polyfill-php70/README.md deleted file mode 100644 index abd5488..0000000 --- a/vendor/symfony/polyfill-php70/README.md +++ /dev/null @@ -1,28 +0,0 @@ -Symfony Polyfill / Php70 -======================== - -This component provides features unavailable in releases prior to PHP 7.0: - -- [`intdiv`](https://php.net/intdiv) -- [`preg_replace_callback_array`](https://php.net/preg_replace_callback_array) -- [`error_clear_last`](https://php.net/error_clear_last) -- `random_bytes` and `random_int` (from [paragonie/random_compat](https://github.com/paragonie/random_compat)) -- [`*Error` throwable classes](https://php.net/Error) -- [`PHP_INT_MIN`](https://php.net/reserved.constants#constant.php-int-min) -- `SessionUpdateTimestampHandlerInterface` - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -Compatibility notes -=================== - -To write portable code between PHP5 and PHP7, some care must be taken: -- `\*Error` exceptions must be caught before `\Exception`; -- after calling `error_clear_last()`, the result of `$e = error_get_last()` must be - verified using `isset($e['message'][0])` instead of `null !== $e`. - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php b/vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php deleted file mode 100644 index 6819124..0000000 --- a/vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php +++ /dev/null @@ -1,5 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php70 as p; - -if (PHP_VERSION_ID >= 70000) { - return; -} - -if (!defined('PHP_INT_MIN')) { - define('PHP_INT_MIN', ~PHP_INT_MAX); -} - -if (!function_exists('intdiv')) { - function intdiv($dividend, $divisor) { return p\Php70::intdiv($dividend, $divisor); } -} -if (!function_exists('preg_replace_callback_array')) { - function preg_replace_callback_array(array $patterns, $subject, $limit = -1, &$count = 0) { return p\Php70::preg_replace_callback_array($patterns, $subject, $limit, $count); } -} -if (!function_exists('error_clear_last')) { - function error_clear_last() { return p\Php70::error_clear_last(); } -} diff --git a/vendor/symfony/polyfill-php70/composer.json b/vendor/symfony/polyfill-php70/composer.json deleted file mode 100644 index 771a6f6..0000000 --- a/vendor/symfony/polyfill-php70/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "symfony/polyfill-php70", - "type": "library", - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=5.3.3", - "paragonie/random_compat": "~1.0|~2.0|~9.99" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php70\\": "" }, - "files": [ "bootstrap.php" ], - "classmap": [ "Resources/stubs" ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/symfony/polyfill-php72/LICENSE b/vendor/symfony/polyfill-php72/LICENSE deleted file mode 100644 index 4cd8bdd..0000000 --- a/vendor/symfony/polyfill-php72/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015-2019 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/polyfill-php72/Php72.php b/vendor/symfony/polyfill-php72/Php72.php deleted file mode 100644 index 9b3edc7..0000000 --- a/vendor/symfony/polyfill-php72/Php72.php +++ /dev/null @@ -1,217 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Php72; - -/** - * @author Nicolas Grekas - * @author Dariusz Rumiński - * - * @internal - */ -final class Php72 -{ - private static $hashMask; - - public static function utf8_encode($s) - { - $s .= $s; - $len = \strlen($s); - - for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) { - switch (true) { - case $s[$i] < "\x80": $s[$j] = $s[$i]; break; - case $s[$i] < "\xC0": $s[$j] = "\xC2"; $s[++$j] = $s[$i]; break; - default: $s[$j] = "\xC3"; $s[++$j] = \chr(\ord($s[$i]) - 64); break; - } - } - - return substr($s, 0, $j); - } - - public static function utf8_decode($s) - { - $s = (string) $s; - $len = \strlen($s); - - for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) { - switch ($s[$i] & "\xF0") { - case "\xC0": - case "\xD0": - $c = (\ord($s[$i] & "\x1F") << 6) | \ord($s[++$i] & "\x3F"); - $s[$j] = $c < 256 ? \chr($c) : '?'; - break; - - case "\xF0": - ++$i; - // no break - - case "\xE0": - $s[$j] = '?'; - $i += 2; - break; - - default: - $s[$j] = $s[$i]; - } - } - - return substr($s, 0, $j); - } - - public static function php_os_family() - { - if ('\\' === \DIRECTORY_SEPARATOR) { - return 'Windows'; - } - - $map = array( - 'Darwin' => 'Darwin', - 'DragonFly' => 'BSD', - 'FreeBSD' => 'BSD', - 'NetBSD' => 'BSD', - 'OpenBSD' => 'BSD', - 'Linux' => 'Linux', - 'SunOS' => 'Solaris', - ); - - return isset($map[PHP_OS]) ? $map[PHP_OS] : 'Unknown'; - } - - public static function spl_object_id($object) - { - if (null === self::$hashMask) { - self::initHashMask(); - } - if (null === $hash = spl_object_hash($object)) { - return; - } - - // On 32-bit systems, PHP_INT_SIZE is 4, - return self::$hashMask ^ hexdec(substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); - } - - public static function sapi_windows_vt100_support($stream, $enable = null) - { - if (!\is_resource($stream)) { - trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); - - return false; - } - - $meta = stream_get_meta_data($stream); - - if ('STDIO' !== $meta['stream_type']) { - trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', E_USER_WARNING); - - return false; - } - - // We cannot actually disable vt100 support if it is set - if (false === $enable || !self::stream_isatty($stream)) { - return false; - } - - // The native function does not apply to stdin - $meta = array_map('strtolower', $meta); - $stdin = 'php://stdin' === $meta['uri'] || 'php://fd/0' === $meta['uri']; - - return !$stdin - && (false !== getenv('ANSICON') - || 'ON' === getenv('ConEmuANSI') - || 'xterm' === getenv('TERM') - || 'Hyper' === getenv('TERM_PROGRAM')); - } - - public static function stream_isatty($stream) - { - if (!\is_resource($stream)) { - trigger_error('stream_isatty() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); - - return false; - } - - if ('\\' === \DIRECTORY_SEPARATOR) { - $stat = @fstat($stream); - // Check if formatted mode is S_IFCHR - return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; - } - - return \function_exists('posix_isatty') && @posix_isatty($stream); - } - - private static function initHashMask() - { - $obj = (object) array(); - self::$hashMask = -1; - - // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below - $obFuncs = array('ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush'); - foreach (debug_backtrace(\PHP_VERSION_ID >= 50400 ? DEBUG_BACKTRACE_IGNORE_ARGS : false) as $frame) { - if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) { - $frame['line'] = 0; - break; - } - } - if (!empty($frame['line'])) { - ob_start(); - debug_zval_dump($obj); - self::$hashMask = (int) substr(ob_get_clean(), 17); - } - - self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); - } - - public static function mb_chr($code, $encoding = null) - { - if (0x80 > $code %= 0x200000) { - $s = \chr($code); - } elseif (0x800 > $code) { - $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); - } elseif (0x10000 > $code) { - $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } else { - $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } - - if ('UTF-8' !== $encoding) { - $s = mb_convert_encoding($s, $encoding, 'UTF-8'); - } - - return $s; - } - - public static function mb_ord($s, $encoding = null) - { - if (null == $encoding) { - $s = mb_convert_encoding($s, 'UTF-8'); - } elseif ('UTF-8' !== $encoding) { - $s = mb_convert_encoding($s, 'UTF-8', $encoding); - } - - if (1 === \strlen($s)) { - return \ord($s); - } - - $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; - if (0xF0 <= $code) { - return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; - } - if (0xE0 <= $code) { - return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; - } - if (0xC0 <= $code) { - return (($code - 0xC0) << 6) + $s[2] - 0x80; - } - - return $code; - } -} diff --git a/vendor/symfony/polyfill-php72/README.md b/vendor/symfony/polyfill-php72/README.md deleted file mode 100644 index 59dec8a..0000000 --- a/vendor/symfony/polyfill-php72/README.md +++ /dev/null @@ -1,28 +0,0 @@ -Symfony Polyfill / Php72 -======================== - -This component provides functions added to PHP 7.2 core: - -- [`spl_object_id`](https://php.net/spl_object_id) -- [`stream_isatty`](https://php.net/stream_isatty) - -On Windows only: - -- [`sapi_windows_vt100_support`](https://php.net/sapi_windows_vt100_support) - -Moved to core since 7.2 (was in the optional XML extension earlier): - -- [`utf8_encode`](https://php.net/utf8_encode) -- [`utf8_decode`](https://php.net/utf8_decode) - -Also, it provides constants added to PHP 7.2: -- [`PHP_FLOAT_*`](https://php.net/reserved.constants#constant.php-float-dig) -- [`PHP_OS_FAMILY`](https://php.net/reserved.constants#constant.php-os-family) - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php72/bootstrap.php b/vendor/symfony/polyfill-php72/bootstrap.php deleted file mode 100644 index a27a900..0000000 --- a/vendor/symfony/polyfill-php72/bootstrap.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php72 as p; - -if (PHP_VERSION_ID >= 70200) { - return; -} - -if (!defined('PHP_FLOAT_DIG')) { - define('PHP_FLOAT_DIG', 15); -} -if (!defined('PHP_FLOAT_EPSILON')) { - define('PHP_FLOAT_EPSILON', 2.2204460492503E-16); -} -if (!defined('PHP_FLOAT_MIN')) { - define('PHP_FLOAT_MIN', 2.2250738585072E-308); -} -if (!defined('PHP_FLOAT_MAX')) { - define('PHP_FLOAT_MAX', 1.7976931348623157E+308); -} -if (!defined('PHP_OS_FAMILY')) { - define('PHP_OS_FAMILY', p\Php72::php_os_family()); -} - -if ('\\' === DIRECTORY_SEPARATOR && !function_exists('sapi_windows_vt100_support')) { - function sapi_windows_vt100_support($stream, $enable = null) { return p\Php72::sapi_windows_vt100_support($stream, $enable); } -} -if (!function_exists('stream_isatty')) { - function stream_isatty($stream) { return p\Php72::stream_isatty($stream); } -} -if (!function_exists('utf8_encode')) { - function utf8_encode($s) { return p\Php72::utf8_encode($s); } -} -if (!function_exists('utf8_decode')) { - function utf8_decode($s) { return p\Php72::utf8_decode($s); } -} -if (!function_exists('spl_object_id')) { - function spl_object_id($s) { return p\Php72::spl_object_id($s); } -} -if (!function_exists('mb_ord')) { - function mb_ord($s, $enc = null) { return p\Php72::mb_ord($s, $enc); } -} -if (!function_exists('mb_chr')) { - function mb_chr($code, $enc = null) { return p\Php72::mb_chr($code, $enc); } -} -if (!function_exists('mb_scrub')) { - function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); } -} diff --git a/vendor/symfony/polyfill-php72/composer.json b/vendor/symfony/polyfill-php72/composer.json deleted file mode 100644 index e295cab..0000000 --- a/vendor/symfony/polyfill-php72/composer.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "symfony/polyfill-php72", - "type": "library", - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=5.3.3" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php72\\": "" }, - "files": [ "bootstrap.php" ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/symfony/polyfill-php73/LICENSE b/vendor/symfony/polyfill-php73/LICENSE deleted file mode 100644 index 3f853aa..0000000 --- a/vendor/symfony/polyfill-php73/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2018-2019 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/polyfill-php73/Php73.php b/vendor/symfony/polyfill-php73/Php73.php deleted file mode 100644 index 7c99d19..0000000 --- a/vendor/symfony/polyfill-php73/Php73.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Php73; - -/** - * @author Gabriel Caruso - * @author Ion Bazan - * - * @internal - */ -final class Php73 -{ - public static $startAt = 1533462603; - - /** - * @param bool $asNum - * - * @return array|float|int - */ - public static function hrtime($asNum = false) - { - $ns = microtime(false); - $s = substr($ns, 11) - self::$startAt; - $ns = 1E9 * (float) $ns; - - if ($asNum) { - $ns += $s * 1E9; - - return \PHP_INT_SIZE === 4 ? $ns : (int) $ns; - } - - return array($s, (int) $ns); - } -} diff --git a/vendor/symfony/polyfill-php73/README.md b/vendor/symfony/polyfill-php73/README.md deleted file mode 100644 index b3ebbce..0000000 --- a/vendor/symfony/polyfill-php73/README.md +++ /dev/null @@ -1,18 +0,0 @@ -Symfony Polyfill / Php73 -======================== - -This component provides functions added to PHP 7.3 core: - -- [`array_key_first`](https://php.net/array_key_first) -- [`array_key_last`](https://php.net/array_key_last) -- [`hrtime`](https://php.net/function.hrtime) -- [`is_countable`](https://php.net/is_countable) -- [`JsonException`](https://php.net/JsonException) - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php b/vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php deleted file mode 100644 index 673d100..0000000 --- a/vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -class JsonException extends Exception -{ -} diff --git a/vendor/symfony/polyfill-php73/bootstrap.php b/vendor/symfony/polyfill-php73/bootstrap.php deleted file mode 100644 index b3ec352..0000000 --- a/vendor/symfony/polyfill-php73/bootstrap.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php73 as p; - -if (PHP_VERSION_ID >= 70300) { - return; -} - -if (!function_exists('is_countable')) { - function is_countable($var) { return is_array($var) || $var instanceof Countable || $var instanceof ResourceBundle || $var instanceof SimpleXmlElement; } -} -if (!function_exists('hrtime')) { - require_once __DIR__.'/Php73.php'; - p\Php73::$startAt = (int) microtime(true); - function hrtime($asNum = false) { return p\Php73::hrtime($asNum); } -} -if (!function_exists('array_key_first')) { - function array_key_first(array $array) { foreach ($array as $key => $value) { return $key; } } -} -if (!function_exists('array_key_last')) { - function array_key_last(array $array) { end($array); return key($array); } -} diff --git a/vendor/symfony/polyfill-php73/composer.json b/vendor/symfony/polyfill-php73/composer.json deleted file mode 100644 index 5eaa9cf..0000000 --- a/vendor/symfony/polyfill-php73/composer.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "symfony/polyfill-php73", - "type": "library", - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=5.3.3" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php73\\": "" }, - "files": [ "bootstrap.php" ], - "classmap": [ "Resources/stubs" ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/symfony/polyfill-php80/LICENSE b/vendor/symfony/polyfill-php80/LICENSE deleted file mode 100644 index 5593b1d..0000000 --- a/vendor/symfony/polyfill-php80/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/polyfill-php80/Php80.php b/vendor/symfony/polyfill-php80/Php80.php deleted file mode 100644 index c03491b..0000000 --- a/vendor/symfony/polyfill-php80/Php80.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Php80; - -/** - * @author Ion Bazan - * @author Nico Oelgart - * @author Nicolas Grekas - * - * @internal - */ -final class Php80 -{ - public static function fdiv(float $dividend, float $divisor): float - { - return @($dividend / $divisor); - } - - public static function get_debug_type($value): string - { - switch (true) { - case null === $value: return 'null'; - case \is_bool($value): return 'bool'; - case \is_string($value): return 'string'; - case \is_array($value): return 'array'; - case \is_int($value): return 'int'; - case \is_float($value): return 'float'; - case \is_object($value): break; - case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class'; - default: - if (null === $type = @get_resource_type($value)) { - return 'unknown'; - } - - if ('Unknown' === $type) { - $type = 'closed'; - } - - return "resource ($type)"; - } - - $class = \get_class($value); - - if (false === strpos($class, '@')) { - return $class; - } - - return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous'; - } - - public static function get_resource_id($res): int - { - if (!\is_resource($res) && null === @get_resource_type($res)) { - throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res))); - } - - return (int) $res; - } - - public static function preg_last_error_msg(): string - { - switch (preg_last_error()) { - case PREG_INTERNAL_ERROR: - return 'Internal error'; - case PREG_BAD_UTF8_ERROR: - return 'Malformed UTF-8 characters, possibly incorrectly encoded'; - case PREG_BAD_UTF8_OFFSET_ERROR: - return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; - case PREG_BACKTRACK_LIMIT_ERROR: - return 'Backtrack limit exhausted'; - case PREG_RECURSION_LIMIT_ERROR: - return 'Recursion limit exhausted'; - case PREG_JIT_STACKLIMIT_ERROR: - return 'JIT stack limit exhausted'; - case PREG_NO_ERROR: - return 'No error'; - default: - return 'Unknown error'; - } - } - - public static function str_contains(string $haystack, string $needle): bool - { - return '' === $needle || false !== strpos($haystack, $needle); - } - - public static function str_starts_with(string $haystack, string $needle): bool - { - return 0 === \strncmp($haystack, $needle, \strlen($needle)); - } - - public static function str_ends_with(string $haystack, string $needle): bool - { - return '' === $needle || ('' !== $haystack && 0 === \substr_compare($haystack, $needle, -\strlen($needle))); - } -} diff --git a/vendor/symfony/polyfill-php80/README.md b/vendor/symfony/polyfill-php80/README.md deleted file mode 100644 index eaa3050..0000000 --- a/vendor/symfony/polyfill-php80/README.md +++ /dev/null @@ -1,24 +0,0 @@ -Symfony Polyfill / Php80 -======================== - -This component provides features added to PHP 8.0 core: - -- `Stringable` interface -- [`fdiv`](https://php.net/fdiv) -- `ValueError` class -- `UnhandledMatchError` class -- `FILTER_VALIDATE_BOOL` constant -- [`get_debug_type`](https://php.net/get_debug_type) -- [`preg_last_error_msg`](https://php.net/preg_last_error_msg) -- [`str_contains`](https://php.net/str_contains) -- [`str_starts_with`](https://php.net/str_starts_with) -- [`str_ends_with`](https://php.net/str_ends_with) -- [`get_resource_id`](https://php.net/get_resource_id) - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php deleted file mode 100644 index ad0029a..0000000 --- a/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php +++ /dev/null @@ -1,9 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php80 as p; - -if (PHP_VERSION_ID >= 80000) { - return; -} - -if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) { - define('FILTER_VALIDATE_BOOL', FILTER_VALIDATE_BOOLEAN); -} - -if (!function_exists('fdiv')) { - function fdiv(float $dividend, float $divisor): float { return p\Php80::fdiv($dividend, $divisor); } -} -if (!function_exists('preg_last_error_msg')) { - function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); } -} -if (!function_exists('str_contains')) { - function str_contains(string $haystack, string $needle): bool { return p\Php80::str_contains($haystack, $needle); } -} -if (!function_exists('str_starts_with')) { - function str_starts_with(string $haystack, string $needle): bool { return p\Php80::str_starts_with($haystack, $needle); } -} -if (!function_exists('str_ends_with')) { - function str_ends_with(string $haystack, string $needle): bool { return p\Php80::str_ends_with($haystack, $needle); } -} -if (!function_exists('get_debug_type')) { - function get_debug_type($value): string { return p\Php80::get_debug_type($value); } -} -if (!function_exists('get_resource_id')) { - function get_resource_id($res): int { return p\Php80::get_resource_id($res); } -} diff --git a/vendor/symfony/polyfill-php80/composer.json b/vendor/symfony/polyfill-php80/composer.json deleted file mode 100644 index 51086cc..0000000 --- a/vendor/symfony/polyfill-php80/composer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "symfony/polyfill-php80", - "type": "library", - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.0.8" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, - "files": [ "bootstrap.php" ], - "classmap": [ "Resources/stubs" ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/symfony/process/CHANGELOG.md b/vendor/symfony/process/CHANGELOG.md deleted file mode 100644 index 3f3a020..0000000 --- a/vendor/symfony/process/CHANGELOG.md +++ /dev/null @@ -1,109 +0,0 @@ -CHANGELOG -========= - -5.1.0 ------ - - * added `Process::getStartTime()` to retrieve the start time of the process as float - -5.0.0 ------ - - * removed `Process::inheritEnvironmentVariables()` - * removed `PhpProcess::setPhpBinary()` - * `Process` must be instantiated with a command array, use `Process::fromShellCommandline()` when the command should be parsed by the shell - * removed `Process::setCommandLine()` - -4.4.0 ------ - - * deprecated `Process::inheritEnvironmentVariables()`: env variables are always inherited. - * added `Process::getLastOutputTime()` method - -4.2.0 ------ - - * added the `Process::fromShellCommandline()` to run commands in a shell wrapper - * deprecated passing a command as string when creating a `Process` instance - * deprecated the `Process::setCommandline()` and the `PhpProcess::setPhpBinary()` methods - * added the `Process::waitUntil()` method to wait for the process only for a - specific output, then continue the normal execution of your application - -4.1.0 ------ - - * added the `Process::isTtySupported()` method that allows to check for TTY support - * made `PhpExecutableFinder` look for the `PHP_BINARY` env var when searching the php binary - * added the `ProcessSignaledException` class to properly catch signaled process errors - -4.0.0 ------ - - * environment variables will always be inherited - * added a second `array $env = []` argument to the `start()`, `run()`, - `mustRun()`, and `restart()` methods of the `Process` class - * added a second `array $env = []` argument to the `start()` method of the - `PhpProcess` class - * the `ProcessUtils::escapeArgument()` method has been removed - * the `areEnvironmentVariablesInherited()`, `getOptions()`, and `setOptions()` - methods of the `Process` class have been removed - * support for passing `proc_open()` options has been removed - * removed the `ProcessBuilder` class, use the `Process` class instead - * removed the `getEnhanceWindowsCompatibility()` and `setEnhanceWindowsCompatibility()` methods of the `Process` class - * passing a not existing working directory to the constructor of the `Symfony\Component\Process\Process` class is not - supported anymore - -3.4.0 ------ - - * deprecated the ProcessBuilder class - * deprecated calling `Process::start()` without setting a valid working directory beforehand (via `setWorkingDirectory()` or constructor) - -3.3.0 ------ - - * added command line arrays in the `Process` class - * added `$env` argument to `Process::start()`, `run()`, `mustRun()` and `restart()` methods - * deprecated the `ProcessUtils::escapeArgument()` method - * deprecated not inheriting environment variables - * deprecated configuring `proc_open()` options - * deprecated configuring enhanced Windows compatibility - * deprecated configuring enhanced sigchild compatibility - -2.5.0 ------ - - * added support for PTY mode - * added the convenience method "mustRun" - * deprecation: Process::setStdin() is deprecated in favor of Process::setInput() - * deprecation: Process::getStdin() is deprecated in favor of Process::getInput() - * deprecation: Process::setInput() and ProcessBuilder::setInput() do not accept non-scalar types - -2.4.0 ------ - - * added the ability to define an idle timeout - -2.3.0 ------ - - * added ProcessUtils::escapeArgument() to fix the bug in escapeshellarg() function on Windows - * added Process::signal() - * added Process::getPid() - * added support for a TTY mode - -2.2.0 ------ - - * added ProcessBuilder::setArguments() to reset the arguments on a builder - * added a way to retrieve the standard and error output incrementally - * added Process:restart() - -2.1.0 ------ - - * added support for non-blocking processes (start(), wait(), isRunning(), stop()) - * enhanced Windows compatibility - * added Process::getExitCodeText() that returns a string representation for - the exit code returned by the process - * added ProcessBuilder diff --git a/vendor/symfony/process/Exception/ExceptionInterface.php b/vendor/symfony/process/Exception/ExceptionInterface.php deleted file mode 100644 index bd4a604..0000000 --- a/vendor/symfony/process/Exception/ExceptionInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -/** - * Marker Interface for the Process Component. - * - * @author Johannes M. Schmitt - */ -interface ExceptionInterface extends \Throwable -{ -} diff --git a/vendor/symfony/process/Exception/InvalidArgumentException.php b/vendor/symfony/process/Exception/InvalidArgumentException.php deleted file mode 100644 index 926ee21..0000000 --- a/vendor/symfony/process/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -/** - * InvalidArgumentException for the Process Component. - * - * @author Romain Neutron - */ -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/process/Exception/LogicException.php b/vendor/symfony/process/Exception/LogicException.php deleted file mode 100644 index be3d490..0000000 --- a/vendor/symfony/process/Exception/LogicException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -/** - * LogicException for the Process Component. - * - * @author Romain Neutron - */ -class LogicException extends \LogicException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/process/Exception/ProcessFailedException.php b/vendor/symfony/process/Exception/ProcessFailedException.php deleted file mode 100644 index 328acfd..0000000 --- a/vendor/symfony/process/Exception/ProcessFailedException.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -use Symfony\Component\Process\Process; - -/** - * Exception for failed processes. - * - * @author Johannes M. Schmitt - */ -class ProcessFailedException extends RuntimeException -{ - private $process; - - public function __construct(Process $process) - { - if ($process->isSuccessful()) { - throw new InvalidArgumentException('Expected a failed process, but the given process was successful.'); - } - - $error = sprintf('The command "%s" failed.'."\n\nExit Code: %s(%s)\n\nWorking directory: %s", - $process->getCommandLine(), - $process->getExitCode(), - $process->getExitCodeText(), - $process->getWorkingDirectory() - ); - - if (!$process->isOutputDisabled()) { - $error .= sprintf("\n\nOutput:\n================\n%s\n\nError Output:\n================\n%s", - $process->getOutput(), - $process->getErrorOutput() - ); - } - - parent::__construct($error); - - $this->process = $process; - } - - public function getProcess() - { - return $this->process; - } -} diff --git a/vendor/symfony/process/Exception/ProcessSignaledException.php b/vendor/symfony/process/Exception/ProcessSignaledException.php deleted file mode 100644 index d4d3227..0000000 --- a/vendor/symfony/process/Exception/ProcessSignaledException.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -use Symfony\Component\Process\Process; - -/** - * Exception that is thrown when a process has been signaled. - * - * @author Sullivan Senechal - */ -final class ProcessSignaledException extends RuntimeException -{ - private $process; - - public function __construct(Process $process) - { - $this->process = $process; - - parent::__construct(sprintf('The process has been signaled with signal "%s".', $process->getTermSignal())); - } - - public function getProcess(): Process - { - return $this->process; - } - - public function getSignal(): int - { - return $this->getProcess()->getTermSignal(); - } -} diff --git a/vendor/symfony/process/Exception/ProcessTimedOutException.php b/vendor/symfony/process/Exception/ProcessTimedOutException.php deleted file mode 100644 index e1f6445..0000000 --- a/vendor/symfony/process/Exception/ProcessTimedOutException.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -use Symfony\Component\Process\Process; - -/** - * Exception that is thrown when a process times out. - * - * @author Johannes M. Schmitt - */ -class ProcessTimedOutException extends RuntimeException -{ - const TYPE_GENERAL = 1; - const TYPE_IDLE = 2; - - private $process; - private $timeoutType; - - public function __construct(Process $process, int $timeoutType) - { - $this->process = $process; - $this->timeoutType = $timeoutType; - - parent::__construct(sprintf( - 'The process "%s" exceeded the timeout of %s seconds.', - $process->getCommandLine(), - $this->getExceededTimeout() - )); - } - - public function getProcess() - { - return $this->process; - } - - public function isGeneralTimeout() - { - return self::TYPE_GENERAL === $this->timeoutType; - } - - public function isIdleTimeout() - { - return self::TYPE_IDLE === $this->timeoutType; - } - - public function getExceededTimeout() - { - switch ($this->timeoutType) { - case self::TYPE_GENERAL: - return $this->process->getTimeout(); - - case self::TYPE_IDLE: - return $this->process->getIdleTimeout(); - - default: - throw new \LogicException(sprintf('Unknown timeout type "%d".', $this->timeoutType)); - } - } -} diff --git a/vendor/symfony/process/Exception/RuntimeException.php b/vendor/symfony/process/Exception/RuntimeException.php deleted file mode 100644 index adead25..0000000 --- a/vendor/symfony/process/Exception/RuntimeException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -/** - * RuntimeException for the Process Component. - * - * @author Johannes M. Schmitt - */ -class RuntimeException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/process/ExecutableFinder.php b/vendor/symfony/process/ExecutableFinder.php deleted file mode 100644 index aa52cf3..0000000 --- a/vendor/symfony/process/ExecutableFinder.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -/** - * Generic executable finder. - * - * @author Fabien Potencier - * @author Johannes M. Schmitt - */ -class ExecutableFinder -{ - private $suffixes = ['.exe', '.bat', '.cmd', '.com']; - - /** - * Replaces default suffixes of executable. - */ - public function setSuffixes(array $suffixes) - { - $this->suffixes = $suffixes; - } - - /** - * Adds new possible suffix to check for executable. - */ - public function addSuffix(string $suffix) - { - $this->suffixes[] = $suffix; - } - - /** - * Finds an executable by name. - * - * @param string $name The executable name (without the extension) - * @param string|null $default The default to return if no executable is found - * @param array $extraDirs Additional dirs to check into - * - * @return string|null The executable path or default value - */ - public function find(string $name, string $default = null, array $extraDirs = []) - { - if (ini_get('open_basedir')) { - $searchPath = array_merge(explode(PATH_SEPARATOR, ini_get('open_basedir')), $extraDirs); - $dirs = []; - foreach ($searchPath as $path) { - // Silencing against https://bugs.php.net/69240 - if (@is_dir($path)) { - $dirs[] = $path; - } else { - if (basename($path) == $name && @is_executable($path)) { - return $path; - } - } - } - } else { - $dirs = array_merge( - explode(PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')), - $extraDirs - ); - } - - $suffixes = ['']; - if ('\\' === \DIRECTORY_SEPARATOR) { - $pathExt = getenv('PATHEXT'); - $suffixes = array_merge($pathExt ? explode(PATH_SEPARATOR, $pathExt) : $this->suffixes, $suffixes); - } - foreach ($suffixes as $suffix) { - foreach ($dirs as $dir) { - if (@is_file($file = $dir.\DIRECTORY_SEPARATOR.$name.$suffix) && ('\\' === \DIRECTORY_SEPARATOR || @is_executable($file))) { - return $file; - } - } - } - - return $default; - } -} diff --git a/vendor/symfony/process/InputStream.php b/vendor/symfony/process/InputStream.php deleted file mode 100644 index c86fca8..0000000 --- a/vendor/symfony/process/InputStream.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -use Symfony\Component\Process\Exception\RuntimeException; - -/** - * Provides a way to continuously write to the input of a Process until the InputStream is closed. - * - * @author Nicolas Grekas - */ -class InputStream implements \IteratorAggregate -{ - /** @var callable|null */ - private $onEmpty = null; - private $input = []; - private $open = true; - - /** - * Sets a callback that is called when the write buffer becomes empty. - */ - public function onEmpty(callable $onEmpty = null) - { - $this->onEmpty = $onEmpty; - } - - /** - * Appends an input to the write buffer. - * - * @param resource|string|int|float|bool|\Traversable|null $input The input to append as scalar, - * stream resource or \Traversable - */ - public function write($input) - { - if (null === $input) { - return; - } - if ($this->isClosed()) { - throw new RuntimeException(sprintf('"%s" is closed.', static::class)); - } - $this->input[] = ProcessUtils::validateInput(__METHOD__, $input); - } - - /** - * Closes the write buffer. - */ - public function close() - { - $this->open = false; - } - - /** - * Tells whether the write buffer is closed or not. - */ - public function isClosed() - { - return !$this->open; - } - - /** - * @return \Traversable - */ - public function getIterator() - { - $this->open = true; - - while ($this->open || $this->input) { - if (!$this->input) { - yield ''; - continue; - } - $current = array_shift($this->input); - - if ($current instanceof \Iterator) { - yield from $current; - } else { - yield $current; - } - if (!$this->input && $this->open && null !== $onEmpty = $this->onEmpty) { - $this->write($onEmpty($this)); - } - } - } -} diff --git a/vendor/symfony/process/LICENSE b/vendor/symfony/process/LICENSE deleted file mode 100644 index 9e936ec..0000000 --- a/vendor/symfony/process/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/process/PhpExecutableFinder.php b/vendor/symfony/process/PhpExecutableFinder.php deleted file mode 100644 index c09d49a..0000000 --- a/vendor/symfony/process/PhpExecutableFinder.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -/** - * An executable finder specifically designed for the PHP executable. - * - * @author Fabien Potencier - * @author Johannes M. Schmitt - */ -class PhpExecutableFinder -{ - private $executableFinder; - - public function __construct() - { - $this->executableFinder = new ExecutableFinder(); - } - - /** - * Finds The PHP executable. - * - * @return string|false The PHP executable path or false if it cannot be found - */ - public function find(bool $includeArgs = true) - { - if ($php = getenv('PHP_BINARY')) { - if (!is_executable($php)) { - $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v'; - if ($php = strtok(exec($command.' '.escapeshellarg($php)), PHP_EOL)) { - if (!is_executable($php)) { - return false; - } - } else { - return false; - } - } - - return $php; - } - - $args = $this->findArguments(); - $args = $includeArgs && $args ? ' '.implode(' ', $args) : ''; - - // PHP_BINARY return the current sapi executable - if (PHP_BINARY && \in_array(\PHP_SAPI, ['cgi-fcgi', 'cli', 'cli-server', 'phpdbg'], true)) { - return PHP_BINARY.$args; - } - - if ($php = getenv('PHP_PATH')) { - if (!@is_executable($php)) { - return false; - } - - return $php; - } - - if ($php = getenv('PHP_PEAR_PHP_BIN')) { - if (@is_executable($php)) { - return $php; - } - } - - if (@is_executable($php = PHP_BINDIR.('\\' === \DIRECTORY_SEPARATOR ? '\\php.exe' : '/php'))) { - return $php; - } - - $dirs = [PHP_BINDIR]; - if ('\\' === \DIRECTORY_SEPARATOR) { - $dirs[] = 'C:\xampp\php\\'; - } - - return $this->executableFinder->find('php', false, $dirs); - } - - /** - * Finds the PHP executable arguments. - * - * @return array The PHP executable arguments - */ - public function findArguments() - { - $arguments = []; - if ('phpdbg' === \PHP_SAPI) { - $arguments[] = '-qrr'; - } - - return $arguments; - } -} diff --git a/vendor/symfony/process/PhpProcess.php b/vendor/symfony/process/PhpProcess.php deleted file mode 100644 index 2bc338e..0000000 --- a/vendor/symfony/process/PhpProcess.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -use Symfony\Component\Process\Exception\LogicException; -use Symfony\Component\Process\Exception\RuntimeException; - -/** - * PhpProcess runs a PHP script in an independent process. - * - * $p = new PhpProcess(''); - * $p->run(); - * print $p->getOutput()."\n"; - * - * @author Fabien Potencier - */ -class PhpProcess extends Process -{ - /** - * @param string $script The PHP script to run (as a string) - * @param string|null $cwd The working directory or null to use the working dir of the current PHP process - * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param int $timeout The timeout in seconds - * @param array|null $php Path to the PHP binary to use with any additional arguments - */ - public function __construct(string $script, string $cwd = null, array $env = null, int $timeout = 60, array $php = null) - { - if (null === $php) { - $executableFinder = new PhpExecutableFinder(); - $php = $executableFinder->find(false); - $php = false === $php ? null : array_merge([$php], $executableFinder->findArguments()); - } - if ('phpdbg' === \PHP_SAPI) { - $file = tempnam(sys_get_temp_dir(), 'dbg'); - file_put_contents($file, $script); - register_shutdown_function('unlink', $file); - $php[] = $file; - $script = null; - } - - parent::__construct($php, $cwd, $env, $script, $timeout); - } - - /** - * {@inheritdoc} - */ - public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) - { - throw new LogicException(sprintf('The "%s()" method cannot be called when using "%s".', __METHOD__, self::class)); - } - - /** - * {@inheritdoc} - */ - public function start(callable $callback = null, array $env = []) - { - if (null === $this->getCommandLine()) { - throw new RuntimeException('Unable to find the PHP executable.'); - } - - parent::start($callback, $env); - } -} diff --git a/vendor/symfony/process/Pipes/AbstractPipes.php b/vendor/symfony/process/Pipes/AbstractPipes.php deleted file mode 100644 index 77636c2..0000000 --- a/vendor/symfony/process/Pipes/AbstractPipes.php +++ /dev/null @@ -1,178 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Pipes; - -use Symfony\Component\Process\Exception\InvalidArgumentException; - -/** - * @author Romain Neutron - * - * @internal - */ -abstract class AbstractPipes implements PipesInterface -{ - public $pipes = []; - - private $inputBuffer = ''; - private $input; - private $blocked = true; - private $lastError; - - /** - * @param resource|string|int|float|bool|\Iterator|null $input - */ - public function __construct($input) - { - if (\is_resource($input) || $input instanceof \Iterator) { - $this->input = $input; - } elseif (\is_string($input)) { - $this->inputBuffer = $input; - } else { - $this->inputBuffer = (string) $input; - } - } - - /** - * {@inheritdoc} - */ - public function close() - { - foreach ($this->pipes as $pipe) { - fclose($pipe); - } - $this->pipes = []; - } - - /** - * Returns true if a system call has been interrupted. - */ - protected function hasSystemCallBeenInterrupted(): bool - { - $lastError = $this->lastError; - $this->lastError = null; - - // stream_select returns false when the `select` system call is interrupted by an incoming signal - return null !== $lastError && false !== stripos($lastError, 'interrupted system call'); - } - - /** - * Unblocks streams. - */ - protected function unblock() - { - if (!$this->blocked) { - return; - } - - foreach ($this->pipes as $pipe) { - stream_set_blocking($pipe, 0); - } - if (\is_resource($this->input)) { - stream_set_blocking($this->input, 0); - } - - $this->blocked = false; - } - - /** - * Writes input to stdin. - * - * @throws InvalidArgumentException When an input iterator yields a non supported value - */ - protected function write(): ?array - { - if (!isset($this->pipes[0])) { - return null; - } - $input = $this->input; - - if ($input instanceof \Iterator) { - if (!$input->valid()) { - $input = null; - } elseif (\is_resource($input = $input->current())) { - stream_set_blocking($input, 0); - } elseif (!isset($this->inputBuffer[0])) { - if (!\is_string($input)) { - if (!is_scalar($input)) { - throw new InvalidArgumentException(sprintf('"%s" yielded a value of type "%s", but only scalars and stream resources are supported.', get_debug_type($this->input), get_debug_type($input))); - } - $input = (string) $input; - } - $this->inputBuffer = $input; - $this->input->next(); - $input = null; - } else { - $input = null; - } - } - - $r = $e = []; - $w = [$this->pipes[0]]; - - // let's have a look if something changed in streams - if (false === @stream_select($r, $w, $e, 0, 0)) { - return null; - } - - foreach ($w as $stdin) { - if (isset($this->inputBuffer[0])) { - $written = fwrite($stdin, $this->inputBuffer); - $this->inputBuffer = substr($this->inputBuffer, $written); - if (isset($this->inputBuffer[0])) { - return [$this->pipes[0]]; - } - } - - if ($input) { - for (;;) { - $data = fread($input, self::CHUNK_SIZE); - if (!isset($data[0])) { - break; - } - $written = fwrite($stdin, $data); - $data = substr($data, $written); - if (isset($data[0])) { - $this->inputBuffer = $data; - - return [$this->pipes[0]]; - } - } - if (feof($input)) { - if ($this->input instanceof \Iterator) { - $this->input->next(); - } else { - $this->input = null; - } - } - } - } - - // no input to read on resource, buffer is empty - if (!isset($this->inputBuffer[0]) && !($this->input instanceof \Iterator ? $this->input->valid() : $this->input)) { - $this->input = null; - fclose($this->pipes[0]); - unset($this->pipes[0]); - } elseif (!$w) { - return [$this->pipes[0]]; - } - - return null; - } - - /** - * @internal - */ - public function handleError($type, $msg) - { - $this->lastError = $msg; - } -} diff --git a/vendor/symfony/process/Pipes/PipesInterface.php b/vendor/symfony/process/Pipes/PipesInterface.php deleted file mode 100644 index 2d63e2c..0000000 --- a/vendor/symfony/process/Pipes/PipesInterface.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Pipes; - -/** - * PipesInterface manages descriptors and pipes for the use of proc_open. - * - * @author Romain Neutron - * - * @internal - */ -interface PipesInterface -{ - const CHUNK_SIZE = 16384; - - /** - * Returns an array of descriptors for the use of proc_open. - */ - public function getDescriptors(): array; - - /** - * Returns an array of filenames indexed by their related stream in case these pipes use temporary files. - * - * @return string[] - */ - public function getFiles(): array; - - /** - * Reads data in file handles and pipes. - * - * @param bool $blocking Whether to use blocking calls or not - * @param bool $close Whether to close pipes if they've reached EOF - * - * @return string[] An array of read data indexed by their fd - */ - public function readAndWrite(bool $blocking, bool $close = false): array; - - /** - * Returns if the current state has open file handles or pipes. - */ - public function areOpen(): bool; - - /** - * Returns if pipes are able to read output. - */ - public function haveReadSupport(): bool; - - /** - * Closes file handles and pipes. - */ - public function close(); -} diff --git a/vendor/symfony/process/Pipes/UnixPipes.php b/vendor/symfony/process/Pipes/UnixPipes.php deleted file mode 100644 index 70fdd29..0000000 --- a/vendor/symfony/process/Pipes/UnixPipes.php +++ /dev/null @@ -1,153 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Pipes; - -use Symfony\Component\Process\Process; - -/** - * UnixPipes implementation uses unix pipes as handles. - * - * @author Romain Neutron - * - * @internal - */ -class UnixPipes extends AbstractPipes -{ - private $ttyMode; - private $ptyMode; - private $haveReadSupport; - - public function __construct(?bool $ttyMode, bool $ptyMode, $input, bool $haveReadSupport) - { - $this->ttyMode = $ttyMode; - $this->ptyMode = $ptyMode; - $this->haveReadSupport = $haveReadSupport; - - parent::__construct($input); - } - - public function __destruct() - { - $this->close(); - } - - /** - * {@inheritdoc} - */ - public function getDescriptors(): array - { - if (!$this->haveReadSupport) { - $nullstream = fopen('/dev/null', 'c'); - - return [ - ['pipe', 'r'], - $nullstream, - $nullstream, - ]; - } - - if ($this->ttyMode) { - return [ - ['file', '/dev/tty', 'r'], - ['file', '/dev/tty', 'w'], - ['file', '/dev/tty', 'w'], - ]; - } - - if ($this->ptyMode && Process::isPtySupported()) { - return [ - ['pty'], - ['pty'], - ['pty'], - ]; - } - - return [ - ['pipe', 'r'], - ['pipe', 'w'], // stdout - ['pipe', 'w'], // stderr - ]; - } - - /** - * {@inheritdoc} - */ - public function getFiles(): array - { - return []; - } - - /** - * {@inheritdoc} - */ - public function readAndWrite(bool $blocking, bool $close = false): array - { - $this->unblock(); - $w = $this->write(); - - $read = $e = []; - $r = $this->pipes; - unset($r[0]); - - // let's have a look if something changed in streams - set_error_handler([$this, 'handleError']); - if (($r || $w) && false === stream_select($r, $w, $e, 0, $blocking ? Process::TIMEOUT_PRECISION * 1E6 : 0)) { - restore_error_handler(); - // if a system call has been interrupted, forget about it, let's try again - // otherwise, an error occurred, let's reset pipes - if (!$this->hasSystemCallBeenInterrupted()) { - $this->pipes = []; - } - - return $read; - } - restore_error_handler(); - - foreach ($r as $pipe) { - // prior PHP 5.4 the array passed to stream_select is modified and - // lose key association, we have to find back the key - $read[$type = array_search($pipe, $this->pipes, true)] = ''; - - do { - $data = @fread($pipe, self::CHUNK_SIZE); - $read[$type] .= $data; - } while (isset($data[0]) && ($close || isset($data[self::CHUNK_SIZE - 1]))); - - if (!isset($read[$type][0])) { - unset($read[$type]); - } - - if ($close && feof($pipe)) { - fclose($pipe); - unset($this->pipes[$type]); - } - } - - return $read; - } - - /** - * {@inheritdoc} - */ - public function haveReadSupport(): bool - { - return $this->haveReadSupport; - } - - /** - * {@inheritdoc} - */ - public function areOpen(): bool - { - return (bool) $this->pipes; - } -} diff --git a/vendor/symfony/process/Pipes/WindowsPipes.php b/vendor/symfony/process/Pipes/WindowsPipes.php deleted file mode 100644 index 5ebd5ff..0000000 --- a/vendor/symfony/process/Pipes/WindowsPipes.php +++ /dev/null @@ -1,194 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Pipes; - -use Symfony\Component\Process\Exception\RuntimeException; -use Symfony\Component\Process\Process; - -/** - * WindowsPipes implementation uses temporary files as handles. - * - * @see https://bugs.php.net/51800 - * @see https://bugs.php.net/65650 - * - * @author Romain Neutron - * - * @internal - */ -class WindowsPipes extends AbstractPipes -{ - private $files = []; - private $fileHandles = []; - private $lockHandles = []; - private $readBytes = [ - Process::STDOUT => 0, - Process::STDERR => 0, - ]; - private $haveReadSupport; - - public function __construct($input, bool $haveReadSupport) - { - $this->haveReadSupport = $haveReadSupport; - - if ($this->haveReadSupport) { - // Fix for PHP bug #51800: reading from STDOUT pipe hangs forever on Windows if the output is too big. - // Workaround for this problem is to use temporary files instead of pipes on Windows platform. - // - // @see https://bugs.php.net/51800 - $pipes = [ - Process::STDOUT => Process::OUT, - Process::STDERR => Process::ERR, - ]; - $tmpDir = sys_get_temp_dir(); - $lastError = 'unknown reason'; - set_error_handler(function ($type, $msg) use (&$lastError) { $lastError = $msg; }); - for ($i = 0;; ++$i) { - foreach ($pipes as $pipe => $name) { - $file = sprintf('%s\\sf_proc_%02X.%s', $tmpDir, $i, $name); - - if (!$h = fopen($file.'.lock', 'w')) { - if (file_exists($file.'.lock')) { - continue 2; - } - restore_error_handler(); - throw new RuntimeException('A temporary file could not be opened to write the process output: '.$lastError); - } - if (!flock($h, LOCK_EX | LOCK_NB)) { - continue 2; - } - if (isset($this->lockHandles[$pipe])) { - flock($this->lockHandles[$pipe], LOCK_UN); - fclose($this->lockHandles[$pipe]); - } - $this->lockHandles[$pipe] = $h; - - if (!fclose(fopen($file, 'w')) || !$h = fopen($file, 'r')) { - flock($this->lockHandles[$pipe], LOCK_UN); - fclose($this->lockHandles[$pipe]); - unset($this->lockHandles[$pipe]); - continue 2; - } - $this->fileHandles[$pipe] = $h; - $this->files[$pipe] = $file; - } - break; - } - restore_error_handler(); - } - - parent::__construct($input); - } - - public function __destruct() - { - $this->close(); - } - - /** - * {@inheritdoc} - */ - public function getDescriptors(): array - { - if (!$this->haveReadSupport) { - $nullstream = fopen('NUL', 'c'); - - return [ - ['pipe', 'r'], - $nullstream, - $nullstream, - ]; - } - - // We're not using pipe on Windows platform as it hangs (https://bugs.php.net/51800) - // We're not using file handles as it can produce corrupted output https://bugs.php.net/65650 - // So we redirect output within the commandline and pass the nul device to the process - return [ - ['pipe', 'r'], - ['file', 'NUL', 'w'], - ['file', 'NUL', 'w'], - ]; - } - - /** - * {@inheritdoc} - */ - public function getFiles(): array - { - return $this->files; - } - - /** - * {@inheritdoc} - */ - public function readAndWrite(bool $blocking, bool $close = false): array - { - $this->unblock(); - $w = $this->write(); - $read = $r = $e = []; - - if ($blocking) { - if ($w) { - @stream_select($r, $w, $e, 0, Process::TIMEOUT_PRECISION * 1E6); - } elseif ($this->fileHandles) { - usleep(Process::TIMEOUT_PRECISION * 1E6); - } - } - foreach ($this->fileHandles as $type => $fileHandle) { - $data = stream_get_contents($fileHandle, -1, $this->readBytes[$type]); - - if (isset($data[0])) { - $this->readBytes[$type] += \strlen($data); - $read[$type] = $data; - } - if ($close) { - ftruncate($fileHandle, 0); - fclose($fileHandle); - flock($this->lockHandles[$type], LOCK_UN); - fclose($this->lockHandles[$type]); - unset($this->fileHandles[$type], $this->lockHandles[$type]); - } - } - - return $read; - } - - /** - * {@inheritdoc} - */ - public function haveReadSupport(): bool - { - return $this->haveReadSupport; - } - - /** - * {@inheritdoc} - */ - public function areOpen(): bool - { - return $this->pipes && $this->fileHandles; - } - - /** - * {@inheritdoc} - */ - public function close() - { - parent::close(); - foreach ($this->fileHandles as $type => $handle) { - ftruncate($handle, 0); - fclose($handle); - flock($this->lockHandles[$type], LOCK_UN); - fclose($this->lockHandles[$type]); - } - $this->fileHandles = $this->lockHandles = []; - } -} diff --git a/vendor/symfony/process/Process.php b/vendor/symfony/process/Process.php deleted file mode 100644 index e1efb9c..0000000 --- a/vendor/symfony/process/Process.php +++ /dev/null @@ -1,1636 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -use Symfony\Component\Process\Exception\InvalidArgumentException; -use Symfony\Component\Process\Exception\LogicException; -use Symfony\Component\Process\Exception\ProcessFailedException; -use Symfony\Component\Process\Exception\ProcessSignaledException; -use Symfony\Component\Process\Exception\ProcessTimedOutException; -use Symfony\Component\Process\Exception\RuntimeException; -use Symfony\Component\Process\Pipes\PipesInterface; -use Symfony\Component\Process\Pipes\UnixPipes; -use Symfony\Component\Process\Pipes\WindowsPipes; - -/** - * Process is a thin wrapper around proc_* functions to easily - * start independent PHP processes. - * - * @author Fabien Potencier - * @author Romain Neutron - */ -class Process implements \IteratorAggregate -{ - const ERR = 'err'; - const OUT = 'out'; - - const STATUS_READY = 'ready'; - const STATUS_STARTED = 'started'; - const STATUS_TERMINATED = 'terminated'; - - const STDIN = 0; - const STDOUT = 1; - const STDERR = 2; - - // Timeout Precision in seconds. - const TIMEOUT_PRECISION = 0.2; - - const ITER_NON_BLOCKING = 1; // By default, iterating over outputs is a blocking call, use this flag to make it non-blocking - const ITER_KEEP_OUTPUT = 2; // By default, outputs are cleared while iterating, use this flag to keep them in memory - const ITER_SKIP_OUT = 4; // Use this flag to skip STDOUT while iterating - const ITER_SKIP_ERR = 8; // Use this flag to skip STDERR while iterating - - private $callback; - private $hasCallback = false; - private $commandline; - private $cwd; - private $env; - private $input; - private $starttime; - private $lastOutputTime; - private $timeout; - private $idleTimeout; - private $exitcode; - private $fallbackStatus = []; - private $processInformation; - private $outputDisabled = false; - private $stdout; - private $stderr; - private $process; - private $status = self::STATUS_READY; - private $incrementalOutputOffset = 0; - private $incrementalErrorOutputOffset = 0; - private $tty = false; - private $pty; - - private $useFileHandles = false; - /** @var PipesInterface */ - private $processPipes; - - private $latestSignal; - - private static $sigchild; - - /** - * Exit codes translation table. - * - * User-defined errors must use exit codes in the 64-113 range. - */ - public static $exitCodes = [ - 0 => 'OK', - 1 => 'General error', - 2 => 'Misuse of shell builtins', - - 126 => 'Invoked command cannot execute', - 127 => 'Command not found', - 128 => 'Invalid exit argument', - - // signals - 129 => 'Hangup', - 130 => 'Interrupt', - 131 => 'Quit and dump core', - 132 => 'Illegal instruction', - 133 => 'Trace/breakpoint trap', - 134 => 'Process aborted', - 135 => 'Bus error: "access to undefined portion of memory object"', - 136 => 'Floating point exception: "erroneous arithmetic operation"', - 137 => 'Kill (terminate immediately)', - 138 => 'User-defined 1', - 139 => 'Segmentation violation', - 140 => 'User-defined 2', - 141 => 'Write to pipe with no one reading', - 142 => 'Signal raised by alarm', - 143 => 'Termination (request to terminate)', - // 144 - not defined - 145 => 'Child process terminated, stopped (or continued*)', - 146 => 'Continue if stopped', - 147 => 'Stop executing temporarily', - 148 => 'Terminal stop signal', - 149 => 'Background process attempting to read from tty ("in")', - 150 => 'Background process attempting to write to tty ("out")', - 151 => 'Urgent data available on socket', - 152 => 'CPU time limit exceeded', - 153 => 'File size limit exceeded', - 154 => 'Signal raised by timer counting virtual time: "virtual timer expired"', - 155 => 'Profiling timer expired', - // 156 - not defined - 157 => 'Pollable event', - // 158 - not defined - 159 => 'Bad syscall', - ]; - - /** - * @param array $command The command to run and its arguments listed as separate entries - * @param string|null $cwd The working directory or null to use the working dir of the current PHP process - * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param mixed|null $input The input as stream resource, scalar or \Traversable, or null for no input - * @param int|float|null $timeout The timeout in seconds or null to disable - * - * @throws LogicException When proc_open is not installed - */ - public function __construct(array $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) - { - if (!\function_exists('proc_open')) { - throw new LogicException('The Process class relies on proc_open, which is not available on your PHP installation.'); - } - - $this->commandline = $command; - $this->cwd = $cwd; - - // on Windows, if the cwd changed via chdir(), proc_open defaults to the dir where PHP was started - // on Gnu/Linux, PHP builds with --enable-maintainer-zts are also affected - // @see : https://bugs.php.net/51800 - // @see : https://bugs.php.net/50524 - if (null === $this->cwd && (\defined('ZEND_THREAD_SAFE') || '\\' === \DIRECTORY_SEPARATOR)) { - $this->cwd = getcwd(); - } - if (null !== $env) { - $this->setEnv($env); - } - - $this->setInput($input); - $this->setTimeout($timeout); - $this->useFileHandles = '\\' === \DIRECTORY_SEPARATOR; - $this->pty = false; - } - - /** - * Creates a Process instance as a command-line to be run in a shell wrapper. - * - * Command-lines are parsed by the shell of your OS (/bin/sh on Unix-like, cmd.exe on Windows.) - * This allows using e.g. pipes or conditional execution. In this mode, signals are sent to the - * shell wrapper and not to your commands. - * - * In order to inject dynamic values into command-lines, we strongly recommend using placeholders. - * This will save escaping values, which is not portable nor secure anyway: - * - * $process = Process::fromShellCommandline('my_command "$MY_VAR"'); - * $process->run(null, ['MY_VAR' => $theValue]); - * - * @param string $command The command line to pass to the shell of the OS - * @param string|null $cwd The working directory or null to use the working dir of the current PHP process - * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param mixed|null $input The input as stream resource, scalar or \Traversable, or null for no input - * @param int|float|null $timeout The timeout in seconds or null to disable - * - * @return static - * - * @throws LogicException When proc_open is not installed - */ - public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) - { - $process = new static([], $cwd, $env, $input, $timeout); - $process->commandline = $command; - - return $process; - } - - public function __destruct() - { - $this->stop(0); - } - - public function __clone() - { - $this->resetProcessData(); - } - - /** - * Runs the process. - * - * The callback receives the type of output (out or err) and - * some bytes from the output in real-time. It allows to have feedback - * from the independent process during execution. - * - * The STDOUT and STDERR are also available after the process is finished - * via the getOutput() and getErrorOutput() methods. - * - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @return int The exit status code - * - * @throws RuntimeException When process can't be launched - * @throws RuntimeException When process is already running - * @throws ProcessTimedOutException When process timed out - * @throws ProcessSignaledException When process stopped after receiving signal - * @throws LogicException In case a callback is provided and output has been disabled - * - * @final - */ - public function run(callable $callback = null, array $env = []): int - { - $this->start($callback, $env); - - return $this->wait(); - } - - /** - * Runs the process. - * - * This is identical to run() except that an exception is thrown if the process - * exits with a non-zero exit code. - * - * @return $this - * - * @throws ProcessFailedException if the process didn't terminate successfully - * - * @final - */ - public function mustRun(callable $callback = null, array $env = []): self - { - if (0 !== $this->run($callback, $env)) { - throw new ProcessFailedException($this); - } - - return $this; - } - - /** - * Starts the process and returns after writing the input to STDIN. - * - * This method blocks until all STDIN data is sent to the process then it - * returns while the process runs in the background. - * - * The termination of the process can be awaited with wait(). - * - * The callback receives the type of output (out or err) and some bytes from - * the output in real-time while writing the standard input to the process. - * It allows to have feedback from the independent process during execution. - * - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @throws RuntimeException When process can't be launched - * @throws RuntimeException When process is already running - * @throws LogicException In case a callback is provided and output has been disabled - */ - public function start(callable $callback = null, array $env = []) - { - if ($this->isRunning()) { - throw new RuntimeException('Process is already running.'); - } - - $this->resetProcessData(); - $this->starttime = $this->lastOutputTime = microtime(true); - $this->callback = $this->buildCallback($callback); - $this->hasCallback = null !== $callback; - $descriptors = $this->getDescriptors(); - - if ($this->env) { - $env += $this->env; - } - - $env += $this->getDefaultEnv(); - - if (\is_array($commandline = $this->commandline)) { - $commandline = implode(' ', array_map([$this, 'escapeArgument'], $commandline)); - - if ('\\' !== \DIRECTORY_SEPARATOR) { - // exec is mandatory to deal with sending a signal to the process - $commandline = 'exec '.$commandline; - } - } else { - $commandline = $this->replacePlaceholders($commandline, $env); - } - - $options = ['suppress_errors' => true]; - - if ('\\' === \DIRECTORY_SEPARATOR) { - $options['bypass_shell'] = true; - $commandline = $this->prepareWindowsCommandLine($commandline, $env); - } elseif (!$this->useFileHandles && $this->isSigchildEnabled()) { - // last exit code is output on the fourth pipe and caught to work around --enable-sigchild - $descriptors[3] = ['pipe', 'w']; - - // See https://unix.stackexchange.com/questions/71205/background-process-pipe-input - $commandline = '{ ('.$commandline.') <&3 3<&- 3>/dev/null & } 3<&0;'; - $commandline .= 'pid=$!; echo $pid >&3; wait $pid; code=$?; echo $code >&3; exit $code'; - - // Workaround for the bug, when PTS functionality is enabled. - // @see : https://bugs.php.net/69442 - $ptsWorkaround = fopen(__FILE__, 'r'); - } - - $envPairs = []; - foreach ($env as $k => $v) { - if (false !== $v) { - $envPairs[] = $k.'='.$v; - } - } - - if (!is_dir($this->cwd)) { - throw new RuntimeException(sprintf('The provided cwd "%s" does not exist.', $this->cwd)); - } - - $this->process = @proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $envPairs, $options); - - if (!\is_resource($this->process)) { - throw new RuntimeException('Unable to launch a new process.'); - } - $this->status = self::STATUS_STARTED; - - if (isset($descriptors[3])) { - $this->fallbackStatus['pid'] = (int) fgets($this->processPipes->pipes[3]); - } - - if ($this->tty) { - return; - } - - $this->updateStatus(false); - $this->checkTimeout(); - } - - /** - * Restarts the process. - * - * Be warned that the process is cloned before being started. - * - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @return static - * - * @throws RuntimeException When process can't be launched - * @throws RuntimeException When process is already running - * - * @see start() - * - * @final - */ - public function restart(callable $callback = null, array $env = []): self - { - if ($this->isRunning()) { - throw new RuntimeException('Process is already running.'); - } - - $process = clone $this; - $process->start($callback, $env); - - return $process; - } - - /** - * Waits for the process to terminate. - * - * The callback receives the type of output (out or err) and some bytes - * from the output in real-time while writing the standard input to the process. - * It allows to have feedback from the independent process during execution. - * - * @param callable|null $callback A valid PHP callback - * - * @return int The exitcode of the process - * - * @throws ProcessTimedOutException When process timed out - * @throws ProcessSignaledException When process stopped after receiving signal - * @throws LogicException When process is not yet started - */ - public function wait(callable $callback = null) - { - $this->requireProcessIsStarted(__FUNCTION__); - - $this->updateStatus(false); - - if (null !== $callback) { - if (!$this->processPipes->haveReadSupport()) { - $this->stop(0); - throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::wait".'); - } - $this->callback = $this->buildCallback($callback); - } - - do { - $this->checkTimeout(); - $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen(); - $this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); - } while ($running); - - while ($this->isRunning()) { - $this->checkTimeout(); - usleep(1000); - } - - if ($this->processInformation['signaled'] && $this->processInformation['termsig'] !== $this->latestSignal) { - throw new ProcessSignaledException($this); - } - - return $this->exitcode; - } - - /** - * Waits until the callback returns true. - * - * The callback receives the type of output (out or err) and some bytes - * from the output in real-time while writing the standard input to the process. - * It allows to have feedback from the independent process during execution. - * - * @throws RuntimeException When process timed out - * @throws LogicException When process is not yet started - * @throws ProcessTimedOutException In case the timeout was reached - */ - public function waitUntil(callable $callback): bool - { - $this->requireProcessIsStarted(__FUNCTION__); - $this->updateStatus(false); - - if (!$this->processPipes->haveReadSupport()) { - $this->stop(0); - throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::waitUntil".'); - } - $callback = $this->buildCallback($callback); - - $ready = false; - while (true) { - $this->checkTimeout(); - $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen(); - $output = $this->processPipes->readAndWrite($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); - - foreach ($output as $type => $data) { - if (3 !== $type) { - $ready = $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data) || $ready; - } elseif (!isset($this->fallbackStatus['signaled'])) { - $this->fallbackStatus['exitcode'] = (int) $data; - } - } - if ($ready) { - return true; - } - if (!$running) { - return false; - } - - usleep(1000); - } - } - - /** - * Returns the Pid (process identifier), if applicable. - * - * @return int|null The process id if running, null otherwise - */ - public function getPid() - { - return $this->isRunning() ? $this->processInformation['pid'] : null; - } - - /** - * Sends a POSIX signal to the process. - * - * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants) - * - * @return $this - * - * @throws LogicException In case the process is not running - * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed - * @throws RuntimeException In case of failure - */ - public function signal(int $signal) - { - $this->doSignal($signal, true); - - return $this; - } - - /** - * Disables fetching output and error output from the underlying process. - * - * @return $this - * - * @throws RuntimeException In case the process is already running - * @throws LogicException if an idle timeout is set - */ - public function disableOutput() - { - if ($this->isRunning()) { - throw new RuntimeException('Disabling output while the process is running is not possible.'); - } - if (null !== $this->idleTimeout) { - throw new LogicException('Output can not be disabled while an idle timeout is set.'); - } - - $this->outputDisabled = true; - - return $this; - } - - /** - * Enables fetching output and error output from the underlying process. - * - * @return $this - * - * @throws RuntimeException In case the process is already running - */ - public function enableOutput() - { - if ($this->isRunning()) { - throw new RuntimeException('Enabling output while the process is running is not possible.'); - } - - $this->outputDisabled = false; - - return $this; - } - - /** - * Returns true in case the output is disabled, false otherwise. - * - * @return bool - */ - public function isOutputDisabled() - { - return $this->outputDisabled; - } - - /** - * Returns the current output of the process (STDOUT). - * - * @return string The process output - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getOutput() - { - $this->readPipesForOutput(__FUNCTION__); - - if (false === $ret = stream_get_contents($this->stdout, -1, 0)) { - return ''; - } - - return $ret; - } - - /** - * Returns the output incrementally. - * - * In comparison with the getOutput method which always return the whole - * output, this one returns the new output since the last call. - * - * @return string The process output since the last call - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getIncrementalOutput() - { - $this->readPipesForOutput(__FUNCTION__); - - $latest = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset); - $this->incrementalOutputOffset = ftell($this->stdout); - - if (false === $latest) { - return ''; - } - - return $latest; - } - - /** - * Returns an iterator to the output of the process, with the output type as keys (Process::OUT/ERR). - * - * @param int $flags A bit field of Process::ITER_* flags - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - * - * @return \Generator - */ - public function getIterator(int $flags = 0) - { - $this->readPipesForOutput(__FUNCTION__, false); - - $clearOutput = !(self::ITER_KEEP_OUTPUT & $flags); - $blocking = !(self::ITER_NON_BLOCKING & $flags); - $yieldOut = !(self::ITER_SKIP_OUT & $flags); - $yieldErr = !(self::ITER_SKIP_ERR & $flags); - - while (null !== $this->callback || ($yieldOut && !feof($this->stdout)) || ($yieldErr && !feof($this->stderr))) { - if ($yieldOut) { - $out = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset); - - if (isset($out[0])) { - if ($clearOutput) { - $this->clearOutput(); - } else { - $this->incrementalOutputOffset = ftell($this->stdout); - } - - yield self::OUT => $out; - } - } - - if ($yieldErr) { - $err = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset); - - if (isset($err[0])) { - if ($clearOutput) { - $this->clearErrorOutput(); - } else { - $this->incrementalErrorOutputOffset = ftell($this->stderr); - } - - yield self::ERR => $err; - } - } - - if (!$blocking && !isset($out[0]) && !isset($err[0])) { - yield self::OUT => ''; - } - - $this->checkTimeout(); - $this->readPipesForOutput(__FUNCTION__, $blocking); - } - } - - /** - * Clears the process output. - * - * @return $this - */ - public function clearOutput() - { - ftruncate($this->stdout, 0); - fseek($this->stdout, 0); - $this->incrementalOutputOffset = 0; - - return $this; - } - - /** - * Returns the current error output of the process (STDERR). - * - * @return string The process error output - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getErrorOutput() - { - $this->readPipesForOutput(__FUNCTION__); - - if (false === $ret = stream_get_contents($this->stderr, -1, 0)) { - return ''; - } - - return $ret; - } - - /** - * Returns the errorOutput incrementally. - * - * In comparison with the getErrorOutput method which always return the - * whole error output, this one returns the new error output since the last - * call. - * - * @return string The process error output since the last call - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getIncrementalErrorOutput() - { - $this->readPipesForOutput(__FUNCTION__); - - $latest = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset); - $this->incrementalErrorOutputOffset = ftell($this->stderr); - - if (false === $latest) { - return ''; - } - - return $latest; - } - - /** - * Clears the process output. - * - * @return $this - */ - public function clearErrorOutput() - { - ftruncate($this->stderr, 0); - fseek($this->stderr, 0); - $this->incrementalErrorOutputOffset = 0; - - return $this; - } - - /** - * Returns the exit code returned by the process. - * - * @return int|null The exit status code, null if the Process is not terminated - */ - public function getExitCode() - { - $this->updateStatus(false); - - return $this->exitcode; - } - - /** - * Returns a string representation for the exit code returned by the process. - * - * This method relies on the Unix exit code status standardization - * and might not be relevant for other operating systems. - * - * @return string|null A string representation for the exit status code, null if the Process is not terminated - * - * @see http://tldp.org/LDP/abs/html/exitcodes.html - * @see http://en.wikipedia.org/wiki/Unix_signal - */ - public function getExitCodeText() - { - if (null === $exitcode = $this->getExitCode()) { - return null; - } - - return isset(self::$exitCodes[$exitcode]) ? self::$exitCodes[$exitcode] : 'Unknown error'; - } - - /** - * Checks if the process ended successfully. - * - * @return bool true if the process ended successfully, false otherwise - */ - public function isSuccessful() - { - return 0 === $this->getExitCode(); - } - - /** - * Returns true if the child process has been terminated by an uncaught signal. - * - * It always returns false on Windows. - * - * @return bool - * - * @throws LogicException In case the process is not terminated - */ - public function hasBeenSignaled() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - return $this->processInformation['signaled']; - } - - /** - * Returns the number of the signal that caused the child process to terminate its execution. - * - * It is only meaningful if hasBeenSignaled() returns true. - * - * @return int - * - * @throws RuntimeException In case --enable-sigchild is activated - * @throws LogicException In case the process is not terminated - */ - public function getTermSignal() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - if ($this->isSigchildEnabled() && -1 === $this->processInformation['termsig']) { - throw new RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.'); - } - - return $this->processInformation['termsig']; - } - - /** - * Returns true if the child process has been stopped by a signal. - * - * It always returns false on Windows. - * - * @return bool - * - * @throws LogicException In case the process is not terminated - */ - public function hasBeenStopped() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - return $this->processInformation['stopped']; - } - - /** - * Returns the number of the signal that caused the child process to stop its execution. - * - * It is only meaningful if hasBeenStopped() returns true. - * - * @return int - * - * @throws LogicException In case the process is not terminated - */ - public function getStopSignal() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - return $this->processInformation['stopsig']; - } - - /** - * Checks if the process is currently running. - * - * @return bool true if the process is currently running, false otherwise - */ - public function isRunning() - { - if (self::STATUS_STARTED !== $this->status) { - return false; - } - - $this->updateStatus(false); - - return $this->processInformation['running']; - } - - /** - * Checks if the process has been started with no regard to the current state. - * - * @return bool true if status is ready, false otherwise - */ - public function isStarted() - { - return self::STATUS_READY != $this->status; - } - - /** - * Checks if the process is terminated. - * - * @return bool true if process is terminated, false otherwise - */ - public function isTerminated() - { - $this->updateStatus(false); - - return self::STATUS_TERMINATED == $this->status; - } - - /** - * Gets the process status. - * - * The status is one of: ready, started, terminated. - * - * @return string The current process status - */ - public function getStatus() - { - $this->updateStatus(false); - - return $this->status; - } - - /** - * Stops the process. - * - * @param int|float $timeout The timeout in seconds - * @param int $signal A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL (9) - * - * @return int|null The exit-code of the process or null if it's not running - */ - public function stop(float $timeout = 10, int $signal = null) - { - $timeoutMicro = microtime(true) + $timeout; - if ($this->isRunning()) { - // given SIGTERM may not be defined and that "proc_terminate" uses the constant value and not the constant itself, we use the same here - $this->doSignal(15, false); - do { - usleep(1000); - } while ($this->isRunning() && microtime(true) < $timeoutMicro); - - if ($this->isRunning()) { - // Avoid exception here: process is supposed to be running, but it might have stopped just - // after this line. In any case, let's silently discard the error, we cannot do anything. - $this->doSignal($signal ?: 9, false); - } - } - - if ($this->isRunning()) { - if (isset($this->fallbackStatus['pid'])) { - unset($this->fallbackStatus['pid']); - - return $this->stop(0, $signal); - } - $this->close(); - } - - return $this->exitcode; - } - - /** - * Adds a line to the STDOUT stream. - * - * @internal - */ - public function addOutput(string $line) - { - $this->lastOutputTime = microtime(true); - - fseek($this->stdout, 0, SEEK_END); - fwrite($this->stdout, $line); - fseek($this->stdout, $this->incrementalOutputOffset); - } - - /** - * Adds a line to the STDERR stream. - * - * @internal - */ - public function addErrorOutput(string $line) - { - $this->lastOutputTime = microtime(true); - - fseek($this->stderr, 0, SEEK_END); - fwrite($this->stderr, $line); - fseek($this->stderr, $this->incrementalErrorOutputOffset); - } - - /** - * Gets the last output time in seconds. - * - * @return float|null The last output time in seconds or null if it isn't started - */ - public function getLastOutputTime(): ?float - { - return $this->lastOutputTime; - } - - /** - * Gets the command line to be executed. - * - * @return string The command to execute - */ - public function getCommandLine() - { - return \is_array($this->commandline) ? implode(' ', array_map([$this, 'escapeArgument'], $this->commandline)) : $this->commandline; - } - - /** - * Gets the process timeout (max. runtime). - * - * @return float|null The timeout in seconds or null if it's disabled - */ - public function getTimeout() - { - return $this->timeout; - } - - /** - * Gets the process idle timeout (max. time since last output). - * - * @return float|null The timeout in seconds or null if it's disabled - */ - public function getIdleTimeout() - { - return $this->idleTimeout; - } - - /** - * Sets the process timeout (max. runtime) in seconds. - * - * To disable the timeout, set this value to null. - * - * @return $this - * - * @throws InvalidArgumentException if the timeout is negative - */ - public function setTimeout(?float $timeout) - { - $this->timeout = $this->validateTimeout($timeout); - - return $this; - } - - /** - * Sets the process idle timeout (max. time since last output) in seconds. - * - * To disable the timeout, set this value to null. - * - * @return $this - * - * @throws LogicException if the output is disabled - * @throws InvalidArgumentException if the timeout is negative - */ - public function setIdleTimeout(?float $timeout) - { - if (null !== $timeout && $this->outputDisabled) { - throw new LogicException('Idle timeout can not be set while the output is disabled.'); - } - - $this->idleTimeout = $this->validateTimeout($timeout); - - return $this; - } - - /** - * Enables or disables the TTY mode. - * - * @return $this - * - * @throws RuntimeException In case the TTY mode is not supported - */ - public function setTty(bool $tty) - { - if ('\\' === \DIRECTORY_SEPARATOR && $tty) { - throw new RuntimeException('TTY mode is not supported on Windows platform.'); - } - - if ($tty && !self::isTtySupported()) { - throw new RuntimeException('TTY mode requires /dev/tty to be read/writable.'); - } - - $this->tty = $tty; - - return $this; - } - - /** - * Checks if the TTY mode is enabled. - * - * @return bool true if the TTY mode is enabled, false otherwise - */ - public function isTty() - { - return $this->tty; - } - - /** - * Sets PTY mode. - * - * @return $this - */ - public function setPty(bool $bool) - { - $this->pty = $bool; - - return $this; - } - - /** - * Returns PTY state. - * - * @return bool - */ - public function isPty() - { - return $this->pty; - } - - /** - * Gets the working directory. - * - * @return string|null The current working directory or null on failure - */ - public function getWorkingDirectory() - { - if (null === $this->cwd) { - // getcwd() will return false if any one of the parent directories does not have - // the readable or search mode set, even if the current directory does - return getcwd() ?: null; - } - - return $this->cwd; - } - - /** - * Sets the current working directory. - * - * @return $this - */ - public function setWorkingDirectory(string $cwd) - { - $this->cwd = $cwd; - - return $this; - } - - /** - * Gets the environment variables. - * - * @return array The current environment variables - */ - public function getEnv() - { - return $this->env; - } - - /** - * Sets the environment variables. - * - * Each environment variable value should be a string. - * If it is an array, the variable is ignored. - * If it is false or null, it will be removed when - * env vars are otherwise inherited. - * - * That happens in PHP when 'argv' is registered into - * the $_ENV array for instance. - * - * @param array $env The new environment variables - * - * @return $this - */ - public function setEnv(array $env) - { - // Process can not handle env values that are arrays - $env = array_filter($env, function ($value) { - return !\is_array($value); - }); - - $this->env = $env; - - return $this; - } - - /** - * Gets the Process input. - * - * @return resource|string|\Iterator|null The Process input - */ - public function getInput() - { - return $this->input; - } - - /** - * Sets the input. - * - * This content will be passed to the underlying process standard input. - * - * @param string|int|float|bool|resource|\Traversable|null $input The content - * - * @return $this - * - * @throws LogicException In case the process is running - */ - public function setInput($input) - { - if ($this->isRunning()) { - throw new LogicException('Input can not be set while the process is running.'); - } - - $this->input = ProcessUtils::validateInput(__METHOD__, $input); - - return $this; - } - - /** - * Performs a check between the timeout definition and the time the process started. - * - * In case you run a background process (with the start method), you should - * trigger this method regularly to ensure the process timeout - * - * @throws ProcessTimedOutException In case the timeout was reached - */ - public function checkTimeout() - { - if (self::STATUS_STARTED !== $this->status) { - return; - } - - if (null !== $this->timeout && $this->timeout < microtime(true) - $this->starttime) { - $this->stop(0); - - throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_GENERAL); - } - - if (null !== $this->idleTimeout && $this->idleTimeout < microtime(true) - $this->lastOutputTime) { - $this->stop(0); - - throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_IDLE); - } - } - - /** - * @throws LogicException in case process is not started - */ - public function getStartTime(): float - { - if (!$this->isStarted()) { - throw new LogicException('Start time is only available after process start.'); - } - - return $this->starttime; - } - - /** - * Returns whether TTY is supported on the current operating system. - */ - public static function isTtySupported(): bool - { - static $isTtySupported; - - if (null === $isTtySupported) { - $isTtySupported = (bool) @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); - } - - return $isTtySupported; - } - - /** - * Returns whether PTY is supported on the current operating system. - * - * @return bool - */ - public static function isPtySupported() - { - static $result; - - if (null !== $result) { - return $result; - } - - if ('\\' === \DIRECTORY_SEPARATOR) { - return $result = false; - } - - return $result = (bool) @proc_open('echo 1 >/dev/null', [['pty'], ['pty'], ['pty']], $pipes); - } - - /** - * Creates the descriptors needed by the proc_open. - */ - private function getDescriptors(): array - { - if ($this->input instanceof \Iterator) { - $this->input->rewind(); - } - if ('\\' === \DIRECTORY_SEPARATOR) { - $this->processPipes = new WindowsPipes($this->input, !$this->outputDisabled || $this->hasCallback); - } else { - $this->processPipes = new UnixPipes($this->isTty(), $this->isPty(), $this->input, !$this->outputDisabled || $this->hasCallback); - } - - return $this->processPipes->getDescriptors(); - } - - /** - * Builds up the callback used by wait(). - * - * The callbacks adds all occurred output to the specific buffer and calls - * the user callback (if present) with the received output. - * - * @param callable|null $callback The user defined PHP callback - * - * @return \Closure A PHP closure - */ - protected function buildCallback(callable $callback = null) - { - if ($this->outputDisabled) { - return function ($type, $data) use ($callback): bool { - return null !== $callback && $callback($type, $data); - }; - } - - $out = self::OUT; - - return function ($type, $data) use ($callback, $out): bool { - if ($out == $type) { - $this->addOutput($data); - } else { - $this->addErrorOutput($data); - } - - return null !== $callback && $callback($type, $data); - }; - } - - /** - * Updates the status of the process, reads pipes. - * - * @param bool $blocking Whether to use a blocking read call - */ - protected function updateStatus(bool $blocking) - { - if (self::STATUS_STARTED !== $this->status) { - return; - } - - $this->processInformation = proc_get_status($this->process); - $running = $this->processInformation['running']; - - $this->readPipes($running && $blocking, '\\' !== \DIRECTORY_SEPARATOR || !$running); - - if ($this->fallbackStatus && $this->isSigchildEnabled()) { - $this->processInformation = $this->fallbackStatus + $this->processInformation; - } - - if (!$running) { - $this->close(); - } - } - - /** - * Returns whether PHP has been compiled with the '--enable-sigchild' option or not. - * - * @return bool - */ - protected function isSigchildEnabled() - { - if (null !== self::$sigchild) { - return self::$sigchild; - } - - if (!\function_exists('phpinfo')) { - return self::$sigchild = false; - } - - ob_start(); - phpinfo(INFO_GENERAL); - - return self::$sigchild = false !== strpos(ob_get_clean(), '--enable-sigchild'); - } - - /** - * Reads pipes for the freshest output. - * - * @param string $caller The name of the method that needs fresh outputs - * @param bool $blocking Whether to use blocking calls or not - * - * @throws LogicException in case output has been disabled or process is not started - */ - private function readPipesForOutput(string $caller, bool $blocking = false) - { - if ($this->outputDisabled) { - throw new LogicException('Output has been disabled.'); - } - - $this->requireProcessIsStarted($caller); - - $this->updateStatus($blocking); - } - - /** - * Validates and returns the filtered timeout. - * - * @throws InvalidArgumentException if the given timeout is a negative number - */ - private function validateTimeout(?float $timeout): ?float - { - $timeout = (float) $timeout; - - if (0.0 === $timeout) { - $timeout = null; - } elseif ($timeout < 0) { - throw new InvalidArgumentException('The timeout value must be a valid positive integer or float number.'); - } - - return $timeout; - } - - /** - * Reads pipes, executes callback. - * - * @param bool $blocking Whether to use blocking calls or not - * @param bool $close Whether to close file handles or not - */ - private function readPipes(bool $blocking, bool $close) - { - $result = $this->processPipes->readAndWrite($blocking, $close); - - $callback = $this->callback; - foreach ($result as $type => $data) { - if (3 !== $type) { - $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data); - } elseif (!isset($this->fallbackStatus['signaled'])) { - $this->fallbackStatus['exitcode'] = (int) $data; - } - } - } - - /** - * Closes process resource, closes file handles, sets the exitcode. - * - * @return int The exitcode - */ - private function close(): int - { - $this->processPipes->close(); - if (\is_resource($this->process)) { - proc_close($this->process); - } - $this->exitcode = $this->processInformation['exitcode']; - $this->status = self::STATUS_TERMINATED; - - if (-1 === $this->exitcode) { - if ($this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) { - // if process has been signaled, no exitcode but a valid termsig, apply Unix convention - $this->exitcode = 128 + $this->processInformation['termsig']; - } elseif ($this->isSigchildEnabled()) { - $this->processInformation['signaled'] = true; - $this->processInformation['termsig'] = -1; - } - } - - // Free memory from self-reference callback created by buildCallback - // Doing so in other contexts like __destruct or by garbage collector is ineffective - // Now pipes are closed, so the callback is no longer necessary - $this->callback = null; - - return $this->exitcode; - } - - /** - * Resets data related to the latest run of the process. - */ - private function resetProcessData() - { - $this->starttime = null; - $this->callback = null; - $this->exitcode = null; - $this->fallbackStatus = []; - $this->processInformation = null; - $this->stdout = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+b'); - $this->stderr = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+b'); - $this->process = null; - $this->latestSignal = null; - $this->status = self::STATUS_READY; - $this->incrementalOutputOffset = 0; - $this->incrementalErrorOutputOffset = 0; - } - - /** - * Sends a POSIX signal to the process. - * - * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants) - * @param bool $throwException Whether to throw exception in case signal failed - * - * @return bool True if the signal was sent successfully, false otherwise - * - * @throws LogicException In case the process is not running - * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed - * @throws RuntimeException In case of failure - */ - private function doSignal(int $signal, bool $throwException): bool - { - if (null === $pid = $this->getPid()) { - if ($throwException) { - throw new LogicException('Can not send signal on a non running process.'); - } - - return false; - } - - if ('\\' === \DIRECTORY_SEPARATOR) { - exec(sprintf('taskkill /F /T /PID %d 2>&1', $pid), $output, $exitCode); - if ($exitCode && $this->isRunning()) { - if ($throwException) { - throw new RuntimeException(sprintf('Unable to kill the process (%s).', implode(' ', $output))); - } - - return false; - } - } else { - if (!$this->isSigchildEnabled()) { - $ok = @proc_terminate($this->process, $signal); - } elseif (\function_exists('posix_kill')) { - $ok = @posix_kill($pid, $signal); - } elseif ($ok = proc_open(sprintf('kill -%d %d', $signal, $pid), [2 => ['pipe', 'w']], $pipes)) { - $ok = false === fgets($pipes[2]); - } - if (!$ok) { - if ($throwException) { - throw new RuntimeException(sprintf('Error while sending signal "%s".', $signal)); - } - - return false; - } - } - - $this->latestSignal = $signal; - $this->fallbackStatus['signaled'] = true; - $this->fallbackStatus['exitcode'] = -1; - $this->fallbackStatus['termsig'] = $this->latestSignal; - - return true; - } - - private function prepareWindowsCommandLine(string $cmd, array &$env): string - { - $uid = uniqid('', true); - $varCount = 0; - $varCache = []; - $cmd = preg_replace_callback( - '/"(?:( - [^"%!^]*+ - (?: - (?: !LF! | "(?:\^[%!^])?+" ) - [^"%!^]*+ - )++ - ) | [^"]*+ )"/x', - function ($m) use (&$env, &$varCache, &$varCount, $uid) { - if (!isset($m[1])) { - return $m[0]; - } - if (isset($varCache[$m[0]])) { - return $varCache[$m[0]]; - } - if (false !== strpos($value = $m[1], "\0")) { - $value = str_replace("\0", '?', $value); - } - if (false === strpbrk($value, "\"%!\n")) { - return '"'.$value.'"'; - } - - $value = str_replace(['!LF!', '"^!"', '"^%"', '"^^"', '""'], ["\n", '!', '%', '^', '"'], $value); - $value = '"'.preg_replace('/(\\\\*)"/', '$1$1\\"', $value).'"'; - $var = $uid.++$varCount; - - $env[$var] = $value; - - return $varCache[$m[0]] = '!'.$var.'!'; - }, - $cmd - ); - - $cmd = 'cmd /V:ON /E:ON /D /C ('.str_replace("\n", ' ', $cmd).')'; - foreach ($this->processPipes->getFiles() as $offset => $filename) { - $cmd .= ' '.$offset.'>"'.$filename.'"'; - } - - return $cmd; - } - - /** - * Ensures the process is running or terminated, throws a LogicException if the process has a not started. - * - * @throws LogicException if the process has not run - */ - private function requireProcessIsStarted(string $functionName) - { - if (!$this->isStarted()) { - throw new LogicException(sprintf('Process must be started before calling "%s()".', $functionName)); - } - } - - /** - * Ensures the process is terminated, throws a LogicException if the process has a status different than "terminated". - * - * @throws LogicException if the process is not yet terminated - */ - private function requireProcessIsTerminated(string $functionName) - { - if (!$this->isTerminated()) { - throw new LogicException(sprintf('Process must be terminated before calling "%s()".', $functionName)); - } - } - - /** - * Escapes a string to be used as a shell argument. - */ - private function escapeArgument(?string $argument): string - { - if ('' === $argument || null === $argument) { - return '""'; - } - if ('\\' !== \DIRECTORY_SEPARATOR) { - return "'".str_replace("'", "'\\''", $argument)."'"; - } - if (false !== strpos($argument, "\0")) { - $argument = str_replace("\0", '?', $argument); - } - if (!preg_match('/[\/()%!^"<>&|\s]/', $argument)) { - return $argument; - } - $argument = preg_replace('/(\\\\+)$/', '$1$1', $argument); - - return '"'.str_replace(['"', '^', '%', '!', "\n"], ['""', '"^^"', '"^%"', '"^!"', '!LF!'], $argument).'"'; - } - - private function replacePlaceholders(string $commandline, array $env) - { - return preg_replace_callback('/"\$\{:([_a-zA-Z]++[_a-zA-Z0-9]*+)\}"/', function ($matches) use ($commandline, $env) { - if (!isset($env[$matches[1]]) || false === $env[$matches[1]]) { - throw new InvalidArgumentException(sprintf('Command line is missing a value for parameter "%s": ', $matches[1]).$commandline); - } - - return $this->escapeArgument($env[$matches[1]]); - }, $commandline); - } - - private function getDefaultEnv(): array - { - $env = []; - - foreach ($_SERVER as $k => $v) { - if (\is_string($v) && false !== $v = getenv($k)) { - $env[$k] = $v; - } - } - - foreach ($_ENV as $k => $v) { - if (\is_string($v)) { - $env[$k] = $v; - } - } - - return $env; - } -} diff --git a/vendor/symfony/process/ProcessUtils.php b/vendor/symfony/process/ProcessUtils.php deleted file mode 100644 index 3be7e61..0000000 --- a/vendor/symfony/process/ProcessUtils.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -use Symfony\Component\Process\Exception\InvalidArgumentException; - -/** - * ProcessUtils is a bunch of utility methods. - * - * This class contains static methods only and is not meant to be instantiated. - * - * @author Martin Hasoň - */ -class ProcessUtils -{ - /** - * This class should not be instantiated. - */ - private function __construct() - { - } - - /** - * Validates and normalizes a Process input. - * - * @param string $caller The name of method call that validates the input - * @param mixed $input The input to validate - * - * @return mixed The validated input - * - * @throws InvalidArgumentException In case the input is not valid - */ - public static function validateInput(string $caller, $input) - { - if (null !== $input) { - if (\is_resource($input)) { - return $input; - } - if (\is_string($input)) { - return $input; - } - if (is_scalar($input)) { - return (string) $input; - } - if ($input instanceof Process) { - return $input->getIterator($input::ITER_SKIP_ERR); - } - if ($input instanceof \Iterator) { - return $input; - } - if ($input instanceof \Traversable) { - return new \IteratorIterator($input); - } - - throw new InvalidArgumentException(sprintf('"%s" only accepts strings, Traversable objects or stream resources.', $caller)); - } - - return $input; - } -} diff --git a/vendor/symfony/process/README.md b/vendor/symfony/process/README.md deleted file mode 100644 index b7ca5b4..0000000 --- a/vendor/symfony/process/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Process Component -================= - -The Process component executes commands in sub-processes. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/process.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/process/composer.json b/vendor/symfony/process/composer.json deleted file mode 100644 index 1957e56..0000000 --- a/vendor/symfony/process/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "symfony/process", - "type": "library", - "description": "Symfony Process Component", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Process\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - } -} diff --git a/vendor/symfony/service-contracts/.gitignore b/vendor/symfony/service-contracts/.gitignore deleted file mode 100644 index c49a5d8..0000000 --- a/vendor/symfony/service-contracts/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/vendor/symfony/service-contracts/CHANGELOG.md b/vendor/symfony/service-contracts/CHANGELOG.md deleted file mode 100644 index e984777..0000000 --- a/vendor/symfony/service-contracts/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -CHANGELOG -========= - -The changelog is maintained for all Symfony contracts at the following URL: -https://github.com/symfony/contracts/blob/master/CHANGELOG.md diff --git a/vendor/symfony/service-contracts/LICENSE b/vendor/symfony/service-contracts/LICENSE deleted file mode 100644 index 69d925b..0000000 --- a/vendor/symfony/service-contracts/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2018-2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/service-contracts/README.md b/vendor/symfony/service-contracts/README.md deleted file mode 100644 index d033a43..0000000 --- a/vendor/symfony/service-contracts/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Symfony Service Contracts -========================= - -A set of abstractions extracted out of the Symfony components. - -Can be used to build on semantics that the Symfony components proved useful - and -that already have battle tested implementations. - -See https://github.com/symfony/contracts/blob/master/README.md for more information. diff --git a/vendor/symfony/service-contracts/ResetInterface.php b/vendor/symfony/service-contracts/ResetInterface.php deleted file mode 100644 index 1af1075..0000000 --- a/vendor/symfony/service-contracts/ResetInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service; - -/** - * Provides a way to reset an object to its initial state. - * - * When calling the "reset()" method on an object, it should be put back to its - * initial state. This usually means clearing any internal buffers and forwarding - * the call to internal dependencies. All properties of the object should be put - * back to the same state it had when it was first ready to use. - * - * This method could be called, for example, to recycle objects that are used as - * services, so that they can be used to handle several requests in the same - * process loop (note that we advise making your services stateless instead of - * implementing this interface when possible.) - */ -interface ResetInterface -{ - public function reset(); -} diff --git a/vendor/symfony/service-contracts/ServiceLocatorTrait.php b/vendor/symfony/service-contracts/ServiceLocatorTrait.php deleted file mode 100644 index 1737f50..0000000 --- a/vendor/symfony/service-contracts/ServiceLocatorTrait.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service; - -use Psr\Container\ContainerExceptionInterface; -use Psr\Container\NotFoundExceptionInterface; - -// Help opcache.preload discover always-needed symbols -class_exists(ContainerExceptionInterface::class); -class_exists(NotFoundExceptionInterface::class); - -/** - * A trait to help implement ServiceProviderInterface. - * - * @author Robin Chalas - * @author Nicolas Grekas - */ -trait ServiceLocatorTrait -{ - private $factories; - private $loading = []; - private $providedTypes; - - /** - * @param callable[] $factories - */ - public function __construct(array $factories) - { - $this->factories = $factories; - } - - /** - * {@inheritdoc} - * - * @return bool - */ - public function has($id) - { - return isset($this->factories[$id]); - } - - /** - * {@inheritdoc} - */ - public function get($id) - { - if (!isset($this->factories[$id])) { - throw $this->createNotFoundException($id); - } - - if (isset($this->loading[$id])) { - $ids = array_values($this->loading); - $ids = \array_slice($this->loading, array_search($id, $ids)); - $ids[] = $id; - - throw $this->createCircularReferenceException($id, $ids); - } - - $this->loading[$id] = $id; - try { - return $this->factories[$id]($this); - } finally { - unset($this->loading[$id]); - } - } - - /** - * {@inheritdoc} - */ - public function getProvidedServices(): array - { - if (null === $this->providedTypes) { - $this->providedTypes = []; - - foreach ($this->factories as $name => $factory) { - if (!\is_callable($factory)) { - $this->providedTypes[$name] = '?'; - } else { - $type = (new \ReflectionFunction($factory))->getReturnType(); - - $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').($type instanceof \ReflectionNamedType ? $type->getName() : $type) : '?'; - } - } - } - - return $this->providedTypes; - } - - private function createNotFoundException(string $id): NotFoundExceptionInterface - { - if (!$alternatives = array_keys($this->factories)) { - $message = 'is empty...'; - } else { - $last = array_pop($alternatives); - if ($alternatives) { - $message = sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last); - } else { - $message = sprintf('only knows about the "%s" service.', $last); - } - } - - if ($this->loading) { - $message = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message); - } else { - $message = sprintf('Service "%s" not found: the current service locator %s', $id, $message); - } - - return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface { - }; - } - - private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface - { - return new class(sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface { - }; - } -} diff --git a/vendor/symfony/service-contracts/ServiceProviderInterface.php b/vendor/symfony/service-contracts/ServiceProviderInterface.php deleted file mode 100644 index c60ad0b..0000000 --- a/vendor/symfony/service-contracts/ServiceProviderInterface.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service; - -use Psr\Container\ContainerInterface; - -/** - * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container. - * - * @author Nicolas Grekas - * @author Mateusz Sip - */ -interface ServiceProviderInterface extends ContainerInterface -{ - /** - * Returns an associative array of service types keyed by the identifiers provided by the current container. - * - * Examples: - * - * * ['logger' => 'Psr\Log\LoggerInterface'] means the object provides a service named "logger" that implements Psr\Log\LoggerInterface - * * ['foo' => '?'] means the container provides service name "foo" of unspecified type - * * ['bar' => '?Bar\Baz'] means the container provides a service "bar" of type Bar\Baz|null - * - * @return string[] The provided service types, keyed by service names - */ - public function getProvidedServices(): array; -} diff --git a/vendor/symfony/service-contracts/ServiceSubscriberInterface.php b/vendor/symfony/service-contracts/ServiceSubscriberInterface.php deleted file mode 100644 index 8bb320f..0000000 --- a/vendor/symfony/service-contracts/ServiceSubscriberInterface.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service; - -/** - * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. - * - * The getSubscribedServices method returns an array of service types required by such instances, - * optionally keyed by the service names used internally. Service types that start with an interrogation - * mark "?" are optional, while the other ones are mandatory service dependencies. - * - * The injected service locators SHOULD NOT allow access to any other services not specified by the method. - * - * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally. - * This interface does not dictate any injection method for these service locators, although constructor - * injection is recommended. - * - * @author Nicolas Grekas - */ -interface ServiceSubscriberInterface -{ - /** - * Returns an array of service types required by such instances, optionally keyed by the service names used internally. - * - * For mandatory dependencies: - * - * * ['logger' => 'Psr\Log\LoggerInterface'] means the objects use the "logger" name - * internally to fetch a service which must implement Psr\Log\LoggerInterface. - * * ['loggers' => 'Psr\Log\LoggerInterface[]'] means the objects use the "loggers" name - * internally to fetch an iterable of Psr\Log\LoggerInterface instances. - * * ['Psr\Log\LoggerInterface'] is a shortcut for - * * ['Psr\Log\LoggerInterface' => 'Psr\Log\LoggerInterface'] - * - * otherwise: - * - * * ['logger' => '?Psr\Log\LoggerInterface'] denotes an optional dependency - * * ['loggers' => '?Psr\Log\LoggerInterface[]'] denotes an optional iterable dependency - * * ['?Psr\Log\LoggerInterface'] is a shortcut for - * * ['Psr\Log\LoggerInterface' => '?Psr\Log\LoggerInterface'] - * - * @return array The required service types, optionally keyed by service names - */ - public static function getSubscribedServices(); -} diff --git a/vendor/symfony/service-contracts/ServiceSubscriberTrait.php b/vendor/symfony/service-contracts/ServiceSubscriberTrait.php deleted file mode 100644 index 82fb5ab..0000000 --- a/vendor/symfony/service-contracts/ServiceSubscriberTrait.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service; - -use Psr\Container\ContainerInterface; - -/** - * Implementation of ServiceSubscriberInterface that determines subscribed services from - * private method return types. Service ids are available as "ClassName::methodName". - * - * @author Kevin Bond - */ -trait ServiceSubscriberTrait -{ - /** @var ContainerInterface */ - protected $container; - - public static function getSubscribedServices(): array - { - static $services; - - if (null !== $services) { - return $services; - } - - $services = \is_callable(['parent', __FUNCTION__]) ? parent::getSubscribedServices() : []; - - foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { - if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { - continue; - } - - if (self::class === $method->getDeclaringClass()->name && ($returnType = $method->getReturnType()) && !$returnType->isBuiltin()) { - $services[self::class.'::'.$method->name] = '?'.($returnType instanceof \ReflectionNamedType ? $returnType->getName() : $type); - } - } - - return $services; - } - - /** - * @required - */ - public function setContainer(ContainerInterface $container) - { - $this->container = $container; - - if (\is_callable(['parent', __FUNCTION__])) { - return parent::setContainer($container); - } - - return null; - } -} diff --git a/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php b/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php deleted file mode 100644 index 5ed9149..0000000 --- a/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service\Test; - -use PHPUnit\Framework\TestCase; -use Psr\Container\ContainerInterface; -use Symfony\Contracts\Service\ServiceLocatorTrait; - -abstract class ServiceLocatorTest extends TestCase -{ - protected function getServiceLocator(array $factories) - { - return new class($factories) implements ContainerInterface { - use ServiceLocatorTrait; - }; - } - - public function testHas() - { - $locator = $this->getServiceLocator([ - 'foo' => function () { return 'bar'; }, - 'bar' => function () { return 'baz'; }, - function () { return 'dummy'; }, - ]); - - $this->assertTrue($locator->has('foo')); - $this->assertTrue($locator->has('bar')); - $this->assertFalse($locator->has('dummy')); - } - - public function testGet() - { - $locator = $this->getServiceLocator([ - 'foo' => function () { return 'bar'; }, - 'bar' => function () { return 'baz'; }, - ]); - - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('baz', $locator->get('bar')); - } - - public function testGetDoesNotMemoize() - { - $i = 0; - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$i) { - ++$i; - - return 'bar'; - }, - ]); - - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame(2, $i); - } - - public function testThrowsOnUndefinedInternalService() - { - if (!$this->getExpectedException()) { - $this->expectException('Psr\Container\NotFoundExceptionInterface'); - $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); - } - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$locator) { return $locator->get('bar'); }, - ]); - - $locator->get('foo'); - } - - public function testThrowsOnCircularReference() - { - $this->expectException('Psr\Container\ContainerExceptionInterface'); - $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$locator) { return $locator->get('bar'); }, - 'bar' => function () use (&$locator) { return $locator->get('baz'); }, - 'baz' => function () use (&$locator) { return $locator->get('bar'); }, - ]); - - $locator->get('foo'); - } -} diff --git a/vendor/symfony/service-contracts/composer.json b/vendor/symfony/service-contracts/composer.json deleted file mode 100644 index bb1824d..0000000 --- a/vendor/symfony/service-contracts/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "symfony/service-contracts", - "type": "library", - "description": "Generic abstractions related to writing services", - "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "autoload": { - "psr-4": { "Symfony\\Contracts\\Service\\": "" } - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - } -} diff --git a/vendor/symfony/stopwatch/CHANGELOG.md b/vendor/symfony/stopwatch/CHANGELOG.md deleted file mode 100644 index 14b7dc6..0000000 --- a/vendor/symfony/stopwatch/CHANGELOG.md +++ /dev/null @@ -1,19 +0,0 @@ -CHANGELOG -========= - -5.0.0 ------ - - * Removed support for passing `null` as 1st (`$id`) argument of `Section::get()` method, pass a valid child section identifier instead. - -4.4.0 ------ - - * Deprecated passing `null` as 1st (`$id`) argument of `Section::get()` method, pass a valid child section identifier instead. - -3.4.0 ------ - - * added the `Stopwatch::reset()` method - * allowed to measure sub-millisecond times by introducing an argument to the - constructor of `Stopwatch` diff --git a/vendor/symfony/stopwatch/LICENSE b/vendor/symfony/stopwatch/LICENSE deleted file mode 100644 index 9e936ec..0000000 --- a/vendor/symfony/stopwatch/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2020 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/stopwatch/README.md b/vendor/symfony/stopwatch/README.md deleted file mode 100644 index eb0ebb3..0000000 --- a/vendor/symfony/stopwatch/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Stopwatch Component -=================== - -The Stopwatch component provides a way to profile code. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/stopwatch.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/stopwatch/Section.php b/vendor/symfony/stopwatch/Section.php deleted file mode 100644 index 56ff761..0000000 --- a/vendor/symfony/stopwatch/Section.php +++ /dev/null @@ -1,185 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Stopwatch; - -/** - * Stopwatch section. - * - * @author Fabien Potencier - */ -class Section -{ - /** - * @var StopwatchEvent[] - */ - private $events = []; - - /** - * @var float|null - */ - private $origin; - - /** - * @var bool - */ - private $morePrecision; - - /** - * @var string - */ - private $id; - - /** - * @var Section[] - */ - private $children = []; - - /** - * @param float|null $origin Set the origin of the events in this section, use null to set their origin to their start time - * @param bool $morePrecision If true, time is stored as float to keep the original microsecond precision - */ - public function __construct(float $origin = null, bool $morePrecision = false) - { - $this->origin = $origin; - $this->morePrecision = $morePrecision; - } - - /** - * Returns the child section. - * - * @return self|null The child section or null when none found - */ - public function get(string $id) - { - foreach ($this->children as $child) { - if ($id === $child->getId()) { - return $child; - } - } - - return null; - } - - /** - * Creates or re-opens a child section. - * - * @param string|null $id Null to create a new section, the identifier to re-open an existing one - * - * @return self - */ - public function open(?string $id) - { - if (null === $id || null === $session = $this->get($id)) { - $session = $this->children[] = new self(microtime(true) * 1000, $this->morePrecision); - } - - return $session; - } - - /** - * @return string The identifier of the section - */ - public function getId() - { - return $this->id; - } - - /** - * Sets the session identifier. - * - * @return $this - */ - public function setId(string $id) - { - $this->id = $id; - - return $this; - } - - /** - * Starts an event. - * - * @return StopwatchEvent The event - */ - public function startEvent(string $name, ?string $category) - { - if (!isset($this->events[$name])) { - $this->events[$name] = new StopwatchEvent($this->origin ?: microtime(true) * 1000, $category, $this->morePrecision); - } - - return $this->events[$name]->start(); - } - - /** - * Checks if the event was started. - * - * @return bool - */ - public function isEventStarted(string $name) - { - return isset($this->events[$name]) && $this->events[$name]->isStarted(); - } - - /** - * Stops an event. - * - * @return StopwatchEvent The event - * - * @throws \LogicException When the event has not been started - */ - public function stopEvent(string $name) - { - if (!isset($this->events[$name])) { - throw new \LogicException(sprintf('Event "%s" is not started.', $name)); - } - - return $this->events[$name]->stop(); - } - - /** - * Stops then restarts an event. - * - * @return StopwatchEvent The event - * - * @throws \LogicException When the event has not been started - */ - public function lap(string $name) - { - return $this->stopEvent($name)->start(); - } - - /** - * Returns a specific event by name. - * - * @return StopwatchEvent The event - * - * @throws \LogicException When the event is not known - */ - public function getEvent(string $name) - { - if (!isset($this->events[$name])) { - throw new \LogicException(sprintf('Event "%s" is not known.', $name)); - } - - return $this->events[$name]; - } - - /** - * Returns the events from this section. - * - * @return StopwatchEvent[] An array of StopwatchEvent instances - */ - public function getEvents() - { - return $this->events; - } -} diff --git a/vendor/symfony/stopwatch/Stopwatch.php b/vendor/symfony/stopwatch/Stopwatch.php deleted file mode 100644 index 8fea588..0000000 --- a/vendor/symfony/stopwatch/Stopwatch.php +++ /dev/null @@ -1,166 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Stopwatch; - -use Symfony\Contracts\Service\ResetInterface; - -// Help opcache.preload discover always-needed symbols -class_exists(Section::class); - -/** - * Stopwatch provides a way to profile code. - * - * @author Fabien Potencier - */ -class Stopwatch implements ResetInterface -{ - /** - * @var bool - */ - private $morePrecision; - - /** - * @var Section[] - */ - private $sections; - - /** - * @var Section[] - */ - private $activeSections; - - /** - * @param bool $morePrecision If true, time is stored as float to keep the original microsecond precision - */ - public function __construct(bool $morePrecision = false) - { - $this->morePrecision = $morePrecision; - $this->reset(); - } - - /** - * @return Section[] - */ - public function getSections() - { - return $this->sections; - } - - /** - * Creates a new section or re-opens an existing section. - * - * @param string|null $id The id of the session to re-open, null to create a new one - * - * @throws \LogicException When the section to re-open is not reachable - */ - public function openSection(string $id = null) - { - $current = end($this->activeSections); - - if (null !== $id && null === $current->get($id)) { - throw new \LogicException(sprintf('The section "%s" has been started at an other level and can not be opened.', $id)); - } - - $this->start('__section__.child', 'section'); - $this->activeSections[] = $current->open($id); - $this->start('__section__'); - } - - /** - * Stops the last started section. - * - * The id parameter is used to retrieve the events from this section. - * - * @see getSectionEvents() - * - * @throws \LogicException When there's no started section to be stopped - */ - public function stopSection(string $id) - { - $this->stop('__section__'); - - if (1 == \count($this->activeSections)) { - throw new \LogicException('There is no started section to stop.'); - } - - $this->sections[$id] = array_pop($this->activeSections)->setId($id); - $this->stop('__section__.child'); - } - - /** - * Starts an event. - * - * @return StopwatchEvent - */ - public function start(string $name, string $category = null) - { - return end($this->activeSections)->startEvent($name, $category); - } - - /** - * Checks if the event was started. - * - * @return bool - */ - public function isStarted(string $name) - { - return end($this->activeSections)->isEventStarted($name); - } - - /** - * Stops an event. - * - * @return StopwatchEvent - */ - public function stop(string $name) - { - return end($this->activeSections)->stopEvent($name); - } - - /** - * Stops then restarts an event. - * - * @return StopwatchEvent - */ - public function lap(string $name) - { - return end($this->activeSections)->stopEvent($name)->start(); - } - - /** - * Returns a specific event by name. - * - * @return StopwatchEvent - */ - public function getEvent(string $name) - { - return end($this->activeSections)->getEvent($name); - } - - /** - * Gets all events for a given section. - * - * @return StopwatchEvent[] - */ - public function getSectionEvents(string $id) - { - return isset($this->sections[$id]) ? $this->sections[$id]->getEvents() : []; - } - - /** - * Resets the stopwatch to its original state. - */ - public function reset() - { - $this->sections = $this->activeSections = ['__root__' => new Section(null, $this->morePrecision)]; - } -} diff --git a/vendor/symfony/stopwatch/StopwatchEvent.php b/vendor/symfony/stopwatch/StopwatchEvent.php deleted file mode 100644 index 2415727..0000000 --- a/vendor/symfony/stopwatch/StopwatchEvent.php +++ /dev/null @@ -1,246 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Stopwatch; - -/** - * Represents an Event managed by Stopwatch. - * - * @author Fabien Potencier - */ -class StopwatchEvent -{ - /** - * @var StopwatchPeriod[] - */ - private $periods = []; - - /** - * @var float - */ - private $origin; - - /** - * @var string - */ - private $category; - - /** - * @var bool - */ - private $morePrecision; - - /** - * @var float[] - */ - private $started = []; - - /** - * @param float $origin The origin time in milliseconds - * @param string|null $category The event category or null to use the default - * @param bool $morePrecision If true, time is stored as float to keep the original microsecond precision - * - * @throws \InvalidArgumentException When the raw time is not valid - */ - public function __construct(float $origin, string $category = null, bool $morePrecision = false) - { - $this->origin = $this->formatTime($origin); - $this->category = \is_string($category) ? $category : 'default'; - $this->morePrecision = $morePrecision; - } - - /** - * Gets the category. - * - * @return string The category - */ - public function getCategory() - { - return $this->category; - } - - /** - * Gets the origin. - * - * @return float The origin in milliseconds - */ - public function getOrigin() - { - return $this->origin; - } - - /** - * Starts a new event period. - * - * @return $this - */ - public function start() - { - $this->started[] = $this->getNow(); - - return $this; - } - - /** - * Stops the last started event period. - * - * @return $this - * - * @throws \LogicException When stop() is called without a matching call to start() - */ - public function stop() - { - if (!\count($this->started)) { - throw new \LogicException('stop() called but start() has not been called before.'); - } - - $this->periods[] = new StopwatchPeriod(array_pop($this->started), $this->getNow(), $this->morePrecision); - - return $this; - } - - /** - * Checks if the event was started. - * - * @return bool - */ - public function isStarted() - { - return !empty($this->started); - } - - /** - * Stops the current period and then starts a new one. - * - * @return $this - */ - public function lap() - { - return $this->stop()->start(); - } - - /** - * Stops all non already stopped periods. - */ - public function ensureStopped() - { - while (\count($this->started)) { - $this->stop(); - } - } - - /** - * Gets all event periods. - * - * @return StopwatchPeriod[] An array of StopwatchPeriod instances - */ - public function getPeriods() - { - return $this->periods; - } - - /** - * Gets the relative time of the start of the first period. - * - * @return int|float The time (in milliseconds) - */ - public function getStartTime() - { - if (isset($this->periods[0])) { - return $this->periods[0]->getStartTime(); - } - - if ($this->started) { - return $this->started[0]; - } - - return 0; - } - - /** - * Gets the relative time of the end of the last period. - * - * @return int|float The time (in milliseconds) - */ - public function getEndTime() - { - $count = \count($this->periods); - - return $count ? $this->periods[$count - 1]->getEndTime() : 0; - } - - /** - * Gets the duration of the events (including all periods). - * - * @return int|float The duration (in milliseconds) - */ - public function getDuration() - { - $periods = $this->periods; - $left = \count($this->started); - - for ($i = $left - 1; $i >= 0; --$i) { - $periods[] = new StopwatchPeriod($this->started[$i], $this->getNow(), $this->morePrecision); - } - - $total = 0; - foreach ($periods as $period) { - $total += $period->getDuration(); - } - - return $total; - } - - /** - * Gets the max memory usage of all periods. - * - * @return int The memory usage (in bytes) - */ - public function getMemory() - { - $memory = 0; - foreach ($this->periods as $period) { - if ($period->getMemory() > $memory) { - $memory = $period->getMemory(); - } - } - - return $memory; - } - - /** - * Return the current time relative to origin. - * - * @return float Time in ms - */ - protected function getNow() - { - return $this->formatTime(microtime(true) * 1000 - $this->origin); - } - - /** - * Formats a time. - * - * @throws \InvalidArgumentException When the raw time is not valid - */ - private function formatTime(float $time): float - { - return round($time, 1); - } - - /** - * @return string - */ - public function __toString() - { - return sprintf('%s: %.2F MiB - %d ms', $this->getCategory(), $this->getMemory() / 1024 / 1024, $this->getDuration()); - } -} diff --git a/vendor/symfony/stopwatch/StopwatchPeriod.php b/vendor/symfony/stopwatch/StopwatchPeriod.php deleted file mode 100644 index 213cf59..0000000 --- a/vendor/symfony/stopwatch/StopwatchPeriod.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Stopwatch; - -/** - * Represents an Period for an Event. - * - * @author Fabien Potencier - */ -class StopwatchPeriod -{ - private $start; - private $end; - private $memory; - - /** - * @param int|float $start The relative time of the start of the period (in milliseconds) - * @param int|float $end The relative time of the end of the period (in milliseconds) - * @param bool $morePrecision If true, time is stored as float to keep the original microsecond precision - */ - public function __construct($start, $end, bool $morePrecision = false) - { - $this->start = $morePrecision ? (float) $start : (int) $start; - $this->end = $morePrecision ? (float) $end : (int) $end; - $this->memory = memory_get_usage(true); - } - - /** - * Gets the relative time of the start of the period. - * - * @return int|float The time (in milliseconds) - */ - public function getStartTime() - { - return $this->start; - } - - /** - * Gets the relative time of the end of the period. - * - * @return int|float The time (in milliseconds) - */ - public function getEndTime() - { - return $this->end; - } - - /** - * Gets the time spent in this period. - * - * @return int|float The period duration (in milliseconds) - */ - public function getDuration() - { - return $this->end - $this->start; - } - - /** - * Gets the memory usage. - * - * @return int The memory usage (in bytes) - */ - public function getMemory() - { - return $this->memory; - } -} diff --git a/vendor/symfony/stopwatch/composer.json b/vendor/symfony/stopwatch/composer.json deleted file mode 100644 index bd4989d..0000000 --- a/vendor/symfony/stopwatch/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "symfony/stopwatch", - "type": "library", - "description": "Symfony Stopwatch Component", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Stopwatch\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - } -} diff --git a/vendor/theseer/tokenizer/.php_cs.dist b/vendor/theseer/tokenizer/.php_cs.dist deleted file mode 100644 index 8ac26d0..0000000 --- a/vendor/theseer/tokenizer/.php_cs.dist +++ /dev/null @@ -1,213 +0,0 @@ -registerCustomFixers([ - new \PharIo\CSFixer\PhpdocSingleLineVarFixer() - ]) - ->setRiskyAllowed(true) - ->setRules( - [ - 'PharIo/phpdoc_single_line_var_fixer' => true, - - 'align_multiline_comment' => true, - 'array_indentation' => true, - 'array_syntax' => ['syntax' => 'short'], - 'binary_operator_spaces' => [ - 'operators' => [ - '=' => 'align_single_space_minimal', - '=>' => 'align', - ], - ], - 'blank_line_after_namespace' => true, - 'blank_line_after_opening_tag' => false, - 'blank_line_before_statement' => [ - 'statements' => [ - 'break', - 'continue', - 'declare', - 'do', - 'for', - 'foreach', - 'if', - 'include', - 'include_once', - 'require', - 'require_once', - 'return', - 'switch', - 'throw', - 'try', - 'while', - 'yield', - ], - ], - 'braces' => [ - 'allow_single_line_closure' => false, - 'position_after_anonymous_constructs' => 'same', - 'position_after_control_structures' => 'same', - 'position_after_functions_and_oop_constructs' => 'same' - ], - 'cast_spaces' => ['space' => 'none'], - - // This fixer removes the blank line at class start, no way to disable that, so we disable the fixer :( - //'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], - - 'combine_consecutive_issets' => true, - 'combine_consecutive_unsets' => true, - 'compact_nullable_typehint' => true, - 'concat_space' => ['spacing' => 'one'], - 'date_time_immutable' => true, - 'declare_equal_normalize' => ['space' => 'single'], - 'declare_strict_types' => true, - 'dir_constant' => true, - 'elseif' => true, - 'encoding' => true, - 'full_opening_tag' => true, - 'fully_qualified_strict_types' => true, - 'function_declaration' => [ - 'closure_function_spacing' => 'one' - ], - 'header_comment' => false, - 'indentation_type' => true, - 'is_null' => true, - 'line_ending' => true, - 'list_syntax' => ['syntax' => 'short'], - 'logical_operators' => true, - 'lowercase_cast' => true, - 'lowercase_constants' => true, - 'lowercase_keywords' => true, - 'lowercase_static_reference' => true, - 'magic_constant_casing' => true, - 'method_argument_space' => ['ensure_fully_multiline' => true], - 'modernize_types_casting' => true, - 'multiline_comment_opening_closing' => true, - 'multiline_whitespace_before_semicolons' => true, - 'native_constant_invocation' => true, - 'native_function_casing' => true, - 'native_function_invocation' => true, - 'new_with_braces' => false, - 'no_alias_functions' => true, - 'no_alternative_syntax' => true, - 'no_blank_lines_after_class_opening' => false, - 'no_blank_lines_after_phpdoc' => true, - 'no_blank_lines_before_namespace' => true, - 'no_closing_tag' => true, - 'no_empty_comment' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_blank_lines' => true, - 'no_homoglyph_names' => true, - 'no_leading_import_slash' => true, - 'no_leading_namespace_whitespace' => true, - 'no_mixed_echo_print' => ['use' => 'print'], - 'no_multiline_whitespace_around_double_arrow' => true, - 'no_null_property_initialization' => true, - 'no_php4_constructor' => true, - 'no_short_bool_cast' => true, - 'no_short_echo_tag' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_spaces_after_function_name' => true, - 'no_spaces_inside_parenthesis' => true, - 'no_superfluous_elseif' => true, - 'no_superfluous_phpdoc_tags' => true, - 'no_trailing_comma_in_list_call' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_trailing_whitespace' => true, - 'no_trailing_whitespace_in_comment' => true, - 'no_unneeded_control_parentheses' => false, - 'no_unneeded_curly_braces' => false, - 'no_unneeded_final_method' => true, - 'no_unreachable_default_argument_value' => true, - 'no_unset_on_property' => true, - 'no_unused_imports' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'no_whitespace_before_comma_in_array' => true, - 'no_whitespace_in_blank_line' => true, - 'non_printable_character' => true, - 'normalize_index_brace' => true, - 'object_operator_without_whitespace' => true, - 'ordered_class_elements' => [ - 'order' => [ - 'use_trait', - 'constant_public', - 'constant_protected', - 'constant_private', - 'property_public_static', - 'property_protected_static', - 'property_private_static', - 'property_public', - 'property_protected', - 'property_private', - 'method_public_static', - 'construct', - 'destruct', - 'magic', - 'phpunit', - 'method_public', - 'method_protected', - 'method_private', - 'method_protected_static', - 'method_private_static', - ], - ], - 'ordered_imports' => true, - 'phpdoc_add_missing_param_annotation' => true, - 'phpdoc_align' => true, - 'phpdoc_annotation_without_dot' => true, - 'phpdoc_indent' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_no_package' => true, - 'phpdoc_order' => true, - 'phpdoc_return_self_reference' => true, - 'phpdoc_scalar' => true, - 'phpdoc_separation' => true, - 'phpdoc_single_line_var_spacing' => true, - 'phpdoc_to_comment' => false, - 'phpdoc_trim' => true, - 'phpdoc_trim_consecutive_blank_line_separation' => true, - 'phpdoc_types' => ['groups' => ['simple', 'meta']], - 'phpdoc_types_order' => true, - 'phpdoc_to_return_type' => true, - 'phpdoc_var_without_name' => true, - 'pow_to_exponentiation' => true, - 'protected_to_private' => true, - 'return_assignment' => true, - 'return_type_declaration' => ['space_before' => 'none'], - 'self_accessor' => false, - 'semicolon_after_instruction' => true, - 'set_type_to_cast' => true, - 'short_scalar_cast' => true, - 'simplified_null_return' => true, - 'single_blank_line_at_eof' => true, - 'single_import_per_statement' => true, - 'single_line_after_imports' => true, - 'single_quote' => true, - 'standardize_not_equals' => true, - 'ternary_to_null_coalescing' => true, - 'trailing_comma_in_multiline_array' => false, - 'trim_array_spaces' => true, - 'unary_operator_spaces' => true, - 'visibility_required' => [ - 'elements' => [ - 'const', - 'method', - 'property', - ], - ], - 'void_return' => true, - 'whitespace_after_comma_in_array' => true, - 'yoda_style' => false - ] - ) - ->setFinder( - PhpCsFixer\Finder::create() - ->files() - ->in(__DIR__ . '/src') - ->in(__DIR__ . '/tests') - ->notName('*.phpt') - ->notName('autoload.php') - ); diff --git a/vendor/theseer/tokenizer/CHANGELOG.md b/vendor/theseer/tokenizer/CHANGELOG.md deleted file mode 100644 index 314934f..0000000 --- a/vendor/theseer/tokenizer/CHANGELOG.md +++ /dev/null @@ -1,63 +0,0 @@ -# Changelog - -All notable changes to Tokenizer are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [1.2.0] - 2020-07-13 - -This release is now PHP 8.0 compliant. - -### Fixed - -* Whitespace handling in general (only noticable in the intermediate `TokenCollection`) is now consitent - -### Changed - -* Updated `Tokenizer` to deal with changed whitespace handling in PHP 8.0 - The XMLSerializer was unaffected. - - -## [1.1.3] - 2019-06-14 - -### Changed - -* Ensure XMLSerializer can deal with empty token collections - -### Fixed - -* [#2](https://github.com/theseer/tokenizer/issues/2): Fatal error in infection / phpunit - - -## [1.1.2] - 2019-04-04 - -### Changed - -* Reverted PHPUnit 8 test update to stay PHP 7.0 compliant - - -## [1.1.1] - 2019-04-03 - -### Fixed - -* [#1](https://github.com/theseer/tokenizer/issues/1): Empty file causes invalid array read - -### Changed - -* Tests should now be PHPUnit 8 compliant - - -## [1.1.0] - 2017-04-07 - -### Added - -* Allow use of custom namespace for XML serialization - - -## [1.0.0] - 2017-04-05 - -Initial Release - -[1.1.3]: https://github.com/theseer/tokenizer/compare/1.1.2...1.1.3 -[1.1.2]: https://github.com/theseer/tokenizer/compare/1.1.1...1.1.2 -[1.1.1]: https://github.com/theseer/tokenizer/compare/1.1.0...1.1.1 -[1.1.0]: https://github.com/theseer/tokenizer/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/theseer/tokenizer/compare/b2493e57de80c1b7414219b28503fa5c6b4d0a98...1.0.0 diff --git a/vendor/theseer/tokenizer/LICENSE b/vendor/theseer/tokenizer/LICENSE deleted file mode 100644 index e9694ad..0000000 --- a/vendor/theseer/tokenizer/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -Tokenizer - -Copyright (c) 2017 Arne Blankerts and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Arne Blankerts nor the names of contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/theseer/tokenizer/README.md b/vendor/theseer/tokenizer/README.md deleted file mode 100644 index 61ecaff..0000000 --- a/vendor/theseer/tokenizer/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Tokenizer - -A small library for converting tokenized PHP source code into XML. - -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/?branch=master) -[![Code Coverage](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/?branch=master) -[![Build Status](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/build.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/build-status/master) - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require theseer/tokenizer - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev theseer/tokenizer - -## Usage examples - -```php -$tokenizer = new TheSeer\Tokenizer\Tokenizer(); -$tokens = $tokenizer->parse(file_get_contents(__DIR__ . '/src/XMLSerializer.php')); - -$serializer = new TheSeer\Tokenizer\XMLSerializer(); -$xml = $serializer->toXML($tokens); - -echo $xml; -``` - -The generated XML structure looks something like this: - -```xml - - - - <?php - declare - ( - strict_types - - = - - 1 - ) - ; - - -``` diff --git a/vendor/theseer/tokenizer/composer.json b/vendor/theseer/tokenizer/composer.json deleted file mode 100644 index 3f452a9..0000000 --- a/vendor/theseer/tokenizer/composer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "theseer/tokenizer", - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "support": { - "issues": "https://github.com/theseer/tokenizer/issues" - }, - "require": { - "php": "^7.2 || ^8.0", - "ext-xmlwriter": "*", - "ext-dom": "*", - "ext-tokenizer": "*" - }, - "autoload": { - "classmap": [ - "src/" - ] - } -} - diff --git a/vendor/theseer/tokenizer/src/Exception.php b/vendor/theseer/tokenizer/src/Exception.php deleted file mode 100644 index 71fc117..0000000 --- a/vendor/theseer/tokenizer/src/Exception.php +++ /dev/null @@ -1,5 +0,0 @@ -ensureValidUri($value); - $this->value = $value; - } - - public function asString(): string { - return $this->value; - } - - private function ensureValidUri($value): void { - if (\strpos($value, ':') === false) { - throw new NamespaceUriException( - \sprintf("Namespace URI '%s' must contain at least one colon", $value) - ); - } - } -} diff --git a/vendor/theseer/tokenizer/src/NamespaceUriException.php b/vendor/theseer/tokenizer/src/NamespaceUriException.php deleted file mode 100644 index ab1c48d..0000000 --- a/vendor/theseer/tokenizer/src/NamespaceUriException.php +++ /dev/null @@ -1,5 +0,0 @@ -line = $line; - $this->name = $name; - $this->value = $value; - } - - public function getLine(): int { - return $this->line; - } - - public function getName(): string { - return $this->name; - } - - public function getValue(): string { - return $this->value; - } -} diff --git a/vendor/theseer/tokenizer/src/TokenCollection.php b/vendor/theseer/tokenizer/src/TokenCollection.php deleted file mode 100644 index e5e6e40..0000000 --- a/vendor/theseer/tokenizer/src/TokenCollection.php +++ /dev/null @@ -1,93 +0,0 @@ -tokens[] = $token; - } - - public function current(): Token { - return \current($this->tokens); - } - - public function key(): int { - return \key($this->tokens); - } - - public function next(): void { - \next($this->tokens); - $this->pos++; - } - - public function valid(): bool { - return $this->count() > $this->pos; - } - - public function rewind(): void { - \reset($this->tokens); - $this->pos = 0; - } - - public function count(): int { - return \count($this->tokens); - } - - public function offsetExists($offset): bool { - return isset($this->tokens[$offset]); - } - - /** - * @throws TokenCollectionException - */ - public function offsetGet($offset): Token { - if (!$this->offsetExists($offset)) { - throw new TokenCollectionException( - \sprintf('No Token at offest %s', $offset) - ); - } - - return $this->tokens[$offset]; - } - - /** - * @param Token $value - * - * @throws TokenCollectionException - */ - public function offsetSet($offset, $value): void { - if (!\is_int($offset)) { - $type = \gettype($offset); - - throw new TokenCollectionException( - \sprintf( - 'Offset must be of type integer, %s given', - $type === 'object' ? \get_class($value) : $type - ) - ); - } - - if (!$value instanceof Token) { - $type = \gettype($value); - - throw new TokenCollectionException( - \sprintf( - 'Value must be of type %s, %s given', - Token::class, - $type === 'object' ? \get_class($value) : $type - ) - ); - } - $this->tokens[$offset] = $value; - } - - public function offsetUnset($offset): void { - unset($this->tokens[$offset]); - } -} diff --git a/vendor/theseer/tokenizer/src/TokenCollectionException.php b/vendor/theseer/tokenizer/src/TokenCollectionException.php deleted file mode 100644 index 4291ce0..0000000 --- a/vendor/theseer/tokenizer/src/TokenCollectionException.php +++ /dev/null @@ -1,5 +0,0 @@ - 'T_OPEN_BRACKET', - ')' => 'T_CLOSE_BRACKET', - '[' => 'T_OPEN_SQUARE', - ']' => 'T_CLOSE_SQUARE', - '{' => 'T_OPEN_CURLY', - '}' => 'T_CLOSE_CURLY', - ';' => 'T_SEMICOLON', - '.' => 'T_DOT', - ',' => 'T_COMMA', - '=' => 'T_EQUAL', - '<' => 'T_LT', - '>' => 'T_GT', - '+' => 'T_PLUS', - '-' => 'T_MINUS', - '*' => 'T_MULT', - '/' => 'T_DIV', - '?' => 'T_QUESTION_MARK', - '!' => 'T_EXCLAMATION_MARK', - ':' => 'T_COLON', - '"' => 'T_DOUBLE_QUOTES', - '@' => 'T_AT', - '&' => 'T_AMPERSAND', - '%' => 'T_PERCENT', - '|' => 'T_PIPE', - '$' => 'T_DOLLAR', - '^' => 'T_CARET', - '~' => 'T_TILDE', - '`' => 'T_BACKTICK' - ]; - - public function parse(string $source): TokenCollection { - $result = new TokenCollection(); - - if ($source === '') { - return $result; - } - - $tokens = \token_get_all($source); - - $lastToken = new Token( - $tokens[0][2], - 'Placeholder', - '' - ); - - foreach ($tokens as $pos => $tok) { - if (\is_string($tok)) { - $token = new Token( - $lastToken->getLine(), - $this->map[$tok], - $tok - ); - $result->addToken($token); - $lastToken = $token; - - continue; - } - - $line = $tok[2]; - $values = \preg_split('/\R+/Uu', $tok[1]); - - foreach ($values as $v) { - $token = new Token( - $line, - \token_name($tok[0]), - $v - ); - $lastToken = $token; - $line++; - - if ($v === '') { - continue; - } - $result->addToken($token); - } - } - - return $this->fillBlanks($result, $lastToken->getLine()); - } - - private function fillBlanks(TokenCollection $tokens, int $maxLine): TokenCollection { - /** @var Token $prev */ - $prev = null; - $final = new TokenCollection(); - - foreach ($tokens as $token) { - if ($prev === null) { - $final->addToken($token); - $prev = $token; - - continue; - } - - $gap = $token->getLine() - $prev->getLine(); - - while ($gap > 1) { - $linebreak = new Token( - $prev->getLine() + 1, - 'T_WHITESPACE', - '' - ); - $final->addToken($linebreak); - $prev = $linebreak; - $gap--; - } - - $final->addToken($token); - $prev = $token; - } - - $gap = $maxLine - $prev->getLine(); - - while ($gap > 0) { - $linebreak = new Token( - $prev->getLine() + 1, - 'T_WHITESPACE', - '' - ); - $final->addToken($linebreak); - $prev = $linebreak; - $gap--; - } - - return $final; - } -} diff --git a/vendor/theseer/tokenizer/src/XMLSerializer.php b/vendor/theseer/tokenizer/src/XMLSerializer.php deleted file mode 100644 index e67a7fe..0000000 --- a/vendor/theseer/tokenizer/src/XMLSerializer.php +++ /dev/null @@ -1,79 +0,0 @@ -xmlns = $xmlns; - } - - public function toDom(TokenCollection $tokens): DOMDocument { - $dom = new DOMDocument(); - $dom->preserveWhiteSpace = false; - $dom->loadXML($this->toXML($tokens)); - - return $dom; - } - - public function toXML(TokenCollection $tokens): string { - $this->writer = new \XMLWriter(); - $this->writer->openMemory(); - $this->writer->setIndent(true); - $this->writer->startDocument(); - $this->writer->startElement('source'); - $this->writer->writeAttribute('xmlns', $this->xmlns->asString()); - - if (\count($tokens) > 0) { - $this->writer->startElement('line'); - $this->writer->writeAttribute('no', '1'); - - $this->previousToken = $tokens[0]; - - foreach ($tokens as $token) { - $this->addToken($token); - } - } - - $this->writer->endElement(); - $this->writer->endElement(); - $this->writer->endDocument(); - - return $this->writer->outputMemory(); - } - - private function addToken(Token $token): void { - if ($this->previousToken->getLine() < $token->getLine()) { - $this->writer->endElement(); - - $this->writer->startElement('line'); - $this->writer->writeAttribute('no', (string)$token->getLine()); - $this->previousToken = $token; - } - - if ($token->getValue() !== '') { - $this->writer->startElement('token'); - $this->writer->writeAttribute('name', $token->getName()); - $this->writer->writeRaw(\htmlspecialchars($token->getValue(), \ENT_NOQUOTES | \ENT_DISALLOWED | \ENT_XML1)); - $this->writer->endElement(); - } - } -} diff --git a/vendor/webmozart/assert/.editorconfig b/vendor/webmozart/assert/.editorconfig deleted file mode 100644 index 384453b..0000000 --- a/vendor/webmozart/assert/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -root = true - -[*] -charset=utf-8 -end_of_line=lf -trim_trailing_whitespace=true -insert_final_newline=true -indent_style=space -indent_size=4 - -[*.yml] -indent_size=2 diff --git a/vendor/webmozart/assert/CHANGELOG.md b/vendor/webmozart/assert/CHANGELOG.md deleted file mode 100644 index 1d37927..0000000 --- a/vendor/webmozart/assert/CHANGELOG.md +++ /dev/null @@ -1,175 +0,0 @@ -Changelog -========= - -## UNRELEASED - -## 1.9.1 - -## Fixed - -* provisional support for PHP 8.0 - -## 1.9.0 - -* added better Psalm support for `all*` & `nullOr*` methods - * These methods are now understood by Psalm through a mixin. You may need a newer version of Psalm in order to use this -* added `@psalm-pure` annotation to `Assert::notFalse()` -* added more `@psalm-assert` annotations where appropriate - -## Changed - -* the `all*` & `nullOr*` methods are now declared on an interface, instead of `@method` annotations. -This interface is linked to the `Assert` class with a `@mixin` annotation. Most IDE's have supported this -for a long time, and you should not lose any autocompletion capabilities. PHPStan has supported this since -version `0.12.20`. This package is marked incompatible (with a composer conflict) with phpstan version prior to that. -If you do not use PHPStan than this does not matter. - -## 1.8.0 - -### Added - -* added `Assert::notStartsWith()` -* added `Assert::notEndsWith()` -* added `Assert::inArray()` -* added `@psalm-pure` annotations to pure assertions - -### Fixed - -* Exception messages of comparisons between `DateTime(Immutable)` objects now display their date & time. -* Custom Exception messages for `Assert::count()` now use the values to render the exception message. - -## 1.7.0 (2020-02-14) - -### Added - -* added `Assert::notFalse()` -* added `Assert::isAOf()` -* added `Assert::isAnyOf()` -* added `Assert::isNotA()` - -## 1.6.0 (2019-11-24) - -### Added - -* added `Assert::validArrayKey()` -* added `Assert::isNonEmptyList()` -* added `Assert::isNonEmptyMap()` -* added `@throws InvalidArgumentException` annotations to all methods that throw. -* added `@psalm-assert` for the list type to the `isList` assertion. - -### Fixed - -* `ResourceBundle` & `SimpleXMLElement` now pass the `isCountable` assertions. -They are countable, without implementing the `Countable` interface. -* The doc block of `range` now has the proper variables. -* An empty array will now pass `isList` and `isMap`. As it is a valid form of both. -If a non-empty variant is needed, use `isNonEmptyList` or `isNonEmptyMap`. - -### Changed - -* Removed some `@psalm-assert` annotations, that were 'side effect' assertions See: - * [#144](https://github.com/webmozart/assert/pull/144) - * [#145](https://github.com/webmozart/assert/issues/145) - * [#146](https://github.com/webmozart/assert/pull/146) - * [#150](https://github.com/webmozart/assert/pull/150) -* If you use Psalm, the minimum version needed is `3.6.0`. Which is enforced through a composer conflict. -If you don't use Psalm, then this has no impact. - -## 1.5.0 (2019-08-24) - -### Added - -* added `Assert::uniqueValues()` -* added `Assert::unicodeLetters()` -* added: `Assert::email()` -* added support for [Psalm](https://github.com/vimeo/psalm), by adding `@psalm-assert` annotations where appropriate. - -### Fixed - -* `Assert::endsWith()` would not give the correct result when dealing with a multibyte suffix. -* `Assert::length(), minLength, maxLength, lengthBetween` would not give the correct result when dealing with multibyte characters. - -**NOTE**: These 2 changes may break your assertions if you relied on the fact that multibyte characters didn't behave correctly. - -### Changed - -* The names of some variables have been updated to better reflect what they are. -* All function calls are now in their FQN form, slightly increasing performance. -* Tests are now properly ran against HHVM-3.30 and PHP nightly. - -### Deprecation - -* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` - * This was already done in 1.3.0, but it was only done through a silenced `trigger_error`. It is now annotated as well. - -## 1.4.0 (2018-12-25) - -### Added - -* added `Assert::ip()` -* added `Assert::ipv4()` -* added `Assert::ipv6()` -* added `Assert::notRegex()` -* added `Assert::interfaceExists()` -* added `Assert::isList()` -* added `Assert::isMap()` -* added polyfill for ctype - -### Fixed - -* Special case when comparing objects implementing `__toString()` - -## 1.3.0 (2018-01-29) - -### Added - -* added `Assert::minCount()` -* added `Assert::maxCount()` -* added `Assert::countBetween()` -* added `Assert::isCountable()` -* added `Assert::notWhitespaceOnly()` -* added `Assert::natural()` -* added `Assert::notContains()` -* added `Assert::isArrayAccessible()` -* added `Assert::isInstanceOfAny()` -* added `Assert::isIterable()` - -### Fixed - -* `stringNotEmpty` will no longer report "0" is an empty string - -### Deprecation - -* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` - -## 1.2.0 (2016-11-23) - - * added `Assert::throws()` - * added `Assert::count()` - * added extension point `Assert::reportInvalidArgument()` for custom subclasses - -## 1.1.0 (2016-08-09) - - * added `Assert::object()` - * added `Assert::propertyExists()` - * added `Assert::propertyNotExists()` - * added `Assert::methodExists()` - * added `Assert::methodNotExists()` - * added `Assert::uuid()` - -## 1.0.2 (2015-08-24) - - * integrated Style CI - * add tests for minimum package dependencies on Travis CI - -## 1.0.1 (2015-05-12) - - * added support for PHP 5.3.3 - -## 1.0.0 (2015-05-12) - - * first stable release - -## 1.0.0-beta (2015-03-19) - - * first beta release diff --git a/vendor/webmozart/assert/LICENSE b/vendor/webmozart/assert/LICENSE deleted file mode 100644 index 9e2e307..0000000 --- a/vendor/webmozart/assert/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Bernhard Schussek - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/webmozart/assert/README.md b/vendor/webmozart/assert/README.md deleted file mode 100644 index 1407a9a..0000000 --- a/vendor/webmozart/assert/README.md +++ /dev/null @@ -1,283 +0,0 @@ -Webmozart Assert -================ - -[![Build Status](https://travis-ci.org/webmozart/assert.svg?branch=master)](https://travis-ci.org/webmozart/assert) -[![Build status](https://ci.appveyor.com/api/projects/status/lyg83bcsisrr94se/branch/master?svg=true)](https://ci.appveyor.com/project/webmozart/assert/branch/master) -[![Code Coverage](https://scrutinizer-ci.com/g/webmozart/assert/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/webmozart/assert/?branch=master) -[![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert) -[![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert) - -This library contains efficient assertions to test the input and output of -your methods. With these assertions, you can greatly reduce the amount of coding -needed to write a safe implementation. - -All assertions in the [`Assert`] class throw an `\InvalidArgumentException` if -they fail. - -FAQ ---- - -**What's the difference to [beberlei/assert]?** - -This library is heavily inspired by Benjamin Eberlei's wonderful [assert package], -but fixes a usability issue with error messages that can't be fixed there without -breaking backwards compatibility. - -This package features usable error messages by default. However, you can also -easily write custom error messages: - -``` -Assert::string($path, 'The path is expected to be a string. Got: %s'); -``` - -In [beberlei/assert], the ordering of the `%s` placeholders is different for -every assertion. This package, on the contrary, provides consistent placeholder -ordering for all assertions: - -* `%s`: The tested value as string, e.g. `"/foo/bar"`. -* `%2$s`, `%3$s`, ...: Additional assertion-specific values, e.g. the - minimum/maximum length, allowed values, etc. - -Check the source code of the assertions to find out details about the additional -available placeholders. - -Installation ------------- - -Use [Composer] to install the package: - -``` -$ composer require webmozart/assert -``` - -Example -------- - -```php -use Webmozart\Assert\Assert; - -class Employee -{ - public function __construct($id) - { - Assert::integer($id, 'The employee ID must be an integer. Got: %s'); - Assert::greaterThan($id, 0, 'The employee ID must be a positive integer. Got: %s'); - } -} -``` - -If you create an employee with an invalid ID, an exception is thrown: - -```php -new Employee('foobar'); -// => InvalidArgumentException: -// The employee ID must be an integer. Got: string - -new Employee(-10); -// => InvalidArgumentException: -// The employee ID must be a positive integer. Got: -10 -``` - -Assertions ----------- - -The [`Assert`] class provides the following assertions: - -### Type Assertions - -Method | Description --------------------------------------------------------- | -------------------------------------------------- -`string($value, $message = '')` | Check that a value is a string -`stringNotEmpty($value, $message = '')` | Check that a value is a non-empty string -`integer($value, $message = '')` | Check that a value is an integer -`integerish($value, $message = '')` | Check that a value casts to an integer -`float($value, $message = '')` | Check that a value is a float -`numeric($value, $message = '')` | Check that a value is numeric -`natural($value, $message= ''')` | Check that a value is a non-negative integer -`boolean($value, $message = '')` | Check that a value is a boolean -`scalar($value, $message = '')` | Check that a value is a scalar -`object($value, $message = '')` | Check that a value is an object -`resource($value, $type = null, $message = '')` | Check that a value is a resource -`isCallable($value, $message = '')` | Check that a value is a callable -`isArray($value, $message = '')` | Check that a value is an array -`isTraversable($value, $message = '')` (deprecated) | Check that a value is an array or a `\Traversable` -`isIterable($value, $message = '')` | Check that a value is an array or a `\Traversable` -`isCountable($value, $message = '')` | Check that a value is an array or a `\Countable` -`isInstanceOf($value, $class, $message = '')` | Check that a value is an `instanceof` a class -`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` at least one class on the array of classes -`notInstanceOf($value, $class, $message = '')` | Check that a value is not an `instanceof` a class -`isAOf($value, $class, $message = '')` | Check that a value is of the class or has one of its parents -`isAnyOf($value, array $classes, $message = '')` | Check that a value is of at least one of the classes or has one of its parents -`isNotA($value, $class, $message = '')` | Check that a value is not of the class or has not one of its parents -`isArrayAccessible($value, $message = '')` | Check that a value can be accessed as an array -`uniqueValues($values, $message = '')` | Check that the given array contains unique values - -### Comparison Assertions - -Method | Description ------------------------------------------------ | ------------------------------------------------------------------ -`true($value, $message = '')` | Check that a value is `true` -`false($value, $message = '')` | Check that a value is `false` -`notFalse($value, $message = '')` | Check that a value is not `false` -`null($value, $message = '')` | Check that a value is `null` -`notNull($value, $message = '')` | Check that a value is not `null` -`isEmpty($value, $message = '')` | Check that a value is `empty()` -`notEmpty($value, $message = '')` | Check that a value is not `empty()` -`eq($value, $value2, $message = '')` | Check that a value equals another (`==`) -`notEq($value, $value2, $message = '')` | Check that a value does not equal another (`!=`) -`same($value, $value2, $message = '')` | Check that a value is identical to another (`===`) -`notSame($value, $value2, $message = '')` | Check that a value is not identical to another (`!==`) -`greaterThan($value, $value2, $message = '')` | Check that a value is greater than another -`greaterThanEq($value, $value2, $message = '')` | Check that a value is greater than or equal to another -`lessThan($value, $value2, $message = '')` | Check that a value is less than another -`lessThanEq($value, $value2, $message = '')` | Check that a value is less than or equal to another -`range($value, $min, $max, $message = '')` | Check that a value is within a range -`inArray($value, array $values, $message = '')` | Check that a value is one of a list of values -`oneOf($value, array $values, $message = '')` | Check that a value is one of a list of values (alias of `inArray`) - -### String Assertions - -You should check that a value is a string with `Assert::string()` before making -any of the following assertions. - -Method | Description ---------------------------------------------------- | ----------------------------------------------------------------- -`contains($value, $subString, $message = '')` | Check that a string contains a substring -`notContains($value, $subString, $message = '')` | Check that a string does not contain a substring -`startsWith($value, $prefix, $message = '')` | Check that a string has a prefix -`notStartsWith($value, $prefix, $message = '')` | Check that a string does not have a prefix -`startsWithLetter($value, $message = '')` | Check that a string starts with a letter -`endsWith($value, $suffix, $message = '')` | Check that a string has a suffix -`notEndsWith($value, $suffix, $message = '')` | Check that a string does not have a suffix -`regex($value, $pattern, $message = '')` | Check that a string matches a regular expression -`notRegex($value, $pattern, $message = '')` | Check that a string does not match a regular expression -`unicodeLetters($value, $message = '')` | Check that a string contains Unicode letters only -`alpha($value, $message = '')` | Check that a string contains letters only -`digits($value, $message = '')` | Check that a string contains digits only -`alnum($value, $message = '')` | Check that a string contains letters and digits only -`lower($value, $message = '')` | Check that a string contains lowercase characters only -`upper($value, $message = '')` | Check that a string contains uppercase characters only -`length($value, $length, $message = '')` | Check that a string has a certain number of characters -`minLength($value, $min, $message = '')` | Check that a string has at least a certain number of characters -`maxLength($value, $max, $message = '')` | Check that a string has at most a certain number of characters -`lengthBetween($value, $min, $max, $message = '')` | Check that a string has a length in the given range -`uuid($value, $message = '')` | Check that a string is a valid UUID -`ip($value, $message = '')` | Check that a string is a valid IP (either IPv4 or IPv6) -`ipv4($value, $message = '')` | Check that a string is a valid IPv4 -`ipv6($value, $message = '')` | Check that a string is a valid IPv6 -`email($value, $message = '')` | Check that a string is a valid e-mail address -`notWhitespaceOnly($value, $message = '')` | Check that a string contains at least one non-whitespace character - -### File Assertions - -Method | Description ------------------------------------ | -------------------------------------------------- -`fileExists($value, $message = '')` | Check that a value is an existing path -`file($value, $message = '')` | Check that a value is an existing file -`directory($value, $message = '')` | Check that a value is an existing directory -`readable($value, $message = '')` | Check that a value is a readable path -`writable($value, $message = '')` | Check that a value is a writable path - -### Object Assertions - -Method | Description ------------------------------------------------------ | -------------------------------------------------- -`classExists($value, $message = '')` | Check that a value is an existing class name -`subclassOf($value, $class, $message = '')` | Check that a class is a subclass of another -`interfaceExists($value, $message = '')` | Check that a value is an existing interface name -`implementsInterface($value, $class, $message = '')` | Check that a class implements an interface -`propertyExists($value, $property, $message = '')` | Check that a property exists in a class/object -`propertyNotExists($value, $property, $message = '')` | Check that a property does not exist in a class/object -`methodExists($value, $method, $message = '')` | Check that a method exists in a class/object -`methodNotExists($value, $method, $message = '')` | Check that a method does not exist in a class/object - -### Array Assertions - -Method | Description --------------------------------------------------- | ------------------------------------------------------------------ -`keyExists($array, $key, $message = '')` | Check that a key exists in an array -`keyNotExists($array, $key, $message = '')` | Check that a key does not exist in an array -`validArrayKey($key, $message = '')` | Check that a value is a valid array key (int or string) -`count($array, $number, $message = '')` | Check that an array contains a specific number of elements -`minCount($array, $min, $message = '')` | Check that an array contains at least a certain number of elements -`maxCount($array, $max, $message = '')` | Check that an array contains at most a certain number of elements -`countBetween($array, $min, $max, $message = '')` | Check that an array has a count in the given range -`isList($array, $message = '')` | Check that an array is a non-associative list -`isNonEmptyList($array, $message = '')` | Check that an array is a non-associative list, and not empty -`isMap($array, $message = '')` | Check that an array is associative and has strings as keys -`isNonEmptyMap($array, $message = '')` | Check that an array is associative and has strings as keys, and is not empty - -### Function Assertions - -Method | Description -------------------------------------------- | ----------------------------------------------------------------------------------------------------- -`throws($closure, $class, $message = '')` | Check that a function throws a certain exception. Subclasses of the exception class will be accepted. - -### Collection Assertions - -All of the above assertions can be prefixed with `all*()` to test the contents -of an array or a `\Traversable`: - -```php -Assert::allIsInstanceOf($employees, 'Acme\Employee'); -``` - -### Nullable Assertions - -All of the above assertions can be prefixed with `nullOr*()` to run the -assertion only if it the value is not `null`: - -```php -Assert::nullOrString($middleName, 'The middle name must be a string or null. Got: %s'); -``` - -### Extending Assert - -The `Assert` class comes with a few methods, which can be overridden to change the class behaviour. You can also extend it to -add your own assertions. - -#### Overriding methods - -Overriding the following methods in your assertion class allows you to change the behaviour of the assertions: - -* `public static function __callStatic($name, $arguments)` - * This method is used to 'create' the `nullOr` and `all` versions of the assertions. -* `protected static function valueToString($value)` - * This method is used for error messages, to convert the value to a string value for displaying. You could use this for representing a value object with a `__toString` method for example. -* `protected static function typeToString($value)` - * This method is used for error messages, to convert the a value to a string representing its type. -* `protected static function strlen($value)` - * This method is used to calculate string length for relevant methods, using the `mb_strlen` if available and useful. -* `protected static function reportInvalidArgument($message)` - * This method is called when an assertion fails, with the specified error message. Here you can throw your own exception, or log something. - - -Authors -------- - -* [Bernhard Schussek] a.k.a. [@webmozart] -* [The Community Contributors] - -Contribute ----------- - -Contributions to the package are always welcome! - -* Report any bugs or issues you find on the [issue tracker]. -* You can grab the source code at the package's [Git repository]. - -License -------- - -All contents of this package are licensed under the [MIT license]. - -[beberlei/assert]: https://github.com/beberlei/assert -[assert package]: https://github.com/beberlei/assert -[Composer]: https://getcomposer.org -[Bernhard Schussek]: https://webmozarts.com -[The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors -[issue tracker]: https://github.com/webmozart/assert/issues -[Git repository]: https://github.com/webmozart/assert -[@webmozart]: https://twitter.com/webmozart -[MIT license]: LICENSE -[`Assert`]: src/Assert.php diff --git a/vendor/webmozart/assert/composer.json b/vendor/webmozart/assert/composer.json deleted file mode 100644 index 2e609b6..0000000 --- a/vendor/webmozart/assert/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "webmozart/assert", - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "license": "MIT", - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" - }, - "conflict": { - "vimeo/psalm": "<3.9.1", - "phpstan/phpstan": "<0.12.20" - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Webmozart\\Assert\\Tests\\": "tests/", - "Webmozart\\Assert\\Bin\\": "bin/src" - } - } -} diff --git a/vendor/webmozart/assert/psalm.xml b/vendor/webmozart/assert/psalm.xml deleted file mode 100644 index 9a43008..0000000 --- a/vendor/webmozart/assert/psalm.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - diff --git a/vendor/webmozart/assert/src/Assert.php b/vendor/webmozart/assert/src/Assert.php deleted file mode 100644 index b28e178..0000000 --- a/vendor/webmozart/assert/src/Assert.php +++ /dev/null @@ -1,2048 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Webmozart\Assert; - -use ArrayAccess; -use BadMethodCallException; -use Closure; -use Countable; -use DateTime; -use DateTimeImmutable; -use Exception; -use InvalidArgumentException; -use ResourceBundle; -use SimpleXMLElement; -use Throwable; -use Traversable; - -/** - * Efficient assertions to validate the input/output of your methods. - * - * @mixin Mixin - * - * @since 1.0 - * - * @author Bernhard Schussek - */ -class Assert -{ - /** - * @psalm-pure - * @psalm-assert string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function string($value, $message = '') - { - if (!\is_string($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a string. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert non-empty-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function stringNotEmpty($value, $message = '') - { - static::string($value, $message); - static::notEq($value, '', $message); - } - - /** - * @psalm-pure - * @psalm-assert int $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function integer($value, $message = '') - { - if (!\is_int($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an integer. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert numeric $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function integerish($value, $message = '') - { - if (!\is_numeric($value) || $value != (int) $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an integerish value. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert float $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function float($value, $message = '') - { - if (!\is_float($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a float. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert numeric $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function numeric($value, $message = '') - { - if (!\is_numeric($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a numeric. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert int $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function natural($value, $message = '') - { - if (!\is_int($value) || $value < 0) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a non-negative integer. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert bool $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function boolean($value, $message = '') - { - if (!\is_bool($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a boolean. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert scalar $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function scalar($value, $message = '') - { - if (!\is_scalar($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a scalar. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert object $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function object($value, $message = '') - { - if (!\is_object($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an object. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert resource $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function resource($value, $type = null, $message = '') - { - if (!\is_resource($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a resource. Got: %s', - static::typeToString($value) - )); - } - - if ($type && $type !== \get_resource_type($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a resource of type %2$s. Got: %s', - static::typeToString($value), - $type - )); - } - } - - /** - * @psalm-pure - * @psalm-assert callable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isCallable($value, $message = '') - { - if (!\is_callable($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a callable. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert array $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isArray($value, $message = '') - { - if (!\is_array($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isTraversable($value, $message = '') - { - @\trigger_error( - \sprintf( - 'The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.', - __METHOD__ - ), - \E_USER_DEPRECATED - ); - - if (!\is_array($value) && !($value instanceof Traversable)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a traversable. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert array|ArrayAccess $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isArrayAccessible($value, $message = '') - { - if (!\is_array($value) && !($value instanceof ArrayAccess)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array accessible. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert countable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isCountable($value, $message = '') - { - if ( - !\is_array($value) - && !($value instanceof Countable) - && !($value instanceof ResourceBundle) - && !($value instanceof SimpleXMLElement) - ) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a countable. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isIterable($value, $message = '') - { - if (!\is_array($value) && !($value instanceof Traversable)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an iterable. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isInstanceOf($value, $class, $message = '') - { - if (!($value instanceof $class)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an instance of %2$s. Got: %s', - static::typeToString($value), - $class - )); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert !ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notInstanceOf($value, $class, $message = '') - { - if ($value instanceof $class) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an instance other than %2$s. Got: %s', - static::typeToString($value), - $class - )); - } - } - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isInstanceOfAny($value, array $classes, $message = '') - { - foreach ($classes as $class) { - if ($value instanceof $class) { - return; - } - } - - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an instance of any of %2$s. Got: %s', - static::typeToString($value), - \implode(', ', \array_map(array('static', 'valueToString'), $classes)) - )); - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType|class-string $value - * - * @param object|string $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isAOf($value, $class, $message = '') - { - static::string($class, 'Expected class as a string. Got: %s'); - - if (!\is_a($value, $class, \is_string($value))) { - static::reportInvalidArgument(sprintf( - $message ?: 'Expected an instance of this class or to this class among his parents %2$s. Got: %s', - static::typeToString($value), - $class - )); - } - } - - /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * @psalm-assert !UnexpectedType $value - * @psalm-assert !class-string $value - * - * @param object|string $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isNotA($value, $class, $message = '') - { - static::string($class, 'Expected class as a string. Got: %s'); - - if (\is_a($value, $class, \is_string($value))) { - static::reportInvalidArgument(sprintf( - $message ?: 'Expected an instance of this class or to this class among his parents other than %2$s. Got: %s', - static::typeToString($value), - $class - )); - } - } - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param object|string $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isAnyOf($value, array $classes, $message = '') - { - foreach ($classes as $class) { - static::string($class, 'Expected class as a string. Got: %s'); - - if (\is_a($value, $class, \is_string($value))) { - return; - } - } - - static::reportInvalidArgument(sprintf( - $message ?: 'Expected an any of instance of this class or to this class among his parents other than %2$s. Got: %s', - static::typeToString($value), - \implode(', ', \array_map(array('static', 'valueToString'), $classes)) - )); - } - - /** - * @psalm-pure - * @psalm-assert empty $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isEmpty($value, $message = '') - { - if (!empty($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an empty value. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert !empty $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notEmpty($value, $message = '') - { - if (empty($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a non-empty value. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function null($value, $message = '') - { - if (null !== $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected null. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert !null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notNull($value, $message = '') - { - if (null === $value) { - static::reportInvalidArgument( - $message ?: 'Expected a value other than null.' - ); - } - } - - /** - * @psalm-pure - * @psalm-assert true $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function true($value, $message = '') - { - if (true !== $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be true. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert false $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function false($value, $message = '') - { - if (false !== $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be false. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert !false $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notFalse($value, $message = '') - { - if (false === $value) { - static::reportInvalidArgument( - $message ?: 'Expected a value other than false.' - ); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function ip($value, $message = '') - { - if (false === \filter_var($value, \FILTER_VALIDATE_IP)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be an IP. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function ipv4($value, $message = '') - { - if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be an IPv4. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function ipv6($value, $message = '') - { - if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be an IPv6. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function email($value, $message = '') - { - if (false === \filter_var($value, FILTER_VALIDATE_EMAIL)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to be a valid e-mail address. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * Does non strict comparisons on the items, so ['3', 3] will not pass the assertion. - * - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function uniqueValues(array $values, $message = '') - { - $allValues = \count($values); - $uniqueValues = \count(\array_unique($values)); - - if ($allValues !== $uniqueValues) { - $difference = $allValues - $uniqueValues; - - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array of unique values, but %s of them %s duplicated', - $difference, - (1 === $difference ? 'is' : 'are') - )); - } - } - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function eq($value, $expect, $message = '') - { - if ($expect != $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value equal to %2$s. Got: %s', - static::valueToString($value), - static::valueToString($expect) - )); - } - } - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notEq($value, $expect, $message = '') - { - if ($expect == $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a different value than %s.', - static::valueToString($expect) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function same($value, $expect, $message = '') - { - if ($expect !== $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value identical to %2$s. Got: %s', - static::valueToString($value), - static::valueToString($expect) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notSame($value, $expect, $message = '') - { - if ($expect === $value) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value not identical to %s.', - static::valueToString($expect) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function greaterThan($value, $limit, $message = '') - { - if ($value <= $limit) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value greater than %2$s. Got: %s', - static::valueToString($value), - static::valueToString($limit) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function greaterThanEq($value, $limit, $message = '') - { - if ($value < $limit) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value greater than or equal to %2$s. Got: %s', - static::valueToString($value), - static::valueToString($limit) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lessThan($value, $limit, $message = '') - { - if ($value >= $limit) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value less than %2$s. Got: %s', - static::valueToString($value), - static::valueToString($limit) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lessThanEq($value, $limit, $message = '') - { - if ($value > $limit) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value less than or equal to %2$s. Got: %s', - static::valueToString($value), - static::valueToString($limit) - )); - } - } - - /** - * Inclusive range, so Assert::(3, 3, 5) passes. - * - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function range($value, $min, $max, $message = '') - { - if ($value < $min || $value > $max) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value between %2$s and %3$s. Got: %s', - static::valueToString($value), - static::valueToString($min), - static::valueToString($max) - )); - } - } - - /** - * A more human-readable alias of Assert::inArray(). - * - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function oneOf($value, array $values, $message = '') - { - static::inArray($value, $values, $message); - } - - /** - * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion. - * - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function inArray($value, array $values, $message = '') - { - if (!\in_array($value, $values, true)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected one of: %2$s. Got: %s', - static::valueToString($value), - \implode(', ', \array_map(array('static', 'valueToString'), $values)) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function contains($value, $subString, $message = '') - { - if (false === \strpos($value, $subString)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain %2$s. Got: %s', - static::valueToString($value), - static::valueToString($subString) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notContains($value, $subString, $message = '') - { - if (false !== \strpos($value, $subString)) { - static::reportInvalidArgument(\sprintf( - $message ?: '%2$s was not expected to be contained in a value. Got: %s', - static::valueToString($value), - static::valueToString($subString) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notWhitespaceOnly($value, $message = '') - { - if (\preg_match('/^\s*$/', $value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a non-whitespace string. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function startsWith($value, $prefix, $message = '') - { - if (0 !== \strpos($value, $prefix)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to start with %2$s. Got: %s', - static::valueToString($value), - static::valueToString($prefix) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notStartsWith($value, $prefix, $message = '') - { - if (0 === \strpos($value, $prefix)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value not to start with %2$s. Got: %s', - static::valueToString($value), - static::valueToString($prefix) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function startsWithLetter($value, $message = '') - { - static::string($value); - - $valid = isset($value[0]); - - if ($valid) { - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = \ctype_alpha($value[0]); - \setlocale(LC_CTYPE, $locale); - } - - if (!$valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to start with a letter. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function endsWith($value, $suffix, $message = '') - { - if ($suffix !== \substr($value, -\strlen($suffix))) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to end with %2$s. Got: %s', - static::valueToString($value), - static::valueToString($suffix) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notEndsWith($value, $suffix, $message = '') - { - if ($suffix === \substr($value, -\strlen($suffix))) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value not to end with %2$s. Got: %s', - static::valueToString($value), - static::valueToString($suffix) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function regex($value, $pattern, $message = '') - { - if (!\preg_match($pattern, $value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The value %s does not match the expected pattern.', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notRegex($value, $pattern, $message = '') - { - if (\preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The value %s matches the pattern %s (at offset %d).', - static::valueToString($value), - static::valueToString($pattern), - $matches[0][1] - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function unicodeLetters($value, $message = '') - { - static::string($value); - - if (!\preg_match('/^\p{L}+$/u', $value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain only Unicode letters. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function alpha($value, $message = '') - { - static::string($value); - - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = !\ctype_alpha($value); - \setlocale(LC_CTYPE, $locale); - - if ($valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain only letters. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function digits($value, $message = '') - { - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = !\ctype_digit($value); - \setlocale(LC_CTYPE, $locale); - - if ($valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain digits only. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function alnum($value, $message = '') - { - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = !\ctype_alnum($value); - \setlocale(LC_CTYPE, $locale); - - if ($valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain letters and digits only. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert lowercase-string $value - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lower($value, $message = '') - { - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = !\ctype_lower($value); - \setlocale(LC_CTYPE, $locale); - - if ($valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain lowercase characters only. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-assert !lowercase-string $value - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function upper($value, $message = '') - { - $locale = \setlocale(LC_CTYPE, 0); - \setlocale(LC_CTYPE, 'C'); - $valid = !\ctype_upper($value); - \setlocale(LC_CTYPE, $locale); - - if ($valid) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain uppercase characters only. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * - * @param string $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function length($value, $length, $message = '') - { - if ($length !== static::strlen($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain %2$s characters. Got: %s', - static::valueToString($value), - $length - )); - } - } - - /** - * Inclusive min. - * - * @psalm-pure - * - * @param string $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function minLength($value, $min, $message = '') - { - if (static::strlen($value) < $min) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain at least %2$s characters. Got: %s', - static::valueToString($value), - $min - )); - } - } - - /** - * Inclusive max. - * - * @psalm-pure - * - * @param string $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function maxLength($value, $max, $message = '') - { - if (static::strlen($value) > $max) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain at most %2$s characters. Got: %s', - static::valueToString($value), - $max - )); - } - } - - /** - * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion. - * - * @psalm-pure - * - * @param string $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lengthBetween($value, $min, $max, $message = '') - { - $length = static::strlen($value); - - if ($length < $min || $length > $max) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', - static::valueToString($value), - $min, - $max - )); - } - } - - /** - * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file. - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function fileExists($value, $message = '') - { - static::string($value); - - if (!\file_exists($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The file %s does not exist.', - static::valueToString($value) - )); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function file($value, $message = '') - { - static::fileExists($value, $message); - - if (!\is_file($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The path %s is not a file.', - static::valueToString($value) - )); - } - } - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function directory($value, $message = '') - { - static::fileExists($value, $message); - - if (!\is_dir($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The path %s is no directory.', - static::valueToString($value) - )); - } - } - - /** - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function readable($value, $message = '') - { - if (!\is_readable($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The path %s is not readable.', - static::valueToString($value) - )); - } - } - - /** - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function writable($value, $message = '') - { - if (!\is_writable($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'The path %s is not writable.', - static::valueToString($value) - )); - } - } - - /** - * @psalm-assert class-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function classExists($value, $message = '') - { - if (!\class_exists($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an existing class name. Got: %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert class-string|ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function subclassOf($value, $class, $message = '') - { - if (!\is_subclass_of($value, $class)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected a sub-class of %2$s. Got: %s', - static::valueToString($value), - static::valueToString($class) - )); - } - } - - /** - * @psalm-assert class-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function interfaceExists($value, $message = '') - { - if (!\interface_exists($value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an existing interface name. got %s', - static::valueToString($value) - )); - } - } - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert class-string $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function implementsInterface($value, $interface, $message = '') - { - if (!\in_array($interface, \class_implements($value))) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an implementation of %2$s. Got: %s', - static::valueToString($value), - static::valueToString($interface) - )); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function propertyExists($classOrObject, $property, $message = '') - { - if (!\property_exists($classOrObject, $property)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the property %s to exist.', - static::valueToString($property) - )); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function propertyNotExists($classOrObject, $property, $message = '') - { - if (\property_exists($classOrObject, $property)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the property %s to not exist.', - static::valueToString($property) - )); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function methodExists($classOrObject, $method, $message = '') - { - if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the method %s to exist.', - static::valueToString($method) - )); - } - } - - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function methodNotExists($classOrObject, $method, $message = '') - { - if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the method %s to not exist.', - static::valueToString($method) - )); - } - } - - /** - * @psalm-pure - * - * @param array $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function keyExists($array, $key, $message = '') - { - if (!(isset($array[$key]) || \array_key_exists($key, $array))) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the key %s to exist.', - static::valueToString($key) - )); - } - } - - /** - * @psalm-pure - * - * @param array $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function keyNotExists($array, $key, $message = '') - { - if (isset($array[$key]) || \array_key_exists($key, $array)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected the key %s to not exist.', - static::valueToString($key) - )); - } - } - - /** - * Checks if a value is a valid array key (int or string). - * - * @psalm-pure - * @psalm-assert array-key $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function validArrayKey($value, $message = '') - { - if (!(\is_int($value) || \is_string($value))) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected string or integer. Got: %s', - static::typeToString($value) - )); - } - } - - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function count($array, $number, $message = '') - { - static::eq( - \count($array), - $number, - \sprintf( - $message ?: 'Expected an array to contain %d elements. Got: %d.', - $number, - \count($array) - ) - ); - } - - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function minCount($array, $min, $message = '') - { - if (\count($array) < $min) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array to contain at least %2$d elements. Got: %d', - \count($array), - $min - )); - } - } - - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function maxCount($array, $max, $message = '') - { - if (\count($array) > $max) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array to contain at most %2$d elements. Got: %d', - \count($array), - $max - )); - } - } - - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function countBetween($array, $min, $max, $message = '') - { - $count = \count($array); - - if ($count < $min || $count > $max) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d', - $count, - $min, - $max - )); - } - } - - /** - * @psalm-pure - * @psalm-assert list $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isList($array, $message = '') - { - if (!\is_array($array) || $array !== \array_values($array)) { - static::reportInvalidArgument( - $message ?: 'Expected list - non-associative array.' - ); - } - } - - /** - * @psalm-pure - * @psalm-assert non-empty-list $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isNonEmptyList($array, $message = '') - { - static::isList($array, $message); - static::notEmpty($array, $message); - } - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array $array - * @psalm-assert array $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isMap($array, $message = '') - { - if ( - !\is_array($array) || - \array_keys($array) !== \array_filter(\array_keys($array), '\is_string') - ) { - static::reportInvalidArgument( - $message ?: 'Expected map - associative array with string keys.' - ); - } - } - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array $array - * @psalm-assert array $array - * @psalm-assert !empty $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isNonEmptyMap($array, $message = '') - { - static::isMap($array, $message); - static::notEmpty($array, $message); - } - - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function uuid($value, $message = '') - { - $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); - - // The nil UUID is special form of UUID that is specified to have all - // 128 bits set to zero. - if ('00000000-0000-0000-0000-000000000000' === $value) { - return; - } - - if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { - static::reportInvalidArgument(\sprintf( - $message ?: 'Value %s is not a valid UUID.', - static::valueToString($value) - )); - } - } - - /** - * @psalm-param class-string $class - * - * @param Closure $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function throws(Closure $expression, $class = 'Exception', $message = '') - { - static::string($class); - - $actual = 'none'; - - try { - $expression(); - } catch (Exception $e) { - $actual = \get_class($e); - if ($e instanceof $class) { - return; - } - } catch (Throwable $e) { - $actual = \get_class($e); - if ($e instanceof $class) { - return; - } - } - - static::reportInvalidArgument($message ?: \sprintf( - 'Expected to throw "%s", got "%s"', - $class, - $actual - )); - } - - /** - * @throws BadMethodCallException - */ - public static function __callStatic($name, $arguments) - { - if ('nullOr' === \substr($name, 0, 6)) { - if (null !== $arguments[0]) { - $method = \lcfirst(\substr($name, 6)); - \call_user_func_array(array('static', $method), $arguments); - } - - return; - } - - if ('all' === \substr($name, 0, 3)) { - static::isIterable($arguments[0]); - - $method = \lcfirst(\substr($name, 3)); - $args = $arguments; - - foreach ($arguments[0] as $entry) { - $args[0] = $entry; - - \call_user_func_array(array('static', $method), $args); - } - - return; - } - - throw new BadMethodCallException('No such method: '.$name); - } - - /** - * @param mixed $value - * - * @return string - */ - protected static function valueToString($value) - { - if (null === $value) { - return 'null'; - } - - if (true === $value) { - return 'true'; - } - - if (false === $value) { - return 'false'; - } - - if (\is_array($value)) { - return 'array'; - } - - if (\is_object($value)) { - if (\method_exists($value, '__toString')) { - return \get_class($value).': '.self::valueToString($value->__toString()); - } - - if ($value instanceof DateTime || $value instanceof DateTimeImmutable) { - return \get_class($value).': '.self::valueToString($value->format('c')); - } - - return \get_class($value); - } - - if (\is_resource($value)) { - return 'resource'; - } - - if (\is_string($value)) { - return '"'.$value.'"'; - } - - return (string) $value; - } - - /** - * @param mixed $value - * - * @return string - */ - protected static function typeToString($value) - { - return \is_object($value) ? \get_class($value) : \gettype($value); - } - - protected static function strlen($value) - { - if (!\function_exists('mb_detect_encoding')) { - return \strlen($value); - } - - if (false === $encoding = \mb_detect_encoding($value)) { - return \strlen($value); - } - - return \mb_strlen($value, $encoding); - } - - /** - * @param string $message - * - * @throws InvalidArgumentException - * - * @psalm-pure this method is not supposed to perform side-effects - */ - protected static function reportInvalidArgument($message) - { - throw new InvalidArgumentException($message); - } - - private function __construct() - { - } -} diff --git a/vendor/webmozart/assert/src/Mixin.php b/vendor/webmozart/assert/src/Mixin.php deleted file mode 100644 index 3ad9b2d..0000000 --- a/vendor/webmozart/assert/src/Mixin.php +++ /dev/null @@ -1,1971 +0,0 @@ - $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allString($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|non-empty-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrStringNotEmpty($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allStringNotEmpty($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|int $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrInteger($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allInteger($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|numeric $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIntegerish($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIntegerish($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|float $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrFloat($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allFloat($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|numeric $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNumeric($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNumeric($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|int $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNatural($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNatural($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|bool $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrBoolean($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allBoolean($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|scalar $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrScalar($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allScalar($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|object $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrObject($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allObject($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|resource $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrResource($value, $type = null, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allResource($value, $type = null, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|callable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsCallable($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsCallable($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|array $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsArray($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsArray($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|iterable $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsTraversable($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsTraversable($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|array|ArrayAccess $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsArrayAccessible($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsArrayAccessible($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|countable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsCountable($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsCountable($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsIterable($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsIterable($value, $message = ''); - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert null|ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsInstanceOf($value, $class, $message = ''); - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsInstanceOf($value, $class, $message = ''); - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNotInstanceOf($value, $class, $message = ''); - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNotInstanceOf($value, $class, $message = ''); - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsInstanceOfAny($value, $classes, $message = ''); - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsInstanceOfAny($value, $classes, $message = ''); - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert null|ExpectedType|class-string $value - * - * @param null|object|string $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsAOf($value, $class, $message = ''); - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable> $value - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsAOf($value, $class, $message = ''); - - /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * - * @param null|object|string $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsNotA($value, $class, $message = ''); - - /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsNotA($value, $class, $message = ''); - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param null|object|string $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsAnyOf($value, $classes, $message = ''); - - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param iterable $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsAnyOf($value, $classes, $message = ''); - - /** - * @psalm-pure - * @psalm-assert empty $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsEmpty($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsEmpty($value, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNotEmpty($value, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNotEmpty($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNull($value, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNotNull($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|true $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrTrue($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allTrue($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|false $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrFalse($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allFalse($value, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNotFalse($value, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNotFalse($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIp($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIp($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIpv4($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIpv4($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIpv6($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIpv6($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrEmail($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allEmail($value, $message = ''); - - /** - * @param null|array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrUniqueValues($values, $message = ''); - - /** - * @param iterable $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allUniqueValues($values, $message = ''); - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrEq($value, $expect, $message = ''); - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allEq($value, $expect, $message = ''); - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNotEq($value, $expect, $message = ''); - - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNotEq($value, $expect, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrSame($value, $expect, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allSame($value, $expect, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNotSame($value, $expect, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNotSame($value, $expect, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrGreaterThan($value, $limit, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allGreaterThan($value, $limit, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrGreaterThanEq($value, $limit, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allGreaterThanEq($value, $limit, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrLessThan($value, $limit, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allLessThan($value, $limit, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrLessThanEq($value, $limit, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allLessThanEq($value, $limit, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrRange($value, $min, $max, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allRange($value, $min, $max, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrOneOf($value, $values, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allOneOf($value, $values, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrInArray($value, $values, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allInArray($value, $values, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrContains($value, $subString, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allContains($value, $subString, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNotContains($value, $subString, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNotContains($value, $subString, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNotWhitespaceOnly($value, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNotWhitespaceOnly($value, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrStartsWith($value, $prefix, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allStartsWith($value, $prefix, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNotStartsWith($value, $prefix, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNotStartsWith($value, $prefix, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrStartsWithLetter($value, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allStartsWithLetter($value, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrEndsWith($value, $suffix, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allEndsWith($value, $suffix, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNotEndsWith($value, $suffix, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNotEndsWith($value, $suffix, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrRegex($value, $pattern, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allRegex($value, $pattern, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrNotRegex($value, $pattern, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allNotRegex($value, $pattern, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrUnicodeLetters($value, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allUnicodeLetters($value, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrAlpha($value, $message = ''); - - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allAlpha($value, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrDigits($value, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allDigits($value, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrAlnum($value, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allAlnum($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|lowercase-string $value - * - * @param null|string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrLower($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allLower($value, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrUpper($value, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allUpper($value, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrLength($value, $length, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allLength($value, $length, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrMinLength($value, $min, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allMinLength($value, $min, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrMaxLength($value, $max, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allMaxLength($value, $max, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrLengthBetween($value, $min, $max, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allLengthBetween($value, $min, $max, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrFileExists($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allFileExists($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrFile($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allFile($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrDirectory($value, $message = ''); - - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allDirectory($value, $message = ''); - - /** - * @param null|string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrReadable($value, $message = ''); - - /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allReadable($value, $message = ''); - - /** - * @param null|string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrWritable($value, $message = ''); - - /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allWritable($value, $message = ''); - - /** - * @psalm-assert null|class-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrClassExists($value, $message = ''); - - /** - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allClassExists($value, $message = ''); - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert null|class-string|ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrSubclassOf($value, $class, $message = ''); - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable|ExpectedType> $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allSubclassOf($value, $class, $message = ''); - - /** - * @psalm-assert null|class-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrInterfaceExists($value, $message = ''); - - /** - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allInterfaceExists($value, $message = ''); - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert null|class-string $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrImplementsInterface($value, $interface, $message = ''); - - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert iterable> $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allImplementsInterface($value, $interface, $message = ''); - - /** - * @psalm-pure - * @psalm-param null|class-string|object $classOrObject - * - * @param null|string|object $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrPropertyExists($classOrObject, $property, $message = ''); - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allPropertyExists($classOrObject, $property, $message = ''); - - /** - * @psalm-pure - * @psalm-param null|class-string|object $classOrObject - * - * @param null|string|object $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrPropertyNotExists($classOrObject, $property, $message = ''); - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allPropertyNotExists($classOrObject, $property, $message = ''); - - /** - * @psalm-pure - * @psalm-param null|class-string|object $classOrObject - * - * @param null|string|object $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrMethodExists($classOrObject, $method, $message = ''); - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allMethodExists($classOrObject, $method, $message = ''); - - /** - * @psalm-pure - * @psalm-param null|class-string|object $classOrObject - * - * @param null|string|object $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrMethodNotExists($classOrObject, $method, $message = ''); - - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allMethodNotExists($classOrObject, $method, $message = ''); - - /** - * @psalm-pure - * - * @param null|array $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrKeyExists($array, $key, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allKeyExists($array, $key, $message = ''); - - /** - * @psalm-pure - * - * @param null|array $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrKeyNotExists($array, $key, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allKeyNotExists($array, $key, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|array-key $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrValidArrayKey($value, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allValidArrayKey($value, $message = ''); - - /** - * @param null|Countable|array $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrCount($array, $number, $message = ''); - - /** - * @param iterable $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allCount($array, $number, $message = ''); - - /** - * @param null|Countable|array $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrMinCount($array, $min, $message = ''); - - /** - * @param iterable $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allMinCount($array, $min, $message = ''); - - /** - * @param null|Countable|array $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrMaxCount($array, $max, $message = ''); - - /** - * @param iterable $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allMaxCount($array, $max, $message = ''); - - /** - * @param null|Countable|array $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrCountBetween($array, $min, $max, $message = ''); - - /** - * @param iterable $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allCountBetween($array, $min, $max, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|list $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsList($array, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsList($array, $message = ''); - - /** - * @psalm-pure - * @psalm-assert null|non-empty-list $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsNonEmptyList($array, $message = ''); - - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsNonEmptyList($array, $message = ''); - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param null|mixed|array $array - * @psalm-assert null|array $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsMap($array, $message = ''); - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param iterable> $array - * @psalm-assert iterable> $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsMap($array, $message = ''); - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param null|mixed|array $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrIsNonEmptyMap($array, $message = ''); - - /** - * @psalm-pure - * @psalm-template T - * @psalm-param iterable> $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allIsNonEmptyMap($array, $message = ''); - - /** - * @psalm-pure - * - * @param null|string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrUuid($value, $message = ''); - - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allUuid($value, $message = ''); - - /** - * @psalm-param class-string $class - * - * @param null|Closure $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function nullOrThrows($expression, $class = 'Exception', $message = ''); - - /** - * @psalm-param class-string $class - * - * @param iterable $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function allThrows($expression, $class = 'Exception', $message = ''); -}
  • ad7cYmzcr*Ww- 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 z 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⪻$8lBK{u#*lpiy zxLtw{ahO4Kik|2=cRj6Q6plW9`McfNh>ouiHCm#qIPyjU*LFMEQLhTU9L!)ytA+O^ z{TVFYpdj31IJcD`{^Sn3thbKd=P?$)jWd&!M#yBvHzV92&>@ndOs3L#Hv)~E{|DSp zjbvksSrJDn@&LnE(qj!8#Ud}MPSyTZW*6L-x=oZSo|h_epxoY`v=kyIs1!6_VU9)x z>&Rin6(KwI5~YS!cp00FQ#vyFuN>lrm^)$qmRS5=>hef*1ZJ%+gt&-DgR=~i`5>7N zDTOMOA+h-fQY@_kv=neGYkH2X8uB)t>!HwSe;|+M$8buV!6wkGahNu<;_FiAYza?v zK&nEYAQM(D>6WfV6n0#aHpaf~}qtT_aQCYQ-D^8MP6L)&1@L=eiYX&6Eo=UHYq)c7S z^aw=_+1L=pLk7QG{q7M|%f03xYK1x+*U(5^jMIx=-Vh$5Bi(NmZwT~TE3vg#N?m*) zOGSP)4bn#b)j(_D&49nmN|?_s_!C3nL^PxHH{FIglPSNw#RJbS8*R*yb@qTPx(0s| zt`kHqFXj5Ws2LBF!3Ylx?2H<~6E02DL~Z^0-gn7n+OW9>yzQ zr4G2}Cze`J%gnpfGOz(~_@sIyQaP8hCl>#JN7q)xfXg3S`w>e` z`TA=z$+u>VVM?Hab?YD8I5?JgcHbk-IJ-tTJ0R1o`E)N%3X+=6(yzJ!+5-f?tV-7CT7D#o-!><&j~% zEX_IFah)@?=kNj?&9K0ite7tJVh`A!;k7edg>TzefJadB%tk`ecH%p9xq$(Tp-J=U z$x{jZl)XYoo#Wf;({i4>_uK%Hrsyfz3^xp#mR*Y{P~x|Eh`)$zqQN!!XP8dSr-$p3 zBTpXJRqKtmXz=ho!`KgsLl5Isth6R@<8%NKeNFhDuCCl0h&&Nm&(=s*)?5?LUk{?I z8GLr#OQ0b=^XaLO9zkoW^akG5;8z;;i9BDLk%s9nUu8|W2JzsUwb~^oM>7VGma@2m zV5Q#h(s7$XhJn(uYa)ajB{DQzj>hB>|Kvp*<_2NCzG`o9@g$z`9G<*r!Q(3GtqJ2K znXnXr7{$x^b%dygqm-QjC!_IrRDR+&E9=RRHtVyN?eqq*o8S|g-wU4Jvu4stWz98V zR(q`I^z^Bf(n4tJ6{1+YH_&vr7_Av$cqeDY*Mw(&lMI#!v58QdIC2-W534{@j(1X5 zuQ#;J=y4C2S%EZ+S+UZZ$mv4|CBbfOudHa`ho<8&u+;X&b#^na%1%C)F;>L{0q-;w<-S%XO=$)94W>=tLFR z<%aGM>7$Zt7N+1b&RY8xD3iMfku$&1P+*`n0IqGLS8R18FIF6Ikk&+%2(#J;MbJH*@%=V;2|RT`mPth6T1 zWU>c&0aiXll#}@V8K1HETjTVY3Yaj;;Mu}TA&a({)WJE>u|aK9nE?)P*pbhp?eAf){yo$4_w+3JeP)%`sdaRLIr^=1M8h(S zrG`o7>$F6P!@AI6N=Clzk8>74YC{6*Dwt!O>-cyg((@e({ycz2NOQ?`PI7=O;ib5R zTueUGaq-}Gq>Ce`T(7rHTkbkciduFJ611_ZzJ*9b;1GRt$g>BF(zp0%vxXVL8bN6f z#4v#u7ogU7rph+(a!K*eAVk5jH6FjCq!Lh=rQ^4-{e}lsENTFKZ|THJ@ClEAwFNrQ z3UhW-$l3_XkC|nKjRb#-N8onkt`tXCctV=uF2s|ji7sa_I)EduPMXi##q}(GhakPP zS&D;LtcZdyP7pog383+$e(mmI91Kd$@JqfNg66&G6tXd1jFvD1@~W~JK1pJ{5AE-{X4$@nY|`(x ze?&NrtvQT_5{Pg2fBZpJXq{}SM>2@;cG3cNEAa;0iP~l*ck_iG+QjcK_d|Jx-81xO zKBNEnpa1#qUF1;wzxId!@xSpC`-3gl*q;!;@ z@IUsh3w9LiuK)UgU6rJ-DFJ)^`kFnxx19hYo*=Q!b$p|G#X8H^x!X;ZG@{34TW^1_B-iF?Jnb1evmqsz-= zmh|!d!4j4~6Tf9tUL%=p@qql6Q@MRk1W+}j(B(|NK#|1ceF|DZPo^_z!oX`UpJ zk#{RAi5%LAB1$xS2Q)$zaf7;DE@Tx_QkMt!<>+==yFvgi zKuhPU-51bTAv+%OyFg*3L76FA-epW?A#_tr-ov4UQeh;67PdDl^%!>DCdj}y%Lt4R2r|C624in&^_+va2op}RWRXM)TJe1BaJOI@BADJ81-pz7kY+s>%SQDxvgli`g|{)h zE01pRU=w|vVp&4wif84O~M@Czzbn_wPw1MEWa_}BsBR?;0MW~-XXgtcj= z{I-L=W{VTzg|*j}lQ&w9iefr8pI+O@C3C;%fzmU4njW@iXZ(^%(Oqf)Df7I24z^wO zKqNVJUOqadsO@p~#?Z+r0WQjkCSQ@$LU^O+irLeF>+L{PPM3J)LU0y*A3|7&5$Tl| zFD!!QxdEgJO##ZU0MR=>`El5a=Y3P@9Guv6iHlLJ!ek%aKv&o_T6R1@L6pWti?kWY8o#_>! z9o(yes=oC~$gvZ#K;T^u8GV$DhfS<|b2d~JOVS@fH$8xx9KRL&{xn^{07;)hfl}hK z5VfUfrAvBC9?&6pC&XFoIlTF~WXrvOu$=90rCFgqAP$$?3sUT2~ZcKTlu->TGrbY^bZ`un-o#*n7RJJAGmMOhqS zokhgy>3whS;OP0u;mPUa=Ldg1yC)Z$RXn%6aIckC@PshFG{E(_XrwGr=NKUD;535? zuVQu8Z3}BVg+s*>-^5pVVHy2Ha^J`T&nb+PEUPEO`764X3oK7QJt0e z<3$Q#|GFjvk=%no7UGn+MIE0|zmC}aNDMaS(;p_E{4&4LnVG>iT4Psl+hcR<)pdS4 zB<=bacX&cA`8dFJ3Q-jYZ)gQmghAv(!tOG+?)<`QR()I7%)QNrm;eXX)%A8m(T88v zRbU9}K;$#JUXtY|POFun-9C9j(5bei1FhD?1&Dz6vH-6F0(W>ePAZ|%6p zwAniH8P6?x!}SZixF=}xN2ZiN{^1Wl|G`Yye6F=@n|vGGm&Uvc5cBy&Cj{h*XYbzQYDIw^*LMl9_{;BN47^{W&g_ z?(WCG=p%l&OQ+ zWeuCzo6og)Q@{KqTakUTy{e^KGqZZW)27kwtpb(76F5LK_)XJ=ZpZKZyVu1y9=zeu zGfW)25&5^$C($FxC0PNIbLhr7x|(vnQwTH$AMi+b7(!jbWhpKu%0tM(g=aLsPKLWs znd4baUe+#`W7Z`n)48*mi!G<;?v0GaaW+jKpx2np;~-Iw$hr>~EnI|U8fIYT(`{4t zq{L<6T90_E6Y|v_k0wy!4t*#dcw0e4nL;^R}fKR=}PeF{y)pNZF)vDedc zzM6%jM$W+zfuZW~DPr{lONaZ81iU#~H;J z-Yhqncn6ts;bt6k#ccq#2Dp>H)DJV6qI7$MCs6os45JtNVal4%&)~`io7y2k6_1R2{ z?o$qxc1!3~?`Q}PcTlbROAXztPY;k$N;QGFBd=IX$(iRvg1M%}M1okZga!MOwEEZq zr1x&C)z4R3Q>*Xr^-K2-0pMuWXc?i{gTVmS43BscvWh&TzAYfkA##$v`ZBd$zT zPSswQ^$OM4!c1K(t@ys_R$nQ%8zm|PGVBZFLRM%WoQf@q0JjG z+c??a_&I8vT&|KTb)TU32`q!?A=kEnWAsgu+>kLC-p%k@0F|uxc+w`fGqsGJcB}(# zt=4i4fAZV$Ame`!Xy`@CjK6+gmaEbRoxw4e=)dJIRqGzCD5o{0=K#HQgOuR|nC;GJ zew{AiV@7vIP%zE}5Z?lkClF;jr%9qUpC$LbT7aGmD9(+y`Kpnilp<6wU`ACMo`K7J zeg=pAG3hku>^oG<&G73NzEpF2%OTWm)#dUsf1via^N2Dv!aQ3-u#g2wYaOb&yGZD7 zycp^w2Ev0g^d)Lq)%qvDb)O1YYw1xd>aKZvc_g;ebNGB-A#!>=zDj3!cSL4);0-$$ z$W*$jL77F~D1vv;nsp@2&^Z2#4ZWbId@gfny!)~$Ypz&n*O9K2PD(giy=|muQzK}` zUT#2=bspl?XiE0ZZ$}HZp7MIr_!5lMOi{$>s=x8hHjtEIen@m-h0%)geflD2AhO_X z)S`$QPR!qp4lmIF+l`6`z>Z@J_U>ObH2GP6SU7Tmbp6S55G?#(+`1bm>$$(Jgts!< zf9<$FPjqK3yOS7FV zO*>jC9VsWcQo?@kS+a=9SR#ZkSh0#^6z>i;i15!Ke@`RrWBulD;6=d>8?>ttx`Na{ z1yjf64f>&<&!y*y_KXO8l-Y+;C(XU1mvpe4leZYoEED$6fae56)(dW_R{j2eO8W@5 z#RTdTGBKGT`WszC5CiDqZxF0^*|gF&IY0@VU!ZAcX^CglC7Z0%ltGZQ1>RL?uGbn` z4yWF1ai30RGI0~tehAK-IkHH->=c2v5%S3EH=@gA0hHv0V1n201^yp-9`eWqJNe}I zgb<&jJ%fM!e#lqblyF5?YBmozrlei$sun^PyTL7*SuCbAJc&}qFIG>o`w)xQhcAqC z5!;iS$>Q!yYS<(~sd1XVS>6ae=8Z24HV@JEUy>PeHl*_(;H_j^!@X?wffHFpc&!2{ z&fbm?Z&R2xsfrNN5;tu2!}r7FQDPLM%M~^ihZB05h^LFa=x~9soi`~c9YMaNc|rpY z5y@=)fwuU;gM)wmXXolg(LjrKc>2~ZE$S}E9>PpK_;%p@=~CS@CPiDlT^ z`MZAH6GCOJySrh!i|cHBB`=CW2~7usir7eEGo=lE)U-&B06?r ziU-(yazHtcC$vpQ^(b$Zb0Cxj>?9WR2V8G{GkOE+(O9=ITl9MlnQD{Wt6gX{v8TX8 zl+O?Fl5&*h{>kr(i~yDXS~^n(>aV#!PCC-P;+8&)AjZrV7kJ2sa1S7XOYIV{MP_)& zCbEww^s2*x7$j2u5f)ls>Rt;MfRhI7@GCsAx8_Ah&3)JC3%0N1VWECH)+NoAT3t-UC7F%Kh1`{9#-D za!nhJG|k{Gf1iX>#qm?&ca~C3ME1BJ&kA~PEc*z1IzrvfAyTCb8 z+;AwH@&q)L%LxzX1f$U-ydtnoR>nqgH5ch}>%2QP2u@WTTR&fSqsO_!k3;T)KZnmf zPQG-ij{YOatVzs%mcFhk`SAQd9^pV`Oo>(Gv;(d|@UIvrW{memI+ocAG`hlxv>YQ6 zG%kANVk1liG3e0-QeEAjz$tH}WuXsQxY0t~5T8$aJO#%?coFV*G`W#*cWia+TDw{z zZ7m9c1MwWEsRR_jKj4u5yWfFx_~rLfY&LE>lQp8FYY~rM2m}V}<~J;Rkf=Mq#?vjo zej~lqVuW$HJEmS?;im)PhX(+~4;&3WdA`>zk1~293U^hBKkD{B=8=VeQ5BR>Q`kAAhFj4y=>(X>bA-9e*EocoxGNmdw z5p4k%y#^AL*PiM*s;X4_4f!y~5hCf&KI|w-WA)rZs@VW8ad-%VL@3q`>ZSZ4(pX6l zifP3!Q&RZw!3w*ExhA6ZvAga?M?_m9A%ooUAh<(xn@rQ?)ir+3sS_w6Ha>`uq3fY$ zN#_KLx-;>k%{eTN+^yWTY$Gri(pQ96Km1xz-sN7xcnkcLR1C&=m_y-;5< zlqf{&`F5An_-#BION46Zo%n(|fkuZIH;s*n{2E#TSI+@=h^fMz7pX^}tr-v;T%MC$ z`yCGaImL{tyxHJShC-CpKT0lRu!a|`Kn`z=T(Q9BFpcw+YdAeoS*E?G_kV_w>`%ab z=@0~v5XC%IL5oLZBH0~AQwJ$nrJ4p1`g7ssSusT!Z^qDF5bVU@*iM8lM=;7nv-9PE z(u%-e(KRY`<67Z?aUswINHc3@0a`~s6AX+_Akfhuy}_i&G!9Y7gg^S^9!%mZ+nlEm zkeRqWk$GMYTGR8+#U7UQ6Z(!-2w&J?ZtuvQb*;Ik^838$Hs|S@O-^nBbmXu~m(Ce_U8V!kEltEU08JF1 zX-p&8AlOwAm|P9_ ztt{UK8=jI*8HA%k0H{T8DRgo%jo{Eqk;iE~rtn5Mr2E3`N!Dc;C{w5lbg=d1%pM|E z6&dJ527*Zh-cbh-B%s9OQ?xHcoyUOSOrzXMx0}_$?BbfChYAkl zwE)2cRT}tp#nk};3dYb$fS2L`z|jMCjw_yQ1-xfM+@O3Jddv3zW?75hcsL1~RC0`; z?#Or(nzM*by<#JATvd&$M-77FST>W>9-*9*_ucHRQ*@^C@F@*HyruZpWFZZ;OYXu3&K9K`auc&pXX*&=F?mA zDsVKh>b7&0HpzE_Se~6N(i0rVIn(DbqFM1<;L67uJ4aiSx!l~9(j;5WKCWS*+(UkeDq#2LhLPS>U}|gFwqKb6z3h_Ccp96R2EHIA$&B z^r%5?%HVB2-D9)Od^4B0q(>B&TKT86L9!ZN^5BR99;*5Y?p66{`7G6SH7B;r7J6)E z?EgP|Z@U)9k)@0N9$!TsnmtBp2>}w4jb)7xAen6hG#_?*cJGHSs6wh1P;^ycq-p!g z&cAbI=Y7{lWJF|UQ6PcZlKPqHMwOWnD^{#n-)n`KQpt)F*r*gDzbE>91%5$ z34rRh7yGZy=phUbw5-Me)}dK&0)b%Gvp~uJ8uveC2T^V|#TMG5S(QNy?zrROJzah0 zEn;cSapVtbHZ*bsC7@^>&9tts+ATt(TIkfd4Ba*S;9=jOX znc;36dyyQQuX2QI7wt>%MQSOaA*?24Cq+cUq;rC9J(s%qvb7X zN6tUGxc7LbAeR3%?th3mm0%x9=9haB*zHvX|7cGGF%qoJ+iXVIXzNQ^O%VJ3uPaM^ z3~=p2f4ehmmiBn~F~vOAKdzL|UcEN)MReV`6<;TyW5)Tk%Ben*bdS*!1a$=J#}w-z zkw2DHkC9o*=drL^zW!d~91t|f@d%3O&pO-tGU6CpRB;f{)D;y1&F9?9;FbuUp z>G41x0fVLdh$e3q-sS6;6gQSC9-D8`gwdaYpUbPsgPWnLkIb!52?F1DFfGDAYh#G+ z7iNpE%f%4M1FqfV*u`3?pEmPDf8!%?#Kpm&cOZ2TJ5Yc08bPi2-D|UI9N$4UbF~CLI%v(O-(Q}RC66$s6H8jqS0r9JB3CLV z6VyjAM1KZ`VCXIpjSNN}l;quO;t>_RaRt%D%{b$Wm*kZfP$sSlmurS&f{8$J)!eDm zUoU>N?-&J=8-~jOMWFu1G0pJ&_aInbNwn(b4It6_2UC-djjIu_e|<&Tjo`hx6Yela zlQ$#FU%n*8CWkxIl#)~gAAfe5CwGsBV>TJl0*o~i0TOqahHDMGqzQHM0LlYb-ZyLqIFE)Q^(&;CmFbwvTF~P-i=Cokm8A|0{}roTCJYhgg&iWp}qrR%{8A z@`4z^9kgXbqC2vzmFg@j0=YVt7lA2^+^)}g^Rjhn+_)wm0uMiek>Y}N0_z_)LXy3D zZSsxix=BY2>4|PD>JX6tjs6U#LR0ob_UVnF26IvmiNI_Y`S$L6$a^A4j?h(6RQdQu zkR-E?ji&JS`ygtRn)-K~ArB$_f%0YJ6Ip7HV^LoD`XzC?k1J- z#ozz__s9Qr`Z{f%jm|Qph411QA%u(Fvu->7F@8QN?BRR)aA5)aH^m_q7S8a^)U7-A zyBQNxw{FGbu#NL+@qHm<+6SiE3HJ=1NV@kfRly$@HO=`;K{>n5QF|^EQ z-pCrwL0}_nOSw&Hw^d`G9|41d8(a;27E;uoJA^h))I+ImKkRqX|N9u;7Q zv{s7#+l9O}koKl2TI6vZX-5`y36$JkXafYK!)JqHRrG;GO!FwYu;9a5k|h`!Zk*HZ zlQyEYG_weK)3*>P80TKy#Wu=bQMuMf#t)W!(CJ$rN+|^bo5laZW|3ku=?nV~N^84= zW%47`>KoKk^506@}Vu%woR-OBw_AdTJ+HZQk{ zOf8N2=_Q+q>gsOeO_e)r`X2Fw=mu`qWuj-2bm`-LXZ#mpprDP=vkxEIr667}$d|}R zV3v}Mm5LH`Pr%Vm>*Na($dQT4*V(ZH2m1obGi6Xn9$_%BBk-M;aGo!W2i+hLw&=I+ zT_}&Z0ZX#U+_326j;7f1ldCYDoL;>X1N;Tn?rtoajG(QMXY?%kvsR348u5?}BS?gl z8o#wWczAdE>FYka#mSxW_NP~hN25vKywD?R9F6AFW|N!!?ysoX|FL6TvjiifX|DW4 zY0j>$SDcSvnAg{?CDh0R@Ft@nyi;Q{EX5{4`67tF-$Dyhxjf=TJ3W$158g>*bL*}O zZ5FK+aR=X-9oyRoOTsnSMN_iQL5r?w7}wInEj2y5gTYyuX89a0oz7caFT+lY^kSBm z`H`ct^D@}#N$=!t=PiovXvxs6hbxZDF+Ql5BH+QZ*K3hvq+&5qt%++ur?-RoiMSE# zD@-BByV)X1jcx0oUBePAN#X#ibn{a-yzchS8Wp7vX`+P%j>e%ICGXWU$}M;`O>KE{&M;)|*api)u5E+S}8YFKM&=n=bqs+S*jRSd>?!<3NRT5A0pew|`k?Eq~S1n=qB^mD1guKL~xK>-(#GF03X)ONeWHzC5NGBcCdB zX4riMR)aA4)SEm9ix^?1~Eqht(CFF8*l7z8uP<5(B zM4jeT`(j{qpRwXpi)WooAG;GnaeO5)_x)?sZ}=?G+%SO3C62$cz!SRl6b4k6gPIssjIaG&^i(PVTS zg7dPU{&cb3>FAsIMf>XGCJr>_MGrifsJvc;yFestWC|a9nRJU)hZ|tnxzFlPFu+Rx=U3p;wvTV^f z8vT#-?)XM{uGRgY;jfN`X0HU!xy2jKjynPOpNk7F!$)-3sbwQM=wQ4+Z{)H=BEQ}r z`p0zhH)G^eWq-{pz7eih>SFDW;@HO(y|2oHU&l1kHv-T2TlV`G9ZPhq6f0ji%5)<_ zK2?U&xZoS%C%Y$1O~Z|rxHUe=^W3E`d1Q9s9MT_fD|)XpIQe=gx5&EkG&nmv>>lv$ zS>6SBjARJ8D2f`B+-9R!^ZDD?s@l{ps*YFHz8F~6XY8J@Ma&oO1Rqq*af$HqsWPdH z)_o(qs?>dsdarPuQn1uQAn{tc3NA$J9t0j)$4=5W0w4KX_WKvrM^v8_E72kPT#czl zgnX)8rE$SG!cM@`{6_0=s&mbU*Y!zpQ)`HH&UR<0ekAFs2dxM`9Qbjd3AtL6Uf?Y? zK&Tt?X{3VZ>jp`ujq2r-JA5#k7UJr+-gN1wdULiOAY=0VEMDMkbZ~7Yjj6-7k{!wqg{O8@d z>Dhbj-od>S#3q03?49;|!`?yfXz$nAY35)2Y3<>|M|amAK6+FvcLoRju3UMgRk!Hi zP-57^lGfixM?(-*M=O4vm23`2#D}dB3Y%*=n-NsyBg2z&bOVdRUjU|Ae>kmjK0yxdBz&W)c!%aF2R zc;BU1N;3SNT~f<0hh&#ODdWTi@HfMw8kSV2bT+&iIMwIstZ%?ebS6JnJ@aDBe5%~) z;+5YB!`eXZ*HNzp4K9d^oLQ+d$6tHl<(pwWHNe%eotoDI%gJISpNnQxgOV@YW_mPM zK2=ULdet|=Wwtu4_71}I$dw<#W@7vHu!Z&#(!&A;kRA4_Y8||>y1LtCr$3sls6=l^ zoztooC?-b61n=)g-YL2UwoC5C9xT^kiawh8_U_uFxreza8X;n|8A^-RHNb0iB}Nd1 zt*K+Ob?*f(`}vxnb!hp*X{Rqh%csg}FIe`C@Y>bEvtDnA6d)v+f#rom-K^H_$M2WC z@j8o@n}Dq2JWcNg?(>=Icujcu!hWX5K+UJhg2q_-jj*9jbEuEtKjsB%qgv^thigE4 zM@PMLYe0l{W$u!rf#Dp;vwc$Jp|r~6zTXcdfn;c?TWaPp}#w^3`p5w2D>baJ(-O!hx# z{@HoI2WDl~rv+JYoGoHkDqCqY(7y$)`8RY7JV7*}Omq!aVdE!tfsl*8s?%LB{_5v` zci72I`|#Oys*u&KsN<#8w?2DjT1CkhZaO^@DW57k9l7Wm;ip!?wau<)Zv)fIdFs+% z*8DmqXQ7Bjq^;7rC)O;j6dehnThrivkn)!P6Gqe8EC)S|bJ zZbk{p*HXu)@^=EC$~Quc#?K&WHAhHv<~~<8Gy)}`DjOQHhJS-^t6C&_@n<$&+Ai|q z&z5TYQeXVt;!z)ICTL8Fo@;{u{KenZbXW=>U8gl$Lk)Gjyymsfo}Jg=eBjuRD433+B(BQ4;cm?P*+s4^Xue670By2Q01k-f2zJrS;*(0 zQ0hjN5uz{rXSzZs5l%i;?lWr5H^O`BwVs>-CAuTq%UVxuX;90|j+?!Dq#o!x-c$c( zU_c{u#m|5V)gvc5b)Tzkdm&;zRd#gY!f%8pmA?Fs)1+*<`zx}{p1u3;PQMon!8-0z z`(j`&X=kR-MYE~J$rqk7eGy(hRhDwmx^IM|)Mh+Yl$@kl$F&tRoiqEYG|#T9n(5&; z_fgF>^G#mO6rRVXydgdS-fldgiOI#HJ{=Hedd+i~k+biqaD|?IUzu@sq<@dFf?QJ}mt2}tIwX(RgvV~_4D$iE_vb(s3C*M?_ zY;J7t>})NrbIkkIK{vNnwpRXvXAi4`;+cOrJ69cfbsf-b;?ueLhm~o!m$p_nclIy@ zUYMV)PV6rLJiIYGGgqD8U)fsOB_`))9#nzwcQA~+^kC-OMqschtIvt_Z)U%(0`z=! zeR&VK*j?RPA+ly4-v6cwlf1RLwei#Hvb=SF?$N_4R6AR%FJ53ag8guQ{(coCdqZHJ zy+1qis0xt1!VT2*Kb)I=P=)B_>h|{P`iqSpG1vUugSl_2;D8|4R-eh59zA+AH`@pf zwo72Xe}8`d!Gjud`ElhJtm*}q^=NkHn{R5UW@%&n`6}O-d-%jkG6NVmR^#kW+RG{CtE8oR{qLS^9L{1Hn_C=(eFEpFZLFlO58M1qLf7)??&{hyrxpsD z`R3cow|M@8)BH?zXguCoeW`%Wt9~QFN~#zN84uk>h-2bHg~sOl5t1w7&aN$Z~CCS%@+6!xp_k_Kr7lH0m2a ztuEydd13X%3eN1>iw)h2x}_}3JBsZ4If-!)C(+rN`*jO>v9+nX!)?e&Uy3fyi zTQ^a7QK9{|ZZ#DD3QVHfI-)^KJN`UBw%kZl&LGd0b&_v#eiFUqbTyxha!Q0r&h?C_)_r>aS8NH(N z30KfZ`8t1C-dbJ8qq)jnsf=ABZ^d&clKJZOh1J<_)^`@4t(n}-bQpW*<>CuIugC^} z{BqZac$gnMeFdsDGzsoiqRw;k^@Zd-Rpk3B5QlGp(|mYQqt@1ZnNTPg=>lDtwt^z_59~YUg18Bc(|$i>RK$$sFuWxKF?wF=DpR?)pjqQ!yEmfRn=JTVv?wV4LV?5w&v$K^oQJh1T z<_vM;+4csQa4E5&H)N;7UkS@^9Hdk$D-`U5sHA8dp=40AP`GnI)|Mmf6wmX`-6&rO z3~IJ=oTImVNh61fVXCN>7%V%h`%uzXAPX%R!m1s&Mk$fWYI*Hu3Xvdc08q6JDLvH!xSBOS}T(EivvY z+pX^q5+SSEx%`|!b_+Z4SHKV|+oKd&`BZ!-GY|6DHy4+FgqWbPnVqRnXnCM3#*I8$ z*><$f&fd?@nY|Hq_kJz~?1d7w7$isj=Hf4F8;i?J8!y4Bx3@(qLL4-_ri#3-)$S{`Nr1EMRj;2E=rl}#}_8w^Bvq=TioH7!qgH!ntZnb ziKEIH*g;N1n|%6u8D!J@^nl%WTD;6x^p+LLCIV@e-<-rtj4U zhrcsp?WtN(^VE@78JLdNXkir^;PZ0c%DN-Z{A@+c0xH34G=AmK+ABWAY{gTDLDV@t zQ$2-z6b)XX8b0@ttBO6I(0lF!Kw?%0kT;yA)UY!hA`;vULnxQ5vP1noW=XS^E!uqs zZ#M^+s~9lKM`!X$w^qQwUcxu%YlEen6GeE(R)<$|vMgT-{;rB#4e#g)ZyuvuBWB9Q z0!N9Bo?KMX)P^&hTx_OhwJ$e*S_!Iq^;-$0I4WQsR8b*sl-t}eM6}I0Ba7oTGY=ZR zFHrzTaDLK~VBPFY#RA$&9HRLWwtrZhRU1j@BnJSG5gaRDc$5MRPp*3fNG(n ziVx5fO(zvNXDcgKRkS=am37+-<%wx{!_G^?(~?vGL{2K(yDwiZqQjeEwn6%`{izZ6zdk$dGpCEZu__wprO&xlcyCFS&|a-!CsmD54~YPnmLP*VPC>Dj7; zl=4>tULNH;l)st#xN;epzn?q09$mCR{lMfHTz5J1te-&l<57MB@|R1$*G21$_pcJy ztGFR6p(cC7cMFHNx^4?rBOoQTUGY|>u15?}U7ZY(qqt&JCeFd2Ayjnu~spx6s01GZj1TCq3jj8~SNUx3^*h{RE+}M$61><)f9YXB#3!;Z4br z5Acwapoo(>D|8>f;k!6r)n((?O3c>4VtFYL==sCH8h@rLghZFyx4$ZG7fZe4Q{Klu zJnu2FrRe4nBMJojykPD=T?Cpzo?f$Q*`c8Oj;R4uno}XsZ-2M&m#Y)xP9-dLlmj8MvciqK+wVQX)&dEQ54*X z5i)nH_}A|N)mt6l59Q1N53NIwrPNJ3%eMsexErl=NBYIHDy2Idpx5ZI)ou-2$hf>+ ztR5Dx(3k$i5+BcbliGf#z@@a(wtj$H+R!+r-^XQb)}xePb#Xa6N`obx3B4Y)lPRuH zJHcPm#m?&vCM3@I?ys$*GeC!1+i<(>;B_J8dFY0EyTF)-xBv(b4*?kd?#gXIb#!pr z8oqYqZ}M;4f{P1+-ocg z6v`{%WCEg(SJH7og6H;~qC=Q_Cr9tFB;;~+k6TA*=*oKWXp1vC77W&caoX=OxgO&R z^8KO!uI{vlJAd~9K(YaMiWaC>UT*!`L)%$g2Vfn3dqBX=@J16Kcd|H=C9+S=oL`%kb~1tDGHC@Pi|w?M<(KGfcq8}hyGe4y+9oYWVB;B49 zGAKjIdJCLx0w7WXOXTwoYnKzmI*4%ROoa2O|@Jhwn~7w&lQ* zx|WUnGj30VsF@MM4&W5WXB3GPFavoa%vKqMV+&Yqcixf#3sVQLb+%H6j?ad8@7EHq z(Mrs?xJ7q>#F9+D_uZ%6Q9hDg{=T?7+eq)44P5F-$Kb2Gl(f%H{!_s z7U54i;xUppuMUIqMggIiRGpwap`1uqm%b&)9uAL+ogHbJIS_@7$O&r^Iu%X|91hM7 z4myLuo#Of8+V)D(gY4{|cLy9Y(yeT*kkq=?I|c{-mvbSpG+F)9>(0R&swR*!=z-jS zhq4MbLIEkfFD^_RmutW*s28>g##=^r5Ehbvy?cV+btI}~vU?vC;##Dhan>3V8Xua| ze&?|J7K6(!r{YgnVQu9P4KmP!pdzZbfQe)!1bU@ zb^0TA`3`TdL@#UVtk^g<{a4DU2i^{9VFpQj0-~il$;(ehANZ|ySuh?_3Z@O%K*h_Q zKiu-#o$;5q*ro!`YhrkvbUhp0Qu9qVmZDo38QBJIr&4CBKT!^+d#JmjKL>Ja+7_8$ zYLcTQ6c*SxXbN>7;NsBPuP}YY8@puV0U%N38Ytzkrx1ZWy6pzA$lbcQ=lTeUyixEt zVH0>ua1ZoLM*D$LM!TsNV+WjePv{|n3)`duqA4|*Utc1*FHNw zotm`ol5v-MurgrAG!b*=)*yQyj}#7k;60o#Tx&ix$#0XnZERHmiHMVU=w_6Kk)a6p zv7z!QP&VwJr6=J7Owa?~e0*^pTw(>y=cGiAXhO{sY@8Bz4U8t+8@dhx^EZ}0f-YKv zTcYxdEJIC|{h(7{U*DHDoikk0WD*h?hAfdty zQWIFIfK?9)-;D`t1Wp7DeU5F%cL`or&@3I(a{dx6e_f)+?AYnZD{UHoaE;Z&b4k?b zkWF~ev&Fk;Z#fKN$r@NGJOcLkK=EMW?W#)aC)!t%V9BWR3Y-dOVb6F}J+q33z61y4 zxMV)UHERTBJgidrnB<}WlPCypg5pt-t*C$;MQ|ch@CbjLb`)J zG@9(aI_mAWjw1EErYse-L$#Mxsk3xTyDR@i2PRL;b)^HSx-^L4k@>aN@3zR2z8#l6nSJ-0}w^|QO(lhd=|G>d2Xaisc? z&fLYbp}rV+Dv|fHyR-LVWryy{JM>-ZFHGc-pEykTRqMF2SCI{laESic>nHE8tpCK{ z>-;6YDUOXjK}GCJgvQw_kp;#LVyYWS4yf%y)o)0jI?~247#+j*8V1Alh)3_l1w)f{eTBEgw@37D_ZEO2#9_d_r6m_(R$>tzq`-T@6K=0P?mqD$Wyc@i z>pm$bfv=5LAxvU{6l<5Eu}IP&a%fQly~iQg_&SC59XedA5zf)jJ z1slsV4pzg0I3V5>kEVlCz`H35^w;ox?DbnGuR1a)L&?Q0VOn1c+mv7J$TA6FZ*gsH zgZ+du)w;(CBAia>I3;|RIj;_v_Be*yC=Z=sM5 z$w$S!StzywBY?M321pe<<@%{G}h`r@BC^of_g*s;j zKH{XL32^iQzJnTgdPF^&#nbodT$P01fqlQzn&;}+MNsfNzmfl{IU~zG z;Q4>Ipn`6nbxK-Y!XbNx!U^yxDoIlbJNOzK`SmSb@8f%c{e;8?gHJ`7=nTSFvBR{N z5F?bZ{79vR0hOFc%%uK7*(W4N zIQ)Pf(Qcdk{B;+hcXzZ4@8_Cg(B$8u|K~5aPGCjK6BWobbu96x97Od2*F)=u@Mj!^ z--*d&;}|4z(XuSR^R{(-N~5;JTb!vBwD33M^u-zC=*U0=N`R|Gk2HN^huVRtlpVfr z=8Om!;2!o}hko7Hy(7E&*{~2Y2$(npLP2(ppjaY}KsaGm1zk`bp%;7s#Jk>7XekV6Qn?% zF#%G6gfEr}fr$5umz1nQyt(=+(y)~otu7;<3LM~_=`mywy?tt;klDhHA#C;Cy>44P zlM?7^X)wSt#L0=P8zYGZQ%RIcvaO);90s{V@LX|3E;`-*A%csmwD%65S8`#6&sSqEf}G*piWYRl8|GA)P}FUgBgk{kTK|1hEUM)F-dR z&OqEk$mD%Iz}sik0v|AAa!^*v{gv)h`sjtgW7~B*y z@ILr#h?iZ{WEdH9%|>%s@5G>0e$ch);FysPC|@0-cGt8zjEuP+M008I@S3L6!7<}} zG9x;;qK8t7&?%ZO;ihD8>UW)?xC}oO6>X!@2Brlt4}K^D(!uEr6jc;g`KWymW6* zuNfQCn0k}2JQ9(mvU=+4JmR*z@p5sM+;;9!&CUgw&-zE#3^0nG1&aGs`Uy~Uj^UoW zW;j-W4}~Nazxf_^uY3Pib?+#UgPN7^-OI%#L0K#)6;OP_P;fCdp*kxfajHLl*u!sW z8USK`HU{FU7H&S8zAuV?Mtj?f>u3V{-(aW9%X{1C^ZUcfHiww2*?N?Hv<^FnL7!jG zw(qWQFFs${+gkj&vIyI9L*TXGFJOY5v)5k;2sKC`2&bo=_Vu730b+A=Ww{9qOD(-- zD5Pt*0a0@T#b9q8?H#;s^#|7s%J$~U((2+GJK1juh0fL;$AG`*%(tq1GZ$M7MpM_w z#{x9Y$L42i`1-Z6^Dw=#^ZD5tNqlm4yx-{~CG48Saex86(Vrm?4oM|K(ls*KK)FWU zAP2@(g!#Ex#W%V*ZoTRr?EUksH|%^6+Af~9JE%y*^~5mL9!)=pxG}7D6DI*ebnIPS z+WX7y23kxLVRNx{Z4i1g$@QE(Pi?^LZ0#3m0*gnCmi7*Y$P0!As!b@SX8zC2-ADiT z&$pm-7uToa=9x`|t^(R?R6s|7y#-|7w(cG--hF}~= z5YOu3_R{JqjA<6IAEB@nepncC_vb#WdLW3SXxrRFS{ML}cl2VwUP%!oyJP@1G-UJYsoU2xCQ{$H}(vMz+BN&Jfff}IFy+E z$!w65-ud(ga;O=D7aCr9xw-Spp6Z#B84g^a319?-ve-lN3G|@=pG61*u0C+q>z9%d zi+#SexWp@D03UD7ssK1d$}bXc+em(AjD=OXQ+HGX+$fwoKWywmbW&U9#a$IR2M1lG z8Ke65Ad(BnlUgCHbOhZjTEXzq1aS5FDosYYL@a{Xop}QUdQfM>Jr6eb2T~O?RU|eH zOI1Xc=rJP6FHZ~a%BunS+Kb@OK#b+-cTOnUr2)= zdEesM63hP0K8pkMoW=lVdd2&q zvmCS@p)eRx0R(iOvtH>OAwD5K6zHC?#ipd>A9w!;5K(h&pRv!TtP$0qR3gLbE{jy= zB+9^dF>p+yh9>xq3MaK$=JXIQ!WTXih~O+_J=cuBDPSh#l&J*JphTs@cwkG+{j zr><8$TWRqUNl=mq)n6zUkB~9W#BlujriIE?v@~oTKkXk&k04axO!v?3pf30A)3ei8 zee{+@DO4ZH8Z3+mP%a%&8C?jlyg~~9**@R8*Z#+#d)m3T`NQVjZCgOuAZ(Gv0VgN{ z;%*~L{k((xal9&~lB|FE8Efv4<8^Sv(kuMok!tHss#}YJccRGqggKl9D z=Nr+}{@KA0=;nvygTR|i4+wk!P#FpCn5{$OrjpvUQ4u4Q=&;vC>Kpe%R-zknAb7KF zx%ZW>QP!<6e}%dp{71kpP~7deE8m}fi>sB(M;0jAqd-CJ(S)=dr20Bh)V;R3vBlSL z9nk zxFwdI#3!^NTHWB`wRHIKLGuLbxG|DB92outJ#dhmPZ$JC_ih)P{oZM(KV+LAB=iw= zr)T>|u%6JCL$(p;$!f_Aa(|ABiQySbx}@)@t_mgIL#Qp$I3DFI z4%5pHtj%@+Nc!p#GV~u7-xTvTPdeu!K-l~<5GZ-${yzYKj5J1Wh93Vw{z`E=l~q}| zT(;#zMHUn+_AB$fz;u%jEi+Zqypy{7MXzyycH)nDu6XMFsDX(WOO((jQcI~L%LGMH zmi_zJXdHHQ*6u8za#uHP!qddV(lEYN?b<8gE0`2TD9PB$=&9lq%NEQ8Z(+lq>0$!H zp@a6U6RZ_RxyyOMygvcE4doK7(q>>!ycRP6JjBRw3B@$i8 zk<5lSDw1L-N>k=~q4V>JBqg)Dnk<_G+uA{P%tXu!ny?n@w47||1SErGBq}cbUtY#k zrs7g~vg>6?q*1b>a>0&xveFE4aRo@Gvq~f2x?`b2Sdo|tU7D#UwD`9G!Cuk$=fuJU zM@0R$e3%W(##4RtPUf58LoQl@0PVp8q0>&V^!U8j2V*6r_`gDObApP?tu>xTWNos# z4CHvN0SH^`(`2nhyt?pewz_O|TWfn?R~g8V#B>JAfX9o`rlR!SM420BS8o+mekBD@H698fHgVlMPVv+gTSbOf=opD%Hzd3qvQq>+rY5z0#aM>891QeJX=%%CHq}Tz~STyu7L=+ zK{iEzPZ`u7g(lXaM=huj2a3w=2AferOg9%hVC3OcG&lY5&w7gbXygyh;FiDZ_j)E| zdr6ny6)0b&2&W$l?V_ljg@ZU?<}tjLuTH4?EBTwDnef+%SA#+8w7ZQlx(A(gXhjp* z_HVQ66bJbK{$I3x?IR(fM+%Vl>7qJ0=$_(Ig z`xo2Wi<_%KPm$9BchEBaSD)_SK>$71?frK#fg?@0f z1;Zda0zAhjU^pUlWohyzr3;1D#fE`d^}#Y=e?8v1!ql60sj1-l1(K^xY!aClYW>bz zuS?GlzJNvP(L=tu2Bq-i;N8pZoVr8|bNi`VSbbmkzL-)&Xe%L)!L2(*yC-^t(7b%* z-;e{mK@1&6f^>C~0|2a`^51yGyBes97HSA|`ZLh2S)9VjXXmpGor50063BWK~Md;mi!J=Q%v2Tu~orX z&7g!XcNd;f$TT~?(AaWta8nOft;#L$aFG5Y9qsm43VXgIEhcchNW@?@tpW=2-Jp3E zu%Ge1?v--Uv;LshUsy0h9o{_p6&Pyd{@_p2X$6sf?)k221-MCw4w!s#s+71X1a2>G zy1N7DphO{k1EP4ga)n!-0)R8^|3&v96;im4rSAs`$NMpu{()==G?2u>gRpP&78pXV zzyV6=valOy9Y)JG%2;{J9)xt9y6QT7-6vsUX94dS8AR}MU<4f$3NRA4^94@~21ohH zS(NK;aP&#(y36mVo&dnU3QJfLe5M+EvAw+}yTApw8-R)x-VosF$z6GiM(4H-ARQL< zVs!`f%OQ~gXE?BPQi8B=4omKgu08%?1$sA~^Cj#66o2M&BG9XJA-l*8P%#d%pA9-s zn8e{OX%pvl%R;iEZoaQab)KKazFg`--@!#PBy^6g92@sD zNi&<^3WDM1yrg_f&nrVR;Ax~8Fbv88x{x&KU(@=4h}nE290WsAVnXV9OHo96ZCSiCPqkE#L1a0&ZYIA*TZqN1Xywz7o~LV;SQ@3 z@LOD9Jurc*CDYxv=?+?;jcCsVQJHr@7ey-DXShVLtQISQbeQn?yaV3?{+E~71?d!U zT?IPd&PBhpE$lde6Vuo>!3c^s4}p@geZ(xp4SA3tK(8z)`7OR9VFJ|?$E|<#KwXF~ zfRcoW;XmO1CuVxNi2-loSgTvPk628ZPzLLopZQ;CW37G%=9_hCc9Eo&YVs9NoEvk6 z*i}2a_LNZufX5zp!JRWXioR1py4Y%CLSSo1hz^{3IuyY6qcc)|7}hGs5J&|N;1_8s zrAP)M$V3u_CZl@7a*Y_pcy%AS5{^TK@#rcU038FlkcaHnm{GjIMD{cZorIWYRPN)z zxNcCAajpl{u@zN5pwJoBM%sr3D=g-qCs+chlr&MyLh9ye58vj0$$u6j3qp6byd=*A zlrc(J<-%K;+amD>Qa6bvr*t_xIUB%4C=R-Pcx2eV4_AeSjp3;@gihP zudz$S5=f2)Lt2zU9a>ytr^1UE-Gj4v4p%1~^!ET{wERMiwIlJ2Dp zx3XmHnY0_lXHolYhFveht%j9E|M5_IH_=_nd-j$%#Rm1Cg~{lA3L;R8BTaAM0fDIzk;(pIEA7epuu)MMRfdTJreeKB`Nx3={zX7 z!hdRL4C{=T3DOq%pWB7!o?;ty8z7O%#UYbp35QG^>ZR2b#SV31GkeXq;zK9fYd`7| znCFIkI7@pA`WMy_v8!TghA~T3CK(gfx(S4T&|732HXvDm;w{F|6lkb(XJ}B9 zkMr1wi!PQ>J|o_v4lOdiLO`;C38HH-`~&fJ0dB>&e;VYgPfijdblGEb{sHd>9mKnT z(o6$2plv0=kr6P~9qjpBO?GHgUj*&2p=9|6!B`6`+v*Bc1?qGP37cpJn(tXMPuLqC zdp%gT#Y$opt+lq<;>D7V*O4br=;8=TYdDNZB2ca47@8vPqtLU<6M60~86>Ur#NEUl zLK1cN`0N;oqHIvW^BG5AXaJnIK%j~YcZ%|7_0h0Vw!1U|HXUixk;YKZhj4m-rcZdu zT*4;m1lUOE|A;gs$}aQR92C&-5n*94hLa}3KjXq6MqS0HmDl5GQcTD~8L5Wkr&+kz3 zk>99+h9kLFo@N%fDvF4ZCQd@UKj)JYyi>e|lX48M$rJZ89E))BlyS-nPX=+kq*Ojt zm}5a{4_*PkYL*lj9g{j1SMda_Ar%m3iQ-y?lWQOs>F75@;Ux@Yqu!oE&V3DEc0uc)_#RMTesv0gZ zZNbV~F%Vy?fduK^R3s%PFLK`}yu%D;r$hhoYtR8SGsKrs3S=4&5|oDcUAhJ<(dZ3B z40Y(j#B!6Y#BF?5Fxs*I4gp3j{OG+2OG6w>W3qtP95cv~OpGg+8}%%f`?CBDhMXvP zva^>Z8AwGSE8rb?h8IWzR`rC^c;aJvQHMu4)CkVo&J2lIzxB%tU2`r66rDKwXZn>{ zbHT}nw-KHmAO`Gl>u!2HC{VM}NQ~VRh-LK34VW;sO_=LaKvYTn<^^^Pn(gD?*YBa? zsvM1qJJ>)8&NZ7dqc?O~!K*a|eOrk9W+SC|YTL1@*jzL}N!W~9?80!|3XQ|15M}=o z*rW|esIHE>ZK$@HS{vX@t4aA*nc$VZr0i%CVai~dIOC)b!QO5njA5<-Po|TBOgQrQ zEdOb=jp_sk$^tVN^6MU*wp#N8iU5bC=%YS3I6{i{#v7!OaPo2)NzmycB7%K$@LEPn zSb?1yPD)XDdVS~wB06RO7 z5+4fz!8|-f&>XrYqC5DMQt}wLRzp{h3{$sVZCHpU-zk+%tv=Kfd?L6qfuerqR@_Ne zK=W1Ph{m#&H-@o+%>yFx>?AC~Qsgf;g+U!AaHq0mV2v|}a1x4kjZwg^#KM7Essy@p z=;3q)Yf6*RML3hjh=hFy_JfPo`hDU5@VTQ69(Mvt9(GIvBGmtIE_x?-Z71%+%8x8t zp%ZbV%R&^ybP7lk8PkA6G8z-i-;tQ691A>YzMGQ6L7LXQy#&CALC+k`Jmkb}^Xx)9 zsPq49s{x5cK_!CALBb5GH*)P&Yxoie-U2a0xE5GAJ>twelc$42O*DyJQ+*5APf&X0936tzp_;jH=G#tznJ5;G7>F`1ui^hAa|5W2~a#5 zzatNFozV?OD_^^6eXimRt*@g#cf#KkEE=JbiL$(cTG%DrFuBZ=fYWSc1sW)n)oda0 zk(#Yo)L73ULLZDY23Z9)VuEWl4eJsm`oyVdJN=Ugs2 z=~g<$Kw={ZB_yPVe6hfPk`vTmaZLjp4o8cl?%a@c{m_`@&I;BNgwcltqjS}^V7P_H zFf%LKLOj3Ak^K%yOpc02v&PmQMxdfmXOIw#_~c57oXav5gwb}$VJ4iV(%_pD8SSYD z2;Zm%kY4NtjxJ&rk123$lA2g6Z417E+XQ?rWh6(~;nKE<=C5aOBvWJOSKKyIs^C+! zIZG_6XJ{n%MMLoHbzq5cngq8Kw!m(Ustp-^VJ9EfiW%P-bN3@S0Mr zBs}O(^)$s9Y!pSKyd1IUu{dCiN)b^XhmWgg)c3#%C@{-vsEU3v!!HvMgzJXS(w%DJ zQ2eId**~jQan$%zH&r%|IFX^YmhpXe3W5Cl@W@C&h~!1ZXj)ALy1O``Y2P6bftCPp zZt&$p_#}Gg!r;1{qxN9IPcj%Kax>tF0)ysdMiIBszy>0-Av93J3O&#pBtYAU8GJ0* zN%d)J5GEp^KKl+pyJ&d&`S2P)E954Ya=u$}tbyQSDSbAYW_T=HjZbNkp?+3z<3r)m z`_;9ZOL-kAK`@MK{Xgt1-c}~|vA{rBdOQ0UP(#yQo4IJfGK2{i5}aNd;~G*4V~ zw#J3#rUtIsJ?XrHp@5Wl!|ZWfpaoed_z`PpaN0se$k~Y`D}x6|RON@vH|v?S$p8nI zuQ7^kNqPCXR-X%nAe7~k16k3iywBBhUj&B>3y^V}SchsmtawE&W;qMbjnMQdkSAjU zOQ)KICXCxp7=yRSd7(4cOgK0g6r^?yZCV6wG-X=Fl1J+(0OPd?K!#6qY~Wv^Xrk#= z%{gKa1DD!yEA2)82?3{t$3|4;+?mtb4cATEH*Wpcamg+)boT!Lwi5{Xjue=t1+ z1J&yx>aP|^kwM@N-Vz|`FIc8@3VaO`Krz0gCf3wsSTZ`F zA^UwYtb+eeqc39m?u(ZcGSRy{{XoWt0u4cNjwhJ&y4a--}i)uAn08K^Y z#6k>Mr&-lrk6|i8DLA0MkFa_uiqoRWzl)KnW$2-i7mCfT4ct9|8|?Nroe-8+whVu34R~GXJ!u9Mw=ttD zaOjzf{>~yQi>J7w8PX_(PGE2OBhr1z3e|=Xr@zJN*{jjKG_!FG;Ny!x6u-MfT zh##0#;t5Q=X<4S}NHQz)wkQG3nHN&UelO4f4(_v%kt-d3=xmxUipQu>K9@RW7_cXj zgNO99A)3OG{WAa7Q%Haj$3hwIou8ilvmV<}FytN|YQk&<{!Ms63pc~sGk>rT9zg^c zgaNQQ2St}u8G7|-t1VRx5KjJOZQi;+oXXRPs~A0I+$F*#_5&>j>QK6{pwEyL9TMR$ z+^~H3vr}*}vGVgBTUgL%?=?K!!{}RC54}Enui*#C@~9u2PdGGn2gm-Uk)v%f*goNH z{Ve*zDqp~4l7B27b7XOlw0&Z&Ge`5`pHU$r+CnmBcIePOLj@J9O<6dgr4R371|ST}2Vs_mq;=t4$w0$#4*gVt zNY=ojSufHypa3GNC_pC*h)!h*iE%?qbb>5|uY!@%*b87RxPdo3ho3FZUQ2n!9D`IL z0Zvrc1TtTm^v;ncu=JrGpvkbauo6~GBzvq4u!RgX%c|w0Tu9Q99-yTTA%QHSXvxSA zp;WX(Kms7PR($CaE1~zdltd-B#%2*fZA2T3Bqb6y2K%$;0!o#(!;P=t%3~g3ylI$I zD3fEBSdewIji?}#wx4G+`)Klpq&~747ot|YdQDq=$>w}Nr@{r}^Xg#`OUOQp*h2zK zhycZ2=)|a)JU9J<)IxpDsKy0%l1zcdSCPnWEI}f)rUfo6OsYuqas4DBVk^R4dd#6B z11SRqYUmq8xPP4yN@D;%rk5bRBT@;!1%a-qdLqevvgkxyEYG97EfeHE49UQCV&h&{ zmFK%BawVn!7NS%@Hpv{Mt!LKeU_qFe&m!%?xg4Ib0}LPbVy2~E%C^uu&02QN3zw7Y z-y74H*Ek7}7KX=_RK~a>&KTl;08nEan6Y&P1H?xokoz5QkS?xM@gF0Wl@Y7Q+n^J( z*N^MPMzqyv!_4%zA>k|aV8*v2h;MR7vX7;$AMweYAG+}+YQ%UUbZju#HWE?}aN&TK zj=&9|cUE|xJ_`%uc)JEle(2keVafSWSQc0JFW`C+B;io>0*z5fi2+a+b08g_rT*dw zzJv?Ytt2)uBkk(|>bn$(w56+FV^J)7DL9y(xd?2^)Y~app5bNw%U&}-c3{A^naKwF zIVzIYESwR}=Op9byg)nTILuxK7I`>>rXcQ%%OT_L-AY1h>DAeedcMX1UdwZDLNTC@md#KT!=O) zfrQ7hoW`Y-deiNTMM>S-E2VF#Ro%$gk2Rl*NoytSTv}4x24spBTfPEL$QzGR5^_r%2U?dX@n`jZx6tKQp7d)7y@1P=Dp6kW|Biru9GtSd>h+bJKSA;37~r=Su` zg1mFaaRp#jzbRmd{FA>z-;nyl3FMY5Ung>>CL8f$H{YbeqOtk$bL=CVr3?|MeFJTl zf~4Kie*O|4&<^?oG?fDL^{fiV%~e<;7WWDlXB;ZQ2v1EJ9C>>8ZJcJnQ)9mpK5m$T zMLB-(`t0Nl6Yl*aAxtf!8U@HfdVv|AZwKz8bvg=$H`vgTBd#OEG;WZNI5lZ-AzpVl zC?j^G7*8S+jqxPs0_-mM)L@mMVEt;mC=4QF#GJ`cljlN*4|LX%{1)4|>5jiO!dOOJ zF5*3voEEZ+5eY4U+MHipPV4~E`n(py!ZqjDqU{39M+m!91%yMDCnscqH?}E|E~E>} znaiOAdTQ9`k}#rkNUE5WCz0P+-%Jixm3pi~EDY~tgu(025n#!PNGA@=%rSN$!fsm+ zp9Eo7I5yIRhq@Z~tJF@aV#JAZyodpZ%?=1LzJ-gbQNJw~De7HL5f#Yx{3;w41_nmW zHBJ?;U{_*g?4h9)Zj{g9U$@q3?bwl9I-m)rJ1Z+d>M$DH+qEo=XAGu0BF zH0cd0<(eVNSZ33ew09M@s;-4{jFHEVXO0BwhDP*RpeLmVi?-TEj7H>pdiX%jVGajIacc&fm!st0pBG*&mGRkIdK~}xRQsQjS*u|Uv zUB+B7CqEf`MsVD6q9~0XyCp4AMDRx5I;-wLI&C&Zburn{Txzw;mF*zyLv+ky`+cL6 z5-U{@x=(m9jfAsSf!xq*+P5~vvF-sWlcH*CcZHBwLp%FVjz(aqnG@5blQasc838TPbZrY+RX?P8X%ctU4$r?E(`+8yt0n9Lb zvOlE7Sdo!QmxA%i4RmH1d!yV+h4MlTj`tpDXFKhi?Y6HfV$@xmRBq*B<%H@tg1Td8 zXiSM3TPr$UlGGj&UGN<%m21VjLv9 zr<~X~jAzKThEf~l2lWDsPgh4{LiL z9%51%M!&#^#!+>KFxX>6A9rYy9pcO}9R@)Mn86W`E3LH3|&WF|no4PT5 zQa3Szmt9wp@Z9Ro=~`pf+Jp|OOVYaZq!t4J4Ze|Ikt%@1dRck^3_ltKb{?jgr&yv#rjdG8=7F2Iim6tvpEc^o+7E_E!Z@GMS(e z57Ii|CBkY!i>NM)Qia2oU*%Z9qgQ(-bT`rD=@6Bc)qPC;!ZobB9_oZbM>~ZTwIvvV znO|g{Ubfk)FV5*_T-y|wleVg`9i$1Vd%7yFE*yy+hWkRmP)UuhDm(gLy0zkltP(%K zY}~E&5>DUy9)zSr@C;cQ{~LLV+qkL(zP1BiWRPV|Bg)TC3P#Q28S%#!w(Gn_%LGl- z(}SlrsL9iICsK?s@e*gp(e+y(QI z84HrTHsaJ7Y~*L?o;^2eq^8KBHB>IvnsNg^{aB3 zAoTaLaf#K#*~@Op*1G}ZNCufen~BG<(x%hQZx}4c&LG5M(K0@rf|fig`FJTx@t;S- z@2JHg+k*eTQ%p}!-x2|Ye)QhJz()%9b+F@MbtkrVeB}_Y8Uioj^b?jlqE`t~6yw1% z?HOJl2#I*qg;1mmL*CBs(o}flv-sAU$M<+!O>9vqCS50YP8sRrCel`Lh|s#p(=Ob5 zELhccZ*C7WrOQQH$dOguDyiS6CgTJg$vPtsNmbO`U#6a6#j_7zJ_}ajjwnL>oTi;m zhghK2RURl7=sFlx4L+v8_(5H9lX`tMhB?#;*IPY?j;ZK))R>$4oD* z)e7-uqF-uIs%2Wb|4pV#R8kg|*r@qcuaf0>(Gx`gE?>cQIdtG4<3yqUEjAHVZ7{a% zXELBeXpR3WlRiVjCV1QXmt>8Lsf)_CoJ(B6e#ZHr0zWQZe5Q^(Z&WVccpZ`wnQ^|6$6HYFz$iDEQ`^;U8>yjhtNCPH%_E zA&xPrY%?-heK94)cp)vW2*g0?eM6FPFM`32=4_K;`xqT)kXt`|chvbF_pcq{*5=|* zO!|EGY~l%3hW~=~fQ!`742f?(X?Xw9qnVkBCj#}gAaKw_001+2TNW!YxJx+>q8*eiS{_GlVIK+P#FNJgYtzPa zd%`SDFa3e3V`d!cxN|YJ1yTktJRZFI@Z=mOATv^UBo70s^~Fc=YUCXgn<&uuFA&|- z1VPX&kO`=Z))TCS>}{6ZAa!wouBdlRbtOT=nhhMwqI*;WoUVNAb5`Y)#1C^s11I%5 zWz3Yzt{PA)ou#HGpiEMiQ&e+1B%SM63%Dz~mO;mH_bCmPRG8SPsV`=nOj-_IjvUk{ z9P6iv{v_t#*dCb-V2#46^f0wvy{}RifIo53h*)1-tcj;=2v`?z2uz{M2zp0!3k1JV z7lL-G#qe4iEcIyc{-Mb_6JKI$B7`d>1y`@3M#zr+x4SKI0;4BexSsl)jSa$`#0dY| zh$6^XDL_{Pl_BJ=Nz4PatF(6Ax~iud_-wX-`pt4vvmC9<(8=~S(+My*f=*Jcf-mls z6vczOQ$xbs&ILM_qs?1b*xKCN+**CPxb+Kt&Ej}&c#ij0p08|ett>abxxKQqvA#TN ztnfxY8XW;u(AHNLw^p`yIANl=q;3?_N1Q4sgRHo!Q+_uxFRID+>}N-w zlTFY$ZOkZE*ByUK?G~vzck)iYCcDF@cAEhdSt`@7Ad-@My-K@NovQ3a`Oh=yd5c|* z3TZ_I$OL+)l5?;=fDjQ{Nc^(7PA%i|pMlZp*$IfhyGSs30 zB(wpuS)Nv6{Mt-CHkB_TxPFhn?`_^S0ae+CM_?d7*&J-612oj{|~!v5SQ%$e(6cn+}BEO4qjas5tNS-vn1_oG_LsE0gC}!D}P$;QW(RTkq0zy+mp7W$^3^=3d_v zo_$V8_kic5M0Z?t+eZ=B>3u2PWNE_Hr9DVFpJ*%&MF$@quFZ^wb;4BLldQ~jrYr@c zB$`IQ$aB2)7*n9;7l+2Bp?2m833xf@33>t@^r)NMzTg@Z&rG|l=QLWt{*7d8p9cfwGgrBH{RR9m5Qoa&k@KR}f5< zR1H0(5sunjO#i;cqLH_Wz`A5G^(;H`2xSeXk1YV*>%Y2(pcT3*+(Ygywd5f?5!^$s zw7xWP?Va3%<3IcZWuqWEp51WgrKQja*VXRXXaw8B9i>O`$cAqbUNghilX6(&&ZJ3p zbqGnLFI%Tuo%R{KAN>3pyt@cLQ1w6U!SDn*iR%sj?j6F5X1u<8c-Y09bPlvmocolw zUh*Vjq3@6)e0+*=<24OigEuJBhl>AN@_>3nEx5!d=r@CFWJ-;}LUy_ow`OBuk;+zT zyjnruI^bP>xMvY5Nzi&*zy=I!_RVb__s*b;f>EA!PdkY5AT%gVVtRc5MHqZF1Hi!# zB;6eEhu5g04~E?#8a@)EAORn$7Q|Gw8toA&seIZ|R@XgPVVd-5iG?Dz@WO)tvn&Hq#$YCm2ml$=+#ZNJ=api$DXLu!4lzMqLs5?oL|4V*%r zdEu)J#%1p`{OQk13b}wK8*^|G zO_hZuDIcXj_ zsmIqDLENF92#g;YR8(l_KF5(SFRMTYvcS|Lg1c1deZ<0nv-%2A!+GMQ;Rrzt5JB2^+liw_k!4lV zbs!iSa4E7=pK}4Ntzod%Dj8w0@u7JTvauv$>nyK6a62x)jg>(O^G4c>{QGyc3fU9d z;=Xh?TBKHiwdHW(Wii*40>G7_KX4@Y5U#WMFTM|Xxs6_2x!|HbGOEA{ru5d(L zYcRIVmU>zzbFVuVJ9SYg)>xbQSeH>JN*0jleDC28xisWddW zPdRL+2U2H6 z7>r1J?|`_NGD5B?mzqYyCO%bV!FBk6zTKftrj3*uQ;zxMDhOs`qj@K4EV^x4)x-<$PKrmr2IIviSD!nB* znv8=kK4m16Xz4UEu(o@0CKjpTR7<9;N8hVGVn94`(cLOVN0q;fFH>=kvlwbTI8T8w8R}U ztvHAx5@ypI`~t<#JtLIu=1CMvVNMJ72@c4EHz&PwL`QikiVX(<=^gLl7jBWra5Q@F zqgx+lF^}3gXPrsc;iW_|idHqjBVCF50K}PtR>=0505-uM&J)~7OvHvF`d4&GB(t#N zK5NyRewfO7aQF-rMjt|+#FwN1S<|yBVsyC5 zW*L^Mqk@1Km|+G3B3@vS)aAKw#ALWk&PZ0La)zzC2k4HE`#0VudEeAlZ7{i5kFH zpv?X)6}IFTd6OdnY}gu}F%BnSDy1;S(S+eZ$s72( WymwHLGx>*sfOS@YOVOhg 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≠E|4-dnhr+XW;8qV2KR7JP>+wFQAx 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